shell bypass 403

GrazzMean Shell

Uname: Linux web3.us.cloudlogin.co 5.10.226-xeon-hst #2 SMP Fri Sep 13 12:28:44 UTC 2024 x86_64
Software: Apache
PHP version: 8.1.31 [ PHP INFO ] PHP os: Linux
Server Ip: 162.210.96.117
Your Ip: 3.137.215.122
User: edustar (269686) | Group: tty (888)
Safe Mode: OFF
Disable Function:
NONE

name : rvm.tar
docs/color.md000066400000002442147511530510007142 0ustar00RVM will automatically use colors when it is possible.

To overwrite use command line parameter --color=no or --color=force.

It is also possible to set it with variable in ~/.rvmrc:

    rvm_pretty_print_flag=[no|auto|force]


To change default colors use following variables in ~/.rvmrc:

    rvm_error_color=red
    rvm_warn_color=yellow
    rvm_debug_color=magenta
    rvm_notify_color=green
    rvm_code_color=blue
    rvm_comment_color=iblack

Available colors are:

    black red green yellow blue magenta cyan white default

You can add emphasis to the color using bold/offbold.

It is also possible to change background color:

    bblack bred bgreen byellow bblue bmagenta bcyan bwhite bdefault

On some terminals like xterm ( echo $TERM ) the bold and background colors give the same effect.

Use commas to put multiple definitions in one color.  You can mix color, bold and background in one definition.
Specifying multiple colors/bold/background definitions will use last defined.

Using bold in one definition requires resetting it in others with offbold.

Using background in one definition requires resetting it in others with bdefault.

Example:

    $ cat ~/.rvmrc
    rvm_error_color=bold,red
    rvm_warn_color=bold,yellow
    rvm_debug_color=offbold,magenta
    rvm_notify_color=offbold,green
docs/gpg.md000066400000000712147511530510006577 0ustar00# GPG

1. [Creating GPG Keys](https://alexcabal.com/creating-the-perfect-gpg-keypair/)

2. Add public key to rvm-site repo

    `gpg --armor --export developer_name > developer_name.asc`

2. [Extending key expiration date](https://www.g-loaded.eu/2010/11/01/change-expiration-date-gpg-key/)

3. Signing installer

    `gpg --armor --detach-sign --yes binscripts/rvm-installer`

4. Signing release (follow on screen instructions)

    `bash sign-releases.sh`
docs/upgrade-notes.md000066400000006431147511530510010603 0ustar00  * If you wish to disable the project .rvmrc file functionality, set
    rvm_project_rvmrc=0 in either /etc/rvmrc or ~/.rvmrc.
    then log out and back in.

  * after_use and after_cd hook now supports multiple files with after_*_*
    the custom hooks can be easily turned on/off by:
      chmod +x $rvm_path/hooks/after_cd_[hook_name]
      chmod -x $rvm_path/hooks/after_use_[hook_name]

  * If your shell exits on entering a directory with freshly checked out sources
    you should update .rvmrc file, and replace any `exit ` with `return `.

  * In case you have some old RVM files/rubies in '/usr/local/bin' or '$HOME/bin' feel free to remove them,
    they were copied there because of bug in path detection.

  * Zsh 4.3.15 is buggy, be careful with it, it can break RVM, especially multiuser installations,
    You should consider downgrading Zsh to 4.3.12 which has proven to work more reliable with RVM.

  * Optionally you can run \`rvm tools rvm-env ruby bash\` which will generate
    shebang wrappers for easier selecting ruby in scripts.

  * If you wish to get more default(global) gems installed, install RVM with this flag: --with-gems="pry vagrant"
    this option is remembered, it's enough to use it once.

  * Binary rubies are installed by default if available, you can read about it in help:
      rvm help install
      rvm help mount

  * RVM comes with a set of default gems including 'bundler', 'rake', 'rubygems-bundler' and 'rvm' gems;
    if you do not wish to get these gems, install RVM with this flag: --without-gems="rvm rubygems-bundler"
    this option is remembered, it's enough to use it once.

  * RVM will try to automatically use available package manager, might require `sudo`,
    read more about it in `rvm help autolibs`

  * The default umask for multi-user installation got extended to `umask u=rwx,g=rwx,o=rx`,
    comment it out to avoid automatic updates.

  * If you encounter any issues with a ruby 'X' your best bet is to:
      rvm get head && rvm reinstall X --debug

  * RVM will run 'rvm requirements' by default, to disable run:
      echo rvm_autolibs_flag=0 >> ~/.rvmrc

  * RVM 1.20.12 removes the automated --progress-bar from curl options,
    if you liked this then you can restore this behavior with:

      echo progress-bar >> ~/.curlrc

  * RVM will set first installed ruby as default and use it if run as function.
    To avoid this behavior either use full path to rvm binary or prefix it with `command `.

  * To update RVM loading code run 'rvm get ... --auto-dotfiles'

  * RVM 1.20 changes default behavior of Autolibs to Enabled - if you prefer the 1.19 behavior
    then run "rvm autolibs read-fail", read more details: rvm help autolibs

  * RVM 1.24 changes default package manager on OSX to Homebrew,
    use `rvm autolibs macports` if you prefer Macports.

  * RVM 1.24 changes default `--verify-downloads` flag to `1` you can get the paranoid mode again with:

      echo rvm_verify_downloads_flag=0 >> ~/.rvmrc

  * RVM 1.25 disables default pollution of rvm_path/bin, you still can generate the links using:

      rvm wrapper ruby-name           # or for default:
      rvm wrapper default --no-prefix

  * RVM 1.25.11 'rvm remove' will by default remove gems, to remove only ruby use 'rvm uninstall'

  * RVM 1.30 simplifies behavior of 'rvm wrapper' subcommand
docs/alt.md000066400000003501147511530510006601 0ustar00# RVM is not the only Ruby enVironment Manager

Other implementations allowing you to switch your Ruby environment:

- https://github.com/postmodern/chruby (Shell)
- https://github.com/TomFreudenberg/rvm-mini (Shell)
- https://github.com/vertiginous/pik (Windows)
- https://github.com/kwatch/versionswitcher (Python)
- https://bitbucket.org/jonforums/uru (Go)
- https://github.com/jayferd/ry (Shell)
- https://github.com/terlar/fry (Fish)
- https://github.com/niw/rubies (Shell)
- https://github.com/nkryptic/sandbox (Ruby)
- https://github.com/regularfry/gemenv (Ruby)
- https://github.com/sstephenson/rbenv (Shell)
- https://github.com/HashNuke/asdf-ruby (Shell)
- https://github.com/cpetschnig/switch-ruby (Ruby)
- https://github.com/uninets/p5-Ruby-VersionManager (Perl)
- https://github.com/seattlerb/zentest (Ruby)
- http://www.dribin.org/dave/blog/archives/2006/01/07/rails_encap/ (Tutorial)
- http://www.mjwall.com/2008/08/multiple-versions-of-ruby-with-stow/ (Tutorial)
- https://github.com/hmans/rbfu (Deprecated)
- https://github.com/wilmoore/ruby-version (Deprecated)

# RVM is not the only Ruby Version Manager

Other implementations allowing to install new Ruby versions:

- you can use your system to install ruby,
  most distributions come with ruby 1.8 already installed
- https://github.com/postmodern/ruby-install (Shell)
- https://github.com/TomFreudenberg/rvm-mini (Shell)
- https://github.com/vertiginous/pik (Windows)
- https://github.com/kwatch/versionswitcher (Python)
- https://github.com/jayferd/ry (Shell)
- https://github.com/sstephenson/ruby-build (Shell)
- https://github.com/HashNuke/asdf-ruby (Shell)
- https://github.com/uninets/p5-Ruby-VersionManager (Perl)

# RVM IDE support

RVM is supported by the following IDE products:

- [RubyMine](http://www.jetbrains.com/ruby/)
- Vim [rvm.vim](https://github.com/tpope/vim-rvm)
docs/release-procedure.md000066400000002200147511530510011422 0ustar00# Release procedure

## Preconditions

Add `bitbucket` remote:

```bash
git remote add bitbucket git@bitbucket.org:mpapis/rvm.git
```

## Procedure

1. Merge `master` to `stable`

```bash
git checkout master
git pull
git checkout stable
git pull
git merge master
```

2. Increase [VERSION](../VERSION) number and remove `-next`
3. Update [CHANGELOG](../CHANGELOG.md) with release date and links to changes (do not add new `Next` section yet)
4. Commit changes

```bash
git commit -m "Release 1.29.6"
```

5. Tag stable with version

```bash
git tag 1.29.6
```

6. Merge `stable` to `master`

```bash
git checkout master
git merge stable
```

5. Push to github and bitbucket

```bash
git push origin master stable
git push origin --tags

git push bitbucket master stable
git push bitbucket --tags
```

7. Sign release and upload files to GitHub and BitBucket

```bash
bash ./sign-releases.sh
```

8. Close milestone in github
9. Publish blog entry on http://rvm.io
10. Publish info on twitter
11. Prepare for the next release on `master` branch
    * add `-next` to the [VERSION](../VERSION)
    * add new `Next` section to [CHANGELOG](../CHANGELOG.md)
hooks/after_use_jruby000066400000000442147511530510011006 0ustar00#!/usr/bin/env bash

\. "${rvm_path}/scripts/functions/hooks/jruby"

if [[ "${rvm_ruby_string}" =~ "jruby" ]]
then
  jruby_ngserver_start
  jruby_options_append "--ng" "${PROJECT_JRUBY_OPTS[@]}"
else
  jruby_options_remove "--ng" "${PROJECT_JRUBY_OPTS[@]}"
  jruby_clean_project_options
fi
hooks/after_use_current000066400000001055147511530510011336 0ustar00#!/usr/bin/env bash

function set_current_alias()
{
  typeset __current_ruby

  if
    __current_ruby="${rvm_environments_path}/current" &&
    [[ -L "${__current_ruby:-}" ]]
  then
    __current_ruby="$( readlink "${__current_ruby:-}" )"
    __current_ruby="${__current_ruby##*/}"
  fi
  if
    [[ -z "${__current_ruby}" || "${__current_ruby}" != "${rvm_ruby_string}" ]]
  then
    "$rvm_scripts_path/alias" create current "${rvm_ruby_string}"
  fi
}

if
  [[ $TM_WRAPPING != "1" ]]
then
  export TM_WRAPPING="1"
  set_current_alias
  unset TM_WRAPPING
fi
hooks/after_use_maglev000077500000000223147511530510011126 0ustar00#!/usr/bin/env bash

\. "${rvm_path}/scripts/functions/hooks/maglev"

if
  [[ "${rvm_ruby_string}" =~ "maglev" ]]
then
  _maglev_gemstone start
fi
hooks/after_use_rbx_opts000066400000000353147511530510011514 0ustar00#!/usr/bin/env bash

\. "${rvm_path}/scripts/functions/hooks/rbx"

if [[ "${rvm_ruby_string}" =~ "rbx" ]]
then
  rbx_options_append "${PROJECT_RBXOPT[@]}"
else
  rbx_options_remove "${PROJECT_RBXOPT[@]}"
  rbx_clean_project_options
fi
hooks/after_use_home_bin000066400000000366147511530510011440 0ustar00#!/usr/bin/env bash

\. "${rvm_path}/scripts/functions/hooks/binstubs"

function add_binstubs_to_path()
{
  remove_binstubs_from_path "${2:-$1}"
  export PATH="$1:$PATH"
}

if
  [[ -d "${HOME}/bin" ]]
then
  add_binstubs_to_path "${HOME}/bin"
fi
hooks/after_cd_install_vendored_gems000066400000000223147511530510014011 0ustar00#!/usr/bin/env bash
# From @mpapis

if
  which bundle >/dev/null &&
  [[ -d vendor/cache ]] &&
  [[ -f Gemfile ]]
then
  bundle install --local
fi
hooks/after_install_auto_gem000077500000000676147511530510012341 0ustar00#!/usr/bin/env bash

if
  [[ -f "/etc/gentoo-release" ||
    "${RUBYOPT:-}" =~ "-rauto_gem"
  ]]
then
  typeset __sitelib
  __sitelib="$( $rvm_ruby_binary -rrbconfig -e "puts RbConfig::CONFIG['sitelibdir']" )"
  if [[ -n "${__sitelib}" ]]
  then touch "${__sitelib}/auto_gem.rb"
  else echo "WARN: Installed ruby does not have valid 'sitelibdir', no 'auto_gem.rb' was created, please report a bug here: https://github.com/rvm/rvm/issues"
  fi
fi
hooks/after_use_jruby_opts000066400000000375147511530510012060 0ustar00#!/usr/bin/env bash

\. "${rvm_path}/scripts/functions/hooks/jruby"

if [[ "${rvm_ruby_string}" =~ "jruby" ]]
then
  jruby_options_append "${PROJECT_JRUBY_OPTS[@]}"
else
  jruby_options_remove "${PROJECT_JRUBY_OPTS[@]}"
  jruby_clean_project_options
fi
hooks/after_cd_bundler000066400000003226147511530510011103 0ustar00#!/usr/bin/env bash

\. "${rvm_path}/scripts/functions/hooks/binstubs"

function add_binstubs_to_path()
{
  remove_binstubs_from_path "${2:-$1}"
  export PATH="$1:$PATH"
  export LAST_BUNDLER_BIN_PATH="$1"
}

BUNDLER_BIN_PATH=""

# see BUNDLE_BIN is set in the current directories .bundle/config
if
  [[ -f .bundle/config && -r .bundle/config ]] &&
  BUNDLER_BIN_PATH="$(\awk -F": " '$1=="BUNDLE_BIN"{print $2}' .bundle/config)" &&
  [[ -n "$BUNDLER_BIN_PATH" ]]
then
  case "$BUNDLER_BIN_PATH" in
    (/*)
      true # it's all fine
      ;;
    (\~*)
      BUNDLER_BIN_PATH="${BUNDLER_BIN_PATH/\~/$HOME}"
      ;;
    (*HOME*)
      eval BUNDLER_BIN_PATH=\"${BUNDLER_BIN_PATH}\"
      ;;
    (*)
      BUNDLER_BIN_PATH="$PWD/${BUNDLER_BIN_PATH}"
      ;;
  esac
  if
    [[ ":$PATH:" =~ ":$BUNDLER_BIN_PATH:" ]]
  then
    echo "The bundler binstubs directory is already on path."
    add_binstubs_to_path "${BUNDLER_BIN_PATH}"
  else
    case "${BUNDLER_BIN_PATH}" in
      (${PWD}*)
        if
          __rvm_ask_for \
         "The bundler binstubs directory is in the current directory, which may be unsafe.
Consider using rubygems-bundler instead => https://github.com/rvm/rubygems-bundler
Remove the BUNDLE_BIN line from .bundle/config to disable this prompt.
Are you sure you want to add the bundler binstubs directory to the path?" \
         'Yes'
        then
          add_binstubs_to_path "${BUNDLER_BIN_PATH}" "${LAST_BUNDLER_BIN_PATH}"
        fi
        ;;
      (*)
        add_binstubs_to_path "${BUNDLER_BIN_PATH}" "${LAST_BUNDLER_BIN_PATH}"
        ;;
    esac
  fi
else
  # There is no BUNDLE_BIN setting
  remove_binstubs_from_path "${LAST_BUNDLER_BIN_PATH}"
fi
hooks/after_use_textmate000066400000002160147511530510011505 0ustar00#!/usr/bin/env bash
#
# Automatically sets the wrappers for textmate's use
# Based on article posted: http://www.christopherirish.com/2010/06/28/how-to-setup-textmate-to-use-rvm/
# Set up the TM_RUBY shell variable as described and remove the Builder as described and restart TextMate
#
# Make this script executable and you should be good to go! TextMate will stay in sync with rvm, which
# generally means the last project folder you switched into from terminal shell.
#

function set_textmate_wrapper()
{
  typeset __current_ruby __textmate_ruby
  __current_ruby=${RUBY_VERSION:-${GEM_HOME##*/}}

  if
    __textmate_ruby="$( \which textmate_ruby 2>/dev/null )" &&
    [[ -n "${__textmate_ruby:-}" ]]
  then
    __textmate_ruby="$( readlink "${__textmate_ruby:-}" )"
    __textmate_ruby="${__textmate_ruby%/ruby}"
    __textmate_ruby="${__textmate_ruby%/bin}"
  fi
  if
    [[ -z "${__textmate_ruby}" || "${__textmate_ruby}" != "${__current_ruby:-}" ]]
  then
    rvm wrapper ${RUBY_VERSION:-${GEM_HOME##*/}} textmate
  fi
}

if
  [[ $TM_WRAPPING != "1" ]]
then
  export TM_WRAPPING="1"
  set_textmate_wrapper
  unset TM_WRAPPING
fi
hooks/after_install_codesign000066400000002462147511530510012324 0ustar00#!/usr/bin/env bash

####################################################
# Signing compiled ruby for OSX, for details visit #
# https://rvm.io/rubies/codesign/                  #
####################################################

# Go to subprocess so we can use returns and 'use' ruby temporarily
(
  # Require Mac OS
  [[ "${_system_type}" == Darwin ]] || return 1

  # Require 10.7 - FIXME: Should be 10.7 or newer.
  [[ "${_system_version}" == 10.7* ]] || return 2

  # Find out ruby executable to sign
  typeset _ruby_name
  _ruby_name="$(sed -n '/^ruby_install_name=/ {s/ruby_install_name="\(.*\)"/\1/; p; };' "$MY_RUBY_HOME/config" )"

  # Require rvm_codesign_identity
  [[ -n "${rvm_codesign_identity:-}" ]] || {
    rvm_warn "'rvm_codesign_identity' is not set so RVM can't sign ${_ruby_name}\n" \
             "Set it in ~/.rvmrc after reading the following about OS X code signing:\n" \
             "https://developer.apple.com/library/mac/#documentation/Security/Conceptual/CodeSigningGuide/Introduction/Introduction.html"
    return 3
  }

  # Require using ruby - btw this should not happen
  __rvm_use || {
    rvm_warn "can not use ruby which was just installed ... so can not sign it neither"
    return 4
  }

  # Sign ruby
  /usr/bin/codesign -f -s "${rvm_codesign_identity}" "$(which "${_ruby_name}")"
)
gem-cache/gem-wrappers-1.4.0.gem000066400000032000147511530510012115 0ustar00metadata.gz0000444000000000000000000000136013161171527013442 0ustar00wheelwheel00000000000000�W��Y�V�o�0�_a����V� ��BH�!�B��\3a;e�眤�eo"�R����w�s�$��\��2��e(ނ*�OJ�%�h����֠���[Γ
�PT<��yJw�yz���J�Ʃ�F������KQ6\ҏ�
���V8ܔ����+(��\`�h��7R�E>��/�ł�y��|��/��]
����ѡ�C��_�
tx(ҫ��8n9	~^���>����el6�ϐ:��l@;nd8��=��\zا�M\x��_%������K1z\�/���gP\�X����ySG:-�"pe�Jb��n��:���llfV�DZ�2�F�S��pǙ�L��bkcX�zZ� j�}	Dn�O;%�:o��1�u�*$1������Η>-qu�<��\�+��W���J��8��-�*��z�]n�iQ\WǥY����F8��@�����=^`�C�Kc�Đ��m-FAl��`Qrs+���5�?$�y��$T������b
H;d�1
,��7��/�˱iW��3�Q[D���3���o#��
���7�7b
�ﭓ��M�kC���,MofˬX<!v�f�N��s!N���W3򸱰
�l�B_$O��8c�P��3�Lo���..��t� '��5��a���aO�o��B��?�8�)nFqlw��@�:
=��X����Ѐ���դ���%��o�e[�(xF?
data.tar.gz0000444000000000000000000002131313161171527013360 0ustar00wheelwheel00000000000000�W��Y�=kw7���_���JJ��ïV7�m}n�8���=�WI�5�hF;;���_$g8/Iv��J���fHA�<�C��|��g��;����wm���nol�Y�lu:۝��6�_�o߱�ww�����	�Μv��g'��|~�ӱ�p��*C��)oU��|Zi���9������o�فy1u>��(�ۛ�������w�q,�4�-�c~4�������U�Wa��{̎��Ãg����{���{o�_�b;;�c�`n��c�N���)�0�
y6�f^�mc9�?��@Ģ� 1!�|	F�I��_�Gs­}#��_���m�-�����_�bC��+��c{h���8���Ɔ�u��obb�����ވ���(6�8q>�lG4��О��
��ә5������zSz�1|�|X �W�V�����w��KHM��0gllal�v0�Џx^��P�;5��/����������w�Yc1T*kk�Q6`{�f�n���l���v+�&�F#��p��c��;g��q��
'��vO�P��֎����刿�1ldԋ��عo�f���$9�:���Н6��̳G̅}}����s�wa���u:q�N������C
���(�DZ�5B�"D�M,4��;"�c�ir `E��?0�f�B�<��r�FDpG��6t~dk?�z�C��3+�%�(<X١�-��d���BIZ�әj �M�86,���q�-�NE=�(�E�bH�H#[��Zp��|e�c���X?������޼������/'�X��x�M}��f��M�G���	�C�"r�v-�"f0I���F
`��^G�>�wd��y��v��.��
��3�3��֦��Zov����"W��-"��.f��2;�b�P��'��#��M�5��i��Q�dC��[Nd=��^l�g��o�4�#oxBÜ .��GG�j�G|lEN~��c�K�����C�V[�`��3��ZFh���O
��'�4�u��h����;��Y�K�H�s�r'Ư�HBo�w~D�o�|
P@���V���ﳎ���jod��V��:���x��1	�Y�k���ګL��w�]��3>�?|/��ވ���0���F�k��1@p�{��>*� Q-:�a�V�9��h�>
-�C��z30 P�l�'vԛ�v��>VM�zg��
׆�s��׎%�b���ӜF!�؟��J�q��P�B�-��s��
��w�^��������������N>���·O'!�
��PCը��.{i���7h�V*��C�¡�"�Z���,Ё�|�`����{
�Q�G�‹�Ժ``Q��
:��X<|@g�Y�z/(�3ǶP%>�ѮH���J� ����g��h��V�F���ܴK�h-G�
Z��T޹��J%�6m�Pw�s�u
����ܷQQi�������Ğo�0E ��To$�\f<{�����o�?�}������٫�����}�����W��g���?��z�`���3qG�I�Gf�-��*��}L9}�)JE�9@���.��Ǟڡpz�c������`�ً�{������g���{G��;�rt�HA~\Sz��rs���A����f��Ӻh�Q!�Y�j[�!vц��T2Z�C���SqѠ�M�F�F/9���B{-��Tiv|�9�0���'�dgj!��ePr2����r؈;���&Ϳ��]i�|Z'w�����kv4%J. ���b(o�y@I� (�C�u�i]X��9�As�D<�I��D�Q��Zcߚr��K>R�c;=��/H� ��܍C�_8��.��S�x��o���/�~zT��������r
@�8�l��y�Kv�1���NB?>���#�W�����`R!ǂ|���Ȼ�;�O#��f-�B�V`g���Zx/�O*SC�!��P��t�bH�QC��Q�c�t���˽V<t܀�g6P��z��X{���а#&����
��FMСxf��r�
ߔ>�F�,F�#��8�Q�`@D/��h0��?�2?�(�����d���$�D�=��V1��6v����@��F��s?ȃ;D�M.'M�D�Y/���>W�pA����p�Yn+_ij�Z'4�5���B+D��̛E�������ȵ���,��`[AM�
D�Ċ&��o��	_L����挴�mV:��2b��85�'�V��7�-qs�2�
Hn��n�v|f��nB���p&o����L����8go���|�r7�@-jZL
A�
@Z�Z����VL�"-O�<%�dĖ����R�h��p��‰�6�a !n�J���ٞF>����$х�\�\�8B#�	5nTP`[h?ł%������&'��sV�oq�CB>�b���Vz��<;�u�x�`�&m���n��u���}|i��H�5̼��j�뒴E���n��'�;g/��r���E�rN=����&�^�~TEt��fF`H8�(�k�͙�[`���G,�u�����E���F����]�w�Q7_���‹��
>�
��.^qR���W�ez�C�rmL�����.��
c�	����#�c@w��I��g4�A1uz;Ë;߅��a�a�2��������yї���[�X���v7�3�{kc�#��g�xh������h�W~ưPT�k՗�6X��Zg����M2<jF��w߫�R���+�U�;J�1J��v�5��V0����p2�F����I������t�$4�9�5/��j~ˑ�7uYs`��^�B#��'��������=��1#(p��BA�0͖�?HA�|�����uF��!D�%��ʇRM�L_١�P��#�.������a���	�j���<�Q��O�ch|TM���q�N\�s)rc�qr
��,a ĮsX�����	,bK��ߤ>N�ᄝsR�FP�S�	��)U�I�z|T)�Y[}n����޻��[��f��z{���>I_0�D�k>l��;��H�(7�g�X�9�pi��AE.%��&����(�6c-2�s!0]k�*���3�
��Aǵ�o����&VN<�A���qL�)�^fCne4�f�%�I�"�W���)�
"����Mw�.�-��r�m�*>�����"��թ�V�a'05�M�~��G<��j�¶��d��u�Fc��8���<86�Z���|�5�<�&x��,�zj�6Y�c�:�-�L�M��Q_Y�Ov�ޒ������\��f{����wi�W��p��i��s���������9\�ѰQ��l��=P�?ft$��p����<�f�@���;cS���Џ����2sRhI҇Y^<-�����^!�Z���^�����i�3L=��8\=��kt�衶"�nr8%�@M^�T�d��H���@�V��)��irK�,aF���*dߕ�J'ơ(��5��8��↶4����H�H;��|�x�%�M��+O) =��	\s����ϓ=��w�v�#�C�(.ғ����H��Fu��]�5\9
6�f��{`8�Dm���1�t���@��-���ȑۖi�2�E%�@�.�Kd.S�sM���}�e���K��G̅78/��.��s�Q�-��c�i~07Ľ���W?�rd����c�@��֣��i5X�ZW⇱�o��F�'�ڟrP�G��85�2�/��/l�I�o���Ȼc'�P��d@��t=���-è�'5�J~�ƍ{�W����&O�z�2g�)��-ꁋ�NF����+��n�?�qTЇ��
�W�NI]�˿�z��X�;���Qh���R�W��� �-����A������h�;���u|i�9���b���ږ�K�5�s��'Ӂ�dD&?ړ�!��;�Ӣ�H��Ȍ��i�{��5�3�%g����~�Y0��"^��n��q����
����Xǐ��L���f���VNf
�Ѡ,e�����$n|i{��>�z"3��I3zFA=Ud�&��É���,�xž(,�o�K}
5�~�5���<u��~�j�������G9'[2��q=�*����p��s*_~v�z?G^��(���X,ToK`$J�I�(Q3S�j��i�%��j[�T���L�Λ��KɁ��t�P��{�b�Pp�2T�QL"�L���pߗ�����|��8T��,
ǖ`�d4��+v$�h��<Z-4k��*:7"'�:��@�|�oUl�".}�RS���Y�?���{��"u����ߺ��L��h�U�E�?�͌��mon��;��Y�.}J�V���N�5!*h��,�g�v�z��%p���o��6�+�����h�Y\c�+_�E����U����L��&��W��p���c������aԤ�L|N8����e�b\*ʢc������i��
�5Q%3��8�V9py�.{?ljAC��'�c5f����;�5���|��2ʞN��L�����f���� VS�8l���c��ǎW�V�����ﰽ��t�����0Tk� uOS�z���4�s)|�2FM���'����`�觐S�W߉���>�{��g�{_,"=F ���PWߕ�mo]�F��n����6�(�A�n��<K�M.�]�q� �4�e����<��M�d��ƪ��Wp��nʭ0��}��݉�{;���n�a�Á������<��M,
`�˥.�gy�Tr9�nv�!�!%v��"E8<M=̪$���z��N_����К,�A9Mu/ȁ��M�Nz�M�g���+A��Û��Ş�{",��gr~�ព0��x�p1B>�9��b��gdFH�<�%zÂH�L7� q���~�@+K!U���kؗ�4h�#��;�3�$A��1)��!3�z�k���dSIc�M�_%z�P;��1w���Q_�C�����`-FH3)�rc�U�qgM/'��MU���Dž��g����Xj��3���Q��>��{�����냺���.A�hzx���s$(�#��%���A�P]��p��n�%�ɒb���:�\a��I��W�IX%9�b�"9|ղ���Тx������J�Cm�s%��4⾍�?�䜐��V�N��RL�AT~Q�@v�m���`iK1�O��b��#��x9�l=v|\�����5��F��&̸��Ky�4�x��;8x}�c���*<w�V-�j����Ҹv�:��]h�����f��3*R���.vYH�>NA��4ݺW'N��{l�L��~%�g�Kb܎
����F;������ɧи�Sa�i+(S��JR�U-��X�c�PM�O�?p�Z��ԛ�B2�A-�E�&ȥ�T��j���hwT+L(��N���B�$e3����e2�LR���*]�C��;bO����^J��;�1'g������l�U��/����`����7�U�������-������Z_�;���������~\�
3�Zn������P�"GT�:�4.��l�{S��=fy�p�4章�T�PZ��K����'�ֿj��)���ѿ޷���c�r�|x�U?�f���)�Ii���1�ͳ��hS9U9X�T݅��Ul�n�`b��g
Fv�&�GB�f5v�J�ЉF�IM�R�f�$��3��ν�D�N��Sȵ�bLZc������0�+wd�]_ �ݓ�L0���VpԓS�钆t\gu�~J�K^h�,��7�P���phԉ��[+��2�dR+��'?��|�]v�88����Cn����b�}�_|�ӕJ.-�*����n�o�������'���{@Ih�h��Eŀ��)~=�>p�U��p�ds<�$�h�H&�=YT�&�uk=�?X�����c,�Ø�M;�)"��g2���	�J7@T��WEF��T�l�F|*��zb���rq�w����5��P���x��0����A���1�3;�h������fg�ȋ�)�>,���Fi"P:�rM�̓e{���uг`�����C>��H�+!y6G��I��T�S����/��37����rIH�23y\TL]b6D�x2�f3U�{=�?���}:ৠ홀�5�E�S�Y�(�����i|T��6�6�2���

Q�檌b�hi�5D���'�l��|��<���$o$�gO�'-{!_��tZ��ʏ�0BD0�� )�
Uc7�_Z8˨J@�P�2$��r�4˂"RbR���`MP����L�F3�?m$���BB���:1�%��~
����������h�d�z=i<o��<��q�sz�KO��T8hݵ@}��hDw�q���*��V��2�vl�E��v7�����J���"e?U(���
�)��
���X`�x����8�V��)Lz�ouuaT�gh�8|a^}�bЋ�s��9o���H;�U�E��q#J��9y»���L�W��}l������p@�.{g��)����~S�dr���WuVYM�p^�.M%��q�œ2��2\�LƐ�e�X���,��mqI����!�h�eކ��
�1�9L�8[��1��
�=������؋(VȨ�Ԯ��Q�kb�~3��?� �UG��[82��W��zE���k�L�W�,~>�M���Ƃ7�7!�Ա��s���l�v��~��(oRR�|�4{P�� �uMi��=�/	E�$)H
� `vvD�[c�e�ȝ����ͽ�}��{����N5��ò43lI�
�ʈv5D1﬌����G�[�Xp����f�n�����/�#�?#��
�meJ1�"Mj���/I�}�8ڮ��9��Q�0ť>���AY�2�G�Oŷ�Gn��>I7ε*���;}�\y�du�2�σg6�}��X�fQ�_r�&�/Qd(�Lrգ�|�lU�9�|�* }a��B�ޔuR�2微Q���|i����V�6�{�J�Yoj�%�$+�V��7�o�H���rk ����V���^������K��YA	g}��UWSq��fv,N[*��9Ke���>i(\�8I�h���xrd�{�c����E�y��r�������^��m0t��2�ܮ\��찼>�
 �e�̇��zߎ�5�x�V��w��a3w����>T���'���mR����q-��1H~����G��7���e�k����d5�@
&9�RAJe1;��P�F�)(�TG��.����N%P�^Y�K���_�Қ]�t�B,�#�T/����4<4����S��6�[�6_��
f*,���_�<)��V0��V�����U��Js=բ+���}��%�����D^o��/X���&�U���B��uLǥV���3��_76?h��zk��~�:���/X쀾��ν�Kx_���a��=L4i��LG�(ޢk�F6"��zX����Y��81cM���t�ϸo�/nB����T�t���g���W^tQ��ǵ��!3�XP�q9�E,��%�-��L��ﴯn��'���f��;N&�u����K+�����`���\|�J�>�R�'�D�U��e�i-�M�Y��͙�sF
[�Y�@^U'c�R��9�g��*s�:t�%���I��9&�qz!v�5�o&�O����� pG��a,~��~O�(�������s,�k�׫؝o��/U}��������t�[����fgU���p�7�7���?�Wr��*g�";����\�`S�.��2y�Xt+`�IK�I��r	
�:b�@�<̌�j�,3�*�UvO&�3尢aH��uj��A��βf���O[x_�(�p+��m�[�����߆���?۫�ϯ �c�"��),��ԕ�XO|ʧ�cfq���
�z���S=�{�|�,�;Zlc�4�(.}U���(@�^d͏�H��t���w7�q���zl�Y`�9qUri]�K^�kOʬ��
^��^x~(��ʌAvݾ`�ߴ��Jɓ\��˓�j$��;o�^��.���z�"�.VDY򯥂Rn"_��{m�B��@��h�H0D�E���.Or~�Tߢ�ާ�V��.���_�^쒿�dX��ZX�Ի/� �Fj]Ia��/i<�*�9��8K����u�`�W�Z����>�Yq��q}~zk�|�X�[��!X�����
	za�)ɔd�]X)^Z�G-5� �21=�d���YMP��M��)�˸�)�AT2�4��\&_>)J�u�ͩ'P�5�U��@�z�y�ET�"=�vKF�kD�4�dcuSO�
~�.&�Z̏ZfC:�YT�*%$M1�;�K��ȅҧV�9���U�߈����77J�0>��g�7d�r�9v��JL��`j�y0לu>��s��r}��������-�[��ߝ����N>�qs��?�q�ftͶ�6�N���w��'3o���b�8�(y"~�K��co�ۮw�?�����T~Ҡ�Y=�^FNh�ߏ��*n������
�tW������ݿ�xL��a�sA�bȖL	�F#��U�vJ��>z.�w<��zvp!p�/�ν�_=�B�m�	�8����w,�+����J��>�����?����=��checksums.yaml.gz0000444000000000000000000000041713161171527014612 0ustar00wheelwheel00000000000000�W��YeP;�@�{����0�����F&�F�^|�VAw�ݯ����W�x<�?���o�����l�k_s�(��$��<�1�����>9o����ٰ�FGm�:(��@g�Q{������V߳��q,�8k��+�3B���.�&�6F�Q,��fG�cp�����&z��m���~�6�ݕ�HT�o��
�5�C�W��Z��6v��B�=)�!���/�TlBW�P��a9�u�<E ǝE�`$�rs�o=��}��G}�gem-cache/rvm-1.11.3.9.gem000066400000047000147511530510010546 0ustar00data.tar.gz0000644000000000000000000004026300000000000013324 0ustar00wheelwheel00000000000000�sy�R�}�w�Ƶ�YŘJK2���K�X�]�I|���N��*HBb`P�������fŐ�Gi����"0˝����YU�y:����ق�ޝ;�/<��w������Ν����~;��3�꤄��N�t��ܪ���M�u�������6������퍝?��}���g����QQ��r><?N��Ӵ��"WŬ��B���Su�Nfi�SӴ<N�j}��ښi�O�����ݍ�?cӣ�,�Q=9Wez-b;{��`��'�5?ʎ��v����v7v���d<�f�y���d2O���}џW��Ǝ��=������ ��C0�iZ�c����T�˳
�'�U������r_;[�7�v���샂���Z��{����g��S���6�ʷPz8?V�IR�Y���y
�6�z�	@�#uTS5L���ۆ��@��DM�Q�W4W�Ir�r�
�AC�e�E�L6�s�o�|쮭����ݍ��߸PyA#S?�����:KGN��F-\��C2�M��$��F=5���:�4��6q�x{���WߥS�<�Iy���Jg9�YQe��x���i@B�5şk��WuR׳jos�fe>쏊��Yr��i�ϳ�{@Sݵ����E�gGiU�ϧ˰ۯzV��
����
���gC}o(��
�n�����o^<�O����Q6I��I6Ľ�/���f��fe�Om&�,�M�$�ϖ�`^&����d��{���N`V��0K�:^�.�ɒ��:�d���ge2��va��CYe�]�î�L�ѦI>���F����dX�e2��N��(�����}����F�2��:V��k:�T��.����X
Gt��Jh|�{��1'�7�c�ߺ������o�u<�Hɮ�!��"���:k]}�V�2#2xm
��������u������]��3F3	��%�qJPwe�2�W����K!F��,b
��ľ�XCH�b�VP\)��1��T���6�AŸ1��ނ/I6�v�Gx;��O��M�P�&4�3�$m���UX%Ӕ{<I�aJ���~�:�"��#�'Y�C���}�TU���	��]��xH��8���8�5��i����t�p҈^��tR�p�y�P%\ˊ��_���V����{V�������}s��婓���G	\�j�k�½�~�Z[��T�d��=|,l�1lV�z=ωy��X��-x�-AE.�����{Ę�.]��������ǒ�]�����ν��۾�{s���YW��|y�U${�N��׏_=[[_[W���4���%$�J�b���T#$v��d��/�)˦�%���,|�C�ώ�y1o���d
�{R�
vdOA	\�e��W]���QV�F�ˆ~�`�㧓�h��a�(��[��!��?��
���fHeTU���d>֍u�=��^�	1�1NMS��=*��˴�')�-2ѮhrX��O�D�3���L�lW�#E�֘�u��d$�<H��l�;X���W���`���vھmɢ�
�궴|�k�
I����L��[��;"r�5�Nr��8�t�WO�щ�>�U2��94sQ��~�B*���i�a��=�\��V�0$��ol��Կ�1۾_U�U�N����#��nC8ܪPEޥ?�Q��Z�$����Pv���[v�{"UZ��Hߝ�d0,�A�>N��ٽ}9���w���wNR�Af��	��$�@V�%����<��7@ϴ�Рt�h���!��c•���	�fRvf����V"��x��:�ۣC�)]a�Po�)эm����&�?Md�V=}"`��v�{��2EQ�X�4��%�B�m��n�l'Sm�b���G��f�rV�n�@U�K�,{t\}�[��)�S� &!�m����^��
[Z��R؍��'y�3r:�Q"N���
��i��8tM�`�p�dXϓ
�g6i{�������6�����=��O"�!��4�a+����Ts�pI娋�þ���a
G�Lj����<ԧ�� CIOS�x�L�!*J��(K�<9WB�d#�YEH�##��<��L)��Z]��UZ�7j'��trD��AgQ�b�IΣ��2rX\$�i�.��!hX��E���ˎe�Ǔb�L�v�h:N��d��-9-2T��	��<M�>�<Y��;�nf�Ԁ�g�f�GW�qg�ޟ�CT���ӗ=h����^<mަ#�
�a���s��'�,�!�H��1�ͪ�
��­��g9���\���s}�=����ތv�/@^�Ӣ䃸Ak�I��w�u��Y��|n�����a�nrs)�A,��I�K���2^@L9ΎP���$���?��i����������E4:IqF�	�]xt�Z�CU�,��h�-�(mR$���ւ+K�7��:Q�1,�D6��y��W_HL�,�	n�ch���d�S��*l3��B'i�6A?�~
4
�#!'p��]�(�$!�Jh�
����iz|�+`�&5��@��&e�{��KB�@^#��!�y~g4O�z4�yդ��i����>��&9{��h��d%Y�9<P�E|���+[���Si@ֺ�V*����t�l���u��H6��C\8��s�tᤠ<�,k�P4�%�7��nE���@*�,�B�=�+�tf�f���b6���,ܞ"5Wgp�y�ƨ}]ZQ
���R���ݞ��w[]ܼ��GSU�TP�[��p��S������e������I@]2կ{�?�����ɖ��X;<\I�jQ4��EU��>��U��<M�X����W�����$�W��V���-g��=�/I��SN�we���$���`��p��v�"٣Qyc�(��?��u��.���굺�
�������?���h�RQ��ur6=��a�`33v�*p(H�>����<�*�ZRϯp�u]��߱�\ۼ�������`a�l,e}��L�����Fp�Ӿ-L������J$�F� Â#q"l.�B1?>�E8U�*�B<X�@9 �h��
m�2�@�"�K�8��V�E��,E-H�!%�`Έ�_������$�/�U�t�]Ӏ��չpVl����u�b�i�g�]v����a�..�<�s+�]��U�&��x�j���K��7���]#þ�$�Fs��p���OxZh�ֈ���-`�
���dˆ�� ���<σe�|H�;4��T�}����N��Y��n�0oH�{{�(�A

ٱ���7=5|����z��%�ep��~A���%`�wR�<�`{u<t��BOEk�#c|�M����D&F� a�G��O"����=�*���	!�IE��f@ÞJ�G�;{��u;�`F����Dˬ���Co�Us����FooL*[��������-U��y�Yo}�>V�w���{�vvn�?��x|sa�mp���L�H� @��D�&�	+@չ�*Ĵt`�u��tO�ay �q1��n�~��5F.M���Ѩ��%�SFH����7��.�&>���I$Z��>
������䭃��[�zs�G�;�XL��}{V��'
���ԥ�I]�N}�x��L����.��ѳB�M:I딙M�E`�KtȈŭ�]0��0��bN����!$OH��@��ķ� ���Qp���We5�._��B�,QB�Q��XM��k�8N�<G!�7!��z����q8R�[K͑�FqI�ZtT���I�$x&}&Ug�v�&� lY�!��3KHFm��#~���p6��>�Vg��.��t��Ϧ����.Aa��ڰ��-m�N����
��"aǦ��nM���'ɞr��U�6F����d_���p�������C0�Oa��}	�:�_�Yn��y�XA���O��߾{����j��_��D$��_1{-�j �� �?�uq��j�$_*U�rDڸc�DI��l�A}>K?Z����k�2�n�K�<D�|�)ؼ�W��0��O���"��'ܺ�
�����0��m�����@��n
J��`��{RG��G7��Aq����w�S���x�{f��^���6I��sf���Hz��礗�"08%2�Ƙ�xTL�Ff@0ȗŀ���%ozG��jx��+�k8j㮘�u50x���eY��=��*G���&��/Z�`ɝ��>��f�oȄ�z��}�k�X%��ǿ�w�v���^�s������&��l�W�=ar�I%v.sdV�Ԁ���%��e3��}����3��	���@Z��^�W����*�Wϖ�+�/�]+ZJ~Yy�i���ΞG��fW��X=��P�˫���Z����@�\����=x�"EZ���y�;j���w��0�Y9$��"����7�5<ϕ���m��Q�&��*0d��j���w{gHy��..����-p�>���̬�v+-�S�ր�g%������r�I�?Ν��ΐ���$���c$H�}�K
Dc��P���ݟp*�2���껴�<媄�]�k"�U���#����	�ty,��M�|���(~E�?���\�J�Dyw�Zg
$�轒|�кd1C�o�	���u	��QX�
{�?4����e$.�
�r����1[�!����yϬ�>P��>��'
���;�zv�ZiUt�C��
{�?�͝����B"m.'��bt� �%	M�Bi�)��0�"���o�h���8����?�YV��J�so�N��۽����r��$��s�7z��Qd���Li��;h�(�ԫ�o��W}x�=��Щ,�N������=��N��XϷ�� ��	4�Rl�� �����.R��Zg�n��SUm��4�1�jE�
����61_��@�gQs�X�1�3�ʅL��HW�;e�H�1��7�#ĩě�_���V{%�EwyIڲ$ho�/��C9a�v���V~+�ck޴��5M�`�r�w��]O�6N[==vK�e63s���V��ݲQ%�+�K��\��]��)\���l+����D,�
��p��[���<�7�f)�%lH������[��N���aӿ�4r�g�c����{w;��uk�&��<W�������-�|u��1�&?6�F���e��?~`0��ge0+�	�@v����`7 :N1f�\��9p
��,idE)77'7(&�q�`��H��S�m�<�C����ȯ�$��_f�(��OF��Z�u��Qr���q�׿1� Ka�?K
x�w��`Oc�D>	���AtN�M��_j_T�2m�R�aZ��)���[yQ�U�bv�=�lߍ�EzʔY�g��LV�l�b�V@Z���I���i�V$ /,P�f��:��IC~���N�U=?:��4�Ղ���+CH�W@Ui���3{��Jؘ(�F+�����5����#E'5�Ri"u�4pPS��G��@¥���
&�n��8�{DF�`�p�+F��P��T��0ڡ��ql�ߖv�4'Q$t3��{[���������t��['�f|���*�b(6r�k��1nO��2~@��Mj��/f� m#=݃�mߛ$�USxI�G�}g[2[؁�y��t��0_qg��"Zq1Z@9�]D�ؽ2�M�Q: o"��#
iol�sȥ.�:0���7��"bn�D���<��%U�)9�����i��;z�X�\y�>�8�u���lw��B�2`U�:��qƐ蚱Erb@��45�S�Q����bn�`O�ݓ`X�č��[:�a���ܯ8��c�9��ͻΎ�f�g{r⨣�B4AN�x8��|���0U�x.��ϑǶ�G�OҌqMt4��sK�=c��	….�s!2�K�{��@��3ܟ���hgÿ���?�F;��Ċ�9�p�82�"S-�s���6Z�!���\�#WZh5��ƑK?�H��X�+�b̕b,,�eM����X-�mQ�%嘰���<#&�rg�B�&懚��+���"���j>�l��_l�T���j��y9���!�"�=�!�%R�D����-$�D�,	��9�j{|�r˺
�p�	/侯02��#��T�~��K�A�tR�Ǣy�aKl����r�j���DX,Ϙ;�^5@�Ji~�!���K��W��_��x�<E�`�qx��p>����(�O�%Dx��>��^���@po�����D,Š�]f 2���1T��(2/b�;�j�64���Z�%|+�@~ �u"��50֢����(�e������Qx]oj"ιH�<��\���8/����O���n�G�5�g�׈kG����y���|a}D��D�RN���!BO�����-�"���e����q܇j��ٌ�ޯ`@
Y�Ԛ;�e4�B*���a�isEvk�ȭ�5��/t��Á/�O�ǫv�A�����)�0<`�"�Clz?2���O�8���������[w�vB��;wo����1�Γ餽��)� p��v^�F�������C�h���+_��M�fxTt�t�++�v}��6�y߉�#mq��x�([Gl���=~�,M���s�����G�{��l}�8����l��Q�����S�?�ə��|/	aok"N�0�])�k��u�E�0φ���\��{��3~�^EL��6�H[1!��x H�0�3
�� Hc��Tc�N9������s!d.Z��XO�~�7w�����Ox0�~]v�
�.o5�^ϡ�o6N�L�|��
�ʷۢ��l�E�&��Dm�ȴ�6��ݙD�[f9������+3�h�y�Ȓ��)g����{S6bh@�L�#���U�%@-����U��N��O��]n@�;�4`�Oū��t澛l#̆��"c��"�
|�r�jJ�6��So�\��m|�*�T�&U�yn����g�ǂ��B�(�i�A�+{��f�&�M�C�bѰU�>���М�r?��!=�i���bq��Aȣ�T�Z�]s�H�x��BQ��(�:�45�z@��h���7W>N�x��K�`�p!�3�k�~rZǚ1��YO�|����w�����>�f0&�(���$%�8�#�H�Ϟp�5�������ݙW���l+��f�)V���m�Ylj�5 ��P돍I�]v�t"�GjV���׀N	��̒ �]bO�e��;�:�
��%�4+���v{�*J�ez���0�P��
�����q�����L[[��4�f��pZ
L�F�Smv�u���{x�]����S�����^�w����h�����,+��=��7v�Ξ��;�CO̪�#��u��<WQ&��&;i��6�}��A9�c��M�€w�I����p�^DC����S��@�/��ѓ�Et�X|@���у���d�c�o��HP9����S��0;�',�n���X���nm��_����o���x��K"O7tb[GrG�;�sȖ%��b��-�A�.�^nw�g�D�ђT��}��8X	�j20��Ai�z8�լ3g�v��L)��X�[�y��
8�Яҵ�scO���K}��B�Mz�yvc7�|/�t�ף���֌��f�yu��OFp�P��	��VD$lgK.��Ûڼ��[�.t�5�
[5����>l�3p��N:�ҩO|u�0�|�t�IG�|!��F	1Q[�6wm�22���4�|�8��#N�#�(����H�YެF�X��jN>"@~�(#�v�8b]E3w�"aF�o��?;�3�|v�(A1'�'%k��ZDW�P���j<栻��&d� =n��'F������߹�����_�s5����Ҍ�.0+��Cw�$�E�y��_.�Vb��JC��^�<?�hm^<^�Vp�dO�`�I$d����I���ηD%|7����S1��i�$IW���T�A£vcI)"	��1E�C8��C3��zh�i�~�sYD>_Nt��.7~��%sh��cN)��.@�eȍ�������fU�ȧ�"?�a�ݥp�nINn���#���l$�You�#K�y
��*Q����ɹ�9���"�RxR�:�Q-����:�Cَu"]x�$
X˧EC�#;�ʁ�3٦$RB�	'���8+;T� �*�E��@�^r�_��,��&_ۋ��	枧]-~���6!����Ϩ@~��Q��k�v�!&����3������ž�����I��"�{
�9Yg�>��d^��*�NT�P~\��D�BUo��.�	�n���1�-�p}�Ѕa�(�C��긅�G��N.���ː�cN�K\���)�7�&V�ʰP�Y�a��*���UBp�6G1�bT�,9����쇬�<�gȀ�ķfS���W�8U�������`4�8��Lځ�?T��ی�}k�T'h�1�J8�6e,��~�J�_HK��l��I���e튏�-�X�t�qTf���2��1��۔��Ft��:�g�)�$�:���m�_�ڌŒt�j�������2��#9<9���"�v����K�`�J��p�,.�&o���?=?T�Zޒ;'!�Vk���-�GB,��`ET��C���U@��%��.��,>W�N���$~�L~��;c�4zh��s�u	��ܭN@Q0;Op����0K{Z�F����Aou�ԃ�[g#o�.�1T���@�'��Z�XȪ�n7�P�R]�:K3����E��7~1A/�K��C�v����J��X�����Z<��透&ʈE��m��^�\���U�c�y>�:�/����?Ҳ����Ϊ�����bf"'k]���26��zwT�W���b-]-'}��$��I!tp�©;MmVY[�(d1�`w�\���0=��Vg�*h����g�6�N���ʼnZ��w������BX�3_�K_~�AF���H����m���u#����j�;�2���"�r�(�A�	�eR)��aO�#?ӿ�뒣�;�u�_�|�~v�&naZ,hW*���Df?o��-��wX�����IS��j�r��G}0ܖ#K�z�lb9���5�����6���ɘܝ�)9\�� m�x����i�����V�ւ�c��+N�,�c��/���<�/ջ�@�զ�#�,G�7�`%=,�P��h�Ђl;ݗI]=E 0�,��Oz>\
�I�m�o:�캙ݨ��b�CN%�ND,P�5��2]�޿~����1���llԂ^asp�X��-ұ��L-�l�B�3�|�~`��G�Oע�����BWT�p�Eh�,GD#�^��I�&�B����qC�1,mӌ�ܶ~#��UƸ�ɞQ��Kk̷#.�ե�)�#7�R�d(��r&�|�s|�F�e�/�3,��Q�E� ��2;��
Zt�j�!
aZP,�< �0۞n��_6�N�5��7�3
jr=�߶w���
�vvo�]�s�����>��^�}���7(:�C�� �\9��ա�|u��"xy��?(bD�[��&	27G�dD>���~u��)O����w����l3�x��ڇ�T��n�$��:NV�$IX�(.�Zf0��e&�uJI�U��f��\�P��X�_��Ǚ�|?N����Oy5ں���dG��Y�J��k蹂ɳ��S!�xGQ��m���4���)����Рx*Y��W_�a��&�c�N?����Q�n���E�r�����S�^"�ڛ���6k��¡���œ�^��2�a���^�n�27��m��O|�D�����٭�Y��t�d���`T��aj
�B���Q�K7��G�GZwC�]�uX�G�֣��$��zit]�э1H��q�#�d���
R�y��cj�yb�)W��%�[ݷ7����ބ�R�vQ����U�ڴCZǧ�P��-a��6q�!~�ئ�6�/:�>~������;��1�;BIn��c�Ti��B�_��+����l�*��0��j�EJ�280aU_S
�{4��Ɔ���m,���)���M� �R!}b�����<a�}.���'�(��<ۿ&����+�*�h��P���1a�#m�Ŵ_]�^���"6���9�!n�Ȑ0��>)����P�N��i2���T�Q%t��5gh2�F%'��2$�zlm�Req\&S�3�Y{�Z��ƥ^��/-��Q�� �D��R�_H���P��8���P�~59�H���#��&^,r��M�r���n0�	�cm�6(@j�	�ڛͫ���=j�V��X��,<so����|����0��9ɬ��Cf�HJ���侠�2�R�V�U:�~��_Z�sHn�p$��t-��x8�F�/����Zu\|T���nT}�V�t���
ާ����*,Ү6�}��C-J[*�
��X�(��)C�C��T����2�-6m�F�^����5���B�kE+�q[����JXr�`�9�˞D�9rC3�0A~f&��I~����#OWeq�T{Ljd�Q��f�[@`�
v���vNX�1��6�l=�I��ja M�1O&،+5"���${�	n�
O[���W���D����E��ۨ��lX�����1h��/�FD�+n�XD�K"ER>����fdӜ��ͪ����=�8��k֠�n[x(W��R�`z�0�Ƣ���)0�e��0��G�2��hD�&$���v3Q��0�#�B� y��_h�L���k�
O�
RC@a&m$M���/]i��o�^6Xe�f���ȉ݀�t��nJ�Y��+
a�L:��J_=�!����L/�عsC��*-э&M�8�D�&`9�y�I�t�
�N�

�P!�FI_�67�Q��V�~2���������y�ր��Z�K+��z)ĚN�s8ͺYW�c*��B����~l���_�1�
�`�
�0,�U-멊<�������%"�q��n�����h ��6�1��M�=�BW�&eq��R�B@|�o��Ys6Ɗ�{[��t���ȗT�du}؁oqF����r;����D�[�U�+�{YK �J1GP�����?/�.��d��R(���
���lmo�i��������?9�5�F���G/�n�}���Z�d��zc�&M����r��CQ����ZH)�y{Y�evln�;=N/75	i����j�+�n;%C@0c�i�M�}�1<w��:�zz-�E���>��|&ӂ�3'+yL�s�eca&o�mجa�E�姸U�1��x���D�g���
�gw'���{w���Z����	�@S�>�$�W�c&�E	���/���in8�"�\�f��J�E��P
^e�y��e�'ŝ����Yt�p�aA�\<�ĀE'���S"��?$P����bK6�W�ʕY�皿��E�n&�9ma�9@��44po���%0�ܑ(y�&�1e��
�B�o�r7�+��sv�F�[	R�dg?�fo�")lt�k��34�}X'�Ŭ&!
=KӝK�_baeR��݅S�ACg5���9B]�>�ņ�l�C+M����2�6(���<S.�����{�e"����?��+B,��-�{ʽ!�À�@�(Z��sd�ʊ�uo �� G���r�Y�Ԟ.�Z�qS8�����/�З�.�n���3��֖�{����hS3�8��v�ueJ~��թ�`Ů�km��=W�S�U0��k�����8����\Xk�
�ZX�$�:�.%[:N�h�='��9�-������]B��0�Wj�o]5Jf(e�����y]�1�1Rr1^VB��l�x)�&w]���Ϯ���P�*�y!�m]��[E��>�R�H��FC�_O��#.uQ�~��[0˝SvR02?G���1[�0
{�W��#-�<�=�6�3��8ލxEF,~#k��@x����c�q�q����ȼ}֨?�Y%���{?����ݺ��x-�C�iH6b��=��|��Ԁҁ��_��V. })K�w�1��`LS�5�y���Ֆ����#-hA����,ٽ���	:����Hxt�hbğ�4[��<�h$���Z}��Cr�uar���	�T�H�<Vg'�D��H2E�d���h���qD$v�5K��0�	�֋.���s�31�s�##'Z1��L�3��IDDWo�IZktk&
+I�ȣ�S�Q�� h��`}͏�O�<Z�w���vڂ}�3�	��Ǚ�'��������Q&hU��?f�=��1{�����Z.2�����w��s�V��M��������:,��'���؋v��`�Q�p����?��o���_<����_�m@%X��]��N+�`��õ5mD��IO�hE��zW1-�K����6��hu�Q�KG����X
��]b؂�Ȱ��~��Y��F��$r�e�qm=��?�G҆�
�h�o
��6�AWS�F=�M��>��er��|[Xü~�'���o��w0"g���!��Yk�L/�D@����B~�#т�~(F�X��h�y��ҟ����x<�i �ޘ�}�R�	���{���o�}w�ւBZ��s�q̅'k\��dN�NR��سi�S��]4��hX����t��aRf�,����NVO2����T���`���������¾��7X�P��n�<ڿ����lX@�V���D����Zk1w�i�\�1��Gp��Ov�s7r,�-�İ'�T��R�,U㴬�AQ�j�™��ͣ�C�P��ۛx��id�{�e�����.Vl	�YM��ۻ����������,�)?��hΐ�$��.H,�{4�G,�G�K�aF=���@���p��i̬n�T����bM��-���ĬQG e����$�Sw���/A��>m�7I�S��7�Iċ2#�XzC��?P�|�;A13��c�gV:��]%�=B;d6A�&<.��*��BUH;�]D��V���LsWm(#�v�4-��<���h�LNy(O�:�]��	 &#�VY��sU%��)灅�fʎ��d�*��.��QrI�r�bsu�5�8�FI9֩��@���#�8`�e�)����t�������D�pǕ�y��0��4�ס��bM���<��y�qln&�bl���(����RA�`ȹ��s�1
��2J����u�Q|a�2u���bL)��dĖ�>�P��iV��D��X�O�b�S�|���(Y��K�r���o��{-�Ē4.���y<1kУ�ЖuC[r��L�����%�p���X�|BFM`���8�Q��)�]���)清��Ԫ���t�<!�dz!�af&��!<`��V�1	�lN��s���h�b\���8"�	��;��!�)�M[��V=�>�}&�>J��t����y�Ic��F.�;�����C���
��E��	���J��[!~�����XByO��[lZ
��]:�J4`p�"��i�hm"�Kn�A�
��:M��!lo&G�?��ט�K�F���R��/^<~����g��n�����oٮ�{`�������7T&��
�+�9�Oo�0<}��R< �P��€rH
p�2HoE)����9���Z��BAJ[?�~����׃�?<y��g�2��-�$��|I	��ߐ��|[c�@�̝Xc9��3#a�V��r�Wi]�5h�k���a���M�Pt�
��Kv�T�T�i�#�J�j^���[�]�v���*xV��F*��30~�>#F�P��F�&��Tr@`;�xh,�7��Q8��X��x��%�Ԉ��c����1��r����d� ��T��+����S���RduJ
Ce���ZD���O��:T�wL�AU'�
K��8���$J�j3h�����Y�G��,÷�4���6vseŃtVMzDs�v��*Myn�Yt�y�?�
�6M���P%�!=�+�Bc	�/�"t�n���v+�Ц6�vP�T��fʬ�؞��q��V'l�V�!���P��j$ֺ��7ˋRL�%G�r������X&KN��A4¦8���9��K';
䕧���rZ"R�n�����`�5�&k2����NX�;zϔ��-��m� E�,?�/5��	c����Z����F��h��6�{^%�a�Y���mE�r
x�>.�=Bz�m?�)�c+���d��g��=mz8�-
gd���9Rs̃=
�|�?6��E�DI@H�(;R�
�tAƙ���7����}l1�!�:[�3/�KoP�*2l"�G}�3�I��M�R(��E�l�elɼ��_J}:�!�돚�V?��b��Lе�ލ�!��=����ͣ��Q���5X$��<)�,�B��{��8-���+5 �*����M�b�m���
2�;�0�n���,��B��]��7���f�ڜ�����hah"��jX��Rӊ�bf�X@2v]�M�� mC�3����(�=�.W�ըOub�?>Wm�D�u��~{`?��J�V�t�:o'�B��o�~���ڒ��7�v��N�����lZ���v�@=0���c���w��q~�&�3)��d���-$g��)d��4��h���Kv���
X���z��5��N�e���H��+�j{UEt�����帳
R�n.�NF���?��<�|}�و���\��:��[���;[ۻ�n�?��ߢ�QȪ�����T���\��&ș���58hj#Wք���"�:n��I�~�W�z�(æPu+�x�X��*���>�"?<$t�׷y�!Ri3�G��j���ßN��X�i��^��yUn��k���Ǫ��'	�6M����)��K"��l��kg;��{�ލ��<��h���Ou��'
�!�BEUGK����k�;��"��JK�9��bLS�G .r��3�@Rk�R4���ј�(�!I=�ҕ]�>j��p��
I��_Ԛ�҃�g���ث# ����<�cI�|�#iv�����#EŽ��RtW^hS�csAv�-�$��@d!�"䳅p
�B#��B�Bٝxx��($��*|U�IB�I;rgK{�P$�ãF���!���Z�hd��bʍ��H?yB�VgO�>S�ѝ<���$:��j�gy��e��l��aW�jm7�+��h�y>���������s?�}���Zc��jv�8�os�/�)u���0Q�j����/�m�T���Q갳�'�l�� ��Fb��O�s�v�$�W>}�Wą�B���#���@�l_v��Z�}����O�7�Ο�t��m�;[�wn�?]�c�?�Y��^��7;0��;!�I��-�,m�>�Mi@HO�ȠI��c��0
�<�E�)�h���Φi`��W�ؐ
m�ң�l�Q�{ I��Iӂh�tAˊ��K�?|-��b������V�>XdD���e�����=�`
�Nj�~Hȴ�%V9
\J�[�Z~�ڰ!��j�6В��4��I�۪��0�`V���4}��	a�Tc�ңI�9)8Jt�#���L�Kk�j����,�d��G���~ݡ��Q�z�vzlX���hK8�dBڼ�z�ƌ|��R�D��4R��Z.�k^6$�#c�@�d�$GlŠlv��]S�j�G�Zg]�nS�I6&�ĤDX�,:�)�9��ةOz����/y��db�t��M0K.=��3�l�wb,\��t��Ђ��kq��]�+`�
m��"�J��p���w�f�V\P%j������EY9sG�����`��+H)��+[d;Vv�Sd����_���ϝ���U�߭f���7���YN���h�w�|8�F
%�꽩�t���#��~�v7��$4~����*%#�d���&��i`������5�bo��HV>r�7:��x'�V;��ņsVqK!mz��}���U�� ��ޝ���N�+fĄ{5Eq��&'�li� {�Z�P���#��$���]2���$��m�
���p���N��ǃ��ow79�=#K�~�ML+����	ݰ��	���ö�U�ֻw˗�>P>�&� �����w[J���Sҹx�oZ���~�v��cW�>��J^�w
�w��B3���L��0�f�i|������xV@���w�����*�?�x��o�ie���{�g���Z� Ыq�ա�,�pLW�q��w���iy�0�nc���ݰ�H?�5���"Bz���{课�`D��6�G���玃��$~��l��t���4#�ea�:�VC�
f���3�@��H�
������e�-Z=
ޓ2�!�Z�'��j(�K����(����o�F�����7�V��;
��΍��Z��դ�lm������?�n���s��<7������X�*metadata.gz0000644000000000000000000000130700000000000013402 0ustar00wheelwheel00000000000000�sy�R�Uێ�0}�W��'���	 Q	�H 9�$1�K�������I��n�w�*��9��Ǟ�$I���������,������)�LAF�"w`��3sn�J暌�^ᰵ`As��jڻh$t9<��:>��y��L��t�^�V2_�0�KX�c�*	��z
t�үPwB�g+x�$��Z��X��	2(�.��(�	�sd
��!%�HY-�/��2Y]��"����Ђ.Asnd��V�>湻�ҿt��э���K�e��`���~�e�O	(&d�}�����:�Sn�
;x��g��'t(�Ѷ,���y%�q�+~�ѧ�ebZT�|�+��n��v3@;va�(�x�-�����3)���9����+Qw6޵i����?�]�iTbU�Q�px��8��zc���B
�O�-k[���'����>��gR�x��e^v�ق�)�px}���8�I�a3B���e�I]�e�uҟ���g�:�k	�k��<�.B��QJ��1
Z�nj6޷�<^ka�D
�]4���7���}�8g��W&���Y���:�1��[�A�����Q+P����b�Z���2��7�g8�E�A�ףu���
�qt�p���&��?�ȍ��q��Q�9Y�Q�|w��*]]'j�W0��i����]�a7�~����N<��c�����[�fgem-cache/gem-empty-1.1.2.gem000066400000020000147511530510011404 0ustar00metadata.gz0000444000000000000000000000124712517674506013457 0ustar00wheelwheel00000000000000�Fy?U�U�o�0~�_a���4+CB�@L[H�&�B��\3��v�E���s���Z
�{!�R��g��wn�$�k�na�oP��T�_[(�Z�<���
rZ�J@�Б
8�����OC�P:����tI��am��i�Cx�|Nz)ʆK��[��<�UG_K
.Œ��pX)����)��\`8Q`�/_I�"���$;I��i��7Ͷ�L*��+Х�>�~��[D�[��
�1��@�C�څ<�c��I�s���QoD�!��g��(��Bg����
Hc�Tց	�chͥ��lVģ��+�E��EW�K'l�2
\��U��h��Q��z�7�'�B�^H��Lp@ǵ'�q�*S���b����"�Zc�F���NI���k��NU�&�"��ѻ�g���+]�N�/WC�
mLwM�#����(��u+���{!��:�ۅ"�1�����z�OȢ� `��E�V���k@Zp����(�&���m�"��m�.��ăx?��l�.ӌ(/@��?�5���>p)��I|��p�����D"�ΊEF���\��<S��<S�P����#_8��jd̙~	J�K\�'�S�!���
t��c��ߢ�B�:���Pf06��kg0�:��Ћ�%{�{��:���_�O�K�1data.tar.gz0000444000000000000000000000771612517674506013404 0ustar00wheelwheel00000000000000�Fy?U�\�s�6�g��ܩ$�D=l�=�9�㺍��c��t\��HHB���]���v�)��i�\s�I$�b�v�=c�͢��G��������������Σ�pg�;���鏀~kk8|D���J�t9�r=�4�����"�4����A�]Z^|E�;�=kӞ��z����˖ܽb�^��g��[������Z��7����DŽ���ů±EH��o�]���0���~
��7��[�`+�9u}u��jT=����X�)�\��H`7�{�E�7w��B�!}��)�4�}j�|��u%�44tY��9�X�h$K���M��v�T��� ��)ܧƊ�ͨ����Xo�
�LY��|L$O��;P�����������
����؀=�;�w%�!LDw0����
5	(l�������q��I��k���۵�?
w��!.�ܣ�1�2�^
6@�&�����yB=���4!c�^��HB0��n���LH�	���>����P �U�|���H�$|�30*�>t@����*2NWNc�{O�8���/2R��$���M�]� ��� 3Ki��\�l� D�
SI�:!�B���sQ#,�T�ъn9��ϪI_�<=������pk������d��l.I�kk���Fȏ�-��h$�O�7��S���|����r�^m�4LQ��k�$t<�


0A���֣�$,"�ӓ��h�k&�ӄm�b�'�Z������+-��Q��*����]�%*�^��D�,��u�YP!�;e�y�dA����	�ks��񉌑�k�$���T^��Z>h<�&��ʸ���	@DnD����A���v���^?u����r�����)yuB^����ѫ�p�=�������:��x��6��;0�z�Q߶N)�t�Fݣ�Fߋd���B�` $�<d'Ok���I�-�^�/�:9���:��[��%�7�Y�� 4L�²���Q��N\F�i�6�{|���Uu�$��5a
<"�(��A�Sr��ˢu�z�!kz3Po�ǯ•�ܷ��QG��)h�T�[0xP��&���6c�n�N8��^�
Iy��&��k���g)�%>t���1%��1��-�To���%���R�@�����mb��Rw{)�e,�U0�A����Ao�r��Ǟ�N��./(�Y4�k˥7�nHE۲pAB�!X&4��� vbG�
 ��P�r�Nț��篎ߨXƙ����7o�L\1G��,tx�6cF����S���u���Z�?�e�/8��z_������ş�i �Ê��%��_��k��#z
�?y/���6��I�sO���Q�&�NR1o5|ؾ�
7T ��JW�j���z����m:����g����P�&����pg����G�u��a���^*xo¢��tp�t7��C�8&��v��g�������8�`����m<�2�]i���C����
�x|j�Q�r"P�;ӏ� o�����8����O�'�� �r7��(?o���o�#A�(�(o\(r�CT�t!Vp���.=���qHD�{E�T��e���)���
�dX�֭���bB/C����~��$]u��I�d��k���Q�:+iI�K�aq5@gJ0r*>�6�[q}�)~�w4[ʆ܃,d�
���"�vA8@�6���Y�6a�>����F5���;Z��5�E ʺ����f��g�āP�|I����*/�J%D\7��$Hg,B]�x˕���DY��P�I�i1��ZXr�SC��8QM�c#'�ǯ~�����:9E3�BǪ��w>A��*H
�;ё�!�1/=����<����XU

�y�5���O�	�F��?T�i�7���g�M<�4�\>S��}:�b�i�����ooJM��Eכ�x��x>���C����#$��\"�GT�<���f�n��/}K�T�L8�w�V1v[RE�l��R��jA<1�	-jXL���Cq�p�y��V�1)?�@�rI8�r%�)�}R�*>1a�)�5���p	�~'1,�I@U���P=�[�(n}�	ה�3n�.h0���l�#���Ѩ�ٕ�!�Ꝭxc2X_P�\^��iQ-�P��*A�afDq��V���g�T˴���h�`�F>�K�|���%ͤ��x|V<B(ڊX�!��v��mZ��4��tPc*�ej���P��<t������1�Z�̝�uH�TovP?�&i�Z7��+���{��1��������E&�zR�q�{of��}&�xzˊю�8��+8�׬/
�Ԁ>��e^^�Y�5�t��b�?
�3�߯����=��~�\;(c��%]��y�*kC!2W�`A����
��&L�E�6vn��Z�(6�2���q�����4M��ӨJWUh2v\SNAˤ�>��Ƨo��M޽G夼�j���JM�9�8Z�Yi��ng�W)�{_�l�{D�Սc�Ax����d2����j�̄"��k�c��치��^�ӵ�_��=d��ʾ��G�����Ϥ�3��G{`�9�/}��N���|����Ϩ����h{����!�,LU���N�]Q��щ�l�+�I@��܈L(|!��#�h��<��6ƃ�oN5m��YI��T����)�B!@;����o-{�ע�n�_{k�������U�}>�����8�,J�>�ΦD#1<�
��$TLJ�T 
)�d���(&��}&0T�cD`)|�"_��zA�ӧ��x���襗�a)/V�x�D�>[�1�Ja�g��A�,?�h~C�j�i�@���	`<E�dž�T�Xp��0=t�|/��7 }Et��͗õ�:���ȣ6�3�g��,_6�gw���^�����d�/D��l
��?w��8����s��Ki��v9�sk�'��Y;�nJ(��w��ٔ5-��Y���An]U�z'IEx����{��s���v�%��҉0`��z��h�,�B�g0��b���w+U���0r�d�4�`<E�ɐUg#�fZ���	���0���NU�v�\ee�GZ��ܷF���_�r2�y��Ⱦd�2yL�4��a�~Kd��*�G�o�Ũ�6��Ƿj
�-U1 �ߥv��8��i��2���,%p+~�13��x���4�2Ҫ�V���BI���h�� Q�{8�dj]��Pg6:d��'uV�HOg)�S�$� OH0�hЯ�U��:�z��]J�$Fx�������|b�S�Lf���j�D`�[\ѣ�S�v�&3"�5�B�<��$�,�X���8Ε˙�5T��ՌJ��-Ⓥ"��3�SP��O}J�z�&�^
C6�m�����ʉR;	O:�WF��i��[U��R�d��S�^Y�<?:�S79����2I�&�`?g�w�z�Z�2w>�z�q�E��-��h�6?p�p~�s��u��U��癎�yX��$����z�z�0�[��~��R���_h�g�<�ݝ��FW_�Ua.ɺ��Ձ����G�_��YI2w�m�i孾�-@{�R2����̔�25����_B-B���lM�����PLl^:k��)t���%M>h�T�dTK�o�g��J��AO�@�?�����V�n������N.%��%��p*��o=�r(S+��!ګTX���]�US�%���tQE��
��1@���8���x�Jޓ���>]f`y�^M_J֛������K��|d/����b��ǿ$q\��*6֖�����ɟ{�G���?;����R9���g�8y�w�4��4���Ի$�O��Q�ҟꔟ�ʃ��T��W6
:�����
@����8
$���
v\M����6;�z��:eE-Mv��}���	���K�o7�Q�;��,!�
�Sz+��{���A�w;��X��!�U�6r����QS��OaK3d�sS��i���E����Z���������_��<b;\checksums.yaml.gz0000444000000000000000000000041512517674506014621 0ustar00wheelwheel00000000000000�Fy?Ue�;V@E��"�g~C:;{WX�xR�z'��r��w��n���W�_���zx��_>��Wm�
��KpQ�5Yi�hYsg:���y��/����#%��ݪV)�$Y�t�~�2��1rO��ce�� �AT�iL��`ޡy����q 	&�{���6HG不x���(
�=w��p�iͿ>��i8o.+�&��N�d�a�:��9��"�f-铷�Y���#�c�d�t���ji���
��s��i�{��s��T�patches/ruby/2.5.1/libressl_2_7.patch000066400000001067147511530510013136 0ustar00--- a/ext/openssl/extconf.rb
+++ b/ext/openssl/extconf.rb
@@ -122,8 +122,11 @@
 have_func("SSL_is_server")

 # added in 1.1.0
+if !have_struct_member("SSL", "ctx", "openssl/ssl.h") ||
+    try_static_assert("LIBRESSL_VERSION_NUMBER >= 0x2070000fL", "openssl/opensslv.h")
+  $defs.push("-DHAVE_OPAQUE_OPENSSL")
+end
 have_func("CRYPTO_lock") || $defs.push("-DHAVE_OPENSSL_110_THREADING_API")
-have_struct_member("SSL", "ctx", "openssl/ssl.h") || $defs.push("-DHAVE_OPAQUE_OPENSSL")
 have_func("BN_GENCB_new")
 have_func("BN_GENCB_free")
 have_func("BN_GENCB_get_arg")
patches/ruby/changeset_r45225.diff000066400000000656147511530510012705 0ustar00--- a/ext/readline/readline.c	(revision 45224)
+++ b/ext/readline/readline.c	(revision 45225)
@@ -1974,7 +1974,7 @@
 
     rl_attempted_completion_function = readline_attempted_completion_function;
 #if defined(HAVE_RL_PRE_INPUT_HOOK)
-    rl_pre_input_hook = (Function *)readline_pre_input_hook;
+    rl_pre_input_hook = (rl_hook_func_t *)readline_pre_input_hook;
 #endif
 #ifdef HAVE_RL_CATCH_SIGNALS
     rl_catch_signals = 0;
patches/ruby/2.1.3/openssl3.patch000066400000003333147511530510012412 0ustar00diff --git a/ext/openssl/extconf.rb b/ext/openssl/extconf.rb
index 8c04cb5..132d803 100644
--- a/ext/openssl/extconf.rb
+++ b/ext/openssl/extconf.rb
@@ -104,6 +104,9 @@
 have_func("SSLv2_method")
 have_func("SSLv2_server_method")
 have_func("SSLv2_client_method")
+have_func("SSLv3_method")
+have_func("SSLv3_server_method")
+have_func("SSLv3_client_method")
 have_func("TLSv1_1_method")
 have_func("TLSv1_1_server_method")
 have_func("TLSv1_1_client_method")
diff --git a/ext/openssl/ossl_ssl.c b/ext/openssl/ossl_ssl.c
index f7cb7f0..47111f6 100644
--- a/ext/openssl/ossl_ssl.c
+++ b/ext/openssl/ossl_ssl.c
@@ -109,9 +109,12 @@ static const struct {
     OSSL_SSL_METHOD_ENTRY(SSLv2_server),
     OSSL_SSL_METHOD_ENTRY(SSLv2_client),
 #endif
+#if defined(HAVE_SSLV3_METHOD) && defined(HAVE_SSLV3_SERVER_METHOD) && \
+        defined(HAVE_SSLV3_CLIENT_METHOD)
     OSSL_SSL_METHOD_ENTRY(SSLv3),
     OSSL_SSL_METHOD_ENTRY(SSLv3_server),
     OSSL_SSL_METHOD_ENTRY(SSLv3_client),
+#endif
     OSSL_SSL_METHOD_ENTRY(SSLv23),
     OSSL_SSL_METHOD_ENTRY(SSLv23_server),
     OSSL_SSL_METHOD_ENTRY(SSLv23_client),
diff --git a/test/openssl/test_ssl.rb b/test/openssl/test_ssl.rb
index 07e081b..0cbfcba 100644
--- a/test/openssl/test_ssl.rb
+++ b/test/openssl/test_ssl.rb
@@ -912,7 +912,7 @@ def test_unset_OP_ALL
   # that has been marked as forbidden, therefore either of these may be raised
   HANDSHAKE_ERRORS = [OpenSSL::SSL::SSLError, Errno::ECONNRESET]

-if OpenSSL::SSL::SSLContext::METHODS.include? :TLSv1
+if OpenSSL::SSL::SSLContext::METHODS.include?(:TLSv1) && OpenSSL::SSL::SSLContext::METHODS.include?(:SSLv3)

   def test_forbid_ssl_v3_for_client
     ctx_proc = Proc.new { |ctx| ctx.options = OpenSSL::SSL::OP_ALL | OpenSSL::SSL::OP_NO_SSLv3 }
patches/ruby/2.2.0/fix_installing_bundled_gems.patch000066400000002024147511530510016360 0ustar00--- a/tool/rbinstall.rb
+++ b/tool/rbinstall.rb
@@ -714,15 +714,15 @@
   directories = Gem.ensure_gem_subdirectories(gem_dir, :mode => $dir_mode)
   prepare "bundle gems", gem_dir, directories
   Dir.glob(srcdir+'/gems/*.gem').each do |gem|
-    Gem.install gem, Gem::Requirement.default, :install_dir => with_destdir(Gem.dir), :domain => :local, :ignore_dependencies => true
+    Gem.install gem, Gem::Requirement.default, :install_dir => with_destdir(gem_dir), :domain => :local, :ignore_dependencies => true
     gemname = Pathname(gem).basename
     puts "#{" "*30}#{gemname}"
   end
   # fix directory permissions
   # TODO: Gem.install should accept :dir_mode option or something
-  File.chmod($dir_mode, *Dir.glob(with_destdir(Gem.dir)+"/**/"))
+  File.chmod($dir_mode, *Dir.glob(with_destdir(gem_dir)+"/**/"))
   # fix .gemspec permissions
-  File.chmod($data_mode, *Dir.glob(with_destdir(Gem.dir)+"/specifications/*.gemspec"))
+  File.chmod($data_mode, *Dir.glob(with_destdir(gem_dir)+"/specifications/*.gemspec"))
 end

 parse_args()
patches/ruby/2.2.0/openssl3.patch000066400000003333147511530510012410 0ustar00diff --git a/ext/openssl/extconf.rb b/ext/openssl/extconf.rb
index 8c04cb5..132d803 100644
--- a/ext/openssl/extconf.rb
+++ b/ext/openssl/extconf.rb
@@ -104,6 +104,9 @@
 have_func("SSLv2_method")
 have_func("SSLv2_server_method")
 have_func("SSLv2_client_method")
+have_func("SSLv3_method")
+have_func("SSLv3_server_method")
+have_func("SSLv3_client_method")
 have_func("TLSv1_1_method")
 have_func("TLSv1_1_server_method")
 have_func("TLSv1_1_client_method")
diff --git a/ext/openssl/ossl_ssl.c b/ext/openssl/ossl_ssl.c
index f7cb7f0..47111f6 100644
--- a/ext/openssl/ossl_ssl.c
+++ b/ext/openssl/ossl_ssl.c
@@ -109,9 +109,12 @@ static const struct {
     OSSL_SSL_METHOD_ENTRY(SSLv2_server),
     OSSL_SSL_METHOD_ENTRY(SSLv2_client),
 #endif
+#if defined(HAVE_SSLV3_METHOD) && defined(HAVE_SSLV3_SERVER_METHOD) && \
+        defined(HAVE_SSLV3_CLIENT_METHOD)
     OSSL_SSL_METHOD_ENTRY(SSLv3),
     OSSL_SSL_METHOD_ENTRY(SSLv3_server),
     OSSL_SSL_METHOD_ENTRY(SSLv3_client),
+#endif
     OSSL_SSL_METHOD_ENTRY(SSLv23),
     OSSL_SSL_METHOD_ENTRY(SSLv23_server),
     OSSL_SSL_METHOD_ENTRY(SSLv23_client),
diff --git a/test/openssl/test_ssl.rb b/test/openssl/test_ssl.rb
index 07e081b..0cbfcba 100644
--- a/test/openssl/test_ssl.rb
+++ b/test/openssl/test_ssl.rb
@@ -912,7 +912,7 @@ def test_unset_OP_ALL
   # that has been marked as forbidden, therefore either of these may be raised
   HANDSHAKE_ERRORS = [OpenSSL::SSL::SSLError, Errno::ECONNRESET]

-if OpenSSL::SSL::SSLContext::METHODS.include? :TLSv1
+if OpenSSL::SSL::SSLContext::METHODS.include?(:TLSv1) && OpenSSL::SSL::SSLContext::METHODS.include?(:SSLv3)

   def test_forbid_ssl_v3_for_client
     ctx_proc = Proc.new { |ctx| ctx.options = OpenSSL::SSL::OP_ALL | OpenSSL::SSL::OP_NO_SSLv3 }
patches/ruby/cc_env.patch000066400000000557147511530510011445 0ustar00--- a/tool/mkconfig.rb  2013-07-25
+++ b/tool/mkconfig.rb  2013-07-25
@@ -130,6 +130,8 @@
       val = "(TOPDIR || DESTDIR + #{val})"
     when /^ARCH_FLAG$/
       val = "arch_flag || #{val}" if universal
+    when /^CC$/
+      val = "ENV[\"CC\"] || #{val}"
     when /^UNIVERSAL_ARCHNAMES$/
       universal, val = val, 'universal' if universal
     when /^arch$/
patches/ruby/ssl_no_ec2m.patch000066400000001476147511530510012414 0ustar00--- trunk/ext/openssl/ossl_pkey_ec.c  2013/07/05 22:16:09 41807
+++ trunk/ext/openssl/ossl_pkey_ec.c  2013/07/05 22:46:42 41808
@@ -762,8 +762,10 @@
                 method = EC_GFp_mont_method();
             } else if (id == s_GFp_nist) {
                 method = EC_GFp_nist_method();
+#if !defined(OPENSSL_NO_EC2M)
             } else if (id == s_GF2m_simple) {
                 method = EC_GF2m_simple_method();
+#endif
             }

             if (method) {
@@ -817,8 +819,10 @@

             if (id == s_GFp) {
                 new_curve = EC_GROUP_new_curve_GFp;
+#if !defined(OPENSSL_NO_EC2M)
             } else if (id == s_GF2m) {
                 new_curve = EC_GROUP_new_curve_GF2m;
+#endif
             } else {
                 ossl_raise(rb_eArgError, "unknown symbol, must be :GFp or :GF2m");
             }
patches/ruby/2.2/openssl3.patch000066400000003333147511530510012252 0ustar00diff --git a/ext/openssl/extconf.rb b/ext/openssl/extconf.rb
index 8c04cb5..132d803 100644
--- a/ext/openssl/extconf.rb
+++ b/ext/openssl/extconf.rb
@@ -104,6 +104,9 @@
 have_func("SSLv2_method")
 have_func("SSLv2_server_method")
 have_func("SSLv2_client_method")
+have_func("SSLv3_method")
+have_func("SSLv3_server_method")
+have_func("SSLv3_client_method")
 have_func("TLSv1_1_method")
 have_func("TLSv1_1_server_method")
 have_func("TLSv1_1_client_method")
diff --git a/ext/openssl/ossl_ssl.c b/ext/openssl/ossl_ssl.c
index f7cb7f0..47111f6 100644
--- a/ext/openssl/ossl_ssl.c
+++ b/ext/openssl/ossl_ssl.c
@@ -109,9 +109,12 @@ static const struct {
     OSSL_SSL_METHOD_ENTRY(SSLv2_server),
     OSSL_SSL_METHOD_ENTRY(SSLv2_client),
 #endif
+#if defined(HAVE_SSLV3_METHOD) && defined(HAVE_SSLV3_SERVER_METHOD) && \
+        defined(HAVE_SSLV3_CLIENT_METHOD)
     OSSL_SSL_METHOD_ENTRY(SSLv3),
     OSSL_SSL_METHOD_ENTRY(SSLv3_server),
     OSSL_SSL_METHOD_ENTRY(SSLv3_client),
+#endif
     OSSL_SSL_METHOD_ENTRY(SSLv23),
     OSSL_SSL_METHOD_ENTRY(SSLv23_server),
     OSSL_SSL_METHOD_ENTRY(SSLv23_client),
diff --git a/test/openssl/test_ssl.rb b/test/openssl/test_ssl.rb
index 07e081b..0cbfcba 100644
--- a/test/openssl/test_ssl.rb
+++ b/test/openssl/test_ssl.rb
@@ -912,7 +912,7 @@ def test_unset_OP_ALL
   # that has been marked as forbidden, therefore either of these may be raised
   HANDSHAKE_ERRORS = [OpenSSL::SSL::SSLError, Errno::ECONNRESET]

-if OpenSSL::SSL::SSLContext::METHODS.include? :TLSv1
+if OpenSSL::SSL::SSLContext::METHODS.include?(:TLSv1) && OpenSSL::SSL::SSLContext::METHODS.include?(:SSLv3)

   def test_forbid_ssl_v3_for_client
     ctx_proc = Proc.new { |ctx| ctx.options = OpenSSL::SSL::OP_ALL | OpenSSL::SSL::OP_NO_SSLv3 }
patches/ruby/remove_digest_so.patch000066400000000245147511530510013537 0ustar00--- trunk/ext/digest/lib/digest.rb
+++ trunk/ext/digest/lib/digest.rb
@@ -1,4 +1,3 @@
-require 'digest.so'

 module Digest
   def self.const_missing(name) # :nodoc:
patches/ruby/GH-433.patch000066400000000403147511530510011003 0ustar00diff --git a/file.c b/file.c
index 3b0cd67..56f2b50 100644
--- a/file.c
+++ b/file.c
@@ -4301,7 +4301,6 @@ struct utimbuf {
 
 #ifdef __CYGWIN__
 #include <winerror.h>
-extern unsigned long __attribute__((stdcall)) GetLastError(void);
 #endif
 
 static VALUE
patches/ruby/2.2.7/fix_installing_bundled_gems.patch000066400000002214147511530510016370 0ustar00--- a/tool/rbinstall.rb
+++ b/tool/rbinstall.rb
@@ -719,15 +719,15 @@ install?(:ext, :comm, :gem) do
     directories = Gem.ensure_gem_subdirectories(gem_dir, :mode => $dir_mode)
     prepare "bundle gems", gem_dir, directories
     Dir.glob(srcdir+'/gems/*.gem').each do |gem|
-      Gem.install gem, Gem::Requirement.default, :install_dir => with_destdir(Gem.dir), :domain => :local, :ignore_dependencies => true
+      Gem.install gem, Gem::Requirement.default, :install_dir => with_destdir(gem_dir), :domain => :local, :ignore_dependencies => true
       gemname = Pathname(gem).basename
       puts "#{" "*30}#{gemname}"
     end
     # fix directory permissions
     # TODO: Gem.install should accept :dir_mode option or something
-    File.chmod($dir_mode, *Dir.glob(with_destdir(Gem.dir)+"/**/"))
+    File.chmod($dir_mode, *Dir.glob(with_destdir(gem_dir)+"/**/"))
     # fix .gemspec permissions
-    File.chmod($data_mode, *Dir.glob(with_destdir(Gem.dir)+"/specifications/*.gemspec"))
+    File.chmod($data_mode, *Dir.glob(with_destdir(gem_dir)+"/specifications/*.gemspec"))
   else
     puts "skip installing bundle gems because of lacking zlib"
   end
patches/ruby/2.3.0/fix_resolv_kernel32_dll.patch000066400000000445147511530510015364 0ustar00--- a/ext/win32/lib/win32/resolv.rb
+++ b/ext/win32/lib/win32/resolv.rb
@@ -36,7 +36,7 @@
 
 module Kernel32
   extend Importer
-  dlload "kernel32"
+  dlload "kernel32.dll"
 end
 getv = Kernel32.extern "int GetVersionExA(void *)", :stdcall
 info = [ 148, 0, 0, 0, 0 ].pack('V5') + "\0" * 128
patches/ruby/2.3.0/random_c_using_NR_prefix.patch000066400000001011147511530510015575 0ustar00--- a/random.c
+++ b/random.c
@@ -521,7 +521,7 @@
     CryptGenRandom(prov, size, seed);
     return 0;
 }
-#elif defined __linux__ && defined SYS_getrandom
+#elif defined __linux__ && defined __NR_getrandom
 #include <linux/random.h>

 # ifndef GRND_NONBLOCK
@@ -538,7 +538,7 @@
 	if (!need_secure)
 	    flags = GRND_NONBLOCK;
 	errno = 0;
-	ret = syscall(SYS_getrandom, seed, size, flags);
+	ret = syscall(__NR_getrandom, seed, size, flags);
 	if (errno == ENOSYS) {
 	    ATOMIC_SET(try_syscall, 0);
 	    return -1;
patches/ruby/1.8.5/stdout-rouge-fix.patch000066400000001273147511530510014102 0ustar00--- a/lib/mkmf.rb	2009-06-10 09:09:22.000000000 +0200
+++ b/lib/mkmf.rb	2011-11-12 02:53:05.862766935 +0100
@@ -168,19 +168,25 @@
 module Logging
   @log = nil
   @logfile = 'mkmf.log'
-  @orgerr = $stderr.dup
-  @orgout = $stdout.dup
   @postpone = 0
 
   def self::open
     @log ||= File::open(@logfile, 'w')
     @log.sync = true
+    orgerr = $stderr.dup
+    orgout = $stdout.dup
     $stderr.reopen(@log)
     $stdout.reopen(@log)
     yield
   ensure
-    $stderr.reopen(@orgerr)
-    $stdout.reopen(@orgout)
+    if orgerr
+      $stderr.reopen(orgerr)
+      orgerr.close
+    end
+    if orgout
+      $stdout.reopen(orgout)
+      orgout.close
+    end
   end
 
   def self::message(*s)
patches/ruby/1.8.5/osx-arch-fix.patch000066400000000617147511530510013166 0ustar00diff --git a/Makefile.in b/Makefile.in
index 656ae90..f976cf1 100644
--- a/Makefile.in
+++ b/Makefile.in
@@ -45,7 +45,7 @@ XLDFLAGS = @XLDFLAGS@ $(EXTLDFLAGS)
 EXTLIBS = 
 LIBS = @LIBS@ $(EXTLIBS)
 MISSING = @LIBOBJS@ @ALLOCA@
-LDSHARED = @LIBRUBY_LDSHARED@
+LDSHARED = @LIBRUBY_LDSHARED@ $(LDFLAGS)
 DLDFLAGS = @LIBRUBY_DLDFLAGS@ $(EXTLDFLAGS) @ARCH_FLAG@
 SOLIBS = @SOLIBS@
 MAINLIBS = @MAINLIBS@
patches/ruby/1.8.5/syck.patch000066400000001147147511530510011626 0ustar00diff --git a/ext/syck/rubyext.c b/ext/syck/rubyext.c
index 078de4f..8c4027f 100644
--- a/ext/syck/rubyext.c
+++ b/ext/syck/rubyext.c
@@ -268,9 +268,13 @@ rb_syck_mktime(str, len)
     {
         char padded[] = "000000";
         char *end = ptr + 1;
+        char *p = end;
         while ( isdigit( *end ) ) end++;
-        MEMCPY(padded, ptr + 1, char, end - (ptr + 1));
-        usec = strtol(padded, NULL, 10);
+        if (end - p < sizeof(padded)) {
+            MEMCPY(padded, ptr + 1, char, end - (ptr + 1));
+            p = padded;
+        }
+        usec = strtol(p, NULL, 10);
     }
     else
     {
patches/ruby/1.8.5/no_sslv2.diff000066400000001252147511530510012230 0ustar00Index: ossl_ssl.c
===================================================================
--- a/ext/openssl/ossl_ssl.c	(revision 32381)
+++ b/ext/openssl/ossl_ssl.c	(revision 32382)
@@ -107,9 +107,12 @@
     OSSL_SSL_METHOD_ENTRY(TLSv1),
     OSSL_SSL_METHOD_ENTRY(TLSv1_server),
     OSSL_SSL_METHOD_ENTRY(TLSv1_client),
+#if defined(HAVE_SSLV2_METHOD) && defined(HAVE_SSLV2_SERVER_METHOD) && \
+        defined(HAVE_SSLV2_CLIENT_METHOD)	
     OSSL_SSL_METHOD_ENTRY(SSLv2),
     OSSL_SSL_METHOD_ENTRY(SSLv2_server),
     OSSL_SSL_METHOD_ENTRY(SSLv2_client),
+#endif
     OSSL_SSL_METHOD_ENTRY(SSLv3),
     OSSL_SSL_METHOD_ENTRY(SSLv3_server),
     OSSL_SSL_METHOD_ENTRY(SSLv3_client),
patches/ruby/1.8.5/fix-irb-completion.diff000066400000000673147511530510014200 0ustar00diff --git a/lib/irb/completion.rb b/lib/irb/completion.rb
index 000658e..609dca3 100644
--- a/lib/irb/completion.rb
+++ b/lib/irb/completion.rb
@@ -157,7 +157,7 @@ module IRB
 	    end
 	    next if name != "IRB::Context" and 
 	      /^(IRB|SLex|RubyLex|RubyToken)/ =~ name
-	    candidates.concat m.instance_methods(false)
+	    candidates.concat m.instance_methods(false).map { |m| m.to_s }
 	  }
 	  candidates.sort!
 	  candidates.uniq!
patches/ruby/1.8.5/math_gcc_fix.diff000066400000000444147511530510013100 0ustar00--- ruby-1.8.5-p231/math.c	2007-02-13 00:01:19.000000000 +0100
+++ ruby-1.8.6-p420/math.c	2008-07-02 11:25:48.000000000 +0200
@@ -34,7 +34,7 @@
 	if (isnan(x)) {
 #if defined(EDOM)
 	    errno = EDOM;
-#elif define(ERANGE)
+#elif defined(ERANGE)
 	    errno = ERANGE;
 #endif
 	    continue;
patches/ruby/1.8.5/openssl-1.0.patch000066400000016005147511530510012633 0ustar00From 46b84175dfac14a92fd6bcf3b03bc3c3715ab6cb Mon Sep 17 00:00:00 2001
From: nahi <nahi@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>
Date: Sat, 6 Mar 2010 21:47:30 +0000
Subject: [PATCH] backport the commit from trunk:
 Sun Feb 28 11:49:35 2010  NARUSE, Yui  <naruse@ruby-lang.org>

        * openssl/ossl.c (OSSL_IMPL_SK2ARY): for OpenSSL 1.0.
          patched by Jeroen van Meeuwen at [ruby-core:25210]
          fixed by Nobuyoshi Nakada [ruby-core:25238],
          Hongli Lai [ruby-core:27417],
          and Motohiro KOSAKI [ruby-core:28063]

        * ext/openssl/ossl_ssl.c (ossl_ssl_method_tab),
          (ossl_ssl_cipher_to_ary): constified.

        * ext/openssl/ossl_pkcs7.c (pkcs7_get_certs, pkcs7_get_crls):
          split pkcs7_get_certs_or_crls.


git-svn-id: http://svn.ruby-lang.org/repos/ruby/branches/ruby_1_8@26838 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
---
 ext/openssl/ossl.c          |    6 +++---
 ext/openssl/ossl.h          |    7 +++++++
 ext/openssl/ossl_pkcs7.c    |   40 ++++++++++++++++++++++++++++++----------
 ext/openssl/ossl_ssl.c      |    4 ++--
 ext/openssl/ossl_x509attr.c |    5 +++--
 ext/openssl/ossl_x509crl.c  |    4 ++--
 6 files changed, 47 insertions(+), 19 deletions(-)

diff --git a/ext/openssl/ossl.c b/ext/openssl/ossl.c
index d4a2dc1..85ba654 100644
--- a/ext/openssl/ossl.c
+++ b/ext/openssl/ossl.c
@@ -92,7 +92,7 @@ ossl_x509_ary2sk(VALUE ary)
 
 #define OSSL_IMPL_SK2ARY(name, type)	        \
 VALUE						\
-ossl_##name##_sk2ary(STACK *sk)			\
+ossl_##name##_sk2ary(STACK_OF(type) *sk)	\
 {						\
     type *t;					\
     int i, num;					\
@@ -102,7 +102,7 @@ ossl_##name##_sk2ary(STACK *sk)			\
 	OSSL_Debug("empty sk!");		\
 	return Qnil;				\
     }						\
-    num = sk_num(sk);				\
+    num = sk_##type##_num(sk);			\
     if (num < 0) {				\
 	OSSL_Debug("items in sk < -1???");	\
 	return rb_ary_new();			\
@@ -110,7 +110,7 @@ ossl_##name##_sk2ary(STACK *sk)			\
     ary = rb_ary_new2(num);			\
 						\
     for (i=0; i<num; i++) {			\
-	t = (type *)sk_value(sk, i);		\
+	t = sk_##type##_value(sk, i);		\
 	rb_ary_push(ary, ossl_##name##_new(t));	\
     }						\
     return ary;					\
diff --git a/ext/openssl/ossl.h b/ext/openssl/ossl.h
index 9215dc4..d0edb7d 100644
--- a/ext/openssl/ossl.h
+++ b/ext/openssl/ossl.h
@@ -108,6 +108,13 @@ extern VALUE eOSSLError;
 } while (0)
 
 /*
+ * Compatibility
+ */
+#if OPENSSL_VERSION_NUMBER >= 0x10000000L
+#define STACK _STACK
+#endif
+
+/*
  * String to HEXString conversion
  */
 int string2hex(const unsigned char *, int, char **, int *);
diff --git a/ext/openssl/ossl_pkcs7.c b/ext/openssl/ossl_pkcs7.c
index fe1ef7c..b0cc656 100644
--- a/ext/openssl/ossl_pkcs7.c
+++ b/ext/openssl/ossl_pkcs7.c
@@ -572,12 +572,11 @@ ossl_pkcs7_add_certificate(VALUE self, VALUE cert)
     return self;
 }
 
-static STACK *
-pkcs7_get_certs_or_crls(VALUE self, int want_certs)
+static STACK_OF(X509) *
+pkcs7_get_certs(VALUE self)
 {
     PKCS7 *pkcs7;
     STACK_OF(X509) *certs;
-    STACK_OF(X509_CRL) *crls;
     int i;
 
     GetPKCS7(self, pkcs7);
@@ -585,17 +584,38 @@ pkcs7_get_certs_or_crls(VALUE self, int want_certs)
     switch(i){
     case NID_pkcs7_signed:
         certs = pkcs7->d.sign->cert;
-        crls = pkcs7->d.sign->crl;
         break;
     case NID_pkcs7_signedAndEnveloped:
         certs = pkcs7->d.signed_and_enveloped->cert;
+        break;
+    default:
+        certs = NULL;
+    }
+
+    return certs;
+}
+
+static STACK_OF(X509_CRL) *
+pkcs7_get_crls(VALUE self)
+{
+    PKCS7 *pkcs7;
+    STACK_OF(X509_CRL) *crls;
+    int i;
+
+    GetPKCS7(self, pkcs7);
+    i = OBJ_obj2nid(pkcs7->type);
+    switch(i){
+    case NID_pkcs7_signed:
+        crls = pkcs7->d.sign->crl;
+        break;
+    case NID_pkcs7_signedAndEnveloped:
         crls = pkcs7->d.signed_and_enveloped->crl;
         break;
     default:
-        certs = crls = NULL;
+        crls = NULL;
     }
 
-    return want_certs ? certs : crls;
+    return crls;
 }
 
 static VALUE
@@ -610,7 +630,7 @@ ossl_pkcs7_set_certificates(VALUE self, VALUE ary)
     STACK_OF(X509) *certs;
     X509 *cert;
 
-    certs = pkcs7_get_certs_or_crls(self, 1);
+    certs = pkcs7_get_certs(self);
     while((cert = sk_X509_pop(certs))) X509_free(cert);
     rb_block_call(ary, rb_intern("each"), 0, 0, ossl_pkcs7_set_certs_i, self);
 
@@ -620,7 +640,7 @@ ossl_pkcs7_set_certificates(VALUE self, VALUE ary)
 static VALUE
 ossl_pkcs7_get_certificates(VALUE self)
 {
-    return ossl_x509_sk2ary(pkcs7_get_certs_or_crls(self, 1));
+    return ossl_x509_sk2ary(pkcs7_get_certs(self));
 }
 
 static VALUE
@@ -650,7 +670,7 @@ ossl_pkcs7_set_crls(VALUE self, VALUE ary)
     STACK_OF(X509_CRL) *crls;
     X509_CRL *crl;
 
-    crls = pkcs7_get_certs_or_crls(self, 0);
+    crls = pkcs7_get_crls(self);
     while((crl = sk_X509_CRL_pop(crls))) X509_CRL_free(crl);
     rb_block_call(ary, rb_intern("each"), 0, 0, ossl_pkcs7_set_crls_i, self);
 
@@ -660,7 +680,7 @@ ossl_pkcs7_set_crls(VALUE self, VALUE ary)
 static VALUE
 ossl_pkcs7_get_crls(VALUE self)
 {
-    return ossl_x509crl_sk2ary(pkcs7_get_certs_or_crls(self, 0));
+    return ossl_x509crl_sk2ary(pkcs7_get_crls(self));
 }
 
 static VALUE
diff --git a/ext/openssl/ossl_ssl.c b/ext/openssl/ossl_ssl.c
index 432ca21..facf6ca 100644
--- a/ext/openssl/ossl_ssl.c
+++ b/ext/openssl/ossl_ssl.c
@@ -1291,10 +1291,10 @@ ossl_ssl_get_peer_cert_chain(VALUE self)
     }
     chain = SSL_get_peer_cert_chain(ssl);
     if(!chain) return Qnil;
-    num = sk_num(chain);
+    num = sk_X509_num(chain);
     ary = rb_ary_new2(num);
     for (i = 0; i < num; i++){
-	cert = (X509*)sk_value(chain, i);
+	cert = sk_X509_value(chain, i);
 	rb_ary_push(ary, ossl_x509_new(cert));
     }
 
diff --git a/ext/openssl/ossl_x509attr.c b/ext/openssl/ossl_x509attr.c
index 1f817cd..2a4c481 100644
--- a/ext/openssl/ossl_x509attr.c
+++ b/ext/openssl/ossl_x509attr.c
@@ -218,8 +218,9 @@ ossl_x509attr_get_value(VALUE self)
 	ossl_str_adjust(str, p);
     }
     else{
-	length = i2d_ASN1_SET_OF_ASN1_TYPE(attr->value.set, NULL,
-			i2d_ASN1_TYPE, V_ASN1_SET, V_ASN1_UNIVERSAL, 0);
+	length = i2d_ASN1_SET_OF_ASN1_TYPE(attr->value.set,
+			(unsigned char **) NULL, i2d_ASN1_TYPE,
+			V_ASN1_SET, V_ASN1_UNIVERSAL, 0);
 	str = rb_str_new(0, length);
 	p = (unsigned char *)RSTRING_PTR(str);
 	i2d_ASN1_SET_OF_ASN1_TYPE(attr->value.set, &p,
diff --git a/ext/openssl/ossl_x509crl.c b/ext/openssl/ossl_x509crl.c
index 1be9640..818fdba 100644
--- a/ext/openssl/ossl_x509crl.c
+++ b/ext/openssl/ossl_x509crl.c
@@ -264,7 +264,7 @@ ossl_x509crl_get_revoked(VALUE self)
     VALUE ary, revoked;
 
     GetX509CRL(self, crl);
-    num = sk_X509_CRL_num(X509_CRL_get_REVOKED(crl));
+    num = sk_X509_REVOKED_num(X509_CRL_get_REVOKED(crl));
     if (num < 0) {
 	OSSL_Debug("num < 0???");
 	return rb_ary_new();
@@ -272,7 +272,7 @@ ossl_x509crl_get_revoked(VALUE self)
     ary = rb_ary_new2(num);
     for(i=0; i<num; i++) {
 	/* NO DUP - don't free! */
-	rev = (X509_REVOKED *)sk_X509_CRL_value(X509_CRL_get_REVOKED(crl), i);
+	rev = sk_X509_REVOKED_value(X509_CRL_get_REVOKED(crl), i);
 	revoked = ossl_x509revoked_new(rev);
 	rb_ary_push(ary, revoked);
     }
-- 
1.7.0.3
patches/ruby/1.8.5/gcc44_dtoa.diff000066400000013000147511530510012370 0ustar00diff --git a/util.c b/util.c
index 40104db..708f858 100644
--- a/util.c
+++ b/util.c
@@ -949,23 +949,25 @@ Exactly one of IEEE_LITTLE_ENDIAN, IEEE_BIG_ENDIAN, VAX, or IBM should be define
 typedef union { double d; ULong L[2]; } U;
 
 #ifdef YES_ALIAS
-#define dval(x) x
-#ifdef IEEE_LITTLE_ENDIAN
-#define word0(x) ((ULong *)&x)[1]
-#define word1(x) ((ULong *)&x)[0]
-#else
-#define word0(x) ((ULong *)&x)[0]
-#define word1(x) ((ULong *)&x)[1]
-#endif
-#else
-#ifdef IEEE_LITTLE_ENDIAN
-#define word0(x) ((U*)&x)->L[1]
-#define word1(x) ((U*)&x)->L[0]
-#else
-#define word0(x) ((U*)&x)->L[0]
-#define word1(x) ((U*)&x)->L[1]
-#endif
-#define dval(x) ((U*)&x)->d
+typedef double double_u;
+#  define dval(x) x
+#  ifdef IEEE_LITTLE_ENDIAN
+#    define word0(x) (((ULong *)&x)[1])
+#    define word1(x) (((ULong *)&x)[0])
+#  else
+#    define word0(x) (((ULong *)&x)[0])
+#    define word1(x) (((ULong *)&x)[1])
+#  endif
+#else
+typedef U double_u;
+#  ifdef IEEE_LITTLE_ENDIAN
+#    define word0(x) (x.L[1])
+#    define word1(x) (x.L[0])
+#  else
+#    define word0(x) (x.L[0])
+#    define word1(x) (x.L[1])
+#  endif
+#  define dval(x) (x.d)
 #endif
 
 /* The following definition of Storeinc is appropriate for MIPS processors.
@@ -1695,10 +1697,11 @@ diff(Bigint *a, Bigint *b)
 }
 
 static double
-ulp(double x)
+ulp(double x_)
 {
     register Long L;
-    double a;
+    double_u x, a;
+    dval(x) = x_;
 
     L = (word0(x) & Exp_mask) - (P-1)*Exp_msk1;
 #ifndef Avoid_Underflow
@@ -1736,7 +1739,7 @@ b2d(Bigint *a, int *e)
 {
     ULong *xa, *xa0, w, y, z;
     int k;
-    double d;
+    double_u d;
 #ifdef VAX
     ULong d0, d1;
 #else
@@ -1797,8 +1800,9 @@ ret_d:
 }
 
 static Bigint *
-d2b(double d, int *e, int *bits)
+d2b(double d_, int *e, int *bits)
 {
+    double_u d;
     Bigint *b;
     int de, k;
     ULong *x, y, z;
@@ -1807,6 +1811,9 @@ d2b(double d, int *e, int *bits)
 #endif
 #ifdef VAX
     ULong d0, d1;
+#endif
+    dval(d) = d_;
+#ifdef VAX
     d0 = word0(d) >> 16 | word0(d) << 16;
     d1 = word1(d) >> 16 | word1(d) << 16;
 #else
@@ -1932,7 +1939,7 @@ d2b(double d, int *e, int *bits)
 static double
 ratio(Bigint *a, Bigint *b)
 {
-    double da, db;
+    double_u da, db;
     int k, ka, kb;
 
     dval(da) = b2d(a, &ka);
@@ -2091,7 +2098,8 @@ ruby_strtod(const char *s00, char **se)
     int bb2, bb5, bbe, bd2, bd5, bbbits, bs2, c, dsign,
          e, e1, esign, i, j, k, nd, nd0, nf, nz, nz0, sign;
     const char *s, *s0, *s1;
-    double aadj, aadj1, adj, rv, rv0;
+    double aadj, adj;
+    double_u aadj1, rv, rv0;
     Long L;
     ULong y, z;
     Bigint *bb, *bb1, *bd, *bd0, *bs, *delta;
@@ -2787,14 +2795,14 @@ drop_down:
         }
         if ((aadj = ratio(delta, bs)) <= 2.) {
             if (dsign)
-                aadj = aadj1 = 1.;
+                aadj = dval(aadj1) = 1.;
             else if (word1(rv) || word0(rv) & Bndry_mask) {
 #ifndef Sudden_Underflow
                 if (word1(rv) == Tiny1 && !word0(rv))
                     goto undfl;
 #endif
                 aadj = 1.;
-                aadj1 = -1.;
+                dval(aadj1) = -1.;
             }
             else {
                 /* special case -- power of FLT_RADIX to be */
@@ -2804,12 +2812,12 @@ drop_down:
                     aadj = 1./FLT_RADIX;
                 else
                     aadj *= 0.5;
-                aadj1 = -aadj;
+                dval(aadj1) = -aadj;
             }
         }
         else {
             aadj *= 0.5;
-            aadj1 = dsign ? aadj : -aadj;
+            dval(aadj1) = dsign ? aadj : -aadj;
 #ifdef Check_FLT_ROUNDS
             switch (Rounding) {
               case 2: /* towards +infinity */
@@ -2821,7 +2829,7 @@ drop_down:
             }
 #else
             if (Flt_Rounds == 0)
-                aadj1 += 0.5;
+                dval(aadj1) += 0.5;
 #endif /*Check_FLT_ROUNDS*/
         }
         y = word0(rv) & Exp_mask;
@@ -2831,7 +2839,7 @@ drop_down:
         if (y == Exp_msk1*(DBL_MAX_EXP+Bias-1)) {
             dval(rv0) = dval(rv);
             word0(rv) -= P*Exp_msk1;
-            adj = aadj1 * ulp(dval(rv));
+            adj = dval(aadj1) * ulp(dval(rv));
             dval(rv) += adj;
             if ((word0(rv) & Exp_mask) >=
                     Exp_msk1*(DBL_MAX_EXP+Bias-P)) {
@@ -2851,11 +2859,11 @@ drop_down:
                     if ((z = aadj) <= 0)
                         z = 1;
                     aadj = z;
-                    aadj1 = dsign ? aadj : -aadj;
+                    dval(aadj1) = dsign ? aadj : -aadj;
                 }
                 word0(aadj1) += (2*P+1)*Exp_msk1 - y;
             }
-            adj = aadj1 * ulp(dval(rv));
+            adj = dval(aadj1) * ulp(dval(rv));
             dval(rv) += adj;
 #else
 #ifdef Sudden_Underflow
@@ -3166,7 +3174,7 @@ freedtoa(char *s)
  */
 
 char *
-dtoa(double d, int mode, int ndigits, int *decpt, int *sign, char **rve)
+dtoa(double d_, int mode, int ndigits, int *decpt, int *sign, char **rve)
 {
  /* Arguments ndigits, decpt, sign are similar to those
     of ecvt and fcvt; trailing zeros are suppressed from
@@ -3211,7 +3219,8 @@ dtoa(double d, int mode, int ndigits, int *decpt, int *sign, char **rve)
     ULong x;
 #endif
     Bigint *b, *b1, *delta, *mlo, *mhi, *S;
-    double d2, ds, eps;
+    double ds;
+    double_u d, d2, eps;
     char *s, *s0;
 #ifdef Honor_FLT_ROUNDS
     int rounding;
@@ -3220,6 +3229,8 @@ dtoa(double d, int mode, int ndigits, int *decpt, int *sign, char **rve)
     int inexact, oldinexact;
 #endif
 
+    dval(d) = d_;
+
 #ifndef MULTIPLE_THREADS
     if (dtoa_result) {
         freedtoa(dtoa_result);
patches/ruby/1.8.5/railsbench.patch000066400000033360147511530510012771 0ustar00--- gc.c.orig	2006-08-25 10:12:46.000000000 +0200
+++ gc.c	2007-05-06 10:55:19.000000000 +0200
@@ -22,8 +22,16 @@
 #include <setjmp.h>
 #include <sys/types.h>
 
+#ifdef _WIN32
+#include <string.h>
+#else
+#include <strings.h>
+#endif
+
 #ifdef HAVE_SYS_TIME_H
 #include <sys/time.h>
+#elif defined(_WIN32)
+#include <time.h> 
 #endif
 
 #ifdef HAVE_SYS_RESOURCE_H
@@ -54,7 +62,6 @@
 #if !defined(setjmp) && defined(HAVE__SETJMP)
 #define setjmp(env) _setjmp(env)
 #endif
-
 /* Make alloca work the best possible way.  */
 #ifdef __GNUC__
 # ifndef atarist
@@ -173,8 +180,17 @@
 	RUBY_CRITICAL(free(x));
 }
 
+#if HAVE_LONG_LONG
+#define GC_TIME_TYPE LONG_LONG
+#else
+#define GC_TIME_TYPE long
+#endif
+
 extern int ruby_in_compile;
 static int dont_gc;
+static int gc_statistics = 0;
+static GC_TIME_TYPE gc_time = 0;
+static int gc_collections = 0;
 static int during_gc;
 static int need_call_final = 0;
 static st_table *finalizer_table = 0;
@@ -209,7 +225,7 @@
  *  Disables garbage collection, returning <code>true</code> if garbage
  *  collection was already disabled.
  *
- *     GC.disable   #=> false
+ *     GC.disable   #=> false or true
  *     GC.disable   #=> true
  *
  */
@@ -223,6 +239,104 @@
     return old;
 }
 
+/*
+ *  call-seq:
+ *     GC.enable_stats    => true or false
+ *
+ *  Enables garbage collection statistics, returning <code>true</code> if garbage
+ *  collection statistics was already enabled.
+ *
+ *     GC.enable_stats   #=> false or true
+ *     GC.enable_stats   #=> true
+ *
+ */
+
+VALUE
+rb_gc_enable_stats()
+{
+    int old = gc_statistics;
+    gc_statistics = Qtrue;
+    return old;
+}
+
+/*
+ *  call-seq:
+ *     GC.disable_stats    => true or false
+ *
+ *  Disables garbage collection statistics, returning <code>true</code> if garbage
+ *  collection statistics was already disabled.
+ *
+ *     GC.disable_stats   #=> false or true
+ *     GC.disable_stats   #=> true
+ *
+ */
+
+VALUE
+rb_gc_disable_stats()
+{
+    int old = gc_statistics;
+    gc_statistics = Qfalse;
+    return old;
+}
+
+/*
+ *  call-seq:
+ *     GC.clear_stats    => nil
+ *
+ *  Clears garbage collection statistics, returning nil. This resets the number
+ *  of collections (GC.collections) and the time used (GC.time) to 0.
+ *
+ *     GC.clear_stats    #=> nil
+ *
+ */
+
+VALUE
+rb_gc_clear_stats()
+{
+    gc_collections = 0;
+    gc_time = 0;
+    return Qnil; 
+}
+
+/*
+ *  call-seq:
+ *     GC.collections    => Integer
+ *
+ *  Returns the number of garbage collections performed while GC statistics collection
+ *  was enabled.
+ *
+ *     GC.collections    #=> 35
+ *
+ */
+
+VALUE
+rb_gc_collections()
+{
+    return INT2NUM(gc_collections);
+}
+
+/*
+ *  call-seq:
+ *     GC.time    => Integer
+ *
+ *  Returns the time spent during garbage collection while GC statistics collection
+ *  was enabled (in micro seconds).
+ *
+ *     GC.time    #=> 20000
+ *
+ */
+
+VALUE
+rb_gc_time()
+{
+#if HAVE_LONG_LONG
+    return LL2NUM(gc_time);
+#else
+    return LONG2NUM(gc_time);
+#endif
+}
+
+
 VALUE rb_mGC;
 
 static struct gc_list {
@@ -314,7 +428,7 @@
 static RVALUE *freelist = 0;
 static RVALUE *deferred_final_list = 0;
 
-#define HEAPS_INCREMENT 10
+static int heaps_increment = 10;
 static struct heaps_slot {
     void *membase;
     RVALUE *slot;
@@ -323,13 +437,165 @@
 static int heaps_length = 0;
 static int heaps_used   = 0;
 
-#define HEAP_MIN_SLOTS 10000
-static int heap_slots = HEAP_MIN_SLOTS;
+static int heap_min_slots = 10000;
+static int heap_slots = 10000;
+
+static int heap_free_min = 4096;
+static int heap_slots_increment = 10000;
+static double heap_slots_growth_factor = 1.8;
+
+static long initial_malloc_limit = GC_MALLOC_LIMIT;
 
-#define FREE_MIN  4096
+static int verbose_gc_stats = Qfalse;
+
+static FILE* gc_data_file = NULL;
 
 static RVALUE *himem, *lomem;
 
+static void set_gc_parameters()
+{
+    char *gc_stats_ptr, *min_slots_ptr, *free_min_ptr, *heap_slots_incr_ptr,
+      *heap_incr_ptr, *malloc_limit_ptr, *gc_heap_file_ptr, *heap_slots_growth_factor_ptr;
+
+    gc_data_file = stderr;
+
+    gc_stats_ptr = getenv("RUBY_GC_STATS");
+    if (gc_stats_ptr != NULL) {
+	int gc_stats_i = atoi(gc_stats_ptr);
+	if (gc_stats_i > 0) {
+	    verbose_gc_stats = Qtrue;
+	}
+    }
+
+    gc_heap_file_ptr = getenv("RUBY_GC_DATA_FILE");
+    if (gc_heap_file_ptr != NULL) {
+	FILE* data_file = fopen(gc_heap_file_ptr, "w");
+	if (data_file != NULL) {
+	    gc_data_file = data_file;
+	}
+	else {
+	    fprintf(stderr,
+		    "can't open gc log file %s for writing, using default\n", gc_heap_file_ptr);
+	}
+    }
+
+    min_slots_ptr = getenv("RUBY_HEAP_MIN_SLOTS");
+    if (min_slots_ptr != NULL) {
+	int min_slots_i = atoi(min_slots_ptr);
+        if (verbose_gc_stats) {
+	    fprintf(gc_data_file, "RUBY_HEAP_MIN_SLOTS=%s\n", min_slots_ptr);
+        }
+	if (min_slots_i > 0) {
+	    heap_slots = min_slots_i;
+	    heap_min_slots = min_slots_i;
+	}
+    }
+
+    free_min_ptr = getenv("RUBY_HEAP_FREE_MIN");
+    if (free_min_ptr != NULL) {
+	int free_min_i = atoi(free_min_ptr);
+        if (verbose_gc_stats) {
+	    fprintf(gc_data_file, "RUBY_HEAP_FREE_MIN=%s\n", free_min_ptr);
+	}
+	if (free_min_i > 0) {
+	    heap_free_min = free_min_i;
+	}
+    }
+
+    heap_incr_ptr = getenv("RUBY_HEAP_INCREMENT");
+    if (heap_incr_ptr != NULL) {
+	int heap_incr_i = atoi(heap_incr_ptr);
+        if (verbose_gc_stats) {
+	    fprintf(gc_data_file, "RUBY_HEAP_INCREMENT=%s\n", heap_incr_ptr);
+	}
+	if (heap_incr_i > 0) {
+	    heaps_increment = heap_incr_i;
+	}
+    }
+
+    heap_slots_incr_ptr = getenv("RUBY_HEAP_SLOTS_INCREMENT");
+    if (heap_slots_incr_ptr != NULL) {
+	int heap_slots_incr_i = atoi(heap_slots_incr_ptr);
+        if (verbose_gc_stats) {
+	    fprintf(gc_data_file, "RUBY_HEAP_SLOTS_INCREMENT=%s\n", heap_slots_incr_ptr);
+	}
+	if (heap_slots_incr_i > 0) {
+	    heap_slots_increment = heap_slots_incr_i;
+	}
+    }
+
+    heap_slots_growth_factor_ptr = getenv("RUBY_HEAP_SLOTS_GROWTH_FACTOR");
+    if (heap_slots_growth_factor_ptr != NULL) {
+	double heap_slots_growth_factor_d = atoi(heap_slots_growth_factor_ptr);
+        if (verbose_gc_stats) {
+	    fprintf(gc_data_file, "RUBY_HEAP_SLOTS_GROWTH_FACTOR=%s\n", heap_slots_growth_factor_ptr);
+	}
+	if (heap_slots_growth_factor_d > 0) {
+	    heap_slots_growth_factor = heap_slots_growth_factor_d;
+	}
+    }
+
+    malloc_limit_ptr = getenv("RUBY_GC_MALLOC_LIMIT");
+    if (malloc_limit_ptr != NULL) {
+	int malloc_limit_i = atol(malloc_limit_ptr);
+        if (verbose_gc_stats) {
+	    fprintf(gc_data_file, "RUBY_GC_MALLOC_LIMIT=%s\n", malloc_limit_ptr);
+	}
+	if (malloc_limit_i > 0) {
+	    initial_malloc_limit = malloc_limit_i;
+	}
+    }
+}
+
+/*
+ *  call-seq:
+ *     GC.dump    => nil
+ *
+ *  dumps information about the current GC data structures to the GC log file
+ *
+ *     GC.dump    #=> nil
+ *
+ */
+
+VALUE
+rb_gc_dump()
+{
+    int i;
+
+    for (i = 0; i < heaps_used; i++) {
+	int heap_size = heaps[i].limit;
+	fprintf(gc_data_file, "HEAP[%2d]: size=%7d\n", i, heap_size);
+    }
+
+    return Qnil;
+}
+
+/*
+ *  call-seq:
+ *     GC.log String  => String
+ *
+ *  Logs string to the GC data file and returns it.
+ *
+ *     GC.log "manual GC call"    #=> "manual GC call"
+ *
+ */
+
+VALUE
+rb_gc_log(self, original_str)
+     VALUE self, original_str;
+{
+    if (original_str == Qnil) {
+        fprintf(gc_data_file, "\n");
+    }
+    else {
+        VALUE str = StringValue(original_str);
+        char *p = RSTRING(str)->ptr;
+        fprintf(gc_data_file, "%s\n", p);
+    }
+    return original_str;
+}
+
+
 static void
 add_heap()
 {
@@ -340,7 +606,7 @@
 	struct heaps_slot *p;
 	int length;
 
-	heaps_length += HEAPS_INCREMENT;
+	heaps_length += heaps_increment;
 	length = heaps_length*sizeof(struct heaps_slot);
 	RUBY_CRITICAL(
 	    if (heaps_used > 0) {
@@ -356,10 +622,10 @@
     for (;;) {
 	RUBY_CRITICAL(p = (RVALUE*)malloc(sizeof(RVALUE)*(heap_slots+1)));
 	if (p == 0) {
-	    if (heap_slots == HEAP_MIN_SLOTS) {
+	    if (heap_slots == heap_min_slots) {
 		rb_memerror();
 	    }
-	    heap_slots = HEAP_MIN_SLOTS;
+	    heap_slots = heap_min_slots;
 	    continue;
 	}
         heaps[heaps_used].membase = p;
@@ -375,8 +641,9 @@
     if (lomem == 0 || lomem > p) lomem = p;
     if (himem < pend) himem = pend;
     heaps_used++;
-    heap_slots *= 1.8;
-    if (heap_slots <= 0) heap_slots = HEAP_MIN_SLOTS;
+    heap_slots += heap_slots_increment;
+    heap_slots_increment *= heap_slots_growth_factor;
+    if (heap_slots <= 0) heap_slots = heap_min_slots;
 
     while (p < pend) {
 	p->as.free.flags = 0;
@@ -1026,6 +1293,39 @@
     }
 }
 
+static char* obj_type(int tp)
+{
+    switch (tp) {
+	case T_NIL    : return "NIL";   
+	case T_OBJECT : return "OBJECT";
+	case T_CLASS  : return "CLASS";
+	case T_ICLASS : return "ICLASS";
+	case T_MODULE : return "MODULE";
+	case T_FLOAT  : return "FLOAT";
+	case T_STRING : return "STRING";
+	case T_REGEXP : return "REGEXP";
+	case T_ARRAY  : return "ARRAY";
+	case T_FIXNUM : return "FIXNUM";
+	case T_HASH   : return "HASH";
+	case T_STRUCT : return "STRUCT";
+	case T_BIGNUM : return "BIGNUM";
+	case T_FILE   : return "FILE";
+	    
+	case T_TRUE   : return "TRUE";
+	case T_FALSE  : return "FALSE";
+	case T_DATA   : return "DATA";
+	case T_MATCH  : return "MATCH";
+	case T_SYMBOL : return "SYMBOL";
+	    
+	case T_BLKTAG : return "BLKTAG";
+	case T_UNDEF  : return "UNDEF";
+	case T_VARMAP : return "VARMAP";
+	case T_SCOPE  : return "SCOPE";
+	case T_NODE   : return "NODE";
+	default: return "____";
+    }
+}
+
 static void
 free_unused_heaps()
 {
@@ -1056,12 +1356,21 @@
     unsigned long live = 0;
     unsigned long free_min = 0;
 
+    unsigned long really_freed = 0;
+    int free_counts[256];
+    int live_counts[256];
+    int do_gc_stats = gc_statistics & verbose_gc_stats;
+
     for (i = 0; i < heaps_used; i++) {
         free_min += heaps[i].limit;
     }
     free_min = free_min * 0.2;
-    if (free_min < FREE_MIN)
-        free_min = FREE_MIN;
+    if (free_min < heap_free_min)
+        free_min = heap_free_min;
+
+    if (do_gc_stats) {
+	for (i = 0 ; i< 256; i++) { free_counts[i] = live_counts[i] = 0; }
+    }
 
     if (ruby_in_compile && ruby_parser_stack_on_heap()) {
 	/* should not reclaim nodes during compilation
@@ -1094,6 +1403,9 @@
 	    if (!(p->as.basic.flags & FL_MARK)) {
 		if (p->as.basic.flags) {
 		    obj_free((VALUE)p);
+		    if (do_gc_stats) {
+			really_freed++;
+		    }
 		}
 		if (need_call_final && FL_TEST(p, FL_FINALIZE)) {
 		    p->as.free.flags = FL_MARK; /* remain marked */
@@ -1101,6 +1413,12 @@
 		    final_list = p;
 		}
 		else {
+		    if (do_gc_stats) {
+			int obt = p->as.basic.flags & T_MASK;
+			if (obt) {
+			    free_counts[obt]++;
+			}
+		    }
 		    p->as.free.flags = 0;
 		    p->as.free.next = freelist;
 		    freelist = p;
@@ -1114,6 +1432,9 @@
 	    else {
 		RBASIC(p)->flags &= ~FL_MARK;
 		live++;
+		if (do_gc_stats) {
+ 		    live_counts[RANY((VALUE)p)->as.basic.flags & T_MASK]++;
+ 		}
 	    }
 	    p++;
 	}
@@ -1132,7 +1453,7 @@
     }
     if (malloc_increase > malloc_limit) {
 	malloc_limit += (malloc_increase - malloc_limit) * (double)live / (live + freed);
-	if (malloc_limit < GC_MALLOC_LIMIT) malloc_limit = GC_MALLOC_LIMIT;
+	if (malloc_limit < initial_malloc_limit) malloc_limit = initial_malloc_limit;
     }
     malloc_increase = 0;
     if (freed < free_min) {
@@ -1140,6 +1461,20 @@
     }
     during_gc = 0;
 
+    if (do_gc_stats) {
+	fprintf(gc_data_file, "objects processed: %.7d\n", live+freed);
+	fprintf(gc_data_file, "live objects	: %.7d\n", live);
+	fprintf(gc_data_file, "freelist objects : %.7d\n", freed - really_freed);
+	fprintf(gc_data_file, "freed objects	: %.7d\n", really_freed);
+	for(i=0; i<256; i++) {
+	    if (free_counts[i]>0) {
+		fprintf(gc_data_file,
+			"kept %.7d / freed %.7d objects of type %s\n",
+			live_counts[i], free_counts[i], obj_type(i));
+	    }
+	}
+    }
+
     /* clear finalization list */
     if (final_list) {
 	deferred_final_list = final_list;
@@ -1334,6 +1669,7 @@
     struct gc_list *list;
     struct FRAME * volatile frame; /* gcc 2.7.2.3 -O2 bug??  */
     jmp_buf save_regs_gc_mark;
+    struct timeval gctv1, gctv2;
     SET_STACK_END;
 
 #ifdef HAVE_NATIVETHREAD
@@ -1350,6 +1686,14 @@
     if (during_gc) return;
     during_gc++;
 
+    if (gc_statistics) {
+        gc_collections++;
+	gettimeofday(&gctv1, NULL);
+        if (verbose_gc_stats) {
+	    fprintf(gc_data_file, "Garbage collection started\n");
+	}
+    }
+
     init_mark_stack();
 
     gc_mark((VALUE)ruby_current_node, 0);
@@ -1438,6 +1782,17 @@
     } while (!MARK_STACK_EMPTY);
 
     gc_sweep();
+
+    if (gc_statistics) {
+        GC_TIME_TYPE musecs_used;
+	gettimeofday(&gctv2, NULL);
+	musecs_used = ((GC_TIME_TYPE)(gctv2.tv_sec - gctv1.tv_sec) * 1000000) + (gctv2.tv_usec - gctv1.tv_usec);
+	gc_time += musecs_used;
+
+	if (verbose_gc_stats) {
+	    fprintf(gc_data_file, "GC time: %d msec\n", musecs_used / 1000);
+	}
+    }
 }
 
 void
@@ -1551,6 +1906,7 @@
     if (!rb_gc_stack_start) {
 	Init_stack(0);
     }
+    set_gc_parameters();
     add_heap();
 }
 
@@ -2020,6 +2376,14 @@
     rb_define_singleton_method(rb_mGC, "disable", rb_gc_disable, 0);
     rb_define_method(rb_mGC, "garbage_collect", rb_gc_start, 0);
 
+    rb_define_singleton_method(rb_mGC, "enable_stats", rb_gc_enable_stats, 0);
+    rb_define_singleton_method(rb_mGC, "disable_stats", rb_gc_disable_stats, 0);
+    rb_define_singleton_method(rb_mGC, "clear_stats", rb_gc_clear_stats, 0);
+    rb_define_singleton_method(rb_mGC, "collections", rb_gc_collections, 0);
+    rb_define_singleton_method(rb_mGC, "time", rb_gc_time, 0);
+    rb_define_singleton_method(rb_mGC, "dump", rb_gc_dump, 0);
+    rb_define_singleton_method(rb_mGC, "log", rb_gc_log, 1);
+
     rb_mObSpace = rb_define_module("ObjectSpace");
     rb_define_module_function(rb_mObSpace, "each_object", os_each_obj, -1);
     rb_define_module_function(rb_mObSpace, "garbage_collect", rb_gc_start, 0);
patches/ruby/1.8.5/backported-ossl-fixes.diff000066400000021042147511530510014672 0ustar00diff -r -u ruby-1.8.5-p231/ext/openssl/extconf.rb ruby-1.8.5-p231-fixed/ext/openssl/extconf.rb
--- ruby-1.8.5-p231/ext/openssl/extconf.rb	2007-02-13 08:01:19.000000000 +0900
+++ ruby-1.8.5-p231-fixed/ext/openssl/extconf.rb	2010-07-13 02:18:18.000000000 +0800
@@ -1,5 +1,5 @@
 =begin
-= $RCSfile: extconf.rb,v $ -- Generator for Makefile
+= $RCSfile$ -- Generator for Makefile
 
 = Info
   'OpenSSL for Ruby 2' project
@@ -11,7 +11,7 @@
   (See the file 'LICENSE'.)
 
 = Version
-  $Id: extconf.rb,v 1.21.2.9 2006/06/20 11:18:15 gotoyuzo Exp $
+  $Id: extconf.rb 12572 2007-06-18 09:03:15Z technorama $
 =end
 
 require "mkmf"
@@ -36,8 +36,6 @@
 message "=== Checking for system dependent stuff... ===\n"
 have_library("nsl", "t_open")
 have_library("socket", "socket")
-have_header("unistd.h")
-have_header("sys/time.h")
 have_header("assert.h")
 
 message "=== Checking for required stuff... ===\n"
@@ -61,6 +59,8 @@
   exit 1
 end
 
+%w"rb_str_set_len rb_block_call".each {|func| have_func(func, "ruby.h")}
+
 message "=== Checking for OpenSSL features... ===\n"
 have_func("ERR_peek_last_error")
 have_func("BN_mod_add")
@@ -83,6 +83,8 @@
 have_func("HMAC_CTX_copy")
 have_func("HMAC_CTX_init")
 have_func("PEM_def_callback")
+have_func("PKCS5_PBKDF2_HMAC")
+have_func("PKCS5_PBKDF2_HMAC_SHA1")
 have_func("X509V3_set_nconf")
 have_func("X509V3_EXT_nconf_nid")
 have_func("X509_CRL_add0_revoked")
@@ -92,6 +94,7 @@
 have_func("X509_STORE_get_ex_data")
 have_func("X509_STORE_set_ex_data")
 have_func("OBJ_NAME_do_all_sorted")
+have_func("SSL_SESSION_get_id")
 have_func("OPENSSL_cleanse")
 if try_compile("#define FOO(a, ...) foo(a, ##__VA_ARGS__)\n int x(){FOO(1);FOO(1,2);FOO(1,2,3);}\n")
   $defs.push("-DHAVE_VA_ARGS_MACRO")
diff -r -u ruby-1.8.5-p231/ext/openssl/openssl_missing.c ruby-1.8.5-p231-fixed/ext/openssl/openssl_missing.c
--- ruby-1.8.5-p231/ext/openssl/openssl_missing.c	2007-02-13 08:01:19.000000000 +0900
+++ ruby-1.8.5-p231-fixed/ext/openssl/openssl_missing.c	2010-07-13 02:22:10.000000000 +0800
@@ -1,5 +1,5 @@
 /*
- * $Id: openssl_missing.c,v 1.2.2.4 2006/06/02 10:02:56 gotoyuzo Exp $
+ * $Id: openssl_missing.c 16467 2008-05-19 03:00:52Z knu $
  * 'OpenSSL for Ruby' project
  * Copyright (C) 2001-2002  Michal Rokos <m.rokos@sh.cvut.cz>
  * All rights reserved.
@@ -22,17 +22,15 @@
 #include "openssl_missing.h"
 
 #if !defined(HAVE_HMAC_CTX_COPY)
-int
+void
 HMAC_CTX_copy(HMAC_CTX *out, HMAC_CTX *in)
 {
-    if (!out || !in) return 0;
+    if (!out || !in) return;
     memcpy(out, in, sizeof(HMAC_CTX));
 
-    if (!EVP_MD_CTX_copy(&out->md_ctx, &in->md_ctx)
-	    || !EVP_MD_CTX_copy(&out->i_ctx, &in->i_ctx)
-	    || !EVP_MD_CTX_copy(&out->o_ctx, &in->o_ctx))
-	return 0;
-    return 1;
+    EVP_MD_CTX_copy(&out->md_ctx, &in->md_ctx);
+    EVP_MD_CTX_copy(&out->i_ctx, &in->i_ctx);
+    EVP_MD_CTX_copy(&out->o_ctx, &in->o_ctx);
 }
 #endif /* HAVE_HMAC_CTX_COPY */
 #endif /* NO_HMAC */
diff -r -u ruby-1.8.5-p231/ext/openssl/openssl_missing.h ruby-1.8.5-p231-fixed/ext/openssl/openssl_missing.h
--- ruby-1.8.5-p231/ext/openssl/openssl_missing.h	2007-02-13 08:01:19.000000000 +0900
+++ ruby-1.8.5-p231-fixed/ext/openssl/openssl_missing.h	2010-07-13 02:22:10.000000000 +0800
@@ -1,5 +1,5 @@
 /*
- * $Id: openssl_missing.h,v 1.2.2.2 2005/04/15 19:16:18 gotoyuzo Exp $
+ * $Id: openssl_missing.h 18335 2008-08-04 04:44:17Z shyouhei $
  * 'OpenSSL for Ruby' project
  * Copyright (C) 2001-2002  Michal Rokos <m.rokos@sh.cvut.cz>
  * All rights reserved.
@@ -15,6 +15,10 @@
 extern "C" {
 #endif
 
+#ifndef TYPEDEF_D2I_OF
+typedef char *d2i_of_void();
+#endif
+
 /*
  * These functions are not included in headers of OPENSSL <= 0.9.6b
  */
@@ -56,14 +60,33 @@
 	(char *(*)())d2i_PKCS7_RECIP_INFO, (char *)ri)
 #endif
 
+#if !defined(HAVE_EVP_MD_CTX_INIT)
 void HMAC_CTX_init(HMAC_CTX *ctx);
-int HMAC_CTX_copy(HMAC_CTX *out, HMAC_CTX *in);
+#endif
+
+#if !defined(HAVE_HMAC_CTX_COPY)
+void HMAC_CTX_copy(HMAC_CTX *out, HMAC_CTX *in);
+#endif
+
+#if !defined(HAVE_HMAC_CTX_CLEANUP)
 void HMAC_CTX_cleanup(HMAC_CTX *ctx);
+#endif
 
+#if !defined(HAVE_EVP_MD_CTX_CREATE)
 EVP_MD_CTX *EVP_MD_CTX_create(void);
+#endif
+
+#if !defined(HAVE_EVP_MD_CTX_INIT)
 void EVP_MD_CTX_init(EVP_MD_CTX *ctx);
+#endif
+
+#if !defined(HAVE_EVP_MD_CTX_CLEANUP)
 int EVP_MD_CTX_cleanup(EVP_MD_CTX *ctx);
+#endif
+
+#if !defined(HAVE_EVP_MD_CTX_DESTROY)
 void EVP_MD_CTX_destroy(EVP_MD_CTX *ctx);
+#endif
 
 #if !defined(HAVE_EVP_CIPHER_CTX_COPY)
 int EVP_CIPHER_CTX_copy(EVP_CIPHER_CTX *out, EVP_CIPHER_CTX *in);
@@ -107,19 +130,54 @@
 #define OPENSSL_cleanse(p, l) memset(p, 0, l)
 #endif
 
+#if !defined(HAVE_X509_STORE_SET_EX_DATA)
 void *X509_STORE_get_ex_data(X509_STORE *str, int idx);
 int X509_STORE_set_ex_data(X509_STORE *str, int idx, void *data);
+#endif
+
+#if !defined(HAVE_X509_CRL_SET_VERSION)
 int X509_CRL_set_version(X509_CRL *x, long version);
+#endif
+
+#if !defined(HAVE_X509_CRL_SET_ISSUER_NAME)
 int X509_CRL_set_issuer_name(X509_CRL *x, X509_NAME *name);
+#endif
+
+#if !defined(HAVE_X509_CRL_SORT)
 int X509_CRL_sort(X509_CRL *c);
+#endif
+
+#if !defined(HAVE_X509_CRL_ADD0_REVOKED)
 int X509_CRL_add0_revoked(X509_CRL *crl, X509_REVOKED *rev);
+#endif
+
+#if !defined(HAVE_BN_MOD_SQR)
 int BN_mod_sqr(BIGNUM *r, const BIGNUM *a, const BIGNUM *m, BN_CTX *ctx);
+#endif
+
+#if !defined(HAVE_BN_MOD_ADD)
 int BN_mod_add(BIGNUM *r, const BIGNUM *a, const BIGNUM *b, const BIGNUM *m, BN_CTX *ctx);
+#endif
+
+#if !defined(HAVE_BN_MOD_SUB)
 int BN_mod_sub(BIGNUM *r, const BIGNUM *a, const BIGNUM *b, const BIGNUM *m, BN_CTX *ctx);
+#endif
+
+#if !defined(HAVE_BN_RAND_RANGE)
 int BN_rand_range(BIGNUM *r, BIGNUM *range);
+#endif
+
+#if !defined(HAVE_BN_PSEUDO_RAND_RANGE)
 int BN_pseudo_rand_range(BIGNUM *r, BIGNUM *range);
+#endif
+
+#if !defined(HAVE_CONF_GET1_DEFAULT_CONFIG_FILE)
 char *CONF_get1_default_config_file(void);
+#endif
+
+#if !defined(HAVE_PEM_DEF_CALLBACK)
 int PEM_def_callback(char *buf, int num, int w, void *key);
+#endif
 
 #if defined(__cplusplus)
 }
diff -r -u ruby-1.8.5-p231/ext/openssl/ossl_hmac.c ruby-1.8.5-p231-fixed/ext/openssl/ossl_hmac.c
--- ruby-1.8.5-p231/ext/openssl/ossl_hmac.c	2007-02-13 08:01:19.000000000 +0900
+++ ruby-1.8.5-p231-fixed/ext/openssl/ossl_hmac.c	2010-07-13 02:18:36.000000000 +0800
@@ -1,5 +1,5 @@
 /*
- * $Id: ossl_hmac.c,v 1.4.2.2 2004/12/15 01:54:39 matz Exp $
+ * $Id: ossl_hmac.c 16467 2008-05-19 03:00:52Z knu $
  * 'OpenSSL for Ruby' project
  * Copyright (C) 2001-2002  Michal Rokos <m.rokos@sh.cvut.cz>
  * All rights reserved.
@@ -57,6 +57,12 @@
     return obj;
 }
 
+
+/*
+ *  call-seq:
+ *     HMAC.new(key, digest) -> hmac
+ *
+ */
 static VALUE
 ossl_hmac_initialize(VALUE self, VALUE key, VALUE digest)
 {
@@ -81,12 +87,15 @@
     GetHMAC(self, ctx1);
     SafeGetHMAC(other, ctx2);
 
-    if (!HMAC_CTX_copy(ctx1, ctx2)) {
-	ossl_raise(eHMACError, NULL);
-    }
+    HMAC_CTX_copy(ctx1, ctx2);
     return self;
 }
 
+/*
+ *  call-seq:
+ *     hmac.update(string) -> self
+ *
+ */
 static VALUE
 ossl_hmac_update(VALUE self, VALUE data)
 {
@@ -104,9 +113,7 @@
 {
     HMAC_CTX final;
 
-    if (!HMAC_CTX_copy(&final, ctx)) {
-	ossl_raise(eHMACError, NULL);
-    }
+    HMAC_CTX_copy(&final, ctx);
     if (!(*buf = OPENSSL_malloc(HMAC_size(&final)))) {
 	HMAC_CTX_cleanup(&final);
 	OSSL_Debug("Allocating %d mem", HMAC_size(&final));
@@ -116,6 +123,11 @@
     HMAC_CTX_cleanup(&final);
 }
 
+/*
+ *  call-seq:
+ *     hmac.digest -> aString
+ *
+ */
 static VALUE
 ossl_hmac_digest(VALUE self)
 {
@@ -131,6 +143,11 @@
     return digest;
 }
 
+/*
+ *  call-seq:
+ *     hmac.hexdigest -> aString
+ *
+ */
 static VALUE
 ossl_hmac_hexdigest(VALUE self)
 {
@@ -151,6 +168,27 @@
     return hexdigest;
 }
 
+/*
+ *  call-seq:
+ *     hmac.reset -> self
+ *
+ */
+static VALUE
+ossl_hmac_reset(VALUE self)
+{
+    HMAC_CTX *ctx;
+
+    GetHMAC(self, ctx);
+    HMAC_Init_ex(ctx, NULL, 0, NULL, NULL);
+
+    return self;
+}
+
+/*
+ *  call-seq:
+ *     HMAC.digest(digest, key, data) -> aString
+ *
+ */
 static VALUE
 ossl_hmac_s_digest(VALUE klass, VALUE digest, VALUE key, VALUE data)
 {
@@ -191,6 +234,10 @@
 void
 Init_ossl_hmac()
 {
+#if 0 /* let rdoc know about mOSSL */
+    mOSSL = rb_define_module("OpenSSL");
+#endif
+
     eHMACError = rb_define_class_under(mOSSL, "HMACError", eOSSLError);
 	
     cHMAC = rb_define_class_under(mOSSL, "HMAC", rb_cObject);
@@ -202,6 +249,7 @@
     rb_define_method(cHMAC, "initialize", ossl_hmac_initialize, 2);
     rb_define_copy_func(cHMAC, ossl_hmac_copy);
 
+    rb_define_method(cHMAC, "reset", ossl_hmac_reset, 0);
     rb_define_method(cHMAC, "update", ossl_hmac_update, 1);
     rb_define_alias(cHMAC, "<<", "update");
     rb_define_method(cHMAC, "digest", ossl_hmac_digest, 0);
patches/ruby/1.9.2/p180/nossl2.diff000066400000001225147511530510012371 0ustar00diff --git a/ext/openssl/ossl_ssl.c b/ext/openssl/ossl_ssl.c
index e8d2e86..be62fcc 100644
--- a/ext/openssl/ossl_ssl.c
+++ b/ext/openssl/ossl_ssl.c
@@ -107,9 +107,12 @@ struct {
     OSSL_SSL_METHOD_ENTRY(TLSv1),
     OSSL_SSL_METHOD_ENTRY(TLSv1_server),
     OSSL_SSL_METHOD_ENTRY(TLSv1_client),
+#if defined(HAVE_SSLV2_METHOD) && defined(HAVE_SSLV2_SERVER_METHOD) && \
+        defined(HAVE_SSLV2_CLIENT_METHOD)
     OSSL_SSL_METHOD_ENTRY(SSLv2),
     OSSL_SSL_METHOD_ENTRY(SSLv2_server),
     OSSL_SSL_METHOD_ENTRY(SSLv2_client),
+#endif
     OSSL_SSL_METHOD_ENTRY(SSLv3),
     OSSL_SSL_METHOD_ENTRY(SSLv3_server),
     OSSL_SSL_METHOD_ENTRY(SSLv3_client),
patches/ruby/1.9.2/p180/gcdata.patch000066400000007561147511530510012574 0ustar00--- a/gc.c	(revision 31173)
+++ b/gc.c	(working copy)
@@ -291,16 +291,12 @@
     struct gc_list *next;
 };
 
-#define CALC_EXACT_MALLOC_SIZE 0
-
 typedef struct rb_objspace {
     struct {
 	size_t limit;
 	size_t increase;
-#if CALC_EXACT_MALLOC_SIZE
 	size_t allocated_size;
 	size_t allocations;
-#endif
     } malloc_params;
     struct {
 	size_t increment;
@@ -647,10 +643,6 @@
     }
     if (size == 0) size = 1;
 
-#if CALC_EXACT_MALLOC_SIZE
-    size += sizeof(size_t);
-#endif
-
     if ((ruby_gc_stress && !ruby_disable_gc_stress) ||
 	(malloc_increase+size) > malloc_limit) {
 	garbage_collect_with_gvl(objspace);
@@ -665,13 +657,9 @@
 	}
     }
     malloc_increase += size;
-
-#if CALC_EXACT_MALLOC_SIZE
+    
     objspace->malloc_params.allocated_size += size;
     objspace->malloc_params.allocations++;
-    ((size_t *)mem)[0] = size;
-    mem = (size_t *)mem + 1;
-#endif
 
     return mem;
 }
@@ -691,12 +679,8 @@
     }
     if (ruby_gc_stress && !ruby_disable_gc_stress)
 	garbage_collect_with_gvl(objspace);
-
-#if CALC_EXACT_MALLOC_SIZE
-    size += sizeof(size_t);
+	
     objspace->malloc_params.allocated_size -= size;
-    ptr = (size_t *)ptr - 1;
-#endif
 
     mem = realloc(ptr, size);
     if (!mem) {
@@ -708,12 +692,8 @@
         }
     }
     malloc_increase += size;
-
-#if CALC_EXACT_MALLOC_SIZE
+    
     objspace->malloc_params.allocated_size += size;
-    ((size_t *)mem)[0] = size;
-    mem = (size_t *)mem + 1;
-#endif
 
     return mem;
 }
@@ -721,14 +701,6 @@
 static void
 vm_xfree(rb_objspace_t *objspace, void *ptr)
 {
-#if CALC_EXACT_MALLOC_SIZE
-    size_t size;
-    ptr = ((size_t *)ptr) - 1;
-    size = ((size_t*)ptr)[0];
-    objspace->malloc_params.allocated_size -= size;
-    objspace->malloc_params.allocations--;
-#endif
-
     free(ptr);
 }
 
@@ -2998,7 +2970,6 @@
     return UINT2NUM((&rb_objspace)->count);
 }
 
-#if CALC_EXACT_MALLOC_SIZE
 /*
  *  call-seq:
  *     GC.malloc_allocated_size -> Integer
@@ -3008,8 +2979,8 @@
  *  It returns the allocated size by malloc().
  */
 
-static VALUE
-gc_malloc_allocated_size(VALUE self)
+VALUE
+rb_gc_malloc_allocated_size(VALUE self)
 {
     return UINT2NUM((&rb_objspace)->malloc_params.allocated_size);
 }
@@ -3023,12 +2994,11 @@
  *  It returns the number of allocated memory object by malloc().
  */
 
-static VALUE
-gc_malloc_allocations(VALUE self)
+VALUE
+rb_gc_malloc_allocations(VALUE self)
 {
     return UINT2NUM((&rb_objspace)->malloc_params.allocations);
 }
-#endif
 
 static VALUE
 gc_profile_record_get(void)
@@ -3186,6 +3156,8 @@
     rb_define_singleton_method(rb_mGC, "stress", gc_stress_get, 0);
     rb_define_singleton_method(rb_mGC, "stress=", gc_stress_set, 1);
     rb_define_singleton_method(rb_mGC, "count", gc_count, 0);
+    rb_define_singleton_method(rb_mGC, "malloc_allocated_size", rb_gc_malloc_allocated_size, 0);
+    rb_define_singleton_method(rb_mGC, "malloc_allocations", rb_gc_malloc_allocations, 0);
     rb_define_method(rb_mGC, "garbage_collect", rb_gc_start, 0);
 
     rb_mProfiler = rb_define_module_under(rb_mGC, "Profiler");
@@ -3196,6 +3168,7 @@
     rb_define_singleton_method(rb_mProfiler, "result", gc_profile_result, 0);
     rb_define_singleton_method(rb_mProfiler, "report", gc_profile_report, -1);
     rb_define_singleton_method(rb_mProfiler, "total_time", gc_profile_total_time, 0);
+    rb_define_singleton_method(rb_mProfiler, "data", gc_profile_record_get, 0);
 
     rb_mObSpace = rb_define_module("ObjectSpace");
     rb_define_module_function(rb_mObSpace, "each_object", os_each_obj, -1);
@@ -3215,9 +3188,4 @@
     rb_define_method(rb_mKernel, "object_id", rb_obj_id, 0);
 
     rb_define_module_function(rb_mObSpace, "count_objects", count_objects, -1);
-
-#if CALC_EXACT_MALLOC_SIZE
-    rb_define_singleton_method(rb_mGC, "malloc_allocated_size", gc_malloc_allocated_size, 0);
-    rb_define_singleton_method(rb_mGC, "malloc_allocations", gc_malloc_allocations, 0);
-#endif
 }
patches/ruby/1.9.2/p290/gcdata.patch000066400000007665147511530510012603 0ustar00Index: gc.c
===================================================================
--- a/gc.c	(revision 32826)
+++ b/gc.c	(working copy)
@@ -291,16 +291,12 @@
     struct gc_list *next;
 };
 
-#define CALC_EXACT_MALLOC_SIZE 0
-
 typedef struct rb_objspace {
     struct {
 	size_t limit;
 	size_t increase;
-#if CALC_EXACT_MALLOC_SIZE
 	size_t allocated_size;
 	size_t allocations;
-#endif
     } malloc_params;
     struct {
 	size_t increment;
@@ -647,10 +643,6 @@
     }
     if (size == 0) size = 1;
 
-#if CALC_EXACT_MALLOC_SIZE
-    size += sizeof(size_t);
-#endif
-
     if ((ruby_gc_stress && !ruby_disable_gc_stress) ||
 	(malloc_increase+size) > malloc_limit) {
 	garbage_collect_with_gvl(objspace);
@@ -665,13 +657,9 @@
 	}
     }
     malloc_increase += size;
-
-#if CALC_EXACT_MALLOC_SIZE
+    
     objspace->malloc_params.allocated_size += size;
     objspace->malloc_params.allocations++;
-    ((size_t *)mem)[0] = size;
-    mem = (size_t *)mem + 1;
-#endif
 
     return mem;
 }
@@ -691,12 +679,8 @@
     }
     if (ruby_gc_stress && !ruby_disable_gc_stress)
 	garbage_collect_with_gvl(objspace);
-
-#if CALC_EXACT_MALLOC_SIZE
-    size += sizeof(size_t);
+	
     objspace->malloc_params.allocated_size -= size;
-    ptr = (size_t *)ptr - 1;
-#endif
 
     mem = realloc(ptr, size);
     if (!mem) {
@@ -708,27 +692,15 @@
         }
     }
     malloc_increase += size;
-
-#if CALC_EXACT_MALLOC_SIZE
+    
     objspace->malloc_params.allocated_size += size;
-    ((size_t *)mem)[0] = size;
-    mem = (size_t *)mem + 1;
-#endif
-
+    
     return mem;
 }
 
 static void
 vm_xfree(rb_objspace_t *objspace, void *ptr)
 {
-#if CALC_EXACT_MALLOC_SIZE
-    size_t size;
-    ptr = ((size_t *)ptr) - 1;
-    size = ((size_t*)ptr)[0];
-    objspace->malloc_params.allocated_size -= size;
-    objspace->malloc_params.allocations--;
-#endif
-
     free(ptr);
 }
 
@@ -2998,7 +2970,6 @@
     return UINT2NUM((&rb_objspace)->count);
 }
 
-#if CALC_EXACT_MALLOC_SIZE
 /*
  *  call-seq:
  *     GC.malloc_allocated_size -> Integer
@@ -3008,8 +2979,8 @@
  *  It returns the allocated size by malloc().
  */
 
-static VALUE
-gc_malloc_allocated_size(VALUE self)
+VALUE
+rb_gc_malloc_allocated_size(VALUE self)
 {
     return UINT2NUM((&rb_objspace)->malloc_params.allocated_size);
 }
@@ -3023,12 +2994,11 @@
  *  It returns the number of allocated memory object by malloc().
  */
 
-static VALUE
-gc_malloc_allocations(VALUE self)
+VALUE
+rb_gc_malloc_allocations(VALUE self)
 {
     return UINT2NUM((&rb_objspace)->malloc_params.allocations);
 }
-#endif
 
 static VALUE
 gc_profile_record_get(void)
@@ -3186,6 +3156,8 @@
     rb_define_singleton_method(rb_mGC, "stress", gc_stress_get, 0);
     rb_define_singleton_method(rb_mGC, "stress=", gc_stress_set, 1);
     rb_define_singleton_method(rb_mGC, "count", gc_count, 0);
+    rb_define_singleton_method(rb_mGC, "malloc_allocated_size", rb_gc_malloc_allocated_size, 0);
+    rb_define_singleton_method(rb_mGC, "malloc_allocations", rb_gc_malloc_allocations, 0);
     rb_define_method(rb_mGC, "garbage_collect", rb_gc_start, 0);
 
     rb_mProfiler = rb_define_module_under(rb_mGC, "Profiler");
@@ -3196,6 +3168,7 @@
     rb_define_singleton_method(rb_mProfiler, "result", gc_profile_result, 0);
     rb_define_singleton_method(rb_mProfiler, "report", gc_profile_report, -1);
     rb_define_singleton_method(rb_mProfiler, "total_time", gc_profile_total_time, 0);
+    rb_define_singleton_method(rb_mProfiler, "data", gc_profile_record_get, 0);
 
     rb_mObSpace = rb_define_module("ObjectSpace");
     rb_define_module_function(rb_mObSpace, "each_object", os_each_obj, -1);
@@ -3215,9 +3188,4 @@
     rb_define_method(rb_mKernel, "object_id", rb_obj_id, 0);
 
     rb_define_module_function(rb_mObSpace, "count_objects", count_objects, -1);
-
-#if CALC_EXACT_MALLOC_SIZE
-    rb_define_singleton_method(rb_mGC, "malloc_allocated_size", gc_malloc_allocated_size, 0);
-    rb_define_singleton_method(rb_mGC, "malloc_allocations", gc_malloc_allocations, 0);
-#endif
 }
patches/ruby/1.9.2/osx-arch-fix.patch000066400000000617147511530510013164 0ustar00diff --git a/Makefile.in b/Makefile.in
index 656ae90..f976cf1 100644
--- a/Makefile.in
+++ b/Makefile.in
@@ -45,7 +45,7 @@ XLDFLAGS = @XLDFLAGS@ $(EXTLDFLAGS)
 EXTLIBS = 
 LIBS = @LIBS@ $(EXTLIBS)
 MISSING = @LIBOBJS@ @ALLOCA@
-LDSHARED = @LIBRUBY_LDSHARED@
+LDSHARED = @LIBRUBY_LDSHARED@ $(LDFLAGS)
 DLDFLAGS = @LIBRUBY_DLDFLAGS@ $(EXTLDFLAGS) @ARCH_FLAG@
 SOLIBS = @SOLIBS@
 MAINLIBS = @MAINLIBS@
patches/ruby/1.9.2/support_joke.patch000066400000000327147511530510013376 0ustar00--- a/vm_opts.h
+++ b/vm_opts.h
@@ -46,6 +46,6 @@
 #define OPT_STACK_CACHING            0
 
 /* misc */
-#define SUPPORT_JOKE                 0
+#define SUPPORT_JOKE                 1
 
 #endif /* RUBY_VM_OPTS_H */
patches/ruby/1.9.2/openssl3.patch000066400000003333147511530510012420 0ustar00diff --git a/ext/openssl/extconf.rb b/ext/openssl/extconf.rb
index 8c04cb5..132d803 100644
--- a/ext/openssl/extconf.rb
+++ b/ext/openssl/extconf.rb
@@ -104,6 +104,9 @@
 have_func("SSLv2_method")
 have_func("SSLv2_server_method")
 have_func("SSLv2_client_method")
+have_func("SSLv3_method")
+have_func("SSLv3_server_method")
+have_func("SSLv3_client_method")
 have_func("TLSv1_1_method")
 have_func("TLSv1_1_server_method")
 have_func("TLSv1_1_client_method")
diff --git a/ext/openssl/ossl_ssl.c b/ext/openssl/ossl_ssl.c
index f7cb7f0..47111f6 100644
--- a/ext/openssl/ossl_ssl.c
+++ b/ext/openssl/ossl_ssl.c
@@ -109,9 +109,12 @@ static const struct {
     OSSL_SSL_METHOD_ENTRY(SSLv2_server),
     OSSL_SSL_METHOD_ENTRY(SSLv2_client),
 #endif
+#if defined(HAVE_SSLV3_METHOD) && defined(HAVE_SSLV3_SERVER_METHOD) && \
+        defined(HAVE_SSLV3_CLIENT_METHOD)
     OSSL_SSL_METHOD_ENTRY(SSLv3),
     OSSL_SSL_METHOD_ENTRY(SSLv3_server),
     OSSL_SSL_METHOD_ENTRY(SSLv3_client),
+#endif
     OSSL_SSL_METHOD_ENTRY(SSLv23),
     OSSL_SSL_METHOD_ENTRY(SSLv23_server),
     OSSL_SSL_METHOD_ENTRY(SSLv23_client),
diff --git a/test/openssl/test_ssl.rb b/test/openssl/test_ssl.rb
index 07e081b..0cbfcba 100644
--- a/test/openssl/test_ssl.rb
+++ b/test/openssl/test_ssl.rb
@@ -912,7 +912,7 @@ def test_unset_OP_ALL
   # that has been marked as forbidden, therefore either of these may be raised
   HANDSHAKE_ERRORS = [OpenSSL::SSL::SSLError, Errno::ECONNRESET]

-if OpenSSL::SSL::SSLContext::METHODS.include? :TLSv1
+if OpenSSL::SSL::SSLContext::METHODS.include?(:TLSv1) && OpenSSL::SSL::SSLContext::METHODS.include?(:SSLv3)

   def test_forbid_ssl_v3_for_client
     ctx_proc = Proc.new { |ctx| ctx.options = OpenSSL::SSL::OP_ALL | OpenSSL::SSL::OP_NO_SSLv3 }
patches/ruby/1.9.2/head/r42282.patch000066400000002333147511530510012415 0ustar00From 2f086f0aa11d55fa2c03d4bd55bafff5bd51ed9a Mon Sep 17 00:00:00 2001
From: kazu <kazu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>
Date: Wed, 31 Jul 2013 13:01:57 +0000
Subject: [PATCH] parse.y: fix build error with bison-3.0

---
 parse.y | 9 ++++++---
 1 file changed, 6 insertions(+), 3 deletions(-)

diff --git a/parse.y b/parse.y
index 3f05fd5..f438920 100644
--- a/parse.y
+++ b/parse.y
@@ -277,8 +277,6 @@ struct parser_params {
 static int parser_yyerror(struct parser_params*, const char*);
 #define yyerror(msg) parser_yyerror(parser, (msg))
 
-#define YYLEX_PARAM parser
-
 #define lex_strterm		(parser->parser_lex_strterm)
 #define lex_state		(parser->parser_lex_state)
 #define cond_stack		(parser->parser_cond_stack)
@@ -319,7 +317,11 @@ static int parser_yyerror(struct parser_params*, const char*);
 #define ruby_coverage		(parser->coverage)
 #endif
 
+#if YYPURE
 static int yylex(void*, void*);
+#else
+static int yylex(void*);
+#endif
 
 #ifndef RIPPER
 #define yyparse ruby_yyparse
@@ -610,7 +612,8 @@ static void token_info_pop(struct parser_params*, const char *token);
 #endif
 %}
 
-%pure_parser
+%pure-parser
+%lex-param {struct parser_params *parser}
 %parse-param {struct parser_params *parser}
 
 %union {
-- 
1.8.4-fc

patches/ruby/2.1.4/openssl3.patch000066400000003333147511530510012413 0ustar00diff --git a/ext/openssl/extconf.rb b/ext/openssl/extconf.rb
index 8c04cb5..132d803 100644
--- a/ext/openssl/extconf.rb
+++ b/ext/openssl/extconf.rb
@@ -104,6 +104,9 @@
 have_func("SSLv2_method")
 have_func("SSLv2_server_method")
 have_func("SSLv2_client_method")
+have_func("SSLv3_method")
+have_func("SSLv3_server_method")
+have_func("SSLv3_client_method")
 have_func("TLSv1_1_method")
 have_func("TLSv1_1_server_method")
 have_func("TLSv1_1_client_method")
diff --git a/ext/openssl/ossl_ssl.c b/ext/openssl/ossl_ssl.c
index f7cb7f0..47111f6 100644
--- a/ext/openssl/ossl_ssl.c
+++ b/ext/openssl/ossl_ssl.c
@@ -109,9 +109,12 @@ static const struct {
     OSSL_SSL_METHOD_ENTRY(SSLv2_server),
     OSSL_SSL_METHOD_ENTRY(SSLv2_client),
 #endif
+#if defined(HAVE_SSLV3_METHOD) && defined(HAVE_SSLV3_SERVER_METHOD) && \
+        defined(HAVE_SSLV3_CLIENT_METHOD)
     OSSL_SSL_METHOD_ENTRY(SSLv3),
     OSSL_SSL_METHOD_ENTRY(SSLv3_server),
     OSSL_SSL_METHOD_ENTRY(SSLv3_client),
+#endif
     OSSL_SSL_METHOD_ENTRY(SSLv23),
     OSSL_SSL_METHOD_ENTRY(SSLv23_server),
     OSSL_SSL_METHOD_ENTRY(SSLv23_client),
diff --git a/test/openssl/test_ssl.rb b/test/openssl/test_ssl.rb
index 07e081b..0cbfcba 100644
--- a/test/openssl/test_ssl.rb
+++ b/test/openssl/test_ssl.rb
@@ -912,7 +912,7 @@ def test_unset_OP_ALL
   # that has been marked as forbidden, therefore either of these may be raised
   HANDSHAKE_ERRORS = [OpenSSL::SSL::SSLError, Errno::ECONNRESET]

-if OpenSSL::SSL::SSLContext::METHODS.include? :TLSv1
+if OpenSSL::SSL::SSLContext::METHODS.include?(:TLSv1) && OpenSSL::SSL::SSLContext::METHODS.include?(:SSLv3)

   def test_forbid_ssl_v3_for_client
     ctx_proc = Proc.new { |ctx| ctx.options = OpenSSL::SSL::OP_ALL | OpenSSL::SSL::OP_NO_SSLv3 }
patches/ruby/2.4.1/random_c_using_NR_prefix.patch000066400000001012147511530510015600 0ustar00--- a/random.c
+++ b/random.c
@@ -505,7 +505,7 @@
     CryptGenRandom(prov, size, seed);
     return 0;
 }
-#elif defined __linux__ && defined SYS_getrandom
+#elif defined __linux__ && defined __NR_getrandom
 #include <linux/random.h>
 
 # ifndef GRND_NONBLOCK
@@ -522,7 +522,7 @@
 	if (!need_secure)
 	    flags = GRND_NONBLOCK;
 	errno = 0;
-	ret = syscall(SYS_getrandom, seed, size, flags);
+	ret = syscall(__NR_getrandom, seed, size, flags);
 	if (errno == ENOSYS) {
 	    ATOMIC_SET(try_syscall, 0);
 	    return -1;
patches/ruby/2.2.9/fix_installing_bundled_gems.patch000066400000002214147511530510016372 0ustar00--- a/tool/rbinstall.rb
+++ b/tool/rbinstall.rb
@@ -719,15 +719,15 @@ install?(:ext, :comm, :gem) do
     directories = Gem.ensure_gem_subdirectories(gem_dir, :mode => $dir_mode)
     prepare "bundle gems", gem_dir, directories
     Dir.glob(srcdir+'/gems/*.gem').each do |gem|
-      Gem.install gem, Gem::Requirement.default, :install_dir => with_destdir(Gem.dir), :domain => :local, :ignore_dependencies => true
+      Gem.install gem, Gem::Requirement.default, :install_dir => with_destdir(gem_dir), :domain => :local, :ignore_dependencies => true
       gemname = Pathname(gem).basename
       puts "#{" "*30}#{gemname}"
     end
     # fix directory permissions
     # TODO: Gem.install should accept :dir_mode option or something
-    File.chmod($dir_mode, *Dir.glob(with_destdir(Gem.dir)+"/**/"))
+    File.chmod($dir_mode, *Dir.glob(with_destdir(gem_dir)+"/**/"))
     # fix .gemspec permissions
-    File.chmod($data_mode, *Dir.glob(with_destdir(Gem.dir)+"/specifications/*.gemspec"))
+    File.chmod($data_mode, *Dir.glob(with_destdir(gem_dir)+"/specifications/*.gemspec"))
   else
     puts "skip installing bundle gems because of lacking zlib"
   end
patches/ruby/2.3.4/random_c_using_NR_prefix.patch000066400000001011147511530510015601 0ustar00--- a/random.c
+++ b/random.c
@@ -521,7 +521,7 @@
     CryptGenRandom(prov, size, seed);
     return 0;
 }
-#elif defined __linux__ && defined SYS_getrandom
+#elif defined __linux__ && defined __NR_getrandom
 #include <linux/random.h>

 # ifndef GRND_NONBLOCK
@@ -538,7 +538,7 @@
 	if (!need_secure)
 	    flags = GRND_NONBLOCK;
 	errno = 0;
-	ret = syscall(SYS_getrandom, seed, size, flags);
+	ret = syscall(__NR_getrandom, seed, size, flags);
 	if (errno == ENOSYS) {
 	    ATOMIC_SET(try_syscall, 0);
 	    return -1;
patches/ruby/2.3.4/fix_rb_thread_fd_close.patch000066400000000403147511530510015300 0ustar00--- ruby_2_3/thread.c  2017/04/09 11:53:53 58288
+++ ruby_2_3/thread.c  2017/04/09 13:26:01 58289
@@ -2187,6 +2187,12 @@
     return busy;
 }

+void
+rb_thread_fd_close(int fd)
+{
+    while (rb_notify_fd_close(fd));
+}
+
 /*
  *  call-seq:
  *     thr.raise
patches/ruby/2.2.3/fix_installing_bundled_gems.patch000066400000002214147511530510016364 0ustar00--- a/tool/rbinstall.rb
+++ b/tool/rbinstall.rb
@@ -719,15 +719,15 @@ install?(:ext, :comm, :gem) do
     directories = Gem.ensure_gem_subdirectories(gem_dir, :mode => $dir_mode)
     prepare "bundle gems", gem_dir, directories
     Dir.glob(srcdir+'/gems/*.gem').each do |gem|
-      Gem.install gem, Gem::Requirement.default, :install_dir => with_destdir(Gem.dir), :domain => :local, :ignore_dependencies => true
+      Gem.install gem, Gem::Requirement.default, :install_dir => with_destdir(gem_dir), :domain => :local, :ignore_dependencies => true
       gemname = Pathname(gem).basename
       puts "#{" "*30}#{gemname}"
     end
     # fix directory permissions
     # TODO: Gem.install should accept :dir_mode option or something
-    File.chmod($dir_mode, *Dir.glob(with_destdir(Gem.dir)+"/**/"))
+    File.chmod($dir_mode, *Dir.glob(with_destdir(gem_dir)+"/**/"))
     # fix .gemspec permissions
-    File.chmod($data_mode, *Dir.glob(with_destdir(Gem.dir)+"/specifications/*.gemspec"))
+    File.chmod($data_mode, *Dir.glob(with_destdir(gem_dir)+"/specifications/*.gemspec"))
   else
     puts "skip installing bundle gems because of lacking zlib"
   end
patches/ruby/2.2.3/openssl3.patch000066400000003333147511530510012413 0ustar00diff --git a/ext/openssl/extconf.rb b/ext/openssl/extconf.rb
index 8c04cb5..132d803 100644
--- a/ext/openssl/extconf.rb
+++ b/ext/openssl/extconf.rb
@@ -104,6 +104,9 @@
 have_func("SSLv2_method")
 have_func("SSLv2_server_method")
 have_func("SSLv2_client_method")
+have_func("SSLv3_method")
+have_func("SSLv3_server_method")
+have_func("SSLv3_client_method")
 have_func("TLSv1_1_method")
 have_func("TLSv1_1_server_method")
 have_func("TLSv1_1_client_method")
diff --git a/ext/openssl/ossl_ssl.c b/ext/openssl/ossl_ssl.c
index f7cb7f0..47111f6 100644
--- a/ext/openssl/ossl_ssl.c
+++ b/ext/openssl/ossl_ssl.c
@@ -109,9 +109,12 @@ static const struct {
     OSSL_SSL_METHOD_ENTRY(SSLv2_server),
     OSSL_SSL_METHOD_ENTRY(SSLv2_client),
 #endif
+#if defined(HAVE_SSLV3_METHOD) && defined(HAVE_SSLV3_SERVER_METHOD) && \
+        defined(HAVE_SSLV3_CLIENT_METHOD)
     OSSL_SSL_METHOD_ENTRY(SSLv3),
     OSSL_SSL_METHOD_ENTRY(SSLv3_server),
     OSSL_SSL_METHOD_ENTRY(SSLv3_client),
+#endif
     OSSL_SSL_METHOD_ENTRY(SSLv23),
     OSSL_SSL_METHOD_ENTRY(SSLv23_server),
     OSSL_SSL_METHOD_ENTRY(SSLv23_client),
diff --git a/test/openssl/test_ssl.rb b/test/openssl/test_ssl.rb
index 07e081b..0cbfcba 100644
--- a/test/openssl/test_ssl.rb
+++ b/test/openssl/test_ssl.rb
@@ -912,7 +912,7 @@ def test_unset_OP_ALL
   # that has been marked as forbidden, therefore either of these may be raised
   HANDSHAKE_ERRORS = [OpenSSL::SSL::SSLError, Errno::ECONNRESET]

-if OpenSSL::SSL::SSLContext::METHODS.include? :TLSv1
+if OpenSSL::SSL::SSLContext::METHODS.include?(:TLSv1) && OpenSSL::SSL::SSLContext::METHODS.include?(:SSLv3)

   def test_forbid_ssl_v3_for_client
     ctx_proc = Proc.new { |ctx| ctx.options = OpenSSL::SSL::OP_ALL | OpenSSL::SSL::OP_NO_SSLv3 }
patches/ruby/2.1.0/openssl3.patch000066400000003333147511530510012407 0ustar00diff --git a/ext/openssl/extconf.rb b/ext/openssl/extconf.rb
index 8c04cb5..132d803 100644
--- a/ext/openssl/extconf.rb
+++ b/ext/openssl/extconf.rb
@@ -104,6 +104,9 @@
 have_func("SSLv2_method")
 have_func("SSLv2_server_method")
 have_func("SSLv2_client_method")
+have_func("SSLv3_method")
+have_func("SSLv3_server_method")
+have_func("SSLv3_client_method")
 have_func("TLSv1_1_method")
 have_func("TLSv1_1_server_method")
 have_func("TLSv1_1_client_method")
diff --git a/ext/openssl/ossl_ssl.c b/ext/openssl/ossl_ssl.c
index f7cb7f0..47111f6 100644
--- a/ext/openssl/ossl_ssl.c
+++ b/ext/openssl/ossl_ssl.c
@@ -109,9 +109,12 @@ static const struct {
     OSSL_SSL_METHOD_ENTRY(SSLv2_server),
     OSSL_SSL_METHOD_ENTRY(SSLv2_client),
 #endif
+#if defined(HAVE_SSLV3_METHOD) && defined(HAVE_SSLV3_SERVER_METHOD) && \
+        defined(HAVE_SSLV3_CLIENT_METHOD)
     OSSL_SSL_METHOD_ENTRY(SSLv3),
     OSSL_SSL_METHOD_ENTRY(SSLv3_server),
     OSSL_SSL_METHOD_ENTRY(SSLv3_client),
+#endif
     OSSL_SSL_METHOD_ENTRY(SSLv23),
     OSSL_SSL_METHOD_ENTRY(SSLv23_server),
     OSSL_SSL_METHOD_ENTRY(SSLv23_client),
diff --git a/test/openssl/test_ssl.rb b/test/openssl/test_ssl.rb
index 07e081b..0cbfcba 100644
--- a/test/openssl/test_ssl.rb
+++ b/test/openssl/test_ssl.rb
@@ -912,7 +912,7 @@ def test_unset_OP_ALL
   # that has been marked as forbidden, therefore either of these may be raised
   HANDSHAKE_ERRORS = [OpenSSL::SSL::SSLError, Errno::ECONNRESET]

-if OpenSSL::SSL::SSLContext::METHODS.include? :TLSv1
+if OpenSSL::SSL::SSLContext::METHODS.include?(:TLSv1) && OpenSSL::SSL::SSLContext::METHODS.include?(:SSLv3)

   def test_forbid_ssl_v3_for_client
     ctx_proc = Proc.new { |ctx| ctx.options = OpenSSL::SSL::OP_ALL | OpenSSL::SSL::OP_NO_SSLv3 }
patches/ruby/2.1.0/libyaml.patch000066400000055455147511530510012306 0ustar00diff -uw ruby-2.1.0/ext/psych/yaml/api.c ruby-2.1.2/ext/psych/yaml/api.c
--- ruby-2.1.0/ext/psych/yaml/api.c	2012-11-28 05:35:40.000000000 +0100
+++ ruby-2.1.2/ext/psych/yaml/api.c	2014-02-24 05:24:15.000000000 +0100
@@ -395,7 +395,7 @@
     }
     QUEUE_DEL(emitter, emitter->events);
     STACK_DEL(emitter, emitter->indents);
-    while (!STACK_EMPTY(empty, emitter->tag_directives)) {
+    while (!STACK_EMPTY(emitter, emitter->tag_directives)) {
         yaml_tag_directive_t tag_directive = POP(emitter, emitter->tag_directives);
         yaml_free(tag_directive.handle);
         yaml_free(tag_directive.prefix);
@@ -822,6 +822,7 @@
     yaml_char_t *anchor_copy = NULL;
     yaml_char_t *tag_copy = NULL;
     yaml_char_t *value_copy = NULL;
+    size_t value_length;
 
     assert(event);      /* Non-NULL event object is expected. */
     assert(value);      /* Non-NULL anchor is expected. */
@@ -839,16 +840,19 @@
     }
 
     if (length < 0) {
-        length = strlen((char *)value);
+        value_length = strlen((char *)value);
+    }
+    else {
+        value_length = (size_t)length;
     }
 
-    if (!yaml_check_utf8(value, length)) goto error;
-    value_copy = yaml_malloc(length+1);
+    if (!yaml_check_utf8(value, value_length)) goto error;
+    value_copy = yaml_malloc(value_length+1);
     if (!value_copy) goto error;
-    memcpy(value_copy, value, length);
-    value_copy[length] = '\0';
+    memcpy(value_copy, value, value_length);
+    value_copy[value_length] = '\0';
 
-    SCALAR_EVENT_INIT(*event, anchor_copy, tag_copy, value_copy, length,
+    SCALAR_EVENT_INIT(*event, anchor_copy, tag_copy, value_copy, value_length,
             plain_implicit, quoted_implicit, style, mark, mark);
 
     return 1;
@@ -1202,6 +1206,8 @@
     yaml_char_t *tag_copy = NULL;
     yaml_char_t *value_copy = NULL;
     yaml_node_t node;
+    size_t value_length;
+    ptrdiff_t ret;
 
     assert(document);   /* Non-NULL document object is expected. */
     assert(value);      /* Non-NULL value is expected. */
@@ -1215,19 +1221,26 @@
     if (!tag_copy) goto error;
 
     if (length < 0) {
-        length = strlen((char *)value);
+        value_length = strlen((char *)value);
+    }
+    else {
+        value_length = (size_t)length;
     }
 
-    if (!yaml_check_utf8(value, length)) goto error;
-    value_copy = yaml_malloc(length+1);
+    if (!yaml_check_utf8(value, value_length)) goto error;
+    value_copy = yaml_malloc(value_length+1);
     if (!value_copy) goto error;
-    memcpy(value_copy, value, length);
-    value_copy[length] = '\0';
+    memcpy(value_copy, value, value_length);
+    value_copy[value_length] = '\0';
 
-    SCALAR_NODE_INIT(node, tag_copy, value_copy, length, style, mark, mark);
+    SCALAR_NODE_INIT(node, tag_copy, value_copy, value_length, style, mark, mark);
     if (!PUSH(&context, document->nodes, node)) goto error;
 
-    return document->nodes.top - document->nodes.start;
+    ret = document->nodes.top - document->nodes.start;
+#if PTRDIFF_MAX > INT_MAX
+    if (ret > INT_MAX) goto error;
+#endif
+    return (int)ret;
 
 error:
     yaml_free(tag_copy);
@@ -1255,6 +1268,7 @@
         yaml_node_item_t *top;
     } items = { NULL, NULL, NULL };
     yaml_node_t node;
+    ptrdiff_t ret;
 
     assert(document);   /* Non-NULL document object is expected. */
 
@@ -1272,7 +1286,11 @@
             style, mark, mark);
     if (!PUSH(&context, document->nodes, node)) goto error;
 
-    return document->nodes.top - document->nodes.start;
+    ret = document->nodes.top - document->nodes.start;
+#if PTRDIFF_MAX > INT_MAX
+    if (ret > INT_MAX) goto error;
+#endif
+    return (int)ret;
 
 error:
     STACK_DEL(&context, items);
@@ -1300,6 +1318,7 @@
         yaml_node_pair_t *top;
     } pairs = { NULL, NULL, NULL };
     yaml_node_t node;
+    ptrdiff_t ret;
 
     assert(document);   /* Non-NULL document object is expected. */
 
@@ -1317,7 +1336,11 @@
             style, mark, mark);
     if (!PUSH(&context, document->nodes, node)) goto error;
 
-    return document->nodes.top - document->nodes.start;
+    ret = document->nodes.top - document->nodes.start;
+#if PTRDIFF_MAX > INT_MAX
+    if (ret > INT_MAX) goto error;
+#endif
+    return (int)ret;
 
 error:
     STACK_DEL(&context, pairs);
diff -uw ruby-2.1.0/ext/psych/yaml/config.h ruby-2.1.2/ext/psych/yaml/config.h
--- ruby-2.1.0/ext/psych/yaml/config.h	2012-12-01 04:58:39.000000000 +0100
+++ ruby-2.1.2/ext/psych/yaml/config.h	2014-05-04 17:45:33.000000000 +0200
@@ -1,11 +1,10 @@
-
 #define PACKAGE_NAME "yaml"
 #define PACKAGE_TARNAME "yaml"
-#define PACKAGE_VERSION "0.1.4"
-#define PACKAGE_STRING "yaml 0.1.4"
+#define PACKAGE_VERSION "0.1.6"
+#define PACKAGE_STRING "yaml 0.1.6"
 #define PACKAGE_BUGREPORT "http://pyyaml.org/newticket?component libyaml"
 #define PACKAGE_URL ""
 #define YAML_VERSION_MAJOR 0
 #define YAML_VERSION_MINOR 1
-#define YAML_VERSION_PATCH 4
-#define YAML_VERSION_STRING "0.1.4"
+#define YAML_VERSION_PATCH 6
+#define YAML_VERSION_STRING "0.1.6"
diff -uw ruby-2.1.0/ext/psych/yaml/emitter.c ruby-2.1.2/ext/psych/yaml/emitter.c
--- ruby-2.1.0/ext/psych/yaml/emitter.c	2013-12-14 02:19:06.000000000 +0100
+++ ruby-2.1.2/ext/psych/yaml/emitter.c	2014-02-24 05:24:15.000000000 +0100
@@ -53,7 +53,7 @@
 #define WRITE_BREAK(emitter,string)                                             \
     (FLUSH(emitter)                                                             \
      && (CHECK(string,'\n') ?                                                   \
-         (PUT_BREAK(emitter),                                                   \
+         ((void)PUT_BREAK(emitter),                                             \
           string.pointer ++,                                                    \
           1) :                                                                  \
          (COPY(emitter->buffer,string),                                         \
@@ -1493,7 +1493,7 @@
     int break_space = 0;
     int space_break = 0;
 
-    int preceded_by_whitespace = 0;
+    int preceeded_by_whitespace = 0;
     int followed_by_whitespace = 0;
     int previous_space = 0;
     int previous_break = 0;
@@ -1524,7 +1524,7 @@
         flow_indicators = 1;
     }
 
-    preceded_by_whitespace = 1;
+    preceeded_by_whitespace = 1;
     followed_by_whitespace = IS_BLANKZ_AT(string, WIDTH(string));
 
     while (string.pointer != string.end)
@@ -1570,7 +1570,7 @@
                 }
             }
 
-            if (CHECK(string, '#') && preceded_by_whitespace) {
+            if (CHECK(string, '#') && preceeded_by_whitespace) {
                 flow_indicators = 1;
                 block_indicators = 1;
             }
@@ -1619,7 +1619,7 @@
             previous_break = 0;
         }
 
-        preceded_by_whitespace = IS_BLANKZ(string);
+        preceeded_by_whitespace = IS_BLANKZ(string);
         MOVE(string);
         if (string.pointer != string.end) {
             followed_by_whitespace = IS_BLANKZ_AT(string, WIDTH(string));
diff -uw ruby-2.1.0/ext/psych/yaml/loader.c ruby-2.1.2/ext/psych/yaml/loader.c
--- ruby-2.1.0/ext/psych/yaml/loader.c	2012-11-28 05:35:40.000000000 +0100
+++ ruby-2.1.2/ext/psych/yaml/loader.c	2014-02-24 05:24:15.000000000 +0100
@@ -283,9 +283,12 @@
 yaml_parser_load_scalar(yaml_parser_t *parser, yaml_event_t *first_event)
 {
     yaml_node_t node;
+    ptrdiff_t node_index;
     int index;
     yaml_char_t *tag = first_event->data.scalar.tag;
 
+    if (!STACK_LIMIT(parser, parser->document->nodes, INT_MAX-1)) goto error;
+
     if (!tag || strcmp((char *)tag, "!") == 0) {
         yaml_free(tag);
         tag = yaml_strdup((yaml_char_t *)YAML_DEFAULT_SCALAR_TAG);
@@ -298,7 +301,11 @@
 
     if (!PUSH(parser, parser->document->nodes, node)) goto error;
 
-    index = parser->document->nodes.top - parser->document->nodes.start;
+    node_index = parser->document->nodes.top - parser->document->nodes.start;
+#if PTRDIFF_MAX > INT_MAX
+    if (node_index > INT_MAX) goto error;
+#endif
+    index = (int)node_index;
 
     if (!yaml_parser_register_anchor(parser, index,
                 first_event->data.scalar.anchor)) return 0;
@@ -327,8 +334,11 @@
         yaml_node_item_t *top;
     } items = { NULL, NULL, NULL };
     int index, item_index;
+    ptrdiff_t node_index;
     yaml_char_t *tag = first_event->data.sequence_start.tag;
 
+    if (!STACK_LIMIT(parser, parser->document->nodes, INT_MAX-1)) goto error;
+
     if (!tag || strcmp((char *)tag, "!") == 0) {
         yaml_free(tag);
         tag = yaml_strdup((yaml_char_t *)YAML_DEFAULT_SEQUENCE_TAG);
@@ -343,7 +353,11 @@
 
     if (!PUSH(parser, parser->document->nodes, node)) goto error;
 
-    index = parser->document->nodes.top - parser->document->nodes.start;
+    node_index = parser->document->nodes.top - parser->document->nodes.start;
+#if PTRDIFF_MAX > INT_MAX
+    if (node_index > INT_MAX) goto error;
+#endif
+    index = (int)node_index;
 
     if (!yaml_parser_register_anchor(parser, index,
                 first_event->data.sequence_start.anchor)) return 0;
@@ -351,6 +365,9 @@
     if (!yaml_parser_parse(parser, &event)) return 0;
 
     while (event.type != YAML_SEQUENCE_END_EVENT) {
+        if (!STACK_LIMIT(parser,
+                    parser->document->nodes.start[index-1].data.sequence.items,
+                    INT_MAX-1)) return 0;
         item_index = yaml_parser_load_node(parser, &event);
         if (!item_index) return 0;
         if (!PUSH(parser,
@@ -384,9 +401,12 @@
         yaml_node_pair_t *top;
     } pairs = { NULL, NULL, NULL };
     int index;
+    ptrdiff_t node_index;
     yaml_node_pair_t pair;
     yaml_char_t *tag = first_event->data.mapping_start.tag;
 
+    if (!STACK_LIMIT(parser, parser->document->nodes, INT_MAX-1)) goto error;
+
     if (!tag || strcmp((char *)tag, "!") == 0) {
         yaml_free(tag);
         tag = yaml_strdup((yaml_char_t *)YAML_DEFAULT_MAPPING_TAG);
@@ -401,7 +421,11 @@
 
     if (!PUSH(parser, parser->document->nodes, node)) goto error;
 
-    index = parser->document->nodes.top - parser->document->nodes.start;
+    node_index = parser->document->nodes.top - parser->document->nodes.start;
+#if PTRDIFF_MAX > INT_MAX
+    if (node_index > INT_MAX) goto error;
+#endif
+    index = (int)node_index;
 
     if (!yaml_parser_register_anchor(parser, index,
                 first_event->data.mapping_start.anchor)) return 0;
@@ -409,6 +433,9 @@
     if (!yaml_parser_parse(parser, &event)) return 0;
 
     while (event.type != YAML_MAPPING_END_EVENT) {
+        if (!STACK_LIMIT(parser,
+                    parser->document->nodes.start[index-1].data.mapping.pairs,
+                    INT_MAX-1)) return 0;
         pair.key = yaml_parser_load_node(parser, &event);
         if (!pair.key) return 0;
         if (!yaml_parser_parse(parser, &event)) return 0;
diff -uw ruby-2.1.0/ext/psych/yaml/parser.c ruby-2.1.2/ext/psych/yaml/parser.c
--- ruby-2.1.0/ext/psych/yaml/parser.c	2012-12-05 05:08:17.000000000 +0100
+++ ruby-2.1.2/ext/psych/yaml/parser.c	2014-02-24 05:24:15.000000000 +0100
@@ -759,9 +759,8 @@
 
     else if (token->type == YAML_BLOCK_END_TOKEN)
     {
-        yaml_mark_t dummy_mark;     /* Used to eliminate a compiler warning. */
         parser->state = POP(parser, parser->states);
-        dummy_mark = POP(parser, parser->marks);
+        (void)POP(parser, parser->marks);
         SEQUENCE_END_EVENT_INIT(*event, token->start_mark, token->end_mark);
         SKIP_TOKEN(parser);
         return 1;
@@ -869,9 +868,8 @@
 
     else if (token->type == YAML_BLOCK_END_TOKEN)
     {
-        yaml_mark_t dummy_mark;     /* Used to eliminate a compiler warning. */
         parser->state = POP(parser, parser->states);
-        dummy_mark = POP(parser, parser->marks);
+        (void)POP(parser, parser->marks);
         MAPPING_END_EVENT_INIT(*event, token->start_mark, token->end_mark);
         SKIP_TOKEN(parser);
         return 1;
@@ -952,7 +950,6 @@
         yaml_event_t *event, int first)
 {
     yaml_token_t *token;
-    yaml_mark_t dummy_mark;     /* Used to eliminate a compiler warning. */
 
     if (first) {
         token = PEEK_TOKEN(parser);
@@ -997,7 +994,7 @@
     }
 
     parser->state = POP(parser, parser->states);
-    dummy_mark = POP(parser, parser->marks);
+    (void)POP(parser, parser->marks);
     SEQUENCE_END_EVENT_INIT(*event, token->start_mark, token->end_mark);
     SKIP_TOKEN(parser);
     return 1;
@@ -1104,7 +1101,6 @@
         yaml_event_t *event, int first)
 {
     yaml_token_t *token;
-    yaml_mark_t dummy_mark;     /* Used to eliminate a compiler warning. */
 
     if (first) {
         token = PEEK_TOKEN(parser);
@@ -1158,7 +1154,7 @@
     }
 
     parser->state = POP(parser, parser->states);
-    dummy_mark = POP(parser, parser->marks);
+    (void)POP(parser, parser->marks);
     MAPPING_END_EVENT_INIT(*event, token->start_mark, token->end_mark);
     SKIP_TOKEN(parser);
     return 1;
diff -uw ruby-2.1.0/ext/psych/yaml/reader.c ruby-2.1.2/ext/psych/yaml/reader.c
--- ruby-2.1.0/ext/psych/yaml/reader.c	2012-12-05 05:08:17.000000000 +0100
+++ ruby-2.1.2/ext/psych/yaml/reader.c	2014-02-24 05:24:15.000000000 +0100
@@ -460,6 +460,10 @@
 
     }
 
+    if (parser->offset >= PTRDIFF_MAX)
+        return yaml_parser_set_reader_error(parser, "input is too long",
+                PTRDIFF_MAX, -1);
+
     return 1;
 }
 
diff -uw ruby-2.1.0/ext/psych/yaml/scanner.c ruby-2.1.2/ext/psych/yaml/scanner.c
--- ruby-2.1.0/ext/psych/yaml/scanner.c	2013-01-13 08:47:10.000000000 +0100
+++ ruby-2.1.2/ext/psych/yaml/scanner.c	2014-05-04 17:45:33.000000000 +0200
@@ -615,11 +615,11 @@
  */
 
 static int
-yaml_parser_roll_indent(yaml_parser_t *parser, int column,
-        int number, yaml_token_type_t type, yaml_mark_t mark);
+yaml_parser_roll_indent(yaml_parser_t *parser, ptrdiff_t column,
+        ptrdiff_t number, yaml_token_type_t type, yaml_mark_t mark);
 
 static int
-yaml_parser_unroll_indent(yaml_parser_t *parser, int column);
+yaml_parser_unroll_indent(yaml_parser_t *parser, ptrdiff_t column);
 
 /*
  * Token fetchers.
@@ -1103,7 +1103,7 @@
      */
 
     int required = (!parser->flow_level
-            && parser->indent == (int)parser->mark.column);
+            && parser->indent == (ptrdiff_t)parser->mark.column);
 
     /*
      * A simple key is required only when it is the first token in the current
@@ -1176,6 +1176,11 @@
 
     /* Increase the flow level. */
 
+    if (parser->flow_level == INT_MAX) {
+        parser->error = YAML_MEMORY_ERROR;
+        return 0;
+    }
+
     parser->flow_level++;
 
     return 1;
@@ -1188,11 +1193,9 @@
 static int
 yaml_parser_decrease_flow_level(yaml_parser_t *parser)
 {
-    yaml_simple_key_t dummy_key;    /* Used to eliminate a compiler warning. */
-
     if (parser->flow_level) {
         parser->flow_level --;
-        dummy_key = POP(parser, parser->simple_keys);
+        (void)POP(parser, parser->simple_keys);
     }
 
     return 1;
@@ -1206,8 +1209,8 @@
  */
 
 static int
-yaml_parser_roll_indent(yaml_parser_t *parser, int column,
-        int number, yaml_token_type_t type, yaml_mark_t mark)
+yaml_parser_roll_indent(yaml_parser_t *parser, ptrdiff_t column,
+        ptrdiff_t number, yaml_token_type_t type, yaml_mark_t mark)
 {
     yaml_token_t token;
 
@@ -1226,7 +1229,14 @@
         if (!PUSH(parser, parser->indents, parser->indent))
             return 0;
 
-        parser->indent = column;
+#if PTRDIFF_MAX > INT_MAX
+        if (column > INT_MAX) {
+            parser->error = YAML_MEMORY_ERROR;
+            return 0;
+        }
+#endif
+
+        parser->indent = (int)column;
 
         /* Create a token and insert it into the queue. */
 
@@ -1248,13 +1258,13 @@
 
 /*
  * Pop indentation levels from the indents stack until the current level
- * becomes less or equal to the column.  For each indentation level, append
+ * becomes less or equal to the column.  For each intendation level, append
  * the BLOCK-END token.
  */
 
 
 static int
-yaml_parser_unroll_indent(yaml_parser_t *parser, int column)
+yaml_parser_unroll_indent(yaml_parser_t *parser, ptrdiff_t column)
 {
     yaml_token_t token;
 
@@ -1263,7 +1273,7 @@
     if (parser->flow_level)
         return 1;
 
-    /* Loop through the indentation levels in the stack. */
+    /* Loop through the intendation levels in the stack. */
 
     while (parser->indent > column)
     {
@@ -2574,7 +2584,7 @@
 
     /* Resize the string to include the head. */
 
-    while (string.end - string.start <= (int)length) {
+    while ((size_t)(string.end - string.start) <= length) {
         if (!yaml_string_extend(&string.start, &string.pointer, &string.end)) {
             parser->error = YAML_MEMORY_ERROR;
             goto error;
@@ -2619,6 +2629,9 @@
         /* Check if it is a URI-escape sequence. */
 
         if (CHECK(parser->buffer, '%')) {
+            if (!STRING_EXTEND(parser, string))
+                goto error;
+
             if (!yaml_parser_scan_uri_escapes(parser,
                         directive, start_mark, &string)) goto error;
         }
@@ -2769,15 +2782,15 @@
 
         if (IS_DIGIT(parser->buffer))
         {
-            /* Check that the indentation is greater than 0. */
+            /* Check that the intendation is greater than 0. */
 
             if (CHECK(parser->buffer, '0')) {
                 yaml_parser_set_scanner_error(parser, "while scanning a block scalar",
-                        start_mark, "found an indentation indicator equal to 0");
+                        start_mark, "found an intendation indicator equal to 0");
                 goto error;
             }
 
-            /* Get the indentation level and eat the indicator. */
+            /* Get the intendation level and eat the indicator. */
 
             increment = AS_DIGIT(parser->buffer);
 
@@ -2791,7 +2804,7 @@
     {
         if (CHECK(parser->buffer, '0')) {
             yaml_parser_set_scanner_error(parser, "while scanning a block scalar",
-                    start_mark, "found an indentation indicator equal to 0");
+                    start_mark, "found an intendation indicator equal to 0");
             goto error;
         }
 
@@ -2841,7 +2854,7 @@
 
     end_mark = parser->mark;
 
-    /* Set the indentation level if it was specified. */
+    /* Set the intendation level if it was specified. */
 
     if (increment) {
         indent = parser->indent >= 0 ? parser->indent+increment : increment;
@@ -2907,7 +2920,7 @@
 
         if (!READ_LINE(parser, leading_break)) goto error;
 
-        /* Eat the following indentation spaces and line breaks. */
+        /* Eat the following intendation spaces and line breaks. */
 
         if (!yaml_parser_scan_block_scalar_breaks(parser,
                     &indent, &trailing_breaks, start_mark, &end_mark)) goto error;
@@ -2942,8 +2955,8 @@
 }
 
 /*
- * Scan indentation spaces and line breaks for a block scalar.  Determine the
- * indentation level if needed.
+ * Scan intendation spaces and line breaks for a block scalar.  Determine the
+ * intendation level if needed.
  */
 
 static int
@@ -2955,11 +2968,11 @@
 
     *end_mark = parser->mark;
 
-    /* Eat the indentation spaces and line breaks. */
+    /* Eat the intendation spaces and line breaks. */
 
     while (1)
     {
-        /* Eat the indentation spaces. */
+        /* Eat the intendation spaces. */
 
         if (!CACHE(parser, 1)) return 0;
 
@@ -2972,12 +2985,12 @@
         if ((int)parser->mark.column > max_indent)
             max_indent = (int)parser->mark.column;
 
-        /* Check for a tab character messing the indentation. */
+        /* Check for a tab character messing the intendation. */
 
         if ((!*indent || (int)parser->mark.column < *indent)
                 && IS_TAB(parser->buffer)) {
             return yaml_parser_set_scanner_error(parser, "while scanning a block scalar",
-                    start_mark, "found a tab character where an indentation space is expected");
+                    start_mark, "found a tab character where an intendation space is expected");
         }
 
         /* Have we found a non-empty line? */
@@ -3498,12 +3511,12 @@
         {
             if (IS_BLANK(parser->buffer))
             {
-                /* Check for tab character that abuse indentation. */
+                /* Check for tab character that abuse intendation. */
 
                 if (leading_blanks && (int)parser->mark.column < indent
                         && IS_TAB(parser->buffer)) {
                     yaml_parser_set_scanner_error(parser, "while scanning a plain scalar",
-                            start_mark, "found a tab character that violates indentation");
+                            start_mark, "found a tab character that violate intendation");
                     goto error;
                 }
 
@@ -3536,7 +3549,7 @@
             if (!CACHE(parser, 1)) goto error;
         }
 
-        /* Check indentation level. */
+        /* Check intendation level. */
 
         if (!parser->flow_level && (int)parser->mark.column < indent)
             break;
diff -uw ruby-2.1.0/ext/psych/yaml/yaml_private.h ruby-2.1.2/ext/psych/yaml/yaml_private.h
--- ruby-2.1.0/ext/psych/yaml/yaml_private.h	2012-12-05 05:08:17.000000000 +0100
+++ ruby-2.1.2/ext/psych/yaml/yaml_private.h	2014-05-04 17:45:33.000000000 +0200
@@ -10,6 +10,17 @@
 
 #include <assert.h>
 #include <limits.h>
+#include <stddef.h>
+
+#ifndef _MSC_VER
+#include <stdint.h>
+#else
+#ifdef _WIN64
+#define PTRDIFF_MAX _I64_MAX
+#else
+#define PTRDIFF_MAX INT_MAX
+#endif
+#endif
 
 /*
  * Memory management.
@@ -135,9 +146,12 @@
      (string).start = (string).pointer = (string).end = 0)
 
 #define STRING_EXTEND(context,string)                                           \
-    (((string).pointer+5 < (string).end)                                        \
+    ((((string).pointer+5 < (string).end)                                       \
         || yaml_string_extend(&(string).start,                                  \
-            &(string).pointer, &(string).end))
+            &(string).pointer, &(string).end)) ?                                \
+         1 :                                                                    \
+        ((context)->error = YAML_MEMORY_ERROR,                                  \
+         0))
 
 #define CLEAR(context,string)                                                   \
     ((string).pointer = (string).start,                                         \
@@ -422,7 +436,14 @@
      (stack).start = (stack).top = (stack).end = 0)
 
 #define STACK_EMPTY(context,stack)                                              \
-    ((stack).start == (stack).top)
+    ((void)(context),                                                           \
+     ((stack).start == (stack).top))
+
+#define STACK_LIMIT(context,stack,size)                                         \
+    ((stack).top - (stack).start < (size) ?                                     \
+        1 :                                                                     \
+        ((context)->error = YAML_MEMORY_ERROR,                                  \
+         0))
 
 #define PUSH(context,stack,value)                                               \
     (((stack).top != (stack).end                                                \
patches/ruby/2.1.0/changeset_r44327.diff000066400000002264147511530510013342 0ustar00--- a/gc.c	(revision 44326)
+++ b/gc.c	(revision 44327)
@@ -5724,17 +5724,19 @@
     if (safe_level > 0) return;
 
     /* RUBY_GC_HEAP_FREE_SLOTS */
-    if (get_envparam_int   ("RUBY_FREE_MIN", &gc_params.heap_free_slots, 0)) {
+    if (get_envparam_int("RUBY_GC_HEAP_FREE_SLOTS", &gc_params.heap_free_slots, 0)) {
+	/* ok */
+    }
+    else if (get_envparam_int("RUBY_FREE_MIN", &gc_params.heap_free_slots, 0)) {
 	rb_warn("RUBY_FREE_MIN is obsolete. Use RUBY_GC_HEAP_FREE_SLOTS instead.");
     }
-    get_envparam_int   ("RUBY_GC_HEAP_FREE_SLOTS", &gc_params.heap_free_slots, 0);
 
     /* RUBY_GC_HEAP_INIT_SLOTS */
-    if (get_envparam_int("RUBY_HEAP_MIN_SLOTS", &gc_params.heap_init_slots, 0)) {
-	rb_warn("RUBY_HEAP_MIN_SLOTS is obsolete. Use RUBY_GC_HEAP_INIT_SLOTS instead.");
+    if (get_envparam_int("RUBY_GC_HEAP_INIT_SLOTS", &gc_params.heap_init_slots, 0)) {
 	gc_set_initial_pages();
     }
-    if (get_envparam_int("RUBY_GC_HEAP_INIT_SLOTS", &gc_params.heap_init_slots, 0)) {
+    else if (get_envparam_int("RUBY_HEAP_MIN_SLOTS", &gc_params.heap_init_slots, 0)) {
+	rb_warn("RUBY_HEAP_MIN_SLOTS is obsolete. Use RUBY_GC_HEAP_INIT_SLOTS instead.");
 	gc_set_initial_pages();
     }
 
patches/ruby/2.1/openssl3.patch000066400000003333147511530510012251 0ustar00diff --git a/ext/openssl/extconf.rb b/ext/openssl/extconf.rb
index 8c04cb5..132d803 100644
--- a/ext/openssl/extconf.rb
+++ b/ext/openssl/extconf.rb
@@ -104,6 +104,9 @@
 have_func("SSLv2_method")
 have_func("SSLv2_server_method")
 have_func("SSLv2_client_method")
+have_func("SSLv3_method")
+have_func("SSLv3_server_method")
+have_func("SSLv3_client_method")
 have_func("TLSv1_1_method")
 have_func("TLSv1_1_server_method")
 have_func("TLSv1_1_client_method")
diff --git a/ext/openssl/ossl_ssl.c b/ext/openssl/ossl_ssl.c
index f7cb7f0..47111f6 100644
--- a/ext/openssl/ossl_ssl.c
+++ b/ext/openssl/ossl_ssl.c
@@ -109,9 +109,12 @@ static const struct {
     OSSL_SSL_METHOD_ENTRY(SSLv2_server),
     OSSL_SSL_METHOD_ENTRY(SSLv2_client),
 #endif
+#if defined(HAVE_SSLV3_METHOD) && defined(HAVE_SSLV3_SERVER_METHOD) && \
+        defined(HAVE_SSLV3_CLIENT_METHOD)
     OSSL_SSL_METHOD_ENTRY(SSLv3),
     OSSL_SSL_METHOD_ENTRY(SSLv3_server),
     OSSL_SSL_METHOD_ENTRY(SSLv3_client),
+#endif
     OSSL_SSL_METHOD_ENTRY(SSLv23),
     OSSL_SSL_METHOD_ENTRY(SSLv23_server),
     OSSL_SSL_METHOD_ENTRY(SSLv23_client),
diff --git a/test/openssl/test_ssl.rb b/test/openssl/test_ssl.rb
index 07e081b..0cbfcba 100644
--- a/test/openssl/test_ssl.rb
+++ b/test/openssl/test_ssl.rb
@@ -912,7 +912,7 @@ def test_unset_OP_ALL
   # that has been marked as forbidden, therefore either of these may be raised
   HANDSHAKE_ERRORS = [OpenSSL::SSL::SSLError, Errno::ECONNRESET]

-if OpenSSL::SSL::SSLContext::METHODS.include? :TLSv1
+if OpenSSL::SSL::SSLContext::METHODS.include?(:TLSv1) && OpenSSL::SSL::SSLContext::METHODS.include?(:SSLv3)

   def test_forbid_ssl_v3_for_client
     ctx_proc = Proc.new { |ctx| ctx.options = OpenSSL::SSL::OP_ALL | OpenSSL::SSL::OP_NO_SSLv3 }
patches/ruby/ruby_2_3_gcc7.patch000066400000005313147511530510012532 0ustar00diff --git a/include/ruby/ruby.h b/include/ruby/ruby.h
index 60cfb1174e..dccfdc763a 100644
--- a/include/ruby/ruby.h
+++ b/include/ruby/ruby.h
@@ -551,27 +551,23 @@ static inline int rb_type(VALUE obj);
 	((type) == RUBY_T_FLOAT) ? RB_FLOAT_TYPE_P(obj) : \
 	(!RB_SPECIAL_CONST_P(obj) && RB_BUILTIN_TYPE(obj) == (type)))
 
-/* RB_GC_GUARD_PTR() is an intermediate macro, and has no effect by
- * itself.  don't use it directly */
 #ifdef __GNUC__
-#define RB_GC_GUARD_PTR(ptr) \
-    __extension__ ({volatile VALUE *rb_gc_guarded_ptr = (ptr); rb_gc_guarded_ptr;})
-#else
-#ifdef _MSC_VER
+#define RB_GC_GUARD(v) \
+    (*__extension__ ({ \
+	volatile VALUE *rb_gc_guarded_ptr = &(v); \
+	__asm__("" : : "m"(rb_gc_guarded_ptr)); \
+	rb_gc_guarded_ptr; \
+    }))
+#elif defined _MSC_VER
 #pragma optimize("", off)
 static inline volatile VALUE *rb_gc_guarded_ptr(volatile VALUE *ptr) {return ptr;}
 #pragma optimize("", on)
+#define RB_GC_GUARD(v) (*rb_gc_guarded_ptr(&(v)))
 #else
 volatile VALUE *rb_gc_guarded_ptr_val(volatile VALUE *ptr, VALUE val);
 #define HAVE_RB_GC_GUARDED_PTR_VAL 1
 #define RB_GC_GUARD(v) (*rb_gc_guarded_ptr_val(&(v),(v)))
 #endif
-#define RB_GC_GUARD_PTR(ptr) rb_gc_guarded_ptr(ptr)
-#endif
-
-#ifndef RB_GC_GUARD
-#define RB_GC_GUARD(v) (*RB_GC_GUARD_PTR(&(v)))
-#endif
 
 #ifdef __GNUC__
 #define RB_UNUSED_VAR(x) x __attribute__ ((unused))
diff --git a/marshal.c b/marshal.c
index c56de4af8d..b7274bf3c4 100644
--- a/marshal.c
+++ b/marshal.c
@@ -1022,7 +1022,7 @@ VALUE
 rb_marshal_dump_limited(VALUE obj, VALUE port, int limit)
 {
     struct dump_arg *arg;
-    VALUE wrapper; /* used to avoid memory leak in case of exception */
+    volatile VALUE wrapper; /* used to avoid memory leak in case of exception */
 
     wrapper = TypedData_Make_Struct(rb_cData, struct dump_arg, &dump_arg_data, arg);
     arg->dest = 0;
@@ -1051,8 +1051,8 @@ rb_marshal_dump_limited(VALUE obj, VALUE port, int limit)
 	rb_io_write(arg->dest, arg->str);
 	rb_str_resize(arg->str, 0);
     }
-    clear_dump_arg(arg);
-    RB_GC_GUARD(wrapper);
+    free_dump_arg(arg);
+    rb_gc_force_recycle(wrapper);
 
     return port;
 }
@@ -2044,7 +2044,7 @@ rb_marshal_load_with_proc(VALUE port, VALUE proc)
 {
     int major, minor, infection = 0;
     VALUE v;
-    VALUE wrapper; /* used to avoid memory leak in case of exception */
+    volatile VALUE wrapper; /* used to avoid memory leak in case of exception */
     struct load_arg *arg;
 
     v = rb_check_string_type(port);
@@ -2090,8 +2090,8 @@ rb_marshal_load_with_proc(VALUE port, VALUE proc)
 
     if (!NIL_P(proc)) arg->proc = proc;
     v = r_object(arg);
-    clear_load_arg(arg);
-    RB_GC_GUARD(wrapper);
+    free_load_arg(arg);
+    rb_gc_force_recycle(wrapper);
 
     return v;
 }
patches/ruby/2.1.7/openssl3.patch000066400000003333147511530510012416 0ustar00diff --git a/ext/openssl/extconf.rb b/ext/openssl/extconf.rb
index 8c04cb5..132d803 100644
--- a/ext/openssl/extconf.rb
+++ b/ext/openssl/extconf.rb
@@ -104,6 +104,9 @@
 have_func("SSLv2_method")
 have_func("SSLv2_server_method")
 have_func("SSLv2_client_method")
+have_func("SSLv3_method")
+have_func("SSLv3_server_method")
+have_func("SSLv3_client_method")
 have_func("TLSv1_1_method")
 have_func("TLSv1_1_server_method")
 have_func("TLSv1_1_client_method")
diff --git a/ext/openssl/ossl_ssl.c b/ext/openssl/ossl_ssl.c
index f7cb7f0..47111f6 100644
--- a/ext/openssl/ossl_ssl.c
+++ b/ext/openssl/ossl_ssl.c
@@ -109,9 +109,12 @@ static const struct {
     OSSL_SSL_METHOD_ENTRY(SSLv2_server),
     OSSL_SSL_METHOD_ENTRY(SSLv2_client),
 #endif
+#if defined(HAVE_SSLV3_METHOD) && defined(HAVE_SSLV3_SERVER_METHOD) && \
+        defined(HAVE_SSLV3_CLIENT_METHOD)
     OSSL_SSL_METHOD_ENTRY(SSLv3),
     OSSL_SSL_METHOD_ENTRY(SSLv3_server),
     OSSL_SSL_METHOD_ENTRY(SSLv3_client),
+#endif
     OSSL_SSL_METHOD_ENTRY(SSLv23),
     OSSL_SSL_METHOD_ENTRY(SSLv23_server),
     OSSL_SSL_METHOD_ENTRY(SSLv23_client),
diff --git a/test/openssl/test_ssl.rb b/test/openssl/test_ssl.rb
index 07e081b..0cbfcba 100644
--- a/test/openssl/test_ssl.rb
+++ b/test/openssl/test_ssl.rb
@@ -912,7 +912,7 @@ def test_unset_OP_ALL
   # that has been marked as forbidden, therefore either of these may be raised
   HANDSHAKE_ERRORS = [OpenSSL::SSL::SSLError, Errno::ECONNRESET]

-if OpenSSL::SSL::SSLContext::METHODS.include? :TLSv1
+if OpenSSL::SSL::SSLContext::METHODS.include?(:TLSv1) && OpenSSL::SSL::SSLContext::METHODS.include?(:SSLv3)

   def test_forbid_ssl_v3_for_client
     ctx_proc = Proc.new { |ctx| ctx.options = OpenSSL::SSL::OP_ALL | OpenSSL::SSL::OP_NO_SSLv3 }
patches/ruby/1.9.1/osx-arch-fix.patch000066400000000617147511530510013163 0ustar00diff --git a/Makefile.in b/Makefile.in
index 656ae90..f976cf1 100644
--- a/Makefile.in
+++ b/Makefile.in
@@ -45,7 +45,7 @@ XLDFLAGS = @XLDFLAGS@ $(EXTLDFLAGS)
 EXTLIBS = 
 LIBS = @LIBS@ $(EXTLIBS)
 MISSING = @LIBOBJS@ @ALLOCA@
-LDSHARED = @LIBRUBY_LDSHARED@
+LDSHARED = @LIBRUBY_LDSHARED@ $(LDFLAGS)
 DLDFLAGS = @LIBRUBY_DLDFLAGS@ $(EXTLDFLAGS) @ARCH_FLAG@
 SOLIBS = @SOLIBS@
 MAINLIBS = @MAINLIBS@
patches/ruby/1.9.1/railsbench.patch000066400000044775147511530510013002 0ustar00diff --git a/a/gc.c b/b/gc.c
index bcdc9af..b380842 100644
--- a/a/gc.c
+++ b/b/gc.c
@@ -23,8 +23,16 @@
 #include <setjmp.h>
 #include <sys/types.h>
 
+#ifdef _WIN32
+#include <string.h>
+#else
+#include <strings.h>
+#endif
+
 #ifdef HAVE_SYS_TIME_H
 #include <sys/time.h>
+#elif defined(_WIN32)
+#include <time.h> 
 #endif
 
 #ifdef HAVE_SYS_RESOURCE_H
@@ -211,11 +219,11 @@ getrusage_time(void)
 	if (objspace->profile.run) {\
 	    size_t count = objspace->profile.count;\
 	    objspace->profile.record[count].heap_use_slots = heaps_used;\
-	    objspace->profile.record[count].heap_live_objects = live;\
+	    objspace->profile.record[count].heap_live_objects = live_objects;\
 	    objspace->profile.record[count].heap_free_objects = freed;\
 	    objspace->profile.record[count].heap_total_objects = heaps_used * HEAP_OBJ_LIMIT;\
 	    objspace->profile.record[count].have_finalize = final_list ? Qtrue : Qfalse;\
-	    objspace->profile.record[count].heap_use_size = live * sizeof(RVALUE);\
+	    objspace->profile.record[count].heap_use_size = live_objects * sizeof(RVALUE);\
 	    objspace->profile.record[count].heap_total_size = heaps_used * (HEAP_OBJ_LIMIT * sizeof(RVALUE));\
 	}\
     } while(0)
@@ -232,7 +240,7 @@ getrusage_time(void)
 	if (objspace->profile.run) {\
 	    size_t count = objspace->profile.count;\
 	    objspace->profile.record[count].heap_total_objects = heaps_used * HEAP_OBJ_LIMIT;\
-	    objspace->profile.record[count].heap_use_size = live * sizeof(RVALUE);\
+	    objspace->profile.record[count].heap_use_size = live_objects * sizeof(RVALUE);\
 	    objspace->profile.record[count].heap_total_size = heaps_used * HEAP_SIZE;\
 	}\
     } while(0)
@@ -372,7 +380,7 @@ rb_objspace_alloc(void)
 {
     rb_objspace_t *objspace = malloc(sizeof(rb_objspace_t));
     memset(objspace, 0, sizeof(*objspace));
-    malloc_limit = GC_MALLOC_LIMIT;
+    malloc_limit = initial_malloc_limit;
     ruby_gc_stress = ruby_initial_gc_stress;
 
     return objspace;
@@ -405,6 +413,170 @@ int ruby_disable_gc_stress = 0;
 static void run_final(rb_objspace_t *objspace, VALUE obj);
 static int garbage_collect(rb_objspace_t *objspace);
 
+static unsigned long live_objects = 0;
+unsigned long rb_os_live_objects()
+{ return live_objects; }
+
+#if defined(HAVE_LONG_LONG)
+static unsigned long long allocated_objects = 0;
+unsigned long long rb_os_allocated_objects()
+{ return allocated_objects; }
+#else
+static unsigned long allocated_objects = 0;
+unsigned long rb_os_allocated_objects()
+{ return allocated_objects; }
+#endif
+
+static int heap_min_slots = HEAP_MIN_SLOTS;
+static int heap_free_min = 4096;
+static double heap_slots_growth_factor = 1.8;
+
+static long initial_malloc_limit = GC_MALLOC_LIMIT;
+static int verbose_gc_stats = Qfalse;
+static FILE* gc_data_file = NULL;
+
+static void set_gc_parameters()
+{
+    char *gc_stats_ptr, *min_slots_ptr, *free_min_ptr, *heap_slots_incr_ptr,
+      *heap_incr_ptr, *malloc_limit_ptr, *gc_heap_file_ptr, *heap_slots_growth_factor_ptr;
+
+    gc_data_file = stderr;
+
+    gc_stats_ptr = getenv("RUBY_GC_STATS");
+    if (gc_stats_ptr != NULL) {
+	int gc_stats_i = atoi(gc_stats_ptr);
+	if (gc_stats_i > 0) {
+	    verbose_gc_stats = Qtrue;
+	}
+    }
+
+    gc_heap_file_ptr = getenv("RUBY_GC_DATA_FILE");
+    if (gc_heap_file_ptr != NULL) {
+	FILE* data_file = fopen(gc_heap_file_ptr, "w");
+	if (data_file != NULL) {
+	    gc_data_file = data_file;
+	}
+	else {
+	    fprintf(stderr,
+		    "can't open gc log file %s for writing, using default\n", gc_heap_file_ptr);
+	}
+    }
+
+    min_slots_ptr = getenv("RUBY_HEAP_MIN_SLOTS");
+    if (min_slots_ptr != NULL) {
+	int min_slots_i = atoi(min_slots_ptr);
+        if (verbose_gc_stats) {
+	    fprintf(gc_data_file, "RUBY_HEAP_MIN_SLOTS=%s\n", min_slots_ptr);
+        }
+	if (min_slots_i > 0) {
+	    heap_min_slots = min_slots_i;
+	}
+    }
+
+    free_min_ptr = getenv("RUBY_HEAP_FREE_MIN");
+    if (free_min_ptr != NULL) {
+	int free_min_i = atoi(free_min_ptr);
+        if (verbose_gc_stats) {
+	    fprintf(gc_data_file, "RUBY_HEAP_FREE_MIN=%s\n", free_min_ptr);
+	}
+	if (free_min_i > 0) {
+	    heap_free_min = free_min_i;
+	}
+    }
+
+    heap_incr_ptr = getenv("RUBY_HEAP_INCREMENT");
+    if (heap_incr_ptr != NULL) {
+	int heap_incr_i = atoi(heap_incr_ptr);
+        if (verbose_gc_stats) {
+	    fprintf(gc_data_file, "RUBY_HEAP_INCREMENT=%s\n", heap_incr_ptr);
+	}
+	if (heap_incr_i > 0) {
+	    (&rb_objspace)->malloc_params.increase = heap_incr_i;
+	}
+    }
+
+    heap_slots_incr_ptr = getenv("RUBY_HEAP_SLOTS_INCREMENT");
+    if (heap_slots_incr_ptr != NULL) {
+	int heap_slots_incr_i = atoi(heap_slots_incr_ptr);
+        if (verbose_gc_stats) {
+	    fprintf(gc_data_file, "RUBY_HEAP_SLOTS_INCREMENT=%s\n", heap_slots_incr_ptr);
+	}
+	if (heap_slots_incr_i > 0) {
+	    (&rb_objspace)->malloc_params.increase = heap_slots_incr_i;
+	}
+    }
+
+    heap_slots_growth_factor_ptr = getenv("RUBY_HEAP_SLOTS_GROWTH_FACTOR");
+    if (heap_slots_growth_factor_ptr != NULL) {
+	double heap_slots_growth_factor_d = atoi(heap_slots_growth_factor_ptr);
+        if (verbose_gc_stats) {
+	    fprintf(gc_data_file, "RUBY_HEAP_SLOTS_GROWTH_FACTOR=%s\n", heap_slots_growth_factor_ptr);
+	}
+	if (heap_slots_growth_factor_d > 0) {
+	    heap_slots_growth_factor = heap_slots_growth_factor_d;
+	}
+    }
+
+    malloc_limit_ptr = getenv("RUBY_GC_MALLOC_LIMIT");
+    if (malloc_limit_ptr != NULL) {
+	int malloc_limit_i = atol(malloc_limit_ptr);
+        if (verbose_gc_stats) {
+	    fprintf(gc_data_file, "RUBY_GC_MALLOC_LIMIT=%s\n", malloc_limit_ptr);
+	}
+	if (malloc_limit_i > 0) {
+	    initial_malloc_limit = malloc_limit_i;
+	}
+    }
+}
+
+/*
+ *  call-seq:
+ *     GC.dump    => nil
+ *
+ *  dumps information about the current GC data structures to the GC log file
+ *
+ *     GC.dump    #=> nil
+ *
+ */
+
+VALUE
+rb_gc_dump()
+{
+    int i;
+    rb_objspace_t *objspace = &rb_objspace;
+
+    for (i = 0; i < heaps_used; i++) {
+        int heap_size = heaps[i].limit;
+        fprintf(gc_data_file, "HEAP[%2d]: size=%7d\n", i, heap_size);
+    }
+
+    return Qnil;
+}
+
+/*
+ *  call-seq:
+ *     GC.log String  => String
+ *
+ *  Logs string to the GC data file and returns it.
+ *
+ *     GC.log "manual GC call"    #=> "manual GC call"
+ *
+ */
+
+VALUE
+rb_gc_log(VALUE self, VALUE original_str)
+{
+    if (original_str == Qnil) {
+        fprintf(gc_data_file, "\n");
+    }
+    else {
+        VALUE str = StringValue(original_str);
+        char *p = RSTRING_PTR(str);
+        fprintf(gc_data_file, "%s\n", p);
+    }
+    return original_str;
+}
+
 void
 rb_global_variable(VALUE *var)
 {
@@ -454,6 +626,10 @@ rb_memerror(void)
     rb_exc_raise(nomem_error);
 }
 
+long gc_allocated_size = 0;
+long gc_num_allocations = 0;
+static int gc_statistics = 0;
+
 /*
  *  call-seq:
  *    GC.stress                 => true or false
@@ -699,6 +875,10 @@ vm_xfree(rb_objspace_t *objspace, void *ptr)
 void *
 ruby_xmalloc(size_t size)
 {
+    if (gc_statistics) {
+      gc_allocated_size += size;
+      gc_num_allocations += 1;
+    }
     return vm_xmalloc(&rb_objspace, size);
 }
 
@@ -744,6 +924,13 @@ ruby_xfree(void *x)
       vm_xfree(&rb_objspace, x);
 }
 
+#if HAVE_LONG_LONG
+#define GC_TIME_TYPE LONG_LONG
+#else
+#define GC_TIME_TYPE long
+#endif
+static GC_TIME_TYPE gc_time = 0;
+static int gc_collections = 0;
 
 /*
  *  call-seq:
@@ -775,7 +962,7 @@ rb_gc_enable(void)
  *  Disables garbage collection, returning <code>true</code> if garbage
  *  collection was already disabled.
  *
- *     GC.disable   #=> false
+ *     GC.disable   #=> false or true
  *     GC.disable   #=> true
  *
  */
@@ -790,6 +977,139 @@ rb_gc_disable(void)
     return old;
 }
 
+/*
+ *  call-seq:
+ *     GC.enable_stats    => true or false
+ *
+ *  Enables garbage collection statistics, returning <code>true</code> if garbage
+ *  collection statistics was already enabled.
+ *
+ *     GC.enable_stats   #=> false or true
+ *     GC.enable_stats   #=> true
+ *
+ */
+
+VALUE
+rb_gc_enable_stats()
+{
+    int old = gc_statistics;
+    gc_statistics = Qtrue;
+    return old;
+}
+
+/*
+ *  call-seq:
+ *     GC.disable_stats    => true or false
+ *
+ *  Disables garbage collection statistics, returning <code>true</code> if garbage
+ *  collection statistics was already disabled.
+ *
+ *     GC.disable_stats   #=> false or true
+ *     GC.disable_stats   #=> true
+ *
+ */
+
+VALUE
+rb_gc_disable_stats()
+{
+    int old = gc_statistics;
+    gc_statistics = Qfalse;
+    gc_allocated_size = 0;
+    gc_num_allocations = 0;
+    return old;
+}
+
+/*
+ *  call-seq:
+ *     GC.clear_stats    => nil
+ *
+ *  Clears garbage collection statistics, returning nil. This resets the number
+ *  of collections (GC.collections) and the time used (GC.time) to 0.
+ *
+ *     GC.clear_stats    #=> nil
+ *
+ */
+
+VALUE
+rb_gc_clear_stats()
+{
+    gc_collections = 0;
+    gc_time = 0;
+    gc_allocated_size = 0;
+    gc_num_allocations = 0;
+    return Qnil; 
+}
+
+/*
+ *  call-seq:
+ *     GC.allocated_size    => Integer
+ *
+ *  Returns the size of memory (in bytes) allocated since GC statistics collection
+ *  was enabled.
+ *
+ *     GC.allocated_size    #=> 35
+ *
+ */
+VALUE
+rb_gc_allocated_size()
+{
+    return INT2NUM(gc_allocated_size);
+}
+
+/*
+ *  call-seq:
+ *     GC.num_allocations    => Integer
+ *
+ *  Returns the number of memory allocations since GC statistics collection
+ *  was enabled.
+ *
+ *     GC.num_allocations    #=> 150
+ *
+ */
+VALUE
+rb_gc_num_allocations()
+{
+    return INT2NUM(gc_num_allocations);
+}
+
+/*
+ *  call-seq:
+ *     GC.collections    => Integer
+ *
+ *  Returns the number of garbage collections performed while GC statistics collection
+ *  was enabled.
+ *
+ *     GC.collections    #=> 35
+ *
+ */
+
+VALUE
+rb_gc_collections()
+{
+    return INT2NUM(gc_collections);
+}
+
+/*
+ *  call-seq:
+ *     GC.time    => Integer
+ *
+ *  Returns the time spent during garbage collection while GC statistics collection
+ *  was enabled (in micro seconds).
+ *
+ *     GC.time    #=> 20000
+ *
+ */
+
+VALUE
+rb_gc_time()
+{
+#if HAVE_LONG_LONG
+    return LL2NUM(gc_time);
+#else
+    return LONG2NUM(gc_time);
+#endif
+}
+
 VALUE rb_mGC;
 
 void
@@ -921,7 +1241,7 @@ init_heap(rb_objspace_t *objspace)
 {
     size_t add, i;
 
-    add = HEAP_MIN_SLOTS / HEAP_OBJ_LIMIT;
+    add = heap_min_slots / HEAP_OBJ_LIMIT;
 
     if ((heaps_used + add) > heaps_length) {
     	allocate_heaps(objspace, heaps_used + add);
@@ -934,12 +1254,12 @@ init_heap(rb_objspace_t *objspace)
     objspace->profile.invoke_time = getrusage_time();
 }
 
-
 static void
 set_heaps_increment(rb_objspace_t *objspace)
 {
-    size_t next_heaps_length = heaps_used * 1.8;
+    size_t next_heaps_length = heaps_used * heap_slots_growth_factor;
     heaps_inc = next_heaps_length - heaps_used;
+    if (next_heaps_length <= 0) next_heaps_length = heap_min_slots;
 
     if (next_heaps_length > heaps_length) {
 	allocate_heaps(objspace, next_heaps_length);
@@ -980,6 +1300,8 @@ rb_newobj_from_heap(rb_objspace_t *objspace)
     RANY(obj)->line = rb_sourceline();
 #endif
 
+    live_objects++;
+    allocated_objects++;
     return obj;
 }
 
@@ -1671,6 +1993,39 @@ finalize_list(rb_objspace_t *objspace, RVALUE *p)
     }
 }
 
+static char* obj_type(int tp)
+{
+    switch (tp) {
+	case T_NIL    : return "NIL";   
+	case T_OBJECT : return "OBJECT";
+	case T_CLASS  : return "CLASS";
+	case T_ICLASS : return "ICLASS";
+	case T_MODULE : return "MODULE";
+	case T_FLOAT  : return "FLOAT";
+	case T_STRING : return "STRING";
+	case T_REGEXP : return "REGEXP";
+	case T_ARRAY  : return "ARRAY";
+	case T_FIXNUM : return "FIXNUM";
+	case T_HASH   : return "HASH";
+	case T_STRUCT : return "STRUCT";
+	case T_BIGNUM : return "BIGNUM";
+	case T_FILE   : return "FILE";
+	    
+	case T_TRUE   : return "TRUE";
+	case T_FALSE  : return "FALSE";
+	case T_DATA   : return "DATA";
+	case T_MATCH  : return "MATCH";
+	case T_SYMBOL : return "SYMBOL";
+	    
+	//case T_BLKTAG : return "BLKTAG";
+	case T_UNDEF  : return "UNDEF";
+	case T_RATIONAL : return "RATIONAL";
+	case T_COMPLEX  : return "COMPLEX";
+	case T_NODE   : return "NODE";
+	default: return "____";
+    }
+}
+
 static void
 free_unused_heaps(rb_objspace_t *objspace)
 {
@@ -1711,14 +2066,24 @@ gc_sweep(rb_objspace_t *objspace)
     RVALUE *p, *pend, *final_list;
     size_t freed = 0;
     size_t i;
-    size_t live = 0, free_min = 0, do_heap_free = 0;
+    size_t free_min = 0, do_heap_free = 0;
+    live_objects = 0;
+
+    unsigned long really_freed = 0;
+    int free_counts[256];
+    int live_counts[256];
+    int do_gc_stats = gc_statistics & verbose_gc_stats;
 
     do_heap_free = (heaps_used * HEAP_OBJ_LIMIT) * 0.65;
     free_min = (heaps_used * HEAP_OBJ_LIMIT)  * 0.2;
 
-    if (free_min < FREE_MIN) {
+    if (free_min < heap_free_min) {
 	do_heap_free = heaps_used * HEAP_OBJ_LIMIT;
-        free_min = FREE_MIN;
+        free_min = heap_free_min;
+    }
+    
+    if (do_gc_stats) {
+	for (i = 0 ; i< 256; i++) { free_counts[i] = live_counts[i] = 0; }
     }
 
     freelist = 0;
@@ -1739,6 +2104,9 @@ gc_sweep(rb_objspace_t *objspace)
 		    if (!deferred) {
 			p->as.free.flags = T_ZOMBIE;
 			RDATA(p)->dfree = 0;
+	    if (do_gc_stats) {
+  			really_freed++;
+	    }
 		    }
 		    p->as.free.flags |= FL_MARK;
 		    p->as.free.next = final_list;
@@ -1746,6 +2114,12 @@ gc_sweep(rb_objspace_t *objspace)
 		    final_num++;
 		}
 		else {
+	      if (do_gc_stats) {
+			    int obt = p->as.basic.flags & T_MASK;
+		      if (obt) {
+	      free_counts[obt]++;
+			    }
+	      }
 		    add_freelist(objspace, p);
 		    free_num++;
 		}
@@ -1756,7 +2130,10 @@ gc_sweep(rb_objspace_t *objspace)
 	    }
 	    else {
 		RBASIC(p)->flags &= ~FL_MARK;
-		live++;
+		live_objects++;
+		if (do_gc_stats) {
+ 		    live_counts[RANY((VALUE)p)->as.basic.flags & T_MASK]++;
+ 		}
 	    }
 	    p++;
 	}
@@ -1777,8 +2154,8 @@ gc_sweep(rb_objspace_t *objspace)
     }
     GC_PROF_SET_MALLOC_INFO;
     if (malloc_increase > malloc_limit) {
-	malloc_limit += (malloc_increase - malloc_limit) * (double)live / (live + freed);
-	if (malloc_limit < GC_MALLOC_LIMIT) malloc_limit = GC_MALLOC_LIMIT;
+	malloc_limit += (malloc_increase - malloc_limit) * (double)live_objects / (live_objects + freed);
+	if (malloc_limit < initial_malloc_limit) malloc_limit = initial_malloc_limit;
     }
     malloc_increase = 0;
     if (freed < free_min) {
@@ -1786,6 +2163,20 @@ gc_sweep(rb_objspace_t *objspace)
 	heaps_increment(objspace);
     }
     during_gc = 0;
+    
+    if (do_gc_stats) {
+	fprintf(gc_data_file, "objects processed: %.7d\n", live_objects+freed);
+	fprintf(gc_data_file, "live objects	: %.7d\n", live_objects);
+	fprintf(gc_data_file, "freelist objects : %.7d\n", freed - really_freed);
+	fprintf(gc_data_file, "freed objects	: %.7d\n", really_freed);
+	for(i=0; i<256; i++) {
+	  if (free_counts[i]>0) {
+	fprintf(gc_data_file,
+		"kept %.7d / freed %.7d objects of type %s\n",
+		live_counts[i], free_counts[i], obj_type(i));
+    }
+	}
+    }
 
     /* clear finalization list */
     if (final_list) {
@@ -1994,6 +2385,7 @@ garbage_collect(rb_objspace_t *objspace)
 {
     struct gc_list *list;
     rb_thread_t *th = GET_THREAD();
+    struct timeval gctv1, gctv2;
     INIT_GC_PROF_PARAMS;
 
     if (GC_NOTIFY) printf("start garbage_collect()\n");
@@ -2013,6 +2405,14 @@ garbage_collect(rb_objspace_t *objspace)
     }
     during_gc++;
     objspace->count++;
+    
+    if (gc_statistics) {
+        gc_collections++;
+	      gettimeofday(&gctv1, NULL);
+        if (verbose_gc_stats) {
+	    fprintf(gc_data_file, "Garbage collection started\n");
+	      }
+    }
 
     GC_PROF_TIMER_START;
     GC_PROF_MARK_TIMER_START;
@@ -2060,6 +2460,17 @@ garbage_collect(rb_objspace_t *objspace)
     GC_PROF_SWEEP_TIMER_START;
     gc_sweep(objspace);
     GC_PROF_SWEEP_TIMER_STOP;
+    
+    if (gc_statistics) {
+      GC_TIME_TYPE musecs_used;
+	    gettimeofday(&gctv2, NULL);
+	    musecs_used = ((GC_TIME_TYPE)(gctv2.tv_sec - gctv1.tv_sec) * 1000000) + (gctv2.tv_usec - gctv1.tv_usec);
+	    gc_time += musecs_used;
+
+      if (verbose_gc_stats) {
+    fprintf(gc_data_file, "GC time: %d msec\n", musecs_used / 1000);
+      }
+    }
 
     GC_PROF_TIMER_STOP;
     if (GC_NOTIFY) printf("end garbage_collect()\n");
@@ -2153,6 +2564,7 @@ Init_stack(VALUE *addr)
 void
 Init_heap(void)
 {
+    set_gc_parameters();
     init_heap(&rb_objspace);
 }
 
@@ -2868,6 +3280,34 @@ gc_profile_report(int argc, VALUE *argv, VALUE self)
     return Qnil;
 }
 
+/* call-seq:
+ *  ObjectSpace.live_objects => number
+ *
+ * Returns the count of objects currently allocated in the system. This goes
+ * down after the garbage collector runs.
+ */
+static
+VALUE os_live_objects(VALUE self)
+{ return ULONG2NUM(live_objects); }
+
+/* call-seq:
+ *  ObjectSpace.allocated_objects => number
+ *
+ * Returns the count of objects allocated since the Ruby interpreter has
+ * started.  This number can only increase. To know how many objects are
+ * currently allocated, use ObjectSpace::live_objects
+ */
+static
+VALUE os_allocated_objects(VALUE self)
+{ 
+#if defined(HAVE_LONG_LONG)
+    return ULL2NUM(allocated_objects); 
+#else
+    return ULONG2NUM(allocated_objects); 
+#endif
+}
+
+
 
 /*
  *  The <code>GC</code> module provides an interface to Ruby's mark and
@@ -2897,10 +3337,23 @@ Init_GC(void)
     rb_define_singleton_method(rb_mProfiler, "clear", gc_profile_clear, 0);
     rb_define_singleton_method(rb_mProfiler, "result", gc_profile_result, 0);
     rb_define_singleton_method(rb_mProfiler, "report", gc_profile_report, -1);
+    
+    rb_define_singleton_method(rb_mGC, "enable_stats", rb_gc_enable_stats, 0);
+    rb_define_singleton_method(rb_mGC, "disable_stats", rb_gc_disable_stats, 0);
+    rb_define_singleton_method(rb_mGC, "clear_stats", rb_gc_clear_stats, 0);
+    rb_define_singleton_method(rb_mGC, "allocated_size", rb_gc_allocated_size, 0);
+    rb_define_singleton_method(rb_mGC, "num_allocations", rb_gc_num_allocations, 0);
+    rb_define_singleton_method(rb_mGC, "collections", rb_gc_collections, 0);
+    rb_define_singleton_method(rb_mGC, "time", rb_gc_time, 0);
+    rb_define_singleton_method(rb_mGC, "dump", rb_gc_dump, 0);
+    rb_define_singleton_method(rb_mGC, "log", rb_gc_log, 1);
 
     rb_mObSpace = rb_define_module("ObjectSpace");
     rb_define_module_function(rb_mObSpace, "each_object", os_each_obj, -1);
     rb_define_module_function(rb_mObSpace, "garbage_collect", rb_gc_start, 0);
+    rb_define_module_function(rb_mObSpace, "live_objects", os_live_objects, 0);
+    rb_define_module_function(rb_mObSpace, "allocated_objects", os_allocated_objects, 0);
+
 
     rb_define_module_function(rb_mObSpace, "define_finalizer", define_final, -1);
     rb_define_module_function(rb_mObSpace, "undefine_finalizer", undefine_final, 1);
patches/ruby/1.9.1/p431/backport-2404.patch000066400000000740147511530510013533 0ustar00Index: gem_prelude.rb
===================================================================
--- a/gem_prelude.rb	(revision 25926)
+++ b/gem_prelude.rb	(working copy)
@@ -67,7 +67,7 @@
 
     def self.set_home(home)
       home = home.gsub File::ALT_SEPARATOR, File::SEPARATOR if File::ALT_SEPARATOR
-      @gem_home = home.force_encoding(Encoding.find('filesystem'))
+      @gem_home = home.dup.force_encoding(Encoding.find('filesystem'))
     end
 
     def self.set_paths(gpaths)
patches/ruby/1.9.1/openssl-1.0.patch000066400000016005147511530510012630 0ustar00From 46b84175dfac14a92fd6bcf3b03bc3c3715ab6cb Mon Sep 17 00:00:00 2001
From: nahi <nahi@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>
Date: Sat, 6 Mar 2010 21:47:30 +0000
Subject: [PATCH] backport the commit from trunk:
 Sun Feb 28 11:49:35 2010  NARUSE, Yui  <naruse@ruby-lang.org>

        * openssl/ossl.c (OSSL_IMPL_SK2ARY): for OpenSSL 1.0.
          patched by Jeroen van Meeuwen at [ruby-core:25210]
          fixed by Nobuyoshi Nakada [ruby-core:25238],
          Hongli Lai [ruby-core:27417],
          and Motohiro KOSAKI [ruby-core:28063]

        * ext/openssl/ossl_ssl.c (ossl_ssl_method_tab),
          (ossl_ssl_cipher_to_ary): constified.

        * ext/openssl/ossl_pkcs7.c (pkcs7_get_certs, pkcs7_get_crls):
          split pkcs7_get_certs_or_crls.


git-svn-id: http://svn.ruby-lang.org/repos/ruby/branches/ruby_1_8@26838 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
---
 ext/openssl/ossl.c          |    6 +++---
 ext/openssl/ossl.h          |    7 +++++++
 ext/openssl/ossl_pkcs7.c    |   40 ++++++++++++++++++++++++++++++----------
 ext/openssl/ossl_ssl.c      |    4 ++--
 ext/openssl/ossl_x509attr.c |    5 +++--
 ext/openssl/ossl_x509crl.c  |    4 ++--
 6 files changed, 47 insertions(+), 19 deletions(-)

diff --git a/ext/openssl/ossl.c b/ext/openssl/ossl.c
index d4a2dc1..85ba654 100644
--- a/ext/openssl/ossl.c
+++ b/ext/openssl/ossl.c
@@ -92,7 +92,7 @@ ossl_x509_ary2sk(VALUE ary)
 
 #define OSSL_IMPL_SK2ARY(name, type)	        \
 VALUE						\
-ossl_##name##_sk2ary(STACK *sk)			\
+ossl_##name##_sk2ary(STACK_OF(type) *sk)	\
 {						\
     type *t;					\
     int i, num;					\
@@ -102,7 +102,7 @@ ossl_##name##_sk2ary(STACK *sk)			\
 	OSSL_Debug("empty sk!");		\
 	return Qnil;				\
     }						\
-    num = sk_num(sk);				\
+    num = sk_##type##_num(sk);			\
     if (num < 0) {				\
 	OSSL_Debug("items in sk < -1???");	\
 	return rb_ary_new();			\
@@ -110,7 +110,7 @@ ossl_##name##_sk2ary(STACK *sk)			\
     ary = rb_ary_new2(num);			\
 						\
     for (i=0; i<num; i++) {			\
-	t = (type *)sk_value(sk, i);		\
+	t = sk_##type##_value(sk, i);		\
 	rb_ary_push(ary, ossl_##name##_new(t));	\
     }						\
     return ary;					\
diff --git a/ext/openssl/ossl.h b/ext/openssl/ossl.h
index 9215dc4..d0edb7d 100644
--- a/ext/openssl/ossl.h
+++ b/ext/openssl/ossl.h
@@ -108,6 +108,13 @@ extern VALUE eOSSLError;
 } while (0)
 
 /*
+ * Compatibility
+ */
+#if OPENSSL_VERSION_NUMBER >= 0x10000000L
+#define STACK _STACK
+#endif
+
+/*
  * String to HEXString conversion
  */
 int string2hex(const unsigned char *, int, char **, int *);
diff --git a/ext/openssl/ossl_pkcs7.c b/ext/openssl/ossl_pkcs7.c
index fe1ef7c..b0cc656 100644
--- a/ext/openssl/ossl_pkcs7.c
+++ b/ext/openssl/ossl_pkcs7.c
@@ -572,12 +572,11 @@ ossl_pkcs7_add_certificate(VALUE self, VALUE cert)
     return self;
 }
 
-static STACK *
-pkcs7_get_certs_or_crls(VALUE self, int want_certs)
+static STACK_OF(X509) *
+pkcs7_get_certs(VALUE self)
 {
     PKCS7 *pkcs7;
     STACK_OF(X509) *certs;
-    STACK_OF(X509_CRL) *crls;
     int i;
 
     GetPKCS7(self, pkcs7);
@@ -585,17 +584,38 @@ pkcs7_get_certs_or_crls(VALUE self, int want_certs)
     switch(i){
     case NID_pkcs7_signed:
         certs = pkcs7->d.sign->cert;
-        crls = pkcs7->d.sign->crl;
         break;
     case NID_pkcs7_signedAndEnveloped:
         certs = pkcs7->d.signed_and_enveloped->cert;
+        break;
+    default:
+        certs = NULL;
+    }
+
+    return certs;
+}
+
+static STACK_OF(X509_CRL) *
+pkcs7_get_crls(VALUE self)
+{
+    PKCS7 *pkcs7;
+    STACK_OF(X509_CRL) *crls;
+    int i;
+
+    GetPKCS7(self, pkcs7);
+    i = OBJ_obj2nid(pkcs7->type);
+    switch(i){
+    case NID_pkcs7_signed:
+        crls = pkcs7->d.sign->crl;
+        break;
+    case NID_pkcs7_signedAndEnveloped:
         crls = pkcs7->d.signed_and_enveloped->crl;
         break;
     default:
-        certs = crls = NULL;
+        crls = NULL;
     }
 
-    return want_certs ? certs : crls;
+    return crls;
 }
 
 static VALUE
@@ -610,7 +630,7 @@ ossl_pkcs7_set_certificates(VALUE self, VALUE ary)
     STACK_OF(X509) *certs;
     X509 *cert;
 
-    certs = pkcs7_get_certs_or_crls(self, 1);
+    certs = pkcs7_get_certs(self);
     while((cert = sk_X509_pop(certs))) X509_free(cert);
     rb_block_call(ary, rb_intern("each"), 0, 0, ossl_pkcs7_set_certs_i, self);
 
@@ -620,7 +640,7 @@ ossl_pkcs7_set_certificates(VALUE self, VALUE ary)
 static VALUE
 ossl_pkcs7_get_certificates(VALUE self)
 {
-    return ossl_x509_sk2ary(pkcs7_get_certs_or_crls(self, 1));
+    return ossl_x509_sk2ary(pkcs7_get_certs(self));
 }
 
 static VALUE
@@ -650,7 +670,7 @@ ossl_pkcs7_set_crls(VALUE self, VALUE ary)
     STACK_OF(X509_CRL) *crls;
     X509_CRL *crl;
 
-    crls = pkcs7_get_certs_or_crls(self, 0);
+    crls = pkcs7_get_crls(self);
     while((crl = sk_X509_CRL_pop(crls))) X509_CRL_free(crl);
     rb_block_call(ary, rb_intern("each"), 0, 0, ossl_pkcs7_set_crls_i, self);
 
@@ -660,7 +680,7 @@ ossl_pkcs7_set_crls(VALUE self, VALUE ary)
 static VALUE
 ossl_pkcs7_get_crls(VALUE self)
 {
-    return ossl_x509crl_sk2ary(pkcs7_get_certs_or_crls(self, 0));
+    return ossl_x509crl_sk2ary(pkcs7_get_crls(self));
 }
 
 static VALUE
diff --git a/ext/openssl/ossl_ssl.c b/ext/openssl/ossl_ssl.c
index 432ca21..facf6ca 100644
--- a/ext/openssl/ossl_ssl.c
+++ b/ext/openssl/ossl_ssl.c
@@ -1291,10 +1291,10 @@ ossl_ssl_get_peer_cert_chain(VALUE self)
     }
     chain = SSL_get_peer_cert_chain(ssl);
     if(!chain) return Qnil;
-    num = sk_num(chain);
+    num = sk_X509_num(chain);
     ary = rb_ary_new2(num);
     for (i = 0; i < num; i++){
-	cert = (X509*)sk_value(chain, i);
+	cert = sk_X509_value(chain, i);
 	rb_ary_push(ary, ossl_x509_new(cert));
     }
 
diff --git a/ext/openssl/ossl_x509attr.c b/ext/openssl/ossl_x509attr.c
index 1f817cd..2a4c481 100644
--- a/ext/openssl/ossl_x509attr.c
+++ b/ext/openssl/ossl_x509attr.c
@@ -218,8 +218,9 @@ ossl_x509attr_get_value(VALUE self)
 	ossl_str_adjust(str, p);
     }
     else{
-	length = i2d_ASN1_SET_OF_ASN1_TYPE(attr->value.set, NULL,
-			i2d_ASN1_TYPE, V_ASN1_SET, V_ASN1_UNIVERSAL, 0);
+	length = i2d_ASN1_SET_OF_ASN1_TYPE(attr->value.set,
+			(unsigned char **) NULL, i2d_ASN1_TYPE,
+			V_ASN1_SET, V_ASN1_UNIVERSAL, 0);
 	str = rb_str_new(0, length);
 	p = (unsigned char *)RSTRING_PTR(str);
 	i2d_ASN1_SET_OF_ASN1_TYPE(attr->value.set, &p,
diff --git a/ext/openssl/ossl_x509crl.c b/ext/openssl/ossl_x509crl.c
index 1be9640..818fdba 100644
--- a/ext/openssl/ossl_x509crl.c
+++ b/ext/openssl/ossl_x509crl.c
@@ -264,7 +264,7 @@ ossl_x509crl_get_revoked(VALUE self)
     VALUE ary, revoked;
 
     GetX509CRL(self, crl);
-    num = sk_X509_CRL_num(X509_CRL_get_REVOKED(crl));
+    num = sk_X509_REVOKED_num(X509_CRL_get_REVOKED(crl));
     if (num < 0) {
 	OSSL_Debug("num < 0???");
 	return rb_ary_new();
@@ -272,7 +272,7 @@ ossl_x509crl_get_revoked(VALUE self)
     ary = rb_ary_new2(num);
     for(i=0; i<num; i++) {
 	/* NO DUP - don't free! */
-	rev = (X509_REVOKED *)sk_X509_CRL_value(X509_CRL_get_REVOKED(crl), i);
+	rev = sk_X509_REVOKED_value(X509_CRL_get_REVOKED(crl), i);
 	revoked = ossl_x509revoked_new(rev);
 	rb_ary_push(ary, revoked);
     }
-- 
1.7.0.3
patches/ruby/1.9.1/nossl2.diff000066400000001225147511530510011700 0ustar00diff --git a/ext/openssl/ossl_ssl.c b/ext/openssl/ossl_ssl.c
index e8d2e86..be62fcc 100644
--- a/ext/openssl/ossl_ssl.c
+++ b/ext/openssl/ossl_ssl.c
@@ -107,9 +107,12 @@ struct {
     OSSL_SSL_METHOD_ENTRY(TLSv1),
     OSSL_SSL_METHOD_ENTRY(TLSv1_server),
     OSSL_SSL_METHOD_ENTRY(TLSv1_client),
+#if defined(HAVE_SSLV2_METHOD) && defined(HAVE_SSLV2_SERVER_METHOD) && \
+        defined(HAVE_SSLV2_CLIENT_METHOD)
     OSSL_SSL_METHOD_ENTRY(SSLv2),
     OSSL_SSL_METHOD_ENTRY(SSLv2_server),
     OSSL_SSL_METHOD_ENTRY(SSLv2_client),
+#endif
     OSSL_SSL_METHOD_ENTRY(SSLv3),
     OSSL_SSL_METHOD_ENTRY(SSLv3_server),
     OSSL_SSL_METHOD_ENTRY(SSLv3_client),
patches/ruby/1.8.6/railsbench.patch000066400000033423147511530510012772 0ustar00Index: gc.c
===================================================================
--- gc.c	(revision 12920)
+++ gc.c	(working copy)
@@ -22,8 +22,16 @@
 #include <setjmp.h>
 #include <sys/types.h>
 
+#ifdef _WIN32
+#include <string.h>
+#else
+#include <strings.h>
+#endif
+
 #ifdef HAVE_SYS_TIME_H
 #include <sys/time.h>
+#elif defined(_WIN32)
+#include <time.h> 
 #endif
 
 #ifdef HAVE_SYS_RESOURCE_H
@@ -40,7 +48,6 @@
 #if !defined(setjmp) && defined(HAVE__SETJMP)
 #define setjmp(env) _setjmp(env)
 #endif
-
 /* Make alloca work the best possible way.  */
 #ifdef __GNUC__
 # ifndef atarist
@@ -159,8 +166,17 @@
 	RUBY_CRITICAL(free(x));
 }
 
+#if HAVE_LONG_LONG
+#define GC_TIME_TYPE LONG_LONG
+#else
+#define GC_TIME_TYPE long
+#endif
+
 extern int ruby_in_compile;
 static int dont_gc;
+static int gc_statistics = 0;
+static GC_TIME_TYPE gc_time = 0;
+static int gc_collections = 0;
 static int during_gc;
 static int need_call_final = 0;
 static st_table *finalizer_table = 0;
@@ -195,7 +211,7 @@
  *  Disables garbage collection, returning <code>true</code> if garbage
  *  collection was already disabled.
  *
- *     GC.disable   #=> false
+ *     GC.disable   #=> false or true
  *     GC.disable   #=> true
  *
  */
@@ -209,6 +225,104 @@
     return old;
 }
 
+/*
+ *  call-seq:
+ *     GC.enable_stats    => true or false
+ *
+ *  Enables garbage collection statistics, returning <code>true</code> if garbage
+ *  collection statistics was already enabled.
+ *
+ *     GC.enable_stats   #=> false or true
+ *     GC.enable_stats   #=> true
+ *
+ */
+
+VALUE
+rb_gc_enable_stats()
+{
+    int old = gc_statistics;
+    gc_statistics = Qtrue;
+    return old;
+}
+
+/*
+ *  call-seq:
+ *     GC.disable_stats    => true or false
+ *
+ *  Disables garbage collection statistics, returning <code>true</code> if garbage
+ *  collection statistics was already disabled.
+ *
+ *     GC.disable_stats   #=> false or true
+ *     GC.disable_stats   #=> true
+ *
+ */
+
+VALUE
+rb_gc_disable_stats()
+{
+    int old = gc_statistics;
+    gc_statistics = Qfalse;
+    return old;
+}
+
+/*
+ *  call-seq:
+ *     GC.clear_stats    => nil
+ *
+ *  Clears garbage collection statistics, returning nil. This resets the number
+ *  of collections (GC.collections) and the time used (GC.time) to 0.
+ *
+ *     GC.clear_stats    #=> nil
+ *
+ */
+
+VALUE
+rb_gc_clear_stats()
+{
+    gc_collections = 0;
+    gc_time = 0;
+    return Qnil; 
+}
+
+/*
+ *  call-seq:
+ *     GC.collections    => Integer
+ *
+ *  Returns the number of garbage collections performed while GC statistics collection
+ *  was enabled.
+ *
+ *     GC.collections    #=> 35
+ *
+ */
+
+VALUE
+rb_gc_collections()
+{
+    return INT2NUM(gc_collections);
+}
+
+/*
+ *  call-seq:
+ *     GC.time    => Integer
+ *
+ *  Returns the time spent during garbage collection while GC statistics collection
+ *  was enabled (in micro seconds).
+ *
+ *     GC.time    #=> 20000
+ *
+ */
+
+VALUE
+rb_gc_time()
+{
+#if HAVE_LONG_LONG
+    return LL2NUM(gc_time);
+#else
+    return LONG2NUM(gc_time);
+#endif
+}
+
+
 VALUE rb_mGC;
 
 static struct gc_list {
@@ -300,7 +414,7 @@
 static RVALUE *freelist = 0;
 static RVALUE *deferred_final_list = 0;
 
-#define HEAPS_INCREMENT 10
+static int heaps_increment = 10;
 static struct heaps_slot {
     void *membase;
     RVALUE *slot;
@@ -309,13 +423,165 @@
 static int heaps_length = 0;
 static int heaps_used   = 0;
 
-#define HEAP_MIN_SLOTS 10000
-static int heap_slots = HEAP_MIN_SLOTS;
+static int heap_min_slots = 10000;
+static int heap_slots = 10000;
+
+static int heap_free_min = 4096;
+static int heap_slots_increment = 10000;
+static double heap_slots_growth_factor = 1.8;
+
+static long initial_malloc_limit = GC_MALLOC_LIMIT;
+
+static int verbose_gc_stats = Qfalse;
 
-#define FREE_MIN  4096
+static FILE* gc_data_file = NULL;
 
 static RVALUE *himem, *lomem;
 
+static void set_gc_parameters()
+{
+    char *gc_stats_ptr, *min_slots_ptr, *free_min_ptr, *heap_slots_incr_ptr,
+      *heap_incr_ptr, *malloc_limit_ptr, *gc_heap_file_ptr, *heap_slots_growth_factor_ptr;
+
+    gc_data_file = stderr;
+
+    gc_stats_ptr = getenv("RUBY_GC_STATS");
+    if (gc_stats_ptr != NULL) {
+	int gc_stats_i = atoi(gc_stats_ptr);
+	if (gc_stats_i > 0) {
+	    verbose_gc_stats = Qtrue;
+	}
+    }
+
+    gc_heap_file_ptr = getenv("RUBY_GC_DATA_FILE");
+    if (gc_heap_file_ptr != NULL) {
+	FILE* data_file = fopen(gc_heap_file_ptr, "w");
+	if (data_file != NULL) {
+	    gc_data_file = data_file;
+	}
+	else {
+	    fprintf(stderr,
+		    "can't open gc log file %s for writing, using default\n", gc_heap_file_ptr);
+	}
+    }
+
+    min_slots_ptr = getenv("RUBY_HEAP_MIN_SLOTS");
+    if (min_slots_ptr != NULL) {
+	int min_slots_i = atoi(min_slots_ptr);
+        if (verbose_gc_stats) {
+	    fprintf(gc_data_file, "RUBY_HEAP_MIN_SLOTS=%s\n", min_slots_ptr);
+        }
+	if (min_slots_i > 0) {
+	    heap_slots = min_slots_i;
+	    heap_min_slots = min_slots_i;
+	}
+    }
+
+    free_min_ptr = getenv("RUBY_HEAP_FREE_MIN");
+    if (free_min_ptr != NULL) {
+	int free_min_i = atoi(free_min_ptr);
+        if (verbose_gc_stats) {
+	    fprintf(gc_data_file, "RUBY_HEAP_FREE_MIN=%s\n", free_min_ptr);
+	}
+	if (free_min_i > 0) {
+	    heap_free_min = free_min_i;
+	}
+    }
+
+    heap_incr_ptr = getenv("RUBY_HEAP_INCREMENT");
+    if (heap_incr_ptr != NULL) {
+	int heap_incr_i = atoi(heap_incr_ptr);
+        if (verbose_gc_stats) {
+	    fprintf(gc_data_file, "RUBY_HEAP_INCREMENT=%s\n", heap_incr_ptr);
+	}
+	if (heap_incr_i > 0) {
+	    heaps_increment = heap_incr_i;
+	}
+    }
+
+    heap_slots_incr_ptr = getenv("RUBY_HEAP_SLOTS_INCREMENT");
+    if (heap_slots_incr_ptr != NULL) {
+	int heap_slots_incr_i = atoi(heap_slots_incr_ptr);
+        if (verbose_gc_stats) {
+	    fprintf(gc_data_file, "RUBY_HEAP_SLOTS_INCREMENT=%s\n", heap_slots_incr_ptr);
+	}
+	if (heap_slots_incr_i > 0) {
+	    heap_slots_increment = heap_slots_incr_i;
+	}
+    }
+
+    heap_slots_growth_factor_ptr = getenv("RUBY_HEAP_SLOTS_GROWTH_FACTOR");
+    if (heap_slots_growth_factor_ptr != NULL) {
+	double heap_slots_growth_factor_d = atoi(heap_slots_growth_factor_ptr);
+        if (verbose_gc_stats) {
+	    fprintf(gc_data_file, "RUBY_HEAP_SLOTS_GROWTH_FACTOR=%s\n", heap_slots_growth_factor_ptr);
+	}
+	if (heap_slots_growth_factor_d > 0) {
+	    heap_slots_growth_factor = heap_slots_growth_factor_d;
+	}
+    }
+
+    malloc_limit_ptr = getenv("RUBY_GC_MALLOC_LIMIT");
+    if (malloc_limit_ptr != NULL) {
+	int malloc_limit_i = atol(malloc_limit_ptr);
+        if (verbose_gc_stats) {
+	    fprintf(gc_data_file, "RUBY_GC_MALLOC_LIMIT=%s\n", malloc_limit_ptr);
+	}
+	if (malloc_limit_i > 0) {
+	    initial_malloc_limit = malloc_limit_i;
+	}
+    }
+}
+
+/*
+ *  call-seq:
+ *     GC.dump    => nil
+ *
+ *  dumps information about the current GC data structures to the GC log file
+ *
+ *     GC.dump    #=> nil
+ *
+ */
+
+VALUE
+rb_gc_dump()
+{
+    int i;
+
+    for (i = 0; i < heaps_used; i++) {
+	int heap_size = heaps[i].limit;
+	fprintf(gc_data_file, "HEAP[%2d]: size=%7d\n", i, heap_size);
+    }
+
+    return Qnil;
+}
+
+/*
+ *  call-seq:
+ *     GC.log String  => String
+ *
+ *  Logs string to the GC data file and returns it.
+ *
+ *     GC.log "manual GC call"    #=> "manual GC call"
+ *
+ */
+
+VALUE
+rb_gc_log(self, original_str)
+     VALUE self, original_str;
+{
+    if (original_str == Qnil) {
+        fprintf(gc_data_file, "\n");
+    }
+    else {
+        VALUE str = StringValue(original_str);
+        char *p = RSTRING(str)->ptr;
+        fprintf(gc_data_file, "%s\n", p);
+    }
+    return original_str;
+}
+
+
 static void
 add_heap()
 {
@@ -326,7 +592,7 @@
 	struct heaps_slot *p;
 	int length;
 
-	heaps_length += HEAPS_INCREMENT;
+	heaps_length += heaps_increment;
 	length = heaps_length*sizeof(struct heaps_slot);
 	RUBY_CRITICAL(
 	    if (heaps_used > 0) {
@@ -342,10 +608,10 @@
     for (;;) {
 	RUBY_CRITICAL(p = (RVALUE*)malloc(sizeof(RVALUE)*(heap_slots+1)));
 	if (p == 0) {
-	    if (heap_slots == HEAP_MIN_SLOTS) {
+	    if (heap_slots == heap_min_slots) {
 		rb_memerror();
 	    }
-	    heap_slots = HEAP_MIN_SLOTS;
+	    heap_slots = heap_min_slots;
 	    continue;
 	}
         heaps[heaps_used].membase = p;
@@ -361,8 +627,9 @@
     if (lomem == 0 || lomem > p) lomem = p;
     if (himem < pend) himem = pend;
     heaps_used++;
-    heap_slots *= 1.8;
-    if (heap_slots <= 0) heap_slots = HEAP_MIN_SLOTS;
+    heap_slots += heap_slots_increment;
+    heap_slots_increment *= heap_slots_growth_factor;
+    if (heap_slots <= 0) heap_slots = heap_min_slots;
 
     while (p < pend) {
 	p->as.free.flags = 0;
@@ -1015,6 +1282,39 @@
     }
 }
 
+static char* obj_type(int tp)
+{
+    switch (tp) {
+	case T_NIL    : return "NIL";   
+	case T_OBJECT : return "OBJECT";
+	case T_CLASS  : return "CLASS";
+	case T_ICLASS : return "ICLASS";
+	case T_MODULE : return "MODULE";
+	case T_FLOAT  : return "FLOAT";
+	case T_STRING : return "STRING";
+	case T_REGEXP : return "REGEXP";
+	case T_ARRAY  : return "ARRAY";
+	case T_FIXNUM : return "FIXNUM";
+	case T_HASH   : return "HASH";
+	case T_STRUCT : return "STRUCT";
+	case T_BIGNUM : return "BIGNUM";
+	case T_FILE   : return "FILE";
+	    
+	case T_TRUE   : return "TRUE";
+	case T_FALSE  : return "FALSE";
+	case T_DATA   : return "DATA";
+	case T_MATCH  : return "MATCH";
+	case T_SYMBOL : return "SYMBOL";
+	    
+	case T_BLKTAG : return "BLKTAG";
+	case T_UNDEF  : return "UNDEF";
+	case T_VARMAP : return "VARMAP";
+	case T_SCOPE  : return "SCOPE";
+	case T_NODE   : return "NODE";
+	default: return "____";
+    }
+}
+
 static void
 free_unused_heaps()
 {
@@ -1045,12 +1345,21 @@
     unsigned long live = 0;
     unsigned long free_min = 0;
 
+    unsigned long really_freed = 0;
+    int free_counts[256];
+    int live_counts[256];
+    int do_gc_stats = gc_statistics & verbose_gc_stats;
+
     for (i = 0; i < heaps_used; i++) {
         free_min += heaps[i].limit;
     }
     free_min = free_min * 0.2;
-    if (free_min < FREE_MIN)
-        free_min = FREE_MIN;
+    if (free_min < heap_free_min)
+        free_min = heap_free_min;
+
+    if (do_gc_stats) {
+	for (i = 0 ; i< 256; i++) { free_counts[i] = live_counts[i] = 0; }
+    }
 
     if (ruby_in_compile && ruby_parser_stack_on_heap()) {
 	/* should not reclaim nodes during compilation
@@ -1083,6 +1392,9 @@
 	    if (!(p->as.basic.flags & FL_MARK)) {
 		if (p->as.basic.flags) {
 		    obj_free((VALUE)p);
+		    if (do_gc_stats) {
+			really_freed++;
+		    }
 		}
 		if (need_call_final && FL_TEST(p, FL_FINALIZE)) {
 		    p->as.free.flags = FL_MARK; /* remain marked */
@@ -1090,6 +1402,12 @@
 		    final_list = p;
 		}
 		else {
+		    if (do_gc_stats) {
+			int obt = p->as.basic.flags & T_MASK;
+			if (obt) {
+			    free_counts[obt]++;
+			}
+		    }
 		    p->as.free.flags = 0;
 		    p->as.free.next = freelist;
 		    freelist = p;
@@ -1103,6 +1421,9 @@
 	    else {
 		RBASIC(p)->flags &= ~FL_MARK;
 		live++;
+		if (do_gc_stats) {
+ 		    live_counts[RANY((VALUE)p)->as.basic.flags & T_MASK]++;
+ 		}
 	    }
 	    p++;
 	}
@@ -1121,7 +1442,7 @@
     }
     if (malloc_increase > malloc_limit) {
 	malloc_limit += (malloc_increase - malloc_limit) * (double)live / (live + freed);
-	if (malloc_limit < GC_MALLOC_LIMIT) malloc_limit = GC_MALLOC_LIMIT;
+	if (malloc_limit < initial_malloc_limit) malloc_limit = initial_malloc_limit;
     }
     malloc_increase = 0;
     if (freed < free_min) {
@@ -1129,6 +1450,20 @@
     }
     during_gc = 0;
 
+    if (do_gc_stats) {
+	fprintf(gc_data_file, "objects processed: %.7d\n", live+freed);
+	fprintf(gc_data_file, "live objects	: %.7d\n", live);
+	fprintf(gc_data_file, "freelist objects : %.7d\n", freed - really_freed);
+	fprintf(gc_data_file, "freed objects	: %.7d\n", really_freed);
+	for(i=0; i<256; i++) {
+	    if (free_counts[i]>0) {
+		fprintf(gc_data_file,
+			"kept %.7d / freed %.7d objects of type %s\n",
+			live_counts[i], free_counts[i], obj_type(i));
+	    }
+	}
+    }
+
     /* clear finalization list */
     if (final_list) {
 	deferred_final_list = final_list;
@@ -1323,6 +1658,7 @@
     struct gc_list *list;
     struct FRAME * volatile frame; /* gcc 2.7.2.3 -O2 bug??  */
     jmp_buf save_regs_gc_mark;
+    struct timeval gctv1, gctv2;
     SET_STACK_END;
 
 #ifdef HAVE_NATIVETHREAD
@@ -1339,6 +1675,14 @@
     if (during_gc) return;
     during_gc++;
 
+    if (gc_statistics) {
+        gc_collections++;
+	gettimeofday(&gctv1, NULL);
+        if (verbose_gc_stats) {
+	    fprintf(gc_data_file, "Garbage collection started\n");
+	}
+    }
+
     init_mark_stack();
 
     gc_mark((VALUE)ruby_current_node, 0);
@@ -1414,6 +1758,17 @@
     } while (!MARK_STACK_EMPTY);
 
     gc_sweep();
+
+    if (gc_statistics) {
+        GC_TIME_TYPE musecs_used;
+	gettimeofday(&gctv2, NULL);
+	musecs_used = ((GC_TIME_TYPE)(gctv2.tv_sec - gctv1.tv_sec) * 1000000) + (gctv2.tv_usec - gctv1.tv_usec);
+	gc_time += musecs_used;
+
+	if (verbose_gc_stats) {
+	    fprintf(gc_data_file, "GC time: %d msec\n", musecs_used / 1000);
+	}
+    }
 }
 
 void
@@ -1595,6 +1950,7 @@
     if (!rb_gc_stack_start) {
 	Init_stack(0);
     }
+    set_gc_parameters();
     add_heap();
 }
 
@@ -2064,6 +2420,14 @@
     rb_define_singleton_method(rb_mGC, "disable", rb_gc_disable, 0);
     rb_define_method(rb_mGC, "garbage_collect", rb_gc_start, 0);
 
+    rb_define_singleton_method(rb_mGC, "enable_stats", rb_gc_enable_stats, 0);
+    rb_define_singleton_method(rb_mGC, "disable_stats", rb_gc_disable_stats, 0);
+    rb_define_singleton_method(rb_mGC, "clear_stats", rb_gc_clear_stats, 0);
+    rb_define_singleton_method(rb_mGC, "collections", rb_gc_collections, 0);
+    rb_define_singleton_method(rb_mGC, "time", rb_gc_time, 0);
+    rb_define_singleton_method(rb_mGC, "dump", rb_gc_dump, 0);
+    rb_define_singleton_method(rb_mGC, "log", rb_gc_log, 1);
+
     rb_mObSpace = rb_define_module("ObjectSpace");
     rb_define_module_function(rb_mObSpace, "each_object", os_each_obj, -1);
     rb_define_module_function(rb_mObSpace, "garbage_collect", rb_gc_start, 0);
patches/ruby/1.8.6/hs.patch000066400000077342147511530510011302 0ustar00diff --git a/eval.c b/eval.c
index 4098b83..c70f270 100644
--- a/eval.c
+++ b/eval.c
@@ -73,6 +73,7 @@ char *strrchr _((const char*,const char));
 #endif
 
 #include <time.h>
+#include <sys/mman.h>
 
 #ifdef __BEOS__
 #include <net/socket.h>
@@ -1025,7 +1026,7 @@ static struct tag *prot_tag;
     _tag.blkid = 0;			\
     prot_tag = &_tag
 
-#define PROT_NONE   Qfalse	/* 0 */
+#define PROT_EMPTY  Qfalse	/* 0 */
 #define PROT_THREAD Qtrue	/* 2 */
 #define PROT_FUNC   INT2FIX(0)	/* 1 */
 #define PROT_LOOP   INT2FIX(1)	/* 3 */
@@ -1236,7 +1237,7 @@ error_print()
 
     if (NIL_P(ruby_errinfo)) return;
 
-    PUSH_TAG(PROT_NONE);
+    PUSH_TAG(PROT_EMPTY);
     if (EXEC_TAG() == 0) {
 	errat = get_backtrace(ruby_errinfo);
     }
@@ -1396,7 +1397,7 @@ ruby_init()
     /* default visibility is private at toplevel */
     SCOPE_SET(SCOPE_PRIVATE);
 
-    PUSH_TAG(PROT_NONE);
+    PUSH_TAG(PROT_EMPTY);
     if ((state = EXEC_TAG()) == 0) {
 	rb_call_inits();
 	ruby_class = rb_cObject;
@@ -1530,7 +1531,7 @@ ruby_options(argc, argv)
     int state;
 
     Init_stack((void*)&state);
-    PUSH_TAG(PROT_NONE);
+    PUSH_TAG(PROT_EMPTY);
     if ((state = EXEC_TAG()) == 0) {
 	ruby_process_options(argc, argv);
     }
@@ -1547,7 +1548,7 @@ void rb_exec_end_proc _((void));
 static void
 ruby_finalize_0()
 {
-    PUSH_TAG(PROT_NONE);
+    PUSH_TAG(PROT_EMPTY);
     if (EXEC_TAG() == 0) {
 	rb_trap_exit();
     }
@@ -1585,7 +1586,7 @@ ruby_cleanup(ex)
     Init_stack((void *)&state);
     ruby_finalize_0();
     errs[0] = ruby_errinfo;
-    PUSH_TAG(PROT_NONE);
+    PUSH_TAG(PROT_EMPTY);
     PUSH_ITER(ITER_NOT);
     if ((state = EXEC_TAG()) == 0) {
 	rb_thread_cleanup();
@@ -1636,7 +1637,7 @@ ruby_exec_internal()
 {
     int state;
 
-    PUSH_TAG(PROT_NONE);
+    PUSH_TAG(PROT_EMPTY);
     PUSH_ITER(ITER_NOT);
     /* default visibility is private at toplevel */
     SCOPE_SET(SCOPE_PRIVATE);
@@ -1858,7 +1859,7 @@ rb_eval_cmd(cmd, arg, level)
     }
     if (TYPE(cmd) != T_STRING) {
 	PUSH_ITER(ITER_NOT);
-	PUSH_TAG(PROT_NONE);
+	PUSH_TAG(PROT_EMPTY);
 	ruby_safe_level = level;
 	if ((state = EXEC_TAG()) == 0) {
 	    val = rb_funcall2(cmd, rb_intern("call"), RARRAY(arg)->len, RARRAY(arg)->ptr);
@@ -1880,7 +1881,7 @@ rb_eval_cmd(cmd, arg, level)
 
     ruby_safe_level = level;
 
-    PUSH_TAG(PROT_NONE);
+    PUSH_TAG(PROT_EMPTY);
     if ((state = EXEC_TAG()) == 0) {
 	val = eval(ruby_top_self, cmd, Qnil, 0, 0);
     }
@@ -2387,7 +2388,7 @@ is_defined(self, node, buf)
 	val = self;
 	if (node->nd_recv == (NODE *)1) goto check_bound;
       case NODE_CALL:
-	PUSH_TAG(PROT_NONE);
+	PUSH_TAG(PROT_EMPTY);
 	if ((state = EXEC_TAG()) == 0) {
 	    val = rb_eval(self, node->nd_recv);
 	}
@@ -2489,7 +2490,7 @@ is_defined(self, node, buf)
 	break;
 
       case NODE_COLON2:
-	PUSH_TAG(PROT_NONE);
+	PUSH_TAG(PROT_EMPTY);
 	if ((state = EXEC_TAG()) == 0) {
 	    val = rb_eval(self, node->nd_head);
 	}
@@ -2538,7 +2539,7 @@ is_defined(self, node, buf)
 	goto again;
 
       default:
-	PUSH_TAG(PROT_NONE);
+	PUSH_TAG(PROT_EMPTY);
 	if ((state = EXEC_TAG()) == 0) {
 	    rb_eval(self, node);
 	}
@@ -2742,7 +2743,7 @@ call_trace_func(event, node, self, id, klass)
 	    klass = rb_iv_get(klass, "__attached__");
 	}
     }
-    PUSH_TAG(PROT_NONE);
+    PUSH_TAG(PROT_EMPTY);
     raised = rb_thread_reset_raised(th);
     if ((state = EXEC_TAG()) == 0) {
 	srcfile = rb_str_new2(ruby_sourcefile?ruby_sourcefile:"(ruby)");
@@ -3302,7 +3303,7 @@ rb_eval(self, n)
 	    volatile VALUE e_info = ruby_errinfo;
 	    volatile int rescuing = 0;
 
-	    PUSH_TAG(PROT_NONE);
+	    PUSH_TAG(PROT_EMPTY);
 	    if ((state = EXEC_TAG()) == 0) {
 	      retry_entry:
 		result = rb_eval(self, node->nd_head);
@@ -3351,7 +3352,7 @@ rb_eval(self, n)
 	break;
 
       case NODE_ENSURE:
-	PUSH_TAG(PROT_NONE);
+	PUSH_TAG(PROT_EMPTY);
 	if ((state = EXEC_TAG()) == 0) {
 	    result = rb_eval(self, node->nd_head);
 	}
@@ -3569,7 +3570,7 @@ rb_eval(self, n)
 	    ruby_frame = &frame;
 
 	    PUSH_SCOPE();
-	    PUSH_TAG(PROT_NONE);
+	    PUSH_TAG(PROT_EMPTY);
 	    if (node->nd_rval) {
 		saved_cref = ruby_cref;
 		ruby_cref = (NODE*)node->nd_rval;
@@ -4195,7 +4196,7 @@ module_setup(module, n)
     }
 
     PUSH_CREF(module);
-    PUSH_TAG(PROT_NONE);
+    PUSH_TAG(PROT_EMPTY);
     if ((state = EXEC_TAG()) == 0) {
 	EXEC_EVENT_HOOK(RUBY_EVENT_CLASS, n, ruby_cbase,
 			ruby_frame->last_func, ruby_frame->last_class);
@@ -4602,7 +4603,7 @@ rb_longjmp(tag, mesg)
 	VALUE e = ruby_errinfo;
 	int status;
 
-	PUSH_TAG(PROT_NONE);
+	PUSH_TAG(PROT_EMPTY);
 	if ((status = EXEC_TAG()) == 0) {
 	    StringValue(e);
 	    warn_printf("Exception `%s' at %s:%d - %s\n",
@@ -4974,7 +4975,7 @@ rb_yield_0(val, self, klass, flags, avalue)
     node = block->body;
 
     if (block->var) {
-	PUSH_TAG(PROT_NONE);
+	PUSH_TAG(PROT_EMPTY);
 	if ((state = EXEC_TAG()) == 0) {
 	    if (block->var == (NODE*)1) { /* no parameter || */
 		if (lambda && RARRAY(val)->len != 0) {
@@ -5032,7 +5033,7 @@ rb_yield_0(val, self, klass, flags, avalue)
     ruby_current_node = node;
 
     PUSH_ITER(block->iter);
-    PUSH_TAG(lambda ? PROT_NONE : PROT_YIELD);
+    PUSH_TAG(lambda ? PROT_EMPTY : PROT_YIELD);
     if ((state = EXEC_TAG()) == 0) {
       redo:
 	if (nd_type(node) == NODE_CFUNC || nd_type(node) == NODE_IFUNC) {
@@ -5430,7 +5431,7 @@ rb_rescue2(b_proc, data1, r_proc, data2, va_alist)
     VALUE eclass;
     va_list args;
 
-    PUSH_TAG(PROT_NONE);
+    PUSH_TAG(PROT_EMPTY);
     switch (state = EXEC_TAG()) {
       case TAG_RETRY:
 	if (!handle) break;
@@ -5488,7 +5489,7 @@ rb_protect(proc, data, state)
     VALUE result = Qnil;	/* OK */
     int status;
 
-    PUSH_TAG(PROT_NONE);
+    PUSH_TAG(PROT_EMPTY);
     cont_protect = (VALUE)rb_node_newnode(NODE_MEMO, cont_protect, 0, 0);
     if ((status = EXEC_TAG()) == 0) {
 	result = (*proc)(data);
@@ -5516,7 +5517,7 @@ rb_ensure(b_proc, data1, e_proc, data2)
     volatile VALUE result = Qnil;
     VALUE retval;
 
-    PUSH_TAG(PROT_NONE);
+    PUSH_TAG(PROT_EMPTY);
     if ((state = EXEC_TAG()) == 0) {
 	result = (*b_proc)(data1);
     }
@@ -5543,7 +5544,7 @@ rb_with_disable_interrupt(proc, data)
 	int thr_critical = rb_thread_critical;
 
 	rb_thread_critical = Qtrue;
-	PUSH_TAG(PROT_NONE);
+	PUSH_TAG(PROT_EMPTY);
 	if ((status = EXEC_TAG()) == 0) {
 	    result = (*proc)(data);
 	}
@@ -6230,7 +6231,7 @@ rb_funcall_rescue(recv, mid, n, va_alist)
 
     va_init_list(ar, n);
 
-    PUSH_TAG(PROT_NONE);
+    PUSH_TAG(PROT_EMPTY);
     if ((status = EXEC_TAG()) == 0) {
 	result = vafuncall(recv, mid, n, &ar);
     }
@@ -6499,7 +6500,7 @@ eval(self, src, scope, file, line)
     if (TYPE(ruby_class) == T_ICLASS) {
 	ruby_class = RBASIC(ruby_class)->klass;
     }
-    PUSH_TAG(PROT_NONE);
+    PUSH_TAG(PROT_EMPTY);
     if ((state = EXEC_TAG()) == 0) {
 	NODE *node;
 
@@ -6658,7 +6659,7 @@ exec_under(func, under, cbase, args)
 
     mode = scope_vmode;
     SCOPE_SET(SCOPE_PUBLIC);
-    PUSH_TAG(PROT_NONE);
+    PUSH_TAG(PROT_EMPTY);
     if ((state = EXEC_TAG()) == 0) {
 	val = (*func)(args);
     }
@@ -6889,7 +6890,7 @@ rb_load(fname, wrap)
     PUSH_SCOPE();
     /* default visibility is private at loading toplevel */
     SCOPE_SET(SCOPE_PRIVATE);
-    PUSH_TAG(PROT_NONE);
+    PUSH_TAG(PROT_EMPTY);
     state = EXEC_TAG();
     last_func = ruby_frame->last_func;
     last_node = ruby_current_node;
@@ -6948,7 +6949,7 @@ rb_load_protect(fname, wrap, state)
 {
     int status;
 
-    PUSH_TAG(PROT_NONE);
+    PUSH_TAG(PROT_EMPTY);
     if ((status = EXEC_TAG()) == 0) {
 	rb_load(fname, wrap);
     }
@@ -7269,7 +7270,7 @@ rb_require_safe(fname, safe)
     saved.node = ruby_current_node;
     saved.func = ruby_frame->last_func;
     saved.safe = ruby_safe_level;
-    PUSH_TAG(PROT_NONE);
+    PUSH_TAG(PROT_EMPTY);
     if ((state = EXEC_TAG()) == 0) {
 	VALUE feature, path;
 	long handle;
@@ -7977,7 +7978,7 @@ rb_exec_end_proc()
 	tmp_end_procs = link = ephemeral_end_procs;
 	ephemeral_end_procs = 0;
 	while (link) {
-	    PUSH_TAG(PROT_NONE);
+	    PUSH_TAG(PROT_EMPTY);
 	    if ((status = EXEC_TAG()) == 0) {
 		ruby_safe_level = link->safe;
 		(*link->func)(link->data);
@@ -7995,7 +7996,7 @@ rb_exec_end_proc()
 	tmp_end_procs = link = end_procs;
 	end_procs = 0;
 	while (link) {
-	    PUSH_TAG(PROT_NONE);
+	    PUSH_TAG(PROT_EMPTY);
 	    if ((status = EXEC_TAG()) == 0) {
 		ruby_safe_level = link->safe;
 		(*link->func)(link->data);
@@ -8654,7 +8655,7 @@ proc_invoke(proc, args, self, klass)
     ruby_block = &_block;
     PUSH_ITER(ITER_CUR);
     ruby_frame->iter = ITER_CUR;
-    PUSH_TAG(pcall ? PROT_LAMBDA : PROT_NONE);
+    PUSH_TAG(pcall ? PROT_LAMBDA : PROT_EMPTY);
     state = EXEC_TAG();
     if (state == 0) {
 	proc_set_safe_level(proc);
@@ -9896,6 +9897,7 @@ win32_set_exception_list(p)
 int rb_thread_pending = 0;
 
 VALUE rb_cThread;
+static unsigned int rb_thread_stack_size;
 
 extern VALUE rb_last_status;
 
@@ -10123,12 +10125,20 @@ thread_mark(th)
     rb_gc_mark(th->thread);
     if (th->join) rb_gc_mark(th->join->thread);
 
-    rb_gc_mark(th->klass);
-    rb_gc_mark(th->wrapper);
-    rb_gc_mark((VALUE)th->cref);
+    if (curr_thread == th) {
+      rb_gc_mark(ruby_class);
+      rb_gc_mark(ruby_wrapper);
+      rb_gc_mark((VALUE)ruby_cref);
+      rb_gc_mark((VALUE)ruby_scope);
+      rb_gc_mark((VALUE)ruby_dyna_vars);
+    } else {
+      rb_gc_mark(th->klass);
+      rb_gc_mark(th->wrapper);
+      rb_gc_mark((VALUE)th->cref);
+      rb_gc_mark((VALUE)th->scope);
+      rb_gc_mark((VALUE)th->dyna_vars);
+    }
 
-    rb_gc_mark((VALUE)th->scope);
-    rb_gc_mark((VALUE)th->dyna_vars);
     rb_gc_mark(th->errinfo);
     rb_gc_mark(th->last_status);
     rb_gc_mark(th->last_line);
@@ -10138,11 +10148,11 @@ thread_mark(th)
     rb_gc_mark_maybe(th->sandbox);
 
     /* mark data in copied stack */
-    if (th == curr_thread) return;
+    if (th == main_thread) return;
     if (th->status == THREAD_KILLED) return;
     if (th->stk_len == 0) return;  /* stack not active, no need to mark. */
-    if (th->stk_ptr) {
-	rb_gc_mark_locations(th->stk_ptr, th->stk_ptr+th->stk_len);
+    if (th->stk_ptr && th != curr_thread) {
+      rb_gc_mark_locations(th->stk_pos, th->stk_base);
 #if defined(THINK_C) || defined(__human68k__)
 	rb_gc_mark_locations(th->stk_ptr+2, th->stk_ptr+th->stk_len+2);
 #endif
@@ -10152,24 +10162,30 @@ thread_mark(th)
 	}
 #endif
     }
-    frame = th->frame;
+
+    if (curr_thread == th)
+      frame = ruby_frame;
+    else
+      frame = th->frame;
+
     while (frame && frame != top_frame) {
-	frame = ADJ(frame);
 	rb_gc_mark_frame(frame);
 	if (frame->tmp) {
 	    struct FRAME *tmp = frame->tmp;
-
 	    while (tmp && tmp != top_frame) {
-		tmp = ADJ(tmp);
 		rb_gc_mark_frame(tmp);
 		tmp = tmp->prev;
 	    }
 	}
 	frame = frame->prev;
     }
-    block = th->block;
+
+    if (curr_thread == th)
+      block = ruby_block;
+    else
+      block = th->block;
+
     while (block) {
-	block = ADJ(block);
 	rb_gc_mark_frame(&block->frame);
 	block = block->prev;
     }
@@ -10232,7 +10248,7 @@ static inline void
 stack_free(th)
     rb_thread_t th;
 {
-    if (th->stk_ptr) free(th->stk_ptr);
+  if (th->stk_ptr) munmap(th->stk_ptr, th->stk_size);
     th->stk_ptr = 0;
 #ifdef __ia64
     if (th->bstr_ptr) free(th->bstr_ptr);
@@ -10293,35 +10309,8 @@ rb_thread_save_context(th)
     static VALUE tval;
 
     len = ruby_stack_length(&pos);
-    th->stk_len = 0;
-    th->stk_pos = pos;
-    if (len > th->stk_max) {
-	VALUE *ptr = realloc(th->stk_ptr, sizeof(VALUE) * len);
-	if (!ptr) rb_memerror();
-	th->stk_ptr = ptr;
-	th->stk_max = len;
-    }
     th->stk_len = len;
-    FLUSH_REGISTER_WINDOWS;
-    MEMCPY(th->stk_ptr, th->stk_pos, VALUE, th->stk_len);
-#ifdef __ia64
-    th->bstr_pos = rb_gc_register_stack_start;
-    len = (VALUE*)rb_ia64_bsp() - th->bstr_pos;
-    th->bstr_len = 0;
-    if (len > th->bstr_max) {
-        VALUE *ptr = realloc(th->bstr_ptr, sizeof(VALUE) * len);
-        if (!ptr) rb_memerror();
-        th->bstr_ptr = ptr;
-        th->bstr_max = len;
-    }
-    th->bstr_len = len;
-    rb_ia64_flushrs();
-    MEMCPY(th->bstr_ptr, th->bstr_pos, VALUE, th->bstr_len);
-#endif
-#ifdef SAVE_WIN32_EXCEPTION_LIST
-    th->win32_exception_list = win32_get_exception_list();
-#endif
-
+    th->stk_pos = pos;
     th->frame = ruby_frame;
     th->scope = ruby_scope;
     ruby_scope->flags |= SCOPE_DONT_RECYCLE;
@@ -10431,11 +10420,6 @@ rb_thread_restore_context_0(rb_thread_t th, int exit)
 #endif
     tmp = th;
     ex = exit;
-    FLUSH_REGISTER_WINDOWS;
-    MEMCPY(tmp->stk_pos, tmp->stk_ptr, VALUE, tmp->stk_len);
-#ifdef __ia64
-    MEMCPY(tmp->bstr_pos, tmp->bstr_ptr, VALUE, tmp->bstr_len);
-#endif
 
     tval = rb_lastline_get();
     rb_lastline_set(tmp->last_line);
@@ -10526,8 +10510,8 @@ rb_thread_restore_context(th, exit)
     rb_thread_t th;
     int exit;
 {
-    if (!th->stk_ptr) rb_bug("unsaved context");
-    stack_extend(th, exit);
+    if (!th->stk_ptr && th != main_thread) rb_bug("unsaved context");
+    rb_thread_restore_context_0(th, exit);
 }
 
 static void
@@ -10546,7 +10530,6 @@ rb_thread_die(th)
 {
     th->thgroup = 0;
     th->status = THREAD_KILLED;
-    stack_free(th);
 }
 
 static void
@@ -11822,6 +11805,7 @@ rb_thread_group(thread)
 \
     th->stk_ptr = 0;\
     th->stk_len = 0;\
+    th->stk_size = 0;\
     th->stk_max = 0;\
     th->wait_for = 0;\
     IA64_INIT(th->bstr_ptr = 0);\
@@ -11869,6 +11853,48 @@ rb_thread_alloc(klass)
     THREAD_ALLOC(th);
     th->thread = Data_Wrap_Struct(klass, thread_mark, thread_free, th);
 
+    /* if main_thread != NULL, then this is NOT the main thread, so
+     * we create a heap-stack
+     */
+    if (main_thread) {
+      /* Allocate stack, don't forget to add 1 extra word because of the MATH below */
+      unsigned int pagesize = getpagesize();
+      unsigned int total_size = rb_thread_stack_size + pagesize + sizeof(int);
+      void *stack_area = NULL;
+
+      stack_area = mmap(NULL, total_size, PROT_READ | PROT_WRITE | PROT_EXEC,
+			MAP_PRIVATE | MAP_ANON, -1, 0);
+
+      if (stack_area == MAP_FAILED) {
+	fprintf(stderr, "Thread stack allocation failed!\n");
+	rb_memerror();
+      }
+
+      th->stk_ptr = th->stk_pos = stack_area;
+      th->stk_size = total_size;
+
+      if (mprotect(th->stk_ptr, pagesize, PROT_NONE) == -1) {
+	fprintf(stderr, "Failed to create thread guard region: %s\n", strerror(errno));
+	rb_memerror();
+      }
+
+      th->guard = th->stk_ptr + (pagesize/sizeof(VALUE *));
+
+      /* point stk_base at the top of the stack */
+      /* ASSUMPTIONS:
+       * 1.) The address returned by malloc is "suitably aligned" for anything on this system
+       * 2.) Adding a value that is "aligned" for this platform should not unalign the address
+       *     returned from malloc.
+       * 3.) Don't push anything on to the stack, otherwise it'll get unaligned.
+       * 4.) x86_64 ABI says aligned AFTER arguments have been pushed. You *must* then do a call[lq]
+       *     or push[lq] something else on to the stack if you inted to do a ret.
+       */
+      th->stk_base = th->stk_ptr + ((total_size - sizeof(int))/sizeof(VALUE *));
+      th->stk_len = rb_thread_stack_size;
+    } else {
+      th->stk_ptr = th->stk_pos = rb_gc_stack_start;
+    }
+
     for (vars = th->dyna_vars; vars; vars = vars->next) {
 	if (FL_TEST(vars, DVAR_DONT_RECYCLE)) break;
 	FL_SET(vars, DVAR_DONT_RECYCLE);
@@ -12014,17 +12040,22 @@ rb_thread_cancel_timer()
 }
 #endif
 
+struct thread_start_args {
+  VALUE (*fn)();
+  void *arg;
+  rb_thread_t th;
+} new_th;
+
+static VALUE
+rb_thread_start_2();
+
 static VALUE
 rb_thread_start_0(fn, arg, th)
     VALUE (*fn)();
     void *arg;
     rb_thread_t th;
 {
-    volatile rb_thread_t th_save = th;
     volatile VALUE thread = th->thread;
-    struct BLOCK *volatile saved_block = 0;
-    enum rb_thread_status status;
-    int state;
 
     if (OBJ_FROZEN(curr_thread->thgroup)) {
 	rb_raise(rb_eThreadError,
@@ -12054,16 +12085,41 @@ rb_thread_start_0(fn, arg, th)
 	return thread;
     }
 
-    if (ruby_block) {		/* should nail down higher blocks */
-	struct BLOCK dummy;
+    new_th.fn = fn;
+    new_th.arg = arg;
+    new_th.th = th;
+
+#if defined(__i386__)
+    __asm__ __volatile__ ("movl %0, %%esp\n\t"
+                          "calll *%1\n"
+                          :: "r" (th->stk_base),
+                             "r" (rb_thread_start_2));
+#elif defined(__x86_64__)
+    __asm__ __volatile__ ("movq %0, %%rsp\n\t"
+                          "callq *%1\n"
+                          :: "r" (th->stk_base),
+                             "r" (rb_thread_start_2));
+#else
+    #error unsupported architecture!
+#endif
+    /* NOTREACHED */
+    return 0;
+}
 
-	dummy.prev = ruby_block;
-	blk_copy_prev(&dummy);
-	saved_block = ruby_block = dummy.prev;
-    }
-    scope_dup(ruby_scope);
+static VALUE
+rb_thread_start_2()
+{
+   volatile rb_thread_t th = new_th.th;
+   volatile rb_thread_t th_save = th;
+   volatile VALUE thread = th->thread;
+   struct BLOCK *volatile saved_block = 0;
+   enum rb_thread_status status;
+   int state;
+   struct tag *tag;
+   struct RVarmap *vars;
+   struct FRAME dummy_frame;
 
-    if (!th->next) {
+   if (!th->next) {
 	/* merge in thread list */
 	th->prev = curr_thread;
 	curr_thread->next->prev = th;
@@ -12071,13 +12127,27 @@ rb_thread_start_0(fn, arg, th)
 	curr_thread->next = th;
 	th->priority = curr_thread->priority;
 	th->thgroup = curr_thread->thgroup;
+   }
+   curr_thread = th;
+
+   dummy_frame = *ruby_frame;
+   dummy_frame.prev = top_frame;
+   ruby_frame = &dummy_frame;
+
+   if (ruby_block) {		/* should nail down higher blocks */
+	struct BLOCK dummy;
+
+	dummy.prev = ruby_block;
+	blk_copy_prev(&dummy);
+	saved_block = ruby_block = dummy.prev;
     }
 
+    scope_dup(ruby_scope);
+
     PUSH_TAG(PROT_THREAD);
     if ((state = EXEC_TAG()) == 0) {
 	if (THREAD_SAVE_CONTEXT(th) == 0) {
-	    curr_thread = th;
-	    th->result = (*fn)(arg, th);
+	    th->result = (*new_th.fn)(new_th.arg, th);
 	}
 	th = th_save;
     }
@@ -12414,6 +12484,43 @@ rb_thread_cleanup()
     END_FOREACH_FROM(curr, th);
 }
 
+/*
+ * call-seq:
+ *    Thread.stack_size    => fixnum
+ *
+ * Returns the thread stack size in bytes
+ */
+static VALUE
+rb_thread_stacksize_get()
+{
+  return INT2FIX(rb_thread_stack_size);
+}
+
+/*
+ * call-seq:
+ *    Thread.stack_size= fixnum => Qnil
+ *
+ * Sets the global thread stacksize and returns Qnil.
+ */
+static VALUE
+rb_thread_stacksize_set(obj, val)
+     VALUE obj;
+     VALUE val;
+{
+
+  unsigned int size = FIX2UINT(val);
+
+  /* 16byte alignment works for both x86 and x86_64 */
+  if (size & (~0xf)) {
+    size += 0x10;
+    size = size & (~0xf);
+  }
+
+  rb_thread_stack_size = size;
+
+  return Qnil;
+}
+
 int rb_thread_critical;
 
 
@@ -13167,6 +13274,8 @@ Init_Thread()
 {
     VALUE cThGroup;
 
+    rb_thread_stack_size = (1024 * 1024);
+
     rb_eThreadError = rb_define_class("ThreadError", rb_eStandardError);
     rb_cThread = rb_define_class("Thread", rb_cObject);
     rb_undef_alloc_func(rb_cThread);
@@ -13190,6 +13299,9 @@ Init_Thread()
     rb_define_singleton_method(rb_cThread, "abort_on_exception", rb_thread_s_abort_exc, 0);
     rb_define_singleton_method(rb_cThread, "abort_on_exception=", rb_thread_s_abort_exc_set, 1);
 
+    rb_define_singleton_method(rb_cThread, "stack_size", rb_thread_stacksize_get, 0);
+    rb_define_singleton_method(rb_cThread, "stack_size=", rb_thread_stacksize_set, 1);
+
     rb_define_method(rb_cThread, "run", rb_thread_run, 0);
     rb_define_method(rb_cThread, "wakeup", rb_thread_wakeup, 0);
     rb_define_method(rb_cThread, "kill", rb_thread_kill, 0);
diff --git a/gc.c b/gc.c
index 318e24c..0746834 100644
--- a/gc.c
+++ b/gc.c
@@ -466,12 +466,12 @@ stack_end_address(VALUE **stack_end_p)
 # define STACK_END (stack_end)
 #endif
 #if STACK_GROW_DIRECTION < 0
-# define STACK_LENGTH  (rb_gc_stack_start - STACK_END)
+# define STACK_LENGTH(start)  ((start) - STACK_END)
 #elif STACK_GROW_DIRECTION > 0
-# define STACK_LENGTH  (STACK_END - rb_gc_stack_start + 1)
+# define STACK_LENGTH(start)  (STACK_END - (start) + 1)
 #else
-# define STACK_LENGTH  ((STACK_END < rb_gc_stack_start) ? rb_gc_stack_start - STACK_END\
-                                           : STACK_END - rb_gc_stack_start + 1)
+# define STACK_LENGTH(start)  ((STACK_END < (start)) ? (start) - STACK_END\
+                                           : STACK_END - (start) + 1)
 #endif
 #if STACK_GROW_DIRECTION > 0
 # define STACK_UPPER(x, a, b) a
@@ -494,27 +494,36 @@ stack_grow_direction(addr)
 
 #define GC_WATER_MARK 512
 
-#define CHECK_STACK(ret) do {\
+#define CHECK_STACK(ret, start) do {\
     SET_STACK_END;\
-    (ret) = (STACK_LENGTH > STACK_LEVEL_MAX + GC_WATER_MARK);\
+    (ret) = (STACK_LENGTH(start) > STACK_LEVEL_MAX + GC_WATER_MARK);\
 } while (0)
 
 size_t
 ruby_stack_length(p)
     VALUE **p;
 {
-    SET_STACK_END;
-    if (p) *p = STACK_UPPER(STACK_END, rb_gc_stack_start, STACK_END);
-    return STACK_LENGTH;
+  SET_STACK_END;
+  VALUE *start;
+  if (rb_curr_thread == rb_main_thread) {
+    start = rb_gc_stack_start;
+  } else {
+    start = rb_curr_thread->stk_base;
+  }
+  if (p) *p = STACK_UPPER(STACK_END, start, STACK_END);
+  return STACK_LENGTH(start);
 }
 
 int
 ruby_stack_check()
 {
-    int ret;
-
-    CHECK_STACK(ret);
-    return ret;
+  int ret;
+  if (rb_curr_thread == rb_main_thread) {
+    CHECK_STACK(ret, rb_gc_stack_start);
+  } else {
+    CHECK_STACK(ret, rb_curr_thread->stk_base);
+  }
+  return ret;
 }
 
 #define MARK_STACK_MAX 1024
@@ -1404,10 +1413,13 @@ garbage_collect()
 
     init_mark_stack();
 
-    gc_mark((VALUE)ruby_current_node, 0);
-
     /* mark frame stack */
-    for (frame = ruby_frame; frame; frame = frame->prev) {
+    if (rb_curr_thread == rb_main_thread)
+      frame = ruby_frame;
+    else
+      frame = rb_main_thread->frame;
+
+    for (; frame; frame = frame->prev) {
 	rb_gc_mark_frame(frame);
 	if (frame->tmp) {
 	    struct FRAME *tmp = frame->tmp;
@@ -1417,16 +1429,35 @@ garbage_collect()
 	    }
 	}
     }
-    gc_mark((VALUE)ruby_scope, 0);
-    gc_mark((VALUE)ruby_dyna_vars, 0);
+
+    if (rb_curr_thread == rb_main_thread) {
+      gc_mark((VALUE)ruby_current_node, 0);
+      gc_mark((VALUE)ruby_scope, 0);
+      gc_mark((VALUE)ruby_dyna_vars, 0);
+    } else {
+      gc_mark((VALUE)rb_main_thread->node, 0);
+      gc_mark((VALUE)rb_main_thread->scope, 0);
+      gc_mark((VALUE)rb_main_thread->dyna_vars, 0);
+
+      /* scan the current thread's stack */
+      rb_gc_mark_locations((VALUE*)STACK_END, rb_curr_thread->stk_base);
+    }
+
     if (finalizer_table) {
-	mark_tbl(finalizer_table, 0);
+      mark_tbl(finalizer_table, 0);
     }
 
     FLUSH_REGISTER_WINDOWS;
     /* This assumes that all registers are saved into the jmp_buf (and stack) */
     setjmp(save_regs_gc_mark);
     mark_locations_array((VALUE*)save_regs_gc_mark, sizeof(save_regs_gc_mark) / sizeof(VALUE *));
+
+    /* If this is not the main thread, we need to scan the C stack, so
+     * set STACK_END to the end of the C stack.
+     */
+    if (rb_curr_thread != rb_main_thread)
+      STACK_END = rb_main_thread->stk_pos;
+
 #if STACK_GROW_DIRECTION < 0
     rb_gc_mark_locations((VALUE*)STACK_END, rb_gc_stack_start);
 #elif STACK_GROW_DIRECTION > 0
@@ -1446,6 +1477,7 @@ garbage_collect()
     rb_gc_mark_locations((VALUE*)((char*)STACK_END + 2),
 			 (VALUE*)((char*)rb_gc_stack_start + 2));
 #endif
+
     rb_gc_mark_threads();
 
     /* mark protected global variables */
diff --git a/lib/logger.rb b/lib/logger.rb
index e9ab171..2564c33 100644
--- a/lib/logger.rb
+++ b/lib/logger.rb
@@ -170,7 +170,7 @@ require 'monitor'
 
 class Logger
   VERSION = "1.2.6"
-  id, name, rev = %w$Id$
+  id, name, rev = %w$Id logger.rb 1234$
   ProgName = "#{name.chomp(",v")}/#{rev}"
 
   class Error < RuntimeError; end
diff --git a/node.h b/node.h
index 476a826..ecdc053 100644
--- a/node.h
+++ b/node.h
@@ -411,8 +411,11 @@ struct rb_thread {
 
     size_t stk_len;
     size_t stk_max;
+    size_t stk_size;
     VALUE *stk_ptr;
     VALUE *stk_pos;
+    VALUE *stk_base;
+    VALUE *guard;
 #ifdef __ia64
     size_t bstr_len;
     size_t bstr_max;
diff --git a/signal.c b/signal.c
index b6cad9d..116ac05 100644
--- a/signal.c
+++ b/signal.c
@@ -14,6 +14,7 @@
 
 #include "ruby.h"
 #include "rubysig.h"
+#include "node.h"
 #include <signal.h>
 #include <stdio.h>
 
@@ -425,15 +426,22 @@ typedef RETSIGTYPE (*sighandler_t)_((int));
 static sighandler_t
 ruby_signal(signum, handler)
     int signum;
-    sighandler_t handler;
+    void *handler;
 {
     struct sigaction sigact, old;
 
     rb_trap_accept_nativethreads[signum] = 0;
 
-    sigact.sa_handler = handler;
+    if (signum == SIGSEGV || signum == SIGBUS) {
+      sigact.sa_sigaction = handler;
+      sigact.sa_flags = (SA_ONSTACK | SA_RESETHAND | SA_SIGINFO);
+    } else {
+      sigact.sa_handler = handler;
+      sigact.sa_flags = 0;
+    }
+
     sigemptyset(&sigact.sa_mask);
-    sigact.sa_flags = 0;
+
 # ifdef SA_NOCLDWAIT
     if (signum == SIGCHLD && handler == SIG_IGN)
 	sigact.sa_flags |= SA_NOCLDWAIT;
@@ -596,7 +604,132 @@ sighandler(sig)
     }
 }
 
+#include <stdio.h>
+#ifdef HAVE_STDARG_PROTOTYPES
+#include <stdarg.h>
+#define va_init_list(a,b) va_start(a,b)
+#else
+#include <varargs.h>
+#define va_init_list(a,b) va_start(a)
+#endif
+
+void
+#ifdef HAVE_STDARG_PROTOTYPES
+sig_printf(const char *fmt, ...)
+#else
+  sig_printf(fmt, va_alist)
+     const char *fmt;
+    va_dcl
+#endif
+{
+  char buf[BUFSIZ];
+  va_list args;
+  FILE *out = stderr;
+
+  va_init_list(args, fmt);
+  vfprintf(out, fmt, args);
+  va_end(args);
+  fprintf(out, "\n");
+}
+
+static void
+dump_machine_state(uc)
+     ucontext_t *uc;
+{
+  const char *dump64 =
+    " ----------------- Register state dump ----------------------\n"
+    "rax = 0x%.16x  rbx    = 0x%.16x  rcx = 0x%.16x  rdx = 0x%.16x\n"
+    "rdi = 0x%.16x  rsi    = 0x%.16x  rbp = 0x%.16x  rsp = 0x%.16x\n"
+    "r8  = 0x%.16x  r9     = 0x%.16x  r10 = 0x%.16x  r11 = 0x%.16x\n"
+    "r12 = 0x%.16x  r13    = 0x%.16x  r14 = 0x%.16x  r15 = 0x%.16x\n"
+    "rip = 0x%.16x  rflags = 0x%.16x  cs  = 0x%.16x  fs  = 0x%.16x\n"
+    "gs  = 0x%.16x";
+
+  const char *dump32 =
+    " ----------------- Register state dump -------------------\n"
+    "eax = 0x%.8x  ebx    = 0x%.8x  ecx = 0x%.8x  edx = 0x%.8x\n"
+    "edi = 0x%.8x  esi    = 0x%.8x  ebp = 0x%.8x  esp = 0x%.8x\n"
+    "ss  = 0x%.8x  eflags = 0x%.8x  eip = 0x%.8x  cs  = 0x%.8x\n"
+    "ds  = 0x%.8x  es     = 0x%.8x  fs  = 0x%.8x  gs  = 0x%.8x\n";
+
+#if defined(__LP64__) && defined(__APPLE__)
+  sig_printf(dump64, uc->uc_mcontext->__ss.__rax, uc->uc_mcontext->__ss.__rbx,
+	     uc->uc_mcontext->__ss.__rcx, uc->uc_mcontext->__ss.__rdx, uc->uc_mcontext->__ss.__rdi,
+	     uc->uc_mcontext->__ss.__rsi, uc->uc_mcontext->__ss.__rbp, uc->uc_mcontext->__ss.__rsp,
+	     uc->uc_mcontext->__ss.__r8, uc->uc_mcontext->__ss.__r9, uc->uc_mcontext->__ss.__r10,
+	     uc->uc_mcontext->__ss.__r11, uc->uc_mcontext->__ss.__r12, uc->uc_mcontext->__ss.__r13,
+	     uc->uc_mcontext->__ss.__r14, uc->uc_mcontext->__ss.__r15, uc->uc_mcontext->__ss.__rip,
+	     uc->uc_mcontext->__ss.__rflags, uc->uc_mcontext->__ss.__cs, uc->uc_mcontext->__ss.__fs,
+	     uc->uc_mcontext->__ss.__gs);
+#elif !defined(__LP64__) && defined(__APPLE__)
+  sig_printf(dump32, uc->uc_mcontext->__ss.__eax, uc->uc_mcontext->__ss.__ebx,
+	     uc->uc_mcontext->__ss.__ecx, uc->uc_mcontext->__ss.__edx,
+	     uc->uc_mcontext->__ss.__edi, uc->uc_mcontext->__ss.__esi,
+	     uc->uc_mcontext->__ss.__ebp, uc->uc_mcontext->__ss.__esp,
+	     uc->uc_mcontext->__ss.__ss, uc->uc_mcontext->__ss.__eflags,
+	     uc->uc_mcontext->__ss.__eip, uc->uc_mcontext->__ss.__cs,
+	     uc->uc_mcontext->__ss.__ds, uc->uc_mcontext->__ss.__es,
+	     uc->uc_mcontext->__ss.__fs, uc->uc_mcontext->__ss.__gs);
+#elif defined(__i386__)
+  sig_printf(dump32, uc->uc_mcontext.gregs[REG_EAX], uc->uc_mcontext.gregs[REG_EBX],
+	     uc->uc_mcontext.gregs[REG_ECX], uc->uc_mcontext.gregs[REG_EDX],
+	     uc->uc_mcontext.gregs[REG_EDI], uc->uc_mcontext.gregs[REG_ESI],
+	     uc->uc_mcontext.gregs[REG_EBP], uc->uc_mcontext.gregs[REG_ESP],
+	     uc->uc_mcontext.gregs[REG_SS], uc->uc_mcontext.gregs[REG_EFL],
+	     uc->uc_mcontext.gregs[REG_EIP], uc->uc_mcontext.gregs[REG_EIP],
+	     uc->uc_mcontext.gregs[REG_DS], uc->uc_mcontext.gregs[REG_ES],
+	     uc->uc_mcontext.gregs[REG_FS], uc->uc_mcontext.gregs[REG_FS]);
+#elif defined(__x86_64__)
+  sig_printf(dump64, uc->uc_mcontext.gregs[REG_RAX], uc->uc_mcontext.gregs[REG_RBX],
+	     uc->uc_mcontext.gregs[REG_RCX], uc->uc_mcontext.gregs[REG_RDX],
+	     uc->uc_mcontext.gregs[REG_RDI], uc->uc_mcontext.gregs[REG_RSI],
+	     uc->uc_mcontext.gregs[REG_RBP], uc->uc_mcontext.gregs[REG_RSP],
+	     uc->uc_mcontext.gregs[REG_R8], uc->uc_mcontext.gregs[REG_R9],
+	     uc->uc_mcontext.gregs[REG_R10], uc->uc_mcontext.gregs[REG_R11],
+	     uc->uc_mcontext.gregs[REG_R12], uc->uc_mcontext.gregs[REG_R13],
+	     uc->uc_mcontext.gregs[REG_R14], uc->uc_mcontext.gregs[REG_R15],
+	     uc->uc_mcontext.gregs[REG_RIP], uc->uc_mcontext.gregs[REG_EFL],
+	     uc->uc_mcontext.gregs[REG_CSGSFS]);
+#else
+#endif
+}
+
+static int
+check_guard(caddr_t fault_addr, rb_thread_t th) {
+  if(fault_addr <= (caddr_t)rb_curr_thread->guard &&
+     fault_addr >= (caddr_t)rb_curr_thread->stk_ptr) {
+    return 1;
+  }
+  return 0;
+}
+
 #ifdef SIGBUS
+#ifdef POSIX_SIGNAL
+static void sigbus _((int, siginfo_t*, void*));
+static void
+sigbus(sig, ip, context)
+     int sig;
+     siginfo_t *ip;
+     void *context;
+{
+#if defined(HAVE_NATIVETHREAD) && defined(HAVE_NATIVETHREAD_KILL)
+  if (!is_ruby_native_thread() && !rb_trap_accept_nativethreads[sig]) {
+    sigsend_to_ruby_thread(sig);
+    return;
+  }
+#endif
+
+  dump_machine_state(context);
+  if (check_guard((caddr_t)ip->si_addr, rb_curr_thread)) {
+    /* we hit the guard page, print out a warning to help app developers */
+    rb_bug("Thread stack overflow! Try increasing it!");
+  } else {
+    rb_bug("Bus Error");
+  }
+}
+
+#else /* !defined(POSIX_SIGNAL) */
+
 static RETSIGTYPE sigbus _((int));
 static RETSIGTYPE
 sigbus(sig)
@@ -612,8 +745,36 @@ sigbus(sig)
     rb_bug("Bus Error");
 }
 #endif
+#endif
+
 
 #ifdef SIGSEGV
+#ifdef POSIX_SIGNAL
+static void sigsegv _((int, siginfo_t*, void*));
+static void
+sigsegv(sig, ip, context)
+     int sig;
+     siginfo_t *ip;
+     void *context;
+{
+#if defined(HAVE_NATIVETHREAD) && defined(HAVE_NATIVETHREAD_KILL)
+  if (!is_ruby_native_thread() && !rb_trap_accept_nativethreads[sig]) {
+    sigsend_to_ruby_thread(sig);
+    return;
+  }
+#endif
+
+  dump_machine_state(context);
+  if (check_guard((caddr_t)ip->si_addr, rb_curr_thread)) {
+    /* we hit the guard page, print out a warning to help app developers */
+    rb_bug("Thread stack overflow! Try increasing it!");
+  } else {
+    rb_bug("Segmentation fault");
+  }
+}
+
+#else /* !defined(POSIX_SIGNAL) */
+
 static RETSIGTYPE sigsegv _((int));
 static RETSIGTYPE
 sigsegv(sig)
@@ -629,6 +790,7 @@ sigsegv(sig)
     rb_bug("Segmentation fault");
 }
 #endif
+#endif
 
 #ifdef SIGPIPE
 static RETSIGTYPE sigpipe _((int));
@@ -698,7 +860,8 @@ static VALUE
 trap(arg)
     struct trap_arg *arg;
 {
-    sighandler_t func, oldfunc;
+    sighandler_t oldfunc;
+    void *func;
     VALUE command, oldcmd;
     int sig = -1;
     char *s;
@@ -945,6 +1108,20 @@ sig_list()
 }
 
 static void
+create_sigstack()
+{
+  stack_t ss;
+  ss.ss_size = SIGSTKSZ;
+  ss.ss_sp = malloc(ss.ss_size);
+  ss.ss_flags = 0;
+  if (sigaltstack(&ss, NULL) < 0) {
+    free(ss.ss_sp);
+    fprintf(stderr, "Couldn't create signal stack! Error %d: %s\n", errno, strerror(errno));
+    exit(1);
+  }
+}
+
+static void
 install_sighandler(signum, handler)
     int signum;
     sighandler_t handler;
@@ -953,7 +1130,7 @@ install_sighandler(signum, handler)
 
     old = ruby_signal(signum, handler);
     if (old != SIG_DFL) {
-	ruby_signal(signum, old);
+       ruby_signal(signum, old);
     }
 }
 
@@ -1080,6 +1257,8 @@ Init_signal()
     rb_alias(rb_eSignal, rb_intern("signm"), rb_intern("message"));
     rb_define_method(rb_eInterrupt, "initialize", interrupt_init, 1);
 
+    create_sigstack();
+
     install_sighandler(SIGINT, sighandler);
 #ifdef SIGHUP
     install_sighandler(SIGHUP, sighandler);
patches/ruby/1.8.6/syck.patch000066400000001147147511530510011627 0ustar00diff --git a/ext/syck/rubyext.c b/ext/syck/rubyext.c
index 078de4f..8c4027f 100644
--- a/ext/syck/rubyext.c
+++ b/ext/syck/rubyext.c
@@ -268,9 +268,13 @@ rb_syck_mktime(str, len)
     {
         char padded[] = "000000";
         char *end = ptr + 1;
+        char *p = end;
         while ( isdigit( *end ) ) end++;
-        MEMCPY(padded, ptr + 1, char, end - (ptr + 1));
-        usec = strtol(padded, NULL, 10);
+        if (end - p < sizeof(padded)) {
+            MEMCPY(padded, ptr + 1, char, end - (ptr + 1));
+            p = padded;
+        }
+        usec = strtol(p, NULL, 10);
     }
     else
     {
patches/ruby/1.8.6/osx-arch-fix.patch000066400000000617147511530510013167 0ustar00diff --git a/Makefile.in b/Makefile.in
index 656ae90..f976cf1 100644
--- a/Makefile.in
+++ b/Makefile.in
@@ -45,7 +45,7 @@ XLDFLAGS = @XLDFLAGS@ $(EXTLDFLAGS)
 EXTLIBS = 
 LIBS = @LIBS@ $(EXTLIBS)
 MISSING = @LIBOBJS@ @ALLOCA@
-LDSHARED = @LIBRUBY_LDSHARED@
+LDSHARED = @LIBRUBY_LDSHARED@ $(LDFLAGS)
 DLDFLAGS = @LIBRUBY_DLDFLAGS@ $(EXTLDFLAGS) @ARCH_FLAG@
 SOLIBS = @SOLIBS@
 MAINLIBS = @MAINLIBS@
patches/ruby/1.8.6/no_sslv2.diff000066400000001252147511530510012231 0ustar00Index: ossl_ssl.c
===================================================================
--- a/ext/openssl/ossl_ssl.c	(revision 32381)
+++ b/ext/openssl/ossl_ssl.c	(revision 32382)
@@ -107,9 +107,12 @@
     OSSL_SSL_METHOD_ENTRY(TLSv1),
     OSSL_SSL_METHOD_ENTRY(TLSv1_server),
     OSSL_SSL_METHOD_ENTRY(TLSv1_client),
+#if defined(HAVE_SSLV2_METHOD) && defined(HAVE_SSLV2_SERVER_METHOD) && \
+        defined(HAVE_SSLV2_CLIENT_METHOD)	
     OSSL_SSL_METHOD_ENTRY(SSLv2),
     OSSL_SSL_METHOD_ENTRY(SSLv2_server),
     OSSL_SSL_METHOD_ENTRY(SSLv2_client),
+#endif
     OSSL_SSL_METHOD_ENTRY(SSLv3),
     OSSL_SSL_METHOD_ENTRY(SSLv3_server),
     OSSL_SSL_METHOD_ENTRY(SSLv3_client),
patches/ruby/1.8.6/openssl-1.0.patch000066400000016005147511530510012634 0ustar00From 46b84175dfac14a92fd6bcf3b03bc3c3715ab6cb Mon Sep 17 00:00:00 2001
From: nahi <nahi@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>
Date: Sat, 6 Mar 2010 21:47:30 +0000
Subject: [PATCH] backport the commit from trunk:
 Sun Feb 28 11:49:35 2010  NARUSE, Yui  <naruse@ruby-lang.org>

        * openssl/ossl.c (OSSL_IMPL_SK2ARY): for OpenSSL 1.0.
          patched by Jeroen van Meeuwen at [ruby-core:25210]
          fixed by Nobuyoshi Nakada [ruby-core:25238],
          Hongli Lai [ruby-core:27417],
          and Motohiro KOSAKI [ruby-core:28063]

        * ext/openssl/ossl_ssl.c (ossl_ssl_method_tab),
          (ossl_ssl_cipher_to_ary): constified.

        * ext/openssl/ossl_pkcs7.c (pkcs7_get_certs, pkcs7_get_crls):
          split pkcs7_get_certs_or_crls.


git-svn-id: http://svn.ruby-lang.org/repos/ruby/branches/ruby_1_8@26838 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
---
 ext/openssl/ossl.c          |    6 +++---
 ext/openssl/ossl.h          |    7 +++++++
 ext/openssl/ossl_pkcs7.c    |   40 ++++++++++++++++++++++++++++++----------
 ext/openssl/ossl_ssl.c      |    4 ++--
 ext/openssl/ossl_x509attr.c |    5 +++--
 ext/openssl/ossl_x509crl.c  |    4 ++--
 6 files changed, 47 insertions(+), 19 deletions(-)

diff --git a/ext/openssl/ossl.c b/ext/openssl/ossl.c
index d4a2dc1..85ba654 100644
--- a/ext/openssl/ossl.c
+++ b/ext/openssl/ossl.c
@@ -92,7 +92,7 @@ ossl_x509_ary2sk(VALUE ary)
 
 #define OSSL_IMPL_SK2ARY(name, type)	        \
 VALUE						\
-ossl_##name##_sk2ary(STACK *sk)			\
+ossl_##name##_sk2ary(STACK_OF(type) *sk)	\
 {						\
     type *t;					\
     int i, num;					\
@@ -102,7 +102,7 @@ ossl_##name##_sk2ary(STACK *sk)			\
 	OSSL_Debug("empty sk!");		\
 	return Qnil;				\
     }						\
-    num = sk_num(sk);				\
+    num = sk_##type##_num(sk);			\
     if (num < 0) {				\
 	OSSL_Debug("items in sk < -1???");	\
 	return rb_ary_new();			\
@@ -110,7 +110,7 @@ ossl_##name##_sk2ary(STACK *sk)			\
     ary = rb_ary_new2(num);			\
 						\
     for (i=0; i<num; i++) {			\
-	t = (type *)sk_value(sk, i);		\
+	t = sk_##type##_value(sk, i);		\
 	rb_ary_push(ary, ossl_##name##_new(t));	\
     }						\
     return ary;					\
diff --git a/ext/openssl/ossl.h b/ext/openssl/ossl.h
index 9215dc4..d0edb7d 100644
--- a/ext/openssl/ossl.h
+++ b/ext/openssl/ossl.h
@@ -108,6 +108,13 @@ extern VALUE eOSSLError;
 } while (0)
 
 /*
+ * Compatibility
+ */
+#if OPENSSL_VERSION_NUMBER >= 0x10000000L
+#define STACK _STACK
+#endif
+
+/*
  * String to HEXString conversion
  */
 int string2hex(const unsigned char *, int, char **, int *);
diff --git a/ext/openssl/ossl_pkcs7.c b/ext/openssl/ossl_pkcs7.c
index fe1ef7c..b0cc656 100644
--- a/ext/openssl/ossl_pkcs7.c
+++ b/ext/openssl/ossl_pkcs7.c
@@ -572,12 +572,11 @@ ossl_pkcs7_add_certificate(VALUE self, VALUE cert)
     return self;
 }
 
-static STACK *
-pkcs7_get_certs_or_crls(VALUE self, int want_certs)
+static STACK_OF(X509) *
+pkcs7_get_certs(VALUE self)
 {
     PKCS7 *pkcs7;
     STACK_OF(X509) *certs;
-    STACK_OF(X509_CRL) *crls;
     int i;
 
     GetPKCS7(self, pkcs7);
@@ -585,17 +584,38 @@ pkcs7_get_certs_or_crls(VALUE self, int want_certs)
     switch(i){
     case NID_pkcs7_signed:
         certs = pkcs7->d.sign->cert;
-        crls = pkcs7->d.sign->crl;
         break;
     case NID_pkcs7_signedAndEnveloped:
         certs = pkcs7->d.signed_and_enveloped->cert;
+        break;
+    default:
+        certs = NULL;
+    }
+
+    return certs;
+}
+
+static STACK_OF(X509_CRL) *
+pkcs7_get_crls(VALUE self)
+{
+    PKCS7 *pkcs7;
+    STACK_OF(X509_CRL) *crls;
+    int i;
+
+    GetPKCS7(self, pkcs7);
+    i = OBJ_obj2nid(pkcs7->type);
+    switch(i){
+    case NID_pkcs7_signed:
+        crls = pkcs7->d.sign->crl;
+        break;
+    case NID_pkcs7_signedAndEnveloped:
         crls = pkcs7->d.signed_and_enveloped->crl;
         break;
     default:
-        certs = crls = NULL;
+        crls = NULL;
     }
 
-    return want_certs ? certs : crls;
+    return crls;
 }
 
 static VALUE
@@ -610,7 +630,7 @@ ossl_pkcs7_set_certificates(VALUE self, VALUE ary)
     STACK_OF(X509) *certs;
     X509 *cert;
 
-    certs = pkcs7_get_certs_or_crls(self, 1);
+    certs = pkcs7_get_certs(self);
     while((cert = sk_X509_pop(certs))) X509_free(cert);
     rb_block_call(ary, rb_intern("each"), 0, 0, ossl_pkcs7_set_certs_i, self);
 
@@ -620,7 +640,7 @@ ossl_pkcs7_set_certificates(VALUE self, VALUE ary)
 static VALUE
 ossl_pkcs7_get_certificates(VALUE self)
 {
-    return ossl_x509_sk2ary(pkcs7_get_certs_or_crls(self, 1));
+    return ossl_x509_sk2ary(pkcs7_get_certs(self));
 }
 
 static VALUE
@@ -650,7 +670,7 @@ ossl_pkcs7_set_crls(VALUE self, VALUE ary)
     STACK_OF(X509_CRL) *crls;
     X509_CRL *crl;
 
-    crls = pkcs7_get_certs_or_crls(self, 0);
+    crls = pkcs7_get_crls(self);
     while((crl = sk_X509_CRL_pop(crls))) X509_CRL_free(crl);
     rb_block_call(ary, rb_intern("each"), 0, 0, ossl_pkcs7_set_crls_i, self);
 
@@ -660,7 +680,7 @@ ossl_pkcs7_set_crls(VALUE self, VALUE ary)
 static VALUE
 ossl_pkcs7_get_crls(VALUE self)
 {
-    return ossl_x509crl_sk2ary(pkcs7_get_certs_or_crls(self, 0));
+    return ossl_x509crl_sk2ary(pkcs7_get_crls(self));
 }
 
 static VALUE
diff --git a/ext/openssl/ossl_ssl.c b/ext/openssl/ossl_ssl.c
index 432ca21..facf6ca 100644
--- a/ext/openssl/ossl_ssl.c
+++ b/ext/openssl/ossl_ssl.c
@@ -1291,10 +1291,10 @@ ossl_ssl_get_peer_cert_chain(VALUE self)
     }
     chain = SSL_get_peer_cert_chain(ssl);
     if(!chain) return Qnil;
-    num = sk_num(chain);
+    num = sk_X509_num(chain);
     ary = rb_ary_new2(num);
     for (i = 0; i < num; i++){
-	cert = (X509*)sk_value(chain, i);
+	cert = sk_X509_value(chain, i);
 	rb_ary_push(ary, ossl_x509_new(cert));
     }
 
diff --git a/ext/openssl/ossl_x509attr.c b/ext/openssl/ossl_x509attr.c
index 1f817cd..2a4c481 100644
--- a/ext/openssl/ossl_x509attr.c
+++ b/ext/openssl/ossl_x509attr.c
@@ -218,8 +218,9 @@ ossl_x509attr_get_value(VALUE self)
 	ossl_str_adjust(str, p);
     }
     else{
-	length = i2d_ASN1_SET_OF_ASN1_TYPE(attr->value.set, NULL,
-			i2d_ASN1_TYPE, V_ASN1_SET, V_ASN1_UNIVERSAL, 0);
+	length = i2d_ASN1_SET_OF_ASN1_TYPE(attr->value.set,
+			(unsigned char **) NULL, i2d_ASN1_TYPE,
+			V_ASN1_SET, V_ASN1_UNIVERSAL, 0);
 	str = rb_str_new(0, length);
 	p = (unsigned char *)RSTRING_PTR(str);
 	i2d_ASN1_SET_OF_ASN1_TYPE(attr->value.set, &p,
diff --git a/ext/openssl/ossl_x509crl.c b/ext/openssl/ossl_x509crl.c
index 1be9640..818fdba 100644
--- a/ext/openssl/ossl_x509crl.c
+++ b/ext/openssl/ossl_x509crl.c
@@ -264,7 +264,7 @@ ossl_x509crl_get_revoked(VALUE self)
     VALUE ary, revoked;
 
     GetX509CRL(self, crl);
-    num = sk_X509_CRL_num(X509_CRL_get_REVOKED(crl));
+    num = sk_X509_REVOKED_num(X509_CRL_get_REVOKED(crl));
     if (num < 0) {
 	OSSL_Debug("num < 0???");
 	return rb_ary_new();
@@ -272,7 +272,7 @@ ossl_x509crl_get_revoked(VALUE self)
     ary = rb_ary_new2(num);
     for(i=0; i<num; i++) {
 	/* NO DUP - don't free! */
-	rev = (X509_REVOKED *)sk_X509_CRL_value(X509_CRL_get_REVOKED(crl), i);
+	rev = sk_X509_REVOKED_value(X509_CRL_get_REVOKED(crl), i);
 	revoked = ossl_x509revoked_new(rev);
 	rb_ary_push(ary, revoked);
     }
-- 
1.7.0.3
patches/ruby/1.8.6/ruby186gc.patch000066400000041716147511530510012416 0ustar00--- a/gc.c	(revision 31212)
+++ b/gc.c	(working copy)
@@ -22,8 +22,16 @@
 #include <setjmp.h>
 #include <sys/types.h>
 
+#ifdef _WIN32
+#include <string.h>
+#else
+#include <strings.h>
+#endif
+
 #ifdef HAVE_SYS_TIME_H
 #include <sys/time.h>
+#elif defined(_WIN32)
+#include <time.h> 
 #endif
 
 #ifdef HAVE_SYS_RESOURCE_H
@@ -40,7 +48,6 @@
 #if !defined(setjmp) && defined(HAVE__SETJMP)
 #define setjmp(env) _setjmp(env)
 #endif
-
 /* Make alloca work the best possible way.  */
 #ifdef __GNUC__
 # ifndef atarist
@@ -76,6 +83,20 @@
 
 NORETURN(void rb_exc_jump _((VALUE)));
 
+static unsigned long live_objects = 0;
+unsigned long rb_os_live_objects()
+{ return live_objects; }
+
+#if defined(HAVE_LONG_LONG)
+static unsigned long long allocated_objects = 0;
+unsigned long long rb_os_allocated_objects()
+{ return allocated_objects; }
+#else
+static unsigned long allocated_objects = 0;
+unsigned long rb_os_allocated_objects()
+{ return allocated_objects; }
+#endif
+
 void
 rb_memerror()
 {
@@ -93,6 +114,10 @@
     rb_exc_raise(nomem_error);
 }
 
+long gc_allocated_size = 0;
+long gc_num_allocations = 0;
+static int gc_statistics = 0;
+
 void *
 ruby_xmalloc(size)
     long size;
@@ -167,6 +192,8 @@
 
 extern int ruby_in_compile;
 static int dont_gc;
+static GC_TIME_TYPE gc_time = 0;
+static int gc_collections = 0;
 static int during_gc;
 static int need_call_final = 0;
 static st_table *finalizer_table = 0;
@@ -201,8 +228,7 @@
  *  Disables garbage collection, returning <code>true</code> if garbage
  *  collection was already disabled.
  *
- *     GC.disable   #=> false
- *     GC.disable   #=> true
+ *     GC.disable   #=> false or true
  *
  */
 
@@ -215,6 +241,139 @@
     return old;
 }
 
+/*
+ *  call-seq:
+ *     GC.enable_stats    => true or false
+ *
+ *  Enables garbage collection statistics, returning <code>true</code> if garbage
+ *  collection statistics was already enabled.
+ *
+ *     GC.enable_stats   #=> false or true
+ *     GC.enable_stats   #=> true
+ *
+ */
+
+VALUE
+rb_gc_enable_stats()
+{
+    int old = gc_statistics;
+    gc_statistics = Qtrue;
+    return old;
+}
+
+/*
+ *  call-seq:
+ *     GC.disable_stats    => true or false
+ *
+ *  Disables garbage collection statistics, returning <code>true</code> if garbage
+ *  collection statistics was already disabled.
+ *
+ *     GC.disable_stats   #=> false or true
+ *     GC.disable_stats   #=> true
+ *
+ */
+
+VALUE
+rb_gc_disable_stats()
+{
+    int old = gc_statistics;
+    gc_statistics = Qfalse;
+    gc_allocated_size = 0;
+    gc_num_allocations = 0;
+    return old;
+}
+
+/*
+ *  call-seq:
+ *     GC.clear_stats    => nil
+ *
+ *  Clears garbage collection statistics, returning nil. This resets the number
+ *  of collections (GC.collections) and the time used (GC.time) to 0.
+ *
+ *     GC.clear_stats    #=> nil
+ *
+ */
+
+VALUE
+rb_gc_clear_stats()
+{
+    gc_collections = 0;
+    gc_time = 0;
+    gc_allocated_size = 0;
+    gc_num_allocations = 0;
+    return Qnil; 
+}
+
+/*
+ *  call-seq:
+ *     GC.allocated_size    => Integer
+ *
+ *  Returns the size of memory (in bytes) allocated since GC statistics collection
+ *  was enabled.
+ *
+ *     GC.allocated_size    #=> 35
+ *
+ */
+VALUE
+rb_gc_allocated_size()
+{
+    return INT2NUM(gc_allocated_size);
+}
+
+/*
+ *  call-seq:
+ *     GC.num_allocations    => Integer
+ *
+ *  Returns the number of memory allocations since GC statistics collection
+ *  was enabled.
+ *
+ *     GC.num_allocations    #=> 150
+ *
+ */
+VALUE
+rb_gc_num_allocations()
+{
+    return INT2NUM(gc_num_allocations);
+}
+
+/*
+ *  call-seq:
+ *     GC.collections    => Integer
+ *
+ *  Returns the number of garbage collections performed while GC statistics collection
+ *  was enabled.
+ *
+ *     GC.collections    #=> 35
+ *
+ */
+
+VALUE
+rb_gc_collections()
+{
+    return INT2NUM(gc_collections);
+}
+
+/*
+ *  call-seq:
+ *     GC.time    => Integer
+ *
+ *  Returns the time spent during garbage collection while GC statistics collection
+ *  was enabled (in micro seconds).
+ *
+ *     GC.time    #=> 20000
+ *
+ */
+
+VALUE
+rb_gc_time()
+{
+#if HAVE_LONG_LONG
+    return LL2NUM(gc_time);
+#else
+    return LONG2NUM(gc_time);
+#endif
+}
+
 VALUE rb_mGC;
 
 static struct gc_list {
@@ -306,7 +465,7 @@
 static RVALUE *freelist = 0;
 static RVALUE *deferred_final_list = 0;
 
-#define HEAPS_INCREMENT 10
+static int heaps_increment = 10;
 static struct heaps_slot {
     void *membase;
     RVALUE *slot;
@@ -315,13 +474,164 @@
 static int heaps_length = 0;
 static int heaps_used   = 0;
 
-#define HEAP_MIN_SLOTS 10000
-static int heap_slots = HEAP_MIN_SLOTS;
+static int heap_min_slots = 10000;
+static int heap_slots = 10000;
 
-#define FREE_MIN  4096
+static int heap_free_min = 4096;
+static int heap_slots_increment = 10000;
+static double heap_slots_growth_factor = 1.8;
 
+static long initial_malloc_limit = GC_MALLOC_LIMIT;
+
+static int verbose_gc_stats = Qfalse;
+
+static FILE* gc_data_file = NULL;
+
 static RVALUE *himem, *lomem;
 
+static void set_gc_parameters()
+{
+    char *gc_stats_ptr, *min_slots_ptr, *free_min_ptr, *heap_slots_incr_ptr,
+      *heap_incr_ptr, *malloc_limit_ptr, *gc_heap_file_ptr, *heap_slots_growth_factor_ptr;
+
+    gc_data_file = stderr;
+
+    gc_stats_ptr = getenv("RUBY_GC_STATS");
+    if (gc_stats_ptr != NULL) {
+	int gc_stats_i = atoi(gc_stats_ptr);
+	if (gc_stats_i > 0) {
+	    verbose_gc_stats = Qtrue;
+	}
+    }
+
+    gc_heap_file_ptr = getenv("RUBY_GC_DATA_FILE");
+    if (gc_heap_file_ptr != NULL) {
+	FILE* data_file = fopen(gc_heap_file_ptr, "w");
+	if (data_file != NULL) {
+	    gc_data_file = data_file;
+	}
+	else {
+	    fprintf(stderr,
+		    "can't open gc log file %s for writing, using default\n", gc_heap_file_ptr);
+	}
+    }
+
+    min_slots_ptr = getenv("RUBY_HEAP_MIN_SLOTS");
+    if (min_slots_ptr != NULL) {
+	int min_slots_i = atoi(min_slots_ptr);
+        if (verbose_gc_stats) {
+	    fprintf(gc_data_file, "RUBY_HEAP_MIN_SLOTS=%s\n", min_slots_ptr);
+        }
+	if (min_slots_i > 0) {
+	    heap_slots = min_slots_i;
+	    heap_min_slots = min_slots_i;
+	}
+    }
+
+    free_min_ptr = getenv("RUBY_HEAP_FREE_MIN");
+    if (free_min_ptr != NULL) {
+	int free_min_i = atoi(free_min_ptr);
+        if (verbose_gc_stats) {
+	    fprintf(gc_data_file, "RUBY_HEAP_FREE_MIN=%s\n", free_min_ptr);
+	}
+	if (free_min_i > 0) {
+	    heap_free_min = free_min_i;
+	}
+    }
+
+    heap_incr_ptr = getenv("RUBY_HEAP_INCREMENT");
+    if (heap_incr_ptr != NULL) {
+	int heap_incr_i = atoi(heap_incr_ptr);
+        if (verbose_gc_stats) {
+	    fprintf(gc_data_file, "RUBY_HEAP_INCREMENT=%s\n", heap_incr_ptr);
+	}
+	if (heap_incr_i > 0) {
+	    heaps_increment = heap_incr_i;
+	}
+    }
+
+    heap_slots_incr_ptr = getenv("RUBY_HEAP_SLOTS_INCREMENT");
+    if (heap_slots_incr_ptr != NULL) {
+	int heap_slots_incr_i = atoi(heap_slots_incr_ptr);
+        if (verbose_gc_stats) {
+	    fprintf(gc_data_file, "RUBY_HEAP_SLOTS_INCREMENT=%s\n", heap_slots_incr_ptr);
+	}
+	if (heap_slots_incr_i > 0) {
+	    heap_slots_increment = heap_slots_incr_i;
+	}
+    }
+
+    heap_slots_growth_factor_ptr = getenv("RUBY_HEAP_SLOTS_GROWTH_FACTOR");
+    if (heap_slots_growth_factor_ptr != NULL) {
+	double heap_slots_growth_factor_d = atoi(heap_slots_growth_factor_ptr);
+        if (verbose_gc_stats) {
+	    fprintf(gc_data_file, "RUBY_HEAP_SLOTS_GROWTH_FACTOR=%s\n", heap_slots_growth_factor_ptr);
+	}
+	if (heap_slots_growth_factor_d > 0) {
+	    heap_slots_growth_factor = heap_slots_growth_factor_d;
+	}
+    }
+
+    malloc_limit_ptr = getenv("RUBY_GC_MALLOC_LIMIT");
+    if (malloc_limit_ptr != NULL) {
+	int malloc_limit_i = atol(malloc_limit_ptr);
+        if (verbose_gc_stats) {
+	    fprintf(gc_data_file, "RUBY_GC_MALLOC_LIMIT=%s\n", malloc_limit_ptr);
+	}
+	if (malloc_limit_i > 0) {
+	    initial_malloc_limit = malloc_limit_i;
+	}
+    }
+}
+
+/*
+ *  call-seq:
+ *     GC.dump    => nil
+ *
+ *  dumps information about the current GC data structures to the GC log file
+ *
+ *     GC.dump    #=> nil
+ *
+ */
+
+VALUE
+rb_gc_dump()
+{
+    int i;
+
+    for (i = 0; i < heaps_used; i++) {
+	int heap_size = heaps[i].limit;
+	fprintf(gc_data_file, "HEAP[%2d]: size=%7d\n", i, heap_size);
+    }
+
+    return Qnil;
+}
+
+/*
+ *  call-seq:
+ *     GC.log String  => String
+ *
+ *  Logs string to the GC data file and returns it.
+ *
+ *     GC.log "manual GC call"    #=> "manual GC call"
+ *
+ */
+
+VALUE
+rb_gc_log(self, original_str)
+     VALUE self, original_str;
+{
+    if (original_str == Qnil) {
+        fprintf(gc_data_file, "\n");
+    }
+    else {
+        VALUE str = StringValue(original_str);
+        char *p = RSTRING(str)->ptr;
+        fprintf(gc_data_file, "%s\n", p);
+    }
+    return original_str;
+}
+
 static void
 add_heap()
 {
@@ -332,7 +642,7 @@
 	struct heaps_slot *p;
 	int length;
 
-	heaps_length += HEAPS_INCREMENT;
+	heaps_length += heaps_increment;
 	length = heaps_length*sizeof(struct heaps_slot);
 	RUBY_CRITICAL(
 	    if (heaps_used > 0) {
@@ -344,14 +654,18 @@
 	    });
 	if (p == 0) rb_memerror();
     }
+    if (gc_statistics) {
+        gc_allocated_size += size;
+	gc_num_allocations += 1;
+    }
 
     for (;;) {
 	RUBY_CRITICAL(p = (RVALUE*)malloc(sizeof(RVALUE)*(heap_slots+1)));
 	if (p == 0) {
-	    if (heap_slots == HEAP_MIN_SLOTS) {
+	    if (heap_slots == heap_min_slots) {
 		rb_memerror();
 	    }
-	    heap_slots = HEAP_MIN_SLOTS;
+	    heap_slots = heap_min_slots;
 	    continue;
 	}
         heaps[heaps_used].membase = p;
@@ -367,10 +681,17 @@
     if (lomem == 0 || lomem > p) lomem = p;
     if (himem < pend) himem = pend;
     heaps_used++;
-    heap_slots *= 1.8;
-    if (heap_slots <= 0) heap_slots = HEAP_MIN_SLOTS;
+    heap_slots += heap_slots_increment;
+    heap_slots_increment *= heap_slots_growth_factor;
+    if (heap_slots <= 0) heap_slots = heap_min_slots;
 
     while (p < pend) {
+    if (do_gc_stats) {
+	int obt = p->as.basic.flags & T_MASK;
+	if (obt) {
+	    free_counts[obt]++;
+	}
+    }
 	p->as.free.flags = 0;
 	p->as.free.next = freelist;
 	freelist = p;
@@ -402,6 +723,8 @@
     RANY(obj)->file = ruby_sourcefile;
     RANY(obj)->line = ruby_sourceline;
 #endif
+    live_objects++;
+    allocated_objects++;
     return obj;
 }
 
@@ -1062,6 +1385,39 @@
     }
 }
 
+static char* obj_type(int tp)
+{
+    switch (tp) {
+	case T_NIL    : return "NIL";   
+	case T_OBJECT : return "OBJECT";
+	case T_CLASS  : return "CLASS";
+	case T_ICLASS : return "ICLASS";
+	case T_MODULE : return "MODULE";
+	case T_FLOAT  : return "FLOAT";
+	case T_STRING : return "STRING";
+	case T_REGEXP : return "REGEXP";
+	case T_ARRAY  : return "ARRAY";
+	case T_FIXNUM : return "FIXNUM";
+	case T_HASH   : return "HASH";
+	case T_STRUCT : return "STRUCT";
+	case T_BIGNUM : return "BIGNUM";
+	case T_FILE   : return "FILE";
+	    
+	case T_TRUE   : return "TRUE";
+	case T_FALSE  : return "FALSE";
+	case T_DATA   : return "DATA";
+	case T_MATCH  : return "MATCH";
+	case T_SYMBOL : return "SYMBOL";
+	    
+	case T_BLKTAG : return "BLKTAG";
+	case T_UNDEF  : return "UNDEF";
+	case T_VARMAP : return "VARMAP";
+	case T_SCOPE  : return "SCOPE";
+	case T_NODE   : return "NODE";
+	default: return "____";
+    }
+}
+
 static void
 free_unused_heaps()
 {
@@ -1093,14 +1449,24 @@
     int i;
     unsigned long live = 0;
     unsigned long free_min = 0;
+    live_objects = 0;
 
+    unsigned long really_freed = 0;
+    int free_counts[256];
+    int live_counts[256];
+    int do_gc_stats = gc_statistics & verbose_gc_stats;
+
     for (i = 0; i < heaps_used; i++) {
         free_min += heaps[i].limit;
     }
     free_min = free_min * 0.2;
-    if (free_min < FREE_MIN)
-        free_min = FREE_MIN;
+    if (free_min < heap_free_min)
+        free_min = heap_free_min;
 
+    if (do_gc_stats) {
+	for (i = 0 ; i< 256; i++) { free_counts[i] = live_counts[i] = 0; }
+    }
+
     if (ruby_in_compile && ruby_parser_stack_on_heap()) {
 	/* should not reclaim nodes during compilation
            if yacc's semantic stack is not allocated on machine stack */
@@ -1138,6 +1504,9 @@
 			p->as.free.flags = T_DEFERRED;
 			RDATA(p)->dfree = 0;
 		    }
+		    if (do_gc_stats) {
+            really_freed++;
+		    }
 		    p->as.free.flags |= FL_MARK;
 		    p->as.free.next = final_list;
 		    final_list = p;
@@ -1153,7 +1522,10 @@
 	    }
 	    else {
 		RBASIC(p)->flags &= ~FL_MARK;
-		live++;
+		live_objects++;
+		if (do_gc_stats) {
+ 		    live_counts[RANY((VALUE)p)->as.basic.flags & T_MASK]++;
+ 		}
 	    }
 	    p++;
 	}
@@ -1171,8 +1543,8 @@
 	}
     }
     if (malloc_increase > malloc_limit) {
-	malloc_limit += (malloc_increase - malloc_limit) * (double)live / (live + freed);
-	if (malloc_limit < GC_MALLOC_LIMIT) malloc_limit = GC_MALLOC_LIMIT;
+	malloc_limit += (malloc_increase - malloc_limit) * (double)live_objects / (live_objects + freed);
+	if (malloc_limit < initial_malloc_limit) malloc_limit = initial_malloc_limit;
     }
     malloc_increase = 0;
     if (freed < free_min) {
@@ -1180,6 +1552,20 @@
     }
     during_gc = 0;
 
+    if (do_gc_stats) {
+	fprintf(gc_data_file, "objects processed: %.7d\n", live+freed);
+	fprintf(gc_data_file, "live objects	: %.7d\n", live);
+	fprintf(gc_data_file, "freelist objects : %.7d\n", freed - really_freed);
+	fprintf(gc_data_file, "freed objects	: %.7d\n", really_freed);
+	for(i=0; i<256; i++) {
+	    if (free_counts[i]>0) {
+		fprintf(gc_data_file,
+			"kept %.7d / freed %.7d objects of type %s\n",
+			live_counts[i], free_counts[i], obj_type(i));
+	    }
+	}
+    }
+
     /* clear finalization list */
     if (final_list) {
 	deferred_final_list = final_list;
@@ -1394,6 +1780,7 @@
     struct gc_list *list;
     struct FRAME * volatile frame; /* gcc 2.7.2.3 -O2 bug??  */
     jmp_buf save_regs_gc_mark;
+    struct timeval gctv1, gctv2;
     SET_STACK_END;
 
 #ifdef HAVE_NATIVETHREAD
@@ -1410,6 +1797,14 @@
     if (during_gc) return;
     during_gc++;
 
+    if (gc_statistics) {
+        gc_collections++;
+	gettimeofday(&gctv1, NULL);
+        if (verbose_gc_stats) {
+	    fprintf(gc_data_file, "Garbage collection started\n");
+	}
+    }
+
     init_mark_stack();
 
     gc_mark((VALUE)ruby_current_node, 0);
@@ -1485,6 +1880,17 @@
     } while (!MARK_STACK_EMPTY);
 
     gc_sweep();
+
+    if (gc_statistics) {
+        GC_TIME_TYPE musecs_used;
+	gettimeofday(&gctv2, NULL);
+	musecs_used = ((GC_TIME_TYPE)(gctv2.tv_sec - gctv1.tv_sec) * 1000000) + (gctv2.tv_usec - gctv1.tv_usec);
+	gc_time += musecs_used;
+
+	if (verbose_gc_stats) {
+	    fprintf(gc_data_file, "GC time: %d msec\n", musecs_used / 1000);
+	}
+    }
 }
 
 void
@@ -1666,6 +2072,7 @@
     if (!rb_gc_stack_start) {
 	Init_stack(0);
     }
+    set_gc_parameters();
     add_heap();
 }
 
@@ -2109,6 +2516,35 @@
     return (VALUE)((long)obj|FIXNUM_FLAG);
 }
 
+/* call-seq:
+ *  ObjectSpace.live_objects => number
+ *
+ * Returns the count of objects currently allocated in the system. This goes
+ * down after the garbage collector runs.
+ */
+static
+VALUE os_live_objects(VALUE self)
+{ return ULONG2NUM(live_objects); }
+
+/* call-seq:
+ *  ObjectSpace.allocated_objects => number
+ *
+ * Returns the count of objects allocated since the Ruby interpreter has
+ * started.  This number can only increase. To know how many objects are
+ * currently allocated, use ObjectSpace::live_objects
+ */
+static
+VALUE os_allocated_objects(VALUE self)
+{ 
+#if defined(HAVE_LONG_LONG)
+    return ULL2NUM(allocated_objects); 
+#else
+    return ULONG2NUM(allocated_objects); 
+#endif
+}
+
+
+
 /*
  *  The <code>GC</code> module provides an interface to Ruby's mark and
  *  sweep garbage collection mechanism. Some of the underlying methods
@@ -2126,6 +2562,16 @@
     rb_define_singleton_method(rb_mGC, "disable", rb_gc_disable, 0);
     rb_define_method(rb_mGC, "garbage_collect", rb_gc_start, 0);
 
+    rb_define_singleton_method(rb_mGC, "enable_stats", rb_gc_enable_stats, 0);
+    rb_define_singleton_method(rb_mGC, "disable_stats", rb_gc_disable_stats, 0);
+    rb_define_singleton_method(rb_mGC, "clear_stats", rb_gc_clear_stats, 0);
+    rb_define_singleton_method(rb_mGC, "allocated_size", rb_gc_allocated_size, 0);
+    rb_define_singleton_method(rb_mGC, "num_allocations", rb_gc_num_allocations, 0);
+    rb_define_singleton_method(rb_mGC, "collections", rb_gc_collections, 0);
+    rb_define_singleton_method(rb_mGC, "time", rb_gc_time, 0);
+    rb_define_singleton_method(rb_mGC, "dump", rb_gc_dump, 0);
+    rb_define_singleton_method(rb_mGC, "log", rb_gc_log, 1);
+
     rb_mObSpace = rb_define_module("ObjectSpace");
     rb_define_module_function(rb_mObSpace, "each_object", os_each_obj, -1);
     rb_define_module_function(rb_mObSpace, "garbage_collect", rb_gc_start, 0);
@@ -2133,6 +2579,8 @@
     rb_define_module_function(rb_mObSpace, "remove_finalizer", rm_final, 1);
     rb_define_module_function(rb_mObSpace, "finalizers", finals, 0);
     rb_define_module_function(rb_mObSpace, "call_finalizer", call_final, 1);
+    rb_define_module_function(rb_mObSpace, "live_objects", os_live_objects, 0);
+    rb_define_module_function(rb_mObSpace, "allocated_objects", os_allocated_objects, 0);
 
     rb_define_module_function(rb_mObSpace, "define_finalizer", define_final, -1);
     rb_define_module_function(rb_mObSpace, "undefine_finalizer", undefine_final, 1);
patches/ruby/1.8.6/stdout-rouge-fix.patch000066400000001273147511530510014103 0ustar00--- a/lib/mkmf.rb	2009-06-10 09:09:22.000000000 +0200
+++ b/lib/mkmf.rb	2011-11-12 02:53:05.862766935 +0100
@@ -168,19 +168,25 @@
 module Logging
   @log = nil
   @logfile = 'mkmf.log'
-  @orgerr = $stderr.dup
-  @orgout = $stdout.dup
   @postpone = 0
 
   def self::open
     @log ||= File::open(@logfile, 'w')
     @log.sync = true
+    orgerr = $stderr.dup
+    orgout = $stdout.dup
     $stderr.reopen(@log)
     $stdout.reopen(@log)
     yield
   ensure
-    $stderr.reopen(@orgerr)
-    $stdout.reopen(@orgout)
+    if orgerr
+      $stderr.reopen(orgerr)
+      orgerr.close
+    end
+    if orgout
+      $stdout.reopen(orgout)
+      orgout.close
+    end
   end
 
   def self::message(*s)
patches/ruby/1.8.6/mbari.patch000066400000431447147511530510011762 0ustar00diff --git a/ChangeLog b/ChangeLog
index e66e305..e4c539a 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,20 @@
+Wed Feb 27 12:01:19 2009  Brent Roman  <brent@mbari.org>
+        
+        * rubysig.c:  added support for __anyPowerPC__
+        
+        * version.h:  bumped date
+
+Mon Feb 25 10:53:52 2008  Brent Roman  <brent@mbari.org>
+
+	* backported MBARI 8A patches still
+          fails YAML test_object_id_collision
+
+Mon Feb 16 10:53:52 2008  Brent Roman  <brent@mbari.org>
+
+	* backport from 1.8.7p72-mbari of MBARI patches described at
+          http://sites.google.com/site/brentsrubypatches
+          fails YAML test_object_id_collision
+
 Fri Aug  8 10:53:52 2008  Tanaka Akira  <akr@fsij.org>
 
 	* lib/resolv.rb: randomize source port and transaction id.
diff --git a/common.mk b/common.mk
index 6d5b35d..3e43e41 100644
--- a/common.mk
+++ b/common.mk
@@ -441,7 +441,7 @@ variable.$(OBJEXT): {$(VPATH)}variable.c {$(VPATH)}ruby.h config.h \
   {$(VPATH)}env.h {$(VPATH)}node.h {$(VPATH)}st.h {$(VPATH)}util.h
 version.$(OBJEXT): {$(VPATH)}version.c {$(VPATH)}ruby.h config.h \
   {$(VPATH)}defines.h {$(VPATH)}intern.h {$(VPATH)}missing.h \
-  {$(VPATH)}version.h
+  {$(VPATH)}rubysig.h {$(VPATH)}version.h
 
 dist: $(PROGRAM)
 	$(RUNRUBY) $(srcdir)/distruby.rb
diff --git a/configure.in b/configure.in
index c775862..aafeb30 100644
--- a/configure.in
+++ b/configure.in
@@ -139,6 +139,24 @@ AC_ARG_ENABLE(frame-address,
 if test $frame_address = yes; then
     AC_DEFINE(USE_BUILTIN_FRAME_ADDRESS)
 fi
+AC_ARG_ENABLE(mbari-api,
+       [  --enable-mbari-api      enable API changes from the MBARI patches. ],
+       [mbari_api=$enableval])
+if test "$mbari_api" = yes; then
+    AC_DEFINE(MBARI_API)
+fi
+AC_ARG_WITH(wipe-sites,
+[  --with-wipe-sites=MASK  override default STACK_WIPES_SITES mask in rubysig.h],
+[wipe_sites=$withval])
+if test "$wipe_sites" != ""; then
+  case $wipe_sites in
+       none|no)  wipe_sites=0x0;;
+       yes) wipe_sites=;;
+  esac
+  if test -n "$wipe_sites"; then
+    AC_DEFINE_UNQUOTED(STACK_WIPE_SITES,$wipe_sites)
+  fi
+fi
 
 AC_ARG_PROGRAM
 
diff --git a/eval.c b/eval.c
index 54a0fee..8002203 100644
--- a/eval.c
+++ b/eval.c
@@ -222,9 +222,9 @@ VALUE rb_cProc;
 VALUE rb_cBinding;
 static VALUE proc_invoke _((VALUE,VALUE,VALUE,VALUE));
 static VALUE rb_f_binding _((VALUE));
-static void rb_f_END _((void));
+NOINLINE(static void rb_f_END _((void)));
 static VALUE rb_f_block_given_p _((void));
-static VALUE block_pass _((VALUE,NODE*));
+static VALUE block_pass _((volatile VALUE, NODE *volatile));
 
 VALUE rb_cMethod;
 static VALUE method_call _((int, VALUE*, VALUE));
@@ -246,6 +246,30 @@ static int scope_vmode;
 VALUE (*ruby_sandbox_save)_((rb_thread_t));
 VALUE (*ruby_sandbox_restore)_((rb_thread_t));
 NODE* ruby_current_node;
+
+#if 0
+#define SET_CURRENT_SOURCE() (ruby_sourcefile = ruby_current_node->nd_file, \
+			      ruby_sourceline = nd_line(ruby_current_node))
+#else
+#define SET_CURRENT_SOURCE() ((void)0)
+#endif
+
+void
+ruby_set_current_source()
+{
+    if (ruby_current_node) {
+	ruby_sourcefile = ruby_current_node->nd_file;
+	ruby_sourceline = nd_line(ruby_current_node);
+    }
+}
+
+#ifdef MBARI_API
+#define SET_METHOD_SOURCE()  ruby_set_current_source()
+#else
+#define SET_METHOD_SOURCE()  (void)0
+#endif
+
+
 int ruby_safe_level = 0;
 /* safe-level:
    0 - strings from streams/environment/ARGV are tainted (default)
@@ -490,7 +514,7 @@ rb_get_method_body(klassp, idp, noexp)
 {
     ID id = *idp;
     VALUE klass = *klassp;
-    VALUE origin;
+    VALUE origin = 0;
     NODE * volatile body;
     struct cache_entry *ent;
 
@@ -729,6 +753,7 @@ rb_attr(klass, id, read, write, ex)
     if (!name) {
 	rb_raise(rb_eArgError, "argument needs to be symbol or string");
     }
+    SET_METHOD_SOURCE();
     len = strlen(name)+2;
     buf = ALLOCA_N(char,len);
     snprintf(buf, len, "@%s", name);
@@ -769,11 +794,11 @@ static unsigned long frame_unique = 0;
     _frame.argc = 0;			\
     _frame.flags = 0;			\
     _frame.uniq = frame_unique++;	\
-    ruby_frame = &_frame
+    ruby_frame = (struct FRAME *)&_frame
 
 #define POP_FRAME()  			\
     ruby_current_node = _frame.node;	\
-    ruby_frame = _frame.prev;		\
+    ruby_frame = _frame.prev;           \
 } while (0)
 
 struct BLOCK {
@@ -967,7 +992,7 @@ rb_svar(cnt)
     ID id;
 
     if (!ruby_scope->local_tbl) return NULL;
-    if (cnt >= ruby_scope->local_tbl[0]) return NULL;
+    if ((ID)cnt >= ruby_scope->local_tbl[0]) return NULL;
     id = ruby_scope->local_tbl[cnt+1];
     while (vars) {
 	if (vars->id == id) return &vars->val;
@@ -1030,7 +1055,26 @@ static struct tag *prot_tag;
 #define PROT_LAMBDA INT2FIX(2)	/* 5 */
 #define PROT_YIELD  INT2FIX(3)	/* 7 */
 
-#define EXEC_TAG()    (FLUSH_REGISTER_WINDOWS, ruby_setjmp(((void)0), prot_tag->buf))
+#if STACK_WIPE_SITES & 0x42
+#ifdef __GNUC__
+static inline int wipeAfter(int) __attribute__((always_inline));
+#endif
+static inline int wipeAfter(int status)
+{
+  rb_gc_wipe_stack();
+  return status;
+}
+#else
+#define wipeAfter(status) status
+#endif
+#if STACK_WIPE_SITES & 2
+#define wipeAfterTag(status) wipeAfter(status)
+#else
+#define wipeAfterTag(status) status
+#endif
+
+#define EXEC_TAG_0()  ruby_setjmp(((void)0), prot_tag->buf)
+#define EXEC_TAG()    wipeAfterTag(EXEC_TAG_0())
 
 #define JUMP_TAG(st) do {		\
     ruby_frame = prot_tag->frame;	\
@@ -1106,10 +1150,17 @@ static void scope_dup _((struct SCOPE *));
 } while (0)
 
 static VALUE rb_eval _((VALUE,NODE*));
-static VALUE eval _((VALUE,VALUE,VALUE,char*,int));
-static NODE *compile _((VALUE, char*, int));
+static VALUE eval _((VALUE,VALUE,volatile VALUE,const char* volatile,int));
+static NODE *compile _((VALUE, const char*, int));
 
-static VALUE rb_yield_0 _((VALUE, VALUE, VALUE, int, int));
+static VALUE rb_yield_0 
+               _((volatile VALUE, volatile VALUE, VALUE, int, volatile int));
+
+#if STACK_WIPE_SITES & 0x20
+#define wipeBeforeYield()  rb_gc_wipe_stack()
+#else
+#define wipeBeforeYield()  (void)0
+#endif
 
 #define YIELD_LAMBDA_CALL 1
 #define YIELD_PROC_CALL   2
@@ -1118,7 +1169,7 @@ static VALUE rb_yield_0 _((VALUE, VALUE, VALUE, int, int));
 #define YIELD_FUNC_SVALUE 2
 
 static VALUE rb_call _((VALUE,VALUE,ID,int,const VALUE*,int,VALUE));
-static VALUE module_setup _((VALUE,NODE*));
+static VALUE module_setup _((VALUE,NODE *volatile));
 
 static VALUE massign _((VALUE,NODE*,VALUE,int));
 static void assign _((VALUE,NODE*,VALUE,int));
@@ -1150,22 +1201,6 @@ static VALUE trace_func = 0;
 static int tracing = 0;
 static void call_trace_func _((rb_event_t,NODE*,VALUE,ID,VALUE));
 
-#if 0
-#define SET_CURRENT_SOURCE() (ruby_sourcefile = ruby_current_node->nd_file, \
-			      ruby_sourceline = nd_line(ruby_current_node))
-#else
-#define SET_CURRENT_SOURCE() ((void)0)
-#endif
-
-void
-ruby_set_current_source()
-{
-    if (ruby_current_node) {
-	ruby_sourcefile = ruby_current_node->nd_file;
-	ruby_sourceline = nd_line(ruby_current_node);
-    }
-}
-
 static void
 #ifdef HAVE_STDARG_PROTOTYPES
 warn_printf(const char *fmt, ...)
@@ -1227,20 +1262,15 @@ set_backtrace(info, bt)
 static void
 error_print()
 {
-    VALUE errat = Qnil;		/* OK */
+    VALUE errat;
     volatile VALUE eclass, e;
-    char *einfo;
+    const char * einfo;
     long elen;
 
     if (NIL_P(ruby_errinfo)) return;
 
     PUSH_TAG(PROT_NONE);
-    if (EXEC_TAG() == 0) {
-	errat = get_backtrace(ruby_errinfo);
-    }
-    else {
-	errat = Qnil;
-    }
+    errat = EXEC_TAG() ? Qnil : get_backtrace(ruby_errinfo);
     if (EXEC_TAG()) goto error;
     if (NIL_P(errat)){
 	ruby_set_current_source();
@@ -1422,7 +1452,7 @@ ruby_init()
 }
 
 static VALUE
-eval_node(self, node)
+eval_tree(self, node)
     VALUE self;
     NODE *node;
 {
@@ -1571,12 +1601,13 @@ ruby_finalize()
 }
 
 int
-ruby_cleanup(ex)
-    int ex;
+ruby_cleanup(exArg)
+    int exArg;
 {
     int state;
     volatile VALUE errs[2];
-    int nerr;
+    unsigned nerr;
+    volatile int ex = exArg;
 
     errs[1] = ruby_errinfo;
     ruby_safe_level = 0;
@@ -1639,7 +1670,7 @@ ruby_exec_internal()
     /* default visibility is private at toplevel */
     SCOPE_SET(SCOPE_PRIVATE);
     if ((state = EXEC_TAG()) == 0) {
-	eval_node(ruby_top_self, ruby_eval_tree);
+	eval_tree(ruby_top_self, ruby_eval_tree);
     }
     POP_ITER();
     POP_TAG();
@@ -1847,8 +1878,8 @@ rb_eval_cmd(cmd, arg, level)
     int level;
 {
     int state;
-    VALUE val = Qnil;		/* OK */
-    struct SCOPE *saved_scope;
+    VALUE val;
+    struct SCOPE * volatile saved_scope;
     volatile int safe = ruby_safe_level;
 
     if (OBJ_TAINTED(cmd)) {
@@ -1879,9 +1910,7 @@ rb_eval_cmd(cmd, arg, level)
     ruby_safe_level = level;
 
     PUSH_TAG(PROT_NONE);
-    if ((state = EXEC_TAG()) == 0) {
-	val = eval(ruby_top_self, cmd, Qnil, 0, 0);
-    }
+    val = (state = EXEC_TAG()) ? Qnil : eval(ruby_top_self, cmd, Qnil, 0, 0);
     if (ruby_scope->flags & SCOPE_DONT_RECYCLE)
 	scope_dup(saved_scope);
     ruby_scope = saved_scope;
@@ -1920,6 +1949,10 @@ ev_const_defined(cref, id, self)
     return rb_const_defined(cref->nd_clss, id);
 }
 
+NOINLINE(static VALUE ev_const_get _((NODE *cref, ID id, VALUE self)));
+NOINLINE(static void eval_cvar_set _((NODE *node, VALUE result, int warn)));
+NOINLINE(static void eval_cdecl _((VALUE self, NODE *node, VALUE value)));
+
 static VALUE
 ev_const_get(cref, id, self)
     NODE *cref;
@@ -2032,7 +2065,7 @@ void
 rb_frozen_class_p(klass)
     VALUE klass;
 {
-    char *desc = "something(?!)";
+    const char *desc = "something(?!)";
 
     if (OBJ_FROZEN(klass)) {
 	if (FL_TEST(klass, FL_SINGLETON))
@@ -2070,7 +2103,7 @@ rb_undef(klass, id)
     }
     body = search_method(klass, id, &origin);
     if (!body || !body->nd_body) {
-	char *s0 = " class";
+	const char *s0 = " class";
 	VALUE c = klass;
 
 	if (FL_TEST(c, FL_SINGLETON)) {
@@ -2161,7 +2194,7 @@ rb_alias(klass, name, def)
     VALUE klass;
     ID name, def;
 {
-    VALUE origin;
+    VALUE origin = 0;
     NODE *orig, *body, *node;
     VALUE singleton = 0;
     st_data_t data;
@@ -2247,7 +2280,10 @@ rb_copy_node_scope(node, rval)
     NODE *node;
     NODE *rval;
 {
-    NODE *copy = NEW_NODE(NODE_SCOPE,0,rval,node->nd_next);
+    NODE *copy;
+
+    SET_METHOD_SOURCE();
+    copy=NEW_NODE(NODE_SCOPE,0,rval,node->nd_next);
 
     if (node->nd_tbl) {
 	copy->nd_tbl = ALLOC_N(ID, node->nd_tbl[0]+1);
@@ -2322,9 +2358,9 @@ rb_copy_node_scope(node, rval)
 
 #define MATCH_DATA *rb_svar(node->nd_cnt)
 
-static char* is_defined _((VALUE, NODE*, char*));
+static const char* is_defined _((VALUE, NODE*, char*));
 
-static char*
+static const char*
 arg_defined(self, node, buf, type)
     VALUE self;
     NODE *node;
@@ -2351,13 +2387,13 @@ arg_defined(self, node, buf, type)
     return type;
 }
 
-static char*
+static const char*
 is_defined(self, node, buf)
     VALUE self;
-    NODE *node;			/* OK */
+    NODE *node;
     char *buf;
 {
-    VALUE val;			/* OK */
+    VALUE val;
     int state;
 
   again:
@@ -2671,27 +2707,27 @@ set_trace_func(obj, trace)
     return trace;
 }
 
-static char *
+static const char *
 get_event_name(rb_event_t event)
 {
     switch (event) {
-    case RUBY_EVENT_LINE:
+      case RUBY_EVENT_LINE:
 	return "line";
-    case RUBY_EVENT_CLASS:
+      case RUBY_EVENT_CLASS:
 	return "class";
-    case RUBY_EVENT_END:
+      case RUBY_EVENT_END:
 	return "end";
-    case RUBY_EVENT_CALL:
+      case RUBY_EVENT_CALL:
 	return "call";
-    case RUBY_EVENT_RETURN:
+      case RUBY_EVENT_RETURN:
 	return "return";
-    case RUBY_EVENT_C_CALL:
+      case RUBY_EVENT_C_CALL:
 	return "c-call";
-    case RUBY_EVENT_C_RETURN:
+      case RUBY_EVENT_C_RETURN:
 	return "c-return";
-    case RUBY_EVENT_RAISE:
+      case RUBY_EVENT_RAISE:
 	return "raise";
-    default:
+      default:
 	return "unknown";
     }
 }
@@ -2702,14 +2738,15 @@ call_trace_func(event, node, self, id, klass)
     NODE *node;
     VALUE self;
     ID id;
-    VALUE klass;		/* OK */
+    VALUE klass;
 {
-    int state, raised;
+    int state;
+    volatile int raised;
     struct FRAME *prev;
-    NODE *node_save;
+    NODE * volatile node_save;
     VALUE srcfile;
-    char *event_name;
-    rb_thread_t th = curr_thread;
+    const char *event_name;
+    volatile rb_thread_t th = curr_thread;
 
     if (!trace_func) return;
     if (tracing) return;
@@ -2918,11 +2955,11 @@ class_prefix(self, cpath)
 NORETURN(static void return_jump _((VALUE)));
 NORETURN(static void break_jump _((VALUE)));
 NORETURN(static void next_jump _((VALUE)));
-NORETURN(static void unknown_node _((NODE * volatile)));
+NORETURN(static void unknown_node _((NODE *)));
 
 static void
 unknown_node(node)
-    NODE *volatile node;
+    NODE *node;
 {
     ruby_current_node = 0;
     if (node->flags == 0) {
@@ -2936,40 +2973,886 @@ unknown_node(node)
     }
 }
 
-static VALUE
-rb_eval(self, n)
-    VALUE self;
-    NODE *n;
+/*
+ *  functions factored out of rb_eval() to reduce its stack frame size
+ */
+#define eval_node_0(n,retType, self, node)  \
+NOINLINE(static retType TOKEN_PASTE(eval_,n) _((self, node)));\
+static retType TOKEN_PASTE(eval_,n)(self, node)
+
+#define eval_node(n,retType) \
+  eval_node_0(n,retType, VALUE self, NODE *node)
+#define eval_node_volatile(n,retType) \
+  eval_node_0(n,retType, volatile VALUE self, NODE * volatile node)
+
+eval_node(match2, VALUE)
+{
+    VALUE l = rb_eval(self,node->nd_recv);
+    VALUE r = rb_eval(self,node->nd_value);
+    return rb_reg_match(l, r);
+}
+
+eval_node(match3, VALUE)
 {
-    NODE * volatile contnode = 0;
-    NODE * volatile node = n;
+  VALUE r = rb_eval(self,node->nd_recv);
+  VALUE l = rb_eval(self,node->nd_value);
+  return TYPE(l) == T_STRING ? rb_reg_match(r, l) : rb_funcall(l, match, 1, r);
+}
+
+
+eval_node_volatile(opt_n, void)
+{
+  int state;
+  PUSH_TAG(PROT_LOOP);
+  switch (state = EXEC_TAG()) {
+    case TAG_NEXT:
+      state = 0;
+    case 0:
+      while (!NIL_P(rb_gets())) {
+	opt_n_redo:
+	  rb_eval(self, node->nd_body);
+      }
+      break;
+
+    case TAG_REDO:
+      state = 0;
+      goto opt_n_redo;
+
+    case TAG_BREAK:
+      state = 0;
+    default:
+      break;
+  }
+  POP_TAG();
+  if (state) JUMP_TAG(state);
+}
+
+
+eval_node(when, NODE*)
+{
+  do {
+      NODE *tag = node->nd_head;
+      while (tag) {
+	  EXEC_EVENT_HOOK(RUBY_EVENT_LINE, tag, self,
+			  ruby_frame->last_func,
+			  ruby_frame->last_class);
+	  if (tag->nd_head && nd_type(tag->nd_head) == NODE_WHEN) {
+	      VALUE v = rb_eval(self, tag->nd_head->nd_head);
+	      long i;
+
+	      if (TYPE(v) != T_ARRAY) v = rb_ary_to_ary(v);
+	      for (i=0; i<RARRAY(v)->len; i++) {
+		  if (RTEST(RARRAY(v)->ptr[i])) return node->nd_body;
+	      }
+	      tag = tag->nd_next;
+	      continue;
+	  }
+	  if (RTEST(rb_eval(self, tag->nd_head))) return node->nd_body;
+	  tag = tag->nd_next;
+      }
+  } while ((node = node->nd_next) && nd_type(node) == NODE_WHEN);
+  return node;
+}
+
+
+eval_node(case, NODE*)
+{
+  VALUE val = rb_eval(self, node->nd_head);
+  node = node->nd_body;
+  while (node) {
+      NODE *tag;
+
+      if (nd_type(node) != NODE_WHEN) break;
+      tag = node->nd_head;
+      while (tag) {
+	  EXEC_EVENT_HOOK(RUBY_EVENT_LINE, tag, self,
+			  ruby_frame->last_func,
+			  ruby_frame->last_class);
+	  if (tag->nd_head && nd_type(tag->nd_head) == NODE_WHEN) {
+	      VALUE v = rb_eval(self, tag->nd_head->nd_head);
+	      long i;
+
+	      if (TYPE(v) != T_ARRAY) v = rb_ary_to_ary(v);
+	      for (i=0; i<RARRAY(v)->len; i++) {
+		  if (RTEST(rb_funcall2(RARRAY(v)->ptr[i], eqq, 1, &val)))
+		      return node->nd_body;
+	      }
+	      tag = tag->nd_next;
+	      continue;
+	  }
+	  if (RTEST(rb_funcall2(rb_eval(self, tag->nd_head), eqq, 1, &val)))
+	      return node->nd_body;
+	  tag = tag->nd_next;
+      }
+      node = node->nd_next;
+  }
+  return node;
+}
+
+
+eval_node_volatile(while, VALUE)
+{
+  int state;
+  VALUE result;
+  PUSH_TAG(PROT_LOOP);
+  switch (state = EXEC_TAG()) {
+    case 0:
+      if (!(node->nd_state) || RTEST(rb_eval(self, node->nd_cond))) {
+        do {
+	  while_redo:
+#if STACK_WIPE_SITES & 0x10
+            rb_gc_wipe_stack();
+#endif
+	    rb_eval(self, node->nd_body);
+	  while_next:
+	    ;
+        } while (RTEST(rb_eval(self, node->nd_cond)));
+      }  /* fall thru */
+    default:
+      result=Qnil;
+      break;
+
+    case TAG_REDO:
+      state = 0;
+      goto while_redo;
+    case TAG_NEXT:
+      state = 0;
+      goto while_next;
+    case TAG_BREAK:
+      if (TAG_DST()) {
+	  state = 0;
+	  result = prot_tag->retval;
+      }
+  }
+  POP_TAG();
+  if (state) JUMP_TAG(state);
+  return result;
+}
+
+
+eval_node_volatile(until, VALUE)
+{
+  int state;
+  VALUE result;
+  PUSH_TAG(PROT_LOOP);
+  switch (state = EXEC_TAG()) {
+    case 0:
+      if (!(node->nd_state) || !RTEST(rb_eval(self, node->nd_cond))) {
+        do {
+          until_redo:
+  #if STACK_WIPE_SITES & 0x10
+            rb_gc_wipe_stack();
+  #endif
+	    rb_eval(self, node->nd_body);
+          until_next:
+	    ;
+        } while (!RTEST(rb_eval(self, node->nd_cond)));
+      }  /* fall thru */
+    default:
+      result=Qnil;
+      break;
+
+    case TAG_REDO:
+      state = 0;
+      goto until_redo;
+    case TAG_NEXT:
+      state = 0;
+      goto until_next;
+    case TAG_BREAK:
+      if (TAG_DST()) {
+	  state = 0;
+	  result = prot_tag->retval;
+      }
+  }
+  POP_TAG();
+  if (state) JUMP_TAG(state);
+  return result;
+}
+
+
+eval_node_volatile(iter, VALUE)
+{
+  int state;
+  VALUE result;
+
+  PUSH_TAG(PROT_LOOP);
+  PUSH_BLOCK(node->nd_var, node->nd_body);
+
+  state = EXEC_TAG();
+  switch (state) {
+    case TAG_RETRY:
+      state = 0;  /* fall thru to case 0 */
+    case 0:
+      PUSH_ITER(ITER_PRE);
+      if (nd_type(node) == NODE_ITER) {
+	  result = rb_eval(self, node->nd_iter);
+      }
+      else {
+	  _block.flags &= ~BLOCK_D_SCOPE;
+	  BEGIN_CALLARGS;
+	  result = rb_eval(self, node->nd_iter);
+	  END_CALLARGS;
+	  ruby_current_node = (NODE *)node;
+	  SET_CURRENT_SOURCE();
+	  result = rb_call(CLASS_OF(result),result,each,0,0,0,self);
+      }
+      POP_ITER();
+      break;
+      
+    case TAG_BREAK:
+      if (TAG_DST()) {
+        result = prot_tag->retval;
+        state = 0;
+      }
+  }
+  POP_BLOCK();
+  POP_TAG();
+  if (state) JUMP_TAG(state);
+  return result;
+}
+
+
+eval_node_volatile(rescue, VALUE)
+{
+    volatile VALUE e_info = ruby_errinfo;
+    volatile int rescuing = 0;
     int state;
-    volatile VALUE result = Qnil;
-    st_data_t data;
+    VALUE result;
 
-#define RETURN(v) do { \
-    result = (v); \
-    goto finish; \
-} while (0)
+    PUSH_TAG(PROT_NONE);
+    if ((state = EXEC_TAG()) == 0) {
+      retry_entry:
+	result = rb_eval(self, node->nd_head);
+    }
+    else if (rescuing) {
+	if (rescuing < 0) {
+	    /* in rescue argument, just reraise */
+            result = Qnil;
+	}
+	else if (state == TAG_RETRY) {
+	    rescuing = state = 0;
+	    ruby_errinfo = e_info;
+	    goto retry_entry;
+	}
+	else if (state != TAG_RAISE) {
+	    result = prot_tag->retval;
+	}
+    }
+    else if (state == TAG_RAISE) {
+	NODE *resq = node->nd_resq;
+
+	rescuing = -1;
+	while (resq) {
+	    ruby_current_node = resq;
+	    if (handle_rescue(self, resq)) {
+		state = 0;
+		rescuing = 1;
+		result = rb_eval(self, resq->nd_body);
+		break;
+	    }
+	    resq = resq->nd_head; /* next rescue */
+	}
+    }
+    else {
+	result = prot_tag->retval;
+    }
+    POP_TAG();
+    if (state != TAG_RAISE) ruby_errinfo = e_info;
+    if (state) {
+	JUMP_TAG(state);
+    }
+    /* no exception raised */
+    if (!rescuing && node->nd_else) { /* else clause given */
+	result = Qundef;  /* caller must eval this! */
+    }
+    return result;
+}
+
+
+eval_node_volatile(ensure, VALUE)
+{
+  int state;
+  VALUE result;
+
+  PUSH_TAG(PROT_NONE);
+  if ((state = EXEC_TAG()) == 0) {
+      result = rb_eval(self, node->nd_head);
+  }
+  POP_TAG();
+  if (node->nd_ensr && !thread_no_ensure()) {
+      VALUE retval = prot_tag->retval; /* save retval */
+      VALUE errinfo = ruby_errinfo;
+
+      rb_eval(self, node->nd_ensr);
+      return_value(retval);
+      ruby_errinfo = errinfo;
+  }
+  if (state) JUMP_TAG(state);
+  return result;
+}
+
+
+eval_node(dot, VALUE)
+{
+  VALUE beg = rb_eval(self, node->nd_beg);
+  VALUE end = rb_eval(self, node->nd_end);
+  return rb_range_new(beg, end, nd_type(node) == NODE_DOT3);
+}
+
+
+eval_node(flip2, VALUE)
+{
+  VALUE *flip = rb_svar(node->nd_cnt);
+  if (!flip) rb_bug("unexpected local variable");
+  if (!RTEST(*flip)) {
+    if (!RTEST(rb_eval(self, node->nd_beg)))
+      return Qfalse;
+    *flip = RTEST(rb_eval(self, node->nd_end))?Qfalse:Qtrue;
+  }
+  else if (RTEST(rb_eval(self, node->nd_end)))
+    *flip = Qfalse;
+  return Qtrue;
+}
+
+
+eval_node(flip3, VALUE)
+{
+  VALUE *flip = rb_svar(node->nd_cnt);
+  if (!flip) rb_bug("unexpected local variable");
+  if (!RTEST(*flip))
+    return *flip = (RTEST(rb_eval(self, node->nd_beg)) ? Qtrue : Qfalse);
+  if (RTEST(rb_eval(self, node->nd_end)))
+    *flip = Qfalse;
+  return Qtrue;
+}
+
+
+eval_node(attrasgn, VALUE)
+{
+  VALUE recv;
+  int argc; VALUE *argv; /* used in SETUP_ARGS */
+  int scope;
+  TMP_PROTECT;
+
+  BEGIN_CALLARGS;
+  if (node->nd_recv == (NODE *)1) {
+      recv = self;
+      scope = 1;
+  }
+  else {
+      recv = rb_eval(self, node->nd_recv);
+      scope = 0;
+  }
+  SETUP_ARGS(node->nd_args);
+  END_CALLARGS;
+
+  ruby_current_node = node;
+  SET_CURRENT_SOURCE();
+  rb_call(CLASS_OF(recv),recv,node->nd_mid,argc,argv,scope,self);
+  return argv[argc-1];
+}
+
+
+eval_node(call, VALUE)
+{
+  VALUE recv;
+  int argc; VALUE *argv; /* used in SETUP_ARGS */
+  TMP_PROTECT;
+
+  BEGIN_CALLARGS;
+  recv = rb_eval(self, node->nd_recv);
+  SETUP_ARGS(node->nd_args);
+  END_CALLARGS;
+
+  ruby_current_node = node;
+  SET_CURRENT_SOURCE();
+  return rb_call(CLASS_OF(recv),recv,node->nd_mid,argc,argv,0,self);
+}
+
+
+eval_node(fcall, VALUE)
+{
+  int argc; VALUE *argv; /* used in SETUP_ARGS */
+  TMP_PROTECT;
+
+  BEGIN_CALLARGS;
+  SETUP_ARGS(node->nd_args);
+  END_CALLARGS;
+
+  ruby_current_node = node;
+  SET_CURRENT_SOURCE();
+  return rb_call(CLASS_OF(self),self,node->nd_mid,argc,argv,1,self);
+}
+
+
+eval_node(super, VALUE)
+{
+  int argc; VALUE *argv; /* used in SETUP_ARGS */
+  TMP_PROTECT;
+
+  if (ruby_frame->last_class == 0) {
+      if (ruby_frame->last_func) {
+	  rb_name_error(ruby_frame->last_func,
+			"superclass method `%s' disabled",
+			rb_id2name(ruby_frame->orig_func));
+      }
+      else {
+	  rb_raise(rb_eNoMethodError, "super called outside of method");
+      }
+  }
+  if (nd_type(node) == NODE_ZSUPER) {
+      argc = ruby_frame->argc;
+      if (argc && DMETHOD_P()) {
+	  if (TYPE(RBASIC(ruby_scope)->klass) != T_ARRAY ||
+	      RARRAY(RBASIC(ruby_scope)->klass)->len != argc) {
+	      rb_raise(rb_eRuntimeError, 
+		       "super: specify arguments explicitly");
+	  }
+	  argv = RARRAY(RBASIC(ruby_scope)->klass)->ptr;
+      }
+      else if (!ruby_scope->local_vars) {
+	  argc = 0;
+	  argv = 0;
+      }
+      else {
+	  argv = ruby_scope->local_vars + 2;
+      }
+  }
+  else {
+      BEGIN_CALLARGS;
+      SETUP_ARGS(node->nd_args);
+      END_CALLARGS;
+      ruby_current_node = node;
+  }
+
+  SET_CURRENT_SOURCE();
+  return rb_call_super(argc, argv);
+}
+
+
+eval_node_volatile(scope, VALUE)
+{
+  int state;
+  VALUE result;
+  struct FRAME frame;
+  NODE * volatile saved_cref = 0;
+
+  frame = *ruby_frame;
+  frame.tmp = ruby_frame;
+  ruby_frame = &frame;
+
+  PUSH_SCOPE();
+  PUSH_TAG(PROT_NONE);
+  if (node->nd_rval) {
+      saved_cref = ruby_cref;
+      ruby_cref = (NODE*)node->nd_rval;
+  }
+  if (node->nd_tbl) {
+      VALUE *vars = ALLOCA_N(VALUE, node->nd_tbl[0]+1);
+      *vars++ = (VALUE)node;
+      ruby_scope->local_vars = vars;
+      rb_mem_clear(ruby_scope->local_vars, node->nd_tbl[0]);
+      ruby_scope->local_tbl = node->nd_tbl;
+  }
+  else {
+      ruby_scope->local_vars = 0;
+      ruby_scope->local_tbl  = 0;
+  }
+  if ((state = EXEC_TAG()) == 0) {
+      result = rb_eval(self, node->nd_next);
+  }
+  POP_TAG();
+  POP_SCOPE();
+  ruby_frame = frame.tmp;
+  if (saved_cref)
+      ruby_cref = saved_cref;
+  if (state) JUMP_TAG(state);
+  return result;
+}
+
+eval_node(op_asgn1, VALUE)
+{
+  int argc; VALUE *argv; /* used in SETUP_ARGS */
+  VALUE recv, val, tmp;
+  NODE *rval;
+  TMP_PROTECT;
+
+  recv = rb_eval(self, node->nd_recv);
+  rval = node->nd_args->nd_head;
+  SETUP_ARGS0(node->nd_args->nd_body, 1);
+  val = rb_funcall3(recv, aref, argc, argv);
+  switch (node->nd_mid) {
+  case 0: /* OR */
+    if (RTEST(val)) return val;
+    val = rb_eval(self, rval);
+    break;
+  case 1: /* AND */
+    if (!RTEST(val)) return val;
+    val = rb_eval(self, rval);
+    break;
+  default:
+    tmp = rb_eval(self, rval);
+    val = rb_funcall3(val, node->nd_mid, 1, &tmp);
+  }
+  argv[argc] = val;
+  rb_funcall2(recv, aset, argc+1, argv);
+  return val;
+}
+
+
+eval_node(op_asgn2, VALUE)
+{
+  ID id = node->nd_next->nd_vid;
+  VALUE recv, val, tmp;
+
+  recv = rb_eval(self, node->nd_recv);
+  val = rb_funcall3(recv, id, 0, 0);
+  switch (node->nd_next->nd_mid) {
+  case 0: /* OR */
+    if (RTEST(val)) return val;
+    val = rb_eval(self, node->nd_value);
+    break;
+  case 1: /* AND */
+    if (!RTEST(val)) return val;
+    val = rb_eval(self, node->nd_value);
+    break;
+  default:
+    tmp = rb_eval(self, node->nd_value);
+    val = rb_funcall3(val, node->nd_next->nd_mid, 1, &tmp);
+  }
+
+  rb_funcall2(recv, node->nd_next->nd_aid, 1, &val);
+  return val;
+}
+
+
+eval_node(hash, VALUE)
+{
+  NODE *list;
+  VALUE hash = rb_hash_new();
+  VALUE key, val;
+
+  list = node->nd_head;
+  while (list) {
+      key = rb_eval(self, list->nd_head);
+      list = list->nd_next;
+      if (list == 0)
+	  rb_bug("odd number list for Hash");
+      val = rb_eval(self, list->nd_head);
+      list = list->nd_next;
+      rb_hash_aset(hash, key, val);
+  }
+  return hash;
+}
+
+
+eval_node(array, VALUE)
+{
+  VALUE ary;
+  long i;
+
+  i = node->nd_alen;
+  ary = rb_ary_new2(i);
+  for (i=0;node;node=node->nd_next) {
+      RARRAY(ary)->ptr[i++] = rb_eval(self, node->nd_head);
+      RARRAY(ary)->len = i;
+  }
+  return ary;
+}
+
+
+eval_node(slit, VALUE)
+{
+  VALUE str, str2;
+  NODE *list = node->nd_next;
+
+  str = rb_str_new3(node->nd_lit);
+  while (list) {
+      if (list->nd_head) {
+	  switch (nd_type(list->nd_head)) {
+	    case NODE_STR:
+	      str2 = list->nd_head->nd_lit;
+	      break;
+	    default:
+	      str2 = rb_eval(self, list->nd_head);
+	      break;
+	  }
+	  rb_str_append(str, str2);
+	  OBJ_INFECT(str, str2);
+      }
+      list = list->nd_next;
+  }
+  switch (nd_type(node)) {
+    case NODE_DREGX:
+      str2 = rb_reg_new(RSTRING(str)->ptr, RSTRING(str)->len,
+			  node->nd_cflag);
+      RB_GC_GUARD(str);  /* prevent tail call optimization here */
+      return str2;
+    case NODE_DREGX_ONCE:	/* regexp expand once */
+      str2 = rb_reg_new(RSTRING(str)->ptr, RSTRING(str)->len,
+			  node->nd_cflag);
+      nd_set_type(node, NODE_LIT);
+      RB_GC_GUARD(str);  /* ensure str is not GC'd in rb_reg_new */
+      return node->nd_lit = str2;
+    case NODE_LIT:
+      /* other thread may replace NODE_DREGX_ONCE to NODE_LIT */
+      return Qundef;
+    case NODE_DXSTR:
+      return rb_funcall(self, '`', 1, str);
+    case NODE_DSYM:
+      return rb_str_intern(str);
+  }
+  return str;
+}
+
+        
+eval_node(defn, void)
+{
+  NODE *body,  *defn;
+  VALUE origin = 0;
+  int noex;
+
+  if (NIL_P(ruby_class)) {
+      rb_raise(rb_eTypeError, "no class/module to add method");
+  }
+  if (ruby_class == rb_cObject && node->nd_mid == init) {
+      rb_warn("redefining Object#initialize may cause infinite loop");
+  }
+  if (node->nd_mid == __id__ || node->nd_mid == __send__) {
+      rb_warn("redefining `%s' may cause serious problem",
+	      rb_id2name(node->nd_mid));
+  }
+  rb_frozen_class_p(ruby_class);
+  body = search_method(ruby_class, node->nd_mid, &origin);
+  if (body){
+      if (RTEST(ruby_verbose) && ruby_class == origin && body->nd_cnt == 0 && body->nd_body) {
+	  rb_warning("method redefined; discarding old %s", rb_id2name(node->nd_mid));
+      }
+  }
+
+  if (SCOPE_TEST(SCOPE_PRIVATE) || node->nd_mid == init) {
+      noex = NOEX_PRIVATE;
+  }
+  else if (SCOPE_TEST(SCOPE_PROTECTED)) {
+      noex = NOEX_PROTECTED;
+  }
+  else {
+      noex = NOEX_PUBLIC;
+  }
+  if (body && origin == ruby_class && body->nd_body == 0) {
+      noex |= NOEX_NOSUPER;
+  }
+
+  defn = rb_copy_node_scope(node->nd_defn, ruby_cref);
+  rb_add_method(ruby_class, node->nd_mid, defn, noex);
+  if (scope_vmode == SCOPE_MODFUNC) {
+      rb_add_method(rb_singleton_class(ruby_class),
+		    node->nd_mid, defn, NOEX_PUBLIC);
+  }
+}
+
+
+eval_node(defs, void)
+{
+  VALUE recv = rb_eval(self, node->nd_recv);
+  VALUE klass;
+  NODE *body = 0, *defn;
+  st_data_t data;
+
+  if (ruby_safe_level >= 4 && !OBJ_TAINTED(recv)) {
+      rb_raise(rb_eSecurityError, "Insecure: can't define singleton method");
+  }
+  if (FIXNUM_P(recv) || SYMBOL_P(recv)) {
+      rb_raise(rb_eTypeError,
+	       "can't define singleton method \"%s\" for %s",
+	       rb_id2name(node->nd_mid),
+	       rb_obj_classname(recv));
+  }
+
+  if (OBJ_FROZEN(recv)) rb_error_frozen("object");
+  klass = rb_singleton_class(recv);
+  if (st_lookup(RCLASS(klass)->m_tbl, node->nd_mid, &data)) {
+      body = (NODE *)data;
+      if (ruby_safe_level >= 4) {
+	  rb_raise(rb_eSecurityError, "redefining method prohibited");
+      }
+      if (RTEST(ruby_verbose)) {
+	  rb_warning("redefine %s", rb_id2name(node->nd_mid));
+      }
+  }
+  defn = rb_copy_node_scope(node->nd_defn, ruby_cref);
+  rb_add_method(klass, node->nd_mid, defn,
+		NOEX_PUBLIC|(body?body->nd_noex&NOEX_UNDEF:0));
+}
+
+
+eval_node(class, VALUE)
+{
+    VALUE super, klass, tmp, cbase;
+    ID cname;
+    int gen = Qfalse;
+
+    cbase = class_prefix(self, node->nd_cpath);
+    cname = node->nd_cpath->nd_mid;
+
+    if (NIL_P(ruby_cbase)) {
+	rb_raise(rb_eTypeError, "no outer class/module");
+    }
+    if (node->nd_super) {
+       super = rb_eval(self, node->nd_super);
+       rb_check_inheritable(super);
+    }
+    else {
+	super = 0;
+    }
+
+    if (rb_const_defined_at(cbase, cname)) {
+	klass = rb_const_get_at(cbase, cname);
+	if (TYPE(klass) != T_CLASS) {
+	    rb_raise(rb_eTypeError, "%s is not a class",
+		     rb_id2name(cname));
+	}
+	if (super) {
+	    tmp = rb_class_real(RCLASS(klass)->super);
+	    if (tmp != super) {
+		rb_raise(rb_eTypeError, "superclass mismatch for class %s",
+			 rb_id2name(cname));
+	    }
+	    super = 0;
+	}
+	if (ruby_safe_level >= 4) {
+	    rb_raise(rb_eSecurityError, "extending class prohibited");
+	}
+    }
+    else {
+	if (!super) super = rb_cObject;
+	klass = rb_define_class_id(cname, super);
+	rb_set_class_path(klass, cbase, rb_id2name(cname));
+	rb_const_set(cbase, cname, klass);
+	gen = Qtrue;
+    }
+    if (ruby_wrapper) {
+	rb_extend_object(klass, ruby_wrapper);
+	rb_include_module(klass, ruby_wrapper);
+    }
+    if (super && gen) {
+	rb_class_inherited(super, klass);
+    }
+    return module_setup(klass, node);
+}
+
+
+eval_node(module, VALUE)
+{
+  VALUE module, cbase;
+  ID cname;
+
+  if (NIL_P(ruby_cbase)) {
+      rb_raise(rb_eTypeError, "no outer class/module");
+  }
+  cbase = class_prefix(self, node->nd_cpath);
+  cname = node->nd_cpath->nd_mid;
+  if (rb_const_defined_at(cbase, cname)) {
+      module = rb_const_get_at(cbase, cname);
+      if (TYPE(module) != T_MODULE) {
+	  rb_raise(rb_eTypeError, "%s is not a module",
+		   rb_id2name(cname));
+      }
+      if (ruby_safe_level >= 4) {
+	  rb_raise(rb_eSecurityError, "extending module prohibited");
+      }
+  }
+  else {
+      module = rb_define_module_id(cname);
+      rb_set_class_path(module, cbase, rb_id2name(cname));
+      rb_const_set(cbase, cname, module);
+  }
+  if (ruby_wrapper) {
+      rb_extend_object(module, ruby_wrapper);
+      rb_include_module(module, ruby_wrapper);
+  }
+
+  return module_setup(module, node);
+}
+
+
+eval_node(sclass, VALUE)
+{
+  VALUE klass, result;
+
+  result = rb_eval(self, node->nd_recv);
+  if (FIXNUM_P(result) || SYMBOL_P(result)) {
+      rb_raise(rb_eTypeError, "no virtual class for %s",
+	       rb_obj_classname(result));
+  }
+  if (ruby_safe_level >= 4 && !OBJ_TAINTED(result))
+      rb_raise(rb_eSecurityError, "Insecure: can't extend object");
+  klass = rb_singleton_class(result);
+
+  if (ruby_wrapper) {
+      rb_extend_object(klass, ruby_wrapper);
+      rb_include_module(klass, ruby_wrapper);
+  }
+
+  return module_setup(klass, node);
+}
+
+
+eval_node(defined, VALUE)
+{
+    char buf[20];
+    const char *desc = is_defined(self, node->nd_head, buf);
+    return desc ? rb_str_new2(desc) : Qnil;
+}
+
+
+static void
+eval_cvar_set(node, result, warn)
+  NODE *node;
+  VALUE result;
+  int warn;
+{
+  rb_cvar_set(cvar_cbase(), node->nd_vid, result, warn);
+}
+
+
+static void
+eval_cdecl(self, node, result)
+  VALUE self, result;
+  NODE *node;
+{
+  if (node->nd_vid == 0)
+      rb_const_set(class_prefix(self, node->nd_else), 
+                          node->nd_else->nd_mid, result);
+  else
+      rb_const_set(ruby_cbase, node->nd_vid, result);
+}
 
-  again:
-    if (!node) RETURN(Qnil);
 
+static VALUE
+rb_eval(self, node)
+  VALUE self;
+  NODE * node;
+{
+  VALUE result;
+
+again:
+  CHECK_INTS;
+  result = Qnil;
+  if (node) {
     ruby_current_node = node;
     switch (nd_type(node)) {
       case NODE_BLOCK:
-	if (contnode) {
-	    result = rb_eval(self, node);
-	    break;
+	while (node->nd_next) {
+	    rb_eval(self, node->nd_head);
+	    node = node->nd_next;
 	}
-	contnode = node->nd_next;
 	node = node->nd_head;
 	goto again;
 
       case NODE_POSTEXE:
 	rb_f_END();
 	nd_set_type(node, NODE_NIL); /* exec just once */
-	result = Qnil;
 	break;
 
 	/* begin .. end without clauses */
@@ -2984,223 +3867,57 @@ rb_eval(self, n)
 
 	/* nodes for speed-up(literal match) */
       case NODE_MATCH2:
-	{
-	    VALUE l = rb_eval(self,node->nd_recv);
-	    VALUE r = rb_eval(self,node->nd_value);
-	    result = rb_reg_match(l, r);
-	}
+        result = eval_match2(self, node);
 	break;
 
 	/* nodes for speed-up(literal match) */
       case NODE_MATCH3:
-	{
-	    VALUE r = rb_eval(self,node->nd_recv);
-	    VALUE l = rb_eval(self,node->nd_value);
-	    if (TYPE(l) == T_STRING) {
-		result = rb_reg_match(r, l);
-	    }
-	    else {
-		result = rb_funcall(l, match, 1, r);
-	    }
-	}
+        result = eval_match3(self,node);
 	break;
 
 	/* node for speed-up(top-level loop for -n/-p) */
       case NODE_OPT_N:
-	PUSH_TAG(PROT_LOOP);
-	switch (state = EXEC_TAG()) {
-	  case 0:
-	  opt_n_next:
-	    while (!NIL_P(rb_gets())) {
-	      opt_n_redo:
-		rb_eval(self, node->nd_body);
-	    }
-	    break;
-
-	  case TAG_REDO:
-	    state = 0;
-	    goto opt_n_redo;
-	  case TAG_NEXT:
-	    state = 0;
-	    goto opt_n_next;
-	  case TAG_BREAK:
-	    state = 0;
-	  default:
-	    break;
-	}
-	POP_TAG();
-	if (state) JUMP_TAG(state);
-	RETURN(Qnil);
+        eval_opt_n(self, node);
+        break;
 
       case NODE_SELF:
-	RETURN(self);
+	result = self;
+        break;
 
       case NODE_NIL:
-	RETURN(Qnil);
+	break;
 
       case NODE_TRUE:
-	RETURN(Qtrue);
+	result = Qtrue;
+        break;
 
       case NODE_FALSE:
-	RETURN(Qfalse);
+	result = Qfalse;
+        break;
 
       case NODE_IF:
 	EXEC_EVENT_HOOK(RUBY_EVENT_LINE, node, self,
 			ruby_frame->last_func,
 			ruby_frame->last_class);
-	if (RTEST(rb_eval(self, node->nd_cond))) {
-	    node = node->nd_body;
-	}
-	else {
-	    node = node->nd_else;
-	}
+	node = RTEST(rb_eval(self, node->nd_cond)) ? 
+                                     node->nd_body : node->nd_else;
 	goto again;
 
       case NODE_WHEN:
-	while (node) {
-	    NODE *tag;
-
-	    if (nd_type(node) != NODE_WHEN) goto again;
-	    tag = node->nd_head;
-	    while (tag) {
-		EXEC_EVENT_HOOK(RUBY_EVENT_LINE, tag, self,
-				ruby_frame->last_func,
-				ruby_frame->last_class);
-		if (tag->nd_head && nd_type(tag->nd_head) == NODE_WHEN) {
-		    VALUE v = rb_eval(self, tag->nd_head->nd_head);
-		    long i;
-
-		    if (TYPE(v) != T_ARRAY) v = rb_ary_to_ary(v);
-		    for (i=0; i<RARRAY(v)->len; i++) {
-			if (RTEST(RARRAY(v)->ptr[i])) {
-			    node = node->nd_body;
-			    goto again;
-			}
-		    }
-		    tag = tag->nd_next;
-		    continue;
-		}
-		if (RTEST(rb_eval(self, tag->nd_head))) {
-		    node = node->nd_body;
-		    goto again;
-		}
-		tag = tag->nd_next;
-	    }
-	    node = node->nd_next;
-	}
-	RETURN(Qnil);
+        if (node = eval_when(self, node)) goto again;
+        break;
 
       case NODE_CASE:
-	{
-	    VALUE val;
-
-	    val = rb_eval(self, node->nd_head);
-	    node = node->nd_body;
-	    while (node) {
-		NODE *tag;
-
-		if (nd_type(node) != NODE_WHEN) {
-		    goto again;
-		}
-		tag = node->nd_head;
-		while (tag) {
-		    EXEC_EVENT_HOOK(RUBY_EVENT_LINE, tag, self,
-				    ruby_frame->last_func,
-				    ruby_frame->last_class);
-		    if (tag->nd_head && nd_type(tag->nd_head) == NODE_WHEN) {
-			VALUE v = rb_eval(self, tag->nd_head->nd_head);
-			long i;
-
-			if (TYPE(v) != T_ARRAY) v = rb_ary_to_ary(v);
-			for (i=0; i<RARRAY(v)->len; i++) {
-			    if (RTEST(rb_funcall2(RARRAY(v)->ptr[i], eqq, 1, &val))){
-				node = node->nd_body;
-				goto again;
-			    }
-			}
-			tag = tag->nd_next;
-			continue;
-		    }
-		    if (RTEST(rb_funcall2(rb_eval(self, tag->nd_head), eqq, 1, &val))) {
-			node = node->nd_body;
-			goto again;
-		    }
-		    tag = tag->nd_next;
-		}
-		node = node->nd_next;
-	    }
-	}
-	RETURN(Qnil);
+        if (node = eval_case(self, node)) goto again;
+        break;
 
       case NODE_WHILE:
-	PUSH_TAG(PROT_LOOP);
-	result = Qnil;
-	switch (state = EXEC_TAG()) {
-	  case 0:
-	    if (node->nd_state && !RTEST(rb_eval(self, node->nd_cond)))
-		goto while_out;
-	    do {
-	      while_redo:
-		rb_eval(self, node->nd_body);
-	      while_next:
-		;
-	    } while (RTEST(rb_eval(self, node->nd_cond)));
-	    break;
-
-	  case TAG_REDO:
-	    state = 0;
-	    goto while_redo;
-	  case TAG_NEXT:
-	    state = 0;
-	    goto while_next;
-	  case TAG_BREAK:
-	    if (TAG_DST()) {
-		state = 0;
-		result = prot_tag->retval;
-	    }
-	    /* fall through */
-	  default:
-	    break;
-	}
-      while_out:
-	POP_TAG();
-	if (state) JUMP_TAG(state);
-	RETURN(result);
+        result = eval_while(self,node);
+        break;
 
       case NODE_UNTIL:
-	PUSH_TAG(PROT_LOOP);
-	result = Qnil;
-	switch (state = EXEC_TAG()) {
-	  case 0:
-	    if (node->nd_state && RTEST(rb_eval(self, node->nd_cond)))
-		goto until_out;
-	    do {
-	      until_redo:
-		rb_eval(self, node->nd_body);
-	      until_next:
-		;
-	    } while (!RTEST(rb_eval(self, node->nd_cond)));
-	    break;
-
-	  case TAG_REDO:
-	    state = 0;
-	    goto until_redo;
-	  case TAG_NEXT:
-	    state = 0;
-	    goto until_next;
-	  case TAG_BREAK:
-	    if (TAG_DST()) {
-		state = 0;
-		result = prot_tag->retval;
-	    }
-	    /* fall through */
-	  default:
-	    break;
-	}
-      until_out:
-	POP_TAG();
-	if (state) JUMP_TAG(state);
-	RETURN(result);
+        result = eval_until(self,node);
+        break;
 
       case NODE_BLOCK_PASS:
 	result = block_pass(self, node);
@@ -3208,47 +3925,7 @@ rb_eval(self, n)
 
       case NODE_ITER:
       case NODE_FOR:
-	{
-	    PUSH_TAG(PROT_LOOP);
-	    PUSH_BLOCK(node->nd_var, node->nd_body);
-
-	    state = EXEC_TAG();
-	    if (state == 0) {
-	      iter_retry:
-		PUSH_ITER(ITER_PRE);
-		if (nd_type(node) == NODE_ITER) {
-		    result = rb_eval(self, node->nd_iter);
-		}
-		else {
-		    VALUE recv;
-
-		    _block.flags &= ~BLOCK_D_SCOPE;
-		    BEGIN_CALLARGS;
-		    recv = rb_eval(self, node->nd_iter);
-		    END_CALLARGS;
-		    ruby_current_node = node;
-		    SET_CURRENT_SOURCE();
-		    result = rb_call(CLASS_OF(recv),recv,each,0,0,0,self);
-		}
-		POP_ITER();
-	    }
-	    else if (state == TAG_BREAK && TAG_DST()) {
-		result = prot_tag->retval;
-		state = 0;
-	    }
-	    else if (state == TAG_RETRY) {
-		state = 0;
-		goto iter_retry;
-	    }
-	    POP_BLOCK();
-	    POP_TAG();
-	    switch (state) {
-	      case 0:
-		break;
-	      default:
-		JUMP_TAG(state);
-	    }
-	}
+	result = eval_iter(self, node);
 	break;
 
       case NODE_BREAK:
@@ -3256,17 +3933,14 @@ rb_eval(self, n)
 	break;
 
       case NODE_NEXT:
-	CHECK_INTS;
 	next_jump(rb_eval(self, node->nd_stts));
 	break;
 
       case NODE_REDO:
-	CHECK_INTS;
 	JUMP_TAG(TAG_REDO);
 	break;
 
       case NODE_RETRY:
-	CHECK_INTS;
 	JUMP_TAG(TAG_RETRY);
 	break;
 
@@ -3296,73 +3970,15 @@ rb_eval(self, n)
 	break;
 
       case NODE_RESCUE:
-	{
-	    volatile VALUE e_info = ruby_errinfo;
-	    volatile int rescuing = 0;
-
-	    PUSH_TAG(PROT_NONE);
-	    if ((state = EXEC_TAG()) == 0) {
-	      retry_entry:
-		result = rb_eval(self, node->nd_head);
-	    }
-	    else if (rescuing) {
-		if (rescuing < 0) {
-		    /* in rescue argument, just reraise */
-		}
-		else if (state == TAG_RETRY) {
-		    rescuing = state = 0;
-		    ruby_errinfo = e_info;
-		    goto retry_entry;
-		}
-		else if (state != TAG_RAISE) {
-		    result = prot_tag->retval;
-		}
-	    }
-	    else if (state == TAG_RAISE) {
-		NODE *resq = node->nd_resq;
-
-		rescuing = -1;
-		while (resq) {
-		    ruby_current_node = resq;
-		    if (handle_rescue(self, resq)) {
-			state = 0;
-			rescuing = 1;
-			result = rb_eval(self, resq->nd_body);
-			break;
-		    }
-		    resq = resq->nd_head; /* next rescue */
-		}
-	    }
-	    else {
-		result = prot_tag->retval;
-	    }
-	    POP_TAG();
-	    if (state != TAG_RAISE) ruby_errinfo = e_info;
-	    if (state) {
-		JUMP_TAG(state);
-	    }
-	    /* no exception raised */
-	    if (!rescuing && (node = node->nd_else)) { /* else clause given */
-		goto again;
-	    }
-	}
+        result = eval_rescue(self,node);
+        if (result == Qundef) {  /* handle else clause w/o recursion */
+          node = node->nd_else;
+          goto again;
+        }
 	break;
 
       case NODE_ENSURE:
-	PUSH_TAG(PROT_NONE);
-	if ((state = EXEC_TAG()) == 0) {
-	    result = rb_eval(self, node->nd_head);
-	}
-	POP_TAG();
-	if (node->nd_ensr && !thread_no_ensure()) {
-	    VALUE retval = prot_tag->retval; /* save retval */
-	    VALUE errinfo = ruby_errinfo;
-
-	    rb_eval(self, node->nd_ensr);
-	    return_value(retval);
-	    ruby_errinfo = errinfo;
-	}
-	if (state) JUMP_TAG(state);
+        result = eval_ensure(self,node);
 	break;
 
       case NODE_AND:
@@ -3378,56 +3994,20 @@ rb_eval(self, n)
 	goto again;
 
       case NODE_NOT:
-	if (RTEST(rb_eval(self, node->nd_body))) result = Qfalse;
-	else result = Qtrue;
+	result = RTEST(rb_eval(self, node->nd_body)) ? Qfalse : Qtrue;
 	break;
 
       case NODE_DOT2:
       case NODE_DOT3:
-        {
-	    VALUE beg = rb_eval(self, node->nd_beg);
-	    VALUE end = rb_eval(self, node->nd_end);
-	    result = rb_range_new(beg, end, nd_type(node) == NODE_DOT3);
-	}	
-	break;
+        result = eval_dot(self,node);
+        break;
 
       case NODE_FLIP2:		/* like AWK */
-	{
-	    VALUE *flip = rb_svar(node->nd_cnt);
-	    if (!flip) rb_bug("unexpected local variable");
-	    if (!RTEST(*flip)) {
-		if (RTEST(rb_eval(self, node->nd_beg))) {
-		    *flip = RTEST(rb_eval(self, node->nd_end))?Qfalse:Qtrue;
-		    result = Qtrue;
-		}
-		else {
-		    result = Qfalse;
-		}
-	    }
-	    else {
-		if (RTEST(rb_eval(self, node->nd_end))) {
-		    *flip = Qfalse;
-		}
-		result = Qtrue;
-	    }
-	}
+        result = eval_flip2(self,node);
 	break;
 
       case NODE_FLIP3:		/* like SED */
-	{
-	    VALUE *flip = rb_svar(node->nd_cnt);
-	    if (!flip) rb_bug("unexpected local variable");
-	    if (!RTEST(*flip)) {
-		result = RTEST(rb_eval(self, node->nd_beg)) ? Qtrue : Qfalse;
-		*flip = result;
-	    }
-	    else {
-		if (RTEST(rb_eval(self, node->nd_end))) {
-		    *flip = Qfalse;
-		}
-		result = Qtrue;
-	    }
-	}
+        result = eval_flip3(self,node);
 	break;
 
       case NODE_RETURN:
@@ -3435,75 +4015,25 @@ rb_eval(self, n)
 	break;
 
       case NODE_ARGSCAT:
-	{
-	    VALUE args = rb_eval(self, node->nd_head);
-	    result = rb_ary_concat(args, splat_value(rb_eval(self, node->nd_body)));
-	}
+	result = rb_eval(self, node->nd_head);
+	result = rb_ary_concat(result, splat_value(rb_eval(self, node->nd_body)));
 	break;
 
       case NODE_ARGSPUSH:
-	{
-	    VALUE args = rb_ary_dup(rb_eval(self, node->nd_head));
-	    result = rb_ary_push(args, rb_eval(self, node->nd_body));
-	}
+	result = rb_ary_dup(rb_eval(self, node->nd_head));
+	result = rb_ary_push(result, rb_eval(self, node->nd_body));
 	break;
 
       case NODE_ATTRASGN:
-	{
-	    VALUE recv;
-	    int argc; VALUE *argv; /* used in SETUP_ARGS */
-	    int scope;
-	    TMP_PROTECT;
-
-	    BEGIN_CALLARGS;
-	    if (node->nd_recv == (NODE *)1) {
-		recv = self;
-		scope = 1;
-	    }
-	    else {
-		recv = rb_eval(self, node->nd_recv);
-		scope = 0;
-	    }
-	    SETUP_ARGS(node->nd_args);
-	    END_CALLARGS;
-
-	    ruby_current_node = node;
-	    SET_CURRENT_SOURCE();
-	    rb_call(CLASS_OF(recv),recv,node->nd_mid,argc,argv,scope,self);
-	    result = argv[argc-1];
-	}
-	break;
+        result = eval_attrasgn(self,node);
+        break;
 
       case NODE_CALL:
-	{
-	    VALUE recv;
-	    int argc; VALUE *argv; /* used in SETUP_ARGS */
-	    TMP_PROTECT;
-
-	    BEGIN_CALLARGS;
-	    recv = rb_eval(self, node->nd_recv);
-	    SETUP_ARGS(node->nd_args);
-	    END_CALLARGS;
-
-	    ruby_current_node = node;
-	    SET_CURRENT_SOURCE();
-	    result = rb_call(CLASS_OF(recv),recv,node->nd_mid,argc,argv,0,self);
-	}
+        result = eval_call(self,node);
 	break;
 
       case NODE_FCALL:
-	{
-	    int argc; VALUE *argv; /* used in SETUP_ARGS */
-	    TMP_PROTECT;
-
-	    BEGIN_CALLARGS;
-	    SETUP_ARGS(node->nd_args);
-	    END_CALLARGS;
-
-	    ruby_current_node = node;
-	    SET_CURRENT_SOURCE();
-	    result = rb_call(CLASS_OF(self),self,node->nd_mid,argc,argv,1,self);
-	}
+        result = eval_fcall(self,node);
 	break;
 
       case NODE_VCALL:
@@ -3513,142 +4043,19 @@ rb_eval(self, n)
 
       case NODE_SUPER:
       case NODE_ZSUPER:
-	{
-	    int argc; VALUE *argv; /* used in SETUP_ARGS */
-	    TMP_PROTECT;
-
-	    if (ruby_frame->last_class == 0) {
-		if (ruby_frame->last_func) {
-		    rb_name_error(ruby_frame->last_func,
-				  "superclass method `%s' disabled",
-				  rb_id2name(ruby_frame->orig_func));
-		}
-		else {
-		    rb_raise(rb_eNoMethodError, "super called outside of method");
-		}
-	    }
-	    if (nd_type(node) == NODE_ZSUPER) {
-		argc = ruby_frame->argc;
-		if (argc && DMETHOD_P()) {
-		    if (TYPE(RBASIC(ruby_scope)->klass) != T_ARRAY ||
-			RARRAY(RBASIC(ruby_scope)->klass)->len != argc) {
-			rb_raise(rb_eRuntimeError, 
-				 "super: specify arguments explicitly");
-		    }
-		    argv = RARRAY(RBASIC(ruby_scope)->klass)->ptr;
-		}
-		else if (!ruby_scope->local_vars) {
-		    argc = 0;
-		    argv = 0;
-		}
-		else {
-		    argv = ruby_scope->local_vars + 2;
-		}
-	    }
-	    else {
-		BEGIN_CALLARGS;
-		SETUP_ARGS(node->nd_args);
-		END_CALLARGS;
-		ruby_current_node = node;
-	    }
-
-	    SET_CURRENT_SOURCE();
-	    result = rb_call_super(argc, argv);
-	}
+        result = eval_super(self,node);
 	break;
 
       case NODE_SCOPE:
-	{
-	    struct FRAME frame;
-	    NODE *saved_cref = 0;
-
-	    frame = *ruby_frame;
-	    frame.tmp = ruby_frame;
-	    ruby_frame = &frame;
-
-	    PUSH_SCOPE();
-	    PUSH_TAG(PROT_NONE);
-	    if (node->nd_rval) {
-		saved_cref = ruby_cref;
-		ruby_cref = (NODE*)node->nd_rval;
-	    }
-	    if (node->nd_tbl) {
-		VALUE *vars = ALLOCA_N(VALUE, node->nd_tbl[0]+1);
-		*vars++ = (VALUE)node;
-		ruby_scope->local_vars = vars;
-		rb_mem_clear(ruby_scope->local_vars, node->nd_tbl[0]);
-		ruby_scope->local_tbl = node->nd_tbl;
-	    }
-	    else {
-		ruby_scope->local_vars = 0;
-		ruby_scope->local_tbl  = 0;
-	    }
-	    if ((state = EXEC_TAG()) == 0) {
-		result = rb_eval(self, node->nd_next);
-	    }
-	    POP_TAG();
-	    POP_SCOPE();
-	    ruby_frame = frame.tmp;
-	    if (saved_cref)
-		ruby_cref = saved_cref;
-	    if (state) JUMP_TAG(state);
-	}
-	break;
+        result = eval_scope(self,node);
+        break;
 
       case NODE_OP_ASGN1:
-	{
-	    int argc; VALUE *argv; /* used in SETUP_ARGS */
-	    VALUE recv, val, tmp;
-	    NODE *rval;
-	    TMP_PROTECT;
-
-	    recv = rb_eval(self, node->nd_recv);
-	    rval = node->nd_args->nd_head;
-	    SETUP_ARGS0(node->nd_args->nd_body, 1);
-	    val = rb_funcall3(recv, aref, argc, argv);
-	    switch (node->nd_mid) {
-	    case 0: /* OR */
-	      if (RTEST(val)) RETURN(val);
-	      val = rb_eval(self, rval);
-	      break;
-	    case 1: /* AND */
-	      if (!RTEST(val)) RETURN(val);
-	      val = rb_eval(self, rval);
-	      break;
-	    default:
-	      tmp = rb_eval(self, rval);
-	      val = rb_funcall3(val, node->nd_mid, 1, &tmp);
-	    }
-	    argv[argc] = val;
-	    rb_funcall2(recv, aset, argc+1, argv);
-	    result = val;
-	}
+        result = eval_op_asgn1(self,node);
 	break;
 
       case NODE_OP_ASGN2:
-	{
-	    ID id = node->nd_next->nd_vid;
-	    VALUE recv, val, tmp;
-
-	    recv = rb_eval(self, node->nd_recv);
-	    val = rb_funcall3(recv, id, 0, 0);
-	    switch (node->nd_next->nd_mid) {
-	    case 0: /* OR */
-	      if (RTEST(val)) RETURN(val);
-	      val = rb_eval(self, node->nd_value);
-	      break;
-	    case 1: /* AND */
-	      if (!RTEST(val)) RETURN(val);
-	      val = rb_eval(self, node->nd_value);
-	      break;
-	    default:
-	      tmp = rb_eval(self, node->nd_value);
-	      val = rb_funcall3(val, node->nd_next->nd_mid, 1, &tmp);
-	    }
-
-	    rb_funcall2(recv, node->nd_next->nd_aid, 1, &val);
-	    result = val;
-	}
+        result = eval_op_asgn2(self,node);
 	break;
 
       case NODE_OP_ASGN_AND:
@@ -3697,26 +4104,21 @@ rb_eval(self, n)
 	break;
 
       case NODE_CDECL:
-	result = rb_eval(self, node->nd_value);
-	if (node->nd_vid == 0) {
-	    rb_const_set(class_prefix(self, node->nd_else), node->nd_else->nd_mid, result);
-	}
-	else {
-	    rb_const_set(ruby_cbase, node->nd_vid, result);
-	}
+        result = rb_eval(self, node->nd_value);
+        eval_cdecl(self, node, result);
 	break;
 
       case NODE_CVDECL:
 	if (NIL_P(ruby_cbase)) {
 	    rb_raise(rb_eTypeError, "no class/module to define class variable");
 	}
-	result = rb_eval(self, node->nd_value);
-	rb_cvar_set(cvar_cbase(), node->nd_vid, result, Qtrue);
+        result = rb_eval(self, node->nd_value);
+        eval_cvar_set(node, result, Qtrue);
 	break;
 
       case NODE_CVASGN:
-	result = rb_eval(self, node->nd_value);
-	rb_cvar_set(cvar_cbase(), node->nd_vid, result, Qfalse);
+        result = rb_eval(self, node->nd_value);
+        eval_cvar_set(node, result, Qfalse);
 	break;
 
       case NODE_LVAR:
@@ -3759,26 +4161,21 @@ rb_eval(self, n)
 	break;
 
       case NODE_COLON2:
-	{
-	    VALUE klass;
-
-	    klass = rb_eval(self, node->nd_head);
-	    if (rb_is_const_id(node->nd_mid)) {
-		switch (TYPE(klass)) {
-		  case T_CLASS:
-		  case T_MODULE:
-		    result = rb_const_get_from(klass, node->nd_mid);
-		    break;
-		  default:
-		    rb_raise(rb_eTypeError, "%s is not a class/module",
-			     RSTRING(rb_obj_as_string(klass))->ptr);
-		    break;
-		}
-	    }
-	    else {
-		result = rb_funcall(klass, node->nd_mid, 0, 0);
+	result = rb_eval(self, node->nd_head);
+	if (rb_is_const_id(node->nd_mid)) {
+	    switch (TYPE(result)) {
+	      case T_CLASS:
+	      case T_MODULE:
+		result = rb_const_get_from(result, node->nd_mid);
+		break;
+	      default:
+		rb_raise(rb_eTypeError, "%s is not a class/module",
+			 RSTRING(rb_obj_as_string(result))->ptr);
+		break;
 	    }
 	}
+	else
+	    result = rb_funcall(result, node->nd_mid, 0, 0);
 	break;
 
       case NODE_COLON3:
@@ -3809,23 +4206,7 @@ rb_eval(self, n)
 	break;
 
       case NODE_HASH:
-	{
-	    NODE *list;
-	    VALUE hash = rb_hash_new();
-	    VALUE key, val;
-
-	    list = node->nd_head;
-	    while (list) {
-		key = rb_eval(self, list->nd_head);
-		list = list->nd_next;
-		if (list == 0)
-		    rb_bug("odd number list for Hash");
-		val = rb_eval(self, list->nd_head);
-		list = list->nd_next;
-		rb_hash_aset(hash, key, val);
-	    }
-	    result = hash;
-	}
+        result = eval_hash(self,node);
 	break;
 
       case NODE_ZARRAY:		/* zero length list */
@@ -3833,19 +4214,7 @@ rb_eval(self, n)
 	break;
 
       case NODE_ARRAY:
-	{
-	    VALUE ary;
-	    long i;
-
-	    i = node->nd_alen;
-	    ary = rb_ary_new2(i);
-	    for (i=0;node;node=node->nd_next) {
-		RARRAY(ary)->ptr[i++] = rb_eval(self, node->nd_head);
-		RARRAY(ary)->len = i;
-	    }
-
-	    result = ary;
-	}
+        result = eval_array(self,node);
 	break;
 
       case NODE_STR:
@@ -3861,51 +4230,8 @@ rb_eval(self, n)
       case NODE_DREGX:
       case NODE_DREGX_ONCE:
       case NODE_DSYM:
-	{
-	    VALUE str, str2;
-	    NODE *list = node->nd_next;
-
-	    str = rb_str_new3(node->nd_lit);
-	    while (list) {
-		if (list->nd_head) {
-		    switch (nd_type(list->nd_head)) {
-		      case NODE_STR:
-			str2 = list->nd_head->nd_lit;
-			break;
-		      default:
-			str2 = rb_eval(self, list->nd_head);
-			break;
-		    }
-		    rb_str_append(str, str2);
-		    OBJ_INFECT(str, str2);
-		}
-		list = list->nd_next;
-	    }
-	    switch (nd_type(node)) {
-	      case NODE_DREGX:
-		result = rb_reg_new(RSTRING(str)->ptr, RSTRING(str)->len,
-				    node->nd_cflag);
-		break;
-	      case NODE_DREGX_ONCE:	/* regexp expand once */
-		result = rb_reg_new(RSTRING(str)->ptr, RSTRING(str)->len,
-				    node->nd_cflag);
-		nd_set_type(node, NODE_LIT);
-		node->nd_lit = result;
-		break;
-	      case NODE_LIT:
-		/* other thread may replace NODE_DREGX_ONCE to NODE_LIT */
-		goto again;
-	      case NODE_DXSTR:
-		result = rb_funcall(self, '`', 1, str);
-		break;
-	      case NODE_DSYM:
-		result = rb_str_intern(str);
-		break;
-	      default:
-		result = str;
-		break;
-	    }
-	}
+        result = eval_slit(self, node);
+        if (result == Qundef) goto again;
 	break;
 
       case NODE_XSTR:
@@ -3917,84 +4243,13 @@ rb_eval(self, n)
 	break;
 
       case NODE_DEFN:
-	if (node->nd_defn) {
-	    NODE *body,  *defn;
-	    VALUE origin;
-	    int noex;
-
-	    if (NIL_P(ruby_class)) {
-		rb_raise(rb_eTypeError, "no class/module to add method");
-	    }
-	    if (ruby_class == rb_cObject && node->nd_mid == init) {
-		rb_warn("redefining Object#initialize may cause infinite loop");
-	    }
-	    if (node->nd_mid == __id__ || node->nd_mid == __send__) {
-		rb_warn("redefining `%s' may cause serious problem",
-			rb_id2name(node->nd_mid));
-	    }
-	    rb_frozen_class_p(ruby_class);
-	    body = search_method(ruby_class, node->nd_mid, &origin);
-	    if (body){
-		if (RTEST(ruby_verbose) && ruby_class == origin && body->nd_cnt == 0 && body->nd_body) {
-		    rb_warning("method redefined; discarding old %s", rb_id2name(node->nd_mid));
-		}
-	    }
-
-	    if (SCOPE_TEST(SCOPE_PRIVATE) || node->nd_mid == init) {
-		noex = NOEX_PRIVATE;
-	    }
-	    else if (SCOPE_TEST(SCOPE_PROTECTED)) {
-		noex = NOEX_PROTECTED;
-	    }
-	    else {
-		noex = NOEX_PUBLIC;
-	    }
-	    if (body && origin == ruby_class && body->nd_body == 0) {
-		noex |= NOEX_NOSUPER;
-	    }
-
-	    defn = rb_copy_node_scope(node->nd_defn, ruby_cref);
-	    rb_add_method(ruby_class, node->nd_mid, defn, noex);
-	    if (scope_vmode == SCOPE_MODFUNC) {
-		rb_add_method(rb_singleton_class(ruby_class),
-			      node->nd_mid, defn, NOEX_PUBLIC);
-	    }
-	    result = Qnil;
-	}
+	if (node->nd_defn)
+          eval_defn(self,node);
 	break;
 
       case NODE_DEFS:
-	if (node->nd_defn) {
-	    VALUE recv = rb_eval(self, node->nd_recv);
-	    VALUE klass;
-	    NODE *body = 0, *defn;
-
-	    if (ruby_safe_level >= 4 && !OBJ_TAINTED(recv)) {
-		rb_raise(rb_eSecurityError, "Insecure: can't define singleton method");
-	    }
-	    if (FIXNUM_P(recv) || SYMBOL_P(recv)) {
-		rb_raise(rb_eTypeError,
-			 "can't define singleton method \"%s\" for %s",
-			 rb_id2name(node->nd_mid),
-			 rb_obj_classname(recv));
-	    }
-
-	    if (OBJ_FROZEN(recv)) rb_error_frozen("object");
-	    klass = rb_singleton_class(recv);
-	    if (st_lookup(RCLASS(klass)->m_tbl, node->nd_mid, &data)) {
-		body = (NODE *)data;
-		if (ruby_safe_level >= 4) {
-		    rb_raise(rb_eSecurityError, "redefining method prohibited");
-		}
-		if (RTEST(ruby_verbose)) {
-		    rb_warning("redefine %s", rb_id2name(node->nd_mid));
-		}
-	    }
-	    defn = rb_copy_node_scope(node->nd_defn, ruby_cref);
-	    rb_add_method(klass, node->nd_mid, defn,
-			  NOEX_PUBLIC|(body?body->nd_noex&NOEX_UNDEF:0));
-	    result = Qnil;
-	}
+	if (node->nd_defn) 
+          eval_defs(self,node);
 	break;
 
       case NODE_UNDEF:
@@ -4002,7 +4257,6 @@ rb_eval(self, n)
 	    rb_raise(rb_eTypeError, "no class to undef method");
 	}
 	rb_undef(ruby_class, rb_to_id(rb_eval(self, node->u2.node)));
-	result = Qnil;
 	break;
 
       case NODE_ALIAS:
@@ -4011,134 +4265,26 @@ rb_eval(self, n)
 	}
 	rb_alias(ruby_class, rb_to_id(rb_eval(self, node->u1.node)),
 		             rb_to_id(rb_eval(self, node->u2.node)));
-	result = Qnil;
 	break;
 
       case NODE_VALIAS:
 	rb_alias_variable(node->u1.id, node->u2.id);
-	result = Qnil;
 	break;
 
       case NODE_CLASS:
-	{
-	    VALUE super, klass, tmp, cbase;
-	    ID cname;
-	    int gen = Qfalse;
-
-	    cbase = class_prefix(self, node->nd_cpath);
-	    cname = node->nd_cpath->nd_mid;
-
-	    if (NIL_P(ruby_cbase)) {
-		rb_raise(rb_eTypeError, "no outer class/module");
-	    }
-	    if (node->nd_super) {
-	       super = rb_eval(self, node->nd_super);
-	       rb_check_inheritable(super);
-	    }
-	    else {
-		super = 0;
-	    }
-
-	    if (rb_const_defined_at(cbase, cname)) {
-		klass = rb_const_get_at(cbase, cname);
-		if (TYPE(klass) != T_CLASS) {
-		    rb_raise(rb_eTypeError, "%s is not a class",
-			     rb_id2name(cname));
-		}
-		if (super) {
-		    tmp = rb_class_real(RCLASS(klass)->super);
-		    if (tmp != super) {
-			rb_raise(rb_eTypeError, "superclass mismatch for class %s",
-				 rb_id2name(cname));
-		    }
-		    super = 0;
-		}
-		if (ruby_safe_level >= 4) {
-		    rb_raise(rb_eSecurityError, "extending class prohibited");
-		}
-	    }
-	    else {
-		if (!super) super = rb_cObject;
-		klass = rb_define_class_id(cname, super);
-		rb_set_class_path(klass, cbase, rb_id2name(cname));
-		rb_const_set(cbase, cname, klass);
-		gen = Qtrue;
-	    }
-	    if (ruby_wrapper) {
-		rb_extend_object(klass, ruby_wrapper);
-		rb_include_module(klass, ruby_wrapper);
-	    }
-	    if (super && gen) {
-		rb_class_inherited(super, klass);
-	    }
-	    result = module_setup(klass, node);
-	}
+        result = eval_class(self,node);
 	break;
 
       case NODE_MODULE:
-	{
-	    VALUE module, cbase;
-	    ID cname;
-
-	    if (NIL_P(ruby_cbase)) {
-		rb_raise(rb_eTypeError, "no outer class/module");
-	    }
-	    cbase = class_prefix(self, node->nd_cpath);
-	    cname = node->nd_cpath->nd_mid;
-	    if (rb_const_defined_at(cbase, cname)) {
-		module = rb_const_get_at(cbase, cname);
-		if (TYPE(module) != T_MODULE) {
-		    rb_raise(rb_eTypeError, "%s is not a module",
-			     rb_id2name(cname));
-		}
-		if (ruby_safe_level >= 4) {
-		    rb_raise(rb_eSecurityError, "extending module prohibited");
-		}
-	    }
-	    else {
-		module = rb_define_module_id(cname);
-		rb_set_class_path(module, cbase, rb_id2name(cname));
-		rb_const_set(cbase, cname, module);
-	    }
-	    if (ruby_wrapper) {
-		rb_extend_object(module, ruby_wrapper);
-		rb_include_module(module, ruby_wrapper);
-	    }
-
-	    result = module_setup(module, node);
-	}
+        result = eval_module(self,node);
 	break;
 
       case NODE_SCLASS:
-	{
-	    VALUE klass;
-
-	    result = rb_eval(self, node->nd_recv);
-	    if (FIXNUM_P(result) || SYMBOL_P(result)) {
-		rb_raise(rb_eTypeError, "no virtual class for %s",
-			 rb_obj_classname(result));
-	    }
-	    if (ruby_safe_level >= 4 && !OBJ_TAINTED(result))
-		rb_raise(rb_eSecurityError, "Insecure: can't extend object");
-	    klass = rb_singleton_class(result);
-
-	    if (ruby_wrapper) {
-		rb_extend_object(klass, ruby_wrapper);
-		rb_include_module(klass, ruby_wrapper);
-	    }
-
-	    result = module_setup(klass, node);
-	}
+        result = eval_sclass(self,node);
 	break;
 
       case NODE_DEFINED:
-	{
-	    char buf[20];
-	    char *desc = is_defined(self, node->nd_head, buf);
-
-	    if (desc) result = rb_str_new2(desc);
-	    else result = Qnil;
-	}
+        result = eval_defined(self,node);
 	break;
 
       case NODE_NEWLINE:
@@ -4151,25 +4297,19 @@ rb_eval(self, n)
       default:
 	unknown_node(node);
     }
-  finish:
-    CHECK_INTS;
-    if (contnode) {
-	node = contnode;
-	contnode = 0;
-	goto again;
-    }
-    return result;
+  }
+  return result;
 }
 
 static VALUE
 module_setup(module, n)
     VALUE module;
-    NODE *n;
+    NODE * volatile n;
 {
-    NODE * volatile node = n->nd_body;
+    NODE *node = n->nd_body;
     int state;
     struct FRAME frame;
-    VALUE result = Qnil;	/* OK */
+    VALUE result;
     TMP_PROTECT;
 
     frame = *ruby_frame;
@@ -4560,16 +4700,16 @@ rb_iter_break()
     break_jump(Qnil);
 }
 
-NORETURN(static void rb_longjmp _((int, VALUE)));
+NORETURN(static void rb_longjmp _((volatile int, volatile VALUE)));
 static VALUE make_backtrace _((void));
 
 static void
 rb_longjmp(tag, mesg)
-    int tag;
-    VALUE mesg;
+    volatile int tag;
+    volatile VALUE mesg;
 {
     VALUE at;
-    rb_thread_t th = curr_thread;
+    volatile rb_thread_t th = curr_thread;
 
     if (rb_thread_set_raised(th)) {
 	ruby_errinfo = exception_error;
@@ -4658,7 +4798,8 @@ rb_exc_fatal(mesg)
 void
 rb_interrupt()
 {
-    rb_raise(rb_eInterrupt, "");
+    static const char fmt[1] = {'\0'};
+    rb_raise(rb_eInterrupt, fmt);
 }
 
 /*
@@ -4814,7 +4955,7 @@ proc_jump_error(state, result)
     VALUE result;
 {
     char mesg[32];
-    char *statement;
+    const char *statement;
 
     switch (state) {
       case TAG_BREAK:
@@ -4925,19 +5066,21 @@ rb_need_block()
 
 static VALUE
 rb_yield_0(val, self, klass, flags, avalue)
-    VALUE val, self, klass;	/* OK */
-    int flags, avalue;
+    volatile VALUE val, self;
+    VALUE klass;
+    int flags;
+    volatile int avalue;
 {
-    NODE *node;
+    NODE *volatile node;
     volatile VALUE result = Qnil;
     volatile VALUE old_cref;
     volatile VALUE old_wrapper;
     struct BLOCK * volatile block;
     struct SCOPE * volatile old_scope;
-    int old_vmode;
+    volatile int old_vmode;
     struct FRAME frame;
     NODE *cnode = ruby_current_node;
-    int lambda = flags & YIELD_LAMBDA_CALL;
+    volatile int lambda = flags & YIELD_LAMBDA_CALL;
     int state;
 
     rb_need_block();
@@ -5116,6 +5259,7 @@ rb_yield_0(val, self, klass, flags, avalue)
 		    tt->retval = result;
 		    JUMP_TAG(TAG_BREAK);
 		}
+                if (tt->tag == PROT_THREAD) break;
 		tt = tt->prev;
 	    }
 	    proc_jump_error(TAG_BREAK, result);
@@ -5133,6 +5277,7 @@ VALUE
 rb_yield(val)
     VALUE val;
 {
+    wipeBeforeYield();
     return rb_yield_0(val, 0, 0, 0, Qfalse);
 }
 
@@ -5195,6 +5340,7 @@ static VALUE
 rb_f_loop()
 {
     for (;;) {
+        wipeBeforeYield();
 	rb_yield_0(Qundef, 0, 0, 0, Qfalse);
 	CHECK_INTS;
     }
@@ -5348,11 +5494,12 @@ assign(self, lhs, val, pcall)
 
 VALUE
 rb_iterate(it_proc, data1, bl_proc, data2)
-    VALUE (*it_proc) _((VALUE)), (*bl_proc)(ANYARGS);
-    VALUE data1, data2;
+    VALUE (* volatile it_proc) _((VALUE)), (*bl_proc)(ANYARGS);
+    volatile VALUE data1;
+    VALUE data2;
 {
     int state;
-    volatile VALUE retval = Qnil;
+    VALUE retval = Qnil;
     NODE *node = NEW_IFUNC(bl_proc, data2);
     VALUE self = ruby_top_self;
 
@@ -5376,12 +5523,7 @@ rb_iterate(it_proc, data1, bl_proc, data2)
     POP_BLOCK();
     POP_TAG();
 
-    switch (state) {
-      case 0:
-	break;
-      default:
-	JUMP_TAG(state);
-    }
+    if (state) JUMP_TAG(state);
     return retval;
 }
 
@@ -5413,16 +5555,17 @@ handle_rescue(self, node)
 
 VALUE
 #ifdef HAVE_STDARG_PROTOTYPES
-rb_rescue2(VALUE (*b_proc)(ANYARGS), VALUE data1, VALUE (*r_proc)(ANYARGS), VALUE data2, ...)
+rb_rescue2(VALUE (* volatile b_proc)(ANYARGS), volatile VALUE data1, 
+           VALUE (* volatile r_proc)(ANYARGS), volatile VALUE data2, ...)
 #else
 rb_rescue2(b_proc, data1, r_proc, data2, va_alist)
-    VALUE (*b_proc)(ANYARGS), (*r_proc)(ANYARGS);
-    VALUE data1, data2;
+    VALUE (* volatile b_proc)(ANYARGS), (* volatile r_proc)(ANYARGS);
+    volatile VALUE data1, data2;
     va_dcl
 #endif
 {
     int state;
-    volatile VALUE result;
+    VALUE result;
     volatile VALUE e_info = ruby_errinfo;
     volatile int handle = Qfalse;
     VALUE eclass;
@@ -5481,9 +5624,9 @@ VALUE
 rb_protect(proc, data, state)
     VALUE (*proc) _((VALUE));
     VALUE data;
-    int *state;
+    int * volatile state;
 {
-    VALUE result = Qnil;	/* OK */
+    VALUE result;
     int status;
 
     PUSH_TAG(PROT_NONE);
@@ -5496,22 +5639,18 @@ rb_protect(proc, data, state)
     if (state) {
 	*state = status;
     }
-    if (status != 0) {
-	return Qnil;
-    }
-
-    return result;
+    return status ? Qnil : result;
 }
 
 VALUE
 rb_ensure(b_proc, data1, e_proc, data2)
     VALUE (*b_proc)();
     VALUE data1;
-    VALUE (*e_proc)();
-    VALUE data2;
+    VALUE (* volatile e_proc)();
+    volatile VALUE data2;
 {
     int state;
-    volatile VALUE result = Qnil;
+    VALUE result;
     VALUE retval;
 
     PUSH_TAG(PROT_NONE);
@@ -5519,7 +5658,7 @@ rb_ensure(b_proc, data1, e_proc, data2)
 	result = (*b_proc)(data1);
     }
     POP_TAG();
-    retval = prot_tag ? prot_tag->retval : Qnil;	/* save retval */
+    if (prot_tag) retval = prot_tag->retval;  /* save retval */
     if (!thread_no_ensure()) {
 	(*e_proc)(data2);
     }
@@ -5533,7 +5672,7 @@ rb_with_disable_interrupt(proc, data)
     VALUE (*proc)();
     VALUE data;
 {
-    VALUE result = Qnil;	/* OK */
+    VALUE result;
     int status;
 
     DEFER_INTS;
@@ -5610,7 +5749,7 @@ rb_method_missing(argc, argv, obj)
 {
     ID id;
     VALUE exc = rb_eNoMethodError;
-    char *format = 0;
+    const char *format = 0;
     NODE *cnode = ruby_current_node;
 
     if (argc == 0 || !SYMBOL_P(argv[0])) {
@@ -5785,16 +5924,16 @@ call_cfunc(func, recv, len, argc, argv)
 
 static VALUE
 rb_call0(klass, recv, id, oid, argc, argv, body, flags)
-    VALUE klass, recv;
-    ID    id;
+    volatile VALUE klass, recv;
+    volatile ID    id;
     ID    oid;
-    int argc;			/* OK */
-    VALUE *argv;		/* OK */
-    NODE * volatile body;
+    int argc;
+    VALUE *argv;
+    NODE *volatile body;
     int flags;
 {
     NODE *b2;		/* OK */
-    volatile VALUE result = Qnil;
+    VALUE result;
     int itr;
     static int tick;
     TMP_PROTECT;
@@ -5911,7 +6050,7 @@ rb_call0(klass, recv, id, oid, argc, argv, body, flags)
 	{
 	    int state;
 	    VALUE *local_vars;	/* OK */
-	    NODE *saved_cref = 0;
+	    NODE * volatile saved_cref = 0;
 
 	    PUSH_SCOPE();
 	    if (body->nd_rval) {
@@ -6054,7 +6193,6 @@ rb_call0(klass, recv, id, oid, argc, argv, body, flags)
 
       default:
 	unknown_node(body);
-	break;
     }
     POP_FRAME();
     POP_ITER();
@@ -6222,7 +6360,7 @@ rb_funcall_rescue(recv, mid, n, va_alist)
     va_dcl
 #endif
 {
-    VALUE result = Qnil;	/* OK */
+    VALUE result;
     int status;
     va_list ar;
 
@@ -6413,7 +6551,7 @@ rb_frame_last_func()
 static NODE*
 compile(src, file, line)
     VALUE src;
-    char *file;
+    const char *file;
     int line;
 {
     NODE *node;
@@ -6432,12 +6570,13 @@ compile(src, file, line)
 
 static VALUE
 eval(self, src, scope, file, line)
-    VALUE self, src, scope;
-    char *file;
+    VALUE self, src;
+    volatile VALUE scope;
+    const char * volatile file;
     int line;
 {
     struct BLOCK *data = NULL;
-    volatile VALUE result = Qnil;
+    VALUE result;
     struct SCOPE * volatile old_scope;
     struct BLOCK * volatile old_block;
     struct RVarmap * volatile old_dyna_vars;
@@ -6445,7 +6584,7 @@ eval(self, src, scope, file, line)
     int volatile old_vmode;
     volatile VALUE old_wrapper;
     struct FRAME frame;
-    NODE *nodesave = ruby_current_node;
+    NODE * volatile nodesave = ruby_current_node;
     volatile int iter = ruby_frame->iter;
     volatile int safe = ruby_safe_level;
     int state;
@@ -6510,7 +6649,7 @@ eval(self, src, scope, file, line)
 	    compile_error(0);
 	}
 	if (!NIL_P(result)) ruby_errinfo = result;
-	result = eval_node(self, node);
+	result = eval_tree(self, node);
     }
     POP_TAG();
     POP_CLASS();
@@ -6532,6 +6671,7 @@ eval(self, src, scope, file, line)
 
 	    scope_dup(ruby_scope);
 	    for (tag=prot_tag; tag; tag=tag->prev) {
+                if (tag->tag == PROT_THREAD) break;
 		scope_dup(tag->scope);
 	    }
 	    for (vars = ruby_dyna_vars; vars; vars = vars->next) {
@@ -6594,7 +6734,7 @@ rb_f_eval(argc, argv, self)
     VALUE self;
 {
     VALUE src, scope, vfile, vline;
-    char *file = "(eval)";
+    const char *file = "(eval)";
     int line = 1;
 
     rb_scan_args(argc, argv, "13", &src, &scope, &vfile, &vline);
@@ -6635,12 +6775,13 @@ rb_f_eval(argc, argv, self)
 static VALUE
 exec_under(func, under, cbase, args)
     VALUE (*func)();
-    VALUE under, cbase;
+    VALUE under;
+    volatile VALUE cbase;
     void *args;
 {
-    VALUE val = Qnil;		/* OK */
+    VALUE val;
     int state;
-    int mode;
+    volatile int mode;
     struct FRAME *f = ruby_frame;
 
     PUSH_CLASS(under);
@@ -6732,7 +6873,7 @@ specific_eval(argc, argv, klass, self)
 	return yield_under(klass, self);
     }
     else {
-	char *file = "(eval)";
+	const char *file = "(eval)";
 	int   line = 1;
 
 	if (argc == 0) {
@@ -6846,9 +6987,9 @@ rb_load(fname, wrap)
     volatile int prohibit_int = rb_prohibit_interrupt;
     volatile ID last_func;
     volatile VALUE wrapper = ruby_wrapper;
-    volatile VALUE self = ruby_top_self;
+    VALUE self = ruby_top_self;
     NODE *volatile last_node;
-    NODE *saved_cref = ruby_cref;
+    NODE *volatile saved_cref = ruby_cref;
 
     if (wrap && ruby_safe_level >= 4) {
 	StringValue(fname);
@@ -6897,7 +7038,7 @@ rb_load(fname, wrap)
     ruby_current_node = 0;
     if (state == 0) {
 	NODE *node;
-	volatile int critical;
+        int critical;
 
 	DEFER_INTS;
 	ruby_in_eval++;
@@ -6909,7 +7050,7 @@ rb_load(fname, wrap)
 	rb_thread_critical = critical;
 	ALLOW_INTS;
 	if (ruby_nerrs == 0) {
-	    eval_node(self, node);
+	    eval_tree(self, node);
 	}
     }
     ruby_frame->last_func = last_func;
@@ -6942,7 +7083,7 @@ void
 rb_load_protect(fname, wrap, state)
     VALUE fname;
     int wrap;
-    int *state;
+    int * volatile state;
 {
     int status;
 
@@ -7231,7 +7372,7 @@ rb_require_safe(fname, safe)
     VALUE fname;
     int safe;
 {
-    VALUE result = Qnil;
+    VALUE result;
     volatile VALUE errinfo = ruby_errinfo;
     int state;
     struct {
@@ -7282,7 +7423,8 @@ rb_require_safe(fname, safe)
 		rb_provide_feature(feature);
 		result = Qtrue;
 	    }
-	}
+	}else
+          result = Qnil;
     }
     POP_TAG();
     ruby_current_node = saved.node;
@@ -7950,7 +8092,7 @@ rb_f_at_exit()
 void
 rb_exec_end_proc()
 {
-    struct end_proc_data *link, *tmp;
+    struct end_proc_data *tmp, *volatile link;
     int status;
     volatile int safe = ruby_safe_level;
 
@@ -8595,8 +8737,9 @@ proc_invoke(proc, args, self, klass)
     int state;
     volatile int safe = ruby_safe_level;
     volatile VALUE old_wrapper = ruby_wrapper;
-    volatile int pcall, avalue = Qtrue;
-    volatile VALUE tmp = args;
+    volatile int pcall;
+    int avalue = Qtrue;
+    VALUE tmp = args;
 
     if (rb_block_given_p() && ruby_frame->last_func) {
 	if (klass != ruby_frame->last_class)
@@ -8814,7 +8957,7 @@ proc_to_s(self)
 {
     struct BLOCK *data;
     NODE *node;
-    char *cname = rb_obj_classname(self);
+    const char *cname = rb_obj_classname(self);
     const int w = (sizeof(VALUE) * CHAR_BIT) / 4;
     long len = strlen(cname)+6+w; /* 6:tags 16:addr */
     VALUE str;
@@ -8895,15 +9038,15 @@ proc_binding(proc)
 
 static VALUE
 block_pass(self, node)
-    VALUE self;
-    NODE *node;
+    volatile VALUE self;
+    NODE *volatile node;
 {
-    VALUE proc = rb_eval(self, node->nd_body);	/* OK */
+    volatile VALUE proc = rb_eval(self, node->nd_body);
     VALUE b;
     struct BLOCK * volatile old_block;
     struct BLOCK _block;
     struct BLOCK *data;
-    volatile VALUE result = Qnil;
+    VALUE result;
     int state;
     volatile int orphan;
     volatile int safe = ruby_safe_level;
@@ -8950,20 +9093,24 @@ block_pass(self, node)
 
     PUSH_TAG(PROT_LOOP);
     state = EXEC_TAG();
-    if (state == 0) {
-      retry:
+    switch (state) {
+      case TAG_RETRY:
+        state = 0;
+      case 0:
 	proc_set_safe_level(proc);
 	if (safe > ruby_safe_level)
 	    ruby_safe_level = safe;
 	result = rb_eval(self, node->nd_iter);
-    }
-    else if (state == TAG_BREAK && TAG_DST()) {
-	result = prot_tag->retval;
-	state = 0;
-    }
-    else if (state == TAG_RETRY) {
-	state = 0;
-	goto retry;
+        break;
+      case TAG_BREAK:
+        result = Qnil;
+        if (TAG_DST()) {
+	  result = prot_tag->retval;
+	  state = 0;
+        }
+        break;
+      default:
+        result = Qnil;
     }
     POP_TAG();
     POP_ITER();
@@ -8980,7 +9127,6 @@ block_pass(self, node)
       default:
 	JUMP_TAG(state);
     }
-
     return result;
 }
 
@@ -9239,7 +9385,7 @@ method_call(argc, argv, method)
     VALUE *argv;
     VALUE method;
 {
-    VALUE result = Qnil;	/* OK */
+    VALUE result;
     struct METHOD *data;
     int safe;
 
@@ -9473,7 +9619,7 @@ method_inspect(method)
     struct METHOD *data;
     VALUE str;
     const char *s;
-    char *sharp = "#";
+    const char *sharp = "#";
 
     Data_Get_Struct(method, struct METHOD, data);
     str = rb_str_buf_new2("#<");
@@ -9538,12 +9684,9 @@ static VALUE
 bmcall(args, method)
     VALUE args, method;
 {
-    volatile VALUE a;
-    VALUE ret;
-
-    a = svalue_to_avalue(args);
-    ret = method_call(RARRAY(a)->len, RARRAY(a)->ptr, method);
-    a = Qnil; /* prevent tail call */
+    VALUE a = svalue_to_avalue(args);
+    VALUE ret = method_call(RARRAY(a)->len, RARRAY(a)->ptr, method);
+    RB_GC_GUARD(a);  /* ensure a is not GC'd during method_call */
     return ret;
 }
 
@@ -9658,6 +9801,7 @@ rb_mod_define_method(argc, argv, mod)
     else {
 	rb_raise(rb_eArgError, "wrong number of arguments (%d for 1)", argc);
     }
+    SET_METHOD_SOURCE();
     if (RDATA(body)->dmark == (RUBY_DATA_FUNC)bm_mark) {
 	node = NEW_DMETHOD(method_unbind(body));
     }
@@ -9689,6 +9833,112 @@ rb_mod_define_method(argc, argv, mod)
     return body;
 }
 
+
+#ifdef MBARI_API
+/*
+ * call-seq:
+ *    meth.__file__  => String  
+ *
+ * returns the filename containing this method's definition
+ *
+ * raises ArgumentError if method has no associated ruby source code
+ *
+ * <i>Only available when MBARI_API extentions are enabled at build time</i>
+ */
+ 
+static VALUE
+method_source_file_name(VALUE method)
+{
+    struct METHOD *data;
+    NODE *node;
+
+    Data_Get_Struct(method, struct METHOD, data);   
+    if (node = data->body) {
+      const char *filename = node->nd_file;
+      if (filename)
+        return rb_str_new2(filename);
+    }
+    rb_raise(rb_eArgError, "native Method");
+}
+
+/*
+ * call-seq:
+ *    meth.__line__  => Fixnum  
+ *
+ * returns the starting line number of this method
+ *
+ * raises ArgumentError if method has no associated ruby source code
+ *
+ * <i>Only available when MBARI_API extentions are enabled at build time</i>
+ */
+ 
+static VALUE
+method_source_line(VALUE method)
+{
+    struct METHOD *data;
+    NODE *node;
+
+    Data_Get_Struct(method, struct METHOD, data);
+    if (node = data->body) {
+      int lineno = nd_line(node);
+      if (lineno)
+        return INT2FIX(nd_line(node));
+    }
+    rb_raise(rb_eArgError, "native Method");
+}
+
+
+/*
+ * call-seq:
+ *    prc.__file__  => String  
+ *
+ * returns the filename where this proc is defined
+ *
+ * raises ArgumentError if proc has no associated ruby source
+ *
+ * <i>Only available when MBARI_API extentions are enabled at build time</i>
+ */
+ 
+static VALUE
+proc_source_file_name(VALUE block)
+{
+    struct BLOCK *data;
+    const char *filename;
+    NODE *node;
+
+    Data_Get_Struct(block, struct BLOCK, data);
+    if ((node = data->frame.node) || (node = data->body))
+      return rb_str_new2(node->nd_file);
+    rb_raise(rb_eArgError, "native Proc");
+}
+
+
+/*
+ * call-seq:
+ *    prc.__line__  => Fixnum  
+ *
+ * returns the starting line number of this proc
+ *
+ * raises ArgumentError if proc has no associated ruby source code
+ *
+ * <i>Only available when MBARI_API extentions are enabled at build time</i>
+ */
+ 
+static VALUE
+proc_source_line(VALUE block)
+{
+    struct BLOCK *data;
+    NODE *node;
+    
+    Data_Get_Struct(block, struct BLOCK, data);
+    if ((node = data->frame.node) || (node = data->body))
+      return INT2FIX( nd_line(node) );
+    rb_raise(rb_eArgError, "native Proc");
+}
+
+#endif  /* MBARI_API */
+
+
 /*
  *  <code>Proc</code> objects are blocks of code that have been bound to
  *  a set of local variables. Once bound, the code may be called in
@@ -9768,6 +10018,15 @@ Init_Proc()
     rb_define_method(rb_cUnboundMethod, "to_s", method_inspect, 0);
     rb_define_method(rb_cUnboundMethod, "bind", umethod_bind, 1);
     rb_define_method(rb_cModule, "instance_method", rb_mod_method, 1);
+    
+#ifdef MBARI_API
+    rb_define_method(rb_cUnboundMethod, "__file__", method_source_file_name, 0);
+    rb_define_method(rb_cUnboundMethod, "__line__", method_source_line, 0);
+    rb_define_method(rb_cProc, "__file__", proc_source_file_name, 0);
+    rb_define_method(rb_cProc, "__line__", proc_source_line, 0);
+    rb_define_method(rb_cMethod, "__file__", method_source_file_name, 0);
+    rb_define_method(rb_cMethod, "__line__", method_source_line, 0);
+#endif
 }
 
 /*
@@ -10084,14 +10343,19 @@ timeofday()
     return (double)tv.tv_sec + (double)tv.tv_usec * 1e-6;
 }
 
-#define STACK(addr) (th->stk_pos<(VALUE*)(addr) && (VALUE*)(addr)<th->stk_pos+th->stk_len)
-#define ADJ(addr) (void*)(STACK(addr)?(((VALUE*)(addr)-th->stk_pos)+th->stk_ptr):(VALUE*)(addr))
+
+#define ADJ(addr) \
+   if ((size_t)((void *)addr - stkBase) < stkSize) addr=(void *)addr + stkShift
+
 static void
 thread_mark(th)
     rb_thread_t th;
 {
     struct FRAME *frame;
     struct BLOCK *block;
+    void *stkBase;
+    ptrdiff_t stkShift;
+    size_t stkSize;
 
     rb_gc_mark(th->result);
     rb_gc_mark(th->thread);
@@ -10126,15 +10390,26 @@ thread_mark(th)
 	}
 #endif
     }
+
+    stkBase = (void *)th->stk_start;
+    stkSize = th->stk_len * sizeof(VALUE);
+#if STACK_GROW_DIRECTION == 0
+    if (rb_gc_stack_grow_direction < 0)
+#endif
+#if STACK_GROW_DIRECTION <= 0
+      stkBase -= stkSize;
+#endif
+    stkShift = (void *)th->stk_ptr - stkBase;
+    
     frame = th->frame;
     while (frame && frame != top_frame) {
-	frame = ADJ(frame);
+	ADJ(frame);
 	rb_gc_mark_frame(frame);
 	if (frame->tmp) {
 	    struct FRAME *tmp = frame->tmp;
 
 	    while (tmp && tmp != top_frame) {
-		tmp = ADJ(tmp);
+		ADJ(tmp);
 		rb_gc_mark_frame(tmp);
 		tmp = tmp->prev;
 	    }
@@ -10143,7 +10418,7 @@ thread_mark(th)
     }
     block = th->block;
     while (block) {
-	block = ADJ(block);
+	ADJ(block);
 	rb_gc_mark_frame(&block->frame);
 	block = block->prev;
     }
@@ -10202,16 +10477,57 @@ rb_gc_abort_threads()
     } END_FOREACH_FROM(main_thread, th);
 }
 
-static void
-thread_free(th)
+
+static inline void
+stack_free(th)
     rb_thread_t th;
 {
-    if (th->stk_ptr) free(th->stk_ptr);
-    th->stk_ptr = 0;
+    if (th->stk_ptr) {
+      free(th->stk_ptr);
+      th->stk_ptr = 0;
+    }
 #ifdef __ia64
-    if (th->bstr_ptr) free(th->bstr_ptr);
-    th->bstr_ptr = 0;
+    if (th->bstr_ptr) {
+      free(th->bstr_ptr);
+      th->bstr_ptr = 0;
+    }
 #endif
+}
+
+static void
+rb_thread_die(th)
+    rb_thread_t th;
+{
+    th->thgroup = 0;
+    th->status = THREAD_KILLED;
+    stack_free(th);
+}
+
+#define THREAD_DATA(threadObject)  ((rb_thread_t)RDATA(threadObject)->data)
+
+static inline void
+cc_purge(cc)
+    rb_thread_t cc;
+{  /* free continuation's stack if it has just died */
+  if (cc->thread != Qnil && THREAD_DATA(cc->thread)->status == THREAD_KILLED) {
+    cc->thread = Qnil;
+    rb_thread_die(cc);  /* can't possibly activate this stack */
+  }  
+}
+
+static void
+cc_mark(cc)
+    rb_thread_t cc;
+{  /* mark this continuation's stack only if its parent thread is still alive */
+  cc_purge(cc);
+  thread_mark(cc);
+}
+
+static void
+thread_free(th)
+    rb_thread_t th;
+{
+    stack_free(th);
     if (th->locals) st_free_table(th->locals);
     if (th->status != THREAD_KILLED) {
 	if (th->prev) th->prev->next = th->next;
@@ -10228,7 +10544,7 @@ rb_thread_check(data)
 	rb_raise(rb_eTypeError, "wrong argument type %s (expected Thread)",
 		 rb_obj_classname(data));
     }
-    return (rb_thread_t)RDATA(data)->data;
+    return THREAD_DATA(data);
 }
 
 static VALUE rb_thread_raise _((int, VALUE*, rb_thread_t));
@@ -10255,13 +10571,10 @@ static void
 rb_thread_save_context(th)
     rb_thread_t th;
 {
-    VALUE *pos;
-    int len;
+    size_t len;
     static VALUE tval;
 
-    len = ruby_stack_length(&pos);
-    th->stk_len = 0;
-    th->stk_pos = pos;
+    len = ruby_stack_length(th->stk_start,&th->stk_pos);
     if (len > th->stk_max) {
 	VALUE *ptr = realloc(th->stk_ptr, sizeof(VALUE) * len);
 	if (!ptr) rb_memerror();
@@ -10323,6 +10636,9 @@ static int
 rb_thread_switch(n)
     int n;
 {
+#if STACK_WIPE_SITES & 1
+    rb_gc_wipe_stack();
+#endif
     rb_trap_immediate = (curr_thread->flags&0x100)?1:0;
     switch (n) {
       case 0:
@@ -10359,15 +10675,14 @@ rb_thread_switch(n)
     return 1;
 }
 
-#define THREAD_SAVE_CONTEXT(th) \
-    (rb_thread_switch((FLUSH_REGISTER_WINDOWS, ruby_setjmp(rb_thread_save_context(th), (th)->context))))
+#define THREAD_SAVE_CONTEXT(th) (rb_thread_switch( wipeAfter(\
+                  ruby_setjmp(rb_thread_save_context(th), (th)->context))))
 
 NORETURN(static void rb_thread_restore_context _((rb_thread_t,int)));
-NORETURN(NOINLINE(static void rb_thread_restore_context_0(rb_thread_t,int,void*)));
-NORETURN(NOINLINE(static void stack_extend(rb_thread_t, int, VALUE *)));
+NORETURN(NOINLINE(static void rb_thread_restore_context_0(rb_thread_t,int)));
 
 static void
-rb_thread_restore_context_0(rb_thread_t th, int exit, void *vp)
+rb_thread_restore_context_0(rb_thread_t th, int exit)
 {
     static rb_thread_t tmp;
     static int ex;
@@ -10424,9 +10739,9 @@ static volatile int C(f), C(g), C(h), C(i), C(j);
 static volatile int C(k), C(l), C(m), C(n), C(o);
 static volatile int C(p), C(q), C(r), C(s), C(t);
 int rb_dummy_false = 0;
-NORETURN(NOINLINE(static void register_stack_extend(rb_thread_t, int, void *, VALUE *)));
+NORETURN(NOINLINE(static void register_stack_extend(rb_thread_t, int, VALUE *)));
 static void
-register_stack_extend(rb_thread_t th, int exit, void *vp, VALUE *curr_bsp)
+register_stack_extend(rb_thread_t th, int exit, VALUE *curr_bsp)
 {
     if (rb_dummy_false) {
         /* use registers as much as possible */
@@ -10440,52 +10755,69 @@ register_stack_extend(rb_thread_t th, int exit, void *vp, VALUE *curr_bsp)
         E(p) = E(q) = E(r) = E(s) = E(t) = 0;
     }
     if (curr_bsp < th->bstr_pos+th->bstr_len) {
-        register_stack_extend(th, exit, &exit, (VALUE*)rb_ia64_bsp());
+        register_stack_extend(th, exit, (VALUE*)rb_ia64_bsp());
     }
-    rb_thread_restore_context_0(th, exit, &exit);
+    rb_thread_restore_context_0(th, exit);
 }
 #undef C
 #undef E
 #endif
 
-# if defined(_MSC_VER) && _MSC_VER >= 1300
-__declspec(noinline) static void stack_extend(rb_thread_t, int, VALUE*);
-# endif
-static void
-stack_extend(rb_thread_t th, int exit, VALUE *addr_in_prev_frame)
-{
-#define STACK_PAD_SIZE 1024
-    VALUE space[STACK_PAD_SIZE];
-
-#if STACK_GROW_DIRECTION < 0
-    if (addr_in_prev_frame > th->stk_pos) stack_extend(th, exit, &space[0]);
-#elif STACK_GROW_DIRECTION > 0
-    if (addr_in_prev_frame < th->stk_pos + th->stk_len) stack_extend(th, exit, &space[STACK_PAD_SIZE-1]);
-#else
-    if (addr_in_prev_frame < rb_gc_stack_start) {
-        /* Stack grows downward */
-        if (addr_in_prev_frame > th->stk_pos) stack_extend(th, exit, &space[0]);
-    }
-    else {
-        /* Stack grows upward */
-        if (addr_in_prev_frame < th->stk_pos + th->stk_len) stack_extend(th, exit, &space[STACK_PAD_SIZE-1]);
-    }
-#endif
-#ifdef __ia64
-    register_stack_extend(th, exit, space, (VALUE*)rb_ia64_bsp());
-#else
-    rb_thread_restore_context_0(th, exit, space);
-#endif
-}
 
 static void
 rb_thread_restore_context(th, exit)
     rb_thread_t th;
     int exit;
 {
+    VALUE *pos = th->stk_start;
+
+#if HAVE_ALLOCA  /* use alloca to grow stack in O(1) time */
     VALUE v;
+
+    if (!th->stk_ptr) rb_bug("unsaved context");
+#  if !STACK_GROW_DIRECTION  /* unknown at compile time */
+    if (rb_gc_stack_grow_direction < 0) {
+#  endif
+#  if STACK_GROW_DIRECTION <= 0
+      pos -= th->stk_len;
+      if (&v > pos) 
+        (volatile void *)ALLOCA_N(VALUE, &v-pos);
+#  endif
+#  if !STACK_GROW_DIRECTION
+    }else
+#  endif
+#if STACK_GROW_DIRECTION >= 0  /* stack grows upward */
+      if (&v < pos + th->stk_len) 
+        (volatile void *)ALLOCA_N(VALUE, pos+th->stk_len - &v);
+#  endif
+
+#else  /* recursive O(n/1024) if extending stack > 1024 VALUEs */
+
+    volatile VALUE v[1023];
+
+#  if !STACK_GROW_DIRECTION  /* unknown at compile time */
+    if (rb_gc_stack_grow_direction < 0) {
+#  endif
+#  if STACK_GROW_DIRECTION <= 0
+      pos -= th->stk_len;
+      if (v > pos) rb_thread_restore_context(th, exit);
+#  endif
+#  if !STACK_GROW_DIRECTION
+    }else
+#  endif
+#  if STACK_GROW_DIRECTION >= 0  /* stack grows upward */
+      if (v < pos + th->stk_len) rb_thread_restore_context(th, exit);
+#  endif
     if (!th->stk_ptr) rb_bug("unsaved context");
-    stack_extend(th, exit, &v);
+    
+#endif  /* stack now extended */
+
+
+#ifdef __ia64
+    register_stack_extend(th, exit, (VALUE*)rb_ia64_bsp());
+#else
+    rb_thread_restore_context_0(th, exit);
+#endif
 }
 
 static void
@@ -10499,16 +10831,6 @@ rb_thread_ready(th)
 }
 
 static void
-rb_thread_die(th)
-    rb_thread_t th;
-{
-    th->thgroup = 0;
-    th->status = THREAD_KILLED;
-    if (th->stk_ptr) free(th->stk_ptr);
-    th->stk_ptr = 0;
-}
-
-static void
 rb_thread_remove(th)
     rb_thread_t th;
 {
@@ -11077,8 +11399,6 @@ rb_thread_select(max, read, write, except, timeout)
     return curr_thread->select_value;
 }
 
-static int rb_thread_join _((rb_thread_t, double));
-
 static int
 rb_thread_join(th, limit)
     rb_thread_t th;
@@ -11171,7 +11491,7 @@ rb_thread_join_m(argc, argv, thread)
 {
     VALUE limit;
     double delay = DELAY_INFTY;
-    rb_thread_t th = rb_thread_check(thread);
+    rb_thread_t th = THREAD_DATA(thread);
 
     rb_scan_args(argc, argv, "01", &limit);
     if (!NIL_P(limit)) delay = rb_num2dbl(limit);
@@ -11283,7 +11603,7 @@ VALUE
 rb_thread_wakeup_alive(thread)
     VALUE thread;
 {
-    rb_thread_t th = rb_thread_check(thread);
+    rb_thread_t th = THREAD_DATA(thread);
 
     if (th->status == THREAD_KILLED)
 	return Qnil;
@@ -11358,7 +11678,7 @@ VALUE
 rb_thread_kill(thread)
     VALUE thread;
 {
-    rb_thread_t th = rb_thread_check(thread);
+    rb_thread_t th = THREAD_DATA(thread);
 
     rb_kill_thread(th, 0);
     return thread;
@@ -11382,7 +11702,7 @@ static VALUE
 rb_thread_kill_bang(thread)
     VALUE thread;
 {
-    rb_thread_t th = rb_thread_check(thread);
+    rb_thread_t th = THREAD_DATA(thread);
     rb_kill_thread(th, THREAD_NO_ENSURE);
     return thread;
 }
@@ -11554,7 +11874,7 @@ static VALUE
 rb_thread_priority(thread)
     VALUE thread;
 {
-    return INT2NUM(rb_thread_check(thread)->priority);
+    return INT2NUM(THREAD_DATA(thread)->priority);
 }
 
 
@@ -11588,7 +11908,7 @@ rb_thread_priority_set(thread, prio)
     rb_thread_t th;
 
     rb_secure(4);
-    th = rb_thread_check(thread);
+    th = THREAD_DATA(thread);
 
     th->priority = NUM2INT(prio);
     rb_thread_schedule();
@@ -11614,7 +11934,7 @@ rb_thread_safe_level(thread)
 {
     rb_thread_t th;
 
-    th = rb_thread_check(thread);
+    th = THREAD_DATA(thread);
     if (th == curr_thread) {
 	return INT2NUM(ruby_safe_level);
     }
@@ -11691,7 +12011,7 @@ static VALUE
 rb_thread_abort_exc(thread)
     VALUE thread;
 {
-    return rb_thread_check(thread)->abort?Qtrue:Qfalse;
+    return THREAD_DATA(thread)->abort?Qtrue:Qfalse;
 }
 
 
@@ -11709,7 +12029,7 @@ rb_thread_abort_exc_set(thread, val)
     VALUE thread, val;
 {
     rb_secure(4);
-    rb_thread_check(thread)->abort = RTEST(val);
+    THREAD_DATA(thread)->abort = RTEST(val);
     return val;
 }
 
@@ -11718,7 +12038,7 @@ enum rb_thread_status
 rb_thread_status(thread)
     VALUE thread;
 {
-    rb_thread_t th = rb_thread_check(thread);
+    rb_thread_t th = THREAD_DATA(thread);
     return th->status;
 }
 
@@ -11737,7 +12057,7 @@ VALUE
 rb_thread_group(thread)
     VALUE thread;
 {
-    VALUE group = rb_thread_check(thread)->thgroup;
+    VALUE group = THREAD_DATA(thread)->thgroup;
     if (!group) {
 	group = Qnil;
     }
@@ -11760,6 +12080,7 @@ rb_thread_group(thread)
     th->result = 0;\
     th->flags = 0;\
 \
+    th->stk_start = rb_gc_stack_start;\
     th->stk_ptr = 0;\
     th->stk_len = 0;\
     th->stk_max = 0;\
@@ -11971,6 +12292,16 @@ rb_thread_start_0(fn, arg, th)
 		 "can't start a new thread (frozen ThreadGroup)");
     }
 
+
+    th->stk_start =   /* establish start of new thread's stack */
+#if STACK_GROW_DIRECTION > 0
+      (VALUE *)ruby_frame;
+#elif STACK_GROW_DIRECTION < 0
+      (VALUE *)(ruby_frame+1);
+#else
+      (VALUE *)(ruby_frame+((VALUE *)(&arg)<rb_gc_stack_start))
+#endif
+ 
     if (!thread_init) {
 	thread_init = 1;
 #if defined(HAVE_SETITIMER) || defined(_THREAD_SAFE)
@@ -12016,6 +12347,8 @@ rb_thread_start_0(fn, arg, th)
     PUSH_TAG(PROT_THREAD);
     if ((state = EXEC_TAG()) == 0) {
 	if (THREAD_SAVE_CONTEXT(th) == 0) {
+            ruby_frame->prev = top_frame;     /* hide parent thread's frames */
+            ruby_frame->tmp = 0;           
 	    curr_thread = th;
 	    th->result = (*fn)(arg, th);
 	}
@@ -12127,9 +12460,6 @@ rb_thread_s_new(argc, argv, klass)
     VALUE klass;
 {
     rb_thread_t th = rb_thread_alloc(klass);
-    volatile VALUE *pos;
-
-    pos = th->stk_pos;
     rb_obj_call_init(th->thread, argc, argv);
     if (th->stk_pos == 0) {
 	rb_raise(rb_eThreadError, "uninitialized thread - check `%s#initialize'",
@@ -12167,7 +12497,7 @@ rb_thread_initialize(thread, args)
     if (!rb_block_given_p()) {
 	rb_raise(rb_eThreadError, "must be called with a block");
     }
-    th = rb_thread_check(thread);
+    th = THREAD_DATA(thread);
     if (th->stk_max) {
 	NODE *node = th->node;
 	if (!node) {
@@ -12216,7 +12546,7 @@ static VALUE
 rb_thread_value(thread)
     VALUE thread;
 {
-    rb_thread_t th = rb_thread_check(thread);
+    rb_thread_t th = THREAD_DATA(thread);
 
     while (!rb_thread_join(th, DELAY_INFTY));
 
@@ -12251,7 +12581,7 @@ static VALUE
 rb_thread_status_name(thread)
     VALUE thread;
 {
-    rb_thread_t th = rb_thread_check(thread);
+    rb_thread_t th = THREAD_DATA(thread);
 
     if (rb_thread_dead(th)) {
 	if (!NIL_P(th->errinfo) && (th->flags & RAISED_EXCEPTION))
@@ -12279,7 +12609,7 @@ VALUE
 rb_thread_alive_p(thread)
     VALUE thread;
 {
-    rb_thread_t th = rb_thread_check(thread);
+    rb_thread_t th = THREAD_DATA(thread);
 
     if (rb_thread_dead(th)) return Qfalse;
     return Qtrue;
@@ -12302,7 +12632,7 @@ static VALUE
 rb_thread_stop_p(thread)
     VALUE thread;
 {
-    rb_thread_t th = rb_thread_check(thread);
+    rb_thread_t th = THREAD_DATA(thread);
 
     if (rb_thread_dead(th)) return Qtrue;
     if (th->status == THREAD_STOPPED) return Qtrue;
@@ -12536,7 +12866,7 @@ rb_thread_raise_m(argc, argv, thread)
     VALUE *argv;
     VALUE thread;
 {
-    rb_thread_t th = rb_thread_check(thread);
+    rb_thread_t th = THREAD_DATA(thread);
 
     if (ruby_safe_level > th->safe) {
 	rb_secure(4);
@@ -12553,7 +12883,7 @@ rb_thread_local_aref(thread, id)
     rb_thread_t th;
     VALUE val;
 
-    th = rb_thread_check(thread);
+    th = THREAD_DATA(thread);
     if (ruby_safe_level >= 4 && th != curr_thread) {
 	rb_raise(rb_eSecurityError, "Insecure: thread locals");
     }
@@ -12599,7 +12929,7 @@ rb_thread_local_aset(thread, id, val)
     ID id;
     VALUE val;
 {
-    rb_thread_t th = rb_thread_check(thread);
+    rb_thread_t th = THREAD_DATA(thread);
 
     if (ruby_safe_level >= 4 && th != curr_thread) {
 	rb_raise(rb_eSecurityError, "Insecure: can't modify thread locals");
@@ -12652,7 +12982,7 @@ static VALUE
 rb_thread_key_p(thread, id)
     VALUE thread, id;
 {
-    rb_thread_t th = rb_thread_check(thread);
+    rb_thread_t th = THREAD_DATA(thread);
 
     if (!th->locals) return Qfalse;
     if (st_lookup(th->locals, rb_to_id(id), 0))
@@ -12688,7 +13018,7 @@ static VALUE
 rb_thread_keys(thread)
     VALUE thread;
 {
-    rb_thread_t th = rb_thread_check(thread);
+    rb_thread_t th = THREAD_DATA(thread);
     VALUE ary = rb_ary_new();
 
     if (th->locals) {
@@ -12709,7 +13039,7 @@ rb_thread_inspect(thread)
     VALUE thread;
 {
     char *cname = rb_obj_classname(thread);
-    rb_thread_t th = rb_thread_check(thread);
+    rb_thread_t th = THREAD_DATA(thread);
     const char *status = thread_status_name(th->status);
     VALUE str;
     size_t len = strlen(cname)+7+16+9+1;
@@ -12789,6 +13119,32 @@ rb_thread_atfork()
 
 VALUE rb_cCont;
 
+
+static rb_thread_t prep4callcc(void)
+{
+  rb_thread_t th;
+  struct tag *tag;
+  struct RVarmap *vars;
+
+  THREAD_ALLOC(th);
+  /* must finish th initialization before any possible gc */
+  th->thread = curr_thread->thread;    /* brent@mbari.org */
+  th->thgroup = cont_protect;
+
+  scope_dup(ruby_scope);
+  for (tag=prot_tag; tag; tag=tag->prev) {
+      if (tag->tag == PROT_THREAD) break;
+      scope_dup(tag->scope);
+  }
+
+  for (vars = ruby_dyna_vars; vars; vars = vars->next) {
+      if (FL_TEST(vars, DVAR_DONT_RECYCLE)) break;
+      FL_SET(vars, DVAR_DONT_RECYCLE);
+  }
+  return th;
+}
+
+
 /*
  *  call-seq:
  *     callcc {|cont| block }   =>  obj
@@ -12807,35 +13163,14 @@ static VALUE
 rb_callcc(self)
     VALUE self;
 {
-    volatile VALUE cont;
-    rb_thread_t th;
-    volatile rb_thread_t th_save;
-    struct tag *tag;
-    struct RVarmap *vars;
-
-    THREAD_ALLOC(th);
-    cont = Data_Wrap_Struct(rb_cCont, thread_mark, thread_free, th);
-
-    scope_dup(ruby_scope);
-    for (tag=prot_tag; tag; tag=tag->prev) {
-	scope_dup(tag->scope);
-    }
-    th->thread = curr_thread->thread;
-    th->thgroup = cont_protect;
-
-    for (vars = ruby_dyna_vars; vars; vars = vars->next) {
-	if (FL_TEST(vars, DVAR_DONT_RECYCLE)) break;
-	FL_SET(vars, DVAR_DONT_RECYCLE);
-    }
-    th_save = th;
-    if (THREAD_SAVE_CONTEXT(th)) {
-	return th_save->result;
-    }
-    else {
-	return rb_yield(cont);
-    }
+    volatile rb_thread_t th = prep4callcc();
+    return THREAD_SAVE_CONTEXT(th) ?
+      th->result
+          :
+      rb_yield(Data_Wrap_Struct(rb_cCont, cc_mark, thread_free, th));
 }
 
+
 /*
  *  call-seq:
  *     cont.call(args, ...) 
@@ -12858,7 +13193,7 @@ rb_cont_call(argc, argv, cont)
     VALUE *argv;
     VALUE cont;
 {
-    rb_thread_t th = rb_thread_check(cont);
+    rb_thread_t th = THREAD_DATA(cont);
 
     if (th->thread != curr_thread->thread) {
 	rb_raise(rb_eRuntimeError, "continuation called across threads");
@@ -12882,6 +13217,34 @@ rb_cont_call(argc, argv, cont)
     return Qnil;
 }
 
+
+#ifdef MBARI_API
+/*
+ *  call-seq:
+ *     cont.thread
+ *  
+ *  Returns the thread on which this continuation can be called
+ *  or nil if that thread has died
+ *
+ *     t = Thread.new {callcc{|c| $x=c}; sleep 5}
+ *     sleep 1
+ *     $x.thread                             #=> t
+ *     sleep 10
+ *     $x.thread                             #=> nil
+ *
+ *  <i>Only available when MBARI_API extentions are enabled at build time</i>
+ */
+static VALUE
+rb_cont_thread(cont)
+  VALUE cont;
+{
+  rb_thread_t th = THREAD_DATA(cont);
+  cc_purge(th);
+  return th->thread;
+}
+#endif
+
+
 struct thgroup {
     int enclosed;
     VALUE group;
@@ -13034,10 +13397,6 @@ thgroup_add(group, thread)
 
     rb_secure(4);
     th = rb_thread_check(thread);
-    if (!th->next || !th->prev) {
-	rb_raise(rb_eTypeError, "wrong argument type %s (expected Thread)",
-		 rb_obj_classname(thread));
-    }
 
     if (OBJ_FROZEN(group)) {
       rb_raise(rb_eThreadError, "can't move to the frozen thread group");
@@ -13135,6 +13494,9 @@ Init_Thread()
     rb_undef_method(CLASS_OF(rb_cCont), "new");
     rb_define_method(rb_cCont, "call", rb_cont_call, -1);
     rb_define_method(rb_cCont, "[]", rb_cont_call, -1);
+#ifdef MBARI_API
+    rb_define_method(rb_cCont, "thread", rb_cont_thread, 0);
+#endif
     rb_define_global_function("callcc", rb_callcc, 0);
     rb_global_variable(&cont_protect);
 
@@ -13186,14 +13548,15 @@ Init_Thread()
 
 static VALUE
 rb_f_catch(dmy, tag)
-    VALUE dmy, tag;
+    VALUE dmy;
+    volatile VALUE tag;
 {
     int state;
-    VALUE val = Qnil;		/* OK */
+    VALUE val;
 
     tag = ID2SYM(rb_to_id(tag));
     PUSH_TAG(tag);
-    if ((state = EXEC_TAG()) == 0) {
+    if ((state = wipeAfter(EXEC_TAG_0())) == 0) {
 	val = rb_yield_0(tag, 0, 0, 0, Qfalse);
     }
     else if (state == TAG_THROW && tag == prot_tag->dst) {
@@ -13261,6 +13624,9 @@ rb_f_throw(argc, argv)
     if (!tt) {
 	rb_name_error(SYM2ID(tag), "uncaught throw `%s'", rb_id2name(SYM2ID(tag)));
     }
+#if STACK_WIPE_SITES & 0x800
+    rb_gc_update_stack_extent();
+#endif
     rb_trap_restore_mask();
     JUMP_TAG(TAG_THROW);
 #ifndef __GNUC__
diff --git a/gc.c b/gc.c
index 33f035e..d89ee09 100644
--- a/gc.c
+++ b/gc.c
@@ -22,10 +22,6 @@
 #include <setjmp.h>
 #include <sys/types.h>
 
-#ifdef HAVE_SYS_TIME_H
-#include <sys/time.h>
-#endif
-
 #ifdef HAVE_SYS_RESOURCE_H
 #include <sys/resource.h>
 #endif
@@ -41,39 +37,150 @@ void rb_io_fptr_finalize _((struct OpenFile*));
 #define setjmp(env) _setjmp(env)
 #endif
 
-/* Make alloca work the best possible way.  */
-#ifdef __GNUC__
-# ifndef atarist
-#  ifndef alloca
-#   define alloca __builtin_alloca
-#  endif
-# endif /* atarist */
-#else
-# ifdef HAVE_ALLOCA_H
-#  include <alloca.h>
-# else
-#  ifndef _AIX
-#   ifndef alloca /* predefined by HP cc +Olibcalls */
-void *alloca ();
-#   endif
-#  endif /* AIX */
-# endif /* HAVE_ALLOCA_H */
-#endif /* __GNUC__ */
-
 #ifndef GC_MALLOC_LIMIT
 #if defined(MSDOS) || defined(__human68k__)
 #define GC_MALLOC_LIMIT 200000
 #else
-#define GC_MALLOC_LIMIT 8000000
+#define GC_MALLOC_LIMIT (2000000*sizeof(VALUE))
 #endif
 #endif
 
-static unsigned long malloc_increase = 0;
-static unsigned long malloc_limit = GC_MALLOC_LIMIT;
+#ifndef GC_LEVEL_MAX  /*maximum # of VALUEs on 'C' stack during GC*/
+#define GC_LEVEL_MAX  8000
+#endif
+#ifndef GC_STACK_PAD
+#define GC_STACK_PAD  200  /* extra padding VALUEs for GC stack */
+#endif
+#define GC_STACK_MAX  (GC_LEVEL_MAX+GC_STACK_PAD)
+
+static VALUE *stack_limit, *gc_stack_limit;
+
+static size_t malloc_increase = 0;
+static size_t malloc_limit = GC_MALLOC_LIMIT;
+
+#ifdef MBARI_API
+/*
+ *  call-seq:
+ *     GC.limit    => increase limit in bytes
+ *
+ *  Get the # of bytes that may be allocated before triggering
+ *  a mark and sweep by the garbarge collector to reclaim unused storage.
+ *
+ *  <i>Only available when MBARI_API extentions are enabled at build time</i>
+ */
+static VALUE gc_getlimit(VALUE mod)
+{
+  return ULONG2NUM(malloc_limit);
+}
+
+/*
+ *  call-seq:
+ *     GC.limit=   => updated increase limit in bytes
+ *
+ *  Set the # of bytes that may be allocated before triggering
+ *  a mark and sweep by the garbarge collector to reclaim unused storage.
+ *  Attempts to set the GC.limit= less than 0 will be ignored.
+ *
+ *     GC.limit=5000000   #=> 5000000
+ *     GC.limit           #=> 5000000
+ *     GC.limit=-50       #=> 5000000
+ *     GC.limit=0         #=> 0  #functionally equivalent to GC.stress=true
+ *
+ *  <i>Only available when MBARI_API extentions are enabled at build time</i>
+ */
+static VALUE gc_setlimit(VALUE mod, VALUE newLimit)
+{
+  long limit = NUM2LONG(newLimit);
+  rb_secure(2);
+  if (limit < 0) return gc_getlimit(mod);
+  malloc_limit = limit;
+  return newLimit;
+}
+
+
+/*
+ *  call-seq:
+ *     GC.growth
+ *
+ *  Get # of bytes that have been allocated since the last mark & sweep
+ *
+ *  <i>Only available when MBARI_API extentions are enabled at build time</i>
+ */
+static VALUE gc_growth(VALUE mod)
+{
+  return ULONG2NUM(malloc_increase);
+}
+
+
+/*
+ *  call-seq:
+ *     GC.exorcise
+ *
+ *  Purge ghost references from recently freed stack space
+ *
+ *  <i>Only available when MBARI_API extentions are enabled at build time</i>
+ */
+static VALUE gc_exorcise(VALUE mod)
+{
+  rb_gc_wipe_stack();
+  return Qnil;
+}
+
+#else /* no api changes */
+
+static size_t unstressed_malloc_limit = GC_MALLOC_LIMIT;
+
+/*
+ *  call-seq:
+ *    GC.stress                 => true or false
+ *
+ *  returns current status of GC stress mode.
+ *
+ *  <i>Only available when MBARI_API extentions are disabled at build time</i>
+ */
+
+static VALUE
+gc_stress_get(self)
+    VALUE self;
+{
+    return malloc_limit ? Qfalse : Qtrue;
+}
+
+/*
+ *  call-seq:
+ *    GC.stress = bool          => bool
+ *
+ *  updates GC stress mode.
+ *
+ *  When GC.stress = true, GC is invoked for all GC opportunity:
+ *  all memory and object allocation.
+ *
+ *  Since it makes Ruby very slow, it is only for debugging.
+ *
+ *  <i>Only available when MBARI_API extentions are enabled at build time</i>
+ */
+
+static VALUE
+gc_stress_set(self, bool)
+    VALUE self, bool;
+{
+    rb_secure(2);
+    if (!RTEST(bool))
+      malloc_limit = unstressed_malloc_limit;
+    else if (malloc_limit > 0) {
+      unstressed_malloc_limit = malloc_limit;
+      malloc_limit = 0;
+    }
+    return bool;
+}
+
+#endif /* MBARI_API */
+
 static void run_final();
 static VALUE nomem_error;
 static void garbage_collect();
 
+
 NORETURN(void rb_exc_jump _((VALUE)));
 
 void
@@ -93,6 +200,7 @@ rb_memerror()
     rb_exc_raise(nomem_error);
 }
 
+
 void *
 ruby_xmalloc(size)
     long size;
@@ -104,8 +212,9 @@ ruby_xmalloc(size)
     }
     if (size == 0) size = 1;
 
-    if ((malloc_increase+size) > malloc_limit) {
+    if ((malloc_increase+=size) > malloc_limit) {
 	garbage_collect();
+        malloc_increase = size;
     }
     RUBY_CRITICAL(mem = malloc(size));
     if (!mem) {
@@ -115,8 +224,9 @@ ruby_xmalloc(size)
 	    rb_memerror();
 	}
     }
-    malloc_increase += size;
-
+#if STACK_WIPE_SITES & 0x100
+    rb_gc_update_stack_extent();
+#endif
     return mem;
 }
 
@@ -144,6 +254,10 @@ ruby_xrealloc(ptr, size)
     }
     if (!ptr) return xmalloc(size);
     if (size == 0) size = 1;
+    if ((malloc_increase+=size) > malloc_limit) {
+	garbage_collect();
+        malloc_increase = size;
+    }
     RUBY_CRITICAL(mem = realloc(ptr, size));
     if (!mem) {
 	garbage_collect();
@@ -152,8 +266,9 @@ ruby_xrealloc(ptr, size)
 	    rb_memerror();
         }
     }
-    malloc_increase += size;
-
+#if STACK_WIPE_SITES & 0x200
+    rb_gc_update_stack_extent();
+#endif
     return mem;
 }
 
@@ -393,7 +508,7 @@ rb_newobj()
     if (during_gc)
 	rb_bug("object allocation during garbage collection phase");
 
-    if (!freelist) garbage_collect();
+    if (!malloc_limit || !freelist) garbage_collect();
 
     obj = (VALUE)freelist;
     freelist = freelist->as.free.next;
@@ -428,6 +543,9 @@ VALUE *rb_gc_stack_start = 0;
 VALUE *rb_gc_register_stack_start = 0;
 #endif
 
+VALUE *rb_gc_stack_end = (VALUE *)STACK_GROW_DIRECTION;
+
+
 #ifdef DJGPP
 /* set stack size (http://www.delorie.com/djgpp/v2faq/faq15_9.html) */
 unsigned int _stklen = 0x180000; /* 1.5 kB */
@@ -445,77 +563,90 @@ static unsigned int STACK_LEVEL_MAX = 655300;
 # define STACK_LEVEL_MAX 655300
 #endif
 
-#ifdef C_ALLOCA
-# define SET_STACK_END VALUE stack_end; alloca(0);
+#ifndef nativeAllocA
+  /* portable way to return an approximate stack pointer */
+NOINLINE(VALUE *__sp(void));
+VALUE *__sp(void) {
+  VALUE tos;
+  return &tos;
+}
+# define SET_STACK_END VALUE stack_end
 # define STACK_END (&stack_end)
 #else
-# if defined(__GNUC__) && defined(USE_BUILTIN_FRAME_ADDRESS) && !defined(__ia64)
-#  if ( __GNUC__ == 3 && __GNUC_MINOR__ > 0 ) || __GNUC__ > 3
-__attribute__ ((noinline))
-#  endif
-static void
-stack_end_address(VALUE **stack_end_p)
-{
-    VALUE stack_end;
-    *stack_end_p = &stack_end;
-}
-#  define  SET_STACK_END    VALUE *stack_end; stack_end_address(&stack_end)
-# else
-#  define  SET_STACK_END    VALUE *stack_end = alloca(1)
-# endif
-# define STACK_END (stack_end)
+# define SET_STACK_END ((void)0)
+# define STACK_END __sp()
 #endif
+
 #if STACK_GROW_DIRECTION < 0
-# define STACK_LENGTH  (rb_gc_stack_start - STACK_END)
+# define STACK_LENGTH(start)  ((start) - STACK_END)
 #elif STACK_GROW_DIRECTION > 0
-# define STACK_LENGTH  (STACK_END - rb_gc_stack_start + 1)
+# define STACK_LENGTH(start)  (STACK_END - (start) + 1)
 #else
-# define STACK_LENGTH  ((STACK_END < rb_gc_stack_start) ? rb_gc_stack_start - STACK_END\
-                                           : STACK_END - rb_gc_stack_start + 1)
+# define STACK_LENGTH(start)  ((STACK_END < (start)) ? \
+                                 (start) - STACK_END : STACK_END - (start) + 1)
 #endif
+
 #if STACK_GROW_DIRECTION > 0
-# define STACK_UPPER(x, a, b) a
+# define STACK_UPPER(a, b) a
 #elif STACK_GROW_DIRECTION < 0
-# define STACK_UPPER(x, a, b) b
+# define STACK_UPPER(a, b) b
 #else
-static int grow_direction;
+int rb_gc_stack_grow_direction;
 static int
 stack_grow_direction(addr)
     VALUE *addr;
 {
     SET_STACK_END;
-
-    if (STACK_END > addr) return grow_direction = 1;
-    return grow_direction = -1;
+    return rb_gc_stack_grow_direction = STACK_END > addr ? 1 : -1;
 }
-# define stack_growup_p(x) ((grow_direction ? grow_direction : stack_grow_direction(x)) > 0)
-# define STACK_UPPER(x, a, b) (stack_growup_p(x) ? a : b)
+# define STACK_UPPER(a, b) (rb_gc_stack_grow_direction > 0 ? a : b)
 #endif
 
-#define GC_WATER_MARK 512
-
-#define CHECK_STACK(ret) do {\
-    SET_STACK_END;\
-    (ret) = (STACK_LENGTH > STACK_LEVEL_MAX + GC_WATER_MARK);\
-} while (0)
-
-int
-ruby_stack_length(p)
-    VALUE **p;
+size_t
+ruby_stack_length(start, base)
+    VALUE *start, **base;
 {
     SET_STACK_END;
-    if (p) *p = STACK_UPPER(STACK_END, rb_gc_stack_start, STACK_END);
-    return STACK_LENGTH;
+    if (base) *base = STACK_UPPER(start, STACK_END);
+    return STACK_LENGTH(start);
 }
 
 int
 ruby_stack_check()
 {
-    int ret;
+    SET_STACK_END;
+    return __stack_past(stack_limit, STACK_END);
+}
 
-    CHECK_STACK(ret);
-    return ret;
+/*
+  Zero memory that was (recently) part of the stack, but is no longer.
+  Invoke when stack is deep to mark its extent and when it's shallow to wipe it.
+*/
+#if STACK_WIPE_METHOD != 4
+#if STACK_WIPE_METHOD
+void rb_gc_wipe_stack(void)
+{
+  VALUE *stack_end = rb_gc_stack_end;
+  VALUE *sp = __sp();
+  rb_gc_stack_end = sp;
+#if STACK_WIPE_METHOD == 1
+#warning clearing of "ghost references" from the call stack has been disabled
+#elif STACK_WIPE_METHOD == 2  /* alloca ghost stack before clearing it */
+  if (__stack_past(sp, stack_end)) {
+    size_t bytes = __stack_depth((char *)stack_end, (char *)sp);
+    STACK_UPPER(sp = nativeAllocA(bytes), stack_end = nativeAllocA(bytes));
+    __stack_zero(stack_end, sp);
+  }
+#elif STACK_WIPE_METHOD == 3    /* clear unallocated area past stack pointer */
+  __stack_zero(stack_end, sp);  /* will crash if compiler pushes a temp. here */
+#else
+#error unsupported method of clearing ghost references from the stack
+#endif
 }
+#else
+#warning clearing of "ghost references" from the call stack completely disabled
+#endif
+#endif
 
 #define MARK_STACK_MAX 1024
 static VALUE mark_stack[MARK_STACK_MAX];
@@ -530,7 +661,18 @@ init_mark_stack()
 }
 
 #define MARK_STACK_EMPTY (mark_stack_ptr == mark_stack)
-            
+
+static inline void
+push_mark_stack(VALUE ptr)
+{
+    if (!mark_stack_overflow) {
+	if (mark_stack_ptr - mark_stack < MARK_STACK_MAX)
+	    *mark_stack_ptr++ = ptr;
+	else
+	    mark_stack_overflow = 1;
+    }
+}
+    
 static st_table *source_filenames;
 
 char *
@@ -574,22 +716,22 @@ sweep_source_filename(key, value)
     }
 }
 
-static void gc_mark _((VALUE ptr, int lev));
-static void gc_mark_children _((VALUE ptr, int lev));
+#define gc_mark(ptr) rb_gc_mark(ptr)
+static void gc_mark_children _((VALUE ptr));
 
 static void
 gc_mark_all()
 {
     RVALUE *p, *pend;
-    int i;
+    struct heaps_slot *heap = heaps+heaps_used;
 
     init_mark_stack();
-    for (i = 0; i < heaps_used; i++) {
-	p = heaps[i].slot; pend = p + heaps[i].limit;
+    while (--heap >= heaps) {
+	p = heap->slot; pend = p + heap->limit;
 	while (p < pend) {
 	    if ((p->as.basic.flags & FL_MARK) &&
 		(p->as.basic.flags != FL_MARK)) {
-		gc_mark_children((VALUE)p, 0);
+		gc_mark_children((VALUE)p);
 	    }
 	    p++;
 	}
@@ -599,169 +741,129 @@ gc_mark_all()
 static void
 gc_mark_rest()
 {
+    size_t stackLen = mark_stack_ptr - mark_stack;
+#ifdef nativeAllocA
+    VALUE *tmp_arry = nativeAllocA(stackLen*sizeof(VALUE));
+#else
     VALUE tmp_arry[MARK_STACK_MAX];
-    VALUE *p;
-
-    p = (mark_stack_ptr - mark_stack) + tmp_arry;
-    MEMCPY(tmp_arry, mark_stack, VALUE, MARK_STACK_MAX);
+#endif
+    VALUE *p = tmp_arry + stackLen;
+    
+    MEMCPY(tmp_arry, mark_stack, VALUE, stackLen);
 
     init_mark_stack();
-    while(p != tmp_arry){
-	p--;
-	gc_mark_children(*p, 0);
-    }
+    while(--p >= tmp_arry) gc_mark_children(*p);
 }
 
 static inline int
 is_pointer_to_heap(ptr)
     void *ptr;
 {
-    register RVALUE *p = RANY(ptr);
-    register RVALUE *heap_org;
-    register long i;
+    RVALUE *p = RANY(ptr);
+    struct heaps_slot *heap;
 
-    if (p < lomem || p > himem) return Qfalse;
-    if ((VALUE)p % sizeof(RVALUE) != 0) return Qfalse;
+    if (p < lomem || p > himem || (VALUE)p % sizeof(RVALUE)) return Qfalse;
 
     /* check if p looks like a pointer */
-    for (i=0; i < heaps_used; i++) {
-	heap_org = heaps[i].slot;
-	if (heap_org <= p && p < heap_org + heaps[i].limit)
-	    return Qtrue;
-    }
+    heap = heaps+heaps_used;
+    while (--heap >= heaps) 
+      if (p >= heap->slot && p < heap->slot + heap->limit)
+        return Qtrue;
     return Qfalse;
 }
 
 static void
 mark_locations_array(x, n)
-    register VALUE *x;
-    register long n;
+    VALUE *x;
+    size_t n;
 {
     VALUE v;
     while (n--) {
         v = *x;
 	if (is_pointer_to_heap((void *)v)) {
-	    gc_mark(v, 0);
+	    gc_mark(v);
 	}
 	x++;
     }
 }
 
-void
+inline void
 rb_gc_mark_locations(start, end)
     VALUE *start, *end;
 {
-    long n;
-
-    n = end - start;
-    mark_locations_array(start,n);
+    mark_locations_array(start,end - start);
 }
 
 static int
-mark_entry(key, value, lev)
+mark_entry(key, value)
     ID key;
     VALUE value;
-    int lev;
 {
-    gc_mark(value, lev);
+    gc_mark(value);
     return ST_CONTINUE;
 }
 
-static void
-mark_tbl(tbl, lev)
-    st_table *tbl;
-    int lev;
-{
-    if (!tbl) return;
-    st_foreach(tbl, mark_entry, lev);
-}
-
 void
 rb_mark_tbl(tbl)
     st_table *tbl;
 {
-    mark_tbl(tbl, 0);
+    if (!tbl) return;
+    st_foreach(tbl, mark_entry, 0);
 }
+#define mark_tbl(tbl)  rb_mark_tbl(tbl)
 
 static int
-mark_keyvalue(key, value, lev)
+mark_keyvalue(key, value)
     VALUE key;
     VALUE value;
-    int lev;
 {
-    gc_mark(key, lev);
-    gc_mark(value, lev);
+    gc_mark(key);
+    gc_mark(value);
     return ST_CONTINUE;
 }
 
-static void
-mark_hash(tbl, lev)
-    st_table *tbl;
-    int lev;
-{
-    if (!tbl) return;
-    st_foreach(tbl, mark_keyvalue, lev);
-}
-
 void
 rb_mark_hash(tbl)
     st_table *tbl;
 {
-    mark_hash(tbl, 0);
+    if (!tbl) return;
+    st_foreach(tbl, mark_keyvalue, 0);
 }
+#define mark_hash(tbl)  rb_mark_hash(tbl)
 
 void
 rb_gc_mark_maybe(obj)
     VALUE obj;
 {
     if (is_pointer_to_heap((void *)obj)) {
-	gc_mark(obj, 0);
+	gc_mark(obj);
     }
 }
 
-#define GC_LEVEL_MAX 250
-
-static void
-gc_mark(ptr, lev)
+void
+rb_gc_mark(ptr)
     VALUE ptr;
-    int lev;
 {
-    register RVALUE *obj;
-
-    obj = RANY(ptr);
+    RVALUE *obj = RANY(ptr);
+    SET_STACK_END;
+    
     if (rb_special_const_p(ptr)) return; /* special const not marked */
     if (obj->as.basic.flags == 0) return;       /* free cell */
     if (obj->as.basic.flags & FL_MARK) return;  /* already marked */
     obj->as.basic.flags |= FL_MARK;
 
-    if (lev > GC_LEVEL_MAX || (lev == 0 && ruby_stack_check())) {
-	if (!mark_stack_overflow) {
-	    if (mark_stack_ptr - mark_stack < MARK_STACK_MAX) {
-		*mark_stack_ptr = ptr;
-		mark_stack_ptr++;		
-	    }
-	    else {
-		mark_stack_overflow = 1;
-	    }
-	}
-	return;
+    if (__stack_past(gc_stack_limit, STACK_END))
+      push_mark_stack(ptr);
+    else{
+      gc_mark_children(ptr);
     }
-    gc_mark_children(ptr, lev+1);
-}
-
-void
-rb_gc_mark(ptr)
-    VALUE ptr;
-{
-    gc_mark(ptr, 0);
 }
 
 static void
-gc_mark_children(ptr, lev)
+gc_mark_children(ptr)
     VALUE ptr;
-    int lev;
 {
-    register RVALUE *obj = RANY(ptr);
+    RVALUE *obj = RANY(ptr);
 
     goto marking;		/* skip */
 
@@ -795,7 +897,7 @@ gc_mark_children(ptr, lev)
 	  case NODE_RESCUE:
 	  case NODE_RESBODY:
 	  case NODE_CLASS:
-	    gc_mark((VALUE)obj->as.node.u2.node, lev);
+	    gc_mark((VALUE)obj->as.node.u2.node);
 	    /* fall through */
 	  case NODE_BLOCK:	/* 1,3 */
 	  case NODE_ARRAY:
@@ -808,7 +910,7 @@ gc_mark_children(ptr, lev)
 	  case NODE_CALL:
 	  case NODE_DEFS:
 	  case NODE_OP_ASGN1:
-	    gc_mark((VALUE)obj->as.node.u1.node, lev);
+	    gc_mark((VALUE)obj->as.node.u1.node);
 	    /* fall through */
 	  case NODE_SUPER:	/* 3 */
 	  case NODE_FCALL:
@@ -835,7 +937,7 @@ gc_mark_children(ptr, lev)
 	  case NODE_ALIAS:
 	  case NODE_VALIAS:
 	  case NODE_ARGS:
-	    gc_mark((VALUE)obj->as.node.u1.node, lev);
+	    gc_mark((VALUE)obj->as.node.u1.node);
 	    /* fall through */
 	  case NODE_METHOD:	/* 2 */
 	  case NODE_NOT:
@@ -873,7 +975,7 @@ gc_mark_children(ptr, lev)
 	  case NODE_SCOPE:	/* 2,3 */
 	  case NODE_BLOCK_PASS:
 	  case NODE_CDECL:
-	    gc_mark((VALUE)obj->as.node.u3.node, lev);
+	    gc_mark((VALUE)obj->as.node.u3.node);
 	    ptr = (VALUE)obj->as.node.u2.node;
 	    goto again;
 
@@ -906,25 +1008,26 @@ gc_mark_children(ptr, lev)
 
 	  default:		/* unlisted NODE */
 	    if (is_pointer_to_heap(obj->as.node.u1.node)) {
-		gc_mark((VALUE)obj->as.node.u1.node, lev);
+		gc_mark((VALUE)obj->as.node.u1.node);
 	    }
 	    if (is_pointer_to_heap(obj->as.node.u2.node)) {
-		gc_mark((VALUE)obj->as.node.u2.node, lev);
+		gc_mark((VALUE)obj->as.node.u2.node);
 	    }
 	    if (is_pointer_to_heap(obj->as.node.u3.node)) {
-		gc_mark((VALUE)obj->as.node.u3.node, lev);
+                ptr = (VALUE)obj->as.node.u3.node;
+                goto again;
 	    }
 	}
-	return;			/* no need to mark class. */
+        return;	/* no need to mark class. */
     }
 
-    gc_mark(obj->as.basic.klass, lev);
+    gc_mark(obj->as.basic.klass);
     switch (obj->as.basic.flags & T_MASK) {
       case T_ICLASS:
       case T_CLASS:
       case T_MODULE:
-	mark_tbl(obj->as.klass.m_tbl, lev);
-	mark_tbl(obj->as.klass.iv_tbl, lev);
+	mark_tbl(obj->as.klass.m_tbl);
+	mark_tbl(obj->as.klass.iv_tbl);
 	ptr = obj->as.klass.super;
 	goto again;
 
@@ -934,17 +1037,16 @@ gc_mark_children(ptr, lev)
 	    goto again;
 	}
 	else {
-	    long i, len = obj->as.array.len;
 	    VALUE *ptr = obj->as.array.ptr;
-
-	    for (i=0; i < len; i++) {
-		gc_mark(*ptr++, lev);
+            VALUE *pend = ptr + obj->as.array.len;
+	    while (ptr < pend) {
+		gc_mark(*ptr++);
 	    }
 	}
 	break;
 
       case T_HASH:
-	mark_hash(obj->as.hash.tbl, lev);
+	mark_hash(obj->as.hash.tbl);
 	ptr = obj->as.hash.ifnone;
 	goto again;
 
@@ -961,7 +1063,7 @@ gc_mark_children(ptr, lev)
 	break;
 
       case T_OBJECT:
-	mark_tbl(obj->as.object.iv_tbl, lev);
+	mark_tbl(obj->as.object.iv_tbl);
 	break;
 
       case T_FILE:
@@ -979,7 +1081,7 @@ gc_mark_children(ptr, lev)
 	break;
 
       case T_VARMAP:
-	gc_mark(obj->as.varmap.val, lev);
+	gc_mark(obj->as.varmap.val);
 	ptr = (VALUE)obj->as.varmap.next;
 	goto again;
 
@@ -989,19 +1091,17 @@ gc_mark_children(ptr, lev)
 	    VALUE *vars = &obj->as.scope.local_vars[-1];
 
 	    while (n--) {
-		gc_mark(*vars++, lev);
+		gc_mark(*vars++);
 	    }
 	}
 	break;
 
       case T_STRUCT:
 	{
-	    long len = obj->as.rstruct.len;
 	    VALUE *ptr = obj->as.rstruct.ptr;
-
-	    while (len--) {
-		gc_mark(*ptr++, lev);
-	    }
+            VALUE *pend = ptr + obj->as.rstruct.len;
+            while (ptr < pend)
+	       gc_mark(*ptr++);
 	}
 	break;
 
@@ -1057,13 +1157,12 @@ gc_sweep()
     RVALUE *p, *pend, *final_list;
     int freed = 0;
     int i;
-    unsigned long live = 0;
-    unsigned long free_min = 0;
+    long free_min = 0;
 
     for (i = 0; i < heaps_used; i++) {
         free_min += heaps[i].limit;
     }
-    free_min = free_min * 0.2;
+    free_min /= 5;
     if (free_min < FREE_MIN)
         free_min = FREE_MIN;
 
@@ -1074,7 +1173,7 @@ gc_sweep()
 	    p = heaps[i].slot; pend = p + heaps[i].limit;
 	    while (p < pend) {
 		if (!(p->as.basic.flags&FL_MARK) && BUILTIN_TYPE(p) == T_NODE)
-		    gc_mark((VALUE)p, 0);
+		    gc_mark((VALUE)p);
 		p++;
 	    }
 	}
@@ -1117,7 +1216,6 @@ gc_sweep()
 	    }
 	    else {
 		RBASIC(p)->flags &= ~FL_MARK;
-		live++;
 	    }
 	    p++;
 	}
@@ -1134,10 +1232,6 @@ gc_sweep()
 	    freed += n;
 	}
     }
-    if (malloc_increase > malloc_limit) {
-	malloc_limit += (malloc_increase - malloc_limit) * (double)live / (live + freed);
-	if (malloc_limit < GC_MALLOC_LIMIT) malloc_limit = GC_MALLOC_LIMIT;
-    }
     malloc_increase = 0;
     if (freed < free_min) {
 	add_heap();
@@ -1291,7 +1385,7 @@ void
 rb_gc_mark_frame(frame)
     struct FRAME *frame;
 {
-    gc_mark((VALUE)frame->node, 0);
+    gc_mark((VALUE)frame->node);
 }
 
 #ifdef __GNUC__
@@ -1332,12 +1426,13 @@ int rb_setjmp (rb_jmp_buf);
 #endif /* __human68k__ or DJGPP */
 #endif /* __GNUC__ */
 
+
+
 static void
-garbage_collect()
+garbage_collect_0(VALUE *top_frame)
 {
     struct gc_list *list;
-    struct FRAME * volatile frame; /* gcc 2.7.2.3 -O2 bug??  */
-    jmp_buf save_regs_gc_mark;
+    struct FRAME * frame;
     SET_STACK_END;
 
 #ifdef HAVE_NATIVETHREAD
@@ -1354,9 +1449,10 @@ garbage_collect()
     if (during_gc) return;
     during_gc++;
 
+    gc_stack_limit = __stack_grow(STACK_END, GC_LEVEL_MAX);
     init_mark_stack();
 
-    gc_mark((VALUE)ruby_current_node, 0);
+    gc_mark((VALUE)ruby_current_node);
 
     /* mark frame stack */
     for (frame = ruby_frame; frame; frame = frame->prev) {
@@ -1369,25 +1465,21 @@ garbage_collect()
 	    }
 	}
     }
-    gc_mark((VALUE)ruby_scope, 0);
-    gc_mark((VALUE)ruby_dyna_vars, 0);
+    gc_mark((VALUE)ruby_scope);
+    gc_mark((VALUE)ruby_dyna_vars);
     if (finalizer_table) {
-	mark_tbl(finalizer_table, 0);
+	mark_tbl(finalizer_table);
     }
 
-    FLUSH_REGISTER_WINDOWS;
-    /* This assumes that all registers are saved into the jmp_buf (and stack) */
-    setjmp(save_regs_gc_mark);
-    mark_locations_array((VALUE*)save_regs_gc_mark, sizeof(save_regs_gc_mark) / sizeof(VALUE *));
 #if STACK_GROW_DIRECTION < 0
-    rb_gc_mark_locations((VALUE*)STACK_END, rb_gc_stack_start);
+    rb_gc_mark_locations(top_frame, rb_curr_thread->stk_start);
 #elif STACK_GROW_DIRECTION > 0
-    rb_gc_mark_locations(rb_gc_stack_start, (VALUE*)STACK_END + 1);
+    rb_gc_mark_locations(rb_curr_thread->stk_start, top_frame + 1);
 #else
-    if ((VALUE*)STACK_END < rb_gc_stack_start)
-	rb_gc_mark_locations((VALUE*)STACK_END, rb_gc_stack_start);
+    if (rb_gc_stack_grow_direction < 0)
+	rb_gc_mark_locations(top_frame, rb_curr_thread->stk_start);
     else
-	rb_gc_mark_locations(rb_gc_stack_start, (VALUE*)STACK_END + 1);
+	rb_gc_mark_locations(rb_curr_thread->stk_start, top_frame + 1);
 #endif
 #ifdef __ia64
     /* mark backing store (flushed register window on the stack) */
@@ -1396,7 +1488,7 @@ garbage_collect()
 #endif
 #if defined(__human68k__) || defined(__mc68000__)
     rb_gc_mark_locations((VALUE*)((char*)STACK_END + 2),
-			 (VALUE*)((char*)rb_gc_stack_start + 2));
+			 (VALUE*)((char*)rb_curr_thread->stk_start + 2));
 #endif
     rb_gc_mark_threads();
 
@@ -1427,10 +1519,39 @@ garbage_collect()
 	}
 	rb_gc_abort_threads();
     } while (!MARK_STACK_EMPTY);
-
     gc_sweep();
 }
 
+static void
+garbage_collect()
+{
+  jmp_buf save_regs_gc_mark;
+  VALUE *top = __sp();
+  FLUSH_REGISTER_WINDOWS;
+  /* This assumes that all registers are saved into the jmp_buf (and stack) */
+  setjmp(save_regs_gc_mark);
+
+#if STACK_WIPE_SITES & 0x400
+# ifdef nativeAllocA
+  if (__stack_past (top, stack_limit)) {
+  /* allocate a large frame to ensure app stack cannot grow into GC stack */
+    (volatile void*) nativeAllocA(__stack_depth((void*)stack_limit,(void*)top));
+  }  
+  garbage_collect_0(top);
+# else /* no native alloca() available */
+  garbage_collect_0(top);
+  {
+    VALUE *paddedLimit = __stack_grow(gc_stack_limit, GC_STACK_PAD);
+    if (__stack_past(rb_gc_stack_end, paddedLimit))
+      rb_gc_stack_end = paddedLimit;
+  }
+  rb_gc_wipe_stack();  /* wipe the whole stack area reserved for this gc */  
+# endif
+#else
+  garbage_collect_0(top);
+#endif
+}
+
 void
 rb_gc()
 {
@@ -1455,6 +1576,7 @@ rb_gc_start()
     return Qnil;
 }
 
+
 void
 ruby_set_stack_size(size)
     size_t size;
@@ -1462,6 +1584,29 @@ ruby_set_stack_size(size)
 #ifndef STACK_LEVEL_MAX
     STACK_LEVEL_MAX = size / sizeof(VALUE);
 #endif
+    stack_limit = __stack_grow(rb_gc_stack_start, STACK_LEVEL_MAX-GC_STACK_MAX);
+}
+
+static void
+set_stack_size(void)
+{
+#ifdef HAVE_GETRLIMIT
+  struct rlimit rlim;
+  if (getrlimit(RLIMIT_STACK, &rlim) == 0) {
+    if (rlim.rlim_cur > 0 && rlim.rlim_cur != RLIM_INFINITY) {
+      size_t maxStackBytes = rlim.rlim_cur;
+      if (rlim.rlim_cur != maxStackBytes)
+        maxStackBytes = -1;
+      {
+        size_t space = maxStackBytes/5;
+        if (space > 1024*1024) space = 1024*1024;
+        ruby_set_stack_size(maxStackBytes - space);
+        return;
+      }
+    }
+  }
+#endif
+  ruby_set_stack_size(STACK_LEVEL_MAX*sizeof(VALUE));
 }
 
 void
@@ -1495,7 +1640,7 @@ Init_stack(addr)
     memset(&m, 0, sizeof(m));
     VirtualQuery(&m, &m, sizeof(m));
     rb_gc_stack_start =
-	STACK_UPPER((VALUE *)&m, (VALUE *)m.BaseAddress,
+	STACK_UPPER((VALUE *)m.BaseAddress,
 		    (VALUE *)((char *)m.BaseAddress + m.RegionSize) - 1);
 #elif defined(STACK_END_ADDRESS)
     {
@@ -1504,28 +1649,16 @@ Init_stack(addr)
     }
 #else
     if (!addr) addr = (void *)&addr;
-    STACK_UPPER(&addr, addr, ++addr);
+    STACK_UPPER(addr, ++addr);
     if (rb_gc_stack_start) {
-	if (STACK_UPPER(&addr,
-			rb_gc_stack_start > addr,
+	if (STACK_UPPER(rb_gc_stack_start > addr,
 			rb_gc_stack_start < addr))
 	    rb_gc_stack_start = addr;
 	return;
     }
     rb_gc_stack_start = addr;
 #endif
-#ifdef HAVE_GETRLIMIT
-    {
-	struct rlimit rlim;
-
-	if (getrlimit(RLIMIT_STACK, &rlim) == 0) {
-	    unsigned int space = rlim.rlim_cur/5;
-
-	    if (space > 1024*1024) space = 1024*1024;
-	    STACK_LEVEL_MAX = (rlim.rlim_cur - space) / sizeof(VALUE);
-	}
-    }
-#endif
+    set_stack_size();
 }
 
 void ruby_init_stack(VALUE *addr
@@ -1535,8 +1668,7 @@ void ruby_init_stack(VALUE *addr
     )
 {
     if (!rb_gc_stack_start ||
-        STACK_UPPER(&addr,
-                    rb_gc_stack_start > addr,
+        STACK_UPPER(rb_gc_stack_start > addr,
                     rb_gc_stack_start < addr)) {
         rb_gc_stack_start = addr;
     }
@@ -1547,16 +1679,7 @@ void ruby_init_stack(VALUE *addr
     }
 #endif
 #ifdef HAVE_GETRLIMIT
-    {
-        struct rlimit rlim;
-
-        if (getrlimit(RLIMIT_STACK, &rlim) == 0) {
-            unsigned int space = rlim.rlim_cur/5;
-
-            if (space > 1024*1024) space = 1024*1024;
-            STACK_LEVEL_MAX = (rlim.rlim_cur - space) / sizeof(VALUE);
-        }
-    }
+    set_stack_size();
 #elif defined _WIN32
     {
 	MEMORY_BASIC_INFORMATION mi;
@@ -1567,7 +1690,7 @@ void ruby_init_stack(VALUE *addr
 	    size = (char *)mi.BaseAddress - (char *)mi.AllocationBase;
 	    space = size / 5;
 	    if (space > 1024*1024) space = 1024*1024;
-	    STACK_LEVEL_MAX = (size - space) / sizeof(VALUE);
+	    ruby_set_stack_size(size - space);
 	}
     }
 #endif
@@ -2042,10 +2165,22 @@ Init_GC()
 {
     VALUE rb_mObSpace;
 
+#if !STACK_GROW_DIRECTION
+    rb_gc_stack_end = stack_grow_direction(&rb_mObSpace);
+#endif
     rb_mGC = rb_define_module("GC");
     rb_define_singleton_method(rb_mGC, "start", rb_gc_start, 0);
     rb_define_singleton_method(rb_mGC, "enable", rb_gc_enable, 0);
     rb_define_singleton_method(rb_mGC, "disable", rb_gc_disable, 0);
+#ifdef MBARI_API
+    rb_define_singleton_method(rb_mGC, "limit", gc_getlimit, 0);
+    rb_define_singleton_method(rb_mGC, "limit=", gc_setlimit, 1);
+    rb_define_singleton_method(rb_mGC, "growth", gc_growth, 0);
+    rb_define_singleton_method(rb_mGC, "exorcise", gc_exorcise, 0);
+#else
+    rb_define_singleton_method(rb_mGC, "stress", gc_stress_get, 0);
+    rb_define_singleton_method(rb_mGC, "stress=", gc_stress_set, 1);
+#endif
     rb_define_method(rb_mGC, "garbage_collect", rb_gc_start, 0);
 
     rb_mObSpace = rb_define_module("ObjectSpace");
diff --git a/intern.h b/intern.h
index b251a83..70a7656 100644
--- a/intern.h
+++ b/intern.h
@@ -238,7 +238,7 @@ VALUE rb_file_directory_p _((VALUE,VALUE));
 /* gc.c */
 NORETURN(void rb_memerror __((void)));
 int ruby_stack_check _((void));
-int ruby_stack_length _((VALUE**));
+size_t ruby_stack_length _((VALUE *,VALUE**));
 int rb_during_gc _((void));
 char *rb_source_filename _((const char*));
 void rb_gc_mark_locations _((VALUE*, VALUE*));
diff --git a/missing/alloca.c b/missing/alloca.c
index 39697f1..3facdfe 100644
--- a/missing/alloca.c
+++ b/missing/alloca.c
@@ -29,6 +29,7 @@
 static char	SCCSid[] = "@(#)alloca.c	1.1";	/* for the "what" utility */
 #endif
 
+#include <sys/types.h>
 #include "config.h"
 #ifdef emacs
 #ifdef static
@@ -44,11 +45,7 @@ lose
 #endif /* static */
 #endif /* emacs */
 
-#ifdef X3J11
 typedef void	*pointer;		/* generic pointer type */
-#else
-typedef char	*pointer;		/* generic pointer type */
-#endif /* X3J11 */
 
 #define	NULL	0			/* null pointer constant */
 
@@ -140,8 +137,7 @@ typedef union hdr
 static header *last_alloca_header = NULL; /* -> last alloca header */
 
 pointer
-alloca (size)			/* returns pointer to storage */
-     unsigned	size;		/* # bytes to allocate */
+alloca (size_t size)		/* returns pointer to storage */
 {
   auto char	probe;		/* probes stack depth: */
   register char	*depth = &probe;
diff --git a/node.h b/node.h
index 7d3f756..4a1db92 100644
--- a/node.h
+++ b/node.h
@@ -409,15 +409,11 @@ struct rb_thread {
 
     VALUE result;
 
-    long   stk_len;
-    long   stk_max;
-    VALUE *stk_ptr;
-    VALUE *stk_pos;
+    size_t stk_len, stk_max;
+    VALUE *stk_ptr, *stk_pos, *stk_start;
 #ifdef __ia64
-    long   bstr_len;
-    long   bstr_max;
-    VALUE *bstr_ptr;
-    VALUE *bstr_pos;
+    size_t   bstr_len, bstr_max;
+    VALUE *bstr_ptr, *bstr_pos;
 #endif
 
     struct FRAME *frame;
diff --git a/re.c b/re.c
index 5553d28..129b621 100644
--- a/re.c
+++ b/re.c
@@ -1419,7 +1419,7 @@ VALUE
 rb_reg_regcomp(str)
     VALUE str;
 {
-    volatile VALUE save_str = str;
+    VALUE save_str = str;
     if (reg_cache && RREGEXP(reg_cache)->len == RSTRING(str)->len
 	&& case_cache == ruby_ignorecase
 	&& kcode_cache == reg_kcode
@@ -1428,8 +1428,9 @@ rb_reg_regcomp(str)
 
     case_cache = ruby_ignorecase;
     kcode_cache = reg_kcode;
-    return reg_cache = rb_reg_new(RSTRING(str)->ptr, RSTRING(str)->len,
-				  ruby_ignorecase);
+    reg_cache = rb_reg_new(RSTRING(str)->ptr, RSTRING(str)->len, ruby_ignorecase);
+    RB_GC_GUARD(save_str);
+    return reg_cache;
 }
 
 static int
diff --git a/ruby.h b/ruby.h
index 2701f0d..3cf4e19 100644
--- a/ruby.h
+++ b/ruby.h
@@ -224,6 +224,8 @@ VALUE rb_ull2inum _((unsigned LONG_LONG));
 
 #define TYPE(x) rb_type((VALUE)(x))
 
+#define RB_GC_GUARD(v) (*(volatile VALUE *)&(v))
+
 void rb_check_type _((VALUE,int));
 #define Check_Type(v,t) rb_check_type((VALUE)(v),t)
 
diff --git a/rubysig.h b/rubysig.h
index f716824..fae0869 100644
--- a/rubysig.h
+++ b/rubysig.h
@@ -12,8 +12,80 @@
 
 #ifndef SIG_H
 #define SIG_H
+
 #include <errno.h>
 
+#if defined __ppc__ || defined __powerpc__ || \
+    defined __ppc64__ || defined __powerpc64__
+#define __anyPowerPC__ 1  /* for compatibility with older gcc versions */
+#endif
+
+/* STACK_WIPE_SITES determines where attempts are made to exorcise
+   "ghost object refereces" from the stack and how the stack is cleared:
+   
+   0x*001 -->  wipe stack just after every thread_switch
+   0x*002 -->  wipe stack just after every EXEC_TAG()
+   0x*004 -->  wipe stack in CHECK_INTS
+   0x*010 -->  wipe stack in while & until loops
+   0x*020 -->  wipe stack before yield() in iterators and outside eval.c
+   0x*040 -->  wipe stack on catch and thread save context
+   0x*100 -->  update stack extent on each object allocation
+   0x*200 -->  update stack extent on each object reallocation
+   0x*400 -->  update stack extent during GC marking passes
+   0x*800 -->  update stack extent on each throw (use with 0x040)
+   0x1000 -->  use inline assembly code for x86, PowerPC, or ARM CPUs
+
+   0x0*** -->  do not even call rb_wipe_stack()
+   0x2*** -->  call dummy rb_wipe_stack() (for debugging and profiling)
+   0x4*** -->  safe, portable stack clearing in memory allocated with alloca
+   0x6*** -->  use faster, but less safe stack clearing in unallocated stack
+   0x8*** -->  use faster, but less safe stack clearing (with inline code)
+   
+   for most effective gc use 0x*707
+   for fastest micro-benchmarking use 0x0000
+   0x*770 prevents almost all memory leaks caused by ghost references
+   without adding much overhead for stack clearing.
+   Other good trade offs are 0x*270, 0x*703, 0x*303 or even 0x*03
+   
+   In general, you may lessen the default -mpreferred-stack-boundary
+   only if using less safe stack clearing (0x6***).  Lessening the
+   stack alignment with portable stack clearing (0x4***) may fail to clear 
+   all ghost references off the stack.
+   
+   When using 0x6*** or 0x8***, the compiler could insert 
+   stack push(s) between reading the stack pointer and clearing 
+   the ghost references.  The register(s) pushed will be
+   cleared by the rb_gc_stack_wipe(), typically resulting in a segfault
+   or an interpreter hang.
+   
+   STACK_WIPE_SITES of 0x8770 works well compiled with gcc on most machines
+   using the recommended CFLAGS="-O2 -fno-stack-protector".  However...
+   If it hangs or crashes for you, try changing STACK_WIPE_SITES to 0x4770
+   and please report your details.  i.e. CFLAGS, compiler, version, CPU
+   
+   Note that it is redundant to wipe_stack in looping constructs if 
+   also doing so in CHECK_INTS.  It is also redundant to wipe_stack on
+   each thread_switch if wiping after every thread save context.
+*/
+#ifndef STACK_WIPE_SITES
+# ifdef __x86_64__     /* deal with "red zone" by not inlining stack clearing */
+#  define STACK_WIPE_SITES  0x6770
+# elif defined __anyPowerPC__   /* On any PowerPC, deal with... */
+#  define STACK_WIPE_SITES  0x7764   /* red zone & alloc(0) doesn't return sp */
+# else
+#  define STACK_WIPE_SITES  0x8770 /*normal case, use 0x4770 if problems arise*/
+# endif
+#endif
+
+#if (STACK_WIPE_SITES & 0x14) == 0x14
+#warning  wiping stack in CHECK_INTS makes wiping in loops redundant
+#endif
+#if (STACK_WIPE_SITES & 0x41) == 0x41
+#warning  wiping stack after thread save makes wiping on thread_switch redundant
+#endif
+
+#define STACK_WIPE_METHOD (STACK_WIPE_SITES>>13)
+
 #ifdef _WIN32
 typedef LONG rb_atomic_t;
 
@@ -79,9 +151,152 @@ void rb_trap_restore_mask _((void));
 
 RUBY_EXTERN int rb_thread_critical;
 void rb_thread_schedule _((void));
+
+RUBY_EXTERN VALUE *rb_gc_stack_end;
+RUBY_EXTERN int rb_gc_stack_grow_direction;  /* -1 for down or 1 for up */
+
+#if STACK_GROW_DIRECTION > 0
+
+/* clear stack space between end and sp (not including *sp) */
+#define __stack_zero(end,sp)  __stack_zero_up(end,sp)
+
+/* true if top has grown past limit, i.e. top deeper than limit */
+#define __stack_past(limit,top)  __stack_past_up(limit,top)
+
+/* depth of mid below stack top */
+#define __stack_depth(top,mid)   __stack_depth_up(top,mid)
+
+/* stack pointer top adjusted to include depth more items */
+#define __stack_grow(top,depth)  __stack_grow_up(top,depth)
+
+
+#elif STACK_GROW_DIRECTION < 0
+#define __stack_zero(end,sp)  __stack_zero_down(end,sp)
+#define __stack_past(limit,top)  __stack_past_down(limit,top)
+#define __stack_depth(top,mid)   __stack_depth_down(top,mid)
+#define __stack_grow(top,depth)  __stack_grow_down(top,depth)
+
+#else  /* limp along if stack direction can't be determined at compile time */
+#define __stack_zero(end,sp) if (rb_gc_stack_grow_direction<0) \
+        __stack_zero_down(end,sp); else __stack_zero_up(end,sp);
+#define __stack_past(limit,top)  (rb_gc_stack_grow_direction<0 ? \
+                      __stack_past_down(limit,top) : __stack_past_up(limit,top))
+#define __stack_depth(top,mid) (rb_gc_stack_grow_direction<0 ? \
+                       __stack_depth_down(top,mid) : __stack_depth_up(top,mid))
+#define __stack_grow(top,depth) (rb_gc_stack_grow_direction<0 ? \
+                      __stack_grow_down(top,depth) : __stack_grow_up(top,depth))
+#endif
+ 
+#define __stack_zero_up(end,sp)  while (end >= ++sp) *sp=0
+#define __stack_past_up(limit,top)  ((limit) < (top))
+#define __stack_depth_up(top,mid) ((top) - (mid))
+#define __stack_grow_up(top,depth) ((top)+(depth))
+
+#define __stack_zero_down(end,sp)  while (end <= --sp) *sp=0
+#define __stack_past_down(limit,top)  ((limit) > (top))
+#define __stack_depth_down(top,mid) ((mid) - (top))
+#define __stack_grow_down(top,depth) ((top)-(depth))
+
+/* Make alloca work the best possible way.  */
+#ifdef __GNUC__
+# ifndef atarist
+#  ifndef alloca
+#   define alloca __builtin_alloca
+#  endif
+# endif /* atarist */
+
+# define nativeAllocA __builtin_alloca
+
+/* use assembly to get stack pointer quickly */
+# if STACK_WIPE_SITES & 0x1000
+#  define __defspfn(asmb)  \
+static inline VALUE *__sp(void) __attribute__((always_inline)); \
+static inline VALUE *__sp(void) \
+{ \
+  VALUE *sp; asm(asmb); \
+  return sp; \
+}
+#  ifdef __anyPowerPC__
+__defspfn("addi %0, r1, 0": "=r"(sp))
+#  elif defined  __i386__
+__defspfn("movl %%esp, %0": "=r"(sp))
+#  elif defined __x86_64__
+#warn ===> x86_64 inline assembler is known to crash -- change STACK_WIPE_SITES
+__defspfn("movq %%rsp, %0": "=r"(sp))
+#  elif __arm__
+__defspfn("mov %0, sp": "=r"(sp))
+#  else
+#   define __sp()  ((VALUE *)__builtin_alloca(0))
+#   warning No assembly version of __sp() defined for this CPU.
+#  endif
+# else
+#  define __sp()  ((VALUE *)__builtin_alloca(0))
+# endif
+
+#else  // not GNUC
+
+# ifdef HAVE_ALLOCA_H
+#  include <alloca.h>
+# else
+#  ifndef _AIX
+#   ifndef alloca /* predefined by HP cc +Olibcalls */
+void *alloca ();
+#   endif
+#  endif /* AIX */
+# endif /* HAVE_ALLOCA_H */
+
+# if STACK_WIPE_SITES & 0x1000
+#  warning No assembly versions of __sp() defined for this compiler.
+# endif
+# if HAVE_ALLOCA
+#  define __sp()  ((VALUE *)alloca(0))
+#  define nativeAllocA alloca
+# else
+RUBY_EXTERN VALUE *__sp(void);
+#  if STACK_WIPE_SITES
+#   define STACK_WIPE_SITES 0
+#   warning Disabled Stack Wiping because there is no native alloca()
+#  endif
+# endif
+#endif /* __GNUC__ */
+
+
+/*
+  Zero memory that was (recently) part of the stack, but is no longer.
+  Invoke when stack is deep to mark its extent and when it's shallow to wipe it.
+*/
+#if STACK_WIPE_METHOD == 0
+#define rb_gc_wipe_stack() ((void)0)
+#elif STACK_WIPE_METHOD == 4
+#define rb_gc_wipe_stack() {     \
+  VALUE *end = rb_gc_stack_end;  \
+  VALUE *sp = __sp();            \
+  rb_gc_stack_end = sp;          \
+  __stack_zero(end, sp);   \
+}
+#else
+RUBY_EXTERN void rb_gc_wipe_stack(void);
+#endif
+
+/*
+  Update our record of maximum stack extent without zeroing unused stack
+*/
+#define rb_gc_update_stack_extent() do { \
+    VALUE *sp = __sp(); \
+    if __stack_past(rb_gc_stack_end, sp) rb_gc_stack_end = sp; \
+} while(0)
+
+
+#if STACK_WIPE_SITES & 4
+# define CHECK_INTS_wipe_stack()  rb_gc_wipe_stack()
+#else
+# define CHECK_INTS_wipe_stack()  (void)0
+#endif
+
 #if defined(HAVE_SETITIMER) || defined(_THREAD_SAFE)
 RUBY_EXTERN int rb_thread_pending;
 # define CHECK_INTS do {\
+    CHECK_INTS_wipe_stack(); \
     if (!(rb_prohibit_interrupt || rb_thread_critical)) {\
         if (rb_thread_pending) rb_thread_schedule();\
 	if (rb_trap_pending) rb_trap_exec();\
@@ -92,13 +307,14 @@ RUBY_EXTERN int rb_thread_pending;
 RUBY_EXTERN int rb_thread_tick;
 #define THREAD_TICK 500
 #define CHECK_INTS do {\
+    CHECK_INTS_wipe_stack(); \
     if (!(rb_prohibit_interrupt || rb_thread_critical)) {\
 	if (rb_thread_tick-- <= 0) {\
 	    rb_thread_tick = THREAD_TICK;\
             rb_thread_schedule();\
 	}\
+        if (rb_trap_pending) rb_trap_exec();\
     }\
-    if (rb_trap_pending) rb_trap_exec();\
 } while (0)
 #endif
 
diff --git a/signal.c b/signal.c
index b6cad9d..bc9deae 100644
--- a/signal.c
+++ b/signal.c
@@ -389,6 +389,7 @@ rb_f_kill(argc, argv)
 		rb_sys_fail(0);
 	}
     }
+    CHECK_INTS;  /* in case we killed ourselves */
     return INT2FIX(i-1);
 }
 
diff --git a/test/ruby/suicide.rb b/test/ruby/suicide.rb
index 2687ed0..c7a0a67 100644
--- a/test/ruby/suicide.rb
+++ b/test/ruby/suicide.rb
@@ -1,2 +1,4 @@
 STDERR.reopen(STDOUT)
-at_exit{Process.kill(:INT, $$)}
+at_exit{Process.kill(:INT, $$); sleep 0}
+# brent@mbari.org says
+#  sleep 0 avoids race between process termination and signal reception
diff --git a/version.c b/version.c
index b235673..dbc65b0 100644
--- a/version.c
+++ b/version.c
@@ -14,23 +14,44 @@
 #include "version.h"
 #include <stdio.h>
 
+#define PRINT(type) puts(ruby_##type)
+#define MKSTR(type) rb_obj_freeze(rb_str_new(ruby_##type, sizeof(ruby_##type)-1))
+
 const char ruby_version[] = RUBY_VERSION;
 const char ruby_release_date[] = RUBY_RELEASE_DATE;
 const char ruby_platform[] = RUBY_PLATFORM;
 const int ruby_patchlevel = RUBY_PATCHLEVEL;
+const char *ruby_description;
+const char *ruby_copyright;
 
 void
 Init_version()
 {
-    VALUE v = rb_obj_freeze(rb_str_new2(ruby_version));
-    VALUE d = rb_obj_freeze(rb_str_new2(ruby_release_date));
-    VALUE p = rb_obj_freeze(rb_str_new2(ruby_platform));
+    static char description[128];
+    static char copyright[128];
+    VALUE v = MKSTR(version);
+    VALUE d = MKSTR(release_date);
+    VALUE p = MKSTR(platform);
+    VALUE tmp;
 
     rb_define_global_const("RUBY_VERSION", v);
     rb_define_global_const("RUBY_RELEASE_DATE", d);
     rb_define_global_const("RUBY_PLATFORM", p);
     rb_define_global_const("RUBY_PATCHLEVEL", INT2FIX(RUBY_PATCHLEVEL));
 
+    snprintf(description, sizeof(description), "ruby %s (%s %s %d) [%s]",
+             RUBY_VERSION, RUBY_RELEASE_DATE, RUBY_RELEASE_STR,
+             RUBY_RELEASE_NUM, RUBY_PLATFORM);
+    ruby_description = description;
+    tmp = rb_obj_freeze(rb_str_new2(description));
+    rb_define_global_const("RUBY_DESCRIPTION", tmp);
+
+    snprintf(copyright, sizeof(copyright), "ruby - Copyright (C) %d-%d %s",
+             RUBY_BIRTH_YEAR, RUBY_RELEASE_YEAR, RUBY_AUTHOR);
+    ruby_copyright = copyright;
+    tmp = rb_obj_freeze(rb_str_new2(copyright));
+    rb_define_global_const("RUBY_COPYRIGHT", tmp);
+
     /* obsolete constants */
     rb_define_global_const("VERSION", v);
     rb_define_global_const("RELEASE_DATE", d);
@@ -40,13 +61,13 @@ Init_version()
 void
 ruby_show_version()
 {
-    printf("ruby %s (%s patchlevel %d) [%s]\n", RUBY_VERSION, RUBY_RELEASE_DATE, RUBY_PATCHLEVEL, RUBY_PLATFORM);
+    PRINT(description);
     fflush(stdout);
 }
 
 void
 ruby_show_copyright()
 {
-    printf("ruby - Copyright (C) 1993-%d Yukihiro Matsumoto\n", RUBY_RELEASE_YEAR);
+    PRINT(copyright);
     exit(0);
 }
diff --git a/version.h b/version.h
index 88ddd67..fa36fa5 100644
--- a/version.h
+++ b/version.h
@@ -1,21 +1,43 @@
 #define RUBY_VERSION "1.8.6"
-#define RUBY_RELEASE_DATE "2008-08-11"
+#define RUBY_RELEASE_DATE "2009-3-1"
 #define RUBY_VERSION_CODE 186
-#define RUBY_RELEASE_CODE 20080811
+#define RUBY_RELEASE_CODE 20090301
 #define RUBY_PATCHLEVEL 287
 
 #define RUBY_VERSION_MAJOR 1
 #define RUBY_VERSION_MINOR 8
 #define RUBY_VERSION_TEENY 6
-#define RUBY_RELEASE_YEAR 2008
-#define RUBY_RELEASE_MONTH 8
-#define RUBY_RELEASE_DAY 11
+#define RUBY_RELEASE_YEAR 2009
+#define RUBY_RELEASE_MONTH 3
+#define RUBY_RELEASE_DAY 1
 
 #ifdef RUBY_EXTERN
 RUBY_EXTERN const char ruby_version[];
 RUBY_EXTERN const char ruby_release_date[];
 RUBY_EXTERN const char ruby_platform[];
 RUBY_EXTERN const int ruby_patchlevel;
+RUBY_EXTERN const char *ruby_description;
+RUBY_EXTERN const char *ruby_copyright;
 #endif
 
+#define RUBY_AUTHOR "Yukihiro Matsumoto"
+#define RUBY_BIRTH_YEAR 1993
+#define RUBY_BIRTH_MONTH 2
+#define RUBY_BIRTH_DAY 24
+
+#include "rubysig.h"
+
+#define string_arg(s) #s
+
+#ifdef MBARI_API
+#define _mbari_rev_ "MBARI"
+#else
+#define _mbari_rev_ "mbari"
+#endif
+
+#define MBARI_RELEASE(wipe_sites) _mbari_rev_ " 8B/" string_arg(wipe_sites)
+
+#define RUBY_RELEASE_STR MBARI_RELEASE(STACK_WIPE_SITES) " on patchlevel"
+#define RUBY_RELEASE_NUM RUBY_PATCHLEVEL
+
 
--- ruby-1.8.6-p287/configure	2008-08-10 17:38:35.000000000 -0700
+++ ruby-1.8.6-mbari/configure	2009-02-26 22:43:03.000000000 -0800
@@ -1352,6 +1352,7 @@
                           is disabled or omitted entirely, then the package
                           will be built only for the target platform
   --enable-frame-address  use GCC __builtin_frame_address().
+  --enable-mbari-api      enable API changes from the MBARI patches.
   --disable-largefile     omit support for large files
   --enable-pthread        use pthread library.
   --disable-fastthread    do not use the fastthread mutex
@@ -1364,6 +1365,7 @@
   --with-PACKAGE[=ARG]    use PACKAGE [ARG=yes]
   --without-PACKAGE       do not use PACKAGE (same as --with-PACKAGE=no)
   --without-gcc           never use gcc
+  --with-wipe-sites=MASK  override default STACK_WIPES_SITES mask in rubysig.h
   --with-winsock2         link winsock2 (MinGW only)
   --with-libc_r           link libc_r if possible (FreeBSD only)
   --with-default-kcode=CODE specify default value for \$KCODE (utf8|euc|sjis|none)
@@ -2080,6 +2082,35 @@
 _ACEOF
 
 fi
+# Check whether --enable-mbari-api was given.
+if test "${enable_mbari_api+set}" = set; then
+  enableval=$enable_mbari_api; mbari_api=$enableval
+fi
+
+if test "$mbari_api" = yes; then
+    cat >>confdefs.h <<\_ACEOF
+#define MBARI_API 1
+_ACEOF
+
+fi
+
+# Check whether --with-wipe-sites was given.
+if test "${with_wipe_sites+set}" = set; then
+  withval=$with_wipe_sites; wipe_sites=$withval
+fi
+
+if test "$wipe_sites" != ""; then
+  case $wipe_sites in
+       none|no)  wipe_sites=0x0;;
+       yes) wipe_sites=;;
+  esac
+  if test -n "$wipe_sites"; then
+    cat >>confdefs.h <<_ACEOF
+#define STACK_WIPE_SITES $wipe_sites
+_ACEOF
+
+  fi
+fi
 
 test "$program_prefix" != NONE &&
   program_transform_name="s&^&$program_prefix&;$program_transform_name"
patches/ruby/1.8.6/fix-irb-completion.diff000066400000000673147511530510014201 0ustar00diff --git a/lib/irb/completion.rb b/lib/irb/completion.rb
index 000658e..609dca3 100644
--- a/lib/irb/completion.rb
+++ b/lib/irb/completion.rb
@@ -157,7 +157,7 @@ module IRB
 	    end
 	    next if name != "IRB::Context" and 
 	      /^(IRB|SLex|RubyLex|RubyToken)/ =~ name
-	    candidates.concat m.instance_methods(false)
+	    candidates.concat m.instance_methods(false).map { |m| m.to_s }
 	  }
 	  candidates.sort!
 	  candidates.uniq!
patches/ruby/2.0.0/libyaml_p0-p353.patch000066400000055156147511530510013372 0ustar00diff -uw ruby-2.0.0-p0/ext/psych/yaml/api.c ruby-2.1.2/ext/psych/yaml/api.c
--- ruby-2.0.0-p0/ext/psych/yaml/api.c	2012-11-28 05:35:40.000000000 +0100
+++ ruby-2.1.2/ext/psych/yaml/api.c	2014-02-24 05:24:15.000000000 +0100
@@ -395,7 +395,7 @@
     }
     QUEUE_DEL(emitter, emitter->events);
     STACK_DEL(emitter, emitter->indents);
-    while (!STACK_EMPTY(empty, emitter->tag_directives)) {
+    while (!STACK_EMPTY(emitter, emitter->tag_directives)) {
         yaml_tag_directive_t tag_directive = POP(emitter, emitter->tag_directives);
         yaml_free(tag_directive.handle);
         yaml_free(tag_directive.prefix);
@@ -822,6 +822,7 @@
     yaml_char_t *anchor_copy = NULL;
     yaml_char_t *tag_copy = NULL;
     yaml_char_t *value_copy = NULL;
+    size_t value_length;
 
     assert(event);      /* Non-NULL event object is expected. */
     assert(value);      /* Non-NULL anchor is expected. */
@@ -839,16 +840,19 @@
     }
 
     if (length < 0) {
-        length = strlen((char *)value);
+        value_length = strlen((char *)value);
+    }
+    else {
+        value_length = (size_t)length;
     }
 
-    if (!yaml_check_utf8(value, length)) goto error;
-    value_copy = yaml_malloc(length+1);
+    if (!yaml_check_utf8(value, value_length)) goto error;
+    value_copy = yaml_malloc(value_length+1);
     if (!value_copy) goto error;
-    memcpy(value_copy, value, length);
-    value_copy[length] = '\0';
+    memcpy(value_copy, value, value_length);
+    value_copy[value_length] = '\0';
 
-    SCALAR_EVENT_INIT(*event, anchor_copy, tag_copy, value_copy, length,
+    SCALAR_EVENT_INIT(*event, anchor_copy, tag_copy, value_copy, value_length,
             plain_implicit, quoted_implicit, style, mark, mark);
 
     return 1;
@@ -1202,6 +1206,8 @@
     yaml_char_t *tag_copy = NULL;
     yaml_char_t *value_copy = NULL;
     yaml_node_t node;
+    size_t value_length;
+    ptrdiff_t ret;
 
     assert(document);   /* Non-NULL document object is expected. */
     assert(value);      /* Non-NULL value is expected. */
@@ -1215,19 +1221,26 @@
     if (!tag_copy) goto error;
 
     if (length < 0) {
-        length = strlen((char *)value);
+        value_length = strlen((char *)value);
+    }
+    else {
+        value_length = (size_t)length;
     }
 
-    if (!yaml_check_utf8(value, length)) goto error;
-    value_copy = yaml_malloc(length+1);
+    if (!yaml_check_utf8(value, value_length)) goto error;
+    value_copy = yaml_malloc(value_length+1);
     if (!value_copy) goto error;
-    memcpy(value_copy, value, length);
-    value_copy[length] = '\0';
+    memcpy(value_copy, value, value_length);
+    value_copy[value_length] = '\0';
 
-    SCALAR_NODE_INIT(node, tag_copy, value_copy, length, style, mark, mark);
+    SCALAR_NODE_INIT(node, tag_copy, value_copy, value_length, style, mark, mark);
     if (!PUSH(&context, document->nodes, node)) goto error;
 
-    return document->nodes.top - document->nodes.start;
+    ret = document->nodes.top - document->nodes.start;
+#if PTRDIFF_MAX > INT_MAX
+    if (ret > INT_MAX) goto error;
+#endif
+    return (int)ret;
 
 error:
     yaml_free(tag_copy);
@@ -1255,6 +1268,7 @@
         yaml_node_item_t *top;
     } items = { NULL, NULL, NULL };
     yaml_node_t node;
+    ptrdiff_t ret;
 
     assert(document);   /* Non-NULL document object is expected. */
 
@@ -1272,7 +1286,11 @@
             style, mark, mark);
     if (!PUSH(&context, document->nodes, node)) goto error;
 
-    return document->nodes.top - document->nodes.start;
+    ret = document->nodes.top - document->nodes.start;
+#if PTRDIFF_MAX > INT_MAX
+    if (ret > INT_MAX) goto error;
+#endif
+    return (int)ret;
 
 error:
     STACK_DEL(&context, items);
@@ -1300,6 +1318,7 @@
         yaml_node_pair_t *top;
     } pairs = { NULL, NULL, NULL };
     yaml_node_t node;
+    ptrdiff_t ret;
 
     assert(document);   /* Non-NULL document object is expected. */
 
@@ -1317,7 +1336,11 @@
             style, mark, mark);
     if (!PUSH(&context, document->nodes, node)) goto error;
 
-    return document->nodes.top - document->nodes.start;
+    ret = document->nodes.top - document->nodes.start;
+#if PTRDIFF_MAX > INT_MAX
+    if (ret > INT_MAX) goto error;
+#endif
+    return (int)ret;
 
 error:
     STACK_DEL(&context, pairs);
diff -uw ruby-2.0.0-p0/ext/psych/yaml/config.h ruby-2.1.2/ext/psych/yaml/config.h
--- ruby-2.0.0-p0/ext/psych/yaml/config.h	2012-12-01 04:58:39.000000000 +0100
+++ ruby-2.1.2/ext/psych/yaml/config.h	2014-05-04 17:45:33.000000000 +0200
@@ -1,11 +1,10 @@
-
 #define PACKAGE_NAME "yaml"
 #define PACKAGE_TARNAME "yaml"
-#define PACKAGE_VERSION "0.1.4"
-#define PACKAGE_STRING "yaml 0.1.4"
+#define PACKAGE_VERSION "0.1.6"
+#define PACKAGE_STRING "yaml 0.1.6"
 #define PACKAGE_BUGREPORT "http://pyyaml.org/newticket?component libyaml"
 #define PACKAGE_URL ""
 #define YAML_VERSION_MAJOR 0
 #define YAML_VERSION_MINOR 1
-#define YAML_VERSION_PATCH 4
-#define YAML_VERSION_STRING "0.1.4"
+#define YAML_VERSION_PATCH 6
+#define YAML_VERSION_STRING "0.1.6"
diff -uw ruby-2.0.0-p0/ext/psych/yaml/emitter.c ruby-2.1.2/ext/psych/yaml/emitter.c
--- ruby-2.0.0-p0/ext/psych/yaml/emitter.c	2012-12-05 05:08:17.000000000 +0100
+++ ruby-2.1.2/ext/psych/yaml/emitter.c	2014-02-24 05:24:15.000000000 +0100
@@ -53,7 +53,7 @@
 #define WRITE_BREAK(emitter,string)                                             \
     (FLUSH(emitter)                                                             \
      && (CHECK(string,'\n') ?                                                   \
-         (PUT_BREAK(emitter),                                                   \
+         ((void)PUT_BREAK(emitter),                                             \
           string.pointer ++,                                                    \
           1) :                                                                  \
          (COPY(emitter->buffer,string),                                         \
diff -uw ruby-2.0.0-p0/ext/psych/yaml/loader.c ruby-2.1.2/ext/psych/yaml/loader.c
--- ruby-2.0.0-p0/ext/psych/yaml/loader.c	2012-11-28 05:35:40.000000000 +0100
+++ ruby-2.1.2/ext/psych/yaml/loader.c	2014-02-24 05:24:15.000000000 +0100
@@ -283,9 +283,12 @@
 yaml_parser_load_scalar(yaml_parser_t *parser, yaml_event_t *first_event)
 {
     yaml_node_t node;
+    ptrdiff_t node_index;
     int index;
     yaml_char_t *tag = first_event->data.scalar.tag;
 
+    if (!STACK_LIMIT(parser, parser->document->nodes, INT_MAX-1)) goto error;
+
     if (!tag || strcmp((char *)tag, "!") == 0) {
         yaml_free(tag);
         tag = yaml_strdup((yaml_char_t *)YAML_DEFAULT_SCALAR_TAG);
@@ -298,7 +301,11 @@
 
     if (!PUSH(parser, parser->document->nodes, node)) goto error;
 
-    index = parser->document->nodes.top - parser->document->nodes.start;
+    node_index = parser->document->nodes.top - parser->document->nodes.start;
+#if PTRDIFF_MAX > INT_MAX
+    if (node_index > INT_MAX) goto error;
+#endif
+    index = (int)node_index;
 
     if (!yaml_parser_register_anchor(parser, index,
                 first_event->data.scalar.anchor)) return 0;
@@ -327,8 +334,11 @@
         yaml_node_item_t *top;
     } items = { NULL, NULL, NULL };
     int index, item_index;
+    ptrdiff_t node_index;
     yaml_char_t *tag = first_event->data.sequence_start.tag;
 
+    if (!STACK_LIMIT(parser, parser->document->nodes, INT_MAX-1)) goto error;
+
     if (!tag || strcmp((char *)tag, "!") == 0) {
         yaml_free(tag);
         tag = yaml_strdup((yaml_char_t *)YAML_DEFAULT_SEQUENCE_TAG);
@@ -343,7 +353,11 @@
 
     if (!PUSH(parser, parser->document->nodes, node)) goto error;
 
-    index = parser->document->nodes.top - parser->document->nodes.start;
+    node_index = parser->document->nodes.top - parser->document->nodes.start;
+#if PTRDIFF_MAX > INT_MAX
+    if (node_index > INT_MAX) goto error;
+#endif
+    index = (int)node_index;
 
     if (!yaml_parser_register_anchor(parser, index,
                 first_event->data.sequence_start.anchor)) return 0;
@@ -351,6 +365,9 @@
     if (!yaml_parser_parse(parser, &event)) return 0;
 
     while (event.type != YAML_SEQUENCE_END_EVENT) {
+        if (!STACK_LIMIT(parser,
+                    parser->document->nodes.start[index-1].data.sequence.items,
+                    INT_MAX-1)) return 0;
         item_index = yaml_parser_load_node(parser, &event);
         if (!item_index) return 0;
         if (!PUSH(parser,
@@ -384,9 +401,12 @@
         yaml_node_pair_t *top;
     } pairs = { NULL, NULL, NULL };
     int index;
+    ptrdiff_t node_index;
     yaml_node_pair_t pair;
     yaml_char_t *tag = first_event->data.mapping_start.tag;
 
+    if (!STACK_LIMIT(parser, parser->document->nodes, INT_MAX-1)) goto error;
+
     if (!tag || strcmp((char *)tag, "!") == 0) {
         yaml_free(tag);
         tag = yaml_strdup((yaml_char_t *)YAML_DEFAULT_MAPPING_TAG);
@@ -401,7 +421,11 @@
 
     if (!PUSH(parser, parser->document->nodes, node)) goto error;
 
-    index = parser->document->nodes.top - parser->document->nodes.start;
+    node_index = parser->document->nodes.top - parser->document->nodes.start;
+#if PTRDIFF_MAX > INT_MAX
+    if (node_index > INT_MAX) goto error;
+#endif
+    index = (int)node_index;
 
     if (!yaml_parser_register_anchor(parser, index,
                 first_event->data.mapping_start.anchor)) return 0;
@@ -409,6 +433,9 @@
     if (!yaml_parser_parse(parser, &event)) return 0;
 
     while (event.type != YAML_MAPPING_END_EVENT) {
+        if (!STACK_LIMIT(parser,
+                    parser->document->nodes.start[index-1].data.mapping.pairs,
+                    INT_MAX-1)) return 0;
         pair.key = yaml_parser_load_node(parser, &event);
         if (!pair.key) return 0;
         if (!yaml_parser_parse(parser, &event)) return 0;
diff -uw ruby-2.0.0-p0/ext/psych/yaml/parser.c ruby-2.1.2/ext/psych/yaml/parser.c
--- ruby-2.0.0-p0/ext/psych/yaml/parser.c	2012-12-05 05:08:17.000000000 +0100
+++ ruby-2.1.2/ext/psych/yaml/parser.c	2014-02-24 05:24:15.000000000 +0100
@@ -759,9 +759,8 @@
 
     else if (token->type == YAML_BLOCK_END_TOKEN)
     {
-        yaml_mark_t dummy_mark;     /* Used to eliminate a compiler warning. */
         parser->state = POP(parser, parser->states);
-        dummy_mark = POP(parser, parser->marks);
+        (void)POP(parser, parser->marks);
         SEQUENCE_END_EVENT_INIT(*event, token->start_mark, token->end_mark);
         SKIP_TOKEN(parser);
         return 1;
@@ -869,9 +868,8 @@
 
     else if (token->type == YAML_BLOCK_END_TOKEN)
     {
-        yaml_mark_t dummy_mark;     /* Used to eliminate a compiler warning. */
         parser->state = POP(parser, parser->states);
-        dummy_mark = POP(parser, parser->marks);
+        (void)POP(parser, parser->marks);
         MAPPING_END_EVENT_INIT(*event, token->start_mark, token->end_mark);
         SKIP_TOKEN(parser);
         return 1;
@@ -952,7 +950,6 @@
         yaml_event_t *event, int first)
 {
     yaml_token_t *token;
-    yaml_mark_t dummy_mark;     /* Used to eliminate a compiler warning. */
 
     if (first) {
         token = PEEK_TOKEN(parser);
@@ -997,7 +994,7 @@
     }
 
     parser->state = POP(parser, parser->states);
-    dummy_mark = POP(parser, parser->marks);
+    (void)POP(parser, parser->marks);
     SEQUENCE_END_EVENT_INIT(*event, token->start_mark, token->end_mark);
     SKIP_TOKEN(parser);
     return 1;
@@ -1104,7 +1101,6 @@
         yaml_event_t *event, int first)
 {
     yaml_token_t *token;
-    yaml_mark_t dummy_mark;     /* Used to eliminate a compiler warning. */
 
     if (first) {
         token = PEEK_TOKEN(parser);
@@ -1158,7 +1154,7 @@
     }
 
     parser->state = POP(parser, parser->states);
-    dummy_mark = POP(parser, parser->marks);
+    (void)POP(parser, parser->marks);
     MAPPING_END_EVENT_INIT(*event, token->start_mark, token->end_mark);
     SKIP_TOKEN(parser);
     return 1;
diff -uw ruby-2.0.0-p0/ext/psych/yaml/reader.c ruby-2.1.2/ext/psych/yaml/reader.c
--- ruby-2.0.0-p0/ext/psych/yaml/reader.c	2012-12-05 05:08:17.000000000 +0100
+++ ruby-2.1.2/ext/psych/yaml/reader.c	2014-02-24 05:24:15.000000000 +0100
@@ -460,6 +460,10 @@
 
     }
 
+    if (parser->offset >= PTRDIFF_MAX)
+        return yaml_parser_set_reader_error(parser, "input is too long",
+                PTRDIFF_MAX, -1);
+
     return 1;
 }
 
diff -uw ruby-2.0.0-p0/ext/psych/yaml/scanner.c ruby-2.1.2/ext/psych/yaml/scanner.c
--- ruby-2.0.0-p0/ext/psych/yaml/scanner.c	2013-01-13 08:47:10.000000000 +0100
+++ ruby-2.1.2/ext/psych/yaml/scanner.c	2014-05-04 17:45:33.000000000 +0200
@@ -615,11 +615,11 @@
  */
 
 static int
-yaml_parser_roll_indent(yaml_parser_t *parser, int column,
-        int number, yaml_token_type_t type, yaml_mark_t mark);
+yaml_parser_roll_indent(yaml_parser_t *parser, ptrdiff_t column,
+        ptrdiff_t number, yaml_token_type_t type, yaml_mark_t mark);
 
 static int
-yaml_parser_unroll_indent(yaml_parser_t *parser, int column);
+yaml_parser_unroll_indent(yaml_parser_t *parser, ptrdiff_t column);
 
 /*
  * Token fetchers.
@@ -1103,7 +1103,7 @@
      */
 
     int required = (!parser->flow_level
-            && parser->indent == (int)parser->mark.column);
+            && parser->indent == (ptrdiff_t)parser->mark.column);
 
     /*
      * A simple key is required only when it is the first token in the current
@@ -1176,6 +1176,11 @@
 
     /* Increase the flow level. */
 
+    if (parser->flow_level == INT_MAX) {
+        parser->error = YAML_MEMORY_ERROR;
+        return 0;
+    }
+
     parser->flow_level++;
 
     return 1;
@@ -1188,11 +1193,9 @@
 static int
 yaml_parser_decrease_flow_level(yaml_parser_t *parser)
 {
-    yaml_simple_key_t dummy_key;    /* Used to eliminate a compiler warning. */
-
     if (parser->flow_level) {
         parser->flow_level --;
-        dummy_key = POP(parser, parser->simple_keys);
+        (void)POP(parser, parser->simple_keys);
     }
 
     return 1;
@@ -1206,8 +1209,8 @@
  */
 
 static int
-yaml_parser_roll_indent(yaml_parser_t *parser, int column,
-        int number, yaml_token_type_t type, yaml_mark_t mark)
+yaml_parser_roll_indent(yaml_parser_t *parser, ptrdiff_t column,
+        ptrdiff_t number, yaml_token_type_t type, yaml_mark_t mark)
 {
     yaml_token_t token;
 
@@ -1226,7 +1229,14 @@
         if (!PUSH(parser, parser->indents, parser->indent))
             return 0;
 
-        parser->indent = column;
+#if PTRDIFF_MAX > INT_MAX
+        if (column > INT_MAX) {
+            parser->error = YAML_MEMORY_ERROR;
+            return 0;
+        }
+#endif
+
+        parser->indent = (int)column;
 
         /* Create a token and insert it into the queue. */
 
@@ -1248,13 +1258,13 @@
 
 /*
  * Pop indentation levels from the indents stack until the current level
- * becomes less or equal to the column.  For each indentation level, append
+ * becomes less or equal to the column.  For each intendation level, append
  * the BLOCK-END token.
  */
 
 
 static int
-yaml_parser_unroll_indent(yaml_parser_t *parser, int column)
+yaml_parser_unroll_indent(yaml_parser_t *parser, ptrdiff_t column)
 {
     yaml_token_t token;
 
@@ -1263,7 +1273,7 @@
     if (parser->flow_level)
         return 1;
 
-    /* Loop through the indentation levels in the stack. */
+    /* Loop through the intendation levels in the stack. */
 
     while (parser->indent > column)
     {
@@ -2574,7 +2584,7 @@
 
     /* Resize the string to include the head. */
 
-    while (string.end - string.start <= (int)length) {
+    while ((size_t)(string.end - string.start) <= length) {
         if (!yaml_string_extend(&string.start, &string.pointer, &string.end)) {
             parser->error = YAML_MEMORY_ERROR;
             goto error;
@@ -2619,6 +2629,9 @@
         /* Check if it is a URI-escape sequence. */
 
         if (CHECK(parser->buffer, '%')) {
+            if (!STRING_EXTEND(parser, string))
+                goto error;
+
             if (!yaml_parser_scan_uri_escapes(parser,
                         directive, start_mark, &string)) goto error;
         }
@@ -2769,15 +2782,15 @@
 
         if (IS_DIGIT(parser->buffer))
         {
-            /* Check that the indentation is greater than 0. */
+            /* Check that the intendation is greater than 0. */
 
             if (CHECK(parser->buffer, '0')) {
                 yaml_parser_set_scanner_error(parser, "while scanning a block scalar",
-                        start_mark, "found an indentation indicator equal to 0");
+                        start_mark, "found an intendation indicator equal to 0");
                 goto error;
             }
 
-            /* Get the indentation level and eat the indicator. */
+            /* Get the intendation level and eat the indicator. */
 
             increment = AS_DIGIT(parser->buffer);
 
@@ -2791,7 +2804,7 @@
     {
         if (CHECK(parser->buffer, '0')) {
             yaml_parser_set_scanner_error(parser, "while scanning a block scalar",
-                    start_mark, "found an indentation indicator equal to 0");
+                    start_mark, "found an intendation indicator equal to 0");
             goto error;
         }
 
@@ -2841,7 +2854,7 @@
 
     end_mark = parser->mark;
 
-    /* Set the indentation level if it was specified. */
+    /* Set the intendation level if it was specified. */
 
     if (increment) {
         indent = parser->indent >= 0 ? parser->indent+increment : increment;
@@ -2907,7 +2920,7 @@
 
         if (!READ_LINE(parser, leading_break)) goto error;
 
-        /* Eat the following indentation spaces and line breaks. */
+        /* Eat the following intendation spaces and line breaks. */
 
         if (!yaml_parser_scan_block_scalar_breaks(parser,
                     &indent, &trailing_breaks, start_mark, &end_mark)) goto error;
@@ -2942,8 +2955,8 @@
 }
 
 /*
- * Scan indentation spaces and line breaks for a block scalar.  Determine the
- * indentation level if needed.
+ * Scan intendation spaces and line breaks for a block scalar.  Determine the
+ * intendation level if needed.
  */
 
 static int
@@ -2955,11 +2968,11 @@
 
     *end_mark = parser->mark;
 
-    /* Eat the indentation spaces and line breaks. */
+    /* Eat the intendation spaces and line breaks. */
 
     while (1)
     {
-        /* Eat the indentation spaces. */
+        /* Eat the intendation spaces. */
 
         if (!CACHE(parser, 1)) return 0;
 
@@ -2972,12 +2985,12 @@
         if ((int)parser->mark.column > max_indent)
             max_indent = (int)parser->mark.column;
 
-        /* Check for a tab character messing the indentation. */
+        /* Check for a tab character messing the intendation. */
 
         if ((!*indent || (int)parser->mark.column < *indent)
                 && IS_TAB(parser->buffer)) {
             return yaml_parser_set_scanner_error(parser, "while scanning a block scalar",
-                    start_mark, "found a tab character where an indentation space is expected");
+                    start_mark, "found a tab character where an intendation space is expected");
         }
 
         /* Have we found a non-empty line? */
@@ -3498,12 +3511,12 @@
         {
             if (IS_BLANK(parser->buffer))
             {
-                /* Check for tab character that abuse indentation. */
+                /* Check for tab character that abuse intendation. */
 
                 if (leading_blanks && (int)parser->mark.column < indent
                         && IS_TAB(parser->buffer)) {
                     yaml_parser_set_scanner_error(parser, "while scanning a plain scalar",
-                            start_mark, "found a tab character that violates indentation");
+                            start_mark, "found a tab character that violate intendation");
                     goto error;
                 }
 
@@ -3536,7 +3549,7 @@
             if (!CACHE(parser, 1)) goto error;
         }
 
-        /* Check indentation level. */
+        /* Check intendation level. */
 
         if (!parser->flow_level && (int)parser->mark.column < indent)
             break;
diff -uw ruby-2.0.0-p0/ext/psych/yaml/yaml.h ruby-2.1.2/ext/psych/yaml/yaml.h
--- ruby-2.0.0-p0/ext/psych/yaml/yaml.h	2012-12-05 05:08:17.000000000 +0100
+++ ruby-2.1.2/ext/psych/yaml/yaml.h	2013-09-20 16:51:35.000000000 +0200
@@ -1089,7 +1089,7 @@
     yaml_error_type_t error;
     /** Error description. */
     const char *problem;
-    /** The byte about which the problem occured. */
+    /** The byte about which the problem occurred. */
     size_t problem_offset;
     /** The problematic value (@c -1 is none). */
     int problem_value;
@@ -1851,7 +1851,7 @@
 yaml_emitter_set_canonical(yaml_emitter_t *emitter, int canonical);
 
 /**
- * Set the intendation increment.
+ * Set the indentation increment.
  *
  * @param[in,out]   emitter     An emitter object.
  * @param[in]       indent      The indentation increment (1 < . < 10).
diff -uw ruby-2.0.0-p0/ext/psych/yaml/yaml_private.h ruby-2.1.2/ext/psych/yaml/yaml_private.h
--- ruby-2.0.0-p0/ext/psych/yaml/yaml_private.h	2012-12-05 05:08:17.000000000 +0100
+++ ruby-2.1.2/ext/psych/yaml/yaml_private.h	2014-05-04 17:45:33.000000000 +0200
@@ -10,6 +10,17 @@
 
 #include <assert.h>
 #include <limits.h>
+#include <stddef.h>
+
+#ifndef _MSC_VER
+#include <stdint.h>
+#else
+#ifdef _WIN64
+#define PTRDIFF_MAX _I64_MAX
+#else
+#define PTRDIFF_MAX INT_MAX
+#endif
+#endif
 
 /*
  * Memory management.
@@ -135,9 +146,12 @@
      (string).start = (string).pointer = (string).end = 0)
 
 #define STRING_EXTEND(context,string)                                           \
-    (((string).pointer+5 < (string).end)                                        \
+    ((((string).pointer+5 < (string).end)                                       \
         || yaml_string_extend(&(string).start,                                  \
-            &(string).pointer, &(string).end))
+            &(string).pointer, &(string).end)) ?                                \
+         1 :                                                                    \
+        ((context)->error = YAML_MEMORY_ERROR,                                  \
+         0))
 
 #define CLEAR(context,string)                                                   \
     ((string).pointer = (string).start,                                         \
@@ -422,7 +436,14 @@
      (stack).start = (stack).top = (stack).end = 0)
 
 #define STACK_EMPTY(context,stack)                                              \
-    ((stack).start == (stack).top)
+    ((void)(context),                                                           \
+     ((stack).start == (stack).top))
+
+#define STACK_LIMIT(context,stack,size)                                         \
+    ((stack).top - (stack).start < (size) ?                                     \
+        1 :                                                                     \
+        ((context)->error = YAML_MEMORY_ERROR,                                  \
+         0))
 
 #define PUSH(context,stack,value)                                               \
     (((stack).top != (stack).end                                                \
patches/ruby/2.0.0/openssl3.patch000066400000003333147511530510012406 0ustar00diff --git a/ext/openssl/extconf.rb b/ext/openssl/extconf.rb
index 8c04cb5..132d803 100644
--- a/ext/openssl/extconf.rb
+++ b/ext/openssl/extconf.rb
@@ -104,6 +104,9 @@
 have_func("SSLv2_method")
 have_func("SSLv2_server_method")
 have_func("SSLv2_client_method")
+have_func("SSLv3_method")
+have_func("SSLv3_server_method")
+have_func("SSLv3_client_method")
 have_func("TLSv1_1_method")
 have_func("TLSv1_1_server_method")
 have_func("TLSv1_1_client_method")
diff --git a/ext/openssl/ossl_ssl.c b/ext/openssl/ossl_ssl.c
index f7cb7f0..47111f6 100644
--- a/ext/openssl/ossl_ssl.c
+++ b/ext/openssl/ossl_ssl.c
@@ -109,9 +109,12 @@ static const struct {
     OSSL_SSL_METHOD_ENTRY(SSLv2_server),
     OSSL_SSL_METHOD_ENTRY(SSLv2_client),
 #endif
+#if defined(HAVE_SSLV3_METHOD) && defined(HAVE_SSLV3_SERVER_METHOD) && \
+        defined(HAVE_SSLV3_CLIENT_METHOD)
     OSSL_SSL_METHOD_ENTRY(SSLv3),
     OSSL_SSL_METHOD_ENTRY(SSLv3_server),
     OSSL_SSL_METHOD_ENTRY(SSLv3_client),
+#endif
     OSSL_SSL_METHOD_ENTRY(SSLv23),
     OSSL_SSL_METHOD_ENTRY(SSLv23_server),
     OSSL_SSL_METHOD_ENTRY(SSLv23_client),
diff --git a/test/openssl/test_ssl.rb b/test/openssl/test_ssl.rb
index 07e081b..0cbfcba 100644
--- a/test/openssl/test_ssl.rb
+++ b/test/openssl/test_ssl.rb
@@ -912,7 +912,7 @@ def test_unset_OP_ALL
   # that has been marked as forbidden, therefore either of these may be raised
   HANDSHAKE_ERRORS = [OpenSSL::SSL::SSLError, Errno::ECONNRESET]

-if OpenSSL::SSL::SSLContext::METHODS.include? :TLSv1
+if OpenSSL::SSL::SSLContext::METHODS.include?(:TLSv1) && OpenSSL::SSL::SSLContext::METHODS.include?(:SSLv3)

   def test_forbid_ssl_v3_for_client
     ctx_proc = Proc.new { |ctx| ctx.options = OpenSSL::SSL::OP_ALL | OpenSSL::SSL::OP_NO_SSLv3 }
patches/ruby/2.0.0/43514.patch000066400000006342147511530510011323 0ustar00Index: load.c
===================================================================
--- a/load.c	(revision 43513)
+++ b/load.c	(revision 43514)
@@ -8,6 +8,7 @@
 #include "dln.h"
 #include "eval_intern.h"
 #include "probes.h"
+#include "node.h"
 
 VALUE ruby_dln_librefs;
 
@@ -482,6 +483,9 @@
 	else {
 	    VALUE bufstr;
 	    char *buf;
+	    static const char so_ext[][4] = {
+		".so", ".o",
+	    };
 
 	    if (ext && *ext) return 0;
 	    bufstr = rb_str_tmp_new(len + DLEXT_MAXLEN);
@@ -495,6 +499,14 @@
 		    return i ? 's' : 'r';
 		}
 	    }
+	    for (i = 0; i < numberof(so_ext); i++) {
+		strlcpy(buf + len, so_ext[i], DLEXT_MAXLEN + 1);
+		if (st_get_key(loading_tbl, (st_data_t)buf, &data)) {
+		    rb_str_resize(bufstr, 0);
+		    if (fn) *fn = (const char*)data;
+		    return 's';
+		}
+	    }
 	    rb_str_resize(bufstr, 0);
 	}
     }
@@ -709,6 +721,14 @@
 	st_insert(loading_tbl, (st_data_t)ftptr, data);
 	return (char *)ftptr;
     }
+    else if (RB_TYPE_P((VALUE)data, T_NODE) && nd_type((VALUE)data) == NODE_MEMO) {
+	NODE *memo = RNODE(data);
+	void (*init)(void) = (void (*)(void))memo->nd_cfnc;
+	data = (st_data_t)rb_thread_shield_new();
+	st_insert(loading_tbl, (st_data_t)ftptr, data);
+	(*init)();
+	return (char *)"";
+    }
     if (RTEST(ruby_verbose)) {
 	rb_warning("loading in progress, circular require considered harmful - %s", ftptr);
 	rb_backtrace_print_to(rb_stderr);
@@ -881,13 +901,16 @@
     switch (type) {
       case 0:
 	if (ft)
-	    break;
+	    goto statically_linked;
 	ftptr = RSTRING_PTR(tmp);
 	return rb_feature_p(ftptr, 0, FALSE, TRUE, 0);
 
       default:
-	if (ft)
-	    break;
+	if (ft) {
+	  statically_linked:
+	    if (loading) *path = rb_filesystem_str_new_cstr(loading);
+	    return ft;
+	}
       case 1:
 	ext = strrchr(ftptr = RSTRING_PTR(tmp), '.');
 	if (rb_feature_p(ftptr, ext, !--type, TRUE, &loading) && !loading)
@@ -957,6 +980,10 @@
 	    if (!path || !(ftptr = load_lock(RSTRING_PTR(path)))) {
 		result = Qfalse;
 	    }
+	    else if (!*ftptr) {
+		rb_provide_feature(path);
+		result = Qtrue;
+	    }
 	    else {
 		switch (found) {
 		  case 'r':
@@ -1005,26 +1032,30 @@
     return rb_require_safe(fn, rb_safe_level());
 }
 
-static VALUE
-init_ext_call(VALUE arg)
+static int
+register_init_ext(st_data_t *key, st_data_t *value, st_data_t init, int existing)
 {
-    SCOPE_SET(NOEX_PUBLIC);
-    (*(void (*)(void))arg)();
-    return Qnil;
+    const char *name = (char *)*key;
+    if (existing) {
+	/* already registered */
+	rb_warn("%s is already registered", name);
+    }
+    else {
+	*value = (st_data_t)NEW_MEMO(init, 0, 0);
+	*key = (st_data_t)ruby_strdup(name);
+    }
+    return ST_CONTINUE;
 }
 
 RUBY_FUNC_EXPORTED void
 ruby_init_ext(const char *name, void (*init)(void))
 {
-    char* const lock_key = load_lock(name);
-    if (lock_key) {
-	VALUE feature = rb_usascii_str_new_cstr(name);
-	OBJ_FREEZE(feature);
-	rb_vm_call_cfunc(rb_vm_top_self(), init_ext_call, (VALUE)init,
-			 0, feature);
-	rb_provide_feature(feature);
-	load_unlock(lock_key, 1);
+    st_table *loading_tbl = get_loading_table();
+
+    if (!loading_tbl) {
+	GET_VM()->loading_table = loading_tbl = st_init_strtable();
     }
+    st_update(loading_tbl, (st_data_t)name, register_init_ext, (st_data_t)init);
 }
 
 /*
patches/ruby/2.0.0/logging.patch000066400000002675147511530510012276 0ustar00--- trunk/ext/extmk.rb  (revision 40079)
+++ trunk/ext/extmk.rb  (revision 40080)
@@ -193,19 +193,11 @@
    Logging::logfile 'mkmf.log'
    rm_f makefile
    if conf
-            stdout = $stdout.dup
-            stderr = $stderr.dup
-            unless verbose?
-              $stderr.reopen($stdout.reopen(@null))
-            end
-            begin
+            Logging.open do
+              unless verbose?
+                $stderr.reopen($stdout.reopen(@null))
+              end
               load $0 = conf
-            ensure
-              Logging::log_close
-              $stderr.reopen(stderr)
-              $stdout.reopen(stdout)
-              stdout.close
-              stderr.close
             end
    else
      create_makefile(target)
@@ -235,11 +227,13 @@
         mess = "#{error}\n#{mess}"
       end

-      Logging::message(mess)
+      Logging::message(mess) if Logging.log_opened?
       print(mess)
       $stdout.flush
+      Logging::log_close
       return true
     end
+    Logging::log_close
     args = sysquote($mflags)
     unless $destdir.to_s.empty? or $mflags.defined?("DESTDIR")
       args += [sysquote("DESTDIR=" + relative_from($destdir, "../"+prefix))]
--- trunk/lib/mkmf.rb (revision 40079)
+++ trunk/lib/mkmf.rb (revision 40080)
@@ -310,6 +310,10 @@
       @log.sync = true
     end

+    def self::log_opened?
+      @log and not @log.closed?
+    end
+
     def self::open
       log_open
       $stderr.reopen(@log)
patches/ruby/2.0.0/p451/libyaml.patch000066400000006412147511530510012763 0ustar00diff -uw ruby-2.0.0-p451/ext/psych/yaml/config.h ruby-2.1.2/ext/psych/yaml/config.h
--- ruby-2.0.0-p451/ext/psych/yaml/config.h	2014-02-15 17:48:09.000000000 +0100
+++ ruby-2.1.2/ext/psych/yaml/config.h	2014-05-04 17:45:33.000000000 +0200
@@ -1,11 +1,10 @@
-
 #define PACKAGE_NAME "yaml"
 #define PACKAGE_TARNAME "yaml"
-#define PACKAGE_VERSION "0.1.5"
-#define PACKAGE_STRING "yaml 0.1.5"
+#define PACKAGE_VERSION "0.1.6"
+#define PACKAGE_STRING "yaml 0.1.6"
 #define PACKAGE_BUGREPORT "http://pyyaml.org/newticket?component libyaml"
 #define PACKAGE_URL ""
 #define YAML_VERSION_MAJOR 0
 #define YAML_VERSION_MINOR 1
-#define YAML_VERSION_PATCH 5
-#define YAML_VERSION_STRING "0.1.5"
+#define YAML_VERSION_PATCH 6
+#define YAML_VERSION_STRING "0.1.6"
diff -uw ruby-2.0.0-p451/ext/psych/yaml/scanner.c ruby-2.1.2/ext/psych/yaml/scanner.c
--- ruby-2.0.0-p451/ext/psych/yaml/scanner.c	2014-02-21 12:55:57.000000000 +0100
+++ ruby-2.1.2/ext/psych/yaml/scanner.c	2014-05-04 17:45:33.000000000 +0200
@@ -2629,6 +2629,9 @@
         /* Check if it is a URI-escape sequence. */
 
         if (CHECK(parser->buffer, '%')) {
+            if (!STRING_EXTEND(parser, string))
+                goto error;
+
             if (!yaml_parser_scan_uri_escapes(parser,
                         directive, start_mark, &string)) goto error;
         }
diff -uw ruby-2.0.0-p451/ext/psych/yaml/yaml.h ruby-2.1.2/ext/psych/yaml/yaml.h
--- ruby-2.0.0-p451/ext/psych/yaml/yaml.h	2012-12-05 05:08:17.000000000 +0100
+++ ruby-2.1.2/ext/psych/yaml/yaml.h	2013-09-20 16:51:35.000000000 +0200
@@ -1089,7 +1089,7 @@
     yaml_error_type_t error;
     /** Error description. */
     const char *problem;
-    /** The byte about which the problem occured. */
+    /** The byte about which the problem occurred. */
     size_t problem_offset;
     /** The problematic value (@c -1 is none). */
     int problem_value;
@@ -1851,7 +1851,7 @@
 yaml_emitter_set_canonical(yaml_emitter_t *emitter, int canonical);
 
 /**
- * Set the intendation increment.
+ * Set the indentation increment.
  *
  * @param[in,out]   emitter     An emitter object.
  * @param[in]       indent      The indentation increment (1 < . < 10).
diff -uw ruby-2.0.0-p451/ext/psych/yaml/yaml_private.h ruby-2.1.2/ext/psych/yaml/yaml_private.h
--- ruby-2.0.0-p451/ext/psych/yaml/yaml_private.h	2014-02-21 12:55:57.000000000 +0100
+++ ruby-2.1.2/ext/psych/yaml/yaml_private.h	2014-05-04 17:45:33.000000000 +0200
@@ -146,9 +146,12 @@
      (string).start = (string).pointer = (string).end = 0)
 
 #define STRING_EXTEND(context,string)                                           \
-    (((string).pointer+5 < (string).end)                                        \
+    ((((string).pointer+5 < (string).end)                                       \
         || yaml_string_extend(&(string).start,                                  \
-            &(string).pointer, &(string).end))
+            &(string).pointer, &(string).end)) ?                                \
+         1 :                                                                    \
+        ((context)->error = YAML_MEMORY_ERROR,                                  \
+         0))
 
 #define CLEAR(context,string)                                                   \
     ((string).pointer = (string).start,                                         \
patches/ruby/2.0.0/update-autoconf.patch000066400000123242147511530510013740 0ustar00diff -Naur ruby-2.0.0-p648/tool/config.guess ruby-2.0.0-p648+ppc64le/tool/config.guess
--- ruby-2.0.0-p648/tool/config.guess	2012-01-29 13:50:18.000000000 +0000
+++ ruby-2.0.0-p648+ppc64le/tool/config.guess	2016-04-15 06:09:11.281978937 +0000
@@ -1,14 +1,12 @@
 #! /bin/sh
 # Attempt to guess a canonical system name.
-#   Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999,
-#   2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010,
-#   2011 Free Software Foundation, Inc.
+#   Copyright 1992-2016 Free Software Foundation, Inc.
 
-timestamp='2011-11-11'
+timestamp='2016-04-02'
 
 # This file is free software; you can redistribute it and/or modify it
 # under the terms of the GNU General Public License as published by
-# the Free Software Foundation; either version 2 of the License, or
+# the Free Software Foundation; either version 3 of the License, or
 # (at your option) any later version.
 #
 # This program is distributed in the hope that it will be useful, but
@@ -17,26 +15,22 @@
 # General Public License for more details.
 #
 # You should have received a copy of the GNU General Public License
-# along with this program; if not, write to the Free Software
-# Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA
-# 02110-1301, USA.
+# along with this program; if not, see <http://www.gnu.org/licenses/>.
 #
 # As a special exception to the GNU General Public License, if you
 # distribute this file as part of a program that contains a
 # configuration script generated by Autoconf, you may include it under
-# the same distribution terms that you use for the rest of that program.
-
-
-# Originally written by Per Bothner.  Please send patches (context
-# diff format) to <config-patches@gnu.org> and include a ChangeLog
-# entry.
+# the same distribution terms that you use for the rest of that
+# program.  This Exception is an additional permission under section 7
+# of the GNU General Public License, version 3 ("GPLv3").
 #
-# This script attempts to guess a canonical system name similar to
-# config.sub.  If it succeeds, it prints the system name on stdout, and
-# exits with 0.  Otherwise, it exits with 1.
+# Originally written by Per Bothner; maintained since 2000 by Ben Elliston.
 #
 # You can get the latest version of this script from:
-# http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.guess;hb=HEAD
+# http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.guess
+#
+# Please send patches to <config-patches@gnu.org>.
+
 
 me=`echo "$0" | sed -e 's,.*/,,'`
 
@@ -56,9 +50,7 @@
 GNU config.guess ($timestamp)
 
 Originally written by Per Bothner.
-Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000,
-2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free
-Software Foundation, Inc.
+Copyright 1992-2016 Free Software Foundation, Inc.
 
 This is free software; see the source for copying conditions.  There is NO
 warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE."
@@ -140,12 +132,33 @@
 UNAME_SYSTEM=`(uname -s) 2>/dev/null`  || UNAME_SYSTEM=unknown
 UNAME_VERSION=`(uname -v) 2>/dev/null` || UNAME_VERSION=unknown
 
+case "${UNAME_SYSTEM}" in
+Linux|GNU|GNU/*)
+	# If the system lacks a compiler, then just pick glibc.
+	# We could probably try harder.
+	LIBC=gnu
+
+	eval $set_cc_for_build
+	cat <<-EOF > $dummy.c
+	#include <features.h>
+	#if defined(__UCLIBC__)
+	LIBC=uclibc
+	#elif defined(__dietlibc__)
+	LIBC=dietlibc
+	#else
+	LIBC=gnu
+	#endif
+	EOF
+	eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep '^LIBC' | sed 's, ,,g'`
+	;;
+esac
+
 # Note: order is significant - the case branches are not exclusive.
 
 case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in
     *:NetBSD:*:*)
 	# NetBSD (nbsd) targets should (where applicable) match one or
-	# more of the tupples: *-*-netbsdelf*, *-*-netbsdaout*,
+	# more of the tuples: *-*-netbsdelf*, *-*-netbsdaout*,
 	# *-*-netbsdecoff* and *-*-netbsd*.  For targets that recently
 	# switched to ELF, *-*-netbsd* would select the old
 	# object file format.  This provides both forward
@@ -155,20 +168,27 @@
 	# Note: NetBSD doesn't particularly care about the vendor
 	# portion of the name.  We always set it to "unknown".
 	sysctl="sysctl -n hw.machine_arch"
-	UNAME_MACHINE_ARCH=`(/sbin/$sysctl 2>/dev/null || \
-	    /usr/sbin/$sysctl 2>/dev/null || echo unknown)`
+	UNAME_MACHINE_ARCH=`(uname -p 2>/dev/null || \
+	    /sbin/$sysctl 2>/dev/null || \
+	    /usr/sbin/$sysctl 2>/dev/null || \
+	    echo unknown)`
 	case "${UNAME_MACHINE_ARCH}" in
 	    armeb) machine=armeb-unknown ;;
 	    arm*) machine=arm-unknown ;;
 	    sh3el) machine=shl-unknown ;;
 	    sh3eb) machine=sh-unknown ;;
 	    sh5el) machine=sh5le-unknown ;;
+	    earmv*)
+		arch=`echo ${UNAME_MACHINE_ARCH} | sed -e 's,^e\(armv[0-9]\).*$,\1,'`
+		endian=`echo ${UNAME_MACHINE_ARCH} | sed -ne 's,^.*\(eb\)$,\1,p'`
+		machine=${arch}${endian}-unknown
+		;;
 	    *) machine=${UNAME_MACHINE_ARCH}-unknown ;;
 	esac
 	# The Operating System including object format, if it has switched
 	# to ELF recently, or will in the future.
 	case "${UNAME_MACHINE_ARCH}" in
-	    arm*|i386|m68k|ns32k|sh3*|sparc|vax)
+	    arm*|earm*|i386|m68k|ns32k|sh3*|sparc|vax)
 		eval $set_cc_for_build
 		if echo __ELF__ | $CC_FOR_BUILD -E - 2>/dev/null \
 			| grep -q __ELF__
@@ -184,6 +204,13 @@
 		os=netbsd
 		;;
 	esac
+	# Determine ABI tags.
+	case "${UNAME_MACHINE_ARCH}" in
+	    earm*)
+		expr='s/^earmv[0-9]/-eabi/;s/eb$//'
+		abi=`echo ${UNAME_MACHINE_ARCH} | sed -e "$expr"`
+		;;
+	esac
 	# The OS release
 	# Debian GNU/NetBSD machines have a different userland, and
 	# thus, need a distinct triplet. However, they do not need
@@ -194,18 +221,26 @@
 		release='-gnu'
 		;;
 	    *)
-		release=`echo ${UNAME_RELEASE}|sed -e 's/[-_].*/\./'`
+		release=`echo ${UNAME_RELEASE} | sed -e 's/[-_].*//' | cut -d. -f1,2`
 		;;
 	esac
 	# Since CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM:
 	# contains redundant information, the shorter form:
 	# CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM is used.
-	echo "${machine}-${os}${release}"
+	echo "${machine}-${os}${release}${abi}"
+	exit ;;
+    *:Bitrig:*:*)
+	UNAME_MACHINE_ARCH=`arch | sed 's/Bitrig.//'`
+	echo ${UNAME_MACHINE_ARCH}-unknown-bitrig${UNAME_RELEASE}
 	exit ;;
     *:OpenBSD:*:*)
 	UNAME_MACHINE_ARCH=`arch | sed 's/OpenBSD.//'`
 	echo ${UNAME_MACHINE_ARCH}-unknown-openbsd${UNAME_RELEASE}
 	exit ;;
+    *:LibertyBSD:*:*)
+	UNAME_MACHINE_ARCH=`arch | sed 's/^.*BSD\.//'`
+	echo ${UNAME_MACHINE_ARCH}-unknown-libertybsd${UNAME_RELEASE}
+	exit ;;
     *:ekkoBSD:*:*)
 	echo ${UNAME_MACHINE}-unknown-ekkobsd${UNAME_RELEASE}
 	exit ;;
@@ -218,6 +253,9 @@
     *:MirBSD:*:*)
 	echo ${UNAME_MACHINE}-unknown-mirbsd${UNAME_RELEASE}
 	exit ;;
+    *:Sortix:*:*)
+	echo ${UNAME_MACHINE}-unknown-sortix
+	exit ;;
     alpha:OSF1:*:*)
 	case $UNAME_RELEASE in
 	*4.0)
@@ -234,42 +272,42 @@
 	ALPHA_CPU_TYPE=`/usr/sbin/psrinfo -v | sed -n -e 's/^  The alpha \(.*\) processor.*$/\1/p' | head -n 1`
 	case "$ALPHA_CPU_TYPE" in
 	    "EV4 (21064)")
-		UNAME_MACHINE="alpha" ;;
+		UNAME_MACHINE=alpha ;;
 	    "EV4.5 (21064)")
-		UNAME_MACHINE="alpha" ;;
+		UNAME_MACHINE=alpha ;;
 	    "LCA4 (21066/21068)")
-		UNAME_MACHINE="alpha" ;;
+		UNAME_MACHINE=alpha ;;
 	    "EV5 (21164)")
-		UNAME_MACHINE="alphaev5" ;;
+		UNAME_MACHINE=alphaev5 ;;
 	    "EV5.6 (21164A)")
-		UNAME_MACHINE="alphaev56" ;;
+		UNAME_MACHINE=alphaev56 ;;
 	    "EV5.6 (21164PC)")
-		UNAME_MACHINE="alphapca56" ;;
+		UNAME_MACHINE=alphapca56 ;;
 	    "EV5.7 (21164PC)")
-		UNAME_MACHINE="alphapca57" ;;
+		UNAME_MACHINE=alphapca57 ;;
 	    "EV6 (21264)")
-		UNAME_MACHINE="alphaev6" ;;
+		UNAME_MACHINE=alphaev6 ;;
 	    "EV6.7 (21264A)")
-		UNAME_MACHINE="alphaev67" ;;
+		UNAME_MACHINE=alphaev67 ;;
 	    "EV6.8CB (21264C)")
-		UNAME_MACHINE="alphaev68" ;;
+		UNAME_MACHINE=alphaev68 ;;
 	    "EV6.8AL (21264B)")
-		UNAME_MACHINE="alphaev68" ;;
+		UNAME_MACHINE=alphaev68 ;;
 	    "EV6.8CX (21264D)")
-		UNAME_MACHINE="alphaev68" ;;
+		UNAME_MACHINE=alphaev68 ;;
 	    "EV6.9A (21264/EV69A)")
-		UNAME_MACHINE="alphaev69" ;;
+		UNAME_MACHINE=alphaev69 ;;
 	    "EV7 (21364)")
-		UNAME_MACHINE="alphaev7" ;;
+		UNAME_MACHINE=alphaev7 ;;
 	    "EV7.9 (21364A)")
-		UNAME_MACHINE="alphaev79" ;;
+		UNAME_MACHINE=alphaev79 ;;
 	esac
 	# A Pn.n version is a patched version.
 	# A Vn.n version is a released version.
 	# A Tn.n version is a released field test version.
 	# A Xn.n version is an unreleased experimental baselevel.
 	# 1.2 uses "1.2" for uname -r.
-	echo ${UNAME_MACHINE}-dec-osf`echo ${UNAME_RELEASE} | sed -e 's/^[PVTX]//' | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'`
+	echo ${UNAME_MACHINE}-dec-osf`echo ${UNAME_RELEASE} | sed -e 's/^[PVTX]//' | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz`
 	# Reset EXIT trap before exiting to avoid spurious non-zero exit code.
 	exitcode=$?
 	trap '' 0
@@ -304,7 +342,7 @@
     arm:RISC*:1.[012]*:*|arm:riscix:1.[012]*:*)
 	echo arm-acorn-riscix${UNAME_RELEASE}
 	exit ;;
-    arm:riscos:*:*|arm:RISCOS:*:*)
+    arm*:riscos:*:*|arm*:RISCOS:*:*)
 	echo arm-unknown-riscos
 	exit ;;
     SR2?01:HI-UX/MPP:*:* | SR8000:HI-UX/MPP:*:*)
@@ -342,16 +380,16 @@
 	exit ;;
     i86pc:SunOS:5.*:* | i86xen:SunOS:5.*:*)
 	eval $set_cc_for_build
-	SUN_ARCH="i386"
+	SUN_ARCH=i386
 	# If there is a compiler, see if it is configured for 64-bit objects.
 	# Note that the Sun cc does not turn __LP64__ into 1 like gcc does.
 	# This test works for both compilers.
-	if [ "$CC_FOR_BUILD" != 'no_compiler_found' ]; then
+	if [ "$CC_FOR_BUILD" != no_compiler_found ]; then
 	    if (echo '#ifdef __amd64'; echo IS_64BIT_ARCH; echo '#endif') | \
-		(CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) | \
+		(CCOPTS="" $CC_FOR_BUILD -E - 2>/dev/null) | \
 		grep IS_64BIT_ARCH >/dev/null
 	    then
-		SUN_ARCH="x86_64"
+		SUN_ARCH=x86_64
 	    fi
 	fi
 	echo ${SUN_ARCH}-pc-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
@@ -376,7 +414,7 @@
 	exit ;;
     sun*:*:4.2BSD:*)
 	UNAME_RELEASE=`(sed 1q /etc/motd | awk '{print substr($5,1,3)}') 2>/dev/null`
-	test "x${UNAME_RELEASE}" = "x" && UNAME_RELEASE=3
+	test "x${UNAME_RELEASE}" = x && UNAME_RELEASE=3
 	case "`/bin/arch`" in
 	    sun3)
 		echo m68k-sun-sunos${UNAME_RELEASE}
@@ -562,8 +600,9 @@
 	else
 		IBM_ARCH=powerpc
 	fi
-	if [ -x /usr/bin/oslevel ] ; then
-		IBM_REV=`/usr/bin/oslevel`
+	if [ -x /usr/bin/lslpp ] ; then
+		IBM_REV=`/usr/bin/lslpp -Lqc bos.rte.libc |
+			   awk -F: '{ print $3 }' | sed s/[0-9]*$/0/`
 	else
 		IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE}
 	fi
@@ -600,13 +639,13 @@
 		    sc_cpu_version=`/usr/bin/getconf SC_CPU_VERSION 2>/dev/null`
 		    sc_kernel_bits=`/usr/bin/getconf SC_KERNEL_BITS 2>/dev/null`
 		    case "${sc_cpu_version}" in
-		      523) HP_ARCH="hppa1.0" ;; # CPU_PA_RISC1_0
-		      528) HP_ARCH="hppa1.1" ;; # CPU_PA_RISC1_1
+		      523) HP_ARCH=hppa1.0 ;; # CPU_PA_RISC1_0
+		      528) HP_ARCH=hppa1.1 ;; # CPU_PA_RISC1_1
 		      532)                      # CPU_PA_RISC2_0
 			case "${sc_kernel_bits}" in
-			  32) HP_ARCH="hppa2.0n" ;;
-			  64) HP_ARCH="hppa2.0w" ;;
-			  '') HP_ARCH="hppa2.0" ;;   # HP-UX 10.20
+			  32) HP_ARCH=hppa2.0n ;;
+			  64) HP_ARCH=hppa2.0w ;;
+			  '') HP_ARCH=hppa2.0 ;;   # HP-UX 10.20
 			esac ;;
 		    esac
 		fi
@@ -645,11 +684,11 @@
 		    exit (0);
 		}
 EOF
-		    (CCOPTS= $CC_FOR_BUILD -o $dummy $dummy.c 2>/dev/null) && HP_ARCH=`$dummy`
+		    (CCOPTS="" $CC_FOR_BUILD -o $dummy $dummy.c 2>/dev/null) && HP_ARCH=`$dummy`
 		    test -z "$HP_ARCH" && HP_ARCH=hppa
 		fi ;;
 	esac
-	if [ ${HP_ARCH} = "hppa2.0w" ]
+	if [ ${HP_ARCH} = hppa2.0w ]
 	then
 	    eval $set_cc_for_build
 
@@ -662,12 +701,12 @@
 	    # $ CC_FOR_BUILD="cc +DA2.0w" ./config.guess
 	    # => hppa64-hp-hpux11.23
 
-	    if echo __LP64__ | (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) |
+	    if echo __LP64__ | (CCOPTS="" $CC_FOR_BUILD -E - 2>/dev/null) |
 		grep -q __LP64__
 	    then
-		HP_ARCH="hppa2.0w"
+		HP_ARCH=hppa2.0w
 	    else
-		HP_ARCH="hppa64"
+		HP_ARCH=hppa64
 	    fi
 	fi
 	echo ${HP_ARCH}-hp-hpux${HPUX_REV}
@@ -772,14 +811,14 @@
 	echo craynv-cray-unicosmp${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/'
 	exit ;;
     F30[01]:UNIX_System_V:*:* | F700:UNIX_System_V:*:*)
-	FUJITSU_PROC=`uname -m | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'`
-	FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'`
+	FUJITSU_PROC=`uname -m | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz`
+	FUJITSU_SYS=`uname -p | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz | sed -e 's/\///'`
 	FUJITSU_REL=`echo ${UNAME_RELEASE} | sed -e 's/ /_/'`
 	echo "${FUJITSU_PROC}-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}"
 	exit ;;
     5000:UNIX_System_V:4.*:*)
-	FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'`
-	FUJITSU_REL=`echo ${UNAME_RELEASE} | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/ /_/'`
+	FUJITSU_SYS=`uname -p | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz | sed -e 's/\///'`
+	FUJITSU_REL=`echo ${UNAME_RELEASE} | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz | sed -e 's/ /_/'`
 	echo "sparc-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}"
 	exit ;;
     i*86:BSD/386:*:* | i*86:BSD/OS:*:* | *:Ascend\ Embedded/OS:*:*)
@@ -803,10 +842,13 @@
     i*:CYGWIN*:*)
 	echo ${UNAME_MACHINE}-pc-cygwin
 	exit ;;
+    *:MINGW64*:*)
+	echo ${UNAME_MACHINE}-pc-mingw64
+	exit ;;
     *:MINGW*:*)
 	echo ${UNAME_MACHINE}-pc-mingw32
 	exit ;;
-    i*:MSYS*:*)
+    *:MSYS*:*)
 	echo ${UNAME_MACHINE}-pc-msys
 	exit ;;
     i*:windows32*:*)
@@ -854,15 +896,22 @@
 	exit ;;
     *:GNU:*:*)
 	# the GNU system
-	echo `echo ${UNAME_MACHINE}|sed -e 's,[-/].*$,,'`-unknown-gnu`echo ${UNAME_RELEASE}|sed -e 's,/.*$,,'`
+	echo `echo ${UNAME_MACHINE}|sed -e 's,[-/].*$,,'`-unknown-${LIBC}`echo ${UNAME_RELEASE}|sed -e 's,/.*$,,'`
 	exit ;;
     *:GNU/*:*:*)
 	# other systems with GNU libc and userland
-	echo ${UNAME_MACHINE}-unknown-`echo ${UNAME_SYSTEM} | sed 's,^[^/]*/,,' | tr '[A-Z]' '[a-z]'``echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`-gnu
+	echo ${UNAME_MACHINE}-unknown-`echo ${UNAME_SYSTEM} | sed 's,^[^/]*/,,' | tr "[:upper:]" "[:lower:]"``echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`-${LIBC}
 	exit ;;
     i*86:Minix:*:*)
 	echo ${UNAME_MACHINE}-pc-minix
 	exit ;;
+    aarch64:Linux:*:*)
+	echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
+	exit ;;
+    aarch64_be:Linux:*:*)
+	UNAME_MACHINE=aarch64_be
+	echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
+	exit ;;
     alpha:Linux:*:*)
 	case `sed -n '/^cpu model/s/^.*: \(.*\)/\1/p' < /proc/cpuinfo` in
 	  EV5)   UNAME_MACHINE=alphaev5 ;;
@@ -874,59 +923,60 @@
 	  EV68*) UNAME_MACHINE=alphaev68 ;;
 	esac
 	objdump --private-headers /bin/sh | grep -q ld.so.1
-	if test "$?" = 0 ; then LIBC="libc1" ; else LIBC="" ; fi
-	echo ${UNAME_MACHINE}-unknown-linux-gnu${LIBC}
+	if test "$?" = 0 ; then LIBC=gnulibc1 ; fi
+	echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
+	exit ;;
+    arc:Linux:*:* | arceb:Linux:*:*)
+	echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
 	exit ;;
     arm*:Linux:*:*)
 	eval $set_cc_for_build
 	if echo __ARM_EABI__ | $CC_FOR_BUILD -E - 2>/dev/null \
 	    | grep -q __ARM_EABI__
 	then
-	    echo ${UNAME_MACHINE}-unknown-linux-gnu
+	    echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
 	else
 	    if echo __ARM_PCS_VFP | $CC_FOR_BUILD -E - 2>/dev/null \
 		| grep -q __ARM_PCS_VFP
 	    then
-		echo ${UNAME_MACHINE}-unknown-linux-gnueabi
+		echo ${UNAME_MACHINE}-unknown-linux-${LIBC}eabi
 	    else
-		echo ${UNAME_MACHINE}-unknown-linux-gnueabihf
+		echo ${UNAME_MACHINE}-unknown-linux-${LIBC}eabihf
 	    fi
 	fi
 	exit ;;
     avr32*:Linux:*:*)
-	echo ${UNAME_MACHINE}-unknown-linux-gnu
+	echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
 	exit ;;
     cris:Linux:*:*)
-	echo cris-axis-linux-gnu
+	echo ${UNAME_MACHINE}-axis-linux-${LIBC}
 	exit ;;
     crisv32:Linux:*:*)
-	echo crisv32-axis-linux-gnu
+	echo ${UNAME_MACHINE}-axis-linux-${LIBC}
+	exit ;;
+    e2k:Linux:*:*)
+	echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
 	exit ;;
     frv:Linux:*:*)
-	echo frv-unknown-linux-gnu
+	echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
 	exit ;;
     hexagon:Linux:*:*)
-	echo hexagon-unknown-linux-gnu
+	echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
 	exit ;;
     i*86:Linux:*:*)
-	LIBC=gnu
-	eval $set_cc_for_build
-	sed 's/^	//' << EOF >$dummy.c
-	#ifdef __dietlibc__
-	LIBC=dietlibc
-	#endif
-EOF
-	eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep '^LIBC'`
-	echo "${UNAME_MACHINE}-pc-linux-${LIBC}"
+	echo ${UNAME_MACHINE}-pc-linux-${LIBC}
 	exit ;;
     ia64:Linux:*:*)
-	echo ${UNAME_MACHINE}-unknown-linux-gnu
+	echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
+	exit ;;
+    k1om:Linux:*:*)
+	echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
 	exit ;;
     m32r*:Linux:*:*)
-	echo ${UNAME_MACHINE}-unknown-linux-gnu
+	echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
 	exit ;;
     m68*:Linux:*:*)
-	echo ${UNAME_MACHINE}-unknown-linux-gnu
+	echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
 	exit ;;
     mips:Linux:*:* | mips64:Linux:*:*)
 	eval $set_cc_for_build
@@ -945,54 +995,63 @@
 	#endif
 EOF
 	eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep '^CPU'`
-	test x"${CPU}" != x && { echo "${CPU}-unknown-linux-gnu"; exit; }
+	test x"${CPU}" != x && { echo "${CPU}-unknown-linux-${LIBC}"; exit; }
 	;;
-    or32:Linux:*:*)
-	echo or32-unknown-linux-gnu
+    openrisc*:Linux:*:*)
+	echo or1k-unknown-linux-${LIBC}
+	exit ;;
+    or32:Linux:*:* | or1k*:Linux:*:*)
+	echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
 	exit ;;
     padre:Linux:*:*)
-	echo sparc-unknown-linux-gnu
+	echo sparc-unknown-linux-${LIBC}
 	exit ;;
     parisc64:Linux:*:* | hppa64:Linux:*:*)
-	echo hppa64-unknown-linux-gnu
+	echo hppa64-unknown-linux-${LIBC}
 	exit ;;
     parisc:Linux:*:* | hppa:Linux:*:*)
 	# Look for CPU level
 	case `grep '^cpu[^a-z]*:' /proc/cpuinfo 2>/dev/null | cut -d' ' -f2` in
-	  PA7*) echo hppa1.1-unknown-linux-gnu ;;
-	  PA8*) echo hppa2.0-unknown-linux-gnu ;;
-	  *)    echo hppa-unknown-linux-gnu ;;
+	  PA7*) echo hppa1.1-unknown-linux-${LIBC} ;;
+	  PA8*) echo hppa2.0-unknown-linux-${LIBC} ;;
+	  *)    echo hppa-unknown-linux-${LIBC} ;;
 	esac
 	exit ;;
     ppc64:Linux:*:*)
-	echo powerpc64-unknown-linux-gnu
+	echo powerpc64-unknown-linux-${LIBC}
 	exit ;;
     ppc:Linux:*:*)
-	echo powerpc-unknown-linux-gnu
+	echo powerpc-unknown-linux-${LIBC}
+	exit ;;
+    ppc64le:Linux:*:*)
+	echo powerpc64le-unknown-linux-${LIBC}
+	exit ;;
+    ppcle:Linux:*:*)
+	echo powerpcle-unknown-linux-${LIBC}
 	exit ;;
     s390:Linux:*:* | s390x:Linux:*:*)
-	echo ${UNAME_MACHINE}-ibm-linux
+	echo ${UNAME_MACHINE}-ibm-linux-${LIBC}
 	exit ;;
     sh64*:Linux:*:*)
-	echo ${UNAME_MACHINE}-unknown-linux-gnu
+	echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
 	exit ;;
     sh*:Linux:*:*)
-	echo ${UNAME_MACHINE}-unknown-linux-gnu
+	echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
 	exit ;;
     sparc:Linux:*:* | sparc64:Linux:*:*)
-	echo ${UNAME_MACHINE}-unknown-linux-gnu
+	echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
 	exit ;;
     tile*:Linux:*:*)
-	echo ${UNAME_MACHINE}-unknown-linux-gnu
+	echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
 	exit ;;
     vax:Linux:*:*)
-	echo ${UNAME_MACHINE}-dec-linux-gnu
+	echo ${UNAME_MACHINE}-dec-linux-${LIBC}
 	exit ;;
     x86_64:Linux:*:*)
-	echo x86_64-unknown-linux-gnu
+	echo ${UNAME_MACHINE}-pc-linux-${LIBC}
 	exit ;;
     xtensa*:Linux:*:*)
-	echo ${UNAME_MACHINE}-unknown-linux-gnu
+	echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
 	exit ;;
     i*86:DYNIX/ptx:4*:*)
 	# ptx 4.0 does uname -s correctly, with DYNIX/ptx in there.
@@ -1068,7 +1127,7 @@
 	# uname -m prints for DJGPP always 'pc', but it prints nothing about
 	# the processor, so we play safe by assuming i586.
 	# Note: whatever this is, it MUST be the same as what config.sub
-	# prints for the "djgpp" host, or else GDB configury will decide that
+	# prints for the "djgpp" host, or else GDB configure will decide that
 	# this is a cross-build.
 	echo i586-pc-msdosdjgpp
 	exit ;;
@@ -1196,6 +1255,9 @@
     BePC:Haiku:*:*)	# Haiku running on Intel PC compatible.
 	echo i586-pc-haiku
 	exit ;;
+    x86_64:Haiku:*:*)
+	echo x86_64-unknown-haiku
+	exit ;;
     SX-4:SUPER-UX:*:*)
 	echo sx4-nec-superux${UNAME_RELEASE}
 	exit ;;
@@ -1214,6 +1276,9 @@
     SX-8R:SUPER-UX:*:*)
 	echo sx8r-nec-superux${UNAME_RELEASE}
 	exit ;;
+    SX-ACE:SUPER-UX:*:*)
+	echo sxace-nec-superux${UNAME_RELEASE}
+	exit ;;
     Power*:Rhapsody:*:*)
 	echo powerpc-apple-rhapsody${UNAME_RELEASE}
 	exit ;;
@@ -1222,24 +1287,36 @@
 	exit ;;
     *:Darwin:*:*)
 	UNAME_PROCESSOR=`uname -p` || UNAME_PROCESSOR=unknown
-	case $UNAME_PROCESSOR in
-	    i386)
-		eval $set_cc_for_build
-		if [ "$CC_FOR_BUILD" != 'no_compiler_found' ]; then
-		  if (echo '#ifdef __LP64__'; echo IS_64BIT_ARCH; echo '#endif') | \
-		      (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) | \
-		      grep IS_64BIT_ARCH >/dev/null
-		  then
-		      UNAME_PROCESSOR="x86_64"
-		  fi
-		fi ;;
-	    unknown) UNAME_PROCESSOR=powerpc ;;
-	esac
+	eval $set_cc_for_build
+	if test "$UNAME_PROCESSOR" = unknown ; then
+	    UNAME_PROCESSOR=powerpc
+	fi
+	if test `echo "$UNAME_RELEASE" | sed -e 's/\..*//'` -le 10 ; then
+	    if [ "$CC_FOR_BUILD" != no_compiler_found ]; then
+		if (echo '#ifdef __LP64__'; echo IS_64BIT_ARCH; echo '#endif') | \
+		    (CCOPTS="" $CC_FOR_BUILD -E - 2>/dev/null) | \
+		    grep IS_64BIT_ARCH >/dev/null
+		then
+		    case $UNAME_PROCESSOR in
+			i386) UNAME_PROCESSOR=x86_64 ;;
+			powerpc) UNAME_PROCESSOR=powerpc64 ;;
+		    esac
+		fi
+	    fi
+	elif test "$UNAME_PROCESSOR" = i386 ; then
+	    # Avoid executing cc on OS X 10.9, as it ships with a stub
+	    # that puts up a graphical alert prompting to install
+	    # developer tools.  Any system running Mac OS X 10.7 or
+	    # later (Darwin 11 and later) is required to have a 64-bit
+	    # processor. This is not true of the ARM version of Darwin
+	    # that Apple uses in portable devices.
+	    UNAME_PROCESSOR=x86_64
+	fi
 	echo ${UNAME_PROCESSOR}-apple-darwin${UNAME_RELEASE}
 	exit ;;
     *:procnto*:*:* | *:QNX:[0123456789]*:*)
 	UNAME_PROCESSOR=`uname -p`
-	if test "$UNAME_PROCESSOR" = "x86"; then
+	if test "$UNAME_PROCESSOR" = x86; then
 		UNAME_PROCESSOR=i386
 		UNAME_MACHINE=pc
 	fi
@@ -1251,7 +1328,7 @@
     NEO-?:NONSTOP_KERNEL:*:*)
 	echo neo-tandem-nsk${UNAME_RELEASE}
 	exit ;;
-    NSE-?:NONSTOP_KERNEL:*:*)
+    NSE-*:NONSTOP_KERNEL:*:*)
 	echo nse-tandem-nsk${UNAME_RELEASE}
 	exit ;;
     NSR-?:NONSTOP_KERNEL:*:*)
@@ -1270,7 +1347,7 @@
 	# "uname -m" is not consistent, so use $cputype instead. 386
 	# is converted to i386 for consistency with other x86
 	# operating systems.
-	if test "$cputype" = "386"; then
+	if test "$cputype" = 386; then
 	    UNAME_MACHINE=i386
 	else
 	    UNAME_MACHINE="$cputype"
@@ -1312,7 +1389,7 @@
 	echo i386-pc-xenix
 	exit ;;
     i*86:skyos:*:*)
-	echo ${UNAME_MACHINE}-pc-skyos`echo ${UNAME_RELEASE}` | sed -e 's/ .*$//'
+	echo ${UNAME_MACHINE}-pc-skyos`echo ${UNAME_RELEASE} | sed -e 's/ .*$//'`
 	exit ;;
     i*86:rdos:*:*)
 	echo ${UNAME_MACHINE}-pc-rdos
@@ -1320,158 +1397,13 @@
     i*86:AROS:*:*)
 	echo ${UNAME_MACHINE}-pc-aros
 	exit ;;
-esac
-
-#echo '(No uname command or uname output not recognized.)' 1>&2
-#echo "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" 1>&2
-
-eval $set_cc_for_build
-cat >$dummy.c <<EOF
-#ifdef _SEQUENT_
-# include <sys/types.h>
-# include <sys/utsname.h>
-#endif
-main ()
-{
-#if defined (sony)
-#if defined (MIPSEB)
-  /* BFD wants "bsd" instead of "newsos".  Perhaps BFD should be changed,
-     I don't know....  */
-  printf ("mips-sony-bsd\n"); exit (0);
-#else
-#include <sys/param.h>
-  printf ("m68k-sony-newsos%s\n",
-#ifdef NEWSOS4
-	"4"
-#else
-	""
-#endif
-	); exit (0);
-#endif
-#endif
-
-#if defined (__arm) && defined (__acorn) && defined (__unix)
-  printf ("arm-acorn-riscix\n"); exit (0);
-#endif
-
-#if defined (hp300) && !defined (hpux)
-  printf ("m68k-hp-bsd\n"); exit (0);
-#endif
-
-#if defined (NeXT)
-#if !defined (__ARCHITECTURE__)
-#define __ARCHITECTURE__ "m68k"
-#endif
-  int version;
-  version=`(hostinfo | sed -n 's/.*NeXT Mach \([0-9]*\).*/\1/p') 2>/dev/null`;
-  if (version < 4)
-    printf ("%s-next-nextstep%d\n", __ARCHITECTURE__, version);
-  else
-    printf ("%s-next-openstep%d\n", __ARCHITECTURE__, version);
-  exit (0);
-#endif
-
-#if defined (MULTIMAX) || defined (n16)
-#if defined (UMAXV)
-  printf ("ns32k-encore-sysv\n"); exit (0);
-#else
-#if defined (CMU)
-  printf ("ns32k-encore-mach\n"); exit (0);
-#else
-  printf ("ns32k-encore-bsd\n"); exit (0);
-#endif
-#endif
-#endif
-
-#if defined (__386BSD__)
-  printf ("i386-pc-bsd\n"); exit (0);
-#endif
-
-#if defined (sequent)
-#if defined (i386)
-  printf ("i386-sequent-dynix\n"); exit (0);
-#endif
-#if defined (ns32000)
-  printf ("ns32k-sequent-dynix\n"); exit (0);
-#endif
-#endif
-
-#if defined (_SEQUENT_)
-    struct utsname un;
-
-    uname(&un);
-
-    if (strncmp(un.version, "V2", 2) == 0) {
-	printf ("i386-sequent-ptx2\n"); exit (0);
-    }
-    if (strncmp(un.version, "V1", 2) == 0) { /* XXX is V1 correct? */
-	printf ("i386-sequent-ptx1\n"); exit (0);
-    }
-    printf ("i386-sequent-ptx\n"); exit (0);
-
-#endif
-
-#if defined (vax)
-# if !defined (ultrix)
-#  include <sys/param.h>
-#  if defined (BSD)
-#   if BSD == 43
-      printf ("vax-dec-bsd4.3\n"); exit (0);
-#   else
-#    if BSD == 199006
-      printf ("vax-dec-bsd4.3reno\n"); exit (0);
-#    else
-      printf ("vax-dec-bsd\n"); exit (0);
-#    endif
-#   endif
-#  else
-    printf ("vax-dec-bsd\n"); exit (0);
-#  endif
-# else
-    printf ("vax-dec-ultrix\n"); exit (0);
-# endif
-#endif
-
-#if defined (alliant) && defined (i860)
-  printf ("i860-alliant-bsd\n"); exit (0);
-#endif
-
-  exit (1);
-}
-EOF
-
-$CC_FOR_BUILD -o $dummy $dummy.c 2>/dev/null && SYSTEM_NAME=`$dummy` &&
-	{ echo "$SYSTEM_NAME"; exit; }
-
-# Apollos put the system type in the environment.
-
-test -d /usr/apollo && { echo ${ISP}-apollo-${SYSTYPE}; exit; }
-
-# Convex versions that predate uname can use getsysinfo(1)
-
-if [ -x /usr/convex/getsysinfo ]
-then
-    case `getsysinfo -f cpu_type` in
-    c1*)
-	echo c1-convex-bsd
+    x86_64:VMkernel:*:*)
+	echo ${UNAME_MACHINE}-unknown-esx
 	exit ;;
-    c2*)
-	if getsysinfo -f scalar_acc
-	then echo c32-convex-bsd
-	else echo c2-convex-bsd
-	fi
-	exit ;;
-    c34*)
-	echo c34-convex-bsd
+    amd64:Isilon\ OneFS:*:*)
+	echo x86_64-unknown-onefs
 	exit ;;
-    c38*)
-	echo c38-convex-bsd
-	exit ;;
-    c4*)
-	echo c4-convex-bsd
-	exit ;;
-    esac
-fi
+esac
 
 cat >&2 <<EOF
 $0: unable to guess system type
@@ -1480,9 +1412,9 @@
 the operating system you are using. It is advised that you
 download the most up to date version of the config scripts from
 
-  http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.guess;hb=HEAD
+  http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.guess
 and
-  http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.sub;hb=HEAD
+  http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.sub
 
 If the version you run ($0) is already up to date, please
 send the following data and any information you think might be
diff -Naur ruby-2.0.0-p648/tool/config.sub ruby-2.0.0-p648+ppc64le/tool/config.sub
--- ruby-2.0.0-p648/tool/config.sub	2012-01-29 13:50:18.000000000 +0000
+++ ruby-2.0.0-p648+ppc64le/tool/config.sub	2016-04-15 06:09:29.352405386 +0000
@@ -1,38 +1,31 @@
 #! /bin/sh
 # Configuration validation subroutine script.
-#   Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999,
-#   2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010,
-#   2011 Free Software Foundation, Inc.
-
-timestamp='2011-11-11'
-
-# This file is (in principle) common to ALL GNU software.
-# The presence of a machine in this file suggests that SOME GNU software
-# can handle that machine.  It does not imply ALL GNU software can.
-#
-# This file is free software; you can redistribute it and/or modify
-# it under the terms of the GNU General Public License as published by
-# the Free Software Foundation; either version 2 of the License, or
+#   Copyright 1992-2016 Free Software Foundation, Inc.
+
+timestamp='2016-03-30'
+
+# This file is free software; you can redistribute it and/or modify it
+# under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 3 of the License, or
 # (at your option) any later version.
 #
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-# GNU General Public License for more details.
+# This program is distributed in the hope that it will be useful, but
+# WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+# General Public License for more details.
 #
 # You should have received a copy of the GNU General Public License
-# along with this program; if not, write to the Free Software
-# Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA
-# 02110-1301, USA.
+# along with this program; if not, see <http://www.gnu.org/licenses/>.
 #
 # As a special exception to the GNU General Public License, if you
 # distribute this file as part of a program that contains a
 # configuration script generated by Autoconf, you may include it under
-# the same distribution terms that you use for the rest of that program.
+# the same distribution terms that you use for the rest of that
+# program.  This Exception is an additional permission under section 7
+# of the GNU General Public License, version 3 ("GPLv3").
 
 
-# Please send patches to <config-patches@gnu.org>.  Submit a context
-# diff and a properly formatted GNU ChangeLog entry.
+# Please send patches to <config-patches@gnu.org>.
 #
 # Configuration subroutine to validate and canonicalize a configuration type.
 # Supply the specified configuration type as an argument.
@@ -40,7 +33,7 @@
 # Otherwise, we print the canonical config type on stdout and succeed.
 
 # You can get the latest version of this script from:
-# http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.sub;hb=HEAD
+# http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.sub
 
 # This file is supposed to be the same for all GNU packages
 # and recognize all the CPU types, system types and aliases
@@ -60,8 +53,7 @@
 me=`echo "$0" | sed -e 's,.*/,,'`
 
 usage="\
-Usage: $0 [OPTION] CPU-MFR-OPSYS
-       $0 [OPTION] ALIAS
+Usage: $0 [OPTION] CPU-MFR-OPSYS or ALIAS
 
 Canonicalize a configuration name.
 
@@ -75,9 +67,7 @@
 version="\
 GNU config.sub ($timestamp)
 
-Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000,
-2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free
-Software Foundation, Inc.
+Copyright 1992-2016 Free Software Foundation, Inc.
 
 This is free software; see the source for copying conditions.  There is NO
 warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE."
@@ -125,13 +115,17 @@
 maybe_os=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\2/'`
 case $maybe_os in
   nto-qnx* | linux-gnu* | linux-android* | linux-dietlibc | linux-newlib* | \
-  linux-uclibc* | uclinux-uclibc* | uclinux-gnu* | kfreebsd*-gnu* | \
-  knetbsd*-gnu* | netbsd*-gnu* | \
+  linux-musl* | linux-uclibc* | uclinux-uclibc* | uclinux-gnu* | kfreebsd*-gnu* | \
+  knetbsd*-gnu* | netbsd*-gnu* | netbsd*-eabi* | \
   kopensolaris*-gnu* | \
   storm-chaos* | os2-emx* | rtmk-nova*)
     os=-$maybe_os
     basic_machine=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'`
     ;;
+  android-linux)
+    os=-linux-android
+    basic_machine=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'`-unknown
+    ;;
   *)
     basic_machine=`echo $1 | sed 's/-[^-]*$//'`
     if [ $basic_machine != $1 ]
@@ -154,7 +148,7 @@
 	-convergent* | -ncr* | -news | -32* | -3600* | -3100* | -hitachi* |\
 	-c[123]* | -convex* | -sun | -crds | -omron* | -dg | -ultra | -tti* | \
 	-harris | -dolphin | -highlevel | -gould | -cbm | -ns | -masscomp | \
-	-apple | -axis | -knuth | -cray | -microblaze)
+	-apple | -axis | -knuth | -cray | -microblaze*)
 		os=
 		basic_machine=$1
 		;;
@@ -223,6 +217,12 @@
 	-isc*)
 		basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
 		;;
+	-lynx*178)
+		os=-lynxos178
+		;;
+	-lynx*5)
+		os=-lynxos5
+		;;
 	-lynx*)
 		os=-lynxos
 		;;
@@ -247,24 +247,29 @@
 	# Some are omitted here because they have special meanings below.
 	1750a | 580 \
 	| a29k \
+	| aarch64 | aarch64_be \
 	| alpha | alphaev[4-8] | alphaev56 | alphaev6[78] | alphapca5[67] \
 	| alpha64 | alpha64ev[4-8] | alpha64ev56 | alpha64ev6[78] | alpha64pca5[67] \
 	| am33_2.0 \
-	| arc | arm | arm[bl]e | arme[lb] | armv[2345] | armv[345][lb] | avr | avr32 \
-        | be32 | be64 \
+	| arc | arceb \
+	| arm | arm[bl]e | arme[lb] | armv[2-8] | armv[3-8][lb] | armv7[arm] \
+	| avr | avr32 \
+	| ba \
+	| be32 | be64 \
 	| bfin \
-	| c4x | clipper \
+	| c4x | c8051 | clipper \
 	| d10v | d30v | dlx | dsp16xx \
-	| epiphany \
-	| fido | fr30 | frv \
+	| e2k | epiphany \
+	| fido | fr30 | frv | ft32 \
 	| h8300 | h8500 | hppa | hppa1.[01] | hppa2.0 | hppa2.0[nw] | hppa64 \
 	| hexagon \
 	| i370 | i860 | i960 | ia64 \
 	| ip2k | iq2000 \
+	| k1om \
 	| le32 | le64 \
 	| lm32 \
 	| m32c | m32r | m32rle | m68000 | m68k | m88k \
-	| maxq | mb | microblaze | mcore | mep | metag \
+	| maxq | mb | microblaze | microblazeel | mcore | mep | metag \
 	| mips | mipsbe | mipseb | mipsel | mipsle \
 	| mips16 \
 	| mips64 | mips64el \
@@ -278,26 +283,29 @@
 	| mips64vr5900 | mips64vr5900el \
 	| mipsisa32 | mipsisa32el \
 	| mipsisa32r2 | mipsisa32r2el \
+	| mipsisa32r6 | mipsisa32r6el \
 	| mipsisa64 | mipsisa64el \
 	| mipsisa64r2 | mipsisa64r2el \
+	| mipsisa64r6 | mipsisa64r6el \
 	| mipsisa64sb1 | mipsisa64sb1el \
 	| mipsisa64sr71k | mipsisa64sr71kel \
+	| mipsr5900 | mipsr5900el \
 	| mipstx39 | mipstx39el \
 	| mn10200 | mn10300 \
 	| moxie \
 	| mt \
 	| msp430 \
 	| nds32 | nds32le | nds32be \
-	| nios | nios2 \
+	| nios | nios2 | nios2eb | nios2el \
 	| ns16k | ns32k \
-	| open8 \
-	| or32 \
+	| open8 | or1k | or1knd | or32 \
 	| pdp10 | pdp11 | pj | pjl \
 	| powerpc | powerpc64 | powerpc64le | powerpcle \
 	| pyramid \
+	| riscv32 | riscv64 \
 	| rl78 | rx \
 	| score \
-	| sh | sh[1234] | sh[24]a | sh[24]aeb | sh[23]e | sh[34]eb | sheb | shbe | shle | sh[1234]le | sh3ele \
+	| sh | sh[1234] | sh[24]a | sh[24]aeb | sh[23]e | sh[234]eb | sheb | shbe | shle | sh[1234]le | sh3ele \
 	| sh64 | sh64le \
 	| sparc | sparc64 | sparc64b | sparc64v | sparc86x | sparclet | sparclite \
 	| sparcv8 | sparcv9 | sparcv9b | sparcv9v \
@@ -305,6 +313,7 @@
 	| tahoe | tic4x | tic54x | tic55x | tic6x | tic80 | tron \
 	| ubicom32 \
 	| v850 | v850e | v850e1 | v850e2 | v850es | v850e2v3 \
+	| visium \
 	| we32k \
 	| x86 | xc16x | xstormy16 | xtensa \
 	| z8k | z80)
@@ -319,8 +328,10 @@
 	c6x)
 		basic_machine=tic6x-unknown
 		;;
-	m6811 | m68hc11 | m6812 | m68hc12 | picochip)
-		# Motorola 68HC11/12.
+	leon|leon[3-9])
+		basic_machine=sparc-$basic_machine
+		;;
+	m6811 | m68hc11 | m6812 | m68hc12 | m68hcs12x | nvptx | picochip)
 		basic_machine=$basic_machine-unknown
 		os=-none
 		;;
@@ -333,7 +344,10 @@
 	strongarm | thumb | xscale)
 		basic_machine=arm-unknown
 		;;
-
+	xgate)
+		basic_machine=$basic_machine-unknown
+		os=-none
+		;;
 	xscaleeb)
 		basic_machine=armeb-unknown
 		;;
@@ -356,28 +370,32 @@
 	# Recognize the basic CPU types with company name.
 	580-* \
 	| a29k-* \
+	| aarch64-* | aarch64_be-* \
 	| alpha-* | alphaev[4-8]-* | alphaev56-* | alphaev6[78]-* \
 	| alpha64-* | alpha64ev[4-8]-* | alpha64ev56-* | alpha64ev6[78]-* \
-	| alphapca5[67]-* | alpha64pca5[67]-* | arc-* \
+	| alphapca5[67]-* | alpha64pca5[67]-* | arc-* | arceb-* \
 	| arm-*  | armbe-* | armle-* | armeb-* | armv*-* \
 	| avr-* | avr32-* \
+	| ba-* \
 	| be32-* | be64-* \
 	| bfin-* | bs2000-* \
 	| c[123]* | c30-* | [cjt]90-* | c4x-* \
-	| clipper-* | craynv-* | cydra-* \
+	| c8051-* | clipper-* | craynv-* | cydra-* \
 	| d10v-* | d30v-* | dlx-* \
-	| elxsi-* \
+	| e2k-* | elxsi-* \
 	| f30[01]-* | f700-* | fido-* | fr30-* | frv-* | fx80-* \
 	| h8300-* | h8500-* \
 	| hppa-* | hppa1.[01]-* | hppa2.0-* | hppa2.0[nw]-* | hppa64-* \
 	| hexagon-* \
 	| i*86-* | i860-* | i960-* | ia64-* \
 	| ip2k-* | iq2000-* \
+	| k1om-* \
 	| le32-* | le64-* \
 	| lm32-* \
 	| m32c-* | m32r-* | m32rle-* \
 	| m68000-* | m680[012346]0-* | m68360-* | m683?2-* | m68k-* \
-	| m88110-* | m88k-* | maxq-* | mcore-* | metag-* | microblaze-* \
+	| m88110-* | m88k-* | maxq-* | mcore-* | metag-* \
+	| microblaze-* | microblazeel-* \
 	| mips-* | mipsbe-* | mipseb-* | mipsel-* | mipsle-* \
 	| mips16-* \
 	| mips64-* | mips64el-* \
@@ -391,28 +409,33 @@
 	| mips64vr5900-* | mips64vr5900el-* \
 	| mipsisa32-* | mipsisa32el-* \
 	| mipsisa32r2-* | mipsisa32r2el-* \
+	| mipsisa32r6-* | mipsisa32r6el-* \
 	| mipsisa64-* | mipsisa64el-* \
 	| mipsisa64r2-* | mipsisa64r2el-* \
+	| mipsisa64r6-* | mipsisa64r6el-* \
 	| mipsisa64sb1-* | mipsisa64sb1el-* \
 	| mipsisa64sr71k-* | mipsisa64sr71kel-* \
+	| mipsr5900-* | mipsr5900el-* \
 	| mipstx39-* | mipstx39el-* \
 	| mmix-* \
 	| mt-* \
 	| msp430-* \
 	| nds32-* | nds32le-* | nds32be-* \
-	| nios-* | nios2-* \
+	| nios-* | nios2-* | nios2eb-* | nios2el-* \
 	| none-* | np1-* | ns16k-* | ns32k-* \
 	| open8-* \
+	| or1k*-* \
 	| orion-* \
 	| pdp10-* | pdp11-* | pj-* | pjl-* | pn-* | power-* \
 	| powerpc-* | powerpc64-* | powerpc64le-* | powerpcle-* \
 	| pyramid-* \
+	| riscv32-* | riscv64-* \
 	| rl78-* | romp-* | rs6000-* | rx-* \
 	| sh-* | sh[1234]-* | sh[24]a-* | sh[24]aeb-* | sh[23]e-* | sh[34]eb-* | sheb-* | shbe-* \
 	| shle-* | sh[1234]le-* | sh3ele-* | sh64-* | sh64le-* \
 	| sparc-* | sparc64-* | sparc64b-* | sparc64v-* | sparc86x-* | sparclet-* \
 	| sparclite-* \
-	| sparcv8-* | sparcv9-* | sparcv9b-* | sparcv9v-* | sv1-* | sx?-* \
+	| sparcv8-* | sparcv9-* | sparcv9b-* | sparcv9v-* | sv1-* | sx*-* \
 	| tahoe-* \
 	| tic30-* | tic4x-* | tic54x-* | tic55x-* | tic6x-* | tic80-* \
 	| tile*-* \
@@ -420,6 +443,7 @@
 	| ubicom32-* \
 	| v850-* | v850e-* | v850e1-* | v850es-* | v850e2-* | v850e2v3-* \
 	| vax-* \
+	| visium-* \
 	| we32k-* \
 	| x86-* | x86_64-* | xc16x-* | xps100-* \
 	| xstormy16-* | xtensa*-* \
@@ -496,6 +520,9 @@
 		basic_machine=i386-pc
 		os=-aros
 		;;
+	asmjs)
+		basic_machine=asmjs-unknown
+		;;
 	aux)
 		basic_machine=m68k-apple
 		os=-aux
@@ -719,7 +746,6 @@
 	i370-ibm* | ibm*)
 		basic_machine=i370-ibm
 		;;
-# I'm not sure what "Sysv32" means.  Should this be sysv3.2?
 	i*86v32)
 		basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'`
 		os=-sysv32
@@ -758,6 +784,9 @@
 		basic_machine=m68k-isi
 		os=-sysv
 		;;
+	leon-*|leon[3-9]-*)
+		basic_machine=sparc-`echo $basic_machine | sed 's/-.*//'`
+		;;
 	m68knommu)
 		basic_machine=m68k-unknown
 		os=-linux
@@ -777,11 +806,15 @@
 		basic_machine=ns32k-utek
 		os=-sysv
 		;;
-	microblaze)
+	microblaze*)
 		basic_machine=microblaze-xilinx
 		;;
+	mingw64)
+		basic_machine=x86_64-pc
+		os=-mingw64
+		;;
 	mingw32)
-		basic_machine=i386-pc
+		basic_machine=i686-pc
 		os=-mingw32
 		;;
 	mingw32ce)
@@ -809,6 +842,10 @@
 		basic_machine=powerpc-unknown
 		os=-morphos
 		;;
+	moxiebox)
+		basic_machine=moxie-unknown
+		os=-moxiebox
+		;;
 	msdos)
 		basic_machine=i386-pc
 		os=-msdos
@@ -817,7 +854,7 @@
 		basic_machine=`echo $basic_machine | sed -e 's/ms1-/mt-/'`
 		;;
 	msys)
-		basic_machine=i386-pc
+		basic_machine=i686-pc
 		os=-msys
 		;;
 	mvs)
@@ -1008,7 +1045,11 @@
 		basic_machine=i586-unknown
 		os=-pw32
 		;;
-	rdos)
+	rdos | rdos64)
+		basic_machine=x86_64-pc
+		os=-rdos
+		;;
+	rdos32)
 		basic_machine=i386-pc
 		os=-rdos
 		;;
@@ -1335,29 +1376,30 @@
 	-gnu* | -bsd* | -mach* | -minix* | -genix* | -ultrix* | -irix* \
 	      | -*vms* | -sco* | -esix* | -isc* | -aix* | -cnk* | -sunos | -sunos[34]*\
 	      | -hpux* | -unos* | -osf* | -luna* | -dgux* | -auroraux* | -solaris* \
-	      | -sym* | -kopensolaris* \
+	      | -sym* | -kopensolaris* | -plan9* \
 	      | -amigaos* | -amigados* | -msdos* | -newsos* | -unicos* | -aof* \
-	      | -aos* | -aros* \
+	      | -aos* | -aros* | -cloudabi* | -sortix* \
 	      | -nindy* | -vxsim* | -vxworks* | -ebmon* | -hms* | -mvs* \
 	      | -clix* | -riscos* | -uniplus* | -iris* | -rtu* | -xenix* \
 	      | -hiux* | -386bsd* | -knetbsd* | -mirbsd* | -netbsd* \
-	      | -openbsd* | -solidbsd* \
+	      | -bitrig* | -openbsd* | -solidbsd* | -libertybsd* \
 	      | -ekkobsd* | -kfreebsd* | -freebsd* | -riscix* | -lynxos* \
 	      | -bosx* | -nextstep* | -cxux* | -aout* | -elf* | -oabi* \
 	      | -ptx* | -coff* | -ecoff* | -winnt* | -domain* | -vsta* \
 	      | -udi* | -eabi* | -lites* | -ieee* | -go32* | -aux* \
 	      | -chorusos* | -chorusrdb* | -cegcc* \
 	      | -cygwin* | -msys* | -pe* | -psos* | -moss* | -proelf* | -rtems* \
-	      | -mingw32* | -linux-gnu* | -linux-android* \
-	      | -linux-newlib* | -linux-uclibc* \
-	      | -uxpv* | -beos* | -mpeix* | -udk* \
+	      | -mingw32* | -mingw64* | -linux-gnu* | -linux-android* \
+	      | -linux-newlib* | -linux-musl* | -linux-uclibc* \
+	      | -uxpv* | -beos* | -mpeix* | -udk* | -moxiebox* \
 	      | -interix* | -uwin* | -mks* | -rhapsody* | -darwin* | -opened* \
 	      | -openstep* | -oskit* | -conix* | -pw32* | -nonstopux* \
 	      | -storm-chaos* | -tops10* | -tenex* | -tops20* | -its* \
 	      | -os2* | -vos* | -palmos* | -uclinux* | -nucleus* \
 	      | -morphos* | -superux* | -rtmk* | -rtmk-nova* | -windiss* \
 	      | -powermax* | -dnix* | -nx6 | -nx7 | -sei* | -dragonfly* \
-	      | -skyos* | -haiku* | -rdos* | -toppers* | -drops* | -es*)
+	      | -skyos* | -haiku* | -rdos* | -toppers* | -drops* | -es* \
+	      | -onefs* | -tirtos*)
 	# Remember, each alternative MUST END IN *, to match a version number.
 		;;
 	-qnx*)
@@ -1481,9 +1523,6 @@
 	-aros*)
 		os=-aros
 		;;
-	-kaos*)
-		os=-kaos
-		;;
 	-zvmoe)
 		os=-zvmoe
 		;;
@@ -1492,6 +1531,8 @@
 		;;
 	-nacl*)
 		;;
+	-ios)
+		;;
 	-none)
 		;;
 	*)
@@ -1532,6 +1573,12 @@
 	c4x-* | tic4x-*)
 		os=-coff
 		;;
+	c8051-*)
+		os=-elf
+		;;
+	hexagon-*)
+		os=-elf
+		;;
 	tic54x-*)
 		os=-coff
 		;;
@@ -1559,9 +1606,6 @@
 		;;
 	m68000-sun)
 		os=-sunos3
-		# This also exists in the configure program, but was not the
-		# default.
-		# os=-sunos4
 		;;
 	m68*-cisco)
 		os=-aout
patches/ruby/2.0.0/static.patch000066400000000462147511530510012127 0ustar00--- trunk/ext/extmk.rb  2013/05/28 02:30:13 40973
+++ trunk/ext/extmk.rb  2013/07/28 11:10:52 42213
@@ -227,7 +227,7 @@
         f.rewind
         f.print(s)
         f.truncate(f.pos)
-      end
+      end unless $static
     else
       open(makefile, "wb") do |f|
         f.puts "# " + DUMMY_SIGNATURE
patches/ruby/2.0.0/broken_stack_protector.patch000066400000001103147511530510015377 0ustar00--- trunk/configure 2013-06-27 13:16:17.000000000 +0200
+++ trunk/configure 2013-09-08 20:47:28.911451551 +0200
@@ -7424,7 +7424,7 @@
   unset ac_c_werror_flag
 fi

- if test "x$stack_protector" = xyes; then
+ if test "x$stack_protector" = xnotbroken; then

     save_LDFLAGS="$LDFLAGS"
     LDFLAGS="$LDFLAGS -fstack-protector"
@@ -7475,7 +7475,7 @@
  fi
      ;;
 esac
-    if test "x$stack_protector" = xyes; then
+    if test "x$stack_protector" = xnotbroken; then
  # RUBY_APPEND_OPTION(XCFLAGS, -fstack-protector)
  case " ${XCFLAGS-} " in #(
   *' -fstack-protector '*) :
patches/ruby/2.0.0/43449.patch000066400000000772147511530510011333 0ustar00Index: load.c
===================================================================
--- a/load.c	(revision 43448)
+++ b/load.c	(revision 43449)
@@ -1013,9 +1013,11 @@
 {
     char* const lock_key = load_lock(name);
     if (lock_key) {
+	VALUE feature = rb_usascii_str_new_cstr(name);
+	OBJ_FREEZE(feature);
 	rb_vm_call_cfunc(rb_vm_top_self(), init_ext_call, (VALUE)init,
-			 0, rb_str_new2(name));
-	rb_provide(name);
+			 0, feature);
+	rb_provide_feature(feature);
 	load_unlock(lock_key, 1);
     }
 }
patches/ruby/2.3.3/random_c_using_NR_prefix.patch000066400000001011147511530510015600 0ustar00--- a/random.c
+++ b/random.c
@@ -521,7 +521,7 @@
     CryptGenRandom(prov, size, seed);
     return 0;
 }
-#elif defined __linux__ && defined SYS_getrandom
+#elif defined __linux__ && defined __NR_getrandom
 #include <linux/random.h>

 # ifndef GRND_NONBLOCK
@@ -538,7 +538,7 @@
 	if (!need_secure)
 	    flags = GRND_NONBLOCK;
 	errno = 0;
-	ret = syscall(SYS_getrandom, seed, size, flags);
+	ret = syscall(__NR_getrandom, seed, size, flags);
 	if (errno == ENOSYS) {
 	    ATOMIC_SET(try_syscall, 0);
 	    return -1;
patches/ruby/2.2.4/fix_installing_bundled_gems.patch000066400000002214147511530510016365 0ustar00--- a/tool/rbinstall.rb
+++ b/tool/rbinstall.rb
@@ -719,15 +719,15 @@ install?(:ext, :comm, :gem) do
     directories = Gem.ensure_gem_subdirectories(gem_dir, :mode => $dir_mode)
     prepare "bundle gems", gem_dir, directories
     Dir.glob(srcdir+'/gems/*.gem').each do |gem|
-      Gem.install gem, Gem::Requirement.default, :install_dir => with_destdir(Gem.dir), :domain => :local, :ignore_dependencies => true
+      Gem.install gem, Gem::Requirement.default, :install_dir => with_destdir(gem_dir), :domain => :local, :ignore_dependencies => true
       gemname = Pathname(gem).basename
       puts "#{" "*30}#{gemname}"
     end
     # fix directory permissions
     # TODO: Gem.install should accept :dir_mode option or something
-    File.chmod($dir_mode, *Dir.glob(with_destdir(Gem.dir)+"/**/"))
+    File.chmod($dir_mode, *Dir.glob(with_destdir(gem_dir)+"/**/"))
     # fix .gemspec permissions
-    File.chmod($data_mode, *Dir.glob(with_destdir(Gem.dir)+"/specifications/*.gemspec"))
+    File.chmod($data_mode, *Dir.glob(with_destdir(gem_dir)+"/specifications/*.gemspec"))
   else
     puts "skip installing bundle gems because of lacking zlib"
   end
patches/ruby/2.2.4/openssl3.patch000066400000002126147511530510012413 0ustar00diff --git a/ext/openssl/extconf.rb b/ext/openssl/extconf.rb
index 8c04cb5..132d803 100644
--- a/ext/openssl/extconf.rb
+++ b/ext/openssl/extconf.rb
@@ -104,6 +104,9 @@
 have_func("SSLv2_method")
 have_func("SSLv2_server_method")
 have_func("SSLv2_client_method")
+have_func("SSLv3_method")
+have_func("SSLv3_server_method")
+have_func("SSLv3_client_method")
 have_func("TLSv1_1_method")
 have_func("TLSv1_1_server_method")
 have_func("TLSv1_1_client_method")
diff --git a/ext/openssl/ossl_ssl.c b/ext/openssl/ossl_ssl.c
index f7cb7f0..47111f6 100644
--- a/ext/openssl/ossl_ssl.c
+++ b/ext/openssl/ossl_ssl.c
@@ -109,9 +109,12 @@ static const struct {
     OSSL_SSL_METHOD_ENTRY(SSLv2_server),
     OSSL_SSL_METHOD_ENTRY(SSLv2_client),
 #endif
+#if defined(HAVE_SSLV3_METHOD) && defined(HAVE_SSLV3_SERVER_METHOD) && \
+        defined(HAVE_SSLV3_CLIENT_METHOD)
     OSSL_SSL_METHOD_ENTRY(SSLv3),
     OSSL_SSL_METHOD_ENTRY(SSLv3_server),
     OSSL_SSL_METHOD_ENTRY(SSLv3_client),
+#endif
     OSSL_SSL_METHOD_ENTRY(SSLv23),
     OSSL_SSL_METHOD_ENTRY(SSLv23_server),
     OSSL_SSL_METHOD_ENTRY(SSLv23_client),
patches/ruby/2.3.1/random_c_using_NR_prefix.patch000066400000001011147511530510015576 0ustar00--- a/random.c
+++ b/random.c
@@ -521,7 +521,7 @@
     CryptGenRandom(prov, size, seed);
     return 0;
 }
-#elif defined __linux__ && defined SYS_getrandom
+#elif defined __linux__ && defined __NR_getrandom
 #include <linux/random.h>

 # ifndef GRND_NONBLOCK
@@ -538,7 +538,7 @@
 	if (!need_secure)
 	    flags = GRND_NONBLOCK;
 	errno = 0;
-	ret = syscall(SYS_getrandom, seed, size, flags);
+	ret = syscall(__NR_getrandom, seed, size, flags);
 	if (errno == ENOSYS) {
 	    ATOMIC_SET(try_syscall, 0);
 	    return -1;
patches/ruby/2.3.1/fix_resolv_kernel32_dll.patch000066400000000445147511530510015365 0ustar00--- a/ext/win32/lib/win32/resolv.rb
+++ b/ext/win32/lib/win32/resolv.rb
@@ -36,7 +36,7 @@
 
 module Kernel32
   extend Importer
-  dlload "kernel32"
+  dlload "kernel32.dll"
 end
 getv = Kernel32.extern "int GetVersionExA(void *)", :stdcall
 info = [ 148, 0, 0, 0, 0 ].pack('V5') + "\0" * 128
patches/ruby/2.2.6/fix_installing_bundled_gems.patch000066400000002214147511530510016367 0ustar00--- a/tool/rbinstall.rb
+++ b/tool/rbinstall.rb
@@ -719,15 +719,15 @@ install?(:ext, :comm, :gem) do
     directories = Gem.ensure_gem_subdirectories(gem_dir, :mode => $dir_mode)
     prepare "bundle gems", gem_dir, directories
     Dir.glob(srcdir+'/gems/*.gem').each do |gem|
-      Gem.install gem, Gem::Requirement.default, :install_dir => with_destdir(Gem.dir), :domain => :local, :ignore_dependencies => true
+      Gem.install gem, Gem::Requirement.default, :install_dir => with_destdir(gem_dir), :domain => :local, :ignore_dependencies => true
       gemname = Pathname(gem).basename
       puts "#{" "*30}#{gemname}"
     end
     # fix directory permissions
     # TODO: Gem.install should accept :dir_mode option or something
-    File.chmod($dir_mode, *Dir.glob(with_destdir(Gem.dir)+"/**/"))
+    File.chmod($dir_mode, *Dir.glob(with_destdir(gem_dir)+"/**/"))
     # fix .gemspec permissions
-    File.chmod($data_mode, *Dir.glob(with_destdir(Gem.dir)+"/specifications/*.gemspec"))
+    File.chmod($data_mode, *Dir.glob(with_destdir(gem_dir)+"/specifications/*.gemspec"))
   else
     puts "skip installing bundle gems because of lacking zlib"
   end
patches/ruby/2.1.5/openssl3.patch000066400000003333147511530510012414 0ustar00diff --git a/ext/openssl/extconf.rb b/ext/openssl/extconf.rb
index 8c04cb5..132d803 100644
--- a/ext/openssl/extconf.rb
+++ b/ext/openssl/extconf.rb
@@ -104,6 +104,9 @@
 have_func("SSLv2_method")
 have_func("SSLv2_server_method")
 have_func("SSLv2_client_method")
+have_func("SSLv3_method")
+have_func("SSLv3_server_method")
+have_func("SSLv3_client_method")
 have_func("TLSv1_1_method")
 have_func("TLSv1_1_server_method")
 have_func("TLSv1_1_client_method")
diff --git a/ext/openssl/ossl_ssl.c b/ext/openssl/ossl_ssl.c
index f7cb7f0..47111f6 100644
--- a/ext/openssl/ossl_ssl.c
+++ b/ext/openssl/ossl_ssl.c
@@ -109,9 +109,12 @@ static const struct {
     OSSL_SSL_METHOD_ENTRY(SSLv2_server),
     OSSL_SSL_METHOD_ENTRY(SSLv2_client),
 #endif
+#if defined(HAVE_SSLV3_METHOD) && defined(HAVE_SSLV3_SERVER_METHOD) && \
+        defined(HAVE_SSLV3_CLIENT_METHOD)
     OSSL_SSL_METHOD_ENTRY(SSLv3),
     OSSL_SSL_METHOD_ENTRY(SSLv3_server),
     OSSL_SSL_METHOD_ENTRY(SSLv3_client),
+#endif
     OSSL_SSL_METHOD_ENTRY(SSLv23),
     OSSL_SSL_METHOD_ENTRY(SSLv23_server),
     OSSL_SSL_METHOD_ENTRY(SSLv23_client),
diff --git a/test/openssl/test_ssl.rb b/test/openssl/test_ssl.rb
index 07e081b..0cbfcba 100644
--- a/test/openssl/test_ssl.rb
+++ b/test/openssl/test_ssl.rb
@@ -912,7 +912,7 @@ def test_unset_OP_ALL
   # that has been marked as forbidden, therefore either of these may be raised
   HANDSHAKE_ERRORS = [OpenSSL::SSL::SSLError, Errno::ECONNRESET]

-if OpenSSL::SSL::SSLContext::METHODS.include? :TLSv1
+if OpenSSL::SSL::SSLContext::METHODS.include?(:TLSv1) && OpenSSL::SSL::SSLContext::METHODS.include?(:SSLv3)

   def test_forbid_ssl_v3_for_client
     ctx_proc = Proc.new { |ctx| ctx.options = OpenSSL::SSL::OP_ALL | OpenSSL::SSL::OP_NO_SSLv3 }
patches/ruby/1.9.3/support_joke.patch000066400000000327147511530510013377 0ustar00--- a/vm_opts.h
+++ b/vm_opts.h
@@ -46,6 +46,6 @@
 #define OPT_STACK_CACHING            0
 
 /* misc */
-#define SUPPORT_JOKE                 0
+#define SUPPORT_JOKE                 1
 
 #endif /* RUBY_VM_OPTS_H */
patches/ruby/1.9.3/p125/xcode-debugopt-fix-r34840.diff000066400000002344147511530510015513 0ustar00Shared library config fix for MacOS X to make Ruby 1.9.3-p125 with XCode 4.3.x
happy.

https://bugs.ruby-lang.org/issues/6080

--- trunk/configure.in	2012/02/28 01:30:15	34839
+++ trunk/configure.in	2012/02/28 02:44:52	34840
@@ -289,12 +289,10 @@
 if test "$GCC" = yes; then
     linker_flag=-Wl,
     : ${optflags=-O3}
-    AS_CASE(["$target_os"], [linux*|darwin*], [: ${debugflags=-ggdb}])
     RUBY_APPEND_OPTIONS(XCFLAGS, ["-include ruby/config.h" "-include ruby/missing.h"])
 else
     linker_flag=
 fi
-test $ac_cv_prog_cc_g = yes && : ${debugflags=-g}
 
 RUBY_PROG_GNU_LD
 RUBY_CPPOUTFILE
@@ -490,6 +488,9 @@
     warnflags=
 fi
 if test "$GCC" = yes; then
+    test "${debugflags+set}" || {RUBY_TRY_CFLAGS(-ggdb, [debugflags=-ggdb])}
+    test "${debugflags+set}" || {RUBY_TRY_CFLAGS(-g3, [debugflags=-g3])}
+
     # -D_FORTIFY_SOURCE
     RUBY_TRY_CFLAGS(-D_FORTIFY_SOURCE=2, [RUBY_APPEND_OPTION(XCFLAGS, -D_FORTIFY_SOURCE=2)])
 
@@ -513,6 +514,7 @@
     # suppress annoying -Wstrict-overflow warnings
     RUBY_TRY_CFLAGS(-fno-strict-overflow, [RUBY_APPEND_OPTION(XCFLAGS, -fno-strict-overflow)])
 fi
+test $ac_cv_prog_cc_g = yes && : ${debugflags=-g}
 
 if test "$GCC" = ""; then
     AS_CASE(["$target_os"],[aix*],[warnflags="-qinfo=por"])
patches/ruby/1.9.3/p125/osx-arch-fix.patch000066400000000617147511530510013654 0ustar00diff --git a/Makefile.in b/Makefile.in
index 656ae90..f976cf1 100644
--- a/Makefile.in
+++ b/Makefile.in
@@ -45,7 +45,7 @@ XLDFLAGS = @XLDFLAGS@ $(EXTLDFLAGS)
 EXTLIBS = 
 LIBS = @LIBS@ $(EXTLIBS)
 MISSING = @LIBOBJS@ @ALLOCA@
-LDSHARED = @LIBRUBY_LDSHARED@
+LDSHARED = @LIBRUBY_LDSHARED@ $(LDFLAGS)
 DLDFLAGS = @LIBRUBY_DLDFLAGS@ $(EXTLDFLAGS) @ARCH_FLAG@
 SOLIBS = @SOLIBS@
 MAINLIBS = @MAINLIBS@
patches/ruby/1.9.3/p125/gcdata.patch000066400000007545147511530510012576 0ustar00--- a/gc.c	(revision 34957)
+++ b/gc.c	(working copy)
@@ -319,16 +319,12 @@
     struct gc_list *next;
 };
 
-#define CALC_EXACT_MALLOC_SIZE 0
-
 typedef struct rb_objspace {
     struct {
 	size_t limit;
 	size_t increase;
-#if CALC_EXACT_MALLOC_SIZE
 	size_t allocated_size;
 	size_t allocations;
-#endif
     } malloc_params;
     struct {
 	size_t increment;
@@ -730,10 +726,6 @@
     }
     if (size == 0) size = 1;
 
-#if CALC_EXACT_MALLOC_SIZE
-    size += sizeof(size_t);
-#endif
-
     if ((ruby_gc_stress && !ruby_disable_gc_stress) ||
 	(malloc_increase+size) > malloc_limit) {
 	garbage_collect_with_gvl(objspace);
@@ -747,12 +739,8 @@
 {
     malloc_increase += size;
 
-#if CALC_EXACT_MALLOC_SIZE
     objspace->malloc_params.allocated_size += size;
     objspace->malloc_params.allocations++;
-    ((size_t *)mem)[0] = size;
-    mem = (size_t *)mem + 1;
-#endif
 
     return mem;
 }
@@ -791,11 +779,7 @@
     if (ruby_gc_stress && !ruby_disable_gc_stress)
 	garbage_collect_with_gvl(objspace);
 
-#if CALC_EXACT_MALLOC_SIZE
-    size += sizeof(size_t);
     objspace->malloc_params.allocated_size -= size;
-    ptr = (size_t *)ptr - 1;
-#endif
 
     mem = realloc(ptr, size);
     if (!mem) {
@@ -808,11 +792,7 @@
     }
     malloc_increase += size;
 
-#if CALC_EXACT_MALLOC_SIZE
     objspace->malloc_params.allocated_size += size;
-    ((size_t *)mem)[0] = size;
-    mem = (size_t *)mem + 1;
-#endif
 
     return mem;
 }
@@ -820,14 +800,6 @@
 static void
 vm_xfree(rb_objspace_t *objspace, void *ptr)
 {
-#if CALC_EXACT_MALLOC_SIZE
-    size_t size;
-    ptr = ((size_t *)ptr) - 1;
-    size = ((size_t*)ptr)[0];
-    objspace->malloc_params.allocated_size -= size;
-    objspace->malloc_params.allocations--;
-#endif
-
     free(ptr);
 }
 
@@ -3401,7 +3373,6 @@
 }
 
 
-#if CALC_EXACT_MALLOC_SIZE
 /*
  *  call-seq:
  *     GC.malloc_allocated_size -> Integer
@@ -3411,8 +3382,8 @@
  *  It returns the allocated size by malloc().
  */
 
-static VALUE
-gc_malloc_allocated_size(VALUE self)
+VALUE
+rb_gc_malloc_allocated_size(VALUE self)
 {
     return UINT2NUM((&rb_objspace)->malloc_params.allocated_size);
 }
@@ -3426,12 +3397,11 @@
  *  It returns the number of allocated memory object by malloc().
  */
 
-static VALUE
-gc_malloc_allocations(VALUE self)
+VALUE
+rb_gc_malloc_allocations(VALUE self)
 {
     return UINT2NUM((&rb_objspace)->malloc_params.allocations);
 }
-#endif
 
 static VALUE
 gc_profile_record_get(void)
@@ -3616,6 +3586,8 @@
     rb_define_singleton_method(rb_mGC, "start", rb_gc_start, 0);
     rb_define_singleton_method(rb_mGC, "enable", rb_gc_enable, 0);
     rb_define_singleton_method(rb_mGC, "disable", rb_gc_disable, 0);
+    rb_define_singleton_method(rb_mGC, "malloc_allocated_size", rb_gc_malloc_allocated_size, 0);
+    rb_define_singleton_method(rb_mGC, "malloc_allocations", rb_gc_malloc_allocations, 0);
     rb_define_singleton_method(rb_mGC, "stress", gc_stress_get, 0);
     rb_define_singleton_method(rb_mGC, "stress=", gc_stress_set, 1);
     rb_define_singleton_method(rb_mGC, "count", gc_count, 0);
@@ -3630,6 +3602,7 @@
     rb_define_singleton_method(rb_mProfiler, "result", gc_profile_result, 0);
     rb_define_singleton_method(rb_mProfiler, "report", gc_profile_report, -1);
     rb_define_singleton_method(rb_mProfiler, "total_time", gc_profile_total_time, 0);
+    rb_define_singleton_method(rb_mProfiler, "data", gc_profile_record_get, 0);
 
     rb_mObSpace = rb_define_module("ObjectSpace");
     rb_define_module_function(rb_mObSpace, "each_object", os_each_obj, -1);
@@ -3649,9 +3622,4 @@
     rb_define_method(rb_mKernel, "object_id", rb_obj_id, 0);
 
     rb_define_module_function(rb_mObSpace, "count_objects", count_objects, -1);
-
-#if CALC_EXACT_MALLOC_SIZE
-    rb_define_singleton_method(rb_mGC, "malloc_allocated_size", gc_malloc_allocated_size, 0);
-    rb_define_singleton_method(rb_mGC, "malloc_allocations", gc_malloc_allocations, 0);
-#endif
 }
patches/ruby/1.9.3/p125/cflags.patch000066400000002231147511530510012575 0ustar00--- a/configure.in
+++ b/configure.in
@@ -267,11 +267,9 @@
     cflagspat="$cflagspat;s|"`eval echo '"'"${debugflags}"'"' | sed 's/[[][|.*]]/\\&/g;s/^ */ /;s/ *$/ /'`'| |g'
 test -z "warnflags" ||
     cflagspat="$cflagspat;s|"`eval echo '"'"${warnflags}"'"' | sed 's/[[][|.*]]/\\&/g;s/^ */ /;s/ *$/ /'`'| |g'
-if test -z "${CFLAGS+set}"; then
-    cflags=`echo " $cflags " | sed "$cflagspat;s/^ *//;s/ *$//"`
-    orig_cflags="$cflags"
-    cflags="$cflags "'${optflags} ${debugflags} ${warnflags}'
-fi
+cflags=`echo " $cflags " | sed "$cflagspat;s/^ *//;s/ *$//"`
+orig_cflags="$cflags"
+cflags="$cflags "'${optflags} ${debugflags} ${warnflags}'
 if test -z "${CXXFLAGS+set}"; then
     cxxflags=`echo " $cxxflags " | sed "$cflagspat;s/^ *//;s/ *$//"`
     orig_cxxflags="$cxxflags"
@@ -511,7 +509,8 @@
     ])
 fi

-test -z "${ac_env_CFLAGS_set}" -a -n "${cflags+set}" && eval CFLAGS="\"$cflags $ARCH_FLAG\""
+test -z "${ac_env_CFLAGS_set}" && CFLAGS="$ARCH_FLAG"
+test -n "${cflags:+set}" && eval CFLAGS="\"$cflags\${CFLAGS:+ $CFLAGS}\""
 test -z "${ac_env_CXXFLAGS_set}" -a -n "${cxxflags+set}" && eval CXXFLAGS="\"$cxxflags $ARCH_FLAG\""

 dnl check for large file stuff
patches/ruby/1.9.3/p125/debug.diff000066400000000734147511530510012243 0ustar00diff --git a/configure.in b/configure.in
index 5bc2e4e..52a5d19 100644
--- a/configure.in
+++ b/configure.in
@@ -493,7 +493,6 @@ if test "$GCC" = ""; then
     AS_CASE(["$target_os"],[aix*],[warnflags="-qinfo=por"])
 fi
 if test "$GCC" = yes; then
-    RUBY_TRY_CFLAGS(-fvisibility=hidden, [RUBY_APPEND_OPTION(XCFLAGS, -fvisibility=hidden)])
     AC_SUBST(WERRORFLAG, "-Werror")
     if test "$visibility_option" = yes; then
 	RUBY_APPEND_OPTION(XCFLAGS, -fvisibility=hidden)
patches/ruby/1.9.3/p125/falcon.patch000066400000363044147511530510012614 0ustar00diff --git a/Changelog.backport_gc b/Changelog.backport_gc
new file mode 100644
index 0000000..b617fc8
--- /dev/null
+++ b/Changelog.backport_gc
@@ -0,0 +1,128 @@
+Tue Jan 17 12:32:46 2012  Nobuyoshi Nakada  <nobu@ruby-lang.org>
+
+	* gc.c (aligned_malloc, aligned_free): covered missing defined
+	  operators and fixes for cygwin.
+
+Wed Jan 11 22:52:51 2012  CHIKANAGA Tomoyuki  <nagachika00@gmail.com>
+
+	* gc.c (ruby_mimmalloc): don't set allocated size to header.
+	  ruby_mimmalloc() doesn't increment allocated_size/allocations and
+	  decrement them in ruby_xfree() cause inconsistency.
+
+	* gc.c (ruby_xfree): don't decrement allocated_size/allocations if
+	  allocated size record is 0.
+
+Tue Jan 10 15:13:58 2012  NARUSE, Yui  <naruse@ruby-lang.org>
+
+	* ext/readline/readline.c (readline_attempted_completion_function):
+	  use rb_memerror().
+
+Tue Jan 10 12:44:11 2012  NARUSE, Yui  <naruse@ruby-lang.org>
+
+	* gc.c (ruby_mimmalloc): defined for objects need not rb_objspace,
+	  but should return pointer suitable for ruby_xfree;
+	  main vm and main thread.
+	  patched by Sokolov Yura. https://github.com/ruby/ruby/pull/79
+
+	* internal.h: ditto.
+
+	* vm.c (Init_BareVM): use ruby_mimmalloc.
+
+	* ext/dl/cfunc.c: #include <ruby/util.h>.
+
+	* ext/syslog/syslog.c: use xfree because it is allocated by
+	  ruby_strdup.
+
+Tue Jan 10 12:13:56 2012  Kazuhiro NISHIYAMA  <zn@mbf.nifty.com>
+
+	* ext/readline/readline.c (readline_attempted_completion_function):
+	  fix compile error.
+
+Tue Jan 10 10:41:11 2012  Nobuyoshi Nakada  <nobu@ruby-lang.org>
+
+	* ext/readline/readline.c (readline_attempted_completion_function):
+	  empty completion result does not mean memory error.
+
+Mon Jan  9 23:37:43 2012  CHIKANAGA Tomoyuki  <nagachika00@gmail.com>
+
+	* ext/readline/readline.c (readline_attempted_completion_function):
+	  fix typos.
+
+Mon Jan  9 20:55:34 2012  Narihiro Nakamura  <authornari@gmail.com>
+
+	* gc.c : don't embed struct heaps_slot to a heap block because it
+	  can causes copy-on-write of memory page on heap block when its
+	  free_next is rewirted.
+
+Mon Jan  9 14:42:41 2012  Narihiro Nakamura  <authornari@gmail.com>
+
+	* gc.c: free_slots is changed Singly linked list. clear
+	  free_slots before sweep.
+
+Mon Jan  9 04:24:59 2012  NARUSE, Yui  <naruse@ruby-lang.org>
+
+	* gc.c (rb_objspace_free): global_List is allocated with xmalloc.
+	  patched by Sokolov Yura.  https://github.com/ruby/ruby/pull/78
+
+	* dln_find.c: remove useless replacement of free.
+
+	* ext/readline/readline.c (readline_attempted_completion_function):
+	  strings for readline must allocated with malloc.
+
+	* process.c (run_exec_dup2): use free; see also r20950.
+
+	* re.c (onig_new_with_source): use malloc for oniguruma.
+
+	* vm.c (ruby_vm_destruct): use free for VMs.
+
+	* vm.c (thread_free): use free for threads.
+
+Mon Jan  9 04:24:59 2012  NARUSE, Yui  <naruse@ruby-lang.org>
+
+	* dln_find.c: remove useless replacement of free.
+
+	* ext/readline/readline.c (filename_completion_proc_call):
+	  matches should use xfree.
+
+	* ext/readline/readline.c (username_completion_proc_call): ditto.
+
+Sun Jan  8 20:31:45 2012  Narihiro Nakamura  <narihiro@netlab.jp>
+
+	* gc.c : consider header bytes which are used by malloc.
+
+Sun Jan  8 11:54:43 2012  Narihiro Nakamura  <authornari@gmail.com>
+
+	* gc.c (aligned_free): support MinGW. Patch by Hiroshi Shirosaki.
+
+Sun Jan  8 11:43:05 2012  Narihiro Nakamura  <authornari@gmail.com>
+
+	* gc.c (slot_sweep): add a assertion instead of a debug print.
+
+Sun Jan  8 00:46:34 2012  KOSAKI Motohiro  <kosaki.motohiro@gmail.com>
+
+	* gc.c: get rid of implicit narrowing conversion.
+
+Sun Jan  8 00:10:10 2012  NARUSE, Yui  <naruse@ruby-lang.org>
+
+	* configure.in: check posix_memalign(3) and menalign(3).
+
+	* gc.c (aligned_malloc): use configure's result instead of
+	  _POSIX_C_SOURCE and _XOPEN_SOURCE because they can't be used
+	  to check availability at least on FreeBSD.
+
+Sat Jan  7 22:25:50 2012  Narihiro Nakamura  <authornari@gmail.com>
+
+	* gc.c: use Bitmap Marking algorithm to avoid copy-on-write of
+	  memory pages. See [ruby-dev:45085] [Feature #5839]
+	  [ruby-core:41916].
+
+	* include/ruby/ruby.h : FL_MARK rename to FL_RESERVED1.
+
+	* node.h : ditto.
+
+	* debug.c : ditto.
+
+	* object.c (rb_obj_clone): FL_MARK move to a bitmap.
+
+	* class.c (rb_singleton_class_clone): ditto.
+
diff --git a/class.c b/class.c
index df19812..56a6f6f 100644
--- a/class.c
+++ b/class.c
@@ -186,7 +186,7 @@ rb_mod_init_copy(VALUE clone, VALUE orig)
 	    rb_free_const_table(RCLASS_CONST_TBL(clone));
 	}
 	RCLASS_CONST_TBL(clone) = st_init_numtable();
-	st_foreach(RCLASS_CONST_TBL(orig), clone_const_i, (st_data_t)RCLASS_CONST_TBL(clone));
+	st_foreach_nocheck(RCLASS_CONST_TBL(orig), clone_const_i, (st_data_t)RCLASS_CONST_TBL(clone));
     }
     if (RCLASS_M_TBL(orig)) {
 	struct clone_method_data data;
@@ -196,7 +196,7 @@ rb_mod_init_copy(VALUE clone, VALUE orig)
 	}
 	data.tbl = RCLASS_M_TBL(clone) = st_init_numtable();
 	data.klass = clone;
-	st_foreach(RCLASS_M_TBL(orig), clone_method,
+	st_foreach_nocheck(RCLASS_M_TBL(orig), clone_method,
 		   (st_data_t)&data);
     }
 
@@ -229,7 +229,7 @@ rb_singleton_class_clone(VALUE obj)
     else {
 	struct clone_method_data data;
 	/* copy singleton(unnamed) class */
-	VALUE clone = class_alloc((RBASIC(klass)->flags & ~(FL_MARK)), 0);
+	VALUE clone = class_alloc(RBASIC(klass)->flags, 0);
 
 	if (BUILTIN_TYPE(obj) == T_CLASS) {
 	    RBASIC(clone)->klass = (VALUE)clone;
@@ -244,12 +244,12 @@ rb_singleton_class_clone(VALUE obj)
 	}
 	if (RCLASS_CONST_TBL(klass)) {
 	    RCLASS_CONST_TBL(clone) = st_init_numtable();
-	    st_foreach(RCLASS_CONST_TBL(klass), clone_const_i, (st_data_t)RCLASS_CONST_TBL(clone));
+	    st_foreach_nocheck(RCLASS_CONST_TBL(klass), clone_const_i, (st_data_t)RCLASS_CONST_TBL(clone));
 	}
 	RCLASS_M_TBL(clone) = st_init_numtable();
 	data.tbl = RCLASS_M_TBL(clone);
 	data.klass = (VALUE)clone;
-	st_foreach(RCLASS_M_TBL(klass), clone_method,
+	st_foreach_nocheck(RCLASS_M_TBL(klass), clone_method,
 		   (st_data_t)&data);
 	rb_singleton_class_attached(RBASIC(clone)->klass, (VALUE)clone);
 	FL_SET(clone, FL_SINGLETON);
@@ -891,13 +891,13 @@ class_instance_method_list(int argc, VALUE *argv, VALUE mod, int obj, int (*func
 
     list = st_init_numtable();
     for (; mod; mod = RCLASS_SUPER(mod)) {
-	st_foreach(RCLASS_M_TBL(mod), method_entry_i, (st_data_t)list);
+	st_foreach_nocheck(RCLASS_M_TBL(mod), method_entry_i, (st_data_t)list);
 	if (BUILTIN_TYPE(mod) == T_ICLASS) continue;
 	if (obj && FL_TEST(mod, FL_SINGLETON)) continue;
 	if (!recur) break;
     }
     ary = rb_ary_new();
-    st_foreach(list, func, ary);
+    st_foreach_nocheck(list, func, ary);
     st_free_table(list);
 
     return ary;
@@ -1123,17 +1123,17 @@ rb_obj_singleton_methods(int argc, VALUE *argv, VALUE obj)
     klass = CLASS_OF(obj);
     list = st_init_numtable();
     if (klass && FL_TEST(klass, FL_SINGLETON)) {
-	st_foreach(RCLASS_M_TBL(klass), method_entry_i, (st_data_t)list);
+	st_foreach_nocheck(RCLASS_M_TBL(klass), method_entry_i, (st_data_t)list);
 	klass = RCLASS_SUPER(klass);
     }
     if (RTEST(recur)) {
 	while (klass && (FL_TEST(klass, FL_SINGLETON) || TYPE(klass) == T_ICLASS)) {
-	    st_foreach(RCLASS_M_TBL(klass), method_entry_i, (st_data_t)list);
+	    st_foreach_nocheck(RCLASS_M_TBL(klass), method_entry_i, (st_data_t)list);
 	    klass = RCLASS_SUPER(klass);
 	}
     }
     ary = rb_ary_new();
-    st_foreach(list, ins_methods_i, ary);
+    st_foreach_nocheck(list, ins_methods_i, ary);
     st_free_table(list);
 
     return ary;
diff --git a/common.mk b/common.mk
index eb89a2b..59cdfe4 100644
--- a/common.mk
+++ b/common.mk
@@ -630,7 +630,8 @@ file.$(OBJEXT): {$(VPATH)}file.c $(RUBY_H_INCLUDES) {$(VPATH)}io.h \
 gc.$(OBJEXT): {$(VPATH)}gc.c $(RUBY_H_INCLUDES) {$(VPATH)}re.h \
   {$(VPATH)}regex.h $(ENCODING_H_INCLUDES) $(VM_CORE_H_INCLUDES) \
   {$(VPATH)}gc.h {$(VPATH)}io.h {$(VPATH)}eval_intern.h {$(VPATH)}util.h \
-  {$(VPATH)}debug.h {$(VPATH)}internal.h {$(VPATH)}constant.h
+  {$(VPATH)}debug.h {$(VPATH)}internal.h {$(VPATH)}constant.h \
+  {$(VPATH)}pool_alloc.inc.h {$(VPATH)}pool_alloc.h
 hash.$(OBJEXT): {$(VPATH)}hash.c $(RUBY_H_INCLUDES) {$(VPATH)}util.h \
   $(ENCODING_H_INCLUDES)
 inits.$(OBJEXT): {$(VPATH)}inits.c $(RUBY_H_INCLUDES) \
@@ -693,7 +694,7 @@ signal.$(OBJEXT): {$(VPATH)}signal.c $(RUBY_H_INCLUDES) \
   $(VM_CORE_H_INCLUDES) {$(VPATH)}debug.h
 sprintf.$(OBJEXT): {$(VPATH)}sprintf.c $(RUBY_H_INCLUDES) {$(VPATH)}re.h \
   {$(VPATH)}regex.h {$(VPATH)}vsnprintf.c $(ENCODING_H_INCLUDES)
-st.$(OBJEXT): {$(VPATH)}st.c $(RUBY_H_INCLUDES)
+st.$(OBJEXT): {$(VPATH)}st.c $(RUBY_H_INCLUDES) {$(VPATH)}pool_alloc.h
 strftime.$(OBJEXT): {$(VPATH)}strftime.c $(RUBY_H_INCLUDES) \
   {$(VPATH)}timev.h
 string.$(OBJEXT): {$(VPATH)}string.c $(RUBY_H_INCLUDES) {$(VPATH)}re.h \
diff --git a/compile.c b/compile.c
index 61e0f32..4f05b26 100644
--- a/compile.c
+++ b/compile.c
@@ -452,7 +452,7 @@ validate_label(st_data_t name, st_data_t label, st_data_t arg)
 static void
 validate_labels(rb_iseq_t *iseq, st_table *labels_table)
 {
-    st_foreach(labels_table, validate_label, (st_data_t)iseq);
+    st_foreach_nocheck(labels_table, validate_label, (st_data_t)iseq);
     if (!NIL_P(iseq->compile_data->err_info)) {
 	rb_exc_raise(iseq->compile_data->err_info);
     }
diff --git a/configure.in b/configure.in
index d645aa7..e1f1760 100644
--- a/configure.in
+++ b/configure.in
@@ -1313,6 +1313,30 @@ main() {
 CFLAGS="$save_CFLAGS"])
 AC_DEFINE_UNQUOTED(GC_MARK_STACKFRAME_WORD, $rb_cv_gc_mark_stackframe_word)
 
+AS_CASE(["$target_os"],
+[openbsd*|darwin[15-9].*|darwin10.[012345]*], [
+  AC_CACHE_CHECK(for heap align log on openbsd/macos, rb_cv_page_size_log,
+    [rb_cv_page_size_log=no
+     for page_log in 12 13; do
+       AC_TRY_RUN([
+#include <math.h>
+#include <unistd.h>
+
+int
+main() {
+  if ((int)log2((double)sysconf(_SC_PAGESIZE)) != $page_log) return 1;
+  return 0;
+}
+       ],
+       rb_cv_page_size_log="$page_log"; break)
+     done])
+  if test $rb_cv_page_size_log != no; then
+    AC_DEFINE_UNQUOTED(USE_PAGESIZE_LOG, $rb_cv_page_size_log)
+  else
+    AC_DEFINE_UNQUOTED(USE_PAGESIZE_LOG, 12)
+  fi
+])
+
 
 dnl Checks for library functions.
 AC_TYPE_GETGROUPS
@@ -1413,7 +1437,8 @@ AC_CHECK_FUNCS(fmod killpg wait4 waitpid fork spawnv syscall __syscall chroot ge
 	      setsid telldir seekdir fchmod cosh sinh tanh log2 round\
 	      setuid setgid daemon select_large_fdset setenv unsetenv\
               mktime timegm gmtime_r clock_gettime gettimeofday poll ppoll\
-              pread sendfile shutdown sigaltstack dl_iterate_phdr)
+              pread sendfile shutdown sigaltstack dl_iterate_phdr \
+              posix_memalign memalign valloc)
 
 AC_CACHE_CHECK(for unsetenv returns a value, rb_cv_unsetenv_return_value,
   [AC_TRY_COMPILE([
diff --git a/debug.c b/debug.c
index dcc710b..b77be0e 100644
--- a/debug.c
+++ b/debug.c
@@ -32,8 +32,8 @@ const union {
         RUBY_ENC_CODERANGE_7BIT    = ENC_CODERANGE_7BIT,
         RUBY_ENC_CODERANGE_VALID   = ENC_CODERANGE_VALID,
         RUBY_ENC_CODERANGE_BROKEN  = ENC_CODERANGE_BROKEN,
-        RUBY_FL_MARK        = FL_MARK,
-        RUBY_FL_RESERVED    = FL_RESERVED,
+        RUBY_FL_RESERVED1   = FL_RESERVED1,
+        RUBY_FL_RESERVED2   = FL_RESERVED2,
         RUBY_FL_FINALIZE    = FL_FINALIZE,
         RUBY_FL_TAINT       = FL_TAINT,
         RUBY_FL_UNTRUSTED   = FL_UNTRUSTED,
diff --git a/dln.c b/dln.c
index 961592d..aadfdba 100644
--- a/dln.c
+++ b/dln.c
@@ -466,7 +466,7 @@ static void
 dln_print_undef(void)
 {
     fprintf(stderr, " Undefined symbols:\n");
-    st_foreach(undef_tbl, undef_print, NULL);
+    st_foreach_nocheck(undef_tbl, undef_print, NULL);
 }
 
 static void
@@ -660,7 +660,7 @@ load_1(int fd, long disp, const char *need_init)
 
 		data.name0 = sym->n_un.n_name;
 		data.name1 = sym[1].n_un.n_name;
-		st_foreach(reloc_tbl, reloc_repl, &data);
+		st_foreach_nocheck(reloc_tbl, reloc_repl, &data);
 
 		st_insert(undef_tbl, strdup(sym[1].n_un.n_name), NULL);
 		if (st_delete(undef_tbl, (st_data_t*)&key, NULL)) {
@@ -982,7 +982,7 @@ load_lib(const char *lib)
 	}
 	for (;;) {
 	    target_offset = -1;
-	    st_foreach(undef_tbl, search_undef, lib_tbl);
+	    st_foreach_nocheck(undef_tbl, search_undef, lib_tbl);
 	    if (target_offset == -1) break;
 	    if (load_1(fd, target_offset, 0) == -1) {
 		st_free_table(lib_tbl);
diff --git a/dln_find.c b/dln_find.c
index 7ce3a95..d9166fa 100644
--- a/dln_find.c
+++ b/dln_find.c
@@ -45,14 +45,6 @@ char *dln_argv0;
 # include <strings.h>
 #endif
 
-#ifndef xmalloc
-void *xmalloc();
-void *xcalloc();
-void *xrealloc();
-#endif
-
-#define free(x) xfree(x)
-
 #include <stdio.h>
 #if defined(_WIN32)
 #include "missing/file.h"
diff --git a/ext/dl/cfunc.c b/ext/dl/cfunc.c
index 66aebf2..70cf6c4 100644
--- a/ext/dl/cfunc.c
+++ b/ext/dl/cfunc.c
@@ -2,7 +2,8 @@
  * $Id$
  */
 
-#include <ruby.h>
+#include <ruby/ruby.h>
+#include <ruby/util.h>
 #include <errno.h>
 #include "dl.h"
 
diff --git a/ext/readline/readline.c b/ext/readline/readline.c
index 9066004..a1cad0e 100644
--- a/ext/readline/readline.c
+++ b/ext/readline/readline.c
@@ -713,7 +713,8 @@ readline_attempted_completion_function(const char *text, int start, int end)
 
 	    low = i1;
 	}
-	result[0] = ALLOC_N(char, low + 1);
+	result[0] = (char*)malloc(low + 1);
+	if (result[0]  == NULL) rb_memerror();
 	strncpy(result[0], result[1], low);
 	result[0][low] = '\0';
     }
diff --git a/ext/syck/emitter.c b/ext/syck/emitter.c
index af0d789..d4bc7cc 100644
--- a/ext/syck/emitter.c
+++ b/ext/syck/emitter.c
@@ -152,7 +152,7 @@ syck_emitter_st_free( SyckEmitter *e )
      */
     if ( e->anchors != NULL )
     {
-        st_foreach( e->anchors, syck_st_free_anchors, 0 );
+        st_foreach_nocheck( e->anchors, syck_st_free_anchors, 0 );
         st_free_table( e->anchors );
         e->anchors = NULL;
     }
diff --git a/ext/syck/rubyext.c b/ext/syck/rubyext.c
index 2ab2e49..e10e72b 100644
--- a/ext/syck/rubyext.c
+++ b/ext/syck/rubyext.c
@@ -754,11 +754,11 @@ syck_mark_parser(SyckParser *parser)
 
     if ( parser->anchors != NULL )
     {
-        st_foreach( parser->anchors, syck_st_mark_nodes, 0 );
+        st_foreach_nocheck( parser->anchors, syck_st_mark_nodes, 0 );
     }
     if ( parser->bad_anchors != NULL )
     {
-        st_foreach( parser->bad_anchors, syck_st_mark_nodes, 0 );
+        st_foreach_nocheck( parser->bad_anchors, syck_st_mark_nodes, 0 );
     }
 }
 
diff --git a/ext/syck/syck.c b/ext/syck/syck.c
index 94e3992..36ed8e7 100644
--- a/ext/syck/syck.c
+++ b/ext/syck/syck.c
@@ -223,7 +223,7 @@ syck_st_free( SyckParser *p )
 
     if ( p->bad_anchors != NULL )
     {
-        st_foreach( p->bad_anchors, syck_st_free_nodes, 0 );
+        st_foreach_nocheck( p->bad_anchors, syck_st_free_nodes, 0 );
         st_free_table( p->bad_anchors );
         p->bad_anchors = NULL;
     }
@@ -253,7 +253,7 @@ syck_free_parser( SyckParser *p )
      */
     if ( p->syms != NULL )
     {
-        st_foreach( p->syms, syck_st_free_syms, 0 );
+        st_foreach_nocheck( p->syms, syck_st_free_syms, 0 );
         st_free_table( p->syms );
         p->syms = NULL;
     }
diff --git a/ext/syslog/syslog.c b/ext/syslog/syslog.c
index f7d622e..912ba6a 100644
--- a/ext/syslog/syslog.c
+++ b/ext/syslog/syslog.c
@@ -49,7 +49,7 @@ static VALUE mSyslog_close(VALUE self)
 
     closelog();
 
-    free((void *)syslog_ident);
+    xfree((void *)syslog_ident);
     syslog_ident = NULL;
     syslog_options = syslog_facility = syslog_mask = -1;
     syslog_opened = 0;
diff --git a/gc.c b/gc.c
index c53bfd9..01c05f1 100644
--- a/gc.c
+++ b/gc.c
@@ -20,10 +20,12 @@
 #include "vm_core.h"
 #include "internal.h"
 #include "gc.h"
+#include "pool_alloc.h"
 #include "constant.h"
 #include <stdio.h>
 #include <setjmp.h>
 #include <sys/types.h>
+#include <assert.h>
 
 #ifdef HAVE_SYS_TIME_H
 #include <sys/time.h>
@@ -35,7 +37,12 @@
 
 #if defined _WIN32 || defined __CYGWIN__
 #include <windows.h>
+#elif defined(HAVE_POSIX_MEMALIGN)
+#elif defined(HAVE_MEMALIGN) || defined(HAVE_VALLOC)
+#include <malloc.h>
 #endif
+static void *aligned_malloc(size_t, size_t);
+static void aligned_free(void *);
 
 #ifdef HAVE_VALGRIND_MEMCHECK_H
 # include <valgrind/memcheck.h>
@@ -84,10 +91,12 @@ typedef struct {
     unsigned int initial_malloc_limit;
     unsigned int initial_heap_min_slots;
     unsigned int initial_free_min;
+#if defined(ENABLE_VM_OBJSPACE) && ENABLE_VM_OBJSPACE
     int gc_stress;
+#endif
 } ruby_gc_params_t;
 
-ruby_gc_params_t initial_params = {
+static ruby_gc_params_t initial_params = {
     GC_MALLOC_LIMIT,
     HEAP_MIN_SLOTS,
     FREE_MIN,
@@ -103,7 +112,10 @@ ruby_gc_params_t initial_params = {
 int ruby_gc_debug_indent = 0;
 
 /* for GC profile */
+#ifndef GC_PROFILE_MORE_DETAIL
 #define GC_PROFILE_MORE_DETAIL 0
+#endif
+
 typedef struct gc_profile_record {
     double gc_time;
     double gc_mark_time;
@@ -301,17 +313,20 @@ typedef struct RVALUE {
 #endif
 
 struct heaps_slot {
-    void *membase;
-    RVALUE *slot;
-    size_t limit;
+    struct heaps_header *membase;
+    RVALUE *freelist;
     struct heaps_slot *next;
     struct heaps_slot *prev;
+    struct heaps_slot *free_next;
+    uintptr_t bits[1];
 };
 
-struct sorted_heaps_slot {
+struct heaps_header {
+    struct heaps_slot *base;
+    uintptr_t *bits;
     RVALUE *start;
     RVALUE *end;
-    struct heaps_slot *slot;
+    size_t limit;
 };
 
 struct gc_list {
@@ -319,7 +334,27 @@ struct gc_list {
     struct gc_list *next;
 };
 
+#ifndef CALC_EXACT_MALLOC_SIZE
 #define CALC_EXACT_MALLOC_SIZE 0
+#endif
+
+#ifdef POOL_ALLOC_API
+/* POOL ALLOC API */
+#define POOL_ALLOC_PART 1
+#include "pool_alloc.inc.h"
+#undef POOL_ALLOC_PART
+
+typedef struct pool_layout_t pool_layout_t;
+struct pool_layout_t {
+    pool_header
+      p6,  /* st_table && st_table_entry */
+      p11;  /* st_table.bins init size */
+} pool_layout = {
+    INIT_POOL(void*[6]),
+    INIT_POOL(void*[11])
+};
+static void pool_finalize_header(pool_header *header);
+#endif
 
 typedef struct rb_objspace {
     struct {
@@ -330,16 +365,20 @@ typedef struct rb_objspace {
 	size_t allocations;
 #endif
     } malloc_params;
+#ifdef POOL_ALLOC_API
+    pool_layout_t *pool_headers;
+#endif
     struct {
 	size_t increment;
 	struct heaps_slot *ptr;
 	struct heaps_slot *sweep_slots;
-	struct sorted_heaps_slot *sorted;
+	struct heaps_slot *free_slots;
+	struct heaps_header **sorted;
 	size_t length;
 	size_t used;
-	RVALUE *freelist;
+        struct heaps_slot *reserve_slots;
 	RVALUE *range[2];
-	RVALUE *freed;
+	struct heaps_header *freed;
 	size_t live_num;
 	size_t free_num;
 	size_t free_min;
@@ -350,6 +389,7 @@ typedef struct rb_objspace {
 	int dont_gc;
 	int dont_lazy_sweep;
 	int during_gc;
+	rb_atomic_t finalizing;
     } flags;
     struct {
 	st_table *table;
@@ -377,7 +417,11 @@ typedef struct rb_objspace {
 #define ruby_initial_gc_stress	initial_params.gc_stress
 int *ruby_initial_gc_stress_ptr = &ruby_initial_gc_stress;
 #else
+#  ifdef POOL_ALLOC_API
+static rb_objspace_t rb_objspace = {{GC_MALLOC_LIMIT}, &pool_layout, {HEAP_MIN_SLOTS}};
+#  else
 static rb_objspace_t rb_objspace = {{GC_MALLOC_LIMIT}, {HEAP_MIN_SLOTS}};
+#  endif
 int *ruby_initial_gc_stress_ptr = &rb_objspace.gc_stress;
 #endif
 #define malloc_limit		objspace->malloc_params.limit
@@ -385,13 +429,13 @@ int *ruby_initial_gc_stress_ptr = &rb_objspace.gc_stress;
 #define heaps			objspace->heap.ptr
 #define heaps_length		objspace->heap.length
 #define heaps_used		objspace->heap.used
-#define freelist		objspace->heap.freelist
 #define lomem			objspace->heap.range[0]
 #define himem			objspace->heap.range[1]
 #define heaps_inc		objspace->heap.increment
 #define heaps_freed		objspace->heap.freed
 #define dont_gc 		objspace->flags.dont_gc
 #define during_gc		objspace->flags.during_gc
+#define finalizing		objspace->flags.finalizing
 #define finalizer_table 	objspace->final.table
 #define deferred_final_list	objspace->final.deferred
 #define mark_stack		objspace->markstack.buffer
@@ -403,6 +447,12 @@ int *ruby_initial_gc_stress_ptr = &rb_objspace.gc_stress;
 #define initial_heap_min_slots	initial_params.initial_heap_min_slots
 #define initial_free_min	initial_params.initial_free_min
 
+#define is_lazy_sweeping(objspace) ((objspace)->heap.sweep_slots != 0)
+
+#define nonspecial_obj_id(obj) (VALUE)((SIGNED_VALUE)(obj)|FIXNUM_FLAG)
+
+#define HEAP_HEADER(p) ((struct heaps_header *)(p))
+
 static void rb_objspace_call_finalizer(rb_objspace_t *objspace);
 
 #if defined(ENABLE_VM_OBJSPACE) && ENABLE_VM_OBJSPACE
@@ -413,6 +463,10 @@ rb_objspace_alloc(void)
     memset(objspace, 0, sizeof(*objspace));
     malloc_limit = initial_malloc_limit;
     ruby_gc_stress = ruby_initial_gc_stress;
+#ifdef POOL_ALLOC_API
+    objspace->pool_headers = (pool_layout_t*) malloc(sizeof(pool_layout));
+    memcpy(objspace->pool_headers, &pool_layout, sizeof(pool_layout));
+#endif
 
     return objspace;
 }
@@ -465,6 +519,7 @@ rb_gc_set_params(void)
 static void gc_sweep(rb_objspace_t *);
 static void slot_sweep(rb_objspace_t *, struct heaps_slot *);
 static void gc_clear_mark_on_sweep_slots(rb_objspace_t *);
+static void aligned_free(void *);
 
 void
 rb_objspace_free(rb_objspace_t *objspace)
@@ -479,40 +534,64 @@ rb_objspace_free(rb_objspace_t *objspace)
 	struct gc_list *list, *next;
 	for (list = global_List; list; list = next) {
 	    next = list->next;
-	    free(list);
+	    xfree(list);
 	}
     }
+    if (objspace->heap.reserve_slots) {
+        struct heaps_slot *list, *next;
+        for (list = objspace->heap.reserve_slots; list; list = next) {
+            next = list->free_next;
+            free(list);
+        }
+    }
     if (objspace->heap.sorted) {
 	size_t i;
 	for (i = 0; i < heaps_used; ++i) {
-	    free(objspace->heap.sorted[i].slot->membase);
-	    free(objspace->heap.sorted[i].slot);
+            free(objspace->heap.sorted[i]->base);
+	    aligned_free(objspace->heap.sorted[i]);
 	}
 	free(objspace->heap.sorted);
 	heaps_used = 0;
 	heaps = 0;
     }
+#ifdef POOL_ALLOC_API
+    if (objspace->pool_headers) {
+        pool_finalize_header(&objspace->pool_headers->p6);
+        pool_finalize_header(&objspace->pool_headers->p11);
+        free(objspace->pool_headers);
+    }
+#endif
     free(objspace);
 }
 #endif
 
-/* tiny heap size */
-/* 32KB */
-/*#define HEAP_SIZE 0x8000 */
-/* 128KB */
-/*#define HEAP_SIZE 0x20000 */
-/* 64KB */
-/*#define HEAP_SIZE 0x10000 */
-/* 16KB */
-#define HEAP_SIZE 0x4000
-/* 8KB */
-/*#define HEAP_SIZE 0x2000 */
-/* 4KB */
-/*#define HEAP_SIZE 0x1000 */
-/* 2KB */
-/*#define HEAP_SIZE 0x800 */
-
-#define HEAP_OBJ_LIMIT (unsigned int)(HEAP_SIZE / sizeof(struct RVALUE))
+#ifndef HEAP_ALIGN_LOG
+#ifdef USE_PAGESIZE_LOG
+#define HEAP_ALIGN_LOG USE_PAGESIZE_LOG
+#else
+/* default tiny heap size: 16KB */
+#define HEAP_ALIGN_LOG 15
+#endif
+#endif
+#define HEAP_ALIGN (1UL << HEAP_ALIGN_LOG)
+#define HEAP_ALIGN_MASK (~(~0UL << HEAP_ALIGN_LOG))
+#define REQUIRED_SIZE_BY_MALLOC (sizeof(size_t) * 5)
+#define HEAP_SIZE (HEAP_ALIGN - REQUIRED_SIZE_BY_MALLOC)
+#define CEILDIV(i, mod) (((i) + (mod) - 1)/(mod))
+
+#define HEAP_OBJ_LIMIT (unsigned int)((HEAP_SIZE - sizeof(struct heaps_header))/sizeof(struct RVALUE))
+#define HEAP_BITMAP_LIMIT CEILDIV(CEILDIV(HEAP_SIZE, sizeof(struct RVALUE)), sizeof(uintptr_t)*8)
+#define HEAP_SLOT_SIZE (sizeof(struct heaps_slot) + (HEAP_BITMAP_LIMIT-1) * sizeof(uintptr_t))
+
+#define GET_HEAP_HEADER(x) (HEAP_HEADER(((uintptr_t)x) & ~(HEAP_ALIGN_MASK)))
+#define GET_HEAP_SLOT(x) (GET_HEAP_HEADER(x)->base)
+#define GET_HEAP_BITMAP(x) (GET_HEAP_HEADER(x)->bits)
+#define NUM_IN_SLOT(p) (((uintptr_t)p & HEAP_ALIGN_MASK)/sizeof(RVALUE))
+#define BITMAP_INDEX(p) (NUM_IN_SLOT(p) / (sizeof(uintptr_t) * 8))
+#define BITMAP_OFFSET(p) (NUM_IN_SLOT(p) & ((sizeof(uintptr_t) * 8)-1))
+#define MARKED_IN_BITMAP(bits, p) (bits[BITMAP_INDEX(p)] & ((uintptr_t)1 << BITMAP_OFFSET(p)))
+#define MARK_IN_BITMAP(bits, p) (bits[BITMAP_INDEX(p)] = bits[BITMAP_INDEX(p)] | ((uintptr_t)1 << BITMAP_OFFSET(p)))
+#define CLEAR_IN_BITMAP(bits, p) (bits[BITMAP_INDEX(p)] &= ~((uintptr_t)1 << BITMAP_OFFSET(p)))
 
 extern st_table *rb_class_tbl;
 
@@ -824,8 +903,10 @@ vm_xfree(rb_objspace_t *objspace, void *ptr)
     size_t size;
     ptr = ((size_t *)ptr) - 1;
     size = ((size_t*)ptr)[0];
-    objspace->malloc_params.allocated_size -= size;
-    objspace->malloc_params.allocations--;
+    if (size) {
+	objspace->malloc_params.allocated_size -= size;
+	objspace->malloc_params.allocations--;
+    }
 #endif
 
     free(ptr);
@@ -895,6 +976,46 @@ ruby_xfree(void *x)
 	vm_xfree(&rb_objspace, x);
 }
 
+#ifdef POOL_ALLOC_API
+/* POOL ALLOC API */
+#define POOL_ALLOC_PART 2
+#include "pool_alloc.inc.h"
+#undef POOL_ALLOC_PART
+
+void
+ruby_xpool_free(void *ptr)
+{
+    pool_free_entry((void**)ptr);
+}
+
+#define CONCRET_POOL_MALLOC(pnts) \
+void * ruby_xpool_malloc_##pnts##p () { \
+    return pool_alloc_entry(&rb_objspace.pool_headers->p##pnts ); \
+}
+CONCRET_POOL_MALLOC(6)
+CONCRET_POOL_MALLOC(11)
+#undef CONCRET_POOL_MALLOC
+
+#endif
+
+/* Mimic ruby_xmalloc, but need not rb_objspace.
+ * should return pointer suitable for ruby_xfree
+ */
+void *
+ruby_mimmalloc(size_t size)
+{
+    void *mem;
+#if CALC_EXACT_MALLOC_SIZE
+    size += sizeof(size_t);
+#endif
+    mem = malloc(size);
+#if CALC_EXACT_MALLOC_SIZE
+    /* set 0 for consistency of allocated_size/allocations */
+    ((size_t *)mem)[0] = 0;
+    mem = (size_t *)mem + 1;
+#endif
+    return mem;
+}
 
 /*
  *  call-seq:
@@ -985,70 +1106,128 @@ rb_gc_unregister_address(VALUE *addr)
     }
 }
 
-
 static void
 allocate_sorted_heaps(rb_objspace_t *objspace, size_t next_heaps_length)
 {
-    struct sorted_heaps_slot *p;
-    size_t size;
+    struct heaps_header **p;
+    struct heaps_slot *slot;
+    size_t size, add, i;
 
-    size = next_heaps_length*sizeof(struct sorted_heaps_slot);
+    size = next_heaps_length*sizeof(struct heaps_header *);
+    add = next_heaps_length - heaps_used;
 
     if (heaps_used > 0) {
-	p = (struct sorted_heaps_slot *)realloc(objspace->heap.sorted, size);
+	p = (struct heaps_header **)realloc(objspace->heap.sorted, size);
 	if (p) objspace->heap.sorted = p;
     }
     else {
-	p = objspace->heap.sorted = (struct sorted_heaps_slot *)malloc(size);
+	p = objspace->heap.sorted = (struct heaps_header **)malloc(size);
     }
 
     if (p == 0) {
 	during_gc = 0;
 	rb_memerror();
     }
-    heaps_length = next_heaps_length;
+
+    for (i = 0; i < add; i++) {
+        slot = (struct heaps_slot *)malloc(HEAP_SLOT_SIZE);
+        if (slot == 0) {
+            during_gc = 0;
+            rb_memerror();
+            return;
+        }
+        slot->free_next = objspace->heap.reserve_slots;
+        objspace->heap.reserve_slots = slot;
+    }
+}
+
+static void *
+aligned_malloc(size_t alignment, size_t size)
+{
+    void *res;
+
+#if defined __MINGW32__
+    res = __mingw_aligned_malloc(size, alignment);
+#elif defined _WIN32 && !defined __CYGWIN__
+    res = _aligned_malloc(size, alignment);
+#elif defined(HAVE_POSIX_MEMALIGN)
+    if (posix_memalign(&res, alignment, size) == 0) {
+        return res;
+    } else {
+        return NULL;
+    }
+#elif defined(HAVE_MEMALIGN)
+    res = memalign(alignment, size);
+#elif defined(HAVE_VALLOC)
+    res = valloc(size);
+#else
+#error no memalign function
+#endif
+    return res;
+}
+
+static void
+aligned_free(void *ptr)
+{
+#if defined __MINGW32__
+    __mingw_aligned_free(ptr);
+#elif defined _WIN32 && !defined __CYGWIN__
+    _aligned_free(ptr);
+#else
+    free(ptr);
+#endif
+}
+
+static void
+link_free_heap_slot(rb_objspace_t *objspace, struct heaps_slot *slot)
+{
+    slot->free_next = objspace->heap.free_slots;
+    objspace->heap.free_slots = slot;
+}
+
+static void
+unlink_free_heap_slot(rb_objspace_t *objspace, struct heaps_slot *slot)
+{
+    objspace->heap.free_slots = slot->free_next;
+    slot->free_next = NULL;
 }
 
 static void
 assign_heap_slot(rb_objspace_t *objspace)
 {
-    RVALUE *p, *pend, *membase;
+    RVALUE *p, *pend;
+    struct heaps_header *membase;
     struct heaps_slot *slot;
     size_t hi, lo, mid;
     size_t objs;
 
     objs = HEAP_OBJ_LIMIT;
-    p = (RVALUE*)malloc(HEAP_SIZE);
-    if (p == 0) {
-	during_gc = 0;
-	rb_memerror();
-    }
-    slot = (struct heaps_slot *)malloc(sizeof(struct heaps_slot));
-    if (slot == 0) {
-	xfree(p);
+    membase = (struct heaps_header*)aligned_malloc(HEAP_ALIGN, HEAP_SIZE);
+    if (membase == 0) {
 	during_gc = 0;
 	rb_memerror();
     }
+    assert(objspace->heap.reserve_slots != NULL);
+    slot = objspace->heap.reserve_slots;
+    objspace->heap.reserve_slots = slot->free_next;
     MEMZERO((void*)slot, struct heaps_slot, 1);
 
     slot->next = heaps;
     if (heaps) heaps->prev = slot;
     heaps = slot;
 
-    membase = p;
+    p = (RVALUE*)((VALUE)membase + sizeof(struct heaps_header));
     if ((VALUE)p % sizeof(RVALUE) != 0) {
-	p = (RVALUE*)((VALUE)p + sizeof(RVALUE) - ((VALUE)p % sizeof(RVALUE)));
-	if ((HEAP_SIZE - HEAP_OBJ_LIMIT * sizeof(RVALUE)) < (size_t)((char*)p - (char*)membase)) {
-	    objs--;
-	}
+       p = (RVALUE*)((VALUE)p + sizeof(RVALUE) - ((VALUE)p % sizeof(RVALUE)));
+       objs = (HEAP_SIZE - (size_t)((VALUE)p - (VALUE)membase))/sizeof(RVALUE);
     }
 
     lo = 0;
     hi = heaps_used;
     while (lo < hi) {
-	register RVALUE *mid_membase;
+	register struct heaps_header *mid_membase;
 	mid = (lo + hi) / 2;
-	mid_membase = objspace->heap.sorted[mid].slot->membase;
+        mid_membase = objspace->heap.sorted[mid];
 	if (mid_membase < membase) {
 	    lo = mid + 1;
 	}
@@ -1060,14 +1239,16 @@ assign_heap_slot(rb_objspace_t *objspace)
 	}
     }
     if (hi < heaps_used) {
-	MEMMOVE(&objspace->heap.sorted[hi+1], &objspace->heap.sorted[hi], struct sorted_heaps_slot, heaps_used - hi);
-    }
-    objspace->heap.sorted[hi].slot = slot;
-    objspace->heap.sorted[hi].start = p;
-    objspace->heap.sorted[hi].end = (p + objs);
+	MEMMOVE(&objspace->heap.sorted[hi+1], &objspace->heap.sorted[hi], struct heaps_header*, heaps_used - hi);
+    }
+    objspace->heap.sorted[hi] = membase;
+    membase->start = p;
+    membase->end = (p + objs);
+    membase->base = heaps;
+    membase->bits = heaps->bits;
+    membase->limit = objs;
     heaps->membase = membase;
-    heaps->slot = p;
-    heaps->limit = objs;
+    memset(heaps->bits, 0, HEAP_BITMAP_LIMIT * sizeof(uintptr_t));
     objspace->heap.free_num += objs;
     pend = p + objs;
     if (lomem == 0 || lomem > p) lomem = p;
@@ -1076,19 +1257,24 @@ assign_heap_slot(rb_objspace_t *objspace)
 
     while (p < pend) {
 	p->as.free.flags = 0;
-	p->as.free.next = freelist;
-	freelist = p;
+	p->as.free.next = heaps->freelist;
+	heaps->freelist = p;
 	p++;
     }
+    link_free_heap_slot(objspace, heaps);
 }
 
 static void
 add_heap_slots(rb_objspace_t *objspace, size_t add)
 {
     size_t i;
+    size_t next_heaps_length;
 
-    if ((heaps_used + add) > heaps_length) {
-        allocate_sorted_heaps(objspace, heaps_used + add);
+    next_heaps_length = heaps_used + add;
+
+    if (next_heaps_length > heaps_length) {
+        allocate_sorted_heaps(objspace, next_heaps_length);
+        heaps_length = next_heaps_length;
     }
 
     for (i = 0; i < add; i++) {
@@ -1138,6 +1324,7 @@ set_heaps_increment(rb_objspace_t *objspace)
 
     if (next_heaps_length > heaps_length) {
 	allocate_sorted_heaps(objspace, next_heaps_length);
+        heaps_length = next_heaps_length;
     }
 }
 
@@ -1160,6 +1347,7 @@ rb_during_gc(void)
 }
 
 #define RANY(o) ((RVALUE*)(o))
+#define has_free_object (objspace->heap.free_slots && objspace->heap.free_slots->freelist)
 
 VALUE
 rb_newobj(void)
@@ -1180,15 +1368,18 @@ rb_newobj(void)
 	}
     }
 
-    if (UNLIKELY(!freelist)) {
+    if (UNLIKELY(!has_free_object)) {
 	if (!gc_lazy_sweep(objspace)) {
 	    during_gc = 0;
 	    rb_memerror();
 	}
     }
 
-    obj = (VALUE)freelist;
-    freelist = freelist->as.free.next;
+    obj = (VALUE)objspace->heap.free_slots->freelist;
+    objspace->heap.free_slots->freelist = RANY(obj)->as.free.next;
+    if (objspace->heap.free_slots->freelist == NULL) {
+        unlink_free_heap_slot(objspace, objspace->heap.free_slots);
+    }
 
     MEMZERO((void*)obj, RVALUE, 1);
 #ifdef GC_DEBUG
@@ -1357,10 +1548,10 @@ gc_mark_all(rb_objspace_t *objspace)
 
     init_mark_stack(objspace);
     for (i = 0; i < heaps_used; i++) {
-	p = objspace->heap.sorted[i].start; pend = objspace->heap.sorted[i].end;
+	p = objspace->heap.sorted[i]->start; pend = objspace->heap.sorted[i]->end;
 	while (p < pend) {
-	    if ((p->as.basic.flags & FL_MARK) &&
-		(p->as.basic.flags != FL_MARK)) {
+	    if (MARKED_IN_BITMAP(GET_HEAP_BITMAP(p), p) &&
+		p->as.basic.flags) {
 		gc_mark_children(objspace, (VALUE)p, 0);
 	    }
 	    p++;
@@ -1388,26 +1579,27 @@ static inline int
 is_pointer_to_heap(rb_objspace_t *objspace, void *ptr)
 {
     register RVALUE *p = RANY(ptr);
-    register struct sorted_heaps_slot *heap;
+    register struct heaps_header *heap;
     register size_t hi, lo, mid;
 
     if (p < lomem || p > himem) return FALSE;
     if ((VALUE)p % sizeof(RVALUE) != 0) return FALSE;
+    heap = GET_HEAP_HEADER(p);
 
     /* check if p looks like a pointer using bsearch*/
     lo = 0;
     hi = heaps_used;
     while (lo < hi) {
 	mid = (lo + hi) / 2;
-	heap = &objspace->heap.sorted[mid];
-	if (heap->start <= p) {
-	    if (p < heap->end)
-		return TRUE;
-	    lo = mid + 1;
-	}
-	else {
-	    hi = mid;
-	}
+        if (heap > objspace->heap.sorted[mid]) {
+            lo = mid + 1;
+        }
+        else if (heap < objspace->heap.sorted[mid]) {
+            hi = mid;
+        }
+        else {
+            return (p >= heap->start && p < heap->end) ? TRUE : FALSE;
+        }
     }
     return FALSE;
 }
@@ -1450,10 +1642,10 @@ struct mark_tbl_arg {
 };
 
 static int
-mark_entry(ID key, VALUE value, st_data_t data)
+mark_entry(st_data_t key, st_data_t value, st_data_t data)
 {
     struct mark_tbl_arg *arg = (void*)data;
-    gc_mark(arg->objspace, value, arg->lev);
+    gc_mark(arg->objspace, (VALUE)value, arg->lev);
     return ST_CONTINUE;
 }
 
@@ -1464,14 +1656,14 @@ mark_tbl(rb_objspace_t *objspace, st_table *tbl, int lev)
     if (!tbl || tbl->num_entries == 0) return;
     arg.objspace = objspace;
     arg.lev = lev;
-    st_foreach(tbl, mark_entry, (st_data_t)&arg);
+    st_foreach_nocheck(tbl, mark_entry, (st_data_t)&arg);
 }
 
 static int
-mark_key(VALUE key, VALUE value, st_data_t data)
+mark_key(st_data_t key, st_data_t value, st_data_t data)
 {
     struct mark_tbl_arg *arg = (void*)data;
-    gc_mark(arg->objspace, key, arg->lev);
+    gc_mark(arg->objspace, (VALUE)key, arg->lev);
     return ST_CONTINUE;
 }
 
@@ -1482,7 +1674,7 @@ mark_set(rb_objspace_t *objspace, st_table *tbl, int lev)
     if (!tbl) return;
     arg.objspace = objspace;
     arg.lev = lev;
-    st_foreach(tbl, mark_key, (st_data_t)&arg);
+    st_foreach_nocheck(tbl, mark_key, (st_data_t)&arg);
 }
 
 void
@@ -1492,11 +1684,11 @@ rb_mark_set(st_table *tbl)
 }
 
 static int
-mark_keyvalue(VALUE key, VALUE value, st_data_t data)
+mark_keyvalue(st_data_t key, st_data_t value, st_data_t data)
 {
     struct mark_tbl_arg *arg = (void*)data;
-    gc_mark(arg->objspace, key, arg->lev);
-    gc_mark(arg->objspace, value, arg->lev);
+    gc_mark(arg->objspace, (VALUE)key, arg->lev);
+    gc_mark(arg->objspace, (VALUE)value, arg->lev);
     return ST_CONTINUE;
 }
 
@@ -1507,7 +1699,7 @@ mark_hash(rb_objspace_t *objspace, st_table *tbl, int lev)
     if (!tbl) return;
     arg.objspace = objspace;
     arg.lev = lev;
-    st_foreach(tbl, mark_keyvalue, (st_data_t)&arg);
+    st_foreach_nocheck(tbl, mark_keyvalue, (st_data_t)&arg);
 }
 
 void
@@ -1560,7 +1752,7 @@ mark_m_tbl(rb_objspace_t *objspace, st_table *tbl, int lev)
     if (!tbl) return;
     arg.objspace = objspace;
     arg.lev = lev;
-    st_foreach(tbl, mark_method_entry_i, (st_data_t)&arg);
+    st_foreach_nocheck(tbl, mark_method_entry_i, (st_data_t)&arg);
 }
 
 static int
@@ -1573,7 +1765,7 @@ free_method_entry_i(ID key, rb_method_entry_t *me, st_data_t data)
 void
 rb_free_m_table(st_table *tbl)
 {
-    st_foreach(tbl, free_method_entry_i, 0);
+    st_foreach_nocheck(tbl, free_method_entry_i, 0);
     st_free_table(tbl);
 }
 
@@ -1592,7 +1784,7 @@ mark_const_tbl(rb_objspace_t *objspace, st_table *tbl, int lev)
     if (!tbl) return;
     arg.objspace = objspace;
     arg.lev = lev;
-    st_foreach(tbl, mark_const_entry_i, (st_data_t)&arg);
+    st_foreach_nocheck(tbl, mark_const_entry_i, (st_data_t)&arg);
 }
 
 static int
@@ -1605,7 +1797,7 @@ free_const_entry_i(ID key, rb_const_entry_t *ce, st_data_t data)
 void
 rb_free_const_table(st_table *tbl)
 {
-    st_foreach(tbl, free_const_entry_i, 0);
+    st_foreach_nocheck(tbl, free_const_entry_i, 0);
     st_free_table(tbl);
 }
 
@@ -1627,12 +1819,14 @@ static void
 gc_mark(rb_objspace_t *objspace, VALUE ptr, int lev)
 {
     register RVALUE *obj;
+    register uintptr_t *bits;
 
     obj = RANY(ptr);
     if (rb_special_const_p(ptr)) return; /* special const not marked */
     if (obj->as.basic.flags == 0) return;       /* free cell */
-    if (obj->as.basic.flags & FL_MARK) return;  /* already marked */
-    obj->as.basic.flags |= FL_MARK;
+    bits = GET_HEAP_BITMAP(ptr);
+    if (MARKED_IN_BITMAP(bits, ptr)) return;  /* already marked */
+    MARK_IN_BITMAP(bits, ptr);
     objspace->heap.live_num++;
 
     if (lev > GC_LEVEL_MAX || (lev == 0 && stack_check(STACKFRAME_FOR_GC_MARK))) {
@@ -1660,6 +1854,7 @@ static void
 gc_mark_children(rb_objspace_t *objspace, VALUE ptr, int lev)
 {
     register RVALUE *obj = RANY(ptr);
+    register uintptr_t *bits;
 
     goto marking;		/* skip */
 
@@ -1667,8 +1862,9 @@ gc_mark_children(rb_objspace_t *objspace, VALUE ptr, int lev)
     obj = RANY(ptr);
     if (rb_special_const_p(ptr)) return; /* special const not marked */
     if (obj->as.basic.flags == 0) return;       /* free cell */
-    if (obj->as.basic.flags & FL_MARK) return;  /* already marked */
-    obj->as.basic.flags |= FL_MARK;
+    bits = GET_HEAP_BITMAP(ptr);
+    if (MARKED_IN_BITMAP(bits, ptr)) return;  /* already marked */
+    MARK_IN_BITMAP(bits, ptr);
     objspace->heap.live_num++;
 
   marking:
@@ -1930,13 +2126,18 @@ gc_mark_children(rb_objspace_t *objspace, VALUE ptr, int lev)
 
 static int obj_free(rb_objspace_t *, VALUE);
 
-static inline void
-add_freelist(rb_objspace_t *objspace, RVALUE *p)
+static inline struct heaps_slot *
+add_slot_local_freelist(rb_objspace_t *objspace, RVALUE *p)
 {
+    struct heaps_slot *slot;
+
     VALGRIND_MAKE_MEM_UNDEFINED((void*)p, sizeof(RVALUE));
     p->as.free.flags = 0;
-    p->as.free.next = freelist;
-    freelist = p;
+    slot = GET_HEAP_SLOT(p);
+    p->as.free.next = slot->freelist;
+    slot->freelist = p;
+
+    return slot;
 }
 
 static void
@@ -1946,17 +2147,13 @@ finalize_list(rb_objspace_t *objspace, RVALUE *p)
 	RVALUE *tmp = p->as.free.next;
 	run_final(objspace, (VALUE)p);
 	if (!FL_TEST(p, FL_SINGLETON)) { /* not freeing page */
-            if (objspace->heap.sweep_slots) {
-                p->as.free.flags = 0;
-            }
-            else {
+            add_slot_local_freelist(objspace, p);
+            if (!is_lazy_sweeping(objspace)) {
                 GC_PROF_DEC_LIVE_NUM;
-                add_freelist(objspace, p);
             }
 	}
 	else {
-	    struct heaps_slot *slot = (struct heaps_slot *)(VALUE)RDATA(p)->dmark;
-	    slot->limit--;
+            GET_HEAP_HEADER(p)->limit--;
 	}
 	p = tmp;
     }
@@ -1977,22 +2174,23 @@ unlink_heap_slot(rb_objspace_t *objspace, struct heaps_slot *slot)
     slot->next = NULL;
 }
 
-
 static void
 free_unused_heaps(rb_objspace_t *objspace)
 {
     size_t i, j;
-    RVALUE *last = 0;
+    struct heaps_header *last = 0;
 
     for (i = j = 1; j < heaps_used; i++) {
-	if (objspace->heap.sorted[i].slot->limit == 0) {
+	if (objspace->heap.sorted[i]->limit == 0) {
+            struct heaps_slot* h = objspace->heap.sorted[i]->base;
+            h->free_next = objspace->heap.reserve_slots;
+            objspace->heap.reserve_slots = h;
 	    if (!last) {
-		last = objspace->heap.sorted[i].slot->membase;
+                last = objspace->heap.sorted[i];
 	    }
 	    else {
-		free(objspace->heap.sorted[i].slot->membase);
+		aligned_free(objspace->heap.sorted[i]);
 	    }
-            free(objspace->heap.sorted[i].slot);
 	    heaps_used--;
 	}
 	else {
@@ -2004,70 +2202,84 @@ free_unused_heaps(rb_objspace_t *objspace)
     }
     if (last) {
 	if (last < heaps_freed) {
-	    free(heaps_freed);
+	    aligned_free(heaps_freed);
 	    heaps_freed = last;
 	}
 	else {
-	    free(last);
+	    aligned_free(last);
 	}
     }
 }
 
 static void
+gc_clear_slot_bits(struct heaps_slot *slot)
+{
+    memset(slot->bits, 0, HEAP_BITMAP_LIMIT * sizeof(uintptr_t));
+}
+
+static void
 slot_sweep(rb_objspace_t *objspace, struct heaps_slot *sweep_slot)
 {
     size_t free_num = 0, final_num = 0;
     RVALUE *p, *pend;
-    RVALUE *free = freelist, *final = deferred_final_list;
+    RVALUE *final = deferred_final_list;
     int deferred;
+    uintptr_t *bits;
 
-    p = sweep_slot->slot; pend = p + sweep_slot->limit;
+    p = sweep_slot->membase->start; pend = sweep_slot->membase->end;
+    bits = sweep_slot->bits;
     while (p < pend) {
-        if (!(p->as.basic.flags & FL_MARK)) {
-            if (p->as.basic.flags &&
-                ((deferred = obj_free(objspace, (VALUE)p)) ||
-		 (FL_TEST(p, FL_FINALIZE)))) {
-                if (!deferred) {
-                    p->as.free.flags = T_ZOMBIE;
-                    RDATA(p)->dfree = 0;
+        if ((!(MARKED_IN_BITMAP(bits, p))) && BUILTIN_TYPE(p) != T_ZOMBIE) {
+            if (p->as.basic.flags) {
+                if ((deferred = obj_free(objspace, (VALUE)p)) ||
+                    (FL_TEST(p, FL_FINALIZE))) {
+                    if (!deferred) {
+                        p->as.free.flags = T_ZOMBIE;
+                        RDATA(p)->dfree = 0;
+                    }
+                    p->as.free.next = deferred_final_list;
+                    deferred_final_list = p;
+                    assert(BUILTIN_TYPE(p) == T_ZOMBIE);
+                    final_num++;
+                }
+                else {
+                    VALGRIND_MAKE_MEM_UNDEFINED((void*)p, sizeof(RVALUE));
+                    p->as.free.flags = 0;
+                    p->as.free.next = sweep_slot->freelist;
+                    sweep_slot->freelist = p;
+                    free_num++;
                 }
-                p->as.free.flags |= FL_MARK;
-                p->as.free.next = deferred_final_list;
-                deferred_final_list = p;
-                final_num++;
             }
             else {
-                add_freelist(objspace, p);
                 free_num++;
             }
         }
-        else if (BUILTIN_TYPE(p) == T_ZOMBIE) {
-            /* objects to be finalized */
-            /* do nothing remain marked */
-        }
-        else {
-            RBASIC(p)->flags &= ~FL_MARK;
-        }
         p++;
     }
-    if (final_num + free_num == sweep_slot->limit &&
+    gc_clear_slot_bits(sweep_slot);
+    if (final_num + free_num == sweep_slot->membase->limit &&
         objspace->heap.free_num > objspace->heap.do_heap_free) {
         RVALUE *pp;
 
         for (pp = deferred_final_list; pp != final; pp = pp->as.free.next) {
-	    RDATA(pp)->dmark = (void (*)(void *))(VALUE)sweep_slot;
+	    RDATA(pp)->dmark = 0;
             pp->as.free.flags |= FL_SINGLETON; /* freeing page mark */
         }
-        sweep_slot->limit = final_num;
-        freelist = free;	/* cancel this page from freelist */
+        sweep_slot->membase->limit = final_num;
         unlink_heap_slot(objspace, sweep_slot);
     }
     else {
+        if (free_num > 0) {
+            link_free_heap_slot(objspace, sweep_slot);
+        }
+        else {
+            sweep_slot->free_next = NULL;
+        }
         objspace->heap.free_num += free_num;
     }
     objspace->heap.final_num += final_num;
 
-    if (deferred_final_list) {
+    if (deferred_final_list && !finalizing) {
         rb_thread_t *th = GET_THREAD();
         if (th) {
             RUBY_VM_SET_FINALIZER_INTERRUPT(th);
@@ -2079,7 +2291,7 @@ static int
 ready_to_gc(rb_objspace_t *objspace)
 {
     if (dont_gc || during_gc) {
-	if (!freelist) {
+	if (!has_free_object) {
             if (!heaps_increment(objspace)) {
                 set_heaps_increment(objspace);
                 heaps_increment(objspace);
@@ -2093,7 +2305,6 @@ ready_to_gc(rb_objspace_t *objspace)
 static void
 before_gc_sweep(rb_objspace_t *objspace)
 {
-    freelist = 0;
     objspace->heap.do_heap_free = (size_t)((heaps_used * HEAP_OBJ_LIMIT) * 0.65);
     objspace->heap.free_min = (size_t)((heaps_used * HEAP_OBJ_LIMIT)  * 0.2);
     if (objspace->heap.free_min < initial_free_min) {
@@ -2102,6 +2313,7 @@ before_gc_sweep(rb_objspace_t *objspace)
     }
     objspace->heap.sweep_slots = heaps;
     objspace->heap.free_num = 0;
+    objspace->heap.free_slots = NULL;
 
     /* sweep unlinked method entries */
     if (GET_VM()->unlinked_method_entry_list) {
@@ -2138,7 +2350,7 @@ lazy_sweep(rb_objspace_t *objspace)
         next = objspace->heap.sweep_slots->next;
 	slot_sweep(objspace, objspace->heap.sweep_slots);
         objspace->heap.sweep_slots = next;
-        if (freelist) {
+        if (has_free_object) {
             during_gc = 0;
             return TRUE;
         }
@@ -2150,10 +2362,10 @@ static void
 rest_sweep(rb_objspace_t *objspace)
 {
     if (objspace->heap.sweep_slots) {
-       while (objspace->heap.sweep_slots) {
-           lazy_sweep(objspace);
-       }
-       after_gc_sweep(objspace);
+	while (objspace->heap.sweep_slots) {
+	    lazy_sweep(objspace);
+	}
+	after_gc_sweep(objspace);
     }
 }
 
@@ -2200,9 +2412,9 @@ gc_lazy_sweep(rb_objspace_t *objspace)
     }
 
     GC_PROF_SWEEP_TIMER_START;
-    if(!(res = lazy_sweep(objspace))) {
+    if (!(res = lazy_sweep(objspace))) {
         after_gc_sweep(objspace);
-        if(freelist) {
+        if (has_free_object) {
             res = TRUE;
             during_gc = 0;
         }
@@ -2235,12 +2447,17 @@ void
 rb_gc_force_recycle(VALUE p)
 {
     rb_objspace_t *objspace = &rb_objspace;
-    GC_PROF_DEC_LIVE_NUM;
-    if (RBASIC(p)->flags & FL_MARK) {
-        RANY(p)->as.free.flags = 0;
+    struct heaps_slot *slot;
+
+    if (MARKED_IN_BITMAP(GET_HEAP_BITMAP(p), p)) {
+        add_slot_local_freelist(objspace, (RVALUE *)p);
     }
     else {
-        add_freelist(objspace, (RVALUE *)p);
+        GC_PROF_DEC_LIVE_NUM;
+        slot = add_slot_local_freelist(objspace, (RVALUE *)p);
+        if (slot->free_next == NULL) {
+            link_free_heap_slot(objspace, slot);
+        }
     }
 }
 
@@ -2433,19 +2650,12 @@ static void
 gc_clear_mark_on_sweep_slots(rb_objspace_t *objspace)
 {
     struct heaps_slot *scan;
-    RVALUE *p, *pend;
 
     if (objspace->heap.sweep_slots) {
         while (heaps_increment(objspace));
         while (objspace->heap.sweep_slots) {
             scan = objspace->heap.sweep_slots;
-            p = scan->slot; pend = p + scan->limit;
-            while (p < pend) {
-                if (p->as.free.flags & FL_MARK && BUILTIN_TYPE(p) != T_ZOMBIE) {
-                    p->as.basic.flags &= ~FL_MARK;
-                }
-                p++;
-            }
+            gc_clear_slot_bits(scan);
             objspace->heap.sweep_slots = objspace->heap.sweep_slots->next;
         }
     }
@@ -2634,7 +2844,7 @@ static VALUE
 objspace_each_objects(VALUE arg)
 {
     size_t i;
-    RVALUE *membase = 0;
+    struct heaps_header *membase = 0;
     RVALUE *pstart, *pend;
     rb_objspace_t *objspace = &rb_objspace;
     struct each_obj_args *args = (struct each_obj_args *)arg;
@@ -2642,16 +2852,16 @@ objspace_each_objects(VALUE arg)
 
     i = 0;
     while (i < heaps_used) {
-	while (0 < i && (uintptr_t)membase < (uintptr_t)objspace->heap.sorted[i-1].slot->membase)
+	while (0 < i && membase < objspace->heap.sorted[i-1])
 	    i--;
-	while (i < heaps_used && (uintptr_t)objspace->heap.sorted[i].slot->membase <= (uintptr_t)membase)
+	while (i < heaps_used && objspace->heap.sorted[i] <= membase)
 	    i++;
 	if (heaps_used <= i)
 	  break;
-	membase = objspace->heap.sorted[i].slot->membase;
+	membase = objspace->heap.sorted[i];
 
-	pstart = objspace->heap.sorted[i].slot->slot;
-	pend = pstart + objspace->heap.sorted[i].slot->limit;
+	pstart = membase->start;
+	pend = membase->end;
 
 	for (; pstart != pend; pstart++) {
 	    if (pstart->as.basic.flags) {
@@ -2665,6 +2875,7 @@ objspace_each_objects(VALUE arg)
 	    }
 	}
     }
+    RB_GC_GUARD(v);
 
     return Qnil;
 }
@@ -2908,11 +3119,12 @@ run_single_final(VALUE arg)
 }
 
 static void
-run_finalizer(rb_objspace_t *objspace, VALUE objid, VALUE table)
+run_finalizer(rb_objspace_t *objspace, VALUE obj, VALUE table)
 {
     long i;
     int status;
     VALUE args[3];
+    VALUE objid = nonspecial_obj_id(obj);
 
     if (RARRAY_LEN(table) > 0) {
 	args[1] = rb_obj_freeze(rb_ary_new3(1, objid));
@@ -2936,13 +3148,11 @@ run_finalizer(rb_objspace_t *objspace, VALUE objid, VALUE table)
 static void
 run_final(rb_objspace_t *objspace, VALUE obj)
 {
-    VALUE objid;
     RUBY_DATA_FUNC free_func = 0;
     st_data_t key, table;
 
     objspace->heap.final_num--;
 
-    objid = rb_obj_id(obj);	/* make obj into id */
     RBASIC(obj)->klass = 0;
 
     if (RTYPEDDATA_P(obj)) {
@@ -2957,7 +3167,7 @@ run_final(rb_objspace_t *objspace, VALUE obj)
 
     key = (st_data_t)obj;
     if (st_delete(finalizer_table, &key, &table)) {
-	run_finalizer(objspace, objid, (VALUE)table);
+	run_finalizer(objspace, obj, (VALUE)table);
     }
 }
 
@@ -2975,16 +3185,20 @@ finalize_deferred(rb_objspace_t *objspace)
 void
 rb_gc_finalize_deferred(void)
 {
-    finalize_deferred(&rb_objspace);
+    rb_objspace_t *objspace = &rb_objspace;
+    if (ATOMIC_EXCHANGE(finalizing, 1)) return;
+    finalize_deferred(objspace);
+    ATOMIC_SET(finalizing, 0);
 }
 
 static int
 chain_finalized_object(st_data_t key, st_data_t val, st_data_t arg)
 {
     RVALUE *p = (RVALUE *)key, **final_list = (RVALUE **)arg;
-    if ((p->as.basic.flags & (FL_FINALIZE|FL_MARK)) == FL_FINALIZE) {
+    if ((p->as.basic.flags & FL_FINALIZE) == FL_FINALIZE &&
+        !MARKED_IN_BITMAP(GET_HEAP_BITMAP(p), p)) {
 	if (BUILTIN_TYPE(p) != T_ZOMBIE) {
-	    p->as.free.flags = FL_MARK | T_ZOMBIE; /* remain marked */
+	    p->as.free.flags = T_ZOMBIE;
 	    RDATA(p)->dfree = 0;
 	}
 	p->as.free.next = *final_list;
@@ -3027,22 +3241,25 @@ rb_objspace_call_finalizer(rb_objspace_t *objspace)
     /* run finalizers */
     gc_clear_mark_on_sweep_slots(objspace);
 
+    if (ATOMIC_EXCHANGE(finalizing, 1)) return;
+
     do {
 	/* XXX: this loop will make no sense */
 	/* because mark will not be removed */
 	finalize_deferred(objspace);
 	mark_tbl(objspace, finalizer_table, 0);
-	st_foreach(finalizer_table, chain_finalized_object,
+	st_foreach_nocheck(finalizer_table, chain_finalized_object,
 		   (st_data_t)&deferred_final_list);
     } while (deferred_final_list);
     /* force to run finalizer */
     while (finalizer_table->num_entries) {
 	struct force_finalize_list *list = 0;
-	st_foreach(finalizer_table, force_chain_object, (st_data_t)&list);
+	st_foreach_nocheck(finalizer_table, force_chain_object, (st_data_t)&list);
 	while (list) {
 	    struct force_finalize_list *curr = list;
-	    run_finalizer(objspace, rb_obj_id(curr->obj), curr->table);
-	    st_delete(finalizer_table, (st_data_t*)&curr->obj, 0);
+	    st_data_t obj = (st_data_t)curr->obj;
+	    run_finalizer(objspace, curr->obj, curr->table);
+	    st_delete(finalizer_table, &obj, 0);
 	    list = curr->next;
 	    xfree(curr);
 	}
@@ -3053,7 +3270,7 @@ rb_objspace_call_finalizer(rb_objspace_t *objspace)
 
     /* run data object's finalizers */
     for (i = 0; i < heaps_used; i++) {
-	p = objspace->heap.sorted[i].start; pend = objspace->heap.sorted[i].end;
+	p = objspace->heap.sorted[i]->start; pend = objspace->heap.sorted[i]->end;
 	while (p < pend) {
 	    if (BUILTIN_TYPE(p) == T_DATA &&
 		DATA_PTR(p) && RANY(p)->as.data.dfree &&
@@ -3089,6 +3306,7 @@ rb_objspace_call_finalizer(rb_objspace_t *objspace)
 
     st_free_table(finalizer_table);
     finalizer_table = 0;
+    ATOMIC_SET(finalizing, 0);
 }
 
 void
@@ -3096,10 +3314,42 @@ rb_gc(void)
 {
     rb_objspace_t *objspace = &rb_objspace;
     garbage_collect(objspace);
-    finalize_deferred(objspace);
+    if (!finalizing) finalize_deferred(objspace);
     free_unused_heaps(objspace);
 }
 
+static inline int
+is_id_value(rb_objspace_t *objspace, VALUE ptr)
+{
+    if (!is_pointer_to_heap(objspace, (void *)ptr)) return FALSE;
+    if (BUILTIN_TYPE(ptr) > T_FIXNUM) return FALSE;
+    if (BUILTIN_TYPE(ptr) == T_ICLASS) return FALSE;
+    return TRUE;
+}
+
+static inline int
+is_dead_object(rb_objspace_t *objspace, VALUE ptr)
+{
+    struct heaps_slot *slot = objspace->heap.sweep_slots;
+    if (!is_lazy_sweeping(objspace) || MARKED_IN_BITMAP(GET_HEAP_BITMAP(ptr), ptr))
+	return FALSE;
+    while (slot) {
+	if ((VALUE)slot->membase->start <= ptr && ptr < (VALUE)(slot->membase->end))
+	    return TRUE;
+	slot = slot->next;
+    }
+    return FALSE;
+}
+
+static inline int
+is_live_object(rb_objspace_t *objspace, VALUE ptr)
+{
+    if (BUILTIN_TYPE(ptr) == 0) return FALSE;
+    if (RBASIC(ptr)->klass == 0) return FALSE;
+    if (is_dead_object(objspace, ptr)) return FALSE;
+    return TRUE;
+}
+
 /*
  *  call-seq:
  *     ObjectSpace._id2ref(object_id) -> an_object
@@ -3142,11 +3392,10 @@ id2ref(VALUE obj, VALUE objid)
 	return ID2SYM(symid);
     }
 
-    if (!is_pointer_to_heap(objspace, (void *)ptr) ||
-	BUILTIN_TYPE(ptr) > T_FIXNUM || BUILTIN_TYPE(ptr) == T_ICLASS) {
+    if (!is_id_value(objspace, ptr)) {
 	rb_raise(rb_eRangeError, "%p is not id value", p0);
     }
-    if (BUILTIN_TYPE(ptr) == 0 || RBASIC(ptr)->klass == 0) {
+    if (!is_live_object(objspace, ptr)) {
 	rb_raise(rb_eRangeError, "%p is recycled object", p0);
     }
     return (VALUE)ptr;
@@ -3216,7 +3465,7 @@ rb_obj_id(VALUE obj)
     if (SPECIAL_CONST_P(obj)) {
         return LONG2NUM((SIGNED_VALUE)obj);
     }
-    return (VALUE)((SIGNED_VALUE)obj|FIXNUM_FLAG);
+    return nonspecial_obj_id(obj);
 }
 
 static int
@@ -3259,7 +3508,7 @@ count_objects(int argc, VALUE *argv, VALUE os)
     VALUE hash;
 
     if (rb_scan_args(argc, argv, "01", &hash) == 1) {
-        if (TYPE(hash) != T_HASH)
+        if (!RB_TYPE_P(hash, T_HASH))
             rb_raise(rb_eTypeError, "non-hash given");
     }
 
@@ -3270,7 +3519,7 @@ count_objects(int argc, VALUE *argv, VALUE os)
     for (i = 0; i < heaps_used; i++) {
         RVALUE *p, *pend;
 
-        p = objspace->heap.sorted[i].start; pend = objspace->heap.sorted[i].end;
+        p = objspace->heap.sorted[i]->start; pend = objspace->heap.sorted[i]->end;
         for (;p < pend; p++) {
             if (p->as.basic.flags) {
                 counts[BUILTIN_TYPE(p)]++;
@@ -3279,14 +3528,14 @@ count_objects(int argc, VALUE *argv, VALUE os)
                 freed++;
             }
         }
-        total += objspace->heap.sorted[i].slot->limit;
+        total += objspace->heap.sorted[i]->limit;
     }
 
     if (hash == Qnil) {
         hash = rb_hash_new();
     }
     else if (!RHASH_EMPTY_P(hash)) {
-        st_foreach(RHASH_TBL(hash), set_zero, hash);
+        st_foreach_nocheck(RHASH_TBL(hash), set_zero, hash);
     }
     rb_hash_aset(hash, ID2SYM(rb_intern("TOTAL")), SIZET2NUM(total));
     rb_hash_aset(hash, ID2SYM(rb_intern("FREE")), SIZET2NUM(freed));
@@ -3378,7 +3627,7 @@ gc_stat(int argc, VALUE *argv, VALUE self)
     VALUE hash;
 
     if (rb_scan_args(argc, argv, "01", &hash) == 1) {
-        if (TYPE(hash) != T_HASH)
+        if (!RB_TYPE_P(hash, T_HASH))
             rb_raise(rb_eTypeError, "non-hash given");
     }
 
@@ -3433,6 +3682,33 @@ gc_malloc_allocations(VALUE self)
 }
 #endif
 
+/*
+ *  call-seq:
+ *     GC::Profiler.raw_data -> [Hash, ...]
+ *
+ *  Returns an Array of individual raw profile data Hashes ordered
+ *  from earliest to latest by <tt>:GC_INVOKE_TIME</tt>.  For example:
+ *
+ *    [{:GC_TIME=>1.3000000000000858e-05,
+ *      :GC_INVOKE_TIME=>0.010634999999999999,
+ *      :HEAP_USE_SIZE=>289640,
+ *      :HEAP_TOTAL_SIZE=>588960,
+ *      :HEAP_TOTAL_OBJECTS=>14724,
+ *      :GC_IS_MARKED=>false},
+ *      ...
+ *    ]
+ *
+ *  The keys mean:
+ *
+ *  +:GC_TIME+:: Time taken for this run in milliseconds
+ *  +:GC_INVOKE_TIME+:: Time the GC was invoked since startup in seconds
+ *  +:HEAP_USE_SIZE+:: Bytes of heap used
+ *  +:HEAP_TOTAL_SIZE+:: Size of heap in bytes
+ *  +:HEAP_TOTAL_OBJECTS+:: Number of objects
+ *  +:GC_IS_MARKED+:: Is the GC in the mark phase
+ *
+ */
+
 static VALUE
 gc_profile_record_get(void)
 {
@@ -3625,6 +3901,7 @@ Init_GC(void)
     rb_mProfiler = rb_define_module_under(rb_mGC, "Profiler");
     rb_define_singleton_method(rb_mProfiler, "enabled?", gc_profile_enable_get, 0);
     rb_define_singleton_method(rb_mProfiler, "enable", gc_profile_enable, 0);
+    rb_define_singleton_method(rb_mProfiler, "raw_data", gc_profile_record_get, 0);
     rb_define_singleton_method(rb_mProfiler, "disable", gc_profile_disable, 0);
     rb_define_singleton_method(rb_mProfiler, "clear", gc_profile_clear, 0);
     rb_define_singleton_method(rb_mProfiler, "result", gc_profile_result, 0);
diff --git a/include/ruby/ruby.h b/include/ruby/ruby.h
index fc17f76..f63358a 100644
--- a/include/ruby/ruby.h
+++ b/include/ruby/ruby.h
@@ -919,8 +919,8 @@ struct RBignum {
 #define RCOMPLEX(obj) (R_CAST(RComplex)(obj))
 
 #define FL_SINGLETON FL_USER0
-#define FL_MARK      (((VALUE)1)<<5)
-#define FL_RESERVED  (((VALUE)1)<<6) /* will be used in the future GC */
+#define FL_RESERVED1 (((VALUE)1)<<5)
+#define FL_RESERVED2 (((VALUE)1)<<6) /* will be used in the future GC */
 #define FL_FINALIZE  (((VALUE)1)<<7)
 #define FL_TAINT     (((VALUE)1)<<8)
 #define FL_UNTRUSTED (((VALUE)1)<<9)
diff --git a/include/ruby/st.h b/include/ruby/st.h
index 50f2a75..d536c1d 100644
--- a/include/ruby/st.h
+++ b/include/ruby/st.h
@@ -74,6 +74,11 @@ struct st_hash_type {
 
 #define ST_INDEX_BITS (sizeof(st_index_t) * CHAR_BIT)
 
+typedef struct st_packed_entry {
+    st_index_t hash;
+    st_data_t key, val;
+} st_packed_entry;
+
 struct st_table {
     const struct st_hash_type *type;
     st_index_t num_bins;
@@ -91,8 +96,14 @@ struct st_table {
     __extension__
 #endif
     st_index_t num_entries : ST_INDEX_BITS - 1;
-    struct st_table_entry **bins;
-    struct st_table_entry *head, *tail;
+    union {
+	struct {
+	    struct st_table_entry **bins;
+	    struct st_table_entry *head, *tail;
+	} big;
+	struct st_packed_bins *packed;
+	struct st_packed_entry upacked;
+    } as;
 };
 
 #define st_is_member(table,key) st_lookup((table),(key),(st_data_t *)0)
@@ -114,6 +125,7 @@ int st_insert2(st_table *, st_data_t, st_data_t, st_data_t (*)(st_data_t));
 int st_lookup(st_table *, st_data_t, st_data_t *);
 int st_get_key(st_table *, st_data_t, st_data_t *);
 int st_foreach(st_table *, int (*)(ANYARGS), st_data_t);
+int st_foreach_nocheck(st_table *, int (*)(ANYARGS), st_data_t);
 int st_reverse_foreach(st_table *, int (*)(ANYARGS), st_data_t);
 void st_add_direct(st_table *, st_data_t, st_data_t);
 void st_free_table(st_table *);
diff --git a/internal.h b/internal.h
index 681e010..d879fb1 100644
--- a/internal.h
+++ b/internal.h
@@ -96,6 +96,7 @@ void Init_File(void);
 
 /* gc.c */
 void Init_heap(void);
+void *ruby_mimmalloc(size_t size);
 
 /* inits.c */
 void rb_call_inits(void);
@@ -112,6 +113,8 @@ VALUE rb_iseq_clone(VALUE iseqval, VALUE newcbase);
 
 /* load.c */
 VALUE rb_get_load_path(void);
+void rb_reset_expanded_cache();
+void rb_load_path_ary_push(VALUE path);
 
 /* math.c */
 VALUE rb_math_atan2(VALUE, VALUE);
diff --git a/load.c b/load.c
index 0ff4b60..b6a46fe 100644
--- a/load.c
+++ b/load.c
@@ -4,6 +4,7 @@
 
 #include "ruby/ruby.h"
 #include "ruby/util.h"
+#include "ruby/encoding.h"
 #include "internal.h"
 #include "dln.h"
 #include "eval_intern.h"
@@ -18,6 +19,7 @@ VALUE ruby_dln_librefs;
 #define IS_DLEXT(e) (strcmp((e), DLEXT) == 0)
 #endif
 
+static int sorted_loaded_features = 1;
 
 static const char *const loadable_ext[] = {
     ".rb", DLEXT,
@@ -27,28 +29,44 @@ static const char *const loadable_ext[] = {
     0
 };
 
-VALUE
-rb_get_load_path(void)
-{
-    VALUE load_path = GET_VM()->load_path;
-    return load_path;
-}
+static VALUE rb_checked_expanded_cache(int*);
+static void rb_set_expanded_cache(VALUE, int);
+static VALUE rb_expand_load_paths(long, VALUE*, int*);
+static int cached_expanded_load_path = 1;
 
 VALUE
 rb_get_expanded_load_path(void)
 {
-    VALUE load_path = rb_get_load_path();
-    VALUE ary;
-    long i;
+    VALUE expanded = rb_checked_expanded_cache(NULL);
 
-    ary = rb_ary_new2(RARRAY_LEN(load_path));
-    for (i = 0; i < RARRAY_LEN(load_path); ++i) {
-	VALUE path = rb_file_expand_path(RARRAY_PTR(load_path)[i], Qnil);
-	rb_str_freeze(path);
-	rb_ary_push(ary, path);
+    if ( !RTEST(expanded) ) {
+	VALUE load_path = GET_VM()->load_path;
+	int has_relative = 0;
+
+	if (!load_path) return 0;
+
+	expanded = rb_expand_load_paths(
+			RARRAY_LEN(load_path), RARRAY_PTR(load_path),
+			&has_relative);
+	RB_GC_GUARD(load_path);
+
+	if (cached_expanded_load_path) {
+	    rb_set_expanded_cache(expanded, has_relative);
+	}
+    } else {
+	expanded = rb_ary_dup(expanded);
     }
-    rb_obj_freeze(ary);
-    return ary;
+    return expanded;
+}
+
+VALUE
+rb_get_load_path(void)
+{
+    VALUE load_path =
+	cached_expanded_load_path ?
+	    rb_get_expanded_load_path():
+	    GET_VM()->load_path;
+    return load_path;
 }
 
 static VALUE
@@ -129,6 +147,9 @@ loaded_feature_path_i(st_data_t v, st_data_t b, st_data_t f)
     return ST_STOP;
 }
 
+static long rb_feature_first_equal_or_greater(VALUE, const char *, long);
+static int  rb_stop_search_feature(VALUE, const char *, long);
+
 static int
 rb_feature_p(const char *feature, const char *ext, int rb, int expanded, const char **fn)
 {
@@ -151,8 +172,10 @@ rb_feature_p(const char *feature, const char *ext, int rb, int expanded, const c
 	type = 0;
     }
     features = get_loaded_features();
-    for (i = 0; i < RARRAY_LEN(features); ++i) {
+    i = rb_feature_first_equal_or_greater(features, feature, len);
+    for (; i < RARRAY_LEN(features); ++i) {
 	v = RARRAY_PTR(features)[i];
+	if (rb_stop_search_feature(v, feature, len)) break;
 	f = StringValuePtr(v);
 	if ((n = RSTRING_LEN(v)) < len) continue;
 	if (strncmp(f, feature, len) != 0) {
@@ -176,16 +199,16 @@ rb_feature_p(const char *feature, const char *ext, int rb, int expanded, const c
 	}
     }
     loading_tbl = get_loading_table();
-    if (loading_tbl) {
+    if (loading_tbl && loading_tbl->num_entries > 0) {
 	f = 0;
 	if (!expanded) {
 	    struct loaded_feature_searching fs;
 	    fs.name = feature;
 	    fs.len = len;
 	    fs.type = type;
-	    fs.load_path = load_path ? load_path : rb_get_load_path();
+	    fs.load_path = load_path ? load_path : rb_get_expanded_load_path();
 	    fs.result = 0;
-	    st_foreach(loading_tbl, loaded_feature_path_i, (st_data_t)&fs);
+	    st_foreach_nocheck(loading_tbl, loaded_feature_path_i, (st_data_t)&fs);
 	    if ((f = fs.result) != 0) {
 		if (fn) *fn = f;
 		goto loading;
@@ -251,6 +274,170 @@ rb_feature_provided(const char *feature, const char **loading)
     return FALSE;
 }
 
+static long
+feature_basename_length(const char *feature, long flen)
+{
+    if (sorted_loaded_features) {
+	const char *ext = strrchr(feature, '.');
+	return ext && !strchr(ext, '/') ? ext - feature : flen;
+    } else {
+	return 0;
+    }
+}
+
+static int
+compare_feature_name(const char *left, long llen, const char *right, long rlen)
+{
+    int diff = 0;
+    while (llen-- && rlen--) {
+	diff = left[llen] - right[rlen];
+	if (diff) break;
+	if (left[llen] == '/') break;
+    }
+    return diff;
+}
+
+static int
+rb_compare_feature_name(VALUE loaded, const char *feature, long flen)
+{
+    const char *loaded_name = StringValuePtr(loaded);
+    long loaded_len = feature_basename_length(loaded_name, RSTRING_LEN(loaded));
+    return compare_feature_name(loaded_name, loaded_len, feature, flen);
+}
+
+/* used to find when equal features run out */
+static int
+rb_stop_search_feature(VALUE loaded, const char *feature, long flen)
+{
+    if (sorted_loaded_features)
+	return rb_compare_feature_name(loaded, feature, flen) > 0;
+    else
+	return FALSE;
+}
+
+/* returns first position to search feature from */
+static long
+rb_feature_first_equal_or_greater(VALUE features, const char *feature, long flen)
+{
+    if (sorted_loaded_features) {
+	long before = 0, first = RARRAY_LEN(features);
+	VALUE *values = RARRAY_PTR(features);
+	if (first == 0)
+	    return 0;
+	if (rb_compare_feature_name(values[0], feature, flen) >= 0)
+	    return 0;
+
+	while (first - before > 1) {
+	    long mid = (first + before) / 2;
+	    long cmp = rb_compare_feature_name(values[mid], feature, flen);
+	    if (cmp >= 0)
+		first = mid;
+	    else
+		before = mid;
+	}
+	return first;
+    } else {
+	return 0;
+    }
+}
+
+/* returns position to insert new feature in */
+static long
+rb_feature_first_greater(VALUE features, const char *feature, long flen)
+{
+    if (sorted_loaded_features) {
+	long before = 0, first = RARRAY_LEN(features);
+	VALUE *values = RARRAY_PTR(features);
+	if (first == 0)
+	    return 0;
+	if (rb_compare_feature_name(values[0], feature, flen) > 0)
+	    return 0;
+	if (rb_compare_feature_name(values[first-1], feature, flen) <= 0)
+	    return first;
+
+	while (first - before > 1) {
+	    long mid = (first + before) / 2;
+	    long cmp = rb_compare_feature_name(values[mid], feature, flen);
+	    if (cmp > 0)
+		first = mid;
+	    else
+		before = mid;
+	}
+	return first;
+    } else {
+	return RARRAY_LEN(features);
+    }
+}
+
+
+static VALUE
+rb_push_feature_1(VALUE features, VALUE feature)
+{
+    const char *fname = StringValuePtr(feature);
+    long flen = feature_basename_length(fname, RSTRING_LEN(feature));
+    long i = rb_feature_first_greater(features, fname, flen);
+    rb_ary_push(features, feature);
+    if ( i < RARRAY_LEN(features) - 1 ) {
+	MEMMOVE(RARRAY_PTR(features) + i + 1, RARRAY_PTR(features) + i,
+		VALUE, RARRAY_LEN(features) - i - 1);
+	RARRAY_PTR(features)[i] = feature;
+    }
+    return features;
+}
+
+static VALUE
+rb_push_feature_m(long argc, VALUE *argv, VALUE features)
+{
+    while (argc--) {
+	rb_push_feature_1(features, *argv++);
+    }
+    return features;
+}
+
+static VALUE
+rb_concat_features(VALUE features, VALUE add)
+{
+    add = rb_convert_type(add, T_ARRAY, "Array", "to_ary");
+    if (RARRAY_LEN(add)) {
+	rb_push_feature_m(RARRAY_LEN(add), RARRAY_PTR(add), features);
+    }
+    return features;
+}
+static const char *load_features_undefined_methods[] = {
+    "[]=", "reverse!", "rotate!", "sort!", "sort_by!",
+    "collect!", "map!", "shuffle!", "fill", "insert",
+    NULL
+};
+
+static VALUE
+rb_loaded_features_init(void)
+{
+    char *sorted_flag;
+    const char **name;
+    VALUE loaded_features = rb_ary_new();
+    VALUE loaded_features_c = rb_singleton_class(loaded_features);
+
+    sorted_flag = getenv("RUBY_LOADED_FEATURES_SORTED");
+    if (sorted_flag != NULL) {
+	int sorted_set = atoi(sorted_flag);
+	if (RTEST(ruby_verbose))
+	    fprintf(stderr, "sorted_loaded_features=%d (%d)\n", sorted_set, sorted_loaded_features);
+	sorted_loaded_features = sorted_set;
+    }
+
+    for(name = load_features_undefined_methods; *name; name++) {
+	rb_undef_method(loaded_features_c, *name);
+    }
+
+    if (sorted_loaded_features) {
+	rb_define_method(loaded_features_c, "<<", rb_push_feature_1, 1);
+	rb_define_method(loaded_features_c, "push", rb_push_feature_m, -1);
+	rb_define_method(loaded_features_c, "concat", rb_concat_features, 1);
+	rb_define_method(loaded_features_c, "unshift", rb_push_feature_m, -1);
+    }
+    return loaded_features;
+}
+
 static void
 rb_provide_feature(VALUE feature)
 {
@@ -258,7 +445,10 @@ rb_provide_feature(VALUE feature)
 	rb_raise(rb_eRuntimeError,
 		 "$LOADED_FEATURES is frozen; cannot append feature");
     }
-    rb_ary_push(get_loaded_features(), feature);
+    if (sorted_loaded_features)
+	rb_push_feature_1(get_loaded_features(), feature);
+    else
+	rb_ary_push(get_loaded_features(), feature);
 }
 
 void
@@ -760,6 +950,226 @@ rb_f_autoload_p(VALUE obj, VALUE sym)
     return rb_mod_autoload_p(klass, sym);
 }
 
+/* $LOAD_PATH methods which invalidates cache */
+static const char *load_path_reset_cache_methods[] = {
+    "[]=", "collect!", "compact!", "delete",
+    "delete_if", "fill", "flatten!", "insert", "keep_if",
+    "map!", "reject!", "replace", "select!", "shuffle!",
+    "sort!", "sort_by!", "uniq!", NULL
+};
+
+/* $LOAD_PATH methods which sends also to cache */
+static const char *load_path_apply_to_cache_methods[] = {
+    "clear", "delete_at", "pop", "reverse!", "rotate!",
+    "shift", "slice!", NULL
+};
+
+/* $LOAD_PATH methods which sends to cache whith expanded arguments */
+static const char *load_path_apply_expanded_methods[] = {
+    "<<", "push", "unshift", NULL
+};
+
+void
+rb_reset_expanded_cache()
+{
+    GET_VM()->load_path_expanded_cache = 0;
+}
+
+static VALUE
+rb_load_path_expanded_cache()
+{
+    VALUE cache = GET_VM()->load_path_expanded_cache;
+    VALUE expanded = Qnil;
+    if (RTEST(cache)) {
+	expanded = RARRAY_PTR(cache)[2];
+    }
+    return expanded;
+}
+
+/* Return cache only if we still in the same working directory
+ * and filesystem_encoding didn't change
+ * Invalidate cache otherwise
+ */
+static VALUE
+rb_checked_expanded_cache(int *has_relative)
+{
+    VALUE cache = GET_VM()->load_path_expanded_cache;
+    VALUE expanded = Qnil;
+    if (RTEST(cache)) {
+	VALUE curwd = RARRAY_PTR(cache)[0];
+	VALUE encindex = RARRAY_PTR(cache)[1];
+	int cache_valid = rb_filesystem_encindex() == FIX2INT(encindex);
+
+	if ( cache_valid ) {
+	    cache_valid = curwd == Qtrue;
+	    if (has_relative) {
+		*has_relative = cache_valid;
+	    }
+	    if (!cache_valid ) {
+		char *cwd = my_getcwd();
+		cache_valid = !strcmp(RSTRING_PTR(curwd), cwd);
+		xfree(cwd);
+	    }
+	}
+
+	if ( !cache_valid ) {
+	    rb_reset_expanded_cache();
+	} else {
+	    expanded = RARRAY_PTR(cache)[2];
+	}
+    }
+    RB_GC_GUARD(cache);
+    return expanded;
+}
+
+static void
+rb_set_expanded_cache(VALUE expanded, int has_relative)
+{
+    VALUE cache = rb_ary_new2(3);
+
+    if (has_relative) {
+	char *cwd = my_getcwd();
+	rb_ary_push(cache, rb_str_new_cstr(cwd));
+	xfree(cwd);
+    } else {
+	rb_ary_push(cache, Qtrue);
+    }
+
+    rb_ary_push(cache, INT2FIX(rb_filesystem_encindex()));
+    rb_ary_push(cache, rb_ary_dup(expanded));
+    GET_VM()->load_path_expanded_cache = cache;
+}
+
+static VALUE
+rb_expand_load_paths(long pathc, VALUE* paths, int *has_relative)
+{
+    long i;
+    const char *p;
+    VALUE path, expanded = rb_ary_new2(pathc);
+
+    for(i = 0; i < pathc; i++) {
+	path = rb_get_path(paths[i]);
+	p = RSTRING_PTR(path);
+	*has_relative = *has_relative || !rb_is_absolute_path(p);
+	path = rb_file_expand_path(path, Qnil);
+	rb_str_freeze(path);
+	rb_ary_push(expanded, path);
+    }
+
+    return expanded;
+}
+
+/* Invalidating $LOAD_PATH methods implementation */
+static VALUE
+rb_load_path_reset_cache_method(int argc, VALUE *argv, VALUE self)
+{
+    rb_reset_expanded_cache();
+    return rb_call_super(argc, argv);
+}
+
+/* Proxying $LOAD_PATH methods implementation */
+static VALUE
+rb_load_path_apply_to_cache_method(int argc, VALUE *argv, VALUE self)
+{
+    VALUE load_path_expanded = rb_load_path_expanded_cache();
+    if (RTEST(load_path_expanded)) {
+	ID func = rb_frame_this_func();
+	rb_funcall2(load_path_expanded, func, argc, argv);
+    }
+    return rb_call_super(argc, argv);
+}
+
+/* Proxying with expansion $LOAD_PATH methods implementation */
+static VALUE
+rb_load_path_apply_expanded_method(int argc, VALUE *argv, VALUE self)
+{
+    int old_has_relative = 0;
+    /* We call methods on cache only if we still in the same working directory */
+    VALUE load_path_expanded = rb_checked_expanded_cache(&old_has_relative);
+    if (RTEST(load_path_expanded)) {
+	int has_relative = 0;
+	ID func = rb_frame_this_func();
+	VALUE expanded = rb_expand_load_paths(argc, argv, &has_relative);
+
+	rb_funcall2(load_path_expanded, func, argc, RARRAY_PTR(expanded));
+
+	if (!old_has_relative && has_relative) {
+	    rb_set_expanded_cache(load_path_expanded, has_relative);
+	}
+	RB_GC_GUARD(expanded);
+    }
+    return rb_call_super(argc, argv);
+}
+/* $LOAD_PATH.concat(ary) - special, we call push(*ary) instead
+ * cause I'm lazy a bit and wish not to rewrite method above second time :)
+ */
+static VALUE
+rb_load_path_concat(VALUE self, VALUE ary)
+{
+    ID push;
+    CONST_ID(push, "push");
+    RB_GC_GUARD(ary);
+    return rb_funcall2(self, push, (int)RARRAY_LEN(ary), RARRAY_PTR(ary));
+}
+
+void
+rb_load_path_ary_push(VALUE path)
+{
+    int old_has_relative = 0;
+    VALUE load_path_expanded = rb_checked_expanded_cache(&old_has_relative);
+    if (RTEST(load_path_expanded)) {
+	int has_relative = 0;
+	VALUE expanded = rb_expand_load_paths(1, &path, &has_relative);
+
+	rb_ary_push(load_path_expanded, RARRAY_PTR(expanded)[0]);
+
+	if (!old_has_relative && has_relative) {
+	    rb_set_expanded_cache(load_path_expanded, has_relative);
+	}
+	RB_GC_GUARD(expanded);
+    }
+
+    rb_ary_push(GET_VM()->load_path, path);
+}
+
+static VALUE
+rb_load_path_init(void)
+{
+    const char **name;
+    VALUE load_path = rb_ary_new();
+    char *cached_flag;
+
+    cached_flag = getenv("RUBY_CACHED_LOAD_PATH");
+    if (cached_flag != NULL) {
+	cached_expanded_load_path = atoi(cached_flag);
+    }
+
+    /* Do all the magick if user did not disable it
+     * with RUBY_CACHED_LOAD_PATH=0 environment variable
+     */
+    if (cached_expanded_load_path) {
+	VALUE load_path_c = rb_singleton_class(load_path);
+
+	for(name = load_path_reset_cache_methods; *name; name++ ) {
+	    rb_define_method(load_path_c, *name, rb_load_path_reset_cache_method, -1);
+	}
+
+	for(name = load_path_apply_to_cache_methods; *name; name++ ) {
+	    rb_define_method(load_path_c, *name, rb_load_path_apply_to_cache_method, -1);
+	}
+
+	for(name = load_path_apply_expanded_methods; *name; name++ ) {
+	    rb_define_method(load_path_c, *name, rb_load_path_apply_expanded_method, -1);
+	}
+
+	rb_define_method(load_path_c, "concat", rb_load_path_concat, 1);
+    }
+
+    rb_reset_expanded_cache();
+
+    return load_path;
+}
+
 void
 Init_load()
 {
@@ -772,11 +1182,11 @@ Init_load()
     rb_define_hooked_variable(var_load_path, (VALUE*)vm, load_path_getter, rb_gvar_readonly_setter);
     rb_alias_variable(rb_intern("$-I"), id_load_path);
     rb_alias_variable(rb_intern("$LOAD_PATH"), id_load_path);
-    vm->load_path = rb_ary_new();
+    vm->load_path = rb_load_path_init();
 
     rb_define_virtual_variable("$\"", get_loaded_features, 0);
     rb_define_virtual_variable("$LOADED_FEATURES", get_loaded_features, 0);
-    vm->loaded_features = rb_ary_new();
+    vm->loaded_features = rb_loaded_features_init();
 
     rb_define_global_function("load", rb_f_load, -1);
     rb_define_global_function("require", rb_f_require, 1);
diff --git a/marshal.c b/marshal.c
index 9a43cdb..a1b46f8 100644
--- a/marshal.c
+++ b/marshal.c
@@ -106,7 +106,7 @@ static void
 mark_marshal_compat_t(void *tbl)
 {
     if (!tbl) return;
-    st_foreach(tbl, mark_marshal_compat_i, 0);
+    st_foreach_nocheck(tbl, mark_marshal_compat_i, 0);
 }
 
 void
diff --git a/node.h b/node.h
index bb96107..37938ea 100644
--- a/node.h
+++ b/node.h
@@ -260,7 +260,7 @@ typedef struct RNode {
 
 #define RNODE(obj)  (R_CAST(RNode)(obj))
 
-/* 0..4:T_TYPES, 5:FL_MARK, 6:reserved, 7:NODE_FL_NEWLINE */
+/* 0..4:T_TYPES, 5:reserved, 6:reserved, 7:NODE_FL_NEWLINE */
 #define NODE_FL_NEWLINE (((VALUE)1)<<7)
 #define NODE_FL_CREF_PUSHED_BY_EVAL NODE_FL_NEWLINE
 
diff --git a/object.c b/object.c
index f45e013..b59e1a0 100644
--- a/object.c
+++ b/object.c
@@ -278,7 +278,7 @@ rb_obj_clone(VALUE obj)
     }
     clone = rb_obj_alloc(rb_obj_class(obj));
     RBASIC(clone)->klass = rb_singleton_class_clone(obj);
-    RBASIC(clone)->flags = (RBASIC(obj)->flags | FL_TEST(clone, FL_TAINT) | FL_TEST(clone, FL_UNTRUSTED)) & ~(FL_FREEZE|FL_FINALIZE|FL_MARK);
+    RBASIC(clone)->flags = (RBASIC(obj)->flags | FL_TEST(clone, FL_TAINT) | FL_TEST(clone, FL_UNTRUSTED)) & ~(FL_FREEZE|FL_FINALIZE);
     init_copy(clone, obj);
     rb_funcall(clone, id_init_clone, 1, obj);
     RBASIC(clone)->flags |= RBASIC(obj)->flags & FL_FREEZE;
diff --git a/parse.y b/parse.y
index b0da1b7..bf054c2 100644
--- a/parse.y
+++ b/parse.y
@@ -10040,7 +10040,7 @@ rb_sym_all_symbols(void)
 {
     VALUE ary = rb_ary_new2(global_symbols.sym_id->num_entries);
 
-    st_foreach(global_symbols.sym_id, symbols_i, ary);
+    st_foreach_nocheck(global_symbols.sym_id, symbols_i, ary);
     return ary;
 }
 
diff --git a/pool_alloc.h b/pool_alloc.h
new file mode 100644
index 0000000..957708e
--- /dev/null
+++ b/pool_alloc.h
@@ -0,0 +1,11 @@
+#ifndef POOL_ALLOC_H
+#define POOL_ALLOC_H
+
+#define POOL_ALLOC_API
+#ifdef POOL_ALLOC_API
+void  ruby_xpool_free(void *ptr);
+void *ruby_xpool_malloc_6p();
+void *ruby_xpool_malloc_11p();
+#endif
+
+#endif
diff --git a/pool_alloc.inc.h b/pool_alloc.inc.h
new file mode 100644
index 0000000..e06baba
--- /dev/null
+++ b/pool_alloc.inc.h
@@ -0,0 +1,152 @@
+/*
+ * this is generic pool allocator
+ * you should define following macroses:
+ * ITEM_NAME - unique identifier, which allows to hold functions in a namespace
+ * ITEM_TYPEDEF(name) - passed to typedef to localize item type
+ * free_entry - desired name of function for free entry
+ * alloc_entry - defired name of function for allocate entry
+ */
+
+#if POOL_ALLOC_PART == 1
+#define DEFAULT_POOL_SIZE 8192
+typedef unsigned int pool_holder_counter;
+
+typedef struct pool_entry_list pool_entry_list;
+typedef struct pool_holder pool_holder;
+
+typedef struct pool_header {
+    pool_holder         *first;
+    pool_holder         *_black_magick;
+    pool_holder_counter  size; // size of entry in sizeof(void*) items
+    pool_holder_counter  total; // size of entry in sizeof(void*) items
+} pool_header;
+
+struct pool_holder {
+    pool_holder_counter free, total;
+    pool_header  *header;
+    void               *freep;
+    pool_holder        *fore, *back;
+    void *data[1];
+};
+#define POOL_DATA_SIZE(pool_size) (((pool_size) - sizeof(void*) * 6 - offsetof(pool_holder, data)) / sizeof(void*))
+#define POOL_ENTRY_SIZE(item_type) ((sizeof(item_type) - 1) / sizeof(void*) + 1)
+#define POOL_HOLDER_COUNT(pool_size, item_type) (POOL_DATA_SIZE(pool_size)/POOL_ENTRY_SIZE(item_type))
+#define INIT_POOL(item_type) {NULL, NULL, POOL_ENTRY_SIZE(item_type), POOL_HOLDER_COUNT(DEFAULT_POOL_SIZE, item_type)}
+
+#elif POOL_ALLOC_PART == 2
+static pool_holder *
+pool_holder_alloc(pool_header *header)
+{
+    pool_holder *holder;
+    pool_holder_counter i, size, count;
+    register void **ptr;
+
+    size_t sz = offsetof(pool_holder, data) +
+	    header->size * header->total * sizeof(void*);
+#define objspace (&rb_objspace)
+    vm_malloc_prepare(objspace, DEFAULT_POOL_SIZE);
+    if (header->first != NULL) return header->first;
+    TRY_WITH_GC(holder = (pool_holder*) aligned_malloc(DEFAULT_POOL_SIZE, sz));
+    malloc_increase += DEFAULT_POOL_SIZE;
+#if CALC_EXACT_MALLOC_SIZE
+    objspace->malloc_params.allocated_size += DEFAULT_POOL_SIZE;
+    objspace->malloc_params.allocations++;
+#endif
+#undef objspace
+
+    size = header->size;
+    count = header->total;
+    holder->free = count;
+    holder->total = count;
+    holder->header = header;
+    holder->fore = NULL;
+    holder->back = NULL;
+    holder->freep = &holder->data;
+    ptr = holder->data;
+    for(i = count - 1; i; i-- ) {
+	ptr = *ptr = ptr + size;
+    }
+    *ptr = NULL;
+    header->first = holder;
+    return holder;
+}
+
+static inline void
+pool_holder_unchaing(pool_header *header, pool_holder *holder)
+{
+    register pool_holder *fore = holder->fore, *back = holder->back;
+    holder->fore = NULL;
+    holder->back = NULL;
+    if (fore != NULL)  fore->back     = back;
+    else               header->_black_magick = back;
+    if (back != NULL)  back->fore     = fore;
+    else               header->first = fore;
+}
+
+static inline pool_holder *
+entry_holder(void **entry)
+{
+    return (pool_holder*)(((uintptr_t)entry) & ~(DEFAULT_POOL_SIZE - 1));
+}
+
+static inline void
+pool_free_entry(void **entry)
+{
+    pool_holder *holder = entry_holder(entry);
+    pool_header *header = holder->header;
+
+    if (holder->free++ == 0) {
+	register pool_holder *first = header->first;
+	if (first == NULL) {
+	    header->first = holder;
+	} else {
+	    holder->back = first;
+	    holder->fore = first->fore;
+	    first->fore = holder;
+	    if (holder->fore)
+		holder->fore->back = holder;
+	    else
+		header->_black_magick = holder;
+	}
+    } else if (holder->free == holder->total && header->first != holder ) {
+	pool_holder_unchaing(header, holder);
+	aligned_free(holder);
+#if CALC_EXACT_MALLOC_SIZE
+	rb_objspace.malloc_params.allocated_size -= DEFAULT_POOL_SIZE;
+	rb_objspace.malloc_params.allocations--;
+#endif
+	return;
+    }
+
+    *entry = holder->freep;
+    holder->freep = entry;
+}
+
+static inline void*
+pool_alloc_entry(pool_header *header)
+{
+    pool_holder *holder = header->first;
+    void **result;
+    if (holder == NULL) {
+	holder = pool_holder_alloc(header);
+    }
+
+    result = holder->freep;
+    holder->freep = *result;
+
+    if (--holder->free == 0) {
+	pool_holder_unchaing(header, holder);
+    }
+
+    return result;
+}
+
+static void
+pool_finalize_header(pool_header *header)
+{
+    if (header->first) {
+        aligned_free(header->first);
+        header->first = NULL;
+    }
+}
+#endif
diff --git a/process.c b/process.c
index 2a16757..7a2201c 100644
--- a/process.c
+++ b/process.c
@@ -666,7 +666,7 @@ rb_waitpid(rb_pid_t pid, int *st, int flags)
 	    struct wait_data data;
 	    data.pid = (rb_pid_t)-1;
 	    data.status = -1;
-	    st_foreach(pid_tbl, wait_each, (st_data_t)&data);
+	    st_foreach_nocheck(pid_tbl, wait_each, (st_data_t)&data);
 	    if (data.status != -1) {
 		rb_last_status_set(data.status, data.pid);
 		return data.pid;
@@ -2162,11 +2162,11 @@ run_exec_dup2(VALUE ary, VALUE save, char *errmsg, size_t errmsg_buflen)
         }
     }
 
-    xfree(pairs);
+    free(pairs);
     return 0;
 
   fail:
-    xfree(pairs);
+    free(pairs);
     return -1;
 }
 
diff --git a/re.c b/re.c
index 9fdbf54..25467d7 100644
--- a/re.c
+++ b/re.c
@@ -769,7 +769,7 @@ onig_new_with_source(regex_t** reg, const UChar* pattern, const UChar* pattern_e
 {
   int r;
 
-  *reg = (regex_t* )xmalloc(sizeof(regex_t));
+  *reg = (regex_t* )malloc(sizeof(regex_t));
   if (IS_NULL(*reg)) return ONIGERR_MEMORY;
 
   r = onig_reg_init(*reg, option, ONIGENC_CASE_FOLD_DEFAULT, enc, syntax);
diff --git a/ruby.c b/ruby.c
index 3c97d01..b9b9fd5 100644
--- a/ruby.c
+++ b/ruby.c
@@ -209,7 +209,6 @@ push_include(const char *path, VALUE (*filter)(VALUE))
 {
     const char sep = PATH_SEP_CHAR;
     const char *p, *s;
-    VALUE load_path = GET_VM()->load_path;
 
     p = path;
     while (*p) {
@@ -217,7 +216,7 @@ push_include(const char *path, VALUE (*filter)(VALUE))
 	    p++;
 	if (!*p) break;
 	for (s = p; *s && *s != sep; s = CharNext(s));
-	rb_ary_push(load_path, (*filter)(rubylib_mangled_path(p, s - p)));
+	rb_load_path_ary_push((*filter)(rubylib_mangled_path(p, s - p)));
 	p = s;
     }
 }
@@ -338,7 +337,6 @@ ruby_init_loadpath(void)
 void
 ruby_init_loadpath_safe(int safe_level)
 {
-    VALUE load_path;
     ID id_initial_load_path_mark;
     extern const char ruby_initial_load_paths[];
     const char *paths = ruby_initial_load_paths;
@@ -438,7 +436,6 @@ ruby_init_loadpath_safe(int safe_level)
 #define RUBY_RELATIVE(path, len) rubylib_mangled_path((path), (len))
 #define PREFIX_PATH() RUBY_RELATIVE(exec_prefix, sizeof(exec_prefix)-1)
 #endif
-    load_path = GET_VM()->load_path;
 
     if (safe_level == 0) {
 #ifdef MANGLED_PATH
@@ -452,7 +449,7 @@ ruby_init_loadpath_safe(int safe_level)
 	size_t len = strlen(paths);
 	VALUE path = RUBY_RELATIVE(paths, len);
 	rb_ivar_set(path, id_initial_load_path_mark, path);
-	rb_ary_push(load_path, path);
+	rb_load_path_ary_push(path);
 	paths += len + 1;
     }
 
@@ -1349,6 +1346,7 @@ process_options(int argc, char **argv, struct cmdline_options *opt)
 	for (i = 0; i < RARRAY_LEN(load_path); ++i) {
 	    rb_enc_associate(RARRAY_PTR(load_path)[i], lenc);
 	}
+	rb_reset_expanded_cache();
     }
     if (!(opt->disable & DISABLE_BIT(gems))) {
 #if defined DISABLE_RUBYGEMS && DISABLE_RUBYGEMS
diff --git a/st.c b/st.c
index fda5784..675918d 100644
--- a/st.c
+++ b/st.c
@@ -7,6 +7,7 @@
 #include "st.h"
 #else
 #include "ruby/ruby.h"
+#include "pool_alloc.h"
 #endif
 
 #include <stdio.h>
@@ -25,8 +26,21 @@ struct st_table_entry {
     st_table_entry *fore, *back;
 };
 
+#define STATIC_ASSERT(name, expr) typedef int static_assert_##name##_check[(expr) ? 1 : -1];
+
 #define ST_DEFAULT_MAX_DENSITY 5
 #define ST_DEFAULT_INIT_TABLE_SIZE 11
+#define ST_DEFAULT_SECOND_TABLE_SIZE 19
+#define ST_DEFAULT_PACKED_TABLE_SIZE 18
+#define PACKED_UNIT (int)(sizeof(st_packed_entry) / sizeof(st_table_entry*))
+#define MAX_PACKED_HASH (int)(ST_DEFAULT_PACKED_TABLE_SIZE * sizeof(st_table_entry*) / sizeof(st_packed_entry))
+
+typedef struct st_packed_bins {
+    st_packed_entry kv[MAX_PACKED_HASH];
+} st_packed_bins;
+
+STATIC_ASSERT(st_packed_entry, sizeof(st_packed_entry) == sizeof(st_table_entry*[PACKED_UNIT]))
+STATIC_ASSERT(st_packed_bins, sizeof(st_packed_bins) <= sizeof(st_table_entry*[ST_DEFAULT_PACKED_TABLE_SIZE]))
 
     /*
      * DEFAULT_MAX_DENSITY is the default for the largest we allow the
@@ -38,7 +52,8 @@ struct st_table_entry {
      *
      */
 
-static const struct st_hash_type type_numhash = {
+#define type_numhash st_hashtype_num
+const struct st_hash_type st_hashtype_num = {
     st_numcmp,
     st_numhash,
 };
@@ -61,20 +76,99 @@ static void rehash(st_table *);
 #ifdef RUBY
 #define malloc xmalloc
 #define calloc xcalloc
+#define realloc xrealloc
 #define free(x) xfree(x)
 #endif
 
 #define numberof(array) (int)(sizeof(array) / sizeof((array)[0]))
 
-#define alloc(type) (type*)malloc((size_t)sizeof(type))
-#define Calloc(n,s) (char*)calloc((n),(s))
-
 #define EQUAL(table,x,y) ((x)==(y) || (*(table)->type->compare)((x),(y)) == 0)
 
-/* remove cast to unsigned int in the future */
-#define do_hash(key,table) (unsigned int)(st_index_t)(*(table)->type->hash)((key))
+#define do_hash(key,table) (st_index_t)(*(table)->type->hash)((key))
 #define do_hash_bin(key,table) (do_hash((key), (table))%(table)->num_bins)
 
+/* preparation for possible allocation improvements */
+#ifdef POOL_ALLOC_API
+#define st_alloc_entry() (st_table_entry *)ruby_xpool_malloc_6p()
+#define st_free_entry(entry) ruby_xpool_free(entry)
+#define st_alloc_table() (st_table *)ruby_xpool_malloc_6p()
+#define st_dealloc_table(table) ruby_xpool_free(table)
+static inline st_table_entry **
+st_alloc_bins(st_index_t size)
+{
+    st_table_entry **result;
+    if (size == 11) {
+        result = (st_table_entry **) ruby_xpool_malloc_11p();
+        memset(result, 0, 11 * sizeof(st_table_entry *));
+    }
+    else
+        result = (st_table_entry **) ruby_xcalloc(size, sizeof(st_table_entry*));
+    return result;
+}
+static inline void
+st_free_bins(st_table_entry **bins, st_index_t size)
+{
+    if (size == 11)
+	ruby_xpool_free(bins);
+    else
+	ruby_xfree(bins);
+}
+static inline st_table_entry**
+st_realloc_bins(st_table_entry **bins, st_index_t newsize, st_index_t oldsize)
+{
+    st_free_bins(bins, oldsize);
+    return st_alloc_bins(newsize);
+}
+#else
+#define st_alloc_entry() (st_table_entry *)malloc(sizeof(st_table_entry))
+#define st_free_entry(entry) free(entry)
+#define st_alloc_table() (st_table *)malloc(sizeof(st_table))
+#define st_dealloc_table(table) free(table)
+#define st_alloc_bins(size) (st_table_entry **)calloc(size, sizeof(st_table_entry *))
+#define st_free_bins(bins, size) free(bins)
+static inline st_table_entry**
+st_realloc_bins(st_table_entry **bins, st_index_t newsize, st_index_t oldsize)
+{
+    bins = (st_table_entry **)realloc(bins, newsize * sizeof(st_table_entry *));
+    MEMZERO(bins, st_table_entry*, newsize);
+    return bins;
+}
+#endif
+
+/* preparation for possible packing improvements */
+#define PACKED_BINS(table) (*(table)->as.packed)
+#define PACKED_ENT(table, i) PACKED_BINS(table).kv[i]
+#define PKEY(table, i) PACKED_ENT((table), (i)).key
+#define PVAL(table, i) PACKED_ENT((table), (i)).val
+#define PHASH(table, i) PACKED_ENT((table), (i)).hash
+#define PKEY_SET(table, i, v) (PKEY((table), (i)) = (v))
+#define PVAL_SET(table, i, v) (PVAL((table), (i)) = (v))
+#define PHASH_SET(table, i, v) (PHASH((table), (i)) = (v))
+/* this function depends much on packed layout, so that it placed here */
+static inline void
+remove_packed_entry(st_table *table, st_index_t i)
+{
+    table->num_entries--;
+    if (i < table->num_entries) {
+	MEMMOVE(&PACKED_ENT(table, i), &PACKED_ENT(table, i+1),
+		st_packed_entry, table->num_entries - i);
+    }
+}
+/* ultra packed values */
+#define MAX_ULTRA_PACKED 1
+#define ULTRA_PACKED(table) ((table)->num_bins == 0)
+#define UPHASH(table) (table)->as.upacked.hash
+#define UPKEY(table)  (table)->as.upacked.key
+#define UPVAL(table)  (table)->as.upacked.val
+#define UPHASH_SET(table, val) (UPHASH(table) = (val))
+#define UPKEY_SET(table, val) (UPKEY(table) = (val))
+#define UPVAL_SET(table, val) (UPVAL(table) = (val))
+
+/* Shortage */
+#define bins as.big.bins
+#define head as.big.head
+#define tail as.big.tail
+
 /*
  * MINSIZE is the minimum size of a dictionary.
  */
@@ -85,8 +179,8 @@ static void rehash(st_table *);
 Table of prime numbers 2^n+a, 2<=n<=30.
 */
 static const unsigned int primes[] = {
-	8 + 3,
-	16 + 3,
+	ST_DEFAULT_INIT_TABLE_SIZE,
+	ST_DEFAULT_SECOND_TABLE_SIZE,
 	32 + 5,
 	64 + 3,
 	128 + 3,
@@ -161,8 +255,6 @@ stat_col(void)
 }
 #endif
 
-#define MAX_PACKED_NUMHASH (ST_DEFAULT_INIT_TABLE_SIZE/2)
-
 st_table*
 st_init_table_with_size(const struct st_hash_type *type, st_index_t size)
 {
@@ -181,14 +273,19 @@ st_init_table_with_size(const struct st_hash_type *type, st_index_t size)
     }
 #endif
 
-    size = new_size(size);	/* round up to prime number */
 
-    tbl = alloc(st_table);
+    tbl = st_alloc_table();
     tbl->type = type;
     tbl->num_entries = 0;
-    tbl->entries_packed = type == &type_numhash && size/2 <= MAX_PACKED_NUMHASH;
+    if ( (tbl->entries_packed = size <= MAX_PACKED_HASH) ) {
+        size = size <= MAX_ULTRA_PACKED ? 0 :
+                ST_DEFAULT_PACKED_TABLE_SIZE;
+    }
+    else {
+        size = new_size(size);	/* round up to prime number */
+    }
     tbl->num_bins = size;
-    tbl->bins = (st_table_entry **)Calloc(size, sizeof(st_table_entry*));
+    tbl->bins = size ? st_alloc_bins(size) : NULL;
     tbl->head = 0;
     tbl->tail = 0;
 
@@ -248,12 +345,12 @@ st_clear(st_table *table)
         return;
     }
 
-    for(i = 0; i < table->num_bins; i++) {
+    for (i = 0; i < table->num_bins; i++) {
 	ptr = table->bins[i];
 	table->bins[i] = 0;
 	while (ptr != 0) {
 	    next = ptr->next;
-	    free(ptr);
+	    st_free_entry(ptr);
 	    ptr = next;
 	}
     }
@@ -266,8 +363,9 @@ void
 st_free_table(st_table *table)
 {
     st_clear(table);
-    free(table->bins);
-    free(table);
+    if (table->num_bins)
+	st_free_bins(table->bins, table->num_bins);
+    st_dealloc_table(table);
 }
 
 size_t
@@ -306,46 +404,77 @@ count_collision(const struct st_hash_type *type)
 #define FOUND_ENTRY
 #endif
 
-#define FIND_ENTRY(table, ptr, hash_val, bin_pos) do {\
-    (bin_pos) = (hash_val)%(table)->num_bins;\
-    (ptr) = (table)->bins[(bin_pos)];\
-    FOUND_ENTRY;\
-    if (PTR_NOT_EQUAL((table), (ptr), (hash_val), key)) {\
-	COLLISION;\
-	while (PTR_NOT_EQUAL((table), (ptr)->next, (hash_val), key)) {\
-	    (ptr) = (ptr)->next;\
-	}\
-	(ptr) = (ptr)->next;\
-    }\
-} while (0)
+#define FIND_ENTRY(table, ptr, hash_val, bin_pos) \
+    ((ptr) = find_entry((table), key, (hash_val), ((bin_pos) = (hash_val)%(table)->num_bins)))
+
+static st_table_entry *
+find_entry(st_table *table, st_data_t key, st_index_t hash_val, st_index_t bin_pos)
+{
+    register st_table_entry *ptr = table->bins[bin_pos];
+    FOUND_ENTRY;
+    if (PTR_NOT_EQUAL(table, ptr, hash_val, key)) {
+	COLLISION;
+	while (PTR_NOT_EQUAL(table, ptr->next, hash_val, key)) {
+	    ptr = ptr->next;
+	}
+	ptr = ptr->next;
+    }
+    return ptr;
+}
+
+static inline st_index_t
+find_packed_index(st_table *table, st_index_t hash_val, st_data_t key)
+{
+    st_index_t i = 0;
+    for(;;i++) {
+        while (i < table->num_entries && PHASH(table, i) != hash_val) i++;
+        if (i == table->num_entries || EQUAL(table, key, PKEY(table, i)))
+            break;
+    }
+    return i;
+}
+
+static inline int
+check_ultra_packed(st_table *table, st_index_t hash_val, st_data_t key)
+{
+    return table->num_entries && UPHASH(table) == hash_val &&
+	    EQUAL(table, key, UPKEY(table));
+}
 
 #define collision_check 0
 
 int
 st_lookup(st_table *table, register st_data_t key, st_data_t *value)
 {
-    st_index_t hash_val, bin_pos;
+    st_index_t hash_val;
     register st_table_entry *ptr;
 
+    hash_val = do_hash(key, table);
+
+    if (ULTRA_PACKED(table)) {
+	if (check_ultra_packed(table, hash_val, key)) {
+	    if (value != 0) *value = UPVAL(table);
+	    return 1;
+	}
+	return 0;
+    }
+
     if (table->entries_packed) {
-        st_index_t i;
-        for (i = 0; i < table->num_entries; i++) {
-            if ((st_data_t)table->bins[i*2] == key) {
-                if (value !=0) *value = (st_data_t)table->bins[i*2+1];
-                return 1;
-            }
-        }
+        st_index_t i = find_packed_index(table, hash_val, key);
+	if (i < table->num_entries) {
+	    if (value != 0) *value = PVAL(table, i);
+	    return 1;
+	}
         return 0;
     }
 
-    hash_val = do_hash(key, table);
-    FIND_ENTRY(table, ptr, hash_val, bin_pos);
+    ptr = find_entry(table, key, hash_val, hash_val % table->num_bins);
 
     if (ptr == 0) {
 	return 0;
     }
     else {
-	if (value != 0)  *value = ptr->record;
+	if (value != 0) *value = ptr->record;
 	return 1;
     }
 }
@@ -353,22 +482,29 @@ st_lookup(st_table *table, register st_data_t key, st_data_t *value)
 int
 st_get_key(st_table *table, register st_data_t key, st_data_t *result)
 {
-    st_index_t hash_val, bin_pos;
+    st_index_t hash_val;
     register st_table_entry *ptr;
 
+    hash_val = do_hash(key, table);
+
+    if (ULTRA_PACKED(table)) {
+	if (check_ultra_packed(table, hash_val, key)) {
+	    if (result != 0) *result = UPKEY(table);
+	    return 1;
+	}
+	return 0;
+    }
+
     if (table->entries_packed) {
-        st_index_t i;
-        for (i = 0; i < table->num_entries; i++) {
-            if ((st_data_t)table->bins[i*2] == key) {
-                if (result !=0) *result = (st_data_t)table->bins[i*2];
-                return 1;
-            }
-        }
+        st_index_t i = find_packed_index(table, hash_val, key);
+	if (i < table->num_entries) {
+	    if (result != 0) *result = PKEY(table, i);
+	    return 1;
+	}
         return 0;
     }
 
-    hash_val = do_hash(key, table);
-    FIND_ENTRY(table, ptr, hash_val, bin_pos);
+    ptr = find_entry(table, key, hash_val, hash_val % table->num_bins);
 
     if (ptr == 0) {
 	return 0;
@@ -382,85 +518,153 @@ st_get_key(st_table *table, register st_data_t key, st_data_t *result)
 #undef collision_check
 #define collision_check 1
 
-#define MORE_PACKABLE_P(table) \
-    ((st_index_t)((table)->num_entries+1) * 2 <= (table)->num_bins && \
-     (table)->num_entries+1 <= MAX_PACKED_NUMHASH)
-
-#define ADD_DIRECT(table, key, value, hash_val, bin_pos)\
-do {\
-    st_table_entry *entry;\
-    if ((table)->num_entries > ST_DEFAULT_MAX_DENSITY * (table)->num_bins) {\
-	rehash(table);\
-        (bin_pos) = (hash_val) % (table)->num_bins;\
-    }\
-    \
-    entry = alloc(st_table_entry);\
-    \
-    entry->hash = (hash_val);\
-    entry->key = (key);\
-    entry->record = (value);\
-    entry->next = (table)->bins[(bin_pos)];\
-    if ((table)->head != 0) {\
-	entry->fore = 0;\
-	(entry->back = (table)->tail)->fore = entry;\
-	(table)->tail = entry;\
-    }\
-    else {\
-	(table)->head = (table)->tail = entry;\
-	entry->fore = entry->back = 0;\
-    }\
-    (table)->bins[(bin_pos)] = entry;\
-    (table)->num_entries++;\
-} while (0)
+static inline st_table_entry *
+new_entry(st_table * table, st_data_t key, st_data_t value,
+	st_index_t hash_val, register st_index_t bin_pos)
+{
+    register st_table_entry *entry = st_alloc_entry();
+
+    entry->next = table->bins[bin_pos];
+    table->bins[bin_pos] = entry;
+    entry->hash = hash_val;
+    entry->key = key;
+    entry->record = value;
+
+    return entry;
+}
+
+static inline void
+add_direct(st_table *table, st_data_t key, st_data_t value,
+	   st_index_t hash_val, register st_index_t bin_pos)
+{
+    register st_table_entry *entry;
+    if (table->num_entries > ST_DEFAULT_MAX_DENSITY * table->num_bins) {
+	rehash(table);
+        bin_pos = hash_val % table->num_bins;
+    }
+
+    entry = new_entry(table, key, value, hash_val, bin_pos);
+
+    if (table->head != 0) {
+	entry->fore = 0;
+	(entry->back = table->tail)->fore = entry;
+	table->tail = entry;
+    }
+    else {
+	table->head = table->tail = entry;
+	entry->fore = entry->back = 0;
+    }
+    table->num_entries++;
+}
 
 static void
 unpack_entries(register st_table *table)
 {
-    st_index_t i;
-    struct st_table_entry *packed_bins[MAX_PACKED_NUMHASH*2];
+    st_index_t i = 0;
+    st_packed_bins packed_bins;
+    register st_table_entry *entry;
     st_table tmp_table = *table;
 
-    memcpy(packed_bins, table->bins, sizeof(struct st_table_entry *) * table->num_entries*2);
-    table->bins = packed_bins;
+    packed_bins = PACKED_BINS(table);
+    table->as.packed = &packed_bins;
     tmp_table.entries_packed = 0;
-    tmp_table.num_entries = 0;
-    memset(tmp_table.bins, 0, sizeof(struct st_table_entry *) * tmp_table.num_bins);
-    for (i = 0; i < table->num_entries; i++) {
-        st_insert(&tmp_table, (st_data_t)packed_bins[i*2], (st_data_t)packed_bins[i*2+1]);
+    tmp_table.num_entries = MAX_PACKED_HASH;
+#if ST_DEFAULT_INIT_TABLE_SIZE == ST_DEFAULT_PACKED_TABLE_SIZE
+    MEMZERO(tmp_table.bins, st_table_entry*, tmp_table.num_bins);
+#else
+    st_free_bins(tmp_table.bins, tmp_table.num_bins);
+    tmp_table.num_bins = ST_DEFAULT_INIT_TABLE_SIZE;
+    tmp_table.bins = st_alloc_bins(ST_DEFAULT_INIT_TABLE_SIZE);
+#endif
+#define ikey packed_bins.kv[i].key
+#define ival packed_bins.kv[i].val
+#define ihash packed_bins.kv[i].hash
+    entry = new_entry(&tmp_table, ikey, ival, ihash,
+                      ihash % ST_DEFAULT_INIT_TABLE_SIZE);
+    tmp_table.head = entry;
+    entry->back = NULL;
+    for (i = 1; i < MAX_PACKED_HASH; i++) {
+        register st_table_entry *oldentry = entry;
+        entry = new_entry(&tmp_table, ikey, ival, ihash,
+                          ihash % ST_DEFAULT_INIT_TABLE_SIZE);
+        oldentry->fore = entry;
+        entry->back = oldentry;
     }
+    entry->fore = NULL;
+    tmp_table.tail = entry;
     *table = tmp_table;
 }
 
+static void
+add_packed_direct(st_table *table, st_data_t key, st_data_t value, st_index_t hash_val)
+{
+    if (table->num_entries < MAX_PACKED_HASH) {
+	st_index_t i = table->num_entries++;
+	PKEY_SET(table, i, key);
+	PVAL_SET(table, i, value);
+	PHASH_SET(table, i, hash_val);
+    }
+    else {
+	unpack_entries(table);
+	add_direct(table, key, value, hash_val, hash_val % table->num_bins);
+    }
+}
+
+static void
+add_upacked_direct(st_table *table, st_data_t key, st_data_t value, st_index_t hash_val)
+{
+    if (table->num_entries) {
+        st_packed_entry tmp = table->as.upacked;
+        table->bins = st_alloc_bins(ST_DEFAULT_PACKED_TABLE_SIZE);
+        table->num_bins = ST_DEFAULT_PACKED_TABLE_SIZE;
+        PACKED_ENT(table, 0) = tmp;
+        PHASH_SET(table, 1, hash_val);
+        PKEY_SET(table, 1, key);
+        PVAL_SET(table, 1, value);
+        table->num_entries = 2;
+        table->head = NULL;
+        table->tail = NULL;
+    }
+    else {
+        UPHASH_SET(table, hash_val);
+        UPKEY_SET(table, key);
+        UPVAL_SET(table, value);
+        table->num_entries = 1;
+    }
+}
+
 int
 st_insert(register st_table *table, register st_data_t key, st_data_t value)
 {
-    st_index_t hash_val, bin_pos;
+    st_index_t hash_val;
+    register st_index_t bin_pos;
     register st_table_entry *ptr;
 
+    hash_val = do_hash(key, table);
+
+    if (ULTRA_PACKED(table)) {
+	if (check_ultra_packed(table, hash_val, key)) {
+	    UPVAL_SET(table, value);
+	    return 1;
+	}
+	add_upacked_direct(table, key, value, hash_val);
+	return 0;
+    }
+
     if (table->entries_packed) {
-        st_index_t i;
-        for (i = 0; i < table->num_entries; i++) {
-            if ((st_data_t)table->bins[i*2] == key) {
-                table->bins[i*2+1] = (struct st_table_entry*)value;
-                return 1;
-            }
-        }
-        if (MORE_PACKABLE_P(table)) {
-            i = table->num_entries++;
-            table->bins[i*2] = (struct st_table_entry*)key;
-            table->bins[i*2+1] = (struct st_table_entry*)value;
-            return 0;
-        }
-        else {
-            unpack_entries(table);
+        st_index_t i = find_packed_index(table, hash_val, key);
+	if (i < table->num_entries) {
+	    PVAL_SET(table, i, value);
+	    return 1;
         }
+	add_packed_direct(table, key, value, hash_val);
+	return 0;
     }
 
-    hash_val = do_hash(key, table);
     FIND_ENTRY(table, ptr, hash_val, bin_pos);
 
     if (ptr == 0) {
-	ADD_DIRECT(table, key, value, hash_val, bin_pos);
+	add_direct(table, key, value, hash_val, bin_pos);
 	return 0;
     }
     else {
@@ -473,34 +677,38 @@ int
 st_insert2(register st_table *table, register st_data_t key, st_data_t value,
 	   st_data_t (*func)(st_data_t))
 {
-    st_index_t hash_val, bin_pos;
+    st_index_t hash_val;
+    register st_index_t bin_pos;
     register st_table_entry *ptr;
 
+    hash_val = do_hash(key, table);
+
+    if (ULTRA_PACKED(table)) {
+	if (check_ultra_packed(table, hash_val, key)) {
+	    UPVAL_SET(table, value);
+	    return 1;
+	}
+	key = (*func)(key);
+	add_upacked_direct(table, key, value, hash_val);
+	return 0;
+    }
+
     if (table->entries_packed) {
-        st_index_t i;
-        for (i = 0; i < table->num_entries; i++) {
-            if ((st_data_t)table->bins[i*2] == key) {
-                table->bins[i*2+1] = (struct st_table_entry*)value;
-                return 1;
-            }
-        }
-        if (MORE_PACKABLE_P(table)) {
-            i = table->num_entries++;
-            table->bins[i*2] = (struct st_table_entry*)key;
-            table->bins[i*2+1] = (struct st_table_entry*)value;
-            return 0;
-        }
-        else {
-            unpack_entries(table);
+        st_index_t i = find_packed_index(table, hash_val, key);
+	if (i < table->num_entries) {
+	    PVAL_SET(table, i, value);
+	    return 1;
         }
+	key = (*func)(key);
+	add_packed_direct(table, key, value, hash_val);
+	return 0;
     }
 
-    hash_val = do_hash(key, table);
     FIND_ENTRY(table, ptr, hash_val, bin_pos);
 
     if (ptr == 0) {
 	key = (*func)(key);
-	ADD_DIRECT(table, key, value, hash_val, bin_pos);
+	add_direct(table, key, value, hash_val, bin_pos);
 	return 0;
     }
     else {
@@ -512,36 +720,31 @@ st_insert2(register st_table *table, register st_data_t key, st_data_t value,
 void
 st_add_direct(st_table *table, st_data_t key, st_data_t value)
 {
-    st_index_t hash_val, bin_pos;
+    st_index_t hash_val;
+
+    hash_val = do_hash(key, table);
+
+    if (ULTRA_PACKED(table)) {
+	add_upacked_direct(table, key, value, hash_val);
+	return;
+    }
 
     if (table->entries_packed) {
-        int i;
-        if (MORE_PACKABLE_P(table)) {
-            i = table->num_entries++;
-            table->bins[i*2] = (struct st_table_entry*)key;
-            table->bins[i*2+1] = (struct st_table_entry*)value;
-            return;
-        }
-        else {
-            unpack_entries(table);
-        }
+	add_packed_direct(table, key, value, hash_val);
+	return;
     }
 
-    hash_val = do_hash(key, table);
-    bin_pos = hash_val % table->num_bins;
-    ADD_DIRECT(table, key, value, hash_val, bin_pos);
+    add_direct(table, key, value, hash_val, hash_val % table->num_bins);
 }
 
 static void
 rehash(register st_table *table)
 {
     register st_table_entry *ptr, **new_bins;
-    st_index_t i, new_num_bins, hash_val;
+    st_index_t new_num_bins, hash_val;
 
     new_num_bins = new_size(table->num_bins+1);
-    new_bins = (st_table_entry**)
-	xrealloc(table->bins, new_num_bins * sizeof(st_table_entry*));
-    for (i = 0; i < new_num_bins; ++i) new_bins[i] = 0;
+    new_bins = st_realloc_bins(table->bins, new_num_bins, table->num_bins);
     table->num_bins = new_num_bins;
     table->bins = new_bins;
 
@@ -558,34 +761,38 @@ st_table*
 st_copy(st_table *old_table)
 {
     st_table *new_table;
-    st_table_entry *ptr, *entry, *prev, **tail;
+    st_table_entry *ptr, *entry, *prev, **tailp;
     st_index_t num_bins = old_table->num_bins;
     st_index_t hash_val;
 
-    new_table = alloc(st_table);
+    new_table = st_alloc_table();
     if (new_table == 0) {
 	return 0;
     }
 
     *new_table = *old_table;
-    new_table->bins = (st_table_entry**)
-	Calloc((unsigned)num_bins, sizeof(st_table_entry*));
+
+    if (ULTRA_PACKED(old_table)) {
+	return new_table;
+    }
+
+    new_table->bins = st_alloc_bins(num_bins);
 
     if (new_table->bins == 0) {
-	free(new_table);
+	st_dealloc_table(new_table);
 	return 0;
     }
 
     if (old_table->entries_packed) {
-        memcpy(new_table->bins, old_table->bins, sizeof(struct st_table_entry *) * old_table->num_bins);
+        MEMCPY(new_table->bins, old_table->bins, st_table_entry*, old_table->num_bins);
         return new_table;
     }
 
     if ((ptr = old_table->head) != 0) {
 	prev = 0;
-	tail = &new_table->head;
+	tailp = &new_table->head;
 	do {
-	    entry = alloc(st_table_entry);
+	    entry = st_alloc_entry();
 	    if (entry == 0) {
 		st_free_table(new_table);
 		return 0;
@@ -595,8 +802,8 @@ st_copy(st_table *old_table)
 	    entry->next = new_table->bins[hash_val];
 	    new_table->bins[hash_val] = entry;
 	    entry->back = prev;
-	    *tail = prev = entry;
-	    tail = &entry->fore;
+	    *tailp = prev = entry;
+	    tailp = &entry->fore;
 	} while ((ptr = ptr->fore) != 0);
 	new_table->tail = prev;
     }
@@ -604,21 +811,22 @@ st_copy(st_table *old_table)
     return new_table;
 }
 
-#define REMOVE_ENTRY(table, ptr) do					\
-    {									\
-	if ((ptr)->fore == 0 && (ptr)->back == 0) {			\
-	    (table)->head = 0;						\
-	    (table)->tail = 0;						\
-	}								\
-	else {								\
-	    st_table_entry *fore = (ptr)->fore, *back = (ptr)->back;	\
-	    if (fore) fore->back = back;				\
-	    if (back) back->fore = fore;				\
-	    if ((ptr) == (table)->head) (table)->head = fore;		\
-	    if ((ptr) == (table)->tail) (table)->tail = back;		\
-	}								\
-	(table)->num_entries--;						\
-    } while (0)
+static inline void
+remove_entry(st_table *table, st_table_entry *ptr)
+{
+    if (ptr->fore == 0 && ptr->back == 0) {
+	table->head = 0;
+	table->tail = 0;
+    }
+    else {
+	st_table_entry *fore = ptr->fore, *back = ptr->back;
+	if (fore) fore->back = back;
+	if (back) back->fore = fore;
+	if (ptr == table->head) table->head = fore;
+	if (ptr == table->tail) table->tail = back;
+    }
+    table->num_entries--;
+}
 
 int
 st_delete(register st_table *table, register st_data_t *key, st_data_t *value)
@@ -627,34 +835,42 @@ st_delete(register st_table *table, register st_data_t *key, st_data_t *value)
     st_table_entry **prev;
     register st_table_entry *ptr;
 
+    hash_val = do_hash(*key, table);
+
+    if (ULTRA_PACKED(table)) {
+	if (check_ultra_packed(table, hash_val, *key)) {
+	    if (value != 0) *value = UPVAL(table);
+	    *key = UPKEY(table);
+	    table->num_entries = 0;
+	    return 1;
+	}
+	goto notfound;
+    }
+
     if (table->entries_packed) {
-        st_index_t i;
-        for (i = 0; i < table->num_entries; i++) {
-            if ((st_data_t)table->bins[i*2] == *key) {
-                if (value != 0) *value = (st_data_t)table->bins[i*2+1];
-                table->num_entries--;
-                memmove(&table->bins[i*2], &table->bins[(i+1)*2],
-                        sizeof(struct st_table_entry*) * 2*(table->num_entries-i));
-                return 1;
-            }
+        st_index_t i = find_packed_index(table, hash_val, *key);
+	if (i < table->num_entries) {
+	    if (value != 0) *value = PVAL(table, i);
+	    *key = PKEY(table, i);
+	    remove_packed_entry(table, i);
+	    return 1;
         }
-        if (value != 0) *value = 0;
-        return 0;
+	goto notfound;
     }
 
-    hash_val = do_hash_bin(*key, table);
-
-    for (prev = &table->bins[hash_val]; (ptr = *prev) != 0; prev = &ptr->next) {
+    prev = &table->bins[hash_val % table->num_bins];
+    for (; (ptr = *prev) != 0; prev = &ptr->next) {
 	if (EQUAL(table, *key, ptr->key)) {
 	    *prev = ptr->next;
-	    REMOVE_ENTRY(table, ptr);
+	    remove_entry(table, ptr);
 	    if (value != 0) *value = ptr->record;
 	    *key = ptr->key;
-	    free(ptr);
+	    st_free_entry(ptr);
 	    return 1;
 	}
     }
 
+notfound:
     if (value != 0) *value = 0;
     return 0;
 }
@@ -665,25 +881,36 @@ st_delete_safe(register st_table *table, register st_data_t *key, st_data_t *val
     st_index_t hash_val;
     register st_table_entry *ptr;
 
+    hash_val = do_hash(*key, table);
+
+    if (ULTRA_PACKED(table)) {
+	if (check_ultra_packed(table, hash_val, *key)) {
+	    if (value != 0) *value = UPVAL(table);
+	    *key = UPKEY(table);
+	    UPKEY_SET(table, never);
+	    UPHASH_SET(table, 0);
+	    return 1;
+	}
+	goto notfound;
+    }
+
     if (table->entries_packed) {
-	st_index_t i;
-	for (i = 0; i < table->num_entries; i++) {
-	    if ((st_data_t)table->bins[i*2] == *key) {
-		if (value != 0) *value = (st_data_t)table->bins[i*2+1];
-		table->bins[i*2] = (void *)never;
-		return 1;
-	    }
+        st_index_t i = find_packed_index(table, hash_val, *key);
+	if (i < table->num_entries) {
+	    if (value != 0) *value = PVAL(table, i);
+	    *key = PKEY(table, i);
+	    PKEY_SET(table, i, never);
+	    PHASH_SET(table, i,  0);
+	    return 1;
 	}
-	if (value != 0) *value = 0;
-	return 0;
+	goto notfound;
     }
 
-    hash_val = do_hash_bin(*key, table);
-    ptr = table->bins[hash_val];
+    ptr = table->bins[hash_val % table->num_bins];
 
     for (; ptr != 0; ptr = ptr->next) {
 	if ((ptr->key != never) && EQUAL(table, ptr->key, *key)) {
-	    REMOVE_ENTRY(table, ptr);
+	    remove_entry(table, ptr);
 	    *key = ptr->key;
 	    if (value != 0) *value = ptr->record;
 	    ptr->key = ptr->record = never;
@@ -691,6 +918,7 @@ st_delete_safe(register st_table *table, register st_data_t *key, st_data_t *val
 	}
     }
 
+notfound:
     if (value != 0) *value = 0;
     return 0;
 }
@@ -701,15 +929,21 @@ st_cleanup_safe(st_table *table, st_data_t never)
     st_table_entry *ptr, **last, *tmp;
     st_index_t i;
 
+    if (ULTRA_PACKED(table)) {
+	if (UPKEY(table) == never) {
+	    table->num_entries = 0;
+	}
+	return;
+    }
+
     if (table->entries_packed) {
 	st_index_t i = 0, j = 0;
-	while ((st_data_t)table->bins[i*2] != never) {
+	while (PKEY(table, i) != never) {
 	    if (i++ == table->num_entries) return;
 	}
 	for (j = i; ++i < table->num_entries;) {
-	    if ((st_data_t)table->bins[i*2] == never) continue;
-	    table->bins[j*2] = table->bins[i*2];
-	    table->bins[j*2+1] = table->bins[i*2+1];
+	    if (PKEY(table, i) == never) continue;
+	    PACKED_ENT(table, j) = PACKED_ENT(table, i);
 	    j++;
 	}
 	table->num_entries = j;
@@ -722,7 +956,7 @@ st_cleanup_safe(st_table *table, st_data_t never)
 	    if (ptr->key == never) {
 		tmp = ptr;
 		*last = ptr = ptr->next;
-		free(tmp);
+		st_free_entry(tmp);
 	    }
 	    else {
 		ptr = *(last = &ptr->next);
@@ -732,21 +966,70 @@ st_cleanup_safe(st_table *table, st_data_t never)
 }
 
 int
+st_foreach_nocheck(st_table *table, int (*func)(ANYARGS), st_data_t arg)
+{
+    enum st_retval retval;
+    if (table->num_entries == 0) return 0;
+    if (ULTRA_PACKED(table)) {
+        (*func)(UPKEY(table), UPVAL(table), arg);
+    }
+    else if (table->entries_packed) {
+        register st_index_t i;
+        for(i = 0; i < table->num_entries; i++) {
+            retval = (*func)(PKEY(table, i), PVAL(table, i), arg);
+            if (retval == ST_STOP) break;
+        }
+    }
+    else {
+        st_table_entry *ptr;
+        for(ptr = table->head; ptr; ptr = ptr->fore) {
+            retval = (*func)(ptr->key, ptr->record, arg);
+            if (retval == ST_STOP) break;
+        }
+    }
+    return 0;
+}
+
+int
 st_foreach(st_table *table, int (*func)(ANYARGS), st_data_t arg)
 {
     st_table_entry *ptr, **last, *tmp;
     enum st_retval retval;
-    st_index_t i;
+    st_index_t i = 0;
 
     if (table->entries_packed) {
+        st_packed_entry packed;
+        if (ULTRA_PACKED(table) && table->num_entries) {
+            packed = table->as.upacked;
+            retval = (*func)(packed.key, packed.val, arg);
+            if (!ULTRA_PACKED(table)) goto packed;
+            switch(retval) {
+              case ST_CHECK:
+                if (UPKEY(table) == Qundef && UPHASH(table) == 0)
+                    break;
+                if (table->num_entries &&
+                        UPHASH(table) == packed.hash &&
+                        EQUAL(table, packed.key, UPKEY(table)))
+                    break;
+                retval = (*func)(0, 0, arg, 1);
+                return 1;
+              case ST_CONTINUE:
+                break;
+              case ST_STOP:
+                return 0;
+              case ST_DELETE:
+                table->num_entries = 0;
+            }
+            return 0;
+        }
+
         for (i = 0; i < table->num_entries; i++) {
-            st_index_t j;
-            st_data_t key, val;
-            key = (st_data_t)table->bins[i*2];
-            val = (st_data_t)table->bins[i*2+1];
-            retval = (*func)(key, val, arg);
+            packed = PACKED_ENT(table, i);
+            retval = (*func)(packed.key, packed.val, arg);
+          packed:
 	    if (!table->entries_packed) {
-		FIND_ENTRY(table, ptr, key, i);
+		st_index_t key = packed.key;
+		FIND_ENTRY(table, ptr, packed.hash, i);
 		if (retval == ST_CHECK) {
 		    if (!ptr) goto deleted;
 		    goto unpacked_continue;
@@ -755,11 +1038,15 @@ st_foreach(st_table *table, int (*func)(ANYARGS), st_data_t arg)
 	    }
             switch (retval) {
 	      case ST_CHECK:	/* check if hash is modified during iteration */
-                for (j = 0; j < table->num_entries; j++) {
-                    if ((st_data_t)table->bins[j*2] == key)
-                        break;
-                }
-                if (j == table->num_entries) {
+                /* work around uncomforming befaviour of hash */
+                if (PKEY(table, i) == Qundef && PHASH(table, i) == 0)
+                    break;
+                else if (i < table->num_entries &&
+                        PHASH(table, i) == packed.hash &&
+                        EQUAL(table, packed.key, PKEY(table, i)))
+                    break;
+                i = find_packed_index(table, packed.hash, packed.key);
+                if (i == table->num_entries) {
 		    goto deleted;
                 }
 		/* fall through */
@@ -768,9 +1055,7 @@ st_foreach(st_table *table, int (*func)(ANYARGS), st_data_t arg)
 	      case ST_STOP:
 		return 0;
 	      case ST_DELETE:
-                table->num_entries--;
-                memmove(&table->bins[i*2], &table->bins[(i+1)*2],
-                        sizeof(struct st_table_entry*) * 2*(table->num_entries-i));
+		remove_packed_entry(table, i);
                 i--;
                 break;
             }
@@ -809,8 +1094,8 @@ st_foreach(st_table *table, int (*func)(ANYARGS), st_data_t arg)
 		    if (ptr == tmp) {
 			tmp = ptr->fore;
 			*last = ptr->next;
-			REMOVE_ENTRY(table, ptr);
-			free(ptr);
+			remove_entry(table, ptr);
+			st_free_entry(ptr);
 			if (ptr == tmp) return 0;
 			ptr = tmp;
 			break;
@@ -834,13 +1119,13 @@ st_reverse_foreach(st_table *table, int (*func)(ANYARGS), st_data_t arg)
         for (i = table->num_entries-1; 0 <= i; i--) {
             int j;
             st_data_t key, val;
-            key = (st_data_t)table->bins[i*2];
-            val = (st_data_t)table->bins[i*2+1];
+            key = PKEY(table, i);
+            val = PVAL(table, i);
             retval = (*func)(key, val, arg);
             switch (retval) {
 	      case ST_CHECK:	/* check if hash is modified during iteration */
                 for (j = 0; j < table->num_entries; j++) {
-                    if ((st_data_t)table->bins[j*2] == key)
+                    if (PKEY(table, j) == key)
                         break;
                 }
                 if (j == table->num_entries) {
@@ -854,9 +1139,7 @@ st_reverse_foreach(st_table *table, int (*func)(ANYARGS), st_data_t arg)
 	      case ST_STOP:
 		return 0;
 	      case ST_DELETE:
-                table->num_entries--;
-                memmove(&table->bins[i*2], &table->bins[(i+1)*2],
-                        sizeof(struct st_table_entry*) * 2*(table->num_entries-i));
+		remove_packed_entry(table, i);
                 break;
             }
         }
@@ -889,8 +1172,8 @@ st_reverse_foreach(st_table *table, int (*func)(ANYARGS), st_data_t arg)
 		    if (ptr == tmp) {
 			tmp = ptr->back;
 			*last = ptr->next;
-			REMOVE_ENTRY(table, ptr);
-			free(ptr);
+			remove_entry(table, ptr);
+			st_free_entry(ptr);
 			ptr = tmp;
 			break;
 		    }
diff --git a/thread.c b/thread.c
index 342d4fe..2387edf 100644
--- a/thread.c
+++ b/thread.c
@@ -2197,7 +2197,7 @@ rb_thread_keys(VALUE self)
     GetThreadPtr(self, th);
 
     if (th->local_storage) {
-	st_foreach(th->local_storage, thread_keys_i, ary);
+	st_foreach_nocheck(th->local_storage, thread_keys_i, ary);
     }
     return ary;
 }
@@ -3068,7 +3068,7 @@ clear_coverage(void)
 {
     VALUE coverages = rb_get_coverages();
     if (RTEST(coverages)) {
-	st_foreach(RHASH_TBL(coverages), clear_coverage_i, 0);
+	st_foreach_nocheck(RHASH_TBL(coverages), clear_coverage_i, 0);
     }
 }
 
@@ -3213,7 +3213,7 @@ thgroup_list(VALUE group)
 
     param.ary = ary;
     param.group = group;
-    st_foreach(GET_THREAD()->vm->living_threads, thgroup_list_i, (st_data_t) & param);
+    st_foreach_nocheck(GET_THREAD()->vm->living_threads, thgroup_list_i, (st_data_t) & param);
     return ary;
 }
 
@@ -4119,7 +4119,7 @@ set_threads_event_flags_i(st_data_t key, st_data_t val, st_data_t flag)
 static void
 set_threads_event_flags(int flag)
 {
-    st_foreach(GET_VM()->living_threads, set_threads_event_flags_i, (st_data_t) flag);
+    st_foreach_nocheck(GET_VM()->living_threads, set_threads_event_flags_i, (st_data_t) flag);
 }
 
 static inline int
@@ -4299,7 +4299,7 @@ static rb_thread_t *
 vm_event_hooks_running_thread(rb_vm_t *vm)
 {
     rb_thread_t *found = NULL;
-    st_foreach(vm->living_threads, running_vm_event_hooks, (st_data_t)&found);
+    st_foreach_nocheck(vm->living_threads, running_vm_event_hooks, (st_data_t)&found);
     return found;
 }
 
diff --git a/transcode.c b/transcode.c
index 4c3a273..db31c19 100644
--- a/transcode.c
+++ b/transcode.c
@@ -319,7 +319,7 @@ transcode_search_path(const char *sname, const char *dname,
         }
 
         bfs.base_enc = q->enc;
-        st_foreach(table2, transcode_search_path_i, (st_data_t)&bfs);
+        st_foreach_nocheck(table2, transcode_search_path_i, (st_data_t)&bfs);
         bfs.base_enc = NULL;
 
         xfree(q);
diff --git a/variable.c b/variable.c
index caadf71..a2751d8 100644
--- a/variable.c
+++ b/variable.c
@@ -98,7 +98,7 @@ fc_i(ID key, rb_const_entry_t *ce, struct fc_result *res)
 	    arg.klass = res->klass;
 	    arg.track = value;
 	    arg.prev = res;
-	    st_foreach(RCLASS_CONST_TBL(value), fc_i, (st_data_t)&arg);
+	    st_foreach_nocheck(RCLASS_CONST_TBL(value), fc_i, (st_data_t)&arg);
 	    if (arg.path) {
 		res->path = arg.path;
 		return ST_STOP;
@@ -123,10 +123,10 @@ find_class_path(VALUE klass)
     arg.track = rb_cObject;
     arg.prev = 0;
     if (RCLASS_CONST_TBL(rb_cObject)) {
-	st_foreach_safe(RCLASS_CONST_TBL(rb_cObject), fc_i, (st_data_t)&arg);
+	st_foreach_nocheck(RCLASS_CONST_TBL(rb_cObject), fc_i, (st_data_t)&arg);
     }
     if (arg.path == 0) {
-	st_foreach_safe(rb_class_tbl, fc_i, (st_data_t)&arg);
+	st_foreach_nocheck(rb_class_tbl, fc_i, (st_data_t)&arg);
     }
     if (arg.path) {
 	st_data_t tmp = tmp_classpath;
@@ -473,7 +473,7 @@ void
 rb_gc_mark_global_tbl(void)
 {
     if (rb_global_tbl)
-        st_foreach_safe(rb_global_tbl, mark_global_entry, 0);
+        st_foreach_nocheck(rb_global_tbl, mark_global_entry, 0);
 }
 
 static ID
@@ -765,7 +765,7 @@ rb_f_global_variables(void)
     char buf[2];
     int i;
 
-    st_foreach_safe(rb_global_tbl, gvar_i, ary);
+    st_foreach_nocheck(rb_global_tbl, gvar_i, ary);
     buf[0] = '$';
     for (i = 1; i <= 9; ++i) {
 	buf[1] = (char)(i + '0');
@@ -923,7 +923,7 @@ static int
 givar_i(VALUE obj, st_table *tbl)
 {
     if (rb_special_const_p(obj)) {
-	st_foreach_safe(tbl, givar_mark_i, 0);
+	st_foreach_nocheck(tbl, givar_mark_i, 0);
     }
     return ST_CONTINUE;
 }
@@ -933,7 +933,7 @@ rb_mark_generic_ivar_tbl(void)
 {
     if (!generic_iv_tbl) return;
     if (special_generic_ivar == 0) return;
-    st_foreach_safe(generic_iv_tbl, givar_i, 0);
+    st_foreach_nocheck(generic_iv_tbl, givar_i, 0);
 }
 
 void
@@ -1731,7 +1731,7 @@ rb_mod_const_at(VALUE mod, void *data)
 	tbl = st_init_numtable();
     }
     if (RCLASS_CONST_TBL(mod)) {
-	st_foreach_safe(RCLASS_CONST_TBL(mod), sv_i, (st_data_t)tbl);
+	st_foreach_nocheck(RCLASS_CONST_TBL(mod), sv_i, (st_data_t)tbl);
     }
     return tbl;
 }
@@ -1766,7 +1766,7 @@ rb_const_list(void *data)
 
     if (!tbl) return rb_ary_new2(0);
     ary = rb_ary_new2(tbl->num_entries);
-    st_foreach_safe(tbl, list_i, ary);
+    st_foreach_nocheck(tbl, list_i, ary);
     st_free_table(tbl);
 
     return ary;
diff --git a/vm.c b/vm.c
index e997afa..634dee8 100644
--- a/vm.c
+++ b/vm.c
@@ -1570,11 +1570,12 @@ rb_vm_mark(void *ptr)
     if (ptr) {
 	rb_vm_t *vm = ptr;
 	if (vm->living_threads) {
-	    st_foreach(vm->living_threads, vm_mark_each_thread_func, 0);
+	    st_foreach_nocheck(vm->living_threads, vm_mark_each_thread_func, 0);
 	}
 	RUBY_MARK_UNLESS_NULL(vm->thgroup_default);
 	RUBY_MARK_UNLESS_NULL(vm->mark_object_ary);
 	RUBY_MARK_UNLESS_NULL(vm->load_path);
+	RUBY_MARK_UNLESS_NULL(vm->load_path_expanded_cache);
 	RUBY_MARK_UNLESS_NULL(vm->loaded_features);
 	RUBY_MARK_UNLESS_NULL(vm->top_self);
 	RUBY_MARK_UNLESS_NULL(vm->coverages);
@@ -2202,8 +2203,8 @@ void
 Init_BareVM(void)
 {
     /* VM bootstrap: phase 1 */
-    rb_vm_t * vm = malloc(sizeof(*vm));
-    rb_thread_t * th = malloc(sizeof(*th));
+    rb_vm_t * vm = ruby_mimmalloc(sizeof(*vm));
+    rb_thread_t * th = ruby_mimmalloc(sizeof(*th));
     if (!vm || !th) {
 	fprintf(stderr, "[FATAL] failed to allocate memory\n");
 	exit(EXIT_FAILURE);
diff --git a/vm_core.h b/vm_core.h
index 7211005..e787d4b 100644
--- a/vm_core.h
+++ b/vm_core.h
@@ -298,6 +298,7 @@ typedef struct rb_vm_struct {
     /* load */
     VALUE top_self;
     VALUE load_path;
+    VALUE load_path_expanded_cache;
     VALUE loaded_features;
     struct st_table *loading_table;
 
patches/ruby/1.9.3/update-autoconf.patch000066400000160120147511530510013747 0ustar00diff -Naur ruby-1.9.3-p551/tool/config.guess ruby-1.9.3-p551+ppc64le/tool/config.guess
--- ruby-1.9.3-p551/tool/config.guess	2010-09-26 01:25:34.000000000 +0000
+++ ruby-1.9.3-p551+ppc64le/tool/config.guess	2016-04-15 05:09:52.078012270 +0000
@@ -1,14 +1,12 @@
 #! /bin/sh
 # Attempt to guess a canonical system name.
-#   Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999,
-#   2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009
-#   Free Software Foundation, Inc.
+#   Copyright 1992-2016 Free Software Foundation, Inc.
 
-timestamp='2009-11-20'
+timestamp='2016-04-02'
 
 # This file is free software; you can redistribute it and/or modify it
 # under the terms of the GNU General Public License as published by
-# the Free Software Foundation; either version 2 of the License, or
+# the Free Software Foundation; either version 3 of the License, or
 # (at your option) any later version.
 #
 # This program is distributed in the hope that it will be useful, but
@@ -17,26 +15,22 @@
 # General Public License for more details.
 #
 # You should have received a copy of the GNU General Public License
-# along with this program; if not, write to the Free Software
-# Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA
-# 02110-1301, USA.
+# along with this program; if not, see <http://www.gnu.org/licenses/>.
 #
 # As a special exception to the GNU General Public License, if you
 # distribute this file as part of a program that contains a
 # configuration script generated by Autoconf, you may include it under
-# the same distribution terms that you use for the rest of that program.
-
-
-# Originally written by Per Bothner.  Please send patches (context
-# diff format) to <config-patches@gnu.org> and include a ChangeLog
-# entry.
+# the same distribution terms that you use for the rest of that
+# program.  This Exception is an additional permission under section 7
+# of the GNU General Public License, version 3 ("GPLv3").
 #
-# This script attempts to guess a canonical system name similar to
-# config.sub.  If it succeeds, it prints the system name on stdout, and
-# exits with 0.  Otherwise, it exits with 1.
+# Originally written by Per Bothner; maintained since 2000 by Ben Elliston.
 #
 # You can get the latest version of this script from:
-# http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.guess;hb=HEAD
+# http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.guess
+#
+# Please send patches to <config-patches@gnu.org>.
+
 
 me=`echo "$0" | sed -e 's,.*/,,'`
 
@@ -56,8 +50,7 @@
 GNU config.guess ($timestamp)
 
 Originally written by Per Bothner.
-Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001,
-2002, 2003, 2004, 2005, 2006, 2007, 2008 Free Software Foundation, Inc.
+Copyright 1992-2016 Free Software Foundation, Inc.
 
 This is free software; see the source for copying conditions.  There is NO
 warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE."
@@ -139,12 +132,33 @@
 UNAME_SYSTEM=`(uname -s) 2>/dev/null`  || UNAME_SYSTEM=unknown
 UNAME_VERSION=`(uname -v) 2>/dev/null` || UNAME_VERSION=unknown
 
+case "${UNAME_SYSTEM}" in
+Linux|GNU|GNU/*)
+	# If the system lacks a compiler, then just pick glibc.
+	# We could probably try harder.
+	LIBC=gnu
+
+	eval $set_cc_for_build
+	cat <<-EOF > $dummy.c
+	#include <features.h>
+	#if defined(__UCLIBC__)
+	LIBC=uclibc
+	#elif defined(__dietlibc__)
+	LIBC=dietlibc
+	#else
+	LIBC=gnu
+	#endif
+	EOF
+	eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep '^LIBC' | sed 's, ,,g'`
+	;;
+esac
+
 # Note: order is significant - the case branches are not exclusive.
 
 case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in
     *:NetBSD:*:*)
 	# NetBSD (nbsd) targets should (where applicable) match one or
-	# more of the tupples: *-*-netbsdelf*, *-*-netbsdaout*,
+	# more of the tuples: *-*-netbsdelf*, *-*-netbsdaout*,
 	# *-*-netbsdecoff* and *-*-netbsd*.  For targets that recently
 	# switched to ELF, *-*-netbsd* would select the old
 	# object file format.  This provides both forward
@@ -154,20 +168,27 @@
 	# Note: NetBSD doesn't particularly care about the vendor
 	# portion of the name.  We always set it to "unknown".
 	sysctl="sysctl -n hw.machine_arch"
-	UNAME_MACHINE_ARCH=`(/sbin/$sysctl 2>/dev/null || \
-	    /usr/sbin/$sysctl 2>/dev/null || echo unknown)`
+	UNAME_MACHINE_ARCH=`(uname -p 2>/dev/null || \
+	    /sbin/$sysctl 2>/dev/null || \
+	    /usr/sbin/$sysctl 2>/dev/null || \
+	    echo unknown)`
 	case "${UNAME_MACHINE_ARCH}" in
 	    armeb) machine=armeb-unknown ;;
 	    arm*) machine=arm-unknown ;;
 	    sh3el) machine=shl-unknown ;;
 	    sh3eb) machine=sh-unknown ;;
 	    sh5el) machine=sh5le-unknown ;;
+	    earmv*)
+		arch=`echo ${UNAME_MACHINE_ARCH} | sed -e 's,^e\(armv[0-9]\).*$,\1,'`
+		endian=`echo ${UNAME_MACHINE_ARCH} | sed -ne 's,^.*\(eb\)$,\1,p'`
+		machine=${arch}${endian}-unknown
+		;;
 	    *) machine=${UNAME_MACHINE_ARCH}-unknown ;;
 	esac
 	# The Operating System including object format, if it has switched
 	# to ELF recently, or will in the future.
 	case "${UNAME_MACHINE_ARCH}" in
-	    arm*|i386|m68k|ns32k|sh3*|sparc|vax)
+	    arm*|earm*|i386|m68k|ns32k|sh3*|sparc|vax)
 		eval $set_cc_for_build
 		if echo __ELF__ | $CC_FOR_BUILD -E - 2>/dev/null \
 			| grep -q __ELF__
@@ -180,7 +201,14 @@
 		fi
 		;;
 	    *)
-	        os=netbsd
+		os=netbsd
+		;;
+	esac
+	# Determine ABI tags.
+	case "${UNAME_MACHINE_ARCH}" in
+	    earm*)
+		expr='s/^earmv[0-9]/-eabi/;s/eb$//'
+		abi=`echo ${UNAME_MACHINE_ARCH} | sed -e "$expr"`
 		;;
 	esac
 	# The OS release
@@ -193,18 +221,26 @@
 		release='-gnu'
 		;;
 	    *)
-		release=`echo ${UNAME_RELEASE}|sed -e 's/[-_].*/\./'`
+		release=`echo ${UNAME_RELEASE} | sed -e 's/[-_].*//' | cut -d. -f1,2`
 		;;
 	esac
 	# Since CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM:
 	# contains redundant information, the shorter form:
 	# CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM is used.
-	echo "${machine}-${os}${release}"
+	echo "${machine}-${os}${release}${abi}"
+	exit ;;
+    *:Bitrig:*:*)
+	UNAME_MACHINE_ARCH=`arch | sed 's/Bitrig.//'`
+	echo ${UNAME_MACHINE_ARCH}-unknown-bitrig${UNAME_RELEASE}
 	exit ;;
     *:OpenBSD:*:*)
 	UNAME_MACHINE_ARCH=`arch | sed 's/OpenBSD.//'`
 	echo ${UNAME_MACHINE_ARCH}-unknown-openbsd${UNAME_RELEASE}
 	exit ;;
+    *:LibertyBSD:*:*)
+	UNAME_MACHINE_ARCH=`arch | sed 's/^.*BSD\.//'`
+	echo ${UNAME_MACHINE_ARCH}-unknown-libertybsd${UNAME_RELEASE}
+	exit ;;
     *:ekkoBSD:*:*)
 	echo ${UNAME_MACHINE}-unknown-ekkobsd${UNAME_RELEASE}
 	exit ;;
@@ -217,13 +253,16 @@
     *:MirBSD:*:*)
 	echo ${UNAME_MACHINE}-unknown-mirbsd${UNAME_RELEASE}
 	exit ;;
+    *:Sortix:*:*)
+	echo ${UNAME_MACHINE}-unknown-sortix
+	exit ;;
     alpha:OSF1:*:*)
 	case $UNAME_RELEASE in
 	*4.0)
 		UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $3}'`
 		;;
 	*5.*)
-	        UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $4}'`
+		UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $4}'`
 		;;
 	esac
 	# According to Compaq, /usr/sbin/psrinfo has been available on
@@ -233,43 +272,46 @@
 	ALPHA_CPU_TYPE=`/usr/sbin/psrinfo -v | sed -n -e 's/^  The alpha \(.*\) processor.*$/\1/p' | head -n 1`
 	case "$ALPHA_CPU_TYPE" in
 	    "EV4 (21064)")
-		UNAME_MACHINE="alpha" ;;
+		UNAME_MACHINE=alpha ;;
 	    "EV4.5 (21064)")
-		UNAME_MACHINE="alpha" ;;
+		UNAME_MACHINE=alpha ;;
 	    "LCA4 (21066/21068)")
-		UNAME_MACHINE="alpha" ;;
+		UNAME_MACHINE=alpha ;;
 	    "EV5 (21164)")
-		UNAME_MACHINE="alphaev5" ;;
+		UNAME_MACHINE=alphaev5 ;;
 	    "EV5.6 (21164A)")
-		UNAME_MACHINE="alphaev56" ;;
+		UNAME_MACHINE=alphaev56 ;;
 	    "EV5.6 (21164PC)")
-		UNAME_MACHINE="alphapca56" ;;
+		UNAME_MACHINE=alphapca56 ;;
 	    "EV5.7 (21164PC)")
-		UNAME_MACHINE="alphapca57" ;;
+		UNAME_MACHINE=alphapca57 ;;
 	    "EV6 (21264)")
-		UNAME_MACHINE="alphaev6" ;;
+		UNAME_MACHINE=alphaev6 ;;
 	    "EV6.7 (21264A)")
-		UNAME_MACHINE="alphaev67" ;;
+		UNAME_MACHINE=alphaev67 ;;
 	    "EV6.8CB (21264C)")
-		UNAME_MACHINE="alphaev68" ;;
+		UNAME_MACHINE=alphaev68 ;;
 	    "EV6.8AL (21264B)")
-		UNAME_MACHINE="alphaev68" ;;
+		UNAME_MACHINE=alphaev68 ;;
 	    "EV6.8CX (21264D)")
-		UNAME_MACHINE="alphaev68" ;;
+		UNAME_MACHINE=alphaev68 ;;
 	    "EV6.9A (21264/EV69A)")
-		UNAME_MACHINE="alphaev69" ;;
+		UNAME_MACHINE=alphaev69 ;;
 	    "EV7 (21364)")
-		UNAME_MACHINE="alphaev7" ;;
+		UNAME_MACHINE=alphaev7 ;;
 	    "EV7.9 (21364A)")
-		UNAME_MACHINE="alphaev79" ;;
+		UNAME_MACHINE=alphaev79 ;;
 	esac
 	# A Pn.n version is a patched version.
 	# A Vn.n version is a released version.
 	# A Tn.n version is a released field test version.
 	# A Xn.n version is an unreleased experimental baselevel.
 	# 1.2 uses "1.2" for uname -r.
-	echo ${UNAME_MACHINE}-dec-osf`echo ${UNAME_RELEASE} | sed -e 's/^[PVTX]//' | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'`
-	exit ;;
+	echo ${UNAME_MACHINE}-dec-osf`echo ${UNAME_RELEASE} | sed -e 's/^[PVTX]//' | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz`
+	# Reset EXIT trap before exiting to avoid spurious non-zero exit code.
+	exitcode=$?
+	trap '' 0
+	exit $exitcode ;;
     Alpha\ *:Windows_NT*:*)
 	# How do we know it's Interix rather than the generic POSIX subsystem?
 	# Should we change UNAME_MACHINE based on the output of uname instead
@@ -295,12 +337,12 @@
 	echo s390-ibm-zvmoe
 	exit ;;
     *:OS400:*:*)
-        echo powerpc-ibm-os400
+	echo powerpc-ibm-os400
 	exit ;;
     arm:RISC*:1.[012]*:*|arm:riscix:1.[012]*:*)
 	echo arm-acorn-riscix${UNAME_RELEASE}
 	exit ;;
-    arm:riscos:*:*|arm:RISCOS:*:*)
+    arm*:riscos:*:*|arm*:RISCOS:*:*)
 	echo arm-unknown-riscos
 	exit ;;
     SR2?01:HI-UX/MPP:*:* | SR8000:HI-UX/MPP:*:*)
@@ -338,16 +380,16 @@
 	exit ;;
     i86pc:SunOS:5.*:* | i86xen:SunOS:5.*:*)
 	eval $set_cc_for_build
-	SUN_ARCH="i386"
+	SUN_ARCH=i386
 	# If there is a compiler, see if it is configured for 64-bit objects.
 	# Note that the Sun cc does not turn __LP64__ into 1 like gcc does.
 	# This test works for both compilers.
-	if [ "$CC_FOR_BUILD" != 'no_compiler_found' ]; then
+	if [ "$CC_FOR_BUILD" != no_compiler_found ]; then
 	    if (echo '#ifdef __amd64'; echo IS_64BIT_ARCH; echo '#endif') | \
-		(CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) | \
+		(CCOPTS="" $CC_FOR_BUILD -E - 2>/dev/null) | \
 		grep IS_64BIT_ARCH >/dev/null
 	    then
-		SUN_ARCH="x86_64"
+		SUN_ARCH=x86_64
 	    fi
 	fi
 	echo ${SUN_ARCH}-pc-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
@@ -372,7 +414,7 @@
 	exit ;;
     sun*:*:4.2BSD:*)
 	UNAME_RELEASE=`(sed 1q /etc/motd | awk '{print substr($5,1,3)}') 2>/dev/null`
-	test "x${UNAME_RELEASE}" = "x" && UNAME_RELEASE=3
+	test "x${UNAME_RELEASE}" = x && UNAME_RELEASE=3
 	case "`/bin/arch`" in
 	    sun3)
 		echo m68k-sun-sunos${UNAME_RELEASE}
@@ -394,23 +436,23 @@
     # MiNT.  But MiNT is downward compatible to TOS, so this should
     # be no problem.
     atarist[e]:*MiNT:*:* | atarist[e]:*mint:*:* | atarist[e]:*TOS:*:*)
-        echo m68k-atari-mint${UNAME_RELEASE}
+	echo m68k-atari-mint${UNAME_RELEASE}
 	exit ;;
     atari*:*MiNT:*:* | atari*:*mint:*:* | atarist[e]:*TOS:*:*)
 	echo m68k-atari-mint${UNAME_RELEASE}
-        exit ;;
+	exit ;;
     *falcon*:*MiNT:*:* | *falcon*:*mint:*:* | *falcon*:*TOS:*:*)
-        echo m68k-atari-mint${UNAME_RELEASE}
+	echo m68k-atari-mint${UNAME_RELEASE}
 	exit ;;
     milan*:*MiNT:*:* | milan*:*mint:*:* | *milan*:*TOS:*:*)
-        echo m68k-milan-mint${UNAME_RELEASE}
-        exit ;;
+	echo m68k-milan-mint${UNAME_RELEASE}
+	exit ;;
     hades*:*MiNT:*:* | hades*:*mint:*:* | *hades*:*TOS:*:*)
-        echo m68k-hades-mint${UNAME_RELEASE}
-        exit ;;
+	echo m68k-hades-mint${UNAME_RELEASE}
+	exit ;;
     *:*MiNT:*:* | *:*mint:*:* | *:*TOS:*:*)
-        echo m68k-unknown-mint${UNAME_RELEASE}
-        exit ;;
+	echo m68k-unknown-mint${UNAME_RELEASE}
+	exit ;;
     m68k:machten:*:*)
 	echo m68k-apple-machten${UNAME_RELEASE}
 	exit ;;
@@ -480,8 +522,8 @@
 	echo m88k-motorola-sysv3
 	exit ;;
     AViiON:dgux:*:*)
-        # DG/UX returns AViiON for all architectures
-        UNAME_PROCESSOR=`/usr/bin/uname -p`
+	# DG/UX returns AViiON for all architectures
+	UNAME_PROCESSOR=`/usr/bin/uname -p`
 	if [ $UNAME_PROCESSOR = mc88100 ] || [ $UNAME_PROCESSOR = mc88110 ]
 	then
 	    if [ ${TARGET_BINARY_INTERFACE}x = m88kdguxelfx ] || \
@@ -494,7 +536,7 @@
 	else
 	    echo i586-dg-dgux${UNAME_RELEASE}
 	fi
- 	exit ;;
+	exit ;;
     M88*:DolphinOS:*:*)	# DolphinOS (SVR3)
 	echo m88k-dolphin-sysv3
 	exit ;;
@@ -551,15 +593,16 @@
 		echo rs6000-ibm-aix3.2
 	fi
 	exit ;;
-    *:AIX:*:[456])
+    *:AIX:*:[4567])
 	IBM_CPU_ID=`/usr/sbin/lsdev -C -c processor -S available | sed 1q | awk '{ print $1 }'`
 	if /usr/sbin/lsattr -El ${IBM_CPU_ID} | grep ' POWER' >/dev/null 2>&1; then
 		IBM_ARCH=rs6000
 	else
 		IBM_ARCH=powerpc
 	fi
-	if [ -x /usr/bin/oslevel ] ; then
-		IBM_REV=`/usr/bin/oslevel`
+	if [ -x /usr/bin/lslpp ] ; then
+		IBM_REV=`/usr/bin/lslpp -Lqc bos.rte.libc |
+			   awk -F: '{ print $3 }' | sed s/[0-9]*$/0/`
 	else
 		IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE}
 	fi
@@ -594,58 +637,58 @@
 	    9000/[678][0-9][0-9])
 		if [ -x /usr/bin/getconf ]; then
 		    sc_cpu_version=`/usr/bin/getconf SC_CPU_VERSION 2>/dev/null`
-                    sc_kernel_bits=`/usr/bin/getconf SC_KERNEL_BITS 2>/dev/null`
-                    case "${sc_cpu_version}" in
-                      523) HP_ARCH="hppa1.0" ;; # CPU_PA_RISC1_0
-                      528) HP_ARCH="hppa1.1" ;; # CPU_PA_RISC1_1
-                      532)                      # CPU_PA_RISC2_0
-                        case "${sc_kernel_bits}" in
-                          32) HP_ARCH="hppa2.0n" ;;
-                          64) HP_ARCH="hppa2.0w" ;;
-			  '') HP_ARCH="hppa2.0" ;;   # HP-UX 10.20
-                        esac ;;
-                    esac
+		    sc_kernel_bits=`/usr/bin/getconf SC_KERNEL_BITS 2>/dev/null`
+		    case "${sc_cpu_version}" in
+		      523) HP_ARCH=hppa1.0 ;; # CPU_PA_RISC1_0
+		      528) HP_ARCH=hppa1.1 ;; # CPU_PA_RISC1_1
+		      532)                      # CPU_PA_RISC2_0
+			case "${sc_kernel_bits}" in
+			  32) HP_ARCH=hppa2.0n ;;
+			  64) HP_ARCH=hppa2.0w ;;
+			  '') HP_ARCH=hppa2.0 ;;   # HP-UX 10.20
+			esac ;;
+		    esac
 		fi
 		if [ "${HP_ARCH}" = "" ]; then
 		    eval $set_cc_for_build
-		    sed 's/^              //' << EOF >$dummy.c
+		    sed 's/^		//' << EOF >$dummy.c
 
-              #define _HPUX_SOURCE
-              #include <stdlib.h>
-              #include <unistd.h>
-
-              int main ()
-              {
-              #if defined(_SC_KERNEL_BITS)
-                  long bits = sysconf(_SC_KERNEL_BITS);
-              #endif
-                  long cpu  = sysconf (_SC_CPU_VERSION);
-
-                  switch (cpu)
-              	{
-              	case CPU_PA_RISC1_0: puts ("hppa1.0"); break;
-              	case CPU_PA_RISC1_1: puts ("hppa1.1"); break;
-              	case CPU_PA_RISC2_0:
-              #if defined(_SC_KERNEL_BITS)
-              	    switch (bits)
-              		{
-              		case 64: puts ("hppa2.0w"); break;
-              		case 32: puts ("hppa2.0n"); break;
-              		default: puts ("hppa2.0"); break;
-              		} break;
-              #else  /* !defined(_SC_KERNEL_BITS) */
-              	    puts ("hppa2.0"); break;
-              #endif
-              	default: puts ("hppa1.0"); break;
-              	}
-                  exit (0);
-              }
+		#define _HPUX_SOURCE
+		#include <stdlib.h>
+		#include <unistd.h>
+
+		int main ()
+		{
+		#if defined(_SC_KERNEL_BITS)
+		    long bits = sysconf(_SC_KERNEL_BITS);
+		#endif
+		    long cpu  = sysconf (_SC_CPU_VERSION);
+
+		    switch (cpu)
+			{
+			case CPU_PA_RISC1_0: puts ("hppa1.0"); break;
+			case CPU_PA_RISC1_1: puts ("hppa1.1"); break;
+			case CPU_PA_RISC2_0:
+		#if defined(_SC_KERNEL_BITS)
+			    switch (bits)
+				{
+				case 64: puts ("hppa2.0w"); break;
+				case 32: puts ("hppa2.0n"); break;
+				default: puts ("hppa2.0"); break;
+				} break;
+		#else  /* !defined(_SC_KERNEL_BITS) */
+			    puts ("hppa2.0"); break;
+		#endif
+			default: puts ("hppa1.0"); break;
+			}
+		    exit (0);
+		}
 EOF
-		    (CCOPTS= $CC_FOR_BUILD -o $dummy $dummy.c 2>/dev/null) && HP_ARCH=`$dummy`
+		    (CCOPTS="" $CC_FOR_BUILD -o $dummy $dummy.c 2>/dev/null) && HP_ARCH=`$dummy`
 		    test -z "$HP_ARCH" && HP_ARCH=hppa
 		fi ;;
 	esac
-	if [ ${HP_ARCH} = "hppa2.0w" ]
+	if [ ${HP_ARCH} = hppa2.0w ]
 	then
 	    eval $set_cc_for_build
 
@@ -658,12 +701,12 @@
 	    # $ CC_FOR_BUILD="cc +DA2.0w" ./config.guess
 	    # => hppa64-hp-hpux11.23
 
-	    if echo __LP64__ | (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) |
+	    if echo __LP64__ | (CCOPTS="" $CC_FOR_BUILD -E - 2>/dev/null) |
 		grep -q __LP64__
 	    then
-		HP_ARCH="hppa2.0w"
+		HP_ARCH=hppa2.0w
 	    else
-		HP_ARCH="hppa64"
+		HP_ARCH=hppa64
 	    fi
 	fi
 	echo ${HP_ARCH}-hp-hpux${HPUX_REV}
@@ -730,22 +773,22 @@
 	exit ;;
     C1*:ConvexOS:*:* | convex:ConvexOS:C1*:*)
 	echo c1-convex-bsd
-        exit ;;
+	exit ;;
     C2*:ConvexOS:*:* | convex:ConvexOS:C2*:*)
 	if getsysinfo -f scalar_acc
 	then echo c32-convex-bsd
 	else echo c2-convex-bsd
 	fi
-        exit ;;
+	exit ;;
     C34*:ConvexOS:*:* | convex:ConvexOS:C34*:*)
 	echo c34-convex-bsd
-        exit ;;
+	exit ;;
     C38*:ConvexOS:*:* | convex:ConvexOS:C38*:*)
 	echo c38-convex-bsd
-        exit ;;
+	exit ;;
     C4*:ConvexOS:*:* | convex:ConvexOS:C4*:*)
 	echo c4-convex-bsd
-        exit ;;
+	exit ;;
     CRAY*Y-MP:*:*:*)
 	echo ymp-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/'
 	exit ;;
@@ -768,15 +811,15 @@
 	echo craynv-cray-unicosmp${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/'
 	exit ;;
     F30[01]:UNIX_System_V:*:* | F700:UNIX_System_V:*:*)
-	FUJITSU_PROC=`uname -m | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'`
-        FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'`
-        FUJITSU_REL=`echo ${UNAME_RELEASE} | sed -e 's/ /_/'`
-        echo "${FUJITSU_PROC}-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}"
-        exit ;;
+	FUJITSU_PROC=`uname -m | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz`
+	FUJITSU_SYS=`uname -p | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz | sed -e 's/\///'`
+	FUJITSU_REL=`echo ${UNAME_RELEASE} | sed -e 's/ /_/'`
+	echo "${FUJITSU_PROC}-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}"
+	exit ;;
     5000:UNIX_System_V:4.*:*)
-        FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'`
-        FUJITSU_REL=`echo ${UNAME_RELEASE} | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/ /_/'`
-        echo "sparc-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}"
+	FUJITSU_SYS=`uname -p | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz | sed -e 's/\///'`
+	FUJITSU_REL=`echo ${UNAME_RELEASE} | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz | sed -e 's/ /_/'`
+	echo "sparc-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}"
 	exit ;;
     i*86:BSD/386:*:* | i*86:BSD/OS:*:* | *:Ascend\ Embedded/OS:*:*)
 	echo ${UNAME_MACHINE}-pc-bsdi${UNAME_RELEASE}
@@ -788,30 +831,35 @@
 	echo ${UNAME_MACHINE}-unknown-bsdi${UNAME_RELEASE}
 	exit ;;
     *:FreeBSD:*:*)
-	case ${UNAME_MACHINE} in
-	    pc98)
-		echo i386-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;;
+	UNAME_PROCESSOR=`/usr/bin/uname -p`
+	case ${UNAME_PROCESSOR} in
 	    amd64)
 		echo x86_64-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;;
 	    *)
-		echo ${UNAME_MACHINE}-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;;
+		echo ${UNAME_PROCESSOR}-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;;
 	esac
 	exit ;;
     i*:CYGWIN*:*)
 	echo ${UNAME_MACHINE}-pc-cygwin
 	exit ;;
+    *:MINGW64*:*)
+	echo ${UNAME_MACHINE}-pc-mingw64
+	exit ;;
     *:MINGW*:*)
 	echo ${UNAME_MACHINE}-pc-mingw32
 	exit ;;
+    *:MSYS*:*)
+	echo ${UNAME_MACHINE}-pc-msys
+	exit ;;
     i*:windows32*:*)
-    	# uname -m includes "-pc" on this system.
-    	echo ${UNAME_MACHINE}-mingw32
+	# uname -m includes "-pc" on this system.
+	echo ${UNAME_MACHINE}-mingw32
 	exit ;;
     i*:PW*:*)
 	echo ${UNAME_MACHINE}-pc-pw32
 	exit ;;
     *:Interix*:*)
-    	case ${UNAME_MACHINE} in
+	case ${UNAME_MACHINE} in
 	    x86)
 		echo i586-pc-interix${UNAME_RELEASE}
 		exit ;;
@@ -848,15 +896,22 @@
 	exit ;;
     *:GNU:*:*)
 	# the GNU system
-	echo `echo ${UNAME_MACHINE}|sed -e 's,[-/].*$,,'`-unknown-gnu`echo ${UNAME_RELEASE}|sed -e 's,/.*$,,'`
+	echo `echo ${UNAME_MACHINE}|sed -e 's,[-/].*$,,'`-unknown-${LIBC}`echo ${UNAME_RELEASE}|sed -e 's,/.*$,,'`
 	exit ;;
     *:GNU/*:*:*)
 	# other systems with GNU libc and userland
-	echo ${UNAME_MACHINE}-unknown-`echo ${UNAME_SYSTEM} | sed 's,^[^/]*/,,' | tr '[A-Z]' '[a-z]'``echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`-gnu
+	echo ${UNAME_MACHINE}-unknown-`echo ${UNAME_SYSTEM} | sed 's,^[^/]*/,,' | tr "[:upper:]" "[:lower:]"``echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`-${LIBC}
 	exit ;;
     i*86:Minix:*:*)
 	echo ${UNAME_MACHINE}-pc-minix
 	exit ;;
+    aarch64:Linux:*:*)
+	echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
+	exit ;;
+    aarch64_be:Linux:*:*)
+	UNAME_MACHINE=aarch64_be
+	echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
+	exit ;;
     alpha:Linux:*:*)
 	case `sed -n '/^cpu model/s/^.*: \(.*\)/\1/p' < /proc/cpuinfo` in
 	  EV5)   UNAME_MACHINE=alphaev5 ;;
@@ -866,52 +921,62 @@
 	  EV6)   UNAME_MACHINE=alphaev6 ;;
 	  EV67)  UNAME_MACHINE=alphaev67 ;;
 	  EV68*) UNAME_MACHINE=alphaev68 ;;
-        esac
+	esac
 	objdump --private-headers /bin/sh | grep -q ld.so.1
-	if test "$?" = 0 ; then LIBC="libc1" ; else LIBC="" ; fi
-	echo ${UNAME_MACHINE}-unknown-linux-gnu${LIBC}
+	if test "$?" = 0 ; then LIBC=gnulibc1 ; fi
+	echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
+	exit ;;
+    arc:Linux:*:* | arceb:Linux:*:*)
+	echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
 	exit ;;
     arm*:Linux:*:*)
 	eval $set_cc_for_build
 	if echo __ARM_EABI__ | $CC_FOR_BUILD -E - 2>/dev/null \
 	    | grep -q __ARM_EABI__
 	then
-	    echo ${UNAME_MACHINE}-unknown-linux-gnu
+	    echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
 	else
-	    echo ${UNAME_MACHINE}-unknown-linux-gnueabi
+	    if echo __ARM_PCS_VFP | $CC_FOR_BUILD -E - 2>/dev/null \
+		| grep -q __ARM_PCS_VFP
+	    then
+		echo ${UNAME_MACHINE}-unknown-linux-${LIBC}eabi
+	    else
+		echo ${UNAME_MACHINE}-unknown-linux-${LIBC}eabihf
+	    fi
 	fi
 	exit ;;
     avr32*:Linux:*:*)
-	echo ${UNAME_MACHINE}-unknown-linux-gnu
+	echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
 	exit ;;
     cris:Linux:*:*)
-	echo cris-axis-linux-gnu
+	echo ${UNAME_MACHINE}-axis-linux-${LIBC}
 	exit ;;
     crisv32:Linux:*:*)
-	echo crisv32-axis-linux-gnu
+	echo ${UNAME_MACHINE}-axis-linux-${LIBC}
+	exit ;;
+    e2k:Linux:*:*)
+	echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
 	exit ;;
     frv:Linux:*:*)
-    	echo frv-unknown-linux-gnu
+	echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
+	exit ;;
+    hexagon:Linux:*:*)
+	echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
 	exit ;;
     i*86:Linux:*:*)
-	LIBC=gnu
-	eval $set_cc_for_build
-	sed 's/^	//' << EOF >$dummy.c
-	#ifdef __dietlibc__
-	LIBC=dietlibc
-	#endif
-EOF
-	eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep '^LIBC'`
-	echo "${UNAME_MACHINE}-pc-linux-${LIBC}"
+	echo ${UNAME_MACHINE}-pc-linux-${LIBC}
 	exit ;;
     ia64:Linux:*:*)
-	echo ${UNAME_MACHINE}-unknown-linux-gnu
+	echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
+	exit ;;
+    k1om:Linux:*:*)
+	echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
 	exit ;;
     m32r*:Linux:*:*)
-	echo ${UNAME_MACHINE}-unknown-linux-gnu
+	echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
 	exit ;;
     m68*:Linux:*:*)
-	echo ${UNAME_MACHINE}-unknown-linux-gnu
+	echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
 	exit ;;
     mips:Linux:*:* | mips64:Linux:*:*)
 	eval $set_cc_for_build
@@ -930,51 +995,63 @@
 	#endif
 EOF
 	eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep '^CPU'`
-	test x"${CPU}" != x && { echo "${CPU}-unknown-linux-gnu"; exit; }
+	test x"${CPU}" != x && { echo "${CPU}-unknown-linux-${LIBC}"; exit; }
 	;;
-    or32:Linux:*:*)
-	echo or32-unknown-linux-gnu
+    openrisc*:Linux:*:*)
+	echo or1k-unknown-linux-${LIBC}
+	exit ;;
+    or32:Linux:*:* | or1k*:Linux:*:*)
+	echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
 	exit ;;
     padre:Linux:*:*)
-	echo sparc-unknown-linux-gnu
+	echo sparc-unknown-linux-${LIBC}
 	exit ;;
     parisc64:Linux:*:* | hppa64:Linux:*:*)
-	echo hppa64-unknown-linux-gnu
+	echo hppa64-unknown-linux-${LIBC}
 	exit ;;
     parisc:Linux:*:* | hppa:Linux:*:*)
 	# Look for CPU level
 	case `grep '^cpu[^a-z]*:' /proc/cpuinfo 2>/dev/null | cut -d' ' -f2` in
-	  PA7*) echo hppa1.1-unknown-linux-gnu ;;
-	  PA8*) echo hppa2.0-unknown-linux-gnu ;;
-	  *)    echo hppa-unknown-linux-gnu ;;
+	  PA7*) echo hppa1.1-unknown-linux-${LIBC} ;;
+	  PA8*) echo hppa2.0-unknown-linux-${LIBC} ;;
+	  *)    echo hppa-unknown-linux-${LIBC} ;;
 	esac
 	exit ;;
     ppc64:Linux:*:*)
-	echo powerpc64-unknown-linux-gnu
+	echo powerpc64-unknown-linux-${LIBC}
 	exit ;;
     ppc:Linux:*:*)
-	echo powerpc-unknown-linux-gnu
+	echo powerpc-unknown-linux-${LIBC}
+	exit ;;
+    ppc64le:Linux:*:*)
+	echo powerpc64le-unknown-linux-${LIBC}
+	exit ;;
+    ppcle:Linux:*:*)
+	echo powerpcle-unknown-linux-${LIBC}
 	exit ;;
     s390:Linux:*:* | s390x:Linux:*:*)
-	echo ${UNAME_MACHINE}-ibm-linux
+	echo ${UNAME_MACHINE}-ibm-linux-${LIBC}
 	exit ;;
     sh64*:Linux:*:*)
-    	echo ${UNAME_MACHINE}-unknown-linux-gnu
+	echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
 	exit ;;
     sh*:Linux:*:*)
-	echo ${UNAME_MACHINE}-unknown-linux-gnu
+	echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
 	exit ;;
     sparc:Linux:*:* | sparc64:Linux:*:*)
-	echo ${UNAME_MACHINE}-unknown-linux-gnu
+	echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
+	exit ;;
+    tile*:Linux:*:*)
+	echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
 	exit ;;
     vax:Linux:*:*)
-	echo ${UNAME_MACHINE}-dec-linux-gnu
+	echo ${UNAME_MACHINE}-dec-linux-${LIBC}
 	exit ;;
     x86_64:Linux:*:*)
-	echo x86_64-unknown-linux-gnu
+	echo ${UNAME_MACHINE}-pc-linux-${LIBC}
 	exit ;;
     xtensa*:Linux:*:*)
-    	echo ${UNAME_MACHINE}-unknown-linux-gnu
+	echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
 	exit ;;
     i*86:DYNIX/ptx:4*:*)
 	# ptx 4.0 does uname -s correctly, with DYNIX/ptx in there.
@@ -983,11 +1060,11 @@
 	echo i386-sequent-sysv4
 	exit ;;
     i*86:UNIX_SV:4.2MP:2.*)
-        # Unixware is an offshoot of SVR4, but it has its own version
-        # number series starting with 2...
-        # I am not positive that other SVR4 systems won't match this,
+	# Unixware is an offshoot of SVR4, but it has its own version
+	# number series starting with 2...
+	# I am not positive that other SVR4 systems won't match this,
 	# I just have to hope.  -- rms.
-        # Use sysv4.2uw... so that sysv4* matches it.
+	# Use sysv4.2uw... so that sysv4* matches it.
 	echo ${UNAME_MACHINE}-pc-sysv4.2uw${UNAME_VERSION}
 	exit ;;
     i*86:OS/2:*:*)
@@ -1019,7 +1096,7 @@
 	fi
 	exit ;;
     i*86:*:5:[678]*)
-    	# UnixWare 7.x, OpenUNIX and OpenServer 6.
+	# UnixWare 7.x, OpenUNIX and OpenServer 6.
 	case `/bin/uname -X | grep "^Machine"` in
 	    *486*)	     UNAME_MACHINE=i486 ;;
 	    *Pentium)	     UNAME_MACHINE=i586 ;;
@@ -1047,13 +1124,13 @@
 	exit ;;
     pc:*:*:*)
 	# Left here for compatibility:
-        # uname -m prints for DJGPP always 'pc', but it prints nothing about
-        # the processor, so we play safe by assuming i586.
+	# uname -m prints for DJGPP always 'pc', but it prints nothing about
+	# the processor, so we play safe by assuming i586.
 	# Note: whatever this is, it MUST be the same as what config.sub
-	# prints for the "djgpp" host, or else GDB configury will decide that
+	# prints for the "djgpp" host, or else GDB configure will decide that
 	# this is a cross-build.
 	echo i586-pc-msdosdjgpp
-        exit ;;
+	exit ;;
     Intel:Mach:3*:*)
 	echo i386-pc-mach3
 	exit ;;
@@ -1088,8 +1165,8 @@
 	/bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \
 	  && { echo i586-ncr-sysv4.3${OS_REL}; exit; } ;;
     3[34]??:*:4.0:* | 3[34]??,*:*:4.0:*)
-        /bin/uname -p 2>/dev/null | grep 86 >/dev/null \
-          && { echo i486-ncr-sysv4; exit; } ;;
+	/bin/uname -p 2>/dev/null | grep 86 >/dev/null \
+	  && { echo i486-ncr-sysv4; exit; } ;;
     NCR*:*:4.2:* | MPRAS*:*:4.2:*)
 	OS_REL='.3'
 	test -r /etc/.relid \
@@ -1132,10 +1209,10 @@
 		echo ns32k-sni-sysv
 	fi
 	exit ;;
-    PENTIUM:*:4.0*:*) # Unisys `ClearPath HMP IX 4000' SVR4/MP effort
-                      # says <Richard.M.Bartel@ccMail.Census.GOV>
-        echo i586-unisys-sysv4
-        exit ;;
+    PENTIUM:*:4.0*:*)	# Unisys `ClearPath HMP IX 4000' SVR4/MP effort
+			# says <Richard.M.Bartel@ccMail.Census.GOV>
+	echo i586-unisys-sysv4
+	exit ;;
     *:UNIX_System_V:4*:FTX*)
 	# From Gerald Hewes <hewes@openmarket.com>.
 	# How about differentiating between stratus architectures? -djm
@@ -1161,11 +1238,11 @@
 	exit ;;
     R[34]000:*System_V*:*:* | R4000:UNIX_SYSV:*:* | R*000:UNIX_SV:*:*)
 	if [ -d /usr/nec ]; then
-	        echo mips-nec-sysv${UNAME_RELEASE}
+		echo mips-nec-sysv${UNAME_RELEASE}
 	else
-	        echo mips-unknown-sysv${UNAME_RELEASE}
+		echo mips-unknown-sysv${UNAME_RELEASE}
 	fi
-        exit ;;
+	exit ;;
     BeBox:BeOS:*:*)	# BeOS running on hardware made by Be, PPC only.
 	echo powerpc-be-beos
 	exit ;;
@@ -1178,6 +1255,9 @@
     BePC:Haiku:*:*)	# Haiku running on Intel PC compatible.
 	echo i586-pc-haiku
 	exit ;;
+    x86_64:Haiku:*:*)
+	echo x86_64-unknown-haiku
+	exit ;;
     SX-4:SUPER-UX:*:*)
 	echo sx4-nec-superux${UNAME_RELEASE}
 	exit ;;
@@ -1196,6 +1276,9 @@
     SX-8R:SUPER-UX:*:*)
 	echo sx8r-nec-superux${UNAME_RELEASE}
 	exit ;;
+    SX-ACE:SUPER-UX:*:*)
+	echo sxace-nec-superux${UNAME_RELEASE}
+	exit ;;
     Power*:Rhapsody:*:*)
 	echo powerpc-apple-rhapsody${UNAME_RELEASE}
 	exit ;;
@@ -1204,24 +1287,36 @@
 	exit ;;
     *:Darwin:*:*)
 	UNAME_PROCESSOR=`uname -p` || UNAME_PROCESSOR=unknown
-	case $UNAME_PROCESSOR in
-	    i386)
-		eval $set_cc_for_build
-		if [ "$CC_FOR_BUILD" != 'no_compiler_found' ]; then
-		  if (echo '#ifdef __LP64__'; echo IS_64BIT_ARCH; echo '#endif') | \
-		      (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) | \
-		      grep IS_64BIT_ARCH >/dev/null
-		  then
-		      UNAME_PROCESSOR="x86_64"
-		  fi
-		fi ;;
-	    unknown) UNAME_PROCESSOR=powerpc ;;
-	esac
+	eval $set_cc_for_build
+	if test "$UNAME_PROCESSOR" = unknown ; then
+	    UNAME_PROCESSOR=powerpc
+	fi
+	if test `echo "$UNAME_RELEASE" | sed -e 's/\..*//'` -le 10 ; then
+	    if [ "$CC_FOR_BUILD" != no_compiler_found ]; then
+		if (echo '#ifdef __LP64__'; echo IS_64BIT_ARCH; echo '#endif') | \
+		    (CCOPTS="" $CC_FOR_BUILD -E - 2>/dev/null) | \
+		    grep IS_64BIT_ARCH >/dev/null
+		then
+		    case $UNAME_PROCESSOR in
+			i386) UNAME_PROCESSOR=x86_64 ;;
+			powerpc) UNAME_PROCESSOR=powerpc64 ;;
+		    esac
+		fi
+	    fi
+	elif test "$UNAME_PROCESSOR" = i386 ; then
+	    # Avoid executing cc on OS X 10.9, as it ships with a stub
+	    # that puts up a graphical alert prompting to install
+	    # developer tools.  Any system running Mac OS X 10.7 or
+	    # later (Darwin 11 and later) is required to have a 64-bit
+	    # processor. This is not true of the ARM version of Darwin
+	    # that Apple uses in portable devices.
+	    UNAME_PROCESSOR=x86_64
+	fi
 	echo ${UNAME_PROCESSOR}-apple-darwin${UNAME_RELEASE}
 	exit ;;
     *:procnto*:*:* | *:QNX:[0123456789]*:*)
 	UNAME_PROCESSOR=`uname -p`
-	if test "$UNAME_PROCESSOR" = "x86"; then
+	if test "$UNAME_PROCESSOR" = x86; then
 		UNAME_PROCESSOR=i386
 		UNAME_MACHINE=pc
 	fi
@@ -1230,7 +1325,10 @@
     *:QNX:*:4*)
 	echo i386-pc-qnx
 	exit ;;
-    NSE-?:NONSTOP_KERNEL:*:*)
+    NEO-?:NONSTOP_KERNEL:*:*)
+	echo neo-tandem-nsk${UNAME_RELEASE}
+	exit ;;
+    NSE-*:NONSTOP_KERNEL:*:*)
 	echo nse-tandem-nsk${UNAME_RELEASE}
 	exit ;;
     NSR-?:NONSTOP_KERNEL:*:*)
@@ -1249,7 +1347,7 @@
 	# "uname -m" is not consistent, so use $cputype instead. 386
 	# is converted to i386 for consistency with other x86
 	# operating systems.
-	if test "$cputype" = "386"; then
+	if test "$cputype" = 386; then
 	    UNAME_MACHINE=i386
 	else
 	    UNAME_MACHINE="$cputype"
@@ -1275,13 +1373,13 @@
 	echo pdp10-unknown-its
 	exit ;;
     SEI:*:*:SEIUX)
-        echo mips-sei-seiux${UNAME_RELEASE}
+	echo mips-sei-seiux${UNAME_RELEASE}
 	exit ;;
     *:DragonFly:*:*)
 	echo ${UNAME_MACHINE}-unknown-dragonfly`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`
 	exit ;;
     *:*VMS:*:*)
-    	UNAME_MACHINE=`(uname -p) 2>/dev/null`
+	UNAME_MACHINE=`(uname -p) 2>/dev/null`
 	case "${UNAME_MACHINE}" in
 	    A*) echo alpha-dec-vms ; exit ;;
 	    I*) echo ia64-dec-vms ; exit ;;
@@ -1291,7 +1389,7 @@
 	echo i386-pc-xenix
 	exit ;;
     i*86:skyos:*:*)
-	echo ${UNAME_MACHINE}-pc-skyos`echo ${UNAME_RELEASE}` | sed -e 's/ .*$//'
+	echo ${UNAME_MACHINE}-pc-skyos`echo ${UNAME_RELEASE} | sed -e 's/ .*$//'`
 	exit ;;
     i*86:rdos:*:*)
 	echo ${UNAME_MACHINE}-pc-rdos
@@ -1299,158 +1397,13 @@
     i*86:AROS:*:*)
 	echo ${UNAME_MACHINE}-pc-aros
 	exit ;;
-esac
-
-#echo '(No uname command or uname output not recognized.)' 1>&2
-#echo "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" 1>&2
-
-eval $set_cc_for_build
-cat >$dummy.c <<EOF
-#ifdef _SEQUENT_
-# include <sys/types.h>
-# include <sys/utsname.h>
-#endif
-main ()
-{
-#if defined (sony)
-#if defined (MIPSEB)
-  /* BFD wants "bsd" instead of "newsos".  Perhaps BFD should be changed,
-     I don't know....  */
-  printf ("mips-sony-bsd\n"); exit (0);
-#else
-#include <sys/param.h>
-  printf ("m68k-sony-newsos%s\n",
-#ifdef NEWSOS4
-          "4"
-#else
-	  ""
-#endif
-         ); exit (0);
-#endif
-#endif
-
-#if defined (__arm) && defined (__acorn) && defined (__unix)
-  printf ("arm-acorn-riscix\n"); exit (0);
-#endif
-
-#if defined (hp300) && !defined (hpux)
-  printf ("m68k-hp-bsd\n"); exit (0);
-#endif
-
-#if defined (NeXT)
-#if !defined (__ARCHITECTURE__)
-#define __ARCHITECTURE__ "m68k"
-#endif
-  int version;
-  version=`(hostinfo | sed -n 's/.*NeXT Mach \([0-9]*\).*/\1/p') 2>/dev/null`;
-  if (version < 4)
-    printf ("%s-next-nextstep%d\n", __ARCHITECTURE__, version);
-  else
-    printf ("%s-next-openstep%d\n", __ARCHITECTURE__, version);
-  exit (0);
-#endif
-
-#if defined (MULTIMAX) || defined (n16)
-#if defined (UMAXV)
-  printf ("ns32k-encore-sysv\n"); exit (0);
-#else
-#if defined (CMU)
-  printf ("ns32k-encore-mach\n"); exit (0);
-#else
-  printf ("ns32k-encore-bsd\n"); exit (0);
-#endif
-#endif
-#endif
-
-#if defined (__386BSD__)
-  printf ("i386-pc-bsd\n"); exit (0);
-#endif
-
-#if defined (sequent)
-#if defined (i386)
-  printf ("i386-sequent-dynix\n"); exit (0);
-#endif
-#if defined (ns32000)
-  printf ("ns32k-sequent-dynix\n"); exit (0);
-#endif
-#endif
-
-#if defined (_SEQUENT_)
-    struct utsname un;
-
-    uname(&un);
-
-    if (strncmp(un.version, "V2", 2) == 0) {
-	printf ("i386-sequent-ptx2\n"); exit (0);
-    }
-    if (strncmp(un.version, "V1", 2) == 0) { /* XXX is V1 correct? */
-	printf ("i386-sequent-ptx1\n"); exit (0);
-    }
-    printf ("i386-sequent-ptx\n"); exit (0);
-
-#endif
-
-#if defined (vax)
-# if !defined (ultrix)
-#  include <sys/param.h>
-#  if defined (BSD)
-#   if BSD == 43
-      printf ("vax-dec-bsd4.3\n"); exit (0);
-#   else
-#    if BSD == 199006
-      printf ("vax-dec-bsd4.3reno\n"); exit (0);
-#    else
-      printf ("vax-dec-bsd\n"); exit (0);
-#    endif
-#   endif
-#  else
-    printf ("vax-dec-bsd\n"); exit (0);
-#  endif
-# else
-    printf ("vax-dec-ultrix\n"); exit (0);
-# endif
-#endif
-
-#if defined (alliant) && defined (i860)
-  printf ("i860-alliant-bsd\n"); exit (0);
-#endif
-
-  exit (1);
-}
-EOF
-
-$CC_FOR_BUILD -o $dummy $dummy.c 2>/dev/null && SYSTEM_NAME=`$dummy` &&
-	{ echo "$SYSTEM_NAME"; exit; }
-
-# Apollos put the system type in the environment.
-
-test -d /usr/apollo && { echo ${ISP}-apollo-${SYSTYPE}; exit; }
-
-# Convex versions that predate uname can use getsysinfo(1)
-
-if [ -x /usr/convex/getsysinfo ]
-then
-    case `getsysinfo -f cpu_type` in
-    c1*)
-	echo c1-convex-bsd
-	exit ;;
-    c2*)
-	if getsysinfo -f scalar_acc
-	then echo c32-convex-bsd
-	else echo c2-convex-bsd
-	fi
-	exit ;;
-    c34*)
-	echo c34-convex-bsd
-	exit ;;
-    c38*)
-	echo c38-convex-bsd
+    x86_64:VMkernel:*:*)
+	echo ${UNAME_MACHINE}-unknown-esx
 	exit ;;
-    c4*)
-	echo c4-convex-bsd
+    amd64:Isilon\ OneFS:*:*)
+	echo x86_64-unknown-onefs
 	exit ;;
-    esac
-fi
+esac
 
 cat >&2 <<EOF
 $0: unable to guess system type
@@ -1459,9 +1412,9 @@
 the operating system you are using. It is advised that you
 download the most up to date version of the config scripts from
 
-  http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.guess;hb=HEAD
+  http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.guess
 and
-  http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.sub;hb=HEAD
+  http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.sub
 
 If the version you run ($0) is already up to date, please
 send the following data and any information you think might be
diff -Naur ruby-1.9.3-p551/tool/config.sub ruby-1.9.3-p551+ppc64le/tool/config.sub
--- ruby-1.9.3-p551/tool/config.sub	2010-10-03 15:06:23.000000000 +0000
+++ ruby-1.9.3-p551+ppc64le/tool/config.sub	2016-04-15 05:09:41.237756446 +0000
@@ -1,38 +1,31 @@
 #! /bin/sh
 # Configuration validation subroutine script.
-#   Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999,
-#   2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009
-#   Free Software Foundation, Inc.
-
-timestamp='2009-11-20'
-
-# This file is (in principle) common to ALL GNU software.
-# The presence of a machine in this file suggests that SOME GNU software
-# can handle that machine.  It does not imply ALL GNU software can.
-#
-# This file is free software; you can redistribute it and/or modify
-# it under the terms of the GNU General Public License as published by
-# the Free Software Foundation; either version 2 of the License, or
+#   Copyright 1992-2016 Free Software Foundation, Inc.
+
+timestamp='2016-03-30'
+
+# This file is free software; you can redistribute it and/or modify it
+# under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 3 of the License, or
 # (at your option) any later version.
 #
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-# GNU General Public License for more details.
+# This program is distributed in the hope that it will be useful, but
+# WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+# General Public License for more details.
 #
 # You should have received a copy of the GNU General Public License
-# along with this program; if not, write to the Free Software
-# Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA
-# 02110-1301, USA.
+# along with this program; if not, see <http://www.gnu.org/licenses/>.
 #
 # As a special exception to the GNU General Public License, if you
 # distribute this file as part of a program that contains a
 # configuration script generated by Autoconf, you may include it under
-# the same distribution terms that you use for the rest of that program.
+# the same distribution terms that you use for the rest of that
+# program.  This Exception is an additional permission under section 7
+# of the GNU General Public License, version 3 ("GPLv3").
 
 
-# Please send patches to <config-patches@gnu.org>.  Submit a context
-# diff and a properly formatted GNU ChangeLog entry.
+# Please send patches to <config-patches@gnu.org>.
 #
 # Configuration subroutine to validate and canonicalize a configuration type.
 # Supply the specified configuration type as an argument.
@@ -40,7 +33,7 @@
 # Otherwise, we print the canonical config type on stdout and succeed.
 
 # You can get the latest version of this script from:
-# http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.sub;hb=HEAD
+# http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.sub
 
 # This file is supposed to be the same for all GNU packages
 # and recognize all the CPU types, system types and aliases
@@ -60,8 +53,7 @@
 me=`echo "$0" | sed -e 's,.*/,,'`
 
 usage="\
-Usage: $0 [OPTION] CPU-MFR-OPSYS
-       $0 [OPTION] ALIAS
+Usage: $0 [OPTION] CPU-MFR-OPSYS or ALIAS
 
 Canonicalize a configuration name.
 
@@ -75,8 +67,7 @@
 version="\
 GNU config.sub ($timestamp)
 
-Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001,
-2002, 2003, 2004, 2005, 2006, 2007, 2008 Free Software Foundation, Inc.
+Copyright 1992-2016 Free Software Foundation, Inc.
 
 This is free software; see the source for copying conditions.  There is NO
 warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE."
@@ -123,13 +114,18 @@
 # Here we must recognize all the valid KERNEL-OS combinations.
 maybe_os=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\2/'`
 case $maybe_os in
-  nto-qnx* | linux-gnu* | linux-dietlibc | linux-newlib* | linux-uclibc* | \
-  uclinux-uclibc* | uclinux-gnu* | kfreebsd*-gnu* | knetbsd*-gnu* | netbsd*-gnu* | \
+  nto-qnx* | linux-gnu* | linux-android* | linux-dietlibc | linux-newlib* | \
+  linux-musl* | linux-uclibc* | uclinux-uclibc* | uclinux-gnu* | kfreebsd*-gnu* | \
+  knetbsd*-gnu* | netbsd*-gnu* | netbsd*-eabi* | \
   kopensolaris*-gnu* | \
   storm-chaos* | os2-emx* | rtmk-nova*)
     os=-$maybe_os
     basic_machine=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'`
     ;;
+  android-linux)
+    os=-linux-android
+    basic_machine=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'`-unknown
+    ;;
   *)
     basic_machine=`echo $1 | sed 's/-[^-]*$//'`
     if [ $basic_machine != $1 ]
@@ -152,12 +148,12 @@
 	-convergent* | -ncr* | -news | -32* | -3600* | -3100* | -hitachi* |\
 	-c[123]* | -convex* | -sun | -crds | -omron* | -dg | -ultra | -tti* | \
 	-harris | -dolphin | -highlevel | -gould | -cbm | -ns | -masscomp | \
-	-apple | -axis | -knuth | -cray | -microblaze)
+	-apple | -axis | -knuth | -cray | -microblaze*)
 		os=
 		basic_machine=$1
 		;;
-        -bluegene*)
-	        os=-cnk
+	-bluegene*)
+		os=-cnk
 		;;
 	-sim | -cisco | -oki | -wec | -winbond)
 		os=
@@ -173,10 +169,10 @@
 		os=-chorusos
 		basic_machine=$1
 		;;
- 	-chorusrdb)
- 		os=-chorusrdb
+	-chorusrdb)
+		os=-chorusrdb
 		basic_machine=$1
- 		;;
+		;;
 	-hiux*)
 		os=-hiuxwe2
 		;;
@@ -221,6 +217,12 @@
 	-isc*)
 		basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
 		;;
+	-lynx*178)
+		os=-lynxos178
+		;;
+	-lynx*5)
+		os=-lynxos5
+		;;
 	-lynx*)
 		os=-lynxos
 		;;
@@ -245,20 +247,29 @@
 	# Some are omitted here because they have special meanings below.
 	1750a | 580 \
 	| a29k \
+	| aarch64 | aarch64_be \
 	| alpha | alphaev[4-8] | alphaev56 | alphaev6[78] | alphapca5[67] \
 	| alpha64 | alpha64ev[4-8] | alpha64ev56 | alpha64ev6[78] | alpha64pca5[67] \
 	| am33_2.0 \
-	| arc | arm | arm[bl]e | arme[lb] | armv[2345] | armv[345][lb] | avr | avr32 \
+	| arc | arceb \
+	| arm | arm[bl]e | arme[lb] | armv[2-8] | armv[3-8][lb] | armv7[arm] \
+	| avr | avr32 \
+	| ba \
+	| be32 | be64 \
 	| bfin \
-	| c4x | clipper \
+	| c4x | c8051 | clipper \
 	| d10v | d30v | dlx | dsp16xx \
-	| fido | fr30 | frv \
+	| e2k | epiphany \
+	| fido | fr30 | frv | ft32 \
 	| h8300 | h8500 | hppa | hppa1.[01] | hppa2.0 | hppa2.0[nw] | hppa64 \
+	| hexagon \
 	| i370 | i860 | i960 | ia64 \
 	| ip2k | iq2000 \
+	| k1om \
+	| le32 | le64 \
 	| lm32 \
 	| m32c | m32r | m32rle | m68000 | m68k | m88k \
-	| maxq | mb | microblaze | mcore | mep | metag \
+	| maxq | mb | microblaze | microblazeel | mcore | mep | metag \
 	| mips | mipsbe | mipseb | mipsel | mipsle \
 	| mips16 \
 	| mips64 | mips64el \
@@ -272,38 +283,55 @@
 	| mips64vr5900 | mips64vr5900el \
 	| mipsisa32 | mipsisa32el \
 	| mipsisa32r2 | mipsisa32r2el \
+	| mipsisa32r6 | mipsisa32r6el \
 	| mipsisa64 | mipsisa64el \
 	| mipsisa64r2 | mipsisa64r2el \
+	| mipsisa64r6 | mipsisa64r6el \
 	| mipsisa64sb1 | mipsisa64sb1el \
 	| mipsisa64sr71k | mipsisa64sr71kel \
+	| mipsr5900 | mipsr5900el \
 	| mipstx39 | mipstx39el \
 	| mn10200 | mn10300 \
 	| moxie \
 	| mt \
 	| msp430 \
-	| nios | nios2 \
+	| nds32 | nds32le | nds32be \
+	| nios | nios2 | nios2eb | nios2el \
 	| ns16k | ns32k \
-	| or32 \
+	| open8 | or1k | or1knd | or32 \
 	| pdp10 | pdp11 | pj | pjl \
-	| powerpc | powerpc64 | powerpc64le | powerpcle | ppcbe \
+	| powerpc | powerpc64 | powerpc64le | powerpcle \
 	| pyramid \
-	| rx \
+	| riscv32 | riscv64 \
+	| rl78 | rx \
 	| score \
-	| sh | sh[1234] | sh[24]a | sh[24]aeb | sh[23]e | sh[34]eb | sheb | shbe | shle | sh[1234]le | sh3ele \
+	| sh | sh[1234] | sh[24]a | sh[24]aeb | sh[23]e | sh[234]eb | sheb | shbe | shle | sh[1234]le | sh3ele \
 	| sh64 | sh64le \
 	| sparc | sparc64 | sparc64b | sparc64v | sparc86x | sparclet | sparclite \
 	| sparcv8 | sparcv9 | sparcv9b | sparcv9v \
-	| spu | strongarm \
-	| tahoe | thumb | tic4x | tic80 | tron \
+	| spu \
+	| tahoe | tic4x | tic54x | tic55x | tic6x | tic80 | tron \
 	| ubicom32 \
-	| v850 | v850e \
+	| v850 | v850e | v850e1 | v850e2 | v850es | v850e2v3 \
+	| visium \
 	| we32k \
-	| x86 | xc16x | xscale | xscalee[bl] | xstormy16 | xtensa \
+	| x86 | xc16x | xstormy16 | xtensa \
 	| z8k | z80)
 		basic_machine=$basic_machine-unknown
 		;;
-	m6811 | m68hc11 | m6812 | m68hc12 | picochip)
-		# Motorola 68HC11/12.
+	c54x)
+		basic_machine=tic54x-unknown
+		;;
+	c55x)
+		basic_machine=tic55x-unknown
+		;;
+	c6x)
+		basic_machine=tic6x-unknown
+		;;
+	leon|leon[3-9])
+		basic_machine=sparc-$basic_machine
+		;;
+	m6811 | m68hc11 | m6812 | m68hc12 | m68hcs12x | nvptx | picochip)
 		basic_machine=$basic_machine-unknown
 		os=-none
 		;;
@@ -313,6 +341,21 @@
 		basic_machine=mt-unknown
 		;;
 
+	strongarm | thumb | xscale)
+		basic_machine=arm-unknown
+		;;
+	xgate)
+		basic_machine=$basic_machine-unknown
+		os=-none
+		;;
+	xscaleeb)
+		basic_machine=armeb-unknown
+		;;
+
+	xscaleel)
+		basic_machine=armel-unknown
+		;;
+
 	# We use `pc' rather than `unknown'
 	# because (1) that's what they normally are, and
 	# (2) the word "unknown" tends to confuse beginning users.
@@ -327,25 +370,32 @@
 	# Recognize the basic CPU types with company name.
 	580-* \
 	| a29k-* \
+	| aarch64-* | aarch64_be-* \
 	| alpha-* | alphaev[4-8]-* | alphaev56-* | alphaev6[78]-* \
 	| alpha64-* | alpha64ev[4-8]-* | alpha64ev56-* | alpha64ev6[78]-* \
-	| alphapca5[67]-* | alpha64pca5[67]-* | arc-* \
+	| alphapca5[67]-* | alpha64pca5[67]-* | arc-* | arceb-* \
 	| arm-*  | armbe-* | armle-* | armeb-* | armv*-* \
 	| avr-* | avr32-* \
+	| ba-* \
+	| be32-* | be64-* \
 	| bfin-* | bs2000-* \
-	| c[123]* | c30-* | [cjt]90-* | c4x-* | c54x-* | c55x-* | c6x-* \
-	| clipper-* | craynv-* | cydra-* \
+	| c[123]* | c30-* | [cjt]90-* | c4x-* \
+	| c8051-* | clipper-* | craynv-* | cydra-* \
 	| d10v-* | d30v-* | dlx-* \
-	| elxsi-* \
+	| e2k-* | elxsi-* \
 	| f30[01]-* | f700-* | fido-* | fr30-* | frv-* | fx80-* \
 	| h8300-* | h8500-* \
 	| hppa-* | hppa1.[01]-* | hppa2.0-* | hppa2.0[nw]-* | hppa64-* \
+	| hexagon-* \
 	| i*86-* | i860-* | i960-* | ia64-* \
 	| ip2k-* | iq2000-* \
+	| k1om-* \
+	| le32-* | le64-* \
 	| lm32-* \
 	| m32c-* | m32r-* | m32rle-* \
 	| m68000-* | m680[012346]0-* | m68360-* | m683?2-* | m68k-* \
-	| m88110-* | m88k-* | maxq-* | mcore-* | metag-* | microblaze-* \
+	| m88110-* | m88k-* | maxq-* | mcore-* | metag-* \
+	| microblaze-* | microblazeel-* \
 	| mips-* | mipsbe-* | mipseb-* | mipsel-* | mipsle-* \
 	| mips16-* \
 	| mips64-* | mips64el-* \
@@ -359,33 +409,43 @@
 	| mips64vr5900-* | mips64vr5900el-* \
 	| mipsisa32-* | mipsisa32el-* \
 	| mipsisa32r2-* | mipsisa32r2el-* \
+	| mipsisa32r6-* | mipsisa32r6el-* \
 	| mipsisa64-* | mipsisa64el-* \
 	| mipsisa64r2-* | mipsisa64r2el-* \
+	| mipsisa64r6-* | mipsisa64r6el-* \
 	| mipsisa64sb1-* | mipsisa64sb1el-* \
 	| mipsisa64sr71k-* | mipsisa64sr71kel-* \
+	| mipsr5900-* | mipsr5900el-* \
 	| mipstx39-* | mipstx39el-* \
 	| mmix-* \
 	| mt-* \
 	| msp430-* \
-	| nios-* | nios2-* \
+	| nds32-* | nds32le-* | nds32be-* \
+	| nios-* | nios2-* | nios2eb-* | nios2el-* \
 	| none-* | np1-* | ns16k-* | ns32k-* \
+	| open8-* \
+	| or1k*-* \
 	| orion-* \
 	| pdp10-* | pdp11-* | pj-* | pjl-* | pn-* | power-* \
-	| powerpc-* | powerpc64-* | powerpc64le-* | powerpcle-* | ppcbe-* \
+	| powerpc-* | powerpc64-* | powerpc64le-* | powerpcle-* \
 	| pyramid-* \
-	| romp-* | rs6000-* | rx-* \
+	| riscv32-* | riscv64-* \
+	| rl78-* | romp-* | rs6000-* | rx-* \
 	| sh-* | sh[1234]-* | sh[24]a-* | sh[24]aeb-* | sh[23]e-* | sh[34]eb-* | sheb-* | shbe-* \
 	| shle-* | sh[1234]le-* | sh3ele-* | sh64-* | sh64le-* \
 	| sparc-* | sparc64-* | sparc64b-* | sparc64v-* | sparc86x-* | sparclet-* \
 	| sparclite-* \
-	| sparcv8-* | sparcv9-* | sparcv9b-* | sparcv9v-* | strongarm-* | sv1-* | sx?-* \
-	| tahoe-* | thumb-* \
-	| tic30-* | tic4x-* | tic54x-* | tic55x-* | tic6x-* | tic80-* | tile-* \
+	| sparcv8-* | sparcv9-* | sparcv9b-* | sparcv9v-* | sv1-* | sx*-* \
+	| tahoe-* \
+	| tic30-* | tic4x-* | tic54x-* | tic55x-* | tic6x-* | tic80-* \
+	| tile*-* \
 	| tron-* \
 	| ubicom32-* \
-	| v850-* | v850e-* | vax-* \
+	| v850-* | v850e-* | v850e1-* | v850es-* | v850e2-* | v850e2v3-* \
+	| vax-* \
+	| visium-* \
 	| we32k-* \
-	| x86-* | x86_64-* | xc16x-* | xps100-* | xscale-* | xscalee[bl]-* \
+	| x86-* | x86_64-* | xc16x-* | xps100-* \
 	| xstormy16-* | xtensa*-* \
 	| ymp-* \
 	| z8k-* | z80-*)
@@ -410,7 +470,7 @@
 		basic_machine=a29k-amd
 		os=-udi
 		;;
-    	abacus)
+	abacus)
 		basic_machine=abacus-unknown
 		;;
 	adobe68k)
@@ -460,6 +520,9 @@
 		basic_machine=i386-pc
 		os=-aros
 		;;
+	asmjs)
+		basic_machine=asmjs-unknown
+		;;
 	aux)
 		basic_machine=m68k-apple
 		os=-aux
@@ -480,11 +543,20 @@
 		basic_machine=powerpc-ibm
 		os=-cnk
 		;;
+	c54x-*)
+		basic_machine=tic54x-`echo $basic_machine | sed 's/^[^-]*-//'`
+		;;
+	c55x-*)
+		basic_machine=tic55x-`echo $basic_machine | sed 's/^[^-]*-//'`
+		;;
+	c6x-*)
+		basic_machine=tic6x-`echo $basic_machine | sed 's/^[^-]*-//'`
+		;;
 	c90)
 		basic_machine=c90-cray
 		os=-unicos
 		;;
-        cegcc)
+	cegcc)
 		basic_machine=arm-unknown
 		os=-cegcc
 		;;
@@ -516,7 +588,7 @@
 		basic_machine=craynv-cray
 		os=-unicosmp
 		;;
-	cr16)
+	cr16 | cr16-*)
 		basic_machine=cr16-unknown
 		os=-elf
 		;;
@@ -674,7 +746,6 @@
 	i370-ibm* | ibm*)
 		basic_machine=i370-ibm
 		;;
-# I'm not sure what "Sysv32" means.  Should this be sysv3.2?
 	i*86v32)
 		basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'`
 		os=-sysv32
@@ -713,6 +784,9 @@
 		basic_machine=m68k-isi
 		os=-sysv
 		;;
+	leon-*|leon[3-9]-*)
+		basic_machine=sparc-`echo $basic_machine | sed 's/-.*//'`
+		;;
 	m68knommu)
 		basic_machine=m68k-unknown
 		os=-linux
@@ -732,11 +806,15 @@
 		basic_machine=ns32k-utek
 		os=-sysv
 		;;
-        microblaze)
+	microblaze*)
 		basic_machine=microblaze-xilinx
 		;;
+	mingw64)
+		basic_machine=x86_64-pc
+		os=-mingw64
+		;;
 	mingw32)
-		basic_machine=i386-pc
+		basic_machine=i686-pc
 		os=-mingw32
 		;;
 	mingw32ce)
@@ -764,6 +842,10 @@
 		basic_machine=powerpc-unknown
 		os=-morphos
 		;;
+	moxiebox)
+		basic_machine=moxie-unknown
+		os=-moxiebox
+		;;
 	msdos)
 		basic_machine=i386-pc
 		os=-msdos
@@ -771,10 +853,18 @@
 	ms1-*)
 		basic_machine=`echo $basic_machine | sed -e 's/ms1-/mt-/'`
 		;;
+	msys)
+		basic_machine=i686-pc
+		os=-msys
+		;;
 	mvs)
 		basic_machine=i370-ibm
 		os=-mvs
 		;;
+	nacl)
+		basic_machine=le32-unknown
+		os=-nacl
+		;;
 	ncr3000)
 		basic_machine=i486-ncr
 		os=-sysv4
@@ -839,6 +929,12 @@
 	np1)
 		basic_machine=np1-gould
 		;;
+	neo-tandem)
+		basic_machine=neo-tandem
+		;;
+	nse-tandem)
+		basic_machine=nse-tandem
+		;;
 	nsr-tandem)
 		basic_machine=nsr-tandem
 		;;
@@ -921,9 +1017,10 @@
 		;;
 	power)	basic_machine=power-ibm
 		;;
-	ppc)	basic_machine=powerpc-unknown
+	ppc | ppcbe)	basic_machine=powerpc-unknown
 		;;
-	ppc-*)	basic_machine=powerpc-`echo $basic_machine | sed 's/^[^-]*-//'`
+	ppc-* | ppcbe-*)
+		basic_machine=powerpc-`echo $basic_machine | sed 's/^[^-]*-//'`
 		;;
 	ppcle | powerpclittle | ppc-le | powerpc-little)
 		basic_machine=powerpcle-unknown
@@ -948,7 +1045,11 @@
 		basic_machine=i586-unknown
 		os=-pw32
 		;;
-	rdos)
+	rdos | rdos64)
+		basic_machine=x86_64-pc
+		os=-rdos
+		;;
+	rdos32)
 		basic_machine=i386-pc
 		os=-rdos
 		;;
@@ -1017,6 +1118,9 @@
 		basic_machine=i860-stratus
 		os=-sysv4
 		;;
+	strongarm-* | thumb-*)
+		basic_machine=arm-`echo $basic_machine | sed 's/^[^-]*-//'`
+		;;
 	sun2)
 		basic_machine=m68000-sun
 		;;
@@ -1073,20 +1177,8 @@
 		basic_machine=t90-cray
 		os=-unicos
 		;;
-	tic54x | c54x*)
-		basic_machine=tic54x-unknown
-		os=-coff
-		;;
-	tic55x | c55x*)
-		basic_machine=tic55x-unknown
-		os=-coff
-		;;
-	tic6x | c6x*)
-		basic_machine=tic6x-unknown
-		os=-coff
-		;;
 	tile*)
-		basic_machine=tile-unknown
+		basic_machine=$basic_machine-unknown
 		os=-linux-gnu
 		;;
 	tx39)
@@ -1156,6 +1248,9 @@
 	xps | xps100)
 		basic_machine=xps100-honeywell
 		;;
+	xscale-* | xscalee[bl]-*)
+		basic_machine=`echo $basic_machine | sed 's/^xscale/arm/'`
+		;;
 	ymp)
 		basic_machine=ymp-cray
 		os=-unicos
@@ -1253,11 +1348,11 @@
 if [ x"$os" != x"" ]
 then
 case $os in
-        # First match some system type aliases
-        # that might get confused with valid system types.
+	# First match some system type aliases
+	# that might get confused with valid system types.
 	# -solaris* is a basic system type, with this one exception.
-        -auroraux)
-	        os=-auroraux
+	-auroraux)
+		os=-auroraux
 		;;
 	-solaris1 | -solaris1.*)
 		os=`echo $os | sed -e 's|solaris1|sunos4|'`
@@ -1281,28 +1376,30 @@
 	-gnu* | -bsd* | -mach* | -minix* | -genix* | -ultrix* | -irix* \
 	      | -*vms* | -sco* | -esix* | -isc* | -aix* | -cnk* | -sunos | -sunos[34]*\
 	      | -hpux* | -unos* | -osf* | -luna* | -dgux* | -auroraux* | -solaris* \
-	      | -sym* | -kopensolaris* \
+	      | -sym* | -kopensolaris* | -plan9* \
 	      | -amigaos* | -amigados* | -msdos* | -newsos* | -unicos* | -aof* \
-	      | -aos* | -aros* \
+	      | -aos* | -aros* | -cloudabi* | -sortix* \
 	      | -nindy* | -vxsim* | -vxworks* | -ebmon* | -hms* | -mvs* \
 	      | -clix* | -riscos* | -uniplus* | -iris* | -rtu* | -xenix* \
 	      | -hiux* | -386bsd* | -knetbsd* | -mirbsd* | -netbsd* \
-	      | -openbsd* | -solidbsd* \
+	      | -bitrig* | -openbsd* | -solidbsd* | -libertybsd* \
 	      | -ekkobsd* | -kfreebsd* | -freebsd* | -riscix* | -lynxos* \
 	      | -bosx* | -nextstep* | -cxux* | -aout* | -elf* | -oabi* \
 	      | -ptx* | -coff* | -ecoff* | -winnt* | -domain* | -vsta* \
 	      | -udi* | -eabi* | -lites* | -ieee* | -go32* | -aux* \
 	      | -chorusos* | -chorusrdb* | -cegcc* \
-	      | -cygwin* | -pe* | -psos* | -moss* | -proelf* | -rtems* \
-	      | -mingw32* | -linux-gnu* | -linux-newlib* | -linux-uclibc* \
-	      | -uxpv* | -beos* | -mpeix* | -udk* \
+	      | -cygwin* | -msys* | -pe* | -psos* | -moss* | -proelf* | -rtems* \
+	      | -mingw32* | -mingw64* | -linux-gnu* | -linux-android* \
+	      | -linux-newlib* | -linux-musl* | -linux-uclibc* \
+	      | -uxpv* | -beos* | -mpeix* | -udk* | -moxiebox* \
 	      | -interix* | -uwin* | -mks* | -rhapsody* | -darwin* | -opened* \
 	      | -openstep* | -oskit* | -conix* | -pw32* | -nonstopux* \
 	      | -storm-chaos* | -tops10* | -tenex* | -tops20* | -its* \
 	      | -os2* | -vos* | -palmos* | -uclinux* | -nucleus* \
 	      | -morphos* | -superux* | -rtmk* | -rtmk-nova* | -windiss* \
 	      | -powermax* | -dnix* | -nx6 | -nx7 | -sei* | -dragonfly* \
-	      | -skyos* | -haiku* | -rdos* | -toppers* | -drops* | -es*)
+	      | -skyos* | -haiku* | -rdos* | -toppers* | -drops* | -es* \
+	      | -onefs* | -tirtos*)
 	# Remember, each alternative MUST END IN *, to match a version number.
 		;;
 	-qnx*)
@@ -1341,7 +1438,7 @@
 	-opened*)
 		os=-openedition
 		;;
-        -os400*)
+	-os400*)
 		os=-os400
 		;;
 	-wince*)
@@ -1390,7 +1487,7 @@
 	-sinix*)
 		os=-sysv4
 		;;
-        -tpf*)
+	-tpf*)
 		os=-tpf
 		;;
 	-triton*)
@@ -1426,15 +1523,16 @@
 	-aros*)
 		os=-aros
 		;;
-	-kaos*)
-		os=-kaos
-		;;
 	-zvmoe)
 		os=-zvmoe
 		;;
 	-dicos*)
 		os=-dicos
 		;;
+	-nacl*)
+		;;
+	-ios)
+		;;
 	-none)
 		;;
 	*)
@@ -1457,10 +1555,10 @@
 # system, and we'll never get to this point.
 
 case $basic_machine in
-        score-*)
+	score-*)
 		os=-elf
 		;;
-        spu-*)
+	spu-*)
 		os=-elf
 		;;
 	*-acorn)
@@ -1472,8 +1570,23 @@
 	arm*-semi)
 		os=-aout
 		;;
-        c4x-* | tic4x-*)
-        	os=-coff
+	c4x-* | tic4x-*)
+		os=-coff
+		;;
+	c8051-*)
+		os=-elf
+		;;
+	hexagon-*)
+		os=-elf
+		;;
+	tic54x-*)
+		os=-coff
+		;;
+	tic55x-*)
+		os=-coff
+		;;
+	tic6x-*)
+		os=-coff
 		;;
 	# This must come before the *-dec entry.
 	pdp10-*)
@@ -1493,14 +1606,11 @@
 		;;
 	m68000-sun)
 		os=-sunos3
-		# This also exists in the configure program, but was not the
-		# default.
-		# os=-sunos4
 		;;
 	m68*-cisco)
 		os=-aout
 		;;
-        mep-*)
+	mep-*)
 		os=-elf
 		;;
 	mips*-cisco)
@@ -1527,7 +1637,7 @@
 	*-ibm)
 		os=-aix
 		;;
-    	*-knuth)
+	*-knuth)
 		os=-mmixware
 		;;
 	*-wec)
patches/ruby/1.9.3/p429/bsd-shell-fix.patch000066400000000600147511530510014004 0ustar00--- a/Makefile.in
+++ b/Makefile.in
@@ -169,7 +169,6 @@
 		@$(RM) $@
 		$(ECHO) linking $@
 		$(Q) $(PURIFY) $(CC) $(LDFLAGS) $(XLDFLAGS) $(MAINOBJ) $(EXTOBJS) $(LIBRUBYARG) $(MAINLIBS) $(LIBS) $(OUTFLAG)$@
-		$(Q) $(POSTLINK)
 
 # We must `rm' the library each time this rule is invoked because "updating" a
 # MAB library on Apple/NeXT (see --enable-fat-binary in configure) is not
patches/ruby/1.9.3/p0/debug.diff000066400000000734147511530510012073 0ustar00diff --git a/configure.in b/configure.in
index 5bc2e4e..52a5d19 100644
--- a/configure.in
+++ b/configure.in
@@ -493,7 +493,6 @@ if test "$GCC" = ""; then
     AS_CASE(["$target_os"],[aix*],[warnflags="-qinfo=por"])
 fi
 if test "$GCC" = yes; then
-    RUBY_TRY_CFLAGS(-fvisibility=hidden, [RUBY_APPEND_OPTION(XCFLAGS, -fvisibility=hidden)])
     AC_SUBST(WERRORFLAG, "-Werror")
     if test "$visibility_option" = yes; then
 	RUBY_APPEND_OPTION(XCFLAGS, -fvisibility=hidden)
patches/ruby/1.9.3/p0/falcon.patch000066400000166726147511530510012454 0ustar00diff --git a/common.mk b/common.mk
index ea244cc..4f22609 100644
--- a/common.mk
+++ b/common.mk
@@ -629,7 +629,8 @@ file.$(OBJEXT): {$(VPATH)}file.c $(RUBY_H_INCLUDES) {$(VPATH)}io.h \
 gc.$(OBJEXT): {$(VPATH)}gc.c $(RUBY_H_INCLUDES) {$(VPATH)}re.h \
   {$(VPATH)}regex.h $(ENCODING_H_INCLUDES) $(VM_CORE_H_INCLUDES) \
   {$(VPATH)}gc.h {$(VPATH)}io.h {$(VPATH)}eval_intern.h {$(VPATH)}util.h \
-  {$(VPATH)}debug.h {$(VPATH)}internal.h {$(VPATH)}constant.h
+  {$(VPATH)}debug.h {$(VPATH)}internal.h {$(VPATH)}constant.h \
+  {$(VPATH)}pool_alloc.inc.h {$(VPATH)}pool_alloc.h
 hash.$(OBJEXT): {$(VPATH)}hash.c $(RUBY_H_INCLUDES) {$(VPATH)}util.h \
   $(ENCODING_H_INCLUDES)
 inits.$(OBJEXT): {$(VPATH)}inits.c $(RUBY_H_INCLUDES) \
@@ -692,7 +693,7 @@ signal.$(OBJEXT): {$(VPATH)}signal.c $(RUBY_H_INCLUDES) \
   $(VM_CORE_H_INCLUDES) {$(VPATH)}debug.h
 sprintf.$(OBJEXT): {$(VPATH)}sprintf.c $(RUBY_H_INCLUDES) {$(VPATH)}re.h \
   {$(VPATH)}regex.h {$(VPATH)}vsnprintf.c $(ENCODING_H_INCLUDES)
-st.$(OBJEXT): {$(VPATH)}st.c $(RUBY_H_INCLUDES)
+st.$(OBJEXT): {$(VPATH)}st.c $(RUBY_H_INCLUDES) {$(VPATH)}pool_alloc.h
 strftime.$(OBJEXT): {$(VPATH)}strftime.c $(RUBY_H_INCLUDES) \
   {$(VPATH)}timev.h
 string.$(OBJEXT): {$(VPATH)}string.c $(RUBY_H_INCLUDES) {$(VPATH)}re.h \
diff --git a/configure.in b/configure.in
index 5bc2e4e..b3e60fd 100644
--- a/configure.in
+++ b/configure.in
@@ -1406,7 +1406,8 @@ AC_CHECK_FUNCS(fmod killpg wait4 waitpid fork spawnv syscall __syscall chroot ge
 	      setsid telldir seekdir fchmod cosh sinh tanh log2 round\
 	      setuid setgid daemon select_large_fdset setenv unsetenv\
               mktime timegm gmtime_r clock_gettime gettimeofday poll ppoll\
-              pread sendfile shutdown sigaltstack dl_iterate_phdr)
+              pread sendfile shutdown sigaltstack dl_iterate_phdr \
+	      posix_memalign memalign)
 
 AC_CACHE_CHECK(for unsetenv returns a value, rb_cv_unsetenv_return_value,
   [AC_TRY_COMPILE([
diff --git a/gc.c b/gc.c
index 3238d65..fb8ac5f 100644
--- a/gc.c
+++ b/gc.c
@@ -20,6 +20,7 @@
 #include "vm_core.h"
 #include "internal.h"
 #include "gc.h"
+#include "pool_alloc.h"
 #include "constant.h"
 #include <stdio.h>
 #include <setjmp.h>
@@ -35,6 +36,11 @@
 
 #if defined _WIN32 || defined __CYGWIN__
 #include <windows.h>
+#elif defined POOL_ALLOC_API
+#if   defined(HAVE_POSIX_MEMALIGN)
+#elif defined(HAVE_MEMALIGN)
+#include <malloc.h>
+#endif
 #endif
 
 #ifdef HAVE_VALGRIND_MEMCHECK_H
@@ -311,6 +317,24 @@ struct gc_list {
 
 #define CALC_EXACT_MALLOC_SIZE 0
 
+#ifdef POOL_ALLOC_API
+/* POOL ALLOC API */
+#define POOL_ALLOC_PART 1
+#include "pool_alloc.inc.h"
+#undef POOL_ALLOC_PART
+
+typedef struct pool_layout_t pool_layout_t;
+struct pool_layout_t {
+    pool_header
+      p6,  /* st_table && st_table_entry */
+      p11;  /* st_table.bins init size */
+} pool_layout = {
+    INIT_POOL(void*[6]),
+    INIT_POOL(void*[11])
+};
+static void pool_finalize_header(pool_header *header);
+#endif
+
 typedef struct rb_objspace {
     struct {
 	size_t limit;
@@ -320,6 +344,9 @@ typedef struct rb_objspace {
 	size_t allocations;
 #endif
     } malloc_params;
+#ifdef POOL_ALLOC_API
+    pool_layout_t *pool_headers;
+#endif
     struct {
 	size_t increment;
 	struct heaps_slot *ptr;
@@ -367,7 +394,11 @@ typedef struct rb_objspace {
 static int ruby_initial_gc_stress = 0;
 int *ruby_initial_gc_stress_ptr = &ruby_initial_gc_stress;
 #else
+#  ifdef POOL_ALLOC_API
+static rb_objspace_t rb_objspace = {{GC_MALLOC_LIMIT}, &pool_layout, {HEAP_MIN_SLOTS}};
+#  else
 static rb_objspace_t rb_objspace = {{GC_MALLOC_LIMIT}, {HEAP_MIN_SLOTS}};
+#  endif
 int *ruby_initial_gc_stress_ptr = &rb_objspace.gc_stress;
 #endif
 #define malloc_limit		objspace->malloc_params.limit
@@ -400,6 +431,10 @@ rb_objspace_alloc(void)
     memset(objspace, 0, sizeof(*objspace));
     malloc_limit = initial_malloc_limit;
     ruby_gc_stress = ruby_initial_gc_stress;
+#ifdef POOL_ALLOC_API
+    objspace->pool_headers = (pool_layout_t*) malloc(sizeof(pool_layout));
+    memcpy(objspace->pool_headers, &pool_layout, sizeof(pool_layout));
+#endif
 
     return objspace;
 }
@@ -477,6 +512,13 @@ rb_objspace_free(rb_objspace_t *objspace)
 	heaps_used = 0;
 	heaps = 0;
     }
+#ifdef POOL_ALLOC_API
+    if (objspace->pool_headers) {
+        pool_finalize_header(&objspace->pool_headers->p6);
+        pool_finalize_header(&objspace->pool_headers->p11);
+        free(objspace->pool_headers);
+    }
+#endif
     free(objspace);
 }
 #else
@@ -885,6 +927,27 @@ ruby_xfree(void *x)
 	vm_xfree(&rb_objspace, x);
 }
 
+#ifdef POOL_ALLOC_API
+/* POOL ALLOC API */
+#define POOL_ALLOC_PART 2
+#include "pool_alloc.inc.h"
+#undef POOL_ALLOC_PART
+
+void
+ruby_xpool_free(void *ptr)
+{
+    pool_free_entry((void**)ptr);
+}
+
+#define CONCRET_POOL_MALLOC(pnts) \
+void * ruby_xpool_malloc_##pnts##p () { \
+    return pool_alloc_entry(&rb_objspace.pool_headers->p##pnts ); \
+}
+CONCRET_POOL_MALLOC(6)
+CONCRET_POOL_MALLOC(11)
+#undef CONCRET_POOL_MALLOC
+
+#endif
 
 /*
  *  call-seq:
diff --git a/internal.h b/internal.h
index 172e7f4..11e4d30 100644
--- a/internal.h
+++ b/internal.h
@@ -108,6 +108,8 @@ VALUE rb_iseq_clone(VALUE iseqval, VALUE newcbase);
 
 /* load.c */
 VALUE rb_get_load_path(void);
+void rb_reset_expanded_cache();
+void rb_load_path_ary_push(VALUE path);
 
 /* math.c */
 VALUE rb_math_atan2(VALUE, VALUE);
diff --git a/load.c b/load.c
index 0ff4b60..5d10cc2 100644
--- a/load.c
+++ b/load.c
@@ -4,6 +4,7 @@
 
 #include "ruby/ruby.h"
 #include "ruby/util.h"
+#include "ruby/encoding.h"
 #include "internal.h"
 #include "dln.h"
 #include "eval_intern.h"
@@ -18,6 +19,7 @@ VALUE ruby_dln_librefs;
 #define IS_DLEXT(e) (strcmp((e), DLEXT) == 0)
 #endif
 
+static int sorted_loaded_features = 1;
 
 static const char *const loadable_ext[] = {
     ".rb", DLEXT,
@@ -27,28 +29,44 @@ static const char *const loadable_ext[] = {
     0
 };
 
-VALUE
-rb_get_load_path(void)
-{
-    VALUE load_path = GET_VM()->load_path;
-    return load_path;
-}
+static VALUE rb_checked_expanded_cache(int*);
+static void rb_set_expanded_cache(VALUE, int);
+static VALUE rb_expand_load_paths(long, VALUE*, int*);
+static int cached_expanded_load_path = 1;
 
 VALUE
 rb_get_expanded_load_path(void)
 {
-    VALUE load_path = rb_get_load_path();
-    VALUE ary;
-    long i;
+    VALUE expanded = rb_checked_expanded_cache(NULL);
 
-    ary = rb_ary_new2(RARRAY_LEN(load_path));
-    for (i = 0; i < RARRAY_LEN(load_path); ++i) {
-	VALUE path = rb_file_expand_path(RARRAY_PTR(load_path)[i], Qnil);
-	rb_str_freeze(path);
-	rb_ary_push(ary, path);
+    if ( !RTEST(expanded) ) {
+	VALUE load_path = GET_VM()->load_path;
+	int has_relative = 0;
+
+	if (!load_path) return 0;
+
+	expanded = rb_expand_load_paths(
+			RARRAY_LEN(load_path), RARRAY_PTR(load_path),
+			&has_relative);
+	RB_GC_GUARD(load_path);
+
+	if (cached_expanded_load_path) {
+	    rb_set_expanded_cache(expanded, has_relative);
+	}
+    } else {
+	expanded = rb_ary_dup(expanded);
     }
-    rb_obj_freeze(ary);
-    return ary;
+    return expanded;
+}
+
+VALUE
+rb_get_load_path(void)
+{
+    VALUE load_path =
+	cached_expanded_load_path ?
+	    rb_get_expanded_load_path():
+	    GET_VM()->load_path;
+    return load_path;
 }
 
 static VALUE
@@ -129,6 +147,9 @@ loaded_feature_path_i(st_data_t v, st_data_t b, st_data_t f)
     return ST_STOP;
 }
 
+static long rb_feature_first_equal_or_greater(VALUE, const char *, long);
+static int  rb_stop_search_feature(VALUE, const char *, long);
+
 static int
 rb_feature_p(const char *feature, const char *ext, int rb, int expanded, const char **fn)
 {
@@ -151,8 +172,10 @@ rb_feature_p(const char *feature, const char *ext, int rb, int expanded, const c
 	type = 0;
     }
     features = get_loaded_features();
-    for (i = 0; i < RARRAY_LEN(features); ++i) {
+    i = rb_feature_first_equal_or_greater(features, feature, len);
+    for (; i < RARRAY_LEN(features); ++i) {
 	v = RARRAY_PTR(features)[i];
+	if (rb_stop_search_feature(v, feature, len)) break;
 	f = StringValuePtr(v);
 	if ((n = RSTRING_LEN(v)) < len) continue;
 	if (strncmp(f, feature, len) != 0) {
@@ -176,14 +199,14 @@ rb_feature_p(const char *feature, const char *ext, int rb, int expanded, const c
 	}
     }
     loading_tbl = get_loading_table();
-    if (loading_tbl) {
+    if (loading_tbl && loading_tbl->num_entries > 0) {
 	f = 0;
 	if (!expanded) {
 	    struct loaded_feature_searching fs;
 	    fs.name = feature;
 	    fs.len = len;
 	    fs.type = type;
-	    fs.load_path = load_path ? load_path : rb_get_load_path();
+	    fs.load_path = load_path ? load_path : rb_get_expanded_load_path();
 	    fs.result = 0;
 	    st_foreach(loading_tbl, loaded_feature_path_i, (st_data_t)&fs);
 	    if ((f = fs.result) != 0) {
@@ -251,6 +274,170 @@ rb_feature_provided(const char *feature, const char **loading)
     return FALSE;
 }
 
+static long
+feature_basename_length(const char *feature, long flen)
+{
+    if (sorted_loaded_features) {
+	const char *ext = strrchr(feature, '.');
+	return ext && !strchr(ext, '/') ? ext - feature : flen;
+    } else {
+	return 0;
+    }
+}
+
+static int
+compare_feature_name(const char *left, long llen, const char *right, long rlen)
+{
+    int diff = 0;
+    while (llen-- && rlen--) {
+	diff = left[llen] - right[rlen];
+	if (diff) break;
+	if (left[llen] == '/') break;
+    }
+    return diff;
+}
+
+static int
+rb_compare_feature_name(VALUE loaded, const char *feature, long flen)
+{
+    const char *loaded_name = StringValuePtr(loaded);
+    long loaded_len = feature_basename_length(loaded_name, RSTRING_LEN(loaded));
+    return compare_feature_name(loaded_name, loaded_len, feature, flen);
+}
+
+/* used to find when equal features run out */
+static int
+rb_stop_search_feature(VALUE loaded, const char *feature, long flen)
+{
+    if (sorted_loaded_features)
+	return rb_compare_feature_name(loaded, feature, flen) > 0;
+    else
+	return FALSE;
+}
+
+/* returns first position to search feature from */
+static long
+rb_feature_first_equal_or_greater(VALUE features, const char *feature, long flen)
+{
+    if (sorted_loaded_features) {
+	long before = 0, first = RARRAY_LEN(features);
+	VALUE *values = RARRAY_PTR(features);
+	if (first == 0)
+	    return 0;
+	if (rb_compare_feature_name(values[0], feature, flen) >= 0)
+	    return 0;
+
+	while (first - before > 1) {
+	    long mid = (first + before) / 2;
+	    long cmp = rb_compare_feature_name(values[mid], feature, flen);
+	    if (cmp >= 0)
+		first = mid;
+	    else
+		before = mid;
+	}
+	return first;
+    } else {
+	return 0;
+    }
+}
+
+/* returns position to insert new feature in */
+static long
+rb_feature_first_greater(VALUE features, const char *feature, long flen)
+{
+    if (sorted_loaded_features) {
+	long before = 0, first = RARRAY_LEN(features);
+	VALUE *values = RARRAY_PTR(features);
+	if (first == 0)
+	    return 0;
+	if (rb_compare_feature_name(values[0], feature, flen) > 0)
+	    return 0;
+	if (rb_compare_feature_name(values[first-1], feature, flen) <= 0)
+	    return first;
+
+	while (first - before > 1) {
+	    long mid = (first + before) / 2;
+	    long cmp = rb_compare_feature_name(values[mid], feature, flen);
+	    if (cmp > 0)
+		first = mid;
+	    else
+		before = mid;
+	}
+	return first;
+    } else {
+	return RARRAY_LEN(features);
+    }
+}
+
+
+static VALUE
+rb_push_feature_1(VALUE features, VALUE feature)
+{
+    const char *fname = StringValuePtr(feature);
+    long flen = feature_basename_length(fname, RSTRING_LEN(feature));
+    long i = rb_feature_first_greater(features, fname, flen);
+    rb_ary_push(features, feature);
+    if ( i < RARRAY_LEN(features) - 1 ) {
+	MEMMOVE(RARRAY_PTR(features) + i + 1, RARRAY_PTR(features) + i,
+		VALUE, RARRAY_LEN(features) - i - 1);
+	RARRAY_PTR(features)[i] = feature;
+    }
+    return features;
+}
+
+static VALUE
+rb_push_feature_m(long argc, VALUE *argv, VALUE features)
+{
+    while (argc--) {
+	rb_push_feature_1(features, *argv++);
+    }
+    return features;
+}
+
+static VALUE
+rb_concat_features(VALUE features, VALUE add)
+{
+    add = rb_convert_type(add, T_ARRAY, "Array", "to_ary");
+    if (RARRAY_LEN(add)) {
+	rb_push_feature_m(RARRAY_LEN(add), RARRAY_PTR(add), features);
+    }
+    return features;
+}
+static const char *load_features_undefined_methods[] = {
+    "[]=", "reverse!", "rotate!", "sort!", "sort_by!",
+    "collect!", "map!", "shuffle!", "fill", "insert",
+    NULL
+};
+
+static VALUE
+rb_loaded_features_init(void)
+{
+    char *sorted_flag;
+    const char **name;
+    VALUE loaded_features = rb_ary_new();
+    VALUE loaded_features_c = rb_singleton_class(loaded_features);
+
+    sorted_flag = getenv("RUBY_LOADED_FEATURES_SORTED");
+    if (sorted_flag != NULL) {
+	int sorted_set = atoi(sorted_flag);
+	if (RTEST(ruby_verbose))
+	    fprintf(stderr, "sorted_loaded_features=%d (%d)\n", sorted_set, sorted_loaded_features);
+	sorted_loaded_features = sorted_set;
+    }
+
+    for(name = load_features_undefined_methods; *name; name++) {
+	rb_undef_method(loaded_features_c, *name);
+    }
+
+    if (sorted_loaded_features) {
+	rb_define_method(loaded_features_c, "<<", rb_push_feature_1, 1);
+	rb_define_method(loaded_features_c, "push", rb_push_feature_m, -1);
+	rb_define_method(loaded_features_c, "concat", rb_concat_features, 1);
+	rb_define_method(loaded_features_c, "unshift", rb_push_feature_m, -1);
+    }
+    return loaded_features;
+}
+
 static void
 rb_provide_feature(VALUE feature)
 {
@@ -258,7 +445,10 @@ rb_provide_feature(VALUE feature)
 	rb_raise(rb_eRuntimeError,
 		 "$LOADED_FEATURES is frozen; cannot append feature");
     }
-    rb_ary_push(get_loaded_features(), feature);
+    if (sorted_loaded_features)
+	rb_push_feature_1(get_loaded_features(), feature);
+    else
+	rb_ary_push(get_loaded_features(), feature);
 }
 
 void
@@ -760,6 +950,226 @@ rb_f_autoload_p(VALUE obj, VALUE sym)
     return rb_mod_autoload_p(klass, sym);
 }
 
+/* $LOAD_PATH methods which invalidates cache */
+static const char *load_path_reset_cache_methods[] = {
+    "[]=", "collect!", "compact!", "delete",
+    "delete_if", "fill", "flatten!", "insert", "keep_if",
+    "map!", "reject!", "replace", "select!", "shuffle!",
+    "sort!", "sort_by!", "uniq!", NULL
+};
+
+/* $LOAD_PATH methods which sends also to cache */
+static const char *load_path_apply_to_cache_methods[] = {
+    "clear", "delete_at", "pop", "reverse!", "rotate!",
+    "shift", "slice!", NULL
+};
+
+/* $LOAD_PATH methods which sends to cache whith expanded arguments */
+static const char *load_path_apply_expanded_methods[] = {
+    "<<", "push", "unshift", NULL
+};
+
+void
+rb_reset_expanded_cache()
+{
+    GET_VM()->load_path_expanded_cache = 0;
+}
+
+static VALUE
+rb_load_path_expanded_cache()
+{
+    VALUE cache = GET_VM()->load_path_expanded_cache;
+    VALUE expanded = Qnil;
+    if (RTEST(cache)) {
+	expanded = RARRAY_PTR(cache)[2];
+    }
+    return expanded;
+}
+
+/* Return cache only if we still in the same working directory
+ * and filesystem_encoding didn't change
+ * Invalidate cache otherwise
+ */
+static VALUE
+rb_checked_expanded_cache(int *has_relative)
+{
+    VALUE cache = GET_VM()->load_path_expanded_cache;
+    VALUE expanded = Qnil;
+    if (RTEST(cache)) {
+	VALUE curwd = RARRAY_PTR(cache)[0];
+	VALUE encindex = RARRAY_PTR(cache)[1];
+	int cache_valid = rb_filesystem_encindex() == FIX2INT(encindex);
+
+	if ( cache_valid ) {
+	    cache_valid = curwd == Qtrue;
+	    if (has_relative) {
+		*has_relative = cache_valid;
+	    }
+	    if (!cache_valid ) {
+		char *cwd = my_getcwd();
+		cache_valid = !strcmp(RSTRING_PTR(curwd), cwd);
+		xfree(cwd);
+	    }
+	}
+
+	if ( !cache_valid ) {
+	    rb_reset_expanded_cache();
+	} else {
+	    expanded = RARRAY_PTR(cache)[2];
+	}
+    }
+    RB_GC_GUARD(cache);
+    return expanded;
+}
+
+static void
+rb_set_expanded_cache(VALUE expanded, int has_relative)
+{
+    VALUE cache = rb_ary_new2(3);
+
+    if (has_relative) {
+	char *cwd = my_getcwd();
+	rb_ary_push(cache, rb_str_new_cstr(cwd));
+	xfree(cwd);
+    } else {
+	rb_ary_push(cache, Qtrue);
+    }
+
+    rb_ary_push(cache, INT2FIX(rb_filesystem_encindex()));
+    rb_ary_push(cache, rb_ary_dup(expanded));
+    GET_VM()->load_path_expanded_cache = cache;
+}
+
+static VALUE
+rb_expand_load_paths(long pathc, VALUE* paths, int *has_relative)
+{
+    long i;
+    const char *p;
+    VALUE path, expanded = rb_ary_new2(pathc);
+
+    for(i = 0; i < pathc; i++) {
+	path = rb_get_path(paths[i]);
+	p = RSTRING_PTR(path);
+	*has_relative = *has_relative || !rb_is_absolute_path(p);
+	path = rb_file_expand_path(path, Qnil);
+	rb_str_freeze(path);
+	rb_ary_push(expanded, path);
+    }
+
+    return expanded;
+}
+
+/* Invalidating $LOAD_PATH methods implementation */
+static VALUE
+rb_load_path_reset_cache_method(int argc, VALUE *argv, VALUE self)
+{
+    rb_reset_expanded_cache();
+    return rb_call_super(argc, argv);
+}
+
+/* Proxying $LOAD_PATH methods implementation */
+static VALUE
+rb_load_path_apply_to_cache_method(int argc, VALUE *argv, VALUE self)
+{
+    VALUE load_path_expanded = rb_load_path_expanded_cache();
+    if (RTEST(load_path_expanded)) {
+	ID func = rb_frame_this_func();
+	rb_funcall2(load_path_expanded, func, argc, argv);
+    }
+    return rb_call_super(argc, argv);
+}
+
+/* Proxying with expansion $LOAD_PATH methods implementation */
+static VALUE
+rb_load_path_apply_expanded_method(int argc, VALUE *argv, VALUE self)
+{
+    int old_has_relative = 0;
+    /* We call methods on cache only if we still in the same working directory */
+    VALUE load_path_expanded = rb_checked_expanded_cache(&old_has_relative);
+    if (RTEST(load_path_expanded)) {
+	int has_relative = 0;
+	ID func = rb_frame_this_func();
+	VALUE expanded = rb_expand_load_paths(argc, argv, &has_relative);
+
+	rb_funcall2(load_path_expanded, func, argc, RARRAY_PTR(expanded));
+
+	if (!old_has_relative && has_relative) {
+	    rb_set_expanded_cache(load_path_expanded, has_relative);
+	}
+	RB_GC_GUARD(expanded);
+    }
+    return rb_call_super(argc, argv);
+}
+/* $LOAD_PATH.concat(ary) - special, we call push(*ary) instead
+ * cause I'm lazy a bit and wish not to rewrite method above second time :)
+ */
+static VALUE
+rb_load_path_concat(VALUE self, VALUE ary)
+{
+    ID push;
+    CONST_ID(push, "push");
+    RB_GC_GUARD(ary);
+    return rb_funcall2(self, push, (int)RARRAY_LEN(ary), RARRAY_PTR(ary));
+}
+
+void
+rb_load_path_ary_push(VALUE path)
+{
+    int old_has_relative = 0;
+    VALUE load_path_expanded = rb_checked_expanded_cache(&old_has_relative);
+    if (RTEST(load_path_expanded)) {
+	int has_relative = 0;
+	VALUE expanded = rb_expand_load_paths(1, &path, &has_relative);
+
+	rb_ary_push(load_path_expanded, RARRAY_PTR(expanded)[0]);
+
+	if (!old_has_relative && has_relative) {
+	    rb_set_expanded_cache(load_path_expanded, has_relative);
+	}
+	RB_GC_GUARD(expanded);
+    }
+
+    rb_ary_push(GET_VM()->load_path, path);
+}
+
+static VALUE
+rb_load_path_init(void)
+{
+    const char **name;
+    VALUE load_path = rb_ary_new();
+    char *cached_flag;
+
+    cached_flag = getenv("RUBY_CACHED_LOAD_PATH");
+    if (cached_flag != NULL) {
+	cached_expanded_load_path = atoi(cached_flag);
+    }
+
+    /* Do all the magick if user did not disable it
+     * with RUBY_CACHED_LOAD_PATH=0 environment variable
+     */
+    if (cached_expanded_load_path) {
+	VALUE load_path_c = rb_singleton_class(load_path);
+
+	for(name = load_path_reset_cache_methods; *name; name++ ) {
+	    rb_define_method(load_path_c, *name, rb_load_path_reset_cache_method, -1);
+	}
+
+	for(name = load_path_apply_to_cache_methods; *name; name++ ) {
+	    rb_define_method(load_path_c, *name, rb_load_path_apply_to_cache_method, -1);
+	}
+
+	for(name = load_path_apply_expanded_methods; *name; name++ ) {
+	    rb_define_method(load_path_c, *name, rb_load_path_apply_expanded_method, -1);
+	}
+
+	rb_define_method(load_path_c, "concat", rb_load_path_concat, 1);
+    }
+
+    rb_reset_expanded_cache();
+
+    return load_path;
+}
+
 void
 Init_load()
 {
@@ -772,11 +1182,11 @@ Init_load()
     rb_define_hooked_variable(var_load_path, (VALUE*)vm, load_path_getter, rb_gvar_readonly_setter);
     rb_alias_variable(rb_intern("$-I"), id_load_path);
     rb_alias_variable(rb_intern("$LOAD_PATH"), id_load_path);
-    vm->load_path = rb_ary_new();
+    vm->load_path = rb_load_path_init();
 
     rb_define_virtual_variable("$\"", get_loaded_features, 0);
     rb_define_virtual_variable("$LOADED_FEATURES", get_loaded_features, 0);
-    vm->loaded_features = rb_ary_new();
+    vm->loaded_features = rb_loaded_features_init();
 
     rb_define_global_function("load", rb_f_load, -1);
     rb_define_global_function("require", rb_f_require, 1);
diff --git a/pool_alloc.h b/pool_alloc.h
new file mode 100644
index 0000000..957708e
--- /dev/null
+++ b/pool_alloc.h
@@ -0,0 +1,11 @@
+#ifndef POOL_ALLOC_H
+#define POOL_ALLOC_H
+
+#define POOL_ALLOC_API
+#ifdef POOL_ALLOC_API
+void  ruby_xpool_free(void *ptr);
+void *ruby_xpool_malloc_6p();
+void *ruby_xpool_malloc_11p();
+#endif
+
+#endif
diff --git a/pool_alloc.inc.h b/pool_alloc.inc.h
new file mode 100644
index 0000000..5b735be
--- /dev/null
+++ b/pool_alloc.inc.h
@@ -0,0 +1,187 @@
+/*
+ * this is generic pool allocator
+ * you should define following macroses:
+ * ITEM_NAME - unique identifier, which allows to hold functions in a namespace
+ * ITEM_TYPEDEF(name) - passed to typedef to localize item type
+ * free_entry - desired name of function for free entry
+ * alloc_entry - defired name of function for allocate entry
+ */
+
+#if POOL_ALLOC_PART == 1
+#define DEFAULT_POOL_SIZE 8192
+typedef unsigned int pool_holder_counter;
+
+typedef struct pool_entry_list pool_entry_list;
+typedef struct pool_holder pool_holder;
+
+typedef struct pool_header {
+    pool_holder         *first;
+    pool_holder         *_black_magick;
+    pool_holder_counter  size; // size of entry in sizeof(void*) items
+    pool_holder_counter  total; // size of entry in sizeof(void*) items
+} pool_header;
+
+struct pool_holder {
+    pool_holder_counter free, total;
+    pool_header  *header;
+    void               *freep;
+    pool_holder        *fore, *back;
+    void *data[1];
+};
+#define POOL_DATA_SIZE(pool_size) (((pool_size) - sizeof(void*) * 6 - offsetof(pool_holder, data)) / sizeof(void*))
+#define POOL_ENTRY_SIZE(item_type) ((sizeof(item_type) - 1) / sizeof(void*) + 1)
+#define POOL_HOLDER_COUNT(pool_size, item_type) (POOL_DATA_SIZE(pool_size)/POOL_ENTRY_SIZE(item_type))
+#define INIT_POOL(item_type) {NULL, NULL, POOL_ENTRY_SIZE(item_type), POOL_HOLDER_COUNT(DEFAULT_POOL_SIZE, item_type)}
+
+#elif POOL_ALLOC_PART == 2
+static void *
+aligned_malloc(size_t alignment, size_t size)
+{
+    void *res;
+
+#if __MINGW32__
+    res = __mingw_aligned_malloc(size, alignment);
+#elif _WIN32 || defined __CYGWIN__
+    res = _aligned_malloc(size, alignment);
+#elif defined(HAVE_POSIX_MEMALIGN)
+    if (posix_memalign(&res, alignment, size) == 0) {
+        return res;
+    } else {
+        return NULL;
+    }
+#elif defined(HAVE_MEMALIGN)
+    res = memalign(alignment, size);
+#else
+#error no memalign function
+#endif
+    return res;
+}
+
+static void
+aligned_free(void *ptr)
+{
+#if __MINGW32__
+    __mingw_aligned_free(ptr);
+#elif _WIN32 || defined __CYGWIN__
+    _aligned_free(ptr);
+#else
+    free(ptr);
+#endif
+}
+
+static pool_holder *
+pool_holder_alloc(pool_header *header)
+{
+    pool_holder *holder;
+    pool_holder_counter i, size, count;
+    register void **ptr;
+
+    size_t sz = offsetof(pool_holder, data) +
+	    header->size * header->total * sizeof(void*);
+#define objspace (&rb_objspace)
+    vm_malloc_prepare(objspace, DEFAULT_POOL_SIZE);
+    if (header->first != NULL) return header->first;
+    TRY_WITH_GC(holder = (pool_holder*) aligned_malloc(DEFAULT_POOL_SIZE, sz));
+    malloc_increase += DEFAULT_POOL_SIZE;
+#if CALC_EXACT_MALLOC_SIZE
+    objspace->malloc_params.allocated_size += DEFAULT_POOL_SIZE;
+    objspace->malloc_params.allocations++;
+#endif
+#undef objspace
+
+    size = header->size;
+    count = header->total;
+    holder->free = count;
+    holder->total = count;
+    holder->header = header;
+    holder->fore = NULL;
+    holder->back = NULL;
+    holder->freep = &holder->data;
+    ptr = holder->data;
+    for(i = count - 1; i; i-- ) {
+	ptr = *ptr = ptr + size;
+    }
+    *ptr = NULL;
+    header->first = holder;
+    return holder;
+}
+
+static inline void
+pool_holder_unchaing(pool_header *header, pool_holder *holder)
+{
+    register pool_holder *fore = holder->fore, *back = holder->back;
+    holder->fore = NULL;
+    holder->back = NULL;
+    if (fore != NULL)  fore->back     = back;
+    else               header->_black_magick = back;
+    if (back != NULL)  back->fore     = fore;
+    else               header->first = fore;
+}
+
+static inline pool_holder *
+entry_holder(void **entry)
+{
+    return (pool_holder*)(((uintptr_t)entry) & ~(DEFAULT_POOL_SIZE - 1));
+}
+
+static inline void
+pool_free_entry(void **entry)
+{
+    pool_holder *holder = entry_holder(entry);
+    pool_header *header = holder->header;
+
+    if (holder->free++ == 0) {
+	register pool_holder *first = header->first;
+	if (first == NULL) {
+	    header->first = holder;
+	} else {
+	    holder->back = first;
+	    holder->fore = first->fore;
+	    first->fore = holder;
+	    if (holder->fore)
+		holder->fore->back = holder;
+	    else
+		header->_black_magick = holder;
+	}
+    } else if (holder->free == holder->total && header->first != holder ) {
+	pool_holder_unchaing(header, holder);
+	aligned_free(holder);
+#if CALC_EXACT_MALLOC_SIZE
+	rb_objspace.malloc_params.allocated_size -= DEFAULT_POOL_SIZE;
+	rb_objspace.malloc_params.allocations--;
+#endif
+	return;
+    }
+
+    *entry = holder->freep;
+    holder->freep = entry;
+}
+
+static inline void*
+pool_alloc_entry(pool_header *header)
+{
+    pool_holder *holder = header->first;
+    void **result;
+    if (holder == NULL) {
+	holder = pool_holder_alloc(header);
+    }
+
+    result = holder->freep;
+    holder->freep = *result;
+
+    if (--holder->free == 0) {
+	pool_holder_unchaing(header, holder);
+    }
+
+    return result;
+}
+
+static void
+pool_finalize_header(pool_header *header)
+{
+    if (header->first) {
+        aligned_free(header->first);
+        header->first = NULL;
+    }
+}
+#endif
diff --git a/ruby.c b/ruby.c
index b53784f..0897400 100644
--- a/ruby.c
+++ b/ruby.c
@@ -209,7 +209,6 @@ push_include(const char *path, VALUE (*filter)(VALUE))
 {
     const char sep = PATH_SEP_CHAR;
     const char *p, *s;
-    VALUE load_path = GET_VM()->load_path;
 
     p = path;
     while (*p) {
@@ -217,7 +216,7 @@ push_include(const char *path, VALUE (*filter)(VALUE))
 	    p++;
 	if (!*p) break;
 	for (s = p; *s && *s != sep; s = CharNext(s));
-	rb_ary_push(load_path, (*filter)(rubylib_mangled_path(p, s - p)));
+	rb_load_path_ary_push((*filter)(rubylib_mangled_path(p, s - p)));
 	p = s;
     }
 }
@@ -338,7 +337,6 @@ ruby_init_loadpath(void)
 void
 ruby_init_loadpath_safe(int safe_level)
 {
-    VALUE load_path;
     ID id_initial_load_path_mark;
     extern const char ruby_initial_load_paths[];
     const char *paths = ruby_initial_load_paths;
@@ -438,7 +436,6 @@ ruby_init_loadpath_safe(int safe_level)
 #define RUBY_RELATIVE(path, len) rubylib_mangled_path((path), (len))
 #define PREFIX_PATH() RUBY_RELATIVE(exec_prefix, sizeof(exec_prefix)-1)
 #endif
-    load_path = GET_VM()->load_path;
 
     if (safe_level == 0) {
 #ifdef MANGLED_PATH
@@ -452,7 +449,7 @@ ruby_init_loadpath_safe(int safe_level)
 	size_t len = strlen(paths);
 	VALUE path = RUBY_RELATIVE(paths, len);
 	rb_ivar_set(path, id_initial_load_path_mark, path);
-	rb_ary_push(load_path, path);
+	rb_load_path_ary_push(path);
 	paths += len + 1;
     }
 
@@ -1349,6 +1346,7 @@ process_options(int argc, char **argv, struct cmdline_options *opt)
 	for (i = 0; i < RARRAY_LEN(load_path); ++i) {
 	    rb_enc_associate(RARRAY_PTR(load_path)[i], lenc);
 	}
+	rb_reset_expanded_cache();
     }
     if (!(opt->disable & DISABLE_BIT(gems))) {
 #if defined DISABLE_RUBYGEMS && DISABLE_RUBYGEMS
diff --git a/st.c b/st.c
index ba21b31..ed16995 100644
--- a/st.c
+++ b/st.c
@@ -7,6 +7,7 @@
 #include "st.h"
 #else
 #include "ruby/ruby.h"
+#include "pool_alloc.h"
 #endif
 
 #include <stdio.h>
@@ -27,6 +28,9 @@ struct st_table_entry {
 
 #define ST_DEFAULT_MAX_DENSITY 5
 #define ST_DEFAULT_INIT_TABLE_SIZE 11
+#define ST_DEFAULT_SECOND_TABLE_SIZE 19
+#define ST_DEFAULT_PACKED_TABLE_SIZE 18
+#define MAX_PACKED_HASH (ST_DEFAULT_PACKED_TABLE_SIZE / 3)
 
     /*
      * DEFAULT_MAX_DENSITY is the default for the largest we allow the
@@ -61,20 +65,98 @@ static void rehash(st_table *);
 #ifdef RUBY
 #define malloc xmalloc
 #define calloc xcalloc
+#define realloc xrealloc
 #define free(x) xfree(x)
 #endif
 
 #define numberof(array) (int)(sizeof(array) / sizeof((array)[0]))
 
-#define alloc(type) (type*)malloc((size_t)sizeof(type))
-#define Calloc(n,s) (char*)calloc((n),(s))
-
 #define EQUAL(table,x,y) ((x)==(y) || (*(table)->type->compare)((x),(y)) == 0)
 
 /* remove cast to unsigned int in the future */
 #define do_hash(key,table) (unsigned int)(st_index_t)(*(table)->type->hash)((key))
 #define do_hash_bin(key,table) (do_hash((key), (table))%(table)->num_bins)
 
+/* preparation for possible allocation improvements */
+#ifdef POOL_ALLOC_API
+#define st_alloc_entry() (st_table_entry *)ruby_xpool_malloc_6p()
+#define st_free_entry(entry) ruby_xpool_free(entry)
+#define st_alloc_table() (st_table *)ruby_xpool_malloc_6p()
+#define st_dealloc_table(table) ruby_xpool_free(table)
+static inline st_table_entry **
+st_alloc_bins(st_index_t size)
+{
+    st_table_entry **result;
+    if (size == 11) {
+        result = (st_table_entry **) ruby_xpool_malloc_11p();
+        memset(result, 0, 11 * sizeof(st_table_entry *));
+    }
+    else
+        result = (st_table_entry **) ruby_xcalloc(size, sizeof(st_table_entry*));
+    return result;
+}
+static inline void
+st_free_bins(st_table_entry **bins, st_index_t size)
+{
+    if (size == 11)
+	ruby_xpool_free(bins);
+    else
+	ruby_xfree(bins);
+}
+static inline st_table_entry**
+st_realloc_bins(st_table_entry **bins, st_index_t newsize, st_index_t oldsize)
+{
+    st_free_bins(bins, oldsize);
+    return st_alloc_bins(newsize);
+}
+#else
+#define st_alloc_entry() (st_table_entry *)malloc(sizeof(st_table_entry))
+#define st_free_entry(entry) free(entry)
+#define st_alloc_table() (st_table *)malloc(sizeof(st_table))
+#define st_dealloc_table(table) free(table)
+#define st_alloc_bins(size) (st_table_entry **)calloc(size, sizeof(st_table_entry *))
+#define st_free_bins(bins, size) free(bins)
+static inline st_table_entry**
+st_realloc_bins(st_table_entry **bins, st_index_t newsize, st_index_t oldsize)
+{
+    bins = (st_table_entry **) realloc(bins, newsize * sizeof(st_table_entry *));
+    memset(bins, 0, newsize * sizeof(st_table_entry *));
+    return bins;
+}
+#endif
+
+/* preparation for possible packing improvements */
+#define PKEY_POS(i, num_bins) ((num_bins)-(i)*2-2)
+#define PVAL_POS(i, num_bins) ((num_bins)-(i)*2-1)
+#define PHASH_POS(i, num_bins) (i)
+#define PKEY(table, i) (st_data_t)(table)->bins[PKEY_POS(i, (table)->num_bins)]
+#define PVAL(table, i) (st_data_t)(table)->bins[PVAL_POS(i, (table)->num_bins)]
+#define PHASH(table, i) (st_data_t)(table)->bins[PHASH_POS(i, (table)->num_bins)]
+#define PKEY_SET(table, i, v) do{ (table)->bins[PKEY_POS(i, (table)->num_bins)] = (st_table_entry *)(v); } while(0)
+#define PVAL_SET(table, i, v) do{ (table)->bins[PVAL_POS(i, (table)->num_bins)] = (st_table_entry *)(v); } while(0)
+#define PHASH_SET(table, i, v) do{ (table)->bins[PHASH_POS(i, (table)->num_bins)] = (st_table_entry *)(v); } while(0)
+/* this function depends much on packed layout, so that it placed here */
+static inline void
+remove_packed_entry(st_table *table, st_index_t i)
+{
+    table->num_entries--;
+    if (i < table->num_entries) {
+        st_index_t mv = table->num_entries - i, upto = table->num_bins - 2*table->num_entries;
+        memmove(table->bins + i, table->bins + i + 1, sizeof(st_table_entry *) * mv);
+        memmove(table->bins + upto, table->bins + upto - 2,
+                sizeof(st_table_entry *) * mv * 2);
+    }
+}
+/* ultra packed values */
+#define MAX_ULTRA_PACKED 1
+#define ULTRA_PACKED(table) ((table)->num_bins == 0)
+#define UPHASH(table) ((st_index_t)(table)->bins)
+#define UPKEY(table)  ((st_data_t)(table)->head)
+#define UPVAL(table)  ((st_data_t)(table)->tail)
+#define UPHASH_SET(table, val) do{ (table)->bins = (st_table_entry **)(val); } while(0)
+#define UPKEY_SET(table, val) do{ (table)->head = (st_table_entry *)(val); } while(0)
+#define UPVAL_SET(table, val) do{ (table)->tail = (st_table_entry *)(val); } while(0)
+
 /*
  * MINSIZE is the minimum size of a dictionary.
  */
@@ -85,8 +167,8 @@ static void rehash(st_table *);
 Table of prime numbers 2^n+a, 2<=n<=30.
 */
 static const unsigned int primes[] = {
-	8 + 3,
-	16 + 3,
+	ST_DEFAULT_INIT_TABLE_SIZE,
+	ST_DEFAULT_SECOND_TABLE_SIZE,
 	32 + 5,
 	64 + 3,
 	128 + 3,
@@ -161,8 +243,6 @@ stat_col(void)
 }
 #endif
 
-#define MAX_PACKED_NUMHASH (ST_DEFAULT_INIT_TABLE_SIZE/2)
-
 st_table*
 st_init_table_with_size(const struct st_hash_type *type, st_index_t size)
 {
@@ -181,14 +261,19 @@ st_init_table_with_size(const struct st_hash_type *type, st_index_t size)
     }
 #endif
 
-    size = new_size(size);	/* round up to prime number */
 
-    tbl = alloc(st_table);
+    tbl = st_alloc_table();
     tbl->type = type;
     tbl->num_entries = 0;
-    tbl->entries_packed = type == &type_numhash && size/2 <= MAX_PACKED_NUMHASH;
+    if ( (tbl->entries_packed = size <= MAX_PACKED_HASH) ) {
+	size = size <= MAX_ULTRA_PACKED ? 0 :
+		ST_DEFAULT_PACKED_TABLE_SIZE;
+    }
+    else {
+	size = new_size(size);	/* round up to prime number */
+    }
     tbl->num_bins = size;
-    tbl->bins = (st_table_entry **)Calloc(size, sizeof(st_table_entry*));
+    tbl->bins = size ? st_alloc_bins(size) : NULL;
     tbl->head = 0;
     tbl->tail = 0;
 
@@ -253,7 +338,7 @@ st_clear(st_table *table)
 	table->bins[i] = 0;
 	while (ptr != 0) {
 	    next = ptr->next;
-	    free(ptr);
+	    st_free_entry(ptr);
 	    ptr = next;
 	}
     }
@@ -266,8 +351,9 @@ void
 st_free_table(st_table *table)
 {
     st_clear(table);
-    free(table->bins);
-    free(table);
+    if (table->num_bins)
+	st_free_bins(table->bins, table->num_bins);
+    st_dealloc_table(table);
 }
 
 size_t
@@ -306,40 +392,69 @@ count_collision(const struct st_hash_type *type)
 #define FOUND_ENTRY
 #endif
 
-#define FIND_ENTRY(table, ptr, hash_val, bin_pos) do {\
-    (bin_pos) = (hash_val)%(table)->num_bins;\
-    (ptr) = (table)->bins[(bin_pos)];\
-    FOUND_ENTRY;\
-    if (PTR_NOT_EQUAL((table), (ptr), (hash_val), key)) {\
-	COLLISION;\
-	while (PTR_NOT_EQUAL((table), (ptr)->next, (hash_val), key)) {\
-	    (ptr) = (ptr)->next;\
-	}\
-	(ptr) = (ptr)->next;\
-    }\
-} while (0)
+static st_table_entry *
+find_entry(st_table *table, st_data_t key, st_index_t hash_val, st_index_t bin_pos)
+{
+    register st_table_entry *ptr = table->bins[bin_pos];
+    FOUND_ENTRY;
+    if (PTR_NOT_EQUAL(table, ptr, hash_val, key)) {
+	COLLISION;
+	while (PTR_NOT_EQUAL(table, ptr->next, hash_val, key)) {
+	    ptr = ptr->next;
+	}
+	ptr = ptr->next;
+    }
+    return ptr;
+}
+
+static inline st_index_t
+find_packed_index(st_table *table, st_index_t hash_val, st_data_t key)
+{
+    st_index_t i = 0;
+    for(;;) {
+        while (i < table->num_entries && PHASH(table, i) != hash_val) i++;
+        if (i == table->num_entries || EQUAL(table, key, PKEY(table, i)))
+            break;
+        i++;
+    }
+    return i;
+}
+
+static inline int
+check_ultra_packed(st_table *table, st_index_t hash_val, st_data_t key)
+{
+  return table->num_entries && UPHASH(table) == hash_val &&
+      EQUAL(table, key, UPKEY(table));
+}
 
 #define collision_check 0
 
 int
 st_lookup(st_table *table, register st_data_t key, st_data_t *value)
 {
-    st_index_t hash_val, bin_pos;
+    st_index_t hash_val;
     register st_table_entry *ptr;
 
+    hash_val = do_hash(key, table);
+
     if (table->entries_packed) {
-        st_index_t i;
-        for (i = 0; i < table->num_entries; i++) {
-            if ((st_data_t)table->bins[i*2] == key) {
-                if (value !=0) *value = (st_data_t)table->bins[i*2+1];
-                return 1;
-            }
-        }
+	if (ULTRA_PACKED(table)) {
+	    if (check_ultra_packed(table, hash_val, key)) {
+		if (value != 0) *value = UPVAL(table);
+		return 1;
+	    }
+	}
+	else {
+	    st_index_t i = find_packed_index(table, hash_val, key);
+	    if (i < table->num_entries) {
+		if (value != 0) *value = PVAL(table, i);
+		return 1;
+	    }
+	}
         return 0;
     }
 
-    hash_val = do_hash(key, table);
-    FIND_ENTRY(table, ptr, hash_val, bin_pos);
+    ptr = find_entry(table, key, hash_val, hash_val % table->num_bins);
 
     if (ptr == 0) {
 	return 0;
@@ -353,22 +468,29 @@ st_lookup(st_table *table, register st_data_t key, st_data_t *value)
 int
 st_get_key(st_table *table, register st_data_t key, st_data_t *result)
 {
-    st_index_t hash_val, bin_pos;
+    st_index_t hash_val;
     register st_table_entry *ptr;
 
+    hash_val = do_hash(key, table);
+
     if (table->entries_packed) {
-        st_index_t i;
-        for (i = 0; i < table->num_entries; i++) {
-            if ((st_data_t)table->bins[i*2] == key) {
-                if (result !=0) *result = (st_data_t)table->bins[i*2];
-                return 1;
-            }
-        }
+	if (ULTRA_PACKED(table)) {
+	    if (check_ultra_packed(table, hash_val, key)) {
+		if (result != 0) *result = UPKEY(table);
+		return 1;
+	    }
+	}
+	else {
+	    st_index_t i = find_packed_index(table, hash_val, key);
+	    if (i < table->num_entries) {
+		if (result != 0) *result = PKEY(table, i);
+		return 1;
+	    }
+	}
         return 0;
     }
 
-    hash_val = do_hash(key, table);
-    FIND_ENTRY(table, ptr, hash_val, bin_pos);
+    ptr = find_entry(table, key, hash_val, hash_val % table->num_bins);
 
     if (ptr == 0) {
 	return 0;
@@ -382,85 +504,160 @@ st_get_key(st_table *table, register st_data_t key, st_data_t *result)
 #undef collision_check
 #define collision_check 1
 
-#define MORE_PACKABLE_P(table) \
-    ((st_index_t)((table)->num_entries+1) * 2 <= (table)->num_bins && \
-     (table)->num_entries+1 <= MAX_PACKED_NUMHASH)
-
-#define ADD_DIRECT(table, key, value, hash_val, bin_pos)\
-do {\
-    st_table_entry *entry;\
-    if ((table)->num_entries > ST_DEFAULT_MAX_DENSITY * (table)->num_bins) {\
-	rehash(table);\
-        (bin_pos) = (hash_val) % (table)->num_bins;\
-    }\
-    \
-    entry = alloc(st_table_entry);\
-    \
-    entry->hash = (hash_val);\
-    entry->key = (key);\
-    entry->record = (value);\
-    entry->next = (table)->bins[(bin_pos)];\
-    if ((table)->head != 0) {\
-	entry->fore = 0;\
-	(entry->back = (table)->tail)->fore = entry;\
-	(table)->tail = entry;\
-    }\
-    else {\
-	(table)->head = (table)->tail = entry;\
-	entry->fore = entry->back = 0;\
-    }\
-    (table)->bins[(bin_pos)] = entry;\
-    (table)->num_entries++;\
-} while (0)
+static inline st_table_entry *
+new_entry(st_table * table, st_data_t key, st_data_t value,
+	st_index_t hash_val, register st_index_t bin_pos)
+{
+    register st_table_entry *entry = st_alloc_entry();
+
+    entry->next = table->bins[bin_pos];
+    table->bins[bin_pos] = entry;
+    entry->hash = hash_val;
+    entry->key = key;
+    entry->record = value;
+
+    return entry;
+}
+
+static inline void
+add_direct(st_table * table, st_data_t key, st_data_t value,
+	st_index_t hash_val, register st_index_t bin_pos)
+{
+    register st_table_entry *entry;
+    if (table->num_entries > ST_DEFAULT_MAX_DENSITY * table->num_bins) {
+	rehash(table);
+        bin_pos = hash_val % table->num_bins;
+    }
+
+    entry = new_entry(table, key, value, hash_val, bin_pos);
+
+    if (table->head != 0) {
+	entry->fore = 0;
+	(entry->back = table->tail)->fore = entry;
+	table->tail = entry;
+    }
+    else {
+	table->head = table->tail = entry;
+	entry->fore = entry->back = 0;
+    }
+    table->num_entries++;
+}
 
 static void
 unpack_entries(register st_table *table)
 {
     st_index_t i;
-    struct st_table_entry *packed_bins[MAX_PACKED_NUMHASH*2];
+    register st_table_entry *entry;
+#if ST_DEFAULT_INIT_TABLE_SIZE == ST_DEFAULT_PACKED_TABLE_SIZE
+    struct st_table_entry *packed_bins[ST_DEFAULT_INIT_TABLE_SIZE];
     st_table tmp_table = *table;
 
-    memcpy(packed_bins, table->bins, sizeof(struct st_table_entry *) * table->num_entries*2);
+    memcpy(packed_bins, table->bins, sizeof(st_table_entry *) * ST_DEFAULT_INIT_TABLE_SIZE);
     table->bins = packed_bins;
     tmp_table.entries_packed = 0;
     tmp_table.num_entries = 0;
     memset(tmp_table.bins, 0, sizeof(struct st_table_entry *) * tmp_table.num_bins);
-    for (i = 0; i < table->num_entries; i++) {
-        st_insert(&tmp_table, (st_data_t)packed_bins[i*2], (st_data_t)packed_bins[i*2+1]);
+#else
+    st_table tmp_table = {table->type, 0, 0, 0, 0, 0, 0};
+
+    tmp_table.bins = st_alloc_bins(ST_DEFAULT_INIT_TABLE_SIZE);
+    tmp_table.num_bins = ST_DEFAULT_INIT_TABLE_SIZE;
+#endif
+    entry = new_entry(&tmp_table, PKEY(table, 0), PVAL(table, 0),
+	    PHASH(table, 0), PHASH(table, 0) % tmp_table.num_bins);
+    tmp_table.head = entry;
+    entry->back = 0;
+    for (i = 1; i < MAX_PACKED_HASH; i++) {
+	register st_table_entry *oldentry = entry;
+	st_index_t hash_val = PHASH(table, i);
+	entry = new_entry(&tmp_table, PKEY(table, i), PVAL(table, i),
+		hash_val, hash_val % tmp_table.num_bins);
+	oldentry->fore = entry;
+	entry->back = oldentry;
     }
+    entry->fore = 0;
+    tmp_table.tail = entry;
+    tmp_table.num_entries = MAX_PACKED_HASH;
+#if ST_DEFAULT_INIT_TABLE_SIZE != ST_DEFAULT_PACKED_TABLE_SIZE
+    st_free_bins(table->bins, table->num_bins);
+#endif
     *table = tmp_table;
 }
 
+static void
+add_packed_direct(st_table *table, st_data_t key, st_data_t value, st_index_t hash_val)
+{
+    if (table->num_entries < MAX_PACKED_HASH ) {
+	st_index_t i = table->num_entries++;
+	PKEY_SET(table, i, key);
+	PVAL_SET(table, i, value);
+	PHASH_SET(table, i, hash_val);
+    }
+    else {
+	unpack_entries(table);
+	add_direct(table, key, value, hash_val, hash_val % table->num_bins);
+    }
+}
+
+static void
+add_upacked_direct(st_table *table, st_data_t key, st_data_t value, st_index_t hash_val)
+{
+    if (table->num_entries) {
+	st_index_t fhash = UPHASH(table);
+	st_data_t fkey = UPKEY(table), fval = UPVAL(table);
+	table->bins = st_alloc_bins(ST_DEFAULT_PACKED_TABLE_SIZE);
+	table->num_bins = ST_DEFAULT_PACKED_TABLE_SIZE;
+	PHASH_SET(table, 0, fhash);
+	PKEY_SET(table, 0, fkey);
+	PVAL_SET(table, 0, fval);
+	PHASH_SET(table, 1, hash_val);
+	PKEY_SET(table, 1, key);
+	PVAL_SET(table, 1, value);
+	table->num_entries = 2;
+	table->head = NULL;
+	table->tail = NULL;
+    }
+    else {
+	UPHASH_SET(table, hash_val);
+	UPKEY_SET(table, key);
+	UPVAL_SET(table, value);
+	table->num_entries = 1;
+    }
+}
+
 int
 st_insert(register st_table *table, register st_data_t key, st_data_t value)
 {
-    st_index_t hash_val, bin_pos;
+    st_index_t hash_val;
+    register st_index_t bin_pos;
     register st_table_entry *ptr;
 
+    hash_val = do_hash(key, table);
+
     if (table->entries_packed) {
-        st_index_t i;
-        for (i = 0; i < table->num_entries; i++) {
-            if ((st_data_t)table->bins[i*2] == key) {
-                table->bins[i*2+1] = (struct st_table_entry*)value;
-                return 1;
-            }
-        }
-        if (MORE_PACKABLE_P(table)) {
-            i = table->num_entries++;
-            table->bins[i*2] = (struct st_table_entry*)key;
-            table->bins[i*2+1] = (struct st_table_entry*)value;
-            return 0;
-        }
-        else {
-            unpack_entries(table);
-        }
+	if (ULTRA_PACKED(table)) {
+	    if (check_ultra_packed(table, hash_val, key)) {
+		UPVAL_SET(table, value);
+		return 1;
+	    }
+	    add_upacked_direct(table, key, value, hash_val);
+	}
+	else {
+	    st_index_t i = find_packed_index(table, hash_val, key);
+	    if (i < table->num_entries) {
+		PVAL_SET(table, i, value);
+		return 1;
+	    }
+	    add_packed_direct(table, key, value, hash_val);
+	}
+	return 0;
     }
 
-    hash_val = do_hash(key, table);
-    FIND_ENTRY(table, ptr, hash_val, bin_pos);
+    bin_pos = hash_val % table->num_bins;
+    ptr = find_entry(table, key, hash_val, bin_pos);
 
     if (ptr == 0) {
-	ADD_DIRECT(table, key, value, hash_val, bin_pos);
+	add_direct(table, key, value, hash_val, bin_pos);
 	return 0;
     }
     else {
@@ -473,34 +670,39 @@ int
 st_insert2(register st_table *table, register st_data_t key, st_data_t value,
 	   st_data_t (*func)(st_data_t))
 {
-    st_index_t hash_val, bin_pos;
+    st_index_t hash_val;
+    register st_index_t bin_pos;
     register st_table_entry *ptr;
 
+    hash_val = do_hash(key, table);
+
     if (table->entries_packed) {
-        st_index_t i;
-        for (i = 0; i < table->num_entries; i++) {
-            if ((st_data_t)table->bins[i*2] == key) {
-                table->bins[i*2+1] = (struct st_table_entry*)value;
-                return 1;
-            }
-        }
-        if (MORE_PACKABLE_P(table)) {
-            i = table->num_entries++;
-            table->bins[i*2] = (struct st_table_entry*)key;
-            table->bins[i*2+1] = (struct st_table_entry*)value;
-            return 0;
-        }
-        else {
-            unpack_entries(table);
-        }
+	if (ULTRA_PACKED(table)) {
+	    if (check_ultra_packed(table, hash_val, key)) {
+		UPVAL_SET(table, value);
+		return 1;
+	    }
+	    key = (*func)(key);
+	    add_upacked_direct(table, key, value, hash_val);
+	}
+	else {
+	    st_index_t i = find_packed_index(table, hash_val, key);
+	    if (i < table->num_entries) {
+		PVAL_SET(table, i, value);
+		return 1;
+	    }
+	    key = (*func)(key);
+	    add_packed_direct(table, key, value, hash_val);
+	}
+	return 0;
     }
 
-    hash_val = do_hash(key, table);
-    FIND_ENTRY(table, ptr, hash_val, bin_pos);
+    bin_pos = hash_val % table->num_bins;
+    ptr = find_entry(table, key, hash_val, bin_pos);
 
     if (ptr == 0) {
 	key = (*func)(key);
-	ADD_DIRECT(table, key, value, hash_val, bin_pos);
+	add_direct(table, key, value, hash_val, bin_pos);
 	return 0;
     }
     else {
@@ -512,36 +714,30 @@ st_insert2(register st_table *table, register st_data_t key, st_data_t value,
 void
 st_add_direct(st_table *table, st_data_t key, st_data_t value)
 {
-    st_index_t hash_val, bin_pos;
+    st_index_t hash_val;
 
+    hash_val = do_hash(key, table);
     if (table->entries_packed) {
-        int i;
-        if (MORE_PACKABLE_P(table)) {
-            i = table->num_entries++;
-            table->bins[i*2] = (struct st_table_entry*)key;
-            table->bins[i*2+1] = (struct st_table_entry*)value;
-            return;
-        }
-        else {
-            unpack_entries(table);
-        }
+	if (ULTRA_PACKED(table)) {
+	    add_upacked_direct(table, key, value, hash_val);
+	}
+	else {
+	    add_packed_direct(table, key, value, hash_val);
+	}
+	return;
     }
 
-    hash_val = do_hash(key, table);
-    bin_pos = hash_val % table->num_bins;
-    ADD_DIRECT(table, key, value, hash_val, bin_pos);
+    add_direct(table, key, value, hash_val, hash_val % table->num_bins);
 }
 
 static void
 rehash(register st_table *table)
 {
     register st_table_entry *ptr, **new_bins;
-    st_index_t i, new_num_bins, hash_val;
+    st_index_t new_num_bins, hash_val;
 
     new_num_bins = new_size(table->num_bins+1);
-    new_bins = (st_table_entry**)
-	xrealloc(table->bins, new_num_bins * sizeof(st_table_entry*));
-    for (i = 0; i < new_num_bins; ++i) new_bins[i] = 0;
+    new_bins = st_realloc_bins(table->bins, new_num_bins, table->num_bins);
     table->num_bins = new_num_bins;
     table->bins = new_bins;
 
@@ -562,17 +758,20 @@ st_copy(st_table *old_table)
     st_index_t num_bins = old_table->num_bins;
     st_index_t hash_val;
 
-    new_table = alloc(st_table);
+    new_table = st_alloc_table();
     if (new_table == 0) {
 	return 0;
     }
 
     *new_table = *old_table;
-    new_table->bins = (st_table_entry**)
-	Calloc((unsigned)num_bins, sizeof(st_table_entry*));
+    if (ULTRA_PACKED(old_table)) {
+	return new_table;
+    }
+
+    new_table->bins = st_alloc_bins(num_bins);
 
     if (new_table->bins == 0) {
-	free(new_table);
+	st_dealloc_table(new_table);
 	return 0;
     }
 
@@ -585,7 +784,7 @@ st_copy(st_table *old_table)
 	prev = 0;
 	tail = &new_table->head;
 	do {
-	    entry = alloc(st_table_entry);
+	    entry = st_alloc_entry();
 	    if (entry == 0) {
 		st_free_table(new_table);
 		return 0;
@@ -604,21 +803,22 @@ st_copy(st_table *old_table)
     return new_table;
 }
 
-#define REMOVE_ENTRY(table, ptr) do					\
-    {									\
-	if ((ptr)->fore == 0 && (ptr)->back == 0) {			\
-	    (table)->head = 0;						\
-	    (table)->tail = 0;						\
-	}								\
-	else {								\
-	    st_table_entry *fore = (ptr)->fore, *back = (ptr)->back;	\
-	    if (fore) fore->back = back;				\
-	    if (back) back->fore = fore;				\
-	    if ((ptr) == (table)->head) (table)->head = fore;		\
-	    if ((ptr) == (table)->tail) (table)->tail = back;		\
-	}								\
-	(table)->num_entries--;						\
-    } while (0)
+static inline void
+remove_entry(st_table *table, st_table_entry *ptr)
+{
+    if (ptr->fore == 0 && ptr->back == 0) {
+	table->head = 0;
+	table->tail = 0;
+    }
+    else {
+	st_table_entry *fore = ptr->fore, *back = ptr->back;
+	if (fore) fore->back = back;
+	if (back) back->fore = fore;
+	if (ptr == table->head) table->head = fore;
+	if (ptr == table->tail) table->tail = back;
+    }
+    table->num_entries--;
+}
 
 int
 st_delete(register st_table *table, register st_data_t *key, st_data_t *value)
@@ -627,30 +827,37 @@ st_delete(register st_table *table, register st_data_t *key, st_data_t *value)
     st_table_entry **prev;
     register st_table_entry *ptr;
 
+    hash_val = do_hash(*key, table);
+
     if (table->entries_packed) {
-        st_index_t i;
-        for (i = 0; i < table->num_entries; i++) {
-            if ((st_data_t)table->bins[i*2] == *key) {
-                if (value != 0) *value = (st_data_t)table->bins[i*2+1];
-                table->num_entries--;
-                memmove(&table->bins[i*2], &table->bins[(i+1)*2],
-                        sizeof(struct st_table_entry*) * 2*(table->num_entries-i));
-                return 1;
-            }
-        }
+	if (ULTRA_PACKED(table)) {
+	    if (check_ultra_packed(table, hash_val, *key)) {
+		if (value != 0) *value = UPVAL(table);
+		*key = UPKEY(table);
+		table->num_entries = 0;
+		return 1;
+	    }
+	}
+	else {
+	    st_index_t i = find_packed_index(table, hash_val, *key);
+	    if (i < table->num_entries) {
+		if (value != 0) *value = PVAL(table, i);
+		*key = PKEY(table, i);
+		remove_packed_entry(table, i);
+		return 1;
+	    }
+	}
         if (value != 0) *value = 0;
         return 0;
     }
 
-    hash_val = do_hash_bin(*key, table);
-
-    for (prev = &table->bins[hash_val]; (ptr = *prev) != 0; prev = &ptr->next) {
+    for (prev = &table->bins[hash_val % table->num_bins]; (ptr = *prev) != 0; prev = &ptr->next) {
 	if (EQUAL(table, *key, ptr->key)) {
 	    *prev = ptr->next;
-	    REMOVE_ENTRY(table, ptr);
+	    remove_entry(table, ptr);
 	    if (value != 0) *value = ptr->record;
 	    *key = ptr->key;
-	    free(ptr);
+	    st_free_entry(ptr);
 	    return 1;
 	}
     }
@@ -665,12 +872,25 @@ st_delete_safe(register st_table *table, register st_data_t *key, st_data_t *val
     st_index_t hash_val;
     register st_table_entry *ptr;
 
+    hash_val = do_hash(*key, table);
+
     if (table->entries_packed) {
-	st_index_t i;
-	for (i = 0; i < table->num_entries; i++) {
-	    if ((st_data_t)table->bins[i*2] == *key) {
-		if (value != 0) *value = (st_data_t)table->bins[i*2+1];
-		table->bins[i*2] = (void *)never;
+	if (ULTRA_PACKED(table)) {
+	    if (check_ultra_packed(table, hash_val, *key)) {
+		if (value != 0) *value = UPVAL(table);
+		*key = UPKEY(table);
+		UPKEY_SET(table, never);
+		UPHASH_SET(table, 0);
+		return 1;
+	    }
+	}
+	else {
+	    st_index_t i = find_packed_index(table, hash_val, *key);
+	    if (i < table->num_entries) {
+		if (value != 0) *value = PVAL(table, i);
+		*key = PKEY(table, i);
+		PKEY_SET(table, i, never);
+		PHASH_SET(table, i,  0);
 		return 1;
 	    }
 	}
@@ -678,12 +898,11 @@ st_delete_safe(register st_table *table, register st_data_t *key, st_data_t *val
 	return 0;
     }
 
-    hash_val = do_hash_bin(*key, table);
-    ptr = table->bins[hash_val];
+    ptr = table->bins[hash_val % table->num_bins];
 
     for (; ptr != 0; ptr = ptr->next) {
 	if ((ptr->key != never) && EQUAL(table, ptr->key, *key)) {
-	    REMOVE_ENTRY(table, ptr);
+	    remove_entry(table, ptr);
 	    *key = ptr->key;
 	    if (value != 0) *value = ptr->record;
 	    ptr->key = ptr->record = never;
@@ -702,17 +921,25 @@ st_cleanup_safe(st_table *table, st_data_t never)
     st_index_t i;
 
     if (table->entries_packed) {
-	st_index_t i = 0, j = 0;
-	while ((st_data_t)table->bins[i*2] != never) {
-	    if (i++ == table->num_entries) return;
+	if (ULTRA_PACKED(table)) {
+	    if (UPKEY(table) == never) {
+		table->num_entries = 0;
+	    }
 	}
-	for (j = i; ++i < table->num_entries;) {
-	    if ((st_data_t)table->bins[i*2] == never) continue;
-	    table->bins[j*2] = table->bins[i*2];
-	    table->bins[j*2+1] = table->bins[i*2+1];
-	    j++;
+	else {
+	    st_index_t i = 0, j = 0;
+	    while (PKEY(table, i) != never) {
+		if (i++ == table->num_entries) return;
+	    }
+	    for (j = i; ++i < table->num_entries;) {
+		if (PKEY(table, i) == never) continue;
+		PKEY_SET(table, j,  PKEY(table, i));
+		PVAL_SET(table, j,  PVAL(table, i));
+		PHASH_SET(table, j,  PHASH(table, i));
+		j++;
+	    }
+	    table->num_entries = j;
 	}
-	table->num_entries = j;
 	return;
     }
 
@@ -722,7 +949,7 @@ st_cleanup_safe(st_table *table, st_data_t never)
 	    if (ptr->key == never) {
 		tmp = ptr;
 		*last = ptr = ptr->next;
-		free(tmp);
+		st_free_entry(tmp);
 	    }
 	    else {
 		ptr = *(last = &ptr->next);
@@ -736,23 +963,51 @@ st_foreach(st_table *table, int (*func)(ANYARGS), st_data_t arg)
 {
     st_table_entry *ptr, **last, *tmp;
     enum st_retval retval;
-    st_index_t i;
+    st_index_t i = 0;
 
     if (table->entries_packed) {
-        for (i = 0; i < table->num_entries; i++) {
-            st_index_t j;
-            st_data_t key, val;
-            key = (st_data_t)table->bins[i*2];
-            val = (st_data_t)table->bins[i*2+1];
+	st_index_t hash;
+	st_data_t key, val;
+	if (ULTRA_PACKED(table) && table->num_entries) {
+	    key = UPKEY(table);
+	    val = UPVAL(table);
+	    hash = UPHASH(table);
+	    retval = (*func)(key, val, arg);
+	    if (!ULTRA_PACKED(table)) goto packed;
+	    switch(retval) {
+	      case ST_CHECK:
+		if (UPKEY(table) == Qundef && UPHASH(table) == 0)
+		    break;
+		if (table->num_entries && UPHASH(table) == hash &&
+			EQUAL(table, key, UPKEY(table)))
+		    break;
+		retval = (*func)(0, 0, arg, 1);
+		return 1;
+	      case ST_CONTINUE:
+		break;
+	      case ST_STOP:
+		return 0;
+	      case ST_DELETE:
+		table->num_entries = 0;
+	    }
+	    return 0;
+	}
+        for (; i < table->num_entries; i++) {
+            key = PKEY(table, i);
+            val = PVAL(table, i);
+            hash = PHASH(table,i);
             retval = (*func)(key, val, arg);
+	packed:
 	    if (!table->entries_packed) goto unpacked;
             switch (retval) {
 	      case ST_CHECK:	/* check if hash is modified during iteration */
-                for (j = 0; j < table->num_entries; j++) {
-                    if ((st_data_t)table->bins[j*2] == key)
-                        break;
-                }
-                if (j == table->num_entries) {
+		/* work around uncomforming befaviour of hash */
+		if (PKEY(table, i) == Qundef && PHASH(table, i) == 0)
+		    break;
+		else if (i < table->num_entries &&
+			PHASH(table, i) == hash && EQUAL(table, key, PKEY(table, i)))
+		    break;
+                if (find_packed_index(table, hash, key) == table->num_entries) {
                     /* call func with error notice */
                     retval = (*func)(0, 0, arg, 1);
                     return 1;
@@ -763,9 +1018,7 @@ st_foreach(st_table *table, int (*func)(ANYARGS), st_data_t arg)
 	      case ST_STOP:
 		return 0;
 	      case ST_DELETE:
-                table->num_entries--;
-                memmove(&table->bins[i*2], &table->bins[(i+1)*2],
-                        sizeof(struct st_table_entry*) * 2*(table->num_entries-i));
+		remove_packed_entry(table, i);
                 i--;
                 break;
             }
@@ -773,9 +1026,10 @@ st_foreach(st_table *table, int (*func)(ANYARGS), st_data_t arg)
         return 0;
       unpacked:
 	ptr = table->head;
-	while (i-- > 0) {
-	    if (!(ptr = ptr->fore)) return 0;
-	}
+	for(;ptr && i; i--, ptr = ptr->fore) {}
+	if (ptr == 0) return retval == ST_CHECK ? 1 : 0;
+	i = ptr->hash % table->num_bins;
+	goto check_retval;
     }
     else {
 	ptr = table->head;
@@ -785,6 +1039,7 @@ st_foreach(st_table *table, int (*func)(ANYARGS), st_data_t arg)
 	do {
 	    i = ptr->hash % table->num_bins;
 	    retval = (*func)(ptr->key, ptr->record, arg);
+check_retval:
 	    switch (retval) {
 	      case ST_CHECK:	/* check if hash is modified during iteration */
 		for (tmp = table->bins[i]; tmp != ptr; tmp = tmp->next) {
@@ -806,8 +1061,8 @@ st_foreach(st_table *table, int (*func)(ANYARGS), st_data_t arg)
 		    if (ptr == tmp) {
 			tmp = ptr->fore;
 			*last = ptr->next;
-			REMOVE_ENTRY(table, ptr);
-			free(ptr);
+			remove_entry(table, ptr);
+			st_free_entry(ptr);
 			if (ptr == tmp) return 0;
 			ptr = tmp;
 			break;
@@ -829,18 +1084,21 @@ st_reverse_foreach(st_table *table, int (*func)(ANYARGS), st_data_t arg)
 
     if (table->entries_packed) {
         for (i = table->num_entries-1; 0 <= i; i--) {
-            int j;
+            int hash;
             st_data_t key, val;
-            key = (st_data_t)table->bins[i*2];
-            val = (st_data_t)table->bins[i*2+1];
+            key = PKEY(table, i);
+            val = PVAL(table, i);
+            hash = PHASH(table, i);
             retval = (*func)(key, val, arg);
             switch (retval) {
 	      case ST_CHECK:	/* check if hash is modified during iteration */
-                for (j = 0; j < table->num_entries; j++) {
-                    if ((st_data_t)table->bins[j*2] == key)
-                        break;
-                }
-                if (j == table->num_entries) {
+		/* work around uncomforming befaviour of hash */
+		if (PKEY(table, i) == Qundef && PHASH(table, i) == 0)
+		    break;
+		else if (i < table->num_entries &&
+			PHASH(table, i) == hash && EQUAL(table, key, PKEY(table, i)))
+		    break;
+                if (find_packed_index(table, hash, key) == table->num_entries) {
                     /* call func with error notice */
                     retval = (*func)(0, 0, arg, 1);
                     return 1;
@@ -851,9 +1109,7 @@ st_reverse_foreach(st_table *table, int (*func)(ANYARGS), st_data_t arg)
 	      case ST_STOP:
 		return 0;
 	      case ST_DELETE:
-                table->num_entries--;
-                memmove(&table->bins[i*2], &table->bins[(i+1)*2],
-                        sizeof(struct st_table_entry*) * 2*(table->num_entries-i));
+		remove_packed_entry(table, i);
                 break;
             }
         }
@@ -886,8 +1142,8 @@ st_reverse_foreach(st_table *table, int (*func)(ANYARGS), st_data_t arg)
 		    if (ptr == tmp) {
 			tmp = ptr->back;
 			*last = ptr->next;
-			REMOVE_ENTRY(table, ptr);
-			free(ptr);
+			remove_entry(table, ptr);
+			st_free_entry(ptr);
 			ptr = tmp;
 			break;
 		    }
diff --git a/vm.c b/vm.c
index 2d7e15c..d1fe744 100644
--- a/vm.c
+++ b/vm.c
@@ -1575,6 +1575,7 @@ rb_vm_mark(void *ptr)
 	RUBY_MARK_UNLESS_NULL(vm->thgroup_default);
 	RUBY_MARK_UNLESS_NULL(vm->mark_object_ary);
 	RUBY_MARK_UNLESS_NULL(vm->load_path);
+	RUBY_MARK_UNLESS_NULL(vm->load_path_expanded_cache);
 	RUBY_MARK_UNLESS_NULL(vm->loaded_features);
 	RUBY_MARK_UNLESS_NULL(vm->top_self);
 	RUBY_MARK_UNLESS_NULL(vm->coverages);
diff --git a/vm_core.h b/vm_core.h
index 0dda1c4..f4dc58a 100644
--- a/vm_core.h
+++ b/vm_core.h
@@ -298,6 +298,7 @@ typedef struct rb_vm_struct {
     /* load */
     VALUE top_self;
     VALUE load_path;
+    VALUE load_path_expanded_cache;
     VALUE loaded_features;
     struct st_table *loading_table;
 
patches/ruby/1.9.3/p0/osx-arch-fix.patch000066400000000617147511530510013504 0ustar00diff --git a/Makefile.in b/Makefile.in
index 656ae90..f976cf1 100644
--- a/Makefile.in
+++ b/Makefile.in
@@ -45,7 +45,7 @@ XLDFLAGS = @XLDFLAGS@ $(EXTLDFLAGS)
 EXTLIBS = 
 LIBS = @LIBS@ $(EXTLIBS)
 MISSING = @LIBOBJS@ @ALLOCA@
-LDSHARED = @LIBRUBY_LDSHARED@
+LDSHARED = @LIBRUBY_LDSHARED@ $(LDFLAGS)
 DLDFLAGS = @LIBRUBY_DLDFLAGS@ $(EXTLDFLAGS) @ARCH_FLAG@
 SOLIBS = @SOLIBS@
 MAINLIBS = @MAINLIBS@
patches/ruby/1.9.3/p0/cflags.patch000066400000002231147511530510012425 0ustar00--- a/configure.in
+++ b/configure.in
@@ -267,11 +267,9 @@
     cflagspat="$cflagspat;s|"`eval echo '"'"${debugflags}"'"' | sed 's/[[][|.*]]/\\&/g;s/^ */ /;s/ *$/ /'`'| |g'
 test -z "warnflags" ||
     cflagspat="$cflagspat;s|"`eval echo '"'"${warnflags}"'"' | sed 's/[[][|.*]]/\\&/g;s/^ */ /;s/ *$/ /'`'| |g'
-if test -z "${CFLAGS+set}"; then
-    cflags=`echo " $cflags " | sed "$cflagspat;s/^ *//;s/ *$//"`
-    orig_cflags="$cflags"
-    cflags="$cflags "'${optflags} ${debugflags} ${warnflags}'
-fi
+cflags=`echo " $cflags " | sed "$cflagspat;s/^ *//;s/ *$//"`
+orig_cflags="$cflags"
+cflags="$cflags "'${optflags} ${debugflags} ${warnflags}'
 if test -z "${CXXFLAGS+set}"; then
     cxxflags=`echo " $cxxflags " | sed "$cflagspat;s/^ *//;s/ *$//"`
     orig_cxxflags="$cxxflags"
@@ -511,7 +509,8 @@
     ])
 fi

-test -z "${ac_env_CFLAGS_set}" -a -n "${cflags+set}" && eval CFLAGS="\"$cflags $ARCH_FLAG\""
+test -z "${ac_env_CFLAGS_set}" && CFLAGS="$ARCH_FLAG"
+test -n "${cflags:+set}" && eval CFLAGS="\"$cflags\${CFLAGS:+ $CFLAGS}\""
 test -z "${ac_env_CXXFLAGS_set}" -a -n "${cxxflags+set}" && eval CXXFLAGS="\"$cxxflags $ARCH_FLAG\""

 dnl check for large file stuff
patches/ruby/1.9.3/p0/gcdata.patch000066400000007545147511530510012426 0ustar00--- a/gc.c	(revision 33566)
+++ b/gc.c	(working copy)
@@ -309,16 +309,12 @@
     struct gc_list *next;
 };
 
-#define CALC_EXACT_MALLOC_SIZE 0
-
 typedef struct rb_objspace {
     struct {
 	size_t limit;
 	size_t increase;
-#if CALC_EXACT_MALLOC_SIZE
 	size_t allocated_size;
 	size_t allocations;
-#endif
     } malloc_params;
     struct {
 	size_t increment;
@@ -715,10 +711,6 @@
     }
     if (size == 0) size = 1;
 
-#if CALC_EXACT_MALLOC_SIZE
-    size += sizeof(size_t);
-#endif
-
     if ((ruby_gc_stress && !ruby_disable_gc_stress) ||
 	(malloc_increase+size) > malloc_limit) {
 	garbage_collect_with_gvl(objspace);
@@ -732,12 +724,8 @@
 {
     malloc_increase += size;
 
-#if CALC_EXACT_MALLOC_SIZE
     objspace->malloc_params.allocated_size += size;
     objspace->malloc_params.allocations++;
-    ((size_t *)mem)[0] = size;
-    mem = (size_t *)mem + 1;
-#endif
 
     return mem;
 }
@@ -776,11 +764,7 @@
     if (ruby_gc_stress && !ruby_disable_gc_stress)
 	garbage_collect_with_gvl(objspace);
 
-#if CALC_EXACT_MALLOC_SIZE
-    size += sizeof(size_t);
     objspace->malloc_params.allocated_size -= size;
-    ptr = (size_t *)ptr - 1;
-#endif
 
     mem = realloc(ptr, size);
     if (!mem) {
@@ -793,11 +777,7 @@
     }
     malloc_increase += size;
 
-#if CALC_EXACT_MALLOC_SIZE
     objspace->malloc_params.allocated_size += size;
-    ((size_t *)mem)[0] = size;
-    mem = (size_t *)mem + 1;
-#endif
 
     return mem;
 }
@@ -805,14 +785,6 @@
 static void
 vm_xfree(rb_objspace_t *objspace, void *ptr)
 {
-#if CALC_EXACT_MALLOC_SIZE
-    size_t size;
-    ptr = ((size_t *)ptr) - 1;
-    size = ((size_t*)ptr)[0];
-    objspace->malloc_params.allocated_size -= size;
-    objspace->malloc_params.allocations--;
-#endif
-
     free(ptr);
 }
 
@@ -3384,7 +3356,6 @@
 }
 
 
-#if CALC_EXACT_MALLOC_SIZE
 /*
  *  call-seq:
  *     GC.malloc_allocated_size -> Integer
@@ -3394,8 +3365,8 @@
  *  It returns the allocated size by malloc().
  */
 
-static VALUE
-gc_malloc_allocated_size(VALUE self)
+VALUE
+rb_gc_malloc_allocated_size(VALUE self)
 {
     return UINT2NUM((&rb_objspace)->malloc_params.allocated_size);
 }
@@ -3409,12 +3380,11 @@
  *  It returns the number of allocated memory object by malloc().
  */
 
-static VALUE
-gc_malloc_allocations(VALUE self)
+VALUE
+rb_gc_malloc_allocations(VALUE self)
 {
     return UINT2NUM((&rb_objspace)->malloc_params.allocations);
 }
-#endif
 
 static VALUE
 gc_profile_record_get(void)
@@ -3599,6 +3569,8 @@
     rb_define_singleton_method(rb_mGC, "start", rb_gc_start, 0);
     rb_define_singleton_method(rb_mGC, "enable", rb_gc_enable, 0);
     rb_define_singleton_method(rb_mGC, "disable", rb_gc_disable, 0);
+    rb_define_singleton_method(rb_mGC, "malloc_allocated_size", rb_gc_malloc_allocated_size, 0);
+    rb_define_singleton_method(rb_mGC, "malloc_allocations", rb_gc_malloc_allocations, 0);
     rb_define_singleton_method(rb_mGC, "stress", gc_stress_get, 0);
     rb_define_singleton_method(rb_mGC, "stress=", gc_stress_set, 1);
     rb_define_singleton_method(rb_mGC, "count", gc_count, 0);
@@ -3613,6 +3585,7 @@
     rb_define_singleton_method(rb_mProfiler, "result", gc_profile_result, 0);
     rb_define_singleton_method(rb_mProfiler, "report", gc_profile_report, -1);
     rb_define_singleton_method(rb_mProfiler, "total_time", gc_profile_total_time, 0);
+    rb_define_singleton_method(rb_mProfiler, "data", gc_profile_record_get, 0);
 
     rb_mObSpace = rb_define_module("ObjectSpace");
     rb_define_module_function(rb_mObSpace, "each_object", os_each_obj, -1);
@@ -3632,9 +3605,4 @@
     rb_define_method(rb_mKernel, "object_id", rb_obj_id, 0);
 
     rb_define_module_function(rb_mObSpace, "count_objects", count_objects, -1);
-
-#if CALC_EXACT_MALLOC_SIZE
-    rb_define_singleton_method(rb_mGC, "malloc_allocated_size", gc_malloc_allocated_size, 0);
-    rb_define_singleton_method(rb_mGC, "malloc_allocations", gc_malloc_allocations, 0);
-#endif
 }
patches/ruby/1.9.3/p194/cflags.patch000066400000002231147511530510012603 0ustar00--- a/configure.in
+++ b/configure.in
@@ -267,11 +267,9 @@
     cflagspat="$cflagspat;s|"`eval echo '"'"${debugflags}"'"' | sed 's/[[][|.*]]/\\&/g;s/^ */ /;s/ *$/ /'`'| |g'
 test -z "warnflags" ||
     cflagspat="$cflagspat;s|"`eval echo '"'"${warnflags}"'"' | sed 's/[[][|.*]]/\\&/g;s/^ */ /;s/ *$/ /'`'| |g'
-if test -z "${CFLAGS+set}"; then
-    cflags=`echo " $cflags " | sed "$cflagspat;s/^ *//;s/ *$//"`
-    orig_cflags="$cflags"
-    cflags="$cflags "'${optflags} ${debugflags} ${warnflags}'
-fi
+cflags=`echo " $cflags " | sed "$cflagspat;s/^ *//;s/ *$//"`
+orig_cflags="$cflags"
+cflags="$cflags "'${optflags} ${debugflags} ${warnflags}'
 if test -z "${CXXFLAGS+set}"; then
     cxxflags=`echo " $cxxflags " | sed "$cflagspat;s/^ *//;s/ *$//"`
     orig_cxxflags="$cxxflags"
@@ -511,7 +509,8 @@
     ])
 fi

-test -z "${ac_env_CFLAGS_set}" -a -n "${cflags+set}" && eval CFLAGS="\"$cflags $ARCH_FLAG\""
+test -z "${ac_env_CFLAGS_set}" && CFLAGS="$ARCH_FLAG"
+test -n "${cflags:+set}" && eval CFLAGS="\"$cflags\${CFLAGS:+ $CFLAGS}\""
 test -z "${ac_env_CXXFLAGS_set}" -a -n "${cxxflags+set}" && eval CXXFLAGS="\"$cxxflags $ARCH_FLAG\""

 dnl check for large file stuff
patches/ruby/1.9.3/p194/ruby-multilib.patch000066400000006737147511530510014163 0ustar00diff -u -wr a/configure.in b/configure.in
--- a/configure.in  2012-04-18 16:09:04.000000000 +0200
+++ b/configure.in  2012-10-08 04:34:25.722227142 +0200
@@ -2354,6 +2354,14 @@
   if test "$rb_cv_binary_elf" = yes; then
     SOLIBS='$(LIBS)'
   fi
+
+  # libdir can be overridden in config.site file (on OpenSUSE at least).
+  libdir_basename=lib
+  if test "$bindir" = '${exec_prefix}/bin'; then
+    AS_CASE(["$libdir"], ['${exec_prefix}/'*], [libdir_basename=`basename "$libdir"`])
+  fi
+  AC_DEFINE_UNQUOTED(LIBDIR_BASENAME, ["${libdir_basename}"])
+
   AS_CASE(["$target_os"],
     [sunos4*], [
  LIBRUBY_ALIASES='lib$(RUBY_SO_NAME).so.$(MAJOR).$(MINOR) lib$(RUBY_SO_NAME).so'
@@ -2362,7 +2370,7 @@
  LIBRUBY_DLDFLAGS='-Wl,-soname,lib$(RUBY_SO_NAME).so.$(MAJOR).$(MINOR)'
  LIBRUBY_ALIASES='lib$(RUBY_SO_NAME).so.$(MAJOR).$(MINOR) lib$(RUBY_SO_NAME).so'
  if test "$load_relative" = yes; then
-	    LIBRUBY_RPATHFLAGS="'-Wl,-rpath,\$\${ORIGIN}/../lib'"
+	    LIBRUBY_RPATHFLAGS="'-Wl,-rpath,\$\${ORIGIN}/../${libdir_basename}'"
      LIBRUBY_RELATIVE=yes
  fi
  ],
@@ -2419,7 +2427,7 @@
  RUBY_SO_NAME="$RUBY_SO_NAME"'.$(MAJOR).$(MINOR).$(TEENY)'
  LIBRUBY_LDSHARED='$(CC) -dynamiclib'
  if test "$load_relative" = yes; then
-	    libprefix='@executable_path/../lib'
+	    libprefix='@executable_path/../${libdir_basename}'
      LIBRUBY_RELATIVE=yes
  fi
  LIBRUBY_DLDFLAGS="$LIBRUBY_DLDFLAGS "'-install_name '${libprefix}'/$(LIBRUBY_SO)'
diff -u -wr a/ruby.c b/ruby.c
--- a/ruby.c  2012-02-06 21:35:30.000000000 +0100
+++ b/ruby.c  2012-10-08 04:40:59.940293797 +0200
@@ -410,9 +410,21 @@
 #endif
     p = strrchr(libpath, '/');
     if (p) {
+      static const char bindir[] = "/bin";
+#ifdef LIBDIR_BASENAME
+      static const char libdir[] = "/"LIBDIR_BASENAME;
+#else
+      static const char libdir[] = "/lib";
+#endif
+      const ptrdiff_t bindir_len = (ptrdiff_t)sizeof(bindir) - 1;
+      const ptrdiff_t libdir_len = (ptrdiff_t)sizeof(libdir) - 1;
	*p = 0;
-	if (p - libpath > 3 && !(STRCASECMP(p - 4, "/bin") && strcmp(p - 4, "/lib"))) {
-	    p -= 4;
+   if (p - libpath >= bindir_len && !STRCASECMP(p - bindir_len, bindir)) {
+     p -= bindir_len;
+     *p = 0;
+   }
+   else if (p - libpath >= libdir_len && !strcmp(p - libdir_len, libdir)) {
+     p -= libdir_len;
      *p = 0;
  }
     }
diff -u -wr a/tool/mkconfig.rb b/tool/mkconfig.rb
--- a/tool/mkconfig.rb	2012-10-08 05:57:16.948702976 +0200
+++ b/tool/mkconfig.rb	2011-08-13 15:17:30.000000000 +0200
@@ -40,6 +40,7 @@
 v_fast = []
 v_others = []
 vars = {}
+v_runtime = {}
 continued_name = nil
 continued_line = nil
 File.foreach "config.status" do |line|
@@ -118,7 +119,10 @@
     val = val.gsub(/\$(?:\$|\{?(\w+)\}?)/) {$1 ? "$(#{$1})" : $&}.dump
     case name
     when /^prefix$/
+      v_runtime[:prefix] = val.slice(1..-2)
       val = "(TOPDIR || DESTDIR + #{val})"
+    when /^libdir$/
+      v_runtime[:libdir] = File.basename(val.slice(1..-2))
     when /^ARCH_FLAG$/
       val = "arch_flag || #{val}" if universal
     when /^UNIVERSAL_ARCHNAMES$/
@@ -145,7 +149,7 @@
 
 drive = File::PATH_SEPARATOR == ';'
 
-prefix = "/lib/ruby/#{version}/#{arch}"
+prefix = "/#{v_runtime[:libdir]}/ruby/#{version}/#{arch}"
 print "  TOPDIR = File.dirname(__FILE__).chomp!(#{prefix.dump})\n"
 print "  DESTDIR = ", (drive ? "TOPDIR && TOPDIR[/\\A[a-z]:/i] || " : ""), "'' unless defined? DESTDIR\n"
 print <<'ARCH' if universal
@@ -190,6 +194,7 @@
     x
   end
 end
+v_others.map!{|x| x.gsub(v_runtime[:prefix], "$(prefix)") }
 v_others.compact!
 
 if $install_name
patches/ruby/1.9.3/p194/falcon.diff000066400000370602147511530510012431 0ustar00diff --git a/common.mk b/common.mk
index eb89a2b..59cdfe4 100644
--- a/common.mk
+++ b/common.mk
@@ -630,7 +630,8 @@ file.$(OBJEXT): {$(VPATH)}file.c $(RUBY_H_INCLUDES) {$(VPATH)}io.h \
 gc.$(OBJEXT): {$(VPATH)}gc.c $(RUBY_H_INCLUDES) {$(VPATH)}re.h \
   {$(VPATH)}regex.h $(ENCODING_H_INCLUDES) $(VM_CORE_H_INCLUDES) \
   {$(VPATH)}gc.h {$(VPATH)}io.h {$(VPATH)}eval_intern.h {$(VPATH)}util.h \
-  {$(VPATH)}debug.h {$(VPATH)}internal.h {$(VPATH)}constant.h
+  {$(VPATH)}debug.h {$(VPATH)}internal.h {$(VPATH)}constant.h \
+  {$(VPATH)}pool_alloc.inc.h {$(VPATH)}pool_alloc.h
 hash.$(OBJEXT): {$(VPATH)}hash.c $(RUBY_H_INCLUDES) {$(VPATH)}util.h \
   $(ENCODING_H_INCLUDES)
 inits.$(OBJEXT): {$(VPATH)}inits.c $(RUBY_H_INCLUDES) \
@@ -693,7 +694,7 @@ signal.$(OBJEXT): {$(VPATH)}signal.c $(RUBY_H_INCLUDES) \
   $(VM_CORE_H_INCLUDES) {$(VPATH)}debug.h
 sprintf.$(OBJEXT): {$(VPATH)}sprintf.c $(RUBY_H_INCLUDES) {$(VPATH)}re.h \
   {$(VPATH)}regex.h {$(VPATH)}vsnprintf.c $(ENCODING_H_INCLUDES)
-st.$(OBJEXT): {$(VPATH)}st.c $(RUBY_H_INCLUDES)
+st.$(OBJEXT): {$(VPATH)}st.c $(RUBY_H_INCLUDES) {$(VPATH)}pool_alloc.h
 strftime.$(OBJEXT): {$(VPATH)}strftime.c $(RUBY_H_INCLUDES) \
   {$(VPATH)}timev.h
 string.$(OBJEXT): {$(VPATH)}string.c $(RUBY_H_INCLUDES) {$(VPATH)}re.h \
diff --git a/configure.in b/configure.in
index 6d24689..1e15b10 100644
--- a/configure.in
+++ b/configure.in
@@ -1315,6 +1315,29 @@ main() {
 CFLAGS="$save_CFLAGS"])
 AC_DEFINE_UNQUOTED(GC_MARK_STACKFRAME_WORD, $rb_cv_gc_mark_stackframe_word)
 
+AS_CASE(["$target_os"],
+[openbsd*], [
+  AC_CACHE_CHECK(for heap align log on openbsd, rb_cv_page_size_log,
+    [rb_cv_page_size_log=no
+     for page_log in 12 13; do
+       AC_TRY_RUN([
+#include <math.h>
+#include <unistd.h>
+
+int
+main() {
+  if ((int)log2((double)sysconf(_SC_PAGESIZE)) != $page_log) return 1;
+  return 0;
+}
+       ],
+       rb_cv_page_size_log="$page_log"; break)
+     done])
+  if test $rb_cv_page_size_log != no; then
+    AC_DEFINE_UNQUOTED(HEAP_ALIGN_LOG, $rb_cv_page_size_log)
+  else
+    AC_DEFINE_UNQUOTED(HEAP_ALIGN_LOG, 12)
+  fi
+])
 
 dnl Checks for library functions.
 AC_TYPE_GETGROUPS
@@ -1415,7 +1438,8 @@ AC_CHECK_FUNCS(fmod killpg wait4 waitpid fork spawnv syscall __syscall chroot ge
 	      setsid telldir seekdir fchmod cosh sinh tanh log2 round\
 	      setuid setgid daemon select_large_fdset setenv unsetenv\
               mktime timegm gmtime_r clock_gettime gettimeofday poll ppoll\
-              pread sendfile shutdown sigaltstack dl_iterate_phdr)
+              pread sendfile shutdown sigaltstack dl_iterate_phdr\
+              dup3 pipe2 posix_memalign memalign)
 
 AC_CACHE_CHECK(for unsetenv returns a value, rb_cv_unsetenv_return_value,
   [AC_TRY_COMPILE([
diff --git a/ext/-test-/st/numhash/numhash.c b/ext/-test-/st/numhash/numhash.c
index e186cd4..53d9e1b 100644
--- a/ext/-test-/st/numhash/numhash.c
+++ b/ext/-test-/st/numhash/numhash.c
@@ -54,7 +54,7 @@ numhash_i(st_data_t key, st_data_t value, st_data_t arg, int error)
 static VALUE
 numhash_each(VALUE self)
 {
-    return st_foreach((st_table *)DATA_PTR(self), numhash_i, self) ? Qtrue : Qfalse;
+    return st_foreach_check((st_table *)DATA_PTR(self), numhash_i, self, 0) ? Qtrue : Qfalse;
 }
 
 void
diff --git a/file.c b/file.c
index 67b281a..e89a559 100644
--- a/file.c
+++ b/file.c
@@ -164,6 +164,10 @@ rb_get_path_check(VALUE obj, int level)
     }
     StringValue(tmp);
 
+    if (RBASIC(obj)->klass == rb_cExpandedPath) {
+        return obj;
+    }
+
     tmp = file_path_convert(tmp);
     if (obj != tmp && insecure_obj_p(tmp, level)) {
 	rb_insecure_operation();
@@ -2864,6 +2868,16 @@ file_expand_path(VALUE fname, VALUE dname, int abs_mode, VALUE result)
     BUFINIT();
     tainted = OBJ_TAINTED(fname);
 
+    if (RBASIC(fname)->klass == rb_cExpandedPath) {
+        size_t dlen = RSTRING_LEN(fname);
+        BUFCHECK(dlen > buflen);
+        strncpy(buf, RSTRING_PTR(fname), dlen + 1);
+        rb_str_set_len(result, dlen);
+        rb_enc_associate(result, rb_enc_check(result, fname));
+        ENC_CODERANGE_CLEAR(result);
+        return result;
+    }
+
     if (s[0] == '~' && abs_mode == 0) {      /* execute only if NOT absolute_path() */
 	long userlen = 0;
 	tainted = 1;
diff --git a/gc.c b/gc.c
index e65d0ec..a72a855 100644
--- a/gc.c
+++ b/gc.c
@@ -20,10 +20,12 @@
 #include "vm_core.h"
 #include "internal.h"
 #include "gc.h"
+#include "pool_alloc.h"
 #include "constant.h"
 #include <stdio.h>
 #include <setjmp.h>
 #include <sys/types.h>
+#include <assert.h>
 
 #ifdef HAVE_SYS_TIME_H
 #include <sys/time.h>
@@ -35,7 +37,12 @@
 
 #if defined _WIN32 || defined __CYGWIN__
 #include <windows.h>
+#elif defined(HAVE_POSIX_MEMALIGN)
+#elif defined(HAVE_MEMALIGN)
+#include <malloc.h>
 #endif
+static void aligned_free(void *);
+static void *aligned_malloc(size_t alignment, size_t size);
 
 #ifdef HAVE_VALGRIND_MEMCHECK_H
 # include <valgrind/memcheck.h>
@@ -84,10 +91,12 @@ typedef struct {
     unsigned int initial_malloc_limit;
     unsigned int initial_heap_min_slots;
     unsigned int initial_free_min;
+#if defined(ENABLE_VM_OBJSPACE) && ENABLE_VM_OBJSPACE
     int gc_stress;
+#endif
 } ruby_gc_params_t;
 
-ruby_gc_params_t initial_params = {
+static ruby_gc_params_t initial_params = {
     GC_MALLOC_LIMIT,
     HEAP_MIN_SLOTS,
     FREE_MIN,
@@ -103,7 +112,10 @@ ruby_gc_params_t initial_params = {
 int ruby_gc_debug_indent = 0;
 
 /* for GC profile */
+#ifndef GC_PROFILE_MORE_DETAIL
 #define GC_PROFILE_MORE_DETAIL 0
+#endif
+
 typedef struct gc_profile_record {
     double gc_time;
     double gc_mark_time;
@@ -301,17 +313,20 @@ typedef struct RVALUE {
 #endif
 
 struct heaps_slot {
-    void *membase;
-    RVALUE *slot;
-    size_t limit;
+    struct heaps_header *membase;
+    RVALUE *freelist;
     struct heaps_slot *next;
     struct heaps_slot *prev;
+    struct heaps_slot *free_next;
+    uintptr_t bits[1];
 };
 
-struct sorted_heaps_slot {
+struct heaps_header {
+    struct heaps_slot *base;
+    uintptr_t *bits;
     RVALUE *start;
     RVALUE *end;
-    struct heaps_slot *slot;
+    size_t limit;
 };
 
 struct gc_list {
@@ -319,7 +334,27 @@ struct gc_list {
     struct gc_list *next;
 };
 
+#ifndef CALC_EXACT_MALLOC_SIZE
 #define CALC_EXACT_MALLOC_SIZE 0
+#endif
+
+#ifdef POOL_ALLOC_API
+/* POOL ALLOC API */
+#define POOL_ALLOC_PART 1
+#include "pool_alloc.inc.h"
+#undef POOL_ALLOC_PART
+
+typedef struct pool_layout_t pool_layout_t;
+struct pool_layout_t {
+    pool_header
+      p6,  /* st_table && st_table_entry */
+      p11;  /* st_table.bins init size */
+} pool_layout = {
+    INIT_POOL(void*[6]),
+    INIT_POOL(void*[11])
+};
+static void pool_finalize_header(pool_header *header);
+#endif
 
 typedef struct rb_objspace {
     struct {
@@ -330,16 +365,19 @@ typedef struct rb_objspace {
 	size_t allocations;
 #endif
     } malloc_params;
+#ifdef POOL_ALLOC_API
+    pool_layout_t *pool_headers;
+#endif
     struct {
 	size_t increment;
 	struct heaps_slot *ptr;
 	struct heaps_slot *sweep_slots;
-	struct sorted_heaps_slot *sorted;
+	struct heaps_slot *free_slots;
+	struct heaps_header **sorted;
 	size_t length;
 	size_t used;
-	RVALUE *freelist;
+        struct heaps_slot *reserve_slots;
 	RVALUE *range[2];
-	RVALUE *freed;
 	size_t live_num;
 	size_t free_num;
 	size_t free_min;
@@ -350,6 +388,7 @@ typedef struct rb_objspace {
 	int dont_gc;
 	int dont_lazy_sweep;
 	int during_gc;
+	rb_atomic_t finalizing;
     } flags;
     struct {
 	st_table *table;
@@ -377,7 +416,11 @@ typedef struct rb_objspace {
 #define ruby_initial_gc_stress	initial_params.gc_stress
 int *ruby_initial_gc_stress_ptr = &ruby_initial_gc_stress;
 #else
+#  ifdef POOL_ALLOC_API
+static rb_objspace_t rb_objspace = {{GC_MALLOC_LIMIT}, &pool_layout, {HEAP_MIN_SLOTS}};
+#  else
 static rb_objspace_t rb_objspace = {{GC_MALLOC_LIMIT}, {HEAP_MIN_SLOTS}};
+#  endif
 int *ruby_initial_gc_stress_ptr = &rb_objspace.gc_stress;
 #endif
 #define malloc_limit		objspace->malloc_params.limit
@@ -385,13 +428,12 @@ int *ruby_initial_gc_stress_ptr = &rb_objspace.gc_stress;
 #define heaps			objspace->heap.ptr
 #define heaps_length		objspace->heap.length
 #define heaps_used		objspace->heap.used
-#define freelist		objspace->heap.freelist
 #define lomem			objspace->heap.range[0]
 #define himem			objspace->heap.range[1]
 #define heaps_inc		objspace->heap.increment
-#define heaps_freed		objspace->heap.freed
 #define dont_gc 		objspace->flags.dont_gc
 #define during_gc		objspace->flags.during_gc
+#define finalizing		objspace->flags.finalizing
 #define finalizer_table 	objspace->final.table
 #define deferred_final_list	objspace->final.deferred
 #define mark_stack		objspace->markstack.buffer
@@ -403,7 +445,16 @@ int *ruby_initial_gc_stress_ptr = &rb_objspace.gc_stress;
 #define initial_heap_min_slots	initial_params.initial_heap_min_slots
 #define initial_free_min	initial_params.initial_free_min
 
+#define is_lazy_sweeping(objspace) ((objspace)->heap.sweep_slots != 0)
+
+#define nonspecial_obj_id(obj) (VALUE)((SIGNED_VALUE)(obj)|FIXNUM_FLAG)
+
+#define HEAP_HEADER(p) ((struct heaps_header *)(p))
+
 static void rb_objspace_call_finalizer(rb_objspace_t *objspace);
+static VALUE define_final0(VALUE obj, VALUE block);
+VALUE rb_define_final(VALUE obj, VALUE block);
+VALUE rb_undefine_final(VALUE obj);
 
 #if defined(ENABLE_VM_OBJSPACE) && ENABLE_VM_OBJSPACE
 rb_objspace_t *
@@ -413,6 +464,10 @@ rb_objspace_alloc(void)
     memset(objspace, 0, sizeof(*objspace));
     malloc_limit = initial_malloc_limit;
     ruby_gc_stress = ruby_initial_gc_stress;
+#ifdef POOL_ALLOC_API
+    objspace->pool_headers = (pool_layout_t*) malloc(sizeof(pool_layout));
+    memcpy(objspace->pool_headers, &pool_layout, sizeof(pool_layout));
+#endif
 
     return objspace;
 }
@@ -478,40 +533,60 @@ rb_objspace_free(rb_objspace_t *objspace)
 	struct gc_list *list, *next;
 	for (list = global_List; list; list = next) {
 	    next = list->next;
-	    free(list);
+	    xfree(list);
 	}
     }
+    if (objspace->heap.reserve_slots) {
+        struct heaps_slot *list, *next;
+        for (list = objspace->heap.reserve_slots; list; list = next) {
+            next = list->free_next;
+            free(list);
+        }
+    }
     if (objspace->heap.sorted) {
 	size_t i;
 	for (i = 0; i < heaps_used; ++i) {
-	    free(objspace->heap.sorted[i].slot->membase);
-	    free(objspace->heap.sorted[i].slot);
+            free(objspace->heap.sorted[i]->base);
+	    aligned_free(objspace->heap.sorted[i]);
 	}
 	free(objspace->heap.sorted);
 	heaps_used = 0;
 	heaps = 0;
     }
+#ifdef POOL_ALLOC_API
+    if (objspace->pool_headers) {
+        pool_finalize_header(&objspace->pool_headers->p6);
+        pool_finalize_header(&objspace->pool_headers->p11);
+        free(objspace->pool_headers);
+    }
+#endif
     free(objspace);
 }
 #endif
 
-/* tiny heap size */
-/* 32KB */
-/*#define HEAP_SIZE 0x8000 */
-/* 128KB */
-/*#define HEAP_SIZE 0x20000 */
-/* 64KB */
-/*#define HEAP_SIZE 0x10000 */
-/* 16KB */
-#define HEAP_SIZE 0x4000
-/* 8KB */
-/*#define HEAP_SIZE 0x2000 */
-/* 4KB */
-/*#define HEAP_SIZE 0x1000 */
-/* 2KB */
-/*#define HEAP_SIZE 0x800 */
-
-#define HEAP_OBJ_LIMIT (unsigned int)(HEAP_SIZE / sizeof(struct RVALUE))
+#ifndef HEAP_ALIGN_LOG
+/* default tiny heap size: 16KB */
+#define HEAP_ALIGN_LOG 15
+#endif
+#define HEAP_ALIGN (1UL << HEAP_ALIGN_LOG)
+#define HEAP_ALIGN_MASK (~(~0UL << HEAP_ALIGN_LOG))
+#define REQUIRED_SIZE_BY_MALLOC (sizeof(size_t) * 5)
+#define HEAP_SIZE (HEAP_ALIGN - REQUIRED_SIZE_BY_MALLOC)
+#define CEILDIV(i, mod) (((i) + (mod) - 1)/(mod))
+
+#define HEAP_OBJ_LIMIT (unsigned int)((HEAP_SIZE - sizeof(struct heaps_header))/sizeof(struct RVALUE))
+#define HEAP_BITMAP_LIMIT CEILDIV(CEILDIV(HEAP_SIZE, sizeof(struct RVALUE)), sizeof(uintptr_t)*8)
+#define HEAP_SLOT_SIZE (sizeof(struct heaps_slot) + (HEAP_BITMAP_LIMIT-1) * sizeof(uintptr_t))
+
+#define GET_HEAP_HEADER(x) (HEAP_HEADER(((uintptr_t)x) & ~(HEAP_ALIGN_MASK)))
+#define GET_HEAP_SLOT(x) (GET_HEAP_HEADER(x)->base)
+#define GET_HEAP_BITMAP(x) (GET_HEAP_HEADER(x)->bits)
+#define NUM_IN_SLOT(p) (((uintptr_t)p & HEAP_ALIGN_MASK)/sizeof(RVALUE))
+#define BITMAP_INDEX(p) (NUM_IN_SLOT(p) / (sizeof(uintptr_t) * 8))
+#define BITMAP_OFFSET(p) (NUM_IN_SLOT(p) & ((sizeof(uintptr_t) * 8)-1))
+#define MARKED_IN_BITMAP(bits, p) (bits[BITMAP_INDEX(p)] & ((uintptr_t)1 << BITMAP_OFFSET(p)))
+#define MARK_IN_BITMAP(bits, p) (bits[BITMAP_INDEX(p)] = bits[BITMAP_INDEX(p)] | ((uintptr_t)1 << BITMAP_OFFSET(p)))
+#define CLEAR_IN_BITMAP(bits, p) (bits[BITMAP_INDEX(p)] &= ~((uintptr_t)1 << BITMAP_OFFSET(p)))
 
 extern st_table *rb_class_tbl;
 
@@ -823,8 +898,10 @@ vm_xfree(rb_objspace_t *objspace, void *ptr)
     size_t size;
     ptr = ((size_t *)ptr) - 1;
     size = ((size_t*)ptr)[0];
-    objspace->malloc_params.allocated_size -= size;
-    objspace->malloc_params.allocations--;
+    if (size) {
+	objspace->malloc_params.allocated_size -= size;
+	objspace->malloc_params.allocations--;
+    }
 #endif
 
     free(ptr);
@@ -894,6 +971,27 @@ ruby_xfree(void *x)
 	vm_xfree(&rb_objspace, x);
 }
 
+#ifdef POOL_ALLOC_API
+/* POOL ALLOC API */
+#define POOL_ALLOC_PART 2
+#include "pool_alloc.inc.h"
+#undef POOL_ALLOC_PART
+
+void
+ruby_xpool_free(void *ptr)
+{
+    pool_free_entry((void**)ptr);
+}
+
+#define CONCRET_POOL_MALLOC(pnts) \
+void * ruby_xpool_malloc_##pnts##p () { \
+    return pool_alloc_entry(&rb_objspace.pool_headers->p##pnts ); \
+}
+CONCRET_POOL_MALLOC(6)
+CONCRET_POOL_MALLOC(11)
+#undef CONCRET_POOL_MALLOC
+
+#endif
 
 /*
  *  call-seq:
@@ -984,70 +1082,140 @@ rb_gc_unregister_address(VALUE *addr)
     }
 }
 
-
 static void
 allocate_sorted_heaps(rb_objspace_t *objspace, size_t next_heaps_length)
 {
-    struct sorted_heaps_slot *p;
-    size_t size;
+    struct heaps_header **p;
+    struct heaps_slot *slot;
+    size_t size, add, i;
 
-    size = next_heaps_length*sizeof(struct sorted_heaps_slot);
+    size = next_heaps_length*sizeof(struct heaps_header *);
+    add = next_heaps_length - heaps_used;
 
     if (heaps_used > 0) {
-	p = (struct sorted_heaps_slot *)realloc(objspace->heap.sorted, size);
+	p = (struct heaps_header **)realloc(objspace->heap.sorted, size);
 	if (p) objspace->heap.sorted = p;
     }
     else {
-	p = objspace->heap.sorted = (struct sorted_heaps_slot *)malloc(size);
+	p = objspace->heap.sorted = (struct heaps_header **)malloc(size);
     }
 
     if (p == 0) {
 	during_gc = 0;
 	rb_memerror();
     }
-    heaps_length = next_heaps_length;
+
+    for (i = 0; i < add; i++) {
+        slot = (struct heaps_slot *)malloc(HEAP_SLOT_SIZE);
+        if (slot == 0) {
+            during_gc = 0;
+            rb_memerror();
+            return;
+        }
+        slot->free_next = objspace->heap.reserve_slots;
+        objspace->heap.reserve_slots = slot;
+    }
+}
+
+static void *
+aligned_malloc(size_t alignment, size_t size)
+{
+    void *res;
+
+#if defined __MINGW32__
+    res = __mingw_aligned_malloc(size, alignment);
+#elif defined _WIN32 && !defined __CYGWIN__
+    res = _aligned_malloc(size, alignment);
+#elif defined(HAVE_POSIX_MEMALIGN)
+    if (posix_memalign(&res, alignment, size) == 0) {
+        return res;
+    }
+    else {
+        return NULL;
+    }
+#elif defined(HAVE_MEMALIGN)
+    res = memalign(alignment, size);
+#else
+    char* aligned;
+    res = malloc(alignment + size + sizeof(void*));
+    aligned = (char*)res + alignment + sizeof(void*);
+    aligned -= ((VALUE)aligned & (alignment - 1));
+    ((void**)aligned)[-1] = res;
+    res = (void*)aligned;
+#endif
+
+#if defined(_DEBUG) || defined(GC_DEBUG)
+    /* alignment must be a power of 2 */
+    assert((alignment - 1) & alignment == 0);
+    assert(alignment % sizeof(void*) == 0);
+#endif
+    return res;
+}
+
+static void
+aligned_free(void *ptr)
+{
+#if defined __MINGW32__
+    __mingw_aligned_free(ptr);
+#elif defined _WIN32 && !defined __CYGWIN__
+    _aligned_free(ptr);
+#elif defined(HAVE_MEMALIGN) || defined(HAVE_POSIX_MEMALIGN)
+    free(ptr);
+#else
+    free(((void**)ptr)[-1]);
+#endif
+}
+
+static void
+link_free_heap_slot(rb_objspace_t *objspace, struct heaps_slot *slot)
+{
+    slot->free_next = objspace->heap.free_slots;
+    objspace->heap.free_slots = slot;
+}
+
+static void
+unlink_free_heap_slot(rb_objspace_t *objspace, struct heaps_slot *slot)
+{
+    objspace->heap.free_slots = slot->free_next;
+    slot->free_next = NULL;
 }
 
 static void
 assign_heap_slot(rb_objspace_t *objspace)
 {
-    RVALUE *p, *pend, *membase;
+    RVALUE *p, *pend;
+    struct heaps_header *membase;
     struct heaps_slot *slot;
     size_t hi, lo, mid;
     size_t objs;
 
     objs = HEAP_OBJ_LIMIT;
-    p = (RVALUE*)malloc(HEAP_SIZE);
-    if (p == 0) {
-	during_gc = 0;
-	rb_memerror();
-    }
-    slot = (struct heaps_slot *)malloc(sizeof(struct heaps_slot));
-    if (slot == 0) {
-	xfree(p);
+    membase = (struct heaps_header*)aligned_malloc(HEAP_ALIGN, HEAP_SIZE);
+    if (membase == 0) {
 	during_gc = 0;
 	rb_memerror();
     }
+    assert(objspace->heap.reserve_slots != NULL);
+    slot = objspace->heap.reserve_slots;
+    objspace->heap.reserve_slots = slot->free_next;
     MEMZERO((void*)slot, struct heaps_slot, 1);
 
     slot->next = heaps;
     if (heaps) heaps->prev = slot;
     heaps = slot;
 
-    membase = p;
+    p = (RVALUE*)((VALUE)membase + sizeof(struct heaps_header));
     if ((VALUE)p % sizeof(RVALUE) != 0) {
-	p = (RVALUE*)((VALUE)p + sizeof(RVALUE) - ((VALUE)p % sizeof(RVALUE)));
-	if ((HEAP_SIZE - HEAP_OBJ_LIMIT * sizeof(RVALUE)) < (size_t)((char*)p - (char*)membase)) {
-	    objs--;
-	}
+       p = (RVALUE*)((VALUE)p + sizeof(RVALUE) - ((VALUE)p % sizeof(RVALUE)));
+       objs = (HEAP_SIZE - (size_t)((VALUE)p - (VALUE)membase))/sizeof(RVALUE);
     }
 
     lo = 0;
     hi = heaps_used;
     while (lo < hi) {
-	register RVALUE *mid_membase;
+	register struct heaps_header *mid_membase;
 	mid = (lo + hi) / 2;
-	mid_membase = objspace->heap.sorted[mid].slot->membase;
+        mid_membase = objspace->heap.sorted[mid];
 	if (mid_membase < membase) {
 	    lo = mid + 1;
 	}
@@ -1059,14 +1227,16 @@ assign_heap_slot(rb_objspace_t *objspace)
 	}
     }
     if (hi < heaps_used) {
-	MEMMOVE(&objspace->heap.sorted[hi+1], &objspace->heap.sorted[hi], struct sorted_heaps_slot, heaps_used - hi);
-    }
-    objspace->heap.sorted[hi].slot = slot;
-    objspace->heap.sorted[hi].start = p;
-    objspace->heap.sorted[hi].end = (p + objs);
+	MEMMOVE(&objspace->heap.sorted[hi+1], &objspace->heap.sorted[hi], struct heaps_header*, heaps_used - hi);
+    }
+    objspace->heap.sorted[hi] = membase;
+    membase->start = p;
+    membase->end = (p + objs);
+    membase->base = heaps;
+    membase->bits = heaps->bits;
+    membase->limit = objs;
     heaps->membase = membase;
-    heaps->slot = p;
-    heaps->limit = objs;
+    memset(heaps->bits, 0, HEAP_BITMAP_LIMIT * sizeof(uintptr_t));
     objspace->heap.free_num += objs;
     pend = p + objs;
     if (lomem == 0 || lomem > p) lomem = p;
@@ -1075,19 +1245,24 @@ assign_heap_slot(rb_objspace_t *objspace)
 
     while (p < pend) {
 	p->as.free.flags = 0;
-	p->as.free.next = freelist;
-	freelist = p;
+	p->as.free.next = heaps->freelist;
+	heaps->freelist = p;
 	p++;
     }
+    link_free_heap_slot(objspace, heaps);
 }
 
 static void
 add_heap_slots(rb_objspace_t *objspace, size_t add)
 {
     size_t i;
+    size_t next_heaps_length;
 
-    if ((heaps_used + add) > heaps_length) {
-        allocate_sorted_heaps(objspace, heaps_used + add);
+    next_heaps_length = heaps_used + add;
+
+    if (next_heaps_length > heaps_length) {
+        allocate_sorted_heaps(objspace, next_heaps_length);
+        heaps_length = next_heaps_length;
     }
 
     for (i = 0; i < add; i++) {
@@ -1137,6 +1312,7 @@ set_heaps_increment(rb_objspace_t *objspace)
 
     if (next_heaps_length > heaps_length) {
 	allocate_sorted_heaps(objspace, next_heaps_length);
+        heaps_length = next_heaps_length;
     }
 }
 
@@ -1159,6 +1335,7 @@ rb_during_gc(void)
 }
 
 #define RANY(o) ((RVALUE*)(o))
+#define has_free_object (objspace->heap.free_slots && objspace->heap.free_slots->freelist)
 
 VALUE
 rb_newobj(void)
@@ -1179,15 +1356,18 @@ rb_newobj(void)
 	}
     }
 
-    if (UNLIKELY(!freelist)) {
+    if (UNLIKELY(!has_free_object)) {
 	if (!gc_lazy_sweep(objspace)) {
 	    during_gc = 0;
 	    rb_memerror();
 	}
     }
 
-    obj = (VALUE)freelist;
-    freelist = freelist->as.free.next;
+    obj = (VALUE)objspace->heap.free_slots->freelist;
+    objspace->heap.free_slots->freelist = RANY(obj)->as.free.next;
+    if (objspace->heap.free_slots->freelist == NULL) {
+        unlink_free_heap_slot(objspace, objspace->heap.free_slots);
+    }
 
     MEMZERO((void*)obj, RVALUE, 1);
 #ifdef GC_DEBUG
@@ -1356,10 +1536,10 @@ gc_mark_all(rb_objspace_t *objspace)
 
     init_mark_stack(objspace);
     for (i = 0; i < heaps_used; i++) {
-	p = objspace->heap.sorted[i].start; pend = objspace->heap.sorted[i].end;
+	p = objspace->heap.sorted[i]->start; pend = objspace->heap.sorted[i]->end;
 	while (p < pend) {
-	    if ((p->as.basic.flags & FL_MARK) &&
-		(p->as.basic.flags != FL_MARK)) {
+	    if (MARKED_IN_BITMAP(GET_HEAP_BITMAP(p), p) &&
+		p->as.basic.flags) {
 		gc_mark_children(objspace, (VALUE)p, 0);
 	    }
 	    p++;
@@ -1387,26 +1567,27 @@ static inline int
 is_pointer_to_heap(rb_objspace_t *objspace, void *ptr)
 {
     register RVALUE *p = RANY(ptr);
-    register struct sorted_heaps_slot *heap;
+    register struct heaps_header *heap;
     register size_t hi, lo, mid;
 
     if (p < lomem || p > himem) return FALSE;
     if ((VALUE)p % sizeof(RVALUE) != 0) return FALSE;
+    heap = GET_HEAP_HEADER(p);
 
     /* check if p looks like a pointer using bsearch*/
     lo = 0;
     hi = heaps_used;
     while (lo < hi) {
 	mid = (lo + hi) / 2;
-	heap = &objspace->heap.sorted[mid];
-	if (heap->start <= p) {
-	    if (p < heap->end)
-		return TRUE;
-	    lo = mid + 1;
-	}
-	else {
-	    hi = mid;
-	}
+        if (heap > objspace->heap.sorted[mid]) {
+            lo = mid + 1;
+        }
+        else if (heap < objspace->heap.sorted[mid]) {
+            hi = mid;
+        }
+        else {
+            return (p >= heap->start && p < heap->end) ? TRUE : FALSE;
+        }
     }
     return FALSE;
 }
@@ -1449,10 +1630,10 @@ struct mark_tbl_arg {
 };
 
 static int
-mark_entry(ID key, VALUE value, st_data_t data)
+mark_entry(st_data_t key, st_data_t value, st_data_t data)
 {
     struct mark_tbl_arg *arg = (void*)data;
-    gc_mark(arg->objspace, value, arg->lev);
+    gc_mark(arg->objspace, (VALUE)value, arg->lev);
     return ST_CONTINUE;
 }
 
@@ -1467,10 +1648,10 @@ mark_tbl(rb_objspace_t *objspace, st_table *tbl, int lev)
 }
 
 static int
-mark_key(VALUE key, VALUE value, st_data_t data)
+mark_key(st_data_t key, st_data_t value, st_data_t data)
 {
     struct mark_tbl_arg *arg = (void*)data;
-    gc_mark(arg->objspace, key, arg->lev);
+    gc_mark(arg->objspace, (VALUE)key, arg->lev);
     return ST_CONTINUE;
 }
 
@@ -1491,11 +1672,11 @@ rb_mark_set(st_table *tbl)
 }
 
 static int
-mark_keyvalue(VALUE key, VALUE value, st_data_t data)
+mark_keyvalue(st_data_t key, st_data_t value, st_data_t data)
 {
     struct mark_tbl_arg *arg = (void*)data;
-    gc_mark(arg->objspace, key, arg->lev);
-    gc_mark(arg->objspace, value, arg->lev);
+    gc_mark(arg->objspace, (VALUE)key, arg->lev);
+    gc_mark(arg->objspace, (VALUE)value, arg->lev);
     return ST_CONTINUE;
 }
 
@@ -1565,7 +1746,9 @@ mark_m_tbl(rb_objspace_t *objspace, st_table *tbl, int lev)
 static int
 free_method_entry_i(ID key, rb_method_entry_t *me, st_data_t data)
 {
-    rb_free_method_entry(me);
+    if (!me->mark) {
+	rb_free_method_entry(me);
+    }
     return ST_CONTINUE;
 }
 
@@ -1622,6 +1805,16 @@ rb_gc_mark_maybe(VALUE obj)
     }
 }
 
+static int
+gc_mark_ptr(rb_objspace_t *objspace, VALUE ptr)
+{
+    register uintptr_t *bits = GET_HEAP_BITMAP(ptr);
+    if (MARKED_IN_BITMAP(bits, ptr)) return 0;
+    MARK_IN_BITMAP(bits, ptr);
+    objspace->heap.live_num++;
+    return 1;
+}
+
 static void
 gc_mark(rb_objspace_t *objspace, VALUE ptr, int lev)
 {
@@ -1630,9 +1823,7 @@ gc_mark(rb_objspace_t *objspace, VALUE ptr, int lev)
     obj = RANY(ptr);
     if (rb_special_const_p(ptr)) return; /* special const not marked */
     if (obj->as.basic.flags == 0) return;       /* free cell */
-    if (obj->as.basic.flags & FL_MARK) return;  /* already marked */
-    obj->as.basic.flags |= FL_MARK;
-    objspace->heap.live_num++;
+    if (!gc_mark_ptr(objspace, ptr)) return;	/* already marked */
 
     if (lev > GC_LEVEL_MAX || (lev == 0 && stack_check(STACKFRAME_FOR_GC_MARK))) {
 	if (!mark_stack_overflow) {
@@ -1659,6 +1850,7 @@ static void
 gc_mark_children(rb_objspace_t *objspace, VALUE ptr, int lev)
 {
     register RVALUE *obj = RANY(ptr);
+    register uintptr_t *bits;
 
     goto marking;		/* skip */
 
@@ -1666,8 +1858,9 @@ gc_mark_children(rb_objspace_t *objspace, VALUE ptr, int lev)
     obj = RANY(ptr);
     if (rb_special_const_p(ptr)) return; /* special const not marked */
     if (obj->as.basic.flags == 0) return;       /* free cell */
-    if (obj->as.basic.flags & FL_MARK) return;  /* already marked */
-    obj->as.basic.flags |= FL_MARK;
+    bits = GET_HEAP_BITMAP(ptr);
+    if (MARKED_IN_BITMAP(bits, ptr)) return;  /* already marked */
+    MARK_IN_BITMAP(bits, ptr);
     objspace->heap.live_num++;
 
   marking:
@@ -1819,6 +2012,7 @@ gc_mark_children(rb_objspace_t *objspace, VALUE ptr, int lev)
       case T_CLASS:
       case T_MODULE:
 	mark_m_tbl(objspace, RCLASS_M_TBL(obj), lev);
+	if (!RCLASS_EXT(obj)) break;
 	mark_tbl(objspace, RCLASS_IV_TBL(obj), lev);
 	mark_const_tbl(objspace, RCLASS_CONST_TBL(obj), lev);
 	ptr = RCLASS_SUPER(obj);
@@ -1929,15 +2123,22 @@ gc_mark_children(rb_objspace_t *objspace, VALUE ptr, int lev)
 
 static int obj_free(rb_objspace_t *, VALUE);
 
-static inline void
-add_freelist(rb_objspace_t *objspace, RVALUE *p)
+static inline struct heaps_slot *
+add_slot_local_freelist(rb_objspace_t *objspace, RVALUE *p)
 {
+    struct heaps_slot *slot;
+
     VALGRIND_MAKE_MEM_UNDEFINED((void*)p, sizeof(RVALUE));
     p->as.free.flags = 0;
-    p->as.free.next = freelist;
-    freelist = p;
+    slot = GET_HEAP_SLOT(p);
+    p->as.free.next = slot->freelist;
+    slot->freelist = p;
+
+    return slot;
 }
 
+static void free_unused_heap(rb_objspace_t *objspace, struct heaps_header *heap);
+
 static void
 finalize_list(rb_objspace_t *objspace, RVALUE *p)
 {
@@ -1945,17 +2146,16 @@ finalize_list(rb_objspace_t *objspace, RVALUE *p)
 	RVALUE *tmp = p->as.free.next;
 	run_final(objspace, (VALUE)p);
 	if (!FL_TEST(p, FL_SINGLETON)) { /* not freeing page */
-            if (objspace->heap.sweep_slots) {
-                p->as.free.flags = 0;
-            }
-            else {
+            add_slot_local_freelist(objspace, p);
+            if (!is_lazy_sweeping(objspace)) {
                 GC_PROF_DEC_LIVE_NUM;
-                add_freelist(objspace, p);
             }
 	}
 	else {
-	    struct heaps_slot *slot = (struct heaps_slot *)(VALUE)RDATA(p)->dmark;
-	    slot->limit--;
+            struct heaps_header *heap = GET_HEAP_HEADER(p);
+            if (--heap->limit == 0) {
+                free_unused_heap(objspace, heap);
+            }
 	}
 	p = tmp;
     }
@@ -1976,97 +2176,106 @@ unlink_heap_slot(rb_objspace_t *objspace, struct heaps_slot *slot)
     slot->next = NULL;
 }
 
-
 static void
-free_unused_heaps(rb_objspace_t *objspace)
+free_unused_heap(rb_objspace_t *objspace, struct heaps_header *heap)
 {
-    size_t i, j;
-    RVALUE *last = 0;
-
-    for (i = j = 1; j < heaps_used; i++) {
-	if (objspace->heap.sorted[i].slot->limit == 0) {
-	    if (!last) {
-		last = objspace->heap.sorted[i].slot->membase;
-	    }
-	    else {
-		free(objspace->heap.sorted[i].slot->membase);
-	    }
-            free(objspace->heap.sorted[i].slot);
-	    heaps_used--;
-	}
-	else {
-	    if (i != j) {
-		objspace->heap.sorted[j] = objspace->heap.sorted[i];
-	    }
-	    j++;
-	}
-    }
-    if (last) {
-	if (last < heaps_freed) {
-	    free(heaps_freed);
-	    heaps_freed = last;
-	}
-	else {
-	    free(last);
-	}
+    register size_t hi, lo, mid;
+    lo = 0;
+    hi = heaps_used;
+    while (lo < hi) {
+        mid = (lo + hi) / 2;
+        if (heap > objspace->heap.sorted[mid]) {
+            lo = mid + 1;
+        }
+        else if (heap < objspace->heap.sorted[mid]) {
+            hi = mid;
+        }
+        else {
+            /* remove unused heap */
+            struct heaps_slot* h = objspace->heap.sorted[mid]->base;
+            h->free_next = objspace->heap.reserve_slots;
+            objspace->heap.reserve_slots = h;
+            aligned_free(objspace->heap.sorted[mid]);
+            heaps_used--;
+            MEMMOVE(objspace->heap.sorted + mid, objspace->heap.sorted + mid + 1,
+                    struct heaps_header *, heaps_used - mid);
+            return;
+        }
     }
 }
 
 static void
+gc_clear_slot_bits(struct heaps_slot *slot)
+{
+    memset(slot->bits, 0, HEAP_BITMAP_LIMIT * sizeof(uintptr_t));
+}
+
+static void
 slot_sweep(rb_objspace_t *objspace, struct heaps_slot *sweep_slot)
 {
     size_t free_num = 0, final_num = 0;
     RVALUE *p, *pend;
-    RVALUE *free = freelist, *final = deferred_final_list;
+    RVALUE *final = deferred_final_list;
     int deferred;
+    uintptr_t *bits;
 
-    p = sweep_slot->slot; pend = p + sweep_slot->limit;
+    p = sweep_slot->membase->start; pend = sweep_slot->membase->end;
+    bits = sweep_slot->bits;
     while (p < pend) {
-        if (!(p->as.basic.flags & FL_MARK)) {
-            if (p->as.basic.flags &&
-                ((deferred = obj_free(objspace, (VALUE)p)) ||
-		 (FL_TEST(p, FL_FINALIZE)))) {
-                if (!deferred) {
-                    p->as.free.flags = T_ZOMBIE;
-                    RDATA(p)->dfree = 0;
+        if ((!(MARKED_IN_BITMAP(bits, p))) && BUILTIN_TYPE(p) != T_ZOMBIE) {
+            if (p->as.basic.flags) {
+                if ((deferred = obj_free(objspace, (VALUE)p)) ||
+                    (FL_TEST(p, FL_FINALIZE))) {
+                    if (!deferred) {
+                        p->as.free.flags = T_ZOMBIE;
+                        RDATA(p)->dfree = 0;
+                    }
+                    p->as.free.next = deferred_final_list;
+                    deferred_final_list = p;
+                    assert(BUILTIN_TYPE(p) == T_ZOMBIE);
+                    final_num++;
+                }
+                else {
+                    VALGRIND_MAKE_MEM_UNDEFINED((void*)p, sizeof(RVALUE));
+                    p->as.free.flags = 0;
+                    p->as.free.next = sweep_slot->freelist;
+                    sweep_slot->freelist = p;
+                    free_num++;
                 }
-                p->as.free.flags |= FL_MARK;
-                p->as.free.next = deferred_final_list;
-                deferred_final_list = p;
-                final_num++;
             }
             else {
-                add_freelist(objspace, p);
                 free_num++;
             }
         }
-        else if (BUILTIN_TYPE(p) == T_ZOMBIE) {
-            /* objects to be finalized */
-            /* do nothing remain marked */
-        }
-        else {
-            RBASIC(p)->flags &= ~FL_MARK;
-        }
         p++;
     }
-    if (final_num + free_num == sweep_slot->limit &&
+    gc_clear_slot_bits(sweep_slot);
+    if (final_num + free_num == sweep_slot->membase->limit &&
         objspace->heap.free_num > objspace->heap.do_heap_free) {
         RVALUE *pp;
 
         for (pp = deferred_final_list; pp != final; pp = pp->as.free.next) {
-	    RDATA(pp)->dmark = (void (*)(void *))(VALUE)sweep_slot;
+	    RDATA(pp)->dmark = 0;
             pp->as.free.flags |= FL_SINGLETON; /* freeing page mark */
         }
-        sweep_slot->limit = final_num;
-        freelist = free;	/* cancel this page from freelist */
+        sweep_slot->membase->limit = final_num;
         unlink_heap_slot(objspace, sweep_slot);
+        if (final_num == 0) {
+            free_unused_heap(objspace, sweep_slot->membase);
+        }
     }
     else {
+        if (free_num > 0) {
+            link_free_heap_slot(objspace, sweep_slot);
+        }
+        else {
+            sweep_slot->free_next = NULL;
+        }
         objspace->heap.free_num += free_num;
     }
     objspace->heap.final_num += final_num;
 
-    if (deferred_final_list) {
+    if (deferred_final_list && !finalizing) {
         rb_thread_t *th = GET_THREAD();
         if (th) {
             RUBY_VM_SET_FINALIZER_INTERRUPT(th);
@@ -2078,7 +2287,7 @@ static int
 ready_to_gc(rb_objspace_t *objspace)
 {
     if (dont_gc || during_gc) {
-	if (!freelist) {
+	if (!has_free_object) {
             if (!heaps_increment(objspace)) {
                 set_heaps_increment(objspace);
                 heaps_increment(objspace);
@@ -2092,7 +2301,6 @@ ready_to_gc(rb_objspace_t *objspace)
 static void
 before_gc_sweep(rb_objspace_t *objspace)
 {
-    freelist = 0;
     objspace->heap.do_heap_free = (size_t)((heaps_used * HEAP_OBJ_LIMIT) * 0.65);
     objspace->heap.free_min = (size_t)((heaps_used * HEAP_OBJ_LIMIT)  * 0.2);
     if (objspace->heap.free_min < initial_free_min) {
@@ -2101,6 +2309,7 @@ before_gc_sweep(rb_objspace_t *objspace)
     }
     objspace->heap.sweep_slots = heaps;
     objspace->heap.free_num = 0;
+    objspace->heap.free_slots = NULL;
 
     /* sweep unlinked method entries */
     if (GET_VM()->unlinked_method_entry_list) {
@@ -2123,8 +2332,6 @@ after_gc_sweep(rb_objspace_t *objspace)
 	if (malloc_limit < initial_malloc_limit) malloc_limit = initial_malloc_limit;
     }
     malloc_increase = 0;
-
-    free_unused_heaps(objspace);
 }
 
 static int
@@ -2137,7 +2344,7 @@ lazy_sweep(rb_objspace_t *objspace)
         next = objspace->heap.sweep_slots->next;
 	slot_sweep(objspace, objspace->heap.sweep_slots);
         objspace->heap.sweep_slots = next;
-        if (freelist) {
+        if (has_free_object) {
             during_gc = 0;
             return TRUE;
         }
@@ -2149,10 +2356,10 @@ static void
 rest_sweep(rb_objspace_t *objspace)
 {
     if (objspace->heap.sweep_slots) {
-       while (objspace->heap.sweep_slots) {
-           lazy_sweep(objspace);
-       }
-       after_gc_sweep(objspace);
+	while (objspace->heap.sweep_slots) {
+	    lazy_sweep(objspace);
+	}
+	after_gc_sweep(objspace);
     }
 }
 
@@ -2199,9 +2406,9 @@ gc_lazy_sweep(rb_objspace_t *objspace)
     }
 
     GC_PROF_SWEEP_TIMER_START;
-    if(!(res = lazy_sweep(objspace))) {
+    if (!(res = lazy_sweep(objspace))) {
         after_gc_sweep(objspace);
-        if(freelist) {
+        if (has_free_object) {
             res = TRUE;
             during_gc = 0;
         }
@@ -2234,12 +2441,17 @@ void
 rb_gc_force_recycle(VALUE p)
 {
     rb_objspace_t *objspace = &rb_objspace;
-    GC_PROF_DEC_LIVE_NUM;
-    if (RBASIC(p)->flags & FL_MARK) {
-        RANY(p)->as.free.flags = 0;
+    struct heaps_slot *slot;
+
+    if (MARKED_IN_BITMAP(GET_HEAP_BITMAP(p), p)) {
+        add_slot_local_freelist(objspace, (RVALUE *)p);
     }
     else {
-        add_freelist(objspace, (RVALUE *)p);
+        GC_PROF_DEC_LIVE_NUM;
+        slot = add_slot_local_freelist(objspace, (RVALUE *)p);
+        if (slot->free_next == NULL) {
+            link_free_heap_slot(objspace, slot);
+        }
     }
 }
 
@@ -2611,7 +2823,7 @@ static VALUE
 objspace_each_objects(VALUE arg)
 {
     size_t i;
-    RVALUE *membase = 0;
+    struct heaps_header *membase = 0;
     RVALUE *pstart, *pend;
     rb_objspace_t *objspace = &rb_objspace;
     struct each_obj_args *args = (struct each_obj_args *)arg;
@@ -2619,16 +2831,16 @@ objspace_each_objects(VALUE arg)
 
     i = 0;
     while (i < heaps_used) {
-	while (0 < i && (uintptr_t)membase < (uintptr_t)objspace->heap.sorted[i-1].slot->membase)
+	while (0 < i && membase < objspace->heap.sorted[i-1])
 	    i--;
-	while (i < heaps_used && (uintptr_t)objspace->heap.sorted[i].slot->membase <= (uintptr_t)membase)
+	while (i < heaps_used && objspace->heap.sorted[i] <= membase)
 	    i++;
 	if (heaps_used <= i)
 	  break;
-	membase = objspace->heap.sorted[i].slot->membase;
+	membase = objspace->heap.sorted[i];
 
-	pstart = objspace->heap.sorted[i].slot->slot;
-	pend = pstart + objspace->heap.sorted[i].slot->limit;
+	pstart = membase->start;
+	pend = membase->end;
 
 	for (; pstart != pend; pstart++) {
 	    if (pstart->as.basic.flags) {
@@ -2642,6 +2854,7 @@ objspace_each_objects(VALUE arg)
 	    }
 	}
     }
+    RB_GC_GUARD(v);
 
     return Qnil;
 }
@@ -2885,11 +3098,12 @@ run_single_final(VALUE arg)
 }
 
 static void
-run_finalizer(rb_objspace_t *objspace, VALUE objid, VALUE table)
+run_finalizer(rb_objspace_t *objspace, VALUE obj, VALUE table)
 {
     long i;
     int status;
     VALUE args[3];
+    VALUE objid = nonspecial_obj_id(obj);
 
     if (RARRAY_LEN(table) > 0) {
 	args[1] = rb_obj_freeze(rb_ary_new3(1, objid));
@@ -2913,13 +3127,11 @@ run_finalizer(rb_objspace_t *objspace, VALUE objid, VALUE table)
 static void
 run_final(rb_objspace_t *objspace, VALUE obj)
 {
-    VALUE objid;
     RUBY_DATA_FUNC free_func = 0;
     st_data_t key, table;
 
     objspace->heap.final_num--;
 
-    objid = rb_obj_id(obj);	/* make obj into id */
     RBASIC(obj)->klass = 0;
 
     if (RTYPEDDATA_P(obj)) {
@@ -2934,7 +3146,7 @@ run_final(rb_objspace_t *objspace, VALUE obj)
 
     key = (st_data_t)obj;
     if (st_delete(finalizer_table, &key, &table)) {
-	run_finalizer(objspace, objid, (VALUE)table);
+	run_finalizer(objspace, obj, (VALUE)table);
     }
 }
 
@@ -2952,16 +3164,20 @@ finalize_deferred(rb_objspace_t *objspace)
 void
 rb_gc_finalize_deferred(void)
 {
-    finalize_deferred(&rb_objspace);
+    rb_objspace_t *objspace = &rb_objspace;
+    if (ATOMIC_EXCHANGE(finalizing, 1)) return;
+    finalize_deferred(objspace);
+    ATOMIC_SET(finalizing, 0);
 }
 
 static int
 chain_finalized_object(st_data_t key, st_data_t val, st_data_t arg)
 {
     RVALUE *p = (RVALUE *)key, **final_list = (RVALUE **)arg;
-    if ((p->as.basic.flags & (FL_FINALIZE|FL_MARK)) == FL_FINALIZE) {
+    if ((p->as.basic.flags & FL_FINALIZE) == FL_FINALIZE &&
+        !MARKED_IN_BITMAP(GET_HEAP_BITMAP(p), p)) {
 	if (BUILTIN_TYPE(p) != T_ZOMBIE) {
-	    p->as.free.flags = FL_MARK | T_ZOMBIE; /* remain marked */
+	    p->as.free.flags = T_ZOMBIE;
 	    RDATA(p)->dfree = 0;
 	}
 	p->as.free.next = *final_list;
@@ -3004,6 +3220,8 @@ rb_objspace_call_finalizer(rb_objspace_t *objspace)
     /* run finalizers */
     rest_sweep(objspace);
 
+    if (ATOMIC_EXCHANGE(finalizing, 1)) return;
+
     do {
 	/* XXX: this loop will make no sense */
 	/* because mark will not be removed */
@@ -3018,8 +3236,9 @@ rb_objspace_call_finalizer(rb_objspace_t *objspace)
 	st_foreach(finalizer_table, force_chain_object, (st_data_t)&list);
 	while (list) {
 	    struct force_finalize_list *curr = list;
-	    run_finalizer(objspace, rb_obj_id(curr->obj), curr->table);
-	    st_delete(finalizer_table, (st_data_t*)&curr->obj, 0);
+	    st_data_t obj = (st_data_t)curr->obj;
+	    run_finalizer(objspace, curr->obj, curr->table);
+	    st_delete(finalizer_table, &obj, 0);
 	    list = curr->next;
 	    xfree(curr);
 	}
@@ -3030,7 +3249,7 @@ rb_objspace_call_finalizer(rb_objspace_t *objspace)
 
     /* run data object's finalizers */
     for (i = 0; i < heaps_used; i++) {
-	p = objspace->heap.sorted[i].start; pend = objspace->heap.sorted[i].end;
+	p = objspace->heap.sorted[i]->start; pend = objspace->heap.sorted[i]->end;
 	while (p < pend) {
 	    if (BUILTIN_TYPE(p) == T_DATA &&
 		DATA_PTR(p) && RANY(p)->as.data.dfree &&
@@ -3066,6 +3285,7 @@ rb_objspace_call_finalizer(rb_objspace_t *objspace)
 
     st_free_table(finalizer_table);
     finalizer_table = 0;
+    ATOMIC_SET(finalizing, 0);
 }
 
 void
@@ -3073,8 +3293,39 @@ rb_gc(void)
 {
     rb_objspace_t *objspace = &rb_objspace;
     garbage_collect(objspace);
-    finalize_deferred(objspace);
-    free_unused_heaps(objspace);
+    if (!finalizing) finalize_deferred(objspace);
+}
+
+static inline int
+is_id_value(rb_objspace_t *objspace, VALUE ptr)
+{
+    if (!is_pointer_to_heap(objspace, (void *)ptr)) return FALSE;
+    if (BUILTIN_TYPE(ptr) > T_FIXNUM) return FALSE;
+    if (BUILTIN_TYPE(ptr) == T_ICLASS) return FALSE;
+    return TRUE;
+}
+
+static inline int
+is_dead_object(rb_objspace_t *objspace, VALUE ptr)
+{
+    struct heaps_slot *slot = objspace->heap.sweep_slots;
+    if (!is_lazy_sweeping(objspace) || MARKED_IN_BITMAP(GET_HEAP_BITMAP(ptr), ptr))
+	return FALSE;
+    while (slot) {
+	if ((VALUE)slot->membase->start <= ptr && ptr < (VALUE)(slot->membase->end))
+	    return TRUE;
+	slot = slot->next;
+    }
+    return FALSE;
+}
+
+static inline int
+is_live_object(rb_objspace_t *objspace, VALUE ptr)
+{
+    if (BUILTIN_TYPE(ptr) == 0) return FALSE;
+    if (RBASIC(ptr)->klass == 0) return FALSE;
+    if (is_dead_object(objspace, ptr)) return FALSE;
+    return TRUE;
 }
 
 /*
@@ -3119,11 +3370,10 @@ id2ref(VALUE obj, VALUE objid)
 	return ID2SYM(symid);
     }
 
-    if (!is_pointer_to_heap(objspace, (void *)ptr) ||
-	BUILTIN_TYPE(ptr) > T_FIXNUM || BUILTIN_TYPE(ptr) == T_ICLASS) {
+    if (!is_id_value(objspace, ptr)) {
 	rb_raise(rb_eRangeError, "%p is not id value", p0);
     }
-    if (BUILTIN_TYPE(ptr) == 0 || RBASIC(ptr)->klass == 0) {
+    if (!is_live_object(objspace, ptr)) {
 	rb_raise(rb_eRangeError, "%p is recycled object", p0);
     }
     return (VALUE)ptr;
@@ -3193,7 +3443,7 @@ rb_obj_id(VALUE obj)
     if (SPECIAL_CONST_P(obj)) {
         return LONG2NUM((SIGNED_VALUE)obj);
     }
-    return (VALUE)((SIGNED_VALUE)obj|FIXNUM_FLAG);
+    return nonspecial_obj_id(obj);
 }
 
 static int
@@ -3236,7 +3486,7 @@ count_objects(int argc, VALUE *argv, VALUE os)
     VALUE hash;
 
     if (rb_scan_args(argc, argv, "01", &hash) == 1) {
-        if (TYPE(hash) != T_HASH)
+        if (!RB_TYPE_P(hash, T_HASH))
             rb_raise(rb_eTypeError, "non-hash given");
     }
 
@@ -3247,7 +3497,7 @@ count_objects(int argc, VALUE *argv, VALUE os)
     for (i = 0; i < heaps_used; i++) {
         RVALUE *p, *pend;
 
-        p = objspace->heap.sorted[i].start; pend = objspace->heap.sorted[i].end;
+        p = objspace->heap.sorted[i]->start; pend = objspace->heap.sorted[i]->end;
         for (;p < pend; p++) {
             if (p->as.basic.flags) {
                 counts[BUILTIN_TYPE(p)]++;
@@ -3256,7 +3506,7 @@ count_objects(int argc, VALUE *argv, VALUE os)
                 freed++;
             }
         }
-        total += objspace->heap.sorted[i].slot->limit;
+        total += objspace->heap.sorted[i]->limit;
     }
 
     if (hash == Qnil) {
@@ -3355,7 +3605,7 @@ gc_stat(int argc, VALUE *argv, VALUE self)
     VALUE hash;
 
     if (rb_scan_args(argc, argv, "01", &hash) == 1) {
-        if (TYPE(hash) != T_HASH)
+        if (!RB_TYPE_P(hash, T_HASH))
             rb_raise(rb_eTypeError, "non-hash given");
     }
 
@@ -3410,6 +3660,33 @@ gc_malloc_allocations(VALUE self)
 }
 #endif
 
+/*
+ *  call-seq:
+ *     GC::Profiler.raw_data -> [Hash, ...]
+ *
+ *  Returns an Array of individual raw profile data Hashes ordered
+ *  from earliest to latest by <tt>:GC_INVOKE_TIME</tt>.  For example:
+ *
+ *    [{:GC_TIME=>1.3000000000000858e-05,
+ *      :GC_INVOKE_TIME=>0.010634999999999999,
+ *      :HEAP_USE_SIZE=>289640,
+ *      :HEAP_TOTAL_SIZE=>588960,
+ *      :HEAP_TOTAL_OBJECTS=>14724,
+ *      :GC_IS_MARKED=>false},
+ *      ...
+ *    ]
+ *
+ *  The keys mean:
+ *
+ *  +:GC_TIME+:: Time taken for this run in milliseconds
+ *  +:GC_INVOKE_TIME+:: Time the GC was invoked since startup in seconds
+ *  +:HEAP_USE_SIZE+:: Bytes of heap used
+ *  +:HEAP_TOTAL_SIZE+:: Size of heap in bytes
+ *  +:HEAP_TOTAL_OBJECTS+:: Number of objects
+ *  +:GC_IS_MARKED+:: Is the GC in the mark phase
+ *
+ */
+
 static VALUE
 gc_profile_record_get(void)
 {
@@ -3602,6 +3879,7 @@ Init_GC(void)
     rb_mProfiler = rb_define_module_under(rb_mGC, "Profiler");
     rb_define_singleton_method(rb_mProfiler, "enabled?", gc_profile_enable_get, 0);
     rb_define_singleton_method(rb_mProfiler, "enable", gc_profile_enable, 0);
+    rb_define_singleton_method(rb_mProfiler, "raw_data", gc_profile_record_get, 0);
     rb_define_singleton_method(rb_mProfiler, "disable", gc_profile_disable, 0);
     rb_define_singleton_method(rb_mProfiler, "clear", gc_profile_clear, 0);
     rb_define_singleton_method(rb_mProfiler, "result", gc_profile_result, 0);
diff --git a/hash.c b/hash.c
index fbd8237..32917c3 100644
--- a/hash.c
+++ b/hash.c
@@ -44,7 +44,7 @@ rb_any_cmp(VALUE a, VALUE b)
     if (FIXNUM_P(a) && FIXNUM_P(b)) {
 	return a != b;
     }
-    if (TYPE(a) == T_STRING && RBASIC(a)->klass == rb_cString &&
+    if (RB_TYPE_P(a, T_STRING) && RBASIC(a)->klass == rb_cString &&
 	TYPE(b) == T_STRING && RBASIC(b)->klass == rb_cString) {
 	return rb_str_hash_cmp(a, b);
     }
@@ -80,20 +80,14 @@ rb_any_hash(VALUE a)
     VALUE hval;
     st_index_t hnum;
 
-    switch (TYPE(a)) {
-      case T_FIXNUM:
-      case T_SYMBOL:
-      case T_NIL:
-      case T_FALSE:
-      case T_TRUE:
-	hnum = rb_hash_end(rb_hash_start((unsigned int)a));
-	break;
-
-      case T_STRING:
+    if (SPECIAL_CONST_P(a)) {
+	if (a == Qundef) return 0;
+	hnum = rb_hash_end(rb_hash_start((st_index_t)a));
+    }
+    else if (BUILTIN_TYPE(a) == T_STRING) {
 	hnum = rb_str_hash(a);
-	break;
-
-      default:
+    }
+    else {
         hval = rb_hash(a);
 	hnum = FIX2LONG(hval);
     }
@@ -106,10 +100,8 @@ static const struct st_hash_type objhash = {
     rb_any_hash,
 };
 
-static const struct st_hash_type identhash = {
-    st_numcmp,
-    st_numhash,
-};
+extern const struct st_hash_type st_hashtype_num;
+#define identhash st_hashtype_num
 
 typedef int st_foreach_func(st_data_t, st_data_t, st_data_t);
 
@@ -124,7 +116,6 @@ foreach_safe_i(st_data_t key, st_data_t value, struct foreach_safe_arg *arg)
 {
     int status;
 
-    if (key == Qundef) return ST_CONTINUE;
     status = (*arg->func)(key, value, arg->arg);
     if (status == ST_CONTINUE) {
 	return ST_CHECK;
@@ -140,7 +131,7 @@ st_foreach_safe(st_table *table, int (*func)(ANYARGS), st_data_t a)
     arg.tbl = table;
     arg.func = (st_foreach_func *)func;
     arg.arg = a;
-    if (st_foreach(table, foreach_safe_i, (st_data_t)&arg)) {
+    if (st_foreach_check(table, foreach_safe_i, (st_data_t)&arg, 0)) {
 	rb_raise(rb_eRuntimeError, "hash modified during iteration");
     }
 }
@@ -154,21 +145,21 @@ struct hash_foreach_arg {
 };
 
 static int
-hash_foreach_iter(st_data_t key, st_data_t value, struct hash_foreach_arg *arg)
+hash_foreach_iter(st_data_t key, st_data_t value, st_data_t argp)
 {
+    struct hash_foreach_arg *arg = (struct hash_foreach_arg *)argp;
     int status;
     st_table *tbl;
 
     tbl = RHASH(arg->hash)->ntbl;
-    if ((VALUE)key == Qundef) return ST_CONTINUE;
     status = (*arg->func)((VALUE)key, (VALUE)value, arg->arg);
     if (RHASH(arg->hash)->ntbl != tbl) {
 	rb_raise(rb_eRuntimeError, "rehash occurred during iteration");
     }
     switch (status) {
       case ST_DELETE:
-	st_delete_safe(tbl, &key, 0, Qundef);
 	FL_SET(arg->hash, HASH_DELETED);
+	return ST_DELETE;
       case ST_CONTINUE:
 	break;
       case ST_STOP:
@@ -184,7 +175,7 @@ hash_foreach_ensure(VALUE hash)
 
     if (RHASH(hash)->iter_lev == 0) {
 	if (FL_TEST(hash, HASH_DELETED)) {
-	    st_cleanup_safe(RHASH(hash)->ntbl, Qundef);
+	    st_cleanup_safe(RHASH(hash)->ntbl, (st_data_t)Qundef);
 	    FL_UNSET(hash, HASH_DELETED);
 	}
     }
@@ -192,9 +183,10 @@ hash_foreach_ensure(VALUE hash)
 }
 
 static VALUE
-hash_foreach_call(struct hash_foreach_arg *arg)
+hash_foreach_call(VALUE arg)
 {
-    if (st_foreach(RHASH(arg->hash)->ntbl, hash_foreach_iter, (st_data_t)arg)) {
+    VALUE hash = ((struct hash_foreach_arg *)arg)->hash;
+    if (st_foreach_check(RHASH(hash)->ntbl, hash_foreach_iter, (st_data_t)arg, (st_data_t)Qundef)) {
 	rb_raise(rb_eRuntimeError, "hash modified during iteration");
     }
     return Qnil;
@@ -447,7 +439,7 @@ rb_hash_rehash_i(VALUE key, VALUE value, VALUE arg)
 {
     st_table *tbl = (st_table *)arg;
 
-    if (key != Qundef) st_insert(tbl, key, value);
+    st_insert(tbl, (st_data_t)key, (st_data_t)value);
     return ST_CONTINUE;
 }
 
@@ -490,6 +482,20 @@ rb_hash_rehash(VALUE hash)
     return hash;
 }
 
+static VALUE
+hash_default_value(VALUE hash, VALUE key)
+{
+    if (rb_method_basic_definition_p(CLASS_OF(hash), id_default)) {
+	VALUE ifnone = RHASH_IFNONE(hash);
+	if (!FL_TEST(hash, HASH_PROC_DEFAULT)) return ifnone;
+	if (key == Qundef) return Qnil;
+	return rb_funcall(ifnone, id_yield, 2, hash, key);
+    }
+    else {
+	return rb_funcall(hash, id_default, 1, key);
+    }
+}
+
 /*
  *  call-seq:
  *     hsh[key]    ->  value
@@ -510,13 +516,7 @@ rb_hash_aref(VALUE hash, VALUE key)
     st_data_t val;
 
     if (!RHASH(hash)->ntbl || !st_lookup(RHASH(hash)->ntbl, key, &val)) {
-	if (!FL_TEST(hash, HASH_PROC_DEFAULT) &&
-	    rb_method_basic_definition_p(CLASS_OF(hash), id_default)) {
-	    return RHASH_IFNONE(hash);
-	}
-	else {
-	    return rb_funcall(hash, id_default, 1, key);
-	}
+	return hash_default_value(hash, key);
     }
     return (VALUE)val;
 }
@@ -659,7 +659,7 @@ rb_hash_default(int argc, VALUE *argv, VALUE hash)
 static VALUE
 rb_hash_set_default(VALUE hash, VALUE ifnone)
 {
-    rb_hash_modify(hash);
+    rb_hash_modify_check(hash);
     RHASH_IFNONE(hash) = ifnone;
     FL_UNSET(hash, HASH_PROC_DEFAULT);
     return ifnone;
@@ -707,7 +707,7 @@ rb_hash_set_default_proc(VALUE hash, VALUE proc)
 {
     VALUE b;
 
-    rb_hash_modify(hash);
+    rb_hash_modify_check(hash);
     b = rb_check_convert_type(proc, T_DATA, "Proc", "to_proc");
     if (NIL_P(b) || !rb_obj_is_proc(b)) {
 	rb_raise(rb_eTypeError,
@@ -776,7 +776,7 @@ rb_hash_delete_key(VALUE hash, VALUE key)
     if (!RHASH(hash)->ntbl)
         return Qundef;
     if (RHASH(hash)->iter_lev > 0) {
-	if (st_delete_safe(RHASH(hash)->ntbl, &ktmp, &val, Qundef)) {
+	if (st_delete_safe(RHASH(hash)->ntbl, &ktmp, &val, (st_data_t)Qundef)) {
 	    FL_SET(hash, HASH_DELETED);
 	    return (VALUE)val;
 	}
@@ -809,7 +809,7 @@ rb_hash_delete(VALUE hash, VALUE key)
 {
     VALUE val;
 
-    rb_hash_modify(hash);
+    rb_hash_modify_check(hash);
     val = rb_hash_delete_key(hash, key);
     if (val != Qundef) return val;
     if (rb_block_given_p()) {
@@ -828,7 +828,6 @@ shift_i(VALUE key, VALUE value, VALUE arg)
 {
     struct shift_var *var = (struct shift_var *)arg;
 
-    if (key == Qundef) return ST_CONTINUE;
     if (var->key != Qundef) return ST_STOP;
     var->key = key;
     var->val = value;
@@ -840,7 +839,6 @@ shift_i_safe(VALUE key, VALUE value, VALUE arg)
 {
     struct shift_var *var = (struct shift_var *)arg;
 
-    if (key == Qundef) return ST_CONTINUE;
     var->key = key;
     var->val = value;
     return ST_STOP;
@@ -864,29 +862,25 @@ rb_hash_shift(VALUE hash)
 {
     struct shift_var var;
 
-    rb_hash_modify(hash);
-    var.key = Qundef;
-    rb_hash_foreach(hash, RHASH(hash)->iter_lev > 0 ? shift_i_safe : shift_i,
-		    (VALUE)&var);
-
-    if (var.key != Qundef) {
-	if (RHASH(hash)->iter_lev > 0) {
-	    rb_hash_delete_key(hash, var.key);
+    rb_hash_modify_check(hash);
+    if (RHASH(hash)->ntbl) {
+	var.key = Qundef;
+	rb_hash_foreach(hash, RHASH(hash)->iter_lev > 0 ? shift_i_safe : shift_i,
+			(VALUE)&var);
+
+	if (var.key != Qundef) {
+	    if (RHASH(hash)->iter_lev > 0) {
+		rb_hash_delete_key(hash, var.key);
+	    }
+	    return rb_assoc_new(var.key, var.val);
 	}
-	return rb_assoc_new(var.key, var.val);
-    }
-    else if (FL_TEST(hash, HASH_PROC_DEFAULT)) {
-	return rb_funcall(RHASH_IFNONE(hash), id_yield, 2, hash, Qnil);
-    }
-    else {
-	return RHASH_IFNONE(hash);
     }
+    return hash_default_value(hash, Qnil);
 }
 
 static int
 delete_if_i(VALUE key, VALUE value, VALUE hash)
 {
-    if (key == Qundef) return ST_CONTINUE;
     if (RTEST(rb_yield_values(2, key, value))) {
 	rb_hash_delete_key(hash, key);
     }
@@ -912,8 +906,9 @@ VALUE
 rb_hash_delete_if(VALUE hash)
 {
     RETURN_ENUMERATOR(hash, 0, 0);
-    rb_hash_modify(hash);
-    rb_hash_foreach(hash, delete_if_i, hash);
+    rb_hash_modify_check(hash);
+    if (RHASH(hash)->ntbl)
+	rb_hash_foreach(hash, delete_if_i, hash);
     return hash;
 }
 
@@ -984,7 +979,6 @@ rb_hash_values_at(int argc, VALUE *argv, VALUE hash)
 static int
 select_i(VALUE key, VALUE value, VALUE result)
 {
-    if (key == Qundef) return ST_CONTINUE;
     if (RTEST(rb_yield_values(2, key, value)))
 	rb_hash_aset(result, key, value);
     return ST_CONTINUE;
@@ -1018,7 +1012,6 @@ rb_hash_select(VALUE hash)
 static int
 keep_if_i(VALUE key, VALUE value, VALUE hash)
 {
-    if (key == Qundef) return ST_CONTINUE;
     if (!RTEST(rb_yield_values(2, key, value))) {
 	return ST_DELETE;
     }
@@ -1040,7 +1033,7 @@ rb_hash_select_bang(VALUE hash)
     st_index_t n;
 
     RETURN_ENUMERATOR(hash, 0, 0);
-    rb_hash_modify(hash);
+    rb_hash_modify_check(hash);
     if (!RHASH(hash)->ntbl)
         return Qnil;
     n = RHASH(hash)->ntbl->num_entries;
@@ -1065,8 +1058,9 @@ VALUE
 rb_hash_keep_if(VALUE hash)
 {
     RETURN_ENUMERATOR(hash, 0, 0);
-    rb_hash_modify(hash);
-    rb_hash_foreach(hash, keep_if_i, hash);
+    rb_hash_modify_check(hash);
+    if (RHASH(hash)->ntbl)
+	rb_hash_foreach(hash, keep_if_i, hash);
     return hash;
 }
 
@@ -1144,9 +1138,7 @@ rb_hash_aset(VALUE hash, VALUE key, VALUE val)
 static int
 replace_i(VALUE key, VALUE val, VALUE hash)
 {
-    if (key != Qundef) {
-	rb_hash_aset(hash, key, val);
-    }
+    rb_hash_aset(hash, key, val);
 
     return ST_CONTINUE;
 }
@@ -1227,7 +1219,6 @@ rb_hash_empty_p(VALUE hash)
 static int
 each_value_i(VALUE key, VALUE value)
 {
-    if (key == Qundef) return ST_CONTINUE;
     rb_yield(value);
     return ST_CONTINUE;
 }
@@ -1262,7 +1253,6 @@ rb_hash_each_value(VALUE hash)
 static int
 each_key_i(VALUE key, VALUE value)
 {
-    if (key == Qundef) return ST_CONTINUE;
     rb_yield(key);
     return ST_CONTINUE;
 }
@@ -1296,7 +1286,6 @@ rb_hash_each_key(VALUE hash)
 static int
 each_pair_i(VALUE key, VALUE value)
 {
-    if (key == Qundef) return ST_CONTINUE;
     rb_yield(rb_assoc_new(key, value));
     return ST_CONTINUE;
 }
@@ -1334,7 +1323,6 @@ rb_hash_each_pair(VALUE hash)
 static int
 to_a_i(VALUE key, VALUE value, VALUE ary)
 {
-    if (key == Qundef) return ST_CONTINUE;
     rb_ary_push(ary, rb_assoc_new(key, value));
     return ST_CONTINUE;
 }
@@ -1367,7 +1355,6 @@ inspect_i(VALUE key, VALUE value, VALUE str)
 {
     VALUE str2;
 
-    if (key == Qundef) return ST_CONTINUE;
     str2 = rb_inspect(key);
     if (RSTRING_LEN(str) > 1) {
 	rb_str_cat2(str, ", ");
@@ -1434,7 +1421,6 @@ rb_hash_to_hash(VALUE hash)
 static int
 keys_i(VALUE key, VALUE value, VALUE ary)
 {
-    if (key == Qundef) return ST_CONTINUE;
     rb_ary_push(ary, key);
     return ST_CONTINUE;
 }
@@ -1465,7 +1451,6 @@ rb_hash_keys(VALUE hash)
 static int
 values_i(VALUE key, VALUE value, VALUE ary)
 {
-    if (key == Qundef) return ST_CONTINUE;
     rb_ary_push(ary, value);
     return ST_CONTINUE;
 }
@@ -1524,7 +1509,6 @@ rb_hash_search_value(VALUE key, VALUE value, VALUE arg)
 {
     VALUE *data = (VALUE *)arg;
 
-    if (key == Qundef) return ST_CONTINUE;
     if (rb_equal(value, data[1])) {
 	data[0] = Qtrue;
 	return ST_STOP;
@@ -1568,7 +1552,6 @@ eql_i(VALUE key, VALUE val1, VALUE arg)
     struct equal_data *data = (struct equal_data *)arg;
     st_data_t val2;
 
-    if (key == Qundef) return ST_CONTINUE;
     if (!st_lookup(data->tbl, key, &val2)) {
 	data->result = Qfalse;
 	return ST_STOP;
@@ -1599,7 +1582,7 @@ hash_equal(VALUE hash1, VALUE hash2, int eql)
     struct equal_data data;
 
     if (hash1 == hash2) return Qtrue;
-    if (TYPE(hash2) != T_HASH) {
+    if (!RB_TYPE_P(hash2, T_HASH)) {
 	if (!rb_respond_to(hash2, rb_intern("to_hash"))) {
 	    return Qfalse;
 	}
@@ -1670,7 +1653,6 @@ hash_i(VALUE key, VALUE val, VALUE arg)
     st_index_t *hval = (st_index_t *)arg;
     st_index_t hdata[2];
 
-    if (key == Qundef) return ST_CONTINUE;
     hdata[0] = rb_hash(key);
     hdata[1] = rb_hash(val);
     *hval ^= st_hash(hdata, sizeof(hdata), 0);
@@ -1711,7 +1693,6 @@ rb_hash_hash(VALUE hash)
 static int
 rb_hash_invert_i(VALUE key, VALUE value, VALUE hash)
 {
-    if (key == Qundef) return ST_CONTINUE;
     rb_hash_aset(hash, value, key);
     return ST_CONTINUE;
 }
@@ -1740,7 +1721,6 @@ rb_hash_invert(VALUE hash)
 static int
 rb_hash_update_i(VALUE key, VALUE value, VALUE hash)
 {
-    if (key == Qundef) return ST_CONTINUE;
     hash_update(hash, key);
     st_insert(RHASH(hash)->ntbl, key, value);
     return ST_CONTINUE;
@@ -1749,7 +1729,6 @@ rb_hash_update_i(VALUE key, VALUE value, VALUE hash)
 static int
 rb_hash_update_block_i(VALUE key, VALUE value, VALUE hash)
 {
-    if (key == Qundef) return ST_CONTINUE;
     if (rb_hash_has_key(hash, key)) {
 	value = rb_yield_values(3, key, rb_hash_aref(hash, key), value);
     }
@@ -1806,7 +1785,6 @@ rb_hash_update_func_i(VALUE key, VALUE value, VALUE arg0)
     struct update_arg *arg = (struct update_arg *)arg0;
     VALUE hash = arg->hash;
 
-    if (key == Qundef) return ST_CONTINUE;
     if (rb_hash_has_key(hash, key)) {
 	value = (*arg->func)(key, rb_hash_aref(hash, key), value);
     }
@@ -1863,7 +1841,6 @@ assoc_i(VALUE key, VALUE val, VALUE arg)
 {
     VALUE *args = (VALUE *)arg;
 
-    if (key == Qundef) return ST_CONTINUE;
     if (RTEST(rb_equal(args[0], key))) {
 	args[1] = rb_assoc_new(key, val);
 	return ST_STOP;
@@ -1901,7 +1878,6 @@ rassoc_i(VALUE key, VALUE val, VALUE arg)
 {
     VALUE *args = (VALUE *)arg;
 
-    if (key == Qundef) return ST_CONTINUE;
     if (RTEST(rb_equal(args[0], val))) {
 	args[1] = rb_assoc_new(key, val);
 	return ST_STOP;
@@ -2198,7 +2174,7 @@ rb_env_path_tainted(void)
 }
 
 #if defined(_WIN32) || (defined(HAVE_SETENV) && defined(HAVE_UNSETENV))
-#elif defined __sun__
+#elif defined __sun
 static int
 in_origenv(const char *str)
 {
@@ -2286,7 +2262,7 @@ ruby_setenv(const char *name, const char *value)
 	    rb_sys_fail("unsetenv");
 #endif
     }
-#elif defined __sun__
+#elif defined __sun
     size_t len;
     char **env_ptr, *str;
     if (strchr(name, '=')) {
@@ -3084,11 +3060,9 @@ env_invert(void)
 static int
 env_replace_i(VALUE key, VALUE val, VALUE keys)
 {
-    if (key != Qundef) {
-	env_aset(Qnil, key, val);
-	if (rb_ary_includes(keys, key)) {
-	    rb_ary_delete(keys, key);
-	}
+    env_aset(Qnil, key, val);
+    if (rb_ary_includes(keys, key)) {
+	rb_ary_delete(keys, key);
     }
     return ST_CONTINUE;
 }
@@ -3120,12 +3094,10 @@ env_replace(VALUE env, VALUE hash)
 static int
 env_update_i(VALUE key, VALUE val)
 {
-    if (key != Qundef) {
-	if (rb_block_given_p()) {
-	    val = rb_yield_values(3, key, rb_f_getenv(Qnil, key), val);
-	}
-	env_aset(Qnil, key, val);
+    if (rb_block_given_p()) {
+	val = rb_yield_values(3, key, rb_f_getenv(Qnil, key), val);
     }
+    env_aset(Qnil, key, val);
     return ST_CONTINUE;
 }
 
@@ -3150,15 +3122,116 @@ env_update(VALUE env, VALUE hash)
 }
 
 /*
- *  A <code>Hash</code> is a collection of key-value pairs. It is
- *  similar to an <code>Array</code>, except that indexing is done via
- *  arbitrary keys of any object type, not an integer index. Hashes enumerate
- *  their values in the order that the corresponding keys were inserted.
+ *  A Hash is a dictionary-like collection of unique keys and their values.
+ *  Also called associative arrays, they are similar to Arrays, but where an
+ *  Array uses integers as its index, a Hash allows you to use any object
+ *  type.
+ *
+ *  Hashes enumerate their values in the order that the corresponding keys
+ *  were inserted.
+ *
+ *  A Hash can be easily created by using its implicit form:
+ *
+ *    grades = { "Jane Doe" => 10, "Jim Doe" => 6 }
+ *
+ *  Hashes allow an alternate syntax form when your keys are always symbols.
+ *  Instead of
+ *
+ *    options = { :font_size => 10, :font_family => "Arial" }
+ *
+ *  You could write it as:
+ *
+ *    options = { font_size: 10, font_family: "Arial" }
+ *
+ *  Each named key is a symbol you can access in hash:
+ *
+ *    options[:font_size]  # => 10
+ *
+ *  A Hash can also be created through its ::new method:
+ *
+ *    grades = Hash.new
+ *    grades["Dorothy Doe"] = 9
  *
  *  Hashes have a <em>default value</em> that is returned when accessing
- *  keys that do not exist in the hash. By default, that value is
- *  <code>nil</code>.
+ *  keys that do not exist in the hash. If no default is set +nil+ is used.
+ *  You can set the default value by sending it as an argument to Hash.new:
+ *
+ *    grades = Hash.new(0)
+ *
+ *  Or by using the #default= method:
+ *
+ *    grades = {"Timmy Doe" => 8}
+ *    grades.default = 0
+ *
+ *  Accessing a value in a Hash requires using its key:
+ *
+ *    puts grades["Jane Doe"] # => 10
+ *
+ *  === Common Uses
+ *
+ *  Hashes are an easy way to represent data structures, such as
+ *
+ *    books         = {}
+ *    books[:matz]  = "The Ruby Language"
+ *    books[:black] = "The Well-Grounded Rubyist"
+ *
+ *  Hashes are also commonly used as a way to have named parameters in
+ *  functions. Note that no brackets are used below. If a hash is the last
+ *  argument on a method call, no braces are needed, thus creating a really
+ *  clean interface:
+ *
+ *    Person.create(name: "John Doe", age: 27)
+ *
+ *    def self.create(params)
+ *      @name = params[:name]
+ *      @age  = params[:age]
+ *    end
+ *
+ *  === Hash Keys
+ *
+ *  Two objects refer to the same hash key when their <code>hash</code> value
+ *  is identical and the two objects are <code>eql?</code> to each other.
+ *
+ *  A user-defined class may be used as a hash key if the <code>hash</code>
+ *  and <code>eql?</code> methods are overridden to provide meaningful
+ *  behavior.  By default, separate instances refer to separate hash keys.
+ *
+ *  A typical implementation of <code>hash</code> is based on the
+ *  object's data while <code>eql?</code> is usually aliased to the overridden
+ *  <code>==</code> method:
+ *
+ *    class Book
+ *      attr_reader :author, :title
+ *
+ *      def initialize(author, title)
+ *        @author = author
+ *        @title = title
+ *      end
+ *
+ *      def ==(other)
+ *        self.class === other and
+ *          other.author == @author and
+ *          other.title == @title
+ *      end
+ *
+ *      alias eql? ==
+ *
+ *      def hash
+ *        @author.hash ^ @title.hash # XOR
+ *      end
+ *    end
+ *
+ *    book1 = Book.new 'matz', 'Ruby in a Nutshell'
+ *    book2 = Book.new 'matz', 'Ruby in a Nutshell'
+ *
+ *    reviews = {}
+ *
+ *    reviews[book1] = 'Great reference!'
+ *    reviews[book2] = 'Nice and compact!'
+ *
+ *    reviews.length #=> 1
  *
+ *  See also Object#hash and Object#eql?
  */
 
 void
diff --git a/include/ruby/st.h b/include/ruby/st.h
index 50f2a75..119dfde 100644
--- a/include/ruby/st.h
+++ b/include/ruby/st.h
@@ -36,7 +36,7 @@ typedef unsigned long st_data_t;
 #elif SIZEOF_LONG_LONG == SIZEOF_VOIDP
 typedef unsigned LONG_LONG st_data_t;
 #else
-# error ---->> st.c requires sizeof(void*) == sizeof(long) to be compiled. <<----
+# error ---->> st.c requires sizeof(void*) == sizeof(long) or sizeof(LONG_LONG) to be compiled. <<----
 #endif
 #define ST_DATA_T_DEFINED
 
@@ -74,6 +74,11 @@ struct st_hash_type {
 
 #define ST_INDEX_BITS (sizeof(st_index_t) * CHAR_BIT)
 
+typedef struct st_packed_entry {
+    st_index_t hash;
+    st_data_t key, val;
+} st_packed_entry;
+
 struct st_table {
     const struct st_hash_type *type;
     st_index_t num_bins;
@@ -91,8 +96,17 @@ struct st_table {
     __extension__
 #endif
     st_index_t num_entries : ST_INDEX_BITS - 1;
-    struct st_table_entry **bins;
-    struct st_table_entry *head, *tail;
+    union {
+	struct {
+	    struct st_table_entry **bins;
+	    struct st_table_entry *head, *tail;
+	} big;
+	struct {
+	    struct st_packed_entry *entries;
+	    st_index_t real_entries;
+	} packed;
+	st_packed_entry upacked;
+    } as;
 };
 
 #define st_is_member(table,key) st_lookup((table),(key),(st_data_t *)0)
@@ -114,6 +128,7 @@ int st_insert2(st_table *, st_data_t, st_data_t, st_data_t (*)(st_data_t));
 int st_lookup(st_table *, st_data_t, st_data_t *);
 int st_get_key(st_table *, st_data_t, st_data_t *);
 int st_foreach(st_table *, int (*)(ANYARGS), st_data_t);
+int st_foreach_check(st_table *, int (*)(ANYARGS), st_data_t, st_data_t);
 int st_reverse_foreach(st_table *, int (*)(ANYARGS), st_data_t);
 void st_add_direct(st_table *, st_data_t, st_data_t);
 void st_free_table(st_table *);
diff --git a/internal.h b/internal.h
index 5d0cff0..99b4015 100644
--- a/internal.h
+++ b/internal.h
@@ -112,6 +112,9 @@ VALUE rb_iseq_clone(VALUE iseqval, VALUE newcbase);
 
 /* load.c */
 VALUE rb_get_load_path(void);
+void rb_reset_expanded_cache();
+void rb_load_path_ary_push(VALUE path);
+extern VALUE rb_cExpandedPath;
 
 /* math.c */
 VALUE rb_math_atan2(VALUE, VALUE);
diff --git a/load.c b/load.c
index 0ff4b60..80b2256 100644
--- a/load.c
+++ b/load.c
@@ -4,6 +4,7 @@
 
 #include "ruby/ruby.h"
 #include "ruby/util.h"
+#include "ruby/encoding.h"
 #include "internal.h"
 #include "dln.h"
 #include "eval_intern.h"
@@ -18,6 +19,7 @@ VALUE ruby_dln_librefs;
 #define IS_DLEXT(e) (strcmp((e), DLEXT) == 0)
 #endif
 
+static int sorted_loaded_features = 1;
 
 static const char *const loadable_ext[] = {
     ".rb", DLEXT,
@@ -27,28 +29,45 @@ static const char *const loadable_ext[] = {
     0
 };
 
-VALUE
-rb_get_load_path(void)
-{
-    VALUE load_path = GET_VM()->load_path;
-    return load_path;
-}
+static VALUE rb_checked_expanded_cache(int*);
+static void rb_set_expanded_cache(VALUE, int);
+static VALUE rb_expand_load_paths(long, VALUE*, int*);
+static int cached_expanded_load_path = 1;
+VALUE rb_cExpandedPath;
 
 VALUE
 rb_get_expanded_load_path(void)
 {
-    VALUE load_path = rb_get_load_path();
-    VALUE ary;
-    long i;
+    VALUE expanded = rb_checked_expanded_cache(NULL);
 
-    ary = rb_ary_new2(RARRAY_LEN(load_path));
-    for (i = 0; i < RARRAY_LEN(load_path); ++i) {
-	VALUE path = rb_file_expand_path(RARRAY_PTR(load_path)[i], Qnil);
-	rb_str_freeze(path);
-	rb_ary_push(ary, path);
+    if ( !RTEST(expanded) ) {
+	VALUE load_path = GET_VM()->load_path;
+	int has_relative = 0;
+
+	if (!load_path) return 0;
+
+	expanded = rb_expand_load_paths(
+			RARRAY_LEN(load_path), RARRAY_PTR(load_path),
+			&has_relative);
+	RB_GC_GUARD(load_path);
+
+	if (cached_expanded_load_path) {
+	    rb_set_expanded_cache(expanded, has_relative);
+	}
+    } else {
+	expanded = rb_ary_dup(expanded);
     }
-    rb_obj_freeze(ary);
-    return ary;
+    return expanded;
+}
+
+VALUE
+rb_get_load_path(void)
+{
+    VALUE load_path =
+	cached_expanded_load_path ?
+	    rb_get_expanded_load_path():
+	    GET_VM()->load_path;
+    return load_path;
 }
 
 static VALUE
@@ -129,6 +148,9 @@ loaded_feature_path_i(st_data_t v, st_data_t b, st_data_t f)
     return ST_STOP;
 }
 
+static long rb_feature_first_equal_or_greater(VALUE, const char *, long);
+static int  rb_stop_search_feature(VALUE, const char *, long);
+
 static int
 rb_feature_p(const char *feature, const char *ext, int rb, int expanded, const char **fn)
 {
@@ -151,8 +173,10 @@ rb_feature_p(const char *feature, const char *ext, int rb, int expanded, const c
 	type = 0;
     }
     features = get_loaded_features();
-    for (i = 0; i < RARRAY_LEN(features); ++i) {
+    i = rb_feature_first_equal_or_greater(features, feature, len);
+    for (; i < RARRAY_LEN(features); ++i) {
 	v = RARRAY_PTR(features)[i];
+	if (rb_stop_search_feature(v, feature, len)) break;
 	f = StringValuePtr(v);
 	if ((n = RSTRING_LEN(v)) < len) continue;
 	if (strncmp(f, feature, len) != 0) {
@@ -176,14 +200,14 @@ rb_feature_p(const char *feature, const char *ext, int rb, int expanded, const c
 	}
     }
     loading_tbl = get_loading_table();
-    if (loading_tbl) {
+    if (loading_tbl && loading_tbl->num_entries > 0) {
 	f = 0;
 	if (!expanded) {
 	    struct loaded_feature_searching fs;
 	    fs.name = feature;
 	    fs.len = len;
 	    fs.type = type;
-	    fs.load_path = load_path ? load_path : rb_get_load_path();
+	    fs.load_path = load_path ? load_path : rb_get_expanded_load_path();
 	    fs.result = 0;
 	    st_foreach(loading_tbl, loaded_feature_path_i, (st_data_t)&fs);
 	    if ((f = fs.result) != 0) {
@@ -251,6 +275,170 @@ rb_feature_provided(const char *feature, const char **loading)
     return FALSE;
 }
 
+static long
+feature_basename_length(const char *feature, long flen)
+{
+    if (sorted_loaded_features) {
+	const char *ext = strrchr(feature, '.');
+	return ext && !strchr(ext, '/') ? ext - feature : flen;
+    } else {
+	return 0;
+    }
+}
+
+static int
+compare_feature_name(const char *left, long llen, const char *right, long rlen)
+{
+    int diff = 0;
+    while (llen-- && rlen--) {
+	diff = left[llen] - right[rlen];
+	if (diff) break;
+	if (left[llen] == '/') break;
+    }
+    return diff;
+}
+
+static int
+rb_compare_feature_name(VALUE loaded, const char *feature, long flen)
+{
+    const char *loaded_name = StringValuePtr(loaded);
+    long loaded_len = feature_basename_length(loaded_name, RSTRING_LEN(loaded));
+    return compare_feature_name(loaded_name, loaded_len, feature, flen);
+}
+
+/* used to find when equal features run out */
+static int
+rb_stop_search_feature(VALUE loaded, const char *feature, long flen)
+{
+    if (sorted_loaded_features)
+	return rb_compare_feature_name(loaded, feature, flen) > 0;
+    else
+	return FALSE;
+}
+
+/* returns first position to search feature from */
+static long
+rb_feature_first_equal_or_greater(VALUE features, const char *feature, long flen)
+{
+    if (sorted_loaded_features) {
+	long before = 0, first = RARRAY_LEN(features);
+	VALUE *values = RARRAY_PTR(features);
+	if (first == 0)
+	    return 0;
+	if (rb_compare_feature_name(values[0], feature, flen) >= 0)
+	    return 0;
+
+	while (first - before > 1) {
+	    long mid = (first + before) / 2;
+	    long cmp = rb_compare_feature_name(values[mid], feature, flen);
+	    if (cmp >= 0)
+		first = mid;
+	    else
+		before = mid;
+	}
+	return first;
+    } else {
+	return 0;
+    }
+}
+
+/* returns position to insert new feature in */
+static long
+rb_feature_first_greater(VALUE features, const char *feature, long flen)
+{
+    if (sorted_loaded_features) {
+	long before = 0, first = RARRAY_LEN(features);
+	VALUE *values = RARRAY_PTR(features);
+	if (first == 0)
+	    return 0;
+	if (rb_compare_feature_name(values[0], feature, flen) > 0)
+	    return 0;
+	if (rb_compare_feature_name(values[first-1], feature, flen) <= 0)
+	    return first;
+
+	while (first - before > 1) {
+	    long mid = (first + before) / 2;
+	    long cmp = rb_compare_feature_name(values[mid], feature, flen);
+	    if (cmp > 0)
+		first = mid;
+	    else
+		before = mid;
+	}
+	return first;
+    } else {
+	return RARRAY_LEN(features);
+    }
+}
+
+
+static VALUE
+rb_push_feature_1(VALUE features, VALUE feature)
+{
+    const char *fname = StringValuePtr(feature);
+    long flen = feature_basename_length(fname, RSTRING_LEN(feature));
+    long i = rb_feature_first_greater(features, fname, flen);
+    rb_ary_push(features, feature);
+    if ( i < RARRAY_LEN(features) - 1 ) {
+	MEMMOVE(RARRAY_PTR(features) + i + 1, RARRAY_PTR(features) + i,
+		VALUE, RARRAY_LEN(features) - i - 1);
+	RARRAY_PTR(features)[i] = feature;
+    }
+    return features;
+}
+
+static VALUE
+rb_push_feature_m(long argc, VALUE *argv, VALUE features)
+{
+    while (argc--) {
+	rb_push_feature_1(features, *argv++);
+    }
+    return features;
+}
+
+static VALUE
+rb_concat_features(VALUE features, VALUE add)
+{
+    add = rb_convert_type(add, T_ARRAY, "Array", "to_ary");
+    if (RARRAY_LEN(add)) {
+	rb_push_feature_m(RARRAY_LEN(add), RARRAY_PTR(add), features);
+    }
+    return features;
+}
+static const char *load_features_undefined_methods[] = {
+    "[]=", "reverse!", "rotate!", "sort!", "sort_by!",
+    "collect!", "map!", "shuffle!", "fill", "insert",
+    NULL
+};
+
+static VALUE
+rb_loaded_features_init(void)
+{
+    char *sorted_flag;
+    const char **name;
+    VALUE loaded_features = rb_ary_new();
+    VALUE loaded_features_c = rb_singleton_class(loaded_features);
+
+    sorted_flag = getenv("RUBY_LOADED_FEATURES_SORTED");
+    if (sorted_flag != NULL) {
+	int sorted_set = atoi(sorted_flag);
+	if (RTEST(ruby_verbose))
+	    fprintf(stderr, "sorted_loaded_features=%d (%d)\n", sorted_set, sorted_loaded_features);
+	sorted_loaded_features = sorted_set;
+    }
+
+    for(name = load_features_undefined_methods; *name; name++) {
+	rb_undef_method(loaded_features_c, *name);
+    }
+
+    if (sorted_loaded_features) {
+	rb_define_method(loaded_features_c, "<<", rb_push_feature_1, 1);
+	rb_define_method(loaded_features_c, "push", rb_push_feature_m, -1);
+	rb_define_method(loaded_features_c, "concat", rb_concat_features, 1);
+	rb_define_method(loaded_features_c, "unshift", rb_push_feature_m, -1);
+    }
+    return loaded_features;
+}
+
 static void
 rb_provide_feature(VALUE feature)
 {
@@ -258,7 +446,10 @@ rb_provide_feature(VALUE feature)
 	rb_raise(rb_eRuntimeError,
 		 "$LOADED_FEATURES is frozen; cannot append feature");
     }
-    rb_ary_push(get_loaded_features(), feature);
+    if (sorted_loaded_features)
+	rb_push_feature_1(get_loaded_features(), feature);
+    else
+	rb_ary_push(get_loaded_features(), feature);
 }
 
 void
@@ -760,6 +951,230 @@ rb_f_autoload_p(VALUE obj, VALUE sym)
     return rb_mod_autoload_p(klass, sym);
 }
 
+/* $LOAD_PATH methods which invalidates cache */
+static const char *load_path_reset_cache_methods[] = {
+    "[]=", "collect!", "compact!", "delete",
+    "delete_if", "fill", "flatten!", "insert", "keep_if",
+    "map!", "reject!", "replace", "select!", "shuffle!",
+    "sort!", "sort_by!", "uniq!", NULL
+};
+
+/* $LOAD_PATH methods which sends also to cache */
+static const char *load_path_apply_to_cache_methods[] = {
+    "clear", "delete_at", "pop", "reverse!", "rotate!",
+    "shift", "slice!", NULL
+};
+
+/* $LOAD_PATH methods which sends to cache whith expanded arguments */
+static const char *load_path_apply_expanded_methods[] = {
+    "<<", "push", "unshift", NULL
+};
+
+void
+rb_reset_expanded_cache()
+{
+    GET_VM()->load_path_expanded_cache = 0;
+}
+
+static VALUE
+rb_load_path_expanded_cache()
+{
+    VALUE cache = GET_VM()->load_path_expanded_cache;
+    VALUE expanded = Qnil;
+    if (RTEST(cache)) {
+	expanded = RARRAY_PTR(cache)[2];
+    }
+    return expanded;
+}
+
+/* Return cache only if we still in the same working directory
+ * and filesystem_encoding didn't change
+ * Invalidate cache otherwise
+ */
+static VALUE
+rb_checked_expanded_cache(int *has_relative)
+{
+    VALUE cache = GET_VM()->load_path_expanded_cache;
+    VALUE expanded = Qnil;
+    if (RTEST(cache)) {
+	VALUE curwd = RARRAY_PTR(cache)[0];
+	VALUE encindex = RARRAY_PTR(cache)[1];
+	int cache_valid = rb_filesystem_encindex() == FIX2INT(encindex);
+
+	if ( cache_valid ) {
+	    cache_valid = curwd == Qtrue;
+	    if (has_relative) {
+		*has_relative = cache_valid;
+	    }
+	    if (!cache_valid ) {
+		char *cwd = my_getcwd();
+		cache_valid = !strcmp(RSTRING_PTR(curwd), cwd);
+		xfree(cwd);
+	    }
+	}
+
+	if ( !cache_valid ) {
+	    rb_reset_expanded_cache();
+	} else {
+	    expanded = RARRAY_PTR(cache)[2];
+	}
+    }
+    RB_GC_GUARD(cache);
+    return expanded;
+}
+
+static void
+rb_set_expanded_cache(VALUE expanded, int has_relative)
+{
+    VALUE cache = rb_ary_new2(3);
+
+    if (has_relative) {
+	char *cwd = my_getcwd();
+	rb_ary_push(cache, rb_str_new_cstr(cwd));
+	xfree(cwd);
+    } else {
+	rb_ary_push(cache, Qtrue);
+    }
+
+    rb_ary_push(cache, INT2FIX(rb_filesystem_encindex()));
+    rb_ary_push(cache, rb_ary_dup(expanded));
+    GET_VM()->load_path_expanded_cache = cache;
+}
+
+static VALUE
+rb_expand_load_paths(long pathc, VALUE* paths, int *has_relative)
+{
+    long i;
+    const char *p;
+    VALUE path, expanded = rb_ary_new2(pathc);
+
+    for(i = 0; i < pathc; i++) {
+	path = rb_get_path(paths[i]);
+	p = RSTRING_PTR(path);
+	*has_relative = *has_relative || !rb_is_absolute_path(p);
+	path = rb_file_expand_path(path, Qnil);
+	RBASIC(path)->klass = rb_cExpandedPath;
+	rb_str_freeze(path);
+	rb_ary_push(expanded, path);
+    }
+
+    return expanded;
+}
+
+/* Invalidating $LOAD_PATH methods implementation */
+static VALUE
+rb_load_path_reset_cache_method(int argc, VALUE *argv, VALUE self)
+{
+    rb_reset_expanded_cache();
+    return rb_call_super(argc, argv);
+}
+
+/* Proxying $LOAD_PATH methods implementation */
+static VALUE
+rb_load_path_apply_to_cache_method(int argc, VALUE *argv, VALUE self)
+{
+    VALUE load_path_expanded = rb_load_path_expanded_cache();
+    if (RTEST(load_path_expanded)) {
+	ID func = rb_frame_this_func();
+	rb_funcall2(load_path_expanded, func, argc, argv);
+    }
+    return rb_call_super(argc, argv);
+}
+
+/* Proxying with expansion $LOAD_PATH methods implementation */
+static VALUE
+rb_load_path_apply_expanded_method(int argc, VALUE *argv, VALUE self)
+{
+    int old_has_relative = 0;
+    /* We call methods on cache only if we still in the same working directory */
+    VALUE load_path_expanded = rb_checked_expanded_cache(&old_has_relative);
+    if (RTEST(load_path_expanded)) {
+	int has_relative = 0;
+	ID func = rb_frame_this_func();
+	VALUE expanded = rb_expand_load_paths(argc, argv, &has_relative);
+
+	rb_funcall2(load_path_expanded, func, argc, RARRAY_PTR(expanded));
+
+	if (!old_has_relative && has_relative) {
+	    rb_set_expanded_cache(load_path_expanded, has_relative);
+	}
+	RB_GC_GUARD(expanded);
+    }
+    return rb_call_super(argc, argv);
+}
+/* $LOAD_PATH.concat(ary) - special, we call push(*ary) instead
+ * cause I'm lazy a bit and wish not to rewrite method above second time :)
+ */
+static VALUE
+rb_load_path_concat(VALUE self, VALUE ary)
+{
+    ID push;
+    CONST_ID(push, "push");
+    RB_GC_GUARD(ary);
+    return rb_funcall2(self, push, (int)RARRAY_LEN(ary), RARRAY_PTR(ary));
+}
+
+void
+rb_load_path_ary_push(VALUE path)
+{
+    int old_has_relative = 0;
+    VALUE load_path_expanded = rb_checked_expanded_cache(&old_has_relative);
+    if (RTEST(load_path_expanded)) {
+	int has_relative = 0;
+	VALUE expanded = rb_expand_load_paths(1, &path, &has_relative);
+
+	rb_ary_push(load_path_expanded, RARRAY_PTR(expanded)[0]);
+
+	if (!old_has_relative && has_relative) {
+	    rb_set_expanded_cache(load_path_expanded, has_relative);
+	}
+	RB_GC_GUARD(expanded);
+    }
+
+    rb_ary_push(GET_VM()->load_path, path);
+}
+
+static VALUE
+rb_load_path_init(void)
+{
+    const char **name;
+    VALUE load_path = rb_ary_new();
+    char *cached_flag;
+
+    cached_flag = getenv("RUBY_CACHED_LOAD_PATH");
+    if (cached_flag != NULL) {
+	cached_expanded_load_path = atoi(cached_flag);
+    }
+
+    rb_cExpandedPath = rb_class_new(rb_cString); /* XXX could GC collect it before next line is executed? */
+    rb_iv_set(rb_cFile, "expanded_path", rb_cExpandedPath); /* prevent from GC */
+
+    /* Do all the magick if user did not disable it
+     * with RUBY_CACHED_LOAD_PATH=0 environment variable
+     */
+    if (cached_expanded_load_path) {
+	VALUE load_path_c = rb_singleton_class(load_path);
+
+	for(name = load_path_reset_cache_methods; *name; name++ ) {
+	    rb_define_method(load_path_c, *name, rb_load_path_reset_cache_method, -1);
+	}
+
+	for(name = load_path_apply_to_cache_methods; *name; name++ ) {
+	    rb_define_method(load_path_c, *name, rb_load_path_apply_to_cache_method, -1);
+	}
+
+	for(name = load_path_apply_expanded_methods; *name; name++ ) {
+	    rb_define_method(load_path_c, *name, rb_load_path_apply_expanded_method, -1);
+	}
+
+	rb_define_method(load_path_c, "concat", rb_load_path_concat, 1);
+    }
+
+    rb_reset_expanded_cache();
+
+    return load_path;
+}
+
 void
 Init_load()
 {
@@ -772,11 +1187,11 @@ Init_load()
     rb_define_hooked_variable(var_load_path, (VALUE*)vm, load_path_getter, rb_gvar_readonly_setter);
     rb_alias_variable(rb_intern("$-I"), id_load_path);
     rb_alias_variable(rb_intern("$LOAD_PATH"), id_load_path);
-    vm->load_path = rb_ary_new();
+    vm->load_path = rb_load_path_init();
 
     rb_define_virtual_variable("$\"", get_loaded_features, 0);
     rb_define_virtual_variable("$LOADED_FEATURES", get_loaded_features, 0);
-    vm->loaded_features = rb_ary_new();
+    vm->loaded_features = rb_loaded_features_init();
 
     rb_define_global_function("load", rb_f_load, -1);
     rb_define_global_function("require", rb_f_require, 1);
diff --git a/pool_alloc.h b/pool_alloc.h
new file mode 100644
index 0000000..957708e
--- /dev/null
+++ b/pool_alloc.h
@@ -0,0 +1,11 @@
+#ifndef POOL_ALLOC_H
+#define POOL_ALLOC_H
+
+#define POOL_ALLOC_API
+#ifdef POOL_ALLOC_API
+void  ruby_xpool_free(void *ptr);
+void *ruby_xpool_malloc_6p();
+void *ruby_xpool_malloc_11p();
+#endif
+
+#endif
diff --git a/pool_alloc.inc.h b/pool_alloc.inc.h
new file mode 100644
index 0000000..026f40c
--- /dev/null
+++ b/pool_alloc.inc.h
@@ -0,0 +1,223 @@
+/*
+ * this is generic pool allocator
+ * you should define following macroses:
+ * ITEM_NAME - unique identifier, which allows to hold functions in a namespace
+ * ITEM_TYPEDEF(name) - passed to typedef to localize item type
+ * free_entry - desired name of function for free entry
+ * alloc_entry - defired name of function for allocate entry
+ */
+
+#if POOL_ALLOC_PART == 1
+#ifdef HEAP_ALIGN_LOG
+#define DEFAULT_POOL_SIZE (1 << HEAP_ALIGN_LOG)
+#else
+#define DEFAULT_POOL_SIZE (sizeof(void*) * 2048)
+#endif
+typedef unsigned int pool_holder_counter;
+
+typedef struct pool_entry_list pool_entry_list;
+typedef struct pool_holder pool_holder;
+
+typedef struct pool_header {
+    pool_holder         *first;
+    rb_atomic_t          lock;
+    pool_holder_counter  size; // size of entry in sizeof(void*) items
+    pool_holder_counter  total; // size of entry in sizeof(void*) items
+} pool_header;
+
+struct pool_holder {
+    pool_holder_counter free, total;
+    pool_header  *header;
+    void               *freep;
+    pool_holder        *fore, *back;
+    void *data[1];
+};
+#define POOL_DATA_SIZE(pool_size) (((pool_size) - sizeof(void*) * 6 - offsetof(pool_holder, data)) / sizeof(void*))
+#define POOL_ENTRY_SIZE(item_type) ((sizeof(item_type) - 1) / sizeof(void*) + 1)
+#define POOL_HOLDER_COUNT(pool_size, item_type) (POOL_DATA_SIZE(pool_size)/POOL_ENTRY_SIZE(item_type))
+#define INIT_POOL(item_type) {NULL, 0, POOL_ENTRY_SIZE(item_type), POOL_HOLDER_COUNT(DEFAULT_POOL_SIZE, item_type)}
+
+#elif POOL_ALLOC_PART == 2
+
+#if   defined(_WIN32)
+#define native_thread_yield() Sleep(0)
+#elif HAVE_SCHED_YIELD
+#define native_thread_yield() (void)sched_yield()
+#else
+#define native_thread_yield() ((void)0)
+#endif
+
+#define MAX_TRY_CICLES 5
+static inline int
+living_threads()
+{
+    rb_vm_t *vm = GET_VM();
+    st_table *living_threads;
+    return vm && (living_threads = vm->living_threads) ? living_threads->num_entries : 1;
+}
+
+static void
+lock_header(pool_header *header)
+{
+    int i;
+    if (living_threads() == 1) {
+	header->lock = 1;
+	return;
+    }
+    i = MAX_TRY_CICLES;
+    while(ATOMIC_EXCHANGE(header->lock, 1)) {
+	if (--i == 0) {
+	    native_thread_yield();
+	    i = MAX_TRY_CICLES;
+	}
+    }
+}
+
+static inline void
+unlock_header(pool_header *header)
+{
+    if (living_threads() == 1) {
+	header->lock = 0;
+	return;
+    }
+    ATOMIC_SET(header->lock, 0);
+}
+
+static pool_holder *
+pool_holder_alloc(pool_header *header)
+{
+    pool_holder *holder;
+    pool_holder_counter i, size, count;
+    register void **ptr;
+
+    size_t sz = offsetof(pool_holder, data) +
+	    header->size * header->total * sizeof(void*);
+#define objspace (&rb_objspace)
+    unlock_header(header);
+    vm_malloc_prepare(objspace, DEFAULT_POOL_SIZE);
+    lock_header(header);
+    if (header->first != NULL) {
+	return header->first;
+    }
+    holder = (pool_holder*) aligned_malloc(DEFAULT_POOL_SIZE, sz);
+    if (!holder) {
+	unlock_header(header);
+	if (!garbage_collect_with_gvl(objspace)) {
+	    ruby_memerror();
+	}
+	holder = (pool_holder*) aligned_malloc(DEFAULT_POOL_SIZE, sz);
+	if (!holder) {
+	    ruby_memerror();
+	}
+	lock_header(header);
+    }
+    malloc_increase += DEFAULT_POOL_SIZE;
+#if CALC_EXACT_MALLOC_SIZE
+    objspace->malloc_params.allocated_size += DEFAULT_POOL_SIZE;
+    objspace->malloc_params.allocations++;
+#endif
+#undef objspace
+
+    size = header->size;
+    count = header->total;
+    holder->free = count;
+    holder->total = count;
+    holder->header = header;
+    holder->fore = NULL;
+    holder->back = NULL;
+    holder->freep = &holder->data;
+    ptr = holder->data;
+    for(i = count - 1; i; i-- ) {
+	ptr = *ptr = ptr + size;
+    }
+    *ptr = NULL;
+    header->first = holder;
+    return holder;
+}
+
+static inline void
+pool_holder_unchaing(pool_header *header, pool_holder *holder)
+{
+    register pool_holder *fore = holder->fore, *back = holder->back;
+    holder->fore = NULL;
+    holder->back = NULL;
+    if (fore != NULL)  fore->back     = back;
+    if (back != NULL)  back->fore     = fore;
+    else               header->first = fore;
+}
+
+static inline pool_holder *
+entry_holder(void **entry)
+{
+    return (pool_holder*)(((uintptr_t)entry) & ~(DEFAULT_POOL_SIZE - 1));
+}
+
+static inline void
+pool_free_entry(void **entry)
+{
+    pool_holder *holder = entry_holder(entry);
+    pool_header *header = holder->header;
+
+    lock_header(header);
+
+    if (holder->free++ == 0) {
+	register pool_holder *first = header->first;
+	if (first == NULL) {
+	    header->first = holder;
+	} else {
+	    holder->back = first;
+	    holder->fore = first->fore;
+	    first->fore = holder;
+	    if (holder->fore)
+		holder->fore->back = holder;
+	}
+    } else if (holder->free == holder->total && header->first != holder ) {
+	pool_holder_unchaing(header, holder);
+	aligned_free(holder);
+#if CALC_EXACT_MALLOC_SIZE
+	rb_objspace.malloc_params.allocated_size -= DEFAULT_POOL_SIZE;
+	rb_objspace.malloc_params.allocations--;
+#endif
+        unlock_header(header);
+	return;
+    }
+
+    *entry = holder->freep;
+    holder->freep = entry;
+    unlock_header(header);
+}
+
+static inline void*
+pool_alloc_entry(pool_header *header)
+{
+    pool_holder *holder;
+    void **result;
+
+    lock_header(header);
+    holder = header->first;
+
+    if (holder == NULL) {
+	holder = pool_holder_alloc(header);
+    }
+
+    result = holder->freep;
+    holder->freep = *result;
+
+    if (--holder->free == 0) {
+	pool_holder_unchaing(header, holder);
+    }
+
+    unlock_header(header);
+
+    return result;
+}
+
+static void
+pool_finalize_header(pool_header *header)
+{
+    if (header->first) {
+        aligned_free(header->first);
+        header->first = NULL;
+    }
+}
+#endif
diff --git a/ruby.c b/ruby.c
index 3c97d01..b9b9fd5 100644
--- a/ruby.c
+++ b/ruby.c
@@ -209,7 +209,6 @@ push_include(const char *path, VALUE (*filter)(VALUE))
 {
     const char sep = PATH_SEP_CHAR;
     const char *p, *s;
-    VALUE load_path = GET_VM()->load_path;
 
     p = path;
     while (*p) {
@@ -217,7 +216,7 @@ push_include(const char *path, VALUE (*filter)(VALUE))
 	    p++;
 	if (!*p) break;
 	for (s = p; *s && *s != sep; s = CharNext(s));
-	rb_ary_push(load_path, (*filter)(rubylib_mangled_path(p, s - p)));
+	rb_load_path_ary_push((*filter)(rubylib_mangled_path(p, s - p)));
 	p = s;
     }
 }
@@ -338,7 +337,6 @@ ruby_init_loadpath(void)
 void
 ruby_init_loadpath_safe(int safe_level)
 {
-    VALUE load_path;
     ID id_initial_load_path_mark;
     extern const char ruby_initial_load_paths[];
     const char *paths = ruby_initial_load_paths;
@@ -438,7 +436,6 @@ ruby_init_loadpath_safe(int safe_level)
 #define RUBY_RELATIVE(path, len) rubylib_mangled_path((path), (len))
 #define PREFIX_PATH() RUBY_RELATIVE(exec_prefix, sizeof(exec_prefix)-1)
 #endif
-    load_path = GET_VM()->load_path;
 
     if (safe_level == 0) {
 #ifdef MANGLED_PATH
@@ -452,7 +449,7 @@ ruby_init_loadpath_safe(int safe_level)
 	size_t len = strlen(paths);
 	VALUE path = RUBY_RELATIVE(paths, len);
 	rb_ivar_set(path, id_initial_load_path_mark, path);
-	rb_ary_push(load_path, path);
+	rb_load_path_ary_push(path);
 	paths += len + 1;
     }
 
@@ -1349,6 +1346,7 @@ process_options(int argc, char **argv, struct cmdline_options *opt)
 	for (i = 0; i < RARRAY_LEN(load_path); ++i) {
 	    rb_enc_associate(RARRAY_PTR(load_path)[i], lenc);
 	}
+	rb_reset_expanded_cache();
     }
     if (!(opt->disable & DISABLE_BIT(gems))) {
 #if defined DISABLE_RUBYGEMS && DISABLE_RUBYGEMS
diff --git a/st.c b/st.c
index fda5784..890bdca 100644
--- a/st.c
+++ b/st.c
@@ -7,6 +7,7 @@
 #include "st.h"
 #else
 #include "ruby/ruby.h"
+#include "pool_alloc.h"
 #endif
 
 #include <stdio.h>
@@ -25,8 +26,17 @@ struct st_table_entry {
     st_table_entry *fore, *back;
 };
 
-#define ST_DEFAULT_MAX_DENSITY 5
+#define STATIC_ASSERT(name, expr) typedef int static_assert_##name##_check[(expr) ? 1 : -1];
+
+#define ST_DEFAULT_MAX_DENSITY 2
 #define ST_DEFAULT_INIT_TABLE_SIZE 11
+#define ST_DEFAULT_SECOND_TABLE_SIZE 19
+#define ST_DEFAULT_PACKED_TABLE_SIZE 18
+#define PACKED_UNIT (int)(sizeof(st_packed_entry) / sizeof(st_table_entry*))
+#define MAX_PACKED_HASH (int)(ST_DEFAULT_PACKED_TABLE_SIZE * sizeof(st_table_entry*) / sizeof(st_packed_entry))
+
+STATIC_ASSERT(st_packed_entry, sizeof(st_packed_entry) == sizeof(st_table_entry*[PACKED_UNIT]))
+STATIC_ASSERT(st_packed_bins, sizeof(st_packed_entry[MAX_PACKED_HASH]) <= sizeof(st_table_entry*[ST_DEFAULT_PACKED_TABLE_SIZE]))
 
     /*
      * DEFAULT_MAX_DENSITY is the default for the largest we allow the
@@ -38,7 +48,8 @@ struct st_table_entry {
      *
      */
 
-static const struct st_hash_type type_numhash = {
+#define type_numhash st_hashtype_num
+const struct st_hash_type st_hashtype_num = {
     st_numcmp,
     st_numhash,
 };
@@ -61,20 +72,127 @@ static void rehash(st_table *);
 #ifdef RUBY
 #define malloc xmalloc
 #define calloc xcalloc
+#define realloc xrealloc
 #define free(x) xfree(x)
 #endif
 
 #define numberof(array) (int)(sizeof(array) / sizeof((array)[0]))
 
-#define alloc(type) (type*)malloc((size_t)sizeof(type))
-#define Calloc(n,s) (char*)calloc((n),(s))
-
 #define EQUAL(table,x,y) ((x)==(y) || (*(table)->type->compare)((x),(y)) == 0)
 
-/* remove cast to unsigned int in the future */
-#define do_hash(key,table) (unsigned int)(st_index_t)(*(table)->type->hash)((key))
+#define do_hash(key,table) (st_index_t)(*(table)->type->hash)((key))
 #define do_hash_bin(key,table) (do_hash((key), (table))%(table)->num_bins)
 
+/* preparation for possible allocation improvements */
+#ifdef POOL_ALLOC_API
+#define st_alloc_entry() (st_table_entry *)ruby_xpool_malloc_6p()
+#define st_free_entry(entry) ruby_xpool_free(entry)
+#define st_alloc_table() (st_table *)ruby_xpool_malloc_6p()
+#define st_dealloc_table(table) ruby_xpool_free(table)
+static inline st_table_entry **
+st_alloc_bins(st_index_t size)
+{
+    st_table_entry **result;
+    if (size == 11) {
+        result = (st_table_entry **) ruby_xpool_malloc_11p();
+        memset(result, 0, 11 * sizeof(st_table_entry *));
+    }
+    else
+        result = (st_table_entry **) ruby_xcalloc(size, sizeof(st_table_entry*));
+    return result;
+}
+static inline void
+st_free_bins(st_table_entry **bins, st_index_t size)
+{
+    if (size == 11)
+	ruby_xpool_free(bins);
+    else
+	ruby_xfree(bins);
+}
+static inline st_table_entry**
+st_realloc_bins(st_table_entry **bins, st_index_t newsize, st_index_t oldsize)
+{
+    st_free_bins(bins, oldsize);
+    return st_alloc_bins(newsize);
+}
+#else
+#define st_alloc_entry() (st_table_entry *)malloc(sizeof(st_table_entry))
+#define st_free_entry(entry) free(entry)
+#define st_alloc_table() (st_table *)malloc(sizeof(st_table))
+#define st_dealloc_table(table) free(table)
+#define st_alloc_bins(size) (st_table_entry **)calloc(size, sizeof(st_table_entry *))
+#define st_free_bins(bins, size) free(bins)
+static inline st_table_entry**
+st_realloc_bins(st_table_entry **bins, st_index_t newsize, st_index_t oldsize)
+{
+    bins = (st_table_entry **)realloc(bins, newsize * sizeof(st_table_entry *));
+    MEMZERO(bins, st_table_entry*, newsize);
+    return bins;
+}
+#endif
+
+/* Shortage */
+#define bins as.big.bins
+#define head as.big.head
+#define tail as.big.tail
+#define real_entries as.packed.real_entries
+
+/* preparation for possible packing improvements */
+#define PACKED_BINS(table) ((table)->as.packed.entries)
+#define PACKED_ENT(table, i) PACKED_BINS(table)[i]
+#define PKEY(table, i) PACKED_ENT((table), (i)).key
+#define PVAL(table, i) PACKED_ENT((table), (i)).val
+#define PHASH(table, i) PACKED_ENT((table), (i)).hash
+#define PKEY_SET(table, i, v) (PKEY((table), (i)) = (v))
+#define PVAL_SET(table, i, v) (PVAL((table), (i)) = (v))
+#define PHASH_SET(table, i, v) (PHASH((table), (i)) = (v))
+
+/* this function depends much on packed layout, so that it placed here */
+static inline void
+remove_packed_entry(st_table *table, st_index_t i)
+{
+    table->real_entries--;
+    table->num_entries--;
+    if (i < table->real_entries) {
+	MEMMOVE(&PACKED_ENT(table, i), &PACKED_ENT(table, i+1),
+		st_packed_entry, table->real_entries - i);
+    }
+}
+
+static inline void
+remove_safe_packed_entry(st_table *table, st_index_t i, st_data_t never)
+{
+    table->num_entries--;
+    PKEY_SET(table, i, never);
+    PVAL_SET(table, i, never);
+    PHASH_SET(table, i, 0);
+}
+
+/* ultrapacking */
+#define real_upacked num_bins
+#define MAX_UPACKED_HASH 1
+#define ULTRAPACKED(table) ((table)->real_upacked <= 1)
+#define UPACKED_ENT(table) ((table)->as.upacked)
+#define UPKEY(table) UPACKED_ENT(table).key
+#define UPVAL(table) UPACKED_ENT(table).val
+#define UPHASH(table) UPACKED_ENT(table).hash
+#define UPKEY_SET(table, v) (UPACKED_ENT(table).key = (v))
+#define UPVAL_SET(table, v) (UPACKED_ENT(table).val = (v))
+#define UPHASH_SET(table, v) (UPACKED_ENT(table).hash = (v))
+static inline void
+remove_upacked_entry(st_table *table)
+{
+    table->real_upacked = table->num_entries = 0;
+}
+
+static inline void
+remove_safe_upacked_entry(st_table *table, st_data_t never)
+{
+    table->num_entries = 0;
+    UPKEY_SET(table, never);
+    UPVAL_SET(table, never);
+    UPHASH_SET(table, 0);
+}
 /*
  * MINSIZE is the minimum size of a dictionary.
  */
@@ -85,8 +203,8 @@ static void rehash(st_table *);
 Table of prime numbers 2^n+a, 2<=n<=30.
 */
 static const unsigned int primes[] = {
-	8 + 3,
-	16 + 3,
+	ST_DEFAULT_INIT_TABLE_SIZE,
+	ST_DEFAULT_SECOND_TABLE_SIZE,
 	32 + 5,
 	64 + 3,
 	128 + 3,
@@ -161,8 +279,6 @@ stat_col(void)
 }
 #endif
 
-#define MAX_PACKED_NUMHASH (ST_DEFAULT_INIT_TABLE_SIZE/2)
-
 st_table*
 st_init_table_with_size(const struct st_hash_type *type, st_index_t size)
 {
@@ -181,14 +297,19 @@ st_init_table_with_size(const struct st_hash_type *type, st_index_t size)
     }
 #endif
 
-    size = new_size(size);	/* round up to prime number */
 
-    tbl = alloc(st_table);
+    tbl = st_alloc_table();
     tbl->type = type;
     tbl->num_entries = 0;
-    tbl->entries_packed = type == &type_numhash && size/2 <= MAX_PACKED_NUMHASH;
+    tbl->entries_packed = size <= MAX_PACKED_HASH;
+    if (tbl->entries_packed) {
+	size = size <= MAX_UPACKED_HASH ? 0 : ST_DEFAULT_PACKED_TABLE_SIZE;
+    }
+    else {
+	size = new_size(size);	/* round up to prime number */
+    }
     tbl->num_bins = size;
-    tbl->bins = (st_table_entry **)Calloc(size, sizeof(st_table_entry*));
+    tbl->bins = size ? st_alloc_bins(size) : 0;
     tbl->head = 0;
     tbl->tail = 0;
 
@@ -243,17 +364,23 @@ st_clear(st_table *table)
     register st_table_entry *ptr, *next;
     st_index_t i;
 
+    if (ULTRAPACKED(table)) {
+	remove_upacked_entry(table);
+	return;
+    }
+
     if (table->entries_packed) {
         table->num_entries = 0;
+        table->real_entries = 0;
         return;
     }
 
-    for(i = 0; i < table->num_bins; i++) {
+    for (i = 0; i < table->num_bins; i++) {
 	ptr = table->bins[i];
 	table->bins[i] = 0;
 	while (ptr != 0) {
 	    next = ptr->next;
-	    free(ptr);
+	    st_free_entry(ptr);
 	    ptr = next;
 	}
     }
@@ -266,14 +393,19 @@ void
 st_free_table(st_table *table)
 {
     st_clear(table);
-    free(table->bins);
-    free(table);
+    if (!ULTRAPACKED(table)) {
+	st_free_bins(table->bins, table->num_bins);
+    }
+    st_dealloc_table(table);
 }
 
 size_t
 st_memsize(const st_table *table)
 {
-    if (table->entries_packed) {
+    if (ULTRAPACKED(table)) {
+	return sizeof(st_table);
+    }
+    else if (table->entries_packed) {
 	return table->num_bins * sizeof (void *) + sizeof(st_table);
     }
     else {
@@ -306,46 +438,77 @@ count_collision(const struct st_hash_type *type)
 #define FOUND_ENTRY
 #endif
 
-#define FIND_ENTRY(table, ptr, hash_val, bin_pos) do {\
-    (bin_pos) = (hash_val)%(table)->num_bins;\
-    (ptr) = (table)->bins[(bin_pos)];\
-    FOUND_ENTRY;\
-    if (PTR_NOT_EQUAL((table), (ptr), (hash_val), key)) {\
-	COLLISION;\
-	while (PTR_NOT_EQUAL((table), (ptr)->next, (hash_val), key)) {\
-	    (ptr) = (ptr)->next;\
-	}\
-	(ptr) = (ptr)->next;\
-    }\
-} while (0)
+#define FIND_ENTRY(table, ptr, hash_val, bin_pos) \
+    ((ptr) = find_entry((table), key, (hash_val), ((bin_pos) = (hash_val)%(table)->num_bins)))
+
+static st_table_entry *
+find_entry(st_table *table, st_data_t key, st_index_t hash_val, st_index_t bin_pos)
+{
+    register st_table_entry *ptr = table->bins[bin_pos];
+    FOUND_ENTRY;
+    if (PTR_NOT_EQUAL(table, ptr, hash_val, key)) {
+	COLLISION;
+	while (PTR_NOT_EQUAL(table, ptr->next, hash_val, key)) {
+	    ptr = ptr->next;
+	}
+	ptr = ptr->next;
+    }
+    return ptr;
+}
+
+static inline st_index_t
+find_packed_index(st_table *table, st_index_t hash_val, st_data_t key)
+{
+    st_index_t i = 0;
+    while (i < table->real_entries &&
+	   (PHASH(table, i) != hash_val || !EQUAL(table, key, PKEY(table, i)))) {
+	i++;
+    }
+    return i;
+}
+
+static inline int
+check_upacked(st_table *table, st_index_t hash_val, st_data_t key)
+{
+    return table->num_entries &&
+	UPHASH(table) == hash_val &&
+	EQUAL(table, key, UPKEY(table));
+}
 
 #define collision_check 0
 
 int
 st_lookup(st_table *table, register st_data_t key, st_data_t *value)
 {
-    st_index_t hash_val, bin_pos;
+    st_index_t hash_val;
     register st_table_entry *ptr;
 
+    hash_val = do_hash(key, table);
+
+    if (ULTRAPACKED(table)) {
+	if (check_upacked(table, hash_val, key)) {
+	    if (value != 0) *value = UPVAL(table);
+	    return 1;
+	}
+	return 0;
+    }
+
     if (table->entries_packed) {
-        st_index_t i;
-        for (i = 0; i < table->num_entries; i++) {
-            if ((st_data_t)table->bins[i*2] == key) {
-                if (value !=0) *value = (st_data_t)table->bins[i*2+1];
-                return 1;
-            }
-        }
+	st_index_t i = find_packed_index(table, hash_val, key);
+	if (i < table->real_entries) {
+	    if (value != 0) *value = PVAL(table, i);
+	    return 1;
+	}
         return 0;
     }
 
-    hash_val = do_hash(key, table);
-    FIND_ENTRY(table, ptr, hash_val, bin_pos);
+    ptr = find_entry(table, key, hash_val, hash_val % table->num_bins);
 
     if (ptr == 0) {
 	return 0;
     }
     else {
-	if (value != 0)  *value = ptr->record;
+	if (value != 0) *value = ptr->record;
 	return 1;
     }
 }
@@ -353,22 +516,29 @@ st_lookup(st_table *table, register st_data_t key, st_data_t *value)
 int
 st_get_key(st_table *table, register st_data_t key, st_data_t *result)
 {
-    st_index_t hash_val, bin_pos;
+    st_index_t hash_val;
     register st_table_entry *ptr;
 
+    hash_val = do_hash(key, table);
+
+    if (ULTRAPACKED(table)) {
+	if (check_upacked(table, hash_val, key)) {
+	    if (result != 0) *result = UPKEY(table);
+	    return 1;
+	}
+	return 0;
+    }
+
     if (table->entries_packed) {
-        st_index_t i;
-        for (i = 0; i < table->num_entries; i++) {
-            if ((st_data_t)table->bins[i*2] == key) {
-                if (result !=0) *result = (st_data_t)table->bins[i*2];
-                return 1;
-            }
-        }
+	st_index_t i = find_packed_index(table, hash_val, key);
+	if (i < table->real_entries) {
+	    if (result != 0) *result = PKEY(table, i);
+	    return 1;
+	}
         return 0;
     }
 
-    hash_val = do_hash(key, table);
-    FIND_ENTRY(table, ptr, hash_val, bin_pos);
+    ptr = find_entry(table, key, hash_val, hash_val % table->num_bins);
 
     if (ptr == 0) {
 	return 0;
@@ -382,85 +552,151 @@ st_get_key(st_table *table, register st_data_t key, st_data_t *result)
 #undef collision_check
 #define collision_check 1
 
-#define MORE_PACKABLE_P(table) \
-    ((st_index_t)((table)->num_entries+1) * 2 <= (table)->num_bins && \
-     (table)->num_entries+1 <= MAX_PACKED_NUMHASH)
-
-#define ADD_DIRECT(table, key, value, hash_val, bin_pos)\
-do {\
-    st_table_entry *entry;\
-    if ((table)->num_entries > ST_DEFAULT_MAX_DENSITY * (table)->num_bins) {\
-	rehash(table);\
-        (bin_pos) = (hash_val) % (table)->num_bins;\
-    }\
-    \
-    entry = alloc(st_table_entry);\
-    \
-    entry->hash = (hash_val);\
-    entry->key = (key);\
-    entry->record = (value);\
-    entry->next = (table)->bins[(bin_pos)];\
-    if ((table)->head != 0) {\
-	entry->fore = 0;\
-	(entry->back = (table)->tail)->fore = entry;\
-	(table)->tail = entry;\
-    }\
-    else {\
-	(table)->head = (table)->tail = entry;\
-	entry->fore = entry->back = 0;\
-    }\
-    (table)->bins[(bin_pos)] = entry;\
-    (table)->num_entries++;\
-} while (0)
+static inline st_table_entry *
+new_entry(st_table * table, st_data_t key, st_data_t value,
+	st_index_t hash_val, register st_index_t bin_pos)
+{
+    register st_table_entry *entry = st_alloc_entry();
+
+    entry->next = table->bins[bin_pos];
+    table->bins[bin_pos] = entry;
+    entry->hash = hash_val;
+    entry->key = key;
+    entry->record = value;
+
+    return entry;
+}
+
+static inline void
+add_direct(st_table *table, st_data_t key, st_data_t value,
+	   st_index_t hash_val, register st_index_t bin_pos)
+{
+    register st_table_entry *entry;
+    if (table->num_entries > ST_DEFAULT_MAX_DENSITY * table->num_bins) {
+	rehash(table);
+        bin_pos = hash_val % table->num_bins;
+    }
+
+    entry = new_entry(table, key, value, hash_val, bin_pos);
+
+    if (table->head != 0) {
+	entry->fore = 0;
+	(entry->back = table->tail)->fore = entry;
+	table->tail = entry;
+    }
+    else {
+	table->head = table->tail = entry;
+	entry->fore = entry->back = 0;
+    }
+    table->num_entries++;
+}
 
 static void
 unpack_entries(register st_table *table)
 {
     st_index_t i;
-    struct st_table_entry *packed_bins[MAX_PACKED_NUMHASH*2];
+    st_packed_entry packed_bins[MAX_PACKED_HASH];
+    register st_table_entry *entry, *preventry = 0, **chain;
     st_table tmp_table = *table;
 
-    memcpy(packed_bins, table->bins, sizeof(struct st_table_entry *) * table->num_entries*2);
-    table->bins = packed_bins;
+    MEMCPY(packed_bins, PACKED_BINS(table), st_packed_entry, MAX_PACKED_HASH);
+    table->as.packed.entries = packed_bins;
     tmp_table.entries_packed = 0;
-    tmp_table.num_entries = 0;
-    memset(tmp_table.bins, 0, sizeof(struct st_table_entry *) * tmp_table.num_bins);
-    for (i = 0; i < table->num_entries; i++) {
-        st_insert(&tmp_table, (st_data_t)packed_bins[i*2], (st_data_t)packed_bins[i*2+1]);
-    }
+#if ST_DEFAULT_INIT_TABLE_SIZE == ST_DEFAULT_PACKED_TABLE_SIZE
+    MEMZERO(tmp_table.bins, st_table_entry*, tmp_table.num_bins);
+#else
+    tmp_table.bins = st_realloc_bins(tmp_table.bins, ST_DEFAULT_INIT_TABLE_SIZE, tmp_table.num_bins);
+    tmp_table.num_bins = ST_DEFAULT_INIT_TABLE_SIZE;
+#endif
+    i = 0;
+    chain = &tmp_table.head;
+    do {
+	st_data_t key = packed_bins[i].key;
+	st_data_t val = packed_bins[i].val;
+	st_index_t hash = packed_bins[i].hash;
+	entry = new_entry(&tmp_table, key, val, hash,
+			  hash % ST_DEFAULT_INIT_TABLE_SIZE);
+	*chain = entry;
+	entry->back = preventry;
+	preventry = entry;
+	chain = &entry->fore;
+    } while (++i < MAX_PACKED_HASH);
+    *chain = NULL;
+    tmp_table.tail = entry;
     *table = tmp_table;
 }
 
+static void
+add_packed_direct(st_table *table, st_data_t key, st_data_t value, st_index_t hash_val)
+{
+    if (table->real_entries < MAX_PACKED_HASH) {
+	st_index_t i = table->real_entries++;
+	PKEY_SET(table, i, key);
+	PVAL_SET(table, i, value);
+	PHASH_SET(table, i, hash_val);
+	table->num_entries++;
+    }
+    else {
+	unpack_entries(table);
+	add_direct(table, key, value, hash_val, hash_val % table->num_bins);
+    }
+}
+
+static void
+add_upacked_direct(register st_table *table, register st_data_t key, st_data_t value, st_index_t hash_val)
+{
+    if (table->real_upacked) {
+	st_packed_entry *entries = (st_packed_entry *) st_alloc_bins(ST_DEFAULT_PACKED_TABLE_SIZE);
+	entries[0] = UPACKED_ENT(table);
+	entries[1].hash = hash_val;
+	entries[1].key = key;
+	entries[1].val = value;
+	table->num_bins = ST_DEFAULT_PACKED_TABLE_SIZE;
+	table->real_entries = 2;
+	table->num_entries++;
+	table->as.packed.entries = entries;
+    }
+    else {
+	table->real_upacked = 1;
+	table->num_entries = 1;
+	UPHASH_SET(table, hash_val);
+	UPKEY_SET(table, key);
+	UPVAL_SET(table, value);
+    }
+}
+
 int
 st_insert(register st_table *table, register st_data_t key, st_data_t value)
 {
-    st_index_t hash_val, bin_pos;
+    st_index_t hash_val;
+    register st_index_t bin_pos;
     register st_table_entry *ptr;
 
+    hash_val = do_hash(key, table);
+
+    if (ULTRAPACKED(table)) {
+	if (check_upacked(table, hash_val, key)) {
+	    UPVAL_SET(table, value);
+	    return 1;
+	}
+	add_upacked_direct(table, key, value, hash_val);
+	return 0;
+    }
+
     if (table->entries_packed) {
-        st_index_t i;
-        for (i = 0; i < table->num_entries; i++) {
-            if ((st_data_t)table->bins[i*2] == key) {
-                table->bins[i*2+1] = (struct st_table_entry*)value;
-                return 1;
-            }
-        }
-        if (MORE_PACKABLE_P(table)) {
-            i = table->num_entries++;
-            table->bins[i*2] = (struct st_table_entry*)key;
-            table->bins[i*2+1] = (struct st_table_entry*)value;
-            return 0;
-        }
-        else {
-            unpack_entries(table);
+	st_index_t i = find_packed_index(table, hash_val, key);
+	if (i < table->real_entries) {
+	    PVAL_SET(table, i, value);
+	    return 1;
         }
+	add_packed_direct(table, key, value, hash_val);
+	return 0;
     }
 
-    hash_val = do_hash(key, table);
     FIND_ENTRY(table, ptr, hash_val, bin_pos);
 
     if (ptr == 0) {
-	ADD_DIRECT(table, key, value, hash_val, bin_pos);
+	add_direct(table, key, value, hash_val, bin_pos);
 	return 0;
     }
     else {
@@ -473,34 +709,38 @@ int
 st_insert2(register st_table *table, register st_data_t key, st_data_t value,
 	   st_data_t (*func)(st_data_t))
 {
-    st_index_t hash_val, bin_pos;
+    st_index_t hash_val;
+    register st_index_t bin_pos;
     register st_table_entry *ptr;
 
+    hash_val = do_hash(key, table);
+
+    if (ULTRAPACKED(table)) {
+	if (check_upacked(table, hash_val, key)) {
+	    UPVAL_SET(table, value);
+	    return 1;
+	}
+	key = (*func)(key);
+	add_upacked_direct(table, key, value, hash_val);
+	return 0;
+    }
+
     if (table->entries_packed) {
-        st_index_t i;
-        for (i = 0; i < table->num_entries; i++) {
-            if ((st_data_t)table->bins[i*2] == key) {
-                table->bins[i*2+1] = (struct st_table_entry*)value;
-                return 1;
-            }
-        }
-        if (MORE_PACKABLE_P(table)) {
-            i = table->num_entries++;
-            table->bins[i*2] = (struct st_table_entry*)key;
-            table->bins[i*2+1] = (struct st_table_entry*)value;
-            return 0;
-        }
-        else {
-            unpack_entries(table);
-        }
+	st_index_t i = find_packed_index(table, hash_val, key);
+	if (i < table->real_entries) {
+	    PVAL_SET(table, i, value);
+	    return 1;
+	}
+	key = (*func)(key);
+	add_packed_direct(table, key, value, hash_val);
+	return 0;
     }
 
-    hash_val = do_hash(key, table);
     FIND_ENTRY(table, ptr, hash_val, bin_pos);
 
     if (ptr == 0) {
 	key = (*func)(key);
-	ADD_DIRECT(table, key, value, hash_val, bin_pos);
+	add_direct(table, key, value, hash_val, bin_pos);
 	return 0;
     }
     else {
@@ -512,36 +752,30 @@ st_insert2(register st_table *table, register st_data_t key, st_data_t value,
 void
 st_add_direct(st_table *table, st_data_t key, st_data_t value)
 {
-    st_index_t hash_val, bin_pos;
+    st_index_t hash_val;
+
+    hash_val = do_hash(key, table);
+    if (ULTRAPACKED(table)) {
+	add_upacked_direct(table, key, value, hash_val);
+	return;
+    }
 
     if (table->entries_packed) {
-        int i;
-        if (MORE_PACKABLE_P(table)) {
-            i = table->num_entries++;
-            table->bins[i*2] = (struct st_table_entry*)key;
-            table->bins[i*2+1] = (struct st_table_entry*)value;
-            return;
-        }
-        else {
-            unpack_entries(table);
-        }
+	add_packed_direct(table, key, value, hash_val);
+	return;
     }
 
-    hash_val = do_hash(key, table);
-    bin_pos = hash_val % table->num_bins;
-    ADD_DIRECT(table, key, value, hash_val, bin_pos);
+    add_direct(table, key, value, hash_val, hash_val % table->num_bins);
 }
 
 static void
 rehash(register st_table *table)
 {
     register st_table_entry *ptr, **new_bins;
-    st_index_t i, new_num_bins, hash_val;
+    st_index_t new_num_bins, hash_val;
 
     new_num_bins = new_size(table->num_bins+1);
-    new_bins = (st_table_entry**)
-	xrealloc(table->bins, new_num_bins * sizeof(st_table_entry*));
-    for (i = 0; i < new_num_bins; ++i) new_bins[i] = 0;
+    new_bins = st_realloc_bins(table->bins, new_num_bins, table->num_bins);
     table->num_bins = new_num_bins;
     table->bins = new_bins;
 
@@ -558,34 +792,37 @@ st_table*
 st_copy(st_table *old_table)
 {
     st_table *new_table;
-    st_table_entry *ptr, *entry, *prev, **tail;
+    st_table_entry *ptr, *entry, *prev, **tailp;
     st_index_t num_bins = old_table->num_bins;
     st_index_t hash_val;
 
-    new_table = alloc(st_table);
+    new_table = st_alloc_table();
     if (new_table == 0) {
 	return 0;
     }
 
     *new_table = *old_table;
-    new_table->bins = (st_table_entry**)
-	Calloc((unsigned)num_bins, sizeof(st_table_entry*));
+    if (ULTRAPACKED(old_table)) {
+	return new_table;
+    }
+
+    new_table->bins = st_alloc_bins(num_bins);
 
     if (new_table->bins == 0) {
-	free(new_table);
+	st_dealloc_table(new_table);
 	return 0;
     }
 
     if (old_table->entries_packed) {
-        memcpy(new_table->bins, old_table->bins, sizeof(struct st_table_entry *) * old_table->num_bins);
+        MEMCPY(new_table->bins, old_table->bins, st_table_entry*, old_table->num_bins);
         return new_table;
     }
 
     if ((ptr = old_table->head) != 0) {
 	prev = 0;
-	tail = &new_table->head;
+	tailp = &new_table->head;
 	do {
-	    entry = alloc(st_table_entry);
+	    entry = st_alloc_entry();
 	    if (entry == 0) {
 		st_free_table(new_table);
 		return 0;
@@ -595,8 +832,8 @@ st_copy(st_table *old_table)
 	    entry->next = new_table->bins[hash_val];
 	    new_table->bins[hash_val] = entry;
 	    entry->back = prev;
-	    *tail = prev = entry;
-	    tail = &entry->fore;
+	    *tailp = prev = entry;
+	    tailp = &entry->fore;
 	} while ((ptr = ptr->fore) != 0);
 	new_table->tail = prev;
     }
@@ -604,21 +841,22 @@ st_copy(st_table *old_table)
     return new_table;
 }
 
-#define REMOVE_ENTRY(table, ptr) do					\
-    {									\
-	if ((ptr)->fore == 0 && (ptr)->back == 0) {			\
-	    (table)->head = 0;						\
-	    (table)->tail = 0;						\
-	}								\
-	else {								\
-	    st_table_entry *fore = (ptr)->fore, *back = (ptr)->back;	\
-	    if (fore) fore->back = back;				\
-	    if (back) back->fore = fore;				\
-	    if ((ptr) == (table)->head) (table)->head = fore;		\
-	    if ((ptr) == (table)->tail) (table)->tail = back;		\
-	}								\
-	(table)->num_entries--;						\
-    } while (0)
+static inline void
+remove_entry(st_table *table, st_table_entry *ptr)
+{
+    if (ptr->fore == 0 && ptr->back == 0) {
+	table->head = 0;
+	table->tail = 0;
+    }
+    else {
+	st_table_entry *fore = ptr->fore, *back = ptr->back;
+	if (fore) fore->back = back;
+	if (back) back->fore = fore;
+	if (ptr == table->head) table->head = fore;
+	if (ptr == table->tail) table->tail = back;
+    }
+    table->num_entries--;
+}
 
 int
 st_delete(register st_table *table, register st_data_t *key, st_data_t *value)
@@ -627,30 +865,38 @@ st_delete(register st_table *table, register st_data_t *key, st_data_t *value)
     st_table_entry **prev;
     register st_table_entry *ptr;
 
+    hash_val = do_hash(*key, table);
+
+    if (ULTRAPACKED(table)) {
+	if (check_upacked(table, hash_val, *key)) {
+	    if (value != 0) *value = UPVAL(table);
+	    *key = UPKEY(table);
+	    remove_upacked_entry(table);
+	    return 1;
+	}
+	return 0;
+    }
+
     if (table->entries_packed) {
-        st_index_t i;
-        for (i = 0; i < table->num_entries; i++) {
-            if ((st_data_t)table->bins[i*2] == *key) {
-                if (value != 0) *value = (st_data_t)table->bins[i*2+1];
-                table->num_entries--;
-                memmove(&table->bins[i*2], &table->bins[(i+1)*2],
-                        sizeof(struct st_table_entry*) * 2*(table->num_entries-i));
-                return 1;
-            }
+	st_index_t i = find_packed_index(table, hash_val, *key);
+	if (i < table->real_entries) {
+	    if (value != 0) *value = PVAL(table, i);
+	    *key = PKEY(table, i);
+	    remove_packed_entry(table, i);
+	    return 1;
         }
         if (value != 0) *value = 0;
         return 0;
     }
 
-    hash_val = do_hash_bin(*key, table);
-
-    for (prev = &table->bins[hash_val]; (ptr = *prev) != 0; prev = &ptr->next) {
+    prev = &table->bins[hash_val % table->num_bins];
+    for (;(ptr = *prev) != 0; prev = &ptr->next) {
 	if (EQUAL(table, *key, ptr->key)) {
 	    *prev = ptr->next;
-	    REMOVE_ENTRY(table, ptr);
+	    remove_entry(table, ptr);
 	    if (value != 0) *value = ptr->record;
 	    *key = ptr->key;
-	    free(ptr);
+	    st_free_entry(ptr);
 	    return 1;
 	}
     }
@@ -665,25 +911,36 @@ st_delete_safe(register st_table *table, register st_data_t *key, st_data_t *val
     st_index_t hash_val;
     register st_table_entry *ptr;
 
+    hash_val = do_hash(*key, table);
+
+    if (ULTRAPACKED(table)) {
+	if (check_upacked(table, hash_val, *key)) {
+	    if (value != 0) *value = UPVAL(table);
+	    *key = UPKEY(table);
+	    remove_safe_upacked_entry(table, never);
+	    return 1;
+	}
+	if (value != 0) *value = 0;
+	return 0;
+    }
+
     if (table->entries_packed) {
-	st_index_t i;
-	for (i = 0; i < table->num_entries; i++) {
-	    if ((st_data_t)table->bins[i*2] == *key) {
-		if (value != 0) *value = (st_data_t)table->bins[i*2+1];
-		table->bins[i*2] = (void *)never;
-		return 1;
-	    }
+	st_index_t i = find_packed_index(table, hash_val, *key);
+	if (i < table->real_entries) {
+	    if (value != 0) *value = PVAL(table, i);
+	    *key = PKEY(table, i);
+	    remove_safe_packed_entry(table, i, never);
+	    return 1;
 	}
 	if (value != 0) *value = 0;
 	return 0;
     }
 
-    hash_val = do_hash_bin(*key, table);
-    ptr = table->bins[hash_val];
+    ptr = table->bins[hash_val % table->num_bins];
 
     for (; ptr != 0; ptr = ptr->next) {
 	if ((ptr->key != never) && EQUAL(table, ptr->key, *key)) {
-	    REMOVE_ENTRY(table, ptr);
+	    remove_entry(table, ptr);
 	    *key = ptr->key;
 	    if (value != 0) *value = ptr->record;
 	    ptr->key = ptr->record = never;
@@ -701,17 +958,23 @@ st_cleanup_safe(st_table *table, st_data_t never)
     st_table_entry *ptr, **last, *tmp;
     st_index_t i;
 
+    if (ULTRAPACKED(table)) {
+	table->real_upacked = table->num_entries;
+	return;
+    }
+
     if (table->entries_packed) {
 	st_index_t i = 0, j = 0;
-	while ((st_data_t)table->bins[i*2] != never) {
-	    if (i++ == table->num_entries) return;
+	while (PKEY(table, i) != never) {
+	    if (i++ == table->real_entries) return;
 	}
-	for (j = i; ++i < table->num_entries;) {
-	    if ((st_data_t)table->bins[i*2] == never) continue;
-	    table->bins[j*2] = table->bins[i*2];
-	    table->bins[j*2+1] = table->bins[i*2+1];
+	for (j = i; ++i < table->real_entries;) {
+	    if (PKEY(table, i) == never) continue;
+	    PACKED_ENT(table, j) = PACKED_ENT(table, i);
 	    j++;
 	}
+	table->real_entries = j;
+	/* table->num_entries really should be equal j at this moment, but let set it anyway */
 	table->num_entries = j;
 	return;
     }
@@ -722,7 +985,7 @@ st_cleanup_safe(st_table *table, st_data_t never)
 	    if (ptr->key == never) {
 		tmp = ptr;
 		*last = ptr = ptr->next;
-		free(tmp);
+		st_free_entry(tmp);
 	    }
 	    else {
 		ptr = *(last = &ptr->next);
@@ -732,50 +995,78 @@ st_cleanup_safe(st_table *table, st_data_t never)
 }
 
 int
-st_foreach(st_table *table, int (*func)(ANYARGS), st_data_t arg)
+st_foreach_check(st_table *table, int (*func)(ANYARGS), st_data_t arg, st_data_t never)
 {
     st_table_entry *ptr, **last, *tmp;
     enum st_retval retval;
-    st_index_t i;
+    st_data_t key, val;
+    st_index_t hash, i = 0;
+
+    if (table->num_entries == 0) {
+	return 0;
+    }
+
+    if (ULTRAPACKED(table)) {
+	key = UPKEY(table);
+	val = UPVAL(table);
+	hash = UPHASH(table);
+	if (key == never) return 0;
+	retval = (*func)(key, val, arg);
+	if (!ULTRAPACKED(table)) {
+	    goto packed;
+	}
+	switch(retval) {
+	  case ST_CHECK:
+	    if (UPHASH(table) == 0 && UPKEY(table) == never)
+		break;
+	    if (check_upacked(table, hash, key))
+		break;
+	    goto deleted;
+	  case ST_DELETE:
+	    remove_safe_upacked_entry(table, never);
+	  case ST_CONTINUE:
+	  case ST_STOP:
+	    break;
+	}
+	return 0;
+    }
 
     if (table->entries_packed) {
-        for (i = 0; i < table->num_entries; i++) {
-            st_index_t j;
-            st_data_t key, val;
-            key = (st_data_t)table->bins[i*2];
-            val = (st_data_t)table->bins[i*2+1];
-            retval = (*func)(key, val, arg);
+	for (i = 0; i < table->real_entries; i++) {
+	    key = PKEY(table, i);
+	    val = PVAL(table, i);
+	    hash = PHASH(table, i);
+	    if (key == never) continue;
+	    retval = (*func)(key, val, arg);
+	  packed:
 	    if (!table->entries_packed) {
-		FIND_ENTRY(table, ptr, key, i);
+		FIND_ENTRY(table, ptr, hash, i);
 		if (retval == ST_CHECK) {
 		    if (!ptr) goto deleted;
 		    goto unpacked_continue;
 		}
 		goto unpacked;
 	    }
-            switch (retval) {
+	    switch (retval) {
 	      case ST_CHECK:	/* check if hash is modified during iteration */
-                for (j = 0; j < table->num_entries; j++) {
-                    if ((st_data_t)table->bins[j*2] == key)
-                        break;
-                }
-                if (j == table->num_entries) {
+		if (PHASH(table, i) == 0 && PKEY(table, i) == never) {
+		    break;
+		}
+		i = find_packed_index(table, hash, key);
+		if (i == table->real_entries) {
 		    goto deleted;
-                }
+		}
 		/* fall through */
 	      case ST_CONTINUE:
 		break;
 	      case ST_STOP:
 		return 0;
 	      case ST_DELETE:
-                table->num_entries--;
-                memmove(&table->bins[i*2], &table->bins[(i+1)*2],
-                        sizeof(struct st_table_entry*) * 2*(table->num_entries-i));
-                i--;
-                break;
-            }
-        }
-        return 0;
+		remove_safe_packed_entry(table, i, never);
+		break;
+	    }
+	}
+	return 0;
     }
     else {
 	ptr = table->head;
@@ -783,6 +1074,8 @@ st_foreach(st_table *table, int (*func)(ANYARGS), st_data_t arg)
 
     if (ptr != 0) {
 	do {
+	    if (ptr->key == never)
+		goto unpacked_continue;
 	    i = ptr->hash % table->num_bins;
 	    retval = (*func)(ptr->key, ptr->record, arg);
 	  unpacked:
@@ -808,10 +1101,100 @@ st_foreach(st_table *table, int (*func)(ANYARGS), st_data_t arg)
 		for (; (tmp = *last) != 0; last = &tmp->next) {
 		    if (ptr == tmp) {
 			tmp = ptr->fore;
+			remove_entry(table, ptr);
+			ptr->key = ptr->record = never;
+			ptr->hash = 0;
+			ptr = tmp;
+			break;
+		    }
+		}
+	    }
+	} while (ptr && table->head);
+    }
+    return 0;
+}
+
+int
+st_foreach(st_table *table, int (*func)(ANYARGS), st_data_t arg)
+{
+    st_table_entry *ptr, **last, *tmp;
+    enum st_retval retval;
+    st_data_t key, val;
+    st_index_t hash, i = 0;
+
+    if (table->num_entries == 0) {
+	return 0;
+    }
+
+    if (ULTRAPACKED(table)) {
+	key = UPKEY(table);
+	val = UPVAL(table);
+	hash = UPHASH(table);
+	retval = (*func)(key, val, arg);
+	if (!ULTRAPACKED(table)) {
+	    goto packed;
+	}
+	switch (retval) {
+	  case ST_DELETE:
+	    remove_upacked_entry(table);
+	  case ST_CONTINUE:
+	  case ST_CHECK:
+	  case ST_STOP:
+	    break;
+	}
+	return 0;
+    }
+
+    if (table->entries_packed) {
+	for (i = 0; i < table->real_entries; i++) {
+	    key = PKEY(table, i);
+	    val = PVAL(table, i);
+	    hash = PHASH(table, i);
+	    retval = (*func)(key, val, arg);
+	  packed:
+	    if (!table->entries_packed) {
+		FIND_ENTRY(table, ptr, hash, i);
+		if (!ptr) return 0;
+		goto unpacked;
+	    }
+	    switch (retval) {
+	      case ST_CONTINUE:
+		break;
+	      case ST_CHECK:
+	      case ST_STOP:
+		return 0;
+	      case ST_DELETE:
+		remove_packed_entry(table, i);
+		i--;
+		break;
+	    }
+	}
+	return 0;
+    }
+    else {
+	ptr = table->head;
+    }
+
+    if (ptr != 0) {
+	do {
+	    i = ptr->hash % table->num_bins;
+	    retval = (*func)(ptr->key, ptr->record, arg);
+	  unpacked:
+	    switch (retval) {
+	      case ST_CONTINUE:
+		ptr = ptr->fore;
+		break;
+	      case ST_CHECK:
+	      case ST_STOP:
+		return 0;
+	      case ST_DELETE:
+		last = &table->bins[ptr->hash % table->num_bins];
+		for (; (tmp = *last) != 0; last = &tmp->next) {
+		    if (ptr == tmp) {
+			tmp = ptr->fore;
 			*last = ptr->next;
-			REMOVE_ENTRY(table, ptr);
-			free(ptr);
-			if (ptr == tmp) return 0;
+			remove_entry(table, ptr);
+			st_free_entry(ptr);
 			ptr = tmp;
 			break;
 		    }
@@ -834,13 +1217,13 @@ st_reverse_foreach(st_table *table, int (*func)(ANYARGS), st_data_t arg)
         for (i = table->num_entries-1; 0 <= i; i--) {
             int j;
             st_data_t key, val;
-            key = (st_data_t)table->bins[i*2];
-            val = (st_data_t)table->bins[i*2+1];
+            key = PKEY(table, i);
+            val = PVAL(table, i);
             retval = (*func)(key, val, arg);
             switch (retval) {
 	      case ST_CHECK:	/* check if hash is modified during iteration */
                 for (j = 0; j < table->num_entries; j++) {
-                    if ((st_data_t)table->bins[j*2] == key)
+                    if (PKEY(table, j) == key)
                         break;
                 }
                 if (j == table->num_entries) {
@@ -854,9 +1237,7 @@ st_reverse_foreach(st_table *table, int (*func)(ANYARGS), st_data_t arg)
 	      case ST_STOP:
 		return 0;
 	      case ST_DELETE:
-                table->num_entries--;
-                memmove(&table->bins[i*2], &table->bins[(i+1)*2],
-                        sizeof(struct st_table_entry*) * 2*(table->num_entries-i));
+		remove_packed_entry(table, i);
                 break;
             }
         }
@@ -889,8 +1270,8 @@ st_reverse_foreach(st_table *table, int (*func)(ANYARGS), st_data_t arg)
 		    if (ptr == tmp) {
 			tmp = ptr->back;
 			*last = ptr->next;
-			REMOVE_ENTRY(table, ptr);
-			free(ptr);
+			remove_entry(table, ptr);
+			st_free_entry(ptr);
 			ptr = tmp;
 			break;
 		    }
diff --git a/variable.c b/variable.c
index 3da500e..303bb27 100644
--- a/variable.c
+++ b/variable.c
@@ -473,7 +473,7 @@ void
 rb_gc_mark_global_tbl(void)
 {
     if (rb_global_tbl)
-        st_foreach_safe(rb_global_tbl, mark_global_entry, 0);
+        st_foreach(rb_global_tbl, mark_global_entry, 0);
 }
 
 static ID
@@ -765,7 +765,7 @@ rb_f_global_variables(void)
     char buf[2];
     int i;
 
-    st_foreach_safe(rb_global_tbl, gvar_i, ary);
+    st_foreach(rb_global_tbl, gvar_i, ary);
     buf[0] = '$';
     for (i = 1; i <= 9; ++i) {
 	buf[1] = (char)(i + '0');
@@ -923,7 +923,7 @@ static int
 givar_i(VALUE obj, st_table *tbl)
 {
     if (rb_special_const_p(obj)) {
-	st_foreach_safe(tbl, givar_mark_i, 0);
+	st_foreach(tbl, givar_mark_i, 0);
     }
     return ST_CONTINUE;
 }
@@ -933,7 +933,7 @@ rb_mark_generic_ivar_tbl(void)
 {
     if (!generic_iv_tbl) return;
     if (special_generic_ivar == 0) return;
-    st_foreach_safe(generic_iv_tbl, givar_i, 0);
+    st_foreach(generic_iv_tbl, givar_i, 0);
 }
 
 void
@@ -1170,7 +1170,7 @@ obj_ivar_each(VALUE obj, int (*func)(ANYARGS), st_data_t arg)
     data.func = (int (*)(ID key, VALUE val, st_data_t arg))func;
     data.arg = arg;
 
-    st_foreach_safe(tbl, obj_ivar_i, (st_data_t)&data);
+    st_foreach(tbl, obj_ivar_i, (st_data_t)&data);
 }
 
 void
@@ -1730,7 +1730,7 @@ rb_mod_const_at(VALUE mod, void *data)
 	tbl = st_init_numtable();
     }
     if (RCLASS_CONST_TBL(mod)) {
-	st_foreach_safe(RCLASS_CONST_TBL(mod), sv_i, (st_data_t)tbl);
+	st_foreach(RCLASS_CONST_TBL(mod), sv_i, (st_data_t)tbl);
     }
     return tbl;
 }
@@ -1765,7 +1765,7 @@ rb_const_list(void *data)
 
     if (!tbl) return rb_ary_new2(0);
     ary = rb_ary_new2(tbl->num_entries);
-    st_foreach_safe(tbl, list_i, ary);
+    st_foreach(tbl, list_i, ary);
     st_free_table(tbl);
 
     return ary;
diff --git a/vm.c b/vm.c
index e997afa..064a4f8 100644
--- a/vm.c
+++ b/vm.c
@@ -1575,6 +1575,7 @@ rb_vm_mark(void *ptr)
 	RUBY_MARK_UNLESS_NULL(vm->thgroup_default);
 	RUBY_MARK_UNLESS_NULL(vm->mark_object_ary);
 	RUBY_MARK_UNLESS_NULL(vm->load_path);
+	RUBY_MARK_UNLESS_NULL(vm->load_path_expanded_cache);
 	RUBY_MARK_UNLESS_NULL(vm->loaded_features);
 	RUBY_MARK_UNLESS_NULL(vm->top_self);
 	RUBY_MARK_UNLESS_NULL(vm->coverages);
@@ -1606,16 +1607,17 @@ ruby_vm_destruct(rb_vm_t *vm)
 #if defined(ENABLE_VM_OBJSPACE) && ENABLE_VM_OBJSPACE
 	struct rb_objspace *objspace = vm->objspace;
 #endif
+	if (vm->living_threads) {
+	    st_table *living_threads = vm->living_threads;
+	    vm->living_threads = 0;
+	    st_free_table(living_threads);
+	}
 	rb_gc_force_recycle(vm->self);
 	vm->main_thread = 0;
 	if (th) {
 	    rb_fiber_reset_root_local_storage(th->self);
 	    thread_free(th);
 	}
-	if (vm->living_threads) {
-	    st_free_table(vm->living_threads);
-	    vm->living_threads = 0;
-	}
 #if defined(ENABLE_VM_OBJSPACE) && ENABLE_VM_OBJSPACE
 	if (objspace) {
 	    rb_objspace_free(objspace);
diff --git a/vm_core.h b/vm_core.h
index 7211005..e787d4b 100644
--- a/vm_core.h
+++ b/vm_core.h
@@ -298,6 +298,7 @@ typedef struct rb_vm_struct {
     /* load */
     VALUE top_self;
     VALUE load_path;
+    VALUE load_path_expanded_cache;
     VALUE loaded_features;
     struct st_table *loading_table;
 
patches/ruby/1.9.3/p374/ruby-multilib.patch000066400000000732147511530510014150 0ustar00--- a/tool/mkconfig.rb
+++ b/tool/mkconfig.rb
@@ -121,6 +121,7 @@
     val = val.gsub(/\$(?:\$|\{?(\w+)\}?)/) {$1 ? "$(#{$1})" : $&}.dump
     case name
     when /^prefix$/
+      v_runtime[:prefix] = val.slice(1..-2)
       val = "(TOPDIR || DESTDIR + #{val})"
     when /^ARCH_FLAG$/
       val = "arch_flag || #{val}" if universal
@@ -193,6 +194,7 @@
     x
   end
 end
+v_others.map!{|x| x.gsub(v_runtime[:prefix], "$(prefix)") }
 v_others.compact!
 
 if $install_name
patches/ruby/1.9.3/p286/cflags.patch000066400000002231147511530510012605 0ustar00--- a/configure.in
+++ b/configure.in
@@ -267,11 +267,9 @@
     cflagspat="$cflagspat;s|"`eval echo '"'"${debugflags}"'"' | sed 's/[[][|.*]]/\\&/g;s/^ */ /;s/ *$/ /'`'| |g'
 test -z "warnflags" ||
     cflagspat="$cflagspat;s|"`eval echo '"'"${warnflags}"'"' | sed 's/[[][|.*]]/\\&/g;s/^ */ /;s/ *$/ /'`'| |g'
-if test -z "${CFLAGS+set}"; then
-    cflags=`echo " $cflags " | sed "$cflagspat;s/^ *//;s/ *$//"`
-    orig_cflags="$cflags"
-    cflags="$cflags "'${optflags} ${debugflags} ${warnflags}'
-fi
+cflags=`echo " $cflags " | sed "$cflagspat;s/^ *//;s/ *$//"`
+orig_cflags="$cflags"
+cflags="$cflags "'${optflags} ${debugflags} ${warnflags}'
 if test -z "${CXXFLAGS+set}"; then
     cxxflags=`echo " $cxxflags " | sed "$cflagspat;s/^ *//;s/ *$//"`
     orig_cxxflags="$cxxflags"
@@ -511,7 +509,8 @@
     ])
 fi

-test -z "${ac_env_CFLAGS_set}" -a -n "${cflags+set}" && eval CFLAGS="\"$cflags $ARCH_FLAG\""
+test -z "${ac_env_CFLAGS_set}" && CFLAGS="$ARCH_FLAG"
+test -n "${cflags:+set}" && eval CFLAGS="\"$cflags\${CFLAGS:+ $CFLAGS}\""
 test -z "${ac_env_CXXFLAGS_set}" -a -n "${cxxflags+set}" && eval CXXFLAGS="\"$cxxflags $ARCH_FLAG\""

 dnl check for large file stuff
patches/ruby/1.9.3/p286/ruby-multilib.patch000066400000002321147511530510014146 0ustar00diff -u -wr a/tool/mkconfig.rb b/tool/mkconfig.rb
--- a/tool/mkconfig.rb  2012-10-08 05:57:16.948702976 +0200
+++ b/tool/mkconfig.rb  2011-08-13 15:17:30.000000000 +0200
@@ -40,6 +40,7 @@
 v_fast = []
 v_others = []
 vars = {}
+v_runtime = {}
 continued_name = nil
 continued_line = nil
 File.foreach "config.status" do |line|
@@ -118,7 +119,10 @@
     val = val.gsub(/\$(?:\$|\{?(\w+)\}?)/) {$1 ? "$(#{$1})" : $&}.dump
     case name
     when /^prefix$/
+      v_runtime[:prefix] = val.slice(1..-2)
       val = "(TOPDIR || DESTDIR + #{val})"
+    when /^libdir$/
+      v_runtime[:libdir] = File.basename(val.slice(1..-2))
     when /^ARCH_FLAG$/
       val = "arch_flag || #{val}" if universal
     when /^UNIVERSAL_ARCHNAMES$/
@@ -145,7 +149,7 @@

 drive = File::PATH_SEPARATOR == ';'

-prefix = "/lib/ruby/#{version}/#{arch}"
+prefix = "/#{v_runtime[:libdir]}/ruby/#{version}/#{arch}"
 print "  TOPDIR = File.dirname(__FILE__).chomp!(#{prefix.dump})\n"
 print "  DESTDIR = ", (drive ? "TOPDIR && TOPDIR[/\\A[a-z]:/i] || " : ""), "'' unless defined? DESTDIR\n"
 print <<'ARCH' if universal
@@ -190,6 +194,7 @@
     x
   end
 end
+v_others.map!{|x| x.gsub(v_runtime[:prefix], "$(prefix)") }
 v_others.compact!

 if $install_name
patches/ruby/1.9.3/p286/falcon.diff000066400000370602147511530510012433 0ustar00diff --git a/common.mk b/common.mk
index eb89a2b..59cdfe4 100644
--- a/common.mk
+++ b/common.mk
@@ -630,7 +630,8 @@ file.$(OBJEXT): {$(VPATH)}file.c $(RUBY_H_INCLUDES) {$(VPATH)}io.h \
 gc.$(OBJEXT): {$(VPATH)}gc.c $(RUBY_H_INCLUDES) {$(VPATH)}re.h \
   {$(VPATH)}regex.h $(ENCODING_H_INCLUDES) $(VM_CORE_H_INCLUDES) \
   {$(VPATH)}gc.h {$(VPATH)}io.h {$(VPATH)}eval_intern.h {$(VPATH)}util.h \
-  {$(VPATH)}debug.h {$(VPATH)}internal.h {$(VPATH)}constant.h
+  {$(VPATH)}debug.h {$(VPATH)}internal.h {$(VPATH)}constant.h \
+  {$(VPATH)}pool_alloc.inc.h {$(VPATH)}pool_alloc.h
 hash.$(OBJEXT): {$(VPATH)}hash.c $(RUBY_H_INCLUDES) {$(VPATH)}util.h \
   $(ENCODING_H_INCLUDES)
 inits.$(OBJEXT): {$(VPATH)}inits.c $(RUBY_H_INCLUDES) \
@@ -693,7 +694,7 @@ signal.$(OBJEXT): {$(VPATH)}signal.c $(RUBY_H_INCLUDES) \
   $(VM_CORE_H_INCLUDES) {$(VPATH)}debug.h
 sprintf.$(OBJEXT): {$(VPATH)}sprintf.c $(RUBY_H_INCLUDES) {$(VPATH)}re.h \
   {$(VPATH)}regex.h {$(VPATH)}vsnprintf.c $(ENCODING_H_INCLUDES)
-st.$(OBJEXT): {$(VPATH)}st.c $(RUBY_H_INCLUDES)
+st.$(OBJEXT): {$(VPATH)}st.c $(RUBY_H_INCLUDES) {$(VPATH)}pool_alloc.h
 strftime.$(OBJEXT): {$(VPATH)}strftime.c $(RUBY_H_INCLUDES) \
   {$(VPATH)}timev.h
 string.$(OBJEXT): {$(VPATH)}string.c $(RUBY_H_INCLUDES) {$(VPATH)}re.h \
diff --git a/configure.in b/configure.in
index 6d24689..1e15b10 100644
--- a/configure.in
+++ b/configure.in
@@ -1315,6 +1315,29 @@ main() {
 CFLAGS="$save_CFLAGS"])
 AC_DEFINE_UNQUOTED(GC_MARK_STACKFRAME_WORD, $rb_cv_gc_mark_stackframe_word)
 
+AS_CASE(["$target_os"],
+[openbsd*], [
+  AC_CACHE_CHECK(for heap align log on openbsd, rb_cv_page_size_log,
+    [rb_cv_page_size_log=no
+     for page_log in 12 13; do
+       AC_TRY_RUN([
+#include <math.h>
+#include <unistd.h>
+
+int
+main() {
+  if ((int)log2((double)sysconf(_SC_PAGESIZE)) != $page_log) return 1;
+  return 0;
+}
+       ],
+       rb_cv_page_size_log="$page_log"; break)
+     done])
+  if test $rb_cv_page_size_log != no; then
+    AC_DEFINE_UNQUOTED(HEAP_ALIGN_LOG, $rb_cv_page_size_log)
+  else
+    AC_DEFINE_UNQUOTED(HEAP_ALIGN_LOG, 12)
+  fi
+])
 
 dnl Checks for library functions.
 AC_TYPE_GETGROUPS
@@ -1415,7 +1438,8 @@ AC_CHECK_FUNCS(fmod killpg wait4 waitpid fork spawnv syscall __syscall chroot ge
 	      setsid telldir seekdir fchmod cosh sinh tanh log2 round\
 	      setuid setgid daemon select_large_fdset setenv unsetenv\
               mktime timegm gmtime_r clock_gettime gettimeofday poll ppoll\
-              pread sendfile shutdown sigaltstack dl_iterate_phdr)
+              pread sendfile shutdown sigaltstack dl_iterate_phdr\
+              dup3 pipe2 posix_memalign memalign)
 
 AC_CACHE_CHECK(for unsetenv returns a value, rb_cv_unsetenv_return_value,
   [AC_TRY_COMPILE([
diff --git a/ext/-test-/st/numhash/numhash.c b/ext/-test-/st/numhash/numhash.c
index e186cd4..53d9e1b 100644
--- a/ext/-test-/st/numhash/numhash.c
+++ b/ext/-test-/st/numhash/numhash.c
@@ -54,7 +54,7 @@ numhash_i(st_data_t key, st_data_t value, st_data_t arg, int error)
 static VALUE
 numhash_each(VALUE self)
 {
-    return st_foreach((st_table *)DATA_PTR(self), numhash_i, self) ? Qtrue : Qfalse;
+    return st_foreach_check((st_table *)DATA_PTR(self), numhash_i, self, 0) ? Qtrue : Qfalse;
 }
 
 void
diff --git a/file.c b/file.c
index 67b281a..e89a559 100644
--- a/file.c
+++ b/file.c
@@ -164,6 +164,10 @@ rb_get_path_check(VALUE obj, int level)
     }
     StringValue(tmp);
 
+    if (RBASIC(obj)->klass == rb_cExpandedPath) {
+        return obj;
+    }
+
     tmp = file_path_convert(tmp);
     if (obj != tmp && insecure_obj_p(tmp, level)) {
 	rb_insecure_operation();
@@ -2864,6 +2868,16 @@ file_expand_path(VALUE fname, VALUE dname, int abs_mode, VALUE result)
     BUFINIT();
     tainted = OBJ_TAINTED(fname);
 
+    if (RBASIC(fname)->klass == rb_cExpandedPath) {
+        size_t dlen = RSTRING_LEN(fname);
+        BUFCHECK(dlen > buflen);
+        strncpy(buf, RSTRING_PTR(fname), dlen + 1);
+        rb_str_set_len(result, dlen);
+        rb_enc_associate(result, rb_enc_check(result, fname));
+        ENC_CODERANGE_CLEAR(result);
+        return result;
+    }
+
     if (s[0] == '~' && abs_mode == 0) {      /* execute only if NOT absolute_path() */
 	long userlen = 0;
 	tainted = 1;
diff --git a/gc.c b/gc.c
index e65d0ec..a72a855 100644
--- a/gc.c
+++ b/gc.c
@@ -20,10 +20,12 @@
 #include "vm_core.h"
 #include "internal.h"
 #include "gc.h"
+#include "pool_alloc.h"
 #include "constant.h"
 #include <stdio.h>
 #include <setjmp.h>
 #include <sys/types.h>
+#include <assert.h>
 
 #ifdef HAVE_SYS_TIME_H
 #include <sys/time.h>
@@ -35,7 +37,12 @@
 
 #if defined _WIN32 || defined __CYGWIN__
 #include <windows.h>
+#elif defined(HAVE_POSIX_MEMALIGN)
+#elif defined(HAVE_MEMALIGN)
+#include <malloc.h>
 #endif
+static void aligned_free(void *);
+static void *aligned_malloc(size_t alignment, size_t size);
 
 #ifdef HAVE_VALGRIND_MEMCHECK_H
 # include <valgrind/memcheck.h>
@@ -84,10 +91,12 @@ typedef struct {
     unsigned int initial_malloc_limit;
     unsigned int initial_heap_min_slots;
     unsigned int initial_free_min;
+#if defined(ENABLE_VM_OBJSPACE) && ENABLE_VM_OBJSPACE
     int gc_stress;
+#endif
 } ruby_gc_params_t;
 
-ruby_gc_params_t initial_params = {
+static ruby_gc_params_t initial_params = {
     GC_MALLOC_LIMIT,
     HEAP_MIN_SLOTS,
     FREE_MIN,
@@ -103,7 +112,10 @@ ruby_gc_params_t initial_params = {
 int ruby_gc_debug_indent = 0;
 
 /* for GC profile */
+#ifndef GC_PROFILE_MORE_DETAIL
 #define GC_PROFILE_MORE_DETAIL 0
+#endif
+
 typedef struct gc_profile_record {
     double gc_time;
     double gc_mark_time;
@@ -301,17 +313,20 @@ typedef struct RVALUE {
 #endif
 
 struct heaps_slot {
-    void *membase;
-    RVALUE *slot;
-    size_t limit;
+    struct heaps_header *membase;
+    RVALUE *freelist;
     struct heaps_slot *next;
     struct heaps_slot *prev;
+    struct heaps_slot *free_next;
+    uintptr_t bits[1];
 };
 
-struct sorted_heaps_slot {
+struct heaps_header {
+    struct heaps_slot *base;
+    uintptr_t *bits;
     RVALUE *start;
     RVALUE *end;
-    struct heaps_slot *slot;
+    size_t limit;
 };
 
 struct gc_list {
@@ -319,7 +334,27 @@ struct gc_list {
     struct gc_list *next;
 };
 
+#ifndef CALC_EXACT_MALLOC_SIZE
 #define CALC_EXACT_MALLOC_SIZE 0
+#endif
+
+#ifdef POOL_ALLOC_API
+/* POOL ALLOC API */
+#define POOL_ALLOC_PART 1
+#include "pool_alloc.inc.h"
+#undef POOL_ALLOC_PART
+
+typedef struct pool_layout_t pool_layout_t;
+struct pool_layout_t {
+    pool_header
+      p6,  /* st_table && st_table_entry */
+      p11;  /* st_table.bins init size */
+} pool_layout = {
+    INIT_POOL(void*[6]),
+    INIT_POOL(void*[11])
+};
+static void pool_finalize_header(pool_header *header);
+#endif
 
 typedef struct rb_objspace {
     struct {
@@ -330,16 +365,19 @@ typedef struct rb_objspace {
 	size_t allocations;
 #endif
     } malloc_params;
+#ifdef POOL_ALLOC_API
+    pool_layout_t *pool_headers;
+#endif
     struct {
 	size_t increment;
 	struct heaps_slot *ptr;
 	struct heaps_slot *sweep_slots;
-	struct sorted_heaps_slot *sorted;
+	struct heaps_slot *free_slots;
+	struct heaps_header **sorted;
 	size_t length;
 	size_t used;
-	RVALUE *freelist;
+        struct heaps_slot *reserve_slots;
 	RVALUE *range[2];
-	RVALUE *freed;
 	size_t live_num;
 	size_t free_num;
 	size_t free_min;
@@ -350,6 +388,7 @@ typedef struct rb_objspace {
 	int dont_gc;
 	int dont_lazy_sweep;
 	int during_gc;
+	rb_atomic_t finalizing;
     } flags;
     struct {
 	st_table *table;
@@ -377,7 +416,11 @@ typedef struct rb_objspace {
 #define ruby_initial_gc_stress	initial_params.gc_stress
 int *ruby_initial_gc_stress_ptr = &ruby_initial_gc_stress;
 #else
+#  ifdef POOL_ALLOC_API
+static rb_objspace_t rb_objspace = {{GC_MALLOC_LIMIT}, &pool_layout, {HEAP_MIN_SLOTS}};
+#  else
 static rb_objspace_t rb_objspace = {{GC_MALLOC_LIMIT}, {HEAP_MIN_SLOTS}};
+#  endif
 int *ruby_initial_gc_stress_ptr = &rb_objspace.gc_stress;
 #endif
 #define malloc_limit		objspace->malloc_params.limit
@@ -385,13 +428,12 @@ int *ruby_initial_gc_stress_ptr = &rb_objspace.gc_stress;
 #define heaps			objspace->heap.ptr
 #define heaps_length		objspace->heap.length
 #define heaps_used		objspace->heap.used
-#define freelist		objspace->heap.freelist
 #define lomem			objspace->heap.range[0]
 #define himem			objspace->heap.range[1]
 #define heaps_inc		objspace->heap.increment
-#define heaps_freed		objspace->heap.freed
 #define dont_gc 		objspace->flags.dont_gc
 #define during_gc		objspace->flags.during_gc
+#define finalizing		objspace->flags.finalizing
 #define finalizer_table 	objspace->final.table
 #define deferred_final_list	objspace->final.deferred
 #define mark_stack		objspace->markstack.buffer
@@ -403,7 +445,16 @@ int *ruby_initial_gc_stress_ptr = &rb_objspace.gc_stress;
 #define initial_heap_min_slots	initial_params.initial_heap_min_slots
 #define initial_free_min	initial_params.initial_free_min
 
+#define is_lazy_sweeping(objspace) ((objspace)->heap.sweep_slots != 0)
+
+#define nonspecial_obj_id(obj) (VALUE)((SIGNED_VALUE)(obj)|FIXNUM_FLAG)
+
+#define HEAP_HEADER(p) ((struct heaps_header *)(p))
+
 static void rb_objspace_call_finalizer(rb_objspace_t *objspace);
+static VALUE define_final0(VALUE obj, VALUE block);
+VALUE rb_define_final(VALUE obj, VALUE block);
+VALUE rb_undefine_final(VALUE obj);
 
 #if defined(ENABLE_VM_OBJSPACE) && ENABLE_VM_OBJSPACE
 rb_objspace_t *
@@ -413,6 +464,10 @@ rb_objspace_alloc(void)
     memset(objspace, 0, sizeof(*objspace));
     malloc_limit = initial_malloc_limit;
     ruby_gc_stress = ruby_initial_gc_stress;
+#ifdef POOL_ALLOC_API
+    objspace->pool_headers = (pool_layout_t*) malloc(sizeof(pool_layout));
+    memcpy(objspace->pool_headers, &pool_layout, sizeof(pool_layout));
+#endif
 
     return objspace;
 }
@@ -478,40 +533,60 @@ rb_objspace_free(rb_objspace_t *objspace)
 	struct gc_list *list, *next;
 	for (list = global_List; list; list = next) {
 	    next = list->next;
-	    free(list);
+	    xfree(list);
 	}
     }
+    if (objspace->heap.reserve_slots) {
+        struct heaps_slot *list, *next;
+        for (list = objspace->heap.reserve_slots; list; list = next) {
+            next = list->free_next;
+            free(list);
+        }
+    }
     if (objspace->heap.sorted) {
 	size_t i;
 	for (i = 0; i < heaps_used; ++i) {
-	    free(objspace->heap.sorted[i].slot->membase);
-	    free(objspace->heap.sorted[i].slot);
+            free(objspace->heap.sorted[i]->base);
+	    aligned_free(objspace->heap.sorted[i]);
 	}
 	free(objspace->heap.sorted);
 	heaps_used = 0;
 	heaps = 0;
     }
+#ifdef POOL_ALLOC_API
+    if (objspace->pool_headers) {
+        pool_finalize_header(&objspace->pool_headers->p6);
+        pool_finalize_header(&objspace->pool_headers->p11);
+        free(objspace->pool_headers);
+    }
+#endif
     free(objspace);
 }
 #endif
 
-/* tiny heap size */
-/* 32KB */
-/*#define HEAP_SIZE 0x8000 */
-/* 128KB */
-/*#define HEAP_SIZE 0x20000 */
-/* 64KB */
-/*#define HEAP_SIZE 0x10000 */
-/* 16KB */
-#define HEAP_SIZE 0x4000
-/* 8KB */
-/*#define HEAP_SIZE 0x2000 */
-/* 4KB */
-/*#define HEAP_SIZE 0x1000 */
-/* 2KB */
-/*#define HEAP_SIZE 0x800 */
-
-#define HEAP_OBJ_LIMIT (unsigned int)(HEAP_SIZE / sizeof(struct RVALUE))
+#ifndef HEAP_ALIGN_LOG
+/* default tiny heap size: 16KB */
+#define HEAP_ALIGN_LOG 15
+#endif
+#define HEAP_ALIGN (1UL << HEAP_ALIGN_LOG)
+#define HEAP_ALIGN_MASK (~(~0UL << HEAP_ALIGN_LOG))
+#define REQUIRED_SIZE_BY_MALLOC (sizeof(size_t) * 5)
+#define HEAP_SIZE (HEAP_ALIGN - REQUIRED_SIZE_BY_MALLOC)
+#define CEILDIV(i, mod) (((i) + (mod) - 1)/(mod))
+
+#define HEAP_OBJ_LIMIT (unsigned int)((HEAP_SIZE - sizeof(struct heaps_header))/sizeof(struct RVALUE))
+#define HEAP_BITMAP_LIMIT CEILDIV(CEILDIV(HEAP_SIZE, sizeof(struct RVALUE)), sizeof(uintptr_t)*8)
+#define HEAP_SLOT_SIZE (sizeof(struct heaps_slot) + (HEAP_BITMAP_LIMIT-1) * sizeof(uintptr_t))
+
+#define GET_HEAP_HEADER(x) (HEAP_HEADER(((uintptr_t)x) & ~(HEAP_ALIGN_MASK)))
+#define GET_HEAP_SLOT(x) (GET_HEAP_HEADER(x)->base)
+#define GET_HEAP_BITMAP(x) (GET_HEAP_HEADER(x)->bits)
+#define NUM_IN_SLOT(p) (((uintptr_t)p & HEAP_ALIGN_MASK)/sizeof(RVALUE))
+#define BITMAP_INDEX(p) (NUM_IN_SLOT(p) / (sizeof(uintptr_t) * 8))
+#define BITMAP_OFFSET(p) (NUM_IN_SLOT(p) & ((sizeof(uintptr_t) * 8)-1))
+#define MARKED_IN_BITMAP(bits, p) (bits[BITMAP_INDEX(p)] & ((uintptr_t)1 << BITMAP_OFFSET(p)))
+#define MARK_IN_BITMAP(bits, p) (bits[BITMAP_INDEX(p)] = bits[BITMAP_INDEX(p)] | ((uintptr_t)1 << BITMAP_OFFSET(p)))
+#define CLEAR_IN_BITMAP(bits, p) (bits[BITMAP_INDEX(p)] &= ~((uintptr_t)1 << BITMAP_OFFSET(p)))
 
 extern st_table *rb_class_tbl;
 
@@ -823,8 +898,10 @@ vm_xfree(rb_objspace_t *objspace, void *ptr)
     size_t size;
     ptr = ((size_t *)ptr) - 1;
     size = ((size_t*)ptr)[0];
-    objspace->malloc_params.allocated_size -= size;
-    objspace->malloc_params.allocations--;
+    if (size) {
+	objspace->malloc_params.allocated_size -= size;
+	objspace->malloc_params.allocations--;
+    }
 #endif
 
     free(ptr);
@@ -894,6 +971,27 @@ ruby_xfree(void *x)
 	vm_xfree(&rb_objspace, x);
 }
 
+#ifdef POOL_ALLOC_API
+/* POOL ALLOC API */
+#define POOL_ALLOC_PART 2
+#include "pool_alloc.inc.h"
+#undef POOL_ALLOC_PART
+
+void
+ruby_xpool_free(void *ptr)
+{
+    pool_free_entry((void**)ptr);
+}
+
+#define CONCRET_POOL_MALLOC(pnts) \
+void * ruby_xpool_malloc_##pnts##p () { \
+    return pool_alloc_entry(&rb_objspace.pool_headers->p##pnts ); \
+}
+CONCRET_POOL_MALLOC(6)
+CONCRET_POOL_MALLOC(11)
+#undef CONCRET_POOL_MALLOC
+
+#endif
 
 /*
  *  call-seq:
@@ -984,70 +1082,140 @@ rb_gc_unregister_address(VALUE *addr)
     }
 }
 
-
 static void
 allocate_sorted_heaps(rb_objspace_t *objspace, size_t next_heaps_length)
 {
-    struct sorted_heaps_slot *p;
-    size_t size;
+    struct heaps_header **p;
+    struct heaps_slot *slot;
+    size_t size, add, i;
 
-    size = next_heaps_length*sizeof(struct sorted_heaps_slot);
+    size = next_heaps_length*sizeof(struct heaps_header *);
+    add = next_heaps_length - heaps_used;
 
     if (heaps_used > 0) {
-	p = (struct sorted_heaps_slot *)realloc(objspace->heap.sorted, size);
+	p = (struct heaps_header **)realloc(objspace->heap.sorted, size);
 	if (p) objspace->heap.sorted = p;
     }
     else {
-	p = objspace->heap.sorted = (struct sorted_heaps_slot *)malloc(size);
+	p = objspace->heap.sorted = (struct heaps_header **)malloc(size);
     }
 
     if (p == 0) {
 	during_gc = 0;
 	rb_memerror();
     }
-    heaps_length = next_heaps_length;
+
+    for (i = 0; i < add; i++) {
+        slot = (struct heaps_slot *)malloc(HEAP_SLOT_SIZE);
+        if (slot == 0) {
+            during_gc = 0;
+            rb_memerror();
+            return;
+        }
+        slot->free_next = objspace->heap.reserve_slots;
+        objspace->heap.reserve_slots = slot;
+    }
+}
+
+static void *
+aligned_malloc(size_t alignment, size_t size)
+{
+    void *res;
+
+#if defined __MINGW32__
+    res = __mingw_aligned_malloc(size, alignment);
+#elif defined _WIN32 && !defined __CYGWIN__
+    res = _aligned_malloc(size, alignment);
+#elif defined(HAVE_POSIX_MEMALIGN)
+    if (posix_memalign(&res, alignment, size) == 0) {
+        return res;
+    }
+    else {
+        return NULL;
+    }
+#elif defined(HAVE_MEMALIGN)
+    res = memalign(alignment, size);
+#else
+    char* aligned;
+    res = malloc(alignment + size + sizeof(void*));
+    aligned = (char*)res + alignment + sizeof(void*);
+    aligned -= ((VALUE)aligned & (alignment - 1));
+    ((void**)aligned)[-1] = res;
+    res = (void*)aligned;
+#endif
+
+#if defined(_DEBUG) || defined(GC_DEBUG)
+    /* alignment must be a power of 2 */
+    assert((alignment - 1) & alignment == 0);
+    assert(alignment % sizeof(void*) == 0);
+#endif
+    return res;
+}
+
+static void
+aligned_free(void *ptr)
+{
+#if defined __MINGW32__
+    __mingw_aligned_free(ptr);
+#elif defined _WIN32 && !defined __CYGWIN__
+    _aligned_free(ptr);
+#elif defined(HAVE_MEMALIGN) || defined(HAVE_POSIX_MEMALIGN)
+    free(ptr);
+#else
+    free(((void**)ptr)[-1]);
+#endif
+}
+
+static void
+link_free_heap_slot(rb_objspace_t *objspace, struct heaps_slot *slot)
+{
+    slot->free_next = objspace->heap.free_slots;
+    objspace->heap.free_slots = slot;
+}
+
+static void
+unlink_free_heap_slot(rb_objspace_t *objspace, struct heaps_slot *slot)
+{
+    objspace->heap.free_slots = slot->free_next;
+    slot->free_next = NULL;
 }
 
 static void
 assign_heap_slot(rb_objspace_t *objspace)
 {
-    RVALUE *p, *pend, *membase;
+    RVALUE *p, *pend;
+    struct heaps_header *membase;
     struct heaps_slot *slot;
     size_t hi, lo, mid;
     size_t objs;
 
     objs = HEAP_OBJ_LIMIT;
-    p = (RVALUE*)malloc(HEAP_SIZE);
-    if (p == 0) {
-	during_gc = 0;
-	rb_memerror();
-    }
-    slot = (struct heaps_slot *)malloc(sizeof(struct heaps_slot));
-    if (slot == 0) {
-	xfree(p);
+    membase = (struct heaps_header*)aligned_malloc(HEAP_ALIGN, HEAP_SIZE);
+    if (membase == 0) {
 	during_gc = 0;
 	rb_memerror();
     }
+    assert(objspace->heap.reserve_slots != NULL);
+    slot = objspace->heap.reserve_slots;
+    objspace->heap.reserve_slots = slot->free_next;
     MEMZERO((void*)slot, struct heaps_slot, 1);
 
     slot->next = heaps;
     if (heaps) heaps->prev = slot;
     heaps = slot;
 
-    membase = p;
+    p = (RVALUE*)((VALUE)membase + sizeof(struct heaps_header));
     if ((VALUE)p % sizeof(RVALUE) != 0) {
-	p = (RVALUE*)((VALUE)p + sizeof(RVALUE) - ((VALUE)p % sizeof(RVALUE)));
-	if ((HEAP_SIZE - HEAP_OBJ_LIMIT * sizeof(RVALUE)) < (size_t)((char*)p - (char*)membase)) {
-	    objs--;
-	}
+       p = (RVALUE*)((VALUE)p + sizeof(RVALUE) - ((VALUE)p % sizeof(RVALUE)));
+       objs = (HEAP_SIZE - (size_t)((VALUE)p - (VALUE)membase))/sizeof(RVALUE);
     }
 
     lo = 0;
     hi = heaps_used;
     while (lo < hi) {
-	register RVALUE *mid_membase;
+	register struct heaps_header *mid_membase;
 	mid = (lo + hi) / 2;
-	mid_membase = objspace->heap.sorted[mid].slot->membase;
+        mid_membase = objspace->heap.sorted[mid];
 	if (mid_membase < membase) {
 	    lo = mid + 1;
 	}
@@ -1059,14 +1227,16 @@ assign_heap_slot(rb_objspace_t *objspace)
 	}
     }
     if (hi < heaps_used) {
-	MEMMOVE(&objspace->heap.sorted[hi+1], &objspace->heap.sorted[hi], struct sorted_heaps_slot, heaps_used - hi);
-    }
-    objspace->heap.sorted[hi].slot = slot;
-    objspace->heap.sorted[hi].start = p;
-    objspace->heap.sorted[hi].end = (p + objs);
+	MEMMOVE(&objspace->heap.sorted[hi+1], &objspace->heap.sorted[hi], struct heaps_header*, heaps_used - hi);
+    }
+    objspace->heap.sorted[hi] = membase;
+    membase->start = p;
+    membase->end = (p + objs);
+    membase->base = heaps;
+    membase->bits = heaps->bits;
+    membase->limit = objs;
     heaps->membase = membase;
-    heaps->slot = p;
-    heaps->limit = objs;
+    memset(heaps->bits, 0, HEAP_BITMAP_LIMIT * sizeof(uintptr_t));
     objspace->heap.free_num += objs;
     pend = p + objs;
     if (lomem == 0 || lomem > p) lomem = p;
@@ -1075,19 +1245,24 @@ assign_heap_slot(rb_objspace_t *objspace)
 
     while (p < pend) {
 	p->as.free.flags = 0;
-	p->as.free.next = freelist;
-	freelist = p;
+	p->as.free.next = heaps->freelist;
+	heaps->freelist = p;
 	p++;
     }
+    link_free_heap_slot(objspace, heaps);
 }
 
 static void
 add_heap_slots(rb_objspace_t *objspace, size_t add)
 {
     size_t i;
+    size_t next_heaps_length;
 
-    if ((heaps_used + add) > heaps_length) {
-        allocate_sorted_heaps(objspace, heaps_used + add);
+    next_heaps_length = heaps_used + add;
+
+    if (next_heaps_length > heaps_length) {
+        allocate_sorted_heaps(objspace, next_heaps_length);
+        heaps_length = next_heaps_length;
     }
 
     for (i = 0; i < add; i++) {
@@ -1137,6 +1312,7 @@ set_heaps_increment(rb_objspace_t *objspace)
 
     if (next_heaps_length > heaps_length) {
 	allocate_sorted_heaps(objspace, next_heaps_length);
+        heaps_length = next_heaps_length;
     }
 }
 
@@ -1159,6 +1335,7 @@ rb_during_gc(void)
 }
 
 #define RANY(o) ((RVALUE*)(o))
+#define has_free_object (objspace->heap.free_slots && objspace->heap.free_slots->freelist)
 
 VALUE
 rb_newobj(void)
@@ -1179,15 +1356,18 @@ rb_newobj(void)
 	}
     }
 
-    if (UNLIKELY(!freelist)) {
+    if (UNLIKELY(!has_free_object)) {
 	if (!gc_lazy_sweep(objspace)) {
 	    during_gc = 0;
 	    rb_memerror();
 	}
     }
 
-    obj = (VALUE)freelist;
-    freelist = freelist->as.free.next;
+    obj = (VALUE)objspace->heap.free_slots->freelist;
+    objspace->heap.free_slots->freelist = RANY(obj)->as.free.next;
+    if (objspace->heap.free_slots->freelist == NULL) {
+        unlink_free_heap_slot(objspace, objspace->heap.free_slots);
+    }
 
     MEMZERO((void*)obj, RVALUE, 1);
 #ifdef GC_DEBUG
@@ -1356,10 +1536,10 @@ gc_mark_all(rb_objspace_t *objspace)
 
     init_mark_stack(objspace);
     for (i = 0; i < heaps_used; i++) {
-	p = objspace->heap.sorted[i].start; pend = objspace->heap.sorted[i].end;
+	p = objspace->heap.sorted[i]->start; pend = objspace->heap.sorted[i]->end;
 	while (p < pend) {
-	    if ((p->as.basic.flags & FL_MARK) &&
-		(p->as.basic.flags != FL_MARK)) {
+	    if (MARKED_IN_BITMAP(GET_HEAP_BITMAP(p), p) &&
+		p->as.basic.flags) {
 		gc_mark_children(objspace, (VALUE)p, 0);
 	    }
 	    p++;
@@ -1387,26 +1567,27 @@ static inline int
 is_pointer_to_heap(rb_objspace_t *objspace, void *ptr)
 {
     register RVALUE *p = RANY(ptr);
-    register struct sorted_heaps_slot *heap;
+    register struct heaps_header *heap;
     register size_t hi, lo, mid;
 
     if (p < lomem || p > himem) return FALSE;
     if ((VALUE)p % sizeof(RVALUE) != 0) return FALSE;
+    heap = GET_HEAP_HEADER(p);
 
     /* check if p looks like a pointer using bsearch*/
     lo = 0;
     hi = heaps_used;
     while (lo < hi) {
 	mid = (lo + hi) / 2;
-	heap = &objspace->heap.sorted[mid];
-	if (heap->start <= p) {
-	    if (p < heap->end)
-		return TRUE;
-	    lo = mid + 1;
-	}
-	else {
-	    hi = mid;
-	}
+        if (heap > objspace->heap.sorted[mid]) {
+            lo = mid + 1;
+        }
+        else if (heap < objspace->heap.sorted[mid]) {
+            hi = mid;
+        }
+        else {
+            return (p >= heap->start && p < heap->end) ? TRUE : FALSE;
+        }
     }
     return FALSE;
 }
@@ -1449,10 +1630,10 @@ struct mark_tbl_arg {
 };
 
 static int
-mark_entry(ID key, VALUE value, st_data_t data)
+mark_entry(st_data_t key, st_data_t value, st_data_t data)
 {
     struct mark_tbl_arg *arg = (void*)data;
-    gc_mark(arg->objspace, value, arg->lev);
+    gc_mark(arg->objspace, (VALUE)value, arg->lev);
     return ST_CONTINUE;
 }
 
@@ -1467,10 +1648,10 @@ mark_tbl(rb_objspace_t *objspace, st_table *tbl, int lev)
 }
 
 static int
-mark_key(VALUE key, VALUE value, st_data_t data)
+mark_key(st_data_t key, st_data_t value, st_data_t data)
 {
     struct mark_tbl_arg *arg = (void*)data;
-    gc_mark(arg->objspace, key, arg->lev);
+    gc_mark(arg->objspace, (VALUE)key, arg->lev);
     return ST_CONTINUE;
 }
 
@@ -1491,11 +1672,11 @@ rb_mark_set(st_table *tbl)
 }
 
 static int
-mark_keyvalue(VALUE key, VALUE value, st_data_t data)
+mark_keyvalue(st_data_t key, st_data_t value, st_data_t data)
 {
     struct mark_tbl_arg *arg = (void*)data;
-    gc_mark(arg->objspace, key, arg->lev);
-    gc_mark(arg->objspace, value, arg->lev);
+    gc_mark(arg->objspace, (VALUE)key, arg->lev);
+    gc_mark(arg->objspace, (VALUE)value, arg->lev);
     return ST_CONTINUE;
 }
 
@@ -1565,7 +1746,9 @@ mark_m_tbl(rb_objspace_t *objspace, st_table *tbl, int lev)
 static int
 free_method_entry_i(ID key, rb_method_entry_t *me, st_data_t data)
 {
-    rb_free_method_entry(me);
+    if (!me->mark) {
+	rb_free_method_entry(me);
+    }
     return ST_CONTINUE;
 }
 
@@ -1622,6 +1805,16 @@ rb_gc_mark_maybe(VALUE obj)
     }
 }
 
+static int
+gc_mark_ptr(rb_objspace_t *objspace, VALUE ptr)
+{
+    register uintptr_t *bits = GET_HEAP_BITMAP(ptr);
+    if (MARKED_IN_BITMAP(bits, ptr)) return 0;
+    MARK_IN_BITMAP(bits, ptr);
+    objspace->heap.live_num++;
+    return 1;
+}
+
 static void
 gc_mark(rb_objspace_t *objspace, VALUE ptr, int lev)
 {
@@ -1630,9 +1823,7 @@ gc_mark(rb_objspace_t *objspace, VALUE ptr, int lev)
     obj = RANY(ptr);
     if (rb_special_const_p(ptr)) return; /* special const not marked */
     if (obj->as.basic.flags == 0) return;       /* free cell */
-    if (obj->as.basic.flags & FL_MARK) return;  /* already marked */
-    obj->as.basic.flags |= FL_MARK;
-    objspace->heap.live_num++;
+    if (!gc_mark_ptr(objspace, ptr)) return;	/* already marked */
 
     if (lev > GC_LEVEL_MAX || (lev == 0 && stack_check(STACKFRAME_FOR_GC_MARK))) {
 	if (!mark_stack_overflow) {
@@ -1659,6 +1850,7 @@ static void
 gc_mark_children(rb_objspace_t *objspace, VALUE ptr, int lev)
 {
     register RVALUE *obj = RANY(ptr);
+    register uintptr_t *bits;
 
     goto marking;		/* skip */
 
@@ -1666,8 +1858,9 @@ gc_mark_children(rb_objspace_t *objspace, VALUE ptr, int lev)
     obj = RANY(ptr);
     if (rb_special_const_p(ptr)) return; /* special const not marked */
     if (obj->as.basic.flags == 0) return;       /* free cell */
-    if (obj->as.basic.flags & FL_MARK) return;  /* already marked */
-    obj->as.basic.flags |= FL_MARK;
+    bits = GET_HEAP_BITMAP(ptr);
+    if (MARKED_IN_BITMAP(bits, ptr)) return;  /* already marked */
+    MARK_IN_BITMAP(bits, ptr);
     objspace->heap.live_num++;
 
   marking:
@@ -1819,6 +2012,7 @@ gc_mark_children(rb_objspace_t *objspace, VALUE ptr, int lev)
       case T_CLASS:
       case T_MODULE:
 	mark_m_tbl(objspace, RCLASS_M_TBL(obj), lev);
+	if (!RCLASS_EXT(obj)) break;
 	mark_tbl(objspace, RCLASS_IV_TBL(obj), lev);
 	mark_const_tbl(objspace, RCLASS_CONST_TBL(obj), lev);
 	ptr = RCLASS_SUPER(obj);
@@ -1929,15 +2123,22 @@ gc_mark_children(rb_objspace_t *objspace, VALUE ptr, int lev)
 
 static int obj_free(rb_objspace_t *, VALUE);
 
-static inline void
-add_freelist(rb_objspace_t *objspace, RVALUE *p)
+static inline struct heaps_slot *
+add_slot_local_freelist(rb_objspace_t *objspace, RVALUE *p)
 {
+    struct heaps_slot *slot;
+
     VALGRIND_MAKE_MEM_UNDEFINED((void*)p, sizeof(RVALUE));
     p->as.free.flags = 0;
-    p->as.free.next = freelist;
-    freelist = p;
+    slot = GET_HEAP_SLOT(p);
+    p->as.free.next = slot->freelist;
+    slot->freelist = p;
+
+    return slot;
 }
 
+static void free_unused_heap(rb_objspace_t *objspace, struct heaps_header *heap);
+
 static void
 finalize_list(rb_objspace_t *objspace, RVALUE *p)
 {
@@ -1945,17 +2146,16 @@ finalize_list(rb_objspace_t *objspace, RVALUE *p)
 	RVALUE *tmp = p->as.free.next;
 	run_final(objspace, (VALUE)p);
 	if (!FL_TEST(p, FL_SINGLETON)) { /* not freeing page */
-            if (objspace->heap.sweep_slots) {
-                p->as.free.flags = 0;
-            }
-            else {
+            add_slot_local_freelist(objspace, p);
+            if (!is_lazy_sweeping(objspace)) {
                 GC_PROF_DEC_LIVE_NUM;
-                add_freelist(objspace, p);
             }
 	}
 	else {
-	    struct heaps_slot *slot = (struct heaps_slot *)(VALUE)RDATA(p)->dmark;
-	    slot->limit--;
+            struct heaps_header *heap = GET_HEAP_HEADER(p);
+            if (--heap->limit == 0) {
+                free_unused_heap(objspace, heap);
+            }
 	}
 	p = tmp;
     }
@@ -1976,97 +2176,106 @@ unlink_heap_slot(rb_objspace_t *objspace, struct heaps_slot *slot)
     slot->next = NULL;
 }
 
-
 static void
-free_unused_heaps(rb_objspace_t *objspace)
+free_unused_heap(rb_objspace_t *objspace, struct heaps_header *heap)
 {
-    size_t i, j;
-    RVALUE *last = 0;
-
-    for (i = j = 1; j < heaps_used; i++) {
-	if (objspace->heap.sorted[i].slot->limit == 0) {
-	    if (!last) {
-		last = objspace->heap.sorted[i].slot->membase;
-	    }
-	    else {
-		free(objspace->heap.sorted[i].slot->membase);
-	    }
-            free(objspace->heap.sorted[i].slot);
-	    heaps_used--;
-	}
-	else {
-	    if (i != j) {
-		objspace->heap.sorted[j] = objspace->heap.sorted[i];
-	    }
-	    j++;
-	}
-    }
-    if (last) {
-	if (last < heaps_freed) {
-	    free(heaps_freed);
-	    heaps_freed = last;
-	}
-	else {
-	    free(last);
-	}
+    register size_t hi, lo, mid;
+    lo = 0;
+    hi = heaps_used;
+    while (lo < hi) {
+        mid = (lo + hi) / 2;
+        if (heap > objspace->heap.sorted[mid]) {
+            lo = mid + 1;
+        }
+        else if (heap < objspace->heap.sorted[mid]) {
+            hi = mid;
+        }
+        else {
+            /* remove unused heap */
+            struct heaps_slot* h = objspace->heap.sorted[mid]->base;
+            h->free_next = objspace->heap.reserve_slots;
+            objspace->heap.reserve_slots = h;
+            aligned_free(objspace->heap.sorted[mid]);
+            heaps_used--;
+            MEMMOVE(objspace->heap.sorted + mid, objspace->heap.sorted + mid + 1,
+                    struct heaps_header *, heaps_used - mid);
+            return;
+        }
     }
 }
 
 static void
+gc_clear_slot_bits(struct heaps_slot *slot)
+{
+    memset(slot->bits, 0, HEAP_BITMAP_LIMIT * sizeof(uintptr_t));
+}
+
+static void
 slot_sweep(rb_objspace_t *objspace, struct heaps_slot *sweep_slot)
 {
     size_t free_num = 0, final_num = 0;
     RVALUE *p, *pend;
-    RVALUE *free = freelist, *final = deferred_final_list;
+    RVALUE *final = deferred_final_list;
     int deferred;
+    uintptr_t *bits;
 
-    p = sweep_slot->slot; pend = p + sweep_slot->limit;
+    p = sweep_slot->membase->start; pend = sweep_slot->membase->end;
+    bits = sweep_slot->bits;
     while (p < pend) {
-        if (!(p->as.basic.flags & FL_MARK)) {
-            if (p->as.basic.flags &&
-                ((deferred = obj_free(objspace, (VALUE)p)) ||
-		 (FL_TEST(p, FL_FINALIZE)))) {
-                if (!deferred) {
-                    p->as.free.flags = T_ZOMBIE;
-                    RDATA(p)->dfree = 0;
+        if ((!(MARKED_IN_BITMAP(bits, p))) && BUILTIN_TYPE(p) != T_ZOMBIE) {
+            if (p->as.basic.flags) {
+                if ((deferred = obj_free(objspace, (VALUE)p)) ||
+                    (FL_TEST(p, FL_FINALIZE))) {
+                    if (!deferred) {
+                        p->as.free.flags = T_ZOMBIE;
+                        RDATA(p)->dfree = 0;
+                    }
+                    p->as.free.next = deferred_final_list;
+                    deferred_final_list = p;
+                    assert(BUILTIN_TYPE(p) == T_ZOMBIE);
+                    final_num++;
+                }
+                else {
+                    VALGRIND_MAKE_MEM_UNDEFINED((void*)p, sizeof(RVALUE));
+                    p->as.free.flags = 0;
+                    p->as.free.next = sweep_slot->freelist;
+                    sweep_slot->freelist = p;
+                    free_num++;
                 }
-                p->as.free.flags |= FL_MARK;
-                p->as.free.next = deferred_final_list;
-                deferred_final_list = p;
-                final_num++;
             }
             else {
-                add_freelist(objspace, p);
                 free_num++;
             }
         }
-        else if (BUILTIN_TYPE(p) == T_ZOMBIE) {
-            /* objects to be finalized */
-            /* do nothing remain marked */
-        }
-        else {
-            RBASIC(p)->flags &= ~FL_MARK;
-        }
         p++;
     }
-    if (final_num + free_num == sweep_slot->limit &&
+    gc_clear_slot_bits(sweep_slot);
+    if (final_num + free_num == sweep_slot->membase->limit &&
         objspace->heap.free_num > objspace->heap.do_heap_free) {
         RVALUE *pp;
 
         for (pp = deferred_final_list; pp != final; pp = pp->as.free.next) {
-	    RDATA(pp)->dmark = (void (*)(void *))(VALUE)sweep_slot;
+	    RDATA(pp)->dmark = 0;
             pp->as.free.flags |= FL_SINGLETON; /* freeing page mark */
         }
-        sweep_slot->limit = final_num;
-        freelist = free;	/* cancel this page from freelist */
+        sweep_slot->membase->limit = final_num;
         unlink_heap_slot(objspace, sweep_slot);
+        if (final_num == 0) {
+            free_unused_heap(objspace, sweep_slot->membase);
+        }
     }
     else {
+        if (free_num > 0) {
+            link_free_heap_slot(objspace, sweep_slot);
+        }
+        else {
+            sweep_slot->free_next = NULL;
+        }
         objspace->heap.free_num += free_num;
     }
     objspace->heap.final_num += final_num;
 
-    if (deferred_final_list) {
+    if (deferred_final_list && !finalizing) {
         rb_thread_t *th = GET_THREAD();
         if (th) {
             RUBY_VM_SET_FINALIZER_INTERRUPT(th);
@@ -2078,7 +2287,7 @@ static int
 ready_to_gc(rb_objspace_t *objspace)
 {
     if (dont_gc || during_gc) {
-	if (!freelist) {
+	if (!has_free_object) {
             if (!heaps_increment(objspace)) {
                 set_heaps_increment(objspace);
                 heaps_increment(objspace);
@@ -2092,7 +2301,6 @@ ready_to_gc(rb_objspace_t *objspace)
 static void
 before_gc_sweep(rb_objspace_t *objspace)
 {
-    freelist = 0;
     objspace->heap.do_heap_free = (size_t)((heaps_used * HEAP_OBJ_LIMIT) * 0.65);
     objspace->heap.free_min = (size_t)((heaps_used * HEAP_OBJ_LIMIT)  * 0.2);
     if (objspace->heap.free_min < initial_free_min) {
@@ -2101,6 +2309,7 @@ before_gc_sweep(rb_objspace_t *objspace)
     }
     objspace->heap.sweep_slots = heaps;
     objspace->heap.free_num = 0;
+    objspace->heap.free_slots = NULL;
 
     /* sweep unlinked method entries */
     if (GET_VM()->unlinked_method_entry_list) {
@@ -2123,8 +2332,6 @@ after_gc_sweep(rb_objspace_t *objspace)
 	if (malloc_limit < initial_malloc_limit) malloc_limit = initial_malloc_limit;
     }
     malloc_increase = 0;
-
-    free_unused_heaps(objspace);
 }
 
 static int
@@ -2137,7 +2344,7 @@ lazy_sweep(rb_objspace_t *objspace)
         next = objspace->heap.sweep_slots->next;
 	slot_sweep(objspace, objspace->heap.sweep_slots);
         objspace->heap.sweep_slots = next;
-        if (freelist) {
+        if (has_free_object) {
             during_gc = 0;
             return TRUE;
         }
@@ -2149,10 +2356,10 @@ static void
 rest_sweep(rb_objspace_t *objspace)
 {
     if (objspace->heap.sweep_slots) {
-       while (objspace->heap.sweep_slots) {
-           lazy_sweep(objspace);
-       }
-       after_gc_sweep(objspace);
+	while (objspace->heap.sweep_slots) {
+	    lazy_sweep(objspace);
+	}
+	after_gc_sweep(objspace);
     }
 }
 
@@ -2199,9 +2406,9 @@ gc_lazy_sweep(rb_objspace_t *objspace)
     }
 
     GC_PROF_SWEEP_TIMER_START;
-    if(!(res = lazy_sweep(objspace))) {
+    if (!(res = lazy_sweep(objspace))) {
         after_gc_sweep(objspace);
-        if(freelist) {
+        if (has_free_object) {
             res = TRUE;
             during_gc = 0;
         }
@@ -2234,12 +2441,17 @@ void
 rb_gc_force_recycle(VALUE p)
 {
     rb_objspace_t *objspace = &rb_objspace;
-    GC_PROF_DEC_LIVE_NUM;
-    if (RBASIC(p)->flags & FL_MARK) {
-        RANY(p)->as.free.flags = 0;
+    struct heaps_slot *slot;
+
+    if (MARKED_IN_BITMAP(GET_HEAP_BITMAP(p), p)) {
+        add_slot_local_freelist(objspace, (RVALUE *)p);
     }
     else {
-        add_freelist(objspace, (RVALUE *)p);
+        GC_PROF_DEC_LIVE_NUM;
+        slot = add_slot_local_freelist(objspace, (RVALUE *)p);
+        if (slot->free_next == NULL) {
+            link_free_heap_slot(objspace, slot);
+        }
     }
 }
 
@@ -2611,7 +2823,7 @@ static VALUE
 objspace_each_objects(VALUE arg)
 {
     size_t i;
-    RVALUE *membase = 0;
+    struct heaps_header *membase = 0;
     RVALUE *pstart, *pend;
     rb_objspace_t *objspace = &rb_objspace;
     struct each_obj_args *args = (struct each_obj_args *)arg;
@@ -2619,16 +2831,16 @@ objspace_each_objects(VALUE arg)
 
     i = 0;
     while (i < heaps_used) {
-	while (0 < i && (uintptr_t)membase < (uintptr_t)objspace->heap.sorted[i-1].slot->membase)
+	while (0 < i && membase < objspace->heap.sorted[i-1])
 	    i--;
-	while (i < heaps_used && (uintptr_t)objspace->heap.sorted[i].slot->membase <= (uintptr_t)membase)
+	while (i < heaps_used && objspace->heap.sorted[i] <= membase)
 	    i++;
 	if (heaps_used <= i)
 	  break;
-	membase = objspace->heap.sorted[i].slot->membase;
+	membase = objspace->heap.sorted[i];
 
-	pstart = objspace->heap.sorted[i].slot->slot;
-	pend = pstart + objspace->heap.sorted[i].slot->limit;
+	pstart = membase->start;
+	pend = membase->end;
 
 	for (; pstart != pend; pstart++) {
 	    if (pstart->as.basic.flags) {
@@ -2642,6 +2854,7 @@ objspace_each_objects(VALUE arg)
 	    }
 	}
     }
+    RB_GC_GUARD(v);
 
     return Qnil;
 }
@@ -2885,11 +3098,12 @@ run_single_final(VALUE arg)
 }
 
 static void
-run_finalizer(rb_objspace_t *objspace, VALUE objid, VALUE table)
+run_finalizer(rb_objspace_t *objspace, VALUE obj, VALUE table)
 {
     long i;
     int status;
     VALUE args[3];
+    VALUE objid = nonspecial_obj_id(obj);
 
     if (RARRAY_LEN(table) > 0) {
 	args[1] = rb_obj_freeze(rb_ary_new3(1, objid));
@@ -2913,13 +3127,11 @@ run_finalizer(rb_objspace_t *objspace, VALUE objid, VALUE table)
 static void
 run_final(rb_objspace_t *objspace, VALUE obj)
 {
-    VALUE objid;
     RUBY_DATA_FUNC free_func = 0;
     st_data_t key, table;
 
     objspace->heap.final_num--;
 
-    objid = rb_obj_id(obj);	/* make obj into id */
     RBASIC(obj)->klass = 0;
 
     if (RTYPEDDATA_P(obj)) {
@@ -2934,7 +3146,7 @@ run_final(rb_objspace_t *objspace, VALUE obj)
 
     key = (st_data_t)obj;
     if (st_delete(finalizer_table, &key, &table)) {
-	run_finalizer(objspace, objid, (VALUE)table);
+	run_finalizer(objspace, obj, (VALUE)table);
     }
 }
 
@@ -2952,16 +3164,20 @@ finalize_deferred(rb_objspace_t *objspace)
 void
 rb_gc_finalize_deferred(void)
 {
-    finalize_deferred(&rb_objspace);
+    rb_objspace_t *objspace = &rb_objspace;
+    if (ATOMIC_EXCHANGE(finalizing, 1)) return;
+    finalize_deferred(objspace);
+    ATOMIC_SET(finalizing, 0);
 }
 
 static int
 chain_finalized_object(st_data_t key, st_data_t val, st_data_t arg)
 {
     RVALUE *p = (RVALUE *)key, **final_list = (RVALUE **)arg;
-    if ((p->as.basic.flags & (FL_FINALIZE|FL_MARK)) == FL_FINALIZE) {
+    if ((p->as.basic.flags & FL_FINALIZE) == FL_FINALIZE &&
+        !MARKED_IN_BITMAP(GET_HEAP_BITMAP(p), p)) {
 	if (BUILTIN_TYPE(p) != T_ZOMBIE) {
-	    p->as.free.flags = FL_MARK | T_ZOMBIE; /* remain marked */
+	    p->as.free.flags = T_ZOMBIE;
 	    RDATA(p)->dfree = 0;
 	}
 	p->as.free.next = *final_list;
@@ -3004,6 +3220,8 @@ rb_objspace_call_finalizer(rb_objspace_t *objspace)
     /* run finalizers */
     rest_sweep(objspace);
 
+    if (ATOMIC_EXCHANGE(finalizing, 1)) return;
+
     do {
 	/* XXX: this loop will make no sense */
 	/* because mark will not be removed */
@@ -3018,8 +3236,9 @@ rb_objspace_call_finalizer(rb_objspace_t *objspace)
 	st_foreach(finalizer_table, force_chain_object, (st_data_t)&list);
 	while (list) {
 	    struct force_finalize_list *curr = list;
-	    run_finalizer(objspace, rb_obj_id(curr->obj), curr->table);
-	    st_delete(finalizer_table, (st_data_t*)&curr->obj, 0);
+	    st_data_t obj = (st_data_t)curr->obj;
+	    run_finalizer(objspace, curr->obj, curr->table);
+	    st_delete(finalizer_table, &obj, 0);
 	    list = curr->next;
 	    xfree(curr);
 	}
@@ -3030,7 +3249,7 @@ rb_objspace_call_finalizer(rb_objspace_t *objspace)
 
     /* run data object's finalizers */
     for (i = 0; i < heaps_used; i++) {
-	p = objspace->heap.sorted[i].start; pend = objspace->heap.sorted[i].end;
+	p = objspace->heap.sorted[i]->start; pend = objspace->heap.sorted[i]->end;
 	while (p < pend) {
 	    if (BUILTIN_TYPE(p) == T_DATA &&
 		DATA_PTR(p) && RANY(p)->as.data.dfree &&
@@ -3066,6 +3285,7 @@ rb_objspace_call_finalizer(rb_objspace_t *objspace)
 
     st_free_table(finalizer_table);
     finalizer_table = 0;
+    ATOMIC_SET(finalizing, 0);
 }
 
 void
@@ -3073,8 +3293,39 @@ rb_gc(void)
 {
     rb_objspace_t *objspace = &rb_objspace;
     garbage_collect(objspace);
-    finalize_deferred(objspace);
-    free_unused_heaps(objspace);
+    if (!finalizing) finalize_deferred(objspace);
+}
+
+static inline int
+is_id_value(rb_objspace_t *objspace, VALUE ptr)
+{
+    if (!is_pointer_to_heap(objspace, (void *)ptr)) return FALSE;
+    if (BUILTIN_TYPE(ptr) > T_FIXNUM) return FALSE;
+    if (BUILTIN_TYPE(ptr) == T_ICLASS) return FALSE;
+    return TRUE;
+}
+
+static inline int
+is_dead_object(rb_objspace_t *objspace, VALUE ptr)
+{
+    struct heaps_slot *slot = objspace->heap.sweep_slots;
+    if (!is_lazy_sweeping(objspace) || MARKED_IN_BITMAP(GET_HEAP_BITMAP(ptr), ptr))
+	return FALSE;
+    while (slot) {
+	if ((VALUE)slot->membase->start <= ptr && ptr < (VALUE)(slot->membase->end))
+	    return TRUE;
+	slot = slot->next;
+    }
+    return FALSE;
+}
+
+static inline int
+is_live_object(rb_objspace_t *objspace, VALUE ptr)
+{
+    if (BUILTIN_TYPE(ptr) == 0) return FALSE;
+    if (RBASIC(ptr)->klass == 0) return FALSE;
+    if (is_dead_object(objspace, ptr)) return FALSE;
+    return TRUE;
 }
 
 /*
@@ -3119,11 +3370,10 @@ id2ref(VALUE obj, VALUE objid)
 	return ID2SYM(symid);
     }
 
-    if (!is_pointer_to_heap(objspace, (void *)ptr) ||
-	BUILTIN_TYPE(ptr) > T_FIXNUM || BUILTIN_TYPE(ptr) == T_ICLASS) {
+    if (!is_id_value(objspace, ptr)) {
 	rb_raise(rb_eRangeError, "%p is not id value", p0);
     }
-    if (BUILTIN_TYPE(ptr) == 0 || RBASIC(ptr)->klass == 0) {
+    if (!is_live_object(objspace, ptr)) {
 	rb_raise(rb_eRangeError, "%p is recycled object", p0);
     }
     return (VALUE)ptr;
@@ -3193,7 +3443,7 @@ rb_obj_id(VALUE obj)
     if (SPECIAL_CONST_P(obj)) {
         return LONG2NUM((SIGNED_VALUE)obj);
     }
-    return (VALUE)((SIGNED_VALUE)obj|FIXNUM_FLAG);
+    return nonspecial_obj_id(obj);
 }
 
 static int
@@ -3236,7 +3486,7 @@ count_objects(int argc, VALUE *argv, VALUE os)
     VALUE hash;
 
     if (rb_scan_args(argc, argv, "01", &hash) == 1) {
-        if (TYPE(hash) != T_HASH)
+        if (!RB_TYPE_P(hash, T_HASH))
             rb_raise(rb_eTypeError, "non-hash given");
     }
 
@@ -3247,7 +3497,7 @@ count_objects(int argc, VALUE *argv, VALUE os)
     for (i = 0; i < heaps_used; i++) {
         RVALUE *p, *pend;
 
-        p = objspace->heap.sorted[i].start; pend = objspace->heap.sorted[i].end;
+        p = objspace->heap.sorted[i]->start; pend = objspace->heap.sorted[i]->end;
         for (;p < pend; p++) {
             if (p->as.basic.flags) {
                 counts[BUILTIN_TYPE(p)]++;
@@ -3256,7 +3506,7 @@ count_objects(int argc, VALUE *argv, VALUE os)
                 freed++;
             }
         }
-        total += objspace->heap.sorted[i].slot->limit;
+        total += objspace->heap.sorted[i]->limit;
     }
 
     if (hash == Qnil) {
@@ -3355,7 +3605,7 @@ gc_stat(int argc, VALUE *argv, VALUE self)
     VALUE hash;
 
     if (rb_scan_args(argc, argv, "01", &hash) == 1) {
-        if (TYPE(hash) != T_HASH)
+        if (!RB_TYPE_P(hash, T_HASH))
             rb_raise(rb_eTypeError, "non-hash given");
     }
 
@@ -3410,6 +3660,33 @@ gc_malloc_allocations(VALUE self)
 }
 #endif
 
+/*
+ *  call-seq:
+ *     GC::Profiler.raw_data -> [Hash, ...]
+ *
+ *  Returns an Array of individual raw profile data Hashes ordered
+ *  from earliest to latest by <tt>:GC_INVOKE_TIME</tt>.  For example:
+ *
+ *    [{:GC_TIME=>1.3000000000000858e-05,
+ *      :GC_INVOKE_TIME=>0.010634999999999999,
+ *      :HEAP_USE_SIZE=>289640,
+ *      :HEAP_TOTAL_SIZE=>588960,
+ *      :HEAP_TOTAL_OBJECTS=>14724,
+ *      :GC_IS_MARKED=>false},
+ *      ...
+ *    ]
+ *
+ *  The keys mean:
+ *
+ *  +:GC_TIME+:: Time taken for this run in milliseconds
+ *  +:GC_INVOKE_TIME+:: Time the GC was invoked since startup in seconds
+ *  +:HEAP_USE_SIZE+:: Bytes of heap used
+ *  +:HEAP_TOTAL_SIZE+:: Size of heap in bytes
+ *  +:HEAP_TOTAL_OBJECTS+:: Number of objects
+ *  +:GC_IS_MARKED+:: Is the GC in the mark phase
+ *
+ */
+
 static VALUE
 gc_profile_record_get(void)
 {
@@ -3602,6 +3879,7 @@ Init_GC(void)
     rb_mProfiler = rb_define_module_under(rb_mGC, "Profiler");
     rb_define_singleton_method(rb_mProfiler, "enabled?", gc_profile_enable_get, 0);
     rb_define_singleton_method(rb_mProfiler, "enable", gc_profile_enable, 0);
+    rb_define_singleton_method(rb_mProfiler, "raw_data", gc_profile_record_get, 0);
     rb_define_singleton_method(rb_mProfiler, "disable", gc_profile_disable, 0);
     rb_define_singleton_method(rb_mProfiler, "clear", gc_profile_clear, 0);
     rb_define_singleton_method(rb_mProfiler, "result", gc_profile_result, 0);
diff --git a/hash.c b/hash.c
index fbd8237..32917c3 100644
--- a/hash.c
+++ b/hash.c
@@ -44,7 +44,7 @@ rb_any_cmp(VALUE a, VALUE b)
     if (FIXNUM_P(a) && FIXNUM_P(b)) {
 	return a != b;
     }
-    if (TYPE(a) == T_STRING && RBASIC(a)->klass == rb_cString &&
+    if (RB_TYPE_P(a, T_STRING) && RBASIC(a)->klass == rb_cString &&
 	TYPE(b) == T_STRING && RBASIC(b)->klass == rb_cString) {
 	return rb_str_hash_cmp(a, b);
     }
@@ -80,20 +80,14 @@ rb_any_hash(VALUE a)
     VALUE hval;
     st_index_t hnum;
 
-    switch (TYPE(a)) {
-      case T_FIXNUM:
-      case T_SYMBOL:
-      case T_NIL:
-      case T_FALSE:
-      case T_TRUE:
-	hnum = rb_hash_end(rb_hash_start((unsigned int)a));
-	break;
-
-      case T_STRING:
+    if (SPECIAL_CONST_P(a)) {
+	if (a == Qundef) return 0;
+	hnum = rb_hash_end(rb_hash_start((st_index_t)a));
+    }
+    else if (BUILTIN_TYPE(a) == T_STRING) {
 	hnum = rb_str_hash(a);
-	break;
-
-      default:
+    }
+    else {
         hval = rb_hash(a);
 	hnum = FIX2LONG(hval);
     }
@@ -106,10 +100,8 @@ static const struct st_hash_type objhash = {
     rb_any_hash,
 };
 
-static const struct st_hash_type identhash = {
-    st_numcmp,
-    st_numhash,
-};
+extern const struct st_hash_type st_hashtype_num;
+#define identhash st_hashtype_num
 
 typedef int st_foreach_func(st_data_t, st_data_t, st_data_t);
 
@@ -124,7 +116,6 @@ foreach_safe_i(st_data_t key, st_data_t value, struct foreach_safe_arg *arg)
 {
     int status;
 
-    if (key == Qundef) return ST_CONTINUE;
     status = (*arg->func)(key, value, arg->arg);
     if (status == ST_CONTINUE) {
 	return ST_CHECK;
@@ -140,7 +131,7 @@ st_foreach_safe(st_table *table, int (*func)(ANYARGS), st_data_t a)
     arg.tbl = table;
     arg.func = (st_foreach_func *)func;
     arg.arg = a;
-    if (st_foreach(table, foreach_safe_i, (st_data_t)&arg)) {
+    if (st_foreach_check(table, foreach_safe_i, (st_data_t)&arg, 0)) {
 	rb_raise(rb_eRuntimeError, "hash modified during iteration");
     }
 }
@@ -154,21 +145,21 @@ struct hash_foreach_arg {
 };
 
 static int
-hash_foreach_iter(st_data_t key, st_data_t value, struct hash_foreach_arg *arg)
+hash_foreach_iter(st_data_t key, st_data_t value, st_data_t argp)
 {
+    struct hash_foreach_arg *arg = (struct hash_foreach_arg *)argp;
     int status;
     st_table *tbl;
 
     tbl = RHASH(arg->hash)->ntbl;
-    if ((VALUE)key == Qundef) return ST_CONTINUE;
     status = (*arg->func)((VALUE)key, (VALUE)value, arg->arg);
     if (RHASH(arg->hash)->ntbl != tbl) {
 	rb_raise(rb_eRuntimeError, "rehash occurred during iteration");
     }
     switch (status) {
       case ST_DELETE:
-	st_delete_safe(tbl, &key, 0, Qundef);
 	FL_SET(arg->hash, HASH_DELETED);
+	return ST_DELETE;
       case ST_CONTINUE:
 	break;
       case ST_STOP:
@@ -184,7 +175,7 @@ hash_foreach_ensure(VALUE hash)
 
     if (RHASH(hash)->iter_lev == 0) {
 	if (FL_TEST(hash, HASH_DELETED)) {
-	    st_cleanup_safe(RHASH(hash)->ntbl, Qundef);
+	    st_cleanup_safe(RHASH(hash)->ntbl, (st_data_t)Qundef);
 	    FL_UNSET(hash, HASH_DELETED);
 	}
     }
@@ -192,9 +183,10 @@ hash_foreach_ensure(VALUE hash)
 }
 
 static VALUE
-hash_foreach_call(struct hash_foreach_arg *arg)
+hash_foreach_call(VALUE arg)
 {
-    if (st_foreach(RHASH(arg->hash)->ntbl, hash_foreach_iter, (st_data_t)arg)) {
+    VALUE hash = ((struct hash_foreach_arg *)arg)->hash;
+    if (st_foreach_check(RHASH(hash)->ntbl, hash_foreach_iter, (st_data_t)arg, (st_data_t)Qundef)) {
 	rb_raise(rb_eRuntimeError, "hash modified during iteration");
     }
     return Qnil;
@@ -447,7 +439,7 @@ rb_hash_rehash_i(VALUE key, VALUE value, VALUE arg)
 {
     st_table *tbl = (st_table *)arg;
 
-    if (key != Qundef) st_insert(tbl, key, value);
+    st_insert(tbl, (st_data_t)key, (st_data_t)value);
     return ST_CONTINUE;
 }
 
@@ -490,6 +482,20 @@ rb_hash_rehash(VALUE hash)
     return hash;
 }
 
+static VALUE
+hash_default_value(VALUE hash, VALUE key)
+{
+    if (rb_method_basic_definition_p(CLASS_OF(hash), id_default)) {
+	VALUE ifnone = RHASH_IFNONE(hash);
+	if (!FL_TEST(hash, HASH_PROC_DEFAULT)) return ifnone;
+	if (key == Qundef) return Qnil;
+	return rb_funcall(ifnone, id_yield, 2, hash, key);
+    }
+    else {
+	return rb_funcall(hash, id_default, 1, key);
+    }
+}
+
 /*
  *  call-seq:
  *     hsh[key]    ->  value
@@ -510,13 +516,7 @@ rb_hash_aref(VALUE hash, VALUE key)
     st_data_t val;
 
     if (!RHASH(hash)->ntbl || !st_lookup(RHASH(hash)->ntbl, key, &val)) {
-	if (!FL_TEST(hash, HASH_PROC_DEFAULT) &&
-	    rb_method_basic_definition_p(CLASS_OF(hash), id_default)) {
-	    return RHASH_IFNONE(hash);
-	}
-	else {
-	    return rb_funcall(hash, id_default, 1, key);
-	}
+	return hash_default_value(hash, key);
     }
     return (VALUE)val;
 }
@@ -659,7 +659,7 @@ rb_hash_default(int argc, VALUE *argv, VALUE hash)
 static VALUE
 rb_hash_set_default(VALUE hash, VALUE ifnone)
 {
-    rb_hash_modify(hash);
+    rb_hash_modify_check(hash);
     RHASH_IFNONE(hash) = ifnone;
     FL_UNSET(hash, HASH_PROC_DEFAULT);
     return ifnone;
@@ -707,7 +707,7 @@ rb_hash_set_default_proc(VALUE hash, VALUE proc)
 {
     VALUE b;
 
-    rb_hash_modify(hash);
+    rb_hash_modify_check(hash);
     b = rb_check_convert_type(proc, T_DATA, "Proc", "to_proc");
     if (NIL_P(b) || !rb_obj_is_proc(b)) {
 	rb_raise(rb_eTypeError,
@@ -776,7 +776,7 @@ rb_hash_delete_key(VALUE hash, VALUE key)
     if (!RHASH(hash)->ntbl)
         return Qundef;
     if (RHASH(hash)->iter_lev > 0) {
-	if (st_delete_safe(RHASH(hash)->ntbl, &ktmp, &val, Qundef)) {
+	if (st_delete_safe(RHASH(hash)->ntbl, &ktmp, &val, (st_data_t)Qundef)) {
 	    FL_SET(hash, HASH_DELETED);
 	    return (VALUE)val;
 	}
@@ -809,7 +809,7 @@ rb_hash_delete(VALUE hash, VALUE key)
 {
     VALUE val;
 
-    rb_hash_modify(hash);
+    rb_hash_modify_check(hash);
     val = rb_hash_delete_key(hash, key);
     if (val != Qundef) return val;
     if (rb_block_given_p()) {
@@ -828,7 +828,6 @@ shift_i(VALUE key, VALUE value, VALUE arg)
 {
     struct shift_var *var = (struct shift_var *)arg;
 
-    if (key == Qundef) return ST_CONTINUE;
     if (var->key != Qundef) return ST_STOP;
     var->key = key;
     var->val = value;
@@ -840,7 +839,6 @@ shift_i_safe(VALUE key, VALUE value, VALUE arg)
 {
     struct shift_var *var = (struct shift_var *)arg;
 
-    if (key == Qundef) return ST_CONTINUE;
     var->key = key;
     var->val = value;
     return ST_STOP;
@@ -864,29 +862,25 @@ rb_hash_shift(VALUE hash)
 {
     struct shift_var var;
 
-    rb_hash_modify(hash);
-    var.key = Qundef;
-    rb_hash_foreach(hash, RHASH(hash)->iter_lev > 0 ? shift_i_safe : shift_i,
-		    (VALUE)&var);
-
-    if (var.key != Qundef) {
-	if (RHASH(hash)->iter_lev > 0) {
-	    rb_hash_delete_key(hash, var.key);
+    rb_hash_modify_check(hash);
+    if (RHASH(hash)->ntbl) {
+	var.key = Qundef;
+	rb_hash_foreach(hash, RHASH(hash)->iter_lev > 0 ? shift_i_safe : shift_i,
+			(VALUE)&var);
+
+	if (var.key != Qundef) {
+	    if (RHASH(hash)->iter_lev > 0) {
+		rb_hash_delete_key(hash, var.key);
+	    }
+	    return rb_assoc_new(var.key, var.val);
 	}
-	return rb_assoc_new(var.key, var.val);
-    }
-    else if (FL_TEST(hash, HASH_PROC_DEFAULT)) {
-	return rb_funcall(RHASH_IFNONE(hash), id_yield, 2, hash, Qnil);
-    }
-    else {
-	return RHASH_IFNONE(hash);
     }
+    return hash_default_value(hash, Qnil);
 }
 
 static int
 delete_if_i(VALUE key, VALUE value, VALUE hash)
 {
-    if (key == Qundef) return ST_CONTINUE;
     if (RTEST(rb_yield_values(2, key, value))) {
 	rb_hash_delete_key(hash, key);
     }
@@ -912,8 +906,9 @@ VALUE
 rb_hash_delete_if(VALUE hash)
 {
     RETURN_ENUMERATOR(hash, 0, 0);
-    rb_hash_modify(hash);
-    rb_hash_foreach(hash, delete_if_i, hash);
+    rb_hash_modify_check(hash);
+    if (RHASH(hash)->ntbl)
+	rb_hash_foreach(hash, delete_if_i, hash);
     return hash;
 }
 
@@ -984,7 +979,6 @@ rb_hash_values_at(int argc, VALUE *argv, VALUE hash)
 static int
 select_i(VALUE key, VALUE value, VALUE result)
 {
-    if (key == Qundef) return ST_CONTINUE;
     if (RTEST(rb_yield_values(2, key, value)))
 	rb_hash_aset(result, key, value);
     return ST_CONTINUE;
@@ -1018,7 +1012,6 @@ rb_hash_select(VALUE hash)
 static int
 keep_if_i(VALUE key, VALUE value, VALUE hash)
 {
-    if (key == Qundef) return ST_CONTINUE;
     if (!RTEST(rb_yield_values(2, key, value))) {
 	return ST_DELETE;
     }
@@ -1040,7 +1033,7 @@ rb_hash_select_bang(VALUE hash)
     st_index_t n;
 
     RETURN_ENUMERATOR(hash, 0, 0);
-    rb_hash_modify(hash);
+    rb_hash_modify_check(hash);
     if (!RHASH(hash)->ntbl)
         return Qnil;
     n = RHASH(hash)->ntbl->num_entries;
@@ -1065,8 +1058,9 @@ VALUE
 rb_hash_keep_if(VALUE hash)
 {
     RETURN_ENUMERATOR(hash, 0, 0);
-    rb_hash_modify(hash);
-    rb_hash_foreach(hash, keep_if_i, hash);
+    rb_hash_modify_check(hash);
+    if (RHASH(hash)->ntbl)
+	rb_hash_foreach(hash, keep_if_i, hash);
     return hash;
 }
 
@@ -1144,9 +1138,7 @@ rb_hash_aset(VALUE hash, VALUE key, VALUE val)
 static int
 replace_i(VALUE key, VALUE val, VALUE hash)
 {
-    if (key != Qundef) {
-	rb_hash_aset(hash, key, val);
-    }
+    rb_hash_aset(hash, key, val);
 
     return ST_CONTINUE;
 }
@@ -1227,7 +1219,6 @@ rb_hash_empty_p(VALUE hash)
 static int
 each_value_i(VALUE key, VALUE value)
 {
-    if (key == Qundef) return ST_CONTINUE;
     rb_yield(value);
     return ST_CONTINUE;
 }
@@ -1262,7 +1253,6 @@ rb_hash_each_value(VALUE hash)
 static int
 each_key_i(VALUE key, VALUE value)
 {
-    if (key == Qundef) return ST_CONTINUE;
     rb_yield(key);
     return ST_CONTINUE;
 }
@@ -1296,7 +1286,6 @@ rb_hash_each_key(VALUE hash)
 static int
 each_pair_i(VALUE key, VALUE value)
 {
-    if (key == Qundef) return ST_CONTINUE;
     rb_yield(rb_assoc_new(key, value));
     return ST_CONTINUE;
 }
@@ -1334,7 +1323,6 @@ rb_hash_each_pair(VALUE hash)
 static int
 to_a_i(VALUE key, VALUE value, VALUE ary)
 {
-    if (key == Qundef) return ST_CONTINUE;
     rb_ary_push(ary, rb_assoc_new(key, value));
     return ST_CONTINUE;
 }
@@ -1367,7 +1355,6 @@ inspect_i(VALUE key, VALUE value, VALUE str)
 {
     VALUE str2;
 
-    if (key == Qundef) return ST_CONTINUE;
     str2 = rb_inspect(key);
     if (RSTRING_LEN(str) > 1) {
 	rb_str_cat2(str, ", ");
@@ -1434,7 +1421,6 @@ rb_hash_to_hash(VALUE hash)
 static int
 keys_i(VALUE key, VALUE value, VALUE ary)
 {
-    if (key == Qundef) return ST_CONTINUE;
     rb_ary_push(ary, key);
     return ST_CONTINUE;
 }
@@ -1465,7 +1451,6 @@ rb_hash_keys(VALUE hash)
 static int
 values_i(VALUE key, VALUE value, VALUE ary)
 {
-    if (key == Qundef) return ST_CONTINUE;
     rb_ary_push(ary, value);
     return ST_CONTINUE;
 }
@@ -1524,7 +1509,6 @@ rb_hash_search_value(VALUE key, VALUE value, VALUE arg)
 {
     VALUE *data = (VALUE *)arg;
 
-    if (key == Qundef) return ST_CONTINUE;
     if (rb_equal(value, data[1])) {
 	data[0] = Qtrue;
 	return ST_STOP;
@@ -1568,7 +1552,6 @@ eql_i(VALUE key, VALUE val1, VALUE arg)
     struct equal_data *data = (struct equal_data *)arg;
     st_data_t val2;
 
-    if (key == Qundef) return ST_CONTINUE;
     if (!st_lookup(data->tbl, key, &val2)) {
 	data->result = Qfalse;
 	return ST_STOP;
@@ -1599,7 +1582,7 @@ hash_equal(VALUE hash1, VALUE hash2, int eql)
     struct equal_data data;
 
     if (hash1 == hash2) return Qtrue;
-    if (TYPE(hash2) != T_HASH) {
+    if (!RB_TYPE_P(hash2, T_HASH)) {
 	if (!rb_respond_to(hash2, rb_intern("to_hash"))) {
 	    return Qfalse;
 	}
@@ -1670,7 +1653,6 @@ hash_i(VALUE key, VALUE val, VALUE arg)
     st_index_t *hval = (st_index_t *)arg;
     st_index_t hdata[2];
 
-    if (key == Qundef) return ST_CONTINUE;
     hdata[0] = rb_hash(key);
     hdata[1] = rb_hash(val);
     *hval ^= st_hash(hdata, sizeof(hdata), 0);
@@ -1711,7 +1693,6 @@ rb_hash_hash(VALUE hash)
 static int
 rb_hash_invert_i(VALUE key, VALUE value, VALUE hash)
 {
-    if (key == Qundef) return ST_CONTINUE;
     rb_hash_aset(hash, value, key);
     return ST_CONTINUE;
 }
@@ -1740,7 +1721,6 @@ rb_hash_invert(VALUE hash)
 static int
 rb_hash_update_i(VALUE key, VALUE value, VALUE hash)
 {
-    if (key == Qundef) return ST_CONTINUE;
     hash_update(hash, key);
     st_insert(RHASH(hash)->ntbl, key, value);
     return ST_CONTINUE;
@@ -1749,7 +1729,6 @@ rb_hash_update_i(VALUE key, VALUE value, VALUE hash)
 static int
 rb_hash_update_block_i(VALUE key, VALUE value, VALUE hash)
 {
-    if (key == Qundef) return ST_CONTINUE;
     if (rb_hash_has_key(hash, key)) {
 	value = rb_yield_values(3, key, rb_hash_aref(hash, key), value);
     }
@@ -1806,7 +1785,6 @@ rb_hash_update_func_i(VALUE key, VALUE value, VALUE arg0)
     struct update_arg *arg = (struct update_arg *)arg0;
     VALUE hash = arg->hash;
 
-    if (key == Qundef) return ST_CONTINUE;
     if (rb_hash_has_key(hash, key)) {
 	value = (*arg->func)(key, rb_hash_aref(hash, key), value);
     }
@@ -1863,7 +1841,6 @@ assoc_i(VALUE key, VALUE val, VALUE arg)
 {
     VALUE *args = (VALUE *)arg;
 
-    if (key == Qundef) return ST_CONTINUE;
     if (RTEST(rb_equal(args[0], key))) {
 	args[1] = rb_assoc_new(key, val);
 	return ST_STOP;
@@ -1901,7 +1878,6 @@ rassoc_i(VALUE key, VALUE val, VALUE arg)
 {
     VALUE *args = (VALUE *)arg;
 
-    if (key == Qundef) return ST_CONTINUE;
     if (RTEST(rb_equal(args[0], val))) {
 	args[1] = rb_assoc_new(key, val);
 	return ST_STOP;
@@ -2198,7 +2174,7 @@ rb_env_path_tainted(void)
 }
 
 #if defined(_WIN32) || (defined(HAVE_SETENV) && defined(HAVE_UNSETENV))
-#elif defined __sun__
+#elif defined __sun
 static int
 in_origenv(const char *str)
 {
@@ -2286,7 +2262,7 @@ ruby_setenv(const char *name, const char *value)
 	    rb_sys_fail("unsetenv");
 #endif
     }
-#elif defined __sun__
+#elif defined __sun
     size_t len;
     char **env_ptr, *str;
     if (strchr(name, '=')) {
@@ -3084,11 +3060,9 @@ env_invert(void)
 static int
 env_replace_i(VALUE key, VALUE val, VALUE keys)
 {
-    if (key != Qundef) {
-	env_aset(Qnil, key, val);
-	if (rb_ary_includes(keys, key)) {
-	    rb_ary_delete(keys, key);
-	}
+    env_aset(Qnil, key, val);
+    if (rb_ary_includes(keys, key)) {
+	rb_ary_delete(keys, key);
     }
     return ST_CONTINUE;
 }
@@ -3120,12 +3094,10 @@ env_replace(VALUE env, VALUE hash)
 static int
 env_update_i(VALUE key, VALUE val)
 {
-    if (key != Qundef) {
-	if (rb_block_given_p()) {
-	    val = rb_yield_values(3, key, rb_f_getenv(Qnil, key), val);
-	}
-	env_aset(Qnil, key, val);
+    if (rb_block_given_p()) {
+	val = rb_yield_values(3, key, rb_f_getenv(Qnil, key), val);
     }
+    env_aset(Qnil, key, val);
     return ST_CONTINUE;
 }
 
@@ -3150,15 +3122,116 @@ env_update(VALUE env, VALUE hash)
 }
 
 /*
- *  A <code>Hash</code> is a collection of key-value pairs. It is
- *  similar to an <code>Array</code>, except that indexing is done via
- *  arbitrary keys of any object type, not an integer index. Hashes enumerate
- *  their values in the order that the corresponding keys were inserted.
+ *  A Hash is a dictionary-like collection of unique keys and their values.
+ *  Also called associative arrays, they are similar to Arrays, but where an
+ *  Array uses integers as its index, a Hash allows you to use any object
+ *  type.
+ *
+ *  Hashes enumerate their values in the order that the corresponding keys
+ *  were inserted.
+ *
+ *  A Hash can be easily created by using its implicit form:
+ *
+ *    grades = { "Jane Doe" => 10, "Jim Doe" => 6 }
+ *
+ *  Hashes allow an alternate syntax form when your keys are always symbols.
+ *  Instead of
+ *
+ *    options = { :font_size => 10, :font_family => "Arial" }
+ *
+ *  You could write it as:
+ *
+ *    options = { font_size: 10, font_family: "Arial" }
+ *
+ *  Each named key is a symbol you can access in hash:
+ *
+ *    options[:font_size]  # => 10
+ *
+ *  A Hash can also be created through its ::new method:
+ *
+ *    grades = Hash.new
+ *    grades["Dorothy Doe"] = 9
  *
  *  Hashes have a <em>default value</em> that is returned when accessing
- *  keys that do not exist in the hash. By default, that value is
- *  <code>nil</code>.
+ *  keys that do not exist in the hash. If no default is set +nil+ is used.
+ *  You can set the default value by sending it as an argument to Hash.new:
+ *
+ *    grades = Hash.new(0)
+ *
+ *  Or by using the #default= method:
+ *
+ *    grades = {"Timmy Doe" => 8}
+ *    grades.default = 0
+ *
+ *  Accessing a value in a Hash requires using its key:
+ *
+ *    puts grades["Jane Doe"] # => 10
+ *
+ *  === Common Uses
+ *
+ *  Hashes are an easy way to represent data structures, such as
+ *
+ *    books         = {}
+ *    books[:matz]  = "The Ruby Language"
+ *    books[:black] = "The Well-Grounded Rubyist"
+ *
+ *  Hashes are also commonly used as a way to have named parameters in
+ *  functions. Note that no brackets are used below. If a hash is the last
+ *  argument on a method call, no braces are needed, thus creating a really
+ *  clean interface:
+ *
+ *    Person.create(name: "John Doe", age: 27)
+ *
+ *    def self.create(params)
+ *      @name = params[:name]
+ *      @age  = params[:age]
+ *    end
+ *
+ *  === Hash Keys
+ *
+ *  Two objects refer to the same hash key when their <code>hash</code> value
+ *  is identical and the two objects are <code>eql?</code> to each other.
+ *
+ *  A user-defined class may be used as a hash key if the <code>hash</code>
+ *  and <code>eql?</code> methods are overridden to provide meaningful
+ *  behavior.  By default, separate instances refer to separate hash keys.
+ *
+ *  A typical implementation of <code>hash</code> is based on the
+ *  object's data while <code>eql?</code> is usually aliased to the overridden
+ *  <code>==</code> method:
+ *
+ *    class Book
+ *      attr_reader :author, :title
+ *
+ *      def initialize(author, title)
+ *        @author = author
+ *        @title = title
+ *      end
+ *
+ *      def ==(other)
+ *        self.class === other and
+ *          other.author == @author and
+ *          other.title == @title
+ *      end
+ *
+ *      alias eql? ==
+ *
+ *      def hash
+ *        @author.hash ^ @title.hash # XOR
+ *      end
+ *    end
+ *
+ *    book1 = Book.new 'matz', 'Ruby in a Nutshell'
+ *    book2 = Book.new 'matz', 'Ruby in a Nutshell'
+ *
+ *    reviews = {}
+ *
+ *    reviews[book1] = 'Great reference!'
+ *    reviews[book2] = 'Nice and compact!'
+ *
+ *    reviews.length #=> 1
  *
+ *  See also Object#hash and Object#eql?
  */
 
 void
diff --git a/include/ruby/st.h b/include/ruby/st.h
index 50f2a75..119dfde 100644
--- a/include/ruby/st.h
+++ b/include/ruby/st.h
@@ -36,7 +36,7 @@ typedef unsigned long st_data_t;
 #elif SIZEOF_LONG_LONG == SIZEOF_VOIDP
 typedef unsigned LONG_LONG st_data_t;
 #else
-# error ---->> st.c requires sizeof(void*) == sizeof(long) to be compiled. <<----
+# error ---->> st.c requires sizeof(void*) == sizeof(long) or sizeof(LONG_LONG) to be compiled. <<----
 #endif
 #define ST_DATA_T_DEFINED
 
@@ -74,6 +74,11 @@ struct st_hash_type {
 
 #define ST_INDEX_BITS (sizeof(st_index_t) * CHAR_BIT)
 
+typedef struct st_packed_entry {
+    st_index_t hash;
+    st_data_t key, val;
+} st_packed_entry;
+
 struct st_table {
     const struct st_hash_type *type;
     st_index_t num_bins;
@@ -91,8 +96,17 @@ struct st_table {
     __extension__
 #endif
     st_index_t num_entries : ST_INDEX_BITS - 1;
-    struct st_table_entry **bins;
-    struct st_table_entry *head, *tail;
+    union {
+	struct {
+	    struct st_table_entry **bins;
+	    struct st_table_entry *head, *tail;
+	} big;
+	struct {
+	    struct st_packed_entry *entries;
+	    st_index_t real_entries;
+	} packed;
+	st_packed_entry upacked;
+    } as;
 };
 
 #define st_is_member(table,key) st_lookup((table),(key),(st_data_t *)0)
@@ -114,6 +128,7 @@ int st_insert2(st_table *, st_data_t, st_data_t, st_data_t (*)(st_data_t));
 int st_lookup(st_table *, st_data_t, st_data_t *);
 int st_get_key(st_table *, st_data_t, st_data_t *);
 int st_foreach(st_table *, int (*)(ANYARGS), st_data_t);
+int st_foreach_check(st_table *, int (*)(ANYARGS), st_data_t, st_data_t);
 int st_reverse_foreach(st_table *, int (*)(ANYARGS), st_data_t);
 void st_add_direct(st_table *, st_data_t, st_data_t);
 void st_free_table(st_table *);
diff --git a/internal.h b/internal.h
index 5d0cff0..99b4015 100644
--- a/internal.h
+++ b/internal.h
@@ -112,6 +112,9 @@ VALUE rb_iseq_clone(VALUE iseqval, VALUE newcbase);
 
 /* load.c */
 VALUE rb_get_load_path(void);
+void rb_reset_expanded_cache();
+void rb_load_path_ary_push(VALUE path);
+extern VALUE rb_cExpandedPath;
 
 /* math.c */
 VALUE rb_math_atan2(VALUE, VALUE);
diff --git a/load.c b/load.c
index 0ff4b60..80b2256 100644
--- a/load.c
+++ b/load.c
@@ -4,6 +4,7 @@
 
 #include "ruby/ruby.h"
 #include "ruby/util.h"
+#include "ruby/encoding.h"
 #include "internal.h"
 #include "dln.h"
 #include "eval_intern.h"
@@ -18,6 +19,7 @@ VALUE ruby_dln_librefs;
 #define IS_DLEXT(e) (strcmp((e), DLEXT) == 0)
 #endif
 
+static int sorted_loaded_features = 1;
 
 static const char *const loadable_ext[] = {
     ".rb", DLEXT,
@@ -27,28 +29,45 @@ static const char *const loadable_ext[] = {
     0
 };
 
-VALUE
-rb_get_load_path(void)
-{
-    VALUE load_path = GET_VM()->load_path;
-    return load_path;
-}
+static VALUE rb_checked_expanded_cache(int*);
+static void rb_set_expanded_cache(VALUE, int);
+static VALUE rb_expand_load_paths(long, VALUE*, int*);
+static int cached_expanded_load_path = 1;
+VALUE rb_cExpandedPath;
 
 VALUE
 rb_get_expanded_load_path(void)
 {
-    VALUE load_path = rb_get_load_path();
-    VALUE ary;
-    long i;
+    VALUE expanded = rb_checked_expanded_cache(NULL);
 
-    ary = rb_ary_new2(RARRAY_LEN(load_path));
-    for (i = 0; i < RARRAY_LEN(load_path); ++i) {
-	VALUE path = rb_file_expand_path(RARRAY_PTR(load_path)[i], Qnil);
-	rb_str_freeze(path);
-	rb_ary_push(ary, path);
+    if ( !RTEST(expanded) ) {
+	VALUE load_path = GET_VM()->load_path;
+	int has_relative = 0;
+
+	if (!load_path) return 0;
+
+	expanded = rb_expand_load_paths(
+			RARRAY_LEN(load_path), RARRAY_PTR(load_path),
+			&has_relative);
+	RB_GC_GUARD(load_path);
+
+	if (cached_expanded_load_path) {
+	    rb_set_expanded_cache(expanded, has_relative);
+	}
+    } else {
+	expanded = rb_ary_dup(expanded);
     }
-    rb_obj_freeze(ary);
-    return ary;
+    return expanded;
+}
+
+VALUE
+rb_get_load_path(void)
+{
+    VALUE load_path =
+	cached_expanded_load_path ?
+	    rb_get_expanded_load_path():
+	    GET_VM()->load_path;
+    return load_path;
 }
 
 static VALUE
@@ -129,6 +148,9 @@ loaded_feature_path_i(st_data_t v, st_data_t b, st_data_t f)
     return ST_STOP;
 }
 
+static long rb_feature_first_equal_or_greater(VALUE, const char *, long);
+static int  rb_stop_search_feature(VALUE, const char *, long);
+
 static int
 rb_feature_p(const char *feature, const char *ext, int rb, int expanded, const char **fn)
 {
@@ -151,8 +173,10 @@ rb_feature_p(const char *feature, const char *ext, int rb, int expanded, const c
 	type = 0;
     }
     features = get_loaded_features();
-    for (i = 0; i < RARRAY_LEN(features); ++i) {
+    i = rb_feature_first_equal_or_greater(features, feature, len);
+    for (; i < RARRAY_LEN(features); ++i) {
 	v = RARRAY_PTR(features)[i];
+	if (rb_stop_search_feature(v, feature, len)) break;
 	f = StringValuePtr(v);
 	if ((n = RSTRING_LEN(v)) < len) continue;
 	if (strncmp(f, feature, len) != 0) {
@@ -176,14 +200,14 @@ rb_feature_p(const char *feature, const char *ext, int rb, int expanded, const c
 	}
     }
     loading_tbl = get_loading_table();
-    if (loading_tbl) {
+    if (loading_tbl && loading_tbl->num_entries > 0) {
 	f = 0;
 	if (!expanded) {
 	    struct loaded_feature_searching fs;
 	    fs.name = feature;
 	    fs.len = len;
 	    fs.type = type;
-	    fs.load_path = load_path ? load_path : rb_get_load_path();
+	    fs.load_path = load_path ? load_path : rb_get_expanded_load_path();
 	    fs.result = 0;
 	    st_foreach(loading_tbl, loaded_feature_path_i, (st_data_t)&fs);
 	    if ((f = fs.result) != 0) {
@@ -251,6 +275,170 @@ rb_feature_provided(const char *feature, const char **loading)
     return FALSE;
 }
 
+static long
+feature_basename_length(const char *feature, long flen)
+{
+    if (sorted_loaded_features) {
+	const char *ext = strrchr(feature, '.');
+	return ext && !strchr(ext, '/') ? ext - feature : flen;
+    } else {
+	return 0;
+    }
+}
+
+static int
+compare_feature_name(const char *left, long llen, const char *right, long rlen)
+{
+    int diff = 0;
+    while (llen-- && rlen--) {
+	diff = left[llen] - right[rlen];
+	if (diff) break;
+	if (left[llen] == '/') break;
+    }
+    return diff;
+}
+
+static int
+rb_compare_feature_name(VALUE loaded, const char *feature, long flen)
+{
+    const char *loaded_name = StringValuePtr(loaded);
+    long loaded_len = feature_basename_length(loaded_name, RSTRING_LEN(loaded));
+    return compare_feature_name(loaded_name, loaded_len, feature, flen);
+}
+
+/* used to find when equal features run out */
+static int
+rb_stop_search_feature(VALUE loaded, const char *feature, long flen)
+{
+    if (sorted_loaded_features)
+	return rb_compare_feature_name(loaded, feature, flen) > 0;
+    else
+	return FALSE;
+}
+
+/* returns first position to search feature from */
+static long
+rb_feature_first_equal_or_greater(VALUE features, const char *feature, long flen)
+{
+    if (sorted_loaded_features) {
+	long before = 0, first = RARRAY_LEN(features);
+	VALUE *values = RARRAY_PTR(features);
+	if (first == 0)
+	    return 0;
+	if (rb_compare_feature_name(values[0], feature, flen) >= 0)
+	    return 0;
+
+	while (first - before > 1) {
+	    long mid = (first + before) / 2;
+	    long cmp = rb_compare_feature_name(values[mid], feature, flen);
+	    if (cmp >= 0)
+		first = mid;
+	    else
+		before = mid;
+	}
+	return first;
+    } else {
+	return 0;
+    }
+}
+
+/* returns position to insert new feature in */
+static long
+rb_feature_first_greater(VALUE features, const char *feature, long flen)
+{
+    if (sorted_loaded_features) {
+	long before = 0, first = RARRAY_LEN(features);
+	VALUE *values = RARRAY_PTR(features);
+	if (first == 0)
+	    return 0;
+	if (rb_compare_feature_name(values[0], feature, flen) > 0)
+	    return 0;
+	if (rb_compare_feature_name(values[first-1], feature, flen) <= 0)
+	    return first;
+
+	while (first - before > 1) {
+	    long mid = (first + before) / 2;
+	    long cmp = rb_compare_feature_name(values[mid], feature, flen);
+	    if (cmp > 0)
+		first = mid;
+	    else
+		before = mid;
+	}
+	return first;
+    } else {
+	return RARRAY_LEN(features);
+    }
+}
+
+
+static VALUE
+rb_push_feature_1(VALUE features, VALUE feature)
+{
+    const char *fname = StringValuePtr(feature);
+    long flen = feature_basename_length(fname, RSTRING_LEN(feature));
+    long i = rb_feature_first_greater(features, fname, flen);
+    rb_ary_push(features, feature);
+    if ( i < RARRAY_LEN(features) - 1 ) {
+	MEMMOVE(RARRAY_PTR(features) + i + 1, RARRAY_PTR(features) + i,
+		VALUE, RARRAY_LEN(features) - i - 1);
+	RARRAY_PTR(features)[i] = feature;
+    }
+    return features;
+}
+
+static VALUE
+rb_push_feature_m(long argc, VALUE *argv, VALUE features)
+{
+    while (argc--) {
+	rb_push_feature_1(features, *argv++);
+    }
+    return features;
+}
+
+static VALUE
+rb_concat_features(VALUE features, VALUE add)
+{
+    add = rb_convert_type(add, T_ARRAY, "Array", "to_ary");
+    if (RARRAY_LEN(add)) {
+	rb_push_feature_m(RARRAY_LEN(add), RARRAY_PTR(add), features);
+    }
+    return features;
+}
+static const char *load_features_undefined_methods[] = {
+    "[]=", "reverse!", "rotate!", "sort!", "sort_by!",
+    "collect!", "map!", "shuffle!", "fill", "insert",
+    NULL
+};
+
+static VALUE
+rb_loaded_features_init(void)
+{
+    char *sorted_flag;
+    const char **name;
+    VALUE loaded_features = rb_ary_new();
+    VALUE loaded_features_c = rb_singleton_class(loaded_features);
+
+    sorted_flag = getenv("RUBY_LOADED_FEATURES_SORTED");
+    if (sorted_flag != NULL) {
+	int sorted_set = atoi(sorted_flag);
+	if (RTEST(ruby_verbose))
+	    fprintf(stderr, "sorted_loaded_features=%d (%d)\n", sorted_set, sorted_loaded_features);
+	sorted_loaded_features = sorted_set;
+    }
+
+    for(name = load_features_undefined_methods; *name; name++) {
+	rb_undef_method(loaded_features_c, *name);
+    }
+
+    if (sorted_loaded_features) {
+	rb_define_method(loaded_features_c, "<<", rb_push_feature_1, 1);
+	rb_define_method(loaded_features_c, "push", rb_push_feature_m, -1);
+	rb_define_method(loaded_features_c, "concat", rb_concat_features, 1);
+	rb_define_method(loaded_features_c, "unshift", rb_push_feature_m, -1);
+    }
+    return loaded_features;
+}
+
 static void
 rb_provide_feature(VALUE feature)
 {
@@ -258,7 +446,10 @@ rb_provide_feature(VALUE feature)
 	rb_raise(rb_eRuntimeError,
 		 "$LOADED_FEATURES is frozen; cannot append feature");
     }
-    rb_ary_push(get_loaded_features(), feature);
+    if (sorted_loaded_features)
+	rb_push_feature_1(get_loaded_features(), feature);
+    else
+	rb_ary_push(get_loaded_features(), feature);
 }
 
 void
@@ -760,6 +951,230 @@ rb_f_autoload_p(VALUE obj, VALUE sym)
     return rb_mod_autoload_p(klass, sym);
 }
 
+/* $LOAD_PATH methods which invalidates cache */
+static const char *load_path_reset_cache_methods[] = {
+    "[]=", "collect!", "compact!", "delete",
+    "delete_if", "fill", "flatten!", "insert", "keep_if",
+    "map!", "reject!", "replace", "select!", "shuffle!",
+    "sort!", "sort_by!", "uniq!", NULL
+};
+
+/* $LOAD_PATH methods which sends also to cache */
+static const char *load_path_apply_to_cache_methods[] = {
+    "clear", "delete_at", "pop", "reverse!", "rotate!",
+    "shift", "slice!", NULL
+};
+
+/* $LOAD_PATH methods which sends to cache whith expanded arguments */
+static const char *load_path_apply_expanded_methods[] = {
+    "<<", "push", "unshift", NULL
+};
+
+void
+rb_reset_expanded_cache()
+{
+    GET_VM()->load_path_expanded_cache = 0;
+}
+
+static VALUE
+rb_load_path_expanded_cache()
+{
+    VALUE cache = GET_VM()->load_path_expanded_cache;
+    VALUE expanded = Qnil;
+    if (RTEST(cache)) {
+	expanded = RARRAY_PTR(cache)[2];
+    }
+    return expanded;
+}
+
+/* Return cache only if we still in the same working directory
+ * and filesystem_encoding didn't change
+ * Invalidate cache otherwise
+ */
+static VALUE
+rb_checked_expanded_cache(int *has_relative)
+{
+    VALUE cache = GET_VM()->load_path_expanded_cache;
+    VALUE expanded = Qnil;
+    if (RTEST(cache)) {
+	VALUE curwd = RARRAY_PTR(cache)[0];
+	VALUE encindex = RARRAY_PTR(cache)[1];
+	int cache_valid = rb_filesystem_encindex() == FIX2INT(encindex);
+
+	if ( cache_valid ) {
+	    cache_valid = curwd == Qtrue;
+	    if (has_relative) {
+		*has_relative = cache_valid;
+	    }
+	    if (!cache_valid ) {
+		char *cwd = my_getcwd();
+		cache_valid = !strcmp(RSTRING_PTR(curwd), cwd);
+		xfree(cwd);
+	    }
+	}
+
+	if ( !cache_valid ) {
+	    rb_reset_expanded_cache();
+	} else {
+	    expanded = RARRAY_PTR(cache)[2];
+	}
+    }
+    RB_GC_GUARD(cache);
+    return expanded;
+}
+
+static void
+rb_set_expanded_cache(VALUE expanded, int has_relative)
+{
+    VALUE cache = rb_ary_new2(3);
+
+    if (has_relative) {
+	char *cwd = my_getcwd();
+	rb_ary_push(cache, rb_str_new_cstr(cwd));
+	xfree(cwd);
+    } else {
+	rb_ary_push(cache, Qtrue);
+    }
+
+    rb_ary_push(cache, INT2FIX(rb_filesystem_encindex()));
+    rb_ary_push(cache, rb_ary_dup(expanded));
+    GET_VM()->load_path_expanded_cache = cache;
+}
+
+static VALUE
+rb_expand_load_paths(long pathc, VALUE* paths, int *has_relative)
+{
+    long i;
+    const char *p;
+    VALUE path, expanded = rb_ary_new2(pathc);
+
+    for(i = 0; i < pathc; i++) {
+	path = rb_get_path(paths[i]);
+	p = RSTRING_PTR(path);
+	*has_relative = *has_relative || !rb_is_absolute_path(p);
+	path = rb_file_expand_path(path, Qnil);
+	RBASIC(path)->klass = rb_cExpandedPath;
+	rb_str_freeze(path);
+	rb_ary_push(expanded, path);
+    }
+
+    return expanded;
+}
+
+/* Invalidating $LOAD_PATH methods implementation */
+static VALUE
+rb_load_path_reset_cache_method(int argc, VALUE *argv, VALUE self)
+{
+    rb_reset_expanded_cache();
+    return rb_call_super(argc, argv);
+}
+
+/* Proxying $LOAD_PATH methods implementation */
+static VALUE
+rb_load_path_apply_to_cache_method(int argc, VALUE *argv, VALUE self)
+{
+    VALUE load_path_expanded = rb_load_path_expanded_cache();
+    if (RTEST(load_path_expanded)) {
+	ID func = rb_frame_this_func();
+	rb_funcall2(load_path_expanded, func, argc, argv);
+    }
+    return rb_call_super(argc, argv);
+}
+
+/* Proxying with expansion $LOAD_PATH methods implementation */
+static VALUE
+rb_load_path_apply_expanded_method(int argc, VALUE *argv, VALUE self)
+{
+    int old_has_relative = 0;
+    /* We call methods on cache only if we still in the same working directory */
+    VALUE load_path_expanded = rb_checked_expanded_cache(&old_has_relative);
+    if (RTEST(load_path_expanded)) {
+	int has_relative = 0;
+	ID func = rb_frame_this_func();
+	VALUE expanded = rb_expand_load_paths(argc, argv, &has_relative);
+
+	rb_funcall2(load_path_expanded, func, argc, RARRAY_PTR(expanded));
+
+	if (!old_has_relative && has_relative) {
+	    rb_set_expanded_cache(load_path_expanded, has_relative);
+	}
+	RB_GC_GUARD(expanded);
+    }
+    return rb_call_super(argc, argv);
+}
+/* $LOAD_PATH.concat(ary) - special, we call push(*ary) instead
+ * cause I'm lazy a bit and wish not to rewrite method above second time :)
+ */
+static VALUE
+rb_load_path_concat(VALUE self, VALUE ary)
+{
+    ID push;
+    CONST_ID(push, "push");
+    RB_GC_GUARD(ary);
+    return rb_funcall2(self, push, (int)RARRAY_LEN(ary), RARRAY_PTR(ary));
+}
+
+void
+rb_load_path_ary_push(VALUE path)
+{
+    int old_has_relative = 0;
+    VALUE load_path_expanded = rb_checked_expanded_cache(&old_has_relative);
+    if (RTEST(load_path_expanded)) {
+	int has_relative = 0;
+	VALUE expanded = rb_expand_load_paths(1, &path, &has_relative);
+
+	rb_ary_push(load_path_expanded, RARRAY_PTR(expanded)[0]);
+
+	if (!old_has_relative && has_relative) {
+	    rb_set_expanded_cache(load_path_expanded, has_relative);
+	}
+	RB_GC_GUARD(expanded);
+    }
+
+    rb_ary_push(GET_VM()->load_path, path);
+}
+
+static VALUE
+rb_load_path_init(void)
+{
+    const char **name;
+    VALUE load_path = rb_ary_new();
+    char *cached_flag;
+
+    cached_flag = getenv("RUBY_CACHED_LOAD_PATH");
+    if (cached_flag != NULL) {
+	cached_expanded_load_path = atoi(cached_flag);
+    }
+
+    rb_cExpandedPath = rb_class_new(rb_cString); /* XXX could GC collect it before next line is executed? */
+    rb_iv_set(rb_cFile, "expanded_path", rb_cExpandedPath); /* prevent from GC */
+
+    /* Do all the magick if user did not disable it
+     * with RUBY_CACHED_LOAD_PATH=0 environment variable
+     */
+    if (cached_expanded_load_path) {
+	VALUE load_path_c = rb_singleton_class(load_path);
+
+	for(name = load_path_reset_cache_methods; *name; name++ ) {
+	    rb_define_method(load_path_c, *name, rb_load_path_reset_cache_method, -1);
+	}
+
+	for(name = load_path_apply_to_cache_methods; *name; name++ ) {
+	    rb_define_method(load_path_c, *name, rb_load_path_apply_to_cache_method, -1);
+	}
+
+	for(name = load_path_apply_expanded_methods; *name; name++ ) {
+	    rb_define_method(load_path_c, *name, rb_load_path_apply_expanded_method, -1);
+	}
+
+	rb_define_method(load_path_c, "concat", rb_load_path_concat, 1);
+    }
+
+    rb_reset_expanded_cache();
+
+    return load_path;
+}
+
 void
 Init_load()
 {
@@ -772,11 +1187,11 @@ Init_load()
     rb_define_hooked_variable(var_load_path, (VALUE*)vm, load_path_getter, rb_gvar_readonly_setter);
     rb_alias_variable(rb_intern("$-I"), id_load_path);
     rb_alias_variable(rb_intern("$LOAD_PATH"), id_load_path);
-    vm->load_path = rb_ary_new();
+    vm->load_path = rb_load_path_init();
 
     rb_define_virtual_variable("$\"", get_loaded_features, 0);
     rb_define_virtual_variable("$LOADED_FEATURES", get_loaded_features, 0);
-    vm->loaded_features = rb_ary_new();
+    vm->loaded_features = rb_loaded_features_init();
 
     rb_define_global_function("load", rb_f_load, -1);
     rb_define_global_function("require", rb_f_require, 1);
diff --git a/pool_alloc.h b/pool_alloc.h
new file mode 100644
index 0000000..957708e
--- /dev/null
+++ b/pool_alloc.h
@@ -0,0 +1,11 @@
+#ifndef POOL_ALLOC_H
+#define POOL_ALLOC_H
+
+#define POOL_ALLOC_API
+#ifdef POOL_ALLOC_API
+void  ruby_xpool_free(void *ptr);
+void *ruby_xpool_malloc_6p();
+void *ruby_xpool_malloc_11p();
+#endif
+
+#endif
diff --git a/pool_alloc.inc.h b/pool_alloc.inc.h
new file mode 100644
index 0000000..026f40c
--- /dev/null
+++ b/pool_alloc.inc.h
@@ -0,0 +1,223 @@
+/*
+ * this is generic pool allocator
+ * you should define following macroses:
+ * ITEM_NAME - unique identifier, which allows to hold functions in a namespace
+ * ITEM_TYPEDEF(name) - passed to typedef to localize item type
+ * free_entry - desired name of function for free entry
+ * alloc_entry - defired name of function for allocate entry
+ */
+
+#if POOL_ALLOC_PART == 1
+#ifdef HEAP_ALIGN_LOG
+#define DEFAULT_POOL_SIZE (1 << HEAP_ALIGN_LOG)
+#else
+#define DEFAULT_POOL_SIZE (sizeof(void*) * 2048)
+#endif
+typedef unsigned int pool_holder_counter;
+
+typedef struct pool_entry_list pool_entry_list;
+typedef struct pool_holder pool_holder;
+
+typedef struct pool_header {
+    pool_holder         *first;
+    rb_atomic_t          lock;
+    pool_holder_counter  size; // size of entry in sizeof(void*) items
+    pool_holder_counter  total; // size of entry in sizeof(void*) items
+} pool_header;
+
+struct pool_holder {
+    pool_holder_counter free, total;
+    pool_header  *header;
+    void               *freep;
+    pool_holder        *fore, *back;
+    void *data[1];
+};
+#define POOL_DATA_SIZE(pool_size) (((pool_size) - sizeof(void*) * 6 - offsetof(pool_holder, data)) / sizeof(void*))
+#define POOL_ENTRY_SIZE(item_type) ((sizeof(item_type) - 1) / sizeof(void*) + 1)
+#define POOL_HOLDER_COUNT(pool_size, item_type) (POOL_DATA_SIZE(pool_size)/POOL_ENTRY_SIZE(item_type))
+#define INIT_POOL(item_type) {NULL, 0, POOL_ENTRY_SIZE(item_type), POOL_HOLDER_COUNT(DEFAULT_POOL_SIZE, item_type)}
+
+#elif POOL_ALLOC_PART == 2
+
+#if   defined(_WIN32)
+#define native_thread_yield() Sleep(0)
+#elif HAVE_SCHED_YIELD
+#define native_thread_yield() (void)sched_yield()
+#else
+#define native_thread_yield() ((void)0)
+#endif
+
+#define MAX_TRY_CICLES 5
+static inline int
+living_threads()
+{
+    rb_vm_t *vm = GET_VM();
+    st_table *living_threads;
+    return vm && (living_threads = vm->living_threads) ? living_threads->num_entries : 1;
+}
+
+static void
+lock_header(pool_header *header)
+{
+    int i;
+    if (living_threads() == 1) {
+	header->lock = 1;
+	return;
+    }
+    i = MAX_TRY_CICLES;
+    while(ATOMIC_EXCHANGE(header->lock, 1)) {
+	if (--i == 0) {
+	    native_thread_yield();
+	    i = MAX_TRY_CICLES;
+	}
+    }
+}
+
+static inline void
+unlock_header(pool_header *header)
+{
+    if (living_threads() == 1) {
+	header->lock = 0;
+	return;
+    }
+    ATOMIC_SET(header->lock, 0);
+}
+
+static pool_holder *
+pool_holder_alloc(pool_header *header)
+{
+    pool_holder *holder;
+    pool_holder_counter i, size, count;
+    register void **ptr;
+
+    size_t sz = offsetof(pool_holder, data) +
+	    header->size * header->total * sizeof(void*);
+#define objspace (&rb_objspace)
+    unlock_header(header);
+    vm_malloc_prepare(objspace, DEFAULT_POOL_SIZE);
+    lock_header(header);
+    if (header->first != NULL) {
+	return header->first;
+    }
+    holder = (pool_holder*) aligned_malloc(DEFAULT_POOL_SIZE, sz);
+    if (!holder) {
+	unlock_header(header);
+	if (!garbage_collect_with_gvl(objspace)) {
+	    ruby_memerror();
+	}
+	holder = (pool_holder*) aligned_malloc(DEFAULT_POOL_SIZE, sz);
+	if (!holder) {
+	    ruby_memerror();
+	}
+	lock_header(header);
+    }
+    malloc_increase += DEFAULT_POOL_SIZE;
+#if CALC_EXACT_MALLOC_SIZE
+    objspace->malloc_params.allocated_size += DEFAULT_POOL_SIZE;
+    objspace->malloc_params.allocations++;
+#endif
+#undef objspace
+
+    size = header->size;
+    count = header->total;
+    holder->free = count;
+    holder->total = count;
+    holder->header = header;
+    holder->fore = NULL;
+    holder->back = NULL;
+    holder->freep = &holder->data;
+    ptr = holder->data;
+    for(i = count - 1; i; i-- ) {
+	ptr = *ptr = ptr + size;
+    }
+    *ptr = NULL;
+    header->first = holder;
+    return holder;
+}
+
+static inline void
+pool_holder_unchaing(pool_header *header, pool_holder *holder)
+{
+    register pool_holder *fore = holder->fore, *back = holder->back;
+    holder->fore = NULL;
+    holder->back = NULL;
+    if (fore != NULL)  fore->back     = back;
+    if (back != NULL)  back->fore     = fore;
+    else               header->first = fore;
+}
+
+static inline pool_holder *
+entry_holder(void **entry)
+{
+    return (pool_holder*)(((uintptr_t)entry) & ~(DEFAULT_POOL_SIZE - 1));
+}
+
+static inline void
+pool_free_entry(void **entry)
+{
+    pool_holder *holder = entry_holder(entry);
+    pool_header *header = holder->header;
+
+    lock_header(header);
+
+    if (holder->free++ == 0) {
+	register pool_holder *first = header->first;
+	if (first == NULL) {
+	    header->first = holder;
+	} else {
+	    holder->back = first;
+	    holder->fore = first->fore;
+	    first->fore = holder;
+	    if (holder->fore)
+		holder->fore->back = holder;
+	}
+    } else if (holder->free == holder->total && header->first != holder ) {
+	pool_holder_unchaing(header, holder);
+	aligned_free(holder);
+#if CALC_EXACT_MALLOC_SIZE
+	rb_objspace.malloc_params.allocated_size -= DEFAULT_POOL_SIZE;
+	rb_objspace.malloc_params.allocations--;
+#endif
+        unlock_header(header);
+	return;
+    }
+
+    *entry = holder->freep;
+    holder->freep = entry;
+    unlock_header(header);
+}
+
+static inline void*
+pool_alloc_entry(pool_header *header)
+{
+    pool_holder *holder;
+    void **result;
+
+    lock_header(header);
+    holder = header->first;
+
+    if (holder == NULL) {
+	holder = pool_holder_alloc(header);
+    }
+
+    result = holder->freep;
+    holder->freep = *result;
+
+    if (--holder->free == 0) {
+	pool_holder_unchaing(header, holder);
+    }
+
+    unlock_header(header);
+
+    return result;
+}
+
+static void
+pool_finalize_header(pool_header *header)
+{
+    if (header->first) {
+        aligned_free(header->first);
+        header->first = NULL;
+    }
+}
+#endif
diff --git a/ruby.c b/ruby.c
index 3c97d01..b9b9fd5 100644
--- a/ruby.c
+++ b/ruby.c
@@ -209,7 +209,6 @@ push_include(const char *path, VALUE (*filter)(VALUE))
 {
     const char sep = PATH_SEP_CHAR;
     const char *p, *s;
-    VALUE load_path = GET_VM()->load_path;
 
     p = path;
     while (*p) {
@@ -217,7 +216,7 @@ push_include(const char *path, VALUE (*filter)(VALUE))
 	    p++;
 	if (!*p) break;
 	for (s = p; *s && *s != sep; s = CharNext(s));
-	rb_ary_push(load_path, (*filter)(rubylib_mangled_path(p, s - p)));
+	rb_load_path_ary_push((*filter)(rubylib_mangled_path(p, s - p)));
 	p = s;
     }
 }
@@ -338,7 +337,6 @@ ruby_init_loadpath(void)
 void
 ruby_init_loadpath_safe(int safe_level)
 {
-    VALUE load_path;
     ID id_initial_load_path_mark;
     extern const char ruby_initial_load_paths[];
     const char *paths = ruby_initial_load_paths;
@@ -438,7 +436,6 @@ ruby_init_loadpath_safe(int safe_level)
 #define RUBY_RELATIVE(path, len) rubylib_mangled_path((path), (len))
 #define PREFIX_PATH() RUBY_RELATIVE(exec_prefix, sizeof(exec_prefix)-1)
 #endif
-    load_path = GET_VM()->load_path;
 
     if (safe_level == 0) {
 #ifdef MANGLED_PATH
@@ -452,7 +449,7 @@ ruby_init_loadpath_safe(int safe_level)
 	size_t len = strlen(paths);
 	VALUE path = RUBY_RELATIVE(paths, len);
 	rb_ivar_set(path, id_initial_load_path_mark, path);
-	rb_ary_push(load_path, path);
+	rb_load_path_ary_push(path);
 	paths += len + 1;
     }
 
@@ -1349,6 +1346,7 @@ process_options(int argc, char **argv, struct cmdline_options *opt)
 	for (i = 0; i < RARRAY_LEN(load_path); ++i) {
 	    rb_enc_associate(RARRAY_PTR(load_path)[i], lenc);
 	}
+	rb_reset_expanded_cache();
     }
     if (!(opt->disable & DISABLE_BIT(gems))) {
 #if defined DISABLE_RUBYGEMS && DISABLE_RUBYGEMS
diff --git a/st.c b/st.c
index fda5784..890bdca 100644
--- a/st.c
+++ b/st.c
@@ -7,6 +7,7 @@
 #include "st.h"
 #else
 #include "ruby/ruby.h"
+#include "pool_alloc.h"
 #endif
 
 #include <stdio.h>
@@ -25,8 +26,17 @@ struct st_table_entry {
     st_table_entry *fore, *back;
 };
 
-#define ST_DEFAULT_MAX_DENSITY 5
+#define STATIC_ASSERT(name, expr) typedef int static_assert_##name##_check[(expr) ? 1 : -1];
+
+#define ST_DEFAULT_MAX_DENSITY 2
 #define ST_DEFAULT_INIT_TABLE_SIZE 11
+#define ST_DEFAULT_SECOND_TABLE_SIZE 19
+#define ST_DEFAULT_PACKED_TABLE_SIZE 18
+#define PACKED_UNIT (int)(sizeof(st_packed_entry) / sizeof(st_table_entry*))
+#define MAX_PACKED_HASH (int)(ST_DEFAULT_PACKED_TABLE_SIZE * sizeof(st_table_entry*) / sizeof(st_packed_entry))
+
+STATIC_ASSERT(st_packed_entry, sizeof(st_packed_entry) == sizeof(st_table_entry*[PACKED_UNIT]))
+STATIC_ASSERT(st_packed_bins, sizeof(st_packed_entry[MAX_PACKED_HASH]) <= sizeof(st_table_entry*[ST_DEFAULT_PACKED_TABLE_SIZE]))
 
     /*
      * DEFAULT_MAX_DENSITY is the default for the largest we allow the
@@ -38,7 +48,8 @@ struct st_table_entry {
      *
      */
 
-static const struct st_hash_type type_numhash = {
+#define type_numhash st_hashtype_num
+const struct st_hash_type st_hashtype_num = {
     st_numcmp,
     st_numhash,
 };
@@ -61,20 +72,127 @@ static void rehash(st_table *);
 #ifdef RUBY
 #define malloc xmalloc
 #define calloc xcalloc
+#define realloc xrealloc
 #define free(x) xfree(x)
 #endif
 
 #define numberof(array) (int)(sizeof(array) / sizeof((array)[0]))
 
-#define alloc(type) (type*)malloc((size_t)sizeof(type))
-#define Calloc(n,s) (char*)calloc((n),(s))
-
 #define EQUAL(table,x,y) ((x)==(y) || (*(table)->type->compare)((x),(y)) == 0)
 
-/* remove cast to unsigned int in the future */
-#define do_hash(key,table) (unsigned int)(st_index_t)(*(table)->type->hash)((key))
+#define do_hash(key,table) (st_index_t)(*(table)->type->hash)((key))
 #define do_hash_bin(key,table) (do_hash((key), (table))%(table)->num_bins)
 
+/* preparation for possible allocation improvements */
+#ifdef POOL_ALLOC_API
+#define st_alloc_entry() (st_table_entry *)ruby_xpool_malloc_6p()
+#define st_free_entry(entry) ruby_xpool_free(entry)
+#define st_alloc_table() (st_table *)ruby_xpool_malloc_6p()
+#define st_dealloc_table(table) ruby_xpool_free(table)
+static inline st_table_entry **
+st_alloc_bins(st_index_t size)
+{
+    st_table_entry **result;
+    if (size == 11) {
+        result = (st_table_entry **) ruby_xpool_malloc_11p();
+        memset(result, 0, 11 * sizeof(st_table_entry *));
+    }
+    else
+        result = (st_table_entry **) ruby_xcalloc(size, sizeof(st_table_entry*));
+    return result;
+}
+static inline void
+st_free_bins(st_table_entry **bins, st_index_t size)
+{
+    if (size == 11)
+	ruby_xpool_free(bins);
+    else
+	ruby_xfree(bins);
+}
+static inline st_table_entry**
+st_realloc_bins(st_table_entry **bins, st_index_t newsize, st_index_t oldsize)
+{
+    st_free_bins(bins, oldsize);
+    return st_alloc_bins(newsize);
+}
+#else
+#define st_alloc_entry() (st_table_entry *)malloc(sizeof(st_table_entry))
+#define st_free_entry(entry) free(entry)
+#define st_alloc_table() (st_table *)malloc(sizeof(st_table))
+#define st_dealloc_table(table) free(table)
+#define st_alloc_bins(size) (st_table_entry **)calloc(size, sizeof(st_table_entry *))
+#define st_free_bins(bins, size) free(bins)
+static inline st_table_entry**
+st_realloc_bins(st_table_entry **bins, st_index_t newsize, st_index_t oldsize)
+{
+    bins = (st_table_entry **)realloc(bins, newsize * sizeof(st_table_entry *));
+    MEMZERO(bins, st_table_entry*, newsize);
+    return bins;
+}
+#endif
+
+/* Shortage */
+#define bins as.big.bins
+#define head as.big.head
+#define tail as.big.tail
+#define real_entries as.packed.real_entries
+
+/* preparation for possible packing improvements */
+#define PACKED_BINS(table) ((table)->as.packed.entries)
+#define PACKED_ENT(table, i) PACKED_BINS(table)[i]
+#define PKEY(table, i) PACKED_ENT((table), (i)).key
+#define PVAL(table, i) PACKED_ENT((table), (i)).val
+#define PHASH(table, i) PACKED_ENT((table), (i)).hash
+#define PKEY_SET(table, i, v) (PKEY((table), (i)) = (v))
+#define PVAL_SET(table, i, v) (PVAL((table), (i)) = (v))
+#define PHASH_SET(table, i, v) (PHASH((table), (i)) = (v))
+
+/* this function depends much on packed layout, so that it placed here */
+static inline void
+remove_packed_entry(st_table *table, st_index_t i)
+{
+    table->real_entries--;
+    table->num_entries--;
+    if (i < table->real_entries) {
+	MEMMOVE(&PACKED_ENT(table, i), &PACKED_ENT(table, i+1),
+		st_packed_entry, table->real_entries - i);
+    }
+}
+
+static inline void
+remove_safe_packed_entry(st_table *table, st_index_t i, st_data_t never)
+{
+    table->num_entries--;
+    PKEY_SET(table, i, never);
+    PVAL_SET(table, i, never);
+    PHASH_SET(table, i, 0);
+}
+
+/* ultrapacking */
+#define real_upacked num_bins
+#define MAX_UPACKED_HASH 1
+#define ULTRAPACKED(table) ((table)->real_upacked <= 1)
+#define UPACKED_ENT(table) ((table)->as.upacked)
+#define UPKEY(table) UPACKED_ENT(table).key
+#define UPVAL(table) UPACKED_ENT(table).val
+#define UPHASH(table) UPACKED_ENT(table).hash
+#define UPKEY_SET(table, v) (UPACKED_ENT(table).key = (v))
+#define UPVAL_SET(table, v) (UPACKED_ENT(table).val = (v))
+#define UPHASH_SET(table, v) (UPACKED_ENT(table).hash = (v))
+static inline void
+remove_upacked_entry(st_table *table)
+{
+    table->real_upacked = table->num_entries = 0;
+}
+
+static inline void
+remove_safe_upacked_entry(st_table *table, st_data_t never)
+{
+    table->num_entries = 0;
+    UPKEY_SET(table, never);
+    UPVAL_SET(table, never);
+    UPHASH_SET(table, 0);
+}
 /*
  * MINSIZE is the minimum size of a dictionary.
  */
@@ -85,8 +203,8 @@ static void rehash(st_table *);
 Table of prime numbers 2^n+a, 2<=n<=30.
 */
 static const unsigned int primes[] = {
-	8 + 3,
-	16 + 3,
+	ST_DEFAULT_INIT_TABLE_SIZE,
+	ST_DEFAULT_SECOND_TABLE_SIZE,
 	32 + 5,
 	64 + 3,
 	128 + 3,
@@ -161,8 +279,6 @@ stat_col(void)
 }
 #endif
 
-#define MAX_PACKED_NUMHASH (ST_DEFAULT_INIT_TABLE_SIZE/2)
-
 st_table*
 st_init_table_with_size(const struct st_hash_type *type, st_index_t size)
 {
@@ -181,14 +297,19 @@ st_init_table_with_size(const struct st_hash_type *type, st_index_t size)
     }
 #endif
 
-    size = new_size(size);	/* round up to prime number */
 
-    tbl = alloc(st_table);
+    tbl = st_alloc_table();
     tbl->type = type;
     tbl->num_entries = 0;
-    tbl->entries_packed = type == &type_numhash && size/2 <= MAX_PACKED_NUMHASH;
+    tbl->entries_packed = size <= MAX_PACKED_HASH;
+    if (tbl->entries_packed) {
+	size = size <= MAX_UPACKED_HASH ? 0 : ST_DEFAULT_PACKED_TABLE_SIZE;
+    }
+    else {
+	size = new_size(size);	/* round up to prime number */
+    }
     tbl->num_bins = size;
-    tbl->bins = (st_table_entry **)Calloc(size, sizeof(st_table_entry*));
+    tbl->bins = size ? st_alloc_bins(size) : 0;
     tbl->head = 0;
     tbl->tail = 0;
 
@@ -243,17 +364,23 @@ st_clear(st_table *table)
     register st_table_entry *ptr, *next;
     st_index_t i;
 
+    if (ULTRAPACKED(table)) {
+	remove_upacked_entry(table);
+	return;
+    }
+
     if (table->entries_packed) {
         table->num_entries = 0;
+        table->real_entries = 0;
         return;
     }
 
-    for(i = 0; i < table->num_bins; i++) {
+    for (i = 0; i < table->num_bins; i++) {
 	ptr = table->bins[i];
 	table->bins[i] = 0;
 	while (ptr != 0) {
 	    next = ptr->next;
-	    free(ptr);
+	    st_free_entry(ptr);
 	    ptr = next;
 	}
     }
@@ -266,14 +393,19 @@ void
 st_free_table(st_table *table)
 {
     st_clear(table);
-    free(table->bins);
-    free(table);
+    if (!ULTRAPACKED(table)) {
+	st_free_bins(table->bins, table->num_bins);
+    }
+    st_dealloc_table(table);
 }
 
 size_t
 st_memsize(const st_table *table)
 {
-    if (table->entries_packed) {
+    if (ULTRAPACKED(table)) {
+	return sizeof(st_table);
+    }
+    else if (table->entries_packed) {
 	return table->num_bins * sizeof (void *) + sizeof(st_table);
     }
     else {
@@ -306,46 +438,77 @@ count_collision(const struct st_hash_type *type)
 #define FOUND_ENTRY
 #endif
 
-#define FIND_ENTRY(table, ptr, hash_val, bin_pos) do {\
-    (bin_pos) = (hash_val)%(table)->num_bins;\
-    (ptr) = (table)->bins[(bin_pos)];\
-    FOUND_ENTRY;\
-    if (PTR_NOT_EQUAL((table), (ptr), (hash_val), key)) {\
-	COLLISION;\
-	while (PTR_NOT_EQUAL((table), (ptr)->next, (hash_val), key)) {\
-	    (ptr) = (ptr)->next;\
-	}\
-	(ptr) = (ptr)->next;\
-    }\
-} while (0)
+#define FIND_ENTRY(table, ptr, hash_val, bin_pos) \
+    ((ptr) = find_entry((table), key, (hash_val), ((bin_pos) = (hash_val)%(table)->num_bins)))
+
+static st_table_entry *
+find_entry(st_table *table, st_data_t key, st_index_t hash_val, st_index_t bin_pos)
+{
+    register st_table_entry *ptr = table->bins[bin_pos];
+    FOUND_ENTRY;
+    if (PTR_NOT_EQUAL(table, ptr, hash_val, key)) {
+	COLLISION;
+	while (PTR_NOT_EQUAL(table, ptr->next, hash_val, key)) {
+	    ptr = ptr->next;
+	}
+	ptr = ptr->next;
+    }
+    return ptr;
+}
+
+static inline st_index_t
+find_packed_index(st_table *table, st_index_t hash_val, st_data_t key)
+{
+    st_index_t i = 0;
+    while (i < table->real_entries &&
+	   (PHASH(table, i) != hash_val || !EQUAL(table, key, PKEY(table, i)))) {
+	i++;
+    }
+    return i;
+}
+
+static inline int
+check_upacked(st_table *table, st_index_t hash_val, st_data_t key)
+{
+    return table->num_entries &&
+	UPHASH(table) == hash_val &&
+	EQUAL(table, key, UPKEY(table));
+}
 
 #define collision_check 0
 
 int
 st_lookup(st_table *table, register st_data_t key, st_data_t *value)
 {
-    st_index_t hash_val, bin_pos;
+    st_index_t hash_val;
     register st_table_entry *ptr;
 
+    hash_val = do_hash(key, table);
+
+    if (ULTRAPACKED(table)) {
+	if (check_upacked(table, hash_val, key)) {
+	    if (value != 0) *value = UPVAL(table);
+	    return 1;
+	}
+	return 0;
+    }
+
     if (table->entries_packed) {
-        st_index_t i;
-        for (i = 0; i < table->num_entries; i++) {
-            if ((st_data_t)table->bins[i*2] == key) {
-                if (value !=0) *value = (st_data_t)table->bins[i*2+1];
-                return 1;
-            }
-        }
+	st_index_t i = find_packed_index(table, hash_val, key);
+	if (i < table->real_entries) {
+	    if (value != 0) *value = PVAL(table, i);
+	    return 1;
+	}
         return 0;
     }
 
-    hash_val = do_hash(key, table);
-    FIND_ENTRY(table, ptr, hash_val, bin_pos);
+    ptr = find_entry(table, key, hash_val, hash_val % table->num_bins);
 
     if (ptr == 0) {
 	return 0;
     }
     else {
-	if (value != 0)  *value = ptr->record;
+	if (value != 0) *value = ptr->record;
 	return 1;
     }
 }
@@ -353,22 +516,29 @@ st_lookup(st_table *table, register st_data_t key, st_data_t *value)
 int
 st_get_key(st_table *table, register st_data_t key, st_data_t *result)
 {
-    st_index_t hash_val, bin_pos;
+    st_index_t hash_val;
     register st_table_entry *ptr;
 
+    hash_val = do_hash(key, table);
+
+    if (ULTRAPACKED(table)) {
+	if (check_upacked(table, hash_val, key)) {
+	    if (result != 0) *result = UPKEY(table);
+	    return 1;
+	}
+	return 0;
+    }
+
     if (table->entries_packed) {
-        st_index_t i;
-        for (i = 0; i < table->num_entries; i++) {
-            if ((st_data_t)table->bins[i*2] == key) {
-                if (result !=0) *result = (st_data_t)table->bins[i*2];
-                return 1;
-            }
-        }
+	st_index_t i = find_packed_index(table, hash_val, key);
+	if (i < table->real_entries) {
+	    if (result != 0) *result = PKEY(table, i);
+	    return 1;
+	}
         return 0;
     }
 
-    hash_val = do_hash(key, table);
-    FIND_ENTRY(table, ptr, hash_val, bin_pos);
+    ptr = find_entry(table, key, hash_val, hash_val % table->num_bins);
 
     if (ptr == 0) {
 	return 0;
@@ -382,85 +552,151 @@ st_get_key(st_table *table, register st_data_t key, st_data_t *result)
 #undef collision_check
 #define collision_check 1
 
-#define MORE_PACKABLE_P(table) \
-    ((st_index_t)((table)->num_entries+1) * 2 <= (table)->num_bins && \
-     (table)->num_entries+1 <= MAX_PACKED_NUMHASH)
-
-#define ADD_DIRECT(table, key, value, hash_val, bin_pos)\
-do {\
-    st_table_entry *entry;\
-    if ((table)->num_entries > ST_DEFAULT_MAX_DENSITY * (table)->num_bins) {\
-	rehash(table);\
-        (bin_pos) = (hash_val) % (table)->num_bins;\
-    }\
-    \
-    entry = alloc(st_table_entry);\
-    \
-    entry->hash = (hash_val);\
-    entry->key = (key);\
-    entry->record = (value);\
-    entry->next = (table)->bins[(bin_pos)];\
-    if ((table)->head != 0) {\
-	entry->fore = 0;\
-	(entry->back = (table)->tail)->fore = entry;\
-	(table)->tail = entry;\
-    }\
-    else {\
-	(table)->head = (table)->tail = entry;\
-	entry->fore = entry->back = 0;\
-    }\
-    (table)->bins[(bin_pos)] = entry;\
-    (table)->num_entries++;\
-} while (0)
+static inline st_table_entry *
+new_entry(st_table * table, st_data_t key, st_data_t value,
+	st_index_t hash_val, register st_index_t bin_pos)
+{
+    register st_table_entry *entry = st_alloc_entry();
+
+    entry->next = table->bins[bin_pos];
+    table->bins[bin_pos] = entry;
+    entry->hash = hash_val;
+    entry->key = key;
+    entry->record = value;
+
+    return entry;
+}
+
+static inline void
+add_direct(st_table *table, st_data_t key, st_data_t value,
+	   st_index_t hash_val, register st_index_t bin_pos)
+{
+    register st_table_entry *entry;
+    if (table->num_entries > ST_DEFAULT_MAX_DENSITY * table->num_bins) {
+	rehash(table);
+        bin_pos = hash_val % table->num_bins;
+    }
+
+    entry = new_entry(table, key, value, hash_val, bin_pos);
+
+    if (table->head != 0) {
+	entry->fore = 0;
+	(entry->back = table->tail)->fore = entry;
+	table->tail = entry;
+    }
+    else {
+	table->head = table->tail = entry;
+	entry->fore = entry->back = 0;
+    }
+    table->num_entries++;
+}
 
 static void
 unpack_entries(register st_table *table)
 {
     st_index_t i;
-    struct st_table_entry *packed_bins[MAX_PACKED_NUMHASH*2];
+    st_packed_entry packed_bins[MAX_PACKED_HASH];
+    register st_table_entry *entry, *preventry = 0, **chain;
     st_table tmp_table = *table;
 
-    memcpy(packed_bins, table->bins, sizeof(struct st_table_entry *) * table->num_entries*2);
-    table->bins = packed_bins;
+    MEMCPY(packed_bins, PACKED_BINS(table), st_packed_entry, MAX_PACKED_HASH);
+    table->as.packed.entries = packed_bins;
     tmp_table.entries_packed = 0;
-    tmp_table.num_entries = 0;
-    memset(tmp_table.bins, 0, sizeof(struct st_table_entry *) * tmp_table.num_bins);
-    for (i = 0; i < table->num_entries; i++) {
-        st_insert(&tmp_table, (st_data_t)packed_bins[i*2], (st_data_t)packed_bins[i*2+1]);
-    }
+#if ST_DEFAULT_INIT_TABLE_SIZE == ST_DEFAULT_PACKED_TABLE_SIZE
+    MEMZERO(tmp_table.bins, st_table_entry*, tmp_table.num_bins);
+#else
+    tmp_table.bins = st_realloc_bins(tmp_table.bins, ST_DEFAULT_INIT_TABLE_SIZE, tmp_table.num_bins);
+    tmp_table.num_bins = ST_DEFAULT_INIT_TABLE_SIZE;
+#endif
+    i = 0;
+    chain = &tmp_table.head;
+    do {
+	st_data_t key = packed_bins[i].key;
+	st_data_t val = packed_bins[i].val;
+	st_index_t hash = packed_bins[i].hash;
+	entry = new_entry(&tmp_table, key, val, hash,
+			  hash % ST_DEFAULT_INIT_TABLE_SIZE);
+	*chain = entry;
+	entry->back = preventry;
+	preventry = entry;
+	chain = &entry->fore;
+    } while (++i < MAX_PACKED_HASH);
+    *chain = NULL;
+    tmp_table.tail = entry;
     *table = tmp_table;
 }
 
+static void
+add_packed_direct(st_table *table, st_data_t key, st_data_t value, st_index_t hash_val)
+{
+    if (table->real_entries < MAX_PACKED_HASH) {
+	st_index_t i = table->real_entries++;
+	PKEY_SET(table, i, key);
+	PVAL_SET(table, i, value);
+	PHASH_SET(table, i, hash_val);
+	table->num_entries++;
+    }
+    else {
+	unpack_entries(table);
+	add_direct(table, key, value, hash_val, hash_val % table->num_bins);
+    }
+}
+
+static void
+add_upacked_direct(register st_table *table, register st_data_t key, st_data_t value, st_index_t hash_val)
+{
+    if (table->real_upacked) {
+	st_packed_entry *entries = (st_packed_entry *) st_alloc_bins(ST_DEFAULT_PACKED_TABLE_SIZE);
+	entries[0] = UPACKED_ENT(table);
+	entries[1].hash = hash_val;
+	entries[1].key = key;
+	entries[1].val = value;
+	table->num_bins = ST_DEFAULT_PACKED_TABLE_SIZE;
+	table->real_entries = 2;
+	table->num_entries++;
+	table->as.packed.entries = entries;
+    }
+    else {
+	table->real_upacked = 1;
+	table->num_entries = 1;
+	UPHASH_SET(table, hash_val);
+	UPKEY_SET(table, key);
+	UPVAL_SET(table, value);
+    }
+}
+
 int
 st_insert(register st_table *table, register st_data_t key, st_data_t value)
 {
-    st_index_t hash_val, bin_pos;
+    st_index_t hash_val;
+    register st_index_t bin_pos;
     register st_table_entry *ptr;
 
+    hash_val = do_hash(key, table);
+
+    if (ULTRAPACKED(table)) {
+	if (check_upacked(table, hash_val, key)) {
+	    UPVAL_SET(table, value);
+	    return 1;
+	}
+	add_upacked_direct(table, key, value, hash_val);
+	return 0;
+    }
+
     if (table->entries_packed) {
-        st_index_t i;
-        for (i = 0; i < table->num_entries; i++) {
-            if ((st_data_t)table->bins[i*2] == key) {
-                table->bins[i*2+1] = (struct st_table_entry*)value;
-                return 1;
-            }
-        }
-        if (MORE_PACKABLE_P(table)) {
-            i = table->num_entries++;
-            table->bins[i*2] = (struct st_table_entry*)key;
-            table->bins[i*2+1] = (struct st_table_entry*)value;
-            return 0;
-        }
-        else {
-            unpack_entries(table);
+	st_index_t i = find_packed_index(table, hash_val, key);
+	if (i < table->real_entries) {
+	    PVAL_SET(table, i, value);
+	    return 1;
         }
+	add_packed_direct(table, key, value, hash_val);
+	return 0;
     }
 
-    hash_val = do_hash(key, table);
     FIND_ENTRY(table, ptr, hash_val, bin_pos);
 
     if (ptr == 0) {
-	ADD_DIRECT(table, key, value, hash_val, bin_pos);
+	add_direct(table, key, value, hash_val, bin_pos);
 	return 0;
     }
     else {
@@ -473,34 +709,38 @@ int
 st_insert2(register st_table *table, register st_data_t key, st_data_t value,
 	   st_data_t (*func)(st_data_t))
 {
-    st_index_t hash_val, bin_pos;
+    st_index_t hash_val;
+    register st_index_t bin_pos;
     register st_table_entry *ptr;
 
+    hash_val = do_hash(key, table);
+
+    if (ULTRAPACKED(table)) {
+	if (check_upacked(table, hash_val, key)) {
+	    UPVAL_SET(table, value);
+	    return 1;
+	}
+	key = (*func)(key);
+	add_upacked_direct(table, key, value, hash_val);
+	return 0;
+    }
+
     if (table->entries_packed) {
-        st_index_t i;
-        for (i = 0; i < table->num_entries; i++) {
-            if ((st_data_t)table->bins[i*2] == key) {
-                table->bins[i*2+1] = (struct st_table_entry*)value;
-                return 1;
-            }
-        }
-        if (MORE_PACKABLE_P(table)) {
-            i = table->num_entries++;
-            table->bins[i*2] = (struct st_table_entry*)key;
-            table->bins[i*2+1] = (struct st_table_entry*)value;
-            return 0;
-        }
-        else {
-            unpack_entries(table);
-        }
+	st_index_t i = find_packed_index(table, hash_val, key);
+	if (i < table->real_entries) {
+	    PVAL_SET(table, i, value);
+	    return 1;
+	}
+	key = (*func)(key);
+	add_packed_direct(table, key, value, hash_val);
+	return 0;
     }
 
-    hash_val = do_hash(key, table);
     FIND_ENTRY(table, ptr, hash_val, bin_pos);
 
     if (ptr == 0) {
 	key = (*func)(key);
-	ADD_DIRECT(table, key, value, hash_val, bin_pos);
+	add_direct(table, key, value, hash_val, bin_pos);
 	return 0;
     }
     else {
@@ -512,36 +752,30 @@ st_insert2(register st_table *table, register st_data_t key, st_data_t value,
 void
 st_add_direct(st_table *table, st_data_t key, st_data_t value)
 {
-    st_index_t hash_val, bin_pos;
+    st_index_t hash_val;
+
+    hash_val = do_hash(key, table);
+    if (ULTRAPACKED(table)) {
+	add_upacked_direct(table, key, value, hash_val);
+	return;
+    }
 
     if (table->entries_packed) {
-        int i;
-        if (MORE_PACKABLE_P(table)) {
-            i = table->num_entries++;
-            table->bins[i*2] = (struct st_table_entry*)key;
-            table->bins[i*2+1] = (struct st_table_entry*)value;
-            return;
-        }
-        else {
-            unpack_entries(table);
-        }
+	add_packed_direct(table, key, value, hash_val);
+	return;
     }
 
-    hash_val = do_hash(key, table);
-    bin_pos = hash_val % table->num_bins;
-    ADD_DIRECT(table, key, value, hash_val, bin_pos);
+    add_direct(table, key, value, hash_val, hash_val % table->num_bins);
 }
 
 static void
 rehash(register st_table *table)
 {
     register st_table_entry *ptr, **new_bins;
-    st_index_t i, new_num_bins, hash_val;
+    st_index_t new_num_bins, hash_val;
 
     new_num_bins = new_size(table->num_bins+1);
-    new_bins = (st_table_entry**)
-	xrealloc(table->bins, new_num_bins * sizeof(st_table_entry*));
-    for (i = 0; i < new_num_bins; ++i) new_bins[i] = 0;
+    new_bins = st_realloc_bins(table->bins, new_num_bins, table->num_bins);
     table->num_bins = new_num_bins;
     table->bins = new_bins;
 
@@ -558,34 +792,37 @@ st_table*
 st_copy(st_table *old_table)
 {
     st_table *new_table;
-    st_table_entry *ptr, *entry, *prev, **tail;
+    st_table_entry *ptr, *entry, *prev, **tailp;
     st_index_t num_bins = old_table->num_bins;
     st_index_t hash_val;
 
-    new_table = alloc(st_table);
+    new_table = st_alloc_table();
     if (new_table == 0) {
 	return 0;
     }
 
     *new_table = *old_table;
-    new_table->bins = (st_table_entry**)
-	Calloc((unsigned)num_bins, sizeof(st_table_entry*));
+    if (ULTRAPACKED(old_table)) {
+	return new_table;
+    }
+
+    new_table->bins = st_alloc_bins(num_bins);
 
     if (new_table->bins == 0) {
-	free(new_table);
+	st_dealloc_table(new_table);
 	return 0;
     }
 
     if (old_table->entries_packed) {
-        memcpy(new_table->bins, old_table->bins, sizeof(struct st_table_entry *) * old_table->num_bins);
+        MEMCPY(new_table->bins, old_table->bins, st_table_entry*, old_table->num_bins);
         return new_table;
     }
 
     if ((ptr = old_table->head) != 0) {
 	prev = 0;
-	tail = &new_table->head;
+	tailp = &new_table->head;
 	do {
-	    entry = alloc(st_table_entry);
+	    entry = st_alloc_entry();
 	    if (entry == 0) {
 		st_free_table(new_table);
 		return 0;
@@ -595,8 +832,8 @@ st_copy(st_table *old_table)
 	    entry->next = new_table->bins[hash_val];
 	    new_table->bins[hash_val] = entry;
 	    entry->back = prev;
-	    *tail = prev = entry;
-	    tail = &entry->fore;
+	    *tailp = prev = entry;
+	    tailp = &entry->fore;
 	} while ((ptr = ptr->fore) != 0);
 	new_table->tail = prev;
     }
@@ -604,21 +841,22 @@ st_copy(st_table *old_table)
     return new_table;
 }
 
-#define REMOVE_ENTRY(table, ptr) do					\
-    {									\
-	if ((ptr)->fore == 0 && (ptr)->back == 0) {			\
-	    (table)->head = 0;						\
-	    (table)->tail = 0;						\
-	}								\
-	else {								\
-	    st_table_entry *fore = (ptr)->fore, *back = (ptr)->back;	\
-	    if (fore) fore->back = back;				\
-	    if (back) back->fore = fore;				\
-	    if ((ptr) == (table)->head) (table)->head = fore;		\
-	    if ((ptr) == (table)->tail) (table)->tail = back;		\
-	}								\
-	(table)->num_entries--;						\
-    } while (0)
+static inline void
+remove_entry(st_table *table, st_table_entry *ptr)
+{
+    if (ptr->fore == 0 && ptr->back == 0) {
+	table->head = 0;
+	table->tail = 0;
+    }
+    else {
+	st_table_entry *fore = ptr->fore, *back = ptr->back;
+	if (fore) fore->back = back;
+	if (back) back->fore = fore;
+	if (ptr == table->head) table->head = fore;
+	if (ptr == table->tail) table->tail = back;
+    }
+    table->num_entries--;
+}
 
 int
 st_delete(register st_table *table, register st_data_t *key, st_data_t *value)
@@ -627,30 +865,38 @@ st_delete(register st_table *table, register st_data_t *key, st_data_t *value)
     st_table_entry **prev;
     register st_table_entry *ptr;
 
+    hash_val = do_hash(*key, table);
+
+    if (ULTRAPACKED(table)) {
+	if (check_upacked(table, hash_val, *key)) {
+	    if (value != 0) *value = UPVAL(table);
+	    *key = UPKEY(table);
+	    remove_upacked_entry(table);
+	    return 1;
+	}
+	return 0;
+    }
+
     if (table->entries_packed) {
-        st_index_t i;
-        for (i = 0; i < table->num_entries; i++) {
-            if ((st_data_t)table->bins[i*2] == *key) {
-                if (value != 0) *value = (st_data_t)table->bins[i*2+1];
-                table->num_entries--;
-                memmove(&table->bins[i*2], &table->bins[(i+1)*2],
-                        sizeof(struct st_table_entry*) * 2*(table->num_entries-i));
-                return 1;
-            }
+	st_index_t i = find_packed_index(table, hash_val, *key);
+	if (i < table->real_entries) {
+	    if (value != 0) *value = PVAL(table, i);
+	    *key = PKEY(table, i);
+	    remove_packed_entry(table, i);
+	    return 1;
         }
         if (value != 0) *value = 0;
         return 0;
     }
 
-    hash_val = do_hash_bin(*key, table);
-
-    for (prev = &table->bins[hash_val]; (ptr = *prev) != 0; prev = &ptr->next) {
+    prev = &table->bins[hash_val % table->num_bins];
+    for (;(ptr = *prev) != 0; prev = &ptr->next) {
 	if (EQUAL(table, *key, ptr->key)) {
 	    *prev = ptr->next;
-	    REMOVE_ENTRY(table, ptr);
+	    remove_entry(table, ptr);
 	    if (value != 0) *value = ptr->record;
 	    *key = ptr->key;
-	    free(ptr);
+	    st_free_entry(ptr);
 	    return 1;
 	}
     }
@@ -665,25 +911,36 @@ st_delete_safe(register st_table *table, register st_data_t *key, st_data_t *val
     st_index_t hash_val;
     register st_table_entry *ptr;
 
+    hash_val = do_hash(*key, table);
+
+    if (ULTRAPACKED(table)) {
+	if (check_upacked(table, hash_val, *key)) {
+	    if (value != 0) *value = UPVAL(table);
+	    *key = UPKEY(table);
+	    remove_safe_upacked_entry(table, never);
+	    return 1;
+	}
+	if (value != 0) *value = 0;
+	return 0;
+    }
+
     if (table->entries_packed) {
-	st_index_t i;
-	for (i = 0; i < table->num_entries; i++) {
-	    if ((st_data_t)table->bins[i*2] == *key) {
-		if (value != 0) *value = (st_data_t)table->bins[i*2+1];
-		table->bins[i*2] = (void *)never;
-		return 1;
-	    }
+	st_index_t i = find_packed_index(table, hash_val, *key);
+	if (i < table->real_entries) {
+	    if (value != 0) *value = PVAL(table, i);
+	    *key = PKEY(table, i);
+	    remove_safe_packed_entry(table, i, never);
+	    return 1;
 	}
 	if (value != 0) *value = 0;
 	return 0;
     }
 
-    hash_val = do_hash_bin(*key, table);
-    ptr = table->bins[hash_val];
+    ptr = table->bins[hash_val % table->num_bins];
 
     for (; ptr != 0; ptr = ptr->next) {
 	if ((ptr->key != never) && EQUAL(table, ptr->key, *key)) {
-	    REMOVE_ENTRY(table, ptr);
+	    remove_entry(table, ptr);
 	    *key = ptr->key;
 	    if (value != 0) *value = ptr->record;
 	    ptr->key = ptr->record = never;
@@ -701,17 +958,23 @@ st_cleanup_safe(st_table *table, st_data_t never)
     st_table_entry *ptr, **last, *tmp;
     st_index_t i;
 
+    if (ULTRAPACKED(table)) {
+	table->real_upacked = table->num_entries;
+	return;
+    }
+
     if (table->entries_packed) {
 	st_index_t i = 0, j = 0;
-	while ((st_data_t)table->bins[i*2] != never) {
-	    if (i++ == table->num_entries) return;
+	while (PKEY(table, i) != never) {
+	    if (i++ == table->real_entries) return;
 	}
-	for (j = i; ++i < table->num_entries;) {
-	    if ((st_data_t)table->bins[i*2] == never) continue;
-	    table->bins[j*2] = table->bins[i*2];
-	    table->bins[j*2+1] = table->bins[i*2+1];
+	for (j = i; ++i < table->real_entries;) {
+	    if (PKEY(table, i) == never) continue;
+	    PACKED_ENT(table, j) = PACKED_ENT(table, i);
 	    j++;
 	}
+	table->real_entries = j;
+	/* table->num_entries really should be equal j at this moment, but let set it anyway */
 	table->num_entries = j;
 	return;
     }
@@ -722,7 +985,7 @@ st_cleanup_safe(st_table *table, st_data_t never)
 	    if (ptr->key == never) {
 		tmp = ptr;
 		*last = ptr = ptr->next;
-		free(tmp);
+		st_free_entry(tmp);
 	    }
 	    else {
 		ptr = *(last = &ptr->next);
@@ -732,50 +995,78 @@ st_cleanup_safe(st_table *table, st_data_t never)
 }
 
 int
-st_foreach(st_table *table, int (*func)(ANYARGS), st_data_t arg)
+st_foreach_check(st_table *table, int (*func)(ANYARGS), st_data_t arg, st_data_t never)
 {
     st_table_entry *ptr, **last, *tmp;
     enum st_retval retval;
-    st_index_t i;
+    st_data_t key, val;
+    st_index_t hash, i = 0;
+
+    if (table->num_entries == 0) {
+	return 0;
+    }
+
+    if (ULTRAPACKED(table)) {
+	key = UPKEY(table);
+	val = UPVAL(table);
+	hash = UPHASH(table);
+	if (key == never) return 0;
+	retval = (*func)(key, val, arg);
+	if (!ULTRAPACKED(table)) {
+	    goto packed;
+	}
+	switch(retval) {
+	  case ST_CHECK:
+	    if (UPHASH(table) == 0 && UPKEY(table) == never)
+		break;
+	    if (check_upacked(table, hash, key))
+		break;
+	    goto deleted;
+	  case ST_DELETE:
+	    remove_safe_upacked_entry(table, never);
+	  case ST_CONTINUE:
+	  case ST_STOP:
+	    break;
+	}
+	return 0;
+    }
 
     if (table->entries_packed) {
-        for (i = 0; i < table->num_entries; i++) {
-            st_index_t j;
-            st_data_t key, val;
-            key = (st_data_t)table->bins[i*2];
-            val = (st_data_t)table->bins[i*2+1];
-            retval = (*func)(key, val, arg);
+	for (i = 0; i < table->real_entries; i++) {
+	    key = PKEY(table, i);
+	    val = PVAL(table, i);
+	    hash = PHASH(table, i);
+	    if (key == never) continue;
+	    retval = (*func)(key, val, arg);
+	  packed:
 	    if (!table->entries_packed) {
-		FIND_ENTRY(table, ptr, key, i);
+		FIND_ENTRY(table, ptr, hash, i);
 		if (retval == ST_CHECK) {
 		    if (!ptr) goto deleted;
 		    goto unpacked_continue;
 		}
 		goto unpacked;
 	    }
-            switch (retval) {
+	    switch (retval) {
 	      case ST_CHECK:	/* check if hash is modified during iteration */
-                for (j = 0; j < table->num_entries; j++) {
-                    if ((st_data_t)table->bins[j*2] == key)
-                        break;
-                }
-                if (j == table->num_entries) {
+		if (PHASH(table, i) == 0 && PKEY(table, i) == never) {
+		    break;
+		}
+		i = find_packed_index(table, hash, key);
+		if (i == table->real_entries) {
 		    goto deleted;
-                }
+		}
 		/* fall through */
 	      case ST_CONTINUE:
 		break;
 	      case ST_STOP:
 		return 0;
 	      case ST_DELETE:
-                table->num_entries--;
-                memmove(&table->bins[i*2], &table->bins[(i+1)*2],
-                        sizeof(struct st_table_entry*) * 2*(table->num_entries-i));
-                i--;
-                break;
-            }
-        }
-        return 0;
+		remove_safe_packed_entry(table, i, never);
+		break;
+	    }
+	}
+	return 0;
     }
     else {
 	ptr = table->head;
@@ -783,6 +1074,8 @@ st_foreach(st_table *table, int (*func)(ANYARGS), st_data_t arg)
 
     if (ptr != 0) {
 	do {
+	    if (ptr->key == never)
+		goto unpacked_continue;
 	    i = ptr->hash % table->num_bins;
 	    retval = (*func)(ptr->key, ptr->record, arg);
 	  unpacked:
@@ -808,10 +1101,100 @@ st_foreach(st_table *table, int (*func)(ANYARGS), st_data_t arg)
 		for (; (tmp = *last) != 0; last = &tmp->next) {
 		    if (ptr == tmp) {
 			tmp = ptr->fore;
+			remove_entry(table, ptr);
+			ptr->key = ptr->record = never;
+			ptr->hash = 0;
+			ptr = tmp;
+			break;
+		    }
+		}
+	    }
+	} while (ptr && table->head);
+    }
+    return 0;
+}
+
+int
+st_foreach(st_table *table, int (*func)(ANYARGS), st_data_t arg)
+{
+    st_table_entry *ptr, **last, *tmp;
+    enum st_retval retval;
+    st_data_t key, val;
+    st_index_t hash, i = 0;
+
+    if (table->num_entries == 0) {
+	return 0;
+    }
+
+    if (ULTRAPACKED(table)) {
+	key = UPKEY(table);
+	val = UPVAL(table);
+	hash = UPHASH(table);
+	retval = (*func)(key, val, arg);
+	if (!ULTRAPACKED(table)) {
+	    goto packed;
+	}
+	switch (retval) {
+	  case ST_DELETE:
+	    remove_upacked_entry(table);
+	  case ST_CONTINUE:
+	  case ST_CHECK:
+	  case ST_STOP:
+	    break;
+	}
+	return 0;
+    }
+
+    if (table->entries_packed) {
+	for (i = 0; i < table->real_entries; i++) {
+	    key = PKEY(table, i);
+	    val = PVAL(table, i);
+	    hash = PHASH(table, i);
+	    retval = (*func)(key, val, arg);
+	  packed:
+	    if (!table->entries_packed) {
+		FIND_ENTRY(table, ptr, hash, i);
+		if (!ptr) return 0;
+		goto unpacked;
+	    }
+	    switch (retval) {
+	      case ST_CONTINUE:
+		break;
+	      case ST_CHECK:
+	      case ST_STOP:
+		return 0;
+	      case ST_DELETE:
+		remove_packed_entry(table, i);
+		i--;
+		break;
+	    }
+	}
+	return 0;
+    }
+    else {
+	ptr = table->head;
+    }
+
+    if (ptr != 0) {
+	do {
+	    i = ptr->hash % table->num_bins;
+	    retval = (*func)(ptr->key, ptr->record, arg);
+	  unpacked:
+	    switch (retval) {
+	      case ST_CONTINUE:
+		ptr = ptr->fore;
+		break;
+	      case ST_CHECK:
+	      case ST_STOP:
+		return 0;
+	      case ST_DELETE:
+		last = &table->bins[ptr->hash % table->num_bins];
+		for (; (tmp = *last) != 0; last = &tmp->next) {
+		    if (ptr == tmp) {
+			tmp = ptr->fore;
 			*last = ptr->next;
-			REMOVE_ENTRY(table, ptr);
-			free(ptr);
-			if (ptr == tmp) return 0;
+			remove_entry(table, ptr);
+			st_free_entry(ptr);
 			ptr = tmp;
 			break;
 		    }
@@ -834,13 +1217,13 @@ st_reverse_foreach(st_table *table, int (*func)(ANYARGS), st_data_t arg)
         for (i = table->num_entries-1; 0 <= i; i--) {
             int j;
             st_data_t key, val;
-            key = (st_data_t)table->bins[i*2];
-            val = (st_data_t)table->bins[i*2+1];
+            key = PKEY(table, i);
+            val = PVAL(table, i);
             retval = (*func)(key, val, arg);
             switch (retval) {
 	      case ST_CHECK:	/* check if hash is modified during iteration */
                 for (j = 0; j < table->num_entries; j++) {
-                    if ((st_data_t)table->bins[j*2] == key)
+                    if (PKEY(table, j) == key)
                         break;
                 }
                 if (j == table->num_entries) {
@@ -854,9 +1237,7 @@ st_reverse_foreach(st_table *table, int (*func)(ANYARGS), st_data_t arg)
 	      case ST_STOP:
 		return 0;
 	      case ST_DELETE:
-                table->num_entries--;
-                memmove(&table->bins[i*2], &table->bins[(i+1)*2],
-                        sizeof(struct st_table_entry*) * 2*(table->num_entries-i));
+		remove_packed_entry(table, i);
                 break;
             }
         }
@@ -889,8 +1270,8 @@ st_reverse_foreach(st_table *table, int (*func)(ANYARGS), st_data_t arg)
 		    if (ptr == tmp) {
 			tmp = ptr->back;
 			*last = ptr->next;
-			REMOVE_ENTRY(table, ptr);
-			free(ptr);
+			remove_entry(table, ptr);
+			st_free_entry(ptr);
 			ptr = tmp;
 			break;
 		    }
diff --git a/variable.c b/variable.c
index 3da500e..303bb27 100644
--- a/variable.c
+++ b/variable.c
@@ -473,7 +473,7 @@ void
 rb_gc_mark_global_tbl(void)
 {
     if (rb_global_tbl)
-        st_foreach_safe(rb_global_tbl, mark_global_entry, 0);
+        st_foreach(rb_global_tbl, mark_global_entry, 0);
 }
 
 static ID
@@ -765,7 +765,7 @@ rb_f_global_variables(void)
     char buf[2];
     int i;
 
-    st_foreach_safe(rb_global_tbl, gvar_i, ary);
+    st_foreach(rb_global_tbl, gvar_i, ary);
     buf[0] = '$';
     for (i = 1; i <= 9; ++i) {
 	buf[1] = (char)(i + '0');
@@ -923,7 +923,7 @@ static int
 givar_i(VALUE obj, st_table *tbl)
 {
     if (rb_special_const_p(obj)) {
-	st_foreach_safe(tbl, givar_mark_i, 0);
+	st_foreach(tbl, givar_mark_i, 0);
     }
     return ST_CONTINUE;
 }
@@ -933,7 +933,7 @@ rb_mark_generic_ivar_tbl(void)
 {
     if (!generic_iv_tbl) return;
     if (special_generic_ivar == 0) return;
-    st_foreach_safe(generic_iv_tbl, givar_i, 0);
+    st_foreach(generic_iv_tbl, givar_i, 0);
 }
 
 void
@@ -1170,7 +1170,7 @@ obj_ivar_each(VALUE obj, int (*func)(ANYARGS), st_data_t arg)
     data.func = (int (*)(ID key, VALUE val, st_data_t arg))func;
     data.arg = arg;
 
-    st_foreach_safe(tbl, obj_ivar_i, (st_data_t)&data);
+    st_foreach(tbl, obj_ivar_i, (st_data_t)&data);
 }
 
 void
@@ -1730,7 +1730,7 @@ rb_mod_const_at(VALUE mod, void *data)
 	tbl = st_init_numtable();
     }
     if (RCLASS_CONST_TBL(mod)) {
-	st_foreach_safe(RCLASS_CONST_TBL(mod), sv_i, (st_data_t)tbl);
+	st_foreach(RCLASS_CONST_TBL(mod), sv_i, (st_data_t)tbl);
     }
     return tbl;
 }
@@ -1765,7 +1765,7 @@ rb_const_list(void *data)
 
     if (!tbl) return rb_ary_new2(0);
     ary = rb_ary_new2(tbl->num_entries);
-    st_foreach_safe(tbl, list_i, ary);
+    st_foreach(tbl, list_i, ary);
     st_free_table(tbl);
 
     return ary;
diff --git a/vm.c b/vm.c
index e997afa..064a4f8 100644
--- a/vm.c
+++ b/vm.c
@@ -1575,6 +1575,7 @@ rb_vm_mark(void *ptr)
 	RUBY_MARK_UNLESS_NULL(vm->thgroup_default);
 	RUBY_MARK_UNLESS_NULL(vm->mark_object_ary);
 	RUBY_MARK_UNLESS_NULL(vm->load_path);
+	RUBY_MARK_UNLESS_NULL(vm->load_path_expanded_cache);
 	RUBY_MARK_UNLESS_NULL(vm->loaded_features);
 	RUBY_MARK_UNLESS_NULL(vm->top_self);
 	RUBY_MARK_UNLESS_NULL(vm->coverages);
@@ -1606,16 +1607,17 @@ ruby_vm_destruct(rb_vm_t *vm)
 #if defined(ENABLE_VM_OBJSPACE) && ENABLE_VM_OBJSPACE
 	struct rb_objspace *objspace = vm->objspace;
 #endif
+	if (vm->living_threads) {
+	    st_table *living_threads = vm->living_threads;
+	    vm->living_threads = 0;
+	    st_free_table(living_threads);
+	}
 	rb_gc_force_recycle(vm->self);
 	vm->main_thread = 0;
 	if (th) {
 	    rb_fiber_reset_root_local_storage(th->self);
 	    thread_free(th);
 	}
-	if (vm->living_threads) {
-	    st_free_table(vm->living_threads);
-	    vm->living_threads = 0;
-	}
 #if defined(ENABLE_VM_OBJSPACE) && ENABLE_VM_OBJSPACE
 	if (objspace) {
 	    rb_objspace_free(objspace);
diff --git a/vm_core.h b/vm_core.h
index 7211005..e787d4b 100644
--- a/vm_core.h
+++ b/vm_core.h
@@ -298,6 +298,7 @@ typedef struct rb_vm_struct {
     /* load */
     VALUE top_self;
     VALUE load_path;
+    VALUE load_path_expanded_cache;
     VALUE loaded_features;
     struct st_table *loading_table;
 
patches/ruby/1.9.3/p327/falcon-gc.diff000066400000636661147511530510013030 0ustar00diff --git a/array.c b/array.c
index e427cb3..7e76227 100644
--- a/array.c
+++ b/array.c
@@ -255,15 +255,24 @@ rb_ary_modify(VALUE ary)
     rb_ary_modify_check(ary);
     if (ARY_SHARED_P(ary)) {
         long len = RARRAY_LEN(ary);
+	VALUE shared = ARY_SHARED(ary);
         if (len <= RARRAY_EMBED_LEN_MAX) {
             VALUE *ptr = ARY_HEAP_PTR(ary);
-            VALUE shared = ARY_SHARED(ary);
             FL_UNSET_SHARED(ary);
             FL_SET_EMBED(ary);
             MEMCPY(ARY_EMBED_PTR(ary), ptr, VALUE, len);
             rb_ary_decrement_share(shared);
             ARY_SET_EMBED_LEN(ary, len);
         }
+	else if (ARY_SHARED_NUM(shared) == 1 && len > RARRAY_LEN(shared)>>1) {
+	    long shift = RARRAY_PTR(ary) - RARRAY_PTR(shared);
+	    ARY_SET_PTR(ary, RARRAY_PTR(shared));
+	    ARY_SET_CAPA(ary, RARRAY_LEN(shared));
+	    MEMMOVE(RARRAY_PTR(ary), RARRAY_PTR(ary)+shift, VALUE, len);
+	    FL_UNSET_SHARED(ary);
+            FL_SET_EMBED(shared);
+	    rb_ary_decrement_share(shared);
+	}
         else {
             VALUE *ptr = ALLOC_N(VALUE, len);
             MEMCPY(ptr, RARRAY_PTR(ary), VALUE, len);
@@ -274,6 +283,38 @@ rb_ary_modify(VALUE ary)
     }
 }
 
+static void
+ary_ensure_room_for_push(VALUE ary, long add_len)
+{
+    long new_len = RARRAY_LEN(ary) + add_len;
+    long capa;
+
+    if (ARY_SHARED_P(ary)) {
+        if (new_len > RARRAY_EMBED_LEN_MAX) {
+            VALUE shared = ARY_SHARED(ary);
+            if (ARY_SHARED_NUM(shared) == 1) {
+		if (RARRAY_PTR(ary) - RARRAY_PTR(shared) + new_len <= RARRAY_LEN(shared)) {
+		    rb_ary_modify_check(ary);
+		}
+		else {
+		    /* if array is shared, than it is likely it participate in push/shift pattern */
+		    rb_ary_modify(ary);
+		    capa = ARY_CAPA(ary);
+		    if (new_len > capa - (capa >> 6)) {
+			ary_double_capa(ary, new_len);
+		    }
+		}
+		return;
+            }
+        }
+    }
+    rb_ary_modify(ary);
+    capa = ARY_CAPA(ary);
+    if (new_len > capa) {
+	ary_double_capa(ary, new_len);
+    }
+}
+
 VALUE
 rb_ary_freeze(VALUE ary)
 {
@@ -295,6 +336,33 @@ rb_ary_frozen_p(VALUE ary)
     return Qfalse;
 }
 
+/* This can be used to take a snapshot of an array (with
+   e.g. rb_ary_replace) and check later whether the array has been
+   modified from the snapshot.  The snapshot is cheap, though if
+   something does modify the array it will pay the cost of copying
+   it. */
+VALUE
+rb_ary_dup_of_p(VALUE ary1, VALUE ary2)
+{
+    VALUE *p1, *p2;
+    long len = RARRAY_LEN(ary1);
+
+    if (len != RARRAY_LEN(ary2)) return Qfalse;
+
+    p1 = RARRAY_PTR(ary1);
+    p2 = RARRAY_PTR(ary2);
+
+    if (ARY_EMBED_P(ary1) && ARY_EMBED_P(ary2)) {
+        for (; len; len--, p1++, p2++) {
+            if (*p1 != *p2) return Qfalse;
+        }
+        return Qtrue;
+    }
+
+    if (p1 == p2) return Qtrue;
+    return Qfalse;
+}
+
 static VALUE
 ary_alloc(VALUE klass)
 {
@@ -430,8 +498,9 @@ ary_make_shared(VALUE ary)
 	OBJSETUP(shared, 0, T_ARRAY);
         FL_UNSET_EMBED(shared);
 
-        ARY_SET_LEN((VALUE)shared, RARRAY_LEN(ary));
+        ARY_SET_LEN((VALUE)shared, ARY_CAPA(ary));
         ARY_SET_PTR((VALUE)shared, RARRAY_PTR(ary));
+	rb_mem_clear(RARRAY_PTR(shared) + RARRAY_LEN(ary), ARY_CAPA(ary) - RARRAY_LEN(ary));
 	FL_SET_SHARED_ROOT(shared);
 	ARY_SET_SHARED_NUM((VALUE)shared, 1);
 	FL_SET_SHARED(ary);
@@ -721,8 +790,6 @@ ary_take_first_or_last(int argc, VALUE *argv, VALUE ary, enum ary_take_pos_flags
     return ary_make_partial(ary, rb_cArray, offset, n);
 }
 
-static VALUE rb_ary_push_1(VALUE ary, VALUE item);
-
 /*
  *  call-seq:
  *     ary << obj            -> ary
@@ -739,8 +806,12 @@ static VALUE rb_ary_push_1(VALUE ary, VALUE item);
 VALUE
 rb_ary_push(VALUE ary, VALUE item)
 {
-    rb_ary_modify(ary);
-    return rb_ary_push_1(ary, item);
+    long idx = RARRAY_LEN(ary);
+
+    ary_ensure_room_for_push(ary, 1);
+    RARRAY_PTR(ary)[idx] = item;
+    ARY_SET_LEN(ary, idx + 1);
+    return ary;
 }
 
 static VALUE
@@ -756,6 +827,18 @@ rb_ary_push_1(VALUE ary, VALUE item)
     return ary;
 }
 
+static VALUE
+rb_ary_cat(VALUE ary, const VALUE *ptr, long len)
+{
+    long oldlen = RARRAY_LEN(ary);
+
+    ary_ensure_room_for_push(ary, len);
+copy:
+    MEMCPY(RARRAY_PTR(ary) + oldlen, ptr, VALUE, len);
+    ARY_SET_LEN(ary, oldlen + len);
+    return ary;
+}
+
 /*
  *  call-seq:
  *     ary.push(obj, ... )   -> ary
@@ -772,11 +855,7 @@ rb_ary_push_1(VALUE ary, VALUE item)
 static VALUE
 rb_ary_push_m(int argc, VALUE *argv, VALUE ary)
 {
-    rb_ary_modify(ary);
-    while (argc--) {
-	rb_ary_push_1(ary, *argv++);
-    }
-    return ary;
+    return rb_ary_cat(ary, argv, argc);
 }
 
 VALUE
@@ -904,6 +983,55 @@ rb_ary_shift_m(int argc, VALUE *argv, VALUE ary)
     return result;
 }
 
+static void
+ary_ensure_room_for_unshift(VALUE ary, int argc)
+{
+    long len = RARRAY_LEN(ary);
+    long new_len = len + argc;
+    long capa;
+    VALUE *head, *sharedp;
+
+    if (ARY_SHARED_P(ary)) {
+	VALUE shared = ARY_SHARED(ary);
+	capa = RARRAY_LEN(shared);
+	if (ARY_SHARED_NUM(shared) == 1 && capa > new_len) {
+	    head = RARRAY_PTR(ary);
+	    sharedp = RARRAY_PTR(shared);
+	    goto makeroom_if_need;
+	}
+    }
+
+    rb_ary_modify(ary);
+    capa = ARY_CAPA(ary);
+    if (capa - (capa >> 6) <= new_len) {
+	ary_double_capa(ary, new_len);
+    }
+
+    /* use shared array for big "queues" */
+    if (new_len > ARY_DEFAULT_SIZE * 4) {
+	/* make a room for unshifted items */
+	capa = ARY_CAPA(ary);
+	ary_make_shared(ary);
+
+	head = sharedp = RARRAY_PTR(ary);
+	goto makeroom;
+makeroom_if_need:
+	if (head - sharedp < argc) {
+	    long room;
+makeroom:
+	    room = capa - new_len;
+	    room -= room >> 4;
+	    MEMMOVE(sharedp + argc + room, head, VALUE, len);
+	    head = sharedp + argc + room;
+	}
+	ARY_SET_PTR(ary, head - argc);
+    }
+    else {
+	/* sliding items */
+	MEMMOVE(RARRAY_PTR(ary) + argc, RARRAY_PTR(ary), VALUE, len);
+    }
+}
+
 /*
  *  call-seq:
  *     ary.unshift(obj, ...)  -> ary
@@ -919,19 +1047,16 @@ rb_ary_shift_m(int argc, VALUE *argv, VALUE ary)
 static VALUE
 rb_ary_unshift_m(int argc, VALUE *argv, VALUE ary)
 {
-    long len;
+    long len = RARRAY_LEN(ary);
 
-    rb_ary_modify(ary);
-    if (argc == 0) return ary;
-    if (ARY_CAPA(ary) <= (len = RARRAY_LEN(ary)) + argc) {
-	ary_double_capa(ary, len + argc);
+    if (argc == 0) {
+	rb_ary_modify_check(ary);
+	return ary;
     }
 
-    /* sliding items */
-    MEMMOVE(RARRAY_PTR(ary) + argc, RARRAY_PTR(ary), VALUE, len);
+    ary_ensure_room_for_unshift(ary, argc);
     MEMCPY(RARRAY_PTR(ary), argv, VALUE, argc);
-    ARY_INCREASE_LEN(ary, argc);
-
+    ARY_SET_LEN(ary, len + argc);
     return ary;
 }
 
@@ -1293,15 +1418,12 @@ rb_ary_splice(VALUE ary, long beg, long len, VALUE rpl)
 	rpl = rb_ary_to_ary(rpl);
 	rlen = RARRAY_LEN(rpl);
     }
-    rb_ary_modify(ary);
     if (beg >= RARRAY_LEN(ary)) {
 	if (beg > ARY_MAX_SIZE - rlen) {
 	    rb_raise(rb_eIndexError, "index %ld too big", beg);
 	}
+	ary_ensure_room_for_push(ary, rlen-len); /* len is 0 or negative */
 	len = beg + rlen;
-	if (len >= ARY_CAPA(ary)) {
-	    ary_double_capa(ary, len);
-	}
 	rb_mem_clear(RARRAY_PTR(ary) + RARRAY_LEN(ary), beg - RARRAY_LEN(ary));
 	if (rlen > 0) {
 	    MEMCPY(RARRAY_PTR(ary) + beg, RARRAY_PTR(rpl), VALUE, rlen);
@@ -1311,6 +1433,7 @@ rb_ary_splice(VALUE ary, long beg, long len, VALUE rpl)
     else {
 	long alen;
 
+	rb_ary_modify(ary);
 	alen = RARRAY_LEN(ary) + rlen - len;
 	if (alen >= ARY_CAPA(ary)) {
 	    ary_double_capa(ary, alen);
@@ -2100,12 +2223,13 @@ rb_ary_sort_bang(VALUE ary)
     if (RARRAY_LEN(ary) > 1) {
 	VALUE tmp = ary_make_substitution(ary); /* only ary refers tmp */
 	struct ary_sort_data data;
+	long len = RARRAY_LEN(ary);
 
 	RBASIC(tmp)->klass = 0;
 	data.ary = tmp;
 	data.opt_methods = 0;
 	data.opt_inited = 0;
-	ruby_qsort(RARRAY_PTR(tmp), RARRAY_LEN(tmp), sizeof(VALUE),
+	ruby_qsort(RARRAY_PTR(tmp), len, sizeof(VALUE),
 		   rb_block_given_p()?sort_1:sort_2, &data);
 
         if (ARY_EMBED_P(tmp)) {
@@ -2122,7 +2246,7 @@ rb_ary_sort_bang(VALUE ary)
             if (ARY_HEAP_PTR(ary) == ARY_HEAP_PTR(tmp)) {
                 assert(!ARY_EMBED_P(ary));
                 FL_UNSET_SHARED(ary);
-                ARY_SET_CAPA(ary, ARY_CAPA(tmp));
+                ARY_SET_CAPA(ary, RARRAY_LEN(tmp));
             }
             else {
                 assert(!ARY_SHARED_P(tmp));
@@ -2137,8 +2261,8 @@ rb_ary_sort_bang(VALUE ary)
                     xfree(ARY_HEAP_PTR(ary));
                 }
                 ARY_SET_PTR(ary, RARRAY_PTR(tmp));
-                ARY_SET_HEAP_LEN(ary, RARRAY_LEN(tmp));
-                ARY_SET_CAPA(ary, ARY_CAPA(tmp));
+                ARY_SET_HEAP_LEN(ary, len);
+                ARY_SET_CAPA(ary, RARRAY_LEN(tmp));
             }
             /* tmp was lost ownership for the ptr */
             FL_UNSET(tmp, FL_FREEZE);
diff --git a/class.c b/class.c
index df19812..db6b3e5 100644
--- a/class.c
+++ b/class.c
@@ -31,7 +31,7 @@
 #include "internal.h"
 #include <ctype.h>
 
-extern st_table *rb_class_tbl;
+extern sa_table rb_class_tbl;
 static ID id_attached;
 
 /**
@@ -50,14 +50,24 @@ static VALUE
 class_alloc(VALUE flags, VALUE klass)
 {
     rb_classext_t *ext = ALLOC(rb_classext_t);
+    rb_class_cache_t *cache = ALLOC(rb_class_cache_t);
     NEWOBJ(obj, struct RClass);
     OBJSETUP(obj, klass, flags);
     obj->ptr = ext;
-    RCLASS_IV_TBL(obj) = 0;
-    RCLASS_CONST_TBL(obj) = 0;
-    RCLASS_M_TBL(obj) = 0;
-    RCLASS_SUPER(obj) = 0;
-    RCLASS_IV_INDEX_TBL(obj) = 0;
+    obj->cache = cache;
+    MEMZERO(ext, struct rb_classext_struct, 1);
+    MEMZERO(cache, struct rb_class_cache_struct, 1);
+    return (VALUE)obj;
+}
+
+static VALUE
+iclass_alloc()
+{
+    rb_class_cache_t *cache = ALLOC(rb_class_cache_t);
+    NEWOBJ(obj, struct RClass);
+    OBJSETUP(obj, rb_cClass, T_ICLASS);
+    obj->cache = cache;
+    MEMZERO(cache, struct rb_class_cache_struct, 1);
     return (VALUE)obj;
 }
 
@@ -77,7 +87,6 @@ rb_class_boot(VALUE super)
     VALUE klass = class_alloc(T_CLASS, rb_cClass);
 
     RCLASS_SUPER(klass) = super;
-    RCLASS_M_TBL(klass) = st_init_numtable();
 
     OBJ_INFECT(klass, super);
     return (VALUE)klass;
@@ -120,85 +129,59 @@ rb_class_new(VALUE super)
     return rb_class_boot(super);
 }
 
-struct clone_method_data {
-    st_table *tbl;
-    VALUE klass;
-};
-
 VALUE rb_iseq_clone(VALUE iseqval, VALUE newcbase);
 
-static int
-clone_method(ID mid, const rb_method_entry_t *me, struct clone_method_data *data)
+static void
+clone_method(ID mid, const rb_method_entry_t *me, VALUE klass)
 {
     VALUE newiseqval;
     if (me->def && me->def->type == VM_METHOD_TYPE_ISEQ) {
 	rb_iseq_t *iseq;
-	newiseqval = rb_iseq_clone(me->def->body.iseq->self, data->klass);
+	newiseqval = rb_iseq_clone(me->def->body.iseq->self, klass);
 	GetISeqPtr(newiseqval, iseq);
-	rb_add_method(data->klass, mid, VM_METHOD_TYPE_ISEQ, iseq, me->flag);
+	rb_add_method(klass, mid, VM_METHOD_TYPE_ISEQ, iseq, me->flag);
 	RB_GC_GUARD(newiseqval);
     }
     else {
-	rb_method_entry_set(data->klass, mid, me, me->flag);
+	rb_method_entry_set(klass, mid, me, me->flag);
     }
-    return ST_CONTINUE;
 }
 
-static int
-clone_const(ID key, const rb_const_entry_t *ce, st_table *tbl)
+static void
+clone_const(sa_index_t key, st_data_t ce, sa_table *tbl)
 {
     rb_const_entry_t *nce = ALLOC(rb_const_entry_t);
-    *nce = *ce;
-    st_insert(tbl, key, (st_data_t)nce);
-    return ST_CONTINUE;
-}
-
-static int
-clone_const_i(st_data_t key, st_data_t value, st_data_t data)
-{
-    return clone_const((ID)key, (const rb_const_entry_t *)value, (st_table *)data);
+    *nce = *(const rb_const_entry_t*)ce;
+    sa_insert(tbl, (sa_index_t)key, (st_data_t)nce);
 }
 
 /* :nodoc: */
 VALUE
 rb_mod_init_copy(VALUE clone, VALUE orig)
 {
+    ID id;
     rb_obj_init_copy(clone, orig);
     if (!FL_TEST(CLASS_OF(clone), FL_SINGLETON)) {
 	RBASIC(clone)->klass = rb_singleton_class_clone(orig);
 	rb_singleton_class_attached(RBASIC(clone)->klass, (VALUE)clone);
     }
     RCLASS_SUPER(clone) = RCLASS_SUPER(orig);
-    if (RCLASS_IV_TBL(orig)) {
-	st_data_t id;
 
-	if (RCLASS_IV_TBL(clone)) {
-	    st_free_table(RCLASS_IV_TBL(clone));
-	}
-	RCLASS_IV_TBL(clone) = st_copy(RCLASS_IV_TBL(orig));
-	CONST_ID(id, "__classpath__");
-	st_delete(RCLASS_IV_TBL(clone), &id, 0);
-	CONST_ID(id, "__classid__");
-	st_delete(RCLASS_IV_TBL(clone), &id, 0);
-    }
-    if (RCLASS_CONST_TBL(orig)) {
-	if (RCLASS_CONST_TBL(clone)) {
-	    rb_free_const_table(RCLASS_CONST_TBL(clone));
-	}
-	RCLASS_CONST_TBL(clone) = st_init_numtable();
-	st_foreach(RCLASS_CONST_TBL(orig), clone_const_i, (st_data_t)RCLASS_CONST_TBL(clone));
-    }
-    if (RCLASS_M_TBL(orig)) {
-	struct clone_method_data data;
+    sa_copy_to(RCLASS_IV_TBL(orig), RCLASS_IV_TBL(clone));
+    CONST_ID(id, "__classpath__");
+    sa_delete(RCLASS_IV_TBL(clone), (sa_index_t)id, 0);
+    CONST_ID(id, "__classid__");
+    sa_delete(RCLASS_IV_TBL(clone), (sa_index_t)id, 0);
 
-	if (RCLASS_M_TBL(clone)) {
-	    rb_free_m_table(RCLASS_M_TBL(clone));
-	}
-	data.tbl = RCLASS_M_TBL(clone) = st_init_numtable();
-	data.klass = clone;
-	st_foreach(RCLASS_M_TBL(orig), clone_method,
-		   (st_data_t)&data);
-    }
+    sa_clear(RCLASS_CONST_TBL(clone));
+    SA_FOREACH_START(RCLASS_CONST_TBL(orig));
+    clone_const(entry->key, value, RCLASS_CONST_TBL(clone));
+    SA_FOREACH_END();
+
+    rb_free_m_table(RCLASS_M_TBL(clone));
+    SA_FOREACH_START(RCLASS_M_TBL(orig));
+    clone_method(entry->key, (const rb_method_entry_t *)value, clone);
+    SA_FOREACH_END();
 
     return clone;
 }
@@ -227,7 +210,6 @@ rb_singleton_class_clone(VALUE obj)
     if (!FL_TEST(klass, FL_SINGLETON))
 	return klass;
     else {
-	struct clone_method_data data;
 	/* copy singleton(unnamed) class */
 	VALUE clone = class_alloc((RBASIC(klass)->flags & ~(FL_MARK)), 0);
 
@@ -239,18 +221,16 @@ rb_singleton_class_clone(VALUE obj)
 	}
 
 	RCLASS_SUPER(clone) = RCLASS_SUPER(klass);
-	if (RCLASS_IV_TBL(klass)) {
-	    RCLASS_IV_TBL(clone) = st_copy(RCLASS_IV_TBL(klass));
-	}
-	if (RCLASS_CONST_TBL(klass)) {
-	    RCLASS_CONST_TBL(clone) = st_init_numtable();
-	    st_foreach(RCLASS_CONST_TBL(klass), clone_const_i, (st_data_t)RCLASS_CONST_TBL(clone));
-	}
-	RCLASS_M_TBL(clone) = st_init_numtable();
-	data.tbl = RCLASS_M_TBL(clone);
-	data.klass = (VALUE)clone;
-	st_foreach(RCLASS_M_TBL(klass), clone_method,
-		   (st_data_t)&data);
+        sa_copy_to(RCLASS_IV_TBL(klass), RCLASS_IV_TBL(clone));
+
+        SA_FOREACH_START(RCLASS_CONST_TBL(klass));
+        clone_const(entry->key, value, RCLASS_CONST_TBL(clone));
+        SA_FOREACH_END();
+
+        SA_FOREACH_START(RCLASS_M_TBL(klass));
+        clone_method(entry->key, (const rb_method_entry_t*)value, clone);
+        SA_FOREACH_END();
+
 	rb_singleton_class_attached(RBASIC(clone)->klass, (VALUE)clone);
 	FL_SET(clone, FL_SINGLETON);
 	return (VALUE)clone;
@@ -265,10 +245,7 @@ void
 rb_singleton_class_attached(VALUE klass, VALUE obj)
 {
     if (FL_TEST(klass, FL_SINGLETON)) {
-	if (!RCLASS_IV_TBL(klass)) {
-	    RCLASS_IV_TBL(klass) = st_init_numtable();
-	}
-	st_insert(RCLASS_IV_TBL(klass), id_attached, obj);
+	sa_insert(RCLASS_IV_TBL(klass), (sa_index_t)id_attached, obj);
     }
 }
 
@@ -355,12 +332,12 @@ make_singleton_class(VALUE obj)
 static VALUE
 boot_defclass(const char *name, VALUE super)
 {
-    extern st_table *rb_class_tbl;
+    extern sa_table rb_class_tbl;
     VALUE obj = rb_class_boot(super);
     ID id = rb_intern(name);
 
     rb_name_class(obj, id);
-    st_add_direct(rb_class_tbl, id, obj);
+    sa_insert(&rb_class_tbl, (sa_index_t)id, obj);
     rb_const_set((rb_cObject ? rb_cObject : obj), id, obj);
     return obj;
 }
@@ -484,7 +461,7 @@ rb_define_class(const char *name, VALUE super)
 	rb_warn("no super class for `%s', Object assumed", name);
     }
     klass = rb_define_class_id(id, super);
-    st_add_direct(rb_class_tbl, id, klass);
+    sa_insert(&rb_class_tbl, (sa_index_t)id, klass);
     rb_name_class(klass, id);
     rb_const_set(rb_cObject, id, klass);
     rb_class_inherited(super, klass);
@@ -565,8 +542,6 @@ rb_module_new(void)
 {
     VALUE mdl = class_alloc(T_MODULE, rb_cModule);
 
-    RCLASS_M_TBL(mdl) = st_init_numtable();
-
     return (VALUE)mdl;
 }
 
@@ -595,7 +570,7 @@ rb_define_module(const char *name)
 	rb_raise(rb_eTypeError, "%s is not a module", rb_obj_classname(module));
     }
     module = rb_define_module_id(id);
-    st_add_direct(rb_class_tbl, id, module);
+    sa_insert(&rb_class_tbl, (sa_index_t)id, module);
     rb_const_set(rb_cObject, id, module);
 
     return module;
@@ -630,27 +605,15 @@ rb_define_module_id_under(VALUE outer, ID id)
 static VALUE
 include_class_new(VALUE module, VALUE super)
 {
-    VALUE klass = class_alloc(T_ICLASS, rb_cClass);
+    VALUE klass;
 
     if (BUILTIN_TYPE(module) == T_ICLASS) {
 	module = RBASIC(module)->klass;
     }
-    if (!RCLASS_IV_TBL(module)) {
-	RCLASS_IV_TBL(module) = st_init_numtable();
-    }
-    if (!RCLASS_CONST_TBL(module)) {
-	RCLASS_CONST_TBL(module) = st_init_numtable();
-    }
-    RCLASS_IV_TBL(klass) = RCLASS_IV_TBL(module);
-    RCLASS_CONST_TBL(klass) = RCLASS_CONST_TBL(module);
-    RCLASS_M_TBL(klass) = RCLASS_M_TBL(module);
+    klass = iclass_alloc();
+    RBASIC(klass)->klass = module;
+    RCLASS_EXT(klass) = RCLASS_EXT(module);
     RCLASS_SUPER(klass) = super;
-    if (TYPE(module) == T_ICLASS) {
-	RBASIC(klass)->klass = RBASIC(module)->klass;
-    }
-    else {
-	RBASIC(klass)->klass = module;
-    }
     OBJ_INFECT(klass, module);
     OBJ_INFECT(klass, super);
 
@@ -677,13 +640,13 @@ rb_include_module(VALUE klass, VALUE module)
     while (module) {
 	int superclass_seen = FALSE;
 
-	if (RCLASS_M_TBL(klass) == RCLASS_M_TBL(module))
+	if (RCLASS_EXT(klass) == RCLASS_EXT(module))
 	    rb_raise(rb_eArgError, "cyclic include detected");
 	/* ignore if the module included already in superclasses */
 	for (p = RCLASS_SUPER(klass); p; p = RCLASS_SUPER(p)) {
 	    switch (BUILTIN_TYPE(p)) {
 	      case T_ICLASS:
-		if (RCLASS_M_TBL(p) == RCLASS_M_TBL(module)) {
+		if (RCLASS_EXT(p) == RCLASS_EXT(module)) {
 		    if (!superclass_seen) {
 			c = p;  /* move insertion point */
 		    }
@@ -696,7 +659,7 @@ rb_include_module(VALUE klass, VALUE module)
 	    }
 	}
 	c = RCLASS_SUPER(c) = include_class_new(module, RCLASS_SUPER(c));
-	if (RMODULE_M_TBL(module) && RMODULE_M_TBL(module)->num_entries)
+	if (RMODULE_M_TBL(module)->num_entries)
 	    changed = 1;
       skip:
 	module = RCLASS_SUPER(module);
@@ -827,58 +790,58 @@ ins_methods_push(ID name, long type, VALUE ary, long visi)
 }
 
 static int
-ins_methods_i(st_data_t name, st_data_t type, st_data_t ary)
+ins_methods_i(sa_index_t name, st_data_t type, st_data_t ary)
 {
     return ins_methods_push((ID)name, (long)type, (VALUE)ary, -1); /* everything but private */
 }
 
 static int
-ins_methods_prot_i(st_data_t name, st_data_t type, st_data_t ary)
+ins_methods_prot_i(sa_index_t name, st_data_t type, st_data_t ary)
 {
     return ins_methods_push((ID)name, (long)type, (VALUE)ary, NOEX_PROTECTED);
 }
 
 static int
-ins_methods_priv_i(st_data_t name, st_data_t type, st_data_t ary)
+ins_methods_priv_i(sa_index_t name, st_data_t type, st_data_t ary)
 {
     return ins_methods_push((ID)name, (long)type, (VALUE)ary, NOEX_PRIVATE);
 }
 
 static int
-ins_methods_pub_i(st_data_t name, st_data_t type, st_data_t ary)
+ins_methods_pub_i(sa_index_t name, st_data_t type, st_data_t ary)
 {
     return ins_methods_push((ID)name, (long)type, (VALUE)ary, NOEX_PUBLIC);
 }
 
 static int
-method_entry_i(st_data_t key, st_data_t value, st_data_t data)
+method_entry_i(sa_index_t key, st_data_t value, st_data_t data)
 {
     const rb_method_entry_t *me = (const rb_method_entry_t *)value;
-    st_table *list = (st_table *)data;
+    sa_table *list = (sa_table *)data;
     long type;
 
     if ((ID)key == ID_ALLOCATOR) {
 	return ST_CONTINUE;
     }
 
-    if (!st_lookup(list, key, 0)) {
+    if (!sa_lookup(list, key, 0)) {
 	if (UNDEFINED_METHOD_ENTRY_P(me)) {
 	    type = -1; /* none */
 	}
 	else {
 	    type = VISI(me->flag);
 	}
-	st_add_direct(list, key, type);
+	sa_insert(list, key, type);
     }
     return ST_CONTINUE;
 }
 
 static VALUE
-class_instance_method_list(int argc, VALUE *argv, VALUE mod, int obj, int (*func) (st_data_t, st_data_t, st_data_t))
+class_instance_method_list(int argc, VALUE *argv, VALUE mod, int obj, int (*func) (sa_index_t, st_data_t, st_data_t))
 {
     VALUE ary;
     int recur;
-    st_table *list;
+    sa_table list = SA_EMPTY_TABLE;
 
     if (argc == 0) {
 	recur = TRUE;
@@ -889,16 +852,15 @@ class_instance_method_list(int argc, VALUE *argv, VALUE mod, int obj, int (*func
 	recur = RTEST(r);
     }
 
-    list = st_init_numtable();
     for (; mod; mod = RCLASS_SUPER(mod)) {
-	st_foreach(RCLASS_M_TBL(mod), method_entry_i, (st_data_t)list);
+	sa_foreach(RCLASS_M_TBL(mod), method_entry_i, (st_data_t)&list);
 	if (BUILTIN_TYPE(mod) == T_ICLASS) continue;
 	if (obj && FL_TEST(mod, FL_SINGLETON)) continue;
 	if (!recur) break;
     }
     ary = rb_ary_new();
-    st_foreach(list, func, ary);
-    st_free_table(list);
+    sa_foreach(&list, func, ary);
+    sa_clear(&list);
 
     return ary;
 }
@@ -1112,7 +1074,7 @@ VALUE
 rb_obj_singleton_methods(int argc, VALUE *argv, VALUE obj)
 {
     VALUE recur, ary, klass;
-    st_table *list;
+    sa_table list = SA_EMPTY_TABLE;
 
     if (argc == 0) {
 	recur = Qtrue;
@@ -1121,20 +1083,19 @@ rb_obj_singleton_methods(int argc, VALUE *argv, VALUE obj)
 	rb_scan_args(argc, argv, "01", &recur);
     }
     klass = CLASS_OF(obj);
-    list = st_init_numtable();
     if (klass && FL_TEST(klass, FL_SINGLETON)) {
-	st_foreach(RCLASS_M_TBL(klass), method_entry_i, (st_data_t)list);
+	sa_foreach(RCLASS_M_TBL(klass), method_entry_i, (st_data_t)&list);
 	klass = RCLASS_SUPER(klass);
     }
     if (RTEST(recur)) {
 	while (klass && (FL_TEST(klass, FL_SINGLETON) || TYPE(klass) == T_ICLASS)) {
-	    st_foreach(RCLASS_M_TBL(klass), method_entry_i, (st_data_t)list);
+	    sa_foreach(RCLASS_M_TBL(klass), method_entry_i, (st_data_t)&list);
 	    klass = RCLASS_SUPER(klass);
 	}
     }
     ary = rb_ary_new();
-    st_foreach(list, ins_methods_i, ary);
-    st_free_table(list);
+    sa_foreach(&list, ins_methods_i, ary);
+    sa_clear(&list);
 
     return ary;
 }
diff --git a/common.mk b/common.mk
index c9ef641..3ccfa47 100644
--- a/common.mk
+++ b/common.mk
@@ -79,6 +79,7 @@ COMMONOBJS    = array.$(OBJEXT) \
 		safe.$(OBJEXT) \
 		signal.$(OBJEXT) \
 		sprintf.$(OBJEXT) \
+		sp_ar.$(OBJEXT) \
 		st.$(OBJEXT) \
 		strftime.$(OBJEXT) \
 		string.$(OBJEXT) \
@@ -638,7 +639,8 @@ file.$(OBJEXT): {$(VPATH)}file.c $(RUBY_H_INCLUDES) {$(VPATH)}io.h \
 gc.$(OBJEXT): {$(VPATH)}gc.c $(RUBY_H_INCLUDES) {$(VPATH)}re.h \
   {$(VPATH)}regex.h $(ENCODING_H_INCLUDES) $(VM_CORE_H_INCLUDES) \
   {$(VPATH)}gc.h {$(VPATH)}io.h {$(VPATH)}eval_intern.h {$(VPATH)}util.h \
-  {$(VPATH)}debug.h {$(VPATH)}internal.h {$(VPATH)}constant.h
+  {$(VPATH)}debug.h {$(VPATH)}internal.h {$(VPATH)}constant.h \
+  {$(VPATH)}pool_alloc.inc.h {$(VPATH)}pool_alloc.h
 hash.$(OBJEXT): {$(VPATH)}hash.c $(RUBY_H_INCLUDES) {$(VPATH)}util.h \
   $(ENCODING_H_INCLUDES)
 inits.$(OBJEXT): {$(VPATH)}inits.c $(RUBY_H_INCLUDES) \
@@ -702,7 +704,8 @@ signal.$(OBJEXT): {$(VPATH)}signal.c $(RUBY_H_INCLUDES) \
   $(VM_CORE_H_INCLUDES) {$(VPATH)}debug.h
 sprintf.$(OBJEXT): {$(VPATH)}sprintf.c $(RUBY_H_INCLUDES) {$(VPATH)}re.h \
   {$(VPATH)}regex.h {$(VPATH)}vsnprintf.c $(ENCODING_H_INCLUDES)
-st.$(OBJEXT): {$(VPATH)}st.c $(RUBY_H_INCLUDES)
+sp_ar.$(OBJEXT): {$(VPATH)}sp_ar.c $(RUBY_H_INCLUDES)
+st.$(OBJEXT): {$(VPATH)}st.c $(RUBY_H_INCLUDES) {$(VPATH)}pool_alloc.h
 strftime.$(OBJEXT): {$(VPATH)}strftime.c $(RUBY_H_INCLUDES) \
   {$(VPATH)}timev.h
 string.$(OBJEXT): {$(VPATH)}string.c $(RUBY_H_INCLUDES) {$(VPATH)}re.h \
diff --git a/configure.in b/configure.in
index b006a01..a3ccad7 100644
--- a/configure.in
+++ b/configure.in
@@ -1324,6 +1324,29 @@ main() {
 CFLAGS="$save_CFLAGS"])
 AC_DEFINE_UNQUOTED(GC_MARK_STACKFRAME_WORD, $rb_cv_gc_mark_stackframe_word)
 
+AS_CASE(["$target_os"],
+[openbsd*], [
+  AC_CACHE_CHECK(for heap align log on openbsd, rb_cv_page_size_log,
+    [rb_cv_page_size_log=no
+     for page_log in 12 13; do
+       AC_TRY_RUN([
+#include <math.h>
+#include <unistd.h>
+
+int
+main() {
+  if ((int)log2((double)sysconf(_SC_PAGESIZE)) != $page_log) return 1;
+  return 0;
+}
+       ],
+       rb_cv_page_size_log="$page_log"; break)
+     done])
+  if test $rb_cv_page_size_log != no; then
+    AC_DEFINE_UNQUOTED(HEAP_ALIGN_LOG, $rb_cv_page_size_log)
+  else
+    AC_DEFINE_UNQUOTED(HEAP_ALIGN_LOG, 12)
+  fi
+])
 
 dnl Checks for library functions.
 AC_TYPE_GETGROUPS
@@ -1424,7 +1447,8 @@ AC_CHECK_FUNCS(fmod killpg wait4 waitpid fork spawnv syscall __syscall chroot ge
 	      setsid telldir seekdir fchmod cosh sinh tanh log2 round\
 	      setuid setgid daemon select_large_fdset setenv unsetenv\
               mktime timegm gmtime_r clock_gettime gettimeofday poll ppoll\
-              pread sendfile shutdown sigaltstack dl_iterate_phdr)
+              pread sendfile shutdown sigaltstack dl_iterate_phdr\
+              dup3 pipe2 posix_memalign memalign)
 
 AC_CACHE_CHECK(for unsetenv returns a value, rb_cv_unsetenv_return_value,
   [AC_TRY_COMPILE([
diff --git a/constant.h b/constant.h
index 8232910..9106847 100644
--- a/constant.h
+++ b/constant.h
@@ -23,7 +23,7 @@ typedef struct rb_const_entry_struct {
 
 VALUE rb_mod_private_constant(int argc, VALUE *argv, VALUE obj);
 VALUE rb_mod_public_constant(int argc, VALUE *argv, VALUE obj);
-void rb_free_const_table(st_table *tbl);
+void rb_free_const_table(sa_table *tbl);
 VALUE rb_public_const_get(VALUE klass, ID id);
 VALUE rb_public_const_get_at(VALUE klass, ID id);
 VALUE rb_public_const_get_from(VALUE klass, ID id);
diff --git a/ext/-test-/st/numhash/numhash.c b/ext/-test-/st/numhash/numhash.c
index e186cd4..53d9e1b 100644
--- a/ext/-test-/st/numhash/numhash.c
+++ b/ext/-test-/st/numhash/numhash.c
@@ -54,7 +54,7 @@ numhash_i(st_data_t key, st_data_t value, st_data_t arg, int error)
 static VALUE
 numhash_each(VALUE self)
 {
-    return st_foreach((st_table *)DATA_PTR(self), numhash_i, self) ? Qtrue : Qfalse;
+    return st_foreach_check((st_table *)DATA_PTR(self), numhash_i, self, 0) ? Qtrue : Qfalse;
 }
 
 void
diff --git a/ext/objspace/objspace.c b/ext/objspace/objspace.c
index 66e33a3..4b31f92 100644
--- a/ext/objspace/objspace.c
+++ b/ext/objspace/objspace.c
@@ -60,20 +60,10 @@ memsize_of(VALUE obj)
 	break;
       case T_MODULE:
       case T_CLASS:
-	size += st_memsize(RCLASS_M_TBL(obj));
-	if (RCLASS_IV_TBL(obj)) {
-	    size += st_memsize(RCLASS_IV_TBL(obj));
-	}
-	if (RCLASS_IV_INDEX_TBL(obj)) {
-	    size += st_memsize(RCLASS_IV_INDEX_TBL(obj));
-	}
-	if (RCLASS(obj)->ptr->iv_tbl) {
-	    size += st_memsize(RCLASS(obj)->ptr->iv_tbl);
-	}
-	if (RCLASS(obj)->ptr->const_tbl) {
-	    size += st_memsize(RCLASS(obj)->ptr->const_tbl);
-	}
-	size += sizeof(rb_classext_t);
+	size += sa_memsize(RCLASS_M_TBL(obj));
+        size += sa_memsize(RCLASS_IV_TBL(obj));
+        size += sa_memsize(RCLASS_IV_INDEX_TBL(obj));
+        size += sa_memsize(RCLASS_CONST_TBL(obj));
 	break;
       case T_STRING:
 	size += rb_str_memsize(obj);
diff --git a/file.c b/file.c
index c1db6d7..3f465e5 100644
--- a/file.c
+++ b/file.c
@@ -148,40 +148,60 @@ file_path_convert(VALUE name)
     return name;
 }
 
-static VALUE
-rb_get_path_check(VALUE obj, int level)
+static rb_encoding *
+check_path_encoding(VALUE str)
+{
+    rb_encoding *enc = rb_enc_get(str);
+    if (!rb_enc_asciicompat(enc)) {
+	rb_raise(rb_eEncCompatError, "path name must be ASCII-compatible (%s): %s",
+		 rb_enc_name(enc), RSTRING_PTR(rb_str_inspect(str)));
+    }
+    return enc;
+}
+
+VALUE
+rb_get_path_check_to_string(VALUE obj, int level)
 {
     VALUE tmp;
     ID to_path;
-    rb_encoding *enc;
 
     if (insecure_obj_p(obj, level)) {
 	rb_insecure_operation();
     }
 
+    if (RB_TYPE_P(obj, T_STRING)) {
+	return obj;
+    }
     CONST_ID(to_path, "to_path");
     tmp = rb_check_funcall(obj, to_path, 0, 0);
     if (tmp == Qundef) {
 	tmp = obj;
     }
     StringValue(tmp);
+    return tmp;
+}
 
+VALUE
+rb_get_path_check_convert(VALUE obj, VALUE tmp, int level)
+{
     tmp = file_path_convert(tmp);
     if (obj != tmp && insecure_obj_p(tmp, level)) {
 	rb_insecure_operation();
     }
-    enc = rb_enc_get(tmp);
-    if (!rb_enc_asciicompat(enc)) {
-	tmp = rb_str_inspect(tmp);
-	rb_raise(rb_eEncCompatError, "path name must be ASCII-compatible (%s): %s",
-		 rb_enc_name(enc), RSTRING_PTR(tmp));
-    }
 
+    check_path_encoding(tmp);
     StringValueCStr(tmp);
 
     return rb_str_new4(tmp);
 }
 
+static VALUE
+rb_get_path_check(VALUE obj, int level)
+{
+    VALUE tmp = rb_get_path_check_to_string(obj, level);
+    return rb_get_path_check_convert(obj, tmp, level);
+}
+
 VALUE
 rb_get_path_no_checksafe(VALUE obj)
 {
@@ -3249,7 +3269,6 @@ rb_file_expand_path(VALUE fname, VALUE dname)
 VALUE
 rb_file_expand_path_fast(VALUE fname, VALUE dname)
 {
-    check_expand_path_args(fname, dname);
     return rb_file_expand_path_internal(fname, dname, 0, 0, EXPAND_PATH_BUFFER());
 }
 
@@ -5237,7 +5256,7 @@ rb_find_file_ext_safe(VALUE *filep, const char *const *ext, int safe_level)
 	rb_raise(rb_eSecurityError, "loading from non-absolute path %s", f);
     }
 
-    RB_GC_GUARD(load_path) = rb_get_load_path();
+    RB_GC_GUARD(load_path) = rb_get_expanded_load_path();
     if (!load_path) return 0;
 
     fname = rb_str_dup(*filep);
@@ -5302,7 +5321,7 @@ rb_find_file_safe(VALUE path, int safe_level)
 	rb_raise(rb_eSecurityError, "loading from non-absolute path %s", f);
     }
 
-    RB_GC_GUARD(load_path) = rb_get_load_path();
+    RB_GC_GUARD(load_path) = rb_get_expanded_load_path();
     if (load_path) {
 	long i;
 
diff --git a/gc.c b/gc.c
index e65d0ec..6a61610 100644
--- a/gc.c
+++ b/gc.c
@@ -20,10 +20,12 @@
 #include "vm_core.h"
 #include "internal.h"
 #include "gc.h"
+#include "pool_alloc.h"
 #include "constant.h"
 #include <stdio.h>
 #include <setjmp.h>
 #include <sys/types.h>
+#include <assert.h>
 
 #ifdef HAVE_SYS_TIME_H
 #include <sys/time.h>
@@ -35,7 +37,12 @@
 
 #if defined _WIN32 || defined __CYGWIN__
 #include <windows.h>
+#elif defined(HAVE_POSIX_MEMALIGN)
+#elif defined(HAVE_MEMALIGN)
+#include <malloc.h>
 #endif
+static void aligned_free(void *);
+static void *aligned_malloc(size_t alignment, size_t size);
 
 #ifdef HAVE_VALGRIND_MEMCHECK_H
 # include <valgrind/memcheck.h>
@@ -84,10 +91,12 @@ typedef struct {
     unsigned int initial_malloc_limit;
     unsigned int initial_heap_min_slots;
     unsigned int initial_free_min;
+#if defined(ENABLE_VM_OBJSPACE) && ENABLE_VM_OBJSPACE
     int gc_stress;
+#endif
 } ruby_gc_params_t;
 
-ruby_gc_params_t initial_params = {
+static ruby_gc_params_t initial_params = {
     GC_MALLOC_LIMIT,
     HEAP_MIN_SLOTS,
     FREE_MIN,
@@ -103,7 +112,10 @@ ruby_gc_params_t initial_params = {
 int ruby_gc_debug_indent = 0;
 
 /* for GC profile */
+#ifndef GC_PROFILE_MORE_DETAIL
 #define GC_PROFILE_MORE_DETAIL 0
+#endif
+
 typedef struct gc_profile_record {
     double gc_time;
     double gc_mark_time;
@@ -301,17 +313,20 @@ typedef struct RVALUE {
 #endif
 
 struct heaps_slot {
-    void *membase;
-    RVALUE *slot;
-    size_t limit;
+    struct heaps_header *membase;
+    RVALUE *freelist;
     struct heaps_slot *next;
     struct heaps_slot *prev;
+    struct heaps_slot *free_next;
+    uintptr_t bits[1];
 };
 
-struct sorted_heaps_slot {
+struct heaps_header {
+    struct heaps_slot *base;
+    uintptr_t *bits;
     RVALUE *start;
     RVALUE *end;
-    struct heaps_slot *slot;
+    size_t limit;
 };
 
 struct gc_list {
@@ -319,7 +334,27 @@ struct gc_list {
     struct gc_list *next;
 };
 
+#ifndef CALC_EXACT_MALLOC_SIZE
 #define CALC_EXACT_MALLOC_SIZE 0
+#endif
+
+#ifdef POOL_ALLOC_API
+/* POOL ALLOC API */
+#define POOL_ALLOC_PART 1
+#include "pool_alloc.inc.h"
+#undef POOL_ALLOC_PART
+
+typedef struct pool_layout_t pool_layout_t;
+struct pool_layout_t {
+    pool_header
+      p6,  /* st_table && st_table_entry */
+      p11;  /* st_table.bins init size */
+} pool_layout = {
+    INIT_POOL(void*[6]),
+    INIT_POOL(void*[11])
+};
+static void pool_finalize_header(pool_header *header);
+#endif
 
 typedef struct rb_objspace {
     struct {
@@ -330,16 +365,20 @@ typedef struct rb_objspace {
 	size_t allocations;
 #endif
     } malloc_params;
+#ifdef POOL_ALLOC_API
+    pool_layout_t *pool_headers;
+#endif
     struct {
 	size_t increment;
 	struct heaps_slot *ptr;
 	struct heaps_slot *sweep_slots;
-	struct sorted_heaps_slot *sorted;
+	struct heaps_slot *free_slots;
+	struct heaps_header **sorted;
 	size_t length;
 	size_t used;
-	RVALUE *freelist;
+        struct heaps_slot *reserve_slots;
 	RVALUE *range[2];
-	RVALUE *freed;
+	struct heaps_header *freed;
 	size_t live_num;
 	size_t free_num;
 	size_t free_min;
@@ -350,6 +389,7 @@ typedef struct rb_objspace {
 	int dont_gc;
 	int dont_lazy_sweep;
 	int during_gc;
+	rb_atomic_t finalizing;
     } flags;
     struct {
 	st_table *table;
@@ -377,7 +417,11 @@ typedef struct rb_objspace {
 #define ruby_initial_gc_stress	initial_params.gc_stress
 int *ruby_initial_gc_stress_ptr = &ruby_initial_gc_stress;
 #else
+#  ifdef POOL_ALLOC_API
+static rb_objspace_t rb_objspace = {{GC_MALLOC_LIMIT}, &pool_layout, {HEAP_MIN_SLOTS}};
+#  else
 static rb_objspace_t rb_objspace = {{GC_MALLOC_LIMIT}, {HEAP_MIN_SLOTS}};
+#  endif
 int *ruby_initial_gc_stress_ptr = &rb_objspace.gc_stress;
 #endif
 #define malloc_limit		objspace->malloc_params.limit
@@ -385,13 +429,13 @@ int *ruby_initial_gc_stress_ptr = &rb_objspace.gc_stress;
 #define heaps			objspace->heap.ptr
 #define heaps_length		objspace->heap.length
 #define heaps_used		objspace->heap.used
-#define freelist		objspace->heap.freelist
 #define lomem			objspace->heap.range[0]
 #define himem			objspace->heap.range[1]
 #define heaps_inc		objspace->heap.increment
 #define heaps_freed		objspace->heap.freed
 #define dont_gc 		objspace->flags.dont_gc
 #define during_gc		objspace->flags.during_gc
+#define finalizing		objspace->flags.finalizing
 #define finalizer_table 	objspace->final.table
 #define deferred_final_list	objspace->final.deferred
 #define mark_stack		objspace->markstack.buffer
@@ -403,7 +447,16 @@ int *ruby_initial_gc_stress_ptr = &rb_objspace.gc_stress;
 #define initial_heap_min_slots	initial_params.initial_heap_min_slots
 #define initial_free_min	initial_params.initial_free_min
 
+#define is_lazy_sweeping(objspace) ((objspace)->heap.sweep_slots != 0)
+
+#define nonspecial_obj_id(obj) (VALUE)((SIGNED_VALUE)(obj)|FIXNUM_FLAG)
+
+#define HEAP_HEADER(p) ((struct heaps_header *)(p))
+
 static void rb_objspace_call_finalizer(rb_objspace_t *objspace);
+static VALUE define_final0(VALUE obj, VALUE block);
+VALUE rb_define_final(VALUE obj, VALUE block);
+VALUE rb_undefine_final(VALUE obj);
 
 #if defined(ENABLE_VM_OBJSPACE) && ENABLE_VM_OBJSPACE
 rb_objspace_t *
@@ -413,6 +466,10 @@ rb_objspace_alloc(void)
     memset(objspace, 0, sizeof(*objspace));
     malloc_limit = initial_malloc_limit;
     ruby_gc_stress = ruby_initial_gc_stress;
+#ifdef POOL_ALLOC_API
+    objspace->pool_headers = (pool_layout_t*) malloc(sizeof(pool_layout));
+    memcpy(objspace->pool_headers, &pool_layout, sizeof(pool_layout));
+#endif
 
     return objspace;
 }
@@ -478,42 +535,62 @@ rb_objspace_free(rb_objspace_t *objspace)
 	struct gc_list *list, *next;
 	for (list = global_List; list; list = next) {
 	    next = list->next;
-	    free(list);
+	    xfree(list);
 	}
     }
+    if (objspace->heap.reserve_slots) {
+        struct heaps_slot *list, *next;
+        for (list = objspace->heap.reserve_slots; list; list = next) {
+            next = list->free_next;
+            free(list);
+        }
+    }
     if (objspace->heap.sorted) {
 	size_t i;
 	for (i = 0; i < heaps_used; ++i) {
-	    free(objspace->heap.sorted[i].slot->membase);
-	    free(objspace->heap.sorted[i].slot);
+            free(objspace->heap.sorted[i]->base);
+	    aligned_free(objspace->heap.sorted[i]);
 	}
 	free(objspace->heap.sorted);
 	heaps_used = 0;
 	heaps = 0;
     }
+#ifdef POOL_ALLOC_API
+    if (objspace->pool_headers) {
+        pool_finalize_header(&objspace->pool_headers->p6);
+        pool_finalize_header(&objspace->pool_headers->p11);
+        free(objspace->pool_headers);
+    }
+#endif
     free(objspace);
 }
 #endif
 
-/* tiny heap size */
-/* 32KB */
-/*#define HEAP_SIZE 0x8000 */
-/* 128KB */
-/*#define HEAP_SIZE 0x20000 */
-/* 64KB */
-/*#define HEAP_SIZE 0x10000 */
-/* 16KB */
-#define HEAP_SIZE 0x4000
-/* 8KB */
-/*#define HEAP_SIZE 0x2000 */
-/* 4KB */
-/*#define HEAP_SIZE 0x1000 */
-/* 2KB */
-/*#define HEAP_SIZE 0x800 */
-
-#define HEAP_OBJ_LIMIT (unsigned int)(HEAP_SIZE / sizeof(struct RVALUE))
-
-extern st_table *rb_class_tbl;
+#ifndef HEAP_ALIGN_LOG
+/* default tiny heap size: 16KB */
+#define HEAP_ALIGN_LOG 14
+#endif
+#define HEAP_ALIGN (1UL << HEAP_ALIGN_LOG)
+#define HEAP_ALIGN_MASK (~(~0UL << HEAP_ALIGN_LOG))
+#define REQUIRED_SIZE_BY_MALLOC (sizeof(size_t) * 5)
+#define HEAP_SIZE (HEAP_ALIGN - REQUIRED_SIZE_BY_MALLOC)
+#define CEILDIV(i, mod) (((i) + (mod) - 1)/(mod))
+
+#define HEAP_OBJ_LIMIT (unsigned int)((HEAP_SIZE - sizeof(struct heaps_header))/sizeof(struct RVALUE))
+#define HEAP_BITMAP_LIMIT CEILDIV(CEILDIV(HEAP_SIZE, sizeof(struct RVALUE)), sizeof(uintptr_t)*8)
+#define HEAP_SLOT_SIZE (sizeof(struct heaps_slot) + (HEAP_BITMAP_LIMIT-1) * sizeof(uintptr_t))
+
+#define GET_HEAP_HEADER(x) (HEAP_HEADER(((uintptr_t)x) & ~(HEAP_ALIGN_MASK)))
+#define GET_HEAP_SLOT(x) (GET_HEAP_HEADER(x)->base)
+#define GET_HEAP_BITMAP(x) (GET_HEAP_HEADER(x)->bits)
+#define NUM_IN_SLOT(p) (((uintptr_t)p & HEAP_ALIGN_MASK)/sizeof(RVALUE))
+#define BITMAP_INDEX(p) (NUM_IN_SLOT(p) / (sizeof(uintptr_t) * 8))
+#define BITMAP_OFFSET(p) (NUM_IN_SLOT(p) & ((sizeof(uintptr_t) * 8)-1))
+#define MARKED_IN_BITMAP(bits, p) (bits[BITMAP_INDEX(p)] & ((uintptr_t)1 << BITMAP_OFFSET(p)))
+#define MARK_IN_BITMAP(bits, p) (bits[BITMAP_INDEX(p)] = bits[BITMAP_INDEX(p)] | ((uintptr_t)1 << BITMAP_OFFSET(p)))
+#define CLEAR_IN_BITMAP(bits, p) (bits[BITMAP_INDEX(p)] &= ~((uintptr_t)1 << BITMAP_OFFSET(p)))
+
+extern sa_table rb_class_tbl;
 
 int ruby_disable_gc_stress = 0;
 
@@ -823,8 +900,10 @@ vm_xfree(rb_objspace_t *objspace, void *ptr)
     size_t size;
     ptr = ((size_t *)ptr) - 1;
     size = ((size_t*)ptr)[0];
-    objspace->malloc_params.allocated_size -= size;
-    objspace->malloc_params.allocations--;
+    if (size) {
+	objspace->malloc_params.allocated_size -= size;
+	objspace->malloc_params.allocations--;
+    }
 #endif
 
     free(ptr);
@@ -894,6 +973,27 @@ ruby_xfree(void *x)
 	vm_xfree(&rb_objspace, x);
 }
 
+#ifdef POOL_ALLOC_API
+/* POOL ALLOC API */
+#define POOL_ALLOC_PART 2
+#include "pool_alloc.inc.h"
+#undef POOL_ALLOC_PART
+
+void
+ruby_xpool_free(void *ptr)
+{
+    pool_free_entry((void**)ptr);
+}
+
+#define CONCRET_POOL_MALLOC(pnts) \
+void * ruby_xpool_malloc_##pnts##p () { \
+    return pool_alloc_entry(&rb_objspace.pool_headers->p##pnts ); \
+}
+CONCRET_POOL_MALLOC(6)
+CONCRET_POOL_MALLOC(11)
+#undef CONCRET_POOL_MALLOC
+
+#endif
 
 /*
  *  call-seq:
@@ -984,70 +1084,140 @@ rb_gc_unregister_address(VALUE *addr)
     }
 }
 
-
 static void
 allocate_sorted_heaps(rb_objspace_t *objspace, size_t next_heaps_length)
 {
-    struct sorted_heaps_slot *p;
-    size_t size;
+    struct heaps_header **p;
+    struct heaps_slot *slot;
+    size_t size, add, i;
 
-    size = next_heaps_length*sizeof(struct sorted_heaps_slot);
+    size = next_heaps_length*sizeof(struct heaps_header *);
+    add = next_heaps_length - heaps_used;
 
     if (heaps_used > 0) {
-	p = (struct sorted_heaps_slot *)realloc(objspace->heap.sorted, size);
+	p = (struct heaps_header **)realloc(objspace->heap.sorted, size);
 	if (p) objspace->heap.sorted = p;
     }
     else {
-	p = objspace->heap.sorted = (struct sorted_heaps_slot *)malloc(size);
+	p = objspace->heap.sorted = (struct heaps_header **)malloc(size);
     }
 
     if (p == 0) {
 	during_gc = 0;
 	rb_memerror();
     }
-    heaps_length = next_heaps_length;
+
+    for (i = 0; i < add; i++) {
+        slot = (struct heaps_slot *)malloc(HEAP_SLOT_SIZE);
+        if (slot == 0) {
+            during_gc = 0;
+            rb_memerror();
+            return;
+        }
+        slot->free_next = objspace->heap.reserve_slots;
+        objspace->heap.reserve_slots = slot;
+    }
+}
+
+static void *
+aligned_malloc(size_t alignment, size_t size)
+{
+    void *res;
+
+#if defined __MINGW32__
+    res = __mingw_aligned_malloc(size, alignment);
+#elif defined _WIN32 && !defined __CYGWIN__
+    res = _aligned_malloc(size, alignment);
+#elif defined(HAVE_POSIX_MEMALIGN)
+    if (posix_memalign(&res, alignment, size) == 0) {
+        return res;
+    }
+    else {
+        return NULL;
+    }
+#elif defined(HAVE_MEMALIGN)
+    res = memalign(alignment, size);
+#else
+    char* aligned;
+    res = malloc(alignment + size + sizeof(void*));
+    aligned = (char*)res + alignment + sizeof(void*);
+    aligned -= ((VALUE)aligned & (alignment - 1));
+    ((void**)aligned)[-1] = res;
+    res = (void*)aligned;
+#endif
+
+#if defined(_DEBUG) || defined(GC_DEBUG)
+    /* alignment must be a power of 2 */
+    assert((alignment - 1) & alignment == 0);
+    assert(alignment % sizeof(void*) == 0);
+#endif
+    return res;
+}
+
+static void
+aligned_free(void *ptr)
+{
+#if defined __MINGW32__
+    __mingw_aligned_free(ptr);
+#elif defined _WIN32 && !defined __CYGWIN__
+    _aligned_free(ptr);
+#elif defined(HAVE_MEMALIGN) || defined(HAVE_POSIX_MEMALIGN)
+    free(ptr);
+#else
+    free(((void**)ptr)[-1]);
+#endif
+}
+
+static void
+link_free_heap_slot(rb_objspace_t *objspace, struct heaps_slot *slot)
+{
+    slot->free_next = objspace->heap.free_slots;
+    objspace->heap.free_slots = slot;
+}
+
+static void
+unlink_free_heap_slot(rb_objspace_t *objspace, struct heaps_slot *slot)
+{
+    objspace->heap.free_slots = slot->free_next;
+    slot->free_next = NULL;
 }
 
 static void
 assign_heap_slot(rb_objspace_t *objspace)
 {
-    RVALUE *p, *pend, *membase;
+    RVALUE *p, *pend;
+    struct heaps_header *membase;
     struct heaps_slot *slot;
     size_t hi, lo, mid;
     size_t objs;
 
     objs = HEAP_OBJ_LIMIT;
-    p = (RVALUE*)malloc(HEAP_SIZE);
-    if (p == 0) {
-	during_gc = 0;
-	rb_memerror();
-    }
-    slot = (struct heaps_slot *)malloc(sizeof(struct heaps_slot));
-    if (slot == 0) {
-	xfree(p);
+    membase = (struct heaps_header*)aligned_malloc(HEAP_ALIGN, HEAP_SIZE);
+    if (membase == 0) {
 	during_gc = 0;
 	rb_memerror();
     }
+    assert(objspace->heap.reserve_slots != NULL);
+    slot = objspace->heap.reserve_slots;
+    objspace->heap.reserve_slots = slot->free_next;
     MEMZERO((void*)slot, struct heaps_slot, 1);
 
     slot->next = heaps;
     if (heaps) heaps->prev = slot;
     heaps = slot;
 
-    membase = p;
+    p = (RVALUE*)((VALUE)membase + sizeof(struct heaps_header));
     if ((VALUE)p % sizeof(RVALUE) != 0) {
-	p = (RVALUE*)((VALUE)p + sizeof(RVALUE) - ((VALUE)p % sizeof(RVALUE)));
-	if ((HEAP_SIZE - HEAP_OBJ_LIMIT * sizeof(RVALUE)) < (size_t)((char*)p - (char*)membase)) {
-	    objs--;
-	}
+       p = (RVALUE*)((VALUE)p + sizeof(RVALUE) - ((VALUE)p % sizeof(RVALUE)));
+       objs = (HEAP_SIZE - (size_t)((VALUE)p - (VALUE)membase))/sizeof(RVALUE);
     }
 
     lo = 0;
     hi = heaps_used;
     while (lo < hi) {
-	register RVALUE *mid_membase;
+	register struct heaps_header *mid_membase;
 	mid = (lo + hi) / 2;
-	mid_membase = objspace->heap.sorted[mid].slot->membase;
+        mid_membase = objspace->heap.sorted[mid];
 	if (mid_membase < membase) {
 	    lo = mid + 1;
 	}
@@ -1059,14 +1229,16 @@ assign_heap_slot(rb_objspace_t *objspace)
 	}
     }
     if (hi < heaps_used) {
-	MEMMOVE(&objspace->heap.sorted[hi+1], &objspace->heap.sorted[hi], struct sorted_heaps_slot, heaps_used - hi);
-    }
-    objspace->heap.sorted[hi].slot = slot;
-    objspace->heap.sorted[hi].start = p;
-    objspace->heap.sorted[hi].end = (p + objs);
+	MEMMOVE(&objspace->heap.sorted[hi+1], &objspace->heap.sorted[hi], struct heaps_header*, heaps_used - hi);
+    }
+    objspace->heap.sorted[hi] = membase;
+    membase->start = p;
+    membase->end = (p + objs);
+    membase->base = heaps;
+    membase->bits = heaps->bits;
+    membase->limit = objs;
     heaps->membase = membase;
-    heaps->slot = p;
-    heaps->limit = objs;
+    memset(heaps->bits, 0, HEAP_BITMAP_LIMIT * sizeof(uintptr_t));
     objspace->heap.free_num += objs;
     pend = p + objs;
     if (lomem == 0 || lomem > p) lomem = p;
@@ -1075,19 +1247,24 @@ assign_heap_slot(rb_objspace_t *objspace)
 
     while (p < pend) {
 	p->as.free.flags = 0;
-	p->as.free.next = freelist;
-	freelist = p;
+	p->as.free.next = heaps->freelist;
+	heaps->freelist = p;
 	p++;
     }
+    link_free_heap_slot(objspace, heaps);
 }
 
 static void
 add_heap_slots(rb_objspace_t *objspace, size_t add)
 {
     size_t i;
+    size_t next_heaps_length;
+
+    next_heaps_length = heaps_used + add;
 
-    if ((heaps_used + add) > heaps_length) {
-        allocate_sorted_heaps(objspace, heaps_used + add);
+    if (next_heaps_length > heaps_length) {
+        allocate_sorted_heaps(objspace, next_heaps_length);
+        heaps_length = next_heaps_length;
     }
 
     for (i = 0; i < add; i++) {
@@ -1137,6 +1314,7 @@ set_heaps_increment(rb_objspace_t *objspace)
 
     if (next_heaps_length > heaps_length) {
 	allocate_sorted_heaps(objspace, next_heaps_length);
+        heaps_length = next_heaps_length;
     }
 }
 
@@ -1159,6 +1337,7 @@ rb_during_gc(void)
 }
 
 #define RANY(o) ((RVALUE*)(o))
+#define has_free_object (objspace->heap.free_slots && objspace->heap.free_slots->freelist)
 
 VALUE
 rb_newobj(void)
@@ -1179,15 +1358,18 @@ rb_newobj(void)
 	}
     }
 
-    if (UNLIKELY(!freelist)) {
+    if (UNLIKELY(!has_free_object)) {
 	if (!gc_lazy_sweep(objspace)) {
 	    during_gc = 0;
 	    rb_memerror();
 	}
     }
 
-    obj = (VALUE)freelist;
-    freelist = freelist->as.free.next;
+    obj = (VALUE)objspace->heap.free_slots->freelist;
+    objspace->heap.free_slots->freelist = RANY(obj)->as.free.next;
+    if (objspace->heap.free_slots->freelist == NULL) {
+        unlink_free_heap_slot(objspace, objspace->heap.free_slots);
+    }
 
     MEMZERO((void*)obj, RVALUE, 1);
 #ifdef GC_DEBUG
@@ -1356,10 +1538,10 @@ gc_mark_all(rb_objspace_t *objspace)
 
     init_mark_stack(objspace);
     for (i = 0; i < heaps_used; i++) {
-	p = objspace->heap.sorted[i].start; pend = objspace->heap.sorted[i].end;
+	p = objspace->heap.sorted[i]->start; pend = objspace->heap.sorted[i]->end;
 	while (p < pend) {
-	    if ((p->as.basic.flags & FL_MARK) &&
-		(p->as.basic.flags != FL_MARK)) {
+	    if (MARKED_IN_BITMAP(GET_HEAP_BITMAP(p), p) &&
+		p->as.basic.flags) {
 		gc_mark_children(objspace, (VALUE)p, 0);
 	    }
 	    p++;
@@ -1387,26 +1569,27 @@ static inline int
 is_pointer_to_heap(rb_objspace_t *objspace, void *ptr)
 {
     register RVALUE *p = RANY(ptr);
-    register struct sorted_heaps_slot *heap;
+    register struct heaps_header *heap;
     register size_t hi, lo, mid;
 
     if (p < lomem || p > himem) return FALSE;
     if ((VALUE)p % sizeof(RVALUE) != 0) return FALSE;
+    heap = GET_HEAP_HEADER(p);
 
     /* check if p looks like a pointer using bsearch*/
     lo = 0;
     hi = heaps_used;
     while (lo < hi) {
 	mid = (lo + hi) / 2;
-	heap = &objspace->heap.sorted[mid];
-	if (heap->start <= p) {
-	    if (p < heap->end)
-		return TRUE;
-	    lo = mid + 1;
-	}
-	else {
-	    hi = mid;
-	}
+        if (heap > objspace->heap.sorted[mid]) {
+            lo = mid + 1;
+        }
+        else if (heap < objspace->heap.sorted[mid]) {
+            hi = mid;
+        }
+        else {
+            return (p >= heap->start && p < heap->end) ? TRUE : FALSE;
+        }
     }
     return FALSE;
 }
@@ -1449,10 +1632,10 @@ struct mark_tbl_arg {
 };
 
 static int
-mark_entry(ID key, VALUE value, st_data_t data)
+mark_entry(st_data_t key, st_data_t value, st_data_t data)
 {
     struct mark_tbl_arg *arg = (void*)data;
-    gc_mark(arg->objspace, value, arg->lev);
+    gc_mark(arg->objspace, (VALUE)value, arg->lev);
     return ST_CONTINUE;
 }
 
@@ -1466,11 +1649,20 @@ mark_tbl(rb_objspace_t *objspace, st_table *tbl, int lev)
     st_foreach(tbl, mark_entry, (st_data_t)&arg);
 }
 
+static void
+mark_sa_tbl(rb_objspace_t *objspace, sa_table *tbl, int lev)
+{
+    if (!tbl) return;
+    SA_FOREACH_START(tbl);
+    gc_mark(objspace, (VALUE)value, lev);
+    SA_FOREACH_END();
+}
+
 static int
-mark_key(VALUE key, VALUE value, st_data_t data)
+mark_key(st_data_t key, st_data_t value, st_data_t data)
 {
     struct mark_tbl_arg *arg = (void*)data;
-    gc_mark(arg->objspace, key, arg->lev);
+    gc_mark(arg->objspace, (VALUE)key, arg->lev);
     return ST_CONTINUE;
 }
 
@@ -1491,11 +1683,11 @@ rb_mark_set(st_table *tbl)
 }
 
 static int
-mark_keyvalue(VALUE key, VALUE value, st_data_t data)
+mark_keyvalue(st_data_t key, st_data_t value, st_data_t data)
 {
     struct mark_tbl_arg *arg = (void*)data;
-    gc_mark(arg->objspace, key, arg->lev);
-    gc_mark(arg->objspace, value, arg->lev);
+    gc_mark(arg->objspace, (VALUE)key, arg->lev);
+    gc_mark(arg->objspace, (VALUE)value, arg->lev);
     return ST_CONTINUE;
 }
 
@@ -1544,74 +1736,52 @@ rb_mark_method_entry(const rb_method_entry_t *me)
     mark_method_entry(&rb_objspace, me, 0);
 }
 
-static int
-mark_method_entry_i(ID key, const rb_method_entry_t *me, st_data_t data)
-{
-    struct mark_tbl_arg *arg = (void*)data;
-    mark_method_entry(arg->objspace, me, arg->lev);
-    return ST_CONTINUE;
-}
-
 static void
-mark_m_tbl(rb_objspace_t *objspace, st_table *tbl, int lev)
-{
-    struct mark_tbl_arg arg;
-    if (!tbl) return;
-    arg.objspace = objspace;
-    arg.lev = lev;
-    st_foreach(tbl, mark_method_entry_i, (st_data_t)&arg);
-}
-
-static int
-free_method_entry_i(ID key, rb_method_entry_t *me, st_data_t data)
+mark_m_tbl(rb_objspace_t *objspace, sa_table *tbl, int lev)
 {
-    rb_free_method_entry(me);
-    return ST_CONTINUE;
+    SA_FOREACH_START(tbl);
+    mark_method_entry(objspace, (const rb_method_entry_t*)value, lev);
+    SA_FOREACH_END();
 }
 
 void
-rb_free_m_table(st_table *tbl)
-{
-    st_foreach(tbl, free_method_entry_i, 0);
-    st_free_table(tbl);
-}
-
-static int
-mark_const_entry_i(ID key, const rb_const_entry_t *ce, st_data_t data)
+rb_free_m_table(sa_table *tbl)
 {
-    struct mark_tbl_arg *arg = (void*)data;
-    gc_mark(arg->objspace, ce->value, arg->lev);
-    return ST_CONTINUE;
+    SA_FOREACH_START(tbl);
+    if (!((rb_method_entry_t*)value)->mark) {
+	rb_free_method_entry((rb_method_entry_t*)value);
+    }
+    SA_FOREACH_END();
+    sa_clear(tbl);
 }
 
 static void
-mark_const_tbl(rb_objspace_t *objspace, st_table *tbl, int lev)
+mark_const_tbl(rb_objspace_t *objspace, sa_table *tbl, int lev)
 {
-    struct mark_tbl_arg arg;
-    if (!tbl) return;
-    arg.objspace = objspace;
-    arg.lev = lev;
-    st_foreach(tbl, mark_const_entry_i, (st_data_t)&arg);
+    SA_FOREACH_START(tbl);
+    gc_mark(objspace, ((const rb_const_entry_t*)value)->value, lev);
+    SA_FOREACH_END();
 }
 
-static int
-free_const_entry_i(ID key, rb_const_entry_t *ce, st_data_t data)
+void
+rb_free_const_table(sa_table *tbl)
 {
-    xfree(ce);
-    return ST_CONTINUE;
+    SA_FOREACH_START(tbl);
+    xfree((rb_const_entry_t*)value);
+    SA_FOREACH_END();
+    sa_clear(tbl);
 }
 
 void
-rb_free_const_table(st_table *tbl)
+rb_mark_tbl(st_table *tbl)
 {
-    st_foreach(tbl, free_const_entry_i, 0);
-    st_free_table(tbl);
+    mark_tbl(&rb_objspace, tbl, 0);
 }
 
 void
-rb_mark_tbl(st_table *tbl)
+rb_mark_sa_tbl(sa_table *tbl)
 {
-    mark_tbl(&rb_objspace, tbl, 0);
+    mark_sa_tbl(&rb_objspace, tbl, 0);
 }
 
 void
@@ -1622,6 +1792,16 @@ rb_gc_mark_maybe(VALUE obj)
     }
 }
 
+static int
+gc_mark_ptr(rb_objspace_t *objspace, VALUE ptr)
+{
+    register uintptr_t *bits = GET_HEAP_BITMAP(ptr);
+    if (MARKED_IN_BITMAP(bits, ptr)) return 0;
+    MARK_IN_BITMAP(bits, ptr);
+    objspace->heap.live_num++;
+    return 1;
+}
+
 static void
 gc_mark(rb_objspace_t *objspace, VALUE ptr, int lev)
 {
@@ -1630,9 +1810,7 @@ gc_mark(rb_objspace_t *objspace, VALUE ptr, int lev)
     obj = RANY(ptr);
     if (rb_special_const_p(ptr)) return; /* special const not marked */
     if (obj->as.basic.flags == 0) return;       /* free cell */
-    if (obj->as.basic.flags & FL_MARK) return;  /* already marked */
-    obj->as.basic.flags |= FL_MARK;
-    objspace->heap.live_num++;
+    if (!gc_mark_ptr(objspace, ptr)) return;	/* already marked */
 
     if (lev > GC_LEVEL_MAX || (lev == 0 && stack_check(STACKFRAME_FOR_GC_MARK))) {
 	if (!mark_stack_overflow) {
@@ -1659,6 +1837,7 @@ static void
 gc_mark_children(rb_objspace_t *objspace, VALUE ptr, int lev)
 {
     register RVALUE *obj = RANY(ptr);
+    register uintptr_t *bits;
 
     goto marking;		/* skip */
 
@@ -1666,8 +1845,9 @@ gc_mark_children(rb_objspace_t *objspace, VALUE ptr, int lev)
     obj = RANY(ptr);
     if (rb_special_const_p(ptr)) return; /* special const not marked */
     if (obj->as.basic.flags == 0) return;       /* free cell */
-    if (obj->as.basic.flags & FL_MARK) return;  /* already marked */
-    obj->as.basic.flags |= FL_MARK;
+    bits = GET_HEAP_BITMAP(ptr);
+    if (MARKED_IN_BITMAP(bits, ptr)) return;  /* already marked */
+    MARK_IN_BITMAP(bits, ptr);
     objspace->heap.live_num++;
 
   marking:
@@ -1819,10 +1999,10 @@ gc_mark_children(rb_objspace_t *objspace, VALUE ptr, int lev)
       case T_CLASS:
       case T_MODULE:
 	mark_m_tbl(objspace, RCLASS_M_TBL(obj), lev);
-	mark_tbl(objspace, RCLASS_IV_TBL(obj), lev);
+	mark_sa_tbl(objspace, RCLASS_IV_TBL(obj), lev);
 	mark_const_tbl(objspace, RCLASS_CONST_TBL(obj), lev);
 	ptr = RCLASS_SUPER(obj);
-	goto again;
+	goto again; 
 
       case T_ARRAY:
 	if (FL_TEST(obj, ELTS_SHARED)) {
@@ -1929,13 +2109,18 @@ gc_mark_children(rb_objspace_t *objspace, VALUE ptr, int lev)
 
 static int obj_free(rb_objspace_t *, VALUE);
 
-static inline void
-add_freelist(rb_objspace_t *objspace, RVALUE *p)
+static inline struct heaps_slot *
+add_slot_local_freelist(rb_objspace_t *objspace, RVALUE *p)
 {
+    struct heaps_slot *slot;
+
     VALGRIND_MAKE_MEM_UNDEFINED((void*)p, sizeof(RVALUE));
     p->as.free.flags = 0;
-    p->as.free.next = freelist;
-    freelist = p;
+    slot = GET_HEAP_SLOT(p);
+    p->as.free.next = slot->freelist;
+    slot->freelist = p;
+
+    return slot;
 }
 
 static void
@@ -1945,17 +2130,13 @@ finalize_list(rb_objspace_t *objspace, RVALUE *p)
 	RVALUE *tmp = p->as.free.next;
 	run_final(objspace, (VALUE)p);
 	if (!FL_TEST(p, FL_SINGLETON)) { /* not freeing page */
-            if (objspace->heap.sweep_slots) {
-                p->as.free.flags = 0;
-            }
-            else {
+            add_slot_local_freelist(objspace, p);
+            if (!is_lazy_sweeping(objspace)) {
                 GC_PROF_DEC_LIVE_NUM;
-                add_freelist(objspace, p);
             }
 	}
 	else {
-	    struct heaps_slot *slot = (struct heaps_slot *)(VALUE)RDATA(p)->dmark;
-	    slot->limit--;
+            GET_HEAP_HEADER(p)->limit--;
 	}
 	p = tmp;
     }
@@ -1976,22 +2157,23 @@ unlink_heap_slot(rb_objspace_t *objspace, struct heaps_slot *slot)
     slot->next = NULL;
 }
 
-
 static void
 free_unused_heaps(rb_objspace_t *objspace)
 {
     size_t i, j;
-    RVALUE *last = 0;
+    struct heaps_header *last = 0;
 
     for (i = j = 1; j < heaps_used; i++) {
-	if (objspace->heap.sorted[i].slot->limit == 0) {
+	if (objspace->heap.sorted[i]->limit == 0) {
+            struct heaps_slot* h = objspace->heap.sorted[i]->base;
+            h->free_next = objspace->heap.reserve_slots;
+            objspace->heap.reserve_slots = h;
 	    if (!last) {
-		last = objspace->heap.sorted[i].slot->membase;
+                last = objspace->heap.sorted[i];
 	    }
 	    else {
-		free(objspace->heap.sorted[i].slot->membase);
+		aligned_free(objspace->heap.sorted[i]);
 	    }
-            free(objspace->heap.sorted[i].slot);
 	    heaps_used--;
 	}
 	else {
@@ -2003,70 +2185,84 @@ free_unused_heaps(rb_objspace_t *objspace)
     }
     if (last) {
 	if (last < heaps_freed) {
-	    free(heaps_freed);
+	    aligned_free(heaps_freed);
 	    heaps_freed = last;
 	}
 	else {
-	    free(last);
+	    aligned_free(last);
 	}
     }
 }
 
 static void
+gc_clear_slot_bits(struct heaps_slot *slot)
+{
+    memset(slot->bits, 0, HEAP_BITMAP_LIMIT * sizeof(uintptr_t));
+}
+
+static void
 slot_sweep(rb_objspace_t *objspace, struct heaps_slot *sweep_slot)
 {
     size_t free_num = 0, final_num = 0;
     RVALUE *p, *pend;
-    RVALUE *free = freelist, *final = deferred_final_list;
+    RVALUE *final = deferred_final_list;
     int deferred;
+    uintptr_t *bits;
 
-    p = sweep_slot->slot; pend = p + sweep_slot->limit;
+    p = sweep_slot->membase->start; pend = sweep_slot->membase->end;
+    bits = sweep_slot->bits;
     while (p < pend) {
-        if (!(p->as.basic.flags & FL_MARK)) {
-            if (p->as.basic.flags &&
-                ((deferred = obj_free(objspace, (VALUE)p)) ||
-		 (FL_TEST(p, FL_FINALIZE)))) {
-                if (!deferred) {
-                    p->as.free.flags = T_ZOMBIE;
-                    RDATA(p)->dfree = 0;
+        if ((!(MARKED_IN_BITMAP(bits, p))) && BUILTIN_TYPE(p) != T_ZOMBIE) {
+            if (p->as.basic.flags) {
+                if ((deferred = obj_free(objspace, (VALUE)p)) ||
+                    (FL_TEST(p, FL_FINALIZE))) {
+                    if (!deferred) {
+                        p->as.free.flags = T_ZOMBIE;
+                        RDATA(p)->dfree = 0;
+                    }
+                    p->as.free.next = deferred_final_list;
+                    deferred_final_list = p;
+                    assert(BUILTIN_TYPE(p) == T_ZOMBIE);
+                    final_num++;
+                }
+                else {
+                    VALGRIND_MAKE_MEM_UNDEFINED((void*)p, sizeof(RVALUE));
+                    p->as.free.flags = 0;
+                    p->as.free.next = sweep_slot->freelist;
+                    sweep_slot->freelist = p;
+                    free_num++;
                 }
-                p->as.free.flags |= FL_MARK;
-                p->as.free.next = deferred_final_list;
-                deferred_final_list = p;
-                final_num++;
             }
             else {
-                add_freelist(objspace, p);
                 free_num++;
             }
         }
-        else if (BUILTIN_TYPE(p) == T_ZOMBIE) {
-            /* objects to be finalized */
-            /* do nothing remain marked */
-        }
-        else {
-            RBASIC(p)->flags &= ~FL_MARK;
-        }
         p++;
     }
-    if (final_num + free_num == sweep_slot->limit &&
+    gc_clear_slot_bits(sweep_slot);
+    if (final_num + free_num == sweep_slot->membase->limit &&
         objspace->heap.free_num > objspace->heap.do_heap_free) {
         RVALUE *pp;
 
         for (pp = deferred_final_list; pp != final; pp = pp->as.free.next) {
-	    RDATA(pp)->dmark = (void (*)(void *))(VALUE)sweep_slot;
+	    RDATA(pp)->dmark = 0;
             pp->as.free.flags |= FL_SINGLETON; /* freeing page mark */
         }
-        sweep_slot->limit = final_num;
-        freelist = free;	/* cancel this page from freelist */
+        sweep_slot->membase->limit = final_num;
         unlink_heap_slot(objspace, sweep_slot);
     }
     else {
+        if (free_num > 0) {
+            link_free_heap_slot(objspace, sweep_slot);
+        }
+        else {
+            sweep_slot->free_next = NULL;
+        }
         objspace->heap.free_num += free_num;
     }
     objspace->heap.final_num += final_num;
 
-    if (deferred_final_list) {
+    if (deferred_final_list && !finalizing) {
         rb_thread_t *th = GET_THREAD();
         if (th) {
             RUBY_VM_SET_FINALIZER_INTERRUPT(th);
@@ -2078,7 +2274,7 @@ static int
 ready_to_gc(rb_objspace_t *objspace)
 {
     if (dont_gc || during_gc) {
-	if (!freelist) {
+	if (!has_free_object) {
             if (!heaps_increment(objspace)) {
                 set_heaps_increment(objspace);
                 heaps_increment(objspace);
@@ -2092,7 +2288,6 @@ ready_to_gc(rb_objspace_t *objspace)
 static void
 before_gc_sweep(rb_objspace_t *objspace)
 {
-    freelist = 0;
     objspace->heap.do_heap_free = (size_t)((heaps_used * HEAP_OBJ_LIMIT) * 0.65);
     objspace->heap.free_min = (size_t)((heaps_used * HEAP_OBJ_LIMIT)  * 0.2);
     if (objspace->heap.free_min < initial_free_min) {
@@ -2101,6 +2296,7 @@ before_gc_sweep(rb_objspace_t *objspace)
     }
     objspace->heap.sweep_slots = heaps;
     objspace->heap.free_num = 0;
+    objspace->heap.free_slots = NULL;
 
     /* sweep unlinked method entries */
     if (GET_VM()->unlinked_method_entry_list) {
@@ -2137,7 +2333,7 @@ lazy_sweep(rb_objspace_t *objspace)
         next = objspace->heap.sweep_slots->next;
 	slot_sweep(objspace, objspace->heap.sweep_slots);
         objspace->heap.sweep_slots = next;
-        if (freelist) {
+        if (has_free_object) {
             during_gc = 0;
             return TRUE;
         }
@@ -2149,10 +2345,10 @@ static void
 rest_sweep(rb_objspace_t *objspace)
 {
     if (objspace->heap.sweep_slots) {
-       while (objspace->heap.sweep_slots) {
-           lazy_sweep(objspace);
-       }
-       after_gc_sweep(objspace);
+	while (objspace->heap.sweep_slots) {
+	    lazy_sweep(objspace);
+	}
+	after_gc_sweep(objspace);
     }
 }
 
@@ -2199,9 +2395,9 @@ gc_lazy_sweep(rb_objspace_t *objspace)
     }
 
     GC_PROF_SWEEP_TIMER_START;
-    if(!(res = lazy_sweep(objspace))) {
+    if (!(res = lazy_sweep(objspace))) {
         after_gc_sweep(objspace);
-        if(freelist) {
+        if (has_free_object) {
             res = TRUE;
             during_gc = 0;
         }
@@ -2234,12 +2430,17 @@ void
 rb_gc_force_recycle(VALUE p)
 {
     rb_objspace_t *objspace = &rb_objspace;
-    GC_PROF_DEC_LIVE_NUM;
-    if (RBASIC(p)->flags & FL_MARK) {
-        RANY(p)->as.free.flags = 0;
+    struct heaps_slot *slot;
+
+    if (MARKED_IN_BITMAP(GET_HEAP_BITMAP(p), p)) {
+        add_slot_local_freelist(objspace, (RVALUE *)p);
     }
     else {
-        add_freelist(objspace, (RVALUE *)p);
+        GC_PROF_DEC_LIVE_NUM;
+        slot = add_slot_local_freelist(objspace, (RVALUE *)p);
+        if (slot->free_next == NULL) {
+            link_free_heap_slot(objspace, slot);
+        }
     }
 }
 
@@ -2286,15 +2487,11 @@ obj_free(rb_objspace_t *objspace, VALUE obj)
       case T_CLASS:
 	rb_clear_cache_by_class((VALUE)obj);
 	rb_free_m_table(RCLASS_M_TBL(obj));
-	if (RCLASS_IV_TBL(obj)) {
-	    st_free_table(RCLASS_IV_TBL(obj));
-	}
-	if (RCLASS_CONST_TBL(obj)) {
-	    rb_free_const_table(RCLASS_CONST_TBL(obj));
-	}
-	if (RCLASS_IV_INDEX_TBL(obj)) {
-	    st_free_table(RCLASS_IV_INDEX_TBL(obj));
-	}
+        sa_clear(RCLASS_IV_TBL(obj));
+        rb_free_const_table(RCLASS_CONST_TBL(obj));
+        sa_clear(RCLASS_IV_INDEX_TBL(obj));
+        sa_clear(&RCLASS(obj)->cache->m_cache_tbl);
+        xfree(RCLASS(obj)->cache);
         xfree(RANY(obj)->as.klass.ptr);
 	break;
       case T_STRING:
@@ -2346,8 +2543,9 @@ obj_free(rb_objspace_t *objspace, VALUE obj)
       case T_COMPLEX:
 	break;
       case T_ICLASS:
+        sa_clear(&RCLASS(obj)->cache->m_cache_tbl);
+        xfree(RCLASS(obj)->cache);
 	/* iClass shares table with the module */
-	xfree(RANY(obj)->as.klass.ptr);
 	break;
 
       case T_FLOAT:
@@ -2458,7 +2656,7 @@ gc_marks(rb_objspace_t *objspace)
     rb_mark_end_proc();
     rb_gc_mark_global_tbl();
 
-    mark_tbl(objspace, rb_class_tbl, 0);
+    mark_sa_tbl(objspace, &rb_class_tbl, 0);
 
     /* mark generic instance variables for special constants */
     rb_mark_generic_ivar_tbl();
@@ -2611,7 +2809,7 @@ static VALUE
 objspace_each_objects(VALUE arg)
 {
     size_t i;
-    RVALUE *membase = 0;
+    struct heaps_header *membase = 0;
     RVALUE *pstart, *pend;
     rb_objspace_t *objspace = &rb_objspace;
     struct each_obj_args *args = (struct each_obj_args *)arg;
@@ -2619,16 +2817,16 @@ objspace_each_objects(VALUE arg)
 
     i = 0;
     while (i < heaps_used) {
-	while (0 < i && (uintptr_t)membase < (uintptr_t)objspace->heap.sorted[i-1].slot->membase)
+	while (0 < i && membase < objspace->heap.sorted[i-1])
 	    i--;
-	while (i < heaps_used && (uintptr_t)objspace->heap.sorted[i].slot->membase <= (uintptr_t)membase)
+	while (i < heaps_used && objspace->heap.sorted[i] <= membase)
 	    i++;
 	if (heaps_used <= i)
 	  break;
-	membase = objspace->heap.sorted[i].slot->membase;
+	membase = objspace->heap.sorted[i];
 
-	pstart = objspace->heap.sorted[i].slot->slot;
-	pend = pstart + objspace->heap.sorted[i].slot->limit;
+	pstart = membase->start;
+	pend = membase->end;
 
 	for (; pstart != pend; pstart++) {
 	    if (pstart->as.basic.flags) {
@@ -2642,6 +2840,7 @@ objspace_each_objects(VALUE arg)
 	    }
 	}
     }
+    RB_GC_GUARD(v);
 
     return Qnil;
 }
@@ -2885,11 +3084,12 @@ run_single_final(VALUE arg)
 }
 
 static void
-run_finalizer(rb_objspace_t *objspace, VALUE objid, VALUE table)
+run_finalizer(rb_objspace_t *objspace, VALUE obj, VALUE table)
 {
     long i;
     int status;
     VALUE args[3];
+    VALUE objid = nonspecial_obj_id(obj);
 
     if (RARRAY_LEN(table) > 0) {
 	args[1] = rb_obj_freeze(rb_ary_new3(1, objid));
@@ -2913,13 +3113,11 @@ run_finalizer(rb_objspace_t *objspace, VALUE objid, VALUE table)
 static void
 run_final(rb_objspace_t *objspace, VALUE obj)
 {
-    VALUE objid;
     RUBY_DATA_FUNC free_func = 0;
     st_data_t key, table;
 
     objspace->heap.final_num--;
 
-    objid = rb_obj_id(obj);	/* make obj into id */
     RBASIC(obj)->klass = 0;
 
     if (RTYPEDDATA_P(obj)) {
@@ -2934,7 +3132,7 @@ run_final(rb_objspace_t *objspace, VALUE obj)
 
     key = (st_data_t)obj;
     if (st_delete(finalizer_table, &key, &table)) {
-	run_finalizer(objspace, objid, (VALUE)table);
+	run_finalizer(objspace, obj, (VALUE)table);
     }
 }
 
@@ -2952,16 +3150,20 @@ finalize_deferred(rb_objspace_t *objspace)
 void
 rb_gc_finalize_deferred(void)
 {
-    finalize_deferred(&rb_objspace);
+    rb_objspace_t *objspace = &rb_objspace;
+    if (ATOMIC_EXCHANGE(finalizing, 1)) return;
+    finalize_deferred(objspace);
+    ATOMIC_SET(finalizing, 0);
 }
 
 static int
 chain_finalized_object(st_data_t key, st_data_t val, st_data_t arg)
 {
     RVALUE *p = (RVALUE *)key, **final_list = (RVALUE **)arg;
-    if ((p->as.basic.flags & (FL_FINALIZE|FL_MARK)) == FL_FINALIZE) {
+    if ((p->as.basic.flags & FL_FINALIZE) == FL_FINALIZE &&
+        !MARKED_IN_BITMAP(GET_HEAP_BITMAP(p), p)) {
 	if (BUILTIN_TYPE(p) != T_ZOMBIE) {
-	    p->as.free.flags = FL_MARK | T_ZOMBIE; /* remain marked */
+	    p->as.free.flags = T_ZOMBIE;
 	    RDATA(p)->dfree = 0;
 	}
 	p->as.free.next = *final_list;
@@ -3004,6 +3206,8 @@ rb_objspace_call_finalizer(rb_objspace_t *objspace)
     /* run finalizers */
     rest_sweep(objspace);
 
+    if (ATOMIC_EXCHANGE(finalizing, 1)) return;
+
     do {
 	/* XXX: this loop will make no sense */
 	/* because mark will not be removed */
@@ -3018,8 +3222,9 @@ rb_objspace_call_finalizer(rb_objspace_t *objspace)
 	st_foreach(finalizer_table, force_chain_object, (st_data_t)&list);
 	while (list) {
 	    struct force_finalize_list *curr = list;
-	    run_finalizer(objspace, rb_obj_id(curr->obj), curr->table);
-	    st_delete(finalizer_table, (st_data_t*)&curr->obj, 0);
+	    st_data_t obj = (st_data_t)curr->obj;
+	    run_finalizer(objspace, curr->obj, curr->table);
+	    st_delete(finalizer_table, &obj, 0);
 	    list = curr->next;
 	    xfree(curr);
 	}
@@ -3030,7 +3235,7 @@ rb_objspace_call_finalizer(rb_objspace_t *objspace)
 
     /* run data object's finalizers */
     for (i = 0; i < heaps_used; i++) {
-	p = objspace->heap.sorted[i].start; pend = objspace->heap.sorted[i].end;
+	p = objspace->heap.sorted[i]->start; pend = objspace->heap.sorted[i]->end;
 	while (p < pend) {
 	    if (BUILTIN_TYPE(p) == T_DATA &&
 		DATA_PTR(p) && RANY(p)->as.data.dfree &&
@@ -3066,6 +3271,7 @@ rb_objspace_call_finalizer(rb_objspace_t *objspace)
 
     st_free_table(finalizer_table);
     finalizer_table = 0;
+    ATOMIC_SET(finalizing, 0);
 }
 
 void
@@ -3073,10 +3279,42 @@ rb_gc(void)
 {
     rb_objspace_t *objspace = &rb_objspace;
     garbage_collect(objspace);
-    finalize_deferred(objspace);
+    if (!finalizing) finalize_deferred(objspace);
     free_unused_heaps(objspace);
 }
 
+static inline int
+is_id_value(rb_objspace_t *objspace, VALUE ptr)
+{
+    if (!is_pointer_to_heap(objspace, (void *)ptr)) return FALSE;
+    if (BUILTIN_TYPE(ptr) > T_FIXNUM) return FALSE;
+    if (BUILTIN_TYPE(ptr) == T_ICLASS) return FALSE;
+    return TRUE;
+}
+
+static inline int
+is_dead_object(rb_objspace_t *objspace, VALUE ptr)
+{
+    struct heaps_slot *slot = objspace->heap.sweep_slots;
+    if (!is_lazy_sweeping(objspace) || MARKED_IN_BITMAP(GET_HEAP_BITMAP(ptr), ptr))
+	return FALSE;
+    while (slot) {
+	if ((VALUE)slot->membase->start <= ptr && ptr < (VALUE)(slot->membase->end))
+	    return TRUE;
+	slot = slot->next;
+    }
+    return FALSE;
+}
+
+static inline int
+is_live_object(rb_objspace_t *objspace, VALUE ptr)
+{
+    if (BUILTIN_TYPE(ptr) == 0) return FALSE;
+    if (RBASIC(ptr)->klass == 0) return FALSE;
+    if (is_dead_object(objspace, ptr)) return FALSE;
+    return TRUE;
+}
+
 /*
  *  call-seq:
  *     ObjectSpace._id2ref(object_id) -> an_object
@@ -3119,11 +3357,10 @@ id2ref(VALUE obj, VALUE objid)
 	return ID2SYM(symid);
     }
 
-    if (!is_pointer_to_heap(objspace, (void *)ptr) ||
-	BUILTIN_TYPE(ptr) > T_FIXNUM || BUILTIN_TYPE(ptr) == T_ICLASS) {
+    if (!is_id_value(objspace, ptr)) {
 	rb_raise(rb_eRangeError, "%p is not id value", p0);
     }
-    if (BUILTIN_TYPE(ptr) == 0 || RBASIC(ptr)->klass == 0) {
+    if (!is_live_object(objspace, ptr)) {
 	rb_raise(rb_eRangeError, "%p is recycled object", p0);
     }
     return (VALUE)ptr;
@@ -3193,7 +3430,7 @@ rb_obj_id(VALUE obj)
     if (SPECIAL_CONST_P(obj)) {
         return LONG2NUM((SIGNED_VALUE)obj);
     }
-    return (VALUE)((SIGNED_VALUE)obj|FIXNUM_FLAG);
+    return nonspecial_obj_id(obj);
 }
 
 static int
@@ -3236,7 +3473,7 @@ count_objects(int argc, VALUE *argv, VALUE os)
     VALUE hash;
 
     if (rb_scan_args(argc, argv, "01", &hash) == 1) {
-        if (TYPE(hash) != T_HASH)
+        if (!RB_TYPE_P(hash, T_HASH))
             rb_raise(rb_eTypeError, "non-hash given");
     }
 
@@ -3247,7 +3484,7 @@ count_objects(int argc, VALUE *argv, VALUE os)
     for (i = 0; i < heaps_used; i++) {
         RVALUE *p, *pend;
 
-        p = objspace->heap.sorted[i].start; pend = objspace->heap.sorted[i].end;
+        p = objspace->heap.sorted[i]->start; pend = objspace->heap.sorted[i]->end;
         for (;p < pend; p++) {
             if (p->as.basic.flags) {
                 counts[BUILTIN_TYPE(p)]++;
@@ -3256,7 +3493,7 @@ count_objects(int argc, VALUE *argv, VALUE os)
                 freed++;
             }
         }
-        total += objspace->heap.sorted[i].slot->limit;
+        total += objspace->heap.sorted[i]->limit;
     }
 
     if (hash == Qnil) {
@@ -3355,7 +3592,7 @@ gc_stat(int argc, VALUE *argv, VALUE self)
     VALUE hash;
 
     if (rb_scan_args(argc, argv, "01", &hash) == 1) {
-        if (TYPE(hash) != T_HASH)
+        if (!RB_TYPE_P(hash, T_HASH))
             rb_raise(rb_eTypeError, "non-hash given");
     }
 
@@ -3410,6 +3647,33 @@ gc_malloc_allocations(VALUE self)
 }
 #endif
 
+/*
+ *  call-seq:
+ *     GC::Profiler.raw_data -> [Hash, ...]
+ *
+ *  Returns an Array of individual raw profile data Hashes ordered
+ *  from earliest to latest by <tt>:GC_INVOKE_TIME</tt>.  For example:
+ *
+ *    [{:GC_TIME=>1.3000000000000858e-05,
+ *      :GC_INVOKE_TIME=>0.010634999999999999,
+ *      :HEAP_USE_SIZE=>289640,
+ *      :HEAP_TOTAL_SIZE=>588960,
+ *      :HEAP_TOTAL_OBJECTS=>14724,
+ *      :GC_IS_MARKED=>false},
+ *      ...
+ *    ]
+ *
+ *  The keys mean:
+ *
+ *  +:GC_TIME+:: Time taken for this run in milliseconds
+ *  +:GC_INVOKE_TIME+:: Time the GC was invoked since startup in seconds
+ *  +:HEAP_USE_SIZE+:: Bytes of heap used
+ *  +:HEAP_TOTAL_SIZE+:: Size of heap in bytes
+ *  +:HEAP_TOTAL_OBJECTS+:: Number of objects
+ *  +:GC_IS_MARKED+:: Is the GC in the mark phase
+ *
+ */
+
 static VALUE
 gc_profile_record_get(void)
 {
@@ -3602,6 +3866,7 @@ Init_GC(void)
     rb_mProfiler = rb_define_module_under(rb_mGC, "Profiler");
     rb_define_singleton_method(rb_mProfiler, "enabled?", gc_profile_enable_get, 0);
     rb_define_singleton_method(rb_mProfiler, "enable", gc_profile_enable, 0);
+    rb_define_singleton_method(rb_mProfiler, "raw_data", gc_profile_record_get, 0);
     rb_define_singleton_method(rb_mProfiler, "disable", gc_profile_disable, 0);
     rb_define_singleton_method(rb_mProfiler, "clear", gc_profile_clear, 0);
     rb_define_singleton_method(rb_mProfiler, "result", gc_profile_result, 0);
diff --git a/hash.c b/hash.c
index fbd8237..4cb2e2d 100644
--- a/hash.c
+++ b/hash.c
@@ -44,7 +44,7 @@ rb_any_cmp(VALUE a, VALUE b)
     if (FIXNUM_P(a) && FIXNUM_P(b)) {
 	return a != b;
     }
-    if (TYPE(a) == T_STRING && RBASIC(a)->klass == rb_cString &&
+    if (RB_TYPE_P(a, T_STRING) && RBASIC(a)->klass == rb_cString &&
 	TYPE(b) == T_STRING && RBASIC(b)->klass == rb_cString) {
 	return rb_str_hash_cmp(a, b);
     }
@@ -80,20 +80,14 @@ rb_any_hash(VALUE a)
     VALUE hval;
     st_index_t hnum;
 
-    switch (TYPE(a)) {
-      case T_FIXNUM:
-      case T_SYMBOL:
-      case T_NIL:
-      case T_FALSE:
-      case T_TRUE:
-	hnum = rb_hash_end(rb_hash_start((unsigned int)a));
-	break;
-
-      case T_STRING:
+    if (SPECIAL_CONST_P(a)) {
+	if (a == Qundef) return 0;
+	hnum = rb_hash_end(rb_hash_start((st_index_t)a));
+    }
+    else if (BUILTIN_TYPE(a) == T_STRING) {
 	hnum = rb_str_hash(a);
-	break;
-
-      default:
+    }
+    else {
         hval = rb_hash(a);
 	hnum = FIX2LONG(hval);
     }
@@ -106,10 +100,8 @@ static const struct st_hash_type objhash = {
     rb_any_hash,
 };
 
-static const struct st_hash_type identhash = {
-    st_numcmp,
-    st_numhash,
-};
+extern const struct st_hash_type st_hashtype_num;
+#define identhash st_hashtype_num
 
 typedef int st_foreach_func(st_data_t, st_data_t, st_data_t);
 
@@ -124,7 +116,6 @@ foreach_safe_i(st_data_t key, st_data_t value, struct foreach_safe_arg *arg)
 {
     int status;
 
-    if (key == Qundef) return ST_CONTINUE;
     status = (*arg->func)(key, value, arg->arg);
     if (status == ST_CONTINUE) {
 	return ST_CHECK;
@@ -140,7 +131,7 @@ st_foreach_safe(st_table *table, int (*func)(ANYARGS), st_data_t a)
     arg.tbl = table;
     arg.func = (st_foreach_func *)func;
     arg.arg = a;
-    if (st_foreach(table, foreach_safe_i, (st_data_t)&arg)) {
+    if (st_foreach_check(table, foreach_safe_i, (st_data_t)&arg, 0)) {
 	rb_raise(rb_eRuntimeError, "hash modified during iteration");
     }
 }
@@ -154,21 +145,21 @@ struct hash_foreach_arg {
 };
 
 static int
-hash_foreach_iter(st_data_t key, st_data_t value, struct hash_foreach_arg *arg)
+hash_foreach_iter(st_data_t key, st_data_t value, st_data_t argp)
 {
+    struct hash_foreach_arg *arg = (struct hash_foreach_arg *)argp;
     int status;
     st_table *tbl;
 
     tbl = RHASH(arg->hash)->ntbl;
-    if ((VALUE)key == Qundef) return ST_CONTINUE;
     status = (*arg->func)((VALUE)key, (VALUE)value, arg->arg);
     if (RHASH(arg->hash)->ntbl != tbl) {
 	rb_raise(rb_eRuntimeError, "rehash occurred during iteration");
     }
     switch (status) {
       case ST_DELETE:
-	st_delete_safe(tbl, &key, 0, Qundef);
 	FL_SET(arg->hash, HASH_DELETED);
+	return ST_DELETE;
       case ST_CONTINUE:
 	break;
       case ST_STOP:
@@ -184,7 +175,7 @@ hash_foreach_ensure(VALUE hash)
 
     if (RHASH(hash)->iter_lev == 0) {
 	if (FL_TEST(hash, HASH_DELETED)) {
-	    st_cleanup_safe(RHASH(hash)->ntbl, Qundef);
+	    st_cleanup_safe(RHASH(hash)->ntbl, (st_data_t)Qundef);
 	    FL_UNSET(hash, HASH_DELETED);
 	}
     }
@@ -192,9 +183,10 @@ hash_foreach_ensure(VALUE hash)
 }
 
 static VALUE
-hash_foreach_call(struct hash_foreach_arg *arg)
+hash_foreach_call(VALUE arg)
 {
-    if (st_foreach(RHASH(arg->hash)->ntbl, hash_foreach_iter, (st_data_t)arg)) {
+    VALUE hash = ((struct hash_foreach_arg *)arg)->hash;
+    if (st_foreach_check(RHASH(hash)->ntbl, hash_foreach_iter, (st_data_t)arg, (st_data_t)Qundef)) {
 	rb_raise(rb_eRuntimeError, "hash modified during iteration");
     }
     return Qnil;
@@ -447,7 +439,7 @@ rb_hash_rehash_i(VALUE key, VALUE value, VALUE arg)
 {
     st_table *tbl = (st_table *)arg;
 
-    if (key != Qundef) st_insert(tbl, key, value);
+    st_insert(tbl, (st_data_t)key, (st_data_t)value);
     return ST_CONTINUE;
 }
 
@@ -490,6 +482,20 @@ rb_hash_rehash(VALUE hash)
     return hash;
 }
 
+static VALUE
+hash_default_value(VALUE hash, VALUE key)
+{
+    if (rb_method_basic_definition_p(CLASS_OF(hash), id_default)) {
+	VALUE ifnone = RHASH_IFNONE(hash);
+	if (!FL_TEST(hash, HASH_PROC_DEFAULT)) return ifnone;
+	if (key == Qundef) return Qnil;
+	return rb_funcall(ifnone, id_yield, 2, hash, key);
+    }
+    else {
+	return rb_funcall(hash, id_default, 1, key);
+    }
+}
+
 /*
  *  call-seq:
  *     hsh[key]    ->  value
@@ -510,13 +516,7 @@ rb_hash_aref(VALUE hash, VALUE key)
     st_data_t val;
 
     if (!RHASH(hash)->ntbl || !st_lookup(RHASH(hash)->ntbl, key, &val)) {
-	if (!FL_TEST(hash, HASH_PROC_DEFAULT) &&
-	    rb_method_basic_definition_p(CLASS_OF(hash), id_default)) {
-	    return RHASH_IFNONE(hash);
-	}
-	else {
-	    return rb_funcall(hash, id_default, 1, key);
-	}
+	return hash_default_value(hash, key);
     }
     return (VALUE)val;
 }
@@ -659,7 +659,7 @@ rb_hash_default(int argc, VALUE *argv, VALUE hash)
 static VALUE
 rb_hash_set_default(VALUE hash, VALUE ifnone)
 {
-    rb_hash_modify(hash);
+    rb_hash_modify_check(hash);
     RHASH_IFNONE(hash) = ifnone;
     FL_UNSET(hash, HASH_PROC_DEFAULT);
     return ifnone;
@@ -707,7 +707,7 @@ rb_hash_set_default_proc(VALUE hash, VALUE proc)
 {
     VALUE b;
 
-    rb_hash_modify(hash);
+    rb_hash_modify_check(hash);
     b = rb_check_convert_type(proc, T_DATA, "Proc", "to_proc");
     if (NIL_P(b) || !rb_obj_is_proc(b)) {
 	rb_raise(rb_eTypeError,
@@ -776,7 +776,7 @@ rb_hash_delete_key(VALUE hash, VALUE key)
     if (!RHASH(hash)->ntbl)
         return Qundef;
     if (RHASH(hash)->iter_lev > 0) {
-	if (st_delete_safe(RHASH(hash)->ntbl, &ktmp, &val, Qundef)) {
+	if (st_delete_safe(RHASH(hash)->ntbl, &ktmp, &val, (st_data_t)Qundef)) {
 	    FL_SET(hash, HASH_DELETED);
 	    return (VALUE)val;
 	}
@@ -809,7 +809,7 @@ rb_hash_delete(VALUE hash, VALUE key)
 {
     VALUE val;
 
-    rb_hash_modify(hash);
+    rb_hash_modify_check(hash);
     val = rb_hash_delete_key(hash, key);
     if (val != Qundef) return val;
     if (rb_block_given_p()) {
@@ -828,7 +828,6 @@ shift_i(VALUE key, VALUE value, VALUE arg)
 {
     struct shift_var *var = (struct shift_var *)arg;
 
-    if (key == Qundef) return ST_CONTINUE;
     if (var->key != Qundef) return ST_STOP;
     var->key = key;
     var->val = value;
@@ -840,7 +839,6 @@ shift_i_safe(VALUE key, VALUE value, VALUE arg)
 {
     struct shift_var *var = (struct shift_var *)arg;
 
-    if (key == Qundef) return ST_CONTINUE;
     var->key = key;
     var->val = value;
     return ST_STOP;
@@ -864,29 +862,25 @@ rb_hash_shift(VALUE hash)
 {
     struct shift_var var;
 
-    rb_hash_modify(hash);
-    var.key = Qundef;
-    rb_hash_foreach(hash, RHASH(hash)->iter_lev > 0 ? shift_i_safe : shift_i,
-		    (VALUE)&var);
-
-    if (var.key != Qundef) {
-	if (RHASH(hash)->iter_lev > 0) {
-	    rb_hash_delete_key(hash, var.key);
+    rb_hash_modify_check(hash);
+    if (RHASH(hash)->ntbl) {
+	var.key = Qundef;
+	rb_hash_foreach(hash, RHASH(hash)->iter_lev > 0 ? shift_i_safe : shift_i,
+			(VALUE)&var);
+
+	if (var.key != Qundef) {
+	    if (RHASH(hash)->iter_lev > 0) {
+		rb_hash_delete_key(hash, var.key);
+	    }
+	    return rb_assoc_new(var.key, var.val);
 	}
-	return rb_assoc_new(var.key, var.val);
-    }
-    else if (FL_TEST(hash, HASH_PROC_DEFAULT)) {
-	return rb_funcall(RHASH_IFNONE(hash), id_yield, 2, hash, Qnil);
-    }
-    else {
-	return RHASH_IFNONE(hash);
     }
+    return hash_default_value(hash, Qnil);
 }
 
 static int
 delete_if_i(VALUE key, VALUE value, VALUE hash)
 {
-    if (key == Qundef) return ST_CONTINUE;
     if (RTEST(rb_yield_values(2, key, value))) {
 	rb_hash_delete_key(hash, key);
     }
@@ -912,8 +906,9 @@ VALUE
 rb_hash_delete_if(VALUE hash)
 {
     RETURN_ENUMERATOR(hash, 0, 0);
-    rb_hash_modify(hash);
-    rb_hash_foreach(hash, delete_if_i, hash);
+    rb_hash_modify_check(hash);
+    if (RHASH(hash)->ntbl)
+	rb_hash_foreach(hash, delete_if_i, hash);
     return hash;
 }
 
@@ -984,7 +979,6 @@ rb_hash_values_at(int argc, VALUE *argv, VALUE hash)
 static int
 select_i(VALUE key, VALUE value, VALUE result)
 {
-    if (key == Qundef) return ST_CONTINUE;
     if (RTEST(rb_yield_values(2, key, value)))
 	rb_hash_aset(result, key, value);
     return ST_CONTINUE;
@@ -1018,7 +1012,6 @@ rb_hash_select(VALUE hash)
 static int
 keep_if_i(VALUE key, VALUE value, VALUE hash)
 {
-    if (key == Qundef) return ST_CONTINUE;
     if (!RTEST(rb_yield_values(2, key, value))) {
 	return ST_DELETE;
     }
@@ -1040,7 +1033,7 @@ rb_hash_select_bang(VALUE hash)
     st_index_t n;
 
     RETURN_ENUMERATOR(hash, 0, 0);
-    rb_hash_modify(hash);
+    rb_hash_modify_check(hash);
     if (!RHASH(hash)->ntbl)
         return Qnil;
     n = RHASH(hash)->ntbl->num_entries;
@@ -1065,8 +1058,9 @@ VALUE
 rb_hash_keep_if(VALUE hash)
 {
     RETURN_ENUMERATOR(hash, 0, 0);
-    rb_hash_modify(hash);
-    rb_hash_foreach(hash, keep_if_i, hash);
+    rb_hash_modify_check(hash);
+    if (RHASH(hash)->ntbl)
+	rb_hash_foreach(hash, keep_if_i, hash);
     return hash;
 }
 
@@ -1087,7 +1081,7 @@ clear_i(VALUE key, VALUE value, VALUE dummy)
  *
  */
 
-static VALUE
+VALUE
 rb_hash_clear(VALUE hash)
 {
     rb_hash_modify_check(hash);
@@ -1144,9 +1138,7 @@ rb_hash_aset(VALUE hash, VALUE key, VALUE val)
 static int
 replace_i(VALUE key, VALUE val, VALUE hash)
 {
-    if (key != Qundef) {
-	rb_hash_aset(hash, key, val);
-    }
+    rb_hash_aset(hash, key, val);
 
     return ST_CONTINUE;
 }
@@ -1227,7 +1219,6 @@ rb_hash_empty_p(VALUE hash)
 static int
 each_value_i(VALUE key, VALUE value)
 {
-    if (key == Qundef) return ST_CONTINUE;
     rb_yield(value);
     return ST_CONTINUE;
 }
@@ -1262,7 +1253,6 @@ rb_hash_each_value(VALUE hash)
 static int
 each_key_i(VALUE key, VALUE value)
 {
-    if (key == Qundef) return ST_CONTINUE;
     rb_yield(key);
     return ST_CONTINUE;
 }
@@ -1296,7 +1286,6 @@ rb_hash_each_key(VALUE hash)
 static int
 each_pair_i(VALUE key, VALUE value)
 {
-    if (key == Qundef) return ST_CONTINUE;
     rb_yield(rb_assoc_new(key, value));
     return ST_CONTINUE;
 }
@@ -1334,7 +1323,6 @@ rb_hash_each_pair(VALUE hash)
 static int
 to_a_i(VALUE key, VALUE value, VALUE ary)
 {
-    if (key == Qundef) return ST_CONTINUE;
     rb_ary_push(ary, rb_assoc_new(key, value));
     return ST_CONTINUE;
 }
@@ -1367,7 +1355,6 @@ inspect_i(VALUE key, VALUE value, VALUE str)
 {
     VALUE str2;
 
-    if (key == Qundef) return ST_CONTINUE;
     str2 = rb_inspect(key);
     if (RSTRING_LEN(str) > 1) {
 	rb_str_cat2(str, ", ");
@@ -1434,7 +1421,6 @@ rb_hash_to_hash(VALUE hash)
 static int
 keys_i(VALUE key, VALUE value, VALUE ary)
 {
-    if (key == Qundef) return ST_CONTINUE;
     rb_ary_push(ary, key);
     return ST_CONTINUE;
 }
@@ -1465,7 +1451,6 @@ rb_hash_keys(VALUE hash)
 static int
 values_i(VALUE key, VALUE value, VALUE ary)
 {
-    if (key == Qundef) return ST_CONTINUE;
     rb_ary_push(ary, value);
     return ST_CONTINUE;
 }
@@ -1524,7 +1509,6 @@ rb_hash_search_value(VALUE key, VALUE value, VALUE arg)
 {
     VALUE *data = (VALUE *)arg;
 
-    if (key == Qundef) return ST_CONTINUE;
     if (rb_equal(value, data[1])) {
 	data[0] = Qtrue;
 	return ST_STOP;
@@ -1568,7 +1552,6 @@ eql_i(VALUE key, VALUE val1, VALUE arg)
     struct equal_data *data = (struct equal_data *)arg;
     st_data_t val2;
 
-    if (key == Qundef) return ST_CONTINUE;
     if (!st_lookup(data->tbl, key, &val2)) {
 	data->result = Qfalse;
 	return ST_STOP;
@@ -1599,7 +1582,7 @@ hash_equal(VALUE hash1, VALUE hash2, int eql)
     struct equal_data data;
 
     if (hash1 == hash2) return Qtrue;
-    if (TYPE(hash2) != T_HASH) {
+    if (!RB_TYPE_P(hash2, T_HASH)) {
 	if (!rb_respond_to(hash2, rb_intern("to_hash"))) {
 	    return Qfalse;
 	}
@@ -1670,7 +1653,6 @@ hash_i(VALUE key, VALUE val, VALUE arg)
     st_index_t *hval = (st_index_t *)arg;
     st_index_t hdata[2];
 
-    if (key == Qundef) return ST_CONTINUE;
     hdata[0] = rb_hash(key);
     hdata[1] = rb_hash(val);
     *hval ^= st_hash(hdata, sizeof(hdata), 0);
@@ -1711,7 +1693,6 @@ rb_hash_hash(VALUE hash)
 static int
 rb_hash_invert_i(VALUE key, VALUE value, VALUE hash)
 {
-    if (key == Qundef) return ST_CONTINUE;
     rb_hash_aset(hash, value, key);
     return ST_CONTINUE;
 }
@@ -1740,7 +1721,6 @@ rb_hash_invert(VALUE hash)
 static int
 rb_hash_update_i(VALUE key, VALUE value, VALUE hash)
 {
-    if (key == Qundef) return ST_CONTINUE;
     hash_update(hash, key);
     st_insert(RHASH(hash)->ntbl, key, value);
     return ST_CONTINUE;
@@ -1749,7 +1729,6 @@ rb_hash_update_i(VALUE key, VALUE value, VALUE hash)
 static int
 rb_hash_update_block_i(VALUE key, VALUE value, VALUE hash)
 {
-    if (key == Qundef) return ST_CONTINUE;
     if (rb_hash_has_key(hash, key)) {
 	value = rb_yield_values(3, key, rb_hash_aref(hash, key), value);
     }
@@ -1806,7 +1785,6 @@ rb_hash_update_func_i(VALUE key, VALUE value, VALUE arg0)
     struct update_arg *arg = (struct update_arg *)arg0;
     VALUE hash = arg->hash;
 
-    if (key == Qundef) return ST_CONTINUE;
     if (rb_hash_has_key(hash, key)) {
 	value = (*arg->func)(key, rb_hash_aref(hash, key), value);
     }
@@ -1863,7 +1841,6 @@ assoc_i(VALUE key, VALUE val, VALUE arg)
 {
     VALUE *args = (VALUE *)arg;
 
-    if (key == Qundef) return ST_CONTINUE;
     if (RTEST(rb_equal(args[0], key))) {
 	args[1] = rb_assoc_new(key, val);
 	return ST_STOP;
@@ -1901,7 +1878,6 @@ rassoc_i(VALUE key, VALUE val, VALUE arg)
 {
     VALUE *args = (VALUE *)arg;
 
-    if (key == Qundef) return ST_CONTINUE;
     if (RTEST(rb_equal(args[0], val))) {
 	args[1] = rb_assoc_new(key, val);
 	return ST_STOP;
@@ -2198,7 +2174,7 @@ rb_env_path_tainted(void)
 }
 
 #if defined(_WIN32) || (defined(HAVE_SETENV) && defined(HAVE_UNSETENV))
-#elif defined __sun__
+#elif defined __sun
 static int
 in_origenv(const char *str)
 {
@@ -2286,7 +2262,7 @@ ruby_setenv(const char *name, const char *value)
 	    rb_sys_fail("unsetenv");
 #endif
     }
-#elif defined __sun__
+#elif defined __sun
     size_t len;
     char **env_ptr, *str;
     if (strchr(name, '=')) {
@@ -3084,11 +3060,9 @@ env_invert(void)
 static int
 env_replace_i(VALUE key, VALUE val, VALUE keys)
 {
-    if (key != Qundef) {
-	env_aset(Qnil, key, val);
-	if (rb_ary_includes(keys, key)) {
-	    rb_ary_delete(keys, key);
-	}
+    env_aset(Qnil, key, val);
+    if (rb_ary_includes(keys, key)) {
+	rb_ary_delete(keys, key);
     }
     return ST_CONTINUE;
 }
@@ -3120,12 +3094,10 @@ env_replace(VALUE env, VALUE hash)
 static int
 env_update_i(VALUE key, VALUE val)
 {
-    if (key != Qundef) {
-	if (rb_block_given_p()) {
-	    val = rb_yield_values(3, key, rb_f_getenv(Qnil, key), val);
-	}
-	env_aset(Qnil, key, val);
+    if (rb_block_given_p()) {
+	val = rb_yield_values(3, key, rb_f_getenv(Qnil, key), val);
     }
+    env_aset(Qnil, key, val);
     return ST_CONTINUE;
 }
 
@@ -3150,15 +3122,116 @@ env_update(VALUE env, VALUE hash)
 }
 
 /*
- *  A <code>Hash</code> is a collection of key-value pairs. It is
- *  similar to an <code>Array</code>, except that indexing is done via
- *  arbitrary keys of any object type, not an integer index. Hashes enumerate
- *  their values in the order that the corresponding keys were inserted.
+ *  A Hash is a dictionary-like collection of unique keys and their values.
+ *  Also called associative arrays, they are similar to Arrays, but where an
+ *  Array uses integers as its index, a Hash allows you to use any object
+ *  type.
+ *
+ *  Hashes enumerate their values in the order that the corresponding keys
+ *  were inserted.
+ *
+ *  A Hash can be easily created by using its implicit form:
+ *
+ *    grades = { "Jane Doe" => 10, "Jim Doe" => 6 }
+ *
+ *  Hashes allow an alternate syntax form when your keys are always symbols.
+ *  Instead of
+ *
+ *    options = { :font_size => 10, :font_family => "Arial" }
+ *
+ *  You could write it as:
+ *
+ *    options = { font_size: 10, font_family: "Arial" }
+ *
+ *  Each named key is a symbol you can access in hash:
+ *
+ *    options[:font_size]  # => 10
+ *
+ *  A Hash can also be created through its ::new method:
+ *
+ *    grades = Hash.new
+ *    grades["Dorothy Doe"] = 9
  *
  *  Hashes have a <em>default value</em> that is returned when accessing
- *  keys that do not exist in the hash. By default, that value is
- *  <code>nil</code>.
+ *  keys that do not exist in the hash. If no default is set +nil+ is used.
+ *  You can set the default value by sending it as an argument to Hash.new:
+ *
+ *    grades = Hash.new(0)
+ *
+ *  Or by using the #default= method:
+ *
+ *    grades = {"Timmy Doe" => 8}
+ *    grades.default = 0
+ *
+ *  Accessing a value in a Hash requires using its key:
+ *
+ *    puts grades["Jane Doe"] # => 10
+ *
+ *  === Common Uses
+ *
+ *  Hashes are an easy way to represent data structures, such as
+ *
+ *    books         = {}
+ *    books[:matz]  = "The Ruby Language"
+ *    books[:black] = "The Well-Grounded Rubyist"
+ *
+ *  Hashes are also commonly used as a way to have named parameters in
+ *  functions. Note that no brackets are used below. If a hash is the last
+ *  argument on a method call, no braces are needed, thus creating a really
+ *  clean interface:
+ *
+ *    Person.create(name: "John Doe", age: 27)
+ *
+ *    def self.create(params)
+ *      @name = params[:name]
+ *      @age  = params[:age]
+ *    end
+ *
+ *  === Hash Keys
+ *
+ *  Two objects refer to the same hash key when their <code>hash</code> value
+ *  is identical and the two objects are <code>eql?</code> to each other.
+ *
+ *  A user-defined class may be used as a hash key if the <code>hash</code>
+ *  and <code>eql?</code> methods are overridden to provide meaningful
+ *  behavior.  By default, separate instances refer to separate hash keys.
+ *
+ *  A typical implementation of <code>hash</code> is based on the
+ *  object's data while <code>eql?</code> is usually aliased to the overridden
+ *  <code>==</code> method:
+ *
+ *    class Book
+ *      attr_reader :author, :title
+ *
+ *      def initialize(author, title)
+ *        @author = author
+ *        @title = title
+ *      end
+ *
+ *      def ==(other)
+ *        self.class === other and
+ *          other.author == @author and
+ *          other.title == @title
+ *      end
+ *
+ *      alias eql? ==
+ *
+ *      def hash
+ *        @author.hash ^ @title.hash # XOR
+ *      end
+ *    end
+ *
+ *    book1 = Book.new 'matz', 'Ruby in a Nutshell'
+ *    book2 = Book.new 'matz', 'Ruby in a Nutshell'
+ *
+ *    reviews = {}
+ *
+ *    reviews[book1] = 'Great reference!'
+ *    reviews[book2] = 'Nice and compact!'
+ *
+ *    reviews.length #=> 1
  *
+ *  See also Object#hash and Object#eql?
  */
 
 void
diff --git a/include/ruby/intern.h b/include/ruby/intern.h
index 927b536..9be68de 100644
--- a/include/ruby/intern.h
+++ b/include/ruby/intern.h
@@ -56,6 +56,7 @@ VALUE rb_ary_tmp_new(long);
 void rb_ary_free(VALUE);
 void rb_ary_modify(VALUE);
 VALUE rb_ary_freeze(VALUE);
+VALUE rb_ary_dup_of_p(VALUE, VALUE);
 VALUE rb_ary_aref(int, VALUE*, VALUE);
 VALUE rb_ary_subseq(VALUE, long, long);
 void rb_ary_store(VALUE, long, VALUE);
@@ -413,6 +414,7 @@ size_t ruby_stack_length(VALUE**);
 int rb_during_gc(void);
 void rb_gc_mark_locations(VALUE*, VALUE*);
 void rb_mark_tbl(struct st_table*);
+void rb_mark_sa_tbl(sa_table*);
 void rb_mark_set(struct st_table*);
 void rb_mark_hash(struct st_table*);
 void rb_gc_mark_maybe(VALUE);
@@ -440,6 +442,7 @@ VALUE rb_hash_lookup(VALUE, VALUE);
 VALUE rb_hash_lookup2(VALUE, VALUE, VALUE);
 VALUE rb_hash_fetch(VALUE, VALUE);
 VALUE rb_hash_aset(VALUE, VALUE, VALUE);
+VALUE rb_hash_clear(VALUE);
 VALUE rb_hash_delete_if(VALUE);
 VALUE rb_hash_delete(VALUE,VALUE);
 typedef VALUE rb_hash_update_func(VALUE newkey, VALUE oldkey, VALUE value);
@@ -843,7 +846,7 @@ VALUE rb_f_trace_var(int, VALUE*);
 VALUE rb_f_untrace_var(int, VALUE*);
 VALUE rb_f_global_variables(void);
 void rb_alias_variable(ID, ID);
-struct st_table* rb_generic_ivar_table(VALUE);
+sa_table* rb_generic_ivar_table(VALUE);
 void rb_copy_generic_ivar(VALUE,VALUE);
 void rb_mark_generic_ivar(VALUE);
 void rb_mark_generic_ivar_tbl(void);
diff --git a/include/ruby/ruby.h b/include/ruby/ruby.h
index 2f97b33..1c84e14 100644
--- a/include/ruby/ruby.h
+++ b/include/ruby/ruby.h
@@ -605,7 +605,7 @@ struct RObject {
 	struct {
 	    long numiv;
 	    VALUE *ivptr;
-            struct st_table *iv_index_tbl; /* shortcut for RCLASS_IV_INDEX_TBL(rb_obj_class(obj)) */
+            struct sa_table *iv_index_tbl; /* shortcut for RCLASS_IV_INDEX_TBL(rb_obj_class(obj)) */
 	} heap;
 	VALUE ary[ROBJECT_EMBED_LEN_MAX];
     } as;
@@ -626,12 +626,13 @@ struct RObject {
 
 /** @internal */
 typedef struct rb_classext_struct rb_classext_t;
+typedef struct rb_class_cache_struct rb_class_cache_t;
 
 struct RClass {
     struct RBasic basic;
+    VALUE super;
     rb_classext_t *ptr;
-    struct st_table *m_tbl;
-    struct st_table *iv_index_tbl;
+    rb_class_cache_t *cache;
 };
 #define RCLASS_SUPER(c) rb_class_get_superclass(c)
 #define RMODULE_IV_TBL(m) RCLASS_IV_TBL(m)
diff --git a/include/ruby/st.h b/include/ruby/st.h
index 50f2a75..aff94fc 100644
--- a/include/ruby/st.h
+++ b/include/ruby/st.h
@@ -36,7 +36,7 @@ typedef unsigned long st_data_t;
 #elif SIZEOF_LONG_LONG == SIZEOF_VOIDP
 typedef unsigned LONG_LONG st_data_t;
 #else
-# error ---->> st.c requires sizeof(void*) == sizeof(long) to be compiled. <<----
+# error ---->> st.c requires sizeof(void*) == sizeof(long) or sizeof(LONG_LONG) to be compiled. <<----
 #endif
 #define ST_DATA_T_DEFINED
 
@@ -74,6 +74,11 @@ struct st_hash_type {
 
 #define ST_INDEX_BITS (sizeof(st_index_t) * CHAR_BIT)
 
+typedef struct st_packed_entry {
+    st_index_t hash;
+    st_data_t key, val;
+} st_packed_entry;
+
 struct st_table {
     const struct st_hash_type *type;
     st_index_t num_bins;
@@ -91,8 +96,17 @@ struct st_table {
     __extension__
 #endif
     st_index_t num_entries : ST_INDEX_BITS - 1;
-    struct st_table_entry **bins;
-    struct st_table_entry *head, *tail;
+    union {
+	struct {
+	    struct st_table_entry **bins;
+	    struct st_table_entry *head, *tail;
+	} big;
+	struct {
+	    struct st_packed_entry *entries;
+	    st_index_t real_entries;
+	} packed;
+	st_packed_entry upacked;
+    } as;
 };
 
 #define st_is_member(table,key) st_lookup((table),(key),(st_data_t *)0)
@@ -114,6 +128,7 @@ int st_insert2(st_table *, st_data_t, st_data_t, st_data_t (*)(st_data_t));
 int st_lookup(st_table *, st_data_t, st_data_t *);
 int st_get_key(st_table *, st_data_t, st_data_t *);
 int st_foreach(st_table *, int (*)(ANYARGS), st_data_t);
+int st_foreach_check(st_table *, int (*)(ANYARGS), st_data_t, st_data_t);
 int st_reverse_foreach(st_table *, int (*)(ANYARGS), st_data_t);
 void st_add_direct(st_table *, st_data_t, st_data_t);
 void st_free_table(st_table *);
@@ -136,6 +151,51 @@ st_index_t st_hash_start(st_index_t h);
 #pragma GCC visibility pop
 #endif
 
+typedef unsigned int sa_index_t;
+#define SA_STOP     ST_STOP
+#define SA_CONTINUE ST_CONTINUE
+
+#define SA_EMPTY   0
+
+typedef struct sa_entry {
+    sa_index_t next;
+    sa_index_t key;
+    st_data_t value;
+} sa_entry;
+
+typedef struct sa_table {
+    sa_index_t num_bins;
+    sa_index_t num_entries;
+    sa_index_t free_pos;
+    sa_entry *entries;
+} sa_table;
+
+#define SA_EMPTY_TABLE {0, 0, 0, 0};
+void sa_init_table(sa_table *, sa_index_t);
+sa_table *sa_new_table();
+int  sa_insert(sa_table *, sa_index_t, st_data_t);
+int  sa_lookup(sa_table *, sa_index_t, st_data_t *);
+int  sa_delete(sa_table *, sa_index_t, st_data_t *);
+void sa_clear(sa_table *);
+void sa_clear_no_free(sa_table *);
+void sa_free_table(sa_table *);
+int  sa_foreach(sa_table *, int (*)(ANYARGS), st_data_t);
+size_t sa_memsize(const sa_table *);
+sa_table *sa_copy(sa_table*);
+void sa_copy_to(sa_table*, sa_table*);
+typedef int (*sa_iter_func)(sa_index_t key, st_data_t val, st_data_t arg);
+
+#define SA_FOREACH_START_I(table, entry) do { \
+    sa_table *T##entry = (table); \
+    sa_index_t K##entry; \
+    for(K##entry = 0; K##entry < T##entry->num_bins; K##entry++) { \
+	sa_entry *entry = T##entry->entries + K##entry; \
+	if (entry->next != SA_EMPTY) { \
+	    st_data_t value = entry->value
+#define SA_FOREACH_END() } } } while(0)
+
+#define SA_FOREACH_START(table) SA_FOREACH_START_I(table, entry)
+
 #if defined(__cplusplus)
 #if 0
 { /* satisfy cc-mode */
diff --git a/internal.h b/internal.h
index 59c9284..4af90b6 100644
--- a/internal.h
+++ b/internal.h
@@ -24,18 +24,24 @@ struct rb_deprecated_classext_struct {
 };
 
 struct rb_classext_struct {
-    VALUE super;
-    struct st_table *iv_tbl;
-    struct st_table *const_tbl;
+    sa_table m_tbl;
+    sa_table iv_tbl;
+    sa_table const_tbl;
+    sa_table iv_index_tbl;
+};
+
+struct rb_class_cache_struct {
+    VALUE method_cache_version;
+    sa_table m_cache_tbl;
 };
 
 #undef RCLASS_SUPER
 #define RCLASS_EXT(c) (RCLASS(c)->ptr)
-#define RCLASS_SUPER(c) (RCLASS_EXT(c)->super)
-#define RCLASS_IV_TBL(c) (RCLASS_EXT(c)->iv_tbl)
-#define RCLASS_CONST_TBL(c) (RCLASS_EXT(c)->const_tbl)
-#define RCLASS_M_TBL(c) (RCLASS(c)->m_tbl)
-#define RCLASS_IV_INDEX_TBL(c) (RCLASS(c)->iv_index_tbl)
+#define RCLASS_SUPER(c) (RCLASS(c)->super)
+#define RCLASS_IV_TBL(c) (&RCLASS_EXT(c)->iv_tbl)
+#define RCLASS_CONST_TBL(c) (&RCLASS_EXT(c)->const_tbl)
+#define RCLASS_M_TBL(c) (&RCLASS_EXT(c)->m_tbl)
+#define RCLASS_IV_INDEX_TBL(c) (&RCLASS_EXT(c)->iv_index_tbl)
 
 struct vtm; /* defined by timev.h */
 
@@ -94,6 +100,8 @@ VALUE rb_home_dir(const char *user, VALUE result);
 VALUE rb_realpath_internal(VALUE basedir, VALUE path, int strict);
 VALUE rb_file_expand_path_fast(VALUE, VALUE);
 VALUE rb_file_expand_path_internal(VALUE, VALUE, int, int, VALUE);
+VALUE rb_get_path_check_to_string(VALUE, int);
+VALUE rb_get_path_check_convert(VALUE, VALUE, int);
 void Init_File(void);
 
 #ifdef _WIN32
@@ -119,6 +127,7 @@ VALUE rb_iseq_clone(VALUE iseqval, VALUE newcbase);
 
 /* load.c */
 VALUE rb_get_load_path(void);
+VALUE rb_get_expanded_load_path(void);
 
 /* math.c */
 VALUE rb_math_atan2(VALUE, VALUE);
diff --git a/load.c b/load.c
index 163ec4c..68caebc 100644
--- a/load.c
+++ b/load.c
@@ -34,21 +34,120 @@ rb_get_load_path(void)
     return load_path;
 }
 
-VALUE
-rb_get_expanded_load_path(void)
+enum expand_type {
+    EXPAND_ALL,
+    EXPAND_RELATIVE,
+    EXPAND_HOME,
+    EXPAND_NON_CACHE
+};
+
+/* Construct expanded load path and store it to cache.
+   We rebuild load path partially if the cache is invalid.
+   We don't cache non string object and expand it every time. We ensure that
+   string objects in $LOAD_PATH are frozen.
+ */
+static void
+rb_construct_expanded_load_path(int type, int *has_relative, int *has_non_cache)
 {
-    VALUE load_path = rb_get_load_path();
+    rb_vm_t *vm = GET_VM();
+    VALUE load_path = vm->load_path;
+    VALUE expanded_load_path = vm->expanded_load_path;
     VALUE ary;
     long i;
+    int level = rb_safe_level();
 
     ary = rb_ary_new2(RARRAY_LEN(load_path));
     for (i = 0; i < RARRAY_LEN(load_path); ++i) {
-	VALUE path = rb_file_expand_path_fast(RARRAY_PTR(load_path)[i], Qnil);
-	rb_str_freeze(path);
-	rb_ary_push(ary, path);
+	VALUE path, as_str, expanded_path;
+	int is_string, non_cache;
+	char *as_cstr;
+	as_str = path = RARRAY_PTR(load_path)[i];
+	is_string = RB_TYPE_P(path, T_STRING) ? 1 : 0;
+	non_cache = !is_string ? 1 : 0;
+	as_str = rb_get_path_check_to_string(path, level);
+	as_cstr = RSTRING_PTR(as_str);
+
+	if (!non_cache) {
+	    if ((type == EXPAND_RELATIVE &&
+		    rb_is_absolute_path(as_cstr)) ||
+		(type == EXPAND_HOME &&
+		    (!as_cstr[0] || as_cstr[0] != '~')) ||
+		(type == EXPAND_NON_CACHE)) {
+		    /* Use cached expanded path. */
+		    rb_ary_push(ary, RARRAY_PTR(expanded_load_path)[i]);
+		    continue;
+	    }
+	}
+	if (!*has_relative && !rb_is_absolute_path(as_cstr))
+	    *has_relative = 1;
+	if (!*has_non_cache && non_cache)
+	    *has_non_cache = 1;
+	/* Freeze only string object. We expand other objects every time. */
+	if (is_string)
+	    rb_str_freeze(path);
+	as_str = rb_get_path_check_convert(path, as_str, level);
+	expanded_path = rb_file_expand_path_fast(as_str, Qnil);
+	rb_str_freeze(expanded_path);
+	rb_ary_push(ary, expanded_path);
     }
     rb_obj_freeze(ary);
-    return ary;
+    vm->expanded_load_path = ary;
+    rb_ary_replace(vm->load_path_snapshot, vm->load_path);
+}
+
+static VALUE
+load_path_getcwd(void)
+{
+    char *cwd = my_getcwd();
+    VALUE cwd_str = rb_filesystem_str_new_cstr(cwd);
+    xfree(cwd);
+    return cwd_str;
+}
+
+VALUE
+rb_get_expanded_load_path(void)
+{
+    rb_vm_t *vm = GET_VM();
+    const VALUE non_cache = Qtrue;
+
+    if (!rb_ary_dup_of_p(vm->load_path_snapshot, vm->load_path)) {
+	/* The load path was modified. Rebuild the expanded load path. */
+	int has_relative = 0, has_non_cache = 0;
+	rb_construct_expanded_load_path(EXPAND_ALL, &has_relative, &has_non_cache);
+	if (has_relative) {
+	    vm->load_path_check_cache = load_path_getcwd();
+	}
+	else if (has_non_cache) {
+	    /* Non string object. */
+	    vm->load_path_check_cache = non_cache;
+	}
+	else {
+	    vm->load_path_check_cache = 0;
+	}
+    }
+    else if (vm->load_path_check_cache == non_cache) {
+	int has_relative = 1, has_non_cache = 1;
+	/* Expand only non-cacheable objects. */
+	rb_construct_expanded_load_path(EXPAND_NON_CACHE,
+					&has_relative, &has_non_cache);
+    }
+    else if (vm->load_path_check_cache) {
+	int has_relative = 1, has_non_cache = 1;
+	VALUE cwd = load_path_getcwd();
+	if (!rb_str_equal(vm->load_path_check_cache, cwd)) {
+	    /* Current working directory or filesystem encoding was changed.
+	       Expand relative load path and non-cacheable objects again. */
+	    vm->load_path_check_cache = cwd;
+	    rb_construct_expanded_load_path(EXPAND_RELATIVE,
+					    &has_relative, &has_non_cache);
+	}
+	else {
+	    /* Expand only tilde (User HOME) and non-cacheable objects. */
+	    rb_construct_expanded_load_path(EXPAND_HOME,
+					    &has_relative, &has_non_cache);
+	}
+    }
+    return vm->expanded_load_path;
 }
 
 static VALUE
@@ -63,12 +162,121 @@ get_loaded_features(void)
     return GET_VM()->loaded_features;
 }
 
+static void
+reset_loaded_features_snapshot(void)
+{
+    rb_vm_t *vm = GET_VM();
+    rb_ary_replace(vm->loaded_features_snapshot, vm->loaded_features);
+}
+
+static VALUE
+get_loaded_features_index_raw(void)
+{
+    return GET_VM()->loaded_features_index;
+}
+
 static st_table *
 get_loading_table(void)
 {
     return GET_VM()->loading_table;
 }
 
+static void
+features_index_add_single(VALUE short_feature, VALUE offset)
+{
+    VALUE features_index, this_feature_index;
+    features_index = get_loaded_features_index_raw();
+    if ((this_feature_index = rb_hash_lookup(features_index, short_feature)) == Qnil) {
+	this_feature_index = rb_ary_new();
+	rb_hash_aset(features_index, short_feature, this_feature_index);
+    }
+    rb_ary_push(this_feature_index, offset);
+}
+
+/* Add to the loaded-features index all the required entries for
+   `feature`, located at `offset` in $LOADED_FEATURES.  We add an
+   index entry at each string `short_feature` for which
+     feature == "#{prefix}#{short_feature}#{e}"
+   where `e` is empty or matches %r{^\.[^./]*$}, and `prefix` is empty
+   or ends in '/'.  This maintains the invariant that `rb_feature_p()`
+   relies on for its fast lookup.
+*/
+static void
+features_index_add(VALUE feature, VALUE offset)
+{
+    VALUE short_feature;
+    const char *feature_str, *feature_end, *ext, *p;
+
+    feature_str = StringValuePtr(feature);
+    feature_end = feature_str + RSTRING_LEN(feature);
+
+    for (ext = feature_end; ext > feature_str; ext--)
+      if (*ext == '.' || *ext == '/')
+	break;
+    if (*ext != '.')
+      ext = NULL;
+    /* Now `ext` points to the only string matching %r{^\.[^./]*$} that is
+       at the end of `feature`, or is NULL if there is no such string. */
+
+    p = ext ? ext : feature_end;
+    while (1) {
+	p--;
+	while (p >= feature_str && *p != '/')
+	    p--;
+	if (p < feature_str)
+	    break;
+	/* Now *p == '/'.  We reach this point for every '/' in `feature`. */
+	short_feature = rb_str_substr(feature, p + 1 - feature_str, feature_end - p - 1);
+	features_index_add_single(short_feature, offset);
+	if (ext) {
+	    short_feature = rb_str_substr(feature, p + 1 - feature_str, ext - p - 1);
+	    features_index_add_single(short_feature, offset);
+	}
+    }
+    features_index_add_single(feature, offset);
+    if (ext) {
+	short_feature = rb_str_substr(feature, 0, ext - feature_str);
+	features_index_add_single(short_feature, offset);
+    }
+}
+
+static VALUE
+get_loaded_features_index(void)
+{
+    VALUE features;
+    int i;
+    rb_vm_t *vm = GET_VM();
+
+    if (!rb_ary_dup_of_p(vm->loaded_features_snapshot, vm->loaded_features)) {
+	/* The sharing was broken; something (other than us in rb_provide_feature())
+	   modified loaded_features.  Rebuild the index. */
+	rb_hash_clear(vm->loaded_features_index);
+	features = vm->loaded_features;
+	for (i = 0; i < RARRAY_LEN(features); i++) {
+	    VALUE entry, as_str;
+	    as_str = entry = rb_ary_entry(features, i);
+	    StringValue(as_str);
+	    if (as_str != entry)
+		rb_ary_store(features, i, as_str);
+	    rb_str_freeze(as_str);
+	    features_index_add(as_str, INT2FIX(i));
+	}
+	reset_loaded_features_snapshot();
+    }
+    return vm->loaded_features_index;
+}
+
+/* This searches `load_path` for a value such that
+     name == "#{load_path[i]}/#{feature}"
+   if `feature` is a suffix of `name`, or otherwise
+     name == "#{load_path[i]}/#{feature}#{ext}"
+   for an acceptable string `ext`.  It returns
+   `load_path[i].to_str` if found, else 0.
+
+   If type is 's', then `ext` is acceptable only if IS_DLEXT(ext);
+   if 'r', then only if IS_RBEXT(ext); otherwise `ext` may be absent
+   or have any value matching `%r{^\.[^./]*$}`.
+*/
 static VALUE
 loaded_feature_path(const char *name, long vlen, const char *feature, long len,
 		    int type, VALUE load_path)
@@ -88,23 +296,22 @@ loaded_feature_path(const char *name, long vlen, const char *feature, long len,
 	    return 0;
 	plen = e - name - len - 1;
     }
+    if (type == 's' && !IS_DLEXT(&name[plen+len+1])
+     || type == 'r' && !IS_RBEXT(&name[plen+len+1])
+     || name[plen] != '/') {
+       return 0;
+    }
+    /* Now name == "#{prefix}/#{feature}#{ext}" where ext is acceptable
+       (possibly empty) and prefix is some string of length plen. */
+
     for (i = 0; i < RARRAY_LEN(load_path); ++i) {
 	VALUE p = RARRAY_PTR(load_path)[i];
 	const char *s = StringValuePtr(p);
 	long n = RSTRING_LEN(p);
 
-	if (n != plen ) continue;
-	if (n && (strncmp(name, s, n) || name[n] != '/')) continue;
-	switch (type) {
-	  case 's':
-	    if (IS_DLEXT(&name[n+len+1])) return p;
-	    break;
-	  case 'r':
-	    if (IS_RBEXT(&name[n+len+1])) return p;
-	    break;
-	  default:
-	    return p;
-	}
+	if (n != plen) continue;
+	if (n && strncmp(name, s, n)) continue;
+	return p;
     }
     return 0;
 }
@@ -132,7 +339,7 @@ loaded_feature_path_i(st_data_t v, st_data_t b, st_data_t f)
 static int
 rb_feature_p(const char *feature, const char *ext, int rb, int expanded, const char **fn)
 {
-    VALUE v, features, p, load_path = 0;
+    VALUE features, features_index, feature_val, this_feature_index, v, p, load_path = 0;
     const char *f, *e;
     long i, len, elen, n;
     st_table *loading_tbl;
@@ -151,8 +358,39 @@ rb_feature_p(const char *feature, const char *ext, int rb, int expanded, const c
 	type = 0;
     }
     features = get_loaded_features();
-    for (i = 0; i < RARRAY_LEN(features); ++i) {
-	v = RARRAY_PTR(features)[i];
+    features_index = get_loaded_features_index();
+
+    feature_val = rb_str_new(feature, len);
+    this_feature_index = rb_hash_lookup(features_index, feature_val);
+    /* We search `features` for an entry such that either
+         "#{features[i]}" == "#{load_path[j]}/#{feature}#{e}"
+       for some j, or
+         "#{features[i]}" == "#{feature}#{e}"
+       Here `e` is an "allowed" extension -- either empty or one
+       of the extensions accepted by IS_RBEXT, IS_SOEXT, or
+       IS_DLEXT.  Further, if `ext && rb` then `IS_RBEXT(e)`,
+       and if `ext && !rb` then `IS_SOEXT(e) || IS_DLEXT(e)`.
+
+       If `expanded`, then only the latter form (without load_path[j])
+       is accepted.  Otherwise either form is accepted, *unless* `ext`
+       is false and an otherwise-matching entry of the first form is
+       preceded by an entry of the form
+         "#{features[i2]}" == "#{load_path[j2]}/#{feature}#{e2}"
+       where `e2` matches %r{^\.[^./]*$} but is not an allowed extension.
+       After a "distractor" entry of this form, only entries of the
+       form "#{feature}#{e}" are accepted.
+
+       In `rb_provide_feature()` and `get_loaded_features_index()` we
+       maintain an invariant that the array `this_feature_index` will
+       point to every entry in `features` which has the form
+         "#{prefix}#{feature}#{e}"
+       where `e` is empty or matches %r{^\.[^./]*$}, and `prefix` is empty
+       or ends in '/'.  This includes both match forms above, as well
+       as any distractors, so we may ignore all other entries in `features`.
+     */
+    for (i = 0; this_feature_index != Qnil && i < RARRAY_LEN(this_feature_index); i++) {
+	long index = FIX2LONG(rb_ary_entry(this_feature_index, i));
+	v = RARRAY_PTR(features)[index];
 	f = StringValuePtr(v);
 	if ((n = RSTRING_LEN(v)) < len) continue;
 	if (strncmp(f, feature, len) != 0) {
@@ -175,6 +413,7 @@ rb_feature_p(const char *feature, const char *ext, int rb, int expanded, const c
 	    return 'r';
 	}
     }
+
     loading_tbl = get_loading_table();
     if (loading_tbl) {
 	f = 0;
@@ -183,7 +422,7 @@ rb_feature_p(const char *feature, const char *ext, int rb, int expanded, const c
 	    fs.name = feature;
 	    fs.len = len;
 	    fs.type = type;
-	    fs.load_path = load_path ? load_path : rb_get_load_path();
+	    fs.load_path = load_path ? load_path : rb_get_expanded_load_path();
 	    fs.result = 0;
 	    st_foreach(loading_tbl, loaded_feature_path_i, (st_data_t)&fs);
 	    if ((f = fs.result) != 0) {
@@ -233,7 +472,7 @@ rb_feature_provided(const char *feature, const char **loading)
 
     if (*feature == '.' &&
 	(feature[1] == '/' || strncmp(feature+1, "./", 2) == 0)) {
-	fullpath = rb_file_expand_path_fast(rb_str_new2(feature), Qnil);
+	fullpath = rb_file_expand_path_fast(rb_get_path(rb_str_new2(feature)), Qnil);
 	feature = RSTRING_PTR(fullpath);
     }
     if (ext && !strchr(ext, '/')) {
@@ -254,11 +493,18 @@ rb_feature_provided(const char *feature, const char **loading)
 static void
 rb_provide_feature(VALUE feature)
 {
-    if (OBJ_FROZEN(get_loaded_features())) {
+    VALUE features;
+
+    features = get_loaded_features();
+    if (OBJ_FROZEN(features)) {
 	rb_raise(rb_eRuntimeError,
 		 "$LOADED_FEATURES is frozen; cannot append feature");
     }
-    rb_ary_push(get_loaded_features(), feature);
+    rb_str_freeze(feature);
+
+    rb_ary_push(features, feature);
+    features_index_add(feature, INT2FIX(RARRAY_LEN(features)-1));
+    reset_loaded_features_snapshot();
 }
 
 void
@@ -774,10 +1020,15 @@ Init_load()
     rb_alias_variable(rb_intern("$-I"), id_load_path);
     rb_alias_variable(rb_intern("$LOAD_PATH"), id_load_path);
     vm->load_path = rb_ary_new();
+    vm->expanded_load_path = rb_ary_new();
+    vm->load_path_snapshot = rb_ary_new();
+    vm->load_path_check_cache = 0;
 
     rb_define_virtual_variable("$\"", get_loaded_features, 0);
     rb_define_virtual_variable("$LOADED_FEATURES", get_loaded_features, 0);
     vm->loaded_features = rb_ary_new();
+    vm->loaded_features_snapshot = rb_ary_new();
+    vm->loaded_features_index = rb_hash_new();
 
     rb_define_global_function("load", rb_f_load, -1);
     rb_define_global_function("require", rb_f_require, 1);
diff --git a/marshal.c b/marshal.c
index 9a43cdb..a4a3551 100644
--- a/marshal.c
+++ b/marshal.c
@@ -506,7 +506,7 @@ w_uclass(VALUE obj, VALUE super, struct dump_arg *arg)
 }
 
 static int
-w_obj_each(ID id, VALUE value, struct dump_call_arg *arg)
+w_obj_each(sa_index_t id, VALUE value, struct dump_call_arg *arg)
 {
     if (id == rb_id_encoding()) return ST_CONTINUE;
     if (id == rb_intern("E")) return ST_CONTINUE;
@@ -553,13 +553,13 @@ w_encoding(VALUE obj, long num, struct dump_call_arg *arg)
 }
 
 static void
-w_ivar(VALUE obj, st_table *tbl, struct dump_call_arg *arg)
+w_ivar(VALUE obj, sa_table *tbl, struct dump_call_arg *arg)
 {
     long num = tbl ? tbl->num_entries : 0;
 
     w_encoding(obj, num, arg);
     if (tbl) {
-	st_foreach_safe(tbl, w_obj_each, (st_data_t)arg);
+	sa_foreach(tbl, w_obj_each, (st_data_t)arg);
     }
 }
 
@@ -586,7 +586,7 @@ static void
 w_object(VALUE obj, struct dump_arg *arg, int limit)
 {
     struct dump_call_arg c_arg;
-    st_table *ivtbl = 0;
+    sa_table *ivtbl = 0;
     st_data_t num;
     int hasiv = 0;
 #define has_ivars(obj, ivtbl) (((ivtbl) = rb_generic_ivar_table(obj)) != 0 || \
@@ -651,7 +651,7 @@ w_object(VALUE obj, struct dump_arg *arg, int limit)
 	}
 	if (rb_respond_to(obj, s_dump)) {
 	    VALUE v;
-            st_table *ivtbl2 = 0;
+            sa_table *ivtbl2 = 0;
             int hasiv2;
 
 	    v = rb_funcall(obj, s_dump, 1, INT2NUM(limit));
diff --git a/method.h b/method.h
index 9229896..2fecd57 100644
--- a/method.h
+++ b/method.h
@@ -100,6 +100,6 @@ int rb_method_entry_eq(const rb_method_entry_t *m1, const rb_method_entry_t *m2)
 void rb_mark_method_entry(const rb_method_entry_t *me);
 void rb_free_method_entry(rb_method_entry_t *me);
 void rb_sweep_method_entry(void *vm);
-void rb_free_m_table(st_table *tbl);
+void rb_free_m_table(sa_table *tbl);
 
 #endif /* METHOD_H */
diff --git a/object.c b/object.c
index f45e013..1352d01 100644
--- a/object.c
+++ b/object.c
@@ -229,17 +229,8 @@ init_copy(VALUE dest, VALUE obj)
         break;
       case T_CLASS:
       case T_MODULE:
-	if (RCLASS_IV_TBL(dest)) {
-	    st_free_table(RCLASS_IV_TBL(dest));
-	    RCLASS_IV_TBL(dest) = 0;
-	}
-	if (RCLASS_CONST_TBL(dest)) {
-	    rb_free_const_table(RCLASS_CONST_TBL(dest));
-	    RCLASS_CONST_TBL(dest) = 0;
-	}
-	if (RCLASS_IV_TBL(obj)) {
-	    RCLASS_IV_TBL(dest) = st_copy(RCLASS_IV_TBL(obj));
-	}
+        rb_free_const_table(RCLASS_CONST_TBL(dest));
+        sa_copy_to(RCLASS_IV_TBL(obj), RCLASS_IV_TBL(dest));
         break;
     }
 }
@@ -530,7 +521,7 @@ rb_obj_is_kind_of(VALUE obj, VALUE c)
     }
 
     while (cl) {
-	if (cl == c || RCLASS_M_TBL(cl) == RCLASS_M_TBL(c))
+	if (cl == c || RCLASS_EXT(cl) == RCLASS_EXT(c))
 	    return Qtrue;
 	cl = RCLASS_SUPER(cl);
     }
@@ -1355,13 +1346,13 @@ rb_class_inherited_p(VALUE mod, VALUE arg)
 	rb_raise(rb_eTypeError, "compared with non class/module");
     }
     while (mod) {
-	if (RCLASS_M_TBL(mod) == RCLASS_M_TBL(arg))
+	if (RCLASS_EXT(mod) == RCLASS_EXT(arg))
 	    return Qtrue;
 	mod = RCLASS_SUPER(mod);
     }
     /* not mod < arg; check if mod > arg */
     while (arg) {
-	if (RCLASS_M_TBL(arg) == RCLASS_M_TBL(start))
+	if (RCLASS_EXT(arg) == RCLASS_EXT(start))
 	    return Qfalse;
 	arg = RCLASS_SUPER(arg);
     }
diff --git a/pool_alloc.h b/pool_alloc.h
new file mode 100644
index 0000000..957708e
--- /dev/null
+++ b/pool_alloc.h
@@ -0,0 +1,11 @@
+#ifndef POOL_ALLOC_H
+#define POOL_ALLOC_H
+
+#define POOL_ALLOC_API
+#ifdef POOL_ALLOC_API
+void  ruby_xpool_free(void *ptr);
+void *ruby_xpool_malloc_6p();
+void *ruby_xpool_malloc_11p();
+#endif
+
+#endif
diff --git a/pool_alloc.inc.h b/pool_alloc.inc.h
new file mode 100644
index 0000000..a7879ab
--- /dev/null
+++ b/pool_alloc.inc.h
@@ -0,0 +1,156 @@
+/*
+ * this is generic pool allocator
+ * you should define following macroses:
+ * ITEM_NAME - unique identifier, which allows to hold functions in a namespace
+ * ITEM_TYPEDEF(name) - passed to typedef to localize item type
+ * free_entry - desired name of function for free entry
+ * alloc_entry - defired name of function for allocate entry
+ */
+
+#if POOL_ALLOC_PART == 1
+#ifdef HEAP_ALIGN_LOG
+#define DEFAULT_POOL_SIZE (1 << HEAP_ALIGN_LOG)
+#else
+#define DEFAULT_POOL_SIZE (sizeof(void*) * 2048)
+#endif
+typedef unsigned int pool_holder_counter;
+
+typedef struct pool_entry_list pool_entry_list;
+typedef struct pool_holder pool_holder;
+
+typedef struct pool_header {
+    pool_holder         *first;
+    pool_holder         *_black_magick;
+    pool_holder_counter  size; // size of entry in sizeof(void*) items
+    pool_holder_counter  total; // size of entry in sizeof(void*) items
+} pool_header;
+
+struct pool_holder {
+    pool_holder_counter free, total;
+    pool_header  *header;
+    void               *freep;
+    pool_holder        *fore, *back;
+    void *data[1];
+};
+#define POOL_DATA_SIZE(pool_size) (((pool_size) - sizeof(void*) * 6 - offsetof(pool_holder, data)) / sizeof(void*))
+#define POOL_ENTRY_SIZE(item_type) ((sizeof(item_type) - 1) / sizeof(void*) + 1)
+#define POOL_HOLDER_COUNT(pool_size, item_type) (POOL_DATA_SIZE(pool_size)/POOL_ENTRY_SIZE(item_type))
+#define INIT_POOL(item_type) {NULL, NULL, POOL_ENTRY_SIZE(item_type), POOL_HOLDER_COUNT(DEFAULT_POOL_SIZE, item_type)}
+
+#elif POOL_ALLOC_PART == 2
+static pool_holder *
+pool_holder_alloc(pool_header *header)
+{
+    pool_holder *holder;
+    pool_holder_counter i, size, count;
+    register void **ptr;
+
+    size_t sz = offsetof(pool_holder, data) +
+	    header->size * header->total * sizeof(void*);
+#define objspace (&rb_objspace)
+    vm_malloc_prepare(objspace, DEFAULT_POOL_SIZE);
+    if (header->first != NULL) return header->first;
+    TRY_WITH_GC(holder = (pool_holder*) aligned_malloc(DEFAULT_POOL_SIZE, sz));
+    malloc_increase += DEFAULT_POOL_SIZE;
+#if CALC_EXACT_MALLOC_SIZE
+    objspace->malloc_params.allocated_size += DEFAULT_POOL_SIZE;
+    objspace->malloc_params.allocations++;
+#endif
+#undef objspace
+
+    size = header->size;
+    count = header->total;
+    holder->free = count;
+    holder->total = count;
+    holder->header = header;
+    holder->fore = NULL;
+    holder->back = NULL;
+    holder->freep = &holder->data;
+    ptr = holder->data;
+    for(i = count - 1; i; i-- ) {
+	ptr = *ptr = ptr + size;
+    }
+    *ptr = NULL;
+    header->first = holder;
+    return holder;
+}
+
+static inline void
+pool_holder_unchaing(pool_header *header, pool_holder *holder)
+{
+    register pool_holder *fore = holder->fore, *back = holder->back;
+    holder->fore = NULL;
+    holder->back = NULL;
+    if (fore != NULL)  fore->back     = back;
+    else               header->_black_magick = back;
+    if (back != NULL)  back->fore     = fore;
+    else               header->first = fore;
+}
+
+static inline pool_holder *
+entry_holder(void **entry)
+{
+    return (pool_holder*)(((uintptr_t)entry) & ~(DEFAULT_POOL_SIZE - 1));
+}
+
+static inline void
+pool_free_entry(void **entry)
+{
+    pool_holder *holder = entry_holder(entry);
+    pool_header *header = holder->header;
+
+    if (holder->free++ == 0) {
+	register pool_holder *first = header->first;
+	if (first == NULL) {
+	    header->first = holder;
+	} else {
+	    holder->back = first;
+	    holder->fore = first->fore;
+	    first->fore = holder;
+	    if (holder->fore)
+		holder->fore->back = holder;
+	    else
+		header->_black_magick = holder;
+	}
+    } else if (holder->free == holder->total && header->first != holder ) {
+	pool_holder_unchaing(header, holder);
+	aligned_free(holder);
+#if CALC_EXACT_MALLOC_SIZE
+	rb_objspace.malloc_params.allocated_size -= DEFAULT_POOL_SIZE;
+	rb_objspace.malloc_params.allocations--;
+#endif
+	return;
+    }
+
+    *entry = holder->freep;
+    holder->freep = entry;
+}
+
+static inline void*
+pool_alloc_entry(pool_header *header)
+{
+    pool_holder *holder = header->first;
+    void **result;
+    if (holder == NULL) {
+	holder = pool_holder_alloc(header);
+    }
+
+    result = holder->freep;
+    holder->freep = *result;
+
+    if (--holder->free == 0) {
+	pool_holder_unchaing(header, holder);
+    }
+
+    return result;
+}
+
+static void
+pool_finalize_header(pool_header *header)
+{
+    if (header->first) {
+        aligned_free(header->first);
+        header->first = NULL;
+    }
+}
+#endif
diff --git a/ruby.c b/ruby.c
index 3ddd96c..7ffc78e 100644
--- a/ruby.c
+++ b/ruby.c
@@ -1366,7 +1366,8 @@ process_options(int argc, char **argv, struct cmdline_options *opt)
 	long i;
 	VALUE load_path = GET_VM()->load_path;
 	for (i = 0; i < RARRAY_LEN(load_path); ++i) {
-	    rb_enc_associate(RARRAY_PTR(load_path)[i], lenc);
+	    RARRAY_PTR(load_path)[i] =
+		rb_enc_associate(rb_str_dup(RARRAY_PTR(load_path)[i]), lenc);
 	}
     }
     if (!(opt->disable & DISABLE_BIT(gems))) {
diff --git a/sp_ar.c b/sp_ar.c
new file mode 100644
index 0000000..2ed69bf
--- /dev/null
+++ b/sp_ar.c
@@ -0,0 +1,374 @@
+/*
+ * sparse array lib
+ * inspired by Lua table
+ * written by Sokolov Yura aka funny_falcon
+ */
+#ifdef NOT_RUBY
+#include "regint.h"
+#include "st.h"
+#else
+#include "ruby/ruby.h"
+#endif
+
+#include <stdio.h>
+#ifdef HAVE_STDLIB_H
+#include <stdlib.h>
+#endif
+#include <string.h>
+
+#ifdef RUBY
+#define malloc xmalloc
+#define calloc xcalloc
+#define realloc xrealloc
+#define free   xfree
+#endif
+
+#define sa_table_alloc()          (sa_table*)malloc(sizeof(sa_table))
+#define sa_table_xalloc()         (sa_table*)calloc(1, sizeof(sa_table))
+#define sa_table_dealloc(table)   free(table)
+#define sa_entry_alloc(n)         (sa_entry*)calloc((n), sizeof(sa_entry))
+#define sa_entry_dealloc(entries) free(entries)
+
+#define SA_LAST   1
+#define SA_OFFSET 2
+
+#define SA_MIN_SIZE 4
+
+void
+sa_init_table(register sa_table *table, sa_index_t num_bins)
+{
+    if (num_bins) {
+        table->num_entries = 0;
+        table->entries = sa_entry_alloc(num_bins);
+        table->num_bins = num_bins;
+        table->free_pos = num_bins;
+    }
+    else {
+        memset(table, 0, sizeof(sa_table));
+    }
+}
+
+sa_table*
+sa_new_table()
+{
+    sa_table* table = sa_table_alloc();
+    sa_init_table(table, 0);
+    return table;
+}
+
+static inline sa_index_t
+calc_pos(register sa_table* table, sa_index_t key)
+{
+    /* this formula is empirical */
+    /* it has no good avalance, but works well in our case */
+    key ^= key >> 16;
+    key *= 0x445229;
+    return (key + (key >> 16)) % table->num_bins;
+}
+
+static void
+fix_empty(register sa_table* table)
+{
+    while(--table->free_pos &&
+            table->entries[table->free_pos-1].next != SA_EMPTY);
+}
+
+#define FLOOR_TO_4 ((~((sa_index_t)0)) << 2)
+static sa_index_t
+find_empty(register sa_table* table, register sa_index_t pos)
+{
+    sa_index_t new_pos = table->free_pos-1;
+    sa_entry *entry;
+    pos &= FLOOR_TO_4;
+    entry = table->entries+pos;
+
+    if (entry->next == SA_EMPTY) { new_pos = pos; goto check; }
+    pos++; entry++;
+    if (entry->next == SA_EMPTY) { new_pos = pos; goto check; }
+    pos++; entry++;
+    if (entry->next == SA_EMPTY) { new_pos = pos; goto check; }
+    pos++; entry++;
+    if (entry->next == SA_EMPTY) { new_pos = pos; goto check; }
+
+check:
+    if (new_pos+1 == table->free_pos) fix_empty(table);
+    return new_pos;
+}
+
+static void resize(register sa_table* table);
+static int insert_into_chain(register sa_table*, register sa_index_t, st_data_t, sa_index_t pos);
+static int insert_into_main(register sa_table*, sa_index_t, st_data_t, sa_index_t pos, sa_index_t prev_pos);
+
+int
+sa_insert(register sa_table* table, register sa_index_t key, st_data_t value)
+{
+    sa_index_t pos, main_pos;
+    register sa_entry *entry;
+
+    if (table->num_bins == 0) {
+        sa_init_table(table, SA_MIN_SIZE);
+    }
+
+    pos = calc_pos(table, key);
+    entry = table->entries + pos;
+
+    if (entry->next == SA_EMPTY) {
+        entry->next = SA_LAST;
+        entry->key = key;
+        entry->value = value;
+        table->num_entries++;
+        if (pos+1 == table->free_pos) fix_empty(table);
+        return 0;
+    }
+
+    if (entry->key == key) {
+        entry->value = value;
+        return 1;
+    }
+
+    if (table->num_entries + (table->num_entries >> 2) > table->num_bins) {
+        resize(table);
+        return sa_insert(table, key, value);
+    }
+
+    main_pos = calc_pos(table, entry->key);
+    if (main_pos == pos) {
+        return insert_into_chain(table, key, value, pos);
+    }
+    else {
+        if (!table->free_pos) {
+            resize(table);
+            return sa_insert(table, key, value);
+        }
+        return insert_into_main(table, key, value, pos, main_pos);
+    }
+}
+
+static int
+insert_into_chain(register sa_table* table, register sa_index_t key, st_data_t value, sa_index_t pos)
+{
+    sa_entry *entry = table->entries + pos, *new_entry;
+    sa_index_t new_pos;
+
+    while (entry->next != SA_LAST) {
+        pos = entry->next - SA_OFFSET;
+        entry = table->entries + pos;
+        if (entry->key == key) {
+            entry->value = value;
+            return 1;
+        }
+    }
+
+    if (!table->free_pos) {
+        resize(table);
+        return sa_insert(table, key, value);
+    }
+
+    new_pos = find_empty(table, pos);
+    new_entry = table->entries + new_pos;
+    entry->next = new_pos + SA_OFFSET;
+
+    new_entry->next = SA_LAST;
+    new_entry->key = key;
+    new_entry->value = value;
+    table->num_entries++;
+    return 0;
+}
+
+static int
+insert_into_main(register sa_table* table, sa_index_t key, st_data_t value, sa_index_t pos, sa_index_t prev_pos)
+{
+    sa_entry *entry = table->entries + pos;
+    sa_index_t new_pos = find_empty(table, pos);
+    sa_entry *new_entry = table->entries + new_pos;
+    sa_index_t npos;
+
+    *new_entry = *entry;
+
+    while((npos = table->entries[prev_pos].next - SA_OFFSET) != pos) {
+        prev_pos = npos;
+    }
+    table->entries[prev_pos].next = new_pos + SA_OFFSET;
+
+    entry->next = SA_LAST;
+    entry->key = key;
+    entry->value = value;
+    table->num_entries++;
+    return 0;
+}
+
+static sa_index_t
+new_size(sa_index_t num_entries)
+{
+    sa_index_t msb = num_entries;
+    msb |= msb >> 1;
+    msb |= msb >> 2;
+    msb |= msb >> 4;
+    msb |= msb >> 8;
+    msb |= msb >> 16;
+    msb = ((msb >> 4) + 1) << 3;
+    return (num_entries & (msb | (msb >> 1))) + (msb >> 1);
+}
+
+static void
+resize(register sa_table *table)
+{
+    sa_table tmp_table;
+    sa_entry *entry;
+    sa_index_t i;
+
+    if (table->num_entries == 0) {
+        sa_entry_dealloc(table->entries);
+        memset(table, 0, sizeof(sa_table));
+        return;
+    }
+
+    sa_init_table(&tmp_table, new_size(table->num_entries + (table->num_entries >> 2)));
+    entry = table->entries;
+
+    for(i = 0; i < table->num_bins; i++, entry++) {
+        if (entry->next != SA_EMPTY) {
+            sa_insert(&tmp_table, entry->key, entry->value);
+        }
+    }
+    sa_entry_dealloc(table->entries);
+    *table = tmp_table;
+}
+
+int
+sa_lookup(register sa_table *table, register sa_index_t key, st_data_t *value)
+{
+    register sa_entry *entry;
+
+    if (table->num_entries == 0) return 0;
+
+    entry = table->entries + calc_pos(table, key);
+    if (entry->next == SA_EMPTY) return 0;
+
+    if (entry->key == key) goto found;
+    if (entry->next == SA_LAST) return 0;
+
+    entry = table->entries + (entry->next - SA_OFFSET);
+    if (entry->key == key) goto found;
+
+    while(entry->next != SA_LAST) {
+        entry = table->entries + (entry->next - SA_OFFSET);
+        if (entry->key == key) goto found;
+    }
+    return 0;
+found:
+    if (value) *value = entry->value;
+    return 1;
+}
+
+void
+sa_clear(sa_table *table)
+{
+    sa_entry_dealloc(table->entries);
+    memset(table, 0, sizeof(sa_table));
+}
+
+void
+sa_clear_no_free(sa_table *table)
+{
+    memset(table->entries, 0, sizeof(sa_entry) * table->num_bins);
+    table->num_entries = 0;
+    table->free_pos = table->num_bins;
+}
+
+void
+sa_free_table(sa_table *table)
+{
+    sa_entry_dealloc(table->entries);
+    sa_table_dealloc(table);
+}
+
+int
+sa_delete(sa_table *table, sa_index_t key, st_data_t *value)
+{
+    sa_index_t pos, prev_pos = ~0;
+    sa_entry *entry;
+
+    if (table->num_entries == 0) goto not_found;
+
+    pos = calc_pos(table, key);
+    entry = table->entries + pos;
+
+    if (entry->next == SA_EMPTY) goto not_found;
+
+    do {
+        if (entry->key == key) {
+            if (value) *value = entry->value;
+            if (entry->next != SA_LAST) {
+                sa_index_t npos = entry->next - SA_OFFSET;
+                *entry = table->entries[npos];
+                memset(table->entries + npos, 0, sizeof(sa_entry));
+            }
+            else {
+                memset(table->entries + pos, 0, sizeof(sa_entry));
+                if (~prev_pos) {
+                    table->entries[prev_pos].next = SA_LAST;
+                }
+            }
+            table->num_entries--;
+            if (table->num_entries < table->num_bins / 4) {
+                resize(table);
+            }
+            return 1;
+        }
+        if (entry->next == SA_LAST) break;
+        prev_pos = pos;
+        pos = entry->next - SA_OFFSET;
+        entry = table->entries + pos;
+    } while(1);
+
+not_found:
+    if (value) *value = 0;
+    return 0;
+}
+
+int
+sa_foreach(register sa_table *table, int (*func)(), st_data_t arg)
+{
+    sa_index_t i;
+    if (table->num_bins == 0) {
+        return 0;
+    }
+    for(i = 0; i < table->num_bins ; i++) {
+	if (table->entries[i].next != SA_EMPTY) {
+	    sa_index_t key = table->entries[i].key;
+	    st_data_t val = table->entries[i].value;
+	    if ((*func)(key, val, arg) == SA_STOP) break;
+	}
+    }
+    return 0;
+}
+
+size_t
+sa_memsize(const sa_table *table)
+{
+    return sizeof(sa_table) + table->num_bins * sizeof(sa_entry);
+}
+
+sa_table*
+sa_copy(sa_table *table)
+{
+    sa_table *new_table = sa_table_alloc();
+    *new_table = *table;
+    if (table->num_bins) {
+        new_table->entries = sa_entry_alloc(table->num_bins);
+        memcpy(new_table->entries, table->entries, table->num_bins*sizeof(sa_entry));
+    }
+    return new_table;
+}
+
+void
+sa_copy_to(sa_table *from, sa_table *to)
+{
+    sa_entry_dealloc(to->entries);
+    *to = *from;
+    if (to->num_bins) {
+	to->entries = sa_entry_alloc(to->num_bins);
+	memcpy(to->entries, from->entries, from->num_bins*sizeof(sa_entry));
+    }
+}
diff --git a/st.c b/st.c
index fda5784..20ec427 100644
--- a/st.c
+++ b/st.c
@@ -7,6 +7,7 @@
 #include "st.h"
 #else
 #include "ruby/ruby.h"
+#include "pool_alloc.h"
 #endif
 
 #include <stdio.h>
@@ -25,8 +26,17 @@ struct st_table_entry {
     st_table_entry *fore, *back;
 };
 
-#define ST_DEFAULT_MAX_DENSITY 5
+#define STATIC_ASSERT(name, expr) typedef int static_assert_##name##_check[(expr) ? 1 : -1];
+
+#define ST_DEFAULT_MAX_DENSITY 2
 #define ST_DEFAULT_INIT_TABLE_SIZE 11
+#define ST_DEFAULT_SECOND_TABLE_SIZE 19
+#define ST_DEFAULT_PACKED_TABLE_SIZE 19
+#define PACKED_UNIT (int)(sizeof(st_packed_entry) / sizeof(st_table_entry*))
+#define MAX_PACKED_HASH (int)(ST_DEFAULT_PACKED_TABLE_SIZE * sizeof(st_table_entry*) / sizeof(st_packed_entry))
+
+STATIC_ASSERT(st_packed_entry, sizeof(st_packed_entry) == sizeof(st_table_entry*[PACKED_UNIT]))
+STATIC_ASSERT(st_packed_bins, sizeof(st_packed_entry[MAX_PACKED_HASH]) <= sizeof(st_table_entry*[ST_DEFAULT_PACKED_TABLE_SIZE]))
 
     /*
      * DEFAULT_MAX_DENSITY is the default for the largest we allow the
@@ -38,7 +48,8 @@ struct st_table_entry {
      *
      */
 
-static const struct st_hash_type type_numhash = {
+#define type_numhash st_hashtype_num
+const struct st_hash_type st_hashtype_num = {
     st_numcmp,
     st_numhash,
 };
@@ -61,20 +72,128 @@ static void rehash(st_table *);
 #ifdef RUBY
 #define malloc xmalloc
 #define calloc xcalloc
+#define realloc xrealloc
 #define free(x) xfree(x)
 #endif
 
 #define numberof(array) (int)(sizeof(array) / sizeof((array)[0]))
 
-#define alloc(type) (type*)malloc((size_t)sizeof(type))
-#define Calloc(n,s) (char*)calloc((n),(s))
-
 #define EQUAL(table,x,y) ((x)==(y) || (*(table)->type->compare)((x),(y)) == 0)
 
-/* remove cast to unsigned int in the future */
-#define do_hash(key,table) (unsigned int)(st_index_t)(*(table)->type->hash)((key))
+#define do_hash(key,table) (st_index_t)(*(table)->type->hash)((key))
 #define do_hash_bin(key,table) (do_hash((key), (table))%(table)->num_bins)
 
+/* preparation for possible allocation improvements */
+#ifdef POOL_ALLOC_API
+#define st_alloc_entry() (st_table_entry *)ruby_xpool_malloc_6p()
+#define st_free_entry(entry) ruby_xpool_free(entry)
+#define st_alloc_table() (st_table *)ruby_xpool_malloc_6p()
+#define st_dealloc_table(table) ruby_xpool_free(table)
+static inline st_table_entry **
+st_alloc_bins(st_index_t size)
+{
+    st_table_entry **result;
+    if (size == 11) {
+        result = (st_table_entry **) ruby_xpool_malloc_11p();
+        memset(result, 0, 11 * sizeof(st_table_entry *));
+    }
+    else
+        result = (st_table_entry **) ruby_xcalloc(size, sizeof(st_table_entry*));
+    return result;
+}
+static inline void
+st_free_bins(st_table_entry **bins, st_index_t size)
+{
+    if (size == 11)
+	ruby_xpool_free(bins);
+    else
+	ruby_xfree(bins);
+}
+static inline st_table_entry**
+st_realloc_bins(st_table_entry **bins, st_index_t newsize, st_index_t oldsize)
+{
+    st_table_entry **new_bins = st_alloc_bins(newsize);
+    st_free_bins(bins, oldsize);
+    return new_bins;
+}
+#else
+#define st_alloc_entry() (st_table_entry *)malloc(sizeof(st_table_entry))
+#define st_free_entry(entry) free(entry)
+#define st_alloc_table() (st_table *)malloc(sizeof(st_table))
+#define st_dealloc_table(table) free(table)
+#define st_alloc_bins(size) (st_table_entry **)calloc(size, sizeof(st_table_entry *))
+#define st_free_bins(bins, size) free(bins)
+static inline st_table_entry**
+st_realloc_bins(st_table_entry **bins, st_index_t newsize, st_index_t oldsize)
+{
+    bins = (st_table_entry **)realloc(bins, newsize * sizeof(st_table_entry *));
+    MEMZERO(bins, st_table_entry*, newsize);
+    return bins;
+}
+#endif
+
+/* Shortage */
+#define bins as.big.bins
+#define head as.big.head
+#define tail as.big.tail
+#define real_entries as.packed.real_entries
+
+/* preparation for possible packing improvements */
+#define PACKED_BINS(table) ((table)->as.packed.entries)
+#define PACKED_ENT(table, i) PACKED_BINS(table)[i]
+#define PKEY(table, i) PACKED_ENT((table), (i)).key
+#define PVAL(table, i) PACKED_ENT((table), (i)).val
+#define PHASH(table, i) PACKED_ENT((table), (i)).hash
+#define PKEY_SET(table, i, v) (PKEY((table), (i)) = (v))
+#define PVAL_SET(table, i, v) (PVAL((table), (i)) = (v))
+#define PHASH_SET(table, i, v) (PHASH((table), (i)) = (v))
+
+/* this function depends much on packed layout, so that it placed here */
+static inline void
+remove_packed_entry(st_table *table, st_index_t i)
+{
+    table->real_entries--;
+    table->num_entries--;
+    if (i < table->real_entries) {
+	MEMMOVE(&PACKED_ENT(table, i), &PACKED_ENT(table, i+1),
+		st_packed_entry, table->real_entries - i);
+    }
+}
+
+static inline void
+remove_safe_packed_entry(st_table *table, st_index_t i, st_data_t never)
+{
+    table->num_entries--;
+    PKEY_SET(table, i, never);
+    PVAL_SET(table, i, never);
+    PHASH_SET(table, i, 0);
+}
+
+/* ultrapacking */
+#define real_upacked num_bins
+#define MAX_UPACKED_HASH 1
+#define ULTRAPACKED(table) ((table)->real_upacked <= 1)
+#define UPACKED_ENT(table) ((table)->as.upacked)
+#define UPKEY(table) UPACKED_ENT(table).key
+#define UPVAL(table) UPACKED_ENT(table).val
+#define UPHASH(table) UPACKED_ENT(table).hash
+#define UPKEY_SET(table, v) (UPACKED_ENT(table).key = (v))
+#define UPVAL_SET(table, v) (UPACKED_ENT(table).val = (v))
+#define UPHASH_SET(table, v) (UPACKED_ENT(table).hash = (v))
+static inline void
+remove_upacked_entry(st_table *table)
+{
+    table->real_upacked = table->num_entries = 0;
+}
+
+static inline void
+remove_safe_upacked_entry(st_table *table, st_data_t never)
+{
+    table->num_entries = 0;
+    UPKEY_SET(table, never);
+    UPVAL_SET(table, never);
+    UPHASH_SET(table, 0);
+}
 /*
  * MINSIZE is the minimum size of a dictionary.
  */
@@ -85,8 +204,8 @@ static void rehash(st_table *);
 Table of prime numbers 2^n+a, 2<=n<=30.
 */
 static const unsigned int primes[] = {
-	8 + 3,
-	16 + 3,
+	ST_DEFAULT_INIT_TABLE_SIZE,
+	ST_DEFAULT_SECOND_TABLE_SIZE,
 	32 + 5,
 	64 + 3,
 	128 + 3,
@@ -161,8 +280,6 @@ stat_col(void)
 }
 #endif
 
-#define MAX_PACKED_NUMHASH (ST_DEFAULT_INIT_TABLE_SIZE/2)
-
 st_table*
 st_init_table_with_size(const struct st_hash_type *type, st_index_t size)
 {
@@ -181,14 +298,19 @@ st_init_table_with_size(const struct st_hash_type *type, st_index_t size)
     }
 #endif
 
-    size = new_size(size);	/* round up to prime number */
 
-    tbl = alloc(st_table);
+    tbl = st_alloc_table();
     tbl->type = type;
     tbl->num_entries = 0;
-    tbl->entries_packed = type == &type_numhash && size/2 <= MAX_PACKED_NUMHASH;
+    tbl->entries_packed = size <= MAX_PACKED_HASH;
+    if (tbl->entries_packed) {
+	size = size <= MAX_UPACKED_HASH ? 0 : ST_DEFAULT_PACKED_TABLE_SIZE;
+    }
+    else {
+	size = new_size(size);	/* round up to prime number */
+    }
     tbl->num_bins = size;
-    tbl->bins = (st_table_entry **)Calloc(size, sizeof(st_table_entry*));
+    tbl->bins = size ? st_alloc_bins(size) : 0;
     tbl->head = 0;
     tbl->tail = 0;
 
@@ -243,17 +365,23 @@ st_clear(st_table *table)
     register st_table_entry *ptr, *next;
     st_index_t i;
 
+    if (ULTRAPACKED(table)) {
+	remove_upacked_entry(table);
+	return;
+    }
+
     if (table->entries_packed) {
         table->num_entries = 0;
+        table->real_entries = 0;
         return;
     }
 
-    for(i = 0; i < table->num_bins; i++) {
+    for (i = 0; i < table->num_bins; i++) {
 	ptr = table->bins[i];
 	table->bins[i] = 0;
 	while (ptr != 0) {
 	    next = ptr->next;
-	    free(ptr);
+	    st_free_entry(ptr);
 	    ptr = next;
 	}
     }
@@ -266,14 +394,19 @@ void
 st_free_table(st_table *table)
 {
     st_clear(table);
-    free(table->bins);
-    free(table);
+    if (!ULTRAPACKED(table)) {
+	st_free_bins(table->bins, table->num_bins);
+    }
+    st_dealloc_table(table);
 }
 
 size_t
 st_memsize(const st_table *table)
 {
-    if (table->entries_packed) {
+    if (ULTRAPACKED(table)) {
+	return sizeof(st_table);
+    }
+    else if (table->entries_packed) {
 	return table->num_bins * sizeof (void *) + sizeof(st_table);
     }
     else {
@@ -306,46 +439,77 @@ count_collision(const struct st_hash_type *type)
 #define FOUND_ENTRY
 #endif
 
-#define FIND_ENTRY(table, ptr, hash_val, bin_pos) do {\
-    (bin_pos) = (hash_val)%(table)->num_bins;\
-    (ptr) = (table)->bins[(bin_pos)];\
-    FOUND_ENTRY;\
-    if (PTR_NOT_EQUAL((table), (ptr), (hash_val), key)) {\
-	COLLISION;\
-	while (PTR_NOT_EQUAL((table), (ptr)->next, (hash_val), key)) {\
-	    (ptr) = (ptr)->next;\
-	}\
-	(ptr) = (ptr)->next;\
-    }\
-} while (0)
+#define FIND_ENTRY(table, ptr, hash_val, bin_pos) \
+    ((ptr) = find_entry((table), key, (hash_val), ((bin_pos) = (hash_val)%(table)->num_bins)))
+
+static st_table_entry *
+find_entry(st_table *table, st_data_t key, st_index_t hash_val, st_index_t bin_pos)
+{
+    register st_table_entry *ptr = table->bins[bin_pos];
+    FOUND_ENTRY;
+    if (PTR_NOT_EQUAL(table, ptr, hash_val, key)) {
+	COLLISION;
+	while (PTR_NOT_EQUAL(table, ptr->next, hash_val, key)) {
+	    ptr = ptr->next;
+	}
+	ptr = ptr->next;
+    }
+    return ptr;
+}
+
+static inline st_index_t
+find_packed_index(st_table *table, st_index_t hash_val, st_data_t key)
+{
+    st_index_t i = 0;
+    while (i < table->real_entries &&
+	   (PHASH(table, i) != hash_val || !EQUAL(table, key, PKEY(table, i)))) {
+	i++;
+    }
+    return i;
+}
+
+static inline int
+check_upacked(st_table *table, st_index_t hash_val, st_data_t key)
+{
+    return table->num_entries &&
+	UPHASH(table) == hash_val &&
+	EQUAL(table, key, UPKEY(table));
+}
 
 #define collision_check 0
 
 int
 st_lookup(st_table *table, register st_data_t key, st_data_t *value)
 {
-    st_index_t hash_val, bin_pos;
+    st_index_t hash_val;
     register st_table_entry *ptr;
 
+    hash_val = do_hash(key, table);
+
+    if (ULTRAPACKED(table)) {
+	if (check_upacked(table, hash_val, key)) {
+	    if (value != 0) *value = UPVAL(table);
+	    return 1;
+	}
+	return 0;
+    }
+
     if (table->entries_packed) {
-        st_index_t i;
-        for (i = 0; i < table->num_entries; i++) {
-            if ((st_data_t)table->bins[i*2] == key) {
-                if (value !=0) *value = (st_data_t)table->bins[i*2+1];
-                return 1;
-            }
-        }
+	st_index_t i = find_packed_index(table, hash_val, key);
+	if (i < table->real_entries) {
+	    if (value != 0) *value = PVAL(table, i);
+	    return 1;
+	}
         return 0;
     }
 
-    hash_val = do_hash(key, table);
-    FIND_ENTRY(table, ptr, hash_val, bin_pos);
+    ptr = find_entry(table, key, hash_val, hash_val % table->num_bins);
 
     if (ptr == 0) {
 	return 0;
     }
     else {
-	if (value != 0)  *value = ptr->record;
+	if (value != 0) *value = ptr->record;
 	return 1;
     }
 }
@@ -353,22 +517,29 @@ st_lookup(st_table *table, register st_data_t key, st_data_t *value)
 int
 st_get_key(st_table *table, register st_data_t key, st_data_t *result)
 {
-    st_index_t hash_val, bin_pos;
+    st_index_t hash_val;
     register st_table_entry *ptr;
 
+    hash_val = do_hash(key, table);
+
+    if (ULTRAPACKED(table)) {
+	if (check_upacked(table, hash_val, key)) {
+	    if (result != 0) *result = UPKEY(table);
+	    return 1;
+	}
+	return 0;
+    }
+
     if (table->entries_packed) {
-        st_index_t i;
-        for (i = 0; i < table->num_entries; i++) {
-            if ((st_data_t)table->bins[i*2] == key) {
-                if (result !=0) *result = (st_data_t)table->bins[i*2];
-                return 1;
-            }
-        }
+	st_index_t i = find_packed_index(table, hash_val, key);
+	if (i < table->real_entries) {
+	    if (result != 0) *result = PKEY(table, i);
+	    return 1;
+	}
         return 0;
     }
 
-    hash_val = do_hash(key, table);
-    FIND_ENTRY(table, ptr, hash_val, bin_pos);
+    ptr = find_entry(table, key, hash_val, hash_val % table->num_bins);
 
     if (ptr == 0) {
 	return 0;
@@ -382,85 +553,151 @@ st_get_key(st_table *table, register st_data_t key, st_data_t *result)
 #undef collision_check
 #define collision_check 1
 
-#define MORE_PACKABLE_P(table) \
-    ((st_index_t)((table)->num_entries+1) * 2 <= (table)->num_bins && \
-     (table)->num_entries+1 <= MAX_PACKED_NUMHASH)
-
-#define ADD_DIRECT(table, key, value, hash_val, bin_pos)\
-do {\
-    st_table_entry *entry;\
-    if ((table)->num_entries > ST_DEFAULT_MAX_DENSITY * (table)->num_bins) {\
-	rehash(table);\
-        (bin_pos) = (hash_val) % (table)->num_bins;\
-    }\
-    \
-    entry = alloc(st_table_entry);\
-    \
-    entry->hash = (hash_val);\
-    entry->key = (key);\
-    entry->record = (value);\
-    entry->next = (table)->bins[(bin_pos)];\
-    if ((table)->head != 0) {\
-	entry->fore = 0;\
-	(entry->back = (table)->tail)->fore = entry;\
-	(table)->tail = entry;\
-    }\
-    else {\
-	(table)->head = (table)->tail = entry;\
-	entry->fore = entry->back = 0;\
-    }\
-    (table)->bins[(bin_pos)] = entry;\
-    (table)->num_entries++;\
-} while (0)
+static inline st_table_entry *
+new_entry(st_table * table, st_data_t key, st_data_t value,
+	st_index_t hash_val, register st_index_t bin_pos)
+{
+    register st_table_entry *entry = st_alloc_entry();
+
+    entry->next = table->bins[bin_pos];
+    table->bins[bin_pos] = entry;
+    entry->hash = hash_val;
+    entry->key = key;
+    entry->record = value;
+
+    return entry;
+}
+
+static inline void
+add_direct(st_table *table, st_data_t key, st_data_t value,
+	   st_index_t hash_val, register st_index_t bin_pos)
+{
+    register st_table_entry *entry;
+    if (table->num_entries > ST_DEFAULT_MAX_DENSITY * table->num_bins) {
+	rehash(table);
+        bin_pos = hash_val % table->num_bins;
+    }
+
+    entry = new_entry(table, key, value, hash_val, bin_pos);
+
+    if (table->head != 0) {
+	entry->fore = 0;
+	(entry->back = table->tail)->fore = entry;
+	table->tail = entry;
+    }
+    else {
+	table->head = table->tail = entry;
+	entry->fore = entry->back = 0;
+    }
+    table->num_entries++;
+}
 
 static void
 unpack_entries(register st_table *table)
 {
     st_index_t i;
-    struct st_table_entry *packed_bins[MAX_PACKED_NUMHASH*2];
+    st_packed_entry packed_bins[MAX_PACKED_HASH];
+    register st_table_entry *entry, *preventry = 0, **chain;
     st_table tmp_table = *table;
 
-    memcpy(packed_bins, table->bins, sizeof(struct st_table_entry *) * table->num_entries*2);
-    table->bins = packed_bins;
+    MEMCPY(packed_bins, PACKED_BINS(table), st_packed_entry, MAX_PACKED_HASH);
+    table->as.packed.entries = packed_bins;
     tmp_table.entries_packed = 0;
-    tmp_table.num_entries = 0;
-    memset(tmp_table.bins, 0, sizeof(struct st_table_entry *) * tmp_table.num_bins);
-    for (i = 0; i < table->num_entries; i++) {
-        st_insert(&tmp_table, (st_data_t)packed_bins[i*2], (st_data_t)packed_bins[i*2+1]);
-    }
+#if ST_DEFAULT_INIT_TABLE_SIZE == ST_DEFAULT_PACKED_TABLE_SIZE
+    MEMZERO(tmp_table.bins, st_table_entry*, tmp_table.num_bins);
+#else
+    tmp_table.bins = st_realloc_bins(tmp_table.bins, ST_DEFAULT_INIT_TABLE_SIZE, tmp_table.num_bins);
+    tmp_table.num_bins = ST_DEFAULT_INIT_TABLE_SIZE;
+#endif
+    i = 0;
+    chain = &tmp_table.head;
+    do {
+	st_data_t key = packed_bins[i].key;
+	st_data_t val = packed_bins[i].val;
+	st_index_t hash = packed_bins[i].hash;
+	entry = new_entry(&tmp_table, key, val, hash,
+			  hash % ST_DEFAULT_INIT_TABLE_SIZE);
+	*chain = entry;
+	entry->back = preventry;
+	preventry = entry;
+	chain = &entry->fore;
+    } while (++i < MAX_PACKED_HASH);
+    *chain = NULL;
+    tmp_table.tail = entry;
     *table = tmp_table;
 }
 
+static void
+add_packed_direct(st_table *table, st_data_t key, st_data_t value, st_index_t hash_val)
+{
+    if (table->real_entries < MAX_PACKED_HASH) {
+	st_index_t i = table->real_entries++;
+	PKEY_SET(table, i, key);
+	PVAL_SET(table, i, value);
+	PHASH_SET(table, i, hash_val);
+	table->num_entries++;
+    }
+    else {
+	unpack_entries(table);
+	add_direct(table, key, value, hash_val, hash_val % table->num_bins);
+    }
+}
+
+static void
+add_upacked_direct(register st_table *table, register st_data_t key, st_data_t value, st_index_t hash_val)
+{
+    if (table->real_upacked) {
+	st_packed_entry *entries = (st_packed_entry *) st_alloc_bins(ST_DEFAULT_PACKED_TABLE_SIZE);
+	entries[0] = UPACKED_ENT(table);
+	entries[1].hash = hash_val;
+	entries[1].key = key;
+	entries[1].val = value;
+	table->num_bins = ST_DEFAULT_PACKED_TABLE_SIZE;
+	table->real_entries = 2;
+	table->num_entries++;
+	table->as.packed.entries = entries;
+    }
+    else {
+	table->real_upacked = 1;
+	table->num_entries = 1;
+	UPHASH_SET(table, hash_val);
+	UPKEY_SET(table, key);
+	UPVAL_SET(table, value);
+    }
+}
+
 int
 st_insert(register st_table *table, register st_data_t key, st_data_t value)
 {
-    st_index_t hash_val, bin_pos;
+    st_index_t hash_val;
+    register st_index_t bin_pos;
     register st_table_entry *ptr;
 
+    hash_val = do_hash(key, table);
+
+    if (ULTRAPACKED(table)) {
+	if (check_upacked(table, hash_val, key)) {
+	    UPVAL_SET(table, value);
+	    return 1;
+	}
+	add_upacked_direct(table, key, value, hash_val);
+	return 0;
+    }
+
     if (table->entries_packed) {
-        st_index_t i;
-        for (i = 0; i < table->num_entries; i++) {
-            if ((st_data_t)table->bins[i*2] == key) {
-                table->bins[i*2+1] = (struct st_table_entry*)value;
-                return 1;
-            }
-        }
-        if (MORE_PACKABLE_P(table)) {
-            i = table->num_entries++;
-            table->bins[i*2] = (struct st_table_entry*)key;
-            table->bins[i*2+1] = (struct st_table_entry*)value;
-            return 0;
-        }
-        else {
-            unpack_entries(table);
+	st_index_t i = find_packed_index(table, hash_val, key);
+	if (i < table->real_entries) {
+	    PVAL_SET(table, i, value);
+	    return 1;
         }
+	add_packed_direct(table, key, value, hash_val);
+	return 0;
     }
 
-    hash_val = do_hash(key, table);
     FIND_ENTRY(table, ptr, hash_val, bin_pos);
 
     if (ptr == 0) {
-	ADD_DIRECT(table, key, value, hash_val, bin_pos);
+	add_direct(table, key, value, hash_val, bin_pos);
 	return 0;
     }
     else {
@@ -473,34 +710,38 @@ int
 st_insert2(register st_table *table, register st_data_t key, st_data_t value,
 	   st_data_t (*func)(st_data_t))
 {
-    st_index_t hash_val, bin_pos;
+    st_index_t hash_val;
+    register st_index_t bin_pos;
     register st_table_entry *ptr;
 
+    hash_val = do_hash(key, table);
+
+    if (ULTRAPACKED(table)) {
+	if (check_upacked(table, hash_val, key)) {
+	    UPVAL_SET(table, value);
+	    return 1;
+	}
+	key = (*func)(key);
+	add_upacked_direct(table, key, value, hash_val);
+	return 0;
+    }
+
     if (table->entries_packed) {
-        st_index_t i;
-        for (i = 0; i < table->num_entries; i++) {
-            if ((st_data_t)table->bins[i*2] == key) {
-                table->bins[i*2+1] = (struct st_table_entry*)value;
-                return 1;
-            }
-        }
-        if (MORE_PACKABLE_P(table)) {
-            i = table->num_entries++;
-            table->bins[i*2] = (struct st_table_entry*)key;
-            table->bins[i*2+1] = (struct st_table_entry*)value;
-            return 0;
-        }
-        else {
-            unpack_entries(table);
-        }
+	st_index_t i = find_packed_index(table, hash_val, key);
+	if (i < table->real_entries) {
+	    PVAL_SET(table, i, value);
+	    return 1;
+	}
+	key = (*func)(key);
+	add_packed_direct(table, key, value, hash_val);
+	return 0;
     }
 
-    hash_val = do_hash(key, table);
     FIND_ENTRY(table, ptr, hash_val, bin_pos);
 
     if (ptr == 0) {
 	key = (*func)(key);
-	ADD_DIRECT(table, key, value, hash_val, bin_pos);
+	add_direct(table, key, value, hash_val, bin_pos);
 	return 0;
     }
     else {
@@ -512,36 +753,30 @@ st_insert2(register st_table *table, register st_data_t key, st_data_t value,
 void
 st_add_direct(st_table *table, st_data_t key, st_data_t value)
 {
-    st_index_t hash_val, bin_pos;
+    st_index_t hash_val;
+
+    hash_val = do_hash(key, table);
+    if (ULTRAPACKED(table)) {
+	add_upacked_direct(table, key, value, hash_val);
+	return;
+    }
 
     if (table->entries_packed) {
-        int i;
-        if (MORE_PACKABLE_P(table)) {
-            i = table->num_entries++;
-            table->bins[i*2] = (struct st_table_entry*)key;
-            table->bins[i*2+1] = (struct st_table_entry*)value;
-            return;
-        }
-        else {
-            unpack_entries(table);
-        }
+	add_packed_direct(table, key, value, hash_val);
+	return;
     }
 
-    hash_val = do_hash(key, table);
-    bin_pos = hash_val % table->num_bins;
-    ADD_DIRECT(table, key, value, hash_val, bin_pos);
+    add_direct(table, key, value, hash_val, hash_val % table->num_bins);
 }
 
 static void
 rehash(register st_table *table)
 {
     register st_table_entry *ptr, **new_bins;
-    st_index_t i, new_num_bins, hash_val;
+    st_index_t new_num_bins, hash_val;
 
     new_num_bins = new_size(table->num_bins+1);
-    new_bins = (st_table_entry**)
-	xrealloc(table->bins, new_num_bins * sizeof(st_table_entry*));
-    for (i = 0; i < new_num_bins; ++i) new_bins[i] = 0;
+    new_bins = st_realloc_bins(table->bins, new_num_bins, table->num_bins);
     table->num_bins = new_num_bins;
     table->bins = new_bins;
 
@@ -558,34 +793,37 @@ st_table*
 st_copy(st_table *old_table)
 {
     st_table *new_table;
-    st_table_entry *ptr, *entry, *prev, **tail;
+    st_table_entry *ptr, *entry, *prev, **tailp;
     st_index_t num_bins = old_table->num_bins;
     st_index_t hash_val;
 
-    new_table = alloc(st_table);
+    new_table = st_alloc_table();
     if (new_table == 0) {
 	return 0;
     }
 
     *new_table = *old_table;
-    new_table->bins = (st_table_entry**)
-	Calloc((unsigned)num_bins, sizeof(st_table_entry*));
+    if (ULTRAPACKED(old_table)) {
+	return new_table;
+    }
+
+    new_table->bins = st_alloc_bins(num_bins);
 
     if (new_table->bins == 0) {
-	free(new_table);
+	st_dealloc_table(new_table);
 	return 0;
     }
 
     if (old_table->entries_packed) {
-        memcpy(new_table->bins, old_table->bins, sizeof(struct st_table_entry *) * old_table->num_bins);
+        MEMCPY(new_table->bins, old_table->bins, st_table_entry*, old_table->num_bins);
         return new_table;
     }
 
     if ((ptr = old_table->head) != 0) {
 	prev = 0;
-	tail = &new_table->head;
+	tailp = &new_table->head;
 	do {
-	    entry = alloc(st_table_entry);
+	    entry = st_alloc_entry();
 	    if (entry == 0) {
 		st_free_table(new_table);
 		return 0;
@@ -595,8 +833,8 @@ st_copy(st_table *old_table)
 	    entry->next = new_table->bins[hash_val];
 	    new_table->bins[hash_val] = entry;
 	    entry->back = prev;
-	    *tail = prev = entry;
-	    tail = &entry->fore;
+	    *tailp = prev = entry;
+	    tailp = &entry->fore;
 	} while ((ptr = ptr->fore) != 0);
 	new_table->tail = prev;
     }
@@ -604,21 +842,22 @@ st_copy(st_table *old_table)
     return new_table;
 }
 
-#define REMOVE_ENTRY(table, ptr) do					\
-    {									\
-	if ((ptr)->fore == 0 && (ptr)->back == 0) {			\
-	    (table)->head = 0;						\
-	    (table)->tail = 0;						\
-	}								\
-	else {								\
-	    st_table_entry *fore = (ptr)->fore, *back = (ptr)->back;	\
-	    if (fore) fore->back = back;				\
-	    if (back) back->fore = fore;				\
-	    if ((ptr) == (table)->head) (table)->head = fore;		\
-	    if ((ptr) == (table)->tail) (table)->tail = back;		\
-	}								\
-	(table)->num_entries--;						\
-    } while (0)
+static inline void
+remove_entry(st_table *table, st_table_entry *ptr)
+{
+    if (ptr->fore == 0 && ptr->back == 0) {
+	table->head = 0;
+	table->tail = 0;
+    }
+    else {
+	st_table_entry *fore = ptr->fore, *back = ptr->back;
+	if (fore) fore->back = back;
+	if (back) back->fore = fore;
+	if (ptr == table->head) table->head = fore;
+	if (ptr == table->tail) table->tail = back;
+    }
+    table->num_entries--;
+}
 
 int
 st_delete(register st_table *table, register st_data_t *key, st_data_t *value)
@@ -627,30 +866,38 @@ st_delete(register st_table *table, register st_data_t *key, st_data_t *value)
     st_table_entry **prev;
     register st_table_entry *ptr;
 
+    hash_val = do_hash(*key, table);
+
+    if (ULTRAPACKED(table)) {
+	if (check_upacked(table, hash_val, *key)) {
+	    if (value != 0) *value = UPVAL(table);
+	    *key = UPKEY(table);
+	    remove_upacked_entry(table);
+	    return 1;
+	}
+	return 0;
+    }
+
     if (table->entries_packed) {
-        st_index_t i;
-        for (i = 0; i < table->num_entries; i++) {
-            if ((st_data_t)table->bins[i*2] == *key) {
-                if (value != 0) *value = (st_data_t)table->bins[i*2+1];
-                table->num_entries--;
-                memmove(&table->bins[i*2], &table->bins[(i+1)*2],
-                        sizeof(struct st_table_entry*) * 2*(table->num_entries-i));
-                return 1;
-            }
+	st_index_t i = find_packed_index(table, hash_val, *key);
+	if (i < table->real_entries) {
+	    if (value != 0) *value = PVAL(table, i);
+	    *key = PKEY(table, i);
+	    remove_packed_entry(table, i);
+	    return 1;
         }
         if (value != 0) *value = 0;
         return 0;
     }
 
-    hash_val = do_hash_bin(*key, table);
-
-    for (prev = &table->bins[hash_val]; (ptr = *prev) != 0; prev = &ptr->next) {
+    prev = &table->bins[hash_val % table->num_bins];
+    for (;(ptr = *prev) != 0; prev = &ptr->next) {
 	if (EQUAL(table, *key, ptr->key)) {
 	    *prev = ptr->next;
-	    REMOVE_ENTRY(table, ptr);
+	    remove_entry(table, ptr);
 	    if (value != 0) *value = ptr->record;
 	    *key = ptr->key;
-	    free(ptr);
+	    st_free_entry(ptr);
 	    return 1;
 	}
     }
@@ -665,25 +912,36 @@ st_delete_safe(register st_table *table, register st_data_t *key, st_data_t *val
     st_index_t hash_val;
     register st_table_entry *ptr;
 
+    hash_val = do_hash(*key, table);
+
+    if (ULTRAPACKED(table)) {
+	if (check_upacked(table, hash_val, *key)) {
+	    if (value != 0) *value = UPVAL(table);
+	    *key = UPKEY(table);
+	    remove_safe_upacked_entry(table, never);
+	    return 1;
+	}
+	if (value != 0) *value = 0;
+	return 0;
+    }
+
     if (table->entries_packed) {
-	st_index_t i;
-	for (i = 0; i < table->num_entries; i++) {
-	    if ((st_data_t)table->bins[i*2] == *key) {
-		if (value != 0) *value = (st_data_t)table->bins[i*2+1];
-		table->bins[i*2] = (void *)never;
-		return 1;
-	    }
+	st_index_t i = find_packed_index(table, hash_val, *key);
+	if (i < table->real_entries) {
+	    if (value != 0) *value = PVAL(table, i);
+	    *key = PKEY(table, i);
+	    remove_safe_packed_entry(table, i, never);
+	    return 1;
 	}
 	if (value != 0) *value = 0;
 	return 0;
     }
 
-    hash_val = do_hash_bin(*key, table);
-    ptr = table->bins[hash_val];
+    ptr = table->bins[hash_val % table->num_bins];
 
     for (; ptr != 0; ptr = ptr->next) {
 	if ((ptr->key != never) && EQUAL(table, ptr->key, *key)) {
-	    REMOVE_ENTRY(table, ptr);
+	    remove_entry(table, ptr);
 	    *key = ptr->key;
 	    if (value != 0) *value = ptr->record;
 	    ptr->key = ptr->record = never;
@@ -701,17 +959,23 @@ st_cleanup_safe(st_table *table, st_data_t never)
     st_table_entry *ptr, **last, *tmp;
     st_index_t i;
 
+    if (ULTRAPACKED(table)) {
+	table->real_upacked = table->num_entries;
+	return;
+    }
+
     if (table->entries_packed) {
 	st_index_t i = 0, j = 0;
-	while ((st_data_t)table->bins[i*2] != never) {
-	    if (i++ == table->num_entries) return;
+	while (PKEY(table, i) != never) {
+	    if (i++ == table->real_entries) return;
 	}
-	for (j = i; ++i < table->num_entries;) {
-	    if ((st_data_t)table->bins[i*2] == never) continue;
-	    table->bins[j*2] = table->bins[i*2];
-	    table->bins[j*2+1] = table->bins[i*2+1];
+	for (j = i; ++i < table->real_entries;) {
+	    if (PKEY(table, i) == never) continue;
+	    PACKED_ENT(table, j) = PACKED_ENT(table, i);
 	    j++;
 	}
+	table->real_entries = j;
+	/* table->num_entries really should be equal j at this moment, but let set it anyway */
 	table->num_entries = j;
 	return;
     }
@@ -722,7 +986,7 @@ st_cleanup_safe(st_table *table, st_data_t never)
 	    if (ptr->key == never) {
 		tmp = ptr;
 		*last = ptr = ptr->next;
-		free(tmp);
+		st_free_entry(tmp);
 	    }
 	    else {
 		ptr = *(last = &ptr->next);
@@ -732,50 +996,78 @@ st_cleanup_safe(st_table *table, st_data_t never)
 }
 
 int
-st_foreach(st_table *table, int (*func)(ANYARGS), st_data_t arg)
+st_foreach_check(st_table *table, int (*func)(ANYARGS), st_data_t arg, st_data_t never)
 {
     st_table_entry *ptr, **last, *tmp;
     enum st_retval retval;
-    st_index_t i;
+    st_data_t key, val;
+    st_index_t hash, i = 0;
+
+    if (table->num_entries == 0) {
+	return 0;
+    }
+
+    if (ULTRAPACKED(table)) {
+	key = UPKEY(table);
+	val = UPVAL(table);
+	hash = UPHASH(table);
+	if (key == never) return 0;
+	retval = (*func)(key, val, arg);
+	if (!ULTRAPACKED(table)) {
+	    goto packed;
+	}
+	switch(retval) {
+	  case ST_CHECK:
+	    if (UPHASH(table) == 0 && UPKEY(table) == never)
+		break;
+	    if (check_upacked(table, hash, key))
+		break;
+	    goto deleted;
+	  case ST_DELETE:
+	    remove_safe_upacked_entry(table, never);
+	  case ST_CONTINUE:
+	  case ST_STOP:
+	    break;
+	}
+	return 0;
+    }
 
     if (table->entries_packed) {
-        for (i = 0; i < table->num_entries; i++) {
-            st_index_t j;
-            st_data_t key, val;
-            key = (st_data_t)table->bins[i*2];
-            val = (st_data_t)table->bins[i*2+1];
-            retval = (*func)(key, val, arg);
+	for (i = 0; i < table->real_entries; i++) {
+	    key = PKEY(table, i);
+	    val = PVAL(table, i);
+	    hash = PHASH(table, i);
+	    if (key == never) continue;
+	    retval = (*func)(key, val, arg);
+	  packed:
 	    if (!table->entries_packed) {
-		FIND_ENTRY(table, ptr, key, i);
+		FIND_ENTRY(table, ptr, hash, i);
 		if (retval == ST_CHECK) {
 		    if (!ptr) goto deleted;
 		    goto unpacked_continue;
 		}
 		goto unpacked;
 	    }
-            switch (retval) {
+	    switch (retval) {
 	      case ST_CHECK:	/* check if hash is modified during iteration */
-                for (j = 0; j < table->num_entries; j++) {
-                    if ((st_data_t)table->bins[j*2] == key)
-                        break;
-                }
-                if (j == table->num_entries) {
+		if (PHASH(table, i) == 0 && PKEY(table, i) == never) {
+		    break;
+		}
+		i = find_packed_index(table, hash, key);
+		if (i == table->real_entries) {
 		    goto deleted;
-                }
+		}
 		/* fall through */
 	      case ST_CONTINUE:
 		break;
 	      case ST_STOP:
 		return 0;
 	      case ST_DELETE:
-                table->num_entries--;
-                memmove(&table->bins[i*2], &table->bins[(i+1)*2],
-                        sizeof(struct st_table_entry*) * 2*(table->num_entries-i));
-                i--;
-                break;
-            }
-        }
-        return 0;
+		remove_safe_packed_entry(table, i, never);
+		break;
+	    }
+	}
+	return 0;
     }
     else {
 	ptr = table->head;
@@ -783,6 +1075,8 @@ st_foreach(st_table *table, int (*func)(ANYARGS), st_data_t arg)
 
     if (ptr != 0) {
 	do {
+	    if (ptr->key == never)
+		goto unpacked_continue;
 	    i = ptr->hash % table->num_bins;
 	    retval = (*func)(ptr->key, ptr->record, arg);
 	  unpacked:
@@ -808,10 +1102,100 @@ st_foreach(st_table *table, int (*func)(ANYARGS), st_data_t arg)
 		for (; (tmp = *last) != 0; last = &tmp->next) {
 		    if (ptr == tmp) {
 			tmp = ptr->fore;
+			remove_entry(table, ptr);
+			ptr->key = ptr->record = never;
+			ptr->hash = 0;
+			ptr = tmp;
+			break;
+		    }
+		}
+	    }
+	} while (ptr && table->head);
+    }
+    return 0;
+}
+
+int
+st_foreach(st_table *table, int (*func)(ANYARGS), st_data_t arg)
+{
+    st_table_entry *ptr, **last, *tmp;
+    enum st_retval retval;
+    st_data_t key, val;
+    st_index_t hash, i = 0;
+
+    if (table->num_entries == 0) {
+	return 0;
+    }
+
+    if (ULTRAPACKED(table)) {
+	key = UPKEY(table);
+	val = UPVAL(table);
+	hash = UPHASH(table);
+	retval = (*func)(key, val, arg);
+	if (!ULTRAPACKED(table)) {
+	    goto packed;
+	}
+	switch (retval) {
+	  case ST_DELETE:
+	    remove_upacked_entry(table);
+	  case ST_CONTINUE:
+	  case ST_CHECK:
+	  case ST_STOP:
+	    break;
+	}
+	return 0;
+    }
+
+    if (table->entries_packed) {
+	for (i = 0; i < table->real_entries; i++) {
+	    key = PKEY(table, i);
+	    val = PVAL(table, i);
+	    hash = PHASH(table, i);
+	    retval = (*func)(key, val, arg);
+	  packed:
+	    if (!table->entries_packed) {
+		FIND_ENTRY(table, ptr, hash, i);
+		if (!ptr) return 0;
+		goto unpacked;
+	    }
+	    switch (retval) {
+	      case ST_CONTINUE:
+		break;
+	      case ST_CHECK:
+	      case ST_STOP:
+		return 0;
+	      case ST_DELETE:
+		remove_packed_entry(table, i);
+		i--;
+		break;
+	    }
+	}
+	return 0;
+    }
+    else {
+	ptr = table->head;
+    }
+
+    if (ptr != 0) {
+	do {
+	    i = ptr->hash % table->num_bins;
+	    retval = (*func)(ptr->key, ptr->record, arg);
+	  unpacked:
+	    switch (retval) {
+	      case ST_CONTINUE:
+		ptr = ptr->fore;
+		break;
+	      case ST_CHECK:
+	      case ST_STOP:
+		return 0;
+	      case ST_DELETE:
+		last = &table->bins[ptr->hash % table->num_bins];
+		for (; (tmp = *last) != 0; last = &tmp->next) {
+		    if (ptr == tmp) {
+			tmp = ptr->fore;
 			*last = ptr->next;
-			REMOVE_ENTRY(table, ptr);
-			free(ptr);
-			if (ptr == tmp) return 0;
+			remove_entry(table, ptr);
+			st_free_entry(ptr);
 			ptr = tmp;
 			break;
 		    }
@@ -834,13 +1218,13 @@ st_reverse_foreach(st_table *table, int (*func)(ANYARGS), st_data_t arg)
         for (i = table->num_entries-1; 0 <= i; i--) {
             int j;
             st_data_t key, val;
-            key = (st_data_t)table->bins[i*2];
-            val = (st_data_t)table->bins[i*2+1];
+            key = PKEY(table, i);
+            val = PVAL(table, i);
             retval = (*func)(key, val, arg);
             switch (retval) {
 	      case ST_CHECK:	/* check if hash is modified during iteration */
                 for (j = 0; j < table->num_entries; j++) {
-                    if ((st_data_t)table->bins[j*2] == key)
+                    if (PKEY(table, j) == key)
                         break;
                 }
                 if (j == table->num_entries) {
@@ -854,9 +1238,7 @@ st_reverse_foreach(st_table *table, int (*func)(ANYARGS), st_data_t arg)
 	      case ST_STOP:
 		return 0;
 	      case ST_DELETE:
-                table->num_entries--;
-                memmove(&table->bins[i*2], &table->bins[(i+1)*2],
-                        sizeof(struct st_table_entry*) * 2*(table->num_entries-i));
+		remove_packed_entry(table, i);
                 break;
             }
         }
@@ -889,8 +1271,8 @@ st_reverse_foreach(st_table *table, int (*func)(ANYARGS), st_data_t arg)
 		    if (ptr == tmp) {
 			tmp = ptr->back;
 			*last = ptr->next;
-			REMOVE_ENTRY(table, ptr);
-			free(ptr);
+			remove_entry(table, ptr);
+			st_free_entry(ptr);
 			ptr = tmp;
 			break;
 		    }
diff --git a/test/ruby/test_array.rb b/test/ruby/test_array.rb
index 28d3e41..bcad2c0 100644
--- a/test/ruby/test_array.rb
+++ b/test/ruby/test_array.rb
@@ -414,6 +414,18 @@ class TestArray < Test::Unit::TestCase
     a = @cls[1, 2, 3]
     a[-1, 0] = a
     assert_equal([1, 2, 1, 2, 3, 3], a)
+
+    a = @cls[]
+    a[5,0] = [5]
+    assert_equal([nil, nil, nil, nil, nil, 5], a)
+
+    a = @cls[1]
+    a[1,0] = [2]
+    assert_equal([1, 2], a)
+
+    a = @cls[1]
+    a[1,1] = [2]
+    assert_equal([1, 2], a)
   end
 
   def test_assoc
diff --git a/test/ruby/test_marshal.rb b/test/ruby/test_marshal.rb
index 7ec6959..f5774cd 100644
--- a/test/ruby/test_marshal.rb
+++ b/test/ruby/test_marshal.rb
@@ -312,7 +312,7 @@ class TestMarshal < Test::Unit::TestCase
         assert_equal(a.instance_variable_get(i), b.instance_variable_get(i), bug1932)
       end
     end
-    a.__send__(a.methods(true).grep(/=\z/)[0], a)
+    a.__send__(a.methods(true).grep(/\Ar.+=\z/)[0], a)
     assert_nothing_raised(bug1932) do
       b = Marshal.load(Marshal.dump(a))
       assert_equal(ClassISO8859_1, b.class, bug1932)
diff --git a/test/ruby/test_method.rb b/test/ruby/test_method.rb
index 2cc0de5..b1bf33e 100644
--- a/test/ruby/test_method.rb
+++ b/test/ruby/test_method.rb
@@ -406,7 +406,7 @@ class TestMethod < Test::Unit::TestCase
     obj = a.new
     assert_equal([:a], obj.public_methods(false), bug)
     obj.extend(m)
-    assert_equal([:m1, :a], obj.public_methods(false), bug)
+    assert_equal([:a, :m1], obj.public_methods(false).sort, bug)
   end
 
   def test_visibility
diff --git a/test/ruby/test_module.rb b/test/ruby/test_module.rb
index 6176f48..a67d845 100644
--- a/test/ruby/test_module.rb
+++ b/test/ruby/test_module.rb
@@ -870,7 +870,7 @@ class TestModule < Test::Unit::TestCase
       (class << self ; self ; end).class_eval do
         define_method :method_added do |sym|
           memo << sym
-          memo << mod.instance_methods(false)
+          memo << mod.instance_methods(false).sort
           memo << (mod.instance_method(sym) rescue nil)
         end
       end
@@ -887,10 +887,10 @@ class TestModule < Test::Unit::TestCase
     assert_equal [:f, :g], memo.shift
     assert_equal mod.instance_method(:f), memo.shift
     assert_equal :a, memo.shift
-    assert_equal [:f, :g, :a], memo.shift
+    assert_equal [:a, :f, :g], memo.shift
     assert_equal mod.instance_method(:a), memo.shift
     assert_equal :a=, memo.shift
-    assert_equal [:f, :g, :a, :a=], memo.shift
+    assert_equal [:a, :a=, :f, :g], memo.shift
     assert_equal mod.instance_method(:a=), memo.shift
   end
 
diff --git a/test/ruby/test_require.rb b/test/ruby/test_require.rb
index 58a9ee2..ec75096 100644
--- a/test/ruby/test_require.rb
+++ b/test/ruby/test_require.rb
@@ -356,4 +356,114 @@ class TestRequire < Test::Unit::TestCase
     $:.replace(loadpath)
     $".replace(features)
   end
+
+  def test_require_changed_current_dir
+    bug7158 = '[ruby-core:47970]'
+    Dir.mktmpdir {|tmp|
+      Dir.chdir(tmp) {
+        Dir.mkdir("a")
+        Dir.mkdir("b")
+        open(File.join("a", "foo.rb"), "w") {}
+        open(File.join("b", "bar.rb"), "w") {|f|
+          f.puts "p :ok"
+        }
+        assert_in_out_err([], <<-INPUT, %w(:ok), [], bug7158)
+          $: << "."
+          Dir.chdir("a")
+          require "foo"
+          Dir.chdir("../b")
+          p :ng unless require "bar"
+          Dir.chdir("..")
+          p :ng if require "b/bar"
+        INPUT
+      }
+    }
+  end
+
+  def test_require_not_modified_load_path
+    bug7158 = '[ruby-core:47970]'
+    Dir.mktmpdir {|tmp|
+      Dir.chdir(tmp) {
+        open("foo.rb", "w") {}
+        assert_in_out_err([], <<-INPUT, %w(:ok), [], bug7158)
+          a = Object.new
+          def a.to_str
+            "#{tmp}"
+          end
+          $: << a
+          require "foo"
+          last_path = $:.pop
+          p :ok if last_path == a && last_path.class == Object
+        INPUT
+      }
+    }
+  end
+
+  def test_require_changed_home
+    bug7158 = '[ruby-core:47970]'
+    Dir.mktmpdir {|tmp|
+      Dir.chdir(tmp) {
+        open("foo.rb", "w") {}
+        Dir.mkdir("a")
+        open(File.join("a", "bar.rb"), "w") {}
+        assert_in_out_err([], <<-INPUT, %w(:ok), [], bug7158)
+          $: << '~'
+          ENV['HOME'] = "#{tmp}"
+          require "foo"
+          ENV['HOME'] = "#{tmp}/a"
+          p :ok if require "bar"
+        INPUT
+      }
+    }
+  end
+
+  def test_require_to_path_redefined_in_load_path
+    bug7158 = '[ruby-core:47970]'
+    Dir.mktmpdir {|tmp|
+      Dir.chdir(tmp) {
+        open("foo.rb", "w") {}
+        assert_in_out_err(["RUBYOPT"=>nil], <<-INPUT, %w(:ok), [], bug7158)
+          a = Object.new
+          def a.to_path
+            "bar"
+          end
+          $: << a
+          begin
+            require "foo"
+            p :ng
+          rescue LoadError
+          end
+          def a.to_path
+            "#{tmp}"
+          end
+          p :ok if require "foo"
+        INPUT
+      }
+    }
+  end
+
+  def test_require_to_str_redefined_in_load_path
+    bug7158 = '[ruby-core:47970]'
+    Dir.mktmpdir {|tmp|
+      Dir.chdir(tmp) {
+        open("foo.rb", "w") {}
+        assert_in_out_err(["RUBYOPT"=>nil], <<-INPUT, %w(:ok), [], bug7158)
+          a = Object.new
+          def a.to_str
+            "foo"
+          end
+          $: << a
+          begin
+            require "foo"
+            p :ng
+          rescue LoadError
+          end
+          def a.to_str
+            "#{tmp}"
+          end
+          p :ok if require "foo"
+        INPUT
+      }
+    }
+  end
 end
diff --git a/time.c b/time.c
index 755812f..83edc83 100644
--- a/time.c
+++ b/time.c
@@ -4712,16 +4712,14 @@ time_mload(VALUE time, VALUE str)
     long nsec;
     VALUE submicro, nano_num, nano_den, offset;
     wideval_t timew;
-    st_data_t data;
 
     time_modify(time);
 
 #define get_attr(attr, iffound) \
     attr = rb_attr_get(str, id_##attr); \
     if (!NIL_P(attr)) { \
-	data = id_##attr; \
 	iffound; \
-        st_delete(rb_generic_ivar_table(str), &data, 0); \
+        sa_delete(rb_generic_ivar_table(str), (sa_index_t)id_##attr, 0); \
     }
 
     get_attr(nano_num, {});
diff --git a/variable.c b/variable.c
index 3da500e..385d4af 100644
--- a/variable.c
+++ b/variable.c
@@ -19,15 +19,15 @@
 #include "constant.h"
 #include "internal.h"
 
-st_table *rb_global_tbl;
-st_table *rb_class_tbl;
+sa_table rb_global_tbl;
+sa_table rb_class_tbl;
 static ID autoload, classpath, tmp_classpath, classid;
 
 void
 Init_var_tables(void)
 {
-    rb_global_tbl = st_init_numtable();
-    rb_class_tbl = st_init_numtable();
+    sa_init_table(&rb_global_tbl, 0);
+    sa_init_table(&rb_class_tbl, 0);
     CONST_ID(autoload, "__autoload__");
     CONST_ID(classpath, "__classpath__");
     CONST_ID(tmp_classpath, "__tmp_classpath__");
@@ -43,7 +43,7 @@ struct fc_result {
 };
 
 static VALUE
-fc_path(struct fc_result *fc, ID name)
+fc_path(struct fc_result *fc, sa_index_t name)
 {
     VALUE path, tmp;
 
@@ -51,8 +51,7 @@ fc_path(struct fc_result *fc, ID name)
     while (fc) {
 	st_data_t n;
 	if (fc->track == rb_cObject) break;
-	if (RCLASS_IV_TBL(fc->track) &&
-	    st_lookup(RCLASS_IV_TBL(fc->track), (st_data_t)classpath, &n)) {
+	if (sa_lookup(RCLASS_IV_TBL(fc->track), (sa_index_t)classpath, &n)) {
 	    tmp = rb_str_dup((VALUE)n);
 	    rb_str_cat2(tmp, "::");
 	    rb_str_append(tmp, path);
@@ -70,7 +69,7 @@ fc_path(struct fc_result *fc, ID name)
 }
 
 static int
-fc_i(ID key, rb_const_entry_t *ce, struct fc_result *res)
+fc_i(sa_index_t key, rb_const_entry_t *ce, struct fc_result *res)
 {
     VALUE value = ce->value;
     if (!rb_is_const_id(key)) return ST_CONTINUE;
@@ -98,7 +97,7 @@ fc_i(ID key, rb_const_entry_t *ce, struct fc_result *res)
 	    arg.klass = res->klass;
 	    arg.track = value;
 	    arg.prev = res;
-	    st_foreach(RCLASS_CONST_TBL(value), fc_i, (st_data_t)&arg);
+	    sa_foreach(RCLASS_CONST_TBL(value), fc_i, (st_data_t)&arg);
 	    if (arg.path) {
 		res->path = arg.path;
 		return ST_STOP;
@@ -123,18 +122,14 @@ find_class_path(VALUE klass)
     arg.track = rb_cObject;
     arg.prev = 0;
     if (RCLASS_CONST_TBL(rb_cObject)) {
-	st_foreach_safe(RCLASS_CONST_TBL(rb_cObject), fc_i, (st_data_t)&arg);
+	sa_foreach(RCLASS_CONST_TBL(rb_cObject), fc_i, (st_data_t)&arg);
     }
     if (arg.path == 0) {
-	st_foreach_safe(rb_class_tbl, fc_i, (st_data_t)&arg);
+	sa_foreach(&rb_class_tbl, fc_i, (st_data_t)&arg);
     }
     if (arg.path) {
-	st_data_t tmp = tmp_classpath;
-	if (!RCLASS_IV_TBL(klass)) {
-	    RCLASS_IV_TBL(klass) = st_init_numtable();
-	}
-	st_insert(RCLASS_IV_TBL(klass), (st_data_t)classpath, arg.path);
-	st_delete(RCLASS_IV_TBL(klass), &tmp, 0);
+	sa_insert(RCLASS_IV_TBL(klass), (sa_index_t)classpath, arg.path);
+	sa_delete(RCLASS_IV_TBL(klass), (sa_index_t)tmp_classpath, 0);
 	return arg.path;
     }
     return Qnil;
@@ -147,16 +142,15 @@ classname(VALUE klass)
     st_data_t n;
 
     if (!klass) klass = rb_cObject;
-    if (RCLASS_IV_TBL(klass)) {
-	if (!st_lookup(RCLASS_IV_TBL(klass), (st_data_t)classpath, &n)) {
-	    if (!st_lookup(RCLASS_IV_TBL(klass), (st_data_t)classid, &n)) {
+    if (RCLASS_IV_TBL(klass)->num_entries) {
+	if (!sa_lookup(RCLASS_IV_TBL(klass), (sa_index_t)classpath, &n)) {
+	    if (!sa_lookup(RCLASS_IV_TBL(klass), (sa_index_t)classid, &n)) {
 		return find_class_path(klass);
 	    }
 	    path = rb_str_dup(rb_id2str(SYM2ID((VALUE)n)));
 	    OBJ_FREEZE(path);
-	    st_insert(RCLASS_IV_TBL(klass), (st_data_t)classpath, (st_data_t)path);
-	    n = classid;
-	    st_delete(RCLASS_IV_TBL(klass), &n, 0);
+	    sa_insert(RCLASS_IV_TBL(klass), (sa_index_t)classpath, (st_data_t)path);
+	    sa_delete(RCLASS_IV_TBL(klass), (sa_index_t)classid, 0);
 	}
 	else {
 	    path = (VALUE)n;
@@ -192,8 +186,7 @@ rb_class_path(VALUE klass)
     st_data_t n = (st_data_t)path;
 
     if (!NIL_P(path)) return path;
-    if (RCLASS_IV_TBL(klass) && st_lookup(RCLASS_IV_TBL(klass),
-					  (st_data_t)tmp_classpath, &n)) {
+    if (sa_lookup(RCLASS_IV_TBL(klass), (sa_index_t)tmp_classpath, &n)) {
 	return (VALUE)n;
     }
     else {
@@ -364,7 +357,7 @@ rb_global_entry(ID id)
     struct global_entry *entry;
     st_data_t data;
 
-    if (!st_lookup(rb_global_tbl, (st_data_t)id, &data)) {
+    if (!sa_lookup(&rb_global_tbl, (sa_index_t)id, &data)) {
 	struct global_variable *var;
 	entry = ALLOC(struct global_entry);
 	var = ALLOC(struct global_variable);
@@ -378,7 +371,7 @@ rb_global_entry(ID id)
 
 	var->block_trace = 0;
 	var->trace = 0;
-	st_add_direct(rb_global_tbl, id, (st_data_t)entry);
+	sa_insert(&rb_global_tbl, (sa_index_t)id, (st_data_t)entry);
     }
     else {
 	entry = (struct global_entry *)data;
@@ -454,8 +447,8 @@ readonly_setter(VALUE val, ID id, void *data, struct global_variable *gvar)
     rb_name_error(id, "%s is a read-only variable", rb_id2name(id));
 }
 
-static int
-mark_global_entry(ID key, struct global_entry *entry)
+static void
+mark_global_entry(struct global_entry *entry)
 {
     struct trace_var *trace;
     struct global_variable *var = entry->var;
@@ -466,14 +459,14 @@ mark_global_entry(ID key, struct global_entry *entry)
 	if (trace->data) rb_gc_mark_maybe(trace->data);
 	trace = trace->next;
     }
-    return ST_CONTINUE;
 }
 
 void
 rb_gc_mark_global_tbl(void)
 {
-    if (rb_global_tbl)
-        st_foreach_safe(rb_global_tbl, mark_global_entry, 0);
+    SA_FOREACH_START(&rb_global_tbl);
+    mark_global_entry((struct global_entry*) value);
+    SA_FOREACH_END();
 }
 
 static ID
@@ -635,7 +628,7 @@ rb_f_untrace_var(int argc, VALUE *argv)
     rb_secure(4);
     rb_scan_args(argc, argv, "11", &var, &cmd);
     id = rb_to_id(var);
-    if (!st_lookup(rb_global_tbl, (st_data_t)id, &data)) {
+    if (!sa_lookup(&rb_global_tbl, (sa_index_t)id, &data)) {
 	rb_name_error(id, "undefined global variable %s", rb_id2name(id));
     }
 
@@ -742,13 +735,6 @@ rb_gvar_defined(struct global_entry *entry)
     return Qtrue;
 }
 
-static int
-gvar_i(ID key, struct global_entry *entry, VALUE ary)
-{
-    rb_ary_push(ary, ID2SYM(key));
-    return ST_CONTINUE;
-}
-
 /*
  *  call-seq:
  *     global_variables    -> array
@@ -765,7 +751,9 @@ rb_f_global_variables(void)
     char buf[2];
     int i;
 
-    st_foreach_safe(rb_global_tbl, gvar_i, ary);
+    SA_FOREACH_START(&rb_global_tbl);
+    rb_ary_push(ary, ID2SYM(entry->key));
+    SA_FOREACH_END();
     buf[0] = '$';
     for (i = 1; i <= 9; ++i) {
 	buf[1] = (char)(i + '0');
@@ -784,10 +772,10 @@ rb_alias_variable(ID name1, ID name2)
 	rb_raise(rb_eSecurityError, "Insecure: can't alias global variable");
 
     entry2 = rb_global_entry(name2);
-    if (!st_lookup(rb_global_tbl, (st_data_t)name1, &data1)) {
+    if (!sa_lookup(&rb_global_tbl, (sa_index_t)name1, &data1)) {
 	entry1 = ALLOC(struct global_entry);
 	entry1->id = name1;
-	st_add_direct(rb_global_tbl, name1, (st_data_t)entry1);
+	sa_insert(&rb_global_tbl, (sa_index_t)name1, (st_data_t)entry1);
     }
     else if ((entry1 = (struct global_entry *)data1)->var != entry2->var) {
 	struct global_variable *var = entry1->var;
@@ -815,7 +803,7 @@ rb_alias_variable(ID name1, ID name2)
 static int special_generic_ivar = 0;
 static st_table *generic_iv_tbl;
 
-st_table*
+sa_table*
 rb_generic_ivar_table(VALUE obj)
 {
     st_data_t tbl;
@@ -823,7 +811,7 @@ rb_generic_ivar_table(VALUE obj)
     if (!FL_TEST(obj, FL_EXIVAR)) return 0;
     if (!generic_iv_tbl) return 0;
     if (!st_lookup(generic_iv_tbl, (st_data_t)obj, &tbl)) return 0;
-    return (st_table *)tbl;
+    return (sa_table *)tbl;
 }
 
 static VALUE
@@ -833,7 +821,7 @@ generic_ivar_get(VALUE obj, ID id, int warn)
 
     if (generic_iv_tbl) {
 	if (st_lookup(generic_iv_tbl, (st_data_t)obj, &tbl)) {
-	    if (st_lookup((st_table *)tbl, (st_data_t)id, &val)) {
+	    if (sa_lookup((sa_table *)tbl, (sa_index_t)id, &val)) {
 		return (VALUE)val;
 	    }
 	}
@@ -847,7 +835,6 @@ generic_ivar_get(VALUE obj, ID id, int warn)
 static void
 generic_ivar_set(VALUE obj, ID id, VALUE val)
 {
-    st_table *tbl;
     st_data_t data;
 
     if (rb_special_const_p(obj)) {
@@ -859,24 +846,22 @@ generic_ivar_set(VALUE obj, ID id, VALUE val)
     }
     if (!st_lookup(generic_iv_tbl, (st_data_t)obj, &data)) {
 	FL_SET(obj, FL_EXIVAR);
-	tbl = st_init_numtable();
-	st_add_direct(generic_iv_tbl, (st_data_t)obj, (st_data_t)tbl);
-	st_add_direct(tbl, (st_data_t)id, (st_data_t)val);
-	return;
+	data = (st_data_t)sa_new_table();
+	st_add_direct(generic_iv_tbl, (st_data_t)obj, data);
     }
-    st_insert((st_table *)data, (st_data_t)id, (st_data_t)val);
+    sa_insert((sa_table *)data, (sa_index_t)id, (st_data_t)val);
 }
 
 static VALUE
 generic_ivar_defined(VALUE obj, ID id)
 {
-    st_table *tbl;
+    sa_table *tbl;
     st_data_t data;
 
     if (!generic_iv_tbl) return Qfalse;
     if (!st_lookup(generic_iv_tbl, (st_data_t)obj, &data)) return Qfalse;
-    tbl = (st_table *)data;
-    if (st_lookup(tbl, (st_data_t)id, &data)) {
+    tbl = (sa_table *)data;
+    if (sa_lookup(tbl, (sa_index_t)id, &data)) {
 	return Qtrue;
     }
     return Qfalse;
@@ -885,18 +870,18 @@ generic_ivar_defined(VALUE obj, ID id)
 static int
 generic_ivar_remove(VALUE obj, ID id, st_data_t *valp)
 {
-    st_table *tbl;
+    sa_table *tbl;
     st_data_t data, key = (st_data_t)id;
     int status;
 
     if (!generic_iv_tbl) return 0;
     if (!st_lookup(generic_iv_tbl, (st_data_t)obj, &data)) return 0;
-    tbl = (st_table *)data;
-    status = st_delete(tbl, &key, valp);
+    tbl = (sa_table *)data;
+    status = sa_delete(tbl, (sa_index_t)id, valp);
     if (tbl->num_entries == 0) {
 	key = (st_data_t)obj;
 	st_delete(generic_iv_tbl, &key, &data);
-	st_free_table((st_table *)data);
+	sa_free_table(tbl);
     }
     return status;
 }
@@ -908,22 +893,17 @@ rb_mark_generic_ivar(VALUE obj)
 
     if (!generic_iv_tbl) return;
     if (st_lookup(generic_iv_tbl, (st_data_t)obj, &tbl)) {
-	rb_mark_tbl((st_table *)tbl);
+	rb_mark_sa_tbl((sa_table *)tbl);
     }
 }
 
 static int
-givar_mark_i(ID key, VALUE value)
-{
-    rb_gc_mark(value);
-    return ST_CONTINUE;
-}
-
-static int
-givar_i(VALUE obj, st_table *tbl)
+givar_i(VALUE obj, sa_table *tbl)
 {
     if (rb_special_const_p(obj)) {
-	st_foreach_safe(tbl, givar_mark_i, 0);
+        SA_FOREACH_START(tbl);
+        rb_gc_mark((VALUE)value);
+        SA_FOREACH_END();
     }
     return ST_CONTINUE;
 }
@@ -943,7 +923,7 @@ rb_free_generic_ivar(VALUE obj)
 
     if (!generic_iv_tbl) return;
     if (st_delete(generic_iv_tbl, &key, &tbl))
-	st_free_table((st_table *)tbl);
+	sa_free_table((sa_table *)tbl);
 }
 
 RUBY_FUNC_EXPORTED size_t
@@ -951,7 +931,7 @@ rb_generic_ivar_memsize(VALUE obj)
 {
     st_data_t tbl;
     if (st_lookup(generic_iv_tbl, (st_data_t)obj, &tbl))
-	return st_memsize((st_table *)tbl);
+	return sa_memsize((sa_table *)tbl);
     return 0;
 }
 
@@ -970,17 +950,17 @@ rb_copy_generic_ivar(VALUE clone, VALUE obj)
         return;
     }
     if (st_lookup(generic_iv_tbl, (st_data_t)obj, &data)) {
-	st_table *tbl = (st_table *)data;
+	sa_table *tbl = (sa_table *)data;
 
         if (tbl->num_entries == 0)
             goto clear;
 
 	if (st_lookup(generic_iv_tbl, (st_data_t)clone, &data)) {
-	    st_free_table((st_table *)data);
-	    st_insert(generic_iv_tbl, (st_data_t)clone, (st_data_t)st_copy(tbl));
+	    sa_free_table((sa_table *)data);
+	    st_insert(generic_iv_tbl, (st_data_t)clone, (st_data_t)sa_copy(tbl));
 	}
 	else {
-	    st_add_direct(generic_iv_tbl, (st_data_t)clone, (st_data_t)st_copy(tbl));
+	    st_add_direct(generic_iv_tbl, (st_data_t)clone, (st_data_t)sa_copy(tbl));
 	    FL_SET(clone, FL_EXIVAR);
 	}
     }
@@ -990,7 +970,7 @@ static VALUE
 ivar_get(VALUE obj, ID id, int warn)
 {
     VALUE val, *ptr;
-    struct st_table *iv_index_tbl;
+    sa_table *iv_index_tbl;
     long len;
     st_data_t index;
 
@@ -1000,7 +980,7 @@ ivar_get(VALUE obj, ID id, int warn)
         ptr = ROBJECT_IVPTR(obj);
         iv_index_tbl = ROBJECT_IV_INDEX_TBL(obj);
         if (!iv_index_tbl) break;
-        if (!st_lookup(iv_index_tbl, (st_data_t)id, &index)) break;
+        if (!sa_lookup(iv_index_tbl, (sa_index_t)id, &index)) break;
         if (len <= (long)index) break;
         val = ptr[index];
         if (val != Qundef)
@@ -1008,7 +988,7 @@ ivar_get(VALUE obj, ID id, int warn)
 	break;
       case T_CLASS:
       case T_MODULE:
-	if (RCLASS_IV_TBL(obj) && st_lookup(RCLASS_IV_TBL(obj), (st_data_t)id, &index))
+	if (sa_lookup(RCLASS_IV_TBL(obj), (sa_index_t)id, &index))
 	    return (VALUE)index;
 	break;
       default:
@@ -1037,7 +1017,7 @@ rb_attr_get(VALUE obj, ID id)
 VALUE
 rb_ivar_set(VALUE obj, ID id, VALUE val)
 {
-    struct st_table *iv_index_tbl;
+    struct sa_table *iv_index_tbl;
     st_data_t index;
     long i, len;
     int ivar_extended;
@@ -1051,14 +1031,11 @@ rb_ivar_set(VALUE obj, ID id, VALUE val)
         if (!iv_index_tbl) {
             VALUE klass = rb_obj_class(obj);
             iv_index_tbl = RCLASS_IV_INDEX_TBL(klass);
-            if (!iv_index_tbl) {
-                iv_index_tbl = RCLASS_IV_INDEX_TBL(klass) = st_init_numtable();
-            }
         }
         ivar_extended = 0;
-        if (!st_lookup(iv_index_tbl, (st_data_t)id, &index)) {
+        if (!sa_lookup(iv_index_tbl, (sa_index_t)id, &index)) {
             index = iv_index_tbl->num_entries;
-            st_add_direct(iv_index_tbl, (st_data_t)id, index);
+            sa_insert(iv_index_tbl, (sa_index_t)id, index);
             ivar_extended = 1;
         }
         len = ROBJECT_NUMIV(obj);
@@ -1098,8 +1075,7 @@ rb_ivar_set(VALUE obj, ID id, VALUE val)
 	break;
       case T_CLASS:
       case T_MODULE:
-	if (!RCLASS_IV_TBL(obj)) RCLASS_IV_TBL(obj) = st_init_numtable();
-	st_insert(RCLASS_IV_TBL(obj), (st_data_t)id, val);
+	sa_insert(RCLASS_IV_TBL(obj), (sa_index_t)id, val);
         break;
       default:
 	generic_ivar_set(obj, id, val);
@@ -1112,13 +1088,13 @@ VALUE
 rb_ivar_defined(VALUE obj, ID id)
 {
     VALUE val;
-    struct st_table *iv_index_tbl;
+    struct sa_table *iv_index_tbl;
     st_data_t index;
     switch (TYPE(obj)) {
       case T_OBJECT:
         iv_index_tbl = ROBJECT_IV_INDEX_TBL(obj);
         if (!iv_index_tbl) break;
-        if (!st_lookup(iv_index_tbl, (st_data_t)id, &index)) break;
+        if (!sa_lookup(iv_index_tbl, (sa_index_t)id, &index)) break;
         if (ROBJECT_NUMIV(obj) <= (long)index) break;
         val = ROBJECT_IVPTR(obj)[index];
         if (val != Qundef)
@@ -1126,7 +1102,7 @@ rb_ivar_defined(VALUE obj, ID id)
 	break;
       case T_CLASS:
       case T_MODULE:
-	if (RCLASS_IV_TBL(obj) && st_lookup(RCLASS_IV_TBL(obj), (st_data_t)id, 0))
+	if (sa_lookup(RCLASS_IV_TBL(obj), (sa_index_t)id, 0))
 	    return Qtrue;
 	break;
       default:
@@ -1137,40 +1113,26 @@ rb_ivar_defined(VALUE obj, ID id)
     return Qfalse;
 }
 
-struct obj_ivar_tag {
-    VALUE obj;
-    int (*func)(ID key, VALUE val, st_data_t arg);
-    st_data_t arg;
-};
-
-static int
-obj_ivar_i(st_data_t key, st_data_t index, st_data_t arg)
-{
-    struct obj_ivar_tag *data = (struct obj_ivar_tag *)arg;
-    if ((long)index < ROBJECT_NUMIV(data->obj)) {
-        VALUE val = ROBJECT_IVPTR(data->obj)[(long)index];
-        if (val != Qundef) {
-            return (data->func)((ID)key, val, data->arg);
-        }
-    }
-    return ST_CONTINUE;
-}
-
 static void
 obj_ivar_each(VALUE obj, int (*func)(ANYARGS), st_data_t arg)
 {
-    st_table *tbl;
-    struct obj_ivar_tag data;
+    sa_table *tbl;
+    long numiv = ROBJECT_NUMIV(obj);
+    VALUE *vars = ROBJECT_IVPTR(obj);
 
     tbl = ROBJECT_IV_INDEX_TBL(obj);
-    if (!tbl)
+    if (!tbl || !numiv)
         return;
 
-    data.obj = obj;
-    data.func = (int (*)(ID key, VALUE val, st_data_t arg))func;
-    data.arg = arg;
-
-    st_foreach_safe(tbl, obj_ivar_i, (st_data_t)&data);
+    SA_FOREACH_START(tbl);
+    if ((long)value < numiv) {
+	VALUE val = vars[value];
+	if (val != Qundef) {
+	    if (((sa_iter_func)func)(entry->key, val, arg) == SA_STOP)
+		break;
+	}
+    }
+    SA_FOREACH_END();
 }
 
 void
@@ -1182,9 +1144,7 @@ rb_ivar_foreach(VALUE obj, int (*func)(ANYARGS), st_data_t arg)
 	break;
       case T_CLASS:
       case T_MODULE:
-	if (RCLASS_IV_TBL(obj)) {
-	    st_foreach_safe(RCLASS_IV_TBL(obj), func, arg);
-	}
+        sa_foreach(RCLASS_IV_TBL(obj), func, arg);
 	break;
       default:
 	if (!generic_iv_tbl) break;
@@ -1192,7 +1152,7 @@ rb_ivar_foreach(VALUE obj, int (*func)(ANYARGS), st_data_t arg)
 	    st_data_t tbl;
 
 	    if (st_lookup(generic_iv_tbl, (st_data_t)obj, &tbl)) {
-		st_foreach_safe((st_table *)tbl, func, arg);
+		sa_foreach((sa_table *)tbl, func, arg);
 	    }
 	}
 	break;
@@ -1202,11 +1162,11 @@ rb_ivar_foreach(VALUE obj, int (*func)(ANYARGS), st_data_t arg)
 st_index_t
 rb_ivar_count(VALUE obj)
 {
-    st_table *tbl;
+    sa_table *tbl;
     switch (TYPE(obj)) {
       case T_OBJECT:
 	if ((tbl = ROBJECT_IV_INDEX_TBL(obj)) != 0) {
-	    st_index_t i, count, num = tbl->num_entries;
+	    sa_index_t i, count, num = tbl->num_entries;
 	    const VALUE *const ivptr = ROBJECT_IVPTR(obj);
 	    for (i = count = 0; i < num; ++i) {
 		if (ivptr[i] != Qundef) {
@@ -1228,7 +1188,7 @@ rb_ivar_count(VALUE obj)
 	    st_data_t data;
 
 	    if (st_lookup(generic_iv_tbl, (st_data_t)obj, &data) &&
-		(tbl = (st_table *)data) != 0) {
+		(tbl = (sa_table *)data) != 0) {
 		return tbl->num_entries;
 	    }
 	}
@@ -1238,7 +1198,7 @@ rb_ivar_count(VALUE obj)
 }
 
 static int
-ivar_i(ID key, VALUE val, VALUE ary)
+ivar_i(sa_index_t key, VALUE val, VALUE ary)
 {
     if (rb_is_instance_id(key)) {
 	rb_ary_push(ary, ID2SYM(key));
@@ -1301,7 +1261,7 @@ rb_obj_remove_instance_variable(VALUE obj, VALUE name)
     VALUE val = Qnil;
     const ID id = rb_to_id(name);
     st_data_t n, v;
-    struct st_table *iv_index_tbl;
+    struct sa_table *iv_index_tbl;
     st_data_t index;
 
     if (!OBJ_UNTRUSTED(obj) && rb_safe_level() >= 4)
@@ -1315,7 +1275,7 @@ rb_obj_remove_instance_variable(VALUE obj, VALUE name)
       case T_OBJECT:
         iv_index_tbl = ROBJECT_IV_INDEX_TBL(obj);
         if (!iv_index_tbl) break;
-        if (!st_lookup(iv_index_tbl, (st_data_t)id, &index)) break;
+        if (!sa_lookup(iv_index_tbl, (sa_index_t)id, &index)) break;
         if (ROBJECT_NUMIV(obj) <= (long)index) break;
         val = ROBJECT_IVPTR(obj)[index];
         if (val != Qundef) {
@@ -1326,14 +1286,14 @@ rb_obj_remove_instance_variable(VALUE obj, VALUE name)
       case T_CLASS:
       case T_MODULE:
 	n = id;
-	if (RCLASS_IV_TBL(obj) && st_delete(RCLASS_IV_TBL(obj), &n, &v)) {
+	if (sa_delete(RCLASS_IV_TBL(obj), (sa_index_t)id, &v)) {
 	    return (VALUE)v;
 	}
 	break;
       default:
 	if (FL_TEST(obj, FL_EXIVAR) || rb_special_const_p(obj)) {
 	    v = val;
-	    if (generic_ivar_remove(obj, (st_data_t)id, &v)) {
+	    if (generic_ivar_remove(obj, id, &v)) {
 		return (VALUE)v;
 	    }
 	}
@@ -1410,20 +1370,20 @@ rb_mod_const_missing(VALUE klass, VALUE name)
 static void
 autoload_mark(void *ptr)
 {
-    rb_mark_tbl((st_table *)ptr);
+    rb_mark_sa_tbl((sa_table *)ptr);
 }
 
 static void
 autoload_free(void *ptr)
 {
-    st_free_table((st_table *)ptr);
+    sa_free_table((sa_table *)ptr);
 }
 
 static size_t
 autoload_memsize(const void *ptr)
 {
-    const st_table *tbl = ptr;
-    return st_memsize(tbl);
+    const sa_table *tbl = ptr;
+    return sa_memsize(tbl);
 }
 
 static const rb_data_type_t autoload_data_type = {
@@ -1432,14 +1392,14 @@ static const rb_data_type_t autoload_data_type = {
 };
 
 #define check_autoload_table(av) \
-    (struct st_table *)rb_check_typeddata((av), &autoload_data_type)
+    (struct sa_table *)rb_check_typeddata((av), &autoload_data_type)
 
 void
 rb_autoload(VALUE mod, ID id, const char *file)
 {
     st_data_t av;
     VALUE fn;
-    struct st_table *tbl;
+    struct sa_table *tbl;
 
     if (!rb_is_const_id(id)) {
 	rb_raise(rb_eNameError, "autoload must be constant name: %s", rb_id2name(id));
@@ -1448,43 +1408,41 @@ rb_autoload(VALUE mod, ID id, const char *file)
 	rb_raise(rb_eArgError, "empty file name");
     }
 
-    if ((tbl = RCLASS_CONST_TBL(mod)) && st_lookup(tbl, (st_data_t)id, &av) && ((rb_const_entry_t*)av)->value != Qundef)
+    if (sa_lookup(RCLASS_CONST_TBL(mod), (sa_index_t)id, &av) && ((rb_const_entry_t*)av)->value != Qundef)
 	return;
 
     rb_const_set(mod, id, Qundef);
     tbl = RCLASS_IV_TBL(mod);
-    if (tbl && st_lookup(tbl, (st_data_t)autoload, &av)) {
+    if (sa_lookup(tbl, (sa_index_t)autoload, &av)) {
 	tbl = check_autoload_table((VALUE)av);
     }
     else {
-	if (!tbl) tbl = RCLASS_IV_TBL(mod) = st_init_numtable();
 	av = (st_data_t)TypedData_Wrap_Struct(0, &autoload_data_type, 0);
-	st_add_direct(tbl, (st_data_t)autoload, av);
-	DATA_PTR(av) = tbl = st_init_numtable();
+	sa_insert(tbl, (sa_index_t)autoload, av);
+	DATA_PTR(av) = tbl = sa_new_table();
     }
     fn = rb_str_new2(file);
     FL_UNSET(fn, FL_TAINT);
     OBJ_FREEZE(fn);
-    st_insert(tbl, (st_data_t)id, (st_data_t)rb_node_newnode(NODE_MEMO, fn, rb_safe_level(), 0));
+    sa_insert(tbl, (sa_index_t)id, (st_data_t)rb_node_newnode(NODE_MEMO, fn, rb_safe_level(), 0));
 }
 
 static NODE*
 autoload_delete(VALUE mod, ID id)
 {
-    st_data_t val, load = 0, n = id;
+    st_data_t val, load = 0;
     rb_const_entry_t *ce;
 
-    st_delete(RCLASS_CONST_TBL(mod), &n, &val);
+    sa_delete(RCLASS_CONST_TBL(mod), (sa_index_t)id, &val);
     ce = (rb_const_entry_t*)val;
     if (ce) xfree(ce);
-    if (st_lookup(RCLASS_IV_TBL(mod), (st_data_t)autoload, &val)) {
-	struct st_table *tbl = check_autoload_table((VALUE)val);
+    if (sa_lookup(RCLASS_IV_TBL(mod), (sa_index_t)autoload, &val)) {
+	struct sa_table *tbl = check_autoload_table((VALUE)val);
 
-	st_delete(tbl, &n, &load);
+	sa_delete(tbl, (sa_index_t)id, &load);
 
 	if (tbl->num_entries == 0) {
-	    n = autoload;
-	    st_delete(RCLASS_IV_TBL(mod), &n, &val);
+	    sa_delete(RCLASS_IV_TBL(mod), (sa_index_t)autoload, &val);
 	}
     }
 
@@ -1509,14 +1467,14 @@ static NODE *
 autoload_node(VALUE mod, ID id, const char **loadingpath)
 {
     VALUE file;
-    struct st_table *tbl;
+    struct sa_table *tbl;
     st_data_t val;
     NODE *load;
     const char *loading;
     int safe;
 
-    if (!st_lookup(RCLASS_IV_TBL(mod), autoload, &val) ||
-	!(tbl = check_autoload_table((VALUE)val)) || !st_lookup(tbl, (st_data_t)id, &val)) {
+    if (!sa_lookup(RCLASS_IV_TBL(mod), (sa_index_t)autoload, &val) ||
+	!(tbl = check_autoload_table((VALUE)val)) || !sa_lookup(tbl, (sa_index_t)id, &val)) {
 	return 0;
     }
     load = (NODE *)val;
@@ -1541,10 +1499,10 @@ autoload_node(VALUE mod, ID id, const char **loadingpath)
 static int
 autoload_node_id(VALUE mod, ID id)
 {
-    struct st_table *tbl = RCLASS_CONST_TBL(mod);
+    struct sa_table *tbl = RCLASS_CONST_TBL(mod);
     st_data_t val;
 
-    if (!tbl || !st_lookup(tbl, (st_data_t)id, &val) || ((rb_const_entry_t*)val)->value != Qundef) {
+    if (!tbl || !sa_lookup(tbl, (sa_index_t)id, &val) || ((rb_const_entry_t*)val)->value != Qundef) {
 	return 0;
     }
     return 1;
@@ -1593,7 +1551,7 @@ rb_const_get_0(VALUE klass, ID id, int exclude, int recurse, int visibility)
     while (RTEST(tmp)) {
 	VALUE am = 0;
 	st_data_t data;
-	while (RCLASS_CONST_TBL(tmp) && st_lookup(RCLASS_CONST_TBL(tmp), (st_data_t)id, &data)) {
+	while (sa_lookup(RCLASS_CONST_TBL(tmp), (sa_index_t)id, &data)) {
 	    rb_const_entry_t *ce = (rb_const_entry_t *)data;
 	    if (visibility && ce->flag == CONST_PRIVATE) {
 		rb_name_error(id, "private constant %s::%s referenced", rb_class2name(klass), rb_id2name(id));
@@ -1686,12 +1644,12 @@ VALUE
 rb_const_remove(VALUE mod, ID id)
 {
     VALUE val;
-    st_data_t v, n = id;
+    st_data_t v;
 
     if (!OBJ_UNTRUSTED(mod) && rb_safe_level() >= 4)
 	rb_raise(rb_eSecurityError, "Insecure: can't remove constant");
     rb_check_frozen(mod);
-    if (!RCLASS_CONST_TBL(mod) || !st_delete(RCLASS_CONST_TBL(mod), &n, &v)) {
+    if (!sa_delete(RCLASS_CONST_TBL(mod), (sa_index_t)id, &v)) {
 	if (rb_const_defined_at(mod, id)) {
 	    rb_name_error(id, "cannot remove %s::%s",
 			  rb_class2name(mod), rb_id2name(id));
@@ -1711,27 +1669,20 @@ rb_const_remove(VALUE mod, ID id)
     return val;
 }
 
-static int
-sv_i(ID key, rb_const_entry_t *ce, st_table *tbl)
-{
-    if (rb_is_const_id(key)) {
-	if (!st_lookup(tbl, (st_data_t)key, 0)) {
-	    st_insert(tbl, (st_data_t)key, (st_data_t)ce);
-	}
-    }
-    return ST_CONTINUE;
-}
-
 void*
 rb_mod_const_at(VALUE mod, void *data)
 {
-    st_table *tbl = data;
+    sa_table *tbl = data;
     if (!tbl) {
-	tbl = st_init_numtable();
+	tbl = sa_new_table();
     }
-    if (RCLASS_CONST_TBL(mod)) {
-	st_foreach_safe(RCLASS_CONST_TBL(mod), sv_i, (st_data_t)tbl);
+    SA_FOREACH_START(RCLASS_CONST_TBL(mod));
+    if (rb_is_const_id(entry->key)) {
+	if (!sa_lookup(tbl, entry->key, 0)) {
+	    sa_insert(tbl, entry->key, value);
+	}
     }
+    SA_FOREACH_END();
     return tbl;
 }
 
@@ -1748,25 +1699,21 @@ rb_mod_const_of(VALUE mod, void *data)
     return data;
 }
 
-static int
-list_i(st_data_t key, st_data_t value, VALUE ary)
-{
-    ID sym = (ID)key;
-    rb_const_entry_t *ce = (rb_const_entry_t *)value;
-    if (ce->flag != CONST_PRIVATE) rb_ary_push(ary, ID2SYM(sym));
-    return ST_CONTINUE;
-}
-
 VALUE
 rb_const_list(void *data)
 {
-    st_table *tbl = data;
+    sa_table *tbl = data;
     VALUE ary;
 
     if (!tbl) return rb_ary_new2(0);
     ary = rb_ary_new2(tbl->num_entries);
-    st_foreach_safe(tbl, list_i, ary);
-    st_free_table(tbl);
+
+    SA_FOREACH_START(tbl);
+    rb_const_entry_t *ce = (rb_const_entry_t *)value;
+    if (ce->flag != CONST_PRIVATE) rb_ary_push(ary, ID2SYM(entry->key));
+    SA_FOREACH_END();
+
+    sa_free_table(tbl);
 
     return ary;
 }
@@ -1790,7 +1737,7 @@ VALUE
 rb_mod_constants(int argc, VALUE *argv, VALUE mod)
 {
     VALUE inherit;
-    st_table *tbl;
+    sa_table *tbl;
 
     if (argc == 0) {
 	inherit = Qtrue;
@@ -1817,7 +1764,7 @@ rb_const_defined_0(VALUE klass, ID id, int exclude, int recurse, int visibility)
     tmp = klass;
   retry:
     while (tmp) {
-	if (RCLASS_CONST_TBL(tmp) && st_lookup(RCLASS_CONST_TBL(tmp), (st_data_t)id, &value)) {
+	if (sa_lookup(RCLASS_CONST_TBL(tmp), (sa_index_t)id, &value)) {
 	    rb_const_entry_t *ce = (rb_const_entry_t *)value;
 	    if (visibility && ce->flag == CONST_PRIVATE) {
 		return (int)Qfalse;
@@ -1885,6 +1832,7 @@ void
 rb_const_set(VALUE klass, ID id, VALUE val)
 {
     rb_const_entry_t *ce;
+    st_data_t value;
     VALUE visibility = CONST_PUBLIC;
 
     if (NIL_P(klass)) {
@@ -1893,21 +1841,14 @@ rb_const_set(VALUE klass, ID id, VALUE val)
     }
 
     check_before_mod_set(klass, id, val, "constant");
-    if (!RCLASS_CONST_TBL(klass)) {
-	RCLASS_CONST_TBL(klass) = st_init_numtable();
-    }
-    else {
-	st_data_t value;
-
-	if (st_lookup(RCLASS_CONST_TBL(klass), (st_data_t)id, &value)) {
-	    rb_const_entry_t *ce = (rb_const_entry_t*)value;
-	    if (ce->value == Qundef)
-		autoload_delete(klass, id);
-	    else {
-		visibility = ce->flag;
-		rb_warn("already initialized constant %s", rb_id2name(id));
-	    }
-	}
+    if (sa_lookup(RCLASS_CONST_TBL(klass), (sa_index_t)id, &value)) {
+        rb_const_entry_t *ce = (rb_const_entry_t*)value;
+        if (ce->value == Qundef)
+            autoload_delete(klass, id);
+        else {
+            visibility = ce->flag;
+            rb_warn("already initialized constant %s", rb_id2name(id));
+        }
     }
 
     rb_vm_change_state();
@@ -1916,7 +1857,7 @@ rb_const_set(VALUE klass, ID id, VALUE val)
     ce->flag = (rb_const_flag_t)visibility;
     ce->value = val;
 
-    st_insert(RCLASS_CONST_TBL(klass), (st_data_t)id, (st_data_t)ce);
+    sa_insert(RCLASS_CONST_TBL(klass), (sa_index_t)id, (st_data_t)ce);
 }
 
 void
@@ -1958,8 +1899,7 @@ set_const_visibility(VALUE mod, int argc, VALUE *argv, rb_const_flag_t flag)
     for (i = 0; i < argc; i++) {
 	VALUE val = argv[i];
 	id = rb_to_id(val);
-	if (RCLASS_CONST_TBL(mod) &&
-	    st_lookup(RCLASS_CONST_TBL(mod), (st_data_t)id, &v)) {
+	if (sa_lookup(RCLASS_CONST_TBL(mod), (sa_index_t)id, &v)) {
 	    ((rb_const_entry_t*)v)->flag = flag;
 	}
 	else {
@@ -2008,7 +1948,7 @@ original_module(VALUE c)
 }
 
 #define CVAR_LOOKUP(v,r) do {\
-    if (RCLASS_IV_TBL(klass) && st_lookup(RCLASS_IV_TBL(klass),(st_data_t)id,(v))) {\
+    if (sa_lookup(RCLASS_IV_TBL(klass),(sa_index_t)id,(v))) {\
 	r;\
     }\
     if (FL_TEST(klass, FL_SINGLETON) ) {\
@@ -2027,7 +1967,7 @@ original_module(VALUE c)
 	klass = RCLASS_SUPER(klass);\
     }\
     while (klass) {\
-	if (RCLASS_IV_TBL(klass) && st_lookup(RCLASS_IV_TBL(klass),(st_data_t)id,(v))) {\
+	if (sa_lookup(RCLASS_IV_TBL(klass),(sa_index_t)id,(v))) {\
 	    r;\
 	}\
 	klass = RCLASS_SUPER(klass);\
@@ -2043,15 +1983,13 @@ rb_cvar_set(VALUE klass, ID id, VALUE val)
     CVAR_LOOKUP(0, {if (!front) front = klass; target = klass;});
     if (target) {
 	if (front && target != front) {
-	    st_data_t did = id;
-
 	    if (RTEST(ruby_verbose)) {
 		rb_warning("class variable %s of %s is overtaken by %s",
 			   rb_id2name(id), rb_class2name(original_module(front)),
 			   rb_class2name(original_module(target)));
 	    }
 	    if (BUILTIN_TYPE(front) == T_CLASS) {
-		st_delete(RCLASS_IV_TBL(front),&did,0);
+		sa_delete(RCLASS_IV_TBL(front),(sa_index_t)id,0);
 	    }
 	}
     }
@@ -2060,11 +1998,7 @@ rb_cvar_set(VALUE klass, ID id, VALUE val)
     }
 
     check_before_mod_set(target, id, val, "class variable");
-    if (!RCLASS_IV_TBL(target)) {
-	RCLASS_IV_TBL(target) = st_init_numtable();
-    }
-
-    st_insert(RCLASS_IV_TBL(target), (st_data_t)id, (st_data_t)val);
+    sa_insert(RCLASS_IV_TBL(target), (sa_index_t)id, (st_data_t)val);
 }
 
 VALUE
@@ -2080,15 +2014,13 @@ rb_cvar_get(VALUE klass, ID id)
 		      rb_id2name(id), rb_class2name(tmp));
     }
     if (front && target != front) {
-	st_data_t did = id;
-
 	if (RTEST(ruby_verbose)) {
 	    rb_warning("class variable %s of %s is overtaken by %s",
 		       rb_id2name(id), rb_class2name(original_module(front)),
 		       rb_class2name(original_module(target)));
 	}
 	if (BUILTIN_TYPE(front) == T_CLASS) {
-	    st_delete(RCLASS_IV_TBL(front),&did,0);
+	    sa_delete(RCLASS_IV_TBL(front),(sa_index_t)id,0);
 	}
     }
     return (VALUE)value;
@@ -2134,7 +2066,7 @@ rb_define_class_variable(VALUE klass, const char *name, VALUE val)
 }
 
 static int
-cv_i(ID key, VALUE value, VALUE ary)
+cv_i(sa_index_t key, VALUE value, VALUE ary)
 {
     if (rb_is_class_id(key)) {
 	VALUE kval = ID2SYM(key);
@@ -2167,7 +2099,7 @@ rb_mod_class_variables(VALUE obj)
     VALUE ary = rb_ary_new();
 
     if (RCLASS_IV_TBL(obj)) {
-	st_foreach_safe(RCLASS_IV_TBL(obj), cv_i, ary);
+	sa_foreach(RCLASS_IV_TBL(obj), cv_i, ary);
     }
     return ary;
 }
@@ -2196,7 +2128,7 @@ VALUE
 rb_mod_remove_cvar(VALUE mod, VALUE name)
 {
     const ID id = rb_to_id(name);
-    st_data_t val, n = id;
+    st_data_t val;
 
     if (!rb_is_class_id(id)) {
 	rb_name_error(id, "wrong class variable name %s", rb_id2name(id));
@@ -2204,7 +2136,7 @@ rb_mod_remove_cvar(VALUE mod, VALUE name)
     if (!OBJ_UNTRUSTED(mod) && rb_safe_level() >= 4)
 	rb_raise(rb_eSecurityError, "Insecure: can't remove class variable");
     rb_check_frozen(mod);
-    if (RCLASS_IV_TBL(mod) && st_delete(RCLASS_IV_TBL(mod), &n, &val)) {
+    if (RCLASS_IV_TBL(mod) && sa_delete(RCLASS_IV_TBL(mod), (sa_index_t)id, &val)) {
 	return (VALUE)val;
     }
     if (rb_cvar_defined(mod, id)) {
diff --git a/vm.c b/vm.c
index 63141ba..61653d7 100644
--- a/vm.c
+++ b/vm.c
@@ -1042,7 +1042,7 @@ static void
 add_opt_method(VALUE klass, ID mid, VALUE bop)
 {
     rb_method_entry_t *me;
-    if (st_lookup(RCLASS_M_TBL(klass), mid, (void *)&me) && me->def &&
+    if (sa_lookup(RCLASS_M_TBL(klass), (sa_index_t)mid, (void *)&me) && me->def &&
 	me->def->type == VM_METHOD_TYPE_CFUNC) {
 	st_insert(vm_opt_method_table, (st_data_t)me, (st_data_t)bop);
     }
@@ -1578,7 +1578,12 @@ rb_vm_mark(void *ptr)
 	RUBY_MARK_UNLESS_NULL(vm->thgroup_default);
 	RUBY_MARK_UNLESS_NULL(vm->mark_object_ary);
 	RUBY_MARK_UNLESS_NULL(vm->load_path);
+	RUBY_MARK_UNLESS_NULL(vm->load_path_snapshot);
+	RUBY_MARK_UNLESS_NULL(vm->load_path_check_cache);
+	RUBY_MARK_UNLESS_NULL(vm->expanded_load_path);
 	RUBY_MARK_UNLESS_NULL(vm->loaded_features);
+	RUBY_MARK_UNLESS_NULL(vm->loaded_features_snapshot);
+	RUBY_MARK_UNLESS_NULL(vm->loaded_features_index);
 	RUBY_MARK_UNLESS_NULL(vm->top_self);
 	RUBY_MARK_UNLESS_NULL(vm->coverages);
 	rb_gc_mark_locations(vm->special_exceptions, vm->special_exceptions + ruby_special_error_count);
diff --git a/vm_core.h b/vm_core.h
index 60146f0..7b25806 100644
--- a/vm_core.h
+++ b/vm_core.h
@@ -298,7 +298,12 @@ typedef struct rb_vm_struct {
     /* load */
     VALUE top_self;
     VALUE load_path;
+    VALUE load_path_snapshot;
+    VALUE load_path_check_cache;
+    VALUE expanded_load_path;
     VALUE loaded_features;
+    VALUE loaded_features_snapshot;
+    VALUE loaded_features_index;
     struct st_table *loading_table;
 
     /* signal */
diff --git a/vm_insnhelper.c b/vm_insnhelper.c
index 55152df..deeed9b 100644
--- a/vm_insnhelper.c
+++ b/vm_insnhelper.c
@@ -1187,7 +1187,7 @@ vm_get_ev_const(rb_thread_t *th, const rb_iseq_t *iseq,
 		st_data_t data;
 	      search_continue:
 		if (RCLASS_CONST_TBL(klass) &&
-		    st_lookup(RCLASS_CONST_TBL(klass), id, &data)) {
+		    sa_lookup(RCLASS_CONST_TBL(klass), (sa_index_t)id, &data)) {
 		    val = ((rb_const_entry_t*)data)->value;
 		    if (val == Qundef) {
 			if (am == klass) break;
@@ -1297,10 +1297,10 @@ vm_getivar(VALUE obj, ID id, IC ic)
 	    st_data_t index;
 	    long len = ROBJECT_NUMIV(obj);
 	    VALUE *ptr = ROBJECT_IVPTR(obj);
-	    struct st_table *iv_index_tbl = ROBJECT_IV_INDEX_TBL(obj);
+	    struct sa_table *iv_index_tbl = ROBJECT_IV_INDEX_TBL(obj);
 
 	    if (iv_index_tbl) {
-		if (st_lookup(iv_index_tbl, id, &index)) {
+		if (sa_lookup(iv_index_tbl, (sa_index_t)id, &index)) {
 		    if ((long)index < len) {
 			val = ptr[index];
 		    }
@@ -1350,9 +1350,9 @@ vm_setivar(VALUE obj, ID id, VALUE val, IC ic)
 	    }
 	}
 	else {
-	    struct st_table *iv_index_tbl = ROBJECT_IV_INDEX_TBL(obj);
+	    struct sa_table *iv_index_tbl = ROBJECT_IV_INDEX_TBL(obj);
 
-	    if (iv_index_tbl && st_lookup(iv_index_tbl, (st_data_t)id, &index)) {
+	    if (iv_index_tbl && sa_lookup(iv_index_tbl, (sa_index_t)id, &index)) {
 		ic->ic_class = klass;
 		ic->ic_value.index = index;
 		ic->ic_vmstat = GET_VM_STATE_VERSION();
diff --git a/vm_method.c b/vm_method.c
index 6e33603..6567440 100644
--- a/vm_method.c
+++ b/vm_method.c
@@ -2,38 +2,33 @@
  * This file is included by vm.c
  */
 
-#define CACHE_SIZE 0x800
-#define CACHE_MASK 0x7ff
-#define EXPR1(c,m) ((((c)>>3)^(m))&CACHE_MASK)
-
 static void rb_vm_check_redefinition_opt_method(const rb_method_entry_t *me);
 
 static ID object_id, respond_to_missing;
 static ID removed, singleton_removed, undefined, singleton_undefined;
 static ID added, singleton_added, attached;
 
-struct cache_entry {		/* method hash table. */
-    VALUE filled_version;        /* filled state version */
-    ID mid;			/* method's id */
-    VALUE klass;		/* receiver's class */
-    rb_method_entry_t *me;
-};
-
-static struct cache_entry cache[CACHE_SIZE];
 #define ruby_running (GET_VM()->running)
 /* int ruby_running = 0; */
 
+static int
+methods_cache_clear_callback(void *vstart, void *vend, size_t stride, void *data)
+{
+    VALUE v = (VALUE)vstart;
+    for (; v != (VALUE)vend; v += stride) {
+	switch(BUILTIN_TYPE(v)) {
+	    case T_CLASS:
+	    case T_MODULE:
+	    case T_ICLASS:
+		RCLASS(v)->cache->method_cache_version = 0;
+	}
+    }
+    return 0;
+}
 static void
 vm_clear_global_method_cache(void)
 {
-    struct cache_entry *ent, *end;
-
-    ent = cache;
-    end = ent + CACHE_SIZE;
-    while (ent < end) {
-	ent->filled_version = 0;
-	ent++;
-    }
+    rb_objspace_each_objects(methods_cache_clear_callback, NULL);
 }
 
 void
@@ -162,7 +157,7 @@ rb_method_entry_make(VALUE klass, ID mid, rb_method_type_t type,
 		     rb_method_definition_t *def, rb_method_flag_t noex)
 {
     rb_method_entry_t *me;
-    st_table *mtbl;
+    sa_table *mtbl;
     st_data_t data;
 
     if (NIL_P(klass)) {
@@ -190,7 +185,7 @@ rb_method_entry_make(VALUE klass, ID mid, rb_method_type_t type,
     mtbl = RCLASS_M_TBL(klass);
 
     /* check re-definition */
-    if (st_lookup(mtbl, mid, &data)) {
+    if (sa_lookup(mtbl, (sa_index_t)mid, &data)) {
 	rb_method_entry_t *old_me = (rb_method_entry_t *)data;
 	rb_method_definition_t *old_def = old_me->def;
 
@@ -248,7 +243,7 @@ rb_method_entry_make(VALUE klass, ID mid, rb_method_type_t type,
 	}
     }
 
-    st_insert(mtbl, mid, (st_data_t) me);
+    sa_insert(mtbl, (sa_index_t)mid, (st_data_t) me);
 
     return me;
 }
@@ -371,7 +366,7 @@ search_method(VALUE klass, ID id)
 	return 0;
     }
 
-    while (!st_lookup(RCLASS_M_TBL(klass), id, &body)) {
+    while (!sa_lookup(RCLASS_M_TBL(klass), (sa_index_t)id, &body)) {
 	klass = RCLASS_SUPER(klass);
 	if (!klass) {
 	    return 0;
@@ -393,20 +388,10 @@ rb_method_entry_get_without_cache(VALUE klass, ID id)
     rb_method_entry_t *me = search_method(klass, id);
 
     if (ruby_running) {
-	struct cache_entry *ent;
-	ent = cache + EXPR1(klass, id);
-	ent->filled_version = GET_VM_STATE_VERSION();
-	ent->klass = klass;
-
 	if (UNDEFINED_METHOD_ENTRY_P(me)) {
-	    ent->mid = id;
-	    ent->me = 0;
-	    me = 0;
-	}
-	else {
-	    ent->mid = id;
-	    ent->me = me;
+            me = 0;
 	}
+        sa_insert(&RCLASS(klass)->cache->m_cache_tbl, (sa_index_t)id, (st_data_t)me);
     }
 
     return me;
@@ -415,21 +400,23 @@ rb_method_entry_get_without_cache(VALUE klass, ID id)
 rb_method_entry_t *
 rb_method_entry(VALUE klass, ID id)
 {
-    struct cache_entry *ent;
+    rb_class_cache_t *cache = RCLASS(klass)->cache;
+    rb_method_entry_t *me;
 
-    ent = cache + EXPR1(klass, id);
-    if (ent->filled_version == GET_VM_STATE_VERSION() &&
-	ent->mid == id && ent->klass == klass) {
-	return ent->me;
+    if (cache->method_cache_version != GET_VM_STATE_VERSION()) {
+        sa_clear_no_free(&cache->m_cache_tbl);
+        cache->method_cache_version = GET_VM_STATE_VERSION();
+    }
+    else if (sa_lookup(&cache->m_cache_tbl, (sa_index_t)id, (st_data_t*)&me)) {
+        return me;
     }
-
     return rb_method_entry_get_without_cache(klass, id);
 }
 
 static void
 remove_method(VALUE klass, ID mid)
 {
-    st_data_t key, data;
+    st_data_t data;
     rb_method_entry_t *me = 0;
 
     if (klass == rb_cObject) {
@@ -443,14 +430,13 @@ remove_method(VALUE klass, ID mid)
 	rb_warn("removing `%s' may cause serious problems", rb_id2name(mid));
     }
 
-    if (!st_lookup(RCLASS_M_TBL(klass), mid, &data) ||
+    if (!sa_lookup(RCLASS_M_TBL(klass), (sa_index_t)mid, &data) ||
 	!(me = (rb_method_entry_t *)data) ||
 	(!me->def || me->def->type == VM_METHOD_TYPE_UNDEF)) {
 	rb_name_error(mid, "method `%s' not defined in %s",
 		      rb_id2name(mid), rb_class2name(klass));
     }
-    key = (st_data_t)mid;
-    st_delete(RCLASS_M_TBL(klass), &key, &data);
+    sa_delete(RCLASS_M_TBL(klass), (sa_index_t)mid, &data);
 
     rb_vm_check_redefinition_opt_method(me);
     rb_clear_cache_for_undef(klass, mid);
patches/ruby/1.9.3/p327/ruby-multilib.patch000066400000002321147511530510014142 0ustar00diff -u -wr a/tool/mkconfig.rb b/tool/mkconfig.rb
--- a/tool/mkconfig.rb  2012-10-08 05:57:16.948702976 +0200
+++ b/tool/mkconfig.rb  2011-08-13 15:17:30.000000000 +0200
@@ -40,6 +40,7 @@
 v_fast = []
 v_others = []
 vars = {}
+v_runtime = {}
 continued_name = nil
 continued_line = nil
 File.foreach "config.status" do |line|
@@ -118,7 +119,10 @@
     val = val.gsub(/\$(?:\$|\{?(\w+)\}?)/) {$1 ? "$(#{$1})" : $&}.dump
     case name
     when /^prefix$/
+      v_runtime[:prefix] = val.slice(1..-2)
       val = "(TOPDIR || DESTDIR + #{val})"
+    when /^libdir$/
+      v_runtime[:libdir] = File.basename(val.slice(1..-2))
     when /^ARCH_FLAG$/
       val = "arch_flag || #{val}" if universal
     when /^UNIVERSAL_ARCHNAMES$/
@@ -145,7 +149,7 @@

 drive = File::PATH_SEPARATOR == ';'

-prefix = "/lib/ruby/#{version}/#{arch}"
+prefix = "/#{v_runtime[:libdir]}/ruby/#{version}/#{arch}"
 print "  TOPDIR = File.dirname(__FILE__).chomp!(#{prefix.dump})\n"
 print "  DESTDIR = ", (drive ? "TOPDIR && TOPDIR[/\\A[a-z]:/i] || " : ""), "'' unless defined? DESTDIR\n"
 print <<'ARCH' if universal
@@ -190,6 +194,7 @@
     x
   end
 end
+v_others.map!{|x| x.gsub(v_runtime[:prefix], "$(prefix)") }
 v_others.compact!

 if $install_name
patches/ruby/1.9.3/p327/falcon.diff000066400000534752147511530510012437 0ustar00diff --git a/array.c b/array.c
index e427cb3..7e76227 100644
--- a/array.c
+++ b/array.c
@@ -255,15 +255,24 @@ rb_ary_modify(VALUE ary)
     rb_ary_modify_check(ary);
     if (ARY_SHARED_P(ary)) {
         long len = RARRAY_LEN(ary);
+	VALUE shared = ARY_SHARED(ary);
         if (len <= RARRAY_EMBED_LEN_MAX) {
             VALUE *ptr = ARY_HEAP_PTR(ary);
-            VALUE shared = ARY_SHARED(ary);
             FL_UNSET_SHARED(ary);
             FL_SET_EMBED(ary);
             MEMCPY(ARY_EMBED_PTR(ary), ptr, VALUE, len);
             rb_ary_decrement_share(shared);
             ARY_SET_EMBED_LEN(ary, len);
         }
+	else if (ARY_SHARED_NUM(shared) == 1 && len > RARRAY_LEN(shared)>>1) {
+	    long shift = RARRAY_PTR(ary) - RARRAY_PTR(shared);
+	    ARY_SET_PTR(ary, RARRAY_PTR(shared));
+	    ARY_SET_CAPA(ary, RARRAY_LEN(shared));
+	    MEMMOVE(RARRAY_PTR(ary), RARRAY_PTR(ary)+shift, VALUE, len);
+	    FL_UNSET_SHARED(ary);
+            FL_SET_EMBED(shared);
+	    rb_ary_decrement_share(shared);
+	}
         else {
             VALUE *ptr = ALLOC_N(VALUE, len);
             MEMCPY(ptr, RARRAY_PTR(ary), VALUE, len);
@@ -274,6 +283,38 @@ rb_ary_modify(VALUE ary)
     }
 }
 
+static void
+ary_ensure_room_for_push(VALUE ary, long add_len)
+{
+    long new_len = RARRAY_LEN(ary) + add_len;
+    long capa;
+
+    if (ARY_SHARED_P(ary)) {
+        if (new_len > RARRAY_EMBED_LEN_MAX) {
+            VALUE shared = ARY_SHARED(ary);
+            if (ARY_SHARED_NUM(shared) == 1) {
+		if (RARRAY_PTR(ary) - RARRAY_PTR(shared) + new_len <= RARRAY_LEN(shared)) {
+		    rb_ary_modify_check(ary);
+		}
+		else {
+		    /* if array is shared, than it is likely it participate in push/shift pattern */
+		    rb_ary_modify(ary);
+		    capa = ARY_CAPA(ary);
+		    if (new_len > capa - (capa >> 6)) {
+			ary_double_capa(ary, new_len);
+		    }
+		}
+		return;
+            }
+        }
+    }
+    rb_ary_modify(ary);
+    capa = ARY_CAPA(ary);
+    if (new_len > capa) {
+	ary_double_capa(ary, new_len);
+    }
+}
+
 VALUE
 rb_ary_freeze(VALUE ary)
 {
@@ -295,6 +336,33 @@ rb_ary_frozen_p(VALUE ary)
     return Qfalse;
 }
 
+/* This can be used to take a snapshot of an array (with
+   e.g. rb_ary_replace) and check later whether the array has been
+   modified from the snapshot.  The snapshot is cheap, though if
+   something does modify the array it will pay the cost of copying
+   it. */
+VALUE
+rb_ary_dup_of_p(VALUE ary1, VALUE ary2)
+{
+    VALUE *p1, *p2;
+    long len = RARRAY_LEN(ary1);
+
+    if (len != RARRAY_LEN(ary2)) return Qfalse;
+
+    p1 = RARRAY_PTR(ary1);
+    p2 = RARRAY_PTR(ary2);
+
+    if (ARY_EMBED_P(ary1) && ARY_EMBED_P(ary2)) {
+        for (; len; len--, p1++, p2++) {
+            if (*p1 != *p2) return Qfalse;
+        }
+        return Qtrue;
+    }
+
+    if (p1 == p2) return Qtrue;
+    return Qfalse;
+}
+
 static VALUE
 ary_alloc(VALUE klass)
 {
@@ -430,8 +498,9 @@ ary_make_shared(VALUE ary)
 	OBJSETUP(shared, 0, T_ARRAY);
         FL_UNSET_EMBED(shared);
 
-        ARY_SET_LEN((VALUE)shared, RARRAY_LEN(ary));
+        ARY_SET_LEN((VALUE)shared, ARY_CAPA(ary));
         ARY_SET_PTR((VALUE)shared, RARRAY_PTR(ary));
+	rb_mem_clear(RARRAY_PTR(shared) + RARRAY_LEN(ary), ARY_CAPA(ary) - RARRAY_LEN(ary));
 	FL_SET_SHARED_ROOT(shared);
 	ARY_SET_SHARED_NUM((VALUE)shared, 1);
 	FL_SET_SHARED(ary);
@@ -721,8 +790,6 @@ ary_take_first_or_last(int argc, VALUE *argv, VALUE ary, enum ary_take_pos_flags
     return ary_make_partial(ary, rb_cArray, offset, n);
 }
 
-static VALUE rb_ary_push_1(VALUE ary, VALUE item);
-
 /*
  *  call-seq:
  *     ary << obj            -> ary
@@ -739,8 +806,12 @@ static VALUE rb_ary_push_1(VALUE ary, VALUE item);
 VALUE
 rb_ary_push(VALUE ary, VALUE item)
 {
-    rb_ary_modify(ary);
-    return rb_ary_push_1(ary, item);
+    long idx = RARRAY_LEN(ary);
+
+    ary_ensure_room_for_push(ary, 1);
+    RARRAY_PTR(ary)[idx] = item;
+    ARY_SET_LEN(ary, idx + 1);
+    return ary;
 }
 
 static VALUE
@@ -756,6 +827,18 @@ rb_ary_push_1(VALUE ary, VALUE item)
     return ary;
 }
 
+static VALUE
+rb_ary_cat(VALUE ary, const VALUE *ptr, long len)
+{
+    long oldlen = RARRAY_LEN(ary);
+
+    ary_ensure_room_for_push(ary, len);
+copy:
+    MEMCPY(RARRAY_PTR(ary) + oldlen, ptr, VALUE, len);
+    ARY_SET_LEN(ary, oldlen + len);
+    return ary;
+}
+
 /*
  *  call-seq:
  *     ary.push(obj, ... )   -> ary
@@ -772,11 +855,7 @@ rb_ary_push_1(VALUE ary, VALUE item)
 static VALUE
 rb_ary_push_m(int argc, VALUE *argv, VALUE ary)
 {
-    rb_ary_modify(ary);
-    while (argc--) {
-	rb_ary_push_1(ary, *argv++);
-    }
-    return ary;
+    return rb_ary_cat(ary, argv, argc);
 }
 
 VALUE
@@ -904,6 +983,55 @@ rb_ary_shift_m(int argc, VALUE *argv, VALUE ary)
     return result;
 }
 
+static void
+ary_ensure_room_for_unshift(VALUE ary, int argc)
+{
+    long len = RARRAY_LEN(ary);
+    long new_len = len + argc;
+    long capa;
+    VALUE *head, *sharedp;
+
+    if (ARY_SHARED_P(ary)) {
+	VALUE shared = ARY_SHARED(ary);
+	capa = RARRAY_LEN(shared);
+	if (ARY_SHARED_NUM(shared) == 1 && capa > new_len) {
+	    head = RARRAY_PTR(ary);
+	    sharedp = RARRAY_PTR(shared);
+	    goto makeroom_if_need;
+	}
+    }
+
+    rb_ary_modify(ary);
+    capa = ARY_CAPA(ary);
+    if (capa - (capa >> 6) <= new_len) {
+	ary_double_capa(ary, new_len);
+    }
+
+    /* use shared array for big "queues" */
+    if (new_len > ARY_DEFAULT_SIZE * 4) {
+	/* make a room for unshifted items */
+	capa = ARY_CAPA(ary);
+	ary_make_shared(ary);
+
+	head = sharedp = RARRAY_PTR(ary);
+	goto makeroom;
+makeroom_if_need:
+	if (head - sharedp < argc) {
+	    long room;
+makeroom:
+	    room = capa - new_len;
+	    room -= room >> 4;
+	    MEMMOVE(sharedp + argc + room, head, VALUE, len);
+	    head = sharedp + argc + room;
+	}
+	ARY_SET_PTR(ary, head - argc);
+    }
+    else {
+	/* sliding items */
+	MEMMOVE(RARRAY_PTR(ary) + argc, RARRAY_PTR(ary), VALUE, len);
+    }
+}
+
 /*
  *  call-seq:
  *     ary.unshift(obj, ...)  -> ary
@@ -919,19 +1047,16 @@ rb_ary_shift_m(int argc, VALUE *argv, VALUE ary)
 static VALUE
 rb_ary_unshift_m(int argc, VALUE *argv, VALUE ary)
 {
-    long len;
+    long len = RARRAY_LEN(ary);
 
-    rb_ary_modify(ary);
-    if (argc == 0) return ary;
-    if (ARY_CAPA(ary) <= (len = RARRAY_LEN(ary)) + argc) {
-	ary_double_capa(ary, len + argc);
+    if (argc == 0) {
+	rb_ary_modify_check(ary);
+	return ary;
     }
 
-    /* sliding items */
-    MEMMOVE(RARRAY_PTR(ary) + argc, RARRAY_PTR(ary), VALUE, len);
+    ary_ensure_room_for_unshift(ary, argc);
     MEMCPY(RARRAY_PTR(ary), argv, VALUE, argc);
-    ARY_INCREASE_LEN(ary, argc);
-
+    ARY_SET_LEN(ary, len + argc);
     return ary;
 }
 
@@ -1293,15 +1418,12 @@ rb_ary_splice(VALUE ary, long beg, long len, VALUE rpl)
 	rpl = rb_ary_to_ary(rpl);
 	rlen = RARRAY_LEN(rpl);
     }
-    rb_ary_modify(ary);
     if (beg >= RARRAY_LEN(ary)) {
 	if (beg > ARY_MAX_SIZE - rlen) {
 	    rb_raise(rb_eIndexError, "index %ld too big", beg);
 	}
+	ary_ensure_room_for_push(ary, rlen-len); /* len is 0 or negative */
 	len = beg + rlen;
-	if (len >= ARY_CAPA(ary)) {
-	    ary_double_capa(ary, len);
-	}
 	rb_mem_clear(RARRAY_PTR(ary) + RARRAY_LEN(ary), beg - RARRAY_LEN(ary));
 	if (rlen > 0) {
 	    MEMCPY(RARRAY_PTR(ary) + beg, RARRAY_PTR(rpl), VALUE, rlen);
@@ -1311,6 +1433,7 @@ rb_ary_splice(VALUE ary, long beg, long len, VALUE rpl)
     else {
 	long alen;
 
+	rb_ary_modify(ary);
 	alen = RARRAY_LEN(ary) + rlen - len;
 	if (alen >= ARY_CAPA(ary)) {
 	    ary_double_capa(ary, alen);
@@ -2100,12 +2223,13 @@ rb_ary_sort_bang(VALUE ary)
     if (RARRAY_LEN(ary) > 1) {
 	VALUE tmp = ary_make_substitution(ary); /* only ary refers tmp */
 	struct ary_sort_data data;
+	long len = RARRAY_LEN(ary);
 
 	RBASIC(tmp)->klass = 0;
 	data.ary = tmp;
 	data.opt_methods = 0;
 	data.opt_inited = 0;
-	ruby_qsort(RARRAY_PTR(tmp), RARRAY_LEN(tmp), sizeof(VALUE),
+	ruby_qsort(RARRAY_PTR(tmp), len, sizeof(VALUE),
 		   rb_block_given_p()?sort_1:sort_2, &data);
 
         if (ARY_EMBED_P(tmp)) {
@@ -2122,7 +2246,7 @@ rb_ary_sort_bang(VALUE ary)
             if (ARY_HEAP_PTR(ary) == ARY_HEAP_PTR(tmp)) {
                 assert(!ARY_EMBED_P(ary));
                 FL_UNSET_SHARED(ary);
-                ARY_SET_CAPA(ary, ARY_CAPA(tmp));
+                ARY_SET_CAPA(ary, RARRAY_LEN(tmp));
             }
             else {
                 assert(!ARY_SHARED_P(tmp));
@@ -2137,8 +2261,8 @@ rb_ary_sort_bang(VALUE ary)
                     xfree(ARY_HEAP_PTR(ary));
                 }
                 ARY_SET_PTR(ary, RARRAY_PTR(tmp));
-                ARY_SET_HEAP_LEN(ary, RARRAY_LEN(tmp));
-                ARY_SET_CAPA(ary, ARY_CAPA(tmp));
+                ARY_SET_HEAP_LEN(ary, len);
+                ARY_SET_CAPA(ary, RARRAY_LEN(tmp));
             }
             /* tmp was lost ownership for the ptr */
             FL_UNSET(tmp, FL_FREEZE);
diff --git a/class.c b/class.c
index df19812..db6b3e5 100644
--- a/class.c
+++ b/class.c
@@ -31,7 +31,7 @@
 #include "internal.h"
 #include <ctype.h>
 
-extern st_table *rb_class_tbl;
+extern sa_table rb_class_tbl;
 static ID id_attached;
 
 /**
@@ -50,14 +50,24 @@ static VALUE
 class_alloc(VALUE flags, VALUE klass)
 {
     rb_classext_t *ext = ALLOC(rb_classext_t);
+    rb_class_cache_t *cache = ALLOC(rb_class_cache_t);
     NEWOBJ(obj, struct RClass);
     OBJSETUP(obj, klass, flags);
     obj->ptr = ext;
-    RCLASS_IV_TBL(obj) = 0;
-    RCLASS_CONST_TBL(obj) = 0;
-    RCLASS_M_TBL(obj) = 0;
-    RCLASS_SUPER(obj) = 0;
-    RCLASS_IV_INDEX_TBL(obj) = 0;
+    obj->cache = cache;
+    MEMZERO(ext, struct rb_classext_struct, 1);
+    MEMZERO(cache, struct rb_class_cache_struct, 1);
+    return (VALUE)obj;
+}
+
+static VALUE
+iclass_alloc()
+{
+    rb_class_cache_t *cache = ALLOC(rb_class_cache_t);
+    NEWOBJ(obj, struct RClass);
+    OBJSETUP(obj, rb_cClass, T_ICLASS);
+    obj->cache = cache;
+    MEMZERO(cache, struct rb_class_cache_struct, 1);
     return (VALUE)obj;
 }
 
@@ -77,7 +87,6 @@ rb_class_boot(VALUE super)
     VALUE klass = class_alloc(T_CLASS, rb_cClass);
 
     RCLASS_SUPER(klass) = super;
-    RCLASS_M_TBL(klass) = st_init_numtable();
 
     OBJ_INFECT(klass, super);
     return (VALUE)klass;
@@ -120,85 +129,59 @@ rb_class_new(VALUE super)
     return rb_class_boot(super);
 }
 
-struct clone_method_data {
-    st_table *tbl;
-    VALUE klass;
-};
-
 VALUE rb_iseq_clone(VALUE iseqval, VALUE newcbase);
 
-static int
-clone_method(ID mid, const rb_method_entry_t *me, struct clone_method_data *data)
+static void
+clone_method(ID mid, const rb_method_entry_t *me, VALUE klass)
 {
     VALUE newiseqval;
     if (me->def && me->def->type == VM_METHOD_TYPE_ISEQ) {
 	rb_iseq_t *iseq;
-	newiseqval = rb_iseq_clone(me->def->body.iseq->self, data->klass);
+	newiseqval = rb_iseq_clone(me->def->body.iseq->self, klass);
 	GetISeqPtr(newiseqval, iseq);
-	rb_add_method(data->klass, mid, VM_METHOD_TYPE_ISEQ, iseq, me->flag);
+	rb_add_method(klass, mid, VM_METHOD_TYPE_ISEQ, iseq, me->flag);
 	RB_GC_GUARD(newiseqval);
     }
     else {
-	rb_method_entry_set(data->klass, mid, me, me->flag);
+	rb_method_entry_set(klass, mid, me, me->flag);
     }
-    return ST_CONTINUE;
 }
 
-static int
-clone_const(ID key, const rb_const_entry_t *ce, st_table *tbl)
+static void
+clone_const(sa_index_t key, st_data_t ce, sa_table *tbl)
 {
     rb_const_entry_t *nce = ALLOC(rb_const_entry_t);
-    *nce = *ce;
-    st_insert(tbl, key, (st_data_t)nce);
-    return ST_CONTINUE;
-}
-
-static int
-clone_const_i(st_data_t key, st_data_t value, st_data_t data)
-{
-    return clone_const((ID)key, (const rb_const_entry_t *)value, (st_table *)data);
+    *nce = *(const rb_const_entry_t*)ce;
+    sa_insert(tbl, (sa_index_t)key, (st_data_t)nce);
 }
 
 /* :nodoc: */
 VALUE
 rb_mod_init_copy(VALUE clone, VALUE orig)
 {
+    ID id;
     rb_obj_init_copy(clone, orig);
     if (!FL_TEST(CLASS_OF(clone), FL_SINGLETON)) {
 	RBASIC(clone)->klass = rb_singleton_class_clone(orig);
 	rb_singleton_class_attached(RBASIC(clone)->klass, (VALUE)clone);
     }
     RCLASS_SUPER(clone) = RCLASS_SUPER(orig);
-    if (RCLASS_IV_TBL(orig)) {
-	st_data_t id;
 
-	if (RCLASS_IV_TBL(clone)) {
-	    st_free_table(RCLASS_IV_TBL(clone));
-	}
-	RCLASS_IV_TBL(clone) = st_copy(RCLASS_IV_TBL(orig));
-	CONST_ID(id, "__classpath__");
-	st_delete(RCLASS_IV_TBL(clone), &id, 0);
-	CONST_ID(id, "__classid__");
-	st_delete(RCLASS_IV_TBL(clone), &id, 0);
-    }
-    if (RCLASS_CONST_TBL(orig)) {
-	if (RCLASS_CONST_TBL(clone)) {
-	    rb_free_const_table(RCLASS_CONST_TBL(clone));
-	}
-	RCLASS_CONST_TBL(clone) = st_init_numtable();
-	st_foreach(RCLASS_CONST_TBL(orig), clone_const_i, (st_data_t)RCLASS_CONST_TBL(clone));
-    }
-    if (RCLASS_M_TBL(orig)) {
-	struct clone_method_data data;
+    sa_copy_to(RCLASS_IV_TBL(orig), RCLASS_IV_TBL(clone));
+    CONST_ID(id, "__classpath__");
+    sa_delete(RCLASS_IV_TBL(clone), (sa_index_t)id, 0);
+    CONST_ID(id, "__classid__");
+    sa_delete(RCLASS_IV_TBL(clone), (sa_index_t)id, 0);
 
-	if (RCLASS_M_TBL(clone)) {
-	    rb_free_m_table(RCLASS_M_TBL(clone));
-	}
-	data.tbl = RCLASS_M_TBL(clone) = st_init_numtable();
-	data.klass = clone;
-	st_foreach(RCLASS_M_TBL(orig), clone_method,
-		   (st_data_t)&data);
-    }
+    sa_clear(RCLASS_CONST_TBL(clone));
+    SA_FOREACH_START(RCLASS_CONST_TBL(orig));
+    clone_const(entry->key, value, RCLASS_CONST_TBL(clone));
+    SA_FOREACH_END();
+
+    rb_free_m_table(RCLASS_M_TBL(clone));
+    SA_FOREACH_START(RCLASS_M_TBL(orig));
+    clone_method(entry->key, (const rb_method_entry_t *)value, clone);
+    SA_FOREACH_END();
 
     return clone;
 }
@@ -227,7 +210,6 @@ rb_singleton_class_clone(VALUE obj)
     if (!FL_TEST(klass, FL_SINGLETON))
 	return klass;
     else {
-	struct clone_method_data data;
 	/* copy singleton(unnamed) class */
 	VALUE clone = class_alloc((RBASIC(klass)->flags & ~(FL_MARK)), 0);
 
@@ -239,18 +221,16 @@ rb_singleton_class_clone(VALUE obj)
 	}
 
 	RCLASS_SUPER(clone) = RCLASS_SUPER(klass);
-	if (RCLASS_IV_TBL(klass)) {
-	    RCLASS_IV_TBL(clone) = st_copy(RCLASS_IV_TBL(klass));
-	}
-	if (RCLASS_CONST_TBL(klass)) {
-	    RCLASS_CONST_TBL(clone) = st_init_numtable();
-	    st_foreach(RCLASS_CONST_TBL(klass), clone_const_i, (st_data_t)RCLASS_CONST_TBL(clone));
-	}
-	RCLASS_M_TBL(clone) = st_init_numtable();
-	data.tbl = RCLASS_M_TBL(clone);
-	data.klass = (VALUE)clone;
-	st_foreach(RCLASS_M_TBL(klass), clone_method,
-		   (st_data_t)&data);
+        sa_copy_to(RCLASS_IV_TBL(klass), RCLASS_IV_TBL(clone));
+
+        SA_FOREACH_START(RCLASS_CONST_TBL(klass));
+        clone_const(entry->key, value, RCLASS_CONST_TBL(clone));
+        SA_FOREACH_END();
+
+        SA_FOREACH_START(RCLASS_M_TBL(klass));
+        clone_method(entry->key, (const rb_method_entry_t*)value, clone);
+        SA_FOREACH_END();
+
 	rb_singleton_class_attached(RBASIC(clone)->klass, (VALUE)clone);
 	FL_SET(clone, FL_SINGLETON);
 	return (VALUE)clone;
@@ -265,10 +245,7 @@ void
 rb_singleton_class_attached(VALUE klass, VALUE obj)
 {
     if (FL_TEST(klass, FL_SINGLETON)) {
-	if (!RCLASS_IV_TBL(klass)) {
-	    RCLASS_IV_TBL(klass) = st_init_numtable();
-	}
-	st_insert(RCLASS_IV_TBL(klass), id_attached, obj);
+	sa_insert(RCLASS_IV_TBL(klass), (sa_index_t)id_attached, obj);
     }
 }
 
@@ -355,12 +332,12 @@ make_singleton_class(VALUE obj)
 static VALUE
 boot_defclass(const char *name, VALUE super)
 {
-    extern st_table *rb_class_tbl;
+    extern sa_table rb_class_tbl;
     VALUE obj = rb_class_boot(super);
     ID id = rb_intern(name);
 
     rb_name_class(obj, id);
-    st_add_direct(rb_class_tbl, id, obj);
+    sa_insert(&rb_class_tbl, (sa_index_t)id, obj);
     rb_const_set((rb_cObject ? rb_cObject : obj), id, obj);
     return obj;
 }
@@ -484,7 +461,7 @@ rb_define_class(const char *name, VALUE super)
 	rb_warn("no super class for `%s', Object assumed", name);
     }
     klass = rb_define_class_id(id, super);
-    st_add_direct(rb_class_tbl, id, klass);
+    sa_insert(&rb_class_tbl, (sa_index_t)id, klass);
     rb_name_class(klass, id);
     rb_const_set(rb_cObject, id, klass);
     rb_class_inherited(super, klass);
@@ -565,8 +542,6 @@ rb_module_new(void)
 {
     VALUE mdl = class_alloc(T_MODULE, rb_cModule);
 
-    RCLASS_M_TBL(mdl) = st_init_numtable();
-
     return (VALUE)mdl;
 }
 
@@ -595,7 +570,7 @@ rb_define_module(const char *name)
 	rb_raise(rb_eTypeError, "%s is not a module", rb_obj_classname(module));
     }
     module = rb_define_module_id(id);
-    st_add_direct(rb_class_tbl, id, module);
+    sa_insert(&rb_class_tbl, (sa_index_t)id, module);
     rb_const_set(rb_cObject, id, module);
 
     return module;
@@ -630,27 +605,15 @@ rb_define_module_id_under(VALUE outer, ID id)
 static VALUE
 include_class_new(VALUE module, VALUE super)
 {
-    VALUE klass = class_alloc(T_ICLASS, rb_cClass);
+    VALUE klass;
 
     if (BUILTIN_TYPE(module) == T_ICLASS) {
 	module = RBASIC(module)->klass;
     }
-    if (!RCLASS_IV_TBL(module)) {
-	RCLASS_IV_TBL(module) = st_init_numtable();
-    }
-    if (!RCLASS_CONST_TBL(module)) {
-	RCLASS_CONST_TBL(module) = st_init_numtable();
-    }
-    RCLASS_IV_TBL(klass) = RCLASS_IV_TBL(module);
-    RCLASS_CONST_TBL(klass) = RCLASS_CONST_TBL(module);
-    RCLASS_M_TBL(klass) = RCLASS_M_TBL(module);
+    klass = iclass_alloc();
+    RBASIC(klass)->klass = module;
+    RCLASS_EXT(klass) = RCLASS_EXT(module);
     RCLASS_SUPER(klass) = super;
-    if (TYPE(module) == T_ICLASS) {
-	RBASIC(klass)->klass = RBASIC(module)->klass;
-    }
-    else {
-	RBASIC(klass)->klass = module;
-    }
     OBJ_INFECT(klass, module);
     OBJ_INFECT(klass, super);
 
@@ -677,13 +640,13 @@ rb_include_module(VALUE klass, VALUE module)
     while (module) {
 	int superclass_seen = FALSE;
 
-	if (RCLASS_M_TBL(klass) == RCLASS_M_TBL(module))
+	if (RCLASS_EXT(klass) == RCLASS_EXT(module))
 	    rb_raise(rb_eArgError, "cyclic include detected");
 	/* ignore if the module included already in superclasses */
 	for (p = RCLASS_SUPER(klass); p; p = RCLASS_SUPER(p)) {
 	    switch (BUILTIN_TYPE(p)) {
 	      case T_ICLASS:
-		if (RCLASS_M_TBL(p) == RCLASS_M_TBL(module)) {
+		if (RCLASS_EXT(p) == RCLASS_EXT(module)) {
 		    if (!superclass_seen) {
 			c = p;  /* move insertion point */
 		    }
@@ -696,7 +659,7 @@ rb_include_module(VALUE klass, VALUE module)
 	    }
 	}
 	c = RCLASS_SUPER(c) = include_class_new(module, RCLASS_SUPER(c));
-	if (RMODULE_M_TBL(module) && RMODULE_M_TBL(module)->num_entries)
+	if (RMODULE_M_TBL(module)->num_entries)
 	    changed = 1;
       skip:
 	module = RCLASS_SUPER(module);
@@ -827,58 +790,58 @@ ins_methods_push(ID name, long type, VALUE ary, long visi)
 }
 
 static int
-ins_methods_i(st_data_t name, st_data_t type, st_data_t ary)
+ins_methods_i(sa_index_t name, st_data_t type, st_data_t ary)
 {
     return ins_methods_push((ID)name, (long)type, (VALUE)ary, -1); /* everything but private */
 }
 
 static int
-ins_methods_prot_i(st_data_t name, st_data_t type, st_data_t ary)
+ins_methods_prot_i(sa_index_t name, st_data_t type, st_data_t ary)
 {
     return ins_methods_push((ID)name, (long)type, (VALUE)ary, NOEX_PROTECTED);
 }
 
 static int
-ins_methods_priv_i(st_data_t name, st_data_t type, st_data_t ary)
+ins_methods_priv_i(sa_index_t name, st_data_t type, st_data_t ary)
 {
     return ins_methods_push((ID)name, (long)type, (VALUE)ary, NOEX_PRIVATE);
 }
 
 static int
-ins_methods_pub_i(st_data_t name, st_data_t type, st_data_t ary)
+ins_methods_pub_i(sa_index_t name, st_data_t type, st_data_t ary)
 {
     return ins_methods_push((ID)name, (long)type, (VALUE)ary, NOEX_PUBLIC);
 }
 
 static int
-method_entry_i(st_data_t key, st_data_t value, st_data_t data)
+method_entry_i(sa_index_t key, st_data_t value, st_data_t data)
 {
     const rb_method_entry_t *me = (const rb_method_entry_t *)value;
-    st_table *list = (st_table *)data;
+    sa_table *list = (sa_table *)data;
     long type;
 
     if ((ID)key == ID_ALLOCATOR) {
 	return ST_CONTINUE;
     }
 
-    if (!st_lookup(list, key, 0)) {
+    if (!sa_lookup(list, key, 0)) {
 	if (UNDEFINED_METHOD_ENTRY_P(me)) {
 	    type = -1; /* none */
 	}
 	else {
 	    type = VISI(me->flag);
 	}
-	st_add_direct(list, key, type);
+	sa_insert(list, key, type);
     }
     return ST_CONTINUE;
 }
 
 static VALUE
-class_instance_method_list(int argc, VALUE *argv, VALUE mod, int obj, int (*func) (st_data_t, st_data_t, st_data_t))
+class_instance_method_list(int argc, VALUE *argv, VALUE mod, int obj, int (*func) (sa_index_t, st_data_t, st_data_t))
 {
     VALUE ary;
     int recur;
-    st_table *list;
+    sa_table list = SA_EMPTY_TABLE;
 
     if (argc == 0) {
 	recur = TRUE;
@@ -889,16 +852,15 @@ class_instance_method_list(int argc, VALUE *argv, VALUE mod, int obj, int (*func
 	recur = RTEST(r);
     }
 
-    list = st_init_numtable();
     for (; mod; mod = RCLASS_SUPER(mod)) {
-	st_foreach(RCLASS_M_TBL(mod), method_entry_i, (st_data_t)list);
+	sa_foreach(RCLASS_M_TBL(mod), method_entry_i, (st_data_t)&list);
 	if (BUILTIN_TYPE(mod) == T_ICLASS) continue;
 	if (obj && FL_TEST(mod, FL_SINGLETON)) continue;
 	if (!recur) break;
     }
     ary = rb_ary_new();
-    st_foreach(list, func, ary);
-    st_free_table(list);
+    sa_foreach(&list, func, ary);
+    sa_clear(&list);
 
     return ary;
 }
@@ -1112,7 +1074,7 @@ VALUE
 rb_obj_singleton_methods(int argc, VALUE *argv, VALUE obj)
 {
     VALUE recur, ary, klass;
-    st_table *list;
+    sa_table list = SA_EMPTY_TABLE;
 
     if (argc == 0) {
 	recur = Qtrue;
@@ -1121,20 +1083,19 @@ rb_obj_singleton_methods(int argc, VALUE *argv, VALUE obj)
 	rb_scan_args(argc, argv, "01", &recur);
     }
     klass = CLASS_OF(obj);
-    list = st_init_numtable();
     if (klass && FL_TEST(klass, FL_SINGLETON)) {
-	st_foreach(RCLASS_M_TBL(klass), method_entry_i, (st_data_t)list);
+	sa_foreach(RCLASS_M_TBL(klass), method_entry_i, (st_data_t)&list);
 	klass = RCLASS_SUPER(klass);
     }
     if (RTEST(recur)) {
 	while (klass && (FL_TEST(klass, FL_SINGLETON) || TYPE(klass) == T_ICLASS)) {
-	    st_foreach(RCLASS_M_TBL(klass), method_entry_i, (st_data_t)list);
+	    sa_foreach(RCLASS_M_TBL(klass), method_entry_i, (st_data_t)&list);
 	    klass = RCLASS_SUPER(klass);
 	}
     }
     ary = rb_ary_new();
-    st_foreach(list, ins_methods_i, ary);
-    st_free_table(list);
+    sa_foreach(&list, ins_methods_i, ary);
+    sa_clear(&list);
 
     return ary;
 }
diff --git a/common.mk b/common.mk
index c9ef641..3ccfa47 100644
--- a/common.mk
+++ b/common.mk
@@ -79,6 +79,7 @@ COMMONOBJS    = array.$(OBJEXT) \
 		safe.$(OBJEXT) \
 		signal.$(OBJEXT) \
 		sprintf.$(OBJEXT) \
+		sp_ar.$(OBJEXT) \
 		st.$(OBJEXT) \
 		strftime.$(OBJEXT) \
 		string.$(OBJEXT) \
@@ -638,7 +639,8 @@ file.$(OBJEXT): {$(VPATH)}file.c $(RUBY_H_INCLUDES) {$(VPATH)}io.h \
 gc.$(OBJEXT): {$(VPATH)}gc.c $(RUBY_H_INCLUDES) {$(VPATH)}re.h \
   {$(VPATH)}regex.h $(ENCODING_H_INCLUDES) $(VM_CORE_H_INCLUDES) \
   {$(VPATH)}gc.h {$(VPATH)}io.h {$(VPATH)}eval_intern.h {$(VPATH)}util.h \
-  {$(VPATH)}debug.h {$(VPATH)}internal.h {$(VPATH)}constant.h
+  {$(VPATH)}debug.h {$(VPATH)}internal.h {$(VPATH)}constant.h \
+  {$(VPATH)}pool_alloc.inc.h {$(VPATH)}pool_alloc.h
 hash.$(OBJEXT): {$(VPATH)}hash.c $(RUBY_H_INCLUDES) {$(VPATH)}util.h \
   $(ENCODING_H_INCLUDES)
 inits.$(OBJEXT): {$(VPATH)}inits.c $(RUBY_H_INCLUDES) \
@@ -702,7 +704,8 @@ signal.$(OBJEXT): {$(VPATH)}signal.c $(RUBY_H_INCLUDES) \
   $(VM_CORE_H_INCLUDES) {$(VPATH)}debug.h
 sprintf.$(OBJEXT): {$(VPATH)}sprintf.c $(RUBY_H_INCLUDES) {$(VPATH)}re.h \
   {$(VPATH)}regex.h {$(VPATH)}vsnprintf.c $(ENCODING_H_INCLUDES)
-st.$(OBJEXT): {$(VPATH)}st.c $(RUBY_H_INCLUDES)
+sp_ar.$(OBJEXT): {$(VPATH)}sp_ar.c $(RUBY_H_INCLUDES)
+st.$(OBJEXT): {$(VPATH)}st.c $(RUBY_H_INCLUDES) {$(VPATH)}pool_alloc.h
 strftime.$(OBJEXT): {$(VPATH)}strftime.c $(RUBY_H_INCLUDES) \
   {$(VPATH)}timev.h
 string.$(OBJEXT): {$(VPATH)}string.c $(RUBY_H_INCLUDES) {$(VPATH)}re.h \
diff --git a/configure.in b/configure.in
index b006a01..a3ccad7 100644
--- a/configure.in
+++ b/configure.in
@@ -1324,6 +1324,29 @@ main() {
 CFLAGS="$save_CFLAGS"])
 AC_DEFINE_UNQUOTED(GC_MARK_STACKFRAME_WORD, $rb_cv_gc_mark_stackframe_word)
 
+AS_CASE(["$target_os"],
+[openbsd*], [
+  AC_CACHE_CHECK(for heap align log on openbsd, rb_cv_page_size_log,
+    [rb_cv_page_size_log=no
+     for page_log in 12 13; do
+       AC_TRY_RUN([
+#include <math.h>
+#include <unistd.h>
+
+int
+main() {
+  if ((int)log2((double)sysconf(_SC_PAGESIZE)) != $page_log) return 1;
+  return 0;
+}
+       ],
+       rb_cv_page_size_log="$page_log"; break)
+     done])
+  if test $rb_cv_page_size_log != no; then
+    AC_DEFINE_UNQUOTED(HEAP_ALIGN_LOG, $rb_cv_page_size_log)
+  else
+    AC_DEFINE_UNQUOTED(HEAP_ALIGN_LOG, 12)
+  fi
+])
 
 dnl Checks for library functions.
 AC_TYPE_GETGROUPS
@@ -1424,7 +1447,8 @@ AC_CHECK_FUNCS(fmod killpg wait4 waitpid fork spawnv syscall __syscall chroot ge
 	      setsid telldir seekdir fchmod cosh sinh tanh log2 round\
 	      setuid setgid daemon select_large_fdset setenv unsetenv\
               mktime timegm gmtime_r clock_gettime gettimeofday poll ppoll\
-              pread sendfile shutdown sigaltstack dl_iterate_phdr)
+              pread sendfile shutdown sigaltstack dl_iterate_phdr\
+              dup3 pipe2 posix_memalign memalign)
 
 AC_CACHE_CHECK(for unsetenv returns a value, rb_cv_unsetenv_return_value,
   [AC_TRY_COMPILE([
diff --git a/constant.h b/constant.h
index 8232910..9106847 100644
--- a/constant.h
+++ b/constant.h
@@ -23,7 +23,7 @@ typedef struct rb_const_entry_struct {
 
 VALUE rb_mod_private_constant(int argc, VALUE *argv, VALUE obj);
 VALUE rb_mod_public_constant(int argc, VALUE *argv, VALUE obj);
-void rb_free_const_table(st_table *tbl);
+void rb_free_const_table(sa_table *tbl);
 VALUE rb_public_const_get(VALUE klass, ID id);
 VALUE rb_public_const_get_at(VALUE klass, ID id);
 VALUE rb_public_const_get_from(VALUE klass, ID id);
diff --git a/ext/-test-/st/numhash/numhash.c b/ext/-test-/st/numhash/numhash.c
index e186cd4..53d9e1b 100644
--- a/ext/-test-/st/numhash/numhash.c
+++ b/ext/-test-/st/numhash/numhash.c
@@ -54,7 +54,7 @@ numhash_i(st_data_t key, st_data_t value, st_data_t arg, int error)
 static VALUE
 numhash_each(VALUE self)
 {
-    return st_foreach((st_table *)DATA_PTR(self), numhash_i, self) ? Qtrue : Qfalse;
+    return st_foreach_check((st_table *)DATA_PTR(self), numhash_i, self, 0) ? Qtrue : Qfalse;
 }
 
 void
diff --git a/ext/objspace/objspace.c b/ext/objspace/objspace.c
index 66e33a3..4b31f92 100644
--- a/ext/objspace/objspace.c
+++ b/ext/objspace/objspace.c
@@ -60,20 +60,10 @@ memsize_of(VALUE obj)
 	break;
       case T_MODULE:
       case T_CLASS:
-	size += st_memsize(RCLASS_M_TBL(obj));
-	if (RCLASS_IV_TBL(obj)) {
-	    size += st_memsize(RCLASS_IV_TBL(obj));
-	}
-	if (RCLASS_IV_INDEX_TBL(obj)) {
-	    size += st_memsize(RCLASS_IV_INDEX_TBL(obj));
-	}
-	if (RCLASS(obj)->ptr->iv_tbl) {
-	    size += st_memsize(RCLASS(obj)->ptr->iv_tbl);
-	}
-	if (RCLASS(obj)->ptr->const_tbl) {
-	    size += st_memsize(RCLASS(obj)->ptr->const_tbl);
-	}
-	size += sizeof(rb_classext_t);
+	size += sa_memsize(RCLASS_M_TBL(obj));
+        size += sa_memsize(RCLASS_IV_TBL(obj));
+        size += sa_memsize(RCLASS_IV_INDEX_TBL(obj));
+        size += sa_memsize(RCLASS_CONST_TBL(obj));
 	break;
       case T_STRING:
 	size += rb_str_memsize(obj);
diff --git a/file.c b/file.c
index c1db6d7..3f465e5 100644
--- a/file.c
+++ b/file.c
@@ -148,40 +148,60 @@ file_path_convert(VALUE name)
     return name;
 }
 
-static VALUE
-rb_get_path_check(VALUE obj, int level)
+static rb_encoding *
+check_path_encoding(VALUE str)
+{
+    rb_encoding *enc = rb_enc_get(str);
+    if (!rb_enc_asciicompat(enc)) {
+	rb_raise(rb_eEncCompatError, "path name must be ASCII-compatible (%s): %s",
+		 rb_enc_name(enc), RSTRING_PTR(rb_str_inspect(str)));
+    }
+    return enc;
+}
+
+VALUE
+rb_get_path_check_to_string(VALUE obj, int level)
 {
     VALUE tmp;
     ID to_path;
-    rb_encoding *enc;
 
     if (insecure_obj_p(obj, level)) {
 	rb_insecure_operation();
     }
 
+    if (RB_TYPE_P(obj, T_STRING)) {
+	return obj;
+    }
     CONST_ID(to_path, "to_path");
     tmp = rb_check_funcall(obj, to_path, 0, 0);
     if (tmp == Qundef) {
 	tmp = obj;
     }
     StringValue(tmp);
+    return tmp;
+}
 
+VALUE
+rb_get_path_check_convert(VALUE obj, VALUE tmp, int level)
+{
     tmp = file_path_convert(tmp);
     if (obj != tmp && insecure_obj_p(tmp, level)) {
 	rb_insecure_operation();
     }
-    enc = rb_enc_get(tmp);
-    if (!rb_enc_asciicompat(enc)) {
-	tmp = rb_str_inspect(tmp);
-	rb_raise(rb_eEncCompatError, "path name must be ASCII-compatible (%s): %s",
-		 rb_enc_name(enc), RSTRING_PTR(tmp));
-    }
 
+    check_path_encoding(tmp);
     StringValueCStr(tmp);
 
     return rb_str_new4(tmp);
 }
 
+static VALUE
+rb_get_path_check(VALUE obj, int level)
+{
+    VALUE tmp = rb_get_path_check_to_string(obj, level);
+    return rb_get_path_check_convert(obj, tmp, level);
+}
+
 VALUE
 rb_get_path_no_checksafe(VALUE obj)
 {
@@ -3249,7 +3269,6 @@ rb_file_expand_path(VALUE fname, VALUE dname)
 VALUE
 rb_file_expand_path_fast(VALUE fname, VALUE dname)
 {
-    check_expand_path_args(fname, dname);
     return rb_file_expand_path_internal(fname, dname, 0, 0, EXPAND_PATH_BUFFER());
 }
 
@@ -5237,7 +5256,7 @@ rb_find_file_ext_safe(VALUE *filep, const char *const *ext, int safe_level)
 	rb_raise(rb_eSecurityError, "loading from non-absolute path %s", f);
     }
 
-    RB_GC_GUARD(load_path) = rb_get_load_path();
+    RB_GC_GUARD(load_path) = rb_get_expanded_load_path();
     if (!load_path) return 0;
 
     fname = rb_str_dup(*filep);
@@ -5302,7 +5321,7 @@ rb_find_file_safe(VALUE path, int safe_level)
 	rb_raise(rb_eSecurityError, "loading from non-absolute path %s", f);
     }
 
-    RB_GC_GUARD(load_path) = rb_get_load_path();
+    RB_GC_GUARD(load_path) = rb_get_expanded_load_path();
     if (load_path) {
 	long i;
 
diff --git a/gc.c b/gc.c
index e65d0ec..ee183be 100644
--- a/gc.c
+++ b/gc.c
@@ -20,10 +20,12 @@
 #include "vm_core.h"
 #include "internal.h"
 #include "gc.h"
+#include "pool_alloc.h"
 #include "constant.h"
 #include <stdio.h>
 #include <setjmp.h>
 #include <sys/types.h>
+#include <assert.h>
 
 #ifdef HAVE_SYS_TIME_H
 #include <sys/time.h>
@@ -35,7 +37,12 @@
 
 #if defined _WIN32 || defined __CYGWIN__
 #include <windows.h>
+#elif defined(HAVE_POSIX_MEMALIGN)
+#elif defined(HAVE_MEMALIGN)
+#include <malloc.h>
 #endif
+static void aligned_free(void *);
+static void *aligned_malloc(size_t alignment, size_t size);
 
 #ifdef HAVE_VALGRIND_MEMCHECK_H
 # include <valgrind/memcheck.h>
@@ -321,6 +328,24 @@ struct gc_list {
 
 #define CALC_EXACT_MALLOC_SIZE 0
 
+#ifdef POOL_ALLOC_API
+/* POOL ALLOC API */
+#define POOL_ALLOC_PART 1
+#include "pool_alloc.inc.h"
+#undef POOL_ALLOC_PART
+
+typedef struct pool_layout_t pool_layout_t;
+struct pool_layout_t {
+    pool_header
+      p6,  /* st_table && st_table_entry */
+      p11;  /* st_table.bins init size */
+} pool_layout = {
+    INIT_POOL(void*[6]),
+    INIT_POOL(void*[11])
+};
+static void pool_finalize_header(pool_header *header);
+#endif
+
 typedef struct rb_objspace {
     struct {
 	size_t limit;
@@ -330,6 +355,9 @@ typedef struct rb_objspace {
 	size_t allocations;
 #endif
     } malloc_params;
+#ifdef POOL_ALLOC_API
+    pool_layout_t *pool_headers;
+#endif
     struct {
 	size_t increment;
 	struct heaps_slot *ptr;
@@ -377,7 +405,11 @@ typedef struct rb_objspace {
 #define ruby_initial_gc_stress	initial_params.gc_stress
 int *ruby_initial_gc_stress_ptr = &ruby_initial_gc_stress;
 #else
+#  ifdef POOL_ALLOC_API
+static rb_objspace_t rb_objspace = {{GC_MALLOC_LIMIT}, &pool_layout, {HEAP_MIN_SLOTS}};
+#  else
 static rb_objspace_t rb_objspace = {{GC_MALLOC_LIMIT}, {HEAP_MIN_SLOTS}};
+#  endif
 int *ruby_initial_gc_stress_ptr = &rb_objspace.gc_stress;
 #endif
 #define malloc_limit		objspace->malloc_params.limit
@@ -413,6 +445,10 @@ rb_objspace_alloc(void)
     memset(objspace, 0, sizeof(*objspace));
     malloc_limit = initial_malloc_limit;
     ruby_gc_stress = ruby_initial_gc_stress;
+#ifdef POOL_ALLOC_API
+    objspace->pool_headers = (pool_layout_t*) malloc(sizeof(pool_layout));
+    memcpy(objspace->pool_headers, &pool_layout, sizeof(pool_layout));
+#endif
 
     return objspace;
 }
@@ -491,6 +527,13 @@ rb_objspace_free(rb_objspace_t *objspace)
 	heaps_used = 0;
 	heaps = 0;
     }
+#ifdef POOL_ALLOC_API
+    if (objspace->pool_headers) {
+        pool_finalize_header(&objspace->pool_headers->p6);
+        pool_finalize_header(&objspace->pool_headers->p11);
+        free(objspace->pool_headers);
+    }
+#endif
     free(objspace);
 }
 #endif
@@ -513,7 +556,7 @@ rb_objspace_free(rb_objspace_t *objspace)
 
 #define HEAP_OBJ_LIMIT (unsigned int)(HEAP_SIZE / sizeof(struct RVALUE))
 
-extern st_table *rb_class_tbl;
+extern sa_table rb_class_tbl;
 
 int ruby_disable_gc_stress = 0;
 
@@ -894,6 +937,27 @@ ruby_xfree(void *x)
 	vm_xfree(&rb_objspace, x);
 }
 
+#ifdef POOL_ALLOC_API
+/* POOL ALLOC API */
+#define POOL_ALLOC_PART 2
+#include "pool_alloc.inc.h"
+#undef POOL_ALLOC_PART
+
+void
+ruby_xpool_free(void *ptr)
+{
+    pool_free_entry((void**)ptr);
+}
+
+#define CONCRET_POOL_MALLOC(pnts) \
+void * ruby_xpool_malloc_##pnts##p () { \
+    return pool_alloc_entry(&rb_objspace.pool_headers->p##pnts ); \
+}
+CONCRET_POOL_MALLOC(6)
+CONCRET_POOL_MALLOC(11)
+#undef CONCRET_POOL_MALLOC
+
+#endif
 
 /*
  *  call-seq:
@@ -1008,6 +1072,55 @@ allocate_sorted_heaps(rb_objspace_t *objspace, size_t next_heaps_length)
     heaps_length = next_heaps_length;
 }
 
+static void *
+aligned_malloc(size_t alignment, size_t size)
+{
+    void *res;
+
+#if defined __MINGW32__
+    res = __mingw_aligned_malloc(size, alignment);
+#elif defined _WIN32 && !defined __CYGWIN__
+    res = _aligned_malloc(size, alignment);
+#elif defined(HAVE_POSIX_MEMALIGN)
+    if (posix_memalign(&res, alignment, size) == 0) {
+        return res;
+    }
+    else {
+        return NULL;
+    }
+#elif defined(HAVE_MEMALIGN)
+    res = memalign(alignment, size);
+#else
+    char* aligned;
+    res = malloc(alignment + size + sizeof(void*));
+    aligned = (char*)res + alignment + sizeof(void*);
+    aligned -= ((VALUE)aligned & (alignment - 1));
+    ((void**)aligned)[-1] = res;
+    res = (void*)aligned;
+#endif
+
+#if defined(_DEBUG) || defined(GC_DEBUG)
+    /* alignment must be a power of 2 */
+    assert((alignment - 1) & alignment == 0);
+    assert(alignment % sizeof(void*) == 0);
+#endif
+    return res;
+}
+
+static void
+aligned_free(void *ptr)
+{
+#if defined __MINGW32__
+    __mingw_aligned_free(ptr);
+#elif defined _WIN32 && !defined __CYGWIN__
+    _aligned_free(ptr);
+#elif defined(HAVE_MEMALIGN) || defined(HAVE_POSIX_MEMALIGN)
+    free(ptr);
+#else
+    free(((void**)ptr)[-1]);
+#endif
+}
+
 static void
 assign_heap_slot(rb_objspace_t *objspace)
 {
@@ -1466,6 +1579,15 @@ mark_tbl(rb_objspace_t *objspace, st_table *tbl, int lev)
     st_foreach(tbl, mark_entry, (st_data_t)&arg);
 }
 
+static void
+mark_sa_tbl(rb_objspace_t *objspace, sa_table *tbl, int lev)
+{
+    if (!tbl) return;
+    SA_FOREACH_START(tbl);
+    gc_mark(objspace, (VALUE)value, lev);
+    SA_FOREACH_END();
+}
+
 static int
 mark_key(VALUE key, VALUE value, st_data_t data)
 {
@@ -1544,74 +1666,52 @@ rb_mark_method_entry(const rb_method_entry_t *me)
     mark_method_entry(&rb_objspace, me, 0);
 }
 
-static int
-mark_method_entry_i(ID key, const rb_method_entry_t *me, st_data_t data)
-{
-    struct mark_tbl_arg *arg = (void*)data;
-    mark_method_entry(arg->objspace, me, arg->lev);
-    return ST_CONTINUE;
-}
-
 static void
-mark_m_tbl(rb_objspace_t *objspace, st_table *tbl, int lev)
-{
-    struct mark_tbl_arg arg;
-    if (!tbl) return;
-    arg.objspace = objspace;
-    arg.lev = lev;
-    st_foreach(tbl, mark_method_entry_i, (st_data_t)&arg);
-}
-
-static int
-free_method_entry_i(ID key, rb_method_entry_t *me, st_data_t data)
+mark_m_tbl(rb_objspace_t *objspace, sa_table *tbl, int lev)
 {
-    rb_free_method_entry(me);
-    return ST_CONTINUE;
+    SA_FOREACH_START(tbl);
+    mark_method_entry(objspace, (const rb_method_entry_t*)value, lev);
+    SA_FOREACH_END();
 }
 
 void
-rb_free_m_table(st_table *tbl)
+rb_free_m_table(sa_table *tbl)
 {
-    st_foreach(tbl, free_method_entry_i, 0);
-    st_free_table(tbl);
-}
-
-static int
-mark_const_entry_i(ID key, const rb_const_entry_t *ce, st_data_t data)
-{
-    struct mark_tbl_arg *arg = (void*)data;
-    gc_mark(arg->objspace, ce->value, arg->lev);
-    return ST_CONTINUE;
+    SA_FOREACH_START(tbl);
+    if (!((rb_method_entry_t*)value)->mark) {
+	rb_free_method_entry((rb_method_entry_t*)value);
+    }
+    SA_FOREACH_END();
+    sa_clear(tbl);
 }
 
 static void
-mark_const_tbl(rb_objspace_t *objspace, st_table *tbl, int lev)
+mark_const_tbl(rb_objspace_t *objspace, sa_table *tbl, int lev)
 {
-    struct mark_tbl_arg arg;
-    if (!tbl) return;
-    arg.objspace = objspace;
-    arg.lev = lev;
-    st_foreach(tbl, mark_const_entry_i, (st_data_t)&arg);
+    SA_FOREACH_START(tbl);
+    gc_mark(objspace, ((const rb_const_entry_t*)value)->value, lev);
+    SA_FOREACH_END();
 }
 
-static int
-free_const_entry_i(ID key, rb_const_entry_t *ce, st_data_t data)
+void
+rb_free_const_table(sa_table *tbl)
 {
-    xfree(ce);
-    return ST_CONTINUE;
+    SA_FOREACH_START(tbl);
+    xfree((rb_const_entry_t*)value);
+    SA_FOREACH_END();
+    sa_clear(tbl);
 }
 
 void
-rb_free_const_table(st_table *tbl)
+rb_mark_tbl(st_table *tbl)
 {
-    st_foreach(tbl, free_const_entry_i, 0);
-    st_free_table(tbl);
+    mark_tbl(&rb_objspace, tbl, 0);
 }
 
 void
-rb_mark_tbl(st_table *tbl)
+rb_mark_sa_tbl(sa_table *tbl)
 {
-    mark_tbl(&rb_objspace, tbl, 0);
+    mark_sa_tbl(&rb_objspace, tbl, 0);
 }
 
 void
@@ -1819,7 +1919,7 @@ gc_mark_children(rb_objspace_t *objspace, VALUE ptr, int lev)
       case T_CLASS:
       case T_MODULE:
 	mark_m_tbl(objspace, RCLASS_M_TBL(obj), lev);
-	mark_tbl(objspace, RCLASS_IV_TBL(obj), lev);
+	mark_sa_tbl(objspace, RCLASS_IV_TBL(obj), lev);
 	mark_const_tbl(objspace, RCLASS_CONST_TBL(obj), lev);
 	ptr = RCLASS_SUPER(obj);
 	goto again;
@@ -2286,15 +2386,11 @@ obj_free(rb_objspace_t *objspace, VALUE obj)
       case T_CLASS:
 	rb_clear_cache_by_class((VALUE)obj);
 	rb_free_m_table(RCLASS_M_TBL(obj));
-	if (RCLASS_IV_TBL(obj)) {
-	    st_free_table(RCLASS_IV_TBL(obj));
-	}
-	if (RCLASS_CONST_TBL(obj)) {
-	    rb_free_const_table(RCLASS_CONST_TBL(obj));
-	}
-	if (RCLASS_IV_INDEX_TBL(obj)) {
-	    st_free_table(RCLASS_IV_INDEX_TBL(obj));
-	}
+        sa_clear(RCLASS_IV_TBL(obj));
+        rb_free_const_table(RCLASS_CONST_TBL(obj));
+        sa_clear(RCLASS_IV_INDEX_TBL(obj));
+        sa_clear(&RCLASS(obj)->cache->m_cache_tbl);
+        xfree(RCLASS(obj)->cache);
         xfree(RANY(obj)->as.klass.ptr);
 	break;
       case T_STRING:
@@ -2346,8 +2442,9 @@ obj_free(rb_objspace_t *objspace, VALUE obj)
       case T_COMPLEX:
 	break;
       case T_ICLASS:
+        sa_clear(&RCLASS(obj)->cache->m_cache_tbl);
+        xfree(RCLASS(obj)->cache);
 	/* iClass shares table with the module */
-	xfree(RANY(obj)->as.klass.ptr);
 	break;
 
       case T_FLOAT:
@@ -2458,7 +2555,7 @@ gc_marks(rb_objspace_t *objspace)
     rb_mark_end_proc();
     rb_gc_mark_global_tbl();
 
-    mark_tbl(objspace, rb_class_tbl, 0);
+    mark_sa_tbl(objspace, &rb_class_tbl, 0);
 
     /* mark generic instance variables for special constants */
     rb_mark_generic_ivar_tbl();
diff --git a/hash.c b/hash.c
index fbd8237..4cb2e2d 100644
--- a/hash.c
+++ b/hash.c
@@ -44,7 +44,7 @@ rb_any_cmp(VALUE a, VALUE b)
     if (FIXNUM_P(a) && FIXNUM_P(b)) {
 	return a != b;
     }
-    if (TYPE(a) == T_STRING && RBASIC(a)->klass == rb_cString &&
+    if (RB_TYPE_P(a, T_STRING) && RBASIC(a)->klass == rb_cString &&
 	TYPE(b) == T_STRING && RBASIC(b)->klass == rb_cString) {
 	return rb_str_hash_cmp(a, b);
     }
@@ -80,20 +80,14 @@ rb_any_hash(VALUE a)
     VALUE hval;
     st_index_t hnum;
 
-    switch (TYPE(a)) {
-      case T_FIXNUM:
-      case T_SYMBOL:
-      case T_NIL:
-      case T_FALSE:
-      case T_TRUE:
-	hnum = rb_hash_end(rb_hash_start((unsigned int)a));
-	break;
-
-      case T_STRING:
+    if (SPECIAL_CONST_P(a)) {
+	if (a == Qundef) return 0;
+	hnum = rb_hash_end(rb_hash_start((st_index_t)a));
+    }
+    else if (BUILTIN_TYPE(a) == T_STRING) {
 	hnum = rb_str_hash(a);
-	break;
-
-      default:
+    }
+    else {
         hval = rb_hash(a);
 	hnum = FIX2LONG(hval);
     }
@@ -106,10 +100,8 @@ static const struct st_hash_type objhash = {
     rb_any_hash,
 };
 
-static const struct st_hash_type identhash = {
-    st_numcmp,
-    st_numhash,
-};
+extern const struct st_hash_type st_hashtype_num;
+#define identhash st_hashtype_num
 
 typedef int st_foreach_func(st_data_t, st_data_t, st_data_t);
 
@@ -124,7 +116,6 @@ foreach_safe_i(st_data_t key, st_data_t value, struct foreach_safe_arg *arg)
 {
     int status;
 
-    if (key == Qundef) return ST_CONTINUE;
     status = (*arg->func)(key, value, arg->arg);
     if (status == ST_CONTINUE) {
 	return ST_CHECK;
@@ -140,7 +131,7 @@ st_foreach_safe(st_table *table, int (*func)(ANYARGS), st_data_t a)
     arg.tbl = table;
     arg.func = (st_foreach_func *)func;
     arg.arg = a;
-    if (st_foreach(table, foreach_safe_i, (st_data_t)&arg)) {
+    if (st_foreach_check(table, foreach_safe_i, (st_data_t)&arg, 0)) {
 	rb_raise(rb_eRuntimeError, "hash modified during iteration");
     }
 }
@@ -154,21 +145,21 @@ struct hash_foreach_arg {
 };
 
 static int
-hash_foreach_iter(st_data_t key, st_data_t value, struct hash_foreach_arg *arg)
+hash_foreach_iter(st_data_t key, st_data_t value, st_data_t argp)
 {
+    struct hash_foreach_arg *arg = (struct hash_foreach_arg *)argp;
     int status;
     st_table *tbl;
 
     tbl = RHASH(arg->hash)->ntbl;
-    if ((VALUE)key == Qundef) return ST_CONTINUE;
     status = (*arg->func)((VALUE)key, (VALUE)value, arg->arg);
     if (RHASH(arg->hash)->ntbl != tbl) {
 	rb_raise(rb_eRuntimeError, "rehash occurred during iteration");
     }
     switch (status) {
       case ST_DELETE:
-	st_delete_safe(tbl, &key, 0, Qundef);
 	FL_SET(arg->hash, HASH_DELETED);
+	return ST_DELETE;
       case ST_CONTINUE:
 	break;
       case ST_STOP:
@@ -184,7 +175,7 @@ hash_foreach_ensure(VALUE hash)
 
     if (RHASH(hash)->iter_lev == 0) {
 	if (FL_TEST(hash, HASH_DELETED)) {
-	    st_cleanup_safe(RHASH(hash)->ntbl, Qundef);
+	    st_cleanup_safe(RHASH(hash)->ntbl, (st_data_t)Qundef);
 	    FL_UNSET(hash, HASH_DELETED);
 	}
     }
@@ -192,9 +183,10 @@ hash_foreach_ensure(VALUE hash)
 }
 
 static VALUE
-hash_foreach_call(struct hash_foreach_arg *arg)
+hash_foreach_call(VALUE arg)
 {
-    if (st_foreach(RHASH(arg->hash)->ntbl, hash_foreach_iter, (st_data_t)arg)) {
+    VALUE hash = ((struct hash_foreach_arg *)arg)->hash;
+    if (st_foreach_check(RHASH(hash)->ntbl, hash_foreach_iter, (st_data_t)arg, (st_data_t)Qundef)) {
 	rb_raise(rb_eRuntimeError, "hash modified during iteration");
     }
     return Qnil;
@@ -447,7 +439,7 @@ rb_hash_rehash_i(VALUE key, VALUE value, VALUE arg)
 {
     st_table *tbl = (st_table *)arg;
 
-    if (key != Qundef) st_insert(tbl, key, value);
+    st_insert(tbl, (st_data_t)key, (st_data_t)value);
     return ST_CONTINUE;
 }
 
@@ -490,6 +482,20 @@ rb_hash_rehash(VALUE hash)
     return hash;
 }
 
+static VALUE
+hash_default_value(VALUE hash, VALUE key)
+{
+    if (rb_method_basic_definition_p(CLASS_OF(hash), id_default)) {
+	VALUE ifnone = RHASH_IFNONE(hash);
+	if (!FL_TEST(hash, HASH_PROC_DEFAULT)) return ifnone;
+	if (key == Qundef) return Qnil;
+	return rb_funcall(ifnone, id_yield, 2, hash, key);
+    }
+    else {
+	return rb_funcall(hash, id_default, 1, key);
+    }
+}
+
 /*
  *  call-seq:
  *     hsh[key]    ->  value
@@ -510,13 +516,7 @@ rb_hash_aref(VALUE hash, VALUE key)
     st_data_t val;
 
     if (!RHASH(hash)->ntbl || !st_lookup(RHASH(hash)->ntbl, key, &val)) {
-	if (!FL_TEST(hash, HASH_PROC_DEFAULT) &&
-	    rb_method_basic_definition_p(CLASS_OF(hash), id_default)) {
-	    return RHASH_IFNONE(hash);
-	}
-	else {
-	    return rb_funcall(hash, id_default, 1, key);
-	}
+	return hash_default_value(hash, key);
     }
     return (VALUE)val;
 }
@@ -659,7 +659,7 @@ rb_hash_default(int argc, VALUE *argv, VALUE hash)
 static VALUE
 rb_hash_set_default(VALUE hash, VALUE ifnone)
 {
-    rb_hash_modify(hash);
+    rb_hash_modify_check(hash);
     RHASH_IFNONE(hash) = ifnone;
     FL_UNSET(hash, HASH_PROC_DEFAULT);
     return ifnone;
@@ -707,7 +707,7 @@ rb_hash_set_default_proc(VALUE hash, VALUE proc)
 {
     VALUE b;
 
-    rb_hash_modify(hash);
+    rb_hash_modify_check(hash);
     b = rb_check_convert_type(proc, T_DATA, "Proc", "to_proc");
     if (NIL_P(b) || !rb_obj_is_proc(b)) {
 	rb_raise(rb_eTypeError,
@@ -776,7 +776,7 @@ rb_hash_delete_key(VALUE hash, VALUE key)
     if (!RHASH(hash)->ntbl)
         return Qundef;
     if (RHASH(hash)->iter_lev > 0) {
-	if (st_delete_safe(RHASH(hash)->ntbl, &ktmp, &val, Qundef)) {
+	if (st_delete_safe(RHASH(hash)->ntbl, &ktmp, &val, (st_data_t)Qundef)) {
 	    FL_SET(hash, HASH_DELETED);
 	    return (VALUE)val;
 	}
@@ -809,7 +809,7 @@ rb_hash_delete(VALUE hash, VALUE key)
 {
     VALUE val;
 
-    rb_hash_modify(hash);
+    rb_hash_modify_check(hash);
     val = rb_hash_delete_key(hash, key);
     if (val != Qundef) return val;
     if (rb_block_given_p()) {
@@ -828,7 +828,6 @@ shift_i(VALUE key, VALUE value, VALUE arg)
 {
     struct shift_var *var = (struct shift_var *)arg;
 
-    if (key == Qundef) return ST_CONTINUE;
     if (var->key != Qundef) return ST_STOP;
     var->key = key;
     var->val = value;
@@ -840,7 +839,6 @@ shift_i_safe(VALUE key, VALUE value, VALUE arg)
 {
     struct shift_var *var = (struct shift_var *)arg;
 
-    if (key == Qundef) return ST_CONTINUE;
     var->key = key;
     var->val = value;
     return ST_STOP;
@@ -864,29 +862,25 @@ rb_hash_shift(VALUE hash)
 {
     struct shift_var var;
 
-    rb_hash_modify(hash);
-    var.key = Qundef;
-    rb_hash_foreach(hash, RHASH(hash)->iter_lev > 0 ? shift_i_safe : shift_i,
-		    (VALUE)&var);
-
-    if (var.key != Qundef) {
-	if (RHASH(hash)->iter_lev > 0) {
-	    rb_hash_delete_key(hash, var.key);
+    rb_hash_modify_check(hash);
+    if (RHASH(hash)->ntbl) {
+	var.key = Qundef;
+	rb_hash_foreach(hash, RHASH(hash)->iter_lev > 0 ? shift_i_safe : shift_i,
+			(VALUE)&var);
+
+	if (var.key != Qundef) {
+	    if (RHASH(hash)->iter_lev > 0) {
+		rb_hash_delete_key(hash, var.key);
+	    }
+	    return rb_assoc_new(var.key, var.val);
 	}
-	return rb_assoc_new(var.key, var.val);
-    }
-    else if (FL_TEST(hash, HASH_PROC_DEFAULT)) {
-	return rb_funcall(RHASH_IFNONE(hash), id_yield, 2, hash, Qnil);
-    }
-    else {
-	return RHASH_IFNONE(hash);
     }
+    return hash_default_value(hash, Qnil);
 }
 
 static int
 delete_if_i(VALUE key, VALUE value, VALUE hash)
 {
-    if (key == Qundef) return ST_CONTINUE;
     if (RTEST(rb_yield_values(2, key, value))) {
 	rb_hash_delete_key(hash, key);
     }
@@ -912,8 +906,9 @@ VALUE
 rb_hash_delete_if(VALUE hash)
 {
     RETURN_ENUMERATOR(hash, 0, 0);
-    rb_hash_modify(hash);
-    rb_hash_foreach(hash, delete_if_i, hash);
+    rb_hash_modify_check(hash);
+    if (RHASH(hash)->ntbl)
+	rb_hash_foreach(hash, delete_if_i, hash);
     return hash;
 }
 
@@ -984,7 +979,6 @@ rb_hash_values_at(int argc, VALUE *argv, VALUE hash)
 static int
 select_i(VALUE key, VALUE value, VALUE result)
 {
-    if (key == Qundef) return ST_CONTINUE;
     if (RTEST(rb_yield_values(2, key, value)))
 	rb_hash_aset(result, key, value);
     return ST_CONTINUE;
@@ -1018,7 +1012,6 @@ rb_hash_select(VALUE hash)
 static int
 keep_if_i(VALUE key, VALUE value, VALUE hash)
 {
-    if (key == Qundef) return ST_CONTINUE;
     if (!RTEST(rb_yield_values(2, key, value))) {
 	return ST_DELETE;
     }
@@ -1040,7 +1033,7 @@ rb_hash_select_bang(VALUE hash)
     st_index_t n;
 
     RETURN_ENUMERATOR(hash, 0, 0);
-    rb_hash_modify(hash);
+    rb_hash_modify_check(hash);
     if (!RHASH(hash)->ntbl)
         return Qnil;
     n = RHASH(hash)->ntbl->num_entries;
@@ -1065,8 +1058,9 @@ VALUE
 rb_hash_keep_if(VALUE hash)
 {
     RETURN_ENUMERATOR(hash, 0, 0);
-    rb_hash_modify(hash);
-    rb_hash_foreach(hash, keep_if_i, hash);
+    rb_hash_modify_check(hash);
+    if (RHASH(hash)->ntbl)
+	rb_hash_foreach(hash, keep_if_i, hash);
     return hash;
 }
 
@@ -1087,7 +1081,7 @@ clear_i(VALUE key, VALUE value, VALUE dummy)
  *
  */
 
-static VALUE
+VALUE
 rb_hash_clear(VALUE hash)
 {
     rb_hash_modify_check(hash);
@@ -1144,9 +1138,7 @@ rb_hash_aset(VALUE hash, VALUE key, VALUE val)
 static int
 replace_i(VALUE key, VALUE val, VALUE hash)
 {
-    if (key != Qundef) {
-	rb_hash_aset(hash, key, val);
-    }
+    rb_hash_aset(hash, key, val);
 
     return ST_CONTINUE;
 }
@@ -1227,7 +1219,6 @@ rb_hash_empty_p(VALUE hash)
 static int
 each_value_i(VALUE key, VALUE value)
 {
-    if (key == Qundef) return ST_CONTINUE;
     rb_yield(value);
     return ST_CONTINUE;
 }
@@ -1262,7 +1253,6 @@ rb_hash_each_value(VALUE hash)
 static int
 each_key_i(VALUE key, VALUE value)
 {
-    if (key == Qundef) return ST_CONTINUE;
     rb_yield(key);
     return ST_CONTINUE;
 }
@@ -1296,7 +1286,6 @@ rb_hash_each_key(VALUE hash)
 static int
 each_pair_i(VALUE key, VALUE value)
 {
-    if (key == Qundef) return ST_CONTINUE;
     rb_yield(rb_assoc_new(key, value));
     return ST_CONTINUE;
 }
@@ -1334,7 +1323,6 @@ rb_hash_each_pair(VALUE hash)
 static int
 to_a_i(VALUE key, VALUE value, VALUE ary)
 {
-    if (key == Qundef) return ST_CONTINUE;
     rb_ary_push(ary, rb_assoc_new(key, value));
     return ST_CONTINUE;
 }
@@ -1367,7 +1355,6 @@ inspect_i(VALUE key, VALUE value, VALUE str)
 {
     VALUE str2;
 
-    if (key == Qundef) return ST_CONTINUE;
     str2 = rb_inspect(key);
     if (RSTRING_LEN(str) > 1) {
 	rb_str_cat2(str, ", ");
@@ -1434,7 +1421,6 @@ rb_hash_to_hash(VALUE hash)
 static int
 keys_i(VALUE key, VALUE value, VALUE ary)
 {
-    if (key == Qundef) return ST_CONTINUE;
     rb_ary_push(ary, key);
     return ST_CONTINUE;
 }
@@ -1465,7 +1451,6 @@ rb_hash_keys(VALUE hash)
 static int
 values_i(VALUE key, VALUE value, VALUE ary)
 {
-    if (key == Qundef) return ST_CONTINUE;
     rb_ary_push(ary, value);
     return ST_CONTINUE;
 }
@@ -1524,7 +1509,6 @@ rb_hash_search_value(VALUE key, VALUE value, VALUE arg)
 {
     VALUE *data = (VALUE *)arg;
 
-    if (key == Qundef) return ST_CONTINUE;
     if (rb_equal(value, data[1])) {
 	data[0] = Qtrue;
 	return ST_STOP;
@@ -1568,7 +1552,6 @@ eql_i(VALUE key, VALUE val1, VALUE arg)
     struct equal_data *data = (struct equal_data *)arg;
     st_data_t val2;
 
-    if (key == Qundef) return ST_CONTINUE;
     if (!st_lookup(data->tbl, key, &val2)) {
 	data->result = Qfalse;
 	return ST_STOP;
@@ -1599,7 +1582,7 @@ hash_equal(VALUE hash1, VALUE hash2, int eql)
     struct equal_data data;
 
     if (hash1 == hash2) return Qtrue;
-    if (TYPE(hash2) != T_HASH) {
+    if (!RB_TYPE_P(hash2, T_HASH)) {
 	if (!rb_respond_to(hash2, rb_intern("to_hash"))) {
 	    return Qfalse;
 	}
@@ -1670,7 +1653,6 @@ hash_i(VALUE key, VALUE val, VALUE arg)
     st_index_t *hval = (st_index_t *)arg;
     st_index_t hdata[2];
 
-    if (key == Qundef) return ST_CONTINUE;
     hdata[0] = rb_hash(key);
     hdata[1] = rb_hash(val);
     *hval ^= st_hash(hdata, sizeof(hdata), 0);
@@ -1711,7 +1693,6 @@ rb_hash_hash(VALUE hash)
 static int
 rb_hash_invert_i(VALUE key, VALUE value, VALUE hash)
 {
-    if (key == Qundef) return ST_CONTINUE;
     rb_hash_aset(hash, value, key);
     return ST_CONTINUE;
 }
@@ -1740,7 +1721,6 @@ rb_hash_invert(VALUE hash)
 static int
 rb_hash_update_i(VALUE key, VALUE value, VALUE hash)
 {
-    if (key == Qundef) return ST_CONTINUE;
     hash_update(hash, key);
     st_insert(RHASH(hash)->ntbl, key, value);
     return ST_CONTINUE;
@@ -1749,7 +1729,6 @@ rb_hash_update_i(VALUE key, VALUE value, VALUE hash)
 static int
 rb_hash_update_block_i(VALUE key, VALUE value, VALUE hash)
 {
-    if (key == Qundef) return ST_CONTINUE;
     if (rb_hash_has_key(hash, key)) {
 	value = rb_yield_values(3, key, rb_hash_aref(hash, key), value);
     }
@@ -1806,7 +1785,6 @@ rb_hash_update_func_i(VALUE key, VALUE value, VALUE arg0)
     struct update_arg *arg = (struct update_arg *)arg0;
     VALUE hash = arg->hash;
 
-    if (key == Qundef) return ST_CONTINUE;
     if (rb_hash_has_key(hash, key)) {
 	value = (*arg->func)(key, rb_hash_aref(hash, key), value);
     }
@@ -1863,7 +1841,6 @@ assoc_i(VALUE key, VALUE val, VALUE arg)
 {
     VALUE *args = (VALUE *)arg;
 
-    if (key == Qundef) return ST_CONTINUE;
     if (RTEST(rb_equal(args[0], key))) {
 	args[1] = rb_assoc_new(key, val);
 	return ST_STOP;
@@ -1901,7 +1878,6 @@ rassoc_i(VALUE key, VALUE val, VALUE arg)
 {
     VALUE *args = (VALUE *)arg;
 
-    if (key == Qundef) return ST_CONTINUE;
     if (RTEST(rb_equal(args[0], val))) {
 	args[1] = rb_assoc_new(key, val);
 	return ST_STOP;
@@ -2198,7 +2174,7 @@ rb_env_path_tainted(void)
 }
 
 #if defined(_WIN32) || (defined(HAVE_SETENV) && defined(HAVE_UNSETENV))
-#elif defined __sun__
+#elif defined __sun
 static int
 in_origenv(const char *str)
 {
@@ -2286,7 +2262,7 @@ ruby_setenv(const char *name, const char *value)
 	    rb_sys_fail("unsetenv");
 #endif
     }
-#elif defined __sun__
+#elif defined __sun
     size_t len;
     char **env_ptr, *str;
     if (strchr(name, '=')) {
@@ -3084,11 +3060,9 @@ env_invert(void)
 static int
 env_replace_i(VALUE key, VALUE val, VALUE keys)
 {
-    if (key != Qundef) {
-	env_aset(Qnil, key, val);
-	if (rb_ary_includes(keys, key)) {
-	    rb_ary_delete(keys, key);
-	}
+    env_aset(Qnil, key, val);
+    if (rb_ary_includes(keys, key)) {
+	rb_ary_delete(keys, key);
     }
     return ST_CONTINUE;
 }
@@ -3120,12 +3094,10 @@ env_replace(VALUE env, VALUE hash)
 static int
 env_update_i(VALUE key, VALUE val)
 {
-    if (key != Qundef) {
-	if (rb_block_given_p()) {
-	    val = rb_yield_values(3, key, rb_f_getenv(Qnil, key), val);
-	}
-	env_aset(Qnil, key, val);
+    if (rb_block_given_p()) {
+	val = rb_yield_values(3, key, rb_f_getenv(Qnil, key), val);
     }
+    env_aset(Qnil, key, val);
     return ST_CONTINUE;
 }
 
@@ -3150,15 +3122,116 @@ env_update(VALUE env, VALUE hash)
 }
 
 /*
- *  A <code>Hash</code> is a collection of key-value pairs. It is
- *  similar to an <code>Array</code>, except that indexing is done via
- *  arbitrary keys of any object type, not an integer index. Hashes enumerate
- *  their values in the order that the corresponding keys were inserted.
+ *  A Hash is a dictionary-like collection of unique keys and their values.
+ *  Also called associative arrays, they are similar to Arrays, but where an
+ *  Array uses integers as its index, a Hash allows you to use any object
+ *  type.
+ *
+ *  Hashes enumerate their values in the order that the corresponding keys
+ *  were inserted.
+ *
+ *  A Hash can be easily created by using its implicit form:
+ *
+ *    grades = { "Jane Doe" => 10, "Jim Doe" => 6 }
+ *
+ *  Hashes allow an alternate syntax form when your keys are always symbols.
+ *  Instead of
+ *
+ *    options = { :font_size => 10, :font_family => "Arial" }
+ *
+ *  You could write it as:
+ *
+ *    options = { font_size: 10, font_family: "Arial" }
+ *
+ *  Each named key is a symbol you can access in hash:
+ *
+ *    options[:font_size]  # => 10
+ *
+ *  A Hash can also be created through its ::new method:
+ *
+ *    grades = Hash.new
+ *    grades["Dorothy Doe"] = 9
  *
  *  Hashes have a <em>default value</em> that is returned when accessing
- *  keys that do not exist in the hash. By default, that value is
- *  <code>nil</code>.
+ *  keys that do not exist in the hash. If no default is set +nil+ is used.
+ *  You can set the default value by sending it as an argument to Hash.new:
+ *
+ *    grades = Hash.new(0)
+ *
+ *  Or by using the #default= method:
+ *
+ *    grades = {"Timmy Doe" => 8}
+ *    grades.default = 0
+ *
+ *  Accessing a value in a Hash requires using its key:
+ *
+ *    puts grades["Jane Doe"] # => 10
+ *
+ *  === Common Uses
+ *
+ *  Hashes are an easy way to represent data structures, such as
+ *
+ *    books         = {}
+ *    books[:matz]  = "The Ruby Language"
+ *    books[:black] = "The Well-Grounded Rubyist"
+ *
+ *  Hashes are also commonly used as a way to have named parameters in
+ *  functions. Note that no brackets are used below. If a hash is the last
+ *  argument on a method call, no braces are needed, thus creating a really
+ *  clean interface:
+ *
+ *    Person.create(name: "John Doe", age: 27)
+ *
+ *    def self.create(params)
+ *      @name = params[:name]
+ *      @age  = params[:age]
+ *    end
+ *
+ *  === Hash Keys
+ *
+ *  Two objects refer to the same hash key when their <code>hash</code> value
+ *  is identical and the two objects are <code>eql?</code> to each other.
+ *
+ *  A user-defined class may be used as a hash key if the <code>hash</code>
+ *  and <code>eql?</code> methods are overridden to provide meaningful
+ *  behavior.  By default, separate instances refer to separate hash keys.
+ *
+ *  A typical implementation of <code>hash</code> is based on the
+ *  object's data while <code>eql?</code> is usually aliased to the overridden
+ *  <code>==</code> method:
+ *
+ *    class Book
+ *      attr_reader :author, :title
+ *
+ *      def initialize(author, title)
+ *        @author = author
+ *        @title = title
+ *      end
+ *
+ *      def ==(other)
+ *        self.class === other and
+ *          other.author == @author and
+ *          other.title == @title
+ *      end
+ *
+ *      alias eql? ==
+ *
+ *      def hash
+ *        @author.hash ^ @title.hash # XOR
+ *      end
+ *    end
+ *
+ *    book1 = Book.new 'matz', 'Ruby in a Nutshell'
+ *    book2 = Book.new 'matz', 'Ruby in a Nutshell'
+ *
+ *    reviews = {}
+ *
+ *    reviews[book1] = 'Great reference!'
+ *    reviews[book2] = 'Nice and compact!'
+ *
+ *    reviews.length #=> 1
  *
+ *  See also Object#hash and Object#eql?
  */
 
 void
diff --git a/include/ruby/intern.h b/include/ruby/intern.h
index 927b536..9be68de 100644
--- a/include/ruby/intern.h
+++ b/include/ruby/intern.h
@@ -56,6 +56,7 @@ VALUE rb_ary_tmp_new(long);
 void rb_ary_free(VALUE);
 void rb_ary_modify(VALUE);
 VALUE rb_ary_freeze(VALUE);
+VALUE rb_ary_dup_of_p(VALUE, VALUE);
 VALUE rb_ary_aref(int, VALUE*, VALUE);
 VALUE rb_ary_subseq(VALUE, long, long);
 void rb_ary_store(VALUE, long, VALUE);
@@ -413,6 +414,7 @@ size_t ruby_stack_length(VALUE**);
 int rb_during_gc(void);
 void rb_gc_mark_locations(VALUE*, VALUE*);
 void rb_mark_tbl(struct st_table*);
+void rb_mark_sa_tbl(sa_table*);
 void rb_mark_set(struct st_table*);
 void rb_mark_hash(struct st_table*);
 void rb_gc_mark_maybe(VALUE);
@@ -440,6 +442,7 @@ VALUE rb_hash_lookup(VALUE, VALUE);
 VALUE rb_hash_lookup2(VALUE, VALUE, VALUE);
 VALUE rb_hash_fetch(VALUE, VALUE);
 VALUE rb_hash_aset(VALUE, VALUE, VALUE);
+VALUE rb_hash_clear(VALUE);
 VALUE rb_hash_delete_if(VALUE);
 VALUE rb_hash_delete(VALUE,VALUE);
 typedef VALUE rb_hash_update_func(VALUE newkey, VALUE oldkey, VALUE value);
@@ -843,7 +846,7 @@ VALUE rb_f_trace_var(int, VALUE*);
 VALUE rb_f_untrace_var(int, VALUE*);
 VALUE rb_f_global_variables(void);
 void rb_alias_variable(ID, ID);
-struct st_table* rb_generic_ivar_table(VALUE);
+sa_table* rb_generic_ivar_table(VALUE);
 void rb_copy_generic_ivar(VALUE,VALUE);
 void rb_mark_generic_ivar(VALUE);
 void rb_mark_generic_ivar_tbl(void);
diff --git a/include/ruby/ruby.h b/include/ruby/ruby.h
index 2f97b33..1c84e14 100644
--- a/include/ruby/ruby.h
+++ b/include/ruby/ruby.h
@@ -605,7 +605,7 @@ struct RObject {
 	struct {
 	    long numiv;
 	    VALUE *ivptr;
-            struct st_table *iv_index_tbl; /* shortcut for RCLASS_IV_INDEX_TBL(rb_obj_class(obj)) */
+            struct sa_table *iv_index_tbl; /* shortcut for RCLASS_IV_INDEX_TBL(rb_obj_class(obj)) */
 	} heap;
 	VALUE ary[ROBJECT_EMBED_LEN_MAX];
     } as;
@@ -626,12 +626,13 @@ struct RObject {
 
 /** @internal */
 typedef struct rb_classext_struct rb_classext_t;
+typedef struct rb_class_cache_struct rb_class_cache_t;
 
 struct RClass {
     struct RBasic basic;
+    VALUE super;
     rb_classext_t *ptr;
-    struct st_table *m_tbl;
-    struct st_table *iv_index_tbl;
+    rb_class_cache_t *cache;
 };
 #define RCLASS_SUPER(c) rb_class_get_superclass(c)
 #define RMODULE_IV_TBL(m) RCLASS_IV_TBL(m)
diff --git a/include/ruby/st.h b/include/ruby/st.h
index 50f2a75..aff94fc 100644
--- a/include/ruby/st.h
+++ b/include/ruby/st.h
@@ -36,7 +36,7 @@ typedef unsigned long st_data_t;
 #elif SIZEOF_LONG_LONG == SIZEOF_VOIDP
 typedef unsigned LONG_LONG st_data_t;
 #else
-# error ---->> st.c requires sizeof(void*) == sizeof(long) to be compiled. <<----
+# error ---->> st.c requires sizeof(void*) == sizeof(long) or sizeof(LONG_LONG) to be compiled. <<----
 #endif
 #define ST_DATA_T_DEFINED
 
@@ -74,6 +74,11 @@ struct st_hash_type {
 
 #define ST_INDEX_BITS (sizeof(st_index_t) * CHAR_BIT)
 
+typedef struct st_packed_entry {
+    st_index_t hash;
+    st_data_t key, val;
+} st_packed_entry;
+
 struct st_table {
     const struct st_hash_type *type;
     st_index_t num_bins;
@@ -91,8 +96,17 @@ struct st_table {
     __extension__
 #endif
     st_index_t num_entries : ST_INDEX_BITS - 1;
-    struct st_table_entry **bins;
-    struct st_table_entry *head, *tail;
+    union {
+	struct {
+	    struct st_table_entry **bins;
+	    struct st_table_entry *head, *tail;
+	} big;
+	struct {
+	    struct st_packed_entry *entries;
+	    st_index_t real_entries;
+	} packed;
+	st_packed_entry upacked;
+    } as;
 };
 
 #define st_is_member(table,key) st_lookup((table),(key),(st_data_t *)0)
@@ -114,6 +128,7 @@ int st_insert2(st_table *, st_data_t, st_data_t, st_data_t (*)(st_data_t));
 int st_lookup(st_table *, st_data_t, st_data_t *);
 int st_get_key(st_table *, st_data_t, st_data_t *);
 int st_foreach(st_table *, int (*)(ANYARGS), st_data_t);
+int st_foreach_check(st_table *, int (*)(ANYARGS), st_data_t, st_data_t);
 int st_reverse_foreach(st_table *, int (*)(ANYARGS), st_data_t);
 void st_add_direct(st_table *, st_data_t, st_data_t);
 void st_free_table(st_table *);
@@ -136,6 +151,51 @@ st_index_t st_hash_start(st_index_t h);
 #pragma GCC visibility pop
 #endif
 
+typedef unsigned int sa_index_t;
+#define SA_STOP     ST_STOP
+#define SA_CONTINUE ST_CONTINUE
+
+#define SA_EMPTY   0
+
+typedef struct sa_entry {
+    sa_index_t next;
+    sa_index_t key;
+    st_data_t value;
+} sa_entry;
+
+typedef struct sa_table {
+    sa_index_t num_bins;
+    sa_index_t num_entries;
+    sa_index_t free_pos;
+    sa_entry *entries;
+} sa_table;
+
+#define SA_EMPTY_TABLE {0, 0, 0, 0};
+void sa_init_table(sa_table *, sa_index_t);
+sa_table *sa_new_table();
+int  sa_insert(sa_table *, sa_index_t, st_data_t);
+int  sa_lookup(sa_table *, sa_index_t, st_data_t *);
+int  sa_delete(sa_table *, sa_index_t, st_data_t *);
+void sa_clear(sa_table *);
+void sa_clear_no_free(sa_table *);
+void sa_free_table(sa_table *);
+int  sa_foreach(sa_table *, int (*)(ANYARGS), st_data_t);
+size_t sa_memsize(const sa_table *);
+sa_table *sa_copy(sa_table*);
+void sa_copy_to(sa_table*, sa_table*);
+typedef int (*sa_iter_func)(sa_index_t key, st_data_t val, st_data_t arg);
+
+#define SA_FOREACH_START_I(table, entry) do { \
+    sa_table *T##entry = (table); \
+    sa_index_t K##entry; \
+    for(K##entry = 0; K##entry < T##entry->num_bins; K##entry++) { \
+	sa_entry *entry = T##entry->entries + K##entry; \
+	if (entry->next != SA_EMPTY) { \
+	    st_data_t value = entry->value
+#define SA_FOREACH_END() } } } while(0)
+
+#define SA_FOREACH_START(table) SA_FOREACH_START_I(table, entry)
+
 #if defined(__cplusplus)
 #if 0
 { /* satisfy cc-mode */
diff --git a/internal.h b/internal.h
index 59c9284..4af90b6 100644
--- a/internal.h
+++ b/internal.h
@@ -24,18 +24,24 @@ struct rb_deprecated_classext_struct {
 };
 
 struct rb_classext_struct {
-    VALUE super;
-    struct st_table *iv_tbl;
-    struct st_table *const_tbl;
+    sa_table m_tbl;
+    sa_table iv_tbl;
+    sa_table const_tbl;
+    sa_table iv_index_tbl;
+};
+
+struct rb_class_cache_struct {
+    VALUE method_cache_version;
+    sa_table m_cache_tbl;
 };
 
 #undef RCLASS_SUPER
 #define RCLASS_EXT(c) (RCLASS(c)->ptr)
-#define RCLASS_SUPER(c) (RCLASS_EXT(c)->super)
-#define RCLASS_IV_TBL(c) (RCLASS_EXT(c)->iv_tbl)
-#define RCLASS_CONST_TBL(c) (RCLASS_EXT(c)->const_tbl)
-#define RCLASS_M_TBL(c) (RCLASS(c)->m_tbl)
-#define RCLASS_IV_INDEX_TBL(c) (RCLASS(c)->iv_index_tbl)
+#define RCLASS_SUPER(c) (RCLASS(c)->super)
+#define RCLASS_IV_TBL(c) (&RCLASS_EXT(c)->iv_tbl)
+#define RCLASS_CONST_TBL(c) (&RCLASS_EXT(c)->const_tbl)
+#define RCLASS_M_TBL(c) (&RCLASS_EXT(c)->m_tbl)
+#define RCLASS_IV_INDEX_TBL(c) (&RCLASS_EXT(c)->iv_index_tbl)
 
 struct vtm; /* defined by timev.h */
 
@@ -94,6 +100,8 @@ VALUE rb_home_dir(const char *user, VALUE result);
 VALUE rb_realpath_internal(VALUE basedir, VALUE path, int strict);
 VALUE rb_file_expand_path_fast(VALUE, VALUE);
 VALUE rb_file_expand_path_internal(VALUE, VALUE, int, int, VALUE);
+VALUE rb_get_path_check_to_string(VALUE, int);
+VALUE rb_get_path_check_convert(VALUE, VALUE, int);
 void Init_File(void);
 
 #ifdef _WIN32
@@ -119,6 +127,7 @@ VALUE rb_iseq_clone(VALUE iseqval, VALUE newcbase);
 
 /* load.c */
 VALUE rb_get_load_path(void);
+VALUE rb_get_expanded_load_path(void);
 
 /* math.c */
 VALUE rb_math_atan2(VALUE, VALUE);
diff --git a/load.c b/load.c
index 163ec4c..68caebc 100644
--- a/load.c
+++ b/load.c
@@ -34,21 +34,120 @@ rb_get_load_path(void)
     return load_path;
 }
 
-VALUE
-rb_get_expanded_load_path(void)
+enum expand_type {
+    EXPAND_ALL,
+    EXPAND_RELATIVE,
+    EXPAND_HOME,
+    EXPAND_NON_CACHE
+};
+
+/* Construct expanded load path and store it to cache.
+   We rebuild load path partially if the cache is invalid.
+   We don't cache non string object and expand it every time. We ensure that
+   string objects in $LOAD_PATH are frozen.
+ */
+static void
+rb_construct_expanded_load_path(int type, int *has_relative, int *has_non_cache)
 {
-    VALUE load_path = rb_get_load_path();
+    rb_vm_t *vm = GET_VM();
+    VALUE load_path = vm->load_path;
+    VALUE expanded_load_path = vm->expanded_load_path;
     VALUE ary;
     long i;
+    int level = rb_safe_level();
 
     ary = rb_ary_new2(RARRAY_LEN(load_path));
     for (i = 0; i < RARRAY_LEN(load_path); ++i) {
-	VALUE path = rb_file_expand_path_fast(RARRAY_PTR(load_path)[i], Qnil);
-	rb_str_freeze(path);
-	rb_ary_push(ary, path);
+	VALUE path, as_str, expanded_path;
+	int is_string, non_cache;
+	char *as_cstr;
+	as_str = path = RARRAY_PTR(load_path)[i];
+	is_string = RB_TYPE_P(path, T_STRING) ? 1 : 0;
+	non_cache = !is_string ? 1 : 0;
+	as_str = rb_get_path_check_to_string(path, level);
+	as_cstr = RSTRING_PTR(as_str);
+
+	if (!non_cache) {
+	    if ((type == EXPAND_RELATIVE &&
+		    rb_is_absolute_path(as_cstr)) ||
+		(type == EXPAND_HOME &&
+		    (!as_cstr[0] || as_cstr[0] != '~')) ||
+		(type == EXPAND_NON_CACHE)) {
+		    /* Use cached expanded path. */
+		    rb_ary_push(ary, RARRAY_PTR(expanded_load_path)[i]);
+		    continue;
+	    }
+	}
+	if (!*has_relative && !rb_is_absolute_path(as_cstr))
+	    *has_relative = 1;
+	if (!*has_non_cache && non_cache)
+	    *has_non_cache = 1;
+	/* Freeze only string object. We expand other objects every time. */
+	if (is_string)
+	    rb_str_freeze(path);
+	as_str = rb_get_path_check_convert(path, as_str, level);
+	expanded_path = rb_file_expand_path_fast(as_str, Qnil);
+	rb_str_freeze(expanded_path);
+	rb_ary_push(ary, expanded_path);
     }
     rb_obj_freeze(ary);
-    return ary;
+    vm->expanded_load_path = ary;
+    rb_ary_replace(vm->load_path_snapshot, vm->load_path);
+}
+
+static VALUE
+load_path_getcwd(void)
+{
+    char *cwd = my_getcwd();
+    VALUE cwd_str = rb_filesystem_str_new_cstr(cwd);
+    xfree(cwd);
+    return cwd_str;
+}
+
+VALUE
+rb_get_expanded_load_path(void)
+{
+    rb_vm_t *vm = GET_VM();
+    const VALUE non_cache = Qtrue;
+
+    if (!rb_ary_dup_of_p(vm->load_path_snapshot, vm->load_path)) {
+	/* The load path was modified. Rebuild the expanded load path. */
+	int has_relative = 0, has_non_cache = 0;
+	rb_construct_expanded_load_path(EXPAND_ALL, &has_relative, &has_non_cache);
+	if (has_relative) {
+	    vm->load_path_check_cache = load_path_getcwd();
+	}
+	else if (has_non_cache) {
+	    /* Non string object. */
+	    vm->load_path_check_cache = non_cache;
+	}
+	else {
+	    vm->load_path_check_cache = 0;
+	}
+    }
+    else if (vm->load_path_check_cache == non_cache) {
+	int has_relative = 1, has_non_cache = 1;
+	/* Expand only non-cacheable objects. */
+	rb_construct_expanded_load_path(EXPAND_NON_CACHE,
+					&has_relative, &has_non_cache);
+    }
+    else if (vm->load_path_check_cache) {
+	int has_relative = 1, has_non_cache = 1;
+	VALUE cwd = load_path_getcwd();
+	if (!rb_str_equal(vm->load_path_check_cache, cwd)) {
+	    /* Current working directory or filesystem encoding was changed.
+	       Expand relative load path and non-cacheable objects again. */
+	    vm->load_path_check_cache = cwd;
+	    rb_construct_expanded_load_path(EXPAND_RELATIVE,
+					    &has_relative, &has_non_cache);
+	}
+	else {
+	    /* Expand only tilde (User HOME) and non-cacheable objects. */
+	    rb_construct_expanded_load_path(EXPAND_HOME,
+					    &has_relative, &has_non_cache);
+	}
+    }
+    return vm->expanded_load_path;
 }
 
 static VALUE
@@ -63,12 +162,121 @@ get_loaded_features(void)
     return GET_VM()->loaded_features;
 }
 
+static void
+reset_loaded_features_snapshot(void)
+{
+    rb_vm_t *vm = GET_VM();
+    rb_ary_replace(vm->loaded_features_snapshot, vm->loaded_features);
+}
+
+static VALUE
+get_loaded_features_index_raw(void)
+{
+    return GET_VM()->loaded_features_index;
+}
+
 static st_table *
 get_loading_table(void)
 {
     return GET_VM()->loading_table;
 }
 
+static void
+features_index_add_single(VALUE short_feature, VALUE offset)
+{
+    VALUE features_index, this_feature_index;
+    features_index = get_loaded_features_index_raw();
+    if ((this_feature_index = rb_hash_lookup(features_index, short_feature)) == Qnil) {
+	this_feature_index = rb_ary_new();
+	rb_hash_aset(features_index, short_feature, this_feature_index);
+    }
+    rb_ary_push(this_feature_index, offset);
+}
+
+/* Add to the loaded-features index all the required entries for
+   `feature`, located at `offset` in $LOADED_FEATURES.  We add an
+   index entry at each string `short_feature` for which
+     feature == "#{prefix}#{short_feature}#{e}"
+   where `e` is empty or matches %r{^\.[^./]*$}, and `prefix` is empty
+   or ends in '/'.  This maintains the invariant that `rb_feature_p()`
+   relies on for its fast lookup.
+*/
+static void
+features_index_add(VALUE feature, VALUE offset)
+{
+    VALUE short_feature;
+    const char *feature_str, *feature_end, *ext, *p;
+
+    feature_str = StringValuePtr(feature);
+    feature_end = feature_str + RSTRING_LEN(feature);
+
+    for (ext = feature_end; ext > feature_str; ext--)
+      if (*ext == '.' || *ext == '/')
+	break;
+    if (*ext != '.')
+      ext = NULL;
+    /* Now `ext` points to the only string matching %r{^\.[^./]*$} that is
+       at the end of `feature`, or is NULL if there is no such string. */
+
+    p = ext ? ext : feature_end;
+    while (1) {
+	p--;
+	while (p >= feature_str && *p != '/')
+	    p--;
+	if (p < feature_str)
+	    break;
+	/* Now *p == '/'.  We reach this point for every '/' in `feature`. */
+	short_feature = rb_str_substr(feature, p + 1 - feature_str, feature_end - p - 1);
+	features_index_add_single(short_feature, offset);
+	if (ext) {
+	    short_feature = rb_str_substr(feature, p + 1 - feature_str, ext - p - 1);
+	    features_index_add_single(short_feature, offset);
+	}
+    }
+    features_index_add_single(feature, offset);
+    if (ext) {
+	short_feature = rb_str_substr(feature, 0, ext - feature_str);
+	features_index_add_single(short_feature, offset);
+    }
+}
+
+static VALUE
+get_loaded_features_index(void)
+{
+    VALUE features;
+    int i;
+    rb_vm_t *vm = GET_VM();
+
+    if (!rb_ary_dup_of_p(vm->loaded_features_snapshot, vm->loaded_features)) {
+	/* The sharing was broken; something (other than us in rb_provide_feature())
+	   modified loaded_features.  Rebuild the index. */
+	rb_hash_clear(vm->loaded_features_index);
+	features = vm->loaded_features;
+	for (i = 0; i < RARRAY_LEN(features); i++) {
+	    VALUE entry, as_str;
+	    as_str = entry = rb_ary_entry(features, i);
+	    StringValue(as_str);
+	    if (as_str != entry)
+		rb_ary_store(features, i, as_str);
+	    rb_str_freeze(as_str);
+	    features_index_add(as_str, INT2FIX(i));
+	}
+	reset_loaded_features_snapshot();
+    }
+    return vm->loaded_features_index;
+}
+
+/* This searches `load_path` for a value such that
+     name == "#{load_path[i]}/#{feature}"
+   if `feature` is a suffix of `name`, or otherwise
+     name == "#{load_path[i]}/#{feature}#{ext}"
+   for an acceptable string `ext`.  It returns
+   `load_path[i].to_str` if found, else 0.
+
+   If type is 's', then `ext` is acceptable only if IS_DLEXT(ext);
+   if 'r', then only if IS_RBEXT(ext); otherwise `ext` may be absent
+   or have any value matching `%r{^\.[^./]*$}`.
+*/
 static VALUE
 loaded_feature_path(const char *name, long vlen, const char *feature, long len,
 		    int type, VALUE load_path)
@@ -88,23 +296,22 @@ loaded_feature_path(const char *name, long vlen, const char *feature, long len,
 	    return 0;
 	plen = e - name - len - 1;
     }
+    if (type == 's' && !IS_DLEXT(&name[plen+len+1])
+     || type == 'r' && !IS_RBEXT(&name[plen+len+1])
+     || name[plen] != '/') {
+       return 0;
+    }
+    /* Now name == "#{prefix}/#{feature}#{ext}" where ext is acceptable
+       (possibly empty) and prefix is some string of length plen. */
+
     for (i = 0; i < RARRAY_LEN(load_path); ++i) {
 	VALUE p = RARRAY_PTR(load_path)[i];
 	const char *s = StringValuePtr(p);
 	long n = RSTRING_LEN(p);
 
-	if (n != plen ) continue;
-	if (n && (strncmp(name, s, n) || name[n] != '/')) continue;
-	switch (type) {
-	  case 's':
-	    if (IS_DLEXT(&name[n+len+1])) return p;
-	    break;
-	  case 'r':
-	    if (IS_RBEXT(&name[n+len+1])) return p;
-	    break;
-	  default:
-	    return p;
-	}
+	if (n != plen) continue;
+	if (n && strncmp(name, s, n)) continue;
+	return p;
     }
     return 0;
 }
@@ -132,7 +339,7 @@ loaded_feature_path_i(st_data_t v, st_data_t b, st_data_t f)
 static int
 rb_feature_p(const char *feature, const char *ext, int rb, int expanded, const char **fn)
 {
-    VALUE v, features, p, load_path = 0;
+    VALUE features, features_index, feature_val, this_feature_index, v, p, load_path = 0;
     const char *f, *e;
     long i, len, elen, n;
     st_table *loading_tbl;
@@ -151,8 +358,39 @@ rb_feature_p(const char *feature, const char *ext, int rb, int expanded, const c
 	type = 0;
     }
     features = get_loaded_features();
-    for (i = 0; i < RARRAY_LEN(features); ++i) {
-	v = RARRAY_PTR(features)[i];
+    features_index = get_loaded_features_index();
+
+    feature_val = rb_str_new(feature, len);
+    this_feature_index = rb_hash_lookup(features_index, feature_val);
+    /* We search `features` for an entry such that either
+         "#{features[i]}" == "#{load_path[j]}/#{feature}#{e}"
+       for some j, or
+         "#{features[i]}" == "#{feature}#{e}"
+       Here `e` is an "allowed" extension -- either empty or one
+       of the extensions accepted by IS_RBEXT, IS_SOEXT, or
+       IS_DLEXT.  Further, if `ext && rb` then `IS_RBEXT(e)`,
+       and if `ext && !rb` then `IS_SOEXT(e) || IS_DLEXT(e)`.
+
+       If `expanded`, then only the latter form (without load_path[j])
+       is accepted.  Otherwise either form is accepted, *unless* `ext`
+       is false and an otherwise-matching entry of the first form is
+       preceded by an entry of the form
+         "#{features[i2]}" == "#{load_path[j2]}/#{feature}#{e2}"
+       where `e2` matches %r{^\.[^./]*$} but is not an allowed extension.
+       After a "distractor" entry of this form, only entries of the
+       form "#{feature}#{e}" are accepted.
+
+       In `rb_provide_feature()` and `get_loaded_features_index()` we
+       maintain an invariant that the array `this_feature_index` will
+       point to every entry in `features` which has the form
+         "#{prefix}#{feature}#{e}"
+       where `e` is empty or matches %r{^\.[^./]*$}, and `prefix` is empty
+       or ends in '/'.  This includes both match forms above, as well
+       as any distractors, so we may ignore all other entries in `features`.
+     */
+    for (i = 0; this_feature_index != Qnil && i < RARRAY_LEN(this_feature_index); i++) {
+	long index = FIX2LONG(rb_ary_entry(this_feature_index, i));
+	v = RARRAY_PTR(features)[index];
 	f = StringValuePtr(v);
 	if ((n = RSTRING_LEN(v)) < len) continue;
 	if (strncmp(f, feature, len) != 0) {
@@ -175,6 +413,7 @@ rb_feature_p(const char *feature, const char *ext, int rb, int expanded, const c
 	    return 'r';
 	}
     }
+
     loading_tbl = get_loading_table();
     if (loading_tbl) {
 	f = 0;
@@ -183,7 +422,7 @@ rb_feature_p(const char *feature, const char *ext, int rb, int expanded, const c
 	    fs.name = feature;
 	    fs.len = len;
 	    fs.type = type;
-	    fs.load_path = load_path ? load_path : rb_get_load_path();
+	    fs.load_path = load_path ? load_path : rb_get_expanded_load_path();
 	    fs.result = 0;
 	    st_foreach(loading_tbl, loaded_feature_path_i, (st_data_t)&fs);
 	    if ((f = fs.result) != 0) {
@@ -233,7 +472,7 @@ rb_feature_provided(const char *feature, const char **loading)
 
     if (*feature == '.' &&
 	(feature[1] == '/' || strncmp(feature+1, "./", 2) == 0)) {
-	fullpath = rb_file_expand_path_fast(rb_str_new2(feature), Qnil);
+	fullpath = rb_file_expand_path_fast(rb_get_path(rb_str_new2(feature)), Qnil);
 	feature = RSTRING_PTR(fullpath);
     }
     if (ext && !strchr(ext, '/')) {
@@ -254,11 +493,18 @@ rb_feature_provided(const char *feature, const char **loading)
 static void
 rb_provide_feature(VALUE feature)
 {
-    if (OBJ_FROZEN(get_loaded_features())) {
+    VALUE features;
+
+    features = get_loaded_features();
+    if (OBJ_FROZEN(features)) {
 	rb_raise(rb_eRuntimeError,
 		 "$LOADED_FEATURES is frozen; cannot append feature");
     }
-    rb_ary_push(get_loaded_features(), feature);
+    rb_str_freeze(feature);
+
+    rb_ary_push(features, feature);
+    features_index_add(feature, INT2FIX(RARRAY_LEN(features)-1));
+    reset_loaded_features_snapshot();
 }
 
 void
@@ -774,10 +1020,15 @@ Init_load()
     rb_alias_variable(rb_intern("$-I"), id_load_path);
     rb_alias_variable(rb_intern("$LOAD_PATH"), id_load_path);
     vm->load_path = rb_ary_new();
+    vm->expanded_load_path = rb_ary_new();
+    vm->load_path_snapshot = rb_ary_new();
+    vm->load_path_check_cache = 0;
 
     rb_define_virtual_variable("$\"", get_loaded_features, 0);
     rb_define_virtual_variable("$LOADED_FEATURES", get_loaded_features, 0);
     vm->loaded_features = rb_ary_new();
+    vm->loaded_features_snapshot = rb_ary_new();
+    vm->loaded_features_index = rb_hash_new();
 
     rb_define_global_function("load", rb_f_load, -1);
     rb_define_global_function("require", rb_f_require, 1);
diff --git a/marshal.c b/marshal.c
index 9a43cdb..a4a3551 100644
--- a/marshal.c
+++ b/marshal.c
@@ -506,7 +506,7 @@ w_uclass(VALUE obj, VALUE super, struct dump_arg *arg)
 }
 
 static int
-w_obj_each(ID id, VALUE value, struct dump_call_arg *arg)
+w_obj_each(sa_index_t id, VALUE value, struct dump_call_arg *arg)
 {
     if (id == rb_id_encoding()) return ST_CONTINUE;
     if (id == rb_intern("E")) return ST_CONTINUE;
@@ -553,13 +553,13 @@ w_encoding(VALUE obj, long num, struct dump_call_arg *arg)
 }
 
 static void
-w_ivar(VALUE obj, st_table *tbl, struct dump_call_arg *arg)
+w_ivar(VALUE obj, sa_table *tbl, struct dump_call_arg *arg)
 {
     long num = tbl ? tbl->num_entries : 0;
 
     w_encoding(obj, num, arg);
     if (tbl) {
-	st_foreach_safe(tbl, w_obj_each, (st_data_t)arg);
+	sa_foreach(tbl, w_obj_each, (st_data_t)arg);
     }
 }
 
@@ -586,7 +586,7 @@ static void
 w_object(VALUE obj, struct dump_arg *arg, int limit)
 {
     struct dump_call_arg c_arg;
-    st_table *ivtbl = 0;
+    sa_table *ivtbl = 0;
     st_data_t num;
     int hasiv = 0;
 #define has_ivars(obj, ivtbl) (((ivtbl) = rb_generic_ivar_table(obj)) != 0 || \
@@ -651,7 +651,7 @@ w_object(VALUE obj, struct dump_arg *arg, int limit)
 	}
 	if (rb_respond_to(obj, s_dump)) {
 	    VALUE v;
-            st_table *ivtbl2 = 0;
+            sa_table *ivtbl2 = 0;
             int hasiv2;
 
 	    v = rb_funcall(obj, s_dump, 1, INT2NUM(limit));
diff --git a/method.h b/method.h
index 9229896..2fecd57 100644
--- a/method.h
+++ b/method.h
@@ -100,6 +100,6 @@ int rb_method_entry_eq(const rb_method_entry_t *m1, const rb_method_entry_t *m2)
 void rb_mark_method_entry(const rb_method_entry_t *me);
 void rb_free_method_entry(rb_method_entry_t *me);
 void rb_sweep_method_entry(void *vm);
-void rb_free_m_table(st_table *tbl);
+void rb_free_m_table(sa_table *tbl);
 
 #endif /* METHOD_H */
diff --git a/object.c b/object.c
index f45e013..1352d01 100644
--- a/object.c
+++ b/object.c
@@ -229,17 +229,8 @@ init_copy(VALUE dest, VALUE obj)
         break;
       case T_CLASS:
       case T_MODULE:
-	if (RCLASS_IV_TBL(dest)) {
-	    st_free_table(RCLASS_IV_TBL(dest));
-	    RCLASS_IV_TBL(dest) = 0;
-	}
-	if (RCLASS_CONST_TBL(dest)) {
-	    rb_free_const_table(RCLASS_CONST_TBL(dest));
-	    RCLASS_CONST_TBL(dest) = 0;
-	}
-	if (RCLASS_IV_TBL(obj)) {
-	    RCLASS_IV_TBL(dest) = st_copy(RCLASS_IV_TBL(obj));
-	}
+        rb_free_const_table(RCLASS_CONST_TBL(dest));
+        sa_copy_to(RCLASS_IV_TBL(obj), RCLASS_IV_TBL(dest));
         break;
     }
 }
@@ -530,7 +521,7 @@ rb_obj_is_kind_of(VALUE obj, VALUE c)
     }
 
     while (cl) {
-	if (cl == c || RCLASS_M_TBL(cl) == RCLASS_M_TBL(c))
+	if (cl == c || RCLASS_EXT(cl) == RCLASS_EXT(c))
 	    return Qtrue;
 	cl = RCLASS_SUPER(cl);
     }
@@ -1355,13 +1346,13 @@ rb_class_inherited_p(VALUE mod, VALUE arg)
 	rb_raise(rb_eTypeError, "compared with non class/module");
     }
     while (mod) {
-	if (RCLASS_M_TBL(mod) == RCLASS_M_TBL(arg))
+	if (RCLASS_EXT(mod) == RCLASS_EXT(arg))
 	    return Qtrue;
 	mod = RCLASS_SUPER(mod);
     }
     /* not mod < arg; check if mod > arg */
     while (arg) {
-	if (RCLASS_M_TBL(arg) == RCLASS_M_TBL(start))
+	if (RCLASS_EXT(arg) == RCLASS_EXT(start))
 	    return Qfalse;
 	arg = RCLASS_SUPER(arg);
     }
diff --git a/pool_alloc.h b/pool_alloc.h
new file mode 100644
index 0000000..957708e
--- /dev/null
+++ b/pool_alloc.h
@@ -0,0 +1,11 @@
+#ifndef POOL_ALLOC_H
+#define POOL_ALLOC_H
+
+#define POOL_ALLOC_API
+#ifdef POOL_ALLOC_API
+void  ruby_xpool_free(void *ptr);
+void *ruby_xpool_malloc_6p();
+void *ruby_xpool_malloc_11p();
+#endif
+
+#endif
diff --git a/pool_alloc.inc.h b/pool_alloc.inc.h
new file mode 100644
index 0000000..a7879ab
--- /dev/null
+++ b/pool_alloc.inc.h
@@ -0,0 +1,156 @@
+/*
+ * this is generic pool allocator
+ * you should define following macroses:
+ * ITEM_NAME - unique identifier, which allows to hold functions in a namespace
+ * ITEM_TYPEDEF(name) - passed to typedef to localize item type
+ * free_entry - desired name of function for free entry
+ * alloc_entry - defired name of function for allocate entry
+ */
+
+#if POOL_ALLOC_PART == 1
+#ifdef HEAP_ALIGN_LOG
+#define DEFAULT_POOL_SIZE (1 << HEAP_ALIGN_LOG)
+#else
+#define DEFAULT_POOL_SIZE (sizeof(void*) * 2048)
+#endif
+typedef unsigned int pool_holder_counter;
+
+typedef struct pool_entry_list pool_entry_list;
+typedef struct pool_holder pool_holder;
+
+typedef struct pool_header {
+    pool_holder         *first;
+    pool_holder         *_black_magick;
+    pool_holder_counter  size; // size of entry in sizeof(void*) items
+    pool_holder_counter  total; // size of entry in sizeof(void*) items
+} pool_header;
+
+struct pool_holder {
+    pool_holder_counter free, total;
+    pool_header  *header;
+    void               *freep;
+    pool_holder        *fore, *back;
+    void *data[1];
+};
+#define POOL_DATA_SIZE(pool_size) (((pool_size) - sizeof(void*) * 6 - offsetof(pool_holder, data)) / sizeof(void*))
+#define POOL_ENTRY_SIZE(item_type) ((sizeof(item_type) - 1) / sizeof(void*) + 1)
+#define POOL_HOLDER_COUNT(pool_size, item_type) (POOL_DATA_SIZE(pool_size)/POOL_ENTRY_SIZE(item_type))
+#define INIT_POOL(item_type) {NULL, NULL, POOL_ENTRY_SIZE(item_type), POOL_HOLDER_COUNT(DEFAULT_POOL_SIZE, item_type)}
+
+#elif POOL_ALLOC_PART == 2
+static pool_holder *
+pool_holder_alloc(pool_header *header)
+{
+    pool_holder *holder;
+    pool_holder_counter i, size, count;
+    register void **ptr;
+
+    size_t sz = offsetof(pool_holder, data) +
+	    header->size * header->total * sizeof(void*);
+#define objspace (&rb_objspace)
+    vm_malloc_prepare(objspace, DEFAULT_POOL_SIZE);
+    if (header->first != NULL) return header->first;
+    TRY_WITH_GC(holder = (pool_holder*) aligned_malloc(DEFAULT_POOL_SIZE, sz));
+    malloc_increase += DEFAULT_POOL_SIZE;
+#if CALC_EXACT_MALLOC_SIZE
+    objspace->malloc_params.allocated_size += DEFAULT_POOL_SIZE;
+    objspace->malloc_params.allocations++;
+#endif
+#undef objspace
+
+    size = header->size;
+    count = header->total;
+    holder->free = count;
+    holder->total = count;
+    holder->header = header;
+    holder->fore = NULL;
+    holder->back = NULL;
+    holder->freep = &holder->data;
+    ptr = holder->data;
+    for(i = count - 1; i; i-- ) {
+	ptr = *ptr = ptr + size;
+    }
+    *ptr = NULL;
+    header->first = holder;
+    return holder;
+}
+
+static inline void
+pool_holder_unchaing(pool_header *header, pool_holder *holder)
+{
+    register pool_holder *fore = holder->fore, *back = holder->back;
+    holder->fore = NULL;
+    holder->back = NULL;
+    if (fore != NULL)  fore->back     = back;
+    else               header->_black_magick = back;
+    if (back != NULL)  back->fore     = fore;
+    else               header->first = fore;
+}
+
+static inline pool_holder *
+entry_holder(void **entry)
+{
+    return (pool_holder*)(((uintptr_t)entry) & ~(DEFAULT_POOL_SIZE - 1));
+}
+
+static inline void
+pool_free_entry(void **entry)
+{
+    pool_holder *holder = entry_holder(entry);
+    pool_header *header = holder->header;
+
+    if (holder->free++ == 0) {
+	register pool_holder *first = header->first;
+	if (first == NULL) {
+	    header->first = holder;
+	} else {
+	    holder->back = first;
+	    holder->fore = first->fore;
+	    first->fore = holder;
+	    if (holder->fore)
+		holder->fore->back = holder;
+	    else
+		header->_black_magick = holder;
+	}
+    } else if (holder->free == holder->total && header->first != holder ) {
+	pool_holder_unchaing(header, holder);
+	aligned_free(holder);
+#if CALC_EXACT_MALLOC_SIZE
+	rb_objspace.malloc_params.allocated_size -= DEFAULT_POOL_SIZE;
+	rb_objspace.malloc_params.allocations--;
+#endif
+	return;
+    }
+
+    *entry = holder->freep;
+    holder->freep = entry;
+}
+
+static inline void*
+pool_alloc_entry(pool_header *header)
+{
+    pool_holder *holder = header->first;
+    void **result;
+    if (holder == NULL) {
+	holder = pool_holder_alloc(header);
+    }
+
+    result = holder->freep;
+    holder->freep = *result;
+
+    if (--holder->free == 0) {
+	pool_holder_unchaing(header, holder);
+    }
+
+    return result;
+}
+
+static void
+pool_finalize_header(pool_header *header)
+{
+    if (header->first) {
+        aligned_free(header->first);
+        header->first = NULL;
+    }
+}
+#endif
diff --git a/ruby.c b/ruby.c
index 3ddd96c..7ffc78e 100644
--- a/ruby.c
+++ b/ruby.c
@@ -1366,7 +1366,8 @@ process_options(int argc, char **argv, struct cmdline_options *opt)
 	long i;
 	VALUE load_path = GET_VM()->load_path;
 	for (i = 0; i < RARRAY_LEN(load_path); ++i) {
-	    rb_enc_associate(RARRAY_PTR(load_path)[i], lenc);
+	    RARRAY_PTR(load_path)[i] =
+		rb_enc_associate(rb_str_dup(RARRAY_PTR(load_path)[i]), lenc);
 	}
     }
     if (!(opt->disable & DISABLE_BIT(gems))) {
diff --git a/sp_ar.c b/sp_ar.c
new file mode 100644
index 0000000..2ed69bf
--- /dev/null
+++ b/sp_ar.c
@@ -0,0 +1,374 @@
+/*
+ * sparse array lib
+ * inspired by Lua table
+ * written by Sokolov Yura aka funny_falcon
+ */
+#ifdef NOT_RUBY
+#include "regint.h"
+#include "st.h"
+#else
+#include "ruby/ruby.h"
+#endif
+
+#include <stdio.h>
+#ifdef HAVE_STDLIB_H
+#include <stdlib.h>
+#endif
+#include <string.h>
+
+#ifdef RUBY
+#define malloc xmalloc
+#define calloc xcalloc
+#define realloc xrealloc
+#define free   xfree
+#endif
+
+#define sa_table_alloc()          (sa_table*)malloc(sizeof(sa_table))
+#define sa_table_xalloc()         (sa_table*)calloc(1, sizeof(sa_table))
+#define sa_table_dealloc(table)   free(table)
+#define sa_entry_alloc(n)         (sa_entry*)calloc((n), sizeof(sa_entry))
+#define sa_entry_dealloc(entries) free(entries)
+
+#define SA_LAST   1
+#define SA_OFFSET 2
+
+#define SA_MIN_SIZE 4
+
+void
+sa_init_table(register sa_table *table, sa_index_t num_bins)
+{
+    if (num_bins) {
+        table->num_entries = 0;
+        table->entries = sa_entry_alloc(num_bins);
+        table->num_bins = num_bins;
+        table->free_pos = num_bins;
+    }
+    else {
+        memset(table, 0, sizeof(sa_table));
+    }
+}
+
+sa_table*
+sa_new_table()
+{
+    sa_table* table = sa_table_alloc();
+    sa_init_table(table, 0);
+    return table;
+}
+
+static inline sa_index_t
+calc_pos(register sa_table* table, sa_index_t key)
+{
+    /* this formula is empirical */
+    /* it has no good avalance, but works well in our case */
+    key ^= key >> 16;
+    key *= 0x445229;
+    return (key + (key >> 16)) % table->num_bins;
+}
+
+static void
+fix_empty(register sa_table* table)
+{
+    while(--table->free_pos &&
+            table->entries[table->free_pos-1].next != SA_EMPTY);
+}
+
+#define FLOOR_TO_4 ((~((sa_index_t)0)) << 2)
+static sa_index_t
+find_empty(register sa_table* table, register sa_index_t pos)
+{
+    sa_index_t new_pos = table->free_pos-1;
+    sa_entry *entry;
+    pos &= FLOOR_TO_4;
+    entry = table->entries+pos;
+
+    if (entry->next == SA_EMPTY) { new_pos = pos; goto check; }
+    pos++; entry++;
+    if (entry->next == SA_EMPTY) { new_pos = pos; goto check; }
+    pos++; entry++;
+    if (entry->next == SA_EMPTY) { new_pos = pos; goto check; }
+    pos++; entry++;
+    if (entry->next == SA_EMPTY) { new_pos = pos; goto check; }
+
+check:
+    if (new_pos+1 == table->free_pos) fix_empty(table);
+    return new_pos;
+}
+
+static void resize(register sa_table* table);
+static int insert_into_chain(register sa_table*, register sa_index_t, st_data_t, sa_index_t pos);
+static int insert_into_main(register sa_table*, sa_index_t, st_data_t, sa_index_t pos, sa_index_t prev_pos);
+
+int
+sa_insert(register sa_table* table, register sa_index_t key, st_data_t value)
+{
+    sa_index_t pos, main_pos;
+    register sa_entry *entry;
+
+    if (table->num_bins == 0) {
+        sa_init_table(table, SA_MIN_SIZE);
+    }
+
+    pos = calc_pos(table, key);
+    entry = table->entries + pos;
+
+    if (entry->next == SA_EMPTY) {
+        entry->next = SA_LAST;
+        entry->key = key;
+        entry->value = value;
+        table->num_entries++;
+        if (pos+1 == table->free_pos) fix_empty(table);
+        return 0;
+    }
+
+    if (entry->key == key) {
+        entry->value = value;
+        return 1;
+    }
+
+    if (table->num_entries + (table->num_entries >> 2) > table->num_bins) {
+        resize(table);
+        return sa_insert(table, key, value);
+    }
+
+    main_pos = calc_pos(table, entry->key);
+    if (main_pos == pos) {
+        return insert_into_chain(table, key, value, pos);
+    }
+    else {
+        if (!table->free_pos) {
+            resize(table);
+            return sa_insert(table, key, value);
+        }
+        return insert_into_main(table, key, value, pos, main_pos);
+    }
+}
+
+static int
+insert_into_chain(register sa_table* table, register sa_index_t key, st_data_t value, sa_index_t pos)
+{
+    sa_entry *entry = table->entries + pos, *new_entry;
+    sa_index_t new_pos;
+
+    while (entry->next != SA_LAST) {
+        pos = entry->next - SA_OFFSET;
+        entry = table->entries + pos;
+        if (entry->key == key) {
+            entry->value = value;
+            return 1;
+        }
+    }
+
+    if (!table->free_pos) {
+        resize(table);
+        return sa_insert(table, key, value);
+    }
+
+    new_pos = find_empty(table, pos);
+    new_entry = table->entries + new_pos;
+    entry->next = new_pos + SA_OFFSET;
+
+    new_entry->next = SA_LAST;
+    new_entry->key = key;
+    new_entry->value = value;
+    table->num_entries++;
+    return 0;
+}
+
+static int
+insert_into_main(register sa_table* table, sa_index_t key, st_data_t value, sa_index_t pos, sa_index_t prev_pos)
+{
+    sa_entry *entry = table->entries + pos;
+    sa_index_t new_pos = find_empty(table, pos);
+    sa_entry *new_entry = table->entries + new_pos;
+    sa_index_t npos;
+
+    *new_entry = *entry;
+
+    while((npos = table->entries[prev_pos].next - SA_OFFSET) != pos) {
+        prev_pos = npos;
+    }
+    table->entries[prev_pos].next = new_pos + SA_OFFSET;
+
+    entry->next = SA_LAST;
+    entry->key = key;
+    entry->value = value;
+    table->num_entries++;
+    return 0;
+}
+
+static sa_index_t
+new_size(sa_index_t num_entries)
+{
+    sa_index_t msb = num_entries;
+    msb |= msb >> 1;
+    msb |= msb >> 2;
+    msb |= msb >> 4;
+    msb |= msb >> 8;
+    msb |= msb >> 16;
+    msb = ((msb >> 4) + 1) << 3;
+    return (num_entries & (msb | (msb >> 1))) + (msb >> 1);
+}
+
+static void
+resize(register sa_table *table)
+{
+    sa_table tmp_table;
+    sa_entry *entry;
+    sa_index_t i;
+
+    if (table->num_entries == 0) {
+        sa_entry_dealloc(table->entries);
+        memset(table, 0, sizeof(sa_table));
+        return;
+    }
+
+    sa_init_table(&tmp_table, new_size(table->num_entries + (table->num_entries >> 2)));
+    entry = table->entries;
+
+    for(i = 0; i < table->num_bins; i++, entry++) {
+        if (entry->next != SA_EMPTY) {
+            sa_insert(&tmp_table, entry->key, entry->value);
+        }
+    }
+    sa_entry_dealloc(table->entries);
+    *table = tmp_table;
+}
+
+int
+sa_lookup(register sa_table *table, register sa_index_t key, st_data_t *value)
+{
+    register sa_entry *entry;
+
+    if (table->num_entries == 0) return 0;
+
+    entry = table->entries + calc_pos(table, key);
+    if (entry->next == SA_EMPTY) return 0;
+
+    if (entry->key == key) goto found;
+    if (entry->next == SA_LAST) return 0;
+
+    entry = table->entries + (entry->next - SA_OFFSET);
+    if (entry->key == key) goto found;
+
+    while(entry->next != SA_LAST) {
+        entry = table->entries + (entry->next - SA_OFFSET);
+        if (entry->key == key) goto found;
+    }
+    return 0;
+found:
+    if (value) *value = entry->value;
+    return 1;
+}
+
+void
+sa_clear(sa_table *table)
+{
+    sa_entry_dealloc(table->entries);
+    memset(table, 0, sizeof(sa_table));
+}
+
+void
+sa_clear_no_free(sa_table *table)
+{
+    memset(table->entries, 0, sizeof(sa_entry) * table->num_bins);
+    table->num_entries = 0;
+    table->free_pos = table->num_bins;
+}
+
+void
+sa_free_table(sa_table *table)
+{
+    sa_entry_dealloc(table->entries);
+    sa_table_dealloc(table);
+}
+
+int
+sa_delete(sa_table *table, sa_index_t key, st_data_t *value)
+{
+    sa_index_t pos, prev_pos = ~0;
+    sa_entry *entry;
+
+    if (table->num_entries == 0) goto not_found;
+
+    pos = calc_pos(table, key);
+    entry = table->entries + pos;
+
+    if (entry->next == SA_EMPTY) goto not_found;
+
+    do {
+        if (entry->key == key) {
+            if (value) *value = entry->value;
+            if (entry->next != SA_LAST) {
+                sa_index_t npos = entry->next - SA_OFFSET;
+                *entry = table->entries[npos];
+                memset(table->entries + npos, 0, sizeof(sa_entry));
+            }
+            else {
+                memset(table->entries + pos, 0, sizeof(sa_entry));
+                if (~prev_pos) {
+                    table->entries[prev_pos].next = SA_LAST;
+                }
+            }
+            table->num_entries--;
+            if (table->num_entries < table->num_bins / 4) {
+                resize(table);
+            }
+            return 1;
+        }
+        if (entry->next == SA_LAST) break;
+        prev_pos = pos;
+        pos = entry->next - SA_OFFSET;
+        entry = table->entries + pos;
+    } while(1);
+
+not_found:
+    if (value) *value = 0;
+    return 0;
+}
+
+int
+sa_foreach(register sa_table *table, int (*func)(), st_data_t arg)
+{
+    sa_index_t i;
+    if (table->num_bins == 0) {
+        return 0;
+    }
+    for(i = 0; i < table->num_bins ; i++) {
+	if (table->entries[i].next != SA_EMPTY) {
+	    sa_index_t key = table->entries[i].key;
+	    st_data_t val = table->entries[i].value;
+	    if ((*func)(key, val, arg) == SA_STOP) break;
+	}
+    }
+    return 0;
+}
+
+size_t
+sa_memsize(const sa_table *table)
+{
+    return sizeof(sa_table) + table->num_bins * sizeof(sa_entry);
+}
+
+sa_table*
+sa_copy(sa_table *table)
+{
+    sa_table *new_table = sa_table_alloc();
+    *new_table = *table;
+    if (table->num_bins) {
+        new_table->entries = sa_entry_alloc(table->num_bins);
+        memcpy(new_table->entries, table->entries, table->num_bins*sizeof(sa_entry));
+    }
+    return new_table;
+}
+
+void
+sa_copy_to(sa_table *from, sa_table *to)
+{
+    sa_entry_dealloc(to->entries);
+    *to = *from;
+    if (to->num_bins) {
+	to->entries = sa_entry_alloc(to->num_bins);
+	memcpy(to->entries, from->entries, from->num_bins*sizeof(sa_entry));
+    }
+}
diff --git a/st.c b/st.c
index fda5784..20ec427 100644
--- a/st.c
+++ b/st.c
@@ -7,6 +7,7 @@
 #include "st.h"
 #else
 #include "ruby/ruby.h"
+#include "pool_alloc.h"
 #endif
 
 #include <stdio.h>
@@ -25,8 +26,17 @@ struct st_table_entry {
     st_table_entry *fore, *back;
 };
 
-#define ST_DEFAULT_MAX_DENSITY 5
+#define STATIC_ASSERT(name, expr) typedef int static_assert_##name##_check[(expr) ? 1 : -1];
+
+#define ST_DEFAULT_MAX_DENSITY 2
 #define ST_DEFAULT_INIT_TABLE_SIZE 11
+#define ST_DEFAULT_SECOND_TABLE_SIZE 19
+#define ST_DEFAULT_PACKED_TABLE_SIZE 19
+#define PACKED_UNIT (int)(sizeof(st_packed_entry) / sizeof(st_table_entry*))
+#define MAX_PACKED_HASH (int)(ST_DEFAULT_PACKED_TABLE_SIZE * sizeof(st_table_entry*) / sizeof(st_packed_entry))
+
+STATIC_ASSERT(st_packed_entry, sizeof(st_packed_entry) == sizeof(st_table_entry*[PACKED_UNIT]))
+STATIC_ASSERT(st_packed_bins, sizeof(st_packed_entry[MAX_PACKED_HASH]) <= sizeof(st_table_entry*[ST_DEFAULT_PACKED_TABLE_SIZE]))
 
     /*
      * DEFAULT_MAX_DENSITY is the default for the largest we allow the
@@ -38,7 +48,8 @@ struct st_table_entry {
      *
      */
 
-static const struct st_hash_type type_numhash = {
+#define type_numhash st_hashtype_num
+const struct st_hash_type st_hashtype_num = {
     st_numcmp,
     st_numhash,
 };
@@ -61,20 +72,128 @@ static void rehash(st_table *);
 #ifdef RUBY
 #define malloc xmalloc
 #define calloc xcalloc
+#define realloc xrealloc
 #define free(x) xfree(x)
 #endif
 
 #define numberof(array) (int)(sizeof(array) / sizeof((array)[0]))
 
-#define alloc(type) (type*)malloc((size_t)sizeof(type))
-#define Calloc(n,s) (char*)calloc((n),(s))
-
 #define EQUAL(table,x,y) ((x)==(y) || (*(table)->type->compare)((x),(y)) == 0)
 
-/* remove cast to unsigned int in the future */
-#define do_hash(key,table) (unsigned int)(st_index_t)(*(table)->type->hash)((key))
+#define do_hash(key,table) (st_index_t)(*(table)->type->hash)((key))
 #define do_hash_bin(key,table) (do_hash((key), (table))%(table)->num_bins)
 
+/* preparation for possible allocation improvements */
+#ifdef POOL_ALLOC_API
+#define st_alloc_entry() (st_table_entry *)ruby_xpool_malloc_6p()
+#define st_free_entry(entry) ruby_xpool_free(entry)
+#define st_alloc_table() (st_table *)ruby_xpool_malloc_6p()
+#define st_dealloc_table(table) ruby_xpool_free(table)
+static inline st_table_entry **
+st_alloc_bins(st_index_t size)
+{
+    st_table_entry **result;
+    if (size == 11) {
+        result = (st_table_entry **) ruby_xpool_malloc_11p();
+        memset(result, 0, 11 * sizeof(st_table_entry *));
+    }
+    else
+        result = (st_table_entry **) ruby_xcalloc(size, sizeof(st_table_entry*));
+    return result;
+}
+static inline void
+st_free_bins(st_table_entry **bins, st_index_t size)
+{
+    if (size == 11)
+	ruby_xpool_free(bins);
+    else
+	ruby_xfree(bins);
+}
+static inline st_table_entry**
+st_realloc_bins(st_table_entry **bins, st_index_t newsize, st_index_t oldsize)
+{
+    st_table_entry **new_bins = st_alloc_bins(newsize);
+    st_free_bins(bins, oldsize);
+    return new_bins;
+}
+#else
+#define st_alloc_entry() (st_table_entry *)malloc(sizeof(st_table_entry))
+#define st_free_entry(entry) free(entry)
+#define st_alloc_table() (st_table *)malloc(sizeof(st_table))
+#define st_dealloc_table(table) free(table)
+#define st_alloc_bins(size) (st_table_entry **)calloc(size, sizeof(st_table_entry *))
+#define st_free_bins(bins, size) free(bins)
+static inline st_table_entry**
+st_realloc_bins(st_table_entry **bins, st_index_t newsize, st_index_t oldsize)
+{
+    bins = (st_table_entry **)realloc(bins, newsize * sizeof(st_table_entry *));
+    MEMZERO(bins, st_table_entry*, newsize);
+    return bins;
+}
+#endif
+
+/* Shortage */
+#define bins as.big.bins
+#define head as.big.head
+#define tail as.big.tail
+#define real_entries as.packed.real_entries
+
+/* preparation for possible packing improvements */
+#define PACKED_BINS(table) ((table)->as.packed.entries)
+#define PACKED_ENT(table, i) PACKED_BINS(table)[i]
+#define PKEY(table, i) PACKED_ENT((table), (i)).key
+#define PVAL(table, i) PACKED_ENT((table), (i)).val
+#define PHASH(table, i) PACKED_ENT((table), (i)).hash
+#define PKEY_SET(table, i, v) (PKEY((table), (i)) = (v))
+#define PVAL_SET(table, i, v) (PVAL((table), (i)) = (v))
+#define PHASH_SET(table, i, v) (PHASH((table), (i)) = (v))
+
+/* this function depends much on packed layout, so that it placed here */
+static inline void
+remove_packed_entry(st_table *table, st_index_t i)
+{
+    table->real_entries--;
+    table->num_entries--;
+    if (i < table->real_entries) {
+	MEMMOVE(&PACKED_ENT(table, i), &PACKED_ENT(table, i+1),
+		st_packed_entry, table->real_entries - i);
+    }
+}
+
+static inline void
+remove_safe_packed_entry(st_table *table, st_index_t i, st_data_t never)
+{
+    table->num_entries--;
+    PKEY_SET(table, i, never);
+    PVAL_SET(table, i, never);
+    PHASH_SET(table, i, 0);
+}
+
+/* ultrapacking */
+#define real_upacked num_bins
+#define MAX_UPACKED_HASH 1
+#define ULTRAPACKED(table) ((table)->real_upacked <= 1)
+#define UPACKED_ENT(table) ((table)->as.upacked)
+#define UPKEY(table) UPACKED_ENT(table).key
+#define UPVAL(table) UPACKED_ENT(table).val
+#define UPHASH(table) UPACKED_ENT(table).hash
+#define UPKEY_SET(table, v) (UPACKED_ENT(table).key = (v))
+#define UPVAL_SET(table, v) (UPACKED_ENT(table).val = (v))
+#define UPHASH_SET(table, v) (UPACKED_ENT(table).hash = (v))
+static inline void
+remove_upacked_entry(st_table *table)
+{
+    table->real_upacked = table->num_entries = 0;
+}
+
+static inline void
+remove_safe_upacked_entry(st_table *table, st_data_t never)
+{
+    table->num_entries = 0;
+    UPKEY_SET(table, never);
+    UPVAL_SET(table, never);
+    UPHASH_SET(table, 0);
+}
 /*
  * MINSIZE is the minimum size of a dictionary.
  */
@@ -85,8 +204,8 @@ static void rehash(st_table *);
 Table of prime numbers 2^n+a, 2<=n<=30.
 */
 static const unsigned int primes[] = {
-	8 + 3,
-	16 + 3,
+	ST_DEFAULT_INIT_TABLE_SIZE,
+	ST_DEFAULT_SECOND_TABLE_SIZE,
 	32 + 5,
 	64 + 3,
 	128 + 3,
@@ -161,8 +280,6 @@ stat_col(void)
 }
 #endif
 
-#define MAX_PACKED_NUMHASH (ST_DEFAULT_INIT_TABLE_SIZE/2)
-
 st_table*
 st_init_table_with_size(const struct st_hash_type *type, st_index_t size)
 {
@@ -181,14 +298,19 @@ st_init_table_with_size(const struct st_hash_type *type, st_index_t size)
     }
 #endif
 
-    size = new_size(size);	/* round up to prime number */
 
-    tbl = alloc(st_table);
+    tbl = st_alloc_table();
     tbl->type = type;
     tbl->num_entries = 0;
-    tbl->entries_packed = type == &type_numhash && size/2 <= MAX_PACKED_NUMHASH;
+    tbl->entries_packed = size <= MAX_PACKED_HASH;
+    if (tbl->entries_packed) {
+	size = size <= MAX_UPACKED_HASH ? 0 : ST_DEFAULT_PACKED_TABLE_SIZE;
+    }
+    else {
+	size = new_size(size);	/* round up to prime number */
+    }
     tbl->num_bins = size;
-    tbl->bins = (st_table_entry **)Calloc(size, sizeof(st_table_entry*));
+    tbl->bins = size ? st_alloc_bins(size) : 0;
     tbl->head = 0;
     tbl->tail = 0;
 
@@ -243,17 +365,23 @@ st_clear(st_table *table)
     register st_table_entry *ptr, *next;
     st_index_t i;
 
+    if (ULTRAPACKED(table)) {
+	remove_upacked_entry(table);
+	return;
+    }
+
     if (table->entries_packed) {
         table->num_entries = 0;
+        table->real_entries = 0;
         return;
     }
 
-    for(i = 0; i < table->num_bins; i++) {
+    for (i = 0; i < table->num_bins; i++) {
 	ptr = table->bins[i];
 	table->bins[i] = 0;
 	while (ptr != 0) {
 	    next = ptr->next;
-	    free(ptr);
+	    st_free_entry(ptr);
 	    ptr = next;
 	}
     }
@@ -266,14 +394,19 @@ void
 st_free_table(st_table *table)
 {
     st_clear(table);
-    free(table->bins);
-    free(table);
+    if (!ULTRAPACKED(table)) {
+	st_free_bins(table->bins, table->num_bins);
+    }
+    st_dealloc_table(table);
 }
 
 size_t
 st_memsize(const st_table *table)
 {
-    if (table->entries_packed) {
+    if (ULTRAPACKED(table)) {
+	return sizeof(st_table);
+    }
+    else if (table->entries_packed) {
 	return table->num_bins * sizeof (void *) + sizeof(st_table);
     }
     else {
@@ -306,46 +439,77 @@ count_collision(const struct st_hash_type *type)
 #define FOUND_ENTRY
 #endif
 
-#define FIND_ENTRY(table, ptr, hash_val, bin_pos) do {\
-    (bin_pos) = (hash_val)%(table)->num_bins;\
-    (ptr) = (table)->bins[(bin_pos)];\
-    FOUND_ENTRY;\
-    if (PTR_NOT_EQUAL((table), (ptr), (hash_val), key)) {\
-	COLLISION;\
-	while (PTR_NOT_EQUAL((table), (ptr)->next, (hash_val), key)) {\
-	    (ptr) = (ptr)->next;\
-	}\
-	(ptr) = (ptr)->next;\
-    }\
-} while (0)
+#define FIND_ENTRY(table, ptr, hash_val, bin_pos) \
+    ((ptr) = find_entry((table), key, (hash_val), ((bin_pos) = (hash_val)%(table)->num_bins)))
+
+static st_table_entry *
+find_entry(st_table *table, st_data_t key, st_index_t hash_val, st_index_t bin_pos)
+{
+    register st_table_entry *ptr = table->bins[bin_pos];
+    FOUND_ENTRY;
+    if (PTR_NOT_EQUAL(table, ptr, hash_val, key)) {
+	COLLISION;
+	while (PTR_NOT_EQUAL(table, ptr->next, hash_val, key)) {
+	    ptr = ptr->next;
+	}
+	ptr = ptr->next;
+    }
+    return ptr;
+}
+
+static inline st_index_t
+find_packed_index(st_table *table, st_index_t hash_val, st_data_t key)
+{
+    st_index_t i = 0;
+    while (i < table->real_entries &&
+	   (PHASH(table, i) != hash_val || !EQUAL(table, key, PKEY(table, i)))) {
+	i++;
+    }
+    return i;
+}
+
+static inline int
+check_upacked(st_table *table, st_index_t hash_val, st_data_t key)
+{
+    return table->num_entries &&
+	UPHASH(table) == hash_val &&
+	EQUAL(table, key, UPKEY(table));
+}
 
 #define collision_check 0
 
 int
 st_lookup(st_table *table, register st_data_t key, st_data_t *value)
 {
-    st_index_t hash_val, bin_pos;
+    st_index_t hash_val;
     register st_table_entry *ptr;
 
+    hash_val = do_hash(key, table);
+
+    if (ULTRAPACKED(table)) {
+	if (check_upacked(table, hash_val, key)) {
+	    if (value != 0) *value = UPVAL(table);
+	    return 1;
+	}
+	return 0;
+    }
+
     if (table->entries_packed) {
-        st_index_t i;
-        for (i = 0; i < table->num_entries; i++) {
-            if ((st_data_t)table->bins[i*2] == key) {
-                if (value !=0) *value = (st_data_t)table->bins[i*2+1];
-                return 1;
-            }
-        }
+	st_index_t i = find_packed_index(table, hash_val, key);
+	if (i < table->real_entries) {
+	    if (value != 0) *value = PVAL(table, i);
+	    return 1;
+	}
         return 0;
     }
 
-    hash_val = do_hash(key, table);
-    FIND_ENTRY(table, ptr, hash_val, bin_pos);
+    ptr = find_entry(table, key, hash_val, hash_val % table->num_bins);
 
     if (ptr == 0) {
 	return 0;
     }
     else {
-	if (value != 0)  *value = ptr->record;
+	if (value != 0) *value = ptr->record;
 	return 1;
     }
 }
@@ -353,22 +517,29 @@ st_lookup(st_table *table, register st_data_t key, st_data_t *value)
 int
 st_get_key(st_table *table, register st_data_t key, st_data_t *result)
 {
-    st_index_t hash_val, bin_pos;
+    st_index_t hash_val;
     register st_table_entry *ptr;
 
+    hash_val = do_hash(key, table);
+
+    if (ULTRAPACKED(table)) {
+	if (check_upacked(table, hash_val, key)) {
+	    if (result != 0) *result = UPKEY(table);
+	    return 1;
+	}
+	return 0;
+    }
+
     if (table->entries_packed) {
-        st_index_t i;
-        for (i = 0; i < table->num_entries; i++) {
-            if ((st_data_t)table->bins[i*2] == key) {
-                if (result !=0) *result = (st_data_t)table->bins[i*2];
-                return 1;
-            }
-        }
+	st_index_t i = find_packed_index(table, hash_val, key);
+	if (i < table->real_entries) {
+	    if (result != 0) *result = PKEY(table, i);
+	    return 1;
+	}
         return 0;
     }
 
-    hash_val = do_hash(key, table);
-    FIND_ENTRY(table, ptr, hash_val, bin_pos);
+    ptr = find_entry(table, key, hash_val, hash_val % table->num_bins);
 
     if (ptr == 0) {
 	return 0;
@@ -382,85 +553,151 @@ st_get_key(st_table *table, register st_data_t key, st_data_t *result)
 #undef collision_check
 #define collision_check 1
 
-#define MORE_PACKABLE_P(table) \
-    ((st_index_t)((table)->num_entries+1) * 2 <= (table)->num_bins && \
-     (table)->num_entries+1 <= MAX_PACKED_NUMHASH)
-
-#define ADD_DIRECT(table, key, value, hash_val, bin_pos)\
-do {\
-    st_table_entry *entry;\
-    if ((table)->num_entries > ST_DEFAULT_MAX_DENSITY * (table)->num_bins) {\
-	rehash(table);\
-        (bin_pos) = (hash_val) % (table)->num_bins;\
-    }\
-    \
-    entry = alloc(st_table_entry);\
-    \
-    entry->hash = (hash_val);\
-    entry->key = (key);\
-    entry->record = (value);\
-    entry->next = (table)->bins[(bin_pos)];\
-    if ((table)->head != 0) {\
-	entry->fore = 0;\
-	(entry->back = (table)->tail)->fore = entry;\
-	(table)->tail = entry;\
-    }\
-    else {\
-	(table)->head = (table)->tail = entry;\
-	entry->fore = entry->back = 0;\
-    }\
-    (table)->bins[(bin_pos)] = entry;\
-    (table)->num_entries++;\
-} while (0)
+static inline st_table_entry *
+new_entry(st_table * table, st_data_t key, st_data_t value,
+	st_index_t hash_val, register st_index_t bin_pos)
+{
+    register st_table_entry *entry = st_alloc_entry();
+
+    entry->next = table->bins[bin_pos];
+    table->bins[bin_pos] = entry;
+    entry->hash = hash_val;
+    entry->key = key;
+    entry->record = value;
+
+    return entry;
+}
+
+static inline void
+add_direct(st_table *table, st_data_t key, st_data_t value,
+	   st_index_t hash_val, register st_index_t bin_pos)
+{
+    register st_table_entry *entry;
+    if (table->num_entries > ST_DEFAULT_MAX_DENSITY * table->num_bins) {
+	rehash(table);
+        bin_pos = hash_val % table->num_bins;
+    }
+
+    entry = new_entry(table, key, value, hash_val, bin_pos);
+
+    if (table->head != 0) {
+	entry->fore = 0;
+	(entry->back = table->tail)->fore = entry;
+	table->tail = entry;
+    }
+    else {
+	table->head = table->tail = entry;
+	entry->fore = entry->back = 0;
+    }
+    table->num_entries++;
+}
 
 static void
 unpack_entries(register st_table *table)
 {
     st_index_t i;
-    struct st_table_entry *packed_bins[MAX_PACKED_NUMHASH*2];
+    st_packed_entry packed_bins[MAX_PACKED_HASH];
+    register st_table_entry *entry, *preventry = 0, **chain;
     st_table tmp_table = *table;
 
-    memcpy(packed_bins, table->bins, sizeof(struct st_table_entry *) * table->num_entries*2);
-    table->bins = packed_bins;
+    MEMCPY(packed_bins, PACKED_BINS(table), st_packed_entry, MAX_PACKED_HASH);
+    table->as.packed.entries = packed_bins;
     tmp_table.entries_packed = 0;
-    tmp_table.num_entries = 0;
-    memset(tmp_table.bins, 0, sizeof(struct st_table_entry *) * tmp_table.num_bins);
-    for (i = 0; i < table->num_entries; i++) {
-        st_insert(&tmp_table, (st_data_t)packed_bins[i*2], (st_data_t)packed_bins[i*2+1]);
-    }
+#if ST_DEFAULT_INIT_TABLE_SIZE == ST_DEFAULT_PACKED_TABLE_SIZE
+    MEMZERO(tmp_table.bins, st_table_entry*, tmp_table.num_bins);
+#else
+    tmp_table.bins = st_realloc_bins(tmp_table.bins, ST_DEFAULT_INIT_TABLE_SIZE, tmp_table.num_bins);
+    tmp_table.num_bins = ST_DEFAULT_INIT_TABLE_SIZE;
+#endif
+    i = 0;
+    chain = &tmp_table.head;
+    do {
+	st_data_t key = packed_bins[i].key;
+	st_data_t val = packed_bins[i].val;
+	st_index_t hash = packed_bins[i].hash;
+	entry = new_entry(&tmp_table, key, val, hash,
+			  hash % ST_DEFAULT_INIT_TABLE_SIZE);
+	*chain = entry;
+	entry->back = preventry;
+	preventry = entry;
+	chain = &entry->fore;
+    } while (++i < MAX_PACKED_HASH);
+    *chain = NULL;
+    tmp_table.tail = entry;
     *table = tmp_table;
 }
 
+static void
+add_packed_direct(st_table *table, st_data_t key, st_data_t value, st_index_t hash_val)
+{
+    if (table->real_entries < MAX_PACKED_HASH) {
+	st_index_t i = table->real_entries++;
+	PKEY_SET(table, i, key);
+	PVAL_SET(table, i, value);
+	PHASH_SET(table, i, hash_val);
+	table->num_entries++;
+    }
+    else {
+	unpack_entries(table);
+	add_direct(table, key, value, hash_val, hash_val % table->num_bins);
+    }
+}
+
+static void
+add_upacked_direct(register st_table *table, register st_data_t key, st_data_t value, st_index_t hash_val)
+{
+    if (table->real_upacked) {
+	st_packed_entry *entries = (st_packed_entry *) st_alloc_bins(ST_DEFAULT_PACKED_TABLE_SIZE);
+	entries[0] = UPACKED_ENT(table);
+	entries[1].hash = hash_val;
+	entries[1].key = key;
+	entries[1].val = value;
+	table->num_bins = ST_DEFAULT_PACKED_TABLE_SIZE;
+	table->real_entries = 2;
+	table->num_entries++;
+	table->as.packed.entries = entries;
+    }
+    else {
+	table->real_upacked = 1;
+	table->num_entries = 1;
+	UPHASH_SET(table, hash_val);
+	UPKEY_SET(table, key);
+	UPVAL_SET(table, value);
+    }
+}
+
 int
 st_insert(register st_table *table, register st_data_t key, st_data_t value)
 {
-    st_index_t hash_val, bin_pos;
+    st_index_t hash_val;
+    register st_index_t bin_pos;
     register st_table_entry *ptr;
 
+    hash_val = do_hash(key, table);
+
+    if (ULTRAPACKED(table)) {
+	if (check_upacked(table, hash_val, key)) {
+	    UPVAL_SET(table, value);
+	    return 1;
+	}
+	add_upacked_direct(table, key, value, hash_val);
+	return 0;
+    }
+
     if (table->entries_packed) {
-        st_index_t i;
-        for (i = 0; i < table->num_entries; i++) {
-            if ((st_data_t)table->bins[i*2] == key) {
-                table->bins[i*2+1] = (struct st_table_entry*)value;
-                return 1;
-            }
-        }
-        if (MORE_PACKABLE_P(table)) {
-            i = table->num_entries++;
-            table->bins[i*2] = (struct st_table_entry*)key;
-            table->bins[i*2+1] = (struct st_table_entry*)value;
-            return 0;
-        }
-        else {
-            unpack_entries(table);
+	st_index_t i = find_packed_index(table, hash_val, key);
+	if (i < table->real_entries) {
+	    PVAL_SET(table, i, value);
+	    return 1;
         }
+	add_packed_direct(table, key, value, hash_val);
+	return 0;
     }
 
-    hash_val = do_hash(key, table);
     FIND_ENTRY(table, ptr, hash_val, bin_pos);
 
     if (ptr == 0) {
-	ADD_DIRECT(table, key, value, hash_val, bin_pos);
+	add_direct(table, key, value, hash_val, bin_pos);
 	return 0;
     }
     else {
@@ -473,34 +710,38 @@ int
 st_insert2(register st_table *table, register st_data_t key, st_data_t value,
 	   st_data_t (*func)(st_data_t))
 {
-    st_index_t hash_val, bin_pos;
+    st_index_t hash_val;
+    register st_index_t bin_pos;
     register st_table_entry *ptr;
 
+    hash_val = do_hash(key, table);
+
+    if (ULTRAPACKED(table)) {
+	if (check_upacked(table, hash_val, key)) {
+	    UPVAL_SET(table, value);
+	    return 1;
+	}
+	key = (*func)(key);
+	add_upacked_direct(table, key, value, hash_val);
+	return 0;
+    }
+
     if (table->entries_packed) {
-        st_index_t i;
-        for (i = 0; i < table->num_entries; i++) {
-            if ((st_data_t)table->bins[i*2] == key) {
-                table->bins[i*2+1] = (struct st_table_entry*)value;
-                return 1;
-            }
-        }
-        if (MORE_PACKABLE_P(table)) {
-            i = table->num_entries++;
-            table->bins[i*2] = (struct st_table_entry*)key;
-            table->bins[i*2+1] = (struct st_table_entry*)value;
-            return 0;
-        }
-        else {
-            unpack_entries(table);
-        }
+	st_index_t i = find_packed_index(table, hash_val, key);
+	if (i < table->real_entries) {
+	    PVAL_SET(table, i, value);
+	    return 1;
+	}
+	key = (*func)(key);
+	add_packed_direct(table, key, value, hash_val);
+	return 0;
     }
 
-    hash_val = do_hash(key, table);
     FIND_ENTRY(table, ptr, hash_val, bin_pos);
 
     if (ptr == 0) {
 	key = (*func)(key);
-	ADD_DIRECT(table, key, value, hash_val, bin_pos);
+	add_direct(table, key, value, hash_val, bin_pos);
 	return 0;
     }
     else {
@@ -512,36 +753,30 @@ st_insert2(register st_table *table, register st_data_t key, st_data_t value,
 void
 st_add_direct(st_table *table, st_data_t key, st_data_t value)
 {
-    st_index_t hash_val, bin_pos;
+    st_index_t hash_val;
+
+    hash_val = do_hash(key, table);
+    if (ULTRAPACKED(table)) {
+	add_upacked_direct(table, key, value, hash_val);
+	return;
+    }
 
     if (table->entries_packed) {
-        int i;
-        if (MORE_PACKABLE_P(table)) {
-            i = table->num_entries++;
-            table->bins[i*2] = (struct st_table_entry*)key;
-            table->bins[i*2+1] = (struct st_table_entry*)value;
-            return;
-        }
-        else {
-            unpack_entries(table);
-        }
+	add_packed_direct(table, key, value, hash_val);
+	return;
     }
 
-    hash_val = do_hash(key, table);
-    bin_pos = hash_val % table->num_bins;
-    ADD_DIRECT(table, key, value, hash_val, bin_pos);
+    add_direct(table, key, value, hash_val, hash_val % table->num_bins);
 }
 
 static void
 rehash(register st_table *table)
 {
     register st_table_entry *ptr, **new_bins;
-    st_index_t i, new_num_bins, hash_val;
+    st_index_t new_num_bins, hash_val;
 
     new_num_bins = new_size(table->num_bins+1);
-    new_bins = (st_table_entry**)
-	xrealloc(table->bins, new_num_bins * sizeof(st_table_entry*));
-    for (i = 0; i < new_num_bins; ++i) new_bins[i] = 0;
+    new_bins = st_realloc_bins(table->bins, new_num_bins, table->num_bins);
     table->num_bins = new_num_bins;
     table->bins = new_bins;
 
@@ -558,34 +793,37 @@ st_table*
 st_copy(st_table *old_table)
 {
     st_table *new_table;
-    st_table_entry *ptr, *entry, *prev, **tail;
+    st_table_entry *ptr, *entry, *prev, **tailp;
     st_index_t num_bins = old_table->num_bins;
     st_index_t hash_val;
 
-    new_table = alloc(st_table);
+    new_table = st_alloc_table();
     if (new_table == 0) {
 	return 0;
     }
 
     *new_table = *old_table;
-    new_table->bins = (st_table_entry**)
-	Calloc((unsigned)num_bins, sizeof(st_table_entry*));
+    if (ULTRAPACKED(old_table)) {
+	return new_table;
+    }
+
+    new_table->bins = st_alloc_bins(num_bins);
 
     if (new_table->bins == 0) {
-	free(new_table);
+	st_dealloc_table(new_table);
 	return 0;
     }
 
     if (old_table->entries_packed) {
-        memcpy(new_table->bins, old_table->bins, sizeof(struct st_table_entry *) * old_table->num_bins);
+        MEMCPY(new_table->bins, old_table->bins, st_table_entry*, old_table->num_bins);
         return new_table;
     }
 
     if ((ptr = old_table->head) != 0) {
 	prev = 0;
-	tail = &new_table->head;
+	tailp = &new_table->head;
 	do {
-	    entry = alloc(st_table_entry);
+	    entry = st_alloc_entry();
 	    if (entry == 0) {
 		st_free_table(new_table);
 		return 0;
@@ -595,8 +833,8 @@ st_copy(st_table *old_table)
 	    entry->next = new_table->bins[hash_val];
 	    new_table->bins[hash_val] = entry;
 	    entry->back = prev;
-	    *tail = prev = entry;
-	    tail = &entry->fore;
+	    *tailp = prev = entry;
+	    tailp = &entry->fore;
 	} while ((ptr = ptr->fore) != 0);
 	new_table->tail = prev;
     }
@@ -604,21 +842,22 @@ st_copy(st_table *old_table)
     return new_table;
 }
 
-#define REMOVE_ENTRY(table, ptr) do					\
-    {									\
-	if ((ptr)->fore == 0 && (ptr)->back == 0) {			\
-	    (table)->head = 0;						\
-	    (table)->tail = 0;						\
-	}								\
-	else {								\
-	    st_table_entry *fore = (ptr)->fore, *back = (ptr)->back;	\
-	    if (fore) fore->back = back;				\
-	    if (back) back->fore = fore;				\
-	    if ((ptr) == (table)->head) (table)->head = fore;		\
-	    if ((ptr) == (table)->tail) (table)->tail = back;		\
-	}								\
-	(table)->num_entries--;						\
-    } while (0)
+static inline void
+remove_entry(st_table *table, st_table_entry *ptr)
+{
+    if (ptr->fore == 0 && ptr->back == 0) {
+	table->head = 0;
+	table->tail = 0;
+    }
+    else {
+	st_table_entry *fore = ptr->fore, *back = ptr->back;
+	if (fore) fore->back = back;
+	if (back) back->fore = fore;
+	if (ptr == table->head) table->head = fore;
+	if (ptr == table->tail) table->tail = back;
+    }
+    table->num_entries--;
+}
 
 int
 st_delete(register st_table *table, register st_data_t *key, st_data_t *value)
@@ -627,30 +866,38 @@ st_delete(register st_table *table, register st_data_t *key, st_data_t *value)
     st_table_entry **prev;
     register st_table_entry *ptr;
 
+    hash_val = do_hash(*key, table);
+
+    if (ULTRAPACKED(table)) {
+	if (check_upacked(table, hash_val, *key)) {
+	    if (value != 0) *value = UPVAL(table);
+	    *key = UPKEY(table);
+	    remove_upacked_entry(table);
+	    return 1;
+	}
+	return 0;
+    }
+
     if (table->entries_packed) {
-        st_index_t i;
-        for (i = 0; i < table->num_entries; i++) {
-            if ((st_data_t)table->bins[i*2] == *key) {
-                if (value != 0) *value = (st_data_t)table->bins[i*2+1];
-                table->num_entries--;
-                memmove(&table->bins[i*2], &table->bins[(i+1)*2],
-                        sizeof(struct st_table_entry*) * 2*(table->num_entries-i));
-                return 1;
-            }
+	st_index_t i = find_packed_index(table, hash_val, *key);
+	if (i < table->real_entries) {
+	    if (value != 0) *value = PVAL(table, i);
+	    *key = PKEY(table, i);
+	    remove_packed_entry(table, i);
+	    return 1;
         }
         if (value != 0) *value = 0;
         return 0;
     }
 
-    hash_val = do_hash_bin(*key, table);
-
-    for (prev = &table->bins[hash_val]; (ptr = *prev) != 0; prev = &ptr->next) {
+    prev = &table->bins[hash_val % table->num_bins];
+    for (;(ptr = *prev) != 0; prev = &ptr->next) {
 	if (EQUAL(table, *key, ptr->key)) {
 	    *prev = ptr->next;
-	    REMOVE_ENTRY(table, ptr);
+	    remove_entry(table, ptr);
 	    if (value != 0) *value = ptr->record;
 	    *key = ptr->key;
-	    free(ptr);
+	    st_free_entry(ptr);
 	    return 1;
 	}
     }
@@ -665,25 +912,36 @@ st_delete_safe(register st_table *table, register st_data_t *key, st_data_t *val
     st_index_t hash_val;
     register st_table_entry *ptr;
 
+    hash_val = do_hash(*key, table);
+
+    if (ULTRAPACKED(table)) {
+	if (check_upacked(table, hash_val, *key)) {
+	    if (value != 0) *value = UPVAL(table);
+	    *key = UPKEY(table);
+	    remove_safe_upacked_entry(table, never);
+	    return 1;
+	}
+	if (value != 0) *value = 0;
+	return 0;
+    }
+
     if (table->entries_packed) {
-	st_index_t i;
-	for (i = 0; i < table->num_entries; i++) {
-	    if ((st_data_t)table->bins[i*2] == *key) {
-		if (value != 0) *value = (st_data_t)table->bins[i*2+1];
-		table->bins[i*2] = (void *)never;
-		return 1;
-	    }
+	st_index_t i = find_packed_index(table, hash_val, *key);
+	if (i < table->real_entries) {
+	    if (value != 0) *value = PVAL(table, i);
+	    *key = PKEY(table, i);
+	    remove_safe_packed_entry(table, i, never);
+	    return 1;
 	}
 	if (value != 0) *value = 0;
 	return 0;
     }
 
-    hash_val = do_hash_bin(*key, table);
-    ptr = table->bins[hash_val];
+    ptr = table->bins[hash_val % table->num_bins];
 
     for (; ptr != 0; ptr = ptr->next) {
 	if ((ptr->key != never) && EQUAL(table, ptr->key, *key)) {
-	    REMOVE_ENTRY(table, ptr);
+	    remove_entry(table, ptr);
 	    *key = ptr->key;
 	    if (value != 0) *value = ptr->record;
 	    ptr->key = ptr->record = never;
@@ -701,17 +959,23 @@ st_cleanup_safe(st_table *table, st_data_t never)
     st_table_entry *ptr, **last, *tmp;
     st_index_t i;
 
+    if (ULTRAPACKED(table)) {
+	table->real_upacked = table->num_entries;
+	return;
+    }
+
     if (table->entries_packed) {
 	st_index_t i = 0, j = 0;
-	while ((st_data_t)table->bins[i*2] != never) {
-	    if (i++ == table->num_entries) return;
+	while (PKEY(table, i) != never) {
+	    if (i++ == table->real_entries) return;
 	}
-	for (j = i; ++i < table->num_entries;) {
-	    if ((st_data_t)table->bins[i*2] == never) continue;
-	    table->bins[j*2] = table->bins[i*2];
-	    table->bins[j*2+1] = table->bins[i*2+1];
+	for (j = i; ++i < table->real_entries;) {
+	    if (PKEY(table, i) == never) continue;
+	    PACKED_ENT(table, j) = PACKED_ENT(table, i);
 	    j++;
 	}
+	table->real_entries = j;
+	/* table->num_entries really should be equal j at this moment, but let set it anyway */
 	table->num_entries = j;
 	return;
     }
@@ -722,7 +986,7 @@ st_cleanup_safe(st_table *table, st_data_t never)
 	    if (ptr->key == never) {
 		tmp = ptr;
 		*last = ptr = ptr->next;
-		free(tmp);
+		st_free_entry(tmp);
 	    }
 	    else {
 		ptr = *(last = &ptr->next);
@@ -732,50 +996,78 @@ st_cleanup_safe(st_table *table, st_data_t never)
 }
 
 int
-st_foreach(st_table *table, int (*func)(ANYARGS), st_data_t arg)
+st_foreach_check(st_table *table, int (*func)(ANYARGS), st_data_t arg, st_data_t never)
 {
     st_table_entry *ptr, **last, *tmp;
     enum st_retval retval;
-    st_index_t i;
+    st_data_t key, val;
+    st_index_t hash, i = 0;
+
+    if (table->num_entries == 0) {
+	return 0;
+    }
+
+    if (ULTRAPACKED(table)) {
+	key = UPKEY(table);
+	val = UPVAL(table);
+	hash = UPHASH(table);
+	if (key == never) return 0;
+	retval = (*func)(key, val, arg);
+	if (!ULTRAPACKED(table)) {
+	    goto packed;
+	}
+	switch(retval) {
+	  case ST_CHECK:
+	    if (UPHASH(table) == 0 && UPKEY(table) == never)
+		break;
+	    if (check_upacked(table, hash, key))
+		break;
+	    goto deleted;
+	  case ST_DELETE:
+	    remove_safe_upacked_entry(table, never);
+	  case ST_CONTINUE:
+	  case ST_STOP:
+	    break;
+	}
+	return 0;
+    }
 
     if (table->entries_packed) {
-        for (i = 0; i < table->num_entries; i++) {
-            st_index_t j;
-            st_data_t key, val;
-            key = (st_data_t)table->bins[i*2];
-            val = (st_data_t)table->bins[i*2+1];
-            retval = (*func)(key, val, arg);
+	for (i = 0; i < table->real_entries; i++) {
+	    key = PKEY(table, i);
+	    val = PVAL(table, i);
+	    hash = PHASH(table, i);
+	    if (key == never) continue;
+	    retval = (*func)(key, val, arg);
+	  packed:
 	    if (!table->entries_packed) {
-		FIND_ENTRY(table, ptr, key, i);
+		FIND_ENTRY(table, ptr, hash, i);
 		if (retval == ST_CHECK) {
 		    if (!ptr) goto deleted;
 		    goto unpacked_continue;
 		}
 		goto unpacked;
 	    }
-            switch (retval) {
+	    switch (retval) {
 	      case ST_CHECK:	/* check if hash is modified during iteration */
-                for (j = 0; j < table->num_entries; j++) {
-                    if ((st_data_t)table->bins[j*2] == key)
-                        break;
-                }
-                if (j == table->num_entries) {
+		if (PHASH(table, i) == 0 && PKEY(table, i) == never) {
+		    break;
+		}
+		i = find_packed_index(table, hash, key);
+		if (i == table->real_entries) {
 		    goto deleted;
-                }
+		}
 		/* fall through */
 	      case ST_CONTINUE:
 		break;
 	      case ST_STOP:
 		return 0;
 	      case ST_DELETE:
-                table->num_entries--;
-                memmove(&table->bins[i*2], &table->bins[(i+1)*2],
-                        sizeof(struct st_table_entry*) * 2*(table->num_entries-i));
-                i--;
-                break;
-            }
-        }
-        return 0;
+		remove_safe_packed_entry(table, i, never);
+		break;
+	    }
+	}
+	return 0;
     }
     else {
 	ptr = table->head;
@@ -783,6 +1075,8 @@ st_foreach(st_table *table, int (*func)(ANYARGS), st_data_t arg)
 
     if (ptr != 0) {
 	do {
+	    if (ptr->key == never)
+		goto unpacked_continue;
 	    i = ptr->hash % table->num_bins;
 	    retval = (*func)(ptr->key, ptr->record, arg);
 	  unpacked:
@@ -808,10 +1102,100 @@ st_foreach(st_table *table, int (*func)(ANYARGS), st_data_t arg)
 		for (; (tmp = *last) != 0; last = &tmp->next) {
 		    if (ptr == tmp) {
 			tmp = ptr->fore;
+			remove_entry(table, ptr);
+			ptr->key = ptr->record = never;
+			ptr->hash = 0;
+			ptr = tmp;
+			break;
+		    }
+		}
+	    }
+	} while (ptr && table->head);
+    }
+    return 0;
+}
+
+int
+st_foreach(st_table *table, int (*func)(ANYARGS), st_data_t arg)
+{
+    st_table_entry *ptr, **last, *tmp;
+    enum st_retval retval;
+    st_data_t key, val;
+    st_index_t hash, i = 0;
+
+    if (table->num_entries == 0) {
+	return 0;
+    }
+
+    if (ULTRAPACKED(table)) {
+	key = UPKEY(table);
+	val = UPVAL(table);
+	hash = UPHASH(table);
+	retval = (*func)(key, val, arg);
+	if (!ULTRAPACKED(table)) {
+	    goto packed;
+	}
+	switch (retval) {
+	  case ST_DELETE:
+	    remove_upacked_entry(table);
+	  case ST_CONTINUE:
+	  case ST_CHECK:
+	  case ST_STOP:
+	    break;
+	}
+	return 0;
+    }
+
+    if (table->entries_packed) {
+	for (i = 0; i < table->real_entries; i++) {
+	    key = PKEY(table, i);
+	    val = PVAL(table, i);
+	    hash = PHASH(table, i);
+	    retval = (*func)(key, val, arg);
+	  packed:
+	    if (!table->entries_packed) {
+		FIND_ENTRY(table, ptr, hash, i);
+		if (!ptr) return 0;
+		goto unpacked;
+	    }
+	    switch (retval) {
+	      case ST_CONTINUE:
+		break;
+	      case ST_CHECK:
+	      case ST_STOP:
+		return 0;
+	      case ST_DELETE:
+		remove_packed_entry(table, i);
+		i--;
+		break;
+	    }
+	}
+	return 0;
+    }
+    else {
+	ptr = table->head;
+    }
+
+    if (ptr != 0) {
+	do {
+	    i = ptr->hash % table->num_bins;
+	    retval = (*func)(ptr->key, ptr->record, arg);
+	  unpacked:
+	    switch (retval) {
+	      case ST_CONTINUE:
+		ptr = ptr->fore;
+		break;
+	      case ST_CHECK:
+	      case ST_STOP:
+		return 0;
+	      case ST_DELETE:
+		last = &table->bins[ptr->hash % table->num_bins];
+		for (; (tmp = *last) != 0; last = &tmp->next) {
+		    if (ptr == tmp) {
+			tmp = ptr->fore;
 			*last = ptr->next;
-			REMOVE_ENTRY(table, ptr);
-			free(ptr);
-			if (ptr == tmp) return 0;
+			remove_entry(table, ptr);
+			st_free_entry(ptr);
 			ptr = tmp;
 			break;
 		    }
@@ -834,13 +1218,13 @@ st_reverse_foreach(st_table *table, int (*func)(ANYARGS), st_data_t arg)
         for (i = table->num_entries-1; 0 <= i; i--) {
             int j;
             st_data_t key, val;
-            key = (st_data_t)table->bins[i*2];
-            val = (st_data_t)table->bins[i*2+1];
+            key = PKEY(table, i);
+            val = PVAL(table, i);
             retval = (*func)(key, val, arg);
             switch (retval) {
 	      case ST_CHECK:	/* check if hash is modified during iteration */
                 for (j = 0; j < table->num_entries; j++) {
-                    if ((st_data_t)table->bins[j*2] == key)
+                    if (PKEY(table, j) == key)
                         break;
                 }
                 if (j == table->num_entries) {
@@ -854,9 +1238,7 @@ st_reverse_foreach(st_table *table, int (*func)(ANYARGS), st_data_t arg)
 	      case ST_STOP:
 		return 0;
 	      case ST_DELETE:
-                table->num_entries--;
-                memmove(&table->bins[i*2], &table->bins[(i+1)*2],
-                        sizeof(struct st_table_entry*) * 2*(table->num_entries-i));
+		remove_packed_entry(table, i);
                 break;
             }
         }
@@ -889,8 +1271,8 @@ st_reverse_foreach(st_table *table, int (*func)(ANYARGS), st_data_t arg)
 		    if (ptr == tmp) {
 			tmp = ptr->back;
 			*last = ptr->next;
-			REMOVE_ENTRY(table, ptr);
-			free(ptr);
+			remove_entry(table, ptr);
+			st_free_entry(ptr);
 			ptr = tmp;
 			break;
 		    }
diff --git a/test/ruby/test_array.rb b/test/ruby/test_array.rb
index 28d3e41..bcad2c0 100644
--- a/test/ruby/test_array.rb
+++ b/test/ruby/test_array.rb
@@ -414,6 +414,18 @@ class TestArray < Test::Unit::TestCase
     a = @cls[1, 2, 3]
     a[-1, 0] = a
     assert_equal([1, 2, 1, 2, 3, 3], a)
+
+    a = @cls[]
+    a[5,0] = [5]
+    assert_equal([nil, nil, nil, nil, nil, 5], a)
+
+    a = @cls[1]
+    a[1,0] = [2]
+    assert_equal([1, 2], a)
+
+    a = @cls[1]
+    a[1,1] = [2]
+    assert_equal([1, 2], a)
   end
 
   def test_assoc
diff --git a/test/ruby/test_marshal.rb b/test/ruby/test_marshal.rb
index 7ec6959..f5774cd 100644
--- a/test/ruby/test_marshal.rb
+++ b/test/ruby/test_marshal.rb
@@ -312,7 +312,7 @@ class TestMarshal < Test::Unit::TestCase
         assert_equal(a.instance_variable_get(i), b.instance_variable_get(i), bug1932)
       end
     end
-    a.__send__(a.methods(true).grep(/=\z/)[0], a)
+    a.__send__(a.methods(true).grep(/\Ar.+=\z/)[0], a)
     assert_nothing_raised(bug1932) do
       b = Marshal.load(Marshal.dump(a))
       assert_equal(ClassISO8859_1, b.class, bug1932)
diff --git a/test/ruby/test_method.rb b/test/ruby/test_method.rb
index 2cc0de5..b1bf33e 100644
--- a/test/ruby/test_method.rb
+++ b/test/ruby/test_method.rb
@@ -406,7 +406,7 @@ class TestMethod < Test::Unit::TestCase
     obj = a.new
     assert_equal([:a], obj.public_methods(false), bug)
     obj.extend(m)
-    assert_equal([:m1, :a], obj.public_methods(false), bug)
+    assert_equal([:a, :m1], obj.public_methods(false).sort, bug)
   end
 
   def test_visibility
diff --git a/test/ruby/test_module.rb b/test/ruby/test_module.rb
index 6176f48..a67d845 100644
--- a/test/ruby/test_module.rb
+++ b/test/ruby/test_module.rb
@@ -870,7 +870,7 @@ class TestModule < Test::Unit::TestCase
       (class << self ; self ; end).class_eval do
         define_method :method_added do |sym|
           memo << sym
-          memo << mod.instance_methods(false)
+          memo << mod.instance_methods(false).sort
           memo << (mod.instance_method(sym) rescue nil)
         end
       end
@@ -887,10 +887,10 @@ class TestModule < Test::Unit::TestCase
     assert_equal [:f, :g], memo.shift
     assert_equal mod.instance_method(:f), memo.shift
     assert_equal :a, memo.shift
-    assert_equal [:f, :g, :a], memo.shift
+    assert_equal [:a, :f, :g], memo.shift
     assert_equal mod.instance_method(:a), memo.shift
     assert_equal :a=, memo.shift
-    assert_equal [:f, :g, :a, :a=], memo.shift
+    assert_equal [:a, :a=, :f, :g], memo.shift
     assert_equal mod.instance_method(:a=), memo.shift
   end
 
diff --git a/test/ruby/test_require.rb b/test/ruby/test_require.rb
index 58a9ee2..ec75096 100644
--- a/test/ruby/test_require.rb
+++ b/test/ruby/test_require.rb
@@ -356,4 +356,114 @@ class TestRequire < Test::Unit::TestCase
     $:.replace(loadpath)
     $".replace(features)
   end
+
+  def test_require_changed_current_dir
+    bug7158 = '[ruby-core:47970]'
+    Dir.mktmpdir {|tmp|
+      Dir.chdir(tmp) {
+        Dir.mkdir("a")
+        Dir.mkdir("b")
+        open(File.join("a", "foo.rb"), "w") {}
+        open(File.join("b", "bar.rb"), "w") {|f|
+          f.puts "p :ok"
+        }
+        assert_in_out_err([], <<-INPUT, %w(:ok), [], bug7158)
+          $: << "."
+          Dir.chdir("a")
+          require "foo"
+          Dir.chdir("../b")
+          p :ng unless require "bar"
+          Dir.chdir("..")
+          p :ng if require "b/bar"
+        INPUT
+      }
+    }
+  end
+
+  def test_require_not_modified_load_path
+    bug7158 = '[ruby-core:47970]'
+    Dir.mktmpdir {|tmp|
+      Dir.chdir(tmp) {
+        open("foo.rb", "w") {}
+        assert_in_out_err([], <<-INPUT, %w(:ok), [], bug7158)
+          a = Object.new
+          def a.to_str
+            "#{tmp}"
+          end
+          $: << a
+          require "foo"
+          last_path = $:.pop
+          p :ok if last_path == a && last_path.class == Object
+        INPUT
+      }
+    }
+  end
+
+  def test_require_changed_home
+    bug7158 = '[ruby-core:47970]'
+    Dir.mktmpdir {|tmp|
+      Dir.chdir(tmp) {
+        open("foo.rb", "w") {}
+        Dir.mkdir("a")
+        open(File.join("a", "bar.rb"), "w") {}
+        assert_in_out_err([], <<-INPUT, %w(:ok), [], bug7158)
+          $: << '~'
+          ENV['HOME'] = "#{tmp}"
+          require "foo"
+          ENV['HOME'] = "#{tmp}/a"
+          p :ok if require "bar"
+        INPUT
+      }
+    }
+  end
+
+  def test_require_to_path_redefined_in_load_path
+    bug7158 = '[ruby-core:47970]'
+    Dir.mktmpdir {|tmp|
+      Dir.chdir(tmp) {
+        open("foo.rb", "w") {}
+        assert_in_out_err(["RUBYOPT"=>nil], <<-INPUT, %w(:ok), [], bug7158)
+          a = Object.new
+          def a.to_path
+            "bar"
+          end
+          $: << a
+          begin
+            require "foo"
+            p :ng
+          rescue LoadError
+          end
+          def a.to_path
+            "#{tmp}"
+          end
+          p :ok if require "foo"
+        INPUT
+      }
+    }
+  end
+
+  def test_require_to_str_redefined_in_load_path
+    bug7158 = '[ruby-core:47970]'
+    Dir.mktmpdir {|tmp|
+      Dir.chdir(tmp) {
+        open("foo.rb", "w") {}
+        assert_in_out_err(["RUBYOPT"=>nil], <<-INPUT, %w(:ok), [], bug7158)
+          a = Object.new
+          def a.to_str
+            "foo"
+          end
+          $: << a
+          begin
+            require "foo"
+            p :ng
+          rescue LoadError
+          end
+          def a.to_str
+            "#{tmp}"
+          end
+          p :ok if require "foo"
+        INPUT
+      }
+    }
+  end
 end
diff --git a/time.c b/time.c
index 755812f..83edc83 100644
--- a/time.c
+++ b/time.c
@@ -4712,16 +4712,14 @@ time_mload(VALUE time, VALUE str)
     long nsec;
     VALUE submicro, nano_num, nano_den, offset;
     wideval_t timew;
-    st_data_t data;
 
     time_modify(time);
 
 #define get_attr(attr, iffound) \
     attr = rb_attr_get(str, id_##attr); \
     if (!NIL_P(attr)) { \
-	data = id_##attr; \
 	iffound; \
-        st_delete(rb_generic_ivar_table(str), &data, 0); \
+        sa_delete(rb_generic_ivar_table(str), (sa_index_t)id_##attr, 0); \
     }
 
     get_attr(nano_num, {});
diff --git a/variable.c b/variable.c
index 3da500e..385d4af 100644
--- a/variable.c
+++ b/variable.c
@@ -19,15 +19,15 @@
 #include "constant.h"
 #include "internal.h"
 
-st_table *rb_global_tbl;
-st_table *rb_class_tbl;
+sa_table rb_global_tbl;
+sa_table rb_class_tbl;
 static ID autoload, classpath, tmp_classpath, classid;
 
 void
 Init_var_tables(void)
 {
-    rb_global_tbl = st_init_numtable();
-    rb_class_tbl = st_init_numtable();
+    sa_init_table(&rb_global_tbl, 0);
+    sa_init_table(&rb_class_tbl, 0);
     CONST_ID(autoload, "__autoload__");
     CONST_ID(classpath, "__classpath__");
     CONST_ID(tmp_classpath, "__tmp_classpath__");
@@ -43,7 +43,7 @@ struct fc_result {
 };
 
 static VALUE
-fc_path(struct fc_result *fc, ID name)
+fc_path(struct fc_result *fc, sa_index_t name)
 {
     VALUE path, tmp;
 
@@ -51,8 +51,7 @@ fc_path(struct fc_result *fc, ID name)
     while (fc) {
 	st_data_t n;
 	if (fc->track == rb_cObject) break;
-	if (RCLASS_IV_TBL(fc->track) &&
-	    st_lookup(RCLASS_IV_TBL(fc->track), (st_data_t)classpath, &n)) {
+	if (sa_lookup(RCLASS_IV_TBL(fc->track), (sa_index_t)classpath, &n)) {
 	    tmp = rb_str_dup((VALUE)n);
 	    rb_str_cat2(tmp, "::");
 	    rb_str_append(tmp, path);
@@ -70,7 +69,7 @@ fc_path(struct fc_result *fc, ID name)
 }
 
 static int
-fc_i(ID key, rb_const_entry_t *ce, struct fc_result *res)
+fc_i(sa_index_t key, rb_const_entry_t *ce, struct fc_result *res)
 {
     VALUE value = ce->value;
     if (!rb_is_const_id(key)) return ST_CONTINUE;
@@ -98,7 +97,7 @@ fc_i(ID key, rb_const_entry_t *ce, struct fc_result *res)
 	    arg.klass = res->klass;
 	    arg.track = value;
 	    arg.prev = res;
-	    st_foreach(RCLASS_CONST_TBL(value), fc_i, (st_data_t)&arg);
+	    sa_foreach(RCLASS_CONST_TBL(value), fc_i, (st_data_t)&arg);
 	    if (arg.path) {
 		res->path = arg.path;
 		return ST_STOP;
@@ -123,18 +122,14 @@ find_class_path(VALUE klass)
     arg.track = rb_cObject;
     arg.prev = 0;
     if (RCLASS_CONST_TBL(rb_cObject)) {
-	st_foreach_safe(RCLASS_CONST_TBL(rb_cObject), fc_i, (st_data_t)&arg);
+	sa_foreach(RCLASS_CONST_TBL(rb_cObject), fc_i, (st_data_t)&arg);
     }
     if (arg.path == 0) {
-	st_foreach_safe(rb_class_tbl, fc_i, (st_data_t)&arg);
+	sa_foreach(&rb_class_tbl, fc_i, (st_data_t)&arg);
     }
     if (arg.path) {
-	st_data_t tmp = tmp_classpath;
-	if (!RCLASS_IV_TBL(klass)) {
-	    RCLASS_IV_TBL(klass) = st_init_numtable();
-	}
-	st_insert(RCLASS_IV_TBL(klass), (st_data_t)classpath, arg.path);
-	st_delete(RCLASS_IV_TBL(klass), &tmp, 0);
+	sa_insert(RCLASS_IV_TBL(klass), (sa_index_t)classpath, arg.path);
+	sa_delete(RCLASS_IV_TBL(klass), (sa_index_t)tmp_classpath, 0);
 	return arg.path;
     }
     return Qnil;
@@ -147,16 +142,15 @@ classname(VALUE klass)
     st_data_t n;
 
     if (!klass) klass = rb_cObject;
-    if (RCLASS_IV_TBL(klass)) {
-	if (!st_lookup(RCLASS_IV_TBL(klass), (st_data_t)classpath, &n)) {
-	    if (!st_lookup(RCLASS_IV_TBL(klass), (st_data_t)classid, &n)) {
+    if (RCLASS_IV_TBL(klass)->num_entries) {
+	if (!sa_lookup(RCLASS_IV_TBL(klass), (sa_index_t)classpath, &n)) {
+	    if (!sa_lookup(RCLASS_IV_TBL(klass), (sa_index_t)classid, &n)) {
 		return find_class_path(klass);
 	    }
 	    path = rb_str_dup(rb_id2str(SYM2ID((VALUE)n)));
 	    OBJ_FREEZE(path);
-	    st_insert(RCLASS_IV_TBL(klass), (st_data_t)classpath, (st_data_t)path);
-	    n = classid;
-	    st_delete(RCLASS_IV_TBL(klass), &n, 0);
+	    sa_insert(RCLASS_IV_TBL(klass), (sa_index_t)classpath, (st_data_t)path);
+	    sa_delete(RCLASS_IV_TBL(klass), (sa_index_t)classid, 0);
 	}
 	else {
 	    path = (VALUE)n;
@@ -192,8 +186,7 @@ rb_class_path(VALUE klass)
     st_data_t n = (st_data_t)path;
 
     if (!NIL_P(path)) return path;
-    if (RCLASS_IV_TBL(klass) && st_lookup(RCLASS_IV_TBL(klass),
-					  (st_data_t)tmp_classpath, &n)) {
+    if (sa_lookup(RCLASS_IV_TBL(klass), (sa_index_t)tmp_classpath, &n)) {
 	return (VALUE)n;
     }
     else {
@@ -364,7 +357,7 @@ rb_global_entry(ID id)
     struct global_entry *entry;
     st_data_t data;
 
-    if (!st_lookup(rb_global_tbl, (st_data_t)id, &data)) {
+    if (!sa_lookup(&rb_global_tbl, (sa_index_t)id, &data)) {
 	struct global_variable *var;
 	entry = ALLOC(struct global_entry);
 	var = ALLOC(struct global_variable);
@@ -378,7 +371,7 @@ rb_global_entry(ID id)
 
 	var->block_trace = 0;
 	var->trace = 0;
-	st_add_direct(rb_global_tbl, id, (st_data_t)entry);
+	sa_insert(&rb_global_tbl, (sa_index_t)id, (st_data_t)entry);
     }
     else {
 	entry = (struct global_entry *)data;
@@ -454,8 +447,8 @@ readonly_setter(VALUE val, ID id, void *data, struct global_variable *gvar)
     rb_name_error(id, "%s is a read-only variable", rb_id2name(id));
 }
 
-static int
-mark_global_entry(ID key, struct global_entry *entry)
+static void
+mark_global_entry(struct global_entry *entry)
 {
     struct trace_var *trace;
     struct global_variable *var = entry->var;
@@ -466,14 +459,14 @@ mark_global_entry(ID key, struct global_entry *entry)
 	if (trace->data) rb_gc_mark_maybe(trace->data);
 	trace = trace->next;
     }
-    return ST_CONTINUE;
 }
 
 void
 rb_gc_mark_global_tbl(void)
 {
-    if (rb_global_tbl)
-        st_foreach_safe(rb_global_tbl, mark_global_entry, 0);
+    SA_FOREACH_START(&rb_global_tbl);
+    mark_global_entry((struct global_entry*) value);
+    SA_FOREACH_END();
 }
 
 static ID
@@ -635,7 +628,7 @@ rb_f_untrace_var(int argc, VALUE *argv)
     rb_secure(4);
     rb_scan_args(argc, argv, "11", &var, &cmd);
     id = rb_to_id(var);
-    if (!st_lookup(rb_global_tbl, (st_data_t)id, &data)) {
+    if (!sa_lookup(&rb_global_tbl, (sa_index_t)id, &data)) {
 	rb_name_error(id, "undefined global variable %s", rb_id2name(id));
     }
 
@@ -742,13 +735,6 @@ rb_gvar_defined(struct global_entry *entry)
     return Qtrue;
 }
 
-static int
-gvar_i(ID key, struct global_entry *entry, VALUE ary)
-{
-    rb_ary_push(ary, ID2SYM(key));
-    return ST_CONTINUE;
-}
-
 /*
  *  call-seq:
  *     global_variables    -> array
@@ -765,7 +751,9 @@ rb_f_global_variables(void)
     char buf[2];
     int i;
 
-    st_foreach_safe(rb_global_tbl, gvar_i, ary);
+    SA_FOREACH_START(&rb_global_tbl);
+    rb_ary_push(ary, ID2SYM(entry->key));
+    SA_FOREACH_END();
     buf[0] = '$';
     for (i = 1; i <= 9; ++i) {
 	buf[1] = (char)(i + '0');
@@ -784,10 +772,10 @@ rb_alias_variable(ID name1, ID name2)
 	rb_raise(rb_eSecurityError, "Insecure: can't alias global variable");
 
     entry2 = rb_global_entry(name2);
-    if (!st_lookup(rb_global_tbl, (st_data_t)name1, &data1)) {
+    if (!sa_lookup(&rb_global_tbl, (sa_index_t)name1, &data1)) {
 	entry1 = ALLOC(struct global_entry);
 	entry1->id = name1;
-	st_add_direct(rb_global_tbl, name1, (st_data_t)entry1);
+	sa_insert(&rb_global_tbl, (sa_index_t)name1, (st_data_t)entry1);
     }
     else if ((entry1 = (struct global_entry *)data1)->var != entry2->var) {
 	struct global_variable *var = entry1->var;
@@ -815,7 +803,7 @@ rb_alias_variable(ID name1, ID name2)
 static int special_generic_ivar = 0;
 static st_table *generic_iv_tbl;
 
-st_table*
+sa_table*
 rb_generic_ivar_table(VALUE obj)
 {
     st_data_t tbl;
@@ -823,7 +811,7 @@ rb_generic_ivar_table(VALUE obj)
     if (!FL_TEST(obj, FL_EXIVAR)) return 0;
     if (!generic_iv_tbl) return 0;
     if (!st_lookup(generic_iv_tbl, (st_data_t)obj, &tbl)) return 0;
-    return (st_table *)tbl;
+    return (sa_table *)tbl;
 }
 
 static VALUE
@@ -833,7 +821,7 @@ generic_ivar_get(VALUE obj, ID id, int warn)
 
     if (generic_iv_tbl) {
 	if (st_lookup(generic_iv_tbl, (st_data_t)obj, &tbl)) {
-	    if (st_lookup((st_table *)tbl, (st_data_t)id, &val)) {
+	    if (sa_lookup((sa_table *)tbl, (sa_index_t)id, &val)) {
 		return (VALUE)val;
 	    }
 	}
@@ -847,7 +835,6 @@ generic_ivar_get(VALUE obj, ID id, int warn)
 static void
 generic_ivar_set(VALUE obj, ID id, VALUE val)
 {
-    st_table *tbl;
     st_data_t data;
 
     if (rb_special_const_p(obj)) {
@@ -859,24 +846,22 @@ generic_ivar_set(VALUE obj, ID id, VALUE val)
     }
     if (!st_lookup(generic_iv_tbl, (st_data_t)obj, &data)) {
 	FL_SET(obj, FL_EXIVAR);
-	tbl = st_init_numtable();
-	st_add_direct(generic_iv_tbl, (st_data_t)obj, (st_data_t)tbl);
-	st_add_direct(tbl, (st_data_t)id, (st_data_t)val);
-	return;
+	data = (st_data_t)sa_new_table();
+	st_add_direct(generic_iv_tbl, (st_data_t)obj, data);
     }
-    st_insert((st_table *)data, (st_data_t)id, (st_data_t)val);
+    sa_insert((sa_table *)data, (sa_index_t)id, (st_data_t)val);
 }
 
 static VALUE
 generic_ivar_defined(VALUE obj, ID id)
 {
-    st_table *tbl;
+    sa_table *tbl;
     st_data_t data;
 
     if (!generic_iv_tbl) return Qfalse;
     if (!st_lookup(generic_iv_tbl, (st_data_t)obj, &data)) return Qfalse;
-    tbl = (st_table *)data;
-    if (st_lookup(tbl, (st_data_t)id, &data)) {
+    tbl = (sa_table *)data;
+    if (sa_lookup(tbl, (sa_index_t)id, &data)) {
 	return Qtrue;
     }
     return Qfalse;
@@ -885,18 +870,18 @@ generic_ivar_defined(VALUE obj, ID id)
 static int
 generic_ivar_remove(VALUE obj, ID id, st_data_t *valp)
 {
-    st_table *tbl;
+    sa_table *tbl;
     st_data_t data, key = (st_data_t)id;
     int status;
 
     if (!generic_iv_tbl) return 0;
     if (!st_lookup(generic_iv_tbl, (st_data_t)obj, &data)) return 0;
-    tbl = (st_table *)data;
-    status = st_delete(tbl, &key, valp);
+    tbl = (sa_table *)data;
+    status = sa_delete(tbl, (sa_index_t)id, valp);
     if (tbl->num_entries == 0) {
 	key = (st_data_t)obj;
 	st_delete(generic_iv_tbl, &key, &data);
-	st_free_table((st_table *)data);
+	sa_free_table(tbl);
     }
     return status;
 }
@@ -908,22 +893,17 @@ rb_mark_generic_ivar(VALUE obj)
 
     if (!generic_iv_tbl) return;
     if (st_lookup(generic_iv_tbl, (st_data_t)obj, &tbl)) {
-	rb_mark_tbl((st_table *)tbl);
+	rb_mark_sa_tbl((sa_table *)tbl);
     }
 }
 
 static int
-givar_mark_i(ID key, VALUE value)
-{
-    rb_gc_mark(value);
-    return ST_CONTINUE;
-}
-
-static int
-givar_i(VALUE obj, st_table *tbl)
+givar_i(VALUE obj, sa_table *tbl)
 {
     if (rb_special_const_p(obj)) {
-	st_foreach_safe(tbl, givar_mark_i, 0);
+        SA_FOREACH_START(tbl);
+        rb_gc_mark((VALUE)value);
+        SA_FOREACH_END();
     }
     return ST_CONTINUE;
 }
@@ -943,7 +923,7 @@ rb_free_generic_ivar(VALUE obj)
 
     if (!generic_iv_tbl) return;
     if (st_delete(generic_iv_tbl, &key, &tbl))
-	st_free_table((st_table *)tbl);
+	sa_free_table((sa_table *)tbl);
 }
 
 RUBY_FUNC_EXPORTED size_t
@@ -951,7 +931,7 @@ rb_generic_ivar_memsize(VALUE obj)
 {
     st_data_t tbl;
     if (st_lookup(generic_iv_tbl, (st_data_t)obj, &tbl))
-	return st_memsize((st_table *)tbl);
+	return sa_memsize((sa_table *)tbl);
     return 0;
 }
 
@@ -970,17 +950,17 @@ rb_copy_generic_ivar(VALUE clone, VALUE obj)
         return;
     }
     if (st_lookup(generic_iv_tbl, (st_data_t)obj, &data)) {
-	st_table *tbl = (st_table *)data;
+	sa_table *tbl = (sa_table *)data;
 
         if (tbl->num_entries == 0)
             goto clear;
 
 	if (st_lookup(generic_iv_tbl, (st_data_t)clone, &data)) {
-	    st_free_table((st_table *)data);
-	    st_insert(generic_iv_tbl, (st_data_t)clone, (st_data_t)st_copy(tbl));
+	    sa_free_table((sa_table *)data);
+	    st_insert(generic_iv_tbl, (st_data_t)clone, (st_data_t)sa_copy(tbl));
 	}
 	else {
-	    st_add_direct(generic_iv_tbl, (st_data_t)clone, (st_data_t)st_copy(tbl));
+	    st_add_direct(generic_iv_tbl, (st_data_t)clone, (st_data_t)sa_copy(tbl));
 	    FL_SET(clone, FL_EXIVAR);
 	}
     }
@@ -990,7 +970,7 @@ static VALUE
 ivar_get(VALUE obj, ID id, int warn)
 {
     VALUE val, *ptr;
-    struct st_table *iv_index_tbl;
+    sa_table *iv_index_tbl;
     long len;
     st_data_t index;
 
@@ -1000,7 +980,7 @@ ivar_get(VALUE obj, ID id, int warn)
         ptr = ROBJECT_IVPTR(obj);
         iv_index_tbl = ROBJECT_IV_INDEX_TBL(obj);
         if (!iv_index_tbl) break;
-        if (!st_lookup(iv_index_tbl, (st_data_t)id, &index)) break;
+        if (!sa_lookup(iv_index_tbl, (sa_index_t)id, &index)) break;
         if (len <= (long)index) break;
         val = ptr[index];
         if (val != Qundef)
@@ -1008,7 +988,7 @@ ivar_get(VALUE obj, ID id, int warn)
 	break;
       case T_CLASS:
       case T_MODULE:
-	if (RCLASS_IV_TBL(obj) && st_lookup(RCLASS_IV_TBL(obj), (st_data_t)id, &index))
+	if (sa_lookup(RCLASS_IV_TBL(obj), (sa_index_t)id, &index))
 	    return (VALUE)index;
 	break;
       default:
@@ -1037,7 +1017,7 @@ rb_attr_get(VALUE obj, ID id)
 VALUE
 rb_ivar_set(VALUE obj, ID id, VALUE val)
 {
-    struct st_table *iv_index_tbl;
+    struct sa_table *iv_index_tbl;
     st_data_t index;
     long i, len;
     int ivar_extended;
@@ -1051,14 +1031,11 @@ rb_ivar_set(VALUE obj, ID id, VALUE val)
         if (!iv_index_tbl) {
             VALUE klass = rb_obj_class(obj);
             iv_index_tbl = RCLASS_IV_INDEX_TBL(klass);
-            if (!iv_index_tbl) {
-                iv_index_tbl = RCLASS_IV_INDEX_TBL(klass) = st_init_numtable();
-            }
         }
         ivar_extended = 0;
-        if (!st_lookup(iv_index_tbl, (st_data_t)id, &index)) {
+        if (!sa_lookup(iv_index_tbl, (sa_index_t)id, &index)) {
             index = iv_index_tbl->num_entries;
-            st_add_direct(iv_index_tbl, (st_data_t)id, index);
+            sa_insert(iv_index_tbl, (sa_index_t)id, index);
             ivar_extended = 1;
         }
         len = ROBJECT_NUMIV(obj);
@@ -1098,8 +1075,7 @@ rb_ivar_set(VALUE obj, ID id, VALUE val)
 	break;
       case T_CLASS:
       case T_MODULE:
-	if (!RCLASS_IV_TBL(obj)) RCLASS_IV_TBL(obj) = st_init_numtable();
-	st_insert(RCLASS_IV_TBL(obj), (st_data_t)id, val);
+	sa_insert(RCLASS_IV_TBL(obj), (sa_index_t)id, val);
         break;
       default:
 	generic_ivar_set(obj, id, val);
@@ -1112,13 +1088,13 @@ VALUE
 rb_ivar_defined(VALUE obj, ID id)
 {
     VALUE val;
-    struct st_table *iv_index_tbl;
+    struct sa_table *iv_index_tbl;
     st_data_t index;
     switch (TYPE(obj)) {
       case T_OBJECT:
         iv_index_tbl = ROBJECT_IV_INDEX_TBL(obj);
         if (!iv_index_tbl) break;
-        if (!st_lookup(iv_index_tbl, (st_data_t)id, &index)) break;
+        if (!sa_lookup(iv_index_tbl, (sa_index_t)id, &index)) break;
         if (ROBJECT_NUMIV(obj) <= (long)index) break;
         val = ROBJECT_IVPTR(obj)[index];
         if (val != Qundef)
@@ -1126,7 +1102,7 @@ rb_ivar_defined(VALUE obj, ID id)
 	break;
       case T_CLASS:
       case T_MODULE:
-	if (RCLASS_IV_TBL(obj) && st_lookup(RCLASS_IV_TBL(obj), (st_data_t)id, 0))
+	if (sa_lookup(RCLASS_IV_TBL(obj), (sa_index_t)id, 0))
 	    return Qtrue;
 	break;
       default:
@@ -1137,40 +1113,26 @@ rb_ivar_defined(VALUE obj, ID id)
     return Qfalse;
 }
 
-struct obj_ivar_tag {
-    VALUE obj;
-    int (*func)(ID key, VALUE val, st_data_t arg);
-    st_data_t arg;
-};
-
-static int
-obj_ivar_i(st_data_t key, st_data_t index, st_data_t arg)
-{
-    struct obj_ivar_tag *data = (struct obj_ivar_tag *)arg;
-    if ((long)index < ROBJECT_NUMIV(data->obj)) {
-        VALUE val = ROBJECT_IVPTR(data->obj)[(long)index];
-        if (val != Qundef) {
-            return (data->func)((ID)key, val, data->arg);
-        }
-    }
-    return ST_CONTINUE;
-}
-
 static void
 obj_ivar_each(VALUE obj, int (*func)(ANYARGS), st_data_t arg)
 {
-    st_table *tbl;
-    struct obj_ivar_tag data;
+    sa_table *tbl;
+    long numiv = ROBJECT_NUMIV(obj);
+    VALUE *vars = ROBJECT_IVPTR(obj);
 
     tbl = ROBJECT_IV_INDEX_TBL(obj);
-    if (!tbl)
+    if (!tbl || !numiv)
         return;
 
-    data.obj = obj;
-    data.func = (int (*)(ID key, VALUE val, st_data_t arg))func;
-    data.arg = arg;
-
-    st_foreach_safe(tbl, obj_ivar_i, (st_data_t)&data);
+    SA_FOREACH_START(tbl);
+    if ((long)value < numiv) {
+	VALUE val = vars[value];
+	if (val != Qundef) {
+	    if (((sa_iter_func)func)(entry->key, val, arg) == SA_STOP)
+		break;
+	}
+    }
+    SA_FOREACH_END();
 }
 
 void
@@ -1182,9 +1144,7 @@ rb_ivar_foreach(VALUE obj, int (*func)(ANYARGS), st_data_t arg)
 	break;
       case T_CLASS:
       case T_MODULE:
-	if (RCLASS_IV_TBL(obj)) {
-	    st_foreach_safe(RCLASS_IV_TBL(obj), func, arg);
-	}
+        sa_foreach(RCLASS_IV_TBL(obj), func, arg);
 	break;
       default:
 	if (!generic_iv_tbl) break;
@@ -1192,7 +1152,7 @@ rb_ivar_foreach(VALUE obj, int (*func)(ANYARGS), st_data_t arg)
 	    st_data_t tbl;
 
 	    if (st_lookup(generic_iv_tbl, (st_data_t)obj, &tbl)) {
-		st_foreach_safe((st_table *)tbl, func, arg);
+		sa_foreach((sa_table *)tbl, func, arg);
 	    }
 	}
 	break;
@@ -1202,11 +1162,11 @@ rb_ivar_foreach(VALUE obj, int (*func)(ANYARGS), st_data_t arg)
 st_index_t
 rb_ivar_count(VALUE obj)
 {
-    st_table *tbl;
+    sa_table *tbl;
     switch (TYPE(obj)) {
       case T_OBJECT:
 	if ((tbl = ROBJECT_IV_INDEX_TBL(obj)) != 0) {
-	    st_index_t i, count, num = tbl->num_entries;
+	    sa_index_t i, count, num = tbl->num_entries;
 	    const VALUE *const ivptr = ROBJECT_IVPTR(obj);
 	    for (i = count = 0; i < num; ++i) {
 		if (ivptr[i] != Qundef) {
@@ -1228,7 +1188,7 @@ rb_ivar_count(VALUE obj)
 	    st_data_t data;
 
 	    if (st_lookup(generic_iv_tbl, (st_data_t)obj, &data) &&
-		(tbl = (st_table *)data) != 0) {
+		(tbl = (sa_table *)data) != 0) {
 		return tbl->num_entries;
 	    }
 	}
@@ -1238,7 +1198,7 @@ rb_ivar_count(VALUE obj)
 }
 
 static int
-ivar_i(ID key, VALUE val, VALUE ary)
+ivar_i(sa_index_t key, VALUE val, VALUE ary)
 {
     if (rb_is_instance_id(key)) {
 	rb_ary_push(ary, ID2SYM(key));
@@ -1301,7 +1261,7 @@ rb_obj_remove_instance_variable(VALUE obj, VALUE name)
     VALUE val = Qnil;
     const ID id = rb_to_id(name);
     st_data_t n, v;
-    struct st_table *iv_index_tbl;
+    struct sa_table *iv_index_tbl;
     st_data_t index;
 
     if (!OBJ_UNTRUSTED(obj) && rb_safe_level() >= 4)
@@ -1315,7 +1275,7 @@ rb_obj_remove_instance_variable(VALUE obj, VALUE name)
       case T_OBJECT:
         iv_index_tbl = ROBJECT_IV_INDEX_TBL(obj);
         if (!iv_index_tbl) break;
-        if (!st_lookup(iv_index_tbl, (st_data_t)id, &index)) break;
+        if (!sa_lookup(iv_index_tbl, (sa_index_t)id, &index)) break;
         if (ROBJECT_NUMIV(obj) <= (long)index) break;
         val = ROBJECT_IVPTR(obj)[index];
         if (val != Qundef) {
@@ -1326,14 +1286,14 @@ rb_obj_remove_instance_variable(VALUE obj, VALUE name)
       case T_CLASS:
       case T_MODULE:
 	n = id;
-	if (RCLASS_IV_TBL(obj) && st_delete(RCLASS_IV_TBL(obj), &n, &v)) {
+	if (sa_delete(RCLASS_IV_TBL(obj), (sa_index_t)id, &v)) {
 	    return (VALUE)v;
 	}
 	break;
       default:
 	if (FL_TEST(obj, FL_EXIVAR) || rb_special_const_p(obj)) {
 	    v = val;
-	    if (generic_ivar_remove(obj, (st_data_t)id, &v)) {
+	    if (generic_ivar_remove(obj, id, &v)) {
 		return (VALUE)v;
 	    }
 	}
@@ -1410,20 +1370,20 @@ rb_mod_const_missing(VALUE klass, VALUE name)
 static void
 autoload_mark(void *ptr)
 {
-    rb_mark_tbl((st_table *)ptr);
+    rb_mark_sa_tbl((sa_table *)ptr);
 }
 
 static void
 autoload_free(void *ptr)
 {
-    st_free_table((st_table *)ptr);
+    sa_free_table((sa_table *)ptr);
 }
 
 static size_t
 autoload_memsize(const void *ptr)
 {
-    const st_table *tbl = ptr;
-    return st_memsize(tbl);
+    const sa_table *tbl = ptr;
+    return sa_memsize(tbl);
 }
 
 static const rb_data_type_t autoload_data_type = {
@@ -1432,14 +1392,14 @@ static const rb_data_type_t autoload_data_type = {
 };
 
 #define check_autoload_table(av) \
-    (struct st_table *)rb_check_typeddata((av), &autoload_data_type)
+    (struct sa_table *)rb_check_typeddata((av), &autoload_data_type)
 
 void
 rb_autoload(VALUE mod, ID id, const char *file)
 {
     st_data_t av;
     VALUE fn;
-    struct st_table *tbl;
+    struct sa_table *tbl;
 
     if (!rb_is_const_id(id)) {
 	rb_raise(rb_eNameError, "autoload must be constant name: %s", rb_id2name(id));
@@ -1448,43 +1408,41 @@ rb_autoload(VALUE mod, ID id, const char *file)
 	rb_raise(rb_eArgError, "empty file name");
     }
 
-    if ((tbl = RCLASS_CONST_TBL(mod)) && st_lookup(tbl, (st_data_t)id, &av) && ((rb_const_entry_t*)av)->value != Qundef)
+    if (sa_lookup(RCLASS_CONST_TBL(mod), (sa_index_t)id, &av) && ((rb_const_entry_t*)av)->value != Qundef)
 	return;
 
     rb_const_set(mod, id, Qundef);
     tbl = RCLASS_IV_TBL(mod);
-    if (tbl && st_lookup(tbl, (st_data_t)autoload, &av)) {
+    if (sa_lookup(tbl, (sa_index_t)autoload, &av)) {
 	tbl = check_autoload_table((VALUE)av);
     }
     else {
-	if (!tbl) tbl = RCLASS_IV_TBL(mod) = st_init_numtable();
 	av = (st_data_t)TypedData_Wrap_Struct(0, &autoload_data_type, 0);
-	st_add_direct(tbl, (st_data_t)autoload, av);
-	DATA_PTR(av) = tbl = st_init_numtable();
+	sa_insert(tbl, (sa_index_t)autoload, av);
+	DATA_PTR(av) = tbl = sa_new_table();
     }
     fn = rb_str_new2(file);
     FL_UNSET(fn, FL_TAINT);
     OBJ_FREEZE(fn);
-    st_insert(tbl, (st_data_t)id, (st_data_t)rb_node_newnode(NODE_MEMO, fn, rb_safe_level(), 0));
+    sa_insert(tbl, (sa_index_t)id, (st_data_t)rb_node_newnode(NODE_MEMO, fn, rb_safe_level(), 0));
 }
 
 static NODE*
 autoload_delete(VALUE mod, ID id)
 {
-    st_data_t val, load = 0, n = id;
+    st_data_t val, load = 0;
     rb_const_entry_t *ce;
 
-    st_delete(RCLASS_CONST_TBL(mod), &n, &val);
+    sa_delete(RCLASS_CONST_TBL(mod), (sa_index_t)id, &val);
     ce = (rb_const_entry_t*)val;
     if (ce) xfree(ce);
-    if (st_lookup(RCLASS_IV_TBL(mod), (st_data_t)autoload, &val)) {
-	struct st_table *tbl = check_autoload_table((VALUE)val);
+    if (sa_lookup(RCLASS_IV_TBL(mod), (sa_index_t)autoload, &val)) {
+	struct sa_table *tbl = check_autoload_table((VALUE)val);
 
-	st_delete(tbl, &n, &load);
+	sa_delete(tbl, (sa_index_t)id, &load);
 
 	if (tbl->num_entries == 0) {
-	    n = autoload;
-	    st_delete(RCLASS_IV_TBL(mod), &n, &val);
+	    sa_delete(RCLASS_IV_TBL(mod), (sa_index_t)autoload, &val);
 	}
     }
 
@@ -1509,14 +1467,14 @@ static NODE *
 autoload_node(VALUE mod, ID id, const char **loadingpath)
 {
     VALUE file;
-    struct st_table *tbl;
+    struct sa_table *tbl;
     st_data_t val;
     NODE *load;
     const char *loading;
     int safe;
 
-    if (!st_lookup(RCLASS_IV_TBL(mod), autoload, &val) ||
-	!(tbl = check_autoload_table((VALUE)val)) || !st_lookup(tbl, (st_data_t)id, &val)) {
+    if (!sa_lookup(RCLASS_IV_TBL(mod), (sa_index_t)autoload, &val) ||
+	!(tbl = check_autoload_table((VALUE)val)) || !sa_lookup(tbl, (sa_index_t)id, &val)) {
 	return 0;
     }
     load = (NODE *)val;
@@ -1541,10 +1499,10 @@ autoload_node(VALUE mod, ID id, const char **loadingpath)
 static int
 autoload_node_id(VALUE mod, ID id)
 {
-    struct st_table *tbl = RCLASS_CONST_TBL(mod);
+    struct sa_table *tbl = RCLASS_CONST_TBL(mod);
     st_data_t val;
 
-    if (!tbl || !st_lookup(tbl, (st_data_t)id, &val) || ((rb_const_entry_t*)val)->value != Qundef) {
+    if (!tbl || !sa_lookup(tbl, (sa_index_t)id, &val) || ((rb_const_entry_t*)val)->value != Qundef) {
 	return 0;
     }
     return 1;
@@ -1593,7 +1551,7 @@ rb_const_get_0(VALUE klass, ID id, int exclude, int recurse, int visibility)
     while (RTEST(tmp)) {
 	VALUE am = 0;
 	st_data_t data;
-	while (RCLASS_CONST_TBL(tmp) && st_lookup(RCLASS_CONST_TBL(tmp), (st_data_t)id, &data)) {
+	while (sa_lookup(RCLASS_CONST_TBL(tmp), (sa_index_t)id, &data)) {
 	    rb_const_entry_t *ce = (rb_const_entry_t *)data;
 	    if (visibility && ce->flag == CONST_PRIVATE) {
 		rb_name_error(id, "private constant %s::%s referenced", rb_class2name(klass), rb_id2name(id));
@@ -1686,12 +1644,12 @@ VALUE
 rb_const_remove(VALUE mod, ID id)
 {
     VALUE val;
-    st_data_t v, n = id;
+    st_data_t v;
 
     if (!OBJ_UNTRUSTED(mod) && rb_safe_level() >= 4)
 	rb_raise(rb_eSecurityError, "Insecure: can't remove constant");
     rb_check_frozen(mod);
-    if (!RCLASS_CONST_TBL(mod) || !st_delete(RCLASS_CONST_TBL(mod), &n, &v)) {
+    if (!sa_delete(RCLASS_CONST_TBL(mod), (sa_index_t)id, &v)) {
 	if (rb_const_defined_at(mod, id)) {
 	    rb_name_error(id, "cannot remove %s::%s",
 			  rb_class2name(mod), rb_id2name(id));
@@ -1711,27 +1669,20 @@ rb_const_remove(VALUE mod, ID id)
     return val;
 }
 
-static int
-sv_i(ID key, rb_const_entry_t *ce, st_table *tbl)
-{
-    if (rb_is_const_id(key)) {
-	if (!st_lookup(tbl, (st_data_t)key, 0)) {
-	    st_insert(tbl, (st_data_t)key, (st_data_t)ce);
-	}
-    }
-    return ST_CONTINUE;
-}
-
 void*
 rb_mod_const_at(VALUE mod, void *data)
 {
-    st_table *tbl = data;
+    sa_table *tbl = data;
     if (!tbl) {
-	tbl = st_init_numtable();
+	tbl = sa_new_table();
     }
-    if (RCLASS_CONST_TBL(mod)) {
-	st_foreach_safe(RCLASS_CONST_TBL(mod), sv_i, (st_data_t)tbl);
+    SA_FOREACH_START(RCLASS_CONST_TBL(mod));
+    if (rb_is_const_id(entry->key)) {
+	if (!sa_lookup(tbl, entry->key, 0)) {
+	    sa_insert(tbl, entry->key, value);
+	}
     }
+    SA_FOREACH_END();
     return tbl;
 }
 
@@ -1748,25 +1699,21 @@ rb_mod_const_of(VALUE mod, void *data)
     return data;
 }
 
-static int
-list_i(st_data_t key, st_data_t value, VALUE ary)
-{
-    ID sym = (ID)key;
-    rb_const_entry_t *ce = (rb_const_entry_t *)value;
-    if (ce->flag != CONST_PRIVATE) rb_ary_push(ary, ID2SYM(sym));
-    return ST_CONTINUE;
-}
-
 VALUE
 rb_const_list(void *data)
 {
-    st_table *tbl = data;
+    sa_table *tbl = data;
     VALUE ary;
 
     if (!tbl) return rb_ary_new2(0);
     ary = rb_ary_new2(tbl->num_entries);
-    st_foreach_safe(tbl, list_i, ary);
-    st_free_table(tbl);
+
+    SA_FOREACH_START(tbl);
+    rb_const_entry_t *ce = (rb_const_entry_t *)value;
+    if (ce->flag != CONST_PRIVATE) rb_ary_push(ary, ID2SYM(entry->key));
+    SA_FOREACH_END();
+
+    sa_free_table(tbl);
 
     return ary;
 }
@@ -1790,7 +1737,7 @@ VALUE
 rb_mod_constants(int argc, VALUE *argv, VALUE mod)
 {
     VALUE inherit;
-    st_table *tbl;
+    sa_table *tbl;
 
     if (argc == 0) {
 	inherit = Qtrue;
@@ -1817,7 +1764,7 @@ rb_const_defined_0(VALUE klass, ID id, int exclude, int recurse, int visibility)
     tmp = klass;
   retry:
     while (tmp) {
-	if (RCLASS_CONST_TBL(tmp) && st_lookup(RCLASS_CONST_TBL(tmp), (st_data_t)id, &value)) {
+	if (sa_lookup(RCLASS_CONST_TBL(tmp), (sa_index_t)id, &value)) {
 	    rb_const_entry_t *ce = (rb_const_entry_t *)value;
 	    if (visibility && ce->flag == CONST_PRIVATE) {
 		return (int)Qfalse;
@@ -1885,6 +1832,7 @@ void
 rb_const_set(VALUE klass, ID id, VALUE val)
 {
     rb_const_entry_t *ce;
+    st_data_t value;
     VALUE visibility = CONST_PUBLIC;
 
     if (NIL_P(klass)) {
@@ -1893,21 +1841,14 @@ rb_const_set(VALUE klass, ID id, VALUE val)
     }
 
     check_before_mod_set(klass, id, val, "constant");
-    if (!RCLASS_CONST_TBL(klass)) {
-	RCLASS_CONST_TBL(klass) = st_init_numtable();
-    }
-    else {
-	st_data_t value;
-
-	if (st_lookup(RCLASS_CONST_TBL(klass), (st_data_t)id, &value)) {
-	    rb_const_entry_t *ce = (rb_const_entry_t*)value;
-	    if (ce->value == Qundef)
-		autoload_delete(klass, id);
-	    else {
-		visibility = ce->flag;
-		rb_warn("already initialized constant %s", rb_id2name(id));
-	    }
-	}
+    if (sa_lookup(RCLASS_CONST_TBL(klass), (sa_index_t)id, &value)) {
+        rb_const_entry_t *ce = (rb_const_entry_t*)value;
+        if (ce->value == Qundef)
+            autoload_delete(klass, id);
+        else {
+            visibility = ce->flag;
+            rb_warn("already initialized constant %s", rb_id2name(id));
+        }
     }
 
     rb_vm_change_state();
@@ -1916,7 +1857,7 @@ rb_const_set(VALUE klass, ID id, VALUE val)
     ce->flag = (rb_const_flag_t)visibility;
     ce->value = val;
 
-    st_insert(RCLASS_CONST_TBL(klass), (st_data_t)id, (st_data_t)ce);
+    sa_insert(RCLASS_CONST_TBL(klass), (sa_index_t)id, (st_data_t)ce);
 }
 
 void
@@ -1958,8 +1899,7 @@ set_const_visibility(VALUE mod, int argc, VALUE *argv, rb_const_flag_t flag)
     for (i = 0; i < argc; i++) {
 	VALUE val = argv[i];
 	id = rb_to_id(val);
-	if (RCLASS_CONST_TBL(mod) &&
-	    st_lookup(RCLASS_CONST_TBL(mod), (st_data_t)id, &v)) {
+	if (sa_lookup(RCLASS_CONST_TBL(mod), (sa_index_t)id, &v)) {
 	    ((rb_const_entry_t*)v)->flag = flag;
 	}
 	else {
@@ -2008,7 +1948,7 @@ original_module(VALUE c)
 }
 
 #define CVAR_LOOKUP(v,r) do {\
-    if (RCLASS_IV_TBL(klass) && st_lookup(RCLASS_IV_TBL(klass),(st_data_t)id,(v))) {\
+    if (sa_lookup(RCLASS_IV_TBL(klass),(sa_index_t)id,(v))) {\
 	r;\
     }\
     if (FL_TEST(klass, FL_SINGLETON) ) {\
@@ -2027,7 +1967,7 @@ original_module(VALUE c)
 	klass = RCLASS_SUPER(klass);\
     }\
     while (klass) {\
-	if (RCLASS_IV_TBL(klass) && st_lookup(RCLASS_IV_TBL(klass),(st_data_t)id,(v))) {\
+	if (sa_lookup(RCLASS_IV_TBL(klass),(sa_index_t)id,(v))) {\
 	    r;\
 	}\
 	klass = RCLASS_SUPER(klass);\
@@ -2043,15 +1983,13 @@ rb_cvar_set(VALUE klass, ID id, VALUE val)
     CVAR_LOOKUP(0, {if (!front) front = klass; target = klass;});
     if (target) {
 	if (front && target != front) {
-	    st_data_t did = id;
-
 	    if (RTEST(ruby_verbose)) {
 		rb_warning("class variable %s of %s is overtaken by %s",
 			   rb_id2name(id), rb_class2name(original_module(front)),
 			   rb_class2name(original_module(target)));
 	    }
 	    if (BUILTIN_TYPE(front) == T_CLASS) {
-		st_delete(RCLASS_IV_TBL(front),&did,0);
+		sa_delete(RCLASS_IV_TBL(front),(sa_index_t)id,0);
 	    }
 	}
     }
@@ -2060,11 +1998,7 @@ rb_cvar_set(VALUE klass, ID id, VALUE val)
     }
 
     check_before_mod_set(target, id, val, "class variable");
-    if (!RCLASS_IV_TBL(target)) {
-	RCLASS_IV_TBL(target) = st_init_numtable();
-    }
-
-    st_insert(RCLASS_IV_TBL(target), (st_data_t)id, (st_data_t)val);
+    sa_insert(RCLASS_IV_TBL(target), (sa_index_t)id, (st_data_t)val);
 }
 
 VALUE
@@ -2080,15 +2014,13 @@ rb_cvar_get(VALUE klass, ID id)
 		      rb_id2name(id), rb_class2name(tmp));
     }
     if (front && target != front) {
-	st_data_t did = id;
-
 	if (RTEST(ruby_verbose)) {
 	    rb_warning("class variable %s of %s is overtaken by %s",
 		       rb_id2name(id), rb_class2name(original_module(front)),
 		       rb_class2name(original_module(target)));
 	}
 	if (BUILTIN_TYPE(front) == T_CLASS) {
-	    st_delete(RCLASS_IV_TBL(front),&did,0);
+	    sa_delete(RCLASS_IV_TBL(front),(sa_index_t)id,0);
 	}
     }
     return (VALUE)value;
@@ -2134,7 +2066,7 @@ rb_define_class_variable(VALUE klass, const char *name, VALUE val)
 }
 
 static int
-cv_i(ID key, VALUE value, VALUE ary)
+cv_i(sa_index_t key, VALUE value, VALUE ary)
 {
     if (rb_is_class_id(key)) {
 	VALUE kval = ID2SYM(key);
@@ -2167,7 +2099,7 @@ rb_mod_class_variables(VALUE obj)
     VALUE ary = rb_ary_new();
 
     if (RCLASS_IV_TBL(obj)) {
-	st_foreach_safe(RCLASS_IV_TBL(obj), cv_i, ary);
+	sa_foreach(RCLASS_IV_TBL(obj), cv_i, ary);
     }
     return ary;
 }
@@ -2196,7 +2128,7 @@ VALUE
 rb_mod_remove_cvar(VALUE mod, VALUE name)
 {
     const ID id = rb_to_id(name);
-    st_data_t val, n = id;
+    st_data_t val;
 
     if (!rb_is_class_id(id)) {
 	rb_name_error(id, "wrong class variable name %s", rb_id2name(id));
@@ -2204,7 +2136,7 @@ rb_mod_remove_cvar(VALUE mod, VALUE name)
     if (!OBJ_UNTRUSTED(mod) && rb_safe_level() >= 4)
 	rb_raise(rb_eSecurityError, "Insecure: can't remove class variable");
     rb_check_frozen(mod);
-    if (RCLASS_IV_TBL(mod) && st_delete(RCLASS_IV_TBL(mod), &n, &val)) {
+    if (RCLASS_IV_TBL(mod) && sa_delete(RCLASS_IV_TBL(mod), (sa_index_t)id, &val)) {
 	return (VALUE)val;
     }
     if (rb_cvar_defined(mod, id)) {
diff --git a/vm.c b/vm.c
index 63141ba..61653d7 100644
--- a/vm.c
+++ b/vm.c
@@ -1042,7 +1042,7 @@ static void
 add_opt_method(VALUE klass, ID mid, VALUE bop)
 {
     rb_method_entry_t *me;
-    if (st_lookup(RCLASS_M_TBL(klass), mid, (void *)&me) && me->def &&
+    if (sa_lookup(RCLASS_M_TBL(klass), (sa_index_t)mid, (void *)&me) && me->def &&
 	me->def->type == VM_METHOD_TYPE_CFUNC) {
 	st_insert(vm_opt_method_table, (st_data_t)me, (st_data_t)bop);
     }
@@ -1578,7 +1578,12 @@ rb_vm_mark(void *ptr)
 	RUBY_MARK_UNLESS_NULL(vm->thgroup_default);
 	RUBY_MARK_UNLESS_NULL(vm->mark_object_ary);
 	RUBY_MARK_UNLESS_NULL(vm->load_path);
+	RUBY_MARK_UNLESS_NULL(vm->load_path_snapshot);
+	RUBY_MARK_UNLESS_NULL(vm->load_path_check_cache);
+	RUBY_MARK_UNLESS_NULL(vm->expanded_load_path);
 	RUBY_MARK_UNLESS_NULL(vm->loaded_features);
+	RUBY_MARK_UNLESS_NULL(vm->loaded_features_snapshot);
+	RUBY_MARK_UNLESS_NULL(vm->loaded_features_index);
 	RUBY_MARK_UNLESS_NULL(vm->top_self);
 	RUBY_MARK_UNLESS_NULL(vm->coverages);
 	rb_gc_mark_locations(vm->special_exceptions, vm->special_exceptions + ruby_special_error_count);
diff --git a/vm_core.h b/vm_core.h
index 60146f0..7b25806 100644
--- a/vm_core.h
+++ b/vm_core.h
@@ -298,7 +298,12 @@ typedef struct rb_vm_struct {
     /* load */
     VALUE top_self;
     VALUE load_path;
+    VALUE load_path_snapshot;
+    VALUE load_path_check_cache;
+    VALUE expanded_load_path;
     VALUE loaded_features;
+    VALUE loaded_features_snapshot;
+    VALUE loaded_features_index;
     struct st_table *loading_table;
 
     /* signal */
diff --git a/vm_insnhelper.c b/vm_insnhelper.c
index 55152df..deeed9b 100644
--- a/vm_insnhelper.c
+++ b/vm_insnhelper.c
@@ -1187,7 +1187,7 @@ vm_get_ev_const(rb_thread_t *th, const rb_iseq_t *iseq,
 		st_data_t data;
 	      search_continue:
 		if (RCLASS_CONST_TBL(klass) &&
-		    st_lookup(RCLASS_CONST_TBL(klass), id, &data)) {
+		    sa_lookup(RCLASS_CONST_TBL(klass), (sa_index_t)id, &data)) {
 		    val = ((rb_const_entry_t*)data)->value;
 		    if (val == Qundef) {
 			if (am == klass) break;
@@ -1297,10 +1297,10 @@ vm_getivar(VALUE obj, ID id, IC ic)
 	    st_data_t index;
 	    long len = ROBJECT_NUMIV(obj);
 	    VALUE *ptr = ROBJECT_IVPTR(obj);
-	    struct st_table *iv_index_tbl = ROBJECT_IV_INDEX_TBL(obj);
+	    struct sa_table *iv_index_tbl = ROBJECT_IV_INDEX_TBL(obj);
 
 	    if (iv_index_tbl) {
-		if (st_lookup(iv_index_tbl, id, &index)) {
+		if (sa_lookup(iv_index_tbl, (sa_index_t)id, &index)) {
 		    if ((long)index < len) {
 			val = ptr[index];
 		    }
@@ -1350,9 +1350,9 @@ vm_setivar(VALUE obj, ID id, VALUE val, IC ic)
 	    }
 	}
 	else {
-	    struct st_table *iv_index_tbl = ROBJECT_IV_INDEX_TBL(obj);
+	    struct sa_table *iv_index_tbl = ROBJECT_IV_INDEX_TBL(obj);
 
-	    if (iv_index_tbl && st_lookup(iv_index_tbl, (st_data_t)id, &index)) {
+	    if (iv_index_tbl && sa_lookup(iv_index_tbl, (sa_index_t)id, &index)) {
 		ic->ic_class = klass;
 		ic->ic_value.index = index;
 		ic->ic_vmstat = GET_VM_STATE_VERSION();
diff --git a/vm_method.c b/vm_method.c
index 6e33603..6567440 100644
--- a/vm_method.c
+++ b/vm_method.c
@@ -2,38 +2,33 @@
  * This file is included by vm.c
  */
 
-#define CACHE_SIZE 0x800
-#define CACHE_MASK 0x7ff
-#define EXPR1(c,m) ((((c)>>3)^(m))&CACHE_MASK)
-
 static void rb_vm_check_redefinition_opt_method(const rb_method_entry_t *me);
 
 static ID object_id, respond_to_missing;
 static ID removed, singleton_removed, undefined, singleton_undefined;
 static ID added, singleton_added, attached;
 
-struct cache_entry {		/* method hash table. */
-    VALUE filled_version;        /* filled state version */
-    ID mid;			/* method's id */
-    VALUE klass;		/* receiver's class */
-    rb_method_entry_t *me;
-};
-
-static struct cache_entry cache[CACHE_SIZE];
 #define ruby_running (GET_VM()->running)
 /* int ruby_running = 0; */
 
+static int
+methods_cache_clear_callback(void *vstart, void *vend, size_t stride, void *data)
+{
+    VALUE v = (VALUE)vstart;
+    for (; v != (VALUE)vend; v += stride) {
+	switch(BUILTIN_TYPE(v)) {
+	    case T_CLASS:
+	    case T_MODULE:
+	    case T_ICLASS:
+		RCLASS(v)->cache->method_cache_version = 0;
+	}
+    }
+    return 0;
+}
 static void
 vm_clear_global_method_cache(void)
 {
-    struct cache_entry *ent, *end;
-
-    ent = cache;
-    end = ent + CACHE_SIZE;
-    while (ent < end) {
-	ent->filled_version = 0;
-	ent++;
-    }
+    rb_objspace_each_objects(methods_cache_clear_callback, NULL);
 }
 
 void
@@ -162,7 +157,7 @@ rb_method_entry_make(VALUE klass, ID mid, rb_method_type_t type,
 		     rb_method_definition_t *def, rb_method_flag_t noex)
 {
     rb_method_entry_t *me;
-    st_table *mtbl;
+    sa_table *mtbl;
     st_data_t data;
 
     if (NIL_P(klass)) {
@@ -190,7 +185,7 @@ rb_method_entry_make(VALUE klass, ID mid, rb_method_type_t type,
     mtbl = RCLASS_M_TBL(klass);
 
     /* check re-definition */
-    if (st_lookup(mtbl, mid, &data)) {
+    if (sa_lookup(mtbl, (sa_index_t)mid, &data)) {
 	rb_method_entry_t *old_me = (rb_method_entry_t *)data;
 	rb_method_definition_t *old_def = old_me->def;
 
@@ -248,7 +243,7 @@ rb_method_entry_make(VALUE klass, ID mid, rb_method_type_t type,
 	}
     }
 
-    st_insert(mtbl, mid, (st_data_t) me);
+    sa_insert(mtbl, (sa_index_t)mid, (st_data_t) me);
 
     return me;
 }
@@ -371,7 +366,7 @@ search_method(VALUE klass, ID id)
 	return 0;
     }
 
-    while (!st_lookup(RCLASS_M_TBL(klass), id, &body)) {
+    while (!sa_lookup(RCLASS_M_TBL(klass), (sa_index_t)id, &body)) {
 	klass = RCLASS_SUPER(klass);
 	if (!klass) {
 	    return 0;
@@ -393,20 +388,10 @@ rb_method_entry_get_without_cache(VALUE klass, ID id)
     rb_method_entry_t *me = search_method(klass, id);
 
     if (ruby_running) {
-	struct cache_entry *ent;
-	ent = cache + EXPR1(klass, id);
-	ent->filled_version = GET_VM_STATE_VERSION();
-	ent->klass = klass;
-
 	if (UNDEFINED_METHOD_ENTRY_P(me)) {
-	    ent->mid = id;
-	    ent->me = 0;
-	    me = 0;
-	}
-	else {
-	    ent->mid = id;
-	    ent->me = me;
+            me = 0;
 	}
+        sa_insert(&RCLASS(klass)->cache->m_cache_tbl, (sa_index_t)id, (st_data_t)me);
     }
 
     return me;
@@ -415,21 +400,23 @@ rb_method_entry_get_without_cache(VALUE klass, ID id)
 rb_method_entry_t *
 rb_method_entry(VALUE klass, ID id)
 {
-    struct cache_entry *ent;
+    rb_class_cache_t *cache = RCLASS(klass)->cache;
+    rb_method_entry_t *me;
 
-    ent = cache + EXPR1(klass, id);
-    if (ent->filled_version == GET_VM_STATE_VERSION() &&
-	ent->mid == id && ent->klass == klass) {
-	return ent->me;
+    if (cache->method_cache_version != GET_VM_STATE_VERSION()) {
+        sa_clear_no_free(&cache->m_cache_tbl);
+        cache->method_cache_version = GET_VM_STATE_VERSION();
+    }
+    else if (sa_lookup(&cache->m_cache_tbl, (sa_index_t)id, (st_data_t*)&me)) {
+        return me;
     }
-
     return rb_method_entry_get_without_cache(klass, id);
 }
 
 static void
 remove_method(VALUE klass, ID mid)
 {
-    st_data_t key, data;
+    st_data_t data;
     rb_method_entry_t *me = 0;
 
     if (klass == rb_cObject) {
@@ -443,14 +430,13 @@ remove_method(VALUE klass, ID mid)
 	rb_warn("removing `%s' may cause serious problems", rb_id2name(mid));
     }
 
-    if (!st_lookup(RCLASS_M_TBL(klass), mid, &data) ||
+    if (!sa_lookup(RCLASS_M_TBL(klass), (sa_index_t)mid, &data) ||
 	!(me = (rb_method_entry_t *)data) ||
 	(!me->def || me->def->type == VM_METHOD_TYPE_UNDEF)) {
 	rb_name_error(mid, "method `%s' not defined in %s",
 		      rb_id2name(mid), rb_class2name(klass));
     }
-    key = (st_data_t)mid;
-    st_delete(RCLASS_M_TBL(klass), &key, &data);
+    sa_delete(RCLASS_M_TBL(klass), (sa_index_t)mid, &data);
 
     rb_vm_check_redefinition_opt_method(me);
     rb_clear_cache_for_undef(klass, mid);
patches/ruby/1.9.3/p362/ruby-multilib.patch000066400000002321147511530510014141 0ustar00diff -u -wr a/tool/mkconfig.rb b/tool/mkconfig.rb
--- a/tool/mkconfig.rb  2012-10-08 05:57:16.948702976 +0200
+++ b/tool/mkconfig.rb  2011-08-13 15:17:30.000000000 +0200
@@ -40,6 +40,7 @@
 v_fast = []
 v_others = []
 vars = {}
+v_runtime = {}
 continued_name = nil
 continued_line = nil
 File.foreach "config.status" do |line|
@@ -118,7 +119,10 @@
     val = val.gsub(/\$(?:\$|\{?(\w+)\}?)/) {$1 ? "$(#{$1})" : $&}.dump
     case name
     when /^prefix$/
+      v_runtime[:prefix] = val.slice(1..-2)
       val = "(TOPDIR || DESTDIR + #{val})"
+    when /^libdir$/
+      v_runtime[:libdir] = File.basename(val.slice(1..-2))
     when /^ARCH_FLAG$/
       val = "arch_flag || #{val}" if universal
     when /^UNIVERSAL_ARCHNAMES$/
@@ -145,7 +149,7 @@

 drive = File::PATH_SEPARATOR == ';'

-prefix = "/lib/ruby/#{version}/#{arch}"
+prefix = "/#{v_runtime[:libdir]}/ruby/#{version}/#{arch}"
 print "  TOPDIR = File.dirname(__FILE__).chomp!(#{prefix.dump})\n"
 print "  DESTDIR = ", (drive ? "TOPDIR && TOPDIR[/\\A[a-z]:/i] || " : ""), "'' unless defined? DESTDIR\n"
 print <<'ARCH' if universal
@@ -190,6 +194,7 @@
     x
   end
 end
+v_others.map!{|x| x.gsub(v_runtime[:prefix], "$(prefix)") }
 v_others.compact!

 if $install_name
patches/ruby/1.9.3/p362/segfault_fix_7629.diff000066400000002010147511530510014314 0ustar00--- a/vm.c  (revision 38725)
+++ b/vm.c  (revision 38726)
@@ -468,10 +468,18 @@
 }

 static VALUE vm_make_proc_from_block(rb_thread_t *th, rb_block_t *block);
+static VALUE vm_make_env_object(rb_thread_t * th, rb_control_frame_t *cfp, VALUE *blockprocptr);

 VALUE
 rb_vm_make_env_object(rb_thread_t * th, rb_control_frame_t *cfp)
 {
+    VALUE blockprocval;
+    return vm_make_env_object(th, cfp, &blockprocval);
+}
+
+static VALUE
+vm_make_env_object(rb_thread_t *th, rb_control_frame_t *cfp, VALUE *blockprocptr)
+{
     VALUE envval;
     VALUE *lfp;
     rb_block_t *blockptr;
@@ -489,6 +497,7 @@
  rb_proc_t *p;
  GetProcPtr(blockprocval, p);
  lfp[0] = GC_GUARDED_PTR(&p->block);
+ *blockprocptr = blockprocval;
     }

     envval = vm_make_env_each(th, cfp, cfp->dfp, cfp->lfp);
@@ -559,7 +568,7 @@
  rb_bug("rb_vm_make_proc: Proc value is already created.");
     }

-    envval = rb_vm_make_env_object(th, cfp);
+    envval = vm_make_env_object(th, cfp, &blockprocval);

     if (PROCDEBUG) {
  check_env_value(envval);
patches/ruby/1.9.3/CVE-2015-1855-p484.patch000066400000030315147511530510012752 0ustar00--- a/ext/openssl/lib/openssl/ssl-internal.rb
+++ b/ext/openssl/lib/openssl/ssl-internal.rb
@@ -135,8 +135,7 @@ module OpenSSL
           case san.tag
           when 2 # dNSName in GeneralName (RFC5280)
             should_verify_common_name = false
-            reg = Regexp.escape(san.value).gsub(/\\\*/, "[^.]+")
-            return true if /\A#{reg}\z/i =~ hostname
+            return true if verify_hostname(hostname, san.value)
           when 7 # iPAddress in GeneralName (RFC5280)
             should_verify_common_name = false
             # follows GENERAL_NAME_print() in x509v3/v3_alt.c
@@ -151,8 +150,7 @@ module OpenSSL
       if should_verify_common_name
         cert.subject.to_a.each{|oid, value|
           if oid == "CN"
-            reg = Regexp.escape(value).gsub(/\\\*/, "[^.]+")
-            return true if /\A#{reg}\z/i =~ hostname
+            return true if verify_hostname(hostname, value)
           end
         }
       end
@@ -160,11 +158,67 @@ module OpenSSL
     end
     module_function :verify_certificate_identity
 
+    def verify_hostname(hostname, san) # :nodoc:
+      # RFC 5280, IA5String is limited to the set of ASCII characters
+      return false unless san.ascii_only?
+      return false unless hostname.ascii_only?
+
+      # See RFC 6125, section 6.4.1
+      # Matching is case-insensitive.
+      san_parts = san.downcase.split(".")
+
+      # TODO: this behavior should probably be more strict
+      return san == hostname if san_parts.size < 2
+
+      # Matching is case-insensitive.
+      host_parts = hostname.downcase.split(".")
+
+      # RFC 6125, section 6.4.3, subitem 2.
+      # If the wildcard character is the only character of the left-most
+      # label in the presented identifier, the client SHOULD NOT compare
+      # against anything but the left-most label of the reference
+      # identifier (e.g., *.example.com would match foo.example.com but
+      # not bar.foo.example.com or example.com).
+      return false unless san_parts.size == host_parts.size
+
+      # RFC 6125, section 6.4.3, subitem 1.
+      # The client SHOULD NOT attempt to match a presented identifier in
+      # which the wildcard character comprises a label other than the
+      # left-most label (e.g., do not match bar.*.example.net).
+      return false unless verify_wildcard(host_parts.shift, san_parts.shift)
+
+      san_parts.join(".") == host_parts.join(".")
+    end
+    module_function :verify_hostname
+
+    def verify_wildcard(domain_component, san_component) # :nodoc:
+      parts = san_component.split("*", -1)
+
+      return false if parts.size > 2
+      return san_component == domain_component if parts.size == 1
+
+      # RFC 6125, section 6.4.3, subitem 3.
+      # The client SHOULD NOT attempt to match a presented identifier
+      # where the wildcard character is embedded within an A-label or
+      # U-label of an internationalized domain name.
+      return false if domain_component.start_with?("xn--") && san_component != "*"
+
+      parts[0].length + parts[1].length < domain_component.length &&
+      domain_component.start_with?(parts[0]) &&
+      domain_component.end_with?(parts[1])
+    end
+    module_function :verify_wildcard
+
     class SSLSocket
       include Buffering
       include SocketForwarder
       include Nonblock
 
+      ##
+      # Perform hostname verification after an SSL connection is established
+      #
+      # This method MUST be called after calling #connect to ensure that the
+      # hostname of a remote peer has been verified.
       def post_connection_check(hostname)
         unless OpenSSL::SSL.verify_certificate_identity(peer_cert, hostname)
           raise SSLError, "hostname does not match the server certificate"
--- a/test/openssl/test_ssl.rb
+++ b/test/openssl/test_ssl.rb
@@ -1,3 +1,5 @@
+# encoding: utf-8
+
 require_relative "utils"
 
 if defined?(OpenSSL)
@@ -363,6 +365,155 @@ class OpenSSL::TestSSL < OpenSSL::SSLTestCase
     end
   end
 
+  def test_verify_hostname
+    assert_equal(true,  OpenSSL::SSL.verify_hostname("www.example.com", "*.example.com"))
+    assert_equal(false, OpenSSL::SSL.verify_hostname("www.subdomain.example.com", "*.example.com"))
+  end
+
+  def test_verify_wildcard
+    assert_equal(false, OpenSSL::SSL.verify_wildcard("foo", "x*"))
+    assert_equal(true,  OpenSSL::SSL.verify_wildcard("foo", "foo"))
+    assert_equal(true,  OpenSSL::SSL.verify_wildcard("foo", "f*"))
+    assert_equal(true,  OpenSSL::SSL.verify_wildcard("foo", "*"))
+    assert_equal(false, OpenSSL::SSL.verify_wildcard("abc*bcd", "abcd"))
+    assert_equal(false, OpenSSL::SSL.verify_wildcard("xn--qdk4b9b", "x*"))
+    assert_equal(false, OpenSSL::SSL.verify_wildcard("xn--qdk4b9b", "*--qdk4b9b"))
+    assert_equal(true,  OpenSSL::SSL.verify_wildcard("xn--qdk4b9b", "xn--qdk4b9b"))
+  end
+
+  # Comments in this test is excerpted from http://tools.ietf.org/html/rfc6125#page-27
+  def test_post_connection_check_wildcard_san
+    # case-insensitive ASCII comparison
+    # RFC 6125, section 6.4.1
+    #
+    # "..matching of the reference identifier against the presented identifier
+    # is performed by comparing the set of domain name labels using a
+    # case-insensitive ASCII comparison, as clarified by [DNS-CASE] (e.g.,
+    # "WWW.Example.Com" would be lower-cased to "www.example.com" for
+    # comparison purposes)
+    assert_equal(true, OpenSSL::SSL.verify_certificate_identity(
+      create_cert_with_san('DNS:*.example.com'), 'www.example.com'))
+    assert_equal(true, OpenSSL::SSL.verify_certificate_identity(
+      create_cert_with_san('DNS:*.Example.COM'), 'www.example.com'))
+    assert_equal(true, OpenSSL::SSL.verify_certificate_identity(
+      create_cert_with_san('DNS:*.example.com'), 'WWW.Example.COM'))
+    # 1.  The client SHOULD NOT attempt to match a presented identifier in
+    #     which the wildcard character comprises a label other than the
+    #     left-most label (e.g., do not match bar.*.example.net).
+    assert_equal(false, OpenSSL::SSL.verify_certificate_identity(
+      create_cert_with_san('DNS:www.*.com'), 'www.example.com'))
+    # 2.  If the wildcard character is the only character of the left-most
+    #     label in the presented identifier, the client SHOULD NOT compare
+    #     against anything but the left-most label of the reference
+    #     identifier (e.g., *.example.com would match foo.example.com but
+    #     not bar.foo.example.com or example.com).
+    assert_equal(true, OpenSSL::SSL.verify_certificate_identity(
+      create_cert_with_san('DNS:*.example.com'), 'foo.example.com'))
+    assert_equal(false, OpenSSL::SSL.verify_certificate_identity(
+      create_cert_with_san('DNS:*.example.com'), 'bar.foo.example.com'))
+    # 3.  The client MAY match a presented identifier in which the wildcard
+    #     character is not the only character of the label (e.g.,
+    #     baz*.example.net and *baz.example.net and b*z.example.net would
+    #     be taken to match baz1.example.net and foobaz.example.net and
+    #     buzz.example.net, respectively).  ...
+    assert_equal(true, OpenSSL::SSL.verify_certificate_identity(
+      create_cert_with_san('DNS:baz*.example.com'), 'baz1.example.com'))
+    assert_equal(true, OpenSSL::SSL.verify_certificate_identity(
+      create_cert_with_san('DNS:*baz.example.com'), 'foobaz.example.com'))
+    assert_equal(true, OpenSSL::SSL.verify_certificate_identity(
+      create_cert_with_san('DNS:b*z.example.com'), 'buzz.example.com'))
+    # Section 6.4.3 of RFC6125 states that client should NOT match identifier
+    # where wildcard is other than left-most label.
+    #
+    # Also implicitly mentions the wildcard character only in singular form,
+    # and discourages matching against more than one wildcard.
+    #
+    # See RFC 6125, section 7.2, subitem 2.
+    assert_equal(false, OpenSSL::SSL.verify_certificate_identity(
+      create_cert_with_san('DNS:*b*.example.com'), 'abc.example.com'))
+    assert_equal(false, OpenSSL::SSL.verify_certificate_identity(
+      create_cert_with_san('DNS:*b*.example.com'), 'ab.example.com'))
+    assert_equal(false, OpenSSL::SSL.verify_certificate_identity(
+      create_cert_with_san('DNS:*b*.example.com'), 'bc.example.com'))
+    #                                ...  However, the client SHOULD NOT
+    #   attempt to match a presented identifier where the wildcard
+    #   character is embedded within an A-label or U-label [IDNA-DEFS] of
+    #   an internationalized domain name [IDNA-PROTO].
+    assert_equal(true, OpenSSL::SSL.verify_certificate_identity(
+      create_cert_with_san('DNS:xn*.example.com'), 'xn1ca.example.com'))
+    # part of A-label
+    assert_equal(false, OpenSSL::SSL.verify_certificate_identity(
+      create_cert_with_san('DNS:xn--*.example.com'), 'xn--1ca.example.com'))
+    # part of U-label
+    # dNSName in RFC5280 is an IA5String so U-label should NOT be allowed
+    # regardless of wildcard.
+    #
+    # See Section 7.2 of RFC 5280:
+    #   IA5String is limited to the set of ASCII characters.
+    assert_equal(false, OpenSSL::SSL.verify_certificate_identity(
+      create_cert_with_name('á*.example.com'), 'á1.example.com'))
+  end
+
+  def test_post_connection_check_wildcard_cn
+    assert_equal(true, OpenSSL::SSL.verify_certificate_identity(
+      create_cert_with_name('*.example.com'), 'www.example.com'))
+    assert_equal(true, OpenSSL::SSL.verify_certificate_identity(
+      create_cert_with_name('*.Example.COM'), 'www.example.com'))
+    assert_equal(true, OpenSSL::SSL.verify_certificate_identity(
+      create_cert_with_name('*.example.com'), 'WWW.Example.COM'))
+    assert_equal(false, OpenSSL::SSL.verify_certificate_identity(
+      create_cert_with_name('www.*.com'), 'www.example.com'))
+    assert_equal(true, OpenSSL::SSL.verify_certificate_identity(
+      create_cert_with_name('*.example.com'), 'foo.example.com'))
+    assert_equal(false, OpenSSL::SSL.verify_certificate_identity(
+      create_cert_with_name('*.example.com'), 'bar.foo.example.com'))
+    assert_equal(true, OpenSSL::SSL.verify_certificate_identity(
+      create_cert_with_name('baz*.example.com'), 'baz1.example.com'))
+    assert_equal(true, OpenSSL::SSL.verify_certificate_identity(
+      create_cert_with_name('*baz.example.com'), 'foobaz.example.com'))
+    assert_equal(true, OpenSSL::SSL.verify_certificate_identity(
+      create_cert_with_name('b*z.example.com'), 'buzz.example.com'))
+    # Section 6.4.3 of RFC6125 states that client should NOT match identifier
+    # where wildcard is other than left-most label.
+    #
+    # Also implicitly mentions the wildcard character only in singular form,
+    # and discourages matching against more than one wildcard.
+    #
+    # See RFC 6125, section 7.2, subitem 2.
+    assert_equal(false, OpenSSL::SSL.verify_certificate_identity(
+      create_cert_with_name('*b*.example.com'), 'abc.example.com'))
+    assert_equal(false, OpenSSL::SSL.verify_certificate_identity(
+      create_cert_with_name('*b*.example.com'), 'ab.example.com'))
+    assert_equal(false, OpenSSL::SSL.verify_certificate_identity(
+      create_cert_with_name('*b*.example.com'), 'bc.example.com'))
+    assert_equal(true, OpenSSL::SSL.verify_certificate_identity(
+      create_cert_with_name('xn*.example.com'), 'xn1ca.example.com'))
+    assert_equal(false, OpenSSL::SSL.verify_certificate_identity(
+      create_cert_with_name('xn--*.example.com'), 'xn--1ca.example.com'))
+    # part of U-label
+    # Subject in RFC5280 states case-insensitive ASCII comparison.
+    #
+    # See Section 7.2 of RFC 5280:
+    #   IA5String is limited to the set of ASCII characters.
+    assert_equal(false, OpenSSL::SSL.verify_certificate_identity(
+      create_cert_with_name('á*.example.com'), 'á1.example.com'))
+  end
+
+  def create_cert_with_san(san)
+    ef = OpenSSL::X509::ExtensionFactory.new
+    cert = OpenSSL::X509::Certificate.new
+    cert.subject = OpenSSL::X509::Name.parse("/DC=some/DC=site/CN=Some Site")
+    ext = ef.create_ext('subjectAltName', san)
+    cert.add_extension(ext)
+    cert
+  end
+
+  def create_cert_with_name(name)
+    cert = OpenSSL::X509::Certificate.new
+    cert.subject = OpenSSL::X509::Name.new([['DC', 'some'], ['DC', 'site'], ['CN', name]])
+    cert
+  end
+
   # Create NULL byte SAN certificate
   def create_null_byte_SAN_certificate(critical = false)
     ef = OpenSSL::X509::ExtensionFactory.new
patches/ruby/1.9.3/openssl3.patch000066400000002126147511530510012420 0ustar00diff --git a/ext/openssl/extconf.rb b/ext/openssl/extconf.rb
index 8c04cb5..132d803 100644
--- a/ext/openssl/extconf.rb
+++ b/ext/openssl/extconf.rb
@@ -104,6 +104,9 @@
 have_func("SSLv2_method")
 have_func("SSLv2_server_method")
 have_func("SSLv2_client_method")
+have_func("SSLv3_method")
+have_func("SSLv3_server_method")
+have_func("SSLv3_client_method")
 have_func("TLSv1_1_method")
 have_func("TLSv1_1_server_method")
 have_func("TLSv1_1_client_method")
diff --git a/ext/openssl/ossl_ssl.c b/ext/openssl/ossl_ssl.c
index f7cb7f0..47111f6 100644
--- a/ext/openssl/ossl_ssl.c
+++ b/ext/openssl/ossl_ssl.c
@@ -109,9 +109,12 @@ static const struct {
     OSSL_SSL_METHOD_ENTRY(SSLv2_server),
     OSSL_SSL_METHOD_ENTRY(SSLv2_client),
 #endif
+#if defined(HAVE_SSLV3_METHOD) && defined(HAVE_SSLV3_SERVER_METHOD) && \
+        defined(HAVE_SSLV3_CLIENT_METHOD)
     OSSL_SSL_METHOD_ENTRY(SSLv3),
     OSSL_SSL_METHOD_ENTRY(SSLv3_server),
     OSSL_SSL_METHOD_ENTRY(SSLv3_client),
+#endif
     OSSL_SSL_METHOD_ENTRY(SSLv23),
     OSSL_SSL_METHOD_ENTRY(SSLv23_server),
     OSSL_SSL_METHOD_ENTRY(SSLv23_client),
patches/ruby/1.9.3/preview1/gcdata.patch000066400000007676147511530510013656 0ustar00--- a/gc.c	(revision 32826)
+++ b/gc.c	(working copy)
@@ -309,16 +309,12 @@
     struct gc_list *next;
 };
 
-#define CALC_EXACT_MALLOC_SIZE 0
-
 typedef struct rb_objspace {
     struct {
 	size_t limit;
 	size_t increase;
-#if CALC_EXACT_MALLOC_SIZE
 	size_t allocated_size;
 	size_t allocations;
-#endif
     } malloc_params;
     struct {
 	size_t increment;
@@ -715,10 +711,6 @@
     }
     if (size == 0) size = 1;
 
-#if CALC_EXACT_MALLOC_SIZE
-    size += sizeof(size_t);
-#endif
-
     if ((ruby_gc_stress && !ruby_disable_gc_stress) ||
 	(malloc_increase+size) > malloc_limit) {
 	garbage_collect_with_gvl(objspace);
@@ -731,13 +723,9 @@
 vm_malloc_fixup(rb_objspace_t *objspace, void *mem, size_t size)
 {
     malloc_increase += size;
-
-#if CALC_EXACT_MALLOC_SIZE
+    
     objspace->malloc_params.allocated_size += size;
     objspace->malloc_params.allocations++;
-    ((size_t *)mem)[0] = size;
-    mem = (size_t *)mem + 1;
-#endif
 
     return mem;
 }
@@ -776,11 +764,7 @@
     if (ruby_gc_stress && !ruby_disable_gc_stress)
 	garbage_collect_with_gvl(objspace);
 
-#if CALC_EXACT_MALLOC_SIZE
-    size += sizeof(size_t);
     objspace->malloc_params.allocated_size -= size;
-    ptr = (size_t *)ptr - 1;
-#endif
 
     mem = realloc(ptr, size);
     if (!mem) {
@@ -792,12 +776,8 @@
         }
     }
     malloc_increase += size;
-
-#if CALC_EXACT_MALLOC_SIZE
+    
     objspace->malloc_params.allocated_size += size;
-    ((size_t *)mem)[0] = size;
-    mem = (size_t *)mem + 1;
-#endif
 
     return mem;
 }
@@ -805,14 +785,6 @@
 static void
 vm_xfree(rb_objspace_t *objspace, void *ptr)
 {
-#if CALC_EXACT_MALLOC_SIZE
-    size_t size;
-    ptr = ((size_t *)ptr) - 1;
-    size = ((size_t*)ptr)[0];
-    objspace->malloc_params.allocated_size -= size;
-    objspace->malloc_params.allocations--;
-#endif
-
     free(ptr);
 }
 
@@ -3368,7 +3340,6 @@
 }
 
 
-#if CALC_EXACT_MALLOC_SIZE
 /*
  *  call-seq:
  *     GC.malloc_allocated_size -> Integer
@@ -3378,8 +3349,8 @@
  *  It returns the allocated size by malloc().
  */
 
-static VALUE
-gc_malloc_allocated_size(VALUE self)
+VALUE
+rb_gc_malloc_allocated_size(VALUE self)
 {
     return UINT2NUM((&rb_objspace)->malloc_params.allocated_size);
 }
@@ -3393,12 +3364,11 @@
  *  It returns the number of allocated memory object by malloc().
  */
 
-static VALUE
-gc_malloc_allocations(VALUE self)
+VALUE
+rb_gc_malloc_allocations(VALUE self)
 {
     return UINT2NUM((&rb_objspace)->malloc_params.allocations);
 }
-#endif
 
 static VALUE
 gc_profile_record_get(void)
@@ -3583,6 +3553,8 @@
     rb_define_singleton_method(rb_mGC, "start", rb_gc_start, 0);
     rb_define_singleton_method(rb_mGC, "enable", rb_gc_enable, 0);
     rb_define_singleton_method(rb_mGC, "disable", rb_gc_disable, 0);
+    rb_define_singleton_method(rb_mGC, "malloc_allocated_size", rb_gc_malloc_allocated_size, 0);
+    rb_define_singleton_method(rb_mGC, "malloc_allocations", rb_gc_malloc_allocations, 0);
     rb_define_singleton_method(rb_mGC, "stress", gc_stress_get, 0);
     rb_define_singleton_method(rb_mGC, "stress=", gc_stress_set, 1);
     rb_define_singleton_method(rb_mGC, "count", gc_count, 0);
@@ -3597,6 +3569,7 @@
     rb_define_singleton_method(rb_mProfiler, "result", gc_profile_result, 0);
     rb_define_singleton_method(rb_mProfiler, "report", gc_profile_report, -1);
     rb_define_singleton_method(rb_mProfiler, "total_time", gc_profile_total_time, 0);
+    rb_define_singleton_method(rb_mProfiler, "data", gc_profile_record_get, 0);
 
     rb_mObSpace = rb_define_module("ObjectSpace");
     rb_define_module_function(rb_mObSpace, "each_object", os_each_obj, -1);
@@ -3616,9 +3589,4 @@
     rb_define_method(rb_mKernel, "object_id", rb_obj_id, 0);
 
     rb_define_module_function(rb_mObSpace, "count_objects", count_objects, -1);
-
-#if CALC_EXACT_MALLOC_SIZE
-    rb_define_singleton_method(rb_mGC, "malloc_allocated_size", gc_malloc_allocated_size, 0);
-    rb_define_singleton_method(rb_mGC, "malloc_allocations", gc_malloc_allocations, 0);
-#endif
 }
patches/ruby/1.9.3/p385/ruby-multilib.patch000066400000000732147511530510014152 0ustar00--- a/tool/mkconfig.rb
+++ b/tool/mkconfig.rb
@@ -121,6 +121,7 @@
     val = val.gsub(/\$(?:\$|\{?(\w+)\}?)/) {$1 ? "$(#{$1})" : $&}.dump
     case name
     when /^prefix$/
+      v_runtime[:prefix] = val.slice(1..-2)
       val = "(TOPDIR || DESTDIR + #{val})"
     when /^ARCH_FLAG$/
       val = "arch_flag || #{val}" if universal
@@ -193,6 +194,7 @@
     x
   end
 end
+v_others.map!{|x| x.gsub(v_runtime[:prefix], "$(prefix)") }
 v_others.compact!
 
 if $install_name
patches/ruby/1.8.4/backported-ossl-fixes.diff000066400000021562147511530510014700 0ustar00diff -r -u ruby-1.8.5-p231/ext/openssl/extconf.rb ruby-1.8.5-p231-fixed/ext/openssl/extconf.rb
--- ruby-1.8.5-p231/ext/openssl/extconf.rb	2007-02-13 08:01:19.000000000 +0900
+++ ruby-1.8.5-p231-fixed/ext/openssl/extconf.rb	2010-07-13 02:18:18.000000000 +0800
@@ -36,8 +36,6 @@
 message "=== Checking for system dependent stuff... ===\n"
 have_library("nsl", "t_open")
 have_library("socket", "socket")
-have_header("unistd.h")
-have_header("sys/time.h")
 have_header("assert.h")
 
 message "=== Checking for required stuff... ===\n"
@@ -61,6 +59,8 @@
   exit 1
 end
 
+%w"rb_str_set_len rb_block_call".each {|func| have_func(func, "ruby.h")}
+
 message "=== Checking for OpenSSL features... ===\n"
 have_func("ERR_peek_last_error")
 have_func("BN_mod_add")
@@ -83,6 +83,8 @@
 have_func("HMAC_CTX_copy")
 have_func("HMAC_CTX_init")
 have_func("PEM_def_callback")
+have_func("PKCS5_PBKDF2_HMAC")
+have_func("PKCS5_PBKDF2_HMAC_SHA1")
 have_func("X509V3_set_nconf")
 have_func("X509V3_EXT_nconf_nid")
 have_func("X509_CRL_add0_revoked")
@@ -92,6 +94,7 @@
 have_func("X509_STORE_get_ex_data")
 have_func("X509_STORE_set_ex_data")
 have_func("OBJ_NAME_do_all_sorted")
+have_func("SSL_SESSION_get_id")
 have_func("OPENSSL_cleanse")
 if try_compile("#define FOO(a, ...) foo(a, ##__VA_ARGS__)\n int x(){FOO(1);FOO(1,2);FOO(1,2,3);}\n")
   $defs.push("-DHAVE_VA_ARGS_MACRO")
diff -r -u ruby-1.8.5-p231/ext/openssl/openssl_missing.c ruby-1.8.5-p231-fixed/ext/openssl/openssl_missing.c
--- ruby-1.8.5-p231/ext/openssl/openssl_missing.c	2007-02-13 08:01:19.000000000 +0900
+++ ruby-1.8.5-p231-fixed/ext/openssl/openssl_missing.c	2010-07-13 02:22:10.000000000 +0800
@@ -22,17 +22,15 @@
 #include "openssl_missing.h"
 
 #if !defined(HAVE_HMAC_CTX_COPY)
-int
+void
 HMAC_CTX_copy(HMAC_CTX *out, HMAC_CTX *in)
 {
-    if (!out || !in) return 0;
+    if (!out || !in) return;
     memcpy(out, in, sizeof(HMAC_CTX));
 
-    if (!EVP_MD_CTX_copy(&out->md_ctx, &in->md_ctx)
-	    || !EVP_MD_CTX_copy(&out->i_ctx, &in->i_ctx)
-	    || !EVP_MD_CTX_copy(&out->o_ctx, &in->o_ctx))
-	return 0;
-    return 1;
+    EVP_MD_CTX_copy(&out->md_ctx, &in->md_ctx);
+    EVP_MD_CTX_copy(&out->i_ctx, &in->i_ctx);
+    EVP_MD_CTX_copy(&out->o_ctx, &in->o_ctx);
 }
 #endif /* HAVE_HMAC_CTX_COPY */
 #endif /* NO_HMAC */
diff -r -u ruby-1.8.5-p231/ext/openssl/openssl_missing.h ruby-1.8.5-p231-fixed/ext/openssl/openssl_missing.h
--- ruby-1.8.5-p231/ext/openssl/openssl_missing.h	2007-02-13 08:01:19.000000000 +0900
+++ ruby-1.8.5-p231-fixed/ext/openssl/openssl_missing.h	2010-07-13 02:22:10.000000000 +0800
@@ -15,6 +15,10 @@
 extern "C" {
 #endif
 
+#ifndef TYPEDEF_D2I_OF
+typedef char *d2i_of_void();
+#endif
+
 /*
  * These functions are not included in headers of OPENSSL <= 0.9.6b
  */
@@ -56,14 +60,33 @@
 	(char *(*)())d2i_PKCS7_RECIP_INFO, (char *)ri)
 #endif
 
+#if !defined(HAVE_EVP_MD_CTX_INIT)
 void HMAC_CTX_init(HMAC_CTX *ctx);
-int HMAC_CTX_copy(HMAC_CTX *out, HMAC_CTX *in);
+#endif
+
+#if !defined(HAVE_HMAC_CTX_COPY)
+void HMAC_CTX_copy(HMAC_CTX *out, HMAC_CTX *in);
+#endif
+
+#if !defined(HAVE_HMAC_CTX_CLEANUP)
 void HMAC_CTX_cleanup(HMAC_CTX *ctx);
+#endif
 
+#if !defined(HAVE_EVP_MD_CTX_CREATE)
 EVP_MD_CTX *EVP_MD_CTX_create(void);
+#endif
+
+#if !defined(HAVE_EVP_MD_CTX_INIT)
 void EVP_MD_CTX_init(EVP_MD_CTX *ctx);
+#endif
+
+#if !defined(HAVE_EVP_MD_CTX_CLEANUP)
 int EVP_MD_CTX_cleanup(EVP_MD_CTX *ctx);
+#endif
+
+#if !defined(HAVE_EVP_MD_CTX_DESTROY)
 void EVP_MD_CTX_destroy(EVP_MD_CTX *ctx);
+#endif
 
 #if !defined(HAVE_EVP_CIPHER_CTX_COPY)
 int EVP_CIPHER_CTX_copy(EVP_CIPHER_CTX *out, EVP_CIPHER_CTX *in);
@@ -107,19 +130,54 @@
 #define OPENSSL_cleanse(p, l) memset(p, 0, l)
 #endif
 
+#if !defined(HAVE_X509_STORE_SET_EX_DATA)
 void *X509_STORE_get_ex_data(X509_STORE *str, int idx);
 int X509_STORE_set_ex_data(X509_STORE *str, int idx, void *data);
+#endif
+
+#if !defined(HAVE_X509_CRL_SET_VERSION)
 int X509_CRL_set_version(X509_CRL *x, long version);
+#endif
+
+#if !defined(HAVE_X509_CRL_SET_ISSUER_NAME)
 int X509_CRL_set_issuer_name(X509_CRL *x, X509_NAME *name);
+#endif
+
+#if !defined(HAVE_X509_CRL_SORT)
 int X509_CRL_sort(X509_CRL *c);
+#endif
+
+#if !defined(HAVE_X509_CRL_ADD0_REVOKED)
 int X509_CRL_add0_revoked(X509_CRL *crl, X509_REVOKED *rev);
+#endif
+
+#if !defined(HAVE_BN_MOD_SQR)
 int BN_mod_sqr(BIGNUM *r, const BIGNUM *a, const BIGNUM *m, BN_CTX *ctx);
+#endif
+
+#if !defined(HAVE_BN_MOD_ADD)
 int BN_mod_add(BIGNUM *r, const BIGNUM *a, const BIGNUM *b, const BIGNUM *m, BN_CTX *ctx);
+#endif
+
+#if !defined(HAVE_BN_MOD_SUB)
 int BN_mod_sub(BIGNUM *r, const BIGNUM *a, const BIGNUM *b, const BIGNUM *m, BN_CTX *ctx);
+#endif
+
+#if !defined(HAVE_BN_RAND_RANGE)
 int BN_rand_range(BIGNUM *r, BIGNUM *range);
+#endif
+
+#if !defined(HAVE_BN_PSEUDO_RAND_RANGE)
 int BN_pseudo_rand_range(BIGNUM *r, BIGNUM *range);
+#endif
+
+#if !defined(HAVE_CONF_GET1_DEFAULT_CONFIG_FILE)
 char *CONF_get1_default_config_file(void);
+#endif
+
+#if !defined(HAVE_PEM_DEF_CALLBACK)
 int PEM_def_callback(char *buf, int num, int w, void *key);
+#endif
 
 #if defined(__cplusplus)
 }
diff -r -u ruby-1.8.5-p231/ext/openssl/ossl_hmac.c ruby-1.8.5-p231-fixed/ext/openssl/ossl_hmac.c
--- ruby-1.8.5-p231/ext/openssl/ossl_hmac.c	2007-02-13 08:01:19.000000000 +0900
+++ ruby-1.8.5-p231-fixed/ext/openssl/ossl_hmac.c	2010-07-13 02:18:36.000000000 +0800
@@ -57,6 +57,12 @@
     return obj;
 }
 
+
+/*
+ *  call-seq:
+ *     HMAC.new(key, digest) -> hmac
+ *
+ */
 static VALUE
 ossl_hmac_initialize(VALUE self, VALUE key, VALUE digest)
 {
@@ -64,7 +70,7 @@
 
     StringValue(key);
     GetHMAC(self, ctx);
-    HMAC_Init_ex(ctx, RSTRING(key)->ptr, RSTRING(key)->len,
+    HMAC_Init_ex(ctx, RSTRING_PTR(key), RSTRING_LEN(key),
 		 GetDigestPtr(digest), NULL);
 
     return self;
@@ -81,12 +87,15 @@
     GetHMAC(self, ctx1);
     SafeGetHMAC(other, ctx2);
 
-    if (!HMAC_CTX_copy(ctx1, ctx2)) {
-	ossl_raise(eHMACError, NULL);
-    }
+    HMAC_CTX_copy(ctx1, ctx2);
     return self;
 }
 
+/*
+ *  call-seq:
+ *     hmac.update(string) -> self
+ *
+ */
 static VALUE
 ossl_hmac_update(VALUE self, VALUE data)
 {
@@ -94,7 +103,7 @@
 
     StringValue(data);
     GetHMAC(self, ctx);
-    HMAC_Update(ctx, RSTRING(data)->ptr, RSTRING(data)->len);
+    HMAC_Update(ctx, RSTRING_PTR(data), RSTRING_LEN(data));
 
     return self;
 }
@@ -104,9 +113,7 @@
 {
     HMAC_CTX final;
 
-    if (!HMAC_CTX_copy(&final, ctx)) {
-	ossl_raise(eHMACError, NULL);
-    }
+    HMAC_CTX_copy(&final, ctx);
     if (!(*buf = OPENSSL_malloc(HMAC_size(&final)))) {
 	HMAC_CTX_cleanup(&final);
 	OSSL_Debug("Allocating %d mem", HMAC_size(&final));
@@ -116,6 +123,11 @@
     HMAC_CTX_cleanup(&final);
 }
 
+/*
+ *  call-seq:
+ *     hmac.digest -> aString
+ *
+ */
 static VALUE
 ossl_hmac_digest(VALUE self)
 {
@@ -131,6 +143,11 @@
     return digest;
 }
 
+/*
+ *  call-seq:
+ *     hmac.hexdigest -> aString
+ *
+ */
 static VALUE
 ossl_hmac_hexdigest(VALUE self)
 {
@@ -151,6 +168,27 @@
     return hexdigest;
 }
 
+/*
+ *  call-seq:
+ *     hmac.reset -> self
+ *
+ */
+static VALUE
+ossl_hmac_reset(VALUE self)
+{
+    HMAC_CTX *ctx;
+
+    GetHMAC(self, ctx);
+    HMAC_Init_ex(ctx, NULL, 0, NULL, NULL);
+
+    return self;
+}
+
+/*
+ *  call-seq:
+ *     HMAC.digest(digest, key, data) -> aString
+ *
+ */
 static VALUE
 ossl_hmac_s_digest(VALUE klass, VALUE digest, VALUE key, VALUE data)
 {
@@ -159,12 +197,17 @@
 	
     StringValue(key);
     StringValue(data);
-    buf = HMAC(GetDigestPtr(digest), RSTRING(key)->ptr, RSTRING(key)->len,
-	       RSTRING(data)->ptr, RSTRING(data)->len, NULL, &buf_len);
+    buf = HMAC(GetDigestPtr(digest), RSTRING_PTR(key), RSTRING_LEN(key),
+	       RSTRING_PTR(data), RSTRING_LEN(data), NULL, &buf_len);
 
     return rb_str_new(buf, buf_len);
 }
 
+/*
+ *  call-seq:
+ *     HMAC.digest(digest, key, data) -> aString
+ *
+ */
 static VALUE
 ossl_hmac_s_hexdigest(VALUE klass, VALUE digest, VALUE key, VALUE data)
 {
@@ -175,8 +218,8 @@
     StringValue(key);
     StringValue(data);
 	
-    buf = HMAC(GetDigestPtr(digest), RSTRING(key)->ptr, RSTRING(key)->len,
-	       RSTRING(data)->ptr, RSTRING(data)->len, NULL, &buf_len);
+    buf = HMAC(GetDigestPtr(digest), RSTRING_PTR(key), RSTRING_LEN(key),
+	       RSTRING_PTR(data), RSTRING_LEN(data), NULL, &buf_len);
     if (string2hex(buf, buf_len, &hexbuf, NULL) != 2 * buf_len) {
 	ossl_raise(eHMACError, "Cannot convert buf to hexbuf");
     }
@@ -191,6 +234,10 @@
 void
 Init_ossl_hmac()
 {
+#if 0 /* let rdoc know about mOSSL */
+    mOSSL = rb_define_module("OpenSSL");
+#endif
+
     eHMACError = rb_define_class_under(mOSSL, "HMACError", eOSSLError);
 	
     cHMAC = rb_define_class_under(mOSSL, "HMAC", rb_cObject);
@@ -202,6 +249,7 @@
     rb_define_method(cHMAC, "initialize", ossl_hmac_initialize, 2);
     rb_define_copy_func(cHMAC, ossl_hmac_copy);
 
+    rb_define_method(cHMAC, "reset", ossl_hmac_reset, 0);
     rb_define_method(cHMAC, "update", ossl_hmac_update, 1);
     rb_define_alias(cHMAC, "<<", "update");
     rb_define_method(cHMAC, "digest", ossl_hmac_digest, 0);
patches/ruby/1.8.4/syck.patch000066400000001147147511530510011625 0ustar00diff --git a/ext/syck/rubyext.c b/ext/syck/rubyext.c
index 078de4f..8c4027f 100644
--- a/ext/syck/rubyext.c
+++ b/ext/syck/rubyext.c
@@ -268,9 +268,13 @@ rb_syck_mktime(str, len)
     {
         char padded[] = "000000";
         char *end = ptr + 1;
+        char *p = end;
         while ( isdigit( *end ) ) end++;
-        MEMCPY(padded, ptr + 1, char, end - (ptr + 1));
-        usec = strtol(padded, NULL, 10);
+        if (end - p < sizeof(padded)) {
+            MEMCPY(padded, ptr + 1, char, end - (ptr + 1));
+            p = padded;
+        }
+        usec = strtol(p, NULL, 10);
     }
     else
     {
patches/ruby/1.8.4/no_sslv2.diff000066400000001252147511530510012227 0ustar00Index: ossl_ssl.c
===================================================================
--- a/ext/openssl/ossl_ssl.c	(revision 32381)
+++ b/ext/openssl/ossl_ssl.c	(revision 32382)
@@ -107,9 +107,12 @@
     OSSL_SSL_METHOD_ENTRY(TLSv1),
     OSSL_SSL_METHOD_ENTRY(TLSv1_server),
     OSSL_SSL_METHOD_ENTRY(TLSv1_client),
+#if defined(HAVE_SSLV2_METHOD) && defined(HAVE_SSLV2_SERVER_METHOD) && \
+        defined(HAVE_SSLV2_CLIENT_METHOD)	
     OSSL_SSL_METHOD_ENTRY(SSLv2),
     OSSL_SSL_METHOD_ENTRY(SSLv2_server),
     OSSL_SSL_METHOD_ENTRY(SSLv2_client),
+#endif
     OSSL_SSL_METHOD_ENTRY(SSLv3),
     OSSL_SSL_METHOD_ENTRY(SSLv3_server),
     OSSL_SSL_METHOD_ENTRY(SSLv3_client),
patches/ruby/1.8.4/railsbench.patch000066400000030257147511530510012772 0ustar00--- gc.c.orig	2005-12-16 05:58:51.000000000 +0100
+++ gc.c	2006-07-16 14:46:55.890625000 +0200
@@ -22,8 +22,16 @@
 #include <setjmp.h>
 #include <sys/types.h>
 
+#ifdef _WIN32
+#include <string.h>
+#else
+#include <strings.h>
+#endif
+
 #ifdef HAVE_SYS_TIME_H
 #include <sys/time.h>
+#elif defined(_WIN32)
+#include <time.h> 
 #endif
 
 #ifdef HAVE_SYS_RESOURCE_H
@@ -175,8 +183,17 @@
 	RUBY_CRITICAL(free(x));
 }
 
+#if HAVE_LONG_LONG
+#define GC_TIME_TYPE LONG_LONG
+#else
+#define GC_TIME_TYPE long
+#endif
+
 extern int ruby_in_compile;
 static int dont_gc;
+static int gc_statistics = 0;
+static GC_TIME_TYPE gc_time = 0;
+static int gc_collections = 0;
 static int during_gc;
 static int need_call_final = 0;
 static st_table *finalizer_table = 0;
@@ -211,7 +228,7 @@
  *  Disables garbage collection, returning <code>true</code> if garbage
  *  collection was already disabled.
  *
- *     GC.disable   #=> false
+ *     GC.disable   #=> false or true
  *     GC.disable   #=> true
  *
  */
@@ -225,6 +242,104 @@
     return old;
 }
 
+/*
+ *  call-seq:
+ *     GC.enable_stats    => true or false
+ *
+ *  Enables garbage collection statistics, returning <code>true</code> if garbage
+ *  collection statistics was already enabled.
+ *
+ *     GC.enable_stats   #=> false or true
+ *     GC.enable_stats   #=> true
+ *
+ */
+
+VALUE
+rb_gc_enable_stats()
+{
+    int old = gc_statistics;
+    gc_statistics = Qtrue;
+    return old;
+}
+
+/*
+ *  call-seq:
+ *     GC.disable_stats    => true or false
+ *
+ *  Disables garbage collection statistics, returning <code>true</code> if garbage
+ *  collection statistics was already disabled.
+ *
+ *     GC.disable_stats   #=> false or true
+ *     GC.disable_stats   #=> true
+ *
+ */
+
+VALUE
+rb_gc_disable_stats()
+{
+    int old = gc_statistics;
+    gc_statistics = Qfalse;
+    return old;
+}
+
+/*
+ *  call-seq:
+ *     GC.clear_stats    => nil
+ *
+ *  Clears garbage collection statistics, returning nil. This resets the number
+ *  of collections (GC.collections) and the time used (GC.time) to 0.
+ *
+ *     GC.clear_stats    #=> nil
+ *
+ */
+
+VALUE
+rb_gc_clear_stats()
+{
+    gc_collections = 0;
+    gc_time = 0;
+    return Qnil; 
+}
+
+/*
+ *  call-seq:
+ *     GC.collections    => Integer
+ *
+ *  Returns the number of garbage collections performed while GC statistics collection
+ *  was enabled.
+ *
+ *     GC.collections    #=> 35
+ *
+ */
+
+VALUE
+rb_gc_collections()
+{
+    return INT2NUM(gc_collections);
+}
+
+/*
+ *  call-seq:
+ *     GC.time    => Integer
+ *
+ *  Returns the time spent during garbage collection while GC statistics collection
+ *  was enabled (in micro seconds).
+ *
+ *     GC.time    #=> 20000
+ *
+ */
+
+VALUE
+rb_gc_time()
+{
+#if HAVE_LONG_LONG
+    return LL2NUM(gc_time);
+#else
+    return LONG2NUM(gc_time);
+#endif
+}
+
+
 VALUE rb_mGC;
 
 static struct gc_list {
@@ -308,7 +423,7 @@
 static RVALUE *freelist = 0;
 static RVALUE *deferred_final_list = 0;
 
-#define HEAPS_INCREMENT 10
+static int heaps_increment = 10;
 static struct heaps_slot {
     RVALUE *slot;
     int limit;
@@ -316,13 +431,141 @@
 static int heaps_length = 0;
 static int heaps_used   = 0;
 
-#define HEAP_MIN_SLOTS 10000
-static int heap_slots = HEAP_MIN_SLOTS;
+static int heap_min_slots = 10000;
+static int heap_slots = 10000;
 
-#define FREE_MIN  4096
+static int heap_free_min = 4096;
+
+static long initial_malloc_limit = GC_MALLOC_LIMIT;
+
+static int verbose_gc_stats = Qfalse;
+
+static FILE* gc_data_file = NULL;
 
 static RVALUE *himem, *lomem;
 
+static void set_gc_parameters()
+{
+    char *gc_stats_ptr, *min_slots_ptr, *free_min_ptr,
+	*heap_incr_ptr, *malloc_limit_ptr, *gc_heap_file_ptr;
+
+    gc_data_file = stderr;
+    
+    gc_stats_ptr = getenv("RUBY_GC_STATS");
+    if (gc_stats_ptr != NULL) {
+	int gc_stats_i = atoi(gc_stats_ptr);
+	if (gc_stats_i > 0) {
+	    verbose_gc_stats = Qtrue;
+	}
+    }
+    
+    gc_heap_file_ptr = getenv("RUBY_GC_DATA_FILE");
+    if (gc_heap_file_ptr != NULL) {
+	FILE* data_file = fopen(gc_heap_file_ptr, "w"); 
+	if (data_file != NULL) {
+	    gc_data_file = data_file;
+	}
+	else {
+	    fprintf(stderr,
+		    "can't open gc log file %s for writing, using default\n", gc_heap_file_ptr);
+	}
+    }
+
+    min_slots_ptr = getenv("RUBY_HEAP_MIN_SLOTS");
+    if (min_slots_ptr != NULL) {
+	int min_slots_i = atoi(min_slots_ptr);
+        if (verbose_gc_stats) {
+	    fprintf(gc_data_file, "RUBY_HEAP_MIN_SLOTS=%s\n", min_slots_ptr);
+        }
+	if (min_slots_i > 0) {
+	    heap_slots = min_slots_i;
+	    heap_min_slots = min_slots_i;
+	}
+    }
+
+    free_min_ptr = getenv("RUBY_HEAP_FREE_MIN");
+    if (free_min_ptr != NULL) {
+	int free_min_i = atoi(free_min_ptr);
+        if (verbose_gc_stats) {
+	    fprintf(gc_data_file, "RUBY_HEAP_FREE_MIN=%s\n", free_min_ptr);
+	}
+	if (free_min_i > 0) {
+	    heap_free_min = free_min_i;
+	}
+    }
+
+    heap_incr_ptr = getenv("RUBY_HEAP_INCREMENT");
+    if (heap_incr_ptr != NULL) {
+	int heap_incr_i = atoi(heap_incr_ptr);
+        if (verbose_gc_stats) {
+	    fprintf(gc_data_file, "RUBY_HEAP_INCREMENT=%s\n", heap_incr_ptr);
+	}
+	if (heap_incr_i > 0) {
+	    heaps_increment = heap_incr_i;
+	}
+    }
+
+    malloc_limit_ptr = getenv("RUBY_GC_MALLOC_LIMIT");
+    if (malloc_limit_ptr != NULL) {
+	int malloc_limit_i = atol(malloc_limit_ptr);
+        if (verbose_gc_stats) {
+	    fprintf(gc_data_file, "RUBY_GC_MALLOC_LIMIT=%s\n", malloc_limit_ptr);
+	}
+	if (malloc_limit_i > 0) {
+	    initial_malloc_limit = malloc_limit_i;
+	}
+    }
+}
+
+/*
+ *  call-seq:
+ *     GC.dump    => nil
+ *
+ *  dumps information about the current GC data structures to the GC log file
+ *
+ *     GC.dump    #=> nil
+ *
+ */
+
+VALUE
+rb_gc_dump()
+{
+    int i;
+
+    for (i = 0; i < heaps_used; i++) {
+	int heap_size = heaps[i].limit;
+	fprintf(gc_data_file, "HEAP[%2d]: size=%7d\n", i, heap_size);
+    }
+
+    return Qnil;
+}
+
+/*
+ *  call-seq:
+ *     GC.log String  => String
+ *
+ *  Logs string to the GC data file and returns it.
+ *
+ *     GC.log "manual GC call"    #=> "manual GC call"
+ *
+ */
+
+VALUE
+rb_gc_log(self, original_str)
+     VALUE self, original_str;
+{
+    if (original_str == Qnil) {
+        fprintf(gc_data_file, "\n");
+    }
+    else {
+        VALUE str = StringValue(original_str);
+        char *p = RSTRING(str)->ptr;
+        fprintf(gc_data_file, "%s\n", p);
+    }
+    return original_str;
+}
+
+
 static void
 add_heap()
 {
@@ -333,7 +576,7 @@
 	struct heaps_slot *p;
 	int length;
 
-	heaps_length += HEAPS_INCREMENT;
+	heaps_length += heaps_increment;
 	length = heaps_length*sizeof(struct heaps_slot);
 	RUBY_CRITICAL(
 	    if (heaps_used > 0) {
@@ -350,10 +593,10 @@
 	RUBY_CRITICAL(p = heaps[heaps_used].slot = (RVALUE*)malloc(sizeof(RVALUE)*heap_slots));
 	heaps[heaps_used].limit = heap_slots;
 	if (p == 0) {
-	    if (heap_slots == HEAP_MIN_SLOTS) {
+	    if (heap_slots == heap_min_slots) {
 		rb_memerror();
 	    }
-	    heap_slots = HEAP_MIN_SLOTS;
+	    heap_slots = heap_min_slots;
 	    continue;
 	}
 	break;
@@ -1031,6 +1274,39 @@
     }
 }
 
+static char* obj_type(int tp)
+{
+    switch (tp) {
+	case T_NIL    : return "NIL";   
+	case T_OBJECT : return "OBJECT";
+	case T_CLASS  : return "CLASS";
+	case T_ICLASS : return "ICLASS";
+	case T_MODULE : return "MODULE";
+	case T_FLOAT  : return "FLOAT";
+	case T_STRING : return "STRING";
+	case T_REGEXP : return "REGEXP";
+	case T_ARRAY  : return "ARRAY";
+	case T_FIXNUM : return "FIXNUM";
+	case T_HASH   : return "HASH";
+	case T_STRUCT : return "STRUCT";
+	case T_BIGNUM : return "BIGNUM";
+	case T_FILE   : return "FILE";
+	    
+	case T_TRUE   : return "TRUE";
+	case T_FALSE  : return "FALSE";
+	case T_DATA   : return "DATA";
+	case T_MATCH  : return "MATCH";
+	case T_SYMBOL : return "SYMBOL";
+	    
+	case T_BLKTAG : return "BLKTAG";
+	case T_UNDEF  : return "UNDEF";
+	case T_VARMAP : return "VARMAP";
+	case T_SCOPE  : return "SCOPE";
+	case T_NODE   : return "NODE";
+	default: return "____";
+    }
+}
+
 static void
 gc_sweep()
 {
@@ -1039,6 +1315,15 @@
     int i;
     unsigned long live = 0;
 
+    unsigned long really_freed = 0;
+    int free_counts[256];
+    int live_counts[256];
+    int do_gc_stats = gc_statistics & verbose_gc_stats;
+
+    if (do_gc_stats) {
+	for (i = 0 ; i< 256; i++) { free_counts[i] = live_counts[i] = 0; }
+    }
+
     if (ruby_in_compile && ruby_parser_stack_on_heap()) {
 	/* should not reclaim nodes during compilation
            if yacc's semantic stack is not allocated on machine stack */
@@ -1070,6 +1355,9 @@
 	    if (!(p->as.basic.flags & FL_MARK)) {
 		if (p->as.basic.flags) {
 		    obj_free((VALUE)p);
+		    if (do_gc_stats) {
+			really_freed++;
+		    }
 		}
 		if (need_call_final && FL_TEST(p, FL_FINALIZE)) {
 		    p->as.free.flags = FL_MARK; /* remain marked */
@@ -1077,6 +1365,12 @@
 		    final_list = p;
 		}
 		else {
+		    if (do_gc_stats) {
+			int obt = p->as.basic.flags & T_MASK;
+			if (obt) {
+			    free_counts[obt]++;
+			}
+		    }
 		    p->as.free.flags = 0;
 		    p->as.free.next = freelist;
 		    freelist = p;
@@ -1090,10 +1384,13 @@
 	    else {
 		RBASIC(p)->flags &= ~FL_MARK;
 		live++;
+		if (do_gc_stats) {
+		    live_counts[RANY((VALUE)p)->as.basic.flags & T_MASK]++;
+		}
 	    }
 	    p++;
 	}
-	if (n == heaps[i].limit && freed > FREE_MIN) {
+	if (n == heaps[i].limit && freed > heap_free_min) {
 	    RVALUE *pp;
 
 	    heaps[i].limit = 0;
@@ -1108,14 +1405,28 @@
     }
     if (malloc_increase > malloc_limit) {
 	malloc_limit += (malloc_increase - malloc_limit) * (double)live / (live + freed);
-	if (malloc_limit < GC_MALLOC_LIMIT) malloc_limit = GC_MALLOC_LIMIT;
+	if (malloc_limit < initial_malloc_limit) malloc_limit = initial_malloc_limit;
     }
     malloc_increase = 0;
-    if (freed < FREE_MIN) {
+    if (freed < heap_free_min) {
 	add_heap();
     }
     during_gc = 0;
 
+    if (do_gc_stats) {
+	fprintf(gc_data_file, "objects processed: %.7d\n", live+freed);
+	fprintf(gc_data_file, "live objects     : %.7d\n", live);
+	fprintf(gc_data_file, "freelist objects : %.7d\n", freed - really_freed);
+	fprintf(gc_data_file, "freed objects    : %.7d\n", really_freed);
+	for(i=0; i<256; i++) {
+	    if (free_counts[i]>0) {
+		fprintf(gc_data_file,
+			"kept %.7d / freed %.7d objects of type %s\n",
+			live_counts[i], free_counts[i], obj_type(i));
+	    }
+	}
+    }
+
     /* clear finalization list */
     if (final_list) {
 	deferred_final_list = final_list;
@@ -1311,6 +1622,7 @@
     struct gc_list *list;
     struct FRAME * volatile frame; /* gcc 2.7.2.3 -O2 bug??  */
     jmp_buf save_regs_gc_mark;
+    struct timeval gctv1, gctv2;
     SET_STACK_END;
 
 #ifdef HAVE_NATIVETHREAD
@@ -1327,6 +1639,14 @@
     if (during_gc) return;
     during_gc++;
 
+    if (gc_statistics) {
+        gc_collections++;
+	gettimeofday(&gctv1, NULL);
+        if (verbose_gc_stats) {
+	    fprintf(gc_data_file, "Garbage collection started\n");
+	}
+    }
+
     init_mark_stack();
 
     /* mark frame stack */
@@ -1409,6 +1729,17 @@
 	}
     }
     gc_sweep();
+
+    if (gc_statistics) {
+        GC_TIME_TYPE musecs_used;
+	gettimeofday(&gctv2, NULL);
+	musecs_used = ((GC_TIME_TYPE)(gctv2.tv_sec - gctv1.tv_sec) * 1000000) + (gctv2.tv_usec - gctv1.tv_usec);
+	gc_time += musecs_used;
+
+	if (verbose_gc_stats) {
+	    fprintf(gc_data_file, "GC time: %d msec\n", musecs_used / 1000);
+	}
+    }
 }
 
 void
@@ -1522,6 +1853,7 @@
     if (!rb_gc_stack_start) {
 	Init_stack(0);
     }
+    set_gc_parameters();
     add_heap();
 }
 
@@ -1920,6 +2252,14 @@
     rb_define_singleton_method(rb_mGC, "disable", rb_gc_disable, 0);
     rb_define_method(rb_mGC, "garbage_collect", rb_gc_start, 0);
 
+    rb_define_singleton_method(rb_mGC, "enable_stats", rb_gc_enable_stats, 0);
+    rb_define_singleton_method(rb_mGC, "disable_stats", rb_gc_disable_stats, 0);
+    rb_define_singleton_method(rb_mGC, "clear_stats", rb_gc_clear_stats, 0);
+    rb_define_singleton_method(rb_mGC, "collections", rb_gc_collections, 0);
+    rb_define_singleton_method(rb_mGC, "time", rb_gc_time, 0);
+    rb_define_singleton_method(rb_mGC, "dump", rb_gc_dump, 0);
+    rb_define_singleton_method(rb_mGC, "log", rb_gc_log, 1);
+
     rb_mObSpace = rb_define_module("ObjectSpace");
     rb_define_module_function(rb_mObSpace, "each_object", os_each_obj, -1);
     rb_define_module_function(rb_mObSpace, "garbage_collect", rb_gc_start, 0);
patches/ruby/1.8.4/stdout-rouge-fix.patch000066400000001273147511530510014101 0ustar00--- a/lib/mkmf.rb	2009-06-10 09:09:22.000000000 +0200
+++ b/lib/mkmf.rb	2011-11-12 02:53:05.862766935 +0100
@@ -168,19 +168,25 @@
 module Logging
   @log = nil
   @logfile = 'mkmf.log'
-  @orgerr = $stderr.dup
-  @orgout = $stdout.dup
   @postpone = 0
 
   def self::open
     @log ||= File::open(@logfile, 'w')
     @log.sync = true
+    orgerr = $stderr.dup
+    orgout = $stdout.dup
     $stderr.reopen(@log)
     $stdout.reopen(@log)
     yield
   ensure
-    $stderr.reopen(@orgerr)
-    $stdout.reopen(@orgout)
+    if orgerr
+      $stderr.reopen(orgerr)
+      orgerr.close
+    end
+    if orgout
+      $stdout.reopen(orgout)
+      orgout.close
+    end
   end
 
   def self::message(*s)
patches/ruby/1.8.4/openssl-1.0.patch000066400000016005147511530510012632 0ustar00From 46b84175dfac14a92fd6bcf3b03bc3c3715ab6cb Mon Sep 17 00:00:00 2001
From: nahi <nahi@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>
Date: Sat, 6 Mar 2010 21:47:30 +0000
Subject: [PATCH] backport the commit from trunk:
 Sun Feb 28 11:49:35 2010  NARUSE, Yui  <naruse@ruby-lang.org>

        * openssl/ossl.c (OSSL_IMPL_SK2ARY): for OpenSSL 1.0.
          patched by Jeroen van Meeuwen at [ruby-core:25210]
          fixed by Nobuyoshi Nakada [ruby-core:25238],
          Hongli Lai [ruby-core:27417],
          and Motohiro KOSAKI [ruby-core:28063]

        * ext/openssl/ossl_ssl.c (ossl_ssl_method_tab),
          (ossl_ssl_cipher_to_ary): constified.

        * ext/openssl/ossl_pkcs7.c (pkcs7_get_certs, pkcs7_get_crls):
          split pkcs7_get_certs_or_crls.


git-svn-id: http://svn.ruby-lang.org/repos/ruby/branches/ruby_1_8@26838 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
---
 ext/openssl/ossl.c          |    6 +++---
 ext/openssl/ossl.h          |    7 +++++++
 ext/openssl/ossl_pkcs7.c    |   40 ++++++++++++++++++++++++++++++----------
 ext/openssl/ossl_ssl.c      |    4 ++--
 ext/openssl/ossl_x509attr.c |    5 +++--
 ext/openssl/ossl_x509crl.c  |    4 ++--
 6 files changed, 47 insertions(+), 19 deletions(-)

diff --git a/ext/openssl/ossl.c b/ext/openssl/ossl.c
index d4a2dc1..85ba654 100644
--- a/ext/openssl/ossl.c
+++ b/ext/openssl/ossl.c
@@ -92,7 +92,7 @@ ossl_x509_ary2sk(VALUE ary)
 
 #define OSSL_IMPL_SK2ARY(name, type)	        \
 VALUE						\
-ossl_##name##_sk2ary(STACK *sk)			\
+ossl_##name##_sk2ary(STACK_OF(type) *sk)	\
 {						\
     type *t;					\
     int i, num;					\
@@ -102,7 +102,7 @@ ossl_##name##_sk2ary(STACK *sk)			\
 	OSSL_Debug("empty sk!");		\
 	return Qnil;				\
     }						\
-    num = sk_num(sk);				\
+    num = sk_##type##_num(sk);			\
     if (num < 0) {				\
 	OSSL_Debug("items in sk < -1???");	\
 	return rb_ary_new();			\
@@ -110,7 +110,7 @@ ossl_##name##_sk2ary(STACK *sk)			\
     ary = rb_ary_new2(num);			\
 						\
     for (i=0; i<num; i++) {			\
-	t = (type *)sk_value(sk, i);		\
+	t = sk_##type##_value(sk, i);		\
 	rb_ary_push(ary, ossl_##name##_new(t));	\
     }						\
     return ary;					\
diff --git a/ext/openssl/ossl.h b/ext/openssl/ossl.h
index 9215dc4..d0edb7d 100644
--- a/ext/openssl/ossl.h
+++ b/ext/openssl/ossl.h
@@ -108,6 +108,13 @@ extern VALUE eOSSLError;
 } while (0)
 
 /*
+ * Compatibility
+ */
+#if OPENSSL_VERSION_NUMBER >= 0x10000000L
+#define STACK _STACK
+#endif
+
+/*
  * String to HEXString conversion
  */
 int string2hex(const unsigned char *, int, char **, int *);
diff --git a/ext/openssl/ossl_pkcs7.c b/ext/openssl/ossl_pkcs7.c
index fe1ef7c..b0cc656 100644
--- a/ext/openssl/ossl_pkcs7.c
+++ b/ext/openssl/ossl_pkcs7.c
@@ -572,12 +572,11 @@ ossl_pkcs7_add_certificate(VALUE self, VALUE cert)
     return self;
 }
 
-static STACK *
-pkcs7_get_certs_or_crls(VALUE self, int want_certs)
+static STACK_OF(X509) *
+pkcs7_get_certs(VALUE self)
 {
     PKCS7 *pkcs7;
     STACK_OF(X509) *certs;
-    STACK_OF(X509_CRL) *crls;
     int i;
 
     GetPKCS7(self, pkcs7);
@@ -585,17 +584,38 @@ pkcs7_get_certs_or_crls(VALUE self, int want_certs)
     switch(i){
     case NID_pkcs7_signed:
         certs = pkcs7->d.sign->cert;
-        crls = pkcs7->d.sign->crl;
         break;
     case NID_pkcs7_signedAndEnveloped:
         certs = pkcs7->d.signed_and_enveloped->cert;
+        break;
+    default:
+        certs = NULL;
+    }
+
+    return certs;
+}
+
+static STACK_OF(X509_CRL) *
+pkcs7_get_crls(VALUE self)
+{
+    PKCS7 *pkcs7;
+    STACK_OF(X509_CRL) *crls;
+    int i;
+
+    GetPKCS7(self, pkcs7);
+    i = OBJ_obj2nid(pkcs7->type);
+    switch(i){
+    case NID_pkcs7_signed:
+        crls = pkcs7->d.sign->crl;
+        break;
+    case NID_pkcs7_signedAndEnveloped:
         crls = pkcs7->d.signed_and_enveloped->crl;
         break;
     default:
-        certs = crls = NULL;
+        crls = NULL;
     }
 
-    return want_certs ? certs : crls;
+    return crls;
 }
 
 static VALUE
@@ -610,7 +630,7 @@ ossl_pkcs7_set_certificates(VALUE self, VALUE ary)
     STACK_OF(X509) *certs;
     X509 *cert;
 
-    certs = pkcs7_get_certs_or_crls(self, 1);
+    certs = pkcs7_get_certs(self);
     while((cert = sk_X509_pop(certs))) X509_free(cert);
     rb_block_call(ary, rb_intern("each"), 0, 0, ossl_pkcs7_set_certs_i, self);
 
@@ -620,7 +640,7 @@ ossl_pkcs7_set_certificates(VALUE self, VALUE ary)
 static VALUE
 ossl_pkcs7_get_certificates(VALUE self)
 {
-    return ossl_x509_sk2ary(pkcs7_get_certs_or_crls(self, 1));
+    return ossl_x509_sk2ary(pkcs7_get_certs(self));
 }
 
 static VALUE
@@ -650,7 +670,7 @@ ossl_pkcs7_set_crls(VALUE self, VALUE ary)
     STACK_OF(X509_CRL) *crls;
     X509_CRL *crl;
 
-    crls = pkcs7_get_certs_or_crls(self, 0);
+    crls = pkcs7_get_crls(self);
     while((crl = sk_X509_CRL_pop(crls))) X509_CRL_free(crl);
     rb_block_call(ary, rb_intern("each"), 0, 0, ossl_pkcs7_set_crls_i, self);
 
@@ -660,7 +680,7 @@ ossl_pkcs7_set_crls(VALUE self, VALUE ary)
 static VALUE
 ossl_pkcs7_get_crls(VALUE self)
 {
-    return ossl_x509crl_sk2ary(pkcs7_get_certs_or_crls(self, 0));
+    return ossl_x509crl_sk2ary(pkcs7_get_crls(self));
 }
 
 static VALUE
diff --git a/ext/openssl/ossl_ssl.c b/ext/openssl/ossl_ssl.c
index 432ca21..facf6ca 100644
--- a/ext/openssl/ossl_ssl.c
+++ b/ext/openssl/ossl_ssl.c
@@ -1291,10 +1291,10 @@ ossl_ssl_get_peer_cert_chain(VALUE self)
     }
     chain = SSL_get_peer_cert_chain(ssl);
     if(!chain) return Qnil;
-    num = sk_num(chain);
+    num = sk_X509_num(chain);
     ary = rb_ary_new2(num);
     for (i = 0; i < num; i++){
-	cert = (X509*)sk_value(chain, i);
+	cert = sk_X509_value(chain, i);
 	rb_ary_push(ary, ossl_x509_new(cert));
     }
 
diff --git a/ext/openssl/ossl_x509attr.c b/ext/openssl/ossl_x509attr.c
index 1f817cd..2a4c481 100644
--- a/ext/openssl/ossl_x509attr.c
+++ b/ext/openssl/ossl_x509attr.c
@@ -218,8 +218,9 @@ ossl_x509attr_get_value(VALUE self)
 	ossl_str_adjust(str, p);
     }
     else{
-	length = i2d_ASN1_SET_OF_ASN1_TYPE(attr->value.set, NULL,
-			i2d_ASN1_TYPE, V_ASN1_SET, V_ASN1_UNIVERSAL, 0);
+	length = i2d_ASN1_SET_OF_ASN1_TYPE(attr->value.set,
+			(unsigned char **) NULL, i2d_ASN1_TYPE,
+			V_ASN1_SET, V_ASN1_UNIVERSAL, 0);
 	str = rb_str_new(0, length);
 	p = (unsigned char *)RSTRING_PTR(str);
 	i2d_ASN1_SET_OF_ASN1_TYPE(attr->value.set, &p,
diff --git a/ext/openssl/ossl_x509crl.c b/ext/openssl/ossl_x509crl.c
index 1be9640..818fdba 100644
--- a/ext/openssl/ossl_x509crl.c
+++ b/ext/openssl/ossl_x509crl.c
@@ -264,7 +264,7 @@ ossl_x509crl_get_revoked(VALUE self)
     VALUE ary, revoked;
 
     GetX509CRL(self, crl);
-    num = sk_X509_CRL_num(X509_CRL_get_REVOKED(crl));
+    num = sk_X509_REVOKED_num(X509_CRL_get_REVOKED(crl));
     if (num < 0) {
 	OSSL_Debug("num < 0???");
 	return rb_ary_new();
@@ -272,7 +272,7 @@ ossl_x509crl_get_revoked(VALUE self)
     ary = rb_ary_new2(num);
     for(i=0; i<num; i++) {
 	/* NO DUP - don't free! */
-	rev = (X509_REVOKED *)sk_X509_CRL_value(X509_CRL_get_REVOKED(crl), i);
+	rev = sk_X509_REVOKED_value(X509_CRL_get_REVOKED(crl), i);
 	revoked = ossl_x509revoked_new(rev);
 	rb_ary_push(ary, revoked);
     }
-- 
1.7.0.3
patches/ruby/1.8.4/fix-irb-completion.diff000066400000000673147511530510014177 0ustar00diff --git a/lib/irb/completion.rb b/lib/irb/completion.rb
index 000658e..609dca3 100644
--- a/lib/irb/completion.rb
+++ b/lib/irb/completion.rb
@@ -157,7 +157,7 @@ module IRB
 	    end
 	    next if name != "IRB::Context" and 
 	      /^(IRB|SLex|RubyLex|RubyToken)/ =~ name
-	    candidates.concat m.instance_methods(false)
+	    candidates.concat m.instance_methods(false).map { |m| m.to_s }
 	  }
 	  candidates.sort!
 	  candidates.uniq!
patches/ruby/2.6.4/fix_string_corruption.patch000066400000000442147511530510015310 0ustar00--- a/symbol.c
+++ b/symbol.c
@@ -743,7 +743,8 @@ rb_str_intern(VALUE str)
 	enc = ascii;
     }
     else {
-	str = rb_str_new_frozen(str);
+    str = rb_str_dup(str);
+    OBJ_FREEZE(str);
     }
     str = rb_fstring(str);
     type = rb_str_symname_type(str, IDSET_ATTRSET_FOR_INTERN);
patches/ruby/2.4.0/ruby_2_4_gcc7.patch000066400000003005147511530510013170 0ustar00diff --git a/include/ruby/ruby.h b/include/ruby/ruby.h
index 6144c67234..4aa388849b 100644
--- a/include/ruby/ruby.h
+++ b/include/ruby/ruby.h
@@ -536,7 +536,11 @@ static inline int rb_type(VALUE obj);
 
 #ifdef __GNUC__
 #define RB_GC_GUARD(v) \
-    (*__extension__ ({volatile VALUE *rb_gc_guarded_ptr = &(v); rb_gc_guarded_ptr;}))
+    (*__extension__ ({ \
+       volatile VALUE *rb_gc_guarded_ptr = &(v); \
+       __asm__("" : : "m"(rb_gc_guarded_ptr)); \
+       rb_gc_guarded_ptr; \
+    }))
 #elif defined _MSC_VER
 #pragma optimize("", off)
 static inline volatile VALUE *rb_gc_guarded_ptr(volatile VALUE *ptr) {return ptr;}
diff --git a/marshal.c b/marshal.c
index a9926acf56..7e16d0b024 100644
--- a/marshal.c
+++ b/marshal.c
@@ -1026,7 +1026,7 @@ rb_marshal_dump_limited(VALUE obj, VALUE port, int limit)
     struct dump_arg *arg;
     VALUE wrapper; /* used to avoid memory leak in case of exception */
 
-    wrapper = TypedData_Make_Struct(rb_cData, struct dump_arg, &dump_arg_data, arg);
+    wrapper = TypedData_Make_Struct(0, struct dump_arg, &dump_arg_data, arg);
     arg->dest = 0;
     arg->symbols = st_init_numtable();
     arg->data    = rb_init_identtable();
@@ -2053,7 +2053,7 @@ rb_marshal_load_with_proc(VALUE port, VALUE proc)
     else {
        io_needed();
     }
-    wrapper = TypedData_Make_Struct(rb_cData, struct load_arg, &load_arg_data, arg);
+    wrapper = TypedData_Make_Struct(0, struct load_arg, &load_arg_data, arg);
     arg->infection = infection;
     arg->src = port;
     arg->offset = 0;
patches/ruby/2.4.0/random_c_using_NR_prefix.patch000066400000001012147511530510015577 0ustar00--- a/random.c
+++ b/random.c
@@ -505,7 +505,7 @@
     CryptGenRandom(prov, size, seed);
     return 0;
 }
-#elif defined __linux__ && defined SYS_getrandom
+#elif defined __linux__ && defined __NR_getrandom
 #include <linux/random.h>
 
 # ifndef GRND_NONBLOCK
@@ -522,7 +522,7 @@
 	if (!need_secure)
 	    flags = GRND_NONBLOCK;
 	errno = 0;
-	ret = syscall(SYS_getrandom, seed, size, flags);
+	ret = syscall(__NR_getrandom, seed, size, flags);
 	if (errno == ENOSYS) {
 	    ATOMIC_SET(try_syscall, 0);
 	    return -1;
patches/ruby/changeset_r53419.diff000066400000001010147511530510012672 0ustar00--- a/lib/rubygems/security.rb	(revision 53418)
+++ b/lib/rubygems/security.rb	(revision 53419)
@@ -340,7 +340,7 @@
   # Digest algorithm used to sign gems
 
   DIGEST_ALGORITHM =
-    if defined?(OpenSSL::Digest) then
+    if defined?(OpenSSL::Digest::SHA1) then
       OpenSSL::Digest::SHA1
     end
 
@@ -356,7 +356,7 @@
   # Algorithm for creating the key pair used to sign gems
 
   KEY_ALGORITHM =
-    if defined?(OpenSSL::PKey) then
+    if defined?(OpenSSL::PKey::RSA) then
       OpenSSL::PKey::RSA
     end
 
patches/ruby/GH-488.patch000066400000001064147511530510011021 0ustar00--- trunk/ext/openssl/ossl_ssl.c	2013/12/25 01:40:53	44401
+++ trunk/ext/openssl/ossl_ssl.c	2013/12/25 01:42:09	44402
@@ -2229,7 +2229,9 @@
     ossl_ssl_def_const(OP_NETSCAPE_REUSE_CIPHER_CHANGE_BUG);
     ossl_ssl_def_const(OP_SSLREF2_REUSE_CERT_TYPE_BUG);
     ossl_ssl_def_const(OP_MICROSOFT_BIG_SSLV3_BUFFER);
+#if defined(SSL_OP_MSIE_SSLV2_RSA_PADDING)
     ossl_ssl_def_const(OP_MSIE_SSLV2_RSA_PADDING);
+#endif
     ossl_ssl_def_const(OP_SSLEAY_080_CLIENT_DH_BUG);
     ossl_ssl_def_const(OP_TLS_D5_BUG);
     ossl_ssl_def_const(OP_TLS_BLOCK_PADDING_BUG);
patches/ruby/2.5.0/libressl_2_7.patch000066400000001067147511530510013135 0ustar00--- a/ext/openssl/extconf.rb
+++ b/ext/openssl/extconf.rb
@@ -122,8 +122,11 @@
 have_func("SSL_is_server")

 # added in 1.1.0
+if !have_struct_member("SSL", "ctx", "openssl/ssl.h") ||
+    try_static_assert("LIBRESSL_VERSION_NUMBER >= 0x2070000fL", "openssl/opensslv.h")
+  $defs.push("-DHAVE_OPAQUE_OPENSSL")
+end
 have_func("CRYPTO_lock") || $defs.push("-DHAVE_OPENSSL_110_THREADING_API")
-have_struct_member("SSL", "ctx", "openssl/ssl.h") || $defs.push("-DHAVE_OPAQUE_OPENSSL")
 have_func("BN_GENCB_new")
 have_func("BN_GENCB_free")
 have_func("BN_GENCB_get_arg")
patches/ruby/2.5.0/prelude_gcc_diagnostic.patch000066400000001331147511530510015321 0ustar00diff --git a/template/prelude.c.tmpl b/template/prelude.c.tmpl
index 11ec71f575..3cf74eda12 100644
--- a/template/prelude.c.tmpl
+++ b/template/prelude.c.tmpl
@@ -139,7 +139,7 @@ prelude_prefix_path(VALUE self)

 % unless preludes.empty?
 #define PRELUDE_STR(n) rb_usascii_str_new_static(prelude_##n.L0, sizeof(prelude_##n))
-#ifdef __GNUC__
+#if defined __GNUC__ && __GNUC__ >= 5
 # pragma GCC diagnostic push
 # pragma GCC diagnostic error "-Wmissing-field-initializers"
 #endif
@@ -169,7 +169,7 @@ prelude_eval(VALUE code, VALUE name, int line)
              NULL, ISEQ_TYPE_TOP, &optimization));
     rb_ast_dispose(ast);
 }
-#ifdef __GNUC__
+#if defined __GNUC__ && __GNUC__ >= 5
 # pragma GCC diagnostic pop
 #endif
 % end
patches/ruby/changeset_r45240.diff000066400000001032147511530510012667 0ustar00--- a/ext/readline/extconf.rb	(revision 45239)
+++ b/ext/readline/extconf.rb	(revision 45240)
@@ -19,6 +19,10 @@
   return super(func, headers)
 end
 
+def readline.have_type(type)
+  return super(type, headers)
+end
+
 dir_config('curses')
 dir_config('ncurses')
 dir_config('termcap')
@@ -94,4 +98,8 @@
 readline.have_func("rl_redisplay")
 readline.have_func("rl_insert_text")
 readline.have_func("rl_delete_text")
+unless readline.have_type("rl_hook_func_t")
+  $DEFS << "-Drl_hook_func_t=Function"
+end
+
 create_makefile("readline")
patches/ruby/2.1.2/openssl3.patch000066400000003333147511530510012411 0ustar00diff --git a/ext/openssl/extconf.rb b/ext/openssl/extconf.rb
index 8c04cb5..132d803 100644
--- a/ext/openssl/extconf.rb
+++ b/ext/openssl/extconf.rb
@@ -104,6 +104,9 @@
 have_func("SSLv2_method")
 have_func("SSLv2_server_method")
 have_func("SSLv2_client_method")
+have_func("SSLv3_method")
+have_func("SSLv3_server_method")
+have_func("SSLv3_client_method")
 have_func("TLSv1_1_method")
 have_func("TLSv1_1_server_method")
 have_func("TLSv1_1_client_method")
diff --git a/ext/openssl/ossl_ssl.c b/ext/openssl/ossl_ssl.c
index f7cb7f0..47111f6 100644
--- a/ext/openssl/ossl_ssl.c
+++ b/ext/openssl/ossl_ssl.c
@@ -109,9 +109,12 @@ static const struct {
     OSSL_SSL_METHOD_ENTRY(SSLv2_server),
     OSSL_SSL_METHOD_ENTRY(SSLv2_client),
 #endif
+#if defined(HAVE_SSLV3_METHOD) && defined(HAVE_SSLV3_SERVER_METHOD) && \
+        defined(HAVE_SSLV3_CLIENT_METHOD)
     OSSL_SSL_METHOD_ENTRY(SSLv3),
     OSSL_SSL_METHOD_ENTRY(SSLv3_server),
     OSSL_SSL_METHOD_ENTRY(SSLv3_client),
+#endif
     OSSL_SSL_METHOD_ENTRY(SSLv23),
     OSSL_SSL_METHOD_ENTRY(SSLv23_server),
     OSSL_SSL_METHOD_ENTRY(SSLv23_client),
diff --git a/test/openssl/test_ssl.rb b/test/openssl/test_ssl.rb
index 07e081b..0cbfcba 100644
--- a/test/openssl/test_ssl.rb
+++ b/test/openssl/test_ssl.rb
@@ -912,7 +912,7 @@ def test_unset_OP_ALL
   # that has been marked as forbidden, therefore either of these may be raised
   HANDSHAKE_ERRORS = [OpenSSL::SSL::SSLError, Errno::ECONNRESET]

-if OpenSSL::SSL::SSLContext::METHODS.include? :TLSv1
+if OpenSSL::SSL::SSLContext::METHODS.include?(:TLSv1) && OpenSSL::SSL::SSLContext::METHODS.include?(:SSLv3)

   def test_forbid_ssl_v3_for_client
     ctx_proc = Proc.new { |ctx| ctx.options = OpenSSL::SSL::OP_ALL | OpenSSL::SSL::OP_NO_SSLv3 }
patches/ruby/2.1.8/openssl3.patch000066400000003333147511530510012417 0ustar00diff --git a/ext/openssl/extconf.rb b/ext/openssl/extconf.rb
index 8c04cb5..132d803 100644
--- a/ext/openssl/extconf.rb
+++ b/ext/openssl/extconf.rb
@@ -104,6 +104,9 @@
 have_func("SSLv2_method")
 have_func("SSLv2_server_method")
 have_func("SSLv2_client_method")
+have_func("SSLv3_method")
+have_func("SSLv3_server_method")
+have_func("SSLv3_client_method")
 have_func("TLSv1_1_method")
 have_func("TLSv1_1_server_method")
 have_func("TLSv1_1_client_method")
diff --git a/ext/openssl/ossl_ssl.c b/ext/openssl/ossl_ssl.c
index f7cb7f0..47111f6 100644
--- a/ext/openssl/ossl_ssl.c
+++ b/ext/openssl/ossl_ssl.c
@@ -109,9 +109,12 @@ static const struct {
     OSSL_SSL_METHOD_ENTRY(SSLv2_server),
     OSSL_SSL_METHOD_ENTRY(SSLv2_client),
 #endif
+#if defined(HAVE_SSLV3_METHOD) && defined(HAVE_SSLV3_SERVER_METHOD) && \
+        defined(HAVE_SSLV3_CLIENT_METHOD)
     OSSL_SSL_METHOD_ENTRY(SSLv3),
     OSSL_SSL_METHOD_ENTRY(SSLv3_server),
     OSSL_SSL_METHOD_ENTRY(SSLv3_client),
+#endif
     OSSL_SSL_METHOD_ENTRY(SSLv23),
     OSSL_SSL_METHOD_ENTRY(SSLv23_server),
     OSSL_SSL_METHOD_ENTRY(SSLv23_client),
diff --git a/test/openssl/test_ssl.rb b/test/openssl/test_ssl.rb
index 07e081b..0cbfcba 100644
--- a/test/openssl/test_ssl.rb
+++ b/test/openssl/test_ssl.rb
@@ -912,7 +912,7 @@ def test_unset_OP_ALL
   # that has been marked as forbidden, therefore either of these may be raised
   HANDSHAKE_ERRORS = [OpenSSL::SSL::SSLError, Errno::ECONNRESET]

-if OpenSSL::SSL::SSLContext::METHODS.include? :TLSv1
+if OpenSSL::SSL::SSLContext::METHODS.include?(:TLSv1) && OpenSSL::SSL::SSLContext::METHODS.include?(:SSLv3)

   def test_forbid_ssl_v3_for_client
     ctx_proc = Proc.new { |ctx| ctx.options = OpenSSL::SSL::OP_ALL | OpenSSL::SSL::OP_NO_SSLv3 }
patches/ruby/2.2.1/fix_installing_bundled_gems.patch000066400000001136147511530510016364 0ustar00--- a/tool/rbinstall.rb
+++ b/tool/rbinstall.rb
@@ -725,9 +725,9 @@
     end
     # fix directory permissions
     # TODO: Gem.install should accept :dir_mode option or something
-    File.chmod($dir_mode, *Dir.glob(with_destdir(Gem.dir)+"/**/"))
+    File.chmod($dir_mode, *Dir.glob(with_destdir(gem_dir)+"/**/"))
     # fix .gemspec permissions
-    File.chmod($data_mode, *Dir.glob(with_destdir(Gem.dir)+"/specifications/*.gemspec"))
+    File.chmod($data_mode, *Dir.glob(with_destdir(gem_dir)+"/specifications/*.gemspec"))
   else
     puts "skip installing bundle gems because of lacking zlib"
   end
patches/ruby/2.2.1/openssl3.patch000066400000003333147511530510012411 0ustar00diff --git a/ext/openssl/extconf.rb b/ext/openssl/extconf.rb
index 8c04cb5..132d803 100644
--- a/ext/openssl/extconf.rb
+++ b/ext/openssl/extconf.rb
@@ -104,6 +104,9 @@
 have_func("SSLv2_method")
 have_func("SSLv2_server_method")
 have_func("SSLv2_client_method")
+have_func("SSLv3_method")
+have_func("SSLv3_server_method")
+have_func("SSLv3_client_method")
 have_func("TLSv1_1_method")
 have_func("TLSv1_1_server_method")
 have_func("TLSv1_1_client_method")
diff --git a/ext/openssl/ossl_ssl.c b/ext/openssl/ossl_ssl.c
index f7cb7f0..47111f6 100644
--- a/ext/openssl/ossl_ssl.c
+++ b/ext/openssl/ossl_ssl.c
@@ -109,9 +109,12 @@ static const struct {
     OSSL_SSL_METHOD_ENTRY(SSLv2_server),
     OSSL_SSL_METHOD_ENTRY(SSLv2_client),
 #endif
+#if defined(HAVE_SSLV3_METHOD) && defined(HAVE_SSLV3_SERVER_METHOD) && \
+        defined(HAVE_SSLV3_CLIENT_METHOD)
     OSSL_SSL_METHOD_ENTRY(SSLv3),
     OSSL_SSL_METHOD_ENTRY(SSLv3_server),
     OSSL_SSL_METHOD_ENTRY(SSLv3_client),
+#endif
     OSSL_SSL_METHOD_ENTRY(SSLv23),
     OSSL_SSL_METHOD_ENTRY(SSLv23_server),
     OSSL_SSL_METHOD_ENTRY(SSLv23_client),
diff --git a/test/openssl/test_ssl.rb b/test/openssl/test_ssl.rb
index 07e081b..0cbfcba 100644
--- a/test/openssl/test_ssl.rb
+++ b/test/openssl/test_ssl.rb
@@ -912,7 +912,7 @@ def test_unset_OP_ALL
   # that has been marked as forbidden, therefore either of these may be raised
   HANDSHAKE_ERRORS = [OpenSSL::SSL::SSLError, Errno::ECONNRESET]

-if OpenSSL::SSL::SSLContext::METHODS.include? :TLSv1
+if OpenSSL::SSL::SSLContext::METHODS.include?(:TLSv1) && OpenSSL::SSL::SSLContext::METHODS.include?(:SSLv3)

   def test_forbid_ssl_v3_for_client
     ctx_proc = Proc.new { |ctx| ctx.options = OpenSSL::SSL::OP_ALL | OpenSSL::SSL::OP_NO_SSLv3 }
patches/ruby/1.8.7/ruby187gc.patch000066400000043344147511530510012417 0ustar00--- a/intern.h	(revision 31212)
+++ b/intern.h	(working copy)
@@ -270,6 +270,15 @@
 VALUE rb_gc_enable _((void));
 VALUE rb_gc_disable _((void));
 VALUE rb_gc_start _((void));
+VALUE rb_gc_enable_stats _((void));
+VALUE rb_gc_disable_stats _((void));
+VALUE rb_gc_allocated_size _((void));
+unsigned long rb_os_live_objects _((void));
+#ifdef HAVE_LONG_LONG
+unsigned long long rb_os_allocated_objects _((void));
+#else
+unsigned long rb_os_allocated_objects _((void));
+#endif
 /* hash.c */
 void st_foreach_safe _((struct st_table *, int (*)(ANYARGS), unsigned long));
 void rb_hash_foreach _((VALUE, int (*)(ANYARGS), VALUE));
--- a/gc.c	(revision 31212)
+++ b/gc.c	(working copy)
@@ -22,8 +22,16 @@
 #include <setjmp.h>
 #include <sys/types.h>
 
+#ifdef _WIN32
+#include <string.h>
+#else
+#include <strings.h>
+#endif
+
 #ifdef HAVE_SYS_TIME_H
 #include <sys/time.h>
+#elif defined(_WIN32)
+#include <time.h> 
 #endif
 
 #ifdef HAVE_SYS_RESOURCE_H
@@ -76,6 +84,20 @@
 static VALUE nomem_error;
 static void garbage_collect();
 
+static unsigned long live_objects = 0;
+unsigned long rb_os_live_objects()
+{ return live_objects; }
+
+#if defined(HAVE_LONG_LONG)
+static unsigned long long allocated_objects = 0;
+unsigned long long rb_os_allocated_objects()
+{ return allocated_objects; }
+#else
+static unsigned long allocated_objects = 0;
+unsigned long rb_os_allocated_objects()
+{ return allocated_objects; }
+#endif
+
 int ruby_gc_stress = 0;
 
 NORETURN(void rb_exc_jump _((VALUE)));
@@ -132,6 +154,10 @@
     return bool;
 }
 
+long gc_allocated_size = 0;
+long gc_num_allocations = 0;
+static int gc_statistics = 0;
+
 void *
 ruby_xmalloc(size)
     long size;
@@ -156,6 +182,11 @@
     }
     malloc_increase += size;
 
+    if (gc_statistics) {
+      gc_allocated_size += size;
+      gc_num_allocations += 1;
+    }
+
     return mem;
 }
 
@@ -205,8 +236,16 @@
 	RUBY_CRITICAL(free(x));
 }
 
+#if HAVE_LONG_LONG
+#define GC_TIME_TYPE LONG_LONG
+#else
+#define GC_TIME_TYPE long
+#endif
+
 extern int ruby_in_compile;
 static int dont_gc;
+static GC_TIME_TYPE gc_time = 0;
+static int gc_collections = 0;
 static int during_gc;
 static int need_call_final = 0;
 static st_table *finalizer_table = 0;
@@ -255,6 +294,139 @@
     return old;
 }
 
+/*
+ *  call-seq:
+ *     GC.enable_stats    => true or false
+ *
+ *  Enables garbage collection statistics, returning <code>true</code> if garbage
+ *  collection statistics was already enabled.
+ *
+ *     GC.enable_stats   #=> false or true
+ *     GC.enable_stats   #=> true
+ *
+ */
+
+VALUE
+rb_gc_enable_stats()
+{
+    int old = gc_statistics;
+    gc_statistics = Qtrue;
+    return old;
+}
+
+/*
+ *  call-seq:
+ *     GC.disable_stats    => true or false
+ *
+ *  Disables garbage collection statistics, returning <code>true</code> if garbage
+ *  collection statistics was already disabled.
+ *
+ *     GC.disable_stats   #=> false or true
+ *     GC.disable_stats   #=> true
+ *
+ */
+
+VALUE
+rb_gc_disable_stats()
+{
+    int old = gc_statistics;
+    gc_statistics = Qfalse;
+    gc_allocated_size = 0;
+    gc_num_allocations = 0;
+    return old;
+}
+
+/*
+ *  call-seq:
+ *     GC.clear_stats    => nil
+ *
+ *  Clears garbage collection statistics, returning nil. This resets the number
+ *  of collections (GC.collections) and the time used (GC.time) to 0.
+ *
+ *     GC.clear_stats    #=> nil
+ *
+ */
+
+VALUE
+rb_gc_clear_stats()
+{
+    gc_collections = 0;
+    gc_time = 0;
+    gc_allocated_size = 0;
+    gc_num_allocations = 0;
+    return Qnil; 
+}
+
+/*
+ *  call-seq:
+ *     GC.allocated_size    => Integer
+ *
+ *  Returns the size of memory (in bytes) allocated since GC statistics collection
+ *  was enabled.
+ *
+ *     GC.allocated_size    #=> 35
+ *
+ */
+VALUE
+rb_gc_allocated_size()
+{
+    return INT2NUM(gc_allocated_size);
+}
+
+/*
+ *  call-seq:
+ *     GC.num_allocations    => Integer
+ *
+ *  Returns the number of memory allocations since GC statistics collection
+ *  was enabled.
+ *
+ *     GC.num_allocations    #=> 150
+ *
+ */
+VALUE
+rb_gc_num_allocations()
+{
+    return INT2NUM(gc_num_allocations);
+}
+
+/*
+ *  call-seq:
+ *     GC.collections    => Integer
+ *
+ *  Returns the number of garbage collections performed while GC statistics collection
+ *  was enabled.
+ *
+ *     GC.collections    #=> 35
+ *
+ */
+
+VALUE
+rb_gc_collections()
+{
+    return INT2NUM(gc_collections);
+}
+
+/*
+ *  call-seq:
+ *     GC.time    => Integer
+ *
+ *  Returns the time spent during garbage collection while GC statistics collection
+ *  was enabled (in micro seconds).
+ *
+ *     GC.time    #=> 20000
+ *
+ */
+
+VALUE
+rb_gc_time()
+{
+#if HAVE_LONG_LONG
+    return LL2NUM(gc_time);
+#else
+    return LONG2NUM(gc_time);
+#endif
+}
+
 VALUE rb_mGC;
 
 static struct gc_list {
@@ -346,7 +518,7 @@
 static RVALUE *freelist = 0;
 static RVALUE *deferred_final_list = 0;
 
-#define HEAPS_INCREMENT 10
+static int heaps_increment = 10;
 static struct heaps_slot {
     void *membase;
     RVALUE *slot;
@@ -355,13 +527,164 @@
 static int heaps_length = 0;
 static int heaps_used   = 0;
 
-#define HEAP_MIN_SLOTS 10000
-static int heap_slots = HEAP_MIN_SLOTS;
+static int heap_min_slots = 10000;
+static int heap_slots = 10000;
 
-#define FREE_MIN  4096
+static int heap_free_min = 4096;
+static int heap_slots_increment = 10000;
+static double heap_slots_growth_factor = 1.8;
 
+static long initial_malloc_limit = GC_MALLOC_LIMIT;
+
+static int verbose_gc_stats = Qfalse;
+
+static FILE* gc_data_file = NULL;
+
 static RVALUE *himem, *lomem;
 
+static void set_gc_parameters()
+{
+    char *gc_stats_ptr, *min_slots_ptr, *free_min_ptr, *heap_slots_incr_ptr,
+      *heap_incr_ptr, *malloc_limit_ptr, *gc_heap_file_ptr, *heap_slots_growth_factor_ptr;
+
+    gc_data_file = stderr;
+
+    gc_stats_ptr = getenv("RUBY_GC_STATS");
+    if (gc_stats_ptr != NULL) {
+  int gc_stats_i = atoi(gc_stats_ptr);
+  if (gc_stats_i > 0) {
+      verbose_gc_stats = Qtrue;
+  }
+    }
+
+    gc_heap_file_ptr = getenv("RUBY_GC_DATA_FILE");
+    if (gc_heap_file_ptr != NULL) {
+  FILE* data_file = fopen(gc_heap_file_ptr, "w");
+  if (data_file != NULL) {
+      gc_data_file = data_file;
+  }
+  else {
+      fprintf(stderr,
+        "can't open gc log file %s for writing, using default\n", gc_heap_file_ptr);
+  }
+    }
+
+    min_slots_ptr = getenv("RUBY_HEAP_MIN_SLOTS");
+    if (min_slots_ptr != NULL) {
+  int min_slots_i = atoi(min_slots_ptr);
+        if (verbose_gc_stats) {
+      fprintf(gc_data_file, "RUBY_HEAP_MIN_SLOTS=%s\n", min_slots_ptr);
+        }
+  if (min_slots_i > 0) {
+      heap_slots = min_slots_i;
+      heap_min_slots = min_slots_i;
+  }
+    }
+
+    free_min_ptr = getenv("RUBY_HEAP_FREE_MIN");
+    if (free_min_ptr != NULL) {
+  int free_min_i = atoi(free_min_ptr);
+        if (verbose_gc_stats) {
+      fprintf(gc_data_file, "RUBY_HEAP_FREE_MIN=%s\n", free_min_ptr);
+  }
+  if (free_min_i > 0) {
+      heap_free_min = free_min_i;
+  }
+    }
+
+    heap_incr_ptr = getenv("RUBY_HEAP_INCREMENT");
+    if (heap_incr_ptr != NULL) {
+  int heap_incr_i = atoi(heap_incr_ptr);
+        if (verbose_gc_stats) {
+      fprintf(gc_data_file, "RUBY_HEAP_INCREMENT=%s\n", heap_incr_ptr);
+  }
+  if (heap_incr_i > 0) {
+      heaps_increment = heap_incr_i;
+  }
+    }
+
+    heap_slots_incr_ptr = getenv("RUBY_HEAP_SLOTS_INCREMENT");
+    if (heap_slots_incr_ptr != NULL) {
+  int heap_slots_incr_i = atoi(heap_slots_incr_ptr);
+        if (verbose_gc_stats) {
+      fprintf(gc_data_file, "RUBY_HEAP_SLOTS_INCREMENT=%s\n", heap_slots_incr_ptr);
+  }
+  if (heap_slots_incr_i > 0) {
+      heap_slots_increment = heap_slots_incr_i;
+  }
+    }
+
+    heap_slots_growth_factor_ptr = getenv("RUBY_HEAP_SLOTS_GROWTH_FACTOR");
+    if (heap_slots_growth_factor_ptr != NULL) {
+  double heap_slots_growth_factor_d = atoi(heap_slots_growth_factor_ptr);
+        if (verbose_gc_stats) {
+      fprintf(gc_data_file, "RUBY_HEAP_SLOTS_GROWTH_FACTOR=%s\n", heap_slots_growth_factor_ptr);
+  }
+  if (heap_slots_growth_factor_d > 0) {
+      heap_slots_growth_factor = heap_slots_growth_factor_d;
+  }
+    }
+
+    malloc_limit_ptr = getenv("RUBY_GC_MALLOC_LIMIT");
+    if (malloc_limit_ptr != NULL) {
+  int malloc_limit_i = atol(malloc_limit_ptr);
+        if (verbose_gc_stats) {
+      fprintf(gc_data_file, "RUBY_GC_MALLOC_LIMIT=%s\n", malloc_limit_ptr);
+  }
+  if (malloc_limit_i > 0) {
+      initial_malloc_limit = malloc_limit_i;
+  }
+    }
+}
+
+/*
+ *  call-seq:
+ *     GC.dump    => nil
+ *
+ *  dumps information about the current GC data structures to the GC log file
+ *
+ *     GC.dump    #=> nil
+ *
+ */
+
+VALUE
+rb_gc_dump()
+{
+    int i;
+
+    for (i = 0; i < heaps_used; i++) {
+  int heap_size = heaps[i].limit;
+  fprintf(gc_data_file, "HEAP[%2d]: size=%7d\n", i, heap_size);
+    }
+
+    return Qnil;
+}
+
+/*
+ *  call-seq:
+ *     GC.log String  => String
+ *
+ *  Logs string to the GC data file and returns it.
+ *
+ *     GC.log "manual GC call"    #=> "manual GC call"
+ *
+ */
+
+VALUE
+rb_gc_log(self, original_str)
+     VALUE self, original_str;
+{
+    if (original_str == Qnil) {
+        fprintf(gc_data_file, "\n");
+    }
+    else {
+        VALUE str = StringValue(original_str);
+        char *p = RSTRING(str)->ptr;
+        fprintf(gc_data_file, "%s\n", p);
+    }
+    return original_str;
+}
+
 static void
 add_heap()
 {
@@ -372,7 +695,7 @@
 	struct heaps_slot *p;
 	int length;
 
-	heaps_length += HEAPS_INCREMENT;
+	heaps_length += heaps_increment;
 	length = heaps_length*sizeof(struct heaps_slot);
 	RUBY_CRITICAL(
 	    if (heaps_used > 0) {
@@ -388,10 +711,10 @@
     for (;;) {
 	RUBY_CRITICAL(p = (RVALUE*)malloc(sizeof(RVALUE)*(heap_slots+1)));
 	if (p == 0) {
-	    if (heap_slots == HEAP_MIN_SLOTS) {
+	    if (heap_slots == heap_min_slots) {
 		rb_memerror();
 	    }
-	    heap_slots = HEAP_MIN_SLOTS;
+	    heap_slots = heap_min_slots;
 	    continue;
 	}
         heaps[heaps_used].membase = p;
@@ -407,8 +730,9 @@
     if (lomem == 0 || lomem > p) lomem = p;
     if (himem < pend) himem = pend;
     heaps_used++;
-    heap_slots *= 1.8;
-    if (heap_slots <= 0) heap_slots = HEAP_MIN_SLOTS;
+    heap_slots += heap_slots_increment;
+    heap_slots_increment *= heap_slots_growth_factor;
+    if (heap_slots <= 0) heap_slots = heap_min_slots;
 
     while (p < pend) {
 	p->as.free.flags = 0;
@@ -442,6 +766,8 @@
     RANY(obj)->file = ruby_sourcefile;
     RANY(obj)->line = ruby_sourceline;
 #endif
+    live_objects++;
+    allocated_objects++;
     return obj;
 }
 
@@ -1102,6 +1428,39 @@
     }
 }
 
+static char* obj_type(int tp)
+{
+    switch (tp) {
+	case T_NIL    : return "NIL";   
+	case T_OBJECT : return "OBJECT";
+	case T_CLASS  : return "CLASS";
+	case T_ICLASS : return "ICLASS";
+	case T_MODULE : return "MODULE";
+	case T_FLOAT  : return "FLOAT";
+	case T_STRING : return "STRING";
+	case T_REGEXP : return "REGEXP";
+	case T_ARRAY  : return "ARRAY";
+	case T_FIXNUM : return "FIXNUM";
+	case T_HASH   : return "HASH";
+	case T_STRUCT : return "STRUCT";
+	case T_BIGNUM : return "BIGNUM";
+	case T_FILE   : return "FILE";
+	    
+	case T_TRUE   : return "TRUE";
+	case T_FALSE  : return "FALSE";
+	case T_DATA   : return "DATA";
+	case T_MATCH  : return "MATCH";
+	case T_SYMBOL : return "SYMBOL";
+	    
+	case T_BLKTAG : return "BLKTAG";
+	case T_UNDEF  : return "UNDEF";
+	case T_VARMAP : return "VARMAP";
+	case T_SCOPE  : return "SCOPE";
+	case T_NODE   : return "NODE";
+	default: return "____";
+    }
+}
+
 static void
 free_unused_heaps()
 {
@@ -1133,14 +1492,24 @@
     int i;
     unsigned long live = 0;
     unsigned long free_min = 0;
+    live_objects = 0;
 
+    unsigned long really_freed = 0;
+    int free_counts[256];
+    int live_counts[256];
+    int do_gc_stats = gc_statistics & verbose_gc_stats;
+
     for (i = 0; i < heaps_used; i++) {
         free_min += heaps[i].limit;
     }
     free_min = free_min * 0.2;
-    if (free_min < FREE_MIN)
-        free_min = FREE_MIN;
+    if (free_min < heap_free_min)
+        free_min = heap_free_min;
 
+    if (do_gc_stats) {
+      for (i = 0 ; i< 256; i++) { free_counts[i] = live_counts[i] = 0; }
+    }
+
     if (ruby_in_compile && ruby_parser_stack_on_heap()) {
 	/* should not reclaim nodes during compilation
            if yacc's semantic stack is not allocated on machine stack */
@@ -1171,6 +1540,11 @@
 	p = heaps[i].slot; pend = p + heaps[i].limit;
 	while (p < pend) {
 	    if (!(p->as.basic.flags & FL_MARK)) {
+	      if (p->as.basic.flags) {
+	        if (do_gc_stats) {
+	          really_freed++;
+	        }
+	      }
 		if (p->as.basic.flags &&
 		    ((deferred = obj_free((VALUE)p)) ||
 		     ((FL_TEST(p, FL_FINALIZE)) && need_call_final))) {
@@ -1183,6 +1557,12 @@
 		    final_list = p;
 		}
 		else {
+		    if (do_gc_stats) {
+		      int obt = p->as.basic.flags & T_MASK;
+		      if (obt) {
+		        free_counts[obt]++;
+		      }
+		    }
 		    add_freelist(p);
 		}
 		n++;
@@ -1193,7 +1573,10 @@
 	    }
 	    else {
 		RBASIC(p)->flags &= ~FL_MARK;
-		live++;
+		live_objects++;
+		if (do_gc_stats) {
+		  live_counts[RANY((VALUE)p)->as.basic.flags & T_MASK]++;
+		}
 	    }
 	    p++;
 	}
@@ -1211,8 +1594,8 @@
 	}
     }
     if (malloc_increase > malloc_limit) {
-	malloc_limit += (malloc_increase - malloc_limit) * (double)live / (live + freed);
-	if (malloc_limit < GC_MALLOC_LIMIT) malloc_limit = GC_MALLOC_LIMIT;
+      malloc_limit += (malloc_increase - malloc_limit) * (double)live_objects / (live_objects + freed);
+      if (malloc_limit < initial_malloc_limit) malloc_limit = initial_malloc_limit;
     }
     malloc_increase = 0;
     if (freed < free_min) {
@@ -1220,6 +1603,20 @@
     }
     during_gc = 0;
 
+    if (do_gc_stats) {
+      fprintf(gc_data_file, "objects processed: %.7d\n", live+freed);
+      fprintf(gc_data_file, "live objects	: %.7d\n", live);
+      fprintf(gc_data_file, "freelist objects : %.7d\n", freed - really_freed);
+      fprintf(gc_data_file, "freed objects	: %.7d\n", really_freed);
+      for(i=0; i<256; i++) {
+         if (free_counts[i]>0) {
+            fprintf(gc_data_file,
+             "kept %.7d / freed %.7d objects of type %s\n",
+             live_counts[i], free_counts[i], obj_type(i));
+           }
+       }
+    }
+
     /* clear finalization list */
     if (final_list) {
 	deferred_final_list = final_list;
@@ -1431,6 +1828,7 @@
     struct gc_list *list;
     struct FRAME * volatile frame; /* gcc 2.7.2.3 -O2 bug??  */
     jmp_buf save_regs_gc_mark;
+    struct timeval gctv1, gctv2;
     SET_STACK_END;
 
 #ifdef HAVE_NATIVETHREAD
@@ -1447,6 +1845,14 @@
     if (during_gc) return;
     during_gc++;
 
+    if (gc_statistics) {
+        gc_collections++;
+        gettimeofday(&gctv1, NULL);
+        if (verbose_gc_stats) {
+           fprintf(gc_data_file, "Garbage collection started\n");
+       }
+    }
+
     init_mark_stack();
 
     gc_mark((VALUE)ruby_current_node, 0);
@@ -1522,6 +1928,16 @@
     } while (!MARK_STACK_EMPTY);
 
     gc_sweep();
+    if (gc_statistics) {
+       GC_TIME_TYPE musecs_used;
+       gettimeofday(&gctv2, NULL);
+       musecs_used = ((GC_TIME_TYPE)(gctv2.tv_sec - gctv1.tv_sec) * 1000000) + (gctv2.tv_usec - gctv1.tv_usec);
+       gc_time += musecs_used;
+
+       if (verbose_gc_stats) {
+         fprintf(gc_data_file, "GC time: %d msec\n", musecs_used / 1000);
+       }
+    }
 }
 
 void
@@ -1703,6 +2119,7 @@
     if (!rb_gc_stack_start) {
 	Init_stack(0);
     }
+    set_gc_parameters();
     add_heap();
 }
 
@@ -2147,6 +2564,33 @@
     return (VALUE)((long)obj|FIXNUM_FLAG);
 }
 
+/* call-seq:
+ *  ObjectSpace.live_objects => number
+ *
+ * Returns the count of objects currently allocated in the system. This goes
+ * down after the garbage collector runs.
+ */
+static
+VALUE os_live_objects(VALUE self)
+{ return ULONG2NUM(live_objects); }
+
+/* call-seq:
+ *  ObjectSpace.allocated_objects => number
+ *
+ * Returns the count of objects allocated since the Ruby interpreter has
+ * started.  This number can only increase. To know how many objects are
+ * currently allocated, use ObjectSpace::live_objects
+ */
+static
+VALUE os_allocated_objects(VALUE self)
+{ 
+#if defined(HAVE_LONG_LONG)
+    return ULL2NUM(allocated_objects); 
+#else
+    return ULONG2NUM(allocated_objects); 
+#endif
+}
+
 /*
  *  The <code>GC</code> module provides an interface to Ruby's mark and
  *  sweep garbage collection mechanism. Some of the underlying methods
@@ -2166,6 +2610,16 @@
     rb_define_singleton_method(rb_mGC, "stress=", gc_stress_set, 1);
     rb_define_method(rb_mGC, "garbage_collect", rb_gc_start, 0);
 
+    rb_define_singleton_method(rb_mGC, "enable_stats", rb_gc_enable_stats, 0);
+    rb_define_singleton_method(rb_mGC, "disable_stats", rb_gc_disable_stats, 0);
+    rb_define_singleton_method(rb_mGC, "clear_stats", rb_gc_clear_stats, 0);
+    rb_define_singleton_method(rb_mGC, "allocated_size", rb_gc_allocated_size, 0);
+    rb_define_singleton_method(rb_mGC, "num_allocations", rb_gc_num_allocations, 0);
+    rb_define_singleton_method(rb_mGC, "collections", rb_gc_collections, 0);
+    rb_define_singleton_method(rb_mGC, "time", rb_gc_time, 0);
+    rb_define_singleton_method(rb_mGC, "dump", rb_gc_dump, 0);
+    rb_define_singleton_method(rb_mGC, "log", rb_gc_log, 1);
+
     rb_mObSpace = rb_define_module("ObjectSpace");
     rb_define_module_function(rb_mObSpace, "each_object", os_each_obj, -1);
     rb_define_module_function(rb_mObSpace, "garbage_collect", rb_gc_start, 0);
@@ -2173,6 +2627,8 @@
     rb_define_module_function(rb_mObSpace, "remove_finalizer", rm_final, 1);
     rb_define_module_function(rb_mObSpace, "finalizers", finals, 0);
     rb_define_module_function(rb_mObSpace, "call_finalizer", call_final, 1);
+    rb_define_module_function(rb_mObSpace, "live_objects", os_live_objects, 0);
+    rb_define_module_function(rb_mObSpace, "allocated_objects", os_allocated_objects, 0);
 
     rb_define_module_function(rb_mObSpace, "define_finalizer", define_final, -1);
     rb_define_module_function(rb_mObSpace, "undefine_finalizer", undefine_final, 1);
patches/ruby/1.8.7/no_sslv2.diff000066400000001252147511530510012232 0ustar00Index: ossl_ssl.c
===================================================================
--- a/ext/openssl/ossl_ssl.c	(revision 32381)
+++ b/ext/openssl/ossl_ssl.c	(revision 32382)
@@ -107,9 +107,12 @@
     OSSL_SSL_METHOD_ENTRY(TLSv1),
     OSSL_SSL_METHOD_ENTRY(TLSv1_server),
     OSSL_SSL_METHOD_ENTRY(TLSv1_client),
+#if defined(HAVE_SSLV2_METHOD) && defined(HAVE_SSLV2_SERVER_METHOD) && \
+        defined(HAVE_SSLV2_CLIENT_METHOD)	
     OSSL_SSL_METHOD_ENTRY(SSLv2),
     OSSL_SSL_METHOD_ENTRY(SSLv2_server),
     OSSL_SSL_METHOD_ENTRY(SSLv2_client),
+#endif
     OSSL_SSL_METHOD_ENTRY(SSLv3),
     OSSL_SSL_METHOD_ENTRY(SSLv3_server),
     OSSL_SSL_METHOD_ENTRY(SSLv3_client),
patches/ruby/1.8.7/p72/mbari-2.patch000066400000020740147511530510012520 0ustar00diff -rux '*.o' ruby-1.8.7-p72/ChangeLog ruby-1.8.7-mbari/ChangeLog
--- ruby-1.8.7-p72/ChangeLog	2008-12-12 21:32:52.000000000 -0800
+++ ruby-1.8.7-mbari/ChangeLog	2008-12-12 21:58:04.000000000 -0800
@@ -1,3 +1,14 @@
+Tue Dec 12  6:11:36 2008  Brent Roman  <brent@mbari.org>
+
+        * eval.c:  exclude other thread's stack frames from current one
+
+        * gc.c:  STACK_LENGTH macro takes start parameter
+
+        * node.h: added stk_start pointer to ruby thread struct
+
+        * intern.h:  stack_length takes base pointer as parameter
+        
+
 Tue Dec  9  8:11:36 2008  Brent Roman  <brent@mbari.org>
 
      * eval.c:  added Continuation.thread method
diff -rux '*.o' ruby-1.8.7-p72/eval.c ruby-1.8.7-mbari/eval.c
--- ruby-1.8.7-p72/eval.c	2008-12-12 21:32:52.000000000 -0800
+++ ruby-1.8.7-mbari/eval.c	2008-12-12 22:34:34.000000000 -0800
@@ -3,7 +3,7 @@
   eval.c -
 
   $Author: brent $
-  $Date: 2008/12/11 04:42:40 $
+  $Date: 2008/12/13 06:34:34 $
   created at: Thu Jun 10 14:22:17 JST 1993
 
   Copyright (C) 1993-2003 Yukihiro Matsumoto
@@ -5141,6 +5141,7 @@
 		    tt->retval = result;
 		    JUMP_TAG(TAG_BREAK);
 		}
+                if (tt->tag == PROT_THREAD) break;
 		tt = tt->prev;
 	    }
 	    proc_jump_error(TAG_BREAK, result);
@@ -6572,6 +6573,7 @@
 
 	    scope_dup(ruby_scope);
 	    for (tag=prot_tag; tag; tag=tag->prev) {
+                if (tag->tag == PROT_THREAD) break;
 		scope_dup(tag->scope);
 	    }
 	    for (vars = ruby_dyna_vars; vars; vars = vars->next) {
@@ -10367,14 +10369,19 @@
     return (double)tv.tv_sec + (double)tv.tv_usec * 1e-6;
 }
 
-#define STACK(addr) (th->stk_pos<(VALUE*)(addr) && (VALUE*)(addr)<th->stk_pos+th->stk_len)
-#define ADJ(addr) (void*)(STACK(addr)?(((VALUE*)(addr)-th->stk_pos)+th->stk_ptr):(VALUE*)(addr))
+
+#define ADJ(addr) \
+   if ((size_t)((void *)addr - stkBase) < stkSize) addr=(void *)addr + stkShift
+
 static void
 thread_mark(th)
     rb_thread_t th;
 {
     struct FRAME *frame;
     struct BLOCK *block;
+    void *stkBase;
+    ptrdiff_t stkShift;
+    size_t stkSize;
 
     rb_gc_mark(th->result);
     rb_gc_mark(th->thread);
@@ -10409,15 +10416,26 @@
 	}
 #endif
     }
+
+    stkBase = (void *)th->stk_start;
+    stkSize = th->stk_len * sizeof(VALUE);
+#if STACK_GROW_DIRECTION == 0
+    if ((VALUE *)&th < rb_gc_stack_start)
+#endif
+#if STACK_GROW_DIRECTION <= 0
+      stkBase -= stkSize;
+#endif
+    stkShift = (void *)th->stk_ptr - stkBase;
+    
     frame = th->frame;
     while (frame && frame != top_frame) {
-	frame = ADJ(frame);
+	ADJ(frame);
 	rb_gc_mark_frame(frame);
 	if (frame->tmp) {
 	    struct FRAME *tmp = frame->tmp;
 
 	    while (tmp && tmp != top_frame) {
-		tmp = ADJ(tmp);
+		ADJ(tmp);
 		rb_gc_mark_frame(tmp);
 		tmp = tmp->prev;
 	    }
@@ -10426,7 +10444,7 @@
     }
     block = th->block;
     while (block) {
-	block = ADJ(block);
+	ADJ(block);
 	rb_gc_mark_frame(&block->frame);
 	block = block->prev;
     }
@@ -10579,13 +10597,10 @@
 rb_thread_save_context(th)
     rb_thread_t th;
 {
-    VALUE *pos;
     int len;
     static VALUE tval;
 
-    len = ruby_stack_length(&pos);
-    th->stk_len = 0;
-    th->stk_pos = pos;
+    len = ruby_stack_length(th->stk_start,&th->stk_pos);
     if (len > th->stk_max) {
 	VALUE *ptr = realloc(th->stk_ptr, sizeof(VALUE) * len);
 	if (!ptr) rb_memerror();
@@ -12065,6 +12080,7 @@
     th->result = 0;\
     th->flags = 0;\
 \
+    th->stk_start = rb_gc_stack_start;\
     th->stk_ptr = 0;\
     th->stk_len = 0;\
     th->stk_max = 0;\
@@ -12234,6 +12250,16 @@
 		 "can't start a new thread (frozen ThreadGroup)");
     }
 
+
+    th->stk_start =   /* establish start of new thread's stack */
+#if STACK_GROW_DIRECTION > 0
+      (VALUE *)ruby_frame;
+#elif STACK_GROW_DIRECTION < 0
+      (VALUE *)(ruby_frame+1);
+#else
+      (VALUE *)(ruby_frame+((VALUE *)(&arg)<rb_gc_stack_start))
+#endif
+ 
     if (!thread_init) {
 	thread_init = 1;
 #if defined(HAVE_SETITIMER) || defined(_THREAD_SAFE)
@@ -12277,6 +12303,8 @@
     PUSH_TAG(PROT_THREAD);
     if ((state = EXEC_TAG()) == 0) {
 	if (THREAD_SAVE_CONTEXT(th) == 0) {
+            ruby_frame->prev = top_frame;     /* hide parent thread's frames */
+            ruby_frame->tmp = 0;           
 	    curr_thread = th;
 	    th->result = (*fn)(arg, th);
 	}
@@ -12388,9 +12416,6 @@
     VALUE klass;
 {
     rb_thread_t th = rb_thread_alloc(klass);
-    volatile VALUE *pos;
-
-    pos = th->stk_pos;
     rb_obj_call_init(th->thread, argc, argv);
     if (th->stk_pos == 0) {
 	rb_raise(rb_eThreadError, "uninitialized thread - check `%s#initialize'",
@@ -13082,6 +13107,7 @@
 
     scope_dup(ruby_scope);
     for (tag=prot_tag; tag; tag=tag->prev) {
+        if (tag->tag == PROT_THREAD) break;
 	scope_dup(tag->scope);
     }
 
diff -rux '*.o' ruby-1.8.7-p72/gc.c ruby-1.8.7-mbari/gc.c
--- ruby-1.8.7-p72/gc.c	2008-08-03 20:24:26.000000000 -0700
+++ ruby-1.8.7-mbari/gc.c	2008-12-12 21:47:46.000000000 -0800
@@ -2,8 +2,8 @@
 
   gc.c -
 
-  $Author: shyouhei $
-  $Date: 2008-08-04 12:24:26 +0900 (Mon, 04 Aug 2008) $
+  $Author: brent $
+  $Date: 2008/12/13 05:47:46 $
   created at: Tue Oct  5 09:44:46 JST 1993
 
   Copyright (C) 1993-2003 Yukihiro Matsumoto
@@ -506,12 +506,12 @@
 # define STACK_END (stack_end)
 #endif
 #if STACK_GROW_DIRECTION < 0
-# define STACK_LENGTH  (rb_gc_stack_start - STACK_END)
+# define STACK_LENGTH(start)  ((start) - STACK_END)
 #elif STACK_GROW_DIRECTION > 0
-# define STACK_LENGTH  (STACK_END - rb_gc_stack_start + 1)
+# define STACK_LENGTH(start)  (STACK_END - (start) + 1)
 #else
-# define STACK_LENGTH  ((STACK_END < rb_gc_stack_start) ? rb_gc_stack_start - STACK_END\
-                                           : STACK_END - rb_gc_stack_start + 1)
+# define STACK_LENGTH(start)  ((STACK_END < (start)) ? (start) - STACK_END\
+                                           : STACK_END - (start) + 1)
 #endif
 #if STACK_GROW_DIRECTION > 0
 # define STACK_UPPER(x, a, b) a
@@ -536,16 +536,16 @@
 
 #define CHECK_STACK(ret) do {\
     SET_STACK_END;\
-    (ret) = (STACK_LENGTH > STACK_LEVEL_MAX + GC_WATER_MARK);\
+    (ret) = (STACK_LENGTH(rb_gc_stack_start) > STACK_LEVEL_MAX + GC_WATER_MARK);\
 } while (0)
 
 int
-ruby_stack_length(p)
-    VALUE **p;
+ruby_stack_length(start, base)
+    VALUE *start, **base;
 {
     SET_STACK_END;
-    if (p) *p = STACK_UPPER(STACK_END, rb_gc_stack_start, STACK_END);
-    return STACK_LENGTH;
+    if (base) *base = STACK_UPPER(STACK_END, start, STACK_END);
+    return STACK_LENGTH(start);
 }
 
 int
diff -rux '*.o' ruby-1.8.7-p72/intern.h ruby-1.8.7-mbari/intern.h
--- ruby-1.8.7-p72/intern.h	2008-07-06 20:29:28.000000000 -0700
+++ ruby-1.8.7-mbari/intern.h	2008-12-12 21:03:16.000000000 -0800
@@ -251,7 +251,7 @@
 /* gc.c */
 NORETURN(void rb_memerror __((void)));
 int ruby_stack_check _((void));
-int ruby_stack_length _((VALUE**));
+int ruby_stack_length _((VALUE *,VALUE**));
 int rb_during_gc _((void));
 char *rb_source_filename _((const char*));
 void rb_gc_mark_locations _((VALUE*, VALUE*));
diff -rux '*.o' ruby-1.8.7-p72/node.h ruby-1.8.7-mbari/node.h
--- ruby-1.8.7-p72/node.h	2008-07-06 23:17:24.000000000 -0700
+++ ruby-1.8.7-mbari/node.h	2008-12-12 21:02:23.000000000 -0800
@@ -2,8 +2,8 @@
 
   node.h -
 
-  $Author: shyouhei $
-  $Date: 2008-07-07 15:17:24 +0900 (Mon, 07 Jul 2008) $
+  $Author: brent $
+  $Date: 2008/12/13 05:02:23 $
   created at: Fri May 28 15:14:02 JST 1993
 
   Copyright (C) 1993-2003 Yukihiro Matsumoto
@@ -409,10 +409,8 @@
 
     VALUE result;
 
-    long   stk_len;
-    long   stk_max;
-    VALUE *stk_ptr;
-    VALUE *stk_pos;
+    long   stk_len, stk_max;
+    VALUE *stk_ptr, *stk_pos, *stk_start;
 #ifdef __ia64
     long   bstr_len;
     long   bstr_max;
diff -rux '*.o' ruby-1.8.7-p72/version.h ruby-1.8.7-mbari/version.h
--- ruby-1.8.7-p72/version.h	2008-12-12 21:32:52.000000000 -0800
+++ ruby-1.8.7-mbari/version.h	2008-12-12 21:31:44.000000000 -0800
@@ -1,7 +1,7 @@
 #define RUBY_VERSION "1.8.7"
-#define RUBY_RELEASE_DATE "2008-12-09"
+#define RUBY_RELEASE_DATE "2008-12-12"
 #define RUBY_VERSION_CODE 187
-#define RUBY_RELEASE_CODE 20081209
+#define RUBY_RELEASE_CODE 20081212
 #define RUBY_PATCHLEVEL 72
 
 #define RUBY_VERSION_MAJOR 1
@@ -9,7 +9,7 @@
 #define RUBY_VERSION_TEENY 7
 #define RUBY_RELEASE_YEAR 2008
 #define RUBY_RELEASE_MONTH 12
-#define RUBY_RELEASE_DAY 9
+#define RUBY_RELEASE_DAY 12
 
 #ifdef RUBY_EXTERN
 RUBY_EXTERN const char ruby_version[];
@@ -25,7 +25,7 @@
 #define RUBY_BIRTH_MONTH 2
 #define RUBY_BIRTH_DAY 24
 
-#define RUBY_RELEASE_STR "MBARI 1 on patchlevel"
+#define RUBY_RELEASE_STR "MBARI 2 on patchlevel"
 #define RUBY_RELEASE_NUM RUBY_PATCHLEVEL
 
 
patches/ruby/1.8.7/p72/mbari-3.patch000066400000032660147511530510012525 0ustar00diff -rux '*.o' ruby-1.8.7-p72/ChangeLog ruby-1.8.7-mbari/ChangeLog
--- ruby-1.8.7-p72/ChangeLog	2008-12-13 23:32:29.000000000 -0800
+++ ruby-1.8.7-mbari/ChangeLog	2008-12-13 23:17:30.000000000 -0800
@@ -1,3 +1,18 @@
+Tue Dec 13  6:10:36 2008  Brent Roman  <brent@mbari.org>
+
+        * eval.c:  update stack extent just before and after every setjmp
+
+        * gc.c:  replaced rb_gc_stress with gc_getlimit and setlimit
+                 update stack extent after every xmalloc and xrealloc
+                 export rb_gc_stack_grow_direction if not known at compile time
+                 removed dynamic adjustment of malloc_limit
+                 removed workaround for obsolete gcc 2.7.2.3 bug                 
+
+        * signal.h: don't try to clear stress after segsegv.  It's a too late.
+        
+        * rubysig.h:  CHECK_INTS clears ghost references off stack
+
+
 Tue Dec 12  6:11:36 2008  Brent Roman  <brent@mbari.org>
 
         * eval.c:  exclude other thread's stack frames from current one
diff -rux '*.o' ruby-1.8.7-p72/eval.c ruby-1.8.7-mbari/eval.c
--- ruby-1.8.7-p72/eval.c	2008-12-13 23:32:29.000000000 -0800
+++ ruby-1.8.7-mbari/eval.c	2008-12-13 23:23:06.000000000 -0800
@@ -3,7 +3,7 @@
   eval.c -
 
   $Author: brent $
-  $Date: 2008/12/13 06:34:34 $
+  $Date: 2008/12/14 07:23:06 $
   created at: Thu Jun 10 14:22:17 JST 1993
 
   Copyright (C) 1993-2003 Yukihiro Matsumoto
@@ -1027,7 +1027,14 @@
 #define PROT_LAMBDA INT2FIX(2)	/* 5 */
 #define PROT_YIELD  INT2FIX(3)	/* 7 */
 
 #define EXEC_TAG()    ruby_setjmp(((void)0), prot_tag->buf)
+
+static inline 
+int up_stk_extent(int status)
+{
+  rb_gc_update_stack_extent();
+  return status;
+}
 
 #define JUMP_TAG(st) do {		\
     ruby_frame = prot_tag->frame;	\
@@ -10419,7 +10426,7 @@
     stkBase = (void *)th->stk_start;
     stkSize = th->stk_len * sizeof(VALUE);
 #if STACK_GROW_DIRECTION == 0
-    if ((VALUE *)&th < rb_gc_stack_start)
+    if (rb_gc_stack_grow_direction < 0)
 #endif
 #if STACK_GROW_DIRECTION <= 0
       stkBase -= stkSize;
@@ -10697,8 +10704,8 @@
     return 1;
 }
 
-#define THREAD_SAVE_CONTEXT(th) \
-    (rb_thread_switch(ruby_setjmp(rb_thread_save_context(th), (th)->context)))
+#define THREAD_SAVE_CONTEXT(th) (rb_thread_switch(up_stk_extent( \
+                  ruby_setjmp(rb_thread_save_context(th), (th)->context))))
 
 NORETURN(static void rb_thread_restore_context _((rb_thread_t,int)));
 NORETURN(NOINLINE(static void rb_thread_restore_context_0(rb_thread_t,int,void*)));
diff -rux '*.o' ruby-1.8.7-p72/gc.c ruby-1.8.7-mbari/gc.c
--- ruby-1.8.7-p72/gc.c	2008-12-13 23:32:29.000000000 -0800
+++ ruby-1.8.7-mbari/gc.c	2008-12-13 23:23:34.000000000 -0800
@@ -3,7 +3,7 @@
   gc.c -
 
   $Author: brent $
-  $Date: 2008/12/13 05:47:46 $
+  $Date: 2008/12/14 07:23:34 $
   created at: Tue Oct  5 09:44:46 JST 1993
 
   Copyright (C) 1993-2003 Yukihiro Matsumoto
@@ -70,13 +70,66 @@
 #endif
 #endif
 
-static unsigned long malloc_increase = 0;
+
+size_t rb_gc_malloc_increase = 0;
+#define malloc_increase rb_gc_malloc_increase
 static unsigned long malloc_limit = GC_MALLOC_LIMIT;
+size_t rb_gc_malloc_limit = GC_MALLOC_LIMIT-GC_MALLOC_LIMIT/8;
+
+/*
+ *  call-seq:
+ *     GC.limit    => increase limit in bytes
+ *
+ *  Get the # of bytes that may be allocated before triggering
+ *  a mark and sweep by the garbarge collector to reclaim unused storage.
+ *
+ */
+static VALUE gc_getlimit(VALUE mod)
+{
+  return ULONG2NUM(malloc_limit);
+}
+
+/*
+ *  call-seq:
+ *     GC.limit=   => updated increase limit in bytes
+ *
+ *  Set the # of bytes that may be allocated before triggering
+ *  a mark and sweep by the garbarge collector to reclaim unused storage.
+ *  Attempts to set the GC.limit= less than 0 will be ignored.
+ *
+ *     GC.limit=5000000   #=> 5000000
+ *     GC.limit           #=> 5000000
+ *     GC.limit=-50       #=> 5000000
+ *     GC.limit=0         #=> 0
+ *
+ */
+static VALUE gc_setlimit(VALUE mod, VALUE newLimit)
+{
+  long limit = NUM2LONG(newLimit);
+  if (limit < 0) return gc_getlimit(mod);
+  malloc_limit = limit;
+  rb_gc_malloc_limit = malloc_limit - malloc_limit/8;
+  return newLimit;
+}
+
+
+/*
+ *  call-seq:
+ *     GC.increase
+ *
+ *  Get # of bytes that have been allocated since the last mark & sweep
+ *
+ */
+static VALUE gc_increase(VALUE mod)
+{
+  return ULONG2NUM(malloc_increase);
+}
+
+
 static void run_final();
 static VALUE nomem_error;
 static void garbage_collect();
 
-int ruby_gc_stress = 0;
 
 NORETURN(void rb_exc_jump _((VALUE)));
 
@@ -97,40 +150,6 @@
     rb_exc_raise(nomem_error);
 }
 
-/*
- *  call-seq:
- *    GC.stress                 => true or false
- *
- *  returns current status of GC stress mode.
- */
-
-static VALUE
-gc_stress_get(self)
-    VALUE self;
-{
-    return ruby_gc_stress ? Qtrue : Qfalse;
-}
-
-/*
- *  call-seq:
- *    GC.stress = bool          => bool
- *
- *  updates GC stress mode.
- *
- *  When GC.stress = true, GC is invoked for all GC opportunity:
- *  all memory and object allocation.
- *
- *  Since it makes Ruby very slow, it is only for debugging.
- */
-
-static VALUE
-gc_stress_set(self, bool)
-    VALUE self, bool;
-{
-    rb_secure(2);
-    ruby_gc_stress = RTEST(bool);
-    return bool;
-}
 
 void *
 ruby_xmalloc(size)
@@ -143,8 +162,9 @@
     }
     if (size == 0) size = 1;
 
-    if (ruby_gc_stress || (malloc_increase+size) > malloc_limit) {
+    if ((malloc_increase+=size) > malloc_limit) {
 	garbage_collect();
+        malloc_increase = size;
     }
     RUBY_CRITICAL(mem = malloc(size));
     if (!mem) {
@@ -154,8 +174,7 @@
 	    rb_memerror();
 	}
     }
-    malloc_increase += size;
-
+    rb_gc_update_stack_extent();
     return mem;
 }
 
@@ -183,7 +202,10 @@
     }
     if (!ptr) return xmalloc(size);
     if (size == 0) size = 1;
-    if (ruby_gc_stress) garbage_collect();
+    if ((malloc_increase+=size) > malloc_limit) {
+	garbage_collect();
+        malloc_increase = size;
+    }
     RUBY_CRITICAL(mem = realloc(ptr, size));
     if (!mem) {
 	garbage_collect();
@@ -192,8 +214,7 @@
 	    rb_memerror();
         }
     }
-    malloc_increase += size;
-
+    rb_gc_update_stack_extent();
     return mem;
 }
 
@@ -433,7 +454,7 @@
     if (during_gc)
 	rb_bug("object allocation during garbage collection phase");
 
-    if (ruby_gc_stress || !freelist) garbage_collect();
+    if (!malloc_limit || !freelist) garbage_collect();
 
     obj = (VALUE)freelist;
     freelist = freelist->as.free.next;
@@ -468,6 +489,9 @@
 VALUE *rb_gc_register_stack_start = 0;
 #endif
 
+VALUE *rb_gc_stack_end = (VALUE *)STACK_GROW_DIRECTION;
+
+
 #ifdef DJGPP
 /* set stack size (http://www.delorie.com/djgpp/v2faq/faq15_9.html) */
 unsigned int _stklen = 0x180000; /* 1.5 kB */
@@ -518,18 +542,15 @@
 #elif STACK_GROW_DIRECTION < 0
 # define STACK_UPPER(x, a, b) b
 #else
-static int grow_direction;
+int rb_gc_stack_grow_direction;
 static int
 stack_grow_direction(addr)
     VALUE *addr;
 {
     SET_STACK_END;
-
-    if (STACK_END > addr) return grow_direction = 1;
-    return grow_direction = -1;
+    return rb_gc_stack_grow_direction = STACK_END > addr ? 1 : -1;
 }
-# define stack_growup_p(x) ((grow_direction ? grow_direction : stack_grow_direction(x)) > 0)
-# define STACK_UPPER(x, a, b) (stack_growup_p(x) ? a : b)
+# define STACK_UPPER(x, a, b) (rb_gc_stack_grow_direction > 0 ? a : b)
 #endif
 
 #define GC_WATER_MARK 512
@@ -1097,13 +1118,12 @@
     RVALUE *p, *pend, *final_list;
     int freed = 0;
     int i;
-    unsigned long live = 0;
     unsigned long free_min = 0;
 
     for (i = 0; i < heaps_used; i++) {
         free_min += heaps[i].limit;
     }
-    free_min = free_min * 0.2;
+    free_min /= 5;
     if (free_min < FREE_MIN)
         free_min = FREE_MIN;
 
@@ -1157,7 +1177,6 @@
 	    }
 	    else {
 		RBASIC(p)->flags &= ~FL_MARK;
-		live++;
 	    }
 	    p++;
 	}
@@ -1174,10 +1193,6 @@
 	    freed += n;
 	}
     }
-    if (malloc_increase > malloc_limit) {
-	malloc_limit += (malloc_increase - malloc_limit) * (double)live / (live + freed);
-	if (malloc_limit < GC_MALLOC_LIMIT) malloc_limit = GC_MALLOC_LIMIT;
-    }
     malloc_increase = 0;
     if (freed < free_min) {
 	add_heap();
@@ -1373,7 +1388,7 @@
 garbage_collect()
 {
     struct gc_list *list;
-    struct FRAME * volatile frame; /* gcc 2.7.2.3 -O2 bug??  */
+    struct FRAME * frame;
     jmp_buf save_regs_gc_mark;
     SET_STACK_END;
 
@@ -1421,7 +1436,7 @@
 #elif STACK_GROW_DIRECTION > 0
     rb_gc_mark_locations(rb_gc_stack_start, (VALUE*)STACK_END + 1);
 #else
-    if ((VALUE*)STACK_END < rb_gc_stack_start)
+    if (rb_gc_stack_grow_direction < 0)
 	rb_gc_mark_locations((VALUE*)STACK_END, rb_gc_stack_start);
     else
 	rb_gc_mark_locations(rb_gc_stack_start, (VALUE*)STACK_END + 1);
@@ -2086,12 +2101,16 @@
 {
     VALUE rb_mObSpace;
 
+#if !STACK_GROW_DIRECTION
+    rb_gc_stack_end = stack_grow_direction(&rb_mObSpace);
+#endif
     rb_mGC = rb_define_module("GC");
     rb_define_singleton_method(rb_mGC, "start", rb_gc_start, 0);
     rb_define_singleton_method(rb_mGC, "enable", rb_gc_enable, 0);
     rb_define_singleton_method(rb_mGC, "disable", rb_gc_disable, 0);
-    rb_define_singleton_method(rb_mGC, "stress", gc_stress_get, 0);
-    rb_define_singleton_method(rb_mGC, "stress=", gc_stress_set, 1);
+    rb_define_singleton_method(rb_mGC, "limit", gc_getlimit, 0);
+    rb_define_singleton_method(rb_mGC, "limit=", gc_setlimit, 1);
+    rb_define_singleton_method(rb_mGC, "increase", gc_increase, 0);
     rb_define_method(rb_mGC, "garbage_collect", rb_gc_start, 0);
 
     rb_mObSpace = rb_define_module("ObjectSpace");
diff -rux '*.o' ruby-1.8.7-p72/rubysig.h ruby-1.8.7-mbari/rubysig.h
--- ruby-1.8.7-p72/rubysig.h	2007-02-12 15:01:19.000000000 -0800
+++ ruby-1.8.7-mbari/rubysig.h	2008-12-13 23:24:10.000000000 -0800
@@ -2,8 +2,8 @@
 
   rubysig.h -
 
-  $Author: shyouhei $
-  $Date: 2007-02-13 08:01:19 +0900 (Tue, 13 Feb 2007) $
+  $Author: brent $
+  $Date: 2008/12/14 07:24:10 $
   created at: Wed Aug 16 01:15:38 JST 1995
 
   Copyright (C) 1993-2003 Yukihiro Matsumoto
@@ -81,7 +81,50 @@
 void rb_thread_schedule _((void));
 #if defined(HAVE_SETITIMER) || defined(_THREAD_SAFE)
 RUBY_EXTERN int rb_thread_pending;
+
+EXTERN size_t rb_gc_malloc_increase;
+EXTERN size_t rb_gc_malloc_limit;
+EXTERN VALUE *rb_gc_stack_end;
+EXTERN int *rb_gc_stack_grow_direction;  /* -1 for down or 1 for up */
+#define __stack_zero_up(end,sp)  while (end >= ++sp) *sp=0
+#define __stack_grown_up  (rb_gc_stack_end > (VALUE *)alloca(0))
+#define __stack_zero_down(end,sp)  while (end <= --sp) *sp=0
+#define __stack_grown_down  (rb_gc_stack_end < (VALUE *)alloca(0))
+
+#if STACK_GROW_DIRECTION > 0
+#define __stack_zero(end,sp)  __stack_zero_up(end,sp)
+#define __stack_grown  __stack_grown_up
+#elif STACK_GROW_DIRECTION < 0
+#define __stack_zero(end,sp)  __stack_zero_down(end,sp)
+#define __stack_grown  __stack_grown_down
+#else  /* limp along if stack direction can't be determined at compile time */
+#define __stack_zero(end,sp) if (rb_gc_stack_grow_direction<0) \
+        __stack_zero_down(end,sp); else __stack_zero_up(end,sp);
+#define __stack_grown  \
+        (rb_gc_stack_grow_direction<0 ? __stack_grown_down : __stack_grown_up)
+#endif
+ 
+/*
+  zero the memory that was (recently) part of the stack
+  but is no longer.  Invoke when stack is deep to mark its extent
+  and when it is shallow to wipe it
+*/
+#define rb_gc_wipe_stack() {     \
+  VALUE *sp = alloca(0);         \
+  VALUE *end = rb_gc_stack_end;  \
+  rb_gc_stack_end = sp;          \
+  __stack_zero(end, sp);   \
+}
+
+/*
+  Update our record of maximum stack extent without zeroing unused stack
+*/
+#define rb_gc_update_stack_extent() \
+    if __stack_grown rb_gc_stack_end = alloca(0);
+
+
 # define CHECK_INTS do {\
+    rb_gc_wipe_stack(); \
     if (!(rb_prohibit_interrupt || rb_thread_critical)) {\
         if (rb_thread_pending) rb_thread_schedule();\
 	if (rb_trap_pending) rb_trap_exec();\
@@ -92,6 +135,7 @@
 RUBY_EXTERN int rb_thread_tick;
 #define THREAD_TICK 500
 #define CHECK_INTS do {\
+    rb_gc_wipe_stack(); \
     if (!(rb_prohibit_interrupt || rb_thread_critical)) {\
 	if (rb_thread_tick-- <= 0) {\
 	    rb_thread_tick = THREAD_TICK;\
diff -rux '*.o' ruby-1.8.7-p72/signal.c ruby-1.8.7-mbari/signal.c
--- ruby-1.8.7-p72/signal.c	2008-06-06 03:39:57.000000000 -0700
+++ ruby-1.8.7-mbari/signal.c	2008-12-13 23:24:39.000000000 -0800
@@ -2,8 +2,8 @@
 
   signal.c -
 
-  $Author: knu $
-  $Date: 2008-06-06 19:39:57 +0900 (Fri, 06 Jun 2008) $
+  $Author: brent $
+  $Date: 2008/12/14 07:24:39 $
   created at: Tue Dec 20 10:13:44 JST 1994
 
   Copyright (C) 1993-2003 Yukihiro Matsumoto
@@ -629,8 +629,6 @@
     }
 #endif
 
-    extern int ruby_gc_stress;
-    ruby_gc_stress = 0;
     rb_bug("Segmentation fault");
 }
 #endif
diff -rux '*.o' ruby-1.8.7-p72/version.h ruby-1.8.7-mbari/version.h
--- ruby-1.8.7-p72/version.h	2008-12-13 23:32:29.000000000 -0800
+++ ruby-1.8.7-mbari/version.h	2008-12-13 20:47:17.000000000 -0800
@@ -1,7 +1,7 @@
 #define RUBY_VERSION "1.8.7"
-#define RUBY_RELEASE_DATE "2008-12-12"
+#define RUBY_RELEASE_DATE "2008-12-13"
 #define RUBY_VERSION_CODE 187
-#define RUBY_RELEASE_CODE 20081212
+#define RUBY_RELEASE_CODE 20081213
 #define RUBY_PATCHLEVEL 72
 
 #define RUBY_VERSION_MAJOR 1
@@ -9,7 +9,7 @@
 #define RUBY_VERSION_TEENY 7
 #define RUBY_RELEASE_YEAR 2008
 #define RUBY_RELEASE_MONTH 12
-#define RUBY_RELEASE_DAY 12
+#define RUBY_RELEASE_DAY 13
 
 #ifdef RUBY_EXTERN
 RUBY_EXTERN const char ruby_version[];
@@ -25,7 +25,7 @@
 #define RUBY_BIRTH_MONTH 2
 #define RUBY_BIRTH_DAY 24
 
-#define RUBY_RELEASE_STR "MBARI 2 on patchlevel"
+#define RUBY_RELEASE_STR "MBARI 3 on patchlevel"
 #define RUBY_RELEASE_NUM RUBY_PATCHLEVEL
 
 
patches/ruby/1.8.7/p72/mbari-8b.patch000066400000164200147511530510012670 0ustar00diff --git a/ChangeLog b/ChangeLog
index 4c7e3ac..708f5bc 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,51 @@
+Wed Mar 1 12:01:19 2009  Brent Roman  <brent@mbari.org>
+        
+        * eval.c:  fixed missed volatile qualifiers
+        
+        * version.h:  bumped date, MBARI version 8A --> 8B
+        
+Wed Feb 27 12:01:19 2009  Brent Roman  <brent@mbari.org>
+        
+        * rubysig.c:  added support for __anyPowerPC__
+        
+        * version.h:  bumped date
+
+Wed Feb 25 12:01:19 2009  Brent Roman  <brent@mbari.org>
+
+        * gc.c:  default GC.limit=2e6*sizeof(VALUE)
+        
+        * eval.c:  added RB_GC_GUARDs to eval_slit() & more volatile tweaks
+        
+        * re.c:  removed unneeded volatile qualifier & copy in rb_regcomp()
+        
+        * version.h:  bumped date, MBARI version 7A --> 8A
+
+Tue Feb 24 00:01:19 2009  Brent Roman  <brent@mbari.org>
+
+        * cofigure.in:  added --enable-mbari-api and --with-wipe-sites
+
+        * signal.c:  removed CHECK_INTS after kill
+        
+        * test/ruby/suicide.rb:  add tiny delay to let signal propogate
+        
+        * gc.c:  save regs properly on main stack before marking it!
+        
+        * eval.c:  numerous corrections in use of volatile variables w/setjmp()
+        
+        * version.h:  bumped date, MBARI version 7+ --> 7A
+
+Fri Feb 13 00:01:19 2009  Brent Roman  <brent@mbari.org>
+
+        * signal.c:  CHECK_INTS after kill in case of suicide
+        
+        * version.h:  bumped date
+
+Tue Feb 10 00:01:19 2009  Brent Roman  <brent@mbari.org>
+
+        * gc.c:  don't redundantly mark stack before base of current thread
+        
+        * version.h:  bumped date
+
 Mon Feb 09 00:01:19 2009  Brent Roman  <brent@mbari.org>
 
         * rubysig.h:  default values for STACK_WIPE_SITES if x86_64
diff --git a/configure.in b/configure.in
index fe63c0c..885bfc0 100644
--- a/configure.in
+++ b/configure.in
@@ -151,6 +151,24 @@ AC_ARG_ENABLE(frame-address,
 if test $frame_address = yes; then
     AC_DEFINE(USE_BUILTIN_FRAME_ADDRESS)
 fi
+AC_ARG_ENABLE(mbari-api,
+       [  --enable-mbari-api      enable API changes from the MBARI patches. ],
+       [mbari_api=$enableval])
+if test "$mbari_api" = yes; then
+    AC_DEFINE(MBARI_API)
+fi
+AC_ARG_WITH(wipe-sites,
+[  --with-wipe-sites=MASK  override default STACK_WIPES_SITES mask in rubysig.h],
+[wipe_sites=$withval])
+if test "$wipe_sites" != ""; then
+  case $wipe_sites in
+       none|no)  wipe_sites=0x0;;
+       yes) wipe_sites=;;
+  esac
+  if test -n "$wipe_sites"; then
+    AC_DEFINE_UNQUOTED(STACK_WIPE_SITES,$wipe_sites)
+  fi
+fi
 
 AC_ARG_PROGRAM
 
@@ -1783,7 +1801,7 @@ AC_DEFINE_UNQUOTED(RUBY_SITE_ARCHLIB, "${RUBY_SITE_LIB_PATH2}/${sitearch}")
 AC_DEFINE_UNQUOTED(RUBY_VENDOR_ARCHLIB, "${RUBY_VENDOR_LIB_PATH2}/${sitearch}")
 
 AC_ARG_WITH(search-path,
-		[  --with-search-path=DIR specify the additional search path],
+		[  --with-search-path= DIR specify the additional search path],
 		[search_path=$withval])
 if test "$search_path" != ""; then
     AC_DEFINE_UNQUOTED(RUBY_SEARCH_PATH,"$search_path")
diff --git a/eval.c b/eval.c
index e9ce2b7..a73bd2b 100644
--- a/eval.c
+++ b/eval.c
@@ -221,7 +221,7 @@ static VALUE proc_invoke _((VALUE,VALUE,VALUE,VALUE));
 static VALUE rb_f_binding _((VALUE));
 NOINLINE(static void rb_f_END _((void)));
 static VALUE rb_f_block_given_p _((void));
-static VALUE block_pass _((VALUE,NODE*));
+static VALUE block_pass _((volatile VALUE, NODE *volatile));
 
 VALUE rb_cMethod;
 static VALUE method_call _((int, VALUE*, VALUE));
@@ -243,6 +243,30 @@ static int scope_vmode;
 VALUE (*ruby_sandbox_save)_((rb_thread_t));
 VALUE (*ruby_sandbox_restore)_((rb_thread_t));
 NODE* ruby_current_node;
+
+#if 0
+#define SET_CURRENT_SOURCE() (ruby_sourcefile = ruby_current_node->nd_file, \
+			      ruby_sourceline = nd_line(ruby_current_node))
+#else
+#define SET_CURRENT_SOURCE() ((void)0)
+#endif
+
+void
+ruby_set_current_source()
+{
+    if (ruby_current_node) {
+	ruby_sourcefile = ruby_current_node->nd_file;
+	ruby_sourceline = nd_line(ruby_current_node);
+    }
+}
+
+#ifdef MBARI_API
+#define SET_METHOD_SOURCE()  ruby_set_current_source()
+#else
+#define SET_METHOD_SOURCE()  (void)0
+#endif
+
+
 int ruby_safe_level = 0;
 /* safe-level:
    0 - strings from streams/environment/ARGV are tainted (default)
@@ -726,7 +750,7 @@ rb_attr(klass, id, read, write, ex)
     if (!name) {
 	rb_raise(rb_eArgError, "argument needs to be symbol or string");
     }
-    ruby_set_current_source(); /* for Method#__line__ */
+    SET_METHOD_SOURCE();
     len = strlen(name)+2;
     buf = ALLOCA_N(char,len);
     snprintf(buf, len, "@%s", name);
@@ -965,7 +989,7 @@ rb_svar(cnt)
     ID id;
 
     if (!ruby_scope->local_tbl) return NULL;
-    if (cnt >= ruby_scope->local_tbl[0]) return NULL;
+    if ((ID)cnt >= ruby_scope->local_tbl[0]) return NULL;
     id = ruby_scope->local_tbl[cnt+1];
     while (vars) {
 	if (vars->id == id) return &vars->val;
@@ -1123,10 +1147,11 @@ static void scope_dup _((struct SCOPE *));
 } while (0)
 
 static VALUE rb_eval _((VALUE,NODE*));
-static VALUE eval _((VALUE,VALUE,VALUE,const char*,int));
+static VALUE eval _((VALUE,VALUE,volatile VALUE,const char* volatile,int));
 static NODE *compile _((VALUE, const char*, int));
 
-static VALUE rb_yield_0 _((VALUE, VALUE, VALUE, int, int));
+static VALUE rb_yield_0 
+               _((volatile VALUE, volatile VALUE, VALUE, int, volatile int));
 
 #if STACK_WIPE_SITES & 0x20
 #define wipeBeforeYield()  rb_gc_wipe_stack()
@@ -1142,7 +1167,7 @@ static VALUE rb_yield_0 _((VALUE, VALUE, VALUE, int, int));
 #define YIELD_FUNC_LAMBDA 3
 
 static VALUE rb_call _((VALUE,VALUE,ID,int,const VALUE*,int,VALUE));
-static VALUE module_setup _((VALUE,NODE*));
+static VALUE module_setup _((VALUE,NODE *volatile));
 
 static VALUE massign _((VALUE,NODE*,VALUE,int));
 static void assign _((VALUE,NODE*,VALUE,int));
@@ -1174,22 +1199,6 @@ static VALUE trace_func = 0;
 static int tracing = 0;
 static void call_trace_func _((rb_event_t,NODE*,VALUE,ID,VALUE));
 
-#if 0
-#define SET_CURRENT_SOURCE() (ruby_sourcefile = ruby_current_node->nd_file, \
-			      ruby_sourceline = nd_line(ruby_current_node))
-#else
-#define SET_CURRENT_SOURCE() ((void)0)
-#endif
-
-void
-ruby_set_current_source()
-{
-    if (ruby_current_node) {
-	ruby_sourcefile = ruby_current_node->nd_file;
-	ruby_sourceline = nd_line(ruby_current_node);
-    }
-}
-
 static void
 #ifdef HAVE_STDARG_PROTOTYPES
 warn_printf(const char *fmt, ...)
@@ -1251,15 +1260,15 @@ set_backtrace(info, bt)
 static void
 error_print()
 {
-    VALUE errat = Qnil;		/* OK */
+    VALUE errat;
     volatile VALUE eclass, e;
-    const char *einfo;
+    const char * einfo;
     long elen;
 
     if (NIL_P(ruby_errinfo)) return;
 
     PUSH_TAG(PROT_NONE);
-    errat = EXEC_TAG() == 0 ? get_backtrace(ruby_errinfo) : Qnil;
+    errat = EXEC_TAG() ? Qnil : get_backtrace(ruby_errinfo);
     if (EXEC_TAG()) goto error;
     if (NIL_P(errat)){
 	ruby_set_current_source();
@@ -1442,7 +1451,7 @@ ruby_init()
 }
 
 static VALUE
-eval_node(self, node)
+eval_tree(self, node)
     VALUE self;
     NODE *node;
 {
@@ -1591,12 +1600,13 @@ ruby_finalize()
 }
 
 int
-ruby_cleanup(ex)
-    int ex;
+ruby_cleanup(exArg)
+    int exArg;
 {
     int state;
     volatile VALUE errs[2];
-    int nerr;
+    unsigned nerr;
+    volatile int ex = exArg;
 
     errs[1] = ruby_errinfo;
     ruby_safe_level = 0;
@@ -1659,7 +1669,7 @@ ruby_exec_internal()
     /* default visibility is private at toplevel */
     SCOPE_SET(SCOPE_PRIVATE);
     if ((state = EXEC_TAG()) == 0) {
-	eval_node(ruby_top_self, ruby_eval_tree);
+	eval_tree(ruby_top_self, ruby_eval_tree);
     }
     POP_ITER();
     POP_TAG();
@@ -1867,8 +1877,8 @@ rb_eval_cmd(cmd, arg, level)
     int level;
 {
     int state;
-    VALUE val = Qnil;		/* OK */
-    struct SCOPE *saved_scope;
+    VALUE val;
+    struct SCOPE * volatile saved_scope;
     volatile int safe = ruby_safe_level;
 
     if (OBJ_TAINTED(cmd)) {
@@ -1899,9 +1909,7 @@ rb_eval_cmd(cmd, arg, level)
     ruby_safe_level = level;
 
     PUSH_TAG(PROT_NONE);
-    if ((state = EXEC_TAG()) == 0) {
-	val = eval(ruby_top_self, cmd, Qnil, 0, 0);
-    }
+    val = (state = EXEC_TAG()) ? Qnil : eval(ruby_top_self, cmd, Qnil, 0, 0);
     if (ruby_scope->flags & SCOPE_DONT_RECYCLE)
 	scope_dup(saved_scope);
     ruby_scope = saved_scope;
@@ -1940,8 +1948,12 @@ ev_const_defined(cref, id, self)
     return rb_const_defined(cref->nd_clss, id);
 }
 
-NOINLINE(static VALUE
-ev_const_get(cref, id, self))
+NOINLINE(static VALUE ev_const_get _((NODE *cref, ID id, VALUE self)));
+NOINLINE(static void eval_cvar_set _((NODE *node, VALUE result, int warn)));
+NOINLINE(static void eval_cdecl _((VALUE self, NODE *node, VALUE value)));
+
+static VALUE
+ev_const_get(cref, id, self)
     NODE *cref;
     ID id;
     VALUE self;
@@ -2268,8 +2280,8 @@ rb_copy_node_scope(node, rval)
     NODE *rval;
 {
     NODE *copy;
-    
-    ruby_set_current_source();  /* for Method#__line__ */
+
+    SET_METHOD_SOURCE();
     copy=NEW_NODE(NODE_SCOPE,0,rval,node->nd_next);
 
     if (node->nd_tbl) {
@@ -2377,10 +2389,10 @@ arg_defined(self, node, buf, type)
 static const char*
 is_defined(self, node, buf)
     VALUE self;
-    NODE *node;			/* OK */
+    NODE *node;
     char *buf;
 {
-    VALUE val;			/* OK */
+    VALUE val;
     int state;
 
   again:
@@ -2725,14 +2737,15 @@ call_trace_func(event, node, self, id, klass)
     NODE *node;
     VALUE self;
     ID id;
-    VALUE klass;		/* OK */
+    VALUE klass;
 {
-    int state, raised;
+    int state;
+    volatile int raised;
     struct FRAME *prev;
-    NODE *node_save;
+    NODE * volatile node_save;
     VALUE srcfile;
     const char *event_name;
-    rb_thread_t th = curr_thread;
+    volatile rb_thread_t th = curr_thread;
 
     if (!trace_func) return;
     if (tracing) return;
@@ -2941,11 +2954,11 @@ class_prefix(self, cpath)
 NORETURN(static void return_jump _((VALUE)));
 NORETURN(static void break_jump _((VALUE)));
 NORETURN(static void next_jump _((VALUE)));
-NORETURN(static void unknown_node _((NODE * volatile)));
+NORETURN(static void unknown_node _((NODE *)));
 
 static void
 unknown_node(node)
-    NODE *volatile node;
+    NODE *node;
 {
     ruby_current_node = 0;
     if (node->flags == 0) {
@@ -2959,23 +2972,26 @@ unknown_node(node)
     }
 }
 
-
 /*
-  functions factored out of rb_eval() to reduce its stack frame size
-*/
-NOINLINE(static VALUE eval_match2(self, node))
-  VALUE self;
-  NODE *node;
+ *  functions factored out of rb_eval() to reduce its stack frame size
+ */
+#define eval_node_0(n,retType, self, node)  \
+NOINLINE(static retType TOKEN_PASTE(eval_,n) _((self, node)));\
+static retType TOKEN_PASTE(eval_,n)(self, node)
+
+#define eval_node(n,retType) \
+  eval_node_0(n,retType, VALUE self, NODE *node)
+#define eval_node_volatile(n,retType) \
+  eval_node_0(n,retType, volatile VALUE self, NODE * volatile node)
+
+eval_node(match2, VALUE)
 {
     VALUE l = rb_eval(self,node->nd_recv);
     VALUE r = rb_eval(self,node->nd_value);
     return rb_reg_match(l, r);
 }
 
-NOINLINE(static VALUE
-eval_match3(self, node))
-  VALUE self;
-  NODE *node;
+eval_node(match3, VALUE)
 {
   VALUE r = rb_eval(self,node->nd_recv);
   VALUE l = rb_eval(self,node->nd_value);
@@ -2983,16 +2999,14 @@ eval_match3(self, node))
 }
 
 
-NOINLINE(static void
-eval_opt_n(self, node))
-  VALUE self;
-  NODE *node;
+eval_node_volatile(opt_n, void)
 {
   int state;
   PUSH_TAG(PROT_LOOP);
   switch (state = EXEC_TAG()) {
+    case TAG_NEXT:
+      state = 0;
     case 0:
-    opt_n_next:
       while (!NIL_P(rb_gets())) {
 	opt_n_redo:
 	  rb_eval(self, node->nd_body);
@@ -3002,9 +3016,7 @@ eval_opt_n(self, node))
     case TAG_REDO:
       state = 0;
       goto opt_n_redo;
-    case TAG_NEXT:
-      state = 0;
-      goto opt_n_next;
+
     case TAG_BREAK:
       state = 0;
     default:
@@ -3015,10 +3027,7 @@ eval_opt_n(self, node))
 }
 
 
-NOINLINE(static NODE *
-eval_when(self, node))
-  VALUE self;
-  NODE *node;
+eval_node(when, NODE*)
 {
   do {
       NODE *tag = node->nd_head;
@@ -3045,10 +3054,7 @@ eval_when(self, node))
 }
 
 
-NOINLINE (static NODE *
-eval_case(self, node))
-  VALUE self;
-  NODE *node;
+eval_node(case, NODE*)
 {
   VALUE val = rb_eval(self, node->nd_head);
   node = node->nd_body;
@@ -3083,27 +3089,26 @@ eval_case(self, node))
 }
 
 
-NOINLINE (static VALUE
-eval_while(self, node))
-  VALUE self;
-  NODE *node;
+eval_node_volatile(while, VALUE)
 {
   int state;
-  volatile VALUE result = Qnil;
+  VALUE result;
   PUSH_TAG(PROT_LOOP);
   switch (state = EXEC_TAG()) {
     case 0:
-      if (node->nd_state && !RTEST(rb_eval(self, node->nd_cond)))
-	  goto while_out;
-      do {
-	while_redo:
+      if (!(node->nd_state) || RTEST(rb_eval(self, node->nd_cond))) {
+        do {
+	  while_redo:
 #if STACK_WIPE_SITES & 0x10
-          rb_gc_wipe_stack();
+            rb_gc_wipe_stack();
 #endif
-	  rb_eval(self, node->nd_body);
-	while_next:
-	  ;
-      } while (RTEST(rb_eval(self, node->nd_cond)));
+	    rb_eval(self, node->nd_body);
+	  while_next:
+	    ;
+        } while (RTEST(rb_eval(self, node->nd_cond)));
+      }  /* fall thru */
+    default:
+      result=Qnil;
       break;
 
     case TAG_REDO:
@@ -3117,38 +3122,33 @@ eval_while(self, node))
 	  state = 0;
 	  result = prot_tag->retval;
       }
-      /* fall through */
-    default:
-      break;
   }
-while_out:
   POP_TAG();
   if (state) JUMP_TAG(state);
   return result;
 }
 
 
-NOINLINE (static VALUE
-eval_until(self, node))
-  VALUE self;
-  NODE *node;
+eval_node_volatile(until, VALUE)
 {
   int state;
-  volatile VALUE result = Qnil;
+  VALUE result;
   PUSH_TAG(PROT_LOOP);
   switch (state = EXEC_TAG()) {
     case 0:
-      if (node->nd_state && RTEST(rb_eval(self, node->nd_cond)))
-	  goto until_out;
-      do {
-        until_redo:
-#if STACK_WIPE_SITES & 0x10
-          rb_gc_wipe_stack();
-#endif
-	  rb_eval(self, node->nd_body);
-        until_next:
-	  ;
-      } while (!RTEST(rb_eval(self, node->nd_cond)));
+      if (!(node->nd_state) || !RTEST(rb_eval(self, node->nd_cond))) {
+        do {
+          until_redo:
+  #if STACK_WIPE_SITES & 0x10
+            rb_gc_wipe_stack();
+  #endif
+	    rb_eval(self, node->nd_body);
+          until_next:
+	    ;
+        } while (!RTEST(rb_eval(self, node->nd_cond)));
+      }  /* fall thru */
+    default:
+      result=Qnil;
       break;
 
     case TAG_REDO:
@@ -3162,24 +3162,17 @@ eval_until(self, node))
 	  state = 0;
 	  result = prot_tag->retval;
       }
-      /* fall through */
-    default:
-      break;
   }
- until_out:
   POP_TAG();
   if (state) JUMP_TAG(state);
   return result;
 }
 
 
-NOINLINE (static VALUE
-eval_iter(self, node))
-  VALUE self;
-  NODE *node;
+eval_node_volatile(iter, VALUE)
 {
   int state;
-  volatile VALUE result = Qnil;
+  VALUE result;
 
   PUSH_TAG(PROT_LOOP);
   PUSH_BLOCK(node->nd_var, node->nd_body);
@@ -3194,15 +3187,13 @@ eval_iter(self, node))
 	  result = rb_eval(self, node->nd_iter);
       }
       else {
-	  VALUE recv;
-
 	  _block.flags &= ~BLOCK_D_SCOPE;
 	  BEGIN_CALLARGS;
-	  recv = rb_eval(self, node->nd_iter);
+	  result = rb_eval(self, node->nd_iter);
 	  END_CALLARGS;
-	  ruby_current_node = node;
+	  ruby_current_node = (NODE *)node;
 	  SET_CURRENT_SOURCE();
-	  result = rb_call(CLASS_OF(recv),recv,each,0,0,0,self);
+	  result = rb_call(CLASS_OF(result),result,each,0,0,0,self);
       }
       POP_ITER();
       break;
@@ -3220,15 +3211,12 @@ eval_iter(self, node))
 }
 
 
-NOINLINE (static VALUE
-eval_rescue(self, node))
-  VALUE self;
-  NODE *node;
+eval_node_volatile(rescue, VALUE)
 {
     volatile VALUE e_info = ruby_errinfo;
     volatile int rescuing = 0;
     int state;
-    volatile VALUE result = Qnil;
+    VALUE result;
 
     PUSH_TAG(PROT_NONE);
     if ((state = EXEC_TAG()) == 0) {
@@ -3238,6 +3226,7 @@ eval_rescue(self, node))
     else if (rescuing) {
 	if (rescuing < 0) {
 	    /* in rescue argument, just reraise */
+            result = Qnil;
 	}
 	else if (state == TAG_RETRY) {
 	    rescuing = state = 0;
@@ -3279,13 +3268,10 @@ eval_rescue(self, node))
 }
 
 
-NOINLINE (static VALUE
-eval_ensure(self, node))
-  VALUE self;
-  NODE *node;
+eval_node_volatile(ensure, VALUE)
 {
   int state;
-  volatile VALUE result = Qnil;
+  VALUE result;
 
   PUSH_TAG(PROT_NONE);
   if ((state = EXEC_TAG()) == 0) {
@@ -3305,10 +3291,7 @@ eval_ensure(self, node))
 }
 
 
-NOINLINE (static VALUE
-eval_dot(self, node))
-  VALUE self;
-  NODE *node;
+eval_node(dot, VALUE)
 {
   VALUE beg = rb_eval(self, node->nd_beg);
   VALUE end = rb_eval(self, node->nd_end);
@@ -3316,10 +3299,7 @@ eval_dot(self, node))
 }
 
 
-NOINLINE (static VALUE
-eval_flip2(self, node))
-  VALUE self;
-  NODE *node;
+eval_node(flip2, VALUE)
 {
   VALUE *flip = rb_svar(node->nd_cnt);
   if (!flip) rb_bug("unexpected local variable");
@@ -3334,10 +3314,7 @@ eval_flip2(self, node))
 }
 
 
-NOINLINE (static VALUE
-eval_flip3(self, node))
-  VALUE self;
-  NODE *node;
+eval_node(flip3, VALUE)
 {
   VALUE *flip = rb_svar(node->nd_cnt);
   if (!flip) rb_bug("unexpected local variable");
@@ -3349,10 +3326,7 @@ eval_flip3(self, node))
 }
 
 
-NOINLINE (static VALUE
-eval_attrasgn(self, node))
-  VALUE self;
-  NODE *node;
+eval_node(attrasgn, VALUE)
 {
   VALUE recv;
   int argc; VALUE *argv; /* used in SETUP_ARGS */
@@ -3378,10 +3352,7 @@ eval_attrasgn(self, node))
 }
 
 
-NOINLINE (static VALUE
-eval_call(self, node))
-  VALUE self;
-  NODE *node;
+eval_node(call, VALUE)
 {
   VALUE recv;
   int argc; VALUE *argv; /* used in SETUP_ARGS */
@@ -3398,10 +3369,7 @@ eval_call(self, node))
 }
 
 
-NOINLINE (static VALUE
-eval_fcall(self, node))
-  VALUE self;
-  NODE *node;
+eval_node(fcall, VALUE)
 {
   int argc; VALUE *argv; /* used in SETUP_ARGS */
   TMP_PROTECT;
@@ -3415,10 +3383,8 @@ eval_fcall(self, node))
   return rb_call(CLASS_OF(self),self,node->nd_mid,argc,argv,1,self);
 }
 
-NOINLINE (static VALUE
-eval_super(self, node))
-  VALUE self;
-  NODE *node;
+
+eval_node(super, VALUE)
 {
   int argc; VALUE *argv; /* used in SETUP_ARGS */
   TMP_PROTECT;
@@ -3463,15 +3429,12 @@ eval_super(self, node))
 }
 
 
-NOINLINE (static VALUE
-eval_scope(self, node))
-  VALUE self;
-  NODE *node;
+eval_node_volatile(scope, VALUE)
 {
   int state;
-  volatile VALUE result = Qnil;
+  VALUE result;
   struct FRAME frame;
-  NODE *saved_cref = 0;
+  NODE * volatile saved_cref = 0;
 
   frame = *ruby_frame;
   frame.tmp = ruby_frame;
@@ -3506,10 +3469,7 @@ eval_scope(self, node))
   return result;
 }
 
-NOINLINE (static VALUE
-eval_op_asgn1(self, node))
-  VALUE self;
-  NODE *node;
+eval_node(op_asgn1, VALUE)
 {
   int argc; VALUE *argv; /* used in SETUP_ARGS */
   VALUE recv, val, tmp;
@@ -3539,10 +3499,7 @@ eval_op_asgn1(self, node))
 }
 
 
-NOINLINE (static VALUE
-eval_op_asgn2(self, node))
-  VALUE self;
-  NODE *node;
+eval_node(op_asgn2, VALUE)
 {
   ID id = node->nd_next->nd_vid;
   VALUE recv, val, tmp;
@@ -3568,10 +3525,7 @@ eval_op_asgn2(self, node))
 }
 
 
-NOINLINE (static VALUE
-eval_hash(self, node))
-  VALUE self;
-  NODE *node;
+eval_node(hash, VALUE)
 {
   NODE *list;
   VALUE hash = rb_hash_new();
@@ -3591,10 +3545,7 @@ eval_hash(self, node))
 }
 
 
-NOINLINE (static VALUE
-eval_array(self, node))
-  VALUE self;
-  NODE *node;
+eval_node(array, VALUE)
 {
   VALUE ary;
   long i;
@@ -3609,10 +3560,7 @@ eval_array(self, node))
 }
 
 
-NOINLINE (static VALUE
-eval_slit(self, node))
-  VALUE self;
-  NODE *node;
+eval_node(slit, VALUE)
 {
   VALUE str, str2;
   NODE *list = node->nd_next;
@@ -3635,12 +3583,15 @@ eval_slit(self, node))
   }
   switch (nd_type(node)) {
     case NODE_DREGX:
-      return rb_reg_new(RSTRING(str)->ptr, RSTRING(str)->len,
+      str2 = rb_reg_new(RSTRING(str)->ptr, RSTRING(str)->len,
 			  node->nd_cflag);
+      RB_GC_GUARD(str);  /* ensure str is not GC'd in rb_reg_new */
+      return str2;
     case NODE_DREGX_ONCE:	/* regexp expand once */
       str2 = rb_reg_new(RSTRING(str)->ptr, RSTRING(str)->len,
 			  node->nd_cflag);
       nd_set_type(node, NODE_LIT);
+      RB_GC_GUARD(str);  /* ensure str is not GC'd in rb_reg_new */
       return node->nd_lit = str2;
     case NODE_LIT:
       /* other thread may replace NODE_DREGX_ONCE to NODE_LIT */
@@ -3654,10 +3605,7 @@ eval_slit(self, node))
 }
 
         
-NOINLINE (static void
-eval_defn(self, node))
-  VALUE self;
-  NODE *node;
+eval_node(defn, void)
 {
   NODE *body,  *defn;
   VALUE origin = 0;
@@ -3703,10 +3651,7 @@ eval_defn(self, node))
 }
 
 
-NOINLINE (static void
-eval_defs(self, node))
-  VALUE self;
-  NODE *node;
+eval_node(defs, void)
 {
   VALUE recv = rb_eval(self, node->nd_recv);
   VALUE klass;
@@ -3740,10 +3685,7 @@ eval_defs(self, node))
 }
 
 
-NOINLINE (static VALUE
-eval_class(self, node))
-  VALUE self;
-  NODE *node;
+eval_node(class, VALUE)
 {
     VALUE super, klass, tmp, cbase;
     ID cname;
@@ -3799,10 +3741,7 @@ eval_class(self, node))
 }
 
 
-NOINLINE (static VALUE
-eval_module(self, node))
-  VALUE self;
-  NODE *node;
+eval_node(module, VALUE)
 {
   VALUE module, cbase;
   ID cname;
@@ -3836,10 +3775,7 @@ eval_module(self, node))
 }
 
 
-NOINLINE (static VALUE
-eval_sclass(self, node))
-  VALUE self;
-  NODE *node;
+eval_node(sclass, VALUE)
 {
   VALUE klass, result;
 
@@ -3861,10 +3797,7 @@ eval_sclass(self, node))
 }
 
 
-NOINLINE (static VALUE
-eval_defined(self, node))
-  VALUE self;
-  NODE *node;
+eval_node(defined, VALUE)
 {
     char buf[20];
     const char *desc = is_defined(self, node->nd_head, buf);
@@ -3872,17 +3805,18 @@ eval_defined(self, node))
 }
 
 
-NOINLINE (static void
-eval_cvar_set(result, node, bool))
-  VALUE result, bool;
+static void
+eval_cvar_set(node, result, warn)
   NODE *node;
+  VALUE result;
+  int warn;
 {
-  rb_cvar_set(cvar_cbase(), node->nd_vid, result, bool);
+  rb_cvar_set(cvar_cbase(), node->nd_vid, result, warn);
 }
 
 
-NOINLINE (static void
-eval_cdecl(self, node, result))
+static void
+eval_cdecl(self, node, result)
   VALUE self, result;
   NODE *node;
 {
@@ -3897,7 +3831,7 @@ eval_cdecl(self, node, result))
 static VALUE
 rb_eval(self, node)
   VALUE self;
-  NODE *node;
+  NODE * node;
 {
   VALUE result;
 
@@ -3906,8 +3840,6 @@ again:
   result = Qnil;
   if (node) {
     ruby_current_node = node;
-    SET_CURRENT_SOURCE();
-
     switch (nd_type(node)) {
       case NODE_BLOCK:
 	while (node->nd_next) {
@@ -4187,12 +4119,12 @@ again:
 	    rb_raise(rb_eTypeError, "no class/module to define class variable");
 	}
         result = rb_eval(self, node->nd_value);
-        eval_cvar_set(result, node, Qtrue);
+        eval_cvar_set(node, result, Qtrue);
 	break;
 
       case NODE_CVASGN:
         result = rb_eval(self, node->nd_value);
-        eval_cvar_set(result, node, Qfalse);
+        eval_cvar_set(node, result, Qfalse);
 	break;
 
       case NODE_LVAR:
@@ -4378,12 +4310,12 @@ again:
 static VALUE
 module_setup(module, n)
     VALUE module;
-    NODE *n;
+    NODE * volatile n;
 {
-    NODE * volatile node = n->nd_body;
+    NODE *node = n->nd_body;
     int state;
     struct FRAME frame;
-    VALUE result = Qnil;	/* OK */
+    VALUE result;
     TMP_PROTECT;
 
     frame = *ruby_frame;
@@ -4774,16 +4706,16 @@ rb_iter_break()
     break_jump(Qnil);
 }
 
-NORETURN(static void rb_longjmp _((int, VALUE)));
+NORETURN(static void rb_longjmp _((volatile int, volatile VALUE)));
 static VALUE make_backtrace _((void));
 
 static void
 rb_longjmp(tag, mesg)
-    int tag;
-    VALUE mesg;
+    volatile int tag;
+    volatile VALUE mesg;
 {
     VALUE at;
-    rb_thread_t th = curr_thread;
+    volatile rb_thread_t th = curr_thread;
 
     if (rb_thread_set_raised(th)) {
 	ruby_errinfo = exception_error;
@@ -4914,14 +4846,12 @@ rb_make_exception(argc, argv)
     int argc;
     VALUE *argv;
 {
-    VALUE mesg;
+    VALUE mesg = Qnil;
     ID exception;
     int n;
 
-    mesg = Qnil;
     switch (argc) {
       case 0:
-	mesg = Qnil;
 	break;
       case 1:
 	if (NIL_P(argv[0])) break;
@@ -5140,19 +5070,21 @@ rb_need_block()
 
 static VALUE
 rb_yield_0(val, self, klass, flags, avalue)
-    VALUE val, self, klass;	/* OK */
-    int flags, avalue;
+    volatile VALUE val, self;
+    VALUE klass;
+    int flags;
+    volatile int avalue;
 {
-    NODE *node, *var;
+    NODE *var, *volatile node;
     volatile VALUE result = Qnil;
     volatile VALUE old_cref;
     volatile VALUE old_wrapper;
     struct BLOCK * volatile block;
     struct SCOPE * volatile old_scope;
-    int old_vmode;
+    volatile int old_vmode;
     struct FRAME frame;
     NODE *cnode = ruby_current_node;
-    int lambda = flags & YIELD_LAMBDA_CALL;
+    volatile int lambda = flags & YIELD_LAMBDA_CALL;
     int state;
 
     rb_need_block();
@@ -5262,56 +5194,49 @@ rb_yield_0(val, self, klass, flags, avalue)
 
     PUSH_ITER(block->iter);
     PUSH_TAG(lambda ? PROT_NONE : PROT_YIELD);
-    if ((state = EXEC_TAG()) == 0) {
-      redo:
+    switch (state = EXEC_TAG()) {
+      case TAG_REDO:
+	state = 0;
+	CHECK_INTS;
+      case 0:
 	if (nd_type(node) == NODE_CFUNC || nd_type(node) == NODE_IFUNC) {
-	    switch (node->nd_state) {
-	      case YIELD_FUNC_LAMBDA:
-		if (!avalue) {
-		    val = rb_ary_new3(1, val);
-		}
-		break;
-	      case YIELD_FUNC_AVALUE:
-		if (!avalue) {
-		    val = svalue_to_avalue(val);
-		}
-		break;
-	      default:
-		if (avalue) {
-		    val = avalue_to_svalue(val);
-		}
-		if (val == Qundef && node->nd_state != YIELD_FUNC_SVALUE)
-		    val = Qnil;
+	  switch (node->nd_state) {
+	    case YIELD_FUNC_LAMBDA:
+	      if (!avalue) {
+		  val = rb_ary_new3(1, val);
+	      }
+	      break;
+	    case YIELD_FUNC_AVALUE:
+	      if (!avalue) {
+		  val = svalue_to_avalue(val);
+	      }
+	      break;
+	    default:
+	      if (avalue) {
+		  val = avalue_to_svalue(val);
+	      }
+	      if (val == Qundef && node->nd_state != YIELD_FUNC_SVALUE)
+		  val = Qnil;
 	    }
 	    result = (*node->nd_cfnc)(val, node->nd_tval, self);
-	}
-	else {
+	 }else
 	    result = rb_eval(self, node);
-	}
-    }
-    else {
-	switch (state) {
-	  case TAG_REDO:
-	    state = 0;
-	    CHECK_INTS;
-	    goto redo;
-	  case TAG_NEXT:
-	    if (!lambda) {
-		state = 0;
-		result = prot_tag->retval;
-	    }
-	    break;
-	  case TAG_BREAK:
-	    if (TAG_DST()) {
-		result = prot_tag->retval;
-	    }
-	    else {
-		lambda = Qtrue;	/* just pass TAG_BREAK */
-	    }
-	    break;
-	  default:
-	    break;
-	}
+          break;
+	case TAG_NEXT:
+	  if (!lambda) {
+	      state = 0;
+	      result = prot_tag->retval;
+	  }
+	  break;
+	case TAG_BREAK:
+	  if (TAG_DST()) {
+	      result = prot_tag->retval;
+	  }
+	  else {
+	      lambda = Qtrue;	/* just pass TAG_BREAK */
+	  }
+	default:
+	  break;
     }
     POP_TAG();
     POP_ITER();
@@ -5597,11 +5522,12 @@ assign(self, lhs, val, pcall)
 
 VALUE
 rb_iterate(it_proc, data1, bl_proc, data2)
-    VALUE (*it_proc) _((VALUE)), (*bl_proc)(ANYARGS);
-    VALUE data1, data2;
+    VALUE (* volatile it_proc) _((VALUE)), (*bl_proc)(ANYARGS);
+    volatile VALUE data1;
+    VALUE data2;
 {
     int state;
-    volatile VALUE retval = Qnil;
+    VALUE retval;
     NODE *node = NEW_IFUNC(bl_proc, data2);
     VALUE self = ruby_top_self;
 
@@ -5625,12 +5551,7 @@ rb_iterate(it_proc, data1, bl_proc, data2)
     POP_BLOCK();
     POP_TAG();
 
-    switch (state) {
-      case 0:
-	break;
-      default:
-	JUMP_TAG(state);
-    }
+    if (state) JUMP_TAG(state);
     return retval;
 }
 
@@ -5662,16 +5583,17 @@ handle_rescue(self, node)
 
 VALUE
 #ifdef HAVE_STDARG_PROTOTYPES
-rb_rescue2(VALUE (*b_proc)(ANYARGS), VALUE data1, VALUE (*r_proc)(ANYARGS), VALUE data2, ...)
+rb_rescue2(VALUE (* volatile b_proc)(ANYARGS), volatile VALUE data1, 
+           VALUE (* volatile r_proc)(ANYARGS), volatile VALUE data2, ...)
 #else
 rb_rescue2(b_proc, data1, r_proc, data2, va_alist)
-    VALUE (*b_proc)(ANYARGS), (*r_proc)(ANYARGS);
-    VALUE data1, data2;
+    VALUE (* volatile b_proc)(ANYARGS), (* volatile r_proc)(ANYARGS);
+    volatile VALUE data1, data2;
     va_dcl
 #endif
 {
     int state;
-    volatile VALUE result;
+    VALUE result;
     volatile VALUE e_info = ruby_errinfo;
     volatile int handle = Qfalse;
     VALUE eclass;
@@ -5730,9 +5652,9 @@ VALUE
 rb_protect(proc, data, state)
     VALUE (*proc) _((VALUE));
     VALUE data;
-    int *state;
+    int * volatile state;
 {
-    VALUE result = Qnil;	/* OK */
+    VALUE result;
     int status;
 
     PUSH_TAG(PROT_NONE);
@@ -5745,22 +5667,18 @@ rb_protect(proc, data, state)
     if (state) {
 	*state = status;
     }
-    if (status != 0) {
-	return Qnil;
-    }
-
-    return result;
+    return status ? Qnil : result;
 }
 
 VALUE
 rb_ensure(b_proc, data1, e_proc, data2)
     VALUE (*b_proc)();
     VALUE data1;
-    VALUE (*e_proc)();
-    VALUE data2;
+    VALUE (* volatile e_proc)();
+    volatile VALUE data2;
 {
     int state;
-    volatile VALUE result = Qnil;
+    VALUE result;
     VALUE retval;
 
     PUSH_TAG(PROT_NONE);
@@ -5768,7 +5686,7 @@ rb_ensure(b_proc, data1, e_proc, data2)
 	result = (*b_proc)(data1);
     }
     POP_TAG();
-    retval = prot_tag ? prot_tag->retval : Qnil;	/* save retval */
+    if (prot_tag) retval = prot_tag->retval;  /* save retval */
     if (!thread_no_ensure()) {
 	(*e_proc)(data2);
     }
@@ -5782,7 +5700,7 @@ rb_with_disable_interrupt(proc, data)
     VALUE (*proc)();
     VALUE data;
 {
-    VALUE result = Qnil;	/* OK */
+    VALUE result;
     int status;
 
     DEFER_INTS;
@@ -6034,16 +5952,16 @@ call_cfunc(func, recv, len, argc, argv)
 
 static VALUE
 rb_call0(klass, recv, id, oid, argc, argv, body, flags)
-    VALUE klass, recv;
-    ID    id;
+    volatile VALUE klass, recv;
+    volatile ID    id;
     ID    oid;
-    int argc;			/* OK */
-    VALUE *argv;		/* OK */
-    NODE * volatile body;
+    int argc;
+    VALUE *argv;
+    NODE *body;
     int flags;
 {
     NODE *b2;		/* OK */
-    volatile VALUE result = Qnil;
+    VALUE result;
     int itr;
     static int tick;
     TMP_PROTECT;
@@ -6150,9 +6068,10 @@ rb_call0(klass, recv, id, oid, argc, argv, body, flags)
 	    Data_Get_Struct(body->nd_cval, struct BLOCK, data);
 	    EXEC_EVENT_HOOK(RUBY_EVENT_CALL, data->body, recv, id, klass);
 	}
-	result = proc_invoke(body->nd_cval, rb_ary_new4(argc, argv), recv, klass);
+	result = proc_invoke(body->nd_cval, rb_ary_new4(argc,argv), recv,klass);
 	if (event_hooks) {
-	    EXEC_EVENT_HOOK(RUBY_EVENT_RETURN, ruby_current_node, recv, id, klass);
+	    EXEC_EVENT_HOOK(RUBY_EVENT_RETURN,
+                            ruby_current_node, recv, id, klass);
 	}
 	break;
 
@@ -6160,7 +6079,7 @@ rb_call0(klass, recv, id, oid, argc, argv, body, flags)
 	{
 	    int state;
 	    VALUE *local_vars;	/* OK */
-	    NODE *saved_cref = 0;
+	    NODE * volatile saved_cref = 0;
 
 	    PUSH_SCOPE();
 	    if (body->nd_rval) {
@@ -6206,8 +6125,9 @@ rb_call0(klass, recv, id, oid, argc, argv, body, flags)
 
 		    i = node->nd_cnt;
 		    if (i > argc) {
-			rb_raise(rb_eArgError, "wrong number of arguments (%d for %d)",
-				 argc, i);
+			rb_raise(rb_eArgError, 
+                                 "wrong number of arguments (%d for %d)",
+                                 argc, i);
 		    }
 		    if (!node->nd_rest) {
 			NODE *optnode = node->nd_opt;
@@ -6275,7 +6195,8 @@ rb_call0(klass, recv, id, oid, argc, argv, body, flags)
 	    }
 	    POP_TAG();
 	    if (event_hooks) {
-		EXEC_EVENT_HOOK(RUBY_EVENT_RETURN, ruby_current_node, recv, id, klass);
+		EXEC_EVENT_HOOK(RUBY_EVENT_RETURN, ruby_current_node,
+                                recv, id, klass);
 	    }
 	    POP_VARS();
 	    POP_CLASS();
@@ -6303,7 +6224,6 @@ rb_call0(klass, recv, id, oid, argc, argv, body, flags)
 
       default:
 	unknown_node(body);
-	break;
     }
     POP_FRAME();
     POP_ITER();
@@ -6471,7 +6391,7 @@ rb_funcall_rescue(recv, mid, n, va_alist)
     va_dcl
 #endif
 {
-    VALUE result = Qnil;	/* OK */
+    VALUE result;
     int status;
     va_list ar;
 
@@ -6687,12 +6607,13 @@ compile(src, file, line)
 
 static VALUE
 eval(self, src, scope, file, line)
-    VALUE self, src, scope;
-    const char *file;
+    VALUE self, src;
+    volatile VALUE scope;
+    const char * volatile file;
     int line;
 {
     struct BLOCK *data = NULL;
-    volatile VALUE result = Qnil;
+    VALUE result;
     struct SCOPE * volatile old_scope;
     struct BLOCK * volatile old_block;
     struct RVarmap * volatile old_dyna_vars;
@@ -6700,7 +6621,7 @@ eval(self, src, scope, file, line)
     int volatile old_vmode;
     volatile VALUE old_wrapper;
     struct FRAME frame;
-    NODE *nodesave = ruby_current_node;
+    NODE * volatile nodesave = ruby_current_node;
     volatile int iter = ruby_frame->iter;
     volatile int safe = ruby_safe_level;
     int state;
@@ -6765,7 +6686,7 @@ eval(self, src, scope, file, line)
 	    compile_error(0);
 	}
 	if (!NIL_P(result)) ruby_errinfo = result;
-	result = eval_node(self, node);
+	result = eval_tree(self, node);
     }
     POP_TAG();
     POP_CLASS();
@@ -6891,12 +6812,13 @@ rb_f_eval(argc, argv, self)
 static VALUE
 exec_under(func, under, cbase, args)
     VALUE (*func)();
-    VALUE under, cbase;
+    VALUE under;
+    volatile VALUE cbase;
     void *args;
 {
-    VALUE val = Qnil;		/* OK */
+    VALUE val;
     int state;
-    int mode;
+    volatile int mode;
     struct FRAME *f = ruby_frame;
 
     PUSH_CLASS(under);
@@ -7182,9 +7104,9 @@ rb_load(fname, wrap)
     volatile int prohibit_int = rb_prohibit_interrupt;
     volatile ID last_func;
     volatile VALUE wrapper = ruby_wrapper;
-    volatile VALUE self = ruby_top_self;
+    VALUE self = ruby_top_self;
     NODE *volatile last_node;
-    NODE *saved_cref = ruby_cref;
+    NODE *volatile saved_cref = ruby_cref;
 
     if (wrap && ruby_safe_level >= 4) {
 	StringValue(fname);
@@ -7233,7 +7155,7 @@ rb_load(fname, wrap)
     ruby_current_node = 0;
     if (state == 0) {
 	NODE *node;
-	volatile int critical;
+        int critical;
 
 	DEFER_INTS;
 	ruby_in_eval++;
@@ -7245,7 +7167,7 @@ rb_load(fname, wrap)
 	rb_thread_critical = critical;
 	ALLOW_INTS;
 	if (ruby_nerrs == 0) {
-	    eval_node(self, node);
+	    eval_tree(self, node);
 	}
     }
     ruby_frame->last_func = last_func;
@@ -7278,7 +7200,7 @@ void
 rb_load_protect(fname, wrap, state)
     VALUE fname;
     int wrap;
-    int *state;
+    int * volatile state;
 {
     int status;
 
@@ -7567,7 +7489,7 @@ rb_require_safe(fname, safe)
     VALUE fname;
     int safe;
 {
-    VALUE result = Qnil;
+    VALUE result;
     volatile VALUE errinfo = ruby_errinfo;
     int state;
     struct {
@@ -7618,7 +7540,8 @@ rb_require_safe(fname, safe)
 		rb_provide_feature(feature);
 		result = Qtrue;
 	    }
-	}
+	}else
+          result = Qnil;
     }
     POP_TAG();
     ruby_current_node = saved.node;
@@ -8286,7 +8209,7 @@ rb_f_at_exit()
 void
 rb_exec_end_proc()
 {
-    struct end_proc_data *link, *tmp;
+    struct end_proc_data *tmp, *volatile link;
     int status;
     volatile int safe = ruby_safe_level;
 
@@ -9009,8 +8932,9 @@ proc_invoke(proc, args, self, klass)
     int state;
     volatile int safe = ruby_safe_level;
     volatile VALUE old_wrapper = ruby_wrapper;
-    volatile int pcall, avalue = Qtrue;
-    volatile VALUE tmp = args;
+    volatile int pcall;
+    int avalue = Qtrue;
+    VALUE tmp = args;
     VALUE bvar = Qnil;
 
     if (rb_block_given_p() && ruby_frame->last_func) {
@@ -9316,15 +9240,15 @@ proc_binding(proc)
 
 static VALUE
 block_pass(self, node)
-    VALUE self;
-    NODE *node;
+    volatile VALUE self;
+    NODE *volatile node;
 {
-    VALUE proc = rb_eval(self, node->nd_body);	/* OK */
+    volatile VALUE proc = rb_eval(self, node->nd_body);
     VALUE b;
     struct BLOCK * volatile old_block;
     struct BLOCK _block;
     struct BLOCK *data;
-    volatile VALUE result = Qnil;
+    VALUE result;
     int state;
     volatile int orphan;
     volatile int safe = ruby_safe_level;
@@ -9371,20 +9295,24 @@ block_pass(self, node)
 
     PUSH_TAG(PROT_LOOP);
     state = EXEC_TAG();
-    if (state == 0) {
-      retry:
+    switch (state) {
+      case TAG_RETRY:
+        state = 0;
+      case 0:
 	proc_set_safe_level(proc);
 	if (safe > ruby_safe_level)
 	    ruby_safe_level = safe;
 	result = rb_eval(self, node->nd_iter);
-    }
-    else if (state == TAG_BREAK && TAG_DST()) {
-	result = prot_tag->retval;
-	state = 0;
-    }
-    else if (state == TAG_RETRY) {
-	state = 0;
-	goto retry;
+        break;
+      case TAG_BREAK:
+        result = Qnil;
+        if (TAG_DST()) {
+	  result = prot_tag->retval;
+	  state = 0;
+        }
+        break;
+      default:
+        result = Qnil;
     }
     POP_TAG();
     POP_ITER();
@@ -9401,7 +9329,6 @@ block_pass(self, node)
       default:
 	JUMP_TAG(state);
     }
-
     return result;
 }
 
@@ -9735,7 +9662,7 @@ method_call(argc, argv, method)
     VALUE *argv;
     VALUE method;
 {
-    VALUE result = Qnil;	/* OK */
+    VALUE result;
     struct METHOD *data;
     int safe;
 
@@ -10030,12 +9957,9 @@ static VALUE
 bmcall(args, method)
     VALUE args, method;
 {
-    volatile VALUE a;
-    VALUE ret;
-
-    a = svalue_to_avalue(args);
-    ret = method_call(RARRAY(a)->len, RARRAY(a)->ptr, method);
-    a = Qnil; /* prevent tail call */
+    VALUE a = svalue_to_avalue(args);
+    VALUE ret = method_call(RARRAY(a)->len, RARRAY(a)->ptr, method);
+    RB_GC_GUARD(a);  /* ensure a is not GC'd during method_call */
     return ret;
 }
 
@@ -10151,7 +10075,7 @@ rb_mod_define_method(argc, argv, mod)
     else {
 	rb_raise(rb_eArgError, "wrong number of arguments (%d for 1)", argc);
     }
-    ruby_set_current_source(); /* for Method#__line__ */
+    SET_METHOD_SOURCE();
     if (RDATA(body)->dmark == (RUBY_DATA_FUNC)bm_mark) {
 	node = NEW_DMETHOD(method_unbind(body));
     }
@@ -10184,12 +10108,16 @@ rb_mod_define_method(argc, argv, mod)
 }
 
 
+#ifdef MBARI_API
 /*
  * call-seq:
  *    meth.__file__  => String  
  *
  * returns the filename containing this method's definition
+ *
  * raises ArgumentError if method has no associated ruby source code
+ *
+ * <i>Only available when MBARI_API extentions are enabled at build time</i>
  */
  
 static VALUE
@@ -10212,7 +10140,10 @@ method_source_file_name(VALUE method)
  *    meth.__line__  => Fixnum  
  *
  * returns the starting line number of this method
+ *
  * raises ArgumentError if method has no associated ruby source code
+ *
+ * <i>Only available when MBARI_API extentions are enabled at build time</i>
  */
  
 static VALUE
@@ -10231,13 +10162,15 @@ method_source_line(VALUE method)
 }
 
 
-
 /*
  * call-seq:
  *    prc.__file__  => String  
  *
  * returns the filename where this proc is defined
+ *
  * raises ArgumentError if proc has no associated ruby source
+ *
+ * <i>Only available when MBARI_API extentions are enabled at build time</i>
  */
  
 static VALUE
@@ -10259,7 +10192,10 @@ proc_source_file_name(VALUE block)
  *    prc.__line__  => Fixnum  
  *
  * returns the starting line number of this proc
+ *
  * raises ArgumentError if proc has no associated ruby source code
+ *
+ * <i>Only available when MBARI_API extentions are enabled at build time</i>
  */
  
 static VALUE
@@ -10274,6 +10210,8 @@ proc_source_line(VALUE block)
     rb_raise(rb_eArgError, "native Proc");
 }
 
+#endif  /* MBARI_API */
+
 
 /*
  *  <code>Proc</code> objects are blocks of code that have been bound to
@@ -10326,8 +10264,6 @@ Init_Proc()
     rb_define_method(rb_cProc, "to_s", proc_to_s, 0);
     rb_define_method(rb_cProc, "to_proc", proc_to_self, 0);
     rb_define_method(rb_cProc, "binding", proc_binding, 0);
-    rb_define_method(rb_cProc, "__file__", proc_source_file_name, 0);
-    rb_define_method(rb_cProc, "__line__", proc_source_line, 0);
 
     rb_define_global_function("proc", proc_lambda, 0);
     rb_define_global_function("lambda", proc_lambda, 0);
@@ -10348,8 +10284,6 @@ Init_Proc()
     rb_define_method(rb_cMethod, "owner", method_owner, 0);
     rb_define_method(rb_cMethod, "unbind", method_unbind, 0);
     rb_define_method(rb_mKernel, "method", rb_obj_method, 1);
-    rb_define_method(rb_cMethod, "__file__", method_source_file_name, 0);
-    rb_define_method(rb_cMethod, "__line__", method_source_line, 0);
 
     rb_cUnboundMethod = rb_define_class("UnboundMethod", rb_cObject);
     rb_undef_alloc_func(rb_cUnboundMethod);
@@ -10362,9 +10296,16 @@ Init_Proc()
     rb_define_method(rb_cUnboundMethod, "name", method_name, 0);
     rb_define_method(rb_cUnboundMethod, "owner", method_owner, 0);
     rb_define_method(rb_cUnboundMethod, "bind", umethod_bind, 1);
+    rb_define_method(rb_cModule, "instance_method", rb_mod_method, 1);
+    
+#ifdef MBARI_API
     rb_define_method(rb_cUnboundMethod, "__file__", method_source_file_name, 0);
     rb_define_method(rb_cUnboundMethod, "__line__", method_source_line, 0);
-    rb_define_method(rb_cModule, "instance_method", rb_mod_method, 1);
+    rb_define_method(rb_cProc, "__file__", proc_source_file_name, 0);
+    rb_define_method(rb_cProc, "__line__", proc_source_line, 0);
+    rb_define_method(rb_cMethod, "__file__", method_source_file_name, 0);
+    rb_define_method(rb_cMethod, "__line__", method_source_line, 0);
+#endif
 }
 
 /*
@@ -10910,7 +10851,7 @@ static void
 rb_thread_save_context(th)
     rb_thread_t th;
 {
-    int len;
+    size_t len;
     static VALUE tval;
 
     len = ruby_stack_length(th->stk_start,&th->stk_pos);
@@ -11112,7 +11053,6 @@ rb_thread_restore_context(th, exit)
 
 #if HAVE_ALLOCA  /* use alloca to grow stack in O(1) time */
     VALUE v;
-    volatile VALUE *space;
 
     if (!th->stk_ptr) rb_bug("unsaved context");
 #  if !STACK_GROW_DIRECTION  /* unknown at compile time */
@@ -11120,13 +11060,15 @@ rb_thread_restore_context(th, exit)
 #  endif
 #  if STACK_GROW_DIRECTION <= 0
       pos -= th->stk_len;
-      if (&v > pos) space=ALLOCA_N(VALUE, &v-pos);
+      if (&v > pos) 
+        (volatile void *)ALLOCA_N(VALUE, &v-pos);
 #  endif
 #  if !STACK_GROW_DIRECTION
     }else
 #  endif
 #if STACK_GROW_DIRECTION >= 0  /* stack grows upward */
-      if (&v < pos + th->stk_len) space=ALLOCA_N(VALUE, pos+th->stk_len - &v);
+      if (&v < pos + th->stk_len) 
+        (volatile void *)ALLOCA_N(VALUE, pos+th->stk_len - &v);
 #  endif
 
 #else  /* recursive O(n/1024) if extending stack > 1024 VALUEs */
@@ -11737,8 +11679,6 @@ rb_thread_select(max, read, write, except, timeout)
     return curr_thread->select_value;
 }
 
-static int rb_thread_join _((rb_thread_t, double));
-
 static int
 rb_thread_join(th, limit)
     rb_thread_t th;
@@ -13450,7 +13390,7 @@ static VALUE
 rb_callcc(self)
     VALUE self;
 {
-    rb_thread_t th = prep4callcc();
+    volatile rb_thread_t th = prep4callcc();
     return THREAD_SAVE_CONTEXT(th) ?
       th->result
           :
@@ -13505,18 +13445,21 @@ rb_cont_call(argc, argv, cont)
 }
 
 
+#ifdef MBARI_API
 /*
  *  call-seq:
  *     cont.thread
  *  
  *  Returns the thread on which this continuation can be called
- *              (or nil if that thread has died)
+ *  or nil if that thread has died
  *
  *     t = Thread.new {callcc{|c| $x=c}; sleep 5}
  *     sleep 1
  *     $x.thread                             #=> t
  *     sleep 10
  *     $x.thread                             #=> nil
+ *
+ *  <i>Only available when MBARI_API extentions are enabled at build time</i>
  */
 static VALUE
 rb_cont_thread(cont)
@@ -13526,6 +13469,7 @@ rb_cont_thread(cont)
   cc_purge(th);
   return th->thread;
 }
+#endif
 
 
 struct thgroup {
@@ -13784,21 +13728,20 @@ rb_exec_recursive(func, obj, arg)
     VALUE obj;
     VALUE arg;
 {
-    VALUE hash = rb_thread_local_aref(rb_thread_current(), recursive_key);
-    VALUE objid = rb_obj_id(obj);
+    volatile VALUE hash = 
+      rb_thread_local_aref(rb_thread_current(), recursive_key);
+    volatile VALUE objid = rb_obj_id(obj);
 
     if (recursive_check(hash, objid)) {
 	return (*func) (obj, arg, Qtrue);
     }
     else {
-	VALUE result = Qundef;
+	VALUE result;
 	int state;
 
 	hash = recursive_push(hash, objid);
 	PUSH_TAG(PROT_NONE);
-	if ((state = EXEC_TAG()) == 0) {
-	    result = (*func) (obj, arg, Qfalse);
-	}
+	result = (state = EXEC_TAG()) ? Qundef : (*func) (obj, arg, Qfalse);
 	POP_TAG();
 	recursive_pop(hash, objid);
 	if (state)
@@ -13881,7 +13824,9 @@ Init_Thread()
     rb_undef_method(CLASS_OF(rb_cCont), "new");
     rb_define_method(rb_cCont, "call", rb_cont_call, -1);
     rb_define_method(rb_cCont, "[]", rb_cont_call, -1);
+#ifdef MBARI_API
     rb_define_method(rb_cCont, "thread", rb_cont_thread, 0);
+#endif
     rb_define_global_function("callcc", rb_callcc, 0);
     rb_global_variable(&cont_protect);
 
@@ -13933,10 +13878,11 @@ Init_Thread()
 
 static VALUE
 rb_f_catch(dmy, tag)
-    VALUE dmy, tag;
+    VALUE dmy;
+    volatile VALUE tag;
 {
     int state;
-    VALUE val = Qnil;		/* OK */
+    VALUE val;
 
     tag = ID2SYM(rb_to_id(tag));
     PUSH_TAG(tag);
diff --git a/gc.c b/gc.c
index 3314171..167dfcd 100644
--- a/gc.c
+++ b/gc.c
@@ -43,7 +43,7 @@ int _setjmp(), _longjmp();
 #if defined(MSDOS) || defined(__human68k__)
 #define GC_MALLOC_LIMIT 200000
 #else
-#define GC_MALLOC_LIMIT 8000000
+#define GC_MALLOC_LIMIT (2000000*sizeof(VALUE))
 #endif
 #endif
 
@@ -60,6 +60,7 @@ static VALUE *stack_limit, *gc_stack_limit;
 static size_t malloc_increase = 0;
 static size_t malloc_limit = GC_MALLOC_LIMIT;
 
+#ifdef MBARI_API
 /*
  *  call-seq:
  *     GC.limit    => increase limit in bytes
@@ -67,6 +68,7 @@ static size_t malloc_limit = GC_MALLOC_LIMIT;
  *  Get the # of bytes that may be allocated before triggering
  *  a mark and sweep by the garbarge collector to reclaim unused storage.
  *
+ *  <i>Only available when MBARI_API extentions are enabled at build time</i>
  */
 static VALUE gc_getlimit(VALUE mod)
 {
@@ -84,12 +86,14 @@ static VALUE gc_getlimit(VALUE mod)
  *     GC.limit=5000000   #=> 5000000
  *     GC.limit           #=> 5000000
  *     GC.limit=-50       #=> 5000000
- *     GC.limit=0         #=> 0
+ *     GC.limit=0         #=> 0  #functionally equivalent to GC.stress=true
  *
+ *  <i>Only available when MBARI_API extentions are enabled at build time</i>
  */
 static VALUE gc_setlimit(VALUE mod, VALUE newLimit)
 {
   long limit = NUM2LONG(newLimit);
+  rb_secure(2);
   if (limit < 0) return gc_getlimit(mod);
   malloc_limit = limit;
   return newLimit;
@@ -98,12 +102,13 @@ static VALUE gc_setlimit(VALUE mod, VALUE newLimit)
 
 /*
  *  call-seq:
- *     GC.increase
+ *     GC.growth
  *
  *  Get # of bytes that have been allocated since the last mark & sweep
  *
+ *  <i>Only available when MBARI_API extentions are enabled at build time</i>
  */
-static VALUE gc_increase(VALUE mod)
+static VALUE gc_growth(VALUE mod)
 {
   return ULONG2NUM(malloc_increase);
 }
@@ -115,6 +120,7 @@ static VALUE gc_increase(VALUE mod)
  *
  *  Purge ghost references from recently freed stack space
  *
+ *  <i>Only available when MBARI_API extentions are enabled at build time</i>
  */
 static VALUE gc_exorcise(VALUE mod)
 {
@@ -122,6 +128,55 @@ static VALUE gc_exorcise(VALUE mod)
   return Qnil;
 }
 
+#else /* no api changes */
+
+static size_t unstressed_malloc_limit = GC_MALLOC_LIMIT;
+
+/*
+ *  call-seq:
+ *    GC.stress                 => true or false
+ *
+ *  returns current status of GC stress mode.
+ *
+ *  <i>Only available when MBARI_API extentions are disabled at build time</i>
+ */
+
+static VALUE
+gc_stress_get(self)
+    VALUE self;
+{
+    return malloc_limit ? Qfalse : Qtrue;
+}
+
+/*
+ *  call-seq:
+ *    GC.stress = bool          => bool
+ *
+ *  updates GC stress mode.
+ *
+ *  When GC.stress = true, GC is invoked for all GC opportunity:
+ *  all memory and object allocation.
+ *
+ *  Since it makes Ruby very slow, it is only for debugging.
+ *
+ *  <i>Only available when MBARI_API extentions are enabled at build time</i>
+ */
+
+static VALUE
+gc_stress_set(self, bool)
+    VALUE self, bool;
+{
+    rb_secure(2);
+    if (!RTEST(bool))
+      malloc_limit = unstressed_malloc_limit;
+    else if (malloc_limit > 0) {
+      unstressed_malloc_limit = malloc_limit;
+      malloc_limit = 0;
+    }
+    return bool;
+}
+
+#endif /* MBARI_API */
 
 static void run_final();
 static VALUE nomem_error;
@@ -512,6 +567,7 @@ static unsigned int STACK_LEVEL_MAX = 655300;
 
 #ifndef nativeAllocA
   /* portable way to return an approximate stack pointer */
+NOINLINE(VALUE *__sp(void));
 VALUE *__sp(void) {
   VALUE tos;
   return &tos;
@@ -548,7 +604,7 @@ stack_grow_direction(addr)
 # define STACK_UPPER(a, b) (rb_gc_stack_grow_direction > 0 ? a : b)
 #endif
 
-int
+size_t
 ruby_stack_length(start, base)
     VALUE *start, **base;
 {
@@ -733,7 +789,7 @@ mark_locations_array(x, n)
     }
 }
 
-void inline
+inline void
 rb_gc_mark_locations(start, end)
     VALUE *start, *end;
 {
@@ -1103,7 +1159,7 @@ gc_sweep()
     RVALUE *p, *pend, *final_list;
     int freed = 0;
     int i;
-    unsigned long free_min = 0;
+    long free_min = 0;
 
     for (i = 0; i < heaps_used; i++) {
         free_min += heaps[i].limit;
@@ -1376,7 +1432,6 @@ garbage_collect_0(VALUE *top_frame)
 {
     struct gc_list *list;
     struct FRAME * frame;
-    jmp_buf save_regs_gc_mark;
     SET_STACK_END;
 
 #ifdef HAVE_NATIVETHREAD
@@ -1415,19 +1470,15 @@ garbage_collect_0(VALUE *top_frame)
 	mark_tbl(finalizer_table);
     }
 
-    FLUSH_REGISTER_WINDOWS;
-    /* This assumes that all registers are saved into the jmp_buf (and stack) */
-    rb_setjmp(save_regs_gc_mark);
-    mark_locations_array((VALUE*)save_regs_gc_mark, sizeof(save_regs_gc_mark) / sizeof(VALUE *));
 #if STACK_GROW_DIRECTION < 0
-    rb_gc_mark_locations(top_frame, rb_gc_stack_start);
+    rb_gc_mark_locations(top_frame, rb_curr_thread->stk_start);
 #elif STACK_GROW_DIRECTION > 0
-    rb_gc_mark_locations(rb_gc_stack_start, top_frame + 1);
+    rb_gc_mark_locations(rb_curr_thread->stk_start, top_frame + 1);
 #else
     if (rb_gc_stack_grow_direction < 0)
-	rb_gc_mark_locations(top_frame, rb_gc_stack_start);
+	rb_gc_mark_locations(top_frame, rb_curr_thread->stk_start);
     else
-	rb_gc_mark_locations(rb_gc_stack_start, top_frame + 1);
+	rb_gc_mark_locations(rb_curr_thread->stk_start, top_frame + 1);
 #endif
 #ifdef __ia64
     /* mark backing store (flushed register window on the stack) */
@@ -1436,7 +1487,7 @@ garbage_collect_0(VALUE *top_frame)
 #endif
 #if defined(__human68k__) || defined(__mc68000__)
     rb_gc_mark_locations((VALUE*)((char*)STACK_END + 2),
-			 (VALUE*)((char*)rb_gc_stack_start + 2));
+			 (VALUE*)((char*)rb_curr_thread->stk_start + 2));
 #endif
     rb_gc_mark_threads();
 
@@ -1473,13 +1524,17 @@ garbage_collect_0(VALUE *top_frame)
 static void
 garbage_collect()
 {
+  jmp_buf save_regs_gc_mark;
   VALUE *top = __sp();
+  FLUSH_REGISTER_WINDOWS;
+  /* This assumes that all registers are saved into the jmp_buf (and stack) */
+  rb_setjmp(save_regs_gc_mark);
+
 #if STACK_WIPE_SITES & 0x400
 # ifdef nativeAllocA
   if (__stack_past (top, stack_limit)) {
   /* allocate a large frame to ensure app stack cannot grow into GC stack */
-    volatile char *spacer = 
-                    nativeAllocA(__stack_depth((void*)stack_limit,(void*)top));
+    (volatile void*) nativeAllocA(__stack_depth((void*)stack_limit,(void*)top));
   }  
   garbage_collect_0(top);
 # else /* no native alloca() available */
@@ -2123,10 +2178,15 @@ Init_GC()
     rb_define_singleton_method(rb_mGC, "start", rb_gc_start, 0);
     rb_define_singleton_method(rb_mGC, "enable", rb_gc_enable, 0);
     rb_define_singleton_method(rb_mGC, "disable", rb_gc_disable, 0);
+#ifdef MBARI_API
     rb_define_singleton_method(rb_mGC, "limit", gc_getlimit, 0);
     rb_define_singleton_method(rb_mGC, "limit=", gc_setlimit, 1);
-    rb_define_singleton_method(rb_mGC, "increase", gc_increase, 0);
+    rb_define_singleton_method(rb_mGC, "growth", gc_growth, 0);
     rb_define_singleton_method(rb_mGC, "exorcise", gc_exorcise, 0);
+#else
+    rb_define_singleton_method(rb_mGC, "stress", gc_stress_get, 0);
+    rb_define_singleton_method(rb_mGC, "stress=", gc_stress_set, 1);
+#endif
     rb_define_method(rb_mGC, "garbage_collect", rb_gc_start, 0);
 
     rb_mObSpace = rb_define_module("ObjectSpace");
diff --git a/intern.h b/intern.h
index e434bc5..ee9185e 100644
--- a/intern.h
+++ b/intern.h
@@ -251,7 +251,7 @@ VALUE rb_file_directory_p _((VALUE,VALUE));
 /* gc.c */
 NORETURN(void rb_memerror __((void)));
 int ruby_stack_check _((void));
-int ruby_stack_length _((VALUE *,VALUE**));
+size_t ruby_stack_length _((VALUE *,VALUE**));
 int rb_during_gc _((void));
 char *rb_source_filename _((const char*));
 void rb_gc_mark_locations _((VALUE*, VALUE*));
diff --git a/node.h b/node.h
index e79f526..3295cf7 100644
--- a/node.h
+++ b/node.h
@@ -409,13 +409,11 @@ struct rb_thread {
 
     VALUE result;
 
-    long   stk_len, stk_max;
+    size_t stk_len, stk_max;
     VALUE *stk_ptr, *stk_pos, *stk_start;
 #ifdef __ia64
-    long   bstr_len;
-    long   bstr_max;
-    VALUE *bstr_ptr;
-    VALUE *bstr_pos;
+    size_t   bstr_len, bstr_max;
+    VALUE *bstr_ptr, *bstr_pos;
 #endif
 
     struct FRAME *frame;
diff --git a/re.c b/re.c
index a0ac6a8..85d013c 100644
--- a/re.c
+++ b/re.c
@@ -1468,18 +1468,18 @@ VALUE
 rb_reg_regcomp(str)
     VALUE str;
 {
-    volatile VALUE save_str = str;
-    if (reg_cache && RREGEXP(reg_cache)->len == RSTRING(str)->len
-	&& case_cache == ruby_ignorecase
-	&& kcode_cache == reg_kcode
-	&& memcmp(RREGEXP(reg_cache)->str, RSTRING(str)->ptr, RSTRING(str)->len) == 0)
-	return reg_cache;
-
-    case_cache = ruby_ignorecase;
-    kcode_cache = reg_kcode;
-    reg_cache = rb_reg_new(RSTRING(str)->ptr, RSTRING(str)->len, ruby_ignorecase);
-    RB_GC_GUARD(save_str);
+  if (reg_cache && RREGEXP(reg_cache)->len == RSTRING(str)->len
+       && case_cache == ruby_ignorecase
+       && kcode_cache == reg_kcode
+       && memcmp(RREGEXP(reg_cache)->str, RSTRING(str)->ptr, 
+          RSTRING(str)->len) == 0)
     return reg_cache;
+
+  case_cache = ruby_ignorecase;
+  kcode_cache = reg_kcode;
+  reg_cache = rb_reg_new(RSTRING(str)->ptr, RSTRING(str)->len, ruby_ignorecase);
+  RB_GC_GUARD(str);
+  return reg_cache;
 }
 
 static int
diff --git a/rubysig.h b/rubysig.h
index 8a11cf4..fae0869 100644
--- a/rubysig.h
+++ b/rubysig.h
@@ -15,6 +15,11 @@
 
 #include <errno.h>
 
+#if defined __ppc__ || defined __powerpc__ || \
+    defined __ppc64__ || defined __powerpc64__
+#define __anyPowerPC__ 1  /* for compatibility with older gcc versions */
+#endif
+
 /* STACK_WIPE_SITES determines where attempts are made to exorcise
    "ghost object refereces" from the stack and how the stack is cleared:
    
@@ -65,7 +70,7 @@
 #ifndef STACK_WIPE_SITES
 # ifdef __x86_64__     /* deal with "red zone" by not inlining stack clearing */
 #  define STACK_WIPE_SITES  0x6770
-# elif defined __ppc__ || defined __ppc64__   /* On any PowerPC, deal with... */
+# elif defined __anyPowerPC__   /* On any PowerPC, deal with... */
 #  define STACK_WIPE_SITES  0x7764   /* red zone & alloc(0) doesn't return sp */
 # else
 #  define STACK_WIPE_SITES  0x8770 /*normal case, use 0x4770 if problems arise*/
@@ -211,11 +216,12 @@ static inline VALUE *__sp(void) \
   VALUE *sp; asm(asmb); \
   return sp; \
 }
-#  if defined __ppc__ || defined __ppc64__
+#  ifdef __anyPowerPC__
 __defspfn("addi %0, r1, 0": "=r"(sp))
 #  elif defined  __i386__
 __defspfn("movl %%esp, %0": "=r"(sp))
 #  elif defined __x86_64__
+#warn ===> x86_64 inline assembler is known to crash -- change STACK_WIPE_SITES
 __defspfn("movq %%rsp, %0": "=r"(sp))
 #  elif __arm__
 __defspfn("mov %0, sp": "=r"(sp))
diff --git a/test/ruby/suicide.rb b/test/ruby/suicide.rb
index 2687ed0..c7a0a67 100644
--- a/test/ruby/suicide.rb
+++ b/test/ruby/suicide.rb
@@ -1,2 +1,4 @@
 STDERR.reopen(STDOUT)
-at_exit{Process.kill(:INT, $$)}
+at_exit{Process.kill(:INT, $$); sleep 0}
+# brent@mbari.org says
+#  sleep 0 avoids race between process termination and signal reception
diff --git a/version.h b/version.h
index c608764..b336dd7 100644
--- a/version.h
+++ b/version.h
@@ -1,15 +1,15 @@
 #define RUBY_VERSION "1.8.7"
-#define RUBY_RELEASE_DATE "2009-2-9"
+#define RUBY_RELEASE_DATE "2009-3-1"
 #define RUBY_VERSION_CODE 187
-#define RUBY_RELEASE_CODE 20090209
+#define RUBY_RELEASE_CODE 20090301
 #define RUBY_PATCHLEVEL 72
 
 #define RUBY_VERSION_MAJOR 1
 #define RUBY_VERSION_MINOR 8
 #define RUBY_VERSION_TEENY 7
 #define RUBY_RELEASE_YEAR 2009
-#define RUBY_RELEASE_MONTH 2
-#define RUBY_RELEASE_DAY 9
+#define RUBY_RELEASE_MONTH 3
+#define RUBY_RELEASE_DAY 1
 
 #ifdef RUBY_EXTERN
 RUBY_EXTERN const char ruby_version[];
@@ -28,7 +28,14 @@ RUBY_EXTERN const char *ruby_copyright;
 #include "rubysig.h"
 
 #define string_arg(s) #s
-#define MBARI_RELEASE(wipe_sites) "MBARI 7/" string_arg(wipe_sites)
+
+#ifdef MBARI_API
+#define _mbari_rev_ "MBARI"
+#else
+#define _mbari_rev_ "mbari"
+#endif
+
+#define MBARI_RELEASE(wipe_sites) _mbari_rev_ " 8B/" string_arg(wipe_sites)
 
 #define RUBY_RELEASE_STR MBARI_RELEASE(STACK_WIPE_SITES) " on patchlevel"
 #define RUBY_RELEASE_NUM RUBY_PATCHLEVEL
--- mbari8A/configure	2008-08-10 17:39:51.000000000 -0700
+++ matzruby/configure	2009-02-25 21:16:28.000000000 -0800
@@ -1347,6 +1347,7 @@
   --disable-FEATURE       do not include FEATURE (same as --enable-FEATURE=no)
   --enable-FEATURE[=ARG]  include FEATURE [ARG=yes]
   --enable-frame-address  use GCC __builtin_frame_address().
+  --enable-mbari-api      enable API changes from the MBARI patches.
   --disable-largefile     omit support for large files
   --enable-pthread        use pthread library.
   --disable-fastthread    do not use the fastthread mutex
@@ -1359,6 +1360,7 @@
   --with-PACKAGE[=ARG]    use PACKAGE [ARG=yes]
   --without-PACKAGE       do not use PACKAGE (same as --with-PACKAGE=no)
   --without-gcc           never use gcc
+  --with-wipe-sites=MASK  override default STACK_WIPES_SITES mask in rubysig.h
   --with-winsock2         link winsock2 (MinGW only)
   --with-libc_r           link libc_r if possible (FreeBSD only)
   --with-setjmp-type      select setjmp type
@@ -1367,7 +1369,7 @@
   --with-static-linked-ext link external modules statically
   --with-sitedir=DIR      site libraries in DIR [LIBDIR/ruby/site_ruby]
   --with-vendordir=DIR    vendor libraries in DIR [LIBDIR/ruby/vendor_ruby]
-  --with-search-path=DIR specify the additional search path
+  --with-search-path= DIR specify the additional search path
   --with-mantype=TYPE specify man page type; TYPE is one of man and doc
 
 Some influential environment variables:
@@ -2042,6 +2044,35 @@
 _ACEOF
 
 fi
+# Check whether --enable-mbari-api was given.
+if test "${enable_mbari_api+set}" = set; then
+  enableval=$enable_mbari_api; mbari_api=$enableval
+fi
+
+if test "$mbari_api" = yes; then
+    cat >>confdefs.h <<\_ACEOF
+#define MBARI_API 1
+_ACEOF
+
+fi
+
+# Check whether --with-wipe-sites was given.
+if test "${with_wipe_sites+set}" = set; then
+  withval=$with_wipe_sites; wipe_sites=$withval
+fi
+
+if test "$wipe_sites" != ""; then
+  case $wipe_sites in
+       none|no)  wipe_sites=0x0;;
+       yes) wipe_sites=;;
+  esac
+  if test -n "$wipe_sites"; then
+    cat >>confdefs.h <<_ACEOF
+#define STACK_WIPE_SITES $wipe_sites
+_ACEOF
+
+  fi
+fi
 
 test "$program_prefix" != NONE &&
   program_transform_name="s&^&$program_prefix&;$program_transform_name"
patches/ruby/1.8.7/p72/mbari-1.patch000066400000026747147511530510012534 0ustar00diff -ru ruby-1.8.7-p72/ChangeLog ruby-1.8.7-mbari/ChangeLog
--- ruby-1.8.7-p72/ChangeLog	2008-08-10 17:37:21.000000000 -0700
+++ ruby-1.8.7-mbari/ChangeLog	2008-12-09 01:24:37.000000000 -0800
@@ -1,3 +1,20 @@
+Tue Dec  9  8:11:36 2008  Brent Roman  <brent@mbari.org>
+
+     * eval.c:  added Continuation.thread method
+        * cc_mark frees the continuation's stack if its thread is dead
+          avoids recursive gc that segfaults [see Dec 5th, 2007 ruby-core]
+
+        * added cast in PUSH_FRAME() to eliminate gcc 4.2 compiler warnings    
+                   
+        * THREAD_DATA() replaces rb_thread_check() in most contexts
+        
+        * rb_thread_check now complains when passed a Continuation
+          (no longer need redundant check in thgroup_add()
+        
+        * rb_callcc() assigns th->thread before scope_dup()
+          this avoids segfaults if this scope_dup() triggers a gc pass
+        
+
 Fri Aug  8 10:53:52 2008  Tanaka Akira  <akr@fsij.org>
 
 	* lib/resolv.rb: randomize source port and transaction id.
diff -ru ruby-1.8.7-p72/eval.c ruby-1.8.7-mbari/eval.c
--- ruby-1.8.7-p72/eval.c	2008-08-03 20:24:26.000000000 -0700
+++ ruby-1.8.7-mbari/eval.c	2008-12-10 20:42:40.000000000 -0800
@@ -2,8 +2,8 @@
 
   eval.c -
 
-  $Author: shyouhei $
-  $Date: 2008-08-04 12:24:26 +0900 (Mon, 04 Aug 2008) $
+  $Author: brent $
+  $Date: 2008/12/11 04:42:40 $
   created at: Thu Jun 10 14:22:17 JST 1993
 
   Copyright (C) 1993-2003 Yukihiro Matsumoto
@@ -766,11 +766,11 @@
     _frame.argc = 0;			\
     _frame.flags = 0;			\
     _frame.uniq = frame_unique++;	\
-    ruby_frame = &_frame
+    ruby_frame = (struct FRAME *)&_frame
 
 #define POP_FRAME()  			\
     ruby_current_node = _frame.node;	\
-    ruby_frame = _frame.prev;		\
+    ruby_frame = _frame.prev;           \
 } while (0)
 
 struct BLOCK {
@@ -10485,16 +10485,57 @@
     } END_FOREACH_FROM(main_thread, th);
 }
 
-static void
-thread_free(th)
+
+static inline void
+stack_free(th)
     rb_thread_t th;
 {
-    if (th->stk_ptr) free(th->stk_ptr);
-    th->stk_ptr = 0;
+    if (th->stk_ptr) {
+      free(th->stk_ptr);
+      th->stk_ptr = 0;
+    }
 #ifdef __ia64
-    if (th->bstr_ptr) free(th->bstr_ptr);
-    th->bstr_ptr = 0;
+    if (th->bstr_ptr) {
+      free(th->bstr_ptr);
+      th->bstr_ptr = 0;
+    }
 #endif
+}
+
+static void
+rb_thread_die(th)
+    rb_thread_t th;
+{
+    th->thgroup = 0;
+    th->status = THREAD_KILLED;
+    stack_free(th);
+}
+
+#define THREAD_DATA(threadObject)  ((rb_thread_t)RDATA(threadObject)->data)
+
+static inline void
+cc_purge(cc)
+    rb_thread_t cc;
+{  /* free continuation's stack if it has just died */
+  if (cc->thread != Qnil && THREAD_DATA(cc->thread)->status == THREAD_KILLED) {
+    cc->thread = Qnil;
+    rb_thread_die(cc);  /* can't possibly activate this stack */
+  }  
+}
+
+static void
+cc_mark(cc)
+    rb_thread_t cc;
+{  /* mark this continuation's stack only if its parent thread is still alive */
+  cc_purge(cc);
+  thread_mark(cc);
+}
+
+static void
+thread_free(th)
+    rb_thread_t th;
+{
+    stack_free(th);
     if (th->locals) st_free_table(th->locals);
     if (th->status != THREAD_KILLED) {
 	if (th->prev) th->prev->next = th->next;
@@ -10511,7 +10552,7 @@
 	rb_raise(rb_eTypeError, "wrong argument type %s (expected Thread)",
 		 rb_obj_classname(data));
     }
-    return (rb_thread_t)RDATA(data)->data;
+    return THREAD_DATA(data);
 }
 
 static VALUE rb_thread_raise _((int, VALUE*, rb_thread_t));
@@ -10782,16 +10823,6 @@
 }
 
 static void
-rb_thread_die(th)
-    rb_thread_t th;
-{
-    th->thgroup = 0;
-    th->status = THREAD_KILLED;
-    if (th->stk_ptr) free(th->stk_ptr);
-    th->stk_ptr = 0;
-}
-
-static void
 rb_thread_remove(th)
     rb_thread_t th;
 {
@@ -11454,7 +11485,7 @@
 {
     VALUE limit;
     double delay = DELAY_INFTY;
-    rb_thread_t th = rb_thread_check(thread);
+    rb_thread_t th = THREAD_DATA(thread);
 
     rb_scan_args(argc, argv, "01", &limit);
     if (!NIL_P(limit)) delay = rb_num2dbl(limit);
@@ -11566,7 +11597,7 @@
 rb_thread_wakeup_alive(thread)
     VALUE thread;
 {
-    rb_thread_t th = rb_thread_check(thread);
+    rb_thread_t th = THREAD_DATA(thread);
 
     if (th->status == THREAD_KILLED)
 	return Qnil;
@@ -11641,7 +11672,7 @@
 rb_thread_kill(thread)
     VALUE thread;
 {
-    rb_thread_t th = rb_thread_check(thread);
+    rb_thread_t th = THREAD_DATA(thread);
 
     rb_kill_thread(th, 0);
     return thread;
@@ -11665,7 +11696,7 @@
 rb_thread_kill_bang(thread)
     VALUE thread;
 {
-    rb_thread_t th = rb_thread_check(thread);
+    rb_thread_t th = THREAD_DATA(thread);
     rb_kill_thread(th, THREAD_NO_ENSURE);
     return thread;
 }
@@ -11837,7 +11868,7 @@
 rb_thread_priority(thread)
     VALUE thread;
 {
-    return INT2NUM(rb_thread_check(thread)->priority);
+    return INT2NUM(THREAD_DATA(thread)->priority);
 }
 
 
@@ -11871,7 +11902,7 @@
     rb_thread_t th;
 
     rb_secure(4);
-    th = rb_thread_check(thread);
+    th = THREAD_DATA(thread);
 
     th->priority = NUM2INT(prio);
     rb_thread_schedule();
@@ -11897,7 +11928,7 @@
 {
     rb_thread_t th;
 
-    th = rb_thread_check(thread);
+    th = THREAD_DATA(thread);
     if (th == curr_thread) {
 	return INT2NUM(ruby_safe_level);
     }
@@ -11974,7 +12005,7 @@
 rb_thread_abort_exc(thread)
     VALUE thread;
 {
-    return rb_thread_check(thread)->abort?Qtrue:Qfalse;
+    return THREAD_DATA(thread)->abort?Qtrue:Qfalse;
 }
 
 
@@ -11992,7 +12023,7 @@
     VALUE thread, val;
 {
     rb_secure(4);
-    rb_thread_check(thread)->abort = RTEST(val);
+    THREAD_DATA(thread)->abort = RTEST(val);
     return val;
 }
 
@@ -12011,7 +12042,7 @@
 rb_thread_group(thread)
     VALUE thread;
 {
-    VALUE group = rb_thread_check(thread)->thgroup;
+    VALUE group = THREAD_DATA(thread)->thgroup;
     if (!group) {
 	group = Qnil;
     }
@@ -12397,7 +12428,7 @@
     if (!rb_block_given_p()) {
 	rb_raise(rb_eThreadError, "must be called with a block");
     }
-    th = rb_thread_check(thread);
+    th = THREAD_DATA(thread);
     if (th->stk_max) {
 	NODE *node = th->node;
 	if (!node) {
@@ -12446,7 +12477,7 @@
 rb_thread_value(thread)
     VALUE thread;
 {
-    rb_thread_t th = rb_thread_check(thread);
+    rb_thread_t th = THREAD_DATA(thread);
 
     while (!rb_thread_join(th, DELAY_INFTY));
 
@@ -12481,7 +12512,7 @@
 rb_thread_status(thread)
     VALUE thread;
 {
-    rb_thread_t th = rb_thread_check(thread);
+    rb_thread_t th = THREAD_DATA(thread);
 
     if (rb_thread_dead(th)) {
 	if (!NIL_P(th->errinfo) && (th->flags & RAISED_EXCEPTION))
@@ -12509,7 +12540,7 @@
 rb_thread_alive_p(thread)
     VALUE thread;
 {
-    rb_thread_t th = rb_thread_check(thread);
+    rb_thread_t th = THREAD_DATA(thread);
 
     if (rb_thread_dead(th)) return Qfalse;
     return Qtrue;
@@ -12532,7 +12563,7 @@
 rb_thread_stop_p(thread)
     VALUE thread;
 {
-    rb_thread_t th = rb_thread_check(thread);
+    rb_thread_t th = THREAD_DATA(thread);
 
     if (rb_thread_dead(th)) return Qtrue;
     if (th->status == THREAD_STOPPED) return Qtrue;
@@ -12766,7 +12797,7 @@
     VALUE *argv;
     VALUE thread;
 {
-    rb_thread_t th = rb_thread_check(thread);
+    rb_thread_t th = THREAD_DATA(thread);
 
     if (ruby_safe_level > th->safe) {
 	rb_secure(4);
@@ -12783,7 +12814,7 @@
     rb_thread_t th;
     VALUE val;
 
-    th = rb_thread_check(thread);
+    th = THREAD_DATA(thread);
     if (ruby_safe_level >= 4 && th != curr_thread) {
 	rb_raise(rb_eSecurityError, "Insecure: thread locals");
     }
@@ -12829,7 +12860,7 @@
     ID id;
     VALUE val;
 {
-    rb_thread_t th = rb_thread_check(thread);
+    rb_thread_t th = THREAD_DATA(thread);
 
     if (ruby_safe_level >= 4 && th != curr_thread) {
 	rb_raise(rb_eSecurityError, "Insecure: can't modify thread locals");
@@ -12882,7 +12913,7 @@
 rb_thread_key_p(thread, id)
     VALUE thread, id;
 {
-    rb_thread_t th = rb_thread_check(thread);
+    rb_thread_t th = THREAD_DATA(thread);
 
     if (!th->locals) return Qfalse;
     if (st_lookup(th->locals, rb_to_id(id), 0))
@@ -12918,7 +12949,7 @@
 rb_thread_keys(thread)
     VALUE thread;
 {
-    rb_thread_t th = rb_thread_check(thread);
+    rb_thread_t th = THREAD_DATA(thread);
     VALUE ary = rb_ary_new();
 
     if (th->locals) {
@@ -12939,7 +12970,7 @@
     VALUE thread;
 {
     const char *cname = rb_obj_classname(thread);
-    rb_thread_t th = rb_thread_check(thread);
+    rb_thread_t th = THREAD_DATA(thread);
     const char *status = thread_status_name(th->status);
     VALUE str;
     size_t len = strlen(cname)+7+16+9+1;
@@ -13044,14 +13075,15 @@
     struct RVarmap *vars;
 
     THREAD_ALLOC(th);
-    cont = Data_Wrap_Struct(rb_cCont, thread_mark, thread_free, th);
+    /* must finish th initialization before any possible gc */
+    th->thread = curr_thread->thread;    /* brent@mbari.org */
+    th->thgroup = cont_protect;
+    cont = Data_Wrap_Struct(rb_cCont, cc_mark, thread_free, th);
 
     scope_dup(ruby_scope);
     for (tag=prot_tag; tag; tag=tag->prev) {
 	scope_dup(tag->scope);
     }
-    th->thread = curr_thread->thread;
-    th->thgroup = cont_protect;
 
     for (vars = ruby_dyna_vars; vars; vars = vars->next) {
 	if (FL_TEST(vars, DVAR_DONT_RECYCLE)) break;
@@ -13088,7 +13120,7 @@
     VALUE *argv;
     VALUE cont;
 {
-    rb_thread_t th = rb_thread_check(cont);
+    rb_thread_t th = THREAD_DATA(cont);
 
     if (th->thread != curr_thread->thread) {
 	rb_raise(rb_eRuntimeError, "continuation called across threads");
@@ -13112,6 +13144,30 @@
     return Qnil;
 }
 
+
+/*
+ *  call-seq:
+ *     cont.thread
+ *  
+ *  Returns the thread on which this continuation can be called
+ *              (or nil if that thread has died)
+ *
+ *     t = Thread.new {callcc{|c| $x=c}; sleep 5}
+ *     sleep 1
+ *     $x.thread                             #=> t
+ *     sleep 10
+ *     $x.thread                             #=> nil
+ */
+static VALUE
+rb_cont_thread(cont)
+  VALUE cont;
+{
+  rb_thread_t th = THREAD_DATA(cont);
+  cc_purge(th);
+  return th->thread;
+}
+
+
 struct thgroup {
     int enclosed;
     VALUE group;
@@ -13264,10 +13320,6 @@
 
     rb_secure(4);
     th = rb_thread_check(thread);
-    if (!th->next || !th->prev) {
-	rb_raise(rb_eTypeError, "wrong argument type %s (expected Thread)",
-		 rb_obj_classname(thread));
-    }
 
     if (OBJ_FROZEN(group)) {
       rb_raise(rb_eThreadError, "can't move to the frozen thread group");
@@ -13469,6 +13521,7 @@
     rb_undef_method(CLASS_OF(rb_cCont), "new");
     rb_define_method(rb_cCont, "call", rb_cont_call, -1);
     rb_define_method(rb_cCont, "[]", rb_cont_call, -1);
+    rb_define_method(rb_cCont, "thread", rb_cont_thread, 0);
     rb_define_global_function("callcc", rb_callcc, 0);
     rb_global_variable(&cont_protect);
 
diff -ru ruby-1.8.7-p72/version.h ruby-1.8.7-mbari/version.h
--- ruby-1.8.7-p72/version.h	2008-08-10 17:37:21.000000000 -0700
+++ ruby-1.8.7-mbari/version.h	2008-12-09 00:40:58.000000000 -0800
@@ -1,15 +1,15 @@
 #define RUBY_VERSION "1.8.7"
-#define RUBY_RELEASE_DATE "2008-08-11"
+#define RUBY_RELEASE_DATE "2008-12-09"
 #define RUBY_VERSION_CODE 187
-#define RUBY_RELEASE_CODE 20080811
+#define RUBY_RELEASE_CODE 20081209
 #define RUBY_PATCHLEVEL 72
 
 #define RUBY_VERSION_MAJOR 1
 #define RUBY_VERSION_MINOR 8
 #define RUBY_VERSION_TEENY 7
 #define RUBY_RELEASE_YEAR 2008
-#define RUBY_RELEASE_MONTH 8
-#define RUBY_RELEASE_DAY 11
+#define RUBY_RELEASE_MONTH 12
+#define RUBY_RELEASE_DAY 9
 
 #ifdef RUBY_EXTERN
 RUBY_EXTERN const char ruby_version[];
@@ -25,7 +25,7 @@
 #define RUBY_BIRTH_MONTH 2
 #define RUBY_BIRTH_DAY 24
 
-#define RUBY_RELEASE_STR "patchlevel"
+#define RUBY_RELEASE_STR "MBARI 1 on patchlevel"
 #define RUBY_RELEASE_NUM RUBY_PATCHLEVEL
 
 
patches/ruby/1.8.7/p72/mbari-6.patch000066400000015125147511530510012525 0ustar00diff -rux '*.o' ruby-1.8.7-p72/ChangeLog ruby-1.8.7-mbari/ChangeLog
--- ruby-1.8.7-p72/ChangeLog	2008-12-19 23:42:15.000000000 -0800
+++ ruby-1.8.7-mbari/ChangeLog	2008-12-19 23:52:11.000000000 -0800
@@ -1,7 +1,14 @@
+Tue Dec 19 20:15:36 2008  Brent Roman  <brent@mbari.org>
+
+        * eval.c:  added (Method|Proc)#(__line__|__file__) methods
+                   call ruby_set_current_source() before adding method nodes
+
+
 Tue Dec 17  4:15:36 2008  Brent Roman  <brent@mbari.org>
 
         * eval.c:  streamlined rb_thread_restore_context() to ensure O(1) time
 
+
 Tue Dec 15  9:15:36 2008  Brent Roman  <brent@mbari.org>
 
         * eval.c:  factored rb_eval() into many separate non-inlined
diff -rux '*.o' ruby-1.8.7-p72/eval.c ruby-1.8.7-mbari/eval.c
--- ruby-1.8.7-p72/eval.c	2008-12-19 23:42:15.000000000 -0800
+++ ruby-1.8.7-mbari/eval.c	2008-12-19 23:47:22.000000000 -0800
@@ -3,7 +3,7 @@
   eval.c -
 
   $Author: brent $
-  $Date: 2008/12/18 07:44:48 $
+  $Date: 2008/12/20 07:47:22 $
   created at: Thu Jun 10 14:22:17 JST 1993
 
   Copyright (C) 1993-2003 Yukihiro Matsumoto
@@ -726,6 +726,7 @@
     if (!name) {
 	rb_raise(rb_eArgError, "argument needs to be symbol or string");
     }
+    ruby_set_current_source(); /* for Method#__line__ */
     len = strlen(name)+2;
     buf = ALLOCA_N(char,len);
     snprintf(buf, len, "@%s", name);
@@ -2248,7 +2249,10 @@
     NODE *node;
     NODE *rval;
 {
-    NODE *copy = NEW_NODE(NODE_SCOPE,0,rval,node->nd_next);
+    NODE *copy;
+    
+    ruby_set_current_source();  /* for Method#__line__ */
+    copy=NEW_NODE(NODE_SCOPE,0,rval,node->nd_next);
 
     if (node->nd_tbl) {
 	copy->nd_tbl = ALLOC_N(ID, node->nd_tbl[0]+1);
@@ -3878,7 +3882,8 @@
   result = Qnil;
   if (node) {
     ruby_current_node = node;
-    
+    SET_CURRENT_SOURCE();
+
     switch (nd_type(node)) {
       case NODE_BLOCK:
 	while (node->nd_next) {
@@ -10119,6 +10124,7 @@
     else {
 	rb_raise(rb_eArgError, "wrong number of arguments (%d for 1)", argc);
     }
+    ruby_set_current_source(); /* for Method#__line__ */
     if (RDATA(body)->dmark == (RUBY_DATA_FUNC)bm_mark) {
 	node = NEW_DMETHOD(method_unbind(body));
     }
@@ -10150,6 +10156,98 @@
     return body;
 }
 
+
+/*
+ * call-seq:
+ *    meth.__file__  => String  
+ *
+ * returns the filename containing this method's definition
+ * raises ArgumentError if method has no associated ruby source code
+ */
+ 
+static VALUE
+method_source_file_name(VALUE method)
+{
+    struct METHOD *data;
+    NODE *node;
+
+    Data_Get_Struct(method, struct METHOD, data);   
+    if (node = data->body) {
+      const char *filename = node->nd_file;
+      if (filename)
+        return rb_str_new2(filename);
+    }
+    rb_raise(rb_eArgError, "native Method");
+}
+
+/*
+ * call-seq:
+ *    meth.__line__  => Fixnum  
+ *
+ * returns the starting line number of this method
+ * raises ArgumentError if method has no associated ruby source code
+ */
+ 
+static VALUE
+method_source_line(VALUE method)
+{
+    struct METHOD *data;
+    NODE *node;
+
+    Data_Get_Struct(method, struct METHOD, data);
+    if (node = data->body) {
+      int lineno = nd_line(node);
+      if (lineno)
+        return INT2FIX(nd_line(node));
+    }
+    rb_raise(rb_eArgError, "native Method");
+}
+
+
+
+/*
+ * call-seq:
+ *    prc.__file__  => String  
+ *
+ * returns the filename where this proc is defined
+ * raises ArgumentError if proc has no associated ruby source
+ */
+ 
+static VALUE
+proc_source_file_name(VALUE block)
+{
+    struct BLOCK *data;
+    const char *filename;
+    NODE *node;
+
+    Data_Get_Struct(block, struct BLOCK, data);
+    if ((node = data->frame.node) || (node = data->body))
+      return rb_str_new2(node->nd_file);
+    rb_raise(rb_eArgError, "native Proc");
+}
+
+
+/*
+ * call-seq:
+ *    prc.__line__  => Fixnum  
+ *
+ * returns the starting line number of this proc
+ * raises ArgumentError if proc has no associated ruby source code
+ */
+ 
+static VALUE
+proc_source_line(VALUE block)
+{
+    struct BLOCK *data;
+    NODE *node;
+    
+    Data_Get_Struct(block, struct BLOCK, data);
+    if ((node = data->frame.node) || (node = data->body))
+      return INT2FIX( nd_line(node) );
+    rb_raise(rb_eArgError, "native Proc");
+}
+
+
 /*
  *  <code>Proc</code> objects are blocks of code that have been bound to
  *  a set of local variables. Once bound, the code may be called in
@@ -10201,6 +10299,8 @@
     rb_define_method(rb_cProc, "to_s", proc_to_s, 0);
     rb_define_method(rb_cProc, "to_proc", proc_to_self, 0);
     rb_define_method(rb_cProc, "binding", proc_binding, 0);
+    rb_define_method(rb_cProc, "__file__", proc_source_file_name, 0);
+    rb_define_method(rb_cProc, "__line__", proc_source_line, 0);
 
     rb_define_global_function("proc", proc_lambda, 0);
     rb_define_global_function("lambda", proc_lambda, 0);
@@ -10221,6 +10321,8 @@
     rb_define_method(rb_cMethod, "owner", method_owner, 0);
     rb_define_method(rb_cMethod, "unbind", method_unbind, 0);
     rb_define_method(rb_mKernel, "method", rb_obj_method, 1);
+    rb_define_method(rb_cMethod, "__file__", method_source_file_name, 0);
+    rb_define_method(rb_cMethod, "__line__", method_source_line, 0);
 
     rb_cUnboundMethod = rb_define_class("UnboundMethod", rb_cObject);
     rb_undef_alloc_func(rb_cUnboundMethod);
@@ -10233,6 +10335,8 @@
     rb_define_method(rb_cUnboundMethod, "name", method_name, 0);
     rb_define_method(rb_cUnboundMethod, "owner", method_owner, 0);
     rb_define_method(rb_cUnboundMethod, "bind", umethod_bind, 1);
+    rb_define_method(rb_cUnboundMethod, "__file__", method_source_file_name, 0);
+    rb_define_method(rb_cUnboundMethod, "__line__", method_source_line, 0);
     rb_define_method(rb_cModule, "instance_method", rb_mod_method, 1);
 }
 
diff -rux '*.o' ruby-1.8.7-p72/version.h ruby-1.8.7-mbari/version.h
--- ruby-1.8.7-p72/version.h	2008-12-19 23:42:15.000000000 -0800
+++ ruby-1.8.7-mbari/version.h	2008-12-19 23:39:56.000000000 -0800
@@ -1,7 +1,7 @@
 #define RUBY_VERSION "1.8.7"
-#define RUBY_RELEASE_DATE "2008-12-17"
+#define RUBY_RELEASE_DATE "2008-12-21"
 #define RUBY_VERSION_CODE 187
-#define RUBY_RELEASE_CODE 20081217
+#define RUBY_RELEASE_CODE 20081221
 #define RUBY_PATCHLEVEL 72
 
 #define RUBY_VERSION_MAJOR 1
@@ -9,7 +9,7 @@
 #define RUBY_VERSION_TEENY 7
 #define RUBY_RELEASE_YEAR 2008
 #define RUBY_RELEASE_MONTH 12
-#define RUBY_RELEASE_DAY 17
+#define RUBY_RELEASE_DAY 21
 
 #ifdef RUBY_EXTERN
 RUBY_EXTERN const char ruby_version[];
@@ -25,7 +25,7 @@
 #define RUBY_BIRTH_MONTH 2
 #define RUBY_BIRTH_DAY 24
 
-#define RUBY_RELEASE_STR "MBARI 5 on patchlevel"
+#define RUBY_RELEASE_STR "MBARI 6 on patchlevel"
 #define RUBY_RELEASE_NUM RUBY_PATCHLEVEL
 
 
patches/ruby/1.8.7/p72/mbari-4.patch000066400000150174147511530510012527 0ustar00diff -rux '*.o' ruby-1.8.7-p72/ChangeLog ruby-1.8.7-mbari/ChangeLog
--- ruby-1.8.7-p72/ChangeLog	2008-12-16 00:47:25.000000000 -0800
+++ ruby-1.8.7-mbari/ChangeLog	2008-12-16 23:06:21.000000000 -0800
@@ -1,3 +1,11 @@
+Tue Dec 15  9:15:36 2008  Brent Roman  <brent@mbari.org>
+
+        * eval.c:  factored rb_eval() into many separate non-inlined
+                  functions to reduce the size of its stack frame when
+                  compiled with gcc.
+                  Factored callcc into 2 functions.
+
+
 Tue Dec 13  6:10:36 2008  Brent Roman  <brent@mbari.org>
 
         * eval.c:  update stack extent just before and after every setjmp
diff -rux '*.o' ruby-1.8.7-p72/eval.c ruby-1.8.7-mbari/eval.c
--- ruby-1.8.7-p72/eval.c	2008-12-16 00:47:25.000000000 -0800
+++ ruby-1.8.7-mbari/eval.c	2008-12-16 23:28:08.000000000 -0800
@@ -3,7 +3,7 @@
   eval.c -
 
   $Author: brent $
-  $Date: 2008/12/14 07:23:06 $
+  $Date: 2008/12/17 07:28:08 $
   created at: Thu Jun 10 14:22:17 JST 1993
 
   Copyright (C) 1993-2003 Yukihiro Matsumoto
@@ -219,7 +219,7 @@
 VALUE rb_cBinding;
 static VALUE proc_invoke _((VALUE,VALUE,VALUE,VALUE));
 static VALUE rb_f_binding _((VALUE));
-static void rb_f_END _((void));
+NOINLINE(static void rb_f_END _((void)));
 static VALUE rb_f_block_given_p _((void));
 static VALUE block_pass _((VALUE,NODE*));
 
@@ -1240,12 +1240,7 @@
     if (NIL_P(ruby_errinfo)) return;
 
     PUSH_TAG(PROT_NONE);
-    if (EXEC_TAG() == 0) {
-	errat = get_backtrace(ruby_errinfo);
-    }
-    else {
-	errat = Qnil;
-    }
+    errat = EXEC_TAG() == 0 ? get_backtrace(ruby_errinfo) : Qnil;
     if (EXEC_TAG()) goto error;
     if (NIL_P(errat)){
 	ruby_set_current_source();
@@ -1926,8 +1921,8 @@
     return rb_const_defined(cref->nd_clss, id);
 }
 
-static VALUE
-ev_const_get(cref, id, self)
+NOINLINE(static VALUE
+ev_const_get(cref, id, self))
     NODE *cref;
     ID id;
     VALUE self;
@@ -2942,40 +2937,960 @@
     }
 }
 
-static VALUE
-rb_eval(self, n)
-    VALUE self;
-    NODE *n;
+
+/*
+  functions factored out of rb_eval() to reduce its stack frame size
+*/
+NOINLINE(static VALUE eval_match2(self, node))
+  VALUE self;
+  NODE *node;
+{
+    VALUE l = rb_eval(self,node->nd_recv);
+    VALUE r = rb_eval(self,node->nd_value);
+    return rb_reg_match(l, r);
+}
+
+NOINLINE(static VALUE
+eval_match3(self, node))
+  VALUE self;
+  NODE *node;
+{
+  VALUE r = rb_eval(self,node->nd_recv);
+  VALUE l = rb_eval(self,node->nd_value);
+  return TYPE(l) == T_STRING ? rb_reg_match(r, l) : rb_funcall(l, match, 1, r);
+}
+
+
+NOINLINE(static void
+eval_opt_n(self, node))
+  VALUE self;
+  NODE *node;
+{
+  int state;
+  PUSH_TAG(PROT_LOOP);
+  switch (state = EXEC_TAG()) {
+    case 0:
+    opt_n_next:
+      while (!NIL_P(rb_gets())) {
+	opt_n_redo:
+	  rb_eval(self, node->nd_body);
+      }
+      break;
+
+    case TAG_REDO:
+      state = 0;
+      goto opt_n_redo;
+    case TAG_NEXT:
+      state = 0;
+      goto opt_n_next;
+    case TAG_BREAK:
+      state = 0;
+    default:
+      break;
+  }
+  POP_TAG();
+  if (state) JUMP_TAG(state);
+}
+
+
+NOINLINE(static NODE *
+eval_when(self, node))
+  VALUE self;
+  NODE *node;
+{
+  do {
+      NODE *tag = node->nd_head;
+      while (tag) {
+	  EXEC_EVENT_HOOK(RUBY_EVENT_LINE, tag, self,
+			  ruby_frame->last_func,
+			  ruby_frame->last_class);
+	  if (tag->nd_head && nd_type(tag->nd_head) == NODE_WHEN) {
+	      VALUE v = rb_eval(self, tag->nd_head->nd_head);
+	      long i;
+
+	      if (TYPE(v) != T_ARRAY) v = rb_ary_to_ary(v);
+	      for (i=0; i<RARRAY(v)->len; i++) {
+		  if (RTEST(RARRAY(v)->ptr[i])) return node->nd_body;
+	      }
+	      tag = tag->nd_next;
+	      continue;
+	  }
+	  if (RTEST(rb_eval(self, tag->nd_head))) return node->nd_body;
+	  tag = tag->nd_next;
+      }
+  } while ((node = node->nd_next) && nd_type(node) == NODE_WHEN);
+  return node;
+}
+
+
+NOINLINE (static NODE *
+eval_case(self, node))
+  VALUE self;
+  NODE *node;
+{
+  VALUE val = rb_eval(self, node->nd_head);
+  node = node->nd_body;
+  while (node) {
+      NODE *tag;
+
+      if (nd_type(node) != NODE_WHEN) break;
+      tag = node->nd_head;
+      while (tag) {
+	  EXEC_EVENT_HOOK(RUBY_EVENT_LINE, tag, self,
+			  ruby_frame->last_func,
+			  ruby_frame->last_class);
+	  if (tag->nd_head && nd_type(tag->nd_head) == NODE_WHEN) {
+	      VALUE v = rb_eval(self, tag->nd_head->nd_head);
+	      long i;
+
+	      if (TYPE(v) != T_ARRAY) v = rb_ary_to_ary(v);
+	      for (i=0; i<RARRAY(v)->len; i++) {
+		  if (RTEST(rb_funcall2(RARRAY(v)->ptr[i], eqq, 1, &val)))
+		      return node->nd_body;
+	      }
+	      tag = tag->nd_next;
+	      continue;
+	  }
+	  if (RTEST(rb_funcall2(rb_eval(self, tag->nd_head), eqq, 1, &val)))
+	      return node->nd_body;
+	  tag = tag->nd_next;
+      }
+      node = node->nd_next;
+  }
+  return node;
+}
+
+
+NOINLINE (static VALUE
+eval_while(self, node))
+  VALUE self;
+  NODE *node;
+{
+  int state;
+  volatile VALUE result = Qnil;
+  PUSH_TAG(PROT_LOOP);
+  switch (state = EXEC_TAG()) {
+    case 0:
+      if (node->nd_state && !RTEST(rb_eval(self, node->nd_cond)))
+	  goto while_out;
+      do {
+	while_redo:
+	  rb_eval(self, node->nd_body);
+	while_next:
+	  ;
+      } while (RTEST(rb_eval(self, node->nd_cond)));
+      break;
+
+    case TAG_REDO:
+      state = 0;
+      goto while_redo;
+    case TAG_NEXT:
+      state = 0;
+      goto while_next;
+    case TAG_BREAK:
+      if (TAG_DST()) {
+	  state = 0;
+	  result = prot_tag->retval;
+      }
+      /* fall through */
+    default:
+      break;
+  }
+while_out:
+  POP_TAG();
+  if (state) JUMP_TAG(state);
+  return result;
+}
+
+
+NOINLINE (static VALUE
+eval_until(self, node))
+  VALUE self;
+  NODE *node;
+{
+  int state;
+  volatile VALUE result = Qnil;
+  PUSH_TAG(PROT_LOOP);
+  switch (state = EXEC_TAG()) {
+    case 0:
+      if (node->nd_state && RTEST(rb_eval(self, node->nd_cond)))
+	  goto until_out;
+      do {
+        until_redo:
+	  rb_eval(self, node->nd_body);
+        until_next:
+	  ;
+      } while (!RTEST(rb_eval(self, node->nd_cond)));
+      break;
+
+    case TAG_REDO:
+      state = 0;
+      goto until_redo;
+    case TAG_NEXT:
+      state = 0;
+      goto until_next;
+    case TAG_BREAK:
+      if (TAG_DST()) {
+	  state = 0;
+	  result = prot_tag->retval;
+      }
+      /* fall through */
+    default:
+      break;
+  }
+ until_out:
+  POP_TAG();
+  if (state) JUMP_TAG(state);
+  return result;
+}
+
+
+NOINLINE (static VALUE
+eval_iter(self, node))
+  VALUE self;
+  NODE *node;
+{
+  int state;
+  volatile VALUE result = Qnil;
+
+  PUSH_TAG(PROT_LOOP);
+  PUSH_BLOCK(node->nd_var, node->nd_body);
+
+  state = EXEC_TAG();
+  switch (state) {
+    case TAG_RETRY:
+      state = 0;  /* fall thru to case 0 */
+    case 0:
+      PUSH_ITER(ITER_PRE);
+      if (nd_type(node) == NODE_ITER) {
+	  result = rb_eval(self, node->nd_iter);
+      }
+      else {
+	  VALUE recv;
+
+	  _block.flags &= ~BLOCK_D_SCOPE;
+	  BEGIN_CALLARGS;
+	  recv = rb_eval(self, node->nd_iter);
+	  END_CALLARGS;
+	  ruby_current_node = node;
+	  SET_CURRENT_SOURCE();
+	  result = rb_call(CLASS_OF(recv),recv,each,0,0,0,self);
+      }
+      POP_ITER();
+      break;
+      
+    case TAG_BREAK:
+      if (TAG_DST()) {
+        result = prot_tag->retval;
+        state = 0;
+      }
+  }
+  POP_BLOCK();
+  POP_TAG();
+  if (state) JUMP_TAG(state);
+  return result;
+}
+
+
+NOINLINE (static VALUE
+eval_rescue(self, node))
+  VALUE self;
+  NODE *node;
 {
-    NODE * volatile contnode = 0;
-    NODE * volatile node = n;
+    volatile VALUE e_info = ruby_errinfo;
+    volatile int rescuing = 0;
     int state;
     volatile VALUE result = Qnil;
-    st_data_t data;
 
-#define RETURN(v) do { \
-    result = (v); \
-    goto finish; \
-} while (0)
+    PUSH_TAG(PROT_NONE);
+    if ((state = EXEC_TAG()) == 0) {
+      retry_entry:
+	result = rb_eval(self, node->nd_head);
+    }
+    else if (rescuing) {
+	if (rescuing < 0) {
+	    /* in rescue argument, just reraise */
+	}
+	else if (state == TAG_RETRY) {
+	    rescuing = state = 0;
+	    ruby_errinfo = e_info;
+	    goto retry_entry;
+	}
+	else if (state != TAG_RAISE) {
+	    result = prot_tag->retval;
+	}
+    }
+    else if (state == TAG_RAISE) {
+	NODE *resq = node->nd_resq;
 
-  again:
-    if (!node) RETURN(Qnil);
+	rescuing = -1;
+	while (resq) {
+	    ruby_current_node = resq;
+	    if (handle_rescue(self, resq)) {
+		state = 0;
+		rescuing = 1;
+		result = rb_eval(self, resq->nd_body);
+		break;
+	    }
+	    resq = resq->nd_head; /* next rescue */
+	}
+    }
+    else {
+	result = prot_tag->retval;
+    }
+    POP_TAG();
+    if (state != TAG_RAISE) ruby_errinfo = e_info;
+    if (state) {
+	JUMP_TAG(state);
+    }
+    /* no exception raised */
+    if (!rescuing && node->nd_else) { /* else clause given */
+	result = Qundef;  /* caller must eval this! */
+    }
+    return result;
+}
 
+
+NOINLINE (static VALUE
+eval_ensure(self, node))
+  VALUE self;
+  NODE *node;
+{
+  int state;
+  volatile VALUE result = Qnil;
+
+  PUSH_TAG(PROT_NONE);
+  if ((state = EXEC_TAG()) == 0) {
+      result = rb_eval(self, node->nd_head);
+  }
+  POP_TAG();
+  if (node->nd_ensr && !thread_no_ensure()) {
+      VALUE retval = prot_tag->retval; /* save retval */
+      VALUE errinfo = ruby_errinfo;
+
+      rb_eval(self, node->nd_ensr);
+      return_value(retval);
+      ruby_errinfo = errinfo;
+  }
+  if (state) JUMP_TAG(state);
+  return result;
+}
+
+
+NOINLINE (static VALUE
+eval_dot(self, node))
+  VALUE self;
+  NODE *node;
+{
+  VALUE beg = rb_eval(self, node->nd_beg);
+  VALUE end = rb_eval(self, node->nd_end);
+  return rb_range_new(beg, end, nd_type(node) == NODE_DOT3);
+}
+
+
+NOINLINE (static VALUE
+eval_flip2(self, node))
+  VALUE self;
+  NODE *node;
+{
+  VALUE *flip = rb_svar(node->nd_cnt);
+  if (!flip) rb_bug("unexpected local variable");
+  if (!RTEST(*flip)) {
+    if (!RTEST(rb_eval(self, node->nd_beg)))
+      return Qfalse;
+    *flip = RTEST(rb_eval(self, node->nd_end))?Qfalse:Qtrue;
+  }
+  else if (RTEST(rb_eval(self, node->nd_end)))
+    *flip = Qfalse;
+  return Qtrue;
+}
+
+
+NOINLINE (static VALUE
+eval_flip3(self, node))
+  VALUE self;
+  NODE *node;
+{
+  VALUE *flip = rb_svar(node->nd_cnt);
+  if (!flip) rb_bug("unexpected local variable");
+  if (!RTEST(*flip))
+    return *flip = (RTEST(rb_eval(self, node->nd_beg)) ? Qtrue : Qfalse);
+  if (RTEST(rb_eval(self, node->nd_end)))
+    *flip = Qfalse;
+  return Qtrue;
+}
+
+
+NOINLINE (static VALUE
+eval_attrasgn(self, node))
+  VALUE self;
+  NODE *node;
+{
+  VALUE recv;
+  int argc; VALUE *argv; /* used in SETUP_ARGS */
+  int scope;
+  TMP_PROTECT;
+
+  BEGIN_CALLARGS;
+  if (node->nd_recv == (NODE *)1) {
+      recv = self;
+      scope = 1;
+  }
+  else {
+      recv = rb_eval(self, node->nd_recv);
+      scope = 0;
+  }
+  SETUP_ARGS(node->nd_args);
+  END_CALLARGS;
+
+  ruby_current_node = node;
+  SET_CURRENT_SOURCE();
+  rb_call(CLASS_OF(recv),recv,node->nd_mid,argc,argv,scope,self);
+  return argv[argc-1];
+}
+
+
+NOINLINE (static VALUE
+eval_call(self, node))
+  VALUE self;
+  NODE *node;
+{
+  VALUE recv;
+  int argc; VALUE *argv; /* used in SETUP_ARGS */
+  TMP_PROTECT;
+
+  BEGIN_CALLARGS;
+  recv = rb_eval(self, node->nd_recv);
+  SETUP_ARGS(node->nd_args);
+  END_CALLARGS;
+
+  ruby_current_node = node;
+  SET_CURRENT_SOURCE();
+  return rb_call(CLASS_OF(recv),recv,node->nd_mid,argc,argv,0,self);
+}
+
+
+NOINLINE (static VALUE
+eval_fcall(self, node))
+  VALUE self;
+  NODE *node;
+{
+  int argc; VALUE *argv; /* used in SETUP_ARGS */
+  TMP_PROTECT;
+
+  BEGIN_CALLARGS;
+  SETUP_ARGS(node->nd_args);
+  END_CALLARGS;
+
+  ruby_current_node = node;
+  SET_CURRENT_SOURCE();
+  return rb_call(CLASS_OF(self),self,node->nd_mid,argc,argv,1,self);
+}
+
+NOINLINE (static VALUE
+eval_super(self, node))
+  VALUE self;
+  NODE *node;
+{
+  int argc; VALUE *argv; /* used in SETUP_ARGS */
+  TMP_PROTECT;
+
+  if (ruby_frame->last_class == 0) {
+      if (ruby_frame->last_func) {
+	  rb_name_error(ruby_frame->last_func,
+			"superclass method `%s' disabled",
+			rb_id2name(ruby_frame->orig_func));
+      }
+      else {
+	  rb_raise(rb_eNoMethodError, "super called outside of method");
+      }
+  }
+  if (nd_type(node) == NODE_ZSUPER) {
+      argc = ruby_frame->argc;
+      if (argc && DMETHOD_P()) {
+	  if (TYPE(RBASIC(ruby_scope)->klass) != T_ARRAY ||
+	      RARRAY(RBASIC(ruby_scope)->klass)->len != argc) {
+	      rb_raise(rb_eRuntimeError, 
+		       "super: specify arguments explicitly");
+	  }
+	  argv = RARRAY(RBASIC(ruby_scope)->klass)->ptr;
+      }
+      else if (!ruby_scope->local_vars) {
+	  argc = 0;
+	  argv = 0;
+      }
+      else {
+	  argv = ruby_scope->local_vars + 2;
+      }
+  }
+  else {
+      BEGIN_CALLARGS;
+      SETUP_ARGS(node->nd_args);
+      END_CALLARGS;
+      ruby_current_node = node;
+  }
+
+  SET_CURRENT_SOURCE();
+  return rb_call_super(argc, argv);
+}
+
+
+NOINLINE (static VALUE
+eval_scope(self, node))
+  VALUE self;
+  NODE *node;
+{
+  int state;
+  volatile VALUE result = Qnil;
+  struct FRAME frame;
+  NODE *saved_cref = 0;
+
+  frame = *ruby_frame;
+  frame.tmp = ruby_frame;
+  ruby_frame = &frame;
+
+  PUSH_SCOPE();
+  PUSH_TAG(PROT_NONE);
+  if (node->nd_rval) {
+      saved_cref = ruby_cref;
+      ruby_cref = (NODE*)node->nd_rval;
+  }
+  if (node->nd_tbl) {
+      VALUE *vars = ALLOCA_N(VALUE, node->nd_tbl[0]+1);
+      *vars++ = (VALUE)node;
+      ruby_scope->local_vars = vars;
+      rb_mem_clear(ruby_scope->local_vars, node->nd_tbl[0]);
+      ruby_scope->local_tbl = node->nd_tbl;
+  }
+  else {
+      ruby_scope->local_vars = 0;
+      ruby_scope->local_tbl  = 0;
+  }
+  if ((state = EXEC_TAG()) == 0) {
+      result = rb_eval(self, node->nd_next);
+  }
+  POP_TAG();
+  POP_SCOPE();
+  ruby_frame = frame.tmp;
+  if (saved_cref)
+      ruby_cref = saved_cref;
+  if (state) JUMP_TAG(state);
+  return result;
+}
+
+NOINLINE (static VALUE
+eval_op_asgn1(self, node))
+  VALUE self;
+  NODE *node;
+{
+  int argc; VALUE *argv; /* used in SETUP_ARGS */
+  VALUE recv, val, tmp;
+  NODE *rval;
+  TMP_PROTECT;
+
+  recv = rb_eval(self, node->nd_recv);
+  rval = node->nd_args->nd_head;
+  SETUP_ARGS0(node->nd_args->nd_body, 1);
+  val = rb_funcall3(recv, aref, argc, argv);
+  switch (node->nd_mid) {
+  case 0: /* OR */
+    if (RTEST(val)) return val;
+    val = rb_eval(self, rval);
+    break;
+  case 1: /* AND */
+    if (!RTEST(val)) return val;
+    val = rb_eval(self, rval);
+    break;
+  default:
+    tmp = rb_eval(self, rval);
+    val = rb_funcall3(val, node->nd_mid, 1, &tmp);
+  }
+  argv[argc] = val;
+  rb_funcall2(recv, aset, argc+1, argv);
+  return val;
+}
+
+
+NOINLINE (static VALUE
+eval_op_asgn2(self, node))
+  VALUE self;
+  NODE *node;
+{
+  ID id = node->nd_next->nd_vid;
+  VALUE recv, val, tmp;
+
+  recv = rb_eval(self, node->nd_recv);
+  val = rb_funcall3(recv, id, 0, 0);
+  switch (node->nd_next->nd_mid) {
+  case 0: /* OR */
+    if (RTEST(val)) return val;
+    val = rb_eval(self, node->nd_value);
+    break;
+  case 1: /* AND */
+    if (!RTEST(val)) return val;
+    val = rb_eval(self, node->nd_value);
+    break;
+  default:
+    tmp = rb_eval(self, node->nd_value);
+    val = rb_funcall3(val, node->nd_next->nd_mid, 1, &tmp);
+  }
+
+  rb_funcall2(recv, node->nd_next->nd_aid, 1, &val);
+  return val;
+}
+
+
+NOINLINE (static VALUE
+eval_hash(self, node))
+  VALUE self;
+  NODE *node;
+{
+  NODE *list;
+  VALUE hash = rb_hash_new();
+  VALUE key, val;
+
+  list = node->nd_head;
+  while (list) {
+      key = rb_eval(self, list->nd_head);
+      list = list->nd_next;
+      if (list == 0)
+	  rb_bug("odd number list for Hash");
+      val = rb_eval(self, list->nd_head);
+      list = list->nd_next;
+      rb_hash_aset(hash, key, val);
+  }
+  return hash;
+}
+
+
+NOINLINE (static VALUE
+eval_array(self, node))
+  VALUE self;
+  NODE *node;
+{
+  VALUE ary;
+  long i;
+
+  i = node->nd_alen;
+  ary = rb_ary_new2(i);
+  for (i=0;node;node=node->nd_next) {
+      RARRAY(ary)->ptr[i++] = rb_eval(self, node->nd_head);
+      RARRAY(ary)->len = i;
+  }
+  return ary;
+}
+
+
+NOINLINE (static VALUE
+eval_slit(self, node))
+  VALUE self;
+  NODE *node;
+{
+  VALUE str, str2;
+  NODE *list = node->nd_next;
+
+  str = rb_str_new3(node->nd_lit);
+  while (list) {
+      if (list->nd_head) {
+	  switch (nd_type(list->nd_head)) {
+	    case NODE_STR:
+	      str2 = list->nd_head->nd_lit;
+	      break;
+	    default:
+	      str2 = rb_eval(self, list->nd_head);
+	      break;
+	  }
+	  rb_str_append(str, str2);
+	  OBJ_INFECT(str, str2);
+      }
+      list = list->nd_next;
+  }
+  switch (nd_type(node)) {
+    case NODE_DREGX:
+      return rb_reg_new(RSTRING(str)->ptr, RSTRING(str)->len,
+			  node->nd_cflag);
+    case NODE_DREGX_ONCE:	/* regexp expand once */
+      str2 = rb_reg_new(RSTRING(str)->ptr, RSTRING(str)->len,
+			  node->nd_cflag);
+      nd_set_type(node, NODE_LIT);
+      return node->nd_lit = str2;
+    case NODE_LIT:
+      /* other thread may replace NODE_DREGX_ONCE to NODE_LIT */
+      return Qundef;
+    case NODE_DXSTR:
+      return rb_funcall(self, '`', 1, str);
+    case NODE_DSYM:
+      return rb_str_intern(str);
+  }
+  return str;
+}
+
+        
+NOINLINE (static void
+eval_defn(self, node))
+  VALUE self;
+  NODE *node;
+{
+  NODE *body,  *defn;
+  VALUE origin = 0;
+  int noex;
+
+  if (NIL_P(ruby_class)) {
+      rb_raise(rb_eTypeError, "no class/module to add method");
+  }
+  if (ruby_class == rb_cObject && node->nd_mid == init) {
+      rb_warn("redefining Object#initialize may cause infinite loop");
+  }
+  if (node->nd_mid == __id__ || node->nd_mid == __send__) {
+      rb_warn("redefining `%s' may cause serious problem",
+	      rb_id2name(node->nd_mid));
+  }
+  rb_frozen_class_p(ruby_class);
+  body = search_method(ruby_class, node->nd_mid, &origin);
+  if (body){
+      if (RTEST(ruby_verbose) && ruby_class == origin && body->nd_cnt == 0 && body->nd_body) {
+	  rb_warning("method redefined; discarding old %s", rb_id2name(node->nd_mid));
+      }
+  }
+
+  if (SCOPE_TEST(SCOPE_PRIVATE) || node->nd_mid == init) {
+      noex = NOEX_PRIVATE;
+  }
+  else if (SCOPE_TEST(SCOPE_PROTECTED)) {
+      noex = NOEX_PROTECTED;
+  }
+  else {
+      noex = NOEX_PUBLIC;
+  }
+  if (body && origin == ruby_class && body->nd_body == 0) {
+      noex |= NOEX_NOSUPER;
+  }
+
+  defn = rb_copy_node_scope(node->nd_defn, ruby_cref);
+  rb_add_method(ruby_class, node->nd_mid, defn, noex);
+  if (scope_vmode == SCOPE_MODFUNC) {
+      rb_add_method(rb_singleton_class(ruby_class),
+		    node->nd_mid, defn, NOEX_PUBLIC);
+  }
+}
+
+
+NOINLINE (static void
+eval_defs(self, node))
+  VALUE self;
+  NODE *node;
+{
+  VALUE recv = rb_eval(self, node->nd_recv);
+  VALUE klass;
+  NODE *body = 0, *defn;
+  st_data_t data;
+
+  if (ruby_safe_level >= 4 && !OBJ_TAINTED(recv)) {
+      rb_raise(rb_eSecurityError, "Insecure: can't define singleton method");
+  }
+  if (FIXNUM_P(recv) || SYMBOL_P(recv)) {
+      rb_raise(rb_eTypeError,
+	       "can't define singleton method \"%s\" for %s",
+	       rb_id2name(node->nd_mid),
+	       rb_obj_classname(recv));
+  }
+
+  if (OBJ_FROZEN(recv)) rb_error_frozen("object");
+  klass = rb_singleton_class(recv);
+  if (st_lookup(RCLASS(klass)->m_tbl, node->nd_mid, &data)) {
+      body = (NODE *)data;
+      if (ruby_safe_level >= 4) {
+	  rb_raise(rb_eSecurityError, "redefining method prohibited");
+      }
+      if (RTEST(ruby_verbose)) {
+	  rb_warning("redefine %s", rb_id2name(node->nd_mid));
+      }
+  }
+  defn = rb_copy_node_scope(node->nd_defn, ruby_cref);
+  rb_add_method(klass, node->nd_mid, defn,
+		NOEX_PUBLIC|(body?body->nd_noex&NOEX_UNDEF:0));
+}
+
+
+NOINLINE (static VALUE
+eval_class(self, node))
+  VALUE self;
+  NODE *node;
+{
+    VALUE super, klass, tmp, cbase;
+    ID cname;
+    int gen = Qfalse;
+
+    cbase = class_prefix(self, node->nd_cpath);
+    cname = node->nd_cpath->nd_mid;
+
+    if (NIL_P(ruby_cbase)) {
+	rb_raise(rb_eTypeError, "no outer class/module");
+    }
+    if (node->nd_super) {
+       super = rb_eval(self, node->nd_super);
+       rb_check_inheritable(super);
+    }
+    else {
+	super = 0;
+    }
+
+    if (rb_const_defined_at(cbase, cname)) {
+	klass = rb_const_get_at(cbase, cname);
+	if (TYPE(klass) != T_CLASS) {
+	    rb_raise(rb_eTypeError, "%s is not a class",
+		     rb_id2name(cname));
+	}
+	if (super) {
+	    tmp = rb_class_real(RCLASS(klass)->super);
+	    if (tmp != super) {
+		rb_raise(rb_eTypeError, "superclass mismatch for class %s",
+			 rb_id2name(cname));
+	    }
+	    super = 0;
+	}
+	if (ruby_safe_level >= 4) {
+	    rb_raise(rb_eSecurityError, "extending class prohibited");
+	}
+    }
+    else {
+	if (!super) super = rb_cObject;
+	klass = rb_define_class_id(cname, super);
+	rb_set_class_path(klass, cbase, rb_id2name(cname));
+	rb_const_set(cbase, cname, klass);
+	gen = Qtrue;
+    }
+    if (ruby_wrapper) {
+	rb_extend_object(klass, ruby_wrapper);
+	rb_include_module(klass, ruby_wrapper);
+    }
+    if (super && gen) {
+	rb_class_inherited(super, klass);
+    }
+    return module_setup(klass, node);
+}
+
+
+NOINLINE (static VALUE
+eval_module(self, node))
+  VALUE self;
+  NODE *node;
+{
+  VALUE module, cbase;
+  ID cname;
+
+  if (NIL_P(ruby_cbase)) {
+      rb_raise(rb_eTypeError, "no outer class/module");
+  }
+  cbase = class_prefix(self, node->nd_cpath);
+  cname = node->nd_cpath->nd_mid;
+  if (rb_const_defined_at(cbase, cname)) {
+      module = rb_const_get_at(cbase, cname);
+      if (TYPE(module) != T_MODULE) {
+	  rb_raise(rb_eTypeError, "%s is not a module",
+		   rb_id2name(cname));
+      }
+      if (ruby_safe_level >= 4) {
+	  rb_raise(rb_eSecurityError, "extending module prohibited");
+      }
+  }
+  else {
+      module = rb_define_module_id(cname);
+      rb_set_class_path(module, cbase, rb_id2name(cname));
+      rb_const_set(cbase, cname, module);
+  }
+  if (ruby_wrapper) {
+      rb_extend_object(module, ruby_wrapper);
+      rb_include_module(module, ruby_wrapper);
+  }
+
+  return module_setup(module, node);
+}
+
+
+NOINLINE (static VALUE
+eval_sclass(self, node))
+  VALUE self;
+  NODE *node;
+{
+  VALUE klass, result;
+
+  result = rb_eval(self, node->nd_recv);
+  if (FIXNUM_P(result) || SYMBOL_P(result)) {
+      rb_raise(rb_eTypeError, "no virtual class for %s",
+	       rb_obj_classname(result));
+  }
+  if (ruby_safe_level >= 4 && !OBJ_TAINTED(result))
+      rb_raise(rb_eSecurityError, "Insecure: can't extend object");
+  klass = rb_singleton_class(result);
+
+  if (ruby_wrapper) {
+      rb_extend_object(klass, ruby_wrapper);
+      rb_include_module(klass, ruby_wrapper);
+  }
+
+  return module_setup(klass, node);
+}
+
+
+NOINLINE (static VALUE
+eval_defined(self, node))
+  VALUE self;
+  NODE *node;
+{
+    char buf[20];
+    const char *desc = is_defined(self, node->nd_head, buf);
+    return desc ? rb_str_new2(desc) : Qnil;
+}
+
+
+NOINLINE (static void
+eval_cvar_set(result, node, bool))
+  VALUE result, bool;
+  NODE *node;
+{
+  rb_cvar_set(cvar_cbase(), node->nd_vid, result, bool);
+}
+
+
+NOINLINE (static void
+eval_cdecl(self, node, result))
+  VALUE self, result;
+  NODE *node;
+{
+  if (node->nd_vid == 0)
+      rb_const_set(class_prefix(self, node->nd_else), 
+                          node->nd_else->nd_mid, result);
+  else
+      rb_const_set(ruby_cbase, node->nd_vid, result);
+}
+
+
+static VALUE
+rb_eval(self, node)
+  VALUE self;
+  NODE *node;
+{
+  VALUE result;
+
+again:
+  CHECK_INTS;
+  result = Qnil;
+  if (node) {
     ruby_current_node = node;
+    
     switch (nd_type(node)) {
       case NODE_BLOCK:
-	if (contnode) {
-	    result = rb_eval(self, node);
-	    break;
+	while (node->nd_next) {
+	    rb_eval(self, node->nd_head);
+	    node = node->nd_next;
 	}
-	contnode = node->nd_next;
 	node = node->nd_head;
 	goto again;
 
       case NODE_POSTEXE:
 	rb_f_END();
 	nd_set_type(node, NODE_NIL); /* exec just once */
-	result = Qnil;
 	break;
 
 	/* begin .. end without clauses */
@@ -2990,65 +3905,33 @@
 
 	/* nodes for speed-up(literal match) */
       case NODE_MATCH2:
-	{
-	    VALUE l = rb_eval(self,node->nd_recv);
-	    VALUE r = rb_eval(self,node->nd_value);
-	    result = rb_reg_match(l, r);
-	}
+        result = eval_match2(self, node);
 	break;
 
 	/* nodes for speed-up(literal match) */
       case NODE_MATCH3:
-	{
-	    VALUE r = rb_eval(self,node->nd_recv);
-	    VALUE l = rb_eval(self,node->nd_value);
-	    if (TYPE(l) == T_STRING) {
-		result = rb_reg_match(r, l);
-	    }
-	    else {
-		result = rb_funcall(l, match, 1, r);
-	    }
-	}
+        result = eval_match3(self,node);
 	break;
 
 	/* node for speed-up(top-level loop for -n/-p) */
       case NODE_OPT_N:
-	PUSH_TAG(PROT_LOOP);
-	switch (state = EXEC_TAG()) {
-	  case 0:
-	  opt_n_next:
-	    while (!NIL_P(rb_gets())) {
-	      opt_n_redo:
-		rb_eval(self, node->nd_body);
-	    }
-	    break;
-
-	  case TAG_REDO:
-	    state = 0;
-	    goto opt_n_redo;
-	  case TAG_NEXT:
-	    state = 0;
-	    goto opt_n_next;
-	  case TAG_BREAK:
-	    state = 0;
-	  default:
-	    break;
-	}
-	POP_TAG();
-	if (state) JUMP_TAG(state);
-	RETURN(Qnil);
+        eval_opt_n(self, node);
+        break;
 
       case NODE_SELF:
-	RETURN(self);
+	result = self;
+        break;
 
       case NODE_NIL:
-	RETURN(Qnil);
+	break;
 
       case NODE_TRUE:
-	RETURN(Qtrue);
+	result = Qtrue;
+        break;
 
       case NODE_FALSE:
-	RETURN(Qfalse);
+	result = Qfalse;
+        break;
 
       case NODE_IF:
 	if (RTEST(rb_eval(self, node->nd_cond))) {
@@ -3066,150 +3949,20 @@
 	goto again;
 
       case NODE_WHEN:
-	while (node) {
-	    NODE *tag;
-
-	    if (nd_type(node) != NODE_WHEN) goto again;
-	    tag = node->nd_head;
-	    while (tag) {
-		EXEC_EVENT_HOOK(RUBY_EVENT_LINE, tag, self,
-				ruby_frame->last_func,
-				ruby_frame->last_class);
-		if (tag->nd_head && nd_type(tag->nd_head) == NODE_WHEN) {
-		    VALUE v = rb_eval(self, tag->nd_head->nd_head);
-		    long i;
-
-		    if (TYPE(v) != T_ARRAY) v = rb_ary_to_ary(v);
-		    for (i=0; i<RARRAY(v)->len; i++) {
-			if (RTEST(RARRAY(v)->ptr[i])) {
-			    node = node->nd_body;
-			    goto again;
-			}
-		    }
-		    tag = tag->nd_next;
-		    continue;
-		}
-		if (RTEST(rb_eval(self, tag->nd_head))) {
-		    node = node->nd_body;
-		    goto again;
-		}
-		tag = tag->nd_next;
-	    }
-	    node = node->nd_next;
-	}
-	RETURN(Qnil);
+        if (node = eval_when(self, node)) goto again;
+        break;
 
       case NODE_CASE:
-	{
-	    VALUE val;
-
-	    val = rb_eval(self, node->nd_head);
-	    node = node->nd_body;
-	    while (node) {
-		NODE *tag;
-
-		if (nd_type(node) != NODE_WHEN) {
-		    goto again;
-		}
-		tag = node->nd_head;
-		while (tag) {
-		    EXEC_EVENT_HOOK(RUBY_EVENT_LINE, tag, self,
-				    ruby_frame->last_func,
-				    ruby_frame->last_class);
-		    if (tag->nd_head && nd_type(tag->nd_head) == NODE_WHEN) {
-			VALUE v = rb_eval(self, tag->nd_head->nd_head);
-			long i;
-
-			if (TYPE(v) != T_ARRAY) v = rb_ary_to_ary(v);
-			for (i=0; i<RARRAY(v)->len; i++) {
-			    if (RTEST(rb_funcall2(RARRAY(v)->ptr[i], eqq, 1, &val))){
-				node = node->nd_body;
-				goto again;
-			    }
-			}
-			tag = tag->nd_next;
-			continue;
-		    }
-		    if (RTEST(rb_funcall2(rb_eval(self, tag->nd_head), eqq, 1, &val))) {
-			node = node->nd_body;
-			goto again;
-		    }
-		    tag = tag->nd_next;
-		}
-		node = node->nd_next;
-	    }
-	}
-	RETURN(Qnil);
+        if (node = eval_case(self, node)) goto again;
+        break;
 
       case NODE_WHILE:
-	PUSH_TAG(PROT_LOOP);
-	result = Qnil;
-	switch (state = EXEC_TAG()) {
-	  case 0:
-	    if (node->nd_state && !RTEST(rb_eval(self, node->nd_cond)))
-		goto while_out;
-	    do {
-	      while_redo:
-		rb_eval(self, node->nd_body);
-	      while_next:
-		;
-	    } while (RTEST(rb_eval(self, node->nd_cond)));
-	    break;
-
-	  case TAG_REDO:
-	    state = 0;
-	    goto while_redo;
-	  case TAG_NEXT:
-	    state = 0;
-	    goto while_next;
-	  case TAG_BREAK:
-	    if (TAG_DST()) {
-		state = 0;
-		result = prot_tag->retval;
-	    }
-	    /* fall through */
-	  default:
-	    break;
-	}
-      while_out:
-	POP_TAG();
-	if (state) JUMP_TAG(state);
-	RETURN(result);
+        result = eval_while(self,node);
+        break;
 
       case NODE_UNTIL:
-	PUSH_TAG(PROT_LOOP);
-	result = Qnil;
-	switch (state = EXEC_TAG()) {
-	  case 0:
-	    if (node->nd_state && RTEST(rb_eval(self, node->nd_cond)))
-		goto until_out;
-	    do {
-	      until_redo:
-		rb_eval(self, node->nd_body);
-	      until_next:
-		;
-	    } while (!RTEST(rb_eval(self, node->nd_cond)));
-	    break;
-
-	  case TAG_REDO:
-	    state = 0;
-	    goto until_redo;
-	  case TAG_NEXT:
-	    state = 0;
-	    goto until_next;
-	  case TAG_BREAK:
-	    if (TAG_DST()) {
-		state = 0;
-		result = prot_tag->retval;
-	    }
-	    /* fall through */
-	  default:
-	    break;
-	}
-      until_out:
-	POP_TAG();
-	if (state) JUMP_TAG(state);
-	RETURN(result);
+        result = eval_until(self,node);
+        break;
 
       case NODE_BLOCK_PASS:
 	result = block_pass(self, node);
@@ -3217,47 +3970,7 @@
 
       case NODE_ITER:
       case NODE_FOR:
-	{
-	    PUSH_TAG(PROT_LOOP);
-	    PUSH_BLOCK(node->nd_var, node->nd_body);
-
-	    state = EXEC_TAG();
-	    if (state == 0) {
-	      iter_retry:
-		PUSH_ITER(ITER_PRE);
-		if (nd_type(node) == NODE_ITER) {
-		    result = rb_eval(self, node->nd_iter);
-		}
-		else {
-		    VALUE recv;
-
-		    _block.flags &= ~BLOCK_D_SCOPE;
-		    BEGIN_CALLARGS;
-		    recv = rb_eval(self, node->nd_iter);
-		    END_CALLARGS;
-		    ruby_current_node = node;
-		    SET_CURRENT_SOURCE();
-		    result = rb_call(CLASS_OF(recv),recv,each,0,0,0,self);
-		}
-		POP_ITER();
-	    }
-	    else if (state == TAG_BREAK && TAG_DST()) {
-		result = prot_tag->retval;
-		state = 0;
-	    }
-	    else if (state == TAG_RETRY) {
-		state = 0;
-		goto iter_retry;
-	    }
-	    POP_BLOCK();
-	    POP_TAG();
-	    switch (state) {
-	      case 0:
-		break;
-	      default:
-		JUMP_TAG(state);
-	    }
-	}
+	result = eval_iter(self, node);
 	break;
 
       case NODE_BREAK:
@@ -3265,17 +3978,14 @@
 	break;
 
       case NODE_NEXT:
-	CHECK_INTS;
 	next_jump(rb_eval(self, node->nd_stts));
 	break;
 
       case NODE_REDO:
-	CHECK_INTS;
 	JUMP_TAG(TAG_REDO);
 	break;
 
       case NODE_RETRY:
-	CHECK_INTS;
 	JUMP_TAG(TAG_RETRY);
 	break;
 
@@ -3305,73 +4015,15 @@
 	break;
 
       case NODE_RESCUE:
-	{
-	    volatile VALUE e_info = ruby_errinfo;
-	    volatile int rescuing = 0;
-
-	    PUSH_TAG(PROT_NONE);
-	    if ((state = EXEC_TAG()) == 0) {
-	      retry_entry:
-		result = rb_eval(self, node->nd_head);
-	    }
-	    else if (rescuing) {
-		if (rescuing < 0) {
-		    /* in rescue argument, just reraise */
-		}
-		else if (state == TAG_RETRY) {
-		    rescuing = state = 0;
-		    ruby_errinfo = e_info;
-		    goto retry_entry;
-		}
-		else if (state != TAG_RAISE) {
-		    result = prot_tag->retval;
-		}
-	    }
-	    else if (state == TAG_RAISE) {
-		NODE *resq = node->nd_resq;
-
-		rescuing = -1;
-		while (resq) {
-		    ruby_current_node = resq;
-		    if (handle_rescue(self, resq)) {
-			state = 0;
-			rescuing = 1;
-			result = rb_eval(self, resq->nd_body);
-			break;
-		    }
-		    resq = resq->nd_head; /* next rescue */
-		}
-	    }
-	    else {
-		result = prot_tag->retval;
-	    }
-	    POP_TAG();
-	    if (state != TAG_RAISE) ruby_errinfo = e_info;
-	    if (state) {
-		JUMP_TAG(state);
-	    }
-	    /* no exception raised */
-	    if (!rescuing && (node = node->nd_else)) { /* else clause given */
-		goto again;
-	    }
-	}
+        result = eval_rescue(self,node);
+        if (result == Qundef) {  /* handle else clause w/o recursion */
+          node = node->nd_else;
+          goto again;
+        }
 	break;
 
       case NODE_ENSURE:
-	PUSH_TAG(PROT_NONE);
-	if ((state = EXEC_TAG()) == 0) {
-	    result = rb_eval(self, node->nd_head);
-	}
-	POP_TAG();
-	if (node->nd_ensr && !thread_no_ensure()) {
-	    VALUE retval = prot_tag->retval; /* save retval */
-	    VALUE errinfo = ruby_errinfo;
-
-	    rb_eval(self, node->nd_ensr);
-	    return_value(retval);
-	    ruby_errinfo = errinfo;
-	}
-	if (state) JUMP_TAG(state);
+        result = eval_ensure(self,node);
 	break;
 
       case NODE_AND:
@@ -3387,56 +4039,20 @@
 	goto again;
 
       case NODE_NOT:
-	if (RTEST(rb_eval(self, node->nd_body))) result = Qfalse;
-	else result = Qtrue;
+	result = RTEST(rb_eval(self, node->nd_body)) ? Qfalse : Qtrue;
 	break;
 
       case NODE_DOT2:
       case NODE_DOT3:
-        {
-	    VALUE beg = rb_eval(self, node->nd_beg);
-	    VALUE end = rb_eval(self, node->nd_end);
-	    result = rb_range_new(beg, end, nd_type(node) == NODE_DOT3);
-	}	
-	break;
+        result = eval_dot(self,node);
+        break;
 
       case NODE_FLIP2:		/* like AWK */
-	{
-	    VALUE *flip = rb_svar(node->nd_cnt);
-	    if (!flip) rb_bug("unexpected local variable");
-	    if (!RTEST(*flip)) {
-		if (RTEST(rb_eval(self, node->nd_beg))) {
-		    *flip = RTEST(rb_eval(self, node->nd_end))?Qfalse:Qtrue;
-		    result = Qtrue;
-		}
-		else {
-		    result = Qfalse;
-		}
-	    }
-	    else {
-		if (RTEST(rb_eval(self, node->nd_end))) {
-		    *flip = Qfalse;
-		}
-		result = Qtrue;
-	    }
-	}
+        result = eval_flip2(self,node);
 	break;
 
       case NODE_FLIP3:		/* like SED */
-	{
-	    VALUE *flip = rb_svar(node->nd_cnt);
-	    if (!flip) rb_bug("unexpected local variable");
-	    if (!RTEST(*flip)) {
-		result = RTEST(rb_eval(self, node->nd_beg)) ? Qtrue : Qfalse;
-		*flip = result;
-	    }
-	    else {
-		if (RTEST(rb_eval(self, node->nd_end))) {
-		    *flip = Qfalse;
-		}
-		result = Qtrue;
-	    }
-	}
+        result = eval_flip3(self,node);
 	break;
 
       case NODE_RETURN:
@@ -3444,75 +4060,25 @@
 	break;
 
       case NODE_ARGSCAT:
-	{
-	    VALUE args = rb_eval(self, node->nd_head);
-	    result = rb_ary_concat(args, splat_value(rb_eval(self, node->nd_body)));
-	}
+	result = rb_eval(self, node->nd_head);
+	result = rb_ary_concat(result, splat_value(rb_eval(self, node->nd_body)));
 	break;
 
       case NODE_ARGSPUSH:
-	{
-	    VALUE args = rb_ary_dup(rb_eval(self, node->nd_head));
-	    result = rb_ary_push(args, rb_eval(self, node->nd_body));
-	}
+	result = rb_ary_dup(rb_eval(self, node->nd_head));
+	result = rb_ary_push(result, rb_eval(self, node->nd_body));
 	break;
 
       case NODE_ATTRASGN:
-	{
-	    VALUE recv;
-	    int argc; VALUE *argv; /* used in SETUP_ARGS */
-	    int scope;
-	    TMP_PROTECT;
-
-	    BEGIN_CALLARGS;
-	    if (node->nd_recv == (NODE *)1) {
-		recv = self;
-		scope = 1;
-	    }
-	    else {
-		recv = rb_eval(self, node->nd_recv);
-		scope = 0;
-	    }
-	    SETUP_ARGS(node->nd_args);
-	    END_CALLARGS;
-
-	    ruby_current_node = node;
-	    SET_CURRENT_SOURCE();
-	    rb_call(CLASS_OF(recv),recv,node->nd_mid,argc,argv,scope,self);
-	    result = argv[argc-1];
-	}
-	break;
+        result = eval_attrasgn(self,node);
+        break;
 
       case NODE_CALL:
-	{
-	    VALUE recv;
-	    int argc; VALUE *argv; /* used in SETUP_ARGS */
-	    TMP_PROTECT;
-
-	    BEGIN_CALLARGS;
-	    recv = rb_eval(self, node->nd_recv);
-	    SETUP_ARGS(node->nd_args);
-	    END_CALLARGS;
-
-	    ruby_current_node = node;
-	    SET_CURRENT_SOURCE();
-	    result = rb_call(CLASS_OF(recv),recv,node->nd_mid,argc,argv,0,self);
-	}
+        result = eval_call(self,node);
 	break;
 
       case NODE_FCALL:
-	{
-	    int argc; VALUE *argv; /* used in SETUP_ARGS */
-	    TMP_PROTECT;
-
-	    BEGIN_CALLARGS;
-	    SETUP_ARGS(node->nd_args);
-	    END_CALLARGS;
-
-	    ruby_current_node = node;
-	    SET_CURRENT_SOURCE();
-	    result = rb_call(CLASS_OF(self),self,node->nd_mid,argc,argv,1,self);
-	}
+        result = eval_fcall(self,node);
 	break;
 
       case NODE_VCALL:
@@ -3522,142 +4088,19 @@
 
       case NODE_SUPER:
       case NODE_ZSUPER:
-	{
-	    int argc; VALUE *argv; /* used in SETUP_ARGS */
-	    TMP_PROTECT;
-
-	    if (ruby_frame->last_class == 0) {
-		if (ruby_frame->last_func) {
-		    rb_name_error(ruby_frame->last_func,
-				  "superclass method `%s' disabled",
-				  rb_id2name(ruby_frame->orig_func));
-		}
-		else {
-		    rb_raise(rb_eNoMethodError, "super called outside of method");
-		}
-	    }
-	    if (nd_type(node) == NODE_ZSUPER) {
-		argc = ruby_frame->argc;
-		if (argc && DMETHOD_P()) {
-		    if (TYPE(RBASIC(ruby_scope)->klass) != T_ARRAY ||
-			RARRAY(RBASIC(ruby_scope)->klass)->len != argc) {
-			rb_raise(rb_eRuntimeError, 
-				 "super: specify arguments explicitly");
-		    }
-		    argv = RARRAY(RBASIC(ruby_scope)->klass)->ptr;
-		}
-		else if (!ruby_scope->local_vars) {
-		    argc = 0;
-		    argv = 0;
-		}
-		else {
-		    argv = ruby_scope->local_vars + 2;
-		}
-	    }
-	    else {
-		BEGIN_CALLARGS;
-		SETUP_ARGS(node->nd_args);
-		END_CALLARGS;
-		ruby_current_node = node;
-	    }
-
-	    SET_CURRENT_SOURCE();
-	    result = rb_call_super(argc, argv);
-	}
+        result = eval_super(self,node);
 	break;
 
       case NODE_SCOPE:
-	{
-	    struct FRAME frame;
-	    NODE *saved_cref = 0;
-
-	    frame = *ruby_frame;
-	    frame.tmp = ruby_frame;
-	    ruby_frame = &frame;
-
-	    PUSH_SCOPE();
-	    PUSH_TAG(PROT_NONE);
-	    if (node->nd_rval) {
-		saved_cref = ruby_cref;
-		ruby_cref = (NODE*)node->nd_rval;
-	    }
-	    if (node->nd_tbl) {
-		VALUE *vars = ALLOCA_N(VALUE, node->nd_tbl[0]+1);
-		*vars++ = (VALUE)node;
-		ruby_scope->local_vars = vars;
-		rb_mem_clear(ruby_scope->local_vars, node->nd_tbl[0]);
-		ruby_scope->local_tbl = node->nd_tbl;
-	    }
-	    else {
-		ruby_scope->local_vars = 0;
-		ruby_scope->local_tbl  = 0;
-	    }
-	    if ((state = EXEC_TAG()) == 0) {
-		result = rb_eval(self, node->nd_next);
-	    }
-	    POP_TAG();
-	    POP_SCOPE();
-	    ruby_frame = frame.tmp;
-	    if (saved_cref)
-		ruby_cref = saved_cref;
-	    if (state) JUMP_TAG(state);
-	}
-	break;
+        result = eval_scope(self,node);
+        break;
 
       case NODE_OP_ASGN1:
-	{
-	    int argc; VALUE *argv; /* used in SETUP_ARGS */
-	    VALUE recv, val, tmp;
-	    NODE *rval;
-	    TMP_PROTECT;
-
-	    recv = rb_eval(self, node->nd_recv);
-	    rval = node->nd_args->nd_head;
-	    SETUP_ARGS0(node->nd_args->nd_body, 1);
-	    val = rb_funcall3(recv, aref, argc, argv);
-	    switch (node->nd_mid) {
-	    case 0: /* OR */
-	      if (RTEST(val)) RETURN(val);
-	      val = rb_eval(self, rval);
-	      break;
-	    case 1: /* AND */
-	      if (!RTEST(val)) RETURN(val);
-	      val = rb_eval(self, rval);
-	      break;
-	    default:
-	      tmp = rb_eval(self, rval);
-	      val = rb_funcall3(val, node->nd_mid, 1, &tmp);
-	    }
-	    argv[argc] = val;
-	    rb_funcall2(recv, aset, argc+1, argv);
-	    result = val;
-	}
+        result = eval_op_asgn1(self,node);
 	break;
 
       case NODE_OP_ASGN2:
-	{
-	    ID id = node->nd_next->nd_vid;
-	    VALUE recv, val, tmp;
-
-	    recv = rb_eval(self, node->nd_recv);
-	    val = rb_funcall3(recv, id, 0, 0);
-	    switch (node->nd_next->nd_mid) {
-	    case 0: /* OR */
-	      if (RTEST(val)) RETURN(val);
-	      val = rb_eval(self, node->nd_value);
-	      break;
-	    case 1: /* AND */
-	      if (!RTEST(val)) RETURN(val);
-	      val = rb_eval(self, node->nd_value);
-	      break;
-	    default:
-	      tmp = rb_eval(self, node->nd_value);
-	      val = rb_funcall3(val, node->nd_next->nd_mid, 1, &tmp);
-	    }
-
-	    rb_funcall2(recv, node->nd_next->nd_aid, 1, &val);
-	    result = val;
-	}
+        result = eval_op_asgn2(self,node);
 	break;
 
       case NODE_OP_ASGN_AND:
@@ -3706,26 +4149,21 @@
 	break;
 
       case NODE_CDECL:
-	result = rb_eval(self, node->nd_value);
-	if (node->nd_vid == 0) {
-	    rb_const_set(class_prefix(self, node->nd_else), node->nd_else->nd_mid, result);
-	}
-	else {
-	    rb_const_set(ruby_cbase, node->nd_vid, result);
-	}
+        result = rb_eval(self, node->nd_value);
+        eval_cdecl(self, node, result);
 	break;
 
       case NODE_CVDECL:
 	if (NIL_P(ruby_cbase)) {
 	    rb_raise(rb_eTypeError, "no class/module to define class variable");
 	}
-	result = rb_eval(self, node->nd_value);
-	rb_cvar_set(cvar_cbase(), node->nd_vid, result, Qtrue);
+        result = rb_eval(self, node->nd_value);
+        eval_cvar_set(result, node, Qtrue);
 	break;
 
       case NODE_CVASGN:
-	result = rb_eval(self, node->nd_value);
-	rb_cvar_set(cvar_cbase(), node->nd_vid, result, Qfalse);
+        result = rb_eval(self, node->nd_value);
+        eval_cvar_set(result, node, Qfalse);
 	break;
 
       case NODE_LVAR:
@@ -3768,26 +4206,21 @@
 	break;
 
       case NODE_COLON2:
-	{
-	    VALUE klass;
-
-	    klass = rb_eval(self, node->nd_head);
-	    if (rb_is_const_id(node->nd_mid)) {
-		switch (TYPE(klass)) {
-		  case T_CLASS:
-		  case T_MODULE:
-		    result = rb_const_get_from(klass, node->nd_mid);
-		    break;
-		  default:
-		    rb_raise(rb_eTypeError, "%s is not a class/module",
-			     RSTRING(rb_obj_as_string(klass))->ptr);
-		    break;
-		}
-	    }
-	    else {
-		result = rb_funcall(klass, node->nd_mid, 0, 0);
+	result = rb_eval(self, node->nd_head);
+	if (rb_is_const_id(node->nd_mid)) {
+	    switch (TYPE(result)) {
+	      case T_CLASS:
+	      case T_MODULE:
+		result = rb_const_get_from(result, node->nd_mid);
+		break;
+	      default:
+		rb_raise(rb_eTypeError, "%s is not a class/module",
+			 RSTRING(rb_obj_as_string(result))->ptr);
+		break;
 	    }
 	}
+	else
+	    result = rb_funcall(result, node->nd_mid, 0, 0);
 	break;
 
       case NODE_COLON3:
@@ -3818,23 +4251,7 @@
 	break;
 
       case NODE_HASH:
-	{
-	    NODE *list;
-	    VALUE hash = rb_hash_new();
-	    VALUE key, val;
-
-	    list = node->nd_head;
-	    while (list) {
-		key = rb_eval(self, list->nd_head);
-		list = list->nd_next;
-		if (list == 0)
-		    rb_bug("odd number list for Hash");
-		val = rb_eval(self, list->nd_head);
-		list = list->nd_next;
-		rb_hash_aset(hash, key, val);
-	    }
-	    result = hash;
-	}
+        result = eval_hash(self,node);
 	break;
 
       case NODE_ZARRAY:		/* zero length list */
@@ -3842,19 +4259,7 @@
 	break;
 
       case NODE_ARRAY:
-	{
-	    VALUE ary;
-	    long i;
-
-	    i = node->nd_alen;
-	    ary = rb_ary_new2(i);
-	    for (i=0;node;node=node->nd_next) {
-		RARRAY(ary)->ptr[i++] = rb_eval(self, node->nd_head);
-		RARRAY(ary)->len = i;
-	    }
-
-	    result = ary;
-	}
+        result = eval_array(self,node);
 	break;
 
       case NODE_STR:
@@ -3870,51 +4275,8 @@
       case NODE_DREGX:
       case NODE_DREGX_ONCE:
       case NODE_DSYM:
-	{
-	    VALUE str, str2;
-	    NODE *list = node->nd_next;
-
-	    str = rb_str_new3(node->nd_lit);
-	    while (list) {
-		if (list->nd_head) {
-		    switch (nd_type(list->nd_head)) {
-		      case NODE_STR:
-			str2 = list->nd_head->nd_lit;
-			break;
-		      default:
-			str2 = rb_eval(self, list->nd_head);
-			break;
-		    }
-		    rb_str_append(str, str2);
-		    OBJ_INFECT(str, str2);
-		}
-		list = list->nd_next;
-	    }
-	    switch (nd_type(node)) {
-	      case NODE_DREGX:
-		result = rb_reg_new(RSTRING(str)->ptr, RSTRING(str)->len,
-				    node->nd_cflag);
-		break;
-	      case NODE_DREGX_ONCE:	/* regexp expand once */
-		result = rb_reg_new(RSTRING(str)->ptr, RSTRING(str)->len,
-				    node->nd_cflag);
-		nd_set_type(node, NODE_LIT);
-		node->nd_lit = result;
-		break;
-	      case NODE_LIT:
-		/* other thread may replace NODE_DREGX_ONCE to NODE_LIT */
-		goto again;
-	      case NODE_DXSTR:
-		result = rb_funcall(self, '`', 1, str);
-		break;
-	      case NODE_DSYM:
-		result = rb_str_intern(str);
-		break;
-	      default:
-		result = str;
-		break;
-	    }
-	}
+        result = eval_slit(self, node);
+        if (result == Qundef) goto again;
 	break;
 
       case NODE_XSTR:
@@ -3926,84 +4288,13 @@
 	break;
 
       case NODE_DEFN:
-	if (node->nd_defn) {
-	    NODE *body,  *defn;
-	    VALUE origin = 0;
-	    int noex;
-
-	    if (NIL_P(ruby_class)) {
-		rb_raise(rb_eTypeError, "no class/module to add method");
-	    }
-	    if (ruby_class == rb_cObject && node->nd_mid == init) {
-		rb_warn("redefining Object#initialize may cause infinite loop");
-	    }
-	    if (node->nd_mid == __id__ || node->nd_mid == __send__) {
-		rb_warn("redefining `%s' may cause serious problem",
-			rb_id2name(node->nd_mid));
-	    }
-	    rb_frozen_class_p(ruby_class);
-	    body = search_method(ruby_class, node->nd_mid, &origin);
-	    if (body){
-		if (RTEST(ruby_verbose) && ruby_class == origin && body->nd_cnt == 0 && body->nd_body) {
-		    rb_warning("method redefined; discarding old %s", rb_id2name(node->nd_mid));
-		}
-	    }
-
-	    if (SCOPE_TEST(SCOPE_PRIVATE) || node->nd_mid == init) {
-		noex = NOEX_PRIVATE;
-	    }
-	    else if (SCOPE_TEST(SCOPE_PROTECTED)) {
-		noex = NOEX_PROTECTED;
-	    }
-	    else {
-		noex = NOEX_PUBLIC;
-	    }
-	    if (body && origin == ruby_class && body->nd_body == 0) {
-		noex |= NOEX_NOSUPER;
-	    }
-
-	    defn = rb_copy_node_scope(node->nd_defn, ruby_cref);
-	    rb_add_method(ruby_class, node->nd_mid, defn, noex);
-	    if (scope_vmode == SCOPE_MODFUNC) {
-		rb_add_method(rb_singleton_class(ruby_class),
-			      node->nd_mid, defn, NOEX_PUBLIC);
-	    }
-	    result = Qnil;
-	}
+	if (node->nd_defn)
+          eval_defn(self,node);
 	break;
 
       case NODE_DEFS:
-	if (node->nd_defn) {
-	    VALUE recv = rb_eval(self, node->nd_recv);
-	    VALUE klass;
-	    NODE *body = 0, *defn;
-
-	    if (ruby_safe_level >= 4 && !OBJ_TAINTED(recv)) {
-		rb_raise(rb_eSecurityError, "Insecure: can't define singleton method");
-	    }
-	    if (FIXNUM_P(recv) || SYMBOL_P(recv)) {
-		rb_raise(rb_eTypeError,
-			 "can't define singleton method \"%s\" for %s",
-			 rb_id2name(node->nd_mid),
-			 rb_obj_classname(recv));
-	    }
-
-	    if (OBJ_FROZEN(recv)) rb_error_frozen("object");
-	    klass = rb_singleton_class(recv);
-	    if (st_lookup(RCLASS(klass)->m_tbl, node->nd_mid, &data)) {
-		body = (NODE *)data;
-		if (ruby_safe_level >= 4) {
-		    rb_raise(rb_eSecurityError, "redefining method prohibited");
-		}
-		if (RTEST(ruby_verbose)) {
-		    rb_warning("redefine %s", rb_id2name(node->nd_mid));
-		}
-	    }
-	    defn = rb_copy_node_scope(node->nd_defn, ruby_cref);
-	    rb_add_method(klass, node->nd_mid, defn,
-			  NOEX_PUBLIC|(body?body->nd_noex&NOEX_UNDEF:0));
-	    result = Qnil;
-	}
+	if (node->nd_defn) 
+          eval_defs(self,node);
 	break;
 
       case NODE_UNDEF:
@@ -4011,7 +4302,6 @@
 	    rb_raise(rb_eTypeError, "no class to undef method");
 	}
 	rb_undef(ruby_class, rb_to_id(rb_eval(self, node->u2.node)));
-	result = Qnil;
 	break;
 
       case NODE_ALIAS:
@@ -4020,134 +4310,26 @@
 	}
 	rb_alias(ruby_class, rb_to_id(rb_eval(self, node->u1.node)),
 		             rb_to_id(rb_eval(self, node->u2.node)));
-	result = Qnil;
 	break;
 
       case NODE_VALIAS:
 	rb_alias_variable(node->u1.id, node->u2.id);
-	result = Qnil;
 	break;
 
       case NODE_CLASS:
-	{
-	    VALUE super, klass, tmp, cbase;
-	    ID cname;
-	    int gen = Qfalse;
-
-	    cbase = class_prefix(self, node->nd_cpath);
-	    cname = node->nd_cpath->nd_mid;
-
-	    if (NIL_P(ruby_cbase)) {
-		rb_raise(rb_eTypeError, "no outer class/module");
-	    }
-	    if (node->nd_super) {
-	       super = rb_eval(self, node->nd_super);
-	       rb_check_inheritable(super);
-	    }
-	    else {
-		super = 0;
-	    }
-
-	    if (rb_const_defined_at(cbase, cname)) {
-		klass = rb_const_get_at(cbase, cname);
-		if (TYPE(klass) != T_CLASS) {
-		    rb_raise(rb_eTypeError, "%s is not a class",
-			     rb_id2name(cname));
-		}
-		if (super) {
-		    tmp = rb_class_real(RCLASS(klass)->super);
-		    if (tmp != super) {
-			rb_raise(rb_eTypeError, "superclass mismatch for class %s",
-				 rb_id2name(cname));
-		    }
-		    super = 0;
-		}
-		if (ruby_safe_level >= 4) {
-		    rb_raise(rb_eSecurityError, "extending class prohibited");
-		}
-	    }
-	    else {
-		if (!super) super = rb_cObject;
-		klass = rb_define_class_id(cname, super);
-		rb_set_class_path(klass, cbase, rb_id2name(cname));
-		rb_const_set(cbase, cname, klass);
-		gen = Qtrue;
-	    }
-	    if (ruby_wrapper) {
-		rb_extend_object(klass, ruby_wrapper);
-		rb_include_module(klass, ruby_wrapper);
-	    }
-	    if (super && gen) {
-		rb_class_inherited(super, klass);
-	    }
-	    result = module_setup(klass, node);
-	}
+        result = eval_class(self,node);
 	break;
 
       case NODE_MODULE:
-	{
-	    VALUE module, cbase;
-	    ID cname;
-
-	    if (NIL_P(ruby_cbase)) {
-		rb_raise(rb_eTypeError, "no outer class/module");
-	    }
-	    cbase = class_prefix(self, node->nd_cpath);
-	    cname = node->nd_cpath->nd_mid;
-	    if (rb_const_defined_at(cbase, cname)) {
-		module = rb_const_get_at(cbase, cname);
-		if (TYPE(module) != T_MODULE) {
-		    rb_raise(rb_eTypeError, "%s is not a module",
-			     rb_id2name(cname));
-		}
-		if (ruby_safe_level >= 4) {
-		    rb_raise(rb_eSecurityError, "extending module prohibited");
-		}
-	    }
-	    else {
-		module = rb_define_module_id(cname);
-		rb_set_class_path(module, cbase, rb_id2name(cname));
-		rb_const_set(cbase, cname, module);
-	    }
-	    if (ruby_wrapper) {
-		rb_extend_object(module, ruby_wrapper);
-		rb_include_module(module, ruby_wrapper);
-	    }
-
-	    result = module_setup(module, node);
-	}
+        result = eval_module(self,node);
 	break;
 
       case NODE_SCLASS:
-	{
-	    VALUE klass;
-
-	    result = rb_eval(self, node->nd_recv);
-	    if (FIXNUM_P(result) || SYMBOL_P(result)) {
-		rb_raise(rb_eTypeError, "no virtual class for %s",
-			 rb_obj_classname(result));
-	    }
-	    if (ruby_safe_level >= 4 && !OBJ_TAINTED(result))
-		rb_raise(rb_eSecurityError, "Insecure: can't extend object");
-	    klass = rb_singleton_class(result);
-
-	    if (ruby_wrapper) {
-		rb_extend_object(klass, ruby_wrapper);
-		rb_include_module(klass, ruby_wrapper);
-	    }
-
-	    result = module_setup(klass, node);
-	}
+        result = eval_sclass(self,node);
 	break;
 
       case NODE_DEFINED:
-	{
-	    char buf[20];
-	    const char *desc = is_defined(self, node->nd_head, buf);
-
-	    if (desc) result = rb_str_new2(desc);
-	    else result = Qnil;
-	}
+        result = eval_defined(self,node);
 	break;
 
       case NODE_NEWLINE:
@@ -4160,14 +4342,8 @@
       default:
 	unknown_node(node);
     }
-  finish:
-    CHECK_INTS;
-    if (contnode) {
-	node = contnode;
-	contnode = 0;
-	goto again;
-    }
-    return result;
+  }
+  return result;
 }
 
 static VALUE
@@ -13081,6 +13257,32 @@
 
 VALUE rb_cCont;
 
+
+static rb_thread_t prep4callcc(void)
+{
+  rb_thread_t th;
+  struct tag *tag;
+  struct RVarmap *vars;
+
+  THREAD_ALLOC(th);
+  /* must finish th initialization before any possible gc */
+  th->thread = curr_thread->thread;    /* brent@mbari.org */
+  th->thgroup = cont_protect;
+
+  scope_dup(ruby_scope);
+  for (tag=prot_tag; tag; tag=tag->prev) {
+      if (tag->tag == PROT_THREAD) break;
+      scope_dup(tag->scope);
+  }
+
+  for (vars = ruby_dyna_vars; vars; vars = vars->next) {
+      if (FL_TEST(vars, DVAR_DONT_RECYCLE)) break;
+      FL_SET(vars, DVAR_DONT_RECYCLE);
+  }
+  return th;
+}
+
+
 /*
  *  call-seq:
  *     callcc {|cont| block }   =>  obj
@@ -13099,37 +13301,14 @@
 rb_callcc(self)
     VALUE self;
 {
-    volatile VALUE cont;
-    rb_thread_t th;
-    volatile rb_thread_t th_save;
-    struct tag *tag;
-    struct RVarmap *vars;
-
-    THREAD_ALLOC(th);
-    /* must finish th initialization before any possible gc */
-    th->thread = curr_thread->thread;    /* brent@mbari.org */
-    th->thgroup = cont_protect;
-    cont = Data_Wrap_Struct(rb_cCont, cc_mark, thread_free, th);
-
-    scope_dup(ruby_scope);
-    for (tag=prot_tag; tag; tag=tag->prev) {
-        if (tag->tag == PROT_THREAD) break;
-	scope_dup(tag->scope);
-    }
-
-    for (vars = ruby_dyna_vars; vars; vars = vars->next) {
-	if (FL_TEST(vars, DVAR_DONT_RECYCLE)) break;
-	FL_SET(vars, DVAR_DONT_RECYCLE);
-    }
-    th_save = th;
-    if (THREAD_SAVE_CONTEXT(th)) {
-	return th_save->result;
-    }
-    else {
-	return rb_yield(cont);
-    }
+    rb_thread_t th = prep4callcc();
+    return THREAD_SAVE_CONTEXT(th) ?
+      th->result
+          :
+      rb_yield(Data_Wrap_Struct(rb_cCont, cc_mark, thread_free, th));
 }
 
+
 /*
  *  call-seq:
  *     cont.call(args, ...) 
diff -rux '*.o' ruby-1.8.7-p72/version.h ruby-1.8.7-mbari/version.h
--- ruby-1.8.7-p72/version.h	2008-12-16 00:47:26.000000000 -0800
+++ ruby-1.8.7-mbari/version.h	2008-12-16 20:02:42.000000000 -0800
@@ -1,7 +1,7 @@
 #define RUBY_VERSION "1.8.7"
-#define RUBY_RELEASE_DATE "2008-12-13"
+#define RUBY_RELEASE_DATE "2008-12-16"
 #define RUBY_VERSION_CODE 187
-#define RUBY_RELEASE_CODE 20081213
+#define RUBY_RELEASE_CODE 20081216
 #define RUBY_PATCHLEVEL 72
 
 #define RUBY_VERSION_MAJOR 1
@@ -9,7 +9,7 @@
 #define RUBY_VERSION_TEENY 7
 #define RUBY_RELEASE_YEAR 2008
 #define RUBY_RELEASE_MONTH 12
-#define RUBY_RELEASE_DAY 13
+#define RUBY_RELEASE_DAY 16
 
 #ifdef RUBY_EXTERN
 RUBY_EXTERN const char ruby_version[];
@@ -25,7 +25,7 @@
 #define RUBY_BIRTH_MONTH 2
 #define RUBY_BIRTH_DAY 24
 
-#define RUBY_RELEASE_STR "MBARI 3 on patchlevel"
+#define RUBY_RELEASE_STR "MBARI 4 on patchlevel"
 #define RUBY_RELEASE_NUM RUBY_PATCHLEVEL
 
 
patches/ruby/1.8.7/p72/mbari7.patch000066400000122657147511530510012462 0ustar00diff -ru ruby-1.8.7-p72/ChangeLog ruby-1.8.7-mbari/ChangeLog
--- ruby-1.8.7-p72/ChangeLog	2009-02-09 21:21:30.000000000 -0800
+++ ruby-1.8.7-mbari/ChangeLog	2009-02-09 20:24:44.000000000 -0800
@@ -1,3 +1,126 @@
+Mon Feb 09 00:01:19 2009  Brent Roman  <brent@mbari.org>
+
+        * rubysig.h:  default values for STACK_WIPE_SITES if x86_64
+                      cast builtin_alloca result to (VALUE *)
+        
+        * gc.c:  don't use builtin-frame-address at all
+        
+        * version.h:  bumped date
+
+Sun Feb 08 00:01:19 2009  Brent Roman  <brent@mbari.org>
+
+        * rubysig.h:  changed default values for STACK_WIPE_SITES
+        
+        * gc.c:  don't trust config's USE_BUILTIN_FRAME_ADDRESS
+        
+        * version.h:  bumped date
+
+
+Thu Jan 23 00:01:19 2009  Brent Roman  <brent@mbari.org>
+
+        * rubysig.h:  remapped wipe methods to avoid values > 9
+                      added cases for __ppc64__ and __x86_64__
+        
+        * missing/alloca.c:  made 64-bit clean
+        
+        * version.h:  bumped date
+        
+        
+Sun Jan 18 20:15:36 2009  Brent Roman  <brent@mbari.org>
+
+        * rubysig.h:  added support for STACK_WIPE_METHOD==5 (x86 asm)
+
+        * gc.c:       allow another STACK_WIPE_METHOD
+
+        * version.h:  bumped date
+
+
+Sat Jan 17 20:15:36 2009  Brent Roman  <brent@mbari.org>
+
+        * gc.c:     use separate gc stack so it never need be wiped
+
+        * version.h:  bumped date
+
+
+Fri Jan 16 20:15:36 2009  Brent Roman  <brent@mbari.org>
+
+        * gc.c:     added GC_STACK_PAD, renamed stack_gc_limit->gc_stack_limit
+                    optionally wipe the entire GC stack after each gc pass
+        
+        * rubysig.h:  default STACK_WIPE_SITES changed to 0x4770
+        
+        * version.h:  bumped date
+
+
+Wed Jan 14 20:15:36 2009  Brent Roman  <brent@mbari.org>
+
+        * eval.c:     declare wipe_after with gnu always_inline attribute
+        
+        * rubysig.h:  use alloca(0) to get sp for all CPU except PowerPC
+                      (less likely to trash stack when clearing it)
+        
+        * version.h:  bumped date
+
+
+Sun Jan 13 20:15:36 2009  Brent Roman  <brent@mbari.org>
+
+        * rubysig.h:  moved #defs to configure alloca here from gc.c
+                      added missing # to #else
+        
+        * gc.c: removed #defs to configurure alloca
+                set_stack_size must handle signed rlim_t for Darwin & BSD Unix
+                
+        * version.h:  bumped date
+
+
+Sun Jan 11 20:15:36 2009  Brent Roman  <brent@mbari.org>
+
+        * rubysig.h:  added support for multiple STACK_WIPE_METHODs
+                      added __stack_depth()
+                      added 2nd param to stack_past()
+                      __sp() returns stack pointer in an efficent, portable way                     
+        
+        * gc.c: STACK_END uses __sp()
+                STACK_UPPER now takes only two parameters
+                added rb_gc_wipe_stack()               
+                rb_mark_tbl() and mark_hash() implemented as #define macros
+                added STACK_END parameters to __stack_past() invocations
+                exploited missed opportunities for tail recursion in markchilren
+                
+        * version.h:  bumped date
+
+
+Mon Jan  5 20:15:36 2009  Brent Roman  <brent@mbari.org>
+
+        * common.mk:  added dependency on rubysig.h to version.h     
+        
+        * eval.c:  added wipeAfter and STACK_WIPE_SITES cofiguration options
+        
+        * gc.c: added STACK_WIPE_SITES cofiguration options
+                added GC.exorcise method
+        
+        * rubysig.h:  added STACK_WIPE_SITES cofiguration options
+                      when available, use gcc asm to optimize wipe_stack
+        
+        * version.h:  include STACK_WIPE_SITES options in MBARI release string
+
+        
+Sun Jan  4 20:15:36 2009  Brent Roman  <brent@mbari.org>
+
+        * eval.c:  eliminated up_stk_extent(), wipe_stack in rb_thread_switch
+        
+        * gc.c: removed lev counter args, check stack pointer instead
+                streamlined SET_STACK_END and STACK_END, stack_length(), etc.
+                added TOP_FRAME to use gcc's builtin frame_address
+                optimized is_heap_pointer()
+                gc_mark_rest() does not need to copy entire mark_stack!
+                added set_stack_size() to properly hande RLIM_INFINITY
+                
+        * rubysig.h:  repaired broken pseudo preemptive thread switching
+                      removed rb_gc_malloc_increase & limit
+                      replaced buggy __stack_grown* with __stack_past* macros
+        
+
 Tue Dec 19 20:15:36 2008  Brent Roman  <brent@mbari.org>
 
         * eval.c:  added (Method|Proc)#(__line__|__file__) methods
diff -ru ruby-1.8.7-p72/common.mk ruby-1.8.7-mbari/common.mk
--- ruby-1.8.7-p72/common.mk	2008-08-03 22:05:38.000000000 -0700
+++ ruby-1.8.7-mbari/common.mk	2009-01-05 01:18:37.000000000 -0800
@@ -462,7 +462,7 @@
   {$(VPATH)}env.h {$(VPATH)}node.h {$(VPATH)}st.h {$(VPATH)}util.h
 version.$(OBJEXT): {$(VPATH)}version.c {$(VPATH)}ruby.h config.h \
   {$(VPATH)}defines.h {$(VPATH)}intern.h {$(VPATH)}missing.h \
-  {$(VPATH)}version.h
+  {$(VPATH)}rubysig.h {$(VPATH)}version.h
 
 dist: $(PROGRAM)
 	$(RUNRUBY) $(srcdir)/distruby.rb
diff -ru ruby-1.8.7-p72/eval.c ruby-1.8.7-mbari/eval.c
--- ruby-1.8.7-p72/eval.c	2009-02-09 21:21:30.000000000 -0800
+++ ruby-1.8.7-mbari/eval.c	2009-01-22 02:54:08.000000000 -0800
@@ -3,7 +3,7 @@
   eval.c -
 
   $Author: brent $
-  $Date: 2008/12/20 07:47:22 $
+  $Date: 2009/01/15 07:41:46 $
   created at: Thu Jun 10 14:22:17 JST 1993
 
   Copyright (C) 1993-2003 Yukihiro Matsumoto
@@ -1028,14 +1028,26 @@
 #define PROT_LAMBDA INT2FIX(2)	/* 5 */
 #define PROT_YIELD  INT2FIX(3)	/* 7 */
 
-#define EXEC_TAG()    ruby_setjmp(((void)0), prot_tag->buf)
-
-static inline 
-int up_stk_extent(int status)
+#if STACK_WIPE_SITES & 0x42
+#ifdef __GNUC__
+static inline int wipeAfter(int) __attribute__((always_inline));
+#endif
+static inline int wipeAfter(int status)
 {
-  rb_gc_update_stack_extent();
+  rb_gc_wipe_stack();
   return status;
 }
+#else
+#define wipeAfter(status) status
+#endif
+#if STACK_WIPE_SITES & 2
+#define wipeAfterTag(status) wipeAfter(status)
+#else
+#define wipeAfterTag(status) status
+#endif
+
+#define EXEC_TAG_0()  ruby_setjmp(((void)0), prot_tag->buf)
+#define EXEC_TAG()    wipeAfterTag(EXEC_TAG_0())
 
 #define JUMP_TAG(st) do {		\
     ruby_frame = prot_tag->frame;	\
@@ -1116,6 +1128,12 @@
 
 static VALUE rb_yield_0 _((VALUE, VALUE, VALUE, int, int));
 
+#if STACK_WIPE_SITES & 0x20
+#define wipeBeforeYield()  rb_gc_wipe_stack()
+#else
+#define wipeBeforeYield()  (void)0
+#endif
+
 #define YIELD_LAMBDA_CALL 1
 #define YIELD_PROC_CALL   2
 #define YIELD_PUBLIC_DEF  4
@@ -3079,6 +3097,9 @@
 	  goto while_out;
       do {
 	while_redo:
+#if STACK_WIPE_SITES & 0x10
+          rb_gc_wipe_stack();
+#endif
 	  rb_eval(self, node->nd_body);
 	while_next:
 	  ;
@@ -3121,6 +3142,9 @@
 	  goto until_out;
       do {
         until_redo:
+#if STACK_WIPE_SITES & 0x10
+          rb_gc_wipe_stack();
+#endif
 	  rb_eval(self, node->nd_body);
         until_next:
 	  ;
@@ -5347,6 +5371,7 @@
 rb_yield(val)
     VALUE val;
 {
+    wipeBeforeYield();
     return rb_yield_0(val, 0, 0, 0, Qfalse);
 }
 
@@ -5395,6 +5420,7 @@
 loop_i()
 {
     for (;;) {
+        wipeBeforeYield();
 	rb_yield_0(Qundef, 0, 0, 0, Qfalse);
 	CHECK_INTS;
     }
@@ -10949,6 +10975,9 @@
 rb_thread_switch(n)
     int n;
 {
+#if STACK_WIPE_SITES & 1
+    rb_gc_wipe_stack();
+#endif
     rb_trap_immediate = (curr_thread->flags&0x100)?1:0;
     switch (n) {
       case 0:
@@ -10985,7 +11014,7 @@
     return 1;
 }
 
-#define THREAD_SAVE_CONTEXT(th) (rb_thread_switch(up_stk_extent( \
+#define THREAD_SAVE_CONTEXT(th) (rb_thread_switch( wipeAfter(\
                   ruby_setjmp(rb_thread_save_context(th), (th)->context))))
 
 NORETURN(static void rb_thread_restore_context _((rb_thread_t,int)));
@@ -13911,7 +13940,7 @@
 
     tag = ID2SYM(rb_to_id(tag));
     PUSH_TAG(tag);
-    if ((state = EXEC_TAG()) == 0) {
+    if ((state = wipeAfter(EXEC_TAG_0())) == 0) {
 	val = rb_yield_0(tag, 0, 0, 0, Qfalse);
     }
     else if (state == TAG_THROW && tag == prot_tag->dst) {
@@ -13979,6 +14008,9 @@
     if (!tt) {
 	rb_name_error(SYM2ID(tag), "uncaught throw `%s'", rb_id2name(SYM2ID(tag)));
     }
+#if STACK_WIPE_SITES & 0x800
+    rb_gc_update_stack_extent();
+#endif
     rb_trap_restore_mask();
     JUMP_TAG(TAG_THROW);
 #ifndef __GNUC__
diff -ru ruby-1.8.7-p72/gc.c ruby-1.8.7-mbari/gc.c
--- ruby-1.8.7-p72/gc.c	2009-02-09 21:21:30.000000000 -0800
+++ ruby-1.8.7-mbari/gc.c	2009-02-09 20:24:44.000000000 -0800
@@ -3,7 +3,7 @@
   gc.c -
 
   $Author: brent $
-  $Date: 2008/12/18 07:43:46 $
+  $Date: 2009/02/09 20:45:03 $
   created at: Tue Oct  5 09:44:46 JST 1993
 
   Copyright (C) 1993-2003 Yukihiro Matsumoto
@@ -22,10 +22,6 @@
 #include <setjmp.h>
 #include <sys/types.h>
 
-#ifdef HAVE_SYS_TIME_H
-#include <sys/time.h>
-#endif
-
 #ifdef HAVE_SYS_RESOURCE_H
 #include <sys/resource.h>
 #endif
@@ -43,25 +39,6 @@
 int _setjmp(), _longjmp();
 #endif
 
-/* Make alloca work the best possible way.  */
-#ifdef __GNUC__
-# ifndef atarist
-#  ifndef alloca
-#   define alloca __builtin_alloca
-#  endif
-# endif /* atarist */
-#else
-# ifdef HAVE_ALLOCA_H
-#  include <alloca.h>
-# else
-#  ifndef _AIX
-#   ifndef alloca /* predefined by HP cc +Olibcalls */
-void *alloca ();
-#   endif
-#  endif /* AIX */
-# endif /* HAVE_ALLOCA_H */
-#endif /* __GNUC__ */
-
 #ifndef GC_MALLOC_LIMIT
 #if defined(MSDOS) || defined(__human68k__)
 #define GC_MALLOC_LIMIT 200000
@@ -70,11 +47,18 @@
 #endif
 #endif
 
+#ifndef GC_LEVEL_MAX  /*maximum # of VALUEs on 'C' stack during GC*/
+#define GC_LEVEL_MAX  8000
+#endif
+#ifndef GC_STACK_PAD
+#define GC_STACK_PAD  200  /* extra padding VALUEs for GC stack */
+#endif
+#define GC_STACK_MAX  (GC_LEVEL_MAX+GC_STACK_PAD)
 
-size_t rb_gc_malloc_increase = 0;
-#define malloc_increase rb_gc_malloc_increase
-static unsigned long malloc_limit = GC_MALLOC_LIMIT;
-size_t rb_gc_malloc_limit = GC_MALLOC_LIMIT-GC_MALLOC_LIMIT/8;
+static VALUE *stack_limit, *gc_stack_limit;
+
+static size_t malloc_increase = 0;
+static size_t malloc_limit = GC_MALLOC_LIMIT;
 
 /*
  *  call-seq:
@@ -108,7 +92,6 @@
   long limit = NUM2LONG(newLimit);
   if (limit < 0) return gc_getlimit(mod);
   malloc_limit = limit;
-  rb_gc_malloc_limit = malloc_limit - malloc_limit/8;
   return newLimit;
 }
 
@@ -126,6 +109,20 @@
 }
 
 
+/*
+ *  call-seq:
+ *     GC.exorcise
+ *
+ *  Purge ghost references from recently freed stack space
+ *
+ */
+static VALUE gc_exorcise(VALUE mod)
+{
+  rb_gc_wipe_stack();
+  return Qnil;
+}
+
+
 static void run_final();
 static VALUE nomem_error;
 static void garbage_collect();
@@ -174,7 +171,9 @@
 	    rb_memerror();
 	}
     }
+#if STACK_WIPE_SITES & 0x100
     rb_gc_update_stack_extent();
+#endif
     return mem;
 }
 
@@ -214,7 +213,9 @@
 	    rb_memerror();
         }
     }
+#if STACK_WIPE_SITES & 0x200
     rb_gc_update_stack_extent();
+#endif
     return mem;
 }
 
@@ -509,38 +510,32 @@
 # define STACK_LEVEL_MAX 655300
 #endif
 
-#ifdef C_ALLOCA
-# define SET_STACK_END VALUE stack_end; alloca(0);
+#ifndef nativeAllocA
+  /* portable way to return an approximate stack pointer */
+VALUE *__sp(void) {
+  VALUE tos;
+  return &tos;
+}
+# define SET_STACK_END VALUE stack_end
 # define STACK_END (&stack_end)
 #else
-# if defined(__GNUC__) && defined(USE_BUILTIN_FRAME_ADDRESS) && !defined(__ia64)
-#  if ( __GNUC__ == 3 && __GNUC_MINOR__ > 0 ) || __GNUC__ > 3
-__attribute__ ((noinline))
-#  endif
-static void
-stack_end_address(VALUE **stack_end_p)
-{
-    VALUE stack_end;
-    *stack_end_p = &stack_end;
-}
-#  define  SET_STACK_END    VALUE *stack_end; stack_end_address(&stack_end)
-# else
-#  define  SET_STACK_END    VALUE *stack_end = alloca(1)
-# endif
-# define STACK_END (stack_end)
+# define SET_STACK_END ((void)0)
+# define STACK_END __sp()
 #endif
+
 #if STACK_GROW_DIRECTION < 0
 # define STACK_LENGTH(start)  ((start) - STACK_END)
 #elif STACK_GROW_DIRECTION > 0
 # define STACK_LENGTH(start)  (STACK_END - (start) + 1)
 #else
-# define STACK_LENGTH(start)  ((STACK_END < (start)) ? (start) - STACK_END\
-                                           : STACK_END - (start) + 1)
+# define STACK_LENGTH(start)  ((STACK_END < (start)) ? \
+                                 (start) - STACK_END : STACK_END - (start) + 1)
 #endif
+
 #if STACK_GROW_DIRECTION > 0
-# define STACK_UPPER(x, a, b) a
+# define STACK_UPPER(a, b) a
 #elif STACK_GROW_DIRECTION < 0
-# define STACK_UPPER(x, a, b) b
+# define STACK_UPPER(a, b) b
 #else
 int rb_gc_stack_grow_direction;
 static int
@@ -550,33 +545,54 @@
     SET_STACK_END;
     return rb_gc_stack_grow_direction = STACK_END > addr ? 1 : -1;
 }
-# define STACK_UPPER(x, a, b) (rb_gc_stack_grow_direction > 0 ? a : b)
+# define STACK_UPPER(a, b) (rb_gc_stack_grow_direction > 0 ? a : b)
 #endif
 
-#define GC_WATER_MARK 512
-
-#define CHECK_STACK(ret) do {\
-    SET_STACK_END;\
-    (ret) = (STACK_LENGTH(rb_gc_stack_start) > STACK_LEVEL_MAX + GC_WATER_MARK);\
-} while (0)
-
 int
 ruby_stack_length(start, base)
     VALUE *start, **base;
 {
     SET_STACK_END;
-    if (base) *base = STACK_UPPER(STACK_END, start, STACK_END);
+    if (base) *base = STACK_UPPER(start, STACK_END);
     return STACK_LENGTH(start);
 }
 
 int
 ruby_stack_check()
 {
-    int ret;
+    SET_STACK_END;
+    return __stack_past(stack_limit, STACK_END);
+}
 
-    CHECK_STACK(ret);
-    return ret;
+/*
+  Zero memory that was (recently) part of the stack, but is no longer.
+  Invoke when stack is deep to mark its extent and when it's shallow to wipe it.
+*/
+#if STACK_WIPE_METHOD != 4
+#if STACK_WIPE_METHOD
+void rb_gc_wipe_stack(void)
+{
+  VALUE *stack_end = rb_gc_stack_end;
+  VALUE *sp = __sp();
+  rb_gc_stack_end = sp;
+#if STACK_WIPE_METHOD == 1
+#warning clearing of "ghost references" from the call stack has been disabled
+#elif STACK_WIPE_METHOD == 2  /* alloca ghost stack before clearing it */
+  if (__stack_past(sp, stack_end)) {
+    size_t bytes = __stack_depth((char *)stack_end, (char *)sp);
+    STACK_UPPER(sp = nativeAllocA(bytes), stack_end = nativeAllocA(bytes));
+    __stack_zero(stack_end, sp);
+  }
+#elif STACK_WIPE_METHOD == 3    /* clear unallocated area past stack pointer */
+  __stack_zero(stack_end, sp);  /* will crash if compiler pushes a temp. here */
+#else
+#error unsupported method of clearing ghost references from the stack
+#endif
 }
+#else
+#warning clearing of "ghost references" from the call stack completely disabled
+#endif
+#endif
 
 #define MARK_STACK_MAX 1024
 static VALUE mark_stack[MARK_STACK_MAX];
@@ -592,6 +608,17 @@
 
 #define MARK_STACK_EMPTY (mark_stack_ptr == mark_stack)
 
+static inline void
+push_mark_stack(VALUE ptr)
+{
+    if (!mark_stack_overflow) {
+	if (mark_stack_ptr - mark_stack < MARK_STACK_MAX)
+	    *mark_stack_ptr++ = ptr;
+	else
+	    mark_stack_overflow = 1;
+    }
+}
+    
 static st_table *source_filenames;
 
 char *
@@ -635,22 +662,22 @@
     }
 }
 
-static void gc_mark _((VALUE ptr, int lev));
-static void gc_mark_children _((VALUE ptr, int lev));
+#define gc_mark(ptr) rb_gc_mark(ptr)
+static void gc_mark_children _((VALUE ptr));
 
 static void
 gc_mark_all()
 {
     RVALUE *p, *pend;
-    int i;
+    struct heaps_slot *heap = heaps+heaps_used;
 
     init_mark_stack();
-    for (i = 0; i < heaps_used; i++) {
-	p = heaps[i].slot; pend = p + heaps[i].limit;
+    while (--heap >= heaps) {
+	p = heap->slot; pend = p + heap->limit;
 	while (p < pend) {
 	    if ((p->as.basic.flags & FL_MARK) &&
 		(p->as.basic.flags != FL_MARK)) {
-		gc_mark_children((VALUE)p, 0);
+		gc_mark_children((VALUE)p);
 	    }
 	    p++;
 	}
@@ -660,169 +687,129 @@
 static void
 gc_mark_rest()
 {
+    size_t stackLen = mark_stack_ptr - mark_stack;
+#ifdef nativeAllocA
+    VALUE *tmp_arry = nativeAllocA(stackLen*sizeof(VALUE));
+#else
     VALUE tmp_arry[MARK_STACK_MAX];
-    VALUE *p;
-
-    p = (mark_stack_ptr - mark_stack) + tmp_arry;
-    MEMCPY(tmp_arry, mark_stack, VALUE, MARK_STACK_MAX);
+#endif
+    VALUE *p = tmp_arry + stackLen;
+    
+    MEMCPY(tmp_arry, mark_stack, VALUE, stackLen);
 
     init_mark_stack();
-    while(p != tmp_arry){
-	p--;
-	gc_mark_children(*p, 0);
-    }
+    while(--p >= tmp_arry) gc_mark_children(*p);
 }
 
 static inline int
 is_pointer_to_heap(ptr)
     void *ptr;
 {
-    register RVALUE *p = RANY(ptr);
-    register RVALUE *heap_org;
-    register long i;
+    RVALUE *p = RANY(ptr);
+    struct heaps_slot *heap;
 
-    if (p < lomem || p > himem) return Qfalse;
-    if ((VALUE)p % sizeof(RVALUE) != 0) return Qfalse;
+    if (p < lomem || p > himem || (VALUE)p % sizeof(RVALUE)) return Qfalse;
 
     /* check if p looks like a pointer */
-    for (i=0; i < heaps_used; i++) {
-	heap_org = heaps[i].slot;
-	if (heap_org <= p && p < heap_org + heaps[i].limit)
-	    return Qtrue;
-    }
+    heap = heaps+heaps_used;
+    while (--heap >= heaps) 
+      if (p >= heap->slot && p < heap->slot + heap->limit)
+        return Qtrue;
     return Qfalse;
 }
 
 static void
 mark_locations_array(x, n)
-    register VALUE *x;
-    register long n;
+    VALUE *x;
+    size_t n;
 {
     VALUE v;
     while (n--) {
         v = *x;
 	if (is_pointer_to_heap((void *)v)) {
-	    gc_mark(v, 0);
+	    gc_mark(v);
 	}
 	x++;
     }
 }
 
-void
+void inline
 rb_gc_mark_locations(start, end)
     VALUE *start, *end;
 {
-    long n;
-
-    n = end - start;
-    mark_locations_array(start,n);
+    mark_locations_array(start,end - start);
 }
 
 static int
-mark_entry(key, value, lev)
+mark_entry(key, value)
     ID key;
     VALUE value;
-    int lev;
 {
-    gc_mark(value, lev);
+    gc_mark(value);
     return ST_CONTINUE;
 }
 
-static void
-mark_tbl(tbl, lev)
-    st_table *tbl;
-    int lev;
-{
-    if (!tbl) return;
-    st_foreach(tbl, mark_entry, lev);
-}
-
 void
 rb_mark_tbl(tbl)
     st_table *tbl;
 {
-    mark_tbl(tbl, 0);
+    if (!tbl) return;
+    st_foreach(tbl, mark_entry, 0);
 }
+#define mark_tbl(tbl)  rb_mark_tbl(tbl)
 
 static int
-mark_keyvalue(key, value, lev)
+mark_keyvalue(key, value)
     VALUE key;
     VALUE value;
-    int lev;
 {
-    gc_mark(key, lev);
-    gc_mark(value, lev);
+    gc_mark(key);
+    gc_mark(value);
     return ST_CONTINUE;
 }
 
-static void
-mark_hash(tbl, lev)
-    st_table *tbl;
-    int lev;
-{
-    if (!tbl) return;
-    st_foreach(tbl, mark_keyvalue, lev);
-}
-
 void
 rb_mark_hash(tbl)
     st_table *tbl;
 {
-    mark_hash(tbl, 0);
+    if (!tbl) return;
+    st_foreach(tbl, mark_keyvalue, 0);
 }
+#define mark_hash(tbl)  rb_mark_hash(tbl)
 
 void
 rb_gc_mark_maybe(obj)
     VALUE obj;
 {
     if (is_pointer_to_heap((void *)obj)) {
-	gc_mark(obj, 0);
+	gc_mark(obj);
     }
 }
 
-#define GC_LEVEL_MAX 250
-
-static void
-gc_mark(ptr, lev)
+void
+rb_gc_mark(ptr)
     VALUE ptr;
-    int lev;
 {
-    register RVALUE *obj;
-
-    obj = RANY(ptr);
+    RVALUE *obj = RANY(ptr);
+    SET_STACK_END;
+    
     if (rb_special_const_p(ptr)) return; /* special const not marked */
     if (obj->as.basic.flags == 0) return;       /* free cell */
     if (obj->as.basic.flags & FL_MARK) return;  /* already marked */
     obj->as.basic.flags |= FL_MARK;
 
-    if (lev > GC_LEVEL_MAX || (lev == 0 && ruby_stack_check())) {
-	if (!mark_stack_overflow) {
-	    if (mark_stack_ptr - mark_stack < MARK_STACK_MAX) {
-		*mark_stack_ptr = ptr;
-		mark_stack_ptr++;
-	    }
-	    else {
-		mark_stack_overflow = 1;
-	    }
-	}
-	return;
+    if (__stack_past(gc_stack_limit, STACK_END))
+      push_mark_stack(ptr);
+    else{
+      gc_mark_children(ptr);
     }
-    gc_mark_children(ptr, lev+1);
-}
-
-void
-rb_gc_mark(ptr)
-    VALUE ptr;
-{
-    gc_mark(ptr, 0);
 }
 
 static void
-gc_mark_children(ptr, lev)
+gc_mark_children(ptr)
     VALUE ptr;
-    int lev;
 {
-    register RVALUE *obj = RANY(ptr);
+    RVALUE *obj = RANY(ptr);
 
     goto marking;		/* skip */
 
@@ -856,7 +843,7 @@
 	  case NODE_RESCUE:
 	  case NODE_RESBODY:
 	  case NODE_CLASS:
-	    gc_mark((VALUE)obj->as.node.u2.node, lev);
+	    gc_mark((VALUE)obj->as.node.u2.node);
 	    /* fall through */
 	  case NODE_BLOCK:	/* 1,3 */
 	  case NODE_ARRAY:
@@ -869,7 +856,7 @@
 	  case NODE_CALL:
 	  case NODE_DEFS:
 	  case NODE_OP_ASGN1:
-	    gc_mark((VALUE)obj->as.node.u1.node, lev);
+	    gc_mark((VALUE)obj->as.node.u1.node);
 	    /* fall through */
 	  case NODE_SUPER:	/* 3 */
 	  case NODE_FCALL:
@@ -896,7 +883,7 @@
 	  case NODE_ALIAS:
 	  case NODE_VALIAS:
 	  case NODE_ARGS:
-	    gc_mark((VALUE)obj->as.node.u1.node, lev);
+	    gc_mark((VALUE)obj->as.node.u1.node);
 	    /* fall through */
 	  case NODE_METHOD:	/* 2 */
 	  case NODE_NOT:
@@ -934,7 +921,7 @@
 	  case NODE_SCOPE:	/* 2,3 */
 	  case NODE_BLOCK_PASS:
 	  case NODE_CDECL:
-	    gc_mark((VALUE)obj->as.node.u3.node, lev);
+	    gc_mark((VALUE)obj->as.node.u3.node);
 	    ptr = (VALUE)obj->as.node.u2.node;
 	    goto again;
 
@@ -967,25 +954,26 @@
 
 	  default:		/* unlisted NODE */
 	    if (is_pointer_to_heap(obj->as.node.u1.node)) {
-		gc_mark((VALUE)obj->as.node.u1.node, lev);
+		gc_mark((VALUE)obj->as.node.u1.node);
 	    }
 	    if (is_pointer_to_heap(obj->as.node.u2.node)) {
-		gc_mark((VALUE)obj->as.node.u2.node, lev);
+		gc_mark((VALUE)obj->as.node.u2.node);
 	    }
 	    if (is_pointer_to_heap(obj->as.node.u3.node)) {
-		gc_mark((VALUE)obj->as.node.u3.node, lev);
+                ptr = (VALUE)obj->as.node.u3.node;
+                goto again;
 	    }
 	}
-	return;			/* no need to mark class. */
+        return;	/* no need to mark class. */
     }
 
-    gc_mark(obj->as.basic.klass, lev);
+    gc_mark(obj->as.basic.klass);
     switch (obj->as.basic.flags & T_MASK) {
       case T_ICLASS:
       case T_CLASS:
       case T_MODULE:
-	mark_tbl(obj->as.klass.m_tbl, lev);
-	mark_tbl(obj->as.klass.iv_tbl, lev);
+	mark_tbl(obj->as.klass.m_tbl);
+	mark_tbl(obj->as.klass.iv_tbl);
 	ptr = obj->as.klass.super;
 	goto again;
 
@@ -995,17 +983,16 @@
 	    goto again;
 	}
 	else {
-	    long i, len = obj->as.array.len;
 	    VALUE *ptr = obj->as.array.ptr;
-
-	    for (i=0; i < len; i++) {
-		gc_mark(*ptr++, lev);
+            VALUE *pend = ptr + obj->as.array.len;
+	    while (ptr < pend) {
+		gc_mark(*ptr++);
 	    }
 	}
 	break;
 
       case T_HASH:
-	mark_hash(obj->as.hash.tbl, lev);
+	mark_hash(obj->as.hash.tbl);
 	ptr = obj->as.hash.ifnone;
 	goto again;
 
@@ -1022,7 +1009,7 @@
 	break;
 
       case T_OBJECT:
-	mark_tbl(obj->as.object.iv_tbl, lev);
+	mark_tbl(obj->as.object.iv_tbl);
 	break;
 
       case T_FILE:
@@ -1040,7 +1027,7 @@
 	break;
 
       case T_VARMAP:
-	gc_mark(obj->as.varmap.val, lev);
+	gc_mark(obj->as.varmap.val);
 	ptr = (VALUE)obj->as.varmap.next;
 	goto again;
 
@@ -1050,19 +1037,17 @@
 	    VALUE *vars = &obj->as.scope.local_vars[-1];
 
 	    while (n--) {
-		gc_mark(*vars++, lev);
+		gc_mark(*vars++);
 	    }
 	}
 	break;
 
       case T_STRUCT:
 	{
-	    long len = obj->as.rstruct.len;
 	    VALUE *ptr = obj->as.rstruct.ptr;
-
-	    while (len--) {
-		gc_mark(*ptr++, lev);
-	    }
+            VALUE *pend = ptr + obj->as.rstruct.len;
+            while (ptr < pend)
+	       gc_mark(*ptr++);
 	}
 	break;
 
@@ -1134,7 +1119,7 @@
 	    p = heaps[i].slot; pend = p + heaps[i].limit;
 	    while (p < pend) {
 		if (!(p->as.basic.flags&FL_MARK) && BUILTIN_TYPE(p) == T_NODE)
-		    gc_mark((VALUE)p, 0);
+		    gc_mark((VALUE)p);
 		p++;
 	    }
 	}
@@ -1346,7 +1331,7 @@
 rb_gc_mark_frame(frame)
     struct FRAME *frame;
 {
-    gc_mark((VALUE)frame->node, 0);
+    gc_mark((VALUE)frame->node);
 }
 
 #ifdef __GNUC__
@@ -1384,8 +1369,10 @@
 #endif /* __human68k__ or DJGPP */
 #endif /* __GNUC__ */
 
+
+
 static void
-garbage_collect()
+garbage_collect_0(VALUE *top_frame)
 {
     struct gc_list *list;
     struct FRAME * frame;
@@ -1406,9 +1393,10 @@
     if (during_gc) return;
     during_gc++;
 
+    gc_stack_limit = __stack_grow(STACK_END, GC_LEVEL_MAX);
     init_mark_stack();
 
-    gc_mark((VALUE)ruby_current_node, 0);
+    gc_mark((VALUE)ruby_current_node);
 
     /* mark frame stack */
     for (frame = ruby_frame; frame; frame = frame->prev) {
@@ -1421,10 +1409,10 @@
 	    }
 	}
     }
-    gc_mark((VALUE)ruby_scope, 0);
-    gc_mark((VALUE)ruby_dyna_vars, 0);
+    gc_mark((VALUE)ruby_scope);
+    gc_mark((VALUE)ruby_dyna_vars);
     if (finalizer_table) {
-	mark_tbl(finalizer_table, 0);
+	mark_tbl(finalizer_table);
     }
 
     FLUSH_REGISTER_WINDOWS;
@@ -1432,14 +1420,14 @@
     rb_setjmp(save_regs_gc_mark);
     mark_locations_array((VALUE*)save_regs_gc_mark, sizeof(save_regs_gc_mark) / sizeof(VALUE *));
 #if STACK_GROW_DIRECTION < 0
-    rb_gc_mark_locations((VALUE*)STACK_END, rb_gc_stack_start);
+    rb_gc_mark_locations(top_frame, rb_gc_stack_start);
 #elif STACK_GROW_DIRECTION > 0
-    rb_gc_mark_locations(rb_gc_stack_start, (VALUE*)STACK_END + 1);
+    rb_gc_mark_locations(rb_gc_stack_start, top_frame + 1);
 #else
     if (rb_gc_stack_grow_direction < 0)
-	rb_gc_mark_locations((VALUE*)STACK_END, rb_gc_stack_start);
+	rb_gc_mark_locations(top_frame, rb_gc_stack_start);
     else
-	rb_gc_mark_locations(rb_gc_stack_start, (VALUE*)STACK_END + 1);
+	rb_gc_mark_locations(rb_gc_stack_start, top_frame + 1);
 #endif
 #ifdef __ia64
     /* mark backing store (flushed register window on the stack) */
@@ -1479,10 +1467,35 @@
 	}
 	rb_gc_abort_threads();
     } while (!MARK_STACK_EMPTY);
-
     gc_sweep();
 }
 
+static void
+garbage_collect()
+{
+  VALUE *top = __sp();
+#if STACK_WIPE_SITES & 0x400
+# ifdef nativeAllocA
+  if (__stack_past (top, stack_limit)) {
+  /* allocate a large frame to ensure app stack cannot grow into GC stack */
+    volatile char *spacer = 
+                    nativeAllocA(__stack_depth((void*)stack_limit,(void*)top));
+  }  
+  garbage_collect_0(top);
+# else /* no native alloca() available */
+  garbage_collect_0(top);
+  {
+    VALUE *paddedLimit = __stack_grow(gc_stack_limit, GC_STACK_PAD);
+    if (__stack_past(rb_gc_stack_end, paddedLimit))
+      rb_gc_stack_end = paddedLimit;
+  }
+  rb_gc_wipe_stack();  /* wipe the whole stack area reserved for this gc */  
+# endif
+#else
+  garbage_collect_0(top);
+#endif
+}
+
 void
 rb_gc()
 {
@@ -1507,6 +1520,7 @@
     return Qnil;
 }
 
+
 void
 ruby_set_stack_size(size)
     size_t size;
@@ -1514,6 +1528,29 @@
 #ifndef STACK_LEVEL_MAX
     STACK_LEVEL_MAX = size / sizeof(VALUE);
 #endif
+    stack_limit = __stack_grow(rb_gc_stack_start, STACK_LEVEL_MAX-GC_STACK_MAX);
+}
+
+static void
+set_stack_size(void)
+{
+#ifdef HAVE_GETRLIMIT
+  struct rlimit rlim;
+  if (getrlimit(RLIMIT_STACK, &rlim) == 0) {
+    if (rlim.rlim_cur > 0 && rlim.rlim_cur != RLIM_INFINITY) {
+      size_t maxStackBytes = rlim.rlim_cur;
+      if (rlim.rlim_cur != maxStackBytes)
+        maxStackBytes = -1;
+      {
+        size_t space = maxStackBytes/5;
+        if (space > 1024*1024) space = 1024*1024;
+        ruby_set_stack_size(maxStackBytes - space);
+        return;
+      }
+    }
+  }
+#endif
+  ruby_set_stack_size(STACK_LEVEL_MAX*sizeof(VALUE));
 }
 
 void
@@ -1547,7 +1584,7 @@
     memset(&m, 0, sizeof(m));
     VirtualQuery(&m, &m, sizeof(m));
     rb_gc_stack_start =
-	STACK_UPPER((VALUE *)&m, (VALUE *)m.BaseAddress,
+	STACK_UPPER((VALUE *)m.BaseAddress,
 		    (VALUE *)((char *)m.BaseAddress + m.RegionSize) - 1);
 #elif defined(STACK_END_ADDRESS)
     {
@@ -1556,28 +1593,16 @@
     }
 #else
     if (!addr) addr = (void *)&addr;
-    STACK_UPPER(&addr, addr, ++addr);
+    STACK_UPPER(addr, ++addr);
     if (rb_gc_stack_start) {
-	if (STACK_UPPER(&addr,
-			rb_gc_stack_start > addr,
+	if (STACK_UPPER(rb_gc_stack_start > addr,
 			rb_gc_stack_start < addr))
 	    rb_gc_stack_start = addr;
 	return;
     }
     rb_gc_stack_start = addr;
 #endif
-#ifdef HAVE_GETRLIMIT
-    {
-	struct rlimit rlim;
-
-	if (getrlimit(RLIMIT_STACK, &rlim) == 0) {
-	    unsigned int space = rlim.rlim_cur/5;
-
-	    if (space > 1024*1024) space = 1024*1024;
-	    STACK_LEVEL_MAX = (rlim.rlim_cur - space) / sizeof(VALUE);
-	}
-    }
-#endif
+    set_stack_size();
 }
 
 void ruby_init_stack(VALUE *addr
@@ -1587,8 +1612,7 @@
     )
 {
     if (!rb_gc_stack_start ||
-        STACK_UPPER(&addr,
-                    rb_gc_stack_start > addr,
+        STACK_UPPER(rb_gc_stack_start > addr,
                     rb_gc_stack_start < addr)) {
         rb_gc_stack_start = addr;
     }
@@ -1599,16 +1623,7 @@
     }
 #endif
 #ifdef HAVE_GETRLIMIT
-    {
-        struct rlimit rlim;
-
-        if (getrlimit(RLIMIT_STACK, &rlim) == 0) {
-            unsigned int space = rlim.rlim_cur/5;
-
-            if (space > 1024*1024) space = 1024*1024;
-            STACK_LEVEL_MAX = (rlim.rlim_cur - space) / sizeof(VALUE);
-        }
-    }
+    set_stack_size();
 #elif defined _WIN32
     {
 	MEMORY_BASIC_INFORMATION mi;
@@ -1619,7 +1634,7 @@
 	    size = (char *)mi.BaseAddress - (char *)mi.AllocationBase;
 	    space = size / 5;
 	    if (space > 1024*1024) space = 1024*1024;
-	    STACK_LEVEL_MAX = (size - space) / sizeof(VALUE);
+	    ruby_set_stack_size(size - space);
 	}
     }
 #endif
@@ -2111,6 +2126,7 @@
     rb_define_singleton_method(rb_mGC, "limit", gc_getlimit, 0);
     rb_define_singleton_method(rb_mGC, "limit=", gc_setlimit, 1);
     rb_define_singleton_method(rb_mGC, "increase", gc_increase, 0);
+    rb_define_singleton_method(rb_mGC, "exorcise", gc_exorcise, 0);
     rb_define_method(rb_mGC, "garbage_collect", rb_gc_start, 0);
 
     rb_mObSpace = rb_define_module("ObjectSpace");
diff -ru ruby-1.8.7-p72/intern.h ruby-1.8.7-mbari/intern.h
--- ruby-1.8.7-p72/intern.h	2009-02-09 21:21:30.000000000 -0800
+++ ruby-1.8.7-mbari/intern.h	2008-12-23 21:54:37.000000000 -0800
@@ -2,8 +2,8 @@
 
   intern.h -
 
-  $Author: shyouhei $
-  $Date: 2008-07-07 12:29:28 +0900 (Mon, 07 Jul 2008) $
+  $Author: brent $
+  $Date: 2008/12/24 05:54:37 $
   created at: Thu Jun 10 14:22:17 JST 1993
 
   Copyright (C) 1993-2003 Yukihiro Matsumoto
diff -ru ruby-1.8.7-p72/missing/alloca.c ruby-1.8.7-mbari/missing/alloca.c
--- ruby-1.8.7-p72/missing/alloca.c	2007-02-12 15:01:19.000000000 -0800
+++ ruby-1.8.7-mbari/missing/alloca.c	2009-01-23 00:01:03.000000000 -0800
@@ -29,6 +29,7 @@
 static char	SCCSid[] = "@(#)alloca.c	1.1";	/* for the "what" utility */
 #endif
 
+#include <sys/types.h>
 #include "config.h"
 #ifdef emacs
 #ifdef static
@@ -44,11 +45,7 @@
 #endif /* static */
 #endif /* emacs */
 
-#ifdef X3J11
 typedef void	*pointer;		/* generic pointer type */
-#else
-typedef char	*pointer;		/* generic pointer type */
-#endif /* X3J11 */
 
 #define	NULL	0			/* null pointer constant */
 
@@ -140,8 +137,7 @@
 static header *last_alloca_header = NULL; /* -> last alloca header */
 
 pointer
-alloca (size)			/* returns pointer to storage */
-     unsigned	size;		/* # bytes to allocate */
+alloca (size_t size)		/* returns pointer to storage */
 {
   auto char	probe;		/* probes stack depth: */
   register char	*depth = &probe;
diff -ru ruby-1.8.7-p72/rubysig.h ruby-1.8.7-mbari/rubysig.h
--- ruby-1.8.7-p72/rubysig.h	2009-02-09 21:21:30.000000000 -0800
+++ ruby-1.8.7-mbari/rubysig.h	2009-02-09 20:55:50.000000000 -0800
@@ -3,7 +3,7 @@
   rubysig.h -
 
   $Author: brent $
-  $Date: 2008/12/14 07:24:10 $
+  $Date: 2009/02/09 20:45:48 $
   created at: Wed Aug 16 01:15:38 JST 1995
 
   Copyright (C) 1993-2003 Yukihiro Matsumoto
@@ -12,8 +12,75 @@
 
 #ifndef SIG_H
 #define SIG_H
+
 #include <errno.h>
 
+/* STACK_WIPE_SITES determines where attempts are made to exorcise
+   "ghost object refereces" from the stack and how the stack is cleared:
+   
+   0x*001 -->  wipe stack just after every thread_switch
+   0x*002 -->  wipe stack just after every EXEC_TAG()
+   0x*004 -->  wipe stack in CHECK_INTS
+   0x*010 -->  wipe stack in while & until loops
+   0x*020 -->  wipe stack before yield() in iterators and outside eval.c
+   0x*040 -->  wipe stack on catch and thread save context
+   0x*100 -->  update stack extent on each object allocation
+   0x*200 -->  update stack extent on each object reallocation
+   0x*400 -->  update stack extent during GC marking passes
+   0x*800 -->  update stack extent on each throw (use with 0x040)
+   0x1000 -->  use inline assembly code for x86, PowerPC, or ARM CPUs
+
+   0x0*** -->  do not even call rb_wipe_stack()
+   0x2*** -->  call dummy rb_wipe_stack() (for debugging and profiling)
+   0x4*** -->  safe, portable stack clearing in memory allocated with alloca
+   0x6*** -->  use faster, but less safe stack clearing in unallocated stack
+   0x8*** -->  use faster, but less safe stack clearing (with inline code)
+   
+   for most effective gc use 0x*707
+   for fastest micro-benchmarking use 0x0000
+   0x*770 prevents almost all memory leaks caused by ghost references
+   without adding much overhead for stack clearing.
+   Other good trade offs are 0x*270, 0x*703, 0x*303 or even 0x*03
+   
+   In general, you may lessen the default -mpreferred-stack-boundary
+   only if using less safe stack clearing (0x6***).  Lessening the
+   stack alignment with portable stack clearing (0x4***) may fail to clear 
+   all ghost references off the stack.
+   
+   When using 0x6*** or 0x8***, the compiler could insert 
+   stack push(s) between reading the stack pointer and clearing 
+   the ghost references.  The register(s) pushed will be
+   cleared by the rb_gc_stack_wipe(), typically resulting in a segfault
+   or an interpreter hang.
+   
+   STACK_WIPE_SITES of 0x8770 works well compiled with gcc on most machines
+   using the recommended CFLAGS="-O2 -fno-stack-protector".  However...
+   If it hangs or crashes for you, try changing STACK_WIPE_SITES to 0x4770
+   and please report your details.  i.e. CFLAGS, compiler, version, CPU
+   
+   Note that it is redundant to wipe_stack in looping constructs if 
+   also doing so in CHECK_INTS.  It is also redundant to wipe_stack on
+   each thread_switch if wiping after every thread save context.
+*/
+#ifndef STACK_WIPE_SITES
+# ifdef __x86_64__     /* deal with "red zone" by not inlining stack clearing */
+#  define STACK_WIPE_SITES  0x6770
+# elif defined __ppc__ || defined __ppc64__   /* On any PowerPC, deal with... */
+#  define STACK_WIPE_SITES  0x7764   /* red zone & alloc(0) doesn't return sp */
+# else
+#  define STACK_WIPE_SITES  0x8770 /*normal case, use 0x4770 if problems arise*/
+# endif
+#endif
+
+#if (STACK_WIPE_SITES & 0x14) == 0x14
+#warning  wiping stack in CHECK_INTS makes wiping in loops redundant
+#endif
+#if (STACK_WIPE_SITES & 0x41) == 0x41
+#warning  wiping stack after thread save makes wiping on thread_switch redundant
+#endif
+
+#define STACK_WIPE_METHOD (STACK_WIPE_SITES>>13)
+
 #ifdef _WIN32
 typedef LONG rb_atomic_t;
 
@@ -79,52 +146,151 @@
 
 RUBY_EXTERN int rb_thread_critical;
 void rb_thread_schedule _((void));
-#if defined(HAVE_SETITIMER) || defined(_THREAD_SAFE)
-RUBY_EXTERN int rb_thread_pending;
 
-EXTERN size_t rb_gc_malloc_increase;
-EXTERN size_t rb_gc_malloc_limit;
-EXTERN VALUE *rb_gc_stack_end;
-EXTERN int *rb_gc_stack_grow_direction;  /* -1 for down or 1 for up */
-#define __stack_zero_up(end,sp)  while (end >= ++sp) *sp=0
-#define __stack_grown_up  (rb_gc_stack_end > (VALUE *)alloca(0))
-#define __stack_zero_down(end,sp)  while (end <= --sp) *sp=0
-#define __stack_grown_down  (rb_gc_stack_end < (VALUE *)alloca(0))
+RUBY_EXTERN VALUE *rb_gc_stack_end;
+RUBY_EXTERN int rb_gc_stack_grow_direction;  /* -1 for down or 1 for up */
 
 #if STACK_GROW_DIRECTION > 0
+
+/* clear stack space between end and sp (not including *sp) */
 #define __stack_zero(end,sp)  __stack_zero_up(end,sp)
-#define __stack_grown  __stack_grown_up
+
+/* true if top has grown past limit, i.e. top deeper than limit */
+#define __stack_past(limit,top)  __stack_past_up(limit,top)
+
+/* depth of mid below stack top */
+#define __stack_depth(top,mid)   __stack_depth_up(top,mid)
+
+/* stack pointer top adjusted to include depth more items */
+#define __stack_grow(top,depth)  __stack_grow_up(top,depth)
+
+
 #elif STACK_GROW_DIRECTION < 0
 #define __stack_zero(end,sp)  __stack_zero_down(end,sp)
-#define __stack_grown  __stack_grown_down
+#define __stack_past(limit,top)  __stack_past_down(limit,top)
+#define __stack_depth(top,mid)   __stack_depth_down(top,mid)
+#define __stack_grow(top,depth)  __stack_grow_down(top,depth)
+
 #else  /* limp along if stack direction can't be determined at compile time */
 #define __stack_zero(end,sp) if (rb_gc_stack_grow_direction<0) \
         __stack_zero_down(end,sp); else __stack_zero_up(end,sp);
-#define __stack_grown  \
-        (rb_gc_stack_grow_direction<0 ? __stack_grown_down : __stack_grown_up)
+#define __stack_past(limit,top)  (rb_gc_stack_grow_direction<0 ? \
+                      __stack_past_down(limit,top) : __stack_past_up(limit,top))
+#define __stack_depth(top,mid) (rb_gc_stack_grow_direction<0 ? \
+                       __stack_depth_down(top,mid) : __stack_depth_up(top,mid))
+#define __stack_grow(top,depth) (rb_gc_stack_grow_direction<0 ? \
+                      __stack_grow_down(top,depth) : __stack_grow_up(top,depth))
 #endif
  
+#define __stack_zero_up(end,sp)  while (end >= ++sp) *sp=0
+#define __stack_past_up(limit,top)  ((limit) < (top))
+#define __stack_depth_up(top,mid) ((top) - (mid))
+#define __stack_grow_up(top,depth) ((top)+(depth))
+
+#define __stack_zero_down(end,sp)  while (end <= --sp) *sp=0
+#define __stack_past_down(limit,top)  ((limit) > (top))
+#define __stack_depth_down(top,mid) ((mid) - (top))
+#define __stack_grow_down(top,depth) ((top)-(depth))
+
+/* Make alloca work the best possible way.  */
+#ifdef __GNUC__
+# ifndef atarist
+#  ifndef alloca
+#   define alloca __builtin_alloca
+#  endif
+# endif /* atarist */
+
+# define nativeAllocA __builtin_alloca
+
+/* use assembly to get stack pointer quickly */
+# if STACK_WIPE_SITES & 0x1000
+#  define __defspfn(asmb)  \
+static inline VALUE *__sp(void) __attribute__((always_inline)); \
+static inline VALUE *__sp(void) \
+{ \
+  VALUE *sp; asm(asmb); \
+  return sp; \
+}
+#  if defined __ppc__ || defined __ppc64__
+__defspfn("addi %0, r1, 0": "=r"(sp))
+#  elif defined  __i386__
+__defspfn("movl %%esp, %0": "=r"(sp))
+#  elif defined __x86_64__
+__defspfn("movq %%rsp, %0": "=r"(sp))
+#  elif __arm__
+__defspfn("mov %0, sp": "=r"(sp))
+#  else
+#   define __sp()  ((VALUE *)__builtin_alloca(0))
+#   warning No assembly version of __sp() defined for this CPU.
+#  endif
+# else
+#  define __sp()  ((VALUE *)__builtin_alloca(0))
+# endif
+
+#else  // not GNUC
+
+# ifdef HAVE_ALLOCA_H
+#  include <alloca.h>
+# else
+#  ifndef _AIX
+#   ifndef alloca /* predefined by HP cc +Olibcalls */
+void *alloca ();
+#   endif
+#  endif /* AIX */
+# endif /* HAVE_ALLOCA_H */
+
+# if STACK_WIPE_SITES & 0x1000
+#  warning No assembly versions of __sp() defined for this compiler.
+# endif
+# if HAVE_ALLOCA
+#  define __sp()  ((VALUE *)alloca(0))
+#  define nativeAllocA alloca
+# else
+RUBY_EXTERN VALUE *__sp(void);
+#  if STACK_WIPE_SITES
+#   define STACK_WIPE_SITES 0
+#   warning Disabled Stack Wiping because there is no native alloca()
+#  endif
+# endif
+#endif /* __GNUC__ */
+
+
 /*
-  zero the memory that was (recently) part of the stack
-  but is no longer.  Invoke when stack is deep to mark its extent
-  and when it is shallow to wipe it
+  Zero memory that was (recently) part of the stack, but is no longer.
+  Invoke when stack is deep to mark its extent and when it's shallow to wipe it.
 */
+#if STACK_WIPE_METHOD == 0
+#define rb_gc_wipe_stack() ((void)0)
+#elif STACK_WIPE_METHOD == 4
 #define rb_gc_wipe_stack() {     \
-  VALUE *sp = alloca(0);         \
   VALUE *end = rb_gc_stack_end;  \
+  VALUE *sp = __sp();            \
   rb_gc_stack_end = sp;          \
   __stack_zero(end, sp);   \
 }
+#else
+RUBY_EXTERN void rb_gc_wipe_stack(void);
+#endif
 
 /*
   Update our record of maximum stack extent without zeroing unused stack
 */
-#define rb_gc_update_stack_extent() \
-    if __stack_grown rb_gc_stack_end = alloca(0);
+#define rb_gc_update_stack_extent() do { \
+    VALUE *sp = __sp(); \
+    if __stack_past(rb_gc_stack_end, sp) rb_gc_stack_end = sp; \
+} while(0)
+
 
+#if STACK_WIPE_SITES & 4
+# define CHECK_INTS_wipe_stack()  rb_gc_wipe_stack()
+#else
+# define CHECK_INTS_wipe_stack()  (void)0
+#endif
 
+#if defined(HAVE_SETITIMER) || defined(_THREAD_SAFE)
+RUBY_EXTERN int rb_thread_pending;
 # define CHECK_INTS do {\
-    rb_gc_wipe_stack(); \
+    CHECK_INTS_wipe_stack(); \
     if (!(rb_prohibit_interrupt || rb_thread_critical)) {\
         if (rb_thread_pending) rb_thread_schedule();\
 	if (rb_trap_pending) rb_trap_exec();\
@@ -135,14 +301,14 @@
 RUBY_EXTERN int rb_thread_tick;
 #define THREAD_TICK 500
 #define CHECK_INTS do {\
-    rb_gc_wipe_stack(); \
+    CHECK_INTS_wipe_stack(); \
     if (!(rb_prohibit_interrupt || rb_thread_critical)) {\
 	if (rb_thread_tick-- <= 0) {\
 	    rb_thread_tick = THREAD_TICK;\
             rb_thread_schedule();\
 	}\
+        if (rb_trap_pending) rb_trap_exec();\
     }\
-    if (rb_trap_pending) rb_trap_exec();\
 } while (0)
 #endif
 
diff -ru ruby-1.8.7-p72/version.h ruby-1.8.7-mbari/version.h
--- ruby-1.8.7-p72/version.h	2009-02-09 21:21:30.000000000 -0800
+++ ruby-1.8.7-mbari/version.h	2009-02-09 20:24:44.000000000 -0800
@@ -1,15 +1,15 @@
 #define RUBY_VERSION "1.8.7"
-#define RUBY_RELEASE_DATE "2008-12-21"
+#define RUBY_RELEASE_DATE "2009-2-9"
 #define RUBY_VERSION_CODE 187
-#define RUBY_RELEASE_CODE 20081221
+#define RUBY_RELEASE_CODE 20090209
 #define RUBY_PATCHLEVEL 72
 
 #define RUBY_VERSION_MAJOR 1
 #define RUBY_VERSION_MINOR 8
 #define RUBY_VERSION_TEENY 7
-#define RUBY_RELEASE_YEAR 2008
-#define RUBY_RELEASE_MONTH 12
-#define RUBY_RELEASE_DAY 21
+#define RUBY_RELEASE_YEAR 2009
+#define RUBY_RELEASE_MONTH 2
+#define RUBY_RELEASE_DAY 9
 
 #ifdef RUBY_EXTERN
 RUBY_EXTERN const char ruby_version[];
@@ -25,7 +25,12 @@
 #define RUBY_BIRTH_MONTH 2
 #define RUBY_BIRTH_DAY 24
 
-#define RUBY_RELEASE_STR "MBARI 6 on patchlevel"
+#include "rubysig.h"
+
+#define string_arg(s) #s
+#define MBARI_RELEASE(wipe_sites) "MBARI 7/" string_arg(wipe_sites)
+
+#define RUBY_RELEASE_STR MBARI_RELEASE(STACK_WIPE_SITES) " on patchlevel"
 #define RUBY_RELEASE_NUM RUBY_PATCHLEVEL
 
 
patches/ruby/1.8.7/p72/mbari-5.patch000066400000014257147511530510012531 0ustar00diff -rux '*.o' ruby-1.8.7-p72/ChangeLog ruby-1.8.7-mbari/ChangeLog
--- ruby-1.8.7-p72/ChangeLog	2008-12-17 23:46:07.000000000 -0800
+++ ruby-1.8.7-mbari/ChangeLog	2008-12-17 23:42:22.000000000 -0800
@@ -1,3 +1,7 @@
+Tue Dec 17  4:15:36 2008  Brent Roman  <brent@mbari.org>
+
+        * eval.c:  streamlined rb_thread_restore_context() to ensure O(1) time
+
 Tue Dec 15  9:15:36 2008  Brent Roman  <brent@mbari.org>
 
         * eval.c:  factored rb_eval() into many separate non-inlined
 
diff -rux '*.o' ruby-1.8.7-p72/eval.c ruby-1.8.7-mbari/eval.c
--- ruby-1.8.7-p72/eval.c	2008-12-17 23:46:07.000000000 -0800
+++ ruby-1.8.7-mbari/eval.c	2008-12-17 23:44:48.000000000 -0800
@@ -3,7 +3,7 @@
   eval.c -
 
   $Author: brent $
-  $Date: 2008/12/17 07:28:08 $
+  $Date: 2008/12/18 07:44:48 $
   created at: Thu Jun 10 14:22:17 JST 1993
 
   Copyright (C) 1993-2003 Yukihiro Matsumoto
@@ -10884,11 +10884,10 @@
                   ruby_setjmp(rb_thread_save_context(th), (th)->context))))
 
 NORETURN(static void rb_thread_restore_context _((rb_thread_t,int)));
-NORETURN(NOINLINE(static void rb_thread_restore_context_0(rb_thread_t,int,void*)));
-NORETURN(NOINLINE(static void stack_extend(rb_thread_t, int, VALUE *)));
+NORETURN(NOINLINE(static void rb_thread_restore_context_0(rb_thread_t,int)));
 
 static void
-rb_thread_restore_context_0(rb_thread_t th, int exit, void *vp)
+rb_thread_restore_context_0(rb_thread_t th, int exit)
 {
     static rb_thread_t tmp;
     static int ex;
@@ -10945,9 +10944,9 @@
 static volatile int C(k), C(l), C(m), C(n), C(o);
 static volatile int C(p), C(q), C(r), C(s), C(t);
 int rb_dummy_false = 0;
-NORETURN(NOINLINE(static void register_stack_extend(rb_thread_t, int, void *, VALUE *)));
+NORETURN(NOINLINE(static void register_stack_extend(rb_thread_t, int, VALUE *)));
 static void
-register_stack_extend(rb_thread_t th, int exit, void *vp, VALUE *curr_bsp)
+register_stack_extend(rb_thread_t th, int exit, VALUE *curr_bsp)
 {
     if (rb_dummy_false) {
         /* use registers as much as possible */
@@ -10961,52 +10960,68 @@
         E(p) = E(q) = E(r) = E(s) = E(t) = 0;
     }
     if (curr_bsp < th->bstr_pos+th->bstr_len) {
-        register_stack_extend(th, exit, &exit, (VALUE*)rb_ia64_bsp());
+        register_stack_extend(th, exit, (VALUE*)rb_ia64_bsp());
     }
-    rb_thread_restore_context_0(th, exit, &exit);
+    rb_thread_restore_context_0(th, exit);
 }
 #undef C
 #undef E
 #endif
 
-# if defined(_MSC_VER) && _MSC_VER >= 1300
-__declspec(noinline) static void stack_extend(rb_thread_t, int, VALUE*);
-# endif
-static void
-stack_extend(rb_thread_t th, int exit, VALUE *addr_in_prev_frame)
-{
-#define STACK_PAD_SIZE 1024
-    VALUE space[STACK_PAD_SIZE];
-
-#if STACK_GROW_DIRECTION < 0
-    if (addr_in_prev_frame > th->stk_pos) stack_extend(th, exit, &space[0]);
-#elif STACK_GROW_DIRECTION > 0
-    if (addr_in_prev_frame < th->stk_pos + th->stk_len) stack_extend(th, exit, &space[STACK_PAD_SIZE-1]);
-#else
-    if (addr_in_prev_frame < rb_gc_stack_start) {
-        /* Stack grows downward */
-        if (addr_in_prev_frame > th->stk_pos) stack_extend(th, exit, &space[0]);
-    }
-    else {
-        /* Stack grows upward */
-        if (addr_in_prev_frame < th->stk_pos + th->stk_len) stack_extend(th, exit, &space[STACK_PAD_SIZE-1]);
-    }
-#endif
-#ifdef __ia64
-    register_stack_extend(th, exit, space, (VALUE*)rb_ia64_bsp());
-#else
-    rb_thread_restore_context_0(th, exit, space);
-#endif
-}
 
 static void
 rb_thread_restore_context(th, exit)
     rb_thread_t th;
     int exit;
 {
+    VALUE *pos = th->stk_start;
+
+#if HAVE_ALLOCA  /* use alloca to grow stack in O(1) time */
     VALUE v;
+    volatile VALUE *space;
+
     if (!th->stk_ptr) rb_bug("unsaved context");
-    stack_extend(th, exit, &v);
+#  if !STACK_GROW_DIRECTION  /* unknown at compile time */
+    if (rb_gc_stack_grow_direction < 0) {
+#  endif
+#  if STACK_GROW_DIRECTION <= 0
+      pos -= th->stk_len;
+      if (&v > pos) space=ALLOCA_N(VALUE, &v-pos);
+#  endif
+#  if !STACK_GROW_DIRECTION
+    }else
+#  endif
+#if STACK_GROW_DIRECTION >= 0  /* stack grows upward */
+      if (&v < pos + th->stk_len) space=ALLOCA_N(VALUE, pos+th->stk_len - &v);
+#  endif
+
+#else  /* recursive O(n/1024) if extending stack > 1024 VALUEs */
+
+    volatile VALUE v[1023];
+
+#  if !STACK_GROW_DIRECTION  /* unknown at compile time */
+    if (rb_gc_stack_grow_direction < 0) {
+#  endif
+#  if STACK_GROW_DIRECTION <= 0
+      pos -= th->stk_len;
+      if (v > pos) rb_thread_restore_context(th, exit);
+#  endif
+#  if !STACK_GROW_DIRECTION
+    }else
+#  endif
+#  if STACK_GROW_DIRECTION >= 0  /* stack grows upward */
+      if (v < pos + th->stk_len) rb_thread_restore_context(th, exit);
+#  endif
+    if (!th->stk_ptr) rb_bug("unsaved context");
+    
+#endif  /* stack now extended */
+
+
+#ifdef __ia64
+    register_stack_extend(th, exit, (VALUE*)rb_ia64_bsp());
+#else
+    rb_thread_restore_context_0(th, exit);
+#endif
 }
 
 static void
diff -rux '*.o' ruby-1.8.7-p72/gc.c ruby-1.8.7-mbari/gc.c
--- ruby-1.8.7-p72/gc.c	2008-12-20 22:34:10.000000000 -0800
+++ ruby-1.8.7-mbari/gc.c	2008-12-17 23:43:46.000000000 -0800
@@ -3,7 +3,7 @@
   gc.c -
 
   $Author: brent $
-  $Date: 2008/12/14 07:23:34 $
+  $Date: 2008/12/18 07:43:46 $
   created at: Tue Oct  5 09:44:46 JST 1993
 
   Copyright (C) 1993-2003 Yukihiro Matsumoto
diff -rux '*.o' ruby-1.8.7-p72/version.h ruby-1.8.7-mbari/version.h
--- ruby-1.8.7-p72/version.h	2008-12-17 23:46:07.000000000 -0800
+++ ruby-1.8.7-mbari/version.h	2008-12-17 22:32:11.000000000 -0800
@@ -1,7 +1,7 @@
 #define RUBY_VERSION "1.8.7"
-#define RUBY_RELEASE_DATE "2008-12-16"
+#define RUBY_RELEASE_DATE "2008-12-17"
 #define RUBY_VERSION_CODE 187
-#define RUBY_RELEASE_CODE 20081216
+#define RUBY_RELEASE_CODE 20081217
 #define RUBY_PATCHLEVEL 72
 
 #define RUBY_VERSION_MAJOR 1
@@ -9,7 +9,7 @@
 #define RUBY_VERSION_TEENY 7
 #define RUBY_RELEASE_YEAR 2008
 #define RUBY_RELEASE_MONTH 12
-#define RUBY_RELEASE_DAY 16
+#define RUBY_RELEASE_DAY 17
 
 #ifdef RUBY_EXTERN
 RUBY_EXTERN const char ruby_version[];
@@ -25,7 +25,7 @@
 #define RUBY_BIRTH_MONTH 2
 #define RUBY_BIRTH_DAY 24
 
-#define RUBY_RELEASE_STR "MBARI 4 on patchlevel"
+#define RUBY_RELEASE_STR "MBARI 5 on patchlevel"
 #define RUBY_RELEASE_NUM RUBY_PATCHLEVEL
patches/ruby/1.8.7/zlib-gc-fix.diff000066400000000477147511530510012610 0ustar00diff --git a/ext/zlib/zlib.c b/ext/zlib/zlib.c
index b87e691..5f701ab 100644
--- a/ext/zlib/zlib.c
+++ b/ext/zlib/zlib.c
@@ -610,6 +610,7 @@ zstream_append_input(z, src, len)
 }
 
 #define zstream_append_input2(z,v)\
+    RB_GC_GUARD(v),\
     zstream_append_input((z), RSTRING(v)->ptr, RSTRING(v)->len)
 
 static void
patches/ruby/1.8.7/hs.patch000066400000077773147511530510011313 0ustar00diff --git a/eval.c b/eval.c
index b705302..909cd3d 100644
--- a/eval.c
+++ b/eval.c
@@ -73,6 +73,7 @@ char *strrchr _((const char*,const char));
 #endif
 
 #include <time.h>
+#include <sys/mman.h>
 
 #ifdef __BEOS__
 #include <net/socket.h>
@@ -1022,7 +1023,7 @@ static struct tag *prot_tag;
     _tag.blkid = 0;			\
     prot_tag = &_tag
 
-#define PROT_NONE   Qfalse	/* 0 */
+#define PROT_EMPTY  Qfalse	/* 0 */
 #define PROT_THREAD Qtrue	/* 2 */
 #define PROT_FUNC   INT2FIX(0)	/* 1 */
 #define PROT_LOOP   INT2FIX(1)	/* 3 */
@@ -1234,7 +1235,7 @@ error_print()
 
     if (NIL_P(ruby_errinfo)) return;
 
-    PUSH_TAG(PROT_NONE);
+    PUSH_TAG(PROT_EMPTY);
     if (EXEC_TAG() == 0) {
 	errat = get_backtrace(ruby_errinfo);
     }
@@ -1395,7 +1396,7 @@ ruby_init()
     /* default visibility is private at toplevel */
     SCOPE_SET(SCOPE_PRIVATE);
 
-    PUSH_TAG(PROT_NONE);
+    PUSH_TAG(PROT_EMPTY);
     if ((state = EXEC_TAG()) == 0) {
 	rb_call_inits();
 	ruby_class = rb_cObject;
@@ -1529,7 +1530,7 @@ ruby_options(argc, argv)
     int state;
 
     Init_stack((void*)&state);
-    PUSH_TAG(PROT_NONE);
+    PUSH_TAG(PROT_EMPTY);
     if ((state = EXEC_TAG()) == 0) {
 	ruby_process_options(argc, argv);
     }
@@ -1546,7 +1547,7 @@ void rb_exec_end_proc _((void));
 static void
 ruby_finalize_0()
 {
-    PUSH_TAG(PROT_NONE);
+    PUSH_TAG(PROT_EMPTY);
     if (EXEC_TAG() == 0) {
 	rb_trap_exit();
     }
@@ -1584,7 +1585,7 @@ ruby_cleanup(ex)
     Init_stack((void *)&state);
     ruby_finalize_0();
     errs[0] = ruby_errinfo;
-    PUSH_TAG(PROT_NONE);
+    PUSH_TAG(PROT_EMPTY);
     PUSH_ITER(ITER_NOT);
     if ((state = EXEC_TAG()) == 0) {
 	rb_thread_cleanup();
@@ -1635,7 +1636,7 @@ ruby_exec_internal()
 {
     int state;
 
-    PUSH_TAG(PROT_NONE);
+    PUSH_TAG(PROT_EMPTY);
     PUSH_ITER(ITER_NOT);
     /* default visibility is private at toplevel */
     SCOPE_SET(SCOPE_PRIVATE);
@@ -1857,7 +1858,7 @@ rb_eval_cmd(cmd, arg, level)
     }
     if (TYPE(cmd) != T_STRING) {
 	PUSH_ITER(ITER_NOT);
-	PUSH_TAG(PROT_NONE);
+	PUSH_TAG(PROT_EMPTY);
 	ruby_safe_level = level;
 	if ((state = EXEC_TAG()) == 0) {
 	    val = rb_funcall2(cmd, rb_intern("call"), RARRAY(arg)->len, RARRAY(arg)->ptr);
@@ -1879,7 +1880,7 @@ rb_eval_cmd(cmd, arg, level)
 
     ruby_safe_level = level;
 
-    PUSH_TAG(PROT_NONE);
+    PUSH_TAG(PROT_EMPTY);
     if ((state = EXEC_TAG()) == 0) {
 	val = eval(ruby_top_self, cmd, Qnil, 0, 0);
     }
@@ -2386,7 +2387,7 @@ is_defined(self, node, buf)
 	val = self;
 	if (node->nd_recv == (NODE *)1) goto check_bound;
       case NODE_CALL:
-	PUSH_TAG(PROT_NONE);
+	PUSH_TAG(PROT_EMPTY);
 	if ((state = EXEC_TAG()) == 0) {
 	    val = rb_eval(self, node->nd_recv);
 	}
@@ -2488,7 +2489,7 @@ is_defined(self, node, buf)
 	break;
 
       case NODE_COLON2:
-	PUSH_TAG(PROT_NONE);
+	PUSH_TAG(PROT_EMPTY);
 	if ((state = EXEC_TAG()) == 0) {
 	    val = rb_eval(self, node->nd_head);
 	}
@@ -2537,7 +2538,7 @@ is_defined(self, node, buf)
 	goto again;
 
       default:
-	PUSH_TAG(PROT_NONE);
+	PUSH_TAG(PROT_EMPTY);
 	if ((state = EXEC_TAG()) == 0) {
 	    rb_eval(self, node);
 	}
@@ -2741,7 +2742,7 @@ call_trace_func(event, node, self, id, klass)
 	    klass = rb_iv_get(klass, "__attached__");
 	}
     }
-    PUSH_TAG(PROT_NONE);
+    PUSH_TAG(PROT_EMPTY);
     raised = rb_thread_reset_raised(th);
     if ((state = EXEC_TAG()) == 0) {
 	srcfile = rb_str_new2(ruby_sourcefile?ruby_sourcefile:"(ruby)");
@@ -3304,7 +3305,7 @@ rb_eval(self, n)
 	    volatile VALUE e_info = ruby_errinfo;
 	    volatile int rescuing = 0;
 
-	    PUSH_TAG(PROT_NONE);
+	    PUSH_TAG(PROT_EMPTY);
 	    if ((state = EXEC_TAG()) == 0) {
 	      retry_entry:
 		result = rb_eval(self, node->nd_head);
@@ -3353,7 +3354,7 @@ rb_eval(self, n)
 	break;
 
       case NODE_ENSURE:
-	PUSH_TAG(PROT_NONE);
+	PUSH_TAG(PROT_EMPTY);
 	if ((state = EXEC_TAG()) == 0) {
 	    result = rb_eval(self, node->nd_head);
 	}
@@ -3571,7 +3572,7 @@ rb_eval(self, n)
 	    ruby_frame = &frame;
 
 	    PUSH_SCOPE();
-	    PUSH_TAG(PROT_NONE);
+	    PUSH_TAG(PROT_EMPTY);
 	    if (node->nd_rval) {
 		saved_cref = ruby_cref;
 		ruby_cref = (NODE*)node->nd_rval;
@@ -4197,7 +4198,7 @@ module_setup(module, n)
     }
 
     PUSH_CREF(module);
-    PUSH_TAG(PROT_NONE);
+    PUSH_TAG(PROT_EMPTY);
     if ((state = EXEC_TAG()) == 0) {
 	EXEC_EVENT_HOOK(RUBY_EVENT_CLASS, n, ruby_cbase,
 			ruby_frame->last_func, ruby_frame->last_class);
@@ -4604,7 +4605,7 @@ rb_longjmp(tag, mesg)
 	VALUE e = ruby_errinfo;
 	int status;
 
-	PUSH_TAG(PROT_NONE);
+	PUSH_TAG(PROT_EMPTY);
 	if ((status = EXEC_TAG()) == 0) {
 	    StringValue(e);
 	    warn_printf("Exception `%s' at %s:%d - %s\n",
@@ -4978,7 +4979,7 @@ rb_yield_0(val, self, klass, flags, avalue)
     var = block->var;
 
     if (var) {
-	PUSH_TAG(PROT_NONE);
+	PUSH_TAG(PROT_EMPTY);
 	if ((state = EXEC_TAG()) == 0) {
 	    NODE *bvar = NULL;
 	  block_var:
@@ -5051,7 +5052,7 @@ rb_yield_0(val, self, klass, flags, avalue)
     ruby_current_node = node;
 
     PUSH_ITER(block->iter);
-    PUSH_TAG(lambda ? PROT_NONE : PROT_YIELD);
+    PUSH_TAG(lambda ? PROT_EMPTY : PROT_YIELD);
     if ((state = EXEC_TAG()) == 0) {
       redo:
 	if (nd_type(node) == NODE_CFUNC || nd_type(node) == NODE_IFUNC) {
@@ -5464,7 +5465,7 @@ rb_rescue2(b_proc, data1, r_proc, data2, va_alist)
     VALUE eclass;
     va_list args;
 
-    PUSH_TAG(PROT_NONE);
+    PUSH_TAG(PROT_EMPTY);
     switch (state = EXEC_TAG()) {
       case TAG_RETRY:
 	if (!handle) break;
@@ -5522,7 +5523,7 @@ rb_protect(proc, data, state)
     VALUE result = Qnil;	/* OK */
     int status;
 
-    PUSH_TAG(PROT_NONE);
+    PUSH_TAG(PROT_EMPTY);
     cont_protect = (VALUE)rb_node_newnode(NODE_MEMO, cont_protect, 0, 0);
     if ((status = EXEC_TAG()) == 0) {
 	result = (*proc)(data);
@@ -5550,7 +5551,7 @@ rb_ensure(b_proc, data1, e_proc, data2)
     volatile VALUE result = Qnil;
     VALUE retval;
 
-    PUSH_TAG(PROT_NONE);
+    PUSH_TAG(PROT_EMPTY);
     if ((state = EXEC_TAG()) == 0) {
 	result = (*b_proc)(data1);
     }
@@ -5577,7 +5578,7 @@ rb_with_disable_interrupt(proc, data)
 	int thr_critical = rb_thread_critical;
 
 	rb_thread_critical = Qtrue;
-	PUSH_TAG(PROT_NONE);
+	PUSH_TAG(PROT_EMPTY);
 	if ((status = EXEC_TAG()) == 0) {
 	    result = (*proc)(data);
 	}
@@ -6264,7 +6265,7 @@ rb_funcall_rescue(recv, mid, n, va_alist)
 
     va_init_list(ar, n);
 
-    PUSH_TAG(PROT_NONE);
+    PUSH_TAG(PROT_EMPTY);
     if ((status = EXEC_TAG()) == 0) {
 	result = vafuncall(recv, mid, n, &ar);
     }
@@ -6539,7 +6540,7 @@ eval(self, src, scope, file, line)
     if (TYPE(ruby_class) == T_ICLASS) {
 	ruby_class = RBASIC(ruby_class)->klass;
     }
-    PUSH_TAG(PROT_NONE);
+    PUSH_TAG(PROT_EMPTY);
     if ((state = EXEC_TAG()) == 0) {
 	NODE *node;
 
@@ -6698,7 +6699,7 @@ exec_under(func, under, cbase, args)
 
     mode = scope_vmode;
     SCOPE_SET(SCOPE_PUBLIC);
-    PUSH_TAG(PROT_NONE);
+    PUSH_TAG(PROT_EMPTY);
     if ((state = EXEC_TAG()) == 0) {
 	val = (*func)(args);
     }
@@ -7009,7 +7010,7 @@ rb_load(fname, wrap)
     PUSH_SCOPE();
     /* default visibility is private at loading toplevel */
     SCOPE_SET(SCOPE_PRIVATE);
-    PUSH_TAG(PROT_NONE);
+    PUSH_TAG(PROT_EMPTY);
     state = EXEC_TAG();
     last_func = ruby_frame->last_func;
     last_node = ruby_current_node;
@@ -7068,7 +7069,7 @@ rb_load_protect(fname, wrap, state)
 {
     int status;
 
-    PUSH_TAG(PROT_NONE);
+    PUSH_TAG(PROT_EMPTY);
     if ((status = EXEC_TAG()) == 0) {
 	rb_load(fname, wrap);
     }
@@ -7389,7 +7390,7 @@ rb_require_safe(fname, safe)
     saved.node = ruby_current_node;
     saved.func = ruby_frame->last_func;
     saved.safe = ruby_safe_level;
-    PUSH_TAG(PROT_NONE);
+    PUSH_TAG(PROT_EMPTY);
     if ((state = EXEC_TAG()) == 0) {
 	VALUE feature, path;
 	long handle;
@@ -8097,7 +8098,7 @@ rb_exec_end_proc()
 	tmp_end_procs = link = ephemeral_end_procs;
 	ephemeral_end_procs = 0;
 	while (link) {
-	    PUSH_TAG(PROT_NONE);
+	    PUSH_TAG(PROT_EMPTY);
 	    if ((status = EXEC_TAG()) == 0) {
 		ruby_safe_level = link->safe;
 		(*link->func)(link->data);
@@ -8115,7 +8116,7 @@ rb_exec_end_proc()
 	tmp_end_procs = link = end_procs;
 	end_procs = 0;
 	while (link) {
-	    PUSH_TAG(PROT_NONE);
+	    PUSH_TAG(PROT_EMPTY);
 	    if ((status = EXEC_TAG()) == 0) {
 		ruby_safe_level = link->safe;
 		(*link->func)(link->data);
@@ -8852,7 +8853,7 @@ proc_invoke(proc, args, self, klass)
     ruby_block = &_block;
     PUSH_ITER(ITER_CUR);
     ruby_frame->iter = ITER_CUR;
-    PUSH_TAG(pcall ? PROT_LAMBDA : PROT_NONE);
+    PUSH_TAG(pcall ? PROT_LAMBDA : PROT_EMPTY);
     state = EXEC_TAG();
     if (state == 0) {
 	proc_set_safe_level(proc);
@@ -10179,6 +10180,7 @@ win32_set_exception_list(p)
 int rb_thread_pending = 0;
 
 VALUE rb_cThread;
+static unsigned int rb_thread_stack_size;
 
 extern VALUE rb_last_status;
 
@@ -10406,12 +10408,20 @@ thread_mark(th)
     rb_gc_mark(th->thread);
     if (th->join) rb_gc_mark(th->join->thread);
 
-    rb_gc_mark(th->klass);
-    rb_gc_mark(th->wrapper);
-    rb_gc_mark((VALUE)th->cref);
+    if (curr_thread == th) {
+      rb_gc_mark(ruby_class);
+      rb_gc_mark(ruby_wrapper);
+      rb_gc_mark((VALUE)ruby_cref);
+      rb_gc_mark((VALUE)ruby_scope);
+      rb_gc_mark((VALUE)ruby_dyna_vars);
+    } else {
+      rb_gc_mark(th->klass);
+      rb_gc_mark(th->wrapper);
+      rb_gc_mark((VALUE)th->cref);
+      rb_gc_mark((VALUE)th->scope);
+      rb_gc_mark((VALUE)th->dyna_vars);
+    }
 
-    rb_gc_mark((VALUE)th->scope);
-    rb_gc_mark((VALUE)th->dyna_vars);
     rb_gc_mark(th->errinfo);
     rb_gc_mark(th->last_status);
     rb_gc_mark(th->last_line);
@@ -10421,11 +10431,11 @@ thread_mark(th)
     rb_gc_mark_maybe(th->sandbox);
 
     /* mark data in copied stack */
-    if (th == curr_thread) return;
+    if (th == main_thread) return;
     if (th->status == THREAD_KILLED) return;
     if (th->stk_len == 0) return;  /* stack not active, no need to mark. */
-    if (th->stk_ptr) {
-	rb_gc_mark_locations(th->stk_ptr, th->stk_ptr+th->stk_len);
+    if (th->stk_ptr && th != curr_thread) {
+      rb_gc_mark_locations(th->stk_pos, th->stk_base);
 #if defined(THINK_C) || defined(__human68k__)
 	rb_gc_mark_locations(th->stk_ptr+2, th->stk_ptr+th->stk_len+2);
 #endif
@@ -10435,24 +10445,30 @@ thread_mark(th)
 	}
 #endif
     }
-    frame = th->frame;
+
+    if (curr_thread == th)
+      frame = ruby_frame;
+    else
+      frame = th->frame;
+
     while (frame && frame != top_frame) {
-	frame = ADJ(frame);
 	rb_gc_mark_frame(frame);
 	if (frame->tmp) {
 	    struct FRAME *tmp = frame->tmp;
-
 	    while (tmp && tmp != top_frame) {
-		tmp = ADJ(tmp);
 		rb_gc_mark_frame(tmp);
 		tmp = tmp->prev;
 	    }
 	}
 	frame = frame->prev;
     }
-    block = th->block;
+
+    if (curr_thread == th)
+      block = ruby_block;
+    else
+      block = th->block;
+
     while (block) {
-	block = ADJ(block);
 	rb_gc_mark_frame(&block->frame);
 	block = block->prev;
     }
@@ -10515,7 +10531,7 @@ static inline void
 stack_free(th)
     rb_thread_t th;
 {
-    if (th->stk_ptr) free(th->stk_ptr);
+  if (th->stk_ptr) munmap(th->stk_ptr, th->stk_size);
     th->stk_ptr = 0;
 #ifdef __ia64
     if (th->bstr_ptr) free(th->bstr_ptr);
@@ -10576,35 +10592,8 @@ rb_thread_save_context(th)
     static VALUE tval;
 
     len = ruby_stack_length(&pos);
-    th->stk_len = 0;
-    th->stk_pos = pos;
-    if (len > th->stk_max) {
-	VALUE *ptr = realloc(th->stk_ptr, sizeof(VALUE) * len);
-	if (!ptr) rb_memerror();
-	th->stk_ptr = ptr;
-	th->stk_max = len;
-    }
     th->stk_len = len;
-    FLUSH_REGISTER_WINDOWS;
-    MEMCPY(th->stk_ptr, th->stk_pos, VALUE, th->stk_len);
-#ifdef __ia64
-    th->bstr_pos = rb_gc_register_stack_start;
-    len = (VALUE*)rb_ia64_bsp() - th->bstr_pos;
-    th->bstr_len = 0;
-    if (len > th->bstr_max) {
-        VALUE *ptr = realloc(th->bstr_ptr, sizeof(VALUE) * len);
-        if (!ptr) rb_memerror();
-        th->bstr_ptr = ptr;
-        th->bstr_max = len;
-    }
-    th->bstr_len = len;
-    rb_ia64_flushrs();
-    MEMCPY(th->bstr_ptr, th->bstr_pos, VALUE, th->bstr_len);
-#endif
-#ifdef SAVE_WIN32_EXCEPTION_LIST
-    th->win32_exception_list = win32_get_exception_list();
-#endif
-
+    th->stk_pos = pos;
     th->frame = ruby_frame;
     th->scope = ruby_scope;
     ruby_scope->flags |= SCOPE_DONT_RECYCLE;
@@ -10714,11 +10703,6 @@ rb_thread_restore_context_0(rb_thread_t th, int exit)
 #endif
     tmp = th;
     ex = exit;
-    FLUSH_REGISTER_WINDOWS;
-    MEMCPY(tmp->stk_pos, tmp->stk_ptr, VALUE, tmp->stk_len);
-#ifdef __ia64
-    MEMCPY(tmp->bstr_pos, tmp->bstr_ptr, VALUE, tmp->bstr_len);
-#endif
 
     tval = rb_lastline_get();
     rb_lastline_set(tmp->last_line);
@@ -10809,8 +10793,8 @@ rb_thread_restore_context(th, exit)
     rb_thread_t th;
     int exit;
 {
-    if (!th->stk_ptr) rb_bug("unsaved context");
-    stack_extend(th, exit);
+    if (!th->stk_ptr && th != main_thread) rb_bug("unsaved context");
+    rb_thread_restore_context_0(th, exit);
 }
 
 static void
@@ -10829,7 +10813,6 @@ rb_thread_die(th)
 {
     th->thgroup = 0;
     th->status = THREAD_KILLED;
-    stack_free(th);
 }
 
 static void
@@ -12096,6 +12079,7 @@ rb_thread_group(thread)
 \
     th->stk_ptr = 0;\
     th->stk_len = 0;\
+    th->stk_size = 0;\
     th->stk_max = 0;\
     th->wait_for = 0;\
     IA64_INIT(th->bstr_ptr = 0);\
@@ -12143,6 +12127,48 @@ rb_thread_alloc(klass)
     THREAD_ALLOC(th);
     th->thread = Data_Wrap_Struct(klass, thread_mark, thread_free, th);
 
+    /* if main_thread != NULL, then this is NOT the main thread, so
+     * we create a heap-stack
+     */
+    if (main_thread) {
+      /* Allocate stack, don't forget to add 1 extra word because of the MATH below */
+      unsigned int pagesize = getpagesize();
+      unsigned int total_size = rb_thread_stack_size + pagesize + sizeof(int);
+      void *stack_area = NULL;
+
+      stack_area = mmap(NULL, total_size, PROT_READ | PROT_WRITE | PROT_EXEC,
+			MAP_PRIVATE | MAP_ANON, -1, 0);
+
+      if (stack_area == MAP_FAILED) {
+	fprintf(stderr, "Thread stack allocation failed!\n");
+	rb_memerror();
+      }
+
+      th->stk_ptr = th->stk_pos = stack_area;
+      th->stk_size = total_size;
+
+      if (mprotect(th->stk_ptr, pagesize, PROT_NONE) == -1) {
+	fprintf(stderr, "Failed to create thread guard region: %s\n", strerror(errno));
+	rb_memerror();
+      }
+
+      th->guard = th->stk_ptr + (pagesize/sizeof(VALUE *));
+
+      /* point stk_base at the top of the stack */
+      /* ASSUMPTIONS:
+       * 1.) The address returned by malloc is "suitably aligned" for anything on this system
+       * 2.) Adding a value that is "aligned" for this platform should not unalign the address
+       *     returned from malloc.
+       * 3.) Don't push anything on to the stack, otherwise it'll get unaligned.
+       * 4.) x86_64 ABI says aligned AFTER arguments have been pushed. You *must* then do a call[lq]
+       *     or push[lq] something else on to the stack if you inted to do a ret.
+       */
+      th->stk_base = th->stk_ptr + ((total_size - sizeof(int))/sizeof(VALUE *));
+      th->stk_len = rb_thread_stack_size;
+    } else {
+      th->stk_ptr = th->stk_pos = rb_gc_stack_start;
+    }
+
     for (vars = th->dyna_vars; vars; vars = vars->next) {
 	if (FL_TEST(vars, DVAR_DONT_RECYCLE)) break;
 	FL_SET(vars, DVAR_DONT_RECYCLE);
@@ -12246,17 +12272,22 @@ rb_thread_stop_timer()
 int rb_thread_tick = THREAD_TICK;
 #endif
 
+struct thread_start_args {
+  VALUE (*fn)();
+  void *arg;
+  rb_thread_t th;
+} new_th;
+
+static VALUE
+rb_thread_start_2();
+
 static VALUE
 rb_thread_start_0(fn, arg, th)
     VALUE (*fn)();
     void *arg;
     rb_thread_t th;
 {
-    volatile rb_thread_t th_save = th;
     volatile VALUE thread = th->thread;
-    struct BLOCK *volatile saved_block = 0;
-    enum rb_thread_status status;
-    int state;
 
     if (OBJ_FROZEN(curr_thread->thgroup)) {
 	rb_raise(rb_eThreadError,
@@ -12284,16 +12315,41 @@ rb_thread_start_0(fn, arg, th)
 	return thread;
     }
 
-    if (ruby_block) {		/* should nail down higher blocks */
-	struct BLOCK dummy;
+    new_th.fn = fn;
+    new_th.arg = arg;
+    new_th.th = th;
+
+#if defined(__i386__)
+    __asm__ __volatile__ ("movl %0, %%esp\n\t"
+                          "calll *%1\n"
+                          :: "r" (th->stk_base),
+                             "r" (rb_thread_start_2));
+#elif defined(__x86_64__)
+    __asm__ __volatile__ ("movq %0, %%rsp\n\t"
+                          "callq *%1\n"
+                          :: "r" (th->stk_base),
+                             "r" (rb_thread_start_2));
+#else
+    #error unsupported architecture!
+#endif
+    /* NOTREACHED */
+    return 0;
+}
 
-	dummy.prev = ruby_block;
-	blk_copy_prev(&dummy);
-	saved_block = ruby_block = dummy.prev;
-    }
-    scope_dup(ruby_scope);
+static VALUE
+rb_thread_start_2()
+{
+   volatile rb_thread_t th = new_th.th;
+   volatile rb_thread_t th_save = th;
+   volatile VALUE thread = th->thread;
+   struct BLOCK *volatile saved_block = 0;
+   enum rb_thread_status status;
+   int state;
+   struct tag *tag;
+   struct RVarmap *vars;
+   struct FRAME dummy_frame;
 
-    if (!th->next) {
+   if (!th->next) {
 	/* merge in thread list */
 	th->prev = curr_thread;
 	curr_thread->next->prev = th;
@@ -12301,13 +12357,27 @@ rb_thread_start_0(fn, arg, th)
 	curr_thread->next = th;
 	th->priority = curr_thread->priority;
 	th->thgroup = curr_thread->thgroup;
+   }
+   curr_thread = th;
+
+   dummy_frame = *ruby_frame;
+   dummy_frame.prev = top_frame;
+   ruby_frame = &dummy_frame;
+
+   if (ruby_block) {		/* should nail down higher blocks */
+	struct BLOCK dummy;
+
+	dummy.prev = ruby_block;
+	blk_copy_prev(&dummy);
+	saved_block = ruby_block = dummy.prev;
     }
 
+    scope_dup(ruby_scope);
+
     PUSH_TAG(PROT_THREAD);
     if ((state = EXEC_TAG()) == 0) {
 	if (THREAD_SAVE_CONTEXT(th) == 0) {
-	    curr_thread = th;
-	    th->result = (*fn)(arg, th);
+	    th->result = (*new_th.fn)(new_th.arg, th);
 	}
 	th = th_save;
     }
@@ -12644,6 +12714,43 @@ rb_thread_cleanup()
     END_FOREACH_FROM(curr, th);
 }
 
+/*
+ * call-seq:
+ *    Thread.stack_size    => fixnum
+ *
+ * Returns the thread stack size in bytes
+ */
+static VALUE
+rb_thread_stacksize_get()
+{
+  return INT2FIX(rb_thread_stack_size);
+}
+
+/*
+ * call-seq:
+ *    Thread.stack_size= fixnum => Qnil
+ *
+ * Sets the global thread stacksize and returns Qnil.
+ */
+static VALUE
+rb_thread_stacksize_set(obj, val)
+     VALUE obj;
+     VALUE val;
+{
+
+  unsigned int size = FIX2UINT(val);
+
+  /* 16byte alignment works for both x86 and x86_64 */
+  if (size & (~0xf)) {
+    size += 0x10;
+    size = size & (~0xf);
+  }
+
+  rb_thread_stack_size = size;
+
+  return Qnil;
+}
+
 int rb_thread_critical;
 
 
@@ -13473,7 +13580,7 @@ rb_exec_recursive(func, obj, arg)
 	int state;
 
 	hash = recursive_push(hash, objid);
-	PUSH_TAG(PROT_NONE);
+	PUSH_TAG(PROT_EMPTY);
 	if ((state = EXEC_TAG()) == 0) {
 	    result = (*func) (obj, arg, Qfalse);
 	}
@@ -13500,6 +13607,8 @@ Init_Thread()
 {
     VALUE cThGroup;
 
+    rb_thread_stack_size = (1024 * 1024);
+
     recursive_key = rb_intern("__recursive_key__");
     rb_eThreadError = rb_define_class("ThreadError", rb_eStandardError);
     rb_cThread = rb_define_class("Thread", rb_cObject);
@@ -13524,6 +13633,9 @@ Init_Thread()
     rb_define_singleton_method(rb_cThread, "abort_on_exception", rb_thread_s_abort_exc, 0);
     rb_define_singleton_method(rb_cThread, "abort_on_exception=", rb_thread_s_abort_exc_set, 1);
 
+    rb_define_singleton_method(rb_cThread, "stack_size", rb_thread_stacksize_get, 0);
+    rb_define_singleton_method(rb_cThread, "stack_size=", rb_thread_stacksize_set, 1);
+
     rb_define_method(rb_cThread, "run", rb_thread_run, 0);
     rb_define_method(rb_cThread, "wakeup", rb_thread_wakeup, 0);
     rb_define_method(rb_cThread, "kill", rb_thread_kill, 0);
diff --git a/gc.c b/gc.c
index a564f0b..d6d654d 100644
--- a/gc.c
+++ b/gc.c
@@ -506,12 +506,12 @@ stack_end_address(VALUE **stack_end_p)
 # define STACK_END (stack_end)
 #endif
 #if STACK_GROW_DIRECTION < 0
-# define STACK_LENGTH  (rb_gc_stack_start - STACK_END)
+# define STACK_LENGTH(start)  ((start) - STACK_END)
 #elif STACK_GROW_DIRECTION > 0
-# define STACK_LENGTH  (STACK_END - rb_gc_stack_start + 1)
+# define STACK_LENGTH(start)  (STACK_END - (start) + 1)
 #else
-# define STACK_LENGTH  ((STACK_END < rb_gc_stack_start) ? rb_gc_stack_start - STACK_END\
-                                           : STACK_END - rb_gc_stack_start + 1)
+# define STACK_LENGTH(start)  ((STACK_END < (start)) ? (start) - STACK_END\
+                                           : STACK_END - (start) + 1)
 #endif
 #if STACK_GROW_DIRECTION > 0
 # define STACK_UPPER(x, a, b) a
@@ -534,27 +534,36 @@ stack_grow_direction(addr)
 
 #define GC_WATER_MARK 512
 
-#define CHECK_STACK(ret) do {\
+#define CHECK_STACK(ret, start) do {\
     SET_STACK_END;\
-    (ret) = (STACK_LENGTH > STACK_LEVEL_MAX + GC_WATER_MARK);\
+    (ret) = (STACK_LENGTH(start) > STACK_LEVEL_MAX + GC_WATER_MARK);\
 } while (0)
 
 size_t
 ruby_stack_length(p)
     VALUE **p;
 {
-    SET_STACK_END;
-    if (p) *p = STACK_UPPER(STACK_END, rb_gc_stack_start, STACK_END);
-    return STACK_LENGTH;
+  SET_STACK_END;
+  VALUE *start;
+  if (rb_curr_thread == rb_main_thread) {
+    start = rb_gc_stack_start;
+  } else {
+    start = rb_curr_thread->stk_base;
+  }
+  if (p) *p = STACK_UPPER(STACK_END, start, STACK_END);
+  return STACK_LENGTH(start);
 }
 
 int
 ruby_stack_check()
 {
-    int ret;
-
-    CHECK_STACK(ret);
-    return ret;
+  int ret;
+  if (rb_curr_thread == rb_main_thread) {
+    CHECK_STACK(ret, rb_gc_stack_start);
+  } else {
+    CHECK_STACK(ret, rb_curr_thread->stk_base);
+  }
+  return ret;
 }
 
 #define MARK_STACK_MAX 1024
@@ -1441,10 +1450,13 @@ garbage_collect()
 
     init_mark_stack();
 
-    gc_mark((VALUE)ruby_current_node, 0);
-
     /* mark frame stack */
-    for (frame = ruby_frame; frame; frame = frame->prev) {
+    if (rb_curr_thread == rb_main_thread)
+      frame = ruby_frame;
+    else
+      frame = rb_main_thread->frame;
+
+    for (; frame; frame = frame->prev) {
 	rb_gc_mark_frame(frame);
 	if (frame->tmp) {
 	    struct FRAME *tmp = frame->tmp;
@@ -1454,16 +1466,35 @@ garbage_collect()
 	    }
 	}
     }
-    gc_mark((VALUE)ruby_scope, 0);
-    gc_mark((VALUE)ruby_dyna_vars, 0);
+
+    if (rb_curr_thread == rb_main_thread) {
+      gc_mark((VALUE)ruby_current_node, 0);
+      gc_mark((VALUE)ruby_scope, 0);
+      gc_mark((VALUE)ruby_dyna_vars, 0);
+    } else {
+      gc_mark((VALUE)rb_main_thread->node, 0);
+      gc_mark((VALUE)rb_main_thread->scope, 0);
+      gc_mark((VALUE)rb_main_thread->dyna_vars, 0);
+
+      /* scan the current thread's stack */
+      rb_gc_mark_locations((VALUE*)STACK_END, rb_curr_thread->stk_base);
+    }
+
     if (finalizer_table) {
-	mark_tbl(finalizer_table, 0);
+      mark_tbl(finalizer_table, 0);
     }
 
     FLUSH_REGISTER_WINDOWS;
     /* This assumes that all registers are saved into the jmp_buf (and stack) */
     rb_setjmp(save_regs_gc_mark);
     mark_locations_array((VALUE*)save_regs_gc_mark, sizeof(save_regs_gc_mark) / sizeof(VALUE *));
+
+    /* If this is not the main thread, we need to scan the C stack, so
+     * set STACK_END to the end of the C stack.
+     */
+    if (rb_curr_thread != rb_main_thread)
+      STACK_END = rb_main_thread->stk_pos;
+
 #if STACK_GROW_DIRECTION < 0
     rb_gc_mark_locations((VALUE*)STACK_END, rb_gc_stack_start);
 #elif STACK_GROW_DIRECTION > 0
@@ -1483,6 +1514,7 @@ garbage_collect()
     rb_gc_mark_locations((VALUE*)((char*)STACK_END + 2),
 			 (VALUE*)((char*)rb_gc_stack_start + 2));
 #endif
+
     rb_gc_mark_threads();
 
     /* mark protected global variables */
diff --git a/lib/logger.rb b/lib/logger.rb
index 15d95fc..5a6d467 100644
--- a/lib/logger.rb
+++ b/lib/logger.rb
@@ -170,7 +170,7 @@ require 'monitor'
 
 class Logger
   VERSION = "1.2.6"
-  id, name, rev = %w$Id$
+  id, name, rev = %w$Id logger.rb 1234$
   ProgName = "#{name.chomp(",v")}/#{rev}"
 
   class Error < RuntimeError; end
diff --git a/node.h b/node.h
index c209fa5..740e66a 100644
--- a/node.h
+++ b/node.h
@@ -411,8 +411,11 @@ struct rb_thread {
 
     size_t stk_len;
     size_t stk_max;
+    size_t stk_size;
     VALUE *stk_ptr;
     VALUE *stk_pos;
+    VALUE *stk_base;
+    VALUE *guard;
 #ifdef __ia64
     size_t bstr_len;
     size_t bstr_max;
diff --git a/signal.c b/signal.c
index fb21fd3..acac6a7 100644
--- a/signal.c
+++ b/signal.c
@@ -14,6 +14,7 @@
 
 #include "ruby.h"
 #include "rubysig.h"
+#include "node.h"
 #include <signal.h>
 #include <stdio.h>
 
@@ -428,15 +429,22 @@ typedef RETSIGTYPE (*sighandler_t)_((int));
 static sighandler_t
 ruby_signal(signum, handler)
     int signum;
-    sighandler_t handler;
+    void *handler;
 {
     struct sigaction sigact, old;
 
     rb_trap_accept_nativethreads[signum] = 0;
 
-    sigact.sa_handler = handler;
+    if (signum == SIGSEGV || signum == SIGBUS) {
+      sigact.sa_sigaction = handler;
+      sigact.sa_flags = (SA_ONSTACK | SA_RESETHAND | SA_SIGINFO);
+    } else {
+      sigact.sa_handler = handler;
+      sigact.sa_flags = 0;
+    }
+
     sigemptyset(&sigact.sa_mask);
-    sigact.sa_flags = 0;
+
 # ifdef SA_NOCLDWAIT
     if (signum == SIGCHLD && handler == SIG_IGN)
 	sigact.sa_flags |= SA_NOCLDWAIT;
@@ -599,7 +607,132 @@ sighandler(sig)
     }
 }
 
+#include <stdio.h>
+#ifdef HAVE_STDARG_PROTOTYPES
+#include <stdarg.h>
+#define va_init_list(a,b) va_start(a,b)
+#else
+#include <varargs.h>
+#define va_init_list(a,b) va_start(a)
+#endif
+
+void
+#ifdef HAVE_STDARG_PROTOTYPES
+sig_printf(const char *fmt, ...)
+#else
+  sig_printf(fmt, va_alist)
+     const char *fmt;
+    va_dcl
+#endif
+{
+  char buf[BUFSIZ];
+  va_list args;
+  FILE *out = stderr;
+
+  va_init_list(args, fmt);
+  vfprintf(out, fmt, args);
+  va_end(args);
+  fprintf(out, "\n");
+}
+
+static void
+dump_machine_state(uc)
+     ucontext_t *uc;
+{
+  const char *dump64 =
+    " ----------------- Register state dump ----------------------\n"
+    "rax = 0x%.16x  rbx    = 0x%.16x  rcx = 0x%.16x  rdx = 0x%.16x\n"
+    "rdi = 0x%.16x  rsi    = 0x%.16x  rbp = 0x%.16x  rsp = 0x%.16x\n"
+    "r8  = 0x%.16x  r9     = 0x%.16x  r10 = 0x%.16x  r11 = 0x%.16x\n"
+    "r12 = 0x%.16x  r13    = 0x%.16x  r14 = 0x%.16x  r15 = 0x%.16x\n"
+    "rip = 0x%.16x  rflags = 0x%.16x  cs  = 0x%.16x  fs  = 0x%.16x\n"
+    "gs  = 0x%.16x";
+
+  const char *dump32 =
+    " ----------------- Register state dump -------------------\n"
+    "eax = 0x%.8x  ebx    = 0x%.8x  ecx = 0x%.8x  edx = 0x%.8x\n"
+    "edi = 0x%.8x  esi    = 0x%.8x  ebp = 0x%.8x  esp = 0x%.8x\n"
+    "ss  = 0x%.8x  eflags = 0x%.8x  eip = 0x%.8x  cs  = 0x%.8x\n"
+    "ds  = 0x%.8x  es     = 0x%.8x  fs  = 0x%.8x  gs  = 0x%.8x\n";
+
+#if defined(__LP64__) && defined(__APPLE__)
+  sig_printf(dump64, uc->uc_mcontext->__ss.__rax, uc->uc_mcontext->__ss.__rbx,
+	     uc->uc_mcontext->__ss.__rcx, uc->uc_mcontext->__ss.__rdx, uc->uc_mcontext->__ss.__rdi,
+	     uc->uc_mcontext->__ss.__rsi, uc->uc_mcontext->__ss.__rbp, uc->uc_mcontext->__ss.__rsp,
+	     uc->uc_mcontext->__ss.__r8, uc->uc_mcontext->__ss.__r9, uc->uc_mcontext->__ss.__r10,
+	     uc->uc_mcontext->__ss.__r11, uc->uc_mcontext->__ss.__r12, uc->uc_mcontext->__ss.__r13,
+	     uc->uc_mcontext->__ss.__r14, uc->uc_mcontext->__ss.__r15, uc->uc_mcontext->__ss.__rip,
+	     uc->uc_mcontext->__ss.__rflags, uc->uc_mcontext->__ss.__cs, uc->uc_mcontext->__ss.__fs,
+	     uc->uc_mcontext->__ss.__gs);
+#elif !defined(__LP64__) && defined(__APPLE__)
+  sig_printf(dump32, uc->uc_mcontext->__ss.__eax, uc->uc_mcontext->__ss.__ebx,
+	     uc->uc_mcontext->__ss.__ecx, uc->uc_mcontext->__ss.__edx,
+	     uc->uc_mcontext->__ss.__edi, uc->uc_mcontext->__ss.__esi,
+	     uc->uc_mcontext->__ss.__ebp, uc->uc_mcontext->__ss.__esp,
+	     uc->uc_mcontext->__ss.__ss, uc->uc_mcontext->__ss.__eflags,
+	     uc->uc_mcontext->__ss.__eip, uc->uc_mcontext->__ss.__cs,
+	     uc->uc_mcontext->__ss.__ds, uc->uc_mcontext->__ss.__es,
+	     uc->uc_mcontext->__ss.__fs, uc->uc_mcontext->__ss.__gs);
+#elif defined(__i386__)
+  sig_printf(dump32, uc->uc_mcontext.gregs[REG_EAX], uc->uc_mcontext.gregs[REG_EBX],
+	     uc->uc_mcontext.gregs[REG_ECX], uc->uc_mcontext.gregs[REG_EDX],
+	     uc->uc_mcontext.gregs[REG_EDI], uc->uc_mcontext.gregs[REG_ESI],
+	     uc->uc_mcontext.gregs[REG_EBP], uc->uc_mcontext.gregs[REG_ESP],
+	     uc->uc_mcontext.gregs[REG_SS], uc->uc_mcontext.gregs[REG_EFL],
+	     uc->uc_mcontext.gregs[REG_EIP], uc->uc_mcontext.gregs[REG_EIP],
+	     uc->uc_mcontext.gregs[REG_DS], uc->uc_mcontext.gregs[REG_ES],
+	     uc->uc_mcontext.gregs[REG_FS], uc->uc_mcontext.gregs[REG_FS]);
+#elif defined(__x86_64__)
+  sig_printf(dump64, uc->uc_mcontext.gregs[REG_RAX], uc->uc_mcontext.gregs[REG_RBX],
+	     uc->uc_mcontext.gregs[REG_RCX], uc->uc_mcontext.gregs[REG_RDX],
+	     uc->uc_mcontext.gregs[REG_RDI], uc->uc_mcontext.gregs[REG_RSI],
+	     uc->uc_mcontext.gregs[REG_RBP], uc->uc_mcontext.gregs[REG_RSP],
+	     uc->uc_mcontext.gregs[REG_R8], uc->uc_mcontext.gregs[REG_R9],
+	     uc->uc_mcontext.gregs[REG_R10], uc->uc_mcontext.gregs[REG_R11],
+	     uc->uc_mcontext.gregs[REG_R12], uc->uc_mcontext.gregs[REG_R13],
+	     uc->uc_mcontext.gregs[REG_R14], uc->uc_mcontext.gregs[REG_R15],
+	     uc->uc_mcontext.gregs[REG_RIP], uc->uc_mcontext.gregs[REG_EFL],
+	     uc->uc_mcontext.gregs[REG_CSGSFS]);
+#else
+#endif
+}
+
+static int
+check_guard(caddr_t fault_addr, rb_thread_t th) {
+  if(fault_addr <= (caddr_t)rb_curr_thread->guard &&
+     fault_addr >= (caddr_t)rb_curr_thread->stk_ptr) {
+    return 1;
+  }
+  return 0;
+}
+
 #ifdef SIGBUS
+#ifdef POSIX_SIGNAL
+static void sigbus _((int, siginfo_t*, void*));
+static void
+sigbus(sig, ip, context)
+     int sig;
+     siginfo_t *ip;
+     void *context;
+{
+#if defined(HAVE_NATIVETHREAD) && defined(HAVE_NATIVETHREAD_KILL)
+  if (!is_ruby_native_thread() && !rb_trap_accept_nativethreads[sig]) {
+    sigsend_to_ruby_thread(sig);
+    return;
+  }
+#endif
+
+  dump_machine_state(context);
+  if (check_guard((caddr_t)ip->si_addr, rb_curr_thread)) {
+    /* we hit the guard page, print out a warning to help app developers */
+    rb_bug("Thread stack overflow! Try increasing it!");
+  } else {
+    rb_bug("Bus Error");
+  }
+}
+
+#else /* !defined(POSIX_SIGNAL) */
+
 static RETSIGTYPE sigbus _((int));
 static RETSIGTYPE
 sigbus(sig)
@@ -615,8 +748,38 @@ sigbus(sig)
     rb_bug("Bus Error");
 }
 #endif
+#endif
+
 
 #ifdef SIGSEGV
+#ifdef POSIX_SIGNAL
+static void sigsegv _((int, siginfo_t*, void*));
+static void
+sigsegv(sig, ip, context)
+     int sig;
+     siginfo_t *ip;
+     void *context;
+{
+#if defined(HAVE_NATIVETHREAD) && defined(HAVE_NATIVETHREAD_KILL)
+  if (!is_ruby_native_thread() && !rb_trap_accept_nativethreads[sig]) {
+    sigsend_to_ruby_thread(sig);
+    return;
+  }
+#endif
+
+  extern int ruby_gc_stress;
+  ruby_gc_stress = 0;
+  dump_machine_state(context);
+  if (check_guard((caddr_t)ip->si_addr, rb_curr_thread)) {
+    /* we hit the guard page, print out a warning to help app developers */
+    rb_bug("Thread stack overflow! Try increasing it!");
+  } else {
+    rb_bug("Segmentation fault");
+  }
+}
+
+#else /* !defined(POSIX_SIGNAL) */
+
 static RETSIGTYPE sigsegv _((int));
 static RETSIGTYPE
 sigsegv(sig)
@@ -634,6 +797,7 @@ sigsegv(sig)
     rb_bug("Segmentation fault");
 }
 #endif
+#endif
 
 #ifdef SIGPIPE
 static RETSIGTYPE sigpipe _((int));
@@ -705,7 +869,8 @@ static VALUE
 trap(arg)
     struct trap_arg *arg;
 {
-    sighandler_t func, oldfunc;
+    sighandler_t oldfunc;
+    void *func;
     VALUE command, oldcmd;
     int sig = -1;
     const char *s;
@@ -952,6 +1117,20 @@ sig_list()
 }
 
 static void
+create_sigstack()
+{
+  stack_t ss;
+  ss.ss_size = SIGSTKSZ;
+  ss.ss_sp = malloc(ss.ss_size);
+  ss.ss_flags = 0;
+  if (sigaltstack(&ss, NULL) < 0) {
+    free(ss.ss_sp);
+    fprintf(stderr, "Couldn't create signal stack! Error %d: %s\n", errno, strerror(errno));
+    exit(1);
+  }
+}
+
+static void
 install_sighandler(signum, handler)
     int signum;
     sighandler_t handler;
@@ -960,7 +1139,7 @@ install_sighandler(signum, handler)
 
     old = ruby_signal(signum, handler);
     if (old != SIG_DFL) {
-	ruby_signal(signum, old);
+       ruby_signal(signum, old);
     }
 }
 
@@ -1089,6 +1268,8 @@ Init_signal()
     rb_alias(rb_eSignal, rb_intern("signm"), rb_intern("message"));
     rb_define_method(rb_eInterrupt, "initialize", interrupt_init, -1);
 
+    create_sigstack();
+
     install_sighandler(SIGINT, sighandler);
 #ifdef SIGHUP
     install_sighandler(SIGHUP, sighandler);
patches/ruby/1.8.7/fix-irb-completion.diff000066400000000673147511530510014202 0ustar00diff --git a/lib/irb/completion.rb b/lib/irb/completion.rb
index 000658e..609dca3 100644
--- a/lib/irb/completion.rb
+++ b/lib/irb/completion.rb
@@ -157,7 +157,7 @@ module IRB
 	    end
 	    next if name != "IRB::Context" and 
 	      /^(IRB|SLex|RubyLex|RubyToken)/ =~ name
-	    candidates.concat m.instance_methods(false)
+	    candidates.concat m.instance_methods(false).map { |m| m.to_s }
 	  }
 	  candidates.sort!
 	  candidates.uniq!
patches/ruby/1.8.7/railsbench.patch000066400000033771147511530510013001 0ustar00diff --git a/gc.c b/gc.c
index 52b1c23..f774022 100644
--- a/gc.c
+++ b/gc.c
@@ -22,8 +22,16 @@
 #include <setjmp.h>
 #include <sys/types.h>
 
+#ifdef _WIN32
+#include <string.h>
+#else
+#include <strings.h>
+#endif
+
 #ifdef HAVE_SYS_TIME_H
 #include <sys/time.h>
+#elif defined(_WIN32)
+#include <time.h> 
 #endif
 
 #ifdef HAVE_SYS_RESOURCE_H
@@ -42,7 +50,6 @@ void rb_io_fptr_finalize _((struct rb_io_t*));
 #ifdef __CYGWIN__
 int _setjmp(), _longjmp();
 #endif
-
 /* Make alloca work the best possible way.  */
 #ifdef __GNUC__
 # ifndef atarist
@@ -205,8 +212,17 @@ ruby_xfree(x)
 	RUBY_CRITICAL(free(x));
 }
 
+#if HAVE_LONG_LONG
+#define GC_TIME_TYPE LONG_LONG
+#else
+#define GC_TIME_TYPE long
+#endif
+
 extern int ruby_in_compile;
 static int dont_gc;
+static int gc_statistics = 0;
+static GC_TIME_TYPE gc_time = 0;
+static int gc_collections = 0;
 static int during_gc;
 static int need_call_final = 0;
 static st_table *finalizer_table = 0;
@@ -241,7 +257,7 @@ rb_gc_enable()
  *  Disables garbage collection, returning <code>true</code> if garbage
  *  collection was already disabled.
  *
- *     GC.disable   #=> false
+ *     GC.disable   #=> false or true
  *     GC.disable   #=> true
  *
  */
@@ -255,6 +271,104 @@ rb_gc_disable()
     return old;
 }
 
+/*
+ *  call-seq:
+ *     GC.enable_stats    => true or false
+ *
+ *  Enables garbage collection statistics, returning <code>true</code> if garbage
+ *  collection statistics was already enabled.
+ *
+ *     GC.enable_stats   #=> false or true
+ *     GC.enable_stats   #=> true
+ *
+ */
+
+VALUE
+rb_gc_enable_stats()
+{
+    int old = gc_statistics;
+    gc_statistics = Qtrue;
+    return old;
+}
+
+/*
+ *  call-seq:
+ *     GC.disable_stats    => true or false
+ *
+ *  Disables garbage collection statistics, returning <code>true</code> if garbage
+ *  collection statistics was already disabled.
+ *
+ *     GC.disable_stats   #=> false or true
+ *     GC.disable_stats   #=> true
+ *
+ */
+
+VALUE
+rb_gc_disable_stats()
+{
+    int old = gc_statistics;
+    gc_statistics = Qfalse;
+    return old;
+}
+
+/*
+ *  call-seq:
+ *     GC.clear_stats    => nil
+ *
+ *  Clears garbage collection statistics, returning nil. This resets the number
+ *  of collections (GC.collections) and the time used (GC.time) to 0.
+ *
+ *     GC.clear_stats    #=> nil
+ *
+ */
+
+VALUE
+rb_gc_clear_stats()
+{
+    gc_collections = 0;
+    gc_time = 0;
+    return Qnil; 
+}
+
+/*
+ *  call-seq:
+ *     GC.collections    => Integer
+ *
+ *  Returns the number of garbage collections performed while GC statistics collection
+ *  was enabled.
+ *
+ *     GC.collections    #=> 35
+ *
+ */
+
+VALUE
+rb_gc_collections()
+{
+    return INT2NUM(gc_collections);
+}
+
+/*
+ *  call-seq:
+ *     GC.time    => Integer
+ *
+ *  Returns the time spent during garbage collection while GC statistics collection
+ *  was enabled (in micro seconds).
+ *
+ *     GC.time    #=> 20000
+ *
+ */
+
+VALUE
+rb_gc_time()
+{
+#if HAVE_LONG_LONG
+    return LL2NUM(gc_time);
+#else
+    return LONG2NUM(gc_time);
+#endif
+}
+
+
 VALUE rb_mGC;
 
 static struct gc_list {
@@ -346,7 +460,7 @@ typedef struct RVALUE {
 static RVALUE *freelist = 0;
 static RVALUE *deferred_final_list = 0;
 
-#define HEAPS_INCREMENT 10
+static int heaps_increment = 10;
 static struct heaps_slot {
     void *membase;
     RVALUE *slot;
@@ -355,13 +469,165 @@ static struct heaps_slot {
 static int heaps_length = 0;
 static int heaps_used   = 0;
 
-#define HEAP_MIN_SLOTS 10000
-static int heap_slots = HEAP_MIN_SLOTS;
+static int heap_min_slots = 10000;
+static int heap_slots = 10000;
+
+static int heap_free_min = 4096;
+static int heap_slots_increment = 10000;
+static double heap_slots_growth_factor = 1.8;
+
+static long initial_malloc_limit = GC_MALLOC_LIMIT;
 
-#define FREE_MIN  4096
+static int verbose_gc_stats = Qfalse;
+
+static FILE* gc_data_file = NULL;
 
 static RVALUE *himem, *lomem;
 
+static void set_gc_parameters()
+{
+    char *gc_stats_ptr, *min_slots_ptr, *free_min_ptr, *heap_slots_incr_ptr,
+      *heap_incr_ptr, *malloc_limit_ptr, *gc_heap_file_ptr, *heap_slots_growth_factor_ptr;
+
+    gc_data_file = stderr;
+
+    gc_stats_ptr = getenv("RUBY_GC_STATS");
+    if (gc_stats_ptr != NULL) {
+	int gc_stats_i = atoi(gc_stats_ptr);
+	if (gc_stats_i > 0) {
+	    verbose_gc_stats = Qtrue;
+	}
+    }
+
+    gc_heap_file_ptr = getenv("RUBY_GC_DATA_FILE");
+    if (gc_heap_file_ptr != NULL) {
+	FILE* data_file = fopen(gc_heap_file_ptr, "w");
+	if (data_file != NULL) {
+	    gc_data_file = data_file;
+	}
+	else {
+	    fprintf(stderr,
+		    "can't open gc log file %s for writing, using default\n", gc_heap_file_ptr);
+	}
+    }
+
+    min_slots_ptr = getenv("RUBY_HEAP_MIN_SLOTS");
+    if (min_slots_ptr != NULL) {
+	int min_slots_i = atoi(min_slots_ptr);
+        if (verbose_gc_stats) {
+	    fprintf(gc_data_file, "RUBY_HEAP_MIN_SLOTS=%s\n", min_slots_ptr);
+        }
+	if (min_slots_i > 0) {
+	    heap_slots = min_slots_i;
+	    heap_min_slots = min_slots_i;
+	}
+    }
+
+    free_min_ptr = getenv("RUBY_HEAP_FREE_MIN");
+    if (free_min_ptr != NULL) {
+	int free_min_i = atoi(free_min_ptr);
+        if (verbose_gc_stats) {
+	    fprintf(gc_data_file, "RUBY_HEAP_FREE_MIN=%s\n", free_min_ptr);
+	}
+	if (free_min_i > 0) {
+	    heap_free_min = free_min_i;
+	}
+    }
+
+    heap_incr_ptr = getenv("RUBY_HEAP_INCREMENT");
+    if (heap_incr_ptr != NULL) {
+	int heap_incr_i = atoi(heap_incr_ptr);
+        if (verbose_gc_stats) {
+	    fprintf(gc_data_file, "RUBY_HEAP_INCREMENT=%s\n", heap_incr_ptr);
+	}
+	if (heap_incr_i > 0) {
+	    heaps_increment = heap_incr_i;
+	}
+    }
+
+    heap_slots_incr_ptr = getenv("RUBY_HEAP_SLOTS_INCREMENT");
+    if (heap_slots_incr_ptr != NULL) {
+	int heap_slots_incr_i = atoi(heap_slots_incr_ptr);
+        if (verbose_gc_stats) {
+	    fprintf(gc_data_file, "RUBY_HEAP_SLOTS_INCREMENT=%s\n", heap_slots_incr_ptr);
+	}
+	if (heap_slots_incr_i > 0) {
+	    heap_slots_increment = heap_slots_incr_i;
+	}
+    }
+
+    heap_slots_growth_factor_ptr = getenv("RUBY_HEAP_SLOTS_GROWTH_FACTOR");
+    if (heap_slots_growth_factor_ptr != NULL) {
+	double heap_slots_growth_factor_d = atoi(heap_slots_growth_factor_ptr);
+        if (verbose_gc_stats) {
+	    fprintf(gc_data_file, "RUBY_HEAP_SLOTS_GROWTH_FACTOR=%s\n", heap_slots_growth_factor_ptr);
+	}
+	if (heap_slots_growth_factor_d > 0) {
+	    heap_slots_growth_factor = heap_slots_growth_factor_d;
+	}
+    }
+
+    malloc_limit_ptr = getenv("RUBY_GC_MALLOC_LIMIT");
+    if (malloc_limit_ptr != NULL) {
+	int malloc_limit_i = atol(malloc_limit_ptr);
+        if (verbose_gc_stats) {
+	    fprintf(gc_data_file, "RUBY_GC_MALLOC_LIMIT=%s\n", malloc_limit_ptr);
+	}
+	if (malloc_limit_i > 0) {
+	    initial_malloc_limit = malloc_limit_i;
+	}
+    }
+}
+
+/*
+ *  call-seq:
+ *     GC.dump    => nil
+ *
+ *  dumps information about the current GC data structures to the GC log file
+ *
+ *     GC.dump    #=> nil
+ *
+ */
+
+VALUE
+rb_gc_dump()
+{
+    int i;
+
+    for (i = 0; i < heaps_used; i++) {
+	int heap_size = heaps[i].limit;
+	fprintf(gc_data_file, "HEAP[%2d]: size=%7d\n", i, heap_size);
+    }
+
+    return Qnil;
+}
+
+/*
+ *  call-seq:
+ *     GC.log String  => String
+ *
+ *  Logs string to the GC data file and returns it.
+ *
+ *     GC.log "manual GC call"    #=> "manual GC call"
+ *
+ */
+
+VALUE
+rb_gc_log(self, original_str)
+     VALUE self, original_str;
+{
+    if (original_str == Qnil) {
+        fprintf(gc_data_file, "\n");
+    }
+    else {
+        VALUE str = StringValue(original_str);
+        char *p = RSTRING(str)->ptr;
+        fprintf(gc_data_file, "%s\n", p);
+    }
+    return original_str;
+}
+
+
 static void
 add_heap()
 {
@@ -372,7 +638,7 @@ add_heap()
 	struct heaps_slot *p;
 	int length;
 
-	heaps_length += HEAPS_INCREMENT;
+	heaps_length += heaps_increment;
 	length = heaps_length*sizeof(struct heaps_slot);
 	RUBY_CRITICAL(
 	    if (heaps_used > 0) {
@@ -388,10 +654,10 @@ add_heap()
     for (;;) {
 	RUBY_CRITICAL(p = (RVALUE*)malloc(sizeof(RVALUE)*(heap_slots+1)));
 	if (p == 0) {
-	    if (heap_slots == HEAP_MIN_SLOTS) {
+	    if (heap_slots == heap_min_slots) {
 		rb_memerror();
 	    }
-	    heap_slots = HEAP_MIN_SLOTS;
+	    heap_slots = heap_min_slots;
 	    continue;
 	}
         heaps[heaps_used].membase = p;
@@ -407,8 +673,9 @@ add_heap()
     if (lomem == 0 || lomem > p) lomem = p;
     if (himem < pend) himem = pend;
     heaps_used++;
-    heap_slots *= 1.8;
-    if (heap_slots <= 0) heap_slots = HEAP_MIN_SLOTS;
+    heap_slots += heap_slots_increment;
+    heap_slots_increment *= heap_slots_growth_factor;
+    if (heap_slots <= 0) heap_slots = heap_min_slots;
 
     while (p < pend) {
 	p->as.free.flags = 0;
@@ -1102,6 +1369,39 @@ finalize_list(p)
     }
 }
 
+static char* obj_type(int tp)
+{
+    switch (tp) {
+	case T_NIL    : return "NIL";   
+	case T_OBJECT : return "OBJECT";
+	case T_CLASS  : return "CLASS";
+	case T_ICLASS : return "ICLASS";
+	case T_MODULE : return "MODULE";
+	case T_FLOAT  : return "FLOAT";
+	case T_STRING : return "STRING";
+	case T_REGEXP : return "REGEXP";
+	case T_ARRAY  : return "ARRAY";
+	case T_FIXNUM : return "FIXNUM";
+	case T_HASH   : return "HASH";
+	case T_STRUCT : return "STRUCT";
+	case T_BIGNUM : return "BIGNUM";
+	case T_FILE   : return "FILE";
+	    
+	case T_TRUE   : return "TRUE";
+	case T_FALSE  : return "FALSE";
+	case T_DATA   : return "DATA";
+	case T_MATCH  : return "MATCH";
+	case T_SYMBOL : return "SYMBOL";
+	    
+	case T_BLKTAG : return "BLKTAG";
+	case T_UNDEF  : return "UNDEF";
+	case T_VARMAP : return "VARMAP";
+	case T_SCOPE  : return "SCOPE";
+	case T_NODE   : return "NODE";
+	default: return "____";
+    }
+}
+
 static void
 free_unused_heaps()
 {
@@ -1134,12 +1434,21 @@ gc_sweep()
     unsigned long live = 0;
     unsigned long free_min = 0;
 
+    unsigned long really_freed = 0;
+    int free_counts[256];
+    int live_counts[256];
+    int do_gc_stats = gc_statistics & verbose_gc_stats;
+
     for (i = 0; i < heaps_used; i++) {
         free_min += heaps[i].limit;
     }
     free_min = free_min * 0.2;
-    if (free_min < FREE_MIN)
-        free_min = FREE_MIN;
+    if (free_min < heap_free_min)
+        free_min = heap_free_min;
+
+    if (do_gc_stats) {
+	for (i = 0 ; i< 256; i++) { free_counts[i] = live_counts[i] = 0; }
+    }
 
     if (ruby_in_compile && ruby_parser_stack_on_heap()) {
 	/* should not reclaim nodes during compilation
@@ -1174,6 +1483,9 @@ gc_sweep()
 		if (p->as.basic.flags &&
 		    ((deferred = obj_free((VALUE)p)) ||
 		     ((FL_TEST(p, FL_FINALIZE)) && need_call_final))) {
+		    if (do_gc_stats) {
+			really_freed++;
+		    }
 		    if (!deferred) {
 			p->as.free.flags = T_DEFERRED;
 			RDATA(p)->dfree = 0;
@@ -1183,6 +1495,12 @@ gc_sweep()
 		    final_list = p;
 		}
 		else {
+		    if (do_gc_stats) {
+		        int obt = p->as.basic.flags & T_MASK;
+		        if (obt) {
+		            free_counts[obt]++;
+		        }
+		    }
 		    add_freelist(p);
 		}
 		n++;
@@ -1194,6 +1512,9 @@ gc_sweep()
 	    else {
 		RBASIC(p)->flags &= ~FL_MARK;
 		live++;
+		if (do_gc_stats) {
+ 		    live_counts[RANY((VALUE)p)->as.basic.flags & T_MASK]++;
+ 		}
 	    }
 	    p++;
 	}
@@ -1212,7 +1533,7 @@ gc_sweep()
     }
     if (malloc_increase > malloc_limit) {
 	malloc_limit += (malloc_increase - malloc_limit) * (double)live / (live + freed);
-	if (malloc_limit < GC_MALLOC_LIMIT) malloc_limit = GC_MALLOC_LIMIT;
+	if (malloc_limit < initial_malloc_limit) malloc_limit = initial_malloc_limit;
     }
     malloc_increase = 0;
     if (freed < free_min) {
@@ -1220,6 +1541,20 @@ gc_sweep()
     }
     during_gc = 0;
 
+    if (do_gc_stats) {
+	fprintf(gc_data_file, "objects processed: %.7d\n", live+freed);
+	fprintf(gc_data_file, "live objects	: %.7d\n", live);
+	fprintf(gc_data_file, "freelist objects : %.7d\n", freed - really_freed);
+	fprintf(gc_data_file, "freed objects	: %.7d\n", really_freed);
+	for(i=0; i<256; i++) {
+	    if (free_counts[i]>0) {
+		fprintf(gc_data_file,
+			"kept %.7d / freed %.7d objects of type %s\n",
+			live_counts[i], free_counts[i], obj_type(i));
+	    }
+	}
+    }
+
     /* clear finalization list */
     if (final_list) {
 	deferred_final_list = final_list;
@@ -1423,6 +1758,7 @@ garbage_collect()
     struct gc_list *list;
     struct FRAME * volatile frame; /* gcc 2.7.2.3 -O2 bug??  */
     jmp_buf save_regs_gc_mark;
+    struct timeval gctv1, gctv2;
     SET_STACK_END;
 
 #ifdef HAVE_NATIVETHREAD
@@ -1439,6 +1775,14 @@ garbage_collect()
     if (during_gc) return;
     during_gc++;
 
+    if (gc_statistics) {
+        gc_collections++;
+	gettimeofday(&gctv1, NULL);
+        if (verbose_gc_stats) {
+	    fprintf(gc_data_file, "Garbage collection started\n");
+	}
+    }
+
     init_mark_stack();
 
     gc_mark((VALUE)ruby_current_node, 0);
@@ -1514,6 +1858,17 @@ garbage_collect()
     } while (!MARK_STACK_EMPTY);
 
     gc_sweep();
+
+    if (gc_statistics) {
+        GC_TIME_TYPE musecs_used;
+	gettimeofday(&gctv2, NULL);
+	musecs_used = ((GC_TIME_TYPE)(gctv2.tv_sec - gctv1.tv_sec) * 1000000) + (gctv2.tv_usec - gctv1.tv_usec);
+	gc_time += musecs_used;
+
+	if (verbose_gc_stats) {
+	    fprintf(gc_data_file, "GC time: %d msec\n", musecs_used / 1000);
+	}
+    }
 }
 
 void
@@ -1695,6 +2050,7 @@ Init_heap()
     if (!rb_gc_stack_start) {
 	Init_stack(0);
     }
+    set_gc_parameters();
     add_heap();
 }
 
@@ -2163,6 +2519,14 @@ Init_GC()
     rb_define_singleton_method(rb_mGC, "stress=", gc_stress_set, 1);
     rb_define_method(rb_mGC, "garbage_collect", rb_gc_start, 0);
 
+    rb_define_singleton_method(rb_mGC, "enable_stats", rb_gc_enable_stats, 0);
+    rb_define_singleton_method(rb_mGC, "disable_stats", rb_gc_disable_stats, 0);
+    rb_define_singleton_method(rb_mGC, "clear_stats", rb_gc_clear_stats, 0);
+    rb_define_singleton_method(rb_mGC, "collections", rb_gc_collections, 0);
+    rb_define_singleton_method(rb_mGC, "time", rb_gc_time, 0);
+    rb_define_singleton_method(rb_mGC, "dump", rb_gc_dump, 0);
+    rb_define_singleton_method(rb_mGC, "log", rb_gc_log, 1);
+
     rb_mObSpace = rb_define_module("ObjectSpace");
     rb_define_module_function(rb_mObSpace, "each_object", os_each_obj, -1);
     rb_define_module_function(rb_mObSpace, "garbage_collect", rb_gc_start, 0);
patches/ruby/1.8.7/osx-arch-fix.patch000066400000000617147511530510013170 0ustar00diff --git a/Makefile.in b/Makefile.in
index 656ae90..f976cf1 100644
--- a/Makefile.in
+++ b/Makefile.in
@@ -45,7 +45,7 @@ XLDFLAGS = @XLDFLAGS@ $(EXTLDFLAGS)
 EXTLIBS = 
 LIBS = @LIBS@ $(EXTLIBS)
 MISSING = @LIBOBJS@ @ALLOCA@
-LDSHARED = @LIBRUBY_LDSHARED@
+LDSHARED = @LIBRUBY_LDSHARED@ $(LDFLAGS)
 DLDFLAGS = @LIBRUBY_DLDFLAGS@ $(EXTLDFLAGS) @ARCH_FLAG@
 SOLIBS = @SOLIBS@
 MAINLIBS = @MAINLIBS@
patches/ruby/1.8.7/readline-fix.diff000066400000002036147511530510013035 0ustar00diff --git a/ext/readline/extconf.rb b/ext/readline/extconf.rb
index b820c0b..f299cba 100644
--- a/ext/readline/extconf.rb
+++ b/ext/readline/extconf.rb
@@ -59,6 +59,9 @@ have_func("rl_cleanup_after_signal")
 have_func("rl_clear_signals")
 have_func("rl_vi_editing_mode")
 have_func("rl_emacs_editing_mode")
+# workaround for native windows.
+/mswin|bccwin|mingw/ !~ RUBY_PLATFORM && have_readline_var("rl_catch_sigwinch")
+/mswin|bccwin|mingw/ !~ RUBY_PLATFORM && have_readline_var("rl_catch_signals")
 have_func("replace_history_entry")
 have_func("remove_history")
 create_makefile("readline")
diff --git a/ext/readline/readline.c b/ext/readline/readline.c
index c9acaad..637cb99 100644
--- a/ext/readline/readline.c
+++ b/ext/readline/readline.c
@@ -833,6 +833,12 @@ Init_readline()
 #ifdef HAVE_RL_EVENT_HOOK
     rl_event_hook = readline_event;
 #endif
+#ifdef HAVE_RL_CATCH_SIGNALS
+    rl_catch_signals = 0;
+#endif
+#ifdef HAVE_RL_CATCH_SIGWINCH
+    rl_catch_sigwinch = 0;
+#endif
 #ifdef HAVE_RL_CLEAR_SIGNALS
     rl_clear_signals();
 #endif
patches/ruby/1.8.7/stdout-rouge-fix.patch000066400000001317147511530510014103 0ustar00diff --git a/lib/mkmf.rb b/lib/mkmf.rb
index c9e738a..7a8004d 100644
--- a/lib/mkmf.rb
+++ b/lib/mkmf.rb
@@ -201,20 +201,26 @@ end
 module Logging
   @log = nil
   @logfile = 'mkmf.log'
-  @orgerr = $stderr.dup
-  @orgout = $stdout.dup
   @postpone = 0
   @quiet = $extmk
 
   def self::open
     @log ||= File::open(@logfile, 'w')
     @log.sync = true
+    orgerr = $stderr.dup
+    orgout = $stdout.dup
     $stderr.reopen(@log)
     $stdout.reopen(@log)
     yield
   ensure
-    $stderr.reopen(@orgerr)
-    $stdout.reopen(@orgout)
+    if orgerr
+      $stderr.reopen(orgerr)
+      orgerr.close
+    end
+    if orgout
+      $stdout.reopen(orgout)
+      orgout.close
+    end
   end
 
   def self::message(*s)
patches/ruby/2.1.6/openssl3.patch000066400000003333147511530510012415 0ustar00diff --git a/ext/openssl/extconf.rb b/ext/openssl/extconf.rb
index 8c04cb5..132d803 100644
--- a/ext/openssl/extconf.rb
+++ b/ext/openssl/extconf.rb
@@ -104,6 +104,9 @@
 have_func("SSLv2_method")
 have_func("SSLv2_server_method")
 have_func("SSLv2_client_method")
+have_func("SSLv3_method")
+have_func("SSLv3_server_method")
+have_func("SSLv3_client_method")
 have_func("TLSv1_1_method")
 have_func("TLSv1_1_server_method")
 have_func("TLSv1_1_client_method")
diff --git a/ext/openssl/ossl_ssl.c b/ext/openssl/ossl_ssl.c
index f7cb7f0..47111f6 100644
--- a/ext/openssl/ossl_ssl.c
+++ b/ext/openssl/ossl_ssl.c
@@ -109,9 +109,12 @@ static const struct {
     OSSL_SSL_METHOD_ENTRY(SSLv2_server),
     OSSL_SSL_METHOD_ENTRY(SSLv2_client),
 #endif
+#if defined(HAVE_SSLV3_METHOD) && defined(HAVE_SSLV3_SERVER_METHOD) && \
+        defined(HAVE_SSLV3_CLIENT_METHOD)
     OSSL_SSL_METHOD_ENTRY(SSLv3),
     OSSL_SSL_METHOD_ENTRY(SSLv3_server),
     OSSL_SSL_METHOD_ENTRY(SSLv3_client),
+#endif
     OSSL_SSL_METHOD_ENTRY(SSLv23),
     OSSL_SSL_METHOD_ENTRY(SSLv23_server),
     OSSL_SSL_METHOD_ENTRY(SSLv23_client),
diff --git a/test/openssl/test_ssl.rb b/test/openssl/test_ssl.rb
index 07e081b..0cbfcba 100644
--- a/test/openssl/test_ssl.rb
+++ b/test/openssl/test_ssl.rb
@@ -912,7 +912,7 @@ def test_unset_OP_ALL
   # that has been marked as forbidden, therefore either of these may be raised
   HANDSHAKE_ERRORS = [OpenSSL::SSL::SSLError, Errno::ECONNRESET]

-if OpenSSL::SSL::SSLContext::METHODS.include? :TLSv1
+if OpenSSL::SSL::SSLContext::METHODS.include?(:TLSv1) && OpenSSL::SSL::SSLContext::METHODS.include?(:SSLv3)

   def test_forbid_ssl_v3_for_client
     ctx_proc = Proc.new { |ctx| ctx.options = OpenSSL::SSL::OP_ALL | OpenSSL::SSL::OP_NO_SSLv3 }
patches/ruby/2.2.5/openssl3.patch000066400000002126147511530510012414 0ustar00diff --git a/ext/openssl/extconf.rb b/ext/openssl/extconf.rb
index 8c04cb5..132d803 100644
--- a/ext/openssl/extconf.rb
+++ b/ext/openssl/extconf.rb
@@ -104,6 +104,9 @@
 have_func("SSLv2_method")
 have_func("SSLv2_server_method")
 have_func("SSLv2_client_method")
+have_func("SSLv3_method")
+have_func("SSLv3_server_method")
+have_func("SSLv3_client_method")
 have_func("TLSv1_1_method")
 have_func("TLSv1_1_server_method")
 have_func("TLSv1_1_client_method")
diff --git a/ext/openssl/ossl_ssl.c b/ext/openssl/ossl_ssl.c
index f7cb7f0..47111f6 100644
--- a/ext/openssl/ossl_ssl.c
+++ b/ext/openssl/ossl_ssl.c
@@ -109,9 +109,12 @@ static const struct {
     OSSL_SSL_METHOD_ENTRY(SSLv2_server),
     OSSL_SSL_METHOD_ENTRY(SSLv2_client),
 #endif
+#if defined(HAVE_SSLV3_METHOD) && defined(HAVE_SSLV3_SERVER_METHOD) && \
+        defined(HAVE_SSLV3_CLIENT_METHOD)
     OSSL_SSL_METHOD_ENTRY(SSLv3),
     OSSL_SSL_METHOD_ENTRY(SSLv3_server),
     OSSL_SSL_METHOD_ENTRY(SSLv3_client),
+#endif
     OSSL_SSL_METHOD_ENTRY(SSLv23),
     OSSL_SSL_METHOD_ENTRY(SSLv23_server),
     OSSL_SSL_METHOD_ENTRY(SSLv23_client),
patches/ruby/2.2.5/fix_installing_bundled_gems.patch000066400000002214147511530510016366 0ustar00--- a/tool/rbinstall.rb
+++ b/tool/rbinstall.rb
@@ -719,15 +719,15 @@ install?(:ext, :comm, :gem) do
     directories = Gem.ensure_gem_subdirectories(gem_dir, :mode => $dir_mode)
     prepare "bundle gems", gem_dir, directories
     Dir.glob(srcdir+'/gems/*.gem').each do |gem|
-      Gem.install gem, Gem::Requirement.default, :install_dir => with_destdir(Gem.dir), :domain => :local, :ignore_dependencies => true
+      Gem.install gem, Gem::Requirement.default, :install_dir => with_destdir(gem_dir), :domain => :local, :ignore_dependencies => true
       gemname = Pathname(gem).basename
       puts "#{" "*30}#{gemname}"
     end
     # fix directory permissions
     # TODO: Gem.install should accept :dir_mode option or something
-    File.chmod($dir_mode, *Dir.glob(with_destdir(Gem.dir)+"/**/"))
+    File.chmod($dir_mode, *Dir.glob(with_destdir(gem_dir)+"/**/"))
     # fix .gemspec permissions
-    File.chmod($data_mode, *Dir.glob(with_destdir(Gem.dir)+"/specifications/*.gemspec"))
+    File.chmod($data_mode, *Dir.glob(with_destdir(gem_dir)+"/specifications/*.gemspec"))
   else
     puts "skip installing bundle gems because of lacking zlib"
   end
patches/ruby/2.3.2/random_c_using_NR_prefix.patch000066400000001011147511530520015600 0ustar00--- a/random.c
+++ b/random.c
@@ -521,7 +521,7 @@
     CryptGenRandom(prov, size, seed);
     return 0;
 }
-#elif defined __linux__ && defined SYS_getrandom
+#elif defined __linux__ && defined __NR_getrandom
 #include <linux/random.h>

 # ifndef GRND_NONBLOCK
@@ -538,7 +538,7 @@
 	if (!need_secure)
 	    flags = GRND_NONBLOCK;
 	errno = 0;
-	ret = syscall(SYS_getrandom, seed, size, flags);
+	ret = syscall(__NR_getrandom, seed, size, flags);
 	if (errno == ENOSYS) {
 	    ATOMIC_SET(try_syscall, 0);
 	    return -1;
patches/ruby/2.2.10/fix_installing_bundled_gems.patch000066400000002214147511530520016443 0ustar00--- a/tool/rbinstall.rb
+++ b/tool/rbinstall.rb
@@ -719,15 +719,15 @@ install?(:ext, :comm, :gem) do
     directories = Gem.ensure_gem_subdirectories(gem_dir, :mode => $dir_mode)
     prepare "bundle gems", gem_dir, directories
     Dir.glob(srcdir+'/gems/*.gem').each do |gem|
-      Gem.install gem, Gem::Requirement.default, :install_dir => with_destdir(Gem.dir), :domain => :local, :ignore_dependencies => true
+      Gem.install gem, Gem::Requirement.default, :install_dir => with_destdir(gem_dir), :domain => :local, :ignore_dependencies => true
       gemname = Pathname(gem).basename
       puts "#{" "*30}#{gemname}"
     end
     # fix directory permissions
     # TODO: Gem.install should accept :dir_mode option or something
-    File.chmod($dir_mode, *Dir.glob(with_destdir(Gem.dir)+"/**/"))
+    File.chmod($dir_mode, *Dir.glob(with_destdir(gem_dir)+"/**/"))
     # fix .gemspec permissions
-    File.chmod($data_mode, *Dir.glob(with_destdir(Gem.dir)+"/specifications/*.gemspec"))
+    File.chmod($data_mode, *Dir.glob(with_destdir(gem_dir)+"/specifications/*.gemspec"))
   else
     puts "skip installing bundle gems because of lacking zlib"
   end
patches/ruby/2.2.2/openssl3.patch000066400000003333147511530520012413 0ustar00diff --git a/ext/openssl/extconf.rb b/ext/openssl/extconf.rb
index 8c04cb5..132d803 100644
--- a/ext/openssl/extconf.rb
+++ b/ext/openssl/extconf.rb
@@ -104,6 +104,9 @@
 have_func("SSLv2_method")
 have_func("SSLv2_server_method")
 have_func("SSLv2_client_method")
+have_func("SSLv3_method")
+have_func("SSLv3_server_method")
+have_func("SSLv3_client_method")
 have_func("TLSv1_1_method")
 have_func("TLSv1_1_server_method")
 have_func("TLSv1_1_client_method")
diff --git a/ext/openssl/ossl_ssl.c b/ext/openssl/ossl_ssl.c
index f7cb7f0..47111f6 100644
--- a/ext/openssl/ossl_ssl.c
+++ b/ext/openssl/ossl_ssl.c
@@ -109,9 +109,12 @@ static const struct {
     OSSL_SSL_METHOD_ENTRY(SSLv2_server),
     OSSL_SSL_METHOD_ENTRY(SSLv2_client),
 #endif
+#if defined(HAVE_SSLV3_METHOD) && defined(HAVE_SSLV3_SERVER_METHOD) && \
+        defined(HAVE_SSLV3_CLIENT_METHOD)
     OSSL_SSL_METHOD_ENTRY(SSLv3),
     OSSL_SSL_METHOD_ENTRY(SSLv3_server),
     OSSL_SSL_METHOD_ENTRY(SSLv3_client),
+#endif
     OSSL_SSL_METHOD_ENTRY(SSLv23),
     OSSL_SSL_METHOD_ENTRY(SSLv23_server),
     OSSL_SSL_METHOD_ENTRY(SSLv23_client),
diff --git a/test/openssl/test_ssl.rb b/test/openssl/test_ssl.rb
index 07e081b..0cbfcba 100644
--- a/test/openssl/test_ssl.rb
+++ b/test/openssl/test_ssl.rb
@@ -912,7 +912,7 @@ def test_unset_OP_ALL
   # that has been marked as forbidden, therefore either of these may be raised
   HANDSHAKE_ERRORS = [OpenSSL::SSL::SSLError, Errno::ECONNRESET]

-if OpenSSL::SSL::SSLContext::METHODS.include? :TLSv1
+if OpenSSL::SSL::SSLContext::METHODS.include?(:TLSv1) && OpenSSL::SSL::SSLContext::METHODS.include?(:SSLv3)

   def test_forbid_ssl_v3_for_client
     ctx_proc = Proc.new { |ctx| ctx.options = OpenSSL::SSL::OP_ALL | OpenSSL::SSL::OP_NO_SSLv3 }
patches/ruby/2.2.2/fix_installing_bundled_gems.patch000066400000002214147511530520016364 0ustar00--- a/tool/rbinstall.rb
+++ b/tool/rbinstall.rb
@@ -719,15 +719,15 @@ install?(:ext, :comm, :gem) do
     directories = Gem.ensure_gem_subdirectories(gem_dir, :mode => $dir_mode)
     prepare "bundle gems", gem_dir, directories
     Dir.glob(srcdir+'/gems/*.gem').each do |gem|
-      Gem.install gem, Gem::Requirement.default, :install_dir => with_destdir(Gem.dir), :domain => :local, :ignore_dependencies => true
+      Gem.install gem, Gem::Requirement.default, :install_dir => with_destdir(gem_dir), :domain => :local, :ignore_dependencies => true
       gemname = Pathname(gem).basename
       puts "#{" "*30}#{gemname}"
     end
     # fix directory permissions
     # TODO: Gem.install should accept :dir_mode option or something
-    File.chmod($dir_mode, *Dir.glob(with_destdir(Gem.dir)+"/**/"))
+    File.chmod($dir_mode, *Dir.glob(with_destdir(gem_dir)+"/**/"))
     # fix .gemspec permissions
-    File.chmod($data_mode, *Dir.glob(with_destdir(Gem.dir)+"/specifications/*.gemspec"))
+    File.chmod($data_mode, *Dir.glob(with_destdir(gem_dir)+"/specifications/*.gemspec"))
   else
     puts "skip installing bundle gems because of lacking zlib"
   end
patches/ruby/2.2.8/fix_installing_bundled_gems.patch000066400000002214147511530520016372 0ustar00--- a/tool/rbinstall.rb
+++ b/tool/rbinstall.rb
@@ -719,15 +719,15 @@ install?(:ext, :comm, :gem) do
     directories = Gem.ensure_gem_subdirectories(gem_dir, :mode => $dir_mode)
     prepare "bundle gems", gem_dir, directories
     Dir.glob(srcdir+'/gems/*.gem').each do |gem|
-      Gem.install gem, Gem::Requirement.default, :install_dir => with_destdir(Gem.dir), :domain => :local, :ignore_dependencies => true
+      Gem.install gem, Gem::Requirement.default, :install_dir => with_destdir(gem_dir), :domain => :local, :ignore_dependencies => true
       gemname = Pathname(gem).basename
       puts "#{" "*30}#{gemname}"
     end
     # fix directory permissions
     # TODO: Gem.install should accept :dir_mode option or something
-    File.chmod($dir_mode, *Dir.glob(with_destdir(Gem.dir)+"/**/"))
+    File.chmod($dir_mode, *Dir.glob(with_destdir(gem_dir)+"/**/"))
     # fix .gemspec permissions
-    File.chmod($data_mode, *Dir.glob(with_destdir(Gem.dir)+"/specifications/*.gemspec"))
+    File.chmod($data_mode, *Dir.glob(with_destdir(gem_dir)+"/specifications/*.gemspec"))
   else
     puts "skip installing bundle gems because of lacking zlib"
   end
patches/ruby/2.1.1/openssl3.patch000066400000003333147511530520012411 0ustar00diff --git a/ext/openssl/extconf.rb b/ext/openssl/extconf.rb
index 8c04cb5..132d803 100644
--- a/ext/openssl/extconf.rb
+++ b/ext/openssl/extconf.rb
@@ -104,6 +104,9 @@
 have_func("SSLv2_method")
 have_func("SSLv2_server_method")
 have_func("SSLv2_client_method")
+have_func("SSLv3_method")
+have_func("SSLv3_server_method")
+have_func("SSLv3_client_method")
 have_func("TLSv1_1_method")
 have_func("TLSv1_1_server_method")
 have_func("TLSv1_1_client_method")
diff --git a/ext/openssl/ossl_ssl.c b/ext/openssl/ossl_ssl.c
index f7cb7f0..47111f6 100644
--- a/ext/openssl/ossl_ssl.c
+++ b/ext/openssl/ossl_ssl.c
@@ -109,9 +109,12 @@ static const struct {
     OSSL_SSL_METHOD_ENTRY(SSLv2_server),
     OSSL_SSL_METHOD_ENTRY(SSLv2_client),
 #endif
+#if defined(HAVE_SSLV3_METHOD) && defined(HAVE_SSLV3_SERVER_METHOD) && \
+        defined(HAVE_SSLV3_CLIENT_METHOD)
     OSSL_SSL_METHOD_ENTRY(SSLv3),
     OSSL_SSL_METHOD_ENTRY(SSLv3_server),
     OSSL_SSL_METHOD_ENTRY(SSLv3_client),
+#endif
     OSSL_SSL_METHOD_ENTRY(SSLv23),
     OSSL_SSL_METHOD_ENTRY(SSLv23_server),
     OSSL_SSL_METHOD_ENTRY(SSLv23_client),
diff --git a/test/openssl/test_ssl.rb b/test/openssl/test_ssl.rb
index 07e081b..0cbfcba 100644
--- a/test/openssl/test_ssl.rb
+++ b/test/openssl/test_ssl.rb
@@ -912,7 +912,7 @@ def test_unset_OP_ALL
   # that has been marked as forbidden, therefore either of these may be raised
   HANDSHAKE_ERRORS = [OpenSSL::SSL::SSLError, Errno::ECONNRESET]

-if OpenSSL::SSL::SSLContext::METHODS.include? :TLSv1
+if OpenSSL::SSL::SSLContext::METHODS.include?(:TLSv1) && OpenSSL::SSL::SSLContext::METHODS.include?(:SSLv3)

   def test_forbid_ssl_v3_for_client
     ctx_proc = Proc.new { |ctx| ctx.options = OpenSSL::SSL::OP_ALL | OpenSSL::SSL::OP_NO_SSLv3 }
patches/ruby/2.1.1/libyaml.patch000066400000004633147511530520012300 0ustar00diff -uw ruby-2.1.1/ext/psych/yaml/config.h ruby-2.1.2/ext/psych/yaml/config.h
--- ruby-2.1.1/ext/psych/yaml/config.h	2014-02-24 05:24:15.000000000 +0100
+++ ruby-2.1.2/ext/psych/yaml/config.h	2014-05-04 17:45:33.000000000 +0200
@@ -1,11 +1,10 @@
-
 #define PACKAGE_NAME "yaml"
 #define PACKAGE_TARNAME "yaml"
-#define PACKAGE_VERSION "0.1.5"
-#define PACKAGE_STRING "yaml 0.1.5"
+#define PACKAGE_VERSION "0.1.6"
+#define PACKAGE_STRING "yaml 0.1.6"
 #define PACKAGE_BUGREPORT "http://pyyaml.org/newticket?component libyaml"
 #define PACKAGE_URL ""
 #define YAML_VERSION_MAJOR 0
 #define YAML_VERSION_MINOR 1
-#define YAML_VERSION_PATCH 5
-#define YAML_VERSION_STRING "0.1.5"
+#define YAML_VERSION_PATCH 6
+#define YAML_VERSION_STRING "0.1.6"
diff -uw ruby-2.1.1/ext/psych/yaml/scanner.c ruby-2.1.2/ext/psych/yaml/scanner.c
--- ruby-2.1.1/ext/psych/yaml/scanner.c	2014-02-24 05:24:15.000000000 +0100
+++ ruby-2.1.2/ext/psych/yaml/scanner.c	2014-05-04 17:45:33.000000000 +0200
@@ -2629,6 +2629,9 @@
         /* Check if it is a URI-escape sequence. */
 
         if (CHECK(parser->buffer, '%')) {
+            if (!STRING_EXTEND(parser, string))
+                goto error;
+
             if (!yaml_parser_scan_uri_escapes(parser,
                         directive, start_mark, &string)) goto error;
         }
diff -uw ruby-2.1.1/ext/psych/yaml/yaml_private.h ruby-2.1.2/ext/psych/yaml/yaml_private.h
--- ruby-2.1.1/ext/psych/yaml/yaml_private.h	2014-02-24 05:24:15.000000000 +0100
+++ ruby-2.1.2/ext/psych/yaml/yaml_private.h	2014-05-04 17:45:33.000000000 +0200
@@ -146,9 +146,12 @@
      (string).start = (string).pointer = (string).end = 0)
 
 #define STRING_EXTEND(context,string)                                           \
-    (((string).pointer+5 < (string).end)                                        \
+    ((((string).pointer+5 < (string).end)                                       \
         || yaml_string_extend(&(string).start,                                  \
-            &(string).pointer, &(string).end))
+            &(string).pointer, &(string).end)) ?                                \
+         1 :                                                                    \
+        ((context)->error = YAML_MEMORY_ERROR,                                  \
+         0))
 
 #define CLEAR(context,string)                                                   \
     ((string).pointer = (string).start,                                         \
patches/goruby/support_joke.patch000066400000000327147511530520013256 0ustar00--- a/vm_opts.h
+++ b/vm_opts.h
@@ -46,6 +46,6 @@
 #define OPT_STACK_CACHING            0
 
 /* misc */
-#define SUPPORT_JOKE                 0
+#define SUPPORT_JOKE                 1
 
 #endif /* RUBY_VM_OPTS_H */
patches/readline-5.2/shobj-conf.patch000066400000000737147511530520013345 0ustar00--- support/shobj-conf.orig	2010-10-01 22:46:26.000000000 +0900
+++ support/shobj-conf	2010-10-01 22:46:50.000000000 +0900
@@ -171,7 +171,7 @@
 	SHLIB_LIBSUFF='dylib'
 
 	case "${host_os}" in
-	darwin[78]*)	SHOBJ_LDFLAGS=''
+	darwin[789]*|darwin10*)	SHOBJ_LDFLAGS=''
 			SHLIB_XLDFLAGS='-dynamiclib -arch_only `/usr/bin/arch` -install_name $(libdir)/$@ -current_version $(SHLIB_MAJOR)$(SHLIB_MINOR) -compatibility_version $(SHLIB_MAJOR) -v'
 			;;
 	*)		SHOBJ_LDFLAGS='-dynamic'
patches/rbx/2.5.2/clean_bundler_environment_before_running_homebrew.diff000066400000001366147511530520022472 0ustar00From bb2f37b12b4acfa29171ea234e8cee1be4e12dff Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Micha=C5=82=20Matyas?= <github@higher.lv>
Date: Sun, 26 Apr 2015 20:33:10 +0200
Subject: [PATCH] Clean bundler environment before running Homebrew during
 configuration

---
 configure | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/configure b/configure
index 3a35743..c487a3b 100755
--- a/configure
+++ b/configure
@@ -576,7 +576,7 @@ class Configure
         if macports?
           config = macports_llvm_config
         else
-          out = `brew list llvm | grep '/llvm-config$'`
+          out = Bundler.with_clean_env { `brew list llvm | grep '/llvm-config$'` }
           config = out.chomp if $?.success?
         end
       end
-- 
2.3.5

patches/rbx/2.5.2/this_can_not_be_null.diff000066400000001437147511530520014446 0ustar00From 50aa7356e3c750fadb6665508e66d2f6923c7529 Mon Sep 17 00:00:00 2001
From: Yorick Peterse <yorickpeterse@gmail.com>
Date: Sat, 28 Mar 2015 14:17:27 +0100
Subject: [PATCH] "this" can not be null

Per clang 3.6 checking if "this" is null or not results in a compiler
error.
---
 vm/oop.hpp | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/vm/oop.hpp b/vm/oop.hpp
index 1c55b71..8298f04 100644
--- a/vm/oop.hpp
+++ b/vm/oop.hpp
@@ -610,7 +610,7 @@ Object* const cUndef = reinterpret_cast<Object*>(0x22L);
     }
 
     void validate() const {
-      assert(this && (!reference_p() || (type_id() > InvalidType && type_id() < LastObjectType)));
+      assert(!reference_p() || (type_id() > InvalidType && type_id() < LastObjectType));
     }
 
     friend class TypeInfo;
-- 
2.3.5

patches/tcs/support_joke.patch000066400000000327147511530520012540 0ustar00--- a/vm_opts.h
+++ b/vm_opts.h
@@ -46,6 +46,6 @@
 #define OPT_STACK_CACHING            0
 
 /* misc */
-#define SUPPORT_JOKE                 0
+#define SUPPORT_JOKE                 1
 
 #endif /* RUBY_VM_OPTS_H */
patches/ree/lib64.patch000066400000001663147511530520010722 0ustar00--- a/installer.rb
+++ b/installer.rb
@@ -281,7 +281,7 @@
 		if install_autoconf_package('source', 'Ruby Enterprise Edition')
 			# Some installed files may have wrong permissions
 			# (not world-readable). So we fix this.
-			if sh("chmod -R g+r,o+r,o-w #{@destdir}#{@prefix}/lib/ruby")
+			if sh("chmod -R g+r,o+r,o-w #{@destdir}#{@prefix}/lib*/ruby")
 				if @using_system_allocator_library &&
 				   !sh("install source/libsystem_allocator.dylib #{@destdir}#{@prefix}/lib/")
 					return false
@@ -307,7 +307,7 @@
 	def install_rubygems
 		# We might be installing into a fakeroot, so add the fakeroot's library
 		# search paths to RUBYLIB so that gem installation will work.
-		basedir = "#{@destdir}#{@prefix}/lib/ruby"
+		basedir = "#{@destdir}#{@prefix}/lib*/ruby"
 		libdir = "#{basedir}/1.8"
 		archname = File.basename(File.dirname(Dir["#{libdir}/*/thread.#{PlatformInfo::RUBYLIBEXT}"].first))
 		extlibdir = "#{libdir}/#{archname}"
patches/ree/ruby-binary-shebang.patch000066400000000413147511530520013642 0ustar00--- a/installer.rb
+++ b/installer.rb
@@ -596,7 +596,7 @@
 				rest = nil
 				File.open(filename, 'rb') do |f|
 					shebang = f.readline
-					if shebang =~ /ruby/
+					if shebang =~ /^#!.*ruby/
 						puts "Updating #{filename}..."
 						rest = f.read
 					end
patches/ree/ssl_no_ec2m.patch000066400000001476147511530520012207 0ustar00--- trunk/ext/openssl/ossl_pkey_ec.c  2013/07/05 22:16:09 41807
+++ trunk/ext/openssl/ossl_pkey_ec.c  2013/07/05 22:46:42 41808
@@ -762,8 +762,10 @@
                 method = EC_GFp_mont_method();
             } else if (id == s_GFp_nist) {
                 method = EC_GFp_nist_method();
+#if !defined(OPENSSL_NO_EC2M)
             } else if (id == s_GF2m_simple) {
                 method = EC_GF2m_simple_method();
+#endif
             }

             if (method) {
@@ -817,8 +819,10 @@

             if (id == s_GFp) {
                 new_curve = EC_GROUP_new_curve_GFp;
+#if !defined(OPENSSL_NO_EC2M)
             } else if (id == s_GF2m) {
                 new_curve = EC_GROUP_new_curve_GF2m;
+#endif
             } else {
                 ossl_raise(rb_eArgError, "unknown symbol, must be :GFp or :GF2m");
             }
patches/ree/1.8.6/no_sslv2.diff000066400000001252147511530520012024 0ustar00Index: ossl_ssl.c
===================================================================
--- a/ext/openssl/ossl_ssl.c	(revision 32381)
+++ b/ext/openssl/ossl_ssl.c	(revision 32382)
@@ -107,9 +107,12 @@
     OSSL_SSL_METHOD_ENTRY(TLSv1),
     OSSL_SSL_METHOD_ENTRY(TLSv1_server),
     OSSL_SSL_METHOD_ENTRY(TLSv1_client),
+#if defined(HAVE_SSLV2_METHOD) && defined(HAVE_SSLV2_SERVER_METHOD) && \
+        defined(HAVE_SSLV2_CLIENT_METHOD)	
     OSSL_SSL_METHOD_ENTRY(SSLv2),
     OSSL_SSL_METHOD_ENTRY(SSLv2_server),
     OSSL_SSL_METHOD_ENTRY(SSLv2_client),
+#endif
     OSSL_SSL_METHOD_ENTRY(SSLv3),
     OSSL_SSL_METHOD_ENTRY(SSLv3_server),
     OSSL_SSL_METHOD_ENTRY(SSLv3_client),
patches/ree/1.8.6/stdout-rouge-fix.patch000066400000001273147511530520013676 0ustar00--- a/lib/mkmf.rb	2009-06-10 09:09:22.000000000 +0200
+++ b/lib/mkmf.rb	2011-11-12 02:53:05.862766935 +0100
@@ -168,19 +168,25 @@
 module Logging
   @log = nil
   @logfile = 'mkmf.log'
-  @orgerr = $stderr.dup
-  @orgout = $stdout.dup
   @postpone = 0
 
   def self::open
     @log ||= File::open(@logfile, 'w')
     @log.sync = true
+    orgerr = $stderr.dup
+    orgout = $stdout.dup
     $stderr.reopen(@log)
     $stdout.reopen(@log)
     yield
   ensure
-    $stderr.reopen(@orgerr)
-    $stdout.reopen(@orgout)
+    if orgerr
+      $stderr.reopen(orgerr)
+      orgerr.close
+    end
+    if orgout
+      $stdout.reopen(orgout)
+      orgout.close
+    end
   end
 
   def self::message(*s)
patches/ree/1.8.6/openssl-1.0.patch000066400000016005147511530520012427 0ustar00From 46b84175dfac14a92fd6bcf3b03bc3c3715ab6cb Mon Sep 17 00:00:00 2001
From: nahi <nahi@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>
Date: Sat, 6 Mar 2010 21:47:30 +0000
Subject: [PATCH] backport the commit from trunk:
 Sun Feb 28 11:49:35 2010  NARUSE, Yui  <naruse@ruby-lang.org>

        * openssl/ossl.c (OSSL_IMPL_SK2ARY): for OpenSSL 1.0.
          patched by Jeroen van Meeuwen at [ruby-core:25210]
          fixed by Nobuyoshi Nakada [ruby-core:25238],
          Hongli Lai [ruby-core:27417],
          and Motohiro KOSAKI [ruby-core:28063]

        * ext/openssl/ossl_ssl.c (ossl_ssl_method_tab),
          (ossl_ssl_cipher_to_ary): constified.

        * ext/openssl/ossl_pkcs7.c (pkcs7_get_certs, pkcs7_get_crls):
          split pkcs7_get_certs_or_crls.


git-svn-id: http://svn.ruby-lang.org/repos/ruby/branches/ruby_1_8@26838 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
---
 ext/openssl/ossl.c          |    6 +++---
 ext/openssl/ossl.h          |    7 +++++++
 ext/openssl/ossl_pkcs7.c    |   40 ++++++++++++++++++++++++++++++----------
 ext/openssl/ossl_ssl.c      |    4 ++--
 ext/openssl/ossl_x509attr.c |    5 +++--
 ext/openssl/ossl_x509crl.c  |    4 ++--
 6 files changed, 47 insertions(+), 19 deletions(-)

diff --git a/ext/openssl/ossl.c b/ext/openssl/ossl.c
index d4a2dc1..85ba654 100644
--- a/ext/openssl/ossl.c
+++ b/ext/openssl/ossl.c
@@ -92,7 +92,7 @@ ossl_x509_ary2sk(VALUE ary)
 
 #define OSSL_IMPL_SK2ARY(name, type)	        \
 VALUE						\
-ossl_##name##_sk2ary(STACK *sk)			\
+ossl_##name##_sk2ary(STACK_OF(type) *sk)	\
 {						\
     type *t;					\
     int i, num;					\
@@ -102,7 +102,7 @@ ossl_##name##_sk2ary(STACK *sk)			\
 	OSSL_Debug("empty sk!");		\
 	return Qnil;				\
     }						\
-    num = sk_num(sk);				\
+    num = sk_##type##_num(sk);			\
     if (num < 0) {				\
 	OSSL_Debug("items in sk < -1???");	\
 	return rb_ary_new();			\
@@ -110,7 +110,7 @@ ossl_##name##_sk2ary(STACK *sk)			\
     ary = rb_ary_new2(num);			\
 						\
     for (i=0; i<num; i++) {			\
-	t = (type *)sk_value(sk, i);		\
+	t = sk_##type##_value(sk, i);		\
 	rb_ary_push(ary, ossl_##name##_new(t));	\
     }						\
     return ary;					\
diff --git a/ext/openssl/ossl.h b/ext/openssl/ossl.h
index 9215dc4..d0edb7d 100644
--- a/ext/openssl/ossl.h
+++ b/ext/openssl/ossl.h
@@ -108,6 +108,13 @@ extern VALUE eOSSLError;
 } while (0)
 
 /*
+ * Compatibility
+ */
+#if OPENSSL_VERSION_NUMBER >= 0x10000000L
+#define STACK _STACK
+#endif
+
+/*
  * String to HEXString conversion
  */
 int string2hex(const unsigned char *, int, char **, int *);
diff --git a/ext/openssl/ossl_pkcs7.c b/ext/openssl/ossl_pkcs7.c
index fe1ef7c..b0cc656 100644
--- a/ext/openssl/ossl_pkcs7.c
+++ b/ext/openssl/ossl_pkcs7.c
@@ -572,12 +572,11 @@ ossl_pkcs7_add_certificate(VALUE self, VALUE cert)
     return self;
 }
 
-static STACK *
-pkcs7_get_certs_or_crls(VALUE self, int want_certs)
+static STACK_OF(X509) *
+pkcs7_get_certs(VALUE self)
 {
     PKCS7 *pkcs7;
     STACK_OF(X509) *certs;
-    STACK_OF(X509_CRL) *crls;
     int i;
 
     GetPKCS7(self, pkcs7);
@@ -585,17 +584,38 @@ pkcs7_get_certs_or_crls(VALUE self, int want_certs)
     switch(i){
     case NID_pkcs7_signed:
         certs = pkcs7->d.sign->cert;
-        crls = pkcs7->d.sign->crl;
         break;
     case NID_pkcs7_signedAndEnveloped:
         certs = pkcs7->d.signed_and_enveloped->cert;
+        break;
+    default:
+        certs = NULL;
+    }
+
+    return certs;
+}
+
+static STACK_OF(X509_CRL) *
+pkcs7_get_crls(VALUE self)
+{
+    PKCS7 *pkcs7;
+    STACK_OF(X509_CRL) *crls;
+    int i;
+
+    GetPKCS7(self, pkcs7);
+    i = OBJ_obj2nid(pkcs7->type);
+    switch(i){
+    case NID_pkcs7_signed:
+        crls = pkcs7->d.sign->crl;
+        break;
+    case NID_pkcs7_signedAndEnveloped:
         crls = pkcs7->d.signed_and_enveloped->crl;
         break;
     default:
-        certs = crls = NULL;
+        crls = NULL;
     }
 
-    return want_certs ? certs : crls;
+    return crls;
 }
 
 static VALUE
@@ -610,7 +630,7 @@ ossl_pkcs7_set_certificates(VALUE self, VALUE ary)
     STACK_OF(X509) *certs;
     X509 *cert;
 
-    certs = pkcs7_get_certs_or_crls(self, 1);
+    certs = pkcs7_get_certs(self);
     while((cert = sk_X509_pop(certs))) X509_free(cert);
     rb_block_call(ary, rb_intern("each"), 0, 0, ossl_pkcs7_set_certs_i, self);
 
@@ -620,7 +640,7 @@ ossl_pkcs7_set_certificates(VALUE self, VALUE ary)
 static VALUE
 ossl_pkcs7_get_certificates(VALUE self)
 {
-    return ossl_x509_sk2ary(pkcs7_get_certs_or_crls(self, 1));
+    return ossl_x509_sk2ary(pkcs7_get_certs(self));
 }
 
 static VALUE
@@ -650,7 +670,7 @@ ossl_pkcs7_set_crls(VALUE self, VALUE ary)
     STACK_OF(X509_CRL) *crls;
     X509_CRL *crl;
 
-    crls = pkcs7_get_certs_or_crls(self, 0);
+    crls = pkcs7_get_crls(self);
     while((crl = sk_X509_CRL_pop(crls))) X509_CRL_free(crl);
     rb_block_call(ary, rb_intern("each"), 0, 0, ossl_pkcs7_set_crls_i, self);
 
@@ -660,7 +680,7 @@ ossl_pkcs7_set_crls(VALUE self, VALUE ary)
 static VALUE
 ossl_pkcs7_get_crls(VALUE self)
 {
-    return ossl_x509crl_sk2ary(pkcs7_get_certs_or_crls(self, 0));
+    return ossl_x509crl_sk2ary(pkcs7_get_crls(self));
 }
 
 static VALUE
diff --git a/ext/openssl/ossl_ssl.c b/ext/openssl/ossl_ssl.c
index 432ca21..facf6ca 100644
--- a/ext/openssl/ossl_ssl.c
+++ b/ext/openssl/ossl_ssl.c
@@ -1291,10 +1291,10 @@ ossl_ssl_get_peer_cert_chain(VALUE self)
     }
     chain = SSL_get_peer_cert_chain(ssl);
     if(!chain) return Qnil;
-    num = sk_num(chain);
+    num = sk_X509_num(chain);
     ary = rb_ary_new2(num);
     for (i = 0; i < num; i++){
-	cert = (X509*)sk_value(chain, i);
+	cert = sk_X509_value(chain, i);
 	rb_ary_push(ary, ossl_x509_new(cert));
     }
 
diff --git a/ext/openssl/ossl_x509attr.c b/ext/openssl/ossl_x509attr.c
index 1f817cd..2a4c481 100644
--- a/ext/openssl/ossl_x509attr.c
+++ b/ext/openssl/ossl_x509attr.c
@@ -218,8 +218,9 @@ ossl_x509attr_get_value(VALUE self)
 	ossl_str_adjust(str, p);
     }
     else{
-	length = i2d_ASN1_SET_OF_ASN1_TYPE(attr->value.set, NULL,
-			i2d_ASN1_TYPE, V_ASN1_SET, V_ASN1_UNIVERSAL, 0);
+	length = i2d_ASN1_SET_OF_ASN1_TYPE(attr->value.set,
+			(unsigned char **) NULL, i2d_ASN1_TYPE,
+			V_ASN1_SET, V_ASN1_UNIVERSAL, 0);
 	str = rb_str_new(0, length);
 	p = (unsigned char *)RSTRING_PTR(str);
 	i2d_ASN1_SET_OF_ASN1_TYPE(attr->value.set, &p,
diff --git a/ext/openssl/ossl_x509crl.c b/ext/openssl/ossl_x509crl.c
index 1be9640..818fdba 100644
--- a/ext/openssl/ossl_x509crl.c
+++ b/ext/openssl/ossl_x509crl.c
@@ -264,7 +264,7 @@ ossl_x509crl_get_revoked(VALUE self)
     VALUE ary, revoked;
 
     GetX509CRL(self, crl);
-    num = sk_X509_CRL_num(X509_CRL_get_REVOKED(crl));
+    num = sk_X509_REVOKED_num(X509_CRL_get_REVOKED(crl));
     if (num < 0) {
 	OSSL_Debug("num < 0???");
 	return rb_ary_new();
@@ -272,7 +272,7 @@ ossl_x509crl_get_revoked(VALUE self)
     ary = rb_ary_new2(num);
     for(i=0; i<num; i++) {
 	/* NO DUP - don't free! */
-	rev = (X509_REVOKED *)sk_X509_CRL_value(X509_CRL_get_REVOKED(crl), i);
+	rev = sk_X509_REVOKED_value(X509_CRL_get_REVOKED(crl), i);
 	revoked = ossl_x509revoked_new(rev);
 	rb_ary_push(ary, revoked);
     }
-- 
1.7.0.3
patches/ree/1.8.6/perftools-gcc46.patch000066400000000535147511530520013372 0ustar00--- a/vendor/google-perftools-1.2/src/system-alloc.cc	2011-11-11 20:31:45.809796278 -0800
+++ b/vendor/google-perftools-1.2/src/system-alloc.cc	2011-11-11 20:33:00.067244007 -0800
@@ -31,6 +31,7 @@
 // Author: Sanjay Ghemawat
 
 #include "config.h"
+#include <stddef.h>
 #if defined HAVE_STDINT_H
 #include <stdint.h>
 #elif defined HAVE_INTTYPES_H
patches/ree/1.8.6/tcmalloc.patch000066400000002000147511530520012234 0ustar00--- a/vendor/google-perftools-1.2/src/tcmalloc.cc       2011-02-24 02:09:12.000000000 -0800
+++ b/vendor/google-perftools-1.2/src/tcmalloc.cc       2011-11-11 12:46:13.704738476 -0800
@@ -137,6 +137,13 @@
 # define WIN32_DO_PATCHING 1
 #endif
 
+// GLibc 2.14+ requires the hook functions be declared volatile, based on the value of the
+// define __MALLOC_HOOK_VOLATILE. For compatibility with older/non-GLibc implementations,
+// provide an empty definition.
+#if !defined(__MALLOC_HOOK_VOLATILE)
+#define __MALLOC_HOOK_VOLATILE
+#endif
+
 using STL_NAMESPACE::max;
 using STL_NAMESPACE::numeric_limits;
 using STL_NAMESPACE::vector;
@@ -1669,5 +1676,5 @@ static void *MemalignOverride(size_t align, size_t size, const void *caller)
   MallocHook::InvokeNewHook(result, size);
   return result;
 }
-void *(*__memalign_hook)(size_t, size_t, const void *) = MemalignOverride;
+void *(*__MALLOC_HOOK_VOLATILE __memalign_hook)(size_t, size_t, const void *) = MemalignOverride;
 #endif  // #ifndef TCMALLOC_FOR_DEBUGALLOCATION
patches/ree/GH-488.patch000066400000001064147511530520010614 0ustar00--- trunk/ext/openssl/ossl_ssl.c	2013/12/25 01:40:53	44401
+++ trunk/ext/openssl/ossl_ssl.c	2013/12/25 01:42:09	44402
@@ -2229,7 +2229,9 @@
     ossl_ssl_def_const(OP_NETSCAPE_REUSE_CIPHER_CHANGE_BUG);
     ossl_ssl_def_const(OP_SSLREF2_REUSE_CERT_TYPE_BUG);
     ossl_ssl_def_const(OP_MICROSOFT_BIG_SSLV3_BUFFER);
+#if defined(SSL_OP_MSIE_SSLV2_RSA_PADDING)
     ossl_ssl_def_const(OP_MSIE_SSLV2_RSA_PADDING);
+#endif
     ossl_ssl_def_const(OP_SSLEAY_080_CLIENT_DH_BUG);
     ossl_ssl_def_const(OP_TLS_D5_BUG);
     ossl_ssl_def_const(OP_TLS_BLOCK_PADDING_BUG);
patches/ree/fix-irb-completion.diff000066400000000673147511530520013322 0ustar00diff --git a/lib/irb/completion.rb b/lib/irb/completion.rb
index 000658e..609dca3 100644
--- a/lib/irb/completion.rb
+++ b/lib/irb/completion.rb
@@ -157,7 +157,7 @@ module IRB
 	    end
 	    next if name != "IRB::Context" and 
 	      /^(IRB|SLex|RubyLex|RubyToken)/ =~ name
-	    candidates.concat m.instance_methods(false)
+	    candidates.concat m.instance_methods(false).map { |m| m.to_s }
 	  }
 	  candidates.sort!
 	  candidates.uniq!
patches/ree/1.8.7/tcmalloc.patch000066400000002061147511530520012244 0ustar00diff --git a/distro/google-perftools-1.7/src/tcmalloc.cc b/distro/google-perftools-1.7/src/tcmalloc.cc
index 8d94d20..0769425 100644
--- a/distro/google-perftools-1.7/src/tcmalloc.cc
+++ b/distro/google-perftools-1.7/src/tcmalloc.cc
@@ -137,6 +137,13 @@
 # define WIN32_DO_PATCHING 1
 #endif
 
+// GLibc 2.14+ requires the hook functions be declared volatile, based on the value of the
+// define __MALLOC_HOOK_VOLATILE. For compatibility with older/non-GLibc implementations,
+// provide an empty definition.
+#if !defined(__MALLOC_HOOK_VOLATILE)
+#define __MALLOC_HOOK_VOLATILE
+#endif
+
 using STL_NAMESPACE::max;
 using STL_NAMESPACE::numeric_limits;
 using STL_NAMESPACE::vector;
@@ -1669,5 +1676,5 @@ static void *MemalignOverride(size_t align, size_t size, const void *caller)
   MallocHook::InvokeNewHook(result, size);
   return result;
 }
-void *(*__memalign_hook)(size_t, size_t, const void *) = MemalignOverride;
+void *(*__MALLOC_HOOK_VOLATILE __memalign_hook)(size_t, size_t, const void *) = MemalignOverride;
 #endif  // #ifndef TCMALLOC_FOR_DEBUGALLOCATION
patches/ree/1.8.7/stdout-rouge-fix.patch000066400000001317147511530520013676 0ustar00diff --git a/lib/mkmf.rb b/lib/mkmf.rb
index c9e738a..7a8004d 100644
--- a/lib/mkmf.rb
+++ b/lib/mkmf.rb
@@ -201,20 +201,26 @@ end
 module Logging
   @log = nil
   @logfile = 'mkmf.log'
-  @orgerr = $stderr.dup
-  @orgout = $stdout.dup
   @postpone = 0
   @quiet = $extmk
 
   def self::open
     @log ||= File::open(@logfile, 'w')
     @log.sync = true
+    orgerr = $stderr.dup
+    orgout = $stdout.dup
     $stderr.reopen(@log)
     $stdout.reopen(@log)
     yield
   ensure
-    $stderr.reopen(@orgerr)
-    $stdout.reopen(@orgout)
+    if orgerr
+      $stderr.reopen(orgerr)
+      orgerr.close
+    end
+    if orgout
+      $stdout.reopen(orgout)
+      orgout.close
+    end
   end
 
   def self::message(*s)
patches/ree/1.8.7/2010.02/tcmalloc.patch000066400000002061147511530520013046 0ustar00diff --git a/distro/google-perftools-1.4/src/tcmalloc.cc b/distro/google-perftools-1.4/src/tcmalloc.cc
index 8d94d20..0769425 100644
--- a/distro/google-perftools-1.4/src/tcmalloc.cc
+++ b/distro/google-perftools-1.4/src/tcmalloc.cc
@@ -137,6 +137,13 @@
 # define WIN32_DO_PATCHING 1
 #endif
 
+// GLibc 2.14+ requires the hook functions be declared volatile, based on the value of the
+// define __MALLOC_HOOK_VOLATILE. For compatibility with older/non-GLibc implementations,
+// provide an empty definition.
+#if !defined(__MALLOC_HOOK_VOLATILE)
+#define __MALLOC_HOOK_VOLATILE
+#endif
+
 using STL_NAMESPACE::max;
 using STL_NAMESPACE::numeric_limits;
 using STL_NAMESPACE::vector;
@@ -1669,5 +1676,5 @@ static void *MemalignOverride(size_t align, size_t size, const void *caller)
   MallocHook::InvokeNewHook(result, size);
   return result;
 }
-void *(*__memalign_hook)(size_t, size_t, const void *) = MemalignOverride;
+void *(*__MALLOC_HOOK_VOLATILE __memalign_hook)(size_t, size_t, const void *) = MemalignOverride;
 #endif  // #ifndef TCMALLOC_FOR_DEBUGALLOCATION
patches/ree/1.8.7/p358-p374.patch000066400000166141147511530520011652 0ustar00From c31e7c1e8b2895ef33204938487597e2b3acaaf7 Mon Sep 17 00:00:00 2001
From: nobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>
Date: Fri, 2 Mar 2012 02:45:35 +0000
Subject: [PATCH 01/19] merge revision(s) 25230,34866:

	* marshal.c (struct {dump,load}_arg): manage with dfree, instead
	  of using local variable which may be moved by context switch.
	  [ruby-dev:39425]

	* marshal.c (mark_dump_arg): mark destination string.  patch by
	  Vit Ondruch.  [Bug #4339]

	* marshal.c (clear_dump_arg, clear_load_arg): clean up also data
	  tables as same as symbols tables.


git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/branches/ruby_1_8_7@34867 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
---
 ChangeLog                 |  14 +++++
 marshal.c                 | 145 +++++++++++++++++++++++-----------------------
 test/ruby/test_marshal.rb |  28 +++++++++
 version.h                 |  10 ++--
 4 files changed, 120 insertions(+), 77 deletions(-)

diff --git a/ChangeLog b/ChangeLog
index a09237e..352a30f 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,17 @@
+Fri Mar  2 11:44:33 2012  Nobuyoshi Nakada  <nobu@ruby-lang.org>
+
+	* marshal.c (mark_dump_arg): mark destination string.  patch by
+	  Vit Ondruch.  [Bug #4339]
+
+	* marshal.c (clear_dump_arg, clear_load_arg): clean up also data
+	  tables as same as symbols tables.
+
+Fri Mar  2 11:44:33 2012  Nobuyoshi Nakada  <nobu@ruby-lang.org>
+
+	* marshal.c (struct {dump,load}_arg): manage with dfree, instead
+	  of using local variable which may be moved by context switch.
+	  [ruby-dev:39425]
+
 Wed Feb  8 14:06:59 2012  Hiroshi Nakamura  <nahi@ruby-lang.org>
 
 	* ext/openssl/ossl_ssl.c: Add SSL constants and allow to unset SSL
diff --git a/marshal.c b/marshal.c
index 35e0d60..632f6ca 100644
--- a/marshal.c
+++ b/marshal.c
@@ -85,12 +85,10 @@
 static ID s_getc, s_read, s_write, s_binmode;
 
 struct dump_arg {
-    VALUE obj;
     VALUE str, dest;
     st_table *symbols;
     st_table *data;
     int taint;
-    VALUE wrapper;
 };
 
 struct dump_call_arg {
@@ -104,20 +102,31 @@ struct dump_call_arg {
     struct dump_arg *arg;
     ID sym;
 {
-    if (!DATA_PTR(arg->wrapper)) {
+    if (!arg->symbols) {
         rb_raise(rb_eRuntimeError, "Marshal.dump reentered at %s",
 		 rb_id2name(sym));
     }
 }
 
+static void clear_dump_arg _((struct dump_arg *arg));
+
 static void
 mark_dump_arg(ptr)
     void *ptr;
 {
     struct dump_arg *p = ptr;
-    if (!ptr)
+    if (!p->symbols)
         return;
     rb_mark_set(p->data);
+    rb_gc_mark(p->str);
+}
+
+static void
+free_dump_arg(ptr)
+    void *ptr;
+{
+    clear_dump_arg(ptr);
+    xfree(ptr);
 }
 
 static VALUE
@@ -699,32 +708,18 @@ class2path(klass)
     }
 }
 
-static VALUE
-dump(arg)
-    struct dump_call_arg *arg;
-{
-    w_object(arg->obj, arg->arg, arg->limit);
-    if (arg->arg->dest) {
-	rb_io_write(arg->arg->dest, arg->arg->str);
-	rb_str_resize(arg->arg->str, 0);
-    }
-    return 0;
-}
-
-static VALUE
-dump_ensure(arg)
+static void
+clear_dump_arg(arg)
     struct dump_arg *arg;
 {
-    if (!DATA_PTR(arg->wrapper)) return 0;
+    if (!arg->symbols) return;
     st_free_table(arg->symbols);
+    arg->symbols = 0;
     st_free_table(arg->data);
-    DATA_PTR(arg->wrapper) = 0;
-    arg->wrapper = 0;
+    arg->data = 0;
     if (arg->taint) {
 	OBJ_TAINT(arg->str);
     }
-
-    return 0;
 }
 
 /*
@@ -760,8 +755,8 @@ class2path(klass)
 {
     VALUE obj, port, a1, a2;
     int limit = -1;
-    struct dump_arg arg;
-    struct dump_call_arg c_arg;
+    struct dump_arg *arg;
+    VALUE wrapper;
 
     port = Qnil;
     rb_scan_args(argc, argv, "12", &obj, &a1, &a2);
@@ -775,37 +770,40 @@ class2path(klass)
 	else if (NIL_P(a1)) goto type_error;
 	else port = a1;
     }
-    arg.dest = 0;
-    arg.symbols = st_init_numtable();
-    arg.data    = st_init_numtable();
-    arg.taint   = Qfalse;
-    arg.str = rb_str_buf_new(0);
-    RBASIC(arg.str)->klass = 0;
-    arg.wrapper = Data_Wrap_Struct(rb_cData, mark_dump_arg, 0, &arg);
+    wrapper = Data_Make_Struct(rb_cData, struct dump_arg, mark_dump_arg, free_dump_arg, arg);
+    arg->dest = 0;
+    arg->symbols = st_init_numtable();
+    arg->data    = st_init_numtable();
+    arg->taint   = Qfalse;
+    arg->str = rb_str_buf_new(0);
+    RBASIC(arg->str)->klass = 0;
     if (!NIL_P(port)) {
 	if (!rb_respond_to(port, s_write)) {
 	  type_error:
 	    rb_raise(rb_eTypeError, "instance of IO needed");
 	}
-	arg.dest = port;
+	arg->dest = port;
 	if (rb_respond_to(port, s_binmode)) {
 	    rb_funcall2(port, s_binmode, 0, 0);
-	    check_dump_arg(&arg, s_binmode);
+	    check_dump_arg(arg, s_binmode);
 	}
     }
     else {
-	port = arg.str;
+	port = arg->str;
     }
 
-    c_arg.obj   = obj;
-    c_arg.arg   = &arg;
-    c_arg.limit = limit;
+    w_byte(MARSHAL_MAJOR, arg);
+    w_byte(MARSHAL_MINOR, arg);
 
-    w_byte(MARSHAL_MAJOR, &arg);
-    w_byte(MARSHAL_MINOR, &arg);
+    w_object(obj, arg, limit);
+    if (arg->dest) {
+	rb_io_write(arg->dest, arg->str);
+	rb_str_resize(arg->str, 0);
+    }
 
-    rb_ensure(dump, (VALUE)&c_arg, dump_ensure, (VALUE)&arg);
-    RBASIC(arg.str)->klass = rb_cString;
+    RBASIC(arg->str)->klass = rb_cString;
+    clear_dump_arg(arg);
+    RB_GC_GUARD(wrapper);
 
     return port;
 }
@@ -817,7 +815,6 @@ struct load_arg {
     st_table *data;
     VALUE proc;
     int taint;
-    VALUE wrapper;
 };
 
 static void
@@ -825,22 +822,31 @@ struct load_arg {
     struct load_arg *arg;
     ID sym;
 {
-    if (!DATA_PTR(arg->wrapper)) {
+    if (!arg->symbols) {
         rb_raise(rb_eRuntimeError, "Marshal.load reentered at %s",
 		 rb_id2name(sym));
     }
 }
 
+static void clear_load_arg _((struct load_arg *arg));
+
 static void
 mark_load_arg(ptr)
     void *ptr;
 {
     struct load_arg *p = ptr;
-    if (!ptr)
+    if (!p->symbols)
         return;
     rb_mark_tbl(p->data);
 }
 
+static void
+free_load_arg(void *ptr)
+{
+    clear_load_arg(ptr);
+    xfree(ptr);
+}
+
 static VALUE r_object _((struct load_arg *arg));
 
 static int
@@ -1415,23 +1421,15 @@ struct load_arg {
     return r_object0(arg, arg->proc, 0, Qnil);
 }
 
-static VALUE
-load(arg)
-    struct load_arg *arg;
-{
-    return r_object(arg);
-}
-
-static VALUE
-load_ensure(arg)
+static void
+clear_load_arg(arg)
     struct load_arg *arg;
 {
-    if (!DATA_PTR(arg->wrapper)) return 0;
+    if (!arg->symbols) return;
     st_free_table(arg->symbols);
+    arg->symbols = 0;
     st_free_table(arg->data);
-    DATA_PTR(arg->wrapper) = 0;
-    arg->wrapper = 0;
-    return 0;
+    arg->data = 0;
 }
 
 /*
@@ -1452,8 +1450,8 @@ struct load_arg {
 {
     VALUE port, proc;
     int major, minor, taint = Qfalse;
-    VALUE v;
-    struct load_arg arg;
+    VALUE v, wrapper;
+    struct load_arg *arg;
 
     rb_scan_args(argc, argv, "11", &port, &proc);
     v = rb_check_string_type(port);
@@ -1470,17 +1468,18 @@ struct load_arg {
     else {
 	rb_raise(rb_eTypeError, "instance of IO needed");
     }
-    arg.src = port;
-    arg.offset = 0;
-    arg.symbols = st_init_numtable();
-    arg.data    = st_init_numtable();
-    arg.proc = 0;
-    arg.wrapper = Data_Wrap_Struct(rb_cData, mark_load_arg, 0, &arg);
-    arg.taint = taint;
-
-    major = r_byte(&arg);
-    minor = r_byte(&arg);
+    wrapper = Data_Make_Struct(rb_cData, struct load_arg, mark_load_arg, free_load_arg, arg);
+    arg->src = port;
+    arg->offset = 0;
+    arg->symbols = st_init_numtable();
+    arg->data    = st_init_numtable();
+    arg->proc = 0;
+    arg->taint = taint;
+
+    major = r_byte(arg);
+    minor = r_byte(arg);
     if (major != MARSHAL_MAJOR || minor > MARSHAL_MINOR) {
+	clear_load_arg(arg);
 	rb_raise(rb_eTypeError, "incompatible marshal file format (can't be read)\n\
 \tformat version %d.%d required; %d.%d given",
 		 MARSHAL_MAJOR, MARSHAL_MINOR, major, minor);
@@ -1491,8 +1490,10 @@ struct load_arg {
 		MARSHAL_MAJOR, MARSHAL_MINOR, major, minor);
     }
 
-    if (!NIL_P(proc)) arg.proc = proc;
-    v = rb_ensure(load, (VALUE)&arg, load_ensure, (VALUE)&arg);
+    if (!NIL_P(proc)) arg->proc = proc;
+    v = r_object(arg);
+    clear_load_arg(arg);
+    RB_GC_GUARD(wrapper);
 
     return v;
 }
diff --git a/test/ruby/test_marshal.rb b/test/ruby/test_marshal.rb
index 5ae521e..d40c9da 100644
--- a/test/ruby/test_marshal.rb
+++ b/test/ruby/test_marshal.rb
@@ -72,6 +72,34 @@ def test_too_long_string
     assert_equal("marshal data too short", e.message)
   end
 
+  class DumpTest
+    def marshal_dump
+      loop { Thread.pass }
+    end
+  end
+
+  class LoadTest
+    def marshal_dump
+      nil
+    end
+    def marshal_load(obj)
+      loop { Thread.pass }
+    end
+  end
+
+  def test_context_switch
+    o = DumpTest.new
+    Thread.new { Marshal.dump(o) }
+    GC.start
+    assert(true, '[ruby-dev:39425]')
+
+    o = LoadTest.new
+    m = Marshal.dump(o)
+    Thread.new { Marshal.load(m) }
+    GC.start
+    assert(true, '[ruby-dev:39425]')
+  end
+
   def test_taint
     x = Object.new
     x.taint
diff --git a/version.h b/version.h
index d6f16f5..1f2a143 100644
--- a/version.h
+++ b/version.h
@@ -1,15 +1,15 @@
 #define RUBY_VERSION "1.8.7"
-#define RUBY_RELEASE_DATE "2012-02-08"
+#define RUBY_RELEASE_DATE "2012-03-02"
 #define RUBY_VERSION_CODE 187
-#define RUBY_RELEASE_CODE 20120208
-#define RUBY_PATCHLEVEL 358
+#define RUBY_RELEASE_CODE 20120302
+#define RUBY_PATCHLEVEL 359
 
 #define RUBY_VERSION_MAJOR 1
 #define RUBY_VERSION_MINOR 8
 #define RUBY_VERSION_TEENY 7
 #define RUBY_RELEASE_YEAR 2012
-#define RUBY_RELEASE_MONTH 2
-#define RUBY_RELEASE_DAY 8
+#define RUBY_RELEASE_MONTH 3
+#define RUBY_RELEASE_DAY 2
 
 #ifdef RUBY_EXTERN
 RUBY_EXTERN const char ruby_version[];
-- 
1.8.5.1


From acc55c25c587fef5c7327c5912f3aa50a969ec34 Mon Sep 17 00:00:00 2001
From: nobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>
Date: Tue, 6 Mar 2012 03:06:11 +0000
Subject: [PATCH 02/19] merge revision(s) 34919:

	* lib/yaml/rubytypes.rb (Exception.yaml_new): fix bug that causes
	  YAML serialization problem for Exception.
	  Exception#initialize doesn't use visible instance variable for
	  the exception message, so call the method with the message.
	  patched by Jingwen Owen Ou <jingweno AT gmail.com>.
	  http://github.com/ruby/ruby/pull/41


git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/branches/ruby_1_8_7@34920 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
---
 ChangeLog                   |  9 ++++++++
 lib/yaml/rubytypes.rb       |  3 ++-
 test/yaml/test_exception.rb | 52 +++++++++++++++++++++++++++++++++++++++++++++
 version.h                   |  8 +++----
 4 files changed, 67 insertions(+), 5 deletions(-)
 create mode 100644 test/yaml/test_exception.rb

diff --git a/ChangeLog b/ChangeLog
index 352a30f..886be66 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,12 @@
+Tue Mar  6 12:05:42 2012  Nobuyoshi Nakada  <nobu@ruby-lang.org>
+
+	* lib/yaml/rubytypes.rb (Exception.yaml_new): fix bug that causes
+	  YAML serialization problem for Exception.
+	  Exception#initialize doesn't use visible instance variable for
+	  the exception message, so call the method with the message.
+	  patched by Jingwen Owen Ou <jingweno AT gmail.com>.
+	  http://github.com/ruby/ruby/pull/41
+
 Fri Mar  2 11:44:33 2012  Nobuyoshi Nakada  <nobu@ruby-lang.org>
 
 	* marshal.c (mark_dump_arg): mark destination string.  patch by
diff --git a/lib/yaml/rubytypes.rb b/lib/yaml/rubytypes.rb
index 35b7191..55d59fa 100644
--- a/lib/yaml/rubytypes.rb
+++ b/lib/yaml/rubytypes.rb
@@ -117,7 +117,8 @@ def to_yaml( opts = {} )
 class Exception
     yaml_as "tag:ruby.yaml.org,2002:exception"
     def Exception.yaml_new( klass, tag, val )
-        o = YAML.object_maker( klass, { 'mesg' => val.delete( 'message' ) } )
+        o = klass.allocate
+        Exception.instance_method(:initialize).bind(o).call(val.delete('message'))
         val.each_pair do |k,v|
             o.instance_variable_set("@#{k}", v)
         end
diff --git a/test/yaml/test_exception.rb b/test/yaml/test_exception.rb
new file mode 100644
index 0000000..1dc3044
--- /dev/null
+++ b/test/yaml/test_exception.rb
@@ -0,0 +1,52 @@
+require 'test/unit'
+require 'yaml'
+
+module Syck
+  class TestException < Test::Unit::TestCase
+    class Wups < Exception
+      attr_reader :foo, :bar
+      def initialize *args
+        super
+        @foo = 1
+        @bar = 2
+      end
+
+      def ==(other)
+        self.class == other.class and
+          self.message == other.message and
+          self.backtrace == other.backtrace
+      end
+    end
+
+    def setup
+      @wups = Wups.new('test_message')
+    end
+
+    def test_to_yaml
+      w = YAML.load(@wups.to_yaml)
+      assert_equal @wups, w
+      assert_equal 1, w.foo
+      assert_equal 2, w.bar
+    end
+
+    def test_dump
+      w = YAML.load(@wups.to_yaml)
+      assert_equal @wups, w
+      assert_equal 1, w.foo
+      assert_equal 2, w.bar
+    end
+
+    def test_to_yaml_properties
+      class << @wups
+        def to_yaml_properties
+          [:@foo]
+        end
+      end
+
+      w = YAML.load(YAML.dump(@wups))
+      assert_equal @wups, w
+      assert_equal 1, w.foo
+      assert_nil w.bar
+    end
+  end
+end
diff --git a/version.h b/version.h
index 1f2a143..13e41e8 100644
--- a/version.h
+++ b/version.h
@@ -1,15 +1,15 @@
 #define RUBY_VERSION "1.8.7"
-#define RUBY_RELEASE_DATE "2012-03-02"
+#define RUBY_RELEASE_DATE "2012-03-06"
 #define RUBY_VERSION_CODE 187
-#define RUBY_RELEASE_CODE 20120302
-#define RUBY_PATCHLEVEL 359
+#define RUBY_RELEASE_CODE 20120306
+#define RUBY_PATCHLEVEL 360
 
 #define RUBY_VERSION_MAJOR 1
 #define RUBY_VERSION_MINOR 8
 #define RUBY_VERSION_TEENY 7
 #define RUBY_RELEASE_YEAR 2012
 #define RUBY_RELEASE_MONTH 3
-#define RUBY_RELEASE_DAY 2
+#define RUBY_RELEASE_DAY 6
 
 #ifdef RUBY_EXTERN
 RUBY_EXTERN const char ruby_version[];
-- 
1.8.5.1


From 698d21a276f862da823c7a6536f9c15afe602e19 Mon Sep 17 00:00:00 2001
From: nobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>
Date: Sat, 14 Apr 2012 09:52:10 +0000
Subject: [PATCH 03/19] merge revision(s) 35325:

	* bignum.c (rb_big2str0): prevent working clone from
	  GC. [exerb-dev:0578].  patched by MURASE Masamitsu
	  <masamitsu.murase AT gmail.com> at [exerb-dev:0580]


git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/branches/ruby_1_8_7@35327 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
---
 ChangeLog |  6 ++++++
 bignum.c  |  3 ++-
 version.h | 10 +++++-----
 3 files changed, 13 insertions(+), 6 deletions(-)

diff --git a/ChangeLog b/ChangeLog
index 886be66..fae1bb1 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,9 @@
+Sat Apr 14 18:51:41 2012  Nobuyoshi Nakada  <nobu@ruby-lang.org>
+
+	* bignum.c (rb_big2str0): prevent working clone from
+	  GC. [exerb-dev:0578].  patched by MURASE Masamitsu
+	  <masamitsu.murase AT gmail.com> at [exerb-dev:0580]
+
 Tue Mar  6 12:05:42 2012  Nobuyoshi Nakada  <nobu@ruby-lang.org>
 
 	* lib/yaml/rubytypes.rb (Exception.yaml_new): fix bug that causes
diff --git a/bignum.c b/bignum.c
index 0c5ae3e..77697ae 100644
--- a/bignum.c
+++ b/bignum.c
@@ -772,7 +772,7 @@
     int base;
     int trim;
 {
-    volatile VALUE t;
+    VALUE t;
     BDIGIT *ds;
     long i, j, hbase;
     VALUE ss;
@@ -847,6 +847,7 @@
 	    if (trim && i == 0 && num == 0) break;
 	}
     }
+    RB_GC_GUARD(t);
     if (trim) {while (s[j] == '0') j++;}
     i = RSTRING(ss)->len - j;
     if (RBIGNUM(x)->sign) {
diff --git a/version.h b/version.h
index 13e41e8..a2b4487 100644
--- a/version.h
+++ b/version.h
@@ -1,15 +1,15 @@
 #define RUBY_VERSION "1.8.7"
-#define RUBY_RELEASE_DATE "2012-03-06"
+#define RUBY_RELEASE_DATE "2012-04-14"
 #define RUBY_VERSION_CODE 187
-#define RUBY_RELEASE_CODE 20120306
-#define RUBY_PATCHLEVEL 360
+#define RUBY_RELEASE_CODE 20120414
+#define RUBY_PATCHLEVEL 361
 
 #define RUBY_VERSION_MAJOR 1
 #define RUBY_VERSION_MINOR 8
 #define RUBY_VERSION_TEENY 7
 #define RUBY_RELEASE_YEAR 2012
-#define RUBY_RELEASE_MONTH 3
-#define RUBY_RELEASE_DAY 6
+#define RUBY_RELEASE_MONTH 4
+#define RUBY_RELEASE_DAY 14
 
 #ifdef RUBY_EXTERN
 RUBY_EXTERN const char ruby_version[];
-- 
1.8.5.1


From a4e76099bf44ae7d75bd24c3c8233d710e590fac Mon Sep 17 00:00:00 2001
From: nobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>
Date: Fri, 11 May 2012 05:09:58 +0000
Subject: [PATCH 04/19] 	* ext/bigdecimal/bigdecimal.c (PUSH): to prevent VALUE
 from GC, 	  must not cast it to unsigned long, which may be shorter than
 	  VALUE, and the result can be mere garbage.

git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/branches/ruby_1_8_7@35619 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
---
 ChangeLog                   |  6 ++++++
 ext/bigdecimal/bigdecimal.c |  2 +-
 version.h                   | 10 +++++-----
 3 files changed, 12 insertions(+), 6 deletions(-)

diff --git a/ChangeLog b/ChangeLog
index fae1bb1..9201d3e 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,9 @@
+Fri May 11 14:09:48 2012  Nobuyoshi Nakada  <nobu@ruby-lang.org>
+
+	* ext/bigdecimal/bigdecimal.c (PUSH): to prevent VALUE from GC,
+	  must not cast it to unsigned long, which may be shorter than
+	  VALUE, and the result can be mere garbage.
+
 Sat Apr 14 18:51:41 2012  Nobuyoshi Nakada  <nobu@ruby-lang.org>
 
 	* bignum.c (rb_big2str0): prevent working clone from
diff --git a/ext/bigdecimal/bigdecimal.c b/ext/bigdecimal/bigdecimal.c
index 7846c0d..16be520 100644
--- a/ext/bigdecimal/bigdecimal.c
+++ b/ext/bigdecimal/bigdecimal.c
@@ -32,7 +32,7 @@
 
 /* MACRO's to guard objects from GC by keeping them in stack */
 #define ENTER(n) volatile VALUE vStack[n];int iStack=0
-#define PUSH(x)  vStack[iStack++] = (unsigned long)(x);
+#define PUSH(x)  vStack[iStack++] = (VALUE)(x);
 #define SAVE(p)  PUSH(p->obj);
 #define GUARD_OBJ(p,y) {p=y;SAVE(p);}
 
diff --git a/version.h b/version.h
index a2b4487..9dcae40 100644
--- a/version.h
+++ b/version.h
@@ -1,15 +1,15 @@
 #define RUBY_VERSION "1.8.7"
-#define RUBY_RELEASE_DATE "2012-04-14"
+#define RUBY_RELEASE_DATE "2012-05-11"
 #define RUBY_VERSION_CODE 187
-#define RUBY_RELEASE_CODE 20120414
-#define RUBY_PATCHLEVEL 361
+#define RUBY_RELEASE_CODE 20120511
+#define RUBY_PATCHLEVEL 362
 
 #define RUBY_VERSION_MAJOR 1
 #define RUBY_VERSION_MINOR 8
 #define RUBY_VERSION_TEENY 7
 #define RUBY_RELEASE_YEAR 2012
-#define RUBY_RELEASE_MONTH 4
-#define RUBY_RELEASE_DAY 14
+#define RUBY_RELEASE_MONTH 5
+#define RUBY_RELEASE_DAY 11
 
 #ifdef RUBY_EXTERN
 RUBY_EXTERN const char ruby_version[];
-- 
1.8.5.1


From b0901e0f63ed056c9c95273052a029930cad87af Mon Sep 17 00:00:00 2001
From: knu <knu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>
Date: Mon, 21 May 2012 07:35:21 +0000
Subject: [PATCH 05/19] * ext/syslog/syslog.c (mSyslog_inspect): Make sure self
 is a   module before calling rb_class2name().

git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/branches/ruby_1_8_7@35746 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
---
 ChangeLog           | 5 +++++
 ext/syslog/syslog.c | 2 ++
 2 files changed, 7 insertions(+)

diff --git a/ChangeLog b/ChangeLog
index 9201d3e..3c477b4 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,8 @@
+Mon May 21 16:29:47 2012  Akinori MUSHA  <knu@iDaemons.org>
+
+	* ext/syslog/syslog.c (mSyslog_inspect): Make sure self is a
+	  module before calling rb_class2name().
+
 Fri May 11 14:09:48 2012  Nobuyoshi Nakada  <nobu@ruby-lang.org>
 
 	* ext/bigdecimal/bigdecimal.c (PUSH): to prevent VALUE from GC,
diff --git a/ext/syslog/syslog.c b/ext/syslog/syslog.c
index ecc4931..1372cb7 100644
--- a/ext/syslog/syslog.c
+++ b/ext/syslog/syslog.c
@@ -168,6 +168,8 @@ static VALUE mSyslog_inspect(VALUE self)
 {
     char buf[1024];
 
+    Check_Type(self, T_MODULE);
+
     if (syslog_opened) {
 	snprintf(buf, sizeof(buf),
 	  "<#%s: opened=true, ident=\"%s\", options=%d, facility=%d, mask=%d>",
-- 
1.8.5.1


From c869f69c3543552c0ffa27628d587bae460b6213 Mon Sep 17 00:00:00 2001
From: svn <svn@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>
Date: Mon, 21 May 2012 07:35:26 +0000
Subject: [PATCH 06/19] * 2012-05-21

git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/branches/ruby_1_8_7@35747 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
---
 version.h | 6 +++---
 1 file changed, 3 insertions(+), 3 deletions(-)

diff --git a/version.h b/version.h
index 9dcae40..927ae53 100644
--- a/version.h
+++ b/version.h
@@ -1,7 +1,7 @@
 #define RUBY_VERSION "1.8.7"
-#define RUBY_RELEASE_DATE "2012-05-11"
+#define RUBY_RELEASE_DATE "2012-05-21"
 #define RUBY_VERSION_CODE 187
-#define RUBY_RELEASE_CODE 20120511
+#define RUBY_RELEASE_CODE 20120521
 #define RUBY_PATCHLEVEL 362
 
 #define RUBY_VERSION_MAJOR 1
@@ -9,7 +9,7 @@
 #define RUBY_VERSION_TEENY 7
 #define RUBY_RELEASE_YEAR 2012
 #define RUBY_RELEASE_MONTH 5
-#define RUBY_RELEASE_DAY 11
+#define RUBY_RELEASE_DAY 21
 
 #ifdef RUBY_EXTERN
 RUBY_EXTERN const char ruby_version[];
-- 
1.8.5.1


From 69883b3ee6502cc210e598fd440b65e20629cd9c Mon Sep 17 00:00:00 2001
From: shyouhei <shyouhei@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>
Date: Wed, 6 Jun 2012 05:20:08 +0000
Subject: [PATCH 07/19] merge revision(s) 33611: 	*
 lib/webrick/utils.rb: fix fcntl call. 	* lib/drb/unix.rb: ditto.

git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/branches/ruby_1_8_7@35939 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
---
 ChangeLog            |  6 ++++++
 lib/drb/unix.rb      |  2 +-
 lib/webrick/utils.rb |  2 +-
 version.h            | 10 +++++-----
 4 files changed, 13 insertions(+), 7 deletions(-)

diff --git a/ChangeLog b/ChangeLog
index 3c477b4..dd5808a 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,9 @@
+Wed Jun  6 14:06:02 2012  Tanaka Akira  <akr@fsij.org>
+
+	* lib/webrick/utils.rb: fix fcntl call.
+
+	* lib/drb/unix.rb: ditto.
+
 Mon May 21 16:29:47 2012  Akinori MUSHA  <knu@iDaemons.org>
 
 	* ext/syslog/syslog.c (mSyslog_inspect): Make sure self is a
diff --git a/lib/drb/unix.rb b/lib/drb/unix.rb
index 57feed8..90ca292 100644
--- a/lib/drb/unix.rb
+++ b/lib/drb/unix.rb
@@ -100,7 +100,7 @@ def accept
     end
 
     def set_sockopt(soc)
-      soc.fcntl(Fcntl::F_SETFL, Fcntl::FD_CLOEXEC) if defined? Fcntl::FD_CLOEXEC
+      soc.fcntl(Fcntl::F_SETFD, Fcntl::FD_CLOEXEC) if defined? Fcntl::FD_CLOEXEC
     end
   end
 
diff --git a/lib/webrick/utils.rb b/lib/webrick/utils.rb
index cf9da6f..1c29ef5 100644
--- a/lib/webrick/utils.rb
+++ b/lib/webrick/utils.rb
@@ -29,7 +29,7 @@ def set_non_blocking(io)
 
     def set_close_on_exec(io)
       if defined?(Fcntl::FD_CLOEXEC)
-        io.fcntl(Fcntl::FD_CLOEXEC, 1)
+        io.fcntl(Fcntl::F_SETFD, Fcntl::FD_CLOEXEC)
       end
     end
     module_function :set_close_on_exec
diff --git a/version.h b/version.h
index 927ae53..d084c57 100644
--- a/version.h
+++ b/version.h
@@ -1,15 +1,15 @@
 #define RUBY_VERSION "1.8.7"
-#define RUBY_RELEASE_DATE "2012-05-21"
+#define RUBY_RELEASE_DATE "2012-06-06"
 #define RUBY_VERSION_CODE 187
-#define RUBY_RELEASE_CODE 20120521
-#define RUBY_PATCHLEVEL 362
+#define RUBY_RELEASE_CODE 20120606
+#define RUBY_PATCHLEVEL 363
 
 #define RUBY_VERSION_MAJOR 1
 #define RUBY_VERSION_MINOR 8
 #define RUBY_VERSION_TEENY 7
 #define RUBY_RELEASE_YEAR 2012
-#define RUBY_RELEASE_MONTH 5
-#define RUBY_RELEASE_DAY 21
+#define RUBY_RELEASE_MONTH 6
+#define RUBY_RELEASE_DAY 6
 
 #ifdef RUBY_EXTERN
 RUBY_EXTERN const char ruby_version[];
-- 
1.8.5.1


From 996e9cf4e9c78c4bf8fdbf937f3984e0b2eb6e40 Mon Sep 17 00:00:00 2001
From: shyouhei <shyouhei@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>
Date: Wed, 6 Jun 2012 05:34:55 +0000
Subject: [PATCH 08/19] @nobu you must run make test-all _before_ you check in.

reverting revision r34920 because it fails.


git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/branches/ruby_1_8_7@35940 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
---
 lib/yaml/rubytypes.rb       |  3 +--
 test/yaml/test_exception.rb | 52 ---------------------------------------------
 version.h                   |  2 +-
 3 files changed, 2 insertions(+), 55 deletions(-)
 delete mode 100644 test/yaml/test_exception.rb

diff --git a/lib/yaml/rubytypes.rb b/lib/yaml/rubytypes.rb
index 55d59fa..35b7191 100644
--- a/lib/yaml/rubytypes.rb
+++ b/lib/yaml/rubytypes.rb
@@ -117,8 +117,7 @@ def to_yaml( opts = {} )
 class Exception
     yaml_as "tag:ruby.yaml.org,2002:exception"
     def Exception.yaml_new( klass, tag, val )
-        o = klass.allocate
-        Exception.instance_method(:initialize).bind(o).call(val.delete('message'))
+        o = YAML.object_maker( klass, { 'mesg' => val.delete( 'message' ) } )
         val.each_pair do |k,v|
             o.instance_variable_set("@#{k}", v)
         end
diff --git a/test/yaml/test_exception.rb b/test/yaml/test_exception.rb
deleted file mode 100644
index 1dc3044..0000000
--- a/test/yaml/test_exception.rb
+++ /dev/null
@@ -1,52 +0,0 @@
-require 'test/unit'
-require 'yaml'
-
-module Syck
-  class TestException < Test::Unit::TestCase
-    class Wups < Exception
-      attr_reader :foo, :bar
-      def initialize *args
-        super
-        @foo = 1
-        @bar = 2
-      end
-
-      def ==(other)
-        self.class == other.class and
-          self.message == other.message and
-          self.backtrace == other.backtrace
-      end
-    end
-
-    def setup
-      @wups = Wups.new('test_message')
-    end
-
-    def test_to_yaml
-      w = YAML.load(@wups.to_yaml)
-      assert_equal @wups, w
-      assert_equal 1, w.foo
-      assert_equal 2, w.bar
-    end
-
-    def test_dump
-      w = YAML.load(@wups.to_yaml)
-      assert_equal @wups, w
-      assert_equal 1, w.foo
-      assert_equal 2, w.bar
-    end
-
-    def test_to_yaml_properties
-      class << @wups
-        def to_yaml_properties
-          [:@foo]
-        end
-      end
-
-      w = YAML.load(YAML.dump(@wups))
-      assert_equal @wups, w
-      assert_equal 1, w.foo
-      assert_nil w.bar
-    end
-  end
-end
diff --git a/version.h b/version.h
index d084c57..3b58c4e 100644
--- a/version.h
+++ b/version.h
@@ -2,7 +2,7 @@
 #define RUBY_RELEASE_DATE "2012-06-06"
 #define RUBY_VERSION_CODE 187
 #define RUBY_RELEASE_CODE 20120606
-#define RUBY_PATCHLEVEL 363
+#define RUBY_PATCHLEVEL 364
 
 #define RUBY_VERSION_MAJOR 1
 #define RUBY_VERSION_MINOR 8
-- 
1.8.5.1


From 1acfb03370704aee624b7a1e5ccf4776f40f2895 Mon Sep 17 00:00:00 2001
From: shyouhei <shyouhei@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>
Date: Wed, 6 Jun 2012 05:47:45 +0000
Subject: [PATCH 09/19] merge revision(s) 28324: 	* bignum.c
 (rb_big2dbl), test/ruby/test_bignum.rb (test_to_f): 	  A negative Bignum
 out of Float range should be converted to -Infinity. 	  [ruby-core:30492]
 [Bug #3362]

git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/branches/ruby_1_8_7@35941 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
---
 ChangeLog                | 15 ++++++---------
 bignum.c                 |  5 ++++-
 test/ruby/test_bignum.rb |  6 ++++++
 version.h                |  2 +-
 4 files changed, 17 insertions(+), 11 deletions(-)

diff --git a/ChangeLog b/ChangeLog
index dd5808a..69c7ced 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,9 @@
+Wed Jun  6 14:44:13 2012  Kenta Murata  <mrkn@mrkn.jp>
+
+	* bignum.c (rb_big2dbl), test/ruby/test_bignum.rb (test_to_f):
+	  A negative Bignum out of Float range should be converted to -Infinity.
+	  [ruby-core:30492] [Bug #3362]
+
 Wed Jun  6 14:06:02 2012  Tanaka Akira  <akr@fsij.org>
 
 	* lib/webrick/utils.rb: fix fcntl call.
@@ -21,15 +27,6 @@ Sat Apr 14 18:51:41 2012  Nobuyoshi Nakada  <nobu@ruby-lang.org>
 	  GC. [exerb-dev:0578].  patched by MURASE Masamitsu
 	  <masamitsu.murase AT gmail.com> at [exerb-dev:0580]
 
-Tue Mar  6 12:05:42 2012  Nobuyoshi Nakada  <nobu@ruby-lang.org>
-
-	* lib/yaml/rubytypes.rb (Exception.yaml_new): fix bug that causes
-	  YAML serialization problem for Exception.
-	  Exception#initialize doesn't use visible instance variable for
-	  the exception message, so call the method with the message.
-	  patched by Jingwen Owen Ou <jingweno AT gmail.com>.
-	  http://github.com/ruby/ruby/pull/41
-
 Fri Mar  2 11:44:33 2012  Nobuyoshi Nakada  <nobu@ruby-lang.org>
 
 	* marshal.c (mark_dump_arg): mark destination string.  patch by
diff --git a/bignum.c b/bignum.c
index 77697ae..6c0bf65 100644
--- a/bignum.c
+++ b/bignum.c
@@ -1069,7 +1069,10 @@
 
     if (isinf(d)) {
 	rb_warn("Bignum out of Float range");
-	d = HUGE_VAL;
+	if (d < 0.0)
+	    d = -HUGE_VAL;
+	else
+	    d = HUGE_VAL;
     }
     return d;
 }
diff --git a/test/ruby/test_bignum.rb b/test/ruby/test_bignum.rb
index 99c5952..a0405ca 100644
--- a/test/ruby/test_bignum.rb
+++ b/test/ruby/test_bignum.rb
@@ -103,4 +103,10 @@ def test_too_big_to_s
     e = assert_raise(RangeError) {(1 << big).to_s}
     assert_match(/too big to convert/, e.message)
   end
+
+  def test_to_f
+    inf = 1 / 0.0
+    assert_equal(inf,  (1  << 65536).to_f)
+    assert_equal(-inf, (-1 << 65536).to_f) # [ruby-core:30492] [Bug #3362]
+  end
 end
diff --git a/version.h b/version.h
index 3b58c4e..3d64d07 100644
--- a/version.h
+++ b/version.h
@@ -2,7 +2,7 @@
 #define RUBY_RELEASE_DATE "2012-06-06"
 #define RUBY_VERSION_CODE 187
 #define RUBY_RELEASE_CODE 20120606
-#define RUBY_PATCHLEVEL 364
+#define RUBY_PATCHLEVEL 365
 
 #define RUBY_VERSION_MAJOR 1
 #define RUBY_VERSION_MINOR 8
-- 
1.8.5.1


From d18b653719687756c82c7c800dee5e91b388fefd Mon Sep 17 00:00:00 2001
From: shyouhei <shyouhei@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>
Date: Wed, 6 Jun 2012 06:16:25 +0000
Subject: [PATCH 10/19] merge revision(s) 23432: 	* eval.c
 (rb_thread_join), ext/thread/thread.c (wake_one): adjusts 	  targets of
 rest waiting threads to join.  [ruby-core:23457]

git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/branches/ruby_1_8_7@35942 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
---
 ChangeLog                  |  5 ++++
 eval.c                     | 10 ++++++++
 ext/thread/thread.c        | 26 +++++++++++++++++--
 test/thread/test_thread.rb | 63 ++++++++++++++++++++++++++++++++++++++++++++++
 version.h                  |  2 +-
 5 files changed, 103 insertions(+), 3 deletions(-)

diff --git a/ChangeLog b/ChangeLog
index 69c7ced..8956096 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,8 @@
+Wed Jun  6 15:09:00 2012  Nobuyoshi Nakada  <nobu@ruby-lang.org>
+
+	* eval.c (rb_thread_join), ext/thread/thread.c (wake_one): adjusts
+	  targets of rest waiting threads to join.  [ruby-core:23457]
+
 Wed Jun  6 14:44:13 2012  Kenta Murata  <mrkn@mrkn.jp>
 
 	* bignum.c (rb_big2dbl), test/ruby/test_bignum.rb (test_to_f):
diff --git a/test/thread/test_thread.rb b/test/thread/test_thread.rb
index 699f4fe..e3246d1 100644
--- a/test/thread/test_thread.rb
+++ b/test/thread/test_thread.rb
@@ -86,5 +86,68 @@ def test_queue_rescue
         assert_nothing_raised("[ruby-dev:37545]") {assert_equal(1, queue.pop)}
         assert(queue.empty?)
     end
+
+  # This test checks that a thread in Mutex#lock which is raised is
+  # completely removed from the wait_list of the mutex
+  def test_mutex_exception_handling
+    m = Mutex.new
+    m.lock
+
+    sleeping = false
+    t = Thread.new do
+      begin
+        m.lock
+      rescue
+      end
+
+      sleeping = true
+      # Keep that thread alive: if the thread returns, the test method
+      # won't be able to check that +m+ has not been taken (dead mutex
+      # owners are ignored)
+      sleep
+    end
+
+    # Wait for t to wait for the mutex and raise it
+    while true
+      sleep 0.1
+      break if t.stop?
+    end
+    t.raise ArgumentError
+    assert(t.alive? || sleeping)
+
+    # Wait for +t+ to reach the sleep
+    while true
+      sleep 0.1
+      break if t.stop?
+    end
+
+    # Now unlock. The mutex should be free, so Mutex#unlock should return nil
+    assert(! m.unlock)
+  end
+
+  def test_mutex_join
+    m = Mutex.new
+    m.lock
+    wt2 = Thread.new do
+      m.lock
+      sleep 0.5
+      m.unlock
+    end
+
+    # Ensure wt2 is waiting on m
+    sleep 0.1
+
+    wt1 = Thread.new do
+      m.lock
+      m.unlock
+    end
+    # Ensure wt1 is waiting on m
+    sleep 0.1
+
+    # Give it to wt2
+    m.unlock
+
+    assert_nothing_raised {wt1.join}
+  end
 end
 
diff --git a/version.h b/version.h
index 3d64d07..293cd6e 100644
--- a/version.h
+++ b/version.h
@@ -2,7 +2,7 @@
 #define RUBY_RELEASE_DATE "2012-06-06"
 #define RUBY_VERSION_CODE 187
 #define RUBY_RELEASE_CODE 20120606
-#define RUBY_PATCHLEVEL 365
+#define RUBY_PATCHLEVEL 366
 
 #define RUBY_VERSION_MAJOR 1
 #define RUBY_VERSION_MINOR 8
-- 
1.8.5.1


From 15fbb87b594a47ed622829cfdd6891eb97ea4726 Mon Sep 17 00:00:00 2001
From: shyouhei <shyouhei@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>
Date: Thu, 7 Jun 2012 10:05:59 +0000
Subject: [PATCH 11/19] merge revision(s) 30993: 	*
 ext/bigdecimal/bigdecimal.c (VpMemAlloc): Fixes a bug reported by Drew Yao
 <ayao at apple.com>

git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/branches/ruby_1_8_7@35953 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
---
 ChangeLog                   | 5 +++++
 ext/bigdecimal/bigdecimal.c | 8 ++++----
 version.h                   | 8 ++++----
 3 files changed, 13 insertions(+), 8 deletions(-)

diff --git a/ChangeLog b/ChangeLog
index 8956096..3ac2f87 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,8 @@
+Thu Jun  7 19:00:35 2012  Kenta Murata <mrkn@mrkn.jp>
+
+	* ext/bigdecimal/bigdecimal.c (VpMemAlloc): Fixes a bug reported
+	  by Drew Yao <ayao at apple.com>
+
 Wed Jun  6 15:09:00 2012  Nobuyoshi Nakada  <nobu@ruby-lang.org>
 
 	* eval.c (rb_thread_join), ext/thread/thread.c (wake_one): adjusts
diff --git a/ext/bigdecimal/bigdecimal.c b/ext/bigdecimal/bigdecimal.c
index 16be520..7ebb3f7 100644
--- a/ext/bigdecimal/bigdecimal.c
+++ b/ext/bigdecimal/bigdecimal.c
@@ -2032,11 +2032,11 @@
 VP_EXPORT void *
 VpMemAlloc(U_LONG mb)
 {
-    void *p = xmalloc((unsigned int)mb);
-    if(!p) {
-        VpException(VP_EXCEPTION_MEMORY,"failed to allocate memory",1);
+    void *p = xmalloc(mb);
+    if (!p) {
+        VpException(VP_EXCEPTION_MEMORY, "failed to allocate memory", 1);
     }
-    memset(p,0,mb);
+    memset(p, 0, mb);
 #ifdef _DEBUG
     gnAlloc++; /* Count allocation call */
 #endif /* _DEBUG */
diff --git a/version.h b/version.h
index 293cd6e..7a53a5c 100644
--- a/version.h
+++ b/version.h
@@ -1,15 +1,15 @@
 #define RUBY_VERSION "1.8.7"
-#define RUBY_RELEASE_DATE "2012-06-06"
+#define RUBY_RELEASE_DATE "2012-06-07"
 #define RUBY_VERSION_CODE 187
-#define RUBY_RELEASE_CODE 20120606
-#define RUBY_PATCHLEVEL 366
+#define RUBY_RELEASE_CODE 20120607
+#define RUBY_PATCHLEVEL 367
 
 #define RUBY_VERSION_MAJOR 1
 #define RUBY_VERSION_MINOR 8
 #define RUBY_VERSION_TEENY 7
 #define RUBY_RELEASE_YEAR 2012
 #define RUBY_RELEASE_MONTH 6
-#define RUBY_RELEASE_DAY 6
+#define RUBY_RELEASE_DAY 7
 
 #ifdef RUBY_EXTERN
 RUBY_EXTERN const char ruby_version[];
-- 
1.8.5.1


From ef73b34c87f52be6a87e0f7ab8d5a03bfcaa983f Mon Sep 17 00:00:00 2001
From: shyouhei <shyouhei@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>
Date: Sat, 9 Jun 2012 18:12:07 +0000
Subject: [PATCH 12/19] merge revision(s) 32542: 	* eval.c
 (ruby_setjmp): need to save the stack after r2 (the Table 	  of Contents
 on ppc64) is saved onto the stack by getcontext(). 	  based on
 <https://bugzilla.redhat.com/show_bug.cgi?id=628715>. 	  Bug#4411

git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/branches/ruby_1_8_7@35995 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
---
 ChangeLog |  7 +++++++
 eval.c    | 18 ++++++++++++++----
 version.h |  8 ++++----
 3 files changed, 25 insertions(+), 8 deletions(-)

diff --git a/ChangeLog b/ChangeLog
index 3ac2f87..9637df1 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,10 @@
+Sun Jun 10 03:00:21 2012  Nobuyoshi Nakada  <nobu@ruby-lang.org>
+
+	* eval.c (ruby_setjmp): need to save the stack after r2 (the Table
+	  of Contents on ppc64) is saved onto the stack by getcontext().
+	  based on <https://bugzilla.redhat.com/show_bug.cgi?id=628715>.
+	  Bug#4411
+
 Thu Jun  7 19:00:35 2012  Kenta Murata <mrkn@mrkn.jp>
 
 	* ext/bigdecimal/bigdecimal.c (VpMemAlloc): Fixes a bug reported
diff --git a/eval.c b/eval.c
index c350159..4458dff 100644
--- a/eval.c
+++ b/eval.c
@@ -179,6 +179,9 @@
        (function_call_may_return_twice_false_2 ? \
         setjmp(function_call_may_return_twice_jmp_buf) : \
         0)
+#  elif defined(__PPC64__)
+#    define JUST_BEFORE_SETJMP(extra_save, j) ((void)0)
+#    define JUST_AFTER_SETJMP(extra_save, j) ((j)->status ? (void)0 : (extra_save))
 #  elif defined(__FreeBSD__) && __FreeBSD__ < 7
 /*
  * workaround for FreeBSD/i386 getcontext/setcontext bug.
@@ -196,16 +199,23 @@
 #  ifndef POST_GETCONTEXT
 #    define POST_GETCONTEXT 0
 #  endif
+#  ifndef JUST_BEFORE_SETJMP
+#    define JUST_BEFORE_SETJMP(extra_save, j) (extra_save)
+#  endif
+#  ifndef JUST_AFTER_SETJMP
+#    define JUST_AFTER_SETJMP(extra_save, j) ((void)0)
+#  endif
 #  define ruby_longjmp(env, val) rb_jump_context(env, val)
-#  define ruby_setjmp(just_before_setjmp, j) ((j)->status = 0, \
-     (just_before_setjmp), \
+#  define ruby_setjmp(extra_save, j) ((j)->status = 0, \
+     JUST_BEFORE_SETJMP(extra_save, j), \
      PRE_GETCONTEXT, \
      getcontext(&(j)->context), \
      POST_GETCONTEXT, \
+     JUST_AFTER_SETJMP(extra_save, j), \
      (j)->status)
 #else
-#  define ruby_setjmp(just_before_setjmp, env) \
-     ((just_before_setjmp), RUBY_SETJMP(env))
+#  define ruby_setjmp(extra_save, env) \
+     ((extra_save), RUBY_SETJMP(env))
 #  define ruby_longjmp(env,val) RUBY_LONGJMP(env,val)
 #  ifdef __CYGWIN__
 int _setjmp(), _longjmp();
diff --git a/version.h b/version.h
index 7a53a5c..6341599 100644
--- a/version.h
+++ b/version.h
@@ -1,15 +1,15 @@
 #define RUBY_VERSION "1.8.7"
-#define RUBY_RELEASE_DATE "2012-06-07"
+#define RUBY_RELEASE_DATE "2012-06-10"
 #define RUBY_VERSION_CODE 187
-#define RUBY_RELEASE_CODE 20120607
-#define RUBY_PATCHLEVEL 367
+#define RUBY_RELEASE_CODE 20120610
+#define RUBY_PATCHLEVEL 368
 
 #define RUBY_VERSION_MAJOR 1
 #define RUBY_VERSION_MINOR 8
 #define RUBY_VERSION_TEENY 7
 #define RUBY_RELEASE_YEAR 2012
 #define RUBY_RELEASE_MONTH 6
-#define RUBY_RELEASE_DAY 7
+#define RUBY_RELEASE_DAY 10
 
 #ifdef RUBY_EXTERN
 RUBY_EXTERN const char ruby_version[];
-- 
1.8.5.1


From d761c9b178d8a2b7757ca5ea41135c7ea37c70b2 Mon Sep 17 00:00:00 2001
From: shyouhei <shyouhei@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>
Date: Mon, 18 Jun 2012 09:53:29 +0000
Subject: [PATCH 13/19] merge revision(s) 32605:32610: 	* backport r32609 from
 trunk. 	* ext/openssl/ossl_hmac.c: Revert checking return type of 
   HMAC_Init_ex as it is not compatible with OpenSSL < 1.0.0. 	* backport
 r32606 from trunk. 	* ext/openssl/ossl_digest.c: Check return value of
 EVP_DigestInit_ex. 	* ext/openssl/ossl_hmac.c: Check return value of
 HMAC_Init_ex. 	  Thanks, Jared Jennings, for the patch. 	  [ Ruby 1.9 -
 Bug #4944 ] [ruby-core:37670]

git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/branches/ruby_1_8_7@36126 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
---
 ChangeLog                 | 16 ++++++++++++++++
 ext/openssl/ossl_digest.c | 12 +++++++++---
 version.h                 |  8 ++++----
 3 files changed, 29 insertions(+), 7 deletions(-)

diff --git a/ChangeLog b/ChangeLog
index 9637df1..e7445fa 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,19 @@
+Mon Jun 18 18:32:43 2012  Martin Bosslet  <Martin.Bosslet@googlemail.com>
+
+	* backport r32609 from trunk.
+
+	* ext/openssl/ossl_hmac.c: Revert checking return type of
+	  HMAC_Init_ex as it is not compatible with OpenSSL < 1.0.0.
+
+Mon Jun 18 18:32:43 2012  Martin Bosslet  <Martin.Bosslet@googlemail.com>
+
+	* backport r32606 from trunk.
+
+	* ext/openssl/ossl_digest.c: Check return value of EVP_DigestInit_ex.
+	* ext/openssl/ossl_hmac.c: Check return value of HMAC_Init_ex.
+	  Thanks, Jared Jennings, for the patch.
+	  [ Ruby 1.9 - Bug #4944 ] [ruby-core:37670]
+
 Sun Jun 10 03:00:21 2012  Nobuyoshi Nakada  <nobu@ruby-lang.org>
 
 	* eval.c (ruby_setjmp): need to save the stack after r2 (the Table
diff --git a/ext/openssl/ossl_digest.c b/ext/openssl/ossl_digest.c
index 879d399..13111ce 100644
--- a/ext/openssl/ossl_digest.c
+++ b/ext/openssl/ossl_digest.c
@@ -62,7 +62,9 @@
 
     ret = ossl_digest_alloc(cDigest);
     GetDigest(ret, ctx);
-    EVP_DigestInit_ex(ctx, md, NULL);
+    if (EVP_DigestInit_ex(ctx, md, NULL) != 1) {
+	ossl_raise(eDigestError, "Digest initialization failed.");
+    }
    
     return ret;
 }
@@ -104,7 +106,9 @@
     if (!NIL_P(data)) StringValue(data);
 
     GetDigest(self, ctx);
-    EVP_DigestInit_ex(ctx, md, NULL);
+    if (EVP_DigestInit_ex(ctx, md, NULL) != 1) {
+	ossl_raise(eDigestError, "Digest initialization failed.");
+    }
     
     if (!NIL_P(data)) return ossl_digest_update(self, data);
     return self;
@@ -138,7 +142,9 @@
     EVP_MD_CTX *ctx;
 
     GetDigest(self, ctx);
-    EVP_DigestInit_ex(ctx, EVP_MD_CTX_md(ctx), NULL);
+    if (EVP_DigestInit_ex(ctx, EVP_MD_CTX_md(ctx), NULL) != 1) {
+	ossl_raise(eDigestError, "Digest initialization failed.");
+    }
 
     return self;
 }
diff --git a/version.h b/version.h
index 6341599..7b2f01a 100644
--- a/version.h
+++ b/version.h
@@ -1,15 +1,15 @@
 #define RUBY_VERSION "1.8.7"
-#define RUBY_RELEASE_DATE "2012-06-10"
+#define RUBY_RELEASE_DATE "2012-06-18"
 #define RUBY_VERSION_CODE 187
-#define RUBY_RELEASE_CODE 20120610
-#define RUBY_PATCHLEVEL 368
+#define RUBY_RELEASE_CODE 20120618
+#define RUBY_PATCHLEVEL 369
 
 #define RUBY_VERSION_MAJOR 1
 #define RUBY_VERSION_MINOR 8
 #define RUBY_VERSION_TEENY 7
 #define RUBY_RELEASE_YEAR 2012
 #define RUBY_RELEASE_MONTH 6
-#define RUBY_RELEASE_DAY 10
+#define RUBY_RELEASE_DAY 18
 
 #ifdef RUBY_EXTERN
 RUBY_EXTERN const char ruby_version[];
-- 
1.8.5.1


From e48d99f0e574a36f0e9c7337b396a437cbff4cc5 Mon Sep 17 00:00:00 2001
From: shyouhei <shyouhei@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>
Date: Fri, 29 Jun 2012 12:31:25 +0000
Subject: [PATCH 14/19] merge revision(s) 36251: 	* eval.c
 (stack_extend): prevent ALLOCA_N, which reserves a memory 	  space with
 for restoring machine stack stored in each threads, from 	  optimization
 out.  backport r34278 from the trunk.

git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/branches/ruby_1_8_7@36253 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
---
 ChangeLog | 6 ++++++
 eval.c    | 2 ++
 version.h | 8 ++++----
 3 files changed, 12 insertions(+), 4 deletions(-)

diff --git a/ChangeLog b/ChangeLog
index e7445fa..2d4bcb0 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,9 @@
+Fri Jun 29 21:26:05 2012  Nobuyoshi Nakada  <nobu@ruby-lang.org>
+
+	* eval.c (stack_extend): prevent ALLOCA_N, which reserves a memory
+	  space with for restoring machine stack stored in each threads, from
+	  optimization out.  backport r34278 from the trunk.
+
 Mon Jun 18 18:32:43 2012  Martin Bosslet  <Martin.Bosslet@googlemail.com>
 
 	* backport r32609 from trunk.
diff --git a/version.h b/version.h
index 7b2f01a..d90d5b1 100644
--- a/version.h
+++ b/version.h
@@ -1,15 +1,15 @@
 #define RUBY_VERSION "1.8.7"
-#define RUBY_RELEASE_DATE "2012-06-18"
+#define RUBY_RELEASE_DATE "2012-06-29"
 #define RUBY_VERSION_CODE 187
-#define RUBY_RELEASE_CODE 20120618
-#define RUBY_PATCHLEVEL 369
+#define RUBY_RELEASE_CODE 20120629
+#define RUBY_PATCHLEVEL 370
 
 #define RUBY_VERSION_MAJOR 1
 #define RUBY_VERSION_MINOR 8
 #define RUBY_VERSION_TEENY 7
 #define RUBY_RELEASE_YEAR 2012
 #define RUBY_RELEASE_MONTH 6
-#define RUBY_RELEASE_DAY 18
+#define RUBY_RELEASE_DAY 29
 
 #ifdef RUBY_EXTERN
 RUBY_EXTERN const char ruby_version[];
-- 
1.8.5.1


From 2ac236dcbd90bd33bfeac4f699763c3baef4038e Mon Sep 17 00:00:00 2001
From: shyouhei <shyouhei@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>
Date: Fri, 12 Oct 2012 04:05:35 +0000
Subject: [PATCH 15/19] * error.c (name_err_to_s): we need not infect msg.

* test/ruby/test_exception.rb (TestException#test_exception_to_s_should_not_propagate_untrustedness): test for it.


git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/branches/ruby_1_8_7@37148 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
---
 ChangeLog                   |  6 ++++++
 error.c                     |  3 ---
 test/ruby/test_exception.rb | 30 +++++++++++++++++++++++++++++-
 version.h                   | 10 +++++-----
 4 files changed, 40 insertions(+), 9 deletions(-)

diff --git a/ChangeLog b/ChangeLog
index 2d4bcb0..e2e1059 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,9 @@
+Fri Oct 12 12:25:15 2012  URABE Shyouhei  <shyouhei@ruby-lang.org>
+
+	* error.c (name_err_to_s): we need not infect msg.
+
+	* test/ruby/test_exception.rb (TestException#test_exception_to_s_should_not_propagate_untrustedness): test for it.
+
 Fri Jun 29 21:26:05 2012  Nobuyoshi Nakada  <nobu@ruby-lang.org>
 
 	* eval.c (stack_extend): prevent ALLOCA_N, which reserves a memory
diff --git a/error.c b/error.c
index 59b445e..2b3bf3f 100644
--- a/error.c
+++ b/error.c
@@ -665,9 +665,6 @@
 
     if (NIL_P(mesg)) return rb_class_name(CLASS_OF(exc));
     StringValue(str);
-    if (str != mesg) {
-	OBJ_INFECT(str, mesg);
-    }
     return str;
 }
 
diff --git a/test/ruby/test_exception.rb b/test/ruby/test_exception.rb
index c5f4091..434838f 100644
--- a/test/ruby/test_exception.rb
+++ b/test/ruby/test_exception.rb
@@ -204,6 +204,34 @@ def o.to_str
     o.taint
     e = NameError.new(o)
     s = e.to_s
-    assert_equal(true, s.tainted?)
+    assert_equal(false, s.tainted?)
+  end
+
+  def test_exception_to_s_should_not_propagate_untrustedness
+    favorite_lang = "Ruby"
+
+    for exc in [Exception, NameError]
+      assert_raise(SecurityError) do
+        lambda {
+          $SAFE = 4
+          exc.new(favorite_lang).to_s
+          favorite_lang.replace("Python")
+        }.call
+      end
+    end
+
+    assert_raise(SecurityError) do
+      lambda {
+        $SAFE = 4
+        o = Object.new
+        (class << o; self; end).send(:define_method, :to_str) {
+          favorite_lang
+        }
+        NameError.new(o).to_s
+        favorite_lang.replace("Python")
+      }.call
+    end
+
+    assert_equal("Ruby", favorite_lang)
   end
 end
diff --git a/version.h b/version.h
index d90d5b1..e509ed2 100644
--- a/version.h
+++ b/version.h
@@ -1,15 +1,15 @@
 #define RUBY_VERSION "1.8.7"
-#define RUBY_RELEASE_DATE "2012-06-29"
+#define RUBY_RELEASE_DATE "2012-10-12"
 #define RUBY_VERSION_CODE 187
-#define RUBY_RELEASE_CODE 20120629
-#define RUBY_PATCHLEVEL 370
+#define RUBY_RELEASE_CODE 20121012
+#define RUBY_PATCHLEVEL 371
 
 #define RUBY_VERSION_MAJOR 1
 #define RUBY_VERSION_MINOR 8
 #define RUBY_VERSION_TEENY 7
 #define RUBY_RELEASE_YEAR 2012
-#define RUBY_RELEASE_MONTH 6
-#define RUBY_RELEASE_DAY 29
+#define RUBY_RELEASE_MONTH 10
+#define RUBY_RELEASE_DAY 12
 
 #ifdef RUBY_EXTERN
 RUBY_EXTERN const char ruby_version[];
-- 
1.8.5.1


From eca9bf617ab517b73598f449388b543d19c72b7d Mon Sep 17 00:00:00 2001
From: shyouhei <shyouhei@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>
Date: Sat, 18 May 2013 14:55:14 +0000
Subject: [PATCH 16/19] merge revision(s) 39384,39509,39511: [Backport #7961]

	* lib/rexml/document.rb (REXML::Document.entity_expansion_text_limit):
	  new attribute to read/write entity expansion text limit.  the default
	  limit is 10Kb.

	* lib/rexml/text.rb (REXML::Text.unnormalize): check above attribute.

	* lib/rexml/document.rb: move entity_expansion_limit accessor to ...

	* lib/rexml/rexml.rb: ... here to make rexml/text independent from
	  REXML::Document. It causes circular require.

	* lib/rexml/document.rb (REXML::Document.entity_expansion_limit):
	  deprecated.

	* lib/rexml/document.rb (REXML::Document.entity_expansion_limit=):
	  deprecated.

	* lib/rexml/text.rb: add missing require "rexml/rexml" for
	  REXML.entity_expansion_limit.
	  Reported by Robert Ulejczyk. Thanks!!! [ruby-core:52895] [Bug #7961]

	* lib/rexml/document.rb: move entity_expansion_text_limit accessor to ...

	* lib/rexml/document.rb (REXML::Document.entity_expansion_text_limit):

	* lib/rexml/document.rb (REXML::Document.entity_expansion_text_limit=):
	  REXML.entity_expansion_text_limit.


git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/branches/ruby_1_8_7@40812 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
---
 ChangeLog             | 21 ++++++++++++++++++++
 lib/rexml/document.rb | 14 ++++++++++++++
 lib/rexml/rexml.rb    | 12 ++++++++++++
 lib/rexml/text.rb     | 53 +++++++++++++++++++++++++--------------------------
 version.h             | 12 ++++++------
 5 files changed, 79 insertions(+), 33 deletions(-)

diff --git a/ChangeLog b/ChangeLog
index e2e1059..c80774f 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,24 @@
+Sat May 18 23:34:50 2013  Kouhei Sutou  <kou@cozmixng.org>
+
+	* lib/rexml/document.rb: move entity_expansion_text_limit accessor to ...
+	* lib/rexml/rexml.rb: ... here to make rexml/text independent from
+	  REXML::Document. It causes circular require.
+	* lib/rexml/document.rb (REXML::Document.entity_expansion_text_limit):
+	  deprecated.
+	* lib/rexml/document.rb (REXML::Document.entity_expansion_text_limit=):
+	  deprecated.
+	* lib/rexml/text.rb: add missing require "rexml/rexml" for
+	  REXML.entity_expansion_text_limit.
+	  Reported by Robert Ulejczyk. Thanks!!! [ruby-core:52895] [Bug #7961]
+
+Sat May 18 23:34:50 2013  Aaron Patterson <aaron@tenderlovemaking.com>
+
+	* lib/rexml/document.rb (REXML::Document.entity_expansion_text_limit):
+	  new attribute to read/write entity expansion text limit.  the default
+	  limit is 10Kb.
+
+	* lib/rexml/text.rb (REXML::Text.unnormalize): check above attribute.
+
 Fri Oct 12 12:25:15 2012  URABE Shyouhei  <shyouhei@ruby-lang.org>
 
 	* error.c (name_err_to_s): we need not infect msg.
diff --git a/lib/rexml/document.rb b/lib/rexml/document.rb
index 3d1300a..16a2c77 100644
--- a/lib/rexml/document.rb
+++ b/lib/rexml/document.rb
@@ -213,6 +213,20 @@ def Document::entity_expansion_limit
       return @@entity_expansion_limit
     end
 
+    # Set the entity expansion limit. By default the limit is set to 10240.
+    #
+    # Deprecated. Use REXML.entity_expansion_text_limit= instead.
+    def Document::entity_expansion_text_limit=( val )
+      REXML.entity_expansion_text_limit = val
+    end
+
+    # Get the entity expansion limit. By default the limit is set to 10000.
+    #
+    # Deprecated. Use REXML.entity_expansion_text_limit instead.
+    def Document::entity_expansion_text_limit
+      return REXML.entity_expansion_text_limit
+    end
+
     attr_reader :entity_expansion_count
     
     def record_entity_expansion
diff --git a/lib/rexml/rexml.rb b/lib/rexml/rexml.rb
index 95bc2a7..8845300 100644
--- a/lib/rexml/rexml.rb
+++ b/lib/rexml/rexml.rb
@@ -29,4 +29,16 @@ module REXML
 
   Copyright = COPYRIGHT
   Version = VERSION
+
+  @@entity_expansion_text_limit = 10_240
+
+  # Set the entity expansion limit. By default the limit is set to 10240.
+  def self.entity_expansion_text_limit=( val )
+    @@entity_expansion_text_limit = val
+  end
+
+  # Get the entity expansion limit. By default the limit is set to 10240.
+  def self.entity_expansion_text_limit
+    return @@entity_expansion_text_limit
+  end
 end
diff --git a/lib/rexml/text.rb b/lib/rexml/text.rb
index a4a30b6..b6dbf45 100644
--- a/lib/rexml/text.rb
+++ b/lib/rexml/text.rb
@@ -1,3 +1,4 @@
+require 'rexml/rexml'
 require 'rexml/entity'
 require 'rexml/doctype'
 require 'rexml/child'
@@ -308,37 +309,35 @@ def Text::normalize( input, doctype=nil, entity_filter=nil )
 
     # Unescapes all possible entities
     def Text::unnormalize( string, doctype=nil, filter=nil, illegal=nil )
-      rv = string.clone
-      rv.gsub!( /\r\n?/, "\n" )
-      matches = rv.scan( REFERENCE )
-      return rv if matches.size == 0
-      rv.gsub!( NUMERICENTITY ) {|m|
-        m=$1
-        m = "0#{m}" if m[0] == ?x
-        [Integer(m)].pack('U*')
+      sum = 0
+      string.gsub( /\r\n?/, "\n" ).gsub( REFERENCE ) {
+        s = Text.expand($&, doctype, filter)
+        if sum + s.bytesize > REXML.entity_expansion_text_limit
+          raise "entity expansion has grown too large"
+        else
+          sum += s.bytesize
+        end
+        s
       }
-      matches.collect!{|x|x[0]}.compact!
-      if matches.size > 0
-        if doctype
-          matches.each do |entity_reference|
-            unless filter and filter.include?(entity_reference)
-              entity_value = doctype.entity( entity_reference )
-              re = /&#{entity_reference};/
-              rv.gsub!( re, entity_value ) if entity_value
-            end
-          end
+    end
+
+    def Text.expand(ref, doctype, filter)
+      if ref[1] == ?#
+        if ref[2] == ?x
+          [ref[3...-1].to_i(16)].pack('U*')
         else
-          matches.each do |entity_reference|
-            unless filter and filter.include?(entity_reference)
-              entity_value = DocType::DEFAULT_ENTITIES[ entity_reference ]
-              re = /&#{entity_reference};/
-              rv.gsub!( re, entity_value.value ) if entity_value
-            end
-          end
+          [ref[2...-1].to_i].pack('U*')
         end
-        rv.gsub!( /&amp;/, '&' )
+      elsif ref == '&amp;'
+        '&'
+      elsif filter and filter.include?( ref[1...-1] )
+        ref
+      elsif doctype
+        doctype.entity( ref[1...-1] ) or ref
+      else
+        entity_value = DocType::DEFAULT_ENTITIES[ ref[1...-1] ]
+        entity_value ? entity_value.value : ref
       end
-      rv
     end
   end
 end
diff --git a/version.h b/version.h
index e509ed2..2158647 100644
--- a/version.h
+++ b/version.h
@@ -1,15 +1,15 @@
 #define RUBY_VERSION "1.8.7"
-#define RUBY_RELEASE_DATE "2012-10-12"
+#define RUBY_RELEASE_DATE "2013-05-18"
 #define RUBY_VERSION_CODE 187
-#define RUBY_RELEASE_CODE 20121012
-#define RUBY_PATCHLEVEL 371
+#define RUBY_RELEASE_CODE 20130518
+#define RUBY_PATCHLEVEL 372
 
 #define RUBY_VERSION_MAJOR 1
 #define RUBY_VERSION_MINOR 8
 #define RUBY_VERSION_TEENY 7
-#define RUBY_RELEASE_YEAR 2012
-#define RUBY_RELEASE_MONTH 10
-#define RUBY_RELEASE_DAY 12
+#define RUBY_RELEASE_YEAR 2013
+#define RUBY_RELEASE_MONTH 5
+#define RUBY_RELEASE_DAY 18
 
 #ifdef RUBY_EXTERN
 RUBY_EXTERN const char ruby_version[];
-- 
1.8.5.1


From 961bf7496ded3acfe847cf56fa90bbdcfd6e614f Mon Sep 17 00:00:00 2001
From: shyouhei <shyouhei@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>
Date: Thu, 27 Jun 2013 11:22:26 +0000
Subject: [PATCH 17/19] 	* ext/openssl/lib/openssl/ssl-internal.rb
 (OpenSSL::SSL#verify_certificate_identity): 	  fix hostname verification.
 Patch by nahi.

	* test/openssl/test_ssl.rb (OpenSSL#test_verify_certificate_identity):
	  test for above.


git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/branches/ruby_1_8_7@41676 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
---
 ChangeLog                               |  8 ++++++++
 ext/openssl/lib/openssl/ssl-internal.rb | 18 +++++++++++++-----
 test/openssl/test_ssl.rb                | 23 +++++++++++++++++++++++
 version.h                               | 10 +++++-----
 4 files changed, 49 insertions(+), 10 deletions(-)

diff --git a/ChangeLog b/ChangeLog
index c80774f..cbba5f0 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,11 @@
+Thu Jun 27 20:21:18 2013  URABE Shyouhei  <shyouhei@ruby-lang.org>
+
+	* ext/openssl/lib/openssl/ssl-internal.rb (OpenSSL::SSL#verify_certificate_identity):
+	  fix hostname verification. Patch by nahi.
+
+	* test/openssl/test_ssl.rb (OpenSSL#test_verify_certificate_identity):
+	  test for above.
+
 Sat May 18 23:34:50 2013  Kouhei Sutou  <kou@cozmixng.org>
 
 	* lib/rexml/document.rb: move entity_expansion_text_limit accessor to ...
diff --git a/ext/openssl/lib/openssl/ssl-internal.rb b/ext/openssl/lib/openssl/ssl-internal.rb
index abf0e8d..9ef6f92 100644
--- a/ext/openssl/lib/openssl/ssl-internal.rb
+++ b/ext/openssl/lib/openssl/ssl-internal.rb
@@ -90,14 +90,22 @@ def verify_certificate_identity(cert, hostname)
       should_verify_common_name = true
       cert.extensions.each{|ext|
         next if ext.oid != "subjectAltName"
-        ext.value.split(/,\s+/).each{|general_name|
-          if /\ADNS:(.*)/ =~ general_name
+        id, ostr = OpenSSL::ASN1.decode(ext.to_der).value
+        sequence = OpenSSL::ASN1.decode(ostr.value)
+        sequence.value.each{|san|
+          case san.tag
+          when 2 # dNSName in GeneralName (RFC5280)
             should_verify_common_name = false
-            reg = Regexp.escape($1).gsub(/\\\*/, "[^.]+")
+            reg = Regexp.escape(san.value).gsub(/\\\*/, "[^.]+")
             return true if /\A#{reg}\z/i =~ hostname
-          elsif /\AIP Address:(.*)/ =~ general_name
+          when 7 # iPAddress in GeneralName (RFC5280)
             should_verify_common_name = false
-            return true if $1 == hostname
+            # follows GENERAL_NAME_print() in x509v3/v3_alt.c
+            if san.value.size == 4
+              return true if san.value.unpack('C*').join('.') == hostname
+            elsif san.value.size == 16
+              return true if san.value.unpack('n*').map { |e| sprintf("%X", e) }.join(':') == hostname
+            end
           end
         }
       }
diff --git a/test/openssl/test_ssl.rb b/test/openssl/test_ssl.rb
index 177b684..098ccdd 100644
--- a/test/openssl/test_ssl.rb
+++ b/test/openssl/test_ssl.rb
@@ -547,6 +547,29 @@ def test_unset_OP_ALL
       ssl.close
     }
   end
+ 
+  def test_verify_certificate_identity
+    # creating NULL byte SAN certificate
+    ef = OpenSSL::X509::ExtensionFactory.new
+    cert = OpenSSL::X509::Certificate.new
+    cert.subject = OpenSSL::X509::Name.parse "/DC=some/DC=site/CN=Some Site"
+    ext = ef.create_ext('subjectAltName', 'DNS:placeholder,IP:192.168.7.1,IP:13::17')
+    ext_asn1 = OpenSSL::ASN1.decode(ext.to_der)
+    san_list_der = ext_asn1.value.reduce(nil) { |memo,val| val.tag == 4 ? val.value : memo }
+    san_list_asn1 = OpenSSL::ASN1.decode(san_list_der)
+    san_list_asn1.value[0].value = 'www.example.com\0.evil.com'
+    ext_asn1.value[1].value = san_list_asn1.to_der
+    real_ext = OpenSSL::X509::Extension.new ext_asn1
+    cert.add_extension(real_ext)
+
+    assert_equal(false, OpenSSL::SSL.verify_certificate_identity(cert, 'www.example.com'))
+    assert_equal(true,  OpenSSL::SSL.verify_certificate_identity(cert, 'www.example.com\0.evil.com'))
+    assert_equal(false, OpenSSL::SSL.verify_certificate_identity(cert, '192.168.7.255'))
+    assert_equal(true,  OpenSSL::SSL.verify_certificate_identity(cert, '192.168.7.1'))
+    assert_equal(false, OpenSSL::SSL.verify_certificate_identity(cert, '13::17'))
+    assert_equal(true,  OpenSSL::SSL.verify_certificate_identity(cert, '13:0:0:0:0:0:0:17'))
+  end
+L
 end
 
 end
diff --git a/version.h b/version.h
index 2158647..97111c5 100644
--- a/version.h
+++ b/version.h
@@ -1,15 +1,15 @@
 #define RUBY_VERSION "1.8.7"
-#define RUBY_RELEASE_DATE "2013-05-18"
+#define RUBY_RELEASE_DATE "2013-06-27"
 #define RUBY_VERSION_CODE 187
-#define RUBY_RELEASE_CODE 20130518
-#define RUBY_PATCHLEVEL 372
+#define RUBY_RELEASE_CODE 20130627
+#define RUBY_PATCHLEVEL 373
 
 #define RUBY_VERSION_MAJOR 1
 #define RUBY_VERSION_MINOR 8
 #define RUBY_VERSION_TEENY 7
 #define RUBY_RELEASE_YEAR 2013
-#define RUBY_RELEASE_MONTH 5
-#define RUBY_RELEASE_DAY 18
+#define RUBY_RELEASE_MONTH 6
+#define RUBY_RELEASE_DAY 27
 
 #ifdef RUBY_EXTERN
 RUBY_EXTERN const char ruby_version[];
-- 
1.8.5.1


From 469d4b9389cc2f877f2f17ba248146831d69c66b Mon Sep 17 00:00:00 2001
From: shyouhei <shyouhei@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>
Date: Thu, 27 Jun 2013 11:56:26 +0000
Subject: [PATCH 18/19] Oops, sorry!

git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/branches/ruby_1_8_7@41678 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
---
 ChangeLog                | 4 ++++
 test/openssl/test_ssl.rb | 1 -
 version.h                | 2 +-
 3 files changed, 5 insertions(+), 2 deletions(-)

diff --git a/ChangeLog b/ChangeLog
index cbba5f0..dbba29d 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,7 @@
+Thu Jun 27 20:55:23 2013  URABE Shyouhei  <shyouhei@ruby-lang.org>
+
+	* test/openssl/test_ssl.rb: Oops, sorry!
+
 Thu Jun 27 20:21:18 2013  URABE Shyouhei  <shyouhei@ruby-lang.org>
 
 	* ext/openssl/lib/openssl/ssl-internal.rb (OpenSSL::SSL#verify_certificate_identity):
diff --git a/test/openssl/test_ssl.rb b/test/openssl/test_ssl.rb
index 098ccdd..2e014f1 100644
--- a/test/openssl/test_ssl.rb
+++ b/test/openssl/test_ssl.rb
@@ -569,7 +569,6 @@ def test_verify_certificate_identity
     assert_equal(false, OpenSSL::SSL.verify_certificate_identity(cert, '13::17'))
     assert_equal(true,  OpenSSL::SSL.verify_certificate_identity(cert, '13:0:0:0:0:0:0:17'))
   end
-L
 end
 
 end
diff --git a/version.h b/version.h
index 97111c5..6b6d57e 100644
--- a/version.h
+++ b/version.h
@@ -2,7 +2,7 @@
 #define RUBY_RELEASE_DATE "2013-06-27"
 #define RUBY_VERSION_CODE 187
 #define RUBY_RELEASE_CODE 20130627
-#define RUBY_PATCHLEVEL 373
+#define RUBY_PATCHLEVEL 374
 
 #define RUBY_VERSION_MAJOR 1
 #define RUBY_VERSION_MINOR 8
-- 
1.8.5.1

patches/ree/1.8.7/no_sslv2.diff000066400000001252147511530520012025 0ustar00Index: ossl_ssl.c
===================================================================
--- a/ext/openssl/ossl_ssl.c	(revision 32381)
+++ b/ext/openssl/ossl_ssl.c	(revision 32382)
@@ -107,9 +107,12 @@
     OSSL_SSL_METHOD_ENTRY(TLSv1),
     OSSL_SSL_METHOD_ENTRY(TLSv1_server),
     OSSL_SSL_METHOD_ENTRY(TLSv1_client),
+#if defined(HAVE_SSLV2_METHOD) && defined(HAVE_SSLV2_SERVER_METHOD) && \
+        defined(HAVE_SSLV2_CLIENT_METHOD)	
     OSSL_SSL_METHOD_ENTRY(SSLv2),
     OSSL_SSL_METHOD_ENTRY(SSLv2_server),
     OSSL_SSL_METHOD_ENTRY(SSLv2_client),
+#endif
     OSSL_SSL_METHOD_ENTRY(SSLv3),
     OSSL_SSL_METHOD_ENTRY(SSLv3_server),
     OSSL_SSL_METHOD_ENTRY(SSLv3_client),
patches/ree/1.8.7/readline-fix.diff000066400000002036147511530520012630 0ustar00diff --git a/ext/readline/extconf.rb b/ext/readline/extconf.rb
index b820c0b..f299cba 100644
--- a/ext/readline/extconf.rb
+++ b/ext/readline/extconf.rb
@@ -59,6 +59,9 @@ have_func("rl_cleanup_after_signal")
 have_func("rl_clear_signals")
 have_func("rl_vi_editing_mode")
 have_func("rl_emacs_editing_mode")
+# workaround for native windows.
+/mswin|bccwin|mingw/ !~ RUBY_PLATFORM && have_readline_var("rl_catch_sigwinch")
+/mswin|bccwin|mingw/ !~ RUBY_PLATFORM && have_readline_var("rl_catch_signals")
 have_func("replace_history_entry")
 have_func("remove_history")
 create_makefile("readline")
diff --git a/ext/readline/readline.c b/ext/readline/readline.c
index c9acaad..637cb99 100644
--- a/ext/readline/readline.c
+++ b/ext/readline/readline.c
@@ -833,6 +833,12 @@ Init_readline()
 #ifdef HAVE_RL_EVENT_HOOK
     rl_event_hook = readline_event;
 #endif
+#ifdef HAVE_RL_CATCH_SIGNALS
+    rl_catch_signals = 0;
+#endif
+#ifdef HAVE_RL_CATCH_SIGWINCH
+    rl_catch_sigwinch = 0;
+#endif
 #ifdef HAVE_RL_CLEAR_SIGNALS
     rl_clear_signals();
 #endif
patches/ree/1.8.7/zlib-gc-fix.diff000066400000000477147511530520012403 0ustar00diff --git a/ext/zlib/zlib.c b/ext/zlib/zlib.c
index b87e691..5f701ab 100644
--- a/ext/zlib/zlib.c
+++ b/ext/zlib/zlib.c
@@ -610,6 +610,7 @@ zstream_append_input(z, src, len)
 }
 
 #define zstream_append_input2(z,v)\
+    RB_GC_GUARD(v),\
     zstream_append_input((z), RSTRING(v)->ptr, RSTRING(v)->len)
 
 static void
patches/readline-6.2/patch-shobj-conf.diff000066400000003471147511530520014252 0ustar00--- support/shobj-conf.orig	2009-10-29 00:20:21.000000000 +1100
+++ support/shobj-conf	2011-03-24 13:43:03.000000000 +1100
@@ -157,19 +157,19 @@
 	;;
 
 # Darwin/MacOS X
-darwin[89]*|darwin10*)
+darwin[89]*|darwin1[0-9]*)
 	SHOBJ_STATUS=supported
 	SHLIB_STATUS=supported
 	
 	SHOBJ_CFLAGS='-fno-common'
 
-	SHOBJ_LD='MACOSX_DEPLOYMENT_TARGET=10.3 ${CC}'
+	SHOBJ_LD='${CC}'
 
 	SHLIB_LIBVERSION='$(SHLIB_MAJOR)$(SHLIB_MINOR).$(SHLIB_LIBSUFF)'
 	SHLIB_LIBSUFF='dylib'
 
-	SHOBJ_LDFLAGS='-dynamiclib -dynamic -undefined dynamic_lookup -arch_only `/usr/bin/arch`'
-	SHLIB_XLDFLAGS='-dynamiclib -arch_only `/usr/bin/arch` -install_name $(libdir)/$@ -current_version $(SHLIB_MAJOR)$(SHLIB_MINOR) -compatibility_version $(SHLIB_MAJOR) -v'
+	SHOBJ_LDFLAGS='-dynamiclib -dynamic -undefined dynamic_lookup'
+	SHLIB_XLDFLAGS='-dynamiclib -install_name $(libdir)/$@ -current_version $(SHLIB_MAJOR)$(SHLIB_MINOR) -compatibility_version $(SHLIB_MAJOR) -v'
 
 	SHLIB_LIBS='-lncurses'	# see if -lcurses works on MacOS X 10.1 
 	;;
@@ -186,11 +186,11 @@
 	SHLIB_LIBSUFF='dylib'
 
 	case "${host_os}" in
-	darwin[789]*|darwin10*)	SHOBJ_LDFLAGS=''
-			SHLIB_XLDFLAGS='-dynamiclib -arch_only `/usr/bin/arch` -install_name $(libdir)/$@ -current_version $(SHLIB_MAJOR)$(SHLIB_MINOR) -compatibility_version $(SHLIB_MAJOR) -v'
+	darwin[789]*|darwin1[0-9]*)	SHOBJ_LDFLAGS=''
+			SHLIB_XLDFLAGS='-dynamiclib -install_name $(libdir)/$@ -current_version $(SHLIB_MAJOR)$(SHLIB_MINOR) -compatibility_version $(SHLIB_MAJOR) -v'
 			;;
 	*)		SHOBJ_LDFLAGS='-dynamic'
-			SHLIB_XLDFLAGS='-arch_only `/usr/bin/arch` -install_name $(libdir)/$@ -current_version $(SHLIB_MAJOR)$(SHLIB_MINOR) -compatibility_version $(SHLIB_MAJOR) -v'
+			SHLIB_XLDFLAGS='-install_name $(libdir)/$@ -current_version $(SHLIB_MAJOR)$(SHLIB_MINOR) -compatibility_version $(SHLIB_MAJOR) -v'
 			;;
 	esac
 
patches/libxslt-1.1.26/solaris.patch000066400000000303147511530520013075 0ustar00--- libxslt/Makefile.in
+++ libxslt/Makefile.in_nosyms
@@ -339,2 +339,5 @@ man_MANS = libxslt.3
 EXTRA_DIST = $(man_MANS) trio.h triodef.h libxslt.syms
+
+LIBXSLT_VERSION_SCRIPT =
+
 all: all-am
patches/jruby/1.7.9/joni.patch000066400000000436147511530520011772 0ustar00--- a/core/pom.xml
+++ b/core/pom.xml
@@ -45,7 +45,7 @@
     <dependency>
       <groupId>org.jruby.joni</groupId>
       <artifactId>joni</artifactId>
-      <version>2.1.1-SNAPSHOT</version>
+      <version>2.1.1</version>
       <type>jar</type>
     </dependency>
     <dependency>
patches/jruby/rubygems_etc.patch000066400000001664147511530520013053 0ustar00--- jruby/lib/ruby/shared/rubygems/config_file.rb
+++ jrub-fix/lib/ruby/shared/rubygems/config_file.rb
@@ -25,6 +25,8 @@
 # +:sources+:: Sets Gem::sources
 # +:verbose+:: See #verbose
 
+require 'rbconfig'
+
 class Gem::ConfigFile
 
   DEFAULT_BACKTRACE = false
@@ -68,7 +70,7 @@
 
         path.strip
       rescue LoadError
-        "/etc"
+        RbConfig::CONFIG["sysconfdir"] || "/etc"
       end
     end
 
--- jruby/bin/jgem
+++ jruby-fix/bin/jgem
@@ -9,6 +9,15 @@
 # See LICENSE.txt for permissions.
 #++
 
+# The prelude in 1.9.1 injects rubygems.rb into $LOADED_FEATURES
+# which prevents the `require 'rubygems'` from actually loading
+# the site's version of rubygems. So we have to use it's API
+# to get it's prelude out of the way.
+#
+if RUBY_VERSION =~ /^1\.9\.1/ && defined?(Gem::QuickLoader)
+  Gem::QuickLoader.load_full_rubygems_library
+end
+
 require 'rubygems'
 require 'rubygems/gem_runner'
 require 'rubygems/exceptions'
examples/rvmrc000066400000005200147511530520007440 0ustar00# Example ~/.rvmrc file.
#
# This file shows some examples of setting defaults to your own tastes.
#
# If you wish to adjust the default ruby interpreter/version/patchlevel
# settings they can be found in the $rvm_path/config/db file.
# Beware that currently that file is overwritten on install so
# back it up if you change anything.

# RVM path
#   This is where rvm installs and manages everything in by default.
#
# export rvm_path="$HOME/.rvm"

# Source path
#   This is where rvm extracts to for compiling & installing.
#
# export rvm_source_path="${rvm_path}/src"

# Log path
#   This is where rvm logs all of it's actions to
#   (not including the 'do' actions)
#
# export rvm_log_path="${rvm_path}/log"

# Bin path
#   This is where rvm places all of it's executable/wrapper scripts.
#
# export rvm_bin_path="${rvm_path}/bin"

# Gem path
#   This is where rvm installs all gems to for each ruby
#   interpreter/version%gemset
#
# export rvm_gems_path="$rvm_path/gems"

# Gem options
#   These options are passed to the 'gem' command in a RVM environment.
#
# export rvm_gem_options="--no-rdoc --no-ri"

# Temp path
#   This is where rvm stores all of its temporary files.
#
# export rvm_tmp_path="${rvm_tmp_path:-"$rvm_path/tmp"}"

# Install on use
#   Install rubies when used if are not installed.
#
# export rvm_install_on_use_flag=1

# Gemset create on use
#   This will create a gemset when the gemset is used if it does not exist
#
# export rvm_gemset_create_on_use_flag=1

# Make flags
#   I have 8 cpu's so I might use 7 make threads:
#
# export rvm_make_flags="-j7"

# Source a .rvmrc file in a directory after changing to it, if it exists.
# To disable this feature, set in root/home .rvmrc file:
#
# export rvm_project_rvmrc=0
#
# Or don't even bother sourcing rvm, it *is* optional. Always has been, you can
# instead add $rvm_path/bin to your PATH and use --default to switch...

# Automatically trust project .rvmrc files
#
# export rvm_trust_rvmrcs_flag=1

# Always trust an rvmrc, even if it's contents change.
#   CAUTION: Can be dangerous / security risk. Only use this feature if you know
#          what you are doing / accept the implications :)
#
# export rvm_always_trust_rvmrc_flag

# Specify RBXOPT enviroment settings that should always be set when calling
# Rubinius scripts. For example, to always run the agent when running from
# an Rubinius environment, set the value to '-Xagent'
#
# export rvm_rbx_opt

# Disable automatic system configuration of RVM via /etc/profile.d/rvm.sh:
#
# export rvm_etc_profile_flag=0

# Add configure flags for builds
#
# export rvm_configure_flags="--with-openssl-dir=$rvm_path/usr --with-readline-dir=$rvm_path/usr"
man/man1/rvm.1.gz000066400000005771147511530520007477 0ustar00��M&[rvm.1�Ymo�F��_�0��.d��p�먎��6$�mŊ\J�I.�KJ���~��.�D���5@q����<3�|�p(��!��?wq��sa�i5tQ+m�Ň�'?M��B��G�*%VE���F�Z?m4�T1R���b�+�)#y���0Q�4+��6Qv�Ta�l��_���?����O���;�zt��ѫӳ���Tf�L1S~�X�����ym�ٿ~+�e)�x=ΖIlW4|0�{#g��Cqx��͖x؁i��}���(_	�
�H�I!"mRYq���c+	��W*�E���a��T�"��ߊ#Ҁ(���"QQ�Ûe�	�%�メE�az1��7�w��;1�����ś�l,�����������"@<�����r���X:7��b�����dk��!������M�{q5��G~�����\�g<^\�c5u2�};��P~����ч/��!�|t"��/gFwR�cEl��NጰA�)XH'b�����I�7V��̦�����3[`|@��	Z���Ql�b%R�]��iBe���,U72:��B��(�ˠ�BZGb�Ry����x{K�z8y8Y)�$��\��w*��=�[�!\ƅ��b���q�D�~�O�0���

��.���<ր[7p�ud�;���F�ؒ��4T�r٠�����Q��P!zG��?m1VyY�A+�T�Gk4�����ݛ��>j��Pl���1*�k�R'a5(��L(
���{�m	�4����j݆���
\�
��O��{5Yr�$d�]�������2ͅ}�s[���v[:�p�i��}����Vj小�� �<B������*͙a�.�b�X�P�,&�}!��E�4=cb��~I>RR�"�ܣ�b��LQ�ۢ�g�h�i��^X�U�֛�S09]��D�f'��1�0�S$1�\I���Dƃ���<[�è:ϮJq�AY��&V�]%���#��G��#La�qϝ��Lk$Lh�ζ����{��	V1\��jpH�Po�Jm0��V��@��y��8�RT&�[��!e��h��8r1yܳK���'�E&��A+N9��V_5���o����ہDŽ��I��s�H��A����#-�
�uZ�k������{U���؇�=ж����2ۺIJ(c.��9ݠ��[]��޸.8H����3��.�<�q6�,����q/�3�J�؏f�,�1k�+��:!kW���`vچ��1���W#�?�H�79�D����1Y�Tni�Hӹ �2���T���"�*#}r⢂�Q�H����+?o�R�7��L`L�����3}<���U�*��,���Dȃ*�3r�F�L{�(k�(�a��.��$b;f�\.-l�32�/ 32��}�;u����;�\�$\2���d{3�ۄ�(�B��8��	Z�=Q���k�����N�s֨7�tL�1]„I��_�+vG�ɝ�y�\(%���II�L4_Ap�hg�j�g����;�A��PTQ���Uq��|*pa��bED�v�;�g�Rq�*3G����'�`�N�\���K͡�1���L.%�W(� )�à��T
�rA|� ����P�!�j��*��������׃��h�1Šph�%C�Ј�:�H�[�����K���b�!
:(���
P��*q��(~�9=�s.��d
Vw��WtP�S�˂��Y�	רx4TAB�䃳}�8�$��$G��|,��گr�vy���L�$��
�w�$B�b|[�H`x���u�;%�zY��G���J�+XÀ�5C��	����(V�`vI�cw7� �[tF]��]���P�Y�:z�D����;r�w\�l�/
����clWn71"�<��\�$˨�(Q�TMщ��`W{U��+��c+`���Q��a��'��*��Ŝ
���nW!"��L�ɡ18�GB�6#t�XH��l���ԩ�"���!v��&k�M�i��3
�!��\sv�g���¯ώ��B/��؎�v�N�KE�N��i9
�n������*�ekQ��v�e
;��ːwo;��t�h�G�_c=r�V%(s��ݬ�ͻj��H�'��`ٕ�)�0�ND>�1T��_�RLWD��](5ٹ�W�Y��[��q���0uM��\*�Y�\���5w��3n�+y���kG+��U1�P%��+C���G}�jD�H�D�ڣ�����J&HSZ���]P]����r"�9��>���."��3d`4��-1;.�£��ãw�-�15�S7 ��33		%�g�w���ЫϾt��e�}:D��y?h����jT��‚}��Q���<E�okJ�_\��?����}��h����*�Z������Q�X7R����R�W
#�&�J�|�^�%]?��R	�÷����[	�[)pg�\0>G���|.�G�T}&�Q�L����Y�W�F�Zb#��J��@c������]s�K	%s��9j+��̛*����^�~|�˵�.mU���D��n�+�a�g�c�B|v�;Ü���{b|��e�m�^��'��l2z1�w�#�������4�������@��o��W��y���O��g�����k�vl]b
߇� �R�Ǧ@A)��ۻ�1��6!iĥ퐟)��]g�;7�v�b/W"wQ"�ġ*���Ƭ�#)H�+#er?���oc�؝)F�6v�3гC�4X��w�n8�5
P��E��ɋ��"]��LA�]���)3�"���D��"h���vc.��O↾�����Z�3:/����(�D!�-�y�^z�	d����:_W�	F��]��A'[w��V�G��v�������$��U��U�c7B,ܑ���p�c���ݯ4R�̑��j��Q���Jڌ�>U����e����Q������r�?NQ��Z�G`5��5��l�X}E���}?��r+/u�5p�B������G���1)c��e��ĹR���r|=�ʈ/�U!c���?��^��man/man1/rvm.1000066400000020005147511530520007043 0ustar00'\" t
.\"     Title: rvm
.\"    Author: [FIXME: author] [see http://docbook.sf.net/el/author]
.\" Generator: DocBook XSL Stylesheets v1.75.2 <http://docbook.sf.net/>
.\"      Date: 07/16/2010
.\"    Manual: [FIXME: manual]
.\"    Source: [FIXME: source]
.\"  Language: English
.\"
.TH "RVM" "1" "07/16/2010" "[FIXME: source]" "[FIXME: manual]"
.\" -----------------------------------------------------------------
.\" * set default formatting
.\" -----------------------------------------------------------------
.\" disable hyphenation
.nh
.\" disable justification (adjust text to left margin only)
.ad l
.\" -----------------------------------------------------------------
.\" * MAIN CONTENT STARTS HERE *
.\" -----------------------------------------------------------------
.SH "NAME"
rvm \- The Ruby Version Manager
.SH "SYNOPSIS"
.sp
\fBrvm\fR [\fIFLAGS\fR] [\fIOPTIONS\fR] \fIACTION\fR [\fIIMPLEMENTATION\fR[,\fIIMPLEMENTATION\fR[,\fI\&...\fR]]
.SH "DESCRIPTION"
.sp
RVM is a command line tool which allows us to easily install, manage and work with multiple ruby environments from interpreters to sets of gems\&.
.SH "FLAGS"
.PP
\fB\-\-head\fR
.RS 4
with update, updates rvm to git head version\&.
.RE
.PP
\fB\-\-rubygems\fR
.RS 4
with update, updates rubygems for selected ruby
.RE
.PP
\fB\-\-default\fR
.RS 4
with ruby select, sets a default ruby for new shells\&.
.RE
.PP
\fB\-\-debug\fR
.RS 4
Toggle debug mode on for very verbose output\&.
.RE
.PP
\fB\-\-trace\fR
.RS 4
Toggle trace mode on to see EVERYTHING rvm is doing\&.
.RE
.PP
\fB\-\-force\fR
.RS 4
Force install, removes old install & source before install\&.
.RE
.PP
\fB\-\-summary\fR
.RS 4
Used with rubydo to print out a summary of the commands run\&.
.RE
.PP
\fB\-\-latest\fR
.RS 4
with gemset \-\-dump skips version strings for latest gem\&.
.RE
.PP
\fB\-\-gems\fR
.RS 4
with uninstall/remove removes gems with the interpreter\&.
.RE
.PP
\fB\-\-docs\fR
.RS 4
with install, attempt to generate ri after installation\&.
.RE
.PP
\fB\-\-reconfigure\fR
.RS 4
Force \&./configure on install even if Makefile already exists\&.
.RE
.SH "OPTIONS"
.PP
\fB\-v, \-\-version\fR
.RS 4
Emit rvm version loaded for current shell\&.
.RE
.PP
\fB\-l, \-\-level\fR
.RS 4
patch level to use with rvm use / install
.RE
.PP
\fB\-\-bin\fR
.RS 4
path for binaries to be placed (\fI~/\&.rvm/bin/\fR)
.RE
.PP
\fB\-\-source\fR
.RS 4
src directory to use (\fI~/\&.rvm/src/\fR)
.RE
.PP
\fB\-\-archives\fR
.RS 4
directory for downloaded files (\fI~/\&.rvm/archives/\fR)
.RE
.PP
\fB\-S\fR
.RS 4
Specify a script file to attempt to load and run (rubydo)\&.
.RE
.PP
\fB\-e\fR
.RS 4
Execute code from the command line\&.
.RE
.PP
\fB\-G\fR
.RS 4
root gem path to use
.RE
.PP
\fB\-\-gems\fR
.RS 4
Used to set the
\fIgems_flag\fR, use with
\fIremove\fR
to remove gems\&.
.RE
.PP
\fB\-\-archive\fR
.RS 4
Used to set the
\fIarchive_flag\fR, use with
\fIremove\fR
to remove archive\&.
.RE
.PP
\fB\-\-patch\fR, \fB\-\-patches\fR
.RS 4
With any ruby build from source, allows you to specify patch paths and patch names to be applied prior to building\&. Values should be a relative / absolute path to a patch or the name of known patch / patchset\&. Optionally, paths or names may be followed by
\fI%someinteger\fR
\- e\&.g\&.
\fI\-\-patches mypatch%2\fR
\- where the number following the % specifies the value of the \-p argument to patch, defaulting to two\&.
.RE
.PP
\fB\-C, \-\-configure\fR
.RS 4
custom configure options\&. If you need to pass several configure options then append them comma separated:
\fI\-C \-\-\&...,\-\-\&...,\-\-\&...\fR\&.
.RE
.PP
\fB\-\-nice\fR
.RS 4
process niceness (for slow computers, default 0)
.RE
.PP
\fB\-\-ree\-options\fR
.RS 4
Options passed directly to ree\(cqs
\fI\&./installer\fR
on the command line\&.
.RE
.SH "ACTIONS"
.PP
\fBversion\fR
.RS 4
Show the rvm version installed in rvm_path\&.
.RE
.PP
\fBuse\fR
.RS 4
Setup current shell to use a specific ruby version\&.
.RE
.PP
\fBreload\fR
.RS 4
Reload rvm source itself (useful after changing rvm source)\&.
.RE
.PP
\fBdo\fR
.RS 4
Executes the command against either all or a listed subset of rubies. eg. rvm do gem --version ; rvm 1.8.7,1.9.2 do rake --version
.RE
.PP
\fBenv\fR
.RS 4
Displays information about an environment specified but the given ruby string\&. Useful for getting a sourceable path or an evaluatable set of shell variable declarations\&.
.RE
.PP
\fBimplode\fR
.RS 4
(seppuku) removes the rvm installation completely\&. This means everything in $rvm_path (\fI~/\&.rvm\fR)\&. This does not touch your profiles. However, this means that you must manually clean up your profiles and remove the lines which source RVM.
\fIscripts/rvm\fR\&.
.RE
.PP
\fBupdate\fR
.RS 4
Upgrades rvm to the latest version\&. (If you experience bugs try this first with \-\-head)\&.
.RE
.PP
\fBget\fR
.RS 4
RVM get will 'get' the version you specify. This must be one of latest or head\&. With no arguments the rvm get help section will be shown.\&.
.RE
.PP
\fBreset\fR
.RS 4
Remove current and stored default & system settings\&. (If you experience odd behavior try this second)\&.
.RE
.PP
\fBinfo\fR
.RS 4
Show the
\fBcurrent\fR
environment information for current ruby\&.
.RE
.PP
\fBdebug\fR
.RS 4
Show info plus additional information for common issues\&.
.RE
.PP
\fBinstall\fR
.RS 4
Install one or many ruby versions\&.
https://rvm\&.io/rubies/installing/
.RE
.PP
\fBuninstall\fR
.RS 4
Uninstall one or many ruby versions, leaves their sources\&.
.RE
.PP
\fBremove\fR
.RS 4
Uninstall one or many ruby versions and remove their sources\&.
.RE
.PP
\fBdelete\fR
.RS 4
Same as remove\&.
.RE
.PP
\fBwrapper\fR
.RS 4
Generates a set of wrapper executables for a given ruby with the specified ruby and gemset combination\&. Used under the hood for passenger support and the like\&.
.RE
.PP
\fBruby\fR
.RS 4
Runs a named ruby file against specified and/or all rubies\&.
.RE
.PP
\fBgem\fR
.RS 4
Runs a gem command using selected ruby\(cqs
\fIgem\fR\&.
.RE
.PP
\fBrake\fR
.RS 4
Runs a rake task against specified and/or all rubies\&.
.RE
.PP
\fBtests\fR
.RS 4
Runs
\fIrake test\fR
across selected ruby versions\&.
.RE
.PP
\fBspecs\fR
.RS 4
Runs
\fIrake spec\fR
across selected ruby versions\&.
.RE
.PP
\fBmonitor\fR
.RS 4
Monitor cwd for testing, run
\fIrake {spec,test}\fR
on changes\&.
.RE
.PP
\fBgemset\fR
.RS 4
gemsets:
https://rvm\&.io/gemsets/
.RE
.PP
\fBgemdir\fR
.RS 4
Display the path to the current gem directory (\fI$GEM_HOME\fR)\&.
.RE
.PP
\fBsrcdir\fR
.RS 4
Display the path to rvm source directory (may be yanked)\&.
.RE
.PP
\fBfetch\fR
.RS 4
Performs an archive / src fetch only of the selected ruby\&.
.RE
.PP
\fBlist\fR
.RS 4
Show currently installed rubies, interactive output\&.
https://rvm\&.io/rubies/list/
.RE
.PP
\fBpackage\fR
.RS 4
Install a dependency package {readline,iconv,zlib,openssl}\&.
https://rvm\&.io/packages/
.RE
.PP
\fBrequirements\fR
.RS 4
Show additional OS specific dependencies/requirements for building various rubies.
.RE
.PP
\fBnotes\fR
.RS 4
Display notes. Operating system specifics are now under 'requirements'\&.
.RE
.SH "IMPLEMENTATION"
.PP
\fBruby\fR
.RS 4
MRI/YARV Ruby (The Gold Standard) {1\&.8\&.x, 1\&.9\&.x, 2\&.0\&.x, 2\&.1\&.x, 2\&.2\&.x}
.RE
.PP
\fBjruby\fR
.RS 4
JRuby, Ruby interpreter on the Java Virtual Machine\&.
.RE
.PP
\fBrbx\fR
.RS 4
Rubinius
.RE
.PP
\fBtruffleruby\fR
.RS 4
TruffleRuby, a high performance implementation of Ruby built on GraalVM\&.
.RE
.PP
\fBree\fR
.RS 4
Ruby Enterprise Edition, MRI Ruby with several custom patches for performance, stability, and memory\&.
.RE
.PP
\fBmacruby\fR
.RS 4
MacRuby, insanely fast, can make real apps (Mac OS X Only)\&.
.RE
.PP
\fBmaglev\fR
.RS 4
GemStone Ruby, awesome persistent ruby object store\&.
.RE
.PP
\fBironruby\fR
.RS 4
IronRuby, NOT supported yet\&. Looking for volunteers to help\&.
.RE
.PP
\fBsystem\fR
.RS 4
Use the system ruby (eg\&. pre\-rvm state)\&.
.RE
.PP
\fBdefault\fR
.RS 4
Use the default ruby (or the system ruby if a default hasn\(cqt been set)\&.
https://rvm\&.io/rubies/default/
.RE
.SH "RESOURCES"
.sp
Main web site
.sp
Online issue\-tracker
.SH "COPYING"
.sp
Copyright (c) 2009 Wayne E\&. Seguin
.sp
See LICENSE file for details\&.
LICENSE000066400000001203147511530520005552 0ustar00Copyright (c) 2009-2011 Wayne E. Seguin
Copyright (c) 2011-2020 Michal Papis
Copyright (c) 2016-2020 Piotr Kuczynski

Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at

    http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.

config/md5000066400000521456147511530520006443 0ustar00apache-maven-3.5.0-bin.tar.gz=35c39251d2af99b6624d40d801f6ff02
curl-7_19_7.tar.gz=ecb2e37e45c9933e2a963cabe03670ab
GemStone-27184.Darwin-i386.tar.gz=292b3b169656a8451cfa19c228828e5a
GemStone-27184.Linux-x86_64.tar.gz=cfabd4dd73d2656fc10243e35dd7452b
GemStone-27184.SunOS-i86pc.tar.gz=5755a0689488748dfeab3bc74572aaa8
GemStone-29516.Darwin-i386.tar.gz=9ced19859ea165fc1277332d32d8d219
GemStone-29516.Linux-x86_64.tar.gz=516b8bdd27cb5f22bb9a942e954743d5
GemStone-29639.Darwin-i386.tar.gz=6568a00e19604a0a2653b14c9c99a73c
GemStone-29639.Linux-x86_64.tar.gz=dff9cfbda7169dae9d8b9cd2893cdb2e
GemStone-29699.Darwin-i386.tar.gz=f682383ed3013c886404856ea3b81384
GemStone-29699.Linux-x86_64.tar.gz=f827100b4c0ddba855d2352f5813489e
GemStone-30086.Darwin-i386.tar.gz=dd1421fa1fd9e05b79b997d005f5e002
GemStone-30086.Linux-x86_64.tar.gz=f46a1201d23679fcfa5c63753673255d
GemStone-30246.Darwin-i386.tar.gz=133ea0934d41eab2537f0c43ab490f18
GemStone-30246.Linux-x86_64.tar.gz=d64a6ff61ae77346f1c3f8fa41f34bce
GemStone-30441.Darwin-i386.tar.gz=c97fae686a5d054e11a4e5586ffeb4c5
GemStone-30441.Linux-x86_64.tar.gz=a950086650a7a2303e711f60c9ff7312
GemStone-30866.Darwin-i386.tar.gz=0fb1375643069ddce7322224345fbeb5
GemStone-30866.Linux-x86_64.tar.gz=622a1a6ef5da10b1feecbde74731af33
GemStone-34619.Darwin-i386.tar.gz=19531b50f2d5d06d559843a9cf6ac565
GemStone-34619.Linux-x86_64.tar.gz=b67e767bd7fa12481343c03f1e253d6d
GemStone-36816.Darwin-i386.tar.gz=3ee9ff6bafcfc3141cb54268b7c4fc08
GemStone-36816.Linux-x86_64.tar.gz=e5797c0e0d49ef0f8046c85814548cfc
GemStone-36916.Darwin-i386.tar.gz=2ce86efa0bd4fc6df3aec0cba5fe42d8
GemStone-36916.Linux-x86_64.tar.gz=3165ae521d8594a58cfd1c3b2774a116
GemStone-36962.Darwin-i386.tar.gz=a5466307771632b6f596eb2433397995
GemStone-36962.Linux-x86_64.tar.gz=9d274b9c6aa98e12e01d317c7e12cf80
http://downloads.sourceforge.net/fink/fink-0.34.8.tar.gz=780cf6099b04df7c0461a3ca6f0dae5a
https://bitbucket.org/mpapis/libyaml/get/0.1.4.3.tar.gz=022516bf5d40b8a1ebd8b12035cfc994
https://dl.fedoraproject.org/pub/epel/5/i386/epel-release-5-4.noarch.rpm=3b3280f24c2afacf75e70f2284569161
https://dl.fedoraproject.org/pub/epel/6/i386/epel-release-6-8.noarch.rpm=2cd0ae668a585a14e07c2ea4f264d79b
https://dl.fedoraproject.org/pub/epel/RPM-GPG-KEY-EPEL-5=0466c259781def56dafe0a2cdc9de0c5
https://dl.fedoraproject.org/pub/epel/RPM-GPG-KEY-EPEL-6=d865e6b948a74cb03bc3401c0b01b785
https://rvm_io.global.ssl.fastly.net/binaries/amazon/2/x86_64/ruby-2.4.0.tar.bz2=4cfce86d6ee34b8faffaaef178addc7d
https://rvm_io.global.ssl.fastly.net/binaries/amazon/2/x86_64/ruby-2.4.1.tar.bz2=2419039e0358dc10c70ed14f26c2c100
https://rvm_io.global.ssl.fastly.net/binaries/amazon/2/x86_64/ruby-2.4.2.tar.bz2=3e6acde262f2cc7b9b9d5874c8b8a735
https://rvm_io.global.ssl.fastly.net/binaries/amazon/2/x86_64/ruby-2.4.3.tar.bz2=7cc6866010f3a3d655c828b815a06414
https://rvm_io.global.ssl.fastly.net/binaries/amazon/2/x86_64/ruby-2.4.4.tar.bz2=b0322504ee7c0557a4b3734a9b287b27
https://rvm_io.global.ssl.fastly.net/binaries/amazon/2/x86_64/ruby-2.4.5.tar.bz2=e7ed3c6e45fa7ea4b850c639ef99666b
https://rvm_io.global.ssl.fastly.net/binaries/amazon/2/x86_64/ruby-2.4.6.tar.bz2=179142e43af2146d2c306324a3b4793f
https://rvm_io.global.ssl.fastly.net/binaries/amazon/2/x86_64/ruby-2.4.7.tar.bz2=3dfbafb9fdf1e0e00f14ca9cd98ebae6
https://rvm_io.global.ssl.fastly.net/binaries/amazon/2/x86_64/ruby-2.4.8.tar.bz2=c46e9e1485f05cd579ed8aaeaad407d0
https://rvm_io.global.ssl.fastly.net/binaries/amazon/2/x86_64/ruby-2.4.9.tar.bz2=c6ece39a0a4e181958108b2919424c4c
https://rvm_io.global.ssl.fastly.net/binaries/amazon/2/x86_64/ruby-2.4.10.tar.bz2=7df4afbcc1814fba83cd5126a53e26ca
https://rvm_io.global.ssl.fastly.net/binaries/amazon/2/x86_64/ruby-2.5.0.tar.bz2=8270fdec8b48ff4b2d7fe10192a167a7
https://rvm_io.global.ssl.fastly.net/binaries/amazon/2/x86_64/ruby-2.5.1.tar.bz2=d7ec905ed3f95104f24c33db79734f0c
https://rvm_io.global.ssl.fastly.net/binaries/amazon/2/x86_64/ruby-2.5.2.tar.bz2=80a1a14b85bca5034ee40037b4ef515f
https://rvm_io.global.ssl.fastly.net/binaries/amazon/2/x86_64/ruby-2.5.3.tar.bz2=aeedcca992e0874d44698e8eaaf01d00
https://rvm_io.global.ssl.fastly.net/binaries/amazon/2/x86_64/ruby-2.5.4.tar.bz2=751ad38c451758b8f59cc7bf7ed5c1c3
https://rvm_io.global.ssl.fastly.net/binaries/amazon/2/x86_64/ruby-2.5.5.tar.bz2=4a5ab3420fe7883d02c9c883f944fa09
https://rvm_io.global.ssl.fastly.net/binaries/amazon/2/x86_64/ruby-2.5.6.tar.bz2=8729176d6737a8a2c544362577f23047
https://rvm_io.global.ssl.fastly.net/binaries/amazon/2/x86_64/ruby-2.5.7.tar.bz2=e5592f0a10207436d255bb39f6fac090
https://rvm_io.global.ssl.fastly.net/binaries/amazon/2/x86_64/ruby-2.5.8.tar.bz2=7e2199c4b9720e58bfaf01f21ce5fd61
https://rvm_io.global.ssl.fastly.net/binaries/amazon/2/x86_64/ruby-2.6.0.tar.bz2=420468ba11db6e0396f8db44ac3b0774
https://rvm_io.global.ssl.fastly.net/binaries/amazon/2/x86_64/ruby-2.6.1.tar.bz2=e82b80ed0e1c6e4c229f90c749a9bbdb
https://rvm_io.global.ssl.fastly.net/binaries/amazon/2/x86_64/ruby-2.6.2.tar.bz2=2604323d82fa29639fcce66a5492ee93
https://rvm_io.global.ssl.fastly.net/binaries/amazon/2/x86_64/ruby-2.6.3.tar.bz2=639ff73bdd7a3fdd9eda0ea8634c67c2
https://rvm_io.global.ssl.fastly.net/binaries/amazon/2/x86_64/ruby-2.6.4.tar.bz2=5ea78640e1aeaacbefb95a4099a96267
https://rvm_io.global.ssl.fastly.net/binaries/amazon/2/x86_64/ruby-2.6.5.tar.bz2=2b2e44fb3d4dc82664d221ed27653ebb
https://rvm_io.global.ssl.fastly.net/binaries/amazon/2/x86_64/ruby-2.6.6.tar.bz2=cfedd64441560cccf85a09eaa2d9b959
https://rvm_io.global.ssl.fastly.net/binaries/amazon/2/x86_64/ruby-2.7.0.tar.bz2=d3c56ac789644b86c90f6a05391a53d6
https://rvm_io.global.ssl.fastly.net/binaries/amazon/2/x86_64/ruby-2.7.1.tar.bz2=1801df87bbf59615878c7462ff8b1bed
https://rvm_io.global.ssl.fastly.net/binaries/amazon/2/x86_64/ruby-2.7.2.tar.bz2=0db424c01ac7b124c5f50aac4b1fb0a1
https://rvm_io.global.ssl.fastly.net/binaries/amazon/2/x86_64/ruby-3.0.0-preview1.tar.bz2=8f1f825a5c1f05100f054d2bc60ac5bf
https://rvm_io.global.ssl.fastly.net/binaries/amazon/2013.03/x86_64/ruby-1.9.3-p448.tar.bz2=fa4a24991caa2a8e0ee1c221d4430345
https://rvm_io.global.ssl.fastly.net/binaries/amazon/2013.03/x86_64/ruby-2.0.0-p247.tar.bz2=bb907c7719fb96aae77b8f540a64c1b9
https://rvm_io.global.ssl.fastly.net/binaries/amazon/2018.03/x86_64/ruby-2.4.0.tar.bz2=2ea89978566ab92fa05e0c53e26f7abb
https://rvm_io.global.ssl.fastly.net/binaries/amazon/2018.03/x86_64/ruby-2.4.1.tar.bz2=4c9d97f76727a41a1905d18f3146d404
https://rvm_io.global.ssl.fastly.net/binaries/amazon/2018.03/x86_64/ruby-2.4.2.tar.bz2=ca060310022740e484956bca48aa6bfc
https://rvm_io.global.ssl.fastly.net/binaries/amazon/2018.03/x86_64/ruby-2.4.3.tar.bz2=e787eca4995c04d93c5a11222d5fa34d
https://rvm_io.global.ssl.fastly.net/binaries/amazon/2018.03/x86_64/ruby-2.4.4.tar.bz2=9ca0136556b5208a5ed8fd635925a817
https://rvm_io.global.ssl.fastly.net/binaries/amazon/2018.03/x86_64/ruby-2.4.5.tar.bz2=e7ef0efcf5387f75ec38f40b796a1901
https://rvm_io.global.ssl.fastly.net/binaries/amazon/2018.03/x86_64/ruby-2.4.6.tar.bz2=15471c9f0a8c2eeaec378a59d750bd25
https://rvm_io.global.ssl.fastly.net/binaries/amazon/2018.03/x86_64/ruby-2.4.7.tar.bz2=00a3542583f329f12ac69aa708fb856f
https://rvm_io.global.ssl.fastly.net/binaries/amazon/2018.03/x86_64/ruby-2.4.8.tar.bz2=d3ef7447735273b20562d12e1d4b1742
https://rvm_io.global.ssl.fastly.net/binaries/amazon/2018.03/x86_64/ruby-2.4.9.tar.bz2=ce4afc6e2ba0b8cf75f5b390e0e52fff
https://rvm_io.global.ssl.fastly.net/binaries/amazon/2018.03/x86_64/ruby-2.4.10.tar.bz2=48aee12752ee05637ee5e3880e5a9047
https://rvm_io.global.ssl.fastly.net/binaries/amazon/2018.03/x86_64/ruby-2.5.0.tar.bz2=99b32364d92b808d5ae793dc361bae7b
https://rvm_io.global.ssl.fastly.net/binaries/amazon/2018.03/x86_64/ruby-2.5.1.tar.bz2=83812a64168454da3caf43c0d188dd05
https://rvm_io.global.ssl.fastly.net/binaries/amazon/2018.03/x86_64/ruby-2.5.2.tar.bz2=a748d0760b2c06e8e31030e47e64fa8c
https://rvm_io.global.ssl.fastly.net/binaries/amazon/2018.03/x86_64/ruby-2.5.3.tar.bz2=aa48c81ef23670a70b93aa1715092647
https://rvm_io.global.ssl.fastly.net/binaries/amazon/2018.03/x86_64/ruby-2.5.4.tar.bz2=205a51c9c30e3fcf9eb64a2b82ae4191
https://rvm_io.global.ssl.fastly.net/binaries/amazon/2018.03/x86_64/ruby-2.5.5.tar.bz2=b41b0cae3c5f1452ba0c6aabe3bf6606
https://rvm_io.global.ssl.fastly.net/binaries/amazon/2018.03/x86_64/ruby-2.5.6.tar.bz2=910299b1cd5245e9be4ac328c445c888
https://rvm_io.global.ssl.fastly.net/binaries/amazon/2018.03/x86_64/ruby-2.5.7.tar.bz2=e13a54d9f47d64fa8c64a0f69347a9f4
https://rvm_io.global.ssl.fastly.net/binaries/amazon/2018.03/x86_64/ruby-2.5.8.tar.bz2=bd6034745b9e22f6f0bdf93aa9a67d02
https://rvm_io.global.ssl.fastly.net/binaries/amazon/2018.03/x86_64/ruby-2.6.0.tar.bz2=7d769e1b361a533ebec9e768bc6ac800
https://rvm_io.global.ssl.fastly.net/binaries/amazon/2018.03/x86_64/ruby-2.6.1.tar.bz2=11796ee377a03dd7326da84d9b4f11be
https://rvm_io.global.ssl.fastly.net/binaries/amazon/2018.03/x86_64/ruby-2.6.2.tar.bz2=c0bd4baf1800153a9e66474fc708a942
https://rvm_io.global.ssl.fastly.net/binaries/amazon/2018.03/x86_64/ruby-2.6.3.tar.bz2=433807558c7b4dc0070b86ad6034cdcb
https://rvm_io.global.ssl.fastly.net/binaries/amazon/2018.03/x86_64/ruby-2.6.4.tar.bz2=fae89188211bf58d9c60a9ff17dcb37a
https://rvm_io.global.ssl.fastly.net/binaries/amazon/2018.03/x86_64/ruby-2.6.5.tar.bz2=ac93c37df48cbc34dce363251ef9def3
https://rvm_io.global.ssl.fastly.net/binaries/amazon/2018.03/x86_64/ruby-2.6.6.tar.bz2=d0ed8d03f5b1f651b6bfd3cebe26c912
https://rvm_io.global.ssl.fastly.net/binaries/amazon/2018.03/x86_64/ruby-2.7.0.tar.bz2=c388a64e20b73ef05866a2b66ceeaf78
https://rvm_io.global.ssl.fastly.net/binaries/amazon/2018.03/x86_64/ruby-2.7.1.tar.bz2=80c8b14ea582515ea4b1e518040ecc94
https://rvm_io.global.ssl.fastly.net/binaries/amazon/2018.03/x86_64/ruby-2.7.2.tar.bz2=d1c7e0cae96cb5857f90cf2b6dec78b6
https://rvm_io.global.ssl.fastly.net/binaries/amazon/2018.03/x86_64/ruby-3.0.0-preview1.tar.bz2=d2218ea099475456c12252f4f9cabd2b
https://rvm_io.global.ssl.fastly.net/binaries/arch/libc-2.15/x86_64/ruby-1.9.3-p194.tar.bz2=384ea18aef77b95e49df6f3944fc3e11
https://rvm_io.global.ssl.fastly.net/binaries/arch/libc-2.15/x86_64/ruby-1.9.3-p286.tar.bz2=e7ee7c1a6dc913f6e7fad3ba03e459da
https://rvm_io.global.ssl.fastly.net/binaries/arch/libc-2.15/x86_64/ruby-1.9.3-p327.tar.bz2=7ac51e55e5d83365cbe5855aeef2d0eb
https://rvm_io.global.ssl.fastly.net/binaries/arch/libc-2.15/x86_64/ruby-1.9.3-p374.tar.bz2=78e6e2563956a450199a5221a84a7e9c
https://rvm_io.global.ssl.fastly.net/binaries/arch/libc-2.15/x86_64/ruby-1.9.3-p392.tar.bz2=504e703ab755c22232382f58e0226ba2
https://rvm_io.global.ssl.fastly.net/binaries/arch/libc-2.15/x86_64/ruby-2.0.0-p0.tar.bz2=0b43d9516e7f0021cbaa3f093707e348
https://rvm_io.global.ssl.fastly.net/binaries/centos/5/x86_64/ruby-1.9.3-p286.tar.bz2=f53728e7ef82a7c2c6dfdb21202f2376
https://rvm_io.global.ssl.fastly.net/binaries/centos/5/x86_64/ruby-1.9.3-p327.tar.bz2=b3151790549e71091793b03d4c7914b3
https://rvm_io.global.ssl.fastly.net/binaries/centos/5/x86_64/ruby-1.9.3-p362.tar.bz2=de7ea0c9966b415a165b6e9b4ae2c97c
https://rvm_io.global.ssl.fastly.net/binaries/centos/5/x86_64/ruby-1.9.3-p374.tar.bz2=75357314100fc4a777c64c5606a3e867
https://rvm_io.global.ssl.fastly.net/binaries/centos/5/x86_64/ruby-1.9.3-p392.tar.bz2=d0fbe4cf69cbe52a4e82e458fd6f06aa
https://rvm_io.global.ssl.fastly.net/binaries/centos/5/x86_64/ruby-1.9.3-p429.tar.bz2=85919f00c561c46f1ded9deb59847421
https://rvm_io.global.ssl.fastly.net/binaries/centos/5/x86_64/ruby-1.9.3-p448.tar.bz2=8bebaa3b919474a61efe3e8cdb2fd84c
https://rvm_io.global.ssl.fastly.net/binaries/centos/5/x86_64/ruby-1.9.3-p484.tar.bz2=f28d8413f9db17f8d6dddd91ba80d17a
https://rvm_io.global.ssl.fastly.net/binaries/centos/5/x86_64/ruby-1.9.3-p545.tar.bz2=61a2cdb5ebd8c8ccc5aae3ebed219591
https://rvm_io.global.ssl.fastly.net/binaries/centos/5/x86_64/ruby-1.9.3-p547.tar.bz2=7f5587224441cbcbf30434ee88f4705b
https://rvm_io.global.ssl.fastly.net/binaries/centos/5/x86_64/ruby-1.9.3-p551.tar.bz2=7129464679a86ff2c68281f5d471fd44
https://rvm_io.global.ssl.fastly.net/binaries/centos/5/x86_64/ruby-2.0.0-p0.tar.bz2=b6b1bf6f8b54d8f9eec7cb6a36771f0e
https://rvm_io.global.ssl.fastly.net/binaries/centos/5/x86_64/ruby-2.0.0-p195.tar.bz2=2310177bc3cd69a2bf193a052561ccf3
https://rvm_io.global.ssl.fastly.net/binaries/centos/5/x86_64/ruby-2.0.0-p247.tar.bz2=0ea8658f766262ddc6c2492de4e3fccf
https://rvm_io.global.ssl.fastly.net/binaries/centos/5/x86_64/ruby-2.0.0-p353.tar.bz2=6456f508884c4f746e127acfc51c60bf
https://rvm_io.global.ssl.fastly.net/binaries/centos/5/x86_64/ruby-2.0.0-p451.tar.bz2=21d4121aa0245fa874de64a0bbd58ab5
https://rvm_io.global.ssl.fastly.net/binaries/centos/5/x86_64/ruby-2.0.0-p481.tar.bz2=a80a7914e0915bb0c9d477fd2921b24d
https://rvm_io.global.ssl.fastly.net/binaries/centos/5/x86_64/ruby-2.0.0-p576.tar.bz2=e24303f92beb6adc48ff605b32f3bd8e
https://rvm_io.global.ssl.fastly.net/binaries/centos/5/x86_64/ruby-2.0.0-p598.tar.bz2=a36767d1f8356c6b53cabbd2bbe3490a
https://rvm_io.global.ssl.fastly.net/binaries/centos/5/x86_64/ruby-2.1.0.tar.bz2=905877bba0068e5c112e06248d9ccbde
https://rvm_io.global.ssl.fastly.net/binaries/centos/5/x86_64/ruby-2.1.1.tar.bz2=07935b66d25f4ab1ccad0321b8aa318a
https://rvm_io.global.ssl.fastly.net/binaries/centos/5/x86_64/ruby-2.1.2.tar.bz2=3e85c96ff2d6409e590f7bc7fb97cda0
https://rvm_io.global.ssl.fastly.net/binaries/centos/5/x86_64/ruby-2.1.3.tar.bz2=08222821dd86df2be39ddad4ed5df16b
https://rvm_io.global.ssl.fastly.net/binaries/centos/5/x86_64/ruby-2.1.5.tar.bz2=8809b74c122906ba795d67d96c87ab16
https://rvm_io.global.ssl.fastly.net/binaries/centos/5/x86_64/ruby-2.2.0.tar.bz2=5ef0309cabba7786a884d1ca45b02e13
https://rvm_io.global.ssl.fastly.net/binaries/centos/5/x86_64/ruby-2.2.1.tar.bz2=1747205375568f8f0c1ef8b8c5b022f2
https://rvm_io.global.ssl.fastly.net/binaries/centos/6/x86_64/ruby-1.9.3-p194.tar.bz2=0065d82b7454db5954f3f725c8c2e7fc
https://rvm_io.global.ssl.fastly.net/binaries/centos/6/x86_64/ruby-1.9.3-p286.tar.bz2=b1a2e3c7ee37897ae49652572d63d674
https://rvm_io.global.ssl.fastly.net/binaries/centos/6/x86_64/ruby-1.9.3-p327.tar.bz2=fd226cba32fea404aa4bb0cb0f815cb6
https://rvm_io.global.ssl.fastly.net/binaries/centos/6/x86_64/ruby-1.9.3-p362.tar.bz2=6fe76491223f7a592e7b87f6845e1684
https://rvm_io.global.ssl.fastly.net/binaries/centos/6/x86_64/ruby-1.9.3-p392.tar.bz2=f7d8e1807902f9525ad2d7ec3db97dbb
https://rvm_io.global.ssl.fastly.net/binaries/centos/6/x86_64/ruby-1.9.3-p429.tar.bz2=818c683fa81a80d69500cbb49ab84877
https://rvm_io.global.ssl.fastly.net/binaries/centos/6/x86_64/ruby-1.9.3-p448.tar.bz2=fa4a24991caa2a8e0ee1c221d4430345
https://rvm_io.global.ssl.fastly.net/binaries/centos/6/x86_64/ruby-1.9.3-p484.tar.bz2=bf97437afe0598d3732dbb90153a39e1
https://rvm_io.global.ssl.fastly.net/binaries/centos/6/x86_64/ruby-1.9.3-p547.tar.bz2=6dbce14074df14936386da94608b49cf
https://rvm_io.global.ssl.fastly.net/binaries/centos/6/x86_64/ruby-1.9.3-p551.tar.bz2=41e24831c16e5dca4bbea5e7f3f7744c
https://rvm_io.global.ssl.fastly.net/binaries/centos/6/x86_64/ruby-2.0.0-p0.tar.bz2=308c9088d6ead744cd957c60f0dd0d93
https://rvm_io.global.ssl.fastly.net/binaries/centos/6/x86_64/ruby-2.0.0-p195.tar.bz2=dcb4fd272f080e4da432682ac54c3016
https://rvm_io.global.ssl.fastly.net/binaries/centos/6/x86_64/ruby-2.0.0-p247.tar.bz2=bb907c7719fb96aae77b8f540a64c1b9
https://rvm_io.global.ssl.fastly.net/binaries/centos/6/x86_64/ruby-2.0.0-p353.tar.bz2=b3c249f415851ce37cdbf43ea88750d0
https://rvm_io.global.ssl.fastly.net/binaries/centos/6/x86_64/ruby-2.0.0-p481.tar.bz2=b5349c7195e5f0b48d316fdcda39d2c8
https://rvm_io.global.ssl.fastly.net/binaries/centos/6/x86_64/ruby-2.0.0-p576.tar.bz2=594472df09ae698a40928301fdc9fa3e
https://rvm_io.global.ssl.fastly.net/binaries/centos/6/x86_64/ruby-2.0.0-p598.tar.bz2=b66a335f07a56e9d3a1c22eb269dfafa
https://rvm_io.global.ssl.fastly.net/binaries/centos/6/x86_64/ruby-2.1.0.tar.bz2=b7f4dac1461116730a2366f03b0efe36
https://rvm_io.global.ssl.fastly.net/binaries/centos/6/x86_64/ruby-2.1.2.tar.bz2=55b27f9eb936c32fd11ed487882131b5
https://rvm_io.global.ssl.fastly.net/binaries/centos/6/x86_64/ruby-2.1.3.tar.bz2=6aaac784961ce980fa319525a2399244
https://rvm_io.global.ssl.fastly.net/binaries/centos/6/x86_64/ruby-2.1.5.tar.bz2=accd60a83aa2b116fab0dc8585cee0b0
https://rvm_io.global.ssl.fastly.net/binaries/centos/6/x86_64/ruby-2.2.0.tar.bz2=2bc0a309957c8ef0b29769d273dcb533
https://rvm_io.global.ssl.fastly.net/binaries/centos/6/x86_64/ruby-2.2.1.tar.bz2=412a1bc74570e02a21c045910930497a
https://rvm_io.global.ssl.fastly.net/binaries/centos/6/x86_64/ruby-2.3.1.tar.bz2=477310d14a5d624a70d9571ce3bcaf59
https://rvm_io.global.ssl.fastly.net/binaries/centos/6/x86_64/ruby-2.4.0.tar.bz2=c6434221a72bb308e903ab5135057d86
https://rvm_io.global.ssl.fastly.net/binaries/centos/6/x86_64/ruby-2.4.1.tar.bz2=6c8ce1558521ba320678642deaadd198
https://rvm_io.global.ssl.fastly.net/binaries/centos/6/x86_64/ruby-2.4.2.tar.bz2=95663883e7b3f60ac660548c223462bc
https://rvm_io.global.ssl.fastly.net/binaries/centos/6/x86_64/ruby-2.4.3.tar.bz2=61b4e0029bde62fb026bfa64ff181330
https://rvm_io.global.ssl.fastly.net/binaries/centos/6/x86_64/ruby-2.4.4.tar.bz2=5e555a947a59ed91761cad50b481e8ba
https://rvm_io.global.ssl.fastly.net/binaries/centos/6/x86_64/ruby-2.4.5.tar.bz2=c603fa0b6afe89b77ad5f344f2186cb8
https://rvm_io.global.ssl.fastly.net/binaries/centos/6/x86_64/ruby-2.4.6.tar.bz2=d300e50f444cc8650a59850f1f46ddd3
https://rvm_io.global.ssl.fastly.net/binaries/centos/6/x86_64/ruby-2.4.7.tar.bz2=6aab9cde2648a0bfb55fdf854e85991c
https://rvm_io.global.ssl.fastly.net/binaries/centos/6/x86_64/ruby-2.4.8.tar.bz2=ece00e010f9a731cd4d563755e424ef4
https://rvm_io.global.ssl.fastly.net/binaries/centos/6/x86_64/ruby-2.4.9.tar.bz2=d5addeb54bb6a41ffb5f7d232c542410
https://rvm_io.global.ssl.fastly.net/binaries/centos/6/x86_64/ruby-2.4.10.tar.bz2=f6464a6b8274478aff1a4a6b6c6ed5f9
https://rvm_io.global.ssl.fastly.net/binaries/centos/6/x86_64/ruby-2.5.0.tar.bz2=b24afd02a9ffb7e5aa2a371c9df0f937
https://rvm_io.global.ssl.fastly.net/binaries/centos/6/x86_64/ruby-2.5.1.tar.bz2=1ccf0a1100b311c7dae54fc938054f74
https://rvm_io.global.ssl.fastly.net/binaries/centos/6/x86_64/ruby-2.5.2.tar.bz2=4af8ff88c5461d20ee2cac40c40e3125
https://rvm_io.global.ssl.fastly.net/binaries/centos/6/x86_64/ruby-2.5.3.tar.bz2=dbe8d98c19f02de668cf4faf000ce881
https://rvm_io.global.ssl.fastly.net/binaries/centos/6/x86_64/ruby-2.5.4.tar.bz2=e7d61644a67c8426a134daa0dea4db4d
https://rvm_io.global.ssl.fastly.net/binaries/centos/6/x86_64/ruby-2.5.5.tar.bz2=451f1b010a89fa4226b16ad8bf536ed0
https://rvm_io.global.ssl.fastly.net/binaries/centos/6/x86_64/ruby-2.5.6.tar.bz2=acb8a1b6199bbd63ec4ae0fddf56b77b
https://rvm_io.global.ssl.fastly.net/binaries/centos/6/x86_64/ruby-2.5.7.tar.bz2=e7c791ccbd56e08f7bb4a9058b0d7242
https://rvm_io.global.ssl.fastly.net/binaries/centos/6/x86_64/ruby-2.5.8.tar.bz2=d0c2d13e7d4945897c16064ef883cd18
https://rvm_io.global.ssl.fastly.net/binaries/centos/6/x86_64/ruby-2.6.0.tar.bz2=437e2bde0fa66705871c414fbef883e6
https://rvm_io.global.ssl.fastly.net/binaries/centos/6/x86_64/ruby-2.6.1.tar.bz2=b76d09dba15af404881b1d15bce4e8be
https://rvm_io.global.ssl.fastly.net/binaries/centos/6/x86_64/ruby-2.6.2.tar.bz2=387d1569208bdb4bea1564da974e616d
https://rvm_io.global.ssl.fastly.net/binaries/centos/6/x86_64/ruby-2.6.3.tar.bz2=b4e73791ea1c9d6ca3407740a2712c9f
https://rvm_io.global.ssl.fastly.net/binaries/centos/6/x86_64/ruby-2.6.4.tar.bz2=9fc035ebcee4a6b4032c87dadc10cbca
https://rvm_io.global.ssl.fastly.net/binaries/centos/6/x86_64/ruby-2.6.5.tar.bz2=cd4785ad4fd7920692ad93b98de20a71
https://rvm_io.global.ssl.fastly.net/binaries/centos/6/x86_64/ruby-2.6.6.tar.bz2=df3a62cc09b9be8410cabcf24a34e71b
https://rvm_io.global.ssl.fastly.net/binaries/centos/6/x86_64/ruby-2.7.0.tar.bz2=57652298608551ab9ee5b6dcb46ca65a
https://rvm_io.global.ssl.fastly.net/binaries/centos/6/x86_64/ruby-2.7.1.tar.bz2=06beae98d67b20202351ac02324ca6d9
https://rvm_io.global.ssl.fastly.net/binaries/centos/6/x86_64/ruby-2.7.2.tar.bz2=813896b63509355f3691827276f16822
https://rvm_io.global.ssl.fastly.net/binaries/centos/7/x86_64/ruby-2.4.0.tar.bz2=d0758dfc415f00ed9d03f8c0a3a8f034
https://rvm_io.global.ssl.fastly.net/binaries/centos/7/x86_64/ruby-2.4.1.tar.bz2=2314a6ef42ddbed234e754d456479b90
https://rvm_io.global.ssl.fastly.net/binaries/centos/7/x86_64/ruby-2.4.2.tar.bz2=fe832d44821625255603b3a1feb9d217
https://rvm_io.global.ssl.fastly.net/binaries/centos/7/x86_64/ruby-2.4.3.tar.bz2=600ace79b20621c505e6edb8ada2dd6e
https://rvm_io.global.ssl.fastly.net/binaries/centos/7/x86_64/ruby-2.4.4.tar.bz2=cd1d9edf13c3f3a1cb7b9fb821f9fbaa
https://rvm_io.global.ssl.fastly.net/binaries/centos/7/x86_64/ruby-2.4.5.tar.bz2=8f6bd79338bf7d187478e86a79a4fd35
https://rvm_io.global.ssl.fastly.net/binaries/centos/7/x86_64/ruby-2.4.6.tar.bz2=0594f0de7eff7d7d285541f933862cbb
https://rvm_io.global.ssl.fastly.net/binaries/centos/7/x86_64/ruby-2.4.7.tar.bz2=ed45410fb3faef2e4631bba9f6844a27
https://rvm_io.global.ssl.fastly.net/binaries/centos/7/x86_64/ruby-2.4.8.tar.bz2=c47adfa8e2e227f707812cd3dcd89fba
https://rvm_io.global.ssl.fastly.net/binaries/centos/7/x86_64/ruby-2.4.9.tar.bz2=826543ed67e6a21ce76e72653baebdca
https://rvm_io.global.ssl.fastly.net/binaries/centos/7/x86_64/ruby-2.4.10.tar.bz2=993b2ff1b2043bab1b09af207f3c077a
https://rvm_io.global.ssl.fastly.net/binaries/centos/7/x86_64/ruby-2.5.0.tar.bz2=e4008aa1347cd7be0904c8130c57096f
https://rvm_io.global.ssl.fastly.net/binaries/centos/7/x86_64/ruby-2.5.1.tar.bz2=4e0b49616e7fdc49143096075a401767
https://rvm_io.global.ssl.fastly.net/binaries/centos/7/x86_64/ruby-2.5.2.tar.bz2=f05841a855b2b2518f50b49df15e03b2
https://rvm_io.global.ssl.fastly.net/binaries/centos/7/x86_64/ruby-2.5.3.tar.bz2=97fdd56eb20b33b388de2c4d18990a5d
https://rvm_io.global.ssl.fastly.net/binaries/centos/7/x86_64/ruby-2.5.4.tar.bz2=a0fd674ee72cb26c7ab13aa87b1dad26
https://rvm_io.global.ssl.fastly.net/binaries/centos/7/x86_64/ruby-2.5.5.tar.bz2=6934cdb879dec0c6985bace4825c2936
https://rvm_io.global.ssl.fastly.net/binaries/centos/7/x86_64/ruby-2.5.6.tar.bz2=ecefdd30613a77951b694d61e3000e27
https://rvm_io.global.ssl.fastly.net/binaries/centos/7/x86_64/ruby-2.5.7.tar.bz2=7a69a2411b3d9fbbc02e5d814527e838
https://rvm_io.global.ssl.fastly.net/binaries/centos/7/x86_64/ruby-2.5.8.tar.bz2=0facb21719aef3ffbdae741e270d608b
https://rvm_io.global.ssl.fastly.net/binaries/centos/7/x86_64/ruby-2.6.0.tar.bz2=dd77de80b7d923e434032b6bf483bc5b
https://rvm_io.global.ssl.fastly.net/binaries/centos/7/x86_64/ruby-2.6.1.tar.bz2=76ffc89431b29cf8c240653a851fb4a4
https://rvm_io.global.ssl.fastly.net/binaries/centos/7/x86_64/ruby-2.6.2.tar.bz2=0338f06d734ea325482792a8a40ecb97
https://rvm_io.global.ssl.fastly.net/binaries/centos/7/x86_64/ruby-2.6.3.tar.bz2=60c02f3d518826c77e8a69c971c085d2
https://rvm_io.global.ssl.fastly.net/binaries/centos/7/x86_64/ruby-2.6.4.tar.bz2=39e774baa4338ccea016cdbfc0eb2d33
https://rvm_io.global.ssl.fastly.net/binaries/centos/7/x86_64/ruby-2.6.5.tar.bz2=e8b7b94c8adfbebab96a64b281b90c7c
https://rvm_io.global.ssl.fastly.net/binaries/centos/7/x86_64/ruby-2.6.6.tar.bz2=f2066744834ea77335bf52ffdcbb7174
https://rvm_io.global.ssl.fastly.net/binaries/centos/7/x86_64/ruby-2.7.0.tar.bz2=ab0ac481cc438e4bc3dd127baadb90fc
https://rvm_io.global.ssl.fastly.net/binaries/centos/7/x86_64/ruby-2.7.1.tar.bz2=af38afb8573af59144ca70df2a3bf0b2
https://rvm_io.global.ssl.fastly.net/binaries/centos/7/x86_64/ruby-2.7.2.tar.bz2=e57be086b20e8246fed27b5efe1d9304
https://rvm_io.global.ssl.fastly.net/binaries/centos/7/x86_64/ruby-3.0.0-preview1.tar.bz2=b0546d3b6c222f6c97545e079c9234e4
https://rvm_io.global.ssl.fastly.net/binaries/centos/8/x86_64/ruby-2.4.0.tar.bz2=9633d1229122c7f484f73033f6223f75
https://rvm_io.global.ssl.fastly.net/binaries/centos/8/x86_64/ruby-2.4.1.tar.bz2=2daa47a66fe068be061274fbea0d135d
https://rvm_io.global.ssl.fastly.net/binaries/centos/8/x86_64/ruby-2.4.2.tar.bz2=497d259504176b4278dd6f5b76eb184a
https://rvm_io.global.ssl.fastly.net/binaries/centos/8/x86_64/ruby-2.4.3.tar.bz2=193b0db714c66bb2042cb4f6a1162f67
https://rvm_io.global.ssl.fastly.net/binaries/centos/8/x86_64/ruby-2.4.4.tar.bz2=a14e69b4c7e651af4071d26ba00321ce
https://rvm_io.global.ssl.fastly.net/binaries/centos/8/x86_64/ruby-2.4.5.tar.bz2=334d8988e2f1e3b0b5e1b3278cfb76cc
https://rvm_io.global.ssl.fastly.net/binaries/centos/8/x86_64/ruby-2.4.6.tar.bz2=4c920526d3d6ad47550a808be7188a69
https://rvm_io.global.ssl.fastly.net/binaries/centos/8/x86_64/ruby-2.4.7.tar.bz2=8875abcf3217df0f8a5995a44b3f9137
https://rvm_io.global.ssl.fastly.net/binaries/centos/8/x86_64/ruby-2.4.8.tar.bz2=fb656e41911f0cd61262414b3a0a8342
https://rvm_io.global.ssl.fastly.net/binaries/centos/8/x86_64/ruby-2.4.9.tar.bz2=b6dcdd4939acf39645effc3dd6e7e60d
https://rvm_io.global.ssl.fastly.net/binaries/centos/8/x86_64/ruby-2.4.10.tar.bz2=a83b937873093e1de444a7a84876b98e
https://rvm_io.global.ssl.fastly.net/binaries/centos/8/x86_64/ruby-2.5.0.tar.bz2=c5576117a4220589cccc64b98a11f918
https://rvm_io.global.ssl.fastly.net/binaries/centos/8/x86_64/ruby-2.5.1.tar.bz2=e032423e6617f29a2ce0a242147bccf9
https://rvm_io.global.ssl.fastly.net/binaries/centos/8/x86_64/ruby-2.5.2.tar.bz2=84e62879bc39db390a462d6b26be3342
https://rvm_io.global.ssl.fastly.net/binaries/centos/8/x86_64/ruby-2.5.3.tar.bz2=d1db0f1d5a73b4711a0e97929840e36a
https://rvm_io.global.ssl.fastly.net/binaries/centos/8/x86_64/ruby-2.5.4.tar.bz2=e79c988dec12d1a6e96b66f98587da3c
https://rvm_io.global.ssl.fastly.net/binaries/centos/8/x86_64/ruby-2.5.5.tar.bz2=ab8fde821eeef3a5907f96e66ecb397b
https://rvm_io.global.ssl.fastly.net/binaries/centos/8/x86_64/ruby-2.5.6.tar.bz2=37f78443cdb27bf68c83c601265e10c3
https://rvm_io.global.ssl.fastly.net/binaries/centos/8/x86_64/ruby-2.5.7.tar.bz2=12cc0235c29c8dcdc937978013be0fc1
https://rvm_io.global.ssl.fastly.net/binaries/centos/8/x86_64/ruby-2.5.8.tar.bz2=9d426b003835271afbc36aa6119a4303
https://rvm_io.global.ssl.fastly.net/binaries/centos/8/x86_64/ruby-2.6.0.tar.bz2=dccc19e3701748f1ddaab56f905b2f87
https://rvm_io.global.ssl.fastly.net/binaries/centos/8/x86_64/ruby-2.6.1.tar.bz2=7737f5f1da8df5f2e2c4c77ea8f10eb5
https://rvm_io.global.ssl.fastly.net/binaries/centos/8/x86_64/ruby-2.6.2.tar.bz2=267ba117102f8277fc248bb9d4f3fb4a
https://rvm_io.global.ssl.fastly.net/binaries/centos/8/x86_64/ruby-2.6.3.tar.bz2=44bb0b16fdc1f874e18a80856e610891
https://rvm_io.global.ssl.fastly.net/binaries/centos/8/x86_64/ruby-2.6.4.tar.bz2=96bcb0de1781cc26a3499c0f3e3021c9
https://rvm_io.global.ssl.fastly.net/binaries/centos/8/x86_64/ruby-2.6.5.tar.bz2=66b659b6c88c87b34a6703b006ffb81f
https://rvm_io.global.ssl.fastly.net/binaries/centos/8/x86_64/ruby-2.6.6.tar.bz2=2ee192cf53e1e5f5d5d011d89db7a511
https://rvm_io.global.ssl.fastly.net/binaries/centos/8/x86_64/ruby-2.7.0.tar.bz2=a046e64db4f7a60898e22f1694c36362
https://rvm_io.global.ssl.fastly.net/binaries/centos/8/x86_64/ruby-2.7.1.tar.bz2=302691bc2e32ce8f24f2c0dfc48509cd
https://rvm_io.global.ssl.fastly.net/binaries/centos/8/x86_64/ruby-2.7.2.tar.bz2=b0d287890b00a85c4d66180ed097598e
https://rvm_io.global.ssl.fastly.net/binaries/centos/8/x86_64/ruby-3.0.0-preview1.tar.bz2=93134fce505ca84212eb768120a48e63
https://rvm_io.global.ssl.fastly.net/binaries/debian/6/i386/ruby-1.9.3-p429.tar.bz2=048c2ab350edf5e10de5b889a4e2928a
https://rvm_io.global.ssl.fastly.net/binaries/debian/6/i386/ruby-1.9.3-p448.tar.bz2=aeba37b8f72df75352f0aeda32e0be73
https://rvm_io.global.ssl.fastly.net/binaries/debian/6/i386/ruby-2.0.0-p195.tar.bz2=3796d1497b7d1b03ecc09d8df016a162
https://rvm_io.global.ssl.fastly.net/binaries/debian/6/i386/ruby-2.0.0-p247.tar.bz2=1aa09f91ed227d3757573be7ae640637
https://rvm_io.global.ssl.fastly.net/binaries/debian/6/x86_64/ruby-1.9.3-p194.tar.bz2=7b59a3619b85826edd546377888ce2b9
https://rvm_io.global.ssl.fastly.net/binaries/debian/6/x86_64/ruby-1.9.3-p286.tar.bz2=0f0c3dbe9398d75c633cc8a2e54ab641
https://rvm_io.global.ssl.fastly.net/binaries/debian/6/x86_64/ruby-1.9.3-p327.tar.bz2=fb8a6d154404cb6bb8e5ce491964b8a0
https://rvm_io.global.ssl.fastly.net/binaries/debian/6/x86_64/ruby-1.9.3-p362.tar.bz2=c9e820fe966c4d7371e2e76156599892
https://rvm_io.global.ssl.fastly.net/binaries/debian/6/x86_64/ruby-1.9.3-p374.tar.bz2=eefea86668908424ac23f3f1ea880ab7
https://rvm_io.global.ssl.fastly.net/binaries/debian/6/x86_64/ruby-1.9.3-p392.tar.bz2=e9d0e8578c402b853dde5fec789ddfb2
https://rvm_io.global.ssl.fastly.net/binaries/debian/6/x86_64/ruby-1.9.3-p429.tar.bz2=074ea4b8f7442d97872db5641e3e3f3c
https://rvm_io.global.ssl.fastly.net/binaries/debian/6/x86_64/ruby-1.9.3-p448.tar.bz2=82ddacb2f62114798100232f0e5759fe
https://rvm_io.global.ssl.fastly.net/binaries/debian/6/x86_64/ruby-2.0.0-p0.tar.bz2=7e8b3d983794f717ba50ec544d7ab0ab
https://rvm_io.global.ssl.fastly.net/binaries/debian/6/x86_64/ruby-2.0.0-p195.tar.bz2=427e570dbb3da669b5aa2f39f69e9a6c
https://rvm_io.global.ssl.fastly.net/binaries/debian/6/x86_64/ruby-2.0.0-p247.tar.bz2=755c276734c038ac11f55eff7a41e932
https://rvm_io.global.ssl.fastly.net/binaries/debian/7/armhf/ruby-1.9.3-p362.tar.bz2=c7ae82f6808669332be9a0e269df1894
https://rvm_io.global.ssl.fastly.net/binaries/debian/7/armhf/ruby-1.9.3-p392.tar.bz2=7e09bcfc2439a6d57c8728a608f960b1
https://rvm_io.global.ssl.fastly.net/binaries/debian/7/armhf/ruby-1.9.3-p448.tar.bz2=c5ed1a1231479c211cd279eeaac7b6aa
https://rvm_io.global.ssl.fastly.net/binaries/debian/7/armhf/ruby-2.0.0-p0.tar.bz2=4412e6a0ba4b98245e824e7b7a9d7116
https://rvm_io.global.ssl.fastly.net/binaries/debian/7/armhf/ruby-2.0.0-p247.tar.bz2=707b369ffece5fa1ff5e9a5fa1061159
https://rvm_io.global.ssl.fastly.net/binaries/debian/7/i386/ruby-1.9.3-p429.tar.bz2=579db12bcbf421dd117c54e71f49c475
https://rvm_io.global.ssl.fastly.net/binaries/debian/7/i386/ruby-1.9.3-p448.tar.bz2=6f86f0d51a2fb8422fcc186e2d361359
https://rvm_io.global.ssl.fastly.net/binaries/debian/7/i386/ruby-1.9.3-p484.tar.bz2=65486462881275854058c19d181be895
https://rvm_io.global.ssl.fastly.net/binaries/debian/7/i386/ruby-1.9.3-p545.tar.bz2=0dfe0a6fb07d8e369fe1f2a8dc1165cc
https://rvm_io.global.ssl.fastly.net/binaries/debian/7/i386/ruby-1.9.3-p547.tar.bz2=a5bef945da9bec99f147c63d3150e593
https://rvm_io.global.ssl.fastly.net/binaries/debian/7/i386/ruby-1.9.3-p551.tar.bz2=b27fe6c838fcf0b904c6f3cd5aa0e46a
https://rvm_io.global.ssl.fastly.net/binaries/debian/7/i386/ruby-2.0.0-p195.tar.bz2=1b81a1a4d6a2f615c1cdb06e9762425e
https://rvm_io.global.ssl.fastly.net/binaries/debian/7/i386/ruby-2.0.0-p247.tar.bz2=a0a85eabcde5ebd782d07016ab6aae84
https://rvm_io.global.ssl.fastly.net/binaries/debian/7/i386/ruby-2.0.0-p353.tar.bz2=764b3caf7c74846503869a5e2ea75c13
https://rvm_io.global.ssl.fastly.net/binaries/debian/7/i386/ruby-2.0.0-p451.tar.bz2=55552c21ebe885f56b568e6829e25d2c
https://rvm_io.global.ssl.fastly.net/binaries/debian/7/i386/ruby-2.0.0-p481.tar.bz2=61596f2b7d1b5365f238613cd0e736c4
https://rvm_io.global.ssl.fastly.net/binaries/debian/7/i386/ruby-2.0.0-p576.tar.bz2=2df3615ad8bf188ad4293edc3748fff8
https://rvm_io.global.ssl.fastly.net/binaries/debian/7/i386/ruby-2.0.0-p598.tar.bz2=abe838399f64c0ce7616fd160ea67463
https://rvm_io.global.ssl.fastly.net/binaries/debian/7/i386/ruby-2.1.0.tar.bz2=d3edccf815a7ca9b220b8419a92ed835
https://rvm_io.global.ssl.fastly.net/binaries/debian/7/i386/ruby-2.1.1.tar.bz2=541707f5a5099333ac2afda5ba2af0f7
https://rvm_io.global.ssl.fastly.net/binaries/debian/7/i386/ruby-2.1.2.tar.bz2=3f1cbf54547bfa38522e815d22793bda
https://rvm_io.global.ssl.fastly.net/binaries/debian/7/i386/ruby-2.1.3.tar.bz2=0102725a3237f971e2e8fecf88e269f5
https://rvm_io.global.ssl.fastly.net/binaries/debian/7/i386/ruby-2.1.5.tar.bz2=712bf0628826cdc73377989ec3fb8824
https://rvm_io.global.ssl.fastly.net/binaries/debian/7/i386/ruby-2.2.0.tar.bz2=6c1d82b5451285ad770983109d57eb1f
https://rvm_io.global.ssl.fastly.net/binaries/debian/7/i386/ruby-2.2.1.tar.bz2=eac7973fc0035c9894dc922672fbad33
https://rvm_io.global.ssl.fastly.net/binaries/debian/7/x86_64/ruby-1.9.3-p194.tar.bz2=b2179251fab0f9286dfc7ede62d3bf98
https://rvm_io.global.ssl.fastly.net/binaries/debian/7/x86_64/ruby-1.9.3-p286.tar.bz2=d511950fe06b95f1780dae9fcc0a2db5
https://rvm_io.global.ssl.fastly.net/binaries/debian/7/x86_64/ruby-1.9.3-p374.tar.bz2=d28bb8dd50b3c8fe9c4aa4dbf2271651
https://rvm_io.global.ssl.fastly.net/binaries/debian/7/x86_64/ruby-1.9.3-p392.tar.bz2=74000d05d48b1dcae127dfd5728c5f5d
https://rvm_io.global.ssl.fastly.net/binaries/debian/7/x86_64/ruby-1.9.3-p429.tar.bz2=54b2d9b0ecebfafb9c8747ee0c4d281d
https://rvm_io.global.ssl.fastly.net/binaries/debian/7/x86_64/ruby-1.9.3-p448.tar.bz2=aee9e64140470d4510b6a42a3f487349
https://rvm_io.global.ssl.fastly.net/binaries/debian/7/x86_64/ruby-1.9.3-p484.tar.bz2=36f8fcaa5001387efdac6181da71a0ad
https://rvm_io.global.ssl.fastly.net/binaries/debian/7/x86_64/ruby-1.9.3-p545.tar.bz2=b58ff966b2bac1cdd373ded74cf95694
https://rvm_io.global.ssl.fastly.net/binaries/debian/7/x86_64/ruby-1.9.3-p547.tar.bz2=ef99ef4bbf8b7ba25fd03bf41f237594
https://rvm_io.global.ssl.fastly.net/binaries/debian/7/x86_64/ruby-1.9.3-p551.tar.bz2=800f49b0225a561f4ccafb4858a93c57
https://rvm_io.global.ssl.fastly.net/binaries/debian/7/x86_64/ruby-2.0.0-p0.tar.bz2=b348c5b603061cbea2ecbcb15d2e16ff
https://rvm_io.global.ssl.fastly.net/binaries/debian/7/x86_64/ruby-2.0.0-p195.tar.bz2=1e91e7a5476dbdc639b651b523fe636d
https://rvm_io.global.ssl.fastly.net/binaries/debian/7/x86_64/ruby-2.0.0-p247.tar.bz2=873b9542a896db11c4df683e0e9293c9
https://rvm_io.global.ssl.fastly.net/binaries/debian/7/x86_64/ruby-2.0.0-p353.tar.bz2=eea29f40af055e208b4c9d44f52b3b9a
https://rvm_io.global.ssl.fastly.net/binaries/debian/7/x86_64/ruby-2.0.0-p451.tar.bz2=949ace8f19b52643df465f4b2573601a
https://rvm_io.global.ssl.fastly.net/binaries/debian/7/x86_64/ruby-2.0.0-p481.tar.bz2=2d8f4161a9a67fa6a2f3895f25607b0c
https://rvm_io.global.ssl.fastly.net/binaries/debian/7/x86_64/ruby-2.0.0-p576.tar.bz2=6abfb085cb08966fe18dbed039bad386
https://rvm_io.global.ssl.fastly.net/binaries/debian/7/x86_64/ruby-2.0.0-p598.tar.bz2=81cb26788456a10b584683b127603b91
https://rvm_io.global.ssl.fastly.net/binaries/debian/7/x86_64/ruby-2.1.0.tar.bz2=7e36f263ce96349e28e9ed4d8b5f3760
https://rvm_io.global.ssl.fastly.net/binaries/debian/7/x86_64/ruby-2.1.1.tar.bz2=1ff41bb6eedc7468f976aa6e6eb3d39e
https://rvm_io.global.ssl.fastly.net/binaries/debian/7/x86_64/ruby-2.1.2.tar.bz2=89e833e606422a540aa1ea0e499e895d
https://rvm_io.global.ssl.fastly.net/binaries/debian/7/x86_64/ruby-2.1.3.tar.bz2=6b673707b879c6f33b4f92f7ceb71747
https://rvm_io.global.ssl.fastly.net/binaries/debian/7/x86_64/ruby-2.1.5.tar.bz2=d0bf88cf225862d5888df781133eeae2
https://rvm_io.global.ssl.fastly.net/binaries/debian/7/x86_64/ruby-2.2.0.tar.bz2=fec79009244dcb2053bf4e255ffb17b8
https://rvm_io.global.ssl.fastly.net/binaries/debian/7/x86_64/ruby-2.2.1.tar.bz2=67b967628dc0706a2ac69aee278f8121
https://rvm_io.global.ssl.fastly.net/binaries/debian/8/x86_64/ruby-1.9.3-p547.tar.bz2=a65c9cb946cbf5bae4178ef716cef100
https://rvm_io.global.ssl.fastly.net/binaries/debian/8/x86_64/ruby-1.9.3-p551.tar.bz2=1f9db401628dab272ac5d23d55b1b43d
https://rvm_io.global.ssl.fastly.net/binaries/debian/8/x86_64/ruby-2.0.0-p353.tar.bz2=1c0143bf3fa0047c37207c9fcb5dd20d
https://rvm_io.global.ssl.fastly.net/binaries/debian/8/x86_64/ruby-2.0.0-p481.tar.bz2=a0e613046dbce6ec2fba5d47928359f2
https://rvm_io.global.ssl.fastly.net/binaries/debian/8/x86_64/ruby-2.0.0-p576.tar.bz2=678a1256c2be34eca3597af0cd8b6dc3
https://rvm_io.global.ssl.fastly.net/binaries/debian/8/x86_64/ruby-2.0.0-p598.tar.bz2=4223acfcad99874ede78789858b36d97
https://rvm_io.global.ssl.fastly.net/binaries/debian/8/x86_64/ruby-2.1.0.tar.bz2=afa716b4146eab54cad96c7fa05c7674
https://rvm_io.global.ssl.fastly.net/binaries/debian/8/x86_64/ruby-2.1.2.tar.bz2=47cf33426a907cb4ea445cd2e6245b6e
https://rvm_io.global.ssl.fastly.net/binaries/debian/8/x86_64/ruby-2.1.3.tar.bz2=74afd20fdf8726c5586f0b474228b6f5
https://rvm_io.global.ssl.fastly.net/binaries/debian/8/x86_64/ruby-2.1.5.tar.bz2=98c4ffbcbfaac330adfe8680908b822e
https://rvm_io.global.ssl.fastly.net/binaries/debian/8/x86_64/ruby-2.2.0.tar.bz2=33aa0bc5c28cbacd3cbfa5a77375a355
https://rvm_io.global.ssl.fastly.net/binaries/debian/8/x86_64/ruby-2.2.1.tar.bz2=427bdc3906ad33b191697cf0e37b9a85
https://rvm_io.global.ssl.fastly.net/binaries/debian/8/x86_64/ruby-2.2.6.tar.bz2=78be4688c73e9790892ede8bff91fd27
https://rvm_io.global.ssl.fastly.net/binaries/debian/8/x86_64/ruby-2.3.0.tar.bz2=eaa39b2b2b0ad645541aefd5cff1a449
https://rvm_io.global.ssl.fastly.net/binaries/debian/8/x86_64/ruby-2.3.1.tar.bz2=83a1cefb874b0e9ed9a41bfc7d901923
https://rvm_io.global.ssl.fastly.net/binaries/debian/8/x86_64/ruby-2.3.2.tar.bz2=96e5dd9d7760e9c8e588b02d1395847d
https://rvm_io.global.ssl.fastly.net/binaries/debian/8/x86_64/ruby-2.3.3.tar.bz2=7aaffcc1d4c12a0d55234a994afd6b78
https://rvm_io.global.ssl.fastly.net/binaries/debian/8/x86_64/ruby-2.4.0.tar.bz2=5b300b7d38b8690332d17f566d0c9946
https://rvm_io.global.ssl.fastly.net/binaries/debian/8/x86_64/ruby-2.4.1.tar.bz2=8e0ede5b98b1354030512750d9c1a6f0
https://rvm_io.global.ssl.fastly.net/binaries/debian/8/x86_64/ruby-2.4.2.tar.bz2=ab6ab453a52a22bef13bdd4293931954
https://rvm_io.global.ssl.fastly.net/binaries/debian/8/x86_64/ruby-2.4.3.tar.bz2=594be8106dfafc4ca7edc439193767b0
https://rvm_io.global.ssl.fastly.net/binaries/debian/8/x86_64/ruby-2.4.4.tar.bz2=601fcd9011cb796f802751254087a003
https://rvm_io.global.ssl.fastly.net/binaries/debian/8/x86_64/ruby-2.4.5.tar.bz2=87524c2b76c03f9df5aaa72db8814db6
https://rvm_io.global.ssl.fastly.net/binaries/debian/8/x86_64/ruby-2.4.6.tar.bz2=5375035d69d7b27ac508e398549faf9f
https://rvm_io.global.ssl.fastly.net/binaries/debian/8/x86_64/ruby-2.4.7.tar.bz2=a1c029ac74ce8c9b7406bb98f57dd4b4
https://rvm_io.global.ssl.fastly.net/binaries/debian/8/x86_64/ruby-2.4.8.tar.bz2=ceedd129e2e9e4a7526d239244c0762a
https://rvm_io.global.ssl.fastly.net/binaries/debian/8/x86_64/ruby-2.4.9.tar.bz2=42f9bcf1b83c984379d08f731c824b9e
https://rvm_io.global.ssl.fastly.net/binaries/debian/8/x86_64/ruby-2.4.10.tar.bz2=e48b66f784febbd547316ea53088ce39
https://rvm_io.global.ssl.fastly.net/binaries/debian/8/x86_64/ruby-2.5.0.tar.bz2=03cb330dec734d1f942736bc98c94dd2
https://rvm_io.global.ssl.fastly.net/binaries/debian/8/x86_64/ruby-2.5.1.tar.bz2=02ff313c92f6df7e1b413a5dc6ce228f
https://rvm_io.global.ssl.fastly.net/binaries/debian/8/x86_64/ruby-2.5.2.tar.bz2=674608a59bf651ba6e0a4d13c01c1b2a
https://rvm_io.global.ssl.fastly.net/binaries/debian/8/x86_64/ruby-2.5.3.tar.bz2=9075ae59e9bf38b98ce58abc394c6a24
https://rvm_io.global.ssl.fastly.net/binaries/debian/8/x86_64/ruby-2.5.4.tar.bz2=1161ca36bb713d1bd0dd867597902185
https://rvm_io.global.ssl.fastly.net/binaries/debian/8/x86_64/ruby-2.5.5.tar.bz2=326fc1b16ed83a689307a375b94cdd14
https://rvm_io.global.ssl.fastly.net/binaries/debian/8/x86_64/ruby-2.5.6.tar.bz2=7dab5ebeb1ff078166574e541fbcdfea
https://rvm_io.global.ssl.fastly.net/binaries/debian/8/x86_64/ruby-2.5.7.tar.bz2=2b086c4a62633c07b13c08b1e19a625f
https://rvm_io.global.ssl.fastly.net/binaries/debian/8/x86_64/ruby-2.5.8.tar.bz2=9c37bf5350fdc4b7712f1b944f77a4f4
https://rvm_io.global.ssl.fastly.net/binaries/debian/8/x86_64/ruby-2.6.0.tar.bz2=00db1ad8ac2c0acf84c58e438d489575
https://rvm_io.global.ssl.fastly.net/binaries/debian/8/x86_64/ruby-2.6.1.tar.bz2=f9a4aace5303c5d02bb6f1757cda462c
https://rvm_io.global.ssl.fastly.net/binaries/debian/8/x86_64/ruby-2.6.2.tar.bz2=8afe698bb6aacb20e14c17cf5610e6d5
https://rvm_io.global.ssl.fastly.net/binaries/debian/8/x86_64/ruby-2.6.3.tar.bz2=ddc7d00f082675e6074578ec219f2f7a
https://rvm_io.global.ssl.fastly.net/binaries/debian/8/x86_64/ruby-2.6.4.tar.bz2=abbcca050110438b057b9958f5557f1e
https://rvm_io.global.ssl.fastly.net/binaries/debian/8/x86_64/ruby-2.6.5.tar.bz2=30bbaf942743ee58fbbe6f3531fc70ed
https://rvm_io.global.ssl.fastly.net/binaries/debian/8/x86_64/ruby-2.6.6.tar.bz2=dd62bafdf288fc117bba81bea236b6de
https://rvm_io.global.ssl.fastly.net/binaries/debian/8/x86_64/ruby-2.7.0.tar.bz2=5882ff4755ad757bcec35aa45ad4ec2b
https://rvm_io.global.ssl.fastly.net/binaries/debian/8/x86_64/ruby-2.7.1.tar.bz2=239f45c247285e3d86ead9e9a06cea4a
https://rvm_io.global.ssl.fastly.net/binaries/debian/8/x86_64/ruby-2.7.2.tar.bz2=fc657e12d17981119f9a949fb7bd0429
https://rvm_io.global.ssl.fastly.net/binaries/debian/8/x86_64/ruby-3.0.0-preview1.tar.bz2=3f576f1bb3a7c5a817937b57fc2225c5
https://rvm_io.global.ssl.fastly.net/binaries/debian/9/x86_64/ruby-2.4.0.tar.bz2=fa6614d9e1da65fe019ad5f30a2750e5
https://rvm_io.global.ssl.fastly.net/binaries/debian/9/x86_64/ruby-2.4.1.tar.bz2=45f0cc2188dc73a547702eb2caeec1b4
https://rvm_io.global.ssl.fastly.net/binaries/debian/9/x86_64/ruby-2.4.2.tar.bz2=7b129d618a6a1eebd85dba9fe98f6e91
https://rvm_io.global.ssl.fastly.net/binaries/debian/9/x86_64/ruby-2.4.3.tar.bz2=3f1ac79e888dc16b5378db888b27886a
https://rvm_io.global.ssl.fastly.net/binaries/debian/9/x86_64/ruby-2.4.4.tar.bz2=ed1b10e292fa203d293939df0b7e2aa7
https://rvm_io.global.ssl.fastly.net/binaries/debian/9/x86_64/ruby-2.4.5.tar.bz2=d5857e812a2c24ee658334878f20c552
https://rvm_io.global.ssl.fastly.net/binaries/debian/9/x86_64/ruby-2.4.6.tar.bz2=f1b6e718064730b47e3d196f4a8796dc
https://rvm_io.global.ssl.fastly.net/binaries/debian/9/x86_64/ruby-2.4.7.tar.bz2=23b36cbf4bd7825810af9039d56f6b4d
https://rvm_io.global.ssl.fastly.net/binaries/debian/9/x86_64/ruby-2.4.8.tar.bz2=a02775ed1a6cf0252d2d87d97651d770
https://rvm_io.global.ssl.fastly.net/binaries/debian/9/x86_64/ruby-2.4.9.tar.bz2=eba5c1b415e2445f72cec6710c0533ed
https://rvm_io.global.ssl.fastly.net/binaries/debian/9/x86_64/ruby-2.4.10.tar.bz2=65f1fcf8aaa74291cbbc2dcfd6893049
https://rvm_io.global.ssl.fastly.net/binaries/debian/9/x86_64/ruby-2.5.0.tar.bz2=12ac8af3151366556602a757b43add92
https://rvm_io.global.ssl.fastly.net/binaries/debian/9/x86_64/ruby-2.5.1.tar.bz2=6b4420c6cb234e42caf1f157396b658a
https://rvm_io.global.ssl.fastly.net/binaries/debian/9/x86_64/ruby-2.5.2.tar.bz2=0641fa31af9f40beb82a686776778ab0
https://rvm_io.global.ssl.fastly.net/binaries/debian/9/x86_64/ruby-2.5.3.tar.bz2=5759b1900de4facf31bcc41ca54c7307
https://rvm_io.global.ssl.fastly.net/binaries/debian/9/x86_64/ruby-2.5.4.tar.bz2=255912fa6b4527ebde3fa6c35fdd4672
https://rvm_io.global.ssl.fastly.net/binaries/debian/9/x86_64/ruby-2.5.5.tar.bz2=de55f4a4269023b18dbc5ad474d3725d
https://rvm_io.global.ssl.fastly.net/binaries/debian/9/x86_64/ruby-2.5.6.tar.bz2=3e0fabf8db055387d23c719888c1fd80
https://rvm_io.global.ssl.fastly.net/binaries/debian/9/x86_64/ruby-2.5.7.tar.bz2=d1913ce78886194e5016aebd825bacb6
https://rvm_io.global.ssl.fastly.net/binaries/debian/9/x86_64/ruby-2.5.8.tar.bz2=368f9972ad0d47fded67ad408e5b56aa
https://rvm_io.global.ssl.fastly.net/binaries/debian/9/x86_64/ruby-2.6.0.tar.bz2=49cf3c65b754a045419b5bc6ec09e7fd
https://rvm_io.global.ssl.fastly.net/binaries/debian/9/x86_64/ruby-2.6.1.tar.bz2=ffb1f027c8d51d853fe304ff5b77bd53
https://rvm_io.global.ssl.fastly.net/binaries/debian/9/x86_64/ruby-2.6.2.tar.bz2=6b710c0d5495c7818157805ac3f21f57
https://rvm_io.global.ssl.fastly.net/binaries/debian/9/x86_64/ruby-2.6.3.tar.bz2=e243ef988299a300c78e70e985067a0e
https://rvm_io.global.ssl.fastly.net/binaries/debian/9/x86_64/ruby-2.6.4.tar.bz2=b499b6713beaebdf202b97b0ea360c8b
https://rvm_io.global.ssl.fastly.net/binaries/debian/9/x86_64/ruby-2.6.5.tar.bz2=729dc7cc63462456a6e07a7e92f0449f
https://rvm_io.global.ssl.fastly.net/binaries/debian/9/x86_64/ruby-2.6.6.tar.bz2=49a475e58b67ee419965c3fc7ae6e5d0
https://rvm_io.global.ssl.fastly.net/binaries/debian/9/x86_64/ruby-2.7.0.tar.bz2=f4e179729f25b4da8301080ec2d63209
https://rvm_io.global.ssl.fastly.net/binaries/debian/9/x86_64/ruby-2.7.1.tar.bz2=01e093c928caca77b85cedff64af1d2e
https://rvm_io.global.ssl.fastly.net/binaries/debian/9/x86_64/ruby-2.7.2.tar.bz2=a3f9c556acf9ce24b9c228eaf0ce1a5b
https://rvm_io.global.ssl.fastly.net/binaries/debian/9/x86_64/ruby-3.0.0-preview1.tar.bz2=8bedca44418065773deb8711b563cebe
https://rvm_io.global.ssl.fastly.net/binaries/debian/10/x86_64/ruby-2.4.0.tar.bz2=e311fd7d62b273b17e467c24afd46656
https://rvm_io.global.ssl.fastly.net/binaries/debian/10/x86_64/ruby-2.4.1.tar.bz2=4521f00ffdba4e33972ff591e853b79f
https://rvm_io.global.ssl.fastly.net/binaries/debian/10/x86_64/ruby-2.4.2.tar.bz2=1a0c54769a563c2bc0aef788ebc5ce82
https://rvm_io.global.ssl.fastly.net/binaries/debian/10/x86_64/ruby-2.4.3.tar.bz2=3cbbd659a84e15cb3d6f67cf1c057256
https://rvm_io.global.ssl.fastly.net/binaries/debian/10/x86_64/ruby-2.4.4.tar.bz2=0fbc2a234968dfc0db1f5b32bd8c4b53
https://rvm_io.global.ssl.fastly.net/binaries/debian/10/x86_64/ruby-2.4.5.tar.bz2=0505dee913b42fed2248ffe9326b6d71
https://rvm_io.global.ssl.fastly.net/binaries/debian/10/x86_64/ruby-2.4.6.tar.bz2=94e3d0a16ded63d65b12b773d0768eb8
https://rvm_io.global.ssl.fastly.net/binaries/debian/10/x86_64/ruby-2.4.7.tar.bz2=cdd93e353b65baafddf14f6e31db17c4
https://rvm_io.global.ssl.fastly.net/binaries/debian/10/x86_64/ruby-2.4.8.tar.bz2=46a228d40c3fa72ee79a6873525212d7
https://rvm_io.global.ssl.fastly.net/binaries/debian/10/x86_64/ruby-2.4.9.tar.bz2=b9c77e3f709abbb7dccad3a021333542
https://rvm_io.global.ssl.fastly.net/binaries/debian/10/x86_64/ruby-2.4.10.tar.bz2=55b799d61a7cd1c44660530d843cdc4d
https://rvm_io.global.ssl.fastly.net/binaries/debian/10/x86_64/ruby-2.5.0.tar.bz2=4b2dcbc3cfae9f926c2a35c666fb7f34
https://rvm_io.global.ssl.fastly.net/binaries/debian/10/x86_64/ruby-2.5.1.tar.bz2=cc48bec77bac7494fc71041fbadcf037
https://rvm_io.global.ssl.fastly.net/binaries/debian/10/x86_64/ruby-2.5.2.tar.bz2=3e39b27876aff2d9892e1f2b875cbe19
https://rvm_io.global.ssl.fastly.net/binaries/debian/10/x86_64/ruby-2.5.3.tar.bz2=0a2d7fa5852ba14a0596fd4caceff453
https://rvm_io.global.ssl.fastly.net/binaries/debian/10/x86_64/ruby-2.5.4.tar.bz2=f0ece4b322e25fcee423d6830d2e5da4
https://rvm_io.global.ssl.fastly.net/binaries/debian/10/x86_64/ruby-2.5.5.tar.bz2=8f3acc5038bc63420253cd90daf18a96
https://rvm_io.global.ssl.fastly.net/binaries/debian/10/x86_64/ruby-2.5.6.tar.bz2=68570aaf875248ba04c8011370e1970e
https://rvm_io.global.ssl.fastly.net/binaries/debian/10/x86_64/ruby-2.5.7.tar.bz2=f8decfdb914f4b4b3f91eff4dde1df21
https://rvm_io.global.ssl.fastly.net/binaries/debian/10/x86_64/ruby-2.5.8.tar.bz2=65b112ef6b72cc152c1b08dcc4db1ea3
https://rvm_io.global.ssl.fastly.net/binaries/debian/10/x86_64/ruby-2.6.0.tar.bz2=143122343b187e4f9684704752695755
https://rvm_io.global.ssl.fastly.net/binaries/debian/10/x86_64/ruby-2.6.1.tar.bz2=6a23d67169695df7acdda0320ac067ec
https://rvm_io.global.ssl.fastly.net/binaries/debian/10/x86_64/ruby-2.6.2.tar.bz2=5d1a4829163f90941ee6bcf90a391ae8
https://rvm_io.global.ssl.fastly.net/binaries/debian/10/x86_64/ruby-2.6.3.tar.bz2=59d621379c5df523d26a189f9392ebc4
https://rvm_io.global.ssl.fastly.net/binaries/debian/10/x86_64/ruby-2.6.4.tar.bz2=8de0a69d3abc0404b83ebc74224fcf0b
https://rvm_io.global.ssl.fastly.net/binaries/debian/10/x86_64/ruby-2.6.5.tar.bz2=c7ced4cfe6be9f247bdfb36b551d1519
https://rvm_io.global.ssl.fastly.net/binaries/debian/10/x86_64/ruby-2.6.6.tar.bz2=49709ad68580a768a6df34e06f009005
https://rvm_io.global.ssl.fastly.net/binaries/debian/10/x86_64/ruby-2.7.0.tar.bz2=6633798a074e9926bdcccc36cdd4c792
https://rvm_io.global.ssl.fastly.net/binaries/debian/10/x86_64/ruby-2.7.1.tar.bz2=5d41b77af4c99af1acd188942ff05153
https://rvm_io.global.ssl.fastly.net/binaries/debian/10/x86_64/ruby-2.7.2.tar.bz2=627fcabc6fdadb4619d52fd250d94474
https://rvm_io.global.ssl.fastly.net/binaries/debian/10/x86_64/ruby-3.0.0-preview1.tar.bz2=c4336ba12aa3863f760e419863026b37
https://rvm_io.global.ssl.fastly.net/binaries/fedora/17/x86_64/ruby-1.9.3-p429.tar.bz2=e8b54fd757dfd0ff485113be66b2088d
https://rvm_io.global.ssl.fastly.net/binaries/fedora/17/x86_64/ruby-1.9.3-p448.tar.bz2=32deef7f911a26115175cd8f82ed8f4e
https://rvm_io.global.ssl.fastly.net/binaries/fedora/17/x86_64/ruby-2.0.0-p195.tar.bz2=aed98505973fd86021baa52310232537
https://rvm_io.global.ssl.fastly.net/binaries/fedora/17/x86_64/ruby-2.0.0-p247.tar.bz2=b3327c1ee2bf46c915e4238a6ce5eebf
https://rvm_io.global.ssl.fastly.net/binaries/fedora/18/x86_64/ruby-1.9.3-p429.tar.bz2=ecdc50201bcba0fefaa77e4f5e1af79d
https://rvm_io.global.ssl.fastly.net/binaries/fedora/18/x86_64/ruby-1.9.3-p448.tar.bz2=cf6d32f6530549cc3462b8f9ee0120b8
https://rvm_io.global.ssl.fastly.net/binaries/fedora/18/x86_64/ruby-1.9.3-p484.tar.bz2=6176e2b6a07c3b3c50f2a424b997618e
https://rvm_io.global.ssl.fastly.net/binaries/fedora/18/x86_64/ruby-2.0.0-p195.tar.bz2=d5d2e25b11cc000abfdc6baf73357ae5
https://rvm_io.global.ssl.fastly.net/binaries/fedora/18/x86_64/ruby-2.0.0-p247.tar.bz2=76c1cac2220ae64627e0767e23da6f90
https://rvm_io.global.ssl.fastly.net/binaries/fedora/18/x86_64/ruby-2.0.0-p353.tar.bz2=4f966a046d102e3ea57ef80d45af8260
https://rvm_io.global.ssl.fastly.net/binaries/fedora/18/x86_64/ruby-2.1.0.tar.bz2=955ae6bc1eeb8989ac187ce78dd40540
https://rvm_io.global.ssl.fastly.net/binaries/fedora/19/x86_64/ruby-1.9.3-p448.tar.bz2=735efd2878524d3dfff88bfe2830dedb
https://rvm_io.global.ssl.fastly.net/binaries/fedora/19/x86_64/ruby-1.9.3-p484.tar.bz2=3671ba92aca3a99b624e37a57fb9eb84
https://rvm_io.global.ssl.fastly.net/binaries/fedora/19/x86_64/ruby-1.9.3-p545.tar.bz2=14bd56937214382279745add5c179b2f
https://rvm_io.global.ssl.fastly.net/binaries/fedora/19/x86_64/ruby-1.9.3-p547.tar.bz2=f518e8bafd1506ab88dd75959fdef09e
https://rvm_io.global.ssl.fastly.net/binaries/fedora/19/x86_64/ruby-1.9.3-p551.tar.bz2=2ec012bbdd28612dedfd4d7c30f7c8db
https://rvm_io.global.ssl.fastly.net/binaries/fedora/19/x86_64/ruby-2.0.0-p247.tar.bz2=0f00ff920a9d45dfd05943ae79236762
https://rvm_io.global.ssl.fastly.net/binaries/fedora/19/x86_64/ruby-2.0.0-p353.tar.bz2=7feee293fb5746077231b1dbdf7ccdb5
https://rvm_io.global.ssl.fastly.net/binaries/fedora/19/x86_64/ruby-2.0.0-p451.tar.bz2=cbffe7a954df812e3d076737871f522f
https://rvm_io.global.ssl.fastly.net/binaries/fedora/19/x86_64/ruby-2.0.0-p481.tar.bz2=7ede42eadce775395c7130f113cf9f52
https://rvm_io.global.ssl.fastly.net/binaries/fedora/19/x86_64/ruby-2.0.0-p576.tar.bz2=68c9916eb2dc9c68ba666b37787adbd5
https://rvm_io.global.ssl.fastly.net/binaries/fedora/19/x86_64/ruby-2.0.0-p598.tar.bz2=2fd0fa0a99bdff307d6d92818e1ad0d7
https://rvm_io.global.ssl.fastly.net/binaries/fedora/19/x86_64/ruby-2.1.0.tar.bz2=d0aa5745c1e39b4d9786fc4ec1811d82
https://rvm_io.global.ssl.fastly.net/binaries/fedora/19/x86_64/ruby-2.1.1.tar.bz2=61bdd81e15e63e5158c11d4ba6a6f7fc
https://rvm_io.global.ssl.fastly.net/binaries/fedora/19/x86_64/ruby-2.1.2.tar.bz2=164b9607ec3946852daf7bd3409a028f
https://rvm_io.global.ssl.fastly.net/binaries/fedora/19/x86_64/ruby-2.1.3.tar.bz2=708c6367dd0ffed2f429fbed196c8cb6
https://rvm_io.global.ssl.fastly.net/binaries/fedora/19/x86_64/ruby-2.1.5.tar.bz2=966e64f70d6b5e1a7c8a56bf13948edb
https://rvm_io.global.ssl.fastly.net/binaries/fedora/19/x86_64/ruby-2.2.0.tar.bz2=e72cb18c63fe1bfd22ed926e191895fe
https://rvm_io.global.ssl.fastly.net/binaries/fedora/19/x86_64/ruby-2.2.1.tar.bz2=8db2d1b680dd8a8ad03ac3262924a638
https://rvm_io.global.ssl.fastly.net/binaries/fedora/20/x86_64/ruby-1.9.3-p547.tar.bz2=fd94930d2879efac2f56e436f8a59b3f
https://rvm_io.global.ssl.fastly.net/binaries/fedora/20/x86_64/ruby-1.9.3-p551.tar.bz2=ae6ff3492b321cf9af45506917ef622d
https://rvm_io.global.ssl.fastly.net/binaries/fedora/20/x86_64/ruby-2.0.0-p481.tar.bz2=5f591ce9ef9eec5adc7a974b99681d3e
https://rvm_io.global.ssl.fastly.net/binaries/fedora/20/x86_64/ruby-2.0.0-p576.tar.bz2=d73750dee8af3f0939a8bb6e43495f04
https://rvm_io.global.ssl.fastly.net/binaries/fedora/20/x86_64/ruby-2.0.0-p598.tar.bz2=4b1662b6552554a92cb1c7f1b87c9068
https://rvm_io.global.ssl.fastly.net/binaries/fedora/20/x86_64/ruby-2.1.2.tar.bz2=b9c25e0ce0a17c86fea3eaa3b3c680bb
https://rvm_io.global.ssl.fastly.net/binaries/fedora/20/x86_64/ruby-2.1.3.tar.bz2=3a881b62e88d72ad99c31425faad497d
https://rvm_io.global.ssl.fastly.net/binaries/fedora/20/x86_64/ruby-2.1.5.tar.bz2=740b731037b86295a1907b6393f0d7e4
https://rvm_io.global.ssl.fastly.net/binaries/fedora/20/x86_64/ruby-2.2.0.tar.bz2=41b89fc327d076c7658052a72c6bc79c
https://rvm_io.global.ssl.fastly.net/binaries/fedora/20/x86_64/ruby-2.2.1.tar.bz2=b4e8febbcde4ecaa7189428c1b4f8532
https://rvm_io.global.ssl.fastly.net/binaries/fedora/21/x86_64/ruby-1.9.3-p551.tar.bz2=d974619e5d62a2391c5f00c31672fad1
https://rvm_io.global.ssl.fastly.net/binaries/fedora/21/x86_64/ruby-2.0.0-p598.tar.bz2=83e16e3843582f734e2b8f6a5133aad3
https://rvm_io.global.ssl.fastly.net/binaries/fedora/21/x86_64/ruby-2.1.5.tar.bz2=4eba5ed5ecf1f26fb395473840853048
https://rvm_io.global.ssl.fastly.net/binaries/fedora/21/x86_64/ruby-2.2.0.tar.bz2=5dc7646dfbf5f20e529ec52b9f47b796
https://rvm_io.global.ssl.fastly.net/binaries/fedora/21/x86_64/ruby-2.2.1.tar.bz2=69d890bc613a02f5ab410366589bf667
https://rvm_io.global.ssl.fastly.net/binaries/opensuse/12.1/x86_64/ruby-1.9.3-p194.tar.bz2=dc6ba7f9d018b24925e0fbd8c4ea9eb7
https://rvm_io.global.ssl.fastly.net/binaries/opensuse/12.1/x86_64/ruby-1.9.3-p286.tar.bz2=8534aa8d63ac5251ee675ded2012717c
https://rvm_io.global.ssl.fastly.net/binaries/opensuse/12.1/x86_64/ruby-1.9.3-p374.tar.bz2=f29663cc36615fa612a15b19a1ca2620
https://rvm_io.global.ssl.fastly.net/binaries/opensuse/12.1/x86_64/ruby-1.9.3-p392.tar.bz2=e0338591fd94d6161af10eb00f34278d
https://rvm_io.global.ssl.fastly.net/binaries/opensuse/12.1/x86_64/ruby-2.0.0-p0.tar.bz2=16a62a3506fd3322ae6fa69324a70c68
https://rvm_io.global.ssl.fastly.net/binaries/opensuse/12.2/x86_64/ruby-1.9.3-p194.tar.bz2=8ee8576a71e66710b23fbd1a5b24997e
https://rvm_io.global.ssl.fastly.net/binaries/opensuse/12.2/x86_64/ruby-1.9.3-p286.tar.bz2=10670d95d2b3b1534144e91e187c7337
https://rvm_io.global.ssl.fastly.net/binaries/opensuse/12.2/x86_64/ruby-1.9.3-p327.tar.bz2=827ee1f154eca895b2f31f516c0a2ca1
https://rvm_io.global.ssl.fastly.net/binaries/opensuse/12.2/x86_64/ruby-1.9.3-p362.tar.bz2=5803537c0d4d0af89c47586768718602
https://rvm_io.global.ssl.fastly.net/binaries/opensuse/12.2/x86_64/ruby-1.9.3-p374.tar.bz2=dc5f0265fbc5e36560b3deddaf9fe763
https://rvm_io.global.ssl.fastly.net/binaries/opensuse/12.2/x86_64/ruby-1.9.3-p385.tar.bz2=23c24b2b78d10213e62cf7d66c8f0779
https://rvm_io.global.ssl.fastly.net/binaries/opensuse/12.2/x86_64/ruby-1.9.3-p392.tar.bz2=791eb1b60cb0abc0d602eccb348d0b62
https://rvm_io.global.ssl.fastly.net/binaries/opensuse/12.2/x86_64/ruby-2.0.0-p0.tar.bz2=00d6fc9b5dcc058aa8db921242123e29
https://rvm_io.global.ssl.fastly.net/binaries/opensuse/12.3/x86_64/ruby-1.9.3-p392.tar.bz2=d8d9349150d66ce54a4a5f6ff30b5733
https://rvm_io.global.ssl.fastly.net/binaries/opensuse/12.3/x86_64/ruby-1.9.3-p429.tar.bz2=a2d1878207e8937c87e9bd905ae8bdc3
https://rvm_io.global.ssl.fastly.net/binaries/opensuse/12.3/x86_64/ruby-1.9.3-p448.tar.bz2=9e02a04e5f0f8463e3f419adcc257b47
https://rvm_io.global.ssl.fastly.net/binaries/opensuse/12.3/x86_64/ruby-1.9.3-p484.tar.bz2=11d89f9dddd910f47a6498ca9374a2b1
https://rvm_io.global.ssl.fastly.net/binaries/opensuse/12.3/x86_64/ruby-1.9.3-p545.tar.bz2=8b32a889187ac9955d4c3fbe914c2edb
https://rvm_io.global.ssl.fastly.net/binaries/opensuse/12.3/x86_64/ruby-1.9.3-p547.tar.bz2=b651c414aa9105f890ab32ce6e9f38ea
https://rvm_io.global.ssl.fastly.net/binaries/opensuse/12.3/x86_64/ruby-1.9.3-p551.tar.bz2=e26d57759d936af3b37853b6aea15330
https://rvm_io.global.ssl.fastly.net/binaries/opensuse/12.3/x86_64/ruby-2.0.0-p0.tar.bz2=5eccf0d1ea5aba8ea2684296eb0c8249
https://rvm_io.global.ssl.fastly.net/binaries/opensuse/12.3/x86_64/ruby-2.0.0-p195.tar.bz2=cf656cb51dbc1e1008d271952a2287ae
https://rvm_io.global.ssl.fastly.net/binaries/opensuse/12.3/x86_64/ruby-2.0.0-p247.tar.bz2=63118d9a28264fdaa57923cc36829d75
https://rvm_io.global.ssl.fastly.net/binaries/opensuse/12.3/x86_64/ruby-2.0.0-p353.tar.bz2=a855d883b605b31ae34e8198fd7d4156
https://rvm_io.global.ssl.fastly.net/binaries/opensuse/12.3/x86_64/ruby-2.0.0-p451.tar.bz2=a74390cab7ba33cbc4fbb6f4588756be
https://rvm_io.global.ssl.fastly.net/binaries/opensuse/12.3/x86_64/ruby-2.0.0-p481.tar.bz2=49c24b6552ed8d32ead09619b0710104
https://rvm_io.global.ssl.fastly.net/binaries/opensuse/12.3/x86_64/ruby-2.0.0-p576.tar.bz2=b349282abbc4cacebefd63583122177c
https://rvm_io.global.ssl.fastly.net/binaries/opensuse/12.3/x86_64/ruby-2.0.0-p598.tar.bz2=c4edab93180f72e79dfe5fdee2fa0598
https://rvm_io.global.ssl.fastly.net/binaries/opensuse/12.3/x86_64/ruby-2.1.0.tar.bz2=353ef9282ee9fdae9d4dd7c5d7f6aff4
https://rvm_io.global.ssl.fastly.net/binaries/opensuse/12.3/x86_64/ruby-2.1.1.tar.bz2=db805467a09906846296a3a815ba45e3
https://rvm_io.global.ssl.fastly.net/binaries/opensuse/12.3/x86_64/ruby-2.1.2.tar.bz2=96a39796381be219cbe6461321154f66
https://rvm_io.global.ssl.fastly.net/binaries/opensuse/12.3/x86_64/ruby-2.1.3.tar.bz2=e6de5a6b287afc36fe69ce604767a065
https://rvm_io.global.ssl.fastly.net/binaries/opensuse/12.3/x86_64/ruby-2.1.5.tar.bz2=87dc2011fbf529fce011d5182575c849
https://rvm_io.global.ssl.fastly.net/binaries/opensuse/12.3/x86_64/ruby-2.2.0.tar.bz2=bcdecc78e7634e97780517ca06b9b445
https://rvm_io.global.ssl.fastly.net/binaries/opensuse/12.3/x86_64/ruby-2.2.1.tar.bz2=defa3f959e6817b465460281ca436b7c
https://rvm_io.global.ssl.fastly.net/binaries/opensuse/13.1/x86_64/ruby-1.9.3-p551.tar.bz2=f96d76663ef1e6ff03f6d961e2d1062e
https://rvm_io.global.ssl.fastly.net/binaries/opensuse/13.1/x86_64/ruby-2.0.0-p576.tar.bz2=7405ca61a45298e45761eeb8b84b1c37
https://rvm_io.global.ssl.fastly.net/binaries/opensuse/13.1/x86_64/ruby-2.0.0-p598.tar.bz2=fd47ded50b2c00b4014947f0c38ec3c3
https://rvm_io.global.ssl.fastly.net/binaries/opensuse/13.1/x86_64/ruby-2.1.3.tar.bz2=010c58b44d47b01adca014b52411468b
https://rvm_io.global.ssl.fastly.net/binaries/opensuse/13.1/x86_64/ruby-2.1.5.tar.bz2=24deecf424828b3638ba45adc6ff1c9b
https://rvm_io.global.ssl.fastly.net/binaries/opensuse/13.1/x86_64/ruby-2.2.0.tar.bz2=5d645075a46137bd6ca27f333ff921f8
https://rvm_io.global.ssl.fastly.net/binaries/opensuse/13.1/x86_64/ruby-2.2.1.tar.bz2=de032abda6c4d792eaecfe891c7d819f
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.7/x86_64/ruby-2.0.0-p451.tar.bz2=72740441714ea5732c219efe3a4a17a0
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.7/x86_64/ruby-2.0.0-p481.tar.bz2=4f5ab89e550cbd446c4457b5ba7c17d0
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.7/x86_64/ruby-2.0.0-p576.tar.bz2=343d32583855b6adf7d8fe393a2575cf
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.7/x86_64/ruby-2.0.0-p594.tar.bz2=6480351f5302c00b4a40a9ab5c9a3db3
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.7/x86_64/ruby-2.0.0-p598.tar.bz2=16da64f05aeca63c5e7c8fe90ebc64e0
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.7/x86_64/ruby-2.0.0-p643.tar.bz2=1937d9b31c9c3a67a8dff0831dd483b5
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.7/x86_64/ruby-2.0.0-p645.tar.bz2=a927b7b167805e7155b50d2c8d807f2b
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.7/x86_64/ruby-2.0.0-p647.tar.bz2=19db8641c96b80bfe516d81debafc9e7
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.7/x86_64/ruby-2.1.0.tar.bz2=841f405d073132b198cd526422d86dbd
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.7/x86_64/ruby-2.1.1.tar.bz2=b57951057dc2d129ca59ee1d03666059
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.7/x86_64/ruby-2.1.2.tar.bz2=2c846aa1fbd5910584f54d2655a1ed6f
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.7/x86_64/ruby-2.1.3.tar.bz2=2cf6d1dcff40ecff3242aca4fcccdaf9
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.7/x86_64/ruby-2.1.4.tar.bz2=c66e257248512feacb323e26089e5817
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.7/x86_64/ruby-2.1.5.tar.bz2=b3b007e8033da456f8a0ca84e210f4af
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.7/x86_64/ruby-2.1.6.tar.bz2=ec5da63a2e3ecc6123cdacedb20ac909
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.7/x86_64/ruby-2.1.7.tar.bz2=6c2558fcf9b874d2f7121f23117b85d4
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.7/x86_64/ruby-2.2.0.tar.bz2=1c975f87a30c4ad6b7bce00b38281946
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.7/x86_64/ruby-2.2.1.tar.bz2=fbf2a76172c2c93e5f480dbfb56bf538
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.7/x86_64/ruby-2.2.2.tar.bz2=aa129936fc65ee252a36df3022f4c3b1
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.7/x86_64/ruby-2.2.3.tar.bz2=82b261a8112fd009f3eb8619d8e3a472
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.8/x86_64/ruby-2.0.0-p451.tar.bz2=72740441714ea5732c219efe3a4a17a0
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.8/x86_64/ruby-2.0.0-p481.tar.bz2=4f5ab89e550cbd446c4457b5ba7c17d0
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.8/x86_64/ruby-2.0.0-p576.tar.bz2=343d32583855b6adf7d8fe393a2575cf
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.8/x86_64/ruby-2.0.0-p594.tar.bz2=6480351f5302c00b4a40a9ab5c9a3db3
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.8/x86_64/ruby-2.0.0-p598.tar.bz2=16da64f05aeca63c5e7c8fe90ebc64e0
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.8/x86_64/ruby-2.0.0-p643.tar.bz2=1937d9b31c9c3a67a8dff0831dd483b5
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.8/x86_64/ruby-2.0.0-p645.tar.bz2=a927b7b167805e7155b50d2c8d807f2b
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.8/x86_64/ruby-2.0.0-p647.tar.bz2=19db8641c96b80bfe516d81debafc9e7
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.8/x86_64/ruby-2.1.0.tar.bz2=841f405d073132b198cd526422d86dbd
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.8/x86_64/ruby-2.1.1.tar.bz2=b57951057dc2d129ca59ee1d03666059
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.8/x86_64/ruby-2.1.2.tar.bz2=2c846aa1fbd5910584f54d2655a1ed6f
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.8/x86_64/ruby-2.1.3.tar.bz2=2cf6d1dcff40ecff3242aca4fcccdaf9
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.8/x86_64/ruby-2.1.4.tar.bz2=c66e257248512feacb323e26089e5817
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.8/x86_64/ruby-2.1.5.tar.bz2=b3b007e8033da456f8a0ca84e210f4af
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.8/x86_64/ruby-2.1.6.tar.bz2=ec5da63a2e3ecc6123cdacedb20ac909
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.8/x86_64/ruby-2.1.7.tar.bz2=6c2558fcf9b874d2f7121f23117b85d4
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.8/x86_64/ruby-2.2.0.tar.bz2=1c975f87a30c4ad6b7bce00b38281946
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.8/x86_64/ruby-2.2.1.tar.bz2=fbf2a76172c2c93e5f480dbfb56bf538
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.8/x86_64/ruby-2.2.2.tar.bz2=aa129936fc65ee252a36df3022f4c3b1
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.8/x86_64/ruby-2.2.3.tar.bz2=82b261a8112fd009f3eb8619d8e3a472
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.9/x86_64/ruby-2.0.0-p451.tar.bz2=72740441714ea5732c219efe3a4a17a0
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.9/x86_64/ruby-2.0.0-p481.tar.bz2=4f5ab89e550cbd446c4457b5ba7c17d0
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.9/x86_64/ruby-2.0.0-p576.tar.bz2=343d32583855b6adf7d8fe393a2575cf
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.9/x86_64/ruby-2.0.0-p594.tar.bz2=6480351f5302c00b4a40a9ab5c9a3db3
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.9/x86_64/ruby-2.0.0-p598.tar.bz2=16da64f05aeca63c5e7c8fe90ebc64e0
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.9/x86_64/ruby-2.0.0-p643.tar.bz2=1937d9b31c9c3a67a8dff0831dd483b5
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.9/x86_64/ruby-2.0.0-p645.tar.bz2=a927b7b167805e7155b50d2c8d807f2b
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.9/x86_64/ruby-2.0.0-p647.tar.bz2=19db8641c96b80bfe516d81debafc9e7
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.9/x86_64/ruby-2.1.0.tar.bz2=841f405d073132b198cd526422d86dbd
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.9/x86_64/ruby-2.1.1.tar.bz2=b57951057dc2d129ca59ee1d03666059
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.9/x86_64/ruby-2.1.2.tar.bz2=2c846aa1fbd5910584f54d2655a1ed6f
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.9/x86_64/ruby-2.1.3.tar.bz2=2cf6d1dcff40ecff3242aca4fcccdaf9
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.9/x86_64/ruby-2.1.4.tar.bz2=c66e257248512feacb323e26089e5817
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.9/x86_64/ruby-2.1.5.tar.bz2=b3b007e8033da456f8a0ca84e210f4af
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.9/x86_64/ruby-2.1.6.tar.bz2=ec5da63a2e3ecc6123cdacedb20ac909
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.9/x86_64/ruby-2.1.7.tar.bz2=6c2558fcf9b874d2f7121f23117b85d4
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.9/x86_64/ruby-2.2.0.tar.bz2=1c975f87a30c4ad6b7bce00b38281946
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.9/x86_64/ruby-2.2.1.tar.bz2=fbf2a76172c2c93e5f480dbfb56bf538
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.9/x86_64/ruby-2.2.2.tar.bz2=aa129936fc65ee252a36df3022f4c3b1
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.9/x86_64/ruby-2.2.3.tar.bz2=82b261a8112fd009f3eb8619d8e3a472
https://rvm_io.global.ssl.fastly.net/binaries/oracle/7/x86_64/ruby-2.4.0.tar.bz2=37eb66681a66770b0c7bda05b064ba21
https://rvm_io.global.ssl.fastly.net/binaries/oracle/7/x86_64/ruby-2.4.1.tar.bz2=59e66f8d57e301f0f7700c63da48b9ee
https://rvm_io.global.ssl.fastly.net/binaries/oracle/7/x86_64/ruby-2.4.2.tar.bz2=f362ce8e6852ee534c67b2eff49ffbc5
https://rvm_io.global.ssl.fastly.net/binaries/oracle/7/x86_64/ruby-2.4.3.tar.bz2=97dfec0ef7db8d9f10144565077ebc6e
https://rvm_io.global.ssl.fastly.net/binaries/oracle/7/x86_64/ruby-2.4.4.tar.bz2=49725cf6b590a226be825cf9b13f3dae
https://rvm_io.global.ssl.fastly.net/binaries/oracle/7/x86_64/ruby-2.4.5.tar.bz2=12cc89dfe3eb14417533b33494c2e6bb
https://rvm_io.global.ssl.fastly.net/binaries/oracle/7/x86_64/ruby-2.4.6.tar.bz2=1539b4609610cf6069f72c4b098bda0e
https://rvm_io.global.ssl.fastly.net/binaries/oracle/7/x86_64/ruby-2.4.7.tar.bz2=c4d51b0b61baf22707c3d339e8a2c0e3
https://rvm_io.global.ssl.fastly.net/binaries/oracle/7/x86_64/ruby-2.4.8.tar.bz2=f95912983dce40cc6af353faeddcfbfa
https://rvm_io.global.ssl.fastly.net/binaries/oracle/7/x86_64/ruby-2.4.9.tar.bz2=8a8522d9d02d117b030d404888e16403
https://rvm_io.global.ssl.fastly.net/binaries/oracle/7/x86_64/ruby-2.4.10.tar.bz2=d0e9f0121818e67ef5cdef6d8573bd5c
https://rvm_io.global.ssl.fastly.net/binaries/oracle/7/x86_64/ruby-2.5.0.tar.bz2=dea3a75ec2287dc6c13cf2ac73ba768e
https://rvm_io.global.ssl.fastly.net/binaries/oracle/7/x86_64/ruby-2.5.1.tar.bz2=3c713c37b4d4b7dca05bb79a70108ddb
https://rvm_io.global.ssl.fastly.net/binaries/oracle/7/x86_64/ruby-2.5.2.tar.bz2=40f05208b0c8090347dbcf464176df42
https://rvm_io.global.ssl.fastly.net/binaries/oracle/7/x86_64/ruby-2.5.3.tar.bz2=54dee2a2b391160a1a0c103f89aa237f
https://rvm_io.global.ssl.fastly.net/binaries/oracle/7/x86_64/ruby-2.5.4.tar.bz2=25c3ced7dbb55b4e72813af352a71802
https://rvm_io.global.ssl.fastly.net/binaries/oracle/7/x86_64/ruby-2.5.5.tar.bz2=df9cb16150a9ada0e9f6ee093c591718
https://rvm_io.global.ssl.fastly.net/binaries/oracle/7/x86_64/ruby-2.5.6.tar.bz2=e28af2248ea55aa9804fd83f5fdef032
https://rvm_io.global.ssl.fastly.net/binaries/oracle/7/x86_64/ruby-2.5.7.tar.bz2=c2c191daf055114a70ea75101a0f0baf
https://rvm_io.global.ssl.fastly.net/binaries/oracle/7/x86_64/ruby-2.5.8.tar.bz2=4b2583745e509a35a0715812b455a168
https://rvm_io.global.ssl.fastly.net/binaries/oracle/7/x86_64/ruby-2.6.0.tar.bz2=c6170eafd5f63520000cba146865c48c
https://rvm_io.global.ssl.fastly.net/binaries/oracle/7/x86_64/ruby-2.6.1.tar.bz2=d12d75ee230a6651721ae07eb0f27c4f
https://rvm_io.global.ssl.fastly.net/binaries/oracle/7/x86_64/ruby-2.6.2.tar.bz2=8a8f372299a24266ffb214828f692f8f
https://rvm_io.global.ssl.fastly.net/binaries/oracle/7/x86_64/ruby-2.6.3.tar.bz2=d742178a0b026ee2f1f9040554e9c2a9
https://rvm_io.global.ssl.fastly.net/binaries/oracle/7/x86_64/ruby-2.6.4.tar.bz2=b8c49d3ad00e275a6fa3389f4bedc5d2
https://rvm_io.global.ssl.fastly.net/binaries/oracle/7/x86_64/ruby-2.6.5.tar.bz2=7672f83f93ade41141f59426883502fd
https://rvm_io.global.ssl.fastly.net/binaries/oracle/7/x86_64/ruby-2.6.6.tar.bz2=cc67163e8b3fd4b37665e345ee26106d
https://rvm_io.global.ssl.fastly.net/binaries/oracle/7/x86_64/ruby-2.7.0.tar.bz2=fbe7994459d18e6852a1e5af46b1cd31
https://rvm_io.global.ssl.fastly.net/binaries/oracle/7/x86_64/ruby-2.7.1.tar.bz2=387c28826a4be5d8b60e856971ffdf75
https://rvm_io.global.ssl.fastly.net/binaries/oracle/7/x86_64/ruby-2.7.2.tar.bz2=b5c970be1e67ed72b4476cb3fd34346f
https://rvm_io.global.ssl.fastly.net/binaries/oracle/7/x86_64/ruby-3.0.0-preview1.tar.bz2=9eb48cd2e2092bf01cb0e35663473a22
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.10/x86_64/ruby-2.0.0-p451.tar.bz2=72740441714ea5732c219efe3a4a17a0
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.10/x86_64/ruby-2.0.0-p481.tar.bz2=4f5ab89e550cbd446c4457b5ba7c17d0
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.10/x86_64/ruby-2.0.0-p576.tar.bz2=343d32583855b6adf7d8fe393a2575cf
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.10/x86_64/ruby-2.0.0-p594.tar.bz2=6480351f5302c00b4a40a9ab5c9a3db3
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.10/x86_64/ruby-2.0.0-p598.tar.bz2=16da64f05aeca63c5e7c8fe90ebc64e0
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.10/x86_64/ruby-2.0.0-p643.tar.bz2=1937d9b31c9c3a67a8dff0831dd483b5
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.10/x86_64/ruby-2.0.0-p645.tar.bz2=a927b7b167805e7155b50d2c8d807f2b
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.10/x86_64/ruby-2.0.0-p647.tar.bz2=19db8641c96b80bfe516d81debafc9e7
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.10/x86_64/ruby-2.1.0.tar.bz2=841f405d073132b198cd526422d86dbd
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.10/x86_64/ruby-2.1.1.tar.bz2=b57951057dc2d129ca59ee1d03666059
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.10/x86_64/ruby-2.1.2.tar.bz2=2c846aa1fbd5910584f54d2655a1ed6f
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.10/x86_64/ruby-2.1.3.tar.bz2=2cf6d1dcff40ecff3242aca4fcccdaf9
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.10/x86_64/ruby-2.1.4.tar.bz2=c66e257248512feacb323e26089e5817
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.10/x86_64/ruby-2.1.5.tar.bz2=b3b007e8033da456f8a0ca84e210f4af
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.10/x86_64/ruby-2.1.6.tar.bz2=ec5da63a2e3ecc6123cdacedb20ac909
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.10/x86_64/ruby-2.1.7.tar.bz2=6c2558fcf9b874d2f7121f23117b85d4
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.10/x86_64/ruby-2.2.0.tar.bz2=1c975f87a30c4ad6b7bce00b38281946
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.10/x86_64/ruby-2.2.1.tar.bz2=fbf2a76172c2c93e5f480dbfb56bf538
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.10/x86_64/ruby-2.2.2.tar.bz2=aa129936fc65ee252a36df3022f4c3b1
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.10/x86_64/ruby-2.2.3.tar.bz2=82b261a8112fd009f3eb8619d8e3a472
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.11/x86_64/ruby-2.0.0-p451.tar.bz2=72740441714ea5732c219efe3a4a17a0
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.11/x86_64/ruby-2.0.0-p481.tar.bz2=4f5ab89e550cbd446c4457b5ba7c17d0
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.11/x86_64/ruby-2.0.0-p576.tar.bz2=343d32583855b6adf7d8fe393a2575cf
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.11/x86_64/ruby-2.0.0-p594.tar.bz2=6480351f5302c00b4a40a9ab5c9a3db3
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.11/x86_64/ruby-2.0.0-p598.tar.bz2=16da64f05aeca63c5e7c8fe90ebc64e0
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.11/x86_64/ruby-2.0.0-p643.tar.bz2=1937d9b31c9c3a67a8dff0831dd483b5
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.11/x86_64/ruby-2.0.0-p645.tar.bz2=a927b7b167805e7155b50d2c8d807f2b
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.11/x86_64/ruby-2.0.0-p647.tar.bz2=19db8641c96b80bfe516d81debafc9e7
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.11/x86_64/ruby-2.0.0-p648.tar.bz2=1d747217772641b7795ab0715a5072fc
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.11/x86_64/ruby-2.1.0.tar.bz2=841f405d073132b198cd526422d86dbd
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.11/x86_64/ruby-2.1.1.tar.bz2=b57951057dc2d129ca59ee1d03666059
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.11/x86_64/ruby-2.1.2.tar.bz2=2c846aa1fbd5910584f54d2655a1ed6f
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.11/x86_64/ruby-2.1.3.tar.bz2=2cf6d1dcff40ecff3242aca4fcccdaf9
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.11/x86_64/ruby-2.1.4.tar.bz2=c66e257248512feacb323e26089e5817
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.11/x86_64/ruby-2.1.5.tar.bz2=b3b007e8033da456f8a0ca84e210f4af
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.11/x86_64/ruby-2.1.6.tar.bz2=ec5da63a2e3ecc6123cdacedb20ac909
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.11/x86_64/ruby-2.1.7.tar.bz2=6c2558fcf9b874d2f7121f23117b85d4
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.11/x86_64/ruby-2.1.8.tar.bz2=547440bb4fc03f025b31d00a6276e7c4
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.11/x86_64/ruby-2.1.9.tar.bz2=ce7376e89b097c465606d6efa6051182
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.11/x86_64/ruby-2.1.10.tar.bz2=147a8f6136f853e0582650c44a9875aa
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.11/x86_64/ruby-2.2.0.tar.bz2=1c975f87a30c4ad6b7bce00b38281946
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.11/x86_64/ruby-2.2.1.tar.bz2=fbf2a76172c2c93e5f480dbfb56bf538
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.11/x86_64/ruby-2.2.2.tar.bz2=aa129936fc65ee252a36df3022f4c3b1
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.11/x86_64/ruby-2.2.3.tar.bz2=82b261a8112fd009f3eb8619d8e3a472
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.11/x86_64/ruby-2.2.4.tar.bz2=69381008b00c8e28d876888f355c2832
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.11/x86_64/ruby-2.2.5.tar.bz2=e41bd7b8ac059ea1fce256fe38811e8c
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.12/x86_64/ruby-2.0.0-p451.tar.bz2=72740441714ea5732c219efe3a4a17a0
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.12/x86_64/ruby-2.0.0-p481.tar.bz2=4f5ab89e550cbd446c4457b5ba7c17d0
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.12/x86_64/ruby-2.0.0-p576.tar.bz2=343d32583855b6adf7d8fe393a2575cf
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.12/x86_64/ruby-2.0.0-p594.tar.bz2=6480351f5302c00b4a40a9ab5c9a3db3
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.12/x86_64/ruby-2.0.0-p598.tar.bz2=16da64f05aeca63c5e7c8fe90ebc64e0
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.12/x86_64/ruby-2.0.0-p643.tar.bz2=1937d9b31c9c3a67a8dff0831dd483b5
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.12/x86_64/ruby-2.0.0-p645.tar.bz2=a927b7b167805e7155b50d2c8d807f2b
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.12/x86_64/ruby-2.0.0-p647.tar.bz2=19db8641c96b80bfe516d81debafc9e7
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.12/x86_64/ruby-2.1.0.tar.bz2=841f405d073132b198cd526422d86dbd
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.12/x86_64/ruby-2.1.1.tar.bz2=b57951057dc2d129ca59ee1d03666059
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.12/x86_64/ruby-2.1.2.tar.bz2=2c846aa1fbd5910584f54d2655a1ed6f
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.12/x86_64/ruby-2.1.3.tar.bz2=2cf6d1dcff40ecff3242aca4fcccdaf9
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.12/x86_64/ruby-2.1.4.tar.bz2=c66e257248512feacb323e26089e5817
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.12/x86_64/ruby-2.1.5.tar.bz2=b3b007e8033da456f8a0ca84e210f4af
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.12/x86_64/ruby-2.1.6.tar.bz2=ec5da63a2e3ecc6123cdacedb20ac909
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.12/x86_64/ruby-2.1.7.tar.bz2=6c2558fcf9b874d2f7121f23117b85d4
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.12/x86_64/ruby-2.2.0.tar.bz2=1c975f87a30c4ad6b7bce00b38281946
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.12/x86_64/ruby-2.2.1.tar.bz2=fbf2a76172c2c93e5f480dbfb56bf538
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.12/x86_64/ruby-2.2.2.tar.bz2=aa129936fc65ee252a36df3022f4c3b1
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.12/x86_64/ruby-2.2.3.tar.bz2=82b261a8112fd009f3eb8619d8e3a472
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.12/x86_64/ruby-2.2.5.tar.bz2=7f2182fb1ef53b9ef78039338361b9c8
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/10.04/i386/ruby-1.9.3-p194.tar.bz2=bd2374de86a84fa8b909a0580e06b266
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/10.04/i386/ruby-1.9.3-p286.tar.bz2=401de19111fc06be4af42bdcba68e903
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/10.04/i386/ruby-1.9.3-p327.tar.bz2=c525c2cba0f87846f70d08bfd028314b
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/10.04/i386/ruby-1.9.3-p362.tar.bz2=dff3ab746554c295ae19f35aff05e98b
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/10.04/i386/ruby-1.9.3-p374.tar.bz2=50f7bfa2843c38379f4141c894cefa73
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/10.04/i386/ruby-1.9.3-p392.tar.bz2=e25403e598cf81afda9251cc5ea63e6f
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/10.04/i386/ruby-1.9.3-p429.tar.bz2=0b4728f3ffdaa6c4946bb000057d28b4
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/10.04/i386/ruby-1.9.3-p448.tar.bz2=dc2a7c85e427d9a089e3a429348f963f
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/10.04/i386/ruby-1.9.3-p484.tar.bz2=a82a49e755da8c9ca178a3268b10d866
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/10.04/i386/ruby-1.9.3-p545.tar.bz2=a9483a0606cfc094794e189f99f5e18f
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/10.04/i386/ruby-1.9.3-p547.tar.bz2=4407ae4d5597d4fd68fbc7a4d7cecaff
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/10.04/i386/ruby-1.9.3-p551.tar.bz2=f8b91bc9aa28c3e5954a902354d4fd8d
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/10.04/i386/ruby-2.0.0-p0.tar.bz2=e4d87439e6ee3ed028e578d1611bc962
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/10.04/i386/ruby-2.0.0-p195.tar.bz2=d5d60e81b6897397f470be65a2d4d303
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/10.04/i386/ruby-2.0.0-p247.tar.bz2=88893477e3fcdafc5e360a2f63eaeaf4
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/10.04/i386/ruby-2.0.0-p353.tar.bz2=8d18203816ec337958ebcdd575690490
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/10.04/i386/ruby-2.0.0-p451.tar.bz2=60cb4f248136e812dbec83144220c7a8
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/10.04/i386/ruby-2.0.0-p481.tar.bz2=006ddc759b1a404df96e4b4ff6160da8
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/10.04/i386/ruby-2.0.0-p576.tar.bz2=6b0ee517ec2e180339b84abfe0940193
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/10.04/i386/ruby-2.0.0-p598.tar.bz2=2ce0ce8d2e24324cce7726820c6ed04b
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/10.04/i386/ruby-2.1.0.tar.bz2=07606459c843efc4b23d6857c5863706
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/10.04/i386/ruby-2.1.1.tar.bz2=6fb07b7d85ca6d7eb1a775dd31961185
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/10.04/i386/ruby-2.1.2.tar.bz2=a0a00d79b0e030710a2f6275880abf9b
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/10.04/i386/ruby-2.1.3.tar.bz2=515240757133afb702d1e3c0176666a2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/10.04/i386/ruby-2.1.5.tar.bz2=0a80da44572581d650f48c2094d32f53
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/10.04/i386/ruby-2.2.0.tar.bz2=5d16163ace4769919c4f03bbff5809d3
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/10.04/i386/ruby-2.2.1.tar.bz2=f9a5d6d2faae2366a1413a05443b1942
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/10.04/x86_64/ruby-1.9.3-p194.tar.bz2=e6daf85653c842e14bca9248d5643535
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/10.04/x86_64/ruby-1.9.3-p286.tar.bz2=46aa957ed112ad3ea0c3dff1d9f413e9
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/10.04/x86_64/ruby-1.9.3-p327.tar.bz2=aaad5ffefe8ce22d4f499f4c8b15ed38
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/10.04/x86_64/ruby-1.9.3-p362.tar.bz2=7fe09d85a48438e1aab0458eadb8034b
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/10.04/x86_64/ruby-1.9.3-p374.tar.bz2=e8b5b366cb3ee907d471f113081bce4f
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/10.04/x86_64/ruby-1.9.3-p392.tar.bz2=2601d90fd98af5a0b7c293256cdf1432
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/10.04/x86_64/ruby-1.9.3-p429.tar.bz2=9393c5a7e330448f43f1a7de562ed2dc
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/10.04/x86_64/ruby-1.9.3-p448.tar.bz2=2e7e4438b898b33339c5aa628e2b7123
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/10.04/x86_64/ruby-1.9.3-p484.tar.bz2=dd0e1cf11e1181aac924bc3c99062281
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/10.04/x86_64/ruby-1.9.3-p545.tar.bz2=f4fad922e404e29abe277172b3504dd4
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/10.04/x86_64/ruby-1.9.3-p547.tar.bz2=16bb78fca5a7c9cdc7f3803bc123536d
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/10.04/x86_64/ruby-1.9.3-p551.tar.bz2=6f991d8a92004e994f0c2cc561aedaa6
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/10.04/x86_64/ruby-2.0.0-p0.tar.bz2=9aa98b22fae02028609b4e2527099429
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/10.04/x86_64/ruby-2.0.0-p195.tar.bz2=ba9a5af389513b7b27441a20981d77dc
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/10.04/x86_64/ruby-2.0.0-p247.tar.bz2=ea089d9b3b62706ef5bd4b50e077ea39
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/10.04/x86_64/ruby-2.0.0-p353.tar.bz2=59aceed534d3e9bca884801700efe225
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/10.04/x86_64/ruby-2.0.0-p451.tar.bz2=0d8a8cb38662783ce34649745eda2255
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/10.04/x86_64/ruby-2.0.0-p481.tar.bz2=5782d8a122a9f70381805deb68240995
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/10.04/x86_64/ruby-2.0.0-p576.tar.bz2=5acd3909c7691d635325b8357633bf4a
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/10.04/x86_64/ruby-2.0.0-p598.tar.bz2=efd4b998c3347f29c1ec87be130c7d92
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/10.04/x86_64/ruby-2.1.0.tar.bz2=66bf82c476c714567dfde77df4fd7fb6
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/10.04/x86_64/ruby-2.1.1.tar.bz2=1a10830366a9e8f7d5d491c9dba87990
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/10.04/x86_64/ruby-2.1.2.tar.bz2=b187b50731aca5f017963376a0aa4063
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/10.04/x86_64/ruby-2.1.3.tar.bz2=d2f760d4836f37e031e2f8681c1f7920
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/10.04/x86_64/ruby-2.1.5.tar.bz2=10a9aad5907d6e75c596deb05ac9b96a
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/10.04/x86_64/ruby-2.2.0.tar.bz2=389418d05c1d2d8137d9bdd33cabbc9d
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/10.04/x86_64/ruby-2.2.1.tar.bz2=80147d238433a3f3a5a849183c83c2e1
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/11.10/x86_64/ruby-1.9.3-p194.tar.bz2=43bf0907e9eb98c4eceecab8dd9f1344
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/11.10/x86_64/ruby-1.9.3-p286.tar.bz2=97af43b1396a01410d5f8a54cd7579ec
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/11.10/x86_64/ruby-1.9.3-p327.tar.bz2=e3e05138d1d3565cdc3b849fafc94583
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/11.10/x86_64/ruby-1.9.3-p362.tar.bz2=289e6701503c33fbcf26b45bb502ca12
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/11.10/x86_64/ruby-1.9.3-p374.tar.bz2=10d76b94881d02ee0922118645e0ab02
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/11.10/x86_64/ruby-1.9.3-p392.tar.bz2=8a5f826d2ab845e9e614016b7012170a
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/11.10/x86_64/ruby-2.0.0-p0.tar.bz2=51dd19149c13d483ccd6bafc36333ac1
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.04/i386/ruby-1.9.3-p194.tar.bz2=d3776996b7d4a623dd357d78d51eb2af
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.04/i386/ruby-1.9.3-p286.tar.bz2=100da166dc129ab3fd3313350599190a
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.04/i386/ruby-1.9.3-p327.tar.bz2=00186d2614a9225e52aec4d3089d67fe
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.04/i386/ruby-1.9.3-p362.tar.bz2=e30f14d63141e106e55608b089ee7dc4
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.04/i386/ruby-1.9.3-p374.tar.bz2=202a5d7d85f16d52e53da9bf3271c63a
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.04/i386/ruby-1.9.3-p392.tar.bz2=30554c4016d7396a17f223d0800fef01
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.04/i386/ruby-1.9.3-p429.tar.bz2=2d6d1afef853501ba881404275cb35a2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.04/i386/ruby-1.9.3-p448.tar.bz2=6a25f011129dfe34e49127eb43554d67
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.04/i386/ruby-1.9.3-p484.tar.bz2=eb6161b9524357795624e81ca51e29b0
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.04/i386/ruby-1.9.3-p545.tar.bz2=ce4a4550969617f14ae2316d8ba5ba0b
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.04/i386/ruby-1.9.3-p547.tar.bz2=6ccdd46dae4a56c4de05b29f95a5af6b
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.04/i386/ruby-1.9.3-p551.tar.bz2=630298b62ff63401d4abb14bf01a1a0c
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.04/i386/ruby-2.0.0-p0.tar.bz2=cd39c859b49751aa46971a705addb23f
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.04/i386/ruby-2.0.0-p195.tar.bz2=9de9d52b7a6b216f68b78b4a072d4a06
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.04/i386/ruby-2.0.0-p247.tar.bz2=44e3b9cbe9af8d2a7450ada1a1d3616d
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.04/i386/ruby-2.0.0-p353.tar.bz2=3e6d1db77b1a07be55fdcebe397c86f3
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.04/i386/ruby-2.0.0-p451.tar.bz2=f12c2050b09f115e144769f089a8a6cb
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.04/i386/ruby-2.0.0-p481.tar.bz2=80655dcddb5b5487dc30cf9be3b49aab
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.04/i386/ruby-2.0.0-p576.tar.bz2=44594b5bee637abe1a9b24faad294d35
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.04/i386/ruby-2.0.0-p598.tar.bz2=6b152f032b756fba70e18407eb4d0f0b
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.04/i386/ruby-2.1.0.tar.bz2=2c40d547c698c2a27098995040e72337
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.04/i386/ruby-2.1.1.tar.bz2=696b95e37c0f3ae26f50a68d55144fac
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.04/i386/ruby-2.1.2.tar.bz2=b1b734ca8f2c3f684bff25e006174938
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.04/i386/ruby-2.1.3.tar.bz2=66cfc896a3117dc5c27b32c3fdb83fcb
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.04/i386/ruby-2.1.5.tar.bz2=b67a1cb3f718fad3fbc46141e72be79c
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.04/i386/ruby-2.2.0.tar.bz2=2d33dd94378cfe149b6c6edadaae4a0c
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.04/i386/ruby-2.2.1.tar.bz2=0223ae5914af94c947dbe2d1c535caa1
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.04/x86_64/ruby-1.9.3-p194.tar.bz2=e3a0cdb8ab87e793155ada7d9d0c5bc0
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.04/x86_64/ruby-1.9.3-p286.tar.bz2=0ee6e14dfc79b74aaa192df3838ee700
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.04/x86_64/ruby-1.9.3-p327.tar.bz2=aeebd81005968d4b5807ef0ac25db0df
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.04/x86_64/ruby-1.9.3-p362.tar.bz2=83ed9201cb57e253e8b35d28f7b1949b
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.04/x86_64/ruby-1.9.3-p374.tar.bz2=22e1fa6f96118e2ad13f4f89d7fb6d5a
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.04/x86_64/ruby-1.9.3-p392.tar.bz2=045e43ec5e0073f6915624b965957109
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.04/x86_64/ruby-1.9.3-p429.tar.bz2=b52a81a4bb640d8127f48f3e89a40d70
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.04/x86_64/ruby-1.9.3-p448.tar.bz2=8fe402922f9088cb6f0a86365b8cf91e
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.04/x86_64/ruby-1.9.3-p484.tar.bz2=2d1cf81b6901ee0548ca4beefa4e3d2e
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.04/x86_64/ruby-1.9.3-p547.tar.bz2=4bad3281915673532f96a28ccd84fd75
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.04/x86_64/ruby-1.9.3-p551.tar.bz2=52a2afc7f43bea8b04a69f4d01bbd310
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.04/x86_64/ruby-2.0.0-p0.tar.bz2=3052147f8d5ba7f4d01db9a45c2185a4
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.04/x86_64/ruby-2.0.0-p195.tar.bz2=56ce2fbbfe30ec6055903195e39dcec4
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.04/x86_64/ruby-2.0.0-p247.tar.bz2=4709bc674f3727faa39118bab1eb6dbf
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.04/x86_64/ruby-2.0.0-p353.tar.bz2=d14338a893fcf89bb4a37d885a7507aa
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.04/x86_64/ruby-2.0.0-p481.tar.bz2=883d0f532ea82e04638020adfd0bcf59
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.04/x86_64/ruby-2.0.0-p576.tar.bz2=7ab773a83191bdfd8d9e957f8c911bbd
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.04/x86_64/ruby-2.0.0-p598.tar.bz2=e3647faad4d2b8a41855dfb35c05bd4f
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.04/x86_64/ruby-2.1.0.tar.bz2=da87c5d151db70dc50320ee5efa079f9
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.04/x86_64/ruby-2.1.2.tar.bz2=3338e780744829b9f3611f3ff2036dc3
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.04/x86_64/ruby-2.1.3.tar.bz2=261063ec081a2988d2029c48cffe0054
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.04/x86_64/ruby-2.1.5.tar.bz2=2d59afae0d85c6d14ae89423aff39754
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.04/x86_64/ruby-2.2.0.tar.bz2=ae7604b4608903b1dd7eddd4a5f49fed
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.04/x86_64/ruby-2.2.1.tar.bz2=a6d73861ffa3f1dd21501f0de4a17bc1
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.04/x86_64/ruby-2.4.0.tar.bz2=aaa94fc47d72c1c54b9046925728b4b6
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.04/x86_64/ruby-2.4.1.tar.bz2=5d4274218e870aed3e9cc01b523566e0
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.04/x86_64/ruby-2.4.2.tar.bz2=e94804e084db70d63b138936f5ad11af
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.04/x86_64/ruby-2.4.3.tar.bz2=ada2b1e371d5feee8e00bc5a5f419810
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.04/x86_64/ruby-2.4.4.tar.bz2=f675198c446c2b36829debb60e90d812
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.04/x86_64/ruby-2.4.5.tar.bz2=65525ee685b83ba8128e5cd9ed6e40d3
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.04/x86_64/ruby-2.4.6.tar.bz2=a24af24516642d09386bc907cccb8fa7
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.04/x86_64/ruby-2.4.7.tar.bz2=ebc796f1380785f0fd97ce73a6bae41a
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.04/x86_64/ruby-2.4.8.tar.bz2=dba02a096bd490be6f6dd3c920d43b9c
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.04/x86_64/ruby-2.4.9.tar.bz2=ec8ec7af4b3bf6a698c202bd83a56034
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.04/x86_64/ruby-2.4.10.tar.bz2=dd448afcaab707006ff19717f65cf951
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.04/x86_64/ruby-2.5.0.tar.bz2=1f9cbe880e61a695e3dae7dfb4c76de1
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.04/x86_64/ruby-2.5.1.tar.bz2=72d499a66c85ecd380276901212f02e5
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.04/x86_64/ruby-2.5.2.tar.bz2=c29ed227034a9c5bf7ce503d94b95050
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.04/x86_64/ruby-2.5.3.tar.bz2=2355e8c78c81efb15521b3047faa5f53
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.04/x86_64/ruby-2.5.4.tar.bz2=9f434bb9103a02dd33ff48d57c51ea76
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.04/x86_64/ruby-2.5.5.tar.bz2=a0cc16ee869e2707a82115c46f559c9e
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.04/x86_64/ruby-2.5.6.tar.bz2=04a4dacbda5d7970924fac7c490ebbb9
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.04/x86_64/ruby-2.5.7.tar.bz2=a3249d7e8250bc838814178b2fef53e5
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.04/x86_64/ruby-2.5.8.tar.bz2=bceed6c5598b1a6f0dd613612b00702c
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.04/x86_64/ruby-2.6.0.tar.bz2=8a5b2f90309e2f139180ff32d57607be
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.04/x86_64/ruby-2.6.1.tar.bz2=314efd94e8d9c3bb87c22a54d09310b5
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.04/x86_64/ruby-2.6.2.tar.bz2=8760b74ac9285b91d06de90411fa789c
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.04/x86_64/ruby-2.6.3.tar.bz2=fc74b2be87110ce914f94c8913a5e7ea
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.04/x86_64/ruby-2.6.4.tar.bz2=ba407f04e6b62b9a60e24ea54d81dadd
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.04/x86_64/ruby-2.6.5.tar.bz2=b19ccc4812bff55249d81867e1070599
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.04/x86_64/ruby-2.6.6.tar.bz2=3801b5aa44285be922943ff156bce721
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.04/x86_64/ruby-2.7.0.tar.bz2=c6d4429cddea4043e26c8224a6ec521b
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.04/x86_64/ruby-2.7.1.tar.bz2=cf3c72f440c6ec4b44590b6af102411b
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.10/x86_64/ruby-1.9.3-p194.tar.bz2=ab8d6c680db0ce0f2ada9870b2196a5a
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.10/x86_64/ruby-1.9.3-p286.tar.bz2=e3ec337c6185fd3349bac1a9c46f5880
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.10/x86_64/ruby-1.9.3-p327.tar.bz2=a38dde3ed805183ef2ac19be001cd848
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.10/x86_64/ruby-1.9.3-p362.tar.bz2=0d68fe34b17ff947cda407f09956cd62
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.10/x86_64/ruby-1.9.3-p374.tar.bz2=8345d70129f7561aaa1b3c3bdef9c74e
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.10/x86_64/ruby-1.9.3-p392.tar.bz2=7a03015e1c24c5759770f350d3fb0904
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.10/x86_64/ruby-1.9.3-p429.tar.bz2=255edb8771c8c74c64fadb1d17acbec8
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.10/x86_64/ruby-1.9.3-p448.tar.bz2=0147a15c8d7bf61d9f9fe7008f18411e
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.10/x86_64/ruby-1.9.3-p484.tar.bz2=0512ff786375aa27553588df09b0d02e
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.10/x86_64/ruby-1.9.3-p545.tar.bz2=79e192cc5267dd8af866e3bd212610db
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.10/x86_64/ruby-1.9.3-p547.tar.bz2=6ada5d311c22b254b1b6cc5b19f84c0d
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.10/x86_64/ruby-1.9.3-p551.tar.bz2=7f03236a1b2dee336f19460a7b5bd33a
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.10/x86_64/ruby-2.0.0-p0.tar.bz2=a995b01e364830d29295bc90bdbdcdc1
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.10/x86_64/ruby-2.0.0-p195.tar.bz2=de62ea6bdb887ce3008c7ea415aaaf00
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.10/x86_64/ruby-2.0.0-p247.tar.bz2=2603e7a4031ee65cfc0e633745800ec6
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.10/x86_64/ruby-2.0.0-p353.tar.bz2=171057bfa8d0dfd71afae447ef0cc49e
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.10/x86_64/ruby-2.0.0-p451.tar.bz2=f9e49323f9ed628be382c7a51b1eddd0
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.10/x86_64/ruby-2.0.0-p481.tar.bz2=1e60ed9bf20120aaf532c8d7b7814571
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.10/x86_64/ruby-2.0.0-p576.tar.bz2=616469de30be2f720487322eb09a971e
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.10/x86_64/ruby-2.0.0-p598.tar.bz2=4ed3643a9cd09769915659e5fd4b1acc
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.10/x86_64/ruby-2.1.0.tar.bz2=0c5023fc9aa305674ea0f91266a4211c
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.10/x86_64/ruby-2.1.1.tar.bz2=c4e7f2109ad57245610eec81d743b12b
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.10/x86_64/ruby-2.1.2.tar.bz2=3a9da31b18ff3c9859472e0cd66e12bf
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.10/x86_64/ruby-2.1.3.tar.bz2=d8208fae2b601a6f4fda72570a29e6f7
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.10/x86_64/ruby-2.1.5.tar.bz2=0d9f44a6a8dc183b2e0dabdb240146fe
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/13.04/i386/ruby-1.9.3-p429.tar.bz2=8d65645f849e88a3006145833fc25731
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/13.04/i386/ruby-1.9.3-p448.tar.bz2=a9f36dc07f76f88087c247e67d6a6235
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/13.04/i386/ruby-1.9.3-p484.tar.bz2=5053cf455065ff782a6b980bf51dc260
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/13.04/i386/ruby-1.9.3-p545.tar.bz2=2815c3877e548708c5a6eef489cd1a58
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/13.04/i386/ruby-1.9.3-p547.tar.bz2=0a3f6e22564572dae2c0702a031d0e62
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/13.04/i386/ruby-1.9.3-p551.tar.bz2=523a355c5dabca4e1da3a9214d8fc362
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/13.04/i386/ruby-2.0.0-p195.tar.bz2=9b285d301b57bd25d0a50158f7224060
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/13.04/i386/ruby-2.0.0-p247.tar.bz2=b34d2e404c6d538175608a2157d1f887
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/13.04/i386/ruby-2.0.0-p353.tar.bz2=1497089586295d8248747265bda1c0da
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/13.04/i386/ruby-2.0.0-p451.tar.bz2=11d8ac804910ef1ce22df7e9c3e520d8
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/13.04/i386/ruby-2.0.0-p481.tar.bz2=cd65b2d2572f840faf8a0a7566971bf7
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/13.04/i386/ruby-2.0.0-p576.tar.bz2=d6e01f74df250eb00369572a4defcd84
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/13.04/i386/ruby-2.0.0-p598.tar.bz2=1760a7f15f9ff4798e9e3fcb8c36df0b
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/13.04/i386/ruby-2.1.0.tar.bz2=dadd8a67df896dbf60d381fbdd91668a
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/13.04/i386/ruby-2.1.1.tar.bz2=a56114214ea7e16d9c6a9e94f6626b18
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/13.04/i386/ruby-2.1.2.tar.bz2=00eec727677a938eae7dfff7fc27ab4f
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/13.04/i386/ruby-2.1.3.tar.bz2=7d3bf7e450ea9cecc3f30d462de006af
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/13.04/i386/ruby-2.1.5.tar.bz2=363f51ede3df57798a00d6ecf2e91788
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/13.04/x86_64/ruby-1.9.3-p392.tar.bz2=1da1cdf0ad7132dccc419ee5e6417817
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/13.04/x86_64/ruby-1.9.3-p429.tar.bz2=941927833d92edbe336f153c55e69908
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/13.04/x86_64/ruby-1.9.3-p448.tar.bz2=a5eb5d163a7e8a96c7f9878b3a2dfdc2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/13.04/x86_64/ruby-1.9.3-p484.tar.bz2=13126e2844d7564c39c598c24cca130f
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/13.04/x86_64/ruby-1.9.3-p545.tar.bz2=a4432d689d283bd1778f75a0756372e6
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/13.04/x86_64/ruby-1.9.3-p547.tar.bz2=cce83f1950ce786687bec0b5979d5ed6
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/13.04/x86_64/ruby-1.9.3-p551.tar.bz2=4b882815c1a1cc543bd1a5d7bcca48e7
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/13.04/x86_64/ruby-2.0.0-p0.tar.bz2=a67083d106c1c9826f367861ee45aed0
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/13.04/x86_64/ruby-2.0.0-p195.tar.bz2=f4af51b60144b62264fb3e3018c4f62b
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/13.04/x86_64/ruby-2.0.0-p247.tar.bz2=2197c5407cc6ec7d6c21d52ef31bfcc0
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/13.04/x86_64/ruby-2.0.0-p353.tar.bz2=6b7a37fd2c5cc9b2ce603f1013afd71c
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/13.04/x86_64/ruby-2.0.0-p451.tar.bz2=06062291c2b1bf865bdc5a0ca1ea0918
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/13.04/x86_64/ruby-2.0.0-p481.tar.bz2=547f74419caf61a87b9a44a99ab8d6e1
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/13.04/x86_64/ruby-2.0.0-p576.tar.bz2=d266d565b94d73e83c9ef92bba2d133f
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/13.04/x86_64/ruby-2.0.0-p598.tar.bz2=885b8f8687942e820e76bf83ddfc377d
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/13.04/x86_64/ruby-2.1.0.tar.bz2=47e921af0c6b5657ea53a079763c2710
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/13.04/x86_64/ruby-2.1.1.tar.bz2=53a6908399733d73094ba6e3b17208bd
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/13.04/x86_64/ruby-2.1.2.tar.bz2=dae0be6976122b5b9597982ef9dfc2dc
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/13.04/x86_64/ruby-2.1.3.tar.bz2=66846633346bedadc98bfc7b9ee03b59
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/13.04/x86_64/ruby-2.1.5.tar.bz2=32dc49aef048175a1122e7af9d7b948e
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/13.10/x86_64/ruby-1.9.3-p547.tar.bz2=c09e0e1dad6fa3f7f06898d8e2ed3be5
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/13.10/x86_64/ruby-1.9.3-p551.tar.bz2=2389decc618897cf35f18b1d615ae03f
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/13.10/x86_64/ruby-2.0.0-p481.tar.bz2=1f7d8d7f685de746796edb2fb0f3aab0
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/13.10/x86_64/ruby-2.0.0-p576.tar.bz2=c571d3a13097be2e9b8645f226ddf7e5
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/13.10/x86_64/ruby-2.0.0-p598.tar.bz2=c8f42be8f586fead4b043f6050787879
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/13.10/x86_64/ruby-2.1.2.tar.bz2=995cdfd48a25d21ee8a9404a2c0bf3e4
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/13.10/x86_64/ruby-2.1.3.tar.bz2=56e18a9acc542acf8d39dbb613058fbc
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/13.10/x86_64/ruby-2.1.5.tar.bz2=42534aadb3d31881811f01419b578e8a
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/14.04/x86_64/ruby-1.9.3-p547.tar.bz2=b28057020cffb885bfce0115d48838be
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/14.04/x86_64/ruby-1.9.3-p551.tar.bz2=ef7f2cfb521530bf6e9f391d810cab19
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/14.04/x86_64/ruby-2.0.0-p481.tar.bz2=2e372d47c91e9316e0cb20bdd0382f1a
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/14.04/x86_64/ruby-2.0.0-p576.tar.bz2=0ee8d92f9e2c5d7f110f39ce7b982cbd
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/14.04/x86_64/ruby-2.0.0-p598.tar.bz2=bd1aa419ebd57b9fd364ac79dce29191
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/14.04/x86_64/ruby-2.1.0.tar.bz2=9373fa00348bb903002e999367ce4428
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/14.04/x86_64/ruby-2.1.1.tar.bz2=41c4dfd54aaf4db22e6ab2e54cd75697
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/14.04/x86_64/ruby-2.1.2.tar.bz2=bf1798366e1864661b9b53e72f554151
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/14.04/x86_64/ruby-2.1.3.tar.bz2=53ee3a800f99e4c8011f3544a70f67df
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/14.04/x86_64/ruby-2.1.4.tar.bz2=73aedf3fa542445977eafe8ba1c77790
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/14.04/x86_64/ruby-2.1.5.tar.bz2=1a201d082586036092cfc5b79dd26718
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/14.04/x86_64/ruby-2.1.6.tar.bz2=5913a2f52e493fa780669ee84ac3f0ac
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/14.04/x86_64/ruby-2.1.7.tar.bz2=2a6959f54de6a77c68d70a469c5ac8bc
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/14.04/x86_64/ruby-2.1.8.tar.bz2=1773b9b59bd3062e09f5d1ffd7646bed
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/14.04/x86_64/ruby-2.1.9.tar.bz2=de1a366480c14b83631a6d0ee862f801
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/14.04/x86_64/ruby-2.1.10.tar.bz2=97b3b8804949a303f9ad0b453b8c9280
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/14.04/x86_64/ruby-2.2.0.tar.bz2=5237363d121d99da78c15a78a49272f7
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/14.04/x86_64/ruby-2.2.1.tar.bz2=99e6387fc425d0db01b276e60ee23d27
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/14.04/x86_64/ruby-2.2.2.tar.bz2=cd15a1bf39cffae501b524ba34ad75a7
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/14.04/x86_64/ruby-2.2.3.tar.bz2=0801cb6f00448b09e0ee725f087fa233
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/14.04/x86_64/ruby-2.2.4.tar.bz2=05932ee063c5e3e10c9e599624b89ef2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/14.04/x86_64/ruby-2.2.5.tar.bz2=bd4e6ba1b8f878cc3cb39c98ef6ca73e
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/14.04/x86_64/ruby-2.2.6.tar.bz2=53d594a8ac844ef8e386ddb7150bbf3b
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/14.04/x86_64/ruby-2.2.7.tar.bz2=11ba717ec231adf265626a9ba02106e6
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/14.04/x86_64/ruby-2.2.8.tar.bz2=08afbb32bc6838ab6668d8cbc734db33
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/14.04/x86_64/ruby-2.2.9.tar.bz2=0a019a99ac09b17a2e36ecb511b67ed4
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/14.04/x86_64/ruby-2.2.10.tar.bz2=b7494e51fc7eacb81038f95abfa56b8e
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/14.04/x86_64/ruby-2.3.0.tar.bz2=d14ec8e205b77bb06cefd26b1b47e8f1
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/14.04/x86_64/ruby-2.3.1.tar.bz2=00ce2390c2f3aac14caa817afe1773c0
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/14.04/x86_64/ruby-2.3.2.tar.bz2=da0f72cb39d8a72b72d8729c54ca8331
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/14.04/x86_64/ruby-2.3.3.tar.bz2=8596cc4c6f65c45c8ed97249486f6753
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/14.04/x86_64/ruby-2.3.4.tar.bz2=15fe89e253cbe2b48eb78f0bbe1c0a46
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/14.04/x86_64/ruby-2.3.5.tar.bz2=6df2795ad9c30bd7cd6c3bf18e81ec01
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/14.04/x86_64/ruby-2.3.6.tar.bz2=25c91754d206b82c1d444f18c620325c
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/14.04/x86_64/ruby-2.3.7.tar.bz2=5a53a6c85cf9b536cbd2226a839cc48b
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/14.04/x86_64/ruby-2.3.8.tar.bz2=53fef1ef2d3080e3f7a7be05c62e7f51
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/14.04/x86_64/ruby-2.4.0.tar.bz2=b54079037b377d9d2839476a30bafa74
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/14.04/x86_64/ruby-2.4.1.tar.bz2=9ea2f049fc14047e20f09aa17f0fe24e
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/14.04/x86_64/ruby-2.4.2.tar.bz2=8767e88cd1717e2efc4a7bdaa2036b1b
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/14.04/x86_64/ruby-2.4.3.tar.bz2=2b0f8db27e92ad09eec268603a687422
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/14.04/x86_64/ruby-2.4.4.tar.bz2=4b838e0872d6f69a73134df8dd29e9f4
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/14.04/x86_64/ruby-2.4.5.tar.bz2=6e179e274abe2976a07e4f3b3ecb736c
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/14.04/x86_64/ruby-2.4.6.tar.bz2=7d8c651b1be386f163d7f6ffb9e46152
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/14.04/x86_64/ruby-2.4.7.tar.bz2=9be6f845ff36dab622b28cec04499315
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/14.04/x86_64/ruby-2.4.8.tar.bz2=8b81068cd52f213efa1119ef58bef84f
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/14.04/x86_64/ruby-2.4.9.tar.bz2=883214fe300335b8a4166ceab2e5d9d2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/14.04/x86_64/ruby-2.4.10.tar.bz2=89d66460782d81dae90dc1679d95f563
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/14.04/x86_64/ruby-2.5.0.tar.bz2=ec34c626b2b8096fae34b09eaab73dfe
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/14.04/x86_64/ruby-2.5.1.tar.bz2=39e849b9a1384d2bcb7bfdbd74d7aef0
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/14.04/x86_64/ruby-2.5.2.tar.bz2=b31e3dbe733b16becd94f3cdcd3b7a06
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/14.04/x86_64/ruby-2.5.3.tar.bz2=b68b7f7eab3c1939030e1e261f6b1bf9
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/14.04/x86_64/ruby-2.5.4.tar.bz2=c745018aa209787f22dd1c334ed11fc3
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/14.04/x86_64/ruby-2.5.5.tar.bz2=b30036e2925eb4c328fc589a0f2225bc
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/14.04/x86_64/ruby-2.5.6.tar.bz2=f4016383f1dccb966844c42f09ec7999
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/14.04/x86_64/ruby-2.5.7.tar.bz2=e7e2b53f0957b9269e556121a86740dc
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/14.04/x86_64/ruby-2.5.8.tar.bz2=b77eacd12e0079e6abbf4c0060147c40
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/14.04/x86_64/ruby-2.6.0.tar.bz2=3568bc0a7409da46e35360849a46c649
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/14.04/x86_64/ruby-2.6.1.tar.bz2=e02858014b999e1418d7b868b7397b24
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/14.04/x86_64/ruby-2.6.2.tar.bz2=b4949884c04570219ae4d020a24332ea
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/14.04/x86_64/ruby-2.6.3.tar.bz2=9372a20220bb50d91685372e2fd424ef
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/14.04/x86_64/ruby-2.6.4.tar.bz2=911c07ee9fba6d82445bf812dcedee84
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/14.04/x86_64/ruby-2.6.5.tar.bz2=127b8efeeef2b793932814d6599cfa4e
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/14.04/x86_64/ruby-2.6.6.tar.bz2=93efb782a5126fd9f9b3cdf408203c69
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/14.04/x86_64/ruby-2.7.0.tar.bz2=bfd780adf595bae1b62a3d1bb4509673
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/14.04/x86_64/ruby-2.7.1.tar.bz2=2aca144193ecdad128c588bb3ec50ca2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/14.04/x86_64/ruby-2.7.2.tar.bz2=b28af0400378c66a257ab7e2bdc45722
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/14.04/x86_64/ruby-3.0.0-preview1.tar.bz2=79aa27d2147989874a01c1093695a805
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/14.10/x86_64/ruby-1.9.3-p551.tar.bz2=89eb6e2329dcc59375570836a41fb26d
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/14.10/x86_64/ruby-2.0.0-p598.tar.bz2=9f33e9eb6b8f8c30515ccd17394d4300
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/14.10/x86_64/ruby-2.1.5.tar.bz2=57bd1de4797ef8c4b151622a47a10e4a
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/14.10/x86_64/ruby-2.2.0.tar.bz2=e68c9d66cf6309e05056b8e381a9f05c
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/14.10/x86_64/ruby-2.2.1.tar.bz2=30ddde33731e10c38e4857384edca8f2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/16.04/x86_64/ruby-2.0.0-p648.tar.bz2=7c1d6de9b87613abcb9e21fff871352c
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/16.04/x86_64/ruby-2.1.0.tar.bz2=9379ac4dfde8087ddf0cdb5015274e6b
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/16.04/x86_64/ruby-2.1.1.tar.bz2=f565fc095825c45b5a19abfff5609d56
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/16.04/x86_64/ruby-2.1.2.tar.bz2=52fbd7251723038c6570db27d0c56afe
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/16.04/x86_64/ruby-2.1.3.tar.bz2=22cbde066f7c8686837d4e4e214bf4df
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/16.04/x86_64/ruby-2.1.4.tar.bz2=e0ff2e068b376f0db37355954b91468c
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/16.04/x86_64/ruby-2.1.5.tar.bz2=f470ce5b7bce1230a3e35707cc88a473
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/16.04/x86_64/ruby-2.1.6.tar.bz2=859a3b3be3c8de1d23f932429156e601
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/16.04/x86_64/ruby-2.1.7.tar.bz2=c651673627f75bf6a6f3483a9ac59a2c
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/16.04/x86_64/ruby-2.1.8.tar.bz2=b00c812b5279ca119af5967818fc1d49
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/16.04/x86_64/ruby-2.1.9.tar.bz2=2b0cbe2199557e5cd8dc66252fac0d98
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/16.04/x86_64/ruby-2.1.10.tar.bz2=d8efc048e1a66f6445b1a6607c7a63bc
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/16.04/x86_64/ruby-2.2.0.tar.bz2=9e2d569d47f8f3840c347a802b271608
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/16.04/x86_64/ruby-2.2.1.tar.bz2=6b1c6ee4fc726505ad22c0b16404e92c
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/16.04/x86_64/ruby-2.2.2.tar.bz2=5947b564dc3be93113388640747a9e10
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/16.04/x86_64/ruby-2.2.3.tar.bz2=70807938a120b1bc5265d4426543cccd
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/16.04/x86_64/ruby-2.2.4.tar.bz2=d63b41c1072e2dcd97e621a33139e4e2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/16.04/x86_64/ruby-2.2.5.tar.bz2=c2ff70014815b5840f3de53706e37d18
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/16.04/x86_64/ruby-2.2.6.tar.bz2=5884019c484888c2455fef33b300f80c
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/16.04/x86_64/ruby-2.2.7.tar.bz2=abefdec3485bbfff4a4a985c85bf2315
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/16.04/x86_64/ruby-2.2.8.tar.bz2=a2055f46518bd435bd032c359a5bf76c
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/16.04/x86_64/ruby-2.2.9.tar.bz2=8cdc440be6efa45a1cc14d472823bf0f
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/16.04/x86_64/ruby-2.2.10.tar.bz2=8a3e5b9770a09cc510a9671bd88b5140
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/16.04/x86_64/ruby-2.3.0.tar.bz2=928f951e46c85c533fd5f1f6e1210a2f
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/16.04/x86_64/ruby-2.3.1.tar.bz2=0a10f47d0182ca8e3df4fa7017255308
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/16.04/x86_64/ruby-2.3.2.tar.bz2=37e2d33082d944488d8ac1ca03c652b5
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/16.04/x86_64/ruby-2.3.3.tar.bz2=74478a06e4b9ed90475a42c36edd5981
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/16.04/x86_64/ruby-2.3.4.tar.bz2=2b84069dd5b686c81ae01ed721112dd3
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/16.04/x86_64/ruby-2.3.5.tar.bz2=302b062bfc5bc5b7a2df7aabe9cd115b
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/16.04/x86_64/ruby-2.3.6.tar.bz2=4ad3902f1217e3852b32444d9a7d9791
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/16.04/x86_64/ruby-2.3.7.tar.bz2=bcd9744eb90731ce1e99a0484889fb69
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/16.04/x86_64/ruby-2.3.8.tar.bz2=555936c18248c1e868e3bcc277412ba7
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/16.04/x86_64/ruby-2.4.0.tar.bz2=08d064ed710c18bd7dedb11580bb183d
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/16.04/x86_64/ruby-2.4.1.tar.bz2=1e95a7cc99b0b4594c33a2e21780a245
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/16.04/x86_64/ruby-2.4.2.tar.bz2=8da9501c6c99a0e996c5a0387c4a83f7
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/16.04/x86_64/ruby-2.4.3.tar.bz2=9fd63c6e1a4bece21e9de2a54dcb4801
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/16.04/x86_64/ruby-2.4.4.tar.bz2=02802a4834754cd568eb926d5c3b031f
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/16.04/x86_64/ruby-2.4.5.tar.bz2=0adf349d1f27c6dca18fc6e7f084d67f
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/16.04/x86_64/ruby-2.4.6.tar.bz2=c99bd914ebe870720e7b1fb313fde7a1
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/16.04/x86_64/ruby-2.4.7.tar.bz2=f805b9218307befe03217e72f2565722
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/16.04/x86_64/ruby-2.4.8.tar.bz2=de70a4c002f7254ebf50487c0cfdb8cf
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/16.04/x86_64/ruby-2.4.9.tar.bz2=37ce24ce666973d68b6bd47b2a25100a
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/16.04/x86_64/ruby-2.4.10.tar.bz2=01b03f0c5622c7485cdde96909f38eaa
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/16.04/x86_64/ruby-2.5.0.tar.bz2=7cf5ea980164942d4a812cc67445de26
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/16.04/x86_64/ruby-2.5.1.tar.bz2=bc3e80da0f3d787bd3fe2021bf00e5bc
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/16.04/x86_64/ruby-2.5.2.tar.bz2=c0ed3864a5200b3539117309538ca63a
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/16.04/x86_64/ruby-2.5.3.tar.bz2=3402a99f0c296286d992a5d2328f54b4
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/16.04/x86_64/ruby-2.5.4.tar.bz2=c7bcd6882092c06751a76c0b83b95ad0
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/16.04/x86_64/ruby-2.5.5.tar.bz2=d2073ac18fdbc2cae34bded0585eee61
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/16.04/x86_64/ruby-2.5.6.tar.bz2=39b093d15110f5ddd5b209efa662df1f
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/16.04/x86_64/ruby-2.5.7.tar.bz2=dd63a20fe164ea6bda55023dcbe26d67
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/16.04/x86_64/ruby-2.5.8.tar.bz2=0345e3acd59b68b60284773c1da854cc
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/16.04/x86_64/ruby-2.6.0.tar.bz2=27a556b2b6c2b654aa47ba4122432e40
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/16.04/x86_64/ruby-2.6.1.tar.bz2=18b35b2b398ed626b0630ad2964414ce
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/16.04/x86_64/ruby-2.6.2.tar.bz2=b8d254c0ca20c5eba8b05748f63cc5f3
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/16.04/x86_64/ruby-2.6.3.tar.bz2=3ae1bf399e74ef1360990260c1137018
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/16.04/x86_64/ruby-2.6.4.tar.bz2=b50fce574b7e84859b87f323053d4b1f
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/16.04/x86_64/ruby-2.6.5.tar.bz2=f5e3b90ee7fc3a622b0077a0b581e057
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/16.04/x86_64/ruby-2.6.6.tar.bz2=dc58b8ee61b3f42047c6006f2688169f
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/16.04/x86_64/ruby-2.7.0.tar.bz2=bccd28da6673bff560d6c4f04471b791
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/16.04/x86_64/ruby-2.7.1.tar.bz2=34f47de95284ad5b14f8faf22247e4c7
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/16.04/x86_64/ruby-2.7.2.tar.bz2=554222ac3cd1788afaf5029e01b7cfcb
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/16.04/x86_64/ruby-3.0.0-preview1.tar.bz2=e6aef74993bfa500c421fae1034dd3b6
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/16.10/x86_64/ruby-1.9.3-p551.tar.bz2=a04478dbac501036026226018b865129
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/16.10/x86_64/ruby-2.0.0-p648.tar.bz2=3987aa6e901a5982c30403cfafee4908
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/16.10/x86_64/ruby-2.1.5.tar.bz2=d6c1d353c2840e17e22c366e52ddd851
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/16.10/x86_64/ruby-2.1.6.tar.bz2=c214782a854195f2ce63e9d2cf8d2db3
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/16.10/x86_64/ruby-2.1.8.tar.bz2=a36f2ec355c1582053c20d625823c2f9
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/16.10/x86_64/ruby-2.1.9.tar.bz2=79aa449287c003f7eb06330af1e1ff1e
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/16.10/x86_64/ruby-2.2.4.tar.bz2=f21e382f2f788e2480fbdeffad1ccc8e
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/16.10/x86_64/ruby-2.2.5.tar.bz2=93eb667e54ea4e2f2370e472938bc1f2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/16.10/x86_64/ruby-2.2.6.tar.bz2=601f626af6decfa9ad4bdbd6b9156b1f
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/16.10/x86_64/ruby-2.3.0.tar.bz2=26daead0deb97bb7c1ed98edee068353
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/16.10/x86_64/ruby-2.3.1.tar.bz2=2d3cff6fe5978189fc73c0157f602c61
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/16.10/x86_64/ruby-2.3.2.tar.bz2=7573676a86bece578b1177f27dfaa3d5
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/16.10/x86_64/ruby-2.3.3.tar.bz2=5888df148ae5de71ed90ecda158d9ad1
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/17.04/x86_64/ruby-2.1.6.tar.bz2=4367fa1ac264de76dbfe2120d3a9b559
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/17.04/x86_64/ruby-2.1.7.tar.bz2=bfee08462a0a40d63d2625cadab4bc7d
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/17.04/x86_64/ruby-2.1.8.tar.bz2=a33e2b25f14c3f19af293c30ba9b7b6c
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/17.04/x86_64/ruby-2.1.9.tar.bz2=cb6dd6bffb68fb8637e3f2059ad1feb0
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/17.04/x86_64/ruby-2.1.10.tar.bz2=9c7b500f42c67177e220522fcb9d9101
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/17.04/x86_64/ruby-2.2.0.tar.bz2=8665e0e4d4bba33a93b193665c14e945
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/17.04/x86_64/ruby-2.2.1.tar.bz2=2afb54e3ab2443b530725439a7fd7990
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/17.04/x86_64/ruby-2.2.2.tar.bz2=f74a2cd4dc0f48fa46292eb58411d1a9
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/17.04/x86_64/ruby-2.2.3.tar.bz2=62fa590c9e1d216b98e10a56146101e5
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/17.04/x86_64/ruby-2.2.4.tar.bz2=85c92fe9bed193b139cba0f30177a8bf
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/17.04/x86_64/ruby-2.2.5.tar.bz2=25af07701faa1ec0e31812cad9933456
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/17.04/x86_64/ruby-2.2.6.tar.bz2=f087dee968efb4c56bb7c2c95b9ef3b0
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/17.04/x86_64/ruby-2.2.7.tar.bz2=506ef95ba154a3ff2de08fcf2bce10c3
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/17.04/x86_64/ruby-2.2.8.tar.bz2=d71b1c7c08347c1f07f2701e6bfb4681
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/17.04/x86_64/ruby-2.3.0.tar.bz2=3a530cb1fcae2380856635ad49ed4091
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/17.04/x86_64/ruby-2.3.1.tar.bz2=ca08a9eb33548c50e610e3574cabc202
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/17.04/x86_64/ruby-2.3.3.tar.bz2=5cf80d6af8aad67a04d421d5cc95ea10
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/17.04/x86_64/ruby-2.3.4.tar.bz2=b5446e14e22a1e033e6dd471b28d53fa
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/17.04/x86_64/ruby-2.3.5.tar.bz2=0cb7d0e08e7c147b462c7444cf9c7f17
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/17.04/x86_64/ruby-2.4.0.tar.bz2=cbacb4f1d0748888b52890f9ea7b97e9
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/17.04/x86_64/ruby-2.4.1.tar.bz2=95ec227eb51178795ac7722aa3bd724b
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/17.04/x86_64/ruby-2.4.2.tar.bz2=d13c87567cfdc20058af94e67144041f
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/18.04/x86_64/ruby-2.1.0.tar.bz2=c390bf206d64f77766c8c3abec24c2a7
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/18.04/x86_64/ruby-2.1.1.tar.bz2=91773baeedf04c1854d881093e532b88
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/18.04/x86_64/ruby-2.1.2.tar.bz2=f160d406ea31847df50939c24d1d8b07
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/18.04/x86_64/ruby-2.1.3.tar.bz2=4f6eda7e9c8990385a5a809b0b405b0f
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/18.04/x86_64/ruby-2.1.4.tar.bz2=be006111958a9e1e603f43299b202979
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/18.04/x86_64/ruby-2.1.5.tar.bz2=94742ba211dd35c1ce39d05bfc78a514
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/18.04/x86_64/ruby-2.1.6.tar.bz2=a4c52c07a6e74cfa069ada9e33752809
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/18.04/x86_64/ruby-2.1.7.tar.bz2=e8bbd5a47b7eecf74cbcd856789f8ea1
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/18.04/x86_64/ruby-2.1.8.tar.bz2=70a3bb472c1d61a83b380c1a9e419577
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/18.04/x86_64/ruby-2.1.9.tar.bz2=d4c1a5094b7b21bd925caaf72b4c5a20
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/18.04/x86_64/ruby-2.1.10.tar.bz2=06e57a3b96868df25b013dc0dc02ca69
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/18.04/x86_64/ruby-2.2.0.tar.bz2=9a1c1a66f206bb94c6c5ac20ec0a40c0
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/18.04/x86_64/ruby-2.2.1.tar.bz2=98b7a28f649dd24e0f5d0c10c81793a5
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/18.04/x86_64/ruby-2.2.2.tar.bz2=aadb63b8af901625e4951028c80fd92a
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/18.04/x86_64/ruby-2.2.3.tar.bz2=e0264280dd1424d7ecb51e1fda74c11e
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/18.04/x86_64/ruby-2.2.4.tar.bz2=69427baf1549e96663ba69669c991635
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/18.04/x86_64/ruby-2.2.5.tar.bz2=f8bb5e6320461b3fcdb9613aba79d4ac
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/18.04/x86_64/ruby-2.2.6.tar.bz2=f776e97df883393611ab668768b56613
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/18.04/x86_64/ruby-2.2.7.tar.bz2=8c37359c6fb6488786d495aa8123af4d
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/18.04/x86_64/ruby-2.2.8.tar.bz2=be14f201cfdfcb9135d0feeba62a9ac4
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/18.04/x86_64/ruby-2.2.9.tar.bz2=d5537150dc223a3f7776538b01e3c8f6
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/18.04/x86_64/ruby-2.2.10.tar.bz2=bfbd365a2c1bda2ec7c48cf3bbf7aabf
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/18.04/x86_64/ruby-2.3.0.tar.bz2=5b92868017c06f4be8c0e4245417a0ad
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/18.04/x86_64/ruby-2.3.1.tar.bz2=35b5b77a67fa42fbc3aea18029f1c7a0
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/18.04/x86_64/ruby-2.3.2.tar.bz2=712ac0bdc835bacc156c33af87ca2c96
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/18.04/x86_64/ruby-2.3.3.tar.bz2=c492161ced6bed6762c3d4167451f1c3
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/18.04/x86_64/ruby-2.3.4.tar.bz2=1f7f9496307b6c1e5d67b1ddec83ea78
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/18.04/x86_64/ruby-2.3.5.tar.bz2=436c38c4d3b246bc682f7c3921eeb5be
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/18.04/x86_64/ruby-2.3.6.tar.bz2=055ca864df4cda28e7b8b3cc6a06a492
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/18.04/x86_64/ruby-2.3.7.tar.bz2=78cf3caecf5ed03331c8b1cbafbf1eb2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/18.04/x86_64/ruby-2.3.8.tar.bz2=eb54a7f98a5a7c1cf5dfe815271abb1e
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/18.04/x86_64/ruby-2.4.0.tar.bz2=9883c6747cb96321f26f9dc33ff3bd97
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/18.04/x86_64/ruby-2.4.1.tar.bz2=846fd328f6167b8c08c9796e54a6d18a
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/18.04/x86_64/ruby-2.4.2.tar.bz2=6fe31603873e045df6cee5e2abc9af3f
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/18.04/x86_64/ruby-2.4.3.tar.bz2=c121e93b827d9b9fce59e6ca536c315d
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/18.04/x86_64/ruby-2.4.4.tar.bz2=894765a817a52fd4d4334ca7af9513e3
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/18.04/x86_64/ruby-2.4.5.tar.bz2=32fd57846b1041e522af49e613437168
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/18.04/x86_64/ruby-2.4.6.tar.bz2=389cebcb7f816e9fcdd612e1364c6da2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/18.04/x86_64/ruby-2.4.7.tar.bz2=b7bfb61cc723a5051951d96bda3304b7
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/18.04/x86_64/ruby-2.4.8.tar.bz2=89e46d414d7eccc5cc6863da90a999fb
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/18.04/x86_64/ruby-2.4.9.tar.bz2=a2d22f0e8c88878d48ab8ce4dd082e81
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/18.04/x86_64/ruby-2.4.10.tar.bz2=c62b3457b2162e0ebc85e4b7f3941949
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/18.04/x86_64/ruby-2.5.0.tar.bz2=6975c90f7d27a3b7dae181400409fcde
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/18.04/x86_64/ruby-2.5.1.tar.bz2=70f37aa2d14341e6e9af7b8d1b9c4936
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/18.04/x86_64/ruby-2.5.2.tar.bz2=8f56be7a98c12dda9cf920878b3c6c21
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/18.04/x86_64/ruby-2.5.3.tar.bz2=07ebf2f5577eed6dea2ea87228d5623f
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/18.04/x86_64/ruby-2.5.4.tar.bz2=6598b2e182cbc8474b3bcdfc5dffc0ee
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/18.04/x86_64/ruby-2.5.5.tar.bz2=bea688b485a0a904d3f737f92317a8fa
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/18.04/x86_64/ruby-2.5.6.tar.bz2=7e8ccadf6baa8c9177bbd8dcb99bfe89
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/18.04/x86_64/ruby-2.5.7.tar.bz2=ffd69059aa6a31b91ecee817fcfe8b68
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/18.04/x86_64/ruby-2.5.8.tar.bz2=3f2b59843b96bc2e4a9bbd953c33fea4
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/18.04/x86_64/ruby-2.6.0.tar.bz2=a602d4c9b1a51905363c5cdfffa297b7
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/18.04/x86_64/ruby-2.6.1.tar.bz2=873616df4527b304c03a143001710ea6
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/18.04/x86_64/ruby-2.6.2.tar.bz2=92f97f02261d800bf4e047a1ecce82b6
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/18.04/x86_64/ruby-2.6.3.tar.bz2=37929d238ccb7955d5b5abf645eb86ab
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/18.04/x86_64/ruby-2.6.4.tar.bz2=2fba68f2976e827df4fd8abcdc182263
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/18.04/x86_64/ruby-2.6.5.tar.bz2=160cb36e600df0265b20401330b9b5a8
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/18.04/x86_64/ruby-2.6.6.tar.bz2=ea85f316610e2fab7494aca4ed923c11
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/18.04/x86_64/ruby-2.7.0.tar.bz2=ec1f46977ad59ab2d19b0e5b2e0a52db
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/18.04/x86_64/ruby-2.7.1.tar.bz2=e4a3b51c9ebae6a59a46862c47a27b34
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/18.04/x86_64/ruby-2.7.2.tar.bz2=d4ffdd35e8d4790d17271dddd3f37aa1
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/18.04/x86_64/ruby-3.0.0-preview1.tar.bz2=bac846895e3f3bd235871b0ccf17a366
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/19.10/x86_64/ruby-2.4.0.tar.bz2=494942e29d7fc3bdd211239ba6eefe5a
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/19.10/x86_64/ruby-2.4.1.tar.bz2=ba2a1245e0901efdb51e77d84328dd7f
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/19.10/x86_64/ruby-2.4.2.tar.bz2=2e5bee0c0a78845d255a6280700079b1
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/19.10/x86_64/ruby-2.4.3.tar.bz2=8eff04caee532d5fe305b80828deeb18
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/19.10/x86_64/ruby-2.4.4.tar.bz2=950cf5be717f67e27032f74ee9b7b50a
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/19.10/x86_64/ruby-2.4.5.tar.bz2=de685c84c30de17f19ebfe5ef954d85e
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/19.10/x86_64/ruby-2.4.6.tar.bz2=6b74fb9d949f0cc856c2c0392bfd26a5
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/19.10/x86_64/ruby-2.4.7.tar.bz2=9e818fd4bd93f98ee6eae552c5072393
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/19.10/x86_64/ruby-2.4.8.tar.bz2=77105ef5196841d25d8dfbbb70c163b0
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/19.10/x86_64/ruby-2.4.9.tar.bz2=51f48e1e516d6fc8c63195e1619c67c3
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/19.10/x86_64/ruby-2.4.10.tar.bz2=b96bd17d21a7737b4577e6be8affa2f4
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/19.10/x86_64/ruby-2.5.0.tar.bz2=2f9f24948f4d30e2b5623272f0f43c62
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/19.10/x86_64/ruby-2.5.1.tar.bz2=f384304fd892aa5a4ebcfd6ede314f35
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/19.10/x86_64/ruby-2.5.2.tar.bz2=14bea4413c36b459078690d003fc4530
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/19.10/x86_64/ruby-2.5.3.tar.bz2=29a9788efe8e0f1b36a017798dc12ecc
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/19.10/x86_64/ruby-2.5.4.tar.bz2=edf0db535d93b008f75be409e4c98946
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/19.10/x86_64/ruby-2.5.5.tar.bz2=bf0738decc7b9227bacebbed7d97ba78
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/19.10/x86_64/ruby-2.5.6.tar.bz2=d4d92f8aa49d894a987802b8f7814e6e
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/19.10/x86_64/ruby-2.5.7.tar.bz2=efe5dcc5cc88b4cadc2cb285832446fb
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/19.10/x86_64/ruby-2.5.8.tar.bz2=5d3a194259a818dea54b7b621ef87386
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/19.10/x86_64/ruby-2.6.0.tar.bz2=03274650203d5ce5219fc22834cb9e33
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/19.10/x86_64/ruby-2.6.1.tar.bz2=5de9a66505ed57cab0528565e170bfe2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/19.10/x86_64/ruby-2.6.2.tar.bz2=237e88cc4601ae148c346c003851b348
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/19.10/x86_64/ruby-2.6.3.tar.bz2=7165d73c6d0594e191bb64322cb86e74
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/19.10/x86_64/ruby-2.6.4.tar.bz2=f9fc931feb7c62fce4be37fe9021bf08
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/19.10/x86_64/ruby-2.6.5.tar.bz2=0805df8363a8d07c7259645858bf0212
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/19.10/x86_64/ruby-2.6.6.tar.bz2=3784961ef35311274cac83b4f4ec3056
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/19.10/x86_64/ruby-2.7.0.tar.bz2=73063f321a567b5eb12cb82975c5260a
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/19.10/x86_64/ruby-2.7.1.tar.bz2=c90d33cb17de38c68af149d72788da78
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/19.10/x86_64/ruby-2.7.2.tar.bz2=508e6114231bfa467f38cd09ec1f1392
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/19.10/x86_64/ruby-3.0.0-preview1.tar.bz2=c419f043e0160195e01c7e7bd5f1c00b
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/20.04/x86_64/ruby-2.1.0.tar.bz2=3597c93169b75494017e8a107aadc12d
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/20.04/x86_64/ruby-2.1.1.tar.bz2=fd11d47796e7c08a0760c8c2afbb78fc
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/20.04/x86_64/ruby-2.1.2.tar.bz2=a76edd96faa49d6a7ce68796bcd3293f
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/20.04/x86_64/ruby-2.1.3.tar.bz2=e647b0b25349e09f7a5f6049979f279c
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/20.04/x86_64/ruby-2.1.4.tar.bz2=9e1e37e0bde5738de2bffef1087f3f3c
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/20.04/x86_64/ruby-2.1.5.tar.bz2=505649230579c19a5b441193cff4b5c4
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/20.04/x86_64/ruby-2.1.6.tar.bz2=55e0ad8c9c68d4cffcf8da84f980126d
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/20.04/x86_64/ruby-2.1.7.tar.bz2=8a8f4e4efa17939727ff7b65d31e8327
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/20.04/x86_64/ruby-2.1.8.tar.bz2=3b2983ed60a52a8fa8ec1023fef134af
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/20.04/x86_64/ruby-2.1.9.tar.bz2=1a369513e9ecc328d7f4cb4e5c3b8361
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/20.04/x86_64/ruby-2.1.10.tar.bz2=fc86685e5ed6feae1db8da8f4a78da6c
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/20.04/x86_64/ruby-2.2.0.tar.bz2=35f7216ddb43b753b3408334fa0e27c1
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/20.04/x86_64/ruby-2.2.1.tar.bz2=a5ed8baee0b886fe74586818366dddb4
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/20.04/x86_64/ruby-2.2.2.tar.bz2=539d8f898ffdddc00a92209dd14e59d8
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/20.04/x86_64/ruby-2.2.3.tar.bz2=cb9113d5f3fec455bbdf1f651b1829a3
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/20.04/x86_64/ruby-2.2.4.tar.bz2=9ad8b0cc7fee0240c3f697ef8b6c93e2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/20.04/x86_64/ruby-2.2.5.tar.bz2=526799aca827be822e772d5de53cb8b2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/20.04/x86_64/ruby-2.2.6.tar.bz2=60f7b4f4bee2b0ca760b2df70156c634
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/20.04/x86_64/ruby-2.2.7.tar.bz2=dacbe838be290ddcc053062764d2a1e7
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/20.04/x86_64/ruby-2.2.8.tar.bz2=de6bca6bce8059b8f08363f647c6c0c0
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/20.04/x86_64/ruby-2.2.9.tar.bz2=72c9b8d4a19d48d4c54176f58f6176f3
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/20.04/x86_64/ruby-2.2.10.tar.bz2=79a8bf433d8319a34ad8c443b8d32aab
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/20.04/x86_64/ruby-2.3.0.tar.bz2=52005b50d0fdc4191acad31095733afe
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/20.04/x86_64/ruby-2.3.1.tar.bz2=189f474a83aaa3e7f1a12ef6e2dd0d46
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/20.04/x86_64/ruby-2.3.2.tar.bz2=1c2822a1b545dec34ea5d9bc891d863b
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/20.04/x86_64/ruby-2.3.3.tar.bz2=66e88ec5b93c730b205dc1915c3817f3
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/20.04/x86_64/ruby-2.3.4.tar.bz2=22f71aae51742bb7c4545ba4b543d281
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/20.04/x86_64/ruby-2.3.5.tar.bz2=52cdcb424b4c29868bcb0415dc6800cf
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/20.04/x86_64/ruby-2.3.6.tar.bz2=563e406cb9e6877f3fd407996094e285
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/20.04/x86_64/ruby-2.3.7.tar.bz2=ec657c2cbf0d007bf08a3cd4966dfc74
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/20.04/x86_64/ruby-2.3.8.tar.bz2=fc8d9a43176a0e8d417a5bf591ac5a24
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/20.04/x86_64/ruby-2.4.0.tar.bz2=3aecd4c9e10d785ea02f061a3d23ef4f
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/20.04/x86_64/ruby-2.4.1.tar.bz2=1b83408afb875f75f601a2df4561b5ba
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/20.04/x86_64/ruby-2.4.2.tar.bz2=b226f7e1519b647916c6f4c644d2aa76
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/20.04/x86_64/ruby-2.4.3.tar.bz2=3ed590b52d0b2169632c000775bf42a6
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/20.04/x86_64/ruby-2.4.4.tar.bz2=4215fda256b8e85af09a0280df7ff6c9
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/20.04/x86_64/ruby-2.4.5.tar.bz2=dca93c0453d9520f463cdc402bee5c1b
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/20.04/x86_64/ruby-2.4.6.tar.bz2=c6bf82998ca467e5c3fc10508d3e88ba
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/20.04/x86_64/ruby-2.4.7.tar.bz2=3d8108f21c103ba7d9af83a0489bfc7b
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/20.04/x86_64/ruby-2.4.8.tar.bz2=ab70a3ca42220b575d6beccf9e0bc25b
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/20.04/x86_64/ruby-2.4.9.tar.bz2=ff66ffe02c21d2163a4db3b4daeaa13d
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/20.04/x86_64/ruby-2.4.10.tar.bz2=5c4c43e0fd5435099adc86c9985dd4c4
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/20.04/x86_64/ruby-2.5.0.tar.bz2=c66bd4ed120999159fba088549c755cf
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/20.04/x86_64/ruby-2.5.1.tar.bz2=5a8c6a0955be75e5d461624b596a08e2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/20.04/x86_64/ruby-2.5.2.tar.bz2=0071aeae2ad582f89c4704531d0e7a5d
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/20.04/x86_64/ruby-2.5.3.tar.bz2=5da9cf19b005948398f3541a1ded7105
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/20.04/x86_64/ruby-2.5.4.tar.bz2=a27a413146d903d258fe9fc907e60c1a
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/20.04/x86_64/ruby-2.5.5.tar.bz2=77794ae2fb09dca79bfb636198ccaaed
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/20.04/x86_64/ruby-2.5.6.tar.bz2=565f3c0dbc3211c6f86ebcb60cbd5de7
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/20.04/x86_64/ruby-2.5.7.tar.bz2=5cc60a18ac4cca5322994c6d19753846
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/20.04/x86_64/ruby-2.5.8.tar.bz2=45b547a987088761a88143e5fabef13e
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/20.04/x86_64/ruby-2.6.0.tar.bz2=032a73d5182d84cbbf20b6e7e310c7c2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/20.04/x86_64/ruby-2.6.1.tar.bz2=07c61bc0c9e09fc87808f62985cbff25
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/20.04/x86_64/ruby-2.6.2.tar.bz2=62745ec761a45826841002e72cfca795
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/20.04/x86_64/ruby-2.6.3.tar.bz2=538383cc35e5710a2175f36416ca3b7c
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/20.04/x86_64/ruby-2.6.4.tar.bz2=8a17255fa833fe3ff9c0275db79bfbff
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/20.04/x86_64/ruby-2.6.5.tar.bz2=66dc3fdf49b1371fd6d362f3ea9d019b
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/20.04/x86_64/ruby-2.6.6.tar.bz2=873b63cc2e4abbb6ec5126ab07ce429a
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/20.04/x86_64/ruby-2.7.0.tar.bz2=fba1bf0b819f52561deab198fd36743d
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/20.04/x86_64/ruby-2.7.1.tar.bz2=3ec8f383026889e2f3c328d86839a7b2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/20.04/x86_64/ruby-2.7.2.tar.bz2=9c3775365cab8e1e82aa19e87b9711dd
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/20.04/x86_64/ruby-3.0.0.tar.bz2=ea7767cbfacd744813ccaedd1b4e0013
ironruby-1.0.zip=7a92888837b3507355ed391dbfc0ab83
ironruby-1.1.3.zip=4f2af6253a459cc054d6c55956e514a9
jruby-bin-1.3.1.tar.gz=4a95db8fc93ed7219663fbede98b6117
jruby-bin-1.4.tar.gz=54dba9a88b2b3f99ac86a79828d0178b
jruby-bin-1.4.0.tar.gz=f37322c18e9134e91e064aebb4baa4c7
jruby-bin-1.4.0.zip=3a9c8a5115a679da7d7a49a56d57d4c0
jruby-bin-1.4.1.tar.gz=a4aa8c43d1b9ffd9dbc6cb738d55a034
jruby-bin-1.5.0.tar.gz=ee2b4e326e8b87858e5dd0c8e94102e6
jruby-bin-1.5.1.tar.gz=74251383e08e8c339cacc35a7900d3af
jruby-bin-1.5.2.tar.gz=d239deb9a108a6abbfbd6cb79cf8255b
jruby-bin-1.5.3.tar.gz=ccb0b2dbc300d8dd4ad1bd4da48b8320
jruby-bin-1.5.5.tar.gz=8e00f7d40cbf221f733d6f7a15784e9a
jruby-bin-1.5.6.tar.gz=94033a36517645b7a7ec781a3507c654
jruby-bin-1.6.0.tar.gz=f4d7e339dfc0fbaef5b878d1c0a66fbe
jruby-bin-1.6.2.tar.gz=a46f978c24a208717023bb4b8995c678
jruby-bin-1.6.3.tar.gz=694b80e4eea784cdc1eb39fb1e3132c9
jruby-bin-1.6.4.tar.gz=0e96b6f4d1c6f12b5ac480cd7ab7da78
jruby-bin-1.6.5.tar.gz=54354082673bd115f945890dc6864413
jruby-bin-1.6.5.1.tar.gz=246a7aa2b7d7e6e9e8a0c2e282cbcfd0
jruby-bin-1.6.7.tar.gz=fd1b8d7389aa92da69ea6efb4782e40a
jruby-bin-1.6.7.2.tar.gz=1e520f1b5130114464e5f1950cb24774
jruby-bin-1.6.8.tar.gz=a76ac5845640e4a1ebdfa74421efc935
jruby-bin-1.7.0.preview1.tar.gz=7b9e5e1cd0d818d0199086d948f948b4
jruby-bin-1.7.0.preview2.tar.gz=e8f1623759590aadbf49e4cc53f1cb61
jruby-bin-1.7.0.RC1.tar.gz=bdddcee3d126cddd9a85b5a066a7e25e
jruby-bin-1.7.0.RC2.tar.gz=ffe2dd61711f4574fed344af151e5de5
jruby-bin-1.7.0.tar.gz=21861e0ecdbf48cda713c8ade82fdddb
jruby-bin-1.7.1.tar.gz=86e659863541d8b987cb7bfbe3b4cfb0
jruby-bin-1.7.2.tar.gz=6ec9293b6dffd1e8ee57e9b7c6d18cbe
jruby-bin-1.7.3.tar.gz=f0adf8ccee6f6777f7ab8e5e1d7a1f47
jruby-bin-1.7.4.tar.gz=c6a56eae78db28dddba911ccd0848c32
jruby-bin-1.7.5.tar.gz=c2a28c43c8095127d4a4aee0cf9b1439
jruby-bin-1.7.6.tar.gz=5d10011516a3d3bde10209b60cfcc0ef
jruby-bin-1.7.7.tar.gz=9d6df2188fa57f12bf6fde4e4b2e3f09
jruby-bin-1.7.8.tar.gz=1e68f39d6dba7b6d9db81e24bb6b7d0a
jruby-bin-1.7.9.tar.gz=b2e44f1f44837c07068ee453a89f4b55
jruby-bin-1.7.10.tar.gz=c84fe9245a73f9cd29f56343b7d2e39a
jruby-bin-1.7.11.tar.gz=d6e6ab72426fa7fdc9ae55950980d877
jruby-bin-1.7.12.tar.gz=2073aa6dfc7c701ef7c3d3143d181582
jruby-bin-1.7.14.tar.gz=bc33284f27a3508a70d2ade100a2f6bd
jruby-bin-1.7.15.tar.gz=92e63cffcb86842511aeeed95bdf96ed
jruby-bin-1.7.16.tar.gz=92cb058d1a896257b5ac1c26dc433506
jruby-bin-1.7.16.1.tar.gz=eec2f0e03560bacf02a09c0096a99cad
jruby-bin-1.7.16.2.tar.gz=cd31909b67239c5c6a795521fca5c239
jruby-bin-1.7.17.tar.gz=8b78ba1acdb718431f71c38287c07967
jruby-bin-1.7.18.tar.gz=aa7286140be0f6f60534ebffededc708
jruby-bin-1.7.19.tar.gz=bc38596757d8000d6ca4c4c3f8eacea6
jruby-bin-1.7.20.tar.gz=0c2adc160cb85c888b269e8ac4f886fc
jruby-bin-1.7.21.tar.gz=bc91594072032023d146f330764d3274
jruby-bin-1.7.22.tar.gz=1da904bf41d362d0d0b366d9e781168f
jruby-bin-1.7.23.tar.gz=41e3f45c28c94a275f9eeb22721da35d
jruby-bin-1.7.25.tar.gz=fc43ead73f657f5261428923974fd605
jruby-bin-1.7.26.tar.gz=4ca60264a9560f37fdba8108543e72c2
jruby-bin-1.7.27.tar.gz=b98b0a2c52e885a868a2b60092e1cd3d
jruby-bin-9.0.0.0.pre1.tar.gz=d5c8b30648348aa883f893d464d46bf1
jruby-bin-9.0.0.0.pre2.tar.gz=86994a9d7ed2cf318c75392623a3e6da
jruby-bin-9.0.0.0.tar.gz=fe9036ea69bf23dc3b69cfc94adb5404
jruby-bin-9.0.1.0.tar.gz=a82bc640e0080b1d9a21d1477c8400e3
jruby-bin-9.0.3.0.tar.gz=828dd6c6dd18e5b186ccfd65753077bd
jruby-bin-9.0.4.0.tar.gz=645bf4a1dcde3f19dc0fff75c8b4b685
jruby-bin-9.0.5.0.tar.gz=1d2dc649cbacbe26418ef3ba421018b1
jruby-bin-9.1.0.0.tar.gz=fe26e6308d006d35eb613cdd47d1dc99
jruby-bin-9.1.1.0.tar.gz=8356334270df07a214590d00a986837b
jruby-bin-9.1.2.0.tar.gz=749bb917dde9666e365e12bbe776a5c2
jruby-bin-9.1.3.0.tar.gz=91c246cd623702032e88283565da5480
jruby-bin-9.1.4.0.tar.gz=5b80b78c09bf0cd4dcbcb9e1fe3e8b73
jruby-bin-9.1.5.0.tar.gz=e9b2cc44757db4cfbe7da79601d0169a
jruby-bin-9.1.6.0.tar.gz=4092a89b01b55d1fb5498113f97ab0ca
jruby-bin-9.1.7.0.tar.gz=b120c3eaeef7ff2aed3a57701e414e78
jruby-bin-9.1.8.0.tar.gz=0fdee002c56ec91dff1efffce205265c
jruby-bin-9.1.9.0.tar.gz=170efc34297d7ac2a56bb1163e96b363
jruby-bin-9.1.10.0.tar.gz=b75e0d1a200e8f790d8bbc84f91e3002
jruby-bin-9.1.11.0.tar.gz=0502a14141da25a460ce197720bab4c3
jruby-bin-9.1.12.0.tar.gz=74bd7ae08c159fc62cb6f64845a868cc
jruby-bin-9.1.13.0.tar.gz=6c642c8a2653a585779f453d8c843fd7
jruby-bin-9.1.14.0.tar.gz=a7e0ecd529690025d327c45744f60fa4
jruby-bin-9.1.15.0.tar.gz=01c29690324d7eb414fba66e4c009c9e
jruby-bin-9.1.16.0.tar.gz=e64c3aa1310c272194fd1750b0b79fac
jruby-bin-9.1.17.0.tar.gz=f28d1fcbb60e550f3abd839102ad0069
jruby-bin-9.2.0.0.tar.gz=bd476da4bed39ffcfff7116f448a5365
jruby-bin-9.2.1.0.tar.gz=4b78b0a40ca541556f5ee75a815e0be0
jruby-bin-9.2.2.0.tar.gz=be678559801be029fe233c33396e34d2
jruby-bin-9.2.3.0.tar.gz=79328ab1ed37d612da35271183e46bbd
jruby-bin-9.2.4.0.tar.gz=f538f2be459f0f0e517a53446e78a354
jruby-bin-9.2.4.1.tar.gz=d373bbc2bd6caabfcc9914c4067e9d24
jruby-bin-9.2.5.0.tar.gz=14582fd6eee19610f0a7433ce5dd5ce4
jruby-bin-9.2.6.0.tar.gz=dba182ac9943b726b609ca61747c1835
jruby-bin-9.2.7.0.tar.gz=c0111b2cafa920df76284044e1aeedc7
jruby-bin-9.2.8.0.tar.gz=7d652b586a18f1c665289fd7e6edf4f5
jruby-bin-9.2.9.0.tar.gz=74b3451f79c13c2fc66c6dee69d46699
jruby-bin-9.2.10.0.tar.gz=e6ce97eae6e35b622c1b572f9297705b
jruby-bin-9.2.11.0.tar.gz=22b003adfb03b253721cc85db248698f
jruby-bin-9.2.11.1.tar.gz=687586132f7b649b1bdd7b823577c9d8
jruby-bin-9.2.12.0.tar.gz=cc7599837fbd0839cce7293577a34f2c
jruby-bin-9.2.13.0.tar.gz=99df4eb89f88c7582bfe7c313daec7b4
jruby-bin-9.2.14.0.tar.gz=421c5b8146701177a738a0a691190018
libiconv-1.13.1.tar.gz=7ab33ebd26687c744a37264a330bbe9a
MacRuby%200.5.zip=675454a8c7bc19d606d90a726e08427c
MacRuby%200.6.zip=a80afd3700c88cf95c539fc63b272faf
MacRuby%200.7.1.zip=e8245dcd03c0757dfae7e6fee913947a
MacRuby%200.7.zip=0bb60588c9ec9b1517665743bb05132f
MacRuby%200.8.zip=735ac0a70f539e00b5de6fbec09c2c5c
MacRuby%200.9.zip=fa01345e8fbfee620bbac64743a45f69
MacRuby%200.10.zip=1662d13d2f73cfc26258598f6988dcbc
MacRuby%200.11.zip=b0cc23d60484a07012bcad549cef6054
MacRuby%200.12.zip=e1c5fa1b007a1cdc38c527a47302bf5e
MagLev-1.0.0.tar.gz=e02cb8ee04438451eb78df14f91a68a9
MagLev-1.1beta.tar.gz=d542c7af290ce3b588b57629906b19e9
MagLev-1.1beta2.tar.gz=0ef88d5d145611aef324cb51be0aaafd
MagLev-1.1RC1.tar.gz=41f4a0994daf1e5271cbd0ebe57816f4
MagLev-1.2Alpha.tar.gz=5c7dd3acef9dbddc0829bb1daa087abb
MagLev-1.2Alpha2.tar.gz=cbbeae109854a6bf107a747a93fd478b
MagLev-1.2Alpha3.tar.gz=b7470518f2b697eb1a5a39eff9b6d749
MagLev-1.2Alpha4.tar.gz=d54f04a611ce838b9d7009627065b7ca
mruby-1.0.0.tar.gz=d9aec6a20fc1add65ee07ff6cf0e1ef2
mruby-1.1.0.tar.gz=60d75ea704c9285f3c80b3ad1d2b68de
mruby-1.2.0.tar.gz=b5a3b7962d9db8cb8fb8105aa914d16c
mruby-1.3.0.tar.gz=9714dd2804064d0043e099b7211d72b9
mruby-1.4.0.tar.gz=25efc35511070454074b36863c4d5b5e
mruby-1.4.1.tar.gz=b40bf09af3f4c6e2bc443b9ac803a3ad
mruby-2.0.0.tar.gz=b86c6a1dd86cb4ebe51e3fe38964a830
mruby-2.0.1.tar.gz=15b426a8a94a610c45414578786d05e3
mruby-2.1.0-rc.tar.gz=58a85fcb102d72900a25190da670e01d
mruby-2.1.0.tar.gz=c01a4bbf62e6f5765c70b8813e0ce7da
mruby-2.1.1-rc.tar.gz=809edd80e680855e7c4cf3c569972f28
mruby-2.1.1-rc2.tar.gz=24879fa5eb587f9415f03f8f3701842e
mruby-2.1.1.tar.gz=c0ee4a112695046b9e4f177e31096d6c
ncurses.tar.gz=cce05daf61a64501ef6cd8da1f727ec6
openssl-0.9.8k.tar.gz=e555c6d58d276aec7fdc53363e338ab3
openssl-0.9.8n.tar.gz=076d8efc3ed93646bd01f04e23c07066
openssl-1.0.1c.tar.gz=ae412727c8c15b67880aef7bd2999b2e
openssl-1.0.1i.tar.gz=c8dc151a671b9b92ff3e4c118b174972
pkg-config-0.23.tar.gz=d922a88782b64441d06547632fd85744
readline-5.2.tar.gz=e39331f32ad14009b9ff49cc10c5e751
readline-6.0.tar.gz=b7f65a48add447693be6e86f04a63019
readline-6.2.tar.gz=67948acb2ca081f23359d0256e9a271c
release-2.0.0-rc1.zip=b05b5e3c2712a294e4b09ebf450c1bfe
rubinius-1.0.0-20100514.tar.gz=b05f4e791d3712c5a50b3d210dac6eb0
rubinius-1.0.1-20100603.tar.gz=eb185703c7ae0c0210e8dcb7f783ee8e
rubinius-1.1.0-20100923.tar.gz=e2ae16238b201de09975abe19da09ea9
rubinius-1.1.1-20101116.tar.gz=b39f618eeba37c3aff215da8bca55fd7
rubinius-1.2.0-20101221.tar.gz=4284c2660f1f648942de35d4fc871f70
rubinius-1.2.1-20110215.tar.gz=e4a5127480062fddddc7ce2860b3b813
rubinius-1.2.2-20110222.tar.gz=59124378fb7ee040e9ee4e4736d89fc0
rubinius-1.2.3-20110315.tar.gz=9782dab18c2dd440af6b76e8eb5bc0f0
rubinius-1.2.4-20110705.tar.gz=403c777d19b3553e9cb36701fe002c5e
rubinius-1.3.2.tar.bz2=64801ad8dd4e5e4fcb74ff313fec0a69
rubinius-1.3.3.tar.bz2=79f1f860ed8242257bd7f3e88c81a197
rubinius-1.4.1.tar.bz2=76b840405d4b9303261c27cf15002386
rubinius-2.0.0.tar.bz2=62e379e044c822b81e7b20a27daf133e
rubinius-2.1.0.tar.bz2=908053f38fd840c75a93aab7487c20a5
rubinius-2.1.1.tar.bz2=6b4df0caec5ea88373e113f97a3b4c72
rubinius-2.2.0.tar.bz2=f1fbc6f3baf1da5ad86b3858f30f3349
rubinius-2.2.2.tar.bz2=ac70d629ea43525d91e81f4ccf135299
rubinius-2.2.3.tar.bz2=d9978cf1a4e8f0310db63e49834f9837
rubinius-2.2.4.tar.bz2=c10699da85a8eb5861a37b29077213bd
rubinius-2.2.5.tar.bz2=5996dc8529b2ffe5921c5e7020bee20e
rubinius-2.2.6.tar.bz2=85339bb6dd525eee719edf0551868f56
rubinius-2.2.7.tar.bz2=de2e6f4c3bd9a90bcb89f2ea27ddee9e
rubinius-2.2.8.tar.bz2=c4db1ffb8dbdf864240cabe8b7758b49
rubinius-2.2.9.tar.bz2=0bf87ba617fa989e47d20942410028af
rubinius-2.2.10.tar.bz2=8680da7eb921e6f595a1d716915ca7e0
rubinius-2.3.0.tar.bz2=e003a30af6689c8198116b3405d09d8e
rubinius-2.4.0.tar.bz2=62391a51f49820daa51463066c3ce007
rubinius-2.4.1.tar.bz2=7758721b6e848387c3943ddb9ebd9479
rubinius-2.5.0.tar.bz2=178baa1ad172df0801765ea93bc36d87
rubinius-2.5.1.tar.bz2=77e1b87dc357691ad44b561a5f45c188
rubinius-2.5.2.tar.bz2=e5973d6e0a16f0390dc2a7478db83ff5
rubinius-2.5.3.tar.bz2=b19709eb3fa9e05b3fa6a357b33e3b5b
rubinius-2.5.4.tar.bz2=64587916e5d445ed9bc630017a04498e
rubinius-2.5.5.tar.bz2=ef671bbab50cbe2f70f953c491311261
rubinius-2.5.6.tar.bz2=597e4b049f49966c646faf699856c1b9
rubinius-2.5.7.tar.bz2=9a7f404019bce9fc34a7af7feb7cbb74
rubinius-2.5.8.tar.bz2=a24520892cada1f660e719a25abf63e3
ruby-1.8.5-p115.tar.bz2=03955e3c367b9beb3efe144c9f00d689
ruby-1.8.5-p115.tar.gz=20ca6cc87eb077296806412feaac0356
ruby-1.8.5-p231.tar.bz2=327f5aa6573787432222e96195cffd1e
ruby-1.8.5-p231.tar.gz=e900cf225d55414bffe878f00a85807c
ruby-1.8.6-p286.tar.bz2=e6b6bf8f34370e433936adb7a7065e63
ruby-1.8.6-p286.tar.gz=797ea136fe43e4286c9362ee4516674e
ruby-1.8.6-p287.tar.bz2=80b5f3db12531d36e6c81fac6d05dda9
ruby-1.8.6-p287.tar.gz=6ff3420094711266c3201a0c7c2faa38
ruby-1.8.6-p369.tar.bz2=c3c1f3dd0dfbd2e17a04e59c2f12cfc8
ruby-1.8.6-p369.tar.gz=8c140ae28b4c3947b92dfad69109d90b
ruby-1.8.6-p383.tar.bz2=a48703cd982b9f0e3002700a50b0e88e
ruby-1.8.6-p383.tar.gz=4f49544d4a4d0d34e9d86c41e853db2e
ruby-1.8.6-p398.tar.bz2=fbd43dc44ee26be4d37e6bebbed6f8bd
ruby-1.8.6-p398.tar.gz=736db5f56c2d9b0136e563d049249fa8
ruby-1.8.6-p399.tar.bz2=f77c307cb72fb8808b0e85af5d05cefc
ruby-1.8.6-p399.tar.gz=c3d16cdd3c1ee8f3b7d1c399d4884e33
ruby-1.8.6-p420.tar.bz2=1c7a978e9ffd4f56dc2ad74bbd2c34f3
ruby-1.8.6-p420.tar.gz=ca1eee44f842e93b5098bc5a2bb9a40b
ruby-1.8.7-p160.tar.bz2=f8ddb886b8a81cf005f53e9a9541091d
ruby-1.8.7-p160.tar.gz=945398f97e2de6dd8ab6df68d10bb1a1
ruby-1.8.7-p174.tar.bz2=88c45aaf627b4404e5e4273cb03ba2ee
ruby-1.8.7-p174.tar.gz=18dcdfef761a745ac7da45b61776afa5
ruby-1.8.7-p248.tar.bz2=37e19d46b7d4b845f57d3389084b94a6
ruby-1.8.7-p248.tar.gz=60a65374689ac8b90be54ca9c61c48e3
ruby-1.8.7-p249.tar.bz2=37200cc956a16996bbfd25bb4068f242
ruby-1.8.7-p249.tar.gz=d7db7763cffad279952eb7e9bbfc221c
ruby-1.8.7-p299.tar.bz2=244439a87d75ab24170a9c2b451ce351
ruby-1.8.7-p299.tar.gz=43533980ee0ea57381040d4135cf9677
ruby-1.8.7-p302.tar.bz2=a6a9e37079ed8cf8726b455dad3de939
ruby-1.8.7-p302.tar.gz=a6a9e37079ed8cf8726b455dad3de939
ruby-1.8.7-p330.tar.bz2=2689719fb42c8cf0aa336f8c8933f413
ruby-1.8.7-p330.tar.gz=50a49edb787211598d08e756e733e42e
ruby-1.8.7-p334.tar.bz2=2f14f604bf981bb938ab5fc8b09eb1a6
ruby-1.8.7-p334.tar.gz=aacb6ee5dfe2367682bba56af7f415b8
ruby-1.8.7-p352.tar.bz2=0c61ea41d1b1183b219b9afe97f18f52
ruby-1.8.7-p352.tar.gz=0c33f663a10a540ea65677bb755e57a7
ruby-1.8.7-p357.tar.bz2=3abd9e2a29f756a0d30c7bfca578cdeb
ruby-1.8.7-p357.tar.gz=b2b8248ff5097cfd629f5b9768d1df82
ruby-1.8.7-p358.tar.bz2=de35f00997f4ccee3e22dff0f2d01b8a
ruby-1.8.7-p370.tar.bz2=1e4c3194537dd8ff92e756993e55a29d
ruby-1.8.7-p371.tar.bz2=c27526b298659a186bdb5107fcec2341
ruby-1.8.7-p371.tar.gz=653f07bb45f03d0bf3910491288764df
ruby-1.8.7-p374.tar.bz2=83c92e2b57ea08f31187060098b2200b
ruby-1.8.7-p374.tar.gz=b72a0bc5b824398537762e5272bbb8dc
ruby-1.9.0.tar.bz2=17eb66ac3721340d21db352d8f5dec76
ruby-1.9.1-p129.tar.bz2=6fa62b20f72da471195830dec4eb2013
ruby-1.9.1-p129.tar.gz=c71f413514ee6341c627be2957023a5c
ruby-1.9.1-p243.tar.bz2=66d4f8403d13623051091347764881a0
ruby-1.9.1-p243.tar.gz=515bfd965814e718c0943abf3dde5494
ruby-1.9.1-p376.tar.bz2=e019ae9c643c5efe91be49e29781fb94
ruby-1.9.1-p376.tar.gz=ebb20550a11e7f1a2fbd6fdec2a3e0a3
ruby-1.9.1-p378.tar.bz2=5922459622a23612eb9b68a3586cb5f8
ruby-1.9.1-p378.tar.gz=9fc5941bda150ac0a33b299e1e53654c
ruby-1.9.1-p429.tar.bz2=09df32ae51b6337f7a2e3b1909b26213
ruby-1.9.1-p429.tar.gz=0f6d7630f26042e00bc59875755cf879
ruby-1.9.1-p431.tar.bz2=03179138ae95dbfae872ef49e9cc6da7
ruby-1.9.1-p431.tar.gz=23f28cffc007ed5ac72c8e9bec6837ce
ruby-1.9.2-p0.tar.bz2=d8a02cadf57d2571cd4250e248ea7e4b
ruby-1.9.2-p0.tar.gz=755aba44607c580fddc25e7c89260460
ruby-1.9.2-p136.tar.bz2=52958d35d1b437f5d9d225690de94c13
ruby-1.9.2-p136.tar.gz=6e17b200b907244478582b7d06cd512e
ruby-1.9.2-p180.tar.bz2=68510eeb7511c403b91fe5476f250538
ruby-1.9.2-p180.tar.gz=0d6953820c9918820dd916e79f4bfde8
ruby-1.9.2-p290.tar.bz2=096758c3e853b839dc980b183227b182
ruby-1.9.2-p290.tar.gz=604da71839a6ae02b5b5b5e1b792d5eb
ruby-1.9.2-p318.tar.bz2=be431c6cbfa27e3836a06c6315717747
ruby-1.9.2-p318.tar.gz=cc7bf1025128e1985882ae243f348802
ruby-1.9.2-p320.tar.bz2=b226dfe95d92750ee7163e899b33af00
ruby-1.9.2-p320.tar.gz=5ef5d9c07af207710bd9c2ad1cef4b42
ruby-1.9.2-p330.tar.bz2=8ba4aaf707023e76f80fc8f455c99858
ruby-1.9.2-p330.tar.gz=4b9330730491f96b402adc4a561e859a
ruby-1.9.3-p0.tar.bz2=65401fb3194cdccd6c1175ab29b8fdb8
ruby-1.9.3-p0.tar.gz=8e2fef56185cfbaf29d0c8329fc77c05
ruby-1.9.3-p125.tar.bz2=702529a7f8417ed79f628b77d8061aa5
ruby-1.9.3-p125.tar.gz=e3ea86b9d3fc2d3ec867f66969ae3b92
ruby-1.9.3-p194.tar.bz2=2278eff4cfed3cbc0653bc73085caa34
ruby-1.9.3-p194.tar.gz=bc0c715c69da4d1d8bd57069c19f6c0e
ruby-1.9.3-p286.tar.bz2=e76848a86606a4fd5dcf14fc4b4e755e
ruby-1.9.3-p327.tar.bz2=7d602aba93f31ceef32800999855fbca
ruby-1.9.3-p327.tar.gz=96118e856b502b5d7b3a4398e6c6e98c
ruby-1.9.3-p362.tar.bz2=13c26ea368d88a560f07cc8c5eb4fa05
ruby-1.9.3-p374.tar.bz2=944e73eba9ee9e1f2647ff32ec0b14b2
ruby-1.9.3-p385.tar.bz2=5ec9aff670f4912b0f6f0e11e855ef6c
ruby-1.9.3-p392.tar.bz2=a810d64e2255179d2f334eb61fb8519c
ruby-1.9.3-p392.tar.gz=f689a7b61379f83cbbed3c7077d83859
ruby-1.9.3-p429.tar.bz2=c2b2de5ef15ea9b1aaa3152f9112af1b
ruby-1.9.3-p429.tar.gz=993c72f7f805a9eb453f90b0b7fe0d2b
ruby-1.9.3-p448.tar.bz2=aa710d386e5903f78f0231868255e6af
ruby-1.9.3-p448.tar.gz=a893cff26bcf351b8975ebf2a63b1023
ruby-1.9.3-p484.tar.bz2=03f5b08804927ceabe5122cb90f5d0a9
ruby-1.9.3-p484.tar.gz=8ac0dee72fe12d75c8b2d0ef5d0c2968
ruby-1.9.3-p545.tar.bz2=4743c1dc48491070bae8fc8b423bc1a7
ruby-1.9.3-p545.tar.gz=8e8f6e4d7d0bb54e0edf8d9c4120f40c
ruby-1.9.3-p547.tar.bz2=5363d399be7f827c77bf8ae5d1a69b38
ruby-1.9.3-p547.tar.gz=7531f9b1b35b16f3eb3d7bea786babfd
ruby-1.9.3-p550.tar.bz2=c2169c8b14ccefd036081aba5ffa96da
ruby-1.9.3-p551.tar.bz2=0d8b272b05c3449dc848bb7570f65bfe
ruby-1.9.3-preview1.tar.bz2=7d93dc773c5824f05c6e6630d8c4bf9b
ruby-1.9.3-preview1.tar.gz=0f0220be4cc7c51a82c1bd8f6a0969f3
ruby-1.9.3-rc1.tar.bz2=26f0dc51ad981e12c58b48380112fa4d
ruby-1.9.3-rc1.tar.gz=46a2a481536ca0ca0b80ad2b091df68e
ruby-2.0.0-p0.tar.bz2=895c1c581f8d28e8b3bb02472b2ccf6a
ruby-2.0.0-p195.tar.bz2=2f54faea6ee1ca500632ec3c0cb59cb6
ruby-2.0.0-p247.tar.bz2=60913f3eec0c4071f44df42600be2604
ruby-2.0.0-p353.tar.bz2=20eb8f067d20f6b76b7e16cce2a85a55
ruby-2.0.0-p451.tar.bz2=908e4d1dbfe7362b15892f16af05adf8
ruby-2.0.0-p481.tar.bz2=ea406a8d415a1a5d8365596d4288f3da
ruby-2.0.0-p576.tar.bz2=eccd42d43620544a085c5e3834572f37
ruby-2.0.0-p594.tar.bz2=58469c0daf5f3a892a70cc674ea59c7f
ruby-2.0.0-p598.tar.bz2=a3f3908103a7d209d1d1cf4712e3953c
ruby-2.0.0-p643.tar.bz2=1390888cac6cd175e6f164eff378cdde
ruby-2.0.0-p645.tar.bz2=d576240c97cfcc3ed9bdc457eb1e8280
ruby-2.0.0-p647.tar.bz2=27a3ea1a8b8bca1a6de43a7d08e88b69
ruby-2.0.0-p648.tar.bz2=3544031334f4665aa2eb1414babc9345
ruby-2.0.0-preview1.tar.bz2=47a0f662f0e258aa1c5e429c310861b3
ruby-2.0.0-preview2.tar.bz2=a645a783c3302cc094a9963a5e700a4d
ruby-2.0.0-rc1.tar.bz2=24cebdda11e01ff4889ac983cd7dc02c
ruby-2.0.0-rc2.tar.bz2=e92420131bd7994513e0bf09a3e2a19b
ruby-2.1.0-preview1.tar.bz2=d32d1ea23988399afadbd21c5a7a37fc
ruby-2.1.0-preview2.tar.bz2=9d566a9b2d2e7e35ad6125e2a14ce672
ruby-2.1.0-rc1.tar.bz2=cae095b90349b5b0f7026060cc3dd2c5
ruby-2.1.0.tar.bz2=1546eeb763ac7754365664be763a1e8f
ruby-2.1.1.tar.bz2=53edc33b2f590ecdd9f6a344b9d92d0d
ruby-2.1.1.tar.gz=e57fdbb8ed56e70c43f39c79da1654b2
ruby-2.1.2.tar.bz2=ed9b8565bdeccb401d628ec8d54a0774
ruby-2.1.2.tar.gz=a5b5c83565f8bd954ee522bd287d2ca1
ruby-2.1.3.tar.bz2=02b7da3bb06037c777ca52e1194efccb
ruby-2.1.4.tar.bz2=f4136e781d261e3cc20748005e1740b7
ruby-2.1.5.tar.bz2=a7c3e5fec47eff23091b566e9e1dac1b
ruby-2.1.6.tar.bz2=e1a8e6c6bfbb09bb7f8d6be8f508e4a1
ruby-2.1.7.tar.bz2=3a878e98311d543e5de3533b82ef4a5a
ruby-2.1.8.tar.bz2=b17130b5f02a61640ae3b629af931610
ruby-2.1.9.tar.bz2=62bd1cbfcbc22e4d137462bce992f6d1
ruby-2.1.10.tar.bz2=5155c624807ff2418a9e9f15202954d0
ruby-2.2.0-preview1.tar.bz2=767b132eec3e70b14afe5884a7a767b1
ruby-2.2.0-preview2.tar.bz2=d7abace25a8ffe861cb2807bef1c58a6
ruby-2.2.0-rc1.tar.bz2=7144732d30dd4547c0a59862b3345d54
ruby-2.2.0.tar.bz2=d03cd4690fec1fff81d096d1c1255fde
ruby-2.2.1.tar.bz2=06973777736d8e6bdad8dcaa469a9da3
ruby-2.2.2.tar.bz2=af6eb4fa7247f1f7b2e19c8e6f3e3145
ruby-2.2.3.tar.bz2=f49a734729a71774d4a94a9a603114b2
ruby-2.2.4.tar.bz2=c3d65f6d2ebe90dda81a37885ea244f5
ruby-2.2.5.tar.bz2=0c7edd1ff3650c3b74da2efaf641bf34
ruby-2.2.6.tar.bz2=3d13cf447142b8a11cd9beb7bc63fee0
ruby-2.2.7.tar.bz2=ca7224d80c08b015bc3b8c226d0914c3
ruby-2.2.8.tar.bz2=054d2e2904d5175662293e29c3bdb927
ruby-2.2.9.tar.bz2=575adf8ede6b1ca7236a5341e73536b0
ruby-2.2.10.tar.bz2=bef1909a4c885157870ef69548cdad3a
ruby-2.3.0-preview1.tar.bz2=776000d74ec6dd34bf355ff6921c8311
ruby-2.3.0-preview2.tar.bz2=3ad442ccb337e77e4acaa4113f25b76a
ruby-2.3.0.tar.bz2=f0d9f9bbdc87372ca98988a571875819
ruby-2.3.1.tar.bz2=c194281f63d7fcd816747fe78474be5e
ruby-2.3.2.tar.bz2=9d00f3772f1c8fa5eecdfea089e3032f
ruby-2.3.3.tar.bz2=04b9c461a2bc1eec0535ad1947cad4fb
ruby-2.3.4.tar.bz2=99961e97566aee6d63635e2da4cf73ac
ruby-2.3.5.tar.bz2=e1efc3d5a948ca1f552005efe5925513
ruby-2.3.6.tar.bz2=b2443b11ee80319a119f7ec0c9b8d79a
ruby-2.3.7.tar.bz2=5eb580d5cd13ffb5aacfb96580c0043d
ruby-2.3.8.tar.bz2=78045332e298dfd859ceef9fe946950f
ruby-2.4.0-preview1.tar.bz2=64b8983b5f53d053906e394f734aa296
ruby-2.4.0-preview2.tar.bz2=1074e8dea5baa89af7f7c2d1d2b9ebaa
ruby-2.4.0-preview3.tar.bz2=9f767e6bc61830735ea7dc9cd5a63653
ruby-2.4.0-rc1.tar.bz2=0f8b665acf4e883334adc121a42a206f
ruby-2.4.0.tar.bz2=98f29161860fe1b6c65396717847a358
ruby-2.4.1.tar.bz2=07b2ae5d2f46321c95b37066c8415900
ruby-2.4.2.tar.bz2=5ff3ad6ec816bcce8806a55090936ab6
ruby-2.4.3.tar.bz2=ac8215ba561cc7c79b4f61daee11b706
ruby-2.4.4.tar.bz2=d994274eaa95b82aa5d31ec2188253c6
ruby-2.4.5.tar.bz2=45d70a8bb9397d818795ffe992163d27
ruby-2.4.6.tar.bz2=4abd13c50c1fc273a0a81a0ae74ed39f
ruby-2.4.7.tar.bz2=1ce166ced489908993d78e8bb68325e0
ruby-2.4.8.tar.bz2=396d35f1a2d1deaf303f59cb5245d4ae
ruby-2.4.9.tar.bz2=0b3447370651df55a2014a170c0cb1d5
ruby-2.4.10.tar.bz2=b10a7d2fcaf218c98edbaf57efc36e58
ruby-2.5.0-preview1.tar.bz2=889454189f41e271ae5ba15382911b6a
ruby-2.5.0-rc1.tar.bz2=f5acdeacf56aced3c00ae6a8fa816bbc
ruby-2.5.0.tar.bz2=63a6cd49546783d62de25a0ffc4aecc3
ruby-2.5.1.tar.bz2=5aaaf2fb4893214fa316516f3ac43519
ruby-2.5.2.tar.bz2=e90ab127e2ac3ee1d8840835e8ba1f13
ruby-2.5.3.tar.bz2=49aea0bf56d25351ccaf938c642400df
ruby-2.5.4.tar.bz2=0c923215470f1debe593fe21e66fd37b
ruby-2.5.5.tar.bz2=8f41b5cb683d48b5cb6cdfe03d135d6b
ruby-2.5.6.tar.bz2=f2a74416ab3016434896194120796f04
ruby-2.5.7.tar.bz2=65597b69aa54bdca8745502c10349f96
ruby-2.5.8.tar.bz2=9ec96e7a590ef801ede294b6184c9c0f
ruby-2.6.0-preview1.tar.bz2=1ce507e27fa02aeb36100dabcf1da94f
ruby-2.6.0-preview2.tar.bz2=e45011116334d21857b9e1712a01e6b3
ruby-2.6.0-preview3.tar.bz2=b326ceee3d3756f892515009e148f4b2
ruby-2.6.0-rc1.tar.bz2=40457a72e36cbecd0c51d9f895347302
ruby-2.6.0-rc2.tar.bz2=9665e6d886a9da2d4076fa75836798f1
ruby-2.6.0.tar.bz2=d3372daec93f83e7a91c669821053014
ruby-2.6.1.tar.bz2=73d19ac478db1a178be5ae2f2fb8c9ec
ruby-2.6.2.tar.bz2=658fcc0da15578c2420ded807b11cce1
ruby-2.6.3.tar.bz2=52e609b756735115814b9c8463f185e2
ruby-2.6.4.tar.bz2=d9b35753c65f54c745ab6b0094511839
ruby-2.6.5.tar.bz2=d1b89c88effb71d75cd7ef77c35e1985
ruby-2.6.6.tar.bz2=abc030870bfbe18ae9c356abebd95cb6
ruby-2.7.0-preview1.tar.bz2=82fab0496947acd847a6b2eb758acfc6
ruby-2.7.0-preview2.tar.bz2=966a544ab59114591898403c23d91397
ruby-2.7.0-preview3.tar.bz2=2fa6c213774744b287e7e0212b43f626
ruby-2.7.0-rc1.tar.bz2=48a8837cb352f5b95e97a1ae0d62a9d0
ruby-2.7.0-rc2.tar.bz2=cca58fdb8c5e8be8273842d54199c42d
ruby-2.7.0.tar.bz2=89347748b7414f5bc7aeb8f4a87ebef4
ruby-2.7.1.tar.bz2=4bb2b2b2f0c6953859e30af140cf249a
ruby-2.7.2.tar.bz2=a8acc9c24708fe29dfc287823ecaae65
ruby-3.0.0-preview1.tar.gz=991df063b86a8f8412ca07f548579f39
ruby-3.0.0-preview2.tar.gz=ce14b24e923f2e269fea6441791a7248
ruby-3.0.0-rc1.tar.gz=848a8628c8abde270b66e2474049a4a3
ruby-3.0.0.tar.gz=d6af36269a1b0bc278236d371543ad97
ruby-enterprise-1.8.6-20080507.tar.gz=17e3c52e73e42809f57ad0000a6cb4ab
ruby-enterprise-1.8.6-20080621.tar.gz=626fc3811eee2dc92ac27ea63d37a8b2
ruby-enterprise-1.8.6-20080623.tar.gz=0bf8a3a93c6b37bb1260cc09b05e81fd
ruby-enterprise-1.8.6-20080624.tar.gz=de58b97128aa65209f291c66eab7c4a7
ruby-enterprise-1.8.6-20080709.tar.gz=f0ded08cec64959fa388ec6a237b9c47
ruby-enterprise-1.8.6-20080810.tar.gz=bfdcf06f437af825cd9f2d321f9d1896
ruby-enterprise-1.8.6-20081205.tar.gz=50206bec9be2e08a862e5ec2e70fa693
ruby-enterprise-1.8.6-20081215.tar.gz=aab57b7d5061c1980bec5dbe311ec9b2
ruby-enterprise-1.8.6-20090113.tar.gz=e8d796a5bae0ec1029a88ba95c5d901d
ruby-enterprise-1.8.6-20090201.tar.gz=a965e6789b553efaed72191825b13713
ruby-enterprise-1.8.6-20090421.tar.gz=c777b361aadccda7988be16ede7ab15f
ruby-enterprise-1.8.6-20090520.tar.gz=156572a8296bd0440970a6bb95018a13
ruby-enterprise-1.8.6-20090610.tar.gz=0bf66ee626918464a6eccdd83c99d63a
ruby-enterprise-1.8.7-2009.10.tar.gz=3727eef7b6b1b2f31db7d091328d966e
ruby-enterprise-1.8.7-2010.01.tar.gz=587aaea02c86ddbb87394a340a25e554
ruby-enterprise-1.8.7-2010.02.tar.gz=4df7b09c01adfd711b0ab76837611542
ruby-enterprise-1.8.7-2011.01.tar.gz=4640634347cd8e5469cb718853e2112e
ruby-enterprise-1.8.7-2011.02.tar.gz=8c5faa11c1ddaed3f44b7294711980cc
ruby-enterprise-1.8.7-2011.03.tar.gz=038604ce25349e54363c5df9cd535ec8
ruby-enterprise-1.8.7-2011.12.tar.gz=1e5f3059d52a67ab5d91d472b756de08
ruby-enterprise-1.8.7-2012.02.tar.gz=8d086d2fe68a4c57ba76228e97fb3116
ruby-enterprise-1.8.7-20090928.tar.gz=ae00018ce89d95419dfde370fcd485ac
rubygems-0.4.0.tgz=86a64616548a793e1a5f825f0dd385b9
rubygems-0.5.0.tgz=80d151edd94a06bcd2452a7e272b4d96
rubygems-0.6.0.tgz=5df803f5a04654833690dd32283de741
rubygems-0.6.1.tgz=c4a0faa9f876ad805ae80d1396a29d97
rubygems-0.7.0.tgz=ede9b55343219e8b3491793aa12c46f3
rubygems-0.8.0.tgz=9ef6e3c34dcb54e295c8e57321ddc079
rubygems-0.8.1.tgz=6276d268b420c0d61796cdbf6d28dae4
rubygems-0.8.3.tgz=6e6da80f61d6e77d0ad9e531767f6fd5
rubygems-0.8.4.tgz=a2ad2d03dae8a98002c2a7cd6c3ed352
rubygems-0.8.5.tgz=b917c084e1e6e99d8e102af8dd687ddb
rubygems-0.8.6.tgz=9de98d2f62e3f91521b0207a4dcdeb5b
rubygems-0.8.7.tgz=7fc04b9f9acc0c18cbbe6222be8d0bd3
rubygems-0.8.8.tgz=a8535e9c35a4c215d6ef9268d4bc69ed
rubygems-0.8.10.tgz=d26592e280c0fb24c51f2837c3f48e67
rubygems-0.8.11.tgz=aa363b428c4c1fc2e076a4ff77b957d7
rubygems-0.9.0.tgz=5d496e1f415b8b4033ab867f01d1161f
rubygems-0.9.1.tgz=a62314cdb174ccc88a27b8924fa79e4a
rubygems-0.9.2.tgz=cc525053dd465ab6e33af382166fa808
rubygems-0.9.3.tgz=600940a22ecd79e28e0fd37ad1f1d871
rubygems-0.9.4.tgz=b5680acaa019c80ea44fe87cc2e227da
rubygems-0.9.5.tgz=91f7036a724e34cc66dd8d09348733d9
rubygems-1.0.0.tgz=b0b74eac0cbfc5a13f895ab6f803edc1
rubygems-1.0.1.tgz=0d5851084955c327ee1dc9cbd631aa5f
rubygems-1.1.0.tgz=85f994904c5b4045f0a859b29d0be717
rubygems-1.1.1.tgz=1a77c5b6b293a3ccd5261dc120641ccc
rubygems-1.2.0.tgz=b77a4234360735174d1692e6fc598402
rubygems-1.3.0.tgz=63d3dfc038710eaf532b6a133225115a
rubygems-1.3.1.tgz=a04ee6f6897077c5b75f5fd1e134c5a9
rubygems-1.3.2.tgz=6204d0a4c526a1d8fdbce746647b179a
rubygems-1.3.3.tgz=0e9697db44d812712350baf28016b4a7
rubygems-1.3.4.tgz=b17b398503253bf36a101c58f02a226f
rubygems-1.3.5.tgz=6e317335898e73beab15623cdd5f8cff
rubygems-1.3.6.tgz=789ca8e9ad1d4d3fe5f0534fcc038a0d
rubygems-1.3.7.tgz=e85cfadd025ff6ab689375adbf344bbe
rubygems-1.4.1.tgz=e915dbf79e22249d10c0fcf503a5adda
rubygems-1.4.2.tgz=b5badb7c5adda38d9866fa21ae46bbcc
rubygems-1.5.0.tgz=49bef7186bf3c0ca6ee7adf4b585bccc
rubygems-1.5.1.tgz=47577a5e33c9c6f1e3a56aff7f51d0ff
rubygems-1.5.2.tgz=3951f94c09c16c774c8bcebc94fa5374
rubygems-1.5.3.tgz=38bbbdc17aef923fb41f054cf8421116
rubygems-1.6.0.tgz=abd27b5a9002100ff74ddb398a1c9689
rubygems-1.6.1.tgz=a77c64896aaa10d64aaf34f5c1488173
rubygems-1.6.2.tgz=0c95a9869914ba1a45bf71d3b8048420
rubygems-1.8.6.tgz=8e95d0c5b377a003f3d54a49461e81d9
rubygems-1.8.9.tgz=fc399445d693c29778779e5828ee5e90
rubygems-1.8.10.tgz=5b08ee31740c9b0bd36f6c04d537e7d4
rubygems-1.8.23.1.tgz=5259ce3eb7988950fa3aff9051a5de91
rubygems-1.8.23.2.tgz=fb377c7fd387df14a33e529153adc316
rubygems-1.8.23.tgz=178b0ebae78dbb46963c51ad29bb6bd9
rubygems-1.8.24.tgz=3a555b9d579f6a1a1e110628f5110c6b
rubygems-1.8.25.tgz=1376a258d43c53750a8df30e67853e10
rubygems-1.8.26.tgz=0ea47f1efd010f4c82b8a51a934f48dc
rubygems-1.8.27.tgz=6686ad26735c21d0d6e58b6192c7da5d
rubygems-1.8.28.tgz=2df78039f391fb1f71c02c2fc5671c94
rubygems-1.8.29.tgz=a57fec0af33e2e2e1dbb3a68f6cc7269
rubygems-2.0.0.tgz=89ce467eb2d55657e9965a46559acbcf
rubygems-2.0.1.tgz=2652ab6f001a873b8933e2ca09505974
rubygems-2.0.2.tgz=3471f140a70bcd32a7495b545cfce790
rubygems-2.0.3.tgz=854691f145cea98b4100e5b0831b73ed
rubygems-2.0.4.tgz=3ec32dbe783bab37a87f50758f8efe13
rubygems-2.0.5.tgz=641d82672937d40d664dbc18f49cdcec
rubygems-2.0.6.tgz=0633f50db16112bf6c3cf9bfb9ceb9bd
rubygems-2.0.7.tgz=9046700f1222712fedfb836fafa08c50
rubygems-2.0.8.tgz=5432214a740c0d13482e43a5328a6518
rubygems-2.0.9.tgz=bc55898247297ffa190223276b1b1bd7
rubygems-2.0.10.tgz=5457ba403cd9a5f4f5fb2ef4a2a1c03e
rubygems-2.0.11.tgz=0f28e3fde3348c0f23ceecba73a6cbef
rubygems-2.0.12.tgz=99c416517e2de1146d2c6fbb4c4c1441
rubygems-2.0.13.tgz=3970e66a670ddb6d1aade9c7b18033d4
rubygems-2.0.14.tgz=4a7aa0b144e465230ab5d7b59dfd7e8f
rubygems-2.1.0.tgz=9a9d242baef5e58fbfe79ec5206cd316
rubygems-2.1.1.tgz=b34d6f4028b69a84123a6b7cb0ac8028
rubygems-2.1.2.tgz=b5c5c4430be60f911014216d41886ef3
rubygems-2.1.3.tgz=ac7bbdfecd49f9304756aa5ebeb51400
rubygems-2.1.4.tgz=aa502b1ea90fbdd14ca9b32634795c2b
rubygems-2.1.5.tgz=60564b762d4e186815997653b1c876ab
rubygems-2.1.6.tgz=e11237a8f87dbd8c085770551d64a8f8
rubygems-2.1.7.tgz=b721ed7d5fd57ed05f77eb21a3a592ee
rubygems-2.1.8.tgz=cc4c84c0482840389a457740e8083ed9
rubygems-2.1.9.tgz=2636bf26c0a9ec889c7bd938887bd9a3
rubygems-2.1.10.tgz=6fa671d7d6605de73d16f529cf7bffb8
rubygems-2.1.11.tgz=b561b7aaa70d387e230688066e46e448
rubygems-2.2.0.rc.1.tgz=f7d80b612339169569f2675155c202f1
rubygems-2.2.0.tgz=3c16e50673adb99d1ce76d5231f764bd
rubygems-2.4.8.tgz=dc77b51449dffe5b31776bff826bf559
rubygems-2.6.10.tgz=ab5a0028d2a0653691b29d7463bd0892
rubygems-2.6.11.tgz=8d514b836fcf3ae2c20b4fe8d5cdc3c5
rubygems-2.6.12.tgz=7c454ef88b716c1a123f62b26bb9612b
rubygems-2.6.13.tgz=e6f19b51614055d826e431549a12a80b
rubygems-2.6.14.tgz=e0a6914ce03b91dfc6d448ebf292f145
rubygems-2.7.0.tgz=771c40015538c0f225c5249e4bc7d441
rubygems-2.7.1.tgz=65646f28f3c36ccaa7f991c17e15b8a9
rubygems-2.7.2.tgz=312a238ed98a61d2b3d165b790b6062b
rubygems-2.7.3.tgz=fb3a1927a1842b75677a24f48dd63ddc
rubygems-2.7.4.tgz=e9bbf5a4cc9a74293884b91f49603ea0
rubygems-2.7.5.tgz=516a4f219976003feb4b4f797cbc66b0
rubygems-2.7.6.tgz=366cea352c2b1243db726013c3d76fc4
rubygems-2.7.7.tgz=b6721f6ce4af08f68c6f513bbddfe484
rubygems-2.7.8.tgz=a3ed89a34e1ae8f9da0c620a8aa35f12
rubygems-2.7.9.tgz=173272ed55405caf7f858b6981fff526
rubygems-2.7.10.tgz=464754059d8ca01c1121a1233d866e8c
rubygems-3.0.0.tgz=3908105894e531f7ad3aceb8b41dcbcd
rubygems-3.0.1.tgz=1e8af9b87a67f15841ad2be7d5725a5f
rubygems-3.0.2.tgz=d8db1b516ae1e35b8f6f56cb526f879a
rubygems-3.0.3.tgz=b7a7dd5f85485334a6cb61b7dac20cff
rubygems-3.0.4.tgz=7d0c49077a2d19f48d88567cfa3cf17a
rubygems-3.0.5.tgz=4664467d621d719688e4778d147c306a
rubygems-3.0.6.tgz=60d84e843b131fb87c8fd67e8fac6470
truffleruby-1.0.0-rc2-linux-amd64.tar.gz=3e9afdf72f153e2f66259fc2b6fca594
truffleruby-1.0.0-rc2-macos-amd64.tar.gz=c30459287aec83548cfcb17340fa73d5
truffleruby-1.0.0-rc3-linux-amd64.tar.gz=138f6814451ce634b0fae3aca5579248
truffleruby-1.0.0-rc3-macos-amd64.tar.gz=94ed54ecb65bea2166a2159431b0362b
truffleruby-1.0.0-rc5-linux-amd64.tar.gz=9e5428611e22b093d05afebbe0ccbc2b
truffleruby-1.0.0-rc5-macos-amd64.tar.gz=b32a254fed71434c3431fb2effb35c5a
truffleruby-1.0.0-rc6-linux-amd64.tar.gz=7f394a8c7fe356b7bd36683c57f74ebd
truffleruby-1.0.0-rc6-macos-amd64.tar.gz=f033329d03f1f846d25728c2af9d7524
truffleruby-1.0.0-rc7-linux-amd64.tar.gz=184e98f2d6939f63db4b915943ff60c6
truffleruby-1.0.0-rc7-macos-amd64.tar.gz=d19213b33011f7a55e0f32d25e19184f
truffleruby-1.0.0-rc8-linux-amd64.tar.gz=a394167c0331c6d8c1123e1f992e5411
truffleruby-1.0.0-rc8-macos-amd64.tar.gz=dc1bf0fcfdd5837ae0ca56d6d6e5f7b0
truffleruby-1.0.0-rc9-linux-amd64.tar.gz=f6ec25bd532bf0551d35327d1aa4caf9
truffleruby-1.0.0-rc9-macos-amd64.tar.gz=c80a345f9071521cf1961ab75ebc7dd1
truffleruby-1.0.0-rc10-linux-amd64.tar.gz=3a889726efcdf33feb7ef3df13fd5f39
truffleruby-1.0.0-rc10-macos-amd64.tar.gz=bba618b4483b79eebf9f0e7af4078502
truffleruby-1.0.0-rc11-linux-amd64.tar.gz=a25e179ca0be96a1bc737a600729c195
truffleruby-1.0.0-rc11-macos-amd64.tar.gz=bb8d8f5525e1ba86bb039e56291c6c7c
truffleruby-1.0.0-rc12-linux-amd64.tar.gz=872774837057489250527bf863192115
truffleruby-1.0.0-rc12-macos-amd64.tar.gz=bb4a64e6c4882fd0c5e412bf9c57720b
truffleruby-1.0.0-rc13-linux-amd64.tar.gz=0f36eed2eb36846785fdd4eae24adfa0
truffleruby-1.0.0-rc13-macos-amd64.tar.gz=1bd3087a0f2df4c006b87c9488ada6d4
truffleruby-1.0.0-rc14-linux-amd64.tar.gz=9eddd1aa98c9649e7c01bb10bf28c471
truffleruby-1.0.0-rc14-macos-amd64.tar.gz=c93643f1d00b370411310ee7a1dd5330
truffleruby-1.0.0-rc15-linux-amd64.tar.gz=bc7339a6218ea991f2c72ce8759cb6e3
truffleruby-1.0.0-rc15-macos-amd64.tar.gz=1671d08dd2f5026d58b326fd55c9b7de
truffleruby-1.0.0-rc16-linux-amd64.tar.gz=5564d17f19b8ee0edb96ab5b1bfbda98
truffleruby-1.0.0-rc16-macos-amd64.tar.gz=61583b529b6a1337398b0966db952d24
truffleruby-19.0.0-linux-amd64.tar.gz=006220c7bde7d0b5c72481133624a83f
truffleruby-19.0.0-macos-amd64.tar.gz=9ef7f5a311465d35e54ac6e00ec3d169
truffleruby-19.0.2-linux-amd64.tar.gz=2f7fe574e0695fb6001f4f5282aa2f79
truffleruby-19.0.2-macos-amd64.tar.gz=aa20f76b3eac1f4976a507364201d1ad
truffleruby-19.1.0-linux-amd64.tar.gz=71368f8371069017d911528f052b0a55
truffleruby-19.1.0-macos-amd64.tar.gz=7f086adbc89fdfaed35273394ac3ac66
truffleruby-19.1.1-linux-amd64.tar.gz=c1ad4d17bb40e214b124222f3a7c6db6
truffleruby-19.1.1-macos-amd64.tar.gz=f4e76b0612319b4a82480cbd1fc90210
truffleruby-19.2.0-linux-amd64.tar.gz=458ed5fec1a849ef5b00e19b0e25d5e9
truffleruby-19.2.0-macos-amd64.tar.gz=dc324575ad20e3054980835c24ea7161
truffleruby-19.2.0.1-linux-amd64.tar.gz=ad7444145550d89931199159163077c1
truffleruby-19.2.0.1-macos-amd64.tar.gz=b5bcfb0aaded1e2d1763089ab6c9a14d
truffleruby-19.2.1-linux-amd64.tar.gz=fc4879d2b0cc22c152a8bf893a72c346
truffleruby-19.2.1-macos-amd64.tar.gz=71448ff3f8f1da086f222751d3f853bc
truffleruby-19.3.0-linux-amd64.tar.gz=dd44ac30b5a1ef3a7d61172cda9b30b6
truffleruby-19.3.0-macos-amd64.tar.gz=41daa52f0f308abb77a2b91c1b7e0f3d
truffleruby-19.3.0.2-linux-amd64.tar.gz=2db2cb5c29523c9bdb6f59dfa0bd74ce
truffleruby-19.3.0.2-macos-amd64.tar.gz=edf1603643938686dce57139aadf7d3c
truffleruby-19.3.1-linux-amd64.tar.gz=a14c028351f7a3965bcb56e9b22364de
truffleruby-19.3.1-macos-amd64.tar.gz=a8707d0af3eda694ec07a5387d3443fb
truffleruby-20.0.0-linux-amd64.tar.gz=b30110ecbc50c4fce402fdf44c45dad5
truffleruby-20.0.0-macos-amd64.tar.gz=0671e5909cefb9a2c12c473fc0110821
truffleruby-20.1.0-linux-amd64.tar.gz=4592b5fc3636d82fc998ab6fe0a43584
truffleruby-20.1.0-macos-amd64.tar.gz=3c0be43db86817c7037d3ff5053d322d
truffleruby-20.2.0-linux-amd64.tar.gz=e9859decb24829f9a189d88b3c2e9b79
truffleruby-20.2.0-macos-amd64.tar.gz=49e7ccf8f9e60d6c59b3b07b854466cf
truffleruby-20.3.0-linux-amd64.tar.gz=93a20845f7d9d39100761424dfc0a734
truffleruby-20.3.0-macos-amd64.tar.gz=b178b7a94fac58400450417612fe3441
yaml-0.1.4.tar.gz=36c852831d02cf90508c29852361d01b
zlib-1.2.3.tar.gz=debc62758716a169df9f62e6ab2bc634
zlib-1.2.5.tar.gz=c735eab2d659a96e5a594c9e8541ad63
config/known_strings000066400000014637147511530520010661 0ustar00ironruby-1.0
ironruby-1.1.3
jruby-0.9.0
jruby-0.9.1
jruby-0.9.2
jruby-0.9.8
jruby-0.9.9
jruby-1.0.0RC1
jruby-1.0.0RC2
jruby-1.0.0RC3
jruby-1.0
jruby-1.0.1
jruby-1.0.2
jruby-1.0.3
jruby-1.1b1
jruby-1.1RC1
jruby-1.1RC2
jruby-1.1RC3
jruby-1.1
jruby-1.1.1
jruby-1.1.2
jruby-1.1.3
jruby-1.1.4
jruby-1.1.5
jruby-1.1.6RC1
jruby-1.1.6
jruby-1.2.0RC1
jruby-1.2.0RC2
jruby-1.2.0
jruby-1.3.0RC1
jruby-1.3.0RC2
jruby-1.3.0
jruby-1.3.1
jruby-1.4.0RC1
jruby-1.4.0RC2
jruby-1.4.0RC3
jruby-1.4.0
jruby-1.4.1
jruby-1.5.0.RC1
jruby-1.5.0.RC2
jruby-1.5.0.RC3
jruby-1.5.0
jruby-1.5.1
jruby-1.5.2
jruby-1.5.3
jruby-1.5.4
jruby-1.5.5
jruby-1.5.6
jruby-1.6.0.RC1
jruby-1.6.0.RC2
jruby-1.6.0.RC3
jruby-1.6.0
jruby-1.6.1
jruby-1.6.2
jruby-1.6.3
jruby-1.6.4
jruby-1.6.5
jruby-1.6.5.1
jruby-1.6.7
jruby-1.6.7.2
jruby-1.6.8
jruby-1.7.0.preview1
jruby-1.7.0.preview2
jruby-1.7.0.RC1
jruby-1.7.0.RC2
jruby-1.7.0
jruby-1.7.1
jruby-1.7.2
jruby-1.7.3
jruby-1.7.4
jruby-1.7.5
jruby-1.7.6
jruby-1.7.7
jruby-1.7.8
jruby-1.7.9
jruby-1.7.10
jruby-1.7.11
jruby-1.7.12
jruby-1.7.13
jruby-1.7.14
jruby-1.7.15
jruby-1.7.16
jruby-1.7.16.1
jruby-1.7.16.2
jruby-1.7.17
jruby-1.7.18
jruby-1.7.19
jruby-1.7.20
jruby-1.7.20.1
jruby-1.7.21
jruby-1.7.22
jruby-1.7.23
jruby-1.7.24
jruby-1.7.25
jruby-1.7.26
jruby-1.7.27
jruby-9.0.0.0.pre1
jruby-9.0.0.0.pre2
jruby-9.0.0.0.rc1
jruby-9.0.0.0.rc2
jruby-9.0.0.0
jruby-9.0.1.0
jruby-9.0.2.0
jruby-9.0.3.0
jruby-9.0.4.0
jruby-9.0.5.0
jruby-9.1.0.0
jruby-9.1.1.0
jruby-9.1.2.0
jruby-9.1.3.0
jruby-9.1.4.0
jruby-9.1.5.0
jruby-9.1.6.0
jruby-9.1.7.0
jruby-9.1.8.0
jruby-9.1.9.0
jruby-9.1.10.0
jruby-9.1.11.0
jruby-9.1.12.0
jruby-9.1.13.0
jruby-9.1.14.0
jruby-9.1.15.0
jruby-9.1.16.0
jruby-9.1.17.0
jruby-9.2.0.0
jruby-9.2.1.0
jruby-9.2.2.0
jruby-9.2.3.0
jruby-9.2.4.0
jruby-9.2.4.1
jruby-9.2.5.0
jruby-9.2.6.0
jruby-9.2.7.0
jruby-9.2.8.0
jruby-9.2.9.0
jruby-9.2.10.0
jruby-9.2.11.0
jruby-9.2.11.1
jruby-9.2.12.0
jruby-9.2.13.0
jruby-9.2.14.0
macruby-0.12
maglev-1.0.0
maglev-1.1beta
maglev-1.1beta2
maglev-1.1RC1
maglev-1.2Alpha
maglev-1.2Alpha2
maglev-1.2Alpha3
maglev-1.2Alpha4
mruby-1.0.0
mruby-1.1.0
mruby-1.2.0
mruby-1.3.0
mruby-1.4.0
mruby-1.4.1
mruby-2.0.0
mruby-2.0.1
mruby-2.1.0-rc
mruby-2.1.0
mruby-2.1.1-rc
mruby-2.1.1-rc2
mruby-2.1.1
rbx-1.0.0-20100514
rbx-1.0.1-20100603
rbx-1.1.0-20100923
rbx-1.1.1-20101116
rbx-1.2.0-20101221
rbx-1.2.1-20110215
rbx-1.2.2-20110222
rbx-1.2.3-20110315
rbx-1.2.4-20110705
rbx-1.3.2
rbx-1.3.3
rbx-1.4.1
rbx-1.4.3
rbx-2.0.0
rbx-2.1.0
rbx-2.1.1
rbx-2.2.0
rbx-2.2.2
rbx-2.2.3
rbx-2.2.4
rbx-2.2.5
rbx-2.2.6
rbx-2.2.7
rbx-2.2.8
rbx-2.2.9
rbx-2.2.10
rbx-2.3.0
rbx-2.4.0
rbx-2.4.1
rbx-2.5.0
rbx-2.5.1
rbx-2.5.2
rbx-2.5.3
rbx-2.5.4
rbx-2.5.5
rbx-2.5.6
rbx-2.5.7
rbx-2.5.8
rbx-3.70
rbx-3.71
rbx-3.72
rbx-3.73
rbx-3.74
rbx-3.75
rbx-3.76
rbx-3.77
rbx-3.78
rbx-3.79
rbx-3.80
rbx-3.81
rbx-3.82
rbx-3.83
rbx-3.84
rbx-3.85
rbx-3.86
rbx-3.87
rbx-3.88
rbx-3.89
rbx-3.90
rbx-3.91
rbx-3.92
rbx-3.93
rbx-3.94
rbx-3.95
rbx-3.96
rbx-3.97
rbx-3.98
rbx-3.99
rbx-3.100
rbx-3.101
rbx-3.102
rbx-3.103
rbx-3.104
rbx-3.105
rbx-3.106
rbx-3.107
rbx-4.0
rbx-4.1
rbx-4.2
rbx-4.3
rbx-4.4
rbx-4.5
rbx-4.6
rbx-4.7
rbx-4.8
rbx-4.9
rbx-4.10
rbx-4.11
rbx-4.12
rbx-4.13
rbx-4.14
rbx-4.15
rbx-4.16
rbx-4.17
rbx-4.18
rbx-4.19
rbx-4.20
rbx-5.0
ree-1.8.6-20080507
ree-1.8.6-20080621
ree-1.8.6-20080623
ree-1.8.6-20080624
ree-1.8.6-20080709
ree-1.8.6-20080810
ree-1.8.6-20081205
ree-1.8.6-20081215
ree-1.8.6-20090113
ree-1.8.6-20090201
ree-1.8.6-20090421
ree-1.8.6-20090520
ree-1.8.6-20090610
ree-1.8.6-20090928
ree-1.8.7-2009.10
ree-1.8.7-2010.01
ree-1.8.7-2010.02
ree-1.8.7-2011.01
ree-1.8.7-2011.02
ree-1.8.7-2011.03
ree-1.8.7-2011.12
ree-1.8.7-2012.02
ruby-1.8.5-p115
ruby-1.8.5-p231
ruby-1.8.6-p286
ruby-1.8.6-p287
ruby-1.8.6-p369
ruby-1.8.6-p383
ruby-1.8.6-p398
ruby-1.8.6-p399
ruby-1.8.6-p420
ruby-1.8.7-p160
ruby-1.8.7-p174
ruby-1.8.7-p248
ruby-1.8.7-p249
ruby-1.8.7-p299
ruby-1.8.7-p302
ruby-1.8.7-p330
ruby-1.8.7-p334
ruby-1.8.7-p352
ruby-1.8.7-p357
ruby-1.8.7-p358
ruby-1.8.7-p370
ruby-1.8.7-p371
ruby-1.8.7-p374
ruby-1.9.0
ruby-1.9.1-p129
ruby-1.9.1-p243
ruby-1.9.1-p376
ruby-1.9.1-p378
ruby-1.9.1-p429
ruby-1.9.1-p431
ruby-1.9.2-p0
ruby-1.9.2-p136
ruby-1.9.2-p180
ruby-1.9.2-p290
ruby-1.9.2-p318
ruby-1.9.2-p320
ruby-1.9.2-p330
ruby-1.9.3-preview1
ruby-1.9.3-rc1
ruby-1.9.3-p0
ruby-1.9.3-p125
ruby-1.9.3-p194
ruby-1.9.3-p286
ruby-1.9.3-p327
ruby-1.9.3-p362
ruby-1.9.3-p374
ruby-1.9.3-p385
ruby-1.9.3-p392
ruby-1.9.3-p429
ruby-1.9.3-p448
ruby-1.9.3-p484
ruby-1.9.3-p545
ruby-1.9.3-p547
ruby-1.9.3-p550
ruby-1.9.3-p551
ruby-2.0.0-preview1
ruby-2.0.0-preview2
ruby-2.0.0-rc1
ruby-2.0.0-rc2
ruby-2.0.0-p0
ruby-2.0.0-p195
ruby-2.0.0-p247
ruby-2.0.0-p353
ruby-2.0.0-p451
ruby-2.0.0-p481
ruby-2.0.0-p576
ruby-2.0.0-p594
ruby-2.0.0-p598
ruby-2.0.0-p643
ruby-2.0.0-p645
ruby-2.0.0-p647
ruby-2.0.0-p648
ruby-2.1.0-preview1
ruby-2.1.0-preview2
ruby-2.1.0-rc1
ruby-2.1.0
ruby-2.1.1
ruby-2.1.2
ruby-2.1.3
ruby-2.1.4
ruby-2.1.5
ruby-2.1.6
ruby-2.1.7
ruby-2.1.8
ruby-2.1.9
ruby-2.1.10
ruby-2.2.0-preview1
ruby-2.2.0-preview2
ruby-2.2.0-rc1
ruby-2.2.0
ruby-2.2.1
ruby-2.2.2
ruby-2.2.3
ruby-2.2.4
ruby-2.2.5
ruby-2.2.6
ruby-2.2.7
ruby-2.2.8
ruby-2.2.9
ruby-2.2.10
ruby-2.3.0-preview1
ruby-2.3.0-preview2
ruby-2.3.0
ruby-2.3.1
ruby-2.3.2
ruby-2.3.3
ruby-2.3.4
ruby-2.3.5
ruby-2.3.6
ruby-2.3.7
ruby-2.3.8
ruby-2.4.0-preview1
ruby-2.4.0-preview2
ruby-2.4.0-preview3
ruby-2.4.0-rc1
ruby-2.4.0
ruby-2.4.1
ruby-2.4.2
ruby-2.4.3
ruby-2.4.4
ruby-2.4.5
ruby-2.4.6
ruby-2.4.7
ruby-2.4.8
ruby-2.4.9
ruby-2.4.10
ruby-2.5.0-preview1
ruby-2.5.0-rc1
ruby-2.5.0
ruby-2.5.1
ruby-2.5.2
ruby-2.5.3
ruby-2.5.4
ruby-2.5.5
ruby-2.5.6
ruby-2.5.7
ruby-2.5.8
ruby-2.6.0-preview1
ruby-2.6.0-preview2
ruby-2.6.0-preview3
ruby-2.6.0-rc1
ruby-2.6.0-rc2
ruby-2.6.0
ruby-2.6.1
ruby-2.6.2
ruby-2.6.3
ruby-2.6.4
ruby-2.6.5
ruby-2.6.6
ruby-2.7.0-preview1
ruby-2.7.0-preview2
ruby-2.7.0-preview3
ruby-2.7.0-rc1
ruby-2.7.0-rc2
ruby-2.7.0
ruby-2.7.1
ruby-2.7.2
ruby-3.0.0-preview1
ruby-3.0.0-preview2
ruby-3.0.0-rc1
ruby-3.0.0
truffleruby-1.0.0-rc2
truffleruby-1.0.0-rc3
truffleruby-1.0.0-rc5
truffleruby-1.0.0-rc6
truffleruby-1.0.0-rc7
truffleruby-1.0.0-rc8
truffleruby-1.0.0-rc9
truffleruby-1.0.0-rc10
truffleruby-1.0.0-rc11
truffleruby-1.0.0-rc12
truffleruby-1.0.0-rc13
truffleruby-1.0.0-rc14
truffleruby-1.0.0-rc15
truffleruby-1.0.0-rc16
truffleruby-19.0.0
truffleruby-19.0.2
truffleruby-19.1.0
truffleruby-19.1.1
truffleruby-19.2.0
truffleruby-19.2.0.1
truffleruby-19.2.1
truffleruby-19.3.0
truffleruby-19.3.0.2
truffleruby-19.3.1
truffleruby-20.0.0
truffleruby-20.1.0
truffleruby-20.2.0
truffleruby-20.3.0
config/sha512000066400001104527147511530520006756 0ustar00GemStone-27184.Darwin-i386.tar.gz=02126a9fc4a8d32fd797bc2c95ecf451bc9f400857d1fef26257e404328bf5b224335cf7499a322daf74776a26070f08462b0fad8f58e62950f0c640f6aaa62b
GemStone-27184.Linux-x86_64.tar.gz=55eabbb0378784a734ac5af3d42fd80c0793ef4cca4dc9572c51198292d2dab5159191d82429c6a00e7193b1e3ade41f845373a2bfc056edc0f8eb496034347f
GemStone-29516.Darwin-i386.tar.gz=2f09cfc1a90f298577bd016fa7690eebdfe0a166443db1f1e9156e177cdab4feda5548f5833a98578b9e90e7af3d81af7c63b67b69531a8f8ab8aec12c0678f7
GemStone-29516.Linux-x86_64.tar.gz=35738d619f731706b15f7dd8ea40ac1ebf2903e14951121d26e36aa7947f309280897f8d5918202d89acfe27b1781581fe851a5b6109294a54b46f9d9e6585c8
GemStone-29639.Darwin-i386.tar.gz=cda54b3584f2615268e357a35341e946da10f1185003825a881b3d758be82b8f9cefece35272b8167cd24ea2c560f765d806710de04cd2437d8c96f7025a626a
GemStone-29639.Linux-x86_64.tar.gz=38340117d4ab6a99135dafec761bbe5e3f1c7483a446b7c7d53465296167e11829ea6685c553c6ebc08d96c96884fec4093b19209ca5b7f91fcd47fb1776be9c
GemStone-29699.Darwin-i386.tar.gz=400c3b10b94096d787d56cf1e6c19a60981d78698e1af3f4b2ca5283517e6b69d0fc02e47483434e9283a71d731d2e317ffa8c8b82a888650d225c1df1d32134
GemStone-29699.Linux-x86_64.tar.gz=cdddabde773ffa9e986b24372fa3e42f856eb2a2ca4f0ab5ea71bdbe433d48ba852f5f7630a2fc869c60cbc0c6391dfafd4c6f3a92ac76728a0f6305f8c4818e
GemStone-30086.Darwin-i386.tar.gz=fa70ed2f9d13a6277a26f81fd86ed5d084b6a565c257c4856425dd95bb825762d0d91e4122dccb0377dc2b1d2edfdbd2643fac52d5393961fbe435159b5a1f2f
GemStone-30086.Linux-x86_64.tar.gz=129db8ab883b95b42f2eee2ec33f136fce049ec24e6741b949178a30a21e7b81731c2e3425b000894aec242ed41058497aec308b18610d4b4a06c3ae8ec0e1a0
GemStone-30246.Darwin-i386.tar.gz=57d6e1fc5b52ea29c315f3ea9640fa1599e6a3a2749b2c444a214210403ee3fe7e15332fd907a5bb2795d7d25e865b4e95d30823cbd097b286bb07f54562901b
GemStone-30246.Linux-x86_64.tar.gz=66d2ae5646cfe7112cd3a5600b6fd4a32db211b5e624203cb6b0c43605aad1776ab508b29db07ef5346530733d9143e1edcb01c2fde6e2ef25052fea65b4c2f8
GemStone-30441.Darwin-i386.tar.gz=a9fbd5b7809e5df20f98df4ff22355979d6dd647f737af82befe5a2163a3909a2e1f50fd3d991b5f2b5292fc759068a9e658cb98b8ee65d514c89f7da6e27967
GemStone-30441.Linux-x86_64.tar.gz=297eea1e8550cb97a6a904563a13bab1c3cc148bebb9a996b65457d192cbe35949d93a7f1829d408d9d552e2dcbde61ab756cc0108a3642cfaae0b07d732f915
GemStone-30866.Darwin-i386.tar.gz=b4826b2a25b2f996addd6b7b32b97a122533579671d47dcaaa8a1e919c1096e657e216145a547ecbb866c41823e6cfa27e6ee2342e09f4eb3fd9dd8064cda2d2
GemStone-30866.Linux-x86_64.tar.gz=2faaf102509f962d2edf67188184499cde4a57320fb301fe37308383302a2bd22a63aac922f032d19348aed2d0f015cb2654b69cd30a1e8becbbe24f59acaa5a
GemStone-34619.Darwin-i386.tar.gz=d3b3b3582ee0253cbfcbf82347893708e9901dff712bc038b6c2e6fab26921523e68de95c2288c5634abb01e334bd32ad23d6f572f74d8dd556bca1ff6c46714
GemStone-34619.Linux-x86_64.tar.gz=c6d32822a2228c94bb1b476cd64d9db42d423abdbbfc5ab03b670338a734dc5a5180afb9fec3a87bdffd2d53d8d8c4e8f09da5909fdce7290aaa9ea5c5b41264
GemStone-36816.Darwin-i386.tar.gz=d597b8448856ddc406b6d5ff741d484ec545afaab5e96db154a7b6c3ff5e2b31e52611e23a9457a1b290f7cd81828b769c855e945c9a11ea3b6b4679dd2e100a
GemStone-36816.Linux-x86_64.tar.gz=8a9a90c07f1a5309b259ee95c78a702256e85f600fcb9fa56386135d5b3218dfa97bc22af07683e363cf33ef894dd970b2e475814846302d553279e05a4eaae9
GemStone-36916.Darwin-i386.tar.gz=9e2a888e14f742825d35f160c4d22bce2886c3f30ce680650c97bdac76acd068b63af50daa098c94e6f48d36f097d1a020ea7a03d59f121196f6c703041a3ea5
GemStone-36916.Linux-x86_64.tar.gz=e2b87ae307322eabad8169963ce3fa6091e6da79ee2fec9c8d81eae20edac8873698e8b73a74b6dee29a1c9bdf00848f723129cca03a30c82cc4484ffba43cc1
GemStone-36962.Darwin-i386.tar.gz=c654583ad3aeb175fa88dd304d46dc3f3a3701a2b994a1c2df7a7fa40f0733f6bc6031f1906e889a4e6ea5f53f57b63f7ebfe6bd944177b25f3788dc2a4b71f5
GemStone-36962.Linux-x86_64.tar.gz=d5a5abde66040589214b338b7aa33c448006e3c9053078b1a5fc1a0a11292a3a2305378b5a6a85e0b407f258af967c374ea3eda7e792b0abfcbe634ec1483275
https://dl.fedoraproject.org/pub/epel/5/i386/epel-release-5-4.noarch.rpm=2f177390baaff9f8edd4d596c6cf73f77817e44bbcb2ee7e6064dc4cde190ae5a8497aebb245c49380fe1b63fd0ebce33d0eab3ad2b2f681d7b2620cf3a71b48
https://dl.fedoraproject.org/pub/epel/6/i386/epel-release-6-8.noarch.rpm=9b87357849b7d3bc464cd6098518ee3cfd6009111b630d342faaa462e21cad9cc480b8cb2b42a065aaac0108d24f5fe43a0ac487876a6cf88bd29baa87015c8e
https://dl.fedoraproject.org/pub/epel/RPM-GPG-KEY-EPEL-5=face1d4eb6775306afb15244efa4a835ee7c0b491dddbcda55d9640287f293a6527743ffbb8a6964cd80ce255e23ca84588e98a6a129288c51fbeadc1bea095d
https://dl.fedoraproject.org/pub/epel/RPM-GPG-KEY-EPEL-6=c38c8888846069c996d0d5fdfb8a62ade947195253cfbb9732ae08542e74691cd2c96993b2d4a342bed6b83fe1259fcc5b1c024f633849d4d4a1ecada67d6625
https://rvm_io.global.ssl.fastly.net/binaries/amazon/2/x86_64/ruby-2.4.0.tar.bz2=16cee181e353f454698f1540548acf7199a0fc48ba71b16415cb0e003e9f54d6622f7688ef8e53a60cb021f12c750cc19752dd7b533a4fa2236e8f524c62869d
https://rvm_io.global.ssl.fastly.net/binaries/amazon/2/x86_64/ruby-2.4.1.tar.bz2=1080a19d0087b8c0a917bc412467d8432a9852e5b9e7bd5e218c6d6caa056c57543644949d39b45571899a4b000e7217616566727d2e3a46c35980e7c24d35c9
https://rvm_io.global.ssl.fastly.net/binaries/amazon/2/x86_64/ruby-2.4.2.tar.bz2=eb299d94caeb59b4cf915355846873f9c67166d94444de62dc53ec435ba0ae4a7ced44a0d632f7317473f56f7664b2cc4e636b7d3ec0637c6b3873c55bc8bc0f
https://rvm_io.global.ssl.fastly.net/binaries/amazon/2/x86_64/ruby-2.4.3.tar.bz2=e29ba7d685a70b373b1434e552c33e330e979db9fe7ec88a9be1949c2b84fa03a44a135c07bae26427120a0102ddfec8711494349b16421883a159a95bedaa5b
https://rvm_io.global.ssl.fastly.net/binaries/amazon/2/x86_64/ruby-2.4.4.tar.bz2=416df41c77836cd298d6ad02dda9f5152ca8d4785a4db0248f4040127b3de7196bd8a50a50300e3ead7ab5ddb7887beb64199088ff005e8e3c53a4f0f620f60d
https://rvm_io.global.ssl.fastly.net/binaries/amazon/2/x86_64/ruby-2.4.5.tar.bz2=c0f28a5754e093b8fb28f427d32395dfad71110d9753658f68d7444f46a2bb027ccd79fb116cce8be1420bf339e596f7700b6cc2cc5a8722ef651e973da9ed80
https://rvm_io.global.ssl.fastly.net/binaries/amazon/2/x86_64/ruby-2.4.6.tar.bz2=9f92ddef878c5b5ff3a8a64d82e2889e475e209df8440fc901560f99b59aa332b9112ac876f83197b7db545bf42d10d5b75541d5fe2e2ded7f11911929e0696a
https://rvm_io.global.ssl.fastly.net/binaries/amazon/2/x86_64/ruby-2.4.7.tar.bz2=f00b225ec86206115910b1b847d44f6ed0dc4797be91bdf2e35bf9a55cbabf60898608b0e32fc7c2e13d31679010703d45c1b16cf217eecf70d42232d19c7ada
https://rvm_io.global.ssl.fastly.net/binaries/amazon/2/x86_64/ruby-2.4.8.tar.bz2=f2a278e5142509c38e6fbf01f9fd070556c40c1d67b489f136424e7e61732d1f84f96f8cbf55c471f0f4ca7b101150a961efe54e8cb466d2c2fd186ec0cfa4e9
https://rvm_io.global.ssl.fastly.net/binaries/amazon/2/x86_64/ruby-2.4.9.tar.bz2=0059f92ac83cb42223849d89a0a5d47375b11e2c2d8d86a8d5372a0fd9d0f4a993257a5f9ea40d00843a663295fe1dfb04d3304f21ef4cba4264f4ac41fb91eb
https://rvm_io.global.ssl.fastly.net/binaries/amazon/2/x86_64/ruby-2.4.10.tar.bz2=af7f738b4ed3bf7b7c939e4fbccd296e6a59dce4a851de4ddcb23e9de4de8af68dd43754b2ca354ac4131d053e0dfd7a065cebc8f7031702e9eed15a6d605449
https://rvm_io.global.ssl.fastly.net/binaries/amazon/2/x86_64/ruby-2.5.0.tar.bz2=4b43e1900ee653ec1c37dda01a5dcebebacb8eb07208b046bbecc76d33274e9728134269faee5161e1ca9b7cace962d45f61713f70349a9eda8b32adfec70ce7
https://rvm_io.global.ssl.fastly.net/binaries/amazon/2/x86_64/ruby-2.5.1.tar.bz2=f3f20d23b2970fd3c92762b91b812c7b582df67dd204266c489a82d4e89a2245f5a9f8c8a87a15fab2912a1a3a720af98a623f01c955f0088a1b7c8b9bbcda18
https://rvm_io.global.ssl.fastly.net/binaries/amazon/2/x86_64/ruby-2.5.2.tar.bz2=ef3e567a31b2f69c00a2b2c289d8eefc2c3f30d03b39202c1e0c6380d0fb4f327f96815905e2360ee7b7fc945420d80282ef8b9477d7d3f4d72de7f0554b96ee
https://rvm_io.global.ssl.fastly.net/binaries/amazon/2/x86_64/ruby-2.5.3.tar.bz2=4a43ecbb80a85d7a9fc50ff38c055cac5e4a901e649a4a6662716e5d7cc0176d4381527ab2526badae724628070e33256cb3a673e0de3c63540a3244d54a06da
https://rvm_io.global.ssl.fastly.net/binaries/amazon/2/x86_64/ruby-2.5.4.tar.bz2=73430af6abe655bb1a032ad9610b27e7cab060833c561d01a8d9709adb60b427623343bbc92f4ce9a7598e32f309b34dc07513aae738c9f1737a72e4bcd41d5b
https://rvm_io.global.ssl.fastly.net/binaries/amazon/2/x86_64/ruby-2.5.5.tar.bz2=d06abb58721c59a715d6b039d9eeb7a7317903b93377186b174a00284a16b4c725c6d6107bc3404536ca930e687bd560377e1f73012ac79e2e2f0f7268cce63d
https://rvm_io.global.ssl.fastly.net/binaries/amazon/2/x86_64/ruby-2.5.6.tar.bz2=7be8a0219bed86028b1bd4ec01715ece304403e5c907cda044e905c47333d7503d02dbbbbc168493377fbbf51446fec66e31256581bbe58abaf4ae262c18deab
https://rvm_io.global.ssl.fastly.net/binaries/amazon/2/x86_64/ruby-2.5.7.tar.bz2=6db505330a993a0a6d9d5ace93187efdc6f8bb54d28bb522a6d098d3098bb8395cd8b6105e4a30ed5a80a591ea2772d3bc717579b5e46333825bc010e4d246b8
https://rvm_io.global.ssl.fastly.net/binaries/amazon/2/x86_64/ruby-2.5.8.tar.bz2=29a75c2d422dbfdaf1218ff513c73231b8bb2ed99e11432d9df08a11cd3a10477dd2b894cda8ba6de8275771d2652e695bd605cd4f43793de1cbf2b0a6ccd18f
https://rvm_io.global.ssl.fastly.net/binaries/amazon/2/x86_64/ruby-2.6.0.tar.bz2=6b4f4b3c76939123c3907d833e95737bedfdc5291802336bdb77aaa0df3f8c66f00c96f8091fef689afa88a68a53bdaec87c816479d7eb3d539d139f595ff00e
https://rvm_io.global.ssl.fastly.net/binaries/amazon/2/x86_64/ruby-2.6.1.tar.bz2=a26de96951bc113001711bb161150d0790e95ced40492d4ce23e4a6c1ca703a622c6ba83a0034d64fc15c1104d4aa56ddfec54fe09ca633497202892950c5449
https://rvm_io.global.ssl.fastly.net/binaries/amazon/2/x86_64/ruby-2.6.2.tar.bz2=983f34a367325c3e401bea56cab2d725703cbb15cdd4f7904ba4aa9e124ad41caf6f0a4e1cd047597b12bb3d85e22230e6df3b9997b0353deaae134ad6237795
https://rvm_io.global.ssl.fastly.net/binaries/amazon/2/x86_64/ruby-2.6.3.tar.bz2=94573b033560609a51bf44858ce4153fea2a4e95bee51a2dcda402d53c7c572346b9a9a7456e34301dd7d73d7b9ef16ae71e0002c6346af215df11d4d21410e4
https://rvm_io.global.ssl.fastly.net/binaries/amazon/2/x86_64/ruby-2.6.4.tar.bz2=cf471d6ae19a7efdab483bf767ca268335a6741f7dd9c81a9b3b3c5e6d5e4a7cf01d66a666028639c705ee85b85b4e34dc80b16ac0c713a407ec80ec2509b2e6
https://rvm_io.global.ssl.fastly.net/binaries/amazon/2/x86_64/ruby-2.6.5.tar.bz2=d67cc932309b81454bfef10afb7ef578c5312028d8657495743a572eb431ae08ed70e0def5e4ffc640ef50574a428164f67c498fee788032615260249fb0ba73
https://rvm_io.global.ssl.fastly.net/binaries/amazon/2/x86_64/ruby-2.6.6.tar.bz2=b9a2d61e8f85bb8780871fbe051b6226bf179f670fdb197642002489fb23a6e2b90eccecc0effe1ab593d36b0059b69ba5045d5e55d58c1a712091caaa3e2fdf
https://rvm_io.global.ssl.fastly.net/binaries/amazon/2/x86_64/ruby-2.7.0.tar.bz2=68a719597f42f974819708a48bd3a45e0d76d92b3bcda3fd3d87c1100c9209027c4973d607ef3d2e5cfee3be4bb70846b300f74452945c2d9f16be28e18b5065
https://rvm_io.global.ssl.fastly.net/binaries/amazon/2/x86_64/ruby-2.7.1.tar.bz2=3817ab89d3beefbba2caa41a02282b22c04b666a312594d0b2a37acd69828a20a9caa308c5f7f2da8b6d4e1a081a3697498719934b178fd8c793166cdfe5ddb5
https://rvm_io.global.ssl.fastly.net/binaries/amazon/2/x86_64/ruby-2.7.2.tar.bz2=4a24d4baaf4f0e0ca1adad5a76b5eb98955ae5445653bdbc12e0754ad518219a23059b714504df1487efec30642948a3f5727ea5c513ca9de1234974c7439392
https://rvm_io.global.ssl.fastly.net/binaries/amazon/2/x86_64/ruby-3.0.0-preview1.tar.bz2=ab84066d5959735f175b0e5ec98b4ecc0f2aef0323bcd750c3889da327c164f06fb5f42b2b29f1835820260852e9fc7eaf99bcd0191336e259f1c34918d563cd
https://rvm_io.global.ssl.fastly.net/binaries/amazon/2013.03/x86_64/ruby-1.9.3-p448.tar.bz2=2e7bc5f6d501928f01de2a6d9035f56f40678d410bc0629ef00e0e70565b49991c4570f19c34faa1bfef2ad4cb460e4c28ee2eaf5c0696a403d0847f17d4c22a
https://rvm_io.global.ssl.fastly.net/binaries/amazon/2013.03/x86_64/ruby-2.0.0-p247.tar.bz2=6929240b591970249153fd7cb9aae47821a3efe60cdda3bfacc334cd7301635d6b71bdbd5e122b5e17d02559b6bad8711ecfbf38aa6f947ed28b5b1154a38efd
https://rvm_io.global.ssl.fastly.net/binaries/amazon/2018.03/x86_64/ruby-2.4.0.tar.bz2=ba4cd3c2a4c64e372fb2baba10be8d4e6757f1264e8153fd26810d9b1c6f5714c2465ca372522395269a3841dbfd1b060cc6e1080d3caaa54b14c8a59dc6a24b
https://rvm_io.global.ssl.fastly.net/binaries/amazon/2018.03/x86_64/ruby-2.4.1.tar.bz2=59ec83fce87794ca3cd0600f3fab4fc46ac0f4858ff2b0264c177bda418264174d6d7a36083addadba54a2b981ef971698f30bdf77a7312e473c372ef63acc6e
https://rvm_io.global.ssl.fastly.net/binaries/amazon/2018.03/x86_64/ruby-2.4.2.tar.bz2=2da4d5494519230b1e3951a17e1bb937f443dc7f0a6f058512fbd2be386e150ee7396493c27af554515ea0fb5ddb5426dc679025f253d8c435d7f95aab8955a1
https://rvm_io.global.ssl.fastly.net/binaries/amazon/2018.03/x86_64/ruby-2.4.3.tar.bz2=03144d9ed9ead5f2b85b7185cff806e120e5972f79b249d7792b1822374de7a067d5c3705b4131d5898e4f915ef38eacebc5542f29c8b3d5790b6505a654469c
https://rvm_io.global.ssl.fastly.net/binaries/amazon/2018.03/x86_64/ruby-2.4.4.tar.bz2=bda50a28f33133c5d8422a91f9bb105cc2c4127dae2dc6bbf267210a3428e7015c93b09ca82dce380e83aa64ec428fcd3e661d3da49bcd051faf3129a09601e7
https://rvm_io.global.ssl.fastly.net/binaries/amazon/2018.03/x86_64/ruby-2.4.5.tar.bz2=6a2857e4a49ea3253b8600f4bf45b7b46c5b6c33871e17ee84825e0ab5665535bcb7e926cae1506a889715bebab7cc14bb9ee1de4002aa02694a0660e4720b8b
https://rvm_io.global.ssl.fastly.net/binaries/amazon/2018.03/x86_64/ruby-2.4.6.tar.bz2=c478ff01c77953742a9d6d8410ebbed2565289f85780951b70d7c7b040e4f280db5da467605bd0266edc4a891e90a31d9b99eefa778c3bee869b5144c763faec
https://rvm_io.global.ssl.fastly.net/binaries/amazon/2018.03/x86_64/ruby-2.4.7.tar.bz2=0429550ec3efc0d4bc291fea0309661b32d2f3666d4fafc9f7e5bfeb13dafada37d6a8482f0b887816d3d582a3c555a32c1ef73988b1f47c8f0701b12298bd51
https://rvm_io.global.ssl.fastly.net/binaries/amazon/2018.03/x86_64/ruby-2.4.8.tar.bz2=6c8cd7c457d4e7cc144f51d55b339f05092106c71f398b4db7ed3e294e55f7139bceadf170974eeb08607194e1c43fa6defb8b77ad910a573cda81eff205b5ea
https://rvm_io.global.ssl.fastly.net/binaries/amazon/2018.03/x86_64/ruby-2.4.9.tar.bz2=add41021a14bbaf05316b00a9e9d37155c830cb2b99f4bb212764aa0927d207e353236c35678432669a2d5562c8768b6fb63110a33273dfb797242ab31b98894
https://rvm_io.global.ssl.fastly.net/binaries/amazon/2018.03/x86_64/ruby-2.4.10.tar.bz2=e7dc581ea1f0d60c0ccad9105a790a922c4a8747d74946fdca362bf44c6a5cd226b3e58b959e42b1d3ab9b0c3b8f3cd3e4aafdb074c420f37dbe7efd8649cb18
https://rvm_io.global.ssl.fastly.net/binaries/amazon/2018.03/x86_64/ruby-2.5.0.tar.bz2=ab993e1bc73ed7fc106c05ebdbcf202c0d6d210739a504762c511ec8d468bd4a2034054b7843451d645094e1d0b19c79f9e83253dc949f4a786212a2e47cad80
https://rvm_io.global.ssl.fastly.net/binaries/amazon/2018.03/x86_64/ruby-2.5.1.tar.bz2=4eeaa5d13432f8e6d02a6947d3f5dfdb5470e960a7139fa686ee708184b61d74a05bf74b34cb7408867f8085bec5d8521c1772d8761a4ae2e9b1d9631f7e953d
https://rvm_io.global.ssl.fastly.net/binaries/amazon/2018.03/x86_64/ruby-2.5.2.tar.bz2=e65266b821d7cb167624108df832358905cf1e520b2f1b0e1ec55d82bf149bf783ecc589889d58180786114702acaa6f4354bf15080dd740a6c88a7ca594cfa1
https://rvm_io.global.ssl.fastly.net/binaries/amazon/2018.03/x86_64/ruby-2.5.3.tar.bz2=1e8df4367b81e591f349d8d78cd321fd72bc908de5cd1b5f29211ce75bae6d3943f6c04f7223a6025c3250eeaf4f3fd1143c5bf41acbe574c516e5fc6468212a
https://rvm_io.global.ssl.fastly.net/binaries/amazon/2018.03/x86_64/ruby-2.5.4.tar.bz2=3e9adaa23225d44bee6f14ae968856bf22dfc9e9b834de4dffa664a836b47754cbbd3d378e14120e0dfb9bacbba5ed7a18c0a7315f371d37b1c05cece343fd38
https://rvm_io.global.ssl.fastly.net/binaries/amazon/2018.03/x86_64/ruby-2.5.5.tar.bz2=eaa3b71951a09c0805a012e4465f81bad629d1924823f01c72f776ac04b9aae89e2cc9ebd3e809ec4f9793b4d0aa787e96716fa024a904c65ea700e1a5f5298c
https://rvm_io.global.ssl.fastly.net/binaries/amazon/2018.03/x86_64/ruby-2.5.6.tar.bz2=21c26e7c621f0e85b3c797dda0e320bae9d0897778b0956aafb2fb46b2ba7d96d011d4003e5a4de01ac9d0f0dd51bdd10a5235cf81ee8c87bb13bf8cf8377d02
https://rvm_io.global.ssl.fastly.net/binaries/amazon/2018.03/x86_64/ruby-2.5.7.tar.bz2=8d8c755819da752d81bd1e4e768bc4734b9f9bdb5b7041dc2adba3066e7afe4027752d34cd7488a19b3cb15f9d9fd1104a7650f1ff579349f66032b2f3bcc0be
https://rvm_io.global.ssl.fastly.net/binaries/amazon/2018.03/x86_64/ruby-2.5.8.tar.bz2=dc4823b99a45e40e87bca3ab4152cce7081f43f1de98bc71736c34e91a738bd5e5af78046e7d9fb20635d025a72cc64d21855c5df6c39c388d685543ee1efdab
https://rvm_io.global.ssl.fastly.net/binaries/amazon/2018.03/x86_64/ruby-2.6.0.tar.bz2=e446f193164a74fb41b02942ec9581c98a7c83001fa68fb3b100abf7e47f0d2a5fcdd9b16d34f9b1925264fe84472cfc7cf695851198ac79375704b02e91fffd
https://rvm_io.global.ssl.fastly.net/binaries/amazon/2018.03/x86_64/ruby-2.6.1.tar.bz2=a03a2a12a6aa676b87da02a35210ae433eb765cfcf5b41ec029fdc039ce382de6b505eaf5cfb797b1092aeecbf73d5a33e1c87be9774b43a59f4ebfc194c185f
https://rvm_io.global.ssl.fastly.net/binaries/amazon/2018.03/x86_64/ruby-2.6.2.tar.bz2=97812438de220ec8c08ca536eed5f28f1e6e257ecf9298771c9911f67eb189a2cecc06864250440b330a2bc69ab546f5900aea27dae9c7faed8362da883a3789
https://rvm_io.global.ssl.fastly.net/binaries/amazon/2018.03/x86_64/ruby-2.6.3.tar.bz2=9ca7600666652158b70618eb9a75be02319ebcae85514130108f88a849ad75e033214ce737b6bcb5b55d4eb58d5b3e027dce6398f672e79169cd8300d9900a8e
https://rvm_io.global.ssl.fastly.net/binaries/amazon/2018.03/x86_64/ruby-2.6.4.tar.bz2=941eb3a54ae31b62e169054bf65832af0aed6fd7c7e1b8a7762c91bb0d697c56f8cfda1a59a8da5f5f3d7dbaa2b9b2dc00bcf321473fbf871df911802b946ab7
https://rvm_io.global.ssl.fastly.net/binaries/amazon/2018.03/x86_64/ruby-2.6.5.tar.bz2=697dc14af56b0b91730560038e8a10c47971fd3c6bf8ed8c73cfdb0fd2b489a73816f09591507fb51e8408a434c3f2c0e742ee01a1a785d19015bd7145b595fb
https://rvm_io.global.ssl.fastly.net/binaries/amazon/2018.03/x86_64/ruby-2.6.6.tar.bz2=f0d1631e6999c22516975f5d937d3f5a7eab5d6b41d2ae1805a5ba53d271dc4f1d91221b2f05d3547914af71de5b4f7dad324ed874b673efac583ac9ec8990ce
https://rvm_io.global.ssl.fastly.net/binaries/amazon/2018.03/x86_64/ruby-2.7.0.tar.bz2=24e047cf668d25b92293ee548951f983d8c1bb001e9c7e7e7044023970b64a9fb33f480eb68ec601a58746785d931c9561ac32506aecfb3a3bb7d8b2374b7a32
https://rvm_io.global.ssl.fastly.net/binaries/amazon/2018.03/x86_64/ruby-2.7.1.tar.bz2=b1005864d9941ff5a6c66b3d08235781a13960b62cacf27b72aaea02ddb0854a4753281526e89ad06826d469b673d9d5f3a2079b5f19c003486716ce17b52b91
https://rvm_io.global.ssl.fastly.net/binaries/amazon/2018.03/x86_64/ruby-2.7.2.tar.bz2=4c5ecf9c0f63b5dbe25d4723a5588d68ed7c44dc93bbb9428fca5a6369e709079f02047e0ffc2318557a3e2d54b8cdedf5dec817cca063b87e37f71725900f9b
https://rvm_io.global.ssl.fastly.net/binaries/amazon/2018.03/x86_64/ruby-3.0.0-preview1.tar.bz2=5447a46dfc35b786ac92f992c356db94f43e6d7dc9cef550ad6689a5b2a14b2dcdf63d4837887c2923542efdffd00d20d951b15a5abf1a5557adaf5f5b060717
https://rvm_io.global.ssl.fastly.net/binaries/arch/libc-2.15/x86_64/ruby-1.9.3-p194.tar.bz2=289f3921543eb096b0d50a2ce7f8655176f6f4dbc8a52aa1342b5238e33f36c9dc78948e4144f41eeca616920ba3422adb0a17d216ec7d2cfaae51f570c1f9b3
https://rvm_io.global.ssl.fastly.net/binaries/arch/libc-2.15/x86_64/ruby-1.9.3-p286.tar.bz2=29d827ca2241fe8b6ee2b6e5bf454820594c4631f46748e8cb4402052b848b43b3f2095d97f57aeb84815193af0e191f80b0f4967aeeaacf9109af1386f17295
https://rvm_io.global.ssl.fastly.net/binaries/arch/libc-2.15/x86_64/ruby-1.9.3-p327.tar.bz2=5cb51f8f9e788c4e9dc3314834683fae4dd2a0ab4b987f5c8253ab9d6e00813f862e2f5b58a984cb5d777ff98cef781a52e2f123c39be65842e1074ccc8739bc
https://rvm_io.global.ssl.fastly.net/binaries/arch/libc-2.15/x86_64/ruby-1.9.3-p374.tar.bz2=2883226de3e447d2f5ca8c78b1615cc7e5a994cff3edad9a042b3fe9672f3ddb19d266e0942d95e57d676c4e2c8b3cd4e99a6694fd2631bceaea12cd133712ef
https://rvm_io.global.ssl.fastly.net/binaries/arch/libc-2.15/x86_64/ruby-1.9.3-p392.tar.bz2=8bfed3cac9e8edeb3de3b661e9011baad4c1fc6903f4f758298121ca5d814bf99652ddaeb39c431f0c726b27da4c18ce1187001ea67f26f765386142c85f9e99
https://rvm_io.global.ssl.fastly.net/binaries/arch/libc-2.15/x86_64/ruby-2.0.0-p0.tar.bz2=1361da1e026595d5b0c5b1adfd070c600b818ed1d053d3a33950b6748df9493cb59852d167cb17fcc384bfe9e65e1c4d8f9e4d9886fa1bdfc44f10bc4c3466e4
https://rvm_io.global.ssl.fastly.net/binaries/centos/5/x86_64/ruby-1.9.3-p286.tar.bz2=d23f786009bcceea143bd0e0af0d3faab16cdfafc93d16c4431c878b812b9f1576a6efeb9104acf2176eb4cf1bf36425f7109a8c6b658273b2de41b419936ce6
https://rvm_io.global.ssl.fastly.net/binaries/centos/5/x86_64/ruby-1.9.3-p327.tar.bz2=210b873ca88af8296ea9b254c84e7108ac6dfdd988c2c740e8616479bf7075087f361bdcb21b3c392abe7045831336c47639f41687a0f43f58e97c18bbb6ca64
https://rvm_io.global.ssl.fastly.net/binaries/centos/5/x86_64/ruby-1.9.3-p362.tar.bz2=daec451a0ed5ff59809b0492a94b4a0d5d3b2ddcffa726651525770cfe879aa9bc63aadb33f9b71b54f2cf2d4f10e3ff2b1e050e37dccc8d11c35848aba199a5
https://rvm_io.global.ssl.fastly.net/binaries/centos/5/x86_64/ruby-1.9.3-p374.tar.bz2=bbac2f710f5bc37cf67855c40fbf49bb422c735c410938d3d05662a798717f0004fbcb900e76816eac0950fda5c590b638e6ac42d2173de1aed062cbcc4c1ac6
https://rvm_io.global.ssl.fastly.net/binaries/centos/5/x86_64/ruby-1.9.3-p392.tar.bz2=f810db858f2900558d33f4935aaf92c5dac3b24e4f37cfc7787e4e02d66e605651eceb04d618414d5827e74a983462c6c3baac2e91a9942947184842be5dc27b
https://rvm_io.global.ssl.fastly.net/binaries/centos/5/x86_64/ruby-1.9.3-p429.tar.bz2=d0a553479ec212a31f2d055882a52d0c4bee749f6b557f20803dc023673c773f221e6737384c8efc2a5192961547d6e56a7ea4e9953d3f2a992bc76aa287b8e0
https://rvm_io.global.ssl.fastly.net/binaries/centos/5/x86_64/ruby-1.9.3-p448.tar.bz2=720364659014e7955d1c18a40d71cc4d4c8b1938ad1d708bfa103b16809552fccf6440c575d1774652147812c7565a5979892fc87cbe3828eb5165108a51897e
https://rvm_io.global.ssl.fastly.net/binaries/centos/5/x86_64/ruby-1.9.3-p484.tar.bz2=3ed6d153faec5391800f088a3f4da3432a913972fdcffa1fecd81daf11d9b46d8abdcd5567ec84361ecbb583d276cfa905ad285497a2594791ada0ec5030dd84
https://rvm_io.global.ssl.fastly.net/binaries/centos/5/x86_64/ruby-1.9.3-p545.tar.bz2=09771e0c108393356eabc0415b1295c6d5d3d75c65797d9757ec451d278fe02534532661119309889581d10d359db8185977c168662e4f65d1e6ac64e4192ac4
https://rvm_io.global.ssl.fastly.net/binaries/centos/5/x86_64/ruby-1.9.3-p547.tar.bz2=9c9a9f8853581e3609f706e93990301c55c04e9b4c0f68cc6324d1a1040e6170069462c732c3eb8e809775a5d747c4311daf283ad832654abdd36f5361813a3a
https://rvm_io.global.ssl.fastly.net/binaries/centos/5/x86_64/ruby-1.9.3-p551.tar.bz2=a04bc818dcbcf3aa39b239207f7c4ce508d5cc2b02b29279a8e371622fe7bc2c086f3f7532eeb3e73e54b127debc3dc30df975db4bb35133c67e420a96888fde
https://rvm_io.global.ssl.fastly.net/binaries/centos/5/x86_64/ruby-2.0.0-p0.tar.bz2=e7de3f7ed558950e548cfbf61312ef6402ec63ef96489fa18c0b108b12e631db2264b95454e50b1e0567048f44974ca1d6aeccf5b82ae6ee09fac0f6616c9c80
https://rvm_io.global.ssl.fastly.net/binaries/centos/5/x86_64/ruby-2.0.0-p195.tar.bz2=3895faea29f2188c3ea9fb2deeac49453ba2f0942bf94ff55fb66937493deb5c0d7969d93198ddbce8a4a060fe12a7cdf83bae0e07793a1c147a5a82f945fbed
https://rvm_io.global.ssl.fastly.net/binaries/centos/5/x86_64/ruby-2.0.0-p247.tar.bz2=779479c5b73112eb1b8fb46876b4133b840f491cfca5738f509a5af211668e171884b8261c2b2360744da192d799a387108d426474953419b7b0e3b95ac9cd38
https://rvm_io.global.ssl.fastly.net/binaries/centos/5/x86_64/ruby-2.0.0-p353.tar.bz2=b9f77ff0be691ebabddfa50827c001ca5423cef39bc7be4ebca6d67a0eb77d0038c3ec7eb6646e1dad22e453827f7b3faa2b82d0c4006a727aaebdee17b17143
https://rvm_io.global.ssl.fastly.net/binaries/centos/5/x86_64/ruby-2.0.0-p451.tar.bz2=61c78e926ee795759c969ec8c289f14ea42e0de736c0873773946dd07484ae1a804bf8a586057e052fb281a5042cab6157faf95729b68e103ffd0dd5fe7cfa92
https://rvm_io.global.ssl.fastly.net/binaries/centos/5/x86_64/ruby-2.0.0-p481.tar.bz2=7d4243d7f029f779e9a90d4dec1d224ee72ba2d94cef971632dc007ecab24a0824e75311955fbebaad10ad50f778ebbbf0be0f064041ff989a2cc87f1dd20e08
https://rvm_io.global.ssl.fastly.net/binaries/centos/5/x86_64/ruby-2.0.0-p576.tar.bz2=cb706e710673731b586953bf0816872b030f265325c76986860734d3f62bf504988e767812e3f0ebe17be6bdd216b61f0591ab75dd78f75b77eea47ceb1e50e0
https://rvm_io.global.ssl.fastly.net/binaries/centos/5/x86_64/ruby-2.0.0-p598.tar.bz2=9109450a5d20b137a1c4e354fcc8f86361fa585450e7b062f1bd43d2ab337d0fa4f2a63ce8cf47d72ef00050cc8d4999a2fe87bc74363f7311dbb20d9bfd4464
https://rvm_io.global.ssl.fastly.net/binaries/centos/5/x86_64/ruby-2.1.0.tar.bz2=15b15ab378f0eeb4c4f08a586e739908146eb276da824b455ea836659b4f7f34129c51eb8cd1b63acb3a1cf73c2ff8a6d4f45498ccf212f4511dd1f7fb521f9c
https://rvm_io.global.ssl.fastly.net/binaries/centos/5/x86_64/ruby-2.1.1.tar.bz2=265fe9c5e2df8e36fc7da739cb1252f52434dbc63a084c44ec742b1b365e65eb5ce7c2de6fe9c3e0c377a5a20301372a8a5b4dfad21d2b7ee435f34ed579e3f0
https://rvm_io.global.ssl.fastly.net/binaries/centos/5/x86_64/ruby-2.1.2.tar.bz2=2045c596282b7288fbb018701f917e005e96a760904c1a11a0854424f710c3fe5876d42de5376b4f14cde33bc4ce3b44033703a4e8311a9f78d0db174797d386
https://rvm_io.global.ssl.fastly.net/binaries/centos/5/x86_64/ruby-2.1.3.tar.bz2=cd2c589780369ce062ffb1fb0c59a5790abbdddbb5c46fd39527ef727eae9bdf048fa891b4a8a577de9e680e6967369852c4d7c5010892432d6ba09f3b30d893
https://rvm_io.global.ssl.fastly.net/binaries/centos/5/x86_64/ruby-2.1.5.tar.bz2=d5f3c570d8e1b004912310a4b223630bebf63d8c460830b9d74f053e3eb2387e3fa5424c7e71249bef2e8d3547d9b51e8d42d0f5579dc1709579d2b58a9ccbfc
https://rvm_io.global.ssl.fastly.net/binaries/centos/5/x86_64/ruby-2.2.0.tar.bz2=1c1cf43f27d0336169ac51a01d8a8524f30d702d3c860cdd41b093b80576d0a7300740ecc2bec75a92e389b50df449b6d477b3ab55f711c3a7474bcde4228d68
https://rvm_io.global.ssl.fastly.net/binaries/centos/5/x86_64/ruby-2.2.1.tar.bz2=64dc05e0a4fe1081aaedd5b9b2a39f7db476519f6fe7d4010da24cd46472086b251b4fee02bd97a582c8a9e97a2270c2d7a01d3281043ba668b58ac21ce9a98f
https://rvm_io.global.ssl.fastly.net/binaries/centos/6/x86_64/ruby-1.9.3-p194.tar.bz2=3aa98bbde868c5056d6684f2cb321da2f491a65aac92ad39c9a541aab3928cea63d299583a795380e8185a94dafc142ef6eb80e8510c8024a5d4d5d176cedf46
https://rvm_io.global.ssl.fastly.net/binaries/centos/6/x86_64/ruby-1.9.3-p286.tar.bz2=69b2c7c0b0b2113e94b782bd6a9c938d46befc5e7f0594b303b7f0f249871557af37c25307cc955873ef91c83759f350ed0cec003224bd54d51bd76e5e76d9ef
https://rvm_io.global.ssl.fastly.net/binaries/centos/6/x86_64/ruby-1.9.3-p327.tar.bz2=2c5a08a01f4cabaf4fdb3f043c9e324fff4847ddb999415cb99c05db7c447cd13833b6905288391040e87ddfa06223f8a9b9e2f733a4a5c94325ebf2b55732c0
https://rvm_io.global.ssl.fastly.net/binaries/centos/6/x86_64/ruby-1.9.3-p362.tar.bz2=108e4809fc7fdee55932ec86374867a34876156a907f85628ddfcf252abad26c38c008fdedd5d684f55ddbfe254be1328cf180df5737a5219db76edde5e64fa8
https://rvm_io.global.ssl.fastly.net/binaries/centos/6/x86_64/ruby-1.9.3-p392.tar.bz2=0e9770b53b84192182ea113f400828b47df8407c9162d0b8d4caa7e6cae5b999db9559dd1b142adc7e750cf4c053d9b02c46664df6dec85a3a6b1b2fdb317104
https://rvm_io.global.ssl.fastly.net/binaries/centos/6/x86_64/ruby-1.9.3-p429.tar.bz2=a9288365f55ab39b1214b046dd77f0f25b7ffb4a8c63ece7200e8173d69c82f766cbcb0c322cf0f2dc5e66ec4d3f111f2681f1abf0e4110342b4c99888bebe29
https://rvm_io.global.ssl.fastly.net/binaries/centos/6/x86_64/ruby-1.9.3-p448.tar.bz2=2e7bc5f6d501928f01de2a6d9035f56f40678d410bc0629ef00e0e70565b49991c4570f19c34faa1bfef2ad4cb460e4c28ee2eaf5c0696a403d0847f17d4c22a
https://rvm_io.global.ssl.fastly.net/binaries/centos/6/x86_64/ruby-1.9.3-p484.tar.bz2=1f3d919f6540dae79971d3c9218532f289bed5fcdb2028056b33292f423cc718abb4ad3a3b33e02747770d62291abda7f5ab9b784067adbce39bb5d147e6f88a
https://rvm_io.global.ssl.fastly.net/binaries/centos/6/x86_64/ruby-1.9.3-p547.tar.bz2=47df6c48290704b5ee4741010c20a79dd70a4412737e3bc5f14ed99191849cd5411edcee880b9005e510147068061906753a91da907bb9f0a72c55fbb4a6ca69
https://rvm_io.global.ssl.fastly.net/binaries/centos/6/x86_64/ruby-1.9.3-p551.tar.bz2=16abcbe568ff3cbe557f949e6c34015149fe2a6c836ebdabb8079346af59ae129ef586c9b0166b73f11f73e2c5769eec8e35de02306817f2d14b455a2a12c9e3
https://rvm_io.global.ssl.fastly.net/binaries/centos/6/x86_64/ruby-2.0.0-p0.tar.bz2=1b9afddbf147eee824d8b9e1e182d01d2fca9730925241cba19359044ebb87ed15cca7f2bba7ca9c9a1125bee235b99e0beaddf20e20ba6540c00a3ab4984a4e
https://rvm_io.global.ssl.fastly.net/binaries/centos/6/x86_64/ruby-2.0.0-p195.tar.bz2=03546af00dac6fcc1a25f4cf75d1b4d56d7d9180ae8af841cc86f7ea1adcf1d558a006a2a88fd10964df50c59f2bdf61c3ab3c1e648292295ce7408cb7e208d4
https://rvm_io.global.ssl.fastly.net/binaries/centos/6/x86_64/ruby-2.0.0-p247.tar.bz2=6929240b591970249153fd7cb9aae47821a3efe60cdda3bfacc334cd7301635d6b71bdbd5e122b5e17d02559b6bad8711ecfbf38aa6f947ed28b5b1154a38efd
https://rvm_io.global.ssl.fastly.net/binaries/centos/6/x86_64/ruby-2.0.0-p353.tar.bz2=3ec257a3be47ad20245c2d561f87d60990698dea0a6127066e73ca8cf46a3a80cc974a562fddf156e0ebb54b3ec29e84afb27699a95ce344b2092b8e441c7c27
https://rvm_io.global.ssl.fastly.net/binaries/centos/6/x86_64/ruby-2.0.0-p481.tar.bz2=726ebfca4fc27e81f69136f1f2e1e49882335400debc8873b9b0ef8f21fa7a3ac04c1d2af5137b50ef6f5b1affce13e0d9e24b02e7b57317b2e561a43348655b
https://rvm_io.global.ssl.fastly.net/binaries/centos/6/x86_64/ruby-2.0.0-p576.tar.bz2=2f3330ed76aa9fde3e1b450a625d68e24e829da3200c069ba83a542248ec80cf703a4594cd1e8e221b51a47213f8c03e707080502a1fc804e8ff1d14eac4fe5b
https://rvm_io.global.ssl.fastly.net/binaries/centos/6/x86_64/ruby-2.0.0-p598.tar.bz2=545fcb7a7720669afc3feb493d7207f17cfa4ba3aca052370e309a6773ff107e544f8456d14b4a01c1b73a53178e8e068cc617a14d8bda58ad3d39a078623ecf
https://rvm_io.global.ssl.fastly.net/binaries/centos/6/x86_64/ruby-2.1.0.tar.bz2=e533422da11aa4c4ee18f38aa3384327b1df5ceb12014ab36ec1ceaaefa1743174e4f722791bd05bdd10528ba0dc16e61219ec398817463c3af0bf96fb38d1f5
https://rvm_io.global.ssl.fastly.net/binaries/centos/6/x86_64/ruby-2.1.2.tar.bz2=5b83a132c25f020344b82b1720d570faa517d6af1bbefda9997f96f3464b6c72a55aa71f1458bb2330e2d2e22b305c53e6ea76a581920d7fd1cab853b0567039
https://rvm_io.global.ssl.fastly.net/binaries/centos/6/x86_64/ruby-2.1.3.tar.bz2=435502600737de465999f6052b8177477c363cb33ec402ad19a39dff1c5489923981d5b0df1133c91dad7b8fd683cb7dd60eaae4d687884ba59cc2559fefacc2
https://rvm_io.global.ssl.fastly.net/binaries/centos/6/x86_64/ruby-2.1.5.tar.bz2=44be9ae84a92df919689853359b480f433ea502440bef7d8b87f4374cde918c1f401a66999d554db95e61637bbf8c4934bbd93d03561835598c1c6c94735c0a8
https://rvm_io.global.ssl.fastly.net/binaries/centos/6/x86_64/ruby-2.2.0.tar.bz2=ad5b8e922c3a231a0c29b70183bcbbdfe44a37ab1b89a12630263d39280b1b5ad01fb0145a63743945e6301b8ea501a0fe32a341f7b1db71f15d1dcc3562b45c
https://rvm_io.global.ssl.fastly.net/binaries/centos/6/x86_64/ruby-2.2.1.tar.bz2=4cea7399c9ae0b67325618f42b41e91c1d09786c45e2b6b0f319b4fa38a8b9f28e9599b490831e257763599c4a0d0c49b0fcdb3585e6b0484eea8566dedb69e8
https://rvm_io.global.ssl.fastly.net/binaries/centos/6/x86_64/ruby-2.3.1.tar.bz2=54e888794440c8c6f5c2d9c14f164f9e88d0ade45822004ed133d68131d2536f3048ddd9a854ce392e1e38992389de4786d8fd0e4d271a4a6295eafc73ffea32
https://rvm_io.global.ssl.fastly.net/binaries/centos/6/x86_64/ruby-2.4.0.tar.bz2=cf31d026fae221ded2c0a1c38917857d9a2258d7215ad74f36f4709b5e619b15786bf7108517c451361ae41b1148f94b7e8730bd8f9196a290517b4d6d4868cc
https://rvm_io.global.ssl.fastly.net/binaries/centos/6/x86_64/ruby-2.4.1.tar.bz2=69af5beba0234356c38f624fdbc7fdc6bff38a866b90cba2c2ba808f5030ba2cc7a818f58e22e35fad4f18cdd6067498cd48e8fc23755008c7efd52e03eab2e5
https://rvm_io.global.ssl.fastly.net/binaries/centos/6/x86_64/ruby-2.4.2.tar.bz2=601ad7c34274cdac4f26415d2677767d8dec01f6a3dfbc4d3a34bbe3274a8feba76a403b15d044ca4f56aefcc16d7b4d9d3c74c18cc5cc943427b151f0966d3b
https://rvm_io.global.ssl.fastly.net/binaries/centos/6/x86_64/ruby-2.4.3.tar.bz2=44fd554795d51a4f02e25c742ffdc1c771fdd5c9e3710d1732b9381e912619553ea5376faa5c2bbe2527df9d69fb5b21628b3c017e034952e3c33dc9ff71fb7a
https://rvm_io.global.ssl.fastly.net/binaries/centos/6/x86_64/ruby-2.4.4.tar.bz2=645804075fed9a4207a9c9c923d4c7f8ce962a108fe4aee7bc3a469b04680d897a3e4f45e953807afb98f822572f989409fee1b9d76c55301866aa6884ebe4e1
https://rvm_io.global.ssl.fastly.net/binaries/centos/6/x86_64/ruby-2.4.5.tar.bz2=22152d7226f783df36780d13c59c5e28956c56cc92e557d979e8128dea83e65c8b611705fdbf53564c31c1e7dd48c32de38267812b08ff0f778b5339573a55f2
https://rvm_io.global.ssl.fastly.net/binaries/centos/6/x86_64/ruby-2.4.6.tar.bz2=f17a36a189310c0497618e1d3977be47978b9de3033ef707a4d0979ccea4332dc8d12e7f99555870d5863b0e911d301d0694043d9dd82b85dfdef4664b60da78
https://rvm_io.global.ssl.fastly.net/binaries/centos/6/x86_64/ruby-2.4.7.tar.bz2=959db6e7983c02d6fd86904a58cd9c0b577b181d123911cb8fe1749d34f43d4b0e84df6635e93d9d17c7da3bf18c256f8a854bb1b7adf846130f3d00e45aeb8a
https://rvm_io.global.ssl.fastly.net/binaries/centos/6/x86_64/ruby-2.4.8.tar.bz2=5eaa61b86a54b1acc0f03e731a09414e39f59baf35f09be5e679827c9558b00da276f91cc5ec0e54c15d29d0ea66f8b0ccfba2936aec769b24f65c931294df96
https://rvm_io.global.ssl.fastly.net/binaries/centos/6/x86_64/ruby-2.4.9.tar.bz2=7db75f5f97044fc832725bf3849fe85e2e4f7926bde98cd2bf4bdf7de54b32286e6479dad5b0d917f8d89995ad2c87f3522b09534b027799dc497f291f2f151f
https://rvm_io.global.ssl.fastly.net/binaries/centos/6/x86_64/ruby-2.4.10.tar.bz2=c7ceebe11ae3756c2a7719ef63ccb51adaa58daeb4c0b751f98ff8bdf84949aa12229c956c4504fd1a60a8ebbf5a1d9b38bbd33e5b1211806fb02c8b1570d669
https://rvm_io.global.ssl.fastly.net/binaries/centos/6/x86_64/ruby-2.5.0.tar.bz2=958d344a99bd7cdb716e3a1497aac1e87df9ce8e2053948ec94f2448ffa46097ed1481d02c1245ce7e009ae57491503f018d79da61249071e19e3583eea77fba
https://rvm_io.global.ssl.fastly.net/binaries/centos/6/x86_64/ruby-2.5.1.tar.bz2=36b00718bc74d3149fa40d10ab7f66f837eb92760f14f16a3e6fc50386ed76ef8fb7758660b24726924502bed1c0dc409d49487ff7f85a4f54cdac8e47e9d461
https://rvm_io.global.ssl.fastly.net/binaries/centos/6/x86_64/ruby-2.5.2.tar.bz2=cb3251a05b2b8859a3432c21e3677f65e84ca4510dc87a9a81dbe3d8bc5edc89e7863bcf29f6011d54d35e10d1122ff798cb622569af9ab0f266de2ab767d961
https://rvm_io.global.ssl.fastly.net/binaries/centos/6/x86_64/ruby-2.5.3.tar.bz2=b57f799987115e6ddd3aae6fbfd79d5a02582e00180e4f9e347290a6d84ff6a57222300310d0c221a8dd3d84d7321481ad7508aa574a7c8a3e91bdfb2112b32d
https://rvm_io.global.ssl.fastly.net/binaries/centos/6/x86_64/ruby-2.5.4.tar.bz2=9829e4f4e2c98b09f5bbe8f004cd9cdf422ea6a0a42fa91892fc61725442443dca901f1b055b094476a2023842453da6e33dad8102f0330fef464430914079aa
https://rvm_io.global.ssl.fastly.net/binaries/centos/6/x86_64/ruby-2.5.5.tar.bz2=b76cdedb329a3fe92b92fce95ff477d6019ab42fc33d71ba6a408b818199c4b9ec160c4a6de5d179516e3213950642a32e0f2c2a65f6dc4cc62805f61a01b350
https://rvm_io.global.ssl.fastly.net/binaries/centos/6/x86_64/ruby-2.5.6.tar.bz2=6ed84e55e55d42ce208b24278fda3e515126026cb91ce9f89813f12890d7f4b30553f0850d7cccd070083cd64db8d4ebeb2a696a4cca98ef01d6bccb7533ef2d
https://rvm_io.global.ssl.fastly.net/binaries/centos/6/x86_64/ruby-2.5.7.tar.bz2=043a9266146dc9e4b86d4bf25bd48f6dc9fe6e5d94a536106a875bd7a9c78fef508a64421b7ae33c4108075f05613072f364f760356532bff095790c0cb9fae1
https://rvm_io.global.ssl.fastly.net/binaries/centos/6/x86_64/ruby-2.5.8.tar.bz2=065625542b046272ac8ac844a38382b0dc40b01e1c70d79d1cdd76b720120ecf00080481bbb4c65d87aca0893982a5e7d5de364c98ba583669313ca75b94c158
https://rvm_io.global.ssl.fastly.net/binaries/centos/6/x86_64/ruby-2.6.0.tar.bz2=1bf007a38c450f06e919ef01ae38106f336a43b347660633b8484f14f5d9b02b67d2de8cb913b49511b83c984c04f290606571913ab937136e87d264f42c943a
https://rvm_io.global.ssl.fastly.net/binaries/centos/6/x86_64/ruby-2.6.1.tar.bz2=d8813c1e6d3fafcc3a7bf33a5261ca8990b05e08a45446e31748275862fdf0c8c17e7db89b10f7023d2b4fb72d5f751cf7c549323937d4daa3c1c33e2e57b9d0
https://rvm_io.global.ssl.fastly.net/binaries/centos/6/x86_64/ruby-2.6.2.tar.bz2=3eb93723d016020b4ad97146e8df4d62c735a57b9a6b99059f2c46b1e5e9337a1dc82a1bbd6ca7567c461b8a97fe763f6766585adc93e67d312c95897814ec8a
https://rvm_io.global.ssl.fastly.net/binaries/centos/6/x86_64/ruby-2.6.3.tar.bz2=0a78e80bc86e844fa2144ca140dabbd24df464ce12b1f119f6658098b9634db619b272587db11da779c268bbef893875b2d2e68db74dab5d57280152f11d11f9
https://rvm_io.global.ssl.fastly.net/binaries/centos/6/x86_64/ruby-2.6.4.tar.bz2=ed1d973d688cafb94a59335393c012780377c56a657314e2be510b775bddbb551d09b44f30be03339f3b59637518bff68b8f8bc6c23a6e637c88d11243585e26
https://rvm_io.global.ssl.fastly.net/binaries/centos/6/x86_64/ruby-2.6.5.tar.bz2=2f87b57bb177abc6dcad218a10ae5876d2f364b2af3c42c26f4ef55d60c5e9899aed75b647aed8149114d4da27ac98e4eb8858c2f1c2333fbaf726eaf23a49b9
https://rvm_io.global.ssl.fastly.net/binaries/centos/6/x86_64/ruby-2.6.6.tar.bz2=98a32d7bd78edce70b76d90c9e1953f2e25ef52d99425eb7be7d708c54c8564ee73700187ce3da5f9c470d25dee72a0152fc46a7d3957da20e408ddeadc0498e
https://rvm_io.global.ssl.fastly.net/binaries/centos/6/x86_64/ruby-2.7.0.tar.bz2=8d20da9561db37893841cae98ed3252e3fe19c81e49e02b4775c87fe015df9c25c1cd9a15e92c47f436665a1b139c272725f13ad52074018a9ab5ae63343d407
https://rvm_io.global.ssl.fastly.net/binaries/centos/6/x86_64/ruby-2.7.1.tar.bz2=b1559a30c2140d4110897d86e118276262668f07a8c341a3e85e615c703e69ce7a25bc5579a266bc091dac6235c5b0c608fdd32db83c3f7601585711d8e99e28
https://rvm_io.global.ssl.fastly.net/binaries/centos/6/x86_64/ruby-2.7.2.tar.bz2=b375e5f4ba4774c31e35a8be92bee2a2c779ab159d2426e7cddfe3ceacc2b5b9b8be2585e7b9d613ad2b4906dc0312d93312a7edcce161aa2c523a4f7722f2a7
https://rvm_io.global.ssl.fastly.net/binaries/centos/7/x86_64/ruby-2.4.0.tar.bz2=6b03d4817def6fbfcc12ce39ff97435984c22804f6488a1177eb0782b070f6a72fa080daa3f563741b7185c79b73c34b25778e6c68ab6646e86a6c131351ebce
https://rvm_io.global.ssl.fastly.net/binaries/centos/7/x86_64/ruby-2.4.1.tar.bz2=9b49faee96730806942a104e1c128ae29f6949608f81075a5d430d33996fd5fe4ae6c1ee9ab0ac41e8cefc8efdcf50e8d315fa3e8c5e228e19d83e03aa4db7db
https://rvm_io.global.ssl.fastly.net/binaries/centos/7/x86_64/ruby-2.4.2.tar.bz2=cefe856736de3893a0caa763f120ef9a06e7ece608c486553e4228f820872e733d412ef047d9e6262b54fc59e066b5682f07dae5ddaf01a5b08836a9808fa9e2
https://rvm_io.global.ssl.fastly.net/binaries/centos/7/x86_64/ruby-2.4.3.tar.bz2=136171b2596c29ddbac97794d71bb9fff406f34d1e35cfb3d5c87d8ced3c41c113b4d535eb50734c9638e04f7b145bddbe098bfdb23146dcba004c5b7197f7c7
https://rvm_io.global.ssl.fastly.net/binaries/centos/7/x86_64/ruby-2.4.4.tar.bz2=88de8e6406d5bfbf4af173abf561797c97fe4458a9041723c139e1380f10df3c7792664b86d320c13414177303bb2c84e87137da2b20a5ae6ab638c63cb44d56
https://rvm_io.global.ssl.fastly.net/binaries/centos/7/x86_64/ruby-2.4.5.tar.bz2=57e4227d89bdfc643f949efa59648b0c6d310cab38ed3be3874861134c513c8ecc4f063ee8fa6bc0d9ce93785d08eaf75ec6a96334eb232cc0754254aa791292
https://rvm_io.global.ssl.fastly.net/binaries/centos/7/x86_64/ruby-2.4.6.tar.bz2=36051e04bd9c8334d72ecd9c5d3e96635316a3cbc8aaa173b8a6da7c975ab7376ff766ba2f0a9dcbd5717fec43470189e4e7e062eea37e825a313ac07deeb0c0
https://rvm_io.global.ssl.fastly.net/binaries/centos/7/x86_64/ruby-2.4.7.tar.bz2=cd1ead729cc06a47dd601c6f3bc1c07e558432d824e7e80726cb15c619dd5a17d0d9b3e321dfdb0e8cf7e309942cf6ea3f94bc9c61a6024dde04b8437645f863
https://rvm_io.global.ssl.fastly.net/binaries/centos/7/x86_64/ruby-2.4.8.tar.bz2=6151ade45905067b4ead2dba600fa1c59da7ab4b459610f97ebece336e1a3cc85efc23b0beca0c08315125b42ce73847d84ca83a18b80bd7f93fafe8bb6a095a
https://rvm_io.global.ssl.fastly.net/binaries/centos/7/x86_64/ruby-2.4.9.tar.bz2=ea647a4cd6a90c4cb514d0fe5389b74c55c1d27e73e09c770f7905f744886ce29d8622e9b20826493810db81436b640c838f2c2b0022fecc3c4703d7a759c6f5
https://rvm_io.global.ssl.fastly.net/binaries/centos/7/x86_64/ruby-2.4.10.tar.bz2=9643ec3cfda7cfdfa89c56254ccca492fa00ba43feba348319f406767f5f8b61be7c7b8ed2f5d0bc887b0034929588660ab80de5fd602e2158de251e28e1b553
https://rvm_io.global.ssl.fastly.net/binaries/centos/7/x86_64/ruby-2.5.0.tar.bz2=de9d090626279955d8f46b98d6234b0bba8f58594afe36e59347a6d409acca99f40df3e1a32b78c7713af824c368b8c764af5b6f7951a40a9f6bb0d5292780c2
https://rvm_io.global.ssl.fastly.net/binaries/centos/7/x86_64/ruby-2.5.1.tar.bz2=b496953a5f1a80503944002c22e1dbafd0f3cde997c2d4932b8c03bc57e4bd901ec48ab0cbf80bd0fceeb975b7539adfb84d43f70a53905c547bd2d4a6c4415e
https://rvm_io.global.ssl.fastly.net/binaries/centos/7/x86_64/ruby-2.5.2.tar.bz2=f76579c383f2a7fa34256a79faaa4241f9c7fec1c3047435388f4296b164b3c7fd744d455967ba9e7b24a1390097894bd22a38e5398b047174cb6fc175cbae32
https://rvm_io.global.ssl.fastly.net/binaries/centos/7/x86_64/ruby-2.5.3.tar.bz2=18e66e6eade1547a285b7c316044dfc367e7990d4ed1c730991e2b2bc8a5875a5f55acae666dcf0e065d3c4079e14164f936d2394a383bfa5cb445a507b9408d
https://rvm_io.global.ssl.fastly.net/binaries/centos/7/x86_64/ruby-2.5.4.tar.bz2=953f7685d2040b9d917e707b0474ce287ceb908ff8419e7144000fec1ea907d136e8f8561f572303d2b31f5297de486ade5063ef89eb22f41cbbc4ce3f18a51a
https://rvm_io.global.ssl.fastly.net/binaries/centos/7/x86_64/ruby-2.5.5.tar.bz2=239f2aea96b30c5f69cd9f472e2f2197e69ce66edb3d7f9dc2fdec124a9b06ef1c737ca81c7237e085cfef7c5bf0b2fcef1b446ee9cbc9089ad9bb7c56467e4a
https://rvm_io.global.ssl.fastly.net/binaries/centos/7/x86_64/ruby-2.5.6.tar.bz2=dfd9f31e01baedff47bbd1018c337a30065784d9b4744bf8eb11b983c96757ff2c9b79b8d1dbfca67dd9544130967acf6070179394321a7eff57b7269fcd9138
https://rvm_io.global.ssl.fastly.net/binaries/centos/7/x86_64/ruby-2.5.7.tar.bz2=c843f2ea3030a5d695570c92ae104c8a5647d9dfa0d3002c5ab72235eecf9eb296c0afc36a390d29e800f7e3b16243998561c493bc0dd3335978d004151c3c91
https://rvm_io.global.ssl.fastly.net/binaries/centos/7/x86_64/ruby-2.5.8.tar.bz2=7ed0779a16e40da80d60a4933e0a2fdfe4517cda2702e4f93ed2a284ff348b127136d81e10f828af86ee58a5fde534dc0cc26c9e54c6c287cf5600300533d98a
https://rvm_io.global.ssl.fastly.net/binaries/centos/7/x86_64/ruby-2.6.0.tar.bz2=7eaf2809ded5af6db68c00650447bf3a606e258bdb336d392242f409431ef6756de90e5c751da9b3477a6587bf8bd63d7be74723f8d2298183f3df2c82579d79
https://rvm_io.global.ssl.fastly.net/binaries/centos/7/x86_64/ruby-2.6.1.tar.bz2=f6da0db7bd87bbad6b6557cafb833be38175557555980bae5d1b651b49428df4f9d73af601134cb8165c469acffe8422c2948e09c9515e2c15eec36f1dc27267
https://rvm_io.global.ssl.fastly.net/binaries/centos/7/x86_64/ruby-2.6.2.tar.bz2=cb92fcf0f6e55ab073cac78135b6a10516c463df263038a05dd2bc453dd724daddf9a03e0b90cf65e683b37e5024a427a7cfa62222b50f67cfa692adba5e1878
https://rvm_io.global.ssl.fastly.net/binaries/centos/7/x86_64/ruby-2.6.3.tar.bz2=9137b907700750aad5a7041400279be191888f10007b3f36092619aba242b72db875a47a76f11c0edd625d154f687f29321b461d258ffd7bad6f2ec434230d3e
https://rvm_io.global.ssl.fastly.net/binaries/centos/7/x86_64/ruby-2.6.4.tar.bz2=42659c35dd5ef48f148dcef911e30307850f54897dfcf59c22254559b504173c78ab6be4ae1a9bad7767e4762018d709038f7ad2968db5844f0c2e2ad1071b2a
https://rvm_io.global.ssl.fastly.net/binaries/centos/7/x86_64/ruby-2.6.5.tar.bz2=bee9931fa058ded6b64d4ae728cdee352f14308a56240c6f6f6d0bf6dc6886a76406bdfc25fa8b5631cb0e0fdf9e8c8942af4f25bc97d30376db53f0f1a75aac
https://rvm_io.global.ssl.fastly.net/binaries/centos/7/x86_64/ruby-2.6.6.tar.bz2=1aedf80e0ed1c8251cec75ce9fcd20c734969787f49b188a86634edd654a4942187da222d693cea35f86d9195c576ef0aabf400eb921f0897ee630a71397aa2f
https://rvm_io.global.ssl.fastly.net/binaries/centos/7/x86_64/ruby-2.7.0.tar.bz2=e9ed50ef02387e544fcddea115fcef88354b481d4e706713de804bc97c470dcb31eafe3ffb4a29d47122e6739652e85bc93a0eb03ec37d3f414d5f2a10c74cd8
https://rvm_io.global.ssl.fastly.net/binaries/centos/7/x86_64/ruby-2.7.1.tar.bz2=90d337be14eda27893fb12e09fa8785c49071d358f846b22addaa4161116124ed3d0b9672a4272734a6580443530b6fae5073da4ba4ed0334dc847d1f4453698
https://rvm_io.global.ssl.fastly.net/binaries/centos/7/x86_64/ruby-2.7.2.tar.bz2=0c3a7832b789730b5b456473734611ce862c2813dd1b274a18b70e0dd00c82628f59e5284c99cda518d58682581cae707a67418f798fd4322ab60840b4a91bf5
https://rvm_io.global.ssl.fastly.net/binaries/centos/7/x86_64/ruby-3.0.0-preview1.tar.bz2=22b5d90fd1445ca6379e549788c17f77a9c38557483e6399e74dd9e46b2254aa594b70a8479915317d727ea6028c56b5b41ee703061d3f372c412fc58073d621
https://rvm_io.global.ssl.fastly.net/binaries/centos/8/x86_64/ruby-2.4.0.tar.bz2=6601387c5a961f0daa477ff3f1a418dc24a508384a9ee121c22785ef2e03899fe11fc5494866febf2394672279ce9417ceb803e439d2edce88f9f072a334eda8
https://rvm_io.global.ssl.fastly.net/binaries/centos/8/x86_64/ruby-2.4.1.tar.bz2=707476a427d7a46538c10a3d0593952ecb8e1184f8e792099eff108f4a18622bfb86294049f81a2e99ee6c4ff1a0374c23e0e558cd85740c90cab70c9e2857e7
https://rvm_io.global.ssl.fastly.net/binaries/centos/8/x86_64/ruby-2.4.2.tar.bz2=c3cf83c9be600728ae621d0c77d67be5ba4dab7174c5fa443a73a0ea5218d0ced6e28461bc34c5e873f30c78b2388873c393b084d97bb7287e831763a17151b6
https://rvm_io.global.ssl.fastly.net/binaries/centos/8/x86_64/ruby-2.4.3.tar.bz2=4fa411fc611c841911e9c481800eb8fe02782f5bf98411830b7c98c1c3cbc5c6dc402c492a183f1a747dad4bcce09fae8a92349da4a1725aa3de782b26a4cf38
https://rvm_io.global.ssl.fastly.net/binaries/centos/8/x86_64/ruby-2.4.4.tar.bz2=12a48147ed46cd69ae1e42c410ff7756f744fc4881560bcb31f31ec6bc30438f85dad51cc25c87b7c963587f1f0caee711feb97ac7fe0b9b4221bc525bd9c67d
https://rvm_io.global.ssl.fastly.net/binaries/centos/8/x86_64/ruby-2.4.5.tar.bz2=0dbe1110b62a3520de4cf80f02170967557e369dfd69f9ff91bf8d5d280b99f5d25840b1b3b5ebcd800c755b293da481065f26d48b8779040dec9e04402ff357
https://rvm_io.global.ssl.fastly.net/binaries/centos/8/x86_64/ruby-2.4.6.tar.bz2=8edd6a1bc396868f072e5f2f90cc58e50a9062312bc9a6541cad3678909e0d2b6c91068c52fa0b161c20eb7b023df163dd9438a9c9ebc2020fe707a61216de38
https://rvm_io.global.ssl.fastly.net/binaries/centos/8/x86_64/ruby-2.4.7.tar.bz2=5ab411416e3f61571556000c054f2e9314b8f9d9dd6300ba47c4835f8f4d050b50f46039ea12947d39187ec95c66f3075c166d9cc1ebc57b1deed036ea03ff9e
https://rvm_io.global.ssl.fastly.net/binaries/centos/8/x86_64/ruby-2.4.8.tar.bz2=6bb44abf86d0005d653416ed2b13a545d63cdd108a99402bc9b0d6acc447bdb2c76e1764a787005ed50885eb8ec75a6a3fcfc0c3056cfc8da610a953fdf7545a
https://rvm_io.global.ssl.fastly.net/binaries/centos/8/x86_64/ruby-2.4.9.tar.bz2=e3b761b1c2bec8161757ee57a029cbddd088da4f2c78e69e1115c07b37dcbed9a5e80965da84285839a9df98015618894630d593905412f68701f636802de6c9
https://rvm_io.global.ssl.fastly.net/binaries/centos/8/x86_64/ruby-2.4.10.tar.bz2=dccd096c8bad96b13601188f37814bcfe7833710785eeac9d405c40b1543027c330fe815cd605c78c8c0533ce923f5f3f99df349ca6209f69768ccbdd7275969
https://rvm_io.global.ssl.fastly.net/binaries/centos/8/x86_64/ruby-2.5.0.tar.bz2=fa3f051827d3fb5c23a6538bdd9e86f60b208e8b1c47c58d91a025cc53aa67189b5e6edeccd4ba930ae45033b389e0f40ac79b57d3add00d9cb6470e7ad04264
https://rvm_io.global.ssl.fastly.net/binaries/centos/8/x86_64/ruby-2.5.1.tar.bz2=edf4958f078a9417ecca6de7f408967b16743bbed1175a61b0640671c0ec528aaf21852dfc8c4fd71be721616c8c241386b7f5e9e4dffe78abe97c9b4c97b00c
https://rvm_io.global.ssl.fastly.net/binaries/centos/8/x86_64/ruby-2.5.2.tar.bz2=993346eb5cd7d936039b1f7d6492bc4a4e4372734e361e90b8bbaaf06acd0961373733d8d6a1798bfbcc1b5cc9f63aab654518b4eb3cdb3d301f7f13f3c68cb7
https://rvm_io.global.ssl.fastly.net/binaries/centos/8/x86_64/ruby-2.5.3.tar.bz2=127fcc79580095c5ef57322c7e11ed33238f578e14de574632182255814f91e1affd0c4f25a8461257c9c4977c49eba619e8514d746b587831ed9d028d9f4e81
https://rvm_io.global.ssl.fastly.net/binaries/centos/8/x86_64/ruby-2.5.4.tar.bz2=b7b5092829bab05e16299318edb97ba5abdb84d73ff4b26bf1615fdf59176bf1811b8ab9c53b44afdb1461cade44cd0f5ed1efcce094237be7247c05fa721659
https://rvm_io.global.ssl.fastly.net/binaries/centos/8/x86_64/ruby-2.5.5.tar.bz2=a63b8105d07584f75646cdc22bda6223bd3009fbb4781e6c93e97ab4c3ddc8d22c6faab00b6b6ec84e968bfa5b866159142df09fb5b7ad82b6a305fc73688bc6
https://rvm_io.global.ssl.fastly.net/binaries/centos/8/x86_64/ruby-2.5.6.tar.bz2=5c15a8337cf2e5643290e86270179a31cd9f393225debab0906297838e457c36c8adc6913050303d04ab24aca9e86c8d71a8ac80007c030eebda4cbdf7e6f48c
https://rvm_io.global.ssl.fastly.net/binaries/centos/8/x86_64/ruby-2.5.7.tar.bz2=62203385eba3770df3ee40272212a83f731d5fde56b39dd05ede8f72083215943e1c2bf95139ed2ab36c3f90bab94a766564294c1a0e6c207e1906c48181a496
https://rvm_io.global.ssl.fastly.net/binaries/centos/8/x86_64/ruby-2.5.8.tar.bz2=2074747e2c578b55c368afd5d8b24506c7076b1fb248a591b34aee07b32d08e32148768aa1943bc5a6b5cc4667b4cbae57b65192b0e0a9cbb1abbc15ac881dc7
https://rvm_io.global.ssl.fastly.net/binaries/centos/8/x86_64/ruby-2.6.0.tar.bz2=eda0a22616d65fa39acc7d0649c9200d8c6b439df15881722b3b49564b8d979b59feb5f650e936c8c0d3d1076820cc9074fe78504d8477a6eb3727500bc5a2ef
https://rvm_io.global.ssl.fastly.net/binaries/centos/8/x86_64/ruby-2.6.1.tar.bz2=d0d53f923ea689c30c31757c0a6c79a05da6474b667d99bd97235ff34133d7b03e3165d94c6b9532b92aeb683106fb297d799a4a4758ba0f16ba9571a30732e3
https://rvm_io.global.ssl.fastly.net/binaries/centos/8/x86_64/ruby-2.6.2.tar.bz2=f598d793465c3069f931f95aca587dcd79f47424927004856beb2008ee3370d20c2dd7d0faf302ba289ea4667e2628c20a13b2337be51bffbe47686b7fa696c1
https://rvm_io.global.ssl.fastly.net/binaries/centos/8/x86_64/ruby-2.6.3.tar.bz2=23a1d949ec2773d80676b94a1ad062348fc6e58c71627c1f1f0e6b8566c09579a39ee1dc8c96d8a1f5566e158abe5d5968e1e9b29525a29712a755b30042a590
https://rvm_io.global.ssl.fastly.net/binaries/centos/8/x86_64/ruby-2.6.4.tar.bz2=cfd9ba893510772906d831194bcc7c0b7d21c5b083c9adc9665dcd1f7bdfd1a47c5050e39385d49f29bcaef4765fa21596fdbc566eb5b7d889d215fe0feb7892
https://rvm_io.global.ssl.fastly.net/binaries/centos/8/x86_64/ruby-2.6.5.tar.bz2=dcf5f9f63880a2b9263c240b69e1d6a9ed373d63292d4e16c6cec3fc2005fa6e6b1857809c792a3ec885d98b86d29efc9198e1e87dc2f05640a95fb054193a08
https://rvm_io.global.ssl.fastly.net/binaries/centos/8/x86_64/ruby-2.6.6.tar.bz2=6abaadf131996baecf0d9cb7abcef0c600f69e5dfccdbc1baa9476894526a80ce3ba5f1a0e3a33968da3bf918b18670b1d9e62a63afdfdb0f59025b961b57936
https://rvm_io.global.ssl.fastly.net/binaries/centos/8/x86_64/ruby-2.7.0.tar.bz2=8cc6cd133408f91b010f9d43bf75efed758cb2661bc1f2e81aa0594f67bc8b66a88cf269d7292f695652fa91564806ec2dfd656669f3a349d585c801c0dc04a6
https://rvm_io.global.ssl.fastly.net/binaries/centos/8/x86_64/ruby-2.7.1.tar.bz2=83c718094b6d16659b69267083f9cda1973a3702f972d4e64a95b934d26495c2d851fd325e2f03172d18317313aae10fb23c01fff1eaaab1673342b027fdd614
https://rvm_io.global.ssl.fastly.net/binaries/centos/8/x86_64/ruby-2.7.2.tar.bz2=f5f263321172620a653f9429b7d7e8e0f24a131887fc55668e201be65a7cac847d2e164924fc38bcc1dbe09cb41816cb0b375f2de390d241ecabf1af90102b36
https://rvm_io.global.ssl.fastly.net/binaries/centos/8/x86_64/ruby-3.0.0-preview1.tar.bz2=a76916fa6ca3313f986c15e0b015a878251949fcbb8dd440246de16b0c183673c6d07dafe927414df7c4fb7b89c56b8212851cf69bd79c93e0c76a1c420bbc15
https://rvm_io.global.ssl.fastly.net/binaries/debian/6/i386/ruby-1.9.3-p429.tar.bz2=4d70cef193c653d47192e42ffaefdcf7f1e31f10ae19e6925ed8b36d2ca2593dec79bb52a43fb56a489c614c4c0d2c609d0d182126cd5deee4a2bb1ff98fe309
https://rvm_io.global.ssl.fastly.net/binaries/debian/6/i386/ruby-1.9.3-p448.tar.bz2=6a4e742f09b038521741bbc4d9a5a65b050b978ecc056f2779b4f45d00dfb700629b3d1ac929a5b53b99ab4c86cc3fad91f152932d575af8e6167e303aa5ccc7
https://rvm_io.global.ssl.fastly.net/binaries/debian/6/i386/ruby-2.0.0-p195.tar.bz2=df0be41109ccc22b1efcf80915517dde7eb0a80258d41128541116ae4e21a09919de100c0a6e43bfdeb145e46098108c7472366c49325a25ef7a7c365b962b35
https://rvm_io.global.ssl.fastly.net/binaries/debian/6/i386/ruby-2.0.0-p247.tar.bz2=2942d171d1e7fb04f67b1ffea28cdaccbff0b88e84688734079bdcccc4e88344a00411b34ef352d69b17812f9d3aeb06c73b156d91da68398e752ec7a54ef34c
https://rvm_io.global.ssl.fastly.net/binaries/debian/6/x86_64/ruby-1.9.3-p194.tar.bz2=841debcf4328f39526d9d489c2430c329cdae9e130f6f775b78b3b340278f3aaa291f37f9626ba7d5e4a584e2263ff7d9783574b5445b0243a7a81a273ce9aef
https://rvm_io.global.ssl.fastly.net/binaries/debian/6/x86_64/ruby-1.9.3-p286.tar.bz2=05a93169f08e85deca44474e3cf76276e0ad5343922218fefc8c9afee1831d1e11d5349cd9c315cc37ac2f9bebc059941474108fb029fddd80934b7b69b1a62e
https://rvm_io.global.ssl.fastly.net/binaries/debian/6/x86_64/ruby-1.9.3-p327.tar.bz2=828ecd6357df30ed1c9aed6a929db94a543b13a75c5c5798b0f84f5b95dd88f538c0e85a509230c9ad613af017ca190585f6b99dffa1f726a4ea491d6e221465
https://rvm_io.global.ssl.fastly.net/binaries/debian/6/x86_64/ruby-1.9.3-p362.tar.bz2=a64b5b97d02e1a946a47f2e4d5e70ac62a459ff5bc53f2909243638b12aa0e0228a7d507eb4b3d8f70cf105ea7c13928c2475d6654611bee56b6b1a0a9ccad75
https://rvm_io.global.ssl.fastly.net/binaries/debian/6/x86_64/ruby-1.9.3-p374.tar.bz2=7d38c266a71a5461d6dae350779723df8fe6f5c6ec4d22dce46a8adc7aa1bb6ced90e4bfb3b023fdb0c046649667f8f53adde1b5819e0ad282da39e5552e4a06
https://rvm_io.global.ssl.fastly.net/binaries/debian/6/x86_64/ruby-1.9.3-p392.tar.bz2=179d7100eb7a67d7a94957e44373db4a15096a8a708cc4ce5af2877b7d23ff12a4e4ed7deb1fa8ec3baecb41042908de3cefb2ae2b42af1d25f8fbbf665fb96c
https://rvm_io.global.ssl.fastly.net/binaries/debian/6/x86_64/ruby-1.9.3-p429.tar.bz2=3d98626b1c3d9be2a6b08be6d13578e8061cc34c3280cabba90f02b287bc3d21d587e0edf79c600bb8a450312d0175c3a9470bfba6d0b0c32721a53eb80c4121
https://rvm_io.global.ssl.fastly.net/binaries/debian/6/x86_64/ruby-1.9.3-p448.tar.bz2=9427a0b640ce7d108cd580da5df865f35c9e4dd2ed8000d5181fac478f23ff4dcf542e83d7afc8a8139ce66c9caafff8e9469af056fc037b39523e9264f15034
https://rvm_io.global.ssl.fastly.net/binaries/debian/6/x86_64/ruby-2.0.0-p0.tar.bz2=d7bb877878c1bf90019204e86acf1666da0c926d40e68d03930b67c81ab2fb058794cde69a934d040f12a5c5b194f231280863f0e8d5565fdd6f55947f0f98e2
https://rvm_io.global.ssl.fastly.net/binaries/debian/6/x86_64/ruby-2.0.0-p195.tar.bz2=5a249cfeb73461beac3eb53ecd8a8b003fa62f7a83e0eef02885b6a1e05b67322c4d1682d08a57e239671bba9bcd7f3335d29495413feae38e628b9be985303d
https://rvm_io.global.ssl.fastly.net/binaries/debian/6/x86_64/ruby-2.0.0-p247.tar.bz2=f38145afb70463d7241ad4bcad13c5ef41e3cd52a416d7900eaccdc76bee6fae0fdf2dca798940c307aac4a1b891bd0317ab1dd0c90c781d1bc8cf731f336aaa
https://rvm_io.global.ssl.fastly.net/binaries/debian/7/armhf/ruby-1.9.3-p362.tar.bz2=74c06b59ad4f7b2e50aafe241a1fdc86fdc07bc5d5f7fe2f0b331802953addd96d56cc0313acb1a3241a555b50d0da8af7e869cff0a37343036e88543ac60d13
https://rvm_io.global.ssl.fastly.net/binaries/debian/7/armhf/ruby-1.9.3-p392.tar.bz2=1d22ffd5cc2c595541172a7cb5b8844edc11d34fb4e997692fd8de87e790dd315ff81d6269c1d2b4d20d1c82d2f2635de23e27102c1c56638304c67919cb8336
https://rvm_io.global.ssl.fastly.net/binaries/debian/7/armhf/ruby-1.9.3-p448.tar.bz2=9cd4a10f38bc25c7295868109c0729a85b48d868145231a99e370d116cd74dff028ace2ed3e880614d034d6194233163201f526d6d035b16487bcfae0c65f0bf
https://rvm_io.global.ssl.fastly.net/binaries/debian/7/armhf/ruby-2.0.0-p0.tar.bz2=a003bc21e59831ff2fcbe176167b946f4cd3b77caedb421fecee52aac00cf09ad51d06b52b772cf6a11d268624732d3a7cfcd2a63f19d2654906b5c51f712268
https://rvm_io.global.ssl.fastly.net/binaries/debian/7/armhf/ruby-2.0.0-p247.tar.bz2=dd24b832b3c077c81605694f36e5b6468889829f7932aa11f37ed09b173116b8288ae4ff21a64b0d4fd8ce772fdd1947a51d2b2fffbaa8c5080a0f2d50d657b3
https://rvm_io.global.ssl.fastly.net/binaries/debian/7/i386/ruby-1.9.3-p429.tar.bz2=858e04b639210ba6d781f4cd055c943baf2bbe956990de272def48c75b90aeadab891d0b2dd1926f8398bd3ae1ec4810a1641dd3bf393737fb295ce99743e563
https://rvm_io.global.ssl.fastly.net/binaries/debian/7/i386/ruby-1.9.3-p448.tar.bz2=d443df9db09cdc46a39243ee7817b8a43ad88fe664ba2b9707d6e456cc698990dd2cfb502f652d95eb84623e644ffa2ee8b7b1e4a0c961e3a97ba8aca3c20771
https://rvm_io.global.ssl.fastly.net/binaries/debian/7/i386/ruby-1.9.3-p484.tar.bz2=8974166cd04d605f47c42c84c90d5a0e1a013573d4c2c3dc4b5b1027d65674f76aabbd4d4c296ccb477948f37b46f409fb4acd0a235e900e9ebeeb9077ea1c42
https://rvm_io.global.ssl.fastly.net/binaries/debian/7/i386/ruby-1.9.3-p545.tar.bz2=04be7e8f9a3a0856f2d94e6ac02c6ad85a34a4a583734b8d40edfdc92da3f7b30e5e36710233f5ddacb1fa3d773ed19aa24ecc8ff7ab6cde807dc142264586c4
https://rvm_io.global.ssl.fastly.net/binaries/debian/7/i386/ruby-1.9.3-p547.tar.bz2=7f1cabac9a3d2f432453b0fe33e59e67159560e310ab7adb1a719a1b3bc7cfdfab7d42fc47e0193c6e6191d0f0809c8f3366472672bc5c210cbf37d9e21c8dcc
https://rvm_io.global.ssl.fastly.net/binaries/debian/7/i386/ruby-1.9.3-p551.tar.bz2=27c3e275a9b55481f5b7f81ba9388a00c69d639edc4f48df8ca38a9f65e465ee838733c4bd8aa1984a21e0802c8c313d2799ec762bb65f3cbff2338240f2ad20
https://rvm_io.global.ssl.fastly.net/binaries/debian/7/i386/ruby-2.0.0-p195.tar.bz2=22c0d6df741b4a92cda77747cc8496d251b04b012bf043e69509c3c74475449b1533a30a85da66473a39eccdb3cef16a75fc87d9a309e8adf6871cd7f0650e82
https://rvm_io.global.ssl.fastly.net/binaries/debian/7/i386/ruby-2.0.0-p247.tar.bz2=7742db6d34f0e7121c3bbfff922a2e848e9d9e750df001a0539cae860edabef9a762346c2b7e25bfdb956d97d14d0374559f18614f26bd0f400ee7c9da4288aa
https://rvm_io.global.ssl.fastly.net/binaries/debian/7/i386/ruby-2.0.0-p353.tar.bz2=45c4706a81e9bac8855508cd9ee4c96248f6d0f2606b735a9a7fa8e82315003808bd65ac93aff50bd46ec9baa863026f2e9e76f0438589db666018afb4aff6fd
https://rvm_io.global.ssl.fastly.net/binaries/debian/7/i386/ruby-2.0.0-p451.tar.bz2=98878fe51c0c4fa1bda30be9b6dc7f4b52a640d8ea9e7ed8257a55df6184b4d85296cf7927568c17cb1711a5ab55023e88390a72478dafd571473f46442abe2b
https://rvm_io.global.ssl.fastly.net/binaries/debian/7/i386/ruby-2.0.0-p481.tar.bz2=7fc39fb97da6addd2fedfda5936917f5ca13972033fdb8e0474cdf14fc2e94d825c10c14d78aeef8317ea7e720e10d25a5c01a99c58eb1e625bc78ce39495d4c
https://rvm_io.global.ssl.fastly.net/binaries/debian/7/i386/ruby-2.0.0-p576.tar.bz2=394f5405b2e0b23e850dc763cd63e4cdfba45cf10ab830f2b704637cc3832305ba222064e6661fbce8a43e36b99096d8dd99af4f9916793b6d86191dde35b21a
https://rvm_io.global.ssl.fastly.net/binaries/debian/7/i386/ruby-2.0.0-p598.tar.bz2=7ffe365e9eb4674e723da040ea8157bc1d572f525b9c69d4cd3409a033dfcd32bbf9bc574a6e22cb292174a4b7d1cb3a184ea5f908c69ba1b76f10550d85adae
https://rvm_io.global.ssl.fastly.net/binaries/debian/7/i386/ruby-2.1.0.tar.bz2=7e5cc8503f1feca560af2b834ef2e84f50db803b958fc74b7cb3bfd4f99b6d296bed4682331a8ae3107ebdfcf36955fbf7884060531c12af2b4bd411cf3c1eaa
https://rvm_io.global.ssl.fastly.net/binaries/debian/7/i386/ruby-2.1.1.tar.bz2=acbb338d7ac3f436a58721d58fa005c5f654c7ae5f1cadec3b0a3a4619754d4249653014570921f158ceb70786cb12f868080635db73251f9d2dae6f5f4a3659
https://rvm_io.global.ssl.fastly.net/binaries/debian/7/i386/ruby-2.1.2.tar.bz2=cdd2c7c30f4ce5d8ec8b7cbce54231b990e840bbfe44ade5a78a854aea6d1474f8bed9301b4a30aa0344835d3583161b24fbd7267b3cc592edaed8e9e30bf85d
https://rvm_io.global.ssl.fastly.net/binaries/debian/7/i386/ruby-2.1.3.tar.bz2=1a3bc8fe845d7c2335168e55d8c977b7f8b28a024420da2295d404009f1b4c5ab8861321987e1dfb71a293f37defefec092e5afcc48a3b6178b2ad540aa89ebe
https://rvm_io.global.ssl.fastly.net/binaries/debian/7/i386/ruby-2.1.5.tar.bz2=b3be3e5efc889a8001ab3cb861db100b0445f7c87cb070f6dbc4aaa435f4659a2538cff4394ab54d90abc34dc7ee4cb2ea7dbbfae7caaab05c490983566011be
https://rvm_io.global.ssl.fastly.net/binaries/debian/7/i386/ruby-2.2.0.tar.bz2=774534b0bfe7a49775a51f6c5cd660c477994ca6d93bcc1f4429e41ebe7f1cdc7fe7993bb336433443810c3563b888018b2db1dc6c7e6cd6adb7dd925df6f4b4
https://rvm_io.global.ssl.fastly.net/binaries/debian/7/i386/ruby-2.2.1.tar.bz2=70b33dc43967e2bb2929a428c8f86159de9e1417211a06f07ae889f02ab8e0e96d812643c380489681fded5039ba06535f052d487085dab1afd6a505fee3e47e
https://rvm_io.global.ssl.fastly.net/binaries/debian/7/x86_64/ruby-1.9.3-p194.tar.bz2=432a5648f80fafe07499da961b1acb22f30bc9d22b4a5f1a6c2896cafc460b631f75147f33081d3493b2c42a94dbe593e8e881c11e3b0487e4adc973bcb7d01f
https://rvm_io.global.ssl.fastly.net/binaries/debian/7/x86_64/ruby-1.9.3-p286.tar.bz2=85749a4e49897b3fd93360358c77c1939eb1a2deea82893737c00d3211fae9dba93977a7707525337dbb422d6f8a8a2852ec201779178b78fdd59d4d3b94bfbc
https://rvm_io.global.ssl.fastly.net/binaries/debian/7/x86_64/ruby-1.9.3-p374.tar.bz2=e58ecdbec37538a5e4775ef9e99edbb7d4ac735f502f9aac25acaba9298a6adf2cb8eba5941dac570d7acd49d956b6fd69655d4a83d6147d24b69de87b1cc702
https://rvm_io.global.ssl.fastly.net/binaries/debian/7/x86_64/ruby-1.9.3-p392.tar.bz2=c57de5a446cc41c2823864a636761543179a789288a52b52e2117c6ba67cf75cc86df6b157d96c01aef2835091b81bd3a0f1014d9adbf6e8a3af82a99eeba4df
https://rvm_io.global.ssl.fastly.net/binaries/debian/7/x86_64/ruby-1.9.3-p429.tar.bz2=8c2e3c3b5823e53b3e9ccabb83968a3796daf453e1d71c1120f59f69a9631c98cb7682ea2d39e8f1e814c5f35a1ece29af6d24cbf02b59b5ad02160bb0eddea6
https://rvm_io.global.ssl.fastly.net/binaries/debian/7/x86_64/ruby-1.9.3-p448.tar.bz2=b40c6909b31c176d2a2c9285f31d104dde138136cf9ed9423ef094b8048cc39d29fbc797c122c4669291edb29670b52b0634c1d65df3ac35289bc425d990b523
https://rvm_io.global.ssl.fastly.net/binaries/debian/7/x86_64/ruby-1.9.3-p484.tar.bz2=7e8b068a563de470deaf9a9b6b79dd5e3e49119e46a563a2e5b591eea779ebf91b7c510e390e6957114768e5577edeebb40eed19a6f0fedbe3bf6c0de0e7a1f9
https://rvm_io.global.ssl.fastly.net/binaries/debian/7/x86_64/ruby-1.9.3-p545.tar.bz2=a99c7aa56559c77eab2c857ce1085ebb3f741f0ac9fad04057fa00deb3f24b33a5a96b12703c8a4f16212e969a6d22f5c5fd8d919faa6a85808938bb7f971392
https://rvm_io.global.ssl.fastly.net/binaries/debian/7/x86_64/ruby-1.9.3-p547.tar.bz2=d52311e6f76751cda4bb05a21ca60e080161a6fbfeff356796ebf0ee6f5a3d3625cfaa2654002c62640abb08e61af53eef580814f03744372c4301c75695c33d
https://rvm_io.global.ssl.fastly.net/binaries/debian/7/x86_64/ruby-1.9.3-p551.tar.bz2=98929857cc130253704e251c70dc7279ad02fc14c349e709ec757ac75145af3f95d8d1a351eea4a33a742c6113a9b29b0a4d239e8893eb518db973d0aa7a76d8
https://rvm_io.global.ssl.fastly.net/binaries/debian/7/x86_64/ruby-2.0.0-p0.tar.bz2=8cb51732ba1ddbebae3bf5e5fcbb22bbb4d3de32c33168583ea26fa0515562dd6e4d7610ba0650aa3c5106ee4c8ff94ef0b2860c094f7732af81c9dcb6934038
https://rvm_io.global.ssl.fastly.net/binaries/debian/7/x86_64/ruby-2.0.0-p195.tar.bz2=f81b9d5811e6bc234a4547957f74ef4d854eead399d12a00fa0533ce2331a152409481ba3a85c77d386d0b7f3dce6f65c76d818b87d7e29b5c714822bce4df81
https://rvm_io.global.ssl.fastly.net/binaries/debian/7/x86_64/ruby-2.0.0-p247.tar.bz2=5378320b84e7d7dde01c63751c2e615246c1539874456340f6618540703feba37272a14be67a5f73ea5aae882b090c857231bbc7dc425e14aa7f4bab909d66eb
https://rvm_io.global.ssl.fastly.net/binaries/debian/7/x86_64/ruby-2.0.0-p353.tar.bz2=719c6d643e4fdf97331219f613776255c6be661062aac0cb3354e77412232503c8e106c4b8b0ac8cac5bf87f96ef4cf8932ef8c0b10f718675628e8e26886a77
https://rvm_io.global.ssl.fastly.net/binaries/debian/7/x86_64/ruby-2.0.0-p451.tar.bz2=2a10dfe370ad9b7aa9745d18854c34992ee3f8a32a4277614fd51cb3d0d4b71d712807ecc89389c2d6c2921bec9157ce8f0e6b5f441c77052987e58bc2c62d02
https://rvm_io.global.ssl.fastly.net/binaries/debian/7/x86_64/ruby-2.0.0-p481.tar.bz2=51b274eb239bb7c2dc75afed893ed7504d7ddc8b4c3a945570dfd2f7bc5559211cf4b810bc13acf4fd55536be08999ed5e2559b1918c228c17c3426d8e84973f
https://rvm_io.global.ssl.fastly.net/binaries/debian/7/x86_64/ruby-2.0.0-p576.tar.bz2=e7c78e28eaa5474ec28f44d16b82ff59bb730ab4eef81de972f5515eed86d6b1b13f0a7eac2290f13ff2699ef397bcf0935ad2866d08286235ec43c87749f001
https://rvm_io.global.ssl.fastly.net/binaries/debian/7/x86_64/ruby-2.0.0-p598.tar.bz2=0c910fc58f999a5bbe0a5106f8a5707d8b26f9791fbf528c2dc4f2c3e9664e2ef4661ed2265aaca1874b9ff81dbda98034cac8f03adc9942bb36f2d6ba70fd86
https://rvm_io.global.ssl.fastly.net/binaries/debian/7/x86_64/ruby-2.1.0.tar.bz2=286f9ee75138129e65ccf13ac51825eda60bfed99b70fd2a7988c9e9f1deb9667e1941ae1daffaebd7fb11e4814dc5c9a9cc23748034a063bb8b59c7df529a31
https://rvm_io.global.ssl.fastly.net/binaries/debian/7/x86_64/ruby-2.1.1.tar.bz2=caaced64ee59e9a74ca774d410f57aab00fcb094443e435f62d99fea8e960f8f7211d6e00a0b42c539ed971effceecfd172e7302c0c4de764cd9768423234d06
https://rvm_io.global.ssl.fastly.net/binaries/debian/7/x86_64/ruby-2.1.2.tar.bz2=f8e97b5f624a0d72ec719dcc4c0f113644ab771fb2b205b3df37f6564abea0f2c477a7f2f254bdca12ef9ec1167b4b3f77377d13473e60976cb3a3c8b63dba60
https://rvm_io.global.ssl.fastly.net/binaries/debian/7/x86_64/ruby-2.1.3.tar.bz2=7c1585a6ebc3ab09f4631b6043e66143313362a325677e98af18a8e77eb38e245c759eda728d7e518f44edae1767b3dc917c5f347eee3f969b82c1b7a4278262
https://rvm_io.global.ssl.fastly.net/binaries/debian/7/x86_64/ruby-2.1.5.tar.bz2=11e5f701e569c00c16d841fa1a8ba1aefa4c7c24a724ec552ec751a480a24a23eb2fbfe1d7fbc69c7790d78c7408e3f793a87e6c5e4a21f4b56369de9c3edc14
https://rvm_io.global.ssl.fastly.net/binaries/debian/7/x86_64/ruby-2.2.0.tar.bz2=f5d2b72a948c0a7ca42ca95e3d8a67908f075e51b70048eb927de9bcf22c2b0522614cf1e35718cbcbbc6f945425fa3e388dc335b7d2cce76ac1862424a0d509
https://rvm_io.global.ssl.fastly.net/binaries/debian/7/x86_64/ruby-2.2.1.tar.bz2=d9c85799864390dc3b728f84e0272429e9fbf41826ff261c1b4747448d2794590f9f1f0cc04b7061b37c0862bb64cda45b0c0d52dbffc1a4516efdc94b49daae
https://rvm_io.global.ssl.fastly.net/binaries/debian/8/x86_64/ruby-1.9.3-p547.tar.bz2=2e51ed52ba71f55ead585f81855a5975df1948565fd84d8a13616958e25e141b300e846e38d0407a821c0bd3d71306b1f948f028de7ead4ca1bc4938c5cfd7b8
https://rvm_io.global.ssl.fastly.net/binaries/debian/8/x86_64/ruby-1.9.3-p551.tar.bz2=f44c1f8195da86beb3fcce58c227217b52f925a075acad54276ffdf9358599f7a26badb26862aecae29422ba7b668b62ba913911ec046d47463165e341795bfb
https://rvm_io.global.ssl.fastly.net/binaries/debian/8/x86_64/ruby-2.0.0-p353.tar.bz2=2b789adb43702694c4626dfc9531c636f5976acf899baaae40e49492441755016162e0f7be8a22548435e2872ff043c7fa74a59e12c5d0e9fb5521fc71ac84f0
https://rvm_io.global.ssl.fastly.net/binaries/debian/8/x86_64/ruby-2.0.0-p481.tar.bz2=2f34b913a404c53e54c2d59486dc09351683acdda3eab4214508515fc9fb96951fe42adaa1c9bbba366b856980fcb41ed80a24f014c245a4a3dab66daebb9be7
https://rvm_io.global.ssl.fastly.net/binaries/debian/8/x86_64/ruby-2.0.0-p576.tar.bz2=31fb155b0c6a265a205925b13dc2b03d959c63c93f2ffceea32863769456199660072fbfb1dd15ddacc047235ab4acbf6298e887d5de42ebca756e7bf2675a19
https://rvm_io.global.ssl.fastly.net/binaries/debian/8/x86_64/ruby-2.0.0-p598.tar.bz2=3fa6df83fe2c8e8a71b4ad35e71c232134d651a5e04873f158f9ce8d3a2a582c9c132970285fbfb62300194a8688694a87fb062c3a9051c3455e14dd47ab61cf
https://rvm_io.global.ssl.fastly.net/binaries/debian/8/x86_64/ruby-2.1.0.tar.bz2=82b813497a3e768a45837444fec6f2212b68375a77613f9365330e7fb43d0b4c830d39e8a043bcb63b7f0e33ca2917ec52c41c338c81f6f8f5a9f341d5ddacfe
https://rvm_io.global.ssl.fastly.net/binaries/debian/8/x86_64/ruby-2.1.2.tar.bz2=9b8a74e1be4111a24c4e53facf17db98c7092d5bc29bd845a50d74c3847232b4162de3ebb1292dfd414378adefcf3abb547cbef4bfb673a88904bf9acf6a74ea
https://rvm_io.global.ssl.fastly.net/binaries/debian/8/x86_64/ruby-2.1.3.tar.bz2=8c3f7ca497194668bc7c9877981f6277d126a336ec35e03f8f503477369238d078b661804a9142b92339fa6f88fa66493093bc4621472c354d2bab9e99ad1ba8
https://rvm_io.global.ssl.fastly.net/binaries/debian/8/x86_64/ruby-2.1.5.tar.bz2=c8c6e8fb5a4b936696b2cec9b95720e926ed4d65ffba6730e4751c800e5928659de32d25febe3580dbc8b81153d531414af631c68c6488e17a3c9883c12fcde7
https://rvm_io.global.ssl.fastly.net/binaries/debian/8/x86_64/ruby-2.2.0.tar.bz2=194359246ec0396ef5ee794af25d5ef2148736ae2d903e615f4c6a18e048e21b19369894cb0938c196537e825ead42ae3006e4116ee2174441935ad157d41464
https://rvm_io.global.ssl.fastly.net/binaries/debian/8/x86_64/ruby-2.2.1.tar.bz2=df25f6121c2e42bf359077c3f9b76a3524436f56c36db448163334bff403b4caae3cfef1aff4fceb3d09d41d448089cd563f0a6fb4e88bebdbe12895b18fcc36
https://rvm_io.global.ssl.fastly.net/binaries/debian/8/x86_64/ruby-2.2.6.tar.bz2=b4a404c9e3f39e624fe45e6a1ebd46b51063068f88944d79af1d8fdc1c8d6eb7fc3611248ac8934a85a0898ed36b1d8892ada5d7b173f1cdf2d9a079adffa3fb
https://rvm_io.global.ssl.fastly.net/binaries/debian/8/x86_64/ruby-2.3.0.tar.bz2=212443eb00ed31d216fdab40ba0371ed11ceeaeb5372be1e2c35b76153b067c017a734dd7525e1d1899362e671f09968147d427211d95aa724a5eacdaa3872c4
https://rvm_io.global.ssl.fastly.net/binaries/debian/8/x86_64/ruby-2.3.1.tar.bz2=c1031628607de509fc11d8e38d3b8318475abf1ee60e0450e01a381cdda09e5606a6553042477ef2568bdefbad35c6c5df8fa00bd0e2be446bf186f18c556ca3
https://rvm_io.global.ssl.fastly.net/binaries/debian/8/x86_64/ruby-2.3.2.tar.bz2=1f75a32a153db289ed9948a2fe3c120ad30fc0d5ae3d74e1ff6e487b73c0d4451c6660f72ac5204b76f581a00d1ad62ab4337b90cf55c907e8546fba1af4e571
https://rvm_io.global.ssl.fastly.net/binaries/debian/8/x86_64/ruby-2.3.3.tar.bz2=ab9e9ca948a28a44e401aa01a7264b0aa5a2a43236d55962ed8280f819b15205d40690546b50a97eaf4a867d344825aebc153e6f6d5abf73b6dc399253dc7051
https://rvm_io.global.ssl.fastly.net/binaries/debian/8/x86_64/ruby-2.4.0.tar.bz2=82c4bf2bba4cf7a1b09b6cff9fc6a445f16109a6c4647f554f1dd920a9f1dbac6450ec75b0d903b679af7eb7ca94ea7781cf37757d98ce18dc0432c280506601
https://rvm_io.global.ssl.fastly.net/binaries/debian/8/x86_64/ruby-2.4.1.tar.bz2=5f2dfa53eccc43c28f40a12fd53cf76acd3466a0b3f3a63bfd95ada53598bb26a5449d36f62a4edd468d62e2de04ffbeaa115936a5e5d5b310e42128ee839afc
https://rvm_io.global.ssl.fastly.net/binaries/debian/8/x86_64/ruby-2.4.2.tar.bz2=87f446db73e70274181cd71d75e902db6b96ee73ff2556037814513d9a00dad2de98f4da1801384b5ef44eb20a7699d4f8552028892a2a1f42b41e0b53bc81ba
https://rvm_io.global.ssl.fastly.net/binaries/debian/8/x86_64/ruby-2.4.3.tar.bz2=54d20dde89fcd32e198f5fc75134686bfcf9355b752dc86c2f3ce9290950c7ebdf257573cff5364ebfa8e7287aa2903254dbc5ad4edf65b5a53bff577cb29800
https://rvm_io.global.ssl.fastly.net/binaries/debian/8/x86_64/ruby-2.4.4.tar.bz2=11e12a4b844bcc3ef0e969dc02225ebcc2153805427e0b803a36622564ee824474010f1a6e2c514b99fff6a5a65b6460c42b6bb08ddcee8945deb46988e429d2
https://rvm_io.global.ssl.fastly.net/binaries/debian/8/x86_64/ruby-2.4.5.tar.bz2=9a109453adf3f6d92a1817832170625e44b23842698119812ca1e368a00c1b0f2ecd3ea9f7df58badee61a75d125ec424263def8d2f4d386f226869ac5836a5a
https://rvm_io.global.ssl.fastly.net/binaries/debian/8/x86_64/ruby-2.4.6.tar.bz2=e90f8da1cf38366b668c06b187cd13a0b7e0a7731f71ba144d03f404f08704c762886308e5df7bca8cd0a7cdc4c3393d4153d5600e75dbd6fc004f32f1b0cf07
https://rvm_io.global.ssl.fastly.net/binaries/debian/8/x86_64/ruby-2.4.7.tar.bz2=6beee6bbe64a4c535bbf7a04c560703c88da97ea64b3fe703a981b44c45de00e42bf840a5dc0c7a07123a21c0893e6a38cf26ecef1d2265c53a14b5007a3eb20
https://rvm_io.global.ssl.fastly.net/binaries/debian/8/x86_64/ruby-2.4.8.tar.bz2=7ce346c5d84e9a25d5befa0c6732ed8b2e210cd58d1c7bf0c9bcd8f555f3f28ac9906ca945f97438c394f31ef282d92eafc6bbce4e19621889173ac3745ee5ce
https://rvm_io.global.ssl.fastly.net/binaries/debian/8/x86_64/ruby-2.4.9.tar.bz2=049d48307fc6ee640836eeed7f079ca37ed242eb574cd6f315e38a5fa324dd090bf3e200cc8115db68cc8e810d0814e8050311be4f96911585f2ee476d56cb13
https://rvm_io.global.ssl.fastly.net/binaries/debian/8/x86_64/ruby-2.4.10.tar.bz2=33908c1e123f238bd4a187c1d1a2f46a5d215ca6238aed9d2be477b569c1de1ea676725342fc7e623fcfe21aca3f30c292c003e8a2d07f962c497c782b576f52
https://rvm_io.global.ssl.fastly.net/binaries/debian/8/x86_64/ruby-2.5.0.tar.bz2=298fc6eae9e55c70b216ae3ecff5333fa666213ac3359d8b14335e0f566e5bff46083b43b7c81cd40c23e6a61084d3af4d0f62f883e5bc839cd4c3e4a093bdd1
https://rvm_io.global.ssl.fastly.net/binaries/debian/8/x86_64/ruby-2.5.1.tar.bz2=26265260777fe7ef1794e2cce71d254e07f160643e25696c7f2e2009d698a57493c677c32289013ee147af26e4f9297c8a6f59313ebba48a22478f492bbe6162
https://rvm_io.global.ssl.fastly.net/binaries/debian/8/x86_64/ruby-2.5.2.tar.bz2=196943cfc3fdf700df342e18bb5f50713ddc875e4b22b3a3ec79f7fe5c5803eb5c0b999d73ac9b6cee094c9551ef7a7d5e1d7444d907909620949d353160a48b
https://rvm_io.global.ssl.fastly.net/binaries/debian/8/x86_64/ruby-2.5.3.tar.bz2=7118fd81e8e73b49d3c3e2dd62e60db09b67a7a8f4c16b3594d88e632079a88beec4740500db55e44ca6d607afa4d6c5eec47c20183ed339b91d05077a050068
https://rvm_io.global.ssl.fastly.net/binaries/debian/8/x86_64/ruby-2.5.4.tar.bz2=c55b37c26ad7a1bd9647439058af7d90edd5c4ed87824658487b861395e71c7161b4b2f1aa40b41c3394968a333a0bf70601b6344c9d5fc35a9ee463d2e87c72
https://rvm_io.global.ssl.fastly.net/binaries/debian/8/x86_64/ruby-2.5.5.tar.bz2=8631dda6f18edf9b5a34f8d5b42ec82a53c493c4697c6f4d5643cee1d92e95aa6724ba302d8e51915d6a2e00d0bcbf5748dd9de0ff5518f433a97e3602c035c0
https://rvm_io.global.ssl.fastly.net/binaries/debian/8/x86_64/ruby-2.5.6.tar.bz2=b99c82c4903d39215dad1cd4e09cb5c2849d3207289a1d84bdf2b37e2042c218b1582710bed146de812f9dd3229d82025ca84572417111c7e2c67d22421409e8
https://rvm_io.global.ssl.fastly.net/binaries/debian/8/x86_64/ruby-2.5.7.tar.bz2=c1adca93c140dc81581907ecf29d46157d7077046ebd09753eaba34106622a83057d48aae4f0729c367a41d35b83d0616ab0e3f926895485a9e36397e06f5d62
https://rvm_io.global.ssl.fastly.net/binaries/debian/8/x86_64/ruby-2.5.8.tar.bz2=3d9af3fe6240955176732288dc847d8c4a986bfedac387c1d5c7b8ea9625cbf036e6f8542fd1e8222c507836584fd80f2151238bbea1c16b466233aac408e4c7
https://rvm_io.global.ssl.fastly.net/binaries/debian/8/x86_64/ruby-2.6.0.tar.bz2=ed9d3cd6e1a99ce822cb8972182b20e15dcfbf95f45b37d4de3057df81545af32a180a91634743b0410dc2ca33b7da9289c306b0b4f0b8770c019ee490e60f2c
https://rvm_io.global.ssl.fastly.net/binaries/debian/8/x86_64/ruby-2.6.1.tar.bz2=306a4176e6e93a5a1c412a003bb73fb31504a0ef7eb6e439802b4026ee9759ab09102a298956ac11dcdaf33426c19a4da101c7c6c8b8ad7304e43670f8de1e02
https://rvm_io.global.ssl.fastly.net/binaries/debian/8/x86_64/ruby-2.6.2.tar.bz2=1edb923ede2f08dbb68abd5592449448489c2224a5c693faf95c17a78fcd211d4bfaa203f7f223134f2dcb3d53ae55c728b6a4943f512def585e8bfcf7013ab9
https://rvm_io.global.ssl.fastly.net/binaries/debian/8/x86_64/ruby-2.6.3.tar.bz2=ac582f7e4d23fddf9a0c78d6aa7bc67f3f3bce8e452fcca115a205fedacc4f1e179683eb8607783cd532641b2635e83649fb6c52dd4d3df9e9559ea5999136d6
https://rvm_io.global.ssl.fastly.net/binaries/debian/8/x86_64/ruby-2.6.4.tar.bz2=55fdad99241db7153d907926c6fbf030b19933cacf3ddb58ee95e849dcf262eb373c2346d7b42fb99d62e154aafc14df9d696a7649047ff9bee0a627062dabb6
https://rvm_io.global.ssl.fastly.net/binaries/debian/8/x86_64/ruby-2.6.5.tar.bz2=b468c508fae6e7d542cab5e6215f94e83144b24a7a4b532e8a9f78e16d174caf8a51c19b00fac11a03099d15580c16205ca9713e03237534e2ca003cf3f4abea
https://rvm_io.global.ssl.fastly.net/binaries/debian/8/x86_64/ruby-2.6.6.tar.bz2=b3df19a3ce52e1bce62ea016cb75d383a81a70268d37ffca104830394d365ddce57d21fe17a6a7fde180f336598f5486c3e716f32cffecf7d24b13de782fa9eb
https://rvm_io.global.ssl.fastly.net/binaries/debian/8/x86_64/ruby-2.7.0.tar.bz2=7a8159f2667265be96a54689b48836778cf1d433caf8b737d55d52fce3ce4d50da101b41b9c5927a22d659b4861772efe7d44d2a0c76c1757b8244efa95c9bc2
https://rvm_io.global.ssl.fastly.net/binaries/debian/8/x86_64/ruby-2.7.1.tar.bz2=1b673bc33abc96e0abda406d1e028a80f287e0b99e73aa4d0ec0591709177bf2f9d75f3ec94bafae4e24e23f056848bfa9741486eec0d6599f34911304792ebd
https://rvm_io.global.ssl.fastly.net/binaries/debian/8/x86_64/ruby-2.7.2.tar.bz2=705b0f7002807e2db0db6f38f0eb9fe4d6012d6d1673c19a363c29a034551102fb92cb7e13efb90c0559acae9a45bad5ea13c50e0af35b0dc1776b8d917fd802
https://rvm_io.global.ssl.fastly.net/binaries/debian/8/x86_64/ruby-3.0.0-preview1.tar.bz2=b0c2665b89fed26095bab8e7bf54f2b4718b05a3e4c6c612c9e36785c432ea46e43eea584c2123df5f9f18e2ce51db3a4425c56f371def69cfa8e7e1d6bd0b2a
https://rvm_io.global.ssl.fastly.net/binaries/debian/9/x86_64/ruby-2.4.0.tar.bz2=e9cd5b3bcdfadf36bb6f9fa836cb24386af680f583c15954cea969ea12b8932aa2cc5f304e73a18d4d6524d6202e0055864f535aa40cb028ea6b026653368b62
https://rvm_io.global.ssl.fastly.net/binaries/debian/9/x86_64/ruby-2.4.1.tar.bz2=4cf75eabe008e882ceff21c09b47b0f22b2ad34c55ca51bbd1b316532e21baaeebaa273cc69537d4f379ae3f37187b3ae48f249c09ca5cadb06174ca1f3958df
https://rvm_io.global.ssl.fastly.net/binaries/debian/9/x86_64/ruby-2.4.2.tar.bz2=e7f5eea4250f0262a5b9b42d74e1469c4c25da14845d254bdf146552e086bbd7faa9702fe1da8e7a3e04560ace7f104195d88b77cf1dc439258030baaac1af6c
https://rvm_io.global.ssl.fastly.net/binaries/debian/9/x86_64/ruby-2.4.3.tar.bz2=e4ea5e496e03b85335c9d0f00f21ff30c30dcfaec9b431b811cd591a71760beab1ae285c1629da13281db326a4863c1cc3b7f96c30ab9c9c1eb6adcefea660b6
https://rvm_io.global.ssl.fastly.net/binaries/debian/9/x86_64/ruby-2.4.4.tar.bz2=4cb24c4d59e1dd441d6e24e375fba003ecf3fc2a22e9a15e2790440887f779ac33e36d795b49dafc612cd891d670b599c5ec6ecdb44fb69b10e56d174b6f0d18
https://rvm_io.global.ssl.fastly.net/binaries/debian/9/x86_64/ruby-2.4.5.tar.bz2=f52b1b0a0136dff8a91fcfea64b89153ee3bb32093adb16679175a80daa476c1e33586bcd3b0fad870865673868001147a27a5064b60c7bb5ffb3fb17ca95a49
https://rvm_io.global.ssl.fastly.net/binaries/debian/9/x86_64/ruby-2.4.6.tar.bz2=736348b6f35633b3c0a0a459557126b6220df2afd14f5b25147aed66bf710967b4c2e78d3bc87b528059c29e76d08fe0ae385a142387282ec70395f110a702a1
https://rvm_io.global.ssl.fastly.net/binaries/debian/9/x86_64/ruby-2.4.7.tar.bz2=d548e0c43c68cb1a1444b564f3013900d0f994bb0b5d30b0088ee10491ce3341ff9a6ebe30493a8adcaf1e2e774891e03fe483e333070f995ead1810d588856f
https://rvm_io.global.ssl.fastly.net/binaries/debian/9/x86_64/ruby-2.4.8.tar.bz2=61ee8434d4e98e4daf750d41ec20837f53e79800798065c24c586c8bdb39baa047f80c6ec72688ad499836a92f1dc120c1e9bda8f337db5ef29e025a955d223d
https://rvm_io.global.ssl.fastly.net/binaries/debian/9/x86_64/ruby-2.4.9.tar.bz2=208a9a46870b50ce4a490ca876f926b1ff4f32a0287cb080151b0430c65879d2ff13bf2a0d7dd7dd9e17790cbfa2f55efb26bf4c28a8551be7e05685e2c2792c
https://rvm_io.global.ssl.fastly.net/binaries/debian/9/x86_64/ruby-2.4.10.tar.bz2=42848d61292bed5a51d2962e6b50d2e5b1cd1b514f65a76e066dce15d88df2794b8beee80234b131bcd8fc5c70c2c0c68089facde2e6683496645f9d36ea4921
https://rvm_io.global.ssl.fastly.net/binaries/debian/9/x86_64/ruby-2.5.0.tar.bz2=13852ffcd40f8babf49be082e75c9f709b080d804709e6adb3398f2b1e44a32163a95aa403baec62c2f7a88d5509d12728586e87f01c243488ab8ea7d950a557
https://rvm_io.global.ssl.fastly.net/binaries/debian/9/x86_64/ruby-2.5.1.tar.bz2=af3dd86b31467da497bacf62aa976b5612a41f101e8c0e18591378cac5df0a9e696bcbe5c3bc6926328263ffa4d4fb7a8a0099bc32ebe62d9733d6fb4c6d84ed
https://rvm_io.global.ssl.fastly.net/binaries/debian/9/x86_64/ruby-2.5.2.tar.bz2=f3e667aa6b774915b339a620b22a83bf1cd886ceee8cbea378e4df44bbe3dcf072b38b5d17b31041c730f4984147ab464c20707b382a74f84edac3ca6e839c62
https://rvm_io.global.ssl.fastly.net/binaries/debian/9/x86_64/ruby-2.5.3.tar.bz2=1b6b37e9a5f6214169e63e4221caf53d9558b8b72289012ac8ebc49d8fb21708c18963bd6d1a20208cfc0b594fe2c73490832461ed8c6d79050c1af666a9ad52
https://rvm_io.global.ssl.fastly.net/binaries/debian/9/x86_64/ruby-2.5.4.tar.bz2=2b12c40623778a9d9d1700b62e22ae348bf5c9989929abbe9b9abe6f4bb39c198df4167849da58765235802021b43ff1b3f6b69f33a15945b6cd231666aa1d8e
https://rvm_io.global.ssl.fastly.net/binaries/debian/9/x86_64/ruby-2.5.5.tar.bz2=83a2f4bf477d7c489404da62679887352ee5b550aab83f1c629e0ace9f2668e8252c1408f564e24eb1a35fcd6d0734b0cdd0c93ccda5c49c36f688a824eac676
https://rvm_io.global.ssl.fastly.net/binaries/debian/9/x86_64/ruby-2.5.6.tar.bz2=9c71f859026ec49959861b09c7493c50ed168e5fb224ea3d2005a78d089f9bfbda513f40f6cb7c1e7050beb20e0e9ab624572915330532643d57d6555f422043
https://rvm_io.global.ssl.fastly.net/binaries/debian/9/x86_64/ruby-2.5.7.tar.bz2=812635ca8a90726f080d6f489a68733e7eb6ec0302b57678eb2e5297ea3ffff2fd95a9789d7435df30d97bfefd33384d4e0a2ce0e0c8ccd5781ec31c7c9d0e3d
https://rvm_io.global.ssl.fastly.net/binaries/debian/9/x86_64/ruby-2.5.8.tar.bz2=3d2117ce007f0848326075f4670ac3fa428f56946978002a3ae08a7ce76b19b6e5b27e6f0d36e60cf2eb052504b859bfe9aa560178ce77bf29885e5436da7508
https://rvm_io.global.ssl.fastly.net/binaries/debian/9/x86_64/ruby-2.6.0.tar.bz2=5a092389edeb8219f680b2c00a0db51113a29457653d8023414465122dd5999246064b344551063d9476cc49126c52a6d41196fb17de08c0d8019e7823d49d16
https://rvm_io.global.ssl.fastly.net/binaries/debian/9/x86_64/ruby-2.6.1.tar.bz2=bf4647bc871fa684b3888abcc371024bc1211f38778a2b2eff15f72e18ef9746bf504f406c2cf8f1e252aecbfa05117cf282e30adfefcf64a238bfea64523aa5
https://rvm_io.global.ssl.fastly.net/binaries/debian/9/x86_64/ruby-2.6.2.tar.bz2=0b6a1e1de3ab61a9dce7ff785c72d61eec1a342a34dd93ea4ea3d68fcee0d207df1e398176ae7ca9653229ea4be19275afc2a00d24f17ab5be96883e1d4703e3
https://rvm_io.global.ssl.fastly.net/binaries/debian/9/x86_64/ruby-2.6.3.tar.bz2=7992a690846d273df96b2b247f1272393b9a77241936e5309f0adfe113e7743c37d7569ac2f35146ec754e2e4cde27ab5ff76f2b5df435f3481a802342277f3e
https://rvm_io.global.ssl.fastly.net/binaries/debian/9/x86_64/ruby-2.6.4.tar.bz2=02c6ceb9476b6025dceb654380133722db10733ca0467cb309ed49dd7fc9f820bd36da41df6ae0d7ed4e8b9429e7ba53587b629f3b49344a3e45af31484aebd6
https://rvm_io.global.ssl.fastly.net/binaries/debian/9/x86_64/ruby-2.6.5.tar.bz2=63d205c6559e61899f52d6ad83a609af1c88ba70292fc396497ddaca02dd322a232d664d75dcd496ab1e3bc51efc4b7e2f5c8273d4ee2b2ec4e90e36a514d853
https://rvm_io.global.ssl.fastly.net/binaries/debian/9/x86_64/ruby-2.6.6.tar.bz2=b137c1039798987cb4dcc4de1aa2cef4798dd7725bbfa395744214b288c63468bcc667ba480b98d532da362ceb9f90a61a3c200716fe435677caf72b0453d1ea
https://rvm_io.global.ssl.fastly.net/binaries/debian/9/x86_64/ruby-2.7.0.tar.bz2=5148d6ae9ef2c17ab9cf8974565bfb89dd2c20b787339f51ca410ea687914596be250a80ce7f42c7b0add297d1f1e67e8818e84eaa798ec40e6862ac65840f27
https://rvm_io.global.ssl.fastly.net/binaries/debian/9/x86_64/ruby-2.7.1.tar.bz2=f66dabdc67725ec330513b5efcf474cad222651a34c0c4a0c96bfef0302686075e62c7dd8e4050b2237ce28171679c4a5dbd1cd545a1f2acef63009b5b9347a6
https://rvm_io.global.ssl.fastly.net/binaries/debian/9/x86_64/ruby-2.7.2.tar.bz2=2b9f9645c01f62393ec498faff9afbc18b3be80e719bab0609dde2f5d3ae705c7a0e7439094b5e33f41fcb0be1b4292a847e57dbd4ace3266188ff5bedb7110b
https://rvm_io.global.ssl.fastly.net/binaries/debian/9/x86_64/ruby-3.0.0-preview1.tar.bz2=465c51f9b6f958e9daf2e881a93ac9908d0b771d5a4e261e4e23088b3a4952cd0f6f75b82bcd117cec72d1b5e35c31416cddd16ab7fab81972a2f337e8f2b5e5
https://rvm_io.global.ssl.fastly.net/binaries/debian/10/x86_64/ruby-2.4.0.tar.bz2=99e5e98b69e5b46d44081be06847005caee31f0837bf312d005d30bda6ec463bf69e13cd0c3517f5ccf95a933720e471b5a2a031c0481c75889e16e620c58edd
https://rvm_io.global.ssl.fastly.net/binaries/debian/10/x86_64/ruby-2.4.1.tar.bz2=3db44a23cb29901a862adce0aee3be01dfcb4daf96ead2363d803fd12c5e0b79e70716194d54a49ee28f2cbc7e1d9e32786b71e3873b9f0f58d96888ad139821
https://rvm_io.global.ssl.fastly.net/binaries/debian/10/x86_64/ruby-2.4.2.tar.bz2=0ac254ce732677f3f6390938d8dfb139ac28977b2fc40b4dac7c235b7b496131c7f5e0afb1db8907f82dda1103fc3dbc64f1c6a601c8ea13e06d9c3dae8bf5f8
https://rvm_io.global.ssl.fastly.net/binaries/debian/10/x86_64/ruby-2.4.3.tar.bz2=b7165ac09b7009435c76ff1aba08624bf195e504c804b468dc8bfc83739392fa3c0e935c1cda3d8e4878127374bb9725726ffeb1f80e403d37a7e873e8e86f93
https://rvm_io.global.ssl.fastly.net/binaries/debian/10/x86_64/ruby-2.4.4.tar.bz2=f7895f6709101937035a560326cede956705a2deb21e8170627d2b4e38dfe0e61bee497a591100b4f4312d5575a7431508cc3b551e7f5fb152f57976b12aea42
https://rvm_io.global.ssl.fastly.net/binaries/debian/10/x86_64/ruby-2.4.5.tar.bz2=4c8a040d86df08e054411585af4148cead774e3765c34bca8ad5d7f8445861c66f34c20ffc13043f760723728af7c19d9c62b8e45816008b3b927aab8c6992d4
https://rvm_io.global.ssl.fastly.net/binaries/debian/10/x86_64/ruby-2.4.6.tar.bz2=8abbe5d7066498b5b7500676aa7112bedcc403017fcd6020bef0f87bbc2dae34fa434a44f6977fe52bba465c0c2d9041ffa1c1888c20f28b5b376acd7f0d0a9e
https://rvm_io.global.ssl.fastly.net/binaries/debian/10/x86_64/ruby-2.4.7.tar.bz2=b6cf8d5f79a164dd270a3bfec2aeefb86f24de20f3b8736946185eff8c6c78ea38059e7983ad73819f08904f38c290fefec805371e2229a21207582655a3f1a3
https://rvm_io.global.ssl.fastly.net/binaries/debian/10/x86_64/ruby-2.4.8.tar.bz2=615fff14f4596ebf9a8823630645c3f7ec2cec332b3ab948954bde8d44b50db6988326db98aac6d8a10fe372c251a823bf997715d30152de5b5f0b341e00bb94
https://rvm_io.global.ssl.fastly.net/binaries/debian/10/x86_64/ruby-2.4.9.tar.bz2=b12787880ce7cacca1738769fb14a415cd440b909288dd7a1464be7b0f80411355bf85f73c2c792b6160d9bb4002e8a38c830ed2e10bbcc52b9bd865d29be1a1
https://rvm_io.global.ssl.fastly.net/binaries/debian/10/x86_64/ruby-2.4.10.tar.bz2=d140e2964724cf8ebed4320c294b754718d57324dfce46f8edea5a8d57a8db5a5036dfb1cd348e002cb6e9526906681000436caa22a6cd32c440a4994c7e72b2
https://rvm_io.global.ssl.fastly.net/binaries/debian/10/x86_64/ruby-2.5.0.tar.bz2=e2d5e8d67dcc7d2d4196e2af66e2587333136249079cb1c2cc661da40602cb6261488565b23b907be64830460324c93e08dd4c2efbb65b8f448b84b3c9a2c950
https://rvm_io.global.ssl.fastly.net/binaries/debian/10/x86_64/ruby-2.5.1.tar.bz2=27116d0906c4aa518d019bc532acb95d1c98ace8db149eb6b0cef2fe1d2a2359e7e6b5c8984df3329112c88846fb34f10780dbd2c3c046a5e4b0275e7126becd
https://rvm_io.global.ssl.fastly.net/binaries/debian/10/x86_64/ruby-2.5.2.tar.bz2=7115539523cf667f655e4c81feb7eba793e25e8ff50011515350752f86ce6f64a97ad38c22b8acf0ac91271438cc6664c056aa644864979dff02596bedb9ce24
https://rvm_io.global.ssl.fastly.net/binaries/debian/10/x86_64/ruby-2.5.3.tar.bz2=effe3181bd28d72546398c24e6ecb80d5e6d7ce27c20ee110e4eaead3964f90324dbecf33656af09fa4dfa65f836debacc18c338e9b7df20919f1aa4859028b6
https://rvm_io.global.ssl.fastly.net/binaries/debian/10/x86_64/ruby-2.5.4.tar.bz2=2c925dcae638211883aa122b10913a1cb503274e503d0aa3bbd5b9e395607d9fdb02cd9985c77862ebdcd0bda21b76cbb61477ca3147f091c7cec52abe56861d
https://rvm_io.global.ssl.fastly.net/binaries/debian/10/x86_64/ruby-2.5.5.tar.bz2=da5219acd86539bd73c95cfe7af2b81f045b9c8c11e1fecfbc423d659b34510eb052750aa1a0d139651385eff2b9d854792780e4ae128dd737a6105ad75c88db
https://rvm_io.global.ssl.fastly.net/binaries/debian/10/x86_64/ruby-2.5.6.tar.bz2=646185415933b831d240e497e56cf17d95ab059110499877c383a22408038ebb39ff834f15768b7fcb56e6f697632306c6f12367bfa5c33e9b5a0030d0dec39f
https://rvm_io.global.ssl.fastly.net/binaries/debian/10/x86_64/ruby-2.5.7.tar.bz2=f76d827ea22e6e5785d58c028ea6f5571461d0ad0daff99ac0adc8b08f105b2614777491cdb022a48d15fc58953988c79245ba1d47f6b6f5ee818806ced1ba5b
https://rvm_io.global.ssl.fastly.net/binaries/debian/10/x86_64/ruby-2.5.8.tar.bz2=59caf112cd6ec722190114c02e1aed89029a96367ac1fc9b016202f619b0db62c7ec3c330c359c50e165661cbd1b59626e261fc404bff50c1ceb5c23f716775c
https://rvm_io.global.ssl.fastly.net/binaries/debian/10/x86_64/ruby-2.6.0.tar.bz2=33f7e5160b61579acd25d9185d3ba5d2b9765b1d22035e2d6990a116bd4d3df4acac22bf369e492ca57ea333f18ad34fa44e00e86ae4a11db082919c96f3caa5
https://rvm_io.global.ssl.fastly.net/binaries/debian/10/x86_64/ruby-2.6.1.tar.bz2=965335518ee4e55eebe7bca28f7c529d3afac2f5220f820756f8e5117f5a9ab79ff72da9c0960e44bb07db6a90302a698a590d071172d72ddc3ae97252b1bb11
https://rvm_io.global.ssl.fastly.net/binaries/debian/10/x86_64/ruby-2.6.2.tar.bz2=2792ada933da84a9fad641fc91a14fbe3f66a9a43dd75153be74f68f5e9b174226e962c4e5c9fdd67114bcc931d76922f966025642d136a1cbb2a0b1b99f7fbe
https://rvm_io.global.ssl.fastly.net/binaries/debian/10/x86_64/ruby-2.6.3.tar.bz2=3521ddd9b421c67fe002964b801eaf6e0e1278e2edce480241b1978d75a83f9b69bb57da2113e69d206c89734ad7127da71c6c1ac0e6817f898242c511190d75
https://rvm_io.global.ssl.fastly.net/binaries/debian/10/x86_64/ruby-2.6.4.tar.bz2=5bce9da48d7858600193d879ed6fba659cef7ec749848c2ac404cf3b8470ca3e64b742fda2d220436bd972ad20f1a0d044f4580d1dc1fb41a72f2b0ce0bf8295
https://rvm_io.global.ssl.fastly.net/binaries/debian/10/x86_64/ruby-2.6.5.tar.bz2=c62dace52c22e02caf64ad32187d15cb2c8f56acf89bf9839376c97e1f33b46d8bd79920376c77a7bc989f50b9b2b4c5c0356f7fc3cbac0decfc03b5fd3397b4
https://rvm_io.global.ssl.fastly.net/binaries/debian/10/x86_64/ruby-2.6.6.tar.bz2=1a944edc5b3a6e0aec41ee30e3291f66c6c6e09972f7edf77f4ff850d4c850edec51a11a983f77f0ed35fef81bffd3a18dd78cef4a21a41407540dc1448c57d7
https://rvm_io.global.ssl.fastly.net/binaries/debian/10/x86_64/ruby-2.7.0.tar.bz2=4fd5d7cec68aceb3abe2720fa124833cc47f9efb36a7cbb6ea39f0eba9ab9c9adc1ff78d18bc536f400dd8132ca7a2f72867be7ae9591fb50278963e048ea5da
https://rvm_io.global.ssl.fastly.net/binaries/debian/10/x86_64/ruby-2.7.1.tar.bz2=c64148e5aec8e8eef3344c1900eebae445052662c4cf2f2906652a4a33e4cc9726bdc44c05c41d10c1fb94bbcf95c5a7743a95e25d528a85e6f806264756a1b7
https://rvm_io.global.ssl.fastly.net/binaries/debian/10/x86_64/ruby-2.7.2.tar.bz2=ebed21fddbbfb6ef6e6913212c860fdba01887cbb0cc62190664c2c6eee1c01980e7b1bed26eaf8d3f15294f6f385b58fb93782293344e0df79f2484da2bb168
https://rvm_io.global.ssl.fastly.net/binaries/debian/10/x86_64/ruby-3.0.0-preview1.tar.bz2=f04bd808b854ca339c0ea257d178351a287f770ba36f1a06d2e28dbce95aa54cb8c8e7164ee6f097e77d56ec24d6e9a2fa9adbc96c541c0a6eabcb546140ccb0
https://rvm_io.global.ssl.fastly.net/binaries/fedora/17/x86_64/ruby-1.9.3-p429.tar.bz2=f63bac1909e05ef7448afbe395c3e7e9d7a82839f5498b8d650d0ef121706aee17fb1235d566890387336c7fc2fb8df7b73227c09279b526370198f6ff82c450
https://rvm_io.global.ssl.fastly.net/binaries/fedora/17/x86_64/ruby-1.9.3-p448.tar.bz2=0dabf5af3a9736e10eef283fd6ce49bf4a57452aa11902721c4a5a5579d07d9e35272b07f5577153a25a1db7dc0abb3cc8aca75f4074949be1ce8e8123f2a526
https://rvm_io.global.ssl.fastly.net/binaries/fedora/17/x86_64/ruby-2.0.0-p195.tar.bz2=0204725cac76d8dc43bcb9dc3a3bdd830aea8782747cae6f1ce21f9f675a2cb74945a759b7a7391447ff31704eb3e9dfd158ab3e5f9bcc3283e46c8af6329bca
https://rvm_io.global.ssl.fastly.net/binaries/fedora/17/x86_64/ruby-2.0.0-p247.tar.bz2=0f2382e3de3188e088db249268e2980799144182902553fe02dfa66a58156bf38332bab9ebeb4cb0fa81f56d6dac3d8a0af58293c0c3abe0ee833bec39d1885a
https://rvm_io.global.ssl.fastly.net/binaries/fedora/18/x86_64/ruby-1.9.3-p429.tar.bz2=3b470156170d467b4ff61e3ceceebfbd5f93d3e4cee5963bbadf3666328685d8c126e841a982dd6de328a2cfc4001f00366913f16429e616bf9b15607b9ed1b7
https://rvm_io.global.ssl.fastly.net/binaries/fedora/18/x86_64/ruby-1.9.3-p448.tar.bz2=2fb622f5ac6470714bf6cd8d5b01d6bf11c9260a293a3bf5f8dc93291d202e897d212d9a44fbafc94d6e3af2cfda522d564884c3c158e75a8b3ea43e9e5b43c1
https://rvm_io.global.ssl.fastly.net/binaries/fedora/18/x86_64/ruby-1.9.3-p484.tar.bz2=149e963b4a402516b0593d6e299e1ba33eb86ba051d96c3d1b19731388777d6b6fcf4a26706a8255622ee1bd2b88500b5b6b3cbc3172e9a9819ca933ea388b32
https://rvm_io.global.ssl.fastly.net/binaries/fedora/18/x86_64/ruby-2.0.0-p195.tar.bz2=3df20b598f963a955f4039ca2246647ade3ffc7121530051e816a49855e05f593487a8843c739212ce452c006cedfb1281332dc9b7f5dffd7079c254c356d051
https://rvm_io.global.ssl.fastly.net/binaries/fedora/18/x86_64/ruby-2.0.0-p247.tar.bz2=50e22c1b0330d79b2bd53fd011ddb9dc43a06ac2d289bb170dbebcea3ae67dd5118b5344580902f3b9ad7388e632f060131ff449d49e44e9295c3a2e875fb608
https://rvm_io.global.ssl.fastly.net/binaries/fedora/18/x86_64/ruby-2.0.0-p353.tar.bz2=c62344a0e281a3aee566300ce61c4eb18165f3a935d3a03f48be720d9993b73a1363e4a2e5a604d3ec911c8b01e4d30e3c29c18325089acafc7d5df2231b22c5
https://rvm_io.global.ssl.fastly.net/binaries/fedora/18/x86_64/ruby-2.1.0.tar.bz2=0a2275fe2d6e215b284e57d3830d3df1675146d78d4287f55fb5a9620a5cc27513dc6407ced0dbd4a210ce8cf643c57ce718db9b9afa27ddbe491a5a3e4eb532
https://rvm_io.global.ssl.fastly.net/binaries/fedora/19/x86_64/ruby-1.9.3-p448.tar.bz2=5b00d257663619e8c50427fc925a658a7b03ce3bce3611bc3c404af00ddead011aff83c9fe5142fd959f0a2a73aaafffa0563fd000b8ef3fe4e93f8ce3998bed
https://rvm_io.global.ssl.fastly.net/binaries/fedora/19/x86_64/ruby-1.9.3-p484.tar.bz2=8691b035289ac1ca5a6f44fe3e5f022184a27f85976e055ee8caeaf03162c4cf77c9acf524b42ec289316a3c481e482fcd2896aa87f495011aa37d9ee1e4f52a
https://rvm_io.global.ssl.fastly.net/binaries/fedora/19/x86_64/ruby-1.9.3-p545.tar.bz2=b6475388eab8c0c66c5c7276cb1aa531b656c033c6d02231ea8bb225051fd2fd1522d8ac00bffb43a0775f32a0a676d39403bf3dda2c70566767ab7a83e3e72d
https://rvm_io.global.ssl.fastly.net/binaries/fedora/19/x86_64/ruby-1.9.3-p547.tar.bz2=89184aedac3f748a7262c73932bc19ddc0b26940c94ed30e83ae481fa379b7efee941d8c215c73b42f79686d872fe963146a51aad47d2492376e51ce1e6001a8
https://rvm_io.global.ssl.fastly.net/binaries/fedora/19/x86_64/ruby-1.9.3-p551.tar.bz2=04446d1369e872c94a254f682460ecbc8f5d816bc2d9d7cf5e00587c47dd5e21a02eb6e79ef199ab73d6732014b5764c59679940788e03f029b10c5c7e8c093a
https://rvm_io.global.ssl.fastly.net/binaries/fedora/19/x86_64/ruby-2.0.0-p247.tar.bz2=3470a37cf752ab937ec217b7edfc943842c5fae107277c304457e79592c030d82df2b483d96972a9d1401a14980a929dcc0b62b1f9540618ba3b4fcd410ae87e
https://rvm_io.global.ssl.fastly.net/binaries/fedora/19/x86_64/ruby-2.0.0-p353.tar.bz2=28af5e7d4e0114abc3832beaea0157f3b2ccbd05af390aa3dd94f1f139a40f607df9fa139b0cbc0e8d9b66543fab43abe1367ce720cb75bf04882163bd8fdbe3
https://rvm_io.global.ssl.fastly.net/binaries/fedora/19/x86_64/ruby-2.0.0-p451.tar.bz2=b6c860ed7568aa5dc468adfe67eded1da476fd9477d9c418acc6151ed60707da42ad086801bcd16ea9addf862590833facd90ebd59ce6a71a93364a178dea43d
https://rvm_io.global.ssl.fastly.net/binaries/fedora/19/x86_64/ruby-2.0.0-p481.tar.bz2=2731b23e4baa248079d9f38a896bf6a84ba6e547d588cf34b056b5b98a316fbdc0a5b07d72add24f38e3e1947c964643f00b8542996f22dcbf350e30e2f31e4b
https://rvm_io.global.ssl.fastly.net/binaries/fedora/19/x86_64/ruby-2.0.0-p576.tar.bz2=9fedf133f6b28e1687d562da0442a7d16084065e8d434f1ebf12a227e7a8a8b43a384c20a6e1f5d7e5c956ae10f1d34ad9c2478d134ca7d3884796b2db1db0ac
https://rvm_io.global.ssl.fastly.net/binaries/fedora/19/x86_64/ruby-2.0.0-p598.tar.bz2=fceff5855d65c6c04082c4796eeda7a45d8204ac182d25c60a8a5b679c6511bffc36124f477ca32466c6043769e79c3a0262ecb6d67b414a6c0a4e91856ec828
https://rvm_io.global.ssl.fastly.net/binaries/fedora/19/x86_64/ruby-2.1.0.tar.bz2=e5dfabdcbb2929f76fac4696922d1695b25bcd79013793bca2e54729435688cfaf9a4753812e8ec807462d3c88c1e7c271558179a683b1dc48ae333948040483
https://rvm_io.global.ssl.fastly.net/binaries/fedora/19/x86_64/ruby-2.1.1.tar.bz2=05040489b0e73a7b02f268fe7ec38182e0fcd9bef7fd41c4871374cac52a2ee82d5bafb9d6c42adbfe6f4ca17c755de6763faf587ba73367a6efe521823fd0ec
https://rvm_io.global.ssl.fastly.net/binaries/fedora/19/x86_64/ruby-2.1.2.tar.bz2=1678ec02ed6f187779cdff3e45c329fd83b0841cc77ada33139236d2c15dcf96ba2ee5889be56f1d0c897ccf9f3da0789029c8da8eb269740d10250109971333
https://rvm_io.global.ssl.fastly.net/binaries/fedora/19/x86_64/ruby-2.1.3.tar.bz2=fdceb48c2aab963893efd931e65641611f0076f0476cdf6bff2a87d5bfec357794eecc2777d5a0666b91221e537b41e2ce5ba5011c704ac34d90f64c17cc794e
https://rvm_io.global.ssl.fastly.net/binaries/fedora/19/x86_64/ruby-2.1.5.tar.bz2=0791b51f5048c329b8bbd49dc77150e4eace33e6206534f42ce5d8b6f44aec077593ca43cd1658378c489efebde064b31bd494bf2ec4245a24268be60431c4c6
https://rvm_io.global.ssl.fastly.net/binaries/fedora/19/x86_64/ruby-2.2.0.tar.bz2=3e58ee967574fc80432ecc83c7a3b128a5c13c1ff92ae3eabfd75b70ad96ce774e176dc752d4f20fb27605f76c9bb83db930528c280c6c22811f997c907991e4
https://rvm_io.global.ssl.fastly.net/binaries/fedora/19/x86_64/ruby-2.2.1.tar.bz2=c155e7050315feca7b116b737c61e6af3f68f5a3c471a4757b6f744fc6c5e33f408ef8bbeb46a4e830bea4ba2e1aca3865152486b9d19566b71d4db69fe8da80
https://rvm_io.global.ssl.fastly.net/binaries/fedora/20/x86_64/ruby-1.9.3-p547.tar.bz2=554886ec6c88cec8e01c9f148d5f7f7f4a1f4b7bd81e79d98e805d33ada85228db4908373ec41451bed59333435900ef337eeaae7b8e850aaf1580bc6c4c82a6
https://rvm_io.global.ssl.fastly.net/binaries/fedora/20/x86_64/ruby-1.9.3-p551.tar.bz2=2581e666c8f186b6f7e2ebff796650508b9243f727f9b1f240bc9c180e741f435d74e711a4eed3220212627b26bf4e3fea42cfbc339198595ae3c7cbc348c7a3
https://rvm_io.global.ssl.fastly.net/binaries/fedora/20/x86_64/ruby-2.0.0-p481.tar.bz2=d7ebcddad8b05d1836c434dbc47549a2f9a19cefb4ad4ef2458d41411f4c5d341dcc20f6eb6a6d1c7c12379fb623eb1b5ea4193c6c6a5b8ccb1cfda77c8fb531
https://rvm_io.global.ssl.fastly.net/binaries/fedora/20/x86_64/ruby-2.0.0-p576.tar.bz2=09bdc1d17fb42e2523f5cbdd35da5fb25b9f1a7f2b4e63bbc72edbe40ba9f296dab5cd9bb29065b56b43c812162598f977dacac67bf8d1f215e1b5ea1ca2586c
https://rvm_io.global.ssl.fastly.net/binaries/fedora/20/x86_64/ruby-2.0.0-p598.tar.bz2=951ad4950e0720273cad3cf0637aabbf58ed9c559b40744c75640902279c8dfcfc994034e19ce35bbbfd9d6de599f476e57070e97522b8c97908ea5661912c2e
https://rvm_io.global.ssl.fastly.net/binaries/fedora/20/x86_64/ruby-2.1.2.tar.bz2=87d18685cc18e804d019bf8799087e205193f56cc434f4c1d9b53885c5e7a82b2489e170959c50c2d4c5cf35b4b1ee7e3f0c037c1ba803365fe756211d8cc07b
https://rvm_io.global.ssl.fastly.net/binaries/fedora/20/x86_64/ruby-2.1.3.tar.bz2=2fb54e0d01b4858411d8dc636aa79c34b8c848d3e4986efc36f8c4b1f9b930f7c17f67c56b55146a9d1c128a9364604a5eebe3b9154e443e897eaba970f21b4d
https://rvm_io.global.ssl.fastly.net/binaries/fedora/20/x86_64/ruby-2.1.5.tar.bz2=5161a8596bae6a5eadb8e4828606e643019df2689cab1de3a160b4c7736ab6d41f366f1787226ac00a8ead2d1cfbfe78041dff8e6b64be2327cbe2cf60185c89
https://rvm_io.global.ssl.fastly.net/binaries/fedora/20/x86_64/ruby-2.2.0.tar.bz2=d2bb5664bbd6ffa02e9cbf144cdd816526f7b4c433c52cfb90b00427a093f07faed74e386ae9105b67441dff7ff157fb8cd6c0b9cdec126631ece55be664d1a7
https://rvm_io.global.ssl.fastly.net/binaries/fedora/20/x86_64/ruby-2.2.1.tar.bz2=9490954e3ae80d222f4efbd28bf9d453f0a007be060359c4b11dd84ebd161caabe2039c030b77c9fe7fd9850093ace5ed8090e78fbfc57d7801d4abaa8a31494
https://rvm_io.global.ssl.fastly.net/binaries/fedora/21/x86_64/ruby-1.9.3-p551.tar.bz2=be7789781b183414875d2a19292ebd6f9f472b2a8e0d376e08a6f6128dd4c182673c652d5e493514220793951a5c2fbdf180b3de1ec3aba27316e68a925ef242
https://rvm_io.global.ssl.fastly.net/binaries/fedora/21/x86_64/ruby-2.0.0-p598.tar.bz2=cb71f575832f4dddeb5e60589988b590902a4c60a8b70cf0347baccfe07da8b8a3f172455f805bc01f78a591d3fda20cff9cb07d6dae491b77c6cf15d4a9d909
https://rvm_io.global.ssl.fastly.net/binaries/fedora/21/x86_64/ruby-2.1.5.tar.bz2=cf7cb1014d6094ccddafaf4277ccc8b9611aa86f058071a251be346d720978f645de195dde426ef0065f14a82035b835401a5e1f8002ba14529c9b9d3b5997ee
https://rvm_io.global.ssl.fastly.net/binaries/fedora/21/x86_64/ruby-2.2.0.tar.bz2=1a816f73598f507ee1d1872e4ed08dd5fbc3d2c96b43672c9644c18e3f738a815e498c190a894d1bfb52a94ddfa666ed50eb918596d5cf69eb8410fb70ffe405
https://rvm_io.global.ssl.fastly.net/binaries/fedora/21/x86_64/ruby-2.2.1.tar.bz2=d1216b4deb53b44329f04c1b796f69a102a3bcf5156cd2401dff80d17f1d1876842a38e84b083d222d28bf3cad68d48b9343f4a693000f4001f18d3dc9b9a196
https://rvm_io.global.ssl.fastly.net/binaries/opensuse/12.1/x86_64/ruby-1.9.3-p194.tar.bz2=8811c1c5d233be78e869ae2c197720b1b0279d2bac467621f43bac4050226f44696d4be7cd6a229809b03cd23ed37056006c1c90a9487e13122906fb3bb0a62f
https://rvm_io.global.ssl.fastly.net/binaries/opensuse/12.1/x86_64/ruby-1.9.3-p286.tar.bz2=c42db69fc1e226a85c69883316512d599d33567fcf852e17de4a1abf04d69393d5339497605cafae0bc6c17b69e2c74d537efc530813ddb9a321b1ab6b8432cc
https://rvm_io.global.ssl.fastly.net/binaries/opensuse/12.1/x86_64/ruby-1.9.3-p374.tar.bz2=745492a1e3f14d816ea5658c0b84dd761633748b2a2ce5eab8ff119315f2222f577c7d802e5f2305060605f48f58e43089fcfb03e33ef40ffbdc22f46062983b
https://rvm_io.global.ssl.fastly.net/binaries/opensuse/12.1/x86_64/ruby-1.9.3-p392.tar.bz2=93772bb86172c9adf2ba48804962431d2a4db74801067a65d8820f57940e6138bc74ed0e476a901e40120a42aa4353b762d1503d9a8c740bfddf12227d7053d3
https://rvm_io.global.ssl.fastly.net/binaries/opensuse/12.1/x86_64/ruby-2.0.0-p0.tar.bz2=3ebd7d732745a30e02ee2a5549d8b90d74a87a1bf56509f43be2e168930fb12c4abdf6ae471115b77eb6709064bf0c1de33c6739a37466c2d118d70c0a2a2955
https://rvm_io.global.ssl.fastly.net/binaries/opensuse/12.2/x86_64/ruby-1.9.3-p194.tar.bz2=af328268eb1b876acedbd3af1208b29be338acc308e41ff78c398b04e357a575eb56accc2167a4761d419d88b5a6302a1e9aaa527812b4edcfee8b896a19d1d8
https://rvm_io.global.ssl.fastly.net/binaries/opensuse/12.2/x86_64/ruby-1.9.3-p286.tar.bz2=3a2fa83968e750fad4a256d04fd272b9d4f7530ea1535ed12ff7b8b5d630b2324abdf05213aa6379fa64255bfec047275430b2b03d958d982bbcc8a3fa6cf350
https://rvm_io.global.ssl.fastly.net/binaries/opensuse/12.2/x86_64/ruby-1.9.3-p327.tar.bz2=d1aed2bb0ee2f5f4d4e7148e4e5def7990dec269a66ce445ef48587a7d73a0cf83f15352c09494f33adb4cbbc625850b77a608efaf42548e17c97f32e5c070bf
https://rvm_io.global.ssl.fastly.net/binaries/opensuse/12.2/x86_64/ruby-1.9.3-p362.tar.bz2=98fc1ca7b69a64f48425ec319385535284822e215de0b51e0c13311147240f086f94b9ec77163b3c826c41682c06bbed1539bbab2232d55876b66828ed745fdd
https://rvm_io.global.ssl.fastly.net/binaries/opensuse/12.2/x86_64/ruby-1.9.3-p374.tar.bz2=56b901033e0461103ad2e8d783499dcd13c43791b8f266e384bbff5a1a4ef4cf89b48b3fdefcc2c591e4acc6d7e8f317c3a6f3199a97d7d241a3861b86e0fa09
https://rvm_io.global.ssl.fastly.net/binaries/opensuse/12.2/x86_64/ruby-1.9.3-p385.tar.bz2=7ee21d68c0a4ddfe102fc51078ffd114163b158acb831979239b7764393fc7397a5e4f2fe33515c01c49381a434b50fcf4152d181c80bf84757cb000ab70f71b
https://rvm_io.global.ssl.fastly.net/binaries/opensuse/12.2/x86_64/ruby-1.9.3-p392.tar.bz2=197564715b6f7fa093c96a4ccaec287ec3848f7fe9d6a983a7a9270c19f32243622a66162cf479c3823c6104509d74051cc4d701f3bf08382cf36f3687a94157
https://rvm_io.global.ssl.fastly.net/binaries/opensuse/12.2/x86_64/ruby-2.0.0-p0.tar.bz2=322e1161c624a62828061159c3e31ad2b58361a35da245a036479469c0b48d9ccff850edb836597d885c6bb60ed230d665ab1b1a4855d056cf60e151b38e81af
https://rvm_io.global.ssl.fastly.net/binaries/opensuse/12.3/x86_64/ruby-1.9.3-p392.tar.bz2=9000e0fa88cb4624913cacbc749751d651228887a9ee130cd61061159dcdc22550935b1309fc8625599e42caab3a88ba2ada0054c33a43ad6b5ba898d0bdeb17
https://rvm_io.global.ssl.fastly.net/binaries/opensuse/12.3/x86_64/ruby-1.9.3-p429.tar.bz2=9aa209fb00ae445a898c0a3923fcf2d8ef50d536c7f7b0ef12b7052814b6b70577b538010753c3f5d857a5dd4a985f7ed98d7b1afcf8be5cf089e4fddc2bb5c7
https://rvm_io.global.ssl.fastly.net/binaries/opensuse/12.3/x86_64/ruby-1.9.3-p448.tar.bz2=63741375122282772a7a50a2befaff48d923e8736924b79afe6f75a6552964d014f0b65d112e9aec9356095f6f12f758613e1b2c626cd1aca5494aba96ccb462
https://rvm_io.global.ssl.fastly.net/binaries/opensuse/12.3/x86_64/ruby-1.9.3-p484.tar.bz2=44b1e8bafbe636977d28f6fdf9ad661fbef115eff5ceeb3c16b7ad285e4ab74c880f887c8b189c126a458f40d93464a1b08e36501e07d786d4768a8fbeab0894
https://rvm_io.global.ssl.fastly.net/binaries/opensuse/12.3/x86_64/ruby-1.9.3-p545.tar.bz2=76e9044322875a62891082dd2ebf2a06871d03654fe669c8fbc1123df6053c5fb9ce5583b1bc6a9f2085aa0477bd7f0a7623ebf92460f2c60a929cbd2ceba851
https://rvm_io.global.ssl.fastly.net/binaries/opensuse/12.3/x86_64/ruby-1.9.3-p547.tar.bz2=411f0beb15e9759554607fa9866471e443e62ac7a4e2537e92f9181db418a91c6845c583de3bbab43aa89f8f555aa7a42dd6dd7495ab8f63963b598b82d88d6c
https://rvm_io.global.ssl.fastly.net/binaries/opensuse/12.3/x86_64/ruby-1.9.3-p551.tar.bz2=29c03464d7a6a875bdea7e7e69ff8bf4ec5d575737d6b952c3dd88e05905d03fe801b6e38ec91ac9eca67e0fe25e002f339574e9363ea0a9be57dc47133197ff
https://rvm_io.global.ssl.fastly.net/binaries/opensuse/12.3/x86_64/ruby-2.0.0-p0.tar.bz2=7d80de8afbe5421c5651f5a2fe466ffe42d00a7d3a3c262d63581f3f7249804a9ec3d0b2d8a817fc6321d96d8ec7af864bcc3dc72878dd036c595893230a98ed
https://rvm_io.global.ssl.fastly.net/binaries/opensuse/12.3/x86_64/ruby-2.0.0-p195.tar.bz2=330b80c13df4a13ff4cb460e4df79607200f4167ee9dc1d0c5bd9851ba74167a4b5c06d239a362a7fece7018e7d81cebadca8bfb3fbad5f97ee8860d6c7f7c3e
https://rvm_io.global.ssl.fastly.net/binaries/opensuse/12.3/x86_64/ruby-2.0.0-p247.tar.bz2=8f50263e54a44efac9f6e16f316d83c7749791c19854715bbce7555573701dbf82be4e7159314f40cef08bec234185d338905ed8fd23086f12c45d55e4877d09
https://rvm_io.global.ssl.fastly.net/binaries/opensuse/12.3/x86_64/ruby-2.0.0-p353.tar.bz2=58102067069f25a20615cfa8293c9365136996a91769c62675a4a6d5f6bd2d1a3c3ee32f7636c292eeae5233422b74d822a7e7888dd02d613918a9d929ad2638
https://rvm_io.global.ssl.fastly.net/binaries/opensuse/12.3/x86_64/ruby-2.0.0-p451.tar.bz2=102c31793e886da587372379ca229132487f1c4bd7c478c085cc5cc219836977e3826686f3c410bac5c6fc3d61ba5b2dfeb769a8300d37a73fb2eae5faf28d5f
https://rvm_io.global.ssl.fastly.net/binaries/opensuse/12.3/x86_64/ruby-2.0.0-p481.tar.bz2=6a0a99b405cf54b0f26e5b36b4bcda49df4af6d053abb3f7b5f0816856e3f7d0954567a5b04517166e5c51d72bfcde45fdbea6138ee4c8e897e895ae429e3c5b
https://rvm_io.global.ssl.fastly.net/binaries/opensuse/12.3/x86_64/ruby-2.0.0-p576.tar.bz2=7e38637138b1474dd4bfdcc5b4afd5711032a2207c936cb5a95ac63971ede51cb1ea46ac1a0305f27823c7aa86411a9946cb96f928fa682822e3cf85ad7f50c1
https://rvm_io.global.ssl.fastly.net/binaries/opensuse/12.3/x86_64/ruby-2.0.0-p598.tar.bz2=546432775f662e4ba636b20f6707d49d78072907651a268a2ca743ecbcc101c159ddfd8d894e7bacf8e090985d836cf9902122244e7aa889047c3f759b7f4aed
https://rvm_io.global.ssl.fastly.net/binaries/opensuse/12.3/x86_64/ruby-2.1.0.tar.bz2=96439259115766ff0761858c3b85f4f6d4ab40a525d11d76c78b2892490d7b1bc65aaf717a37198aeff9a3054fb2cb744c24bfd1afc5ab63a7caa6fd633acdf6
https://rvm_io.global.ssl.fastly.net/binaries/opensuse/12.3/x86_64/ruby-2.1.1.tar.bz2=8aa3fce0517ba1177428bf575b6be95626af81693ddd886794a49af2b241ffff85247aefabb3e42f3262818dea433614655fefc32ea4cb18afcd54fd06b47596
https://rvm_io.global.ssl.fastly.net/binaries/opensuse/12.3/x86_64/ruby-2.1.2.tar.bz2=3491e71daf3b008c3e994e83a1d5172fef45afcae246bdec30e618891c9b44bad74877a1dfe3da7d2deca5030411fca294b08a695bbc70a98072c8ec9ac05939
https://rvm_io.global.ssl.fastly.net/binaries/opensuse/12.3/x86_64/ruby-2.1.3.tar.bz2=774cecf8e5619a20ba7e6d5eaf020ccf27b54cde7e9c93669378cd7833373eeefee893e0afaefab658ecd2f9b0dd2cfc9a6a59e5a987b3616e8860dede79cfc3
https://rvm_io.global.ssl.fastly.net/binaries/opensuse/12.3/x86_64/ruby-2.1.5.tar.bz2=395b783adabd97846419e927e51e4fec878f1f9a40d3def51f11411d5f896de02bf97b3ba579510371c2dd4aed12300e62c42e17ed0be88e16d70c81d8c0cf58
https://rvm_io.global.ssl.fastly.net/binaries/opensuse/12.3/x86_64/ruby-2.2.0.tar.bz2=1a8ddfbca6bedb07917beb6f88735896aa73f3fbbbd5b56421ef74aa15a56ce483b64011ea60f028cd4ba66e030621eb76983068719345e8640c188a5f24061f
https://rvm_io.global.ssl.fastly.net/binaries/opensuse/12.3/x86_64/ruby-2.2.1.tar.bz2=b37f1fd17f89efde2a2e6c045df69ea059b3158a0dfd65026c25634f18263f7cd00e8f1bd25090ba8b3a0730a1b282c41824b9e2f93ecdebfde79b1178b9b600
https://rvm_io.global.ssl.fastly.net/binaries/opensuse/13.1/x86_64/ruby-1.9.3-p551.tar.bz2=5285189906d8d1ffd83cef6da33cd440250ca75be0cba9a92932c46f24561b5970b5526c1d1a8639c9bcb0999a0c04b508b38eed2a6e15e80b2233e0d5b15d29
https://rvm_io.global.ssl.fastly.net/binaries/opensuse/13.1/x86_64/ruby-2.0.0-p576.tar.bz2=74b75b557d60046312f21e0e53a34f52a3de983973c1e7ca978a0462a082f39319b8b20169d604105bf1aff62c4ae3f3e3a95724b62b35185eb7f0d4e4a79769
https://rvm_io.global.ssl.fastly.net/binaries/opensuse/13.1/x86_64/ruby-2.0.0-p598.tar.bz2=c8d5ea402f63ab6733043db5022bc4eece07073d0ddffc91426d22bb507cfdaf8c38e84ea5059d570b7b0da6bf50e47c325101e807eabdc9b94dd800720ea89d
https://rvm_io.global.ssl.fastly.net/binaries/opensuse/13.1/x86_64/ruby-2.1.3.tar.bz2=02f61304ba51e5a17047379acdefafb169da85eb71cb6e73dc128f4ca837fc4c03f09eac5abd5435dda7c4443cbd420426c9519b81f8ac671098e6180c99ceee
https://rvm_io.global.ssl.fastly.net/binaries/opensuse/13.1/x86_64/ruby-2.1.5.tar.bz2=d3ffc449d5cbdf08e771630562384e925cebbb8461e140cf2c69875a1b162bc12fc8c52ac867988930990f238df366ae11e0cac6218406dae268af63277f4cf5
https://rvm_io.global.ssl.fastly.net/binaries/opensuse/13.1/x86_64/ruby-2.2.0.tar.bz2=94d9f49d5fa1b68c83e4803903a117d126d3ff5a005b1fcfc28946e55423591df41e6e30bd20116c1de13e05cf3f236a29fc1983e7527a045064244a4d7a924b
https://rvm_io.global.ssl.fastly.net/binaries/opensuse/13.1/x86_64/ruby-2.2.1.tar.bz2=94599c8d86e6c90e4c2e9f176ced783d51c819072334eba7012cbac1f6cd17c94340fa5cb1307a24dd144f85b3a9c367d1c1d5aef196dda4c8e509d450330f00
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.7/x86_64/ruby-2.0.0-p451.tar.bz2=e56a56b467157f6255b5a49d16ca658118bf2262c48d8f73a6facdf357a7c505ba20aea070843bd0c1110b54ef19324c23ea84939006a7de22597f48e32e6443
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.7/x86_64/ruby-2.0.0-p481.tar.bz2=54b0776e3bec895b90aceb61ab9ba1606e684a32508670a7a538ebbbaa4245fb49ac186241ccbee12542e0f40f99669b13992d708b79110a52f722ea42f8bd62
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.7/x86_64/ruby-2.0.0-p576.tar.bz2=a9063b6c3b7eeee9fc1a4fb871a5c7b2813712ecc4d52b117503678035a66274c743c42ec6ba9faebb40ec07548043b6091b285b9096c3701605fcbe8a935267
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.7/x86_64/ruby-2.0.0-p594.tar.bz2=8fb533f6fbb9e027aaf80a894528d88ef2c78139a0bf363a804db7cd9e0362899cbc436ce20b990e10779203bfbe11138438e571344dd9692ac04af7508f9c19
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.7/x86_64/ruby-2.0.0-p598.tar.bz2=5ba0fb1ae4765d05b1a1551f39c78819609e4975d4b1ebe26ecee4afcf893725095fe222e6a231222258fb20961feda4a257f06b3b37201aff5fc6ef59b86b95
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.7/x86_64/ruby-2.0.0-p643.tar.bz2=1e9a83c21cf7521ee25da2a5f239bc68e08ca6acc30c2a99dc2e2be8d5eaaaed13bb3e8d36982ff8dac880af7b598c503a93097adf726722e9f2f7dc9ce1c880
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.7/x86_64/ruby-2.0.0-p645.tar.bz2=81a70d35521fb52cc3e97aa4a4c5bd3f09733bc5caccb16d0ace6981afc4e89c553a657cf1e7d4d682d4b9014c1877975a6483cd076677ba6fd1ca651446ce39
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.7/x86_64/ruby-2.0.0-p647.tar.bz2=950ccc8b0898f9dc3339358affa67f97ddaa6c3e95bc5fcbeecb07206e5b45a25e509ea02eae6313707e63616e4e2f626474c0a7cc991ef9d928b5028e9b142d
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.7/x86_64/ruby-2.1.0.tar.bz2=fc9eb5367a7b44d0bdf5228222a1222fd4ac4dce1a234231294050fd4aa5eaf838d6d6d8c8cefa98cd52b83377219f52f51fd2a1084ff6e9e028ef392469fb21
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.7/x86_64/ruby-2.1.1.tar.bz2=027469cac8c866c80d7bd4e114cb514948c09f5a9bab186172f6d8c948b5aec440e7657dce3adb7cdb87ef5c76c606e7f4f75d1d0704c210d4467193a1f1d605
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.7/x86_64/ruby-2.1.2.tar.bz2=0593e6b2091712c0222bd750b7b7490e7a227e43d307089f1383b1d888d67ca25080a9316ae3c253f4d7086510fbcdf3ea327fa8d942afde569041bfbaf1b18f
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.7/x86_64/ruby-2.1.3.tar.bz2=23c8d1410694d972495f9901c382fc43ac0963e18a42c8c39587f87936510feb9c9924796235187ef5b4379757d5ec096f8ccb24712b8834c98456361e4828db
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.7/x86_64/ruby-2.1.4.tar.bz2=35eaf6ede369260ae50d0f8d6fd05a68fe777d483cc8beab68f7d6e53d199d9c792148620b6ddf599e2021736eeda5e3cb8460f9c1d0e160cac21e7c9b32c178
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.7/x86_64/ruby-2.1.5.tar.bz2=58ad84de8ba3e991d0e9bf3629678f61c0f19c41aa064b4593571d5a935b0c995b4048b5d2b9cdd68a7e41f9be10ae89b0e03ed87b4fb06a64cfa9c4398214ec
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.7/x86_64/ruby-2.1.6.tar.bz2=e8c14032ffb23a952614a049f0f9115479b84c2d7ed6dffb0c918a6bfa67d1e313f2e36d426f18100b6a52d188d9e39f009d6cf0aaa91ab4e4ae3ca2b58d0ff9
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.7/x86_64/ruby-2.1.7.tar.bz2=e1198b86e3e14197447c1ac9c9b52b00dc3f0c2e07e99da2389894549af0907f28a8fc9b84ccda7b64a7b9d237567cd77de09846d0fa3539225ebbdc9c2c57ae
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.7/x86_64/ruby-2.2.0.tar.bz2=df6cc8de8fb27825e855943780fc8e3c586e1c462456fb448f0b2c2d75619b022848adf9bd1c134fa532575ad08ad8e4714e726424c2a192c14ea416236e4d3b
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.7/x86_64/ruby-2.2.1.tar.bz2=169bdc17ccffe0d7991e4c56d07e224b3207628109b614a4d96788524fb34a72c71e6f675eb23ddcb4b0c20f012460e95c0215e86b4e5a35351343fd1d1931cc
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.7/x86_64/ruby-2.2.2.tar.bz2=3a656bc64b42f43a922a0a93938e10055e93ed2157e23ab7dd1f54b21cec70263df74370edd314c946ac53eb6cda95a811a03b51985dc1447c8d71031afcab16
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.7/x86_64/ruby-2.2.3.tar.bz2=7a1f42721c3c3cdf7a0cdbcacd3151860127dd5aaaa8780880068c1cbbdbaeafa02c80160f0061fe88d8a93599796a52b8cc7981a6a21d786b31dcca5d2a4250
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.8/x86_64/ruby-2.0.0-p451.tar.bz2=e56a56b467157f6255b5a49d16ca658118bf2262c48d8f73a6facdf357a7c505ba20aea070843bd0c1110b54ef19324c23ea84939006a7de22597f48e32e6443
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.8/x86_64/ruby-2.0.0-p481.tar.bz2=54b0776e3bec895b90aceb61ab9ba1606e684a32508670a7a538ebbbaa4245fb49ac186241ccbee12542e0f40f99669b13992d708b79110a52f722ea42f8bd62
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.8/x86_64/ruby-2.0.0-p576.tar.bz2=a9063b6c3b7eeee9fc1a4fb871a5c7b2813712ecc4d52b117503678035a66274c743c42ec6ba9faebb40ec07548043b6091b285b9096c3701605fcbe8a935267
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.8/x86_64/ruby-2.0.0-p594.tar.bz2=8fb533f6fbb9e027aaf80a894528d88ef2c78139a0bf363a804db7cd9e0362899cbc436ce20b990e10779203bfbe11138438e571344dd9692ac04af7508f9c19
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.8/x86_64/ruby-2.0.0-p598.tar.bz2=5ba0fb1ae4765d05b1a1551f39c78819609e4975d4b1ebe26ecee4afcf893725095fe222e6a231222258fb20961feda4a257f06b3b37201aff5fc6ef59b86b95
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.8/x86_64/ruby-2.0.0-p643.tar.bz2=1e9a83c21cf7521ee25da2a5f239bc68e08ca6acc30c2a99dc2e2be8d5eaaaed13bb3e8d36982ff8dac880af7b598c503a93097adf726722e9f2f7dc9ce1c880
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.8/x86_64/ruby-2.0.0-p645.tar.bz2=81a70d35521fb52cc3e97aa4a4c5bd3f09733bc5caccb16d0ace6981afc4e89c553a657cf1e7d4d682d4b9014c1877975a6483cd076677ba6fd1ca651446ce39
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.8/x86_64/ruby-2.0.0-p647.tar.bz2=950ccc8b0898f9dc3339358affa67f97ddaa6c3e95bc5fcbeecb07206e5b45a25e509ea02eae6313707e63616e4e2f626474c0a7cc991ef9d928b5028e9b142d
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.8/x86_64/ruby-2.1.0.tar.bz2=fc9eb5367a7b44d0bdf5228222a1222fd4ac4dce1a234231294050fd4aa5eaf838d6d6d8c8cefa98cd52b83377219f52f51fd2a1084ff6e9e028ef392469fb21
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.8/x86_64/ruby-2.1.1.tar.bz2=027469cac8c866c80d7bd4e114cb514948c09f5a9bab186172f6d8c948b5aec440e7657dce3adb7cdb87ef5c76c606e7f4f75d1d0704c210d4467193a1f1d605
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.8/x86_64/ruby-2.1.2.tar.bz2=0593e6b2091712c0222bd750b7b7490e7a227e43d307089f1383b1d888d67ca25080a9316ae3c253f4d7086510fbcdf3ea327fa8d942afde569041bfbaf1b18f
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.8/x86_64/ruby-2.1.3.tar.bz2=23c8d1410694d972495f9901c382fc43ac0963e18a42c8c39587f87936510feb9c9924796235187ef5b4379757d5ec096f8ccb24712b8834c98456361e4828db
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.8/x86_64/ruby-2.1.4.tar.bz2=35eaf6ede369260ae50d0f8d6fd05a68fe777d483cc8beab68f7d6e53d199d9c792148620b6ddf599e2021736eeda5e3cb8460f9c1d0e160cac21e7c9b32c178
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.8/x86_64/ruby-2.1.5.tar.bz2=58ad84de8ba3e991d0e9bf3629678f61c0f19c41aa064b4593571d5a935b0c995b4048b5d2b9cdd68a7e41f9be10ae89b0e03ed87b4fb06a64cfa9c4398214ec
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.8/x86_64/ruby-2.1.6.tar.bz2=e8c14032ffb23a952614a049f0f9115479b84c2d7ed6dffb0c918a6bfa67d1e313f2e36d426f18100b6a52d188d9e39f009d6cf0aaa91ab4e4ae3ca2b58d0ff9
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.8/x86_64/ruby-2.1.7.tar.bz2=e1198b86e3e14197447c1ac9c9b52b00dc3f0c2e07e99da2389894549af0907f28a8fc9b84ccda7b64a7b9d237567cd77de09846d0fa3539225ebbdc9c2c57ae
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.8/x86_64/ruby-2.2.0.tar.bz2=df6cc8de8fb27825e855943780fc8e3c586e1c462456fb448f0b2c2d75619b022848adf9bd1c134fa532575ad08ad8e4714e726424c2a192c14ea416236e4d3b
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.8/x86_64/ruby-2.2.1.tar.bz2=169bdc17ccffe0d7991e4c56d07e224b3207628109b614a4d96788524fb34a72c71e6f675eb23ddcb4b0c20f012460e95c0215e86b4e5a35351343fd1d1931cc
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.8/x86_64/ruby-2.2.2.tar.bz2=3a656bc64b42f43a922a0a93938e10055e93ed2157e23ab7dd1f54b21cec70263df74370edd314c946ac53eb6cda95a811a03b51985dc1447c8d71031afcab16
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.8/x86_64/ruby-2.2.3.tar.bz2=7a1f42721c3c3cdf7a0cdbcacd3151860127dd5aaaa8780880068c1cbbdbaeafa02c80160f0061fe88d8a93599796a52b8cc7981a6a21d786b31dcca5d2a4250
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.9/x86_64/ruby-2.0.0-p451.tar.bz2=e56a56b467157f6255b5a49d16ca658118bf2262c48d8f73a6facdf357a7c505ba20aea070843bd0c1110b54ef19324c23ea84939006a7de22597f48e32e6443
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.9/x86_64/ruby-2.0.0-p481.tar.bz2=54b0776e3bec895b90aceb61ab9ba1606e684a32508670a7a538ebbbaa4245fb49ac186241ccbee12542e0f40f99669b13992d708b79110a52f722ea42f8bd62
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.9/x86_64/ruby-2.0.0-p576.tar.bz2=a9063b6c3b7eeee9fc1a4fb871a5c7b2813712ecc4d52b117503678035a66274c743c42ec6ba9faebb40ec07548043b6091b285b9096c3701605fcbe8a935267
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.9/x86_64/ruby-2.0.0-p594.tar.bz2=8fb533f6fbb9e027aaf80a894528d88ef2c78139a0bf363a804db7cd9e0362899cbc436ce20b990e10779203bfbe11138438e571344dd9692ac04af7508f9c19
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.9/x86_64/ruby-2.0.0-p598.tar.bz2=5ba0fb1ae4765d05b1a1551f39c78819609e4975d4b1ebe26ecee4afcf893725095fe222e6a231222258fb20961feda4a257f06b3b37201aff5fc6ef59b86b95
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.9/x86_64/ruby-2.0.0-p643.tar.bz2=1e9a83c21cf7521ee25da2a5f239bc68e08ca6acc30c2a99dc2e2be8d5eaaaed13bb3e8d36982ff8dac880af7b598c503a93097adf726722e9f2f7dc9ce1c880
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.9/x86_64/ruby-2.0.0-p645.tar.bz2=81a70d35521fb52cc3e97aa4a4c5bd3f09733bc5caccb16d0ace6981afc4e89c553a657cf1e7d4d682d4b9014c1877975a6483cd076677ba6fd1ca651446ce39
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.9/x86_64/ruby-2.0.0-p647.tar.bz2=950ccc8b0898f9dc3339358affa67f97ddaa6c3e95bc5fcbeecb07206e5b45a25e509ea02eae6313707e63616e4e2f626474c0a7cc991ef9d928b5028e9b142d
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.9/x86_64/ruby-2.1.0.tar.bz2=fc9eb5367a7b44d0bdf5228222a1222fd4ac4dce1a234231294050fd4aa5eaf838d6d6d8c8cefa98cd52b83377219f52f51fd2a1084ff6e9e028ef392469fb21
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.9/x86_64/ruby-2.1.1.tar.bz2=027469cac8c866c80d7bd4e114cb514948c09f5a9bab186172f6d8c948b5aec440e7657dce3adb7cdb87ef5c76c606e7f4f75d1d0704c210d4467193a1f1d605
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.9/x86_64/ruby-2.1.2.tar.bz2=0593e6b2091712c0222bd750b7b7490e7a227e43d307089f1383b1d888d67ca25080a9316ae3c253f4d7086510fbcdf3ea327fa8d942afde569041bfbaf1b18f
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.9/x86_64/ruby-2.1.3.tar.bz2=23c8d1410694d972495f9901c382fc43ac0963e18a42c8c39587f87936510feb9c9924796235187ef5b4379757d5ec096f8ccb24712b8834c98456361e4828db
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.9/x86_64/ruby-2.1.4.tar.bz2=35eaf6ede369260ae50d0f8d6fd05a68fe777d483cc8beab68f7d6e53d199d9c792148620b6ddf599e2021736eeda5e3cb8460f9c1d0e160cac21e7c9b32c178
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.9/x86_64/ruby-2.1.5.tar.bz2=58ad84de8ba3e991d0e9bf3629678f61c0f19c41aa064b4593571d5a935b0c995b4048b5d2b9cdd68a7e41f9be10ae89b0e03ed87b4fb06a64cfa9c4398214ec
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.9/x86_64/ruby-2.1.6.tar.bz2=e8c14032ffb23a952614a049f0f9115479b84c2d7ed6dffb0c918a6bfa67d1e313f2e36d426f18100b6a52d188d9e39f009d6cf0aaa91ab4e4ae3ca2b58d0ff9
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.9/x86_64/ruby-2.1.7.tar.bz2=e1198b86e3e14197447c1ac9c9b52b00dc3f0c2e07e99da2389894549af0907f28a8fc9b84ccda7b64a7b9d237567cd77de09846d0fa3539225ebbdc9c2c57ae
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.9/x86_64/ruby-2.2.0.tar.bz2=df6cc8de8fb27825e855943780fc8e3c586e1c462456fb448f0b2c2d75619b022848adf9bd1c134fa532575ad08ad8e4714e726424c2a192c14ea416236e4d3b
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.9/x86_64/ruby-2.2.1.tar.bz2=169bdc17ccffe0d7991e4c56d07e224b3207628109b614a4d96788524fb34a72c71e6f675eb23ddcb4b0c20f012460e95c0215e86b4e5a35351343fd1d1931cc
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.9/x86_64/ruby-2.2.2.tar.bz2=3a656bc64b42f43a922a0a93938e10055e93ed2157e23ab7dd1f54b21cec70263df74370edd314c946ac53eb6cda95a811a03b51985dc1447c8d71031afcab16
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.9/x86_64/ruby-2.2.3.tar.bz2=7a1f42721c3c3cdf7a0cdbcacd3151860127dd5aaaa8780880068c1cbbdbaeafa02c80160f0061fe88d8a93599796a52b8cc7981a6a21d786b31dcca5d2a4250
https://rvm_io.global.ssl.fastly.net/binaries/oracle/7/x86_64/ruby-2.4.0.tar.bz2=91e34f1fc7a34ad182cd5e97f58e32c1d9ce83aa6513638f68abaf304dea74cb7ebd7812f7bafeb11a16be334d193e64cbbaf23bf424a5fce11962384eb9ba61
https://rvm_io.global.ssl.fastly.net/binaries/oracle/7/x86_64/ruby-2.4.1.tar.bz2=b6337cb1d902f3407ca45a0f145186115bef7329419cccd9462b2a1aaccbe80828510dbdd8e362e3d84067830c491af78559e09357f9ffdf5ddf404c10c73cfc
https://rvm_io.global.ssl.fastly.net/binaries/oracle/7/x86_64/ruby-2.4.2.tar.bz2=5c8dbbef50eddce5c7d52feba1f48a3c7b6c7d76b66af21df5df4fa8deb4fb496d65082d9983acb37231a371854d6f4af3929b49b2ba6c2e4a2f527eb04fe1dd
https://rvm_io.global.ssl.fastly.net/binaries/oracle/7/x86_64/ruby-2.4.3.tar.bz2=42237e7ea0c10050bb4faa940ab64da700a79e4b0115f2783d451952b6d87c19db92c502f0281502caa0e6f54319e4dc9956f2cb90b89776211e0c37fff3671a
https://rvm_io.global.ssl.fastly.net/binaries/oracle/7/x86_64/ruby-2.4.4.tar.bz2=78435976f97501e5b303ba80a62bb16359c4eb586d4052ad680af75ef42f2484be149baa6bdeaca95d69d22fa9ab7697f1a8e37a0276f6142a54377aa2f08765
https://rvm_io.global.ssl.fastly.net/binaries/oracle/7/x86_64/ruby-2.4.5.tar.bz2=86edc8e4330ec65df7fcfb7590db53edb93801377d72b35a6841e07a2bacec7207b2b440e599e43d6b9a66a6f8ee1c095e12ad0bbbd8cd831241cd411079dc15
https://rvm_io.global.ssl.fastly.net/binaries/oracle/7/x86_64/ruby-2.4.6.tar.bz2=a382bc4f6de9725990f540aef8139451feac06e1452abdd952c04b543f2a40d265b9df950311ef7e35c27abf3c140171c1eedf0690033ca5e44efeae65c27a8b
https://rvm_io.global.ssl.fastly.net/binaries/oracle/7/x86_64/ruby-2.4.7.tar.bz2=9a29d2b6a3adf2c08e5cdbe8fe384d618d830c344d3a10cc92f2cdb196ea2e8f6753b776f7554bfe9c4aa95b568363ef7849dbf4fc04e20f02eb8e758ae70fb6
https://rvm_io.global.ssl.fastly.net/binaries/oracle/7/x86_64/ruby-2.4.8.tar.bz2=ae71fac22d3d99ba49e6125949c61e31e409d1e6fcb648ebbb9b2690f0a2bd7eaa8415d3b17d224391acbc29669453e54b78a563592c3bc6df5a7e1fb05777b7
https://rvm_io.global.ssl.fastly.net/binaries/oracle/7/x86_64/ruby-2.4.9.tar.bz2=5f30821bbdca06bbd3f44126ba20d97234bcb10b94d041573bf15f6d967b18ea25e6e5c56f22b5faf6416ecde3cc9b33519610b1100919b78b382f7cccb82569
https://rvm_io.global.ssl.fastly.net/binaries/oracle/7/x86_64/ruby-2.4.10.tar.bz2=868c54be451154b82b6f4ec2ffb0070b7c899a88528b00b2b3bc6896b480d119b5393a055f8e4d0bebb7c5a73659b2cc7b5e1710fc5ee70b116bb8d43f107fe4
https://rvm_io.global.ssl.fastly.net/binaries/oracle/7/x86_64/ruby-2.5.0.tar.bz2=c4d10c5423dff521d1c0d25657a92933ee285c0ffca5af31713d591ba7d2457789f83988be04d3b88765ba7acb919580031b901ab390cf7bfec5cc477cc6cf0e
https://rvm_io.global.ssl.fastly.net/binaries/oracle/7/x86_64/ruby-2.5.1.tar.bz2=17df19aab57b55d543a3028163b5e4f2f3e5e6a9809e79dd0e9f8de1b6f18396cf963b5d193546fe5f58ba677c91adc129bc6922c0a7bd11c74e6bf90491e6e2
https://rvm_io.global.ssl.fastly.net/binaries/oracle/7/x86_64/ruby-2.5.2.tar.bz2=2917d9403c573b4a3d5063db71cf949321361921898e52231772a3e381231deb39d5b75da09a5c5a29d052f6c9bcbe3bb5b216de3bef293f0ca43c67f1e3dda5
https://rvm_io.global.ssl.fastly.net/binaries/oracle/7/x86_64/ruby-2.5.3.tar.bz2=9c12f7753e2068bb94ce79b1ec053f8a234db64d0ce42a1d84b076b6d52b7fb377c1ed7f0042990809fd7b435f703d57a42cc8de76192d79e858a18247a6c990
https://rvm_io.global.ssl.fastly.net/binaries/oracle/7/x86_64/ruby-2.5.4.tar.bz2=3f52b090320e7d72c27e7745cb20492ba6e119b186a1a540d5787774ce230a49281859e68bab2926ad325fabd7f3297a931ddf989972ef655d72cc46eb4b3680
https://rvm_io.global.ssl.fastly.net/binaries/oracle/7/x86_64/ruby-2.5.5.tar.bz2=e128ec63d26759953a8b01cc5569c4537d802a2fe971940e76671dc012bff1cbc378c2acbfeaa01c1bac596f999d577831ef2c37172d920ac9a2dd90a9e92f9e
https://rvm_io.global.ssl.fastly.net/binaries/oracle/7/x86_64/ruby-2.5.6.tar.bz2=12b44f6d7a011460025bc0386c40afdff65a3471fab6120cd3efe64aa424ba373f009ad9767b0729e35e534f671f7bf04f8ddfcadc9382fc7cd131dcdc0d82bc
https://rvm_io.global.ssl.fastly.net/binaries/oracle/7/x86_64/ruby-2.5.7.tar.bz2=55073ede1f99e620edd49b565555cd45d31e40bd2a314c7fd37fa834edb1ba617b98fe1a6ef1af71f8430830a99ff3357377be4297351f5cf9f238c1ac803395
https://rvm_io.global.ssl.fastly.net/binaries/oracle/7/x86_64/ruby-2.5.8.tar.bz2=197c7b91efa0cdb02144c6366f74d177f34baff19b8c78a7f34e93480152f67e1637309d93a83d950bbd16f44d4ce4365a02199152f7301a5774616e5ff7e655
https://rvm_io.global.ssl.fastly.net/binaries/oracle/7/x86_64/ruby-2.6.0.tar.bz2=d83d2d9f7bc1b18fb6d19baf38d7273c3758bc743939738bb6fc0becdf6aa8ffc79f9581605625aa41eae7f884b9c71f669598acd045ef6f302c4a5211325547
https://rvm_io.global.ssl.fastly.net/binaries/oracle/7/x86_64/ruby-2.6.1.tar.bz2=ece6c1900ea425a331e359c06f7299f15d03c16d7c2177dd0437b71070ac9aa40ff8611c04b9c0859d85bbd4387e42722b632c5ac09d88ed82ec4fa636f244a0
https://rvm_io.global.ssl.fastly.net/binaries/oracle/7/x86_64/ruby-2.6.2.tar.bz2=a744d7788f79e5ba730476ccd14a1372f2f69195207f4faa98b084bcd96095242af9bfa63ffab9d4576e4229cd1674b258bc29a17e186154efc56a855ae82179
https://rvm_io.global.ssl.fastly.net/binaries/oracle/7/x86_64/ruby-2.6.3.tar.bz2=b56e4571b4b3d5f443975a400f501e87de2187f66a018c2f9c231a743b9fdd174ae3046630229b8d8f2d1dc0ff36a60aa6d228ca9f37f5320f020d930afab634
https://rvm_io.global.ssl.fastly.net/binaries/oracle/7/x86_64/ruby-2.6.4.tar.bz2=68a7752f44e61056deea4756a18d9f5ff5f9c47bc11423ffdb148f177db42c089191baddb935fe238d774e5c1f03b1d2572162d18e71ed1461d2043ba2f60eb7
https://rvm_io.global.ssl.fastly.net/binaries/oracle/7/x86_64/ruby-2.6.5.tar.bz2=f971b472c50d94e86d756d492db9d97ba81202763163f53afa34891995880d890534192f9ccc3f2fc0115804af2f8539da4cf3bdb64cd7e690262d467988d513
https://rvm_io.global.ssl.fastly.net/binaries/oracle/7/x86_64/ruby-2.6.6.tar.bz2=80d8610328dffc028e443a5a882dd77132c2c539965fcf03b905194c662f26c7dea52491306789ae6e9ffc382f909302b1e6e295f8bdf490ff06b1a7e29f26f0
https://rvm_io.global.ssl.fastly.net/binaries/oracle/7/x86_64/ruby-2.7.0.tar.bz2=30b1ffde1f4c47bdf0edfd0da4a059b14daa882f1b9948575cf7f99ede6dce98250443c86155c07e84ad6531d5b34b397392584e1d2fc86f44f1bc74cfda703f
https://rvm_io.global.ssl.fastly.net/binaries/oracle/7/x86_64/ruby-2.7.1.tar.bz2=660547030b0dd4a3c454dacc37a12d06d2d8da279bb1a0a77d696ea56e51ab344fd56a0ae71daf49a80989fdef3c8280023edcdeecd01507176e44814dbc6b9d
https://rvm_io.global.ssl.fastly.net/binaries/oracle/7/x86_64/ruby-2.7.2.tar.bz2=19f9801bb3b325c8d850c7fa7fe10b23fbd219ed0e2fcdb014f1df2f5da4504f06b2f581d3a79efa524755612afd1478e16fe35416cfdca761177d8ef31a18f1
https://rvm_io.global.ssl.fastly.net/binaries/oracle/7/x86_64/ruby-3.0.0-preview1.tar.bz2=e456da0dfa5f1cf1495193680dffa1b470a706425e56df0d8532fc995432bdaaef9f9ba6b04de88603b11156f094d16128e22b05b6e1bbb0cec4679e112b572f
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.10/x86_64/ruby-2.0.0-p451.tar.bz2=e56a56b467157f6255b5a49d16ca658118bf2262c48d8f73a6facdf357a7c505ba20aea070843bd0c1110b54ef19324c23ea84939006a7de22597f48e32e6443
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.10/x86_64/ruby-2.0.0-p481.tar.bz2=54b0776e3bec895b90aceb61ab9ba1606e684a32508670a7a538ebbbaa4245fb49ac186241ccbee12542e0f40f99669b13992d708b79110a52f722ea42f8bd62
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.10/x86_64/ruby-2.0.0-p576.tar.bz2=a9063b6c3b7eeee9fc1a4fb871a5c7b2813712ecc4d52b117503678035a66274c743c42ec6ba9faebb40ec07548043b6091b285b9096c3701605fcbe8a935267
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.10/x86_64/ruby-2.0.0-p594.tar.bz2=8fb533f6fbb9e027aaf80a894528d88ef2c78139a0bf363a804db7cd9e0362899cbc436ce20b990e10779203bfbe11138438e571344dd9692ac04af7508f9c19
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.10/x86_64/ruby-2.0.0-p598.tar.bz2=5ba0fb1ae4765d05b1a1551f39c78819609e4975d4b1ebe26ecee4afcf893725095fe222e6a231222258fb20961feda4a257f06b3b37201aff5fc6ef59b86b95
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.10/x86_64/ruby-2.0.0-p643.tar.bz2=1e9a83c21cf7521ee25da2a5f239bc68e08ca6acc30c2a99dc2e2be8d5eaaaed13bb3e8d36982ff8dac880af7b598c503a93097adf726722e9f2f7dc9ce1c880
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.10/x86_64/ruby-2.0.0-p645.tar.bz2=81a70d35521fb52cc3e97aa4a4c5bd3f09733bc5caccb16d0ace6981afc4e89c553a657cf1e7d4d682d4b9014c1877975a6483cd076677ba6fd1ca651446ce39
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.10/x86_64/ruby-2.0.0-p647.tar.bz2=950ccc8b0898f9dc3339358affa67f97ddaa6c3e95bc5fcbeecb07206e5b45a25e509ea02eae6313707e63616e4e2f626474c0a7cc991ef9d928b5028e9b142d
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.10/x86_64/ruby-2.1.0.tar.bz2=fc9eb5367a7b44d0bdf5228222a1222fd4ac4dce1a234231294050fd4aa5eaf838d6d6d8c8cefa98cd52b83377219f52f51fd2a1084ff6e9e028ef392469fb21
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.10/x86_64/ruby-2.1.1.tar.bz2=027469cac8c866c80d7bd4e114cb514948c09f5a9bab186172f6d8c948b5aec440e7657dce3adb7cdb87ef5c76c606e7f4f75d1d0704c210d4467193a1f1d605
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.10/x86_64/ruby-2.1.2.tar.bz2=0593e6b2091712c0222bd750b7b7490e7a227e43d307089f1383b1d888d67ca25080a9316ae3c253f4d7086510fbcdf3ea327fa8d942afde569041bfbaf1b18f
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.10/x86_64/ruby-2.1.3.tar.bz2=23c8d1410694d972495f9901c382fc43ac0963e18a42c8c39587f87936510feb9c9924796235187ef5b4379757d5ec096f8ccb24712b8834c98456361e4828db
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.10/x86_64/ruby-2.1.4.tar.bz2=35eaf6ede369260ae50d0f8d6fd05a68fe777d483cc8beab68f7d6e53d199d9c792148620b6ddf599e2021736eeda5e3cb8460f9c1d0e160cac21e7c9b32c178
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.10/x86_64/ruby-2.1.5.tar.bz2=58ad84de8ba3e991d0e9bf3629678f61c0f19c41aa064b4593571d5a935b0c995b4048b5d2b9cdd68a7e41f9be10ae89b0e03ed87b4fb06a64cfa9c4398214ec
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.10/x86_64/ruby-2.1.6.tar.bz2=e8c14032ffb23a952614a049f0f9115479b84c2d7ed6dffb0c918a6bfa67d1e313f2e36d426f18100b6a52d188d9e39f009d6cf0aaa91ab4e4ae3ca2b58d0ff9
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.10/x86_64/ruby-2.1.7.tar.bz2=e1198b86e3e14197447c1ac9c9b52b00dc3f0c2e07e99da2389894549af0907f28a8fc9b84ccda7b64a7b9d237567cd77de09846d0fa3539225ebbdc9c2c57ae
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.10/x86_64/ruby-2.2.0.tar.bz2=df6cc8de8fb27825e855943780fc8e3c586e1c462456fb448f0b2c2d75619b022848adf9bd1c134fa532575ad08ad8e4714e726424c2a192c14ea416236e4d3b
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.10/x86_64/ruby-2.2.1.tar.bz2=169bdc17ccffe0d7991e4c56d07e224b3207628109b614a4d96788524fb34a72c71e6f675eb23ddcb4b0c20f012460e95c0215e86b4e5a35351343fd1d1931cc
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.10/x86_64/ruby-2.2.2.tar.bz2=3a656bc64b42f43a922a0a93938e10055e93ed2157e23ab7dd1f54b21cec70263df74370edd314c946ac53eb6cda95a811a03b51985dc1447c8d71031afcab16
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.10/x86_64/ruby-2.2.3.tar.bz2=7a1f42721c3c3cdf7a0cdbcacd3151860127dd5aaaa8780880068c1cbbdbaeafa02c80160f0061fe88d8a93599796a52b8cc7981a6a21d786b31dcca5d2a4250
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.11/x86_64/ruby-2.0.0-p451.tar.bz2=e56a56b467157f6255b5a49d16ca658118bf2262c48d8f73a6facdf357a7c505ba20aea070843bd0c1110b54ef19324c23ea84939006a7de22597f48e32e6443
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.11/x86_64/ruby-2.0.0-p481.tar.bz2=54b0776e3bec895b90aceb61ab9ba1606e684a32508670a7a538ebbbaa4245fb49ac186241ccbee12542e0f40f99669b13992d708b79110a52f722ea42f8bd62
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.11/x86_64/ruby-2.0.0-p576.tar.bz2=a9063b6c3b7eeee9fc1a4fb871a5c7b2813712ecc4d52b117503678035a66274c743c42ec6ba9faebb40ec07548043b6091b285b9096c3701605fcbe8a935267
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.11/x86_64/ruby-2.0.0-p594.tar.bz2=8fb533f6fbb9e027aaf80a894528d88ef2c78139a0bf363a804db7cd9e0362899cbc436ce20b990e10779203bfbe11138438e571344dd9692ac04af7508f9c19
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.11/x86_64/ruby-2.0.0-p598.tar.bz2=5ba0fb1ae4765d05b1a1551f39c78819609e4975d4b1ebe26ecee4afcf893725095fe222e6a231222258fb20961feda4a257f06b3b37201aff5fc6ef59b86b95
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.11/x86_64/ruby-2.0.0-p643.tar.bz2=1e9a83c21cf7521ee25da2a5f239bc68e08ca6acc30c2a99dc2e2be8d5eaaaed13bb3e8d36982ff8dac880af7b598c503a93097adf726722e9f2f7dc9ce1c880
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.11/x86_64/ruby-2.0.0-p645.tar.bz2=81a70d35521fb52cc3e97aa4a4c5bd3f09733bc5caccb16d0ace6981afc4e89c553a657cf1e7d4d682d4b9014c1877975a6483cd076677ba6fd1ca651446ce39
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.11/x86_64/ruby-2.0.0-p647.tar.bz2=950ccc8b0898f9dc3339358affa67f97ddaa6c3e95bc5fcbeecb07206e5b45a25e509ea02eae6313707e63616e4e2f626474c0a7cc991ef9d928b5028e9b142d
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.11/x86_64/ruby-2.0.0-p648.tar.bz2=489fcc942a3bcf7cf4e793b7f98bdbda1de081da2e027bcf4788430600bd73c0a0b448f5bdd96323a4cf824b6d4c759a7d45df50ac9cca86b9c791132c2699a1
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.11/x86_64/ruby-2.1.0.tar.bz2=fc9eb5367a7b44d0bdf5228222a1222fd4ac4dce1a234231294050fd4aa5eaf838d6d6d8c8cefa98cd52b83377219f52f51fd2a1084ff6e9e028ef392469fb21
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.11/x86_64/ruby-2.1.1.tar.bz2=027469cac8c866c80d7bd4e114cb514948c09f5a9bab186172f6d8c948b5aec440e7657dce3adb7cdb87ef5c76c606e7f4f75d1d0704c210d4467193a1f1d605
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.11/x86_64/ruby-2.1.2.tar.bz2=0593e6b2091712c0222bd750b7b7490e7a227e43d307089f1383b1d888d67ca25080a9316ae3c253f4d7086510fbcdf3ea327fa8d942afde569041bfbaf1b18f
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.11/x86_64/ruby-2.1.3.tar.bz2=23c8d1410694d972495f9901c382fc43ac0963e18a42c8c39587f87936510feb9c9924796235187ef5b4379757d5ec096f8ccb24712b8834c98456361e4828db
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.11/x86_64/ruby-2.1.4.tar.bz2=35eaf6ede369260ae50d0f8d6fd05a68fe777d483cc8beab68f7d6e53d199d9c792148620b6ddf599e2021736eeda5e3cb8460f9c1d0e160cac21e7c9b32c178
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.11/x86_64/ruby-2.1.5.tar.bz2=58ad84de8ba3e991d0e9bf3629678f61c0f19c41aa064b4593571d5a935b0c995b4048b5d2b9cdd68a7e41f9be10ae89b0e03ed87b4fb06a64cfa9c4398214ec
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.11/x86_64/ruby-2.1.6.tar.bz2=e8c14032ffb23a952614a049f0f9115479b84c2d7ed6dffb0c918a6bfa67d1e313f2e36d426f18100b6a52d188d9e39f009d6cf0aaa91ab4e4ae3ca2b58d0ff9
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.11/x86_64/ruby-2.1.7.tar.bz2=e1198b86e3e14197447c1ac9c9b52b00dc3f0c2e07e99da2389894549af0907f28a8fc9b84ccda7b64a7b9d237567cd77de09846d0fa3539225ebbdc9c2c57ae
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.11/x86_64/ruby-2.1.8.tar.bz2=0237f5377cbae4e055cc37dbfc9b14600a52a1598a5d06aed84968e28d7e3b365d767c1a13ae76bffde09e8259aaa96e6e6b1757b720f4bbcaf970fa1a4a447a
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.11/x86_64/ruby-2.1.9.tar.bz2=afa5f69786a9dfc8127046f6bedf5bf52e2cb272e643374d91e080d6662f7af57411d62a1594ff2f081a614ad160e28c825c416a70aca346df1e8fa1b9007e18
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.11/x86_64/ruby-2.1.10.tar.bz2=347472d568d7cc4fee04435ba7a2166761d0d7414605879226f125982c7f0f1176b32db8088b90a8dc0acdb59d722a8715bc52e5ad913ec45538199fca0622e4
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.11/x86_64/ruby-2.2.0.tar.bz2=df6cc8de8fb27825e855943780fc8e3c586e1c462456fb448f0b2c2d75619b022848adf9bd1c134fa532575ad08ad8e4714e726424c2a192c14ea416236e4d3b
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.11/x86_64/ruby-2.2.1.tar.bz2=169bdc17ccffe0d7991e4c56d07e224b3207628109b614a4d96788524fb34a72c71e6f675eb23ddcb4b0c20f012460e95c0215e86b4e5a35351343fd1d1931cc
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.11/x86_64/ruby-2.2.2.tar.bz2=3a656bc64b42f43a922a0a93938e10055e93ed2157e23ab7dd1f54b21cec70263df74370edd314c946ac53eb6cda95a811a03b51985dc1447c8d71031afcab16
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.11/x86_64/ruby-2.2.3.tar.bz2=7a1f42721c3c3cdf7a0cdbcacd3151860127dd5aaaa8780880068c1cbbdbaeafa02c80160f0061fe88d8a93599796a52b8cc7981a6a21d786b31dcca5d2a4250
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.11/x86_64/ruby-2.2.4.tar.bz2=c11cc579541a7b685d97f4eb9f99eddca746dc0aa5f50308763d2649b0a3b459e4e6dfffd1bc881741f0636c3e1d0988e476d93b06c6b8a25fcc30bb98a34044
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.11/x86_64/ruby-2.2.5.tar.bz2=04340d3ceb20558c3022431a8d348768fb7e3e63544966e4f93c450a674ba7e40f86e5232057f580ac9a9d30d6a6abdf51a60316ec33f8f2e2dd9e9fc0d22d22
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.12/x86_64/ruby-2.0.0-p451.tar.bz2=e56a56b467157f6255b5a49d16ca658118bf2262c48d8f73a6facdf357a7c505ba20aea070843bd0c1110b54ef19324c23ea84939006a7de22597f48e32e6443
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.12/x86_64/ruby-2.0.0-p481.tar.bz2=54b0776e3bec895b90aceb61ab9ba1606e684a32508670a7a538ebbbaa4245fb49ac186241ccbee12542e0f40f99669b13992d708b79110a52f722ea42f8bd62
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.12/x86_64/ruby-2.0.0-p576.tar.bz2=a9063b6c3b7eeee9fc1a4fb871a5c7b2813712ecc4d52b117503678035a66274c743c42ec6ba9faebb40ec07548043b6091b285b9096c3701605fcbe8a935267
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.12/x86_64/ruby-2.0.0-p594.tar.bz2=8fb533f6fbb9e027aaf80a894528d88ef2c78139a0bf363a804db7cd9e0362899cbc436ce20b990e10779203bfbe11138438e571344dd9692ac04af7508f9c19
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.12/x86_64/ruby-2.0.0-p598.tar.bz2=5ba0fb1ae4765d05b1a1551f39c78819609e4975d4b1ebe26ecee4afcf893725095fe222e6a231222258fb20961feda4a257f06b3b37201aff5fc6ef59b86b95
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.12/x86_64/ruby-2.0.0-p643.tar.bz2=1e9a83c21cf7521ee25da2a5f239bc68e08ca6acc30c2a99dc2e2be8d5eaaaed13bb3e8d36982ff8dac880af7b598c503a93097adf726722e9f2f7dc9ce1c880
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.12/x86_64/ruby-2.0.0-p645.tar.bz2=81a70d35521fb52cc3e97aa4a4c5bd3f09733bc5caccb16d0ace6981afc4e89c553a657cf1e7d4d682d4b9014c1877975a6483cd076677ba6fd1ca651446ce39
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.12/x86_64/ruby-2.0.0-p647.tar.bz2=950ccc8b0898f9dc3339358affa67f97ddaa6c3e95bc5fcbeecb07206e5b45a25e509ea02eae6313707e63616e4e2f626474c0a7cc991ef9d928b5028e9b142d
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.12/x86_64/ruby-2.1.0.tar.bz2=fc9eb5367a7b44d0bdf5228222a1222fd4ac4dce1a234231294050fd4aa5eaf838d6d6d8c8cefa98cd52b83377219f52f51fd2a1084ff6e9e028ef392469fb21
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.12/x86_64/ruby-2.1.1.tar.bz2=027469cac8c866c80d7bd4e114cb514948c09f5a9bab186172f6d8c948b5aec440e7657dce3adb7cdb87ef5c76c606e7f4f75d1d0704c210d4467193a1f1d605
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.12/x86_64/ruby-2.1.2.tar.bz2=0593e6b2091712c0222bd750b7b7490e7a227e43d307089f1383b1d888d67ca25080a9316ae3c253f4d7086510fbcdf3ea327fa8d942afde569041bfbaf1b18f
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.12/x86_64/ruby-2.1.3.tar.bz2=23c8d1410694d972495f9901c382fc43ac0963e18a42c8c39587f87936510feb9c9924796235187ef5b4379757d5ec096f8ccb24712b8834c98456361e4828db
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.12/x86_64/ruby-2.1.4.tar.bz2=35eaf6ede369260ae50d0f8d6fd05a68fe777d483cc8beab68f7d6e53d199d9c792148620b6ddf599e2021736eeda5e3cb8460f9c1d0e160cac21e7c9b32c178
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.12/x86_64/ruby-2.1.5.tar.bz2=58ad84de8ba3e991d0e9bf3629678f61c0f19c41aa064b4593571d5a935b0c995b4048b5d2b9cdd68a7e41f9be10ae89b0e03ed87b4fb06a64cfa9c4398214ec
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.12/x86_64/ruby-2.1.6.tar.bz2=e8c14032ffb23a952614a049f0f9115479b84c2d7ed6dffb0c918a6bfa67d1e313f2e36d426f18100b6a52d188d9e39f009d6cf0aaa91ab4e4ae3ca2b58d0ff9
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.12/x86_64/ruby-2.1.7.tar.bz2=e1198b86e3e14197447c1ac9c9b52b00dc3f0c2e07e99da2389894549af0907f28a8fc9b84ccda7b64a7b9d237567cd77de09846d0fa3539225ebbdc9c2c57ae
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.12/x86_64/ruby-2.2.0.tar.bz2=df6cc8de8fb27825e855943780fc8e3c586e1c462456fb448f0b2c2d75619b022848adf9bd1c134fa532575ad08ad8e4714e726424c2a192c14ea416236e4d3b
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.12/x86_64/ruby-2.2.1.tar.bz2=169bdc17ccffe0d7991e4c56d07e224b3207628109b614a4d96788524fb34a72c71e6f675eb23ddcb4b0c20f012460e95c0215e86b4e5a35351343fd1d1931cc
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.12/x86_64/ruby-2.2.2.tar.bz2=3a656bc64b42f43a922a0a93938e10055e93ed2157e23ab7dd1f54b21cec70263df74370edd314c946ac53eb6cda95a811a03b51985dc1447c8d71031afcab16
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.12/x86_64/ruby-2.2.3.tar.bz2=7a1f42721c3c3cdf7a0cdbcacd3151860127dd5aaaa8780880068c1cbbdbaeafa02c80160f0061fe88d8a93599796a52b8cc7981a6a21d786b31dcca5d2a4250
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.12/x86_64/ruby-2.2.5.tar.bz2=57dd15b2dd14cf2708fac6f78e865d8798e5a70452aa17baa8ead228cd14fe28667e7b15a2892e7c43dbca4eeb1e52eed5d564c5bd8ae4ec6372c3c1843fa714
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/10.04/i386/ruby-1.9.3-p194.tar.bz2=ec402709e69439c3064d57f677446ee090b235484a80245e819993595e55ff3a065ae47fd70cc765ace6edb522ad5477b7f494e0f6443e0ebcdae6e78cfd97bc
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/10.04/i386/ruby-1.9.3-p286.tar.bz2=beebce0b101b693c7b077cfd3f070df93fa7b494c70fdc2c9a3d7dcc5f65d0029944f1c7a7083fcb0371a93ff71aeb9dae9ea51595bfec40a9364c33d487d282
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/10.04/i386/ruby-1.9.3-p327.tar.bz2=64000a391027fedfac806aa4817a8e4ad625e9641efc625da4270c59955ef91f74806e143af33086f24510b8ede527fac98430ba8a1e90aae631451b1dd92ff4
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/10.04/i386/ruby-1.9.3-p362.tar.bz2=9bca59f0bc404ef79e250d2208769826284460f0257ff1a06976cc0654da6e17b8db5d8cd48703135068f8b53502173b62718777f92724407b44640c9290c45a
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/10.04/i386/ruby-1.9.3-p374.tar.bz2=6110b46165a79298db1923915890d4382985a6d14bee6b8ee8d9773ade7214695c3af46d558b454cc41f923cf839435aec8cf81104f8c58f7e81b7593a0bc0a5
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/10.04/i386/ruby-1.9.3-p392.tar.bz2=eb6cf0583c450241cb56bdef5fce1b9c483779a1ab78ef3714f040e9d0aa8de4a00b0dbd3034e650783db683b90970c3058da6bcc76970749fbb817b99571847
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/10.04/i386/ruby-1.9.3-p429.tar.bz2=9b53873bed0d02718d0be0b6e992eb8db675c79e628d2d2d957046b2aa48a2d410c51f137151f55b8574a0ba4e10ddf7b02784b0d352de202eecf31f30284cee
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/10.04/i386/ruby-1.9.3-p448.tar.bz2=842f73a5cc8e04e9efdb743c93ef8faa54bc87b66ea2b6b3f121738323de7434a59d26723fa0a7044c3d300dc86c2598ccf2295446323b89a6b5198a9cd928ce
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/10.04/i386/ruby-1.9.3-p484.tar.bz2=13e8f2c7b1dd3f35b56cd7087e7a713a738676ec4badb70ba7409be2fd99aed9fb264d6bc749c9f78308ac619c2a4900902fa0fd70a32cc3167fab4d1b2b9d23
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/10.04/i386/ruby-1.9.3-p545.tar.bz2=d226b6365df54bc5b356a85ae76dae96e18521f2958e873ebc268ff5048257146f415ce13d1a93cee666f7ba3d7557a234ffd468eeab57015335b52d1475140b
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/10.04/i386/ruby-1.9.3-p547.tar.bz2=5b4cb043973735b8fd0fde30a652e2efa1747d75de59ce9beaffc58bd4e2fe1ce57d5647e8d0bf2accfff900beec5521ba701ae8cae23bc01bb6b17d61c72f06
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/10.04/i386/ruby-1.9.3-p551.tar.bz2=5b667c4191475d023af8cd863f565a5f6c74644cfc7241683ea1a98bdf39679f740196a1d186d0935f4269926e4583557ef394298994dcc9099000c118d01d27
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/10.04/i386/ruby-2.0.0-p0.tar.bz2=1eeb92edd5f05fa2a693c46bedd477084a8360c61dc26cdc63d871caa2983525b79dfc00cb0b0f8c2cf6d1d9ae18d0b73a25252b6e0c724018a8a7a414b60e71
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/10.04/i386/ruby-2.0.0-p195.tar.bz2=7a02e49c43fef2aa241c01985d676cb11eb1134050ec87e4c6ac98d75b0e04407627d8374dd528fc2575405c552080995ce0e69dfebfadf3bf1166713ed4da88
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/10.04/i386/ruby-2.0.0-p247.tar.bz2=92274d11815e19eccb4b3c39ce7e0abadb21162e53ff1148719ca5b0ee6a5fa231afab6a1aaddab5b0ac31ff5e342a255b1fad2a548e7ecae60b2bca03fe8e11
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/10.04/i386/ruby-2.0.0-p353.tar.bz2=e6e1767c977f334bcccd27085ed409259365c0e5c5fb518f4560fbea7aa2500681456b1d8a8b47fdcca9b1f798b65f193a9f7ca1fa4ac5f950a68c556014919d
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/10.04/i386/ruby-2.0.0-p451.tar.bz2=14cbfeb44f60beb05eb0edfb8ec72fc38cb255783199353fc4a3d6f153264e3def4f23e2eac26125b461ab971b99fc5a9d6d420d1395c84dcdd476b706f34b76
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/10.04/i386/ruby-2.0.0-p481.tar.bz2=1ae4b07609e959359fa2475be7648d809637de9da9f3552e8a66754d34f94450cfec39713c7b0cb8ac0db2f2cc966e98668235dc568118d547b3f6122e1b89aa
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/10.04/i386/ruby-2.0.0-p576.tar.bz2=e24be4452fee764e49681ff72cc7affeac191400a52cef05fd41931413f652101c7128dd2cf4faec2d840400f3fde22b85d567ead0a1dfd45517ad3c1f96bf2a
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/10.04/i386/ruby-2.0.0-p598.tar.bz2=1e75da56bc9e92c4f6b772ed9818c59c72c524097af9bd2f5820793dcfa83d3b233f85c0ee296be784d701f88f90e880bd9e823d304152e828ed189c7f9dedca
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/10.04/i386/ruby-2.1.0.tar.bz2=5e4805e1efcea1ecede50336da6a94b429b6c78268137ad07803cbf5e3af24eb7efdd9e5e998b3aed3ed0548a69792e7f484ca630cc62f774c4e95334d23ec5e
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/10.04/i386/ruby-2.1.1.tar.bz2=66bc7897bc8a05071d6939763e2d160f91056882233448264096cac4431f3e1e0656f3e48b5e60bcb7efb1efb8730db64192cdf945b7a36092a4482ff065c37c
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/10.04/i386/ruby-2.1.2.tar.bz2=05ac266ce91940d027c6e8ecb4c045165af5bc3069bfb213c74a9d139ed365f756c52b8a1fdccdeb48fcb875aba99fcb744380a9c856dcc251f65e2efdf674d0
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/10.04/i386/ruby-2.1.3.tar.bz2=2eea54602da08d250d71e12ac1fefb96b07f3de839dceeb2bfe18a290008a6b92219d257b63c1934c8729d9d3d85b74bd52dcd0eef5c5e4546e1a47d51468c40
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/10.04/i386/ruby-2.1.5.tar.bz2=1bc9ddc5e5c2e1a93ebefb5c82fd318f80c9d5da67c6834dfce6fb03209afe81542dec08b946cce4a2f95ad05fe98600c419cffc801cd9d1250268c9046d2c0e
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/10.04/i386/ruby-2.2.0.tar.bz2=a4880f1e822986ff63670f39e5f2970a1c1363ae91c0dcea3d47f0daa0d86d57202bf4fa92994ee32d60a6c9661b66c651c991df6d8e1316b16a0be44e025e82
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/10.04/i386/ruby-2.2.1.tar.bz2=951202e9a4fefdcc180d1673b3289f974928d4f72f1f75ff03cfbc443202bee95124f5549fc2df9af614012a4624d1ad0fcc20154e64181fefacf034ee8d7f6e
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/10.04/x86_64/ruby-1.9.3-p194.tar.bz2=cb917714ec1d666c2431f0cd9eee16f7fd0d2b45d01a297c7fb9e44a18ee48611ace2cde0cf9bc2de50326affdbe347ce5230fa8dddec0386d5a17ae80ead8b6
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/10.04/x86_64/ruby-1.9.3-p286.tar.bz2=35d5f129c5a0aaae7646e4bf6b689194f62e28efea9fb62f539ed2dafbd52834f30780a6116dc9ca278be068b4f9e169e29969373e4293499e03dc4771beab1e
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/10.04/x86_64/ruby-1.9.3-p327.tar.bz2=0205f41ab8935ec70362b953ac1bae3324317f6ab3d2f1f45fc49fc642775517623c79eea10b7a3bd91a01a319feba38950fdc01600b190f112aea78b3961f06
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/10.04/x86_64/ruby-1.9.3-p362.tar.bz2=6e446d34c2ee8141922fe17c226cdbe218983a0ee399f0b211866351002624b5c0ea7e2adc6002e35d8c446fdfe6f2cbccd6b08d904164d0a091612f76cb6f18
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/10.04/x86_64/ruby-1.9.3-p374.tar.bz2=02b3c22b2ce31b821dc324bbcaf3188803233498332fb48be929b46159219fcbb9ec0ec715e6342346019027f6d9c98da4d40681578cb86011ea9fac2d6683d6
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/10.04/x86_64/ruby-1.9.3-p392.tar.bz2=4780b7cfa49fc1789373b79234b18fb6c7488c30d2c8907d3e12ec08aa4e4c92636bee8c6d2a1a26f833e97d9ba66133e6cc4244ef6ca7659b2a5bf8b84f44e2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/10.04/x86_64/ruby-1.9.3-p429.tar.bz2=e4b3f9be1997a62720a9ea14aa7598c95feeef6e4f7cd076f8b3063acdf9ff0403ab0d3324b1729187228224d3eb6c4facc94aa787728dd21148ba0ba5f427bf
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/10.04/x86_64/ruby-1.9.3-p448.tar.bz2=9a84cd3293b6ffe27ff6a7d10059f82f96ab9193647c2a20fd4114615fb2d8594bc12b5e40e3c36aab28d16a0bba35e86752b501135a82e74a6eaa3b472d8f8f
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/10.04/x86_64/ruby-1.9.3-p484.tar.bz2=b95e81e9f1bebadb4d21db02b12f17aa3af1025b3d8f9526e889b1b3032f189bb65a7f3b2d02326d8abaa26d5a1d6884ef79fe959fe350e566950dfabb470579
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/10.04/x86_64/ruby-1.9.3-p545.tar.bz2=82af8465671af0bfa4accac469dad51bf4cde92a63e07b1ae00d30485380e458ecd0fdaed7e72fec9e542cf3acefdd4771cba5b2577dbb6254ad00faa1691a97
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/10.04/x86_64/ruby-1.9.3-p547.tar.bz2=aee222096a4df97ba0cccad8eb34cdfd5e90cb77916abcdcb09266080317860c2193284e6f68765d7d23671ce46794d4d6a56804b93ae40a79dea310caee9079
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/10.04/x86_64/ruby-1.9.3-p551.tar.bz2=9eff0d8d6a6249bf64b7f72c3adf2fb7be94dda6a314a368a62a885d60beb3870734592f31547229e12a40bcef5128d21d6a8dc9e564225f0a2b42b7b714ee3f
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/10.04/x86_64/ruby-2.0.0-p0.tar.bz2=dd40aa67becf040c87f093118d39090390fdb20618d66de28ac17cedb75bbfb0ab4e6a87552ef82e9cc0afc34b3d8cc51bd8b77c7348030b21998ec0af7146ec
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/10.04/x86_64/ruby-2.0.0-p195.tar.bz2=d73999318cc26887e4b71b36fbb0c427e46fa81119ace23e810f19810154b2c1286671cba4c4a71ceb3c8fc4040bead648ed84623bb217693811592ea72ee691
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/10.04/x86_64/ruby-2.0.0-p247.tar.bz2=98a85e1ea27057ce31680f22641fb6b07694a6d90e68f87b0a99eb225f5b061daac7797c2b1356f4671cfac1c58199f92ddf8690e369d2effa25d685022af5ba
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/10.04/x86_64/ruby-2.0.0-p353.tar.bz2=d8be66f0be167e7b8bb7ff1c551a1ae6e438cb56436258bd887293320d9c925e9a7866bf7d89fdbf45bb936226599116402ce89260b1998aab022854ae6913ec
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/10.04/x86_64/ruby-2.0.0-p451.tar.bz2=b85a4cf9f30d3f8e0bd369f8c6c4a12182473b2f1e74f6f325f8f2c09534029f25c6e7c1b1d9ccd0141c0d4fd71e1b95d4dfe2efd816ed4126b664b6daf138ea
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/10.04/x86_64/ruby-2.0.0-p481.tar.bz2=74df44a16e9b5644337d01ebcc6a0e47b370c92c752ec33b74af43befa8c089d28295f27e0ab10a0cf2dab64135ec77624663d4dce76c3d2e0f3932f2fa37259
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/10.04/x86_64/ruby-2.0.0-p576.tar.bz2=5a102ef456de2718b015dd2810aaaab14d7d860bf8c6ad497c46987f76b8d1334d73ecde49b75b93fa238527e61d6dcaa2b24fa48959080144dfdb69fe84621a
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/10.04/x86_64/ruby-2.0.0-p598.tar.bz2=6a1aa2ada9143df7757fb283e006ff6612b1deef2942ae458b41baf4537554a906e3bdc0808bf1ba0de0f7ad73baba99da682bb8204144357dfa6143eca194bf
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/10.04/x86_64/ruby-2.1.0.tar.bz2=5e985f874885debde4959a819662e14df5270552a547d455c9537edc6802f090393d151159292223c5c634e423994886f9f0b898d21b78c5dc14c2fc0fbc7b5d
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/10.04/x86_64/ruby-2.1.1.tar.bz2=38da271ad70700babfd9fe30b39477097761291d1d77c37045323a14d96aa667d30208dba0d3e6b05de8da74c9cb2e8da1e773df87b0c70bbae07ddd6eb2d9d7
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/10.04/x86_64/ruby-2.1.2.tar.bz2=6564f954859bdd5c11d3e2b021b95edae718c81a565b3a7c654c90de5fb9f17285c8b794f468e56f6ce020cb776ccf865a118df43249911eaec70d58d1993cd0
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/10.04/x86_64/ruby-2.1.3.tar.bz2=2bfdff11fdd09c5e78824445fd12a8b958e8655237b3604c0b762b5782445805b37efbaaa08fe297b011d4c3671dda0083816eeb364bd71cbce1d370ce223681
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/10.04/x86_64/ruby-2.1.5.tar.bz2=4ea0214e0b7419fe1c9f8111c88e9182dc1baa894af89531f3f4130121b40421e8bd9319a8daa4af002d7bd73bbcca6a994dd5c40eef45934e37a4458dc84f30
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/10.04/x86_64/ruby-2.2.0.tar.bz2=26b5215dd175b408549da2204ca8d22957c87b6972c814a86be160280091e93b9e81e10155543c8a9b7e6c9777022f59b80fcea5a139b9deaac478e794db1ed6
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/10.04/x86_64/ruby-2.2.1.tar.bz2=db4d1ebc449fe2f7632ca55833796983e44d2146f5ae1a834944ed6ae54b8e9e44f8f2a9a998c1b6add6e75121cf30a8783f57a5168c7ec570efa189af918a81
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/11.10/x86_64/ruby-1.9.3-p194.tar.bz2=6ca4101373a9ba4b4f5da9c3f13d3991b528d31a54047b0bcd68866bf7c7e0df49d98f321226f63927bcd52e1f4b49f6018c68bb18395abf575a7d47b2ce8fbc
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/11.10/x86_64/ruby-1.9.3-p286.tar.bz2=0a1f46ce1f675b1b8c37de93066caf93b9e525f6f8f62af2c912226d0eefd56e53a8fab1d6a482b9d50b38f31d1eb36994ac2de735f5d323564dd24addd716bb
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/11.10/x86_64/ruby-1.9.3-p327.tar.bz2=fe261dcfed03499c4535f6f1408e5a7deecff02fff893b88cc688569e02f35dfa1b3f6d0ebb424d6045eaa4838a580c8cc49294e4b3baf265f255bcf78222fb0
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/11.10/x86_64/ruby-1.9.3-p362.tar.bz2=65ce2247eef29c6d10245b16a568c3be5b2a0b29c7b42597a1e807359190644e30485a11b34f37e6f1c5e99aad7751df9e6116ac36b0364ff17015864a57445d
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/11.10/x86_64/ruby-1.9.3-p374.tar.bz2=677f55ae51facf85b3cc53b375242eaeff64e23fb8280c0e31e87ed8d35c8f2d02689bcc5b3eedb27c6f7b78925598a8f7d5ab9c8d50a665ae88cfd25fb2f282
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/11.10/x86_64/ruby-1.9.3-p392.tar.bz2=70761c618b21b8e1a3ec3ac1bc9397888a2f785ed9aca49574b609e20b1d6a4b02d67706c0e537cec580f9dbf0e46c39a2e91dbd1d9a4481d712c51cfa04a6e5
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/11.10/x86_64/ruby-2.0.0-p0.tar.bz2=4d6aeee4ef89cbb8476df65803080fbc88b062269f9872eba13b743a3e55620ba07f8fa58dafa1b11ec1b4de3389ccc4956fc92da6561bd6cf90cd5a27f542a0
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.04/i386/ruby-1.9.3-p194.tar.bz2=ef03f832f8296d9b2d8b6c93eb0fdf8cf3d2408772082e6ec02a7da8a9ae10574cfaf7105b123cf480cfcad4bbffc86f4fb8f91e88b8a1da0e3541420e1915c1
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.04/i386/ruby-1.9.3-p286.tar.bz2=ac056fe566f275681f8403f027c16f80070be5889c7d4f93fcc6b81bb22c5faf7e7d90ff833cc4ee43bfca28b1f19946a5fcf5218777fc1c4e44c288460daf0f
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.04/i386/ruby-1.9.3-p327.tar.bz2=e01bad5804713b767798bdf8213d081488957ee037992786d2a2e9b7b5a5455c7d8355fb4045fa5d34e82d0c90049ff29e0af80aa12d7599e6be8866e6af3de8
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.04/i386/ruby-1.9.3-p362.tar.bz2=df05056ae1d37798485c965429e23ecc03e828549ca198b7b627f70170e24970237280a1e3bcb1c23c056008ca1e814b8af77415b3d3f3f7ed0706513b6dfd83
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.04/i386/ruby-1.9.3-p374.tar.bz2=b5932a68e2189f4d661fcb086e12e46f1059e2ed719fe238869c7a22170daefef979710e99d64a920b375fa96af7c6d24089140d839e5ef0bd2662a74b4f5a12
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.04/i386/ruby-1.9.3-p392.tar.bz2=d4b1402009fb78c6a24a7ca89709ecd97dbb064a134adbd8534b4fdddce38f4dd4d8e79fd584e84eb9f4b13c17a5b4d88eeb90a7e356ee1bda440455b04588b8
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.04/i386/ruby-1.9.3-p429.tar.bz2=3abce0071a4b6976e405c959a7ffddb42ea0e190a054e8447b0aa18f414c3f0d0c8b90bb4c888c0b65042c895f34c2c161170258f757829bff9f5bbb920ac129
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.04/i386/ruby-1.9.3-p448.tar.bz2=92d4a3049783ea9b80bf3f514e13a7f9b64e54df65364d213ed2318ccaecdc97ec9120af452593cb722f3208e0d24843ff8700d5282993e2a9c8ce6392f22058
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.04/i386/ruby-1.9.3-p484.tar.bz2=d9eca92a0a63403500344d23b5ab4bfd2c6204ded09f7ee48b8a24080a591c1ee134b32b4a29799cab118008d180787dc59c6682c97b3537f4ac35f17e7ac7ed
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.04/i386/ruby-1.9.3-p545.tar.bz2=977997ca087074ddd3fcb3d98e49f042a22fa98e40d1ef6f9260ed1278a2e556a30d024019d7215cebcc0e246b9a90d9c4b58e465dff4364d8a1c5363fc77817
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.04/i386/ruby-1.9.3-p547.tar.bz2=cc7fad07712ca8744dc3338559922156fb3c0fff12b0dc5485624532a3af025282422478ac5befe14d5c6eee7104f2f6e5fd8a6e49eb0994dd68d1ed51feb535
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.04/i386/ruby-1.9.3-p551.tar.bz2=1d4e920b488492f11a07ce30bc97ef80a7dd41e477a9ec1dbde35e53327da1307b6fe2240232ee3b3713dff06f4b0b5a651fe7f710731d9c4f576402e85800e4
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.04/i386/ruby-2.0.0-p0.tar.bz2=7cefb5471a7d2167d75fe03b596ff5f518d2e6ce7bc885ed6eb1c2cfa522d0bc81b2706dbacdab75c29771aa6d47d512a7def29db9f9cb842cfcfadfa255e0cd
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.04/i386/ruby-2.0.0-p195.tar.bz2=ae3a1c97fa71c8d812664f1ec38cdb21b01db813c98253ebc4e2636d54266a48717bae7f1a510dc5e1a645879d6214b7bbbadc40585752c2ae3975492bc19eca
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.04/i386/ruby-2.0.0-p247.tar.bz2=710a3cc5273a0d92acbd59a2bc6e5075a4db4a93651dc93a09ea936b8116e1ca6bd9e60cce5ccbbcb4a2157bb3fe0ebe77cab5f607ee6c99730e4cfce0af232e
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.04/i386/ruby-2.0.0-p353.tar.bz2=830d7a50104fde2e8a0c2d8bf04428fb961a7212414d8d75b0d917e333a14f5452ca35f96516d8e240da9f553bdce8720036bdf4b554ea06b35c0ad29b0acb94
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.04/i386/ruby-2.0.0-p451.tar.bz2=0ae998adea0f58b436093468ee69a0a2cd3b9d619dfbf4fbaccb47659281471e88ba22b5c6832408ec8ba731fe52715d560a203de899a01c600ffc5a0a62d947
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.04/i386/ruby-2.0.0-p481.tar.bz2=e958f89bf5be6ad6e293951f7e09567471db8303226c589e8e9b744dda9f29d57f7e2728699ee615c14b23acd75a82d347c9141ff0e3e3af3cb06c0ae982e818
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.04/i386/ruby-2.0.0-p576.tar.bz2=a596d9e3828df17c84e3bfd84c5418df67266ccb2c587b31dfc8d98eed7182c0324d37fa07ab8748801c9d190beb3b145302fbdb307969261fb6009594ded134
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.04/i386/ruby-2.0.0-p598.tar.bz2=e6a1ca2291f3c8618d475c1943be1adac4c245a394e60733fec55637e9f91d036b2add8084a021d222a283a36db9fcbcbb853426399bba4bf71015ee7c4c3a03
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.04/i386/ruby-2.1.0.tar.bz2=56fffc5b857b1cfe91d1f8a4914005428f9ef23bff68b46667d89f7f825f037c2e5d5cb6a14c62c1350e9c9dc6b8e5147f2fed66a1e099fced2364aba0ea570c
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.04/i386/ruby-2.1.1.tar.bz2=671699a89352dae148114fad949e22146d520aad479d808c175b9e00429da6e3fbaff7c7a1a500caea67570f2d55d78d9e13ce0adbd48308853432e69833b5da
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.04/i386/ruby-2.1.2.tar.bz2=829fe891145409f46a0d591a6097107c57765383119346cce4395faa89bb836f206925175ffd8a6610d88e9dbd34a227e0563553574b41b15d59631dbdc189ac
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.04/i386/ruby-2.1.3.tar.bz2=f4855902901a5e5b14d3acb8cc64e248338d8fc38ea69c94c61c6c9d7c4ce28a43efd29cc23bb4612c9bb8ee1426f7a3d0c19cdd903d0b4a78b59babeb2f8532
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.04/i386/ruby-2.1.5.tar.bz2=1a21ed9a4f0e22b9a74f8675b89ea986caf6b1c589b66d2186e58e6c61f6497003574830a109e4d172fe6632d8975e107a6aeea99f8c348686e6126c047c13ba
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.04/i386/ruby-2.2.0.tar.bz2=8694ee79a7cc43041bf5e89b84fb6c4a31c8ccab3e2e2075eaaa5da19f022d0f59d3e0f22235047d06c6b97425dafa3bf2777610ebad21742a4ab6432ed410c7
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.04/i386/ruby-2.2.1.tar.bz2=3ccd3dc48a49dc68620e720db38c5acc78f877e7592ed47b498e6847f1aee05436c7815496d151c5dd50fddafdc18158689efdb0f21bf54deef71a0e20142c97
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.04/x86_64/ruby-1.9.3-p194.tar.bz2=a237d43509cfa02da5adac04e34e973b31959b2cca86980cad03f4abcb106e181d3d795ba5396ba0b646c69206b0e0f5c313dba4348ea6e9e186080145dede75
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.04/x86_64/ruby-1.9.3-p286.tar.bz2=779aff6af688367ad444dca85c6e8cba136216b2bc5d53a2c4fbde25fe516fcb6aa493223bde7f1e38a926c9007a8581772314eb838d51001748bb5901b07432
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.04/x86_64/ruby-1.9.3-p327.tar.bz2=f6d679733f05153b99d4595c474ffbadd331f9e9955294f8a80525bd0c7da75e5f801a410aecb7ed60a526fa92f08119a6896693f81b9bdef4a9087e53f01dfb
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.04/x86_64/ruby-1.9.3-p362.tar.bz2=91fc7ffdfa279f74d0c5fe8f2ce7f1a9b1cfa3c607f9bbc67f15e834cacec1c8267f9e96a71dc92fd65387ac9374445da1a1a375762cb2d9329c02c5ea68c657
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.04/x86_64/ruby-1.9.3-p374.tar.bz2=4e41ed0ebd7e92fd3028dfbaa89351a0a53b10bcdbe980552b7446f299e692a05a02d2f2ac0dd476e71df6f1c1184f8df369ece906750ae98bf7b920a0ac8b4a
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.04/x86_64/ruby-1.9.3-p392.tar.bz2=65c7ea838862659c3e8fc83a5be86e6eb9b8354ac515d2295e331d35c4de6655ef2e69a55b55bab0bd875220e797ff8ebd290c0fee77c4b63f1b77bca677ec7d
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.04/x86_64/ruby-1.9.3-p429.tar.bz2=cc8c855c0feb72e94dfccffdea592954df4864d307aa254542fff545ff668dce65f2d857b7ef3bc33cbd73ab66dcfb03ba6e2306573412cff6663a442dfcdb3c
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.04/x86_64/ruby-1.9.3-p448.tar.bz2=1e4b11137bf43f9138d5a1b0174e8c1158b54385bbcd320f3b704144bfcd7e491b4496c3ea99c21535d662eb24f5ec4b398e54fd22a574dc1210a1d3518b82e8
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.04/x86_64/ruby-1.9.3-p484.tar.bz2=979e06d9a61fda73fb6aed553beadf59de4f3fff4341bb4d8c0eea3e8f608e46a7a0485893f89a2b86d9ae0c65276930a361096c31facc4a527248163d286f22
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.04/x86_64/ruby-1.9.3-p547.tar.bz2=80ecc7ac49b6c37168bbd6d0e34fa64ea8c494dd483d5c4dae5ab9de6184d70e819a0c4af500d069994a548239eb0f02cd746cd88bb1d02cf9bdc124ae51d783
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.04/x86_64/ruby-1.9.3-p551.tar.bz2=33f3be658fa2edcd0465bd33b6dcec07f5e869e53e5efadecdaa5c600070887a9bc96d83e389e54a4f620c644357f53622168d26d1239d5183217642897e9429
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.04/x86_64/ruby-2.0.0-p0.tar.bz2=7bc8993f3650158a61fe7dae473780ecb384efa268bcba75b4c368aab34b6ec59d37c751687b7df10750ebc88af392502577c36fb0a06f66de7d8a1727062672
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.04/x86_64/ruby-2.0.0-p195.tar.bz2=766b4cc8c0aa109f0ba09284eadc8db46ed657b9363b575433fbc0262b99e415471d663765527eff7ee28e04809978cfe2185f7733411bf9e0e71f5be33b6c21
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.04/x86_64/ruby-2.0.0-p247.tar.bz2=f114fc3bf9c311b4650c8b1843f1873e733dc047a13fea862989692f09c766be26a986e9f146c9c2709ee9efc3b85ca055a7f292162ce081cf01668592427870
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.04/x86_64/ruby-2.0.0-p353.tar.bz2=e066218d19314307fad17165e68b9d2388ae0e9dad03a37b8485db8c6cd8d512f378491032c07c0818d532ede45ea6803cd0bd00b4b6e8586ecb5f5452aff138
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.04/x86_64/ruby-2.0.0-p481.tar.bz2=13675ab2c2707672fb7668fbd8d2010aa563488c037cd84f72a5388e9d5f99a431ce7f50d08945d8db413bb5ca7b20bfd313aa1504fb9467d21a26c1e2a16194
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.04/x86_64/ruby-2.0.0-p576.tar.bz2=3e63c3d8d918f80d5138228905abf00f28ed2376b5dca8a1fb59a7201acca9da2b7e9e695fd2fe0f0390f301359480ef2c0c23bdbe9fecdfc78cfeac5ef1e855
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.04/x86_64/ruby-2.0.0-p598.tar.bz2=b9559370f2a1e17c96492144eb3e47b981606b9e41855b1a0b86ff3f96691b4a693b834baa6430147755ae60a9f43e4671e1e8931b6521d70c3f081aae6bf9ca
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.04/x86_64/ruby-2.1.0.tar.bz2=58f301ab3ab95ad9f2efa16e4922c9e8ee3e22a31a01051d31d5704a46cc736b26bb9eb55a62b309908ea497199240c5f139b1acaf1cbc3a23b2c6e28e2c4fb9
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.04/x86_64/ruby-2.1.2.tar.bz2=40871f37c5b6b17354a5fca17c9035817c2021896a9d49a93c12046cc28bc6a5aafcbcaedb69504f7e837e2f628a25f827245c13f3c00c88bed5a5137fe8f210
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.04/x86_64/ruby-2.1.3.tar.bz2=850506e7d9cc14772730445e7a60eca00142ece55faea48d34e26654360050cc4b18cc4074948e6e3eb907004e2a7e69d59878767ff4c6bc9642e6f226ae703f
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.04/x86_64/ruby-2.1.5.tar.bz2=0ff649a9a06909c2cde1bf1de0a48028fcb68a590baa7c0402a26f825ad8dfdb092312331f2ba65b2422d0610bb69032b4cc7660580df411343d0a5ea7591848
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.04/x86_64/ruby-2.2.0.tar.bz2=428be61f0bfba4c3ea22963fad95704a05829c608a40120938ce52da9e3e69428ae63f8065f4beb89a57231945a896a04ee0e2a8e70b8aeeeaea0cbaa551f108
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.04/x86_64/ruby-2.2.1.tar.bz2=612efb525cf243c46940ae9fdc149c4b5b71a18fbfaa704a927bb05a4a573ed807f9cc0c6360a296dad506b399c52bb63e51adae70c819769f85096c9fdfad17
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.04/x86_64/ruby-2.4.0.tar.bz2=2e9d991f8b10cf2a0ff8c783b43d6773473f949d7f8e66c45a172820332d65dc2204da1e965cb4327e8e30882b43a394b34aaff3816ac6224d59346976c2b18e
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.04/x86_64/ruby-2.4.1.tar.bz2=a4e41a355968d0cd42e04af2a7dfe961ce0d0689857a823366238187cd7a7023608cb0923e5bf6f7b734fe9ad5c8ee5e31637be4d225b2bb1428cac9099b4126
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.04/x86_64/ruby-2.4.2.tar.bz2=0380ac728c0a05d41d49bfeab7e9c66b5730487365ce785cc482475925d5cc4add9fc4078c25eed18c5a8deb28d5d1dd5c7c73f357c45e947520578407fbcddc
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.04/x86_64/ruby-2.4.3.tar.bz2=3729e9a99417d2d942fa70c77396bd56cfe434cfd881abae5a8ba2ebb7064c1ff218acfeb7415f6c55b2685f4fa413e3beef6cb3dc9f80cf73cbb2e3823c1c21
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.04/x86_64/ruby-2.4.4.tar.bz2=9ca7f42de4e36cb08f79e263ca0996f3e9e445cb04caeb786c673d7fb574337695968a0bdcee39c820d7eee46f6132cc9efe2d6642655993669ab28496a5ecfb
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.04/x86_64/ruby-2.4.5.tar.bz2=04ff6eebb3882f5eecd24c81256de025398feec8625e162896161834f6f17334b1cf9b76f093d3789f0c493373b2ffb1eb65cc0e0572be81bd6d2df4c6589ed9
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.04/x86_64/ruby-2.4.6.tar.bz2=9b58e0ef98ee4de423850248921673f6b36a20a1a7a123b033174a9dd6ef7e618ccce0d0dc9f5cab77e53b76aba56278f33f83d63b0fc40e839bb1633465fe1a
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.04/x86_64/ruby-2.4.7.tar.bz2=b71482e061f1d5ee011879b9d59c3b22c368ed0c6e30b56d2fb8c1a1dad48b7ceb8f2bb1f2b4d86370d503cfc1490034d0974b84df59ff5149f747f1019e1315
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.04/x86_64/ruby-2.4.8.tar.bz2=74f066487c1ef4486d860d1eaff6ceefe5fab3d407740324edb17f12c61ddd4e90e006ed4842243e218fdf4adc4cb77158eba976f81cf459e0dd28cfcca4cc3f
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.04/x86_64/ruby-2.4.9.tar.bz2=710c1cee3842df9feb5ead6ea30573d7ff29dfd077c78914491707afd3572c37698052688107b2eab0bb5368779e991fe820b4cb80abc11b4063e50faf0ff680
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.04/x86_64/ruby-2.4.10.tar.bz2=9931336979f6d07f89e147e306c50655b619d3625d3b70a4097bb3ed645906a5217fb77aa7824186c93fc87467c9203f03236aa080e8732b2dc484bdc289515a
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.04/x86_64/ruby-2.5.0.tar.bz2=856decc23a99b9edc721d79ddd4ad7a153be475be8486402936736cce8570fc3e9183e87553ce1eedc6880ac567d0a41b719acef516d54ba5896de4cadd59ee6
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.04/x86_64/ruby-2.5.1.tar.bz2=0acce307455c7befdfe24eb2841641a826ca436a6dd9ac970c99ed69cc1202651131a7200bf3c5c1f0802a1da266cd32eaf94cf93ef353a9257dcf5fedc85b2c
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.04/x86_64/ruby-2.5.2.tar.bz2=3cfa7d6bbdd5104575b9896f24d81c9a16a31f7782a6b516fa6c73374f44d160e02f32de20ab1aef2225b8aceaa56756f47d6266fb3ef0793918a488b13000ce
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.04/x86_64/ruby-2.5.3.tar.bz2=a64cbf0c237a13b44f583a1ea7e18c17a911dc2b4a8d1713aa8b0726a852677175588cd76c81bf30b46c426e5aaefa593400536b46388b61735e99c1beaf6b23
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.04/x86_64/ruby-2.5.4.tar.bz2=733d3a0e44b3f5e212bf7453727a79c77494489107f79f2146bfb6ca8a967f6908fe6f33f5e1c8f00d4e2cb1a44760c59ba53cfb5428c73fa82c54edb018b92b
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.04/x86_64/ruby-2.5.5.tar.bz2=d62274dc8ed208892ac97291129cc15662233cb5205b5303ada0fbb67ca2e833001cf1647b65c46ea9e6f5697e1b939addd22e1ebe666e7584c39e03e212ebec
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.04/x86_64/ruby-2.5.6.tar.bz2=94a12b8cfd70c41f5d1b12ef6cda08edfeb74901e14af141d277487046d49a5541f743ae68a9a861d81249d60aef50a7d963810f6964b933bde5136370f7488c
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.04/x86_64/ruby-2.5.7.tar.bz2=19dd3842a15d9dc7345a1bcdbe2e2ae1017694260427396e0b2610d10abe8f11621f5bf5792955d719f5f71b909913bb4c6a915ed7c8d893f4428807fd9385dc
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.04/x86_64/ruby-2.5.8.tar.bz2=0ff7116f2b863b31fe417c347c7903feabf799b3510e41e00cfb4fca6a50c1a47e8f390a617e3ae2d5b92d568f6434a2dc3d397cfed9e33a9073f3290fbab97c
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.04/x86_64/ruby-2.6.0.tar.bz2=180e80ae58e1b7b1a94c9fb7ac1f3994c10943f84a797fef82823e60be92d46d305ff30ab41fc59dfde5a4c942f5d4cde31eabf536910ea6dbc55dce931744b4
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.04/x86_64/ruby-2.6.1.tar.bz2=bb8aa78f260bdc0aae65934b97bb6b17e3d0b764adcf783f6ff90dd8157fd8d34652ec66b46421d3657d33f3f81b874b1615a21b733f8dd207e6e6140406dc6d
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.04/x86_64/ruby-2.6.2.tar.bz2=c830febb691dc0b92d431c71fe55c2dcf021466ee96ae41dbb2d86bd03ca938831708df50b65d90b625ba7e31ee1e886ca3962a743d4d57855c7b410a0d47397
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.04/x86_64/ruby-2.6.3.tar.bz2=d0a45e33f0d332451eae1ee48fd954a92d84129671bbe4abc09b3b8f63aeb1d1dc43cc790429f40f8fbdefe2ce7d2303618d3aae95713f9e8eed0eb561e80f88
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.04/x86_64/ruby-2.6.4.tar.bz2=043dd6bba9907ef2b2a3678ac7144ff948830b44c37bf313286fc6ae49ffce40cd5fe1995aa0c10479e62a5a6b4078b6dbb8bbff584584b8e61d81e7c5bf9ebb
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.04/x86_64/ruby-2.6.5.tar.bz2=b93c581cfc4a9ccb6a34245bdd84c8b3972ee5d65b2065432be7fbb0ccbf0171a4a0dadc9ae36cf8304a863974debe45b247ebf02c0556b23d84732e31aed0bf
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.04/x86_64/ruby-2.6.6.tar.bz2=4175f7f931a803393116e95944b777bd151ba61d3ce5911d8f61f8431b068cf64c1b83d6c8472d162bcd89419e21f90333717c58ea67b69184027af799b0f6b3
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.04/x86_64/ruby-2.7.0.tar.bz2=0f3a13cd62540e250daa43d44f97cd9d398ffbaa8fbb2fc23b45b2beed805c3d5b3ee3b3aa51f876314a7bc3445bf2c8660b3993d565b1525b26ae4f87d1cf4e
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.04/x86_64/ruby-2.7.1.tar.bz2=86363c8b0dde874552a0cdd2a73cbc6ea7e9d2461ac434bba67028d6c846d19bbb69efc4a2ea56c003d5f0bcf1da1fb2c5b8655e2c249321a2bbb92391ebee66
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.10/x86_64/ruby-1.9.3-p194.tar.bz2=b8b57644c56d64f1e1872dc55a5697976642d0ace802804784796c3e2c98c679109379f31a1692208fb316951fedf9e622f302643bc0c22fce7d697f3b544f47
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.10/x86_64/ruby-1.9.3-p286.tar.bz2=c0c581beca1df86d60e60b6c1b9b48ac6ff7ed156c0105f883535d2893f1fc97aa5eaca190493c610ef108c995c59f5830b4dfe0609900a9a13e285869b80fc6
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.10/x86_64/ruby-1.9.3-p327.tar.bz2=77e06e768cc56ec53e18798229ca17a3e7657c983ea9b854c08bc64ac66782515b74a08dd67bf826e528eb3d07c0d7bca16a88876996c58af8e0bf3d7fef840d
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.10/x86_64/ruby-1.9.3-p362.tar.bz2=e5ebe07cae1c455fa36a359c1ba16eecda736f7f3f585e5515270ca5ffa1f762079f7b2bfb3d36f93b9e663ce515c2b600e0a59993b0f2c7eab5ad05f405b637
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.10/x86_64/ruby-1.9.3-p374.tar.bz2=a08b0f359bd7a798ba93dacbf7c9b0f7e48a0cbe2f6b52f60916dd4c2cfe22c8bb49d3a690f77c1b2a61e140a4b2cde3890dbf6d24e79b54309862c0412f2949
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.10/x86_64/ruby-1.9.3-p392.tar.bz2=717643cdb0cc82d128c554d62202df6fae1b5cb843e262a0065ede5f4437f2661af0440364ef23fa7af78306248774210be906fde73f6543a405d46a87a119ea
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.10/x86_64/ruby-1.9.3-p429.tar.bz2=e119ab3404a9722ab79f613d1f8ca6eece16a35c8e56bd0a27b3192392be6cdf0674764674b96bd0315d23b89c39ca040cbc00a69a70e7cb22442ac689207daa
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.10/x86_64/ruby-1.9.3-p448.tar.bz2=8fac05050ca90daa53dd3c55595494193ef4309c3ac6dd91ff34ba21c3f3719d803c647b5b47945fd86f89c67cfdda8d435123c3e9f8430c901579f0a190c809
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.10/x86_64/ruby-1.9.3-p484.tar.bz2=8b87769f2f4a7d5f1b45c59bb8f2a5fefacaa4c5eab6ecdb4c1a58e2ce4814e87ab667aed7f1d64b135ce6f3f89dc207be6cc540c9fd9e2fe848b51e363b8722
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.10/x86_64/ruby-1.9.3-p545.tar.bz2=23185492c48096269e92af0928774234b275e179943171254b92ad27d68738370a7f61b44540b6b91fe42ce713d5e10c748d7a304f69fd6af0b5ee3c9f973954
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.10/x86_64/ruby-1.9.3-p547.tar.bz2=3d3dd4c440c32a46845f4dcbdc9e883f3a0ab204cb5e850242e95be1f529a8bce80f04a490df0cd6b03dc7129bc2ede42abe78d5c56725a7ebec475dfce144f5
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.10/x86_64/ruby-1.9.3-p551.tar.bz2=5a6b4e5fd9543547ba99c477b7466ec723c837efa56c9dfd7d5a0613c7464dfdab77f1e2da39974dbaac2a4df4f7162b86a2f956e8dbf40b02ea68fe6498e4be
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.10/x86_64/ruby-2.0.0-p0.tar.bz2=454d2830296c564c0a4564640f256b62d23743c48317e94a30270ccdebf350e3e51f74d846a1239dd09a45e5a8fdfd4ba468a8c6bdb899b1ab234869ba86a1e1
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.10/x86_64/ruby-2.0.0-p195.tar.bz2=8705eb748302b9a67fde63d8e62f89cd0696dd33bb1a31c42b401a7003a4f1fdfbc43461b1e5bf6abf12421c2e6696aaa0a9baec8bcdf27c380727a71329b2d7
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.10/x86_64/ruby-2.0.0-p247.tar.bz2=7bbf30ae8b6413e3f010abcad9446b77e62115e91bdc1a45aefb5aa28e6f1425d0103394a17e3dd6b4cd0a369037332d8972701850a18f2aaeb8be9448509e53
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.10/x86_64/ruby-2.0.0-p353.tar.bz2=46bd11ea6a0ec70ab232e2ce8fb74c6fecffb75aa487f60b784a1f4ba3a0f44143cee2589ac80256f88b2c59f1a99346929cd0a9452862fa4f1cea580b095f5a
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.10/x86_64/ruby-2.0.0-p451.tar.bz2=0c6794386c1daaff4e7b65dd77472e5a127e4920a0c35f4531fcd1f2f75fe935d0e30893c34119bdef4490354677156bc7ae58531494aff8012c658696be90aa
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.10/x86_64/ruby-2.0.0-p481.tar.bz2=f97f4e88d69acf22cbe8bb4253aeedd111e4bd481f2dd6405cc84afb8efe6394c8e4e136a0e02bf0c787c033790bcb292813e0349c4fa986775be2065f4a5245
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.10/x86_64/ruby-2.0.0-p576.tar.bz2=1fe66961e2a30eedc15100077d36a85fc22a40a6a1d268f69ceab05e7bdfb28b4bd45fc4264ce24a9827417f85d7de145e87a7f44c91d9b7858310eb39e25d8b
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.10/x86_64/ruby-2.0.0-p598.tar.bz2=a75e17ac79ab55834d0908e0f70e0ece24f0cbc4cfa187cb0f6244b1c7f609ca58f3c3d1d7a68e1a5dab0877d26449849fe7dbcd55f2091e8645e8bb8b6f50e3
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.10/x86_64/ruby-2.1.0.tar.bz2=b319514aa6ad2b3f60103b08deef4f8c68e909a44824314f390f66719dfc5d5bd4a122772869fcc7beeafa480b81147c9b339919234cbb73843c624093e9b4e8
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.10/x86_64/ruby-2.1.1.tar.bz2=97a71cd013c62679138f5fe5d93cae54e295e1b474afe46dcfa1809b4dba56f7f773eb689ca7b5c49a82dab4b41dc3cab973bbbcbb902d1ce664512593413bab
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.10/x86_64/ruby-2.1.2.tar.bz2=f760412e36216dfd1f975055f1f468df9cb0d36db3e7800bbb704d08c52db489bcb02313bc2c4e4ca73b410297dea350ef6340a824f177983e91f22f74c40acb
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.10/x86_64/ruby-2.1.3.tar.bz2=76979fd7e59ef26e95577806af15bf361f16244bae556baa8837ca4f48845682595c48e2159ae6629c043d74937eda19ac6987853bc8f0e40b3b22f111d8e349
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.10/x86_64/ruby-2.1.5.tar.bz2=fa03e3373fec43620f935aa60fd58251d8cd8b049a7580e8d14c779e2dc530befebc3b8a4e14928e2c0107bc8aad9a0817b4a5d75c2db43dfc3a7857dc655ccd
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/13.04/i386/ruby-1.9.3-p429.tar.bz2=a11f3f33aecc83bfa4bff2553bcd6bc6d8ecb23e8d49be5a6d3fdb77dde9e6ad2e0335a761b226d0915e078ff9789d296c7d6deafc5431e4ca5de0aa142af67f
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/13.04/i386/ruby-1.9.3-p448.tar.bz2=e72efca189137c8dc1eeb0a2ab09e0c305c5e8eaca81e9f755aa70d71ce5730d0a4e3806c96c9bdbe619fb13a0be3fd6c3721f7eb5f956533f0d8db6df001a67
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/13.04/i386/ruby-1.9.3-p484.tar.bz2=0ca2d928e760fe9f44c0c1ffe2ffda62bd443c8f291639dd2c68089686d4c062ae32153e0f38edef765cc68cf2a70ec2a7ecdb9f117c0f3fbf6268782ef4cafa
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/13.04/i386/ruby-1.9.3-p545.tar.bz2=cd6b71239333fa4b42dea290d277dc845b91f213060771afbf7b41a4914a7f5bb052eb8e34869bfa697eb76690975dbcf5ec24d47089192fac904cfec565ce03
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/13.04/i386/ruby-1.9.3-p547.tar.bz2=2ffb1cd6d30cc8df1f673b6368b3721dcf3b08c150a0bc50e7b2c2f9e860451c778b0ee5088e6f62afc741ebe9a0319479e62eed1ecc5f5c2fea2c4b8b1b0a09
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/13.04/i386/ruby-1.9.3-p551.tar.bz2=ea66bde1a7af3589c5f89d8f5b98ee4e4c9a4577c0d811f727e49cfe7d505b4ac9f6b6ef3dbb7f7438f97ebb9f073d9e1b7cc0e067f7f7abbd346ad50f3af29c
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/13.04/i386/ruby-2.0.0-p195.tar.bz2=8a5e9f863c063972ae6753e6adeed95d2e131aabca34b724fde507f1420cf4f052ed24510aa38e1d88a5079e3c34e3f4193a9a5eafd6360de05f82140e827b8f
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/13.04/i386/ruby-2.0.0-p247.tar.bz2=fbcdd746d82c0c52feeef7e520015b3692c436cf4d035469c0a673b48f55cab036903f9afdfe73a9b85d137952b8cd76d0c21d3c13fb51c282533287b2c413b5
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/13.04/i386/ruby-2.0.0-p353.tar.bz2=9733203b40e305e79103b82325652558c40dfcbfab61ebf088b6e5353bd7dd345f058d68cb019d8586fc04a072b285e962655166d1b86f1fd50d006d5af13917
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/13.04/i386/ruby-2.0.0-p451.tar.bz2=60b95d1c022f79bd591fcd857a3bd049a34fb41df0a9dc91300b57aa1c54d7367b7aa0a3a9e9f9ba8194d1791184156b73505170e17f12ea11068d35e2d85a12
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/13.04/i386/ruby-2.0.0-p481.tar.bz2=4d3959ba6b25dfddd900ca12a83d9358fe45f98e73c1330323d1933e4a76b4b108d1ea8965600ba88a0b99de243b6713132620c1017b8b14501ded4201237d59
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/13.04/i386/ruby-2.0.0-p576.tar.bz2=15437d579f26d64c254becc52a9c93d26208f3400396341dc4bae50a6a832fe5836765b8db59ddc69220a7d54585f83f055773915cdc5528e04ce1f65a7603cf
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/13.04/i386/ruby-2.0.0-p598.tar.bz2=f6a67ce770da6da636867a0dae365d2e1e0e203c28d8c01e0d3e44621e80fbea8bf7ab99b6c7a746c106758c794809ec161cceaee064f158493f0ce044edd466
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/13.04/i386/ruby-2.1.0.tar.bz2=ac6679ba6ec0f904169b36456d055fa0c2b7a7b81cb2f9defe2c494b9d5214bad430ada9b10d2d53d38fa2abd6b21e2031604c6952756bf8304a332f64269408
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/13.04/i386/ruby-2.1.1.tar.bz2=97f2da7c3239756c30310515cc219fb0dc06e2ceddfc1f9f22cc63c4944b822bc1e012a9c2daffde7c000b150825c49d35a50fc3051e72c68fa7b6db8fd2c944
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/13.04/i386/ruby-2.1.2.tar.bz2=e5d29e0f74a19cfda22c6af0df364d97e4541f68d90783775f1fa451f6b646cd6e72f4353247d4d58166bf26e9df51484a5e27d692da1c5b858cc08c48a357bc
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/13.04/i386/ruby-2.1.3.tar.bz2=f6f73134a1d8cb41f119c4903d7052b716c877b576493b5546624d20e36c4d2ce9c7adb23461ca72245c8ed2b4b041df347f2a099426682fa26363b4980e45e5
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/13.04/i386/ruby-2.1.5.tar.bz2=54676ae10d84d7ab68e54a54d72b997b58f4c26c0a8df4d163f4af5fa187847dc369308e87a40af94ad9bd1c2d850dd7f1ef6193af2b8d238ae8c6868f05026a
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/13.04/x86_64/ruby-1.9.3-p392.tar.bz2=de6f0d921359ef00be9e3e48843c6684ed05ad869472a2011dbc0592ec79ca820b9e0c56296dbe3a95d6cd7637265fa5ef09b62cc467fd043ed190a0e91be911
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/13.04/x86_64/ruby-1.9.3-p429.tar.bz2=95769da966a6efeda6c1d0f7d49a15b12b8dc609a255b6ad948435aec820081f326c7730fa84737a12bbfc06eda6e70b0f1615782c35b8a841662f9c5536b9c2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/13.04/x86_64/ruby-1.9.3-p448.tar.bz2=25a90df41057ca57ecba14d221cf62934b72e2a01da936ed09b678dc8394780c06e558d3f4af901917728d0e952f67e1905694f2db551b4d7e068e077329c777
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/13.04/x86_64/ruby-1.9.3-p484.tar.bz2=dc38f85007d02b4f1e0928ff181379dc0ad2bb85437432bf6ec84900bb58671f7491e005306edf323fbb2cb96b50096a6a9bafa22b8241156e73852574bf5dff
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/13.04/x86_64/ruby-1.9.3-p545.tar.bz2=b580f53ad8921c3343c5deed2466cbd8fcff2dcad79bbc73ea2e6821d2f82b0590db96be97b2af8a64376586270e188abb78f1255e0de3705f7f46635384cd2e
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/13.04/x86_64/ruby-1.9.3-p547.tar.bz2=6a23906f4f8dbf0d5dd3f1cb75a3e507b6b24c7fa195ab990ae8562ef5baed14c0ebb426bfe9a30ec9240c93142f654d1c7a7222484cc90e9ac46beec7400dec
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/13.04/x86_64/ruby-1.9.3-p551.tar.bz2=406f684011a4c5c0f09cb15036ccf16587f0c301db5812a531a9805142c1d16e5fdda4e76890d4dcc5d66ce193bfc938aa1362031df1636bf70c8266afa9f4cc
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/13.04/x86_64/ruby-2.0.0-p0.tar.bz2=5e5c1a774825d9b3ded77dec7786a622a737edbdf92a2f6f394755659682da717e62a252ff0afc105a2e46f7daa381c29db31c012aee826612de3fe177da1a14
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/13.04/x86_64/ruby-2.0.0-p195.tar.bz2=1119d79fdbb287e9678c87c2767407194c7f56842864639ba25f3eb3f62e17d4e4bc0959bbe180ff8dca16fc0561fed57c1d5cd9c90a63665cc406bf1de022cb
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/13.04/x86_64/ruby-2.0.0-p247.tar.bz2=76da8e68edabc7e68035e8cf38f031d19a80fee8e60a2790d0eb1cc625c6bd28a61228c70749bc539ede37af686b802cebf4437c4c0304133d3afdbf50b223a1
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/13.04/x86_64/ruby-2.0.0-p353.tar.bz2=603d0fef706f2da08216d00db9bc60116a7fa8883851ae180731af0f560887ffaf1520c324b283b98589cd7fff4f7318d6621d88b9383f3ab6daa4c61b4b380d
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/13.04/x86_64/ruby-2.0.0-p451.tar.bz2=33cc1db835f035a49a4e80169b77eedfa2ed05eca0be9217310882898e287f7e490c6c9eb747d2d8169acda4e3124ac726830a827cce989bc605d5c7787ba18c
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/13.04/x86_64/ruby-2.0.0-p481.tar.bz2=c677f565b206a087349e9a7993e67ec7d51537446fff6aa8395896a36e143e8f8337d224bb5509ac2f5ab7e0315e5448cf3f6d3e6ceca56b7a04361197fca373
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/13.04/x86_64/ruby-2.0.0-p576.tar.bz2=16148fa428b283ac9e7896b51b9808b766e449aad4c760a133f3cb48fe5d069606d877b5358dfdeb0b73e0650f08327396571eabaf56847751e9d41e8dd817d6
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/13.04/x86_64/ruby-2.0.0-p598.tar.bz2=1e4ccb5145dd0da35e45935d6d91392894caa42b2e8b1882cfa55f74c703635f3899eaa21630ce1d09cc1be75a3b635090a530179309890783ec2973442ad3f5
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/13.04/x86_64/ruby-2.1.0.tar.bz2=e8f8b17d094392db35eef0fe415d01393f0c98b30a93eb9d11306128aeacdcf2f713de33f1b8e0440dc7333e74530c78f49b43b1631683ef3601ba759aabff94
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/13.04/x86_64/ruby-2.1.1.tar.bz2=d3cde8ebc83b313a6915bc985d3ec4e8b4048b88f773f3af0be7a5c4bf597f9d2c5d18eba8b32bc3405b71d8c6e750a5bbde0df8c08febc5e3188820a5a5250f
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/13.04/x86_64/ruby-2.1.2.tar.bz2=8b390c19822164871f383b227444a407d2fcd42e799fdf67fda14c87dc9793646c7dc4b3903544179eb4d35355cfc101fd58ba02e52d005e9eeaf4c478e5e6c6
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/13.04/x86_64/ruby-2.1.3.tar.bz2=f5403bf4a9ec4321c248b78a37d178693eac383cabb1306b93a6c82070c54cb7afe4494e0c9be6914c57ec1126a182fc40e7011769395b1ba2cf5da1bf9d376c
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/13.04/x86_64/ruby-2.1.5.tar.bz2=e070cafb7e91d5af12ff9850109ca33d92343d5186f2beba9e88f87261c12345c435a540098c391a3a0b2f60386bce7b8790e158ece15e40adc53ac43431af8d
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/13.10/x86_64/ruby-1.9.3-p547.tar.bz2=f4a78a997ba011b115114c351217a440caf1bd136e5bd1f546e6a25791bf73e1b605d6915c991731f94284dbd360d9d9f67616cbfdc8d72cac284642813a8a8d
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/13.10/x86_64/ruby-1.9.3-p551.tar.bz2=9bba6d3d8631e57da6104a54c0d6f88ba3168db9c3124bc44c54e63ec6a2e13aec6844f6b15d89a5a454ba768f47a68946b9c99c6786811a2f319ed7167d981a
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/13.10/x86_64/ruby-2.0.0-p481.tar.bz2=b0144fc6b0a4e2b44a7df5a3159dc06aa0e9643a1458745c3c7f87f9eed34706ece8fcd0246e31d23f582701209ceb82b7c4da498946642cc03c9b7ac6ef2578
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/13.10/x86_64/ruby-2.0.0-p576.tar.bz2=70a52902245f45a5adcadbf6afa7eb7cef31ee1bdaf6822ec3434f3704530cffb2f51ae22e10751f8141f5053257a228e0b13e5e7c1a2469c21782e9038dd2ea
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/13.10/x86_64/ruby-2.0.0-p598.tar.bz2=41d720411d69192bfcffb262139aae1a6ec03855a87c84294cf33b11917ebf4a9c301be7bbde60febb633297441c97104a17717257ee8c51f36822177dd70a8f
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/13.10/x86_64/ruby-2.1.2.tar.bz2=04f47f7249a319d478216b3a125c6dfc44ea82733459cf68adb0c002e2300411fa9e7707db87695cfb1173e6bad1c416b9290b56a4b7c295ef85dd256078e9a2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/13.10/x86_64/ruby-2.1.3.tar.bz2=05492a1bee7678fd434faeb9a6e789e1c4f09abaf7d73873701de841909705932442f56a0ab578357339d2604b1c67caa0033f52547c199e256ac6ed2ba0e63a
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/13.10/x86_64/ruby-2.1.5.tar.bz2=eafb8f31d511f1bf2480ff86ec568164fde3725b4505f8a29cacc7ddbd2a0099bc63e4a3edcf7997b5bfba45008dc8b5a518e0722b3662db8dbf921050ef8f83
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/14.04/x86_64/ruby-1.9.3-p547.tar.bz2=bc5aa6d1008481309211ac003c043a0c2952cea5105c44954a5c3a51e02baad5f99f7f31a657815aeb1fe9212bd710ce632ca397d0a206d36711c02f9649a12b
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/14.04/x86_64/ruby-1.9.3-p551.tar.bz2=e8deb5060ebc85946d3b544efd50cb27c22ba2788b78dcec6d578e3db15388b934cf56a04a0201d6a36a67af011987b81dec3cd152fc2bcc7a89d346d3820f09
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/14.04/x86_64/ruby-2.0.0-p481.tar.bz2=5574a4dc2258580485fb34792a1ff103abaa3c8caceffc9cc4346c15e0e8dc40952df69371967b0cbff7147fef911cf446843b0422dcc75327ce63359d4b0762
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/14.04/x86_64/ruby-2.0.0-p576.tar.bz2=7d7756df55546489d9a0adb378ba5b5a96fc09a100ac2a6eaf9bdec76233929419cca493fb54378b31994576de5d2920a2c6dc7283669d976568a8580149837e
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/14.04/x86_64/ruby-2.0.0-p598.tar.bz2=dd40bb74fa1f2049c1f48080f0039d6c330b5c1bc0f0b8f8ad5e5d0d02fea93142d265a20bc35d35c409badea2719d6ad87eb82812e14bbcd131a9c60dbe5b74
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/14.04/x86_64/ruby-2.1.0.tar.bz2=c01621912baef4b506f51680a695c0e62c1eb872dc6d6c812ae1c954c3324f09a0fc4959cd48e3aa5c3e2f6be616d2e9f1377a8c3b65faa867ff40963afefbd9
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/14.04/x86_64/ruby-2.1.1.tar.bz2=e1a78226560f6a74aecfbfbe313a7c896949e9abb593291022f825698497add9ef2e2638063b9ae35da61b7be3ee3b19d24d8e00f4720e2597b69cfc892a5db0
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/14.04/x86_64/ruby-2.1.2.tar.bz2=b812765dd5fb38fc9896cab403a4db3ca2395e4e5451b18c7702a599c2a5a9bc42260e7c60a85cda14752646149397ca31698caff0c66ce883e67b8607f02380
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/14.04/x86_64/ruby-2.1.3.tar.bz2=e9469906cd1be856bd15f12280ffb3367c111dc76e95af592875bd82a5fd3e8d96a7a3108658d8181fceb13994835cbf9ebc8b7867d83c9a9c051832f97f7b0e
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/14.04/x86_64/ruby-2.1.4.tar.bz2=89b275b447ed17e537bc445e6f5d40a42a30448947e126b05a3572cae9089f49fe49d183739e25f1849a8a4b8213a985b774e49b108d093d1372b58d04d6b668
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/14.04/x86_64/ruby-2.1.5.tar.bz2=91216074cb5f66ef5e33d47e5d3410148cc672dc73cc0d9edff92e00d20c9973bec7ab21a3462ff4e9ff9b23eff952e83b51b96a3b11cb5c23be587046eb0c57
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/14.04/x86_64/ruby-2.1.6.tar.bz2=aa77949340fe77a51842244a4a5ef76890010844765bb2c3b5055cb42a97b6b963161fd0ba56ed831c78b3e28aa00ba21ae3f2301ecf98376ec9740152acc97e
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/14.04/x86_64/ruby-2.1.7.tar.bz2=7e32988985d72d90c286e1485f0f374f84637ff1257e42b8edad0c2411275235dffec2dbfde0e0966bbbb7316870e4569fcc347936ffd9956a6e93953a32df2a
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/14.04/x86_64/ruby-2.1.8.tar.bz2=32683629f0e0a7c42516f1dddf96ee4629d6680fb0cf3882ab733870816cb2271ada1673d4f9bc4815e19a0954e6d16fbe4928f23bf43ef1bba456982a072948
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/14.04/x86_64/ruby-2.1.9.tar.bz2=23f3f7717a6a45bb10d630aa54b8f4a30a22c75aa425121a624bfff853985a848dca7197d1b374201486a3b6c660e43d2d1180f32d436fd7778ef0fef867e8a7
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/14.04/x86_64/ruby-2.1.10.tar.bz2=395e305d28a396a8f925f5939bebecc9210c287e7734871d2c5c8de91455a2aa35b5f6af6348ced49e15331b8278359d9e5f3c05914cfafff8d9ea1ae47a35e2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/14.04/x86_64/ruby-2.2.0.tar.bz2=dc1c52ee9530308b450c3b8e29777fc7c761cf9ee8af6d9639fcfcfd85bd15db43e068da24786d1dee242c3adf170207cab5867a37d7c350dc99ced4e1346b22
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/14.04/x86_64/ruby-2.2.1.tar.bz2=cf685c425623e742a2ede15fb30ff96239620689e272d9d343b022d3718ad72d22cf8d9a5bf98ef7813db2aac63520494adf225c16d6d6cdb0cbf79fe823738b
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/14.04/x86_64/ruby-2.2.2.tar.bz2=13cfde1ece46ab9e4eef659d86775fe638acd619af54340f0ea87b38c421c1504f2d496975fcad161f86fd92089739e02499cdf4c588903521619587fede1aca
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/14.04/x86_64/ruby-2.2.3.tar.bz2=a4f3e98a692c26c0465de4751980b4b2c62e05fb45f576c9c61182ec95920b57da9a37e66b7f3372ddb43c4f0c479a3e1825d4f736fad3aba9f3e425f239f018
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/14.04/x86_64/ruby-2.2.4.tar.bz2=afa9e2a64312c00b844389bf07df36c190698bec0cba220ec2d2d76645f0f4e1ef918f883f13d8934ba1317032eb5de67f860e032084444275a2f9ed590cf9af
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/14.04/x86_64/ruby-2.2.5.tar.bz2=98c6011240ed91974fb1c2034765349edfbe78368320e8a1389cd61d213b27030016a9b61d0382531712972ed1c0902bc0c257bf3f03be98059823389a6a85d6
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/14.04/x86_64/ruby-2.2.6.tar.bz2=d18c7573368557d1efac9bbbc903ace65f687592e5c4b8e0a714f8ed1a38ab858ebce5b0c654a2f93df5220ad158b84db2ea9b51145ccea3fb99e01be74823fa
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/14.04/x86_64/ruby-2.2.7.tar.bz2=09f86bd32a0f389f82d730f5982f3f5187e15ebd0a2e24d0d13dd81db731780b9628d6d627d9dd844e670a8f6c3e257d905bda8e88d1be12080112b616cb01fd
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/14.04/x86_64/ruby-2.2.8.tar.bz2=9d102e335df58140dfbeb7c36f0a501aab21a278f66abb9dba8f04a9f10986fe683024a0b6c1297a7bd78bdf3bb989295bbc5fee912ddfdedc6b399a512dd4e7
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/14.04/x86_64/ruby-2.2.9.tar.bz2=579b2675fef10af3b716920c5a244c90b6c11ee02b7a6ec6c9629c55ceae701c31d64463fd5c2cb19246026b99117c2850f44b7cb92f92fe62b1401ef1f45ba8
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/14.04/x86_64/ruby-2.2.10.tar.bz2=0d84fce115d8b0ba01c6efb6a3be437c3d4488f97c677c1f10d86dcbb6a483005e691e5979b7efb4a81a32ceadb45abc50d3b24b31d4af1b05adac84e5c31e6a
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/14.04/x86_64/ruby-2.3.0.tar.bz2=4e3db4375906eecb03b4b67e890cc8e9e03a6e03f4eaffd0a83cf768259e57ed3c1b47cd9e70522b24ffb33c9f1462c807aa39f0b22c2c3f223fb58e383c33d6
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/14.04/x86_64/ruby-2.3.1.tar.bz2=df364b5a203e87a8865e30559df2146c14ebf3b7d25398a3ef0afbabcbbb31f256adbfa93cf254ab1b28107f20c1a2ce4d306f16326fd830d9f6a4081b4d4bbb
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/14.04/x86_64/ruby-2.3.2.tar.bz2=8c3ea77729c80d2748950c121db5e7c0480b36a7cf7c3b7a6e35f06baef53bf8a2bd636b82279c1b663d3a4fb8bc97e66a0d8d8021e89d41ae92275b4319e012
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/14.04/x86_64/ruby-2.3.3.tar.bz2=c107b3c8b3a66d9e7567f164aab5802a1ae5df1596d2dc24e3757f169a5cf891c129de3d067e1d29f70dd42f14fe1062b2b389808de602bd18f70f5d86f343d7
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/14.04/x86_64/ruby-2.3.4.tar.bz2=46661572fa38669c3f53272ed6082593e61baf48304280c2b91bd229293b6025c83bb0317677a681303c8e599acfab98a89064be2cb8aee3e2fb374d1f88a24b
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/14.04/x86_64/ruby-2.3.5.tar.bz2=cfcaf85acc96523e49455758510e0068800a5b819e74c26560960700e4ccdcf36c6e1b02e52366021f033eebd595427a9143c5a40c6fc8d20ea46a9e661b5afb
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/14.04/x86_64/ruby-2.3.6.tar.bz2=bc98a5a6e5842772034180bdd2c9d4afcb4062e626ba73035ab1df5158507b610f4d8a2a29d3a0588356f210624f678d025356e39efc1bde248f84028653a475
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/14.04/x86_64/ruby-2.3.7.tar.bz2=35adeed89fe33a8ab999d268622d5da431f0157570893f158abbed0f2384576243ab3faeeb0b4415168338a85d15c55ca69449b1c381d16efe59dcb3da624002
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/14.04/x86_64/ruby-2.3.8.tar.bz2=8010efdcbe8f3fcce9960ac7c8e748c7c1d4640b274300a684674899076751665f9724a185bf86b757359f13b9975db6bab14566091ea776b71acd6a2c30d7ec
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/14.04/x86_64/ruby-2.4.0.tar.bz2=66d7a19418a51585fc86ec032a6e9245d61669c013a8237b9025811e20b552871d3f585515da44e5c52d710254d3c2deafccb3e58c235c4792ac54f81a3862e7
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/14.04/x86_64/ruby-2.4.1.tar.bz2=7643447ed8d394e36f5756b7d7bfd054a102c7aefebb4bb001c2f7e585991ef0dfc77f6e83b86ba37e0c4efbb4700b6724f9ed56af19c77205988e1ada3c8ed9
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/14.04/x86_64/ruby-2.4.2.tar.bz2=82276c237dc3993d2da6ab08da636db43c9db5e4e23c28fdd47577e7c9087cfa88df1da3807a8e70c3eb8aff01a201ade41fea16a25fff61036b3a3d640b6ca6
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/14.04/x86_64/ruby-2.4.3.tar.bz2=ee23a8a3891fa3ad5de08b94850c6cfefc1ac5dcb10180dc9698f7de6c38f79cbde2c5ed894e36b4aca791850a25a712ccdbbe54b04d6da53bd8cc6f0934f9b4
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/14.04/x86_64/ruby-2.4.4.tar.bz2=a7450bb7b6db279d4ab13e4fe72e605c489ab3371a201d255fab6715a642d6d87e2103004592f23d695fa90942f651c3596aa1a6a0d77a7883ae884f9185524a
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/14.04/x86_64/ruby-2.4.5.tar.bz2=f28dcc7791c5abac9da90ff151f8af1cdb90fecce577c85738bd659ed0d5e02300fa1684871e21474c3aa6c060e245e5eee927f3ca66f2339ff80d263e7f4c69
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/14.04/x86_64/ruby-2.4.6.tar.bz2=d2a656f8ded181030221db631c81dc172eb4467b0c4dbaa8d7fd2159cea50c905af2ecc06ac7bf0e60148368639888c2311ba15feb6eaaeada71889e136ca701
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/14.04/x86_64/ruby-2.4.7.tar.bz2=6377bfc650eb93364c6cc3ef289b7e20f4c950611fcb1c6684543341ae68dcacff05ab97a1c16204e391893a3a473ba45a9fa069091077b441050d4630ab6395
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/14.04/x86_64/ruby-2.4.8.tar.bz2=75a38c62495be1cba3e97491cec07651b5067ae5083072a64c80946dfef9eb7acdd6fecf450f0ad84e000d085844ae8601d5a87c38e3169ed89eebeaf5ee5232
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/14.04/x86_64/ruby-2.4.9.tar.bz2=46287634441560e05311a6e127012872f0855019af02a3a96c33b3b80ba913070e45fe83b7f45851f048bc1a21831dbc93252c5bb97de427251868d7de415711
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/14.04/x86_64/ruby-2.4.10.tar.bz2=308a2d241211c2632eaf57c24accb1bf6ef292c732e7eb274ff56e176f5e8a326a8429aa2ef4e501ba5dca8412610f31f00efd90445f57dbf279fdb7fcd78c7a
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/14.04/x86_64/ruby-2.5.0.tar.bz2=398fd09ab52357bf5b927b158011b3ffe50b25244af6278a6d3f345c7007b7f84b6ce9f19b1bdf0a8ba7d0d1c0b84c2bb6c27ffea375875c242c108fe863c163
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/14.04/x86_64/ruby-2.5.1.tar.bz2=fa39af7f0012c3f5c534d5b2c612af22010b9004a4e10dd60a27bff9046351af427a6e8d49d8ffa003661ec875de9e2974c1eeeeae9f66d8eda74c03035308ae
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/14.04/x86_64/ruby-2.5.2.tar.bz2=3c246c39b8f1c4215ff1a8131a319500e7cc943dadd849ff50b14e5ab1f2214932dce2085e4112e36d522fe3d849b67816fdf993f4cf00b3c5cdb65c28f3cdbb
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/14.04/x86_64/ruby-2.5.3.tar.bz2=82dde569a2a53445dbbd5540b436de6cfa942b3b4f73fcd62ad480eafb3cfa2a89557a16f766fe3c030416e7a822e8bb0a487aeec2ae0b156de83790ef808b15
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/14.04/x86_64/ruby-2.5.4.tar.bz2=5a7d9673cf6512bd9856ceeefa325d9caa1f417f2fa2962ab45766f047c995d85c6dfea31c567a04f33cade3958a754e192b02e77bfd86fa004b245986b54431
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/14.04/x86_64/ruby-2.5.5.tar.bz2=012fe70a51e7464ed425197c16056a4785db889a9bad1ee9c8cf58487c37c4931dc9c697f2e0d79e36c01848e08c3680f4733c4b22c472264bd1554a92f36067
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/14.04/x86_64/ruby-2.5.6.tar.bz2=1217eb7ef34aed306d30227c972d89a0fce12bc384eaa595d0588a386f7234938b27a140d08936e630a7b29b6c270b793019b6498db5299b5442f0dec8b7674e
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/14.04/x86_64/ruby-2.5.7.tar.bz2=ec68ccbbc1115e0b28345d35ccce8906dec9b080fc38f7c4b3ffb965934e9b9a44053f42510fb62c265955bd2e6f97487265af9c3b2c2df1f8d6b71927e4c0cf
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/14.04/x86_64/ruby-2.5.8.tar.bz2=f37da2cc3ec6ecf231d399cb47ca6214b906ad3dd378a002ae6c6a2f05e76ac0b53307e3422ecf2847e925a90529f1b8ccfa6971221bb0414e12f3c40bdb06d6
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/14.04/x86_64/ruby-2.6.0.tar.bz2=418d71c7d0f89ca839e821f09e3a09d12bf9151d15cbd71c25547bd8781eec91ae50db6d1a778f82ee3c652fc24f7e147243e6fe68211b400e267933e2ca8ee6
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/14.04/x86_64/ruby-2.6.1.tar.bz2=2a638e167fb001693b8162aa17d6ec4419723f2735cbcd1b13b415283e6e8b3db5308e557d7f68d775a5e0b1db0e5d27ae84039bae76e7585ca92d2663b4ddd5
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/14.04/x86_64/ruby-2.6.2.tar.bz2=55473059823dee21b83ddd9a710dd2b5029d53139f7d623519eb339d21e39d342d4a3464f3dafe9989cb5ff3e70fe9edb9b0c4fd6c6aa7b104cc0ce5c9359786
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/14.04/x86_64/ruby-2.6.3.tar.bz2=598b667cc912cb5efdbbf8f684f9400bb099c86b19c5bcb96e0d15aabf1867243ca8b738f43eb6bf8188d031dd72f97a01632974213b75204126bcb0d25544f4
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/14.04/x86_64/ruby-2.6.4.tar.bz2=105eee594b711b29919dc2fdae39deb8dc282d3c80deec6975ad440794153a8105138b761f37ed875f6194a740057f0612ba95841233c6bfa09ba2c1b7cb4b09
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/14.04/x86_64/ruby-2.6.5.tar.bz2=aadf21040ae35be641d50f166e441e1369221d748773f8e067b99642cedddfef0b159ccf8f1554e6a88b2fdc3bf3e979273d5c645152ee22e79447e2eb9f3792
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/14.04/x86_64/ruby-2.6.6.tar.bz2=1d7e7d7f39eb7c71ba891c908973e1d439207165f21ca3152d66c54f7f34b5fe2d532fcaf084398771dbc79406bf68183725ef96c4ea3fd82b769b74e9ddeaff
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/14.04/x86_64/ruby-2.7.0.tar.bz2=03fa403e800492f99f0901716285bcf26020bfc9575dfce64c4967610fab0bf14614a9f0e2d0fc89a75fb5fcdeeca4ea971db32423594e798365c03b93413ea9
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/14.04/x86_64/ruby-2.7.1.tar.bz2=eddef51dd73c93deb0846000862253d1ebd46c3f87ef80844e1b983bb52eadacf58bc30fb3f21783440d03a71e7b4cea4452ca41d2413fda1fb0a671584ca41d
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/14.04/x86_64/ruby-2.7.2.tar.bz2=a5bbbbe91899388f48d7b19bb4f7bb1866d5f0ca1c73712c9e4cc4471908a072b206e25746c5f5b38ff6c9c49810a480ee87f588d1095b0414852f4559666e14
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/14.04/x86_64/ruby-3.0.0-preview1.tar.bz2=1bf6286090a4e8f87815dea2d07e108f85d70a61b76535d6f8782ffeaae57161e19aa76c9cc9696e2e9a2f2c67395f3fcd1db2ae5dfbfea147cefdfeea9c3309
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/14.10/x86_64/ruby-1.9.3-p551.tar.bz2=26532a0b2c191debd920825d4b271a6bddb0e9405c83cef116f30c0823af22e87c51a30d3067f42d21ca7b98dfdb258e4a143783c029d773d404bbdb4d484885
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/14.10/x86_64/ruby-2.0.0-p598.tar.bz2=e79e1366bf913fdc11818383abe5cd5fd539813345d89db7fd0d93b550e0e53b3a4c954334d2b1a0062aa6de5629f278da377a2484eb650cc3cd9d0ef5720671
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/14.10/x86_64/ruby-2.1.5.tar.bz2=30af7196c27c2bfa64bd4e74db7f5b2edd780a3c16a7e899b901190d9d50584bbe18055b6f3c76ef94552b95dbaac181d89041202e74ae0db12aa7916b18f994
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/14.10/x86_64/ruby-2.2.0.tar.bz2=7abf544280301d3fa1ce28b37a299de9c156c7d930cbe74f9959b7f14eecef40333afe06430b470e2108f4da438acb00e957322bab0d0d4abd157f2614276de9
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/14.10/x86_64/ruby-2.2.1.tar.bz2=e271acd4682ac90f2854e00be01376523bd764b0ecd10e13aa95f3f2745d954a7ff5ca6484c1184e9b9353dd11a815b1676b4c53fa2f6a6c05854331c9aeb6c5
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/16.04/x86_64/ruby-2.0.0-p648.tar.bz2=e47ef33f5e1f5f8b72bdf89f4b19a9d5212afad0a07feee1699b8a84a3c75ff2840502ecddd8ddf9d38fc40fdd4a8ae7e83fedae526a6bede5c62f6fefa5564d
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/16.04/x86_64/ruby-2.1.0.tar.bz2=9aa4a9c52e27db48432becbecc41160ffbae4fe96f9d87c74ace9fadc48ad4a33466133e34b3c2bb4510d24e324d3018bbffe5f3b1b080d4ac78b43e4c0a083d
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/16.04/x86_64/ruby-2.1.1.tar.bz2=96fc55b3b7a89281bc8c26d567966a31d36712f26ac2f34b76c39b3dcfb2b390ec27b843e40f230e9a5fe3cf7a2f3c6933036090e3719ae48f532b69b1b47af3
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/16.04/x86_64/ruby-2.1.2.tar.bz2=35f8beddb176502cfa26a7007c6a20b23154e5757a765925abcadc57f7e7e864a7a6e6b315664083854a2768f3bd4934f169d53eb3d24d95f56506e48fcf2b86
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/16.04/x86_64/ruby-2.1.3.tar.bz2=7b35a184abbbf5b142019e02cf23b24e0cb1e601ed8713d66c89e654a5fe31020384779c879de8a419daab6a47f8c5e75af21be0c21b46afd4d3eb38f3f5d0af
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/16.04/x86_64/ruby-2.1.4.tar.bz2=bf22497a43a1f76d2a44a93dec8bedbc03c806ad1041cf167203fb2c74aa60c599ad44fe5cecbb0dab8281a96e6c07728cdfe73e02ec0d78461026156944c632
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/16.04/x86_64/ruby-2.1.5.tar.bz2=e0fc5d6e0bebcda5dbfb8c0825db9617bba4d6c1ddedfce6bf6aba07f8642490c1417e42b97738830dc0e1c772d272c97e93250b07e6f5b6464e141f57b76f84
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/16.04/x86_64/ruby-2.1.6.tar.bz2=d12cdb74c5ec72bc0492d472605c86958b39b21c784c9965c3d9f53621464a6cefa60cc4314bbf39c7648626105c25d0f7f4525e7cf881c30c1bbb1904e3fa08
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/16.04/x86_64/ruby-2.1.7.tar.bz2=9fab7cad89b6d8d460a427efb1ff110e9ceb6d112dcf054ecd13cf9dd029b4bdd08fe5efab8b93a4c5dfbf552239d66d9ae3b51edea1f4020f334acd943620b4
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/16.04/x86_64/ruby-2.1.8.tar.bz2=144246fa14ae76be71091c51ccc7a0d7587fb1a9649b8dbb2e65ceccec5a974de789e425503993bd19dcb74a52a2a97dc0c3d5a7e1e050efe75d9090495ba850
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/16.04/x86_64/ruby-2.1.9.tar.bz2=79b0e18cd775a69996c05bf35856ed2610de54865981c5a2c111f0b7eb9ffc29b6bc9faa5b5435e56f90a918bfea2553a0e62f818d708a8fb55a438a3237a766
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/16.04/x86_64/ruby-2.1.10.tar.bz2=987998a862fcbc25644fcd580d6fc11220fbe20156ea39b76e8c91290b8f50f2c90c54e7425f307b8d93673aca272d3576ddf29016b98b21f744ec5f58415af8
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/16.04/x86_64/ruby-2.2.0.tar.bz2=eb8802d457ebe834360894cbb297175e7199288594772fc6c7550648983c2641e377c02fd5d5f176aabfa1c5b820b8004b32cb729ff04fb278ac15a08253bfda
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/16.04/x86_64/ruby-2.2.1.tar.bz2=3c5f7a59a92fcd0487bac80b0c4d8c35ef584b94012c62820932256340659a27657da6f44fda8c899b38349db93ce8c36b698dbf166f1f4f1fb8d437a4e4e693
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/16.04/x86_64/ruby-2.2.2.tar.bz2=d725c0ab7e8715c83a07106fbc11ef0b104501c182033935f4d2aca5d6ccd06ad36bcc4f44fcf2cb88cf43e8086474becbcc1065d95e8ff607111f14f67e5dc2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/16.04/x86_64/ruby-2.2.3.tar.bz2=ff325a26ad8ce53bc61ff84691ca2541d171e182cd6c0ff18b54422c2d65c114995390ea693ca828b0d07663b81d4bfdd99a5a5e6dc55a074484aa07a5196ee0
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/16.04/x86_64/ruby-2.2.4.tar.bz2=e63a46f35fe30dcac4736ce18fa42cbdd012c9f701bfcede4099adbb4632ea4c5dc585683a28fea58ffee109d512a027b0793a33ee84c54570308252449f9a6c
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/16.04/x86_64/ruby-2.2.5.tar.bz2=a665acffc149959b4c766059611b8bfc55f3153efcc29c58893646b31312fde894fabff3343e0e121689fdc52ce633175526e3a54f0bd6f2cef7407ba36026a7
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/16.04/x86_64/ruby-2.2.6.tar.bz2=364377d5f7f4c2187e1f5d823deacfd8afceefee8cce2effe4d127da8b0f165663c2b8c0a15250969d739c58286625e761b9a0127fa29b427c1cae9deb3acbaf
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/16.04/x86_64/ruby-2.2.7.tar.bz2=711e2358dd0d2c171e10c580f6789739af44735b76857b9c97af1cb1e2e149e563042a81efb8e3eb5de6be1f5d698d89767811cea94a6cdbc6b9a08f74fd8fb4
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/16.04/x86_64/ruby-2.2.8.tar.bz2=2cb3916644485fee5ba08337cde89b3c2aa9bd4aba11b3c45d197df1988827109cf3a7fc31cf98d51ede1d2c2ac3aa81011f86def4fde26db108f74d4b8407b3
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/16.04/x86_64/ruby-2.2.9.tar.bz2=71460b8823fb8c2eec9a9cb6c52ee78b579553d19a21ea87b4e778fa9105977bc15bc165e4ede1be41448501dfabd3413871cc297faa5e7df3ddbd809f18a027
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/16.04/x86_64/ruby-2.2.10.tar.bz2=985c945e37a6186b81ce7dee3ba3b0ac6d2b64af33ef8ce3fea10f3ff4fa4ad4eb5e926d7e0979caa4e0ae88beb63f3a0cd27d6301dffaf6b1bf664202bda0a1
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/16.04/x86_64/ruby-2.3.0.tar.bz2=866dca3ef7ffa1123d9866aa5aa9fbbd4cda847b91690183b3c8f49f017b4907286a7d114aeb4060ec6c9339c6804f1f22d4744c18c2786df752f2103731d266
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/16.04/x86_64/ruby-2.3.1.tar.bz2=ccd3c02c84a03ffe889407828556a958fb8dadf8532c70ae6ebf82578906eb8906dd86a4dba790b067a9004c612fc0928f1270b889ca52d19e54ee9482b519c4
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/16.04/x86_64/ruby-2.3.2.tar.bz2=d93e8996557d78f0b424f300d4d7aaeb78f467e07cb0ffdf819bfed4d70934ea19fa3f9098f57f1e79775fc8b8be911db9b7fa531a2930735f9c5dc0a9faf42e
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/16.04/x86_64/ruby-2.3.3.tar.bz2=309724b89ab01a9690804ab572b9fc5e14a7d7e3f55a66cd6822375f353a5405aaa809fd3434073078d032a04f837201cc915db255e8b1bd8a8f37436b83f4fc
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/16.04/x86_64/ruby-2.3.4.tar.bz2=a1674c9ed6d939d86e0e8a41d91d188b7244f10b56359929736d5c9cecc55dd457ec5d234978060b0ddd77b089db86b517f25e977e2cd72d9cfee186d40ed16c
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/16.04/x86_64/ruby-2.3.5.tar.bz2=b672ed3106b7268f0371446d3e8c6bd73a6f1792c67bd586f446f6a399dfd7a5191ea9475751844db1d1b9eb1e349e3e0949d2e3ec5f11afcd460477f953361c
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/16.04/x86_64/ruby-2.3.6.tar.bz2=ebcddf2eb2b553f4287e5d339aa59de107f1a0d9db3c25369efd2673d94c2f24cf214ebb96daf0844cad265cbbd783e4fbc9cddc287e363df2808b0c70d0e4ea
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/16.04/x86_64/ruby-2.3.7.tar.bz2=ededc5c15515ada55a6a3304016e50dedc616e5d264e36572193d714704a2c78d9e2d26a2c6fc31313dee3a65ecc62e729f21ed34e0c11676fa99f06011c67f9
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/16.04/x86_64/ruby-2.3.8.tar.bz2=05e27b056f81630c1f58f01ba025600237a99aff4da275e304414856c292f97ae1798dfef00f0ac29e43578edd7383d066eb9bf16fec13e206219a1f9004ce11
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/16.04/x86_64/ruby-2.4.0.tar.bz2=8e44a183164b9067223c3c4cc8e98a4b7ca7b58d7a762043a0d82932174dd4087a34f1cd1893e8fe632cb0bb333785a3412d2c65275cdd7b1fd8aa57467182e3
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/16.04/x86_64/ruby-2.4.1.tar.bz2=2aa07623e101816d0e09a20dee617aaa48c507aa60bd64a3d202e5f217f2ce4a7ebccd6d9bb03d005617a78f4f32ef50f5c41f0683dc6d2fbd097e6910f92f94
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/16.04/x86_64/ruby-2.4.2.tar.bz2=9cf6fc78ea5264fa69b3facf66862a510b840e499a43ebfbf834b7a4888bbc1977685f231316c6093a347206eba2107c5e7c95803476414fa04b9d9cec76aeb4
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/16.04/x86_64/ruby-2.4.3.tar.bz2=3f0908483e1f170d20350dd56eedea2a5dcbf778e53be0704f087aea4c8191eba49224026452044a3fc22bc5499a228716a78a4c69051fab95ea24177d3118c2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/16.04/x86_64/ruby-2.4.4.tar.bz2=a6535b5430f1279ec89eafcf93a69f728b091ffafbe84a6e4f425615c63bf20f1742727d37afbd64bd75f7be4918f0f199bc37c44cced718a732f997b64c8796
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/16.04/x86_64/ruby-2.4.5.tar.bz2=8e97c7f0cdbbb82afd35905c7e3d1f86a82b8153868b3164e0bb0fe1aaa8684fa2c5d6adba4f263a15c1d16e06f7ef74f98a6a01c670215ecef11d30811f79ea
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/16.04/x86_64/ruby-2.4.6.tar.bz2=a7de0d145d2f14447a69afc24574d1461d70e0e97bedea9d6a0967d76b0cfaa8cb2355208fce45af55841b606ea94e0b2c19491807e84e8025502f0c03cf410f
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/16.04/x86_64/ruby-2.4.7.tar.bz2=bd5793063b85bd39eb9f46f0bc4062a9a9f3d294514822fd0329f61bd424d55800de0d0c8feb372cfca52421e2e2e4c3a64adf735ecd8fcb7c74298eedf2cfd0
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/16.04/x86_64/ruby-2.4.8.tar.bz2=dde0a75b4bc9d02fc9f580c32483d2c426d7a5593833b8417d19710ea3548f48fd152be912f73e58360cf9665585efb66fbe1d6f6ea63153732b62987fc13bbc
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/16.04/x86_64/ruby-2.4.9.tar.bz2=8b03462db9909ae91670ce8c4c8a392e309cf11e5ca3488b2927df435b2215955bd05752f361d8089e1b8e03a9eed86f7b475ce7cfd232847db5f095dd6848ae
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/16.04/x86_64/ruby-2.4.10.tar.bz2=954151b863411ad2dde262b8fcaa44099cf21c3ac3161be33149a94f33bf41dddfaa261e9c418d499a120598092c8278271884beba8325ef825cf0d112542c70
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/16.04/x86_64/ruby-2.5.0.tar.bz2=dc410c051fb4a8a52b533ff674d99b8ebd161dc151b31833a510ee0fe2271438f36fd1c5e58d9c83fd78efc942fa38daf899e3526b1eb7b840de7e3a7c167100
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/16.04/x86_64/ruby-2.5.1.tar.bz2=ff230469beb7d01d32f0680479b0c78a755b4339ff86163ce5e202ac5dc81868372d7fc4e2f0650cebc01494678b8400e6813c09a17d7ccfddcfd2cc8899d99e
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/16.04/x86_64/ruby-2.5.2.tar.bz2=435e131b912802666a606ec45d5e89668cec4c0d7796457fd6ed091aeacef5ba1afe7c204b692d144f680ca5b2859b2257eb1036869cafaa158ad4b75b26fbcd
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/16.04/x86_64/ruby-2.5.3.tar.bz2=2dd5aa1761ad23c0da7d1b5af7a9dd6567facaace2a11d4f8281a3c7939d679d0efada3345f7f7bb4bcd817ee71a7b4c9363643a8568d5e6e337dfd494f8e072
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/16.04/x86_64/ruby-2.5.4.tar.bz2=932f8ef957c7272a7a699d1de68939154a8e5b58e07ddc02647c9006b1ef2248d7cbd7f2f07c967750ead3d344f6a381b9e573669dd6b704ca520e74ce09be6d
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/16.04/x86_64/ruby-2.5.5.tar.bz2=42092b69108253e5c80a6ce924ba4efce0e5d9df134ae6cc5449e2483f856c90e58832f31314f7c548a0babc7139e1a66b6a068b7475ff9796f321428a62d9b1
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/16.04/x86_64/ruby-2.5.6.tar.bz2=42ab6fdb6c88db88337a06f159d2ea8f4ffbf3f501450ef624f312ca582ce3bdf754cda42bf89393c5201ddc20efb3c7889fa1692b101516845c83187ece1a86
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/16.04/x86_64/ruby-2.5.7.tar.bz2=e96351acede27ce290b3ebd5f69bfe836d53932da0988841868a6de88eff6ac10f42f4e2a11e2e4592ed76b1c57f436ce199f825483eba7dabc3e934db5bc11a
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/16.04/x86_64/ruby-2.5.8.tar.bz2=f36cdafa048d965b41ed5f0124494e55be507778aabf8dd24143230bae80f18b0897a91da7d1f96b49b32b9c3310fc379102aa971dafbae302d056544b4d85fb
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/16.04/x86_64/ruby-2.6.0.tar.bz2=c642b0aadd2c324d63bebc66a5d25d0892d23fdc3258256f482a583f82205c5933872b9b5ff88535457a89f86cea1329ecb7e266026f171c18fae8dcc7785c6c
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/16.04/x86_64/ruby-2.6.1.tar.bz2=73b7509703b7466a53b9186550281cf909dc2d803509961c959d9e649eb830dbae1fbdb383850acab12bef6c0fcb536700956dbfa5edb856d06ad1613644cf1e
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/16.04/x86_64/ruby-2.6.2.tar.bz2=a2de3f85903c0b39beda2c58a82d0973c0967c99ff0c7f31dd0a55b3177ecfd8d77b53694a863fe351a9f4721623ccd00a14dcd2c01e6dffa25829b57533cb06
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/16.04/x86_64/ruby-2.6.3.tar.bz2=1d298f7a59ec4d7994a28af9601eb838c71d738646176cd8b8d423f8aa03e356377b0349401a768122961e26bb358c1eef90e24ca2a440756dc04c6b8b84eb74
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/16.04/x86_64/ruby-2.6.4.tar.bz2=6c8508d7ffc547ee3eddff562c80bdd6dbd6349a5d6b036a91eafa3c3a28a8a7a6d3120d756c2d199ef9c6299620bc0ddeafa5d65caeabb68af32d329e415c28
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/16.04/x86_64/ruby-2.6.5.tar.bz2=05120b1f5fe11d0ed67935050a6ccbc81b23635caeb9b742e55900ccf1eacdaecdc686f5ce9dd9a614268b69ab7d9eb2176984225b30f141e0ee9765efaf5aab
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/16.04/x86_64/ruby-2.6.6.tar.bz2=a7de0764c9a8a6a6b00eff5983f6ccc24441512a0ef782820ec7fd260932984a7eb9ef338e2c2bfd053606ae09845a44c55d7ec98b3b844d080d3f8a271045a6
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/16.04/x86_64/ruby-2.7.0.tar.bz2=6f2899f866573fd78b0875c00bf9bdf296126a9d8f55a5e42d7028744b69e86f83b713112dd5f548b7b091674dfb907c3728a89c3b981a198c60f7f38723ab6f
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/16.04/x86_64/ruby-2.7.1.tar.bz2=ad63f201bc06025419dcd4341597b22c5f9afb0031cb09c2530371bbba7a54b6528c802ca7b764fc97d439c0bc798ec1fc43d3cf7bab4fa9db9ec9c2509d21be
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/16.04/x86_64/ruby-2.7.2.tar.bz2=81889577a41b982b3d59b4da5f9137453927e1d4776e1c394f7e67c4fbf24fbaaf3444ac623751ea576d6c127d9226bd23e86ea6c09d4c1a76677fd753343ba1
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/16.04/x86_64/ruby-3.0.0-preview1.tar.bz2=76a2dcb3dc48c0fee3f235a2f552af83478b4669346b09241143205d48c0377ca566cee9106e4c5721f38c0fe8b6c4b41b489165e9653326c9d8a89f74334138
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/16.10/x86_64/ruby-1.9.3-p551.tar.bz2=6609231a7dfc6cb3bc4f7b3d9da19856725149bf83b3526ea389722884fba76d2eefc0bab56eda126acc1cad624b1e159975daaa71a9a3a602e99b239385174d
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/16.10/x86_64/ruby-2.0.0-p648.tar.bz2=f8f78e9d6f2f4fe4be2484600bf95012cac675dcad9f6928419b06ca4223c923c60a0cb7de9cd2381ef77f6a196f3f0aaf04fad81230c33d6865eee7361b26ff
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/16.10/x86_64/ruby-2.1.5.tar.bz2=21f30cb5caf51e257572ac6a974d67f8b7a0459c1edbb6367753e1badafe75dd37f8674e8864cf8c47811a66bc59f0ca43e7b96ed48fdd1392e61bb453681cf3
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/16.10/x86_64/ruby-2.1.6.tar.bz2=afe189f0cf56fbd4dd44c207e9bf9d5cf304cb265476ead067d62505637fbeba4a06d47aaa084eb140bdddfba933902c897c218fc616e5690b816fdbf386d440
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/16.10/x86_64/ruby-2.1.8.tar.bz2=f9f7720e08f6b86d5b1f9bacdc4e710525b05cd7358dc0bf333fe615ee6206a8460237c90e7fdbeb8b8b03ebcdcbf712674537d4afdf0a3df52ce8113b5278ed
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/16.10/x86_64/ruby-2.1.9.tar.bz2=7c07672903671a2a4015f0a33b8e237ded2bf6f56fcf4421ebd226e9bd39c4a516f609acdc070dad225ce3e52d468332fd37fbeb06e687796520c7d6e83dcccd
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/16.10/x86_64/ruby-2.2.4.tar.bz2=2e617f392865371b8f19be3f9b65945bc70898dbb3960f0c790200e0f34ee299717bd6fc7361a8404a12caa2bb248c346221341303218675bb0d02fd68a9bef8
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/16.10/x86_64/ruby-2.2.5.tar.bz2=5a68c41afe6f2d7bdbf381b5bf36104944530e7b09246152764469e28a0c842f8e3edb0ad60e2a8fcc5db85b9496a9465b312cab645b61550ab1cb9a9d11f0e4
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/16.10/x86_64/ruby-2.2.6.tar.bz2=3ced80471546c33775873c64b98cd924fc9386af0a7f8cdf462c133ea546e894190a0b040c64c33950c90b0f2e6a2acb54db9277716e8f885d14daba7a669fe7
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/16.10/x86_64/ruby-2.3.0.tar.bz2=9e1e827b35dd75250b4c71c03f437b674d364d9b1b52990a897c742a07e86ec615878d87384871f15147fe05eb67cdc03c5df5f40ad189517b28c5889ca843c4
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/16.10/x86_64/ruby-2.3.1.tar.bz2=399961f149c48fe687139ae247175ebcd58b6659a3b050cea523ac4d5351f2cb44670b2a7fa1c97efe852414f27a50213a8ecfecd36baf889bf9163c82babb71
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/16.10/x86_64/ruby-2.3.2.tar.bz2=4976f36f8c5291facc9553fdb2dd0c6a23d655461a8f8a7965e871edbb8cf9042df3e2292bf03ddeec455570835b834278f0beb32baef26fc159e4b4a86d6614
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/16.10/x86_64/ruby-2.3.3.tar.bz2=d77a51c0b1d0cfcf0b0385d32fd87adc57896f64729ca822f7c1bd7ecce79264b8b5e1799ebe0f7b079f4590e7740db97d027ef4fe5387556dce2c689630f118
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/17.04/x86_64/ruby-2.1.6.tar.bz2=e80ebc162e44f407f5c830fb55f995ce29e28ed871d365631764db395860239bd570aff3092b18b169ef0b9b70495bf86600677c616cbd63c80f1ab50eddaadf
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/17.04/x86_64/ruby-2.1.7.tar.bz2=af76486c65259084dcc3afbff212b7cd5d9e17d5ac6b496db37c6c28285b41f0a72523b92505df2c7efbf5e64ff7dd6d86610f84c5efa7452d2bd01908ca0390
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/17.04/x86_64/ruby-2.1.8.tar.bz2=8f8829fda202863105c0453ad40e1f8806833446d44fa01f97e742e83cb086da7eeaf3349899c9120879395ede20a192ef4546a00062585e47b6b2fe2253c89d
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/17.04/x86_64/ruby-2.1.9.tar.bz2=3c249490017b902b43e58a199dc420b9dc038ec139949d9bc620f58a70c7f8dd093d12313f695899ad53ee314c4bdcfeaa50cb72c196b889f38faa22936137c3
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/17.04/x86_64/ruby-2.1.10.tar.bz2=6bcfe2a2983f6b476adfb7863c9b483aa0c7cd84abd70c59f4de427ee6274bed71200cd91269bc0b3cd418645aee6371cfd3cd77e93b98a2c6c64efac6e817d0
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/17.04/x86_64/ruby-2.2.0.tar.bz2=e610c0029dd68d15b582f09086ac39a6e5d039ffa9c18e5fefaffe4b0279445258050327bf7c02c8ef672a7ec58a32f5850c044d9083694d0b55424f2b75e945
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/17.04/x86_64/ruby-2.2.1.tar.bz2=d841aff173f5a0af71384b56e1430395b287a771f80131279e22647e368acb20b5c22e5c0d4858510525b9783da499b6f6fade081e1d37fac3fe7a50cb34cee0
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/17.04/x86_64/ruby-2.2.2.tar.bz2=17be6eea903f162178edae84c67f263b9532405c0cb5bb320fa51b019869d114e0dc4ad7fafd6cb2597e45b73d4777d3c4e0d4f22141de30bd2ad02ccdd41ee3
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/17.04/x86_64/ruby-2.2.3.tar.bz2=8dd4bb1cafb2d82586b199bf032edaf23fd9bcf8a05b7e2087de172b8a8c6c4fb96584fb15372033b97bbe11a7f8aab25057c03d71e5ee21ec4a647f95687413
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/17.04/x86_64/ruby-2.2.4.tar.bz2=54f9fceb0496f647b3c59dd7411a583c74e7886d8f127aba10379de739c85e45d62c2688280ba5d21a45c5054f42a2645ac2a9d990ec1a16cbb2c533edd9eff4
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/17.04/x86_64/ruby-2.2.5.tar.bz2=1aee7aa974a08c6bb5a29b0782efa2950c1e530bc2100e018d66450e8e89701673a034a45adcf70bdc37f52d4027ae263d7e4410d64fc637b594ad624f10a25c
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/17.04/x86_64/ruby-2.2.6.tar.bz2=693173e4e235300cf30ce1592bada6aba5bb29a123157aa419ba8403757682cff31c9b2b0a4e97daed557953f52c26ebe0e49605e1d12f5e4247e0096d736630
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/17.04/x86_64/ruby-2.2.7.tar.bz2=8af3b57425f7cac45e7bc61029f872facc87e9ffeb3243f8fb43407cbc0a581491f38091b0fa45c8c148b730fd8cd493aa5286177b68092d7944dd73ba585299
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/17.04/x86_64/ruby-2.2.8.tar.bz2=f1a7801bd0116914a055ff4013840faeac0e432b55aaae4c0bb61eda3d812eb5b3093c2c536fd9e2e28eca81137300f84418d8bc8dd9e48ffe245ad90dd3eab7
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/17.04/x86_64/ruby-2.3.0.tar.bz2=e1fea7c85410615f76b02df366ee49f929cd3bf3e52c3fef8b848a8a6d2b982de03c325aac664c6550b216a11cde64ae571bd5a5467ddd4a8b61039d874b2955
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/17.04/x86_64/ruby-2.3.1.tar.bz2=e8b6b5dafc4b46e97fd905a5396d09ee1cfd1c0b4b74b9c3bd9e1056684f05345ac1599817cd9cb1dcd410e4e3ea23d5f2fc86da12e01fd076434c1b2917f117
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/17.04/x86_64/ruby-2.3.3.tar.bz2=8172c35a381adfdbf0f90fddf526e3a5c5d4590e133e041aeb339137c1c31f16a47b904c61048c29906dfd2245572dd69caec507432628bbc98bb3eb94891575
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/17.04/x86_64/ruby-2.3.4.tar.bz2=fe9370f2f45c557fd24574219e9597826f4614a8c59f092bce54338a2e927d16bfd4abbcaf0203a60a35a11169310d45e79c4a33fa4d45916bd6e4eefcc7b888
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/17.04/x86_64/ruby-2.3.5.tar.bz2=e42fe5b628b6a6cfc87abaadbd9140cbc5c0000993c3272740ee6e20d07d2bacffe5148213f9628d6bc6f97211c0905e55d7bd304763ae095d86df8c2b2d15fa
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/17.04/x86_64/ruby-2.4.0.tar.bz2=baadb5c405fab06da091e75af6497370757cb694d50c9f76fb06bc0a281df13f4ae893df49657c7dd7e86dfbd052d2cb7297961f9739cda4089ed71e52ae7bed
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/17.04/x86_64/ruby-2.4.1.tar.bz2=71ad68ef1317ce5ba51353cc226fc7b11923d9022770b355cb1180be7c2ba4bdd87b079a8dec15c09ef3ad42056018a41a603bd0a10b8124433f36b0930153d0
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/17.04/x86_64/ruby-2.4.2.tar.bz2=440f27f682a7f9d2a99ff8c0687c1fecebd8bce494b9db48ab9d303250b8ea12dee51eed0f68d940f141d8e2699653fca7d2a6811eddc5c512a9fe39430fde3f
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/18.04/x86_64/ruby-2.1.0.tar.bz2=cfe087a9daa6de2ef00a6501d568a25a3386da730304697e1bdb9fbb098617a143f073e58629876de4f09a1e8a60a48ec05864fcbccbd6733d9e1b3d309a1100
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/18.04/x86_64/ruby-2.1.1.tar.bz2=b74cc64103a31b9b9545474fe202ab9f9b15569681262438056865e4dcad08419c44bb696c7dc8a18f72b3bd8e5e98201d0c3608ea652c907372c3c95cb7e16f
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/18.04/x86_64/ruby-2.1.2.tar.bz2=fafffbcd24eb3c55c89704e6e8ea48ad6be286bbb4e38f56c3b3d61f9bf4f6bec28882da2ff60f17f79516476ae50cc4cb8c6a8cf4a0f31b910d6153727caed2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/18.04/x86_64/ruby-2.1.3.tar.bz2=4daaf8bba3a04d46e04720ff2af1469e1caa68168f5c27d1d3e0cab922055b1f9c0b26ee64c3cb46c17b6a9651ee7a11bad19e9414102455e96454f1a7929408
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/18.04/x86_64/ruby-2.1.4.tar.bz2=988c13e900168b901a3a3deb4bb96e19b15205cf4c2793b56854b58924fff652946a083be6615b2053fb5285df0fd218d1f9f91562798f0386f0758973765dcd
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/18.04/x86_64/ruby-2.1.5.tar.bz2=c7396627e45d8df68b18c2491fa756085aeb4ec28c1cc707617cd903fcd47d4fdd3cd6ed225dccc14497afb14200b9bea5ba38f1e8dc621c4aea8b8f0f1ccc7d
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/18.04/x86_64/ruby-2.1.6.tar.bz2=389aa514d93d165fe299856a5348b1667f295aaeb49094bb5ff49e9c6861bac603e698c36bf81777797d05a1d3c405e37c1a00a4dbb85f262bf02c1b0e16ff04
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/18.04/x86_64/ruby-2.1.7.tar.bz2=5a38bc1dd227658347114b935ad66e27fab67b8da9529a7f9083d6aac5743c40aea8c33ca95d4f10ed1d56f29bcc2c0747a3e88b87425a5786245792d8851301
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/18.04/x86_64/ruby-2.1.8.tar.bz2=44e36e4918ab4c354cacdd20be30acf12f060aab808172184251186758f750ce688eef72f39ea110ab6429fbaaa5a792b1915a5c2d845b6e22a3cc4bc851c6b9
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/18.04/x86_64/ruby-2.1.9.tar.bz2=358f12ae2d4e177a080bbcde8b275691418884eae9a42c98161170c7b0f6029ffebf7ffad27961bfc8a50a393796934a2dd2c7f0ad2a35992c35dbd6c8c6349f
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/18.04/x86_64/ruby-2.1.10.tar.bz2=e7e98be6cf658eaab81486360f4d5d22f86805582feee4aa11a8e2fe6b461db69b850c7ea98840af0811910be7f534317ab5887bc48f47a9591b65fa7262feea
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/18.04/x86_64/ruby-2.2.0.tar.bz2=307ee69b3051fcec2942fce075232a62f6adf6486239a89fab7bd63a9bf068e36371e67a5e42f86ed60e31b8219ff431c2d4bcf519b2c10393504942d2d90a9d
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/18.04/x86_64/ruby-2.2.1.tar.bz2=a0a30a805be9c43cfe52793d103e9f0dc6076d02b0c5af36d650564aa43958164a278958f7a7e1132ee5d3357cdcfaa8d59a4cc0bab027e288d935a44958b743
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/18.04/x86_64/ruby-2.2.2.tar.bz2=d3218d01a18f5dbcdb65f216469a463215784170d32110f06372fda6325bc17e2c2aec1601a5bf3319ad753b123de056e6bee8aacdd7c64c4859570d40571ec6
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/18.04/x86_64/ruby-2.2.3.tar.bz2=4fb3bc10aa46a85cc37fb041d351b2a8f74d70c3de32fbceefebcd6e757cd8dffdfc86cd14fa6ae7d5273f875e1d4e13e6446b6dd1882c8fb015d1d34ab5ed2a
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/18.04/x86_64/ruby-2.2.4.tar.bz2=a008439e903b1e97eb5a66a88cf72c2e7438b12b78750411ba0ffa496c68beb8cacc2037763be1c8c8841fe9a248d4be0d0976420db0520b4b8456aed5480f3d
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/18.04/x86_64/ruby-2.2.5.tar.bz2=14573495aadfabb81b985aa485c0090a816f459a0db8e790a7d1bd948897cf650fef4e8aad7d2ab8232d2ebf56bf08363730dbbfbc2318625dcab04d3904b3dc
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/18.04/x86_64/ruby-2.2.6.tar.bz2=e915bc10ecd1129d7ed55a12fdefdd6b6fccc281cb3cc0790e5970978f17652068ccd7fdc160608cadc8556abb73a2c187d041899adfcfcb4a311285415145ac
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/18.04/x86_64/ruby-2.2.7.tar.bz2=d80b934273b84d7ccc4e17fa07c9e0a0f95cb4a38224bd60ff73772ef7ecb3d1974e686bb10aa319642709e49789c0886f98f4fc1ccc5312a19ca19f03674e7e
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/18.04/x86_64/ruby-2.2.8.tar.bz2=9bf0cc35deab5f53900bc8e8264dc1b57f91a3477f241848df48109f4b5c97f3140470f523fa768a7543c61cdb7a93427866d871d09ebf8060a5cb75ac6d3790
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/18.04/x86_64/ruby-2.2.9.tar.bz2=0cdefbcc88c5b9d34c08c8871c548772bd473dbaf54738f9855afddae8da5eecda607b36c546077efd0165114da385cd1f296433afe411f57a524fbff0a69291
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/18.04/x86_64/ruby-2.2.10.tar.bz2=3aed1b12ca46e34fce66ac23bdd97ef815918275d91ca4723f9a6f2a2b93cb2b66f845747951593eaaf078bd0d982e06efa7641fc3e11d141b7605b086f93393
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/18.04/x86_64/ruby-2.3.0.tar.bz2=ac6a699d5d08b33e7580a24c9357c0c8e8378208fc7385f5582f088a879f61e48a4654d72f03263a1dcf33fb0838b01c8c21fd39c5e2549d683466e0441381d5
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/18.04/x86_64/ruby-2.3.1.tar.bz2=77cb7698c66ccede33f558f6ab9ebe4be3b775a567d1d4dc12fd85d7b0f28d7bd446b18ef48ba1c879dadd76b50540b57f283e9f226e904e620afc3ba6585bae
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/18.04/x86_64/ruby-2.3.2.tar.bz2=9592c8e2fd9266f5d1cc780706f558e15d775cece995f5b6e933c54be7b7f2be2839b28ef1898b2072c5cdce36b830e72f967062ece4393765f8dbc88c6dff88
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/18.04/x86_64/ruby-2.3.3.tar.bz2=8243575f30eb38409003b0450ddece621a589e29a4ffe219410820bc2afb97b7daec4c81d59d95dcfc83138414a2df707c925f0eb56907d565dac4bbd5a929d0
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/18.04/x86_64/ruby-2.3.4.tar.bz2=ae16edab6e55d1b2506c4cb30d836639035a7fc153511125b578d6da8a8b40cd87650855fc6b4cf777c1fa0428c593325af88d9ad25d53acfbde0051a730eaa5
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/18.04/x86_64/ruby-2.3.5.tar.bz2=10f4aff595d12bdb425eb3268c868e0efb92059e6aed8683fefa5abedc1ef21d23a45e17802edd8e5e0924ba1c3277b653c0559ef4ad4c9dd2be2fee17226f8d
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/18.04/x86_64/ruby-2.3.6.tar.bz2=bc352df203155008da7a1099f7f7d26eb9f80e0d2e41c8adec5eb47f976529c6126bccc207563de87ccc2867d1e4c43797efbf295c9a7a4afce002ee19116074
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/18.04/x86_64/ruby-2.3.7.tar.bz2=d71dc217011d154ef7b33780366bff07e4232ae77321ad6d16f19090f924ed3867c31f2af4aca4ffbc6a536b0320b676716ffb43e34b0323e81eafab13f17fa1
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/18.04/x86_64/ruby-2.3.8.tar.bz2=aae74010426e2a1288280f3611ba6aac842ff573f9b122fda9a4f1c514e09cb3d22281e6957b4acfcc753c94113852e083a9a80d0cae6b33682b83669c475eab
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/18.04/x86_64/ruby-2.4.0.tar.bz2=4a083c168d9facf3346b67dde02d9705109feef6fcd4e3c7c59c2bcb35c83597305e09ee143915fd993799a888d6d9ffffadb386bd57e9477312566dd6164deb
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/18.04/x86_64/ruby-2.4.1.tar.bz2=58b30b00156691de2acc5d21d3255029fc3f9f2536e668298ab160d300fa0bf3eb0705aa524c9123ff09d770807cda0154bae012632b7e87120d7538f844560f
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/18.04/x86_64/ruby-2.4.2.tar.bz2=4c3c586765fd5afb55383d16eb9d0e7ffa5b1ff988a2b1d847e3f972a211b2401f035ff6c02d71de558cc161655438727079aafcc8ab80c97e07e16cd7fb1304
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/18.04/x86_64/ruby-2.4.3.tar.bz2=e66a4ca4b95496964ff4d77e36caf0894d913c1116f901c9b589da5a0e388302b64a79ad6acfe7eb1ca5917825bc0f866b482f074f1d5fed96d91e238f7ef454
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/18.04/x86_64/ruby-2.4.4.tar.bz2=f95eee611be949327224b89942f4344e7d8e075b958ce3418b5874e9b23981113e4fd58254629fa9f6c2fdaf5840d44785ecf5f04433987f8fc4415df5c3e367
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/18.04/x86_64/ruby-2.4.5.tar.bz2=447b28420be5b19f6b1381d232920e3c20bc894c2e0d1d2e394cc44e7859d02d177ec3ee09ce96e922f55b7fe2651918805f00fb783af3780e5f25c21f330195
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/18.04/x86_64/ruby-2.4.6.tar.bz2=5f60bde5843fdc0b05bb852a2f1b30ce085dbcf7acaf105d5af951398b845c766113ff3740d44585ce3814b4953c004230eb4dc2ce8746b6236ea4b7a1d1cb10
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/18.04/x86_64/ruby-2.4.7.tar.bz2=929a03725dba7de8d7eee3fe8987b858b9b9d6d377beee710af5c3e84b02501996444aa7b2c1db458aefc3e765da17cd17ac30fb0b4d77ab1e54239e72fa2a63
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/18.04/x86_64/ruby-2.4.8.tar.bz2=227849b5809072b3aee211125c2aad3e2e4984e9d9b4415dd8c01dbff70eb9c3758c3cf54f2b97fe282f7a42f205a2becf7b86e1e6ebb4a4d048ca32659603e1
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/18.04/x86_64/ruby-2.4.9.tar.bz2=c15a46ba1e89cc41523a21eec90d4e3af5b9739d27c2f2b51047f2c1db832e2773cbc04871a176f71e7124eb3f7b53262e40a1baab87262f8811a8d69d8e5358
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/18.04/x86_64/ruby-2.4.10.tar.bz2=b83334e272e78995b699de28bff67accfc151cc7fb193d5c5746fcf06087643564b3a0b538cb64f50706642a620dba2cc54191357321852db42cc8c5648270df
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/18.04/x86_64/ruby-2.5.0.tar.bz2=82038a66827fbdaf60f404103b3956ead4e03c999893f0095109e7d853919992cab615f85cd96ba9158402b2de5a68fcbdb8b32e9d07c6f754e0591f72851b40
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/18.04/x86_64/ruby-2.5.1.tar.bz2=31e9f176ba61480b33b7761d2a19119a200ad61c8f85145f736eb196de50babaf278d023b274274c6a31f2173c5d022bb93e0f8d46a88223659d8ebcf6f5e278
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/18.04/x86_64/ruby-2.5.2.tar.bz2=75d25fa6dc81ce8a62d02adc2e163e7c222c5946116c4880cec19460e2309457ee1a11a8eac94243ee8437514bfbba9ebee939218b6ccc7e5c1f15b673d432e7
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/18.04/x86_64/ruby-2.5.3.tar.bz2=84c93c85aa3733f2ac82e695c19e714ad4afd096edd6abda8a4915311d1f604453fc3fdc290c6ae1f9055d305ef400f8f8f152c5e15eb230baf7cfd5e192b7fb
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/18.04/x86_64/ruby-2.5.4.tar.bz2=131b874ac376f42f3427dcbeb0adb0edd18ece834514ff5cc15f3b3e29b8f14697050051224d7ba2b509d428f780c653a4d7101149b8ded41ae373aab871e90a
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/18.04/x86_64/ruby-2.5.5.tar.bz2=f55d2ff7f2eae4d30fbc14226c928d1caff21db1f2cd559d3caeb0c07a7a3f034fa369d95f783e6f38cecb493d99aa1928def9d8574698e3edea3d33515749f4
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/18.04/x86_64/ruby-2.5.6.tar.bz2=06b12b2a1e85248311cf55620499806078b3b67110fb45dad9cb11cbaf1e230ce8a0da23c7de0a5abfccdeada8eb799f038b1a09980ee9572ec415e24fcf8c76
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/18.04/x86_64/ruby-2.5.7.tar.bz2=49128b7845954f1f04502a484f17d5c0c6ecf8990047f5a383b2752ea9e09839e5994b210c2f60307d44ffa8b440472116fa1231ea899caf639e1b8a72f7f97c
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/18.04/x86_64/ruby-2.5.8.tar.bz2=24290aab4e0d48719659f8c1153d2b08020f17ae845e9ac6d6b6d3203e4a5b19061e907a214e8d4390277584ff4b46dd4a0113c6b201fa37e8a95c42fab5aea5
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/18.04/x86_64/ruby-2.6.0.tar.bz2=1be48c38da41f462c23d516f465ed34e2fe90c6fd53ee06f1efc9107077d9937413bee589d5d3384aee5c09da7087fa84864a50089bd1cf3c385ba3399e9b0a2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/18.04/x86_64/ruby-2.6.1.tar.bz2=b7e1204e0e501312828ca0e30b77434b2d8d94581627196f0195ba93fb10a11046d44942393bd8a261585c564bc721313152a9087aa56b57b433ed14cc7922be
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/18.04/x86_64/ruby-2.6.2.tar.bz2=e91a187a9e726ed26ddfaf09cc49473c8379545e2265934fcd1a1fa78ba99f9a119fe2c3c8247eab583389c3af7ec40a0e71da19f6ecc17ffc086759cebaaa15
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/18.04/x86_64/ruby-2.6.3.tar.bz2=77d9be5bbcd115131ec7c842a4449729d1515bf2106a6a235472dc96b58a56873c2d0fe6a3b824dd15ad00194b30e72a75813d8b4e10ee11cc793973130e2401
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/18.04/x86_64/ruby-2.6.4.tar.bz2=a2e5409a1a88557bef747ca9b1ea65ac90e430500a8f9370023b4314cb5d1e0679a1b03761980ab2e933ac3521188e2151e521408e33cb4dde5f0bf802d81a41
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/18.04/x86_64/ruby-2.6.5.tar.bz2=ed6288a4d81a740d722b43925db8f22f794cc704bf834a1f9c844e2072baceb8938547abb8f4fb1a50f92c34a8616904fc2679a44bf4adec4e78ce00e8456b45
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/18.04/x86_64/ruby-2.6.6.tar.bz2=08cda5ff00b9297b46d1fb620301066b21240951924337b8b87d27526e55024e61121e51d9b35feea2ac5eed4027658b39ff487195140e7abe9158181c3349af
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/18.04/x86_64/ruby-2.7.0.tar.bz2=cada908be34428bc2f302bad6ebd778a2c7a8e979476e00e45c9444b65d7f48f397b838549d56ceb91f0e5593ffd663e9facc4ea5f5c6a4aecda85a5a1136496
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/18.04/x86_64/ruby-2.7.1.tar.bz2=06cb5f2f0c0941802119dbdf34995446d6d69ee59eed9a5e9d7f9e7f0e14de440a9e77eee330357fa305e81ee39a6868651c740ebc91bb9a2085a74b33685f4c
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/18.04/x86_64/ruby-2.7.2.tar.bz2=23654c65e6e62354857f86098852af0ba50a15643df5e7f6fc8b710e35a3872f6eb7dc1bf9266375361f696d8ded0bcdb9ee9acdc8d0c975955d299292da7e21
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/18.04/x86_64/ruby-3.0.0-preview1.tar.bz2=8fe71fdb37955b031769359dadc5062b6c15e0618fd8961c932212a6a2610829aba8b1dbdcf4bdcc2e133665e043b29088f714874e3ef3a41d688b7beba78928
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/19.10/x86_64/ruby-2.4.0.tar.bz2=172189c66b3c721e7413f0088f50e4eb8dd80d87779c3a4e74231f7036eeaacb8e373b7f5ff017f8aa274c1e1c872066f2f93485a2a369a7e9b442d157840bf2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/19.10/x86_64/ruby-2.4.1.tar.bz2=829fcc1a3d878ee28e89a58a2f6d4221cec115d241a007b048953672d57548002c3a105ea4e65e344137091baaf5d5c54232a54c116afe03d0f3d61c07547c2c
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/19.10/x86_64/ruby-2.4.2.tar.bz2=ec2e7bd32e2d574773486e1c1d733611465765cf14895fa6b017b6ed6301ef40cd062496a3926788851e7ff3bdd62b488d03385aeacc66bed53aed18a6dec225
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/19.10/x86_64/ruby-2.4.3.tar.bz2=79f822725d4e3bb7daf416e736d87f3b01c21d011423a2b3c65d9019a47ad4df256fd4a1f171961267ab8f20387019fec8f3f4ebfb6664f682bdf36914f6a329
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/19.10/x86_64/ruby-2.4.4.tar.bz2=aba571bed773554b18863e6b942f2bca743729834657689a016938a34b7e4352e68d9fffc440b2fd4fcdd1bed4d1ba5dde689da535088d7ff8ae7dc364ac3b2a
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/19.10/x86_64/ruby-2.4.5.tar.bz2=0e46655028859f5abb64d71a5585db638d00edb9d20a487739d307bc1dfa2fca4ad196e04044dceab0e279286379e73110590c772a06786214c4eb23557324f9
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/19.10/x86_64/ruby-2.4.6.tar.bz2=177e9f0a193f9dc45f8653306cf6a87bffba16780220fedbd8be67a3608a8f8d370011f3993590d58805a8ea4833d95196385fede4b513d908fd4263a82f113b
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/19.10/x86_64/ruby-2.4.7.tar.bz2=88bfad0d6258372d4e9739613a07352e954db3deb43c0e2d2a176f9cf55bc5e2df73e4cb04bda75e2dbb210799649f020a7284cd2acb5fb92d2b115a933a4f03
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/19.10/x86_64/ruby-2.4.8.tar.bz2=3710f83ed7f3f30c9b5d3dd515c168534d01811cd33f20d3a54e654dfb5140afc8198f46dd823ac45072a83d844ad866af1e2b8265f54f9997356be88fa254a6
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/19.10/x86_64/ruby-2.4.9.tar.bz2=078ce0d7433e63d947fe4cb0cd5a14e6f5fca00b7309d7288359ed90989dbf618bd8c1f5f31b607f3ad6b0cf540d715dec2c38cfbf71cd170e572321598bde7e
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/19.10/x86_64/ruby-2.4.10.tar.bz2=f97f877f7afa604dfa7e8f1b399a4c034e79b616c95bd4e48927d88d1e8adf8e203901fa178f93c6af4511d26a38e2d8cced7225c2e75457bb02dc27b8feedad
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/19.10/x86_64/ruby-2.5.0.tar.bz2=ad619ccf77132166151e4982996e93135fb91d97701ef9aea12b6bd05e18e585dc4d5fc34883b3369ebba15474741db238fb90192eb273dd5428864429525d9b
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/19.10/x86_64/ruby-2.5.1.tar.bz2=9094c9bbda4c3d830382e89e4e1c24fe43cebd9d733b6878a43a34d679092bdb6c7b23cb3cc08d4efc6e15449c68862799713006703f95e2862bad1c0b0bb94a
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/19.10/x86_64/ruby-2.5.2.tar.bz2=54c8fc2f2a99f834292b83ef8e68e2b120f20fc4ff74856c13137065b95262f62188ed5c6ffea8fc4b0c1034d9f8a1b497878d6a581391d422994911f5fcb35d
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/19.10/x86_64/ruby-2.5.3.tar.bz2=b26daf1825cbc9cbe51e1abea84f3aae542beec7c26628201325026b4d4bdeeb46f8053a1c105973242ef532e66bd4eda5199dc1aa4faba1a6393f9cc126d856
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/19.10/x86_64/ruby-2.5.4.tar.bz2=e5718fb13f2fe7f6b34fbc2b1a6db95576fcf9cbed481fea59fd4dd28d064104a912a1000533810221141ec09e9fd8d1e59850ae5a26ae441bb6d8878f42c418
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/19.10/x86_64/ruby-2.5.5.tar.bz2=71ae2c5bac04a97694310daf76e896a1a02c245274e9c96ca96740f78a0e245302564bce757f1688d3e83b7c0c88989f702814c434101f8df786c1276a4f5a2d
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/19.10/x86_64/ruby-2.5.6.tar.bz2=1693ebd7cd3a452f51ce2ef32144aa36f6fa8121ec68cd0fff715db8981214ea9fc729099e4495e1e8bc346409551d4b93c6c3803fe187fc0c25360b80caab72
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/19.10/x86_64/ruby-2.5.7.tar.bz2=53b05c51b970a239fab953dcf3bb433f59465fa0b4dfe58066132a1bf6247cbe4adcafe41b219ba453ea392f88a521349df14d58a91a855c53c9b9ba4cc16c4c
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/19.10/x86_64/ruby-2.5.8.tar.bz2=b9b0d99e590a48ceedbd1d6318c29b8fecc12b02ce5a6f1555593eb1b3e284c766f2f8800ee3070fb7a041593e4a3806d53590be760381268ef0f9588e127b08
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/19.10/x86_64/ruby-2.6.0.tar.bz2=90491968190f4809fefb4068fcc37fb7e2ef179454f57c90bf2af308541f1ec175a72ded53202c1e86dbb63cb6b47678656f753574bf6ba525e982f3278a7602
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/19.10/x86_64/ruby-2.6.1.tar.bz2=7f9ce1b6872352a6feb539948d26dbdfefb3d4225ba582ef8730be8fd85d5c350bd6f21346d43cfe26a8501c4ad145d733d94da5dbf25b15e7610ca037ad4227
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/19.10/x86_64/ruby-2.6.2.tar.bz2=8544797f46d54cc4098227809561023bb7bd01eb2330724a94921c5a79ac64b44bd56069d7a77a3e6d2d3dbc504ec25157daf7fdf921c3acb3b4289ce1bbfb5c
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/19.10/x86_64/ruby-2.6.3.tar.bz2=fe086aad84ac7fe8009ea2bc16f0ccb7c60a5fc9034690af38fce1a05582a6226dc3d7b80d08d1952d03a9abcebd7b361f5fa2d506d71e1f5aae9b5f31ac22af
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/19.10/x86_64/ruby-2.6.4.tar.bz2=ce06ce97ea1554972b00781332f126e767a3ab98f5023d3dc83195bb36b954b1b497961c74bf31340827d9a5de2e0bb34240accbadad550b2e692d26cb097d4e
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/19.10/x86_64/ruby-2.6.5.tar.bz2=6fa248065a48cebd1e9950ae07f3e653b3e29e369fdd914908be0b215257fa2766b0182e392fb869af51cd498e258435f6d9b45a03452356dc08da0e96877ae4
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/19.10/x86_64/ruby-2.6.6.tar.bz2=ce912342033f395ba6298051b081c89832f656d61ecf2064e9568692552a938599c816d2cd1fd1f9bee721611f890b8329985c69f4d5b2bdbfa6635b48afe3b1
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/19.10/x86_64/ruby-2.7.0.tar.bz2=cbfc7a1cddff0385187a7bf2eb9dc71a8d14912cbbe4e9529b79414e49e681302ac9009b7c8e6fcf92a9f19a0ca5053a6ed25edfdb510e3e4e247474d471c58c
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/19.10/x86_64/ruby-2.7.1.tar.bz2=29b99b3e04325ceca89b64c7846aeadb412215270f6f7c390fb1e275ebe19b2faef811778c0615b2d4720ddd942a2cc209c72e623f559e6c04e78849cc1c1b1e
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/19.10/x86_64/ruby-2.7.2.tar.bz2=f67ab3ac13ae90622fb3664a869b0c584b97df0500384a28bda9c5c36cf2a27ac1f66afafea08bb29bbfbfc1e0ddc444427993ff4163987f5510c4158a90a96d
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/19.10/x86_64/ruby-3.0.0-preview1.tar.bz2=aaeeafee545dd1ba1c4df5b7e46e82f7e89e0dcf4fb10677b7e177e66f86e6825e85fa5ae3e74062363883768b3485495a3378f97693d45f675a6e547e989cba
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/20.04/x86_64/ruby-2.1.0.tar.bz2=3e78b2a73167c3680aebb1ed015c583d4f6c58804d3b272253bee2cef37fd2d1cb3852fd2b408f4af1abca17725d923a1f28d40d2a33896e5cc21c4c6711d7ca
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/20.04/x86_64/ruby-2.1.1.tar.bz2=14e7962e180b9ae16607347ba5360b9ec086eb8055b88d2f60b1c9284fafd93fea905aceb441f07d594a34b53647520f9dec38e4e9f6ad3e5a6850750d981a27
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/20.04/x86_64/ruby-2.1.2.tar.bz2=5b7d88d4405cd45a6a720295cb0b7d3152dd757aac996c8d1a576c6ab2a45cf9ed0b0ac006423791cb038a14153048e96308ecc8ba1e761d4b7671dd6f880d15
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/20.04/x86_64/ruby-2.1.3.tar.bz2=320734a124e26de068457237b5f973278286d7e529e92405c1b856b6e57441b5e76c59d0f519fe43fbdd2c8c48c9dd37dc5094831c0e6a81d804e88888ab6237
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/20.04/x86_64/ruby-2.1.4.tar.bz2=ca34ccbfc24adc4b2c6c5c0e3b27bd2754c2c5be61e9dfa7b919b4902174e351f45128d887c179c37ccd5163a7f51c213fae96be4d0c356e2d7f96acdd4f164b
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/20.04/x86_64/ruby-2.1.5.tar.bz2=fabb151c29ad7ef7432efd4d51ea1e20180006601617ba896f8b1379555f4088d398e96f7bddd7c9815b266acf5ea94527ef4acfad2446950da6fabc3770f788
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/20.04/x86_64/ruby-2.1.6.tar.bz2=2728c38987d41169b7110fce2b507b5d3e971d5b043b60c9a3b8d6d385ec2a40d24e464f6cf081844282d6b9fadd4abce670e79f02e4606bdd5aeacd1b57f773
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/20.04/x86_64/ruby-2.1.7.tar.bz2=f98f4dacd9d8c6c9515ddc2597da8b868c66897577cc5a76819db742f3649881ef5a7f85a880f1e359772b1ab08750dda6fa74ee826938e06b93a9848699b929
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/20.04/x86_64/ruby-2.1.8.tar.bz2=47fb4b41e60b1e536b3a54e18e9ee92aefee7eef92d49716b46884b2a3d73a02e88e4815df64baedebff80e9e17ac7b0af6e65b406a2c53a4f90421dbc948415
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/20.04/x86_64/ruby-2.1.9.tar.bz2=c81ad5e16aa18beb7c34eeee68ffa96da243f99ff69cf00932ad5ebe427c1f80e3f7fee31b15ec0d96c1be5c2007dfa6e96c38114f61e958c6b7ecc40270db4e
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/20.04/x86_64/ruby-2.1.10.tar.bz2=856210b3eb2bf338c5da2668e830b95d48feb82c1c4407371b18c772df12878703a9eec948a2778acd098bcc8eb402ba6d57b2b935766847f3e652c3dadaf6f9
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/20.04/x86_64/ruby-2.2.0.tar.bz2=6ea5e6338319e5d6861d420b10f93b5e6634a9925380c61acfbb258b6609ada76bf2a6b474b53a30b0a81f0dd81cfdd1e610b68698df73f69091f479ad39bc63
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/20.04/x86_64/ruby-2.2.1.tar.bz2=8e8e4ef137b9394ee34b760dbeaf4d23953bec083e5775a423ef6c16b75faf8bdfe99df975ab6b6d762509536b017f3510a9a5e9ab63060208edd4d2d96371eb
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/20.04/x86_64/ruby-2.2.2.tar.bz2=756c9ecbe3c9801a0a364143478903318c524f7aba026239a1fb42d7390f74110805543a9ac2a9f8bbbeaee48bc867fd15d400d8bd46576bf4fd417d6136a3b2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/20.04/x86_64/ruby-2.2.3.tar.bz2=594ff95e33d0f7af7be448a781ac68f895f8344ebb1c9a03898813baa5963024aa84b11baa405fa584070e4195fbfda9b908f1fe171f75f19e5e1d7879bdaaf9
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/20.04/x86_64/ruby-2.2.4.tar.bz2=a9703c6edcfa2ddb87bb73c070d963fc4d59599919865be9b1d93989906698c6f3b9c4fd7f2d597e5d710276555de0b5865676b92aa3aba1f1f41be4052bedc1
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/20.04/x86_64/ruby-2.2.5.tar.bz2=dbd91cccc0a00a1ca7e901d56f9840e62e4f139ff4dbae530169f41897d06523c7e8977138ffc6212e1b60589f3091a4e2f6b6714c0fad22fa65e442b248f61e
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/20.04/x86_64/ruby-2.2.6.tar.bz2=ec967415b5bec95154cd9ff8338a602a6d005fa647afb1e1cff54a0fd4e9c0697b9e952c2dfd8e4b30068a697f5391b9cd165d5d33f3b146fe35f2a8fdf9823c
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/20.04/x86_64/ruby-2.2.7.tar.bz2=b8786ef31db7d950b1309646f81e6a99d56b76223bb8d2d20ae045f09917332a869b14cee1bf235675c7d8eebc6942b5ebd6cf0cbd290ea75d9f9be1475352f5
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/20.04/x86_64/ruby-2.2.8.tar.bz2=4d949a715a04cd45f6817b1b26093f7bbf03ca630aaa015972e7d0ca72bae094add18664e1489ebf8ade27c160d2fbcebdb105701d719461af13c4d5fcf2cd22
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/20.04/x86_64/ruby-2.2.9.tar.bz2=ec6cd8bd90ee99aa6470d9d524d89531f96f992efab8a9d6a709a3959ef4c314828276e67b84ed97d415cb3e0c837458d13732dc940c93d4d069d9b881d7f92c
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/20.04/x86_64/ruby-2.2.10.tar.bz2=1f60cae30581e3467c7ec07391de5045f238b61a49661ef0cf76d72ef78d220b7ae70b86b1e72625cf37085b6507fb1dfccfbe5554195f0c6eefaa996e199c16
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/20.04/x86_64/ruby-2.3.0.tar.bz2=343f5dd6703b6b58d61fabefc8a50ce5d02d98c32c8b4e52b8deacc9824369a9f0dc8faff69e90ca7585a194a4d742791765b16c3f5e2417b0f54e0e6f6220b4
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/20.04/x86_64/ruby-2.3.1.tar.bz2=aaf7f9e30b3998b8586764f61d09e434c32aba7479aa79fb6afa71ab11c067384ef3a4b9215a1a3639da807f4f642b9efc62b37b55e989b7ed7d75cedc7cab40
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/20.04/x86_64/ruby-2.3.2.tar.bz2=b834ef95d52abc1f0c224193391bded9b4d2089c694378dd5aa45f8b2b1ea41b1c300445f766841cbb8cdb1114491ffe0095f518e1600746f5f583dd0cff9c1f
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/20.04/x86_64/ruby-2.3.3.tar.bz2=9df5ba9423e0a8af9d825e59f8c69889c70af0f6d67f96708a02d7d61260c83474e2f7b2f240af399911bdfc56850255b4f34554f7013d0417a13bb782403aa4
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/20.04/x86_64/ruby-2.3.4.tar.bz2=1d4b55a6a34249e82880fbacfc1d97a093600005deb982c6b42ccb14bbd7bf1db14e0f6d73bc25f1addd72378850f7edcd63738f2b3cbab569e34e89d563188d
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/20.04/x86_64/ruby-2.3.5.tar.bz2=29a76dbb28d5b63ee0ce64cc2e7d022118350a550d3693b8e38d559bbc4f42fdb6b63af4bcc4ebfffc5c0fbabbf2e18db7228e655de3bb416e344a61737870c7
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/20.04/x86_64/ruby-2.3.6.tar.bz2=122322fb462f8fdcb065e6f9d9968027c320ba9be9ad6fba9011760a7296cec1892a0780d7436903cb7763f5d18cce11860c5c7fce82890eaa139a94d5e89428
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/20.04/x86_64/ruby-2.3.7.tar.bz2=0c17f52a74b73041c588ed76f73862d179d7b9abf9de61279dc74ba7b7f170179e0db5672a403dcc209b6dec9a865a88a382f5df01f5e6ba4cfe0f66232b4a15
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/20.04/x86_64/ruby-2.3.8.tar.bz2=1a30bbda34fee311762a2f05ac7fbcfb4f373f8840f86b9762b0c07f1cd397e3eb3be83210221384333b625a243c7161ef4f368602a613760391265309e4f304
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/20.04/x86_64/ruby-2.4.0.tar.bz2=edf31b2dd02208c96be25c2f4f7d35e2b122e5d327133545e16038836b848b90f81079be4df47c5493bf4ead1d464fa72a8d0d405bb2509ab0db6335c58ff793
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/20.04/x86_64/ruby-2.4.1.tar.bz2=91cc7a9cf493c7361f3d507cdbb8e258b7dd710100cca8053b77569c07c04fbc2f72fdceb9fd9a3a5d01f4c423a206da97730c356d017157bc2454041e1f1fd4
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/20.04/x86_64/ruby-2.4.2.tar.bz2=8ea603a27560ddde5fc639b86381a303f886ce80384d8edd0e7bc806f10649760d75a76dd5f2ee445371254e727544ec12df49d7fc8876890b73237f4eecea1c
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/20.04/x86_64/ruby-2.4.3.tar.bz2=c42f24668695be5c291836ae6f39b4366e0357c9bb63cf8be2ad36cefe0c6d19cb921a43159d49d4d062dccc15902ec1698a1a6842d13ccaec45c6cb628da4b7
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/20.04/x86_64/ruby-2.4.4.tar.bz2=3ac89131407faefde80bf2e1bed4baa51c371ab4bffc18c8dcf2624f4d1068c9f933eb66486a2bc7c6c67f674c5bd06747bddfe1f1f9dcd939458a08e1bc6108
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/20.04/x86_64/ruby-2.4.5.tar.bz2=8ca9a9387b8cb434828fa36e5886bc8a28d70fa46d3e20df60389880477fa2ee54fe63c0c14611a2cb0168ef1149d205640c6003e6a507400ad5fc34fa641bd2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/20.04/x86_64/ruby-2.4.6.tar.bz2=52795cd7d112ff437adf603f58130ce539209628d2224a685d060d67a07325717981fc6f91736d4abfe014ccc8057bb40a097fcf85f5046aabde0019d08bef16
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/20.04/x86_64/ruby-2.4.7.tar.bz2=bc179a31c746ac6e632ce08f57a8f403d4e463ad72285c0ce008d7fa39b88a22be3a43014c9eb019f6a39d022f9448ef151a8d03e89a4d2e767c4f77684e3750
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/20.04/x86_64/ruby-2.4.8.tar.bz2=d693e3a800c2200c74b24c207425f41cef206a0b3f20625d18b1590e9891f409d6643ee0e7ab8fdb6e1e85de6fea52c6a307bf8f65324ee0f9ac33306ed1e876
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/20.04/x86_64/ruby-2.4.9.tar.bz2=4b6cab99f6b7be7705efa5eb6f321b5eeb1d1c6e96d4113bf96b57378aaa4950b39f40ad555f630f17d216d235972f028617ea43c28b1970772ffd16be3d9a67
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/20.04/x86_64/ruby-2.4.10.tar.bz2=40bd90d231fcedbe34ec9963eb59645fdd1036b03056b9b8fa3b56900deb86d94e2a256f90e6aed297288d6797857a3ef9fc27bc6ed05c017b5c8e8ddc465df1
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/20.04/x86_64/ruby-2.5.0.tar.bz2=c1df39ae526da7ebf87510017d7694e6f78c59871baac4e9c5f2d13c22cbecc30925e2783ad93f741110b7c3802e9f25a6c3ff85160b33a4080b0f1fb02f7740
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/20.04/x86_64/ruby-2.5.1.tar.bz2=930f6f7f654fa14076c84365fbc771d5b09679588c4c478d8f6944770c53fdd37213bdad159fd231efbc079b85ab7ab648b0a97fafd666c38d0e280046c6e2ef
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/20.04/x86_64/ruby-2.5.2.tar.bz2=cb62ca82d57dfc0e21e532d4b523f49c559c4ed5f3d73adbd9d650bbf23c694d382f3cc25eed6a8630f23e4780db127b4b8b6ecf6fc24b0f6febc820dbc6af3e
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/20.04/x86_64/ruby-2.5.3.tar.bz2=708209a89a18cd99c02392307d2bc63e46bd38c72c8ab0e982b28285f8e006d4ed77e04da3900c880eff01c3350033cd00ffc3be1d3a12c4ee5b263282f0dd05
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/20.04/x86_64/ruby-2.5.4.tar.bz2=c94f5b3129ff41da1b07da1cf742592e9822febf6bcfd0e9eb7145c00b732fc66625056bddc72fe9b631742c70d0e731cc6a9a16a089c7b559ae963b072578eb
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/20.04/x86_64/ruby-2.5.5.tar.bz2=b4d20f79eebc5496768fc6adb0735c6a23cffbb39ceaf9c2da42851ff7842dd2318c07877d89564176d206e22b8824d2a3c637b5ef02c5caed0b2b5276581032
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/20.04/x86_64/ruby-2.5.6.tar.bz2=a09ab93c3d6936d30065236ff2abbd0295988a9359f5a76425cecab47af0ca5b6829530d1708e9ddc9e78d1fbb7c0359b9c7e90227870537d099ccc89c73844b
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/20.04/x86_64/ruby-2.5.7.tar.bz2=f6086c879f8737eaf6eef4461d23270e9e43811186a22f35ed69a8303eb933136e7a690bce2d9e18bcff730725292075e09db0f2384d0e26018b7f2a0df70b32
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/20.04/x86_64/ruby-2.5.8.tar.bz2=62c631026560ee310a849483f1b48690075477942ce86e0564e92f5ca7834553c435a35a1d6d8dd957c3a7be24c63c32104518995eb3a96e61066a04887bb0d6
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/20.04/x86_64/ruby-2.6.0.tar.bz2=908132a47bd996f8c76bed54078e71abb154294f97dcba779b4cf0d3b82e31c4635dff89e97d5f6b4f1d797d854c6d020afdf9dc77b10c0e522755fa194a17c3
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/20.04/x86_64/ruby-2.6.1.tar.bz2=39c867ac0af48410c0bc6b01f1ecac00616a59cc07f3f5a3e7cfe8f786b70c7cacab65550dfee777d11b8b7a3ac173bb22c602df370eef6a04b40f8e539025ae
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/20.04/x86_64/ruby-2.6.2.tar.bz2=2f04566f6d778121281bc6ba23ec57ad408049e649b351585bc9a3184848c71873910e159f7fd3909c7372378152f5ed264070aefd45933b97980e80f6df4deb
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/20.04/x86_64/ruby-2.6.3.tar.bz2=940375b11c525e3f0bf00e19013eeb886bf85b8d8b66d86d53740170b0ae16b14faa491dbcbec29238f875f84204cb0d52ade17c180d71e129cef5254f338f0c
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/20.04/x86_64/ruby-2.6.4.tar.bz2=1c9d41d7ab7bd69d7e3baa3c4149b1938cc147beb2a63923dadf2fd959732c8cc824e2add0946bcd62f44b0e1d509b80b4796a5929841cda8d28f3a8207b17df
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/20.04/x86_64/ruby-2.6.5.tar.bz2=f47443a53e3008cb7b7b7afcbbf1adf44887769e42b3defafceacc1e50e349c9000b98010f853c6b7cafdb54b85b640732a56a8e11ad8e58fedb5fa4724f68d0
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/20.04/x86_64/ruby-2.6.6.tar.bz2=fc1c9a08c48ad91edb4afcac5244f386d63940fa906dadaabe02a1eb025375443c8174a6ad1acd50f4583d6c57a88feae86e697ec15c8a25bb49f280b1357783
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/20.04/x86_64/ruby-2.7.0.tar.bz2=b41557c83084c8e5bb263aa944499932ce7d84457e4e307f1cffecf62aa44f8543a06299e38fee17ba64f8952048612f9289e24c35acfe2ba02b913c15dc1405
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/20.04/x86_64/ruby-2.7.1.tar.bz2=001d10af5833a03b42d9a254bde844731d3a796d98ce2efea90fc68e4638c7cc3be31a34fa163d4c5ac18c60e685e5cf2ccf88fac46ae6bc587a48ea35cfb09b
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/20.04/x86_64/ruby-2.7.2.tar.bz2=0a8681afc19372ccd9409bb017967f86c2e6642e083ca47ec904cccc34242040f710392d916a69a327ae6a0bb287d97bc05bbe116a1d93478ae282b32e5fcfab
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/20.04/x86_64/ruby-3.0.0.tar.bz2=92a3b217079f9d960cc4fbb5908f7fc7ef71cc3ec8e5e404341e2b8875534c0542167d03b61577776e0b0f049f9ba2e3235842be381b4d484845768adaa6e3f7
jruby-bin-1.7.0.tar.gz=1e466a3f8d52b553c9def09827fda4b8433576b0262c40ee505602754521a00defd821d5ead5052be52baf281c6cb080fd03a8b15c628a0ee67b4e417633e5e2
jruby-bin-1.7.1.tar.gz=ef28381ca30664cf450f9d3df9927530db771d30e86ebcf535af38e1a7e26724ae2bcfe8487cd2eb349bf609a733a25528aae14beab4d13d298b5604ac7353cc
jruby-bin-1.7.2.tar.gz=8155c81eea6743951db7383bd9f6b1750614927c9c0b25a6574f6d64898bb3ada2f626c6e0df6c5486561a03cc7d472fc12fe804ce66a3972d2fe02e3f407100
jruby-bin-1.7.3.tar.gz=1d19be25bf4a7dbb0edad71008704377893d3967aa4204a0d59d6883aa04462ef6798c64d0c0fdd3f5129c16ccb42e8507f3fef38ed56054bf6e689de745935a
jruby-bin-1.7.4.tar.gz=d7c0ee0316c50ae5413757e956c18ca68e9d99a25cf85be978da0787c13b8978d4ff2712a3effa564cfdf07144be4a56a0cb8acc794a01f43264fe8baeb125e5
jruby-bin-1.7.5.tar.gz=a4984591a3809330b93f4ce79fd1b9c24360f89d88a03bbc76351be623893c4bfc6441375bbea452ba4f24ca8b9357e03ac938fd6c065b3e2348c0f896b22a1b
jruby-bin-1.7.6.tar.gz=98600a2d46bfce14111c7eebc62716352a4b685043afdd696b8fe51c6b205eb9569fc2860423a653b842b173198c76c59767156aa48e0d23482dff3358d884f3
jruby-bin-1.7.7.tar.gz=71da2e72c65899216fa15ec568b51aa7004e2ed7dff99ca376b332d3692c83a674c688dc21ee04d177a3961a2bb3973714509d88cc14d0ba9f79c864c6258a06
jruby-bin-1.7.8.tar.gz=42d54243653ec260abdafecce1143161be63fcc38a80f71ab70fcece4bf91545a2b12ed2319f9fd6f6b41916c398a9a8e89e7f0389f59da56f2739665e74522d
jruby-bin-1.7.9.tar.gz=f519f53b1d9f57cfe28982ad70b892dc6fc20fe6601d98d65a1dca9f617a0eb8fff74d0fd82ddb858fe105d05ca7c7bbf3a987677ae0363caa2981bea358c096
jruby-bin-1.7.10.tar.gz=160b701f2f500dfab64beb635e5c4dc57760dd422d0fffe8d3cf8d84ee6ea17a877ef77a0087b4888ea9db64ce7750de01a73a51530aa6666a2efdcdccdb89e0
jruby-bin-1.7.11.tar.gz=a53b0fa327b98344cb4a8aad1ba537ddacb709a0e173b1e32656de8a610cb9896e9a4554d54d0d01d2361f8ff1539a0e2ee01308f670df2004225231b704065c
jruby-bin-1.7.12.tar.gz=bf2be8a37b53d38c75712a6331f96b999fa6b0e87f453fac7b9d11eeb1b66098ea0778172f1a6a84345e1881f05d63012e28d4068a0bd31122bf2473bbdae5bf
jruby-bin-1.7.14.tar.gz=f14e658da7f2abd469edcfd657dbc2505d6a2c04ba1e5f65f2164256f54625da154b338bd3d286ea6a18da61d04d90a61ad6b012bd9461182753483efcd0f603
jruby-bin-1.7.16.tar.gz=47ca714c3211c95c84e9c80ae4fbc894bfd7ee03e1bcc494cb48d839f8538db4aaca7029a4913b8d323e7227450e4e41bb943dc670f43df8a654eb127012033f
jruby-bin-1.7.16.1.tar.gz=9bacdf6e212d08e46ac2c49183c8611873f6ecebfcb0e928b5110bdebfeb8751ac087cf8aba09afb9a8ccb58e59f3c3e06a241c1db445835d7a875b0c3deb4b5
jruby-bin-1.7.16.2.tar.gz=349283bb5344a62f282021ce39648a0c8d0b41ecf8f800ab5099b5ce161ff771e688f205a918324cef6ba0ded6b3694b8dd83f46f56be584202b8fee496b37e7
jruby-bin-1.7.17.tar.gz=a3b171df08e789f91c260c5a57ec842a5d62cc8d6b462b772905ec5284e394ed7b78f5b327ca1ff20f5deba8371a86cb03fade75b5f34f233df47bc3f08d469e
jruby-bin-1.7.18.tar.gz=b259da2967e246a387687117eb13e8986b57de6ca8e570d6f8f8f07b8097db6e01cea8b0ec3a860b091fde14de535260dc6dbfc638f9e9b49d348f726e969642
jruby-bin-1.7.19.tar.gz=da91efcd51cfc833666f8b7cf949d3b5c41cd8da99ae1559c88a7358fb48df1245c66702c7cf23e7ca012cbefae98787c200352976d4e8aa3e9120057a89dc8c
jruby-bin-1.7.20.tar.gz=77131afe46e72c406ab4250e43cd1f98e59a8351c494044ac89f97a7c9a81492f8a8194541055fcf1fc59569e99a577fd6a36a9f6a3952a99f399d4970e80e69
jruby-bin-1.7.21.tar.gz=111883df12a60d06e9924d33057ba72094fcffd44f7e3954d6c6d2190f8e6442804e739cc525a9e75159251a8dc1cc487570792b1b4f5773f4d0082f0eb360d0
jruby-bin-1.7.22.tar.gz=6ed6cbe7b81a8aee60906fdf965bc217b3db794698e2cb37559f36ac119a0cd2a1ae1a7a766535ab491d647e8b4e6b2f63e62011714b757f8691455831ef365c
jruby-bin-1.7.23.tar.gz=6f4b97c4e08274f96195deb176e3126e8d047c981cb655cded9665624033fb905d60d5586704a3f91b2ca06d7e78918d9d31131c93e4c90c75a38182e309ac9c
jruby-bin-1.7.25.tar.gz=a89ab8d539bff346ad56d345b6a205f74890b9aafe82a2c82e7c19cfc30b77fefde1003e8bd7ed15f141151bc0fd21946203219691383a64f2234fa586e1905b
jruby-bin-1.7.26.tar.gz=feee03a50900e459d9ed7d2096056bef126c4551c02c335c4132e2307411f3fc4fd435e8fe44411184773c80f0630a7812b3d798b7e9be2818e1b5a712bc6995
jruby-bin-1.7.27.tar.gz=656f4313fbfe5db8d2d4fc2087a012c91efef848394c48aeaa0041e9a19b87ab74686702955413d2c51d6b4b11c758ba0555b30fdc42e86d66094411324139b6
jruby-bin-9.0.0.0.pre1.tar.gz=988c6a058336ab9ac8b27c7501ceccf3940837f9b9d3ed32a466b891bda1bc13f76199f5bc3baaa1240dd0dfdaee40775f721294d667f3b8b5bb9ac8206e2e83
jruby-bin-9.0.0.0.pre2.tar.gz=f207f9477a12d7ffacd92b1bb5154ba8101dda8f7b2eeadd4fa83eadec9a75727bc1831733d27fde63ba63322ec491201dd23cc6e2c2b5a4b8381a8fbe49e8f2
jruby-bin-9.0.0.0.tar.gz=33308a983533c129cffbf521bdb8c1996a10a6159a4a436248e645bda682c5a5395ac1aa767e971ae679c935f3b61573cb22d5b8c64af026752db3411a6356e1
jruby-bin-9.0.1.0.tar.gz=277dca63f3faad01c98a793f06bb4d558a970a10a66a38482e8372b25f4cf4fea85f1d5624fce7fb5b4310c42ea8aa360f24f6b9b6ef4bb0ebcb036736009ccd
jruby-bin-9.0.3.0.tar.gz=d82f83e20ef17a0675843e306ec5e90993e5952cf5a53957a91e369d2c90d92306aa515b1e135c04b45844a81a0f4ae34289b966821ae5f46ea51fe012627352
jruby-bin-9.0.4.0.tar.gz=b9cd4f4a00da8152740b468914046633d5341b10aa26b0ac56835d5896531030c8afbc4c965b30c36923555ed5b145de8ada69e05ca38b01d43621914a331335
jruby-bin-9.0.5.0.tar.gz=7c61cf010fbae571cd6ba334aefcfd917f6de8224d014026297b840d0b890523e94b2fea20f154c82c25c4f9d5992b9481fb569646a7023e5ddb42db1baf5f34
jruby-bin-9.1.0.0.tar.gz=1ffdd352823436086ebfd37c03401a1f3a9cb8a8c5f75476af1f704c4764396a20f49ddb7fb7f0911e1608f7c88a332944330b8849d13e6badb170efb736dbe2
jruby-bin-9.1.1.0.tar.gz=475acda79ab8c54467ae70094aa86842959200127c1e92709f0a731014c469d3e52e4c48770b64ab1bf31e1b710ac4570b421077c85c08071c1356bee55a2900
jruby-bin-9.1.2.0.tar.gz=cc6b1e1a2907c128dd04edf9da11933a54bbed5e861ab6f0208505bca5aa2aa9d9acdd04bfde65824346fbb435584081fc8ec2e2e9a3aeea1bef8047915e0c61
jruby-bin-9.1.3.0.tar.gz=88339f4cc05f7f0ded21f100755156ade33f19873f49c0c64110916da8c0b059df541a77bb36e54fda9cebf042591450d2d6312ffaa879df926870806985e774
jruby-bin-9.1.4.0.tar.gz=ebe0e9d67cb91721d589461e93e26338e3e3a1f0f98de53f25906684140b49d989ca6d3704cd3f6cbf650f30aed9a3989f117bb4732c83ed870364ce4c31fa36
jruby-bin-9.1.5.0.tar.gz=f2a11e6fc88d37fc1b640ea8c9feda4607bea6da5e6520f61ff85e8d6a51543612ae267b45c033214f8fd0e2283153da02001cbc9fd90be4761b7544e1413b9f
jruby-bin-9.1.6.0.tar.gz=ca59d199a0fe791efc57f05801ae26c6cf6402bdc0f1a795250b1a2dda39b233ed24c8cb005016e79727f4bcdceb1bad726a60c16935e76fc87e5d1a078fb5bd
jruby-bin-9.1.7.0.tar.gz=f2569d4858a33280e90d984aac53662c25ef057ef9903bace6a2214aa2e6a537c9bc8fc76b08f846b3093cc4a12c70c98d725576a4ac771e640b95cfe3697c7d
jruby-bin-9.1.8.0.tar.gz=dba3b41b65ff27dbaa203a5cfc78ac7cb9d952c52b452bc774f593383e4ef9389c0bc37549b798f48b63497ce7007b1ac2d2fa252d9a7c3e52146b4ae192ee49
jruby-bin-9.1.9.0.tar.gz=f8f6419be34aeb7b7577e946a62a094f5921d7319b51876c5e07322d99249b3a9f29fea4ee5c2b8184dfccbd5da8f8262fa97f5e93874887f3355dabfccfa0df
jruby-bin-9.1.10.0.tar.gz=857783bb45fc5d62148bd687b43af9ce776099dfea75ec4b5d947a46ed270568bceba2a630a3277746a3a9c1fd3111caa9a4cd13493ea8824c1ee190e6d2abf1
jruby-bin-9.1.11.0.tar.gz=718ed3f5a39cd9f9b45c4e11ba44cd32e035f8d9f26fe59230dbaecb71adfb2513ee1bb86ff72e075b02f20151f3f30e53bfa30b6c4b011a93a138d4f479fbf7
jruby-bin-9.1.12.0.tar.gz=8a9f88d517d8002be570aa95aebb0063eb62a47efee191155f9fa4f045854910f78431514f857c438167ec42f4241faf74d4a8d236ae36feae58732312e4bbed
jruby-bin-9.1.13.0.tar.gz=ef88f613ada2665d4f63b2e2f15594739de8ba501406e76de417821f44847b0e258524687b0ae0cf5b737520aa4dd9bb59d80a4b89a81408cda638f28bebbead
jruby-bin-9.1.14.0.tar.gz=d15ae0c60421951b830524acd21a0f2a56f480e983b148a2722cd36afed8e99a41f518eb8a679bfa2cf87f08637e81c24ea88be40c0a5390e081322f1fc6f8da
jruby-bin-9.1.15.0.tar.gz=74a411f42149510180706b2c70610caeea357f6fc3d2a12ff0227586862e6a9dedf09e752596d6c486af7a310a07241f311a1dfc73ead229d7225c09d4508605
jruby-bin-9.1.16.0.tar.gz=94e88dbeb2545250ba5bef50bbe0baa6f3851e9817f67f879ffaab50048bb0d41cd7a0e87ac9ef547e37c2b82cf1d7aae6b8caa43d03c6a9931b8ce0ad4b2afe
jruby-bin-9.1.17.0.tar.gz=4c06b9674e20f48d3815b4084bb38e6994670eac804fbc56d717cde7abdb74d57e0ac17b7fa0b500318de405c187c3eaa01441c22621139dfdbeef62a5467a63
jruby-bin-9.2.0.0.tar.gz=79f5e8674089d2f6b260e033e3ceb4571f54cb5cedbca74ba76b52dd7cb30085a8c6c2676e9be57a8ecd9e962fbcb3682a8de38e1cdde2dc6e05bd179556edc3
jruby-bin-9.2.1.0.tar.gz=185e67da4964c9cf1d9142446efa77605e77894444bdc96bbd10fee22637f197aea9fbb0f60d3a42540e5f383d5b06fcf095d572f432544a40c2145deec81926
jruby-bin-9.2.2.0.tar.gz=85e16e38748b6ec5f237eabc8a17eb225c484c20f7ab6728f2a0f650061bc50c8a9601c04b0128e73c410ffe84dacd2b8bb37167aae5595728aa25e88c4c9b92
jruby-bin-9.2.3.0.tar.gz=97ee210157c451567946b38d33380051f82e7e8cb5f7649fffe050542ff6cd627e2c42f4c46739d1f0995c87e7338865b18844741285bf3f72364aa3c841c54c
jruby-bin-9.2.4.0.tar.gz=9fe1506e862a17e261cf726e1bb70a9f612a6d7beda919a01405899660d1f4b79ee690ddf9aeed1d2b2f3cbd698be8df4f98d3815352772cc680e9646d721761
jruby-bin-9.2.4.1.tar.gz=2c41e7884cc54819da17ea9b2b773d05d3240d53a2ecb57ba430ab61308066eeb1bfbe6627e6c261f5f27ab5df7f5972656366a04a191a81b0379f620b74512d
jruby-bin-9.2.5.0.tar.gz=d548eba8de420c80062021f5b6e6b203f8b7b36e3f11409919eeab87a028a18f9346f27d2cd8b1f33419adcc83fc804a36dbc3cee169ef1d93383b8f5835ba2c
jruby-bin-9.2.6.0.tar.gz=20c7897da0d2b585616ea5848998fe8770517e24e16955797db2e5bff4622c348082628d304240a71a97e9551ef7aa63271cfb728eb5fb7e7d19bb48aff20d4c
jruby-bin-9.2.7.0.tar.gz=8e71e27fdb149cb7470fb736e7ce858719d13ce6ff8a1e9ab1c1dc71fcc068fb601946bb28ed2feee3670b5e6ebfa8a655a6618d1badfc3763897912c41b1c82
jruby-bin-9.2.8.0.tar.gz=7f71fb5bc8c6c31b31b4c0430ae091871b21aa345777662f264c728c60212365dadb63a7a4b2fff31adbbf8a2e7cfa678d47486e28840f57b86cd45fe9354013
jruby-bin-9.2.9.0.tar.gz=7df33150858ddff586b3bd86120d4bdd80546c7f8e62245f61facbaa5527400a1aebbb33e4a1a8af52066487e3d29760eb96c7ecb9875eb9bc954ccbcb37a4d2
jruby-bin-9.2.10.0.tar.gz=f4ca024602ddab37154f5547132accb26e7c0ac2e913ebe1b5c7806727eb148249e76031ed4623ab53814beb8fb3f472e386f44d57adb5d2b3b00fb2773c8a63
jruby-bin-9.2.11.0.tar.gz=f736a9e139694c84d0a5ea42f36b972adc82c9be13e0b80bd61045c026e4fe31ccdd4be3dd3e94781c846f356e026465e41716fd2744ded2ab0ca39cd33bb46b
jruby-bin-9.2.11.1.tar.gz=2f758fabf5910ea01e9c04c7600d9c666f2df3db8622f3eeb3534578075ce65013c42fe9ea6f95d4499945f795e6d566eed2b1545e149af823eb1d29167a1223
jruby-bin-9.2.12.0.tar.gz=1dbc5bb3814a6590f5e8ecf4889152684b5625fe81794a2c4064d598614a85129256002dcd239e294f209b98e3abaf9bfe70467fff48ef66b1531162dc6c3be6
jruby-bin-9.2.13.0.tar.gz=2cba016ad6a376252083122d51335610209d860c41de1902f5cd49ffc2f6b49c350b68df8fc4113c221255af4db7ec07980267b9888369811faf66db369e757c
jruby-bin-9.2.14.0.tar.gz=ee3d17e875dd197f92744c7cba62320bfd3f166bbb2ca117f2910780a7c571779c0940e024351e9d4685ee9781dd207e773ace57a4a8a7011869c8b6209513c5
MagLev-1.0.0.tar.gz=8da29f16e08f657b0d2f147b64f2202ac027db26f85da8dec29f926898f178ac8d11260fd6c0a539a9b9b15eb92d8c7ced86a8cab1861ae7f8a33b6fa468e5cb
MagLev-1.1beta.tar.gz=7122af70530e76b9a4cee93244d6872b49616e78086bc8a5db0f32d2b846560b352c4831addbbecc72e0e3158bd52f26c2da14f5d83a515ead30efe7c538b62e
MagLev-1.1beta2.tar.gz=43b4b831791074f6e8c12f6fbe6ccec2bd0446dae029d3e6717cde1e7adca8462a2d7dc49c14112cb568b5b3adc8cd051767044b41d57ae51f38aca035ff8597
MagLev-1.1RC1.tar.gz=942c1cf43f1a911230aa43bbac1cea2e2e61b5e19af755e29a6a71139d66d304efcc519072dcc3487a2da7462847530564aff4a2159d675e3270cc938a297dd9
MagLev-1.2Alpha.tar.gz=2672e3e5425df2d2ecc49f85df5845fdb083f74a7b242cac75e33d0c1837079ced8ec8b273807326d08e7bf6f95cb4f1d8351f37af8bb38c4150e6292fc553dc
MagLev-1.2Alpha2.tar.gz=4492ed58b6c2b852502a2195836f1db5a80f0619467e4d7b44981a993a5e9a9ea5c9fecf1198de1891583e334bbc3c3a86648ce8afea1137ae9c73a4d76b0f4a
MagLev-1.2Alpha3.tar.gz=6290895b22efb986ffd7305b7d651f20a051ab6869d51310bf891fa3eed48526a8617b69f72793e8ac0b57f99bc5de75f34235ef94de967bbdcd51857efc2af6
MagLev-1.2Alpha4.tar.gz=a621e9c615ffec503910540db770754f29bab1646d8e67650d5b82413bd551adfb0bbbb8155407ccb6f80933bfe8ae1bf9b688eb0defbc88710308bde1325683
mruby-1.0.0.tar.gz=4a0f2927da3401df23d5c19ba566995f76775def3badbb14f16510a271e7b40a833fc61841f89d8adc6d57b5b12cb453708961c16a22133c092fab8ecfcd1e3c
mruby-1.1.0.tar.gz=afa99a973e9c1b72a5a418d709c4aca08dc7449c427cedef5f12db4ccefb15e11a4fd1c23ceb7e31e49d4d2e602c0b1f9dcf2e0f6cf8ea3466f0b9bee23b53df
mruby-1.2.0.tar.gz=bd5de32ba52b6642358752755329fa45a954082122a8983012930056c286ac328fb52fbdd11f34ff7c80af2c0e9a6348abcd5214602aca1150f2e7ae25cad1f2
mruby-1.3.0.tar.gz=13a57306706d2d60693151919ae15bb3621e6e7ed3b5e9c6d3b1c8d44e52b898c1ad394b39946d730ff82a19f5e3b7c2a374f9dcc3b6c6f990581e504f1cb9cb
mruby-1.4.0.tar.gz=d2dd6e17c7f8e890ef5b6887538cccdea08a2376ba8f9a478d7d5c4377fd4c31a4af6323b1fc73952ef80e5a4778ca22eac3d724ce7d50b76770f7e614df7da0
mruby-1.4.1.tar.gz=2cbf155ba7819211b6410ea606c4d0db3adf4f47a4018ac45285ab3e32b94f280aa0af0936ead7233411957cfca62979d14bbaaf0d8f40521cba5c12272f2af4
mruby-2.0.0.tar.gz=8379f76b7a06d280e2a2552eec2975ffa3fe85b99028f6f7c009cd908f95faf3cd36a9975f502a5779559baf3c45a4297da0b6bcc038d213a0fdee851f9d01ea
mruby-2.0.1.tar.gz=74403f928c5af52c615ee2490b0aa685b4d62238f3da3778b3e44748e523e1916f110b42f2e73729be24d561b89a9ae498ff32f549ebe241e97a70d83cf39ded
mruby-2.0.1.tar.gz=74403f928c5af52c615ee2490b0aa685b4d62238f3da3778b3e44748e523e1916f110b42f2e73729be24d561b89a9ae498ff32f549ebe241e97a70d83cf39ded
mruby-2.1.0-rc.tar.gz=f310b385cbf80c6b6ab67e2a41b931411149639c0bf778799e3358d6a9a59f508f42e3faf72fef9e8ef91088d6184c445af7933a47e4e2b2fe114362d579bac0
mruby-2.1.0.tar.gz=da28b5a078e121c75edf62fc68fad6d5810212bd53a3424d4f585ffe5bbd09f652393ffea0f4b3ddd802e5fe178554dc67040c39c9d5069bdfad4ef22ead7e8d
mruby-2.1.1-rc.tar.gz=97c9cc2c79a5dbf2f634ea08532f0f512f8af6ffb99ab4eefd83fc336ca9d97b943e76643971047b4508aaddb5e40176d6cc8fa39a17022455aa15d774eb5b98
mruby-2.1.1-rc2.tar.gz=13aa32a35bd5d8f02a9bfd08d17818dbae78ce46c8b0224a029f9f191cb64ac330eddf3871f4396b9221b987a91e4cd6f8933f59814ac0018155ec8454abff18
mruby-2.1.1.tar.gz=66f9b4bebb5a7b19f5cb1be2bd8b9bc65e4dbb5d4350d238ad5f947c9195fd431f2069f7334036ea63a750e9257e59ae1aef16ac99c7e1f4e17724cd1cbe2e50
rubinius-1.3.3.tar.bz2=8b91baf429dac60663d0e4da3152a60ec6e007f5d6c17ffa430876ec88eb87ade44efae90f2e32e238fd74f1b3d54e27492315f08e7bb073220b402e1e2d3163
rubinius-1.4.1.tar.bz2=928d12aa01a1d0f6c80175d67d3b1f8b9840f69f045c8148786612316421223f4cea71e3c373ee18a3f686b1457557ae547645afe758a99d21c4818dff47b9d1
rubinius-2.0.0.tar.bz2=5c81a6b8cf7b59e08c3b9353b0eb37ce985aaf391f5064df65ffb10f6d12b668287e4d4e61e2c6b560d9234c10f0b64bba74259f2c06f1dac488928544d4131d
rubinius-2.1.1.tar.bz2=154cfa93ed59835814b8b974f6d738b049942fcc2b75095d21c87647d002c879fd55aa3d1ec95414b5b66eb9926c25a5c6e3e19a7c0da7dec6edbf434acb9c68
rubinius-2.2.10.tar.bz2=c2168e676059c197123916dd948b83e39bb96e99786bdcaef2e690936b761fedb13740b9f19883f991f1b475f3249ea1696213e8448c41ae15dfc14b3d4e1fda
rubinius-2.3.0.tar.bz2=d0f3dd5e3b891bff2eb79b7810c6041e15fbbf0606c379f89575cefd829ac7a394b0c12ed3c5a4d452730797bc0a2c6c82646a19a078b56dcac7acad015a4559
rubinius-2.4.1.tar.bz2=7bcea320006b8cd3d122c407d89c325973a74c32456ba0b649657ac848f4682f2eb7455c13e3007709c22932bc2e1b65e2dd43fda0d3c9f993ddf8a74d1e2cb1
rubinius-2.5.0.tar.bz2=ac94d5bc11524e715fc24c1de33f4d358c2cd65e92fbb64c850dc8151d2a712d268227733c99fcffe298c3bdd6ce080c5e9553e4e8f3238868323498a9d10cae
rubinius-2.5.1.tar.bz2=9315f76126d0aa754ee63b190385c24cb084f36293a99aa30fc482fd880d5393aabce361e09ff5514bc2540dfede8e179b7e9212b2dd59bd14ca2aa69d209a83
rubinius-2.5.2.tar.bz2=b48bd8d54a450441a50904b07c75c8d31b59822830a74c952720d6f8d2d86e6a27a84775e975ff2bf55bf3346f34e69d742f308933a9d8476e5e78109cb525f6
rubinius-2.5.3.tar.bz2=b923446d325dc3ce5ad28af9ee527607fae3259b85e85aeff97c1bebbb4520daf70616957b1c0ded900ed19e59025826dee66977c19cd2a2d4e9a0296811eb20
rubinius-2.5.4.tar.bz2=75b7ddbe218e4c92210dbf5a06eb8b3c3aa028d16146982a4e813e3af10a90d33f3e239f4508469c6aba17f02cb8bd10e96a204839975e06519869cacd456c92
rubinius-2.5.5.tar.bz2=a862146ddbbdcd4439eb64e78bfe6d09ae4cca540d19869618426d3f451544658713fe8eb7d46493785eb0cc721077e624293cc44d68eea3ef584967b43a18d7
rubinius-2.5.6.tar.bz2=9a0bdb5d77f80f163925ce409d00be3cee34871baae8bcfdb34c3c7545b92fd14102fecb970e42b3012588d299e504b724025f397a5a00e181ab75f1448e426a
rubinius-2.5.7.tar.bz2=8048110b3ba4e5ff8c3f35282896067e1b1b46dccaf9ef4f6c9b6098782f27591ff59ccae0234fd7e881e3aaf17a0b420286b1b52ecd2cb672249655795a6982
rubinius-2.5.8.tar.bz2=23fca2f9747d2b0e544af890c3baacfb7b3a009cc59cbe653762ccdd827a6c915dcc57902d317fa1f7a81f8c12682f6c3a93195331b6de0f705b118e2e8c13f1
ruby-1.9.3-p550.tar.bz2=38767e98df25484f7292437f3cb0f798b3a43e9a7414a5401677e96ad1cc367cb3fa23ac3abe568d5bf2b2ca553713469a8770d41b79bc63daf3fa59cb4e15c6
ruby-1.9.3-p551.tar.bz2=5ea40f8c40cf116030ffdedbe436c1fdbf9a50b7bb44bc890845c9c2a885c34da711bc1a9e9694788c2f4710f7e6e0adc4410aec1ab18a25a27168f25ac3d68c
ruby-2.0.0-p576.tar.bz2=e089cca4867cd9c715f4f37e40a1db9af6ba0c74b47e79568121bb980476f8877a87ccb848b973381edb4667c0c73165f5e1761f60db839e67f6326302dbd864
ruby-2.0.0-p594.tar.bz2=8301a51c73fb63a8cfeb14af47d0c18b5bc3c45e3d62fc2ed56a673a1cd6b0015c41f275e70eb14a9e40036b1530977199321e05285e107a6adf58514bef1b3d
ruby-2.0.0-p598.tar.bz2=10026a04e01a8ad14ea9c99bbdf4f7d04029b73ee0c01bbf6c2eb2817332d49adacf127b646693b67b5dd7010eaf3b696b23b6335cc0f7ee5a6b56dbba0f6f82
ruby-2.0.0-p643.tar.bz2=453117152e6facdcd5bedaa9c3b1e349382bc5bc1dd3d650ec58b398cb9d2519a2822d05da10bcc5dbbb4f513fc5fef310caa3529d176fa2d453befb28e4d83a
ruby-2.0.0-p645.tar.bz2=e9ca186b1cf0877cdbecd43dcab2c5161a53103e926609d5e1b769a4980eab4571bfd0951788b4fc92dfd9d10175b0f5f36ea2c7289e575a9db9b62c02f93185
ruby-2.0.0-p647.tar.bz2=3416af771ebb0b27ceacf23d309bd2a1ede832c2edf48a5ca46f0b0b84b2ab94fb6362a0c7fe4f77b21253539db8161ae26d23a78d1ba729bf03812454d93d04
ruby-2.0.0-p648.tar.bz2=609acf6d6352c9746e21cd7f0e7d29f5eb522e6fff2d5fad0431d63c568cc084ed5b7141f84cd33512d8213200d2d1a22e8d7df71469a980a3a92886133fea38
ruby-2.1.3.tar.bz2=9b48adb161e5e4550a71f61252c8edf59944affb82250babcb64240749af4b672e4a54ccd0feac5b36ea447a358b350b5080125ef2d4acf6e9e8b1ab82612f48
ruby-2.1.4.tar.bz2=68db1567751166c5e7d24b6e5015124b8a15568c50556e1f429486395352fa56c4a195a74820ab135697924149d014b445b345a1b9755678aaf824fba79c606b
ruby-2.1.5.tar.bz2=d4b1e3c2b6a0dc79846cce056043c48a2a2a97599c76e9a07af21a77fd10e04c8a34f3a60b6975181bff17b2c452af874fa073ad029549f3203e59095ab70196
ruby-2.1.6.tar.bz2=75d58120b5f387bcadbf6d19e85624f78c74f81b9018baef39207214673f7ebc0700ab31145acd88b4071c896ba8e1302a29c90955bcf5f8c863634125022aa6
ruby-2.1.7.tar.bz2=f610d2dd6a93f0a5e84e04ddedf847bbcea5dd3289b3164cdf60be64f67a80dfd5f9836ea5d169970cd0ce24a7e05ea6190699706567cb0d5cf450de6a70e445
ruby-2.1.8.tar.bz2=7129c012bca7f0e7cfa51c73ba0898697f7a9f31abd5ae57d38be5b6b646fd80ab33be9b262cd3e2486c66f65aaf4ec6e881ae6e5a82ec9df62f00fa072510fc
ruby-2.1.9.tar.bz2=a86422132e4c64007a84a91696f4557bdcbc8716fbfe1962f1eef3754ee7f994f4de0b5b7e7231c25057515767040d5c4af33339750b6db15744662e9bd24f38
ruby-2.1.10.tar.bz2=4b7213695416876e4de3cbce912f61ac89db052c74f0daa8424477991cfc49b07300e960177ff576b634a97ee8afef3c5aded5d5806329dbd01d0ce7b42b9b63
ruby-2.2.0-preview1.tar.bz2=2f1190f5d8cd1fa9962d1ff416dae97759d032a96801d77bc6b10136eba59dde1a554ff8c0c2d9ce0d3c1361d4dd12ad573b1266fd53b90ab238d8ce39e6b862
ruby-2.2.0-preview2.tar.bz2=c654d4c047f9463a5fb81eaea0fa5ab7bf316962bc7fb0fb356861e6336ce8ce2162c7779d8b27f72d7bc0e9604b5e5af2910abcb0b0a1f197b3138eaddfd4a5
ruby-2.2.0-rc1.tar.bz2=181201168360bee37dceeef3481a69e8a333a5d329680031fd9d371d30ac64460bbdf4db07546133024f541774e51301f1630cfd988c5e5bf2464834f3abe6bf
ruby-2.2.0.tar.bz2=04edc53e8cd1732c3ca61ebeb1d6133614beb10f77f9abb80d8d36352fe8aa205112068e460bf600b2c7e81e0ddcc3b311e7e027c320366f1bd992b3e378a6ad
ruby-2.2.1.tar.bz2=af6a8e75a66b953ff33ecbca5111bcf1c6560b6b48b370b700820fcbe91363146c5ac8abd670a14e693b44343ae598bab472ed2902834304c03ffcd9550886d1
ruby-2.2.2.tar.bz2=d6693251296e9c6e8452786ce6b0447c8730aff7f92d0a92733444dbf298a1e7504b7bd29bb6ee4f2155ef94ccb63148311c3ed7ac3403b60120a3ab5c70a162
ruby-2.2.3.tar.bz2=795f1b66a6d4f0baef897068899c3a1a4370ce1268618e6a7d6d4720234444259f371d1ba2e174b2f7580265e9f18eda3f295fbb087447aa6e8fb7a0f07526ce
ruby-2.2.4.tar.bz2=d27ca2f19c214ce87f906b57edd41f2f8af35b2871c191470facded9cfda15ba46e5c3bc7d5540225a38da6bd65050fcc8aaa4ffbadbb6bf7dc891c1821da0df
ruby-2.2.5.tar.bz2=d3224814361c297bc36646c2e40f63c461ccf5a77fea5a3acdcb2c7ad1705bb229ac6abbd7ad1ae61cbe0fefd7a008c6102568d11366ad3107179302cd3e734e
ruby-2.2.6.tar.bz2=7a93f72d236521ac28c8a0bc0c73cf805797a8813d22e02f42c5fc05dd39f6e422817272e0db6a24c245f6f97ad4b2b412a9a47ac50156ab186df596918a5f34
ruby-2.2.7.tar.bz2=83756cd1c91516962b83961e0de59d858618f7ed3e9795f930aab4f199d47a95ed8f867d8aa9b51d508be26d9babf2140117c88241168bac41e6ef702cfadf20
ruby-2.2.8.tar.bz2=aa1c65f76a51a57d9059a38a13a823112b53850a9e7d6f72c3f3e38d381412014521049f7065c1b00877501b3b554235135d0f308045c2a9da133c766f5b9e46
ruby-2.2.9.tar.bz2=2a8c8770fda20a22b79c9115b6f468f8e7ea1092c84a5089af7a3122163e5ad298b493e6637e4d93ba02d899d8a619c94064dda8ac98cf3b93f64f45d5401085
ruby-2.2.10.tar.bz2=f8ec96c2a5f4ecf22052ee0b1029989ded52d7bf5d41be24fef67e732e76f72119302240bca08f0547510a9cd29e941a32e263cad9c8a2bf80023d6bc97b2373
ruby-2.3.0-preview1.tar.bz2=ae6d46c87f59e1fd3703b76dfc45bfcf208625f95ab9f4559f0b9f7050e8681f1a6e419f5fa06b704c83e56879c3a9ff1337dba443bcfca76fadb49c97d97a93
ruby-2.3.0-preview2.tar.bz2=e397f321d4338edba8d005d871408775f03d975da90c8abcfdb457a1bc7e6c87efe58c53b2c3bc122e9f58f619767b271bcc8d5d9663ed4b4288c60556e8d288
ruby-2.3.0.tar.bz2=77b707359e754c3616699d21697752741497c719dc3d6fdfb55ed639e76d52560d293ae54cbe5c63be78dc73fbe60f1b8615d704d017bdfe1994aa9747d26a6c
ruby-2.3.1.tar.bz2=a8659b96a3a481a3dbdbb6997eb18ff1f8cd926a9707a90d071e937315c21d372c89252f0d44732ae5007d2678fda8c8fbceafa4e4b4ff500d236fb796284d8d
ruby-2.3.2.tar.bz2=78699bae5b0a2382a58f9d51f7d891341f00ad3a90d9ca06b68b1b245cf5acebc3a82133e39bf6a412ac999a5c0f778a0dab177c2569ffbee085ffff6f6ec38e
ruby-2.3.3.tar.bz2=88f7782effd35bfe0b4c33140b5eb147d09b63fbb35b9c42d2200c010f387e2b70984ead1eca86569e8ec31f08b35289d440c0ca76b662dadb760f848e863d91
ruby-2.3.4.tar.bz2=ad1f16142615498232d0de85149585be1d2c5de2bc40ec160d272a09e098ef6f317d8b25026001735261fd1c5bc0d1f8513a8474e89f0d86eed5b2fe7338d64e
ruby-2.3.5.tar.bz2=3ecc7c0ac10672166e1a58cfcd5ae45dfc637c22cec549a30975575cbe59ec39945d806e47661f45071962ef9404566007a982aedccb7d4241b4459cb88507df
ruby-2.3.6.tar.bz2=bc3c7a115745a38e44bd91eb5637b1e412011c471d9749db7960185ef75737b944dd0e524f22432809649952ca7d93f46d458990e9cd2b0db5ca8abf4bc8ea99
ruby-2.3.7.tar.bz2=e72754f7703f0706c4b0bccd053035536053451fe069a55427984cc0bc5692b86bd51c243c5f62f78527c66b08300d2e4aa19b73e6ded13d6020aa2450e66a7d
rubu-2.3.8.tar.bz2=6d79e0d25757fd37188a8db3e630a52539bce7927fcb779a2ce9a97b9e5f330753035c16843552f1a1fb6c9a1e5c0f916b3cc8b5c0bfe81e20f35f8442e40ae8
ruby-2.4.0-preview1.tar.bz2=c9873e8686eb54dbde61d6e23cd5197beebccd6cb31fd12c82763ebe1fde17095d7514d9d93c2c82b238032c98691df5479dc2d666a8a590e0fc54450ec29cb5
ruby-2.4.0-preview2.tar.bz2=0c9a59a2f57a99c4ee8539a30f41da1de7547566203f89d856e1be9dbb44365754e6c470145dc9336eb324e0feb2f53d9fef18a1564968ac21f9ee528905949f
ruby-2.4.0-preview3.tar.bz2=6602c65a7b1e3bc680acc48217108f4335e84fdd74a9cf06f2e2f9ad00a2fccacf9fa035a912bc9d5cc3f0c7a5e21475971dfac37b0364311ef3645f25c7ddf9
ruby-2.4.0-rc1.tar.bz2=b43902ac7794487197df55a45256819d2e7540b77f1ed4eb68def3e0473ee98860a400862075bafadbde74f242e1dfe36a18cd6fe05ac42aae1ea6dddc9978ce
ruby-2.4.0.tar.bz2=bef7bb53f63fb74073d071cc125fb67b273ed0779ef43c2d2969089b9ca21fff1bd012281c5b748f7a3c24dd26e71730d7248c05a01cb23ab2089eb4d02115fe
ruby-2.4.1.tar.bz2=1c80d4c30ecb51758a193b26b76802a06d214de7f15570f1e85b5fae4cec81bda7237f086b81f6f2b5767f2e93d347ad1fa3f49d7b5c2e084d5f57c419503f74
ruby-2.4.2.tar.bz2=1a5302d2558089a6b91b815fff9b75a29e690f10861de5fdd48211f3f45025a70dad7495f216e6af9c62d72e69ed316f1a52fada704bdc7e6d8c094d141ea77c
ruby-2.4.3.tar.bz2=fb4339e30c04d03b1422b6c32ede45902e072cd26325b36f3fc05c341d42eea6431d88718242dcc9ce24d9cad26f3d26772f2e806bd7d93f40be50268c318409
ruby-2.4.4.tar.bz2=ae632852a5f413561d8134e9ef3bb82adb37317696dd293ef92cb76709ecd45718f14116ecce35b12f1c2dd53ccae8dabc7a924a270072b697512d11f4922347
ruby-2.4.5.tar.bz2=7034fcaeaee41f14bc0ecce0d3d93bd1abe95310e1a0b95fac66eaba867adfb2bf7ba4d0d70d67a15ce8df16052dee405c38cdb18987602e64a2f701d37d3df0
ruby-2.4.6.tar.bz2=292802984e5cff6d526d817bde08216fe801d255c4cede0646e450f22d4a3a81ae612ec5d193dcc2a888e3e98b2531af845b6b863a2952bcf3fb863f95368bcf
ruby-2.4.7.tar.bz2=2665bca5f55d4b37f100eec0e2e632d41158139b85fcb8d5806c6dc1699e64194f17b9fe757b5afd6aa2c6e7ccabba8710a9aa8182a2d697add11f2b76cf6958
ruby-2.4.8.tar.bz2=2d7e0f5ad766e2a12a1b53ff838e6bfe86244ffb7202196769c25e9df6f71f3ccdd8605e7ef35c53e54310bc82caf6b368ad5111dd0a3ad70a3aae1a7be93f08
ruby-2.4.9.tar.bz2=d485444dcd025a261a16bd740dae63c0aa23e4138a095584e7a83aec47af34415c7d9cbc1313e92da2ec416b11bfddf20bb1a7b60c80f12906d11ef27409b3e8
ruby-2.4.10.tar.bz2=4d730d2d7cb96b002167ee358258f2620862a5a6d8627cfa5b49bd43c6e59c50c0f437b959d4689b231d57706ec7d5910d9b144f4ca1c1ed56bc879ed92e8a59
ruby-2.5.0-preview1.tar.bz2=2d39ef64aaf7a52014905f4ad59b53e83b71433e50a9227f9f50cbb7a2c9a5db9cd69fa7dbe01234819f7edd2216b3d915f21676f07d12bb5f0f3276358bce7f
ruby-2.5.0-rc1.tar.bz2=bf0eb114097f9e505ff846f25e7556a2fb393573b4e8b773f94cf5b47998e221f3962a291db15a3cdbdf4ced5a523812937f80d95f4ee3f7b13c4e37f178d7a7
ruby-2.5.0.tar.bz2=8f6fdf6708e7470f55bc009db2567cd8d4e633ad0678d83a015441ecf5b5d88bd7da8fb8533a42157ff83b74d00b6dc617d39bbb17fc2c6c12287a1d8eaa0f2c
ruby-2.5.1.tar.bz2=82e799ecf7257a9f5fe8691c50a478b0f91bd4bdca50341c839634b0da5cd76c5556965cb9437264b66438434c94210c949fe9dab88cbc5b3b7fa34b5382659b
ruby-2.5.2.tar.bz2=9f9388a162a3ae9c14ec8999fa3b12ff5397de14f55996cc8761d21c757113db37ace4d326b9606de7ad3a5875aa94fec900dd9b81b2fb0dff558c39422f4aa1
ruby-2.5.3.tar.bz2=6fe89fe9d406bb454457442f908774577369ab2501da4fd15725ccbab77675b88faad739a6c8ad1c7b6690b439a27de5e08035b7546406cdeca65c7b295e2c77
ruby-2.5.4.tar.bz2=3c4f54f38ee50914a44d07e4fd299e53dddd045f2d38da2140586b8a9c45d1172fec2ad5b0411c228a9b31f5e161214820903a65b98caf3b0dfeeaabf2cab6ad
ruby-2.5.5.tar.bz2=1b56aa79569b818446440b9f2d13122bf7c2976ab9b2865f5fb62d247d7768dd4ac5b5e463709ffec0f757bff7088afd293c2a8c5349c3780763b6444bb354a8
ruby-2.5.6.tar.bz2=e4511d42d19a7bb39ea79f66bb4eca54b63c2a9d27addc035d6d670c1e59ee48a0c6e9c6bc7d082d1f1114b0668831dce3b7422034517f3c4a06ced0e47a7914
ruby-2.5.7.tar.bz2=7d6a7d41b4f3789f46be5f996099f3eb8321aa4778b2a8ff44142654e769ba4ba2df127dd0f267547e4c8cd6ff46364f18e79838df54fcd7e3fb714294ee0099
ruby-2.5.8.tar.bz2=037a5a0510d50b4da85f081d934b07bd6e1c9b5a1ab9b069b3d6eb131ee811351cf02b61988dda7d7aa248aec91612a58d00929d342f0b19ddd7302712caec58
ruby-2.6.0-preview1.tar.bz2=d9cb270529a97670d54f43a0236fab072714e715c39277dab70b7a1843ec818e6700e47e1384c7256f9e0ae41ab2c0b768a0de38a5ecf4f4fff5da6ef5ad4944
ruby-2.6.0-preview2.tar.bz2=3872227e9b1c97c206d19bf1e6ce15a38ee15a26c431b4436605dea67affcf16372358984df76b35e7abaa902c15c16f533ac7af47e3031dea9451bbe459b693
ruby-2.6.0-preview3.tar.bz2=d1693625723796e8902f3e4c4fae444f2912af9173489f7cf18c99db2a217afc971b082fce7089e39f8edd54d762d2b4e72843c8306ed29b05ccb15ac03dbb5b
ruby-2.6.0-rc1.tar.bz2=cbd6281b2aab6fbce3f699c1ab57e5423304dca7a547a0b3cd4e8e980326dc7b85b2ca2bfaf3f3a648d40f4222fdf1740d81d422790ee7ae1ba1ed33eb11e3e8
ruby-2.6.0-rc2.tar.bz2=9bfbe83fd3699b71bae2350801d8c967eb128e79b62a9d36fc0f011b83c53cab28a280939f4cc9f0a28f9bf02dce8eea30866ca4d06480dc44289400abf580ba
ruby-2.6.0.tar.bz2=ca3daf9acf11d3db2900af21b66231bd1f025427a9d2212b35f6137ca03f77f57171ddfdb99022c8c8bcd730ff92a7a4af54e8a2a770a67d8e16c5807aa391f1
ruby-2.6.1.tar.bz2=fc41429491935b89532733b95476ab9f8a4efc310aad8f4c2bd3b68fba08fd7b6e9ac84c6c88ca892022d1ba76435295f3299ea466f9b5453c07d41cb539af59
ruby-2.6.2.tar.bz2=cad678d2ced4085e99009e4fef83c067dd0e6ead27a8695bc212c0e5112a7fa09ceb27f82638faf91932ef8bdd090f844e0a878ffdf6845a891da4b858588aa0
ruby-2.6.3.tar.bz2=c63c3f527bef88922345f4abb4b9ad467117b63f2132e41722ea6b4234cec3446626c3338e673065a06d2894feee92472807c284cbe613a442c8fda234ea7f88
ruby-2.6.4.tar.bz2=a9fa2f51fb5f86cd8dcaa0925fe6f13d4f19f110b5d4c5fd251f199d16aaf920db39ad3bb50460eb94ab8d471ab2ac8bb54daea4a3bb080eaf45250aac3437fe
ruby-2.6.5.tar.bz2=28e0b04ac8ca85203eb8939137b5e5de4850c933faf7f62fc69648fe1886faaabf6cdf48382f9d9585c1720876d10b41dafd33efaeb23341c309917fbd8a6e21
ruby-2.6.6.tar.bz2=001851cf55c4529287ca7cc132afc8c7af4293cdef71feb1922da4901ece255ec453d7697b102a9a90aef2a048fe3d09017ea9378ab4a4df998c21ec3890cdbb
ruby-2.7.0-preview1.tar.bz2=a36b241fc1eccba121bb7c2cc5675b11609e0153e25a3a8961b67270c05414b1aa669ce5d4a5ebe4c6b2328ea2b8f8635fbba046b70de103320b3fdcb3d51248
ruby-2.7.0-preview2.tar.bz2=7066ececebbbba4b2933ba1a4f70cdef373169910802259a3e52b4fc144ba298f3cffda4be5fe8a7be8ef769ed43076fa046a9ac2c13bb733475b9852112c6f0
ruby-2.7.0-preview3.tar.bz2=5d8e99e3fd984c7d05c0bc483e1504e81ccdb920cbb2d78cad3c314e197b30316b692fd0199f836acac41246e3a713cb81dc6dd64c27cba56f807df4c193db1a
ruby-2.7.0-rc1.tar.bz2=b5f96227775f8bdf19f944a555d0a83d7e84b37bd31fe4b8ac008a3272b1a28a4d94abbb1b5570ee32ec0690ba9d476b837a020a5194bee14bebf6f0e768bc79
ruby-2.7.0-rc2.tar.bz2=9010f72bb3f33b6cd3f515531e6e05198f295bb2a8a788e3a46cdfd776a9f6176b6ba8612f07f0236a11359302d2b77fdecca1dc6be33581edbb028069397a0a
ruby-2.7.0.tar.bz2=8b8dd0ceba65bdde53b7c59e6a84bc6bf634c676bfeb2ff0b3604c362c663b465397f31ff6c936441b3daabb78fb7a619be5569480c95f113dd0453488761ce7
ruby-2.7.1.tar.bz2=4af568f5210379239531dbc54d35739f6ff7ab1d7ffcafc54fed2afeb2b30450d2df386504edf96a494465b3f5fd90cb030974668aa7a1fde5a6b042ea9ca858
ruby-2.7.2.tar.bz2=f07592cce4de3532c0fa1c84d53a134527d28ba95e310cd3487ac321c49ee680faeace285de544ee6db432a90aa7538a1d49ff10c72b235968ca362ef9be621d
ruby-3.0.0-preview1.tar.gz=b94892951f842a1538f4b99022606ac2c0b5031f1ede7eef3833a8caa9ed63e9b22868509173bfefb406f263c65211db75597b152b61f49e5ba2a875fce63a27
ruby-3.0.0-preview2.tar.gz=6fa4191425ae71e41894b60bd9c31d483a562ee8216886360ce18238ab48115b95be0367708612c45f634e7584fba8940a524ba0113ce0f36ce4df78a112d0b7
ruby-3.0.0-rc1.tar.gz=798926db82d27366b39be97556ac5cb322986b96df913c398449bd3ece533e484a3047fe35e7a6241dfbd0f7da803438f5b04b805b33f95c73e3e41d0bb51183
ruby-3.0.0.tar.gz=e62f4f63dc12cff424e8a09adc06477e1fa1ee2a9b2b6e28ca22fd52a211e8b8891c0045d47935014a83f2df2d6fc7c8a4fd87f01e63c585afc5ef753e1dd1c1
rubygems-2.6.11.tgz=3b0dd38c0aaf313c59e299dcf54f7bfb6e6d84b8b739573ddaf599e584da45ed7b1465f6521131b32f237e31a4796d9ef455b8be685064b3fd77a0355dfff13e
rubygems-2.6.12.tgz=ebb672488b50f5fc988eab66ab14ce8e887dcc635f71239a85e32fbf1e919ca70196eb4d3f2fee3486cace7064bab0b8b08339c754b723198e1b0b0a0984ab54
rubygems-2.6.13.tgz=c952b6061a9a0778db304c3aa5bea693e71ae2564abfb19f8b123eef66eb1e3877fc7c36f4f1527da97bb320870cbfd4574ac57ad88e850a44fadd67ebdac152
rubygems-2.6.14.tgz=7743845bc5265df3782f85a23896cbb250d8a2bbc9934a27f274b001afa7aa62f7f00f616296f74747ea612d2cb37dd7f533c931aa72550d84c64d2a73d60daf
rubygems-2.7.0.tgz=0bd08fbabcc33687c98365ffe6794ca2a5e82160b0297479d4f19bd899d176b7f4efb95248898b26d873f9fc7d86c10cada6e40cdc48738b0bac261c3aad261f
rubygems-2.7.1.tgz=fa4ea123760b03b8b8e8ececc55c9dc34249073fb267d310bd903aa7a613267e5d27990bbf28e32c9a746bf884af8a84a0dc202297272f9d477f7710c21bfb60
rubygems-2.7.2.tgz=0f48c6e46663780a571c7ee0e6e772f2e18a755031e7dd8ede7870f238c214b9e3e38153b1ae8f1f78a9aad63c1a079b86573b3a25c57a600d842bdf92b9c4d1
rubygems-2.7.3.tgz=2782331b31947a23f85b285a3d5e7b66e34fe5847bc84dca4f1e6bfe33ce187ab0cbc814229de8111aa19490b656ca78b7c821e4ea6b425449991c01371b7565
rubygems-2.7.4.tgz=90f72a46709ef847666a6a23eecf24521abd5c294b2da8a246bb4c7f85daf4af39a0634fc8093c7bb7ded2ac137ea27fac5ed94af3b70c49e78594285c7a40ce
rubygems-2.7.5.tgz=86957f1c438070135df527a15102e40487fcee93a55251463095e4c8794a8616d16ed9bdead0e0ef83c44806bd5016ecd9e178bef608b66af2e68e2c9c49e941
rubygems-2.7.6.tgz=bc168afc40c974dbc7c37eb5678432ba2ed7469c3f007a159699467ff2cff5205c508237193ee8becaa6eb555b043969cc5f92b2aaa6bf7c958dd7c187e258a7
rubygems-2.7.7.tgz=f93b7eacf5ef8725c40d618daf9deabc7e9eed74b3b7f13ecd16f89205fe24958e782314c52f8a8fe3205b93e20b830b4fbf7ff8944ff1cf56feb7de2d773252
rubygems-2.7.8.tgz=3d1cf68377dfcf102028342258aaff5a7257d2d2b34a80508c85aa258d810add46e65a157f902c271b0b7b568c437372d17246e89cd88f8500e47c008d17f1a6
rubygems-2.7.9.tgz=5f699f47bc24d8ffd4f8f44a509a9df71fcd945ca2574dc9d5050bfe06a44830a368f45d204112d7a4f1877e1600a6fe4d1b6b68f9a55288664667b4220a7d72
rubygems-2.7.10.tgz=48a18c0f202f463c38cf5dafecfbc7cc39245e63c7a059ef2cefadda478483794a929ea6b7e0ef062dd4423230746f1f09d7bec06a97fe3ceccc3325397a3e71
rubygems-3.0.0.tgz=047f4d446aae414e4803517088ef47d5cc66319ff08a3795c6d69e83eee9f3e7c3b05419858f7e5b6a8ec224990ca01178a9259961ef2d7ab737bac352a0f18d
rubygems-3.0.1.tgz=dc29ad51ec67b1dca82a23973ea92153482788964d0755bdcd3c650116915c461c6e5fb1c826be3ee04a497fec4ac2826904bd406f24611e77cd8c9eaf4d8729
rubygems-3.0.2.tgz=90b46c2cd4f8baee74eb488a40691cc00e754cefc42029d485163d6ad7782df78ba5cbeab08eec6a4f71febe0f6e635e12a9381393008c58eb5e16396df93fbe
rubygems-3.0.3.tgz=1dd585243341901c7b4cc60a4902000c10ce57fe2cc9c28e27e274a2e6029f936cde1c99d7097c93c2c5b2c8bcee5d692c8fe5cc00c996a040e4954b674e330e
rubygems-3.0.4.tgz=887c64226ec0b32d33f2ea331936683406d54dc74d19e658a23521e25ab50aa23534fe9eecaf696154247ad1df1d24c233d8900b9aabc79096eebd6afef3f775
rubygems-3.0.5.tgz=f5a97cf67d7d043afba7c1aed014f1b64ff6376ea74d3d6533496bc5ca9742e0ccce1a157e6f67d8fcbe59d8e34bbfbcf4ed8be97acf2970603de6381043cb78
rubygems-3.0.6.tgz=1ef1822a2b19790a36a6d242b7d4584222617baa27787ec58961a9cfeb2733f19f9085490ffc72ee375d3153c7114e050c42e68fc8039e727fe5961b09365ee5
truffleruby-1.0.0-rc2-linux-amd64.tar.gz=5dfb040b746e462c297ebcdf84e0f07cd74b86852055dcf0a7cf1814112099bc674bcccd94b03726aee76b253c9345a45d046cbfea230647644f0fd6b1c1ec96
truffleruby-1.0.0-rc2-macos-amd64.tar.gz=17983c442c54d19196be3626e25c64f5474139c0b973624832ba8730efb047bc747c02e59c82f38397bf012c63ab83f79a9c1b64311cab796f08fe96d7d12a1a
truffleruby-1.0.0-rc3-linux-amd64.tar.gz=b0b57082d61317911f101da617333d81ee6bede6b6e18f9bed86544dc413339c830198d90cad7ac94c0c8fb690adcfc559dd9f530abb70507ff6a76eee552b61
truffleruby-1.0.0-rc3-macos-amd64.tar.gz=18f9782de56269389320ddad779ec69c168909198d4572e2ea4c18bc8082a539569a76760a6a6da58722fe08d77d83904aaba14baf4075a2833cbd2efc45dff3
truffleruby-1.0.0-rc5-linux-amd64.tar.gz=134d9ba5db7b8a1960d3a88390cd6f7503a0e8565094fb127333d122cd773bfbf9dc976c659029007e6fb68e93486293bac2ee29ab21dae9cb0c06ba57dd2c72
truffleruby-1.0.0-rc5-macos-amd64.tar.gz=5804f1f27916176f5a270de8aac85bc48c38ba37c4e719b09f5777e5c42429271819378cfe096c3cc33d406cd0726f2e37658020f97a438fd53751019831569a
truffleruby-1.0.0-rc6-linux-amd64.tar.gz=2597b375f590755b851d3b8cbad3eeab4c965eb02d0c944044f57e39f6c3db1e2f513e2aa55db789e4a885c697f81ce5c8bdbe9a7e44ee30fc09d234e44fb512
truffleruby-1.0.0-rc6-macos-amd64.tar.gz=2eb177190de0408dfdaf30264132955d1db7783ddfb63880d97d5933f66c5662794c3bb6198edf230fbff348674203e61f7f5481e74ac875974467f2f128e939
truffleruby-1.0.0-rc7-linux-amd64.tar.gz=ab3a3dc19f903e68e36b135729693fa025a7c1950139277255e48c972387ef8399beceb3252ac37cc70c0df92838f8a0ba8c45f53665ac4286ef23f9b240806a
truffleruby-1.0.0-rc7-macos-amd64.tar.gz=b8423f50a5292e211db7ebd7e2b987fd5c9eaaf34eba86b0644d2716a7f068f2e56deb4357c516b87b437e64fd5ce8515bc181165cc1042c6763f27d71baa59d
truffleruby-1.0.0-rc8-linux-amd64.tar.gz=bcd05d304ee9b4da97193575fb1ad78041a0c7710bb444af6aef12ab4261b1873f472175ec51a187a5e99da481d66b81a132fb691643b793e87d655f31d54657
truffleruby-1.0.0-rc8-macos-amd64.tar.gz=2c758221793c38ca8af1831a5d9f3abd555c406569508ac3a86d3c1ea5baeeacf65abb6e904ed3b1e58f555f51bc85ab171135ff4c3d0e08cdae994a861cbda4
truffleruby-1.0.0-rc9-linux-amd64.tar.gz=42e60b69957f77a8623e0dccb7d215e800c27c622364fa76b9c574e8b1d3a4056a058b61ed91eac2375ecf4e51e482a6e17550aa2894a44d1db70687958033da
truffleruby-1.0.0-rc9-macos-amd64.tar.gz=18556ee8d2fdec6907fbc8fc33d8b32ea0c58d40ee3df084ffb233e2fcd3a514a553f97c31dcc25dda3f86b1b805ca5fe3c9bf8cb078b92325515f09db6b88ba
truffleruby-1.0.0-rc10-linux-amd64.tar.gz=10a7cb1be6214347469d5797091f73c3d7824bfb32a47c13566573a383380b1df9b79b7901ce0fa3af1c97285c90afac21e2de7a66ed88d9495846743b3b25e2
truffleruby-1.0.0-rc10-macos-amd64.tar.gz=53f0939d9d8c3470cb79316d865b765816032528d77a3cf497134f3aa667a6253ae037410801261a8e7d0628198ac5f6aea5ecf9b7313f06ccc1d5e9f94e74ea
truffleruby-1.0.0-rc11-linux-amd64.tar.gz=f89bc9a3310634d39f68006307da0b0ddafae036089bdd663e8372777a9562d201a4e69b2e1a602cff5fba6c78a8d4861b6d1020679bd0c72c71b938a4f36a27
truffleruby-1.0.0-rc11-macos-amd64.tar.gz=3f461c12fa9fa57a55cc390eb9887df88f404661a77bffb44f82b4c7e9021513a6df9f6d5f332a36ce0c28ae7e3d5afbbe15cc4b814bc7f86dac2e5ec280f947
truffleruby-1.0.0-rc12-linux-amd64.tar.gz=85f042c308ccdfbeb318cec37056d8d970cab51cb0779425b85b8f76b0a1dd9cdec3191ae2b6b9b6be6e95767db814496450ed20076addd9bd495742f9de3c8c
truffleruby-1.0.0-rc12-macos-amd64.tar.gz=067a0f63bbaaed4c8d4120f758c8ecf8c52afd1d30ea9d41489e26289d57a574d2d4ae29e29655378510adfb3f4a07b04b403d6ee98ee6b3d3aa8bff9c8d718f
truffleruby-1.0.0-rc13-linux-amd64.tar.gz=1eb6b80cb05133d253f20629a11ed9ec3f37da002d5668cdc6577b2a20524e0cdd4d739d3f1aa2e8c518e2f7ebfd519ec1c647293714a1133ad4d569375c0e69
truffleruby-1.0.0-rc13-macos-amd64.tar.gz=e3cddb0d0ae48f7d5ee4dd094ddb5a13f6a7aff1521b1adf25710971664b235cf67144e3b81525fd710dc49b6f6f6ba06e10eee1df5dc08119e9494c6be86934
truffleruby-1.0.0-rc14-linux-amd64.tar.gz=c982194675b66a0433bd5517fc6f1564db669f595f8c7ba4819bf37e0599474d49a0c606577a898c27fa5ba40ab793c62d8211e7ea398d6b3e2bcc31eb5d55f4
truffleruby-1.0.0-rc14-macos-amd64.tar.gz=c14e396396385644333fb4c4aa1fb4b934a3f4e46312146821e5dcdaa097cb5b1efbf397c1dd6117d909803fd27ba8d835904672e98d43dc565e907fed752e1b
truffleruby-1.0.0-rc15-linux-amd64.tar.gz=f27a75f929a6e945e49ceaad12f484fdaa918469a2f639b572fc4737b78e1cde0881697057e13a58b2fab7ac64c3a71bc9951561c3a8728e3dec814ef5e95fee
truffleruby-1.0.0-rc15-macos-amd64.tar.gz=7aa029c4999d4608c9bcc491771b0434267032dbe9dbf504728079f87ce93e6a90e0fa839295b88c00e5a025186ed0fcc42361428b7874c05e222edb108d6c02
truffleruby-1.0.0-rc16-linux-amd64.tar.gz=e8c508dede11d4f54cf0b15cf92b50caad93076a6065bd2d6784c5ca739f5923ea2b894c6b2b52131f62187c8b305cd11a960fb5a670789802d59b6b2999f0af
truffleruby-1.0.0-rc16-macos-amd64.tar.gz=841eff077c38bf594b101edb15942f601ba0dada2122b21b016f53251aa2a635b8d0b63b49bdfb50259b2545d1f498bca95d5f771a15a28edb0dd07216c9b709
truffleruby-19.0.0-linux-amd64.tar.gz=8ec6c7829351e0dc2cce57305947cd540734fe5a0b95b9501d4179993727ab2c331e9fb639b9865c0fed596df3906adf3dcf2efb22c4cfdd23a3dc2137025fd4
truffleruby-19.0.0-macos-amd64.tar.gz=912e0c15d32e40c884b2caaaf9a86a71450d441c960ef98a63dfce80353619073b146dcfe03d9af4273b2811d0899eebe922cc84a51d6f5e6826cc436d793f78
truffleruby-19.0.2-linux-amd64.tar.gz=eec92bfbd776acd61709a428b90b1029c5ea83e5ea839304d23cae3a541dd4fab3b387691fa76643f55d5939c9cac0cbe70dc0b5786e5e0e5d20f3fcd9a21356
truffleruby-19.0.2-macos-amd64.tar.gz=ce647b76c9931feac55baa5acd2c87d8335c606bc5cd7e462bd92ba1b09f4bab5db927f021e3119abfd85c33377003d060f36cf64eb121954fce8878112f01b5
truffleruby-19.1.0-linux-amd64.tar.gz=db01e6dc09fc5f39ca466aa94f725023d49a8f52343f129bf8c32b7f5f76ccf2d573ee3344fce3d5aff9983bc9af618cc5ca6e1dbba93b3f604e4f33f8a69b3f
truffleruby-19.1.0-macos-amd64.tar.gz=f002bc0b6efca11eb97c4aa6df33d2e0fcc1de3443efd39d912b028df9dd8954cb76ef3ca7fbe140f4e922d6ae4c1a6a20853490ef1ea0749293e2fcd4ffe8fc
truffleruby-19.1.1-linux-amd64.tar.gz=ec031e8c216e31f034d97aaccd6441869221d6946e18f375b44a866550b8e8eb4b2fb923f9ce1a62853bdcd5b9201e0f5d2732ca6525d80171d5732ef522bd25
truffleruby-19.1.1-macos-amd64.tar.gz=1c15918af939a8fe1779b71d9e53d2ce09ca7353173a3b357905d9fe1981ff013cf0f90c6b47e1ca66dd168c2f2d742f28a5fb134cc0231d36146da99f91c3cc
truffleruby-19.2.0-linux-amd64.tar.gz=1248bdde9cd3651d7042fe4cecff4ad35534868d543fe2e6f3a5bfc3bc9d10d57b4139fc070f0a03861436a1aabc9a8ebdf3356f39b77a4b8f6a1dcf492f70a4
truffleruby-19.2.0-macos-amd64.tar.gz=92c3154ed229a115cf392826494745aae06dd9228dd0996c2c44c550552f13f9c254367d068452fa4a84eef79c19601c79b87e10f3121fd7b83b803514a41cfd
truffleruby-19.2.0.1-linux-amd64.tar.gz=53c78cd1f255f2b7031a70a42b65c0bf80c510b9254f5d7ba82b4787f55f5b09cfa9544c424a90f4619a74179fed07c168bd501e34772ef836a773e89c467cc5
truffleruby-19.2.0.1-macos-amd64.tar.gz=ac11523cd49fac50de1e441039e429fb8cd6c7051d537e5083b64fa68eaa19c9f0a966b269da906c367985f229af82a4811282dbfd0a76ef6565162e1081a659
truffleruby-19.2.1-linux-amd64.tar.gz=c5ffc1b592a74e836a4f6ec75b0e103150a4a40d3183ae853ead38c951a85378163111cf0bd2b81e44548c0a7aeaded3ae8a7ae558d5a02dc9e2cce992b79b58
truffleruby-19.2.1-macos-amd64.tar.gz=bb467b91f66eb7d1e6f1a54a7bc0a3d9503bcbd935e8a02da9ea0b749a51e354b1140d4a4dad6fc05312b560bb9ccdcce4f6583bccd19bb5afee19bf494102fe
truffleruby-19.3.0-linux-amd64.tar.gz=0e94777a3feabbf0107ed40847e20dd4e3696ff2b7c3f6ceddf3a53ccd812bd003c84c62a750e8fac9d2490374bf792d69174b48c3ed36b593485d86729136c1
truffleruby-19.3.0-macos-amd64.tar.gz=95470c389e24c865ecdc3d299005cd98f8221a128f3cd75f899b6b7ae5d6dc07962443ce0ff38dfd014589d5aaf08b718dc870a72eb7ea6ced18ec2b2db63095
truffleruby-19.3.0.2-linux-amd64.tar.gz=dc5309b71980657f750b4dd4f8b3bc4e191bc305b638b1e562ff5b0ad7fbba40079ba674caf46226a46b5ca58c10f812354786696264742f351b129fb088a672
truffleruby-19.3.0.2-macos-amd64.tar.gz=ff1c37485ebeff3edcc7081ce09bebe5541012dedff6997662c7f8a064e0ab10bef9a5cdf834263a06ae04ca0391743948bcdea6e6c9d7e1cfef9f21523c2bdb
truffleruby-19.3.1-linux-amd64.tar.gz=c724547a9eacfdd135ce05eac9dcfe74e58a5e77c97f88103f83b8513c15c975a0ecf623f623a425ec81fad1b64d3b5e135660d6943608ad08048cda00eace79
truffleruby-19.3.1-macos-amd64.tar.gz=d746b2ad410c15d145d36c676a070ae454ba8e5ec6c594d5ebcf54b1fc719f98e8b8f71b6fd504c3d38df286bd11c5114f73b5ba39be312b11d42d4ca1a17d02
truffleruby-20.0.0-linux-amd64.tar.gz=4efea5ded5fcc6886befba3a3720fe1e5b2e376d46738565e8871a1ce0201a33ed52e78b8af2fb389618bdea99466d126d8537dd0919b0c13f8ff1940cb3e52e
truffleruby-20.0.0-macos-amd64.tar.gz=b36488330514b77c7115689042cf2482a0beb9f72a0b05fb4c7a6ecb0835a3da47c3b15c41abd6ffced023e65ecf7eabcfbcc6e41901dcddd0fb3dfed46564c6
truffleruby-20.1.0-linux-amd64.tar.gz=116d57404540b85c15b321793a6f985624a2044af544e659b3607e50159703af5d445e22bff28ae2182dfa752f7500d420e250f6deccc98a2f01e89adba8ac3a
truffleruby-20.1.0-macos-amd64.tar.gz=9b1267101dfe78b85c79f7528eb4de96b16933e66d5771efa6272372dac0fb35b199bb9d42773d61f4fa7a15d6cbd18b5753c148f7c3e477c7c4b21633f12b88
truffleruby-20.2.0-linux-amd64.tar.gz=a37eaf8475364b74d948979ac13dc6e6423bf11949ad1d0f2925f78a4495e80de9767001ccdb777c8cfd7f545839fad4d842522620c3acad179404bc4ce6752c
truffleruby-20.2.0-macos-amd64.tar.gz=964c1e02cc53e1646060334a9911771e679a8344d811a0f77d5cae3529dfefff259c45505ac84b7debb958514cd5d2276ffd435802085494e0229dd140ce8f00
truffleruby-20.3.0-linux-amd64.tar.gz=ec2d8ff6a5d45fd7091e26430c67cbbdc0f8ffa41e9ac574d48802766fcd144e1f446db807700247ad6d8046b7ed070b5da70ef667e576d6fea60cc64ea5484f
truffleruby-20.3.0-macos-amd64.tar.gz=1878f94e05a3c40484bf944a72412b179aa5415a16a7ebc1610cb512a1e1c4a2ce0e98685257ad6e5c14745245c35bb5b28205fb687292c4f17193cbfb3bb606
config/known000066400000002062147511530520007075 0ustar00# MRI Rubies
[ruby-]1.8.6[-p420]
[ruby-]1.8.7[-head] # security released on head
[ruby-]1.9.1[-p431]
[ruby-]1.9.2[-p330]
[ruby-]1.9.3[-p551]
[ruby-]2.0.0[-p648]
[ruby-]2.1[.10]
[ruby-]2.2[.10]
[ruby-]2.3[.8]
[ruby-]2.4[.10]
[ruby-]2.5[.8]
[ruby-]2.6[.6]
[ruby-]2.7[.2]
[ruby-]3[.0.0]
ruby-head

# for forks use: rvm install ruby-head-<name> --url https://github.com/github/ruby.git --branch 2.2

# JRuby
jruby-1.6[.8]
jruby-1.7[.27]
jruby-9.1[.17.0]
jruby[-9.2.14.0]
jruby-head

# Rubinius
rbx-1[.4.3]
rbx-2.3[.0]
rbx-2.4[.1]
rbx-2[.5.8]
rbx-3[.107]
rbx-4[.20]
rbx-5[.0]
rbx-head

# TruffleRuby
truffleruby[-20.3.0]

# Opal
opal

# Minimalistic ruby implementation - ISO 30170:2012
mruby-1.0.0
mruby-1.1.0
mruby-1.2.0
mruby-1.3.0
mruby-1[.4.1]
mruby-2.0.1
mruby-2[.1.1]
mruby[-head]

# Ruby Enterprise Edition
ree-1.8.6
ree[-1.8.7][-2012.02]

# Topaz
topaz

# MagLev
maglev-1.0.0
maglev-1.1[RC1]
maglev[-1.2Alpha4]
maglev-head

# Mac OS X Snow Leopard Or Newer
macruby-0.10
macruby-0.11
macruby[-0.12]
macruby-nightly
macruby-head

# IronRuby
ironruby[-1.1.3]
ironruby-head
config/ssh.example000066400000000274147511530520010173 0ustar00Host ubuntu
Port 2220

Host *
HostName localhost
User vboxtest
UserKnownHostsFile /dev/null
StrictHostKeyChecking no
IdentitiesOnly yes
ControlMaster auto
ControlPath /tmp/socket-%r@%h:%p
config/db000066400000013020147511530520006322 0ustar00# General
default_ruby=ruby
interpreter=ruby
niceness=0
#
# RVM
#
rvm_remote_server_path1=maven2/org/jruby/jruby-dist
rvm_remote_server_url1=https://repo1.maven.org
rvm_remote_server_url2=https://rubies.travis-ci.org
rvm_remote_server_url=https://rvm_io.global.ssl.fastly.net/binaries
#
# RubyGems
#
gem_gem-empty_version=>=1.1.2
gem_gem-wrappers_version=>=1.4.0
gem_rdoc_version=>=4.1.1
gem_rvm_version=>=1.11.3.9
rubygems_repo_url=https://github.com/rubygems/rubygems.git
rubygems_url=https://rubygems.org/rubygems
rubygems_url_fallback_1=https://github.com/rubygems/rubygems/archive/v\1.tar.gz
rubygems_url_fallback_1_pattern=https://rubygems.org/rubygems/rubygems-([[:digit:]\.]+).tgz
rubygems_version=latest-3.0
#
# Packages
#
autoconf_url=https://ftp.gnu.org/gnu/autoconf
curl_url=https://github.com/bagder/curl/archive
gettext_url=https://ftp.gnu.org/pub/gnu/gettext
glib_url=http://ftp.gnome.org/pub/gnome/sources/glib/2.23
libiconv_url=https://ftp.gnu.org/pub/gnu/libiconv
libxml2_url=ftp://xmlsoft.org/libxml2
libxslt_url=ftp://xmlsoft.org/libxslt
llvm_url=https://llvm.org/svn/llvm-project/llvm/trunk
mono_url=http://ftp.novell.com/pub/mono/sources/mono
ncurses_url=https://ftp.gnu.org/pub/gnu/ncurses
openssl_url=https://www.openssl.org/source
openssl_version=1.0.1i
pkg-config_url=http://pkgconfig.freedesktop.org/releases
readline_url=https://ftp.gnu.org/gnu/readline
yaml_url=http://pyyaml.org/download/libyaml
yaml_version=0.1.6
zlib_url=https://prdownloads.sourceforge.net/libpng
#
# CentOS / Fedora EPEL
#
epel5_i386_rpm=https://dl.fedoraproject.org/pub/epel/5/i386/epel-release-5-4.noarch.rpm
epel5_key=https://dl.fedoraproject.org/pub/epel/RPM-GPG-KEY-EPEL-5
epel5_x86_64_rpm=https://dl.fedoraproject.org/pub/epel/5/x86_64/epel-release-5-4.noarch.rpm
epel6_i386_rpm=https://dl.fedoraproject.org/pub/epel/6/i386/epel-release-6-8.noarch.rpm
epel6_key=https://dl.fedoraproject.org/pub/epel/RPM-GPG-KEY-EPEL-6
epel6_x86_64_rpm=https://dl.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm
epel7_key=https://dl.fedoraproject.org/pub/epel/RPM-GPG-KEY-EPEL-7
epel7_x86_64_rpm=https://dl.fedoraproject.org/pub/epel/7/x86_64/e/epel-release-7-8.noarch.rpm
#
# MRI Ruby
#
CentOS_5_ruby_1.8.7_patch_level=p374
CentOS_5_ruby_1.8.7_patch_level_warn=Warning, Centos 5 can not build head version of ruby, falling back to latest patchlevel, your ruby will be less secure because of this.
CentOS_5_ruby_1.9.2_patch_level=p320
CentOS_5_ruby_1.9.2_patch_level_warn=Warning, Centos 5 can not build head version of ruby, falling back to latest patchlevel, your ruby will be less secure because of this.
ruby_1.8.4_rubygems_version=1.3.5
ruby_1.8.5_patch_level=p231
ruby_1.8.5_rubygems_version=1.3.5
ruby_1.8.6_patch_level=p420
ruby_1.8.6_rubygems_version=1.3.7
ruby_1.8.7_patch_level=head
ruby_1.8.7_rubygems_version=latest-2.0
ruby_1.9.1_patch_level=p431
ruby_1.9.1_rubygems_version=latest-1.8
ruby_1.9.2_patch_level=p330
ruby_1.9.3_patch_level=p551
ruby_2.0.0_patch_level=p648
ruby_head_rubygems_version=ignore
ruby_repo_url=https://github.com/ruby/ruby.git
ruby_unmaintained_date=2017-04-01
ruby_unmaintained_version=2.1.0
ruby_url=https://cache.ruby-lang.org/pub/ruby
ruby_url_fallback_1=https://ftp.ruby-lang.org/pub/ruby
ruby_version=3.0.0
#
# REE
#
ree_1.8.6_patch_level=20090610
ree_1.8.6_repo_url=https://github.com/FooBarWidget/rubyenterpriseedition.git
ree_1.8.6_rubygems_version=1.3.7
ree_1.8.6_url=http://rubyforge.org/frs/download.php/58677
ree_1.8.7_2010.02_url=https://storage.googleapis.com/google-code-archive-downloads/v2/code.google.com/rubyenterpriseedition/ruby-enterprise-1.8.7-2012.02.tar.gz
ree_1.8.7_patch_level=2012.02
ree_1.8.7_repo_url=https://github.com/FooBarWidget/rubyenterpriseedition187-330
ree_1.8.7_rubygems_version=latest-2.0
ree_1.8.7_url=https://storage.googleapis.com/google-code-archive-downloads/v2/code.google.com/rubyenterpriseedition
ree_configure_flags=--dont-install-useful-gems
ree_version=1.8.7
#
# Rubinius
#
rbx_1.0.0_patch_level=20100514
rbx_1.0.1_patch_level=20100603
rbx_1.1.0_patch_level=20100923
rbx_1.1.1_patch_level=20101116
rbx_1.2.0_patch_level=20101221
rbx_1.2.1_patch_level=20110215
rbx_1.2.2_patch_level=20110222
rbx_1.2.3_patch_level=20110315
rbx_1.2.4_patch_level=20110705
rbx_repo_url=https://github.com/rubinius/rubinius.git
rbx_url=https://s3.amazonaws.com/asset.rubini.us
rbx_url_2.0_and_newer=https://rubinius-releases-rubinius-com.s3.amazonaws.com
rbx_version=4.1
#
# MRuby
#
mruby_repo_url=https://github.com/mruby/mruby.git
mruby_url=https://github.com/mruby/mruby/archive
mruby_version=2.0.1
#
# JRuby
#
jruby_repo_url=https://github.com/jruby/jruby.git
jruby_url=https://repo1.maven.org/maven2/org/jruby/jruby-dist
jruby_version=9.2.9.0
maven_version=3.5.0
#
# TruffleRuby
#
truffleruby_url=https://github.com/oracle/truffleruby/releases/download
truffleruby_version=20.3.0
#
# MacRuby
#
macruby_0.10_url=http://macruby.macosforge.org/files
macruby_nightly_url=http://macruby.jp/files/nightlies
macruby_repo_url=https://github.com/MacRuby/MacRuby.git
macruby_url=https://github.com/downloads/MacRuby/MacRuby
macruby_version=0.12
#
# Maglev
#
maglev_repo_url=https://github.com/MagLev/maglev.git
maglev_url=http://seaside.gemtalksystems.com/maglev
maglev_version=1.2Alpha4
#
# IronRuby
#
ironruby_1.1.3_url=https://download-codeplex.sec.s-msft.com/Download/Release?ProjectName=ironruby&DownloadId=217153&FileTime=129445296766130000&Build=19727
ironruby_repo_url=https://github.com/ironruby/ironruby.git
ironruby_version=1.1.3
#
# Topaz
#
topaz_repo_url=https://github.com/topazproject/topaz.git
topaz_url=https://d3sgc2zfsedosj.cloudfront.net
topaz_version=head
config/displayed-notes.txt000064400000006432147511530520011666 0ustar00  * If you wish to disable the project .rvmrc file functionality, set
    rvm_project_rvmrc=0 in either /etc/rvmrc or ~/.rvmrc.
    then log out and back in.

  * after_use and after_cd hook now supports multiple files with after_*_*
    the custom hooks can be easily turned on/off by:
      chmod +x $rvm_path/hooks/after_cd_[hook_name]
      chmod -x $rvm_path/hooks/after_use_[hook_name]

  * If your shell exits on entering a directory with freshly checked out sources
    you should update .rvmrc file, and replace any `exit ` with `return `.

  * In case you have some old RVM files/rubies in '/usr/local/bin' or '$HOME/bin' feel free to remove them,
    they were copied there because of bug in path detection.

  * Zsh 4.3.15 is buggy, be careful with it, it can break RVM, especially multiuser installations,
    You should consider downgrading Zsh to 4.3.12 which has proven to work more reliable with RVM.

  * Optionally you can run \`rvm tools rvm-env ruby bash\` which will generate
    shebang wrappers for easier selecting ruby in scripts.

  * If you wish to get more default(global) gems installed, install RVM with this flag: --with-gems="pry vagrant"
    this option is remembered, it's enough to use it once.

  * Binary rubies are installed by default if available, you can read about it in help:
      rvm help install
      rvm help mount

  * RVM comes with a set of default gems including 'bundler', 'rake', 'rubygems-bundler' and 'rvm' gems;
    if you do not wish to get these gems, install RVM with this flag: --without-gems="rvm rubygems-bundler"
    this option is remembered, it's enough to use it once.

  * RVM will try to automatically use available package manager, might require `sudo`,
    read more about it in `rvm help autolibs`

  * The default umask for multi-user installation got extended to `umask u=rwx,g=rwx,o=rx`,
    comment it out to avoid automatic updates.

  * If you encounter any issues with a ruby 'X' your best bet is to:
      rvm get head && rvm reinstall X --debug

  * RVM will run 'rvm requirements' by default, to disable run:
      echo rvm_autolibs_flag=0 >> ~/.rvmrc

  * RVM 1.20.12 removes the automated --progress-bar from curl options,
    if you liked this then you can restore this behavior with:

      echo progress-bar >> ~/.curlrc

  * RVM will set first installed ruby as default and use it if run as function.
    To avoid this behavior either use full path to rvm binary or prefix it with `command `.

  * To update RVM loading code run 'rvm get ... --auto-dotfiles'

  * RVM 1.20 changes default behavior of Autolibs to Enabled - if you prefer the 1.19 behavior
    then run "rvm autolibs read-fail", read more details: rvm help autolibs

  * RVM 1.24 changes default package manager on OSX to Homebrew,
    use `rvm autolibs macports` if you prefer Macports.

  * RVM 1.24 changes default `--verify-downloads` flag to `1` you can get the paranoid mode again with:

      echo rvm_verify_downloads_flag=0 >> ~/.rvmrc

  * RVM 1.25 disables default pollution of rvm_path/bin, you still can generate the links using:

      rvm wrapper ruby-name           # or for default:
      rvm wrapper default --no-prefix

  * RVM 1.25.11 'rvm remove' will by default remove gems, to remove only ruby use 'rvm uninstall'

  * RVM 1.30 simplifies behavior of 'rvm wrapper' subcommand

config/remote000066400000301327147511530520007242 0ustar00https://rvm_io.global.ssl.fastly.net/binaries/amazon/2/x86_64/ruby-2.4.0.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/amazon/2/x86_64/ruby-2.4.1.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/amazon/2/x86_64/ruby-2.4.2.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/amazon/2/x86_64/ruby-2.4.3.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/amazon/2/x86_64/ruby-2.4.4.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/amazon/2/x86_64/ruby-2.4.5.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/amazon/2/x86_64/ruby-2.4.6.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/amazon/2/x86_64/ruby-2.4.7.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/amazon/2/x86_64/ruby-2.4.8.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/amazon/2/x86_64/ruby-2.4.9.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/amazon/2/x86_64/ruby-2.4.10.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/amazon/2/x86_64/ruby-2.5.0.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/amazon/2/x86_64/ruby-2.5.1.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/amazon/2/x86_64/ruby-2.5.2.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/amazon/2/x86_64/ruby-2.5.3.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/amazon/2/x86_64/ruby-2.5.4.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/amazon/2/x86_64/ruby-2.5.5.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/amazon/2/x86_64/ruby-2.5.6.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/amazon/2/x86_64/ruby-2.5.7.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/amazon/2/x86_64/ruby-2.5.8.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/amazon/2/x86_64/ruby-2.6.0.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/amazon/2/x86_64/ruby-2.6.1.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/amazon/2/x86_64/ruby-2.6.2.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/amazon/2/x86_64/ruby-2.6.3.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/amazon/2/x86_64/ruby-2.6.4.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/amazon/2/x86_64/ruby-2.6.5.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/amazon/2/x86_64/ruby-2.6.6.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/amazon/2/x86_64/ruby-2.7.0.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/amazon/2/x86_64/ruby-2.7.1.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/amazon/2/x86_64/ruby-2.7.2.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/amazon/2/x86_64/ruby-3.0.0-preview1.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/amazon/2013.03/x86_64/ruby-1.9.3-p448.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/amazon/2013.03/x86_64/ruby-2.0.0-p247.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/amazon/2018.03/x86_64/ruby-2.4.0.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/amazon/2018.03/x86_64/ruby-2.4.1.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/amazon/2018.03/x86_64/ruby-2.4.2.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/amazon/2018.03/x86_64/ruby-2.4.3.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/amazon/2018.03/x86_64/ruby-2.4.4.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/amazon/2018.03/x86_64/ruby-2.4.5.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/amazon/2018.03/x86_64/ruby-2.4.6.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/amazon/2018.03/x86_64/ruby-2.4.7.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/amazon/2018.03/x86_64/ruby-2.4.8.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/amazon/2018.03/x86_64/ruby-2.4.9.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/amazon/2018.03/x86_64/ruby-2.4.10.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/amazon/2018.03/x86_64/ruby-2.5.0.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/amazon/2018.03/x86_64/ruby-2.5.1.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/amazon/2018.03/x86_64/ruby-2.5.2.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/amazon/2018.03/x86_64/ruby-2.5.3.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/amazon/2018.03/x86_64/ruby-2.5.4.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/amazon/2018.03/x86_64/ruby-2.5.5.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/amazon/2018.03/x86_64/ruby-2.5.6.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/amazon/2018.03/x86_64/ruby-2.5.7.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/amazon/2018.03/x86_64/ruby-2.5.8.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/amazon/2018.03/x86_64/ruby-2.6.0.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/amazon/2018.03/x86_64/ruby-2.6.1.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/amazon/2018.03/x86_64/ruby-2.6.2.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/amazon/2018.03/x86_64/ruby-2.6.3.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/amazon/2018.03/x86_64/ruby-2.6.4.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/amazon/2018.03/x86_64/ruby-2.6.5.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/amazon/2018.03/x86_64/ruby-2.6.6.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/amazon/2018.03/x86_64/ruby-2.7.0.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/amazon/2018.03/x86_64/ruby-2.7.1.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/amazon/2018.03/x86_64/ruby-2.7.2.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/amazon/2018.03/x86_64/ruby-3.0.0-preview1.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/arch/libc-2.15/x86_64/ruby-1.9.3-p194.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/arch/libc-2.15/x86_64/ruby-1.9.3-p286.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/arch/libc-2.15/x86_64/ruby-1.9.3-p327.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/arch/libc-2.15/x86_64/ruby-1.9.3-p374.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/arch/libc-2.15/x86_64/ruby-1.9.3-p392.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/arch/libc-2.15/x86_64/ruby-2.0.0-p0.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/centos/5/x86_64/ruby-1.9.3-p286.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/centos/5/x86_64/ruby-1.9.3-p327.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/centos/5/x86_64/ruby-1.9.3-p362.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/centos/5/x86_64/ruby-1.9.3-p374.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/centos/5/x86_64/ruby-1.9.3-p392.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/centos/5/x86_64/ruby-1.9.3-p429.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/centos/5/x86_64/ruby-1.9.3-p448.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/centos/5/x86_64/ruby-1.9.3-p484.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/centos/5/x86_64/ruby-1.9.3-p545.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/centos/5/x86_64/ruby-1.9.3-p547.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/centos/5/x86_64/ruby-1.9.3-p551.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/centos/5/x86_64/ruby-2.0.0-p0.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/centos/5/x86_64/ruby-2.0.0-p195.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/centos/5/x86_64/ruby-2.0.0-p247.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/centos/5/x86_64/ruby-2.0.0-p353.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/centos/5/x86_64/ruby-2.0.0-p451.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/centos/5/x86_64/ruby-2.0.0-p481.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/centos/5/x86_64/ruby-2.0.0-p576.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/centos/5/x86_64/ruby-2.0.0-p598.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/centos/5/x86_64/ruby-2.1.0.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/centos/5/x86_64/ruby-2.1.1.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/centos/5/x86_64/ruby-2.1.2.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/centos/5/x86_64/ruby-2.1.3.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/centos/5/x86_64/ruby-2.1.5.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/centos/5/x86_64/ruby-2.2.0.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/centos/5/x86_64/ruby-2.2.1.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/centos/6/x86_64/ruby-1.9.3-p194.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/centos/6/x86_64/ruby-1.9.3-p286.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/centos/6/x86_64/ruby-1.9.3-p327.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/centos/6/x86_64/ruby-1.9.3-p362.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/centos/6/x86_64/ruby-1.9.3-p392.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/centos/6/x86_64/ruby-1.9.3-p429.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/centos/6/x86_64/ruby-1.9.3-p448.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/centos/6/x86_64/ruby-1.9.3-p484.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/centos/6/x86_64/ruby-1.9.3-p547.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/centos/6/x86_64/ruby-1.9.3-p551.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/centos/6/x86_64/ruby-2.0.0-p0.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/centos/6/x86_64/ruby-2.0.0-p195.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/centos/6/x86_64/ruby-2.0.0-p247.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/centos/6/x86_64/ruby-2.0.0-p353.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/centos/6/x86_64/ruby-2.0.0-p481.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/centos/6/x86_64/ruby-2.0.0-p576.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/centos/6/x86_64/ruby-2.0.0-p598.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/centos/6/x86_64/ruby-2.1.0.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/centos/6/x86_64/ruby-2.1.2.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/centos/6/x86_64/ruby-2.1.3.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/centos/6/x86_64/ruby-2.1.5.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/centos/6/x86_64/ruby-2.2.0.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/centos/6/x86_64/ruby-2.2.1.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/centos/6/x86_64/ruby-2.3.1.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/centos/6/x86_64/ruby-2.4.0.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/centos/6/x86_64/ruby-2.4.1.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/centos/6/x86_64/ruby-2.4.2.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/centos/6/x86_64/ruby-2.4.3.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/centos/6/x86_64/ruby-2.4.4.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/centos/6/x86_64/ruby-2.4.5.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/centos/6/x86_64/ruby-2.4.6.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/centos/6/x86_64/ruby-2.4.7.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/centos/6/x86_64/ruby-2.4.8.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/centos/6/x86_64/ruby-2.4.9.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/centos/6/x86_64/ruby-2.4.10.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/centos/6/x86_64/ruby-2.5.0.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/centos/6/x86_64/ruby-2.5.1.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/centos/6/x86_64/ruby-2.5.2.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/centos/6/x86_64/ruby-2.5.3.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/centos/6/x86_64/ruby-2.5.4.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/centos/6/x86_64/ruby-2.5.5.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/centos/6/x86_64/ruby-2.5.6.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/centos/6/x86_64/ruby-2.5.7.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/centos/6/x86_64/ruby-2.5.8.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/centos/6/x86_64/ruby-2.6.0.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/centos/6/x86_64/ruby-2.6.1.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/centos/6/x86_64/ruby-2.6.2.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/centos/6/x86_64/ruby-2.6.3.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/centos/6/x86_64/ruby-2.6.4.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/centos/6/x86_64/ruby-2.6.5.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/centos/6/x86_64/ruby-2.6.6.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/centos/6/x86_64/ruby-2.7.0.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/centos/6/x86_64/ruby-2.7.1.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/centos/6/x86_64/ruby-2.7.2.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/centos/7/x86_64/ruby-2.4.0.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/centos/7/x86_64/ruby-2.4.1.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/centos/7/x86_64/ruby-2.4.2.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/centos/7/x86_64/ruby-2.4.3.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/centos/7/x86_64/ruby-2.4.4.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/centos/7/x86_64/ruby-2.4.5.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/centos/7/x86_64/ruby-2.4.6.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/centos/7/x86_64/ruby-2.4.7.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/centos/7/x86_64/ruby-2.4.8.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/centos/7/x86_64/ruby-2.4.9.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/centos/7/x86_64/ruby-2.4.10.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/centos/7/x86_64/ruby-2.5.0.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/centos/7/x86_64/ruby-2.5.1.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/centos/7/x86_64/ruby-2.5.2.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/centos/7/x86_64/ruby-2.5.3.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/centos/7/x86_64/ruby-2.5.4.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/centos/7/x86_64/ruby-2.5.5.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/centos/7/x86_64/ruby-2.5.6.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/centos/7/x86_64/ruby-2.5.7.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/centos/7/x86_64/ruby-2.5.8.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/centos/7/x86_64/ruby-2.6.0.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/centos/7/x86_64/ruby-2.6.1.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/centos/7/x86_64/ruby-2.6.2.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/centos/7/x86_64/ruby-2.6.3.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/centos/7/x86_64/ruby-2.6.4.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/centos/7/x86_64/ruby-2.6.5.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/centos/7/x86_64/ruby-2.6.6.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/centos/7/x86_64/ruby-2.7.0.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/centos/7/x86_64/ruby-2.7.1.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/centos/7/x86_64/ruby-2.7.2.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/centos/7/x86_64/ruby-3.0.0-preview1.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/centos/8/x86_64/ruby-2.4.0.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/centos/8/x86_64/ruby-2.4.1.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/centos/8/x86_64/ruby-2.4.2.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/centos/8/x86_64/ruby-2.4.3.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/centos/8/x86_64/ruby-2.4.4.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/centos/8/x86_64/ruby-2.4.5.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/centos/8/x86_64/ruby-2.4.6.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/centos/8/x86_64/ruby-2.4.7.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/centos/8/x86_64/ruby-2.4.8.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/centos/8/x86_64/ruby-2.4.9.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/centos/8/x86_64/ruby-2.4.10.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/centos/8/x86_64/ruby-2.5.0.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/centos/8/x86_64/ruby-2.5.1.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/centos/8/x86_64/ruby-2.5.2.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/centos/8/x86_64/ruby-2.5.3.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/centos/8/x86_64/ruby-2.5.4.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/centos/8/x86_64/ruby-2.5.5.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/centos/8/x86_64/ruby-2.5.6.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/centos/8/x86_64/ruby-2.5.7.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/centos/8/x86_64/ruby-2.5.8.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/centos/8/x86_64/ruby-2.6.0.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/centos/8/x86_64/ruby-2.6.1.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/centos/8/x86_64/ruby-2.6.2.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/centos/8/x86_64/ruby-2.6.3.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/centos/8/x86_64/ruby-2.6.4.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/centos/8/x86_64/ruby-2.6.5.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/centos/8/x86_64/ruby-2.6.6.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/centos/8/x86_64/ruby-2.7.0.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/centos/8/x86_64/ruby-2.7.1.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/centos/8/x86_64/ruby-2.7.2.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/centos/8/x86_64/ruby-3.0.0-preview1.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/debian/6/i386/ruby-1.9.3-p429.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/debian/6/i386/ruby-1.9.3-p448.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/debian/6/i386/ruby-2.0.0-p195.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/debian/6/i386/ruby-2.0.0-p247.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/debian/6/x86_64/ruby-1.9.3-p194.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/debian/6/x86_64/ruby-1.9.3-p286.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/debian/6/x86_64/ruby-1.9.3-p327.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/debian/6/x86_64/ruby-1.9.3-p362.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/debian/6/x86_64/ruby-1.9.3-p374.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/debian/6/x86_64/ruby-1.9.3-p392.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/debian/6/x86_64/ruby-1.9.3-p429.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/debian/6/x86_64/ruby-1.9.3-p448.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/debian/6/x86_64/ruby-2.0.0-p0.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/debian/6/x86_64/ruby-2.0.0-p195.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/debian/6/x86_64/ruby-2.0.0-p247.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/debian/7/armhf/ruby-1.9.3-p362.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/debian/7/armhf/ruby-1.9.3-p392.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/debian/7/armhf/ruby-1.9.3-p448.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/debian/7/armhf/ruby-2.0.0-p0.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/debian/7/armhf/ruby-2.0.0-p247.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/debian/7/i386/ruby-1.9.3-p429.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/debian/7/i386/ruby-1.9.3-p448.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/debian/7/i386/ruby-1.9.3-p484.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/debian/7/i386/ruby-1.9.3-p545.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/debian/7/i386/ruby-1.9.3-p547.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/debian/7/i386/ruby-1.9.3-p551.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/debian/7/i386/ruby-2.0.0-p195.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/debian/7/i386/ruby-2.0.0-p247.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/debian/7/i386/ruby-2.0.0-p353.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/debian/7/i386/ruby-2.0.0-p451.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/debian/7/i386/ruby-2.0.0-p481.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/debian/7/i386/ruby-2.0.0-p576.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/debian/7/i386/ruby-2.0.0-p598.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/debian/7/i386/ruby-2.1.0.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/debian/7/i386/ruby-2.1.1.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/debian/7/i386/ruby-2.1.2.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/debian/7/i386/ruby-2.1.3.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/debian/7/i386/ruby-2.1.5.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/debian/7/i386/ruby-2.2.0.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/debian/7/i386/ruby-2.2.1.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/debian/7/x86_64/ruby-1.9.3-p194.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/debian/7/x86_64/ruby-1.9.3-p286.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/debian/7/x86_64/ruby-1.9.3-p374.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/debian/7/x86_64/ruby-1.9.3-p392.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/debian/7/x86_64/ruby-1.9.3-p429.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/debian/7/x86_64/ruby-1.9.3-p448.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/debian/7/x86_64/ruby-1.9.3-p484.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/debian/7/x86_64/ruby-1.9.3-p545.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/debian/7/x86_64/ruby-1.9.3-p547.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/debian/7/x86_64/ruby-1.9.3-p551.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/debian/7/x86_64/ruby-2.0.0-p0.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/debian/7/x86_64/ruby-2.0.0-p195.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/debian/7/x86_64/ruby-2.0.0-p247.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/debian/7/x86_64/ruby-2.0.0-p353.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/debian/7/x86_64/ruby-2.0.0-p451.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/debian/7/x86_64/ruby-2.0.0-p481.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/debian/7/x86_64/ruby-2.0.0-p576.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/debian/7/x86_64/ruby-2.0.0-p598.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/debian/7/x86_64/ruby-2.1.0.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/debian/7/x86_64/ruby-2.1.1.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/debian/7/x86_64/ruby-2.1.2.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/debian/7/x86_64/ruby-2.1.3.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/debian/7/x86_64/ruby-2.1.5.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/debian/7/x86_64/ruby-2.2.0.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/debian/7/x86_64/ruby-2.2.1.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/debian/8/x86_64/ruby-1.9.3-p547.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/debian/8/x86_64/ruby-1.9.3-p551.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/debian/8/x86_64/ruby-2.0.0-p353.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/debian/8/x86_64/ruby-2.0.0-p481.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/debian/8/x86_64/ruby-2.0.0-p576.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/debian/8/x86_64/ruby-2.0.0-p598.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/debian/8/x86_64/ruby-2.1.0.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/debian/8/x86_64/ruby-2.1.2.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/debian/8/x86_64/ruby-2.1.3.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/debian/8/x86_64/ruby-2.1.5.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/debian/8/x86_64/ruby-2.2.0.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/debian/8/x86_64/ruby-2.2.1.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/debian/8/x86_64/ruby-2.2.6.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/debian/8/x86_64/ruby-2.3.0.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/debian/8/x86_64/ruby-2.3.1.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/debian/8/x86_64/ruby-2.3.2.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/debian/8/x86_64/ruby-2.3.3.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/debian/8/x86_64/ruby-2.4.0.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/debian/8/x86_64/ruby-2.4.1.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/debian/8/x86_64/ruby-2.4.2.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/debian/8/x86_64/ruby-2.4.3.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/debian/8/x86_64/ruby-2.4.4.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/debian/8/x86_64/ruby-2.4.5.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/debian/8/x86_64/ruby-2.4.6.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/debian/8/x86_64/ruby-2.4.7.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/debian/8/x86_64/ruby-2.4.8.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/debian/8/x86_64/ruby-2.4.9.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/debian/8/x86_64/ruby-2.4.10.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/debian/8/x86_64/ruby-2.5.0.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/debian/8/x86_64/ruby-2.5.1.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/debian/8/x86_64/ruby-2.5.2.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/debian/8/x86_64/ruby-2.5.3.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/debian/8/x86_64/ruby-2.5.4.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/debian/8/x86_64/ruby-2.5.5.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/debian/8/x86_64/ruby-2.5.6.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/debian/8/x86_64/ruby-2.5.7.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/debian/8/x86_64/ruby-2.5.8.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/debian/8/x86_64/ruby-2.6.0.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/debian/8/x86_64/ruby-2.6.1.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/debian/8/x86_64/ruby-2.6.2.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/debian/8/x86_64/ruby-2.6.3.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/debian/8/x86_64/ruby-2.6.4.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/debian/8/x86_64/ruby-2.6.5.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/debian/8/x86_64/ruby-2.6.6.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/debian/8/x86_64/ruby-2.7.0.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/debian/8/x86_64/ruby-2.7.1.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/debian/8/x86_64/ruby-2.7.2.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/debian/8/x86_64/ruby-3.0.0-preview1.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/debian/9/x86_64/ruby-2.4.0.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/debian/9/x86_64/ruby-2.4.1.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/debian/9/x86_64/ruby-2.4.2.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/debian/9/x86_64/ruby-2.4.3.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/debian/9/x86_64/ruby-2.4.4.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/debian/9/x86_64/ruby-2.4.5.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/debian/9/x86_64/ruby-2.4.6.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/debian/9/x86_64/ruby-2.4.7.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/debian/9/x86_64/ruby-2.4.8.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/debian/9/x86_64/ruby-2.4.9.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/debian/9/x86_64/ruby-2.4.10.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/debian/9/x86_64/ruby-2.5.0.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/debian/9/x86_64/ruby-2.5.1.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/debian/9/x86_64/ruby-2.5.2.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/debian/9/x86_64/ruby-2.5.3.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/debian/9/x86_64/ruby-2.5.4.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/debian/9/x86_64/ruby-2.5.5.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/debian/9/x86_64/ruby-2.5.6.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/debian/9/x86_64/ruby-2.5.7.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/debian/9/x86_64/ruby-2.5.8.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/debian/9/x86_64/ruby-2.6.0.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/debian/9/x86_64/ruby-2.6.1.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/debian/9/x86_64/ruby-2.6.2.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/debian/9/x86_64/ruby-2.6.3.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/debian/9/x86_64/ruby-2.6.4.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/debian/9/x86_64/ruby-2.6.5.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/debian/9/x86_64/ruby-2.6.6.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/debian/9/x86_64/ruby-2.7.0.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/debian/9/x86_64/ruby-2.7.1.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/debian/9/x86_64/ruby-2.7.2.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/debian/9/x86_64/ruby-3.0.0-preview1.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/debian/10/x86_64/ruby-2.4.0.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/debian/10/x86_64/ruby-2.4.1.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/debian/10/x86_64/ruby-2.4.2.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/debian/10/x86_64/ruby-2.4.3.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/debian/10/x86_64/ruby-2.4.4.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/debian/10/x86_64/ruby-2.4.5.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/debian/10/x86_64/ruby-2.4.6.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/debian/10/x86_64/ruby-2.4.7.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/debian/10/x86_64/ruby-2.4.8.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/debian/10/x86_64/ruby-2.4.9.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/debian/10/x86_64/ruby-2.4.10.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/debian/10/x86_64/ruby-2.5.0.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/debian/10/x86_64/ruby-2.5.1.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/debian/10/x86_64/ruby-2.5.2.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/debian/10/x86_64/ruby-2.5.3.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/debian/10/x86_64/ruby-2.5.4.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/debian/10/x86_64/ruby-2.5.5.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/debian/10/x86_64/ruby-2.5.6.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/debian/10/x86_64/ruby-2.5.7.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/debian/10/x86_64/ruby-2.5.8.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/debian/10/x86_64/ruby-2.6.0.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/debian/10/x86_64/ruby-2.6.1.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/debian/10/x86_64/ruby-2.6.2.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/debian/10/x86_64/ruby-2.6.3.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/debian/10/x86_64/ruby-2.6.4.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/debian/10/x86_64/ruby-2.6.5.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/debian/10/x86_64/ruby-2.6.6.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/debian/10/x86_64/ruby-2.7.0.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/debian/10/x86_64/ruby-2.7.1.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/debian/10/x86_64/ruby-2.7.2.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/debian/10/x86_64/ruby-3.0.0-preview1.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/fedora/17/x86_64/ruby-1.9.3-p429.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/fedora/17/x86_64/ruby-1.9.3-p448.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/fedora/17/x86_64/ruby-2.0.0-p195.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/fedora/17/x86_64/ruby-2.0.0-p247.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/fedora/18/x86_64/ruby-1.9.3-p429.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/fedora/18/x86_64/ruby-1.9.3-p448.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/fedora/18/x86_64/ruby-1.9.3-p484.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/fedora/18/x86_64/ruby-2.0.0-p195.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/fedora/18/x86_64/ruby-2.0.0-p247.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/fedora/18/x86_64/ruby-2.0.0-p353.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/fedora/18/x86_64/ruby-2.1.0.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/fedora/19/x86_64/ruby-1.9.3-p448.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/fedora/19/x86_64/ruby-1.9.3-p484.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/fedora/19/x86_64/ruby-1.9.3-p545.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/fedora/19/x86_64/ruby-1.9.3-p547.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/fedora/19/x86_64/ruby-1.9.3-p551.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/fedora/19/x86_64/ruby-2.0.0-p247.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/fedora/19/x86_64/ruby-2.0.0-p353.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/fedora/19/x86_64/ruby-2.0.0-p451.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/fedora/19/x86_64/ruby-2.0.0-p481.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/fedora/19/x86_64/ruby-2.0.0-p576.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/fedora/19/x86_64/ruby-2.0.0-p598.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/fedora/19/x86_64/ruby-2.1.0.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/fedora/19/x86_64/ruby-2.1.1.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/fedora/19/x86_64/ruby-2.1.2.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/fedora/19/x86_64/ruby-2.1.3.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/fedora/19/x86_64/ruby-2.1.5.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/fedora/19/x86_64/ruby-2.2.0.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/fedora/19/x86_64/ruby-2.2.1.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/fedora/20/x86_64/ruby-1.9.3-p547.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/fedora/20/x86_64/ruby-1.9.3-p551.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/fedora/20/x86_64/ruby-2.0.0-p481.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/fedora/20/x86_64/ruby-2.0.0-p576.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/fedora/20/x86_64/ruby-2.0.0-p598.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/fedora/20/x86_64/ruby-2.1.2.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/fedora/20/x86_64/ruby-2.1.3.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/fedora/20/x86_64/ruby-2.1.5.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/fedora/20/x86_64/ruby-2.2.0.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/fedora/20/x86_64/ruby-2.2.1.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/fedora/21/x86_64/ruby-1.9.3-p551.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/fedora/21/x86_64/ruby-2.0.0-p598.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/fedora/21/x86_64/ruby-2.1.5.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/fedora/21/x86_64/ruby-2.2.0.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/fedora/21/x86_64/ruby-2.2.1.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/opensuse/12.1/x86_64/ruby-1.9.3-p194.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/opensuse/12.1/x86_64/ruby-1.9.3-p286.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/opensuse/12.1/x86_64/ruby-1.9.3-p374.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/opensuse/12.1/x86_64/ruby-1.9.3-p392.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/opensuse/12.1/x86_64/ruby-2.0.0-p0.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/opensuse/12.2/x86_64/ruby-1.9.3-p194.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/opensuse/12.2/x86_64/ruby-1.9.3-p286.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/opensuse/12.2/x86_64/ruby-1.9.3-p327.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/opensuse/12.2/x86_64/ruby-1.9.3-p362.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/opensuse/12.2/x86_64/ruby-1.9.3-p374.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/opensuse/12.2/x86_64/ruby-1.9.3-p385.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/opensuse/12.2/x86_64/ruby-1.9.3-p392.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/opensuse/12.2/x86_64/ruby-2.0.0-p0.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/opensuse/12.3/x86_64/ruby-1.9.3-p392.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/opensuse/12.3/x86_64/ruby-1.9.3-p429.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/opensuse/12.3/x86_64/ruby-1.9.3-p448.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/opensuse/12.3/x86_64/ruby-1.9.3-p484.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/opensuse/12.3/x86_64/ruby-1.9.3-p545.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/opensuse/12.3/x86_64/ruby-1.9.3-p547.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/opensuse/12.3/x86_64/ruby-1.9.3-p551.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/opensuse/12.3/x86_64/ruby-2.0.0-p0.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/opensuse/12.3/x86_64/ruby-2.0.0-p195.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/opensuse/12.3/x86_64/ruby-2.0.0-p247.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/opensuse/12.3/x86_64/ruby-2.0.0-p353.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/opensuse/12.3/x86_64/ruby-2.0.0-p451.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/opensuse/12.3/x86_64/ruby-2.0.0-p481.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/opensuse/12.3/x86_64/ruby-2.0.0-p576.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/opensuse/12.3/x86_64/ruby-2.0.0-p598.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/opensuse/12.3/x86_64/ruby-2.1.0.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/opensuse/12.3/x86_64/ruby-2.1.1.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/opensuse/12.3/x86_64/ruby-2.1.2.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/opensuse/12.3/x86_64/ruby-2.1.3.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/opensuse/12.3/x86_64/ruby-2.1.5.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/opensuse/12.3/x86_64/ruby-2.2.0.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/opensuse/12.3/x86_64/ruby-2.2.1.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/opensuse/13.1/x86_64/ruby-1.9.3-p551.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/opensuse/13.1/x86_64/ruby-2.0.0-p576.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/opensuse/13.1/x86_64/ruby-2.0.0-p598.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/opensuse/13.1/x86_64/ruby-2.1.3.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/opensuse/13.1/x86_64/ruby-2.1.5.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/opensuse/13.1/x86_64/ruby-2.2.0.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/opensuse/13.1/x86_64/ruby-2.2.1.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.7/x86_64/ruby-2.0.0-p451.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.7/x86_64/ruby-2.0.0-p481.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.7/x86_64/ruby-2.0.0-p576.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.7/x86_64/ruby-2.0.0-p594.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.7/x86_64/ruby-2.0.0-p598.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.7/x86_64/ruby-2.0.0-p643.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.7/x86_64/ruby-2.0.0-p645.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.7/x86_64/ruby-2.0.0-p647.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.7/x86_64/ruby-2.1.0.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.7/x86_64/ruby-2.1.1.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.7/x86_64/ruby-2.1.2.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.7/x86_64/ruby-2.1.3.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.7/x86_64/ruby-2.1.4.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.7/x86_64/ruby-2.1.5.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.7/x86_64/ruby-2.1.6.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.7/x86_64/ruby-2.1.7.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.7/x86_64/ruby-2.2.0.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.7/x86_64/ruby-2.2.1.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.7/x86_64/ruby-2.2.2.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.7/x86_64/ruby-2.2.3.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.8/x86_64/ruby-2.0.0-p451.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.8/x86_64/ruby-2.0.0-p481.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.8/x86_64/ruby-2.0.0-p576.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.8/x86_64/ruby-2.0.0-p594.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.8/x86_64/ruby-2.0.0-p598.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.8/x86_64/ruby-2.0.0-p643.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.8/x86_64/ruby-2.0.0-p645.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.8/x86_64/ruby-2.0.0-p647.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.8/x86_64/ruby-2.1.0.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.8/x86_64/ruby-2.1.1.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.8/x86_64/ruby-2.1.2.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.8/x86_64/ruby-2.1.3.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.8/x86_64/ruby-2.1.4.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.8/x86_64/ruby-2.1.5.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.8/x86_64/ruby-2.1.6.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.8/x86_64/ruby-2.1.7.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.8/x86_64/ruby-2.2.0.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.8/x86_64/ruby-2.2.1.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.8/x86_64/ruby-2.2.2.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.8/x86_64/ruby-2.2.3.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.9/x86_64/ruby-2.0.0-p451.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.9/x86_64/ruby-2.0.0-p481.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.9/x86_64/ruby-2.0.0-p576.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.9/x86_64/ruby-2.0.0-p594.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.9/x86_64/ruby-2.0.0-p598.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.9/x86_64/ruby-2.0.0-p643.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.9/x86_64/ruby-2.0.0-p645.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.9/x86_64/ruby-2.0.0-p647.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.9/x86_64/ruby-2.1.0.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.9/x86_64/ruby-2.1.1.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.9/x86_64/ruby-2.1.2.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.9/x86_64/ruby-2.1.3.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.9/x86_64/ruby-2.1.4.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.9/x86_64/ruby-2.1.5.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.9/x86_64/ruby-2.1.6.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.9/x86_64/ruby-2.1.7.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.9/x86_64/ruby-2.2.0.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.9/x86_64/ruby-2.2.1.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.9/x86_64/ruby-2.2.2.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.9/x86_64/ruby-2.2.3.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/oracle/7/x86_64/ruby-2.4.0.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/oracle/7/x86_64/ruby-2.4.1.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/oracle/7/x86_64/ruby-2.4.2.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/oracle/7/x86_64/ruby-2.4.3.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/oracle/7/x86_64/ruby-2.4.4.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/oracle/7/x86_64/ruby-2.4.5.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/oracle/7/x86_64/ruby-2.4.6.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/oracle/7/x86_64/ruby-2.4.7.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/oracle/7/x86_64/ruby-2.4.8.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/oracle/7/x86_64/ruby-2.4.9.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/oracle/7/x86_64/ruby-2.4.10.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/oracle/7/x86_64/ruby-2.5.0.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/oracle/7/x86_64/ruby-2.5.1.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/oracle/7/x86_64/ruby-2.5.2.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/oracle/7/x86_64/ruby-2.5.3.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/oracle/7/x86_64/ruby-2.5.4.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/oracle/7/x86_64/ruby-2.5.5.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/oracle/7/x86_64/ruby-2.5.6.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/oracle/7/x86_64/ruby-2.5.7.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/oracle/7/x86_64/ruby-2.5.8.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/oracle/7/x86_64/ruby-2.6.0.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/oracle/7/x86_64/ruby-2.6.1.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/oracle/7/x86_64/ruby-2.6.2.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/oracle/7/x86_64/ruby-2.6.3.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/oracle/7/x86_64/ruby-2.6.4.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/oracle/7/x86_64/ruby-2.6.5.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/oracle/7/x86_64/ruby-2.6.6.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/oracle/7/x86_64/ruby-2.7.0.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/oracle/7/x86_64/ruby-2.7.1.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/oracle/7/x86_64/ruby-2.7.2.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/oracle/7/x86_64/ruby-3.0.0-preview1.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.10/x86_64/ruby-2.0.0-p451.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.10/x86_64/ruby-2.0.0-p481.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.10/x86_64/ruby-2.0.0-p576.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.10/x86_64/ruby-2.0.0-p594.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.10/x86_64/ruby-2.0.0-p598.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.10/x86_64/ruby-2.0.0-p643.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.10/x86_64/ruby-2.0.0-p645.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.10/x86_64/ruby-2.0.0-p647.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.10/x86_64/ruby-2.1.0.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.10/x86_64/ruby-2.1.1.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.10/x86_64/ruby-2.1.2.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.10/x86_64/ruby-2.1.3.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.10/x86_64/ruby-2.1.4.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.10/x86_64/ruby-2.1.5.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.10/x86_64/ruby-2.1.6.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.10/x86_64/ruby-2.1.7.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.10/x86_64/ruby-2.2.0.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.10/x86_64/ruby-2.2.1.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.10/x86_64/ruby-2.2.2.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.10/x86_64/ruby-2.2.3.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.11/x86_64/ruby-2.0.0-p451.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.11/x86_64/ruby-2.0.0-p481.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.11/x86_64/ruby-2.0.0-p576.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.11/x86_64/ruby-2.0.0-p594.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.11/x86_64/ruby-2.0.0-p598.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.11/x86_64/ruby-2.0.0-p643.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.11/x86_64/ruby-2.0.0-p645.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.11/x86_64/ruby-2.0.0-p647.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.11/x86_64/ruby-2.0.0-p648.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.11/x86_64/ruby-2.1.0.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.11/x86_64/ruby-2.1.1.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.11/x86_64/ruby-2.1.2.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.11/x86_64/ruby-2.1.3.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.11/x86_64/ruby-2.1.4.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.11/x86_64/ruby-2.1.5.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.11/x86_64/ruby-2.1.6.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.11/x86_64/ruby-2.1.7.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.11/x86_64/ruby-2.1.8.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.11/x86_64/ruby-2.1.9.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.11/x86_64/ruby-2.1.10.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.11/x86_64/ruby-2.2.0.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.11/x86_64/ruby-2.2.1.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.11/x86_64/ruby-2.2.2.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.11/x86_64/ruby-2.2.3.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.11/x86_64/ruby-2.2.4.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.11/x86_64/ruby-2.2.5.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.12/x86_64/ruby-2.0.0-p451.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.12/x86_64/ruby-2.0.0-p481.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.12/x86_64/ruby-2.0.0-p576.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.12/x86_64/ruby-2.0.0-p594.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.12/x86_64/ruby-2.0.0-p598.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.12/x86_64/ruby-2.0.0-p643.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.12/x86_64/ruby-2.0.0-p645.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.12/x86_64/ruby-2.0.0-p647.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.12/x86_64/ruby-2.1.0.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.12/x86_64/ruby-2.1.1.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.12/x86_64/ruby-2.1.2.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.12/x86_64/ruby-2.1.3.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.12/x86_64/ruby-2.1.4.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.12/x86_64/ruby-2.1.5.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.12/x86_64/ruby-2.1.6.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.12/x86_64/ruby-2.1.7.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.12/x86_64/ruby-2.2.0.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.12/x86_64/ruby-2.2.1.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.12/x86_64/ruby-2.2.2.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.12/x86_64/ruby-2.2.3.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.12/x86_64/ruby-2.2.5.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/10.04/i386/ruby-1.9.3-p194.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/10.04/i386/ruby-1.9.3-p286.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/10.04/i386/ruby-1.9.3-p327.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/10.04/i386/ruby-1.9.3-p362.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/10.04/i386/ruby-1.9.3-p374.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/10.04/i386/ruby-1.9.3-p392.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/10.04/i386/ruby-1.9.3-p429.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/10.04/i386/ruby-1.9.3-p448.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/10.04/i386/ruby-1.9.3-p484.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/10.04/i386/ruby-1.9.3-p545.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/10.04/i386/ruby-1.9.3-p547.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/10.04/i386/ruby-1.9.3-p551.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/10.04/i386/ruby-2.0.0-p0.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/10.04/i386/ruby-2.0.0-p195.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/10.04/i386/ruby-2.0.0-p247.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/10.04/i386/ruby-2.0.0-p353.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/10.04/i386/ruby-2.0.0-p451.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/10.04/i386/ruby-2.0.0-p481.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/10.04/i386/ruby-2.0.0-p576.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/10.04/i386/ruby-2.0.0-p598.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/10.04/i386/ruby-2.1.0.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/10.04/i386/ruby-2.1.1.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/10.04/i386/ruby-2.1.2.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/10.04/i386/ruby-2.1.3.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/10.04/i386/ruby-2.1.5.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/10.04/i386/ruby-2.2.0.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/10.04/i386/ruby-2.2.1.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/10.04/x86_64/ruby-1.9.3-p194.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/10.04/x86_64/ruby-1.9.3-p286.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/10.04/x86_64/ruby-1.9.3-p327.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/10.04/x86_64/ruby-1.9.3-p362.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/10.04/x86_64/ruby-1.9.3-p374.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/10.04/x86_64/ruby-1.9.3-p392.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/10.04/x86_64/ruby-1.9.3-p429.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/10.04/x86_64/ruby-1.9.3-p448.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/10.04/x86_64/ruby-1.9.3-p484.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/10.04/x86_64/ruby-1.9.3-p545.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/10.04/x86_64/ruby-1.9.3-p547.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/10.04/x86_64/ruby-1.9.3-p551.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/10.04/x86_64/ruby-2.0.0-p0.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/10.04/x86_64/ruby-2.0.0-p195.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/10.04/x86_64/ruby-2.0.0-p247.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/10.04/x86_64/ruby-2.0.0-p353.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/10.04/x86_64/ruby-2.0.0-p451.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/10.04/x86_64/ruby-2.0.0-p481.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/10.04/x86_64/ruby-2.0.0-p576.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/10.04/x86_64/ruby-2.0.0-p598.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/10.04/x86_64/ruby-2.1.0.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/10.04/x86_64/ruby-2.1.1.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/10.04/x86_64/ruby-2.1.2.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/10.04/x86_64/ruby-2.1.3.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/10.04/x86_64/ruby-2.1.5.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/10.04/x86_64/ruby-2.2.0.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/10.04/x86_64/ruby-2.2.1.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/11.10/x86_64/ruby-1.9.3-p194.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/11.10/x86_64/ruby-1.9.3-p286.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/11.10/x86_64/ruby-1.9.3-p327.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/11.10/x86_64/ruby-1.9.3-p362.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/11.10/x86_64/ruby-1.9.3-p374.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/11.10/x86_64/ruby-1.9.3-p392.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/11.10/x86_64/ruby-2.0.0-p0.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.04/i386/ruby-1.9.3-p194.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.04/i386/ruby-1.9.3-p286.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.04/i386/ruby-1.9.3-p327.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.04/i386/ruby-1.9.3-p362.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.04/i386/ruby-1.9.3-p374.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.04/i386/ruby-1.9.3-p392.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.04/i386/ruby-1.9.3-p429.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.04/i386/ruby-1.9.3-p448.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.04/i386/ruby-1.9.3-p484.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.04/i386/ruby-1.9.3-p545.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.04/i386/ruby-1.9.3-p547.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.04/i386/ruby-1.9.3-p551.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.04/i386/ruby-2.0.0-p0.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.04/i386/ruby-2.0.0-p195.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.04/i386/ruby-2.0.0-p247.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.04/i386/ruby-2.0.0-p353.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.04/i386/ruby-2.0.0-p451.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.04/i386/ruby-2.0.0-p481.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.04/i386/ruby-2.0.0-p576.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.04/i386/ruby-2.0.0-p598.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.04/i386/ruby-2.1.0.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.04/i386/ruby-2.1.1.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.04/i386/ruby-2.1.2.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.04/i386/ruby-2.1.3.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.04/i386/ruby-2.1.5.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.04/i386/ruby-2.2.0.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.04/i386/ruby-2.2.1.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.04/x86_64/ruby-1.9.3-p194.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.04/x86_64/ruby-1.9.3-p286.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.04/x86_64/ruby-1.9.3-p327.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.04/x86_64/ruby-1.9.3-p362.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.04/x86_64/ruby-1.9.3-p374.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.04/x86_64/ruby-1.9.3-p392.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.04/x86_64/ruby-1.9.3-p429.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.04/x86_64/ruby-1.9.3-p448.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.04/x86_64/ruby-1.9.3-p484.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.04/x86_64/ruby-1.9.3-p547.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.04/x86_64/ruby-1.9.3-p551.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.04/x86_64/ruby-2.0.0-p0.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.04/x86_64/ruby-2.0.0-p195.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.04/x86_64/ruby-2.0.0-p247.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.04/x86_64/ruby-2.0.0-p353.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.04/x86_64/ruby-2.0.0-p481.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.04/x86_64/ruby-2.0.0-p576.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.04/x86_64/ruby-2.0.0-p598.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.04/x86_64/ruby-2.1.0.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.04/x86_64/ruby-2.1.2.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.04/x86_64/ruby-2.1.3.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.04/x86_64/ruby-2.1.5.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.04/x86_64/ruby-2.2.0.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.04/x86_64/ruby-2.2.1.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.04/x86_64/ruby-2.4.0.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.04/x86_64/ruby-2.4.1.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.04/x86_64/ruby-2.4.2.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.04/x86_64/ruby-2.4.3.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.04/x86_64/ruby-2.4.4.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.04/x86_64/ruby-2.4.5.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.04/x86_64/ruby-2.4.6.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.04/x86_64/ruby-2.4.7.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.04/x86_64/ruby-2.4.8.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.04/x86_64/ruby-2.4.9.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.04/x86_64/ruby-2.4.10.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.04/x86_64/ruby-2.5.0.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.04/x86_64/ruby-2.5.1.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.04/x86_64/ruby-2.5.2.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.04/x86_64/ruby-2.5.3.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.04/x86_64/ruby-2.5.4.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.04/x86_64/ruby-2.5.5.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.04/x86_64/ruby-2.5.6.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.04/x86_64/ruby-2.5.7.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.04/x86_64/ruby-2.5.8.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.04/x86_64/ruby-2.6.0.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.04/x86_64/ruby-2.6.1.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.04/x86_64/ruby-2.6.2.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.04/x86_64/ruby-2.6.3.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.04/x86_64/ruby-2.6.4.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.04/x86_64/ruby-2.6.5.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.04/x86_64/ruby-2.6.6.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.04/x86_64/ruby-2.7.0.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.04/x86_64/ruby-2.7.1.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.10/x86_64/ruby-1.9.3-p194.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.10/x86_64/ruby-1.9.3-p286.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.10/x86_64/ruby-1.9.3-p327.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.10/x86_64/ruby-1.9.3-p362.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.10/x86_64/ruby-1.9.3-p374.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.10/x86_64/ruby-1.9.3-p392.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.10/x86_64/ruby-1.9.3-p429.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.10/x86_64/ruby-1.9.3-p448.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.10/x86_64/ruby-1.9.3-p484.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.10/x86_64/ruby-1.9.3-p545.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.10/x86_64/ruby-1.9.3-p547.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.10/x86_64/ruby-1.9.3-p551.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.10/x86_64/ruby-2.0.0-p0.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.10/x86_64/ruby-2.0.0-p195.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.10/x86_64/ruby-2.0.0-p247.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.10/x86_64/ruby-2.0.0-p353.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.10/x86_64/ruby-2.0.0-p451.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.10/x86_64/ruby-2.0.0-p481.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.10/x86_64/ruby-2.0.0-p576.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.10/x86_64/ruby-2.0.0-p598.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.10/x86_64/ruby-2.1.0.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.10/x86_64/ruby-2.1.1.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.10/x86_64/ruby-2.1.2.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.10/x86_64/ruby-2.1.3.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.10/x86_64/ruby-2.1.5.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/13.04/i386/ruby-1.9.3-p429.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/13.04/i386/ruby-1.9.3-p448.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/13.04/i386/ruby-1.9.3-p484.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/13.04/i386/ruby-1.9.3-p545.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/13.04/i386/ruby-1.9.3-p547.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/13.04/i386/ruby-1.9.3-p551.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/13.04/i386/ruby-2.0.0-p195.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/13.04/i386/ruby-2.0.0-p247.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/13.04/i386/ruby-2.0.0-p353.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/13.04/i386/ruby-2.0.0-p451.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/13.04/i386/ruby-2.0.0-p481.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/13.04/i386/ruby-2.0.0-p576.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/13.04/i386/ruby-2.0.0-p598.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/13.04/i386/ruby-2.1.0.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/13.04/i386/ruby-2.1.1.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/13.04/i386/ruby-2.1.2.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/13.04/i386/ruby-2.1.3.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/13.04/i386/ruby-2.1.5.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/13.04/x86_64/ruby-1.9.3-p392.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/13.04/x86_64/ruby-1.9.3-p429.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/13.04/x86_64/ruby-1.9.3-p448.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/13.04/x86_64/ruby-1.9.3-p484.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/13.04/x86_64/ruby-1.9.3-p545.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/13.04/x86_64/ruby-1.9.3-p547.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/13.04/x86_64/ruby-1.9.3-p551.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/13.04/x86_64/ruby-2.0.0-p0.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/13.04/x86_64/ruby-2.0.0-p195.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/13.04/x86_64/ruby-2.0.0-p247.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/13.04/x86_64/ruby-2.0.0-p353.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/13.04/x86_64/ruby-2.0.0-p451.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/13.04/x86_64/ruby-2.0.0-p481.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/13.04/x86_64/ruby-2.0.0-p576.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/13.04/x86_64/ruby-2.0.0-p598.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/13.04/x86_64/ruby-2.1.0.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/13.04/x86_64/ruby-2.1.1.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/13.04/x86_64/ruby-2.1.2.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/13.04/x86_64/ruby-2.1.3.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/13.04/x86_64/ruby-2.1.5.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/13.10/x86_64/ruby-1.9.3-p547.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/13.10/x86_64/ruby-1.9.3-p551.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/13.10/x86_64/ruby-2.0.0-p481.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/13.10/x86_64/ruby-2.0.0-p576.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/13.10/x86_64/ruby-2.0.0-p598.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/13.10/x86_64/ruby-2.1.2.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/13.10/x86_64/ruby-2.1.3.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/13.10/x86_64/ruby-2.1.5.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/14.04/x86_64/ruby-1.9.3-p547.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/14.04/x86_64/ruby-1.9.3-p551.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/14.04/x86_64/ruby-2.0.0-p481.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/14.04/x86_64/ruby-2.0.0-p576.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/14.04/x86_64/ruby-2.0.0-p598.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/14.04/x86_64/ruby-2.1.0.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/14.04/x86_64/ruby-2.1.1.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/14.04/x86_64/ruby-2.1.2.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/14.04/x86_64/ruby-2.1.3.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/14.04/x86_64/ruby-2.1.4.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/14.04/x86_64/ruby-2.1.5.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/14.04/x86_64/ruby-2.1.6.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/14.04/x86_64/ruby-2.1.7.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/14.04/x86_64/ruby-2.1.8.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/14.04/x86_64/ruby-2.1.9.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/14.04/x86_64/ruby-2.1.10.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/14.04/x86_64/ruby-2.2.0.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/14.04/x86_64/ruby-2.2.1.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/14.04/x86_64/ruby-2.2.2.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/14.04/x86_64/ruby-2.2.3.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/14.04/x86_64/ruby-2.2.4.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/14.04/x86_64/ruby-2.2.5.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/14.04/x86_64/ruby-2.2.6.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/14.04/x86_64/ruby-2.2.7.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/14.04/x86_64/ruby-2.2.8.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/14.04/x86_64/ruby-2.2.9.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/14.04/x86_64/ruby-2.2.10.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/14.04/x86_64/ruby-2.3.0.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/14.04/x86_64/ruby-2.3.1.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/14.04/x86_64/ruby-2.3.2.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/14.04/x86_64/ruby-2.3.3.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/14.04/x86_64/ruby-2.3.4.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/14.04/x86_64/ruby-2.3.5.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/14.04/x86_64/ruby-2.3.6.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/14.04/x86_64/ruby-2.3.7.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/14.04/x86_64/ruby-2.3.8.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/14.04/x86_64/ruby-2.4.0.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/14.04/x86_64/ruby-2.4.1.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/14.04/x86_64/ruby-2.4.2.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/14.04/x86_64/ruby-2.4.3.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/14.04/x86_64/ruby-2.4.4.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/14.04/x86_64/ruby-2.4.5.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/14.04/x86_64/ruby-2.4.6.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/14.04/x86_64/ruby-2.4.7.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/14.04/x86_64/ruby-2.4.8.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/14.04/x86_64/ruby-2.4.9.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/14.04/x86_64/ruby-2.4.10.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/14.04/x86_64/ruby-2.5.0.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/14.04/x86_64/ruby-2.5.1.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/14.04/x86_64/ruby-2.5.2.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/14.04/x86_64/ruby-2.5.3.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/14.04/x86_64/ruby-2.5.4.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/14.04/x86_64/ruby-2.5.5.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/14.04/x86_64/ruby-2.5.6.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/14.04/x86_64/ruby-2.5.7.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/14.04/x86_64/ruby-2.5.8.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/14.04/x86_64/ruby-2.6.0.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/14.04/x86_64/ruby-2.6.1.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/14.04/x86_64/ruby-2.6.2.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/14.04/x86_64/ruby-2.6.3.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/14.04/x86_64/ruby-2.6.4.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/14.04/x86_64/ruby-2.6.5.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/14.04/x86_64/ruby-2.6.6.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/14.04/x86_64/ruby-2.7.0.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/14.04/x86_64/ruby-2.7.1.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/14.04/x86_64/ruby-2.7.2.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/14.04/x86_64/ruby-3.0.0-preview1.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/14.10/x86_64/ruby-1.9.3-p551.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/14.10/x86_64/ruby-2.0.0-p598.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/14.10/x86_64/ruby-2.1.5.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/14.10/x86_64/ruby-2.2.0.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/14.10/x86_64/ruby-2.2.1.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/16.04/x86_64/ruby-2.0.0-p648.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/16.04/x86_64/ruby-2.1.0.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/16.04/x86_64/ruby-2.1.1.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/16.04/x86_64/ruby-2.1.2.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/16.04/x86_64/ruby-2.1.3.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/16.04/x86_64/ruby-2.1.4.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/16.04/x86_64/ruby-2.1.5.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/16.04/x86_64/ruby-2.1.6.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/16.04/x86_64/ruby-2.1.7.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/16.04/x86_64/ruby-2.1.8.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/16.04/x86_64/ruby-2.1.9.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/16.04/x86_64/ruby-2.1.10.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/16.04/x86_64/ruby-2.2.0.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/16.04/x86_64/ruby-2.2.1.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/16.04/x86_64/ruby-2.2.2.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/16.04/x86_64/ruby-2.2.3.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/16.04/x86_64/ruby-2.2.4.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/16.04/x86_64/ruby-2.2.5.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/16.04/x86_64/ruby-2.2.6.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/16.04/x86_64/ruby-2.2.7.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/16.04/x86_64/ruby-2.2.8.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/16.04/x86_64/ruby-2.2.9.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/16.04/x86_64/ruby-2.2.10.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/16.04/x86_64/ruby-2.3.0.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/16.04/x86_64/ruby-2.3.1.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/16.04/x86_64/ruby-2.3.2.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/16.04/x86_64/ruby-2.3.3.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/16.04/x86_64/ruby-2.3.4.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/16.04/x86_64/ruby-2.3.5.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/16.04/x86_64/ruby-2.3.6.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/16.04/x86_64/ruby-2.3.7.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/16.04/x86_64/ruby-2.3.8.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/16.04/x86_64/ruby-2.4.0.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/16.04/x86_64/ruby-2.4.1.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/16.04/x86_64/ruby-2.4.2.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/16.04/x86_64/ruby-2.4.3.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/16.04/x86_64/ruby-2.4.4.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/16.04/x86_64/ruby-2.4.5.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/16.04/x86_64/ruby-2.4.6.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/16.04/x86_64/ruby-2.4.7.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/16.04/x86_64/ruby-2.4.8.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/16.04/x86_64/ruby-2.4.9.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/16.04/x86_64/ruby-2.4.10.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/16.04/x86_64/ruby-2.5.0.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/16.04/x86_64/ruby-2.5.1.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/16.04/x86_64/ruby-2.5.2.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/16.04/x86_64/ruby-2.5.3.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/16.04/x86_64/ruby-2.5.4.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/16.04/x86_64/ruby-2.5.5.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/16.04/x86_64/ruby-2.5.6.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/16.04/x86_64/ruby-2.5.7.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/16.04/x86_64/ruby-2.5.8.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/16.04/x86_64/ruby-2.6.0.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/16.04/x86_64/ruby-2.6.1.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/16.04/x86_64/ruby-2.6.2.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/16.04/x86_64/ruby-2.6.3.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/16.04/x86_64/ruby-2.6.4.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/16.04/x86_64/ruby-2.6.5.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/16.04/x86_64/ruby-2.6.6.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/16.04/x86_64/ruby-2.7.0.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/16.04/x86_64/ruby-2.7.1.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/16.04/x86_64/ruby-2.7.2.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/16.04/x86_64/ruby-3.0.0-preview1.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/16.10/x86_64/ruby-1.9.3-p551.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/16.10/x86_64/ruby-2.0.0-p648.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/16.10/x86_64/ruby-2.1.5.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/16.10/x86_64/ruby-2.1.6.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/16.10/x86_64/ruby-2.1.8.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/16.10/x86_64/ruby-2.1.9.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/16.10/x86_64/ruby-2.2.4.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/16.10/x86_64/ruby-2.2.5.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/16.10/x86_64/ruby-2.2.6.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/16.10/x86_64/ruby-2.3.0.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/16.10/x86_64/ruby-2.3.1.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/16.10/x86_64/ruby-2.3.2.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/16.10/x86_64/ruby-2.3.3.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/17.04/x86_64/ruby-2.1.6.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/17.04/x86_64/ruby-2.1.7.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/17.04/x86_64/ruby-2.1.8.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/17.04/x86_64/ruby-2.1.9.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/17.04/x86_64/ruby-2.1.10.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/17.04/x86_64/ruby-2.2.0.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/17.04/x86_64/ruby-2.2.1.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/17.04/x86_64/ruby-2.2.2.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/17.04/x86_64/ruby-2.2.3.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/17.04/x86_64/ruby-2.2.4.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/17.04/x86_64/ruby-2.2.5.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/17.04/x86_64/ruby-2.2.6.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/17.04/x86_64/ruby-2.2.7.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/17.04/x86_64/ruby-2.2.8.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/17.04/x86_64/ruby-2.3.0.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/17.04/x86_64/ruby-2.3.1.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/17.04/x86_64/ruby-2.3.3.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/17.04/x86_64/ruby-2.3.4.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/17.04/x86_64/ruby-2.3.5.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/17.04/x86_64/ruby-2.4.0.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/17.04/x86_64/ruby-2.4.1.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/17.04/x86_64/ruby-2.4.2.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/18.04/x86_64/ruby-2.1.0.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/18.04/x86_64/ruby-2.1.1.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/18.04/x86_64/ruby-2.1.2.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/18.04/x86_64/ruby-2.1.3.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/18.04/x86_64/ruby-2.1.4.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/18.04/x86_64/ruby-2.1.5.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/18.04/x86_64/ruby-2.1.6.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/18.04/x86_64/ruby-2.1.7.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/18.04/x86_64/ruby-2.1.8.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/18.04/x86_64/ruby-2.1.9.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/18.04/x86_64/ruby-2.1.10.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/18.04/x86_64/ruby-2.2.0.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/18.04/x86_64/ruby-2.2.1.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/18.04/x86_64/ruby-2.2.2.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/18.04/x86_64/ruby-2.2.3.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/18.04/x86_64/ruby-2.2.4.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/18.04/x86_64/ruby-2.2.5.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/18.04/x86_64/ruby-2.2.6.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/18.04/x86_64/ruby-2.2.7.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/18.04/x86_64/ruby-2.2.8.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/18.04/x86_64/ruby-2.2.9.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/18.04/x86_64/ruby-2.2.10.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/18.04/x86_64/ruby-2.3.0.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/18.04/x86_64/ruby-2.3.1.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/18.04/x86_64/ruby-2.3.2.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/18.04/x86_64/ruby-2.3.3.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/18.04/x86_64/ruby-2.3.4.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/18.04/x86_64/ruby-2.3.5.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/18.04/x86_64/ruby-2.3.6.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/18.04/x86_64/ruby-2.3.7.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/18.04/x86_64/ruby-2.3.8.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/18.04/x86_64/ruby-2.4.0.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/18.04/x86_64/ruby-2.4.1.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/18.04/x86_64/ruby-2.4.2.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/18.04/x86_64/ruby-2.4.3.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/18.04/x86_64/ruby-2.4.4.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/18.04/x86_64/ruby-2.4.5.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/18.04/x86_64/ruby-2.4.6.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/18.04/x86_64/ruby-2.4.7.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/18.04/x86_64/ruby-2.4.8.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/18.04/x86_64/ruby-2.4.9.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/18.04/x86_64/ruby-2.4.10.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/18.04/x86_64/ruby-2.5.0.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/18.04/x86_64/ruby-2.5.1.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/18.04/x86_64/ruby-2.5.2.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/18.04/x86_64/ruby-2.5.3.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/18.04/x86_64/ruby-2.5.4.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/18.04/x86_64/ruby-2.5.5.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/18.04/x86_64/ruby-2.5.6.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/18.04/x86_64/ruby-2.5.7.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/18.04/x86_64/ruby-2.5.8.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/18.04/x86_64/ruby-2.6.0.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/18.04/x86_64/ruby-2.6.1.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/18.04/x86_64/ruby-2.6.2.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/18.04/x86_64/ruby-2.6.3.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/18.04/x86_64/ruby-2.6.4.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/18.04/x86_64/ruby-2.6.5.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/18.04/x86_64/ruby-2.6.6.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/18.04/x86_64/ruby-2.7.0.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/18.04/x86_64/ruby-2.7.1.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/18.04/x86_64/ruby-2.7.2.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/18.04/x86_64/ruby-3.0.0-preview1.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/19.10/x86_64/ruby-2.4.0.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/19.10/x86_64/ruby-2.4.1.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/19.10/x86_64/ruby-2.4.2.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/19.10/x86_64/ruby-2.4.3.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/19.10/x86_64/ruby-2.4.4.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/19.10/x86_64/ruby-2.4.5.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/19.10/x86_64/ruby-2.4.6.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/19.10/x86_64/ruby-2.4.7.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/19.10/x86_64/ruby-2.4.8.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/19.10/x86_64/ruby-2.4.9.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/19.10/x86_64/ruby-2.4.10.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/19.10/x86_64/ruby-2.5.0.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/19.10/x86_64/ruby-2.5.1.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/19.10/x86_64/ruby-2.5.2.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/19.10/x86_64/ruby-2.5.3.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/19.10/x86_64/ruby-2.5.4.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/19.10/x86_64/ruby-2.5.5.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/19.10/x86_64/ruby-2.5.6.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/19.10/x86_64/ruby-2.5.7.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/19.10/x86_64/ruby-2.5.8.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/19.10/x86_64/ruby-2.6.0.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/19.10/x86_64/ruby-2.6.1.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/19.10/x86_64/ruby-2.6.2.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/19.10/x86_64/ruby-2.6.3.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/19.10/x86_64/ruby-2.6.4.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/19.10/x86_64/ruby-2.6.5.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/19.10/x86_64/ruby-2.6.6.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/19.10/x86_64/ruby-2.7.0.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/19.10/x86_64/ruby-2.7.1.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/19.10/x86_64/ruby-2.7.2.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/19.10/x86_64/ruby-3.0.0-preview1.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/20.04/x86_64/ruby-2.1.0.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/20.04/x86_64/ruby-2.1.1.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/20.04/x86_64/ruby-2.1.2.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/20.04/x86_64/ruby-2.1.3.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/20.04/x86_64/ruby-2.1.4.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/20.04/x86_64/ruby-2.1.5.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/20.04/x86_64/ruby-2.1.6.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/20.04/x86_64/ruby-2.1.7.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/20.04/x86_64/ruby-2.1.8.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/20.04/x86_64/ruby-2.1.9.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/20.04/x86_64/ruby-2.1.10.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/20.04/x86_64/ruby-2.2.0.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/20.04/x86_64/ruby-2.2.1.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/20.04/x86_64/ruby-2.2.2.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/20.04/x86_64/ruby-2.2.3.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/20.04/x86_64/ruby-2.2.4.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/20.04/x86_64/ruby-2.2.5.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/20.04/x86_64/ruby-2.2.6.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/20.04/x86_64/ruby-2.2.7.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/20.04/x86_64/ruby-2.2.8.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/20.04/x86_64/ruby-2.2.9.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/20.04/x86_64/ruby-2.2.10.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/20.04/x86_64/ruby-2.3.0.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/20.04/x86_64/ruby-2.3.1.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/20.04/x86_64/ruby-2.3.2.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/20.04/x86_64/ruby-2.3.3.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/20.04/x86_64/ruby-2.3.4.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/20.04/x86_64/ruby-2.3.5.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/20.04/x86_64/ruby-2.3.6.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/20.04/x86_64/ruby-2.3.7.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/20.04/x86_64/ruby-2.3.8.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/20.04/x86_64/ruby-2.4.0.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/20.04/x86_64/ruby-2.4.1.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/20.04/x86_64/ruby-2.4.2.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/20.04/x86_64/ruby-2.4.3.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/20.04/x86_64/ruby-2.4.4.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/20.04/x86_64/ruby-2.4.5.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/20.04/x86_64/ruby-2.4.6.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/20.04/x86_64/ruby-2.4.7.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/20.04/x86_64/ruby-2.4.8.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/20.04/x86_64/ruby-2.4.9.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/20.04/x86_64/ruby-2.4.10.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/20.04/x86_64/ruby-2.5.0.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/20.04/x86_64/ruby-2.5.1.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/20.04/x86_64/ruby-2.5.2.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/20.04/x86_64/ruby-2.5.3.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/20.04/x86_64/ruby-2.5.4.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/20.04/x86_64/ruby-2.5.5.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/20.04/x86_64/ruby-2.5.6.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/20.04/x86_64/ruby-2.5.7.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/20.04/x86_64/ruby-2.5.8.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/20.04/x86_64/ruby-2.6.0.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/20.04/x86_64/ruby-2.6.1.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/20.04/x86_64/ruby-2.6.2.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/20.04/x86_64/ruby-2.6.3.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/20.04/x86_64/ruby-2.6.4.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/20.04/x86_64/ruby-2.6.5.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/20.04/x86_64/ruby-2.6.6.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/20.04/x86_64/ruby-2.7.0.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/20.04/x86_64/ruby-2.7.1.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/20.04/x86_64/ruby-2.7.2.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/20.04/x86_64/ruby-3.0.0.tar.bz2
config/known_aliases000066400000000111147511530520010567 0ustar00jruby9k=jruby-9.2.14.0
jruby-9k=jruby-9.2.14.0
jruby-9000=jruby-9.2.14.0
config/solaris/noask000066400000000247147511530520010533 0ustar00mail=
instance=overwrite
partial=nocheck
runlevel=nocheck
idepend=nocheck
rdepend=nocheck
space=nocheck
setuid=nocheck
conflict=nocheck
action=nocheck
basedir=default
config/pre_commit.yml000066400000000061147511530520010674 0ustar00---
:checks_add:
- :gpg
:checks_remove:
- :rails
patchsets/ree/1.8.7/2012.02/default000066400000000100147511530520012137 0ustar00tcmalloc
stdout-rouge-fix
no_sslv2
ssl_no_ec2m
p358-p374
GH-488
patchsets/ree/1.8.7/default000066400000000057147511530520011346 0ustar00tcmalloc
stdout-rouge-fix
no_sslv2
ssl_no_ec2m
patchsets/ree/1.8.6/default000066400000000113147511530520011336 0ustar00openssl-1.0
tcmalloc
stdout-rouge-fix
perftools-gcc46
no_sslv2
ssl_no_ec2m
patchsets/rbx/2.5.2/default000066400000000107147511530520011353 0ustar00clean_bundler_environment_before_running_homebrew
this_can_not_be_null
patchsets/jruby/1.7.9/default000066400000000005147511530520011720 0ustar00joni
patchsets/ruby/2.6.0/railsexpress000066400000000572147511530520012646 0ustar00https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.6.0/railsexpress/01-fix-broken-tests-caused-by-ad.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.6.0/railsexpress/02-improve-gc-stats.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.6.0/railsexpress/03-more-detailed-stacktrace.patch
patchsets/ruby/2.4.4/railsexpress000066400000000567147511530520012654 0ustar00https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.4.4/railsexpress/01-skip-broken-tests.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.4.4/railsexpress/02-improve-gc-stats.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.4.4/railsexpress/03-display-more-detailed-stack-trace.patch
patchsets/ruby/2.5.3/railsexpress000066400000000572147511530520012650 0ustar00https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.5.3/railsexpress/01-fix-broken-tests-caused-by-ad.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.5.3/railsexpress/02-improve-gc-stats.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.5.3/railsexpress/03-more-detailed-stacktrace.patch
patchsets/ruby/2.2.2/railsexpress000066400000001173147511530520012642 0ustar00https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.2.2/railsexpress/01-zero-broken-tests.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.2.2/railsexpress/02-improve-gc-stats.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.2.2/railsexpress/03-display-more-detailed-stack-trace.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.2.2/railsexpress/04-backported-bugfixes-222.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.2.2/railsexpress/05-fix-backports-parser-regression.patch
patchsets/ruby/2.2.2/float_warnings000066400000000202147511530520013123 0ustar00https://raw.githubusercontent.com/knugie/rvm-patchsets/master/patches/ruby/2.2.2/float_warnings/01-bigdecimal_float_warning.patch
patchsets/ruby/2.2.2/default000066400000000045147511530520011537 0ustar00fix_installing_bundled_gems
openssl3
patchsets/ruby/2.3.5/float_warnings000066400000000202147511530520013127 0ustar00https://raw.githubusercontent.com/knugie/rvm-patchsets/master/patches/ruby/2.3.5/float_warnings/01-bigdecimal_float_warning.patch
patchsets/ruby/2.3.5/railsexpress000066400000000763147511530520012652 0ustar00https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.3.5/railsexpress/01-skip-broken-tests.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.3.5/railsexpress/02-improve-gc-stats.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.3.5/railsexpress/03-display-more-detailed-stack-trace.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.3.5/railsexpress/04-fix-gmp-compile-issue.patch
patchsets/ruby/2.2.8/float_warnings000066400000000202147511530520013131 0ustar00https://raw.githubusercontent.com/knugie/rvm-patchsets/master/patches/ruby/2.2.8/float_warnings/01-bigdecimal_float_warning.patch
patchsets/ruby/2.2.8/default000066400000000034147511530520011543 0ustar00fix_installing_bundled_gems
patchsets/ruby/2.2.8/railsexpress000066400000000567147511530520012656 0ustar00https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.2.8/railsexpress/01-zero-broken-tests.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.2.8/railsexpress/02-improve-gc-stats.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.2.8/railsexpress/03-display-more-detailed-stack-trace.patch
patchsets/ruby/2.1.1/default000066400000000063147511530520011535 0ustar00libyaml
changeset_r45225
changeset_r45240
openssl3
patchsets/ruby/2.1.1/osx_static000066400000000007147511530520012267 0ustar00cc_env
patchsets/ruby/2.1.1/float_warnings000066400000000202147511530520013121 0ustar00https://raw.githubusercontent.com/knugie/rvm-patchsets/master/patches/ruby/2.1.1/float_warnings/01-bigdecimal_float_warning.patch
patchsets/ruby/2.1.1/railsexpress000066400000002625147511530520012643 0ustar00https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.1.1/railsexpress/01-zero-broken-tests.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.1.1/railsexpress/02-improve-gc-stats.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.1.1/railsexpress/03-display-more-detailed-stack-trace.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.1.1/railsexpress/04-show-full-backtrace-on-stack-overflow.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.1.1/railsexpress/05-fix-missing-c-return-event.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.1.1/railsexpress/06-backport-006e66b6680f60adfb434ee7397f0dbc77de7873.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.1.1/railsexpress/07-funny-falcon-stc-density.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.1.1/railsexpress/08-funny-falcon-stc-pool-allocation.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.1.1/railsexpress/09-aman-opt-aset-aref-str.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.1.1/railsexpress/10-funny-falcon-method-cache.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.1.1/railsexpress/11-backport-r44370.patch
patchsets/ruby/1.8.7/p334/railsexpress000066400000004252147511530520013346 0ustar00https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.8.7/p334/railsexpress/01-ignore-generated-files.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.8.7/p334/railsexpress/02-fix-rcs-keyword-idiom.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.8.7/p334/railsexpress/03-sigvtalrm-fix.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.8.7/p334/railsexpress/04-railsbench-gc-patch.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.8.7/p334/railsexpress/05-display-full-stack-trace.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.8.7/p334/railsexpress/06-better-source-file-tracing.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.8.7/p334/railsexpress/07-heap-dump-support.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.8.7/p334/railsexpress/08-fork-support-for-gc-logging.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.8.7/p334/railsexpress/09-track-malloc-size.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.8.7/p334/railsexpress/10-track-object-allocation.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.8.7/p334/railsexpress/11-expose-heap-slots.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.8.7/p334/railsexpress/12-fix-heap-size-growth-logic.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.8.7/p334/railsexpress/13-heap-slot-size.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.8.7/p334/railsexpress/14-add-trace-stats-enabled-methods.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.8.7/p334/railsexpress/15-track-live-dataset-size.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.8.7/p334/railsexpress/16-add-object-size-information-to-heap-dump.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.8.7/p334/railsexpress/17-caller-for-all-threads.patch
patchsets/ruby/1.8.7/p371/railsexpress000066400000004644147511530520013354 0ustar00https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.8.7/p371/railsexpress/01-ignore-generated-files.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.8.7/p371/railsexpress/02-fix-tests-for-osx.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.8.7/p371/railsexpress/03-sigvtalrm-fix.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.8.7/p371/railsexpress/04-railsbench-gc-patch.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.8.7/p371/railsexpress/05-display-full-stack-trace.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.8.7/p371/railsexpress/06-better-source-file-tracing.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.8.7/p371/railsexpress/07-heap-dump-support.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.8.7/p371/railsexpress/08-fork-support-for-gc-logging.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.8.7/p371/railsexpress/09-track-malloc-size.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.8.7/p371/railsexpress/10-track-object-allocation.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.8.7/p371/railsexpress/11-expose-heap-slots.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.8.7/p371/railsexpress/12-fix-heap-size-growth-logic.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.8.7/p371/railsexpress/13-heap-slot-size.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.8.7/p371/railsexpress/14-add-trace-stats-enabled-methods.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.8.7/p371/railsexpress/15-track-live-dataset-size.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.8.7/p371/railsexpress/16-add-object-size-information-to-heap-dump.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.8.7/p371/railsexpress/17-caller-for-all-threads.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.8.7/p371/railsexpress/18-fix-zlib-deflate.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.8.7/p371/railsexpress/19-fix-broken-seek-on-osx.patch
patchsets/ruby/1.8.7/p371/default000066400000000055147511530520012244 0ustar00stdout-rouge-fix
no_sslv2
GH-488
ssl_no_ec2m
patchsets/ruby/1.8.7/default000066400000000046147511530520011552 0ustar00stdout-rouge-fix
no_sslv2
ssl_no_ec2m
patchsets/ruby/1.8.7/p357/railsexpress000066400000004051147511530520013350 0ustar00https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.8.7/p357/railsexpress/01-ignore-generated-files.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.8.7/p357/railsexpress/02-sigvtalrm-fix.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.8.7/p357/railsexpress/03-railsbench-gc-patch.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.8.7/p357/railsexpress/04-display-full-stack-trace.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.8.7/p357/railsexpress/05-better-source-file-tracing.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.8.7/p357/railsexpress/06-heap-dump-support.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.8.7/p357/railsexpress/07-fork-support-for-gc-logging.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.8.7/p357/railsexpress/08-track-malloc-size.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.8.7/p357/railsexpress/09-track-object-allocation.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.8.7/p357/railsexpress/10-expose-heap-slots.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.8.7/p357/railsexpress/11-fix-heap-size-growth-logic.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.8.7/p357/railsexpress/12-heap-slot-size.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.8.7/p357/railsexpress/13-add-trace-stats-enabled-methods.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.8.7/p357/railsexpress/14-track-live-dataset-size.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.8.7/p357/railsexpress/15-add-object-size-information-to-heap-dump.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.8.7/p357/railsexpress/16-caller-for-all-threads.patch
patchsets/ruby/1.8.7/p374/default000066400000000055147511530520012247 0ustar00stdout-rouge-fix
no_sslv2
GH-488
ssl_no_ec2m
patchsets/ruby/1.8.7/p374/railsexpress000066400000004246147511530520013355 0ustar00https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.8.7/p374/railsexpress/01-ignore-generated-files.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.8.7/p374/railsexpress/02-fix-tests-for-osx.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.8.7/p374/railsexpress/03-sigvtalrm-fix.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.8.7/p374/railsexpress/04-railsbench-gc-patch.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.8.7/p374/railsexpress/05-display-full-stack-trace.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.8.7/p374/railsexpress/06-better-source-file-tracing.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.8.7/p374/railsexpress/07-heap-dump-support.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.8.7/p374/railsexpress/08-fork-support-for-gc-logging.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.8.7/p374/railsexpress/09-track-malloc-size.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.8.7/p374/railsexpress/10-track-object-allocation.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.8.7/p374/railsexpress/11-expose-heap-slots.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.8.7/p374/railsexpress/12-fix-heap-size-growth-logic.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.8.7/p374/railsexpress/13-heap-slot-size.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.8.7/p374/railsexpress/14-add-trace-stats-enabled-methods.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.8.7/p374/railsexpress/15-track-live-dataset-size.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.8.7/p374/railsexpress/16-add-object-size-information-to-heap-dump.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.8.7/p374/railsexpress/17-caller-for-all-threads.patch
patchsets/ruby/1.8.7/p373/default000066400000000055147511530520012246 0ustar00stdout-rouge-fix
no_sslv2
GH-488
ssl_no_ec2m
patchsets/ruby/1.8.7/p352/railsexpress000066400000004051147511530520013343 0ustar00https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.8.7/p352/railsexpress/01-ignore-generated-files.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.8.7/p352/railsexpress/02-sigvtalrm-fix.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.8.7/p352/railsexpress/03-railsbench-gc-patch.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.8.7/p352/railsexpress/04-display-full-stack-trace.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.8.7/p352/railsexpress/05-better-source-file-tracing.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.8.7/p352/railsexpress/06-heap-dump-support.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.8.7/p352/railsexpress/07-fork-support-for-gc-logging.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.8.7/p352/railsexpress/08-track-malloc-size.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.8.7/p352/railsexpress/09-track-object-allocation.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.8.7/p352/railsexpress/10-expose-heap-slots.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.8.7/p352/railsexpress/11-fix-heap-size-growth-logic.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.8.7/p352/railsexpress/12-heap-slot-size.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.8.7/p352/railsexpress/13-add-trace-stats-enabled-methods.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.8.7/p352/railsexpress/14-track-live-dataset-size.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.8.7/p352/railsexpress/15-add-object-size-information-to-heap-dump.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.8.7/p352/railsexpress/16-caller-for-all-threads.patch
patchsets/ruby/1.8.7/p358/railsexpress000066400000004246147511530520013357 0ustar00https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.8.7/p358/railsexpress/01-ignore-generated-files.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.8.7/p358/railsexpress/02-fix-tests-for-osx.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.8.7/p358/railsexpress/03-sigvtalrm-fix.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.8.7/p358/railsexpress/04-railsbench-gc-patch.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.8.7/p358/railsexpress/05-display-full-stack-trace.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.8.7/p358/railsexpress/06-better-source-file-tracing.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.8.7/p358/railsexpress/07-heap-dump-support.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.8.7/p358/railsexpress/08-fork-support-for-gc-logging.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.8.7/p358/railsexpress/09-track-malloc-size.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.8.7/p358/railsexpress/10-track-object-allocation.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.8.7/p358/railsexpress/11-expose-heap-slots.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.8.7/p358/railsexpress/12-fix-heap-size-growth-logic.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.8.7/p358/railsexpress/13-heap-slot-size.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.8.7/p358/railsexpress/14-add-trace-stats-enabled-methods.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.8.7/p358/railsexpress/15-track-live-dataset-size.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.8.7/p358/railsexpress/16-add-object-size-information-to-heap-dump.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.8.7/p358/railsexpress/17-caller-for-all-threads.patch
patchsets/ruby/1.8.7/head/railsexpress000066400000004246147511530520013561 0ustar00https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.8.7/head/railsexpress/01-ignore-generated-files.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.8.7/head/railsexpress/02-fix-tests-for-osx.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.8.7/head/railsexpress/03-sigvtalrm-fix.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.8.7/head/railsexpress/04-railsbench-gc-patch.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.8.7/head/railsexpress/05-display-full-stack-trace.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.8.7/head/railsexpress/06-better-source-file-tracing.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.8.7/head/railsexpress/07-heap-dump-support.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.8.7/head/railsexpress/08-fork-support-for-gc-logging.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.8.7/head/railsexpress/09-track-malloc-size.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.8.7/head/railsexpress/10-track-object-allocation.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.8.7/head/railsexpress/11-expose-heap-slots.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.8.7/head/railsexpress/12-fix-heap-size-growth-logic.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.8.7/head/railsexpress/13-heap-slot-size.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.8.7/head/railsexpress/14-add-trace-stats-enabled-methods.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.8.7/head/railsexpress/15-track-live-dataset-size.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.8.7/head/railsexpress/16-add-object-size-information-to-heap-dump.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.8.7/head/railsexpress/17-caller-for-all-threads.patch
patchsets/ruby/1.8.7/p370/railsexpress000066400000004644147511530520013353 0ustar00https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.8.7/p370/railsexpress/01-ignore-generated-files.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.8.7/p370/railsexpress/02-fix-tests-for-osx.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.8.7/p370/railsexpress/03-sigvtalrm-fix.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.8.7/p370/railsexpress/04-railsbench-gc-patch.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.8.7/p370/railsexpress/05-display-full-stack-trace.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.8.7/p370/railsexpress/06-better-source-file-tracing.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.8.7/p370/railsexpress/07-heap-dump-support.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.8.7/p370/railsexpress/08-fork-support-for-gc-logging.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.8.7/p370/railsexpress/09-track-malloc-size.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.8.7/p370/railsexpress/10-track-object-allocation.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.8.7/p370/railsexpress/11-expose-heap-slots.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.8.7/p370/railsexpress/12-fix-heap-size-growth-logic.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.8.7/p370/railsexpress/13-heap-slot-size.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.8.7/p370/railsexpress/14-add-trace-stats-enabled-methods.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.8.7/p370/railsexpress/15-track-live-dataset-size.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.8.7/p370/railsexpress/16-add-object-size-information-to-heap-dump.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.8.7/p370/railsexpress/17-caller-for-all-threads.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.8.7/p370/railsexpress/18-fix-zlib-deflate.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.8.7/p370/railsexpress/19-fix-broken-seek-on-osx.patch
patchsets/ruby/1.8.7/p370/default000066400000000055147511530520012243 0ustar00stdout-rouge-fix
no_sslv2
GH-488
ssl_no_ec2m
patchsets/ruby/2.1.6/default000066400000000011147511530520011533 0ustar00openssl3
patchsets/ruby/2.1.6/float_warnings000066400000000202147511530520013126 0ustar00https://raw.githubusercontent.com/knugie/rvm-patchsets/master/patches/ruby/2.1.6/float_warnings/01-bigdecimal_float_warning.patch
patchsets/ruby/2.1.6/railsexpress000066400000002176147511530520012651 0ustar00https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.1.6/railsexpress/01-zero-broken-tests.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.1.6/railsexpress/02-improve-gc-stats.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.1.6/railsexpress/03-display-more-detailed-stack-trace.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.1.6/railsexpress/04-show-full-backtrace-on-stack-overflow.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.1.6/railsexpress/05-funny-falcon-stc-density.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.1.6/railsexpress/06-funny-falcon-stc-pool-allocation.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.1.6/railsexpress/07-aman-opt-aset-aref-str.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.1.6/railsexpress/08-funny-falcon-method-cache.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.1.6/railsexpress/09-heap-dump-support.patch
patchsets/ruby/2.2.5/default000066400000000045147511530520011542 0ustar00fix_installing_bundled_gems
openssl3
patchsets/ruby/2.2.5/float_warnings000066400000000202147511530520013126 0ustar00https://raw.githubusercontent.com/knugie/rvm-patchsets/master/patches/ruby/2.2.5/float_warnings/01-bigdecimal_float_warning.patch
patchsets/ruby/2.2.5/railsexpress000066400000000567147511530520012653 0ustar00https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.2.5/railsexpress/01-zero-broken-tests.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.2.5/railsexpress/02-improve-gc-stats.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.2.5/railsexpress/03-display-more-detailed-stack-trace.patch
patchsets/ruby/2.3.8/railsexpress000066400000000567147511530520012657 0ustar00https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.3.8/railsexpress/01-skip-broken-tests.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.3.8/railsexpress/02-improve-gc-stats.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.3.8/railsexpress/03-display-more-detailed-stack-trace.patch
patchsets/ruby/2.3.2/default000066400000000047147511530520011542 0ustar00ruby_2_3_gcc7
random_c_using_NR_prefix
patchsets/ruby/2.3.2/float_warnings000066400000000202147511530520013124 0ustar00https://raw.githubusercontent.com/knugie/rvm-patchsets/master/patches/ruby/2.3.2/float_warnings/01-bigdecimal_float_warning.patch
patchsets/ruby/2.4.3/railsexpress000066400000000567147511530520012653 0ustar00https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.4.3/railsexpress/01-skip-broken-tests.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.4.3/railsexpress/02-improve-gc-stats.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.4.3/railsexpress/03-display-more-detailed-stack-trace.patch
patchsets/ruby/3.0/head/railsexpress000066400000000357147511530520013405 0ustar00https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/3.0/head/railsexpress/01-improve-gc-stats.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/3.0/head/railsexpress/02-malloc-trim.patch
patchsets/ruby/2.7/head/railsexpress000066400000000770147511530520013412 0ustar00https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.7/head/railsexpress/01-fix-broken-tests-caused-by-ad.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.7/head/railsexpress/02-improve-gc-stats.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.7/head/railsexpress/03-more-detailed-stacktrace.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.7/head/railsexpress/04-malloc-trim.patch
patchsets/ruby/2.5.4/railsexpress000066400000000572147511530520012651 0ustar00https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.5.4/railsexpress/01-fix-broken-tests-caused-by-ad.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.5.4/railsexpress/02-improve-gc-stats.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.5.4/railsexpress/03-more-detailed-stacktrace.patch
patchsets/ruby/2.4.9/railsexpress000066400000000567147511530520012661 0ustar00https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.4.9/railsexpress/01-skip-broken-tests.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.4.9/railsexpress/02-improve-gc-stats.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.4.9/railsexpress/03-display-more-detailed-stack-trace.patch
patchsets/ruby/2.7.0/railsexpress000066400000000572147511530520012647 0ustar00https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.7.0/railsexpress/01-fix-broken-tests-caused-by-ad.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.7.0/railsexpress/02-improve-gc-stats.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.7.0/railsexpress/03-more-detailed-stacktrace.patch
patchsets/ruby/head/osx_static000066400000000021147511530520012525 0ustar00remove_digest_so
patchsets/ruby/head/railsexpress000066400000000567147511530520013110 0ustar00https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/head/railsexpress/01-fix-broken-tests-caused-by-ad.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/head/railsexpress/02-improve-gc-stats.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/head/railsexpress/03-more-detailed-stacktrace.patch
patchsets/ruby/2.5.0/default000066400000000044147511530520011537 0ustar00prelude_gcc_diagnostic
libressl_2_7
patchsets/ruby/2.5.0/railsexpress000066400000000776147511530520012653 0ustar00https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.5.0/railsexpress/01-fix-broken-tests-caused-by-ad.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.5.0/railsexpress/02-improve-gc-stats.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.5.0/railsexpress/03-more-detailed-stacktrace.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.5.0/railsexpress/04-fix-fd-mask-detection-on-os-x.patch
patchsets/ruby/2.3/head/railsexpress000066400000000600147511530520013376 0ustar00https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.3/head/railsexpress/01-skip-broken-tests.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.3/head/railsexpress/02-improve-gc-stats.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.3/head/railsexpress/03-display-more-detailed-stack-trace.patch
patchsets/ruby/2.3/head/float_warnings000066400000000205147511530520013670 0ustar00https://raw.githubusercontent.com/knugie/rvm-patchsets/master/patches/ruby/2.3/head/float_warnings/01-bigdecimal_float_warning.patch
patchsets/ruby/2.6.3/railsexpress000066400000000754147511530520012653 0ustar00https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.6.3/railsexpress/01-fix-broken-tests-caused-by-ad.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.6.3/railsexpress/02-improve-gc-stats.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.6.3/railsexpress/03-more-detailed-stacktrace.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.6.3/railsexpress/04-malloc-trim.patch
patchsets/ruby/2.1.2/default000066400000000011147511530520011527 0ustar00openssl3
patchsets/ruby/2.1.2/railsexpress000066400000002437147511530520012645 0ustar00https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.1.2/railsexpress/01-zero-broken-tests.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.1.2/railsexpress/02-improve-gc-stats.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.1.2/railsexpress/03-display-more-detailed-stack-trace.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.1.2/railsexpress/04-show-full-backtrace-on-stack-overflow.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.1.2/railsexpress/05-fix-missing-c-return-event.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.1.2/railsexpress/06-backport-006e66b6680f60adfb434ee7397f0dbc77de7873.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.1.2/railsexpress/07-funny-falcon-stc-density.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.1.2/railsexpress/08-funny-falcon-stc-pool-allocation.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.1.2/railsexpress/09-aman-opt-aset-aref-str.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.1.2/railsexpress/10-funny-falcon-method-cache.patch
patchsets/ruby/2.1.2/float_warnings000066400000000202147511530520013122 0ustar00https://raw.githubusercontent.com/knugie/rvm-patchsets/master/patches/ruby/2.1.2/float_warnings/01-bigdecimal_float_warning.patch
patchsets/ruby/2.1.8/railsexpress000066400000002176147511530520012653 0ustar00https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.1.8/railsexpress/01-zero-broken-tests.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.1.8/railsexpress/02-improve-gc-stats.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.1.8/railsexpress/03-display-more-detailed-stack-trace.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.1.8/railsexpress/04-show-full-backtrace-on-stack-overflow.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.1.8/railsexpress/05-funny-falcon-stc-density.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.1.8/railsexpress/06-funny-falcon-stc-pool-allocation.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.1.8/railsexpress/07-aman-opt-aset-aref-str.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.1.8/railsexpress/08-funny-falcon-method-cache.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.1.8/railsexpress/09-heap-dump-support.patch
patchsets/ruby/2.1.8/default000066400000000011147511530520011535 0ustar00openssl3
patchsets/ruby/2.1.8/float_warnings000066400000000202147511530520013130 0ustar00https://raw.githubusercontent.com/knugie/rvm-patchsets/master/patches/ruby/2.1.8/float_warnings/01-bigdecimal_float_warning.patch
patchsets/ruby/2.3.6/railsexpress000066400000000567147511530520012655 0ustar00https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.3.6/railsexpress/01-skip-broken-tests.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.3.6/railsexpress/02-improve-gc-stats.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.3.6/railsexpress/03-display-more-detailed-stack-trace.patch
patchsets/ruby/2.2.1/default000066400000000045147511530520011536 0ustar00fix_installing_bundled_gems
openssl3
patchsets/ruby/2.2.1/float_warnings000066400000000202147511530520013122 0ustar00https://raw.githubusercontent.com/knugie/rvm-patchsets/master/patches/ruby/2.2.1/float_warnings/01-bigdecimal_float_warning.patch
patchsets/ruby/2.2.1/railsexpress000066400000000567147511530520012647 0ustar00https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.2.1/railsexpress/01-zero-broken-tests.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.2.1/railsexpress/02-improve-gc-stats.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.2.1/railsexpress/03-display-more-detailed-stack-trace.patch
patchsets/ruby/2.3.1/float_warnings000066400000000202147511530520013123 0ustar00https://raw.githubusercontent.com/knugie/rvm-patchsets/master/patches/ruby/2.3.1/float_warnings/01-bigdecimal_float_warning.patch
patchsets/ruby/2.3.1/cygwin000066400000000027147511530520011413 0ustar00fix_resolv_kernel32_dllpatchsets/ruby/2.3.1/default000066400000000047147511530520011541 0ustar00ruby_2_3_gcc7
random_c_using_NR_prefix
patchsets/ruby/2.3.1/railsexpress000066400000000567147511530520012650 0ustar00https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.3.1/railsexpress/01-skip-broken-tests.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.3.1/railsexpress/02-improve-gc-stats.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.3.1/railsexpress/03-display-more-detailed-stack-trace.patch
patchsets/ruby/2.2.6/default000066400000000034147511530520011541 0ustar00fix_installing_bundled_gems
patchsets/ruby/2.2.6/float_warnings000066400000000202147511530520013127 0ustar00https://raw.githubusercontent.com/knugie/rvm-patchsets/master/patches/ruby/2.2.6/float_warnings/01-bigdecimal_float_warning.patch
patchsets/ruby/2.2.6/railsexpress000066400000000567147511530520012654 0ustar00https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.2.6/railsexpress/01-zero-broken-tests.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.2.6/railsexpress/02-improve-gc-stats.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.2.6/railsexpress/03-display-more-detailed-stack-trace.patch
patchsets/ruby/2.1.5/railsexpress000066400000002006147511530520012640 0ustar00https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.1.5/railsexpress/01-zero-broken-tests.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.1.5/railsexpress/02-improve-gc-stats.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.1.5/railsexpress/03-display-more-detailed-stack-trace.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.1.5/railsexpress/04-show-full-backtrace-on-stack-overflow.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.1.5/railsexpress/05-funny-falcon-stc-density.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.1.5/railsexpress/06-funny-falcon-stc-pool-allocation.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.1.5/railsexpress/07-aman-opt-aset-aref-str.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.1.5/railsexpress/08-funny-falcon-method-cache.patch
patchsets/ruby/2.1.5/float_warnings000066400000000202147511530520013125 0ustar00https://raw.githubusercontent.com/knugie/rvm-patchsets/master/patches/ruby/2.1.5/float_warnings/01-bigdecimal_float_warning.patch
patchsets/ruby/2.1.5/default000066400000000011147511530520011532 0ustar00openssl3
patchsets/ruby/1.9.3/p429/freebsd000066400000000016147511530520012230 0ustar00bsd-shell-fix
patchsets/ruby/1.9.3/p429/default000066400000000011147511530520012235 0ustar00openssl3
patchsets/ruby/1.9.3/p429/float_warnings000066400000000207147511530520013635 0ustar00https://raw.githubusercontent.com/knugie/rvm-patchsets/master/patches/ruby/1.9.3/p429/float_warnings/01-bigdecimal_float_warning.patch
patchsets/ruby/1.9.3/p429/railsexpress000066400000003655147511530520013356 0ustar00https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.9.3/p429/railsexpress/01-fix-make-clean.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.9.3/p429/railsexpress/02-railsbench-gc.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.9.3/p429/railsexpress/03-display-more-detailed-stack-trace.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.9.3/p429/railsexpress/04-fork-support-for-gc-logging.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.9.3/p429/railsexpress/05-track-live-dataset-size.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.9.3/p429/railsexpress/06-webrick_204_304_keep_alive_fix.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.9.3/p429/railsexpress/07-export-a-few-more-symbols-for-ruby-prof.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.9.3/p429/railsexpress/08-thread-variables.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.9.3/p429/railsexpress/09-faster-loading.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.9.3/p429/railsexpress/10-falcon-st-opt.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.9.3/p429/railsexpress/11-falcon-sparse-array.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.9.3/p429/railsexpress/12-falcon-array-queue.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.9.3/p429/railsexpress/13-railsbench-gc-fixes.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.9.3/p429/railsexpress/14-show-full-backtrace-on-stack-overflow.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.9.3/p429/railsexpress/15-configurable-fiber-stack-sizes.patch
patchsets/ruby/1.9.3/p429/openbsd000066400000000016147511530520012250 0ustar00bsd-shell-fix
patchsets/ruby/1.9.3/default000066400000000040147511530520011541 0ustar00GH-488
openssl3
update-autoconf
patchsets/ruby/1.9.3/p194/railsexpress000066400000002357147511530520013353 0ustar00https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.9.3/p194/railsexpress/01-revert-f6b49243eb0c21bea1c4198cdd52a549e6ead075.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.9.3/p194/railsexpress/02-backport-c2086cc7ff1142b14c95c8758af24b8689b78ffc.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.9.3/p194/railsexpress/03-railsbench-gc.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.9.3/p194/railsexpress/04-display-more-detailed-stack-trace.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.9.3/p194/railsexpress/05-fork-support-for-gc-logging.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.9.3/p194/railsexpress/06-track-live-dataset-size.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.9.3/p194/railsexpress/07-webrick_204_304_keep_alive_fix.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.9.3/p194/railsexpress/08-export-a-few-more-symbols-for-ruby-prof.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.9.3/p194/railsexpress/09-avoid-using-broken-ffi-headers.patch
patchsets/ruby/1.9.3/p194/default000066400000000011147511530520012234 0ustar00openssl3
patchsets/ruby/1.9.3/p194/float_warnings000066400000000207147511530520013634 0ustar00https://raw.githubusercontent.com/knugie/rvm-patchsets/master/patches/ruby/1.9.3/p194/float_warnings/01-bigdecimal_float_warning.patch
patchsets/ruby/1.9.3/p374/railsexpress000066400000003023147511530520013342 0ustar00https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.9.3/p374/railsexpress/01-fix-make-clean.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.9.3/p374/railsexpress/02-railsbench-gc.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.9.3/p374/railsexpress/03-display-more-detailed-stack-trace.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.9.3/p374/railsexpress/04-fork-support-for-gc-logging.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.9.3/p374/railsexpress/05-track-live-dataset-size.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.9.3/p374/railsexpress/06-webrick_204_304_keep_alive_fix.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.9.3/p374/railsexpress/07-export-a-few-more-symbols-for-ruby-prof.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.9.3/p374/railsexpress/08-thread-variables.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.9.3/p374/railsexpress/09-faster-loading.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.9.3/p374/railsexpress/10-falcon-st-opt.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.9.3/p374/railsexpress/11-falcon-sparse-array.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.9.3/p374/railsexpress/12-falcon-array-queue.patch
patchsets/ruby/1.9.3/p374/float_warnings000066400000000207147511530520013634 0ustar00https://raw.githubusercontent.com/knugie/rvm-patchsets/master/patches/ruby/1.9.3/p374/float_warnings/01-bigdecimal_float_warning.patch
patchsets/ruby/1.9.3/p374/default000066400000000011147511530520012234 0ustar00openssl3
patchsets/ruby/1.9.3/fedora000066400000000014147511530520011356 0ustar00ssl_no_ec2m
patchsets/ruby/1.9.3/p547/float_warnings000066400000000207147511530520013636 0ustar00https://raw.githubusercontent.com/knugie/rvm-patchsets/master/patches/ruby/1.9.3/p547/float_warnings/01-bigdecimal_float_warning.patch
patchsets/ruby/1.9.3/p547/default000066400000000063147511530520012245 0ustar00GH-488
CVE-2015-1855-p484
update-autoconf
openssl3
patchsets/ruby/1.9.3/p547/railsexpress000066400000004463147511530520013355 0ustar00https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.9.3/p547/railsexpress/01-fix-make-clean.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.9.3/p547/railsexpress/02-railsbench-gc.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.9.3/p547/railsexpress/03-display-more-detailed-stack-trace.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.9.3/p547/railsexpress/04-fork-support-for-gc-logging.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.9.3/p547/railsexpress/05-track-live-dataset-size.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.9.3/p547/railsexpress/06-webrick_204_304_keep_alive_fix.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.9.3/p547/railsexpress/07-export-a-few-more-symbols-for-ruby-prof.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.9.3/p547/railsexpress/08-thread-variables.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.9.3/p547/railsexpress/09-faster-loading.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.9.3/p547/railsexpress/10-falcon-st-opt.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.9.3/p547/railsexpress/11-falcon-sparse-array.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.9.3/p547/railsexpress/12-falcon-array-queue.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.9.3/p547/railsexpress/13-railsbench-gc-fixes.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.9.3/p547/railsexpress/14-show-full-backtrace-on-stack-overflow.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.9.3/p547/railsexpress/15-configurable-fiber-stack-sizes.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.9.3/p547/railsexpress/16-backport-psych-20.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.9.3/p547/railsexpress/17-fix-missing-c-return-event.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.9.3/p547/railsexpress/18-fix-process-daemon-call.patch
patchsets/ruby/1.9.3/head/railsexpress000066400000004660147511530520013556 0ustar00https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.9.3/head/railsexpress/01-fix-make-clean.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.9.3/head/railsexpress/02-zero-broken-tests.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.9.3/head/railsexpress/03-railsbench-gc.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.9.3/head/railsexpress/04-display-more-detailed-stack-trace.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.9.3/head/railsexpress/05-fork-support-for-gc-logging.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.9.3/head/railsexpress/06-track-live-dataset-size.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.9.3/head/railsexpress/07-webrick_204_304_keep_alive_fix.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.9.3/head/railsexpress/08-export-a-few-more-symbols-for-ruby-prof.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.9.3/head/railsexpress/09-thread-variables.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.9.3/head/railsexpress/10-faster-loading.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.9.3/head/railsexpress/11-falcon-st-opt.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.9.3/head/railsexpress/12-falcon-sparse-array.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.9.3/head/railsexpress/13-falcon-array-queue.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.9.3/head/railsexpress/14-railsbench-gc-fixes.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.9.3/head/railsexpress/15-show-full-backtrace-on-stack-overflow.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.9.3/head/railsexpress/16-configurable-fiber-stack-sizes.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.9.3/head/railsexpress/17-backport-psych-20.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.9.3/head/railsexpress/18-fix-missing-c-return-event.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.9.3/head/railsexpress/19-fix-process-daemon-call.patch
patchsets/ruby/1.9.3/head/float_warnings000066400000000207147511530520014040 0ustar00https://raw.githubusercontent.com/knugie/rvm-patchsets/master/patches/ruby/1.9.3/head/float_warnings/01-bigdecimal_float_warning.patch
patchsets/ruby/1.9.3/head/default000066400000000011147511530520012440 0ustar00openssl3
patchsets/ruby/1.9.3/p550/railsexpress000066400000004660147511530520013346 0ustar00https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.9.3/p550/railsexpress/01-fix-make-clean.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.9.3/p550/railsexpress/02-zero-broken-tests.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.9.3/p550/railsexpress/03-railsbench-gc.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.9.3/p550/railsexpress/04-display-more-detailed-stack-trace.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.9.3/p550/railsexpress/05-fork-support-for-gc-logging.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.9.3/p550/railsexpress/06-track-live-dataset-size.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.9.3/p550/railsexpress/07-webrick_204_304_keep_alive_fix.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.9.3/p550/railsexpress/08-export-a-few-more-symbols-for-ruby-prof.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.9.3/p550/railsexpress/09-thread-variables.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.9.3/p550/railsexpress/10-faster-loading.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.9.3/p550/railsexpress/11-falcon-st-opt.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.9.3/p550/railsexpress/12-falcon-sparse-array.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.9.3/p550/railsexpress/13-falcon-array-queue.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.9.3/p550/railsexpress/14-railsbench-gc-fixes.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.9.3/p550/railsexpress/15-show-full-backtrace-on-stack-overflow.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.9.3/p550/railsexpress/16-configurable-fiber-stack-sizes.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.9.3/p550/railsexpress/17-backport-psych-20.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.9.3/p550/railsexpress/18-fix-missing-c-return-event.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.9.3/p550/railsexpress/19-fix-process-daemon-call.patch
patchsets/ruby/1.9.3/p550/float_warnings000066400000000207147511530520013630 0ustar00https://raw.githubusercontent.com/knugie/rvm-patchsets/master/patches/ruby/1.9.3/p550/float_warnings/01-bigdecimal_float_warning.patch
patchsets/ruby/1.9.3/p550/default000066400000000063147511530520012237 0ustar00GH-488
CVE-2015-1855-p484
update-autoconf
openssl3
patchsets/ruby/1.9.3/p125/float_warnings000066400000000207147511530520013626 0ustar00https://raw.githubusercontent.com/knugie/rvm-patchsets/master/patches/ruby/1.9.3/p125/float_warnings/01-bigdecimal_float_warning.patch
patchsets/ruby/1.9.3/p125/default000066400000000011147511530520012226 0ustar00openssl3
patchsets/ruby/1.9.3/p125/railsexpress000066400000002325147511530520013340 0ustar00https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.9.3/p125/railsexpress/01-merge-revision-s-34719-34720-b.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.9.3/p125/railsexpress/02-railsbench-gc.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.9.3/p125/railsexpress/03-display-more-detailed-stack-trace.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.9.3/p125/railsexpress/04-fork-support-for-gc-logging.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.9.3/p125/railsexpress/05-track-live-dataset-size.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.9.3/p125/railsexpress/06-export-some-symbols-for-rubyprof.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.9.3/p125/railsexpress/07-revert-f6b49243eb0c21bea1c4198cdd52a549e6ead075.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.9.3/p125/railsexpress/08-backport-c2086cc7ff1142b14c95c.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.9.3/p125/railsexpress/09-webrick_204_304_keep_alive_fix.patch
patchsets/ruby/1.9.3/centos000066400000000014147511530520011411 0ustar00ssl_no_ec2m
patchsets/ruby/1.9.3/p484/railsexpress000066400000004463147511530520013355 0ustar00https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.9.3/p484/railsexpress/01-fix-make-clean.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.9.3/p484/railsexpress/02-railsbench-gc.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.9.3/p484/railsexpress/03-display-more-detailed-stack-trace.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.9.3/p484/railsexpress/04-fork-support-for-gc-logging.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.9.3/p484/railsexpress/05-track-live-dataset-size.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.9.3/p484/railsexpress/06-webrick_204_304_keep_alive_fix.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.9.3/p484/railsexpress/07-export-a-few-more-symbols-for-ruby-prof.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.9.3/p484/railsexpress/08-thread-variables.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.9.3/p484/railsexpress/09-faster-loading.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.9.3/p484/railsexpress/10-falcon-st-opt.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.9.3/p484/railsexpress/11-falcon-sparse-array.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.9.3/p484/railsexpress/12-falcon-array-queue.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.9.3/p484/railsexpress/13-railsbench-gc-fixes.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.9.3/p484/railsexpress/14-show-full-backtrace-on-stack-overflow.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.9.3/p484/railsexpress/15-configurable-fiber-stack-sizes.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.9.3/p484/railsexpress/16-backport-psych-20.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.9.3/p484/railsexpress/17-fix-missing-c-return-event.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.9.3/p484/railsexpress/18-fix-process-daemon-call.patch
patchsets/ruby/1.9.3/p484/default000066400000000063147511530520012245 0ustar00GH-488
CVE-2015-1855-p484
update-autoconf
openssl3
patchsets/ruby/1.9.3/p484/float_warnings000066400000000207147511530520013636 0ustar00https://raw.githubusercontent.com/knugie/rvm-patchsets/master/patches/ruby/1.9.3/p484/float_warnings/01-bigdecimal_float_warning.patch
patchsets/ruby/1.9.3/p385/default000066400000000011147511530520012236 0ustar00openssl3
patchsets/ruby/1.9.3/p385/railsexpress000066400000003023147511530520013344 0ustar00https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.9.3/p385/railsexpress/01-fix-make-clean.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.9.3/p385/railsexpress/02-railsbench-gc.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.9.3/p385/railsexpress/03-display-more-detailed-stack-trace.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.9.3/p385/railsexpress/04-fork-support-for-gc-logging.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.9.3/p385/railsexpress/05-track-live-dataset-size.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.9.3/p385/railsexpress/06-webrick_204_304_keep_alive_fix.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.9.3/p385/railsexpress/07-export-a-few-more-symbols-for-ruby-prof.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.9.3/p385/railsexpress/08-thread-variables.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.9.3/p385/railsexpress/09-faster-loading.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.9.3/p385/railsexpress/10-falcon-st-opt.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.9.3/p385/railsexpress/11-falcon-sparse-array.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.9.3/p385/railsexpress/12-falcon-array-queue.patch
patchsets/ruby/1.9.3/p385/float_warnings000066400000000207147511530520013636 0ustar00https://raw.githubusercontent.com/knugie/rvm-patchsets/master/patches/ruby/1.9.3/p385/float_warnings/01-bigdecimal_float_warning.patch
patchsets/ruby/1.9.3/redhat000066400000000014147511530520011365 0ustar00ssl_no_ec2m
patchsets/ruby/1.9.3/p327/float_warnings000066400000000207147511530520013632 0ustar00https://raw.githubusercontent.com/knugie/rvm-patchsets/master/patches/ruby/1.9.3/p327/float_warnings/01-bigdecimal_float_warning.patch
patchsets/ruby/1.9.3/p327/railsexpress000066400000003023147511530520013340 0ustar00https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.9.3/p327/railsexpress/01-fix-make-clean.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.9.3/p327/railsexpress/02-railsbench-gc.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.9.3/p327/railsexpress/03-display-more-detailed-stack-trace.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.9.3/p327/railsexpress/04-fork-support-for-gc-logging.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.9.3/p327/railsexpress/05-track-live-dataset-size.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.9.3/p327/railsexpress/06-webrick_204_304_keep_alive_fix.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.9.3/p327/railsexpress/07-export-a-few-more-symbols-for-ruby-prof.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.9.3/p327/railsexpress/08-thread-variables.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.9.3/p327/railsexpress/09-faster-loading.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.9.3/p327/railsexpress/10-falcon-st-opt.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.9.3/p327/railsexpress/11-falcon-array-queue.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.9.3/p327/railsexpress/12-falcon-sparse-array.patch
patchsets/ruby/1.9.3/p327/default000066400000000011147511530520012232 0ustar00openssl3
patchsets/ruby/1.9.3/p362/float_warnings000066400000000207147511530520013631 0ustar00https://raw.githubusercontent.com/knugie/rvm-patchsets/master/patches/ruby/1.9.3/p362/float_warnings/01-bigdecimal_float_warning.patch
patchsets/ruby/1.9.3/p362/railsexpress000066400000003023147511530520013337 0ustar00https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.9.3/p362/railsexpress/01-fix-make-clean.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.9.3/p362/railsexpress/02-railsbench-gc.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.9.3/p362/railsexpress/03-display-more-detailed-stack-trace.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.9.3/p362/railsexpress/04-fork-support-for-gc-logging.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.9.3/p362/railsexpress/05-track-live-dataset-size.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.9.3/p362/railsexpress/06-webrick_204_304_keep_alive_fix.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.9.3/p362/railsexpress/07-export-a-few-more-symbols-for-ruby-prof.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.9.3/p362/railsexpress/08-thread-variables.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.9.3/p362/railsexpress/09-faster-loading.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.9.3/p362/railsexpress/10-falcon-st-opt.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.9.3/p362/railsexpress/11-falcon-sparse-array.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.9.3/p362/railsexpress/12-falcon-array-queue.patch
patchsets/ruby/1.9.3/p362/default000066400000000062147511530520012237 0ustar00segfault_fix_7629
GH-488
update-autoconf
openssl3
patchsets/ruby/1.9.3/p448/float_warnings000066400000000207147511530520013636 0ustar00https://raw.githubusercontent.com/knugie/rvm-patchsets/master/patches/ruby/1.9.3/p448/float_warnings/01-bigdecimal_float_warning.patch
patchsets/ruby/1.9.3/p448/default000066400000000011147511530520012236 0ustar00openssl3
patchsets/ruby/1.9.3/p448/railsexpress000066400000003655147511530520013357 0ustar00https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.9.3/p448/railsexpress/01-fix-make-clean.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.9.3/p448/railsexpress/02-railsbench-gc.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.9.3/p448/railsexpress/03-display-more-detailed-stack-trace.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.9.3/p448/railsexpress/04-fork-support-for-gc-logging.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.9.3/p448/railsexpress/05-track-live-dataset-size.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.9.3/p448/railsexpress/06-webrick_204_304_keep_alive_fix.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.9.3/p448/railsexpress/07-export-a-few-more-symbols-for-ruby-prof.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.9.3/p448/railsexpress/08-thread-variables.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.9.3/p448/railsexpress/09-faster-loading.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.9.3/p448/railsexpress/10-falcon-st-opt.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.9.3/p448/railsexpress/11-falcon-sparse-array.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.9.3/p448/railsexpress/12-falcon-array-queue.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.9.3/p448/railsexpress/13-railsbench-gc-fixes.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.9.3/p448/railsexpress/14-show-full-backtrace-on-stack-overflow.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.9.3/p448/railsexpress/15-configurable-fiber-stack-sizes.patch
patchsets/ruby/1.9.3/p448/osx_static000066400000000021147511530520012773 0ustar00remove_digest_so
patchsets/ruby/1.9.3/p545/float_warnings000066400000000207147511530520013634 0ustar00https://raw.githubusercontent.com/knugie/rvm-patchsets/master/patches/ruby/1.9.3/p545/float_warnings/01-bigdecimal_float_warning.patch
patchsets/ruby/1.9.3/p545/railsexpress000066400000004463147511530520013353 0ustar00https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.9.3/p545/railsexpress/01-fix-make-clean.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.9.3/p545/railsexpress/02-railsbench-gc.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.9.3/p545/railsexpress/03-display-more-detailed-stack-trace.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.9.3/p545/railsexpress/04-fork-support-for-gc-logging.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.9.3/p545/railsexpress/05-track-live-dataset-size.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.9.3/p545/railsexpress/06-webrick_204_304_keep_alive_fix.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.9.3/p545/railsexpress/07-export-a-few-more-symbols-for-ruby-prof.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.9.3/p545/railsexpress/08-thread-variables.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.9.3/p545/railsexpress/09-faster-loading.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.9.3/p545/railsexpress/10-falcon-st-opt.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.9.3/p545/railsexpress/11-falcon-sparse-array.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.9.3/p545/railsexpress/12-falcon-array-queue.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.9.3/p545/railsexpress/13-railsbench-gc-fixes.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.9.3/p545/railsexpress/14-show-full-backtrace-on-stack-overflow.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.9.3/p545/railsexpress/15-configurable-fiber-stack-sizes.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.9.3/p545/railsexpress/16-backport-psych-20.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.9.3/p545/railsexpress/17-fix-missing-c-return-event.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.9.3/p545/railsexpress/18-fix-process-daemon-call.patch
patchsets/ruby/1.9.3/p545/default000066400000000063147511530520012243 0ustar00GH-488
CVE-2015-1855-p484
update-autoconf
openssl3
patchsets/ruby/1.9.3/p392/railsexpress000066400000003655147511530520013355 0ustar00https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.9.3/p392/railsexpress/01-fix-make-clean.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.9.3/p392/railsexpress/02-railsbench-gc.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.9.3/p392/railsexpress/03-display-more-detailed-stack-trace.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.9.3/p392/railsexpress/04-fork-support-for-gc-logging.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.9.3/p392/railsexpress/05-track-live-dataset-size.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.9.3/p392/railsexpress/06-webrick_204_304_keep_alive_fix.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.9.3/p392/railsexpress/07-export-a-few-more-symbols-for-ruby-prof.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.9.3/p392/railsexpress/08-thread-variables.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.9.3/p392/railsexpress/09-faster-loading.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.9.3/p392/railsexpress/10-falcon-st-opt.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.9.3/p392/railsexpress/11-falcon-sparse-array.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.9.3/p392/railsexpress/12-falcon-array-queue.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.9.3/p392/railsexpress/13-railsbench-gc-fixes.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.9.3/p392/railsexpress/14-show-full-backtrace-on-stack-overflow.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.9.3/p392/railsexpress/15-configurable-fiber-stack-sizes.patch
patchsets/ruby/1.9.3/p392/default000066400000000011147511530520012234 0ustar00openssl3
patchsets/ruby/1.9.3/p392/float_warnings000066400000000207147511530520013634 0ustar00https://raw.githubusercontent.com/knugie/rvm-patchsets/master/patches/ruby/1.9.3/p392/float_warnings/01-bigdecimal_float_warning.patch
patchsets/ruby/1.9.3/scientific000066400000000014147511530520012236 0ustar00ssl_no_ec2m
patchsets/ruby/1.9.3/cygwin000066400000000007147511530520011420 0ustar00GH-433
patchsets/ruby/1.9.3/p286/default000066400000000011147511530520012236 0ustar00openssl3
patchsets/ruby/1.9.3/p286/float_warnings000066400000000207147511530520013636 0ustar00https://raw.githubusercontent.com/knugie/rvm-patchsets/master/patches/ruby/1.9.3/p286/float_warnings/01-bigdecimal_float_warning.patch
patchsets/ruby/1.9.3/p286/railsexpress000066400000001651147511530520013351 0ustar00https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.9.3/p286/railsexpress/01-railsbench-gc.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.9.3/p286/railsexpress/02-display-more-detailed-stack-trace.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.9.3/p286/railsexpress/03-fork-support-for-gc-logging.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.9.3/p286/railsexpress/04-track-live-dataset-size.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.9.3/p286/railsexpress/05-webrick_204_304_keep_alive_fix.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.9.3/p286/railsexpress/06-export-a-few-more-symbols-for-ruby-prof.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.9.3/p286/railsexpress/07-thread-variables.patch
patchsets/ruby/1.9.3/p551/railsexpress000066400000004660147511530520013347 0ustar00https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.9.3/p551/railsexpress/01-fix-make-clean.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.9.3/p551/railsexpress/02-zero-broken-tests.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.9.3/p551/railsexpress/03-railsbench-gc.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.9.3/p551/railsexpress/04-display-more-detailed-stack-trace.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.9.3/p551/railsexpress/05-fork-support-for-gc-logging.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.9.3/p551/railsexpress/06-track-live-dataset-size.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.9.3/p551/railsexpress/07-webrick_204_304_keep_alive_fix.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.9.3/p551/railsexpress/08-export-a-few-more-symbols-for-ruby-prof.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.9.3/p551/railsexpress/09-thread-variables.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.9.3/p551/railsexpress/10-faster-loading.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.9.3/p551/railsexpress/11-falcon-st-opt.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.9.3/p551/railsexpress/12-falcon-sparse-array.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.9.3/p551/railsexpress/13-falcon-array-queue.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.9.3/p551/railsexpress/14-railsbench-gc-fixes.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.9.3/p551/railsexpress/15-show-full-backtrace-on-stack-overflow.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.9.3/p551/railsexpress/16-configurable-fiber-stack-sizes.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.9.3/p551/railsexpress/17-backport-psych-20.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.9.3/p551/railsexpress/18-fix-missing-c-return-event.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.9.3/p551/railsexpress/19-fix-process-daemon-call.patch
patchsets/ruby/1.9.3/p551/float_warnings000066400000000207147511530520013631 0ustar00https://raw.githubusercontent.com/knugie/rvm-patchsets/master/patches/ruby/1.9.3/p551/float_warnings/01-bigdecimal_float_warning.patch
patchsets/ruby/1.9.3/p551/default000066400000000063147511530520012240 0ustar00GH-488
CVE-2015-1855-p484
update-autoconf
openssl3
patchsets/ruby/1.8.4/default000066400000000101147511530520011537 0ustar00openssl-1.0
stdout-rouge-fix
no_sslv2
syck
backported-ossl-fixes
patchsets/ruby/2.6.4/default000066400000000026147511530520011544 0ustar00fix_string_corruption
patchsets/ruby/2.6.4/railsexpress000066400000001172147511530520012647 0ustar00https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.6.4/railsexpress/01-fix-broken-tests-caused-by-ad.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.6.4/railsexpress/02-improve-gc-stats.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.6.4/railsexpress/03-more-detailed-stacktrace.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.6.4/railsexpress/04-04-malloc-trim.patch.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.6.4/railsexpress/05-use-after-free-bug-in-symbol-c.patch
patchsets/ruby/2.5.7/railsexpress000066400000000572147511530520012654 0ustar00https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.5.7/railsexpress/01-fix-broken-tests-caused-by-ad.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.5.7/railsexpress/02-improve-gc-stats.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.5.7/railsexpress/03-more-detailed-stacktrace.patch
patchsets/ruby/2.4/head/railsexpress000066400000000600147511530520013377 0ustar00https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.4/head/railsexpress/01-skip-broken-tests.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.4/head/railsexpress/02-improve-gc-stats.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.4/head/railsexpress/03-display-more-detailed-stack-trace.patch
patchsets/ruby/2.4/head/float_warnings000066400000000205147511530520013671 0ustar00https://raw.githubusercontent.com/knugie/rvm-patchsets/master/patches/ruby/2.4/head/float_warnings/01-bigdecimal_float_warning.patch
patchsets/ruby/2.4.0/default000066400000000047147511530520011541 0ustar00ruby_2_4_gcc7
random_c_using_NR_prefix
patchsets/ruby/2.4.0/float_warnings000066400000000202147511530520013123 0ustar00https://raw.githubusercontent.com/knugie/rvm-patchsets/master/patches/ruby/2.4.0/float_warnings/01-bigdecimal_float_warning.patch
patchsets/ruby/2.4.0/railsexpress000066400000000567147511530520012650 0ustar00https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.4.0/railsexpress/01-skip-broken-tests.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.4.0/railsexpress/02-improve-gc-stats.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.4.0/railsexpress/03-display-more-detailed-stack-trace.patch
patchsets/ruby/2.1.7/float_warnings000066400000000202147511530520013127 0ustar00https://raw.githubusercontent.com/knugie/rvm-patchsets/master/patches/ruby/2.1.7/float_warnings/01-bigdecimal_float_warning.patch
patchsets/ruby/2.1.7/default000066400000000011147511530520011534 0ustar00openssl3
patchsets/ruby/2.1.7/railsexpress000066400000002176147511530520012652 0ustar00https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.1.7/railsexpress/01-zero-broken-tests.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.1.7/railsexpress/02-improve-gc-stats.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.1.7/railsexpress/03-display-more-detailed-stack-trace.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.1.7/railsexpress/04-show-full-backtrace-on-stack-overflow.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.1.7/railsexpress/05-funny-falcon-stc-density.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.1.7/railsexpress/06-funny-falcon-stc-pool-allocation.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.1.7/railsexpress/07-aman-opt-aset-aref-str.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.1.7/railsexpress/08-funny-falcon-method-cache.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.1.7/railsexpress/09-heap-dump-support.patch
patchsets/ruby/1.9.1/default000066400000000037147511530520011545 0ustar00openssl-1.0
nossl2
ssl_no_ec2m
patchsets/ruby/1.9.1/p431/default000066400000000055147511530520012234 0ustar00backport-2404
openssl-1.0
nossl2
ssl_no_ec2m
patchsets/ruby/1.8.6/default000066400000000053147511530520011547 0ustar00openssl-1.0
stdout-rouge-fix
no_sslv2
syck
patchsets/ruby/2.0.0/p647/float_warnings000066400000000207147511530520013624 0ustar00https://raw.githubusercontent.com/knugie/rvm-patchsets/master/patches/ruby/2.0.0/p647/float_warnings/01-bigdecimal_float_warning.patch
patchsets/ruby/2.0.0/p647/railsexpress000066400000001026147511530520013333 0ustar00https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.0.0/p647/railsexpress/01-zero-broken-tests.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.0.0/p647/railsexpress/02-railsexpress-gc.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.0.0/p647/railsexpress/03-display-more-detailed-stack-trace.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.0.0/p647/railsexpress/04-show-full-backtrace-on-stack-overflow.patch
patchsets/ruby/2.0.0/p598/railsexpress000066400000001026147511530520013340 0ustar00https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.0.0/p598/railsexpress/01-zero-broken-tests.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.0.0/p598/railsexpress/02-railsexpress-gc.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.0.0/p598/railsexpress/03-display-more-detailed-stack-trace.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.0.0/p598/railsexpress/04-show-full-backtrace-on-stack-overflow.patch
patchsets/ruby/2.0.0/p598/float_warnings000066400000000207147511530520013631 0ustar00https://raw.githubusercontent.com/knugie/rvm-patchsets/master/patches/ruby/2.0.0/p598/float_warnings/01-bigdecimal_float_warning.patch
patchsets/ruby/2.0.0/p0/default000066400000000111147511530520012044 0ustar00libyaml_p0-p353
GH-488
changeset_r45225
changeset_r45240
update-autoconf
patchsets/ruby/2.0.0/centos000066400000000014147511530520011376 0ustar00ssl_no_ec2m
patchsets/ruby/2.0.0/p481/float_warnings000066400000000207147511530520013620 0ustar00https://raw.githubusercontent.com/knugie/rvm-patchsets/master/patches/ruby/2.0.0/p481/float_warnings/01-bigdecimal_float_warning.patch
patchsets/ruby/2.0.0/p481/railsexpress000066400000001234147511530520013330 0ustar00https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.0.0/p481/railsexpress/01-zero-broken-tests.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.0.0/p481/railsexpress/02-railsexpress-gc.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.0.0/p481/railsexpress/03-display-more-detailed-stack-trace.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.0.0/p481/railsexpress/04-show-full-backtrace-on-stack-overflow.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.0.0/p481/railsexpress/05-fix-missing-c-return-event.patch
patchsets/ruby/2.0.0/head/float_warnings000066400000000207147511530520014025 0ustar00https://raw.githubusercontent.com/knugie/rvm-patchsets/master/patches/ruby/2.0.0/head/float_warnings/01-bigdecimal_float_warning.patch
patchsets/ruby/2.0.0/head/railsexpress000066400000001026147511530520013534 0ustar00https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.0.0/head/railsexpress/01-zero-broken-tests.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.0.0/head/railsexpress/02-railsexpress-gc.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.0.0/head/railsexpress/03-display-more-detailed-stack-trace.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.0.0/head/railsexpress/04-show-full-backtrace-on-stack-overflow.patch
patchsets/ruby/2.0.0/fedora000066400000000014147511530520011343 0ustar00ssl_no_ec2m
patchsets/ruby/2.0.0/default000066400000000031147511530520011526 0ustar00openssl3
update-autoconf
patchsets/ruby/2.0.0/p594/float_warnings000066400000000207147511530520013625 0ustar00https://raw.githubusercontent.com/knugie/rvm-patchsets/master/patches/ruby/2.0.0/p594/float_warnings/01-bigdecimal_float_warning.patch
patchsets/ruby/2.0.0/p594/railsexpress000066400000001026147511530520013334 0ustar00https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.0.0/p594/railsexpress/01-zero-broken-tests.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.0.0/p594/railsexpress/02-railsexpress-gc.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.0.0/p594/railsexpress/03-display-more-detailed-stack-trace.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.0.0/p594/railsexpress/04-show-full-backtrace-on-stack-overflow.patch
patchsets/ruby/2.0.0/cygwin000066400000000007147511530520011405 0ustar00GH-433
patchsets/ruby/2.0.0/scientific000066400000000014147511530520012223 0ustar00ssl_no_ec2m
patchsets/ruby/2.0.0/p451/default000066400000000072147511530520012224 0ustar00libyaml
changeset_r45225
changeset_r45240
update-autoconf
patchsets/ruby/2.0.0/p451/float_warnings000066400000000207147511530520013615 0ustar00https://raw.githubusercontent.com/knugie/rvm-patchsets/master/patches/ruby/2.0.0/p451/float_warnings/01-bigdecimal_float_warning.patch
patchsets/ruby/2.0.0/p451/railsexpress000066400000001234147511530520013325 0ustar00https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.0.0/p451/railsexpress/01-zero-broken-tests.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.0.0/p451/railsexpress/02-railsexpress-gc.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.0.0/p451/railsexpress/03-display-more-detailed-stack-trace.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.0.0/p451/railsexpress/04-show-full-backtrace-on-stack-overflow.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.0.0/p451/railsexpress/05-fix-missing-c-return-event.patch
patchsets/ruby/2.0.0/osx_static000066400000000007147511530520012265 0ustar00cc_env
patchsets/ruby/2.0.0/redhat000066400000000014147511530520011352 0ustar00ssl_no_ec2m
patchsets/ruby/2.0.0/p195/default000066400000000111147511530520012223 0ustar00libyaml_p0-p353
GH-488
changeset_r45225
changeset_r45240
update-autoconf
patchsets/ruby/2.0.0/p648/railsexpress000066400000001026147511530520013334 0ustar00https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.0.0/p648/railsexpress/01-zero-broken-tests.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.0.0/p648/railsexpress/02-railsexpress-gc.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.0.0/p648/railsexpress/03-display-more-detailed-stack-trace.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.0.0/p648/railsexpress/04-show-full-backtrace-on-stack-overflow.patch
patchsets/ruby/2.0.0/p648/float_warnings000066400000000207147511530520013625 0ustar00https://raw.githubusercontent.com/knugie/rvm-patchsets/master/patches/ruby/2.0.0/p648/float_warnings/01-bigdecimal_float_warning.patch
patchsets/ruby/2.0.0/p645/float_warnings000066400000000207147511530520013622 0ustar00https://raw.githubusercontent.com/knugie/rvm-patchsets/master/patches/ruby/2.0.0/p645/float_warnings/01-bigdecimal_float_warning.patch
patchsets/ruby/2.0.0/p645/railsexpress000066400000001026147511530520013331 0ustar00https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.0.0/p645/railsexpress/01-zero-broken-tests.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.0.0/p645/railsexpress/02-railsexpress-gc.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.0.0/p645/railsexpress/03-display-more-detailed-stack-trace.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.0.0/p645/railsexpress/04-show-full-backtrace-on-stack-overflow.patch
patchsets/ruby/2.0.0/p247/float_warnings000066400000000207147511530520013620 0ustar00https://raw.githubusercontent.com/knugie/rvm-patchsets/master/patches/ruby/2.0.0/p247/float_warnings/01-bigdecimal_float_warning.patch
patchsets/ruby/2.0.0/p247/synology000066400000000027147511530520012466 0ustar00broken_stack_protector
patchsets/ruby/2.0.0/p247/osx_static000066400000000053147511530520012762 0ustar0043449
43514
cc_env
static
remove_digest_so
patchsets/ruby/2.0.0/p247/default000066400000000111147511530520012221 0ustar00libyaml_p0-p353
GH-488
changeset_r45225
changeset_r45240
update-autoconf
patchsets/ruby/2.0.0/p247/optional000066400000000010147511530520012420 0ustar00logging
patchsets/ruby/2.0.0/p353/railsexpress000066400000001234147511530520013326 0ustar00https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.0.0/p353/railsexpress/01-zero-broken-tests.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.0.0/p353/railsexpress/02-railsexpress-gc.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.0.0/p353/railsexpress/03-display-more-detailed-stack-trace.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.0.0/p353/railsexpress/04-show-full-backtrace-on-stack-overflow.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.0.0/p353/railsexpress/05-fix-missing-c-return-event.patch
patchsets/ruby/2.0.0/p353/float_warnings000066400000000207147511530520013616 0ustar00https://raw.githubusercontent.com/knugie/rvm-patchsets/master/patches/ruby/2.0.0/p353/float_warnings/01-bigdecimal_float_warning.patch
patchsets/ruby/2.0.0/p353/default000066400000000111147511530520012217 0ustar00libyaml_p0-p353
GH-488
changeset_r45225
changeset_r45240
update-autoconf
patchsets/ruby/2.3.3/railsexpress000066400000000567147511530520012652 0ustar00https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.3.3/railsexpress/01-skip-broken-tests.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.3.3/railsexpress/02-improve-gc-stats.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.3.3/railsexpress/03-display-more-detailed-stack-trace.patch
patchsets/ruby/2.3.3/float_warnings000066400000000202147511530520013125 0ustar00https://raw.githubusercontent.com/knugie/rvm-patchsets/master/patches/ruby/2.3.3/float_warnings/01-bigdecimal_float_warning.patch
patchsets/ruby/2.3.3/default000066400000000047147511530520011543 0ustar00ruby_2_3_gcc7
random_c_using_NR_prefix
patchsets/ruby/2.2.4/default000066400000000045147511530520011541 0ustar00fix_installing_bundled_gems
openssl3
patchsets/ruby/2.2.4/railsexpress000066400000000567147511530520012652 0ustar00https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.2.4/railsexpress/01-zero-broken-tests.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.2.4/railsexpress/02-improve-gc-stats.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.2.4/railsexpress/03-display-more-detailed-stack-trace.patch
patchsets/ruby/2.2.4/float_warnings000066400000000202147511530520013125 0ustar00https://raw.githubusercontent.com/knugie/rvm-patchsets/master/patches/ruby/2.2.4/float_warnings/01-bigdecimal_float_warning.patch
patchsets/ruby/2.2.10/railsexpress000066400000000572147511530520012723 0ustar00https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.2.10/railsexpress/01-zero-broken-tests.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.2.10/railsexpress/02-improve-gc-stats.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.2.10/railsexpress/03-display-more-detailed-stack-trace.patch
patchsets/ruby/2.2.10/default000066400000000034147511530520011614 0ustar00fix_installing_bundled_gems
patchsets/ruby/2.5.5/railsexpress000066400000000572147511530520012652 0ustar00https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.5.5/railsexpress/01-fix-broken-tests-caused-by-ad.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.5.5/railsexpress/02-improve-gc-stats.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.5.5/railsexpress/03-more-detailed-stacktrace.patch
patchsets/ruby/2.6/head/railsexpress000066400000000770147511530520013411 0ustar00https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.6/head/railsexpress/01-fix-broken-tests-caused-by-ad.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.6/head/railsexpress/02-improve-gc-stats.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.6/head/railsexpress/03-more-detailed-stacktrace.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.6/head/railsexpress/04-malloc-trim.patch
patchsets/ruby/2.4.2/railsexpress000066400000000763147511530520012650 0ustar00https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.4.2/railsexpress/01-skip-broken-tests.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.4.2/railsexpress/02-improve-gc-stats.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.4.2/railsexpress/03-display-more-detailed-stack-trace.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.4.2/railsexpress/04-fix-gmp-compile-issue.patch
patchsets/ruby/2.4.2/float_warnings000066400000000202147511530520013125 0ustar00https://raw.githubusercontent.com/knugie/rvm-patchsets/master/patches/ruby/2.4.2/float_warnings/01-bigdecimal_float_warning.patch
patchsets/ruby/2.7.1/railsexpress000066400000000754147511530520012652 0ustar00https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.7.1/railsexpress/01-fix-broken-tests-caused-by-ad.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.7.1/railsexpress/02-improve-gc-stats.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.7.1/railsexpress/03-more-detailed-stacktrace.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.7.1/railsexpress/04-malloc-trim.patch
patchsets/ruby/2.6.6/railsexpress000066400000000754147511530520012656 0ustar00https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.6.6/railsexpress/01-fix-broken-tests-caused-by-ad.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.6.6/railsexpress/02-improve-gc-stats.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.6.6/railsexpress/03-more-detailed-stacktrace.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.6.6/railsexpress/04-malloc-trim.patch
patchsets/ruby/2.6.1/railsexpress000066400000000572147511530520012647 0ustar00https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.6.1/railsexpress/01-fix-broken-tests-caused-by-ad.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.6.1/railsexpress/02-improve-gc-stats.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.6.1/railsexpress/03-more-detailed-stacktrace.patch
patchsets/ruby/2.1/head/default000066400000000011147511530520012270 0ustar00openssl3
patchsets/ruby/2.1/head/railsexpress000066400000002231147511530520013376 0ustar00https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.1/head/railsexpress/01-zero-broken-tests.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.1/head/railsexpress/02-improve-gc-stats.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.1/head/railsexpress/03-display-more-detailed-stack-trace.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.1/head/railsexpress/04-show-full-backtrace-on-stack-overflow.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.1/head/railsexpress/05-funny-falcon-stc-density.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.1/head/railsexpress/06-funny-falcon-stc-pool-allocation.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.1/head/railsexpress/07-aman-opt-aset-aref-str.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.1/head/railsexpress/08-funny-falcon-method-cache.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.1/head/railsexpress/09-heap-dump-support.patch
patchsets/ruby/2.1/head/float_warnings000066400000000205147511530520013666 0ustar00https://raw.githubusercontent.com/knugie/rvm-patchsets/master/patches/ruby/2.1/head/float_warnings/01-bigdecimal_float_warning.patch
patchsets/ruby/2.4.5/railsexpress000066400000000567147511530520012655 0ustar00https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.4.5/railsexpress/01-skip-broken-tests.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.4.5/railsexpress/02-improve-gc-stats.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.4.5/railsexpress/03-display-more-detailed-stack-trace.patch
patchsets/ruby/2.5.8/railsexpress000066400000000572147511530520012655 0ustar00https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.5.8/railsexpress/01-fix-broken-tests-caused-by-ad.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.5.8/railsexpress/02-improve-gc-stats.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.5.8/railsexpress/03-more-detailed-stacktrace.patch
patchsets/ruby/2.3.4/railsexpress000066400000000567147511530520012653 0ustar00https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.3.4/railsexpress/01-skip-broken-tests.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.3.4/railsexpress/02-improve-gc-stats.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.3.4/railsexpress/03-display-more-detailed-stack-trace.patch
patchsets/ruby/2.3.4/default000066400000000076147511530520011546 0ustar00ruby_2_3_gcc7
fix_rb_thread_fd_close
random_c_using_NR_prefix
patchsets/ruby/2.3.4/float_warnings000066400000000202147511530520013126 0ustar00https://raw.githubusercontent.com/knugie/rvm-patchsets/master/patches/ruby/2.3.4/float_warnings/01-bigdecimal_float_warning.patch
patchsets/ruby/2.2.9/railsexpress000066400000000567147511530520012657 0ustar00https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.2.9/railsexpress/01-zero-broken-tests.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.2.9/railsexpress/02-improve-gc-stats.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.2.9/railsexpress/03-display-more-detailed-stack-trace.patch
patchsets/ruby/2.2.9/default000066400000000034147511530520011544 0ustar00fix_installing_bundled_gems
patchsets/ruby/2.2.3/default000066400000000045147511530520011540 0ustar00fix_installing_bundled_gems
openssl3
patchsets/ruby/2.2.3/float_warnings000066400000000202147511530520013124 0ustar00https://raw.githubusercontent.com/knugie/rvm-patchsets/master/patches/ruby/2.2.3/float_warnings/01-bigdecimal_float_warning.patch
patchsets/ruby/2.2.3/railsexpress000066400000000567147511530520012651 0ustar00https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.2.3/railsexpress/01-zero-broken-tests.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.2.3/railsexpress/02-improve-gc-stats.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.2.3/railsexpress/03-display-more-detailed-stack-trace.patch
patchsets/ruby/2.1.0/optional000066400000000021147511530520011727 0ustar00changeset_r44327
patchsets/ruby/2.1.0/railsexpress000066400000003017147511530520012636 0ustar00https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.1.0/railsexpress/01-current-2.1.1-fixes.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.1.0/railsexpress/02-zero-broken-tests.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.1.0/railsexpress/03-improve-gc-stats.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.1.0/railsexpress/04-display-more-detailed-stack-trace.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.1.0/railsexpress/05-show-full-backtrace-on-stack-overflow.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.1.0/railsexpress/06-fix-missing-c-return-event.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.1.0/railsexpress/07-backport-006e66b6680f60adfb434ee7397f0dbc77de7873.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.1.0/railsexpress/08-funny-falcon-stc-density.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.1.0/railsexpress/09-funny-falcon-stc-pool-allocation.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.1.0/railsexpress/10-aman-opt-aset-aref-str.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.1.0/railsexpress/11-funny-falcon-method-cache.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.1.0/railsexpress/12-backport-r44370.patch
patchsets/ruby/2.1.0/osx_static000066400000000007147511530520012266 0ustar00cc_env
patchsets/ruby/2.1.0/float_warnings000066400000000202147511530520013120 0ustar00https://raw.githubusercontent.com/knugie/rvm-patchsets/master/patches/ruby/2.1.0/float_warnings/01-bigdecimal_float_warning.patch
patchsets/ruby/2.1.0/default000066400000000072147511530520011534 0ustar00libyaml
GH-488
changeset_r45225
changeset_r45240
openssl3
patchsets/ruby/osx_static000066400000000001147511530520011622 0ustar00
patchsets/ruby/2.1.10/float_warnings000066400000000203147511530520013202 0ustar00https://raw.githubusercontent.com/knugie/rvm-patchsets/master/patches/ruby/2.1.10/float_warnings/01-bigdecimal_float_warning.patch
patchsets/ruby/3.0.0/railsexpress000066400000000351147511530520012634 0ustar00https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/3.0.0/railsexpress/01-improve-gc-stats.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/3.0.0/railsexpress/02-malloc-trim.patch
patchsets/ruby/2.2.7/float_warnings000066400000000202147511530520013130 0ustar00https://raw.githubusercontent.com/knugie/rvm-patchsets/master/patches/ruby/2.2.7/float_warnings/01-bigdecimal_float_warning.patch
patchsets/ruby/2.2.7/default000066400000000034147511530520011542 0ustar00fix_installing_bundled_gems
patchsets/ruby/2.2.7/railsexpress000066400000000567147511530520012655 0ustar00https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.2.7/railsexpress/01-zero-broken-tests.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.2.7/railsexpress/02-improve-gc-stats.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.2.7/railsexpress/03-display-more-detailed-stack-trace.patch
patchsets/ruby/2.3.0/float_warnings000066400000000202147511530520013122 0ustar00https://raw.githubusercontent.com/knugie/rvm-patchsets/master/patches/ruby/2.3.0/float_warnings/01-bigdecimal_float_warning.patch
patchsets/ruby/2.3.0/railsexpress000066400000000567147511530520012647 0ustar00https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.3.0/railsexpress/01-skip-broken-tests.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.3.0/railsexpress/02-improve-gc-stats.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.3.0/railsexpress/03-display-more-detailed-stack-trace.patch
patchsets/ruby/2.3.0/cygwin000066400000000027147511530520011412 0ustar00fix_resolv_kernel32_dllpatchsets/ruby/2.3.0/default000066400000000070147511530520011534 0ustar00ruby_2_3_gcc7
changeset_r53419
random_c_using_NR_prefix
patchsets/ruby/1.8.5/default000066400000000131147511530520011543 0ustar00openssl-1.0
stdout-rouge-fix
no_sslv2
syck
backported-ossl-fixes
math_gcc_fix
gcc44_dtoa
patchsets/ruby/1.9.2/p320/railsexpress000066400000001026147511530520013331 0ustar00https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.9.2/p320/railsexpress/01-railsbench-gc-patch.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.9.2/p320/railsexpress/02-display-more-detailed-stack-trace.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.9.2/p320/railsexpress/03-fork-support-for-gc-logging.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.9.2/p320/railsexpress/04-track-live-dataset-size.patch
patchsets/ruby/1.9.2/p320/default000066400000000011147511530520012222 0ustar00openssl3
patchsets/ruby/1.9.2/p318/default000066400000000011147511530520012231 0ustar00openssl3
patchsets/ruby/1.9.2/p318/railsexpress000066400000001026147511530520013340 0ustar00https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.9.2/p318/railsexpress/01-railsbench-gc-patch.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.9.2/p318/railsexpress/02-display-more-detailed-stack-trace.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.9.2/p318/railsexpress/03-fork-support-for-gc-logging.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.9.2/p318/railsexpress/04-track-live-dataset-size.patch
patchsets/ruby/1.9.2/head/default000066400000000034147511530520012444 0ustar00r42282
ssl_no_ec2m
openssl3
patchsets/ruby/1.9.2/default000066400000000034147511530520011543 0ustar00GH-488
ssl_no_ec2m
openssl3
patchsets/ruby/1.9.2/p290/railsexpress000066400000001420147511530520013335 0ustar00https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.9.2/p290/railsexpress/01-railsbench-gc-patch.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.9.2/p290/railsexpress/02-display-more-detailed-stack-trace.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.9.2/p290/railsexpress/03-fork-support-for-gc-logging.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.9.2/p290/railsexpress/04-track-live-dataset-size.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.9.2/p290/railsexpress/05-load-performance-fix.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.9.2/p290/railsexpress/06-trace-bmethods.patch
patchsets/ruby/1.9.2/p290/default000066400000000011147511530520012230 0ustar00openssl3
patchsets/ruby/1.9.2/p180/default000066400000000043147511530520012233 0ustar00nossl2
GH-488
ssl_no_ec2m
openssl3
patchsets/ruby/1.9.2/p180/railsexpress000066400000001226147511530520013337 0ustar00https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.9.2/p180/railsexpress/01-railsbench-gc-patch.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.9.2/p180/railsexpress/02-display-more-detailed-stack-trace.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.9.2/p180/railsexpress/03-fork-support-for-gc-logging.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.9.2/p180/railsexpress/04-track-live-dataset-size.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.9.2/p180/railsexpress/05-load-performance-fix.patch
patchsets/ruby/2.1.4/default000066400000000011147511530520011531 0ustar00openssl3
patchsets/ruby/2.1.4/float_warnings000066400000000202147511530520013124 0ustar00https://raw.githubusercontent.com/knugie/rvm-patchsets/master/patches/ruby/2.1.4/float_warnings/01-bigdecimal_float_warning.patch
patchsets/ruby/2.1.4/railsexpress000066400000002006147511530520012637 0ustar00https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.1.4/railsexpress/01-zero-broken-tests.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.1.4/railsexpress/02-improve-gc-stats.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.1.4/railsexpress/03-display-more-detailed-stack-trace.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.1.4/railsexpress/04-show-full-backtrace-on-stack-overflow.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.1.4/railsexpress/05-funny-falcon-stc-density.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.1.4/railsexpress/06-funny-falcon-stc-pool-allocation.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.1.4/railsexpress/07-aman-opt-aset-aref-str.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.1.4/railsexpress/08-funny-falcon-method-cache.patch
patchsets/ruby/2.6.5/railsexpress000066400000000754147511530520012655 0ustar00https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.6.5/railsexpress/01-fix-broken-tests-caused-by-ad.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.6.5/railsexpress/02-improve-gc-stats.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.6.5/railsexpress/03-more-detailed-stacktrace.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.6.5/railsexpress/04-malloc-trim.patch
patchsets/ruby/2.7.2/railsexpress000066400000000754147511530530012654 0ustar00https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.7.2/railsexpress/01-fix-broken-tests-caused-by-ad.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.7.2/railsexpress/02-improve-gc-stats.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.7.2/railsexpress/03-more-detailed-stacktrace.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.7.2/railsexpress/04-malloc-trim.patch
patchsets/ruby/2.4.1/float_warnings000066400000000202147511530530013125 0ustar00https://raw.githubusercontent.com/knugie/rvm-patchsets/master/patches/ruby/2.4.1/float_warnings/01-bigdecimal_float_warning.patch
patchsets/ruby/2.4.1/default000066400000000031147511530530011534 0ustar00random_c_using_NR_prefix
patchsets/ruby/2.4.1/railsexpress000066400000000567147511530530012652 0ustar00https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.4.1/railsexpress/01-skip-broken-tests.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.4.1/railsexpress/02-improve-gc-stats.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.4.1/railsexpress/03-display-more-detailed-stack-trace.patch
patchsets/ruby/2.5/head/railsexpress000066400000000603147511530530013404 0ustar00https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.5/head/railsexpress/01-fix-broken-tests-caused-by-ad.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.5/head/railsexpress/02-improve-gc-stats.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.5/head/railsexpress/03-more-detailed-stacktrace.patch
patchsets/ruby/2.5.6/railsexpress000066400000000572147511530530012654 0ustar00https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.5.6/railsexpress/01-fix-broken-tests-caused-by-ad.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.5.6/railsexpress/02-improve-gc-stats.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.5.6/railsexpress/03-more-detailed-stacktrace.patch
patchsets/ruby/2.4.6/railsexpress000066400000000567147511530530012657 0ustar00https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.4.6/railsexpress/01-skip-broken-tests.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.4.6/railsexpress/02-improve-gc-stats.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.4.6/railsexpress/03-display-more-detailed-stack-trace.patch
patchsets/ruby/2.2/head/float_warnings000066400000000205147511530530013670 0ustar00https://raw.githubusercontent.com/knugie/rvm-patchsets/master/patches/ruby/2.2/head/float_warnings/01-bigdecimal_float_warning.patch
patchsets/ruby/2.2/head/default000066400000000011147511530530012272 0ustar00openssl3
patchsets/ruby/2.2/head/railsexpress000066400000000600147511530530013376 0ustar00https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.2/head/railsexpress/01-zero-broken-tests.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.2/head/railsexpress/02-improve-gc-stats.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.2/head/railsexpress/03-display-more-detailed-stack-trace.patch
patchsets/ruby/2.5.1/default000066400000000015147511530530011537 0ustar00libressl_2_7
patchsets/ruby/2.5.1/railsexpress000066400000000572147511530530012647 0ustar00https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.5.1/railsexpress/01-fix-broken-tests-caused-by-ad.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.5.1/railsexpress/02-improve-gc-stats.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.5.1/railsexpress/03-more-detailed-stacktrace.patch
patchsets/ruby/2.6.2/railsexpress000066400000000572147511530530012651 0ustar00https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.6.2/railsexpress/01-fix-broken-tests-caused-by-ad.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.6.2/railsexpress/02-improve-gc-stats.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.6.2/railsexpress/03-more-detailed-stacktrace.patch
patchsets/ruby/2.1.9/float_warnings000066400000000202147511530530013132 0ustar00https://raw.githubusercontent.com/knugie/rvm-patchsets/master/patches/ruby/2.1.9/float_warnings/01-bigdecimal_float_warning.patch
patchsets/ruby/2.1.3/railsexpress000066400000002006147511530530012637 0ustar00https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.1.3/railsexpress/01-zero-broken-tests.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.1.3/railsexpress/02-improve-gc-stats.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.1.3/railsexpress/03-display-more-detailed-stack-trace.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.1.3/railsexpress/04-show-full-backtrace-on-stack-overflow.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.1.3/railsexpress/05-funny-falcon-stc-density.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.1.3/railsexpress/06-funny-falcon-stc-pool-allocation.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.1.3/railsexpress/07-aman-opt-aset-aref-str.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.1.3/railsexpress/08-funny-falcon-method-cache.patch
patchsets/ruby/2.1.3/default000066400000000011147511530530011531 0ustar00openssl3
patchsets/ruby/2.1.3/float_warnings000066400000000202147511530530013124 0ustar00https://raw.githubusercontent.com/knugie/rvm-patchsets/master/patches/ruby/2.1.3/float_warnings/01-bigdecimal_float_warning.patch
patchsets/ruby/2.2.0/float_warnings000066400000000202147511530530013122 0ustar00https://raw.githubusercontent.com/knugie/rvm-patchsets/master/patches/ruby/2.2.0/float_warnings/01-bigdecimal_float_warning.patch
patchsets/ruby/2.2.0/railsexpress000066400000001206147511530530012636 0ustar00https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.2.0/railsexpress/01-zero-broken-tests.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.2.0/railsexpress/02-improve-gc-stats.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.2.0/railsexpress/03-display-more-detailed-stack-trace.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.2.0/railsexpress/04-backport-401c8bb.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.2.0/railsexpress/05-fix-packed-bitfield-compat-warning-for-older-gccs.patch
patchsets/ruby/2.2.0/default000066400000000045147511530530011536 0ustar00fix_installing_bundled_gems
openssl3
patchsets/ruby/2.3.7/railsexpress000066400000000567147511530530012657 0ustar00https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.3.7/railsexpress/01-skip-broken-tests.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.3.7/railsexpress/02-improve-gc-stats.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.3.7/railsexpress/03-display-more-detailed-stack-trace.patch
src/rvm/gemsets/jruby/global.gems000066400000000114147511530530013060 0ustar00jruby-openssl
jruby-launcher
gem-wrappers
rubygems-bundler
rake
rvm
bundler
src/rvm/gemsets/README.md000066400000000544147511530530011076 0ustar00It is important to keep `default.gems` and `global.gems` even empty to
trigger automatic addition of gems to this files.

Every type of ruby, version and patchlevel can have its own file for
`default.gems` or `global.gems`. The longest path takes precedence and
overwrites previous files, the files are not merged to allow removing
gems from installation.
src/rvm/gemsets/default.gems000066400000000000147511530530012103 0ustar00src/rvm/gemsets/truffleruby/global.gems000066400000000021147511530530014273 0ustar00gem-wrappers
rvm
src/rvm/gemsets/ruby/1.8.5/global.gems000066400000000042147511530530013357 0ustar00gem-wrappers
rubygems-bundler
rvm
src/rvm/gemsets/ruby/1.8.6/global.gems000066400000000042147511530530013360 0ustar00gem-wrappers
rubygems-bundler
rvm
src/rvm/gemsets/ruby/1.8.7/global.gems000066400000000070147511530530013362 0ustar00gem-wrappers
rubygems-bundler
rake -v <10.2
rvm
bundler
src/rvm/gemsets/global.gems000066400000000057147511530530011733 0ustar00gem-wrappers
rubygems-bundler
rake
rvm
bundler
src/rvm/gem-cache/rvm-1.11.3.9.gem000066400000047000147511530530012143 0ustar00data.tar.gz0000644000000000000000000004026300000000000013324 0ustar00wheelwheel00000000000000�sy�R�}�w�Ƶ�YŘJK2���K�X�]�I|���N��*HBb`P�������fŐ�Gi����"0˝����YU�y:����ق�ޝ;�/<��w������Ν����~;��3�꤄��N�t��ܪ���M�u�������6������퍝?��}���g����QQ��r><?N��Ӵ��"WŬ��B���Su�Nfi�SӴ<N�j}��ښi�O�����ݍ�?cӣ�,�Q=9Wez-b;{��`��'�5?ʎ��v����v7v���d<�f�y���d2O���}џW��Ǝ��=������ ��C0�iZ�c����T�˳
�'�U������r_;[�7�v���샂���Z��{����g��S���6�ʷPz8?V�IR�Y���y
�6�z�	@�#uTS5L���ۆ��@��DM�Q�W4W�Ir�r�
�AC�e�E�L6�s�o�|쮭����ݍ��߸PyA#S?�����:KGN��F-\��C2�M��$��F=5���:�4��6q�x{���WߥS�<�Iy���Jg9�YQe��x���i@B�5şk��WuR׳jos�fe>쏊��Yr��i�ϳ�{@Sݵ����E�gGiU�ϧ˰ۯzV��
����
���gC}o(��
�n�����o^<�O����Q6I��I6Ľ�/���f��fe�Om&�,�M�$�ϖ�`^&����d��{���N`V��0K�:^�.�ɒ��:�d���ge2��va��CYe�]�î�L�ѦI>���F����dX�e2��N��(�����}����F�2��:V��k:�T��.����X
Gt��Jh|�{��1'�7�c�ߺ������o�u<�Hɮ�!��"���:k]}�V�2#2xm
��������u������]��3F3	��%�qJPwe�2�W����K!F��,b
��ľ�XCH�b�VP\)��1��T���6�AŸ1��ނ/I6�v�Gx;��O��M�P�&4�3�$m���UX%Ӕ{<I�aJ���~�:�"��#�'Y�C���}�TU���	��]��xH��8���8�5��i����t�p҈^��tR�p�y�P%\ˊ��_���V����{V�������}s��婓���G	\�j�k�½�~�Z[��T�d��=|,l�1lV�z=ωy��X��-x�-AE.�����{Ę�.]��������ǒ�]�����ν��۾�{s���YW��|y�U${�N��׏_=[[_[W���4���%$�J�b���T#$v��d��/�)˦�%���,|�C�ώ�y1o���d
�{R�
vdOA	\�e��W]���QV�F�ˆ~�`�㧓�h��a�(��[��!��?��
���fHeTU���d>֍u�=��^�	1�1NMS��=*��˴�')�-2ѮhrX��O�D�3���L�lW�#E�֘�u��d$�<H��l�;X���W���`���vھmɢ�
�궴|�k�
I����L��[��;"r�5�Nr��8�t�WO�щ�>�U2��94sQ��~�B*���i�a��=�\��V�0$��ol��Կ�1۾_U�U�N����#��nC8ܪPEޥ?�Q��Z�$����Pv���[v�{"UZ��Hߝ�d0,�A�>N��ٽ}9���w���wNR�Af��	��$�@V�%����<��7@ϴ�Рt�h���!��c•���	�fRvf����V"��x��:�ۣC�)]a�Po�)эm����&�?Md�V=}"`��v�{��2EQ�X�4��%�B�m��n�l'Sm�b���G��f�rV�n�@U�K�,{t\}�[��)�S� &!�m����^��
[Z��R؍��'y�3r:�Q"N���
��i��8tM�`�p�dXϓ
�g6i{�������6�����=��O"�!��4�a+����Ts�pI娋�þ���a
G�Lj����<ԧ�� CIOS�x�L�!*J��(K�<9WB�d#�YEH�##��<��L)��Z]��UZ�7j'��trD��AgQ�b�IΣ��2rX\$�i�.��!hX��E���ˎe�Ǔb�L�v�h:N��d��-9-2T��	��<M�>�<Y��;�nf�Ԁ�g�f�GW�qg�ޟ�CT���ӗ=h����^<mަ#�
�a���s��'�,�!�H��1�ͪ�
��­��g9���\���s}�=����ތv�/@^�Ӣ䃸Ak�I��w�u��Y��|n�����a�nrs)�A,��I�K���2^@L9ΎP���$���?��i����������E4:IqF�	�]xt�Z�CU�,��h�-�(mR$���ւ+K�7��:Q�1,�D6��y��W_HL�,�	n�ch���d�S��*l3��B'i�6A?�~
4
�#!'p��]�(�$!�Jh�
����iz|�+`�&5��@��&e�{��KB�@^#��!�y~g4O�z4�yդ��i����>��&9{��h��d%Y�9<P�E|���+[���Si@ֺ�V*����t�l���u��H6��C\8��s�tᤠ<�,k�P4�%�7��nE���@*�,�B�=�+�tf�f���b6���,ܞ"5Wgp�y�ƨ}]ZQ
���R���ݞ��w[]ܼ��GSU�TP�[��p��S������e������I@]2կ{�?�����ɖ��X;<\I�jQ4��EU��>��U��<M�X����W�����$�W��V���-g��=�/I��SN�we���$���`��p��v�"٣Qyc�(��?��u��.���굺�
�������?���h�RQ��ur6=��a�`33v�*p(H�>����<�*�ZRϯp�u]��߱�\ۼ�������`a�l,e}��L�����Fp�Ӿ-L������J$�F� Â#q"l.�B1?>�E8U�*�B<X�@9 �h��
m�2�@�"�K�8��V�E��,E-H�!%�`Έ�_������$�/�U�t�]Ӏ��չpVl����u�b�i�g�]v����a�..�<�s+�]��U�&��x�j���K��7���]#þ�$�Fs��p���OxZh�ֈ���-`�
���dˆ�� ���<σe�|H�;4��T�}����N��Y��n�0oH�{{�(�A

ٱ���7=5|����z��%�ep��~A���%`�wR�<�`{u<t��BOEk�#c|�M����D&F� a�G��O"����=�*���	!�IE��f@ÞJ�G�;{��u;�`F����Dˬ���Co�Us����FooL*[��������-U��y�Yo}�>V�w���{�vvn�?��x|sa�mp���L�H� @��D�&�	+@չ�*Ĵt`�u��tO�ay �q1��n�~��5F.M���Ѩ��%�SFH����7��.�&>���I$Z��>
������䭃��[�zs�G�;�XL��}{V��'
���ԥ�I]�N}�x��L����.��ѳB�M:I딙M�E`�KtȈŭ�]0��0��bN����!$OH��@��ķ� ���Qp���We5�._��B�,QB�Q��XM��k�8N�<G!�7!��z����q8R�[K͑�FqI�ZtT���I�$x&}&Ug�v�&� lY�!��3KHFm��#~���p6��>�Vg��.��t��Ϧ����.Aa��ڰ��-m�N����
��"aǦ��nM���'ɞr��U�6F����d_���p�������C0�Oa��}	�:�_�Yn��y�XA���O��߾{����j��_��D$��_1{-�j �� �?�uq��j�$_*U�rDڸc�DI��l�A}>K?Z����k�2�n�K�<D�|�)ؼ�W��0��O���"��'ܺ�
�����0��m�����@��n
J��`��{RG��G7��Aq����w�S���x�{f��^���6I��sf���Hz��礗�"08%2�Ƙ�xTL�Ff@0ȗŀ���%ozG��jx��+�k8j㮘�u50x���eY��=��*G���&��/Z�`ɝ��>��f�oȄ�z��}�k�X%��ǿ�w�v���^�s������&��l�W�=ar�I%v.sdV�Ԁ���%��e3��}����3��	���@Z��^�W����*�Wϖ�+�/�]+ZJ~Yy�i���ΞG��fW��X=��P�˫���Z����@�\����=x�"EZ���y�;j���w��0�Y9$��"����7�5<ϕ���m��Q�&��*0d��j���w{gHy��..����-p�>���̬�v+-�S�ր�g%������r�I�?Ν��ΐ���$���c$H�}�K
Dc��P���ݟp*�2���껴�<媄�]�k"�U���#����	�ty,��M�|���(~E�?���\�J�Dyw�Zg
$�轒|�кd1C�o�	���u	��QX�
{�?4����e$.�
�r����1[�!����yϬ�>P��>��'
���;�zv�ZiUt�C��
{�?�͝����B"m.'��bt� �%	M�Bi�)��0�"���o�h���8����?�YV��J�so�N��۽����r��$��s�7z��Qd���Li��;h�(�ԫ�o��W}x�=��Щ,�N������=��N��XϷ�� ��	4�Rl�� �����.R��Zg�n��SUm��4�1�jE�
����61_��@�gQs�X�1�3�ʅL��HW�;e�H�1��7�#ĩě�_���V{%�EwyIڲ$ho�/��C9a�v���V~+�ck޴��5M�`�r�w��]O�6N[==vK�e63s���V��ݲQ%�+�K��\��]��)\���l+����D,�
��p��[���<�7�f)�%lH������[��N���aӿ�4r�g�c����{w;��uk�&��<W�������-�|u��1�&?6�F���e��?~`0��ge0+�	�@v����`7 :N1f�\��9p
��,idE)77'7(&�q�`��H��S�m�<�C����ȯ�$��_f�(��OF��Z�u��Qr���q�׿1� Ka�?K
x�w��`Oc�D>	���AtN�M��_j_T�2m�R�aZ��)���[yQ�U�bv�=�lߍ�EzʔY�g��LV�l�b�V@Z���I���i�V$ /,P�f��:��IC~���N�U=?:��4�Ղ���+CH�W@Ui���3{��Jؘ(�F+�����5����#E'5�Ri"u�4pPS��G��@¥���
&�n��8�{DF�`�p�+F��P��T��0ڡ��ql�ߖv�4'Q$t3��{[���������t��['�f|���*�b(6r�k��1nO��2~@��Mj��/f� m#=݃�mߛ$�USxI�G�}g[2[؁�y��t��0_qg��"Zq1Z@9�]D�ؽ2�M�Q: o"��#
iol�sȥ.�:0���7��"bn�D���<��%U�)9�����i��;z�X�\y�>�8�u���lw��B�2`U�:��qƐ蚱Erb@��45�S�Q����bn�`O�ݓ`X�č��[:�a���ܯ8��c�9��ͻΎ�f�g{r⨣�B4AN�x8��|���0U�x.��ϑǶ�G�OҌqMt4��sK�=c��	….�s!2�K�{��@��3ܟ���hgÿ���?�F;��Ċ�9�p�82�"S-�s���6Z�!���\�#WZh5��ƑK?�H��X�+�b̕b,,�eM����X-�mQ�%嘰���<#&�rg�B�&懚��+���"���j>�l��_l�T���j��y9���!�"�=�!�%R�D����-$�D�,	��9�j{|�r˺
�p�	/侯02��#��T�~��K�A�tR�Ǣy�aKl����r�j���DX,Ϙ;�^5@�Ji~�!���K��W��_��x�<E�`�qx��p>����(�O�%Dx��>��^���@po�����D,Š�]f 2���1T��(2/b�;�j�64���Z�%|+�@~ �u"��50֢����(�e������Qx]oj"ιH�<��\���8/����O���n�G�5�g�׈kG����y���|a}D��D�RN���!BO�����-�"���e����q܇j��ٌ�ޯ`@
Y�Ԛ;�e4�B*���a�isEvk�ȭ�5��/t��Á/�O�ǫv�A�����)�0<`�"�Clz?2���O�8���������[w�vB��;wo����1�Γ餽��)� p��v^�F�������C�h���+_��M�fxTt�t�++�v}��6�y߉�#mq��x�([Gl���=~�,M���s�����G�{��l}�8����l��Q�����S�?�ə��|/	aok"N�0�])�k��u�E�0φ���\��{��3~�^EL��6�H[1!��x H�0�3
�� Hc��Tc�N9������s!d.Z��XO�~�7w�����Ox0�~]v�
�.o5�^ϡ�o6N�L�|��
�ʷۢ��l�E�&��Dm�ȴ�6��ݙD�[f9������+3�h�y�Ȓ��)g����{S6bh@�L�#���U�%@-����U��N��O��]n@�;�4`�Oū��t澛l#̆��"c��"�
|�r�jJ�6��So�\��m|�*�T�&U�yn����g�ǂ��B�(�i�A�+{��f�&�M�C�bѰU�>���М�r?��!=�i���bq��Aȣ�T�Z�]s�H�x��BQ��(�:�45�z@��h���7W>N�x��K�`�p!�3�k�~rZǚ1��YO�|����w�����>�f0&�(���$%�8�#�H�Ϟp�5�������ݙW���l+��f�)V���m�Ylj�5 ��P돍I�]v�t"�GjV���׀N	��̒ �]bO�e��;�:�
��%�4+���v{�*J�ez���0�P��
�����q�����L[[��4�f��pZ
L�F�Smv�u���{x�]����S�����^�w����h�����,+��=��7v�Ξ��;�CO̪�#��u��<WQ&��&;i��6�}��A9�c��M�€w�I����p�^DC����S��@�/��ѓ�Et�X|@���у���d�c�o��HP9����S��0;�',�n���X���nm��_����o���x��K"O7tb[GrG�;�sȖ%��b��-�A�.�^nw�g�D�ђT��}��8X	�j20��Ai�z8�լ3g�v��L)��X�[�y��
8�Яҵ�scO���K}��B�Mz�yvc7�|/�t�ף���֌��f�yu��OFp�P��	��VD$lgK.��Ûڼ��[�.t�5�
[5����>l�3p��N:�ҩO|u�0�|�t�IG�|!��F	1Q[�6wm�22���4�|�8��#N�#�(����H�YެF�X��jN>"@~�(#�v�8b]E3w�"aF�o��?;�3�|v�(A1'�'%k��ZDW�P���j<栻��&d� =n��'F������߹�����_�s5����Ҍ�.0+��Cw�$�E�y��_.�Vb��JC��^�<?�hm^<^�Vp�dO�`�I$d����I���ηD%|7����S1��i�$IW���T�A£vcI)"	��1E�C8��C3��zh�i�~�sYD>_Nt��.7~��%sh��cN)��.@�eȍ�������fU�ȧ�"?�a�ݥp�nINn���#���l$�You�#K�y
��*Q����ɹ�9���"�RxR�:�Q-����:�Cَu"]x�$
X˧EC�#;�ʁ�3٦$RB�	'���8+;T� �*�E��@�^r�_��,��&_ۋ��	枧]-~���6!����Ϩ@~��Q��k�v�!&����3������ž�����I��"�{
�9Yg�>��d^��*�NT�P~\��D�BUo��.�	�n���1�-�p}�Ѕa�(�C��긅�G��N.���ː�cN�K\���)�7�&V�ʰP�Y�a��*���UBp�6G1�bT�,9����쇬�<�gȀ�ķfS���W�8U�������`4�8��Lځ�?T��ی�}k�T'h�1�J8�6e,��~�J�_HK��l��I���e튏�-�X�t�qTf���2��1��۔��Ft��:�g�)�$�:���m�_�ڌŒt�j�������2��#9<9���"�v����K�`�J��p�,.�&o���?=?T�Zޒ;'!�Vk���-�GB,��`ET��C���U@��%��.��,>W�N���$~�L~��;c�4zh��s�u	��ܭN@Q0;Op����0K{Z�F����Aou�ԃ�[g#o�.�1T���@�'��Z�XȪ�n7�P�R]�:K3����E��7~1A/�K��C�v����J��X�����Z<��透&ʈE��m��^�\���U�c�y>�:�/����?Ҳ����Ϊ�����bf"'k]���26��zwT�W���b-]-'}��$��I!tp�©;MmVY[�(d1�`w�\���0=��Vg�*h����g�6�N���ʼnZ��w������BX�3_�K_~�AF���H����m���u#����j�;�2���"�r�(�A�	�eR)��aO�#?ӿ�뒣�;�u�_�|�~v�&naZ,hW*���Df?o��-��wX�����IS��j�r��G}0ܖ#K�z�lb9���5�����6���ɘܝ�)9\�� m�x����i�����V�ւ�c��+N�,�c��/���<�/ջ�@�զ�#�,G�7�`%=,�P��h�Ђl;ݗI]=E 0�,��Oz>\
�I�m�o:�캙ݨ��b�CN%�ND,P�5��2]�޿~����1���llԂ^asp�X��-ұ��L-�l�B�3�|�~`��G�Oע�����BWT�p�Eh�,GD#�^��I�&�B����qC�1,mӌ�ܶ~#��UƸ�ɞQ��Kk̷#.�ե�)�#7�R�d(��r&�|�s|�F�e�/�3,��Q�E� ��2;��
Zt�j�!
aZP,�< �0۞n��_6�N�5��7�3
jr=�߶w���
�vvo�]�s�����>��^�}���7(:�C�� �\9��ա�|u��"xy��?(bD�[��&	27G�dD>���~u��)O����w����l3�x��ڇ�T��n�$��:NV�$IX�(.�Zf0��e&�uJI�U��f��\�P��X�_��Ǚ�|?N����Oy5ں���dG��Y�J��k蹂ɳ��S!�xGQ��m���4���)����Рx*Y��W_�a��&�c�N?����Q�n���E�r�����S�^"�ڛ���6k��¡���œ�^��2�a���^�n�27��m��O|�D�����٭�Y��t�d���`T��aj
�B���Q�K7��G�GZwC�]�uX�G�֣��$��zit]�э1H��q�#�d���
R�y��cj�yb�)W��%�[ݷ7����ބ�R�vQ����U�ڴCZǧ�P��-a��6q�!~�ئ�6�/:�>~������;��1�;BIn��c�Ti��B�_��+����l�*��0��j�EJ�280aU_S
�{4��Ɔ���m,���)���M� �R!}b�����<a�}.���'�(��<ۿ&����+�*�h��P���1a�#m�Ŵ_]�^���"6���9�!n�Ȑ0��>)����P�N��i2���T�Q%t��5gh2�F%'��2$�zlm�Req\&S�3�Y{�Z��ƥ^��/-��Q�� �D��R�_H���P��8���P�~59�H���#��&^,r��M�r���n0�	�cm�6(@j�	�ڛͫ���=j�V��X��,<so����|����0��9ɬ��Cf�HJ���侠�2�R�V�U:�~��_Z�sHn�p$��t-��x8�F�/����Zu\|T���nT}�V�t���
ާ����*,Ү6�}��C-J[*�
��X�(��)C�C��T����2�-6m�F�^����5���B�kE+�q[����JXr�`�9�˞D�9rC3�0A~f&��I~����#OWeq�T{Ljd�Q��f�[@`�
v���vNX�1��6�l=�I��ja M�1O&،+5"���${�	n�
O[���W���D����E��ۨ��lX�����1h��/�FD�+n�XD�K"ER>����fdӜ��ͪ����=�8��k֠�n[x(W��R�`z�0�Ƣ���)0�e��0��G�2��hD�&$���v3Q��0�#�B� y��_h�L���k�
O�
RC@a&m$M���/]i��o�^6Xe�f���ȉ݀�t��nJ�Y��+
a�L:��J_=�!����L/�عsC��*-э&M�8�D�&`9�y�I�t�
�N�

�P!�FI_�67�Q��V�~2���������y�ր��Z�K+��z)ĚN�s8ͺYW�c*��B����~l���_�1�
�`�
�0,�U-멊<�������%"�q��n�����h ��6�1��M�=�BW�&eq��R�B@|�o��Ys6Ɗ�{[��t���ȗT�du}؁oqF����r;����D�[�U�+�{YK �J1GP�����?/�.��d��R(���
���lmo�i��������?9�5�F���G/�n�}���Z�d��zc�&M����r��CQ����ZH)�y{Y�evln�;=N/75	i����j�+�n;%C@0c�i�M�}�1<w��:�zz-�E���>��|&ӂ�3'+yL�s�eca&o�mجa�E�姸U�1��x���D�g���
�gw'���{w���Z����	�@S�>�$�W�c&�E	���/���in8�"�\�f��J�E��P
^e�y��e�'ŝ����Yt�p�aA�\<�ĀE'���S"��?$P����bK6�W�ʕY�皿��E�n&�9ma�9@��44po���%0�ܑ(y�&�1e��
�B�o�r7�+��sv�F�[	R�dg?�fo�")lt�k��34�}X'�Ŭ&!
=KӝK�_baeR��݅S�ACg5���9B]�>�ņ�l�C+M����2�6(���<S.�����{�e"����?��+B,��-�{ʽ!�À�@�(Z��sd�ʊ�uo �� G���r�Y�Ԟ.�Z�qS8�����/�З�.�n���3��֖�{����hS3�8��v�ueJ~��թ�`Ů�km��=W�S�U0��k�����8����\Xk�
�ZX�$�:�.%[:N�h�='��9�-������]B��0�Wj�o]5Jf(e�����y]�1�1Rr1^VB��l�x)�&w]���Ϯ���P�*�y!�m]��[E��>�R�H��FC�_O��#.uQ�~��[0˝SvR02?G���1[�0
{�W��#-�<�=�6�3��8ލxEF,~#k��@x����c�q�q����ȼ}֨?�Y%���{?����ݺ��x-�C�iH6b��=��|��Ԁҁ��_��V. })K�w�1��`LS�5�y���Ֆ����#-hA����,ٽ���	:����Hxt�hbğ�4[��<�h$���Z}��Cr�uar���	�T�H�<Vg'�D��H2E�d���h���qD$v�5K��0�	�֋.���s�31�s�##'Z1��L�3��IDDWo�IZktk&
+I�ȣ�S�Q�� h��`}͏�O�<Z�w���vڂ}�3�	��Ǚ�'��������Q&hU��?f�=��1{�����Z.2�����w��s�V��M��������:,��'���؋v��`�Q�p����?��o���_<����_�m@%X��]��N+�`��õ5mD��IO�hE��zW1-�K����6��hu�Q�KG����X
��]b؂�Ȱ��~��Y��F��$r�e�qm=��?�G҆�
�h�o
��6�AWS�F=�M��>��er��|[Xü~�'���o��w0"g���!��Yk�L/�D@����B~�#т�~(F�X��h�y��ҟ����x<�i �ޘ�}�R�	���{���o�}w�ւBZ��s�q̅'k\��dN�NR��سi�S��]4��hX����t��aRf�,����NVO2����T���`���������¾��7X�P��n�<ڿ����lX@�V���D����Zk1w�i�\�1��Gp��Ov�s7r,�-�İ'�T��R�,U㴬�AQ�j�™��ͣ�C�P��ۛx��id�{�e�����.Vl	�YM��ۻ����������,�)?��hΐ�$��.H,�{4�G,�G�K�aF=���@���p��i̬n�T����bM��-���ĬQG e����$�Sw���/A��>m�7I�S��7�Iċ2#�XzC��?P�|�;A13��c�gV:��]%�=B;d6A�&<.��*��BUH;�]D��V���LsWm(#�v�4-��<���h�LNy(O�:�]��	 &#�VY��sU%��)灅�fʎ��d�*��.��QrI�r�bsu�5�8�FI9֩��@���#�8`�e�)����t�������D�pǕ�y��0��4�ס��bM���<��y�qln&�bl���(����RA�`ȹ��s�1
��2J����u�Q|a�2u���bL)��dĖ�>�P��iV��D��X�O�b�S�|���(Y��K�r���o��{-�Ē4.���y<1kУ�ЖuC[r��L�����%�p���X�|BFM`���8�Q��)�]���)清��Ԫ���t�<!�dz!�af&��!<`��V�1	�lN��s���h�b\���8"�	��;��!�)�M[��V=�>�}&�>J��t����y�Ic��F.�;�����C���
��E��	���J��[!~�����XByO��[lZ
��]:�J4`p�"��i�hm"�Kn�A�
��:M��!lo&G�?��ט�K�F���R��/^<~����g��n�����oٮ�{`�������7T&��
�+�9�Oo�0<}��R< �P��€rH
p�2HoE)����9���Z��BAJ[?�~����׃�?<y��g�2��-�$��|I	��ߐ��|[c�@�̝Xc9��3#a�V��r�Wi]�5h�k���a���M�Pt�
��Kv�T�T�i�#�J�j^���[�]�v���*xV��F*��30~�>#F�P��F�&��Tr@`;�xh,�7��Q8��X��x��%�Ԉ��c����1��r����d� ��T��+����S���RduJ
Ce���ZD���O��:T�wL�AU'�
K��8���$J�j3h�����Y�G��,÷�4���6vseŃtVMzDs�v��*Myn�Yt�y�?�
�6M���P%�!=�+�Bc	�/�"t�n���v+�Ц6�vP�T��fʬ�؞��q��V'l�V�!���P��j$ֺ��7ˋRL�%G�r������X&KN��A4¦8���9��K';
䕧���rZ"R�n�����`�5�&k2����NX�;zϔ��-��m� E�,?�/5��	c����Z����F��h��6�{^%�a�Y���mE�r
x�>.�=Bz�m?�)�c+���d��g��=mz8�-
gd���9Rs̃=
�|�?6��E�DI@H�(;R�
�tAƙ���7����}l1�!�:[�3/�KoP�*2l"�G}�3�I��M�R(��E�l�elɼ��_J}:�!�돚�V?��b��Lе�ލ�!��=����ͣ��Q���5X$��<)�,�B��{��8-���+5 �*����M�b�m���
2�;�0�n���,��B��]��7���f�ڜ�����hah"��jX��Rӊ�bf�X@2v]�M�� mC�3����(�=�.W�ըOub�?>Wm�D�u��~{`?��J�V�t�:o'�B��o�~���ڒ��7�v��N�����lZ���v�@=0���c���w��q~�&�3)��d���-$g��)d��4��h���Kv���
X���z��5��N�e���H��+�j{UEt�����帳
R�n.�NF���?��<�|}�و���\��:��[���;[ۻ�n�?��ߢ�QȪ�����T���\��&ș���58hj#Wք���"�:n��I�~�W�z�(æPu+�x�X��*���>�"?<$t�׷y�!Ri3�G��j���ßN��X�i��^��yUn��k���Ǫ��'	�6M����)��K"��l��kg;��{�ލ��<��h���Ou��'
�!�BEUGK����k�;��"��JK�9��bLS�G .r��3�@Rk�R4���ј�(�!I=�ҕ]�>j��p��
I��_Ԛ�҃�g���ث# ����<�cI�|�#iv�����#EŽ��RtW^hS�csAv�-�$��@d!�"䳅p
�B#��B�Bٝxx��($��*|U�IB�I;rgK{�P$�ãF���!���Z�hd��bʍ��H?yB�VgO�>S�ѝ<���$:��j�gy��e��l��aW�jm7�+��h�y>���������s?�}���Zc��jv�8�os�/�)u���0Q�j����/�m�T���Q갳�'�l�� ��Fb��O�s�v�$�W>}�Wą�B���#���@�l_v��Z�}����O�7�Ο�t��m�;[�wn�?]�c�?�Y��^��7;0��;!�I��-�,m�>�Mi@HO�ȠI��c��0
�<�E�)�h���Φi`��W�ؐ
m�ң�l�Q�{ I��Iӂh�tAˊ��K�?|-��b������V�>XdD���e�����=�`
�Nj�~Hȴ�%V9
\J�[�Z~�ڰ!��j�6В��4��I�۪��0�`V���4}��	a�Tc�ңI�9)8Jt�#���L�Kk�j����,�d��G���~ݡ��Q�z�vzlX���hK8�dBڼ�z�ƌ|��R�D��4R��Z.�k^6$�#c�@�d�$GlŠlv��]S�j�G�Zg]�nS�I6&�ĤDX�,:�)�9��ةOz����/y��db�t��M0K.=��3�l�wb,\��t��Ђ��kq��]�+`�
m��"�J��p���w�f�V\P%j������EY9sG�����`��+H)��+[d;Vv�Sd����_���ϝ���U�߭f���7���YN���h�w�|8�F
%�꽩�t���#��~�v7��$4~����*%#�d���&��i`������5�bo��HV>r�7:��x'�V;��ņsVqK!mz��}���U�� ��ޝ���N�+fĄ{5Eq��&'�li� {�Z�P���#��$���]2���$��m�
���p���N��ǃ��ow79�=#K�~�ML+����	ݰ��	���ö�U�ֻw˗�>P>�&� �����w[J���Sҹx�oZ���~�v��cW�>��J^�w
�w��B3���L��0�f�i|������xV@���w�����*�?�x��o�ie���{�g���Z� Ыq�ա�,�pLW�q��w���iy�0�nc���ݰ�H?�5���"Bz���{课�`D��6�G���玃��$~��l��t���4#�ea�:�VC�
f���3�@��H�
������e�-Z=
ޓ2�!�Z�'��j(�K����(����o�F�����7�V��;
��΍��Z��դ�lm������?�n���s��<7������X�*metadata.gz0000644000000000000000000000130700000000000013402 0ustar00wheelwheel00000000000000�sy�R�Uێ�0}�W��'���	 Q	�H 9�$1�K�������I��n�w�*��9��Ǟ�$I���������,������)�LAF�"w`��3sn�J暌�^ᰵ`As��jڻh$t9<��:>��y��L��t�^�V2_�0�KX�c�*	��z
t�үPwB�g+x�$��Z��X��	2(�.��(�	�sd
��!%�HY-�/��2Y]��"����Ђ.Asnd��V�>湻�ҿt��э���K�e��`���~�e�O	(&d�}�����:�Sn�
;x��g��'t(�Ѷ,���y%�q�+~�ѧ�ebZT�|�+��n��v3@;va�(�x�-�����3)���9����+Qw6޵i����?�]�iTbU�Q�px��8��zc���B
�O�-k[���'����>��gR�x��e^v�ق�)�px}���8�I�a3B���e�I]�e�uҟ���g�:�k	�k��<�.B��QJ��1
Z�nj6޷�<^ka�D
�]4���7���}�8g��W&���Y���:�1��[�A�����Q+P����b�Z���2��7�g8�E�A�ףu���
�qt�p���&��?�ȍ��q��Q�9Y�Q�|w��*]]'j�W0��i����]�a7�~����N<��c�����[�fsrc/rvm/gem-cache/gem-empty-1.1.2.gem000066400000020000147511530530013001 0ustar00metadata.gz0000444000000000000000000000124712517674506013457 0ustar00wheelwheel00000000000000�Fy?U�U�o�0~�_a���4+CB�@L[H�&�B��\3��v�E���s���Z
�{!�R��g��wn�$�k�na�oP��T�_[(�Z�<���
rZ�J@�Б
8�����OC�P:����tI��am��i�Cx�|Nz)ʆK��[��<�UG_K
.Œ��pX)����)��\`8Q`�/_I�"���$;I��i��7Ͷ�L*��+Х�>�~��[D�[��
�1��@�C�څ<�c��I�s���QoD�!��g��(��Bg����
Hc�Tց	�chͥ��lVģ��+�E��EW�K'l�2
\��U��h��Q��z�7�'�B�^H��Lp@ǵ'�q�*S���b����"�Zc�F���NI���k��NU�&�"��ѻ�g���+]�N�/WC�
mLwM�#����(��u+���{!��:�ۅ"�1�����z�OȢ� `��E�V���k@Zp����(�&���m�"��m�.��ăx?��l�.ӌ(/@��?�5���>p)��I|��p�����D"�ΊEF���\��<S��<S�P����#_8��jd̙~	J�K\�'�S�!���
t��c��ߢ�B�:���Pf06��kg0�:��Ћ�%{�{��:���_�O�K�1data.tar.gz0000444000000000000000000000771612517674506013404 0ustar00wheelwheel00000000000000�Fy?U�\�s�6�g��ܩ$�D=l�=�9�㺍��c��t\��HHB���]���v�)��i�\s�I$�b�v�=c�͢��G��������������Σ�pg�;���鏀~kk8|D���J�t9�r=�4�����"�4����A�]Z^|E�;�=kӞ��z����˖ܽb�^��g��[������Z��7����DŽ���ů±EH��o�]���0���~
��7��[�`+�9u}u��jT=����X�)�\��H`7�{�E�7w��B�!}��)�4�}j�|��u%�44tY��9�X�h$K���M��v�T��� ��)ܧƊ�ͨ����Xo�
�LY��|L$O��;P�����������
����؀=�;�w%�!LDw0����
5	(l�������q��I��k���۵�?
w��!.�ܣ�1�2�^
6@�&�����yB=���4!c�^��HB0��n���LH�	���>����P �U�|���H�$|�30*�>t@����*2NWNc�{O�8���/2R��$���M�]� ��� 3Ki��\�l� D�
SI�:!�B���sQ#,�T�ъn9��ϪI_�<=������pk������d��l.I�kk���Fȏ�-��h$�O�7��S���|����r�^m�4LQ��k�$t<�


0A���֣�$,"�ӓ��h�k&�ӄm�b�'�Z������+-��Q��*����]�%*�^��D�,��u�YP!�;e�y�dA����	�ks��񉌑�k�$���T^��Z>h<�&��ʸ���	@DnD����A���v���^?u����r�����)yuB^����ѫ�p�=�������:��x��6��;0�z�Q߶N)�t�Fݣ�Fߋd���B�` $�<d'Ok���I�-�^�/�:9���:��[��%�7�Y�� 4L�²���Q��N\F�i�6�{|���Uu�$��5a
<"�(��A�Sr��ˢu�z�!kz3Po�ǯ•�ܷ��QG��)h�T�[0xP��&���6c�n�N8��^�
Iy��&��k���g)�%>t���1%��1��-�To���%���R�@�����mb��Rw{)�e,�U0�A����Ao�r��Ǟ�N��./(�Y4�k˥7�nHE۲pAB�!X&4��� vbG�
 ��P�r�Nț��篎ߨXƙ����7o�L\1G��,tx�6cF����S���u���Z�?�e�/8��z_������ş�i �Ê��%��_��k��#z
�?y/���6��I�sO���Q�&�NR1o5|ؾ�
7T ��JW�j���z����m:����g����P�&����pg����G�u��a���^*xo¢��tp�t7��C�8&��v��g�������8�`����m<�2�]i���C����
�x|j�Q�r"P�;ӏ� o�����8����O�'�� �r7��(?o���o�#A�(�(o\(r�CT�t!Vp���.=���qHD�{E�T��e���)���
�dX�֭���bB/C����~��$]u��I�d��k���Q�:+iI�K�aq5@gJ0r*>�6�[q}�)~�w4[ʆ܃,d�
���"�vA8@�6���Y�6a�>����F5���;Z��5�E ʺ����f��g�āP�|I����*/�J%D\7��$Hg,B]�x˕���DY��P�I�i1��ZXr�SC��8QM�c#'�ǯ~�����:9E3�BǪ��w>A��*H
�;ё�!�1/=����<����XU

�y�5���O�	�F��?T�i�7���g�M<�4�\>S��}:�b�i�����ooJM��Eכ�x��x>���C����#$��\"�GT�<���f�n��/}K�T�L8�w�V1v[RE�l��R��jA<1�	-jXL���Cq�p�y��V�1)?�@�rI8�r%�)�}R�*>1a�)�5���p	�~'1,�I@U���P=�[�(n}�	ה�3n�.h0���l�#���Ѩ�ٕ�!�Ꝭxc2X_P�\^��iQ-�P��*A�afDq��V���g�T˴���h�`�F>�K�|���%ͤ��x|V<B(ڊX�!��v��mZ��4��tPc*�ej���P��<t������1�Z�̝�uH�TovP?�&i�Z7��+���{��1��������E&�zR�q�{of��}&�xzˊю�8��+8�׬/
�Ԁ>��e^^�Y�5�t��b�?
�3�߯����=��~�\;(c��%]��y�*kC!2W�`A����
��&L�E�6vn��Z�(6�2���q�����4M��ӨJWUh2v\SNAˤ�>��Ƨo��M޽G夼�j���JM�9�8Z�Yi��ng�W)�{_�l�{D�Սc�Ax����d2����j�̄"��k�c��치��^�ӵ�_��=d��ʾ��G�����Ϥ�3��G{`�9�/}��N���|����Ϩ����h{����!�,LU���N�]Q��щ�l�+�I@��܈L(|!��#�h��<��6ƃ�oN5m��YI��T����)�B!@;����o-{�ע�n�_{k�������U�}>�����8�,J�>�ΦD#1<�
��$TLJ�T 
)�d���(&��}&0T�cD`)|�"_��zA�ӧ��x���襗�a)/V�x�D�>[�1�Ja�g��A�,?�h~C�j�i�@���	`<E�dž�T�Xp��0=t�|/��7 }Et��͗õ�:���ȣ6�3�g��,_6�gw���^�����d�/D��l
��?w��8����s��Ki��v9�sk�'��Y;�nJ(��w��ٔ5-��Y���An]U�z'IEx����{��s���v�%��҉0`��z��h�,�B�g0��b���w+U���0r�d�4�`<E�ɐUg#�fZ���	���0���NU�v�\ee�GZ��ܷF���_�r2�y��Ⱦd�2yL�4��a�~Kd��*�G�o�Ũ�6��Ƿj
�-U1 �ߥv��8��i��2���,%p+~�13��x���4�2Ҫ�V���BI���h�� Q�{8�dj]��Pg6:d��'uV�HOg)�S�$� OH0�hЯ�U��:�z��]J�$Fx�������|b�S�Lf���j�D`�[\ѣ�S�v�&3"�5�B�<��$�,�X���8Ε˙�5T��ՌJ��-Ⓥ"��3�SP��O}J�z�&�^
C6�m�����ʉR;	O:�WF��i��[U��R�d��S�^Y�<?:�S79����2I�&�`?g�w�z�Z�2w>�z�q�E��-��h�6?p�p~�s��u��U��癎�yX��$����z�z�0�[��~��R���_h�g�<�ݝ��FW_�Ua.ɺ��Ձ����G�_��YI2w�m�i孾�-@{�R2����̔�25����_B-B���lM�����PLl^:k��)t���%M>h�T�dTK�o�g��J��AO�@�?�����V�n������N.%��%��p*��o=�r(S+��!ګTX���]�US�%���tQE��
��1@���8���x�Jޓ���>]f`y�^M_J֛������K��|d/����b��ǿ$q\��*6֖�����ɟ{�G���?;����R9���g�8y�w�4��4���Ի$�O��Q�ҟꔟ�ʃ��T��W6
:�����
@����8
$���
v\M����6;�z��:eE-Mv��}���	���K�o7�Q�;��,!�
�Sz+��{���A�w;��X��!�U�6r����QS��OaK3d�sS��i���E����Z���������_��<b;\checksums.yaml.gz0000444000000000000000000000041512517674506014621 0ustar00wheelwheel00000000000000�Fy?Ue�;V@E��"�g~C:;{WX�xR�z'��r��w��n���W�_���zx��_>��Wm�
��KpQ�5Yi�hYsg:���y��/����#%��ݪV)�$Y�t�~�2��1rO��ce�� �AT�iL��`ޡy����q 	&�{���6HG不x���(
�=w��p�iͿ>��i8o.+�&��N�d�a�:��9��"�f-铷�Y���#�c�d�t���ji���
��s��i�{��s��T�src/rvm/gem-cache/gem-wrappers-1.4.0.gem000066400000032000147511530530013512 0ustar00metadata.gz0000444000000000000000000000136013161171527013442 0ustar00wheelwheel00000000000000�W��Y�V�o�0�_a����V� ��BH�!�B��\3a;e�眤�eo"�R����w�s�$��\��2��e(ނ*�OJ�%�h����֠���[Γ
�PT<��yJw�yz���J�Ʃ�F������KQ6\ҏ�
���V8ܔ����+(��\`�h��7R�E>��/�ł�y��|��/��]
����ѡ�C��_�
tx(ҫ��8n9	~^���>����el6�ϐ:��l@;nd8��=��\zا�M\x��_%������K1z\�/���gP\�X����ySG:-�"pe�Jb��n��:���llfV�DZ�2�F�S��pǙ�L��bkcX�zZ� j�}	Dn�O;%�:o��1�u�*$1������Η>-qu�<��\�+��W���J��8��-�*��z�]n�iQ\WǥY����F8��@�����=^`�C�Kc�Đ��m-FAl��`Qrs+���5�?$�y��$T������b
H;d�1
,��7��/�˱iW��3�Q[D���3���o#��
���7�7b
�ﭓ��M�kC���,MofˬX<!v�f�N��s!N���W3򸱰
�l�B_$O��8c�P��3�Lo���..��t� '��5��a���aO�o��B��?�8�)nFqlw��@�:
=��X����Ѐ���դ���%��o�e[�(xF?
data.tar.gz0000444000000000000000000002131313161171527013360 0ustar00wheelwheel00000000000000�W��Y�=kw7���_���JJ��ïV7�m}n�8���=�WI�5�hF;;���_$g8/Iv��J���fHA�<�C��|��g��;����wm���nol�Y�lu:۝��6�_�o߱�ww�����	�Μv��g'��|~�ӱ�p��*C��)oU��|Zi���9������o�فy1u>��(�ۛ�������w�q,�4�-�c~4�������U�Wa��{̎��Ãg����{���{o�_�b;;�c�`n��c�N���)�0�
y6�f^�mc9�?��@Ģ� 1!�|	F�I��_�Gs­}#��_���m�-�����_�bC��+��c{h���8���Ɔ�u��obb�����ވ���(6�8q>�lG4��О��
��ә5������zSz�1|�|X �W�V�����w��KHM��0gllal�v0�Џx^��P�;5��/����������w�Yc1T*kk�Q6`{�f�n���l���v+�&�F#��p��c��;g��q��
'��vO�P��֎����刿�1ldԋ��عo�f���$9�:���Н6��̳G̅}}����s�wa���u:q�N������C
���(�DZ�5B�"D�M,4��;"�c�ir `E��?0�f�B�<��r�FDpG��6t~dk?�z�C��3+�%�(<X١�-��d���BIZ�әj �M�86,���q�-�NE=�(�E�bH�H#[��Zp��|e�c���X?������޼������/'�X��x�M}��f��M�G���	�C�"r�v-�"f0I���F
`��^G�>�wd��y��v��.��
��3�3��֦��Zov����"W��-"��.f��2;�b�P��'��#��M�5��i��Q�dC��[Nd=��^l�g��o�4�#oxBÜ .��GG�j�G|lEN~��c�K�����C�V[�`��3��ZFh���O
��'�4�u��h����;��Y�K�H�s�r'Ư�HBo�w~D�o�|
P@���V���ﳎ���jod��V��:���x��1	�Y�k���ګL��w�]��3>�?|/��ވ���0���F�k��1@p�{��>*� Q-:�a�V�9��h�>
-�C��z30 P�l�'vԛ�v��>VM�zg��
׆�s��׎%�b���ӜF!�؟��J�q��P�B�-��s��
��w�^��������������N>���·O'!�
��PCը��.{i���7h�V*��C�¡�"�Z���,Ё�|�`����{
�Q�G�‹�Ժ``Q��
:��X<|@g�Y�z/(�3ǶP%>�ѮH���J� ����g��h��V�F���ܴK�h-G�
Z��T޹��J%�6m�Pw�s�u
����ܷQQi�������Ğo�0E ��To$�\f<{�����o�?�}������٫�����}�����W��g���?��z�`���3qG�I�Gf�-��*��}L9}�)JE�9@���.��Ǟڡpz�c������`�ً�{������g���{G��;�rt�HA~\Sz��rs���A����f��Ӻh�Q!�Y�j[�!vц��T2Z�C���SqѠ�M�F�F/9���B{-��Tiv|�9�0���'�dgj!��ePr2����r؈;���&Ϳ��]i�|Z'w�����kv4%J. ���b(o�y@I� (�C�u�i]X��9�As�D<�I��D�Q��Zcߚr��K>R�c;=��/H� ��܍C�_8��.��S�x��o���/�~zT��������r
@�8�l��y�Kv�1���NB?>���#�W�����`R!ǂ|���Ȼ�;�O#��f-�B�V`g���Zx/�O*SC�!��P��t�bH�QC��Q�c�t���˽V<t܀�g6P��z��X{���а#&����
��FMСxf��r�
ߔ>�F�,F�#��8�Q�`@D/��h0��?�2?�(�����d���$�D�=��V1��6v����@��F��s?ȃ;D�M.'M�D�Y/���>W�pA����p�Yn+_ij�Z'4�5���B+D��̛E�������ȵ���,��`[AM�
D�Ċ&��o��	_L����挴�mV:��2b��85�'�V��7�-qs�2�
Hn��n�v|f��nB���p&o����L����8go���|�r7�@-jZL
A�
@Z�Z����VL�"-O�<%�dĖ����R�h��p��‰�6�a !n�J���ٞF>����$х�\�\�8B#�	5nTP`[h?ł%������&'��sV�oq�CB>�b���Vz��<;�u�x�`�&m���n��u���}|i��H�5̼��j�뒴E���n��'�;g/��r���E�rN=����&�^�~TEt��fF`H8�(�k�͙�[`���G,�u�����E���F����]�w�Q7_���‹��
>�
��.^qR���W�ez�C�rmL�����.��
c�	����#�c@w��I��g4�A1uz;Ë;߅��a�a�2��������yї���[�X���v7�3�{kc�#��g�xh������h�W~ưPT�k՗�6X��Zg����M2<jF��w߫�R���+�U�;J�1J��v�5��V0����p2�F����I������t�$4�9�5/��j~ˑ�7uYs`��^�B#��'��������=��1#(p��BA�0͖�?HA�|�����uF��!D�%��ʇRM�L_١�P��#�.������a���	�j���<�Q��O�ch|TM���q�N\�s)rc�qr
��,a ĮsX�����	,bK��ߤ>N�ᄝsR�FP�S�	��)U�I�z|T)�Y[}n����޻��[��f��z{���>I_0�D�k>l��;��H�(7�g�X�9�pi��AE.%��&����(�6c-2�s!0]k�*���3�
��Aǵ�o����&VN<�A���qL�)�^fCne4�f�%�I�"�W���)�
"����Mw�.�-��r�m�*>�����"��թ�V�a'05�M�~��G<��j�¶��d��u�Fc��8���<86�Z���|�5�<�&x��,�zj�6Y�c�:�-�L�M��Q_Y�Ov�ޒ������\��f{����wi�W��p��i��s���������9\�ѰQ��l��=P�?ft$��p����<�f�@���;cS���Џ����2sRhI҇Y^<-�����^!�Z���^�����i�3L=��8\=��kt�衶"�nr8%�@M^�T�d��H���@�V��)��irK�,aF���*dߕ�J'ơ(��5��8��↶4����H�H;��|�x�%�M��+O) =��	\s����ϓ=��w�v�#�C�(.ғ����H��Fu��]�5\9
6�f��{`8�Dm���1�t���@��-���ȑۖi�2�E%�@�.�Kd.S�sM���}�e���K��G̅78/��.��s�Q�-��c�i~07Ľ���W?�rd����c�@��֣��i5X�ZW⇱�o��F�'�ڟrP�G��85�2�/��/l�I�o���Ȼc'�P��d@��t=���-è�'5�J~�ƍ{�W����&O�z�2g�)��-ꁋ�NF����+��n�?�qTЇ��
�W�NI]�˿�z��X�;���Qh���R�W��� �-����A������h�;���u|i�9���b���ږ�K�5�s��'Ӂ�dD&?ړ�!��;�Ӣ�H��Ȍ��i�{��5�3�%g����~�Y0��"^��n��q����
����Xǐ��L���f���VNf
�Ѡ,e�����$n|i{��>�z"3��I3zFA=Ud�&��É���,�xž(,�o�K}
5�~�5���<u��~�j�������G9'[2��q=�*����p��s*_~v�z?G^��(���X,ToK`$J�I�(Q3S�j��i�%��j[�T���L�Λ��KɁ��t�P��{�b�Pp�2T�QL"�L���pߗ�����|��8T��,
ǖ`�d4��+v$�h��<Z-4k��*:7"'�:��@�|�oUl�".}�RS���Y�?���{��"u����ߺ��L��h�U�E�?�͌��mon��;��Y�.}J�V���N�5!*h��,�g�v�z��%p���o��6�+�����h�Y\c�+_�E����U����L��&��W��p���c������aԤ�L|N8����e�b\*ʢc������i��
�5Q%3��8�V9py�.{?ljAC��'�c5f����;�5���|��2ʞN��L�����f���� VS�8l���c��ǎW�V�����ﰽ��t�����0Tk� uOS�z���4�s)|�2FM���'����`�觐S�W߉���>�{��g�{_,"=F ���PWߕ�mo]�F��n����6�(�A�n��<K�M.�]�q� �4�e����<��M�d��ƪ��Wp��nʭ0��}��݉�{;���n�a�Á������<��M,
`�˥.�gy�Tr9�nv�!�!%v��"E8<M=̪$���z��N_����К,�A9Mu/ȁ��M�Nz�M�g���+A��Û��Ş�{",��gr~�ព0��x�p1B>�9��b��gdFH�<�%zÂH�L7� q���~�@+K!U���kؗ�4h�#��;�3�$A��1)��!3�z�k���dSIc�M�_%z�P;��1w���Q_�C�����`-FH3)�rc�U�qgM/'��MU���Dž��g����Xj��3���Q��>��{�����냺���.A�hzx���s$(�#��%���A�P]��p��n�%�ɒb���:�\a��I��W�IX%9�b�"9|ղ���Тx������J�Cm�s%��4⾍�?�䜐��V�N��RL�AT~Q�@v�m���`iK1�O��b��#��x9�l=v|\�����5��F��&̸��Ky�4�x��;8x}�c���*<w�V-�j����Ҹv�:��]h�����f��3*R���.vYH�>NA��4ݺW'N��{l�L��~%�g�Kb܎
����F;������ɧи�Sa�i+(S��JR�U-��X�c�PM�O�?p�Z��ԛ�B2�A-�E�&ȥ�T��j���hwT+L(��N���B�$e3����e2�LR���*]�C��;bO����^J��;�1'g������l�U��/����`����7�U�������-������Z_�;���������~\�
3�Zn������P�"GT�:�4.��l�{S��=fy�p�4章�T�PZ��K����'�ֿj��)���ѿ޷���c�r�|x�U?�f���)�Ii���1�ͳ��hS9U9X�T݅��Ul�n�`b��g
Fv�&�GB�f5v�J�ЉF�IM�R�f�$��3��ν�D�N��Sȵ�bLZc������0�+wd�]_ �ݓ�L0���VpԓS�钆t\gu�~J�K^h�,��7�P���phԉ��[+��2�dR+��'?��|�]v�88����Cn����b�}�_|�ӕJ.-�*����n�o�������'���{@Ih�h��Eŀ��)~=�>p�U��p�ds<�$�h�H&�=YT�&�uk=�?X�����c,�Ø�M;�)"��g2���	�J7@T��WEF��T�l�F|*��zb���rq�w����5��P���x��0����A���1�3;�h������fg�ȋ�)�>,���Fi"P:�rM�̓e{���uг`�����C>��H�+!y6G��I��T�S����/��37����rIH�23y\TL]b6D�x2�f3U�{=�?���}:ৠ홀�5�E�S�Y�(�����i|T��6�6�2���

Q�檌b�hi�5D���'�l��|��<���$o$�gO�'-{!_��tZ��ʏ�0BD0�� )�
Uc7�_Z8˨J@�P�2$��r�4˂"RbR���`MP����L�F3�?m$���BB���:1�%��~
����������h�d�z=i<o��<��q�sz�KO��T8hݵ@}��hDw�q���*��V��2�vl�E��v7�����J���"e?U(���
�)��
���X`�x����8�V��)Lz�ouuaT�gh�8|a^}�bЋ�s��9o���H;�U�E��q#J��9y»���L�W��}l������p@�.{g��)����~S�dr���WuVYM�p^�.M%��q�œ2��2\�LƐ�e�X���,��mqI����!�h�eކ��
�1�9L�8[��1��
�=������؋(VȨ�Ԯ��Q�kb�~3��?� �UG��[82��W��zE���k�L�W�,~>�M���Ƃ7�7!�Ա��s���l�v��~��(oRR�|�4{P�� �uMi��=�/	E�$)H
� `vvD�[c�e�ȝ����ͽ�}��{����N5��ò43lI�
�ʈv5D1﬌����G�[�Xp����f�n�����/�#�?#��
�meJ1�"Mj���/I�}�8ڮ��9��Q�0ť>���AY�2�G�Oŷ�Gn��>I7ε*���;}�\y�du�2�σg6�}��X�fQ�_r�&�/Qd(�Lrգ�|�lU�9�|�* }a��B�ޔuR�2微Q���|i����V�6�{�J�Yoj�%�$+�V��7�o�H���rk ����V���^������K��YA	g}��UWSq��fv,N[*��9Ke���>i(\�8I�h���xrd�{�c����E�y��r�������^��m0t��2�ܮ\��찼>�
 �e�̇��zߎ�5�x�V��w��a3w����>T���'���mR����q-��1H~����G��7���e�k����d5�@
&9�RAJe1;��P�F�)(�TG��.����N%P�^Y�K���_�Қ]�t�B,�#�T/����4<4����S��6�[�6_��
f*,���_�<)��V0��V�����U��Js=բ+���}��%�����D^o��/X���&�U���B��uLǥV���3��_76?h��zk��~�:���/X쀾��ν�Kx_���a��=L4i��LG�(ޢk�F6"��zX����Y��81cM���t�ϸo�/nB����T�t���g���W^tQ��ǵ��!3�XP�q9�E,��%�-��L��ﴯn��'���f��;N&�u����K+�����`���\|�J�>�R�'�D�U��e�i-�M�Y��͙�sF
[�Y�@^U'c�R��9�g��*s�:t�%���I��9&�qz!v�5�o&�O����� pG��a,~��~O�(�������s,�k�׫؝o��/U}��������t�[����fgU���p�7�7���?�Wr��*g�";����\�`S�.��2y�Xt+`�IK�I��r	
�:b�@�<̌�j�,3�*�UvO&�3尢aH��uj��A��βf���O[x_�(�p+��m�[�����߆���?۫�ϯ �c�"��),��ԕ�XO|ʧ�cfq���
�z���S=�{�|�,�;Zlc�4�(.}U���(@�^d͏�H��t���w7�q���zl�Y`�9qUri]�K^�kOʬ��
^��^x~(��ʌAvݾ`�ߴ��Jɓ\��˓�j$��;o�^��.���z�"�.VDY򯥂Rn"_��{m�B��@��h�H0D�E���.Or~�Tߢ�ާ�V��.���_�^쒿�dX��ZX�Ի/� �Fj]Ia��/i<�*�9��8K����u�`�W�Z����>�Yq��q}~zk�|�X�[��!X�����
	za�)ɔd�]X)^Z�G-5� �21=�d���YMP��M��)�˸�)�AT2�4��\&_>)J�u�ͩ'P�5�U��@�z�y�ET�"=�vKF�kD�4�dcuSO�
~�.&�Z̏ZfC:�YT�*%$M1�;�K��ȅҧV�9���U�߈����77J�0>��g�7d�r�9v��JL��`j�y0לu>��s��r}��������-�[��ߝ����N>�qs��?�q�ftͶ�6�N���w��'3o���b�8�(y"~�K��co�ۮw�?�����T~Ҡ�Y=�^FNh�ߏ��*n������
�tW������ݿ�xL��a�sA�bȖL	�F#��U�vJ��>z.�w<��zvp!p�/�ν�_=�B�m�	�8����w,�+����J��>�����?����=��checksums.yaml.gz0000444000000000000000000000041713161171527014612 0ustar00wheelwheel00000000000000�W��YeP;�@�{����0�����F&�F�^|�VAw�ݯ����W�x<�?���o�����l�k_s�(��$��<�1�����>9o����ٰ�FGm�:(��@g�Q{������V߳��q,�8k��+�3B���.�&�6F�Q,��fG�cp�����&z��m���~�6�ݕ�HT�o��
�5�C�W��Z��6v��B�=)�!���/�TlBW�P��a9�u�<E ǝE�`$�rs�o=��}��G}�src/rvm/CHANGELOG.md000066400000132231147511530530007760 0ustar00# Change Log

## [1.29.12](https://github.com/rvm/rvm/releases/tag/1.29.12)
15 January 2021 - [Full Changelog](https://github.com/rvm/rvm/compare/1.29.11...1.29.12)

#### New features

* Added railsexpress patches for Ruby 3.0.0 [\#5026](https://github.com/rvm/rvm/pull/5026)

#### Bug fixes

* Requirement `glibc-headers` obsolete on Fedora 33 [\#5023](https://github.com/rvm/rvm/pull/5023)
* Fix unknown command wrappers with Rubygems >= 3.2 [\#5027](https://github.com/rvm/rvm/pull/5027)
* Fix errors in compilation+installation of Ruby 3 with Rubygems >= 3.2 [\#5030](https://github.com/rvm/rvm/pull/5030)

#### Binaries

* Ubuntu
  * Ubuntu 20.04 x64 binaries
    * Ruby 3.0.0 [\#5031](https://github.com/rvm/rvm/issues/5031)
    * Recompiled 2.4.10, 2.5.8, 2.6.6, 2.7.1, 2.7.2 binaries for Ubuntu 20.04.1 [\#5032](https://github.com/rvm/rvm/pull/5032)

## [1.29.11](https://github.com/rvm/rvm/releases/tag/1.29.11)
29 December 2020 - [Full Changelog](https://github.com/rvm/rvm/compare/1.29.10...1.29.11)

#### New features

* Added railsexpress patches for Ruby 2.7.2 [\#4990](https://github.com/rvm/rvm/pull/4990)
* Added railsexpress patches for Ruby 2.5.8, 2.6.6 and 2.7.1 [\#4900](https://github.com/rvm/rvm/pull/4900)
* Add ruby-3 to the list of available binary builds [\#4984](https://github.com/rvm/rvm/pull/4984)
* Recognize `3*` as CRuby version number [\#4987](https://github.com/rvm/rvm/pull/4987)
* Alias `rvm gemset remove` as `rvm gemset delete` [\#4976](https://github.com/rvm/rvm/pull/4976)
* Alias `rvm gemset move` as `rvm gemset rename` [\#4976](https://github.com/rvm/rvm/pull/4976)
* Alias `rvm delete` as `rvm remove` [\#4976](https://github.com/rvm/rvm/pull/4976)

#### Bug fixes

* Use libssl-1.0 to install Ruby 1.8 on Debian 9 [\#4920](https://github.com/rvm/rvm/pull/4920)
* Use libssl-1.0 to install Ree 1.8 on Ubuntu [\#4996](https://github.com/rvm/rvm/pull/4920)
* Fix broken mergeable config [\#5001](https://github.com/rvm/rvm/pull/5001)
* Update brew list command to remove deprecation warning [\#4995](https://github.com/rvm/rvm/pull/4995) [\#5022](https://github.com/rvm/rvm/pull/5022)

#### New interpreters

* Add support for TruffleRuby 20.1.0, 20.2.0, 20.3.0
* Add support for Ruby 2.4.10, 2.5.8, 2.6.6, 2.7.1 [\#4899](https://github.com/rvm/rvm/pull/4899), 2.7.2 [\#4988](https://github.com/rvm/rvm/pull/4988), 3.0.0-preview1 [\#4983](https://github.com/rvm/rvm/pull/4983), 3.0.0-preview2[\#5009](https://github.com/rvm/rvm/pull/5009), 3.0.0-rc1[\#5015](https://github.com/rvm/rvm/pull/5015), and 3.0.0[\#5016](https://github.com/rvm/rvm/pull/5016)
* Add support for mruby 2.1.1-rc [\#4909](https://github.com/rvm/rvm/pull/4909), 2.1.1-rc2 and 2.1.1 [\#4948](https://github.com/rvm/rvm/pull/4948)
* Add support for TruffleRuby 19.0.2, 19.1.1, 19.2.1, 19.3.0.2 [\#4910](https://github.com/rvm/rvm/pull/4910)
* Add support for Rubinius 4.13-4.20 and 5.0 [\#4947](https://github.com/rvm/rvm/pull/4947)
* Add support for JRuby 9.2.12.0 [\#4960](https://github.com/rvm/rvm/pull/4960), 9.2.13.0 [\#4971](https://github.com/rvm/rvm/pull/4971) and 9.2.14.0 [\#5013](https://github.com/rvm/rvm/pull/5013)

#### Binaries

* Ubuntu
  * Ubuntu 20.04 x64 binaries
    * Ruby 2.4.10, 2.5.8, 2.6.6, 2.7.1 [\#4921](https://github.com/rvm/rvm/issues/4921)
    * Ruby 2.1.0-2.1.10, 2.2.0-2.2.10, 2.3.0-2.3.8, 2.4.0-2.4.9, 2.5.0-2.5.8, 2.6.0-2.6.5, 2.7.0 [\#4921](https://github.com/rvm/rvm/issues/4921)
    * Ruby 3.0.0-preview1 [\#4985](https://github.com/rvm/rvm/pull/4985)
    * Ruby 2.7.2 [\#4989](https://github.com/rvm/rvm/pull/4989)
  * Ubuntu 19.04 x64 binaries
    * Ruby 2.4.0-2.4.10, 2.5.0-2.5.8, 2.6.0-2.6.6, 2.7.0, 2.7.1 [\#4935](https://github.com/rvm/rvm/issues/4935)
    * Ruby 3.0.0-preview1 [\#4985](https://github.com/rvm/rvm/pull/4985)
    * Ruby 2.7.2 [\#4989](https://github.com/rvm/rvm/pull/4989)
  * Ubuntu 18.04 x64 binaries
    * Ruby 2.4.10, 2.5.8, 2.6.6, 2.7.1 [\#4904](https://github.com/rvm/rvm/issues/4904)
    * Ruby 2.4.8 [\#4916](https://github.com/rvm/rvm/issues/4916)
    * Ruby 2.1.0-2.1.10, 2.2.0-2.2.9, 2.3.0-2.3.6, 2.4.0-2.4.3 [\#4916](https://github.com/rvm/rvm/issues/4916)
    * Ruby 2.5.0 [\#4931](https://github.com/rvm/rvm/issues/4931)
    * Ruby 3.0.0-preview1 [\#4985](https://github.com/rvm/rvm/pull/4985)
    * Ruby 2.7.2 [\#4989](https://github.com/rvm/rvm/pull/4989)
  * Ubuntu 16.04 x64 binaries
    * Ruby 2.1.0-2.1.4, 2.1.6-2.1.8, 2.1.10, 2.2.0-2.2.4, 2.3.8, 2.4.5-2.4.10, 2.5.2-2.5.8, 2.6.0-2.6.6, 2.7.0-2.7.1 [\#4932](https://github.com/rvm/rvm/issues/4932)
    * Ruby 3.0.0-preview1 [\#4985](https://github.com/rvm/rvm/pull/4985)
    * Ruby 2.7.2 [\#4989](https://github.com/rvm/rvm/pull/4989)
  * Ubuntu 14.04 x64 binaries
    * Ruby 2.1.0-2.1.1, 2.1.4, 2.1.6-2.1.10, 2.2.2-2.2.10, 2.3.0-2.3.8, 2.4.0-2.4.10, 2.5.0-2.5.8, 2.6.0-2.6.6, 2.7.0-2.7.1 [\#4933](https://github.com/rvm/rvm/issues/4933)
    * Ruby 3.0.0-preview1 [\#4985](https://github.com/rvm/rvm/pull/4985)
    * Ruby 2.7.2 [\#4989](https://github.com/rvm/rvm/pull/4989)
  * Ubuntu 12.04 x64 binaries
    * Ruby 2.4.0-2.4.10, 2.5.0-2.5.8, 2.6.0-2.6.6, 2.7.0, 2.7.1 [\#4935](https://github.com/rvm/rvm/issues/4935)
* Debian
  * Debian 10 x64 binaries
    * Ruby 2.4.0-2.4.10, 2.5.0-2.5.8, 2.6.0-2.6.6, 2.7.0, 2.7.1 [\#4935](https://github.com/rvm/rvm/issues/4935)
    * Ruby 3.0.0-preview1 [\#4985](https://github.com/rvm/rvm/pull/4985)
    * Ruby 2.7.2 [\#4989](https://github.com/rvm/rvm/pull/4989)
  * Debian 9 x64 binaries
    * Ruby 2.4.0-2.4.10, 2.5.0-2.5.8, 2.6.0-2.6.6, 2.7.0, 2.7.1 [\#4935](https://github.com/rvm/rvm/issues/4935)
    * Ruby 3.0.0-preview1 [\#4985](https://github.com/rvm/rvm/pull/4985)
    * Ruby 2.7.2 [\#4989](https://github.com/rvm/rvm/pull/4989)
  * Debian 8 x64 binaries
    * Ruby 2.4.0-2.4.10, 2.5.0-2.5.8, 2.6.0-2.6.6, 2.7.0, 2.7.1 [\#4935](https://github.com/rvm/rvm/issues/4935)
    * Ruby 3.0.0-preview1 [\#4985](https://github.com/rvm/rvm/pull/4985)
    * Ruby 2.7.2 [\#4989](https://github.com/rvm/rvm/pull/4989)
* CentOS
  * CentOS 6 x64 binaries
    * Ruby 2.4.0-2.4.10, 2.5.0-2.5.8, 2.6.0-2.6.6, 2.7.0, 2.7.1 [\#4935](https://github.com/rvm/rvm/issues/4935)
    * Ruby 2.7.2 [\#4989](https://github.com/rvm/rvm/pull/4989)
  * CentOS 7 x64 binaries
    * Ruby 2.4.0-2.4.10, 2.5.0-2.5.8, 2.6.0-2.6.6, 2.7.0, 2.7.1 [\#4935](https://github.com/rvm/rvm/issues/4935)
    * Ruby 3.0.0-preview1 [\#4985](https://github.com/rvm/rvm/pull/4985)
    * Ruby 2.7.2 [\#4989](https://github.com/rvm/rvm/pull/4989)
  * CentOS 8 x64 binaries
    * Ruby 2.4.0-2.4.10, 2.5.0-2.5.8, 2.6.0-2.6.6, 2.7.0, 2.7.1 [\#4936](https://github.com/rvm/rvm/issues/4936)
    * Ruby 3.0.0-preview1 [\#4985](https://github.com/rvm/rvm/pull/4985)
    * Ruby 2.7.2 [\#4989](https://github.com/rvm/rvm/pull/4989)
* Amazon Linux
  * Amazon Linux 2018.03 x64 binaries
    * Ruby 2.4.0-2.4.10, 2.5.0-2.5.8, 2.6.0-2.6.6, 2.7.0, 2.7.1 [\#4935](https://github.com/rvm/rvm/issues/4935)
    * Ruby 3.0.0-preview1 [\#4985](https://github.com/rvm/rvm/pull/4985)
    * Ruby 2.7.2 [\#4989](https://github.com/rvm/rvm/pull/4989)
  * Amazon Linux 2 x64 binaries
    * Ruby 2.4.0-2.4.10, 2.5.0-2.5.8, 2.6.0-2.6.6, 2.7.0, 2.7.1 [\#4935](https://github.com/rvm/rvm/issues/4935)
    * Ruby 3.0.0-preview1 [\#4985](https://github.com/rvm/rvm/pull/4985)
    * Ruby 2.7.2 [\#4989](https://github.com/rvm/rvm/pull/4989)
* Oracle Linux 7 x64 binaries
  * Ruby 2.4.0-2.4.10, 2.5.0-2.5.8, 2.6.0-2.6.6, 2.7.0, 2.7.1 [\#4935](https://github.com/rvm/rvm/issues/4935)
  * Ruby 3.0.0-preview1 [\#4985](https://github.com/rvm/rvm/pull/4985)
  * Ruby 2.7.2 [\#4989](https://github.com/rvm/rvm/pull/4989)

## [1.29.10](https://github.com/rvm/rvm/releases/tag/1.29.10)
25 March 2020 - [Full Changelog](https://github.com/rvm/rvm/compare/1.29.9...1.29.10)

#### New features
* Improve JRuby install time [\#4807](https://github.com/rvm/rvm/pull/4807)
* Add Termux support [\#4749](https://github.com/rvm/rvm/pull/4749)
* Add support for `truffleruby-head` [\#4871](https://github.com/rvm/rvm/pull/4871)

#### New interpreters
* Add support for TruffleRuby 20.0.0
* Add support for TruffleRuby 19.3.1
* Add support for TruffleRuby 19.3.0
* Add support for Rubinius 4.4 and 4.5 [\#4735](https://github.com/rvm/rvm/pull/4735), 4.6 [\#4779](https://github.com/rvm/rvm/pull/4779), 4.7 [\#4821](https://github.com/rvm/rvm/pull/4821), 4.8, 4.9 [\#4842](https://github.com/rvm/rvm/pull/4842), 4.10 [\#4843](https://github.com/rvm/rvm/pull/4843), 4.11 and 4.12 [\#4846](https://github.com/rvm/rvm/pull/4846)
* Add support for JRuby 9.2.8.0 [\#4756](https://github.com/rvm/rvm/pull/4756), 9.2.9.0 [\#4812](https://github.com/rvm/rvm/pull/4812), 9.2.10.0 [\#4877](https://github.com/rvm/rvm/pull/4877), 9.2.11.0 [\#4881](https://github.com/rvm/rvm/pull/4881), 9.2.11.1 [\#4891](https://github.com/rvm/rvm/pull/4891)
* Add support for TruffleRuby 19.2.0 [\#4761](https://github.com/rvm/rvm/pull/4761), 19.2.0.1 [\#4784](https://github.com/rvm/rvm/pull/4784)
* Add support for Ruby 2.4.7, 2.5.6 [\#4767](https://github.com/rvm/rvm/pull/4767), 2.6.4 [\#4768](https://github.com/rvm/rvm/pull/4768), 2.4.8, 2.5.7, 2.6.5 [\#4793](https://github.com/rvm/rvm/pull/4793), 2.4.9 [\#4796](https://github.com/rvm/rvm/pull/4796), 2.7.0-preview2 [\#4805](https://github.com/rvm/rvm/pull/4805), 2.7.0-preview3 [\#4817](https://github.com/rvm/rvm/pull/4817), 2.7.0-rc1 [\#4831](https://github.com/rvm/rvm/pull/4831), 2.7.0-rc2 [\#4834](https://github.com/rvm/rvm/pull/4834), and 2.7.0 [\#4837](https://github.com/rvm/rvm/pull/4837)
* Add support for mruby 2.1.0 [\#4816](https://github.com/rvm/rvm/pull/4816)
* Add support for rubygems 3.0.5, 3.0.6 [\#4828](https://github.com/rvm/rvm/pull/4828)

#### Bug fixes
* Fix installer fetching RVM tags from Bitbucket [\#4730](https://github.com/rvm/rvm/pull/4730)
* Prevent downloading of null RVM versions in installer [\#4731](https://github.com/rvm/rvm/pull/4731)
* RVM package fails to configure on fresh Ubuntu 18.04 server install [\#4742](https://github.com/rvm/rvm/pull/4742)
* Ignore aliases when using `ls` command [\#4743](https://github.com/rvm/rvm/pull/4743) [\#4744](https://github.com/rvm/rvm/pull/4744)
* Export more shell functions which cause the subshell to choke [\#4745](https://github.com/rvm/rvm/pull/4745)
* Adds a check and returns if \_\_rvm\_remove\_from\_path is called with "/\*" [\#4759](https://github.com/rvm/rvm/issues/4759)
* Do not install `rubygems-bundler` by default on TruffleRuby to make `ruby -S bundle` work [\#4766](https://github.com/rvm/rvm/pull/4766)
* Fixes checksums for Ruby 2.6.4 [\#4769](https://github.com/rvm/rvm/pull/4769), 2.4.7 and 2.5.6 [\#4771](https://github.com/rvm/rvm/pull/4771)
* Update TruffleRuby dependencies [\#4815](https://github.com/rvm/rvm/pull/4815)
* Use ruby.git master instead of trunk [\#4840](https://github.com/rvm/rvm/pull/4840)
* Fix RVM version check when using a version newer than the latest release [#4872](https://github.com/rvm/rvm/pull/4872)

#### Changes
* Installer now reports which URL(s) have failed to fetch version information and when version fetching has completely failed [\#4731](https://github.com/rvm/rvm/pull/4731)
* Added railsexpress patches for Ruby 2.6.3 [\#4747](https://github.com/rvm/rvm/pull/4747), 2.6.6, 2.5.6 and 2.4.6 [\#4772](https://github.com/rvm/rvm/pull/4772)
* Fix string corruption bug on railsexpress ruby 2.6.4 [\#4778](https://github.com/rvm/rvm/pull/4778)
* Fix string corruption bug by default for ruby 2.6.4 [\#4780](https://github.com/rvm/rvm/pull/4780)
* Added railsexpress patches for Ruby 2.6.5, 2.5.7, 2.4.9 [\#4799](https://github.com/rvm/rvm/pull/4799) and 2.7.0, 2.7-head [\#4839](https://github.com/rvm/rvm/pull/4839)
* Install Opal globally  [\#4844](https://github.com/rvm/rvm/pull/4844)

#### Binaries:
* Ubuntu 18.04 x64 binaries
  * Ruby 2.4.7, 2.5.6, 2.6.4 [\#4788](https://github.com/rvm/rvm/issues/4788)
  * Ruby 2.4.9, 2.5.7, 2.6.5 [\#4795](https://github.com/rvm/rvm/issues/4795)
  * Ruby 2.7.0 [\#4856](https://github.com/rvm/rvm/issues/4856)

## [1.29.9](https://github.com/rvm/rvm/releases/tag/1.29.9)
10 July 2019 - [Full Changelog](https://github.com/rvm/rvm/compare/1.29.8...1.29.9)

#### New features
* Use remote .sha512 and .md5 if available (Rubinius) [\#4650](https://github.com/rvm/rvm/pull/4650)

#### New interpreters
* Add support for TruffleRuby 19.1.0
* Add support for TruffleRuby 19.0.0 [\#4689](https://github.com/rvm/rvm/pull/4689)
* Add support for Rubinius 4.1 [\#4706](https://github.com/rvm/rvm/pull/4706), 4.2 [\#4714](https://github.com/rvm/rvm/pull/4714), 4.3 [\#4727](https://github.com/rvm/rvm/pull/4727)
* Add support for Ruby 2.7.0 Preview 1 [\#4709](https://github.com/rvm/rvm/pull/4709)
* Add support for Rubygems 2.7.9, 2.7.10, 3.0.3, 3.0.4 [\#4718](https://github.com/rvm/rvm/pull/4718)

#### Bug fixes
* Fix rvm version validation per project [\#4692](https://github.com/rvm/rvm/pull/4692)
* Fix endless loop on macOS when listing remotes [\#4703](https://github.com/rvm/rvm/pull/4703)
* Filter redundant/incompatible rvm\_gem\_options [\#4705](https://github.com/rvm/rvm/pull/4705)
* Remove rvm_gems_path as part of __rvm_remove_rvm_from_path [\#4712](https://github.com/rvm/rvm/pull/4712)
* Fix checksum check condition to not try url if already found in config files [\#4707](https://github.com/rvm/rvm/pull/4707)
* Fix checksum check to only try url checksums for Rubinius [\#4717](https://github.com/rvm/rvm/pull/4717)
* Fix `sed: illegal option -- r` error on macOS when changing to any ruby directory [\#4711](https://github.com/rvm/rvm/pull/4711)
* Don't ignore `curl` error on repo tags fetch [\#4722](https://github.com/rvm/rvm/pull/4722)
* Use newer llvm on Mint 19.1+ [\#4642](https://github.com/rvm/rvm/pull/4642)
* Preserve the environment setting in rvmrc and .rvmrc in multi or mixed mode [\#4612](https://github.com/rvm/rvm/pull/4612)

#### Changes
* TruffleRuby is now always considered a "source Ruby" instead of both a source
  and binary Ruby to improve reliability and avoiding code duplication [\#4708](https://github.com/rvm/rvm/pull/4708)

## [1.29.8](https://github.com/rvm/rvm/releases/tag/1.29.8)
8 May 2019 - [Full Changelog](https://github.com/rvm/rvm/compare/1.29.7...1.29.8)

#### New features
* Upgrade RubyGems to version 3.0.2
* RailsExpress patches for 2.6.1 [\#4603](https://github.com/rvm/rvm/pull/4603), 2.5.4 and 2.6.2 [\#4637](https://github.com/rvm/rvm/pull/4637), 2.5.5 [\#4646](https://github.com/rvm/rvm/pull/4646)
* Add script to automatically register a new TruffleRuby release in RVM [\#4576](https://github.com/rvm/rvm/pull/4576)
* Add .rvmrc equivalents to install help [\#4652](https://github.com/rvm/rvm/pull/4652)
* Copy config.log for debugging if configure fails [\#4651](https://github.com/rvm/rvm/pull/4651)

#### New interpreters
* Add support for TruffleRuby
  * 1.0.0-rc(11,12,13,14,15,16) [\#4575](https://github.com/rvm/rvm/pull/4575)
* Add support for Ruby
  * 2.6.1 [\#4597](https://github.com/rvm/rvm/pull/4597)
  * 2.6.2 and 2.5.4 [\#4636](https://github.com/rvm/rvm/pull/4636)
  * 2.6.3 [\#4668](https://github.com/rvm/rvm/pull/4668)
  * 2.5.5 [\#4640](https://github.com/rvm/rvm/pull/4640)
  * 2.4.6 [\#4657](https://github.com/rvm/rvm/pull/4657)
* Add support for JRuby
  * 9.2.6.0 [\#4614](https://github.com/rvm/rvm/pull/4614)
  * 9.2.7.0 [\#4664](https://github.com/rvm/rvm/pull/4664)
* Add support for Rubinius
  * 3.107 [\#4649](https://github.com/rvm/rvm/pull/4649)
  * 4.0 [\#4688](https://github.com/rvm/rvm/pull/4688)
* Add support for mruby 2.0.1 [\#4667](https://github.com/rvm/rvm/pull/4667)

#### Bug fixes
* Add system ruby as dependency for CentOS [\#4567](https://github.com/rvm/rvm/pull/4567)
* Improve detection of Amazon Linux 2 [\#4568](https://github.com/rvm/rvm/pull/4568)
* Fix macOS openssl requirement gathering with Homebrew [\#4583](https://github.com/rvm/rvm/pull/4583)
* Don't spoil environment with '_system_*' variables [\#4584](https://github.com/rvm/rvm/pull/4584)
* Add missing zlib dependency for macOS [\#4587](https://github.com/rvm/rvm/pull/4587)
* Install libssl1.0-dev for version 1.8 of Ruby on Ubuntu linux [\#4586](https://github.com/rvm/rvm/pull/4586)
* Require os-specific functions during install only when they exist [\#4589](https://github.com/rvm/rvm/pull/4589)
* Fix loading rvm script with set -e [\#4606](https://github.com/rvm/rvm/pull/4606)
* Fix installing Homebrew in a custom location [\#4620](https://github.com/rvm/rvm/pull/4620)
* Update rbx dependencies for macOS [\#4643](https://github.com/rvm/rvm/pull/4643)
* Fix version selected for TruffleRuby binary install [\#4662](https://github.com/rvm/rvm/pull/4662)
* Remove hardcoded number of jobs in installer [\#4674](https://github.com/rvm/rvm/pull/4674)
* Updated obsoleted package openssl-devel to libssl-devel cygwin requirements [\#4685](https://github.com/rvm/rvm/pull/4685)

#### Binaries:
* Ubuntu 18.04 x64 binaries
  * Ruby 2.2.10, 2.3.8, 2.4.5, 2.5.2, 2.5.3, 2.6.0 [\#4595](https://github.com/rvm/rvm/issues/4595)
  * Ruby 2.6.1 [\#4601](https://github.com/rvm/rvm/issues/4601)
  * Ruby 2.5.4, 2.5.5, 2.6.2 [\#4647](https://github.com/rvm/rvm/issues/4647)
  * Ruby 2.4.6 and 2.6.3 [\#4686](https://github.com/rvm/rvm/issues/4686)

## [1.29.7](https://github.com/rvm/rvm/releases/tag/1.29.7)
3 January 2019 - [Full Changelog](https://github.com/rvm/rvm/compare/1.29.6...1.29.7)

#### New features
* Set Ruby 2.6.0 as the default Ruby version [\#4544](https://github.com/rvm/rvm/pull/4544)
* RailsExpress patches for 2.6.0 [\#4547](https://github.com/rvm/rvm/pull/4547)
* Add support for gcc@8 with Homebrew and drop gcc < 4.9 [\#4556](https://github.com/rvm/rvm/issues/4556)

#### New interpreters
* Add support for Ruby 2.6.0-rc2 [\#4526](https://github.com/rvm/rvm/pull/4526) and 2.6.0 [\#4542](https://github.com/rvm/rvm/pull/4542)

#### Bug fixes
* Install libssl1.0.2 for old versions of Ruby on Kali linux [\#4522](https://github.com/rvm/rvm/pull/4522)
* Fix Linux Mint 19 dependencies [\#4524](https://github.com/rvm/rvm/pull/4524)
* Fix Mojave Command Line Tools version detection [\#4404](https://github.com/rvm/rvm/pull/4404)
* Fix return code in signature check function [\#4530](https://github.com/rvm/rvm/issues/4530)
* Check `stable` branch only for latest version [\#4534](https://github.com/rvm/rvm/issues/4534)
* Fix comparison of local and online stable versions [\#4539](https://github.com/rvm/rvm/issues/4539)
* Remove reference to keys.gnupg.net in favour of pool.sks-keyservers.net [\#4550](https://github.com/rvm/rvm/issues/4550)
* Fix Homebrew docs links [\#4551](https://github.com/rvm/rvm/issues/4551)
* Drop invalid link for osx-gcc-installer [\#4552](https://github.com/rvm/rvm/issues/4552)
* Use gcc from XCode for macOS Mojave (10.14) [\#4557](https://github.com/rvm/rvm/issues/4557)
* Stop uninstalling gcc from Homebrew [\#4558](https://github.com/rvm/rvm/issues/4558)

#### Changes
* Drop usage of bit.ly for link shortening [\#4555](https://github.com/rvm/rvm/issues/4555)

## [1.29.6](https://github.com/rvm/rvm/releases/tag/1.29.6)
13 December 2018 - [Full Changelog](https://github.com/rvm/rvm/compare/1.29.5...1.29.6)

#### Bug fixes
* Correct version listed in VERSION file
* Mention pkuczynski gpg key in docs and cli [\#4519](https://github.com/rvm/rvm/pull/4519)
* Remove gcc installed via Homebrew in favour of Command Line Tools on macOS Mojave [\#4501](https://github.com/rvm/rvm/pull/4501)
* Fix Rubinius build on macOS with Homebrew [\#4328](https://github.com/rvm/rvm/pull/4328)

#### Documentation
* Improve gpg signature verification docs [\#4458](https://github.com/rvm/rvm/pull/4458)

## [1.29.5](https://github.com/rvm/rvm/releases/tag/1.29.5)
12 December 2018 - [Full Changelog](https://github.com/rvm/rvm/compare/1.29.4...1.29.5)

#### New features:
* Switch to new maven-based JRuby download URLs
* RailsExpress patches for 2.3.8, 2.4.5 and 2.5.3 [\#4476](https://github.com/rvm/rvm/pull/4476)
* Add support for Void linux [\#4478](https://github.com/rvm/rvm/pull/4478)
* Add support for MINGW in main rvm script [\#4493](https://github.com/rvm/rvm/pull/4493)
* Add support for gcc@7 on macOS with Homebrew [\#4500](https://github.com/rvm/rvm/pull/4500)
* Add support for Trisquel linux [\#4478](https://github.com/rvm/rvm/pull/4478)
* Add fail warning when Avira antivirus running [\#4498](https://github.com/rvm/rvm/pull/4498)

#### Bug fixes:
* Allow HTTP 2.0 servers to be used for downloads
* Remove too restrictive check for LLVM with TruffleRuby [\#4427](https://github.com/rvm/rvm/pull/4427)
* Fix trap restoration on Amazon Linux [\#4428](https://github.com/rvm/rvm/pull/4428)
* Fix Amazon Linux 2 detection [\#4435](https://github.com/rvm/rvm/pull/4435)
* Fix libssl dependency for Elementary 5.0 Juno [\#4448](https://github.com/rvm/rvm/pull/4448)
* Fix Ruby 2.5.0 and 2.5.1 build with LibreSSL 2.7.0 [\#4483](https://github.com/rvm/rvm/pull/4483)
* Fix libssl dependency for Mint 19 [\#4482](https://github.com/rvm/rvm/pull/4482)
* Use --no-ri or --no-document depending on ruby version [\#4492](https://github.com/rvm/rvm/pull/4492)

#### Upgraded Ruby interpreters:
* Add support for TruffleRuby 1.0.0-rc3 [\#4419](https://github.com/rvm/rvm/pull/4419), 1.0.0-rc5 [\#4440](https://github.com/rvm/rvm/pull/4440), 1.0.0-rc6 [\#4452](https://github.com/rvm/rvm/pull/4452), 1.0.0-rc7 [\#4466](https://github.com/rvm/rvm/pull/4466), 1.0.0-rc8 [\#4489](https://github.com/rvm/rvm/pull/4489), 1.0.0-rc9 [\#4489](https://github.com/rvm/rvm/pull/4489), and 1.0.0-rc10 [\#4512](https://github.com/rvm/rvm/pull/4512)
* Add support for Ruby 2.3.8, 2.4.5, 2.5.2, 2.5.3 [\#4474](https://github.com/rvm/rvm/pull/4474), 2.6.0-preview3 [\#4490](https://github.com/rvm/rvm/pull/4490), and 2.6.0-rc1 [\#4513](https://github.com/rvm/rvm/pull/4513)
* Add support for JRuby 9.2.1.0 [\#4491](https://github.com/rvm/rvm/pull/4491), 9.2.2.0 [\#4495](https://github.com/rvm/rvm/pull/4495), 9.2.3.0 [\#4496](https://github.com/rvm/rvm/pull/4496), 9.2.4.0 [\#4504](https://github.com/rvm/rvm/pull/4504), 9.2.4.1 [\#4509](https://github.com/rvm/rvm/pull/4509), and 9.2.5.0 [\#4514](https://github.com/rvm/rvm/pull/4514)
* Add support for mruby 1.4.1 [\4517](https://github.com/rvm/rvm/pull/4517) and 2.0.0 [\4516](https://github.com/rvm/rvm/pull/4516)

#### Binaries:
* Ubuntu 18.04 x64 binaries for Ruby 2.3.7, 2.4.4 and 2.5.1 [\#4438](https://github.com/rvm/rvm/issues/4438)

## [1.29.4](https://github.com/rvm/rvm/releases/tag/1.29.4)
1 July 2018 - [Full Changelog](https://github.com/rvm/rvm/compare/1.29.3...1.29.4)

#### New features:
* Multi-colored log, warning and error messages [\#4044](https://github.com/rvm/rvm/pull/4044)
* RailsExpress patches for 2.2.8, 2.3.5 and 2.4.2 [\#4167](https://github.com/rvm/rvm/pull/4167)
* Improved CPU count detection [\#4171](https://github.com/rvm/rvm/pull/4171)
* Simplified wrapper subcommand [\#4180](https://github.com/rvm/rvm/issues/4180)
* Extend aliases to gems directories [\#4189](https://github.com/rvm/rvm/pull/4189)
* Debian Buster (10) support [\#4199](https://github.com/rvm/rvm/pull/4199)
* Implement DNF package manager for Fedora 22+ [\#4198](https://github.com/rvm/rvm/pull/4198)
* `float_warnings` patches for Ruby 2.0.0p64[5 7 8], 2.1.[8 9 10], 2.2.[4 5 6 7 8], 2.3.[0 1 2 3 4 5] and 2.4.[0 1 2] [\#4201](https://github.com/rvm/rvm/pull/4201)
* RailsExpress patches for ruby-head, 2.2.9, 2.3.6 and 2.4.3 [\#4264](https://github.com/rvm/rvm/pull/4264)
* RailsExpress patches for 2.5.0 [\#4268](https://github.com/rvm/rvm/pull/4268)
* Update README including Table of Contents to help improve documentation readability [\#4277](https://github.com/rvm/rvm/pull/4277)
* Set default RubyGems to 2.7 [\#4276](https://github.com/rvm/rvm/issues/4276)
* Add support for installing Ruby <2.4 on Ubuntu 17.10+ [\#4326](https://github.com/rvm/rvm/pull/4326)
* Add support for installing Rubinius on Redhat/Fedora [\#4329](https://github.com/rvm/rvm/pull/4329)
* Installing Rubinius on Ubuntu 17.x [\#4213](https://github.com/rvm/rvm/pull/4213)
* RailsExpress patches for 2.2.10, 2.3.7, 2.4.4 and 2.5.1 [\#4344](https://github.com/rvm/rvm/pull/4344)
* Add documentation in `rvm help install` for multiple undocumented flags [\#4350](https://github.com/rvm/rvm/pull/4350)
* Add support for TruffleRuby [\#4406](https://github.com/rvm/rvm/pull/4406)
* Add support for `--tag` in `rvm install` [\#4360](https://github.com/rvm/rvm/pull/4360)
* Add bundler to list of default gems [\#4413](https://github.com/rvm/rvm/pull/4413)

#### Bug fixes:
* ZSH Bad pattern for Gemfile ruby declaration [\#4154](https://github.com/rvm/rvm/issues/4154) [\#4156](https://github.com/rvm/rvm/issues/4156)
* Add missing `random.c` patch for Ruby 2.3.2 [\#4165](https://github.com/rvm/rvm/issues/4165)
* Set back IRB history default to HOME [\#4158](https://github.com/rvm/rvm/issues/4158)
* Do not require `libyaml-devel` on Redhat/Centos when it's not needed [\#2998](https://github.com/rvm/rvm/issues/2998)
* Restore mvn installation for JRuby 1.7 [\#4166](https://github.com/rvm/rvm/issues/4166)
* ree-1.8.7 requires old version of OpenSSL 1.0.2 [\#4110](https://github.com/rvm/rvm/issues/4110)
* `libreadline6-dev` is not a valid Ubuntu 16.10 package [\#4172](https://github.com/rvm/rvm/issues/4172)
* Require libdb-4.8 for OpenSuSE Tumbleweed [\#4178](https://github.com/rvm/rvm/issues/4178)
* Require make for JRuby 9 [\#4058](https://github.com/rvm/rvm/issues/4058)
* Fix support for zsh 5.4.1 [bash_zsh_support \#6](https://github.com/mpapis/bash_zsh_support/pull/6)
* Installing rbx-3.70 fails on PCLinuxOS 64-bit [\#3895](https://github.com/rvm/rvm/issues/3895)
* Can't install Ruby with MacPorts and LibreSSL [\#4208](https://github.com/rvm/rvm/issues/4208)
* Fix invalid `libgmp3-dev` requirement for Debian [\#4238](https://github.com/rvm/rvm/pull/4238)
* Ensure compat-openssl10-devel is not installed for Fedora 26+ and Ruby 2.4+ [\#4249](https://github.com/rvm/rvm/pull/4249)
* Fix fd_mask detection on OS X for Ruby 2.5.0 [\#4270](https://github.com/rvm/rvm/pull/4270)
* Suppress `ls` alias substitution in `gem_install_force` in `scripts/functions/gemset` [\#4282](https://github.com/rvm/rvm/issues/4282)
* Fix installing rubygems 2.7 [\#4287](https://github.com/rvm/rvm/pull/4287)
* Add prelude_gcc_diagnostic patch for Ruby 2.5.0 to correct compilation failures with GCC < 5
* Fix installing rubygems master [\#3734](https://github.com/rvm/rvm/issues/3734)
* Correctly look for rvm group in /etc/group [\#4300](https://github.com/rvm/rvm/issues/4300)
* Drop homebrew/versions and upgrade gcc to 6.0 [\#4304](https://github.com/rvm/rvm/pull/4304)
* Avoid unnecessary install warning [\#4346](https://github.com/rvm/rvm/pull/4346)
* Unified putput of installation notes [\#4330](https://github.com/rvm/rvm/pull/4330)
* Skip gemset pristine on mruby reinstall [\#4348](https://github.com/rvm/rvm/pull/4348)
* Ruby 2.2.5 to 2.2.10 patches for installing bundled gems [\#4358](https://github.com/rvm/rvm/issues/4358)
* Update RBX dependencies for OpenSUSE [\#4382](https://github.com/rvm/rvm/pull/4382)
* Fix nailgun detection on JRuby 9+ [\#4089](https://github.com/rvm/rvm/issues/4089)
* RVM removes traps in bash [\#4416](https://github.com/rvm/rvm/issues/4416)

#### Upgraded Ruby interpreters:
* Add support for Ruby 2.2.8, 2.3.5 and 2.4.2 [\#4159](https://github.com/rvm/rvm/pull/4159), 2.5.0-preview1 [\#4204](https://github.com/rvm/rvm/pull/4204), 2.2.9, 2.3.6, 2.4.3 and 2.5.0-rc1 [\#4261](https://github.com/rvm/rvm/pull/4261), 2.5.0 [\#4265](https://github.com/rvm/rvm/pull/4265), 2.6.0-preview1 [\#4317](https://github.com/rvm/rvm/pull/4317), 2.2.10, 2.3.7, 2.4.4, 2.5.1 [\#4340](https://github.com/rvm/rvm/pull/4340) and 2.6.0-preview2[\#4395](https://github.com/rvm/rvm/pull/4395)
* Add support for Rubinius 3.85-3.100
* Add support for JRuby 9.1.14.0 [\#4224](https://github.com/rvm/rvm/pull/4224), 9.1.15.0 [\#4258](https://github.com/rvm/rvm/pull/4258), 9.1.16.0 [\#4316](https://github.com/rvm/rvm/pull/4316), 9.1.17.0 [\#4366](https://github.com/rvm/rvm/pull/4366), 9.2.0.0 [\#4390](https://github.com/rvm/rvm/pull/4390)
* Add support for mruby 1.4.0 [\#4286](https://github.com/rvm/rvm/pull/4286)
* Add support for MagLev 1.1* and 1.2Alpha-1.2Alpha4 [\#4289](https://github.com/rvm/rvm/pull/4289)
* Add support for RubyGems 2.6.14 [\#4205](https://github.com/rvm/rvm/pull/4205), 2.7.0-2.7.4 [\#4276](https://github.com/rvm/rvm/issues/4276) and 2.7.5-6

#### Binaries:
* Ubuntu 16.04 x64 binaries for Ruby 2.2.10, 2.3.7, 2.4.4 and 2.5.1 [\#4362](https://github.com/rvm/rvm/issues/4362), 2.2.9, 2.3.6 and 2.4.3 [\#4259](https://github.com/rvm/rvm/issues/4259), 2.2.8, 2.3.5 and 2.4.2 [\#4161](https://github.com/rvm/rvm/issues/4161), 2.5.0 [\#4272](https://github.com/rvm/rvm/pull/4272)
* Ubuntu 17.04 for Ruby 2.1.\*, 2.2.\* [\#4233](https://github.com/rvm/rvm/pull/4233)


## [1.29.3](https://github.com/rvm/rvm/releases/tag/1.29.3)
10 September 2017 - [Full Changelog](https://github.com/rvm/rvm/compare/1.29.2...1.29.3)

#### New features:
* Add RVM commands missing in bash shell completion [\#4078](https://github.com/rvm/rvm/pull/4078)
* Railsexpress patches for 2.3.4, 2.3-head [\#4084](https://github.com/rvm/rvm/pull/4084), 2.2.5 and 2.2.6 [\#4153](https://github.com/rvm/rvm/pull/4153)
* Update `gem-wrappers` to 1.3.0: Show warnings when the target binary is missing or is not executable [gem-wrappers \#9](https://github.com/rvm/gem-wrappers/issues/9)
* Detect Zorin OS as Ubuntu [\#4140](https://github.com/rvm/rvm/issues/4140)

#### Bug fixes:
* Infinite loop in `gemset_create` [\#4102](https://github.com/rvm/rvm/issues/4102)
* Command not found `__rvm_remote_version` error [\#4085](https://github.com/rvm/rvm/pull/4085)
* Fix path of version script in `environment` [\#4117](https://github.com/rvm/rvm/pull/4117)
* Define `cd()`, `pushd()` and `popd()` properly when using zsh [\#4132](https://github.com/rvm/rvm/pull/4132)
* Update gem-wrappers to 1.3.1: Avoid warnings for missing ruby binaries [\#4104](https://github.com/rvm/rvm/issues/4104)
* Handles :engine=> and :engine_version=> in Gemfile
* Makes $rvm_ruby_string is not installed searchable by adding a fixed keyword
* Correctly quotes suggested install command
* Fix path to version script in rvm-installer [\#4134](https://github.com/rvm/rvm/pull/4134)
* Fix rvm autolibs status, fix [\#4123](https://github.com/rvm/rvm/issues/4123)
* Ruby 2.3.x and older are not compatible with OpenSSL 1.1.x on Arch [\#4006](https://github.com/rvm/rvm/issues/4006)
* Allow comments after ruby directive in Gemfile [\#4056](https://github.com/rvm/rvm/issues/4056)
* Ruby 2.3/4 compilation fix for GCC 7 [\#4080](https://github.com/rvm/rvm/issues/4080) [\#4115](https://github.com/rvm/rvm/issues/4115)
* Add warning for sudo users [\#4009](https://github.com/rvm/rvm/issues/4009)
* Allows running RVM shell function in Bash with `set -o nounset` [\#4013](https://github.com/rvm/rvm/issues/4013)
* Ensure `rvm_hooks_path` is set [\#3902](https://github.com/rvm/rvm/issues/3902)
* Allow building static ruby with `--disbale-shared` [\#4091](https://github.com/rvm/rvm/issues/4091)
* Restore detection of `gpg` command for veryfication of signatures [\#4059](https://github.com/rvm/rvm/issues/4059)
* Update `gem-wrappers` to 1.3.2: Avoid nested chdir warnings [gem-wrappers \#11](https://github.com/rvm/gem-wrappers/pull/11)
* Fix RVM folder cleanup during installation [\#4333](https://github.com/rvm/rvm/issues/4333)
* Fix found project file reject reasons for bash -e [\#4314](https://github.com/rvm/rvm/pull/4314)

#### Upgraded Ruby interpreters:
* Add support for Rubinius 3.82, 3.83, 3.84
* Add support for mruby 1.3.0
* Upgrade RubyGems to 2.6.13 [\#4142](https://github.com/rvm/rvm/pull/4142)
* Add support for JRuby 9.1.13.0 [\#4147](https://github.com/rvm/rvm/pull/4147)

#### Documentation
* Remove `wayneeseguin` reference from RVM repo names [\#4086](https://github.com/rvm/rvm/pull/4086)

## [1.29.2](https://github.com/rvm/rvm/releases/tag/1.29.2)

#### New features:
* Add support for elementary OS [\#3935](https://github.com/rvm/rvm/issues/3935)
* Add support for Deepin (based on Debian) [\#3999](https://github.com/rvm/rvm/issues/3999)
* Simplified OS detection mechanism [\#3938](https://github.com/rvm/rvm/pull/3938)
* Use fuzzy version match for `rvm remove` [\#4028](https://github.com/rvm/rvm/pull/4028)
* Simplify and cleanup of `rvm help` output [\#4029](https://github.com/rvm/rvm/pull/4029)
* Add support for Kali Linux (based on Debian) [\#3958](https://github.com/rvm/rvm/issues/3958)
* Railsexpress patches for 2.4.0, 2.4.1 and 2.4-head [\#4050](https://github.com/rvm/rvm/pull/4050)

#### Bug fixes:
* Use actual executable test instead of mount|grep noexec for robust noexec detection [\#3933](https://github.com/rvm/rvm/pull/3933)
* "Unknown ruby string (do not know how to handle)" when specifying Ruby version w/a gemset [\#3292](https://github.com/rvm/rvm/issue/3292)
* Fix the required openssl version for ruby 1.8 on OSX [\#3955](https://github.com/rvm/rvm/issue/3955)
* Detect `.` as an alternative to `source` in bash profile warning [\#3960](https://github.com/rvm/rvm/issues/3960)
* Allow users to specify irb history file using IRB.conf[:HISTORY_FILE] [\#3969](https://github.com/rvm/rvm/pull/3969)
* Prefer github issues over IRC support [\#3939](https://github.com/rvm/rvm/issues/3939)
*	Architecture detection using uname instead of dpkg [\#3948](https://github.com/rvm/rvm/issues/3948)
* Help section of the rvm.io page points to irc.freenode.net instead of github [\#3939](https://github.com/rvm/rvm/issues/3939)
* Make sure stderr output is printed on console and not captured into log files [\#3990](https://github.com/rvm/rvm/issues/3990)
* Clean up errors output, show only log file name [\#3990](https://github.com/rvm/rvm/issues/3990)
* RVM install fail on macOS Yosemite due expired curl's SSL certificate [\#3886](https://github.com/rvm/rvm/issues/3886)
* Fix failing openssl.patch for Ruby 2.2.4 and 2.2.5 [\#3988](https://github.com/rvm/rvm/issues/3988)
* Do not unset rvm_pretty_print_flag [\#3946](https://github.com/rvm/rvm/issues/3946)
* Patch Ruby 2.3.4 with missing rb_thread_fd_close [\#4008](https://github.com/rvm/rvm/issues/4008)
* Unknown subcommand `rvm gemset clear` [\#4004](https://github.com/rvm/rvm/issues/4004)
* Skip rubygems install for ruby-head [\#4022](https://github.com/rvm/rvm/pull/4022)
* Fix match MacPorts in non standard location [\#4051](https://github.com/rvm/rvm/pull/4051)
* Ruby 2.3.3 doesn't compile on Debian 8.3 [\#4000](https://github.com/rvm/rvm/issues/4000)
* Ruby < 2.4 fail to build on Fedora 26 [\#4057](https://github.com/rvm/rvm/issues/4057)

#### Upgraded Ruby interpreters:
* Add support for Rubinius 3.72 [\#3934](https://github.com/rvm/rvm/pull/3934), 3.73 [\#3979](https://github.com/rvm/rvm/pull/3979), 3.74 [\#3994](https://github.com/rvm/rvm/pull/3994), 3.75 [\#4002](https://github.com/rvm/rvm/pull/4002), 3.76 and 3.77 [\#4016](https://github.com/rvm/rvm/pull/4016), 3.78, 3.79, 3.80, 3.81
* Add support for Ruby 2.2.7 [\#3970](https://github.com/rvm/rvm/pull/3970), 2.3.4 [\#3973](https://github.com/rvm/rvm/pull/3973) and 2.4.1 [\#3963](https://github.com/rvm/rvm/pull/3963)
* Upgrade RubyGems to 2.6.12 [\#4018](https://github.com/rvm/rvm/pull/4018)
* Add support for JRuby 1.7.27 [\#4026](https://github.com/rvm/rvm/pull/4026), 9.1.8.0 [\#3952](https://github.com/rvm/rvm/pull/3952), 9.1.9.0 [\#4036](https://github.com/rvm/rvm/pull/4036), 9.1.10.0 [\#4049](https://github.com/rvm/rvm/pull/4049), 9.1.11 [\#4064](https://github.com/rvm/rvm/issues/4064) and 9.1.12.0 [\#4066](https://github.com/rvm/rvm/issues/4066)

#### Binaries:
* Ubuntu x64 binary for Ruby 2.4.1 [\#3965](https://github.com/rvm/rvm/issues/3965)
* Ubuntu x64 binary for Ruby 2.2.7 [\#3971](https://github.com/rvm/rvm/issues/3971)
* Ubuntu x64 binary for Ruby 2.3.4 [\#3985](https://github.com/rvm/rvm/issues/3985)
* Ubuntu 16.10 x64 binaries for Ruby 1.9.3-p551, 2.0.0-p648, 2.1.5, 2.1.6, 2.1.8, 2.1.9, 2.2.4, 2.2.5, 2.2.6, 2.3.0, 2.3.1, 2.3.2 and 2.3.3 [\#3823](https://github.com/rvm/rvm/issues/3823)

#### Documentation:
* Integrating RVM with Bash on Ubuntu on Windows 10 [\#304](https://github.com/rvm/rvm-site/pull/304)
* Troubleshooting SSL certificate problem: unable to get local issuer certificate [\#3984](https://github.com/rvm/rvm/issue/3984)
* Automatically generated Integration section on Index page [\#305](https://github.com/rvm/rvm-site/pull/305)
* Add info about Ubuntu installation package [\#306](https://github.com/rvm/rvm-site/pull/306)
* Remove subversion as a prerequisite for installing rubies [\#277](https://github.com/rvm/rvm-site/issue/277)
* Added missing information that user should have sudo rights to install rubies [\#307](https://github.com/rvm/rvm-site/pull/307)
* Better explanation for `apt-get update` failing with 404 Not Found errors [\#3411](https://github.com/rvm/rvm/issue/3411)
* Ruby 2.1 is no more maintained [\#3997](https://github.com/rvm/rvm/pull/3997)
* Display deprecation notice for `rvm usage` [\#4047](https://github.com/rvm/rvm/pull/4047)

## [1.29.1](https://github.com/rvm/rvm/releases/tag/1.29.1)

19 February 2017 - [Full Changelog](https://github.com/rvm/rvm/compare/1.29.0...1.29.1)

#### Bug fixes:
* Fix using ruby from current dir when no params [\#3880](https://github.com/rvm/rvm/issues/3880)
* Fix Ruby/Openssl installation on OSX [\#3923](https://github.com/rvm/rvm/issues/3923)
* Fix rvm info to be yaml compatible [\#3924](https://github.com/rvm/rvm/issues/3924)
* Add explicit architecture check for debian/ubuntu [\#3927](https://github.com/rvm/rvm/issues/3927)
* Fix detecting openssl path for ruby24 [\#3928](https://github.com/rvm/rvm/issues/3928)


## [1.29.0](https://github.com/rvm/rvm/releases/tag/1.29.0)

12 February 2017 - [Full Changelog](https://github.com/rvm/rvm/compare/1.28.0...1.29.0)

#### Security fixes:
* add trusting working directory hooks
* add trusting project files with environment variables
* prevent executing code when loading variables from project files
* remove posibility to install gems from .versions.conf
* do not 'bundle install' if no rvm_autoinstall_bundler_flag=1
* install bundler only from remote server
* handle spaces in working directory hook names
* avoid double escaping of envirtonment variables
* avoid extra quotation if it was used in the project file

#### New features:
* Added railsexpress patches for Ruby 2.3.3 [\#3852](https://github.com/rvm/rvm/pull/3852)
* Add support for KDE neon [\#3828](https://github.com/rvm/rvm/pull/3828)
* Allow to remove undesired libraries breaking the ruby build [\#3851](https://github.com/rvm/rvm/issues/3851)
* Mention in PATH warnings about ability to silence them [\#3336](https://github.com/rvm/rvm/issues/3336)
* Expose `autolibs` setting in `rvm info` output [\#3892](https://github.com/rvm/rvm/pull/3892)
* Detect `noexec` mount mode for partition hosting RVM home [\#3832](https://github.com/rvm/rvm/pull/3832)

#### Bug fixes:
* Changed `eval` to `source` for fish 2.5.0 compatibility [fish-shell\#3809](https://github.com/fish-shell/fish-shell/issues/3809)
* $PATH become empty after __rvm_unload executed [\#3847](https://github.com/rvm/rvm/pull/3847)
* RVM incorrectly tries to install llvm 3.5 when trying to install Rubinius 3 [\#3848](https://github.com/rvm/rvm/pull/3848)
* Missing libyaml-devel on PCLinuxOS 64-bit [\#3703](https://github.com/rvm/rvm/issues/3703)
* Failing openssl.patch for Ruby 1.9.3 [\#3831](https://github.com/rvm/rvm/issues/3831)
* RVM hardcodes number of compile threads [\#3856](https://github.com/rvm/rvm/pull/3856)
* Cannot build rbx-2.5.2 on ArchLinux [\#3497](https://github.com/rvm/rvm/issues/3497)
* Remove incompatible version of openssl098 [\#3844](https://github.com/rvm/rvm/issues/3844)
* Failed to fetch the gpg key from keys.gnupg.net [\#3544](https://github.com/rvm/rvm/issues/3544)
* Filtering Travis binaries for OSX for non Travis env (they are statically linked and not movable) [\#3690](https://github.com/rvm/rvm/issues/3690)
* Remove kernel-libc-devel dependency on Solus [\#3881](https://github.com/rvm/rvm/pull/3881)
* Speed up loading rubies - gem version compatibility check
* Missing cygwin32-readline package on Windows [\#3812](https://github.com/rvm/rvm/pull/3812)
* Installation of rbx-3.69 on macOS fails because llvm35 formula can't be found [\#3884](https://github.com/rvm/rvm/issues/3884)
* Ruby 2.3.x and older are not compatible with OpenSSL 1.1.x on Debian [\#3862](https://github.com/rvm/rvm/issues/3862)
* OpenSSL vs libressl conflict installing ruby-2.4.0 on openSUSE Tumbleweed [\#3906](https://github.com/rvm/rvm/issues/3906)
* Missing `libgmp3-dev` for Ruby 2.2 on Debian 6 [\#3675](https://github.com/rvm/rvm/issues/3675)
* JRuby on Arch is missing Java requirements [\#3539](https://github.com/rvm/rvm/issues/3539)
* `rvm install 2.4` installs 2.4.0-rc1 instead of 2.4.0 [\#3866](https://github.com/rvm/rvm/issues/3866)
* Use `libreadline-dev` instead of `libreadline6-dev` on Debian (???stretch) [\#3824](https://github.com/rvm/rvm/issues/3824)
* Warning: openssl is a keg-only and another version is linked to opt [\#3724](https://github.com/rvm/rvm/issues/3724)
* Fix trusting paths with duplicated //
* Fix rvm do in relative paths

#### Upgraded Ruby interpreters:
* Add support for Ruby 2.4.0 [\#3849](https://github.com/rvm/rvm/pull/3849)
* Add support for JRuby 9.1.7.0 [\#3878](https://github.com/rvm/rvm/pull/3878)
* Add support for Rubinius 3.70 [\#3889](https://github.com/rvm/rvm/pull/3889) and 3.71
* Upgrade RubyGems to 2.6.10

#### Binaries:
* Ubuntu x64 binary for Ruby 2.4.0 [\#3867](https://github.com/rvm/rvm/issues/3867)

## [1.28.0](https://github.com/rvm/rvm/releases/tag/1.28.0)

19 December 2016 - [Full Changelog](https://github.com/rvm/rvm/compare/1.27.0...1.28.0)

#### New features:
* Feedback when switching gemset with/without use [\#3780](https://github.com/rvm/rvm/issues/3780)
* Require OpenJDK 1.8.0 (with fallback to 1.7.0) for JRuby on CentOS/Fedora [\#3741](https://github.com/rvm/rvm/pull/3741) and Ubuntu [\#3719](https://github.com/rvm/rvm/pull/3719)
* Updated README including information about dedicated Ubuntu package
* Add support for Solus linux [\#3728](https://github.com/rvm/rvm/pull/3728)

#### Bug fixes:
* Can't download rvm; curl returned status '23' [\#3785](https://github.com/rvm/rvm/issues/3785)
* Installation fails when cygwin was installed with `--no-admin` flag [\#3762](https://github.com/rvm/rvm/issues/3762)
* Installation fails with `SSLv3_method undeclared` [\#3752](https://github.com/rvm/rvm/issues/3752)
* Updated source urls for Ruby Enterprise Edition [\#3740](https://github.com/rvm/rvm/issues/3740)
* RVM install rbx fails on 10.11.6 with `llvm` version mismatch [\#3722](https://github.com/rvm/rvm/issues/3722)
* Can't install jruby on Ubuntu 16.04: no `openjdk-7-jre-headless` package [\#3719](https://github.com/rvm/rvm/issues/3719)
* Fail to install ruby 2.3.1 on Windows 10 with Cygwin (missing `libcrypt-devel` and `libcrypt0`) [\#3706](https://github.com/rvm/rvm/issues/3706)
* Incorrect requirement `cygwin32-readline` for Cygwin x86_64 [\#2736](https://github.com/rvm/rvm/issues/2736)
* Fish shell error after stable update [\#3655](https://github.com/rvm/rvm/issues/3655)
* Enforce usage of gpg coming from Cygwin on Windows [\#3623](https://github.com/rvm/rvm/issues/3623)
* Change Rubinius dependency llvm to version 3.5 for OpenSuse, macOS and Ubuntu [\#3287](https://github.com/rvm/rvm/issues/3287)
* Print info message when auto switching ruby by entering the folder [\#3602](https://github.com/rvm/rvm/issues/3602)
* Change Rubinius Ubuntu dependency clang to version 3.5 [\#3541](https://github.com/rvm/rvm/issues/3541)
* Patch Ruby to explicitly refer to kernel32.dll on Cygwin [\#3519](https://github.com/rvm/rvm/issues/3519)
* Add libgmp-dev as an Ubuntu requirement [\#3509](https://github.com/rvm/rvm/issues/3509)
* Errors when installing rubies caused by old ruby gems 2.4.x shipped with RVM [\#3742](https://github.com/rvm/rvm/issues/3742)
* Cannot load such file -- zlib [\#3389](https://github.com/rvm/rvm/issues/3389)
* Improved warning message for when PATH= is set without $PATH [\#3776](https://github.com/rvm/rvm/pull/3776)
* Fix error message about ignoring all Gemfiles [\#3771](https://github.com/rvm/rvm/pull/3771)
* Added rails express patches for 2.2.5 and 2.3.1 [\#3676](https://github.com/rvm/rvm/pull/3676)
* Change OpenBSD mirror protocol from ftp to http [\#3673](https://github.com/rvm/rvm/pull/3673)
* Enable building of Ruby 1.9.3 and 2.0.0 on 64bit little-endian PowerPC [\#3666](https://github.com/rvm/rvm/pull/3666)
* Avoid infinite loop on a new tmux session [\#3653](https://github.com/rvm/rvm/pull/3653)

#### Upgraded Ruby interpreters:
* Add support for JRuby 9.1.6.0 [\#3805](https://github.com/rvm/rvm/issues/3805)
* Add support for Ruby 2.2.6, 2.3.2 [\#3808](https://github.com/rvm/rvm/issues/3808), 2.3.3 [\#3819](https://github.com/rvm/rvm/issues/3819), 2.4.0-preview3 and 2.4.0-rc1
* Add support for Rubinius 3.69
* Drop support for GoRuby [\#3786](https://github.com/rvm/rvm/issues/3786)
* Upgrade RubyGems to 2.6.8

#### Binaries:
* Ruby 2.3.0, 2.3.1 [\#3774](https://github.com/rvm/rvm/issues/3774), 2.3.3 [\#3822](https://github.com/rvm/rvm/issues/3822) binaries for Debian 8 x86_64
* Ruby 2.0.0-p648, 2.1.5, 2.1.9, 2.2.5, 2.3.0 [\#3693](https://github.com/rvm/rvm/issues/3693), 2.2.6 and 2.3.2 [\#3809](https://github.com/rvm/rvm/issues/3809), 2.3.3 [\#3820](https://github.com/rvm/rvm/issues/3820) binaries for Ubuntu 16.04
* Ruby 2.3.1 for Centos 6.6 [\#3712](https://github.com/rvm/rvm/issues/3712)
* Install CentOS binaries on both RedHat and CentOS machines [\#3735](https://github.com/rvm/rvm/issues/3735)


## Previous versions

* [1.7.3 - 1.27](https://github.com/rvm/rvm/compare/1.7.2...1.27.0) (_25 August 2011 - 26 March 2016_)
* [0.0.6](https://github.com/rvm/rvm/blob/939585d8563cad4225fa44e8e78b9173467e8440/CHANGELOG.md#006) - [1.7.2](https://github.com/rvm/rvm/blob/939585d8563cad4225fa44e8e78b9173467e8440/CHANGELOG.md#172-17-august-2011) (_17 August 2011_)
src/rvm/CONTRIBUTING.md000066400000006077147511530530010410 0ustar00# RVM 2.0 work announcement

Work on RVM 2.0 has started, check the plan here:
https://docs.google.com/document/d/1xW9GeEpLOWPcddDg_hOPvK4oeLxJmU3Q5FiCNT7nTAc/edit?usp=sharing

To be able to do the RVM 2.0 work we need to stop working on RVM 1.x -
this means no more feature requests will be accepted.
Development on RVM 1.x will continue to provide bugfixes and
support for new ruby versions as long as RVM 2.0 will not become stable.
RVM is an open source project so any contributions are welcome -
including new features pull requests - as long as they keep compatibility and
do not break anything.

# Common workflows

## Adding support for new version of Ruby

The following files need to be updated to add support for a new version of an already supported Ruby interpreter.
Please follow the patterns used in those files and add entries in the appropriate location.
[\#4366](https://github.com/rvm/rvm/commit/f324ed3946e5d74a80c59d873ac346e70dd50612) is a good example of the required changes.

* `config/known`
  * update existing entry when minor version released
  * add new entry when major version released
* `config/known_strings` - add an entry for the new version released
* `config/db` - update only for stable releases
* `config/md5` - add new line with `md5` hash of the archive
* `config/sha512` - add new line with `sha512` hash of the archive

When listing interpreter source make sure that you link to the smallest archive variant (usually `.bz2`).

When release package does not include `md5` or `sha512` hashes you should download the source package and calculate it yourself.
One of the ways to do that would be to use `openssl` command:

```
openssl dgst -sha512 FILE
openssl dgst -md5 FILE
```

## Running RVM in local development environment

To test a local copy of RVM for development purposes simply enter the folder with the source and install it:

```
./install && rvm reload
```

If you don't want to destroy your working environment, you can select a different destination folder and easily switch between them:

```
./install --path ~/.rvm-dev
rvm switch ~/.rvm-dev           # development version
rvm switch ~/.rvm               # production version
```

## Subtrees

Subtree is a merge of another repository, it allows us to use external code, track it and simplify its maintenance.

Configuration for subtrees:

```
git remote add bash_zsh_support     git@github.com:mpapis/bash_zsh_support.git
git remote add java_read_properties git@github.com:mpapis/java_read_properties.git
```

Updating subtrees:

```
git pull --no-commit --no-ff --strategy=subtree bash_zsh_support     master
git pull --no-commit --no-ff --strategy=subtree java_read_properties master
```

It will leave code uncommitted so we can update CHANGELOG.md.

### Adding new subtrees

Follow instructions in official git docs https://www.kernel.org/pub/software/scm/git/docs/howto/using-merge-subtree.html
With the exception of `<2>` needing extra flag `--allow-unrelated-histories`:

```
git merge -s ours --no-commit --allow-unrelated-histories ...
```

## Coding guidelines
https://github.com/rvm/rvm/blob/master/FORMATTING.md
src/rvm/lib/rvm/capistrano.rb000066400000000436147511530530012212 0ustar00# Recipes for using RVM on a server with capistrano.

raise "RVM - Capistrano integration was extracted to a separate gem, \
install: `gem install rvm-capistrano` and remove the `$LOAD_PATH.unshift` line, \
note also the 'set :rvm_type, :user' is now the default (instead of :system)."
src/rvm/lib/rvm.rb000066400000000426147511530530010046 0ustar00# == Ruby Version Manager - Ruby API

raise "RVM - Ruby integration was extracted to a separate gem, \
it should be installed by default with RVM, \
remove the `$LOAD_PATH.unshift` line and all should be fine again.
Visit https://rvm.io/integration/passenger for more details."
src/rvm/.gitignore000066400000000074147511530530010136 0ustar00/.idea
/config/ssh
/pkg
/tmp
.rvmrc
.DS_Store
*.tar.*
*.tgz
src/rvm/HACKING.md000066400000003633147511530530007540 0ustar00# How to hack on RVM

## Try test suite on your rvm installation

Make sure you can successfully run the tests (you will need rvm already installed).

To run the tests:

    $ cd rvm-test
    $ gem install tf    # Install testing framework
    $ tf fast/*         # Run the short tests (those are run on travis)
    $ tf long/*         # Run the long set of tests, like installing rubies.
    $ tf --text long/*  # Same as above, but watch output

## Set up test installation of rvm

You need a test rvm install to run the test suite against:

    $ git clone https://github.com/rvm/rvm  # or your own github fork
    $ cd rvm
    $ rvm switch ~/path/to/rvm/test/install          # choose a path here
    $ ./install

This will create a test installation of rvm in
`~/path/to/rvm/test/install`, and as long as `$rvm_path` points to it,
this will be used when running the tests.  This means you can safely
break the test installation without risking breaking your main rvm
installation.

If you want to do manual testing on the CLI against this test installation,
you also need to do:

    $ rvm reload

To get back to using original rvm installation run:

    $ rvm switch ~/.rvm

## Hacking RVM via TDD (Test-Driven Development)

First write a test for the behaviour you expect.  For details on how
to write new tests, see [`rvm-test`'s
README.md](https://github.com/rvm/rvm-test/blob/master/README.md).
Then run the test:

    $ NOEXEC_DISABLE=1 tf --text rvm-test/fast/foo_comment_test.sh

It should fail.  Now repeat the following steps until the test passes:

    1. hack the changes in your rvm src tree
    2. run `./install`
    3. re-run the test (you can also manually test via rvm commands on the CLI)

Now `git commit`, `git push` to your GitHub fork, then issue a pull
request, and if it is accepted then your place in hacker heaven is
secured.

## Getting help

If you get stuck, you should ask on `#rvm-test` or `#rvm` on Freenode.
src/rvm/.github/pull_request_template.md000066400000000212147511530530014441 0ustar00Fixes # .

Changes proposed in this pull request:
*
*
*

Make sure that your pull request includes entry in the [CHANGELOG](CHANGELOG.md).src/rvm/.github/mergeable.yml000066400000001765147511530530012164 0ustar00version: 2
mergeable:
  - when: pull_request.*
    validate:
    - do: description
      no_empty:
        enabled: true
        message: Description should not be empty. Provide details with **what** was changed, **why** it was changed, and **how** it was changed.
    - do: label
      and:
      - no_empty:
          enabled: true
      - must_exclude:
          regex: duplicate|feedback|invalid|wont|progress
    - do: milestone
      no_empty:
        enabled: true
    - do: dependent
      changed:
        file: '*'
        required: ['CHANGELOG.md']
    - do: dependent
      changed:
        file: 'binscripts/rvm-installer'
        required: ['binscripts/rvm-installer.asc']
    - do: dependent
      changed:
        file: 'config/known'
        required: ['config/known_strings', 'config/md5', 'config/sha512']
    - do: dependent
      changed:
        file: 'config/known_strings'
        required: ['config/md5', 'config/sha512']
    - do: dependent
      files: ['config/md5', 'config/sha512']
src/rvm/.github/issue_template.md000066400000002652147511530530013057 0ustar00<!--

IMPORTANT:

Before filing a new issue please verify your problem still exists with latest RVM. We constantly apply fixes but only release new stable versions once a month.

    rvm get master

If your problem still persists, please follow instructions described in https://github.com/rvm/rvm#reporting-issues.

-->

## Description

<!-- Briefly describe the nature of your problem. -->


## Steps to reproduce

<!-- List all of your specific environment settings, actions taken, and commands run — everything required to replicate the problem. -->

 1. ...
 2. ...
 3. ...

## Expected behavior

<!-- Briefly explain what you expected to see. -->

## Actual behavior

<!-- Please include a gist (https://gist.github.com) with the output of the command(s) you ran. -->

* [command](https://gist.github.com/...)
* [config.log](https://gist.github.com/...) - only for issues with `install`
* [make.log](https://gist.github.com/...) - only for issues with `install`

<!-- When the above output does not seem to include a meaningful error message, you might want to additionally attach the output of the same command(s) run with the `--debug` switch. -->

**Debug mode**:
* [command](https://gist.github.com/...)
* [config.log](https://gist.github.com/...) - only for issues with `install`
* [make.log](https://gist.github.com/...) - only for issues with `install`

## Environment info

<!-- Paste below the output of the `rvm info` command. -->
src/rvm/scripts/install000077500000000606147511530530011232 0ustar00#!/usr/bin/env bash

# make tracing easy
export PS4="+ \${BASH_SOURCE##\${rvm_path:-}} : \${FUNCNAME[0]:+\${FUNCNAME[0]}()}  \${LINENO} > "

# Tracing, if asked for - as early as possible
if
  [[ "$*" == *--trace* ]] || (( ${rvm_trace_flag:-0} > 0 ))
then
  set -x
  export rvm_trace_flag=1
fi

set -o errtrace

shopt -s extglob

source "$PWD/scripts/functions/installer"

install_rvm "$@"
src/rvm/help/gemset.md000066400000001511147511530530010701 0ustar00
Usage:

    rvm gemset [action]
    rvm --force gemset [action]

Actions:

    copy, create, delete (alias: remove), dir, empty, export, gemdir, globalcache, import, install, list, list_all, name, pristine, rename (alias: move), unpack, update, use

Description:

  Commands for working with and manipulating gemsets within RVM.

  Any command is run in context of current ruby/gemset; call 'rvm current' to find out which is currently used.

  Note that 'system' supports only exporting/importing gems.

Rejection:

  If you do not want to use gemsets and want to ignore them you can use
  command line flag `--ignore-gemsets`:

    rvm use 1.9.3@my_project --ignore-gemsets

  it will ignore @my_project and @global -  only default gemset will be set.

  It can be persisted with:

    echo "export rvm_ignore_gemsets_flag=1" >> ~/.rvmrc
src/rvm/help/wrapper.md000066400000001224147511530530011076 0ustar00# Wrapper

Show/regenerate wrappers.

NOTE: This command delegates to 'gem wrapper' => <https://github.com/rvm/gem-wrappers>

## Usage

Show paths and generated wrappers:

    rvm wrapper show


Show path to generated wrapper:

    rvm wrapper show executable_name

Where `executable_name` is something like `ruby` or `rake`.


It is also possible to generate a wrapper for external scripts that require ruby:

    rvm wrapper /full/path/to/script

Where `/full/path/to/script` is full path to existing script


Wrappers are generated automatically, but it is possible to rerun the process:

    rvm wrapper regenerate


Documentation:

    rvm wrapper [help]
src/rvm/help/use.md000066400000003465147511530530010223 0ustar00    $ rvm use [ruby-string]

Setup current shell to use a specific ruby version.


For a list of currently installed ruby string please run

    $ rvm list

To create a gemset if it does not already exist:

    $ rvm --create 1.9.2@funky

For creating a project .rvmrc file - From within the app's root_dir:

    $ rvm --rvmrc 1.9.2@funky

Above commands can be also combined to do it all in one pass:

    $ rvm --rvmrc --create use 1.9.2@funky
  Using /home/user/.rvm/gems/ruby-1.9.2-p290 with gemset funky

Do not forget to check the generated .rvmrc file - it contains many useful
comments.  Note you must still 'rvm rvmrc trust' the newly created .rvmrc

If you attempt to use a ruby that is not installed and install-on-use is
not enabled, rvm will tell you the command necessary to install the
requested ruby.

    $ rvm use 1.9.3
  ruby-1.9.3 is not installed.
  To install do: 'rvm install ruby-1.9.3'

Also, an environment variable "rvm_recommended_ruby" will contain the
command. Using tab completion will expedite executing it.

    $ $rvm_recommended_ruby

To set a ruby as the user default, use the --default option.

    $ rvm use 1.9.3 --default

To specify MRI patch level version use -l or --level option. 

Please see documentation for further information:

  https://rvm.io/rvm/basics

Also, you can combine the new flags --ruby-version and --version-conf

    $ rvm --create --ruby-version use 1.9.2@funky
  Using /home/user/.rvm/gems/ruby-1.9.2-p290 with gemset funky

    $ rvm --create --versions-conf use 1.9.2@funky
  Using /home/user/.rvm/gems/ruby-1.9.2-p290 with gemset funky

These files do not need to be trusted, however, if a .rvmrc file
exists, it will override the use of .ruby-version or .versions.conf!

Please see the documentation for further information:
  https://rvm.io/workflow/projects#ruby-versions

src/rvm/help/gemdir.md000066400000000000147511530530010654 0ustar00src/rvm/help/remove.md000066400000000575147511530530010723 0ustar00
    $ rvm remove [all|old [date]|ruby-string[,ruby-string[,...]]]

Remove one or more rubies and their sources.

Options:
- `--gems`    - also removes gems installed for the removed ruby version
- `--archive` - remove archives


For a list of currently installed rubies, please run

  rvm list

Please see documentation for further information:

  https://rvm.io/rubies/removing/
src/rvm/help/notes.md000066400000000266147511530530010553 0ustar00Display all release notes.

This is list of all notes that were displayed during RVM updates.

It also displays warnings for problems RVM can not or should not handle automatically.
src/rvm/help/get.md000066400000002021147511530530010171 0ustar00# rvm get

Update RVM

## Usage

  rvm get {stable|latest|latest-x.y|x.y.z|head|master|branch|help} [--auto-dotfiles] [--autolibs=X]

## Options

  stable     - install the latest RVM stable release

  latest     - install the latest RVM release

  latest-minor
             - install the latest minor RVM release for currently installed version

  latest-x.y - install the latest RVM release matching the x.y* pattern

  x.y.z      - install a specific RVM release

  head
  master     - install the latest RVM development version

  --auto-dotfiles
             - automatically update shell profile files.

  --autolibs=X
             - update autolibs mode to `X`, read more: `rvm autolibs`

  help       - Output this message.

## Branches

    branch <branch>
    branch /<branch>
    branch <repo>/
    branch <repo>/<branch>

## Defaults

    branch: master
    repo:   rvm

## Examples

    rvm get branch shoes   # will fetch branch shoes from rvm/rvm repo
    rvm get branch mpapis/ # will fetch branch master from mpapis/rvm repo
src/rvm/help/snapshot.md000066400000000540147511530530011255 0ustar00
    $ rvm snapshot {load,save} filename

Saves or creates a snapshot of the given rvm install. This includes:

* Settings
* Aliases
* Rubies
* Gemsets
* Packages
* Your Default

Ideally to easily maintain a consistent environment among machines
/ to back up your environment.

Please note that this is still considered experimental to a large degree.
src/rvm/help/upgrade.md000066400000001204147511530530011043 0ustar00Usage:

  rvm upgrade {source ruby} [destination ruby] [--force]

Description:

  Upgrades the specified (already installed) source ruby to the
  given destination ruby version. Will migrate gemsets, wrappers, aliases
  and environment files.

  The process will prompt you at each stage - if the versions look incorrect,
  please cancel and perform it manually.


Examples:

    $ rvm upgrade 1.9.2-p136 1.9.2-p180

    $ rvm upgrade ree-2011.01 ree-2011-02

append `--force` to answer yes to all questions.

Experimental detection:

    $ rvm upgrade 1.9.2
    Are you sure you wish to upgrade from ruby-1.9.2-p290 to ruby-1.9.2-p318? (Y/n):
src/rvm/help/srcdir.md000066400000000000147511530530010673 0ustar00src/rvm/help/disk-usage.md000066400000000706147511530530011456 0ustar00## Usage

    rvm disk-usage {all,total,archives,docs,repos,sources,logs,pkg,rubies,gemsets,wrappers,tmp,others}'

Shows the amount of disk space used by a specific set of data associated with rvm.
`all` returns each, individually, along with the total space used.

## Examples:

To find out how much space your rvm install is using, simply run:

    rvm disk-usage all

To find out how much space only your gemsets use, run:

    rvm disk-usage gemsets
src/rvm/help/debug.md000066400000000047147511530530010506 0ustar00Debug

  TODO

Documentation:

  TODO

src/rvm/help/list.md000066400000001607147511530530010376 0ustar00Show list of available rubies,

## Usage:

    rvm list [help,known,remote [|rbx|jruby|all],gemsets,default [string],rubies,strings,known_strings,ruby_svn_tags]

## Actions:

- `help`    - show this help
- `known`   - list known rubies, that can be installed
- `gemsets` - list all rubies with their gemsets
- `rubies`  - list installed rubies, it is the default action when none given
- `strings` - list installed rubies, machine passable form
- `known_strings`    - list known rubies, that can be installed, machine passable form
- `ruby_svn_tags`    - list ruby tags available at http://svn.ruby-lang.org/repos/ruby/tags/
- `default [string]` - show the default ruby, passable form with strings
- `remote [|rbx|jruby|all]` - list binary build rubies (also for all/rbx/jruby), they do not need compilation,
                              when parameter omitted then only rvm build binaries are listed.
src/rvm/help/patchset.md000066400000000147147511530530011234 0ustar00Description:

    Tools for manipulating patchsets.

Usage:

    rvm patchset {show,lookup} [patchset]
src/rvm/help/mount.md000066400000003541147511530530010564 0ustar00Usage:

    rvm automount
    rvm mount /path/to/ruby [-n {name}]
    rvm mount [-r] {https://url/to/ruby.tar.bz2} [name]


## Mounting local compiled rubies

RVM supports adding rubies compiled by user.

If compiled ruby is already on `PATH` then use:

    rvm automount

If ruby is not on `PATH` and was compiled in `/opt/ruby-1.9.3-p194`,
then both following commands will add it to RVM:

    rvm mount /opt/ruby-1.9.3-p194
    rvm mount /opt/ruby-1.9.3-p194/bin/ruby

RVM will ask user for the name for it, for automation you can use `-n` flag:

    rvm mount /opt/ruby-1.9.3-p194 -n ruby-1.9.3-p194

Which will create `ext-ruby-1.9.3-p194`, the `ext-` prefix is there to
distinguish externally compiled rubies.


## Unmounting locally compiled rubies

Remove the ruby as you would any other:

    rvm remove ext-ruby-1.9.3-p194


## Downloading compiled ruby (since RVM 1.16)

RVM also supports downloading compiled rubies.

You can specify the full url to the binaries:

    rvm mount -r https://rvm.io/binaries/ubuntu/12.04/x86_64/ruby-1.9.3-p194.tar.bz2

It is also possible to download from different url with a name to use:

    rvm mount -r https://some.server/my_ruby-1.9.3-p194.tar.bz2 ruby-1.9.3-p194

Note that the packaged ruby must be using exactly the name that was given as second parameter.

And finally it is possible to just give a name and RVM will build the path for your system:

    rvm mount -r 1.9.3

Assuming the binary is in proper remote path registered with rvm it will be automatically used during installation:

    rvm install 1.9.3

will use https://rvm.io/binaries/ubuntu/12.04/x86_64/ruby-1.9.3-p194.tar.bz2 assuming it is 64bit Ubuntu 12.04.


## List of available builds

RVM automatically detects current platform and displays rubies available for it:

    rvm list remote


## Preparing your own build of ruby

Read more in:

    rvm help prepare
src/rvm/help/cron.md000066400000001713147511530530010362 0ustar00
Usage:

1. Add/Remove ruby variables to cron:

    rvm cron {setup|remove}

2. Manage rvm on single command level

    rvm cron command <"schedule"> <command> <params...>


Example 1 set one ruby for all cron jobs:

    cd /project/dir  # go to project dir, or `rvm use ...`
    rvm cron setup   # initialize cron with ruby settings
    crontab -e       # add tasks to cron

After project ruby changes:

    rvm cron setup   # update cron with new ruby settings



Example 2 add single job using current dir for rvm:

    cd /project/dir  # go to project dir, or `rvm use ...`
    rvm cron command "@daily" rake calculate:stats

Refer to `man 5 crontab` for definitions of time/date, examples:

    "*/5 * * * *" - Every 5 minutes
    "@hourly"     - Once an hour
    "* */4 * * *" - Every 4 hours
    "0 6 * * *"   - Everyday at 6am
    "0 7 * * 5"   - Every Friday at 7am

NOTE! Do not forget to set notification email in `crontab -e`:

    MAILTO=someone@project.com
src/rvm/help/user.md000066400000000545147511530530010401 0ustar00RVM mixed mode can be enabled on multiuser installations.

To use rubies and gemsets from user home run:

    rvm user all

To use only gemsets from user home run:

    rvm user gemsets

It is also possible to add this settings as default for new user accounts:

    sudo rvm user [all|gemsets] --skel

To restore multiuser defaults run:

    rvm user none
src/rvm/help/osx-ssl-certs.md000066400000004531147511530530012150 0ustar00# OSX OpenSSL Certificates handling.

## Synopsis

    rvm osx-ssl-certs status [<ruby>|<certs-path>|<openssl-binary>|all]
    rvm [--silent] osx-ssl-certs update [<ruby>|<certs-path>|<openssl-binary>|all]
    rvm osx-ssl-certs cron [status|install|uninstall]

## Description

Apple OS X comes with old version of OpenSSL, to keep you secure RVM installs newer version.
RVM also allows specifying custom version of OpenSSL and binary rubies linked to custom locations.
Taken this all into account most likely your Ruby is using outdated certificates.
To solve this problem `rvm osx-ssl-certs` will find all locations for certificates.
You can check status, update certificates manually or schedule an automated update.

## Arguments
`rvm osx-ssl-certs`:

* `status`      => Show certificates status for current Ruby,
  * `<ruby>`    => Status of a specific Ruby certificates,
  * `<certs-path>`     => Status for a specific path certificates,
  * `<openssl-binary>` => Status for a specific openssl installation,
  * `all`       => Status of all installed Rubies certificate paths.
* `update`      => Update SSL certificates for current Ruby,
  * `<ruby>`    => Update a specific Ruby certificates,
  * `<certs-path>`     => Update certificates in a specific path,
  * `<openssl-binary>` => Update certificates for a specific openssl installation,
  * `all`       => Update all installed Rubies certificate paths.
* `cron`        => Manage cron job for daily updates,
  * `status`    => Show if the cron job is installed,
  * `install`   => Install the cron job,
  * `uninstall` => Uninstall the cron job.

## Examples

Show the status for all installed rubies:

    rvm osx-ssl-certs status all

Update OpenSSL certificates for current ruby:

    rvm osx-ssl-certs update

Update OpenSSL certificates for specific path:

    rvm osx-ssl-certs update /etc/openssl

Schedule daily update of certificates:

    rvm osx-ssl-certs cron install

## Troubleshooting

If the `status` argument returns that all is good and you still get errors, it's probably caused by bad certificate chain on the server.

To troubleshoot you can check the chain with:

```
openssl s_client -showcerts -connect google.com:443
```

Replace `google.com` with your server address

## Reporting bugs

Please report issues to https://github.com/rvm/rvm/issues

In case of security issues use rvm-internal@googlegroups.com
src/rvm/help/reset.md000066400000000000147511530530010527 0ustar00src/rvm/help/alias.md000066400000003137147511530530010514 0ustar00Alias

  RVM allows you to alias your rubies for your convenience and pleasure.

Usage
  rvm [options] alias source destination

  Source and Destination must be an RVM
  ruby string representing an RVM installed ruby.

  A gemset may be optionally included.

Creating Aliases

  First select an RVM ruby.

    $ rvm alias create php ree-1.8.7-p2010.01

Using Aliases

  Now that you have created an alias, you can use the alias in place of the longer rvm selector string.

    $ rvm use php
    $ ruby -v
    ruby 1.8.7 (2009-12-24 patchlevel 248) [i686-darwin10.3.0], MBARI 0x6770, Ruby Enterprise Edition 2010.01

If you use any aliases that are rather funny, please hop in #rvm and let us know :)

Deleting Aliases

  If you wish to delete an alias

    $ rvm alias delete dotnet
    Listing Aliases

You can also list all current aliases

    $ rvm alias list
    php => ree-1.8.7-p2010.01
    lisp => maglev-head
    python => rbx-head

Managing Generic Ruby Versions

  You can use aliases to set a specific ruby patchlevel for a generic ruby
  version. This is useful if you have upgraded RVM and can no longer switch
  to the requested ruby. For example, if your project specifies
  `ruby-1.9.3@my-project` you can do this:

    $ cd my-project/
    ruby-1.9.3-p448 is not installed.
    To install do: 'rvm install ruby-1.9.3-p448'
    $ rvm alias create ruby-1.9.3 ruby-1.9.3-p429
    Creating alias ruby-1.9.3 for ruby-1.9.3-p429.
    Recording alias ruby-1.9.3 for ruby-1.9.3-p429.
    $ cd .
    $ ruby -v
    ruby 1.9.3p429 (2013-05-15 revision 40747) [x86_64-linux]

Documentation:

  https://rvm.io/rubies/alias/

src/rvm/help/migrate.md000066400000000605147511530530011050 0ustar00
    $ rvm migrate from to

Efficiently moves the gems from one ruby to another.
Like 'rvm gemset copy' but removes the gems from the source
ruby afterwards and runs it against all gemsets for a given
ruby.

Examples:

To migrate all gemsets from rc2 of 1.9.2 to the first release, p0,
you would run:

    $ rvm migrate 1.9.2-rc2 1.9.2-p0

append `--force` to answer yes to all questions.
src/rvm/help/group.md000066400000000202147511530530010545 0ustar00Usage:

    rvm group help
    rvm group add <group_name> <user_name> [user_name...]
    rvm group create <group_name> [group_id]
src/rvm/help/index.txt000066400000011142147511530530010744 0ustar00Usage:
 
    rvm [--debug][--trace][--nice] <command> <options>

  for example:

    rvm list                # list installed interpreters 
    rvm list known          # list available interpreters
    rvm install <version>   # install ruby interpreter
    rvm use <version>       # switch to specified ruby interpreter
    rvm remove <version>    # remove ruby interpreter (alias: delete)
    rvm get <version>       # upgrade rvm: stable, master

Available commands:

  rvm has a number of common commands, listed below. Additional information about any command
  can be found by executing `rvm help <command>`. 

  ruby installation
      fetch                   # download binary or sources for selected ruby version
      install                 # install ruby interpreter
      list                    # show currently installed ruby interpreters
      list known              # list available interpreters
      mount                   # install ruby from external locations
      patchset                # tools related to managing ruby patchsets
      pkg                     # install a dependency package
      reinstall               # reinstall ruby and run gem pristine on all gems
      remove                  # remove ruby and downloaded sources (alias: delete)
      requirements            # installs dependencies for building ruby
      uninstall               # uninstall ruby, keeping it's sources
      upgrade                 # upgrade to another ruby version, migrating gems

  running different ruby versions
      current                 # print current ruby version and name of used gemsets
      do                      # runs a command against specified and/or all rubies
      gemdir                  # display path to current gem directory ($GEM_HOME)
      use <version>           # switch to given (and already installed) ruby version
      use default             # switch to default ruby, or system if none is set
      use system              # switch to system ruby
      wrapper                 # creates wrapper executables for a given ruby & gemset

  managing gemsets
      gemset                  # manage gemsets 
      migrate                 # migrate all gemsets from one ruby to another

  rvm configuration
      alias                   # define aliases for `rvm use`
      autolibs                # tweak settings for installing dependencies automatically 
      group                   # tools for managing groups in multiuser installations
      rvmrc                   # tools related to managing .rvmrc trust & loading gemsets

  rvm maintenance
      implode                 # removes the rvm installation completely
      cleanup                 # remove stale source files & data associated with rvm
      cron                    # manage setup for using ruby in cron
      docs                    # tools to make installing ri and rdoc docs easier
      get                     # upgrades RVM to latest head, stable or branched version
      osx-ssl-certs           # helps update OpenSSL certs installed by rvm on OS X
      reload                  # reload rvm source itself
      reset                   # remove all default and system settings
      snapshot                # backup/restore rvm installation

  troubleshooting
      config-get              # display values for RbConfig::CONFIG variables
      debug                   # additional information helping to discover issues
      export                  # set temporary env variable in the current shell
      fix-permissions         # repairs broken permissions
      repair                  # lets you repair parts of your environment, such as
                              # wrappers, env files and similar (general maintenance)
      rubygems                # switches version of rubygems for the current ruby
      tools                   # general information about the ruby env
      unexport                # undo changes made to the environment by `rvm export`
      user                    # tools for managing RVM mixed mode in multiuser installs

   information and documentation
      info                    # show the environment information for current ruby
      disk-usage              # display disk space occupied by rvm
      notes                   # display notes with operating system specifics
      version                 # display rvm version (equal to `rvm -v`)

   additional global options
      --debug                 # toggle debug mode on for very verbose output
      --trace                 # toggle trace mode on to see EVERYTHING rvm is doing
      --nice                  # process niceness (increase the value on slow computers, default 0)
src/rvm/help/cleanup.md000066400000001267147511530530011054 0ustar00## Usage:

    rvm cleanup {all,archives,checksums,repos,sources,logs,gemsets,links}

## Description:

Cleans up the directory tree for the specified item.
For gemsets removes only those without matching ruby.

Useful for reclaiming used disk space from rvm compiles.

## Examples:

To reclaim all of the space used by archives, repository clones,
source files (and associated temporary compile file) and logs, you'd
run:

    $ rvm cleanup all

If instead you only wanted to clean up source files, you'd run:

    $ rvm cleanup sources

Please note that sometimes having archives and sources around are desirable.
Namely, you need the sources to install something such as ruby-debug under 1.9.
src/rvm/help/reinstall.md000066400000000321147511530530011410 0ustar00
Usage

  rvm reinstall [ruby-string]

It is equivalent to:

  rvm remove  [ruby-string]
  rvm install [ruby-string]

Please see the documentation for further information:

  https://rvm.io/rubies/installing/
src/rvm/help/rvmrc.md000066400000002755147511530530010561 0ustar00    $ rvm rvmrc {trust,untrust,trusted,load,reset} [optional-path]
    $ rvm rvmrc create {ruby-version} [--rvmrc|--ruby-version|--versions-conf]
    $ rvm rvmrc warning [ignore|reset|list] [<optional-path>|all.rvmrcs|allGemfiles]
    $ rvm rvmrc to ruby-version

Tools for dealing with and loading the rvmrc trust for a given directory.
All actions take an optional path to a directory to check.

Examples:

To check the status of ~/My/project, you would run:

    $ rvm rvmrc trusted ~/My/project

Or, more conventionally,

    $ cd ~/My/project && rvm rvmrc trusted

To manually set it as trusted:

    $ rvm rvmrc trust ~/My/project

Or, to reset the trust and force a prompt:

    $ rvm rvmrc reset ~/My/project
    $ rvm rvmrc reset all

Finally, to load the rvmrc in a directory, you would run:

    $ rvm rvmrc load ~/My/project

Or,

    $ cd ~/My/project && rvm rvmrc load

Note that this replaces 'rvm load-rvmrc'. Note that load implicitly trusts the
rvmrc, even if it is set to untrusted.


Creating project rvmrc files can easily be done with the following command:

    $ rvm --rvmrc --create use 1.9.2@funky

Or for scripting,

    $ rvm rvmrc create 1.9.2@funky

Above command will create both the gemset 'funky', and a project rvmrc file in the current directory.

From RVM 1.11.0 new project files are available.  They do not require trusting:

-    $ rvm rvmrc create 1.9.2@funky --ruby-version
-    $ rvm rvmrc create 1.9.2@funky --versions-conf
- https://rvm.io/workflow/projects/#ruby-versions
src/rvm/help/fetch.md000066400000000456147511530530010515 0ustar00# Fetch

Performs an archive / src fetch of the current selected ruby.

## Usage

    $ rvm fetch [--verify-downloads {0,1,2}]

Where `--verify-downloads {0,1,2}` specifies verification level:

- `0` - only verified allowed - the default,
- `1` - allow missing checksum,
- `2` - allow failed checksum.
src/rvm/help/fix-permissions.md000066400000001327147511530530012561 0ustar00# Fix permissions

## Synopsis

    rvm fix-permissions
    rvm fix-permissions user
    rvm fix-permissions system
    rvm fix-permissions <user>
    rvm fix-permissions <user>:
    rvm fix-permissions <user>:<group>
    rvm fix-permissions :<group>

## Description

In some cases like using sudo or chef permissions of rvm could be broken.
When fixing permissions for group also makes everything group writable.

## Arguments
`rvm fix-permissions`:

* ``               => Fix permissions for `user` or `system` - pick automatically,
* `user`           => Fix permissions for current user,
* `system`         => Fix permissions for system installation of RVM,
* `<user>:<group>` => Fix permissions for given user and/or group
src/rvm/help/requirements.md000066400000000420147511530530012136 0ustar00Automated installation of software ruby depends on.

Usually there is no need to run requirements manually as it is part of ruby installation process.

## Usage

    rvm requirements ruby-2.1.0

See `rvm help autolibs` for details on how to control requirements behavior.
src/rvm/help/pkg.md000066400000000721147511530530010200 0ustar00From source installation of required libraries for rubies, it is automatically triggered by:

    rvm autolibs rvm_pkg

You should not have to use it manually but just in case:

Usage:

    rvm pkg {install,uninstall} {readline,iconv,curl,openssl,zlib,autoconf,ncurses,pkgconfig,gettext,glib,mono,llvm,libxml2,libxslt,libyaml,epel}
    rvm pkg remove # to start fresh

`ree_dependencies` installs `zlib`, `ncurses`, `readline`, `openssl` and `iconv` in this order.
src/rvm/help/rvmrc/to.md000066400000000101147511530530011162 0ustar00    $ rvm rvmrc to ruby-version

Migrate .rvmrc to .ruby-version
src/rvm/help/rvmrc/warning.md000066400000000232147511530530012212 0ustar00Manage warnings for .rvmrc / Gemfile

    rvm rvmrc warning [check|ignore|reset] [/path/to/file|all.rvmrcs|allGemfiles]
    rvm rvmrc warning [help|list]
src/rvm/help/repair.md000066400000001013147511530530010674 0ustar00
    $ rvm repair {symlinks,environments,archives,all}

Runs the repair process(es) against given parts of rvm.

Examples:

To regenerate all of the environment files inside your rvm/environments
directory, you would run:

    $ rvm repair environments

To check for stale symlinks caused by rvm in your rvm_bin_path, you would run:

    $ rvm repair symlinks

To verify all downloaded archives have the correct md5, you would run:

    $ rvm repair archives

Or, to do all of the above, you can run:

    $ rvm repair all
src/rvm/help/implode.md000066400000000000147511530530011036 0ustar00src/rvm/help/install.md000066400000014116147511530530011070 0ustar00## Usage

    rvm install {ruby-string} [--verify-downloads {0,1,2}] [--binary|--disable-binary|--movable]


For a partial list of valid ruby strings please run

    rvm list known

For MRI Rubies you may pass configuration parameters in one of two ways:

    rvm install 1.9.2 --with-iconv-dir=$HOME/.rvm --without-readline

and/or

    rvm install 1.9.2 -C --with-iconv-dir=$HOME/.rvm,--without-readline

To do dirty installation using the same sources use:

    rvm install --force 1.9.2

To do clean installation use:

    rvm reinstall 1.9.2

## Fetching ruby package

You can customize fetching ruby package (source or binary) process with following options:

- `--quiet-curl`         - make `curl` silent when fetching data
- `--force`              - remove old installation with sources and force install

## Architecture

By default RVM will install 64-bit rubies, but you specify alternative
using switches:

- `--32`                   - install 32-bit rubies
- `--64`                   - install 64-bit rubies (default)
- `--universal`            - install both (OSX only)
- `--arch` | `--archflags` - architectures to install

## Binary rubies

By default RVM will try to download binary ruby package instead of compiling.
If such package is not available normal compilation will be performed.
Using binary builds can significantly decrease ruby installation time.

There are two options controlling binary rubies installation:

- `--binary`         - force binary installation, do not try to compile ruby.
- `--disable-binary` - do not try binary ruby, always compile.

More details about managing binary rubies can be found in `rvm help mount`.

## Installing from source

If you installing ruby package by compiling it from source, you can pass
additional configuration options:

- `--reconfigure`      - force `./configure` on install even if `Makefile` already exists
- `--patch`            - with MRI Rubies you may specify additional patches to apply before install - multiple patches should be comma separated `--patch a.patch[%prefix],b.patch` - `prefix` is an optional argument, which will be bypassed to the `-p` argument of the `patch` command and should be separated from patch file name with the `%` symbol.

### Compilation options
- `--clang`                          - use clang for compilation (equivalent to `export CC=clang` + `export CXX=clang++`)
- `--disable-llvm` | `--disable-jit` - disable LLVM
- `--enable-llvm` | `--enable-jit`   - enable LLVM

- `--with-arch`                      - architecture flag for configure (e.g. i686, x86_64)
- `-C` | `--configure` | `--`        - custom configure options - multiple options can be specified, separated with comma
- `--with-*` | `--without-*`         - configure flags
- `--enable-*` | `--disable-*`       - configure flags
- `-E` | `--env`                     - environment flags for configure
- `-M`                               - custom make options

#### .rvmrc equivalents

- `--with-arch`                       `rvm_architectures`
- `-C`                                `rvm_configure_flags`
        ... or per-ruby:              `{jruby|ree|rbx|mruby|macruby|truffleruby}_configure_flags`
- `-E`                                `rvm_configure_env`
- `-M`                                `rvm_make_flags`
- [none]                              `rvm_curl_flags`; default: --max-redirs 10 --max-time 1800

Note: these are not the only options passed to `configure` & `make`. rvm will add multiple options to each. See `RVMPATH/scripts/functions/{build_config,ruby,rubinius,requrements,pkg,...}` for details.

A variable with multiple flags should be set using parentheses and space separators. E.g. .rvmrc for `brew`-based `readline`, `llvm`, and `openssl` libraries:
```
 # warning: don't use \ linebreaks or it will break.
rvm_configure_env=( LDFLAGS="-L$(brew --prefix readline)/lib -L$(brew --prefix llvm)/lib -L$(brew --prefix openssl)/lib" CPPFLAGS="-I$(brew --prefix readline)/include -I$(brew --prefix llvm)/include -I$(brew --prefix openssl)/include" CXX=$(brew --prefix llvm)/bin/clang++ CC=$(brew --prefix llvm)/bin/clang )
rvm_archflags="-arch x86_64"
```

### Package-specific options

rbx & jruby:
- `--1.8` | `--1.9` | `--2.0` | `--2.1` - use branch compatible with given MRI ruby version
- `--18` | `--19` | `--20` | `--21`     - same

ree:
- `--ree-options`   - options passed directly to ree's `./installer` on the command line

### Compilation threads

RVM by default will try to detect amount of CPU cores and use `-j <max>`,
specify your own `-j n` flag to RVM to override the default:

    rvm install 2.0.0 -j 50 # OR:
    rvm install 1.8.6 -j 1

### Movable rubies

It is possible to build a ruby that can be moved to other locations, renamed
or even moved to other machine - as long as the system matches.

This option works only for ruby **1.9.3**, ruby **1.9.2** supports this only
on systems without `/usr/lib64`.

More details about managing binary builds can be found in `rvm help mount`.

## Documentation

- `--docs`              - generate ri after installation (default)
- `--rdoc` | `--yard`   - type of docs to generate (default: rdoc)
- `--no-docs`           - disable ri after installation

## Additional settings

- `--skip-gemsets`                     - skip the installation of default gemsets
- `--bin`                              - path for binaries to be placed (default: `~/.rvm/bin/.`)
- `-l` | `--level`                     - MRI ruby patch level
- `--url` | `--repository` | `--repo`  - git URL of repository to install from
- `--branch`                           - branch to install from
- `--tag`                              - tag to install from
- `--sha`                              - SHA of commit to install from
- `--trace`                            - add time, path, etc details to log
- `--proxy`                            - proxy options to pass to curl for downloading packages

## Verification

`--verify-downloads {0,1,2}` specifies verification level:

- `0` - only verified allowed,
- `1` - allow missing checksum,
- `2` - allow failed checksum.

Please see the documentation for further information:

- https://rvm.io/rubies/installing/
- https://rvm.io/rubies/named/
src/rvm/help/info.md000066400000004150147511530530010352 0ustar00
    $ rvm info [ruby_string[,ruby_string[,...] [section,[section[,...]

where sections are one of:

  system rvm ruby homes binaries environment debug

Both ruby strings and sections are optional arguments.

By default, with no parameters, rvm info will output all sections except debug.

To display system rvm debug information:

    $ rvm debug

which will display all sections including debug for the current or specified interpreters.

Example:

    $ rvm info 1.9.2-head,1.8.7 homes,binaries,environment

  ruby-1.9.2-head:

    homes:
      gem:          "/Users/wayne/.rvm/gems/ruby-1.9.2-head"
      ruby:         "/Users/wayne/.rvm/rubies/ruby-1.9.2-head"

    binaries:
      ruby:         "/Users/wayne/.rvm/rubies/ruby-1.9.2-head/bin/ruby"
      irb:          "/Users/wayne/.rvm/rubies/ruby-1.9.2-head/bin/irb"
      gem:          "/Users/wayne/.rvm/rubies/ruby-1.9.2-head/bin/gem"
      rake:         "/Users/wayne/.rvm/gems/ruby-1.9.2-head/bin/rake"

    environment:
      GEM_HOME:     "/Users/wayne/.rvm/gems/ruby-1.9.2-head"
      GEM_PATH:     "/Users/wayne/.rvm/gems/ruby-1.9.2-head:/Users/wayne/.rvm/gems/ruby-1.9.2-head@global"
      MY_RUBY_HOME: "/Users/wayne/.rvm/rubies/ruby-1.9.2-head"
      IRBRC:        "/Users/wayne/.rvm/rubies/ruby-1.9.2-head/.irbrc"
      RUBYOPT:      ""
      gemset:       ""

  ruby-1.8.7-p249:

    homes:
      gem:          "/Users/wayne/.rvm/gems/ruby-1.8.7-p249"
      ruby:         "/Users/wayne/.rvm/rubies/ruby-1.8.7-p249"

    binaries:
      ruby:         "/Users/wayne/.rvm/rubies/ruby-1.8.7-p249/bin/ruby"
      irb:          "/Users/wayne/.rvm/rubies/ruby-1.8.7-p249/bin/irb"
      gem:          "/Users/wayne/.rvm/rubies/ruby-1.8.7-p249/bin/gem"
      rake:         "/Users/wayne/.rvm/gems/ruby-1.8.7-p249/bin/rake"

    environment:
      GEM_HOME:     "/Users/wayne/.rvm/gems/ruby-1.8.7-p249"
      GEM_PATH:     "/Users/wayne/.rvm/gems/ruby-1.8.7-p249:/Users/wayne/.rvm/gems/ruby-1.8.7-p249@global"
      MY_RUBY_HOME: "/Users/wayne/.rvm/rubies/ruby-1.8.7-p249"
      IRBRC:        "/Users/wayne/.rvm/rubies/ruby-1.8.7-p249/.irbrc"
      RUBYOPT:      ""
      gemset:       ""


src/rvm/help/tools.md000066400000002607147511530530010564 0ustar00    $ rvm tools {identifier,path-identifier,strings,mirror,rvm-env}

Provides generic tools related to rvm environments for gaining information
about your current environment.  Primarily used for scripting rvm.

Examples:

To get the expanded Ruby string for the current environment, you would run:

    $ rvm tools identifier

To get the identifier for a folder (taking into account .rvmrc files and the like),
run this instead:

    $ rvm tools path-identifier ~/path/to/directory

Lastly, you can expand example Ruby strings.  E.g., to get the current ree version,
run:

    $ rvm tools strings ree

In case of network/firewall problems, it is easy to define alternate download URLs:

    $ rvm tools mirror


It is possible to use a "shebang" (#!/usr/...) line to select the interpreter
(eg, Ruby 1.9.3) which processes a script file.  However, this will work only
on recent Linux kernels (2.6.27.9 and above).

First, you need to define the shebang wrapper:

    $ rvm tools rvm-env ruby bash zsh

This will define:

    /usr/bin/{ruby,bash,zsh}-rvm-env

Your scripts can then request the proper Ruby, using shebang:

    #!/usr/bin/ruby-rvm-env 1.9.3

The script will be run using Ruby 1.9.3 from rvm.

Alternatively, here is a hack to make a script switch itself:

    if !ENV['ruby_switch_flag']
      ENV['ruby_switch_flag'] = '42'
      system('rvm', '1.9.3', 'do', __FILE__, *ARGV)
      exit 0
    end

src/rvm/help/current.md000066400000000132147511530530011075 0ustar00
    $ rvm current

Print the current Ruby version and the name of any gemset being used.
src/rvm/help/config-get.md000066400000000220147511530530011433 0ustar00# Read ruby configuration

Usage:

    rvm config-get [<variable-name>|--all]

Displays single variable from `RbConfig::CONFIG` or all of them.
src/rvm/help/prepare.md000066400000002736147511530530011065 0ustar00Usage:

    rvm prepare ruby-version [--path]

## Preparing your own build of ruby

When using a custom system it is also possible to build your own binary ruby:

    rvm prepare 1.9.3

It will generate `ruby-1.9.3-p194.tar.bz2` in the current directory,
it can be either used directly as file, or hosted on a https server.

You can also tell RVM to upload to scp server:

    rvm prepare 1.9.3 -r rvm@ssh.rvm.io:~/shared/public/binaries

It will show commands to run to update server, and changes for rvm files.

Finally it is possible to generate the package with paths reflecting server,
especially useful for generating multiple packages for many systems:

    rvm prepare 1.9.3 --path


## Hosting binaries build server

You can also host your rubies on your server, this is useful when using patches,
custom compilation options or hardcoded installation path.

RVM requires just https server for your own hosting, the pattern for building url is:

    "${rvm_remote_server_url}/${rvm_system_server_path}/${rvm_ruby_string}.tar.bz2"

Where:

- `rvm_remote_server_url`  - can be defined in `$rvm_path/user/db`
- `rvm_system_server_path` - can be defined in `$rvm_path/user/db`, autodetected if not defined
- `rvm_ruby_string` - is the name specified by user

When corresponding path is not defined for url then it is autodetected.

Example `$rvm_path/user/db`:

    rvm_remote_server_url3=http://server/binaries
    rvm_remote_server_path3=my_distribution
    rvm_remote_server_verify_downloads3=1
src/rvm/help/rubygems.md000066400000002046147511530530011256 0ustar00    $ rvm rubygems [x.y.z|latest-x.y|latest|current|master|head]

Installs a specific rubygems version in the current ruby. If
'current' is specified, the most current rubygems known to RVM
will be installed.

This does not work on Opal, on MRuby and on JRuby older than 1.7.1.

MRI 1.9+ ships with a version of RubyGems. To revert to that version
after installing a custom version via 'rvm rubygems' run:

'rvm rubygems remove'

The version can be also specified as latest-1.8
which will use latest available like 1.8.18

Also you could use "head" or "master" to use development version.
RVM and Rubygems discourage the use of development version.

Finally you can override default version for all installations:

    echo "rubygems_version=latest-1.8" >> $rvm_path/user/db
    echo "ree_rubygems_version=latest-1.6" >> $rvm_path/user/db
    echo "ruby_1.9.2_p136_rubygems_version=1.3.7" >> $rvm_path/user/db

or during single ruby installation:

    rvm install ruby --rubygems latest-2.0

or skip rubygems installation:

    rvm install rbx --rubygems ignore
src/rvm/help/gemset/copy.md000066400000000253147511530530011655 0ustar00
## Usage

    rvm gemset copy ruby-from[@gemset] ruby-to[@gemset]


## Description

Copy the `ruby-from` `gemset`s gems (`default` if omitted) to the `ruby-to` `gemset`.
src/rvm/help/uninstall.md000066400000000542147511530530011431 0ustar00
    $ rvm uninstall [ruby-string[,ruby-string[,...]]]

Uninstall one or many ruby versions, but leave their sources.

Options:
- `--gems` - also removes gems installed for the removed ruby version

For a list of currently installed ruby string please run

  rvm list

Please see documentation for further information:

  https://rvm.io/rubies/removing/
src/rvm/help/do.md000066400000003707147511530530010030 0ustar00
## Usage

    $ rvm [all|all-gemsets|<ruby>,...|<path>] [--verbose|--summary|--yaml|--json] do <command> ...
    $ rvm in <path> do <some-command> ...

Executes arbitrary commands against given a set of rvm environments.
Without additional flags it will exec the command directly without printing
out extra rvm information.

## Selectors:

 - `all`         - execute command in the default gemset of all rubies
 - `all-gemsets` - execute command in the all gemset for all rubies
 - `<ruby>,...`  - list of rubies to use, allows short versions or gemsets
 - `<path>`      - use ruby from the given path/project

## Modifiers:

- `in`        - works with path and will additionally `cd` to the given directory
- `--verbose` - display one line details about ruby/gemset
- `--summary` - hide output and display summary of failures/success list only
- `--yaml`    - hide output and display yaml summary of failures/success list only
- `--json`    - hide output and display json summary of failures/success list only
- `--summary` - print out a summary of the commands run
- `-S`        - specify the script file to load and run


## Examples:

To execute `ruby -v` against all installed rubies and aliases, you would run:

    $ rvm all do ruby -v

If you want to execute it against a specific ruby (without extra logging / data
printed by rvm as is done with normal set operations), you can instead do:

    $ rvm ree do ruby -v

Since it is a set operation, normal ruby specifiers will work. As an example, to run
`gem list` against **1.9.2** and **1.8.7** and prefix with ruby name, you would run:

    $ rvm 1.9.2,1.8.7 --verbose do gem list

Or, to execute `gem env` against all gemsets:

    $ rvm all-gemsets do gem env

To execute `which ruby` in the current directory, loading a `.rvmrc`:

    $ rvm . do which ruby

To execute `rake test` in the project directory, loading a `.rvmrc`:

    $ rvm in /path/to/project do rake test

For more information, refer to the rvm set operations.
src/rvm/help/autolibs.md000066400000007037147511530530011250 0ustar00## Synopsis

`rvm autolibs <flag>` __or__ `rvm install --autolibs=<flag>` __or__ `rvm get [type] --autolibs=<flag>`

## Description

Autolibs is a feature built into RVM to allow you to automatically install dependencies on your system.  These dependencies are typically things like OpenSSL, YAML and others. You can also disable autolibs completely or do things in-between "take care of it all" and "do nothing at all".

## Difference between `--autolibs` and `autolibs`

Some people might get confused at the difference between `--autolibs` and `autolibs` and even the difference between `--autolibs` when installing rubies (`rvm install [ruby] --autolibs`) and `--autolibs` when installing `rvm` (`rvm get [type] --autolibs`) but worry not, it's simple to remember.

* `rvm get [type] --autolibs=<flag>` is like `rvm autolibs <flag>`.
* `rvm autolibs <flag>` is permanent.
* `rvm install [ruby] --autolibs=<flag>` overrides `rvm autolibs <flag>` temporarily.

## Modes

* `0`, `disable`, `disabled` - Do not do anything.
* `1`, `read`, `read-only` - Use available libs, ignore missing.
* `2`, `fail`, `read-fail` - Use libs, fail if some are missing.
* `3`, `packages`, `install-packages`, - Use libs, install missing libs.
* `4`, `enable`, `enabled` - Install missing package manager (only OSX, on Linux it's like 3).

## Other options

* `reset`  - Reset RVM back to default mode.
* `status` - Display detailed information about your mode.
* `show`   - Display your current mode.
* `help`   - Display basic mode descriptions.

## Modes explained

The default mode is `enabled`, below is explanation of the modes,
where most useful will be `read-fail` in case user has no `sudo` access.

## Letting RVM take care of it all (4)

RVM can take care of everything for user, this means it will detect existing package manager and install one if none is available.
Typically this would be the best option for new users who do not have their own package manager installed and do not know how to compile their own software.

Enabling 4:

    rvm autolibs enable

Most of the systems ships with a package manager so the `enable` mode is the same as `packages`.
Unfortunately on OSX there is not package manger provided so RVM has to detect one of existing user efforts,
The detection is in order: `homebrew`, `macports`, `smf`, `fink` if none of them is available then RVM will install `macports`.

You can also optionally enforce a package manager by using one of the following instead of `enable`:

`macports`, `homebrew`, `fink`, `smf` (SM Framework) or `rvm_pkg` (the old `rvm pkg`), like:

    rvm autolibs homebrew

Or with the installer including homebrew, ruby and rails:

    \curl -L https://get.rvm.io | bash -s stable --autolibs=homebrew --rails


## Letting RVM take care of packages (3)

RVM can also be set to only check for a package manager and install any packages you might need or that might need to be updated.  This is the recommended option for users who do not want to deal with the task of managing their own dependencies.  This option works for both Linux and OS X users.

Enabling 3:

    rvm autolibs packages

Using 3 only once:

    rvm install --autolibs=packages <ruby>

## Tell RVM to fail when something is missing (2)

    rvm autolibs read-fail


## Tell RVM to try to use existing dependencies, but do not fail if something is missing (1)

    rvm autolibs read-only

## Avoid any extra actions or configuration (0)

    rvm autolibs disable

## Examples

Install RVM with Ruby and Ruby on Rails with all required libraries:

    \curl -L https://get.rvm.io | bash -s stable --rails
src/rvm/help/docs.md000066400000001504147511530530010347 0ustar00
# rvm docs

Generates ri and / or rdoc documentation for the current ruby and gems.


## Usage

    rvm docs {generate,generate-ri,generate-rdoc,generate-gems,rdoc_data}


## Description

If you have the hanna gem installed, rdoc generation should automatically use it.
Alternatively, you can pass the --docs flag to automatically build docs during installation.

For supported rubies (1.8.7, 1.9.2, 1.9.3, JRuby, RBX)
it will skip generation and install the rdoc-data gem.


## Examples

Generates all ri, rdoc and gems documentation for the current ruby:

    rvm docs generate


Generates only ri documentation for the current ruby:

    rvm docs generate-ri


Generates only rdoc documentation for the current ruby:

    rvm docs generate-rdoc

Generates only gems documentation for the current gemset:

    rvm docs generate-gems
src/rvm/bin/rvm-shell000077500000004260147511530530010556 0ustar00#!/usr/bin/env bash

export HOME="${HOME%%+(\/)}" # Remove trailing slashes if they exist on HOME

if
  (( ${rvm_ignore_rvmrc:=0} == 0 ))
then
  for rvmrc in /etc/rvmrc "$HOME/.rvmrc"
  do
    if [[ -f "$rvmrc" ]]
    then
      if GREP_OPTIONS="" \grep '^\s*rvm .*$' "$rvmrc" >/dev/null 2>&1
      then
        printf "%b" "\nError: $rvmrc is for rvm settings only.\nrvm CLI may NOT be called from within $rvmrc. \nSkipping the loading of $rvmrc"
        return 1
      else
        source "$rvmrc"
      fi
    fi
  done
fi

# duplication marker jdgkjnfnkjdngjkfnd4fd
export rvm_path
if
  [[ -z "${rvm_path:-}" ]]
then
  if [[ -d "${0%/bin/rvm-shell}" ]]
  then rvm_path="$( \cd "${0%/bin/rvm-shell}">/dev/null; pwd )"
  elif (( UID == 0 )) && [[ -d "/usr/local/rvm" ]]
  then rvm_path="/usr/local/rvm"
  elif [[ -d "${HOME}/.rvm" ]]
  then rvm_path="${HOME}/.rvm"
  elif [[ -d "/usr/local/rvm" ]]
  then rvm_path="/usr/local/rvm"
  else echo "Can't find rvm install!" 1>&2 ; exit 1
  fi
fi
rvm_path="${rvm_path%%*(/)}" # remove trailing slashes

case $0 in
  (*-rvm-env) selected_shell=${0%-rvm-env} ;;
  (*)         selected_shell=bash          ;;
esac
selected_shell="$(basename "${selected_shell}")"

if
  [[ -n "$1" && ! -f "$1" && -n "$(echo "$1" | GREP_OPTIONS="" \grep -v '^-')" ]]
then
  rvm_shell_ruby_string="$1"
  shift
elif
  [[ "$1" == "--path" ]] && [[ -d "$2" || "$2" == "/"* ]]
then
  if
    [[ -d "$2" ]]
  then
    cd $2
  else
    rvm_shell_ruby_string="default"
  fi
  shift 2
fi

true ${rvm_scripts_path:="$rvm_path/scripts"}
export rvm_scripts_path
if
  [[ -n "$rvm_path" && -f "$rvm_scripts_path/rvm" ]]
then
  source "$rvm_scripts_path/rvm"
  typeset -f rvm >/dev/null 2>&1 || {
    echo "RVM not loaded, aborting." >&2
    exit 1
  }
  # Setup as expected.
  if
    [[ -n "$rvm_shell_ruby_string" ]]
  then
    unset GEM_HOME # disable GEM_HOME mismatch check when using ruby
    __rvm_conditionally_do_with_env __rvm_use "$rvm_shell_ruby_string" ||
    {
      __status=$?
      echo "Error: RVM was unable to use '$rvm_shell_ruby_string'" 1>&2
      exit ${__status}
    }
  else
    __rvm_conditionally_do_with_env __rvm_rvmrc_tools load . >/dev/null 2>&1
  fi
fi

exec ${selected_shell} "$@"
src/rvm/binscripts/rvm-installer000077500000057727147511530530013074 0ustar00#!/usr/bin/env bash

shopt -s extglob
set -o errtrace
set -o errexit
set -o pipefail

rvm_install_initialize()
{
  DEFAULT_SOURCES=(github.com/rvm/rvm bitbucket.org/mpapis/rvm)

  BASH_MIN_VERSION="3.2.25"
  if
    [[ -n "${BASH_VERSION:-}" &&
      "$(\printf "%b" "${BASH_VERSION:-}\n${BASH_MIN_VERSION}\n" | LC_ALL=C \sort -t"." -k1,1n -k2,2n -k3,3n | \head -n1)" != "${BASH_MIN_VERSION}"
    ]]
  then
    echo "BASH ${BASH_MIN_VERSION} required (you have $BASH_VERSION)"
    exit 1
  fi

  export HOME PS4
  export rvm_trace_flag rvm_debug_flag rvm_user_install_flag rvm_ignore_rvmrc rvm_prefix rvm_path

  PS4="+ \${BASH_SOURCE##\${rvm_path:-}} : \${FUNCNAME[0]:+\${FUNCNAME[0]}()}  \${LINENO} > "
}

log()  { printf "%b\n" "$*"; }
debug(){ [[ ${rvm_debug_flag:-0} -eq 0 ]] || printf "%b\n" "$*" >&2; }
warn() { log "WARN: $*" >&2 ; }
fail() { fail_with_code 1 "$*" ; }
fail_with_code() { code="$1" ; shift ; log "\nERROR: $*\n" >&2 ; exit "$code" ; }

rvm_install_commands_setup()
{
  \which which >/dev/null 2>&1 || fail "Could not find 'which' command, make sure it's available first before continuing installation."
  \which grep >/dev/null 2>&1 || fail "Could not find 'grep' command, make sure it's available first before continuing installation."
  if
    [[ -z "${rvm_tar_command:-}" ]] && builtin command -v gtar >/dev/null
  then
    rvm_tar_command=gtar
  elif
    ${rvm_tar_command:-tar} --help 2>&1 | GREP_OPTIONS="" \grep -- --strip-components >/dev/null
  then
    rvm_tar_command="${rvm_tar_command:-tar}"
  else
    case "$(uname)" in
      (OpenBSD)
        log "Trying to install GNU version of tar, might require sudo password"
        if (( UID ))
        then sudo pkg_add -z gtar-1
        else pkg_add -z gtar-1
        fi
        rvm_tar_command=gtar
        ;;
      (Darwin|FreeBSD|DragonFly) # it's not possible to autodetect on OSX, the help/man does not mention all flags
        rvm_tar_command=tar
        ;;
      (SunOS)
        case "$(uname -r)" in
          (5.10)
            log "Trying to install GNU version of tar, might require sudo password"
            if (( UID ))
            then
              if \which sudo >/dev/null 2>&1
              then sudo_10=sudo
              elif \which /opt/csw/bin/sudo >/dev/null 2>&1
              then sudo_10=/opt/csw/bin/sudo
              else fail "sudo is required but not found. You may install sudo from OpenCSW repository (https://www.opencsw.org/about)"
              fi
              pkginfo -q CSWpkgutil || $sudo_10 pkgadd -a $rvm_path/config/solaris/noask -d https://get.opencsw.org/now CSWpkgutil
              sudo /opt/csw/bin/pkgutil -iy CSWgtar -t https://mirror.opencsw.org/opencsw/unstable
            else
              pkginfo -q CSWpkgutil || pkgadd -a $rvm_path/config/solaris/noask -d https://get.opencsw.org/now CSWpkgutil
              /opt/csw/bin/pkgutil -iy CSWgtar -t https://mirror.opencsw.org/opencsw/unstable
            fi
            rvm_tar_command=/opt/csw/bin/gtar
            ;;
          (*)
            rvm_tar_command=tar
            ;;
        esac
    esac
    builtin command -v ${rvm_tar_command:-gtar} >/dev/null ||
    fail "Could not find GNU compatible version of 'tar' command, make sure it's available first before continuing installation."
  fi
  if
    [[ " ${rvm_tar_options:-} " != *" --no-same-owner "*  ]] &&
    $rvm_tar_command --help 2>&1 | GREP_OPTIONS="" \grep -- --no-same-owner >/dev/null
  then
    rvm_tar_options="${rvm_tar_options:-}${rvm_tar_options:+ }--no-same-owner"
  fi
}

usage()
{
  printf "%b" "

Usage

  rvm-installer [options] [action]

Options

  [[--]version] <version>

    The version or tag to install. Valid values are:

      latest         - The latest tagged version.
      latest-minor   - The latest minor version of the current major version.
      latest-<x>     - The latest minor version of version x.
      latest-<x>.<y> - The latest patch version of version x.y.
      <x>.<y>.<z>    - Major version x, minor version y and patch z.

  [--]branch <branch>

    The name of the branch from which RVM is installed. This option can be used
    with the following formats for <branch>:

      <account>/

        If account is rvm or mpapis, installs from one of the following:

          https://github.com/rvm/rvm/archive/master.tar.gz
          https://bitbucket.org/mpapis/rvm/get/master.tar.gz

       Otherwise, installs from:

         https://github.com/<account>/rvm/archive/master.tar.gz

      <account>/<branch>

        If account is rvm or mpapis, installs from one of the following:

          https://github.com/rvm/rvm/archive/<branch>.tar.gz
          https://bitbucket.org/mpapis/rvm/get/<branch>.tar.gz

        Otherwise, installs from:

          https://github.com/<account>/rvm/archive/<branch>.tar.gz

      [/]<branch>

        Installs the branch from one of the following:

          https://github.com/rvm/rvm/archive/<branch>.tar.gz
          https://bitbucket.org/mpapis/rvm/get/<branch>.tar.gz

      [--]source <source>

        Defines the repository from which RVM is retrieved and installed in the format:

          <domain>/<account>/<repo>

        Where:

          <domain>  - Is bitbucket.org, github.com or a github enterprise site serving
                      an RVM repository.
          <account> - Is the user account in which the RVM repository resides.
          <repo>    - Is the name of the RVM repository.

        Note that when using the [--]source option, one should only use the [/]branch format
        with the [--]branch option. Failure to do so will result in undefined behavior.

      --trace

        Provides debug logging for the installation script.
Actions

  master - Installs RVM from the master branch at rvm/rvm on github or mpapis/rvm
           on bitbucket.org.
  stable - Installs RVM from the stable branch a rvm/rvm on github or mpapis/rvm
           on bitbucket.org.
  help   - Displays this output.

"
}

## duplication marker 32fosjfjsznkjneuera48jae
__rvm_curl_output_control()
{
  if
    (( ${rvm_quiet_curl_flag:-0} == 1 ))
  then
    __flags+=( "--silent" "--show-error" )
  elif
    [[ " $*" == *" -s"* || " $*" == *" --silent"* ]]
  then
    # make sure --show-error is used with --silent
    [[ " $*" == *" -S"* || " $*" == *" -sS"* || " $*" == *" --show-error"* ]] ||
    {
      __flags+=( "--show-error" )
    }
  fi
}

## duplication marker 32fosjfjsznkjneuera48jae
# -S is automatically added to -s
__rvm_curl()
(
  __rvm_which curl >/dev/null ||
  {
    rvm_error "RVM requires 'curl'. Install 'curl' first and try again."
    return 200
  }

  typeset -a __flags
  __flags=( --fail --location --max-redirs 10 )

  [[ "$*" == *"--max-time"* ]] ||
  [[ "$*" == *"--connect-timeout"* ]] ||
    __flags+=( --connect-timeout 30 --retry-delay 2 --retry 3 )

  if [[ -n "${rvm_proxy:-}" ]]
  then __flags+=( --proxy "${rvm_proxy:-}" )
  fi

  __rvm_curl_output_control

  unset curl
  __rvm_debug_command \curl "${__flags[@]}" "$@" || return $?
)

rvm_error()  { printf "ERROR: %b\n" "$*"; }
__rvm_which(){   which "$@" || return $?; true; }
__rvm_debug_command()
{
  debug "Running($#): $*"
  "$@" || return $?
  true
}
rvm_is_a_shell_function()
{
  [[ -t 0 && -t 1 ]] || return $?
  return ${rvm_is_not_a_shell_function:-0}
}

# Searches the tags for the highest available version matching a given pattern.
# fetch_version (github.com/rvm/rvm bitbucket.org/mpapis/rvm) 1.10. -> 1.10.3
# fetch_version (github.com/rvm/rvm bitbucket.org/mpapis/rvm) 1.10. -> 1.10.3
# fetch_version (github.com/rvm/rvm bitbucket.org/mpapis/rvm) 1.    -> 1.11.0
# fetch_version (github.com/rvm/rvm bitbucket.org/mpapis/rvm) ""    -> 2.0.1
fetch_version()
{
  typeset _account _domain _pattern _repo _sources _values _version
  _sources=(${!1})
  _pattern=$2
  for _source in "${_sources[@]}"
  do
    IFS='/' read -r _domain _account _repo <<< "${_source}"
    _version="$(
      fetch_versions ${_domain} ${_account} ${_repo} |
      GREP_OPTIONS="" \grep "^${_pattern:-}" | tail -n 1
    )"
    if
      [[ -n ${_version} ]]
    then
      echo "${_version}"
      return 0
    fi
  done
  fail_with_code 4 "Exhausted all sources trying to fetch version '$version' of RVM!"
}

# Returns a sorted list of most recent tags from a repository
fetch_versions()
{
  typeset _account _domain _repo _url
  _domain=$1
  _account=$2
  _repo=$3
  case ${_domain} in
    (bitbucket.org)
      _url="https://api.${_domain}/2.0/repositories/${_account}/${_repo}/refs/tags?sort=-name&pagelen=20"
      ;;
    (github.com)
      _url=https://api.${_domain}/repos/${_account}/${_repo}/tags
      ;;

    (*)
      _url=https://${_domain}/api/v3/repos/${_account}/${_repo}/tags
      ;;
  esac

  { __rvm_curl -sS "${_url}" || warn "...the preceeding error with code $? occurred while fetching $_url" ; } |
    \awk -v RS=',|values":' -v FS='"' '$2=="name"&&$4!="rvm"{print $4}' |
    sort -t. -k 1,1n -k 2,2n -k 3,3n -k 4,4n -k 5,5n
}

install_release()
{
  typeset _source _sources _url _version _verify_pgp
  _sources=(${!1})
  _version=$2
  debug "Downloading RVM version ${_version}"
  for _source in "${_sources[@]}"
  do
    case ${_source} in
      (bitbucket.org*)
        _url="https://${_source}/get/${_version}.tar.gz"
        _verify_pgp="https://${_source}/downloads/${_version}.tar.gz.asc"
        ;;
      (*)
        _url="https://${_source}/archive/${_version}.tar.gz"
        _verify_pgp="https://${_source}/releases/download/${_version}/${_version}.tar.gz.asc"
        ;;
    esac
    get_and_unpack "${_url}" "rvm-${_version}.tgz" "$_verify_pgp" && return
  done
  return $?
}

install_head()
{
  typeset _branch _source _sources _url
  _sources=(${!1})
  _branch=$2
  debug "Selected RVM branch ${_branch}"
  for _source in "${_sources[@]}"
  do
    case ${_source} in
      (bitbucket.org*)
        _url=https://${_source}/get/${_branch}.tar.gz
        ;;
      (*)
        _url=https://${_source}/archive/${_branch}.tar.gz
        ;;
    esac
    get_and_unpack "${_url}" "rvm-${_branch//\//_}.tgz" && return
  done
  return $?
}

# duplication marker dfkjdjngdfjngjcszncv
# Drop in cd which _doesn't_ respect cdpath
__rvm_cd()
{
  typeset old_cdpath ret
  ret=0
  old_cdpath="${CDPATH}"
  CDPATH="."
  chpwd_functions="" builtin cd "$@" || ret=$?
  CDPATH="${old_cdpath}"
  return $ret
}

get_package()
{
  typeset _url _file
  _url="$1"
  _file="$2"
  log "Downloading ${_url}"
  __rvm_curl -sS ${_url} > ${rvm_archives_path}/${_file} ||
  {
    _return=$?
    case $_return in
      # duplication marker lfdgzkngdkjvnfjknkjvcnbjkncvjxbn
      (60)
        log "
Could not download '${_url}', you can read more about it here:
https://rvm.io/support/fixing-broken-ssl-certificates/
To continue in insecure mode run 'echo insecure >> ~/.curlrc'.
"
        ;;
      # duplication marker lfdgzkngdkjvnfjknkjvcnbjkncvjxbn
      (77)
        log "
It looks like you have old certificates, you can read more about it here:
https://rvm.io/support/fixing-broken-ssl-certificates/
"
        ;;
      # duplication marker lfdgzkngdkjvnfjknkjvcnbjkncvjxbn
      (141)
        log "
Curl returned 141 - it is result of a segfault which means it's Curls fault.
Try again and if it crashes more than a couple of times you either need to
reinstall Curl or consult with your distribution manual and contact support.
"
        ;;
      (*)
        log "
Could not download '${_url}'.
  curl returned status '$_return'.
"
        ;;
    esac
    return $_return
  }
}

# duplication marker flnglfdjkngjndkfjhsbdjgfghdsgfklgg
rvm_install_gpg_setup()
{
  export rvm_gpg_command
  {
    rvm_gpg_command="$( \which gpg2 2>/dev/null )" &&
    [[ ${rvm_gpg_command} != "/cygdrive/"* ]]
  } || {
    rvm_gpg_command="$( \which gpg 2>/dev/null )" &&
    [[ ${rvm_gpg_command} != "/cygdrive/"* ]]
  } || rvm_gpg_command=""

  debug "Detected GPG program: '$rvm_gpg_command'"

  [[ -n "$rvm_gpg_command" ]] || return $?
}

# duplication marker rdjgndfnghdfnhgfdhbghdbfhgbfdhbn
verify_package_pgp()
{
  if
    "${rvm_gpg_command}" --verify "$2" "$1"
  then
    log "GPG verified '$1'"
  else
    typeset _return=$?

    log "\
GPG signature verification failed for '$1' - '$3'! Try to install GPG v2 and then fetch the public key:

    ${SUDO_USER:+sudo }${rvm_gpg_command##*/} --keyserver hkp://pool.sks-keyservers.net --recv-keys 409B6B1796C275462A1703113804BB82D39DC0E3 7D2BAF1CF37B13E2069D6956105BD0E739499BDB

or if it fails:

    command curl -sSL https://rvm.io/mpapis.asc | ${SUDO_USER:+sudo }${rvm_gpg_command##*/} --import -
    command curl -sSL https://rvm.io/pkuczynski.asc | ${SUDO_USER:+sudo }${rvm_gpg_command##*/} --import -

In case of further problems with validation please refer to https://rvm.io/rvm/security
"

    exit ${_return}
  fi
}

verify_pgp()
{
  [[ -n "${1:-}" ]] ||
  {
    debug "No PGP url given, skipping."
    return 0
  }

  get_package "$1" "$2.asc" ||
  {
    debug "PGP url given but does not exist: '$1'"
    return 0
  }

  rvm_install_gpg_setup ||
  {
    log "Found PGP signature at: '$1',
but no GPG software exists to validate it, skipping."
    return 0
  }

  verify_package_pgp "${rvm_archives_path}/$2" "${rvm_archives_path}/$2.asc" "$1"
}

get_and_unpack()
{
  typeset _url _file _patern _return _verify_pgp
  _url="$1"
  _file="$2"
  _verify_pgp="$3"

  get_package "$_url" "$_file" || return $?
  verify_pgp "$_verify_pgp" "$_file" || return $?

  [[ -d "${rvm_src_path}/rvm" ]] || \mkdir -p "${rvm_src_path}/rvm"
  __rvm_cd "${rvm_src_path}/rvm" ||
  {
    _return=$?
    log "Could not change directory '${rvm_src_path}/rvm'."
    return $_return
  }

  # Remove existing installation
  typeset _cleanup_cmd
  _cleanup_cmd="rm -rf ${rvm_src_path}/rvm/{,.[!.],..?}*"

  $_cleanup_cmd || {
    _return=$?
      log "Could not remove old RVM sources. Try:\n\n\tsudo $_cleanup_cmd\n\nThen retry your task again."
      return $_return
  }

  # Unpack sources
  __rvm_debug_command $rvm_tar_command xzf ${rvm_archives_path}/${_file} ${rvm_tar_options:-} --strip-components 1 ||
  {
    _return=$?
    log "Could not extract RVM sources."
    return $_return
  }
}

rvm_install_default_settings()
{
  # Tracing, if asked for.
  if
    [[ "$*" == *--trace* ]] || (( ${rvm_trace_flag:-0} > 0 ))
  then
    set -o xtrace
    rvm_trace_flag=1
  fi

  # Variable initialization, remove trailing slashes if they exist on HOME
  true \
    ${rvm_trace_flag:=0} ${rvm_debug_flag:=0}\
    ${rvm_ignore_rvmrc:=0} HOME="${HOME%%+(\/)}"

  if
    (( rvm_ignore_rvmrc == 0 ))
  then
    for rvmrc in /etc/rvmrc "$HOME/.rvmrc"
    do
      if
        [[ -s "$rvmrc" ]]
      then
        if
          GREP_OPTIONS="" \grep '^\s*rvm .*$' "$rvmrc" >/dev/null 2>&1
        then
          printf "%b" "
  Error: $rvmrc is for rvm settings only.
  rvm CLI may NOT be called from within $rvmrc.
  Skipping the loading of $rvmrc
  "
          exit 1
        else
          source "$rvmrc"
        fi
      fi
    done
  fi

  if
    [[ -z "${rvm_path:-}" ]]
  then
    if
      (( UID == 0 ))
    then
      rvm_user_install_flag=0
      rvm_prefix="/usr/local"
      rvm_path="${rvm_prefix}/rvm"
    else
      rvm_user_install_flag=1
      rvm_prefix="$HOME"
      rvm_path="${rvm_prefix}/.rvm"
    fi
  fi
  if [[ -z "${rvm_prefix}" ]]
  then rvm_prefix=$( dirname $rvm_path )
  fi

  # duplication marker kkdfkgnjfndgjkndfjkgnkfjdgn
  [[ -n "${rvm_user_install_flag:-}" ]] ||
  case "$rvm_path" in
    (/usr/local/rvm)         rvm_user_install_flag=0 ;;
    ($HOME/*|/${USER// /_}*) rvm_user_install_flag=1 ;;
    (*)                      rvm_user_install_flag=0 ;;
  esac
}

rvm_install_parse_params()
{
  install_rubies=()
  install_gems=()
  flags=( ./scripts/install )
  forwarded_flags=()
  while
    (( $# > 0 ))
  do
    token="$1"
    shift
    case "$token" in

      (--trace)
        set -o xtrace
        rvm_trace_flag=1
        flags=( -x "${flags[@]}" "$token" )
        forwarded_flags+=( "$token" )
        ;;

      (--debug|--quiet-curl)
        flags+=( "$token" )
        forwarded_flags+=( "$token" )
        token=${token#--}
        token=${token//-/_}
        export "rvm_${token}_flag"=1
        printf "%b" "Turning on ${token/_/ } mode.\n"
        ;;

      (--path)
        if [[ -n "${1:-}" ]]
        then
          rvm_path="$1"
          shift
        else
          fail "--path must be followed by a path."
        fi
        ;;

      (--branch|branch) # Install RVM from a given branch
        if [[ -n "${1:-}" ]]
        then
          case "$1" in
            (/*)
              branch=${1#/}
              ;;
            (*/)
              branch=master
              if [[ "${1%/}" -ne rvm ]] && [[ "${1%/}" -ne mpapis ]]
              then sources=(github.com/${1%/}/rvm)
              fi
              ;;
            (*/*)
              branch=${1#*/}
              if [[ "${1%%/*}" -ne rvm ]] && [[ "${1%%/*}" -ne mpapis ]]
              then sources=(github.com/${1%%/*}/rvm)
              fi
              ;;
            (*)
              branch="$1"
              ;;
          esac
          shift
        else
          fail "--branch must be followed by a branchname."
        fi
        ;;

      (--source|source)
        if [[ -n "${1:-}" ]]
        then
          if [[ "$1" = */*/* ]]
          then
            sources=($1)
            shift
          else
            fail "--source must be in the format <domain>/<account>/<repo>."
          fi
        else
          fail "--source must be followed by a source."
        fi
        ;;

      (--user-install|--ignore-dotfiles)
        token=${token#--}
        token=${token//-/_}
        export "rvm_${token}_flag"=1
        printf "%b" "Turning on ${token/_/ } mode.\n"
        ;;

      (--auto-dotfiles)
        flags+=( "$token" )
        export "rvm_auto_dotfiles_flag"=1
        printf "%b" "Turning on auto dotfiles mode.\n"
        ;;

      (--auto)
        export "rvm_auto_dotfiles_flag"=1
        printf "%b" "Warning, --auto is deprecated in favor of --auto-dotfiles.\n"
        ;;

      (--verify-downloads)
        if [[ -n "${1:-}" ]]
        then
          export rvm_verify_downloads_flag="$1"
          forwarded_flags+=( "$token" "$1" )
          shift
        else
          fail "--verify-downloads must be followed by level(0|1|2)."
        fi
        ;;

      (--autolibs=*)
        flags+=( "$token" )
        export rvm_autolibs_flag="${token#--autolibs=}"
        forwarded_flags+=( "$token" )
        ;;

      (--without-gems=*|--with-gems=*|--with-default-gems=*)
        flags+=( "$token" )
        value="${token#*=}"
        token="${token%%=*}"
        token="${token#--}"
        token="${token//-/_}"
        export "rvm_${token}"="${value}"
        printf "%b" "Installing RVM ${token/_/ }: ${value}.\n"
        ;;

      (--version|version)
        version="$1"
        shift
        ;;

      (head|master)
        version="head"
        branch="master"
        ;;

      (stable)
        version="latest"
        ;;

      (latest|latest-*|+([[:digit:]]).+([[:digit:]]).+([[:digit:]]))
        version="$token"
        ;;

      (--ruby)
        install_rubies+=( ruby )
        ;;

      (--ruby=*)
        token=${token#--ruby=}
        install_rubies+=( ${token//,/ } )
        ;;

      (--rails)
        install_gems+=( rails )
        ;;

      (--gems=*)
        token=${token#--gems=}
        install_gems+=( ${token//,/ } )
        ;;

      (--add-to-rvm-group)
        export rvm_add_users_to_rvm_group="$1"
        shift
        ;;

      (help)
        usage
        exit 0
        ;;

      (*)
        usage
        exit 1
        ;;

    esac
  done

  if (( ${#install_gems[@]} > 0 && ${#install_rubies[@]} == 0 ))
  then install_rubies=( ruby )
  fi

  true "${version:=head}"
  true "${branch:=master}"

  if [[ -z "${sources[@]}" ]]
  then sources=("${DEFAULT_SOURCES[@]}")
  fi

  rvm_src_path="$rvm_path/src"
  rvm_archives_path="$rvm_path/archives"
  rvm_releases_url="https://rvm.io/releases"
}

rvm_install_validate_rvm_path()
{
  case "$rvm_path" in
    (*[[:space:]]*)
      printf "%b" "
It looks you are one of the happy *space* users (in home dir name),
RVM is not yet fully ready for it, use this trick to fix it:

    sudo mkdir -p /${USER// /_}.rvm
    sudo chown -R \"$USER:\" /${USER// /_}.rvm
    echo \"export rvm_path=/${USER// /_}.rvm\" >> \"$HOME/.rvmrc\"

and start installing again.

"
      exit 2
    ;;
    (/usr/share/ruby-rvm)
      printf "%b" "
It looks you are one of the happy Ubuntu users,
RVM packaged by Ubuntu is old and broken,
follow this link for details how to fix:

  https://stackoverflow.com/a/9056395/497756

"
      [[ "${rvm_uses_broken_ubuntu_path:-no}" == "yes" ]] || exit 3
    ;;
  esac

  if [[ "$rvm_path" != "/"* ]]
  then fail "The rvm install path must be fully qualified. Tried $rvm_path"
  fi
}

rvm_install_validate_volume_mount_mode()
{
  \typeset path partition test_exec

  path=$rvm_path

  # Directory $rvm_path might not exists at this point so we need to traverse the tree upwards
  while [[ -n "$path" ]]
  do
      if [[ -d $path ]]
      then
        partition=`df -P $path | awk 'END{print $1}'`

        test_exec=$(mktemp $path/rvm-exec-test.XXXXXX)
        echo '#!/bin/sh' > "$test_exec"
        chmod +x "$test_exec"

        if ! "$test_exec"
        then
          rm -f "$test_exec"
          printf "%b" "
It looks that scripts located in ${path}, which would be RVM destination ${rvm_path},
are not executable. One of the reasons might be that partition ${partition} holding this location
is mounted in *noexec* mode, which prevents RVM from working correctly. Please verify your setup
and re-mount partition ${partition} without the noexec option."
          exit 2
        fi

        rm -f "$test_exec"
        break
      fi

      path=${path%/*}
  done
}

rvm_install_select_and_get_version()
{
  typeset dir _version_release _version

  for dir in "$rvm_src_path" "$rvm_archives_path"
  do
    [[ -d "$dir" ]] || mkdir -p "$dir"
  done

  _version_release="${version}"
  case "${version}" in
    (head)
      _version_release="${branch}"
      install_head sources[@] ${branch:-master}
      ;;

    (latest)
      _version=$(fetch_version sources[@])
      install_release sources[@] "$_version"
      ;;

    (latest-minor)
      version="$(<"$rvm_path/VERSION")"
      _version=$(fetch_version sources[@] ${version%.*})
      install_release sources[@] "$_version"
      ;;

    (latest-*)
      _version=$(fetch_version sources[@] ${version#latest-})
      install_release sources[@] "$_version"
      ;;

    (+([[:digit:]]).+([[:digit:]]).+([[:digit:]])) # x.y.z
      install_release sources[@] ${version}
      ;;

    (*)
      fail "Something went wrong, unrecognized version '$version'"
      ;;
  esac
  echo "${_version_release}" > "$rvm_path/RELEASE"
}

rvm_install_main()
{
  [[ -f ./scripts/install ]] ||
  {
    log "'./scripts/install' can not be found for installation, something went wrong, it usually means your 'tar' is broken, please report it here: https://github.com/rvm/rvm/issues"
    return 127
  }

  # required flag - path to install
  flags+=( --path "$rvm_path" )
  \command bash "${flags[@]}"
}

rvm_install_ruby_and_gems()
(
  if
    (( ${#install_rubies[@]} > 0 ))
  then
    source ${rvm_scripts_path:-${rvm_path}/scripts}/rvm
    source ${rvm_scripts_path:-${rvm_path}/scripts}/functions/version
    __rvm_print_headline

    for _ruby in ${install_rubies[@]}
    do command rvm "${forwarded_flags[@]}" install ${_ruby}
    done
    # set the first one as default, skip rest
    for _ruby in ${install_rubies[@]}
    do
      rvm "${forwarded_flags[@]}" alias create default ${_ruby}
      break
    done

    for _gem in ${install_gems[@]}
    do rvm "${forwarded_flags[@]}" all do gem install ${_gem}
    done

    printf "%b" "
  * To start using RVM you need to run \`source $rvm_path/scripts/rvm\`
    in all your open shell windows, in rare cases you need to reopen all shell windows.
"

    if
      [[ "${install_gems[*]}" == *"rails"* ]]
    then
      printf "%b" "
  * To start using rails you need to run \`rails new <project_dir>\`.
"
    fi
  fi
)

rvm_install()
{
  rvm_install_initialize
  rvm_install_commands_setup
  rvm_install_default_settings
  rvm_install_parse_params "$@"
  rvm_install_validate_rvm_path
  rvm_install_validate_volume_mount_mode
  rvm_install_select_and_get_version
  rvm_install_main
  rvm_install_ruby_and_gems
}

rvm_install "$@"
src/rvm/bin/rvm-smile000077500000001210147511530530010550 0ustar00#!/usr/bin/env bash

printf "%b" "
|                                                          ..::''''::..
|                                                .:::.   .;''        \`\`;.
|        ....                                    :::::  ::    ::  ::    ::
|      ,;' .;:                ::  ..:            \`:::' ::     ::  ::     ::
|      ::.      ..:,:;.,:;.    .   ::   .::::.    \`:'  :: .:' ::  :: \`:. ::
|       '''::,   ::  ::  ::  \`::   ::  ;:   .::    :   ::  :          :  ::
|     ,:';  ::;  ::  ::  ::   ::   ::  ::,::''.    .    :: \`:.      .:' ::
|     \`:,,,,;;' ,;; ,;;, ;;, ,;;, ,;;, \`:,,,,:'   :;:    \`;..\`\`::::''..;'

"
src/rvm/bin/rvmsudo000077500000005104147511530530010342 0ustar00#!/usr/bin/env bash

sudo_args=()

etc_sudoers_warning()
{
  printf "%b" "Warning: $1, falling back to call via \`/usr/bin/env\`, this breaks rules from \`/etc/sudoers\`. Run:

    export rvmsudo_secure_path=1

to avoid the warning, put it in shell initialization file to make it persistent.
" >&2
  case "${2:-}" in
    (cant_read)
      printf "%b" "
In case there is no \`secure_path\` in \`/etc/sudoers\`. Run:

    export rvmsudo_secure_path=0

to avoid the warning, put it in shell initialization file to make it persistent.
" >&2
      ;;
  esac
}

while
  (( $# ))
do
  case "$1" in
  (--trace)
    export PS4="+ \${BASH_SOURCE##\${rvm_path:-}} : \${FUNCNAME[0]:+\${FUNCNAME[0]}()}  \${LINENO} > "
    set -o xtrace
    ;;
  (--verbose)
    set -o verbose
    ;;
  (-*)
    sudo_args+=("$1")
    case "$1" in
    (-g|-u|-p|-r|-t|-U|-C)
      shift
      sudo_args+=("${1:-}")
      ;;
    esac
    ;;
  (*)
    break
    ;;
  esac
  (( $# == 0 )) || shift
done

if
  (( $# ))
then
  if
    [[ -n "${rvmsudo_secure_path}" ]]
  then
    if
      [[ "${rvmsudo_secure_path:-0}" == 1 ]]
    then
      sudo_args+=( "/usr/bin/env" )
    fi
  else
    if
      [[ -f "/etc/sudoers" ]]
    then
      if
        [[ ! -r "/etc/sudoers" ]]
      then
        sudo_args+=( "/usr/bin/env" )
        etc_sudoers_warning 'can not check `/etc/sudoers` for `secure_path`' cant_read
      elif
        \grep -E '^[[:space:]]*Defaults[[:space:]]+secure_path=' "/etc/sudoers" >/dev/null
      then
        sudo_args+=( "/usr/bin/env" )
        etc_sudoers_warning '`secure_path` found in `/etc/sudoers`' found_secure_path
      fi
    fi
  fi
  eval command sudo \"\${sudo_args[@]}\" $(
    /usr/bin/env |
      awk -F= 'BEGIN{v=0;}/^[a-zA-Z_][a-zA-Z0-9_]*=/{v=1;}v==1&&$2~/^['\''\$]/{v=2;} v==1&&$2~/^\(\) \{/{v=0;} v==1&&$2~/^\(/{v=3;}v==2&&/'\''$/&&!/'\'\''$/{v=1;}v==3&&/\)$/{v=1;}v{print;}v==1{v=0;}' |
      GREP_OPTIONS="" \grep -E '^rvm|^gemset|^http_|^PATH|^IRBRC|RUBY|GEM' |
      sed 's/=\(.*\)$/="\1"/'
  ) \"\$@\" ||
  {
    result=$?
    case $result in
      (126)
        printf "%b" "\nTarget user does not have access to the given command, try finding problem below:\n\n"
        p="$rvm_path"
        dirs=()
        while
          [[ "$p" != "" ]]
        do
          dirs+=( "$p" )
          p="${p%/*}"
        done
        \command \ls -ld "${dirs[@]}"
        printf "%b" "\nIf you could not find the issue check permissions of all involved users and directories.\n\n"
        ;;
    esac
    exit $result
  }
else
  printf "%b" "Usage:\n  $0 [--trace] [--verbose] [sudo-options] command [command-options]\n"
fi
src/rvm/bin/rvm000077500000002776147511530530007463 0ustar00#!/usr/bin/env bash

if (( ${rvm_ignore_rvmrc:=0} == 0 ))
then
  declare rvmrc

  rvm_rvmrc_files=("/etc/rvmrc" "$HOME/.rvmrc")
  if [[ -n "${rvm_prefix:-}" ]] && ! [[ "$HOME/.rvmrc" -ef "${rvm_prefix}/.rvmrc" ]]
     then rvm_rvmrc_files+=( "${rvm_prefix}/.rvmrc" )
  fi

  for rvmrc in "${rvm_rvmrc_files[@]}"
  do
    if [[ -f "$rvmrc" ]]
    then
      if GREP_OPTIONS="" \grep '^\s*rvm .*$' "$rvmrc" >/dev/null 2>&1
      then
        printf "%b" "
  Error:
    $rvmrc is for rvm settings only.
    rvm CLI may NOT be called from within $rvmrc.
    Skipping the loading of $rvmrc
"
        exit 1
      else
        source "$rvmrc"
      fi
    fi
  done
  unset rvm_rvmrc_files
  unset rvmrc
fi

# duplication marker jdgkjnfnkjdngjkfnd4fd
export rvm_path
if [[ -z "${rvm_path:-}" ]]
then
  if [[ -d "${0%/bin/rvm}" ]]
  then rvm_path="$( \cd "${0%/bin/rvm}">/dev/null; pwd )"
  elif (( UID == 0 )) && [[ -d "/usr/local/rvm" ]]
  then rvm_path="/usr/local/rvm"
  elif [[ -d "${HOME}/.rvm" ]]
  then rvm_path="${HOME}/.rvm"
  elif [[ -d "/usr/local/rvm" ]]
  then rvm_path="/usr/local/rvm"
  else echo "Can't find rvm install!" 1>&2 ; exit 1
  fi
fi

# allow disabling check temporary
: rvm_is_not_a_shell_function:${rvm_is_not_a_shell_function:=1}
export rvm_is_not_a_shell_function

# if to prevent fork-bomb
if source "${rvm_scripts_path:="$rvm_path/scripts"}/rvm"
then
  typeset -f rvm >/dev/null 2>&1 || {
    echo "RVM not loaded, aborting." >&2
    exit 1
  }
  rvm "$@"
else
  echo "Error sourcing RVM!"  1>&2
  exit 1
fi
src/rvm/bin/rvm-exec000077500000004013147511530530010367 0ustar00#!/usr/bin/env bash

export HOME="${HOME%%+(\/)}" # Remove trailing slashes if they exist on HOME

if (( ${rvm_ignore_rvmrc:=0} == 0 ))
then
  for rvmrc in /etc/rvmrc "$HOME/.rvmrc"
  do
    if [[ -f "$rvmrc" ]]
    then
      if GREP_OPTIONS="" \grep '^\s*rvm .*$' "$rvmrc" >/dev/null 2>&1
      then
        printf "%b" "\n  Error:
    $rvmrc is for rvm settings only.
    rvm CLI may NOT be called from within $rvmrc.
    Skipping the loading of $rvmrc
"
        exit 1
      else
        source "$rvmrc"
      fi
    fi
  done
fi

# duplication marker jdgkjnfnkjdngjkfnd4fd
export rvm_path
if [[ -z "${rvm_path:-}" ]]
then
  if [[ -d "${0%/bin/rvm-exec}" ]]
  then rvm_path="$( \cd "${0%/bin/rvm-exec}">/dev/null; pwd )"
  elif (( UID == 0 )) && [[ -d "/usr/local/rvm" ]]
  then rvm_path="/usr/local/rvm"
  elif [[ -d "${HOME}/.rvm" ]]
  then rvm_path="${HOME}/.rvm"
  elif [[ -d "/usr/local/rvm" ]]
  then rvm_path="/usr/local/rvm"
  else echo "Can't find rvm install!" 1>&2 ; exit 1
  fi
fi

true ${rvm_scripts_path:="$rvm_path/scripts"}

__rvm_shell_lookup_script() {
  local relative_scripts_dir
  relative_scripts_dir="$(dirname -- "$(dirname -- "$0")")/scripts"
  for directory in "$rvm_scripts_path" "$HOME/.rvm/scripts" "/usr/local/rvm/scripts" "$relative_scripts_dir"; do
    if [[ -d "$directory" && -s "$directory/rvm" ]]; then
      echo "$directory/rvm"
      return
    fi
  done
}

if [[ -n "$1" && ! -f "$1" && -n "$(echo "$1" | GREP_OPTIONS="" \grep -v '^-')" ]]; then
  rvm_shell_ruby_string="$1"
  shift
fi

rvm_shell_rvm_path="$(__rvm_shell_lookup_script)"
if
  [[ -n "$rvm_shell_rvm_path" ]]
then
  source "$rvm_shell_rvm_path"
  typeset -f rvm >/dev/null 2>&1 || {
    echo "RVM not loaded, aborting." >&2
    exit 1
  }
  # Setup as expected.
  if
    [[ -n "$rvm_shell_ruby_string" ]]
  then
      rvm "$rvm_shell_ruby_string"
      if
        [[ "$?" -gt 0 ]]
      then
        echo "Error: RVM was unable to use '$rvm_shell_ruby_string'" 1>&2
        exit 1
      fi
  else
    rvm rvmrc load >/dev/null 2>&1
  fi
fi

exec "$@"
src/rvm/bin/rvm-prompt000077500000010003147511530530010760 0ustar00#!/usr/bin/env bash

add()
{
  token=${1:-""}
  eval "${token}_flag=1"
  shift
  if
    [[ -n "$format" ]]
  then
    [[ ${previous_is_format_var:-0} == 1 ]] && eval "${token}_prefix_flag=1"
    format="${format}\$${token}"
  else
    format="\$${token}"
  fi
  previous_is_format_var=1
}

add_raw_token()
{
  previous_is_format_var=0
  token=${1:-""}
  format="${format:-""}${token}"
}

rvm_gemset_separator="${rvm_gemset_separator:-"@"}"
if
  [[ "${GEM_HOME:-}" == *rvm* && "$ruby_string" != "$rvm_path/bin/ruby" ]]
then
  unset format
  while
    (( $# ))
  do
    case "$1" in
      i|interpreter)   add "interpreter"  ;;
      v|version)       add "version"      ;;
      p|patchlevel)    add "patchlevel"   ;;
      r|revision)      add "revision"     ;;
      a|architecture)  add "architecture" ;;
      g|gemset)        add "gemset"       ;;
      u|unicode)       add "unicode"      ;;
      s|system)                           ;; #skip when in ruby
      -d|--no-default) no_default=1       ;;
      *)               add_raw_token "$1" ;;
    esac
    shift
  done

  if
    [[ -z "${format:-""}" && -z "$no_default" ]]
  then
    for default in interpreter version patchlevel gemset
    do
      add "$default"
    done
  fi
  gemset=""
  ruby_string="${GEM_HOME:-""}"
  ruby_string="${ruby_string##*/}"
  case "${GEM_HOME:-""}" in
    (*${rvm_gemset_separator:-"@"}*)
      if (( ${gemset_flag:-0} ))
      then gemset="${rvm_gemset_separator:-"@"}${ruby_string##*${rvm_gemset_separator:-"@"}}"
      fi
      ruby_string="${ruby_string%%${rvm_gemset_separator:-"@"}*}"
      ;;
  esac
  if
    [[ -n "$no_default" && -n "${format:-""}" ]]
  then
    # Do not display anything if no default flag was provided
    #   and we are using the default ruby
    # Only people who explicitly ask for this will have the
    #   slight performance penalty associated.
    [[ "$(rvm tools identifier)" != "$(rvm alias show default)"  ]] || exit 0
  fi
  strings=(${ruby_string//-/ })
  if
    (( ${interpreter_flag:-0} )) || [[ -n "$unicode_flag" ]]
  then
    interpreter=${strings[0]}
    (( ${interpreter_prefix_flag:-0} )) && interpreter="-${interpreter}"
  fi
  if
    (( ${version_flag:-0} )) || [[ -n "$unicode_flag" ]]
  then
    version=${strings[1]}
    (( ${version_prefix_flag:-0} )) && version="-${version}"
  fi
  if
    (( ${#strings[@]} > 2 ))
  then
    if
      (( ${patchlevel_flag:-0} ))
    then
      patchlevel=${strings[2]}
      (( ${patchlevel_prefix_flag:-0} )) && patchlevel="-${patchlevel}"
    fi
  fi
  if
    (( ${architecture_flag:-0} ))
  then
    architecture="$(echo "$(ruby -v)" | sed 's/^.*\[//' | sed 's/\].*$//')"
    (( ${architecture_prefix_flag:-0} )) && architecture="-${architecture}"
  fi
  if
    (( ${unicode_flag:-0} ))
  then
    case "$interpreter" in
      (jruby)    unicode="☯" ;;
      (rbx)      unicode="❖" ;;
      (ree)      unicode="✈" ;;
      (macruby)  unicode="⌘" ;;
      (maglev)   unicode="㎖" ;;
      (ironruby) unicode="♭" ;;
      (system)   unicode="★" ;;
      (topaz)    unicode="🐍" ;; # TODO: what is this? can we use something more fonts support?
      (truffleruby) unicode="🚀" ;;
      (opal)     unicode="⬢" ;;
      (ruby)
        case ${version:-""} in
          (1.8.6)  unicode="➇❻" ;;
          (1.8.7)  unicode="➇❼" ;;
          (1.8*)   unicode="➇"  ;;
          (1.9.1)  unicode="➈❶" ;;
          (1.9.2)  unicode="➈❷" ;;
          (1.9.3)  unicode="➈❸" ;;
          (2.0.0)  unicode="➋" ;;
          (2.1.*)  unicode="➋➀" ;;
          (2.2.*)  unicode="➋➁" ;;
          (2.3.*)  unicode="➋➂" ;;
          (2.4.*)  unicode="➋➃" ;;
          (*)      unicode="⦿"  ;;
        esac ;;
      (*) unicode="⦿" ;;
    esac
    if
      echo "$ruby_string" | GREP_OPTIONS="" \grep '-head' >/dev/null 2>&1
    then
      unicode="${unicode}⚡"
    fi
    (( ${unicode_prefix_flag:-0} )) && unicode="-${unicode}"
  fi
  eval "echo \"$format\""
else
  while
    (( $# ))
  do
    case "$1" in
      s|system) echo "system" ;;
    esac
    shift
  done
fi
src/rvm/bin/rvm-auto-ruby000077500000003407147511530530011400 0ustar00#!/usr/bin/env bash

export HOME="${HOME%%+(\/)}" # Remove trailing slashes if they exist on HOME

if (( ${rvm_ignore_rvmrc:=0} == 0 ))
then
  for rvmrc in /etc/rvmrc "$HOME/.rvmrc"
  do
    if [[ -f "$rvmrc" ]]
    then
      if GREP_OPTIONS="" \grep '^\s*rvm .*$' "$rvmrc" >/dev/null 2>&1
      then
        printf "%b" "\nError: $rvmrc is for rvm settings only.\nrvm CLI may NOT be called from within $rvmrc. \nSkipping the loading of $rvmrc"
        return 1
      else
        source "$rvmrc"
      fi
    fi
  done
fi

# duplication marker jdgkjnfnkjdngjkfnd4fd
export rvm_path
if [[ -z "${rvm_path:-}" ]]
then
  if [[ -d "${0%/bin/rvm-auto-ruby}" ]]
  then rvm_path="$( \cd "${0%/bin/rvm-auto-ruby}">/dev/null; pwd )"
  elif (( UID == 0 )) && [[ -d "/usr/local/rvm" ]]
  then rvm_path="/usr/local/rvm"
  elif [[ -d "${HOME}/.rvm" ]]
  then rvm_path="${HOME}/.rvm"
  elif [[ -d "/usr/local/rvm" ]]
  then rvm_path="/usr/local/rvm"
  else echo "Can't find rvm install!" 1>&2 ; exit 1
  fi
fi

true ${rvm_scripts_path:="$rvm_path/scripts"}
true ${rvm_environments_path:="$rvm_path/environments"}

if   [[ -n "$rvm_path" && -s "$rvm_scripts_path/rvm" ]]
then source "$rvm_scripts_path/rvm" > /dev/null 2>&1
elif [[ -s "$HOME/.rvm/scripts/rvm" ]]
then source "$HOME/.rvm/scripts/rvm" > /dev/null 2>&1
elif [[ -s "/usr/local/rvm/scripts/rvm" ]]
then source "/usr/local/rvm/scripts/rvm" > /dev/null 2>&1
else
  echo "Unable to detect rvm, please manually set the rvm_path env variable." >&2
  exit 1
fi
typeset -f rvm >/dev/null 2>&1 || {
  echo "RVM not loaded, aborting." >&2
  exit 1
}

case $0 in
  (*rvm-shebang-ruby)
    rvm_promptless=1 rvm rvmrc load "$(dirname "$(which "$1")")" > /dev/null 2>&1
    ;;
  (*)
    rvm_promptless=1 rvm rvmrc load > /dev/null 2>&1
    ;;
esac

exec ruby "$@"
src/rvm/patches/rbx/2.5.2/this_can_not_be_null.diff000066400000001437147511530530016042 0ustar00From 50aa7356e3c750fadb6665508e66d2f6923c7529 Mon Sep 17 00:00:00 2001
From: Yorick Peterse <yorickpeterse@gmail.com>
Date: Sat, 28 Mar 2015 14:17:27 +0100
Subject: [PATCH] "this" can not be null

Per clang 3.6 checking if "this" is null or not results in a compiler
error.
---
 vm/oop.hpp | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/vm/oop.hpp b/vm/oop.hpp
index 1c55b71..8298f04 100644
--- a/vm/oop.hpp
+++ b/vm/oop.hpp
@@ -610,7 +610,7 @@ Object* const cUndef = reinterpret_cast<Object*>(0x22L);
     }
 
     void validate() const {
-      assert(this && (!reference_p() || (type_id() > InvalidType && type_id() < LastObjectType)));
+      assert(!reference_p() || (type_id() > InvalidType && type_id() < LastObjectType));
     }
 
     friend class TypeInfo;
-- 
2.3.5

src/rvm/patches/rbx/2.5.2/clean_bundler_environment_before_running_homebrew.diff000066400000001366147511530530024066 0ustar00From bb2f37b12b4acfa29171ea234e8cee1be4e12dff Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Micha=C5=82=20Matyas?= <github@higher.lv>
Date: Sun, 26 Apr 2015 20:33:10 +0200
Subject: [PATCH] Clean bundler environment before running Homebrew during
 configuration

---
 configure | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/configure b/configure
index 3a35743..c487a3b 100755
--- a/configure
+++ b/configure
@@ -576,7 +576,7 @@ class Configure
         if macports?
           config = macports_llvm_config
         else
-          out = `brew list llvm | grep '/llvm-config$'`
+          out = Bundler.with_clean_env { `brew list llvm | grep '/llvm-config$'` }
           config = out.chomp if $?.success?
         end
       end
-- 
2.3.5

src/rvm/patches/jruby/rubygems_etc.patch000066400000001664147511530530014447 0ustar00--- jruby/lib/ruby/shared/rubygems/config_file.rb
+++ jrub-fix/lib/ruby/shared/rubygems/config_file.rb
@@ -25,6 +25,8 @@
 # +:sources+:: Sets Gem::sources
 # +:verbose+:: See #verbose
 
+require 'rbconfig'
+
 class Gem::ConfigFile
 
   DEFAULT_BACKTRACE = false
@@ -68,7 +70,7 @@
 
         path.strip
       rescue LoadError
-        "/etc"
+        RbConfig::CONFIG["sysconfdir"] || "/etc"
       end
     end
 
--- jruby/bin/jgem
+++ jruby-fix/bin/jgem
@@ -9,6 +9,15 @@
 # See LICENSE.txt for permissions.
 #++
 
+# The prelude in 1.9.1 injects rubygems.rb into $LOADED_FEATURES
+# which prevents the `require 'rubygems'` from actually loading
+# the site's version of rubygems. So we have to use it's API
+# to get it's prelude out of the way.
+#
+if RUBY_VERSION =~ /^1\.9\.1/ && defined?(Gem::QuickLoader)
+  Gem::QuickLoader.load_full_rubygems_library
+end
+
 require 'rubygems'
 require 'rubygems/gem_runner'
 require 'rubygems/exceptions'
src/rvm/patches/jruby/1.7.9/joni.patch000066400000000436147511530530013366 0ustar00--- a/core/pom.xml
+++ b/core/pom.xml
@@ -45,7 +45,7 @@
     <dependency>
       <groupId>org.jruby.joni</groupId>
       <artifactId>joni</artifactId>
-      <version>2.1.1-SNAPSHOT</version>
+      <version>2.1.1</version>
       <type>jar</type>
     </dependency>
     <dependency>
src/rvm/patches/goruby/support_joke.patch000066400000000327147511530530014652 0ustar00--- a/vm_opts.h
+++ b/vm_opts.h
@@ -46,6 +46,6 @@
 #define OPT_STACK_CACHING            0
 
 /* misc */
-#define SUPPORT_JOKE                 0
+#define SUPPORT_JOKE                 1
 
 #endif /* RUBY_VM_OPTS_H */
src/rvm/patches/ruby/ssl_no_ec2m.patch000066400000001476147511530530014011 0ustar00--- trunk/ext/openssl/ossl_pkey_ec.c  2013/07/05 22:16:09 41807
+++ trunk/ext/openssl/ossl_pkey_ec.c  2013/07/05 22:46:42 41808
@@ -762,8 +762,10 @@
                 method = EC_GFp_mont_method();
             } else if (id == s_GFp_nist) {
                 method = EC_GFp_nist_method();
+#if !defined(OPENSSL_NO_EC2M)
             } else if (id == s_GF2m_simple) {
                 method = EC_GF2m_simple_method();
+#endif
             }

             if (method) {
@@ -817,8 +819,10 @@

             if (id == s_GFp) {
                 new_curve = EC_GROUP_new_curve_GFp;
+#if !defined(OPENSSL_NO_EC2M)
             } else if (id == s_GF2m) {
                 new_curve = EC_GROUP_new_curve_GF2m;
+#endif
             } else {
                 ossl_raise(rb_eArgError, "unknown symbol, must be :GFp or :GF2m");
             }
src/rvm/patches/ruby/ruby_2_3_gcc7.patch000066400000005313147511530530014127 0ustar00diff --git a/include/ruby/ruby.h b/include/ruby/ruby.h
index 60cfb1174e..dccfdc763a 100644
--- a/include/ruby/ruby.h
+++ b/include/ruby/ruby.h
@@ -551,27 +551,23 @@ static inline int rb_type(VALUE obj);
 	((type) == RUBY_T_FLOAT) ? RB_FLOAT_TYPE_P(obj) : \
 	(!RB_SPECIAL_CONST_P(obj) && RB_BUILTIN_TYPE(obj) == (type)))
 
-/* RB_GC_GUARD_PTR() is an intermediate macro, and has no effect by
- * itself.  don't use it directly */
 #ifdef __GNUC__
-#define RB_GC_GUARD_PTR(ptr) \
-    __extension__ ({volatile VALUE *rb_gc_guarded_ptr = (ptr); rb_gc_guarded_ptr;})
-#else
-#ifdef _MSC_VER
+#define RB_GC_GUARD(v) \
+    (*__extension__ ({ \
+	volatile VALUE *rb_gc_guarded_ptr = &(v); \
+	__asm__("" : : "m"(rb_gc_guarded_ptr)); \
+	rb_gc_guarded_ptr; \
+    }))
+#elif defined _MSC_VER
 #pragma optimize("", off)
 static inline volatile VALUE *rb_gc_guarded_ptr(volatile VALUE *ptr) {return ptr;}
 #pragma optimize("", on)
+#define RB_GC_GUARD(v) (*rb_gc_guarded_ptr(&(v)))
 #else
 volatile VALUE *rb_gc_guarded_ptr_val(volatile VALUE *ptr, VALUE val);
 #define HAVE_RB_GC_GUARDED_PTR_VAL 1
 #define RB_GC_GUARD(v) (*rb_gc_guarded_ptr_val(&(v),(v)))
 #endif
-#define RB_GC_GUARD_PTR(ptr) rb_gc_guarded_ptr(ptr)
-#endif
-
-#ifndef RB_GC_GUARD
-#define RB_GC_GUARD(v) (*RB_GC_GUARD_PTR(&(v)))
-#endif
 
 #ifdef __GNUC__
 #define RB_UNUSED_VAR(x) x __attribute__ ((unused))
diff --git a/marshal.c b/marshal.c
index c56de4af8d..b7274bf3c4 100644
--- a/marshal.c
+++ b/marshal.c
@@ -1022,7 +1022,7 @@ VALUE
 rb_marshal_dump_limited(VALUE obj, VALUE port, int limit)
 {
     struct dump_arg *arg;
-    VALUE wrapper; /* used to avoid memory leak in case of exception */
+    volatile VALUE wrapper; /* used to avoid memory leak in case of exception */
 
     wrapper = TypedData_Make_Struct(rb_cData, struct dump_arg, &dump_arg_data, arg);
     arg->dest = 0;
@@ -1051,8 +1051,8 @@ rb_marshal_dump_limited(VALUE obj, VALUE port, int limit)
 	rb_io_write(arg->dest, arg->str);
 	rb_str_resize(arg->str, 0);
     }
-    clear_dump_arg(arg);
-    RB_GC_GUARD(wrapper);
+    free_dump_arg(arg);
+    rb_gc_force_recycle(wrapper);
 
     return port;
 }
@@ -2044,7 +2044,7 @@ rb_marshal_load_with_proc(VALUE port, VALUE proc)
 {
     int major, minor, infection = 0;
     VALUE v;
-    VALUE wrapper; /* used to avoid memory leak in case of exception */
+    volatile VALUE wrapper; /* used to avoid memory leak in case of exception */
     struct load_arg *arg;
 
     v = rb_check_string_type(port);
@@ -2090,8 +2090,8 @@ rb_marshal_load_with_proc(VALUE port, VALUE proc)
 
     if (!NIL_P(proc)) arg->proc = proc;
     v = r_object(arg);
-    clear_load_arg(arg);
-    RB_GC_GUARD(wrapper);
+    free_load_arg(arg);
+    rb_gc_force_recycle(wrapper);
 
     return v;
 }
src/rvm/patches/ruby/cc_env.patch000066400000000557147511530530013042 0ustar00--- a/tool/mkconfig.rb  2013-07-25
+++ b/tool/mkconfig.rb  2013-07-25
@@ -130,6 +130,8 @@
       val = "(TOPDIR || DESTDIR + #{val})"
     when /^ARCH_FLAG$/
       val = "arch_flag || #{val}" if universal
+    when /^CC$/
+      val = "ENV[\"CC\"] || #{val}"
     when /^UNIVERSAL_ARCHNAMES$/
       universal, val = val, 'universal' if universal
     when /^arch$/
src/rvm/patches/ruby/2.2.2/openssl3.patch000066400000003333147511530530014007 0ustar00diff --git a/ext/openssl/extconf.rb b/ext/openssl/extconf.rb
index 8c04cb5..132d803 100644
--- a/ext/openssl/extconf.rb
+++ b/ext/openssl/extconf.rb
@@ -104,6 +104,9 @@
 have_func("SSLv2_method")
 have_func("SSLv2_server_method")
 have_func("SSLv2_client_method")
+have_func("SSLv3_method")
+have_func("SSLv3_server_method")
+have_func("SSLv3_client_method")
 have_func("TLSv1_1_method")
 have_func("TLSv1_1_server_method")
 have_func("TLSv1_1_client_method")
diff --git a/ext/openssl/ossl_ssl.c b/ext/openssl/ossl_ssl.c
index f7cb7f0..47111f6 100644
--- a/ext/openssl/ossl_ssl.c
+++ b/ext/openssl/ossl_ssl.c
@@ -109,9 +109,12 @@ static const struct {
     OSSL_SSL_METHOD_ENTRY(SSLv2_server),
     OSSL_SSL_METHOD_ENTRY(SSLv2_client),
 #endif
+#if defined(HAVE_SSLV3_METHOD) && defined(HAVE_SSLV3_SERVER_METHOD) && \
+        defined(HAVE_SSLV3_CLIENT_METHOD)
     OSSL_SSL_METHOD_ENTRY(SSLv3),
     OSSL_SSL_METHOD_ENTRY(SSLv3_server),
     OSSL_SSL_METHOD_ENTRY(SSLv3_client),
+#endif
     OSSL_SSL_METHOD_ENTRY(SSLv23),
     OSSL_SSL_METHOD_ENTRY(SSLv23_server),
     OSSL_SSL_METHOD_ENTRY(SSLv23_client),
diff --git a/test/openssl/test_ssl.rb b/test/openssl/test_ssl.rb
index 07e081b..0cbfcba 100644
--- a/test/openssl/test_ssl.rb
+++ b/test/openssl/test_ssl.rb
@@ -912,7 +912,7 @@ def test_unset_OP_ALL
   # that has been marked as forbidden, therefore either of these may be raised
   HANDSHAKE_ERRORS = [OpenSSL::SSL::SSLError, Errno::ECONNRESET]

-if OpenSSL::SSL::SSLContext::METHODS.include? :TLSv1
+if OpenSSL::SSL::SSLContext::METHODS.include?(:TLSv1) && OpenSSL::SSL::SSLContext::METHODS.include?(:SSLv3)

   def test_forbid_ssl_v3_for_client
     ctx_proc = Proc.new { |ctx| ctx.options = OpenSSL::SSL::OP_ALL | OpenSSL::SSL::OP_NO_SSLv3 }
src/rvm/patches/ruby/2.2.2/fix_installing_bundled_gems.patch000066400000002214147511530530017760 0ustar00--- a/tool/rbinstall.rb
+++ b/tool/rbinstall.rb
@@ -719,15 +719,15 @@ install?(:ext, :comm, :gem) do
     directories = Gem.ensure_gem_subdirectories(gem_dir, :mode => $dir_mode)
     prepare "bundle gems", gem_dir, directories
     Dir.glob(srcdir+'/gems/*.gem').each do |gem|
-      Gem.install gem, Gem::Requirement.default, :install_dir => with_destdir(Gem.dir), :domain => :local, :ignore_dependencies => true
+      Gem.install gem, Gem::Requirement.default, :install_dir => with_destdir(gem_dir), :domain => :local, :ignore_dependencies => true
       gemname = Pathname(gem).basename
       puts "#{" "*30}#{gemname}"
     end
     # fix directory permissions
     # TODO: Gem.install should accept :dir_mode option or something
-    File.chmod($dir_mode, *Dir.glob(with_destdir(Gem.dir)+"/**/"))
+    File.chmod($dir_mode, *Dir.glob(with_destdir(gem_dir)+"/**/"))
     # fix .gemspec permissions
-    File.chmod($data_mode, *Dir.glob(with_destdir(Gem.dir)+"/specifications/*.gemspec"))
+    File.chmod($data_mode, *Dir.glob(with_destdir(gem_dir)+"/specifications/*.gemspec"))
   else
     puts "skip installing bundle gems because of lacking zlib"
   end
src/rvm/patches/ruby/2.2.8/fix_installing_bundled_gems.patch000066400000002214147511530530017766 0ustar00--- a/tool/rbinstall.rb
+++ b/tool/rbinstall.rb
@@ -719,15 +719,15 @@ install?(:ext, :comm, :gem) do
     directories = Gem.ensure_gem_subdirectories(gem_dir, :mode => $dir_mode)
     prepare "bundle gems", gem_dir, directories
     Dir.glob(srcdir+'/gems/*.gem').each do |gem|
-      Gem.install gem, Gem::Requirement.default, :install_dir => with_destdir(Gem.dir), :domain => :local, :ignore_dependencies => true
+      Gem.install gem, Gem::Requirement.default, :install_dir => with_destdir(gem_dir), :domain => :local, :ignore_dependencies => true
       gemname = Pathname(gem).basename
       puts "#{" "*30}#{gemname}"
     end
     # fix directory permissions
     # TODO: Gem.install should accept :dir_mode option or something
-    File.chmod($dir_mode, *Dir.glob(with_destdir(Gem.dir)+"/**/"))
+    File.chmod($dir_mode, *Dir.glob(with_destdir(gem_dir)+"/**/"))
     # fix .gemspec permissions
-    File.chmod($data_mode, *Dir.glob(with_destdir(Gem.dir)+"/specifications/*.gemspec"))
+    File.chmod($data_mode, *Dir.glob(with_destdir(gem_dir)+"/specifications/*.gemspec"))
   else
     puts "skip installing bundle gems because of lacking zlib"
   end
src/rvm/patches/ruby/2.1.1/openssl3.patch000066400000003333147511530530014005 0ustar00diff --git a/ext/openssl/extconf.rb b/ext/openssl/extconf.rb
index 8c04cb5..132d803 100644
--- a/ext/openssl/extconf.rb
+++ b/ext/openssl/extconf.rb
@@ -104,6 +104,9 @@
 have_func("SSLv2_method")
 have_func("SSLv2_server_method")
 have_func("SSLv2_client_method")
+have_func("SSLv3_method")
+have_func("SSLv3_server_method")
+have_func("SSLv3_client_method")
 have_func("TLSv1_1_method")
 have_func("TLSv1_1_server_method")
 have_func("TLSv1_1_client_method")
diff --git a/ext/openssl/ossl_ssl.c b/ext/openssl/ossl_ssl.c
index f7cb7f0..47111f6 100644
--- a/ext/openssl/ossl_ssl.c
+++ b/ext/openssl/ossl_ssl.c
@@ -109,9 +109,12 @@ static const struct {
     OSSL_SSL_METHOD_ENTRY(SSLv2_server),
     OSSL_SSL_METHOD_ENTRY(SSLv2_client),
 #endif
+#if defined(HAVE_SSLV3_METHOD) && defined(HAVE_SSLV3_SERVER_METHOD) && \
+        defined(HAVE_SSLV3_CLIENT_METHOD)
     OSSL_SSL_METHOD_ENTRY(SSLv3),
     OSSL_SSL_METHOD_ENTRY(SSLv3_server),
     OSSL_SSL_METHOD_ENTRY(SSLv3_client),
+#endif
     OSSL_SSL_METHOD_ENTRY(SSLv23),
     OSSL_SSL_METHOD_ENTRY(SSLv23_server),
     OSSL_SSL_METHOD_ENTRY(SSLv23_client),
diff --git a/test/openssl/test_ssl.rb b/test/openssl/test_ssl.rb
index 07e081b..0cbfcba 100644
--- a/test/openssl/test_ssl.rb
+++ b/test/openssl/test_ssl.rb
@@ -912,7 +912,7 @@ def test_unset_OP_ALL
   # that has been marked as forbidden, therefore either of these may be raised
   HANDSHAKE_ERRORS = [OpenSSL::SSL::SSLError, Errno::ECONNRESET]

-if OpenSSL::SSL::SSLContext::METHODS.include? :TLSv1
+if OpenSSL::SSL::SSLContext::METHODS.include?(:TLSv1) && OpenSSL::SSL::SSLContext::METHODS.include?(:SSLv3)

   def test_forbid_ssl_v3_for_client
     ctx_proc = Proc.new { |ctx| ctx.options = OpenSSL::SSL::OP_ALL | OpenSSL::SSL::OP_NO_SSLv3 }
src/rvm/patches/ruby/2.1.1/libyaml.patch000066400000004633147511530530013674 0ustar00diff -uw ruby-2.1.1/ext/psych/yaml/config.h ruby-2.1.2/ext/psych/yaml/config.h
--- ruby-2.1.1/ext/psych/yaml/config.h	2014-02-24 05:24:15.000000000 +0100
+++ ruby-2.1.2/ext/psych/yaml/config.h	2014-05-04 17:45:33.000000000 +0200
@@ -1,11 +1,10 @@
-
 #define PACKAGE_NAME "yaml"
 #define PACKAGE_TARNAME "yaml"
-#define PACKAGE_VERSION "0.1.5"
-#define PACKAGE_STRING "yaml 0.1.5"
+#define PACKAGE_VERSION "0.1.6"
+#define PACKAGE_STRING "yaml 0.1.6"
 #define PACKAGE_BUGREPORT "http://pyyaml.org/newticket?component libyaml"
 #define PACKAGE_URL ""
 #define YAML_VERSION_MAJOR 0
 #define YAML_VERSION_MINOR 1
-#define YAML_VERSION_PATCH 5
-#define YAML_VERSION_STRING "0.1.5"
+#define YAML_VERSION_PATCH 6
+#define YAML_VERSION_STRING "0.1.6"
diff -uw ruby-2.1.1/ext/psych/yaml/scanner.c ruby-2.1.2/ext/psych/yaml/scanner.c
--- ruby-2.1.1/ext/psych/yaml/scanner.c	2014-02-24 05:24:15.000000000 +0100
+++ ruby-2.1.2/ext/psych/yaml/scanner.c	2014-05-04 17:45:33.000000000 +0200
@@ -2629,6 +2629,9 @@
         /* Check if it is a URI-escape sequence. */
 
         if (CHECK(parser->buffer, '%')) {
+            if (!STRING_EXTEND(parser, string))
+                goto error;
+
             if (!yaml_parser_scan_uri_escapes(parser,
                         directive, start_mark, &string)) goto error;
         }
diff -uw ruby-2.1.1/ext/psych/yaml/yaml_private.h ruby-2.1.2/ext/psych/yaml/yaml_private.h
--- ruby-2.1.1/ext/psych/yaml/yaml_private.h	2014-02-24 05:24:15.000000000 +0100
+++ ruby-2.1.2/ext/psych/yaml/yaml_private.h	2014-05-04 17:45:33.000000000 +0200
@@ -146,9 +146,12 @@
      (string).start = (string).pointer = (string).end = 0)
 
 #define STRING_EXTEND(context,string)                                           \
-    (((string).pointer+5 < (string).end)                                        \
+    ((((string).pointer+5 < (string).end)                                       \
         || yaml_string_extend(&(string).start,                                  \
-            &(string).pointer, &(string).end))
+            &(string).pointer, &(string).end)) ?                                \
+         1 :                                                                    \
+        ((context)->error = YAML_MEMORY_ERROR,                                  \
+         0))
 
 #define CLEAR(context,string)                                                   \
     ((string).pointer = (string).start,                                         \
src/rvm/patches/ruby/1.8.7/p72/mbari-4.patch000066400000150174147511530530014124 0ustar00diff -rux '*.o' ruby-1.8.7-p72/ChangeLog ruby-1.8.7-mbari/ChangeLog
--- ruby-1.8.7-p72/ChangeLog	2008-12-16 00:47:25.000000000 -0800
+++ ruby-1.8.7-mbari/ChangeLog	2008-12-16 23:06:21.000000000 -0800
@@ -1,3 +1,11 @@
+Tue Dec 15  9:15:36 2008  Brent Roman  <brent@mbari.org>
+
+        * eval.c:  factored rb_eval() into many separate non-inlined
+                  functions to reduce the size of its stack frame when
+                  compiled with gcc.
+                  Factored callcc into 2 functions.
+
+
 Tue Dec 13  6:10:36 2008  Brent Roman  <brent@mbari.org>
 
         * eval.c:  update stack extent just before and after every setjmp
diff -rux '*.o' ruby-1.8.7-p72/eval.c ruby-1.8.7-mbari/eval.c
--- ruby-1.8.7-p72/eval.c	2008-12-16 00:47:25.000000000 -0800
+++ ruby-1.8.7-mbari/eval.c	2008-12-16 23:28:08.000000000 -0800
@@ -3,7 +3,7 @@
   eval.c -
 
   $Author: brent $
-  $Date: 2008/12/14 07:23:06 $
+  $Date: 2008/12/17 07:28:08 $
   created at: Thu Jun 10 14:22:17 JST 1993
 
   Copyright (C) 1993-2003 Yukihiro Matsumoto
@@ -219,7 +219,7 @@
 VALUE rb_cBinding;
 static VALUE proc_invoke _((VALUE,VALUE,VALUE,VALUE));
 static VALUE rb_f_binding _((VALUE));
-static void rb_f_END _((void));
+NOINLINE(static void rb_f_END _((void)));
 static VALUE rb_f_block_given_p _((void));
 static VALUE block_pass _((VALUE,NODE*));
 
@@ -1240,12 +1240,7 @@
     if (NIL_P(ruby_errinfo)) return;
 
     PUSH_TAG(PROT_NONE);
-    if (EXEC_TAG() == 0) {
-	errat = get_backtrace(ruby_errinfo);
-    }
-    else {
-	errat = Qnil;
-    }
+    errat = EXEC_TAG() == 0 ? get_backtrace(ruby_errinfo) : Qnil;
     if (EXEC_TAG()) goto error;
     if (NIL_P(errat)){
 	ruby_set_current_source();
@@ -1926,8 +1921,8 @@
     return rb_const_defined(cref->nd_clss, id);
 }
 
-static VALUE
-ev_const_get(cref, id, self)
+NOINLINE(static VALUE
+ev_const_get(cref, id, self))
     NODE *cref;
     ID id;
     VALUE self;
@@ -2942,40 +2937,960 @@
     }
 }
 
-static VALUE
-rb_eval(self, n)
-    VALUE self;
-    NODE *n;
+
+/*
+  functions factored out of rb_eval() to reduce its stack frame size
+*/
+NOINLINE(static VALUE eval_match2(self, node))
+  VALUE self;
+  NODE *node;
+{
+    VALUE l = rb_eval(self,node->nd_recv);
+    VALUE r = rb_eval(self,node->nd_value);
+    return rb_reg_match(l, r);
+}
+
+NOINLINE(static VALUE
+eval_match3(self, node))
+  VALUE self;
+  NODE *node;
+{
+  VALUE r = rb_eval(self,node->nd_recv);
+  VALUE l = rb_eval(self,node->nd_value);
+  return TYPE(l) == T_STRING ? rb_reg_match(r, l) : rb_funcall(l, match, 1, r);
+}
+
+
+NOINLINE(static void
+eval_opt_n(self, node))
+  VALUE self;
+  NODE *node;
+{
+  int state;
+  PUSH_TAG(PROT_LOOP);
+  switch (state = EXEC_TAG()) {
+    case 0:
+    opt_n_next:
+      while (!NIL_P(rb_gets())) {
+	opt_n_redo:
+	  rb_eval(self, node->nd_body);
+      }
+      break;
+
+    case TAG_REDO:
+      state = 0;
+      goto opt_n_redo;
+    case TAG_NEXT:
+      state = 0;
+      goto opt_n_next;
+    case TAG_BREAK:
+      state = 0;
+    default:
+      break;
+  }
+  POP_TAG();
+  if (state) JUMP_TAG(state);
+}
+
+
+NOINLINE(static NODE *
+eval_when(self, node))
+  VALUE self;
+  NODE *node;
+{
+  do {
+      NODE *tag = node->nd_head;
+      while (tag) {
+	  EXEC_EVENT_HOOK(RUBY_EVENT_LINE, tag, self,
+			  ruby_frame->last_func,
+			  ruby_frame->last_class);
+	  if (tag->nd_head && nd_type(tag->nd_head) == NODE_WHEN) {
+	      VALUE v = rb_eval(self, tag->nd_head->nd_head);
+	      long i;
+
+	      if (TYPE(v) != T_ARRAY) v = rb_ary_to_ary(v);
+	      for (i=0; i<RARRAY(v)->len; i++) {
+		  if (RTEST(RARRAY(v)->ptr[i])) return node->nd_body;
+	      }
+	      tag = tag->nd_next;
+	      continue;
+	  }
+	  if (RTEST(rb_eval(self, tag->nd_head))) return node->nd_body;
+	  tag = tag->nd_next;
+      }
+  } while ((node = node->nd_next) && nd_type(node) == NODE_WHEN);
+  return node;
+}
+
+
+NOINLINE (static NODE *
+eval_case(self, node))
+  VALUE self;
+  NODE *node;
+{
+  VALUE val = rb_eval(self, node->nd_head);
+  node = node->nd_body;
+  while (node) {
+      NODE *tag;
+
+      if (nd_type(node) != NODE_WHEN) break;
+      tag = node->nd_head;
+      while (tag) {
+	  EXEC_EVENT_HOOK(RUBY_EVENT_LINE, tag, self,
+			  ruby_frame->last_func,
+			  ruby_frame->last_class);
+	  if (tag->nd_head && nd_type(tag->nd_head) == NODE_WHEN) {
+	      VALUE v = rb_eval(self, tag->nd_head->nd_head);
+	      long i;
+
+	      if (TYPE(v) != T_ARRAY) v = rb_ary_to_ary(v);
+	      for (i=0; i<RARRAY(v)->len; i++) {
+		  if (RTEST(rb_funcall2(RARRAY(v)->ptr[i], eqq, 1, &val)))
+		      return node->nd_body;
+	      }
+	      tag = tag->nd_next;
+	      continue;
+	  }
+	  if (RTEST(rb_funcall2(rb_eval(self, tag->nd_head), eqq, 1, &val)))
+	      return node->nd_body;
+	  tag = tag->nd_next;
+      }
+      node = node->nd_next;
+  }
+  return node;
+}
+
+
+NOINLINE (static VALUE
+eval_while(self, node))
+  VALUE self;
+  NODE *node;
+{
+  int state;
+  volatile VALUE result = Qnil;
+  PUSH_TAG(PROT_LOOP);
+  switch (state = EXEC_TAG()) {
+    case 0:
+      if (node->nd_state && !RTEST(rb_eval(self, node->nd_cond)))
+	  goto while_out;
+      do {
+	while_redo:
+	  rb_eval(self, node->nd_body);
+	while_next:
+	  ;
+      } while (RTEST(rb_eval(self, node->nd_cond)));
+      break;
+
+    case TAG_REDO:
+      state = 0;
+      goto while_redo;
+    case TAG_NEXT:
+      state = 0;
+      goto while_next;
+    case TAG_BREAK:
+      if (TAG_DST()) {
+	  state = 0;
+	  result = prot_tag->retval;
+      }
+      /* fall through */
+    default:
+      break;
+  }
+while_out:
+  POP_TAG();
+  if (state) JUMP_TAG(state);
+  return result;
+}
+
+
+NOINLINE (static VALUE
+eval_until(self, node))
+  VALUE self;
+  NODE *node;
+{
+  int state;
+  volatile VALUE result = Qnil;
+  PUSH_TAG(PROT_LOOP);
+  switch (state = EXEC_TAG()) {
+    case 0:
+      if (node->nd_state && RTEST(rb_eval(self, node->nd_cond)))
+	  goto until_out;
+      do {
+        until_redo:
+	  rb_eval(self, node->nd_body);
+        until_next:
+	  ;
+      } while (!RTEST(rb_eval(self, node->nd_cond)));
+      break;
+
+    case TAG_REDO:
+      state = 0;
+      goto until_redo;
+    case TAG_NEXT:
+      state = 0;
+      goto until_next;
+    case TAG_BREAK:
+      if (TAG_DST()) {
+	  state = 0;
+	  result = prot_tag->retval;
+      }
+      /* fall through */
+    default:
+      break;
+  }
+ until_out:
+  POP_TAG();
+  if (state) JUMP_TAG(state);
+  return result;
+}
+
+
+NOINLINE (static VALUE
+eval_iter(self, node))
+  VALUE self;
+  NODE *node;
+{
+  int state;
+  volatile VALUE result = Qnil;
+
+  PUSH_TAG(PROT_LOOP);
+  PUSH_BLOCK(node->nd_var, node->nd_body);
+
+  state = EXEC_TAG();
+  switch (state) {
+    case TAG_RETRY:
+      state = 0;  /* fall thru to case 0 */
+    case 0:
+      PUSH_ITER(ITER_PRE);
+      if (nd_type(node) == NODE_ITER) {
+	  result = rb_eval(self, node->nd_iter);
+      }
+      else {
+	  VALUE recv;
+
+	  _block.flags &= ~BLOCK_D_SCOPE;
+	  BEGIN_CALLARGS;
+	  recv = rb_eval(self, node->nd_iter);
+	  END_CALLARGS;
+	  ruby_current_node = node;
+	  SET_CURRENT_SOURCE();
+	  result = rb_call(CLASS_OF(recv),recv,each,0,0,0,self);
+      }
+      POP_ITER();
+      break;
+      
+    case TAG_BREAK:
+      if (TAG_DST()) {
+        result = prot_tag->retval;
+        state = 0;
+      }
+  }
+  POP_BLOCK();
+  POP_TAG();
+  if (state) JUMP_TAG(state);
+  return result;
+}
+
+
+NOINLINE (static VALUE
+eval_rescue(self, node))
+  VALUE self;
+  NODE *node;
 {
-    NODE * volatile contnode = 0;
-    NODE * volatile node = n;
+    volatile VALUE e_info = ruby_errinfo;
+    volatile int rescuing = 0;
     int state;
     volatile VALUE result = Qnil;
-    st_data_t data;
 
-#define RETURN(v) do { \
-    result = (v); \
-    goto finish; \
-} while (0)
+    PUSH_TAG(PROT_NONE);
+    if ((state = EXEC_TAG()) == 0) {
+      retry_entry:
+	result = rb_eval(self, node->nd_head);
+    }
+    else if (rescuing) {
+	if (rescuing < 0) {
+	    /* in rescue argument, just reraise */
+	}
+	else if (state == TAG_RETRY) {
+	    rescuing = state = 0;
+	    ruby_errinfo = e_info;
+	    goto retry_entry;
+	}
+	else if (state != TAG_RAISE) {
+	    result = prot_tag->retval;
+	}
+    }
+    else if (state == TAG_RAISE) {
+	NODE *resq = node->nd_resq;
 
-  again:
-    if (!node) RETURN(Qnil);
+	rescuing = -1;
+	while (resq) {
+	    ruby_current_node = resq;
+	    if (handle_rescue(self, resq)) {
+		state = 0;
+		rescuing = 1;
+		result = rb_eval(self, resq->nd_body);
+		break;
+	    }
+	    resq = resq->nd_head; /* next rescue */
+	}
+    }
+    else {
+	result = prot_tag->retval;
+    }
+    POP_TAG();
+    if (state != TAG_RAISE) ruby_errinfo = e_info;
+    if (state) {
+	JUMP_TAG(state);
+    }
+    /* no exception raised */
+    if (!rescuing && node->nd_else) { /* else clause given */
+	result = Qundef;  /* caller must eval this! */
+    }
+    return result;
+}
 
+
+NOINLINE (static VALUE
+eval_ensure(self, node))
+  VALUE self;
+  NODE *node;
+{
+  int state;
+  volatile VALUE result = Qnil;
+
+  PUSH_TAG(PROT_NONE);
+  if ((state = EXEC_TAG()) == 0) {
+      result = rb_eval(self, node->nd_head);
+  }
+  POP_TAG();
+  if (node->nd_ensr && !thread_no_ensure()) {
+      VALUE retval = prot_tag->retval; /* save retval */
+      VALUE errinfo = ruby_errinfo;
+
+      rb_eval(self, node->nd_ensr);
+      return_value(retval);
+      ruby_errinfo = errinfo;
+  }
+  if (state) JUMP_TAG(state);
+  return result;
+}
+
+
+NOINLINE (static VALUE
+eval_dot(self, node))
+  VALUE self;
+  NODE *node;
+{
+  VALUE beg = rb_eval(self, node->nd_beg);
+  VALUE end = rb_eval(self, node->nd_end);
+  return rb_range_new(beg, end, nd_type(node) == NODE_DOT3);
+}
+
+
+NOINLINE (static VALUE
+eval_flip2(self, node))
+  VALUE self;
+  NODE *node;
+{
+  VALUE *flip = rb_svar(node->nd_cnt);
+  if (!flip) rb_bug("unexpected local variable");
+  if (!RTEST(*flip)) {
+    if (!RTEST(rb_eval(self, node->nd_beg)))
+      return Qfalse;
+    *flip = RTEST(rb_eval(self, node->nd_end))?Qfalse:Qtrue;
+  }
+  else if (RTEST(rb_eval(self, node->nd_end)))
+    *flip = Qfalse;
+  return Qtrue;
+}
+
+
+NOINLINE (static VALUE
+eval_flip3(self, node))
+  VALUE self;
+  NODE *node;
+{
+  VALUE *flip = rb_svar(node->nd_cnt);
+  if (!flip) rb_bug("unexpected local variable");
+  if (!RTEST(*flip))
+    return *flip = (RTEST(rb_eval(self, node->nd_beg)) ? Qtrue : Qfalse);
+  if (RTEST(rb_eval(self, node->nd_end)))
+    *flip = Qfalse;
+  return Qtrue;
+}
+
+
+NOINLINE (static VALUE
+eval_attrasgn(self, node))
+  VALUE self;
+  NODE *node;
+{
+  VALUE recv;
+  int argc; VALUE *argv; /* used in SETUP_ARGS */
+  int scope;
+  TMP_PROTECT;
+
+  BEGIN_CALLARGS;
+  if (node->nd_recv == (NODE *)1) {
+      recv = self;
+      scope = 1;
+  }
+  else {
+      recv = rb_eval(self, node->nd_recv);
+      scope = 0;
+  }
+  SETUP_ARGS(node->nd_args);
+  END_CALLARGS;
+
+  ruby_current_node = node;
+  SET_CURRENT_SOURCE();
+  rb_call(CLASS_OF(recv),recv,node->nd_mid,argc,argv,scope,self);
+  return argv[argc-1];
+}
+
+
+NOINLINE (static VALUE
+eval_call(self, node))
+  VALUE self;
+  NODE *node;
+{
+  VALUE recv;
+  int argc; VALUE *argv; /* used in SETUP_ARGS */
+  TMP_PROTECT;
+
+  BEGIN_CALLARGS;
+  recv = rb_eval(self, node->nd_recv);
+  SETUP_ARGS(node->nd_args);
+  END_CALLARGS;
+
+  ruby_current_node = node;
+  SET_CURRENT_SOURCE();
+  return rb_call(CLASS_OF(recv),recv,node->nd_mid,argc,argv,0,self);
+}
+
+
+NOINLINE (static VALUE
+eval_fcall(self, node))
+  VALUE self;
+  NODE *node;
+{
+  int argc; VALUE *argv; /* used in SETUP_ARGS */
+  TMP_PROTECT;
+
+  BEGIN_CALLARGS;
+  SETUP_ARGS(node->nd_args);
+  END_CALLARGS;
+
+  ruby_current_node = node;
+  SET_CURRENT_SOURCE();
+  return rb_call(CLASS_OF(self),self,node->nd_mid,argc,argv,1,self);
+}
+
+NOINLINE (static VALUE
+eval_super(self, node))
+  VALUE self;
+  NODE *node;
+{
+  int argc; VALUE *argv; /* used in SETUP_ARGS */
+  TMP_PROTECT;
+
+  if (ruby_frame->last_class == 0) {
+      if (ruby_frame->last_func) {
+	  rb_name_error(ruby_frame->last_func,
+			"superclass method `%s' disabled",
+			rb_id2name(ruby_frame->orig_func));
+      }
+      else {
+	  rb_raise(rb_eNoMethodError, "super called outside of method");
+      }
+  }
+  if (nd_type(node) == NODE_ZSUPER) {
+      argc = ruby_frame->argc;
+      if (argc && DMETHOD_P()) {
+	  if (TYPE(RBASIC(ruby_scope)->klass) != T_ARRAY ||
+	      RARRAY(RBASIC(ruby_scope)->klass)->len != argc) {
+	      rb_raise(rb_eRuntimeError, 
+		       "super: specify arguments explicitly");
+	  }
+	  argv = RARRAY(RBASIC(ruby_scope)->klass)->ptr;
+      }
+      else if (!ruby_scope->local_vars) {
+	  argc = 0;
+	  argv = 0;
+      }
+      else {
+	  argv = ruby_scope->local_vars + 2;
+      }
+  }
+  else {
+      BEGIN_CALLARGS;
+      SETUP_ARGS(node->nd_args);
+      END_CALLARGS;
+      ruby_current_node = node;
+  }
+
+  SET_CURRENT_SOURCE();
+  return rb_call_super(argc, argv);
+}
+
+
+NOINLINE (static VALUE
+eval_scope(self, node))
+  VALUE self;
+  NODE *node;
+{
+  int state;
+  volatile VALUE result = Qnil;
+  struct FRAME frame;
+  NODE *saved_cref = 0;
+
+  frame = *ruby_frame;
+  frame.tmp = ruby_frame;
+  ruby_frame = &frame;
+
+  PUSH_SCOPE();
+  PUSH_TAG(PROT_NONE);
+  if (node->nd_rval) {
+      saved_cref = ruby_cref;
+      ruby_cref = (NODE*)node->nd_rval;
+  }
+  if (node->nd_tbl) {
+      VALUE *vars = ALLOCA_N(VALUE, node->nd_tbl[0]+1);
+      *vars++ = (VALUE)node;
+      ruby_scope->local_vars = vars;
+      rb_mem_clear(ruby_scope->local_vars, node->nd_tbl[0]);
+      ruby_scope->local_tbl = node->nd_tbl;
+  }
+  else {
+      ruby_scope->local_vars = 0;
+      ruby_scope->local_tbl  = 0;
+  }
+  if ((state = EXEC_TAG()) == 0) {
+      result = rb_eval(self, node->nd_next);
+  }
+  POP_TAG();
+  POP_SCOPE();
+  ruby_frame = frame.tmp;
+  if (saved_cref)
+      ruby_cref = saved_cref;
+  if (state) JUMP_TAG(state);
+  return result;
+}
+
+NOINLINE (static VALUE
+eval_op_asgn1(self, node))
+  VALUE self;
+  NODE *node;
+{
+  int argc; VALUE *argv; /* used in SETUP_ARGS */
+  VALUE recv, val, tmp;
+  NODE *rval;
+  TMP_PROTECT;
+
+  recv = rb_eval(self, node->nd_recv);
+  rval = node->nd_args->nd_head;
+  SETUP_ARGS0(node->nd_args->nd_body, 1);
+  val = rb_funcall3(recv, aref, argc, argv);
+  switch (node->nd_mid) {
+  case 0: /* OR */
+    if (RTEST(val)) return val;
+    val = rb_eval(self, rval);
+    break;
+  case 1: /* AND */
+    if (!RTEST(val)) return val;
+    val = rb_eval(self, rval);
+    break;
+  default:
+    tmp = rb_eval(self, rval);
+    val = rb_funcall3(val, node->nd_mid, 1, &tmp);
+  }
+  argv[argc] = val;
+  rb_funcall2(recv, aset, argc+1, argv);
+  return val;
+}
+
+
+NOINLINE (static VALUE
+eval_op_asgn2(self, node))
+  VALUE self;
+  NODE *node;
+{
+  ID id = node->nd_next->nd_vid;
+  VALUE recv, val, tmp;
+
+  recv = rb_eval(self, node->nd_recv);
+  val = rb_funcall3(recv, id, 0, 0);
+  switch (node->nd_next->nd_mid) {
+  case 0: /* OR */
+    if (RTEST(val)) return val;
+    val = rb_eval(self, node->nd_value);
+    break;
+  case 1: /* AND */
+    if (!RTEST(val)) return val;
+    val = rb_eval(self, node->nd_value);
+    break;
+  default:
+    tmp = rb_eval(self, node->nd_value);
+    val = rb_funcall3(val, node->nd_next->nd_mid, 1, &tmp);
+  }
+
+  rb_funcall2(recv, node->nd_next->nd_aid, 1, &val);
+  return val;
+}
+
+
+NOINLINE (static VALUE
+eval_hash(self, node))
+  VALUE self;
+  NODE *node;
+{
+  NODE *list;
+  VALUE hash = rb_hash_new();
+  VALUE key, val;
+
+  list = node->nd_head;
+  while (list) {
+      key = rb_eval(self, list->nd_head);
+      list = list->nd_next;
+      if (list == 0)
+	  rb_bug("odd number list for Hash");
+      val = rb_eval(self, list->nd_head);
+      list = list->nd_next;
+      rb_hash_aset(hash, key, val);
+  }
+  return hash;
+}
+
+
+NOINLINE (static VALUE
+eval_array(self, node))
+  VALUE self;
+  NODE *node;
+{
+  VALUE ary;
+  long i;
+
+  i = node->nd_alen;
+  ary = rb_ary_new2(i);
+  for (i=0;node;node=node->nd_next) {
+      RARRAY(ary)->ptr[i++] = rb_eval(self, node->nd_head);
+      RARRAY(ary)->len = i;
+  }
+  return ary;
+}
+
+
+NOINLINE (static VALUE
+eval_slit(self, node))
+  VALUE self;
+  NODE *node;
+{
+  VALUE str, str2;
+  NODE *list = node->nd_next;
+
+  str = rb_str_new3(node->nd_lit);
+  while (list) {
+      if (list->nd_head) {
+	  switch (nd_type(list->nd_head)) {
+	    case NODE_STR:
+	      str2 = list->nd_head->nd_lit;
+	      break;
+	    default:
+	      str2 = rb_eval(self, list->nd_head);
+	      break;
+	  }
+	  rb_str_append(str, str2);
+	  OBJ_INFECT(str, str2);
+      }
+      list = list->nd_next;
+  }
+  switch (nd_type(node)) {
+    case NODE_DREGX:
+      return rb_reg_new(RSTRING(str)->ptr, RSTRING(str)->len,
+			  node->nd_cflag);
+    case NODE_DREGX_ONCE:	/* regexp expand once */
+      str2 = rb_reg_new(RSTRING(str)->ptr, RSTRING(str)->len,
+			  node->nd_cflag);
+      nd_set_type(node, NODE_LIT);
+      return node->nd_lit = str2;
+    case NODE_LIT:
+      /* other thread may replace NODE_DREGX_ONCE to NODE_LIT */
+      return Qundef;
+    case NODE_DXSTR:
+      return rb_funcall(self, '`', 1, str);
+    case NODE_DSYM:
+      return rb_str_intern(str);
+  }
+  return str;
+}
+
+        
+NOINLINE (static void
+eval_defn(self, node))
+  VALUE self;
+  NODE *node;
+{
+  NODE *body,  *defn;
+  VALUE origin = 0;
+  int noex;
+
+  if (NIL_P(ruby_class)) {
+      rb_raise(rb_eTypeError, "no class/module to add method");
+  }
+  if (ruby_class == rb_cObject && node->nd_mid == init) {
+      rb_warn("redefining Object#initialize may cause infinite loop");
+  }
+  if (node->nd_mid == __id__ || node->nd_mid == __send__) {
+      rb_warn("redefining `%s' may cause serious problem",
+	      rb_id2name(node->nd_mid));
+  }
+  rb_frozen_class_p(ruby_class);
+  body = search_method(ruby_class, node->nd_mid, &origin);
+  if (body){
+      if (RTEST(ruby_verbose) && ruby_class == origin && body->nd_cnt == 0 && body->nd_body) {
+	  rb_warning("method redefined; discarding old %s", rb_id2name(node->nd_mid));
+      }
+  }
+
+  if (SCOPE_TEST(SCOPE_PRIVATE) || node->nd_mid == init) {
+      noex = NOEX_PRIVATE;
+  }
+  else if (SCOPE_TEST(SCOPE_PROTECTED)) {
+      noex = NOEX_PROTECTED;
+  }
+  else {
+      noex = NOEX_PUBLIC;
+  }
+  if (body && origin == ruby_class && body->nd_body == 0) {
+      noex |= NOEX_NOSUPER;
+  }
+
+  defn = rb_copy_node_scope(node->nd_defn, ruby_cref);
+  rb_add_method(ruby_class, node->nd_mid, defn, noex);
+  if (scope_vmode == SCOPE_MODFUNC) {
+      rb_add_method(rb_singleton_class(ruby_class),
+		    node->nd_mid, defn, NOEX_PUBLIC);
+  }
+}
+
+
+NOINLINE (static void
+eval_defs(self, node))
+  VALUE self;
+  NODE *node;
+{
+  VALUE recv = rb_eval(self, node->nd_recv);
+  VALUE klass;
+  NODE *body = 0, *defn;
+  st_data_t data;
+
+  if (ruby_safe_level >= 4 && !OBJ_TAINTED(recv)) {
+      rb_raise(rb_eSecurityError, "Insecure: can't define singleton method");
+  }
+  if (FIXNUM_P(recv) || SYMBOL_P(recv)) {
+      rb_raise(rb_eTypeError,
+	       "can't define singleton method \"%s\" for %s",
+	       rb_id2name(node->nd_mid),
+	       rb_obj_classname(recv));
+  }
+
+  if (OBJ_FROZEN(recv)) rb_error_frozen("object");
+  klass = rb_singleton_class(recv);
+  if (st_lookup(RCLASS(klass)->m_tbl, node->nd_mid, &data)) {
+      body = (NODE *)data;
+      if (ruby_safe_level >= 4) {
+	  rb_raise(rb_eSecurityError, "redefining method prohibited");
+      }
+      if (RTEST(ruby_verbose)) {
+	  rb_warning("redefine %s", rb_id2name(node->nd_mid));
+      }
+  }
+  defn = rb_copy_node_scope(node->nd_defn, ruby_cref);
+  rb_add_method(klass, node->nd_mid, defn,
+		NOEX_PUBLIC|(body?body->nd_noex&NOEX_UNDEF:0));
+}
+
+
+NOINLINE (static VALUE
+eval_class(self, node))
+  VALUE self;
+  NODE *node;
+{
+    VALUE super, klass, tmp, cbase;
+    ID cname;
+    int gen = Qfalse;
+
+    cbase = class_prefix(self, node->nd_cpath);
+    cname = node->nd_cpath->nd_mid;
+
+    if (NIL_P(ruby_cbase)) {
+	rb_raise(rb_eTypeError, "no outer class/module");
+    }
+    if (node->nd_super) {
+       super = rb_eval(self, node->nd_super);
+       rb_check_inheritable(super);
+    }
+    else {
+	super = 0;
+    }
+
+    if (rb_const_defined_at(cbase, cname)) {
+	klass = rb_const_get_at(cbase, cname);
+	if (TYPE(klass) != T_CLASS) {
+	    rb_raise(rb_eTypeError, "%s is not a class",
+		     rb_id2name(cname));
+	}
+	if (super) {
+	    tmp = rb_class_real(RCLASS(klass)->super);
+	    if (tmp != super) {
+		rb_raise(rb_eTypeError, "superclass mismatch for class %s",
+			 rb_id2name(cname));
+	    }
+	    super = 0;
+	}
+	if (ruby_safe_level >= 4) {
+	    rb_raise(rb_eSecurityError, "extending class prohibited");
+	}
+    }
+    else {
+	if (!super) super = rb_cObject;
+	klass = rb_define_class_id(cname, super);
+	rb_set_class_path(klass, cbase, rb_id2name(cname));
+	rb_const_set(cbase, cname, klass);
+	gen = Qtrue;
+    }
+    if (ruby_wrapper) {
+	rb_extend_object(klass, ruby_wrapper);
+	rb_include_module(klass, ruby_wrapper);
+    }
+    if (super && gen) {
+	rb_class_inherited(super, klass);
+    }
+    return module_setup(klass, node);
+}
+
+
+NOINLINE (static VALUE
+eval_module(self, node))
+  VALUE self;
+  NODE *node;
+{
+  VALUE module, cbase;
+  ID cname;
+
+  if (NIL_P(ruby_cbase)) {
+      rb_raise(rb_eTypeError, "no outer class/module");
+  }
+  cbase = class_prefix(self, node->nd_cpath);
+  cname = node->nd_cpath->nd_mid;
+  if (rb_const_defined_at(cbase, cname)) {
+      module = rb_const_get_at(cbase, cname);
+      if (TYPE(module) != T_MODULE) {
+	  rb_raise(rb_eTypeError, "%s is not a module",
+		   rb_id2name(cname));
+      }
+      if (ruby_safe_level >= 4) {
+	  rb_raise(rb_eSecurityError, "extending module prohibited");
+      }
+  }
+  else {
+      module = rb_define_module_id(cname);
+      rb_set_class_path(module, cbase, rb_id2name(cname));
+      rb_const_set(cbase, cname, module);
+  }
+  if (ruby_wrapper) {
+      rb_extend_object(module, ruby_wrapper);
+      rb_include_module(module, ruby_wrapper);
+  }
+
+  return module_setup(module, node);
+}
+
+
+NOINLINE (static VALUE
+eval_sclass(self, node))
+  VALUE self;
+  NODE *node;
+{
+  VALUE klass, result;
+
+  result = rb_eval(self, node->nd_recv);
+  if (FIXNUM_P(result) || SYMBOL_P(result)) {
+      rb_raise(rb_eTypeError, "no virtual class for %s",
+	       rb_obj_classname(result));
+  }
+  if (ruby_safe_level >= 4 && !OBJ_TAINTED(result))
+      rb_raise(rb_eSecurityError, "Insecure: can't extend object");
+  klass = rb_singleton_class(result);
+
+  if (ruby_wrapper) {
+      rb_extend_object(klass, ruby_wrapper);
+      rb_include_module(klass, ruby_wrapper);
+  }
+
+  return module_setup(klass, node);
+}
+
+
+NOINLINE (static VALUE
+eval_defined(self, node))
+  VALUE self;
+  NODE *node;
+{
+    char buf[20];
+    const char *desc = is_defined(self, node->nd_head, buf);
+    return desc ? rb_str_new2(desc) : Qnil;
+}
+
+
+NOINLINE (static void
+eval_cvar_set(result, node, bool))
+  VALUE result, bool;
+  NODE *node;
+{
+  rb_cvar_set(cvar_cbase(), node->nd_vid, result, bool);
+}
+
+
+NOINLINE (static void
+eval_cdecl(self, node, result))
+  VALUE self, result;
+  NODE *node;
+{
+  if (node->nd_vid == 0)
+      rb_const_set(class_prefix(self, node->nd_else), 
+                          node->nd_else->nd_mid, result);
+  else
+      rb_const_set(ruby_cbase, node->nd_vid, result);
+}
+
+
+static VALUE
+rb_eval(self, node)
+  VALUE self;
+  NODE *node;
+{
+  VALUE result;
+
+again:
+  CHECK_INTS;
+  result = Qnil;
+  if (node) {
     ruby_current_node = node;
+    
     switch (nd_type(node)) {
       case NODE_BLOCK:
-	if (contnode) {
-	    result = rb_eval(self, node);
-	    break;
+	while (node->nd_next) {
+	    rb_eval(self, node->nd_head);
+	    node = node->nd_next;
 	}
-	contnode = node->nd_next;
 	node = node->nd_head;
 	goto again;
 
       case NODE_POSTEXE:
 	rb_f_END();
 	nd_set_type(node, NODE_NIL); /* exec just once */
-	result = Qnil;
 	break;
 
 	/* begin .. end without clauses */
@@ -2990,65 +3905,33 @@
 
 	/* nodes for speed-up(literal match) */
       case NODE_MATCH2:
-	{
-	    VALUE l = rb_eval(self,node->nd_recv);
-	    VALUE r = rb_eval(self,node->nd_value);
-	    result = rb_reg_match(l, r);
-	}
+        result = eval_match2(self, node);
 	break;
 
 	/* nodes for speed-up(literal match) */
       case NODE_MATCH3:
-	{
-	    VALUE r = rb_eval(self,node->nd_recv);
-	    VALUE l = rb_eval(self,node->nd_value);
-	    if (TYPE(l) == T_STRING) {
-		result = rb_reg_match(r, l);
-	    }
-	    else {
-		result = rb_funcall(l, match, 1, r);
-	    }
-	}
+        result = eval_match3(self,node);
 	break;
 
 	/* node for speed-up(top-level loop for -n/-p) */
       case NODE_OPT_N:
-	PUSH_TAG(PROT_LOOP);
-	switch (state = EXEC_TAG()) {
-	  case 0:
-	  opt_n_next:
-	    while (!NIL_P(rb_gets())) {
-	      opt_n_redo:
-		rb_eval(self, node->nd_body);
-	    }
-	    break;
-
-	  case TAG_REDO:
-	    state = 0;
-	    goto opt_n_redo;
-	  case TAG_NEXT:
-	    state = 0;
-	    goto opt_n_next;
-	  case TAG_BREAK:
-	    state = 0;
-	  default:
-	    break;
-	}
-	POP_TAG();
-	if (state) JUMP_TAG(state);
-	RETURN(Qnil);
+        eval_opt_n(self, node);
+        break;
 
       case NODE_SELF:
-	RETURN(self);
+	result = self;
+        break;
 
       case NODE_NIL:
-	RETURN(Qnil);
+	break;
 
       case NODE_TRUE:
-	RETURN(Qtrue);
+	result = Qtrue;
+        break;
 
       case NODE_FALSE:
-	RETURN(Qfalse);
+	result = Qfalse;
+        break;
 
       case NODE_IF:
 	if (RTEST(rb_eval(self, node->nd_cond))) {
@@ -3066,150 +3949,20 @@
 	goto again;
 
       case NODE_WHEN:
-	while (node) {
-	    NODE *tag;
-
-	    if (nd_type(node) != NODE_WHEN) goto again;
-	    tag = node->nd_head;
-	    while (tag) {
-		EXEC_EVENT_HOOK(RUBY_EVENT_LINE, tag, self,
-				ruby_frame->last_func,
-				ruby_frame->last_class);
-		if (tag->nd_head && nd_type(tag->nd_head) == NODE_WHEN) {
-		    VALUE v = rb_eval(self, tag->nd_head->nd_head);
-		    long i;
-
-		    if (TYPE(v) != T_ARRAY) v = rb_ary_to_ary(v);
-		    for (i=0; i<RARRAY(v)->len; i++) {
-			if (RTEST(RARRAY(v)->ptr[i])) {
-			    node = node->nd_body;
-			    goto again;
-			}
-		    }
-		    tag = tag->nd_next;
-		    continue;
-		}
-		if (RTEST(rb_eval(self, tag->nd_head))) {
-		    node = node->nd_body;
-		    goto again;
-		}
-		tag = tag->nd_next;
-	    }
-	    node = node->nd_next;
-	}
-	RETURN(Qnil);
+        if (node = eval_when(self, node)) goto again;
+        break;
 
       case NODE_CASE:
-	{
-	    VALUE val;
-
-	    val = rb_eval(self, node->nd_head);
-	    node = node->nd_body;
-	    while (node) {
-		NODE *tag;
-
-		if (nd_type(node) != NODE_WHEN) {
-		    goto again;
-		}
-		tag = node->nd_head;
-		while (tag) {
-		    EXEC_EVENT_HOOK(RUBY_EVENT_LINE, tag, self,
-				    ruby_frame->last_func,
-				    ruby_frame->last_class);
-		    if (tag->nd_head && nd_type(tag->nd_head) == NODE_WHEN) {
-			VALUE v = rb_eval(self, tag->nd_head->nd_head);
-			long i;
-
-			if (TYPE(v) != T_ARRAY) v = rb_ary_to_ary(v);
-			for (i=0; i<RARRAY(v)->len; i++) {
-			    if (RTEST(rb_funcall2(RARRAY(v)->ptr[i], eqq, 1, &val))){
-				node = node->nd_body;
-				goto again;
-			    }
-			}
-			tag = tag->nd_next;
-			continue;
-		    }
-		    if (RTEST(rb_funcall2(rb_eval(self, tag->nd_head), eqq, 1, &val))) {
-			node = node->nd_body;
-			goto again;
-		    }
-		    tag = tag->nd_next;
-		}
-		node = node->nd_next;
-	    }
-	}
-	RETURN(Qnil);
+        if (node = eval_case(self, node)) goto again;
+        break;
 
       case NODE_WHILE:
-	PUSH_TAG(PROT_LOOP);
-	result = Qnil;
-	switch (state = EXEC_TAG()) {
-	  case 0:
-	    if (node->nd_state && !RTEST(rb_eval(self, node->nd_cond)))
-		goto while_out;
-	    do {
-	      while_redo:
-		rb_eval(self, node->nd_body);
-	      while_next:
-		;
-	    } while (RTEST(rb_eval(self, node->nd_cond)));
-	    break;
-
-	  case TAG_REDO:
-	    state = 0;
-	    goto while_redo;
-	  case TAG_NEXT:
-	    state = 0;
-	    goto while_next;
-	  case TAG_BREAK:
-	    if (TAG_DST()) {
-		state = 0;
-		result = prot_tag->retval;
-	    }
-	    /* fall through */
-	  default:
-	    break;
-	}
-      while_out:
-	POP_TAG();
-	if (state) JUMP_TAG(state);
-	RETURN(result);
+        result = eval_while(self,node);
+        break;
 
       case NODE_UNTIL:
-	PUSH_TAG(PROT_LOOP);
-	result = Qnil;
-	switch (state = EXEC_TAG()) {
-	  case 0:
-	    if (node->nd_state && RTEST(rb_eval(self, node->nd_cond)))
-		goto until_out;
-	    do {
-	      until_redo:
-		rb_eval(self, node->nd_body);
-	      until_next:
-		;
-	    } while (!RTEST(rb_eval(self, node->nd_cond)));
-	    break;
-
-	  case TAG_REDO:
-	    state = 0;
-	    goto until_redo;
-	  case TAG_NEXT:
-	    state = 0;
-	    goto until_next;
-	  case TAG_BREAK:
-	    if (TAG_DST()) {
-		state = 0;
-		result = prot_tag->retval;
-	    }
-	    /* fall through */
-	  default:
-	    break;
-	}
-      until_out:
-	POP_TAG();
-	if (state) JUMP_TAG(state);
-	RETURN(result);
+        result = eval_until(self,node);
+        break;
 
       case NODE_BLOCK_PASS:
 	result = block_pass(self, node);
@@ -3217,47 +3970,7 @@
 
       case NODE_ITER:
       case NODE_FOR:
-	{
-	    PUSH_TAG(PROT_LOOP);
-	    PUSH_BLOCK(node->nd_var, node->nd_body);
-
-	    state = EXEC_TAG();
-	    if (state == 0) {
-	      iter_retry:
-		PUSH_ITER(ITER_PRE);
-		if (nd_type(node) == NODE_ITER) {
-		    result = rb_eval(self, node->nd_iter);
-		}
-		else {
-		    VALUE recv;
-
-		    _block.flags &= ~BLOCK_D_SCOPE;
-		    BEGIN_CALLARGS;
-		    recv = rb_eval(self, node->nd_iter);
-		    END_CALLARGS;
-		    ruby_current_node = node;
-		    SET_CURRENT_SOURCE();
-		    result = rb_call(CLASS_OF(recv),recv,each,0,0,0,self);
-		}
-		POP_ITER();
-	    }
-	    else if (state == TAG_BREAK && TAG_DST()) {
-		result = prot_tag->retval;
-		state = 0;
-	    }
-	    else if (state == TAG_RETRY) {
-		state = 0;
-		goto iter_retry;
-	    }
-	    POP_BLOCK();
-	    POP_TAG();
-	    switch (state) {
-	      case 0:
-		break;
-	      default:
-		JUMP_TAG(state);
-	    }
-	}
+	result = eval_iter(self, node);
 	break;
 
       case NODE_BREAK:
@@ -3265,17 +3978,14 @@
 	break;
 
       case NODE_NEXT:
-	CHECK_INTS;
 	next_jump(rb_eval(self, node->nd_stts));
 	break;
 
       case NODE_REDO:
-	CHECK_INTS;
 	JUMP_TAG(TAG_REDO);
 	break;
 
       case NODE_RETRY:
-	CHECK_INTS;
 	JUMP_TAG(TAG_RETRY);
 	break;
 
@@ -3305,73 +4015,15 @@
 	break;
 
       case NODE_RESCUE:
-	{
-	    volatile VALUE e_info = ruby_errinfo;
-	    volatile int rescuing = 0;
-
-	    PUSH_TAG(PROT_NONE);
-	    if ((state = EXEC_TAG()) == 0) {
-	      retry_entry:
-		result = rb_eval(self, node->nd_head);
-	    }
-	    else if (rescuing) {
-		if (rescuing < 0) {
-		    /* in rescue argument, just reraise */
-		}
-		else if (state == TAG_RETRY) {
-		    rescuing = state = 0;
-		    ruby_errinfo = e_info;
-		    goto retry_entry;
-		}
-		else if (state != TAG_RAISE) {
-		    result = prot_tag->retval;
-		}
-	    }
-	    else if (state == TAG_RAISE) {
-		NODE *resq = node->nd_resq;
-
-		rescuing = -1;
-		while (resq) {
-		    ruby_current_node = resq;
-		    if (handle_rescue(self, resq)) {
-			state = 0;
-			rescuing = 1;
-			result = rb_eval(self, resq->nd_body);
-			break;
-		    }
-		    resq = resq->nd_head; /* next rescue */
-		}
-	    }
-	    else {
-		result = prot_tag->retval;
-	    }
-	    POP_TAG();
-	    if (state != TAG_RAISE) ruby_errinfo = e_info;
-	    if (state) {
-		JUMP_TAG(state);
-	    }
-	    /* no exception raised */
-	    if (!rescuing && (node = node->nd_else)) { /* else clause given */
-		goto again;
-	    }
-	}
+        result = eval_rescue(self,node);
+        if (result == Qundef) {  /* handle else clause w/o recursion */
+          node = node->nd_else;
+          goto again;
+        }
 	break;
 
       case NODE_ENSURE:
-	PUSH_TAG(PROT_NONE);
-	if ((state = EXEC_TAG()) == 0) {
-	    result = rb_eval(self, node->nd_head);
-	}
-	POP_TAG();
-	if (node->nd_ensr && !thread_no_ensure()) {
-	    VALUE retval = prot_tag->retval; /* save retval */
-	    VALUE errinfo = ruby_errinfo;
-
-	    rb_eval(self, node->nd_ensr);
-	    return_value(retval);
-	    ruby_errinfo = errinfo;
-	}
-	if (state) JUMP_TAG(state);
+        result = eval_ensure(self,node);
 	break;
 
       case NODE_AND:
@@ -3387,56 +4039,20 @@
 	goto again;
 
       case NODE_NOT:
-	if (RTEST(rb_eval(self, node->nd_body))) result = Qfalse;
-	else result = Qtrue;
+	result = RTEST(rb_eval(self, node->nd_body)) ? Qfalse : Qtrue;
 	break;
 
       case NODE_DOT2:
       case NODE_DOT3:
-        {
-	    VALUE beg = rb_eval(self, node->nd_beg);
-	    VALUE end = rb_eval(self, node->nd_end);
-	    result = rb_range_new(beg, end, nd_type(node) == NODE_DOT3);
-	}	
-	break;
+        result = eval_dot(self,node);
+        break;
 
       case NODE_FLIP2:		/* like AWK */
-	{
-	    VALUE *flip = rb_svar(node->nd_cnt);
-	    if (!flip) rb_bug("unexpected local variable");
-	    if (!RTEST(*flip)) {
-		if (RTEST(rb_eval(self, node->nd_beg))) {
-		    *flip = RTEST(rb_eval(self, node->nd_end))?Qfalse:Qtrue;
-		    result = Qtrue;
-		}
-		else {
-		    result = Qfalse;
-		}
-	    }
-	    else {
-		if (RTEST(rb_eval(self, node->nd_end))) {
-		    *flip = Qfalse;
-		}
-		result = Qtrue;
-	    }
-	}
+        result = eval_flip2(self,node);
 	break;
 
       case NODE_FLIP3:		/* like SED */
-	{
-	    VALUE *flip = rb_svar(node->nd_cnt);
-	    if (!flip) rb_bug("unexpected local variable");
-	    if (!RTEST(*flip)) {
-		result = RTEST(rb_eval(self, node->nd_beg)) ? Qtrue : Qfalse;
-		*flip = result;
-	    }
-	    else {
-		if (RTEST(rb_eval(self, node->nd_end))) {
-		    *flip = Qfalse;
-		}
-		result = Qtrue;
-	    }
-	}
+        result = eval_flip3(self,node);
 	break;
 
       case NODE_RETURN:
@@ -3444,75 +4060,25 @@
 	break;
 
       case NODE_ARGSCAT:
-	{
-	    VALUE args = rb_eval(self, node->nd_head);
-	    result = rb_ary_concat(args, splat_value(rb_eval(self, node->nd_body)));
-	}
+	result = rb_eval(self, node->nd_head);
+	result = rb_ary_concat(result, splat_value(rb_eval(self, node->nd_body)));
 	break;
 
       case NODE_ARGSPUSH:
-	{
-	    VALUE args = rb_ary_dup(rb_eval(self, node->nd_head));
-	    result = rb_ary_push(args, rb_eval(self, node->nd_body));
-	}
+	result = rb_ary_dup(rb_eval(self, node->nd_head));
+	result = rb_ary_push(result, rb_eval(self, node->nd_body));
 	break;
 
       case NODE_ATTRASGN:
-	{
-	    VALUE recv;
-	    int argc; VALUE *argv; /* used in SETUP_ARGS */
-	    int scope;
-	    TMP_PROTECT;
-
-	    BEGIN_CALLARGS;
-	    if (node->nd_recv == (NODE *)1) {
-		recv = self;
-		scope = 1;
-	    }
-	    else {
-		recv = rb_eval(self, node->nd_recv);
-		scope = 0;
-	    }
-	    SETUP_ARGS(node->nd_args);
-	    END_CALLARGS;
-
-	    ruby_current_node = node;
-	    SET_CURRENT_SOURCE();
-	    rb_call(CLASS_OF(recv),recv,node->nd_mid,argc,argv,scope,self);
-	    result = argv[argc-1];
-	}
-	break;
+        result = eval_attrasgn(self,node);
+        break;
 
       case NODE_CALL:
-	{
-	    VALUE recv;
-	    int argc; VALUE *argv; /* used in SETUP_ARGS */
-	    TMP_PROTECT;
-
-	    BEGIN_CALLARGS;
-	    recv = rb_eval(self, node->nd_recv);
-	    SETUP_ARGS(node->nd_args);
-	    END_CALLARGS;
-
-	    ruby_current_node = node;
-	    SET_CURRENT_SOURCE();
-	    result = rb_call(CLASS_OF(recv),recv,node->nd_mid,argc,argv,0,self);
-	}
+        result = eval_call(self,node);
 	break;
 
       case NODE_FCALL:
-	{
-	    int argc; VALUE *argv; /* used in SETUP_ARGS */
-	    TMP_PROTECT;
-
-	    BEGIN_CALLARGS;
-	    SETUP_ARGS(node->nd_args);
-	    END_CALLARGS;
-
-	    ruby_current_node = node;
-	    SET_CURRENT_SOURCE();
-	    result = rb_call(CLASS_OF(self),self,node->nd_mid,argc,argv,1,self);
-	}
+        result = eval_fcall(self,node);
 	break;
 
       case NODE_VCALL:
@@ -3522,142 +4088,19 @@
 
       case NODE_SUPER:
       case NODE_ZSUPER:
-	{
-	    int argc; VALUE *argv; /* used in SETUP_ARGS */
-	    TMP_PROTECT;
-
-	    if (ruby_frame->last_class == 0) {
-		if (ruby_frame->last_func) {
-		    rb_name_error(ruby_frame->last_func,
-				  "superclass method `%s' disabled",
-				  rb_id2name(ruby_frame->orig_func));
-		}
-		else {
-		    rb_raise(rb_eNoMethodError, "super called outside of method");
-		}
-	    }
-	    if (nd_type(node) == NODE_ZSUPER) {
-		argc = ruby_frame->argc;
-		if (argc && DMETHOD_P()) {
-		    if (TYPE(RBASIC(ruby_scope)->klass) != T_ARRAY ||
-			RARRAY(RBASIC(ruby_scope)->klass)->len != argc) {
-			rb_raise(rb_eRuntimeError, 
-				 "super: specify arguments explicitly");
-		    }
-		    argv = RARRAY(RBASIC(ruby_scope)->klass)->ptr;
-		}
-		else if (!ruby_scope->local_vars) {
-		    argc = 0;
-		    argv = 0;
-		}
-		else {
-		    argv = ruby_scope->local_vars + 2;
-		}
-	    }
-	    else {
-		BEGIN_CALLARGS;
-		SETUP_ARGS(node->nd_args);
-		END_CALLARGS;
-		ruby_current_node = node;
-	    }
-
-	    SET_CURRENT_SOURCE();
-	    result = rb_call_super(argc, argv);
-	}
+        result = eval_super(self,node);
 	break;
 
       case NODE_SCOPE:
-	{
-	    struct FRAME frame;
-	    NODE *saved_cref = 0;
-
-	    frame = *ruby_frame;
-	    frame.tmp = ruby_frame;
-	    ruby_frame = &frame;
-
-	    PUSH_SCOPE();
-	    PUSH_TAG(PROT_NONE);
-	    if (node->nd_rval) {
-		saved_cref = ruby_cref;
-		ruby_cref = (NODE*)node->nd_rval;
-	    }
-	    if (node->nd_tbl) {
-		VALUE *vars = ALLOCA_N(VALUE, node->nd_tbl[0]+1);
-		*vars++ = (VALUE)node;
-		ruby_scope->local_vars = vars;
-		rb_mem_clear(ruby_scope->local_vars, node->nd_tbl[0]);
-		ruby_scope->local_tbl = node->nd_tbl;
-	    }
-	    else {
-		ruby_scope->local_vars = 0;
-		ruby_scope->local_tbl  = 0;
-	    }
-	    if ((state = EXEC_TAG()) == 0) {
-		result = rb_eval(self, node->nd_next);
-	    }
-	    POP_TAG();
-	    POP_SCOPE();
-	    ruby_frame = frame.tmp;
-	    if (saved_cref)
-		ruby_cref = saved_cref;
-	    if (state) JUMP_TAG(state);
-	}
-	break;
+        result = eval_scope(self,node);
+        break;
 
       case NODE_OP_ASGN1:
-	{
-	    int argc; VALUE *argv; /* used in SETUP_ARGS */
-	    VALUE recv, val, tmp;
-	    NODE *rval;
-	    TMP_PROTECT;
-
-	    recv = rb_eval(self, node->nd_recv);
-	    rval = node->nd_args->nd_head;
-	    SETUP_ARGS0(node->nd_args->nd_body, 1);
-	    val = rb_funcall3(recv, aref, argc, argv);
-	    switch (node->nd_mid) {
-	    case 0: /* OR */
-	      if (RTEST(val)) RETURN(val);
-	      val = rb_eval(self, rval);
-	      break;
-	    case 1: /* AND */
-	      if (!RTEST(val)) RETURN(val);
-	      val = rb_eval(self, rval);
-	      break;
-	    default:
-	      tmp = rb_eval(self, rval);
-	      val = rb_funcall3(val, node->nd_mid, 1, &tmp);
-	    }
-	    argv[argc] = val;
-	    rb_funcall2(recv, aset, argc+1, argv);
-	    result = val;
-	}
+        result = eval_op_asgn1(self,node);
 	break;
 
       case NODE_OP_ASGN2:
-	{
-	    ID id = node->nd_next->nd_vid;
-	    VALUE recv, val, tmp;
-
-	    recv = rb_eval(self, node->nd_recv);
-	    val = rb_funcall3(recv, id, 0, 0);
-	    switch (node->nd_next->nd_mid) {
-	    case 0: /* OR */
-	      if (RTEST(val)) RETURN(val);
-	      val = rb_eval(self, node->nd_value);
-	      break;
-	    case 1: /* AND */
-	      if (!RTEST(val)) RETURN(val);
-	      val = rb_eval(self, node->nd_value);
-	      break;
-	    default:
-	      tmp = rb_eval(self, node->nd_value);
-	      val = rb_funcall3(val, node->nd_next->nd_mid, 1, &tmp);
-	    }
-
-	    rb_funcall2(recv, node->nd_next->nd_aid, 1, &val);
-	    result = val;
-	}
+        result = eval_op_asgn2(self,node);
 	break;
 
       case NODE_OP_ASGN_AND:
@@ -3706,26 +4149,21 @@
 	break;
 
       case NODE_CDECL:
-	result = rb_eval(self, node->nd_value);
-	if (node->nd_vid == 0) {
-	    rb_const_set(class_prefix(self, node->nd_else), node->nd_else->nd_mid, result);
-	}
-	else {
-	    rb_const_set(ruby_cbase, node->nd_vid, result);
-	}
+        result = rb_eval(self, node->nd_value);
+        eval_cdecl(self, node, result);
 	break;
 
       case NODE_CVDECL:
 	if (NIL_P(ruby_cbase)) {
 	    rb_raise(rb_eTypeError, "no class/module to define class variable");
 	}
-	result = rb_eval(self, node->nd_value);
-	rb_cvar_set(cvar_cbase(), node->nd_vid, result, Qtrue);
+        result = rb_eval(self, node->nd_value);
+        eval_cvar_set(result, node, Qtrue);
 	break;
 
       case NODE_CVASGN:
-	result = rb_eval(self, node->nd_value);
-	rb_cvar_set(cvar_cbase(), node->nd_vid, result, Qfalse);
+        result = rb_eval(self, node->nd_value);
+        eval_cvar_set(result, node, Qfalse);
 	break;
 
       case NODE_LVAR:
@@ -3768,26 +4206,21 @@
 	break;
 
       case NODE_COLON2:
-	{
-	    VALUE klass;
-
-	    klass = rb_eval(self, node->nd_head);
-	    if (rb_is_const_id(node->nd_mid)) {
-		switch (TYPE(klass)) {
-		  case T_CLASS:
-		  case T_MODULE:
-		    result = rb_const_get_from(klass, node->nd_mid);
-		    break;
-		  default:
-		    rb_raise(rb_eTypeError, "%s is not a class/module",
-			     RSTRING(rb_obj_as_string(klass))->ptr);
-		    break;
-		}
-	    }
-	    else {
-		result = rb_funcall(klass, node->nd_mid, 0, 0);
+	result = rb_eval(self, node->nd_head);
+	if (rb_is_const_id(node->nd_mid)) {
+	    switch (TYPE(result)) {
+	      case T_CLASS:
+	      case T_MODULE:
+		result = rb_const_get_from(result, node->nd_mid);
+		break;
+	      default:
+		rb_raise(rb_eTypeError, "%s is not a class/module",
+			 RSTRING(rb_obj_as_string(result))->ptr);
+		break;
 	    }
 	}
+	else
+	    result = rb_funcall(result, node->nd_mid, 0, 0);
 	break;
 
       case NODE_COLON3:
@@ -3818,23 +4251,7 @@
 	break;
 
       case NODE_HASH:
-	{
-	    NODE *list;
-	    VALUE hash = rb_hash_new();
-	    VALUE key, val;
-
-	    list = node->nd_head;
-	    while (list) {
-		key = rb_eval(self, list->nd_head);
-		list = list->nd_next;
-		if (list == 0)
-		    rb_bug("odd number list for Hash");
-		val = rb_eval(self, list->nd_head);
-		list = list->nd_next;
-		rb_hash_aset(hash, key, val);
-	    }
-	    result = hash;
-	}
+        result = eval_hash(self,node);
 	break;
 
       case NODE_ZARRAY:		/* zero length list */
@@ -3842,19 +4259,7 @@
 	break;
 
       case NODE_ARRAY:
-	{
-	    VALUE ary;
-	    long i;
-
-	    i = node->nd_alen;
-	    ary = rb_ary_new2(i);
-	    for (i=0;node;node=node->nd_next) {
-		RARRAY(ary)->ptr[i++] = rb_eval(self, node->nd_head);
-		RARRAY(ary)->len = i;
-	    }
-
-	    result = ary;
-	}
+        result = eval_array(self,node);
 	break;
 
       case NODE_STR:
@@ -3870,51 +4275,8 @@
       case NODE_DREGX:
       case NODE_DREGX_ONCE:
       case NODE_DSYM:
-	{
-	    VALUE str, str2;
-	    NODE *list = node->nd_next;
-
-	    str = rb_str_new3(node->nd_lit);
-	    while (list) {
-		if (list->nd_head) {
-		    switch (nd_type(list->nd_head)) {
-		      case NODE_STR:
-			str2 = list->nd_head->nd_lit;
-			break;
-		      default:
-			str2 = rb_eval(self, list->nd_head);
-			break;
-		    }
-		    rb_str_append(str, str2);
-		    OBJ_INFECT(str, str2);
-		}
-		list = list->nd_next;
-	    }
-	    switch (nd_type(node)) {
-	      case NODE_DREGX:
-		result = rb_reg_new(RSTRING(str)->ptr, RSTRING(str)->len,
-				    node->nd_cflag);
-		break;
-	      case NODE_DREGX_ONCE:	/* regexp expand once */
-		result = rb_reg_new(RSTRING(str)->ptr, RSTRING(str)->len,
-				    node->nd_cflag);
-		nd_set_type(node, NODE_LIT);
-		node->nd_lit = result;
-		break;
-	      case NODE_LIT:
-		/* other thread may replace NODE_DREGX_ONCE to NODE_LIT */
-		goto again;
-	      case NODE_DXSTR:
-		result = rb_funcall(self, '`', 1, str);
-		break;
-	      case NODE_DSYM:
-		result = rb_str_intern(str);
-		break;
-	      default:
-		result = str;
-		break;
-	    }
-	}
+        result = eval_slit(self, node);
+        if (result == Qundef) goto again;
 	break;
 
       case NODE_XSTR:
@@ -3926,84 +4288,13 @@
 	break;
 
       case NODE_DEFN:
-	if (node->nd_defn) {
-	    NODE *body,  *defn;
-	    VALUE origin = 0;
-	    int noex;
-
-	    if (NIL_P(ruby_class)) {
-		rb_raise(rb_eTypeError, "no class/module to add method");
-	    }
-	    if (ruby_class == rb_cObject && node->nd_mid == init) {
-		rb_warn("redefining Object#initialize may cause infinite loop");
-	    }
-	    if (node->nd_mid == __id__ || node->nd_mid == __send__) {
-		rb_warn("redefining `%s' may cause serious problem",
-			rb_id2name(node->nd_mid));
-	    }
-	    rb_frozen_class_p(ruby_class);
-	    body = search_method(ruby_class, node->nd_mid, &origin);
-	    if (body){
-		if (RTEST(ruby_verbose) && ruby_class == origin && body->nd_cnt == 0 && body->nd_body) {
-		    rb_warning("method redefined; discarding old %s", rb_id2name(node->nd_mid));
-		}
-	    }
-
-	    if (SCOPE_TEST(SCOPE_PRIVATE) || node->nd_mid == init) {
-		noex = NOEX_PRIVATE;
-	    }
-	    else if (SCOPE_TEST(SCOPE_PROTECTED)) {
-		noex = NOEX_PROTECTED;
-	    }
-	    else {
-		noex = NOEX_PUBLIC;
-	    }
-	    if (body && origin == ruby_class && body->nd_body == 0) {
-		noex |= NOEX_NOSUPER;
-	    }
-
-	    defn = rb_copy_node_scope(node->nd_defn, ruby_cref);
-	    rb_add_method(ruby_class, node->nd_mid, defn, noex);
-	    if (scope_vmode == SCOPE_MODFUNC) {
-		rb_add_method(rb_singleton_class(ruby_class),
-			      node->nd_mid, defn, NOEX_PUBLIC);
-	    }
-	    result = Qnil;
-	}
+	if (node->nd_defn)
+          eval_defn(self,node);
 	break;
 
       case NODE_DEFS:
-	if (node->nd_defn) {
-	    VALUE recv = rb_eval(self, node->nd_recv);
-	    VALUE klass;
-	    NODE *body = 0, *defn;
-
-	    if (ruby_safe_level >= 4 && !OBJ_TAINTED(recv)) {
-		rb_raise(rb_eSecurityError, "Insecure: can't define singleton method");
-	    }
-	    if (FIXNUM_P(recv) || SYMBOL_P(recv)) {
-		rb_raise(rb_eTypeError,
-			 "can't define singleton method \"%s\" for %s",
-			 rb_id2name(node->nd_mid),
-			 rb_obj_classname(recv));
-	    }
-
-	    if (OBJ_FROZEN(recv)) rb_error_frozen("object");
-	    klass = rb_singleton_class(recv);
-	    if (st_lookup(RCLASS(klass)->m_tbl, node->nd_mid, &data)) {
-		body = (NODE *)data;
-		if (ruby_safe_level >= 4) {
-		    rb_raise(rb_eSecurityError, "redefining method prohibited");
-		}
-		if (RTEST(ruby_verbose)) {
-		    rb_warning("redefine %s", rb_id2name(node->nd_mid));
-		}
-	    }
-	    defn = rb_copy_node_scope(node->nd_defn, ruby_cref);
-	    rb_add_method(klass, node->nd_mid, defn,
-			  NOEX_PUBLIC|(body?body->nd_noex&NOEX_UNDEF:0));
-	    result = Qnil;
-	}
+	if (node->nd_defn) 
+          eval_defs(self,node);
 	break;
 
       case NODE_UNDEF:
@@ -4011,7 +4302,6 @@
 	    rb_raise(rb_eTypeError, "no class to undef method");
 	}
 	rb_undef(ruby_class, rb_to_id(rb_eval(self, node->u2.node)));
-	result = Qnil;
 	break;
 
       case NODE_ALIAS:
@@ -4020,134 +4310,26 @@
 	}
 	rb_alias(ruby_class, rb_to_id(rb_eval(self, node->u1.node)),
 		             rb_to_id(rb_eval(self, node->u2.node)));
-	result = Qnil;
 	break;
 
       case NODE_VALIAS:
 	rb_alias_variable(node->u1.id, node->u2.id);
-	result = Qnil;
 	break;
 
       case NODE_CLASS:
-	{
-	    VALUE super, klass, tmp, cbase;
-	    ID cname;
-	    int gen = Qfalse;
-
-	    cbase = class_prefix(self, node->nd_cpath);
-	    cname = node->nd_cpath->nd_mid;
-
-	    if (NIL_P(ruby_cbase)) {
-		rb_raise(rb_eTypeError, "no outer class/module");
-	    }
-	    if (node->nd_super) {
-	       super = rb_eval(self, node->nd_super);
-	       rb_check_inheritable(super);
-	    }
-	    else {
-		super = 0;
-	    }
-
-	    if (rb_const_defined_at(cbase, cname)) {
-		klass = rb_const_get_at(cbase, cname);
-		if (TYPE(klass) != T_CLASS) {
-		    rb_raise(rb_eTypeError, "%s is not a class",
-			     rb_id2name(cname));
-		}
-		if (super) {
-		    tmp = rb_class_real(RCLASS(klass)->super);
-		    if (tmp != super) {
-			rb_raise(rb_eTypeError, "superclass mismatch for class %s",
-				 rb_id2name(cname));
-		    }
-		    super = 0;
-		}
-		if (ruby_safe_level >= 4) {
-		    rb_raise(rb_eSecurityError, "extending class prohibited");
-		}
-	    }
-	    else {
-		if (!super) super = rb_cObject;
-		klass = rb_define_class_id(cname, super);
-		rb_set_class_path(klass, cbase, rb_id2name(cname));
-		rb_const_set(cbase, cname, klass);
-		gen = Qtrue;
-	    }
-	    if (ruby_wrapper) {
-		rb_extend_object(klass, ruby_wrapper);
-		rb_include_module(klass, ruby_wrapper);
-	    }
-	    if (super && gen) {
-		rb_class_inherited(super, klass);
-	    }
-	    result = module_setup(klass, node);
-	}
+        result = eval_class(self,node);
 	break;
 
       case NODE_MODULE:
-	{
-	    VALUE module, cbase;
-	    ID cname;
-
-	    if (NIL_P(ruby_cbase)) {
-		rb_raise(rb_eTypeError, "no outer class/module");
-	    }
-	    cbase = class_prefix(self, node->nd_cpath);
-	    cname = node->nd_cpath->nd_mid;
-	    if (rb_const_defined_at(cbase, cname)) {
-		module = rb_const_get_at(cbase, cname);
-		if (TYPE(module) != T_MODULE) {
-		    rb_raise(rb_eTypeError, "%s is not a module",
-			     rb_id2name(cname));
-		}
-		if (ruby_safe_level >= 4) {
-		    rb_raise(rb_eSecurityError, "extending module prohibited");
-		}
-	    }
-	    else {
-		module = rb_define_module_id(cname);
-		rb_set_class_path(module, cbase, rb_id2name(cname));
-		rb_const_set(cbase, cname, module);
-	    }
-	    if (ruby_wrapper) {
-		rb_extend_object(module, ruby_wrapper);
-		rb_include_module(module, ruby_wrapper);
-	    }
-
-	    result = module_setup(module, node);
-	}
+        result = eval_module(self,node);
 	break;
 
       case NODE_SCLASS:
-	{
-	    VALUE klass;
-
-	    result = rb_eval(self, node->nd_recv);
-	    if (FIXNUM_P(result) || SYMBOL_P(result)) {
-		rb_raise(rb_eTypeError, "no virtual class for %s",
-			 rb_obj_classname(result));
-	    }
-	    if (ruby_safe_level >= 4 && !OBJ_TAINTED(result))
-		rb_raise(rb_eSecurityError, "Insecure: can't extend object");
-	    klass = rb_singleton_class(result);
-
-	    if (ruby_wrapper) {
-		rb_extend_object(klass, ruby_wrapper);
-		rb_include_module(klass, ruby_wrapper);
-	    }
-
-	    result = module_setup(klass, node);
-	}
+        result = eval_sclass(self,node);
 	break;
 
       case NODE_DEFINED:
-	{
-	    char buf[20];
-	    const char *desc = is_defined(self, node->nd_head, buf);
-
-	    if (desc) result = rb_str_new2(desc);
-	    else result = Qnil;
-	}
+        result = eval_defined(self,node);
 	break;
 
       case NODE_NEWLINE:
@@ -4160,14 +4342,8 @@
       default:
 	unknown_node(node);
     }
-  finish:
-    CHECK_INTS;
-    if (contnode) {
-	node = contnode;
-	contnode = 0;
-	goto again;
-    }
-    return result;
+  }
+  return result;
 }
 
 static VALUE
@@ -13081,6 +13257,32 @@
 
 VALUE rb_cCont;
 
+
+static rb_thread_t prep4callcc(void)
+{
+  rb_thread_t th;
+  struct tag *tag;
+  struct RVarmap *vars;
+
+  THREAD_ALLOC(th);
+  /* must finish th initialization before any possible gc */
+  th->thread = curr_thread->thread;    /* brent@mbari.org */
+  th->thgroup = cont_protect;
+
+  scope_dup(ruby_scope);
+  for (tag=prot_tag; tag; tag=tag->prev) {
+      if (tag->tag == PROT_THREAD) break;
+      scope_dup(tag->scope);
+  }
+
+  for (vars = ruby_dyna_vars; vars; vars = vars->next) {
+      if (FL_TEST(vars, DVAR_DONT_RECYCLE)) break;
+      FL_SET(vars, DVAR_DONT_RECYCLE);
+  }
+  return th;
+}
+
+
 /*
  *  call-seq:
  *     callcc {|cont| block }   =>  obj
@@ -13099,37 +13301,14 @@
 rb_callcc(self)
     VALUE self;
 {
-    volatile VALUE cont;
-    rb_thread_t th;
-    volatile rb_thread_t th_save;
-    struct tag *tag;
-    struct RVarmap *vars;
-
-    THREAD_ALLOC(th);
-    /* must finish th initialization before any possible gc */
-    th->thread = curr_thread->thread;    /* brent@mbari.org */
-    th->thgroup = cont_protect;
-    cont = Data_Wrap_Struct(rb_cCont, cc_mark, thread_free, th);
-
-    scope_dup(ruby_scope);
-    for (tag=prot_tag; tag; tag=tag->prev) {
-        if (tag->tag == PROT_THREAD) break;
-	scope_dup(tag->scope);
-    }
-
-    for (vars = ruby_dyna_vars; vars; vars = vars->next) {
-	if (FL_TEST(vars, DVAR_DONT_RECYCLE)) break;
-	FL_SET(vars, DVAR_DONT_RECYCLE);
-    }
-    th_save = th;
-    if (THREAD_SAVE_CONTEXT(th)) {
-	return th_save->result;
-    }
-    else {
-	return rb_yield(cont);
-    }
+    rb_thread_t th = prep4callcc();
+    return THREAD_SAVE_CONTEXT(th) ?
+      th->result
+          :
+      rb_yield(Data_Wrap_Struct(rb_cCont, cc_mark, thread_free, th));
 }
 
+
 /*
  *  call-seq:
  *     cont.call(args, ...) 
diff -rux '*.o' ruby-1.8.7-p72/version.h ruby-1.8.7-mbari/version.h
--- ruby-1.8.7-p72/version.h	2008-12-16 00:47:26.000000000 -0800
+++ ruby-1.8.7-mbari/version.h	2008-12-16 20:02:42.000000000 -0800
@@ -1,7 +1,7 @@
 #define RUBY_VERSION "1.8.7"
-#define RUBY_RELEASE_DATE "2008-12-13"
+#define RUBY_RELEASE_DATE "2008-12-16"
 #define RUBY_VERSION_CODE 187
-#define RUBY_RELEASE_CODE 20081213
+#define RUBY_RELEASE_CODE 20081216
 #define RUBY_PATCHLEVEL 72
 
 #define RUBY_VERSION_MAJOR 1
@@ -9,7 +9,7 @@
 #define RUBY_VERSION_TEENY 7
 #define RUBY_RELEASE_YEAR 2008
 #define RUBY_RELEASE_MONTH 12
-#define RUBY_RELEASE_DAY 13
+#define RUBY_RELEASE_DAY 16
 
 #ifdef RUBY_EXTERN
 RUBY_EXTERN const char ruby_version[];
@@ -25,7 +25,7 @@
 #define RUBY_BIRTH_MONTH 2
 #define RUBY_BIRTH_DAY 24
 
-#define RUBY_RELEASE_STR "MBARI 3 on patchlevel"
+#define RUBY_RELEASE_STR "MBARI 4 on patchlevel"
 #define RUBY_RELEASE_NUM RUBY_PATCHLEVEL
 
 
src/rvm/patches/ruby/1.8.7/p72/mbari-5.patch000066400000014257147511530530014126 0ustar00diff -rux '*.o' ruby-1.8.7-p72/ChangeLog ruby-1.8.7-mbari/ChangeLog
--- ruby-1.8.7-p72/ChangeLog	2008-12-17 23:46:07.000000000 -0800
+++ ruby-1.8.7-mbari/ChangeLog	2008-12-17 23:42:22.000000000 -0800
@@ -1,3 +1,7 @@
+Tue Dec 17  4:15:36 2008  Brent Roman  <brent@mbari.org>
+
+        * eval.c:  streamlined rb_thread_restore_context() to ensure O(1) time
+
 Tue Dec 15  9:15:36 2008  Brent Roman  <brent@mbari.org>
 
         * eval.c:  factored rb_eval() into many separate non-inlined
 
diff -rux '*.o' ruby-1.8.7-p72/eval.c ruby-1.8.7-mbari/eval.c
--- ruby-1.8.7-p72/eval.c	2008-12-17 23:46:07.000000000 -0800
+++ ruby-1.8.7-mbari/eval.c	2008-12-17 23:44:48.000000000 -0800
@@ -3,7 +3,7 @@
   eval.c -
 
   $Author: brent $
-  $Date: 2008/12/17 07:28:08 $
+  $Date: 2008/12/18 07:44:48 $
   created at: Thu Jun 10 14:22:17 JST 1993
 
   Copyright (C) 1993-2003 Yukihiro Matsumoto
@@ -10884,11 +10884,10 @@
                   ruby_setjmp(rb_thread_save_context(th), (th)->context))))
 
 NORETURN(static void rb_thread_restore_context _((rb_thread_t,int)));
-NORETURN(NOINLINE(static void rb_thread_restore_context_0(rb_thread_t,int,void*)));
-NORETURN(NOINLINE(static void stack_extend(rb_thread_t, int, VALUE *)));
+NORETURN(NOINLINE(static void rb_thread_restore_context_0(rb_thread_t,int)));
 
 static void
-rb_thread_restore_context_0(rb_thread_t th, int exit, void *vp)
+rb_thread_restore_context_0(rb_thread_t th, int exit)
 {
     static rb_thread_t tmp;
     static int ex;
@@ -10945,9 +10944,9 @@
 static volatile int C(k), C(l), C(m), C(n), C(o);
 static volatile int C(p), C(q), C(r), C(s), C(t);
 int rb_dummy_false = 0;
-NORETURN(NOINLINE(static void register_stack_extend(rb_thread_t, int, void *, VALUE *)));
+NORETURN(NOINLINE(static void register_stack_extend(rb_thread_t, int, VALUE *)));
 static void
-register_stack_extend(rb_thread_t th, int exit, void *vp, VALUE *curr_bsp)
+register_stack_extend(rb_thread_t th, int exit, VALUE *curr_bsp)
 {
     if (rb_dummy_false) {
         /* use registers as much as possible */
@@ -10961,52 +10960,68 @@
         E(p) = E(q) = E(r) = E(s) = E(t) = 0;
     }
     if (curr_bsp < th->bstr_pos+th->bstr_len) {
-        register_stack_extend(th, exit, &exit, (VALUE*)rb_ia64_bsp());
+        register_stack_extend(th, exit, (VALUE*)rb_ia64_bsp());
     }
-    rb_thread_restore_context_0(th, exit, &exit);
+    rb_thread_restore_context_0(th, exit);
 }
 #undef C
 #undef E
 #endif
 
-# if defined(_MSC_VER) && _MSC_VER >= 1300
-__declspec(noinline) static void stack_extend(rb_thread_t, int, VALUE*);
-# endif
-static void
-stack_extend(rb_thread_t th, int exit, VALUE *addr_in_prev_frame)
-{
-#define STACK_PAD_SIZE 1024
-    VALUE space[STACK_PAD_SIZE];
-
-#if STACK_GROW_DIRECTION < 0
-    if (addr_in_prev_frame > th->stk_pos) stack_extend(th, exit, &space[0]);
-#elif STACK_GROW_DIRECTION > 0
-    if (addr_in_prev_frame < th->stk_pos + th->stk_len) stack_extend(th, exit, &space[STACK_PAD_SIZE-1]);
-#else
-    if (addr_in_prev_frame < rb_gc_stack_start) {
-        /* Stack grows downward */
-        if (addr_in_prev_frame > th->stk_pos) stack_extend(th, exit, &space[0]);
-    }
-    else {
-        /* Stack grows upward */
-        if (addr_in_prev_frame < th->stk_pos + th->stk_len) stack_extend(th, exit, &space[STACK_PAD_SIZE-1]);
-    }
-#endif
-#ifdef __ia64
-    register_stack_extend(th, exit, space, (VALUE*)rb_ia64_bsp());
-#else
-    rb_thread_restore_context_0(th, exit, space);
-#endif
-}
 
 static void
 rb_thread_restore_context(th, exit)
     rb_thread_t th;
     int exit;
 {
+    VALUE *pos = th->stk_start;
+
+#if HAVE_ALLOCA  /* use alloca to grow stack in O(1) time */
     VALUE v;
+    volatile VALUE *space;
+
     if (!th->stk_ptr) rb_bug("unsaved context");
-    stack_extend(th, exit, &v);
+#  if !STACK_GROW_DIRECTION  /* unknown at compile time */
+    if (rb_gc_stack_grow_direction < 0) {
+#  endif
+#  if STACK_GROW_DIRECTION <= 0
+      pos -= th->stk_len;
+      if (&v > pos) space=ALLOCA_N(VALUE, &v-pos);
+#  endif
+#  if !STACK_GROW_DIRECTION
+    }else
+#  endif
+#if STACK_GROW_DIRECTION >= 0  /* stack grows upward */
+      if (&v < pos + th->stk_len) space=ALLOCA_N(VALUE, pos+th->stk_len - &v);
+#  endif
+
+#else  /* recursive O(n/1024) if extending stack > 1024 VALUEs */
+
+    volatile VALUE v[1023];
+
+#  if !STACK_GROW_DIRECTION  /* unknown at compile time */
+    if (rb_gc_stack_grow_direction < 0) {
+#  endif
+#  if STACK_GROW_DIRECTION <= 0
+      pos -= th->stk_len;
+      if (v > pos) rb_thread_restore_context(th, exit);
+#  endif
+#  if !STACK_GROW_DIRECTION
+    }else
+#  endif
+#  if STACK_GROW_DIRECTION >= 0  /* stack grows upward */
+      if (v < pos + th->stk_len) rb_thread_restore_context(th, exit);
+#  endif
+    if (!th->stk_ptr) rb_bug("unsaved context");
+    
+#endif  /* stack now extended */
+
+
+#ifdef __ia64
+    register_stack_extend(th, exit, (VALUE*)rb_ia64_bsp());
+#else
+    rb_thread_restore_context_0(th, exit);
+#endif
 }
 
 static void
diff -rux '*.o' ruby-1.8.7-p72/gc.c ruby-1.8.7-mbari/gc.c
--- ruby-1.8.7-p72/gc.c	2008-12-20 22:34:10.000000000 -0800
+++ ruby-1.8.7-mbari/gc.c	2008-12-17 23:43:46.000000000 -0800
@@ -3,7 +3,7 @@
   gc.c -
 
   $Author: brent $
-  $Date: 2008/12/14 07:23:34 $
+  $Date: 2008/12/18 07:43:46 $
   created at: Tue Oct  5 09:44:46 JST 1993
 
   Copyright (C) 1993-2003 Yukihiro Matsumoto
diff -rux '*.o' ruby-1.8.7-p72/version.h ruby-1.8.7-mbari/version.h
--- ruby-1.8.7-p72/version.h	2008-12-17 23:46:07.000000000 -0800
+++ ruby-1.8.7-mbari/version.h	2008-12-17 22:32:11.000000000 -0800
@@ -1,7 +1,7 @@
 #define RUBY_VERSION "1.8.7"
-#define RUBY_RELEASE_DATE "2008-12-16"
+#define RUBY_RELEASE_DATE "2008-12-17"
 #define RUBY_VERSION_CODE 187
-#define RUBY_RELEASE_CODE 20081216
+#define RUBY_RELEASE_CODE 20081217
 #define RUBY_PATCHLEVEL 72
 
 #define RUBY_VERSION_MAJOR 1
@@ -9,7 +9,7 @@
 #define RUBY_VERSION_TEENY 7
 #define RUBY_RELEASE_YEAR 2008
 #define RUBY_RELEASE_MONTH 12
-#define RUBY_RELEASE_DAY 16
+#define RUBY_RELEASE_DAY 17
 
 #ifdef RUBY_EXTERN
 RUBY_EXTERN const char ruby_version[];
@@ -25,7 +25,7 @@
 #define RUBY_BIRTH_MONTH 2
 #define RUBY_BIRTH_DAY 24
 
-#define RUBY_RELEASE_STR "MBARI 4 on patchlevel"
+#define RUBY_RELEASE_STR "MBARI 5 on patchlevel"
 #define RUBY_RELEASE_NUM RUBY_PATCHLEVEL
src/rvm/patches/ruby/1.8.7/p72/mbari-6.patch000066400000015125147511530530014122 0ustar00diff -rux '*.o' ruby-1.8.7-p72/ChangeLog ruby-1.8.7-mbari/ChangeLog
--- ruby-1.8.7-p72/ChangeLog	2008-12-19 23:42:15.000000000 -0800
+++ ruby-1.8.7-mbari/ChangeLog	2008-12-19 23:52:11.000000000 -0800
@@ -1,7 +1,14 @@
+Tue Dec 19 20:15:36 2008  Brent Roman  <brent@mbari.org>
+
+        * eval.c:  added (Method|Proc)#(__line__|__file__) methods
+                   call ruby_set_current_source() before adding method nodes
+
+
 Tue Dec 17  4:15:36 2008  Brent Roman  <brent@mbari.org>
 
         * eval.c:  streamlined rb_thread_restore_context() to ensure O(1) time
 
+
 Tue Dec 15  9:15:36 2008  Brent Roman  <brent@mbari.org>
 
         * eval.c:  factored rb_eval() into many separate non-inlined
diff -rux '*.o' ruby-1.8.7-p72/eval.c ruby-1.8.7-mbari/eval.c
--- ruby-1.8.7-p72/eval.c	2008-12-19 23:42:15.000000000 -0800
+++ ruby-1.8.7-mbari/eval.c	2008-12-19 23:47:22.000000000 -0800
@@ -3,7 +3,7 @@
   eval.c -
 
   $Author: brent $
-  $Date: 2008/12/18 07:44:48 $
+  $Date: 2008/12/20 07:47:22 $
   created at: Thu Jun 10 14:22:17 JST 1993
 
   Copyright (C) 1993-2003 Yukihiro Matsumoto
@@ -726,6 +726,7 @@
     if (!name) {
 	rb_raise(rb_eArgError, "argument needs to be symbol or string");
     }
+    ruby_set_current_source(); /* for Method#__line__ */
     len = strlen(name)+2;
     buf = ALLOCA_N(char,len);
     snprintf(buf, len, "@%s", name);
@@ -2248,7 +2249,10 @@
     NODE *node;
     NODE *rval;
 {
-    NODE *copy = NEW_NODE(NODE_SCOPE,0,rval,node->nd_next);
+    NODE *copy;
+    
+    ruby_set_current_source();  /* for Method#__line__ */
+    copy=NEW_NODE(NODE_SCOPE,0,rval,node->nd_next);
 
     if (node->nd_tbl) {
 	copy->nd_tbl = ALLOC_N(ID, node->nd_tbl[0]+1);
@@ -3878,7 +3882,8 @@
   result = Qnil;
   if (node) {
     ruby_current_node = node;
-    
+    SET_CURRENT_SOURCE();
+
     switch (nd_type(node)) {
       case NODE_BLOCK:
 	while (node->nd_next) {
@@ -10119,6 +10124,7 @@
     else {
 	rb_raise(rb_eArgError, "wrong number of arguments (%d for 1)", argc);
     }
+    ruby_set_current_source(); /* for Method#__line__ */
     if (RDATA(body)->dmark == (RUBY_DATA_FUNC)bm_mark) {
 	node = NEW_DMETHOD(method_unbind(body));
     }
@@ -10150,6 +10156,98 @@
     return body;
 }
 
+
+/*
+ * call-seq:
+ *    meth.__file__  => String  
+ *
+ * returns the filename containing this method's definition
+ * raises ArgumentError if method has no associated ruby source code
+ */
+ 
+static VALUE
+method_source_file_name(VALUE method)
+{
+    struct METHOD *data;
+    NODE *node;
+
+    Data_Get_Struct(method, struct METHOD, data);   
+    if (node = data->body) {
+      const char *filename = node->nd_file;
+      if (filename)
+        return rb_str_new2(filename);
+    }
+    rb_raise(rb_eArgError, "native Method");
+}
+
+/*
+ * call-seq:
+ *    meth.__line__  => Fixnum  
+ *
+ * returns the starting line number of this method
+ * raises ArgumentError if method has no associated ruby source code
+ */
+ 
+static VALUE
+method_source_line(VALUE method)
+{
+    struct METHOD *data;
+    NODE *node;
+
+    Data_Get_Struct(method, struct METHOD, data);
+    if (node = data->body) {
+      int lineno = nd_line(node);
+      if (lineno)
+        return INT2FIX(nd_line(node));
+    }
+    rb_raise(rb_eArgError, "native Method");
+}
+
+
+
+/*
+ * call-seq:
+ *    prc.__file__  => String  
+ *
+ * returns the filename where this proc is defined
+ * raises ArgumentError if proc has no associated ruby source
+ */
+ 
+static VALUE
+proc_source_file_name(VALUE block)
+{
+    struct BLOCK *data;
+    const char *filename;
+    NODE *node;
+
+    Data_Get_Struct(block, struct BLOCK, data);
+    if ((node = data->frame.node) || (node = data->body))
+      return rb_str_new2(node->nd_file);
+    rb_raise(rb_eArgError, "native Proc");
+}
+
+
+/*
+ * call-seq:
+ *    prc.__line__  => Fixnum  
+ *
+ * returns the starting line number of this proc
+ * raises ArgumentError if proc has no associated ruby source code
+ */
+ 
+static VALUE
+proc_source_line(VALUE block)
+{
+    struct BLOCK *data;
+    NODE *node;
+    
+    Data_Get_Struct(block, struct BLOCK, data);
+    if ((node = data->frame.node) || (node = data->body))
+      return INT2FIX( nd_line(node) );
+    rb_raise(rb_eArgError, "native Proc");
+}
+
+
 /*
  *  <code>Proc</code> objects are blocks of code that have been bound to
  *  a set of local variables. Once bound, the code may be called in
@@ -10201,6 +10299,8 @@
     rb_define_method(rb_cProc, "to_s", proc_to_s, 0);
     rb_define_method(rb_cProc, "to_proc", proc_to_self, 0);
     rb_define_method(rb_cProc, "binding", proc_binding, 0);
+    rb_define_method(rb_cProc, "__file__", proc_source_file_name, 0);
+    rb_define_method(rb_cProc, "__line__", proc_source_line, 0);
 
     rb_define_global_function("proc", proc_lambda, 0);
     rb_define_global_function("lambda", proc_lambda, 0);
@@ -10221,6 +10321,8 @@
     rb_define_method(rb_cMethod, "owner", method_owner, 0);
     rb_define_method(rb_cMethod, "unbind", method_unbind, 0);
     rb_define_method(rb_mKernel, "method", rb_obj_method, 1);
+    rb_define_method(rb_cMethod, "__file__", method_source_file_name, 0);
+    rb_define_method(rb_cMethod, "__line__", method_source_line, 0);
 
     rb_cUnboundMethod = rb_define_class("UnboundMethod", rb_cObject);
     rb_undef_alloc_func(rb_cUnboundMethod);
@@ -10233,6 +10335,8 @@
     rb_define_method(rb_cUnboundMethod, "name", method_name, 0);
     rb_define_method(rb_cUnboundMethod, "owner", method_owner, 0);
     rb_define_method(rb_cUnboundMethod, "bind", umethod_bind, 1);
+    rb_define_method(rb_cUnboundMethod, "__file__", method_source_file_name, 0);
+    rb_define_method(rb_cUnboundMethod, "__line__", method_source_line, 0);
     rb_define_method(rb_cModule, "instance_method", rb_mod_method, 1);
 }
 
diff -rux '*.o' ruby-1.8.7-p72/version.h ruby-1.8.7-mbari/version.h
--- ruby-1.8.7-p72/version.h	2008-12-19 23:42:15.000000000 -0800
+++ ruby-1.8.7-mbari/version.h	2008-12-19 23:39:56.000000000 -0800
@@ -1,7 +1,7 @@
 #define RUBY_VERSION "1.8.7"
-#define RUBY_RELEASE_DATE "2008-12-17"
+#define RUBY_RELEASE_DATE "2008-12-21"
 #define RUBY_VERSION_CODE 187
-#define RUBY_RELEASE_CODE 20081217
+#define RUBY_RELEASE_CODE 20081221
 #define RUBY_PATCHLEVEL 72
 
 #define RUBY_VERSION_MAJOR 1
@@ -9,7 +9,7 @@
 #define RUBY_VERSION_TEENY 7
 #define RUBY_RELEASE_YEAR 2008
 #define RUBY_RELEASE_MONTH 12
-#define RUBY_RELEASE_DAY 17
+#define RUBY_RELEASE_DAY 21
 
 #ifdef RUBY_EXTERN
 RUBY_EXTERN const char ruby_version[];
@@ -25,7 +25,7 @@
 #define RUBY_BIRTH_MONTH 2
 #define RUBY_BIRTH_DAY 24
 
-#define RUBY_RELEASE_STR "MBARI 5 on patchlevel"
+#define RUBY_RELEASE_STR "MBARI 6 on patchlevel"
 #define RUBY_RELEASE_NUM RUBY_PATCHLEVEL
 
 
src/rvm/patches/ruby/1.8.7/p72/mbari-1.patch000066400000026747147511530530014131 0ustar00diff -ru ruby-1.8.7-p72/ChangeLog ruby-1.8.7-mbari/ChangeLog
--- ruby-1.8.7-p72/ChangeLog	2008-08-10 17:37:21.000000000 -0700
+++ ruby-1.8.7-mbari/ChangeLog	2008-12-09 01:24:37.000000000 -0800
@@ -1,3 +1,20 @@
+Tue Dec  9  8:11:36 2008  Brent Roman  <brent@mbari.org>
+
+     * eval.c:  added Continuation.thread method
+        * cc_mark frees the continuation's stack if its thread is dead
+          avoids recursive gc that segfaults [see Dec 5th, 2007 ruby-core]
+
+        * added cast in PUSH_FRAME() to eliminate gcc 4.2 compiler warnings    
+                   
+        * THREAD_DATA() replaces rb_thread_check() in most contexts
+        
+        * rb_thread_check now complains when passed a Continuation
+          (no longer need redundant check in thgroup_add()
+        
+        * rb_callcc() assigns th->thread before scope_dup()
+          this avoids segfaults if this scope_dup() triggers a gc pass
+        
+
 Fri Aug  8 10:53:52 2008  Tanaka Akira  <akr@fsij.org>
 
 	* lib/resolv.rb: randomize source port and transaction id.
diff -ru ruby-1.8.7-p72/eval.c ruby-1.8.7-mbari/eval.c
--- ruby-1.8.7-p72/eval.c	2008-08-03 20:24:26.000000000 -0700
+++ ruby-1.8.7-mbari/eval.c	2008-12-10 20:42:40.000000000 -0800
@@ -2,8 +2,8 @@
 
   eval.c -
 
-  $Author: shyouhei $
-  $Date: 2008-08-04 12:24:26 +0900 (Mon, 04 Aug 2008) $
+  $Author: brent $
+  $Date: 2008/12/11 04:42:40 $
   created at: Thu Jun 10 14:22:17 JST 1993
 
   Copyright (C) 1993-2003 Yukihiro Matsumoto
@@ -766,11 +766,11 @@
     _frame.argc = 0;			\
     _frame.flags = 0;			\
     _frame.uniq = frame_unique++;	\
-    ruby_frame = &_frame
+    ruby_frame = (struct FRAME *)&_frame
 
 #define POP_FRAME()  			\
     ruby_current_node = _frame.node;	\
-    ruby_frame = _frame.prev;		\
+    ruby_frame = _frame.prev;           \
 } while (0)
 
 struct BLOCK {
@@ -10485,16 +10485,57 @@
     } END_FOREACH_FROM(main_thread, th);
 }
 
-static void
-thread_free(th)
+
+static inline void
+stack_free(th)
     rb_thread_t th;
 {
-    if (th->stk_ptr) free(th->stk_ptr);
-    th->stk_ptr = 0;
+    if (th->stk_ptr) {
+      free(th->stk_ptr);
+      th->stk_ptr = 0;
+    }
 #ifdef __ia64
-    if (th->bstr_ptr) free(th->bstr_ptr);
-    th->bstr_ptr = 0;
+    if (th->bstr_ptr) {
+      free(th->bstr_ptr);
+      th->bstr_ptr = 0;
+    }
 #endif
+}
+
+static void
+rb_thread_die(th)
+    rb_thread_t th;
+{
+    th->thgroup = 0;
+    th->status = THREAD_KILLED;
+    stack_free(th);
+}
+
+#define THREAD_DATA(threadObject)  ((rb_thread_t)RDATA(threadObject)->data)
+
+static inline void
+cc_purge(cc)
+    rb_thread_t cc;
+{  /* free continuation's stack if it has just died */
+  if (cc->thread != Qnil && THREAD_DATA(cc->thread)->status == THREAD_KILLED) {
+    cc->thread = Qnil;
+    rb_thread_die(cc);  /* can't possibly activate this stack */
+  }  
+}
+
+static void
+cc_mark(cc)
+    rb_thread_t cc;
+{  /* mark this continuation's stack only if its parent thread is still alive */
+  cc_purge(cc);
+  thread_mark(cc);
+}
+
+static void
+thread_free(th)
+    rb_thread_t th;
+{
+    stack_free(th);
     if (th->locals) st_free_table(th->locals);
     if (th->status != THREAD_KILLED) {
 	if (th->prev) th->prev->next = th->next;
@@ -10511,7 +10552,7 @@
 	rb_raise(rb_eTypeError, "wrong argument type %s (expected Thread)",
 		 rb_obj_classname(data));
     }
-    return (rb_thread_t)RDATA(data)->data;
+    return THREAD_DATA(data);
 }
 
 static VALUE rb_thread_raise _((int, VALUE*, rb_thread_t));
@@ -10782,16 +10823,6 @@
 }
 
 static void
-rb_thread_die(th)
-    rb_thread_t th;
-{
-    th->thgroup = 0;
-    th->status = THREAD_KILLED;
-    if (th->stk_ptr) free(th->stk_ptr);
-    th->stk_ptr = 0;
-}
-
-static void
 rb_thread_remove(th)
     rb_thread_t th;
 {
@@ -11454,7 +11485,7 @@
 {
     VALUE limit;
     double delay = DELAY_INFTY;
-    rb_thread_t th = rb_thread_check(thread);
+    rb_thread_t th = THREAD_DATA(thread);
 
     rb_scan_args(argc, argv, "01", &limit);
     if (!NIL_P(limit)) delay = rb_num2dbl(limit);
@@ -11566,7 +11597,7 @@
 rb_thread_wakeup_alive(thread)
     VALUE thread;
 {
-    rb_thread_t th = rb_thread_check(thread);
+    rb_thread_t th = THREAD_DATA(thread);
 
     if (th->status == THREAD_KILLED)
 	return Qnil;
@@ -11641,7 +11672,7 @@
 rb_thread_kill(thread)
     VALUE thread;
 {
-    rb_thread_t th = rb_thread_check(thread);
+    rb_thread_t th = THREAD_DATA(thread);
 
     rb_kill_thread(th, 0);
     return thread;
@@ -11665,7 +11696,7 @@
 rb_thread_kill_bang(thread)
     VALUE thread;
 {
-    rb_thread_t th = rb_thread_check(thread);
+    rb_thread_t th = THREAD_DATA(thread);
     rb_kill_thread(th, THREAD_NO_ENSURE);
     return thread;
 }
@@ -11837,7 +11868,7 @@
 rb_thread_priority(thread)
     VALUE thread;
 {
-    return INT2NUM(rb_thread_check(thread)->priority);
+    return INT2NUM(THREAD_DATA(thread)->priority);
 }
 
 
@@ -11871,7 +11902,7 @@
     rb_thread_t th;
 
     rb_secure(4);
-    th = rb_thread_check(thread);
+    th = THREAD_DATA(thread);
 
     th->priority = NUM2INT(prio);
     rb_thread_schedule();
@@ -11897,7 +11928,7 @@
 {
     rb_thread_t th;
 
-    th = rb_thread_check(thread);
+    th = THREAD_DATA(thread);
     if (th == curr_thread) {
 	return INT2NUM(ruby_safe_level);
     }
@@ -11974,7 +12005,7 @@
 rb_thread_abort_exc(thread)
     VALUE thread;
 {
-    return rb_thread_check(thread)->abort?Qtrue:Qfalse;
+    return THREAD_DATA(thread)->abort?Qtrue:Qfalse;
 }
 
 
@@ -11992,7 +12023,7 @@
     VALUE thread, val;
 {
     rb_secure(4);
-    rb_thread_check(thread)->abort = RTEST(val);
+    THREAD_DATA(thread)->abort = RTEST(val);
     return val;
 }
 
@@ -12011,7 +12042,7 @@
 rb_thread_group(thread)
     VALUE thread;
 {
-    VALUE group = rb_thread_check(thread)->thgroup;
+    VALUE group = THREAD_DATA(thread)->thgroup;
     if (!group) {
 	group = Qnil;
     }
@@ -12397,7 +12428,7 @@
     if (!rb_block_given_p()) {
 	rb_raise(rb_eThreadError, "must be called with a block");
     }
-    th = rb_thread_check(thread);
+    th = THREAD_DATA(thread);
     if (th->stk_max) {
 	NODE *node = th->node;
 	if (!node) {
@@ -12446,7 +12477,7 @@
 rb_thread_value(thread)
     VALUE thread;
 {
-    rb_thread_t th = rb_thread_check(thread);
+    rb_thread_t th = THREAD_DATA(thread);
 
     while (!rb_thread_join(th, DELAY_INFTY));
 
@@ -12481,7 +12512,7 @@
 rb_thread_status(thread)
     VALUE thread;
 {
-    rb_thread_t th = rb_thread_check(thread);
+    rb_thread_t th = THREAD_DATA(thread);
 
     if (rb_thread_dead(th)) {
 	if (!NIL_P(th->errinfo) && (th->flags & RAISED_EXCEPTION))
@@ -12509,7 +12540,7 @@
 rb_thread_alive_p(thread)
     VALUE thread;
 {
-    rb_thread_t th = rb_thread_check(thread);
+    rb_thread_t th = THREAD_DATA(thread);
 
     if (rb_thread_dead(th)) return Qfalse;
     return Qtrue;
@@ -12532,7 +12563,7 @@
 rb_thread_stop_p(thread)
     VALUE thread;
 {
-    rb_thread_t th = rb_thread_check(thread);
+    rb_thread_t th = THREAD_DATA(thread);
 
     if (rb_thread_dead(th)) return Qtrue;
     if (th->status == THREAD_STOPPED) return Qtrue;
@@ -12766,7 +12797,7 @@
     VALUE *argv;
     VALUE thread;
 {
-    rb_thread_t th = rb_thread_check(thread);
+    rb_thread_t th = THREAD_DATA(thread);
 
     if (ruby_safe_level > th->safe) {
 	rb_secure(4);
@@ -12783,7 +12814,7 @@
     rb_thread_t th;
     VALUE val;
 
-    th = rb_thread_check(thread);
+    th = THREAD_DATA(thread);
     if (ruby_safe_level >= 4 && th != curr_thread) {
 	rb_raise(rb_eSecurityError, "Insecure: thread locals");
     }
@@ -12829,7 +12860,7 @@
     ID id;
     VALUE val;
 {
-    rb_thread_t th = rb_thread_check(thread);
+    rb_thread_t th = THREAD_DATA(thread);
 
     if (ruby_safe_level >= 4 && th != curr_thread) {
 	rb_raise(rb_eSecurityError, "Insecure: can't modify thread locals");
@@ -12882,7 +12913,7 @@
 rb_thread_key_p(thread, id)
     VALUE thread, id;
 {
-    rb_thread_t th = rb_thread_check(thread);
+    rb_thread_t th = THREAD_DATA(thread);
 
     if (!th->locals) return Qfalse;
     if (st_lookup(th->locals, rb_to_id(id), 0))
@@ -12918,7 +12949,7 @@
 rb_thread_keys(thread)
     VALUE thread;
 {
-    rb_thread_t th = rb_thread_check(thread);
+    rb_thread_t th = THREAD_DATA(thread);
     VALUE ary = rb_ary_new();
 
     if (th->locals) {
@@ -12939,7 +12970,7 @@
     VALUE thread;
 {
     const char *cname = rb_obj_classname(thread);
-    rb_thread_t th = rb_thread_check(thread);
+    rb_thread_t th = THREAD_DATA(thread);
     const char *status = thread_status_name(th->status);
     VALUE str;
     size_t len = strlen(cname)+7+16+9+1;
@@ -13044,14 +13075,15 @@
     struct RVarmap *vars;
 
     THREAD_ALLOC(th);
-    cont = Data_Wrap_Struct(rb_cCont, thread_mark, thread_free, th);
+    /* must finish th initialization before any possible gc */
+    th->thread = curr_thread->thread;    /* brent@mbari.org */
+    th->thgroup = cont_protect;
+    cont = Data_Wrap_Struct(rb_cCont, cc_mark, thread_free, th);
 
     scope_dup(ruby_scope);
     for (tag=prot_tag; tag; tag=tag->prev) {
 	scope_dup(tag->scope);
     }
-    th->thread = curr_thread->thread;
-    th->thgroup = cont_protect;
 
     for (vars = ruby_dyna_vars; vars; vars = vars->next) {
 	if (FL_TEST(vars, DVAR_DONT_RECYCLE)) break;
@@ -13088,7 +13120,7 @@
     VALUE *argv;
     VALUE cont;
 {
-    rb_thread_t th = rb_thread_check(cont);
+    rb_thread_t th = THREAD_DATA(cont);
 
     if (th->thread != curr_thread->thread) {
 	rb_raise(rb_eRuntimeError, "continuation called across threads");
@@ -13112,6 +13144,30 @@
     return Qnil;
 }
 
+
+/*
+ *  call-seq:
+ *     cont.thread
+ *  
+ *  Returns the thread on which this continuation can be called
+ *              (or nil if that thread has died)
+ *
+ *     t = Thread.new {callcc{|c| $x=c}; sleep 5}
+ *     sleep 1
+ *     $x.thread                             #=> t
+ *     sleep 10
+ *     $x.thread                             #=> nil
+ */
+static VALUE
+rb_cont_thread(cont)
+  VALUE cont;
+{
+  rb_thread_t th = THREAD_DATA(cont);
+  cc_purge(th);
+  return th->thread;
+}
+
+
 struct thgroup {
     int enclosed;
     VALUE group;
@@ -13264,10 +13320,6 @@
 
     rb_secure(4);
     th = rb_thread_check(thread);
-    if (!th->next || !th->prev) {
-	rb_raise(rb_eTypeError, "wrong argument type %s (expected Thread)",
-		 rb_obj_classname(thread));
-    }
 
     if (OBJ_FROZEN(group)) {
       rb_raise(rb_eThreadError, "can't move to the frozen thread group");
@@ -13469,6 +13521,7 @@
     rb_undef_method(CLASS_OF(rb_cCont), "new");
     rb_define_method(rb_cCont, "call", rb_cont_call, -1);
     rb_define_method(rb_cCont, "[]", rb_cont_call, -1);
+    rb_define_method(rb_cCont, "thread", rb_cont_thread, 0);
     rb_define_global_function("callcc", rb_callcc, 0);
     rb_global_variable(&cont_protect);
 
diff -ru ruby-1.8.7-p72/version.h ruby-1.8.7-mbari/version.h
--- ruby-1.8.7-p72/version.h	2008-08-10 17:37:21.000000000 -0700
+++ ruby-1.8.7-mbari/version.h	2008-12-09 00:40:58.000000000 -0800
@@ -1,15 +1,15 @@
 #define RUBY_VERSION "1.8.7"
-#define RUBY_RELEASE_DATE "2008-08-11"
+#define RUBY_RELEASE_DATE "2008-12-09"
 #define RUBY_VERSION_CODE 187
-#define RUBY_RELEASE_CODE 20080811
+#define RUBY_RELEASE_CODE 20081209
 #define RUBY_PATCHLEVEL 72
 
 #define RUBY_VERSION_MAJOR 1
 #define RUBY_VERSION_MINOR 8
 #define RUBY_VERSION_TEENY 7
 #define RUBY_RELEASE_YEAR 2008
-#define RUBY_RELEASE_MONTH 8
-#define RUBY_RELEASE_DAY 11
+#define RUBY_RELEASE_MONTH 12
+#define RUBY_RELEASE_DAY 9
 
 #ifdef RUBY_EXTERN
 RUBY_EXTERN const char ruby_version[];
@@ -25,7 +25,7 @@
 #define RUBY_BIRTH_MONTH 2
 #define RUBY_BIRTH_DAY 24
 
-#define RUBY_RELEASE_STR "patchlevel"
+#define RUBY_RELEASE_STR "MBARI 1 on patchlevel"
 #define RUBY_RELEASE_NUM RUBY_PATCHLEVEL
 
 
src/rvm/patches/ruby/1.8.7/p72/mbari-8b.patch000066400000164200147511530530014265 0ustar00diff --git a/ChangeLog b/ChangeLog
index 4c7e3ac..708f5bc 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,51 @@
+Wed Mar 1 12:01:19 2009  Brent Roman  <brent@mbari.org>
+        
+        * eval.c:  fixed missed volatile qualifiers
+        
+        * version.h:  bumped date, MBARI version 8A --> 8B
+        
+Wed Feb 27 12:01:19 2009  Brent Roman  <brent@mbari.org>
+        
+        * rubysig.c:  added support for __anyPowerPC__
+        
+        * version.h:  bumped date
+
+Wed Feb 25 12:01:19 2009  Brent Roman  <brent@mbari.org>
+
+        * gc.c:  default GC.limit=2e6*sizeof(VALUE)
+        
+        * eval.c:  added RB_GC_GUARDs to eval_slit() & more volatile tweaks
+        
+        * re.c:  removed unneeded volatile qualifier & copy in rb_regcomp()
+        
+        * version.h:  bumped date, MBARI version 7A --> 8A
+
+Tue Feb 24 00:01:19 2009  Brent Roman  <brent@mbari.org>
+
+        * cofigure.in:  added --enable-mbari-api and --with-wipe-sites
+
+        * signal.c:  removed CHECK_INTS after kill
+        
+        * test/ruby/suicide.rb:  add tiny delay to let signal propogate
+        
+        * gc.c:  save regs properly on main stack before marking it!
+        
+        * eval.c:  numerous corrections in use of volatile variables w/setjmp()
+        
+        * version.h:  bumped date, MBARI version 7+ --> 7A
+
+Fri Feb 13 00:01:19 2009  Brent Roman  <brent@mbari.org>
+
+        * signal.c:  CHECK_INTS after kill in case of suicide
+        
+        * version.h:  bumped date
+
+Tue Feb 10 00:01:19 2009  Brent Roman  <brent@mbari.org>
+
+        * gc.c:  don't redundantly mark stack before base of current thread
+        
+        * version.h:  bumped date
+
 Mon Feb 09 00:01:19 2009  Brent Roman  <brent@mbari.org>
 
         * rubysig.h:  default values for STACK_WIPE_SITES if x86_64
diff --git a/configure.in b/configure.in
index fe63c0c..885bfc0 100644
--- a/configure.in
+++ b/configure.in
@@ -151,6 +151,24 @@ AC_ARG_ENABLE(frame-address,
 if test $frame_address = yes; then
     AC_DEFINE(USE_BUILTIN_FRAME_ADDRESS)
 fi
+AC_ARG_ENABLE(mbari-api,
+       [  --enable-mbari-api      enable API changes from the MBARI patches. ],
+       [mbari_api=$enableval])
+if test "$mbari_api" = yes; then
+    AC_DEFINE(MBARI_API)
+fi
+AC_ARG_WITH(wipe-sites,
+[  --with-wipe-sites=MASK  override default STACK_WIPES_SITES mask in rubysig.h],
+[wipe_sites=$withval])
+if test "$wipe_sites" != ""; then
+  case $wipe_sites in
+       none|no)  wipe_sites=0x0;;
+       yes) wipe_sites=;;
+  esac
+  if test -n "$wipe_sites"; then
+    AC_DEFINE_UNQUOTED(STACK_WIPE_SITES,$wipe_sites)
+  fi
+fi
 
 AC_ARG_PROGRAM
 
@@ -1783,7 +1801,7 @@ AC_DEFINE_UNQUOTED(RUBY_SITE_ARCHLIB, "${RUBY_SITE_LIB_PATH2}/${sitearch}")
 AC_DEFINE_UNQUOTED(RUBY_VENDOR_ARCHLIB, "${RUBY_VENDOR_LIB_PATH2}/${sitearch}")
 
 AC_ARG_WITH(search-path,
-		[  --with-search-path=DIR specify the additional search path],
+		[  --with-search-path= DIR specify the additional search path],
 		[search_path=$withval])
 if test "$search_path" != ""; then
     AC_DEFINE_UNQUOTED(RUBY_SEARCH_PATH,"$search_path")
diff --git a/eval.c b/eval.c
index e9ce2b7..a73bd2b 100644
--- a/eval.c
+++ b/eval.c
@@ -221,7 +221,7 @@ static VALUE proc_invoke _((VALUE,VALUE,VALUE,VALUE));
 static VALUE rb_f_binding _((VALUE));
 NOINLINE(static void rb_f_END _((void)));
 static VALUE rb_f_block_given_p _((void));
-static VALUE block_pass _((VALUE,NODE*));
+static VALUE block_pass _((volatile VALUE, NODE *volatile));
 
 VALUE rb_cMethod;
 static VALUE method_call _((int, VALUE*, VALUE));
@@ -243,6 +243,30 @@ static int scope_vmode;
 VALUE (*ruby_sandbox_save)_((rb_thread_t));
 VALUE (*ruby_sandbox_restore)_((rb_thread_t));
 NODE* ruby_current_node;
+
+#if 0
+#define SET_CURRENT_SOURCE() (ruby_sourcefile = ruby_current_node->nd_file, \
+			      ruby_sourceline = nd_line(ruby_current_node))
+#else
+#define SET_CURRENT_SOURCE() ((void)0)
+#endif
+
+void
+ruby_set_current_source()
+{
+    if (ruby_current_node) {
+	ruby_sourcefile = ruby_current_node->nd_file;
+	ruby_sourceline = nd_line(ruby_current_node);
+    }
+}
+
+#ifdef MBARI_API
+#define SET_METHOD_SOURCE()  ruby_set_current_source()
+#else
+#define SET_METHOD_SOURCE()  (void)0
+#endif
+
+
 int ruby_safe_level = 0;
 /* safe-level:
    0 - strings from streams/environment/ARGV are tainted (default)
@@ -726,7 +750,7 @@ rb_attr(klass, id, read, write, ex)
     if (!name) {
 	rb_raise(rb_eArgError, "argument needs to be symbol or string");
     }
-    ruby_set_current_source(); /* for Method#__line__ */
+    SET_METHOD_SOURCE();
     len = strlen(name)+2;
     buf = ALLOCA_N(char,len);
     snprintf(buf, len, "@%s", name);
@@ -965,7 +989,7 @@ rb_svar(cnt)
     ID id;
 
     if (!ruby_scope->local_tbl) return NULL;
-    if (cnt >= ruby_scope->local_tbl[0]) return NULL;
+    if ((ID)cnt >= ruby_scope->local_tbl[0]) return NULL;
     id = ruby_scope->local_tbl[cnt+1];
     while (vars) {
 	if (vars->id == id) return &vars->val;
@@ -1123,10 +1147,11 @@ static void scope_dup _((struct SCOPE *));
 } while (0)
 
 static VALUE rb_eval _((VALUE,NODE*));
-static VALUE eval _((VALUE,VALUE,VALUE,const char*,int));
+static VALUE eval _((VALUE,VALUE,volatile VALUE,const char* volatile,int));
 static NODE *compile _((VALUE, const char*, int));
 
-static VALUE rb_yield_0 _((VALUE, VALUE, VALUE, int, int));
+static VALUE rb_yield_0 
+               _((volatile VALUE, volatile VALUE, VALUE, int, volatile int));
 
 #if STACK_WIPE_SITES & 0x20
 #define wipeBeforeYield()  rb_gc_wipe_stack()
@@ -1142,7 +1167,7 @@ static VALUE rb_yield_0 _((VALUE, VALUE, VALUE, int, int));
 #define YIELD_FUNC_LAMBDA 3
 
 static VALUE rb_call _((VALUE,VALUE,ID,int,const VALUE*,int,VALUE));
-static VALUE module_setup _((VALUE,NODE*));
+static VALUE module_setup _((VALUE,NODE *volatile));
 
 static VALUE massign _((VALUE,NODE*,VALUE,int));
 static void assign _((VALUE,NODE*,VALUE,int));
@@ -1174,22 +1199,6 @@ static VALUE trace_func = 0;
 static int tracing = 0;
 static void call_trace_func _((rb_event_t,NODE*,VALUE,ID,VALUE));
 
-#if 0
-#define SET_CURRENT_SOURCE() (ruby_sourcefile = ruby_current_node->nd_file, \
-			      ruby_sourceline = nd_line(ruby_current_node))
-#else
-#define SET_CURRENT_SOURCE() ((void)0)
-#endif
-
-void
-ruby_set_current_source()
-{
-    if (ruby_current_node) {
-	ruby_sourcefile = ruby_current_node->nd_file;
-	ruby_sourceline = nd_line(ruby_current_node);
-    }
-}
-
 static void
 #ifdef HAVE_STDARG_PROTOTYPES
 warn_printf(const char *fmt, ...)
@@ -1251,15 +1260,15 @@ set_backtrace(info, bt)
 static void
 error_print()
 {
-    VALUE errat = Qnil;		/* OK */
+    VALUE errat;
     volatile VALUE eclass, e;
-    const char *einfo;
+    const char * einfo;
     long elen;
 
     if (NIL_P(ruby_errinfo)) return;
 
     PUSH_TAG(PROT_NONE);
-    errat = EXEC_TAG() == 0 ? get_backtrace(ruby_errinfo) : Qnil;
+    errat = EXEC_TAG() ? Qnil : get_backtrace(ruby_errinfo);
     if (EXEC_TAG()) goto error;
     if (NIL_P(errat)){
 	ruby_set_current_source();
@@ -1442,7 +1451,7 @@ ruby_init()
 }
 
 static VALUE
-eval_node(self, node)
+eval_tree(self, node)
     VALUE self;
     NODE *node;
 {
@@ -1591,12 +1600,13 @@ ruby_finalize()
 }
 
 int
-ruby_cleanup(ex)
-    int ex;
+ruby_cleanup(exArg)
+    int exArg;
 {
     int state;
     volatile VALUE errs[2];
-    int nerr;
+    unsigned nerr;
+    volatile int ex = exArg;
 
     errs[1] = ruby_errinfo;
     ruby_safe_level = 0;
@@ -1659,7 +1669,7 @@ ruby_exec_internal()
     /* default visibility is private at toplevel */
     SCOPE_SET(SCOPE_PRIVATE);
     if ((state = EXEC_TAG()) == 0) {
-	eval_node(ruby_top_self, ruby_eval_tree);
+	eval_tree(ruby_top_self, ruby_eval_tree);
     }
     POP_ITER();
     POP_TAG();
@@ -1867,8 +1877,8 @@ rb_eval_cmd(cmd, arg, level)
     int level;
 {
     int state;
-    VALUE val = Qnil;		/* OK */
-    struct SCOPE *saved_scope;
+    VALUE val;
+    struct SCOPE * volatile saved_scope;
     volatile int safe = ruby_safe_level;
 
     if (OBJ_TAINTED(cmd)) {
@@ -1899,9 +1909,7 @@ rb_eval_cmd(cmd, arg, level)
     ruby_safe_level = level;
 
     PUSH_TAG(PROT_NONE);
-    if ((state = EXEC_TAG()) == 0) {
-	val = eval(ruby_top_self, cmd, Qnil, 0, 0);
-    }
+    val = (state = EXEC_TAG()) ? Qnil : eval(ruby_top_self, cmd, Qnil, 0, 0);
     if (ruby_scope->flags & SCOPE_DONT_RECYCLE)
 	scope_dup(saved_scope);
     ruby_scope = saved_scope;
@@ -1940,8 +1948,12 @@ ev_const_defined(cref, id, self)
     return rb_const_defined(cref->nd_clss, id);
 }
 
-NOINLINE(static VALUE
-ev_const_get(cref, id, self))
+NOINLINE(static VALUE ev_const_get _((NODE *cref, ID id, VALUE self)));
+NOINLINE(static void eval_cvar_set _((NODE *node, VALUE result, int warn)));
+NOINLINE(static void eval_cdecl _((VALUE self, NODE *node, VALUE value)));
+
+static VALUE
+ev_const_get(cref, id, self)
     NODE *cref;
     ID id;
     VALUE self;
@@ -2268,8 +2280,8 @@ rb_copy_node_scope(node, rval)
     NODE *rval;
 {
     NODE *copy;
-    
-    ruby_set_current_source();  /* for Method#__line__ */
+
+    SET_METHOD_SOURCE();
     copy=NEW_NODE(NODE_SCOPE,0,rval,node->nd_next);
 
     if (node->nd_tbl) {
@@ -2377,10 +2389,10 @@ arg_defined(self, node, buf, type)
 static const char*
 is_defined(self, node, buf)
     VALUE self;
-    NODE *node;			/* OK */
+    NODE *node;
     char *buf;
 {
-    VALUE val;			/* OK */
+    VALUE val;
     int state;
 
   again:
@@ -2725,14 +2737,15 @@ call_trace_func(event, node, self, id, klass)
     NODE *node;
     VALUE self;
     ID id;
-    VALUE klass;		/* OK */
+    VALUE klass;
 {
-    int state, raised;
+    int state;
+    volatile int raised;
     struct FRAME *prev;
-    NODE *node_save;
+    NODE * volatile node_save;
     VALUE srcfile;
     const char *event_name;
-    rb_thread_t th = curr_thread;
+    volatile rb_thread_t th = curr_thread;
 
     if (!trace_func) return;
     if (tracing) return;
@@ -2941,11 +2954,11 @@ class_prefix(self, cpath)
 NORETURN(static void return_jump _((VALUE)));
 NORETURN(static void break_jump _((VALUE)));
 NORETURN(static void next_jump _((VALUE)));
-NORETURN(static void unknown_node _((NODE * volatile)));
+NORETURN(static void unknown_node _((NODE *)));
 
 static void
 unknown_node(node)
-    NODE *volatile node;
+    NODE *node;
 {
     ruby_current_node = 0;
     if (node->flags == 0) {
@@ -2959,23 +2972,26 @@ unknown_node(node)
     }
 }
 
-
 /*
-  functions factored out of rb_eval() to reduce its stack frame size
-*/
-NOINLINE(static VALUE eval_match2(self, node))
-  VALUE self;
-  NODE *node;
+ *  functions factored out of rb_eval() to reduce its stack frame size
+ */
+#define eval_node_0(n,retType, self, node)  \
+NOINLINE(static retType TOKEN_PASTE(eval_,n) _((self, node)));\
+static retType TOKEN_PASTE(eval_,n)(self, node)
+
+#define eval_node(n,retType) \
+  eval_node_0(n,retType, VALUE self, NODE *node)
+#define eval_node_volatile(n,retType) \
+  eval_node_0(n,retType, volatile VALUE self, NODE * volatile node)
+
+eval_node(match2, VALUE)
 {
     VALUE l = rb_eval(self,node->nd_recv);
     VALUE r = rb_eval(self,node->nd_value);
     return rb_reg_match(l, r);
 }
 
-NOINLINE(static VALUE
-eval_match3(self, node))
-  VALUE self;
-  NODE *node;
+eval_node(match3, VALUE)
 {
   VALUE r = rb_eval(self,node->nd_recv);
   VALUE l = rb_eval(self,node->nd_value);
@@ -2983,16 +2999,14 @@ eval_match3(self, node))
 }
 
 
-NOINLINE(static void
-eval_opt_n(self, node))
-  VALUE self;
-  NODE *node;
+eval_node_volatile(opt_n, void)
 {
   int state;
   PUSH_TAG(PROT_LOOP);
   switch (state = EXEC_TAG()) {
+    case TAG_NEXT:
+      state = 0;
     case 0:
-    opt_n_next:
       while (!NIL_P(rb_gets())) {
 	opt_n_redo:
 	  rb_eval(self, node->nd_body);
@@ -3002,9 +3016,7 @@ eval_opt_n(self, node))
     case TAG_REDO:
       state = 0;
       goto opt_n_redo;
-    case TAG_NEXT:
-      state = 0;
-      goto opt_n_next;
+
     case TAG_BREAK:
       state = 0;
     default:
@@ -3015,10 +3027,7 @@ eval_opt_n(self, node))
 }
 
 
-NOINLINE(static NODE *
-eval_when(self, node))
-  VALUE self;
-  NODE *node;
+eval_node(when, NODE*)
 {
   do {
       NODE *tag = node->nd_head;
@@ -3045,10 +3054,7 @@ eval_when(self, node))
 }
 
 
-NOINLINE (static NODE *
-eval_case(self, node))
-  VALUE self;
-  NODE *node;
+eval_node(case, NODE*)
 {
   VALUE val = rb_eval(self, node->nd_head);
   node = node->nd_body;
@@ -3083,27 +3089,26 @@ eval_case(self, node))
 }
 
 
-NOINLINE (static VALUE
-eval_while(self, node))
-  VALUE self;
-  NODE *node;
+eval_node_volatile(while, VALUE)
 {
   int state;
-  volatile VALUE result = Qnil;
+  VALUE result;
   PUSH_TAG(PROT_LOOP);
   switch (state = EXEC_TAG()) {
     case 0:
-      if (node->nd_state && !RTEST(rb_eval(self, node->nd_cond)))
-	  goto while_out;
-      do {
-	while_redo:
+      if (!(node->nd_state) || RTEST(rb_eval(self, node->nd_cond))) {
+        do {
+	  while_redo:
 #if STACK_WIPE_SITES & 0x10
-          rb_gc_wipe_stack();
+            rb_gc_wipe_stack();
 #endif
-	  rb_eval(self, node->nd_body);
-	while_next:
-	  ;
-      } while (RTEST(rb_eval(self, node->nd_cond)));
+	    rb_eval(self, node->nd_body);
+	  while_next:
+	    ;
+        } while (RTEST(rb_eval(self, node->nd_cond)));
+      }  /* fall thru */
+    default:
+      result=Qnil;
       break;
 
     case TAG_REDO:
@@ -3117,38 +3122,33 @@ eval_while(self, node))
 	  state = 0;
 	  result = prot_tag->retval;
       }
-      /* fall through */
-    default:
-      break;
   }
-while_out:
   POP_TAG();
   if (state) JUMP_TAG(state);
   return result;
 }
 
 
-NOINLINE (static VALUE
-eval_until(self, node))
-  VALUE self;
-  NODE *node;
+eval_node_volatile(until, VALUE)
 {
   int state;
-  volatile VALUE result = Qnil;
+  VALUE result;
   PUSH_TAG(PROT_LOOP);
   switch (state = EXEC_TAG()) {
     case 0:
-      if (node->nd_state && RTEST(rb_eval(self, node->nd_cond)))
-	  goto until_out;
-      do {
-        until_redo:
-#if STACK_WIPE_SITES & 0x10
-          rb_gc_wipe_stack();
-#endif
-	  rb_eval(self, node->nd_body);
-        until_next:
-	  ;
-      } while (!RTEST(rb_eval(self, node->nd_cond)));
+      if (!(node->nd_state) || !RTEST(rb_eval(self, node->nd_cond))) {
+        do {
+          until_redo:
+  #if STACK_WIPE_SITES & 0x10
+            rb_gc_wipe_stack();
+  #endif
+	    rb_eval(self, node->nd_body);
+          until_next:
+	    ;
+        } while (!RTEST(rb_eval(self, node->nd_cond)));
+      }  /* fall thru */
+    default:
+      result=Qnil;
       break;
 
     case TAG_REDO:
@@ -3162,24 +3162,17 @@ eval_until(self, node))
 	  state = 0;
 	  result = prot_tag->retval;
       }
-      /* fall through */
-    default:
-      break;
   }
- until_out:
   POP_TAG();
   if (state) JUMP_TAG(state);
   return result;
 }
 
 
-NOINLINE (static VALUE
-eval_iter(self, node))
-  VALUE self;
-  NODE *node;
+eval_node_volatile(iter, VALUE)
 {
   int state;
-  volatile VALUE result = Qnil;
+  VALUE result;
 
   PUSH_TAG(PROT_LOOP);
   PUSH_BLOCK(node->nd_var, node->nd_body);
@@ -3194,15 +3187,13 @@ eval_iter(self, node))
 	  result = rb_eval(self, node->nd_iter);
       }
       else {
-	  VALUE recv;
-
 	  _block.flags &= ~BLOCK_D_SCOPE;
 	  BEGIN_CALLARGS;
-	  recv = rb_eval(self, node->nd_iter);
+	  result = rb_eval(self, node->nd_iter);
 	  END_CALLARGS;
-	  ruby_current_node = node;
+	  ruby_current_node = (NODE *)node;
 	  SET_CURRENT_SOURCE();
-	  result = rb_call(CLASS_OF(recv),recv,each,0,0,0,self);
+	  result = rb_call(CLASS_OF(result),result,each,0,0,0,self);
       }
       POP_ITER();
       break;
@@ -3220,15 +3211,12 @@ eval_iter(self, node))
 }
 
 
-NOINLINE (static VALUE
-eval_rescue(self, node))
-  VALUE self;
-  NODE *node;
+eval_node_volatile(rescue, VALUE)
 {
     volatile VALUE e_info = ruby_errinfo;
     volatile int rescuing = 0;
     int state;
-    volatile VALUE result = Qnil;
+    VALUE result;
 
     PUSH_TAG(PROT_NONE);
     if ((state = EXEC_TAG()) == 0) {
@@ -3238,6 +3226,7 @@ eval_rescue(self, node))
     else if (rescuing) {
 	if (rescuing < 0) {
 	    /* in rescue argument, just reraise */
+            result = Qnil;
 	}
 	else if (state == TAG_RETRY) {
 	    rescuing = state = 0;
@@ -3279,13 +3268,10 @@ eval_rescue(self, node))
 }
 
 
-NOINLINE (static VALUE
-eval_ensure(self, node))
-  VALUE self;
-  NODE *node;
+eval_node_volatile(ensure, VALUE)
 {
   int state;
-  volatile VALUE result = Qnil;
+  VALUE result;
 
   PUSH_TAG(PROT_NONE);
   if ((state = EXEC_TAG()) == 0) {
@@ -3305,10 +3291,7 @@ eval_ensure(self, node))
 }
 
 
-NOINLINE (static VALUE
-eval_dot(self, node))
-  VALUE self;
-  NODE *node;
+eval_node(dot, VALUE)
 {
   VALUE beg = rb_eval(self, node->nd_beg);
   VALUE end = rb_eval(self, node->nd_end);
@@ -3316,10 +3299,7 @@ eval_dot(self, node))
 }
 
 
-NOINLINE (static VALUE
-eval_flip2(self, node))
-  VALUE self;
-  NODE *node;
+eval_node(flip2, VALUE)
 {
   VALUE *flip = rb_svar(node->nd_cnt);
   if (!flip) rb_bug("unexpected local variable");
@@ -3334,10 +3314,7 @@ eval_flip2(self, node))
 }
 
 
-NOINLINE (static VALUE
-eval_flip3(self, node))
-  VALUE self;
-  NODE *node;
+eval_node(flip3, VALUE)
 {
   VALUE *flip = rb_svar(node->nd_cnt);
   if (!flip) rb_bug("unexpected local variable");
@@ -3349,10 +3326,7 @@ eval_flip3(self, node))
 }
 
 
-NOINLINE (static VALUE
-eval_attrasgn(self, node))
-  VALUE self;
-  NODE *node;
+eval_node(attrasgn, VALUE)
 {
   VALUE recv;
   int argc; VALUE *argv; /* used in SETUP_ARGS */
@@ -3378,10 +3352,7 @@ eval_attrasgn(self, node))
 }
 
 
-NOINLINE (static VALUE
-eval_call(self, node))
-  VALUE self;
-  NODE *node;
+eval_node(call, VALUE)
 {
   VALUE recv;
   int argc; VALUE *argv; /* used in SETUP_ARGS */
@@ -3398,10 +3369,7 @@ eval_call(self, node))
 }
 
 
-NOINLINE (static VALUE
-eval_fcall(self, node))
-  VALUE self;
-  NODE *node;
+eval_node(fcall, VALUE)
 {
   int argc; VALUE *argv; /* used in SETUP_ARGS */
   TMP_PROTECT;
@@ -3415,10 +3383,8 @@ eval_fcall(self, node))
   return rb_call(CLASS_OF(self),self,node->nd_mid,argc,argv,1,self);
 }
 
-NOINLINE (static VALUE
-eval_super(self, node))
-  VALUE self;
-  NODE *node;
+
+eval_node(super, VALUE)
 {
   int argc; VALUE *argv; /* used in SETUP_ARGS */
   TMP_PROTECT;
@@ -3463,15 +3429,12 @@ eval_super(self, node))
 }
 
 
-NOINLINE (static VALUE
-eval_scope(self, node))
-  VALUE self;
-  NODE *node;
+eval_node_volatile(scope, VALUE)
 {
   int state;
-  volatile VALUE result = Qnil;
+  VALUE result;
   struct FRAME frame;
-  NODE *saved_cref = 0;
+  NODE * volatile saved_cref = 0;
 
   frame = *ruby_frame;
   frame.tmp = ruby_frame;
@@ -3506,10 +3469,7 @@ eval_scope(self, node))
   return result;
 }
 
-NOINLINE (static VALUE
-eval_op_asgn1(self, node))
-  VALUE self;
-  NODE *node;
+eval_node(op_asgn1, VALUE)
 {
   int argc; VALUE *argv; /* used in SETUP_ARGS */
   VALUE recv, val, tmp;
@@ -3539,10 +3499,7 @@ eval_op_asgn1(self, node))
 }
 
 
-NOINLINE (static VALUE
-eval_op_asgn2(self, node))
-  VALUE self;
-  NODE *node;
+eval_node(op_asgn2, VALUE)
 {
   ID id = node->nd_next->nd_vid;
   VALUE recv, val, tmp;
@@ -3568,10 +3525,7 @@ eval_op_asgn2(self, node))
 }
 
 
-NOINLINE (static VALUE
-eval_hash(self, node))
-  VALUE self;
-  NODE *node;
+eval_node(hash, VALUE)
 {
   NODE *list;
   VALUE hash = rb_hash_new();
@@ -3591,10 +3545,7 @@ eval_hash(self, node))
 }
 
 
-NOINLINE (static VALUE
-eval_array(self, node))
-  VALUE self;
-  NODE *node;
+eval_node(array, VALUE)
 {
   VALUE ary;
   long i;
@@ -3609,10 +3560,7 @@ eval_array(self, node))
 }
 
 
-NOINLINE (static VALUE
-eval_slit(self, node))
-  VALUE self;
-  NODE *node;
+eval_node(slit, VALUE)
 {
   VALUE str, str2;
   NODE *list = node->nd_next;
@@ -3635,12 +3583,15 @@ eval_slit(self, node))
   }
   switch (nd_type(node)) {
     case NODE_DREGX:
-      return rb_reg_new(RSTRING(str)->ptr, RSTRING(str)->len,
+      str2 = rb_reg_new(RSTRING(str)->ptr, RSTRING(str)->len,
 			  node->nd_cflag);
+      RB_GC_GUARD(str);  /* ensure str is not GC'd in rb_reg_new */
+      return str2;
     case NODE_DREGX_ONCE:	/* regexp expand once */
       str2 = rb_reg_new(RSTRING(str)->ptr, RSTRING(str)->len,
 			  node->nd_cflag);
       nd_set_type(node, NODE_LIT);
+      RB_GC_GUARD(str);  /* ensure str is not GC'd in rb_reg_new */
       return node->nd_lit = str2;
     case NODE_LIT:
       /* other thread may replace NODE_DREGX_ONCE to NODE_LIT */
@@ -3654,10 +3605,7 @@ eval_slit(self, node))
 }
 
         
-NOINLINE (static void
-eval_defn(self, node))
-  VALUE self;
-  NODE *node;
+eval_node(defn, void)
 {
   NODE *body,  *defn;
   VALUE origin = 0;
@@ -3703,10 +3651,7 @@ eval_defn(self, node))
 }
 
 
-NOINLINE (static void
-eval_defs(self, node))
-  VALUE self;
-  NODE *node;
+eval_node(defs, void)
 {
   VALUE recv = rb_eval(self, node->nd_recv);
   VALUE klass;
@@ -3740,10 +3685,7 @@ eval_defs(self, node))
 }
 
 
-NOINLINE (static VALUE
-eval_class(self, node))
-  VALUE self;
-  NODE *node;
+eval_node(class, VALUE)
 {
     VALUE super, klass, tmp, cbase;
     ID cname;
@@ -3799,10 +3741,7 @@ eval_class(self, node))
 }
 
 
-NOINLINE (static VALUE
-eval_module(self, node))
-  VALUE self;
-  NODE *node;
+eval_node(module, VALUE)
 {
   VALUE module, cbase;
   ID cname;
@@ -3836,10 +3775,7 @@ eval_module(self, node))
 }
 
 
-NOINLINE (static VALUE
-eval_sclass(self, node))
-  VALUE self;
-  NODE *node;
+eval_node(sclass, VALUE)
 {
   VALUE klass, result;
 
@@ -3861,10 +3797,7 @@ eval_sclass(self, node))
 }
 
 
-NOINLINE (static VALUE
-eval_defined(self, node))
-  VALUE self;
-  NODE *node;
+eval_node(defined, VALUE)
 {
     char buf[20];
     const char *desc = is_defined(self, node->nd_head, buf);
@@ -3872,17 +3805,18 @@ eval_defined(self, node))
 }
 
 
-NOINLINE (static void
-eval_cvar_set(result, node, bool))
-  VALUE result, bool;
+static void
+eval_cvar_set(node, result, warn)
   NODE *node;
+  VALUE result;
+  int warn;
 {
-  rb_cvar_set(cvar_cbase(), node->nd_vid, result, bool);
+  rb_cvar_set(cvar_cbase(), node->nd_vid, result, warn);
 }
 
 
-NOINLINE (static void
-eval_cdecl(self, node, result))
+static void
+eval_cdecl(self, node, result)
   VALUE self, result;
   NODE *node;
 {
@@ -3897,7 +3831,7 @@ eval_cdecl(self, node, result))
 static VALUE
 rb_eval(self, node)
   VALUE self;
-  NODE *node;
+  NODE * node;
 {
   VALUE result;
 
@@ -3906,8 +3840,6 @@ again:
   result = Qnil;
   if (node) {
     ruby_current_node = node;
-    SET_CURRENT_SOURCE();
-
     switch (nd_type(node)) {
       case NODE_BLOCK:
 	while (node->nd_next) {
@@ -4187,12 +4119,12 @@ again:
 	    rb_raise(rb_eTypeError, "no class/module to define class variable");
 	}
         result = rb_eval(self, node->nd_value);
-        eval_cvar_set(result, node, Qtrue);
+        eval_cvar_set(node, result, Qtrue);
 	break;
 
       case NODE_CVASGN:
         result = rb_eval(self, node->nd_value);
-        eval_cvar_set(result, node, Qfalse);
+        eval_cvar_set(node, result, Qfalse);
 	break;
 
       case NODE_LVAR:
@@ -4378,12 +4310,12 @@ again:
 static VALUE
 module_setup(module, n)
     VALUE module;
-    NODE *n;
+    NODE * volatile n;
 {
-    NODE * volatile node = n->nd_body;
+    NODE *node = n->nd_body;
     int state;
     struct FRAME frame;
-    VALUE result = Qnil;	/* OK */
+    VALUE result;
     TMP_PROTECT;
 
     frame = *ruby_frame;
@@ -4774,16 +4706,16 @@ rb_iter_break()
     break_jump(Qnil);
 }
 
-NORETURN(static void rb_longjmp _((int, VALUE)));
+NORETURN(static void rb_longjmp _((volatile int, volatile VALUE)));
 static VALUE make_backtrace _((void));
 
 static void
 rb_longjmp(tag, mesg)
-    int tag;
-    VALUE mesg;
+    volatile int tag;
+    volatile VALUE mesg;
 {
     VALUE at;
-    rb_thread_t th = curr_thread;
+    volatile rb_thread_t th = curr_thread;
 
     if (rb_thread_set_raised(th)) {
 	ruby_errinfo = exception_error;
@@ -4914,14 +4846,12 @@ rb_make_exception(argc, argv)
     int argc;
     VALUE *argv;
 {
-    VALUE mesg;
+    VALUE mesg = Qnil;
     ID exception;
     int n;
 
-    mesg = Qnil;
     switch (argc) {
       case 0:
-	mesg = Qnil;
 	break;
       case 1:
 	if (NIL_P(argv[0])) break;
@@ -5140,19 +5070,21 @@ rb_need_block()
 
 static VALUE
 rb_yield_0(val, self, klass, flags, avalue)
-    VALUE val, self, klass;	/* OK */
-    int flags, avalue;
+    volatile VALUE val, self;
+    VALUE klass;
+    int flags;
+    volatile int avalue;
 {
-    NODE *node, *var;
+    NODE *var, *volatile node;
     volatile VALUE result = Qnil;
     volatile VALUE old_cref;
     volatile VALUE old_wrapper;
     struct BLOCK * volatile block;
     struct SCOPE * volatile old_scope;
-    int old_vmode;
+    volatile int old_vmode;
     struct FRAME frame;
     NODE *cnode = ruby_current_node;
-    int lambda = flags & YIELD_LAMBDA_CALL;
+    volatile int lambda = flags & YIELD_LAMBDA_CALL;
     int state;
 
     rb_need_block();
@@ -5262,56 +5194,49 @@ rb_yield_0(val, self, klass, flags, avalue)
 
     PUSH_ITER(block->iter);
     PUSH_TAG(lambda ? PROT_NONE : PROT_YIELD);
-    if ((state = EXEC_TAG()) == 0) {
-      redo:
+    switch (state = EXEC_TAG()) {
+      case TAG_REDO:
+	state = 0;
+	CHECK_INTS;
+      case 0:
 	if (nd_type(node) == NODE_CFUNC || nd_type(node) == NODE_IFUNC) {
-	    switch (node->nd_state) {
-	      case YIELD_FUNC_LAMBDA:
-		if (!avalue) {
-		    val = rb_ary_new3(1, val);
-		}
-		break;
-	      case YIELD_FUNC_AVALUE:
-		if (!avalue) {
-		    val = svalue_to_avalue(val);
-		}
-		break;
-	      default:
-		if (avalue) {
-		    val = avalue_to_svalue(val);
-		}
-		if (val == Qundef && node->nd_state != YIELD_FUNC_SVALUE)
-		    val = Qnil;
+	  switch (node->nd_state) {
+	    case YIELD_FUNC_LAMBDA:
+	      if (!avalue) {
+		  val = rb_ary_new3(1, val);
+	      }
+	      break;
+	    case YIELD_FUNC_AVALUE:
+	      if (!avalue) {
+		  val = svalue_to_avalue(val);
+	      }
+	      break;
+	    default:
+	      if (avalue) {
+		  val = avalue_to_svalue(val);
+	      }
+	      if (val == Qundef && node->nd_state != YIELD_FUNC_SVALUE)
+		  val = Qnil;
 	    }
 	    result = (*node->nd_cfnc)(val, node->nd_tval, self);
-	}
-	else {
+	 }else
 	    result = rb_eval(self, node);
-	}
-    }
-    else {
-	switch (state) {
-	  case TAG_REDO:
-	    state = 0;
-	    CHECK_INTS;
-	    goto redo;
-	  case TAG_NEXT:
-	    if (!lambda) {
-		state = 0;
-		result = prot_tag->retval;
-	    }
-	    break;
-	  case TAG_BREAK:
-	    if (TAG_DST()) {
-		result = prot_tag->retval;
-	    }
-	    else {
-		lambda = Qtrue;	/* just pass TAG_BREAK */
-	    }
-	    break;
-	  default:
-	    break;
-	}
+          break;
+	case TAG_NEXT:
+	  if (!lambda) {
+	      state = 0;
+	      result = prot_tag->retval;
+	  }
+	  break;
+	case TAG_BREAK:
+	  if (TAG_DST()) {
+	      result = prot_tag->retval;
+	  }
+	  else {
+	      lambda = Qtrue;	/* just pass TAG_BREAK */
+	  }
+	default:
+	  break;
     }
     POP_TAG();
     POP_ITER();
@@ -5597,11 +5522,12 @@ assign(self, lhs, val, pcall)
 
 VALUE
 rb_iterate(it_proc, data1, bl_proc, data2)
-    VALUE (*it_proc) _((VALUE)), (*bl_proc)(ANYARGS);
-    VALUE data1, data2;
+    VALUE (* volatile it_proc) _((VALUE)), (*bl_proc)(ANYARGS);
+    volatile VALUE data1;
+    VALUE data2;
 {
     int state;
-    volatile VALUE retval = Qnil;
+    VALUE retval;
     NODE *node = NEW_IFUNC(bl_proc, data2);
     VALUE self = ruby_top_self;
 
@@ -5625,12 +5551,7 @@ rb_iterate(it_proc, data1, bl_proc, data2)
     POP_BLOCK();
     POP_TAG();
 
-    switch (state) {
-      case 0:
-	break;
-      default:
-	JUMP_TAG(state);
-    }
+    if (state) JUMP_TAG(state);
     return retval;
 }
 
@@ -5662,16 +5583,17 @@ handle_rescue(self, node)
 
 VALUE
 #ifdef HAVE_STDARG_PROTOTYPES
-rb_rescue2(VALUE (*b_proc)(ANYARGS), VALUE data1, VALUE (*r_proc)(ANYARGS), VALUE data2, ...)
+rb_rescue2(VALUE (* volatile b_proc)(ANYARGS), volatile VALUE data1, 
+           VALUE (* volatile r_proc)(ANYARGS), volatile VALUE data2, ...)
 #else
 rb_rescue2(b_proc, data1, r_proc, data2, va_alist)
-    VALUE (*b_proc)(ANYARGS), (*r_proc)(ANYARGS);
-    VALUE data1, data2;
+    VALUE (* volatile b_proc)(ANYARGS), (* volatile r_proc)(ANYARGS);
+    volatile VALUE data1, data2;
     va_dcl
 #endif
 {
     int state;
-    volatile VALUE result;
+    VALUE result;
     volatile VALUE e_info = ruby_errinfo;
     volatile int handle = Qfalse;
     VALUE eclass;
@@ -5730,9 +5652,9 @@ VALUE
 rb_protect(proc, data, state)
     VALUE (*proc) _((VALUE));
     VALUE data;
-    int *state;
+    int * volatile state;
 {
-    VALUE result = Qnil;	/* OK */
+    VALUE result;
     int status;
 
     PUSH_TAG(PROT_NONE);
@@ -5745,22 +5667,18 @@ rb_protect(proc, data, state)
     if (state) {
 	*state = status;
     }
-    if (status != 0) {
-	return Qnil;
-    }
-
-    return result;
+    return status ? Qnil : result;
 }
 
 VALUE
 rb_ensure(b_proc, data1, e_proc, data2)
     VALUE (*b_proc)();
     VALUE data1;
-    VALUE (*e_proc)();
-    VALUE data2;
+    VALUE (* volatile e_proc)();
+    volatile VALUE data2;
 {
     int state;
-    volatile VALUE result = Qnil;
+    VALUE result;
     VALUE retval;
 
     PUSH_TAG(PROT_NONE);
@@ -5768,7 +5686,7 @@ rb_ensure(b_proc, data1, e_proc, data2)
 	result = (*b_proc)(data1);
     }
     POP_TAG();
-    retval = prot_tag ? prot_tag->retval : Qnil;	/* save retval */
+    if (prot_tag) retval = prot_tag->retval;  /* save retval */
     if (!thread_no_ensure()) {
 	(*e_proc)(data2);
     }
@@ -5782,7 +5700,7 @@ rb_with_disable_interrupt(proc, data)
     VALUE (*proc)();
     VALUE data;
 {
-    VALUE result = Qnil;	/* OK */
+    VALUE result;
     int status;
 
     DEFER_INTS;
@@ -6034,16 +5952,16 @@ call_cfunc(func, recv, len, argc, argv)
 
 static VALUE
 rb_call0(klass, recv, id, oid, argc, argv, body, flags)
-    VALUE klass, recv;
-    ID    id;
+    volatile VALUE klass, recv;
+    volatile ID    id;
     ID    oid;
-    int argc;			/* OK */
-    VALUE *argv;		/* OK */
-    NODE * volatile body;
+    int argc;
+    VALUE *argv;
+    NODE *body;
     int flags;
 {
     NODE *b2;		/* OK */
-    volatile VALUE result = Qnil;
+    VALUE result;
     int itr;
     static int tick;
     TMP_PROTECT;
@@ -6150,9 +6068,10 @@ rb_call0(klass, recv, id, oid, argc, argv, body, flags)
 	    Data_Get_Struct(body->nd_cval, struct BLOCK, data);
 	    EXEC_EVENT_HOOK(RUBY_EVENT_CALL, data->body, recv, id, klass);
 	}
-	result = proc_invoke(body->nd_cval, rb_ary_new4(argc, argv), recv, klass);
+	result = proc_invoke(body->nd_cval, rb_ary_new4(argc,argv), recv,klass);
 	if (event_hooks) {
-	    EXEC_EVENT_HOOK(RUBY_EVENT_RETURN, ruby_current_node, recv, id, klass);
+	    EXEC_EVENT_HOOK(RUBY_EVENT_RETURN,
+                            ruby_current_node, recv, id, klass);
 	}
 	break;
 
@@ -6160,7 +6079,7 @@ rb_call0(klass, recv, id, oid, argc, argv, body, flags)
 	{
 	    int state;
 	    VALUE *local_vars;	/* OK */
-	    NODE *saved_cref = 0;
+	    NODE * volatile saved_cref = 0;
 
 	    PUSH_SCOPE();
 	    if (body->nd_rval) {
@@ -6206,8 +6125,9 @@ rb_call0(klass, recv, id, oid, argc, argv, body, flags)
 
 		    i = node->nd_cnt;
 		    if (i > argc) {
-			rb_raise(rb_eArgError, "wrong number of arguments (%d for %d)",
-				 argc, i);
+			rb_raise(rb_eArgError, 
+                                 "wrong number of arguments (%d for %d)",
+                                 argc, i);
 		    }
 		    if (!node->nd_rest) {
 			NODE *optnode = node->nd_opt;
@@ -6275,7 +6195,8 @@ rb_call0(klass, recv, id, oid, argc, argv, body, flags)
 	    }
 	    POP_TAG();
 	    if (event_hooks) {
-		EXEC_EVENT_HOOK(RUBY_EVENT_RETURN, ruby_current_node, recv, id, klass);
+		EXEC_EVENT_HOOK(RUBY_EVENT_RETURN, ruby_current_node,
+                                recv, id, klass);
 	    }
 	    POP_VARS();
 	    POP_CLASS();
@@ -6303,7 +6224,6 @@ rb_call0(klass, recv, id, oid, argc, argv, body, flags)
 
       default:
 	unknown_node(body);
-	break;
     }
     POP_FRAME();
     POP_ITER();
@@ -6471,7 +6391,7 @@ rb_funcall_rescue(recv, mid, n, va_alist)
     va_dcl
 #endif
 {
-    VALUE result = Qnil;	/* OK */
+    VALUE result;
     int status;
     va_list ar;
 
@@ -6687,12 +6607,13 @@ compile(src, file, line)
 
 static VALUE
 eval(self, src, scope, file, line)
-    VALUE self, src, scope;
-    const char *file;
+    VALUE self, src;
+    volatile VALUE scope;
+    const char * volatile file;
     int line;
 {
     struct BLOCK *data = NULL;
-    volatile VALUE result = Qnil;
+    VALUE result;
     struct SCOPE * volatile old_scope;
     struct BLOCK * volatile old_block;
     struct RVarmap * volatile old_dyna_vars;
@@ -6700,7 +6621,7 @@ eval(self, src, scope, file, line)
     int volatile old_vmode;
     volatile VALUE old_wrapper;
     struct FRAME frame;
-    NODE *nodesave = ruby_current_node;
+    NODE * volatile nodesave = ruby_current_node;
     volatile int iter = ruby_frame->iter;
     volatile int safe = ruby_safe_level;
     int state;
@@ -6765,7 +6686,7 @@ eval(self, src, scope, file, line)
 	    compile_error(0);
 	}
 	if (!NIL_P(result)) ruby_errinfo = result;
-	result = eval_node(self, node);
+	result = eval_tree(self, node);
     }
     POP_TAG();
     POP_CLASS();
@@ -6891,12 +6812,13 @@ rb_f_eval(argc, argv, self)
 static VALUE
 exec_under(func, under, cbase, args)
     VALUE (*func)();
-    VALUE under, cbase;
+    VALUE under;
+    volatile VALUE cbase;
     void *args;
 {
-    VALUE val = Qnil;		/* OK */
+    VALUE val;
     int state;
-    int mode;
+    volatile int mode;
     struct FRAME *f = ruby_frame;
 
     PUSH_CLASS(under);
@@ -7182,9 +7104,9 @@ rb_load(fname, wrap)
     volatile int prohibit_int = rb_prohibit_interrupt;
     volatile ID last_func;
     volatile VALUE wrapper = ruby_wrapper;
-    volatile VALUE self = ruby_top_self;
+    VALUE self = ruby_top_self;
     NODE *volatile last_node;
-    NODE *saved_cref = ruby_cref;
+    NODE *volatile saved_cref = ruby_cref;
 
     if (wrap && ruby_safe_level >= 4) {
 	StringValue(fname);
@@ -7233,7 +7155,7 @@ rb_load(fname, wrap)
     ruby_current_node = 0;
     if (state == 0) {
 	NODE *node;
-	volatile int critical;
+        int critical;
 
 	DEFER_INTS;
 	ruby_in_eval++;
@@ -7245,7 +7167,7 @@ rb_load(fname, wrap)
 	rb_thread_critical = critical;
 	ALLOW_INTS;
 	if (ruby_nerrs == 0) {
-	    eval_node(self, node);
+	    eval_tree(self, node);
 	}
     }
     ruby_frame->last_func = last_func;
@@ -7278,7 +7200,7 @@ void
 rb_load_protect(fname, wrap, state)
     VALUE fname;
     int wrap;
-    int *state;
+    int * volatile state;
 {
     int status;
 
@@ -7567,7 +7489,7 @@ rb_require_safe(fname, safe)
     VALUE fname;
     int safe;
 {
-    VALUE result = Qnil;
+    VALUE result;
     volatile VALUE errinfo = ruby_errinfo;
     int state;
     struct {
@@ -7618,7 +7540,8 @@ rb_require_safe(fname, safe)
 		rb_provide_feature(feature);
 		result = Qtrue;
 	    }
-	}
+	}else
+          result = Qnil;
     }
     POP_TAG();
     ruby_current_node = saved.node;
@@ -8286,7 +8209,7 @@ rb_f_at_exit()
 void
 rb_exec_end_proc()
 {
-    struct end_proc_data *link, *tmp;
+    struct end_proc_data *tmp, *volatile link;
     int status;
     volatile int safe = ruby_safe_level;
 
@@ -9009,8 +8932,9 @@ proc_invoke(proc, args, self, klass)
     int state;
     volatile int safe = ruby_safe_level;
     volatile VALUE old_wrapper = ruby_wrapper;
-    volatile int pcall, avalue = Qtrue;
-    volatile VALUE tmp = args;
+    volatile int pcall;
+    int avalue = Qtrue;
+    VALUE tmp = args;
     VALUE bvar = Qnil;
 
     if (rb_block_given_p() && ruby_frame->last_func) {
@@ -9316,15 +9240,15 @@ proc_binding(proc)
 
 static VALUE
 block_pass(self, node)
-    VALUE self;
-    NODE *node;
+    volatile VALUE self;
+    NODE *volatile node;
 {
-    VALUE proc = rb_eval(self, node->nd_body);	/* OK */
+    volatile VALUE proc = rb_eval(self, node->nd_body);
     VALUE b;
     struct BLOCK * volatile old_block;
     struct BLOCK _block;
     struct BLOCK *data;
-    volatile VALUE result = Qnil;
+    VALUE result;
     int state;
     volatile int orphan;
     volatile int safe = ruby_safe_level;
@@ -9371,20 +9295,24 @@ block_pass(self, node)
 
     PUSH_TAG(PROT_LOOP);
     state = EXEC_TAG();
-    if (state == 0) {
-      retry:
+    switch (state) {
+      case TAG_RETRY:
+        state = 0;
+      case 0:
 	proc_set_safe_level(proc);
 	if (safe > ruby_safe_level)
 	    ruby_safe_level = safe;
 	result = rb_eval(self, node->nd_iter);
-    }
-    else if (state == TAG_BREAK && TAG_DST()) {
-	result = prot_tag->retval;
-	state = 0;
-    }
-    else if (state == TAG_RETRY) {
-	state = 0;
-	goto retry;
+        break;
+      case TAG_BREAK:
+        result = Qnil;
+        if (TAG_DST()) {
+	  result = prot_tag->retval;
+	  state = 0;
+        }
+        break;
+      default:
+        result = Qnil;
     }
     POP_TAG();
     POP_ITER();
@@ -9401,7 +9329,6 @@ block_pass(self, node)
       default:
 	JUMP_TAG(state);
     }
-
     return result;
 }
 
@@ -9735,7 +9662,7 @@ method_call(argc, argv, method)
     VALUE *argv;
     VALUE method;
 {
-    VALUE result = Qnil;	/* OK */
+    VALUE result;
     struct METHOD *data;
     int safe;
 
@@ -10030,12 +9957,9 @@ static VALUE
 bmcall(args, method)
     VALUE args, method;
 {
-    volatile VALUE a;
-    VALUE ret;
-
-    a = svalue_to_avalue(args);
-    ret = method_call(RARRAY(a)->len, RARRAY(a)->ptr, method);
-    a = Qnil; /* prevent tail call */
+    VALUE a = svalue_to_avalue(args);
+    VALUE ret = method_call(RARRAY(a)->len, RARRAY(a)->ptr, method);
+    RB_GC_GUARD(a);  /* ensure a is not GC'd during method_call */
     return ret;
 }
 
@@ -10151,7 +10075,7 @@ rb_mod_define_method(argc, argv, mod)
     else {
 	rb_raise(rb_eArgError, "wrong number of arguments (%d for 1)", argc);
     }
-    ruby_set_current_source(); /* for Method#__line__ */
+    SET_METHOD_SOURCE();
     if (RDATA(body)->dmark == (RUBY_DATA_FUNC)bm_mark) {
 	node = NEW_DMETHOD(method_unbind(body));
     }
@@ -10184,12 +10108,16 @@ rb_mod_define_method(argc, argv, mod)
 }
 
 
+#ifdef MBARI_API
 /*
  * call-seq:
  *    meth.__file__  => String  
  *
  * returns the filename containing this method's definition
+ *
  * raises ArgumentError if method has no associated ruby source code
+ *
+ * <i>Only available when MBARI_API extentions are enabled at build time</i>
  */
  
 static VALUE
@@ -10212,7 +10140,10 @@ method_source_file_name(VALUE method)
  *    meth.__line__  => Fixnum  
  *
  * returns the starting line number of this method
+ *
  * raises ArgumentError if method has no associated ruby source code
+ *
+ * <i>Only available when MBARI_API extentions are enabled at build time</i>
  */
  
 static VALUE
@@ -10231,13 +10162,15 @@ method_source_line(VALUE method)
 }
 
 
-
 /*
  * call-seq:
  *    prc.__file__  => String  
  *
  * returns the filename where this proc is defined
+ *
  * raises ArgumentError if proc has no associated ruby source
+ *
+ * <i>Only available when MBARI_API extentions are enabled at build time</i>
  */
  
 static VALUE
@@ -10259,7 +10192,10 @@ proc_source_file_name(VALUE block)
  *    prc.__line__  => Fixnum  
  *
  * returns the starting line number of this proc
+ *
  * raises ArgumentError if proc has no associated ruby source code
+ *
+ * <i>Only available when MBARI_API extentions are enabled at build time</i>
  */
  
 static VALUE
@@ -10274,6 +10210,8 @@ proc_source_line(VALUE block)
     rb_raise(rb_eArgError, "native Proc");
 }
 
+#endif  /* MBARI_API */
+
 
 /*
  *  <code>Proc</code> objects are blocks of code that have been bound to
@@ -10326,8 +10264,6 @@ Init_Proc()
     rb_define_method(rb_cProc, "to_s", proc_to_s, 0);
     rb_define_method(rb_cProc, "to_proc", proc_to_self, 0);
     rb_define_method(rb_cProc, "binding", proc_binding, 0);
-    rb_define_method(rb_cProc, "__file__", proc_source_file_name, 0);
-    rb_define_method(rb_cProc, "__line__", proc_source_line, 0);
 
     rb_define_global_function("proc", proc_lambda, 0);
     rb_define_global_function("lambda", proc_lambda, 0);
@@ -10348,8 +10284,6 @@ Init_Proc()
     rb_define_method(rb_cMethod, "owner", method_owner, 0);
     rb_define_method(rb_cMethod, "unbind", method_unbind, 0);
     rb_define_method(rb_mKernel, "method", rb_obj_method, 1);
-    rb_define_method(rb_cMethod, "__file__", method_source_file_name, 0);
-    rb_define_method(rb_cMethod, "__line__", method_source_line, 0);
 
     rb_cUnboundMethod = rb_define_class("UnboundMethod", rb_cObject);
     rb_undef_alloc_func(rb_cUnboundMethod);
@@ -10362,9 +10296,16 @@ Init_Proc()
     rb_define_method(rb_cUnboundMethod, "name", method_name, 0);
     rb_define_method(rb_cUnboundMethod, "owner", method_owner, 0);
     rb_define_method(rb_cUnboundMethod, "bind", umethod_bind, 1);
+    rb_define_method(rb_cModule, "instance_method", rb_mod_method, 1);
+    
+#ifdef MBARI_API
     rb_define_method(rb_cUnboundMethod, "__file__", method_source_file_name, 0);
     rb_define_method(rb_cUnboundMethod, "__line__", method_source_line, 0);
-    rb_define_method(rb_cModule, "instance_method", rb_mod_method, 1);
+    rb_define_method(rb_cProc, "__file__", proc_source_file_name, 0);
+    rb_define_method(rb_cProc, "__line__", proc_source_line, 0);
+    rb_define_method(rb_cMethod, "__file__", method_source_file_name, 0);
+    rb_define_method(rb_cMethod, "__line__", method_source_line, 0);
+#endif
 }
 
 /*
@@ -10910,7 +10851,7 @@ static void
 rb_thread_save_context(th)
     rb_thread_t th;
 {
-    int len;
+    size_t len;
     static VALUE tval;
 
     len = ruby_stack_length(th->stk_start,&th->stk_pos);
@@ -11112,7 +11053,6 @@ rb_thread_restore_context(th, exit)
 
 #if HAVE_ALLOCA  /* use alloca to grow stack in O(1) time */
     VALUE v;
-    volatile VALUE *space;
 
     if (!th->stk_ptr) rb_bug("unsaved context");
 #  if !STACK_GROW_DIRECTION  /* unknown at compile time */
@@ -11120,13 +11060,15 @@ rb_thread_restore_context(th, exit)
 #  endif
 #  if STACK_GROW_DIRECTION <= 0
       pos -= th->stk_len;
-      if (&v > pos) space=ALLOCA_N(VALUE, &v-pos);
+      if (&v > pos) 
+        (volatile void *)ALLOCA_N(VALUE, &v-pos);
 #  endif
 #  if !STACK_GROW_DIRECTION
     }else
 #  endif
 #if STACK_GROW_DIRECTION >= 0  /* stack grows upward */
-      if (&v < pos + th->stk_len) space=ALLOCA_N(VALUE, pos+th->stk_len - &v);
+      if (&v < pos + th->stk_len) 
+        (volatile void *)ALLOCA_N(VALUE, pos+th->stk_len - &v);
 #  endif
 
 #else  /* recursive O(n/1024) if extending stack > 1024 VALUEs */
@@ -11737,8 +11679,6 @@ rb_thread_select(max, read, write, except, timeout)
     return curr_thread->select_value;
 }
 
-static int rb_thread_join _((rb_thread_t, double));
-
 static int
 rb_thread_join(th, limit)
     rb_thread_t th;
@@ -13450,7 +13390,7 @@ static VALUE
 rb_callcc(self)
     VALUE self;
 {
-    rb_thread_t th = prep4callcc();
+    volatile rb_thread_t th = prep4callcc();
     return THREAD_SAVE_CONTEXT(th) ?
       th->result
           :
@@ -13505,18 +13445,21 @@ rb_cont_call(argc, argv, cont)
 }
 
 
+#ifdef MBARI_API
 /*
  *  call-seq:
  *     cont.thread
  *  
  *  Returns the thread on which this continuation can be called
- *              (or nil if that thread has died)
+ *  or nil if that thread has died
  *
  *     t = Thread.new {callcc{|c| $x=c}; sleep 5}
  *     sleep 1
  *     $x.thread                             #=> t
  *     sleep 10
  *     $x.thread                             #=> nil
+ *
+ *  <i>Only available when MBARI_API extentions are enabled at build time</i>
  */
 static VALUE
 rb_cont_thread(cont)
@@ -13526,6 +13469,7 @@ rb_cont_thread(cont)
   cc_purge(th);
   return th->thread;
 }
+#endif
 
 
 struct thgroup {
@@ -13784,21 +13728,20 @@ rb_exec_recursive(func, obj, arg)
     VALUE obj;
     VALUE arg;
 {
-    VALUE hash = rb_thread_local_aref(rb_thread_current(), recursive_key);
-    VALUE objid = rb_obj_id(obj);
+    volatile VALUE hash = 
+      rb_thread_local_aref(rb_thread_current(), recursive_key);
+    volatile VALUE objid = rb_obj_id(obj);
 
     if (recursive_check(hash, objid)) {
 	return (*func) (obj, arg, Qtrue);
     }
     else {
-	VALUE result = Qundef;
+	VALUE result;
 	int state;
 
 	hash = recursive_push(hash, objid);
 	PUSH_TAG(PROT_NONE);
-	if ((state = EXEC_TAG()) == 0) {
-	    result = (*func) (obj, arg, Qfalse);
-	}
+	result = (state = EXEC_TAG()) ? Qundef : (*func) (obj, arg, Qfalse);
 	POP_TAG();
 	recursive_pop(hash, objid);
 	if (state)
@@ -13881,7 +13824,9 @@ Init_Thread()
     rb_undef_method(CLASS_OF(rb_cCont), "new");
     rb_define_method(rb_cCont, "call", rb_cont_call, -1);
     rb_define_method(rb_cCont, "[]", rb_cont_call, -1);
+#ifdef MBARI_API
     rb_define_method(rb_cCont, "thread", rb_cont_thread, 0);
+#endif
     rb_define_global_function("callcc", rb_callcc, 0);
     rb_global_variable(&cont_protect);
 
@@ -13933,10 +13878,11 @@ Init_Thread()
 
 static VALUE
 rb_f_catch(dmy, tag)
-    VALUE dmy, tag;
+    VALUE dmy;
+    volatile VALUE tag;
 {
     int state;
-    VALUE val = Qnil;		/* OK */
+    VALUE val;
 
     tag = ID2SYM(rb_to_id(tag));
     PUSH_TAG(tag);
diff --git a/gc.c b/gc.c
index 3314171..167dfcd 100644
--- a/gc.c
+++ b/gc.c
@@ -43,7 +43,7 @@ int _setjmp(), _longjmp();
 #if defined(MSDOS) || defined(__human68k__)
 #define GC_MALLOC_LIMIT 200000
 #else
-#define GC_MALLOC_LIMIT 8000000
+#define GC_MALLOC_LIMIT (2000000*sizeof(VALUE))
 #endif
 #endif
 
@@ -60,6 +60,7 @@ static VALUE *stack_limit, *gc_stack_limit;
 static size_t malloc_increase = 0;
 static size_t malloc_limit = GC_MALLOC_LIMIT;
 
+#ifdef MBARI_API
 /*
  *  call-seq:
  *     GC.limit    => increase limit in bytes
@@ -67,6 +68,7 @@ static size_t malloc_limit = GC_MALLOC_LIMIT;
  *  Get the # of bytes that may be allocated before triggering
  *  a mark and sweep by the garbarge collector to reclaim unused storage.
  *
+ *  <i>Only available when MBARI_API extentions are enabled at build time</i>
  */
 static VALUE gc_getlimit(VALUE mod)
 {
@@ -84,12 +86,14 @@ static VALUE gc_getlimit(VALUE mod)
  *     GC.limit=5000000   #=> 5000000
  *     GC.limit           #=> 5000000
  *     GC.limit=-50       #=> 5000000
- *     GC.limit=0         #=> 0
+ *     GC.limit=0         #=> 0  #functionally equivalent to GC.stress=true
  *
+ *  <i>Only available when MBARI_API extentions are enabled at build time</i>
  */
 static VALUE gc_setlimit(VALUE mod, VALUE newLimit)
 {
   long limit = NUM2LONG(newLimit);
+  rb_secure(2);
   if (limit < 0) return gc_getlimit(mod);
   malloc_limit = limit;
   return newLimit;
@@ -98,12 +102,13 @@ static VALUE gc_setlimit(VALUE mod, VALUE newLimit)
 
 /*
  *  call-seq:
- *     GC.increase
+ *     GC.growth
  *
  *  Get # of bytes that have been allocated since the last mark & sweep
  *
+ *  <i>Only available when MBARI_API extentions are enabled at build time</i>
  */
-static VALUE gc_increase(VALUE mod)
+static VALUE gc_growth(VALUE mod)
 {
   return ULONG2NUM(malloc_increase);
 }
@@ -115,6 +120,7 @@ static VALUE gc_increase(VALUE mod)
  *
  *  Purge ghost references from recently freed stack space
  *
+ *  <i>Only available when MBARI_API extentions are enabled at build time</i>
  */
 static VALUE gc_exorcise(VALUE mod)
 {
@@ -122,6 +128,55 @@ static VALUE gc_exorcise(VALUE mod)
   return Qnil;
 }
 
+#else /* no api changes */
+
+static size_t unstressed_malloc_limit = GC_MALLOC_LIMIT;
+
+/*
+ *  call-seq:
+ *    GC.stress                 => true or false
+ *
+ *  returns current status of GC stress mode.
+ *
+ *  <i>Only available when MBARI_API extentions are disabled at build time</i>
+ */
+
+static VALUE
+gc_stress_get(self)
+    VALUE self;
+{
+    return malloc_limit ? Qfalse : Qtrue;
+}
+
+/*
+ *  call-seq:
+ *    GC.stress = bool          => bool
+ *
+ *  updates GC stress mode.
+ *
+ *  When GC.stress = true, GC is invoked for all GC opportunity:
+ *  all memory and object allocation.
+ *
+ *  Since it makes Ruby very slow, it is only for debugging.
+ *
+ *  <i>Only available when MBARI_API extentions are enabled at build time</i>
+ */
+
+static VALUE
+gc_stress_set(self, bool)
+    VALUE self, bool;
+{
+    rb_secure(2);
+    if (!RTEST(bool))
+      malloc_limit = unstressed_malloc_limit;
+    else if (malloc_limit > 0) {
+      unstressed_malloc_limit = malloc_limit;
+      malloc_limit = 0;
+    }
+    return bool;
+}
+
+#endif /* MBARI_API */
 
 static void run_final();
 static VALUE nomem_error;
@@ -512,6 +567,7 @@ static unsigned int STACK_LEVEL_MAX = 655300;
 
 #ifndef nativeAllocA
   /* portable way to return an approximate stack pointer */
+NOINLINE(VALUE *__sp(void));
 VALUE *__sp(void) {
   VALUE tos;
   return &tos;
@@ -548,7 +604,7 @@ stack_grow_direction(addr)
 # define STACK_UPPER(a, b) (rb_gc_stack_grow_direction > 0 ? a : b)
 #endif
 
-int
+size_t
 ruby_stack_length(start, base)
     VALUE *start, **base;
 {
@@ -733,7 +789,7 @@ mark_locations_array(x, n)
     }
 }
 
-void inline
+inline void
 rb_gc_mark_locations(start, end)
     VALUE *start, *end;
 {
@@ -1103,7 +1159,7 @@ gc_sweep()
     RVALUE *p, *pend, *final_list;
     int freed = 0;
     int i;
-    unsigned long free_min = 0;
+    long free_min = 0;
 
     for (i = 0; i < heaps_used; i++) {
         free_min += heaps[i].limit;
@@ -1376,7 +1432,6 @@ garbage_collect_0(VALUE *top_frame)
 {
     struct gc_list *list;
     struct FRAME * frame;
-    jmp_buf save_regs_gc_mark;
     SET_STACK_END;
 
 #ifdef HAVE_NATIVETHREAD
@@ -1415,19 +1470,15 @@ garbage_collect_0(VALUE *top_frame)
 	mark_tbl(finalizer_table);
     }
 
-    FLUSH_REGISTER_WINDOWS;
-    /* This assumes that all registers are saved into the jmp_buf (and stack) */
-    rb_setjmp(save_regs_gc_mark);
-    mark_locations_array((VALUE*)save_regs_gc_mark, sizeof(save_regs_gc_mark) / sizeof(VALUE *));
 #if STACK_GROW_DIRECTION < 0
-    rb_gc_mark_locations(top_frame, rb_gc_stack_start);
+    rb_gc_mark_locations(top_frame, rb_curr_thread->stk_start);
 #elif STACK_GROW_DIRECTION > 0
-    rb_gc_mark_locations(rb_gc_stack_start, top_frame + 1);
+    rb_gc_mark_locations(rb_curr_thread->stk_start, top_frame + 1);
 #else
     if (rb_gc_stack_grow_direction < 0)
-	rb_gc_mark_locations(top_frame, rb_gc_stack_start);
+	rb_gc_mark_locations(top_frame, rb_curr_thread->stk_start);
     else
-	rb_gc_mark_locations(rb_gc_stack_start, top_frame + 1);
+	rb_gc_mark_locations(rb_curr_thread->stk_start, top_frame + 1);
 #endif
 #ifdef __ia64
     /* mark backing store (flushed register window on the stack) */
@@ -1436,7 +1487,7 @@ garbage_collect_0(VALUE *top_frame)
 #endif
 #if defined(__human68k__) || defined(__mc68000__)
     rb_gc_mark_locations((VALUE*)((char*)STACK_END + 2),
-			 (VALUE*)((char*)rb_gc_stack_start + 2));
+			 (VALUE*)((char*)rb_curr_thread->stk_start + 2));
 #endif
     rb_gc_mark_threads();
 
@@ -1473,13 +1524,17 @@ garbage_collect_0(VALUE *top_frame)
 static void
 garbage_collect()
 {
+  jmp_buf save_regs_gc_mark;
   VALUE *top = __sp();
+  FLUSH_REGISTER_WINDOWS;
+  /* This assumes that all registers are saved into the jmp_buf (and stack) */
+  rb_setjmp(save_regs_gc_mark);
+
 #if STACK_WIPE_SITES & 0x400
 # ifdef nativeAllocA
   if (__stack_past (top, stack_limit)) {
   /* allocate a large frame to ensure app stack cannot grow into GC stack */
-    volatile char *spacer = 
-                    nativeAllocA(__stack_depth((void*)stack_limit,(void*)top));
+    (volatile void*) nativeAllocA(__stack_depth((void*)stack_limit,(void*)top));
   }  
   garbage_collect_0(top);
 # else /* no native alloca() available */
@@ -2123,10 +2178,15 @@ Init_GC()
     rb_define_singleton_method(rb_mGC, "start", rb_gc_start, 0);
     rb_define_singleton_method(rb_mGC, "enable", rb_gc_enable, 0);
     rb_define_singleton_method(rb_mGC, "disable", rb_gc_disable, 0);
+#ifdef MBARI_API
     rb_define_singleton_method(rb_mGC, "limit", gc_getlimit, 0);
     rb_define_singleton_method(rb_mGC, "limit=", gc_setlimit, 1);
-    rb_define_singleton_method(rb_mGC, "increase", gc_increase, 0);
+    rb_define_singleton_method(rb_mGC, "growth", gc_growth, 0);
     rb_define_singleton_method(rb_mGC, "exorcise", gc_exorcise, 0);
+#else
+    rb_define_singleton_method(rb_mGC, "stress", gc_stress_get, 0);
+    rb_define_singleton_method(rb_mGC, "stress=", gc_stress_set, 1);
+#endif
     rb_define_method(rb_mGC, "garbage_collect", rb_gc_start, 0);
 
     rb_mObSpace = rb_define_module("ObjectSpace");
diff --git a/intern.h b/intern.h
index e434bc5..ee9185e 100644
--- a/intern.h
+++ b/intern.h
@@ -251,7 +251,7 @@ VALUE rb_file_directory_p _((VALUE,VALUE));
 /* gc.c */
 NORETURN(void rb_memerror __((void)));
 int ruby_stack_check _((void));
-int ruby_stack_length _((VALUE *,VALUE**));
+size_t ruby_stack_length _((VALUE *,VALUE**));
 int rb_during_gc _((void));
 char *rb_source_filename _((const char*));
 void rb_gc_mark_locations _((VALUE*, VALUE*));
diff --git a/node.h b/node.h
index e79f526..3295cf7 100644
--- a/node.h
+++ b/node.h
@@ -409,13 +409,11 @@ struct rb_thread {
 
     VALUE result;
 
-    long   stk_len, stk_max;
+    size_t stk_len, stk_max;
     VALUE *stk_ptr, *stk_pos, *stk_start;
 #ifdef __ia64
-    long   bstr_len;
-    long   bstr_max;
-    VALUE *bstr_ptr;
-    VALUE *bstr_pos;
+    size_t   bstr_len, bstr_max;
+    VALUE *bstr_ptr, *bstr_pos;
 #endif
 
     struct FRAME *frame;
diff --git a/re.c b/re.c
index a0ac6a8..85d013c 100644
--- a/re.c
+++ b/re.c
@@ -1468,18 +1468,18 @@ VALUE
 rb_reg_regcomp(str)
     VALUE str;
 {
-    volatile VALUE save_str = str;
-    if (reg_cache && RREGEXP(reg_cache)->len == RSTRING(str)->len
-	&& case_cache == ruby_ignorecase
-	&& kcode_cache == reg_kcode
-	&& memcmp(RREGEXP(reg_cache)->str, RSTRING(str)->ptr, RSTRING(str)->len) == 0)
-	return reg_cache;
-
-    case_cache = ruby_ignorecase;
-    kcode_cache = reg_kcode;
-    reg_cache = rb_reg_new(RSTRING(str)->ptr, RSTRING(str)->len, ruby_ignorecase);
-    RB_GC_GUARD(save_str);
+  if (reg_cache && RREGEXP(reg_cache)->len == RSTRING(str)->len
+       && case_cache == ruby_ignorecase
+       && kcode_cache == reg_kcode
+       && memcmp(RREGEXP(reg_cache)->str, RSTRING(str)->ptr, 
+          RSTRING(str)->len) == 0)
     return reg_cache;
+
+  case_cache = ruby_ignorecase;
+  kcode_cache = reg_kcode;
+  reg_cache = rb_reg_new(RSTRING(str)->ptr, RSTRING(str)->len, ruby_ignorecase);
+  RB_GC_GUARD(str);
+  return reg_cache;
 }
 
 static int
diff --git a/rubysig.h b/rubysig.h
index 8a11cf4..fae0869 100644
--- a/rubysig.h
+++ b/rubysig.h
@@ -15,6 +15,11 @@
 
 #include <errno.h>
 
+#if defined __ppc__ || defined __powerpc__ || \
+    defined __ppc64__ || defined __powerpc64__
+#define __anyPowerPC__ 1  /* for compatibility with older gcc versions */
+#endif
+
 /* STACK_WIPE_SITES determines where attempts are made to exorcise
    "ghost object refereces" from the stack and how the stack is cleared:
    
@@ -65,7 +70,7 @@
 #ifndef STACK_WIPE_SITES
 # ifdef __x86_64__     /* deal with "red zone" by not inlining stack clearing */
 #  define STACK_WIPE_SITES  0x6770
-# elif defined __ppc__ || defined __ppc64__   /* On any PowerPC, deal with... */
+# elif defined __anyPowerPC__   /* On any PowerPC, deal with... */
 #  define STACK_WIPE_SITES  0x7764   /* red zone & alloc(0) doesn't return sp */
 # else
 #  define STACK_WIPE_SITES  0x8770 /*normal case, use 0x4770 if problems arise*/
@@ -211,11 +216,12 @@ static inline VALUE *__sp(void) \
   VALUE *sp; asm(asmb); \
   return sp; \
 }
-#  if defined __ppc__ || defined __ppc64__
+#  ifdef __anyPowerPC__
 __defspfn("addi %0, r1, 0": "=r"(sp))
 #  elif defined  __i386__
 __defspfn("movl %%esp, %0": "=r"(sp))
 #  elif defined __x86_64__
+#warn ===> x86_64 inline assembler is known to crash -- change STACK_WIPE_SITES
 __defspfn("movq %%rsp, %0": "=r"(sp))
 #  elif __arm__
 __defspfn("mov %0, sp": "=r"(sp))
diff --git a/test/ruby/suicide.rb b/test/ruby/suicide.rb
index 2687ed0..c7a0a67 100644
--- a/test/ruby/suicide.rb
+++ b/test/ruby/suicide.rb
@@ -1,2 +1,4 @@
 STDERR.reopen(STDOUT)
-at_exit{Process.kill(:INT, $$)}
+at_exit{Process.kill(:INT, $$); sleep 0}
+# brent@mbari.org says
+#  sleep 0 avoids race between process termination and signal reception
diff --git a/version.h b/version.h
index c608764..b336dd7 100644
--- a/version.h
+++ b/version.h
@@ -1,15 +1,15 @@
 #define RUBY_VERSION "1.8.7"
-#define RUBY_RELEASE_DATE "2009-2-9"
+#define RUBY_RELEASE_DATE "2009-3-1"
 #define RUBY_VERSION_CODE 187
-#define RUBY_RELEASE_CODE 20090209
+#define RUBY_RELEASE_CODE 20090301
 #define RUBY_PATCHLEVEL 72
 
 #define RUBY_VERSION_MAJOR 1
 #define RUBY_VERSION_MINOR 8
 #define RUBY_VERSION_TEENY 7
 #define RUBY_RELEASE_YEAR 2009
-#define RUBY_RELEASE_MONTH 2
-#define RUBY_RELEASE_DAY 9
+#define RUBY_RELEASE_MONTH 3
+#define RUBY_RELEASE_DAY 1
 
 #ifdef RUBY_EXTERN
 RUBY_EXTERN const char ruby_version[];
@@ -28,7 +28,14 @@ RUBY_EXTERN const char *ruby_copyright;
 #include "rubysig.h"
 
 #define string_arg(s) #s
-#define MBARI_RELEASE(wipe_sites) "MBARI 7/" string_arg(wipe_sites)
+
+#ifdef MBARI_API
+#define _mbari_rev_ "MBARI"
+#else
+#define _mbari_rev_ "mbari"
+#endif
+
+#define MBARI_RELEASE(wipe_sites) _mbari_rev_ " 8B/" string_arg(wipe_sites)
 
 #define RUBY_RELEASE_STR MBARI_RELEASE(STACK_WIPE_SITES) " on patchlevel"
 #define RUBY_RELEASE_NUM RUBY_PATCHLEVEL
--- mbari8A/configure	2008-08-10 17:39:51.000000000 -0700
+++ matzruby/configure	2009-02-25 21:16:28.000000000 -0800
@@ -1347,6 +1347,7 @@
   --disable-FEATURE       do not include FEATURE (same as --enable-FEATURE=no)
   --enable-FEATURE[=ARG]  include FEATURE [ARG=yes]
   --enable-frame-address  use GCC __builtin_frame_address().
+  --enable-mbari-api      enable API changes from the MBARI patches.
   --disable-largefile     omit support for large files
   --enable-pthread        use pthread library.
   --disable-fastthread    do not use the fastthread mutex
@@ -1359,6 +1360,7 @@
   --with-PACKAGE[=ARG]    use PACKAGE [ARG=yes]
   --without-PACKAGE       do not use PACKAGE (same as --with-PACKAGE=no)
   --without-gcc           never use gcc
+  --with-wipe-sites=MASK  override default STACK_WIPES_SITES mask in rubysig.h
   --with-winsock2         link winsock2 (MinGW only)
   --with-libc_r           link libc_r if possible (FreeBSD only)
   --with-setjmp-type      select setjmp type
@@ -1367,7 +1369,7 @@
   --with-static-linked-ext link external modules statically
   --with-sitedir=DIR      site libraries in DIR [LIBDIR/ruby/site_ruby]
   --with-vendordir=DIR    vendor libraries in DIR [LIBDIR/ruby/vendor_ruby]
-  --with-search-path=DIR specify the additional search path
+  --with-search-path= DIR specify the additional search path
   --with-mantype=TYPE specify man page type; TYPE is one of man and doc
 
 Some influential environment variables:
@@ -2042,6 +2044,35 @@
 _ACEOF
 
 fi
+# Check whether --enable-mbari-api was given.
+if test "${enable_mbari_api+set}" = set; then
+  enableval=$enable_mbari_api; mbari_api=$enableval
+fi
+
+if test "$mbari_api" = yes; then
+    cat >>confdefs.h <<\_ACEOF
+#define MBARI_API 1
+_ACEOF
+
+fi
+
+# Check whether --with-wipe-sites was given.
+if test "${with_wipe_sites+set}" = set; then
+  withval=$with_wipe_sites; wipe_sites=$withval
+fi
+
+if test "$wipe_sites" != ""; then
+  case $wipe_sites in
+       none|no)  wipe_sites=0x0;;
+       yes) wipe_sites=;;
+  esac
+  if test -n "$wipe_sites"; then
+    cat >>confdefs.h <<_ACEOF
+#define STACK_WIPE_SITES $wipe_sites
+_ACEOF
+
+  fi
+fi
 
 test "$program_prefix" != NONE &&
   program_transform_name="s&^&$program_prefix&;$program_transform_name"
src/rvm/patches/ruby/1.8.7/p72/mbari-2.patch000066400000020740147511530530014115 0ustar00diff -rux '*.o' ruby-1.8.7-p72/ChangeLog ruby-1.8.7-mbari/ChangeLog
--- ruby-1.8.7-p72/ChangeLog	2008-12-12 21:32:52.000000000 -0800
+++ ruby-1.8.7-mbari/ChangeLog	2008-12-12 21:58:04.000000000 -0800
@@ -1,3 +1,14 @@
+Tue Dec 12  6:11:36 2008  Brent Roman  <brent@mbari.org>
+
+        * eval.c:  exclude other thread's stack frames from current one
+
+        * gc.c:  STACK_LENGTH macro takes start parameter
+
+        * node.h: added stk_start pointer to ruby thread struct
+
+        * intern.h:  stack_length takes base pointer as parameter
+        
+
 Tue Dec  9  8:11:36 2008  Brent Roman  <brent@mbari.org>
 
      * eval.c:  added Continuation.thread method
diff -rux '*.o' ruby-1.8.7-p72/eval.c ruby-1.8.7-mbari/eval.c
--- ruby-1.8.7-p72/eval.c	2008-12-12 21:32:52.000000000 -0800
+++ ruby-1.8.7-mbari/eval.c	2008-12-12 22:34:34.000000000 -0800
@@ -3,7 +3,7 @@
   eval.c -
 
   $Author: brent $
-  $Date: 2008/12/11 04:42:40 $
+  $Date: 2008/12/13 06:34:34 $
   created at: Thu Jun 10 14:22:17 JST 1993
 
   Copyright (C) 1993-2003 Yukihiro Matsumoto
@@ -5141,6 +5141,7 @@
 		    tt->retval = result;
 		    JUMP_TAG(TAG_BREAK);
 		}
+                if (tt->tag == PROT_THREAD) break;
 		tt = tt->prev;
 	    }
 	    proc_jump_error(TAG_BREAK, result);
@@ -6572,6 +6573,7 @@
 
 	    scope_dup(ruby_scope);
 	    for (tag=prot_tag; tag; tag=tag->prev) {
+                if (tag->tag == PROT_THREAD) break;
 		scope_dup(tag->scope);
 	    }
 	    for (vars = ruby_dyna_vars; vars; vars = vars->next) {
@@ -10367,14 +10369,19 @@
     return (double)tv.tv_sec + (double)tv.tv_usec * 1e-6;
 }
 
-#define STACK(addr) (th->stk_pos<(VALUE*)(addr) && (VALUE*)(addr)<th->stk_pos+th->stk_len)
-#define ADJ(addr) (void*)(STACK(addr)?(((VALUE*)(addr)-th->stk_pos)+th->stk_ptr):(VALUE*)(addr))
+
+#define ADJ(addr) \
+   if ((size_t)((void *)addr - stkBase) < stkSize) addr=(void *)addr + stkShift
+
 static void
 thread_mark(th)
     rb_thread_t th;
 {
     struct FRAME *frame;
     struct BLOCK *block;
+    void *stkBase;
+    ptrdiff_t stkShift;
+    size_t stkSize;
 
     rb_gc_mark(th->result);
     rb_gc_mark(th->thread);
@@ -10409,15 +10416,26 @@
 	}
 #endif
     }
+
+    stkBase = (void *)th->stk_start;
+    stkSize = th->stk_len * sizeof(VALUE);
+#if STACK_GROW_DIRECTION == 0
+    if ((VALUE *)&th < rb_gc_stack_start)
+#endif
+#if STACK_GROW_DIRECTION <= 0
+      stkBase -= stkSize;
+#endif
+    stkShift = (void *)th->stk_ptr - stkBase;
+    
     frame = th->frame;
     while (frame && frame != top_frame) {
-	frame = ADJ(frame);
+	ADJ(frame);
 	rb_gc_mark_frame(frame);
 	if (frame->tmp) {
 	    struct FRAME *tmp = frame->tmp;
 
 	    while (tmp && tmp != top_frame) {
-		tmp = ADJ(tmp);
+		ADJ(tmp);
 		rb_gc_mark_frame(tmp);
 		tmp = tmp->prev;
 	    }
@@ -10426,7 +10444,7 @@
     }
     block = th->block;
     while (block) {
-	block = ADJ(block);
+	ADJ(block);
 	rb_gc_mark_frame(&block->frame);
 	block = block->prev;
     }
@@ -10579,13 +10597,10 @@
 rb_thread_save_context(th)
     rb_thread_t th;
 {
-    VALUE *pos;
     int len;
     static VALUE tval;
 
-    len = ruby_stack_length(&pos);
-    th->stk_len = 0;
-    th->stk_pos = pos;
+    len = ruby_stack_length(th->stk_start,&th->stk_pos);
     if (len > th->stk_max) {
 	VALUE *ptr = realloc(th->stk_ptr, sizeof(VALUE) * len);
 	if (!ptr) rb_memerror();
@@ -12065,6 +12080,7 @@
     th->result = 0;\
     th->flags = 0;\
 \
+    th->stk_start = rb_gc_stack_start;\
     th->stk_ptr = 0;\
     th->stk_len = 0;\
     th->stk_max = 0;\
@@ -12234,6 +12250,16 @@
 		 "can't start a new thread (frozen ThreadGroup)");
     }
 
+
+    th->stk_start =   /* establish start of new thread's stack */
+#if STACK_GROW_DIRECTION > 0
+      (VALUE *)ruby_frame;
+#elif STACK_GROW_DIRECTION < 0
+      (VALUE *)(ruby_frame+1);
+#else
+      (VALUE *)(ruby_frame+((VALUE *)(&arg)<rb_gc_stack_start))
+#endif
+ 
     if (!thread_init) {
 	thread_init = 1;
 #if defined(HAVE_SETITIMER) || defined(_THREAD_SAFE)
@@ -12277,6 +12303,8 @@
     PUSH_TAG(PROT_THREAD);
     if ((state = EXEC_TAG()) == 0) {
 	if (THREAD_SAVE_CONTEXT(th) == 0) {
+            ruby_frame->prev = top_frame;     /* hide parent thread's frames */
+            ruby_frame->tmp = 0;           
 	    curr_thread = th;
 	    th->result = (*fn)(arg, th);
 	}
@@ -12388,9 +12416,6 @@
     VALUE klass;
 {
     rb_thread_t th = rb_thread_alloc(klass);
-    volatile VALUE *pos;
-
-    pos = th->stk_pos;
     rb_obj_call_init(th->thread, argc, argv);
     if (th->stk_pos == 0) {
 	rb_raise(rb_eThreadError, "uninitialized thread - check `%s#initialize'",
@@ -13082,6 +13107,7 @@
 
     scope_dup(ruby_scope);
     for (tag=prot_tag; tag; tag=tag->prev) {
+        if (tag->tag == PROT_THREAD) break;
 	scope_dup(tag->scope);
     }
 
diff -rux '*.o' ruby-1.8.7-p72/gc.c ruby-1.8.7-mbari/gc.c
--- ruby-1.8.7-p72/gc.c	2008-08-03 20:24:26.000000000 -0700
+++ ruby-1.8.7-mbari/gc.c	2008-12-12 21:47:46.000000000 -0800
@@ -2,8 +2,8 @@
 
   gc.c -
 
-  $Author: shyouhei $
-  $Date: 2008-08-04 12:24:26 +0900 (Mon, 04 Aug 2008) $
+  $Author: brent $
+  $Date: 2008/12/13 05:47:46 $
   created at: Tue Oct  5 09:44:46 JST 1993
 
   Copyright (C) 1993-2003 Yukihiro Matsumoto
@@ -506,12 +506,12 @@
 # define STACK_END (stack_end)
 #endif
 #if STACK_GROW_DIRECTION < 0
-# define STACK_LENGTH  (rb_gc_stack_start - STACK_END)
+# define STACK_LENGTH(start)  ((start) - STACK_END)
 #elif STACK_GROW_DIRECTION > 0
-# define STACK_LENGTH  (STACK_END - rb_gc_stack_start + 1)
+# define STACK_LENGTH(start)  (STACK_END - (start) + 1)
 #else
-# define STACK_LENGTH  ((STACK_END < rb_gc_stack_start) ? rb_gc_stack_start - STACK_END\
-                                           : STACK_END - rb_gc_stack_start + 1)
+# define STACK_LENGTH(start)  ((STACK_END < (start)) ? (start) - STACK_END\
+                                           : STACK_END - (start) + 1)
 #endif
 #if STACK_GROW_DIRECTION > 0
 # define STACK_UPPER(x, a, b) a
@@ -536,16 +536,16 @@
 
 #define CHECK_STACK(ret) do {\
     SET_STACK_END;\
-    (ret) = (STACK_LENGTH > STACK_LEVEL_MAX + GC_WATER_MARK);\
+    (ret) = (STACK_LENGTH(rb_gc_stack_start) > STACK_LEVEL_MAX + GC_WATER_MARK);\
 } while (0)
 
 int
-ruby_stack_length(p)
-    VALUE **p;
+ruby_stack_length(start, base)
+    VALUE *start, **base;
 {
     SET_STACK_END;
-    if (p) *p = STACK_UPPER(STACK_END, rb_gc_stack_start, STACK_END);
-    return STACK_LENGTH;
+    if (base) *base = STACK_UPPER(STACK_END, start, STACK_END);
+    return STACK_LENGTH(start);
 }
 
 int
diff -rux '*.o' ruby-1.8.7-p72/intern.h ruby-1.8.7-mbari/intern.h
--- ruby-1.8.7-p72/intern.h	2008-07-06 20:29:28.000000000 -0700
+++ ruby-1.8.7-mbari/intern.h	2008-12-12 21:03:16.000000000 -0800
@@ -251,7 +251,7 @@
 /* gc.c */
 NORETURN(void rb_memerror __((void)));
 int ruby_stack_check _((void));
-int ruby_stack_length _((VALUE**));
+int ruby_stack_length _((VALUE *,VALUE**));
 int rb_during_gc _((void));
 char *rb_source_filename _((const char*));
 void rb_gc_mark_locations _((VALUE*, VALUE*));
diff -rux '*.o' ruby-1.8.7-p72/node.h ruby-1.8.7-mbari/node.h
--- ruby-1.8.7-p72/node.h	2008-07-06 23:17:24.000000000 -0700
+++ ruby-1.8.7-mbari/node.h	2008-12-12 21:02:23.000000000 -0800
@@ -2,8 +2,8 @@
 
   node.h -
 
-  $Author: shyouhei $
-  $Date: 2008-07-07 15:17:24 +0900 (Mon, 07 Jul 2008) $
+  $Author: brent $
+  $Date: 2008/12/13 05:02:23 $
   created at: Fri May 28 15:14:02 JST 1993
 
   Copyright (C) 1993-2003 Yukihiro Matsumoto
@@ -409,10 +409,8 @@
 
     VALUE result;
 
-    long   stk_len;
-    long   stk_max;
-    VALUE *stk_ptr;
-    VALUE *stk_pos;
+    long   stk_len, stk_max;
+    VALUE *stk_ptr, *stk_pos, *stk_start;
 #ifdef __ia64
     long   bstr_len;
     long   bstr_max;
diff -rux '*.o' ruby-1.8.7-p72/version.h ruby-1.8.7-mbari/version.h
--- ruby-1.8.7-p72/version.h	2008-12-12 21:32:52.000000000 -0800
+++ ruby-1.8.7-mbari/version.h	2008-12-12 21:31:44.000000000 -0800
@@ -1,7 +1,7 @@
 #define RUBY_VERSION "1.8.7"
-#define RUBY_RELEASE_DATE "2008-12-09"
+#define RUBY_RELEASE_DATE "2008-12-12"
 #define RUBY_VERSION_CODE 187
-#define RUBY_RELEASE_CODE 20081209
+#define RUBY_RELEASE_CODE 20081212
 #define RUBY_PATCHLEVEL 72
 
 #define RUBY_VERSION_MAJOR 1
@@ -9,7 +9,7 @@
 #define RUBY_VERSION_TEENY 7
 #define RUBY_RELEASE_YEAR 2008
 #define RUBY_RELEASE_MONTH 12
-#define RUBY_RELEASE_DAY 9
+#define RUBY_RELEASE_DAY 12
 
 #ifdef RUBY_EXTERN
 RUBY_EXTERN const char ruby_version[];
@@ -25,7 +25,7 @@
 #define RUBY_BIRTH_MONTH 2
 #define RUBY_BIRTH_DAY 24
 
-#define RUBY_RELEASE_STR "MBARI 1 on patchlevel"
+#define RUBY_RELEASE_STR "MBARI 2 on patchlevel"
 #define RUBY_RELEASE_NUM RUBY_PATCHLEVEL
 
 
src/rvm/patches/ruby/1.8.7/p72/mbari7.patch000066400000122657147511530530014057 0ustar00diff -ru ruby-1.8.7-p72/ChangeLog ruby-1.8.7-mbari/ChangeLog
--- ruby-1.8.7-p72/ChangeLog	2009-02-09 21:21:30.000000000 -0800
+++ ruby-1.8.7-mbari/ChangeLog	2009-02-09 20:24:44.000000000 -0800
@@ -1,3 +1,126 @@
+Mon Feb 09 00:01:19 2009  Brent Roman  <brent@mbari.org>
+
+        * rubysig.h:  default values for STACK_WIPE_SITES if x86_64
+                      cast builtin_alloca result to (VALUE *)
+        
+        * gc.c:  don't use builtin-frame-address at all
+        
+        * version.h:  bumped date
+
+Sun Feb 08 00:01:19 2009  Brent Roman  <brent@mbari.org>
+
+        * rubysig.h:  changed default values for STACK_WIPE_SITES
+        
+        * gc.c:  don't trust config's USE_BUILTIN_FRAME_ADDRESS
+        
+        * version.h:  bumped date
+
+
+Thu Jan 23 00:01:19 2009  Brent Roman  <brent@mbari.org>
+
+        * rubysig.h:  remapped wipe methods to avoid values > 9
+                      added cases for __ppc64__ and __x86_64__
+        
+        * missing/alloca.c:  made 64-bit clean
+        
+        * version.h:  bumped date
+        
+        
+Sun Jan 18 20:15:36 2009  Brent Roman  <brent@mbari.org>
+
+        * rubysig.h:  added support for STACK_WIPE_METHOD==5 (x86 asm)
+
+        * gc.c:       allow another STACK_WIPE_METHOD
+
+        * version.h:  bumped date
+
+
+Sat Jan 17 20:15:36 2009  Brent Roman  <brent@mbari.org>
+
+        * gc.c:     use separate gc stack so it never need be wiped
+
+        * version.h:  bumped date
+
+
+Fri Jan 16 20:15:36 2009  Brent Roman  <brent@mbari.org>
+
+        * gc.c:     added GC_STACK_PAD, renamed stack_gc_limit->gc_stack_limit
+                    optionally wipe the entire GC stack after each gc pass
+        
+        * rubysig.h:  default STACK_WIPE_SITES changed to 0x4770
+        
+        * version.h:  bumped date
+
+
+Wed Jan 14 20:15:36 2009  Brent Roman  <brent@mbari.org>
+
+        * eval.c:     declare wipe_after with gnu always_inline attribute
+        
+        * rubysig.h:  use alloca(0) to get sp for all CPU except PowerPC
+                      (less likely to trash stack when clearing it)
+        
+        * version.h:  bumped date
+
+
+Sun Jan 13 20:15:36 2009  Brent Roman  <brent@mbari.org>
+
+        * rubysig.h:  moved #defs to configure alloca here from gc.c
+                      added missing # to #else
+        
+        * gc.c: removed #defs to configurure alloca
+                set_stack_size must handle signed rlim_t for Darwin & BSD Unix
+                
+        * version.h:  bumped date
+
+
+Sun Jan 11 20:15:36 2009  Brent Roman  <brent@mbari.org>
+
+        * rubysig.h:  added support for multiple STACK_WIPE_METHODs
+                      added __stack_depth()
+                      added 2nd param to stack_past()
+                      __sp() returns stack pointer in an efficent, portable way                     
+        
+        * gc.c: STACK_END uses __sp()
+                STACK_UPPER now takes only two parameters
+                added rb_gc_wipe_stack()               
+                rb_mark_tbl() and mark_hash() implemented as #define macros
+                added STACK_END parameters to __stack_past() invocations
+                exploited missed opportunities for tail recursion in markchilren
+                
+        * version.h:  bumped date
+
+
+Mon Jan  5 20:15:36 2009  Brent Roman  <brent@mbari.org>
+
+        * common.mk:  added dependency on rubysig.h to version.h     
+        
+        * eval.c:  added wipeAfter and STACK_WIPE_SITES cofiguration options
+        
+        * gc.c: added STACK_WIPE_SITES cofiguration options
+                added GC.exorcise method
+        
+        * rubysig.h:  added STACK_WIPE_SITES cofiguration options
+                      when available, use gcc asm to optimize wipe_stack
+        
+        * version.h:  include STACK_WIPE_SITES options in MBARI release string
+
+        
+Sun Jan  4 20:15:36 2009  Brent Roman  <brent@mbari.org>
+
+        * eval.c:  eliminated up_stk_extent(), wipe_stack in rb_thread_switch
+        
+        * gc.c: removed lev counter args, check stack pointer instead
+                streamlined SET_STACK_END and STACK_END, stack_length(), etc.
+                added TOP_FRAME to use gcc's builtin frame_address
+                optimized is_heap_pointer()
+                gc_mark_rest() does not need to copy entire mark_stack!
+                added set_stack_size() to properly hande RLIM_INFINITY
+                
+        * rubysig.h:  repaired broken pseudo preemptive thread switching
+                      removed rb_gc_malloc_increase & limit
+                      replaced buggy __stack_grown* with __stack_past* macros
+        
+
 Tue Dec 19 20:15:36 2008  Brent Roman  <brent@mbari.org>
 
         * eval.c:  added (Method|Proc)#(__line__|__file__) methods
diff -ru ruby-1.8.7-p72/common.mk ruby-1.8.7-mbari/common.mk
--- ruby-1.8.7-p72/common.mk	2008-08-03 22:05:38.000000000 -0700
+++ ruby-1.8.7-mbari/common.mk	2009-01-05 01:18:37.000000000 -0800
@@ -462,7 +462,7 @@
   {$(VPATH)}env.h {$(VPATH)}node.h {$(VPATH)}st.h {$(VPATH)}util.h
 version.$(OBJEXT): {$(VPATH)}version.c {$(VPATH)}ruby.h config.h \
   {$(VPATH)}defines.h {$(VPATH)}intern.h {$(VPATH)}missing.h \
-  {$(VPATH)}version.h
+  {$(VPATH)}rubysig.h {$(VPATH)}version.h
 
 dist: $(PROGRAM)
 	$(RUNRUBY) $(srcdir)/distruby.rb
diff -ru ruby-1.8.7-p72/eval.c ruby-1.8.7-mbari/eval.c
--- ruby-1.8.7-p72/eval.c	2009-02-09 21:21:30.000000000 -0800
+++ ruby-1.8.7-mbari/eval.c	2009-01-22 02:54:08.000000000 -0800
@@ -3,7 +3,7 @@
   eval.c -
 
   $Author: brent $
-  $Date: 2008/12/20 07:47:22 $
+  $Date: 2009/01/15 07:41:46 $
   created at: Thu Jun 10 14:22:17 JST 1993
 
   Copyright (C) 1993-2003 Yukihiro Matsumoto
@@ -1028,14 +1028,26 @@
 #define PROT_LAMBDA INT2FIX(2)	/* 5 */
 #define PROT_YIELD  INT2FIX(3)	/* 7 */
 
-#define EXEC_TAG()    ruby_setjmp(((void)0), prot_tag->buf)
-
-static inline 
-int up_stk_extent(int status)
+#if STACK_WIPE_SITES & 0x42
+#ifdef __GNUC__
+static inline int wipeAfter(int) __attribute__((always_inline));
+#endif
+static inline int wipeAfter(int status)
 {
-  rb_gc_update_stack_extent();
+  rb_gc_wipe_stack();
   return status;
 }
+#else
+#define wipeAfter(status) status
+#endif
+#if STACK_WIPE_SITES & 2
+#define wipeAfterTag(status) wipeAfter(status)
+#else
+#define wipeAfterTag(status) status
+#endif
+
+#define EXEC_TAG_0()  ruby_setjmp(((void)0), prot_tag->buf)
+#define EXEC_TAG()    wipeAfterTag(EXEC_TAG_0())
 
 #define JUMP_TAG(st) do {		\
     ruby_frame = prot_tag->frame;	\
@@ -1116,6 +1128,12 @@
 
 static VALUE rb_yield_0 _((VALUE, VALUE, VALUE, int, int));
 
+#if STACK_WIPE_SITES & 0x20
+#define wipeBeforeYield()  rb_gc_wipe_stack()
+#else
+#define wipeBeforeYield()  (void)0
+#endif
+
 #define YIELD_LAMBDA_CALL 1
 #define YIELD_PROC_CALL   2
 #define YIELD_PUBLIC_DEF  4
@@ -3079,6 +3097,9 @@
 	  goto while_out;
       do {
 	while_redo:
+#if STACK_WIPE_SITES & 0x10
+          rb_gc_wipe_stack();
+#endif
 	  rb_eval(self, node->nd_body);
 	while_next:
 	  ;
@@ -3121,6 +3142,9 @@
 	  goto until_out;
       do {
         until_redo:
+#if STACK_WIPE_SITES & 0x10
+          rb_gc_wipe_stack();
+#endif
 	  rb_eval(self, node->nd_body);
         until_next:
 	  ;
@@ -5347,6 +5371,7 @@
 rb_yield(val)
     VALUE val;
 {
+    wipeBeforeYield();
     return rb_yield_0(val, 0, 0, 0, Qfalse);
 }
 
@@ -5395,6 +5420,7 @@
 loop_i()
 {
     for (;;) {
+        wipeBeforeYield();
 	rb_yield_0(Qundef, 0, 0, 0, Qfalse);
 	CHECK_INTS;
     }
@@ -10949,6 +10975,9 @@
 rb_thread_switch(n)
     int n;
 {
+#if STACK_WIPE_SITES & 1
+    rb_gc_wipe_stack();
+#endif
     rb_trap_immediate = (curr_thread->flags&0x100)?1:0;
     switch (n) {
       case 0:
@@ -10985,7 +11014,7 @@
     return 1;
 }
 
-#define THREAD_SAVE_CONTEXT(th) (rb_thread_switch(up_stk_extent( \
+#define THREAD_SAVE_CONTEXT(th) (rb_thread_switch( wipeAfter(\
                   ruby_setjmp(rb_thread_save_context(th), (th)->context))))
 
 NORETURN(static void rb_thread_restore_context _((rb_thread_t,int)));
@@ -13911,7 +13940,7 @@
 
     tag = ID2SYM(rb_to_id(tag));
     PUSH_TAG(tag);
-    if ((state = EXEC_TAG()) == 0) {
+    if ((state = wipeAfter(EXEC_TAG_0())) == 0) {
 	val = rb_yield_0(tag, 0, 0, 0, Qfalse);
     }
     else if (state == TAG_THROW && tag == prot_tag->dst) {
@@ -13979,6 +14008,9 @@
     if (!tt) {
 	rb_name_error(SYM2ID(tag), "uncaught throw `%s'", rb_id2name(SYM2ID(tag)));
     }
+#if STACK_WIPE_SITES & 0x800
+    rb_gc_update_stack_extent();
+#endif
     rb_trap_restore_mask();
     JUMP_TAG(TAG_THROW);
 #ifndef __GNUC__
diff -ru ruby-1.8.7-p72/gc.c ruby-1.8.7-mbari/gc.c
--- ruby-1.8.7-p72/gc.c	2009-02-09 21:21:30.000000000 -0800
+++ ruby-1.8.7-mbari/gc.c	2009-02-09 20:24:44.000000000 -0800
@@ -3,7 +3,7 @@
   gc.c -
 
   $Author: brent $
-  $Date: 2008/12/18 07:43:46 $
+  $Date: 2009/02/09 20:45:03 $
   created at: Tue Oct  5 09:44:46 JST 1993
 
   Copyright (C) 1993-2003 Yukihiro Matsumoto
@@ -22,10 +22,6 @@
 #include <setjmp.h>
 #include <sys/types.h>
 
-#ifdef HAVE_SYS_TIME_H
-#include <sys/time.h>
-#endif
-
 #ifdef HAVE_SYS_RESOURCE_H
 #include <sys/resource.h>
 #endif
@@ -43,25 +39,6 @@
 int _setjmp(), _longjmp();
 #endif
 
-/* Make alloca work the best possible way.  */
-#ifdef __GNUC__
-# ifndef atarist
-#  ifndef alloca
-#   define alloca __builtin_alloca
-#  endif
-# endif /* atarist */
-#else
-# ifdef HAVE_ALLOCA_H
-#  include <alloca.h>
-# else
-#  ifndef _AIX
-#   ifndef alloca /* predefined by HP cc +Olibcalls */
-void *alloca ();
-#   endif
-#  endif /* AIX */
-# endif /* HAVE_ALLOCA_H */
-#endif /* __GNUC__ */
-
 #ifndef GC_MALLOC_LIMIT
 #if defined(MSDOS) || defined(__human68k__)
 #define GC_MALLOC_LIMIT 200000
@@ -70,11 +47,18 @@
 #endif
 #endif
 
+#ifndef GC_LEVEL_MAX  /*maximum # of VALUEs on 'C' stack during GC*/
+#define GC_LEVEL_MAX  8000
+#endif
+#ifndef GC_STACK_PAD
+#define GC_STACK_PAD  200  /* extra padding VALUEs for GC stack */
+#endif
+#define GC_STACK_MAX  (GC_LEVEL_MAX+GC_STACK_PAD)
 
-size_t rb_gc_malloc_increase = 0;
-#define malloc_increase rb_gc_malloc_increase
-static unsigned long malloc_limit = GC_MALLOC_LIMIT;
-size_t rb_gc_malloc_limit = GC_MALLOC_LIMIT-GC_MALLOC_LIMIT/8;
+static VALUE *stack_limit, *gc_stack_limit;
+
+static size_t malloc_increase = 0;
+static size_t malloc_limit = GC_MALLOC_LIMIT;
 
 /*
  *  call-seq:
@@ -108,7 +92,6 @@
   long limit = NUM2LONG(newLimit);
   if (limit < 0) return gc_getlimit(mod);
   malloc_limit = limit;
-  rb_gc_malloc_limit = malloc_limit - malloc_limit/8;
   return newLimit;
 }
 
@@ -126,6 +109,20 @@
 }
 
 
+/*
+ *  call-seq:
+ *     GC.exorcise
+ *
+ *  Purge ghost references from recently freed stack space
+ *
+ */
+static VALUE gc_exorcise(VALUE mod)
+{
+  rb_gc_wipe_stack();
+  return Qnil;
+}
+
+
 static void run_final();
 static VALUE nomem_error;
 static void garbage_collect();
@@ -174,7 +171,9 @@
 	    rb_memerror();
 	}
     }
+#if STACK_WIPE_SITES & 0x100
     rb_gc_update_stack_extent();
+#endif
     return mem;
 }
 
@@ -214,7 +213,9 @@
 	    rb_memerror();
         }
     }
+#if STACK_WIPE_SITES & 0x200
     rb_gc_update_stack_extent();
+#endif
     return mem;
 }
 
@@ -509,38 +510,32 @@
 # define STACK_LEVEL_MAX 655300
 #endif
 
-#ifdef C_ALLOCA
-# define SET_STACK_END VALUE stack_end; alloca(0);
+#ifndef nativeAllocA
+  /* portable way to return an approximate stack pointer */
+VALUE *__sp(void) {
+  VALUE tos;
+  return &tos;
+}
+# define SET_STACK_END VALUE stack_end
 # define STACK_END (&stack_end)
 #else
-# if defined(__GNUC__) && defined(USE_BUILTIN_FRAME_ADDRESS) && !defined(__ia64)
-#  if ( __GNUC__ == 3 && __GNUC_MINOR__ > 0 ) || __GNUC__ > 3
-__attribute__ ((noinline))
-#  endif
-static void
-stack_end_address(VALUE **stack_end_p)
-{
-    VALUE stack_end;
-    *stack_end_p = &stack_end;
-}
-#  define  SET_STACK_END    VALUE *stack_end; stack_end_address(&stack_end)
-# else
-#  define  SET_STACK_END    VALUE *stack_end = alloca(1)
-# endif
-# define STACK_END (stack_end)
+# define SET_STACK_END ((void)0)
+# define STACK_END __sp()
 #endif
+
 #if STACK_GROW_DIRECTION < 0
 # define STACK_LENGTH(start)  ((start) - STACK_END)
 #elif STACK_GROW_DIRECTION > 0
 # define STACK_LENGTH(start)  (STACK_END - (start) + 1)
 #else
-# define STACK_LENGTH(start)  ((STACK_END < (start)) ? (start) - STACK_END\
-                                           : STACK_END - (start) + 1)
+# define STACK_LENGTH(start)  ((STACK_END < (start)) ? \
+                                 (start) - STACK_END : STACK_END - (start) + 1)
 #endif
+
 #if STACK_GROW_DIRECTION > 0
-# define STACK_UPPER(x, a, b) a
+# define STACK_UPPER(a, b) a
 #elif STACK_GROW_DIRECTION < 0
-# define STACK_UPPER(x, a, b) b
+# define STACK_UPPER(a, b) b
 #else
 int rb_gc_stack_grow_direction;
 static int
@@ -550,33 +545,54 @@
     SET_STACK_END;
     return rb_gc_stack_grow_direction = STACK_END > addr ? 1 : -1;
 }
-# define STACK_UPPER(x, a, b) (rb_gc_stack_grow_direction > 0 ? a : b)
+# define STACK_UPPER(a, b) (rb_gc_stack_grow_direction > 0 ? a : b)
 #endif
 
-#define GC_WATER_MARK 512
-
-#define CHECK_STACK(ret) do {\
-    SET_STACK_END;\
-    (ret) = (STACK_LENGTH(rb_gc_stack_start) > STACK_LEVEL_MAX + GC_WATER_MARK);\
-} while (0)
-
 int
 ruby_stack_length(start, base)
     VALUE *start, **base;
 {
     SET_STACK_END;
-    if (base) *base = STACK_UPPER(STACK_END, start, STACK_END);
+    if (base) *base = STACK_UPPER(start, STACK_END);
     return STACK_LENGTH(start);
 }
 
 int
 ruby_stack_check()
 {
-    int ret;
+    SET_STACK_END;
+    return __stack_past(stack_limit, STACK_END);
+}
 
-    CHECK_STACK(ret);
-    return ret;
+/*
+  Zero memory that was (recently) part of the stack, but is no longer.
+  Invoke when stack is deep to mark its extent and when it's shallow to wipe it.
+*/
+#if STACK_WIPE_METHOD != 4
+#if STACK_WIPE_METHOD
+void rb_gc_wipe_stack(void)
+{
+  VALUE *stack_end = rb_gc_stack_end;
+  VALUE *sp = __sp();
+  rb_gc_stack_end = sp;
+#if STACK_WIPE_METHOD == 1
+#warning clearing of "ghost references" from the call stack has been disabled
+#elif STACK_WIPE_METHOD == 2  /* alloca ghost stack before clearing it */
+  if (__stack_past(sp, stack_end)) {
+    size_t bytes = __stack_depth((char *)stack_end, (char *)sp);
+    STACK_UPPER(sp = nativeAllocA(bytes), stack_end = nativeAllocA(bytes));
+    __stack_zero(stack_end, sp);
+  }
+#elif STACK_WIPE_METHOD == 3    /* clear unallocated area past stack pointer */
+  __stack_zero(stack_end, sp);  /* will crash if compiler pushes a temp. here */
+#else
+#error unsupported method of clearing ghost references from the stack
+#endif
 }
+#else
+#warning clearing of "ghost references" from the call stack completely disabled
+#endif
+#endif
 
 #define MARK_STACK_MAX 1024
 static VALUE mark_stack[MARK_STACK_MAX];
@@ -592,6 +608,17 @@
 
 #define MARK_STACK_EMPTY (mark_stack_ptr == mark_stack)
 
+static inline void
+push_mark_stack(VALUE ptr)
+{
+    if (!mark_stack_overflow) {
+	if (mark_stack_ptr - mark_stack < MARK_STACK_MAX)
+	    *mark_stack_ptr++ = ptr;
+	else
+	    mark_stack_overflow = 1;
+    }
+}
+    
 static st_table *source_filenames;
 
 char *
@@ -635,22 +662,22 @@
     }
 }
 
-static void gc_mark _((VALUE ptr, int lev));
-static void gc_mark_children _((VALUE ptr, int lev));
+#define gc_mark(ptr) rb_gc_mark(ptr)
+static void gc_mark_children _((VALUE ptr));
 
 static void
 gc_mark_all()
 {
     RVALUE *p, *pend;
-    int i;
+    struct heaps_slot *heap = heaps+heaps_used;
 
     init_mark_stack();
-    for (i = 0; i < heaps_used; i++) {
-	p = heaps[i].slot; pend = p + heaps[i].limit;
+    while (--heap >= heaps) {
+	p = heap->slot; pend = p + heap->limit;
 	while (p < pend) {
 	    if ((p->as.basic.flags & FL_MARK) &&
 		(p->as.basic.flags != FL_MARK)) {
-		gc_mark_children((VALUE)p, 0);
+		gc_mark_children((VALUE)p);
 	    }
 	    p++;
 	}
@@ -660,169 +687,129 @@
 static void
 gc_mark_rest()
 {
+    size_t stackLen = mark_stack_ptr - mark_stack;
+#ifdef nativeAllocA
+    VALUE *tmp_arry = nativeAllocA(stackLen*sizeof(VALUE));
+#else
     VALUE tmp_arry[MARK_STACK_MAX];
-    VALUE *p;
-
-    p = (mark_stack_ptr - mark_stack) + tmp_arry;
-    MEMCPY(tmp_arry, mark_stack, VALUE, MARK_STACK_MAX);
+#endif
+    VALUE *p = tmp_arry + stackLen;
+    
+    MEMCPY(tmp_arry, mark_stack, VALUE, stackLen);
 
     init_mark_stack();
-    while(p != tmp_arry){
-	p--;
-	gc_mark_children(*p, 0);
-    }
+    while(--p >= tmp_arry) gc_mark_children(*p);
 }
 
 static inline int
 is_pointer_to_heap(ptr)
     void *ptr;
 {
-    register RVALUE *p = RANY(ptr);
-    register RVALUE *heap_org;
-    register long i;
+    RVALUE *p = RANY(ptr);
+    struct heaps_slot *heap;
 
-    if (p < lomem || p > himem) return Qfalse;
-    if ((VALUE)p % sizeof(RVALUE) != 0) return Qfalse;
+    if (p < lomem || p > himem || (VALUE)p % sizeof(RVALUE)) return Qfalse;
 
     /* check if p looks like a pointer */
-    for (i=0; i < heaps_used; i++) {
-	heap_org = heaps[i].slot;
-	if (heap_org <= p && p < heap_org + heaps[i].limit)
-	    return Qtrue;
-    }
+    heap = heaps+heaps_used;
+    while (--heap >= heaps) 
+      if (p >= heap->slot && p < heap->slot + heap->limit)
+        return Qtrue;
     return Qfalse;
 }
 
 static void
 mark_locations_array(x, n)
-    register VALUE *x;
-    register long n;
+    VALUE *x;
+    size_t n;
 {
     VALUE v;
     while (n--) {
         v = *x;
 	if (is_pointer_to_heap((void *)v)) {
-	    gc_mark(v, 0);
+	    gc_mark(v);
 	}
 	x++;
     }
 }
 
-void
+void inline
 rb_gc_mark_locations(start, end)
     VALUE *start, *end;
 {
-    long n;
-
-    n = end - start;
-    mark_locations_array(start,n);
+    mark_locations_array(start,end - start);
 }
 
 static int
-mark_entry(key, value, lev)
+mark_entry(key, value)
     ID key;
     VALUE value;
-    int lev;
 {
-    gc_mark(value, lev);
+    gc_mark(value);
     return ST_CONTINUE;
 }
 
-static void
-mark_tbl(tbl, lev)
-    st_table *tbl;
-    int lev;
-{
-    if (!tbl) return;
-    st_foreach(tbl, mark_entry, lev);
-}
-
 void
 rb_mark_tbl(tbl)
     st_table *tbl;
 {
-    mark_tbl(tbl, 0);
+    if (!tbl) return;
+    st_foreach(tbl, mark_entry, 0);
 }
+#define mark_tbl(tbl)  rb_mark_tbl(tbl)
 
 static int
-mark_keyvalue(key, value, lev)
+mark_keyvalue(key, value)
     VALUE key;
     VALUE value;
-    int lev;
 {
-    gc_mark(key, lev);
-    gc_mark(value, lev);
+    gc_mark(key);
+    gc_mark(value);
     return ST_CONTINUE;
 }
 
-static void
-mark_hash(tbl, lev)
-    st_table *tbl;
-    int lev;
-{
-    if (!tbl) return;
-    st_foreach(tbl, mark_keyvalue, lev);
-}
-
 void
 rb_mark_hash(tbl)
     st_table *tbl;
 {
-    mark_hash(tbl, 0);
+    if (!tbl) return;
+    st_foreach(tbl, mark_keyvalue, 0);
 }
+#define mark_hash(tbl)  rb_mark_hash(tbl)
 
 void
 rb_gc_mark_maybe(obj)
     VALUE obj;
 {
     if (is_pointer_to_heap((void *)obj)) {
-	gc_mark(obj, 0);
+	gc_mark(obj);
     }
 }
 
-#define GC_LEVEL_MAX 250
-
-static void
-gc_mark(ptr, lev)
+void
+rb_gc_mark(ptr)
     VALUE ptr;
-    int lev;
 {
-    register RVALUE *obj;
-
-    obj = RANY(ptr);
+    RVALUE *obj = RANY(ptr);
+    SET_STACK_END;
+    
     if (rb_special_const_p(ptr)) return; /* special const not marked */
     if (obj->as.basic.flags == 0) return;       /* free cell */
     if (obj->as.basic.flags & FL_MARK) return;  /* already marked */
     obj->as.basic.flags |= FL_MARK;
 
-    if (lev > GC_LEVEL_MAX || (lev == 0 && ruby_stack_check())) {
-	if (!mark_stack_overflow) {
-	    if (mark_stack_ptr - mark_stack < MARK_STACK_MAX) {
-		*mark_stack_ptr = ptr;
-		mark_stack_ptr++;
-	    }
-	    else {
-		mark_stack_overflow = 1;
-	    }
-	}
-	return;
+    if (__stack_past(gc_stack_limit, STACK_END))
+      push_mark_stack(ptr);
+    else{
+      gc_mark_children(ptr);
     }
-    gc_mark_children(ptr, lev+1);
-}
-
-void
-rb_gc_mark(ptr)
-    VALUE ptr;
-{
-    gc_mark(ptr, 0);
 }
 
 static void
-gc_mark_children(ptr, lev)
+gc_mark_children(ptr)
     VALUE ptr;
-    int lev;
 {
-    register RVALUE *obj = RANY(ptr);
+    RVALUE *obj = RANY(ptr);
 
     goto marking;		/* skip */
 
@@ -856,7 +843,7 @@
 	  case NODE_RESCUE:
 	  case NODE_RESBODY:
 	  case NODE_CLASS:
-	    gc_mark((VALUE)obj->as.node.u2.node, lev);
+	    gc_mark((VALUE)obj->as.node.u2.node);
 	    /* fall through */
 	  case NODE_BLOCK:	/* 1,3 */
 	  case NODE_ARRAY:
@@ -869,7 +856,7 @@
 	  case NODE_CALL:
 	  case NODE_DEFS:
 	  case NODE_OP_ASGN1:
-	    gc_mark((VALUE)obj->as.node.u1.node, lev);
+	    gc_mark((VALUE)obj->as.node.u1.node);
 	    /* fall through */
 	  case NODE_SUPER:	/* 3 */
 	  case NODE_FCALL:
@@ -896,7 +883,7 @@
 	  case NODE_ALIAS:
 	  case NODE_VALIAS:
 	  case NODE_ARGS:
-	    gc_mark((VALUE)obj->as.node.u1.node, lev);
+	    gc_mark((VALUE)obj->as.node.u1.node);
 	    /* fall through */
 	  case NODE_METHOD:	/* 2 */
 	  case NODE_NOT:
@@ -934,7 +921,7 @@
 	  case NODE_SCOPE:	/* 2,3 */
 	  case NODE_BLOCK_PASS:
 	  case NODE_CDECL:
-	    gc_mark((VALUE)obj->as.node.u3.node, lev);
+	    gc_mark((VALUE)obj->as.node.u3.node);
 	    ptr = (VALUE)obj->as.node.u2.node;
 	    goto again;
 
@@ -967,25 +954,26 @@
 
 	  default:		/* unlisted NODE */
 	    if (is_pointer_to_heap(obj->as.node.u1.node)) {
-		gc_mark((VALUE)obj->as.node.u1.node, lev);
+		gc_mark((VALUE)obj->as.node.u1.node);
 	    }
 	    if (is_pointer_to_heap(obj->as.node.u2.node)) {
-		gc_mark((VALUE)obj->as.node.u2.node, lev);
+		gc_mark((VALUE)obj->as.node.u2.node);
 	    }
 	    if (is_pointer_to_heap(obj->as.node.u3.node)) {
-		gc_mark((VALUE)obj->as.node.u3.node, lev);
+                ptr = (VALUE)obj->as.node.u3.node;
+                goto again;
 	    }
 	}
-	return;			/* no need to mark class. */
+        return;	/* no need to mark class. */
     }
 
-    gc_mark(obj->as.basic.klass, lev);
+    gc_mark(obj->as.basic.klass);
     switch (obj->as.basic.flags & T_MASK) {
       case T_ICLASS:
       case T_CLASS:
       case T_MODULE:
-	mark_tbl(obj->as.klass.m_tbl, lev);
-	mark_tbl(obj->as.klass.iv_tbl, lev);
+	mark_tbl(obj->as.klass.m_tbl);
+	mark_tbl(obj->as.klass.iv_tbl);
 	ptr = obj->as.klass.super;
 	goto again;
 
@@ -995,17 +983,16 @@
 	    goto again;
 	}
 	else {
-	    long i, len = obj->as.array.len;
 	    VALUE *ptr = obj->as.array.ptr;
-
-	    for (i=0; i < len; i++) {
-		gc_mark(*ptr++, lev);
+            VALUE *pend = ptr + obj->as.array.len;
+	    while (ptr < pend) {
+		gc_mark(*ptr++);
 	    }
 	}
 	break;
 
       case T_HASH:
-	mark_hash(obj->as.hash.tbl, lev);
+	mark_hash(obj->as.hash.tbl);
 	ptr = obj->as.hash.ifnone;
 	goto again;
 
@@ -1022,7 +1009,7 @@
 	break;
 
       case T_OBJECT:
-	mark_tbl(obj->as.object.iv_tbl, lev);
+	mark_tbl(obj->as.object.iv_tbl);
 	break;
 
       case T_FILE:
@@ -1040,7 +1027,7 @@
 	break;
 
       case T_VARMAP:
-	gc_mark(obj->as.varmap.val, lev);
+	gc_mark(obj->as.varmap.val);
 	ptr = (VALUE)obj->as.varmap.next;
 	goto again;
 
@@ -1050,19 +1037,17 @@
 	    VALUE *vars = &obj->as.scope.local_vars[-1];
 
 	    while (n--) {
-		gc_mark(*vars++, lev);
+		gc_mark(*vars++);
 	    }
 	}
 	break;
 
       case T_STRUCT:
 	{
-	    long len = obj->as.rstruct.len;
 	    VALUE *ptr = obj->as.rstruct.ptr;
-
-	    while (len--) {
-		gc_mark(*ptr++, lev);
-	    }
+            VALUE *pend = ptr + obj->as.rstruct.len;
+            while (ptr < pend)
+	       gc_mark(*ptr++);
 	}
 	break;
 
@@ -1134,7 +1119,7 @@
 	    p = heaps[i].slot; pend = p + heaps[i].limit;
 	    while (p < pend) {
 		if (!(p->as.basic.flags&FL_MARK) && BUILTIN_TYPE(p) == T_NODE)
-		    gc_mark((VALUE)p, 0);
+		    gc_mark((VALUE)p);
 		p++;
 	    }
 	}
@@ -1346,7 +1331,7 @@
 rb_gc_mark_frame(frame)
     struct FRAME *frame;
 {
-    gc_mark((VALUE)frame->node, 0);
+    gc_mark((VALUE)frame->node);
 }
 
 #ifdef __GNUC__
@@ -1384,8 +1369,10 @@
 #endif /* __human68k__ or DJGPP */
 #endif /* __GNUC__ */
 
+
+
 static void
-garbage_collect()
+garbage_collect_0(VALUE *top_frame)
 {
     struct gc_list *list;
     struct FRAME * frame;
@@ -1406,9 +1393,10 @@
     if (during_gc) return;
     during_gc++;
 
+    gc_stack_limit = __stack_grow(STACK_END, GC_LEVEL_MAX);
     init_mark_stack();
 
-    gc_mark((VALUE)ruby_current_node, 0);
+    gc_mark((VALUE)ruby_current_node);
 
     /* mark frame stack */
     for (frame = ruby_frame; frame; frame = frame->prev) {
@@ -1421,10 +1409,10 @@
 	    }
 	}
     }
-    gc_mark((VALUE)ruby_scope, 0);
-    gc_mark((VALUE)ruby_dyna_vars, 0);
+    gc_mark((VALUE)ruby_scope);
+    gc_mark((VALUE)ruby_dyna_vars);
     if (finalizer_table) {
-	mark_tbl(finalizer_table, 0);
+	mark_tbl(finalizer_table);
     }
 
     FLUSH_REGISTER_WINDOWS;
@@ -1432,14 +1420,14 @@
     rb_setjmp(save_regs_gc_mark);
     mark_locations_array((VALUE*)save_regs_gc_mark, sizeof(save_regs_gc_mark) / sizeof(VALUE *));
 #if STACK_GROW_DIRECTION < 0
-    rb_gc_mark_locations((VALUE*)STACK_END, rb_gc_stack_start);
+    rb_gc_mark_locations(top_frame, rb_gc_stack_start);
 #elif STACK_GROW_DIRECTION > 0
-    rb_gc_mark_locations(rb_gc_stack_start, (VALUE*)STACK_END + 1);
+    rb_gc_mark_locations(rb_gc_stack_start, top_frame + 1);
 #else
     if (rb_gc_stack_grow_direction < 0)
-	rb_gc_mark_locations((VALUE*)STACK_END, rb_gc_stack_start);
+	rb_gc_mark_locations(top_frame, rb_gc_stack_start);
     else
-	rb_gc_mark_locations(rb_gc_stack_start, (VALUE*)STACK_END + 1);
+	rb_gc_mark_locations(rb_gc_stack_start, top_frame + 1);
 #endif
 #ifdef __ia64
     /* mark backing store (flushed register window on the stack) */
@@ -1479,10 +1467,35 @@
 	}
 	rb_gc_abort_threads();
     } while (!MARK_STACK_EMPTY);
-
     gc_sweep();
 }
 
+static void
+garbage_collect()
+{
+  VALUE *top = __sp();
+#if STACK_WIPE_SITES & 0x400
+# ifdef nativeAllocA
+  if (__stack_past (top, stack_limit)) {
+  /* allocate a large frame to ensure app stack cannot grow into GC stack */
+    volatile char *spacer = 
+                    nativeAllocA(__stack_depth((void*)stack_limit,(void*)top));
+  }  
+  garbage_collect_0(top);
+# else /* no native alloca() available */
+  garbage_collect_0(top);
+  {
+    VALUE *paddedLimit = __stack_grow(gc_stack_limit, GC_STACK_PAD);
+    if (__stack_past(rb_gc_stack_end, paddedLimit))
+      rb_gc_stack_end = paddedLimit;
+  }
+  rb_gc_wipe_stack();  /* wipe the whole stack area reserved for this gc */  
+# endif
+#else
+  garbage_collect_0(top);
+#endif
+}
+
 void
 rb_gc()
 {
@@ -1507,6 +1520,7 @@
     return Qnil;
 }
 
+
 void
 ruby_set_stack_size(size)
     size_t size;
@@ -1514,6 +1528,29 @@
 #ifndef STACK_LEVEL_MAX
     STACK_LEVEL_MAX = size / sizeof(VALUE);
 #endif
+    stack_limit = __stack_grow(rb_gc_stack_start, STACK_LEVEL_MAX-GC_STACK_MAX);
+}
+
+static void
+set_stack_size(void)
+{
+#ifdef HAVE_GETRLIMIT
+  struct rlimit rlim;
+  if (getrlimit(RLIMIT_STACK, &rlim) == 0) {
+    if (rlim.rlim_cur > 0 && rlim.rlim_cur != RLIM_INFINITY) {
+      size_t maxStackBytes = rlim.rlim_cur;
+      if (rlim.rlim_cur != maxStackBytes)
+        maxStackBytes = -1;
+      {
+        size_t space = maxStackBytes/5;
+        if (space > 1024*1024) space = 1024*1024;
+        ruby_set_stack_size(maxStackBytes - space);
+        return;
+      }
+    }
+  }
+#endif
+  ruby_set_stack_size(STACK_LEVEL_MAX*sizeof(VALUE));
 }
 
 void
@@ -1547,7 +1584,7 @@
     memset(&m, 0, sizeof(m));
     VirtualQuery(&m, &m, sizeof(m));
     rb_gc_stack_start =
-	STACK_UPPER((VALUE *)&m, (VALUE *)m.BaseAddress,
+	STACK_UPPER((VALUE *)m.BaseAddress,
 		    (VALUE *)((char *)m.BaseAddress + m.RegionSize) - 1);
 #elif defined(STACK_END_ADDRESS)
     {
@@ -1556,28 +1593,16 @@
     }
 #else
     if (!addr) addr = (void *)&addr;
-    STACK_UPPER(&addr, addr, ++addr);
+    STACK_UPPER(addr, ++addr);
     if (rb_gc_stack_start) {
-	if (STACK_UPPER(&addr,
-			rb_gc_stack_start > addr,
+	if (STACK_UPPER(rb_gc_stack_start > addr,
 			rb_gc_stack_start < addr))
 	    rb_gc_stack_start = addr;
 	return;
     }
     rb_gc_stack_start = addr;
 #endif
-#ifdef HAVE_GETRLIMIT
-    {
-	struct rlimit rlim;
-
-	if (getrlimit(RLIMIT_STACK, &rlim) == 0) {
-	    unsigned int space = rlim.rlim_cur/5;
-
-	    if (space > 1024*1024) space = 1024*1024;
-	    STACK_LEVEL_MAX = (rlim.rlim_cur - space) / sizeof(VALUE);
-	}
-    }
-#endif
+    set_stack_size();
 }
 
 void ruby_init_stack(VALUE *addr
@@ -1587,8 +1612,7 @@
     )
 {
     if (!rb_gc_stack_start ||
-        STACK_UPPER(&addr,
-                    rb_gc_stack_start > addr,
+        STACK_UPPER(rb_gc_stack_start > addr,
                     rb_gc_stack_start < addr)) {
         rb_gc_stack_start = addr;
     }
@@ -1599,16 +1623,7 @@
     }
 #endif
 #ifdef HAVE_GETRLIMIT
-    {
-        struct rlimit rlim;
-
-        if (getrlimit(RLIMIT_STACK, &rlim) == 0) {
-            unsigned int space = rlim.rlim_cur/5;
-
-            if (space > 1024*1024) space = 1024*1024;
-            STACK_LEVEL_MAX = (rlim.rlim_cur - space) / sizeof(VALUE);
-        }
-    }
+    set_stack_size();
 #elif defined _WIN32
     {
 	MEMORY_BASIC_INFORMATION mi;
@@ -1619,7 +1634,7 @@
 	    size = (char *)mi.BaseAddress - (char *)mi.AllocationBase;
 	    space = size / 5;
 	    if (space > 1024*1024) space = 1024*1024;
-	    STACK_LEVEL_MAX = (size - space) / sizeof(VALUE);
+	    ruby_set_stack_size(size - space);
 	}
     }
 #endif
@@ -2111,6 +2126,7 @@
     rb_define_singleton_method(rb_mGC, "limit", gc_getlimit, 0);
     rb_define_singleton_method(rb_mGC, "limit=", gc_setlimit, 1);
     rb_define_singleton_method(rb_mGC, "increase", gc_increase, 0);
+    rb_define_singleton_method(rb_mGC, "exorcise", gc_exorcise, 0);
     rb_define_method(rb_mGC, "garbage_collect", rb_gc_start, 0);
 
     rb_mObSpace = rb_define_module("ObjectSpace");
diff -ru ruby-1.8.7-p72/intern.h ruby-1.8.7-mbari/intern.h
--- ruby-1.8.7-p72/intern.h	2009-02-09 21:21:30.000000000 -0800
+++ ruby-1.8.7-mbari/intern.h	2008-12-23 21:54:37.000000000 -0800
@@ -2,8 +2,8 @@
 
   intern.h -
 
-  $Author: shyouhei $
-  $Date: 2008-07-07 12:29:28 +0900 (Mon, 07 Jul 2008) $
+  $Author: brent $
+  $Date: 2008/12/24 05:54:37 $
   created at: Thu Jun 10 14:22:17 JST 1993
 
   Copyright (C) 1993-2003 Yukihiro Matsumoto
diff -ru ruby-1.8.7-p72/missing/alloca.c ruby-1.8.7-mbari/missing/alloca.c
--- ruby-1.8.7-p72/missing/alloca.c	2007-02-12 15:01:19.000000000 -0800
+++ ruby-1.8.7-mbari/missing/alloca.c	2009-01-23 00:01:03.000000000 -0800
@@ -29,6 +29,7 @@
 static char	SCCSid[] = "@(#)alloca.c	1.1";	/* for the "what" utility */
 #endif
 
+#include <sys/types.h>
 #include "config.h"
 #ifdef emacs
 #ifdef static
@@ -44,11 +45,7 @@
 #endif /* static */
 #endif /* emacs */
 
-#ifdef X3J11
 typedef void	*pointer;		/* generic pointer type */
-#else
-typedef char	*pointer;		/* generic pointer type */
-#endif /* X3J11 */
 
 #define	NULL	0			/* null pointer constant */
 
@@ -140,8 +137,7 @@
 static header *last_alloca_header = NULL; /* -> last alloca header */
 
 pointer
-alloca (size)			/* returns pointer to storage */
-     unsigned	size;		/* # bytes to allocate */
+alloca (size_t size)		/* returns pointer to storage */
 {
   auto char	probe;		/* probes stack depth: */
   register char	*depth = &probe;
diff -ru ruby-1.8.7-p72/rubysig.h ruby-1.8.7-mbari/rubysig.h
--- ruby-1.8.7-p72/rubysig.h	2009-02-09 21:21:30.000000000 -0800
+++ ruby-1.8.7-mbari/rubysig.h	2009-02-09 20:55:50.000000000 -0800
@@ -3,7 +3,7 @@
   rubysig.h -
 
   $Author: brent $
-  $Date: 2008/12/14 07:24:10 $
+  $Date: 2009/02/09 20:45:48 $
   created at: Wed Aug 16 01:15:38 JST 1995
 
   Copyright (C) 1993-2003 Yukihiro Matsumoto
@@ -12,8 +12,75 @@
 
 #ifndef SIG_H
 #define SIG_H
+
 #include <errno.h>
 
+/* STACK_WIPE_SITES determines where attempts are made to exorcise
+   "ghost object refereces" from the stack and how the stack is cleared:
+   
+   0x*001 -->  wipe stack just after every thread_switch
+   0x*002 -->  wipe stack just after every EXEC_TAG()
+   0x*004 -->  wipe stack in CHECK_INTS
+   0x*010 -->  wipe stack in while & until loops
+   0x*020 -->  wipe stack before yield() in iterators and outside eval.c
+   0x*040 -->  wipe stack on catch and thread save context
+   0x*100 -->  update stack extent on each object allocation
+   0x*200 -->  update stack extent on each object reallocation
+   0x*400 -->  update stack extent during GC marking passes
+   0x*800 -->  update stack extent on each throw (use with 0x040)
+   0x1000 -->  use inline assembly code for x86, PowerPC, or ARM CPUs
+
+   0x0*** -->  do not even call rb_wipe_stack()
+   0x2*** -->  call dummy rb_wipe_stack() (for debugging and profiling)
+   0x4*** -->  safe, portable stack clearing in memory allocated with alloca
+   0x6*** -->  use faster, but less safe stack clearing in unallocated stack
+   0x8*** -->  use faster, but less safe stack clearing (with inline code)
+   
+   for most effective gc use 0x*707
+   for fastest micro-benchmarking use 0x0000
+   0x*770 prevents almost all memory leaks caused by ghost references
+   without adding much overhead for stack clearing.
+   Other good trade offs are 0x*270, 0x*703, 0x*303 or even 0x*03
+   
+   In general, you may lessen the default -mpreferred-stack-boundary
+   only if using less safe stack clearing (0x6***).  Lessening the
+   stack alignment with portable stack clearing (0x4***) may fail to clear 
+   all ghost references off the stack.
+   
+   When using 0x6*** or 0x8***, the compiler could insert 
+   stack push(s) between reading the stack pointer and clearing 
+   the ghost references.  The register(s) pushed will be
+   cleared by the rb_gc_stack_wipe(), typically resulting in a segfault
+   or an interpreter hang.
+   
+   STACK_WIPE_SITES of 0x8770 works well compiled with gcc on most machines
+   using the recommended CFLAGS="-O2 -fno-stack-protector".  However...
+   If it hangs or crashes for you, try changing STACK_WIPE_SITES to 0x4770
+   and please report your details.  i.e. CFLAGS, compiler, version, CPU
+   
+   Note that it is redundant to wipe_stack in looping constructs if 
+   also doing so in CHECK_INTS.  It is also redundant to wipe_stack on
+   each thread_switch if wiping after every thread save context.
+*/
+#ifndef STACK_WIPE_SITES
+# ifdef __x86_64__     /* deal with "red zone" by not inlining stack clearing */
+#  define STACK_WIPE_SITES  0x6770
+# elif defined __ppc__ || defined __ppc64__   /* On any PowerPC, deal with... */
+#  define STACK_WIPE_SITES  0x7764   /* red zone & alloc(0) doesn't return sp */
+# else
+#  define STACK_WIPE_SITES  0x8770 /*normal case, use 0x4770 if problems arise*/
+# endif
+#endif
+
+#if (STACK_WIPE_SITES & 0x14) == 0x14
+#warning  wiping stack in CHECK_INTS makes wiping in loops redundant
+#endif
+#if (STACK_WIPE_SITES & 0x41) == 0x41
+#warning  wiping stack after thread save makes wiping on thread_switch redundant
+#endif
+
+#define STACK_WIPE_METHOD (STACK_WIPE_SITES>>13)
+
 #ifdef _WIN32
 typedef LONG rb_atomic_t;
 
@@ -79,52 +146,151 @@
 
 RUBY_EXTERN int rb_thread_critical;
 void rb_thread_schedule _((void));
-#if defined(HAVE_SETITIMER) || defined(_THREAD_SAFE)
-RUBY_EXTERN int rb_thread_pending;
 
-EXTERN size_t rb_gc_malloc_increase;
-EXTERN size_t rb_gc_malloc_limit;
-EXTERN VALUE *rb_gc_stack_end;
-EXTERN int *rb_gc_stack_grow_direction;  /* -1 for down or 1 for up */
-#define __stack_zero_up(end,sp)  while (end >= ++sp) *sp=0
-#define __stack_grown_up  (rb_gc_stack_end > (VALUE *)alloca(0))
-#define __stack_zero_down(end,sp)  while (end <= --sp) *sp=0
-#define __stack_grown_down  (rb_gc_stack_end < (VALUE *)alloca(0))
+RUBY_EXTERN VALUE *rb_gc_stack_end;
+RUBY_EXTERN int rb_gc_stack_grow_direction;  /* -1 for down or 1 for up */
 
 #if STACK_GROW_DIRECTION > 0
+
+/* clear stack space between end and sp (not including *sp) */
 #define __stack_zero(end,sp)  __stack_zero_up(end,sp)
-#define __stack_grown  __stack_grown_up
+
+/* true if top has grown past limit, i.e. top deeper than limit */
+#define __stack_past(limit,top)  __stack_past_up(limit,top)
+
+/* depth of mid below stack top */
+#define __stack_depth(top,mid)   __stack_depth_up(top,mid)
+
+/* stack pointer top adjusted to include depth more items */
+#define __stack_grow(top,depth)  __stack_grow_up(top,depth)
+
+
 #elif STACK_GROW_DIRECTION < 0
 #define __stack_zero(end,sp)  __stack_zero_down(end,sp)
-#define __stack_grown  __stack_grown_down
+#define __stack_past(limit,top)  __stack_past_down(limit,top)
+#define __stack_depth(top,mid)   __stack_depth_down(top,mid)
+#define __stack_grow(top,depth)  __stack_grow_down(top,depth)
+
 #else  /* limp along if stack direction can't be determined at compile time */
 #define __stack_zero(end,sp) if (rb_gc_stack_grow_direction<0) \
         __stack_zero_down(end,sp); else __stack_zero_up(end,sp);
-#define __stack_grown  \
-        (rb_gc_stack_grow_direction<0 ? __stack_grown_down : __stack_grown_up)
+#define __stack_past(limit,top)  (rb_gc_stack_grow_direction<0 ? \
+                      __stack_past_down(limit,top) : __stack_past_up(limit,top))
+#define __stack_depth(top,mid) (rb_gc_stack_grow_direction<0 ? \
+                       __stack_depth_down(top,mid) : __stack_depth_up(top,mid))
+#define __stack_grow(top,depth) (rb_gc_stack_grow_direction<0 ? \
+                      __stack_grow_down(top,depth) : __stack_grow_up(top,depth))
 #endif
  
+#define __stack_zero_up(end,sp)  while (end >= ++sp) *sp=0
+#define __stack_past_up(limit,top)  ((limit) < (top))
+#define __stack_depth_up(top,mid) ((top) - (mid))
+#define __stack_grow_up(top,depth) ((top)+(depth))
+
+#define __stack_zero_down(end,sp)  while (end <= --sp) *sp=0
+#define __stack_past_down(limit,top)  ((limit) > (top))
+#define __stack_depth_down(top,mid) ((mid) - (top))
+#define __stack_grow_down(top,depth) ((top)-(depth))
+
+/* Make alloca work the best possible way.  */
+#ifdef __GNUC__
+# ifndef atarist
+#  ifndef alloca
+#   define alloca __builtin_alloca
+#  endif
+# endif /* atarist */
+
+# define nativeAllocA __builtin_alloca
+
+/* use assembly to get stack pointer quickly */
+# if STACK_WIPE_SITES & 0x1000
+#  define __defspfn(asmb)  \
+static inline VALUE *__sp(void) __attribute__((always_inline)); \
+static inline VALUE *__sp(void) \
+{ \
+  VALUE *sp; asm(asmb); \
+  return sp; \
+}
+#  if defined __ppc__ || defined __ppc64__
+__defspfn("addi %0, r1, 0": "=r"(sp))
+#  elif defined  __i386__
+__defspfn("movl %%esp, %0": "=r"(sp))
+#  elif defined __x86_64__
+__defspfn("movq %%rsp, %0": "=r"(sp))
+#  elif __arm__
+__defspfn("mov %0, sp": "=r"(sp))
+#  else
+#   define __sp()  ((VALUE *)__builtin_alloca(0))
+#   warning No assembly version of __sp() defined for this CPU.
+#  endif
+# else
+#  define __sp()  ((VALUE *)__builtin_alloca(0))
+# endif
+
+#else  // not GNUC
+
+# ifdef HAVE_ALLOCA_H
+#  include <alloca.h>
+# else
+#  ifndef _AIX
+#   ifndef alloca /* predefined by HP cc +Olibcalls */
+void *alloca ();
+#   endif
+#  endif /* AIX */
+# endif /* HAVE_ALLOCA_H */
+
+# if STACK_WIPE_SITES & 0x1000
+#  warning No assembly versions of __sp() defined for this compiler.
+# endif
+# if HAVE_ALLOCA
+#  define __sp()  ((VALUE *)alloca(0))
+#  define nativeAllocA alloca
+# else
+RUBY_EXTERN VALUE *__sp(void);
+#  if STACK_WIPE_SITES
+#   define STACK_WIPE_SITES 0
+#   warning Disabled Stack Wiping because there is no native alloca()
+#  endif
+# endif
+#endif /* __GNUC__ */
+
+
 /*
-  zero the memory that was (recently) part of the stack
-  but is no longer.  Invoke when stack is deep to mark its extent
-  and when it is shallow to wipe it
+  Zero memory that was (recently) part of the stack, but is no longer.
+  Invoke when stack is deep to mark its extent and when it's shallow to wipe it.
 */
+#if STACK_WIPE_METHOD == 0
+#define rb_gc_wipe_stack() ((void)0)
+#elif STACK_WIPE_METHOD == 4
 #define rb_gc_wipe_stack() {     \
-  VALUE *sp = alloca(0);         \
   VALUE *end = rb_gc_stack_end;  \
+  VALUE *sp = __sp();            \
   rb_gc_stack_end = sp;          \
   __stack_zero(end, sp);   \
 }
+#else
+RUBY_EXTERN void rb_gc_wipe_stack(void);
+#endif
 
 /*
   Update our record of maximum stack extent without zeroing unused stack
 */
-#define rb_gc_update_stack_extent() \
-    if __stack_grown rb_gc_stack_end = alloca(0);
+#define rb_gc_update_stack_extent() do { \
+    VALUE *sp = __sp(); \
+    if __stack_past(rb_gc_stack_end, sp) rb_gc_stack_end = sp; \
+} while(0)
+
 
+#if STACK_WIPE_SITES & 4
+# define CHECK_INTS_wipe_stack()  rb_gc_wipe_stack()
+#else
+# define CHECK_INTS_wipe_stack()  (void)0
+#endif
 
+#if defined(HAVE_SETITIMER) || defined(_THREAD_SAFE)
+RUBY_EXTERN int rb_thread_pending;
 # define CHECK_INTS do {\
-    rb_gc_wipe_stack(); \
+    CHECK_INTS_wipe_stack(); \
     if (!(rb_prohibit_interrupt || rb_thread_critical)) {\
         if (rb_thread_pending) rb_thread_schedule();\
 	if (rb_trap_pending) rb_trap_exec();\
@@ -135,14 +301,14 @@
 RUBY_EXTERN int rb_thread_tick;
 #define THREAD_TICK 500
 #define CHECK_INTS do {\
-    rb_gc_wipe_stack(); \
+    CHECK_INTS_wipe_stack(); \
     if (!(rb_prohibit_interrupt || rb_thread_critical)) {\
 	if (rb_thread_tick-- <= 0) {\
 	    rb_thread_tick = THREAD_TICK;\
             rb_thread_schedule();\
 	}\
+        if (rb_trap_pending) rb_trap_exec();\
     }\
-    if (rb_trap_pending) rb_trap_exec();\
 } while (0)
 #endif
 
diff -ru ruby-1.8.7-p72/version.h ruby-1.8.7-mbari/version.h
--- ruby-1.8.7-p72/version.h	2009-02-09 21:21:30.000000000 -0800
+++ ruby-1.8.7-mbari/version.h	2009-02-09 20:24:44.000000000 -0800
@@ -1,15 +1,15 @@
 #define RUBY_VERSION "1.8.7"
-#define RUBY_RELEASE_DATE "2008-12-21"
+#define RUBY_RELEASE_DATE "2009-2-9"
 #define RUBY_VERSION_CODE 187
-#define RUBY_RELEASE_CODE 20081221
+#define RUBY_RELEASE_CODE 20090209
 #define RUBY_PATCHLEVEL 72
 
 #define RUBY_VERSION_MAJOR 1
 #define RUBY_VERSION_MINOR 8
 #define RUBY_VERSION_TEENY 7
-#define RUBY_RELEASE_YEAR 2008
-#define RUBY_RELEASE_MONTH 12
-#define RUBY_RELEASE_DAY 21
+#define RUBY_RELEASE_YEAR 2009
+#define RUBY_RELEASE_MONTH 2
+#define RUBY_RELEASE_DAY 9
 
 #ifdef RUBY_EXTERN
 RUBY_EXTERN const char ruby_version[];
@@ -25,7 +25,12 @@
 #define RUBY_BIRTH_MONTH 2
 #define RUBY_BIRTH_DAY 24
 
-#define RUBY_RELEASE_STR "MBARI 6 on patchlevel"
+#include "rubysig.h"
+
+#define string_arg(s) #s
+#define MBARI_RELEASE(wipe_sites) "MBARI 7/" string_arg(wipe_sites)
+
+#define RUBY_RELEASE_STR MBARI_RELEASE(STACK_WIPE_SITES) " on patchlevel"
 #define RUBY_RELEASE_NUM RUBY_PATCHLEVEL
 
 
src/rvm/patches/ruby/1.8.7/p72/mbari-3.patch000066400000032660147511530530014122 0ustar00diff -rux '*.o' ruby-1.8.7-p72/ChangeLog ruby-1.8.7-mbari/ChangeLog
--- ruby-1.8.7-p72/ChangeLog	2008-12-13 23:32:29.000000000 -0800
+++ ruby-1.8.7-mbari/ChangeLog	2008-12-13 23:17:30.000000000 -0800
@@ -1,3 +1,18 @@
+Tue Dec 13  6:10:36 2008  Brent Roman  <brent@mbari.org>
+
+        * eval.c:  update stack extent just before and after every setjmp
+
+        * gc.c:  replaced rb_gc_stress with gc_getlimit and setlimit
+                 update stack extent after every xmalloc and xrealloc
+                 export rb_gc_stack_grow_direction if not known at compile time
+                 removed dynamic adjustment of malloc_limit
+                 removed workaround for obsolete gcc 2.7.2.3 bug                 
+
+        * signal.h: don't try to clear stress after segsegv.  It's a too late.
+        
+        * rubysig.h:  CHECK_INTS clears ghost references off stack
+
+
 Tue Dec 12  6:11:36 2008  Brent Roman  <brent@mbari.org>
 
         * eval.c:  exclude other thread's stack frames from current one
diff -rux '*.o' ruby-1.8.7-p72/eval.c ruby-1.8.7-mbari/eval.c
--- ruby-1.8.7-p72/eval.c	2008-12-13 23:32:29.000000000 -0800
+++ ruby-1.8.7-mbari/eval.c	2008-12-13 23:23:06.000000000 -0800
@@ -3,7 +3,7 @@
   eval.c -
 
   $Author: brent $
-  $Date: 2008/12/13 06:34:34 $
+  $Date: 2008/12/14 07:23:06 $
   created at: Thu Jun 10 14:22:17 JST 1993
 
   Copyright (C) 1993-2003 Yukihiro Matsumoto
@@ -1027,7 +1027,14 @@
 #define PROT_LAMBDA INT2FIX(2)	/* 5 */
 #define PROT_YIELD  INT2FIX(3)	/* 7 */
 
 #define EXEC_TAG()    ruby_setjmp(((void)0), prot_tag->buf)
+
+static inline 
+int up_stk_extent(int status)
+{
+  rb_gc_update_stack_extent();
+  return status;
+}
 
 #define JUMP_TAG(st) do {		\
     ruby_frame = prot_tag->frame;	\
@@ -10419,7 +10426,7 @@
     stkBase = (void *)th->stk_start;
     stkSize = th->stk_len * sizeof(VALUE);
 #if STACK_GROW_DIRECTION == 0
-    if ((VALUE *)&th < rb_gc_stack_start)
+    if (rb_gc_stack_grow_direction < 0)
 #endif
 #if STACK_GROW_DIRECTION <= 0
       stkBase -= stkSize;
@@ -10697,8 +10704,8 @@
     return 1;
 }
 
-#define THREAD_SAVE_CONTEXT(th) \
-    (rb_thread_switch(ruby_setjmp(rb_thread_save_context(th), (th)->context)))
+#define THREAD_SAVE_CONTEXT(th) (rb_thread_switch(up_stk_extent( \
+                  ruby_setjmp(rb_thread_save_context(th), (th)->context))))
 
 NORETURN(static void rb_thread_restore_context _((rb_thread_t,int)));
 NORETURN(NOINLINE(static void rb_thread_restore_context_0(rb_thread_t,int,void*)));
diff -rux '*.o' ruby-1.8.7-p72/gc.c ruby-1.8.7-mbari/gc.c
--- ruby-1.8.7-p72/gc.c	2008-12-13 23:32:29.000000000 -0800
+++ ruby-1.8.7-mbari/gc.c	2008-12-13 23:23:34.000000000 -0800
@@ -3,7 +3,7 @@
   gc.c -
 
   $Author: brent $
-  $Date: 2008/12/13 05:47:46 $
+  $Date: 2008/12/14 07:23:34 $
   created at: Tue Oct  5 09:44:46 JST 1993
 
   Copyright (C) 1993-2003 Yukihiro Matsumoto
@@ -70,13 +70,66 @@
 #endif
 #endif
 
-static unsigned long malloc_increase = 0;
+
+size_t rb_gc_malloc_increase = 0;
+#define malloc_increase rb_gc_malloc_increase
 static unsigned long malloc_limit = GC_MALLOC_LIMIT;
+size_t rb_gc_malloc_limit = GC_MALLOC_LIMIT-GC_MALLOC_LIMIT/8;
+
+/*
+ *  call-seq:
+ *     GC.limit    => increase limit in bytes
+ *
+ *  Get the # of bytes that may be allocated before triggering
+ *  a mark and sweep by the garbarge collector to reclaim unused storage.
+ *
+ */
+static VALUE gc_getlimit(VALUE mod)
+{
+  return ULONG2NUM(malloc_limit);
+}
+
+/*
+ *  call-seq:
+ *     GC.limit=   => updated increase limit in bytes
+ *
+ *  Set the # of bytes that may be allocated before triggering
+ *  a mark and sweep by the garbarge collector to reclaim unused storage.
+ *  Attempts to set the GC.limit= less than 0 will be ignored.
+ *
+ *     GC.limit=5000000   #=> 5000000
+ *     GC.limit           #=> 5000000
+ *     GC.limit=-50       #=> 5000000
+ *     GC.limit=0         #=> 0
+ *
+ */
+static VALUE gc_setlimit(VALUE mod, VALUE newLimit)
+{
+  long limit = NUM2LONG(newLimit);
+  if (limit < 0) return gc_getlimit(mod);
+  malloc_limit = limit;
+  rb_gc_malloc_limit = malloc_limit - malloc_limit/8;
+  return newLimit;
+}
+
+
+/*
+ *  call-seq:
+ *     GC.increase
+ *
+ *  Get # of bytes that have been allocated since the last mark & sweep
+ *
+ */
+static VALUE gc_increase(VALUE mod)
+{
+  return ULONG2NUM(malloc_increase);
+}
+
+
 static void run_final();
 static VALUE nomem_error;
 static void garbage_collect();
 
-int ruby_gc_stress = 0;
 
 NORETURN(void rb_exc_jump _((VALUE)));
 
@@ -97,40 +150,6 @@
     rb_exc_raise(nomem_error);
 }
 
-/*
- *  call-seq:
- *    GC.stress                 => true or false
- *
- *  returns current status of GC stress mode.
- */
-
-static VALUE
-gc_stress_get(self)
-    VALUE self;
-{
-    return ruby_gc_stress ? Qtrue : Qfalse;
-}
-
-/*
- *  call-seq:
- *    GC.stress = bool          => bool
- *
- *  updates GC stress mode.
- *
- *  When GC.stress = true, GC is invoked for all GC opportunity:
- *  all memory and object allocation.
- *
- *  Since it makes Ruby very slow, it is only for debugging.
- */
-
-static VALUE
-gc_stress_set(self, bool)
-    VALUE self, bool;
-{
-    rb_secure(2);
-    ruby_gc_stress = RTEST(bool);
-    return bool;
-}
 
 void *
 ruby_xmalloc(size)
@@ -143,8 +162,9 @@
     }
     if (size == 0) size = 1;
 
-    if (ruby_gc_stress || (malloc_increase+size) > malloc_limit) {
+    if ((malloc_increase+=size) > malloc_limit) {
 	garbage_collect();
+        malloc_increase = size;
     }
     RUBY_CRITICAL(mem = malloc(size));
     if (!mem) {
@@ -154,8 +174,7 @@
 	    rb_memerror();
 	}
     }
-    malloc_increase += size;
-
+    rb_gc_update_stack_extent();
     return mem;
 }
 
@@ -183,7 +202,10 @@
     }
     if (!ptr) return xmalloc(size);
     if (size == 0) size = 1;
-    if (ruby_gc_stress) garbage_collect();
+    if ((malloc_increase+=size) > malloc_limit) {
+	garbage_collect();
+        malloc_increase = size;
+    }
     RUBY_CRITICAL(mem = realloc(ptr, size));
     if (!mem) {
 	garbage_collect();
@@ -192,8 +214,7 @@
 	    rb_memerror();
         }
     }
-    malloc_increase += size;
-
+    rb_gc_update_stack_extent();
     return mem;
 }
 
@@ -433,7 +454,7 @@
     if (during_gc)
 	rb_bug("object allocation during garbage collection phase");
 
-    if (ruby_gc_stress || !freelist) garbage_collect();
+    if (!malloc_limit || !freelist) garbage_collect();
 
     obj = (VALUE)freelist;
     freelist = freelist->as.free.next;
@@ -468,6 +489,9 @@
 VALUE *rb_gc_register_stack_start = 0;
 #endif
 
+VALUE *rb_gc_stack_end = (VALUE *)STACK_GROW_DIRECTION;
+
+
 #ifdef DJGPP
 /* set stack size (http://www.delorie.com/djgpp/v2faq/faq15_9.html) */
 unsigned int _stklen = 0x180000; /* 1.5 kB */
@@ -518,18 +542,15 @@
 #elif STACK_GROW_DIRECTION < 0
 # define STACK_UPPER(x, a, b) b
 #else
-static int grow_direction;
+int rb_gc_stack_grow_direction;
 static int
 stack_grow_direction(addr)
     VALUE *addr;
 {
     SET_STACK_END;
-
-    if (STACK_END > addr) return grow_direction = 1;
-    return grow_direction = -1;
+    return rb_gc_stack_grow_direction = STACK_END > addr ? 1 : -1;
 }
-# define stack_growup_p(x) ((grow_direction ? grow_direction : stack_grow_direction(x)) > 0)
-# define STACK_UPPER(x, a, b) (stack_growup_p(x) ? a : b)
+# define STACK_UPPER(x, a, b) (rb_gc_stack_grow_direction > 0 ? a : b)
 #endif
 
 #define GC_WATER_MARK 512
@@ -1097,13 +1118,12 @@
     RVALUE *p, *pend, *final_list;
     int freed = 0;
     int i;
-    unsigned long live = 0;
     unsigned long free_min = 0;
 
     for (i = 0; i < heaps_used; i++) {
         free_min += heaps[i].limit;
     }
-    free_min = free_min * 0.2;
+    free_min /= 5;
     if (free_min < FREE_MIN)
         free_min = FREE_MIN;
 
@@ -1157,7 +1177,6 @@
 	    }
 	    else {
 		RBASIC(p)->flags &= ~FL_MARK;
-		live++;
 	    }
 	    p++;
 	}
@@ -1174,10 +1193,6 @@
 	    freed += n;
 	}
     }
-    if (malloc_increase > malloc_limit) {
-	malloc_limit += (malloc_increase - malloc_limit) * (double)live / (live + freed);
-	if (malloc_limit < GC_MALLOC_LIMIT) malloc_limit = GC_MALLOC_LIMIT;
-    }
     malloc_increase = 0;
     if (freed < free_min) {
 	add_heap();
@@ -1373,7 +1388,7 @@
 garbage_collect()
 {
     struct gc_list *list;
-    struct FRAME * volatile frame; /* gcc 2.7.2.3 -O2 bug??  */
+    struct FRAME * frame;
     jmp_buf save_regs_gc_mark;
     SET_STACK_END;
 
@@ -1421,7 +1436,7 @@
 #elif STACK_GROW_DIRECTION > 0
     rb_gc_mark_locations(rb_gc_stack_start, (VALUE*)STACK_END + 1);
 #else
-    if ((VALUE*)STACK_END < rb_gc_stack_start)
+    if (rb_gc_stack_grow_direction < 0)
 	rb_gc_mark_locations((VALUE*)STACK_END, rb_gc_stack_start);
     else
 	rb_gc_mark_locations(rb_gc_stack_start, (VALUE*)STACK_END + 1);
@@ -2086,12 +2101,16 @@
 {
     VALUE rb_mObSpace;
 
+#if !STACK_GROW_DIRECTION
+    rb_gc_stack_end = stack_grow_direction(&rb_mObSpace);
+#endif
     rb_mGC = rb_define_module("GC");
     rb_define_singleton_method(rb_mGC, "start", rb_gc_start, 0);
     rb_define_singleton_method(rb_mGC, "enable", rb_gc_enable, 0);
     rb_define_singleton_method(rb_mGC, "disable", rb_gc_disable, 0);
-    rb_define_singleton_method(rb_mGC, "stress", gc_stress_get, 0);
-    rb_define_singleton_method(rb_mGC, "stress=", gc_stress_set, 1);
+    rb_define_singleton_method(rb_mGC, "limit", gc_getlimit, 0);
+    rb_define_singleton_method(rb_mGC, "limit=", gc_setlimit, 1);
+    rb_define_singleton_method(rb_mGC, "increase", gc_increase, 0);
     rb_define_method(rb_mGC, "garbage_collect", rb_gc_start, 0);
 
     rb_mObSpace = rb_define_module("ObjectSpace");
diff -rux '*.o' ruby-1.8.7-p72/rubysig.h ruby-1.8.7-mbari/rubysig.h
--- ruby-1.8.7-p72/rubysig.h	2007-02-12 15:01:19.000000000 -0800
+++ ruby-1.8.7-mbari/rubysig.h	2008-12-13 23:24:10.000000000 -0800
@@ -2,8 +2,8 @@
 
   rubysig.h -
 
-  $Author: shyouhei $
-  $Date: 2007-02-13 08:01:19 +0900 (Tue, 13 Feb 2007) $
+  $Author: brent $
+  $Date: 2008/12/14 07:24:10 $
   created at: Wed Aug 16 01:15:38 JST 1995
 
   Copyright (C) 1993-2003 Yukihiro Matsumoto
@@ -81,7 +81,50 @@
 void rb_thread_schedule _((void));
 #if defined(HAVE_SETITIMER) || defined(_THREAD_SAFE)
 RUBY_EXTERN int rb_thread_pending;
+
+EXTERN size_t rb_gc_malloc_increase;
+EXTERN size_t rb_gc_malloc_limit;
+EXTERN VALUE *rb_gc_stack_end;
+EXTERN int *rb_gc_stack_grow_direction;  /* -1 for down or 1 for up */
+#define __stack_zero_up(end,sp)  while (end >= ++sp) *sp=0
+#define __stack_grown_up  (rb_gc_stack_end > (VALUE *)alloca(0))
+#define __stack_zero_down(end,sp)  while (end <= --sp) *sp=0
+#define __stack_grown_down  (rb_gc_stack_end < (VALUE *)alloca(0))
+
+#if STACK_GROW_DIRECTION > 0
+#define __stack_zero(end,sp)  __stack_zero_up(end,sp)
+#define __stack_grown  __stack_grown_up
+#elif STACK_GROW_DIRECTION < 0
+#define __stack_zero(end,sp)  __stack_zero_down(end,sp)
+#define __stack_grown  __stack_grown_down
+#else  /* limp along if stack direction can't be determined at compile time */
+#define __stack_zero(end,sp) if (rb_gc_stack_grow_direction<0) \
+        __stack_zero_down(end,sp); else __stack_zero_up(end,sp);
+#define __stack_grown  \
+        (rb_gc_stack_grow_direction<0 ? __stack_grown_down : __stack_grown_up)
+#endif
+ 
+/*
+  zero the memory that was (recently) part of the stack
+  but is no longer.  Invoke when stack is deep to mark its extent
+  and when it is shallow to wipe it
+*/
+#define rb_gc_wipe_stack() {     \
+  VALUE *sp = alloca(0);         \
+  VALUE *end = rb_gc_stack_end;  \
+  rb_gc_stack_end = sp;          \
+  __stack_zero(end, sp);   \
+}
+
+/*
+  Update our record of maximum stack extent without zeroing unused stack
+*/
+#define rb_gc_update_stack_extent() \
+    if __stack_grown rb_gc_stack_end = alloca(0);
+
+
 # define CHECK_INTS do {\
+    rb_gc_wipe_stack(); \
     if (!(rb_prohibit_interrupt || rb_thread_critical)) {\
         if (rb_thread_pending) rb_thread_schedule();\
 	if (rb_trap_pending) rb_trap_exec();\
@@ -92,6 +135,7 @@
 RUBY_EXTERN int rb_thread_tick;
 #define THREAD_TICK 500
 #define CHECK_INTS do {\
+    rb_gc_wipe_stack(); \
     if (!(rb_prohibit_interrupt || rb_thread_critical)) {\
 	if (rb_thread_tick-- <= 0) {\
 	    rb_thread_tick = THREAD_TICK;\
diff -rux '*.o' ruby-1.8.7-p72/signal.c ruby-1.8.7-mbari/signal.c
--- ruby-1.8.7-p72/signal.c	2008-06-06 03:39:57.000000000 -0700
+++ ruby-1.8.7-mbari/signal.c	2008-12-13 23:24:39.000000000 -0800
@@ -2,8 +2,8 @@
 
   signal.c -
 
-  $Author: knu $
-  $Date: 2008-06-06 19:39:57 +0900 (Fri, 06 Jun 2008) $
+  $Author: brent $
+  $Date: 2008/12/14 07:24:39 $
   created at: Tue Dec 20 10:13:44 JST 1994
 
   Copyright (C) 1993-2003 Yukihiro Matsumoto
@@ -629,8 +629,6 @@
     }
 #endif
 
-    extern int ruby_gc_stress;
-    ruby_gc_stress = 0;
     rb_bug("Segmentation fault");
 }
 #endif
diff -rux '*.o' ruby-1.8.7-p72/version.h ruby-1.8.7-mbari/version.h
--- ruby-1.8.7-p72/version.h	2008-12-13 23:32:29.000000000 -0800
+++ ruby-1.8.7-mbari/version.h	2008-12-13 20:47:17.000000000 -0800
@@ -1,7 +1,7 @@
 #define RUBY_VERSION "1.8.7"
-#define RUBY_RELEASE_DATE "2008-12-12"
+#define RUBY_RELEASE_DATE "2008-12-13"
 #define RUBY_VERSION_CODE 187
-#define RUBY_RELEASE_CODE 20081212
+#define RUBY_RELEASE_CODE 20081213
 #define RUBY_PATCHLEVEL 72
 
 #define RUBY_VERSION_MAJOR 1
@@ -9,7 +9,7 @@
 #define RUBY_VERSION_TEENY 7
 #define RUBY_RELEASE_YEAR 2008
 #define RUBY_RELEASE_MONTH 12
-#define RUBY_RELEASE_DAY 12
+#define RUBY_RELEASE_DAY 13
 
 #ifdef RUBY_EXTERN
 RUBY_EXTERN const char ruby_version[];
@@ -25,7 +25,7 @@
 #define RUBY_BIRTH_MONTH 2
 #define RUBY_BIRTH_DAY 24
 
-#define RUBY_RELEASE_STR "MBARI 2 on patchlevel"
+#define RUBY_RELEASE_STR "MBARI 3 on patchlevel"
 #define RUBY_RELEASE_NUM RUBY_PATCHLEVEL
 
 
src/rvm/patches/ruby/1.8.7/ruby187gc.patch000066400000043344147511530530014014 0ustar00--- a/intern.h	(revision 31212)
+++ b/intern.h	(working copy)
@@ -270,6 +270,15 @@
 VALUE rb_gc_enable _((void));
 VALUE rb_gc_disable _((void));
 VALUE rb_gc_start _((void));
+VALUE rb_gc_enable_stats _((void));
+VALUE rb_gc_disable_stats _((void));
+VALUE rb_gc_allocated_size _((void));
+unsigned long rb_os_live_objects _((void));
+#ifdef HAVE_LONG_LONG
+unsigned long long rb_os_allocated_objects _((void));
+#else
+unsigned long rb_os_allocated_objects _((void));
+#endif
 /* hash.c */
 void st_foreach_safe _((struct st_table *, int (*)(ANYARGS), unsigned long));
 void rb_hash_foreach _((VALUE, int (*)(ANYARGS), VALUE));
--- a/gc.c	(revision 31212)
+++ b/gc.c	(working copy)
@@ -22,8 +22,16 @@
 #include <setjmp.h>
 #include <sys/types.h>
 
+#ifdef _WIN32
+#include <string.h>
+#else
+#include <strings.h>
+#endif
+
 #ifdef HAVE_SYS_TIME_H
 #include <sys/time.h>
+#elif defined(_WIN32)
+#include <time.h> 
 #endif
 
 #ifdef HAVE_SYS_RESOURCE_H
@@ -76,6 +84,20 @@
 static VALUE nomem_error;
 static void garbage_collect();
 
+static unsigned long live_objects = 0;
+unsigned long rb_os_live_objects()
+{ return live_objects; }
+
+#if defined(HAVE_LONG_LONG)
+static unsigned long long allocated_objects = 0;
+unsigned long long rb_os_allocated_objects()
+{ return allocated_objects; }
+#else
+static unsigned long allocated_objects = 0;
+unsigned long rb_os_allocated_objects()
+{ return allocated_objects; }
+#endif
+
 int ruby_gc_stress = 0;
 
 NORETURN(void rb_exc_jump _((VALUE)));
@@ -132,6 +154,10 @@
     return bool;
 }
 
+long gc_allocated_size = 0;
+long gc_num_allocations = 0;
+static int gc_statistics = 0;
+
 void *
 ruby_xmalloc(size)
     long size;
@@ -156,6 +182,11 @@
     }
     malloc_increase += size;
 
+    if (gc_statistics) {
+      gc_allocated_size += size;
+      gc_num_allocations += 1;
+    }
+
     return mem;
 }
 
@@ -205,8 +236,16 @@
 	RUBY_CRITICAL(free(x));
 }
 
+#if HAVE_LONG_LONG
+#define GC_TIME_TYPE LONG_LONG
+#else
+#define GC_TIME_TYPE long
+#endif
+
 extern int ruby_in_compile;
 static int dont_gc;
+static GC_TIME_TYPE gc_time = 0;
+static int gc_collections = 0;
 static int during_gc;
 static int need_call_final = 0;
 static st_table *finalizer_table = 0;
@@ -255,6 +294,139 @@
     return old;
 }
 
+/*
+ *  call-seq:
+ *     GC.enable_stats    => true or false
+ *
+ *  Enables garbage collection statistics, returning <code>true</code> if garbage
+ *  collection statistics was already enabled.
+ *
+ *     GC.enable_stats   #=> false or true
+ *     GC.enable_stats   #=> true
+ *
+ */
+
+VALUE
+rb_gc_enable_stats()
+{
+    int old = gc_statistics;
+    gc_statistics = Qtrue;
+    return old;
+}
+
+/*
+ *  call-seq:
+ *     GC.disable_stats    => true or false
+ *
+ *  Disables garbage collection statistics, returning <code>true</code> if garbage
+ *  collection statistics was already disabled.
+ *
+ *     GC.disable_stats   #=> false or true
+ *     GC.disable_stats   #=> true
+ *
+ */
+
+VALUE
+rb_gc_disable_stats()
+{
+    int old = gc_statistics;
+    gc_statistics = Qfalse;
+    gc_allocated_size = 0;
+    gc_num_allocations = 0;
+    return old;
+}
+
+/*
+ *  call-seq:
+ *     GC.clear_stats    => nil
+ *
+ *  Clears garbage collection statistics, returning nil. This resets the number
+ *  of collections (GC.collections) and the time used (GC.time) to 0.
+ *
+ *     GC.clear_stats    #=> nil
+ *
+ */
+
+VALUE
+rb_gc_clear_stats()
+{
+    gc_collections = 0;
+    gc_time = 0;
+    gc_allocated_size = 0;
+    gc_num_allocations = 0;
+    return Qnil; 
+}
+
+/*
+ *  call-seq:
+ *     GC.allocated_size    => Integer
+ *
+ *  Returns the size of memory (in bytes) allocated since GC statistics collection
+ *  was enabled.
+ *
+ *     GC.allocated_size    #=> 35
+ *
+ */
+VALUE
+rb_gc_allocated_size()
+{
+    return INT2NUM(gc_allocated_size);
+}
+
+/*
+ *  call-seq:
+ *     GC.num_allocations    => Integer
+ *
+ *  Returns the number of memory allocations since GC statistics collection
+ *  was enabled.
+ *
+ *     GC.num_allocations    #=> 150
+ *
+ */
+VALUE
+rb_gc_num_allocations()
+{
+    return INT2NUM(gc_num_allocations);
+}
+
+/*
+ *  call-seq:
+ *     GC.collections    => Integer
+ *
+ *  Returns the number of garbage collections performed while GC statistics collection
+ *  was enabled.
+ *
+ *     GC.collections    #=> 35
+ *
+ */
+
+VALUE
+rb_gc_collections()
+{
+    return INT2NUM(gc_collections);
+}
+
+/*
+ *  call-seq:
+ *     GC.time    => Integer
+ *
+ *  Returns the time spent during garbage collection while GC statistics collection
+ *  was enabled (in micro seconds).
+ *
+ *     GC.time    #=> 20000
+ *
+ */
+
+VALUE
+rb_gc_time()
+{
+#if HAVE_LONG_LONG
+    return LL2NUM(gc_time);
+#else
+    return LONG2NUM(gc_time);
+#endif
+}
+
 VALUE rb_mGC;
 
 static struct gc_list {
@@ -346,7 +518,7 @@
 static RVALUE *freelist = 0;
 static RVALUE *deferred_final_list = 0;
 
-#define HEAPS_INCREMENT 10
+static int heaps_increment = 10;
 static struct heaps_slot {
     void *membase;
     RVALUE *slot;
@@ -355,13 +527,164 @@
 static int heaps_length = 0;
 static int heaps_used   = 0;
 
-#define HEAP_MIN_SLOTS 10000
-static int heap_slots = HEAP_MIN_SLOTS;
+static int heap_min_slots = 10000;
+static int heap_slots = 10000;
 
-#define FREE_MIN  4096
+static int heap_free_min = 4096;
+static int heap_slots_increment = 10000;
+static double heap_slots_growth_factor = 1.8;
 
+static long initial_malloc_limit = GC_MALLOC_LIMIT;
+
+static int verbose_gc_stats = Qfalse;
+
+static FILE* gc_data_file = NULL;
+
 static RVALUE *himem, *lomem;
 
+static void set_gc_parameters()
+{
+    char *gc_stats_ptr, *min_slots_ptr, *free_min_ptr, *heap_slots_incr_ptr,
+      *heap_incr_ptr, *malloc_limit_ptr, *gc_heap_file_ptr, *heap_slots_growth_factor_ptr;
+
+    gc_data_file = stderr;
+
+    gc_stats_ptr = getenv("RUBY_GC_STATS");
+    if (gc_stats_ptr != NULL) {
+  int gc_stats_i = atoi(gc_stats_ptr);
+  if (gc_stats_i > 0) {
+      verbose_gc_stats = Qtrue;
+  }
+    }
+
+    gc_heap_file_ptr = getenv("RUBY_GC_DATA_FILE");
+    if (gc_heap_file_ptr != NULL) {
+  FILE* data_file = fopen(gc_heap_file_ptr, "w");
+  if (data_file != NULL) {
+      gc_data_file = data_file;
+  }
+  else {
+      fprintf(stderr,
+        "can't open gc log file %s for writing, using default\n", gc_heap_file_ptr);
+  }
+    }
+
+    min_slots_ptr = getenv("RUBY_HEAP_MIN_SLOTS");
+    if (min_slots_ptr != NULL) {
+  int min_slots_i = atoi(min_slots_ptr);
+        if (verbose_gc_stats) {
+      fprintf(gc_data_file, "RUBY_HEAP_MIN_SLOTS=%s\n", min_slots_ptr);
+        }
+  if (min_slots_i > 0) {
+      heap_slots = min_slots_i;
+      heap_min_slots = min_slots_i;
+  }
+    }
+
+    free_min_ptr = getenv("RUBY_HEAP_FREE_MIN");
+    if (free_min_ptr != NULL) {
+  int free_min_i = atoi(free_min_ptr);
+        if (verbose_gc_stats) {
+      fprintf(gc_data_file, "RUBY_HEAP_FREE_MIN=%s\n", free_min_ptr);
+  }
+  if (free_min_i > 0) {
+      heap_free_min = free_min_i;
+  }
+    }
+
+    heap_incr_ptr = getenv("RUBY_HEAP_INCREMENT");
+    if (heap_incr_ptr != NULL) {
+  int heap_incr_i = atoi(heap_incr_ptr);
+        if (verbose_gc_stats) {
+      fprintf(gc_data_file, "RUBY_HEAP_INCREMENT=%s\n", heap_incr_ptr);
+  }
+  if (heap_incr_i > 0) {
+      heaps_increment = heap_incr_i;
+  }
+    }
+
+    heap_slots_incr_ptr = getenv("RUBY_HEAP_SLOTS_INCREMENT");
+    if (heap_slots_incr_ptr != NULL) {
+  int heap_slots_incr_i = atoi(heap_slots_incr_ptr);
+        if (verbose_gc_stats) {
+      fprintf(gc_data_file, "RUBY_HEAP_SLOTS_INCREMENT=%s\n", heap_slots_incr_ptr);
+  }
+  if (heap_slots_incr_i > 0) {
+      heap_slots_increment = heap_slots_incr_i;
+  }
+    }
+
+    heap_slots_growth_factor_ptr = getenv("RUBY_HEAP_SLOTS_GROWTH_FACTOR");
+    if (heap_slots_growth_factor_ptr != NULL) {
+  double heap_slots_growth_factor_d = atoi(heap_slots_growth_factor_ptr);
+        if (verbose_gc_stats) {
+      fprintf(gc_data_file, "RUBY_HEAP_SLOTS_GROWTH_FACTOR=%s\n", heap_slots_growth_factor_ptr);
+  }
+  if (heap_slots_growth_factor_d > 0) {
+      heap_slots_growth_factor = heap_slots_growth_factor_d;
+  }
+    }
+
+    malloc_limit_ptr = getenv("RUBY_GC_MALLOC_LIMIT");
+    if (malloc_limit_ptr != NULL) {
+  int malloc_limit_i = atol(malloc_limit_ptr);
+        if (verbose_gc_stats) {
+      fprintf(gc_data_file, "RUBY_GC_MALLOC_LIMIT=%s\n", malloc_limit_ptr);
+  }
+  if (malloc_limit_i > 0) {
+      initial_malloc_limit = malloc_limit_i;
+  }
+    }
+}
+
+/*
+ *  call-seq:
+ *     GC.dump    => nil
+ *
+ *  dumps information about the current GC data structures to the GC log file
+ *
+ *     GC.dump    #=> nil
+ *
+ */
+
+VALUE
+rb_gc_dump()
+{
+    int i;
+
+    for (i = 0; i < heaps_used; i++) {
+  int heap_size = heaps[i].limit;
+  fprintf(gc_data_file, "HEAP[%2d]: size=%7d\n", i, heap_size);
+    }
+
+    return Qnil;
+}
+
+/*
+ *  call-seq:
+ *     GC.log String  => String
+ *
+ *  Logs string to the GC data file and returns it.
+ *
+ *     GC.log "manual GC call"    #=> "manual GC call"
+ *
+ */
+
+VALUE
+rb_gc_log(self, original_str)
+     VALUE self, original_str;
+{
+    if (original_str == Qnil) {
+        fprintf(gc_data_file, "\n");
+    }
+    else {
+        VALUE str = StringValue(original_str);
+        char *p = RSTRING(str)->ptr;
+        fprintf(gc_data_file, "%s\n", p);
+    }
+    return original_str;
+}
+
 static void
 add_heap()
 {
@@ -372,7 +695,7 @@
 	struct heaps_slot *p;
 	int length;
 
-	heaps_length += HEAPS_INCREMENT;
+	heaps_length += heaps_increment;
 	length = heaps_length*sizeof(struct heaps_slot);
 	RUBY_CRITICAL(
 	    if (heaps_used > 0) {
@@ -388,10 +711,10 @@
     for (;;) {
 	RUBY_CRITICAL(p = (RVALUE*)malloc(sizeof(RVALUE)*(heap_slots+1)));
 	if (p == 0) {
-	    if (heap_slots == HEAP_MIN_SLOTS) {
+	    if (heap_slots == heap_min_slots) {
 		rb_memerror();
 	    }
-	    heap_slots = HEAP_MIN_SLOTS;
+	    heap_slots = heap_min_slots;
 	    continue;
 	}
         heaps[heaps_used].membase = p;
@@ -407,8 +730,9 @@
     if (lomem == 0 || lomem > p) lomem = p;
     if (himem < pend) himem = pend;
     heaps_used++;
-    heap_slots *= 1.8;
-    if (heap_slots <= 0) heap_slots = HEAP_MIN_SLOTS;
+    heap_slots += heap_slots_increment;
+    heap_slots_increment *= heap_slots_growth_factor;
+    if (heap_slots <= 0) heap_slots = heap_min_slots;
 
     while (p < pend) {
 	p->as.free.flags = 0;
@@ -442,6 +766,8 @@
     RANY(obj)->file = ruby_sourcefile;
     RANY(obj)->line = ruby_sourceline;
 #endif
+    live_objects++;
+    allocated_objects++;
     return obj;
 }
 
@@ -1102,6 +1428,39 @@
     }
 }
 
+static char* obj_type(int tp)
+{
+    switch (tp) {
+	case T_NIL    : return "NIL";   
+	case T_OBJECT : return "OBJECT";
+	case T_CLASS  : return "CLASS";
+	case T_ICLASS : return "ICLASS";
+	case T_MODULE : return "MODULE";
+	case T_FLOAT  : return "FLOAT";
+	case T_STRING : return "STRING";
+	case T_REGEXP : return "REGEXP";
+	case T_ARRAY  : return "ARRAY";
+	case T_FIXNUM : return "FIXNUM";
+	case T_HASH   : return "HASH";
+	case T_STRUCT : return "STRUCT";
+	case T_BIGNUM : return "BIGNUM";
+	case T_FILE   : return "FILE";
+	    
+	case T_TRUE   : return "TRUE";
+	case T_FALSE  : return "FALSE";
+	case T_DATA   : return "DATA";
+	case T_MATCH  : return "MATCH";
+	case T_SYMBOL : return "SYMBOL";
+	    
+	case T_BLKTAG : return "BLKTAG";
+	case T_UNDEF  : return "UNDEF";
+	case T_VARMAP : return "VARMAP";
+	case T_SCOPE  : return "SCOPE";
+	case T_NODE   : return "NODE";
+	default: return "____";
+    }
+}
+
 static void
 free_unused_heaps()
 {
@@ -1133,14 +1492,24 @@
     int i;
     unsigned long live = 0;
     unsigned long free_min = 0;
+    live_objects = 0;
 
+    unsigned long really_freed = 0;
+    int free_counts[256];
+    int live_counts[256];
+    int do_gc_stats = gc_statistics & verbose_gc_stats;
+
     for (i = 0; i < heaps_used; i++) {
         free_min += heaps[i].limit;
     }
     free_min = free_min * 0.2;
-    if (free_min < FREE_MIN)
-        free_min = FREE_MIN;
+    if (free_min < heap_free_min)
+        free_min = heap_free_min;
 
+    if (do_gc_stats) {
+      for (i = 0 ; i< 256; i++) { free_counts[i] = live_counts[i] = 0; }
+    }
+
     if (ruby_in_compile && ruby_parser_stack_on_heap()) {
 	/* should not reclaim nodes during compilation
            if yacc's semantic stack is not allocated on machine stack */
@@ -1171,6 +1540,11 @@
 	p = heaps[i].slot; pend = p + heaps[i].limit;
 	while (p < pend) {
 	    if (!(p->as.basic.flags & FL_MARK)) {
+	      if (p->as.basic.flags) {
+	        if (do_gc_stats) {
+	          really_freed++;
+	        }
+	      }
 		if (p->as.basic.flags &&
 		    ((deferred = obj_free((VALUE)p)) ||
 		     ((FL_TEST(p, FL_FINALIZE)) && need_call_final))) {
@@ -1183,6 +1557,12 @@
 		    final_list = p;
 		}
 		else {
+		    if (do_gc_stats) {
+		      int obt = p->as.basic.flags & T_MASK;
+		      if (obt) {
+		        free_counts[obt]++;
+		      }
+		    }
 		    add_freelist(p);
 		}
 		n++;
@@ -1193,7 +1573,10 @@
 	    }
 	    else {
 		RBASIC(p)->flags &= ~FL_MARK;
-		live++;
+		live_objects++;
+		if (do_gc_stats) {
+		  live_counts[RANY((VALUE)p)->as.basic.flags & T_MASK]++;
+		}
 	    }
 	    p++;
 	}
@@ -1211,8 +1594,8 @@
 	}
     }
     if (malloc_increase > malloc_limit) {
-	malloc_limit += (malloc_increase - malloc_limit) * (double)live / (live + freed);
-	if (malloc_limit < GC_MALLOC_LIMIT) malloc_limit = GC_MALLOC_LIMIT;
+      malloc_limit += (malloc_increase - malloc_limit) * (double)live_objects / (live_objects + freed);
+      if (malloc_limit < initial_malloc_limit) malloc_limit = initial_malloc_limit;
     }
     malloc_increase = 0;
     if (freed < free_min) {
@@ -1220,6 +1603,20 @@
     }
     during_gc = 0;
 
+    if (do_gc_stats) {
+      fprintf(gc_data_file, "objects processed: %.7d\n", live+freed);
+      fprintf(gc_data_file, "live objects	: %.7d\n", live);
+      fprintf(gc_data_file, "freelist objects : %.7d\n", freed - really_freed);
+      fprintf(gc_data_file, "freed objects	: %.7d\n", really_freed);
+      for(i=0; i<256; i++) {
+         if (free_counts[i]>0) {
+            fprintf(gc_data_file,
+             "kept %.7d / freed %.7d objects of type %s\n",
+             live_counts[i], free_counts[i], obj_type(i));
+           }
+       }
+    }
+
     /* clear finalization list */
     if (final_list) {
 	deferred_final_list = final_list;
@@ -1431,6 +1828,7 @@
     struct gc_list *list;
     struct FRAME * volatile frame; /* gcc 2.7.2.3 -O2 bug??  */
     jmp_buf save_regs_gc_mark;
+    struct timeval gctv1, gctv2;
     SET_STACK_END;
 
 #ifdef HAVE_NATIVETHREAD
@@ -1447,6 +1845,14 @@
     if (during_gc) return;
     during_gc++;
 
+    if (gc_statistics) {
+        gc_collections++;
+        gettimeofday(&gctv1, NULL);
+        if (verbose_gc_stats) {
+           fprintf(gc_data_file, "Garbage collection started\n");
+       }
+    }
+
     init_mark_stack();
 
     gc_mark((VALUE)ruby_current_node, 0);
@@ -1522,6 +1928,16 @@
     } while (!MARK_STACK_EMPTY);
 
     gc_sweep();
+    if (gc_statistics) {
+       GC_TIME_TYPE musecs_used;
+       gettimeofday(&gctv2, NULL);
+       musecs_used = ((GC_TIME_TYPE)(gctv2.tv_sec - gctv1.tv_sec) * 1000000) + (gctv2.tv_usec - gctv1.tv_usec);
+       gc_time += musecs_used;
+
+       if (verbose_gc_stats) {
+         fprintf(gc_data_file, "GC time: %d msec\n", musecs_used / 1000);
+       }
+    }
 }
 
 void
@@ -1703,6 +2119,7 @@
     if (!rb_gc_stack_start) {
 	Init_stack(0);
     }
+    set_gc_parameters();
     add_heap();
 }
 
@@ -2147,6 +2564,33 @@
     return (VALUE)((long)obj|FIXNUM_FLAG);
 }
 
+/* call-seq:
+ *  ObjectSpace.live_objects => number
+ *
+ * Returns the count of objects currently allocated in the system. This goes
+ * down after the garbage collector runs.
+ */
+static
+VALUE os_live_objects(VALUE self)
+{ return ULONG2NUM(live_objects); }
+
+/* call-seq:
+ *  ObjectSpace.allocated_objects => number
+ *
+ * Returns the count of objects allocated since the Ruby interpreter has
+ * started.  This number can only increase. To know how many objects are
+ * currently allocated, use ObjectSpace::live_objects
+ */
+static
+VALUE os_allocated_objects(VALUE self)
+{ 
+#if defined(HAVE_LONG_LONG)
+    return ULL2NUM(allocated_objects); 
+#else
+    return ULONG2NUM(allocated_objects); 
+#endif
+}
+
 /*
  *  The <code>GC</code> module provides an interface to Ruby's mark and
  *  sweep garbage collection mechanism. Some of the underlying methods
@@ -2166,6 +2610,16 @@
     rb_define_singleton_method(rb_mGC, "stress=", gc_stress_set, 1);
     rb_define_method(rb_mGC, "garbage_collect", rb_gc_start, 0);
 
+    rb_define_singleton_method(rb_mGC, "enable_stats", rb_gc_enable_stats, 0);
+    rb_define_singleton_method(rb_mGC, "disable_stats", rb_gc_disable_stats, 0);
+    rb_define_singleton_method(rb_mGC, "clear_stats", rb_gc_clear_stats, 0);
+    rb_define_singleton_method(rb_mGC, "allocated_size", rb_gc_allocated_size, 0);
+    rb_define_singleton_method(rb_mGC, "num_allocations", rb_gc_num_allocations, 0);
+    rb_define_singleton_method(rb_mGC, "collections", rb_gc_collections, 0);
+    rb_define_singleton_method(rb_mGC, "time", rb_gc_time, 0);
+    rb_define_singleton_method(rb_mGC, "dump", rb_gc_dump, 0);
+    rb_define_singleton_method(rb_mGC, "log", rb_gc_log, 1);
+
     rb_mObSpace = rb_define_module("ObjectSpace");
     rb_define_module_function(rb_mObSpace, "each_object", os_each_obj, -1);
     rb_define_module_function(rb_mObSpace, "garbage_collect", rb_gc_start, 0);
@@ -2173,6 +2627,8 @@
     rb_define_module_function(rb_mObSpace, "remove_finalizer", rm_final, 1);
     rb_define_module_function(rb_mObSpace, "finalizers", finals, 0);
     rb_define_module_function(rb_mObSpace, "call_finalizer", call_final, 1);
+    rb_define_module_function(rb_mObSpace, "live_objects", os_live_objects, 0);
+    rb_define_module_function(rb_mObSpace, "allocated_objects", os_allocated_objects, 0);
 
     rb_define_module_function(rb_mObSpace, "define_finalizer", define_final, -1);
     rb_define_module_function(rb_mObSpace, "undefine_finalizer", undefine_final, 1);
src/rvm/patches/ruby/1.8.7/readline-fix.diff000066400000002036147511530530014432 0ustar00diff --git a/ext/readline/extconf.rb b/ext/readline/extconf.rb
index b820c0b..f299cba 100644
--- a/ext/readline/extconf.rb
+++ b/ext/readline/extconf.rb
@@ -59,6 +59,9 @@ have_func("rl_cleanup_after_signal")
 have_func("rl_clear_signals")
 have_func("rl_vi_editing_mode")
 have_func("rl_emacs_editing_mode")
+# workaround for native windows.
+/mswin|bccwin|mingw/ !~ RUBY_PLATFORM && have_readline_var("rl_catch_sigwinch")
+/mswin|bccwin|mingw/ !~ RUBY_PLATFORM && have_readline_var("rl_catch_signals")
 have_func("replace_history_entry")
 have_func("remove_history")
 create_makefile("readline")
diff --git a/ext/readline/readline.c b/ext/readline/readline.c
index c9acaad..637cb99 100644
--- a/ext/readline/readline.c
+++ b/ext/readline/readline.c
@@ -833,6 +833,12 @@ Init_readline()
 #ifdef HAVE_RL_EVENT_HOOK
     rl_event_hook = readline_event;
 #endif
+#ifdef HAVE_RL_CATCH_SIGNALS
+    rl_catch_signals = 0;
+#endif
+#ifdef HAVE_RL_CATCH_SIGWINCH
+    rl_catch_sigwinch = 0;
+#endif
 #ifdef HAVE_RL_CLEAR_SIGNALS
     rl_clear_signals();
 #endif
src/rvm/patches/ruby/1.8.7/osx-arch-fix.patch000066400000000617147511530530014565 0ustar00diff --git a/Makefile.in b/Makefile.in
index 656ae90..f976cf1 100644
--- a/Makefile.in
+++ b/Makefile.in
@@ -45,7 +45,7 @@ XLDFLAGS = @XLDFLAGS@ $(EXTLDFLAGS)
 EXTLIBS = 
 LIBS = @LIBS@ $(EXTLIBS)
 MISSING = @LIBOBJS@ @ALLOCA@
-LDSHARED = @LIBRUBY_LDSHARED@
+LDSHARED = @LIBRUBY_LDSHARED@ $(LDFLAGS)
 DLDFLAGS = @LIBRUBY_DLDFLAGS@ $(EXTLDFLAGS) @ARCH_FLAG@
 SOLIBS = @SOLIBS@
 MAINLIBS = @MAINLIBS@
src/rvm/patches/ruby/1.8.7/no_sslv2.diff000066400000001252147511530530013627 0ustar00Index: ossl_ssl.c
===================================================================
--- a/ext/openssl/ossl_ssl.c	(revision 32381)
+++ b/ext/openssl/ossl_ssl.c	(revision 32382)
@@ -107,9 +107,12 @@
     OSSL_SSL_METHOD_ENTRY(TLSv1),
     OSSL_SSL_METHOD_ENTRY(TLSv1_server),
     OSSL_SSL_METHOD_ENTRY(TLSv1_client),
+#if defined(HAVE_SSLV2_METHOD) && defined(HAVE_SSLV2_SERVER_METHOD) && \
+        defined(HAVE_SSLV2_CLIENT_METHOD)	
     OSSL_SSL_METHOD_ENTRY(SSLv2),
     OSSL_SSL_METHOD_ENTRY(SSLv2_server),
     OSSL_SSL_METHOD_ENTRY(SSLv2_client),
+#endif
     OSSL_SSL_METHOD_ENTRY(SSLv3),
     OSSL_SSL_METHOD_ENTRY(SSLv3_server),
     OSSL_SSL_METHOD_ENTRY(SSLv3_client),
src/rvm/patches/ruby/1.8.7/fix-irb-completion.diff000066400000000673147511530530015577 0ustar00diff --git a/lib/irb/completion.rb b/lib/irb/completion.rb
index 000658e..609dca3 100644
--- a/lib/irb/completion.rb
+++ b/lib/irb/completion.rb
@@ -157,7 +157,7 @@ module IRB
 	    end
 	    next if name != "IRB::Context" and 
 	      /^(IRB|SLex|RubyLex|RubyToken)/ =~ name
-	    candidates.concat m.instance_methods(false)
+	    candidates.concat m.instance_methods(false).map { |m| m.to_s }
 	  }
 	  candidates.sort!
 	  candidates.uniq!
src/rvm/patches/ruby/1.8.7/hs.patch000066400000077773147511530530012710 0ustar00diff --git a/eval.c b/eval.c
index b705302..909cd3d 100644
--- a/eval.c
+++ b/eval.c
@@ -73,6 +73,7 @@ char *strrchr _((const char*,const char));
 #endif
 
 #include <time.h>
+#include <sys/mman.h>
 
 #ifdef __BEOS__
 #include <net/socket.h>
@@ -1022,7 +1023,7 @@ static struct tag *prot_tag;
     _tag.blkid = 0;			\
     prot_tag = &_tag
 
-#define PROT_NONE   Qfalse	/* 0 */
+#define PROT_EMPTY  Qfalse	/* 0 */
 #define PROT_THREAD Qtrue	/* 2 */
 #define PROT_FUNC   INT2FIX(0)	/* 1 */
 #define PROT_LOOP   INT2FIX(1)	/* 3 */
@@ -1234,7 +1235,7 @@ error_print()
 
     if (NIL_P(ruby_errinfo)) return;
 
-    PUSH_TAG(PROT_NONE);
+    PUSH_TAG(PROT_EMPTY);
     if (EXEC_TAG() == 0) {
 	errat = get_backtrace(ruby_errinfo);
     }
@@ -1395,7 +1396,7 @@ ruby_init()
     /* default visibility is private at toplevel */
     SCOPE_SET(SCOPE_PRIVATE);
 
-    PUSH_TAG(PROT_NONE);
+    PUSH_TAG(PROT_EMPTY);
     if ((state = EXEC_TAG()) == 0) {
 	rb_call_inits();
 	ruby_class = rb_cObject;
@@ -1529,7 +1530,7 @@ ruby_options(argc, argv)
     int state;
 
     Init_stack((void*)&state);
-    PUSH_TAG(PROT_NONE);
+    PUSH_TAG(PROT_EMPTY);
     if ((state = EXEC_TAG()) == 0) {
 	ruby_process_options(argc, argv);
     }
@@ -1546,7 +1547,7 @@ void rb_exec_end_proc _((void));
 static void
 ruby_finalize_0()
 {
-    PUSH_TAG(PROT_NONE);
+    PUSH_TAG(PROT_EMPTY);
     if (EXEC_TAG() == 0) {
 	rb_trap_exit();
     }
@@ -1584,7 +1585,7 @@ ruby_cleanup(ex)
     Init_stack((void *)&state);
     ruby_finalize_0();
     errs[0] = ruby_errinfo;
-    PUSH_TAG(PROT_NONE);
+    PUSH_TAG(PROT_EMPTY);
     PUSH_ITER(ITER_NOT);
     if ((state = EXEC_TAG()) == 0) {
 	rb_thread_cleanup();
@@ -1635,7 +1636,7 @@ ruby_exec_internal()
 {
     int state;
 
-    PUSH_TAG(PROT_NONE);
+    PUSH_TAG(PROT_EMPTY);
     PUSH_ITER(ITER_NOT);
     /* default visibility is private at toplevel */
     SCOPE_SET(SCOPE_PRIVATE);
@@ -1857,7 +1858,7 @@ rb_eval_cmd(cmd, arg, level)
     }
     if (TYPE(cmd) != T_STRING) {
 	PUSH_ITER(ITER_NOT);
-	PUSH_TAG(PROT_NONE);
+	PUSH_TAG(PROT_EMPTY);
 	ruby_safe_level = level;
 	if ((state = EXEC_TAG()) == 0) {
 	    val = rb_funcall2(cmd, rb_intern("call"), RARRAY(arg)->len, RARRAY(arg)->ptr);
@@ -1879,7 +1880,7 @@ rb_eval_cmd(cmd, arg, level)
 
     ruby_safe_level = level;
 
-    PUSH_TAG(PROT_NONE);
+    PUSH_TAG(PROT_EMPTY);
     if ((state = EXEC_TAG()) == 0) {
 	val = eval(ruby_top_self, cmd, Qnil, 0, 0);
     }
@@ -2386,7 +2387,7 @@ is_defined(self, node, buf)
 	val = self;
 	if (node->nd_recv == (NODE *)1) goto check_bound;
       case NODE_CALL:
-	PUSH_TAG(PROT_NONE);
+	PUSH_TAG(PROT_EMPTY);
 	if ((state = EXEC_TAG()) == 0) {
 	    val = rb_eval(self, node->nd_recv);
 	}
@@ -2488,7 +2489,7 @@ is_defined(self, node, buf)
 	break;
 
       case NODE_COLON2:
-	PUSH_TAG(PROT_NONE);
+	PUSH_TAG(PROT_EMPTY);
 	if ((state = EXEC_TAG()) == 0) {
 	    val = rb_eval(self, node->nd_head);
 	}
@@ -2537,7 +2538,7 @@ is_defined(self, node, buf)
 	goto again;
 
       default:
-	PUSH_TAG(PROT_NONE);
+	PUSH_TAG(PROT_EMPTY);
 	if ((state = EXEC_TAG()) == 0) {
 	    rb_eval(self, node);
 	}
@@ -2741,7 +2742,7 @@ call_trace_func(event, node, self, id, klass)
 	    klass = rb_iv_get(klass, "__attached__");
 	}
     }
-    PUSH_TAG(PROT_NONE);
+    PUSH_TAG(PROT_EMPTY);
     raised = rb_thread_reset_raised(th);
     if ((state = EXEC_TAG()) == 0) {
 	srcfile = rb_str_new2(ruby_sourcefile?ruby_sourcefile:"(ruby)");
@@ -3304,7 +3305,7 @@ rb_eval(self, n)
 	    volatile VALUE e_info = ruby_errinfo;
 	    volatile int rescuing = 0;
 
-	    PUSH_TAG(PROT_NONE);
+	    PUSH_TAG(PROT_EMPTY);
 	    if ((state = EXEC_TAG()) == 0) {
 	      retry_entry:
 		result = rb_eval(self, node->nd_head);
@@ -3353,7 +3354,7 @@ rb_eval(self, n)
 	break;
 
       case NODE_ENSURE:
-	PUSH_TAG(PROT_NONE);
+	PUSH_TAG(PROT_EMPTY);
 	if ((state = EXEC_TAG()) == 0) {
 	    result = rb_eval(self, node->nd_head);
 	}
@@ -3571,7 +3572,7 @@ rb_eval(self, n)
 	    ruby_frame = &frame;
 
 	    PUSH_SCOPE();
-	    PUSH_TAG(PROT_NONE);
+	    PUSH_TAG(PROT_EMPTY);
 	    if (node->nd_rval) {
 		saved_cref = ruby_cref;
 		ruby_cref = (NODE*)node->nd_rval;
@@ -4197,7 +4198,7 @@ module_setup(module, n)
     }
 
     PUSH_CREF(module);
-    PUSH_TAG(PROT_NONE);
+    PUSH_TAG(PROT_EMPTY);
     if ((state = EXEC_TAG()) == 0) {
 	EXEC_EVENT_HOOK(RUBY_EVENT_CLASS, n, ruby_cbase,
 			ruby_frame->last_func, ruby_frame->last_class);
@@ -4604,7 +4605,7 @@ rb_longjmp(tag, mesg)
 	VALUE e = ruby_errinfo;
 	int status;
 
-	PUSH_TAG(PROT_NONE);
+	PUSH_TAG(PROT_EMPTY);
 	if ((status = EXEC_TAG()) == 0) {
 	    StringValue(e);
 	    warn_printf("Exception `%s' at %s:%d - %s\n",
@@ -4978,7 +4979,7 @@ rb_yield_0(val, self, klass, flags, avalue)
     var = block->var;
 
     if (var) {
-	PUSH_TAG(PROT_NONE);
+	PUSH_TAG(PROT_EMPTY);
 	if ((state = EXEC_TAG()) == 0) {
 	    NODE *bvar = NULL;
 	  block_var:
@@ -5051,7 +5052,7 @@ rb_yield_0(val, self, klass, flags, avalue)
     ruby_current_node = node;
 
     PUSH_ITER(block->iter);
-    PUSH_TAG(lambda ? PROT_NONE : PROT_YIELD);
+    PUSH_TAG(lambda ? PROT_EMPTY : PROT_YIELD);
     if ((state = EXEC_TAG()) == 0) {
       redo:
 	if (nd_type(node) == NODE_CFUNC || nd_type(node) == NODE_IFUNC) {
@@ -5464,7 +5465,7 @@ rb_rescue2(b_proc, data1, r_proc, data2, va_alist)
     VALUE eclass;
     va_list args;
 
-    PUSH_TAG(PROT_NONE);
+    PUSH_TAG(PROT_EMPTY);
     switch (state = EXEC_TAG()) {
       case TAG_RETRY:
 	if (!handle) break;
@@ -5522,7 +5523,7 @@ rb_protect(proc, data, state)
     VALUE result = Qnil;	/* OK */
     int status;
 
-    PUSH_TAG(PROT_NONE);
+    PUSH_TAG(PROT_EMPTY);
     cont_protect = (VALUE)rb_node_newnode(NODE_MEMO, cont_protect, 0, 0);
     if ((status = EXEC_TAG()) == 0) {
 	result = (*proc)(data);
@@ -5550,7 +5551,7 @@ rb_ensure(b_proc, data1, e_proc, data2)
     volatile VALUE result = Qnil;
     VALUE retval;
 
-    PUSH_TAG(PROT_NONE);
+    PUSH_TAG(PROT_EMPTY);
     if ((state = EXEC_TAG()) == 0) {
 	result = (*b_proc)(data1);
     }
@@ -5577,7 +5578,7 @@ rb_with_disable_interrupt(proc, data)
 	int thr_critical = rb_thread_critical;
 
 	rb_thread_critical = Qtrue;
-	PUSH_TAG(PROT_NONE);
+	PUSH_TAG(PROT_EMPTY);
 	if ((status = EXEC_TAG()) == 0) {
 	    result = (*proc)(data);
 	}
@@ -6264,7 +6265,7 @@ rb_funcall_rescue(recv, mid, n, va_alist)
 
     va_init_list(ar, n);
 
-    PUSH_TAG(PROT_NONE);
+    PUSH_TAG(PROT_EMPTY);
     if ((status = EXEC_TAG()) == 0) {
 	result = vafuncall(recv, mid, n, &ar);
     }
@@ -6539,7 +6540,7 @@ eval(self, src, scope, file, line)
     if (TYPE(ruby_class) == T_ICLASS) {
 	ruby_class = RBASIC(ruby_class)->klass;
     }
-    PUSH_TAG(PROT_NONE);
+    PUSH_TAG(PROT_EMPTY);
     if ((state = EXEC_TAG()) == 0) {
 	NODE *node;
 
@@ -6698,7 +6699,7 @@ exec_under(func, under, cbase, args)
 
     mode = scope_vmode;
     SCOPE_SET(SCOPE_PUBLIC);
-    PUSH_TAG(PROT_NONE);
+    PUSH_TAG(PROT_EMPTY);
     if ((state = EXEC_TAG()) == 0) {
 	val = (*func)(args);
     }
@@ -7009,7 +7010,7 @@ rb_load(fname, wrap)
     PUSH_SCOPE();
     /* default visibility is private at loading toplevel */
     SCOPE_SET(SCOPE_PRIVATE);
-    PUSH_TAG(PROT_NONE);
+    PUSH_TAG(PROT_EMPTY);
     state = EXEC_TAG();
     last_func = ruby_frame->last_func;
     last_node = ruby_current_node;
@@ -7068,7 +7069,7 @@ rb_load_protect(fname, wrap, state)
 {
     int status;
 
-    PUSH_TAG(PROT_NONE);
+    PUSH_TAG(PROT_EMPTY);
     if ((status = EXEC_TAG()) == 0) {
 	rb_load(fname, wrap);
     }
@@ -7389,7 +7390,7 @@ rb_require_safe(fname, safe)
     saved.node = ruby_current_node;
     saved.func = ruby_frame->last_func;
     saved.safe = ruby_safe_level;
-    PUSH_TAG(PROT_NONE);
+    PUSH_TAG(PROT_EMPTY);
     if ((state = EXEC_TAG()) == 0) {
 	VALUE feature, path;
 	long handle;
@@ -8097,7 +8098,7 @@ rb_exec_end_proc()
 	tmp_end_procs = link = ephemeral_end_procs;
 	ephemeral_end_procs = 0;
 	while (link) {
-	    PUSH_TAG(PROT_NONE);
+	    PUSH_TAG(PROT_EMPTY);
 	    if ((status = EXEC_TAG()) == 0) {
 		ruby_safe_level = link->safe;
 		(*link->func)(link->data);
@@ -8115,7 +8116,7 @@ rb_exec_end_proc()
 	tmp_end_procs = link = end_procs;
 	end_procs = 0;
 	while (link) {
-	    PUSH_TAG(PROT_NONE);
+	    PUSH_TAG(PROT_EMPTY);
 	    if ((status = EXEC_TAG()) == 0) {
 		ruby_safe_level = link->safe;
 		(*link->func)(link->data);
@@ -8852,7 +8853,7 @@ proc_invoke(proc, args, self, klass)
     ruby_block = &_block;
     PUSH_ITER(ITER_CUR);
     ruby_frame->iter = ITER_CUR;
-    PUSH_TAG(pcall ? PROT_LAMBDA : PROT_NONE);
+    PUSH_TAG(pcall ? PROT_LAMBDA : PROT_EMPTY);
     state = EXEC_TAG();
     if (state == 0) {
 	proc_set_safe_level(proc);
@@ -10179,6 +10180,7 @@ win32_set_exception_list(p)
 int rb_thread_pending = 0;
 
 VALUE rb_cThread;
+static unsigned int rb_thread_stack_size;
 
 extern VALUE rb_last_status;
 
@@ -10406,12 +10408,20 @@ thread_mark(th)
     rb_gc_mark(th->thread);
     if (th->join) rb_gc_mark(th->join->thread);
 
-    rb_gc_mark(th->klass);
-    rb_gc_mark(th->wrapper);
-    rb_gc_mark((VALUE)th->cref);
+    if (curr_thread == th) {
+      rb_gc_mark(ruby_class);
+      rb_gc_mark(ruby_wrapper);
+      rb_gc_mark((VALUE)ruby_cref);
+      rb_gc_mark((VALUE)ruby_scope);
+      rb_gc_mark((VALUE)ruby_dyna_vars);
+    } else {
+      rb_gc_mark(th->klass);
+      rb_gc_mark(th->wrapper);
+      rb_gc_mark((VALUE)th->cref);
+      rb_gc_mark((VALUE)th->scope);
+      rb_gc_mark((VALUE)th->dyna_vars);
+    }
 
-    rb_gc_mark((VALUE)th->scope);
-    rb_gc_mark((VALUE)th->dyna_vars);
     rb_gc_mark(th->errinfo);
     rb_gc_mark(th->last_status);
     rb_gc_mark(th->last_line);
@@ -10421,11 +10431,11 @@ thread_mark(th)
     rb_gc_mark_maybe(th->sandbox);
 
     /* mark data in copied stack */
-    if (th == curr_thread) return;
+    if (th == main_thread) return;
     if (th->status == THREAD_KILLED) return;
     if (th->stk_len == 0) return;  /* stack not active, no need to mark. */
-    if (th->stk_ptr) {
-	rb_gc_mark_locations(th->stk_ptr, th->stk_ptr+th->stk_len);
+    if (th->stk_ptr && th != curr_thread) {
+      rb_gc_mark_locations(th->stk_pos, th->stk_base);
 #if defined(THINK_C) || defined(__human68k__)
 	rb_gc_mark_locations(th->stk_ptr+2, th->stk_ptr+th->stk_len+2);
 #endif
@@ -10435,24 +10445,30 @@ thread_mark(th)
 	}
 #endif
     }
-    frame = th->frame;
+
+    if (curr_thread == th)
+      frame = ruby_frame;
+    else
+      frame = th->frame;
+
     while (frame && frame != top_frame) {
-	frame = ADJ(frame);
 	rb_gc_mark_frame(frame);
 	if (frame->tmp) {
 	    struct FRAME *tmp = frame->tmp;
-
 	    while (tmp && tmp != top_frame) {
-		tmp = ADJ(tmp);
 		rb_gc_mark_frame(tmp);
 		tmp = tmp->prev;
 	    }
 	}
 	frame = frame->prev;
     }
-    block = th->block;
+
+    if (curr_thread == th)
+      block = ruby_block;
+    else
+      block = th->block;
+
     while (block) {
-	block = ADJ(block);
 	rb_gc_mark_frame(&block->frame);
 	block = block->prev;
     }
@@ -10515,7 +10531,7 @@ static inline void
 stack_free(th)
     rb_thread_t th;
 {
-    if (th->stk_ptr) free(th->stk_ptr);
+  if (th->stk_ptr) munmap(th->stk_ptr, th->stk_size);
     th->stk_ptr = 0;
 #ifdef __ia64
     if (th->bstr_ptr) free(th->bstr_ptr);
@@ -10576,35 +10592,8 @@ rb_thread_save_context(th)
     static VALUE tval;
 
     len = ruby_stack_length(&pos);
-    th->stk_len = 0;
-    th->stk_pos = pos;
-    if (len > th->stk_max) {
-	VALUE *ptr = realloc(th->stk_ptr, sizeof(VALUE) * len);
-	if (!ptr) rb_memerror();
-	th->stk_ptr = ptr;
-	th->stk_max = len;
-    }
     th->stk_len = len;
-    FLUSH_REGISTER_WINDOWS;
-    MEMCPY(th->stk_ptr, th->stk_pos, VALUE, th->stk_len);
-#ifdef __ia64
-    th->bstr_pos = rb_gc_register_stack_start;
-    len = (VALUE*)rb_ia64_bsp() - th->bstr_pos;
-    th->bstr_len = 0;
-    if (len > th->bstr_max) {
-        VALUE *ptr = realloc(th->bstr_ptr, sizeof(VALUE) * len);
-        if (!ptr) rb_memerror();
-        th->bstr_ptr = ptr;
-        th->bstr_max = len;
-    }
-    th->bstr_len = len;
-    rb_ia64_flushrs();
-    MEMCPY(th->bstr_ptr, th->bstr_pos, VALUE, th->bstr_len);
-#endif
-#ifdef SAVE_WIN32_EXCEPTION_LIST
-    th->win32_exception_list = win32_get_exception_list();
-#endif
-
+    th->stk_pos = pos;
     th->frame = ruby_frame;
     th->scope = ruby_scope;
     ruby_scope->flags |= SCOPE_DONT_RECYCLE;
@@ -10714,11 +10703,6 @@ rb_thread_restore_context_0(rb_thread_t th, int exit)
 #endif
     tmp = th;
     ex = exit;
-    FLUSH_REGISTER_WINDOWS;
-    MEMCPY(tmp->stk_pos, tmp->stk_ptr, VALUE, tmp->stk_len);
-#ifdef __ia64
-    MEMCPY(tmp->bstr_pos, tmp->bstr_ptr, VALUE, tmp->bstr_len);
-#endif
 
     tval = rb_lastline_get();
     rb_lastline_set(tmp->last_line);
@@ -10809,8 +10793,8 @@ rb_thread_restore_context(th, exit)
     rb_thread_t th;
     int exit;
 {
-    if (!th->stk_ptr) rb_bug("unsaved context");
-    stack_extend(th, exit);
+    if (!th->stk_ptr && th != main_thread) rb_bug("unsaved context");
+    rb_thread_restore_context_0(th, exit);
 }
 
 static void
@@ -10829,7 +10813,6 @@ rb_thread_die(th)
 {
     th->thgroup = 0;
     th->status = THREAD_KILLED;
-    stack_free(th);
 }
 
 static void
@@ -12096,6 +12079,7 @@ rb_thread_group(thread)
 \
     th->stk_ptr = 0;\
     th->stk_len = 0;\
+    th->stk_size = 0;\
     th->stk_max = 0;\
     th->wait_for = 0;\
     IA64_INIT(th->bstr_ptr = 0);\
@@ -12143,6 +12127,48 @@ rb_thread_alloc(klass)
     THREAD_ALLOC(th);
     th->thread = Data_Wrap_Struct(klass, thread_mark, thread_free, th);
 
+    /* if main_thread != NULL, then this is NOT the main thread, so
+     * we create a heap-stack
+     */
+    if (main_thread) {
+      /* Allocate stack, don't forget to add 1 extra word because of the MATH below */
+      unsigned int pagesize = getpagesize();
+      unsigned int total_size = rb_thread_stack_size + pagesize + sizeof(int);
+      void *stack_area = NULL;
+
+      stack_area = mmap(NULL, total_size, PROT_READ | PROT_WRITE | PROT_EXEC,
+			MAP_PRIVATE | MAP_ANON, -1, 0);
+
+      if (stack_area == MAP_FAILED) {
+	fprintf(stderr, "Thread stack allocation failed!\n");
+	rb_memerror();
+      }
+
+      th->stk_ptr = th->stk_pos = stack_area;
+      th->stk_size = total_size;
+
+      if (mprotect(th->stk_ptr, pagesize, PROT_NONE) == -1) {
+	fprintf(stderr, "Failed to create thread guard region: %s\n", strerror(errno));
+	rb_memerror();
+      }
+
+      th->guard = th->stk_ptr + (pagesize/sizeof(VALUE *));
+
+      /* point stk_base at the top of the stack */
+      /* ASSUMPTIONS:
+       * 1.) The address returned by malloc is "suitably aligned" for anything on this system
+       * 2.) Adding a value that is "aligned" for this platform should not unalign the address
+       *     returned from malloc.
+       * 3.) Don't push anything on to the stack, otherwise it'll get unaligned.
+       * 4.) x86_64 ABI says aligned AFTER arguments have been pushed. You *must* then do a call[lq]
+       *     or push[lq] something else on to the stack if you inted to do a ret.
+       */
+      th->stk_base = th->stk_ptr + ((total_size - sizeof(int))/sizeof(VALUE *));
+      th->stk_len = rb_thread_stack_size;
+    } else {
+      th->stk_ptr = th->stk_pos = rb_gc_stack_start;
+    }
+
     for (vars = th->dyna_vars; vars; vars = vars->next) {
 	if (FL_TEST(vars, DVAR_DONT_RECYCLE)) break;
 	FL_SET(vars, DVAR_DONT_RECYCLE);
@@ -12246,17 +12272,22 @@ rb_thread_stop_timer()
 int rb_thread_tick = THREAD_TICK;
 #endif
 
+struct thread_start_args {
+  VALUE (*fn)();
+  void *arg;
+  rb_thread_t th;
+} new_th;
+
+static VALUE
+rb_thread_start_2();
+
 static VALUE
 rb_thread_start_0(fn, arg, th)
     VALUE (*fn)();
     void *arg;
     rb_thread_t th;
 {
-    volatile rb_thread_t th_save = th;
     volatile VALUE thread = th->thread;
-    struct BLOCK *volatile saved_block = 0;
-    enum rb_thread_status status;
-    int state;
 
     if (OBJ_FROZEN(curr_thread->thgroup)) {
 	rb_raise(rb_eThreadError,
@@ -12284,16 +12315,41 @@ rb_thread_start_0(fn, arg, th)
 	return thread;
     }
 
-    if (ruby_block) {		/* should nail down higher blocks */
-	struct BLOCK dummy;
+    new_th.fn = fn;
+    new_th.arg = arg;
+    new_th.th = th;
+
+#if defined(__i386__)
+    __asm__ __volatile__ ("movl %0, %%esp\n\t"
+                          "calll *%1\n"
+                          :: "r" (th->stk_base),
+                             "r" (rb_thread_start_2));
+#elif defined(__x86_64__)
+    __asm__ __volatile__ ("movq %0, %%rsp\n\t"
+                          "callq *%1\n"
+                          :: "r" (th->stk_base),
+                             "r" (rb_thread_start_2));
+#else
+    #error unsupported architecture!
+#endif
+    /* NOTREACHED */
+    return 0;
+}
 
-	dummy.prev = ruby_block;
-	blk_copy_prev(&dummy);
-	saved_block = ruby_block = dummy.prev;
-    }
-    scope_dup(ruby_scope);
+static VALUE
+rb_thread_start_2()
+{
+   volatile rb_thread_t th = new_th.th;
+   volatile rb_thread_t th_save = th;
+   volatile VALUE thread = th->thread;
+   struct BLOCK *volatile saved_block = 0;
+   enum rb_thread_status status;
+   int state;
+   struct tag *tag;
+   struct RVarmap *vars;
+   struct FRAME dummy_frame;
 
-    if (!th->next) {
+   if (!th->next) {
 	/* merge in thread list */
 	th->prev = curr_thread;
 	curr_thread->next->prev = th;
@@ -12301,13 +12357,27 @@ rb_thread_start_0(fn, arg, th)
 	curr_thread->next = th;
 	th->priority = curr_thread->priority;
 	th->thgroup = curr_thread->thgroup;
+   }
+   curr_thread = th;
+
+   dummy_frame = *ruby_frame;
+   dummy_frame.prev = top_frame;
+   ruby_frame = &dummy_frame;
+
+   if (ruby_block) {		/* should nail down higher blocks */
+	struct BLOCK dummy;
+
+	dummy.prev = ruby_block;
+	blk_copy_prev(&dummy);
+	saved_block = ruby_block = dummy.prev;
     }
 
+    scope_dup(ruby_scope);
+
     PUSH_TAG(PROT_THREAD);
     if ((state = EXEC_TAG()) == 0) {
 	if (THREAD_SAVE_CONTEXT(th) == 0) {
-	    curr_thread = th;
-	    th->result = (*fn)(arg, th);
+	    th->result = (*new_th.fn)(new_th.arg, th);
 	}
 	th = th_save;
     }
@@ -12644,6 +12714,43 @@ rb_thread_cleanup()
     END_FOREACH_FROM(curr, th);
 }
 
+/*
+ * call-seq:
+ *    Thread.stack_size    => fixnum
+ *
+ * Returns the thread stack size in bytes
+ */
+static VALUE
+rb_thread_stacksize_get()
+{
+  return INT2FIX(rb_thread_stack_size);
+}
+
+/*
+ * call-seq:
+ *    Thread.stack_size= fixnum => Qnil
+ *
+ * Sets the global thread stacksize and returns Qnil.
+ */
+static VALUE
+rb_thread_stacksize_set(obj, val)
+     VALUE obj;
+     VALUE val;
+{
+
+  unsigned int size = FIX2UINT(val);
+
+  /* 16byte alignment works for both x86 and x86_64 */
+  if (size & (~0xf)) {
+    size += 0x10;
+    size = size & (~0xf);
+  }
+
+  rb_thread_stack_size = size;
+
+  return Qnil;
+}
+
 int rb_thread_critical;
 
 
@@ -13473,7 +13580,7 @@ rb_exec_recursive(func, obj, arg)
 	int state;
 
 	hash = recursive_push(hash, objid);
-	PUSH_TAG(PROT_NONE);
+	PUSH_TAG(PROT_EMPTY);
 	if ((state = EXEC_TAG()) == 0) {
 	    result = (*func) (obj, arg, Qfalse);
 	}
@@ -13500,6 +13607,8 @@ Init_Thread()
 {
     VALUE cThGroup;
 
+    rb_thread_stack_size = (1024 * 1024);
+
     recursive_key = rb_intern("__recursive_key__");
     rb_eThreadError = rb_define_class("ThreadError", rb_eStandardError);
     rb_cThread = rb_define_class("Thread", rb_cObject);
@@ -13524,6 +13633,9 @@ Init_Thread()
     rb_define_singleton_method(rb_cThread, "abort_on_exception", rb_thread_s_abort_exc, 0);
     rb_define_singleton_method(rb_cThread, "abort_on_exception=", rb_thread_s_abort_exc_set, 1);
 
+    rb_define_singleton_method(rb_cThread, "stack_size", rb_thread_stacksize_get, 0);
+    rb_define_singleton_method(rb_cThread, "stack_size=", rb_thread_stacksize_set, 1);
+
     rb_define_method(rb_cThread, "run", rb_thread_run, 0);
     rb_define_method(rb_cThread, "wakeup", rb_thread_wakeup, 0);
     rb_define_method(rb_cThread, "kill", rb_thread_kill, 0);
diff --git a/gc.c b/gc.c
index a564f0b..d6d654d 100644
--- a/gc.c
+++ b/gc.c
@@ -506,12 +506,12 @@ stack_end_address(VALUE **stack_end_p)
 # define STACK_END (stack_end)
 #endif
 #if STACK_GROW_DIRECTION < 0
-# define STACK_LENGTH  (rb_gc_stack_start - STACK_END)
+# define STACK_LENGTH(start)  ((start) - STACK_END)
 #elif STACK_GROW_DIRECTION > 0
-# define STACK_LENGTH  (STACK_END - rb_gc_stack_start + 1)
+# define STACK_LENGTH(start)  (STACK_END - (start) + 1)
 #else
-# define STACK_LENGTH  ((STACK_END < rb_gc_stack_start) ? rb_gc_stack_start - STACK_END\
-                                           : STACK_END - rb_gc_stack_start + 1)
+# define STACK_LENGTH(start)  ((STACK_END < (start)) ? (start) - STACK_END\
+                                           : STACK_END - (start) + 1)
 #endif
 #if STACK_GROW_DIRECTION > 0
 # define STACK_UPPER(x, a, b) a
@@ -534,27 +534,36 @@ stack_grow_direction(addr)
 
 #define GC_WATER_MARK 512
 
-#define CHECK_STACK(ret) do {\
+#define CHECK_STACK(ret, start) do {\
     SET_STACK_END;\
-    (ret) = (STACK_LENGTH > STACK_LEVEL_MAX + GC_WATER_MARK);\
+    (ret) = (STACK_LENGTH(start) > STACK_LEVEL_MAX + GC_WATER_MARK);\
 } while (0)
 
 size_t
 ruby_stack_length(p)
     VALUE **p;
 {
-    SET_STACK_END;
-    if (p) *p = STACK_UPPER(STACK_END, rb_gc_stack_start, STACK_END);
-    return STACK_LENGTH;
+  SET_STACK_END;
+  VALUE *start;
+  if (rb_curr_thread == rb_main_thread) {
+    start = rb_gc_stack_start;
+  } else {
+    start = rb_curr_thread->stk_base;
+  }
+  if (p) *p = STACK_UPPER(STACK_END, start, STACK_END);
+  return STACK_LENGTH(start);
 }
 
 int
 ruby_stack_check()
 {
-    int ret;
-
-    CHECK_STACK(ret);
-    return ret;
+  int ret;
+  if (rb_curr_thread == rb_main_thread) {
+    CHECK_STACK(ret, rb_gc_stack_start);
+  } else {
+    CHECK_STACK(ret, rb_curr_thread->stk_base);
+  }
+  return ret;
 }
 
 #define MARK_STACK_MAX 1024
@@ -1441,10 +1450,13 @@ garbage_collect()
 
     init_mark_stack();
 
-    gc_mark((VALUE)ruby_current_node, 0);
-
     /* mark frame stack */
-    for (frame = ruby_frame; frame; frame = frame->prev) {
+    if (rb_curr_thread == rb_main_thread)
+      frame = ruby_frame;
+    else
+      frame = rb_main_thread->frame;
+
+    for (; frame; frame = frame->prev) {
 	rb_gc_mark_frame(frame);
 	if (frame->tmp) {
 	    struct FRAME *tmp = frame->tmp;
@@ -1454,16 +1466,35 @@ garbage_collect()
 	    }
 	}
     }
-    gc_mark((VALUE)ruby_scope, 0);
-    gc_mark((VALUE)ruby_dyna_vars, 0);
+
+    if (rb_curr_thread == rb_main_thread) {
+      gc_mark((VALUE)ruby_current_node, 0);
+      gc_mark((VALUE)ruby_scope, 0);
+      gc_mark((VALUE)ruby_dyna_vars, 0);
+    } else {
+      gc_mark((VALUE)rb_main_thread->node, 0);
+      gc_mark((VALUE)rb_main_thread->scope, 0);
+      gc_mark((VALUE)rb_main_thread->dyna_vars, 0);
+
+      /* scan the current thread's stack */
+      rb_gc_mark_locations((VALUE*)STACK_END, rb_curr_thread->stk_base);
+    }
+
     if (finalizer_table) {
-	mark_tbl(finalizer_table, 0);
+      mark_tbl(finalizer_table, 0);
     }
 
     FLUSH_REGISTER_WINDOWS;
     /* This assumes that all registers are saved into the jmp_buf (and stack) */
     rb_setjmp(save_regs_gc_mark);
     mark_locations_array((VALUE*)save_regs_gc_mark, sizeof(save_regs_gc_mark) / sizeof(VALUE *));
+
+    /* If this is not the main thread, we need to scan the C stack, so
+     * set STACK_END to the end of the C stack.
+     */
+    if (rb_curr_thread != rb_main_thread)
+      STACK_END = rb_main_thread->stk_pos;
+
 #if STACK_GROW_DIRECTION < 0
     rb_gc_mark_locations((VALUE*)STACK_END, rb_gc_stack_start);
 #elif STACK_GROW_DIRECTION > 0
@@ -1483,6 +1514,7 @@ garbage_collect()
     rb_gc_mark_locations((VALUE*)((char*)STACK_END + 2),
 			 (VALUE*)((char*)rb_gc_stack_start + 2));
 #endif
+
     rb_gc_mark_threads();
 
     /* mark protected global variables */
diff --git a/lib/logger.rb b/lib/logger.rb
index 15d95fc..5a6d467 100644
--- a/lib/logger.rb
+++ b/lib/logger.rb
@@ -170,7 +170,7 @@ require 'monitor'
 
 class Logger
   VERSION = "1.2.6"
-  id, name, rev = %w$Id$
+  id, name, rev = %w$Id logger.rb 1234$
   ProgName = "#{name.chomp(",v")}/#{rev}"
 
   class Error < RuntimeError; end
diff --git a/node.h b/node.h
index c209fa5..740e66a 100644
--- a/node.h
+++ b/node.h
@@ -411,8 +411,11 @@ struct rb_thread {
 
     size_t stk_len;
     size_t stk_max;
+    size_t stk_size;
     VALUE *stk_ptr;
     VALUE *stk_pos;
+    VALUE *stk_base;
+    VALUE *guard;
 #ifdef __ia64
     size_t bstr_len;
     size_t bstr_max;
diff --git a/signal.c b/signal.c
index fb21fd3..acac6a7 100644
--- a/signal.c
+++ b/signal.c
@@ -14,6 +14,7 @@
 
 #include "ruby.h"
 #include "rubysig.h"
+#include "node.h"
 #include <signal.h>
 #include <stdio.h>
 
@@ -428,15 +429,22 @@ typedef RETSIGTYPE (*sighandler_t)_((int));
 static sighandler_t
 ruby_signal(signum, handler)
     int signum;
-    sighandler_t handler;
+    void *handler;
 {
     struct sigaction sigact, old;
 
     rb_trap_accept_nativethreads[signum] = 0;
 
-    sigact.sa_handler = handler;
+    if (signum == SIGSEGV || signum == SIGBUS) {
+      sigact.sa_sigaction = handler;
+      sigact.sa_flags = (SA_ONSTACK | SA_RESETHAND | SA_SIGINFO);
+    } else {
+      sigact.sa_handler = handler;
+      sigact.sa_flags = 0;
+    }
+
     sigemptyset(&sigact.sa_mask);
-    sigact.sa_flags = 0;
+
 # ifdef SA_NOCLDWAIT
     if (signum == SIGCHLD && handler == SIG_IGN)
 	sigact.sa_flags |= SA_NOCLDWAIT;
@@ -599,7 +607,132 @@ sighandler(sig)
     }
 }
 
+#include <stdio.h>
+#ifdef HAVE_STDARG_PROTOTYPES
+#include <stdarg.h>
+#define va_init_list(a,b) va_start(a,b)
+#else
+#include <varargs.h>
+#define va_init_list(a,b) va_start(a)
+#endif
+
+void
+#ifdef HAVE_STDARG_PROTOTYPES
+sig_printf(const char *fmt, ...)
+#else
+  sig_printf(fmt, va_alist)
+     const char *fmt;
+    va_dcl
+#endif
+{
+  char buf[BUFSIZ];
+  va_list args;
+  FILE *out = stderr;
+
+  va_init_list(args, fmt);
+  vfprintf(out, fmt, args);
+  va_end(args);
+  fprintf(out, "\n");
+}
+
+static void
+dump_machine_state(uc)
+     ucontext_t *uc;
+{
+  const char *dump64 =
+    " ----------------- Register state dump ----------------------\n"
+    "rax = 0x%.16x  rbx    = 0x%.16x  rcx = 0x%.16x  rdx = 0x%.16x\n"
+    "rdi = 0x%.16x  rsi    = 0x%.16x  rbp = 0x%.16x  rsp = 0x%.16x\n"
+    "r8  = 0x%.16x  r9     = 0x%.16x  r10 = 0x%.16x  r11 = 0x%.16x\n"
+    "r12 = 0x%.16x  r13    = 0x%.16x  r14 = 0x%.16x  r15 = 0x%.16x\n"
+    "rip = 0x%.16x  rflags = 0x%.16x  cs  = 0x%.16x  fs  = 0x%.16x\n"
+    "gs  = 0x%.16x";
+
+  const char *dump32 =
+    " ----------------- Register state dump -------------------\n"
+    "eax = 0x%.8x  ebx    = 0x%.8x  ecx = 0x%.8x  edx = 0x%.8x\n"
+    "edi = 0x%.8x  esi    = 0x%.8x  ebp = 0x%.8x  esp = 0x%.8x\n"
+    "ss  = 0x%.8x  eflags = 0x%.8x  eip = 0x%.8x  cs  = 0x%.8x\n"
+    "ds  = 0x%.8x  es     = 0x%.8x  fs  = 0x%.8x  gs  = 0x%.8x\n";
+
+#if defined(__LP64__) && defined(__APPLE__)
+  sig_printf(dump64, uc->uc_mcontext->__ss.__rax, uc->uc_mcontext->__ss.__rbx,
+	     uc->uc_mcontext->__ss.__rcx, uc->uc_mcontext->__ss.__rdx, uc->uc_mcontext->__ss.__rdi,
+	     uc->uc_mcontext->__ss.__rsi, uc->uc_mcontext->__ss.__rbp, uc->uc_mcontext->__ss.__rsp,
+	     uc->uc_mcontext->__ss.__r8, uc->uc_mcontext->__ss.__r9, uc->uc_mcontext->__ss.__r10,
+	     uc->uc_mcontext->__ss.__r11, uc->uc_mcontext->__ss.__r12, uc->uc_mcontext->__ss.__r13,
+	     uc->uc_mcontext->__ss.__r14, uc->uc_mcontext->__ss.__r15, uc->uc_mcontext->__ss.__rip,
+	     uc->uc_mcontext->__ss.__rflags, uc->uc_mcontext->__ss.__cs, uc->uc_mcontext->__ss.__fs,
+	     uc->uc_mcontext->__ss.__gs);
+#elif !defined(__LP64__) && defined(__APPLE__)
+  sig_printf(dump32, uc->uc_mcontext->__ss.__eax, uc->uc_mcontext->__ss.__ebx,
+	     uc->uc_mcontext->__ss.__ecx, uc->uc_mcontext->__ss.__edx,
+	     uc->uc_mcontext->__ss.__edi, uc->uc_mcontext->__ss.__esi,
+	     uc->uc_mcontext->__ss.__ebp, uc->uc_mcontext->__ss.__esp,
+	     uc->uc_mcontext->__ss.__ss, uc->uc_mcontext->__ss.__eflags,
+	     uc->uc_mcontext->__ss.__eip, uc->uc_mcontext->__ss.__cs,
+	     uc->uc_mcontext->__ss.__ds, uc->uc_mcontext->__ss.__es,
+	     uc->uc_mcontext->__ss.__fs, uc->uc_mcontext->__ss.__gs);
+#elif defined(__i386__)
+  sig_printf(dump32, uc->uc_mcontext.gregs[REG_EAX], uc->uc_mcontext.gregs[REG_EBX],
+	     uc->uc_mcontext.gregs[REG_ECX], uc->uc_mcontext.gregs[REG_EDX],
+	     uc->uc_mcontext.gregs[REG_EDI], uc->uc_mcontext.gregs[REG_ESI],
+	     uc->uc_mcontext.gregs[REG_EBP], uc->uc_mcontext.gregs[REG_ESP],
+	     uc->uc_mcontext.gregs[REG_SS], uc->uc_mcontext.gregs[REG_EFL],
+	     uc->uc_mcontext.gregs[REG_EIP], uc->uc_mcontext.gregs[REG_EIP],
+	     uc->uc_mcontext.gregs[REG_DS], uc->uc_mcontext.gregs[REG_ES],
+	     uc->uc_mcontext.gregs[REG_FS], uc->uc_mcontext.gregs[REG_FS]);
+#elif defined(__x86_64__)
+  sig_printf(dump64, uc->uc_mcontext.gregs[REG_RAX], uc->uc_mcontext.gregs[REG_RBX],
+	     uc->uc_mcontext.gregs[REG_RCX], uc->uc_mcontext.gregs[REG_RDX],
+	     uc->uc_mcontext.gregs[REG_RDI], uc->uc_mcontext.gregs[REG_RSI],
+	     uc->uc_mcontext.gregs[REG_RBP], uc->uc_mcontext.gregs[REG_RSP],
+	     uc->uc_mcontext.gregs[REG_R8], uc->uc_mcontext.gregs[REG_R9],
+	     uc->uc_mcontext.gregs[REG_R10], uc->uc_mcontext.gregs[REG_R11],
+	     uc->uc_mcontext.gregs[REG_R12], uc->uc_mcontext.gregs[REG_R13],
+	     uc->uc_mcontext.gregs[REG_R14], uc->uc_mcontext.gregs[REG_R15],
+	     uc->uc_mcontext.gregs[REG_RIP], uc->uc_mcontext.gregs[REG_EFL],
+	     uc->uc_mcontext.gregs[REG_CSGSFS]);
+#else
+#endif
+}
+
+static int
+check_guard(caddr_t fault_addr, rb_thread_t th) {
+  if(fault_addr <= (caddr_t)rb_curr_thread->guard &&
+     fault_addr >= (caddr_t)rb_curr_thread->stk_ptr) {
+    return 1;
+  }
+  return 0;
+}
+
 #ifdef SIGBUS
+#ifdef POSIX_SIGNAL
+static void sigbus _((int, siginfo_t*, void*));
+static void
+sigbus(sig, ip, context)
+     int sig;
+     siginfo_t *ip;
+     void *context;
+{
+#if defined(HAVE_NATIVETHREAD) && defined(HAVE_NATIVETHREAD_KILL)
+  if (!is_ruby_native_thread() && !rb_trap_accept_nativethreads[sig]) {
+    sigsend_to_ruby_thread(sig);
+    return;
+  }
+#endif
+
+  dump_machine_state(context);
+  if (check_guard((caddr_t)ip->si_addr, rb_curr_thread)) {
+    /* we hit the guard page, print out a warning to help app developers */
+    rb_bug("Thread stack overflow! Try increasing it!");
+  } else {
+    rb_bug("Bus Error");
+  }
+}
+
+#else /* !defined(POSIX_SIGNAL) */
+
 static RETSIGTYPE sigbus _((int));
 static RETSIGTYPE
 sigbus(sig)
@@ -615,8 +748,38 @@ sigbus(sig)
     rb_bug("Bus Error");
 }
 #endif
+#endif
+
 
 #ifdef SIGSEGV
+#ifdef POSIX_SIGNAL
+static void sigsegv _((int, siginfo_t*, void*));
+static void
+sigsegv(sig, ip, context)
+     int sig;
+     siginfo_t *ip;
+     void *context;
+{
+#if defined(HAVE_NATIVETHREAD) && defined(HAVE_NATIVETHREAD_KILL)
+  if (!is_ruby_native_thread() && !rb_trap_accept_nativethreads[sig]) {
+    sigsend_to_ruby_thread(sig);
+    return;
+  }
+#endif
+
+  extern int ruby_gc_stress;
+  ruby_gc_stress = 0;
+  dump_machine_state(context);
+  if (check_guard((caddr_t)ip->si_addr, rb_curr_thread)) {
+    /* we hit the guard page, print out a warning to help app developers */
+    rb_bug("Thread stack overflow! Try increasing it!");
+  } else {
+    rb_bug("Segmentation fault");
+  }
+}
+
+#else /* !defined(POSIX_SIGNAL) */
+
 static RETSIGTYPE sigsegv _((int));
 static RETSIGTYPE
 sigsegv(sig)
@@ -634,6 +797,7 @@ sigsegv(sig)
     rb_bug("Segmentation fault");
 }
 #endif
+#endif
 
 #ifdef SIGPIPE
 static RETSIGTYPE sigpipe _((int));
@@ -705,7 +869,8 @@ static VALUE
 trap(arg)
     struct trap_arg *arg;
 {
-    sighandler_t func, oldfunc;
+    sighandler_t oldfunc;
+    void *func;
     VALUE command, oldcmd;
     int sig = -1;
     const char *s;
@@ -952,6 +1117,20 @@ sig_list()
 }
 
 static void
+create_sigstack()
+{
+  stack_t ss;
+  ss.ss_size = SIGSTKSZ;
+  ss.ss_sp = malloc(ss.ss_size);
+  ss.ss_flags = 0;
+  if (sigaltstack(&ss, NULL) < 0) {
+    free(ss.ss_sp);
+    fprintf(stderr, "Couldn't create signal stack! Error %d: %s\n", errno, strerror(errno));
+    exit(1);
+  }
+}
+
+static void
 install_sighandler(signum, handler)
     int signum;
     sighandler_t handler;
@@ -960,7 +1139,7 @@ install_sighandler(signum, handler)
 
     old = ruby_signal(signum, handler);
     if (old != SIG_DFL) {
-	ruby_signal(signum, old);
+       ruby_signal(signum, old);
     }
 }
 
@@ -1089,6 +1268,8 @@ Init_signal()
     rb_alias(rb_eSignal, rb_intern("signm"), rb_intern("message"));
     rb_define_method(rb_eInterrupt, "initialize", interrupt_init, -1);
 
+    create_sigstack();
+
     install_sighandler(SIGINT, sighandler);
 #ifdef SIGHUP
     install_sighandler(SIGHUP, sighandler);
src/rvm/patches/ruby/1.8.7/railsbench.patch000066400000033771147511530530014376 0ustar00diff --git a/gc.c b/gc.c
index 52b1c23..f774022 100644
--- a/gc.c
+++ b/gc.c
@@ -22,8 +22,16 @@
 #include <setjmp.h>
 #include <sys/types.h>
 
+#ifdef _WIN32
+#include <string.h>
+#else
+#include <strings.h>
+#endif
+
 #ifdef HAVE_SYS_TIME_H
 #include <sys/time.h>
+#elif defined(_WIN32)
+#include <time.h> 
 #endif
 
 #ifdef HAVE_SYS_RESOURCE_H
@@ -42,7 +50,6 @@ void rb_io_fptr_finalize _((struct rb_io_t*));
 #ifdef __CYGWIN__
 int _setjmp(), _longjmp();
 #endif
-
 /* Make alloca work the best possible way.  */
 #ifdef __GNUC__
 # ifndef atarist
@@ -205,8 +212,17 @@ ruby_xfree(x)
 	RUBY_CRITICAL(free(x));
 }
 
+#if HAVE_LONG_LONG
+#define GC_TIME_TYPE LONG_LONG
+#else
+#define GC_TIME_TYPE long
+#endif
+
 extern int ruby_in_compile;
 static int dont_gc;
+static int gc_statistics = 0;
+static GC_TIME_TYPE gc_time = 0;
+static int gc_collections = 0;
 static int during_gc;
 static int need_call_final = 0;
 static st_table *finalizer_table = 0;
@@ -241,7 +257,7 @@ rb_gc_enable()
  *  Disables garbage collection, returning <code>true</code> if garbage
  *  collection was already disabled.
  *
- *     GC.disable   #=> false
+ *     GC.disable   #=> false or true
  *     GC.disable   #=> true
  *
  */
@@ -255,6 +271,104 @@ rb_gc_disable()
     return old;
 }
 
+/*
+ *  call-seq:
+ *     GC.enable_stats    => true or false
+ *
+ *  Enables garbage collection statistics, returning <code>true</code> if garbage
+ *  collection statistics was already enabled.
+ *
+ *     GC.enable_stats   #=> false or true
+ *     GC.enable_stats   #=> true
+ *
+ */
+
+VALUE
+rb_gc_enable_stats()
+{
+    int old = gc_statistics;
+    gc_statistics = Qtrue;
+    return old;
+}
+
+/*
+ *  call-seq:
+ *     GC.disable_stats    => true or false
+ *
+ *  Disables garbage collection statistics, returning <code>true</code> if garbage
+ *  collection statistics was already disabled.
+ *
+ *     GC.disable_stats   #=> false or true
+ *     GC.disable_stats   #=> true
+ *
+ */
+
+VALUE
+rb_gc_disable_stats()
+{
+    int old = gc_statistics;
+    gc_statistics = Qfalse;
+    return old;
+}
+
+/*
+ *  call-seq:
+ *     GC.clear_stats    => nil
+ *
+ *  Clears garbage collection statistics, returning nil. This resets the number
+ *  of collections (GC.collections) and the time used (GC.time) to 0.
+ *
+ *     GC.clear_stats    #=> nil
+ *
+ */
+
+VALUE
+rb_gc_clear_stats()
+{
+    gc_collections = 0;
+    gc_time = 0;
+    return Qnil; 
+}
+
+/*
+ *  call-seq:
+ *     GC.collections    => Integer
+ *
+ *  Returns the number of garbage collections performed while GC statistics collection
+ *  was enabled.
+ *
+ *     GC.collections    #=> 35
+ *
+ */
+
+VALUE
+rb_gc_collections()
+{
+    return INT2NUM(gc_collections);
+}
+
+/*
+ *  call-seq:
+ *     GC.time    => Integer
+ *
+ *  Returns the time spent during garbage collection while GC statistics collection
+ *  was enabled (in micro seconds).
+ *
+ *     GC.time    #=> 20000
+ *
+ */
+
+VALUE
+rb_gc_time()
+{
+#if HAVE_LONG_LONG
+    return LL2NUM(gc_time);
+#else
+    return LONG2NUM(gc_time);
+#endif
+}
+
+
 VALUE rb_mGC;
 
 static struct gc_list {
@@ -346,7 +460,7 @@ typedef struct RVALUE {
 static RVALUE *freelist = 0;
 static RVALUE *deferred_final_list = 0;
 
-#define HEAPS_INCREMENT 10
+static int heaps_increment = 10;
 static struct heaps_slot {
     void *membase;
     RVALUE *slot;
@@ -355,13 +469,165 @@ static struct heaps_slot {
 static int heaps_length = 0;
 static int heaps_used   = 0;
 
-#define HEAP_MIN_SLOTS 10000
-static int heap_slots = HEAP_MIN_SLOTS;
+static int heap_min_slots = 10000;
+static int heap_slots = 10000;
+
+static int heap_free_min = 4096;
+static int heap_slots_increment = 10000;
+static double heap_slots_growth_factor = 1.8;
+
+static long initial_malloc_limit = GC_MALLOC_LIMIT;
 
-#define FREE_MIN  4096
+static int verbose_gc_stats = Qfalse;
+
+static FILE* gc_data_file = NULL;
 
 static RVALUE *himem, *lomem;
 
+static void set_gc_parameters()
+{
+    char *gc_stats_ptr, *min_slots_ptr, *free_min_ptr, *heap_slots_incr_ptr,
+      *heap_incr_ptr, *malloc_limit_ptr, *gc_heap_file_ptr, *heap_slots_growth_factor_ptr;
+
+    gc_data_file = stderr;
+
+    gc_stats_ptr = getenv("RUBY_GC_STATS");
+    if (gc_stats_ptr != NULL) {
+	int gc_stats_i = atoi(gc_stats_ptr);
+	if (gc_stats_i > 0) {
+	    verbose_gc_stats = Qtrue;
+	}
+    }
+
+    gc_heap_file_ptr = getenv("RUBY_GC_DATA_FILE");
+    if (gc_heap_file_ptr != NULL) {
+	FILE* data_file = fopen(gc_heap_file_ptr, "w");
+	if (data_file != NULL) {
+	    gc_data_file = data_file;
+	}
+	else {
+	    fprintf(stderr,
+		    "can't open gc log file %s for writing, using default\n", gc_heap_file_ptr);
+	}
+    }
+
+    min_slots_ptr = getenv("RUBY_HEAP_MIN_SLOTS");
+    if (min_slots_ptr != NULL) {
+	int min_slots_i = atoi(min_slots_ptr);
+        if (verbose_gc_stats) {
+	    fprintf(gc_data_file, "RUBY_HEAP_MIN_SLOTS=%s\n", min_slots_ptr);
+        }
+	if (min_slots_i > 0) {
+	    heap_slots = min_slots_i;
+	    heap_min_slots = min_slots_i;
+	}
+    }
+
+    free_min_ptr = getenv("RUBY_HEAP_FREE_MIN");
+    if (free_min_ptr != NULL) {
+	int free_min_i = atoi(free_min_ptr);
+        if (verbose_gc_stats) {
+	    fprintf(gc_data_file, "RUBY_HEAP_FREE_MIN=%s\n", free_min_ptr);
+	}
+	if (free_min_i > 0) {
+	    heap_free_min = free_min_i;
+	}
+    }
+
+    heap_incr_ptr = getenv("RUBY_HEAP_INCREMENT");
+    if (heap_incr_ptr != NULL) {
+	int heap_incr_i = atoi(heap_incr_ptr);
+        if (verbose_gc_stats) {
+	    fprintf(gc_data_file, "RUBY_HEAP_INCREMENT=%s\n", heap_incr_ptr);
+	}
+	if (heap_incr_i > 0) {
+	    heaps_increment = heap_incr_i;
+	}
+    }
+
+    heap_slots_incr_ptr = getenv("RUBY_HEAP_SLOTS_INCREMENT");
+    if (heap_slots_incr_ptr != NULL) {
+	int heap_slots_incr_i = atoi(heap_slots_incr_ptr);
+        if (verbose_gc_stats) {
+	    fprintf(gc_data_file, "RUBY_HEAP_SLOTS_INCREMENT=%s\n", heap_slots_incr_ptr);
+	}
+	if (heap_slots_incr_i > 0) {
+	    heap_slots_increment = heap_slots_incr_i;
+	}
+    }
+
+    heap_slots_growth_factor_ptr = getenv("RUBY_HEAP_SLOTS_GROWTH_FACTOR");
+    if (heap_slots_growth_factor_ptr != NULL) {
+	double heap_slots_growth_factor_d = atoi(heap_slots_growth_factor_ptr);
+        if (verbose_gc_stats) {
+	    fprintf(gc_data_file, "RUBY_HEAP_SLOTS_GROWTH_FACTOR=%s\n", heap_slots_growth_factor_ptr);
+	}
+	if (heap_slots_growth_factor_d > 0) {
+	    heap_slots_growth_factor = heap_slots_growth_factor_d;
+	}
+    }
+
+    malloc_limit_ptr = getenv("RUBY_GC_MALLOC_LIMIT");
+    if (malloc_limit_ptr != NULL) {
+	int malloc_limit_i = atol(malloc_limit_ptr);
+        if (verbose_gc_stats) {
+	    fprintf(gc_data_file, "RUBY_GC_MALLOC_LIMIT=%s\n", malloc_limit_ptr);
+	}
+	if (malloc_limit_i > 0) {
+	    initial_malloc_limit = malloc_limit_i;
+	}
+    }
+}
+
+/*
+ *  call-seq:
+ *     GC.dump    => nil
+ *
+ *  dumps information about the current GC data structures to the GC log file
+ *
+ *     GC.dump    #=> nil
+ *
+ */
+
+VALUE
+rb_gc_dump()
+{
+    int i;
+
+    for (i = 0; i < heaps_used; i++) {
+	int heap_size = heaps[i].limit;
+	fprintf(gc_data_file, "HEAP[%2d]: size=%7d\n", i, heap_size);
+    }
+
+    return Qnil;
+}
+
+/*
+ *  call-seq:
+ *     GC.log String  => String
+ *
+ *  Logs string to the GC data file and returns it.
+ *
+ *     GC.log "manual GC call"    #=> "manual GC call"
+ *
+ */
+
+VALUE
+rb_gc_log(self, original_str)
+     VALUE self, original_str;
+{
+    if (original_str == Qnil) {
+        fprintf(gc_data_file, "\n");
+    }
+    else {
+        VALUE str = StringValue(original_str);
+        char *p = RSTRING(str)->ptr;
+        fprintf(gc_data_file, "%s\n", p);
+    }
+    return original_str;
+}
+
+
 static void
 add_heap()
 {
@@ -372,7 +638,7 @@ add_heap()
 	struct heaps_slot *p;
 	int length;
 
-	heaps_length += HEAPS_INCREMENT;
+	heaps_length += heaps_increment;
 	length = heaps_length*sizeof(struct heaps_slot);
 	RUBY_CRITICAL(
 	    if (heaps_used > 0) {
@@ -388,10 +654,10 @@ add_heap()
     for (;;) {
 	RUBY_CRITICAL(p = (RVALUE*)malloc(sizeof(RVALUE)*(heap_slots+1)));
 	if (p == 0) {
-	    if (heap_slots == HEAP_MIN_SLOTS) {
+	    if (heap_slots == heap_min_slots) {
 		rb_memerror();
 	    }
-	    heap_slots = HEAP_MIN_SLOTS;
+	    heap_slots = heap_min_slots;
 	    continue;
 	}
         heaps[heaps_used].membase = p;
@@ -407,8 +673,9 @@ add_heap()
     if (lomem == 0 || lomem > p) lomem = p;
     if (himem < pend) himem = pend;
     heaps_used++;
-    heap_slots *= 1.8;
-    if (heap_slots <= 0) heap_slots = HEAP_MIN_SLOTS;
+    heap_slots += heap_slots_increment;
+    heap_slots_increment *= heap_slots_growth_factor;
+    if (heap_slots <= 0) heap_slots = heap_min_slots;
 
     while (p < pend) {
 	p->as.free.flags = 0;
@@ -1102,6 +1369,39 @@ finalize_list(p)
     }
 }
 
+static char* obj_type(int tp)
+{
+    switch (tp) {
+	case T_NIL    : return "NIL";   
+	case T_OBJECT : return "OBJECT";
+	case T_CLASS  : return "CLASS";
+	case T_ICLASS : return "ICLASS";
+	case T_MODULE : return "MODULE";
+	case T_FLOAT  : return "FLOAT";
+	case T_STRING : return "STRING";
+	case T_REGEXP : return "REGEXP";
+	case T_ARRAY  : return "ARRAY";
+	case T_FIXNUM : return "FIXNUM";
+	case T_HASH   : return "HASH";
+	case T_STRUCT : return "STRUCT";
+	case T_BIGNUM : return "BIGNUM";
+	case T_FILE   : return "FILE";
+	    
+	case T_TRUE   : return "TRUE";
+	case T_FALSE  : return "FALSE";
+	case T_DATA   : return "DATA";
+	case T_MATCH  : return "MATCH";
+	case T_SYMBOL : return "SYMBOL";
+	    
+	case T_BLKTAG : return "BLKTAG";
+	case T_UNDEF  : return "UNDEF";
+	case T_VARMAP : return "VARMAP";
+	case T_SCOPE  : return "SCOPE";
+	case T_NODE   : return "NODE";
+	default: return "____";
+    }
+}
+
 static void
 free_unused_heaps()
 {
@@ -1134,12 +1434,21 @@ gc_sweep()
     unsigned long live = 0;
     unsigned long free_min = 0;
 
+    unsigned long really_freed = 0;
+    int free_counts[256];
+    int live_counts[256];
+    int do_gc_stats = gc_statistics & verbose_gc_stats;
+
     for (i = 0; i < heaps_used; i++) {
         free_min += heaps[i].limit;
     }
     free_min = free_min * 0.2;
-    if (free_min < FREE_MIN)
-        free_min = FREE_MIN;
+    if (free_min < heap_free_min)
+        free_min = heap_free_min;
+
+    if (do_gc_stats) {
+	for (i = 0 ; i< 256; i++) { free_counts[i] = live_counts[i] = 0; }
+    }
 
     if (ruby_in_compile && ruby_parser_stack_on_heap()) {
 	/* should not reclaim nodes during compilation
@@ -1174,6 +1483,9 @@ gc_sweep()
 		if (p->as.basic.flags &&
 		    ((deferred = obj_free((VALUE)p)) ||
 		     ((FL_TEST(p, FL_FINALIZE)) && need_call_final))) {
+		    if (do_gc_stats) {
+			really_freed++;
+		    }
 		    if (!deferred) {
 			p->as.free.flags = T_DEFERRED;
 			RDATA(p)->dfree = 0;
@@ -1183,6 +1495,12 @@ gc_sweep()
 		    final_list = p;
 		}
 		else {
+		    if (do_gc_stats) {
+		        int obt = p->as.basic.flags & T_MASK;
+		        if (obt) {
+		            free_counts[obt]++;
+		        }
+		    }
 		    add_freelist(p);
 		}
 		n++;
@@ -1194,6 +1512,9 @@ gc_sweep()
 	    else {
 		RBASIC(p)->flags &= ~FL_MARK;
 		live++;
+		if (do_gc_stats) {
+ 		    live_counts[RANY((VALUE)p)->as.basic.flags & T_MASK]++;
+ 		}
 	    }
 	    p++;
 	}
@@ -1212,7 +1533,7 @@ gc_sweep()
     }
     if (malloc_increase > malloc_limit) {
 	malloc_limit += (malloc_increase - malloc_limit) * (double)live / (live + freed);
-	if (malloc_limit < GC_MALLOC_LIMIT) malloc_limit = GC_MALLOC_LIMIT;
+	if (malloc_limit < initial_malloc_limit) malloc_limit = initial_malloc_limit;
     }
     malloc_increase = 0;
     if (freed < free_min) {
@@ -1220,6 +1541,20 @@ gc_sweep()
     }
     during_gc = 0;
 
+    if (do_gc_stats) {
+	fprintf(gc_data_file, "objects processed: %.7d\n", live+freed);
+	fprintf(gc_data_file, "live objects	: %.7d\n", live);
+	fprintf(gc_data_file, "freelist objects : %.7d\n", freed - really_freed);
+	fprintf(gc_data_file, "freed objects	: %.7d\n", really_freed);
+	for(i=0; i<256; i++) {
+	    if (free_counts[i]>0) {
+		fprintf(gc_data_file,
+			"kept %.7d / freed %.7d objects of type %s\n",
+			live_counts[i], free_counts[i], obj_type(i));
+	    }
+	}
+    }
+
     /* clear finalization list */
     if (final_list) {
 	deferred_final_list = final_list;
@@ -1423,6 +1758,7 @@ garbage_collect()
     struct gc_list *list;
     struct FRAME * volatile frame; /* gcc 2.7.2.3 -O2 bug??  */
     jmp_buf save_regs_gc_mark;
+    struct timeval gctv1, gctv2;
     SET_STACK_END;
 
 #ifdef HAVE_NATIVETHREAD
@@ -1439,6 +1775,14 @@ garbage_collect()
     if (during_gc) return;
     during_gc++;
 
+    if (gc_statistics) {
+        gc_collections++;
+	gettimeofday(&gctv1, NULL);
+        if (verbose_gc_stats) {
+	    fprintf(gc_data_file, "Garbage collection started\n");
+	}
+    }
+
     init_mark_stack();
 
     gc_mark((VALUE)ruby_current_node, 0);
@@ -1514,6 +1858,17 @@ garbage_collect()
     } while (!MARK_STACK_EMPTY);
 
     gc_sweep();
+
+    if (gc_statistics) {
+        GC_TIME_TYPE musecs_used;
+	gettimeofday(&gctv2, NULL);
+	musecs_used = ((GC_TIME_TYPE)(gctv2.tv_sec - gctv1.tv_sec) * 1000000) + (gctv2.tv_usec - gctv1.tv_usec);
+	gc_time += musecs_used;
+
+	if (verbose_gc_stats) {
+	    fprintf(gc_data_file, "GC time: %d msec\n", musecs_used / 1000);
+	}
+    }
 }
 
 void
@@ -1695,6 +2050,7 @@ Init_heap()
     if (!rb_gc_stack_start) {
 	Init_stack(0);
     }
+    set_gc_parameters();
     add_heap();
 }
 
@@ -2163,6 +2519,14 @@ Init_GC()
     rb_define_singleton_method(rb_mGC, "stress=", gc_stress_set, 1);
     rb_define_method(rb_mGC, "garbage_collect", rb_gc_start, 0);
 
+    rb_define_singleton_method(rb_mGC, "enable_stats", rb_gc_enable_stats, 0);
+    rb_define_singleton_method(rb_mGC, "disable_stats", rb_gc_disable_stats, 0);
+    rb_define_singleton_method(rb_mGC, "clear_stats", rb_gc_clear_stats, 0);
+    rb_define_singleton_method(rb_mGC, "collections", rb_gc_collections, 0);
+    rb_define_singleton_method(rb_mGC, "time", rb_gc_time, 0);
+    rb_define_singleton_method(rb_mGC, "dump", rb_gc_dump, 0);
+    rb_define_singleton_method(rb_mGC, "log", rb_gc_log, 1);
+
     rb_mObSpace = rb_define_module("ObjectSpace");
     rb_define_module_function(rb_mObSpace, "each_object", os_each_obj, -1);
     rb_define_module_function(rb_mObSpace, "garbage_collect", rb_gc_start, 0);
src/rvm/patches/ruby/1.8.7/stdout-rouge-fix.patch000066400000001317147511530530015500 0ustar00diff --git a/lib/mkmf.rb b/lib/mkmf.rb
index c9e738a..7a8004d 100644
--- a/lib/mkmf.rb
+++ b/lib/mkmf.rb
@@ -201,20 +201,26 @@ end
 module Logging
   @log = nil
   @logfile = 'mkmf.log'
-  @orgerr = $stderr.dup
-  @orgout = $stdout.dup
   @postpone = 0
   @quiet = $extmk
 
   def self::open
     @log ||= File::open(@logfile, 'w')
     @log.sync = true
+    orgerr = $stderr.dup
+    orgout = $stdout.dup
     $stderr.reopen(@log)
     $stdout.reopen(@log)
     yield
   ensure
-    $stderr.reopen(@orgerr)
-    $stdout.reopen(@orgout)
+    if orgerr
+      $stderr.reopen(orgerr)
+      orgerr.close
+    end
+    if orgout
+      $stdout.reopen(orgout)
+      orgout.close
+    end
   end
 
   def self::message(*s)
src/rvm/patches/ruby/1.8.7/zlib-gc-fix.diff000066400000000477147511530530014205 0ustar00diff --git a/ext/zlib/zlib.c b/ext/zlib/zlib.c
index b87e691..5f701ab 100644
--- a/ext/zlib/zlib.c
+++ b/ext/zlib/zlib.c
@@ -610,6 +610,7 @@ zstream_append_input(z, src, len)
 }
 
 #define zstream_append_input2(z,v)\
+    RB_GC_GUARD(v),\
     zstream_append_input((z), RSTRING(v)->ptr, RSTRING(v)->len)
 
 static void
src/rvm/patches/ruby/remove_digest_so.patch000066400000000245147511530530015134 0ustar00--- trunk/ext/digest/lib/digest.rb
+++ trunk/ext/digest/lib/digest.rb
@@ -1,4 +1,3 @@
-require 'digest.so'

 module Digest
   def self.const_missing(name) # :nodoc:
src/rvm/patches/ruby/2.1.6/openssl3.patch000066400000003333147511530530014012 0ustar00diff --git a/ext/openssl/extconf.rb b/ext/openssl/extconf.rb
index 8c04cb5..132d803 100644
--- a/ext/openssl/extconf.rb
+++ b/ext/openssl/extconf.rb
@@ -104,6 +104,9 @@
 have_func("SSLv2_method")
 have_func("SSLv2_server_method")
 have_func("SSLv2_client_method")
+have_func("SSLv3_method")
+have_func("SSLv3_server_method")
+have_func("SSLv3_client_method")
 have_func("TLSv1_1_method")
 have_func("TLSv1_1_server_method")
 have_func("TLSv1_1_client_method")
diff --git a/ext/openssl/ossl_ssl.c b/ext/openssl/ossl_ssl.c
index f7cb7f0..47111f6 100644
--- a/ext/openssl/ossl_ssl.c
+++ b/ext/openssl/ossl_ssl.c
@@ -109,9 +109,12 @@ static const struct {
     OSSL_SSL_METHOD_ENTRY(SSLv2_server),
     OSSL_SSL_METHOD_ENTRY(SSLv2_client),
 #endif
+#if defined(HAVE_SSLV3_METHOD) && defined(HAVE_SSLV3_SERVER_METHOD) && \
+        defined(HAVE_SSLV3_CLIENT_METHOD)
     OSSL_SSL_METHOD_ENTRY(SSLv3),
     OSSL_SSL_METHOD_ENTRY(SSLv3_server),
     OSSL_SSL_METHOD_ENTRY(SSLv3_client),
+#endif
     OSSL_SSL_METHOD_ENTRY(SSLv23),
     OSSL_SSL_METHOD_ENTRY(SSLv23_server),
     OSSL_SSL_METHOD_ENTRY(SSLv23_client),
diff --git a/test/openssl/test_ssl.rb b/test/openssl/test_ssl.rb
index 07e081b..0cbfcba 100644
--- a/test/openssl/test_ssl.rb
+++ b/test/openssl/test_ssl.rb
@@ -912,7 +912,7 @@ def test_unset_OP_ALL
   # that has been marked as forbidden, therefore either of these may be raised
   HANDSHAKE_ERRORS = [OpenSSL::SSL::SSLError, Errno::ECONNRESET]

-if OpenSSL::SSL::SSLContext::METHODS.include? :TLSv1
+if OpenSSL::SSL::SSLContext::METHODS.include?(:TLSv1) && OpenSSL::SSL::SSLContext::METHODS.include?(:SSLv3)

   def test_forbid_ssl_v3_for_client
     ctx_proc = Proc.new { |ctx| ctx.options = OpenSSL::SSL::OP_ALL | OpenSSL::SSL::OP_NO_SSLv3 }
src/rvm/patches/ruby/2.2.5/fix_installing_bundled_gems.patch000066400000002214147511530530017763 0ustar00--- a/tool/rbinstall.rb
+++ b/tool/rbinstall.rb
@@ -719,15 +719,15 @@ install?(:ext, :comm, :gem) do
     directories = Gem.ensure_gem_subdirectories(gem_dir, :mode => $dir_mode)
     prepare "bundle gems", gem_dir, directories
     Dir.glob(srcdir+'/gems/*.gem').each do |gem|
-      Gem.install gem, Gem::Requirement.default, :install_dir => with_destdir(Gem.dir), :domain => :local, :ignore_dependencies => true
+      Gem.install gem, Gem::Requirement.default, :install_dir => with_destdir(gem_dir), :domain => :local, :ignore_dependencies => true
       gemname = Pathname(gem).basename
       puts "#{" "*30}#{gemname}"
     end
     # fix directory permissions
     # TODO: Gem.install should accept :dir_mode option or something
-    File.chmod($dir_mode, *Dir.glob(with_destdir(Gem.dir)+"/**/"))
+    File.chmod($dir_mode, *Dir.glob(with_destdir(gem_dir)+"/**/"))
     # fix .gemspec permissions
-    File.chmod($data_mode, *Dir.glob(with_destdir(Gem.dir)+"/specifications/*.gemspec"))
+    File.chmod($data_mode, *Dir.glob(with_destdir(gem_dir)+"/specifications/*.gemspec"))
   else
     puts "skip installing bundle gems because of lacking zlib"
   end
src/rvm/patches/ruby/2.2.5/openssl3.patch000066400000002126147511530530014011 0ustar00diff --git a/ext/openssl/extconf.rb b/ext/openssl/extconf.rb
index 8c04cb5..132d803 100644
--- a/ext/openssl/extconf.rb
+++ b/ext/openssl/extconf.rb
@@ -104,6 +104,9 @@
 have_func("SSLv2_method")
 have_func("SSLv2_server_method")
 have_func("SSLv2_client_method")
+have_func("SSLv3_method")
+have_func("SSLv3_server_method")
+have_func("SSLv3_client_method")
 have_func("TLSv1_1_method")
 have_func("TLSv1_1_server_method")
 have_func("TLSv1_1_client_method")
diff --git a/ext/openssl/ossl_ssl.c b/ext/openssl/ossl_ssl.c
index f7cb7f0..47111f6 100644
--- a/ext/openssl/ossl_ssl.c
+++ b/ext/openssl/ossl_ssl.c
@@ -109,9 +109,12 @@ static const struct {
     OSSL_SSL_METHOD_ENTRY(SSLv2_server),
     OSSL_SSL_METHOD_ENTRY(SSLv2_client),
 #endif
+#if defined(HAVE_SSLV3_METHOD) && defined(HAVE_SSLV3_SERVER_METHOD) && \
+        defined(HAVE_SSLV3_CLIENT_METHOD)
     OSSL_SSL_METHOD_ENTRY(SSLv3),
     OSSL_SSL_METHOD_ENTRY(SSLv3_server),
     OSSL_SSL_METHOD_ENTRY(SSLv3_client),
+#endif
     OSSL_SSL_METHOD_ENTRY(SSLv23),
     OSSL_SSL_METHOD_ENTRY(SSLv23_server),
     OSSL_SSL_METHOD_ENTRY(SSLv23_client),
src/rvm/patches/ruby/2.3.2/random_c_using_NR_prefix.patch000066400000001011147511530530017174 0ustar00--- a/random.c
+++ b/random.c
@@ -521,7 +521,7 @@
     CryptGenRandom(prov, size, seed);
     return 0;
 }
-#elif defined __linux__ && defined SYS_getrandom
+#elif defined __linux__ && defined __NR_getrandom
 #include <linux/random.h>

 # ifndef GRND_NONBLOCK
@@ -538,7 +538,7 @@
 	if (!need_secure)
 	    flags = GRND_NONBLOCK;
 	errno = 0;
-	ret = syscall(SYS_getrandom, seed, size, flags);
+	ret = syscall(__NR_getrandom, seed, size, flags);
 	if (errno == ENOSYS) {
 	    ATOMIC_SET(try_syscall, 0);
 	    return -1;
src/rvm/patches/ruby/GH-433.patch000066400000000403147511530530012400 0ustar00diff --git a/file.c b/file.c
index 3b0cd67..56f2b50 100644
--- a/file.c
+++ b/file.c
@@ -4301,7 +4301,6 @@ struct utimbuf {
 
 #ifdef __CYGWIN__
 #include <winerror.h>
-extern unsigned long __attribute__((stdcall)) GetLastError(void);
 #endif
 
 static VALUE
src/rvm/patches/ruby/2.2/openssl3.patch000066400000003333147511530530013647 0ustar00diff --git a/ext/openssl/extconf.rb b/ext/openssl/extconf.rb
index 8c04cb5..132d803 100644
--- a/ext/openssl/extconf.rb
+++ b/ext/openssl/extconf.rb
@@ -104,6 +104,9 @@
 have_func("SSLv2_method")
 have_func("SSLv2_server_method")
 have_func("SSLv2_client_method")
+have_func("SSLv3_method")
+have_func("SSLv3_server_method")
+have_func("SSLv3_client_method")
 have_func("TLSv1_1_method")
 have_func("TLSv1_1_server_method")
 have_func("TLSv1_1_client_method")
diff --git a/ext/openssl/ossl_ssl.c b/ext/openssl/ossl_ssl.c
index f7cb7f0..47111f6 100644
--- a/ext/openssl/ossl_ssl.c
+++ b/ext/openssl/ossl_ssl.c
@@ -109,9 +109,12 @@ static const struct {
     OSSL_SSL_METHOD_ENTRY(SSLv2_server),
     OSSL_SSL_METHOD_ENTRY(SSLv2_client),
 #endif
+#if defined(HAVE_SSLV3_METHOD) && defined(HAVE_SSLV3_SERVER_METHOD) && \
+        defined(HAVE_SSLV3_CLIENT_METHOD)
     OSSL_SSL_METHOD_ENTRY(SSLv3),
     OSSL_SSL_METHOD_ENTRY(SSLv3_server),
     OSSL_SSL_METHOD_ENTRY(SSLv3_client),
+#endif
     OSSL_SSL_METHOD_ENTRY(SSLv23),
     OSSL_SSL_METHOD_ENTRY(SSLv23_server),
     OSSL_SSL_METHOD_ENTRY(SSLv23_client),
diff --git a/test/openssl/test_ssl.rb b/test/openssl/test_ssl.rb
index 07e081b..0cbfcba 100644
--- a/test/openssl/test_ssl.rb
+++ b/test/openssl/test_ssl.rb
@@ -912,7 +912,7 @@ def test_unset_OP_ALL
   # that has been marked as forbidden, therefore either of these may be raised
   HANDSHAKE_ERRORS = [OpenSSL::SSL::SSLError, Errno::ECONNRESET]

-if OpenSSL::SSL::SSLContext::METHODS.include? :TLSv1
+if OpenSSL::SSL::SSLContext::METHODS.include?(:TLSv1) && OpenSSL::SSL::SSLContext::METHODS.include?(:SSLv3)

   def test_forbid_ssl_v3_for_client
     ctx_proc = Proc.new { |ctx| ctx.options = OpenSSL::SSL::OP_ALL | OpenSSL::SSL::OP_NO_SSLv3 }
src/rvm/patches/ruby/2.2.10/fix_installing_bundled_gems.patch000066400000002214147511530530020037 0ustar00--- a/tool/rbinstall.rb
+++ b/tool/rbinstall.rb
@@ -719,15 +719,15 @@ install?(:ext, :comm, :gem) do
     directories = Gem.ensure_gem_subdirectories(gem_dir, :mode => $dir_mode)
     prepare "bundle gems", gem_dir, directories
     Dir.glob(srcdir+'/gems/*.gem').each do |gem|
-      Gem.install gem, Gem::Requirement.default, :install_dir => with_destdir(Gem.dir), :domain => :local, :ignore_dependencies => true
+      Gem.install gem, Gem::Requirement.default, :install_dir => with_destdir(gem_dir), :domain => :local, :ignore_dependencies => true
       gemname = Pathname(gem).basename
       puts "#{" "*30}#{gemname}"
     end
     # fix directory permissions
     # TODO: Gem.install should accept :dir_mode option or something
-    File.chmod($dir_mode, *Dir.glob(with_destdir(Gem.dir)+"/**/"))
+    File.chmod($dir_mode, *Dir.glob(with_destdir(gem_dir)+"/**/"))
     # fix .gemspec permissions
-    File.chmod($data_mode, *Dir.glob(with_destdir(Gem.dir)+"/specifications/*.gemspec"))
+    File.chmod($data_mode, *Dir.glob(with_destdir(gem_dir)+"/specifications/*.gemspec"))
   else
     puts "skip installing bundle gems because of lacking zlib"
   end
src/rvm/patches/ruby/2.5.0/prelude_gcc_diagnostic.patch000066400000001331147511530530016716 0ustar00diff --git a/template/prelude.c.tmpl b/template/prelude.c.tmpl
index 11ec71f575..3cf74eda12 100644
--- a/template/prelude.c.tmpl
+++ b/template/prelude.c.tmpl
@@ -139,7 +139,7 @@ prelude_prefix_path(VALUE self)

 % unless preludes.empty?
 #define PRELUDE_STR(n) rb_usascii_str_new_static(prelude_##n.L0, sizeof(prelude_##n))
-#ifdef __GNUC__
+#if defined __GNUC__ && __GNUC__ >= 5
 # pragma GCC diagnostic push
 # pragma GCC diagnostic error "-Wmissing-field-initializers"
 #endif
@@ -169,7 +169,7 @@ prelude_eval(VALUE code, VALUE name, int line)
              NULL, ISEQ_TYPE_TOP, &optimization));
     rb_ast_dispose(ast);
 }
-#ifdef __GNUC__
+#if defined __GNUC__ && __GNUC__ >= 5
 # pragma GCC diagnostic pop
 #endif
 % end
src/rvm/patches/ruby/2.5.0/libressl_2_7.patch000066400000001067147511530530014532 0ustar00--- a/ext/openssl/extconf.rb
+++ b/ext/openssl/extconf.rb
@@ -122,8 +122,11 @@
 have_func("SSL_is_server")

 # added in 1.1.0
+if !have_struct_member("SSL", "ctx", "openssl/ssl.h") ||
+    try_static_assert("LIBRESSL_VERSION_NUMBER >= 0x2070000fL", "openssl/opensslv.h")
+  $defs.push("-DHAVE_OPAQUE_OPENSSL")
+end
 have_func("CRYPTO_lock") || $defs.push("-DHAVE_OPENSSL_110_THREADING_API")
-have_struct_member("SSL", "ctx", "openssl/ssl.h") || $defs.push("-DHAVE_OPAQUE_OPENSSL")
 have_func("BN_GENCB_new")
 have_func("BN_GENCB_free")
 have_func("BN_GENCB_get_arg")
src/rvm/patches/ruby/2.1.2/openssl3.patch000066400000003333147511530530014006 0ustar00diff --git a/ext/openssl/extconf.rb b/ext/openssl/extconf.rb
index 8c04cb5..132d803 100644
--- a/ext/openssl/extconf.rb
+++ b/ext/openssl/extconf.rb
@@ -104,6 +104,9 @@
 have_func("SSLv2_method")
 have_func("SSLv2_server_method")
 have_func("SSLv2_client_method")
+have_func("SSLv3_method")
+have_func("SSLv3_server_method")
+have_func("SSLv3_client_method")
 have_func("TLSv1_1_method")
 have_func("TLSv1_1_server_method")
 have_func("TLSv1_1_client_method")
diff --git a/ext/openssl/ossl_ssl.c b/ext/openssl/ossl_ssl.c
index f7cb7f0..47111f6 100644
--- a/ext/openssl/ossl_ssl.c
+++ b/ext/openssl/ossl_ssl.c
@@ -109,9 +109,12 @@ static const struct {
     OSSL_SSL_METHOD_ENTRY(SSLv2_server),
     OSSL_SSL_METHOD_ENTRY(SSLv2_client),
 #endif
+#if defined(HAVE_SSLV3_METHOD) && defined(HAVE_SSLV3_SERVER_METHOD) && \
+        defined(HAVE_SSLV3_CLIENT_METHOD)
     OSSL_SSL_METHOD_ENTRY(SSLv3),
     OSSL_SSL_METHOD_ENTRY(SSLv3_server),
     OSSL_SSL_METHOD_ENTRY(SSLv3_client),
+#endif
     OSSL_SSL_METHOD_ENTRY(SSLv23),
     OSSL_SSL_METHOD_ENTRY(SSLv23_server),
     OSSL_SSL_METHOD_ENTRY(SSLv23_client),
diff --git a/test/openssl/test_ssl.rb b/test/openssl/test_ssl.rb
index 07e081b..0cbfcba 100644
--- a/test/openssl/test_ssl.rb
+++ b/test/openssl/test_ssl.rb
@@ -912,7 +912,7 @@ def test_unset_OP_ALL
   # that has been marked as forbidden, therefore either of these may be raised
   HANDSHAKE_ERRORS = [OpenSSL::SSL::SSLError, Errno::ECONNRESET]

-if OpenSSL::SSL::SSLContext::METHODS.include? :TLSv1
+if OpenSSL::SSL::SSLContext::METHODS.include?(:TLSv1) && OpenSSL::SSL::SSLContext::METHODS.include?(:SSLv3)

   def test_forbid_ssl_v3_for_client
     ctx_proc = Proc.new { |ctx| ctx.options = OpenSSL::SSL::OP_ALL | OpenSSL::SSL::OP_NO_SSLv3 }
src/rvm/patches/ruby/2.1.8/openssl3.patch000066400000003333147511530530014014 0ustar00diff --git a/ext/openssl/extconf.rb b/ext/openssl/extconf.rb
index 8c04cb5..132d803 100644
--- a/ext/openssl/extconf.rb
+++ b/ext/openssl/extconf.rb
@@ -104,6 +104,9 @@
 have_func("SSLv2_method")
 have_func("SSLv2_server_method")
 have_func("SSLv2_client_method")
+have_func("SSLv3_method")
+have_func("SSLv3_server_method")
+have_func("SSLv3_client_method")
 have_func("TLSv1_1_method")
 have_func("TLSv1_1_server_method")
 have_func("TLSv1_1_client_method")
diff --git a/ext/openssl/ossl_ssl.c b/ext/openssl/ossl_ssl.c
index f7cb7f0..47111f6 100644
--- a/ext/openssl/ossl_ssl.c
+++ b/ext/openssl/ossl_ssl.c
@@ -109,9 +109,12 @@ static const struct {
     OSSL_SSL_METHOD_ENTRY(SSLv2_server),
     OSSL_SSL_METHOD_ENTRY(SSLv2_client),
 #endif
+#if defined(HAVE_SSLV3_METHOD) && defined(HAVE_SSLV3_SERVER_METHOD) && \
+        defined(HAVE_SSLV3_CLIENT_METHOD)
     OSSL_SSL_METHOD_ENTRY(SSLv3),
     OSSL_SSL_METHOD_ENTRY(SSLv3_server),
     OSSL_SSL_METHOD_ENTRY(SSLv3_client),
+#endif
     OSSL_SSL_METHOD_ENTRY(SSLv23),
     OSSL_SSL_METHOD_ENTRY(SSLv23_server),
     OSSL_SSL_METHOD_ENTRY(SSLv23_client),
diff --git a/test/openssl/test_ssl.rb b/test/openssl/test_ssl.rb
index 07e081b..0cbfcba 100644
--- a/test/openssl/test_ssl.rb
+++ b/test/openssl/test_ssl.rb
@@ -912,7 +912,7 @@ def test_unset_OP_ALL
   # that has been marked as forbidden, therefore either of these may be raised
   HANDSHAKE_ERRORS = [OpenSSL::SSL::SSLError, Errno::ECONNRESET]

-if OpenSSL::SSL::SSLContext::METHODS.include? :TLSv1
+if OpenSSL::SSL::SSLContext::METHODS.include?(:TLSv1) && OpenSSL::SSL::SSLContext::METHODS.include?(:SSLv3)

   def test_forbid_ssl_v3_for_client
     ctx_proc = Proc.new { |ctx| ctx.options = OpenSSL::SSL::OP_ALL | OpenSSL::SSL::OP_NO_SSLv3 }
src/rvm/patches/ruby/2.2.1/fix_installing_bundled_gems.patch000066400000001136147511530530017761 0ustar00--- a/tool/rbinstall.rb
+++ b/tool/rbinstall.rb
@@ -725,9 +725,9 @@
     end
     # fix directory permissions
     # TODO: Gem.install should accept :dir_mode option or something
-    File.chmod($dir_mode, *Dir.glob(with_destdir(Gem.dir)+"/**/"))
+    File.chmod($dir_mode, *Dir.glob(with_destdir(gem_dir)+"/**/"))
     # fix .gemspec permissions
-    File.chmod($data_mode, *Dir.glob(with_destdir(Gem.dir)+"/specifications/*.gemspec"))
+    File.chmod($data_mode, *Dir.glob(with_destdir(gem_dir)+"/specifications/*.gemspec"))
   else
     puts "skip installing bundle gems because of lacking zlib"
   end
src/rvm/patches/ruby/2.2.1/openssl3.patch000066400000003333147511530530014006 0ustar00diff --git a/ext/openssl/extconf.rb b/ext/openssl/extconf.rb
index 8c04cb5..132d803 100644
--- a/ext/openssl/extconf.rb
+++ b/ext/openssl/extconf.rb
@@ -104,6 +104,9 @@
 have_func("SSLv2_method")
 have_func("SSLv2_server_method")
 have_func("SSLv2_client_method")
+have_func("SSLv3_method")
+have_func("SSLv3_server_method")
+have_func("SSLv3_client_method")
 have_func("TLSv1_1_method")
 have_func("TLSv1_1_server_method")
 have_func("TLSv1_1_client_method")
diff --git a/ext/openssl/ossl_ssl.c b/ext/openssl/ossl_ssl.c
index f7cb7f0..47111f6 100644
--- a/ext/openssl/ossl_ssl.c
+++ b/ext/openssl/ossl_ssl.c
@@ -109,9 +109,12 @@ static const struct {
     OSSL_SSL_METHOD_ENTRY(SSLv2_server),
     OSSL_SSL_METHOD_ENTRY(SSLv2_client),
 #endif
+#if defined(HAVE_SSLV3_METHOD) && defined(HAVE_SSLV3_SERVER_METHOD) && \
+        defined(HAVE_SSLV3_CLIENT_METHOD)
     OSSL_SSL_METHOD_ENTRY(SSLv3),
     OSSL_SSL_METHOD_ENTRY(SSLv3_server),
     OSSL_SSL_METHOD_ENTRY(SSLv3_client),
+#endif
     OSSL_SSL_METHOD_ENTRY(SSLv23),
     OSSL_SSL_METHOD_ENTRY(SSLv23_server),
     OSSL_SSL_METHOD_ENTRY(SSLv23_client),
diff --git a/test/openssl/test_ssl.rb b/test/openssl/test_ssl.rb
index 07e081b..0cbfcba 100644
--- a/test/openssl/test_ssl.rb
+++ b/test/openssl/test_ssl.rb
@@ -912,7 +912,7 @@ def test_unset_OP_ALL
   # that has been marked as forbidden, therefore either of these may be raised
   HANDSHAKE_ERRORS = [OpenSSL::SSL::SSLError, Errno::ECONNRESET]

-if OpenSSL::SSL::SSLContext::METHODS.include? :TLSv1
+if OpenSSL::SSL::SSLContext::METHODS.include?(:TLSv1) && OpenSSL::SSL::SSLContext::METHODS.include?(:SSLv3)

   def test_forbid_ssl_v3_for_client
     ctx_proc = Proc.new { |ctx| ctx.options = OpenSSL::SSL::OP_ALL | OpenSSL::SSL::OP_NO_SSLv3 }
src/rvm/patches/ruby/2.3.1/random_c_using_NR_prefix.patch000066400000001011147511530530017173 0ustar00--- a/random.c
+++ b/random.c
@@ -521,7 +521,7 @@
     CryptGenRandom(prov, size, seed);
     return 0;
 }
-#elif defined __linux__ && defined SYS_getrandom
+#elif defined __linux__ && defined __NR_getrandom
 #include <linux/random.h>

 # ifndef GRND_NONBLOCK
@@ -538,7 +538,7 @@
 	if (!need_secure)
 	    flags = GRND_NONBLOCK;
 	errno = 0;
-	ret = syscall(SYS_getrandom, seed, size, flags);
+	ret = syscall(__NR_getrandom, seed, size, flags);
 	if (errno == ENOSYS) {
 	    ATOMIC_SET(try_syscall, 0);
 	    return -1;
src/rvm/patches/ruby/2.3.1/fix_resolv_kernel32_dll.patch000066400000000445147511530530016762 0ustar00--- a/ext/win32/lib/win32/resolv.rb
+++ b/ext/win32/lib/win32/resolv.rb
@@ -36,7 +36,7 @@
 
 module Kernel32
   extend Importer
-  dlload "kernel32"
+  dlload "kernel32.dll"
 end
 getv = Kernel32.extern "int GetVersionExA(void *)", :stdcall
 info = [ 148, 0, 0, 0, 0 ].pack('V5') + "\0" * 128
src/rvm/patches/ruby/changeset_r45240.diff000066400000001032147511530530014264 0ustar00--- a/ext/readline/extconf.rb	(revision 45239)
+++ b/ext/readline/extconf.rb	(revision 45240)
@@ -19,6 +19,10 @@
   return super(func, headers)
 end
 
+def readline.have_type(type)
+  return super(type, headers)
+end
+
 dir_config('curses')
 dir_config('ncurses')
 dir_config('termcap')
@@ -94,4 +98,8 @@
 readline.have_func("rl_redisplay")
 readline.have_func("rl_insert_text")
 readline.have_func("rl_delete_text")
+unless readline.have_type("rl_hook_func_t")
+  $DEFS << "-Drl_hook_func_t=Function"
+end
+
 create_makefile("readline")
src/rvm/patches/ruby/2.2.6/fix_installing_bundled_gems.patch000066400000002214147511530530017764 0ustar00--- a/tool/rbinstall.rb
+++ b/tool/rbinstall.rb
@@ -719,15 +719,15 @@ install?(:ext, :comm, :gem) do
     directories = Gem.ensure_gem_subdirectories(gem_dir, :mode => $dir_mode)
     prepare "bundle gems", gem_dir, directories
     Dir.glob(srcdir+'/gems/*.gem').each do |gem|
-      Gem.install gem, Gem::Requirement.default, :install_dir => with_destdir(Gem.dir), :domain => :local, :ignore_dependencies => true
+      Gem.install gem, Gem::Requirement.default, :install_dir => with_destdir(gem_dir), :domain => :local, :ignore_dependencies => true
       gemname = Pathname(gem).basename
       puts "#{" "*30}#{gemname}"
     end
     # fix directory permissions
     # TODO: Gem.install should accept :dir_mode option or something
-    File.chmod($dir_mode, *Dir.glob(with_destdir(Gem.dir)+"/**/"))
+    File.chmod($dir_mode, *Dir.glob(with_destdir(gem_dir)+"/**/"))
     # fix .gemspec permissions
-    File.chmod($data_mode, *Dir.glob(with_destdir(Gem.dir)+"/specifications/*.gemspec"))
+    File.chmod($data_mode, *Dir.glob(with_destdir(gem_dir)+"/specifications/*.gemspec"))
   else
     puts "skip installing bundle gems because of lacking zlib"
   end
src/rvm/patches/ruby/1.9.3/p327/falcon-gc.diff000066400000636661147511530530014425 0ustar00diff --git a/array.c b/array.c
index e427cb3..7e76227 100644
--- a/array.c
+++ b/array.c
@@ -255,15 +255,24 @@ rb_ary_modify(VALUE ary)
     rb_ary_modify_check(ary);
     if (ARY_SHARED_P(ary)) {
         long len = RARRAY_LEN(ary);
+	VALUE shared = ARY_SHARED(ary);
         if (len <= RARRAY_EMBED_LEN_MAX) {
             VALUE *ptr = ARY_HEAP_PTR(ary);
-            VALUE shared = ARY_SHARED(ary);
             FL_UNSET_SHARED(ary);
             FL_SET_EMBED(ary);
             MEMCPY(ARY_EMBED_PTR(ary), ptr, VALUE, len);
             rb_ary_decrement_share(shared);
             ARY_SET_EMBED_LEN(ary, len);
         }
+	else if (ARY_SHARED_NUM(shared) == 1 && len > RARRAY_LEN(shared)>>1) {
+	    long shift = RARRAY_PTR(ary) - RARRAY_PTR(shared);
+	    ARY_SET_PTR(ary, RARRAY_PTR(shared));
+	    ARY_SET_CAPA(ary, RARRAY_LEN(shared));
+	    MEMMOVE(RARRAY_PTR(ary), RARRAY_PTR(ary)+shift, VALUE, len);
+	    FL_UNSET_SHARED(ary);
+            FL_SET_EMBED(shared);
+	    rb_ary_decrement_share(shared);
+	}
         else {
             VALUE *ptr = ALLOC_N(VALUE, len);
             MEMCPY(ptr, RARRAY_PTR(ary), VALUE, len);
@@ -274,6 +283,38 @@ rb_ary_modify(VALUE ary)
     }
 }
 
+static void
+ary_ensure_room_for_push(VALUE ary, long add_len)
+{
+    long new_len = RARRAY_LEN(ary) + add_len;
+    long capa;
+
+    if (ARY_SHARED_P(ary)) {
+        if (new_len > RARRAY_EMBED_LEN_MAX) {
+            VALUE shared = ARY_SHARED(ary);
+            if (ARY_SHARED_NUM(shared) == 1) {
+		if (RARRAY_PTR(ary) - RARRAY_PTR(shared) + new_len <= RARRAY_LEN(shared)) {
+		    rb_ary_modify_check(ary);
+		}
+		else {
+		    /* if array is shared, than it is likely it participate in push/shift pattern */
+		    rb_ary_modify(ary);
+		    capa = ARY_CAPA(ary);
+		    if (new_len > capa - (capa >> 6)) {
+			ary_double_capa(ary, new_len);
+		    }
+		}
+		return;
+            }
+        }
+    }
+    rb_ary_modify(ary);
+    capa = ARY_CAPA(ary);
+    if (new_len > capa) {
+	ary_double_capa(ary, new_len);
+    }
+}
+
 VALUE
 rb_ary_freeze(VALUE ary)
 {
@@ -295,6 +336,33 @@ rb_ary_frozen_p(VALUE ary)
     return Qfalse;
 }
 
+/* This can be used to take a snapshot of an array (with
+   e.g. rb_ary_replace) and check later whether the array has been
+   modified from the snapshot.  The snapshot is cheap, though if
+   something does modify the array it will pay the cost of copying
+   it. */
+VALUE
+rb_ary_dup_of_p(VALUE ary1, VALUE ary2)
+{
+    VALUE *p1, *p2;
+    long len = RARRAY_LEN(ary1);
+
+    if (len != RARRAY_LEN(ary2)) return Qfalse;
+
+    p1 = RARRAY_PTR(ary1);
+    p2 = RARRAY_PTR(ary2);
+
+    if (ARY_EMBED_P(ary1) && ARY_EMBED_P(ary2)) {
+        for (; len; len--, p1++, p2++) {
+            if (*p1 != *p2) return Qfalse;
+        }
+        return Qtrue;
+    }
+
+    if (p1 == p2) return Qtrue;
+    return Qfalse;
+}
+
 static VALUE
 ary_alloc(VALUE klass)
 {
@@ -430,8 +498,9 @@ ary_make_shared(VALUE ary)
 	OBJSETUP(shared, 0, T_ARRAY);
         FL_UNSET_EMBED(shared);
 
-        ARY_SET_LEN((VALUE)shared, RARRAY_LEN(ary));
+        ARY_SET_LEN((VALUE)shared, ARY_CAPA(ary));
         ARY_SET_PTR((VALUE)shared, RARRAY_PTR(ary));
+	rb_mem_clear(RARRAY_PTR(shared) + RARRAY_LEN(ary), ARY_CAPA(ary) - RARRAY_LEN(ary));
 	FL_SET_SHARED_ROOT(shared);
 	ARY_SET_SHARED_NUM((VALUE)shared, 1);
 	FL_SET_SHARED(ary);
@@ -721,8 +790,6 @@ ary_take_first_or_last(int argc, VALUE *argv, VALUE ary, enum ary_take_pos_flags
     return ary_make_partial(ary, rb_cArray, offset, n);
 }
 
-static VALUE rb_ary_push_1(VALUE ary, VALUE item);
-
 /*
  *  call-seq:
  *     ary << obj            -> ary
@@ -739,8 +806,12 @@ static VALUE rb_ary_push_1(VALUE ary, VALUE item);
 VALUE
 rb_ary_push(VALUE ary, VALUE item)
 {
-    rb_ary_modify(ary);
-    return rb_ary_push_1(ary, item);
+    long idx = RARRAY_LEN(ary);
+
+    ary_ensure_room_for_push(ary, 1);
+    RARRAY_PTR(ary)[idx] = item;
+    ARY_SET_LEN(ary, idx + 1);
+    return ary;
 }
 
 static VALUE
@@ -756,6 +827,18 @@ rb_ary_push_1(VALUE ary, VALUE item)
     return ary;
 }
 
+static VALUE
+rb_ary_cat(VALUE ary, const VALUE *ptr, long len)
+{
+    long oldlen = RARRAY_LEN(ary);
+
+    ary_ensure_room_for_push(ary, len);
+copy:
+    MEMCPY(RARRAY_PTR(ary) + oldlen, ptr, VALUE, len);
+    ARY_SET_LEN(ary, oldlen + len);
+    return ary;
+}
+
 /*
  *  call-seq:
  *     ary.push(obj, ... )   -> ary
@@ -772,11 +855,7 @@ rb_ary_push_1(VALUE ary, VALUE item)
 static VALUE
 rb_ary_push_m(int argc, VALUE *argv, VALUE ary)
 {
-    rb_ary_modify(ary);
-    while (argc--) {
-	rb_ary_push_1(ary, *argv++);
-    }
-    return ary;
+    return rb_ary_cat(ary, argv, argc);
 }
 
 VALUE
@@ -904,6 +983,55 @@ rb_ary_shift_m(int argc, VALUE *argv, VALUE ary)
     return result;
 }
 
+static void
+ary_ensure_room_for_unshift(VALUE ary, int argc)
+{
+    long len = RARRAY_LEN(ary);
+    long new_len = len + argc;
+    long capa;
+    VALUE *head, *sharedp;
+
+    if (ARY_SHARED_P(ary)) {
+	VALUE shared = ARY_SHARED(ary);
+	capa = RARRAY_LEN(shared);
+	if (ARY_SHARED_NUM(shared) == 1 && capa > new_len) {
+	    head = RARRAY_PTR(ary);
+	    sharedp = RARRAY_PTR(shared);
+	    goto makeroom_if_need;
+	}
+    }
+
+    rb_ary_modify(ary);
+    capa = ARY_CAPA(ary);
+    if (capa - (capa >> 6) <= new_len) {
+	ary_double_capa(ary, new_len);
+    }
+
+    /* use shared array for big "queues" */
+    if (new_len > ARY_DEFAULT_SIZE * 4) {
+	/* make a room for unshifted items */
+	capa = ARY_CAPA(ary);
+	ary_make_shared(ary);
+
+	head = sharedp = RARRAY_PTR(ary);
+	goto makeroom;
+makeroom_if_need:
+	if (head - sharedp < argc) {
+	    long room;
+makeroom:
+	    room = capa - new_len;
+	    room -= room >> 4;
+	    MEMMOVE(sharedp + argc + room, head, VALUE, len);
+	    head = sharedp + argc + room;
+	}
+	ARY_SET_PTR(ary, head - argc);
+    }
+    else {
+	/* sliding items */
+	MEMMOVE(RARRAY_PTR(ary) + argc, RARRAY_PTR(ary), VALUE, len);
+    }
+}
+
 /*
  *  call-seq:
  *     ary.unshift(obj, ...)  -> ary
@@ -919,19 +1047,16 @@ rb_ary_shift_m(int argc, VALUE *argv, VALUE ary)
 static VALUE
 rb_ary_unshift_m(int argc, VALUE *argv, VALUE ary)
 {
-    long len;
+    long len = RARRAY_LEN(ary);
 
-    rb_ary_modify(ary);
-    if (argc == 0) return ary;
-    if (ARY_CAPA(ary) <= (len = RARRAY_LEN(ary)) + argc) {
-	ary_double_capa(ary, len + argc);
+    if (argc == 0) {
+	rb_ary_modify_check(ary);
+	return ary;
     }
 
-    /* sliding items */
-    MEMMOVE(RARRAY_PTR(ary) + argc, RARRAY_PTR(ary), VALUE, len);
+    ary_ensure_room_for_unshift(ary, argc);
     MEMCPY(RARRAY_PTR(ary), argv, VALUE, argc);
-    ARY_INCREASE_LEN(ary, argc);
-
+    ARY_SET_LEN(ary, len + argc);
     return ary;
 }
 
@@ -1293,15 +1418,12 @@ rb_ary_splice(VALUE ary, long beg, long len, VALUE rpl)
 	rpl = rb_ary_to_ary(rpl);
 	rlen = RARRAY_LEN(rpl);
     }
-    rb_ary_modify(ary);
     if (beg >= RARRAY_LEN(ary)) {
 	if (beg > ARY_MAX_SIZE - rlen) {
 	    rb_raise(rb_eIndexError, "index %ld too big", beg);
 	}
+	ary_ensure_room_for_push(ary, rlen-len); /* len is 0 or negative */
 	len = beg + rlen;
-	if (len >= ARY_CAPA(ary)) {
-	    ary_double_capa(ary, len);
-	}
 	rb_mem_clear(RARRAY_PTR(ary) + RARRAY_LEN(ary), beg - RARRAY_LEN(ary));
 	if (rlen > 0) {
 	    MEMCPY(RARRAY_PTR(ary) + beg, RARRAY_PTR(rpl), VALUE, rlen);
@@ -1311,6 +1433,7 @@ rb_ary_splice(VALUE ary, long beg, long len, VALUE rpl)
     else {
 	long alen;
 
+	rb_ary_modify(ary);
 	alen = RARRAY_LEN(ary) + rlen - len;
 	if (alen >= ARY_CAPA(ary)) {
 	    ary_double_capa(ary, alen);
@@ -2100,12 +2223,13 @@ rb_ary_sort_bang(VALUE ary)
     if (RARRAY_LEN(ary) > 1) {
 	VALUE tmp = ary_make_substitution(ary); /* only ary refers tmp */
 	struct ary_sort_data data;
+	long len = RARRAY_LEN(ary);
 
 	RBASIC(tmp)->klass = 0;
 	data.ary = tmp;
 	data.opt_methods = 0;
 	data.opt_inited = 0;
-	ruby_qsort(RARRAY_PTR(tmp), RARRAY_LEN(tmp), sizeof(VALUE),
+	ruby_qsort(RARRAY_PTR(tmp), len, sizeof(VALUE),
 		   rb_block_given_p()?sort_1:sort_2, &data);
 
         if (ARY_EMBED_P(tmp)) {
@@ -2122,7 +2246,7 @@ rb_ary_sort_bang(VALUE ary)
             if (ARY_HEAP_PTR(ary) == ARY_HEAP_PTR(tmp)) {
                 assert(!ARY_EMBED_P(ary));
                 FL_UNSET_SHARED(ary);
-                ARY_SET_CAPA(ary, ARY_CAPA(tmp));
+                ARY_SET_CAPA(ary, RARRAY_LEN(tmp));
             }
             else {
                 assert(!ARY_SHARED_P(tmp));
@@ -2137,8 +2261,8 @@ rb_ary_sort_bang(VALUE ary)
                     xfree(ARY_HEAP_PTR(ary));
                 }
                 ARY_SET_PTR(ary, RARRAY_PTR(tmp));
-                ARY_SET_HEAP_LEN(ary, RARRAY_LEN(tmp));
-                ARY_SET_CAPA(ary, ARY_CAPA(tmp));
+                ARY_SET_HEAP_LEN(ary, len);
+                ARY_SET_CAPA(ary, RARRAY_LEN(tmp));
             }
             /* tmp was lost ownership for the ptr */
             FL_UNSET(tmp, FL_FREEZE);
diff --git a/class.c b/class.c
index df19812..db6b3e5 100644
--- a/class.c
+++ b/class.c
@@ -31,7 +31,7 @@
 #include "internal.h"
 #include <ctype.h>
 
-extern st_table *rb_class_tbl;
+extern sa_table rb_class_tbl;
 static ID id_attached;
 
 /**
@@ -50,14 +50,24 @@ static VALUE
 class_alloc(VALUE flags, VALUE klass)
 {
     rb_classext_t *ext = ALLOC(rb_classext_t);
+    rb_class_cache_t *cache = ALLOC(rb_class_cache_t);
     NEWOBJ(obj, struct RClass);
     OBJSETUP(obj, klass, flags);
     obj->ptr = ext;
-    RCLASS_IV_TBL(obj) = 0;
-    RCLASS_CONST_TBL(obj) = 0;
-    RCLASS_M_TBL(obj) = 0;
-    RCLASS_SUPER(obj) = 0;
-    RCLASS_IV_INDEX_TBL(obj) = 0;
+    obj->cache = cache;
+    MEMZERO(ext, struct rb_classext_struct, 1);
+    MEMZERO(cache, struct rb_class_cache_struct, 1);
+    return (VALUE)obj;
+}
+
+static VALUE
+iclass_alloc()
+{
+    rb_class_cache_t *cache = ALLOC(rb_class_cache_t);
+    NEWOBJ(obj, struct RClass);
+    OBJSETUP(obj, rb_cClass, T_ICLASS);
+    obj->cache = cache;
+    MEMZERO(cache, struct rb_class_cache_struct, 1);
     return (VALUE)obj;
 }
 
@@ -77,7 +87,6 @@ rb_class_boot(VALUE super)
     VALUE klass = class_alloc(T_CLASS, rb_cClass);
 
     RCLASS_SUPER(klass) = super;
-    RCLASS_M_TBL(klass) = st_init_numtable();
 
     OBJ_INFECT(klass, super);
     return (VALUE)klass;
@@ -120,85 +129,59 @@ rb_class_new(VALUE super)
     return rb_class_boot(super);
 }
 
-struct clone_method_data {
-    st_table *tbl;
-    VALUE klass;
-};
-
 VALUE rb_iseq_clone(VALUE iseqval, VALUE newcbase);
 
-static int
-clone_method(ID mid, const rb_method_entry_t *me, struct clone_method_data *data)
+static void
+clone_method(ID mid, const rb_method_entry_t *me, VALUE klass)
 {
     VALUE newiseqval;
     if (me->def && me->def->type == VM_METHOD_TYPE_ISEQ) {
 	rb_iseq_t *iseq;
-	newiseqval = rb_iseq_clone(me->def->body.iseq->self, data->klass);
+	newiseqval = rb_iseq_clone(me->def->body.iseq->self, klass);
 	GetISeqPtr(newiseqval, iseq);
-	rb_add_method(data->klass, mid, VM_METHOD_TYPE_ISEQ, iseq, me->flag);
+	rb_add_method(klass, mid, VM_METHOD_TYPE_ISEQ, iseq, me->flag);
 	RB_GC_GUARD(newiseqval);
     }
     else {
-	rb_method_entry_set(data->klass, mid, me, me->flag);
+	rb_method_entry_set(klass, mid, me, me->flag);
     }
-    return ST_CONTINUE;
 }
 
-static int
-clone_const(ID key, const rb_const_entry_t *ce, st_table *tbl)
+static void
+clone_const(sa_index_t key, st_data_t ce, sa_table *tbl)
 {
     rb_const_entry_t *nce = ALLOC(rb_const_entry_t);
-    *nce = *ce;
-    st_insert(tbl, key, (st_data_t)nce);
-    return ST_CONTINUE;
-}
-
-static int
-clone_const_i(st_data_t key, st_data_t value, st_data_t data)
-{
-    return clone_const((ID)key, (const rb_const_entry_t *)value, (st_table *)data);
+    *nce = *(const rb_const_entry_t*)ce;
+    sa_insert(tbl, (sa_index_t)key, (st_data_t)nce);
 }
 
 /* :nodoc: */
 VALUE
 rb_mod_init_copy(VALUE clone, VALUE orig)
 {
+    ID id;
     rb_obj_init_copy(clone, orig);
     if (!FL_TEST(CLASS_OF(clone), FL_SINGLETON)) {
 	RBASIC(clone)->klass = rb_singleton_class_clone(orig);
 	rb_singleton_class_attached(RBASIC(clone)->klass, (VALUE)clone);
     }
     RCLASS_SUPER(clone) = RCLASS_SUPER(orig);
-    if (RCLASS_IV_TBL(orig)) {
-	st_data_t id;
 
-	if (RCLASS_IV_TBL(clone)) {
-	    st_free_table(RCLASS_IV_TBL(clone));
-	}
-	RCLASS_IV_TBL(clone) = st_copy(RCLASS_IV_TBL(orig));
-	CONST_ID(id, "__classpath__");
-	st_delete(RCLASS_IV_TBL(clone), &id, 0);
-	CONST_ID(id, "__classid__");
-	st_delete(RCLASS_IV_TBL(clone), &id, 0);
-    }
-    if (RCLASS_CONST_TBL(orig)) {
-	if (RCLASS_CONST_TBL(clone)) {
-	    rb_free_const_table(RCLASS_CONST_TBL(clone));
-	}
-	RCLASS_CONST_TBL(clone) = st_init_numtable();
-	st_foreach(RCLASS_CONST_TBL(orig), clone_const_i, (st_data_t)RCLASS_CONST_TBL(clone));
-    }
-    if (RCLASS_M_TBL(orig)) {
-	struct clone_method_data data;
+    sa_copy_to(RCLASS_IV_TBL(orig), RCLASS_IV_TBL(clone));
+    CONST_ID(id, "__classpath__");
+    sa_delete(RCLASS_IV_TBL(clone), (sa_index_t)id, 0);
+    CONST_ID(id, "__classid__");
+    sa_delete(RCLASS_IV_TBL(clone), (sa_index_t)id, 0);
 
-	if (RCLASS_M_TBL(clone)) {
-	    rb_free_m_table(RCLASS_M_TBL(clone));
-	}
-	data.tbl = RCLASS_M_TBL(clone) = st_init_numtable();
-	data.klass = clone;
-	st_foreach(RCLASS_M_TBL(orig), clone_method,
-		   (st_data_t)&data);
-    }
+    sa_clear(RCLASS_CONST_TBL(clone));
+    SA_FOREACH_START(RCLASS_CONST_TBL(orig));
+    clone_const(entry->key, value, RCLASS_CONST_TBL(clone));
+    SA_FOREACH_END();
+
+    rb_free_m_table(RCLASS_M_TBL(clone));
+    SA_FOREACH_START(RCLASS_M_TBL(orig));
+    clone_method(entry->key, (const rb_method_entry_t *)value, clone);
+    SA_FOREACH_END();
 
     return clone;
 }
@@ -227,7 +210,6 @@ rb_singleton_class_clone(VALUE obj)
     if (!FL_TEST(klass, FL_SINGLETON))
 	return klass;
     else {
-	struct clone_method_data data;
 	/* copy singleton(unnamed) class */
 	VALUE clone = class_alloc((RBASIC(klass)->flags & ~(FL_MARK)), 0);
 
@@ -239,18 +221,16 @@ rb_singleton_class_clone(VALUE obj)
 	}
 
 	RCLASS_SUPER(clone) = RCLASS_SUPER(klass);
-	if (RCLASS_IV_TBL(klass)) {
-	    RCLASS_IV_TBL(clone) = st_copy(RCLASS_IV_TBL(klass));
-	}
-	if (RCLASS_CONST_TBL(klass)) {
-	    RCLASS_CONST_TBL(clone) = st_init_numtable();
-	    st_foreach(RCLASS_CONST_TBL(klass), clone_const_i, (st_data_t)RCLASS_CONST_TBL(clone));
-	}
-	RCLASS_M_TBL(clone) = st_init_numtable();
-	data.tbl = RCLASS_M_TBL(clone);
-	data.klass = (VALUE)clone;
-	st_foreach(RCLASS_M_TBL(klass), clone_method,
-		   (st_data_t)&data);
+        sa_copy_to(RCLASS_IV_TBL(klass), RCLASS_IV_TBL(clone));
+
+        SA_FOREACH_START(RCLASS_CONST_TBL(klass));
+        clone_const(entry->key, value, RCLASS_CONST_TBL(clone));
+        SA_FOREACH_END();
+
+        SA_FOREACH_START(RCLASS_M_TBL(klass));
+        clone_method(entry->key, (const rb_method_entry_t*)value, clone);
+        SA_FOREACH_END();
+
 	rb_singleton_class_attached(RBASIC(clone)->klass, (VALUE)clone);
 	FL_SET(clone, FL_SINGLETON);
 	return (VALUE)clone;
@@ -265,10 +245,7 @@ void
 rb_singleton_class_attached(VALUE klass, VALUE obj)
 {
     if (FL_TEST(klass, FL_SINGLETON)) {
-	if (!RCLASS_IV_TBL(klass)) {
-	    RCLASS_IV_TBL(klass) = st_init_numtable();
-	}
-	st_insert(RCLASS_IV_TBL(klass), id_attached, obj);
+	sa_insert(RCLASS_IV_TBL(klass), (sa_index_t)id_attached, obj);
     }
 }
 
@@ -355,12 +332,12 @@ make_singleton_class(VALUE obj)
 static VALUE
 boot_defclass(const char *name, VALUE super)
 {
-    extern st_table *rb_class_tbl;
+    extern sa_table rb_class_tbl;
     VALUE obj = rb_class_boot(super);
     ID id = rb_intern(name);
 
     rb_name_class(obj, id);
-    st_add_direct(rb_class_tbl, id, obj);
+    sa_insert(&rb_class_tbl, (sa_index_t)id, obj);
     rb_const_set((rb_cObject ? rb_cObject : obj), id, obj);
     return obj;
 }
@@ -484,7 +461,7 @@ rb_define_class(const char *name, VALUE super)
 	rb_warn("no super class for `%s', Object assumed", name);
     }
     klass = rb_define_class_id(id, super);
-    st_add_direct(rb_class_tbl, id, klass);
+    sa_insert(&rb_class_tbl, (sa_index_t)id, klass);
     rb_name_class(klass, id);
     rb_const_set(rb_cObject, id, klass);
     rb_class_inherited(super, klass);
@@ -565,8 +542,6 @@ rb_module_new(void)
 {
     VALUE mdl = class_alloc(T_MODULE, rb_cModule);
 
-    RCLASS_M_TBL(mdl) = st_init_numtable();
-
     return (VALUE)mdl;
 }
 
@@ -595,7 +570,7 @@ rb_define_module(const char *name)
 	rb_raise(rb_eTypeError, "%s is not a module", rb_obj_classname(module));
     }
     module = rb_define_module_id(id);
-    st_add_direct(rb_class_tbl, id, module);
+    sa_insert(&rb_class_tbl, (sa_index_t)id, module);
     rb_const_set(rb_cObject, id, module);
 
     return module;
@@ -630,27 +605,15 @@ rb_define_module_id_under(VALUE outer, ID id)
 static VALUE
 include_class_new(VALUE module, VALUE super)
 {
-    VALUE klass = class_alloc(T_ICLASS, rb_cClass);
+    VALUE klass;
 
     if (BUILTIN_TYPE(module) == T_ICLASS) {
 	module = RBASIC(module)->klass;
     }
-    if (!RCLASS_IV_TBL(module)) {
-	RCLASS_IV_TBL(module) = st_init_numtable();
-    }
-    if (!RCLASS_CONST_TBL(module)) {
-	RCLASS_CONST_TBL(module) = st_init_numtable();
-    }
-    RCLASS_IV_TBL(klass) = RCLASS_IV_TBL(module);
-    RCLASS_CONST_TBL(klass) = RCLASS_CONST_TBL(module);
-    RCLASS_M_TBL(klass) = RCLASS_M_TBL(module);
+    klass = iclass_alloc();
+    RBASIC(klass)->klass = module;
+    RCLASS_EXT(klass) = RCLASS_EXT(module);
     RCLASS_SUPER(klass) = super;
-    if (TYPE(module) == T_ICLASS) {
-	RBASIC(klass)->klass = RBASIC(module)->klass;
-    }
-    else {
-	RBASIC(klass)->klass = module;
-    }
     OBJ_INFECT(klass, module);
     OBJ_INFECT(klass, super);
 
@@ -677,13 +640,13 @@ rb_include_module(VALUE klass, VALUE module)
     while (module) {
 	int superclass_seen = FALSE;
 
-	if (RCLASS_M_TBL(klass) == RCLASS_M_TBL(module))
+	if (RCLASS_EXT(klass) == RCLASS_EXT(module))
 	    rb_raise(rb_eArgError, "cyclic include detected");
 	/* ignore if the module included already in superclasses */
 	for (p = RCLASS_SUPER(klass); p; p = RCLASS_SUPER(p)) {
 	    switch (BUILTIN_TYPE(p)) {
 	      case T_ICLASS:
-		if (RCLASS_M_TBL(p) == RCLASS_M_TBL(module)) {
+		if (RCLASS_EXT(p) == RCLASS_EXT(module)) {
 		    if (!superclass_seen) {
 			c = p;  /* move insertion point */
 		    }
@@ -696,7 +659,7 @@ rb_include_module(VALUE klass, VALUE module)
 	    }
 	}
 	c = RCLASS_SUPER(c) = include_class_new(module, RCLASS_SUPER(c));
-	if (RMODULE_M_TBL(module) && RMODULE_M_TBL(module)->num_entries)
+	if (RMODULE_M_TBL(module)->num_entries)
 	    changed = 1;
       skip:
 	module = RCLASS_SUPER(module);
@@ -827,58 +790,58 @@ ins_methods_push(ID name, long type, VALUE ary, long visi)
 }
 
 static int
-ins_methods_i(st_data_t name, st_data_t type, st_data_t ary)
+ins_methods_i(sa_index_t name, st_data_t type, st_data_t ary)
 {
     return ins_methods_push((ID)name, (long)type, (VALUE)ary, -1); /* everything but private */
 }
 
 static int
-ins_methods_prot_i(st_data_t name, st_data_t type, st_data_t ary)
+ins_methods_prot_i(sa_index_t name, st_data_t type, st_data_t ary)
 {
     return ins_methods_push((ID)name, (long)type, (VALUE)ary, NOEX_PROTECTED);
 }
 
 static int
-ins_methods_priv_i(st_data_t name, st_data_t type, st_data_t ary)
+ins_methods_priv_i(sa_index_t name, st_data_t type, st_data_t ary)
 {
     return ins_methods_push((ID)name, (long)type, (VALUE)ary, NOEX_PRIVATE);
 }
 
 static int
-ins_methods_pub_i(st_data_t name, st_data_t type, st_data_t ary)
+ins_methods_pub_i(sa_index_t name, st_data_t type, st_data_t ary)
 {
     return ins_methods_push((ID)name, (long)type, (VALUE)ary, NOEX_PUBLIC);
 }
 
 static int
-method_entry_i(st_data_t key, st_data_t value, st_data_t data)
+method_entry_i(sa_index_t key, st_data_t value, st_data_t data)
 {
     const rb_method_entry_t *me = (const rb_method_entry_t *)value;
-    st_table *list = (st_table *)data;
+    sa_table *list = (sa_table *)data;
     long type;
 
     if ((ID)key == ID_ALLOCATOR) {
 	return ST_CONTINUE;
     }
 
-    if (!st_lookup(list, key, 0)) {
+    if (!sa_lookup(list, key, 0)) {
 	if (UNDEFINED_METHOD_ENTRY_P(me)) {
 	    type = -1; /* none */
 	}
 	else {
 	    type = VISI(me->flag);
 	}
-	st_add_direct(list, key, type);
+	sa_insert(list, key, type);
     }
     return ST_CONTINUE;
 }
 
 static VALUE
-class_instance_method_list(int argc, VALUE *argv, VALUE mod, int obj, int (*func) (st_data_t, st_data_t, st_data_t))
+class_instance_method_list(int argc, VALUE *argv, VALUE mod, int obj, int (*func) (sa_index_t, st_data_t, st_data_t))
 {
     VALUE ary;
     int recur;
-    st_table *list;
+    sa_table list = SA_EMPTY_TABLE;
 
     if (argc == 0) {
 	recur = TRUE;
@@ -889,16 +852,15 @@ class_instance_method_list(int argc, VALUE *argv, VALUE mod, int obj, int (*func
 	recur = RTEST(r);
     }
 
-    list = st_init_numtable();
     for (; mod; mod = RCLASS_SUPER(mod)) {
-	st_foreach(RCLASS_M_TBL(mod), method_entry_i, (st_data_t)list);
+	sa_foreach(RCLASS_M_TBL(mod), method_entry_i, (st_data_t)&list);
 	if (BUILTIN_TYPE(mod) == T_ICLASS) continue;
 	if (obj && FL_TEST(mod, FL_SINGLETON)) continue;
 	if (!recur) break;
     }
     ary = rb_ary_new();
-    st_foreach(list, func, ary);
-    st_free_table(list);
+    sa_foreach(&list, func, ary);
+    sa_clear(&list);
 
     return ary;
 }
@@ -1112,7 +1074,7 @@ VALUE
 rb_obj_singleton_methods(int argc, VALUE *argv, VALUE obj)
 {
     VALUE recur, ary, klass;
-    st_table *list;
+    sa_table list = SA_EMPTY_TABLE;
 
     if (argc == 0) {
 	recur = Qtrue;
@@ -1121,20 +1083,19 @@ rb_obj_singleton_methods(int argc, VALUE *argv, VALUE obj)
 	rb_scan_args(argc, argv, "01", &recur);
     }
     klass = CLASS_OF(obj);
-    list = st_init_numtable();
     if (klass && FL_TEST(klass, FL_SINGLETON)) {
-	st_foreach(RCLASS_M_TBL(klass), method_entry_i, (st_data_t)list);
+	sa_foreach(RCLASS_M_TBL(klass), method_entry_i, (st_data_t)&list);
 	klass = RCLASS_SUPER(klass);
     }
     if (RTEST(recur)) {
 	while (klass && (FL_TEST(klass, FL_SINGLETON) || TYPE(klass) == T_ICLASS)) {
-	    st_foreach(RCLASS_M_TBL(klass), method_entry_i, (st_data_t)list);
+	    sa_foreach(RCLASS_M_TBL(klass), method_entry_i, (st_data_t)&list);
 	    klass = RCLASS_SUPER(klass);
 	}
     }
     ary = rb_ary_new();
-    st_foreach(list, ins_methods_i, ary);
-    st_free_table(list);
+    sa_foreach(&list, ins_methods_i, ary);
+    sa_clear(&list);
 
     return ary;
 }
diff --git a/common.mk b/common.mk
index c9ef641..3ccfa47 100644
--- a/common.mk
+++ b/common.mk
@@ -79,6 +79,7 @@ COMMONOBJS    = array.$(OBJEXT) \
 		safe.$(OBJEXT) \
 		signal.$(OBJEXT) \
 		sprintf.$(OBJEXT) \
+		sp_ar.$(OBJEXT) \
 		st.$(OBJEXT) \
 		strftime.$(OBJEXT) \
 		string.$(OBJEXT) \
@@ -638,7 +639,8 @@ file.$(OBJEXT): {$(VPATH)}file.c $(RUBY_H_INCLUDES) {$(VPATH)}io.h \
 gc.$(OBJEXT): {$(VPATH)}gc.c $(RUBY_H_INCLUDES) {$(VPATH)}re.h \
   {$(VPATH)}regex.h $(ENCODING_H_INCLUDES) $(VM_CORE_H_INCLUDES) \
   {$(VPATH)}gc.h {$(VPATH)}io.h {$(VPATH)}eval_intern.h {$(VPATH)}util.h \
-  {$(VPATH)}debug.h {$(VPATH)}internal.h {$(VPATH)}constant.h
+  {$(VPATH)}debug.h {$(VPATH)}internal.h {$(VPATH)}constant.h \
+  {$(VPATH)}pool_alloc.inc.h {$(VPATH)}pool_alloc.h
 hash.$(OBJEXT): {$(VPATH)}hash.c $(RUBY_H_INCLUDES) {$(VPATH)}util.h \
   $(ENCODING_H_INCLUDES)
 inits.$(OBJEXT): {$(VPATH)}inits.c $(RUBY_H_INCLUDES) \
@@ -702,7 +704,8 @@ signal.$(OBJEXT): {$(VPATH)}signal.c $(RUBY_H_INCLUDES) \
   $(VM_CORE_H_INCLUDES) {$(VPATH)}debug.h
 sprintf.$(OBJEXT): {$(VPATH)}sprintf.c $(RUBY_H_INCLUDES) {$(VPATH)}re.h \
   {$(VPATH)}regex.h {$(VPATH)}vsnprintf.c $(ENCODING_H_INCLUDES)
-st.$(OBJEXT): {$(VPATH)}st.c $(RUBY_H_INCLUDES)
+sp_ar.$(OBJEXT): {$(VPATH)}sp_ar.c $(RUBY_H_INCLUDES)
+st.$(OBJEXT): {$(VPATH)}st.c $(RUBY_H_INCLUDES) {$(VPATH)}pool_alloc.h
 strftime.$(OBJEXT): {$(VPATH)}strftime.c $(RUBY_H_INCLUDES) \
   {$(VPATH)}timev.h
 string.$(OBJEXT): {$(VPATH)}string.c $(RUBY_H_INCLUDES) {$(VPATH)}re.h \
diff --git a/configure.in b/configure.in
index b006a01..a3ccad7 100644
--- a/configure.in
+++ b/configure.in
@@ -1324,6 +1324,29 @@ main() {
 CFLAGS="$save_CFLAGS"])
 AC_DEFINE_UNQUOTED(GC_MARK_STACKFRAME_WORD, $rb_cv_gc_mark_stackframe_word)
 
+AS_CASE(["$target_os"],
+[openbsd*], [
+  AC_CACHE_CHECK(for heap align log on openbsd, rb_cv_page_size_log,
+    [rb_cv_page_size_log=no
+     for page_log in 12 13; do
+       AC_TRY_RUN([
+#include <math.h>
+#include <unistd.h>
+
+int
+main() {
+  if ((int)log2((double)sysconf(_SC_PAGESIZE)) != $page_log) return 1;
+  return 0;
+}
+       ],
+       rb_cv_page_size_log="$page_log"; break)
+     done])
+  if test $rb_cv_page_size_log != no; then
+    AC_DEFINE_UNQUOTED(HEAP_ALIGN_LOG, $rb_cv_page_size_log)
+  else
+    AC_DEFINE_UNQUOTED(HEAP_ALIGN_LOG, 12)
+  fi
+])
 
 dnl Checks for library functions.
 AC_TYPE_GETGROUPS
@@ -1424,7 +1447,8 @@ AC_CHECK_FUNCS(fmod killpg wait4 waitpid fork spawnv syscall __syscall chroot ge
 	      setsid telldir seekdir fchmod cosh sinh tanh log2 round\
 	      setuid setgid daemon select_large_fdset setenv unsetenv\
               mktime timegm gmtime_r clock_gettime gettimeofday poll ppoll\
-              pread sendfile shutdown sigaltstack dl_iterate_phdr)
+              pread sendfile shutdown sigaltstack dl_iterate_phdr\
+              dup3 pipe2 posix_memalign memalign)
 
 AC_CACHE_CHECK(for unsetenv returns a value, rb_cv_unsetenv_return_value,
   [AC_TRY_COMPILE([
diff --git a/constant.h b/constant.h
index 8232910..9106847 100644
--- a/constant.h
+++ b/constant.h
@@ -23,7 +23,7 @@ typedef struct rb_const_entry_struct {
 
 VALUE rb_mod_private_constant(int argc, VALUE *argv, VALUE obj);
 VALUE rb_mod_public_constant(int argc, VALUE *argv, VALUE obj);
-void rb_free_const_table(st_table *tbl);
+void rb_free_const_table(sa_table *tbl);
 VALUE rb_public_const_get(VALUE klass, ID id);
 VALUE rb_public_const_get_at(VALUE klass, ID id);
 VALUE rb_public_const_get_from(VALUE klass, ID id);
diff --git a/ext/-test-/st/numhash/numhash.c b/ext/-test-/st/numhash/numhash.c
index e186cd4..53d9e1b 100644
--- a/ext/-test-/st/numhash/numhash.c
+++ b/ext/-test-/st/numhash/numhash.c
@@ -54,7 +54,7 @@ numhash_i(st_data_t key, st_data_t value, st_data_t arg, int error)
 static VALUE
 numhash_each(VALUE self)
 {
-    return st_foreach((st_table *)DATA_PTR(self), numhash_i, self) ? Qtrue : Qfalse;
+    return st_foreach_check((st_table *)DATA_PTR(self), numhash_i, self, 0) ? Qtrue : Qfalse;
 }
 
 void
diff --git a/ext/objspace/objspace.c b/ext/objspace/objspace.c
index 66e33a3..4b31f92 100644
--- a/ext/objspace/objspace.c
+++ b/ext/objspace/objspace.c
@@ -60,20 +60,10 @@ memsize_of(VALUE obj)
 	break;
       case T_MODULE:
       case T_CLASS:
-	size += st_memsize(RCLASS_M_TBL(obj));
-	if (RCLASS_IV_TBL(obj)) {
-	    size += st_memsize(RCLASS_IV_TBL(obj));
-	}
-	if (RCLASS_IV_INDEX_TBL(obj)) {
-	    size += st_memsize(RCLASS_IV_INDEX_TBL(obj));
-	}
-	if (RCLASS(obj)->ptr->iv_tbl) {
-	    size += st_memsize(RCLASS(obj)->ptr->iv_tbl);
-	}
-	if (RCLASS(obj)->ptr->const_tbl) {
-	    size += st_memsize(RCLASS(obj)->ptr->const_tbl);
-	}
-	size += sizeof(rb_classext_t);
+	size += sa_memsize(RCLASS_M_TBL(obj));
+        size += sa_memsize(RCLASS_IV_TBL(obj));
+        size += sa_memsize(RCLASS_IV_INDEX_TBL(obj));
+        size += sa_memsize(RCLASS_CONST_TBL(obj));
 	break;
       case T_STRING:
 	size += rb_str_memsize(obj);
diff --git a/file.c b/file.c
index c1db6d7..3f465e5 100644
--- a/file.c
+++ b/file.c
@@ -148,40 +148,60 @@ file_path_convert(VALUE name)
     return name;
 }
 
-static VALUE
-rb_get_path_check(VALUE obj, int level)
+static rb_encoding *
+check_path_encoding(VALUE str)
+{
+    rb_encoding *enc = rb_enc_get(str);
+    if (!rb_enc_asciicompat(enc)) {
+	rb_raise(rb_eEncCompatError, "path name must be ASCII-compatible (%s): %s",
+		 rb_enc_name(enc), RSTRING_PTR(rb_str_inspect(str)));
+    }
+    return enc;
+}
+
+VALUE
+rb_get_path_check_to_string(VALUE obj, int level)
 {
     VALUE tmp;
     ID to_path;
-    rb_encoding *enc;
 
     if (insecure_obj_p(obj, level)) {
 	rb_insecure_operation();
     }
 
+    if (RB_TYPE_P(obj, T_STRING)) {
+	return obj;
+    }
     CONST_ID(to_path, "to_path");
     tmp = rb_check_funcall(obj, to_path, 0, 0);
     if (tmp == Qundef) {
 	tmp = obj;
     }
     StringValue(tmp);
+    return tmp;
+}
 
+VALUE
+rb_get_path_check_convert(VALUE obj, VALUE tmp, int level)
+{
     tmp = file_path_convert(tmp);
     if (obj != tmp && insecure_obj_p(tmp, level)) {
 	rb_insecure_operation();
     }
-    enc = rb_enc_get(tmp);
-    if (!rb_enc_asciicompat(enc)) {
-	tmp = rb_str_inspect(tmp);
-	rb_raise(rb_eEncCompatError, "path name must be ASCII-compatible (%s): %s",
-		 rb_enc_name(enc), RSTRING_PTR(tmp));
-    }
 
+    check_path_encoding(tmp);
     StringValueCStr(tmp);
 
     return rb_str_new4(tmp);
 }
 
+static VALUE
+rb_get_path_check(VALUE obj, int level)
+{
+    VALUE tmp = rb_get_path_check_to_string(obj, level);
+    return rb_get_path_check_convert(obj, tmp, level);
+}
+
 VALUE
 rb_get_path_no_checksafe(VALUE obj)
 {
@@ -3249,7 +3269,6 @@ rb_file_expand_path(VALUE fname, VALUE dname)
 VALUE
 rb_file_expand_path_fast(VALUE fname, VALUE dname)
 {
-    check_expand_path_args(fname, dname);
     return rb_file_expand_path_internal(fname, dname, 0, 0, EXPAND_PATH_BUFFER());
 }
 
@@ -5237,7 +5256,7 @@ rb_find_file_ext_safe(VALUE *filep, const char *const *ext, int safe_level)
 	rb_raise(rb_eSecurityError, "loading from non-absolute path %s", f);
     }
 
-    RB_GC_GUARD(load_path) = rb_get_load_path();
+    RB_GC_GUARD(load_path) = rb_get_expanded_load_path();
     if (!load_path) return 0;
 
     fname = rb_str_dup(*filep);
@@ -5302,7 +5321,7 @@ rb_find_file_safe(VALUE path, int safe_level)
 	rb_raise(rb_eSecurityError, "loading from non-absolute path %s", f);
     }
 
-    RB_GC_GUARD(load_path) = rb_get_load_path();
+    RB_GC_GUARD(load_path) = rb_get_expanded_load_path();
     if (load_path) {
 	long i;
 
diff --git a/gc.c b/gc.c
index e65d0ec..6a61610 100644
--- a/gc.c
+++ b/gc.c
@@ -20,10 +20,12 @@
 #include "vm_core.h"
 #include "internal.h"
 #include "gc.h"
+#include "pool_alloc.h"
 #include "constant.h"
 #include <stdio.h>
 #include <setjmp.h>
 #include <sys/types.h>
+#include <assert.h>
 
 #ifdef HAVE_SYS_TIME_H
 #include <sys/time.h>
@@ -35,7 +37,12 @@
 
 #if defined _WIN32 || defined __CYGWIN__
 #include <windows.h>
+#elif defined(HAVE_POSIX_MEMALIGN)
+#elif defined(HAVE_MEMALIGN)
+#include <malloc.h>
 #endif
+static void aligned_free(void *);
+static void *aligned_malloc(size_t alignment, size_t size);
 
 #ifdef HAVE_VALGRIND_MEMCHECK_H
 # include <valgrind/memcheck.h>
@@ -84,10 +91,12 @@ typedef struct {
     unsigned int initial_malloc_limit;
     unsigned int initial_heap_min_slots;
     unsigned int initial_free_min;
+#if defined(ENABLE_VM_OBJSPACE) && ENABLE_VM_OBJSPACE
     int gc_stress;
+#endif
 } ruby_gc_params_t;
 
-ruby_gc_params_t initial_params = {
+static ruby_gc_params_t initial_params = {
     GC_MALLOC_LIMIT,
     HEAP_MIN_SLOTS,
     FREE_MIN,
@@ -103,7 +112,10 @@ ruby_gc_params_t initial_params = {
 int ruby_gc_debug_indent = 0;
 
 /* for GC profile */
+#ifndef GC_PROFILE_MORE_DETAIL
 #define GC_PROFILE_MORE_DETAIL 0
+#endif
+
 typedef struct gc_profile_record {
     double gc_time;
     double gc_mark_time;
@@ -301,17 +313,20 @@ typedef struct RVALUE {
 #endif
 
 struct heaps_slot {
-    void *membase;
-    RVALUE *slot;
-    size_t limit;
+    struct heaps_header *membase;
+    RVALUE *freelist;
     struct heaps_slot *next;
     struct heaps_slot *prev;
+    struct heaps_slot *free_next;
+    uintptr_t bits[1];
 };
 
-struct sorted_heaps_slot {
+struct heaps_header {
+    struct heaps_slot *base;
+    uintptr_t *bits;
     RVALUE *start;
     RVALUE *end;
-    struct heaps_slot *slot;
+    size_t limit;
 };
 
 struct gc_list {
@@ -319,7 +334,27 @@ struct gc_list {
     struct gc_list *next;
 };
 
+#ifndef CALC_EXACT_MALLOC_SIZE
 #define CALC_EXACT_MALLOC_SIZE 0
+#endif
+
+#ifdef POOL_ALLOC_API
+/* POOL ALLOC API */
+#define POOL_ALLOC_PART 1
+#include "pool_alloc.inc.h"
+#undef POOL_ALLOC_PART
+
+typedef struct pool_layout_t pool_layout_t;
+struct pool_layout_t {
+    pool_header
+      p6,  /* st_table && st_table_entry */
+      p11;  /* st_table.bins init size */
+} pool_layout = {
+    INIT_POOL(void*[6]),
+    INIT_POOL(void*[11])
+};
+static void pool_finalize_header(pool_header *header);
+#endif
 
 typedef struct rb_objspace {
     struct {
@@ -330,16 +365,20 @@ typedef struct rb_objspace {
 	size_t allocations;
 #endif
     } malloc_params;
+#ifdef POOL_ALLOC_API
+    pool_layout_t *pool_headers;
+#endif
     struct {
 	size_t increment;
 	struct heaps_slot *ptr;
 	struct heaps_slot *sweep_slots;
-	struct sorted_heaps_slot *sorted;
+	struct heaps_slot *free_slots;
+	struct heaps_header **sorted;
 	size_t length;
 	size_t used;
-	RVALUE *freelist;
+        struct heaps_slot *reserve_slots;
 	RVALUE *range[2];
-	RVALUE *freed;
+	struct heaps_header *freed;
 	size_t live_num;
 	size_t free_num;
 	size_t free_min;
@@ -350,6 +389,7 @@ typedef struct rb_objspace {
 	int dont_gc;
 	int dont_lazy_sweep;
 	int during_gc;
+	rb_atomic_t finalizing;
     } flags;
     struct {
 	st_table *table;
@@ -377,7 +417,11 @@ typedef struct rb_objspace {
 #define ruby_initial_gc_stress	initial_params.gc_stress
 int *ruby_initial_gc_stress_ptr = &ruby_initial_gc_stress;
 #else
+#  ifdef POOL_ALLOC_API
+static rb_objspace_t rb_objspace = {{GC_MALLOC_LIMIT}, &pool_layout, {HEAP_MIN_SLOTS}};
+#  else
 static rb_objspace_t rb_objspace = {{GC_MALLOC_LIMIT}, {HEAP_MIN_SLOTS}};
+#  endif
 int *ruby_initial_gc_stress_ptr = &rb_objspace.gc_stress;
 #endif
 #define malloc_limit		objspace->malloc_params.limit
@@ -385,13 +429,13 @@ int *ruby_initial_gc_stress_ptr = &rb_objspace.gc_stress;
 #define heaps			objspace->heap.ptr
 #define heaps_length		objspace->heap.length
 #define heaps_used		objspace->heap.used
-#define freelist		objspace->heap.freelist
 #define lomem			objspace->heap.range[0]
 #define himem			objspace->heap.range[1]
 #define heaps_inc		objspace->heap.increment
 #define heaps_freed		objspace->heap.freed
 #define dont_gc 		objspace->flags.dont_gc
 #define during_gc		objspace->flags.during_gc
+#define finalizing		objspace->flags.finalizing
 #define finalizer_table 	objspace->final.table
 #define deferred_final_list	objspace->final.deferred
 #define mark_stack		objspace->markstack.buffer
@@ -403,7 +447,16 @@ int *ruby_initial_gc_stress_ptr = &rb_objspace.gc_stress;
 #define initial_heap_min_slots	initial_params.initial_heap_min_slots
 #define initial_free_min	initial_params.initial_free_min
 
+#define is_lazy_sweeping(objspace) ((objspace)->heap.sweep_slots != 0)
+
+#define nonspecial_obj_id(obj) (VALUE)((SIGNED_VALUE)(obj)|FIXNUM_FLAG)
+
+#define HEAP_HEADER(p) ((struct heaps_header *)(p))
+
 static void rb_objspace_call_finalizer(rb_objspace_t *objspace);
+static VALUE define_final0(VALUE obj, VALUE block);
+VALUE rb_define_final(VALUE obj, VALUE block);
+VALUE rb_undefine_final(VALUE obj);
 
 #if defined(ENABLE_VM_OBJSPACE) && ENABLE_VM_OBJSPACE
 rb_objspace_t *
@@ -413,6 +466,10 @@ rb_objspace_alloc(void)
     memset(objspace, 0, sizeof(*objspace));
     malloc_limit = initial_malloc_limit;
     ruby_gc_stress = ruby_initial_gc_stress;
+#ifdef POOL_ALLOC_API
+    objspace->pool_headers = (pool_layout_t*) malloc(sizeof(pool_layout));
+    memcpy(objspace->pool_headers, &pool_layout, sizeof(pool_layout));
+#endif
 
     return objspace;
 }
@@ -478,42 +535,62 @@ rb_objspace_free(rb_objspace_t *objspace)
 	struct gc_list *list, *next;
 	for (list = global_List; list; list = next) {
 	    next = list->next;
-	    free(list);
+	    xfree(list);
 	}
     }
+    if (objspace->heap.reserve_slots) {
+        struct heaps_slot *list, *next;
+        for (list = objspace->heap.reserve_slots; list; list = next) {
+            next = list->free_next;
+            free(list);
+        }
+    }
     if (objspace->heap.sorted) {
 	size_t i;
 	for (i = 0; i < heaps_used; ++i) {
-	    free(objspace->heap.sorted[i].slot->membase);
-	    free(objspace->heap.sorted[i].slot);
+            free(objspace->heap.sorted[i]->base);
+	    aligned_free(objspace->heap.sorted[i]);
 	}
 	free(objspace->heap.sorted);
 	heaps_used = 0;
 	heaps = 0;
     }
+#ifdef POOL_ALLOC_API
+    if (objspace->pool_headers) {
+        pool_finalize_header(&objspace->pool_headers->p6);
+        pool_finalize_header(&objspace->pool_headers->p11);
+        free(objspace->pool_headers);
+    }
+#endif
     free(objspace);
 }
 #endif
 
-/* tiny heap size */
-/* 32KB */
-/*#define HEAP_SIZE 0x8000 */
-/* 128KB */
-/*#define HEAP_SIZE 0x20000 */
-/* 64KB */
-/*#define HEAP_SIZE 0x10000 */
-/* 16KB */
-#define HEAP_SIZE 0x4000
-/* 8KB */
-/*#define HEAP_SIZE 0x2000 */
-/* 4KB */
-/*#define HEAP_SIZE 0x1000 */
-/* 2KB */
-/*#define HEAP_SIZE 0x800 */
-
-#define HEAP_OBJ_LIMIT (unsigned int)(HEAP_SIZE / sizeof(struct RVALUE))
-
-extern st_table *rb_class_tbl;
+#ifndef HEAP_ALIGN_LOG
+/* default tiny heap size: 16KB */
+#define HEAP_ALIGN_LOG 14
+#endif
+#define HEAP_ALIGN (1UL << HEAP_ALIGN_LOG)
+#define HEAP_ALIGN_MASK (~(~0UL << HEAP_ALIGN_LOG))
+#define REQUIRED_SIZE_BY_MALLOC (sizeof(size_t) * 5)
+#define HEAP_SIZE (HEAP_ALIGN - REQUIRED_SIZE_BY_MALLOC)
+#define CEILDIV(i, mod) (((i) + (mod) - 1)/(mod))
+
+#define HEAP_OBJ_LIMIT (unsigned int)((HEAP_SIZE - sizeof(struct heaps_header))/sizeof(struct RVALUE))
+#define HEAP_BITMAP_LIMIT CEILDIV(CEILDIV(HEAP_SIZE, sizeof(struct RVALUE)), sizeof(uintptr_t)*8)
+#define HEAP_SLOT_SIZE (sizeof(struct heaps_slot) + (HEAP_BITMAP_LIMIT-1) * sizeof(uintptr_t))
+
+#define GET_HEAP_HEADER(x) (HEAP_HEADER(((uintptr_t)x) & ~(HEAP_ALIGN_MASK)))
+#define GET_HEAP_SLOT(x) (GET_HEAP_HEADER(x)->base)
+#define GET_HEAP_BITMAP(x) (GET_HEAP_HEADER(x)->bits)
+#define NUM_IN_SLOT(p) (((uintptr_t)p & HEAP_ALIGN_MASK)/sizeof(RVALUE))
+#define BITMAP_INDEX(p) (NUM_IN_SLOT(p) / (sizeof(uintptr_t) * 8))
+#define BITMAP_OFFSET(p) (NUM_IN_SLOT(p) & ((sizeof(uintptr_t) * 8)-1))
+#define MARKED_IN_BITMAP(bits, p) (bits[BITMAP_INDEX(p)] & ((uintptr_t)1 << BITMAP_OFFSET(p)))
+#define MARK_IN_BITMAP(bits, p) (bits[BITMAP_INDEX(p)] = bits[BITMAP_INDEX(p)] | ((uintptr_t)1 << BITMAP_OFFSET(p)))
+#define CLEAR_IN_BITMAP(bits, p) (bits[BITMAP_INDEX(p)] &= ~((uintptr_t)1 << BITMAP_OFFSET(p)))
+
+extern sa_table rb_class_tbl;
 
 int ruby_disable_gc_stress = 0;
 
@@ -823,8 +900,10 @@ vm_xfree(rb_objspace_t *objspace, void *ptr)
     size_t size;
     ptr = ((size_t *)ptr) - 1;
     size = ((size_t*)ptr)[0];
-    objspace->malloc_params.allocated_size -= size;
-    objspace->malloc_params.allocations--;
+    if (size) {
+	objspace->malloc_params.allocated_size -= size;
+	objspace->malloc_params.allocations--;
+    }
 #endif
 
     free(ptr);
@@ -894,6 +973,27 @@ ruby_xfree(void *x)
 	vm_xfree(&rb_objspace, x);
 }
 
+#ifdef POOL_ALLOC_API
+/* POOL ALLOC API */
+#define POOL_ALLOC_PART 2
+#include "pool_alloc.inc.h"
+#undef POOL_ALLOC_PART
+
+void
+ruby_xpool_free(void *ptr)
+{
+    pool_free_entry((void**)ptr);
+}
+
+#define CONCRET_POOL_MALLOC(pnts) \
+void * ruby_xpool_malloc_##pnts##p () { \
+    return pool_alloc_entry(&rb_objspace.pool_headers->p##pnts ); \
+}
+CONCRET_POOL_MALLOC(6)
+CONCRET_POOL_MALLOC(11)
+#undef CONCRET_POOL_MALLOC
+
+#endif
 
 /*
  *  call-seq:
@@ -984,70 +1084,140 @@ rb_gc_unregister_address(VALUE *addr)
     }
 }
 
-
 static void
 allocate_sorted_heaps(rb_objspace_t *objspace, size_t next_heaps_length)
 {
-    struct sorted_heaps_slot *p;
-    size_t size;
+    struct heaps_header **p;
+    struct heaps_slot *slot;
+    size_t size, add, i;
 
-    size = next_heaps_length*sizeof(struct sorted_heaps_slot);
+    size = next_heaps_length*sizeof(struct heaps_header *);
+    add = next_heaps_length - heaps_used;
 
     if (heaps_used > 0) {
-	p = (struct sorted_heaps_slot *)realloc(objspace->heap.sorted, size);
+	p = (struct heaps_header **)realloc(objspace->heap.sorted, size);
 	if (p) objspace->heap.sorted = p;
     }
     else {
-	p = objspace->heap.sorted = (struct sorted_heaps_slot *)malloc(size);
+	p = objspace->heap.sorted = (struct heaps_header **)malloc(size);
     }
 
     if (p == 0) {
 	during_gc = 0;
 	rb_memerror();
     }
-    heaps_length = next_heaps_length;
+
+    for (i = 0; i < add; i++) {
+        slot = (struct heaps_slot *)malloc(HEAP_SLOT_SIZE);
+        if (slot == 0) {
+            during_gc = 0;
+            rb_memerror();
+            return;
+        }
+        slot->free_next = objspace->heap.reserve_slots;
+        objspace->heap.reserve_slots = slot;
+    }
+}
+
+static void *
+aligned_malloc(size_t alignment, size_t size)
+{
+    void *res;
+
+#if defined __MINGW32__
+    res = __mingw_aligned_malloc(size, alignment);
+#elif defined _WIN32 && !defined __CYGWIN__
+    res = _aligned_malloc(size, alignment);
+#elif defined(HAVE_POSIX_MEMALIGN)
+    if (posix_memalign(&res, alignment, size) == 0) {
+        return res;
+    }
+    else {
+        return NULL;
+    }
+#elif defined(HAVE_MEMALIGN)
+    res = memalign(alignment, size);
+#else
+    char* aligned;
+    res = malloc(alignment + size + sizeof(void*));
+    aligned = (char*)res + alignment + sizeof(void*);
+    aligned -= ((VALUE)aligned & (alignment - 1));
+    ((void**)aligned)[-1] = res;
+    res = (void*)aligned;
+#endif
+
+#if defined(_DEBUG) || defined(GC_DEBUG)
+    /* alignment must be a power of 2 */
+    assert((alignment - 1) & alignment == 0);
+    assert(alignment % sizeof(void*) == 0);
+#endif
+    return res;
+}
+
+static void
+aligned_free(void *ptr)
+{
+#if defined __MINGW32__
+    __mingw_aligned_free(ptr);
+#elif defined _WIN32 && !defined __CYGWIN__
+    _aligned_free(ptr);
+#elif defined(HAVE_MEMALIGN) || defined(HAVE_POSIX_MEMALIGN)
+    free(ptr);
+#else
+    free(((void**)ptr)[-1]);
+#endif
+}
+
+static void
+link_free_heap_slot(rb_objspace_t *objspace, struct heaps_slot *slot)
+{
+    slot->free_next = objspace->heap.free_slots;
+    objspace->heap.free_slots = slot;
+}
+
+static void
+unlink_free_heap_slot(rb_objspace_t *objspace, struct heaps_slot *slot)
+{
+    objspace->heap.free_slots = slot->free_next;
+    slot->free_next = NULL;
 }
 
 static void
 assign_heap_slot(rb_objspace_t *objspace)
 {
-    RVALUE *p, *pend, *membase;
+    RVALUE *p, *pend;
+    struct heaps_header *membase;
     struct heaps_slot *slot;
     size_t hi, lo, mid;
     size_t objs;
 
     objs = HEAP_OBJ_LIMIT;
-    p = (RVALUE*)malloc(HEAP_SIZE);
-    if (p == 0) {
-	during_gc = 0;
-	rb_memerror();
-    }
-    slot = (struct heaps_slot *)malloc(sizeof(struct heaps_slot));
-    if (slot == 0) {
-	xfree(p);
+    membase = (struct heaps_header*)aligned_malloc(HEAP_ALIGN, HEAP_SIZE);
+    if (membase == 0) {
 	during_gc = 0;
 	rb_memerror();
     }
+    assert(objspace->heap.reserve_slots != NULL);
+    slot = objspace->heap.reserve_slots;
+    objspace->heap.reserve_slots = slot->free_next;
     MEMZERO((void*)slot, struct heaps_slot, 1);
 
     slot->next = heaps;
     if (heaps) heaps->prev = slot;
     heaps = slot;
 
-    membase = p;
+    p = (RVALUE*)((VALUE)membase + sizeof(struct heaps_header));
     if ((VALUE)p % sizeof(RVALUE) != 0) {
-	p = (RVALUE*)((VALUE)p + sizeof(RVALUE) - ((VALUE)p % sizeof(RVALUE)));
-	if ((HEAP_SIZE - HEAP_OBJ_LIMIT * sizeof(RVALUE)) < (size_t)((char*)p - (char*)membase)) {
-	    objs--;
-	}
+       p = (RVALUE*)((VALUE)p + sizeof(RVALUE) - ((VALUE)p % sizeof(RVALUE)));
+       objs = (HEAP_SIZE - (size_t)((VALUE)p - (VALUE)membase))/sizeof(RVALUE);
     }
 
     lo = 0;
     hi = heaps_used;
     while (lo < hi) {
-	register RVALUE *mid_membase;
+	register struct heaps_header *mid_membase;
 	mid = (lo + hi) / 2;
-	mid_membase = objspace->heap.sorted[mid].slot->membase;
+        mid_membase = objspace->heap.sorted[mid];
 	if (mid_membase < membase) {
 	    lo = mid + 1;
 	}
@@ -1059,14 +1229,16 @@ assign_heap_slot(rb_objspace_t *objspace)
 	}
     }
     if (hi < heaps_used) {
-	MEMMOVE(&objspace->heap.sorted[hi+1], &objspace->heap.sorted[hi], struct sorted_heaps_slot, heaps_used - hi);
-    }
-    objspace->heap.sorted[hi].slot = slot;
-    objspace->heap.sorted[hi].start = p;
-    objspace->heap.sorted[hi].end = (p + objs);
+	MEMMOVE(&objspace->heap.sorted[hi+1], &objspace->heap.sorted[hi], struct heaps_header*, heaps_used - hi);
+    }
+    objspace->heap.sorted[hi] = membase;
+    membase->start = p;
+    membase->end = (p + objs);
+    membase->base = heaps;
+    membase->bits = heaps->bits;
+    membase->limit = objs;
     heaps->membase = membase;
-    heaps->slot = p;
-    heaps->limit = objs;
+    memset(heaps->bits, 0, HEAP_BITMAP_LIMIT * sizeof(uintptr_t));
     objspace->heap.free_num += objs;
     pend = p + objs;
     if (lomem == 0 || lomem > p) lomem = p;
@@ -1075,19 +1247,24 @@ assign_heap_slot(rb_objspace_t *objspace)
 
     while (p < pend) {
 	p->as.free.flags = 0;
-	p->as.free.next = freelist;
-	freelist = p;
+	p->as.free.next = heaps->freelist;
+	heaps->freelist = p;
 	p++;
     }
+    link_free_heap_slot(objspace, heaps);
 }
 
 static void
 add_heap_slots(rb_objspace_t *objspace, size_t add)
 {
     size_t i;
+    size_t next_heaps_length;
+
+    next_heaps_length = heaps_used + add;
 
-    if ((heaps_used + add) > heaps_length) {
-        allocate_sorted_heaps(objspace, heaps_used + add);
+    if (next_heaps_length > heaps_length) {
+        allocate_sorted_heaps(objspace, next_heaps_length);
+        heaps_length = next_heaps_length;
     }
 
     for (i = 0; i < add; i++) {
@@ -1137,6 +1314,7 @@ set_heaps_increment(rb_objspace_t *objspace)
 
     if (next_heaps_length > heaps_length) {
 	allocate_sorted_heaps(objspace, next_heaps_length);
+        heaps_length = next_heaps_length;
     }
 }
 
@@ -1159,6 +1337,7 @@ rb_during_gc(void)
 }
 
 #define RANY(o) ((RVALUE*)(o))
+#define has_free_object (objspace->heap.free_slots && objspace->heap.free_slots->freelist)
 
 VALUE
 rb_newobj(void)
@@ -1179,15 +1358,18 @@ rb_newobj(void)
 	}
     }
 
-    if (UNLIKELY(!freelist)) {
+    if (UNLIKELY(!has_free_object)) {
 	if (!gc_lazy_sweep(objspace)) {
 	    during_gc = 0;
 	    rb_memerror();
 	}
     }
 
-    obj = (VALUE)freelist;
-    freelist = freelist->as.free.next;
+    obj = (VALUE)objspace->heap.free_slots->freelist;
+    objspace->heap.free_slots->freelist = RANY(obj)->as.free.next;
+    if (objspace->heap.free_slots->freelist == NULL) {
+        unlink_free_heap_slot(objspace, objspace->heap.free_slots);
+    }
 
     MEMZERO((void*)obj, RVALUE, 1);
 #ifdef GC_DEBUG
@@ -1356,10 +1538,10 @@ gc_mark_all(rb_objspace_t *objspace)
 
     init_mark_stack(objspace);
     for (i = 0; i < heaps_used; i++) {
-	p = objspace->heap.sorted[i].start; pend = objspace->heap.sorted[i].end;
+	p = objspace->heap.sorted[i]->start; pend = objspace->heap.sorted[i]->end;
 	while (p < pend) {
-	    if ((p->as.basic.flags & FL_MARK) &&
-		(p->as.basic.flags != FL_MARK)) {
+	    if (MARKED_IN_BITMAP(GET_HEAP_BITMAP(p), p) &&
+		p->as.basic.flags) {
 		gc_mark_children(objspace, (VALUE)p, 0);
 	    }
 	    p++;
@@ -1387,26 +1569,27 @@ static inline int
 is_pointer_to_heap(rb_objspace_t *objspace, void *ptr)
 {
     register RVALUE *p = RANY(ptr);
-    register struct sorted_heaps_slot *heap;
+    register struct heaps_header *heap;
     register size_t hi, lo, mid;
 
     if (p < lomem || p > himem) return FALSE;
     if ((VALUE)p % sizeof(RVALUE) != 0) return FALSE;
+    heap = GET_HEAP_HEADER(p);
 
     /* check if p looks like a pointer using bsearch*/
     lo = 0;
     hi = heaps_used;
     while (lo < hi) {
 	mid = (lo + hi) / 2;
-	heap = &objspace->heap.sorted[mid];
-	if (heap->start <= p) {
-	    if (p < heap->end)
-		return TRUE;
-	    lo = mid + 1;
-	}
-	else {
-	    hi = mid;
-	}
+        if (heap > objspace->heap.sorted[mid]) {
+            lo = mid + 1;
+        }
+        else if (heap < objspace->heap.sorted[mid]) {
+            hi = mid;
+        }
+        else {
+            return (p >= heap->start && p < heap->end) ? TRUE : FALSE;
+        }
     }
     return FALSE;
 }
@@ -1449,10 +1632,10 @@ struct mark_tbl_arg {
 };
 
 static int
-mark_entry(ID key, VALUE value, st_data_t data)
+mark_entry(st_data_t key, st_data_t value, st_data_t data)
 {
     struct mark_tbl_arg *arg = (void*)data;
-    gc_mark(arg->objspace, value, arg->lev);
+    gc_mark(arg->objspace, (VALUE)value, arg->lev);
     return ST_CONTINUE;
 }
 
@@ -1466,11 +1649,20 @@ mark_tbl(rb_objspace_t *objspace, st_table *tbl, int lev)
     st_foreach(tbl, mark_entry, (st_data_t)&arg);
 }
 
+static void
+mark_sa_tbl(rb_objspace_t *objspace, sa_table *tbl, int lev)
+{
+    if (!tbl) return;
+    SA_FOREACH_START(tbl);
+    gc_mark(objspace, (VALUE)value, lev);
+    SA_FOREACH_END();
+}
+
 static int
-mark_key(VALUE key, VALUE value, st_data_t data)
+mark_key(st_data_t key, st_data_t value, st_data_t data)
 {
     struct mark_tbl_arg *arg = (void*)data;
-    gc_mark(arg->objspace, key, arg->lev);
+    gc_mark(arg->objspace, (VALUE)key, arg->lev);
     return ST_CONTINUE;
 }
 
@@ -1491,11 +1683,11 @@ rb_mark_set(st_table *tbl)
 }
 
 static int
-mark_keyvalue(VALUE key, VALUE value, st_data_t data)
+mark_keyvalue(st_data_t key, st_data_t value, st_data_t data)
 {
     struct mark_tbl_arg *arg = (void*)data;
-    gc_mark(arg->objspace, key, arg->lev);
-    gc_mark(arg->objspace, value, arg->lev);
+    gc_mark(arg->objspace, (VALUE)key, arg->lev);
+    gc_mark(arg->objspace, (VALUE)value, arg->lev);
     return ST_CONTINUE;
 }
 
@@ -1544,74 +1736,52 @@ rb_mark_method_entry(const rb_method_entry_t *me)
     mark_method_entry(&rb_objspace, me, 0);
 }
 
-static int
-mark_method_entry_i(ID key, const rb_method_entry_t *me, st_data_t data)
-{
-    struct mark_tbl_arg *arg = (void*)data;
-    mark_method_entry(arg->objspace, me, arg->lev);
-    return ST_CONTINUE;
-}
-
 static void
-mark_m_tbl(rb_objspace_t *objspace, st_table *tbl, int lev)
-{
-    struct mark_tbl_arg arg;
-    if (!tbl) return;
-    arg.objspace = objspace;
-    arg.lev = lev;
-    st_foreach(tbl, mark_method_entry_i, (st_data_t)&arg);
-}
-
-static int
-free_method_entry_i(ID key, rb_method_entry_t *me, st_data_t data)
+mark_m_tbl(rb_objspace_t *objspace, sa_table *tbl, int lev)
 {
-    rb_free_method_entry(me);
-    return ST_CONTINUE;
+    SA_FOREACH_START(tbl);
+    mark_method_entry(objspace, (const rb_method_entry_t*)value, lev);
+    SA_FOREACH_END();
 }
 
 void
-rb_free_m_table(st_table *tbl)
-{
-    st_foreach(tbl, free_method_entry_i, 0);
-    st_free_table(tbl);
-}
-
-static int
-mark_const_entry_i(ID key, const rb_const_entry_t *ce, st_data_t data)
+rb_free_m_table(sa_table *tbl)
 {
-    struct mark_tbl_arg *arg = (void*)data;
-    gc_mark(arg->objspace, ce->value, arg->lev);
-    return ST_CONTINUE;
+    SA_FOREACH_START(tbl);
+    if (!((rb_method_entry_t*)value)->mark) {
+	rb_free_method_entry((rb_method_entry_t*)value);
+    }
+    SA_FOREACH_END();
+    sa_clear(tbl);
 }
 
 static void
-mark_const_tbl(rb_objspace_t *objspace, st_table *tbl, int lev)
+mark_const_tbl(rb_objspace_t *objspace, sa_table *tbl, int lev)
 {
-    struct mark_tbl_arg arg;
-    if (!tbl) return;
-    arg.objspace = objspace;
-    arg.lev = lev;
-    st_foreach(tbl, mark_const_entry_i, (st_data_t)&arg);
+    SA_FOREACH_START(tbl);
+    gc_mark(objspace, ((const rb_const_entry_t*)value)->value, lev);
+    SA_FOREACH_END();
 }
 
-static int
-free_const_entry_i(ID key, rb_const_entry_t *ce, st_data_t data)
+void
+rb_free_const_table(sa_table *tbl)
 {
-    xfree(ce);
-    return ST_CONTINUE;
+    SA_FOREACH_START(tbl);
+    xfree((rb_const_entry_t*)value);
+    SA_FOREACH_END();
+    sa_clear(tbl);
 }
 
 void
-rb_free_const_table(st_table *tbl)
+rb_mark_tbl(st_table *tbl)
 {
-    st_foreach(tbl, free_const_entry_i, 0);
-    st_free_table(tbl);
+    mark_tbl(&rb_objspace, tbl, 0);
 }
 
 void
-rb_mark_tbl(st_table *tbl)
+rb_mark_sa_tbl(sa_table *tbl)
 {
-    mark_tbl(&rb_objspace, tbl, 0);
+    mark_sa_tbl(&rb_objspace, tbl, 0);
 }
 
 void
@@ -1622,6 +1792,16 @@ rb_gc_mark_maybe(VALUE obj)
     }
 }
 
+static int
+gc_mark_ptr(rb_objspace_t *objspace, VALUE ptr)
+{
+    register uintptr_t *bits = GET_HEAP_BITMAP(ptr);
+    if (MARKED_IN_BITMAP(bits, ptr)) return 0;
+    MARK_IN_BITMAP(bits, ptr);
+    objspace->heap.live_num++;
+    return 1;
+}
+
 static void
 gc_mark(rb_objspace_t *objspace, VALUE ptr, int lev)
 {
@@ -1630,9 +1810,7 @@ gc_mark(rb_objspace_t *objspace, VALUE ptr, int lev)
     obj = RANY(ptr);
     if (rb_special_const_p(ptr)) return; /* special const not marked */
     if (obj->as.basic.flags == 0) return;       /* free cell */
-    if (obj->as.basic.flags & FL_MARK) return;  /* already marked */
-    obj->as.basic.flags |= FL_MARK;
-    objspace->heap.live_num++;
+    if (!gc_mark_ptr(objspace, ptr)) return;	/* already marked */
 
     if (lev > GC_LEVEL_MAX || (lev == 0 && stack_check(STACKFRAME_FOR_GC_MARK))) {
 	if (!mark_stack_overflow) {
@@ -1659,6 +1837,7 @@ static void
 gc_mark_children(rb_objspace_t *objspace, VALUE ptr, int lev)
 {
     register RVALUE *obj = RANY(ptr);
+    register uintptr_t *bits;
 
     goto marking;		/* skip */
 
@@ -1666,8 +1845,9 @@ gc_mark_children(rb_objspace_t *objspace, VALUE ptr, int lev)
     obj = RANY(ptr);
     if (rb_special_const_p(ptr)) return; /* special const not marked */
     if (obj->as.basic.flags == 0) return;       /* free cell */
-    if (obj->as.basic.flags & FL_MARK) return;  /* already marked */
-    obj->as.basic.flags |= FL_MARK;
+    bits = GET_HEAP_BITMAP(ptr);
+    if (MARKED_IN_BITMAP(bits, ptr)) return;  /* already marked */
+    MARK_IN_BITMAP(bits, ptr);
     objspace->heap.live_num++;
 
   marking:
@@ -1819,10 +1999,10 @@ gc_mark_children(rb_objspace_t *objspace, VALUE ptr, int lev)
       case T_CLASS:
       case T_MODULE:
 	mark_m_tbl(objspace, RCLASS_M_TBL(obj), lev);
-	mark_tbl(objspace, RCLASS_IV_TBL(obj), lev);
+	mark_sa_tbl(objspace, RCLASS_IV_TBL(obj), lev);
 	mark_const_tbl(objspace, RCLASS_CONST_TBL(obj), lev);
 	ptr = RCLASS_SUPER(obj);
-	goto again;
+	goto again; 
 
       case T_ARRAY:
 	if (FL_TEST(obj, ELTS_SHARED)) {
@@ -1929,13 +2109,18 @@ gc_mark_children(rb_objspace_t *objspace, VALUE ptr, int lev)
 
 static int obj_free(rb_objspace_t *, VALUE);
 
-static inline void
-add_freelist(rb_objspace_t *objspace, RVALUE *p)
+static inline struct heaps_slot *
+add_slot_local_freelist(rb_objspace_t *objspace, RVALUE *p)
 {
+    struct heaps_slot *slot;
+
     VALGRIND_MAKE_MEM_UNDEFINED((void*)p, sizeof(RVALUE));
     p->as.free.flags = 0;
-    p->as.free.next = freelist;
-    freelist = p;
+    slot = GET_HEAP_SLOT(p);
+    p->as.free.next = slot->freelist;
+    slot->freelist = p;
+
+    return slot;
 }
 
 static void
@@ -1945,17 +2130,13 @@ finalize_list(rb_objspace_t *objspace, RVALUE *p)
 	RVALUE *tmp = p->as.free.next;
 	run_final(objspace, (VALUE)p);
 	if (!FL_TEST(p, FL_SINGLETON)) { /* not freeing page */
-            if (objspace->heap.sweep_slots) {
-                p->as.free.flags = 0;
-            }
-            else {
+            add_slot_local_freelist(objspace, p);
+            if (!is_lazy_sweeping(objspace)) {
                 GC_PROF_DEC_LIVE_NUM;
-                add_freelist(objspace, p);
             }
 	}
 	else {
-	    struct heaps_slot *slot = (struct heaps_slot *)(VALUE)RDATA(p)->dmark;
-	    slot->limit--;
+            GET_HEAP_HEADER(p)->limit--;
 	}
 	p = tmp;
     }
@@ -1976,22 +2157,23 @@ unlink_heap_slot(rb_objspace_t *objspace, struct heaps_slot *slot)
     slot->next = NULL;
 }
 
-
 static void
 free_unused_heaps(rb_objspace_t *objspace)
 {
     size_t i, j;
-    RVALUE *last = 0;
+    struct heaps_header *last = 0;
 
     for (i = j = 1; j < heaps_used; i++) {
-	if (objspace->heap.sorted[i].slot->limit == 0) {
+	if (objspace->heap.sorted[i]->limit == 0) {
+            struct heaps_slot* h = objspace->heap.sorted[i]->base;
+            h->free_next = objspace->heap.reserve_slots;
+            objspace->heap.reserve_slots = h;
 	    if (!last) {
-		last = objspace->heap.sorted[i].slot->membase;
+                last = objspace->heap.sorted[i];
 	    }
 	    else {
-		free(objspace->heap.sorted[i].slot->membase);
+		aligned_free(objspace->heap.sorted[i]);
 	    }
-            free(objspace->heap.sorted[i].slot);
 	    heaps_used--;
 	}
 	else {
@@ -2003,70 +2185,84 @@ free_unused_heaps(rb_objspace_t *objspace)
     }
     if (last) {
 	if (last < heaps_freed) {
-	    free(heaps_freed);
+	    aligned_free(heaps_freed);
 	    heaps_freed = last;
 	}
 	else {
-	    free(last);
+	    aligned_free(last);
 	}
     }
 }
 
 static void
+gc_clear_slot_bits(struct heaps_slot *slot)
+{
+    memset(slot->bits, 0, HEAP_BITMAP_LIMIT * sizeof(uintptr_t));
+}
+
+static void
 slot_sweep(rb_objspace_t *objspace, struct heaps_slot *sweep_slot)
 {
     size_t free_num = 0, final_num = 0;
     RVALUE *p, *pend;
-    RVALUE *free = freelist, *final = deferred_final_list;
+    RVALUE *final = deferred_final_list;
     int deferred;
+    uintptr_t *bits;
 
-    p = sweep_slot->slot; pend = p + sweep_slot->limit;
+    p = sweep_slot->membase->start; pend = sweep_slot->membase->end;
+    bits = sweep_slot->bits;
     while (p < pend) {
-        if (!(p->as.basic.flags & FL_MARK)) {
-            if (p->as.basic.flags &&
-                ((deferred = obj_free(objspace, (VALUE)p)) ||
-		 (FL_TEST(p, FL_FINALIZE)))) {
-                if (!deferred) {
-                    p->as.free.flags = T_ZOMBIE;
-                    RDATA(p)->dfree = 0;
+        if ((!(MARKED_IN_BITMAP(bits, p))) && BUILTIN_TYPE(p) != T_ZOMBIE) {
+            if (p->as.basic.flags) {
+                if ((deferred = obj_free(objspace, (VALUE)p)) ||
+                    (FL_TEST(p, FL_FINALIZE))) {
+                    if (!deferred) {
+                        p->as.free.flags = T_ZOMBIE;
+                        RDATA(p)->dfree = 0;
+                    }
+                    p->as.free.next = deferred_final_list;
+                    deferred_final_list = p;
+                    assert(BUILTIN_TYPE(p) == T_ZOMBIE);
+                    final_num++;
+                }
+                else {
+                    VALGRIND_MAKE_MEM_UNDEFINED((void*)p, sizeof(RVALUE));
+                    p->as.free.flags = 0;
+                    p->as.free.next = sweep_slot->freelist;
+                    sweep_slot->freelist = p;
+                    free_num++;
                 }
-                p->as.free.flags |= FL_MARK;
-                p->as.free.next = deferred_final_list;
-                deferred_final_list = p;
-                final_num++;
             }
             else {
-                add_freelist(objspace, p);
                 free_num++;
             }
         }
-        else if (BUILTIN_TYPE(p) == T_ZOMBIE) {
-            /* objects to be finalized */
-            /* do nothing remain marked */
-        }
-        else {
-            RBASIC(p)->flags &= ~FL_MARK;
-        }
         p++;
     }
-    if (final_num + free_num == sweep_slot->limit &&
+    gc_clear_slot_bits(sweep_slot);
+    if (final_num + free_num == sweep_slot->membase->limit &&
         objspace->heap.free_num > objspace->heap.do_heap_free) {
         RVALUE *pp;
 
         for (pp = deferred_final_list; pp != final; pp = pp->as.free.next) {
-	    RDATA(pp)->dmark = (void (*)(void *))(VALUE)sweep_slot;
+	    RDATA(pp)->dmark = 0;
             pp->as.free.flags |= FL_SINGLETON; /* freeing page mark */
         }
-        sweep_slot->limit = final_num;
-        freelist = free;	/* cancel this page from freelist */
+        sweep_slot->membase->limit = final_num;
         unlink_heap_slot(objspace, sweep_slot);
     }
     else {
+        if (free_num > 0) {
+            link_free_heap_slot(objspace, sweep_slot);
+        }
+        else {
+            sweep_slot->free_next = NULL;
+        }
         objspace->heap.free_num += free_num;
     }
     objspace->heap.final_num += final_num;
 
-    if (deferred_final_list) {
+    if (deferred_final_list && !finalizing) {
         rb_thread_t *th = GET_THREAD();
         if (th) {
             RUBY_VM_SET_FINALIZER_INTERRUPT(th);
@@ -2078,7 +2274,7 @@ static int
 ready_to_gc(rb_objspace_t *objspace)
 {
     if (dont_gc || during_gc) {
-	if (!freelist) {
+	if (!has_free_object) {
             if (!heaps_increment(objspace)) {
                 set_heaps_increment(objspace);
                 heaps_increment(objspace);
@@ -2092,7 +2288,6 @@ ready_to_gc(rb_objspace_t *objspace)
 static void
 before_gc_sweep(rb_objspace_t *objspace)
 {
-    freelist = 0;
     objspace->heap.do_heap_free = (size_t)((heaps_used * HEAP_OBJ_LIMIT) * 0.65);
     objspace->heap.free_min = (size_t)((heaps_used * HEAP_OBJ_LIMIT)  * 0.2);
     if (objspace->heap.free_min < initial_free_min) {
@@ -2101,6 +2296,7 @@ before_gc_sweep(rb_objspace_t *objspace)
     }
     objspace->heap.sweep_slots = heaps;
     objspace->heap.free_num = 0;
+    objspace->heap.free_slots = NULL;
 
     /* sweep unlinked method entries */
     if (GET_VM()->unlinked_method_entry_list) {
@@ -2137,7 +2333,7 @@ lazy_sweep(rb_objspace_t *objspace)
         next = objspace->heap.sweep_slots->next;
 	slot_sweep(objspace, objspace->heap.sweep_slots);
         objspace->heap.sweep_slots = next;
-        if (freelist) {
+        if (has_free_object) {
             during_gc = 0;
             return TRUE;
         }
@@ -2149,10 +2345,10 @@ static void
 rest_sweep(rb_objspace_t *objspace)
 {
     if (objspace->heap.sweep_slots) {
-       while (objspace->heap.sweep_slots) {
-           lazy_sweep(objspace);
-       }
-       after_gc_sweep(objspace);
+	while (objspace->heap.sweep_slots) {
+	    lazy_sweep(objspace);
+	}
+	after_gc_sweep(objspace);
     }
 }
 
@@ -2199,9 +2395,9 @@ gc_lazy_sweep(rb_objspace_t *objspace)
     }
 
     GC_PROF_SWEEP_TIMER_START;
-    if(!(res = lazy_sweep(objspace))) {
+    if (!(res = lazy_sweep(objspace))) {
         after_gc_sweep(objspace);
-        if(freelist) {
+        if (has_free_object) {
             res = TRUE;
             during_gc = 0;
         }
@@ -2234,12 +2430,17 @@ void
 rb_gc_force_recycle(VALUE p)
 {
     rb_objspace_t *objspace = &rb_objspace;
-    GC_PROF_DEC_LIVE_NUM;
-    if (RBASIC(p)->flags & FL_MARK) {
-        RANY(p)->as.free.flags = 0;
+    struct heaps_slot *slot;
+
+    if (MARKED_IN_BITMAP(GET_HEAP_BITMAP(p), p)) {
+        add_slot_local_freelist(objspace, (RVALUE *)p);
     }
     else {
-        add_freelist(objspace, (RVALUE *)p);
+        GC_PROF_DEC_LIVE_NUM;
+        slot = add_slot_local_freelist(objspace, (RVALUE *)p);
+        if (slot->free_next == NULL) {
+            link_free_heap_slot(objspace, slot);
+        }
     }
 }
 
@@ -2286,15 +2487,11 @@ obj_free(rb_objspace_t *objspace, VALUE obj)
       case T_CLASS:
 	rb_clear_cache_by_class((VALUE)obj);
 	rb_free_m_table(RCLASS_M_TBL(obj));
-	if (RCLASS_IV_TBL(obj)) {
-	    st_free_table(RCLASS_IV_TBL(obj));
-	}
-	if (RCLASS_CONST_TBL(obj)) {
-	    rb_free_const_table(RCLASS_CONST_TBL(obj));
-	}
-	if (RCLASS_IV_INDEX_TBL(obj)) {
-	    st_free_table(RCLASS_IV_INDEX_TBL(obj));
-	}
+        sa_clear(RCLASS_IV_TBL(obj));
+        rb_free_const_table(RCLASS_CONST_TBL(obj));
+        sa_clear(RCLASS_IV_INDEX_TBL(obj));
+        sa_clear(&RCLASS(obj)->cache->m_cache_tbl);
+        xfree(RCLASS(obj)->cache);
         xfree(RANY(obj)->as.klass.ptr);
 	break;
       case T_STRING:
@@ -2346,8 +2543,9 @@ obj_free(rb_objspace_t *objspace, VALUE obj)
       case T_COMPLEX:
 	break;
       case T_ICLASS:
+        sa_clear(&RCLASS(obj)->cache->m_cache_tbl);
+        xfree(RCLASS(obj)->cache);
 	/* iClass shares table with the module */
-	xfree(RANY(obj)->as.klass.ptr);
 	break;
 
       case T_FLOAT:
@@ -2458,7 +2656,7 @@ gc_marks(rb_objspace_t *objspace)
     rb_mark_end_proc();
     rb_gc_mark_global_tbl();
 
-    mark_tbl(objspace, rb_class_tbl, 0);
+    mark_sa_tbl(objspace, &rb_class_tbl, 0);
 
     /* mark generic instance variables for special constants */
     rb_mark_generic_ivar_tbl();
@@ -2611,7 +2809,7 @@ static VALUE
 objspace_each_objects(VALUE arg)
 {
     size_t i;
-    RVALUE *membase = 0;
+    struct heaps_header *membase = 0;
     RVALUE *pstart, *pend;
     rb_objspace_t *objspace = &rb_objspace;
     struct each_obj_args *args = (struct each_obj_args *)arg;
@@ -2619,16 +2817,16 @@ objspace_each_objects(VALUE arg)
 
     i = 0;
     while (i < heaps_used) {
-	while (0 < i && (uintptr_t)membase < (uintptr_t)objspace->heap.sorted[i-1].slot->membase)
+	while (0 < i && membase < objspace->heap.sorted[i-1])
 	    i--;
-	while (i < heaps_used && (uintptr_t)objspace->heap.sorted[i].slot->membase <= (uintptr_t)membase)
+	while (i < heaps_used && objspace->heap.sorted[i] <= membase)
 	    i++;
 	if (heaps_used <= i)
 	  break;
-	membase = objspace->heap.sorted[i].slot->membase;
+	membase = objspace->heap.sorted[i];
 
-	pstart = objspace->heap.sorted[i].slot->slot;
-	pend = pstart + objspace->heap.sorted[i].slot->limit;
+	pstart = membase->start;
+	pend = membase->end;
 
 	for (; pstart != pend; pstart++) {
 	    if (pstart->as.basic.flags) {
@@ -2642,6 +2840,7 @@ objspace_each_objects(VALUE arg)
 	    }
 	}
     }
+    RB_GC_GUARD(v);
 
     return Qnil;
 }
@@ -2885,11 +3084,12 @@ run_single_final(VALUE arg)
 }
 
 static void
-run_finalizer(rb_objspace_t *objspace, VALUE objid, VALUE table)
+run_finalizer(rb_objspace_t *objspace, VALUE obj, VALUE table)
 {
     long i;
     int status;
     VALUE args[3];
+    VALUE objid = nonspecial_obj_id(obj);
 
     if (RARRAY_LEN(table) > 0) {
 	args[1] = rb_obj_freeze(rb_ary_new3(1, objid));
@@ -2913,13 +3113,11 @@ run_finalizer(rb_objspace_t *objspace, VALUE objid, VALUE table)
 static void
 run_final(rb_objspace_t *objspace, VALUE obj)
 {
-    VALUE objid;
     RUBY_DATA_FUNC free_func = 0;
     st_data_t key, table;
 
     objspace->heap.final_num--;
 
-    objid = rb_obj_id(obj);	/* make obj into id */
     RBASIC(obj)->klass = 0;
 
     if (RTYPEDDATA_P(obj)) {
@@ -2934,7 +3132,7 @@ run_final(rb_objspace_t *objspace, VALUE obj)
 
     key = (st_data_t)obj;
     if (st_delete(finalizer_table, &key, &table)) {
-	run_finalizer(objspace, objid, (VALUE)table);
+	run_finalizer(objspace, obj, (VALUE)table);
     }
 }
 
@@ -2952,16 +3150,20 @@ finalize_deferred(rb_objspace_t *objspace)
 void
 rb_gc_finalize_deferred(void)
 {
-    finalize_deferred(&rb_objspace);
+    rb_objspace_t *objspace = &rb_objspace;
+    if (ATOMIC_EXCHANGE(finalizing, 1)) return;
+    finalize_deferred(objspace);
+    ATOMIC_SET(finalizing, 0);
 }
 
 static int
 chain_finalized_object(st_data_t key, st_data_t val, st_data_t arg)
 {
     RVALUE *p = (RVALUE *)key, **final_list = (RVALUE **)arg;
-    if ((p->as.basic.flags & (FL_FINALIZE|FL_MARK)) == FL_FINALIZE) {
+    if ((p->as.basic.flags & FL_FINALIZE) == FL_FINALIZE &&
+        !MARKED_IN_BITMAP(GET_HEAP_BITMAP(p), p)) {
 	if (BUILTIN_TYPE(p) != T_ZOMBIE) {
-	    p->as.free.flags = FL_MARK | T_ZOMBIE; /* remain marked */
+	    p->as.free.flags = T_ZOMBIE;
 	    RDATA(p)->dfree = 0;
 	}
 	p->as.free.next = *final_list;
@@ -3004,6 +3206,8 @@ rb_objspace_call_finalizer(rb_objspace_t *objspace)
     /* run finalizers */
     rest_sweep(objspace);
 
+    if (ATOMIC_EXCHANGE(finalizing, 1)) return;
+
     do {
 	/* XXX: this loop will make no sense */
 	/* because mark will not be removed */
@@ -3018,8 +3222,9 @@ rb_objspace_call_finalizer(rb_objspace_t *objspace)
 	st_foreach(finalizer_table, force_chain_object, (st_data_t)&list);
 	while (list) {
 	    struct force_finalize_list *curr = list;
-	    run_finalizer(objspace, rb_obj_id(curr->obj), curr->table);
-	    st_delete(finalizer_table, (st_data_t*)&curr->obj, 0);
+	    st_data_t obj = (st_data_t)curr->obj;
+	    run_finalizer(objspace, curr->obj, curr->table);
+	    st_delete(finalizer_table, &obj, 0);
 	    list = curr->next;
 	    xfree(curr);
 	}
@@ -3030,7 +3235,7 @@ rb_objspace_call_finalizer(rb_objspace_t *objspace)
 
     /* run data object's finalizers */
     for (i = 0; i < heaps_used; i++) {
-	p = objspace->heap.sorted[i].start; pend = objspace->heap.sorted[i].end;
+	p = objspace->heap.sorted[i]->start; pend = objspace->heap.sorted[i]->end;
 	while (p < pend) {
 	    if (BUILTIN_TYPE(p) == T_DATA &&
 		DATA_PTR(p) && RANY(p)->as.data.dfree &&
@@ -3066,6 +3271,7 @@ rb_objspace_call_finalizer(rb_objspace_t *objspace)
 
     st_free_table(finalizer_table);
     finalizer_table = 0;
+    ATOMIC_SET(finalizing, 0);
 }
 
 void
@@ -3073,10 +3279,42 @@ rb_gc(void)
 {
     rb_objspace_t *objspace = &rb_objspace;
     garbage_collect(objspace);
-    finalize_deferred(objspace);
+    if (!finalizing) finalize_deferred(objspace);
     free_unused_heaps(objspace);
 }
 
+static inline int
+is_id_value(rb_objspace_t *objspace, VALUE ptr)
+{
+    if (!is_pointer_to_heap(objspace, (void *)ptr)) return FALSE;
+    if (BUILTIN_TYPE(ptr) > T_FIXNUM) return FALSE;
+    if (BUILTIN_TYPE(ptr) == T_ICLASS) return FALSE;
+    return TRUE;
+}
+
+static inline int
+is_dead_object(rb_objspace_t *objspace, VALUE ptr)
+{
+    struct heaps_slot *slot = objspace->heap.sweep_slots;
+    if (!is_lazy_sweeping(objspace) || MARKED_IN_BITMAP(GET_HEAP_BITMAP(ptr), ptr))
+	return FALSE;
+    while (slot) {
+	if ((VALUE)slot->membase->start <= ptr && ptr < (VALUE)(slot->membase->end))
+	    return TRUE;
+	slot = slot->next;
+    }
+    return FALSE;
+}
+
+static inline int
+is_live_object(rb_objspace_t *objspace, VALUE ptr)
+{
+    if (BUILTIN_TYPE(ptr) == 0) return FALSE;
+    if (RBASIC(ptr)->klass == 0) return FALSE;
+    if (is_dead_object(objspace, ptr)) return FALSE;
+    return TRUE;
+}
+
 /*
  *  call-seq:
  *     ObjectSpace._id2ref(object_id) -> an_object
@@ -3119,11 +3357,10 @@ id2ref(VALUE obj, VALUE objid)
 	return ID2SYM(symid);
     }
 
-    if (!is_pointer_to_heap(objspace, (void *)ptr) ||
-	BUILTIN_TYPE(ptr) > T_FIXNUM || BUILTIN_TYPE(ptr) == T_ICLASS) {
+    if (!is_id_value(objspace, ptr)) {
 	rb_raise(rb_eRangeError, "%p is not id value", p0);
     }
-    if (BUILTIN_TYPE(ptr) == 0 || RBASIC(ptr)->klass == 0) {
+    if (!is_live_object(objspace, ptr)) {
 	rb_raise(rb_eRangeError, "%p is recycled object", p0);
     }
     return (VALUE)ptr;
@@ -3193,7 +3430,7 @@ rb_obj_id(VALUE obj)
     if (SPECIAL_CONST_P(obj)) {
         return LONG2NUM((SIGNED_VALUE)obj);
     }
-    return (VALUE)((SIGNED_VALUE)obj|FIXNUM_FLAG);
+    return nonspecial_obj_id(obj);
 }
 
 static int
@@ -3236,7 +3473,7 @@ count_objects(int argc, VALUE *argv, VALUE os)
     VALUE hash;
 
     if (rb_scan_args(argc, argv, "01", &hash) == 1) {
-        if (TYPE(hash) != T_HASH)
+        if (!RB_TYPE_P(hash, T_HASH))
             rb_raise(rb_eTypeError, "non-hash given");
     }
 
@@ -3247,7 +3484,7 @@ count_objects(int argc, VALUE *argv, VALUE os)
     for (i = 0; i < heaps_used; i++) {
         RVALUE *p, *pend;
 
-        p = objspace->heap.sorted[i].start; pend = objspace->heap.sorted[i].end;
+        p = objspace->heap.sorted[i]->start; pend = objspace->heap.sorted[i]->end;
         for (;p < pend; p++) {
             if (p->as.basic.flags) {
                 counts[BUILTIN_TYPE(p)]++;
@@ -3256,7 +3493,7 @@ count_objects(int argc, VALUE *argv, VALUE os)
                 freed++;
             }
         }
-        total += objspace->heap.sorted[i].slot->limit;
+        total += objspace->heap.sorted[i]->limit;
     }
 
     if (hash == Qnil) {
@@ -3355,7 +3592,7 @@ gc_stat(int argc, VALUE *argv, VALUE self)
     VALUE hash;
 
     if (rb_scan_args(argc, argv, "01", &hash) == 1) {
-        if (TYPE(hash) != T_HASH)
+        if (!RB_TYPE_P(hash, T_HASH))
             rb_raise(rb_eTypeError, "non-hash given");
     }
 
@@ -3410,6 +3647,33 @@ gc_malloc_allocations(VALUE self)
 }
 #endif
 
+/*
+ *  call-seq:
+ *     GC::Profiler.raw_data -> [Hash, ...]
+ *
+ *  Returns an Array of individual raw profile data Hashes ordered
+ *  from earliest to latest by <tt>:GC_INVOKE_TIME</tt>.  For example:
+ *
+ *    [{:GC_TIME=>1.3000000000000858e-05,
+ *      :GC_INVOKE_TIME=>0.010634999999999999,
+ *      :HEAP_USE_SIZE=>289640,
+ *      :HEAP_TOTAL_SIZE=>588960,
+ *      :HEAP_TOTAL_OBJECTS=>14724,
+ *      :GC_IS_MARKED=>false},
+ *      ...
+ *    ]
+ *
+ *  The keys mean:
+ *
+ *  +:GC_TIME+:: Time taken for this run in milliseconds
+ *  +:GC_INVOKE_TIME+:: Time the GC was invoked since startup in seconds
+ *  +:HEAP_USE_SIZE+:: Bytes of heap used
+ *  +:HEAP_TOTAL_SIZE+:: Size of heap in bytes
+ *  +:HEAP_TOTAL_OBJECTS+:: Number of objects
+ *  +:GC_IS_MARKED+:: Is the GC in the mark phase
+ *
+ */
+
 static VALUE
 gc_profile_record_get(void)
 {
@@ -3602,6 +3866,7 @@ Init_GC(void)
     rb_mProfiler = rb_define_module_under(rb_mGC, "Profiler");
     rb_define_singleton_method(rb_mProfiler, "enabled?", gc_profile_enable_get, 0);
     rb_define_singleton_method(rb_mProfiler, "enable", gc_profile_enable, 0);
+    rb_define_singleton_method(rb_mProfiler, "raw_data", gc_profile_record_get, 0);
     rb_define_singleton_method(rb_mProfiler, "disable", gc_profile_disable, 0);
     rb_define_singleton_method(rb_mProfiler, "clear", gc_profile_clear, 0);
     rb_define_singleton_method(rb_mProfiler, "result", gc_profile_result, 0);
diff --git a/hash.c b/hash.c
index fbd8237..4cb2e2d 100644
--- a/hash.c
+++ b/hash.c
@@ -44,7 +44,7 @@ rb_any_cmp(VALUE a, VALUE b)
     if (FIXNUM_P(a) && FIXNUM_P(b)) {
 	return a != b;
     }
-    if (TYPE(a) == T_STRING && RBASIC(a)->klass == rb_cString &&
+    if (RB_TYPE_P(a, T_STRING) && RBASIC(a)->klass == rb_cString &&
 	TYPE(b) == T_STRING && RBASIC(b)->klass == rb_cString) {
 	return rb_str_hash_cmp(a, b);
     }
@@ -80,20 +80,14 @@ rb_any_hash(VALUE a)
     VALUE hval;
     st_index_t hnum;
 
-    switch (TYPE(a)) {
-      case T_FIXNUM:
-      case T_SYMBOL:
-      case T_NIL:
-      case T_FALSE:
-      case T_TRUE:
-	hnum = rb_hash_end(rb_hash_start((unsigned int)a));
-	break;
-
-      case T_STRING:
+    if (SPECIAL_CONST_P(a)) {
+	if (a == Qundef) return 0;
+	hnum = rb_hash_end(rb_hash_start((st_index_t)a));
+    }
+    else if (BUILTIN_TYPE(a) == T_STRING) {
 	hnum = rb_str_hash(a);
-	break;
-
-      default:
+    }
+    else {
         hval = rb_hash(a);
 	hnum = FIX2LONG(hval);
     }
@@ -106,10 +100,8 @@ static const struct st_hash_type objhash = {
     rb_any_hash,
 };
 
-static const struct st_hash_type identhash = {
-    st_numcmp,
-    st_numhash,
-};
+extern const struct st_hash_type st_hashtype_num;
+#define identhash st_hashtype_num
 
 typedef int st_foreach_func(st_data_t, st_data_t, st_data_t);
 
@@ -124,7 +116,6 @@ foreach_safe_i(st_data_t key, st_data_t value, struct foreach_safe_arg *arg)
 {
     int status;
 
-    if (key == Qundef) return ST_CONTINUE;
     status = (*arg->func)(key, value, arg->arg);
     if (status == ST_CONTINUE) {
 	return ST_CHECK;
@@ -140,7 +131,7 @@ st_foreach_safe(st_table *table, int (*func)(ANYARGS), st_data_t a)
     arg.tbl = table;
     arg.func = (st_foreach_func *)func;
     arg.arg = a;
-    if (st_foreach(table, foreach_safe_i, (st_data_t)&arg)) {
+    if (st_foreach_check(table, foreach_safe_i, (st_data_t)&arg, 0)) {
 	rb_raise(rb_eRuntimeError, "hash modified during iteration");
     }
 }
@@ -154,21 +145,21 @@ struct hash_foreach_arg {
 };
 
 static int
-hash_foreach_iter(st_data_t key, st_data_t value, struct hash_foreach_arg *arg)
+hash_foreach_iter(st_data_t key, st_data_t value, st_data_t argp)
 {
+    struct hash_foreach_arg *arg = (struct hash_foreach_arg *)argp;
     int status;
     st_table *tbl;
 
     tbl = RHASH(arg->hash)->ntbl;
-    if ((VALUE)key == Qundef) return ST_CONTINUE;
     status = (*arg->func)((VALUE)key, (VALUE)value, arg->arg);
     if (RHASH(arg->hash)->ntbl != tbl) {
 	rb_raise(rb_eRuntimeError, "rehash occurred during iteration");
     }
     switch (status) {
       case ST_DELETE:
-	st_delete_safe(tbl, &key, 0, Qundef);
 	FL_SET(arg->hash, HASH_DELETED);
+	return ST_DELETE;
       case ST_CONTINUE:
 	break;
       case ST_STOP:
@@ -184,7 +175,7 @@ hash_foreach_ensure(VALUE hash)
 
     if (RHASH(hash)->iter_lev == 0) {
 	if (FL_TEST(hash, HASH_DELETED)) {
-	    st_cleanup_safe(RHASH(hash)->ntbl, Qundef);
+	    st_cleanup_safe(RHASH(hash)->ntbl, (st_data_t)Qundef);
 	    FL_UNSET(hash, HASH_DELETED);
 	}
     }
@@ -192,9 +183,10 @@ hash_foreach_ensure(VALUE hash)
 }
 
 static VALUE
-hash_foreach_call(struct hash_foreach_arg *arg)
+hash_foreach_call(VALUE arg)
 {
-    if (st_foreach(RHASH(arg->hash)->ntbl, hash_foreach_iter, (st_data_t)arg)) {
+    VALUE hash = ((struct hash_foreach_arg *)arg)->hash;
+    if (st_foreach_check(RHASH(hash)->ntbl, hash_foreach_iter, (st_data_t)arg, (st_data_t)Qundef)) {
 	rb_raise(rb_eRuntimeError, "hash modified during iteration");
     }
     return Qnil;
@@ -447,7 +439,7 @@ rb_hash_rehash_i(VALUE key, VALUE value, VALUE arg)
 {
     st_table *tbl = (st_table *)arg;
 
-    if (key != Qundef) st_insert(tbl, key, value);
+    st_insert(tbl, (st_data_t)key, (st_data_t)value);
     return ST_CONTINUE;
 }
 
@@ -490,6 +482,20 @@ rb_hash_rehash(VALUE hash)
     return hash;
 }
 
+static VALUE
+hash_default_value(VALUE hash, VALUE key)
+{
+    if (rb_method_basic_definition_p(CLASS_OF(hash), id_default)) {
+	VALUE ifnone = RHASH_IFNONE(hash);
+	if (!FL_TEST(hash, HASH_PROC_DEFAULT)) return ifnone;
+	if (key == Qundef) return Qnil;
+	return rb_funcall(ifnone, id_yield, 2, hash, key);
+    }
+    else {
+	return rb_funcall(hash, id_default, 1, key);
+    }
+}
+
 /*
  *  call-seq:
  *     hsh[key]    ->  value
@@ -510,13 +516,7 @@ rb_hash_aref(VALUE hash, VALUE key)
     st_data_t val;
 
     if (!RHASH(hash)->ntbl || !st_lookup(RHASH(hash)->ntbl, key, &val)) {
-	if (!FL_TEST(hash, HASH_PROC_DEFAULT) &&
-	    rb_method_basic_definition_p(CLASS_OF(hash), id_default)) {
-	    return RHASH_IFNONE(hash);
-	}
-	else {
-	    return rb_funcall(hash, id_default, 1, key);
-	}
+	return hash_default_value(hash, key);
     }
     return (VALUE)val;
 }
@@ -659,7 +659,7 @@ rb_hash_default(int argc, VALUE *argv, VALUE hash)
 static VALUE
 rb_hash_set_default(VALUE hash, VALUE ifnone)
 {
-    rb_hash_modify(hash);
+    rb_hash_modify_check(hash);
     RHASH_IFNONE(hash) = ifnone;
     FL_UNSET(hash, HASH_PROC_DEFAULT);
     return ifnone;
@@ -707,7 +707,7 @@ rb_hash_set_default_proc(VALUE hash, VALUE proc)
 {
     VALUE b;
 
-    rb_hash_modify(hash);
+    rb_hash_modify_check(hash);
     b = rb_check_convert_type(proc, T_DATA, "Proc", "to_proc");
     if (NIL_P(b) || !rb_obj_is_proc(b)) {
 	rb_raise(rb_eTypeError,
@@ -776,7 +776,7 @@ rb_hash_delete_key(VALUE hash, VALUE key)
     if (!RHASH(hash)->ntbl)
         return Qundef;
     if (RHASH(hash)->iter_lev > 0) {
-	if (st_delete_safe(RHASH(hash)->ntbl, &ktmp, &val, Qundef)) {
+	if (st_delete_safe(RHASH(hash)->ntbl, &ktmp, &val, (st_data_t)Qundef)) {
 	    FL_SET(hash, HASH_DELETED);
 	    return (VALUE)val;
 	}
@@ -809,7 +809,7 @@ rb_hash_delete(VALUE hash, VALUE key)
 {
     VALUE val;
 
-    rb_hash_modify(hash);
+    rb_hash_modify_check(hash);
     val = rb_hash_delete_key(hash, key);
     if (val != Qundef) return val;
     if (rb_block_given_p()) {
@@ -828,7 +828,6 @@ shift_i(VALUE key, VALUE value, VALUE arg)
 {
     struct shift_var *var = (struct shift_var *)arg;
 
-    if (key == Qundef) return ST_CONTINUE;
     if (var->key != Qundef) return ST_STOP;
     var->key = key;
     var->val = value;
@@ -840,7 +839,6 @@ shift_i_safe(VALUE key, VALUE value, VALUE arg)
 {
     struct shift_var *var = (struct shift_var *)arg;
 
-    if (key == Qundef) return ST_CONTINUE;
     var->key = key;
     var->val = value;
     return ST_STOP;
@@ -864,29 +862,25 @@ rb_hash_shift(VALUE hash)
 {
     struct shift_var var;
 
-    rb_hash_modify(hash);
-    var.key = Qundef;
-    rb_hash_foreach(hash, RHASH(hash)->iter_lev > 0 ? shift_i_safe : shift_i,
-		    (VALUE)&var);
-
-    if (var.key != Qundef) {
-	if (RHASH(hash)->iter_lev > 0) {
-	    rb_hash_delete_key(hash, var.key);
+    rb_hash_modify_check(hash);
+    if (RHASH(hash)->ntbl) {
+	var.key = Qundef;
+	rb_hash_foreach(hash, RHASH(hash)->iter_lev > 0 ? shift_i_safe : shift_i,
+			(VALUE)&var);
+
+	if (var.key != Qundef) {
+	    if (RHASH(hash)->iter_lev > 0) {
+		rb_hash_delete_key(hash, var.key);
+	    }
+	    return rb_assoc_new(var.key, var.val);
 	}
-	return rb_assoc_new(var.key, var.val);
-    }
-    else if (FL_TEST(hash, HASH_PROC_DEFAULT)) {
-	return rb_funcall(RHASH_IFNONE(hash), id_yield, 2, hash, Qnil);
-    }
-    else {
-	return RHASH_IFNONE(hash);
     }
+    return hash_default_value(hash, Qnil);
 }
 
 static int
 delete_if_i(VALUE key, VALUE value, VALUE hash)
 {
-    if (key == Qundef) return ST_CONTINUE;
     if (RTEST(rb_yield_values(2, key, value))) {
 	rb_hash_delete_key(hash, key);
     }
@@ -912,8 +906,9 @@ VALUE
 rb_hash_delete_if(VALUE hash)
 {
     RETURN_ENUMERATOR(hash, 0, 0);
-    rb_hash_modify(hash);
-    rb_hash_foreach(hash, delete_if_i, hash);
+    rb_hash_modify_check(hash);
+    if (RHASH(hash)->ntbl)
+	rb_hash_foreach(hash, delete_if_i, hash);
     return hash;
 }
 
@@ -984,7 +979,6 @@ rb_hash_values_at(int argc, VALUE *argv, VALUE hash)
 static int
 select_i(VALUE key, VALUE value, VALUE result)
 {
-    if (key == Qundef) return ST_CONTINUE;
     if (RTEST(rb_yield_values(2, key, value)))
 	rb_hash_aset(result, key, value);
     return ST_CONTINUE;
@@ -1018,7 +1012,6 @@ rb_hash_select(VALUE hash)
 static int
 keep_if_i(VALUE key, VALUE value, VALUE hash)
 {
-    if (key == Qundef) return ST_CONTINUE;
     if (!RTEST(rb_yield_values(2, key, value))) {
 	return ST_DELETE;
     }
@@ -1040,7 +1033,7 @@ rb_hash_select_bang(VALUE hash)
     st_index_t n;
 
     RETURN_ENUMERATOR(hash, 0, 0);
-    rb_hash_modify(hash);
+    rb_hash_modify_check(hash);
     if (!RHASH(hash)->ntbl)
         return Qnil;
     n = RHASH(hash)->ntbl->num_entries;
@@ -1065,8 +1058,9 @@ VALUE
 rb_hash_keep_if(VALUE hash)
 {
     RETURN_ENUMERATOR(hash, 0, 0);
-    rb_hash_modify(hash);
-    rb_hash_foreach(hash, keep_if_i, hash);
+    rb_hash_modify_check(hash);
+    if (RHASH(hash)->ntbl)
+	rb_hash_foreach(hash, keep_if_i, hash);
     return hash;
 }
 
@@ -1087,7 +1081,7 @@ clear_i(VALUE key, VALUE value, VALUE dummy)
  *
  */
 
-static VALUE
+VALUE
 rb_hash_clear(VALUE hash)
 {
     rb_hash_modify_check(hash);
@@ -1144,9 +1138,7 @@ rb_hash_aset(VALUE hash, VALUE key, VALUE val)
 static int
 replace_i(VALUE key, VALUE val, VALUE hash)
 {
-    if (key != Qundef) {
-	rb_hash_aset(hash, key, val);
-    }
+    rb_hash_aset(hash, key, val);
 
     return ST_CONTINUE;
 }
@@ -1227,7 +1219,6 @@ rb_hash_empty_p(VALUE hash)
 static int
 each_value_i(VALUE key, VALUE value)
 {
-    if (key == Qundef) return ST_CONTINUE;
     rb_yield(value);
     return ST_CONTINUE;
 }
@@ -1262,7 +1253,6 @@ rb_hash_each_value(VALUE hash)
 static int
 each_key_i(VALUE key, VALUE value)
 {
-    if (key == Qundef) return ST_CONTINUE;
     rb_yield(key);
     return ST_CONTINUE;
 }
@@ -1296,7 +1286,6 @@ rb_hash_each_key(VALUE hash)
 static int
 each_pair_i(VALUE key, VALUE value)
 {
-    if (key == Qundef) return ST_CONTINUE;
     rb_yield(rb_assoc_new(key, value));
     return ST_CONTINUE;
 }
@@ -1334,7 +1323,6 @@ rb_hash_each_pair(VALUE hash)
 static int
 to_a_i(VALUE key, VALUE value, VALUE ary)
 {
-    if (key == Qundef) return ST_CONTINUE;
     rb_ary_push(ary, rb_assoc_new(key, value));
     return ST_CONTINUE;
 }
@@ -1367,7 +1355,6 @@ inspect_i(VALUE key, VALUE value, VALUE str)
 {
     VALUE str2;
 
-    if (key == Qundef) return ST_CONTINUE;
     str2 = rb_inspect(key);
     if (RSTRING_LEN(str) > 1) {
 	rb_str_cat2(str, ", ");
@@ -1434,7 +1421,6 @@ rb_hash_to_hash(VALUE hash)
 static int
 keys_i(VALUE key, VALUE value, VALUE ary)
 {
-    if (key == Qundef) return ST_CONTINUE;
     rb_ary_push(ary, key);
     return ST_CONTINUE;
 }
@@ -1465,7 +1451,6 @@ rb_hash_keys(VALUE hash)
 static int
 values_i(VALUE key, VALUE value, VALUE ary)
 {
-    if (key == Qundef) return ST_CONTINUE;
     rb_ary_push(ary, value);
     return ST_CONTINUE;
 }
@@ -1524,7 +1509,6 @@ rb_hash_search_value(VALUE key, VALUE value, VALUE arg)
 {
     VALUE *data = (VALUE *)arg;
 
-    if (key == Qundef) return ST_CONTINUE;
     if (rb_equal(value, data[1])) {
 	data[0] = Qtrue;
 	return ST_STOP;
@@ -1568,7 +1552,6 @@ eql_i(VALUE key, VALUE val1, VALUE arg)
     struct equal_data *data = (struct equal_data *)arg;
     st_data_t val2;
 
-    if (key == Qundef) return ST_CONTINUE;
     if (!st_lookup(data->tbl, key, &val2)) {
 	data->result = Qfalse;
 	return ST_STOP;
@@ -1599,7 +1582,7 @@ hash_equal(VALUE hash1, VALUE hash2, int eql)
     struct equal_data data;
 
     if (hash1 == hash2) return Qtrue;
-    if (TYPE(hash2) != T_HASH) {
+    if (!RB_TYPE_P(hash2, T_HASH)) {
 	if (!rb_respond_to(hash2, rb_intern("to_hash"))) {
 	    return Qfalse;
 	}
@@ -1670,7 +1653,6 @@ hash_i(VALUE key, VALUE val, VALUE arg)
     st_index_t *hval = (st_index_t *)arg;
     st_index_t hdata[2];
 
-    if (key == Qundef) return ST_CONTINUE;
     hdata[0] = rb_hash(key);
     hdata[1] = rb_hash(val);
     *hval ^= st_hash(hdata, sizeof(hdata), 0);
@@ -1711,7 +1693,6 @@ rb_hash_hash(VALUE hash)
 static int
 rb_hash_invert_i(VALUE key, VALUE value, VALUE hash)
 {
-    if (key == Qundef) return ST_CONTINUE;
     rb_hash_aset(hash, value, key);
     return ST_CONTINUE;
 }
@@ -1740,7 +1721,6 @@ rb_hash_invert(VALUE hash)
 static int
 rb_hash_update_i(VALUE key, VALUE value, VALUE hash)
 {
-    if (key == Qundef) return ST_CONTINUE;
     hash_update(hash, key);
     st_insert(RHASH(hash)->ntbl, key, value);
     return ST_CONTINUE;
@@ -1749,7 +1729,6 @@ rb_hash_update_i(VALUE key, VALUE value, VALUE hash)
 static int
 rb_hash_update_block_i(VALUE key, VALUE value, VALUE hash)
 {
-    if (key == Qundef) return ST_CONTINUE;
     if (rb_hash_has_key(hash, key)) {
 	value = rb_yield_values(3, key, rb_hash_aref(hash, key), value);
     }
@@ -1806,7 +1785,6 @@ rb_hash_update_func_i(VALUE key, VALUE value, VALUE arg0)
     struct update_arg *arg = (struct update_arg *)arg0;
     VALUE hash = arg->hash;
 
-    if (key == Qundef) return ST_CONTINUE;
     if (rb_hash_has_key(hash, key)) {
 	value = (*arg->func)(key, rb_hash_aref(hash, key), value);
     }
@@ -1863,7 +1841,6 @@ assoc_i(VALUE key, VALUE val, VALUE arg)
 {
     VALUE *args = (VALUE *)arg;
 
-    if (key == Qundef) return ST_CONTINUE;
     if (RTEST(rb_equal(args[0], key))) {
 	args[1] = rb_assoc_new(key, val);
 	return ST_STOP;
@@ -1901,7 +1878,6 @@ rassoc_i(VALUE key, VALUE val, VALUE arg)
 {
     VALUE *args = (VALUE *)arg;
 
-    if (key == Qundef) return ST_CONTINUE;
     if (RTEST(rb_equal(args[0], val))) {
 	args[1] = rb_assoc_new(key, val);
 	return ST_STOP;
@@ -2198,7 +2174,7 @@ rb_env_path_tainted(void)
 }
 
 #if defined(_WIN32) || (defined(HAVE_SETENV) && defined(HAVE_UNSETENV))
-#elif defined __sun__
+#elif defined __sun
 static int
 in_origenv(const char *str)
 {
@@ -2286,7 +2262,7 @@ ruby_setenv(const char *name, const char *value)
 	    rb_sys_fail("unsetenv");
 #endif
     }
-#elif defined __sun__
+#elif defined __sun
     size_t len;
     char **env_ptr, *str;
     if (strchr(name, '=')) {
@@ -3084,11 +3060,9 @@ env_invert(void)
 static int
 env_replace_i(VALUE key, VALUE val, VALUE keys)
 {
-    if (key != Qundef) {
-	env_aset(Qnil, key, val);
-	if (rb_ary_includes(keys, key)) {
-	    rb_ary_delete(keys, key);
-	}
+    env_aset(Qnil, key, val);
+    if (rb_ary_includes(keys, key)) {
+	rb_ary_delete(keys, key);
     }
     return ST_CONTINUE;
 }
@@ -3120,12 +3094,10 @@ env_replace(VALUE env, VALUE hash)
 static int
 env_update_i(VALUE key, VALUE val)
 {
-    if (key != Qundef) {
-	if (rb_block_given_p()) {
-	    val = rb_yield_values(3, key, rb_f_getenv(Qnil, key), val);
-	}
-	env_aset(Qnil, key, val);
+    if (rb_block_given_p()) {
+	val = rb_yield_values(3, key, rb_f_getenv(Qnil, key), val);
     }
+    env_aset(Qnil, key, val);
     return ST_CONTINUE;
 }
 
@@ -3150,15 +3122,116 @@ env_update(VALUE env, VALUE hash)
 }
 
 /*
- *  A <code>Hash</code> is a collection of key-value pairs. It is
- *  similar to an <code>Array</code>, except that indexing is done via
- *  arbitrary keys of any object type, not an integer index. Hashes enumerate
- *  their values in the order that the corresponding keys were inserted.
+ *  A Hash is a dictionary-like collection of unique keys and their values.
+ *  Also called associative arrays, they are similar to Arrays, but where an
+ *  Array uses integers as its index, a Hash allows you to use any object
+ *  type.
+ *
+ *  Hashes enumerate their values in the order that the corresponding keys
+ *  were inserted.
+ *
+ *  A Hash can be easily created by using its implicit form:
+ *
+ *    grades = { "Jane Doe" => 10, "Jim Doe" => 6 }
+ *
+ *  Hashes allow an alternate syntax form when your keys are always symbols.
+ *  Instead of
+ *
+ *    options = { :font_size => 10, :font_family => "Arial" }
+ *
+ *  You could write it as:
+ *
+ *    options = { font_size: 10, font_family: "Arial" }
+ *
+ *  Each named key is a symbol you can access in hash:
+ *
+ *    options[:font_size]  # => 10
+ *
+ *  A Hash can also be created through its ::new method:
+ *
+ *    grades = Hash.new
+ *    grades["Dorothy Doe"] = 9
  *
  *  Hashes have a <em>default value</em> that is returned when accessing
- *  keys that do not exist in the hash. By default, that value is
- *  <code>nil</code>.
+ *  keys that do not exist in the hash. If no default is set +nil+ is used.
+ *  You can set the default value by sending it as an argument to Hash.new:
+ *
+ *    grades = Hash.new(0)
+ *
+ *  Or by using the #default= method:
+ *
+ *    grades = {"Timmy Doe" => 8}
+ *    grades.default = 0
+ *
+ *  Accessing a value in a Hash requires using its key:
+ *
+ *    puts grades["Jane Doe"] # => 10
+ *
+ *  === Common Uses
+ *
+ *  Hashes are an easy way to represent data structures, such as
+ *
+ *    books         = {}
+ *    books[:matz]  = "The Ruby Language"
+ *    books[:black] = "The Well-Grounded Rubyist"
+ *
+ *  Hashes are also commonly used as a way to have named parameters in
+ *  functions. Note that no brackets are used below. If a hash is the last
+ *  argument on a method call, no braces are needed, thus creating a really
+ *  clean interface:
+ *
+ *    Person.create(name: "John Doe", age: 27)
+ *
+ *    def self.create(params)
+ *      @name = params[:name]
+ *      @age  = params[:age]
+ *    end
+ *
+ *  === Hash Keys
+ *
+ *  Two objects refer to the same hash key when their <code>hash</code> value
+ *  is identical and the two objects are <code>eql?</code> to each other.
+ *
+ *  A user-defined class may be used as a hash key if the <code>hash</code>
+ *  and <code>eql?</code> methods are overridden to provide meaningful
+ *  behavior.  By default, separate instances refer to separate hash keys.
+ *
+ *  A typical implementation of <code>hash</code> is based on the
+ *  object's data while <code>eql?</code> is usually aliased to the overridden
+ *  <code>==</code> method:
+ *
+ *    class Book
+ *      attr_reader :author, :title
+ *
+ *      def initialize(author, title)
+ *        @author = author
+ *        @title = title
+ *      end
+ *
+ *      def ==(other)
+ *        self.class === other and
+ *          other.author == @author and
+ *          other.title == @title
+ *      end
+ *
+ *      alias eql? ==
+ *
+ *      def hash
+ *        @author.hash ^ @title.hash # XOR
+ *      end
+ *    end
+ *
+ *    book1 = Book.new 'matz', 'Ruby in a Nutshell'
+ *    book2 = Book.new 'matz', 'Ruby in a Nutshell'
+ *
+ *    reviews = {}
+ *
+ *    reviews[book1] = 'Great reference!'
+ *    reviews[book2] = 'Nice and compact!'
+ *
+ *    reviews.length #=> 1
  *
+ *  See also Object#hash and Object#eql?
  */
 
 void
diff --git a/include/ruby/intern.h b/include/ruby/intern.h
index 927b536..9be68de 100644
--- a/include/ruby/intern.h
+++ b/include/ruby/intern.h
@@ -56,6 +56,7 @@ VALUE rb_ary_tmp_new(long);
 void rb_ary_free(VALUE);
 void rb_ary_modify(VALUE);
 VALUE rb_ary_freeze(VALUE);
+VALUE rb_ary_dup_of_p(VALUE, VALUE);
 VALUE rb_ary_aref(int, VALUE*, VALUE);
 VALUE rb_ary_subseq(VALUE, long, long);
 void rb_ary_store(VALUE, long, VALUE);
@@ -413,6 +414,7 @@ size_t ruby_stack_length(VALUE**);
 int rb_during_gc(void);
 void rb_gc_mark_locations(VALUE*, VALUE*);
 void rb_mark_tbl(struct st_table*);
+void rb_mark_sa_tbl(sa_table*);
 void rb_mark_set(struct st_table*);
 void rb_mark_hash(struct st_table*);
 void rb_gc_mark_maybe(VALUE);
@@ -440,6 +442,7 @@ VALUE rb_hash_lookup(VALUE, VALUE);
 VALUE rb_hash_lookup2(VALUE, VALUE, VALUE);
 VALUE rb_hash_fetch(VALUE, VALUE);
 VALUE rb_hash_aset(VALUE, VALUE, VALUE);
+VALUE rb_hash_clear(VALUE);
 VALUE rb_hash_delete_if(VALUE);
 VALUE rb_hash_delete(VALUE,VALUE);
 typedef VALUE rb_hash_update_func(VALUE newkey, VALUE oldkey, VALUE value);
@@ -843,7 +846,7 @@ VALUE rb_f_trace_var(int, VALUE*);
 VALUE rb_f_untrace_var(int, VALUE*);
 VALUE rb_f_global_variables(void);
 void rb_alias_variable(ID, ID);
-struct st_table* rb_generic_ivar_table(VALUE);
+sa_table* rb_generic_ivar_table(VALUE);
 void rb_copy_generic_ivar(VALUE,VALUE);
 void rb_mark_generic_ivar(VALUE);
 void rb_mark_generic_ivar_tbl(void);
diff --git a/include/ruby/ruby.h b/include/ruby/ruby.h
index 2f97b33..1c84e14 100644
--- a/include/ruby/ruby.h
+++ b/include/ruby/ruby.h
@@ -605,7 +605,7 @@ struct RObject {
 	struct {
 	    long numiv;
 	    VALUE *ivptr;
-            struct st_table *iv_index_tbl; /* shortcut for RCLASS_IV_INDEX_TBL(rb_obj_class(obj)) */
+            struct sa_table *iv_index_tbl; /* shortcut for RCLASS_IV_INDEX_TBL(rb_obj_class(obj)) */
 	} heap;
 	VALUE ary[ROBJECT_EMBED_LEN_MAX];
     } as;
@@ -626,12 +626,13 @@ struct RObject {
 
 /** @internal */
 typedef struct rb_classext_struct rb_classext_t;
+typedef struct rb_class_cache_struct rb_class_cache_t;
 
 struct RClass {
     struct RBasic basic;
+    VALUE super;
     rb_classext_t *ptr;
-    struct st_table *m_tbl;
-    struct st_table *iv_index_tbl;
+    rb_class_cache_t *cache;
 };
 #define RCLASS_SUPER(c) rb_class_get_superclass(c)
 #define RMODULE_IV_TBL(m) RCLASS_IV_TBL(m)
diff --git a/include/ruby/st.h b/include/ruby/st.h
index 50f2a75..aff94fc 100644
--- a/include/ruby/st.h
+++ b/include/ruby/st.h
@@ -36,7 +36,7 @@ typedef unsigned long st_data_t;
 #elif SIZEOF_LONG_LONG == SIZEOF_VOIDP
 typedef unsigned LONG_LONG st_data_t;
 #else
-# error ---->> st.c requires sizeof(void*) == sizeof(long) to be compiled. <<----
+# error ---->> st.c requires sizeof(void*) == sizeof(long) or sizeof(LONG_LONG) to be compiled. <<----
 #endif
 #define ST_DATA_T_DEFINED
 
@@ -74,6 +74,11 @@ struct st_hash_type {
 
 #define ST_INDEX_BITS (sizeof(st_index_t) * CHAR_BIT)
 
+typedef struct st_packed_entry {
+    st_index_t hash;
+    st_data_t key, val;
+} st_packed_entry;
+
 struct st_table {
     const struct st_hash_type *type;
     st_index_t num_bins;
@@ -91,8 +96,17 @@ struct st_table {
     __extension__
 #endif
     st_index_t num_entries : ST_INDEX_BITS - 1;
-    struct st_table_entry **bins;
-    struct st_table_entry *head, *tail;
+    union {
+	struct {
+	    struct st_table_entry **bins;
+	    struct st_table_entry *head, *tail;
+	} big;
+	struct {
+	    struct st_packed_entry *entries;
+	    st_index_t real_entries;
+	} packed;
+	st_packed_entry upacked;
+    } as;
 };
 
 #define st_is_member(table,key) st_lookup((table),(key),(st_data_t *)0)
@@ -114,6 +128,7 @@ int st_insert2(st_table *, st_data_t, st_data_t, st_data_t (*)(st_data_t));
 int st_lookup(st_table *, st_data_t, st_data_t *);
 int st_get_key(st_table *, st_data_t, st_data_t *);
 int st_foreach(st_table *, int (*)(ANYARGS), st_data_t);
+int st_foreach_check(st_table *, int (*)(ANYARGS), st_data_t, st_data_t);
 int st_reverse_foreach(st_table *, int (*)(ANYARGS), st_data_t);
 void st_add_direct(st_table *, st_data_t, st_data_t);
 void st_free_table(st_table *);
@@ -136,6 +151,51 @@ st_index_t st_hash_start(st_index_t h);
 #pragma GCC visibility pop
 #endif
 
+typedef unsigned int sa_index_t;
+#define SA_STOP     ST_STOP
+#define SA_CONTINUE ST_CONTINUE
+
+#define SA_EMPTY   0
+
+typedef struct sa_entry {
+    sa_index_t next;
+    sa_index_t key;
+    st_data_t value;
+} sa_entry;
+
+typedef struct sa_table {
+    sa_index_t num_bins;
+    sa_index_t num_entries;
+    sa_index_t free_pos;
+    sa_entry *entries;
+} sa_table;
+
+#define SA_EMPTY_TABLE {0, 0, 0, 0};
+void sa_init_table(sa_table *, sa_index_t);
+sa_table *sa_new_table();
+int  sa_insert(sa_table *, sa_index_t, st_data_t);
+int  sa_lookup(sa_table *, sa_index_t, st_data_t *);
+int  sa_delete(sa_table *, sa_index_t, st_data_t *);
+void sa_clear(sa_table *);
+void sa_clear_no_free(sa_table *);
+void sa_free_table(sa_table *);
+int  sa_foreach(sa_table *, int (*)(ANYARGS), st_data_t);
+size_t sa_memsize(const sa_table *);
+sa_table *sa_copy(sa_table*);
+void sa_copy_to(sa_table*, sa_table*);
+typedef int (*sa_iter_func)(sa_index_t key, st_data_t val, st_data_t arg);
+
+#define SA_FOREACH_START_I(table, entry) do { \
+    sa_table *T##entry = (table); \
+    sa_index_t K##entry; \
+    for(K##entry = 0; K##entry < T##entry->num_bins; K##entry++) { \
+	sa_entry *entry = T##entry->entries + K##entry; \
+	if (entry->next != SA_EMPTY) { \
+	    st_data_t value = entry->value
+#define SA_FOREACH_END() } } } while(0)
+
+#define SA_FOREACH_START(table) SA_FOREACH_START_I(table, entry)
+
 #if defined(__cplusplus)
 #if 0
 { /* satisfy cc-mode */
diff --git a/internal.h b/internal.h
index 59c9284..4af90b6 100644
--- a/internal.h
+++ b/internal.h
@@ -24,18 +24,24 @@ struct rb_deprecated_classext_struct {
 };
 
 struct rb_classext_struct {
-    VALUE super;
-    struct st_table *iv_tbl;
-    struct st_table *const_tbl;
+    sa_table m_tbl;
+    sa_table iv_tbl;
+    sa_table const_tbl;
+    sa_table iv_index_tbl;
+};
+
+struct rb_class_cache_struct {
+    VALUE method_cache_version;
+    sa_table m_cache_tbl;
 };
 
 #undef RCLASS_SUPER
 #define RCLASS_EXT(c) (RCLASS(c)->ptr)
-#define RCLASS_SUPER(c) (RCLASS_EXT(c)->super)
-#define RCLASS_IV_TBL(c) (RCLASS_EXT(c)->iv_tbl)
-#define RCLASS_CONST_TBL(c) (RCLASS_EXT(c)->const_tbl)
-#define RCLASS_M_TBL(c) (RCLASS(c)->m_tbl)
-#define RCLASS_IV_INDEX_TBL(c) (RCLASS(c)->iv_index_tbl)
+#define RCLASS_SUPER(c) (RCLASS(c)->super)
+#define RCLASS_IV_TBL(c) (&RCLASS_EXT(c)->iv_tbl)
+#define RCLASS_CONST_TBL(c) (&RCLASS_EXT(c)->const_tbl)
+#define RCLASS_M_TBL(c) (&RCLASS_EXT(c)->m_tbl)
+#define RCLASS_IV_INDEX_TBL(c) (&RCLASS_EXT(c)->iv_index_tbl)
 
 struct vtm; /* defined by timev.h */
 
@@ -94,6 +100,8 @@ VALUE rb_home_dir(const char *user, VALUE result);
 VALUE rb_realpath_internal(VALUE basedir, VALUE path, int strict);
 VALUE rb_file_expand_path_fast(VALUE, VALUE);
 VALUE rb_file_expand_path_internal(VALUE, VALUE, int, int, VALUE);
+VALUE rb_get_path_check_to_string(VALUE, int);
+VALUE rb_get_path_check_convert(VALUE, VALUE, int);
 void Init_File(void);
 
 #ifdef _WIN32
@@ -119,6 +127,7 @@ VALUE rb_iseq_clone(VALUE iseqval, VALUE newcbase);
 
 /* load.c */
 VALUE rb_get_load_path(void);
+VALUE rb_get_expanded_load_path(void);
 
 /* math.c */
 VALUE rb_math_atan2(VALUE, VALUE);
diff --git a/load.c b/load.c
index 163ec4c..68caebc 100644
--- a/load.c
+++ b/load.c
@@ -34,21 +34,120 @@ rb_get_load_path(void)
     return load_path;
 }
 
-VALUE
-rb_get_expanded_load_path(void)
+enum expand_type {
+    EXPAND_ALL,
+    EXPAND_RELATIVE,
+    EXPAND_HOME,
+    EXPAND_NON_CACHE
+};
+
+/* Construct expanded load path and store it to cache.
+   We rebuild load path partially if the cache is invalid.
+   We don't cache non string object and expand it every time. We ensure that
+   string objects in $LOAD_PATH are frozen.
+ */
+static void
+rb_construct_expanded_load_path(int type, int *has_relative, int *has_non_cache)
 {
-    VALUE load_path = rb_get_load_path();
+    rb_vm_t *vm = GET_VM();
+    VALUE load_path = vm->load_path;
+    VALUE expanded_load_path = vm->expanded_load_path;
     VALUE ary;
     long i;
+    int level = rb_safe_level();
 
     ary = rb_ary_new2(RARRAY_LEN(load_path));
     for (i = 0; i < RARRAY_LEN(load_path); ++i) {
-	VALUE path = rb_file_expand_path_fast(RARRAY_PTR(load_path)[i], Qnil);
-	rb_str_freeze(path);
-	rb_ary_push(ary, path);
+	VALUE path, as_str, expanded_path;
+	int is_string, non_cache;
+	char *as_cstr;
+	as_str = path = RARRAY_PTR(load_path)[i];
+	is_string = RB_TYPE_P(path, T_STRING) ? 1 : 0;
+	non_cache = !is_string ? 1 : 0;
+	as_str = rb_get_path_check_to_string(path, level);
+	as_cstr = RSTRING_PTR(as_str);
+
+	if (!non_cache) {
+	    if ((type == EXPAND_RELATIVE &&
+		    rb_is_absolute_path(as_cstr)) ||
+		(type == EXPAND_HOME &&
+		    (!as_cstr[0] || as_cstr[0] != '~')) ||
+		(type == EXPAND_NON_CACHE)) {
+		    /* Use cached expanded path. */
+		    rb_ary_push(ary, RARRAY_PTR(expanded_load_path)[i]);
+		    continue;
+	    }
+	}
+	if (!*has_relative && !rb_is_absolute_path(as_cstr))
+	    *has_relative = 1;
+	if (!*has_non_cache && non_cache)
+	    *has_non_cache = 1;
+	/* Freeze only string object. We expand other objects every time. */
+	if (is_string)
+	    rb_str_freeze(path);
+	as_str = rb_get_path_check_convert(path, as_str, level);
+	expanded_path = rb_file_expand_path_fast(as_str, Qnil);
+	rb_str_freeze(expanded_path);
+	rb_ary_push(ary, expanded_path);
     }
     rb_obj_freeze(ary);
-    return ary;
+    vm->expanded_load_path = ary;
+    rb_ary_replace(vm->load_path_snapshot, vm->load_path);
+}
+
+static VALUE
+load_path_getcwd(void)
+{
+    char *cwd = my_getcwd();
+    VALUE cwd_str = rb_filesystem_str_new_cstr(cwd);
+    xfree(cwd);
+    return cwd_str;
+}
+
+VALUE
+rb_get_expanded_load_path(void)
+{
+    rb_vm_t *vm = GET_VM();
+    const VALUE non_cache = Qtrue;
+
+    if (!rb_ary_dup_of_p(vm->load_path_snapshot, vm->load_path)) {
+	/* The load path was modified. Rebuild the expanded load path. */
+	int has_relative = 0, has_non_cache = 0;
+	rb_construct_expanded_load_path(EXPAND_ALL, &has_relative, &has_non_cache);
+	if (has_relative) {
+	    vm->load_path_check_cache = load_path_getcwd();
+	}
+	else if (has_non_cache) {
+	    /* Non string object. */
+	    vm->load_path_check_cache = non_cache;
+	}
+	else {
+	    vm->load_path_check_cache = 0;
+	}
+    }
+    else if (vm->load_path_check_cache == non_cache) {
+	int has_relative = 1, has_non_cache = 1;
+	/* Expand only non-cacheable objects. */
+	rb_construct_expanded_load_path(EXPAND_NON_CACHE,
+					&has_relative, &has_non_cache);
+    }
+    else if (vm->load_path_check_cache) {
+	int has_relative = 1, has_non_cache = 1;
+	VALUE cwd = load_path_getcwd();
+	if (!rb_str_equal(vm->load_path_check_cache, cwd)) {
+	    /* Current working directory or filesystem encoding was changed.
+	       Expand relative load path and non-cacheable objects again. */
+	    vm->load_path_check_cache = cwd;
+	    rb_construct_expanded_load_path(EXPAND_RELATIVE,
+					    &has_relative, &has_non_cache);
+	}
+	else {
+	    /* Expand only tilde (User HOME) and non-cacheable objects. */
+	    rb_construct_expanded_load_path(EXPAND_HOME,
+					    &has_relative, &has_non_cache);
+	}
+    }
+    return vm->expanded_load_path;
 }
 
 static VALUE
@@ -63,12 +162,121 @@ get_loaded_features(void)
     return GET_VM()->loaded_features;
 }
 
+static void
+reset_loaded_features_snapshot(void)
+{
+    rb_vm_t *vm = GET_VM();
+    rb_ary_replace(vm->loaded_features_snapshot, vm->loaded_features);
+}
+
+static VALUE
+get_loaded_features_index_raw(void)
+{
+    return GET_VM()->loaded_features_index;
+}
+
 static st_table *
 get_loading_table(void)
 {
     return GET_VM()->loading_table;
 }
 
+static void
+features_index_add_single(VALUE short_feature, VALUE offset)
+{
+    VALUE features_index, this_feature_index;
+    features_index = get_loaded_features_index_raw();
+    if ((this_feature_index = rb_hash_lookup(features_index, short_feature)) == Qnil) {
+	this_feature_index = rb_ary_new();
+	rb_hash_aset(features_index, short_feature, this_feature_index);
+    }
+    rb_ary_push(this_feature_index, offset);
+}
+
+/* Add to the loaded-features index all the required entries for
+   `feature`, located at `offset` in $LOADED_FEATURES.  We add an
+   index entry at each string `short_feature` for which
+     feature == "#{prefix}#{short_feature}#{e}"
+   where `e` is empty or matches %r{^\.[^./]*$}, and `prefix` is empty
+   or ends in '/'.  This maintains the invariant that `rb_feature_p()`
+   relies on for its fast lookup.
+*/
+static void
+features_index_add(VALUE feature, VALUE offset)
+{
+    VALUE short_feature;
+    const char *feature_str, *feature_end, *ext, *p;
+
+    feature_str = StringValuePtr(feature);
+    feature_end = feature_str + RSTRING_LEN(feature);
+
+    for (ext = feature_end; ext > feature_str; ext--)
+      if (*ext == '.' || *ext == '/')
+	break;
+    if (*ext != '.')
+      ext = NULL;
+    /* Now `ext` points to the only string matching %r{^\.[^./]*$} that is
+       at the end of `feature`, or is NULL if there is no such string. */
+
+    p = ext ? ext : feature_end;
+    while (1) {
+	p--;
+	while (p >= feature_str && *p != '/')
+	    p--;
+	if (p < feature_str)
+	    break;
+	/* Now *p == '/'.  We reach this point for every '/' in `feature`. */
+	short_feature = rb_str_substr(feature, p + 1 - feature_str, feature_end - p - 1);
+	features_index_add_single(short_feature, offset);
+	if (ext) {
+	    short_feature = rb_str_substr(feature, p + 1 - feature_str, ext - p - 1);
+	    features_index_add_single(short_feature, offset);
+	}
+    }
+    features_index_add_single(feature, offset);
+    if (ext) {
+	short_feature = rb_str_substr(feature, 0, ext - feature_str);
+	features_index_add_single(short_feature, offset);
+    }
+}
+
+static VALUE
+get_loaded_features_index(void)
+{
+    VALUE features;
+    int i;
+    rb_vm_t *vm = GET_VM();
+
+    if (!rb_ary_dup_of_p(vm->loaded_features_snapshot, vm->loaded_features)) {
+	/* The sharing was broken; something (other than us in rb_provide_feature())
+	   modified loaded_features.  Rebuild the index. */
+	rb_hash_clear(vm->loaded_features_index);
+	features = vm->loaded_features;
+	for (i = 0; i < RARRAY_LEN(features); i++) {
+	    VALUE entry, as_str;
+	    as_str = entry = rb_ary_entry(features, i);
+	    StringValue(as_str);
+	    if (as_str != entry)
+		rb_ary_store(features, i, as_str);
+	    rb_str_freeze(as_str);
+	    features_index_add(as_str, INT2FIX(i));
+	}
+	reset_loaded_features_snapshot();
+    }
+    return vm->loaded_features_index;
+}
+
+/* This searches `load_path` for a value such that
+     name == "#{load_path[i]}/#{feature}"
+   if `feature` is a suffix of `name`, or otherwise
+     name == "#{load_path[i]}/#{feature}#{ext}"
+   for an acceptable string `ext`.  It returns
+   `load_path[i].to_str` if found, else 0.
+
+   If type is 's', then `ext` is acceptable only if IS_DLEXT(ext);
+   if 'r', then only if IS_RBEXT(ext); otherwise `ext` may be absent
+   or have any value matching `%r{^\.[^./]*$}`.
+*/
 static VALUE
 loaded_feature_path(const char *name, long vlen, const char *feature, long len,
 		    int type, VALUE load_path)
@@ -88,23 +296,22 @@ loaded_feature_path(const char *name, long vlen, const char *feature, long len,
 	    return 0;
 	plen = e - name - len - 1;
     }
+    if (type == 's' && !IS_DLEXT(&name[plen+len+1])
+     || type == 'r' && !IS_RBEXT(&name[plen+len+1])
+     || name[plen] != '/') {
+       return 0;
+    }
+    /* Now name == "#{prefix}/#{feature}#{ext}" where ext is acceptable
+       (possibly empty) and prefix is some string of length plen. */
+
     for (i = 0; i < RARRAY_LEN(load_path); ++i) {
 	VALUE p = RARRAY_PTR(load_path)[i];
 	const char *s = StringValuePtr(p);
 	long n = RSTRING_LEN(p);
 
-	if (n != plen ) continue;
-	if (n && (strncmp(name, s, n) || name[n] != '/')) continue;
-	switch (type) {
-	  case 's':
-	    if (IS_DLEXT(&name[n+len+1])) return p;
-	    break;
-	  case 'r':
-	    if (IS_RBEXT(&name[n+len+1])) return p;
-	    break;
-	  default:
-	    return p;
-	}
+	if (n != plen) continue;
+	if (n && strncmp(name, s, n)) continue;
+	return p;
     }
     return 0;
 }
@@ -132,7 +339,7 @@ loaded_feature_path_i(st_data_t v, st_data_t b, st_data_t f)
 static int
 rb_feature_p(const char *feature, const char *ext, int rb, int expanded, const char **fn)
 {
-    VALUE v, features, p, load_path = 0;
+    VALUE features, features_index, feature_val, this_feature_index, v, p, load_path = 0;
     const char *f, *e;
     long i, len, elen, n;
     st_table *loading_tbl;
@@ -151,8 +358,39 @@ rb_feature_p(const char *feature, const char *ext, int rb, int expanded, const c
 	type = 0;
     }
     features = get_loaded_features();
-    for (i = 0; i < RARRAY_LEN(features); ++i) {
-	v = RARRAY_PTR(features)[i];
+    features_index = get_loaded_features_index();
+
+    feature_val = rb_str_new(feature, len);
+    this_feature_index = rb_hash_lookup(features_index, feature_val);
+    /* We search `features` for an entry such that either
+         "#{features[i]}" == "#{load_path[j]}/#{feature}#{e}"
+       for some j, or
+         "#{features[i]}" == "#{feature}#{e}"
+       Here `e` is an "allowed" extension -- either empty or one
+       of the extensions accepted by IS_RBEXT, IS_SOEXT, or
+       IS_DLEXT.  Further, if `ext && rb` then `IS_RBEXT(e)`,
+       and if `ext && !rb` then `IS_SOEXT(e) || IS_DLEXT(e)`.
+
+       If `expanded`, then only the latter form (without load_path[j])
+       is accepted.  Otherwise either form is accepted, *unless* `ext`
+       is false and an otherwise-matching entry of the first form is
+       preceded by an entry of the form
+         "#{features[i2]}" == "#{load_path[j2]}/#{feature}#{e2}"
+       where `e2` matches %r{^\.[^./]*$} but is not an allowed extension.
+       After a "distractor" entry of this form, only entries of the
+       form "#{feature}#{e}" are accepted.
+
+       In `rb_provide_feature()` and `get_loaded_features_index()` we
+       maintain an invariant that the array `this_feature_index` will
+       point to every entry in `features` which has the form
+         "#{prefix}#{feature}#{e}"
+       where `e` is empty or matches %r{^\.[^./]*$}, and `prefix` is empty
+       or ends in '/'.  This includes both match forms above, as well
+       as any distractors, so we may ignore all other entries in `features`.
+     */
+    for (i = 0; this_feature_index != Qnil && i < RARRAY_LEN(this_feature_index); i++) {
+	long index = FIX2LONG(rb_ary_entry(this_feature_index, i));
+	v = RARRAY_PTR(features)[index];
 	f = StringValuePtr(v);
 	if ((n = RSTRING_LEN(v)) < len) continue;
 	if (strncmp(f, feature, len) != 0) {
@@ -175,6 +413,7 @@ rb_feature_p(const char *feature, const char *ext, int rb, int expanded, const c
 	    return 'r';
 	}
     }
+
     loading_tbl = get_loading_table();
     if (loading_tbl) {
 	f = 0;
@@ -183,7 +422,7 @@ rb_feature_p(const char *feature, const char *ext, int rb, int expanded, const c
 	    fs.name = feature;
 	    fs.len = len;
 	    fs.type = type;
-	    fs.load_path = load_path ? load_path : rb_get_load_path();
+	    fs.load_path = load_path ? load_path : rb_get_expanded_load_path();
 	    fs.result = 0;
 	    st_foreach(loading_tbl, loaded_feature_path_i, (st_data_t)&fs);
 	    if ((f = fs.result) != 0) {
@@ -233,7 +472,7 @@ rb_feature_provided(const char *feature, const char **loading)
 
     if (*feature == '.' &&
 	(feature[1] == '/' || strncmp(feature+1, "./", 2) == 0)) {
-	fullpath = rb_file_expand_path_fast(rb_str_new2(feature), Qnil);
+	fullpath = rb_file_expand_path_fast(rb_get_path(rb_str_new2(feature)), Qnil);
 	feature = RSTRING_PTR(fullpath);
     }
     if (ext && !strchr(ext, '/')) {
@@ -254,11 +493,18 @@ rb_feature_provided(const char *feature, const char **loading)
 static void
 rb_provide_feature(VALUE feature)
 {
-    if (OBJ_FROZEN(get_loaded_features())) {
+    VALUE features;
+
+    features = get_loaded_features();
+    if (OBJ_FROZEN(features)) {
 	rb_raise(rb_eRuntimeError,
 		 "$LOADED_FEATURES is frozen; cannot append feature");
     }
-    rb_ary_push(get_loaded_features(), feature);
+    rb_str_freeze(feature);
+
+    rb_ary_push(features, feature);
+    features_index_add(feature, INT2FIX(RARRAY_LEN(features)-1));
+    reset_loaded_features_snapshot();
 }
 
 void
@@ -774,10 +1020,15 @@ Init_load()
     rb_alias_variable(rb_intern("$-I"), id_load_path);
     rb_alias_variable(rb_intern("$LOAD_PATH"), id_load_path);
     vm->load_path = rb_ary_new();
+    vm->expanded_load_path = rb_ary_new();
+    vm->load_path_snapshot = rb_ary_new();
+    vm->load_path_check_cache = 0;
 
     rb_define_virtual_variable("$\"", get_loaded_features, 0);
     rb_define_virtual_variable("$LOADED_FEATURES", get_loaded_features, 0);
     vm->loaded_features = rb_ary_new();
+    vm->loaded_features_snapshot = rb_ary_new();
+    vm->loaded_features_index = rb_hash_new();
 
     rb_define_global_function("load", rb_f_load, -1);
     rb_define_global_function("require", rb_f_require, 1);
diff --git a/marshal.c b/marshal.c
index 9a43cdb..a4a3551 100644
--- a/marshal.c
+++ b/marshal.c
@@ -506,7 +506,7 @@ w_uclass(VALUE obj, VALUE super, struct dump_arg *arg)
 }
 
 static int
-w_obj_each(ID id, VALUE value, struct dump_call_arg *arg)
+w_obj_each(sa_index_t id, VALUE value, struct dump_call_arg *arg)
 {
     if (id == rb_id_encoding()) return ST_CONTINUE;
     if (id == rb_intern("E")) return ST_CONTINUE;
@@ -553,13 +553,13 @@ w_encoding(VALUE obj, long num, struct dump_call_arg *arg)
 }
 
 static void
-w_ivar(VALUE obj, st_table *tbl, struct dump_call_arg *arg)
+w_ivar(VALUE obj, sa_table *tbl, struct dump_call_arg *arg)
 {
     long num = tbl ? tbl->num_entries : 0;
 
     w_encoding(obj, num, arg);
     if (tbl) {
-	st_foreach_safe(tbl, w_obj_each, (st_data_t)arg);
+	sa_foreach(tbl, w_obj_each, (st_data_t)arg);
     }
 }
 
@@ -586,7 +586,7 @@ static void
 w_object(VALUE obj, struct dump_arg *arg, int limit)
 {
     struct dump_call_arg c_arg;
-    st_table *ivtbl = 0;
+    sa_table *ivtbl = 0;
     st_data_t num;
     int hasiv = 0;
 #define has_ivars(obj, ivtbl) (((ivtbl) = rb_generic_ivar_table(obj)) != 0 || \
@@ -651,7 +651,7 @@ w_object(VALUE obj, struct dump_arg *arg, int limit)
 	}
 	if (rb_respond_to(obj, s_dump)) {
 	    VALUE v;
-            st_table *ivtbl2 = 0;
+            sa_table *ivtbl2 = 0;
             int hasiv2;
 
 	    v = rb_funcall(obj, s_dump, 1, INT2NUM(limit));
diff --git a/method.h b/method.h
index 9229896..2fecd57 100644
--- a/method.h
+++ b/method.h
@@ -100,6 +100,6 @@ int rb_method_entry_eq(const rb_method_entry_t *m1, const rb_method_entry_t *m2)
 void rb_mark_method_entry(const rb_method_entry_t *me);
 void rb_free_method_entry(rb_method_entry_t *me);
 void rb_sweep_method_entry(void *vm);
-void rb_free_m_table(st_table *tbl);
+void rb_free_m_table(sa_table *tbl);
 
 #endif /* METHOD_H */
diff --git a/object.c b/object.c
index f45e013..1352d01 100644
--- a/object.c
+++ b/object.c
@@ -229,17 +229,8 @@ init_copy(VALUE dest, VALUE obj)
         break;
       case T_CLASS:
       case T_MODULE:
-	if (RCLASS_IV_TBL(dest)) {
-	    st_free_table(RCLASS_IV_TBL(dest));
-	    RCLASS_IV_TBL(dest) = 0;
-	}
-	if (RCLASS_CONST_TBL(dest)) {
-	    rb_free_const_table(RCLASS_CONST_TBL(dest));
-	    RCLASS_CONST_TBL(dest) = 0;
-	}
-	if (RCLASS_IV_TBL(obj)) {
-	    RCLASS_IV_TBL(dest) = st_copy(RCLASS_IV_TBL(obj));
-	}
+        rb_free_const_table(RCLASS_CONST_TBL(dest));
+        sa_copy_to(RCLASS_IV_TBL(obj), RCLASS_IV_TBL(dest));
         break;
     }
 }
@@ -530,7 +521,7 @@ rb_obj_is_kind_of(VALUE obj, VALUE c)
     }
 
     while (cl) {
-	if (cl == c || RCLASS_M_TBL(cl) == RCLASS_M_TBL(c))
+	if (cl == c || RCLASS_EXT(cl) == RCLASS_EXT(c))
 	    return Qtrue;
 	cl = RCLASS_SUPER(cl);
     }
@@ -1355,13 +1346,13 @@ rb_class_inherited_p(VALUE mod, VALUE arg)
 	rb_raise(rb_eTypeError, "compared with non class/module");
     }
     while (mod) {
-	if (RCLASS_M_TBL(mod) == RCLASS_M_TBL(arg))
+	if (RCLASS_EXT(mod) == RCLASS_EXT(arg))
 	    return Qtrue;
 	mod = RCLASS_SUPER(mod);
     }
     /* not mod < arg; check if mod > arg */
     while (arg) {
-	if (RCLASS_M_TBL(arg) == RCLASS_M_TBL(start))
+	if (RCLASS_EXT(arg) == RCLASS_EXT(start))
 	    return Qfalse;
 	arg = RCLASS_SUPER(arg);
     }
diff --git a/pool_alloc.h b/pool_alloc.h
new file mode 100644
index 0000000..957708e
--- /dev/null
+++ b/pool_alloc.h
@@ -0,0 +1,11 @@
+#ifndef POOL_ALLOC_H
+#define POOL_ALLOC_H
+
+#define POOL_ALLOC_API
+#ifdef POOL_ALLOC_API
+void  ruby_xpool_free(void *ptr);
+void *ruby_xpool_malloc_6p();
+void *ruby_xpool_malloc_11p();
+#endif
+
+#endif
diff --git a/pool_alloc.inc.h b/pool_alloc.inc.h
new file mode 100644
index 0000000..a7879ab
--- /dev/null
+++ b/pool_alloc.inc.h
@@ -0,0 +1,156 @@
+/*
+ * this is generic pool allocator
+ * you should define following macroses:
+ * ITEM_NAME - unique identifier, which allows to hold functions in a namespace
+ * ITEM_TYPEDEF(name) - passed to typedef to localize item type
+ * free_entry - desired name of function for free entry
+ * alloc_entry - defired name of function for allocate entry
+ */
+
+#if POOL_ALLOC_PART == 1
+#ifdef HEAP_ALIGN_LOG
+#define DEFAULT_POOL_SIZE (1 << HEAP_ALIGN_LOG)
+#else
+#define DEFAULT_POOL_SIZE (sizeof(void*) * 2048)
+#endif
+typedef unsigned int pool_holder_counter;
+
+typedef struct pool_entry_list pool_entry_list;
+typedef struct pool_holder pool_holder;
+
+typedef struct pool_header {
+    pool_holder         *first;
+    pool_holder         *_black_magick;
+    pool_holder_counter  size; // size of entry in sizeof(void*) items
+    pool_holder_counter  total; // size of entry in sizeof(void*) items
+} pool_header;
+
+struct pool_holder {
+    pool_holder_counter free, total;
+    pool_header  *header;
+    void               *freep;
+    pool_holder        *fore, *back;
+    void *data[1];
+};
+#define POOL_DATA_SIZE(pool_size) (((pool_size) - sizeof(void*) * 6 - offsetof(pool_holder, data)) / sizeof(void*))
+#define POOL_ENTRY_SIZE(item_type) ((sizeof(item_type) - 1) / sizeof(void*) + 1)
+#define POOL_HOLDER_COUNT(pool_size, item_type) (POOL_DATA_SIZE(pool_size)/POOL_ENTRY_SIZE(item_type))
+#define INIT_POOL(item_type) {NULL, NULL, POOL_ENTRY_SIZE(item_type), POOL_HOLDER_COUNT(DEFAULT_POOL_SIZE, item_type)}
+
+#elif POOL_ALLOC_PART == 2
+static pool_holder *
+pool_holder_alloc(pool_header *header)
+{
+    pool_holder *holder;
+    pool_holder_counter i, size, count;
+    register void **ptr;
+
+    size_t sz = offsetof(pool_holder, data) +
+	    header->size * header->total * sizeof(void*);
+#define objspace (&rb_objspace)
+    vm_malloc_prepare(objspace, DEFAULT_POOL_SIZE);
+    if (header->first != NULL) return header->first;
+    TRY_WITH_GC(holder = (pool_holder*) aligned_malloc(DEFAULT_POOL_SIZE, sz));
+    malloc_increase += DEFAULT_POOL_SIZE;
+#if CALC_EXACT_MALLOC_SIZE
+    objspace->malloc_params.allocated_size += DEFAULT_POOL_SIZE;
+    objspace->malloc_params.allocations++;
+#endif
+#undef objspace
+
+    size = header->size;
+    count = header->total;
+    holder->free = count;
+    holder->total = count;
+    holder->header = header;
+    holder->fore = NULL;
+    holder->back = NULL;
+    holder->freep = &holder->data;
+    ptr = holder->data;
+    for(i = count - 1; i; i-- ) {
+	ptr = *ptr = ptr + size;
+    }
+    *ptr = NULL;
+    header->first = holder;
+    return holder;
+}
+
+static inline void
+pool_holder_unchaing(pool_header *header, pool_holder *holder)
+{
+    register pool_holder *fore = holder->fore, *back = holder->back;
+    holder->fore = NULL;
+    holder->back = NULL;
+    if (fore != NULL)  fore->back     = back;
+    else               header->_black_magick = back;
+    if (back != NULL)  back->fore     = fore;
+    else               header->first = fore;
+}
+
+static inline pool_holder *
+entry_holder(void **entry)
+{
+    return (pool_holder*)(((uintptr_t)entry) & ~(DEFAULT_POOL_SIZE - 1));
+}
+
+static inline void
+pool_free_entry(void **entry)
+{
+    pool_holder *holder = entry_holder(entry);
+    pool_header *header = holder->header;
+
+    if (holder->free++ == 0) {
+	register pool_holder *first = header->first;
+	if (first == NULL) {
+	    header->first = holder;
+	} else {
+	    holder->back = first;
+	    holder->fore = first->fore;
+	    first->fore = holder;
+	    if (holder->fore)
+		holder->fore->back = holder;
+	    else
+		header->_black_magick = holder;
+	}
+    } else if (holder->free == holder->total && header->first != holder ) {
+	pool_holder_unchaing(header, holder);
+	aligned_free(holder);
+#if CALC_EXACT_MALLOC_SIZE
+	rb_objspace.malloc_params.allocated_size -= DEFAULT_POOL_SIZE;
+	rb_objspace.malloc_params.allocations--;
+#endif
+	return;
+    }
+
+    *entry = holder->freep;
+    holder->freep = entry;
+}
+
+static inline void*
+pool_alloc_entry(pool_header *header)
+{
+    pool_holder *holder = header->first;
+    void **result;
+    if (holder == NULL) {
+	holder = pool_holder_alloc(header);
+    }
+
+    result = holder->freep;
+    holder->freep = *result;
+
+    if (--holder->free == 0) {
+	pool_holder_unchaing(header, holder);
+    }
+
+    return result;
+}
+
+static void
+pool_finalize_header(pool_header *header)
+{
+    if (header->first) {
+        aligned_free(header->first);
+        header->first = NULL;
+    }
+}
+#endif
diff --git a/ruby.c b/ruby.c
index 3ddd96c..7ffc78e 100644
--- a/ruby.c
+++ b/ruby.c
@@ -1366,7 +1366,8 @@ process_options(int argc, char **argv, struct cmdline_options *opt)
 	long i;
 	VALUE load_path = GET_VM()->load_path;
 	for (i = 0; i < RARRAY_LEN(load_path); ++i) {
-	    rb_enc_associate(RARRAY_PTR(load_path)[i], lenc);
+	    RARRAY_PTR(load_path)[i] =
+		rb_enc_associate(rb_str_dup(RARRAY_PTR(load_path)[i]), lenc);
 	}
     }
     if (!(opt->disable & DISABLE_BIT(gems))) {
diff --git a/sp_ar.c b/sp_ar.c
new file mode 100644
index 0000000..2ed69bf
--- /dev/null
+++ b/sp_ar.c
@@ -0,0 +1,374 @@
+/*
+ * sparse array lib
+ * inspired by Lua table
+ * written by Sokolov Yura aka funny_falcon
+ */
+#ifdef NOT_RUBY
+#include "regint.h"
+#include "st.h"
+#else
+#include "ruby/ruby.h"
+#endif
+
+#include <stdio.h>
+#ifdef HAVE_STDLIB_H
+#include <stdlib.h>
+#endif
+#include <string.h>
+
+#ifdef RUBY
+#define malloc xmalloc
+#define calloc xcalloc
+#define realloc xrealloc
+#define free   xfree
+#endif
+
+#define sa_table_alloc()          (sa_table*)malloc(sizeof(sa_table))
+#define sa_table_xalloc()         (sa_table*)calloc(1, sizeof(sa_table))
+#define sa_table_dealloc(table)   free(table)
+#define sa_entry_alloc(n)         (sa_entry*)calloc((n), sizeof(sa_entry))
+#define sa_entry_dealloc(entries) free(entries)
+
+#define SA_LAST   1
+#define SA_OFFSET 2
+
+#define SA_MIN_SIZE 4
+
+void
+sa_init_table(register sa_table *table, sa_index_t num_bins)
+{
+    if (num_bins) {
+        table->num_entries = 0;
+        table->entries = sa_entry_alloc(num_bins);
+        table->num_bins = num_bins;
+        table->free_pos = num_bins;
+    }
+    else {
+        memset(table, 0, sizeof(sa_table));
+    }
+}
+
+sa_table*
+sa_new_table()
+{
+    sa_table* table = sa_table_alloc();
+    sa_init_table(table, 0);
+    return table;
+}
+
+static inline sa_index_t
+calc_pos(register sa_table* table, sa_index_t key)
+{
+    /* this formula is empirical */
+    /* it has no good avalance, but works well in our case */
+    key ^= key >> 16;
+    key *= 0x445229;
+    return (key + (key >> 16)) % table->num_bins;
+}
+
+static void
+fix_empty(register sa_table* table)
+{
+    while(--table->free_pos &&
+            table->entries[table->free_pos-1].next != SA_EMPTY);
+}
+
+#define FLOOR_TO_4 ((~((sa_index_t)0)) << 2)
+static sa_index_t
+find_empty(register sa_table* table, register sa_index_t pos)
+{
+    sa_index_t new_pos = table->free_pos-1;
+    sa_entry *entry;
+    pos &= FLOOR_TO_4;
+    entry = table->entries+pos;
+
+    if (entry->next == SA_EMPTY) { new_pos = pos; goto check; }
+    pos++; entry++;
+    if (entry->next == SA_EMPTY) { new_pos = pos; goto check; }
+    pos++; entry++;
+    if (entry->next == SA_EMPTY) { new_pos = pos; goto check; }
+    pos++; entry++;
+    if (entry->next == SA_EMPTY) { new_pos = pos; goto check; }
+
+check:
+    if (new_pos+1 == table->free_pos) fix_empty(table);
+    return new_pos;
+}
+
+static void resize(register sa_table* table);
+static int insert_into_chain(register sa_table*, register sa_index_t, st_data_t, sa_index_t pos);
+static int insert_into_main(register sa_table*, sa_index_t, st_data_t, sa_index_t pos, sa_index_t prev_pos);
+
+int
+sa_insert(register sa_table* table, register sa_index_t key, st_data_t value)
+{
+    sa_index_t pos, main_pos;
+    register sa_entry *entry;
+
+    if (table->num_bins == 0) {
+        sa_init_table(table, SA_MIN_SIZE);
+    }
+
+    pos = calc_pos(table, key);
+    entry = table->entries + pos;
+
+    if (entry->next == SA_EMPTY) {
+        entry->next = SA_LAST;
+        entry->key = key;
+        entry->value = value;
+        table->num_entries++;
+        if (pos+1 == table->free_pos) fix_empty(table);
+        return 0;
+    }
+
+    if (entry->key == key) {
+        entry->value = value;
+        return 1;
+    }
+
+    if (table->num_entries + (table->num_entries >> 2) > table->num_bins) {
+        resize(table);
+        return sa_insert(table, key, value);
+    }
+
+    main_pos = calc_pos(table, entry->key);
+    if (main_pos == pos) {
+        return insert_into_chain(table, key, value, pos);
+    }
+    else {
+        if (!table->free_pos) {
+            resize(table);
+            return sa_insert(table, key, value);
+        }
+        return insert_into_main(table, key, value, pos, main_pos);
+    }
+}
+
+static int
+insert_into_chain(register sa_table* table, register sa_index_t key, st_data_t value, sa_index_t pos)
+{
+    sa_entry *entry = table->entries + pos, *new_entry;
+    sa_index_t new_pos;
+
+    while (entry->next != SA_LAST) {
+        pos = entry->next - SA_OFFSET;
+        entry = table->entries + pos;
+        if (entry->key == key) {
+            entry->value = value;
+            return 1;
+        }
+    }
+
+    if (!table->free_pos) {
+        resize(table);
+        return sa_insert(table, key, value);
+    }
+
+    new_pos = find_empty(table, pos);
+    new_entry = table->entries + new_pos;
+    entry->next = new_pos + SA_OFFSET;
+
+    new_entry->next = SA_LAST;
+    new_entry->key = key;
+    new_entry->value = value;
+    table->num_entries++;
+    return 0;
+}
+
+static int
+insert_into_main(register sa_table* table, sa_index_t key, st_data_t value, sa_index_t pos, sa_index_t prev_pos)
+{
+    sa_entry *entry = table->entries + pos;
+    sa_index_t new_pos = find_empty(table, pos);
+    sa_entry *new_entry = table->entries + new_pos;
+    sa_index_t npos;
+
+    *new_entry = *entry;
+
+    while((npos = table->entries[prev_pos].next - SA_OFFSET) != pos) {
+        prev_pos = npos;
+    }
+    table->entries[prev_pos].next = new_pos + SA_OFFSET;
+
+    entry->next = SA_LAST;
+    entry->key = key;
+    entry->value = value;
+    table->num_entries++;
+    return 0;
+}
+
+static sa_index_t
+new_size(sa_index_t num_entries)
+{
+    sa_index_t msb = num_entries;
+    msb |= msb >> 1;
+    msb |= msb >> 2;
+    msb |= msb >> 4;
+    msb |= msb >> 8;
+    msb |= msb >> 16;
+    msb = ((msb >> 4) + 1) << 3;
+    return (num_entries & (msb | (msb >> 1))) + (msb >> 1);
+}
+
+static void
+resize(register sa_table *table)
+{
+    sa_table tmp_table;
+    sa_entry *entry;
+    sa_index_t i;
+
+    if (table->num_entries == 0) {
+        sa_entry_dealloc(table->entries);
+        memset(table, 0, sizeof(sa_table));
+        return;
+    }
+
+    sa_init_table(&tmp_table, new_size(table->num_entries + (table->num_entries >> 2)));
+    entry = table->entries;
+
+    for(i = 0; i < table->num_bins; i++, entry++) {
+        if (entry->next != SA_EMPTY) {
+            sa_insert(&tmp_table, entry->key, entry->value);
+        }
+    }
+    sa_entry_dealloc(table->entries);
+    *table = tmp_table;
+}
+
+int
+sa_lookup(register sa_table *table, register sa_index_t key, st_data_t *value)
+{
+    register sa_entry *entry;
+
+    if (table->num_entries == 0) return 0;
+
+    entry = table->entries + calc_pos(table, key);
+    if (entry->next == SA_EMPTY) return 0;
+
+    if (entry->key == key) goto found;
+    if (entry->next == SA_LAST) return 0;
+
+    entry = table->entries + (entry->next - SA_OFFSET);
+    if (entry->key == key) goto found;
+
+    while(entry->next != SA_LAST) {
+        entry = table->entries + (entry->next - SA_OFFSET);
+        if (entry->key == key) goto found;
+    }
+    return 0;
+found:
+    if (value) *value = entry->value;
+    return 1;
+}
+
+void
+sa_clear(sa_table *table)
+{
+    sa_entry_dealloc(table->entries);
+    memset(table, 0, sizeof(sa_table));
+}
+
+void
+sa_clear_no_free(sa_table *table)
+{
+    memset(table->entries, 0, sizeof(sa_entry) * table->num_bins);
+    table->num_entries = 0;
+    table->free_pos = table->num_bins;
+}
+
+void
+sa_free_table(sa_table *table)
+{
+    sa_entry_dealloc(table->entries);
+    sa_table_dealloc(table);
+}
+
+int
+sa_delete(sa_table *table, sa_index_t key, st_data_t *value)
+{
+    sa_index_t pos, prev_pos = ~0;
+    sa_entry *entry;
+
+    if (table->num_entries == 0) goto not_found;
+
+    pos = calc_pos(table, key);
+    entry = table->entries + pos;
+
+    if (entry->next == SA_EMPTY) goto not_found;
+
+    do {
+        if (entry->key == key) {
+            if (value) *value = entry->value;
+            if (entry->next != SA_LAST) {
+                sa_index_t npos = entry->next - SA_OFFSET;
+                *entry = table->entries[npos];
+                memset(table->entries + npos, 0, sizeof(sa_entry));
+            }
+            else {
+                memset(table->entries + pos, 0, sizeof(sa_entry));
+                if (~prev_pos) {
+                    table->entries[prev_pos].next = SA_LAST;
+                }
+            }
+            table->num_entries--;
+            if (table->num_entries < table->num_bins / 4) {
+                resize(table);
+            }
+            return 1;
+        }
+        if (entry->next == SA_LAST) break;
+        prev_pos = pos;
+        pos = entry->next - SA_OFFSET;
+        entry = table->entries + pos;
+    } while(1);
+
+not_found:
+    if (value) *value = 0;
+    return 0;
+}
+
+int
+sa_foreach(register sa_table *table, int (*func)(), st_data_t arg)
+{
+    sa_index_t i;
+    if (table->num_bins == 0) {
+        return 0;
+    }
+    for(i = 0; i < table->num_bins ; i++) {
+	if (table->entries[i].next != SA_EMPTY) {
+	    sa_index_t key = table->entries[i].key;
+	    st_data_t val = table->entries[i].value;
+	    if ((*func)(key, val, arg) == SA_STOP) break;
+	}
+    }
+    return 0;
+}
+
+size_t
+sa_memsize(const sa_table *table)
+{
+    return sizeof(sa_table) + table->num_bins * sizeof(sa_entry);
+}
+
+sa_table*
+sa_copy(sa_table *table)
+{
+    sa_table *new_table = sa_table_alloc();
+    *new_table = *table;
+    if (table->num_bins) {
+        new_table->entries = sa_entry_alloc(table->num_bins);
+        memcpy(new_table->entries, table->entries, table->num_bins*sizeof(sa_entry));
+    }
+    return new_table;
+}
+
+void
+sa_copy_to(sa_table *from, sa_table *to)
+{
+    sa_entry_dealloc(to->entries);
+    *to = *from;
+    if (to->num_bins) {
+	to->entries = sa_entry_alloc(to->num_bins);
+	memcpy(to->entries, from->entries, from->num_bins*sizeof(sa_entry));
+    }
+}
diff --git a/st.c b/st.c
index fda5784..20ec427 100644
--- a/st.c
+++ b/st.c
@@ -7,6 +7,7 @@
 #include "st.h"
 #else
 #include "ruby/ruby.h"
+#include "pool_alloc.h"
 #endif
 
 #include <stdio.h>
@@ -25,8 +26,17 @@ struct st_table_entry {
     st_table_entry *fore, *back;
 };
 
-#define ST_DEFAULT_MAX_DENSITY 5
+#define STATIC_ASSERT(name, expr) typedef int static_assert_##name##_check[(expr) ? 1 : -1];
+
+#define ST_DEFAULT_MAX_DENSITY 2
 #define ST_DEFAULT_INIT_TABLE_SIZE 11
+#define ST_DEFAULT_SECOND_TABLE_SIZE 19
+#define ST_DEFAULT_PACKED_TABLE_SIZE 19
+#define PACKED_UNIT (int)(sizeof(st_packed_entry) / sizeof(st_table_entry*))
+#define MAX_PACKED_HASH (int)(ST_DEFAULT_PACKED_TABLE_SIZE * sizeof(st_table_entry*) / sizeof(st_packed_entry))
+
+STATIC_ASSERT(st_packed_entry, sizeof(st_packed_entry) == sizeof(st_table_entry*[PACKED_UNIT]))
+STATIC_ASSERT(st_packed_bins, sizeof(st_packed_entry[MAX_PACKED_HASH]) <= sizeof(st_table_entry*[ST_DEFAULT_PACKED_TABLE_SIZE]))
 
     /*
      * DEFAULT_MAX_DENSITY is the default for the largest we allow the
@@ -38,7 +48,8 @@ struct st_table_entry {
      *
      */
 
-static const struct st_hash_type type_numhash = {
+#define type_numhash st_hashtype_num
+const struct st_hash_type st_hashtype_num = {
     st_numcmp,
     st_numhash,
 };
@@ -61,20 +72,128 @@ static void rehash(st_table *);
 #ifdef RUBY
 #define malloc xmalloc
 #define calloc xcalloc
+#define realloc xrealloc
 #define free(x) xfree(x)
 #endif
 
 #define numberof(array) (int)(sizeof(array) / sizeof((array)[0]))
 
-#define alloc(type) (type*)malloc((size_t)sizeof(type))
-#define Calloc(n,s) (char*)calloc((n),(s))
-
 #define EQUAL(table,x,y) ((x)==(y) || (*(table)->type->compare)((x),(y)) == 0)
 
-/* remove cast to unsigned int in the future */
-#define do_hash(key,table) (unsigned int)(st_index_t)(*(table)->type->hash)((key))
+#define do_hash(key,table) (st_index_t)(*(table)->type->hash)((key))
 #define do_hash_bin(key,table) (do_hash((key), (table))%(table)->num_bins)
 
+/* preparation for possible allocation improvements */
+#ifdef POOL_ALLOC_API
+#define st_alloc_entry() (st_table_entry *)ruby_xpool_malloc_6p()
+#define st_free_entry(entry) ruby_xpool_free(entry)
+#define st_alloc_table() (st_table *)ruby_xpool_malloc_6p()
+#define st_dealloc_table(table) ruby_xpool_free(table)
+static inline st_table_entry **
+st_alloc_bins(st_index_t size)
+{
+    st_table_entry **result;
+    if (size == 11) {
+        result = (st_table_entry **) ruby_xpool_malloc_11p();
+        memset(result, 0, 11 * sizeof(st_table_entry *));
+    }
+    else
+        result = (st_table_entry **) ruby_xcalloc(size, sizeof(st_table_entry*));
+    return result;
+}
+static inline void
+st_free_bins(st_table_entry **bins, st_index_t size)
+{
+    if (size == 11)
+	ruby_xpool_free(bins);
+    else
+	ruby_xfree(bins);
+}
+static inline st_table_entry**
+st_realloc_bins(st_table_entry **bins, st_index_t newsize, st_index_t oldsize)
+{
+    st_table_entry **new_bins = st_alloc_bins(newsize);
+    st_free_bins(bins, oldsize);
+    return new_bins;
+}
+#else
+#define st_alloc_entry() (st_table_entry *)malloc(sizeof(st_table_entry))
+#define st_free_entry(entry) free(entry)
+#define st_alloc_table() (st_table *)malloc(sizeof(st_table))
+#define st_dealloc_table(table) free(table)
+#define st_alloc_bins(size) (st_table_entry **)calloc(size, sizeof(st_table_entry *))
+#define st_free_bins(bins, size) free(bins)
+static inline st_table_entry**
+st_realloc_bins(st_table_entry **bins, st_index_t newsize, st_index_t oldsize)
+{
+    bins = (st_table_entry **)realloc(bins, newsize * sizeof(st_table_entry *));
+    MEMZERO(bins, st_table_entry*, newsize);
+    return bins;
+}
+#endif
+
+/* Shortage */
+#define bins as.big.bins
+#define head as.big.head
+#define tail as.big.tail
+#define real_entries as.packed.real_entries
+
+/* preparation for possible packing improvements */
+#define PACKED_BINS(table) ((table)->as.packed.entries)
+#define PACKED_ENT(table, i) PACKED_BINS(table)[i]
+#define PKEY(table, i) PACKED_ENT((table), (i)).key
+#define PVAL(table, i) PACKED_ENT((table), (i)).val
+#define PHASH(table, i) PACKED_ENT((table), (i)).hash
+#define PKEY_SET(table, i, v) (PKEY((table), (i)) = (v))
+#define PVAL_SET(table, i, v) (PVAL((table), (i)) = (v))
+#define PHASH_SET(table, i, v) (PHASH((table), (i)) = (v))
+
+/* this function depends much on packed layout, so that it placed here */
+static inline void
+remove_packed_entry(st_table *table, st_index_t i)
+{
+    table->real_entries--;
+    table->num_entries--;
+    if (i < table->real_entries) {
+	MEMMOVE(&PACKED_ENT(table, i), &PACKED_ENT(table, i+1),
+		st_packed_entry, table->real_entries - i);
+    }
+}
+
+static inline void
+remove_safe_packed_entry(st_table *table, st_index_t i, st_data_t never)
+{
+    table->num_entries--;
+    PKEY_SET(table, i, never);
+    PVAL_SET(table, i, never);
+    PHASH_SET(table, i, 0);
+}
+
+/* ultrapacking */
+#define real_upacked num_bins
+#define MAX_UPACKED_HASH 1
+#define ULTRAPACKED(table) ((table)->real_upacked <= 1)
+#define UPACKED_ENT(table) ((table)->as.upacked)
+#define UPKEY(table) UPACKED_ENT(table).key
+#define UPVAL(table) UPACKED_ENT(table).val
+#define UPHASH(table) UPACKED_ENT(table).hash
+#define UPKEY_SET(table, v) (UPACKED_ENT(table).key = (v))
+#define UPVAL_SET(table, v) (UPACKED_ENT(table).val = (v))
+#define UPHASH_SET(table, v) (UPACKED_ENT(table).hash = (v))
+static inline void
+remove_upacked_entry(st_table *table)
+{
+    table->real_upacked = table->num_entries = 0;
+}
+
+static inline void
+remove_safe_upacked_entry(st_table *table, st_data_t never)
+{
+    table->num_entries = 0;
+    UPKEY_SET(table, never);
+    UPVAL_SET(table, never);
+    UPHASH_SET(table, 0);
+}
 /*
  * MINSIZE is the minimum size of a dictionary.
  */
@@ -85,8 +204,8 @@ static void rehash(st_table *);
 Table of prime numbers 2^n+a, 2<=n<=30.
 */
 static const unsigned int primes[] = {
-	8 + 3,
-	16 + 3,
+	ST_DEFAULT_INIT_TABLE_SIZE,
+	ST_DEFAULT_SECOND_TABLE_SIZE,
 	32 + 5,
 	64 + 3,
 	128 + 3,
@@ -161,8 +280,6 @@ stat_col(void)
 }
 #endif
 
-#define MAX_PACKED_NUMHASH (ST_DEFAULT_INIT_TABLE_SIZE/2)
-
 st_table*
 st_init_table_with_size(const struct st_hash_type *type, st_index_t size)
 {
@@ -181,14 +298,19 @@ st_init_table_with_size(const struct st_hash_type *type, st_index_t size)
     }
 #endif
 
-    size = new_size(size);	/* round up to prime number */
 
-    tbl = alloc(st_table);
+    tbl = st_alloc_table();
     tbl->type = type;
     tbl->num_entries = 0;
-    tbl->entries_packed = type == &type_numhash && size/2 <= MAX_PACKED_NUMHASH;
+    tbl->entries_packed = size <= MAX_PACKED_HASH;
+    if (tbl->entries_packed) {
+	size = size <= MAX_UPACKED_HASH ? 0 : ST_DEFAULT_PACKED_TABLE_SIZE;
+    }
+    else {
+	size = new_size(size);	/* round up to prime number */
+    }
     tbl->num_bins = size;
-    tbl->bins = (st_table_entry **)Calloc(size, sizeof(st_table_entry*));
+    tbl->bins = size ? st_alloc_bins(size) : 0;
     tbl->head = 0;
     tbl->tail = 0;
 
@@ -243,17 +365,23 @@ st_clear(st_table *table)
     register st_table_entry *ptr, *next;
     st_index_t i;
 
+    if (ULTRAPACKED(table)) {
+	remove_upacked_entry(table);
+	return;
+    }
+
     if (table->entries_packed) {
         table->num_entries = 0;
+        table->real_entries = 0;
         return;
     }
 
-    for(i = 0; i < table->num_bins; i++) {
+    for (i = 0; i < table->num_bins; i++) {
 	ptr = table->bins[i];
 	table->bins[i] = 0;
 	while (ptr != 0) {
 	    next = ptr->next;
-	    free(ptr);
+	    st_free_entry(ptr);
 	    ptr = next;
 	}
     }
@@ -266,14 +394,19 @@ void
 st_free_table(st_table *table)
 {
     st_clear(table);
-    free(table->bins);
-    free(table);
+    if (!ULTRAPACKED(table)) {
+	st_free_bins(table->bins, table->num_bins);
+    }
+    st_dealloc_table(table);
 }
 
 size_t
 st_memsize(const st_table *table)
 {
-    if (table->entries_packed) {
+    if (ULTRAPACKED(table)) {
+	return sizeof(st_table);
+    }
+    else if (table->entries_packed) {
 	return table->num_bins * sizeof (void *) + sizeof(st_table);
     }
     else {
@@ -306,46 +439,77 @@ count_collision(const struct st_hash_type *type)
 #define FOUND_ENTRY
 #endif
 
-#define FIND_ENTRY(table, ptr, hash_val, bin_pos) do {\
-    (bin_pos) = (hash_val)%(table)->num_bins;\
-    (ptr) = (table)->bins[(bin_pos)];\
-    FOUND_ENTRY;\
-    if (PTR_NOT_EQUAL((table), (ptr), (hash_val), key)) {\
-	COLLISION;\
-	while (PTR_NOT_EQUAL((table), (ptr)->next, (hash_val), key)) {\
-	    (ptr) = (ptr)->next;\
-	}\
-	(ptr) = (ptr)->next;\
-    }\
-} while (0)
+#define FIND_ENTRY(table, ptr, hash_val, bin_pos) \
+    ((ptr) = find_entry((table), key, (hash_val), ((bin_pos) = (hash_val)%(table)->num_bins)))
+
+static st_table_entry *
+find_entry(st_table *table, st_data_t key, st_index_t hash_val, st_index_t bin_pos)
+{
+    register st_table_entry *ptr = table->bins[bin_pos];
+    FOUND_ENTRY;
+    if (PTR_NOT_EQUAL(table, ptr, hash_val, key)) {
+	COLLISION;
+	while (PTR_NOT_EQUAL(table, ptr->next, hash_val, key)) {
+	    ptr = ptr->next;
+	}
+	ptr = ptr->next;
+    }
+    return ptr;
+}
+
+static inline st_index_t
+find_packed_index(st_table *table, st_index_t hash_val, st_data_t key)
+{
+    st_index_t i = 0;
+    while (i < table->real_entries &&
+	   (PHASH(table, i) != hash_val || !EQUAL(table, key, PKEY(table, i)))) {
+	i++;
+    }
+    return i;
+}
+
+static inline int
+check_upacked(st_table *table, st_index_t hash_val, st_data_t key)
+{
+    return table->num_entries &&
+	UPHASH(table) == hash_val &&
+	EQUAL(table, key, UPKEY(table));
+}
 
 #define collision_check 0
 
 int
 st_lookup(st_table *table, register st_data_t key, st_data_t *value)
 {
-    st_index_t hash_val, bin_pos;
+    st_index_t hash_val;
     register st_table_entry *ptr;
 
+    hash_val = do_hash(key, table);
+
+    if (ULTRAPACKED(table)) {
+	if (check_upacked(table, hash_val, key)) {
+	    if (value != 0) *value = UPVAL(table);
+	    return 1;
+	}
+	return 0;
+    }
+
     if (table->entries_packed) {
-        st_index_t i;
-        for (i = 0; i < table->num_entries; i++) {
-            if ((st_data_t)table->bins[i*2] == key) {
-                if (value !=0) *value = (st_data_t)table->bins[i*2+1];
-                return 1;
-            }
-        }
+	st_index_t i = find_packed_index(table, hash_val, key);
+	if (i < table->real_entries) {
+	    if (value != 0) *value = PVAL(table, i);
+	    return 1;
+	}
         return 0;
     }
 
-    hash_val = do_hash(key, table);
-    FIND_ENTRY(table, ptr, hash_val, bin_pos);
+    ptr = find_entry(table, key, hash_val, hash_val % table->num_bins);
 
     if (ptr == 0) {
 	return 0;
     }
     else {
-	if (value != 0)  *value = ptr->record;
+	if (value != 0) *value = ptr->record;
 	return 1;
     }
 }
@@ -353,22 +517,29 @@ st_lookup(st_table *table, register st_data_t key, st_data_t *value)
 int
 st_get_key(st_table *table, register st_data_t key, st_data_t *result)
 {
-    st_index_t hash_val, bin_pos;
+    st_index_t hash_val;
     register st_table_entry *ptr;
 
+    hash_val = do_hash(key, table);
+
+    if (ULTRAPACKED(table)) {
+	if (check_upacked(table, hash_val, key)) {
+	    if (result != 0) *result = UPKEY(table);
+	    return 1;
+	}
+	return 0;
+    }
+
     if (table->entries_packed) {
-        st_index_t i;
-        for (i = 0; i < table->num_entries; i++) {
-            if ((st_data_t)table->bins[i*2] == key) {
-                if (result !=0) *result = (st_data_t)table->bins[i*2];
-                return 1;
-            }
-        }
+	st_index_t i = find_packed_index(table, hash_val, key);
+	if (i < table->real_entries) {
+	    if (result != 0) *result = PKEY(table, i);
+	    return 1;
+	}
         return 0;
     }
 
-    hash_val = do_hash(key, table);
-    FIND_ENTRY(table, ptr, hash_val, bin_pos);
+    ptr = find_entry(table, key, hash_val, hash_val % table->num_bins);
 
     if (ptr == 0) {
 	return 0;
@@ -382,85 +553,151 @@ st_get_key(st_table *table, register st_data_t key, st_data_t *result)
 #undef collision_check
 #define collision_check 1
 
-#define MORE_PACKABLE_P(table) \
-    ((st_index_t)((table)->num_entries+1) * 2 <= (table)->num_bins && \
-     (table)->num_entries+1 <= MAX_PACKED_NUMHASH)
-
-#define ADD_DIRECT(table, key, value, hash_val, bin_pos)\
-do {\
-    st_table_entry *entry;\
-    if ((table)->num_entries > ST_DEFAULT_MAX_DENSITY * (table)->num_bins) {\
-	rehash(table);\
-        (bin_pos) = (hash_val) % (table)->num_bins;\
-    }\
-    \
-    entry = alloc(st_table_entry);\
-    \
-    entry->hash = (hash_val);\
-    entry->key = (key);\
-    entry->record = (value);\
-    entry->next = (table)->bins[(bin_pos)];\
-    if ((table)->head != 0) {\
-	entry->fore = 0;\
-	(entry->back = (table)->tail)->fore = entry;\
-	(table)->tail = entry;\
-    }\
-    else {\
-	(table)->head = (table)->tail = entry;\
-	entry->fore = entry->back = 0;\
-    }\
-    (table)->bins[(bin_pos)] = entry;\
-    (table)->num_entries++;\
-} while (0)
+static inline st_table_entry *
+new_entry(st_table * table, st_data_t key, st_data_t value,
+	st_index_t hash_val, register st_index_t bin_pos)
+{
+    register st_table_entry *entry = st_alloc_entry();
+
+    entry->next = table->bins[bin_pos];
+    table->bins[bin_pos] = entry;
+    entry->hash = hash_val;
+    entry->key = key;
+    entry->record = value;
+
+    return entry;
+}
+
+static inline void
+add_direct(st_table *table, st_data_t key, st_data_t value,
+	   st_index_t hash_val, register st_index_t bin_pos)
+{
+    register st_table_entry *entry;
+    if (table->num_entries > ST_DEFAULT_MAX_DENSITY * table->num_bins) {
+	rehash(table);
+        bin_pos = hash_val % table->num_bins;
+    }
+
+    entry = new_entry(table, key, value, hash_val, bin_pos);
+
+    if (table->head != 0) {
+	entry->fore = 0;
+	(entry->back = table->tail)->fore = entry;
+	table->tail = entry;
+    }
+    else {
+	table->head = table->tail = entry;
+	entry->fore = entry->back = 0;
+    }
+    table->num_entries++;
+}
 
 static void
 unpack_entries(register st_table *table)
 {
     st_index_t i;
-    struct st_table_entry *packed_bins[MAX_PACKED_NUMHASH*2];
+    st_packed_entry packed_bins[MAX_PACKED_HASH];
+    register st_table_entry *entry, *preventry = 0, **chain;
     st_table tmp_table = *table;
 
-    memcpy(packed_bins, table->bins, sizeof(struct st_table_entry *) * table->num_entries*2);
-    table->bins = packed_bins;
+    MEMCPY(packed_bins, PACKED_BINS(table), st_packed_entry, MAX_PACKED_HASH);
+    table->as.packed.entries = packed_bins;
     tmp_table.entries_packed = 0;
-    tmp_table.num_entries = 0;
-    memset(tmp_table.bins, 0, sizeof(struct st_table_entry *) * tmp_table.num_bins);
-    for (i = 0; i < table->num_entries; i++) {
-        st_insert(&tmp_table, (st_data_t)packed_bins[i*2], (st_data_t)packed_bins[i*2+1]);
-    }
+#if ST_DEFAULT_INIT_TABLE_SIZE == ST_DEFAULT_PACKED_TABLE_SIZE
+    MEMZERO(tmp_table.bins, st_table_entry*, tmp_table.num_bins);
+#else
+    tmp_table.bins = st_realloc_bins(tmp_table.bins, ST_DEFAULT_INIT_TABLE_SIZE, tmp_table.num_bins);
+    tmp_table.num_bins = ST_DEFAULT_INIT_TABLE_SIZE;
+#endif
+    i = 0;
+    chain = &tmp_table.head;
+    do {
+	st_data_t key = packed_bins[i].key;
+	st_data_t val = packed_bins[i].val;
+	st_index_t hash = packed_bins[i].hash;
+	entry = new_entry(&tmp_table, key, val, hash,
+			  hash % ST_DEFAULT_INIT_TABLE_SIZE);
+	*chain = entry;
+	entry->back = preventry;
+	preventry = entry;
+	chain = &entry->fore;
+    } while (++i < MAX_PACKED_HASH);
+    *chain = NULL;
+    tmp_table.tail = entry;
     *table = tmp_table;
 }
 
+static void
+add_packed_direct(st_table *table, st_data_t key, st_data_t value, st_index_t hash_val)
+{
+    if (table->real_entries < MAX_PACKED_HASH) {
+	st_index_t i = table->real_entries++;
+	PKEY_SET(table, i, key);
+	PVAL_SET(table, i, value);
+	PHASH_SET(table, i, hash_val);
+	table->num_entries++;
+    }
+    else {
+	unpack_entries(table);
+	add_direct(table, key, value, hash_val, hash_val % table->num_bins);
+    }
+}
+
+static void
+add_upacked_direct(register st_table *table, register st_data_t key, st_data_t value, st_index_t hash_val)
+{
+    if (table->real_upacked) {
+	st_packed_entry *entries = (st_packed_entry *) st_alloc_bins(ST_DEFAULT_PACKED_TABLE_SIZE);
+	entries[0] = UPACKED_ENT(table);
+	entries[1].hash = hash_val;
+	entries[1].key = key;
+	entries[1].val = value;
+	table->num_bins = ST_DEFAULT_PACKED_TABLE_SIZE;
+	table->real_entries = 2;
+	table->num_entries++;
+	table->as.packed.entries = entries;
+    }
+    else {
+	table->real_upacked = 1;
+	table->num_entries = 1;
+	UPHASH_SET(table, hash_val);
+	UPKEY_SET(table, key);
+	UPVAL_SET(table, value);
+    }
+}
+
 int
 st_insert(register st_table *table, register st_data_t key, st_data_t value)
 {
-    st_index_t hash_val, bin_pos;
+    st_index_t hash_val;
+    register st_index_t bin_pos;
     register st_table_entry *ptr;
 
+    hash_val = do_hash(key, table);
+
+    if (ULTRAPACKED(table)) {
+	if (check_upacked(table, hash_val, key)) {
+	    UPVAL_SET(table, value);
+	    return 1;
+	}
+	add_upacked_direct(table, key, value, hash_val);
+	return 0;
+    }
+
     if (table->entries_packed) {
-        st_index_t i;
-        for (i = 0; i < table->num_entries; i++) {
-            if ((st_data_t)table->bins[i*2] == key) {
-                table->bins[i*2+1] = (struct st_table_entry*)value;
-                return 1;
-            }
-        }
-        if (MORE_PACKABLE_P(table)) {
-            i = table->num_entries++;
-            table->bins[i*2] = (struct st_table_entry*)key;
-            table->bins[i*2+1] = (struct st_table_entry*)value;
-            return 0;
-        }
-        else {
-            unpack_entries(table);
+	st_index_t i = find_packed_index(table, hash_val, key);
+	if (i < table->real_entries) {
+	    PVAL_SET(table, i, value);
+	    return 1;
         }
+	add_packed_direct(table, key, value, hash_val);
+	return 0;
     }
 
-    hash_val = do_hash(key, table);
     FIND_ENTRY(table, ptr, hash_val, bin_pos);
 
     if (ptr == 0) {
-	ADD_DIRECT(table, key, value, hash_val, bin_pos);
+	add_direct(table, key, value, hash_val, bin_pos);
 	return 0;
     }
     else {
@@ -473,34 +710,38 @@ int
 st_insert2(register st_table *table, register st_data_t key, st_data_t value,
 	   st_data_t (*func)(st_data_t))
 {
-    st_index_t hash_val, bin_pos;
+    st_index_t hash_val;
+    register st_index_t bin_pos;
     register st_table_entry *ptr;
 
+    hash_val = do_hash(key, table);
+
+    if (ULTRAPACKED(table)) {
+	if (check_upacked(table, hash_val, key)) {
+	    UPVAL_SET(table, value);
+	    return 1;
+	}
+	key = (*func)(key);
+	add_upacked_direct(table, key, value, hash_val);
+	return 0;
+    }
+
     if (table->entries_packed) {
-        st_index_t i;
-        for (i = 0; i < table->num_entries; i++) {
-            if ((st_data_t)table->bins[i*2] == key) {
-                table->bins[i*2+1] = (struct st_table_entry*)value;
-                return 1;
-            }
-        }
-        if (MORE_PACKABLE_P(table)) {
-            i = table->num_entries++;
-            table->bins[i*2] = (struct st_table_entry*)key;
-            table->bins[i*2+1] = (struct st_table_entry*)value;
-            return 0;
-        }
-        else {
-            unpack_entries(table);
-        }
+	st_index_t i = find_packed_index(table, hash_val, key);
+	if (i < table->real_entries) {
+	    PVAL_SET(table, i, value);
+	    return 1;
+	}
+	key = (*func)(key);
+	add_packed_direct(table, key, value, hash_val);
+	return 0;
     }
 
-    hash_val = do_hash(key, table);
     FIND_ENTRY(table, ptr, hash_val, bin_pos);
 
     if (ptr == 0) {
 	key = (*func)(key);
-	ADD_DIRECT(table, key, value, hash_val, bin_pos);
+	add_direct(table, key, value, hash_val, bin_pos);
 	return 0;
     }
     else {
@@ -512,36 +753,30 @@ st_insert2(register st_table *table, register st_data_t key, st_data_t value,
 void
 st_add_direct(st_table *table, st_data_t key, st_data_t value)
 {
-    st_index_t hash_val, bin_pos;
+    st_index_t hash_val;
+
+    hash_val = do_hash(key, table);
+    if (ULTRAPACKED(table)) {
+	add_upacked_direct(table, key, value, hash_val);
+	return;
+    }
 
     if (table->entries_packed) {
-        int i;
-        if (MORE_PACKABLE_P(table)) {
-            i = table->num_entries++;
-            table->bins[i*2] = (struct st_table_entry*)key;
-            table->bins[i*2+1] = (struct st_table_entry*)value;
-            return;
-        }
-        else {
-            unpack_entries(table);
-        }
+	add_packed_direct(table, key, value, hash_val);
+	return;
     }
 
-    hash_val = do_hash(key, table);
-    bin_pos = hash_val % table->num_bins;
-    ADD_DIRECT(table, key, value, hash_val, bin_pos);
+    add_direct(table, key, value, hash_val, hash_val % table->num_bins);
 }
 
 static void
 rehash(register st_table *table)
 {
     register st_table_entry *ptr, **new_bins;
-    st_index_t i, new_num_bins, hash_val;
+    st_index_t new_num_bins, hash_val;
 
     new_num_bins = new_size(table->num_bins+1);
-    new_bins = (st_table_entry**)
-	xrealloc(table->bins, new_num_bins * sizeof(st_table_entry*));
-    for (i = 0; i < new_num_bins; ++i) new_bins[i] = 0;
+    new_bins = st_realloc_bins(table->bins, new_num_bins, table->num_bins);
     table->num_bins = new_num_bins;
     table->bins = new_bins;
 
@@ -558,34 +793,37 @@ st_table*
 st_copy(st_table *old_table)
 {
     st_table *new_table;
-    st_table_entry *ptr, *entry, *prev, **tail;
+    st_table_entry *ptr, *entry, *prev, **tailp;
     st_index_t num_bins = old_table->num_bins;
     st_index_t hash_val;
 
-    new_table = alloc(st_table);
+    new_table = st_alloc_table();
     if (new_table == 0) {
 	return 0;
     }
 
     *new_table = *old_table;
-    new_table->bins = (st_table_entry**)
-	Calloc((unsigned)num_bins, sizeof(st_table_entry*));
+    if (ULTRAPACKED(old_table)) {
+	return new_table;
+    }
+
+    new_table->bins = st_alloc_bins(num_bins);
 
     if (new_table->bins == 0) {
-	free(new_table);
+	st_dealloc_table(new_table);
 	return 0;
     }
 
     if (old_table->entries_packed) {
-        memcpy(new_table->bins, old_table->bins, sizeof(struct st_table_entry *) * old_table->num_bins);
+        MEMCPY(new_table->bins, old_table->bins, st_table_entry*, old_table->num_bins);
         return new_table;
     }
 
     if ((ptr = old_table->head) != 0) {
 	prev = 0;
-	tail = &new_table->head;
+	tailp = &new_table->head;
 	do {
-	    entry = alloc(st_table_entry);
+	    entry = st_alloc_entry();
 	    if (entry == 0) {
 		st_free_table(new_table);
 		return 0;
@@ -595,8 +833,8 @@ st_copy(st_table *old_table)
 	    entry->next = new_table->bins[hash_val];
 	    new_table->bins[hash_val] = entry;
 	    entry->back = prev;
-	    *tail = prev = entry;
-	    tail = &entry->fore;
+	    *tailp = prev = entry;
+	    tailp = &entry->fore;
 	} while ((ptr = ptr->fore) != 0);
 	new_table->tail = prev;
     }
@@ -604,21 +842,22 @@ st_copy(st_table *old_table)
     return new_table;
 }
 
-#define REMOVE_ENTRY(table, ptr) do					\
-    {									\
-	if ((ptr)->fore == 0 && (ptr)->back == 0) {			\
-	    (table)->head = 0;						\
-	    (table)->tail = 0;						\
-	}								\
-	else {								\
-	    st_table_entry *fore = (ptr)->fore, *back = (ptr)->back;	\
-	    if (fore) fore->back = back;				\
-	    if (back) back->fore = fore;				\
-	    if ((ptr) == (table)->head) (table)->head = fore;		\
-	    if ((ptr) == (table)->tail) (table)->tail = back;		\
-	}								\
-	(table)->num_entries--;						\
-    } while (0)
+static inline void
+remove_entry(st_table *table, st_table_entry *ptr)
+{
+    if (ptr->fore == 0 && ptr->back == 0) {
+	table->head = 0;
+	table->tail = 0;
+    }
+    else {
+	st_table_entry *fore = ptr->fore, *back = ptr->back;
+	if (fore) fore->back = back;
+	if (back) back->fore = fore;
+	if (ptr == table->head) table->head = fore;
+	if (ptr == table->tail) table->tail = back;
+    }
+    table->num_entries--;
+}
 
 int
 st_delete(register st_table *table, register st_data_t *key, st_data_t *value)
@@ -627,30 +866,38 @@ st_delete(register st_table *table, register st_data_t *key, st_data_t *value)
     st_table_entry **prev;
     register st_table_entry *ptr;
 
+    hash_val = do_hash(*key, table);
+
+    if (ULTRAPACKED(table)) {
+	if (check_upacked(table, hash_val, *key)) {
+	    if (value != 0) *value = UPVAL(table);
+	    *key = UPKEY(table);
+	    remove_upacked_entry(table);
+	    return 1;
+	}
+	return 0;
+    }
+
     if (table->entries_packed) {
-        st_index_t i;
-        for (i = 0; i < table->num_entries; i++) {
-            if ((st_data_t)table->bins[i*2] == *key) {
-                if (value != 0) *value = (st_data_t)table->bins[i*2+1];
-                table->num_entries--;
-                memmove(&table->bins[i*2], &table->bins[(i+1)*2],
-                        sizeof(struct st_table_entry*) * 2*(table->num_entries-i));
-                return 1;
-            }
+	st_index_t i = find_packed_index(table, hash_val, *key);
+	if (i < table->real_entries) {
+	    if (value != 0) *value = PVAL(table, i);
+	    *key = PKEY(table, i);
+	    remove_packed_entry(table, i);
+	    return 1;
         }
         if (value != 0) *value = 0;
         return 0;
     }
 
-    hash_val = do_hash_bin(*key, table);
-
-    for (prev = &table->bins[hash_val]; (ptr = *prev) != 0; prev = &ptr->next) {
+    prev = &table->bins[hash_val % table->num_bins];
+    for (;(ptr = *prev) != 0; prev = &ptr->next) {
 	if (EQUAL(table, *key, ptr->key)) {
 	    *prev = ptr->next;
-	    REMOVE_ENTRY(table, ptr);
+	    remove_entry(table, ptr);
 	    if (value != 0) *value = ptr->record;
 	    *key = ptr->key;
-	    free(ptr);
+	    st_free_entry(ptr);
 	    return 1;
 	}
     }
@@ -665,25 +912,36 @@ st_delete_safe(register st_table *table, register st_data_t *key, st_data_t *val
     st_index_t hash_val;
     register st_table_entry *ptr;
 
+    hash_val = do_hash(*key, table);
+
+    if (ULTRAPACKED(table)) {
+	if (check_upacked(table, hash_val, *key)) {
+	    if (value != 0) *value = UPVAL(table);
+	    *key = UPKEY(table);
+	    remove_safe_upacked_entry(table, never);
+	    return 1;
+	}
+	if (value != 0) *value = 0;
+	return 0;
+    }
+
     if (table->entries_packed) {
-	st_index_t i;
-	for (i = 0; i < table->num_entries; i++) {
-	    if ((st_data_t)table->bins[i*2] == *key) {
-		if (value != 0) *value = (st_data_t)table->bins[i*2+1];
-		table->bins[i*2] = (void *)never;
-		return 1;
-	    }
+	st_index_t i = find_packed_index(table, hash_val, *key);
+	if (i < table->real_entries) {
+	    if (value != 0) *value = PVAL(table, i);
+	    *key = PKEY(table, i);
+	    remove_safe_packed_entry(table, i, never);
+	    return 1;
 	}
 	if (value != 0) *value = 0;
 	return 0;
     }
 
-    hash_val = do_hash_bin(*key, table);
-    ptr = table->bins[hash_val];
+    ptr = table->bins[hash_val % table->num_bins];
 
     for (; ptr != 0; ptr = ptr->next) {
 	if ((ptr->key != never) && EQUAL(table, ptr->key, *key)) {
-	    REMOVE_ENTRY(table, ptr);
+	    remove_entry(table, ptr);
 	    *key = ptr->key;
 	    if (value != 0) *value = ptr->record;
 	    ptr->key = ptr->record = never;
@@ -701,17 +959,23 @@ st_cleanup_safe(st_table *table, st_data_t never)
     st_table_entry *ptr, **last, *tmp;
     st_index_t i;
 
+    if (ULTRAPACKED(table)) {
+	table->real_upacked = table->num_entries;
+	return;
+    }
+
     if (table->entries_packed) {
 	st_index_t i = 0, j = 0;
-	while ((st_data_t)table->bins[i*2] != never) {
-	    if (i++ == table->num_entries) return;
+	while (PKEY(table, i) != never) {
+	    if (i++ == table->real_entries) return;
 	}
-	for (j = i; ++i < table->num_entries;) {
-	    if ((st_data_t)table->bins[i*2] == never) continue;
-	    table->bins[j*2] = table->bins[i*2];
-	    table->bins[j*2+1] = table->bins[i*2+1];
+	for (j = i; ++i < table->real_entries;) {
+	    if (PKEY(table, i) == never) continue;
+	    PACKED_ENT(table, j) = PACKED_ENT(table, i);
 	    j++;
 	}
+	table->real_entries = j;
+	/* table->num_entries really should be equal j at this moment, but let set it anyway */
 	table->num_entries = j;
 	return;
     }
@@ -722,7 +986,7 @@ st_cleanup_safe(st_table *table, st_data_t never)
 	    if (ptr->key == never) {
 		tmp = ptr;
 		*last = ptr = ptr->next;
-		free(tmp);
+		st_free_entry(tmp);
 	    }
 	    else {
 		ptr = *(last = &ptr->next);
@@ -732,50 +996,78 @@ st_cleanup_safe(st_table *table, st_data_t never)
 }
 
 int
-st_foreach(st_table *table, int (*func)(ANYARGS), st_data_t arg)
+st_foreach_check(st_table *table, int (*func)(ANYARGS), st_data_t arg, st_data_t never)
 {
     st_table_entry *ptr, **last, *tmp;
     enum st_retval retval;
-    st_index_t i;
+    st_data_t key, val;
+    st_index_t hash, i = 0;
+
+    if (table->num_entries == 0) {
+	return 0;
+    }
+
+    if (ULTRAPACKED(table)) {
+	key = UPKEY(table);
+	val = UPVAL(table);
+	hash = UPHASH(table);
+	if (key == never) return 0;
+	retval = (*func)(key, val, arg);
+	if (!ULTRAPACKED(table)) {
+	    goto packed;
+	}
+	switch(retval) {
+	  case ST_CHECK:
+	    if (UPHASH(table) == 0 && UPKEY(table) == never)
+		break;
+	    if (check_upacked(table, hash, key))
+		break;
+	    goto deleted;
+	  case ST_DELETE:
+	    remove_safe_upacked_entry(table, never);
+	  case ST_CONTINUE:
+	  case ST_STOP:
+	    break;
+	}
+	return 0;
+    }
 
     if (table->entries_packed) {
-        for (i = 0; i < table->num_entries; i++) {
-            st_index_t j;
-            st_data_t key, val;
-            key = (st_data_t)table->bins[i*2];
-            val = (st_data_t)table->bins[i*2+1];
-            retval = (*func)(key, val, arg);
+	for (i = 0; i < table->real_entries; i++) {
+	    key = PKEY(table, i);
+	    val = PVAL(table, i);
+	    hash = PHASH(table, i);
+	    if (key == never) continue;
+	    retval = (*func)(key, val, arg);
+	  packed:
 	    if (!table->entries_packed) {
-		FIND_ENTRY(table, ptr, key, i);
+		FIND_ENTRY(table, ptr, hash, i);
 		if (retval == ST_CHECK) {
 		    if (!ptr) goto deleted;
 		    goto unpacked_continue;
 		}
 		goto unpacked;
 	    }
-            switch (retval) {
+	    switch (retval) {
 	      case ST_CHECK:	/* check if hash is modified during iteration */
-                for (j = 0; j < table->num_entries; j++) {
-                    if ((st_data_t)table->bins[j*2] == key)
-                        break;
-                }
-                if (j == table->num_entries) {
+		if (PHASH(table, i) == 0 && PKEY(table, i) == never) {
+		    break;
+		}
+		i = find_packed_index(table, hash, key);
+		if (i == table->real_entries) {
 		    goto deleted;
-                }
+		}
 		/* fall through */
 	      case ST_CONTINUE:
 		break;
 	      case ST_STOP:
 		return 0;
 	      case ST_DELETE:
-                table->num_entries--;
-                memmove(&table->bins[i*2], &table->bins[(i+1)*2],
-                        sizeof(struct st_table_entry*) * 2*(table->num_entries-i));
-                i--;
-                break;
-            }
-        }
-        return 0;
+		remove_safe_packed_entry(table, i, never);
+		break;
+	    }
+	}
+	return 0;
     }
     else {
 	ptr = table->head;
@@ -783,6 +1075,8 @@ st_foreach(st_table *table, int (*func)(ANYARGS), st_data_t arg)
 
     if (ptr != 0) {
 	do {
+	    if (ptr->key == never)
+		goto unpacked_continue;
 	    i = ptr->hash % table->num_bins;
 	    retval = (*func)(ptr->key, ptr->record, arg);
 	  unpacked:
@@ -808,10 +1102,100 @@ st_foreach(st_table *table, int (*func)(ANYARGS), st_data_t arg)
 		for (; (tmp = *last) != 0; last = &tmp->next) {
 		    if (ptr == tmp) {
 			tmp = ptr->fore;
+			remove_entry(table, ptr);
+			ptr->key = ptr->record = never;
+			ptr->hash = 0;
+			ptr = tmp;
+			break;
+		    }
+		}
+	    }
+	} while (ptr && table->head);
+    }
+    return 0;
+}
+
+int
+st_foreach(st_table *table, int (*func)(ANYARGS), st_data_t arg)
+{
+    st_table_entry *ptr, **last, *tmp;
+    enum st_retval retval;
+    st_data_t key, val;
+    st_index_t hash, i = 0;
+
+    if (table->num_entries == 0) {
+	return 0;
+    }
+
+    if (ULTRAPACKED(table)) {
+	key = UPKEY(table);
+	val = UPVAL(table);
+	hash = UPHASH(table);
+	retval = (*func)(key, val, arg);
+	if (!ULTRAPACKED(table)) {
+	    goto packed;
+	}
+	switch (retval) {
+	  case ST_DELETE:
+	    remove_upacked_entry(table);
+	  case ST_CONTINUE:
+	  case ST_CHECK:
+	  case ST_STOP:
+	    break;
+	}
+	return 0;
+    }
+
+    if (table->entries_packed) {
+	for (i = 0; i < table->real_entries; i++) {
+	    key = PKEY(table, i);
+	    val = PVAL(table, i);
+	    hash = PHASH(table, i);
+	    retval = (*func)(key, val, arg);
+	  packed:
+	    if (!table->entries_packed) {
+		FIND_ENTRY(table, ptr, hash, i);
+		if (!ptr) return 0;
+		goto unpacked;
+	    }
+	    switch (retval) {
+	      case ST_CONTINUE:
+		break;
+	      case ST_CHECK:
+	      case ST_STOP:
+		return 0;
+	      case ST_DELETE:
+		remove_packed_entry(table, i);
+		i--;
+		break;
+	    }
+	}
+	return 0;
+    }
+    else {
+	ptr = table->head;
+    }
+
+    if (ptr != 0) {
+	do {
+	    i = ptr->hash % table->num_bins;
+	    retval = (*func)(ptr->key, ptr->record, arg);
+	  unpacked:
+	    switch (retval) {
+	      case ST_CONTINUE:
+		ptr = ptr->fore;
+		break;
+	      case ST_CHECK:
+	      case ST_STOP:
+		return 0;
+	      case ST_DELETE:
+		last = &table->bins[ptr->hash % table->num_bins];
+		for (; (tmp = *last) != 0; last = &tmp->next) {
+		    if (ptr == tmp) {
+			tmp = ptr->fore;
 			*last = ptr->next;
-			REMOVE_ENTRY(table, ptr);
-			free(ptr);
-			if (ptr == tmp) return 0;
+			remove_entry(table, ptr);
+			st_free_entry(ptr);
 			ptr = tmp;
 			break;
 		    }
@@ -834,13 +1218,13 @@ st_reverse_foreach(st_table *table, int (*func)(ANYARGS), st_data_t arg)
         for (i = table->num_entries-1; 0 <= i; i--) {
             int j;
             st_data_t key, val;
-            key = (st_data_t)table->bins[i*2];
-            val = (st_data_t)table->bins[i*2+1];
+            key = PKEY(table, i);
+            val = PVAL(table, i);
             retval = (*func)(key, val, arg);
             switch (retval) {
 	      case ST_CHECK:	/* check if hash is modified during iteration */
                 for (j = 0; j < table->num_entries; j++) {
-                    if ((st_data_t)table->bins[j*2] == key)
+                    if (PKEY(table, j) == key)
                         break;
                 }
                 if (j == table->num_entries) {
@@ -854,9 +1238,7 @@ st_reverse_foreach(st_table *table, int (*func)(ANYARGS), st_data_t arg)
 	      case ST_STOP:
 		return 0;
 	      case ST_DELETE:
-                table->num_entries--;
-                memmove(&table->bins[i*2], &table->bins[(i+1)*2],
-                        sizeof(struct st_table_entry*) * 2*(table->num_entries-i));
+		remove_packed_entry(table, i);
                 break;
             }
         }
@@ -889,8 +1271,8 @@ st_reverse_foreach(st_table *table, int (*func)(ANYARGS), st_data_t arg)
 		    if (ptr == tmp) {
 			tmp = ptr->back;
 			*last = ptr->next;
-			REMOVE_ENTRY(table, ptr);
-			free(ptr);
+			remove_entry(table, ptr);
+			st_free_entry(ptr);
 			ptr = tmp;
 			break;
 		    }
diff --git a/test/ruby/test_array.rb b/test/ruby/test_array.rb
index 28d3e41..bcad2c0 100644
--- a/test/ruby/test_array.rb
+++ b/test/ruby/test_array.rb
@@ -414,6 +414,18 @@ class TestArray < Test::Unit::TestCase
     a = @cls[1, 2, 3]
     a[-1, 0] = a
     assert_equal([1, 2, 1, 2, 3, 3], a)
+
+    a = @cls[]
+    a[5,0] = [5]
+    assert_equal([nil, nil, nil, nil, nil, 5], a)
+
+    a = @cls[1]
+    a[1,0] = [2]
+    assert_equal([1, 2], a)
+
+    a = @cls[1]
+    a[1,1] = [2]
+    assert_equal([1, 2], a)
   end
 
   def test_assoc
diff --git a/test/ruby/test_marshal.rb b/test/ruby/test_marshal.rb
index 7ec6959..f5774cd 100644
--- a/test/ruby/test_marshal.rb
+++ b/test/ruby/test_marshal.rb
@@ -312,7 +312,7 @@ class TestMarshal < Test::Unit::TestCase
         assert_equal(a.instance_variable_get(i), b.instance_variable_get(i), bug1932)
       end
     end
-    a.__send__(a.methods(true).grep(/=\z/)[0], a)
+    a.__send__(a.methods(true).grep(/\Ar.+=\z/)[0], a)
     assert_nothing_raised(bug1932) do
       b = Marshal.load(Marshal.dump(a))
       assert_equal(ClassISO8859_1, b.class, bug1932)
diff --git a/test/ruby/test_method.rb b/test/ruby/test_method.rb
index 2cc0de5..b1bf33e 100644
--- a/test/ruby/test_method.rb
+++ b/test/ruby/test_method.rb
@@ -406,7 +406,7 @@ class TestMethod < Test::Unit::TestCase
     obj = a.new
     assert_equal([:a], obj.public_methods(false), bug)
     obj.extend(m)
-    assert_equal([:m1, :a], obj.public_methods(false), bug)
+    assert_equal([:a, :m1], obj.public_methods(false).sort, bug)
   end
 
   def test_visibility
diff --git a/test/ruby/test_module.rb b/test/ruby/test_module.rb
index 6176f48..a67d845 100644
--- a/test/ruby/test_module.rb
+++ b/test/ruby/test_module.rb
@@ -870,7 +870,7 @@ class TestModule < Test::Unit::TestCase
       (class << self ; self ; end).class_eval do
         define_method :method_added do |sym|
           memo << sym
-          memo << mod.instance_methods(false)
+          memo << mod.instance_methods(false).sort
           memo << (mod.instance_method(sym) rescue nil)
         end
       end
@@ -887,10 +887,10 @@ class TestModule < Test::Unit::TestCase
     assert_equal [:f, :g], memo.shift
     assert_equal mod.instance_method(:f), memo.shift
     assert_equal :a, memo.shift
-    assert_equal [:f, :g, :a], memo.shift
+    assert_equal [:a, :f, :g], memo.shift
     assert_equal mod.instance_method(:a), memo.shift
     assert_equal :a=, memo.shift
-    assert_equal [:f, :g, :a, :a=], memo.shift
+    assert_equal [:a, :a=, :f, :g], memo.shift
     assert_equal mod.instance_method(:a=), memo.shift
   end
 
diff --git a/test/ruby/test_require.rb b/test/ruby/test_require.rb
index 58a9ee2..ec75096 100644
--- a/test/ruby/test_require.rb
+++ b/test/ruby/test_require.rb
@@ -356,4 +356,114 @@ class TestRequire < Test::Unit::TestCase
     $:.replace(loadpath)
     $".replace(features)
   end
+
+  def test_require_changed_current_dir
+    bug7158 = '[ruby-core:47970]'
+    Dir.mktmpdir {|tmp|
+      Dir.chdir(tmp) {
+        Dir.mkdir("a")
+        Dir.mkdir("b")
+        open(File.join("a", "foo.rb"), "w") {}
+        open(File.join("b", "bar.rb"), "w") {|f|
+          f.puts "p :ok"
+        }
+        assert_in_out_err([], <<-INPUT, %w(:ok), [], bug7158)
+          $: << "."
+          Dir.chdir("a")
+          require "foo"
+          Dir.chdir("../b")
+          p :ng unless require "bar"
+          Dir.chdir("..")
+          p :ng if require "b/bar"
+        INPUT
+      }
+    }
+  end
+
+  def test_require_not_modified_load_path
+    bug7158 = '[ruby-core:47970]'
+    Dir.mktmpdir {|tmp|
+      Dir.chdir(tmp) {
+        open("foo.rb", "w") {}
+        assert_in_out_err([], <<-INPUT, %w(:ok), [], bug7158)
+          a = Object.new
+          def a.to_str
+            "#{tmp}"
+          end
+          $: << a
+          require "foo"
+          last_path = $:.pop
+          p :ok if last_path == a && last_path.class == Object
+        INPUT
+      }
+    }
+  end
+
+  def test_require_changed_home
+    bug7158 = '[ruby-core:47970]'
+    Dir.mktmpdir {|tmp|
+      Dir.chdir(tmp) {
+        open("foo.rb", "w") {}
+        Dir.mkdir("a")
+        open(File.join("a", "bar.rb"), "w") {}
+        assert_in_out_err([], <<-INPUT, %w(:ok), [], bug7158)
+          $: << '~'
+          ENV['HOME'] = "#{tmp}"
+          require "foo"
+          ENV['HOME'] = "#{tmp}/a"
+          p :ok if require "bar"
+        INPUT
+      }
+    }
+  end
+
+  def test_require_to_path_redefined_in_load_path
+    bug7158 = '[ruby-core:47970]'
+    Dir.mktmpdir {|tmp|
+      Dir.chdir(tmp) {
+        open("foo.rb", "w") {}
+        assert_in_out_err(["RUBYOPT"=>nil], <<-INPUT, %w(:ok), [], bug7158)
+          a = Object.new
+          def a.to_path
+            "bar"
+          end
+          $: << a
+          begin
+            require "foo"
+            p :ng
+          rescue LoadError
+          end
+          def a.to_path
+            "#{tmp}"
+          end
+          p :ok if require "foo"
+        INPUT
+      }
+    }
+  end
+
+  def test_require_to_str_redefined_in_load_path
+    bug7158 = '[ruby-core:47970]'
+    Dir.mktmpdir {|tmp|
+      Dir.chdir(tmp) {
+        open("foo.rb", "w") {}
+        assert_in_out_err(["RUBYOPT"=>nil], <<-INPUT, %w(:ok), [], bug7158)
+          a = Object.new
+          def a.to_str
+            "foo"
+          end
+          $: << a
+          begin
+            require "foo"
+            p :ng
+          rescue LoadError
+          end
+          def a.to_str
+            "#{tmp}"
+          end
+          p :ok if require "foo"
+        INPUT
+      }
+    }
+  end
 end
diff --git a/time.c b/time.c
index 755812f..83edc83 100644
--- a/time.c
+++ b/time.c
@@ -4712,16 +4712,14 @@ time_mload(VALUE time, VALUE str)
     long nsec;
     VALUE submicro, nano_num, nano_den, offset;
     wideval_t timew;
-    st_data_t data;
 
     time_modify(time);
 
 #define get_attr(attr, iffound) \
     attr = rb_attr_get(str, id_##attr); \
     if (!NIL_P(attr)) { \
-	data = id_##attr; \
 	iffound; \
-        st_delete(rb_generic_ivar_table(str), &data, 0); \
+        sa_delete(rb_generic_ivar_table(str), (sa_index_t)id_##attr, 0); \
     }
 
     get_attr(nano_num, {});
diff --git a/variable.c b/variable.c
index 3da500e..385d4af 100644
--- a/variable.c
+++ b/variable.c
@@ -19,15 +19,15 @@
 #include "constant.h"
 #include "internal.h"
 
-st_table *rb_global_tbl;
-st_table *rb_class_tbl;
+sa_table rb_global_tbl;
+sa_table rb_class_tbl;
 static ID autoload, classpath, tmp_classpath, classid;
 
 void
 Init_var_tables(void)
 {
-    rb_global_tbl = st_init_numtable();
-    rb_class_tbl = st_init_numtable();
+    sa_init_table(&rb_global_tbl, 0);
+    sa_init_table(&rb_class_tbl, 0);
     CONST_ID(autoload, "__autoload__");
     CONST_ID(classpath, "__classpath__");
     CONST_ID(tmp_classpath, "__tmp_classpath__");
@@ -43,7 +43,7 @@ struct fc_result {
 };
 
 static VALUE
-fc_path(struct fc_result *fc, ID name)
+fc_path(struct fc_result *fc, sa_index_t name)
 {
     VALUE path, tmp;
 
@@ -51,8 +51,7 @@ fc_path(struct fc_result *fc, ID name)
     while (fc) {
 	st_data_t n;
 	if (fc->track == rb_cObject) break;
-	if (RCLASS_IV_TBL(fc->track) &&
-	    st_lookup(RCLASS_IV_TBL(fc->track), (st_data_t)classpath, &n)) {
+	if (sa_lookup(RCLASS_IV_TBL(fc->track), (sa_index_t)classpath, &n)) {
 	    tmp = rb_str_dup((VALUE)n);
 	    rb_str_cat2(tmp, "::");
 	    rb_str_append(tmp, path);
@@ -70,7 +69,7 @@ fc_path(struct fc_result *fc, ID name)
 }
 
 static int
-fc_i(ID key, rb_const_entry_t *ce, struct fc_result *res)
+fc_i(sa_index_t key, rb_const_entry_t *ce, struct fc_result *res)
 {
     VALUE value = ce->value;
     if (!rb_is_const_id(key)) return ST_CONTINUE;
@@ -98,7 +97,7 @@ fc_i(ID key, rb_const_entry_t *ce, struct fc_result *res)
 	    arg.klass = res->klass;
 	    arg.track = value;
 	    arg.prev = res;
-	    st_foreach(RCLASS_CONST_TBL(value), fc_i, (st_data_t)&arg);
+	    sa_foreach(RCLASS_CONST_TBL(value), fc_i, (st_data_t)&arg);
 	    if (arg.path) {
 		res->path = arg.path;
 		return ST_STOP;
@@ -123,18 +122,14 @@ find_class_path(VALUE klass)
     arg.track = rb_cObject;
     arg.prev = 0;
     if (RCLASS_CONST_TBL(rb_cObject)) {
-	st_foreach_safe(RCLASS_CONST_TBL(rb_cObject), fc_i, (st_data_t)&arg);
+	sa_foreach(RCLASS_CONST_TBL(rb_cObject), fc_i, (st_data_t)&arg);
     }
     if (arg.path == 0) {
-	st_foreach_safe(rb_class_tbl, fc_i, (st_data_t)&arg);
+	sa_foreach(&rb_class_tbl, fc_i, (st_data_t)&arg);
     }
     if (arg.path) {
-	st_data_t tmp = tmp_classpath;
-	if (!RCLASS_IV_TBL(klass)) {
-	    RCLASS_IV_TBL(klass) = st_init_numtable();
-	}
-	st_insert(RCLASS_IV_TBL(klass), (st_data_t)classpath, arg.path);
-	st_delete(RCLASS_IV_TBL(klass), &tmp, 0);
+	sa_insert(RCLASS_IV_TBL(klass), (sa_index_t)classpath, arg.path);
+	sa_delete(RCLASS_IV_TBL(klass), (sa_index_t)tmp_classpath, 0);
 	return arg.path;
     }
     return Qnil;
@@ -147,16 +142,15 @@ classname(VALUE klass)
     st_data_t n;
 
     if (!klass) klass = rb_cObject;
-    if (RCLASS_IV_TBL(klass)) {
-	if (!st_lookup(RCLASS_IV_TBL(klass), (st_data_t)classpath, &n)) {
-	    if (!st_lookup(RCLASS_IV_TBL(klass), (st_data_t)classid, &n)) {
+    if (RCLASS_IV_TBL(klass)->num_entries) {
+	if (!sa_lookup(RCLASS_IV_TBL(klass), (sa_index_t)classpath, &n)) {
+	    if (!sa_lookup(RCLASS_IV_TBL(klass), (sa_index_t)classid, &n)) {
 		return find_class_path(klass);
 	    }
 	    path = rb_str_dup(rb_id2str(SYM2ID((VALUE)n)));
 	    OBJ_FREEZE(path);
-	    st_insert(RCLASS_IV_TBL(klass), (st_data_t)classpath, (st_data_t)path);
-	    n = classid;
-	    st_delete(RCLASS_IV_TBL(klass), &n, 0);
+	    sa_insert(RCLASS_IV_TBL(klass), (sa_index_t)classpath, (st_data_t)path);
+	    sa_delete(RCLASS_IV_TBL(klass), (sa_index_t)classid, 0);
 	}
 	else {
 	    path = (VALUE)n;
@@ -192,8 +186,7 @@ rb_class_path(VALUE klass)
     st_data_t n = (st_data_t)path;
 
     if (!NIL_P(path)) return path;
-    if (RCLASS_IV_TBL(klass) && st_lookup(RCLASS_IV_TBL(klass),
-					  (st_data_t)tmp_classpath, &n)) {
+    if (sa_lookup(RCLASS_IV_TBL(klass), (sa_index_t)tmp_classpath, &n)) {
 	return (VALUE)n;
     }
     else {
@@ -364,7 +357,7 @@ rb_global_entry(ID id)
     struct global_entry *entry;
     st_data_t data;
 
-    if (!st_lookup(rb_global_tbl, (st_data_t)id, &data)) {
+    if (!sa_lookup(&rb_global_tbl, (sa_index_t)id, &data)) {
 	struct global_variable *var;
 	entry = ALLOC(struct global_entry);
 	var = ALLOC(struct global_variable);
@@ -378,7 +371,7 @@ rb_global_entry(ID id)
 
 	var->block_trace = 0;
 	var->trace = 0;
-	st_add_direct(rb_global_tbl, id, (st_data_t)entry);
+	sa_insert(&rb_global_tbl, (sa_index_t)id, (st_data_t)entry);
     }
     else {
 	entry = (struct global_entry *)data;
@@ -454,8 +447,8 @@ readonly_setter(VALUE val, ID id, void *data, struct global_variable *gvar)
     rb_name_error(id, "%s is a read-only variable", rb_id2name(id));
 }
 
-static int
-mark_global_entry(ID key, struct global_entry *entry)
+static void
+mark_global_entry(struct global_entry *entry)
 {
     struct trace_var *trace;
     struct global_variable *var = entry->var;
@@ -466,14 +459,14 @@ mark_global_entry(ID key, struct global_entry *entry)
 	if (trace->data) rb_gc_mark_maybe(trace->data);
 	trace = trace->next;
     }
-    return ST_CONTINUE;
 }
 
 void
 rb_gc_mark_global_tbl(void)
 {
-    if (rb_global_tbl)
-        st_foreach_safe(rb_global_tbl, mark_global_entry, 0);
+    SA_FOREACH_START(&rb_global_tbl);
+    mark_global_entry((struct global_entry*) value);
+    SA_FOREACH_END();
 }
 
 static ID
@@ -635,7 +628,7 @@ rb_f_untrace_var(int argc, VALUE *argv)
     rb_secure(4);
     rb_scan_args(argc, argv, "11", &var, &cmd);
     id = rb_to_id(var);
-    if (!st_lookup(rb_global_tbl, (st_data_t)id, &data)) {
+    if (!sa_lookup(&rb_global_tbl, (sa_index_t)id, &data)) {
 	rb_name_error(id, "undefined global variable %s", rb_id2name(id));
     }
 
@@ -742,13 +735,6 @@ rb_gvar_defined(struct global_entry *entry)
     return Qtrue;
 }
 
-static int
-gvar_i(ID key, struct global_entry *entry, VALUE ary)
-{
-    rb_ary_push(ary, ID2SYM(key));
-    return ST_CONTINUE;
-}
-
 /*
  *  call-seq:
  *     global_variables    -> array
@@ -765,7 +751,9 @@ rb_f_global_variables(void)
     char buf[2];
     int i;
 
-    st_foreach_safe(rb_global_tbl, gvar_i, ary);
+    SA_FOREACH_START(&rb_global_tbl);
+    rb_ary_push(ary, ID2SYM(entry->key));
+    SA_FOREACH_END();
     buf[0] = '$';
     for (i = 1; i <= 9; ++i) {
 	buf[1] = (char)(i + '0');
@@ -784,10 +772,10 @@ rb_alias_variable(ID name1, ID name2)
 	rb_raise(rb_eSecurityError, "Insecure: can't alias global variable");
 
     entry2 = rb_global_entry(name2);
-    if (!st_lookup(rb_global_tbl, (st_data_t)name1, &data1)) {
+    if (!sa_lookup(&rb_global_tbl, (sa_index_t)name1, &data1)) {
 	entry1 = ALLOC(struct global_entry);
 	entry1->id = name1;
-	st_add_direct(rb_global_tbl, name1, (st_data_t)entry1);
+	sa_insert(&rb_global_tbl, (sa_index_t)name1, (st_data_t)entry1);
     }
     else if ((entry1 = (struct global_entry *)data1)->var != entry2->var) {
 	struct global_variable *var = entry1->var;
@@ -815,7 +803,7 @@ rb_alias_variable(ID name1, ID name2)
 static int special_generic_ivar = 0;
 static st_table *generic_iv_tbl;
 
-st_table*
+sa_table*
 rb_generic_ivar_table(VALUE obj)
 {
     st_data_t tbl;
@@ -823,7 +811,7 @@ rb_generic_ivar_table(VALUE obj)
     if (!FL_TEST(obj, FL_EXIVAR)) return 0;
     if (!generic_iv_tbl) return 0;
     if (!st_lookup(generic_iv_tbl, (st_data_t)obj, &tbl)) return 0;
-    return (st_table *)tbl;
+    return (sa_table *)tbl;
 }
 
 static VALUE
@@ -833,7 +821,7 @@ generic_ivar_get(VALUE obj, ID id, int warn)
 
     if (generic_iv_tbl) {
 	if (st_lookup(generic_iv_tbl, (st_data_t)obj, &tbl)) {
-	    if (st_lookup((st_table *)tbl, (st_data_t)id, &val)) {
+	    if (sa_lookup((sa_table *)tbl, (sa_index_t)id, &val)) {
 		return (VALUE)val;
 	    }
 	}
@@ -847,7 +835,6 @@ generic_ivar_get(VALUE obj, ID id, int warn)
 static void
 generic_ivar_set(VALUE obj, ID id, VALUE val)
 {
-    st_table *tbl;
     st_data_t data;
 
     if (rb_special_const_p(obj)) {
@@ -859,24 +846,22 @@ generic_ivar_set(VALUE obj, ID id, VALUE val)
     }
     if (!st_lookup(generic_iv_tbl, (st_data_t)obj, &data)) {
 	FL_SET(obj, FL_EXIVAR);
-	tbl = st_init_numtable();
-	st_add_direct(generic_iv_tbl, (st_data_t)obj, (st_data_t)tbl);
-	st_add_direct(tbl, (st_data_t)id, (st_data_t)val);
-	return;
+	data = (st_data_t)sa_new_table();
+	st_add_direct(generic_iv_tbl, (st_data_t)obj, data);
     }
-    st_insert((st_table *)data, (st_data_t)id, (st_data_t)val);
+    sa_insert((sa_table *)data, (sa_index_t)id, (st_data_t)val);
 }
 
 static VALUE
 generic_ivar_defined(VALUE obj, ID id)
 {
-    st_table *tbl;
+    sa_table *tbl;
     st_data_t data;
 
     if (!generic_iv_tbl) return Qfalse;
     if (!st_lookup(generic_iv_tbl, (st_data_t)obj, &data)) return Qfalse;
-    tbl = (st_table *)data;
-    if (st_lookup(tbl, (st_data_t)id, &data)) {
+    tbl = (sa_table *)data;
+    if (sa_lookup(tbl, (sa_index_t)id, &data)) {
 	return Qtrue;
     }
     return Qfalse;
@@ -885,18 +870,18 @@ generic_ivar_defined(VALUE obj, ID id)
 static int
 generic_ivar_remove(VALUE obj, ID id, st_data_t *valp)
 {
-    st_table *tbl;
+    sa_table *tbl;
     st_data_t data, key = (st_data_t)id;
     int status;
 
     if (!generic_iv_tbl) return 0;
     if (!st_lookup(generic_iv_tbl, (st_data_t)obj, &data)) return 0;
-    tbl = (st_table *)data;
-    status = st_delete(tbl, &key, valp);
+    tbl = (sa_table *)data;
+    status = sa_delete(tbl, (sa_index_t)id, valp);
     if (tbl->num_entries == 0) {
 	key = (st_data_t)obj;
 	st_delete(generic_iv_tbl, &key, &data);
-	st_free_table((st_table *)data);
+	sa_free_table(tbl);
     }
     return status;
 }
@@ -908,22 +893,17 @@ rb_mark_generic_ivar(VALUE obj)
 
     if (!generic_iv_tbl) return;
     if (st_lookup(generic_iv_tbl, (st_data_t)obj, &tbl)) {
-	rb_mark_tbl((st_table *)tbl);
+	rb_mark_sa_tbl((sa_table *)tbl);
     }
 }
 
 static int
-givar_mark_i(ID key, VALUE value)
-{
-    rb_gc_mark(value);
-    return ST_CONTINUE;
-}
-
-static int
-givar_i(VALUE obj, st_table *tbl)
+givar_i(VALUE obj, sa_table *tbl)
 {
     if (rb_special_const_p(obj)) {
-	st_foreach_safe(tbl, givar_mark_i, 0);
+        SA_FOREACH_START(tbl);
+        rb_gc_mark((VALUE)value);
+        SA_FOREACH_END();
     }
     return ST_CONTINUE;
 }
@@ -943,7 +923,7 @@ rb_free_generic_ivar(VALUE obj)
 
     if (!generic_iv_tbl) return;
     if (st_delete(generic_iv_tbl, &key, &tbl))
-	st_free_table((st_table *)tbl);
+	sa_free_table((sa_table *)tbl);
 }
 
 RUBY_FUNC_EXPORTED size_t
@@ -951,7 +931,7 @@ rb_generic_ivar_memsize(VALUE obj)
 {
     st_data_t tbl;
     if (st_lookup(generic_iv_tbl, (st_data_t)obj, &tbl))
-	return st_memsize((st_table *)tbl);
+	return sa_memsize((sa_table *)tbl);
     return 0;
 }
 
@@ -970,17 +950,17 @@ rb_copy_generic_ivar(VALUE clone, VALUE obj)
         return;
     }
     if (st_lookup(generic_iv_tbl, (st_data_t)obj, &data)) {
-	st_table *tbl = (st_table *)data;
+	sa_table *tbl = (sa_table *)data;
 
         if (tbl->num_entries == 0)
             goto clear;
 
 	if (st_lookup(generic_iv_tbl, (st_data_t)clone, &data)) {
-	    st_free_table((st_table *)data);
-	    st_insert(generic_iv_tbl, (st_data_t)clone, (st_data_t)st_copy(tbl));
+	    sa_free_table((sa_table *)data);
+	    st_insert(generic_iv_tbl, (st_data_t)clone, (st_data_t)sa_copy(tbl));
 	}
 	else {
-	    st_add_direct(generic_iv_tbl, (st_data_t)clone, (st_data_t)st_copy(tbl));
+	    st_add_direct(generic_iv_tbl, (st_data_t)clone, (st_data_t)sa_copy(tbl));
 	    FL_SET(clone, FL_EXIVAR);
 	}
     }
@@ -990,7 +970,7 @@ static VALUE
 ivar_get(VALUE obj, ID id, int warn)
 {
     VALUE val, *ptr;
-    struct st_table *iv_index_tbl;
+    sa_table *iv_index_tbl;
     long len;
     st_data_t index;
 
@@ -1000,7 +980,7 @@ ivar_get(VALUE obj, ID id, int warn)
         ptr = ROBJECT_IVPTR(obj);
         iv_index_tbl = ROBJECT_IV_INDEX_TBL(obj);
         if (!iv_index_tbl) break;
-        if (!st_lookup(iv_index_tbl, (st_data_t)id, &index)) break;
+        if (!sa_lookup(iv_index_tbl, (sa_index_t)id, &index)) break;
         if (len <= (long)index) break;
         val = ptr[index];
         if (val != Qundef)
@@ -1008,7 +988,7 @@ ivar_get(VALUE obj, ID id, int warn)
 	break;
       case T_CLASS:
       case T_MODULE:
-	if (RCLASS_IV_TBL(obj) && st_lookup(RCLASS_IV_TBL(obj), (st_data_t)id, &index))
+	if (sa_lookup(RCLASS_IV_TBL(obj), (sa_index_t)id, &index))
 	    return (VALUE)index;
 	break;
       default:
@@ -1037,7 +1017,7 @@ rb_attr_get(VALUE obj, ID id)
 VALUE
 rb_ivar_set(VALUE obj, ID id, VALUE val)
 {
-    struct st_table *iv_index_tbl;
+    struct sa_table *iv_index_tbl;
     st_data_t index;
     long i, len;
     int ivar_extended;
@@ -1051,14 +1031,11 @@ rb_ivar_set(VALUE obj, ID id, VALUE val)
         if (!iv_index_tbl) {
             VALUE klass = rb_obj_class(obj);
             iv_index_tbl = RCLASS_IV_INDEX_TBL(klass);
-            if (!iv_index_tbl) {
-                iv_index_tbl = RCLASS_IV_INDEX_TBL(klass) = st_init_numtable();
-            }
         }
         ivar_extended = 0;
-        if (!st_lookup(iv_index_tbl, (st_data_t)id, &index)) {
+        if (!sa_lookup(iv_index_tbl, (sa_index_t)id, &index)) {
             index = iv_index_tbl->num_entries;
-            st_add_direct(iv_index_tbl, (st_data_t)id, index);
+            sa_insert(iv_index_tbl, (sa_index_t)id, index);
             ivar_extended = 1;
         }
         len = ROBJECT_NUMIV(obj);
@@ -1098,8 +1075,7 @@ rb_ivar_set(VALUE obj, ID id, VALUE val)
 	break;
       case T_CLASS:
       case T_MODULE:
-	if (!RCLASS_IV_TBL(obj)) RCLASS_IV_TBL(obj) = st_init_numtable();
-	st_insert(RCLASS_IV_TBL(obj), (st_data_t)id, val);
+	sa_insert(RCLASS_IV_TBL(obj), (sa_index_t)id, val);
         break;
       default:
 	generic_ivar_set(obj, id, val);
@@ -1112,13 +1088,13 @@ VALUE
 rb_ivar_defined(VALUE obj, ID id)
 {
     VALUE val;
-    struct st_table *iv_index_tbl;
+    struct sa_table *iv_index_tbl;
     st_data_t index;
     switch (TYPE(obj)) {
       case T_OBJECT:
         iv_index_tbl = ROBJECT_IV_INDEX_TBL(obj);
         if (!iv_index_tbl) break;
-        if (!st_lookup(iv_index_tbl, (st_data_t)id, &index)) break;
+        if (!sa_lookup(iv_index_tbl, (sa_index_t)id, &index)) break;
         if (ROBJECT_NUMIV(obj) <= (long)index) break;
         val = ROBJECT_IVPTR(obj)[index];
         if (val != Qundef)
@@ -1126,7 +1102,7 @@ rb_ivar_defined(VALUE obj, ID id)
 	break;
       case T_CLASS:
       case T_MODULE:
-	if (RCLASS_IV_TBL(obj) && st_lookup(RCLASS_IV_TBL(obj), (st_data_t)id, 0))
+	if (sa_lookup(RCLASS_IV_TBL(obj), (sa_index_t)id, 0))
 	    return Qtrue;
 	break;
       default:
@@ -1137,40 +1113,26 @@ rb_ivar_defined(VALUE obj, ID id)
     return Qfalse;
 }
 
-struct obj_ivar_tag {
-    VALUE obj;
-    int (*func)(ID key, VALUE val, st_data_t arg);
-    st_data_t arg;
-};
-
-static int
-obj_ivar_i(st_data_t key, st_data_t index, st_data_t arg)
-{
-    struct obj_ivar_tag *data = (struct obj_ivar_tag *)arg;
-    if ((long)index < ROBJECT_NUMIV(data->obj)) {
-        VALUE val = ROBJECT_IVPTR(data->obj)[(long)index];
-        if (val != Qundef) {
-            return (data->func)((ID)key, val, data->arg);
-        }
-    }
-    return ST_CONTINUE;
-}
-
 static void
 obj_ivar_each(VALUE obj, int (*func)(ANYARGS), st_data_t arg)
 {
-    st_table *tbl;
-    struct obj_ivar_tag data;
+    sa_table *tbl;
+    long numiv = ROBJECT_NUMIV(obj);
+    VALUE *vars = ROBJECT_IVPTR(obj);
 
     tbl = ROBJECT_IV_INDEX_TBL(obj);
-    if (!tbl)
+    if (!tbl || !numiv)
         return;
 
-    data.obj = obj;
-    data.func = (int (*)(ID key, VALUE val, st_data_t arg))func;
-    data.arg = arg;
-
-    st_foreach_safe(tbl, obj_ivar_i, (st_data_t)&data);
+    SA_FOREACH_START(tbl);
+    if ((long)value < numiv) {
+	VALUE val = vars[value];
+	if (val != Qundef) {
+	    if (((sa_iter_func)func)(entry->key, val, arg) == SA_STOP)
+		break;
+	}
+    }
+    SA_FOREACH_END();
 }
 
 void
@@ -1182,9 +1144,7 @@ rb_ivar_foreach(VALUE obj, int (*func)(ANYARGS), st_data_t arg)
 	break;
       case T_CLASS:
       case T_MODULE:
-	if (RCLASS_IV_TBL(obj)) {
-	    st_foreach_safe(RCLASS_IV_TBL(obj), func, arg);
-	}
+        sa_foreach(RCLASS_IV_TBL(obj), func, arg);
 	break;
       default:
 	if (!generic_iv_tbl) break;
@@ -1192,7 +1152,7 @@ rb_ivar_foreach(VALUE obj, int (*func)(ANYARGS), st_data_t arg)
 	    st_data_t tbl;
 
 	    if (st_lookup(generic_iv_tbl, (st_data_t)obj, &tbl)) {
-		st_foreach_safe((st_table *)tbl, func, arg);
+		sa_foreach((sa_table *)tbl, func, arg);
 	    }
 	}
 	break;
@@ -1202,11 +1162,11 @@ rb_ivar_foreach(VALUE obj, int (*func)(ANYARGS), st_data_t arg)
 st_index_t
 rb_ivar_count(VALUE obj)
 {
-    st_table *tbl;
+    sa_table *tbl;
     switch (TYPE(obj)) {
       case T_OBJECT:
 	if ((tbl = ROBJECT_IV_INDEX_TBL(obj)) != 0) {
-	    st_index_t i, count, num = tbl->num_entries;
+	    sa_index_t i, count, num = tbl->num_entries;
 	    const VALUE *const ivptr = ROBJECT_IVPTR(obj);
 	    for (i = count = 0; i < num; ++i) {
 		if (ivptr[i] != Qundef) {
@@ -1228,7 +1188,7 @@ rb_ivar_count(VALUE obj)
 	    st_data_t data;
 
 	    if (st_lookup(generic_iv_tbl, (st_data_t)obj, &data) &&
-		(tbl = (st_table *)data) != 0) {
+		(tbl = (sa_table *)data) != 0) {
 		return tbl->num_entries;
 	    }
 	}
@@ -1238,7 +1198,7 @@ rb_ivar_count(VALUE obj)
 }
 
 static int
-ivar_i(ID key, VALUE val, VALUE ary)
+ivar_i(sa_index_t key, VALUE val, VALUE ary)
 {
     if (rb_is_instance_id(key)) {
 	rb_ary_push(ary, ID2SYM(key));
@@ -1301,7 +1261,7 @@ rb_obj_remove_instance_variable(VALUE obj, VALUE name)
     VALUE val = Qnil;
     const ID id = rb_to_id(name);
     st_data_t n, v;
-    struct st_table *iv_index_tbl;
+    struct sa_table *iv_index_tbl;
     st_data_t index;
 
     if (!OBJ_UNTRUSTED(obj) && rb_safe_level() >= 4)
@@ -1315,7 +1275,7 @@ rb_obj_remove_instance_variable(VALUE obj, VALUE name)
       case T_OBJECT:
         iv_index_tbl = ROBJECT_IV_INDEX_TBL(obj);
         if (!iv_index_tbl) break;
-        if (!st_lookup(iv_index_tbl, (st_data_t)id, &index)) break;
+        if (!sa_lookup(iv_index_tbl, (sa_index_t)id, &index)) break;
         if (ROBJECT_NUMIV(obj) <= (long)index) break;
         val = ROBJECT_IVPTR(obj)[index];
         if (val != Qundef) {
@@ -1326,14 +1286,14 @@ rb_obj_remove_instance_variable(VALUE obj, VALUE name)
       case T_CLASS:
       case T_MODULE:
 	n = id;
-	if (RCLASS_IV_TBL(obj) && st_delete(RCLASS_IV_TBL(obj), &n, &v)) {
+	if (sa_delete(RCLASS_IV_TBL(obj), (sa_index_t)id, &v)) {
 	    return (VALUE)v;
 	}
 	break;
       default:
 	if (FL_TEST(obj, FL_EXIVAR) || rb_special_const_p(obj)) {
 	    v = val;
-	    if (generic_ivar_remove(obj, (st_data_t)id, &v)) {
+	    if (generic_ivar_remove(obj, id, &v)) {
 		return (VALUE)v;
 	    }
 	}
@@ -1410,20 +1370,20 @@ rb_mod_const_missing(VALUE klass, VALUE name)
 static void
 autoload_mark(void *ptr)
 {
-    rb_mark_tbl((st_table *)ptr);
+    rb_mark_sa_tbl((sa_table *)ptr);
 }
 
 static void
 autoload_free(void *ptr)
 {
-    st_free_table((st_table *)ptr);
+    sa_free_table((sa_table *)ptr);
 }
 
 static size_t
 autoload_memsize(const void *ptr)
 {
-    const st_table *tbl = ptr;
-    return st_memsize(tbl);
+    const sa_table *tbl = ptr;
+    return sa_memsize(tbl);
 }
 
 static const rb_data_type_t autoload_data_type = {
@@ -1432,14 +1392,14 @@ static const rb_data_type_t autoload_data_type = {
 };
 
 #define check_autoload_table(av) \
-    (struct st_table *)rb_check_typeddata((av), &autoload_data_type)
+    (struct sa_table *)rb_check_typeddata((av), &autoload_data_type)
 
 void
 rb_autoload(VALUE mod, ID id, const char *file)
 {
     st_data_t av;
     VALUE fn;
-    struct st_table *tbl;
+    struct sa_table *tbl;
 
     if (!rb_is_const_id(id)) {
 	rb_raise(rb_eNameError, "autoload must be constant name: %s", rb_id2name(id));
@@ -1448,43 +1408,41 @@ rb_autoload(VALUE mod, ID id, const char *file)
 	rb_raise(rb_eArgError, "empty file name");
     }
 
-    if ((tbl = RCLASS_CONST_TBL(mod)) && st_lookup(tbl, (st_data_t)id, &av) && ((rb_const_entry_t*)av)->value != Qundef)
+    if (sa_lookup(RCLASS_CONST_TBL(mod), (sa_index_t)id, &av) && ((rb_const_entry_t*)av)->value != Qundef)
 	return;
 
     rb_const_set(mod, id, Qundef);
     tbl = RCLASS_IV_TBL(mod);
-    if (tbl && st_lookup(tbl, (st_data_t)autoload, &av)) {
+    if (sa_lookup(tbl, (sa_index_t)autoload, &av)) {
 	tbl = check_autoload_table((VALUE)av);
     }
     else {
-	if (!tbl) tbl = RCLASS_IV_TBL(mod) = st_init_numtable();
 	av = (st_data_t)TypedData_Wrap_Struct(0, &autoload_data_type, 0);
-	st_add_direct(tbl, (st_data_t)autoload, av);
-	DATA_PTR(av) = tbl = st_init_numtable();
+	sa_insert(tbl, (sa_index_t)autoload, av);
+	DATA_PTR(av) = tbl = sa_new_table();
     }
     fn = rb_str_new2(file);
     FL_UNSET(fn, FL_TAINT);
     OBJ_FREEZE(fn);
-    st_insert(tbl, (st_data_t)id, (st_data_t)rb_node_newnode(NODE_MEMO, fn, rb_safe_level(), 0));
+    sa_insert(tbl, (sa_index_t)id, (st_data_t)rb_node_newnode(NODE_MEMO, fn, rb_safe_level(), 0));
 }
 
 static NODE*
 autoload_delete(VALUE mod, ID id)
 {
-    st_data_t val, load = 0, n = id;
+    st_data_t val, load = 0;
     rb_const_entry_t *ce;
 
-    st_delete(RCLASS_CONST_TBL(mod), &n, &val);
+    sa_delete(RCLASS_CONST_TBL(mod), (sa_index_t)id, &val);
     ce = (rb_const_entry_t*)val;
     if (ce) xfree(ce);
-    if (st_lookup(RCLASS_IV_TBL(mod), (st_data_t)autoload, &val)) {
-	struct st_table *tbl = check_autoload_table((VALUE)val);
+    if (sa_lookup(RCLASS_IV_TBL(mod), (sa_index_t)autoload, &val)) {
+	struct sa_table *tbl = check_autoload_table((VALUE)val);
 
-	st_delete(tbl, &n, &load);
+	sa_delete(tbl, (sa_index_t)id, &load);
 
 	if (tbl->num_entries == 0) {
-	    n = autoload;
-	    st_delete(RCLASS_IV_TBL(mod), &n, &val);
+	    sa_delete(RCLASS_IV_TBL(mod), (sa_index_t)autoload, &val);
 	}
     }
 
@@ -1509,14 +1467,14 @@ static NODE *
 autoload_node(VALUE mod, ID id, const char **loadingpath)
 {
     VALUE file;
-    struct st_table *tbl;
+    struct sa_table *tbl;
     st_data_t val;
     NODE *load;
     const char *loading;
     int safe;
 
-    if (!st_lookup(RCLASS_IV_TBL(mod), autoload, &val) ||
-	!(tbl = check_autoload_table((VALUE)val)) || !st_lookup(tbl, (st_data_t)id, &val)) {
+    if (!sa_lookup(RCLASS_IV_TBL(mod), (sa_index_t)autoload, &val) ||
+	!(tbl = check_autoload_table((VALUE)val)) || !sa_lookup(tbl, (sa_index_t)id, &val)) {
 	return 0;
     }
     load = (NODE *)val;
@@ -1541,10 +1499,10 @@ autoload_node(VALUE mod, ID id, const char **loadingpath)
 static int
 autoload_node_id(VALUE mod, ID id)
 {
-    struct st_table *tbl = RCLASS_CONST_TBL(mod);
+    struct sa_table *tbl = RCLASS_CONST_TBL(mod);
     st_data_t val;
 
-    if (!tbl || !st_lookup(tbl, (st_data_t)id, &val) || ((rb_const_entry_t*)val)->value != Qundef) {
+    if (!tbl || !sa_lookup(tbl, (sa_index_t)id, &val) || ((rb_const_entry_t*)val)->value != Qundef) {
 	return 0;
     }
     return 1;
@@ -1593,7 +1551,7 @@ rb_const_get_0(VALUE klass, ID id, int exclude, int recurse, int visibility)
     while (RTEST(tmp)) {
 	VALUE am = 0;
 	st_data_t data;
-	while (RCLASS_CONST_TBL(tmp) && st_lookup(RCLASS_CONST_TBL(tmp), (st_data_t)id, &data)) {
+	while (sa_lookup(RCLASS_CONST_TBL(tmp), (sa_index_t)id, &data)) {
 	    rb_const_entry_t *ce = (rb_const_entry_t *)data;
 	    if (visibility && ce->flag == CONST_PRIVATE) {
 		rb_name_error(id, "private constant %s::%s referenced", rb_class2name(klass), rb_id2name(id));
@@ -1686,12 +1644,12 @@ VALUE
 rb_const_remove(VALUE mod, ID id)
 {
     VALUE val;
-    st_data_t v, n = id;
+    st_data_t v;
 
     if (!OBJ_UNTRUSTED(mod) && rb_safe_level() >= 4)
 	rb_raise(rb_eSecurityError, "Insecure: can't remove constant");
     rb_check_frozen(mod);
-    if (!RCLASS_CONST_TBL(mod) || !st_delete(RCLASS_CONST_TBL(mod), &n, &v)) {
+    if (!sa_delete(RCLASS_CONST_TBL(mod), (sa_index_t)id, &v)) {
 	if (rb_const_defined_at(mod, id)) {
 	    rb_name_error(id, "cannot remove %s::%s",
 			  rb_class2name(mod), rb_id2name(id));
@@ -1711,27 +1669,20 @@ rb_const_remove(VALUE mod, ID id)
     return val;
 }
 
-static int
-sv_i(ID key, rb_const_entry_t *ce, st_table *tbl)
-{
-    if (rb_is_const_id(key)) {
-	if (!st_lookup(tbl, (st_data_t)key, 0)) {
-	    st_insert(tbl, (st_data_t)key, (st_data_t)ce);
-	}
-    }
-    return ST_CONTINUE;
-}
-
 void*
 rb_mod_const_at(VALUE mod, void *data)
 {
-    st_table *tbl = data;
+    sa_table *tbl = data;
     if (!tbl) {
-	tbl = st_init_numtable();
+	tbl = sa_new_table();
     }
-    if (RCLASS_CONST_TBL(mod)) {
-	st_foreach_safe(RCLASS_CONST_TBL(mod), sv_i, (st_data_t)tbl);
+    SA_FOREACH_START(RCLASS_CONST_TBL(mod));
+    if (rb_is_const_id(entry->key)) {
+	if (!sa_lookup(tbl, entry->key, 0)) {
+	    sa_insert(tbl, entry->key, value);
+	}
     }
+    SA_FOREACH_END();
     return tbl;
 }
 
@@ -1748,25 +1699,21 @@ rb_mod_const_of(VALUE mod, void *data)
     return data;
 }
 
-static int
-list_i(st_data_t key, st_data_t value, VALUE ary)
-{
-    ID sym = (ID)key;
-    rb_const_entry_t *ce = (rb_const_entry_t *)value;
-    if (ce->flag != CONST_PRIVATE) rb_ary_push(ary, ID2SYM(sym));
-    return ST_CONTINUE;
-}
-
 VALUE
 rb_const_list(void *data)
 {
-    st_table *tbl = data;
+    sa_table *tbl = data;
     VALUE ary;
 
     if (!tbl) return rb_ary_new2(0);
     ary = rb_ary_new2(tbl->num_entries);
-    st_foreach_safe(tbl, list_i, ary);
-    st_free_table(tbl);
+
+    SA_FOREACH_START(tbl);
+    rb_const_entry_t *ce = (rb_const_entry_t *)value;
+    if (ce->flag != CONST_PRIVATE) rb_ary_push(ary, ID2SYM(entry->key));
+    SA_FOREACH_END();
+
+    sa_free_table(tbl);
 
     return ary;
 }
@@ -1790,7 +1737,7 @@ VALUE
 rb_mod_constants(int argc, VALUE *argv, VALUE mod)
 {
     VALUE inherit;
-    st_table *tbl;
+    sa_table *tbl;
 
     if (argc == 0) {
 	inherit = Qtrue;
@@ -1817,7 +1764,7 @@ rb_const_defined_0(VALUE klass, ID id, int exclude, int recurse, int visibility)
     tmp = klass;
   retry:
     while (tmp) {
-	if (RCLASS_CONST_TBL(tmp) && st_lookup(RCLASS_CONST_TBL(tmp), (st_data_t)id, &value)) {
+	if (sa_lookup(RCLASS_CONST_TBL(tmp), (sa_index_t)id, &value)) {
 	    rb_const_entry_t *ce = (rb_const_entry_t *)value;
 	    if (visibility && ce->flag == CONST_PRIVATE) {
 		return (int)Qfalse;
@@ -1885,6 +1832,7 @@ void
 rb_const_set(VALUE klass, ID id, VALUE val)
 {
     rb_const_entry_t *ce;
+    st_data_t value;
     VALUE visibility = CONST_PUBLIC;
 
     if (NIL_P(klass)) {
@@ -1893,21 +1841,14 @@ rb_const_set(VALUE klass, ID id, VALUE val)
     }
 
     check_before_mod_set(klass, id, val, "constant");
-    if (!RCLASS_CONST_TBL(klass)) {
-	RCLASS_CONST_TBL(klass) = st_init_numtable();
-    }
-    else {
-	st_data_t value;
-
-	if (st_lookup(RCLASS_CONST_TBL(klass), (st_data_t)id, &value)) {
-	    rb_const_entry_t *ce = (rb_const_entry_t*)value;
-	    if (ce->value == Qundef)
-		autoload_delete(klass, id);
-	    else {
-		visibility = ce->flag;
-		rb_warn("already initialized constant %s", rb_id2name(id));
-	    }
-	}
+    if (sa_lookup(RCLASS_CONST_TBL(klass), (sa_index_t)id, &value)) {
+        rb_const_entry_t *ce = (rb_const_entry_t*)value;
+        if (ce->value == Qundef)
+            autoload_delete(klass, id);
+        else {
+            visibility = ce->flag;
+            rb_warn("already initialized constant %s", rb_id2name(id));
+        }
     }
 
     rb_vm_change_state();
@@ -1916,7 +1857,7 @@ rb_const_set(VALUE klass, ID id, VALUE val)
     ce->flag = (rb_const_flag_t)visibility;
     ce->value = val;
 
-    st_insert(RCLASS_CONST_TBL(klass), (st_data_t)id, (st_data_t)ce);
+    sa_insert(RCLASS_CONST_TBL(klass), (sa_index_t)id, (st_data_t)ce);
 }
 
 void
@@ -1958,8 +1899,7 @@ set_const_visibility(VALUE mod, int argc, VALUE *argv, rb_const_flag_t flag)
     for (i = 0; i < argc; i++) {
 	VALUE val = argv[i];
 	id = rb_to_id(val);
-	if (RCLASS_CONST_TBL(mod) &&
-	    st_lookup(RCLASS_CONST_TBL(mod), (st_data_t)id, &v)) {
+	if (sa_lookup(RCLASS_CONST_TBL(mod), (sa_index_t)id, &v)) {
 	    ((rb_const_entry_t*)v)->flag = flag;
 	}
 	else {
@@ -2008,7 +1948,7 @@ original_module(VALUE c)
 }
 
 #define CVAR_LOOKUP(v,r) do {\
-    if (RCLASS_IV_TBL(klass) && st_lookup(RCLASS_IV_TBL(klass),(st_data_t)id,(v))) {\
+    if (sa_lookup(RCLASS_IV_TBL(klass),(sa_index_t)id,(v))) {\
 	r;\
     }\
     if (FL_TEST(klass, FL_SINGLETON) ) {\
@@ -2027,7 +1967,7 @@ original_module(VALUE c)
 	klass = RCLASS_SUPER(klass);\
     }\
     while (klass) {\
-	if (RCLASS_IV_TBL(klass) && st_lookup(RCLASS_IV_TBL(klass),(st_data_t)id,(v))) {\
+	if (sa_lookup(RCLASS_IV_TBL(klass),(sa_index_t)id,(v))) {\
 	    r;\
 	}\
 	klass = RCLASS_SUPER(klass);\
@@ -2043,15 +1983,13 @@ rb_cvar_set(VALUE klass, ID id, VALUE val)
     CVAR_LOOKUP(0, {if (!front) front = klass; target = klass;});
     if (target) {
 	if (front && target != front) {
-	    st_data_t did = id;
-
 	    if (RTEST(ruby_verbose)) {
 		rb_warning("class variable %s of %s is overtaken by %s",
 			   rb_id2name(id), rb_class2name(original_module(front)),
 			   rb_class2name(original_module(target)));
 	    }
 	    if (BUILTIN_TYPE(front) == T_CLASS) {
-		st_delete(RCLASS_IV_TBL(front),&did,0);
+		sa_delete(RCLASS_IV_TBL(front),(sa_index_t)id,0);
 	    }
 	}
     }
@@ -2060,11 +1998,7 @@ rb_cvar_set(VALUE klass, ID id, VALUE val)
     }
 
     check_before_mod_set(target, id, val, "class variable");
-    if (!RCLASS_IV_TBL(target)) {
-	RCLASS_IV_TBL(target) = st_init_numtable();
-    }
-
-    st_insert(RCLASS_IV_TBL(target), (st_data_t)id, (st_data_t)val);
+    sa_insert(RCLASS_IV_TBL(target), (sa_index_t)id, (st_data_t)val);
 }
 
 VALUE
@@ -2080,15 +2014,13 @@ rb_cvar_get(VALUE klass, ID id)
 		      rb_id2name(id), rb_class2name(tmp));
     }
     if (front && target != front) {
-	st_data_t did = id;
-
 	if (RTEST(ruby_verbose)) {
 	    rb_warning("class variable %s of %s is overtaken by %s",
 		       rb_id2name(id), rb_class2name(original_module(front)),
 		       rb_class2name(original_module(target)));
 	}
 	if (BUILTIN_TYPE(front) == T_CLASS) {
-	    st_delete(RCLASS_IV_TBL(front),&did,0);
+	    sa_delete(RCLASS_IV_TBL(front),(sa_index_t)id,0);
 	}
     }
     return (VALUE)value;
@@ -2134,7 +2066,7 @@ rb_define_class_variable(VALUE klass, const char *name, VALUE val)
 }
 
 static int
-cv_i(ID key, VALUE value, VALUE ary)
+cv_i(sa_index_t key, VALUE value, VALUE ary)
 {
     if (rb_is_class_id(key)) {
 	VALUE kval = ID2SYM(key);
@@ -2167,7 +2099,7 @@ rb_mod_class_variables(VALUE obj)
     VALUE ary = rb_ary_new();
 
     if (RCLASS_IV_TBL(obj)) {
-	st_foreach_safe(RCLASS_IV_TBL(obj), cv_i, ary);
+	sa_foreach(RCLASS_IV_TBL(obj), cv_i, ary);
     }
     return ary;
 }
@@ -2196,7 +2128,7 @@ VALUE
 rb_mod_remove_cvar(VALUE mod, VALUE name)
 {
     const ID id = rb_to_id(name);
-    st_data_t val, n = id;
+    st_data_t val;
 
     if (!rb_is_class_id(id)) {
 	rb_name_error(id, "wrong class variable name %s", rb_id2name(id));
@@ -2204,7 +2136,7 @@ rb_mod_remove_cvar(VALUE mod, VALUE name)
     if (!OBJ_UNTRUSTED(mod) && rb_safe_level() >= 4)
 	rb_raise(rb_eSecurityError, "Insecure: can't remove class variable");
     rb_check_frozen(mod);
-    if (RCLASS_IV_TBL(mod) && st_delete(RCLASS_IV_TBL(mod), &n, &val)) {
+    if (RCLASS_IV_TBL(mod) && sa_delete(RCLASS_IV_TBL(mod), (sa_index_t)id, &val)) {
 	return (VALUE)val;
     }
     if (rb_cvar_defined(mod, id)) {
diff --git a/vm.c b/vm.c
index 63141ba..61653d7 100644
--- a/vm.c
+++ b/vm.c
@@ -1042,7 +1042,7 @@ static void
 add_opt_method(VALUE klass, ID mid, VALUE bop)
 {
     rb_method_entry_t *me;
-    if (st_lookup(RCLASS_M_TBL(klass), mid, (void *)&me) && me->def &&
+    if (sa_lookup(RCLASS_M_TBL(klass), (sa_index_t)mid, (void *)&me) && me->def &&
 	me->def->type == VM_METHOD_TYPE_CFUNC) {
 	st_insert(vm_opt_method_table, (st_data_t)me, (st_data_t)bop);
     }
@@ -1578,7 +1578,12 @@ rb_vm_mark(void *ptr)
 	RUBY_MARK_UNLESS_NULL(vm->thgroup_default);
 	RUBY_MARK_UNLESS_NULL(vm->mark_object_ary);
 	RUBY_MARK_UNLESS_NULL(vm->load_path);
+	RUBY_MARK_UNLESS_NULL(vm->load_path_snapshot);
+	RUBY_MARK_UNLESS_NULL(vm->load_path_check_cache);
+	RUBY_MARK_UNLESS_NULL(vm->expanded_load_path);
 	RUBY_MARK_UNLESS_NULL(vm->loaded_features);
+	RUBY_MARK_UNLESS_NULL(vm->loaded_features_snapshot);
+	RUBY_MARK_UNLESS_NULL(vm->loaded_features_index);
 	RUBY_MARK_UNLESS_NULL(vm->top_self);
 	RUBY_MARK_UNLESS_NULL(vm->coverages);
 	rb_gc_mark_locations(vm->special_exceptions, vm->special_exceptions + ruby_special_error_count);
diff --git a/vm_core.h b/vm_core.h
index 60146f0..7b25806 100644
--- a/vm_core.h
+++ b/vm_core.h
@@ -298,7 +298,12 @@ typedef struct rb_vm_struct {
     /* load */
     VALUE top_self;
     VALUE load_path;
+    VALUE load_path_snapshot;
+    VALUE load_path_check_cache;
+    VALUE expanded_load_path;
     VALUE loaded_features;
+    VALUE loaded_features_snapshot;
+    VALUE loaded_features_index;
     struct st_table *loading_table;
 
     /* signal */
diff --git a/vm_insnhelper.c b/vm_insnhelper.c
index 55152df..deeed9b 100644
--- a/vm_insnhelper.c
+++ b/vm_insnhelper.c
@@ -1187,7 +1187,7 @@ vm_get_ev_const(rb_thread_t *th, const rb_iseq_t *iseq,
 		st_data_t data;
 	      search_continue:
 		if (RCLASS_CONST_TBL(klass) &&
-		    st_lookup(RCLASS_CONST_TBL(klass), id, &data)) {
+		    sa_lookup(RCLASS_CONST_TBL(klass), (sa_index_t)id, &data)) {
 		    val = ((rb_const_entry_t*)data)->value;
 		    if (val == Qundef) {
 			if (am == klass) break;
@@ -1297,10 +1297,10 @@ vm_getivar(VALUE obj, ID id, IC ic)
 	    st_data_t index;
 	    long len = ROBJECT_NUMIV(obj);
 	    VALUE *ptr = ROBJECT_IVPTR(obj);
-	    struct st_table *iv_index_tbl = ROBJECT_IV_INDEX_TBL(obj);
+	    struct sa_table *iv_index_tbl = ROBJECT_IV_INDEX_TBL(obj);
 
 	    if (iv_index_tbl) {
-		if (st_lookup(iv_index_tbl, id, &index)) {
+		if (sa_lookup(iv_index_tbl, (sa_index_t)id, &index)) {
 		    if ((long)index < len) {
 			val = ptr[index];
 		    }
@@ -1350,9 +1350,9 @@ vm_setivar(VALUE obj, ID id, VALUE val, IC ic)
 	    }
 	}
 	else {
-	    struct st_table *iv_index_tbl = ROBJECT_IV_INDEX_TBL(obj);
+	    struct sa_table *iv_index_tbl = ROBJECT_IV_INDEX_TBL(obj);
 
-	    if (iv_index_tbl && st_lookup(iv_index_tbl, (st_data_t)id, &index)) {
+	    if (iv_index_tbl && sa_lookup(iv_index_tbl, (sa_index_t)id, &index)) {
 		ic->ic_class = klass;
 		ic->ic_value.index = index;
 		ic->ic_vmstat = GET_VM_STATE_VERSION();
diff --git a/vm_method.c b/vm_method.c
index 6e33603..6567440 100644
--- a/vm_method.c
+++ b/vm_method.c
@@ -2,38 +2,33 @@
  * This file is included by vm.c
  */
 
-#define CACHE_SIZE 0x800
-#define CACHE_MASK 0x7ff
-#define EXPR1(c,m) ((((c)>>3)^(m))&CACHE_MASK)
-
 static void rb_vm_check_redefinition_opt_method(const rb_method_entry_t *me);
 
 static ID object_id, respond_to_missing;
 static ID removed, singleton_removed, undefined, singleton_undefined;
 static ID added, singleton_added, attached;
 
-struct cache_entry {		/* method hash table. */
-    VALUE filled_version;        /* filled state version */
-    ID mid;			/* method's id */
-    VALUE klass;		/* receiver's class */
-    rb_method_entry_t *me;
-};
-
-static struct cache_entry cache[CACHE_SIZE];
 #define ruby_running (GET_VM()->running)
 /* int ruby_running = 0; */
 
+static int
+methods_cache_clear_callback(void *vstart, void *vend, size_t stride, void *data)
+{
+    VALUE v = (VALUE)vstart;
+    for (; v != (VALUE)vend; v += stride) {
+	switch(BUILTIN_TYPE(v)) {
+	    case T_CLASS:
+	    case T_MODULE:
+	    case T_ICLASS:
+		RCLASS(v)->cache->method_cache_version = 0;
+	}
+    }
+    return 0;
+}
 static void
 vm_clear_global_method_cache(void)
 {
-    struct cache_entry *ent, *end;
-
-    ent = cache;
-    end = ent + CACHE_SIZE;
-    while (ent < end) {
-	ent->filled_version = 0;
-	ent++;
-    }
+    rb_objspace_each_objects(methods_cache_clear_callback, NULL);
 }
 
 void
@@ -162,7 +157,7 @@ rb_method_entry_make(VALUE klass, ID mid, rb_method_type_t type,
 		     rb_method_definition_t *def, rb_method_flag_t noex)
 {
     rb_method_entry_t *me;
-    st_table *mtbl;
+    sa_table *mtbl;
     st_data_t data;
 
     if (NIL_P(klass)) {
@@ -190,7 +185,7 @@ rb_method_entry_make(VALUE klass, ID mid, rb_method_type_t type,
     mtbl = RCLASS_M_TBL(klass);
 
     /* check re-definition */
-    if (st_lookup(mtbl, mid, &data)) {
+    if (sa_lookup(mtbl, (sa_index_t)mid, &data)) {
 	rb_method_entry_t *old_me = (rb_method_entry_t *)data;
 	rb_method_definition_t *old_def = old_me->def;
 
@@ -248,7 +243,7 @@ rb_method_entry_make(VALUE klass, ID mid, rb_method_type_t type,
 	}
     }
 
-    st_insert(mtbl, mid, (st_data_t) me);
+    sa_insert(mtbl, (sa_index_t)mid, (st_data_t) me);
 
     return me;
 }
@@ -371,7 +366,7 @@ search_method(VALUE klass, ID id)
 	return 0;
     }
 
-    while (!st_lookup(RCLASS_M_TBL(klass), id, &body)) {
+    while (!sa_lookup(RCLASS_M_TBL(klass), (sa_index_t)id, &body)) {
 	klass = RCLASS_SUPER(klass);
 	if (!klass) {
 	    return 0;
@@ -393,20 +388,10 @@ rb_method_entry_get_without_cache(VALUE klass, ID id)
     rb_method_entry_t *me = search_method(klass, id);
 
     if (ruby_running) {
-	struct cache_entry *ent;
-	ent = cache + EXPR1(klass, id);
-	ent->filled_version = GET_VM_STATE_VERSION();
-	ent->klass = klass;
-
 	if (UNDEFINED_METHOD_ENTRY_P(me)) {
-	    ent->mid = id;
-	    ent->me = 0;
-	    me = 0;
-	}
-	else {
-	    ent->mid = id;
-	    ent->me = me;
+            me = 0;
 	}
+        sa_insert(&RCLASS(klass)->cache->m_cache_tbl, (sa_index_t)id, (st_data_t)me);
     }
 
     return me;
@@ -415,21 +400,23 @@ rb_method_entry_get_without_cache(VALUE klass, ID id)
 rb_method_entry_t *
 rb_method_entry(VALUE klass, ID id)
 {
-    struct cache_entry *ent;
+    rb_class_cache_t *cache = RCLASS(klass)->cache;
+    rb_method_entry_t *me;
 
-    ent = cache + EXPR1(klass, id);
-    if (ent->filled_version == GET_VM_STATE_VERSION() &&
-	ent->mid == id && ent->klass == klass) {
-	return ent->me;
+    if (cache->method_cache_version != GET_VM_STATE_VERSION()) {
+        sa_clear_no_free(&cache->m_cache_tbl);
+        cache->method_cache_version = GET_VM_STATE_VERSION();
+    }
+    else if (sa_lookup(&cache->m_cache_tbl, (sa_index_t)id, (st_data_t*)&me)) {
+        return me;
     }
-
     return rb_method_entry_get_without_cache(klass, id);
 }
 
 static void
 remove_method(VALUE klass, ID mid)
 {
-    st_data_t key, data;
+    st_data_t data;
     rb_method_entry_t *me = 0;
 
     if (klass == rb_cObject) {
@@ -443,14 +430,13 @@ remove_method(VALUE klass, ID mid)
 	rb_warn("removing `%s' may cause serious problems", rb_id2name(mid));
     }
 
-    if (!st_lookup(RCLASS_M_TBL(klass), mid, &data) ||
+    if (!sa_lookup(RCLASS_M_TBL(klass), (sa_index_t)mid, &data) ||
 	!(me = (rb_method_entry_t *)data) ||
 	(!me->def || me->def->type == VM_METHOD_TYPE_UNDEF)) {
 	rb_name_error(mid, "method `%s' not defined in %s",
 		      rb_id2name(mid), rb_class2name(klass));
     }
-    key = (st_data_t)mid;
-    st_delete(RCLASS_M_TBL(klass), &key, &data);
+    sa_delete(RCLASS_M_TBL(klass), (sa_index_t)mid, &data);
 
     rb_vm_check_redefinition_opt_method(me);
     rb_clear_cache_for_undef(klass, mid);
src/rvm/patches/ruby/1.9.3/p327/ruby-multilib.patch000066400000002321147511530530015537 0ustar00diff -u -wr a/tool/mkconfig.rb b/tool/mkconfig.rb
--- a/tool/mkconfig.rb  2012-10-08 05:57:16.948702976 +0200
+++ b/tool/mkconfig.rb  2011-08-13 15:17:30.000000000 +0200
@@ -40,6 +40,7 @@
 v_fast = []
 v_others = []
 vars = {}
+v_runtime = {}
 continued_name = nil
 continued_line = nil
 File.foreach "config.status" do |line|
@@ -118,7 +119,10 @@
     val = val.gsub(/\$(?:\$|\{?(\w+)\}?)/) {$1 ? "$(#{$1})" : $&}.dump
     case name
     when /^prefix$/
+      v_runtime[:prefix] = val.slice(1..-2)
       val = "(TOPDIR || DESTDIR + #{val})"
+    when /^libdir$/
+      v_runtime[:libdir] = File.basename(val.slice(1..-2))
     when /^ARCH_FLAG$/
       val = "arch_flag || #{val}" if universal
     when /^UNIVERSAL_ARCHNAMES$/
@@ -145,7 +149,7 @@

 drive = File::PATH_SEPARATOR == ';'

-prefix = "/lib/ruby/#{version}/#{arch}"
+prefix = "/#{v_runtime[:libdir]}/ruby/#{version}/#{arch}"
 print "  TOPDIR = File.dirname(__FILE__).chomp!(#{prefix.dump})\n"
 print "  DESTDIR = ", (drive ? "TOPDIR && TOPDIR[/\\A[a-z]:/i] || " : ""), "'' unless defined? DESTDIR\n"
 print <<'ARCH' if universal
@@ -190,6 +194,7 @@
     x
   end
 end
+v_others.map!{|x| x.gsub(v_runtime[:prefix], "$(prefix)") }
 v_others.compact!

 if $install_name
src/rvm/patches/ruby/1.9.3/p327/falcon.diff000066400000534752147511530530014034 0ustar00diff --git a/array.c b/array.c
index e427cb3..7e76227 100644
--- a/array.c
+++ b/array.c
@@ -255,15 +255,24 @@ rb_ary_modify(VALUE ary)
     rb_ary_modify_check(ary);
     if (ARY_SHARED_P(ary)) {
         long len = RARRAY_LEN(ary);
+	VALUE shared = ARY_SHARED(ary);
         if (len <= RARRAY_EMBED_LEN_MAX) {
             VALUE *ptr = ARY_HEAP_PTR(ary);
-            VALUE shared = ARY_SHARED(ary);
             FL_UNSET_SHARED(ary);
             FL_SET_EMBED(ary);
             MEMCPY(ARY_EMBED_PTR(ary), ptr, VALUE, len);
             rb_ary_decrement_share(shared);
             ARY_SET_EMBED_LEN(ary, len);
         }
+	else if (ARY_SHARED_NUM(shared) == 1 && len > RARRAY_LEN(shared)>>1) {
+	    long shift = RARRAY_PTR(ary) - RARRAY_PTR(shared);
+	    ARY_SET_PTR(ary, RARRAY_PTR(shared));
+	    ARY_SET_CAPA(ary, RARRAY_LEN(shared));
+	    MEMMOVE(RARRAY_PTR(ary), RARRAY_PTR(ary)+shift, VALUE, len);
+	    FL_UNSET_SHARED(ary);
+            FL_SET_EMBED(shared);
+	    rb_ary_decrement_share(shared);
+	}
         else {
             VALUE *ptr = ALLOC_N(VALUE, len);
             MEMCPY(ptr, RARRAY_PTR(ary), VALUE, len);
@@ -274,6 +283,38 @@ rb_ary_modify(VALUE ary)
     }
 }
 
+static void
+ary_ensure_room_for_push(VALUE ary, long add_len)
+{
+    long new_len = RARRAY_LEN(ary) + add_len;
+    long capa;
+
+    if (ARY_SHARED_P(ary)) {
+        if (new_len > RARRAY_EMBED_LEN_MAX) {
+            VALUE shared = ARY_SHARED(ary);
+            if (ARY_SHARED_NUM(shared) == 1) {
+		if (RARRAY_PTR(ary) - RARRAY_PTR(shared) + new_len <= RARRAY_LEN(shared)) {
+		    rb_ary_modify_check(ary);
+		}
+		else {
+		    /* if array is shared, than it is likely it participate in push/shift pattern */
+		    rb_ary_modify(ary);
+		    capa = ARY_CAPA(ary);
+		    if (new_len > capa - (capa >> 6)) {
+			ary_double_capa(ary, new_len);
+		    }
+		}
+		return;
+            }
+        }
+    }
+    rb_ary_modify(ary);
+    capa = ARY_CAPA(ary);
+    if (new_len > capa) {
+	ary_double_capa(ary, new_len);
+    }
+}
+
 VALUE
 rb_ary_freeze(VALUE ary)
 {
@@ -295,6 +336,33 @@ rb_ary_frozen_p(VALUE ary)
     return Qfalse;
 }
 
+/* This can be used to take a snapshot of an array (with
+   e.g. rb_ary_replace) and check later whether the array has been
+   modified from the snapshot.  The snapshot is cheap, though if
+   something does modify the array it will pay the cost of copying
+   it. */
+VALUE
+rb_ary_dup_of_p(VALUE ary1, VALUE ary2)
+{
+    VALUE *p1, *p2;
+    long len = RARRAY_LEN(ary1);
+
+    if (len != RARRAY_LEN(ary2)) return Qfalse;
+
+    p1 = RARRAY_PTR(ary1);
+    p2 = RARRAY_PTR(ary2);
+
+    if (ARY_EMBED_P(ary1) && ARY_EMBED_P(ary2)) {
+        for (; len; len--, p1++, p2++) {
+            if (*p1 != *p2) return Qfalse;
+        }
+        return Qtrue;
+    }
+
+    if (p1 == p2) return Qtrue;
+    return Qfalse;
+}
+
 static VALUE
 ary_alloc(VALUE klass)
 {
@@ -430,8 +498,9 @@ ary_make_shared(VALUE ary)
 	OBJSETUP(shared, 0, T_ARRAY);
         FL_UNSET_EMBED(shared);
 
-        ARY_SET_LEN((VALUE)shared, RARRAY_LEN(ary));
+        ARY_SET_LEN((VALUE)shared, ARY_CAPA(ary));
         ARY_SET_PTR((VALUE)shared, RARRAY_PTR(ary));
+	rb_mem_clear(RARRAY_PTR(shared) + RARRAY_LEN(ary), ARY_CAPA(ary) - RARRAY_LEN(ary));
 	FL_SET_SHARED_ROOT(shared);
 	ARY_SET_SHARED_NUM((VALUE)shared, 1);
 	FL_SET_SHARED(ary);
@@ -721,8 +790,6 @@ ary_take_first_or_last(int argc, VALUE *argv, VALUE ary, enum ary_take_pos_flags
     return ary_make_partial(ary, rb_cArray, offset, n);
 }
 
-static VALUE rb_ary_push_1(VALUE ary, VALUE item);
-
 /*
  *  call-seq:
  *     ary << obj            -> ary
@@ -739,8 +806,12 @@ static VALUE rb_ary_push_1(VALUE ary, VALUE item);
 VALUE
 rb_ary_push(VALUE ary, VALUE item)
 {
-    rb_ary_modify(ary);
-    return rb_ary_push_1(ary, item);
+    long idx = RARRAY_LEN(ary);
+
+    ary_ensure_room_for_push(ary, 1);
+    RARRAY_PTR(ary)[idx] = item;
+    ARY_SET_LEN(ary, idx + 1);
+    return ary;
 }
 
 static VALUE
@@ -756,6 +827,18 @@ rb_ary_push_1(VALUE ary, VALUE item)
     return ary;
 }
 
+static VALUE
+rb_ary_cat(VALUE ary, const VALUE *ptr, long len)
+{
+    long oldlen = RARRAY_LEN(ary);
+
+    ary_ensure_room_for_push(ary, len);
+copy:
+    MEMCPY(RARRAY_PTR(ary) + oldlen, ptr, VALUE, len);
+    ARY_SET_LEN(ary, oldlen + len);
+    return ary;
+}
+
 /*
  *  call-seq:
  *     ary.push(obj, ... )   -> ary
@@ -772,11 +855,7 @@ rb_ary_push_1(VALUE ary, VALUE item)
 static VALUE
 rb_ary_push_m(int argc, VALUE *argv, VALUE ary)
 {
-    rb_ary_modify(ary);
-    while (argc--) {
-	rb_ary_push_1(ary, *argv++);
-    }
-    return ary;
+    return rb_ary_cat(ary, argv, argc);
 }
 
 VALUE
@@ -904,6 +983,55 @@ rb_ary_shift_m(int argc, VALUE *argv, VALUE ary)
     return result;
 }
 
+static void
+ary_ensure_room_for_unshift(VALUE ary, int argc)
+{
+    long len = RARRAY_LEN(ary);
+    long new_len = len + argc;
+    long capa;
+    VALUE *head, *sharedp;
+
+    if (ARY_SHARED_P(ary)) {
+	VALUE shared = ARY_SHARED(ary);
+	capa = RARRAY_LEN(shared);
+	if (ARY_SHARED_NUM(shared) == 1 && capa > new_len) {
+	    head = RARRAY_PTR(ary);
+	    sharedp = RARRAY_PTR(shared);
+	    goto makeroom_if_need;
+	}
+    }
+
+    rb_ary_modify(ary);
+    capa = ARY_CAPA(ary);
+    if (capa - (capa >> 6) <= new_len) {
+	ary_double_capa(ary, new_len);
+    }
+
+    /* use shared array for big "queues" */
+    if (new_len > ARY_DEFAULT_SIZE * 4) {
+	/* make a room for unshifted items */
+	capa = ARY_CAPA(ary);
+	ary_make_shared(ary);
+
+	head = sharedp = RARRAY_PTR(ary);
+	goto makeroom;
+makeroom_if_need:
+	if (head - sharedp < argc) {
+	    long room;
+makeroom:
+	    room = capa - new_len;
+	    room -= room >> 4;
+	    MEMMOVE(sharedp + argc + room, head, VALUE, len);
+	    head = sharedp + argc + room;
+	}
+	ARY_SET_PTR(ary, head - argc);
+    }
+    else {
+	/* sliding items */
+	MEMMOVE(RARRAY_PTR(ary) + argc, RARRAY_PTR(ary), VALUE, len);
+    }
+}
+
 /*
  *  call-seq:
  *     ary.unshift(obj, ...)  -> ary
@@ -919,19 +1047,16 @@ rb_ary_shift_m(int argc, VALUE *argv, VALUE ary)
 static VALUE
 rb_ary_unshift_m(int argc, VALUE *argv, VALUE ary)
 {
-    long len;
+    long len = RARRAY_LEN(ary);
 
-    rb_ary_modify(ary);
-    if (argc == 0) return ary;
-    if (ARY_CAPA(ary) <= (len = RARRAY_LEN(ary)) + argc) {
-	ary_double_capa(ary, len + argc);
+    if (argc == 0) {
+	rb_ary_modify_check(ary);
+	return ary;
     }
 
-    /* sliding items */
-    MEMMOVE(RARRAY_PTR(ary) + argc, RARRAY_PTR(ary), VALUE, len);
+    ary_ensure_room_for_unshift(ary, argc);
     MEMCPY(RARRAY_PTR(ary), argv, VALUE, argc);
-    ARY_INCREASE_LEN(ary, argc);
-
+    ARY_SET_LEN(ary, len + argc);
     return ary;
 }
 
@@ -1293,15 +1418,12 @@ rb_ary_splice(VALUE ary, long beg, long len, VALUE rpl)
 	rpl = rb_ary_to_ary(rpl);
 	rlen = RARRAY_LEN(rpl);
     }
-    rb_ary_modify(ary);
     if (beg >= RARRAY_LEN(ary)) {
 	if (beg > ARY_MAX_SIZE - rlen) {
 	    rb_raise(rb_eIndexError, "index %ld too big", beg);
 	}
+	ary_ensure_room_for_push(ary, rlen-len); /* len is 0 or negative */
 	len = beg + rlen;
-	if (len >= ARY_CAPA(ary)) {
-	    ary_double_capa(ary, len);
-	}
 	rb_mem_clear(RARRAY_PTR(ary) + RARRAY_LEN(ary), beg - RARRAY_LEN(ary));
 	if (rlen > 0) {
 	    MEMCPY(RARRAY_PTR(ary) + beg, RARRAY_PTR(rpl), VALUE, rlen);
@@ -1311,6 +1433,7 @@ rb_ary_splice(VALUE ary, long beg, long len, VALUE rpl)
     else {
 	long alen;
 
+	rb_ary_modify(ary);
 	alen = RARRAY_LEN(ary) + rlen - len;
 	if (alen >= ARY_CAPA(ary)) {
 	    ary_double_capa(ary, alen);
@@ -2100,12 +2223,13 @@ rb_ary_sort_bang(VALUE ary)
     if (RARRAY_LEN(ary) > 1) {
 	VALUE tmp = ary_make_substitution(ary); /* only ary refers tmp */
 	struct ary_sort_data data;
+	long len = RARRAY_LEN(ary);
 
 	RBASIC(tmp)->klass = 0;
 	data.ary = tmp;
 	data.opt_methods = 0;
 	data.opt_inited = 0;
-	ruby_qsort(RARRAY_PTR(tmp), RARRAY_LEN(tmp), sizeof(VALUE),
+	ruby_qsort(RARRAY_PTR(tmp), len, sizeof(VALUE),
 		   rb_block_given_p()?sort_1:sort_2, &data);
 
         if (ARY_EMBED_P(tmp)) {
@@ -2122,7 +2246,7 @@ rb_ary_sort_bang(VALUE ary)
             if (ARY_HEAP_PTR(ary) == ARY_HEAP_PTR(tmp)) {
                 assert(!ARY_EMBED_P(ary));
                 FL_UNSET_SHARED(ary);
-                ARY_SET_CAPA(ary, ARY_CAPA(tmp));
+                ARY_SET_CAPA(ary, RARRAY_LEN(tmp));
             }
             else {
                 assert(!ARY_SHARED_P(tmp));
@@ -2137,8 +2261,8 @@ rb_ary_sort_bang(VALUE ary)
                     xfree(ARY_HEAP_PTR(ary));
                 }
                 ARY_SET_PTR(ary, RARRAY_PTR(tmp));
-                ARY_SET_HEAP_LEN(ary, RARRAY_LEN(tmp));
-                ARY_SET_CAPA(ary, ARY_CAPA(tmp));
+                ARY_SET_HEAP_LEN(ary, len);
+                ARY_SET_CAPA(ary, RARRAY_LEN(tmp));
             }
             /* tmp was lost ownership for the ptr */
             FL_UNSET(tmp, FL_FREEZE);
diff --git a/class.c b/class.c
index df19812..db6b3e5 100644
--- a/class.c
+++ b/class.c
@@ -31,7 +31,7 @@
 #include "internal.h"
 #include <ctype.h>
 
-extern st_table *rb_class_tbl;
+extern sa_table rb_class_tbl;
 static ID id_attached;
 
 /**
@@ -50,14 +50,24 @@ static VALUE
 class_alloc(VALUE flags, VALUE klass)
 {
     rb_classext_t *ext = ALLOC(rb_classext_t);
+    rb_class_cache_t *cache = ALLOC(rb_class_cache_t);
     NEWOBJ(obj, struct RClass);
     OBJSETUP(obj, klass, flags);
     obj->ptr = ext;
-    RCLASS_IV_TBL(obj) = 0;
-    RCLASS_CONST_TBL(obj) = 0;
-    RCLASS_M_TBL(obj) = 0;
-    RCLASS_SUPER(obj) = 0;
-    RCLASS_IV_INDEX_TBL(obj) = 0;
+    obj->cache = cache;
+    MEMZERO(ext, struct rb_classext_struct, 1);
+    MEMZERO(cache, struct rb_class_cache_struct, 1);
+    return (VALUE)obj;
+}
+
+static VALUE
+iclass_alloc()
+{
+    rb_class_cache_t *cache = ALLOC(rb_class_cache_t);
+    NEWOBJ(obj, struct RClass);
+    OBJSETUP(obj, rb_cClass, T_ICLASS);
+    obj->cache = cache;
+    MEMZERO(cache, struct rb_class_cache_struct, 1);
     return (VALUE)obj;
 }
 
@@ -77,7 +87,6 @@ rb_class_boot(VALUE super)
     VALUE klass = class_alloc(T_CLASS, rb_cClass);
 
     RCLASS_SUPER(klass) = super;
-    RCLASS_M_TBL(klass) = st_init_numtable();
 
     OBJ_INFECT(klass, super);
     return (VALUE)klass;
@@ -120,85 +129,59 @@ rb_class_new(VALUE super)
     return rb_class_boot(super);
 }
 
-struct clone_method_data {
-    st_table *tbl;
-    VALUE klass;
-};
-
 VALUE rb_iseq_clone(VALUE iseqval, VALUE newcbase);
 
-static int
-clone_method(ID mid, const rb_method_entry_t *me, struct clone_method_data *data)
+static void
+clone_method(ID mid, const rb_method_entry_t *me, VALUE klass)
 {
     VALUE newiseqval;
     if (me->def && me->def->type == VM_METHOD_TYPE_ISEQ) {
 	rb_iseq_t *iseq;
-	newiseqval = rb_iseq_clone(me->def->body.iseq->self, data->klass);
+	newiseqval = rb_iseq_clone(me->def->body.iseq->self, klass);
 	GetISeqPtr(newiseqval, iseq);
-	rb_add_method(data->klass, mid, VM_METHOD_TYPE_ISEQ, iseq, me->flag);
+	rb_add_method(klass, mid, VM_METHOD_TYPE_ISEQ, iseq, me->flag);
 	RB_GC_GUARD(newiseqval);
     }
     else {
-	rb_method_entry_set(data->klass, mid, me, me->flag);
+	rb_method_entry_set(klass, mid, me, me->flag);
     }
-    return ST_CONTINUE;
 }
 
-static int
-clone_const(ID key, const rb_const_entry_t *ce, st_table *tbl)
+static void
+clone_const(sa_index_t key, st_data_t ce, sa_table *tbl)
 {
     rb_const_entry_t *nce = ALLOC(rb_const_entry_t);
-    *nce = *ce;
-    st_insert(tbl, key, (st_data_t)nce);
-    return ST_CONTINUE;
-}
-
-static int
-clone_const_i(st_data_t key, st_data_t value, st_data_t data)
-{
-    return clone_const((ID)key, (const rb_const_entry_t *)value, (st_table *)data);
+    *nce = *(const rb_const_entry_t*)ce;
+    sa_insert(tbl, (sa_index_t)key, (st_data_t)nce);
 }
 
 /* :nodoc: */
 VALUE
 rb_mod_init_copy(VALUE clone, VALUE orig)
 {
+    ID id;
     rb_obj_init_copy(clone, orig);
     if (!FL_TEST(CLASS_OF(clone), FL_SINGLETON)) {
 	RBASIC(clone)->klass = rb_singleton_class_clone(orig);
 	rb_singleton_class_attached(RBASIC(clone)->klass, (VALUE)clone);
     }
     RCLASS_SUPER(clone) = RCLASS_SUPER(orig);
-    if (RCLASS_IV_TBL(orig)) {
-	st_data_t id;
 
-	if (RCLASS_IV_TBL(clone)) {
-	    st_free_table(RCLASS_IV_TBL(clone));
-	}
-	RCLASS_IV_TBL(clone) = st_copy(RCLASS_IV_TBL(orig));
-	CONST_ID(id, "__classpath__");
-	st_delete(RCLASS_IV_TBL(clone), &id, 0);
-	CONST_ID(id, "__classid__");
-	st_delete(RCLASS_IV_TBL(clone), &id, 0);
-    }
-    if (RCLASS_CONST_TBL(orig)) {
-	if (RCLASS_CONST_TBL(clone)) {
-	    rb_free_const_table(RCLASS_CONST_TBL(clone));
-	}
-	RCLASS_CONST_TBL(clone) = st_init_numtable();
-	st_foreach(RCLASS_CONST_TBL(orig), clone_const_i, (st_data_t)RCLASS_CONST_TBL(clone));
-    }
-    if (RCLASS_M_TBL(orig)) {
-	struct clone_method_data data;
+    sa_copy_to(RCLASS_IV_TBL(orig), RCLASS_IV_TBL(clone));
+    CONST_ID(id, "__classpath__");
+    sa_delete(RCLASS_IV_TBL(clone), (sa_index_t)id, 0);
+    CONST_ID(id, "__classid__");
+    sa_delete(RCLASS_IV_TBL(clone), (sa_index_t)id, 0);
 
-	if (RCLASS_M_TBL(clone)) {
-	    rb_free_m_table(RCLASS_M_TBL(clone));
-	}
-	data.tbl = RCLASS_M_TBL(clone) = st_init_numtable();
-	data.klass = clone;
-	st_foreach(RCLASS_M_TBL(orig), clone_method,
-		   (st_data_t)&data);
-    }
+    sa_clear(RCLASS_CONST_TBL(clone));
+    SA_FOREACH_START(RCLASS_CONST_TBL(orig));
+    clone_const(entry->key, value, RCLASS_CONST_TBL(clone));
+    SA_FOREACH_END();
+
+    rb_free_m_table(RCLASS_M_TBL(clone));
+    SA_FOREACH_START(RCLASS_M_TBL(orig));
+    clone_method(entry->key, (const rb_method_entry_t *)value, clone);
+    SA_FOREACH_END();
 
     return clone;
 }
@@ -227,7 +210,6 @@ rb_singleton_class_clone(VALUE obj)
     if (!FL_TEST(klass, FL_SINGLETON))
 	return klass;
     else {
-	struct clone_method_data data;
 	/* copy singleton(unnamed) class */
 	VALUE clone = class_alloc((RBASIC(klass)->flags & ~(FL_MARK)), 0);
 
@@ -239,18 +221,16 @@ rb_singleton_class_clone(VALUE obj)
 	}
 
 	RCLASS_SUPER(clone) = RCLASS_SUPER(klass);
-	if (RCLASS_IV_TBL(klass)) {
-	    RCLASS_IV_TBL(clone) = st_copy(RCLASS_IV_TBL(klass));
-	}
-	if (RCLASS_CONST_TBL(klass)) {
-	    RCLASS_CONST_TBL(clone) = st_init_numtable();
-	    st_foreach(RCLASS_CONST_TBL(klass), clone_const_i, (st_data_t)RCLASS_CONST_TBL(clone));
-	}
-	RCLASS_M_TBL(clone) = st_init_numtable();
-	data.tbl = RCLASS_M_TBL(clone);
-	data.klass = (VALUE)clone;
-	st_foreach(RCLASS_M_TBL(klass), clone_method,
-		   (st_data_t)&data);
+        sa_copy_to(RCLASS_IV_TBL(klass), RCLASS_IV_TBL(clone));
+
+        SA_FOREACH_START(RCLASS_CONST_TBL(klass));
+        clone_const(entry->key, value, RCLASS_CONST_TBL(clone));
+        SA_FOREACH_END();
+
+        SA_FOREACH_START(RCLASS_M_TBL(klass));
+        clone_method(entry->key, (const rb_method_entry_t*)value, clone);
+        SA_FOREACH_END();
+
 	rb_singleton_class_attached(RBASIC(clone)->klass, (VALUE)clone);
 	FL_SET(clone, FL_SINGLETON);
 	return (VALUE)clone;
@@ -265,10 +245,7 @@ void
 rb_singleton_class_attached(VALUE klass, VALUE obj)
 {
     if (FL_TEST(klass, FL_SINGLETON)) {
-	if (!RCLASS_IV_TBL(klass)) {
-	    RCLASS_IV_TBL(klass) = st_init_numtable();
-	}
-	st_insert(RCLASS_IV_TBL(klass), id_attached, obj);
+	sa_insert(RCLASS_IV_TBL(klass), (sa_index_t)id_attached, obj);
     }
 }
 
@@ -355,12 +332,12 @@ make_singleton_class(VALUE obj)
 static VALUE
 boot_defclass(const char *name, VALUE super)
 {
-    extern st_table *rb_class_tbl;
+    extern sa_table rb_class_tbl;
     VALUE obj = rb_class_boot(super);
     ID id = rb_intern(name);
 
     rb_name_class(obj, id);
-    st_add_direct(rb_class_tbl, id, obj);
+    sa_insert(&rb_class_tbl, (sa_index_t)id, obj);
     rb_const_set((rb_cObject ? rb_cObject : obj), id, obj);
     return obj;
 }
@@ -484,7 +461,7 @@ rb_define_class(const char *name, VALUE super)
 	rb_warn("no super class for `%s', Object assumed", name);
     }
     klass = rb_define_class_id(id, super);
-    st_add_direct(rb_class_tbl, id, klass);
+    sa_insert(&rb_class_tbl, (sa_index_t)id, klass);
     rb_name_class(klass, id);
     rb_const_set(rb_cObject, id, klass);
     rb_class_inherited(super, klass);
@@ -565,8 +542,6 @@ rb_module_new(void)
 {
     VALUE mdl = class_alloc(T_MODULE, rb_cModule);
 
-    RCLASS_M_TBL(mdl) = st_init_numtable();
-
     return (VALUE)mdl;
 }
 
@@ -595,7 +570,7 @@ rb_define_module(const char *name)
 	rb_raise(rb_eTypeError, "%s is not a module", rb_obj_classname(module));
     }
     module = rb_define_module_id(id);
-    st_add_direct(rb_class_tbl, id, module);
+    sa_insert(&rb_class_tbl, (sa_index_t)id, module);
     rb_const_set(rb_cObject, id, module);
 
     return module;
@@ -630,27 +605,15 @@ rb_define_module_id_under(VALUE outer, ID id)
 static VALUE
 include_class_new(VALUE module, VALUE super)
 {
-    VALUE klass = class_alloc(T_ICLASS, rb_cClass);
+    VALUE klass;
 
     if (BUILTIN_TYPE(module) == T_ICLASS) {
 	module = RBASIC(module)->klass;
     }
-    if (!RCLASS_IV_TBL(module)) {
-	RCLASS_IV_TBL(module) = st_init_numtable();
-    }
-    if (!RCLASS_CONST_TBL(module)) {
-	RCLASS_CONST_TBL(module) = st_init_numtable();
-    }
-    RCLASS_IV_TBL(klass) = RCLASS_IV_TBL(module);
-    RCLASS_CONST_TBL(klass) = RCLASS_CONST_TBL(module);
-    RCLASS_M_TBL(klass) = RCLASS_M_TBL(module);
+    klass = iclass_alloc();
+    RBASIC(klass)->klass = module;
+    RCLASS_EXT(klass) = RCLASS_EXT(module);
     RCLASS_SUPER(klass) = super;
-    if (TYPE(module) == T_ICLASS) {
-	RBASIC(klass)->klass = RBASIC(module)->klass;
-    }
-    else {
-	RBASIC(klass)->klass = module;
-    }
     OBJ_INFECT(klass, module);
     OBJ_INFECT(klass, super);
 
@@ -677,13 +640,13 @@ rb_include_module(VALUE klass, VALUE module)
     while (module) {
 	int superclass_seen = FALSE;
 
-	if (RCLASS_M_TBL(klass) == RCLASS_M_TBL(module))
+	if (RCLASS_EXT(klass) == RCLASS_EXT(module))
 	    rb_raise(rb_eArgError, "cyclic include detected");
 	/* ignore if the module included already in superclasses */
 	for (p = RCLASS_SUPER(klass); p; p = RCLASS_SUPER(p)) {
 	    switch (BUILTIN_TYPE(p)) {
 	      case T_ICLASS:
-		if (RCLASS_M_TBL(p) == RCLASS_M_TBL(module)) {
+		if (RCLASS_EXT(p) == RCLASS_EXT(module)) {
 		    if (!superclass_seen) {
 			c = p;  /* move insertion point */
 		    }
@@ -696,7 +659,7 @@ rb_include_module(VALUE klass, VALUE module)
 	    }
 	}
 	c = RCLASS_SUPER(c) = include_class_new(module, RCLASS_SUPER(c));
-	if (RMODULE_M_TBL(module) && RMODULE_M_TBL(module)->num_entries)
+	if (RMODULE_M_TBL(module)->num_entries)
 	    changed = 1;
       skip:
 	module = RCLASS_SUPER(module);
@@ -827,58 +790,58 @@ ins_methods_push(ID name, long type, VALUE ary, long visi)
 }
 
 static int
-ins_methods_i(st_data_t name, st_data_t type, st_data_t ary)
+ins_methods_i(sa_index_t name, st_data_t type, st_data_t ary)
 {
     return ins_methods_push((ID)name, (long)type, (VALUE)ary, -1); /* everything but private */
 }
 
 static int
-ins_methods_prot_i(st_data_t name, st_data_t type, st_data_t ary)
+ins_methods_prot_i(sa_index_t name, st_data_t type, st_data_t ary)
 {
     return ins_methods_push((ID)name, (long)type, (VALUE)ary, NOEX_PROTECTED);
 }
 
 static int
-ins_methods_priv_i(st_data_t name, st_data_t type, st_data_t ary)
+ins_methods_priv_i(sa_index_t name, st_data_t type, st_data_t ary)
 {
     return ins_methods_push((ID)name, (long)type, (VALUE)ary, NOEX_PRIVATE);
 }
 
 static int
-ins_methods_pub_i(st_data_t name, st_data_t type, st_data_t ary)
+ins_methods_pub_i(sa_index_t name, st_data_t type, st_data_t ary)
 {
     return ins_methods_push((ID)name, (long)type, (VALUE)ary, NOEX_PUBLIC);
 }
 
 static int
-method_entry_i(st_data_t key, st_data_t value, st_data_t data)
+method_entry_i(sa_index_t key, st_data_t value, st_data_t data)
 {
     const rb_method_entry_t *me = (const rb_method_entry_t *)value;
-    st_table *list = (st_table *)data;
+    sa_table *list = (sa_table *)data;
     long type;
 
     if ((ID)key == ID_ALLOCATOR) {
 	return ST_CONTINUE;
     }
 
-    if (!st_lookup(list, key, 0)) {
+    if (!sa_lookup(list, key, 0)) {
 	if (UNDEFINED_METHOD_ENTRY_P(me)) {
 	    type = -1; /* none */
 	}
 	else {
 	    type = VISI(me->flag);
 	}
-	st_add_direct(list, key, type);
+	sa_insert(list, key, type);
     }
     return ST_CONTINUE;
 }
 
 static VALUE
-class_instance_method_list(int argc, VALUE *argv, VALUE mod, int obj, int (*func) (st_data_t, st_data_t, st_data_t))
+class_instance_method_list(int argc, VALUE *argv, VALUE mod, int obj, int (*func) (sa_index_t, st_data_t, st_data_t))
 {
     VALUE ary;
     int recur;
-    st_table *list;
+    sa_table list = SA_EMPTY_TABLE;
 
     if (argc == 0) {
 	recur = TRUE;
@@ -889,16 +852,15 @@ class_instance_method_list(int argc, VALUE *argv, VALUE mod, int obj, int (*func
 	recur = RTEST(r);
     }
 
-    list = st_init_numtable();
     for (; mod; mod = RCLASS_SUPER(mod)) {
-	st_foreach(RCLASS_M_TBL(mod), method_entry_i, (st_data_t)list);
+	sa_foreach(RCLASS_M_TBL(mod), method_entry_i, (st_data_t)&list);
 	if (BUILTIN_TYPE(mod) == T_ICLASS) continue;
 	if (obj && FL_TEST(mod, FL_SINGLETON)) continue;
 	if (!recur) break;
     }
     ary = rb_ary_new();
-    st_foreach(list, func, ary);
-    st_free_table(list);
+    sa_foreach(&list, func, ary);
+    sa_clear(&list);
 
     return ary;
 }
@@ -1112,7 +1074,7 @@ VALUE
 rb_obj_singleton_methods(int argc, VALUE *argv, VALUE obj)
 {
     VALUE recur, ary, klass;
-    st_table *list;
+    sa_table list = SA_EMPTY_TABLE;
 
     if (argc == 0) {
 	recur = Qtrue;
@@ -1121,20 +1083,19 @@ rb_obj_singleton_methods(int argc, VALUE *argv, VALUE obj)
 	rb_scan_args(argc, argv, "01", &recur);
     }
     klass = CLASS_OF(obj);
-    list = st_init_numtable();
     if (klass && FL_TEST(klass, FL_SINGLETON)) {
-	st_foreach(RCLASS_M_TBL(klass), method_entry_i, (st_data_t)list);
+	sa_foreach(RCLASS_M_TBL(klass), method_entry_i, (st_data_t)&list);
 	klass = RCLASS_SUPER(klass);
     }
     if (RTEST(recur)) {
 	while (klass && (FL_TEST(klass, FL_SINGLETON) || TYPE(klass) == T_ICLASS)) {
-	    st_foreach(RCLASS_M_TBL(klass), method_entry_i, (st_data_t)list);
+	    sa_foreach(RCLASS_M_TBL(klass), method_entry_i, (st_data_t)&list);
 	    klass = RCLASS_SUPER(klass);
 	}
     }
     ary = rb_ary_new();
-    st_foreach(list, ins_methods_i, ary);
-    st_free_table(list);
+    sa_foreach(&list, ins_methods_i, ary);
+    sa_clear(&list);
 
     return ary;
 }
diff --git a/common.mk b/common.mk
index c9ef641..3ccfa47 100644
--- a/common.mk
+++ b/common.mk
@@ -79,6 +79,7 @@ COMMONOBJS    = array.$(OBJEXT) \
 		safe.$(OBJEXT) \
 		signal.$(OBJEXT) \
 		sprintf.$(OBJEXT) \
+		sp_ar.$(OBJEXT) \
 		st.$(OBJEXT) \
 		strftime.$(OBJEXT) \
 		string.$(OBJEXT) \
@@ -638,7 +639,8 @@ file.$(OBJEXT): {$(VPATH)}file.c $(RUBY_H_INCLUDES) {$(VPATH)}io.h \
 gc.$(OBJEXT): {$(VPATH)}gc.c $(RUBY_H_INCLUDES) {$(VPATH)}re.h \
   {$(VPATH)}regex.h $(ENCODING_H_INCLUDES) $(VM_CORE_H_INCLUDES) \
   {$(VPATH)}gc.h {$(VPATH)}io.h {$(VPATH)}eval_intern.h {$(VPATH)}util.h \
-  {$(VPATH)}debug.h {$(VPATH)}internal.h {$(VPATH)}constant.h
+  {$(VPATH)}debug.h {$(VPATH)}internal.h {$(VPATH)}constant.h \
+  {$(VPATH)}pool_alloc.inc.h {$(VPATH)}pool_alloc.h
 hash.$(OBJEXT): {$(VPATH)}hash.c $(RUBY_H_INCLUDES) {$(VPATH)}util.h \
   $(ENCODING_H_INCLUDES)
 inits.$(OBJEXT): {$(VPATH)}inits.c $(RUBY_H_INCLUDES) \
@@ -702,7 +704,8 @@ signal.$(OBJEXT): {$(VPATH)}signal.c $(RUBY_H_INCLUDES) \
   $(VM_CORE_H_INCLUDES) {$(VPATH)}debug.h
 sprintf.$(OBJEXT): {$(VPATH)}sprintf.c $(RUBY_H_INCLUDES) {$(VPATH)}re.h \
   {$(VPATH)}regex.h {$(VPATH)}vsnprintf.c $(ENCODING_H_INCLUDES)
-st.$(OBJEXT): {$(VPATH)}st.c $(RUBY_H_INCLUDES)
+sp_ar.$(OBJEXT): {$(VPATH)}sp_ar.c $(RUBY_H_INCLUDES)
+st.$(OBJEXT): {$(VPATH)}st.c $(RUBY_H_INCLUDES) {$(VPATH)}pool_alloc.h
 strftime.$(OBJEXT): {$(VPATH)}strftime.c $(RUBY_H_INCLUDES) \
   {$(VPATH)}timev.h
 string.$(OBJEXT): {$(VPATH)}string.c $(RUBY_H_INCLUDES) {$(VPATH)}re.h \
diff --git a/configure.in b/configure.in
index b006a01..a3ccad7 100644
--- a/configure.in
+++ b/configure.in
@@ -1324,6 +1324,29 @@ main() {
 CFLAGS="$save_CFLAGS"])
 AC_DEFINE_UNQUOTED(GC_MARK_STACKFRAME_WORD, $rb_cv_gc_mark_stackframe_word)
 
+AS_CASE(["$target_os"],
+[openbsd*], [
+  AC_CACHE_CHECK(for heap align log on openbsd, rb_cv_page_size_log,
+    [rb_cv_page_size_log=no
+     for page_log in 12 13; do
+       AC_TRY_RUN([
+#include <math.h>
+#include <unistd.h>
+
+int
+main() {
+  if ((int)log2((double)sysconf(_SC_PAGESIZE)) != $page_log) return 1;
+  return 0;
+}
+       ],
+       rb_cv_page_size_log="$page_log"; break)
+     done])
+  if test $rb_cv_page_size_log != no; then
+    AC_DEFINE_UNQUOTED(HEAP_ALIGN_LOG, $rb_cv_page_size_log)
+  else
+    AC_DEFINE_UNQUOTED(HEAP_ALIGN_LOG, 12)
+  fi
+])
 
 dnl Checks for library functions.
 AC_TYPE_GETGROUPS
@@ -1424,7 +1447,8 @@ AC_CHECK_FUNCS(fmod killpg wait4 waitpid fork spawnv syscall __syscall chroot ge
 	      setsid telldir seekdir fchmod cosh sinh tanh log2 round\
 	      setuid setgid daemon select_large_fdset setenv unsetenv\
               mktime timegm gmtime_r clock_gettime gettimeofday poll ppoll\
-              pread sendfile shutdown sigaltstack dl_iterate_phdr)
+              pread sendfile shutdown sigaltstack dl_iterate_phdr\
+              dup3 pipe2 posix_memalign memalign)
 
 AC_CACHE_CHECK(for unsetenv returns a value, rb_cv_unsetenv_return_value,
   [AC_TRY_COMPILE([
diff --git a/constant.h b/constant.h
index 8232910..9106847 100644
--- a/constant.h
+++ b/constant.h
@@ -23,7 +23,7 @@ typedef struct rb_const_entry_struct {
 
 VALUE rb_mod_private_constant(int argc, VALUE *argv, VALUE obj);
 VALUE rb_mod_public_constant(int argc, VALUE *argv, VALUE obj);
-void rb_free_const_table(st_table *tbl);
+void rb_free_const_table(sa_table *tbl);
 VALUE rb_public_const_get(VALUE klass, ID id);
 VALUE rb_public_const_get_at(VALUE klass, ID id);
 VALUE rb_public_const_get_from(VALUE klass, ID id);
diff --git a/ext/-test-/st/numhash/numhash.c b/ext/-test-/st/numhash/numhash.c
index e186cd4..53d9e1b 100644
--- a/ext/-test-/st/numhash/numhash.c
+++ b/ext/-test-/st/numhash/numhash.c
@@ -54,7 +54,7 @@ numhash_i(st_data_t key, st_data_t value, st_data_t arg, int error)
 static VALUE
 numhash_each(VALUE self)
 {
-    return st_foreach((st_table *)DATA_PTR(self), numhash_i, self) ? Qtrue : Qfalse;
+    return st_foreach_check((st_table *)DATA_PTR(self), numhash_i, self, 0) ? Qtrue : Qfalse;
 }
 
 void
diff --git a/ext/objspace/objspace.c b/ext/objspace/objspace.c
index 66e33a3..4b31f92 100644
--- a/ext/objspace/objspace.c
+++ b/ext/objspace/objspace.c
@@ -60,20 +60,10 @@ memsize_of(VALUE obj)
 	break;
       case T_MODULE:
       case T_CLASS:
-	size += st_memsize(RCLASS_M_TBL(obj));
-	if (RCLASS_IV_TBL(obj)) {
-	    size += st_memsize(RCLASS_IV_TBL(obj));
-	}
-	if (RCLASS_IV_INDEX_TBL(obj)) {
-	    size += st_memsize(RCLASS_IV_INDEX_TBL(obj));
-	}
-	if (RCLASS(obj)->ptr->iv_tbl) {
-	    size += st_memsize(RCLASS(obj)->ptr->iv_tbl);
-	}
-	if (RCLASS(obj)->ptr->const_tbl) {
-	    size += st_memsize(RCLASS(obj)->ptr->const_tbl);
-	}
-	size += sizeof(rb_classext_t);
+	size += sa_memsize(RCLASS_M_TBL(obj));
+        size += sa_memsize(RCLASS_IV_TBL(obj));
+        size += sa_memsize(RCLASS_IV_INDEX_TBL(obj));
+        size += sa_memsize(RCLASS_CONST_TBL(obj));
 	break;
       case T_STRING:
 	size += rb_str_memsize(obj);
diff --git a/file.c b/file.c
index c1db6d7..3f465e5 100644
--- a/file.c
+++ b/file.c
@@ -148,40 +148,60 @@ file_path_convert(VALUE name)
     return name;
 }
 
-static VALUE
-rb_get_path_check(VALUE obj, int level)
+static rb_encoding *
+check_path_encoding(VALUE str)
+{
+    rb_encoding *enc = rb_enc_get(str);
+    if (!rb_enc_asciicompat(enc)) {
+	rb_raise(rb_eEncCompatError, "path name must be ASCII-compatible (%s): %s",
+		 rb_enc_name(enc), RSTRING_PTR(rb_str_inspect(str)));
+    }
+    return enc;
+}
+
+VALUE
+rb_get_path_check_to_string(VALUE obj, int level)
 {
     VALUE tmp;
     ID to_path;
-    rb_encoding *enc;
 
     if (insecure_obj_p(obj, level)) {
 	rb_insecure_operation();
     }
 
+    if (RB_TYPE_P(obj, T_STRING)) {
+	return obj;
+    }
     CONST_ID(to_path, "to_path");
     tmp = rb_check_funcall(obj, to_path, 0, 0);
     if (tmp == Qundef) {
 	tmp = obj;
     }
     StringValue(tmp);
+    return tmp;
+}
 
+VALUE
+rb_get_path_check_convert(VALUE obj, VALUE tmp, int level)
+{
     tmp = file_path_convert(tmp);
     if (obj != tmp && insecure_obj_p(tmp, level)) {
 	rb_insecure_operation();
     }
-    enc = rb_enc_get(tmp);
-    if (!rb_enc_asciicompat(enc)) {
-	tmp = rb_str_inspect(tmp);
-	rb_raise(rb_eEncCompatError, "path name must be ASCII-compatible (%s): %s",
-		 rb_enc_name(enc), RSTRING_PTR(tmp));
-    }
 
+    check_path_encoding(tmp);
     StringValueCStr(tmp);
 
     return rb_str_new4(tmp);
 }
 
+static VALUE
+rb_get_path_check(VALUE obj, int level)
+{
+    VALUE tmp = rb_get_path_check_to_string(obj, level);
+    return rb_get_path_check_convert(obj, tmp, level);
+}
+
 VALUE
 rb_get_path_no_checksafe(VALUE obj)
 {
@@ -3249,7 +3269,6 @@ rb_file_expand_path(VALUE fname, VALUE dname)
 VALUE
 rb_file_expand_path_fast(VALUE fname, VALUE dname)
 {
-    check_expand_path_args(fname, dname);
     return rb_file_expand_path_internal(fname, dname, 0, 0, EXPAND_PATH_BUFFER());
 }
 
@@ -5237,7 +5256,7 @@ rb_find_file_ext_safe(VALUE *filep, const char *const *ext, int safe_level)
 	rb_raise(rb_eSecurityError, "loading from non-absolute path %s", f);
     }
 
-    RB_GC_GUARD(load_path) = rb_get_load_path();
+    RB_GC_GUARD(load_path) = rb_get_expanded_load_path();
     if (!load_path) return 0;
 
     fname = rb_str_dup(*filep);
@@ -5302,7 +5321,7 @@ rb_find_file_safe(VALUE path, int safe_level)
 	rb_raise(rb_eSecurityError, "loading from non-absolute path %s", f);
     }
 
-    RB_GC_GUARD(load_path) = rb_get_load_path();
+    RB_GC_GUARD(load_path) = rb_get_expanded_load_path();
     if (load_path) {
 	long i;
 
diff --git a/gc.c b/gc.c
index e65d0ec..ee183be 100644
--- a/gc.c
+++ b/gc.c
@@ -20,10 +20,12 @@
 #include "vm_core.h"
 #include "internal.h"
 #include "gc.h"
+#include "pool_alloc.h"
 #include "constant.h"
 #include <stdio.h>
 #include <setjmp.h>
 #include <sys/types.h>
+#include <assert.h>
 
 #ifdef HAVE_SYS_TIME_H
 #include <sys/time.h>
@@ -35,7 +37,12 @@
 
 #if defined _WIN32 || defined __CYGWIN__
 #include <windows.h>
+#elif defined(HAVE_POSIX_MEMALIGN)
+#elif defined(HAVE_MEMALIGN)
+#include <malloc.h>
 #endif
+static void aligned_free(void *);
+static void *aligned_malloc(size_t alignment, size_t size);
 
 #ifdef HAVE_VALGRIND_MEMCHECK_H
 # include <valgrind/memcheck.h>
@@ -321,6 +328,24 @@ struct gc_list {
 
 #define CALC_EXACT_MALLOC_SIZE 0
 
+#ifdef POOL_ALLOC_API
+/* POOL ALLOC API */
+#define POOL_ALLOC_PART 1
+#include "pool_alloc.inc.h"
+#undef POOL_ALLOC_PART
+
+typedef struct pool_layout_t pool_layout_t;
+struct pool_layout_t {
+    pool_header
+      p6,  /* st_table && st_table_entry */
+      p11;  /* st_table.bins init size */
+} pool_layout = {
+    INIT_POOL(void*[6]),
+    INIT_POOL(void*[11])
+};
+static void pool_finalize_header(pool_header *header);
+#endif
+
 typedef struct rb_objspace {
     struct {
 	size_t limit;
@@ -330,6 +355,9 @@ typedef struct rb_objspace {
 	size_t allocations;
 #endif
     } malloc_params;
+#ifdef POOL_ALLOC_API
+    pool_layout_t *pool_headers;
+#endif
     struct {
 	size_t increment;
 	struct heaps_slot *ptr;
@@ -377,7 +405,11 @@ typedef struct rb_objspace {
 #define ruby_initial_gc_stress	initial_params.gc_stress
 int *ruby_initial_gc_stress_ptr = &ruby_initial_gc_stress;
 #else
+#  ifdef POOL_ALLOC_API
+static rb_objspace_t rb_objspace = {{GC_MALLOC_LIMIT}, &pool_layout, {HEAP_MIN_SLOTS}};
+#  else
 static rb_objspace_t rb_objspace = {{GC_MALLOC_LIMIT}, {HEAP_MIN_SLOTS}};
+#  endif
 int *ruby_initial_gc_stress_ptr = &rb_objspace.gc_stress;
 #endif
 #define malloc_limit		objspace->malloc_params.limit
@@ -413,6 +445,10 @@ rb_objspace_alloc(void)
     memset(objspace, 0, sizeof(*objspace));
     malloc_limit = initial_malloc_limit;
     ruby_gc_stress = ruby_initial_gc_stress;
+#ifdef POOL_ALLOC_API
+    objspace->pool_headers = (pool_layout_t*) malloc(sizeof(pool_layout));
+    memcpy(objspace->pool_headers, &pool_layout, sizeof(pool_layout));
+#endif
 
     return objspace;
 }
@@ -491,6 +527,13 @@ rb_objspace_free(rb_objspace_t *objspace)
 	heaps_used = 0;
 	heaps = 0;
     }
+#ifdef POOL_ALLOC_API
+    if (objspace->pool_headers) {
+        pool_finalize_header(&objspace->pool_headers->p6);
+        pool_finalize_header(&objspace->pool_headers->p11);
+        free(objspace->pool_headers);
+    }
+#endif
     free(objspace);
 }
 #endif
@@ -513,7 +556,7 @@ rb_objspace_free(rb_objspace_t *objspace)
 
 #define HEAP_OBJ_LIMIT (unsigned int)(HEAP_SIZE / sizeof(struct RVALUE))
 
-extern st_table *rb_class_tbl;
+extern sa_table rb_class_tbl;
 
 int ruby_disable_gc_stress = 0;
 
@@ -894,6 +937,27 @@ ruby_xfree(void *x)
 	vm_xfree(&rb_objspace, x);
 }
 
+#ifdef POOL_ALLOC_API
+/* POOL ALLOC API */
+#define POOL_ALLOC_PART 2
+#include "pool_alloc.inc.h"
+#undef POOL_ALLOC_PART
+
+void
+ruby_xpool_free(void *ptr)
+{
+    pool_free_entry((void**)ptr);
+}
+
+#define CONCRET_POOL_MALLOC(pnts) \
+void * ruby_xpool_malloc_##pnts##p () { \
+    return pool_alloc_entry(&rb_objspace.pool_headers->p##pnts ); \
+}
+CONCRET_POOL_MALLOC(6)
+CONCRET_POOL_MALLOC(11)
+#undef CONCRET_POOL_MALLOC
+
+#endif
 
 /*
  *  call-seq:
@@ -1008,6 +1072,55 @@ allocate_sorted_heaps(rb_objspace_t *objspace, size_t next_heaps_length)
     heaps_length = next_heaps_length;
 }
 
+static void *
+aligned_malloc(size_t alignment, size_t size)
+{
+    void *res;
+
+#if defined __MINGW32__
+    res = __mingw_aligned_malloc(size, alignment);
+#elif defined _WIN32 && !defined __CYGWIN__
+    res = _aligned_malloc(size, alignment);
+#elif defined(HAVE_POSIX_MEMALIGN)
+    if (posix_memalign(&res, alignment, size) == 0) {
+        return res;
+    }
+    else {
+        return NULL;
+    }
+#elif defined(HAVE_MEMALIGN)
+    res = memalign(alignment, size);
+#else
+    char* aligned;
+    res = malloc(alignment + size + sizeof(void*));
+    aligned = (char*)res + alignment + sizeof(void*);
+    aligned -= ((VALUE)aligned & (alignment - 1));
+    ((void**)aligned)[-1] = res;
+    res = (void*)aligned;
+#endif
+
+#if defined(_DEBUG) || defined(GC_DEBUG)
+    /* alignment must be a power of 2 */
+    assert((alignment - 1) & alignment == 0);
+    assert(alignment % sizeof(void*) == 0);
+#endif
+    return res;
+}
+
+static void
+aligned_free(void *ptr)
+{
+#if defined __MINGW32__
+    __mingw_aligned_free(ptr);
+#elif defined _WIN32 && !defined __CYGWIN__
+    _aligned_free(ptr);
+#elif defined(HAVE_MEMALIGN) || defined(HAVE_POSIX_MEMALIGN)
+    free(ptr);
+#else
+    free(((void**)ptr)[-1]);
+#endif
+}
+
 static void
 assign_heap_slot(rb_objspace_t *objspace)
 {
@@ -1466,6 +1579,15 @@ mark_tbl(rb_objspace_t *objspace, st_table *tbl, int lev)
     st_foreach(tbl, mark_entry, (st_data_t)&arg);
 }
 
+static void
+mark_sa_tbl(rb_objspace_t *objspace, sa_table *tbl, int lev)
+{
+    if (!tbl) return;
+    SA_FOREACH_START(tbl);
+    gc_mark(objspace, (VALUE)value, lev);
+    SA_FOREACH_END();
+}
+
 static int
 mark_key(VALUE key, VALUE value, st_data_t data)
 {
@@ -1544,74 +1666,52 @@ rb_mark_method_entry(const rb_method_entry_t *me)
     mark_method_entry(&rb_objspace, me, 0);
 }
 
-static int
-mark_method_entry_i(ID key, const rb_method_entry_t *me, st_data_t data)
-{
-    struct mark_tbl_arg *arg = (void*)data;
-    mark_method_entry(arg->objspace, me, arg->lev);
-    return ST_CONTINUE;
-}
-
 static void
-mark_m_tbl(rb_objspace_t *objspace, st_table *tbl, int lev)
-{
-    struct mark_tbl_arg arg;
-    if (!tbl) return;
-    arg.objspace = objspace;
-    arg.lev = lev;
-    st_foreach(tbl, mark_method_entry_i, (st_data_t)&arg);
-}
-
-static int
-free_method_entry_i(ID key, rb_method_entry_t *me, st_data_t data)
+mark_m_tbl(rb_objspace_t *objspace, sa_table *tbl, int lev)
 {
-    rb_free_method_entry(me);
-    return ST_CONTINUE;
+    SA_FOREACH_START(tbl);
+    mark_method_entry(objspace, (const rb_method_entry_t*)value, lev);
+    SA_FOREACH_END();
 }
 
 void
-rb_free_m_table(st_table *tbl)
+rb_free_m_table(sa_table *tbl)
 {
-    st_foreach(tbl, free_method_entry_i, 0);
-    st_free_table(tbl);
-}
-
-static int
-mark_const_entry_i(ID key, const rb_const_entry_t *ce, st_data_t data)
-{
-    struct mark_tbl_arg *arg = (void*)data;
-    gc_mark(arg->objspace, ce->value, arg->lev);
-    return ST_CONTINUE;
+    SA_FOREACH_START(tbl);
+    if (!((rb_method_entry_t*)value)->mark) {
+	rb_free_method_entry((rb_method_entry_t*)value);
+    }
+    SA_FOREACH_END();
+    sa_clear(tbl);
 }
 
 static void
-mark_const_tbl(rb_objspace_t *objspace, st_table *tbl, int lev)
+mark_const_tbl(rb_objspace_t *objspace, sa_table *tbl, int lev)
 {
-    struct mark_tbl_arg arg;
-    if (!tbl) return;
-    arg.objspace = objspace;
-    arg.lev = lev;
-    st_foreach(tbl, mark_const_entry_i, (st_data_t)&arg);
+    SA_FOREACH_START(tbl);
+    gc_mark(objspace, ((const rb_const_entry_t*)value)->value, lev);
+    SA_FOREACH_END();
 }
 
-static int
-free_const_entry_i(ID key, rb_const_entry_t *ce, st_data_t data)
+void
+rb_free_const_table(sa_table *tbl)
 {
-    xfree(ce);
-    return ST_CONTINUE;
+    SA_FOREACH_START(tbl);
+    xfree((rb_const_entry_t*)value);
+    SA_FOREACH_END();
+    sa_clear(tbl);
 }
 
 void
-rb_free_const_table(st_table *tbl)
+rb_mark_tbl(st_table *tbl)
 {
-    st_foreach(tbl, free_const_entry_i, 0);
-    st_free_table(tbl);
+    mark_tbl(&rb_objspace, tbl, 0);
 }
 
 void
-rb_mark_tbl(st_table *tbl)
+rb_mark_sa_tbl(sa_table *tbl)
 {
-    mark_tbl(&rb_objspace, tbl, 0);
+    mark_sa_tbl(&rb_objspace, tbl, 0);
 }
 
 void
@@ -1819,7 +1919,7 @@ gc_mark_children(rb_objspace_t *objspace, VALUE ptr, int lev)
       case T_CLASS:
       case T_MODULE:
 	mark_m_tbl(objspace, RCLASS_M_TBL(obj), lev);
-	mark_tbl(objspace, RCLASS_IV_TBL(obj), lev);
+	mark_sa_tbl(objspace, RCLASS_IV_TBL(obj), lev);
 	mark_const_tbl(objspace, RCLASS_CONST_TBL(obj), lev);
 	ptr = RCLASS_SUPER(obj);
 	goto again;
@@ -2286,15 +2386,11 @@ obj_free(rb_objspace_t *objspace, VALUE obj)
       case T_CLASS:
 	rb_clear_cache_by_class((VALUE)obj);
 	rb_free_m_table(RCLASS_M_TBL(obj));
-	if (RCLASS_IV_TBL(obj)) {
-	    st_free_table(RCLASS_IV_TBL(obj));
-	}
-	if (RCLASS_CONST_TBL(obj)) {
-	    rb_free_const_table(RCLASS_CONST_TBL(obj));
-	}
-	if (RCLASS_IV_INDEX_TBL(obj)) {
-	    st_free_table(RCLASS_IV_INDEX_TBL(obj));
-	}
+        sa_clear(RCLASS_IV_TBL(obj));
+        rb_free_const_table(RCLASS_CONST_TBL(obj));
+        sa_clear(RCLASS_IV_INDEX_TBL(obj));
+        sa_clear(&RCLASS(obj)->cache->m_cache_tbl);
+        xfree(RCLASS(obj)->cache);
         xfree(RANY(obj)->as.klass.ptr);
 	break;
       case T_STRING:
@@ -2346,8 +2442,9 @@ obj_free(rb_objspace_t *objspace, VALUE obj)
       case T_COMPLEX:
 	break;
       case T_ICLASS:
+        sa_clear(&RCLASS(obj)->cache->m_cache_tbl);
+        xfree(RCLASS(obj)->cache);
 	/* iClass shares table with the module */
-	xfree(RANY(obj)->as.klass.ptr);
 	break;
 
       case T_FLOAT:
@@ -2458,7 +2555,7 @@ gc_marks(rb_objspace_t *objspace)
     rb_mark_end_proc();
     rb_gc_mark_global_tbl();
 
-    mark_tbl(objspace, rb_class_tbl, 0);
+    mark_sa_tbl(objspace, &rb_class_tbl, 0);
 
     /* mark generic instance variables for special constants */
     rb_mark_generic_ivar_tbl();
diff --git a/hash.c b/hash.c
index fbd8237..4cb2e2d 100644
--- a/hash.c
+++ b/hash.c
@@ -44,7 +44,7 @@ rb_any_cmp(VALUE a, VALUE b)
     if (FIXNUM_P(a) && FIXNUM_P(b)) {
 	return a != b;
     }
-    if (TYPE(a) == T_STRING && RBASIC(a)->klass == rb_cString &&
+    if (RB_TYPE_P(a, T_STRING) && RBASIC(a)->klass == rb_cString &&
 	TYPE(b) == T_STRING && RBASIC(b)->klass == rb_cString) {
 	return rb_str_hash_cmp(a, b);
     }
@@ -80,20 +80,14 @@ rb_any_hash(VALUE a)
     VALUE hval;
     st_index_t hnum;
 
-    switch (TYPE(a)) {
-      case T_FIXNUM:
-      case T_SYMBOL:
-      case T_NIL:
-      case T_FALSE:
-      case T_TRUE:
-	hnum = rb_hash_end(rb_hash_start((unsigned int)a));
-	break;
-
-      case T_STRING:
+    if (SPECIAL_CONST_P(a)) {
+	if (a == Qundef) return 0;
+	hnum = rb_hash_end(rb_hash_start((st_index_t)a));
+    }
+    else if (BUILTIN_TYPE(a) == T_STRING) {
 	hnum = rb_str_hash(a);
-	break;
-
-      default:
+    }
+    else {
         hval = rb_hash(a);
 	hnum = FIX2LONG(hval);
     }
@@ -106,10 +100,8 @@ static const struct st_hash_type objhash = {
     rb_any_hash,
 };
 
-static const struct st_hash_type identhash = {
-    st_numcmp,
-    st_numhash,
-};
+extern const struct st_hash_type st_hashtype_num;
+#define identhash st_hashtype_num
 
 typedef int st_foreach_func(st_data_t, st_data_t, st_data_t);
 
@@ -124,7 +116,6 @@ foreach_safe_i(st_data_t key, st_data_t value, struct foreach_safe_arg *arg)
 {
     int status;
 
-    if (key == Qundef) return ST_CONTINUE;
     status = (*arg->func)(key, value, arg->arg);
     if (status == ST_CONTINUE) {
 	return ST_CHECK;
@@ -140,7 +131,7 @@ st_foreach_safe(st_table *table, int (*func)(ANYARGS), st_data_t a)
     arg.tbl = table;
     arg.func = (st_foreach_func *)func;
     arg.arg = a;
-    if (st_foreach(table, foreach_safe_i, (st_data_t)&arg)) {
+    if (st_foreach_check(table, foreach_safe_i, (st_data_t)&arg, 0)) {
 	rb_raise(rb_eRuntimeError, "hash modified during iteration");
     }
 }
@@ -154,21 +145,21 @@ struct hash_foreach_arg {
 };
 
 static int
-hash_foreach_iter(st_data_t key, st_data_t value, struct hash_foreach_arg *arg)
+hash_foreach_iter(st_data_t key, st_data_t value, st_data_t argp)
 {
+    struct hash_foreach_arg *arg = (struct hash_foreach_arg *)argp;
     int status;
     st_table *tbl;
 
     tbl = RHASH(arg->hash)->ntbl;
-    if ((VALUE)key == Qundef) return ST_CONTINUE;
     status = (*arg->func)((VALUE)key, (VALUE)value, arg->arg);
     if (RHASH(arg->hash)->ntbl != tbl) {
 	rb_raise(rb_eRuntimeError, "rehash occurred during iteration");
     }
     switch (status) {
       case ST_DELETE:
-	st_delete_safe(tbl, &key, 0, Qundef);
 	FL_SET(arg->hash, HASH_DELETED);
+	return ST_DELETE;
       case ST_CONTINUE:
 	break;
       case ST_STOP:
@@ -184,7 +175,7 @@ hash_foreach_ensure(VALUE hash)
 
     if (RHASH(hash)->iter_lev == 0) {
 	if (FL_TEST(hash, HASH_DELETED)) {
-	    st_cleanup_safe(RHASH(hash)->ntbl, Qundef);
+	    st_cleanup_safe(RHASH(hash)->ntbl, (st_data_t)Qundef);
 	    FL_UNSET(hash, HASH_DELETED);
 	}
     }
@@ -192,9 +183,10 @@ hash_foreach_ensure(VALUE hash)
 }
 
 static VALUE
-hash_foreach_call(struct hash_foreach_arg *arg)
+hash_foreach_call(VALUE arg)
 {
-    if (st_foreach(RHASH(arg->hash)->ntbl, hash_foreach_iter, (st_data_t)arg)) {
+    VALUE hash = ((struct hash_foreach_arg *)arg)->hash;
+    if (st_foreach_check(RHASH(hash)->ntbl, hash_foreach_iter, (st_data_t)arg, (st_data_t)Qundef)) {
 	rb_raise(rb_eRuntimeError, "hash modified during iteration");
     }
     return Qnil;
@@ -447,7 +439,7 @@ rb_hash_rehash_i(VALUE key, VALUE value, VALUE arg)
 {
     st_table *tbl = (st_table *)arg;
 
-    if (key != Qundef) st_insert(tbl, key, value);
+    st_insert(tbl, (st_data_t)key, (st_data_t)value);
     return ST_CONTINUE;
 }
 
@@ -490,6 +482,20 @@ rb_hash_rehash(VALUE hash)
     return hash;
 }
 
+static VALUE
+hash_default_value(VALUE hash, VALUE key)
+{
+    if (rb_method_basic_definition_p(CLASS_OF(hash), id_default)) {
+	VALUE ifnone = RHASH_IFNONE(hash);
+	if (!FL_TEST(hash, HASH_PROC_DEFAULT)) return ifnone;
+	if (key == Qundef) return Qnil;
+	return rb_funcall(ifnone, id_yield, 2, hash, key);
+    }
+    else {
+	return rb_funcall(hash, id_default, 1, key);
+    }
+}
+
 /*
  *  call-seq:
  *     hsh[key]    ->  value
@@ -510,13 +516,7 @@ rb_hash_aref(VALUE hash, VALUE key)
     st_data_t val;
 
     if (!RHASH(hash)->ntbl || !st_lookup(RHASH(hash)->ntbl, key, &val)) {
-	if (!FL_TEST(hash, HASH_PROC_DEFAULT) &&
-	    rb_method_basic_definition_p(CLASS_OF(hash), id_default)) {
-	    return RHASH_IFNONE(hash);
-	}
-	else {
-	    return rb_funcall(hash, id_default, 1, key);
-	}
+	return hash_default_value(hash, key);
     }
     return (VALUE)val;
 }
@@ -659,7 +659,7 @@ rb_hash_default(int argc, VALUE *argv, VALUE hash)
 static VALUE
 rb_hash_set_default(VALUE hash, VALUE ifnone)
 {
-    rb_hash_modify(hash);
+    rb_hash_modify_check(hash);
     RHASH_IFNONE(hash) = ifnone;
     FL_UNSET(hash, HASH_PROC_DEFAULT);
     return ifnone;
@@ -707,7 +707,7 @@ rb_hash_set_default_proc(VALUE hash, VALUE proc)
 {
     VALUE b;
 
-    rb_hash_modify(hash);
+    rb_hash_modify_check(hash);
     b = rb_check_convert_type(proc, T_DATA, "Proc", "to_proc");
     if (NIL_P(b) || !rb_obj_is_proc(b)) {
 	rb_raise(rb_eTypeError,
@@ -776,7 +776,7 @@ rb_hash_delete_key(VALUE hash, VALUE key)
     if (!RHASH(hash)->ntbl)
         return Qundef;
     if (RHASH(hash)->iter_lev > 0) {
-	if (st_delete_safe(RHASH(hash)->ntbl, &ktmp, &val, Qundef)) {
+	if (st_delete_safe(RHASH(hash)->ntbl, &ktmp, &val, (st_data_t)Qundef)) {
 	    FL_SET(hash, HASH_DELETED);
 	    return (VALUE)val;
 	}
@@ -809,7 +809,7 @@ rb_hash_delete(VALUE hash, VALUE key)
 {
     VALUE val;
 
-    rb_hash_modify(hash);
+    rb_hash_modify_check(hash);
     val = rb_hash_delete_key(hash, key);
     if (val != Qundef) return val;
     if (rb_block_given_p()) {
@@ -828,7 +828,6 @@ shift_i(VALUE key, VALUE value, VALUE arg)
 {
     struct shift_var *var = (struct shift_var *)arg;
 
-    if (key == Qundef) return ST_CONTINUE;
     if (var->key != Qundef) return ST_STOP;
     var->key = key;
     var->val = value;
@@ -840,7 +839,6 @@ shift_i_safe(VALUE key, VALUE value, VALUE arg)
 {
     struct shift_var *var = (struct shift_var *)arg;
 
-    if (key == Qundef) return ST_CONTINUE;
     var->key = key;
     var->val = value;
     return ST_STOP;
@@ -864,29 +862,25 @@ rb_hash_shift(VALUE hash)
 {
     struct shift_var var;
 
-    rb_hash_modify(hash);
-    var.key = Qundef;
-    rb_hash_foreach(hash, RHASH(hash)->iter_lev > 0 ? shift_i_safe : shift_i,
-		    (VALUE)&var);
-
-    if (var.key != Qundef) {
-	if (RHASH(hash)->iter_lev > 0) {
-	    rb_hash_delete_key(hash, var.key);
+    rb_hash_modify_check(hash);
+    if (RHASH(hash)->ntbl) {
+	var.key = Qundef;
+	rb_hash_foreach(hash, RHASH(hash)->iter_lev > 0 ? shift_i_safe : shift_i,
+			(VALUE)&var);
+
+	if (var.key != Qundef) {
+	    if (RHASH(hash)->iter_lev > 0) {
+		rb_hash_delete_key(hash, var.key);
+	    }
+	    return rb_assoc_new(var.key, var.val);
 	}
-	return rb_assoc_new(var.key, var.val);
-    }
-    else if (FL_TEST(hash, HASH_PROC_DEFAULT)) {
-	return rb_funcall(RHASH_IFNONE(hash), id_yield, 2, hash, Qnil);
-    }
-    else {
-	return RHASH_IFNONE(hash);
     }
+    return hash_default_value(hash, Qnil);
 }
 
 static int
 delete_if_i(VALUE key, VALUE value, VALUE hash)
 {
-    if (key == Qundef) return ST_CONTINUE;
     if (RTEST(rb_yield_values(2, key, value))) {
 	rb_hash_delete_key(hash, key);
     }
@@ -912,8 +906,9 @@ VALUE
 rb_hash_delete_if(VALUE hash)
 {
     RETURN_ENUMERATOR(hash, 0, 0);
-    rb_hash_modify(hash);
-    rb_hash_foreach(hash, delete_if_i, hash);
+    rb_hash_modify_check(hash);
+    if (RHASH(hash)->ntbl)
+	rb_hash_foreach(hash, delete_if_i, hash);
     return hash;
 }
 
@@ -984,7 +979,6 @@ rb_hash_values_at(int argc, VALUE *argv, VALUE hash)
 static int
 select_i(VALUE key, VALUE value, VALUE result)
 {
-    if (key == Qundef) return ST_CONTINUE;
     if (RTEST(rb_yield_values(2, key, value)))
 	rb_hash_aset(result, key, value);
     return ST_CONTINUE;
@@ -1018,7 +1012,6 @@ rb_hash_select(VALUE hash)
 static int
 keep_if_i(VALUE key, VALUE value, VALUE hash)
 {
-    if (key == Qundef) return ST_CONTINUE;
     if (!RTEST(rb_yield_values(2, key, value))) {
 	return ST_DELETE;
     }
@@ -1040,7 +1033,7 @@ rb_hash_select_bang(VALUE hash)
     st_index_t n;
 
     RETURN_ENUMERATOR(hash, 0, 0);
-    rb_hash_modify(hash);
+    rb_hash_modify_check(hash);
     if (!RHASH(hash)->ntbl)
         return Qnil;
     n = RHASH(hash)->ntbl->num_entries;
@@ -1065,8 +1058,9 @@ VALUE
 rb_hash_keep_if(VALUE hash)
 {
     RETURN_ENUMERATOR(hash, 0, 0);
-    rb_hash_modify(hash);
-    rb_hash_foreach(hash, keep_if_i, hash);
+    rb_hash_modify_check(hash);
+    if (RHASH(hash)->ntbl)
+	rb_hash_foreach(hash, keep_if_i, hash);
     return hash;
 }
 
@@ -1087,7 +1081,7 @@ clear_i(VALUE key, VALUE value, VALUE dummy)
  *
  */
 
-static VALUE
+VALUE
 rb_hash_clear(VALUE hash)
 {
     rb_hash_modify_check(hash);
@@ -1144,9 +1138,7 @@ rb_hash_aset(VALUE hash, VALUE key, VALUE val)
 static int
 replace_i(VALUE key, VALUE val, VALUE hash)
 {
-    if (key != Qundef) {
-	rb_hash_aset(hash, key, val);
-    }
+    rb_hash_aset(hash, key, val);
 
     return ST_CONTINUE;
 }
@@ -1227,7 +1219,6 @@ rb_hash_empty_p(VALUE hash)
 static int
 each_value_i(VALUE key, VALUE value)
 {
-    if (key == Qundef) return ST_CONTINUE;
     rb_yield(value);
     return ST_CONTINUE;
 }
@@ -1262,7 +1253,6 @@ rb_hash_each_value(VALUE hash)
 static int
 each_key_i(VALUE key, VALUE value)
 {
-    if (key == Qundef) return ST_CONTINUE;
     rb_yield(key);
     return ST_CONTINUE;
 }
@@ -1296,7 +1286,6 @@ rb_hash_each_key(VALUE hash)
 static int
 each_pair_i(VALUE key, VALUE value)
 {
-    if (key == Qundef) return ST_CONTINUE;
     rb_yield(rb_assoc_new(key, value));
     return ST_CONTINUE;
 }
@@ -1334,7 +1323,6 @@ rb_hash_each_pair(VALUE hash)
 static int
 to_a_i(VALUE key, VALUE value, VALUE ary)
 {
-    if (key == Qundef) return ST_CONTINUE;
     rb_ary_push(ary, rb_assoc_new(key, value));
     return ST_CONTINUE;
 }
@@ -1367,7 +1355,6 @@ inspect_i(VALUE key, VALUE value, VALUE str)
 {
     VALUE str2;
 
-    if (key == Qundef) return ST_CONTINUE;
     str2 = rb_inspect(key);
     if (RSTRING_LEN(str) > 1) {
 	rb_str_cat2(str, ", ");
@@ -1434,7 +1421,6 @@ rb_hash_to_hash(VALUE hash)
 static int
 keys_i(VALUE key, VALUE value, VALUE ary)
 {
-    if (key == Qundef) return ST_CONTINUE;
     rb_ary_push(ary, key);
     return ST_CONTINUE;
 }
@@ -1465,7 +1451,6 @@ rb_hash_keys(VALUE hash)
 static int
 values_i(VALUE key, VALUE value, VALUE ary)
 {
-    if (key == Qundef) return ST_CONTINUE;
     rb_ary_push(ary, value);
     return ST_CONTINUE;
 }
@@ -1524,7 +1509,6 @@ rb_hash_search_value(VALUE key, VALUE value, VALUE arg)
 {
     VALUE *data = (VALUE *)arg;
 
-    if (key == Qundef) return ST_CONTINUE;
     if (rb_equal(value, data[1])) {
 	data[0] = Qtrue;
 	return ST_STOP;
@@ -1568,7 +1552,6 @@ eql_i(VALUE key, VALUE val1, VALUE arg)
     struct equal_data *data = (struct equal_data *)arg;
     st_data_t val2;
 
-    if (key == Qundef) return ST_CONTINUE;
     if (!st_lookup(data->tbl, key, &val2)) {
 	data->result = Qfalse;
 	return ST_STOP;
@@ -1599,7 +1582,7 @@ hash_equal(VALUE hash1, VALUE hash2, int eql)
     struct equal_data data;
 
     if (hash1 == hash2) return Qtrue;
-    if (TYPE(hash2) != T_HASH) {
+    if (!RB_TYPE_P(hash2, T_HASH)) {
 	if (!rb_respond_to(hash2, rb_intern("to_hash"))) {
 	    return Qfalse;
 	}
@@ -1670,7 +1653,6 @@ hash_i(VALUE key, VALUE val, VALUE arg)
     st_index_t *hval = (st_index_t *)arg;
     st_index_t hdata[2];
 
-    if (key == Qundef) return ST_CONTINUE;
     hdata[0] = rb_hash(key);
     hdata[1] = rb_hash(val);
     *hval ^= st_hash(hdata, sizeof(hdata), 0);
@@ -1711,7 +1693,6 @@ rb_hash_hash(VALUE hash)
 static int
 rb_hash_invert_i(VALUE key, VALUE value, VALUE hash)
 {
-    if (key == Qundef) return ST_CONTINUE;
     rb_hash_aset(hash, value, key);
     return ST_CONTINUE;
 }
@@ -1740,7 +1721,6 @@ rb_hash_invert(VALUE hash)
 static int
 rb_hash_update_i(VALUE key, VALUE value, VALUE hash)
 {
-    if (key == Qundef) return ST_CONTINUE;
     hash_update(hash, key);
     st_insert(RHASH(hash)->ntbl, key, value);
     return ST_CONTINUE;
@@ -1749,7 +1729,6 @@ rb_hash_update_i(VALUE key, VALUE value, VALUE hash)
 static int
 rb_hash_update_block_i(VALUE key, VALUE value, VALUE hash)
 {
-    if (key == Qundef) return ST_CONTINUE;
     if (rb_hash_has_key(hash, key)) {
 	value = rb_yield_values(3, key, rb_hash_aref(hash, key), value);
     }
@@ -1806,7 +1785,6 @@ rb_hash_update_func_i(VALUE key, VALUE value, VALUE arg0)
     struct update_arg *arg = (struct update_arg *)arg0;
     VALUE hash = arg->hash;
 
-    if (key == Qundef) return ST_CONTINUE;
     if (rb_hash_has_key(hash, key)) {
 	value = (*arg->func)(key, rb_hash_aref(hash, key), value);
     }
@@ -1863,7 +1841,6 @@ assoc_i(VALUE key, VALUE val, VALUE arg)
 {
     VALUE *args = (VALUE *)arg;
 
-    if (key == Qundef) return ST_CONTINUE;
     if (RTEST(rb_equal(args[0], key))) {
 	args[1] = rb_assoc_new(key, val);
 	return ST_STOP;
@@ -1901,7 +1878,6 @@ rassoc_i(VALUE key, VALUE val, VALUE arg)
 {
     VALUE *args = (VALUE *)arg;
 
-    if (key == Qundef) return ST_CONTINUE;
     if (RTEST(rb_equal(args[0], val))) {
 	args[1] = rb_assoc_new(key, val);
 	return ST_STOP;
@@ -2198,7 +2174,7 @@ rb_env_path_tainted(void)
 }
 
 #if defined(_WIN32) || (defined(HAVE_SETENV) && defined(HAVE_UNSETENV))
-#elif defined __sun__
+#elif defined __sun
 static int
 in_origenv(const char *str)
 {
@@ -2286,7 +2262,7 @@ ruby_setenv(const char *name, const char *value)
 	    rb_sys_fail("unsetenv");
 #endif
     }
-#elif defined __sun__
+#elif defined __sun
     size_t len;
     char **env_ptr, *str;
     if (strchr(name, '=')) {
@@ -3084,11 +3060,9 @@ env_invert(void)
 static int
 env_replace_i(VALUE key, VALUE val, VALUE keys)
 {
-    if (key != Qundef) {
-	env_aset(Qnil, key, val);
-	if (rb_ary_includes(keys, key)) {
-	    rb_ary_delete(keys, key);
-	}
+    env_aset(Qnil, key, val);
+    if (rb_ary_includes(keys, key)) {
+	rb_ary_delete(keys, key);
     }
     return ST_CONTINUE;
 }
@@ -3120,12 +3094,10 @@ env_replace(VALUE env, VALUE hash)
 static int
 env_update_i(VALUE key, VALUE val)
 {
-    if (key != Qundef) {
-	if (rb_block_given_p()) {
-	    val = rb_yield_values(3, key, rb_f_getenv(Qnil, key), val);
-	}
-	env_aset(Qnil, key, val);
+    if (rb_block_given_p()) {
+	val = rb_yield_values(3, key, rb_f_getenv(Qnil, key), val);
     }
+    env_aset(Qnil, key, val);
     return ST_CONTINUE;
 }
 
@@ -3150,15 +3122,116 @@ env_update(VALUE env, VALUE hash)
 }
 
 /*
- *  A <code>Hash</code> is a collection of key-value pairs. It is
- *  similar to an <code>Array</code>, except that indexing is done via
- *  arbitrary keys of any object type, not an integer index. Hashes enumerate
- *  their values in the order that the corresponding keys were inserted.
+ *  A Hash is a dictionary-like collection of unique keys and their values.
+ *  Also called associative arrays, they are similar to Arrays, but where an
+ *  Array uses integers as its index, a Hash allows you to use any object
+ *  type.
+ *
+ *  Hashes enumerate their values in the order that the corresponding keys
+ *  were inserted.
+ *
+ *  A Hash can be easily created by using its implicit form:
+ *
+ *    grades = { "Jane Doe" => 10, "Jim Doe" => 6 }
+ *
+ *  Hashes allow an alternate syntax form when your keys are always symbols.
+ *  Instead of
+ *
+ *    options = { :font_size => 10, :font_family => "Arial" }
+ *
+ *  You could write it as:
+ *
+ *    options = { font_size: 10, font_family: "Arial" }
+ *
+ *  Each named key is a symbol you can access in hash:
+ *
+ *    options[:font_size]  # => 10
+ *
+ *  A Hash can also be created through its ::new method:
+ *
+ *    grades = Hash.new
+ *    grades["Dorothy Doe"] = 9
  *
  *  Hashes have a <em>default value</em> that is returned when accessing
- *  keys that do not exist in the hash. By default, that value is
- *  <code>nil</code>.
+ *  keys that do not exist in the hash. If no default is set +nil+ is used.
+ *  You can set the default value by sending it as an argument to Hash.new:
+ *
+ *    grades = Hash.new(0)
+ *
+ *  Or by using the #default= method:
+ *
+ *    grades = {"Timmy Doe" => 8}
+ *    grades.default = 0
+ *
+ *  Accessing a value in a Hash requires using its key:
+ *
+ *    puts grades["Jane Doe"] # => 10
+ *
+ *  === Common Uses
+ *
+ *  Hashes are an easy way to represent data structures, such as
+ *
+ *    books         = {}
+ *    books[:matz]  = "The Ruby Language"
+ *    books[:black] = "The Well-Grounded Rubyist"
+ *
+ *  Hashes are also commonly used as a way to have named parameters in
+ *  functions. Note that no brackets are used below. If a hash is the last
+ *  argument on a method call, no braces are needed, thus creating a really
+ *  clean interface:
+ *
+ *    Person.create(name: "John Doe", age: 27)
+ *
+ *    def self.create(params)
+ *      @name = params[:name]
+ *      @age  = params[:age]
+ *    end
+ *
+ *  === Hash Keys
+ *
+ *  Two objects refer to the same hash key when their <code>hash</code> value
+ *  is identical and the two objects are <code>eql?</code> to each other.
+ *
+ *  A user-defined class may be used as a hash key if the <code>hash</code>
+ *  and <code>eql?</code> methods are overridden to provide meaningful
+ *  behavior.  By default, separate instances refer to separate hash keys.
+ *
+ *  A typical implementation of <code>hash</code> is based on the
+ *  object's data while <code>eql?</code> is usually aliased to the overridden
+ *  <code>==</code> method:
+ *
+ *    class Book
+ *      attr_reader :author, :title
+ *
+ *      def initialize(author, title)
+ *        @author = author
+ *        @title = title
+ *      end
+ *
+ *      def ==(other)
+ *        self.class === other and
+ *          other.author == @author and
+ *          other.title == @title
+ *      end
+ *
+ *      alias eql? ==
+ *
+ *      def hash
+ *        @author.hash ^ @title.hash # XOR
+ *      end
+ *    end
+ *
+ *    book1 = Book.new 'matz', 'Ruby in a Nutshell'
+ *    book2 = Book.new 'matz', 'Ruby in a Nutshell'
+ *
+ *    reviews = {}
+ *
+ *    reviews[book1] = 'Great reference!'
+ *    reviews[book2] = 'Nice and compact!'
+ *
+ *    reviews.length #=> 1
  *
+ *  See also Object#hash and Object#eql?
  */
 
 void
diff --git a/include/ruby/intern.h b/include/ruby/intern.h
index 927b536..9be68de 100644
--- a/include/ruby/intern.h
+++ b/include/ruby/intern.h
@@ -56,6 +56,7 @@ VALUE rb_ary_tmp_new(long);
 void rb_ary_free(VALUE);
 void rb_ary_modify(VALUE);
 VALUE rb_ary_freeze(VALUE);
+VALUE rb_ary_dup_of_p(VALUE, VALUE);
 VALUE rb_ary_aref(int, VALUE*, VALUE);
 VALUE rb_ary_subseq(VALUE, long, long);
 void rb_ary_store(VALUE, long, VALUE);
@@ -413,6 +414,7 @@ size_t ruby_stack_length(VALUE**);
 int rb_during_gc(void);
 void rb_gc_mark_locations(VALUE*, VALUE*);
 void rb_mark_tbl(struct st_table*);
+void rb_mark_sa_tbl(sa_table*);
 void rb_mark_set(struct st_table*);
 void rb_mark_hash(struct st_table*);
 void rb_gc_mark_maybe(VALUE);
@@ -440,6 +442,7 @@ VALUE rb_hash_lookup(VALUE, VALUE);
 VALUE rb_hash_lookup2(VALUE, VALUE, VALUE);
 VALUE rb_hash_fetch(VALUE, VALUE);
 VALUE rb_hash_aset(VALUE, VALUE, VALUE);
+VALUE rb_hash_clear(VALUE);
 VALUE rb_hash_delete_if(VALUE);
 VALUE rb_hash_delete(VALUE,VALUE);
 typedef VALUE rb_hash_update_func(VALUE newkey, VALUE oldkey, VALUE value);
@@ -843,7 +846,7 @@ VALUE rb_f_trace_var(int, VALUE*);
 VALUE rb_f_untrace_var(int, VALUE*);
 VALUE rb_f_global_variables(void);
 void rb_alias_variable(ID, ID);
-struct st_table* rb_generic_ivar_table(VALUE);
+sa_table* rb_generic_ivar_table(VALUE);
 void rb_copy_generic_ivar(VALUE,VALUE);
 void rb_mark_generic_ivar(VALUE);
 void rb_mark_generic_ivar_tbl(void);
diff --git a/include/ruby/ruby.h b/include/ruby/ruby.h
index 2f97b33..1c84e14 100644
--- a/include/ruby/ruby.h
+++ b/include/ruby/ruby.h
@@ -605,7 +605,7 @@ struct RObject {
 	struct {
 	    long numiv;
 	    VALUE *ivptr;
-            struct st_table *iv_index_tbl; /* shortcut for RCLASS_IV_INDEX_TBL(rb_obj_class(obj)) */
+            struct sa_table *iv_index_tbl; /* shortcut for RCLASS_IV_INDEX_TBL(rb_obj_class(obj)) */
 	} heap;
 	VALUE ary[ROBJECT_EMBED_LEN_MAX];
     } as;
@@ -626,12 +626,13 @@ struct RObject {
 
 /** @internal */
 typedef struct rb_classext_struct rb_classext_t;
+typedef struct rb_class_cache_struct rb_class_cache_t;
 
 struct RClass {
     struct RBasic basic;
+    VALUE super;
     rb_classext_t *ptr;
-    struct st_table *m_tbl;
-    struct st_table *iv_index_tbl;
+    rb_class_cache_t *cache;
 };
 #define RCLASS_SUPER(c) rb_class_get_superclass(c)
 #define RMODULE_IV_TBL(m) RCLASS_IV_TBL(m)
diff --git a/include/ruby/st.h b/include/ruby/st.h
index 50f2a75..aff94fc 100644
--- a/include/ruby/st.h
+++ b/include/ruby/st.h
@@ -36,7 +36,7 @@ typedef unsigned long st_data_t;
 #elif SIZEOF_LONG_LONG == SIZEOF_VOIDP
 typedef unsigned LONG_LONG st_data_t;
 #else
-# error ---->> st.c requires sizeof(void*) == sizeof(long) to be compiled. <<----
+# error ---->> st.c requires sizeof(void*) == sizeof(long) or sizeof(LONG_LONG) to be compiled. <<----
 #endif
 #define ST_DATA_T_DEFINED
 
@@ -74,6 +74,11 @@ struct st_hash_type {
 
 #define ST_INDEX_BITS (sizeof(st_index_t) * CHAR_BIT)
 
+typedef struct st_packed_entry {
+    st_index_t hash;
+    st_data_t key, val;
+} st_packed_entry;
+
 struct st_table {
     const struct st_hash_type *type;
     st_index_t num_bins;
@@ -91,8 +96,17 @@ struct st_table {
     __extension__
 #endif
     st_index_t num_entries : ST_INDEX_BITS - 1;
-    struct st_table_entry **bins;
-    struct st_table_entry *head, *tail;
+    union {
+	struct {
+	    struct st_table_entry **bins;
+	    struct st_table_entry *head, *tail;
+	} big;
+	struct {
+	    struct st_packed_entry *entries;
+	    st_index_t real_entries;
+	} packed;
+	st_packed_entry upacked;
+    } as;
 };
 
 #define st_is_member(table,key) st_lookup((table),(key),(st_data_t *)0)
@@ -114,6 +128,7 @@ int st_insert2(st_table *, st_data_t, st_data_t, st_data_t (*)(st_data_t));
 int st_lookup(st_table *, st_data_t, st_data_t *);
 int st_get_key(st_table *, st_data_t, st_data_t *);
 int st_foreach(st_table *, int (*)(ANYARGS), st_data_t);
+int st_foreach_check(st_table *, int (*)(ANYARGS), st_data_t, st_data_t);
 int st_reverse_foreach(st_table *, int (*)(ANYARGS), st_data_t);
 void st_add_direct(st_table *, st_data_t, st_data_t);
 void st_free_table(st_table *);
@@ -136,6 +151,51 @@ st_index_t st_hash_start(st_index_t h);
 #pragma GCC visibility pop
 #endif
 
+typedef unsigned int sa_index_t;
+#define SA_STOP     ST_STOP
+#define SA_CONTINUE ST_CONTINUE
+
+#define SA_EMPTY   0
+
+typedef struct sa_entry {
+    sa_index_t next;
+    sa_index_t key;
+    st_data_t value;
+} sa_entry;
+
+typedef struct sa_table {
+    sa_index_t num_bins;
+    sa_index_t num_entries;
+    sa_index_t free_pos;
+    sa_entry *entries;
+} sa_table;
+
+#define SA_EMPTY_TABLE {0, 0, 0, 0};
+void sa_init_table(sa_table *, sa_index_t);
+sa_table *sa_new_table();
+int  sa_insert(sa_table *, sa_index_t, st_data_t);
+int  sa_lookup(sa_table *, sa_index_t, st_data_t *);
+int  sa_delete(sa_table *, sa_index_t, st_data_t *);
+void sa_clear(sa_table *);
+void sa_clear_no_free(sa_table *);
+void sa_free_table(sa_table *);
+int  sa_foreach(sa_table *, int (*)(ANYARGS), st_data_t);
+size_t sa_memsize(const sa_table *);
+sa_table *sa_copy(sa_table*);
+void sa_copy_to(sa_table*, sa_table*);
+typedef int (*sa_iter_func)(sa_index_t key, st_data_t val, st_data_t arg);
+
+#define SA_FOREACH_START_I(table, entry) do { \
+    sa_table *T##entry = (table); \
+    sa_index_t K##entry; \
+    for(K##entry = 0; K##entry < T##entry->num_bins; K##entry++) { \
+	sa_entry *entry = T##entry->entries + K##entry; \
+	if (entry->next != SA_EMPTY) { \
+	    st_data_t value = entry->value
+#define SA_FOREACH_END() } } } while(0)
+
+#define SA_FOREACH_START(table) SA_FOREACH_START_I(table, entry)
+
 #if defined(__cplusplus)
 #if 0
 { /* satisfy cc-mode */
diff --git a/internal.h b/internal.h
index 59c9284..4af90b6 100644
--- a/internal.h
+++ b/internal.h
@@ -24,18 +24,24 @@ struct rb_deprecated_classext_struct {
 };
 
 struct rb_classext_struct {
-    VALUE super;
-    struct st_table *iv_tbl;
-    struct st_table *const_tbl;
+    sa_table m_tbl;
+    sa_table iv_tbl;
+    sa_table const_tbl;
+    sa_table iv_index_tbl;
+};
+
+struct rb_class_cache_struct {
+    VALUE method_cache_version;
+    sa_table m_cache_tbl;
 };
 
 #undef RCLASS_SUPER
 #define RCLASS_EXT(c) (RCLASS(c)->ptr)
-#define RCLASS_SUPER(c) (RCLASS_EXT(c)->super)
-#define RCLASS_IV_TBL(c) (RCLASS_EXT(c)->iv_tbl)
-#define RCLASS_CONST_TBL(c) (RCLASS_EXT(c)->const_tbl)
-#define RCLASS_M_TBL(c) (RCLASS(c)->m_tbl)
-#define RCLASS_IV_INDEX_TBL(c) (RCLASS(c)->iv_index_tbl)
+#define RCLASS_SUPER(c) (RCLASS(c)->super)
+#define RCLASS_IV_TBL(c) (&RCLASS_EXT(c)->iv_tbl)
+#define RCLASS_CONST_TBL(c) (&RCLASS_EXT(c)->const_tbl)
+#define RCLASS_M_TBL(c) (&RCLASS_EXT(c)->m_tbl)
+#define RCLASS_IV_INDEX_TBL(c) (&RCLASS_EXT(c)->iv_index_tbl)
 
 struct vtm; /* defined by timev.h */
 
@@ -94,6 +100,8 @@ VALUE rb_home_dir(const char *user, VALUE result);
 VALUE rb_realpath_internal(VALUE basedir, VALUE path, int strict);
 VALUE rb_file_expand_path_fast(VALUE, VALUE);
 VALUE rb_file_expand_path_internal(VALUE, VALUE, int, int, VALUE);
+VALUE rb_get_path_check_to_string(VALUE, int);
+VALUE rb_get_path_check_convert(VALUE, VALUE, int);
 void Init_File(void);
 
 #ifdef _WIN32
@@ -119,6 +127,7 @@ VALUE rb_iseq_clone(VALUE iseqval, VALUE newcbase);
 
 /* load.c */
 VALUE rb_get_load_path(void);
+VALUE rb_get_expanded_load_path(void);
 
 /* math.c */
 VALUE rb_math_atan2(VALUE, VALUE);
diff --git a/load.c b/load.c
index 163ec4c..68caebc 100644
--- a/load.c
+++ b/load.c
@@ -34,21 +34,120 @@ rb_get_load_path(void)
     return load_path;
 }
 
-VALUE
-rb_get_expanded_load_path(void)
+enum expand_type {
+    EXPAND_ALL,
+    EXPAND_RELATIVE,
+    EXPAND_HOME,
+    EXPAND_NON_CACHE
+};
+
+/* Construct expanded load path and store it to cache.
+   We rebuild load path partially if the cache is invalid.
+   We don't cache non string object and expand it every time. We ensure that
+   string objects in $LOAD_PATH are frozen.
+ */
+static void
+rb_construct_expanded_load_path(int type, int *has_relative, int *has_non_cache)
 {
-    VALUE load_path = rb_get_load_path();
+    rb_vm_t *vm = GET_VM();
+    VALUE load_path = vm->load_path;
+    VALUE expanded_load_path = vm->expanded_load_path;
     VALUE ary;
     long i;
+    int level = rb_safe_level();
 
     ary = rb_ary_new2(RARRAY_LEN(load_path));
     for (i = 0; i < RARRAY_LEN(load_path); ++i) {
-	VALUE path = rb_file_expand_path_fast(RARRAY_PTR(load_path)[i], Qnil);
-	rb_str_freeze(path);
-	rb_ary_push(ary, path);
+	VALUE path, as_str, expanded_path;
+	int is_string, non_cache;
+	char *as_cstr;
+	as_str = path = RARRAY_PTR(load_path)[i];
+	is_string = RB_TYPE_P(path, T_STRING) ? 1 : 0;
+	non_cache = !is_string ? 1 : 0;
+	as_str = rb_get_path_check_to_string(path, level);
+	as_cstr = RSTRING_PTR(as_str);
+
+	if (!non_cache) {
+	    if ((type == EXPAND_RELATIVE &&
+		    rb_is_absolute_path(as_cstr)) ||
+		(type == EXPAND_HOME &&
+		    (!as_cstr[0] || as_cstr[0] != '~')) ||
+		(type == EXPAND_NON_CACHE)) {
+		    /* Use cached expanded path. */
+		    rb_ary_push(ary, RARRAY_PTR(expanded_load_path)[i]);
+		    continue;
+	    }
+	}
+	if (!*has_relative && !rb_is_absolute_path(as_cstr))
+	    *has_relative = 1;
+	if (!*has_non_cache && non_cache)
+	    *has_non_cache = 1;
+	/* Freeze only string object. We expand other objects every time. */
+	if (is_string)
+	    rb_str_freeze(path);
+	as_str = rb_get_path_check_convert(path, as_str, level);
+	expanded_path = rb_file_expand_path_fast(as_str, Qnil);
+	rb_str_freeze(expanded_path);
+	rb_ary_push(ary, expanded_path);
     }
     rb_obj_freeze(ary);
-    return ary;
+    vm->expanded_load_path = ary;
+    rb_ary_replace(vm->load_path_snapshot, vm->load_path);
+}
+
+static VALUE
+load_path_getcwd(void)
+{
+    char *cwd = my_getcwd();
+    VALUE cwd_str = rb_filesystem_str_new_cstr(cwd);
+    xfree(cwd);
+    return cwd_str;
+}
+
+VALUE
+rb_get_expanded_load_path(void)
+{
+    rb_vm_t *vm = GET_VM();
+    const VALUE non_cache = Qtrue;
+
+    if (!rb_ary_dup_of_p(vm->load_path_snapshot, vm->load_path)) {
+	/* The load path was modified. Rebuild the expanded load path. */
+	int has_relative = 0, has_non_cache = 0;
+	rb_construct_expanded_load_path(EXPAND_ALL, &has_relative, &has_non_cache);
+	if (has_relative) {
+	    vm->load_path_check_cache = load_path_getcwd();
+	}
+	else if (has_non_cache) {
+	    /* Non string object. */
+	    vm->load_path_check_cache = non_cache;
+	}
+	else {
+	    vm->load_path_check_cache = 0;
+	}
+    }
+    else if (vm->load_path_check_cache == non_cache) {
+	int has_relative = 1, has_non_cache = 1;
+	/* Expand only non-cacheable objects. */
+	rb_construct_expanded_load_path(EXPAND_NON_CACHE,
+					&has_relative, &has_non_cache);
+    }
+    else if (vm->load_path_check_cache) {
+	int has_relative = 1, has_non_cache = 1;
+	VALUE cwd = load_path_getcwd();
+	if (!rb_str_equal(vm->load_path_check_cache, cwd)) {
+	    /* Current working directory or filesystem encoding was changed.
+	       Expand relative load path and non-cacheable objects again. */
+	    vm->load_path_check_cache = cwd;
+	    rb_construct_expanded_load_path(EXPAND_RELATIVE,
+					    &has_relative, &has_non_cache);
+	}
+	else {
+	    /* Expand only tilde (User HOME) and non-cacheable objects. */
+	    rb_construct_expanded_load_path(EXPAND_HOME,
+					    &has_relative, &has_non_cache);
+	}
+    }
+    return vm->expanded_load_path;
 }
 
 static VALUE
@@ -63,12 +162,121 @@ get_loaded_features(void)
     return GET_VM()->loaded_features;
 }
 
+static void
+reset_loaded_features_snapshot(void)
+{
+    rb_vm_t *vm = GET_VM();
+    rb_ary_replace(vm->loaded_features_snapshot, vm->loaded_features);
+}
+
+static VALUE
+get_loaded_features_index_raw(void)
+{
+    return GET_VM()->loaded_features_index;
+}
+
 static st_table *
 get_loading_table(void)
 {
     return GET_VM()->loading_table;
 }
 
+static void
+features_index_add_single(VALUE short_feature, VALUE offset)
+{
+    VALUE features_index, this_feature_index;
+    features_index = get_loaded_features_index_raw();
+    if ((this_feature_index = rb_hash_lookup(features_index, short_feature)) == Qnil) {
+	this_feature_index = rb_ary_new();
+	rb_hash_aset(features_index, short_feature, this_feature_index);
+    }
+    rb_ary_push(this_feature_index, offset);
+}
+
+/* Add to the loaded-features index all the required entries for
+   `feature`, located at `offset` in $LOADED_FEATURES.  We add an
+   index entry at each string `short_feature` for which
+     feature == "#{prefix}#{short_feature}#{e}"
+   where `e` is empty or matches %r{^\.[^./]*$}, and `prefix` is empty
+   or ends in '/'.  This maintains the invariant that `rb_feature_p()`
+   relies on for its fast lookup.
+*/
+static void
+features_index_add(VALUE feature, VALUE offset)
+{
+    VALUE short_feature;
+    const char *feature_str, *feature_end, *ext, *p;
+
+    feature_str = StringValuePtr(feature);
+    feature_end = feature_str + RSTRING_LEN(feature);
+
+    for (ext = feature_end; ext > feature_str; ext--)
+      if (*ext == '.' || *ext == '/')
+	break;
+    if (*ext != '.')
+      ext = NULL;
+    /* Now `ext` points to the only string matching %r{^\.[^./]*$} that is
+       at the end of `feature`, or is NULL if there is no such string. */
+
+    p = ext ? ext : feature_end;
+    while (1) {
+	p--;
+	while (p >= feature_str && *p != '/')
+	    p--;
+	if (p < feature_str)
+	    break;
+	/* Now *p == '/'.  We reach this point for every '/' in `feature`. */
+	short_feature = rb_str_substr(feature, p + 1 - feature_str, feature_end - p - 1);
+	features_index_add_single(short_feature, offset);
+	if (ext) {
+	    short_feature = rb_str_substr(feature, p + 1 - feature_str, ext - p - 1);
+	    features_index_add_single(short_feature, offset);
+	}
+    }
+    features_index_add_single(feature, offset);
+    if (ext) {
+	short_feature = rb_str_substr(feature, 0, ext - feature_str);
+	features_index_add_single(short_feature, offset);
+    }
+}
+
+static VALUE
+get_loaded_features_index(void)
+{
+    VALUE features;
+    int i;
+    rb_vm_t *vm = GET_VM();
+
+    if (!rb_ary_dup_of_p(vm->loaded_features_snapshot, vm->loaded_features)) {
+	/* The sharing was broken; something (other than us in rb_provide_feature())
+	   modified loaded_features.  Rebuild the index. */
+	rb_hash_clear(vm->loaded_features_index);
+	features = vm->loaded_features;
+	for (i = 0; i < RARRAY_LEN(features); i++) {
+	    VALUE entry, as_str;
+	    as_str = entry = rb_ary_entry(features, i);
+	    StringValue(as_str);
+	    if (as_str != entry)
+		rb_ary_store(features, i, as_str);
+	    rb_str_freeze(as_str);
+	    features_index_add(as_str, INT2FIX(i));
+	}
+	reset_loaded_features_snapshot();
+    }
+    return vm->loaded_features_index;
+}
+
+/* This searches `load_path` for a value such that
+     name == "#{load_path[i]}/#{feature}"
+   if `feature` is a suffix of `name`, or otherwise
+     name == "#{load_path[i]}/#{feature}#{ext}"
+   for an acceptable string `ext`.  It returns
+   `load_path[i].to_str` if found, else 0.
+
+   If type is 's', then `ext` is acceptable only if IS_DLEXT(ext);
+   if 'r', then only if IS_RBEXT(ext); otherwise `ext` may be absent
+   or have any value matching `%r{^\.[^./]*$}`.
+*/
 static VALUE
 loaded_feature_path(const char *name, long vlen, const char *feature, long len,
 		    int type, VALUE load_path)
@@ -88,23 +296,22 @@ loaded_feature_path(const char *name, long vlen, const char *feature, long len,
 	    return 0;
 	plen = e - name - len - 1;
     }
+    if (type == 's' && !IS_DLEXT(&name[plen+len+1])
+     || type == 'r' && !IS_RBEXT(&name[plen+len+1])
+     || name[plen] != '/') {
+       return 0;
+    }
+    /* Now name == "#{prefix}/#{feature}#{ext}" where ext is acceptable
+       (possibly empty) and prefix is some string of length plen. */
+
     for (i = 0; i < RARRAY_LEN(load_path); ++i) {
 	VALUE p = RARRAY_PTR(load_path)[i];
 	const char *s = StringValuePtr(p);
 	long n = RSTRING_LEN(p);
 
-	if (n != plen ) continue;
-	if (n && (strncmp(name, s, n) || name[n] != '/')) continue;
-	switch (type) {
-	  case 's':
-	    if (IS_DLEXT(&name[n+len+1])) return p;
-	    break;
-	  case 'r':
-	    if (IS_RBEXT(&name[n+len+1])) return p;
-	    break;
-	  default:
-	    return p;
-	}
+	if (n != plen) continue;
+	if (n && strncmp(name, s, n)) continue;
+	return p;
     }
     return 0;
 }
@@ -132,7 +339,7 @@ loaded_feature_path_i(st_data_t v, st_data_t b, st_data_t f)
 static int
 rb_feature_p(const char *feature, const char *ext, int rb, int expanded, const char **fn)
 {
-    VALUE v, features, p, load_path = 0;
+    VALUE features, features_index, feature_val, this_feature_index, v, p, load_path = 0;
     const char *f, *e;
     long i, len, elen, n;
     st_table *loading_tbl;
@@ -151,8 +358,39 @@ rb_feature_p(const char *feature, const char *ext, int rb, int expanded, const c
 	type = 0;
     }
     features = get_loaded_features();
-    for (i = 0; i < RARRAY_LEN(features); ++i) {
-	v = RARRAY_PTR(features)[i];
+    features_index = get_loaded_features_index();
+
+    feature_val = rb_str_new(feature, len);
+    this_feature_index = rb_hash_lookup(features_index, feature_val);
+    /* We search `features` for an entry such that either
+         "#{features[i]}" == "#{load_path[j]}/#{feature}#{e}"
+       for some j, or
+         "#{features[i]}" == "#{feature}#{e}"
+       Here `e` is an "allowed" extension -- either empty or one
+       of the extensions accepted by IS_RBEXT, IS_SOEXT, or
+       IS_DLEXT.  Further, if `ext && rb` then `IS_RBEXT(e)`,
+       and if `ext && !rb` then `IS_SOEXT(e) || IS_DLEXT(e)`.
+
+       If `expanded`, then only the latter form (without load_path[j])
+       is accepted.  Otherwise either form is accepted, *unless* `ext`
+       is false and an otherwise-matching entry of the first form is
+       preceded by an entry of the form
+         "#{features[i2]}" == "#{load_path[j2]}/#{feature}#{e2}"
+       where `e2` matches %r{^\.[^./]*$} but is not an allowed extension.
+       After a "distractor" entry of this form, only entries of the
+       form "#{feature}#{e}" are accepted.
+
+       In `rb_provide_feature()` and `get_loaded_features_index()` we
+       maintain an invariant that the array `this_feature_index` will
+       point to every entry in `features` which has the form
+         "#{prefix}#{feature}#{e}"
+       where `e` is empty or matches %r{^\.[^./]*$}, and `prefix` is empty
+       or ends in '/'.  This includes both match forms above, as well
+       as any distractors, so we may ignore all other entries in `features`.
+     */
+    for (i = 0; this_feature_index != Qnil && i < RARRAY_LEN(this_feature_index); i++) {
+	long index = FIX2LONG(rb_ary_entry(this_feature_index, i));
+	v = RARRAY_PTR(features)[index];
 	f = StringValuePtr(v);
 	if ((n = RSTRING_LEN(v)) < len) continue;
 	if (strncmp(f, feature, len) != 0) {
@@ -175,6 +413,7 @@ rb_feature_p(const char *feature, const char *ext, int rb, int expanded, const c
 	    return 'r';
 	}
     }
+
     loading_tbl = get_loading_table();
     if (loading_tbl) {
 	f = 0;
@@ -183,7 +422,7 @@ rb_feature_p(const char *feature, const char *ext, int rb, int expanded, const c
 	    fs.name = feature;
 	    fs.len = len;
 	    fs.type = type;
-	    fs.load_path = load_path ? load_path : rb_get_load_path();
+	    fs.load_path = load_path ? load_path : rb_get_expanded_load_path();
 	    fs.result = 0;
 	    st_foreach(loading_tbl, loaded_feature_path_i, (st_data_t)&fs);
 	    if ((f = fs.result) != 0) {
@@ -233,7 +472,7 @@ rb_feature_provided(const char *feature, const char **loading)
 
     if (*feature == '.' &&
 	(feature[1] == '/' || strncmp(feature+1, "./", 2) == 0)) {
-	fullpath = rb_file_expand_path_fast(rb_str_new2(feature), Qnil);
+	fullpath = rb_file_expand_path_fast(rb_get_path(rb_str_new2(feature)), Qnil);
 	feature = RSTRING_PTR(fullpath);
     }
     if (ext && !strchr(ext, '/')) {
@@ -254,11 +493,18 @@ rb_feature_provided(const char *feature, const char **loading)
 static void
 rb_provide_feature(VALUE feature)
 {
-    if (OBJ_FROZEN(get_loaded_features())) {
+    VALUE features;
+
+    features = get_loaded_features();
+    if (OBJ_FROZEN(features)) {
 	rb_raise(rb_eRuntimeError,
 		 "$LOADED_FEATURES is frozen; cannot append feature");
     }
-    rb_ary_push(get_loaded_features(), feature);
+    rb_str_freeze(feature);
+
+    rb_ary_push(features, feature);
+    features_index_add(feature, INT2FIX(RARRAY_LEN(features)-1));
+    reset_loaded_features_snapshot();
 }
 
 void
@@ -774,10 +1020,15 @@ Init_load()
     rb_alias_variable(rb_intern("$-I"), id_load_path);
     rb_alias_variable(rb_intern("$LOAD_PATH"), id_load_path);
     vm->load_path = rb_ary_new();
+    vm->expanded_load_path = rb_ary_new();
+    vm->load_path_snapshot = rb_ary_new();
+    vm->load_path_check_cache = 0;
 
     rb_define_virtual_variable("$\"", get_loaded_features, 0);
     rb_define_virtual_variable("$LOADED_FEATURES", get_loaded_features, 0);
     vm->loaded_features = rb_ary_new();
+    vm->loaded_features_snapshot = rb_ary_new();
+    vm->loaded_features_index = rb_hash_new();
 
     rb_define_global_function("load", rb_f_load, -1);
     rb_define_global_function("require", rb_f_require, 1);
diff --git a/marshal.c b/marshal.c
index 9a43cdb..a4a3551 100644
--- a/marshal.c
+++ b/marshal.c
@@ -506,7 +506,7 @@ w_uclass(VALUE obj, VALUE super, struct dump_arg *arg)
 }
 
 static int
-w_obj_each(ID id, VALUE value, struct dump_call_arg *arg)
+w_obj_each(sa_index_t id, VALUE value, struct dump_call_arg *arg)
 {
     if (id == rb_id_encoding()) return ST_CONTINUE;
     if (id == rb_intern("E")) return ST_CONTINUE;
@@ -553,13 +553,13 @@ w_encoding(VALUE obj, long num, struct dump_call_arg *arg)
 }
 
 static void
-w_ivar(VALUE obj, st_table *tbl, struct dump_call_arg *arg)
+w_ivar(VALUE obj, sa_table *tbl, struct dump_call_arg *arg)
 {
     long num = tbl ? tbl->num_entries : 0;
 
     w_encoding(obj, num, arg);
     if (tbl) {
-	st_foreach_safe(tbl, w_obj_each, (st_data_t)arg);
+	sa_foreach(tbl, w_obj_each, (st_data_t)arg);
     }
 }
 
@@ -586,7 +586,7 @@ static void
 w_object(VALUE obj, struct dump_arg *arg, int limit)
 {
     struct dump_call_arg c_arg;
-    st_table *ivtbl = 0;
+    sa_table *ivtbl = 0;
     st_data_t num;
     int hasiv = 0;
 #define has_ivars(obj, ivtbl) (((ivtbl) = rb_generic_ivar_table(obj)) != 0 || \
@@ -651,7 +651,7 @@ w_object(VALUE obj, struct dump_arg *arg, int limit)
 	}
 	if (rb_respond_to(obj, s_dump)) {
 	    VALUE v;
-            st_table *ivtbl2 = 0;
+            sa_table *ivtbl2 = 0;
             int hasiv2;
 
 	    v = rb_funcall(obj, s_dump, 1, INT2NUM(limit));
diff --git a/method.h b/method.h
index 9229896..2fecd57 100644
--- a/method.h
+++ b/method.h
@@ -100,6 +100,6 @@ int rb_method_entry_eq(const rb_method_entry_t *m1, const rb_method_entry_t *m2)
 void rb_mark_method_entry(const rb_method_entry_t *me);
 void rb_free_method_entry(rb_method_entry_t *me);
 void rb_sweep_method_entry(void *vm);
-void rb_free_m_table(st_table *tbl);
+void rb_free_m_table(sa_table *tbl);
 
 #endif /* METHOD_H */
diff --git a/object.c b/object.c
index f45e013..1352d01 100644
--- a/object.c
+++ b/object.c
@@ -229,17 +229,8 @@ init_copy(VALUE dest, VALUE obj)
         break;
       case T_CLASS:
       case T_MODULE:
-	if (RCLASS_IV_TBL(dest)) {
-	    st_free_table(RCLASS_IV_TBL(dest));
-	    RCLASS_IV_TBL(dest) = 0;
-	}
-	if (RCLASS_CONST_TBL(dest)) {
-	    rb_free_const_table(RCLASS_CONST_TBL(dest));
-	    RCLASS_CONST_TBL(dest) = 0;
-	}
-	if (RCLASS_IV_TBL(obj)) {
-	    RCLASS_IV_TBL(dest) = st_copy(RCLASS_IV_TBL(obj));
-	}
+        rb_free_const_table(RCLASS_CONST_TBL(dest));
+        sa_copy_to(RCLASS_IV_TBL(obj), RCLASS_IV_TBL(dest));
         break;
     }
 }
@@ -530,7 +521,7 @@ rb_obj_is_kind_of(VALUE obj, VALUE c)
     }
 
     while (cl) {
-	if (cl == c || RCLASS_M_TBL(cl) == RCLASS_M_TBL(c))
+	if (cl == c || RCLASS_EXT(cl) == RCLASS_EXT(c))
 	    return Qtrue;
 	cl = RCLASS_SUPER(cl);
     }
@@ -1355,13 +1346,13 @@ rb_class_inherited_p(VALUE mod, VALUE arg)
 	rb_raise(rb_eTypeError, "compared with non class/module");
     }
     while (mod) {
-	if (RCLASS_M_TBL(mod) == RCLASS_M_TBL(arg))
+	if (RCLASS_EXT(mod) == RCLASS_EXT(arg))
 	    return Qtrue;
 	mod = RCLASS_SUPER(mod);
     }
     /* not mod < arg; check if mod > arg */
     while (arg) {
-	if (RCLASS_M_TBL(arg) == RCLASS_M_TBL(start))
+	if (RCLASS_EXT(arg) == RCLASS_EXT(start))
 	    return Qfalse;
 	arg = RCLASS_SUPER(arg);
     }
diff --git a/pool_alloc.h b/pool_alloc.h
new file mode 100644
index 0000000..957708e
--- /dev/null
+++ b/pool_alloc.h
@@ -0,0 +1,11 @@
+#ifndef POOL_ALLOC_H
+#define POOL_ALLOC_H
+
+#define POOL_ALLOC_API
+#ifdef POOL_ALLOC_API
+void  ruby_xpool_free(void *ptr);
+void *ruby_xpool_malloc_6p();
+void *ruby_xpool_malloc_11p();
+#endif
+
+#endif
diff --git a/pool_alloc.inc.h b/pool_alloc.inc.h
new file mode 100644
index 0000000..a7879ab
--- /dev/null
+++ b/pool_alloc.inc.h
@@ -0,0 +1,156 @@
+/*
+ * this is generic pool allocator
+ * you should define following macroses:
+ * ITEM_NAME - unique identifier, which allows to hold functions in a namespace
+ * ITEM_TYPEDEF(name) - passed to typedef to localize item type
+ * free_entry - desired name of function for free entry
+ * alloc_entry - defired name of function for allocate entry
+ */
+
+#if POOL_ALLOC_PART == 1
+#ifdef HEAP_ALIGN_LOG
+#define DEFAULT_POOL_SIZE (1 << HEAP_ALIGN_LOG)
+#else
+#define DEFAULT_POOL_SIZE (sizeof(void*) * 2048)
+#endif
+typedef unsigned int pool_holder_counter;
+
+typedef struct pool_entry_list pool_entry_list;
+typedef struct pool_holder pool_holder;
+
+typedef struct pool_header {
+    pool_holder         *first;
+    pool_holder         *_black_magick;
+    pool_holder_counter  size; // size of entry in sizeof(void*) items
+    pool_holder_counter  total; // size of entry in sizeof(void*) items
+} pool_header;
+
+struct pool_holder {
+    pool_holder_counter free, total;
+    pool_header  *header;
+    void               *freep;
+    pool_holder        *fore, *back;
+    void *data[1];
+};
+#define POOL_DATA_SIZE(pool_size) (((pool_size) - sizeof(void*) * 6 - offsetof(pool_holder, data)) / sizeof(void*))
+#define POOL_ENTRY_SIZE(item_type) ((sizeof(item_type) - 1) / sizeof(void*) + 1)
+#define POOL_HOLDER_COUNT(pool_size, item_type) (POOL_DATA_SIZE(pool_size)/POOL_ENTRY_SIZE(item_type))
+#define INIT_POOL(item_type) {NULL, NULL, POOL_ENTRY_SIZE(item_type), POOL_HOLDER_COUNT(DEFAULT_POOL_SIZE, item_type)}
+
+#elif POOL_ALLOC_PART == 2
+static pool_holder *
+pool_holder_alloc(pool_header *header)
+{
+    pool_holder *holder;
+    pool_holder_counter i, size, count;
+    register void **ptr;
+
+    size_t sz = offsetof(pool_holder, data) +
+	    header->size * header->total * sizeof(void*);
+#define objspace (&rb_objspace)
+    vm_malloc_prepare(objspace, DEFAULT_POOL_SIZE);
+    if (header->first != NULL) return header->first;
+    TRY_WITH_GC(holder = (pool_holder*) aligned_malloc(DEFAULT_POOL_SIZE, sz));
+    malloc_increase += DEFAULT_POOL_SIZE;
+#if CALC_EXACT_MALLOC_SIZE
+    objspace->malloc_params.allocated_size += DEFAULT_POOL_SIZE;
+    objspace->malloc_params.allocations++;
+#endif
+#undef objspace
+
+    size = header->size;
+    count = header->total;
+    holder->free = count;
+    holder->total = count;
+    holder->header = header;
+    holder->fore = NULL;
+    holder->back = NULL;
+    holder->freep = &holder->data;
+    ptr = holder->data;
+    for(i = count - 1; i; i-- ) {
+	ptr = *ptr = ptr + size;
+    }
+    *ptr = NULL;
+    header->first = holder;
+    return holder;
+}
+
+static inline void
+pool_holder_unchaing(pool_header *header, pool_holder *holder)
+{
+    register pool_holder *fore = holder->fore, *back = holder->back;
+    holder->fore = NULL;
+    holder->back = NULL;
+    if (fore != NULL)  fore->back     = back;
+    else               header->_black_magick = back;
+    if (back != NULL)  back->fore     = fore;
+    else               header->first = fore;
+}
+
+static inline pool_holder *
+entry_holder(void **entry)
+{
+    return (pool_holder*)(((uintptr_t)entry) & ~(DEFAULT_POOL_SIZE - 1));
+}
+
+static inline void
+pool_free_entry(void **entry)
+{
+    pool_holder *holder = entry_holder(entry);
+    pool_header *header = holder->header;
+
+    if (holder->free++ == 0) {
+	register pool_holder *first = header->first;
+	if (first == NULL) {
+	    header->first = holder;
+	} else {
+	    holder->back = first;
+	    holder->fore = first->fore;
+	    first->fore = holder;
+	    if (holder->fore)
+		holder->fore->back = holder;
+	    else
+		header->_black_magick = holder;
+	}
+    } else if (holder->free == holder->total && header->first != holder ) {
+	pool_holder_unchaing(header, holder);
+	aligned_free(holder);
+#if CALC_EXACT_MALLOC_SIZE
+	rb_objspace.malloc_params.allocated_size -= DEFAULT_POOL_SIZE;
+	rb_objspace.malloc_params.allocations--;
+#endif
+	return;
+    }
+
+    *entry = holder->freep;
+    holder->freep = entry;
+}
+
+static inline void*
+pool_alloc_entry(pool_header *header)
+{
+    pool_holder *holder = header->first;
+    void **result;
+    if (holder == NULL) {
+	holder = pool_holder_alloc(header);
+    }
+
+    result = holder->freep;
+    holder->freep = *result;
+
+    if (--holder->free == 0) {
+	pool_holder_unchaing(header, holder);
+    }
+
+    return result;
+}
+
+static void
+pool_finalize_header(pool_header *header)
+{
+    if (header->first) {
+        aligned_free(header->first);
+        header->first = NULL;
+    }
+}
+#endif
diff --git a/ruby.c b/ruby.c
index 3ddd96c..7ffc78e 100644
--- a/ruby.c
+++ b/ruby.c
@@ -1366,7 +1366,8 @@ process_options(int argc, char **argv, struct cmdline_options *opt)
 	long i;
 	VALUE load_path = GET_VM()->load_path;
 	for (i = 0; i < RARRAY_LEN(load_path); ++i) {
-	    rb_enc_associate(RARRAY_PTR(load_path)[i], lenc);
+	    RARRAY_PTR(load_path)[i] =
+		rb_enc_associate(rb_str_dup(RARRAY_PTR(load_path)[i]), lenc);
 	}
     }
     if (!(opt->disable & DISABLE_BIT(gems))) {
diff --git a/sp_ar.c b/sp_ar.c
new file mode 100644
index 0000000..2ed69bf
--- /dev/null
+++ b/sp_ar.c
@@ -0,0 +1,374 @@
+/*
+ * sparse array lib
+ * inspired by Lua table
+ * written by Sokolov Yura aka funny_falcon
+ */
+#ifdef NOT_RUBY
+#include "regint.h"
+#include "st.h"
+#else
+#include "ruby/ruby.h"
+#endif
+
+#include <stdio.h>
+#ifdef HAVE_STDLIB_H
+#include <stdlib.h>
+#endif
+#include <string.h>
+
+#ifdef RUBY
+#define malloc xmalloc
+#define calloc xcalloc
+#define realloc xrealloc
+#define free   xfree
+#endif
+
+#define sa_table_alloc()          (sa_table*)malloc(sizeof(sa_table))
+#define sa_table_xalloc()         (sa_table*)calloc(1, sizeof(sa_table))
+#define sa_table_dealloc(table)   free(table)
+#define sa_entry_alloc(n)         (sa_entry*)calloc((n), sizeof(sa_entry))
+#define sa_entry_dealloc(entries) free(entries)
+
+#define SA_LAST   1
+#define SA_OFFSET 2
+
+#define SA_MIN_SIZE 4
+
+void
+sa_init_table(register sa_table *table, sa_index_t num_bins)
+{
+    if (num_bins) {
+        table->num_entries = 0;
+        table->entries = sa_entry_alloc(num_bins);
+        table->num_bins = num_bins;
+        table->free_pos = num_bins;
+    }
+    else {
+        memset(table, 0, sizeof(sa_table));
+    }
+}
+
+sa_table*
+sa_new_table()
+{
+    sa_table* table = sa_table_alloc();
+    sa_init_table(table, 0);
+    return table;
+}
+
+static inline sa_index_t
+calc_pos(register sa_table* table, sa_index_t key)
+{
+    /* this formula is empirical */
+    /* it has no good avalance, but works well in our case */
+    key ^= key >> 16;
+    key *= 0x445229;
+    return (key + (key >> 16)) % table->num_bins;
+}
+
+static void
+fix_empty(register sa_table* table)
+{
+    while(--table->free_pos &&
+            table->entries[table->free_pos-1].next != SA_EMPTY);
+}
+
+#define FLOOR_TO_4 ((~((sa_index_t)0)) << 2)
+static sa_index_t
+find_empty(register sa_table* table, register sa_index_t pos)
+{
+    sa_index_t new_pos = table->free_pos-1;
+    sa_entry *entry;
+    pos &= FLOOR_TO_4;
+    entry = table->entries+pos;
+
+    if (entry->next == SA_EMPTY) { new_pos = pos; goto check; }
+    pos++; entry++;
+    if (entry->next == SA_EMPTY) { new_pos = pos; goto check; }
+    pos++; entry++;
+    if (entry->next == SA_EMPTY) { new_pos = pos; goto check; }
+    pos++; entry++;
+    if (entry->next == SA_EMPTY) { new_pos = pos; goto check; }
+
+check:
+    if (new_pos+1 == table->free_pos) fix_empty(table);
+    return new_pos;
+}
+
+static void resize(register sa_table* table);
+static int insert_into_chain(register sa_table*, register sa_index_t, st_data_t, sa_index_t pos);
+static int insert_into_main(register sa_table*, sa_index_t, st_data_t, sa_index_t pos, sa_index_t prev_pos);
+
+int
+sa_insert(register sa_table* table, register sa_index_t key, st_data_t value)
+{
+    sa_index_t pos, main_pos;
+    register sa_entry *entry;
+
+    if (table->num_bins == 0) {
+        sa_init_table(table, SA_MIN_SIZE);
+    }
+
+    pos = calc_pos(table, key);
+    entry = table->entries + pos;
+
+    if (entry->next == SA_EMPTY) {
+        entry->next = SA_LAST;
+        entry->key = key;
+        entry->value = value;
+        table->num_entries++;
+        if (pos+1 == table->free_pos) fix_empty(table);
+        return 0;
+    }
+
+    if (entry->key == key) {
+        entry->value = value;
+        return 1;
+    }
+
+    if (table->num_entries + (table->num_entries >> 2) > table->num_bins) {
+        resize(table);
+        return sa_insert(table, key, value);
+    }
+
+    main_pos = calc_pos(table, entry->key);
+    if (main_pos == pos) {
+        return insert_into_chain(table, key, value, pos);
+    }
+    else {
+        if (!table->free_pos) {
+            resize(table);
+            return sa_insert(table, key, value);
+        }
+        return insert_into_main(table, key, value, pos, main_pos);
+    }
+}
+
+static int
+insert_into_chain(register sa_table* table, register sa_index_t key, st_data_t value, sa_index_t pos)
+{
+    sa_entry *entry = table->entries + pos, *new_entry;
+    sa_index_t new_pos;
+
+    while (entry->next != SA_LAST) {
+        pos = entry->next - SA_OFFSET;
+        entry = table->entries + pos;
+        if (entry->key == key) {
+            entry->value = value;
+            return 1;
+        }
+    }
+
+    if (!table->free_pos) {
+        resize(table);
+        return sa_insert(table, key, value);
+    }
+
+    new_pos = find_empty(table, pos);
+    new_entry = table->entries + new_pos;
+    entry->next = new_pos + SA_OFFSET;
+
+    new_entry->next = SA_LAST;
+    new_entry->key = key;
+    new_entry->value = value;
+    table->num_entries++;
+    return 0;
+}
+
+static int
+insert_into_main(register sa_table* table, sa_index_t key, st_data_t value, sa_index_t pos, sa_index_t prev_pos)
+{
+    sa_entry *entry = table->entries + pos;
+    sa_index_t new_pos = find_empty(table, pos);
+    sa_entry *new_entry = table->entries + new_pos;
+    sa_index_t npos;
+
+    *new_entry = *entry;
+
+    while((npos = table->entries[prev_pos].next - SA_OFFSET) != pos) {
+        prev_pos = npos;
+    }
+    table->entries[prev_pos].next = new_pos + SA_OFFSET;
+
+    entry->next = SA_LAST;
+    entry->key = key;
+    entry->value = value;
+    table->num_entries++;
+    return 0;
+}
+
+static sa_index_t
+new_size(sa_index_t num_entries)
+{
+    sa_index_t msb = num_entries;
+    msb |= msb >> 1;
+    msb |= msb >> 2;
+    msb |= msb >> 4;
+    msb |= msb >> 8;
+    msb |= msb >> 16;
+    msb = ((msb >> 4) + 1) << 3;
+    return (num_entries & (msb | (msb >> 1))) + (msb >> 1);
+}
+
+static void
+resize(register sa_table *table)
+{
+    sa_table tmp_table;
+    sa_entry *entry;
+    sa_index_t i;
+
+    if (table->num_entries == 0) {
+        sa_entry_dealloc(table->entries);
+        memset(table, 0, sizeof(sa_table));
+        return;
+    }
+
+    sa_init_table(&tmp_table, new_size(table->num_entries + (table->num_entries >> 2)));
+    entry = table->entries;
+
+    for(i = 0; i < table->num_bins; i++, entry++) {
+        if (entry->next != SA_EMPTY) {
+            sa_insert(&tmp_table, entry->key, entry->value);
+        }
+    }
+    sa_entry_dealloc(table->entries);
+    *table = tmp_table;
+}
+
+int
+sa_lookup(register sa_table *table, register sa_index_t key, st_data_t *value)
+{
+    register sa_entry *entry;
+
+    if (table->num_entries == 0) return 0;
+
+    entry = table->entries + calc_pos(table, key);
+    if (entry->next == SA_EMPTY) return 0;
+
+    if (entry->key == key) goto found;
+    if (entry->next == SA_LAST) return 0;
+
+    entry = table->entries + (entry->next - SA_OFFSET);
+    if (entry->key == key) goto found;
+
+    while(entry->next != SA_LAST) {
+        entry = table->entries + (entry->next - SA_OFFSET);
+        if (entry->key == key) goto found;
+    }
+    return 0;
+found:
+    if (value) *value = entry->value;
+    return 1;
+}
+
+void
+sa_clear(sa_table *table)
+{
+    sa_entry_dealloc(table->entries);
+    memset(table, 0, sizeof(sa_table));
+}
+
+void
+sa_clear_no_free(sa_table *table)
+{
+    memset(table->entries, 0, sizeof(sa_entry) * table->num_bins);
+    table->num_entries = 0;
+    table->free_pos = table->num_bins;
+}
+
+void
+sa_free_table(sa_table *table)
+{
+    sa_entry_dealloc(table->entries);
+    sa_table_dealloc(table);
+}
+
+int
+sa_delete(sa_table *table, sa_index_t key, st_data_t *value)
+{
+    sa_index_t pos, prev_pos = ~0;
+    sa_entry *entry;
+
+    if (table->num_entries == 0) goto not_found;
+
+    pos = calc_pos(table, key);
+    entry = table->entries + pos;
+
+    if (entry->next == SA_EMPTY) goto not_found;
+
+    do {
+        if (entry->key == key) {
+            if (value) *value = entry->value;
+            if (entry->next != SA_LAST) {
+                sa_index_t npos = entry->next - SA_OFFSET;
+                *entry = table->entries[npos];
+                memset(table->entries + npos, 0, sizeof(sa_entry));
+            }
+            else {
+                memset(table->entries + pos, 0, sizeof(sa_entry));
+                if (~prev_pos) {
+                    table->entries[prev_pos].next = SA_LAST;
+                }
+            }
+            table->num_entries--;
+            if (table->num_entries < table->num_bins / 4) {
+                resize(table);
+            }
+            return 1;
+        }
+        if (entry->next == SA_LAST) break;
+        prev_pos = pos;
+        pos = entry->next - SA_OFFSET;
+        entry = table->entries + pos;
+    } while(1);
+
+not_found:
+    if (value) *value = 0;
+    return 0;
+}
+
+int
+sa_foreach(register sa_table *table, int (*func)(), st_data_t arg)
+{
+    sa_index_t i;
+    if (table->num_bins == 0) {
+        return 0;
+    }
+    for(i = 0; i < table->num_bins ; i++) {
+	if (table->entries[i].next != SA_EMPTY) {
+	    sa_index_t key = table->entries[i].key;
+	    st_data_t val = table->entries[i].value;
+	    if ((*func)(key, val, arg) == SA_STOP) break;
+	}
+    }
+    return 0;
+}
+
+size_t
+sa_memsize(const sa_table *table)
+{
+    return sizeof(sa_table) + table->num_bins * sizeof(sa_entry);
+}
+
+sa_table*
+sa_copy(sa_table *table)
+{
+    sa_table *new_table = sa_table_alloc();
+    *new_table = *table;
+    if (table->num_bins) {
+        new_table->entries = sa_entry_alloc(table->num_bins);
+        memcpy(new_table->entries, table->entries, table->num_bins*sizeof(sa_entry));
+    }
+    return new_table;
+}
+
+void
+sa_copy_to(sa_table *from, sa_table *to)
+{
+    sa_entry_dealloc(to->entries);
+    *to = *from;
+    if (to->num_bins) {
+	to->entries = sa_entry_alloc(to->num_bins);
+	memcpy(to->entries, from->entries, from->num_bins*sizeof(sa_entry));
+    }
+}
diff --git a/st.c b/st.c
index fda5784..20ec427 100644
--- a/st.c
+++ b/st.c
@@ -7,6 +7,7 @@
 #include "st.h"
 #else
 #include "ruby/ruby.h"
+#include "pool_alloc.h"
 #endif
 
 #include <stdio.h>
@@ -25,8 +26,17 @@ struct st_table_entry {
     st_table_entry *fore, *back;
 };
 
-#define ST_DEFAULT_MAX_DENSITY 5
+#define STATIC_ASSERT(name, expr) typedef int static_assert_##name##_check[(expr) ? 1 : -1];
+
+#define ST_DEFAULT_MAX_DENSITY 2
 #define ST_DEFAULT_INIT_TABLE_SIZE 11
+#define ST_DEFAULT_SECOND_TABLE_SIZE 19
+#define ST_DEFAULT_PACKED_TABLE_SIZE 19
+#define PACKED_UNIT (int)(sizeof(st_packed_entry) / sizeof(st_table_entry*))
+#define MAX_PACKED_HASH (int)(ST_DEFAULT_PACKED_TABLE_SIZE * sizeof(st_table_entry*) / sizeof(st_packed_entry))
+
+STATIC_ASSERT(st_packed_entry, sizeof(st_packed_entry) == sizeof(st_table_entry*[PACKED_UNIT]))
+STATIC_ASSERT(st_packed_bins, sizeof(st_packed_entry[MAX_PACKED_HASH]) <= sizeof(st_table_entry*[ST_DEFAULT_PACKED_TABLE_SIZE]))
 
     /*
      * DEFAULT_MAX_DENSITY is the default for the largest we allow the
@@ -38,7 +48,8 @@ struct st_table_entry {
      *
      */
 
-static const struct st_hash_type type_numhash = {
+#define type_numhash st_hashtype_num
+const struct st_hash_type st_hashtype_num = {
     st_numcmp,
     st_numhash,
 };
@@ -61,20 +72,128 @@ static void rehash(st_table *);
 #ifdef RUBY
 #define malloc xmalloc
 #define calloc xcalloc
+#define realloc xrealloc
 #define free(x) xfree(x)
 #endif
 
 #define numberof(array) (int)(sizeof(array) / sizeof((array)[0]))
 
-#define alloc(type) (type*)malloc((size_t)sizeof(type))
-#define Calloc(n,s) (char*)calloc((n),(s))
-
 #define EQUAL(table,x,y) ((x)==(y) || (*(table)->type->compare)((x),(y)) == 0)
 
-/* remove cast to unsigned int in the future */
-#define do_hash(key,table) (unsigned int)(st_index_t)(*(table)->type->hash)((key))
+#define do_hash(key,table) (st_index_t)(*(table)->type->hash)((key))
 #define do_hash_bin(key,table) (do_hash((key), (table))%(table)->num_bins)
 
+/* preparation for possible allocation improvements */
+#ifdef POOL_ALLOC_API
+#define st_alloc_entry() (st_table_entry *)ruby_xpool_malloc_6p()
+#define st_free_entry(entry) ruby_xpool_free(entry)
+#define st_alloc_table() (st_table *)ruby_xpool_malloc_6p()
+#define st_dealloc_table(table) ruby_xpool_free(table)
+static inline st_table_entry **
+st_alloc_bins(st_index_t size)
+{
+    st_table_entry **result;
+    if (size == 11) {
+        result = (st_table_entry **) ruby_xpool_malloc_11p();
+        memset(result, 0, 11 * sizeof(st_table_entry *));
+    }
+    else
+        result = (st_table_entry **) ruby_xcalloc(size, sizeof(st_table_entry*));
+    return result;
+}
+static inline void
+st_free_bins(st_table_entry **bins, st_index_t size)
+{
+    if (size == 11)
+	ruby_xpool_free(bins);
+    else
+	ruby_xfree(bins);
+}
+static inline st_table_entry**
+st_realloc_bins(st_table_entry **bins, st_index_t newsize, st_index_t oldsize)
+{
+    st_table_entry **new_bins = st_alloc_bins(newsize);
+    st_free_bins(bins, oldsize);
+    return new_bins;
+}
+#else
+#define st_alloc_entry() (st_table_entry *)malloc(sizeof(st_table_entry))
+#define st_free_entry(entry) free(entry)
+#define st_alloc_table() (st_table *)malloc(sizeof(st_table))
+#define st_dealloc_table(table) free(table)
+#define st_alloc_bins(size) (st_table_entry **)calloc(size, sizeof(st_table_entry *))
+#define st_free_bins(bins, size) free(bins)
+static inline st_table_entry**
+st_realloc_bins(st_table_entry **bins, st_index_t newsize, st_index_t oldsize)
+{
+    bins = (st_table_entry **)realloc(bins, newsize * sizeof(st_table_entry *));
+    MEMZERO(bins, st_table_entry*, newsize);
+    return bins;
+}
+#endif
+
+/* Shortage */
+#define bins as.big.bins
+#define head as.big.head
+#define tail as.big.tail
+#define real_entries as.packed.real_entries
+
+/* preparation for possible packing improvements */
+#define PACKED_BINS(table) ((table)->as.packed.entries)
+#define PACKED_ENT(table, i) PACKED_BINS(table)[i]
+#define PKEY(table, i) PACKED_ENT((table), (i)).key
+#define PVAL(table, i) PACKED_ENT((table), (i)).val
+#define PHASH(table, i) PACKED_ENT((table), (i)).hash
+#define PKEY_SET(table, i, v) (PKEY((table), (i)) = (v))
+#define PVAL_SET(table, i, v) (PVAL((table), (i)) = (v))
+#define PHASH_SET(table, i, v) (PHASH((table), (i)) = (v))
+
+/* this function depends much on packed layout, so that it placed here */
+static inline void
+remove_packed_entry(st_table *table, st_index_t i)
+{
+    table->real_entries--;
+    table->num_entries--;
+    if (i < table->real_entries) {
+	MEMMOVE(&PACKED_ENT(table, i), &PACKED_ENT(table, i+1),
+		st_packed_entry, table->real_entries - i);
+    }
+}
+
+static inline void
+remove_safe_packed_entry(st_table *table, st_index_t i, st_data_t never)
+{
+    table->num_entries--;
+    PKEY_SET(table, i, never);
+    PVAL_SET(table, i, never);
+    PHASH_SET(table, i, 0);
+}
+
+/* ultrapacking */
+#define real_upacked num_bins
+#define MAX_UPACKED_HASH 1
+#define ULTRAPACKED(table) ((table)->real_upacked <= 1)
+#define UPACKED_ENT(table) ((table)->as.upacked)
+#define UPKEY(table) UPACKED_ENT(table).key
+#define UPVAL(table) UPACKED_ENT(table).val
+#define UPHASH(table) UPACKED_ENT(table).hash
+#define UPKEY_SET(table, v) (UPACKED_ENT(table).key = (v))
+#define UPVAL_SET(table, v) (UPACKED_ENT(table).val = (v))
+#define UPHASH_SET(table, v) (UPACKED_ENT(table).hash = (v))
+static inline void
+remove_upacked_entry(st_table *table)
+{
+    table->real_upacked = table->num_entries = 0;
+}
+
+static inline void
+remove_safe_upacked_entry(st_table *table, st_data_t never)
+{
+    table->num_entries = 0;
+    UPKEY_SET(table, never);
+    UPVAL_SET(table, never);
+    UPHASH_SET(table, 0);
+}
 /*
  * MINSIZE is the minimum size of a dictionary.
  */
@@ -85,8 +204,8 @@ static void rehash(st_table *);
 Table of prime numbers 2^n+a, 2<=n<=30.
 */
 static const unsigned int primes[] = {
-	8 + 3,
-	16 + 3,
+	ST_DEFAULT_INIT_TABLE_SIZE,
+	ST_DEFAULT_SECOND_TABLE_SIZE,
 	32 + 5,
 	64 + 3,
 	128 + 3,
@@ -161,8 +280,6 @@ stat_col(void)
 }
 #endif
 
-#define MAX_PACKED_NUMHASH (ST_DEFAULT_INIT_TABLE_SIZE/2)
-
 st_table*
 st_init_table_with_size(const struct st_hash_type *type, st_index_t size)
 {
@@ -181,14 +298,19 @@ st_init_table_with_size(const struct st_hash_type *type, st_index_t size)
     }
 #endif
 
-    size = new_size(size);	/* round up to prime number */
 
-    tbl = alloc(st_table);
+    tbl = st_alloc_table();
     tbl->type = type;
     tbl->num_entries = 0;
-    tbl->entries_packed = type == &type_numhash && size/2 <= MAX_PACKED_NUMHASH;
+    tbl->entries_packed = size <= MAX_PACKED_HASH;
+    if (tbl->entries_packed) {
+	size = size <= MAX_UPACKED_HASH ? 0 : ST_DEFAULT_PACKED_TABLE_SIZE;
+    }
+    else {
+	size = new_size(size);	/* round up to prime number */
+    }
     tbl->num_bins = size;
-    tbl->bins = (st_table_entry **)Calloc(size, sizeof(st_table_entry*));
+    tbl->bins = size ? st_alloc_bins(size) : 0;
     tbl->head = 0;
     tbl->tail = 0;
 
@@ -243,17 +365,23 @@ st_clear(st_table *table)
     register st_table_entry *ptr, *next;
     st_index_t i;
 
+    if (ULTRAPACKED(table)) {
+	remove_upacked_entry(table);
+	return;
+    }
+
     if (table->entries_packed) {
         table->num_entries = 0;
+        table->real_entries = 0;
         return;
     }
 
-    for(i = 0; i < table->num_bins; i++) {
+    for (i = 0; i < table->num_bins; i++) {
 	ptr = table->bins[i];
 	table->bins[i] = 0;
 	while (ptr != 0) {
 	    next = ptr->next;
-	    free(ptr);
+	    st_free_entry(ptr);
 	    ptr = next;
 	}
     }
@@ -266,14 +394,19 @@ void
 st_free_table(st_table *table)
 {
     st_clear(table);
-    free(table->bins);
-    free(table);
+    if (!ULTRAPACKED(table)) {
+	st_free_bins(table->bins, table->num_bins);
+    }
+    st_dealloc_table(table);
 }
 
 size_t
 st_memsize(const st_table *table)
 {
-    if (table->entries_packed) {
+    if (ULTRAPACKED(table)) {
+	return sizeof(st_table);
+    }
+    else if (table->entries_packed) {
 	return table->num_bins * sizeof (void *) + sizeof(st_table);
     }
     else {
@@ -306,46 +439,77 @@ count_collision(const struct st_hash_type *type)
 #define FOUND_ENTRY
 #endif
 
-#define FIND_ENTRY(table, ptr, hash_val, bin_pos) do {\
-    (bin_pos) = (hash_val)%(table)->num_bins;\
-    (ptr) = (table)->bins[(bin_pos)];\
-    FOUND_ENTRY;\
-    if (PTR_NOT_EQUAL((table), (ptr), (hash_val), key)) {\
-	COLLISION;\
-	while (PTR_NOT_EQUAL((table), (ptr)->next, (hash_val), key)) {\
-	    (ptr) = (ptr)->next;\
-	}\
-	(ptr) = (ptr)->next;\
-    }\
-} while (0)
+#define FIND_ENTRY(table, ptr, hash_val, bin_pos) \
+    ((ptr) = find_entry((table), key, (hash_val), ((bin_pos) = (hash_val)%(table)->num_bins)))
+
+static st_table_entry *
+find_entry(st_table *table, st_data_t key, st_index_t hash_val, st_index_t bin_pos)
+{
+    register st_table_entry *ptr = table->bins[bin_pos];
+    FOUND_ENTRY;
+    if (PTR_NOT_EQUAL(table, ptr, hash_val, key)) {
+	COLLISION;
+	while (PTR_NOT_EQUAL(table, ptr->next, hash_val, key)) {
+	    ptr = ptr->next;
+	}
+	ptr = ptr->next;
+    }
+    return ptr;
+}
+
+static inline st_index_t
+find_packed_index(st_table *table, st_index_t hash_val, st_data_t key)
+{
+    st_index_t i = 0;
+    while (i < table->real_entries &&
+	   (PHASH(table, i) != hash_val || !EQUAL(table, key, PKEY(table, i)))) {
+	i++;
+    }
+    return i;
+}
+
+static inline int
+check_upacked(st_table *table, st_index_t hash_val, st_data_t key)
+{
+    return table->num_entries &&
+	UPHASH(table) == hash_val &&
+	EQUAL(table, key, UPKEY(table));
+}
 
 #define collision_check 0
 
 int
 st_lookup(st_table *table, register st_data_t key, st_data_t *value)
 {
-    st_index_t hash_val, bin_pos;
+    st_index_t hash_val;
     register st_table_entry *ptr;
 
+    hash_val = do_hash(key, table);
+
+    if (ULTRAPACKED(table)) {
+	if (check_upacked(table, hash_val, key)) {
+	    if (value != 0) *value = UPVAL(table);
+	    return 1;
+	}
+	return 0;
+    }
+
     if (table->entries_packed) {
-        st_index_t i;
-        for (i = 0; i < table->num_entries; i++) {
-            if ((st_data_t)table->bins[i*2] == key) {
-                if (value !=0) *value = (st_data_t)table->bins[i*2+1];
-                return 1;
-            }
-        }
+	st_index_t i = find_packed_index(table, hash_val, key);
+	if (i < table->real_entries) {
+	    if (value != 0) *value = PVAL(table, i);
+	    return 1;
+	}
         return 0;
     }
 
-    hash_val = do_hash(key, table);
-    FIND_ENTRY(table, ptr, hash_val, bin_pos);
+    ptr = find_entry(table, key, hash_val, hash_val % table->num_bins);
 
     if (ptr == 0) {
 	return 0;
     }
     else {
-	if (value != 0)  *value = ptr->record;
+	if (value != 0) *value = ptr->record;
 	return 1;
     }
 }
@@ -353,22 +517,29 @@ st_lookup(st_table *table, register st_data_t key, st_data_t *value)
 int
 st_get_key(st_table *table, register st_data_t key, st_data_t *result)
 {
-    st_index_t hash_val, bin_pos;
+    st_index_t hash_val;
     register st_table_entry *ptr;
 
+    hash_val = do_hash(key, table);
+
+    if (ULTRAPACKED(table)) {
+	if (check_upacked(table, hash_val, key)) {
+	    if (result != 0) *result = UPKEY(table);
+	    return 1;
+	}
+	return 0;
+    }
+
     if (table->entries_packed) {
-        st_index_t i;
-        for (i = 0; i < table->num_entries; i++) {
-            if ((st_data_t)table->bins[i*2] == key) {
-                if (result !=0) *result = (st_data_t)table->bins[i*2];
-                return 1;
-            }
-        }
+	st_index_t i = find_packed_index(table, hash_val, key);
+	if (i < table->real_entries) {
+	    if (result != 0) *result = PKEY(table, i);
+	    return 1;
+	}
         return 0;
     }
 
-    hash_val = do_hash(key, table);
-    FIND_ENTRY(table, ptr, hash_val, bin_pos);
+    ptr = find_entry(table, key, hash_val, hash_val % table->num_bins);
 
     if (ptr == 0) {
 	return 0;
@@ -382,85 +553,151 @@ st_get_key(st_table *table, register st_data_t key, st_data_t *result)
 #undef collision_check
 #define collision_check 1
 
-#define MORE_PACKABLE_P(table) \
-    ((st_index_t)((table)->num_entries+1) * 2 <= (table)->num_bins && \
-     (table)->num_entries+1 <= MAX_PACKED_NUMHASH)
-
-#define ADD_DIRECT(table, key, value, hash_val, bin_pos)\
-do {\
-    st_table_entry *entry;\
-    if ((table)->num_entries > ST_DEFAULT_MAX_DENSITY * (table)->num_bins) {\
-	rehash(table);\
-        (bin_pos) = (hash_val) % (table)->num_bins;\
-    }\
-    \
-    entry = alloc(st_table_entry);\
-    \
-    entry->hash = (hash_val);\
-    entry->key = (key);\
-    entry->record = (value);\
-    entry->next = (table)->bins[(bin_pos)];\
-    if ((table)->head != 0) {\
-	entry->fore = 0;\
-	(entry->back = (table)->tail)->fore = entry;\
-	(table)->tail = entry;\
-    }\
-    else {\
-	(table)->head = (table)->tail = entry;\
-	entry->fore = entry->back = 0;\
-    }\
-    (table)->bins[(bin_pos)] = entry;\
-    (table)->num_entries++;\
-} while (0)
+static inline st_table_entry *
+new_entry(st_table * table, st_data_t key, st_data_t value,
+	st_index_t hash_val, register st_index_t bin_pos)
+{
+    register st_table_entry *entry = st_alloc_entry();
+
+    entry->next = table->bins[bin_pos];
+    table->bins[bin_pos] = entry;
+    entry->hash = hash_val;
+    entry->key = key;
+    entry->record = value;
+
+    return entry;
+}
+
+static inline void
+add_direct(st_table *table, st_data_t key, st_data_t value,
+	   st_index_t hash_val, register st_index_t bin_pos)
+{
+    register st_table_entry *entry;
+    if (table->num_entries > ST_DEFAULT_MAX_DENSITY * table->num_bins) {
+	rehash(table);
+        bin_pos = hash_val % table->num_bins;
+    }
+
+    entry = new_entry(table, key, value, hash_val, bin_pos);
+
+    if (table->head != 0) {
+	entry->fore = 0;
+	(entry->back = table->tail)->fore = entry;
+	table->tail = entry;
+    }
+    else {
+	table->head = table->tail = entry;
+	entry->fore = entry->back = 0;
+    }
+    table->num_entries++;
+}
 
 static void
 unpack_entries(register st_table *table)
 {
     st_index_t i;
-    struct st_table_entry *packed_bins[MAX_PACKED_NUMHASH*2];
+    st_packed_entry packed_bins[MAX_PACKED_HASH];
+    register st_table_entry *entry, *preventry = 0, **chain;
     st_table tmp_table = *table;
 
-    memcpy(packed_bins, table->bins, sizeof(struct st_table_entry *) * table->num_entries*2);
-    table->bins = packed_bins;
+    MEMCPY(packed_bins, PACKED_BINS(table), st_packed_entry, MAX_PACKED_HASH);
+    table->as.packed.entries = packed_bins;
     tmp_table.entries_packed = 0;
-    tmp_table.num_entries = 0;
-    memset(tmp_table.bins, 0, sizeof(struct st_table_entry *) * tmp_table.num_bins);
-    for (i = 0; i < table->num_entries; i++) {
-        st_insert(&tmp_table, (st_data_t)packed_bins[i*2], (st_data_t)packed_bins[i*2+1]);
-    }
+#if ST_DEFAULT_INIT_TABLE_SIZE == ST_DEFAULT_PACKED_TABLE_SIZE
+    MEMZERO(tmp_table.bins, st_table_entry*, tmp_table.num_bins);
+#else
+    tmp_table.bins = st_realloc_bins(tmp_table.bins, ST_DEFAULT_INIT_TABLE_SIZE, tmp_table.num_bins);
+    tmp_table.num_bins = ST_DEFAULT_INIT_TABLE_SIZE;
+#endif
+    i = 0;
+    chain = &tmp_table.head;
+    do {
+	st_data_t key = packed_bins[i].key;
+	st_data_t val = packed_bins[i].val;
+	st_index_t hash = packed_bins[i].hash;
+	entry = new_entry(&tmp_table, key, val, hash,
+			  hash % ST_DEFAULT_INIT_TABLE_SIZE);
+	*chain = entry;
+	entry->back = preventry;
+	preventry = entry;
+	chain = &entry->fore;
+    } while (++i < MAX_PACKED_HASH);
+    *chain = NULL;
+    tmp_table.tail = entry;
     *table = tmp_table;
 }
 
+static void
+add_packed_direct(st_table *table, st_data_t key, st_data_t value, st_index_t hash_val)
+{
+    if (table->real_entries < MAX_PACKED_HASH) {
+	st_index_t i = table->real_entries++;
+	PKEY_SET(table, i, key);
+	PVAL_SET(table, i, value);
+	PHASH_SET(table, i, hash_val);
+	table->num_entries++;
+    }
+    else {
+	unpack_entries(table);
+	add_direct(table, key, value, hash_val, hash_val % table->num_bins);
+    }
+}
+
+static void
+add_upacked_direct(register st_table *table, register st_data_t key, st_data_t value, st_index_t hash_val)
+{
+    if (table->real_upacked) {
+	st_packed_entry *entries = (st_packed_entry *) st_alloc_bins(ST_DEFAULT_PACKED_TABLE_SIZE);
+	entries[0] = UPACKED_ENT(table);
+	entries[1].hash = hash_val;
+	entries[1].key = key;
+	entries[1].val = value;
+	table->num_bins = ST_DEFAULT_PACKED_TABLE_SIZE;
+	table->real_entries = 2;
+	table->num_entries++;
+	table->as.packed.entries = entries;
+    }
+    else {
+	table->real_upacked = 1;
+	table->num_entries = 1;
+	UPHASH_SET(table, hash_val);
+	UPKEY_SET(table, key);
+	UPVAL_SET(table, value);
+    }
+}
+
 int
 st_insert(register st_table *table, register st_data_t key, st_data_t value)
 {
-    st_index_t hash_val, bin_pos;
+    st_index_t hash_val;
+    register st_index_t bin_pos;
     register st_table_entry *ptr;
 
+    hash_val = do_hash(key, table);
+
+    if (ULTRAPACKED(table)) {
+	if (check_upacked(table, hash_val, key)) {
+	    UPVAL_SET(table, value);
+	    return 1;
+	}
+	add_upacked_direct(table, key, value, hash_val);
+	return 0;
+    }
+
     if (table->entries_packed) {
-        st_index_t i;
-        for (i = 0; i < table->num_entries; i++) {
-            if ((st_data_t)table->bins[i*2] == key) {
-                table->bins[i*2+1] = (struct st_table_entry*)value;
-                return 1;
-            }
-        }
-        if (MORE_PACKABLE_P(table)) {
-            i = table->num_entries++;
-            table->bins[i*2] = (struct st_table_entry*)key;
-            table->bins[i*2+1] = (struct st_table_entry*)value;
-            return 0;
-        }
-        else {
-            unpack_entries(table);
+	st_index_t i = find_packed_index(table, hash_val, key);
+	if (i < table->real_entries) {
+	    PVAL_SET(table, i, value);
+	    return 1;
         }
+	add_packed_direct(table, key, value, hash_val);
+	return 0;
     }
 
-    hash_val = do_hash(key, table);
     FIND_ENTRY(table, ptr, hash_val, bin_pos);
 
     if (ptr == 0) {
-	ADD_DIRECT(table, key, value, hash_val, bin_pos);
+	add_direct(table, key, value, hash_val, bin_pos);
 	return 0;
     }
     else {
@@ -473,34 +710,38 @@ int
 st_insert2(register st_table *table, register st_data_t key, st_data_t value,
 	   st_data_t (*func)(st_data_t))
 {
-    st_index_t hash_val, bin_pos;
+    st_index_t hash_val;
+    register st_index_t bin_pos;
     register st_table_entry *ptr;
 
+    hash_val = do_hash(key, table);
+
+    if (ULTRAPACKED(table)) {
+	if (check_upacked(table, hash_val, key)) {
+	    UPVAL_SET(table, value);
+	    return 1;
+	}
+	key = (*func)(key);
+	add_upacked_direct(table, key, value, hash_val);
+	return 0;
+    }
+
     if (table->entries_packed) {
-        st_index_t i;
-        for (i = 0; i < table->num_entries; i++) {
-            if ((st_data_t)table->bins[i*2] == key) {
-                table->bins[i*2+1] = (struct st_table_entry*)value;
-                return 1;
-            }
-        }
-        if (MORE_PACKABLE_P(table)) {
-            i = table->num_entries++;
-            table->bins[i*2] = (struct st_table_entry*)key;
-            table->bins[i*2+1] = (struct st_table_entry*)value;
-            return 0;
-        }
-        else {
-            unpack_entries(table);
-        }
+	st_index_t i = find_packed_index(table, hash_val, key);
+	if (i < table->real_entries) {
+	    PVAL_SET(table, i, value);
+	    return 1;
+	}
+	key = (*func)(key);
+	add_packed_direct(table, key, value, hash_val);
+	return 0;
     }
 
-    hash_val = do_hash(key, table);
     FIND_ENTRY(table, ptr, hash_val, bin_pos);
 
     if (ptr == 0) {
 	key = (*func)(key);
-	ADD_DIRECT(table, key, value, hash_val, bin_pos);
+	add_direct(table, key, value, hash_val, bin_pos);
 	return 0;
     }
     else {
@@ -512,36 +753,30 @@ st_insert2(register st_table *table, register st_data_t key, st_data_t value,
 void
 st_add_direct(st_table *table, st_data_t key, st_data_t value)
 {
-    st_index_t hash_val, bin_pos;
+    st_index_t hash_val;
+
+    hash_val = do_hash(key, table);
+    if (ULTRAPACKED(table)) {
+	add_upacked_direct(table, key, value, hash_val);
+	return;
+    }
 
     if (table->entries_packed) {
-        int i;
-        if (MORE_PACKABLE_P(table)) {
-            i = table->num_entries++;
-            table->bins[i*2] = (struct st_table_entry*)key;
-            table->bins[i*2+1] = (struct st_table_entry*)value;
-            return;
-        }
-        else {
-            unpack_entries(table);
-        }
+	add_packed_direct(table, key, value, hash_val);
+	return;
     }
 
-    hash_val = do_hash(key, table);
-    bin_pos = hash_val % table->num_bins;
-    ADD_DIRECT(table, key, value, hash_val, bin_pos);
+    add_direct(table, key, value, hash_val, hash_val % table->num_bins);
 }
 
 static void
 rehash(register st_table *table)
 {
     register st_table_entry *ptr, **new_bins;
-    st_index_t i, new_num_bins, hash_val;
+    st_index_t new_num_bins, hash_val;
 
     new_num_bins = new_size(table->num_bins+1);
-    new_bins = (st_table_entry**)
-	xrealloc(table->bins, new_num_bins * sizeof(st_table_entry*));
-    for (i = 0; i < new_num_bins; ++i) new_bins[i] = 0;
+    new_bins = st_realloc_bins(table->bins, new_num_bins, table->num_bins);
     table->num_bins = new_num_bins;
     table->bins = new_bins;
 
@@ -558,34 +793,37 @@ st_table*
 st_copy(st_table *old_table)
 {
     st_table *new_table;
-    st_table_entry *ptr, *entry, *prev, **tail;
+    st_table_entry *ptr, *entry, *prev, **tailp;
     st_index_t num_bins = old_table->num_bins;
     st_index_t hash_val;
 
-    new_table = alloc(st_table);
+    new_table = st_alloc_table();
     if (new_table == 0) {
 	return 0;
     }
 
     *new_table = *old_table;
-    new_table->bins = (st_table_entry**)
-	Calloc((unsigned)num_bins, sizeof(st_table_entry*));
+    if (ULTRAPACKED(old_table)) {
+	return new_table;
+    }
+
+    new_table->bins = st_alloc_bins(num_bins);
 
     if (new_table->bins == 0) {
-	free(new_table);
+	st_dealloc_table(new_table);
 	return 0;
     }
 
     if (old_table->entries_packed) {
-        memcpy(new_table->bins, old_table->bins, sizeof(struct st_table_entry *) * old_table->num_bins);
+        MEMCPY(new_table->bins, old_table->bins, st_table_entry*, old_table->num_bins);
         return new_table;
     }
 
     if ((ptr = old_table->head) != 0) {
 	prev = 0;
-	tail = &new_table->head;
+	tailp = &new_table->head;
 	do {
-	    entry = alloc(st_table_entry);
+	    entry = st_alloc_entry();
 	    if (entry == 0) {
 		st_free_table(new_table);
 		return 0;
@@ -595,8 +833,8 @@ st_copy(st_table *old_table)
 	    entry->next = new_table->bins[hash_val];
 	    new_table->bins[hash_val] = entry;
 	    entry->back = prev;
-	    *tail = prev = entry;
-	    tail = &entry->fore;
+	    *tailp = prev = entry;
+	    tailp = &entry->fore;
 	} while ((ptr = ptr->fore) != 0);
 	new_table->tail = prev;
     }
@@ -604,21 +842,22 @@ st_copy(st_table *old_table)
     return new_table;
 }
 
-#define REMOVE_ENTRY(table, ptr) do					\
-    {									\
-	if ((ptr)->fore == 0 && (ptr)->back == 0) {			\
-	    (table)->head = 0;						\
-	    (table)->tail = 0;						\
-	}								\
-	else {								\
-	    st_table_entry *fore = (ptr)->fore, *back = (ptr)->back;	\
-	    if (fore) fore->back = back;				\
-	    if (back) back->fore = fore;				\
-	    if ((ptr) == (table)->head) (table)->head = fore;		\
-	    if ((ptr) == (table)->tail) (table)->tail = back;		\
-	}								\
-	(table)->num_entries--;						\
-    } while (0)
+static inline void
+remove_entry(st_table *table, st_table_entry *ptr)
+{
+    if (ptr->fore == 0 && ptr->back == 0) {
+	table->head = 0;
+	table->tail = 0;
+    }
+    else {
+	st_table_entry *fore = ptr->fore, *back = ptr->back;
+	if (fore) fore->back = back;
+	if (back) back->fore = fore;
+	if (ptr == table->head) table->head = fore;
+	if (ptr == table->tail) table->tail = back;
+    }
+    table->num_entries--;
+}
 
 int
 st_delete(register st_table *table, register st_data_t *key, st_data_t *value)
@@ -627,30 +866,38 @@ st_delete(register st_table *table, register st_data_t *key, st_data_t *value)
     st_table_entry **prev;
     register st_table_entry *ptr;
 
+    hash_val = do_hash(*key, table);
+
+    if (ULTRAPACKED(table)) {
+	if (check_upacked(table, hash_val, *key)) {
+	    if (value != 0) *value = UPVAL(table);
+	    *key = UPKEY(table);
+	    remove_upacked_entry(table);
+	    return 1;
+	}
+	return 0;
+    }
+
     if (table->entries_packed) {
-        st_index_t i;
-        for (i = 0; i < table->num_entries; i++) {
-            if ((st_data_t)table->bins[i*2] == *key) {
-                if (value != 0) *value = (st_data_t)table->bins[i*2+1];
-                table->num_entries--;
-                memmove(&table->bins[i*2], &table->bins[(i+1)*2],
-                        sizeof(struct st_table_entry*) * 2*(table->num_entries-i));
-                return 1;
-            }
+	st_index_t i = find_packed_index(table, hash_val, *key);
+	if (i < table->real_entries) {
+	    if (value != 0) *value = PVAL(table, i);
+	    *key = PKEY(table, i);
+	    remove_packed_entry(table, i);
+	    return 1;
         }
         if (value != 0) *value = 0;
         return 0;
     }
 
-    hash_val = do_hash_bin(*key, table);
-
-    for (prev = &table->bins[hash_val]; (ptr = *prev) != 0; prev = &ptr->next) {
+    prev = &table->bins[hash_val % table->num_bins];
+    for (;(ptr = *prev) != 0; prev = &ptr->next) {
 	if (EQUAL(table, *key, ptr->key)) {
 	    *prev = ptr->next;
-	    REMOVE_ENTRY(table, ptr);
+	    remove_entry(table, ptr);
 	    if (value != 0) *value = ptr->record;
 	    *key = ptr->key;
-	    free(ptr);
+	    st_free_entry(ptr);
 	    return 1;
 	}
     }
@@ -665,25 +912,36 @@ st_delete_safe(register st_table *table, register st_data_t *key, st_data_t *val
     st_index_t hash_val;
     register st_table_entry *ptr;
 
+    hash_val = do_hash(*key, table);
+
+    if (ULTRAPACKED(table)) {
+	if (check_upacked(table, hash_val, *key)) {
+	    if (value != 0) *value = UPVAL(table);
+	    *key = UPKEY(table);
+	    remove_safe_upacked_entry(table, never);
+	    return 1;
+	}
+	if (value != 0) *value = 0;
+	return 0;
+    }
+
     if (table->entries_packed) {
-	st_index_t i;
-	for (i = 0; i < table->num_entries; i++) {
-	    if ((st_data_t)table->bins[i*2] == *key) {
-		if (value != 0) *value = (st_data_t)table->bins[i*2+1];
-		table->bins[i*2] = (void *)never;
-		return 1;
-	    }
+	st_index_t i = find_packed_index(table, hash_val, *key);
+	if (i < table->real_entries) {
+	    if (value != 0) *value = PVAL(table, i);
+	    *key = PKEY(table, i);
+	    remove_safe_packed_entry(table, i, never);
+	    return 1;
 	}
 	if (value != 0) *value = 0;
 	return 0;
     }
 
-    hash_val = do_hash_bin(*key, table);
-    ptr = table->bins[hash_val];
+    ptr = table->bins[hash_val % table->num_bins];
 
     for (; ptr != 0; ptr = ptr->next) {
 	if ((ptr->key != never) && EQUAL(table, ptr->key, *key)) {
-	    REMOVE_ENTRY(table, ptr);
+	    remove_entry(table, ptr);
 	    *key = ptr->key;
 	    if (value != 0) *value = ptr->record;
 	    ptr->key = ptr->record = never;
@@ -701,17 +959,23 @@ st_cleanup_safe(st_table *table, st_data_t never)
     st_table_entry *ptr, **last, *tmp;
     st_index_t i;
 
+    if (ULTRAPACKED(table)) {
+	table->real_upacked = table->num_entries;
+	return;
+    }
+
     if (table->entries_packed) {
 	st_index_t i = 0, j = 0;
-	while ((st_data_t)table->bins[i*2] != never) {
-	    if (i++ == table->num_entries) return;
+	while (PKEY(table, i) != never) {
+	    if (i++ == table->real_entries) return;
 	}
-	for (j = i; ++i < table->num_entries;) {
-	    if ((st_data_t)table->bins[i*2] == never) continue;
-	    table->bins[j*2] = table->bins[i*2];
-	    table->bins[j*2+1] = table->bins[i*2+1];
+	for (j = i; ++i < table->real_entries;) {
+	    if (PKEY(table, i) == never) continue;
+	    PACKED_ENT(table, j) = PACKED_ENT(table, i);
 	    j++;
 	}
+	table->real_entries = j;
+	/* table->num_entries really should be equal j at this moment, but let set it anyway */
 	table->num_entries = j;
 	return;
     }
@@ -722,7 +986,7 @@ st_cleanup_safe(st_table *table, st_data_t never)
 	    if (ptr->key == never) {
 		tmp = ptr;
 		*last = ptr = ptr->next;
-		free(tmp);
+		st_free_entry(tmp);
 	    }
 	    else {
 		ptr = *(last = &ptr->next);
@@ -732,50 +996,78 @@ st_cleanup_safe(st_table *table, st_data_t never)
 }
 
 int
-st_foreach(st_table *table, int (*func)(ANYARGS), st_data_t arg)
+st_foreach_check(st_table *table, int (*func)(ANYARGS), st_data_t arg, st_data_t never)
 {
     st_table_entry *ptr, **last, *tmp;
     enum st_retval retval;
-    st_index_t i;
+    st_data_t key, val;
+    st_index_t hash, i = 0;
+
+    if (table->num_entries == 0) {
+	return 0;
+    }
+
+    if (ULTRAPACKED(table)) {
+	key = UPKEY(table);
+	val = UPVAL(table);
+	hash = UPHASH(table);
+	if (key == never) return 0;
+	retval = (*func)(key, val, arg);
+	if (!ULTRAPACKED(table)) {
+	    goto packed;
+	}
+	switch(retval) {
+	  case ST_CHECK:
+	    if (UPHASH(table) == 0 && UPKEY(table) == never)
+		break;
+	    if (check_upacked(table, hash, key))
+		break;
+	    goto deleted;
+	  case ST_DELETE:
+	    remove_safe_upacked_entry(table, never);
+	  case ST_CONTINUE:
+	  case ST_STOP:
+	    break;
+	}
+	return 0;
+    }
 
     if (table->entries_packed) {
-        for (i = 0; i < table->num_entries; i++) {
-            st_index_t j;
-            st_data_t key, val;
-            key = (st_data_t)table->bins[i*2];
-            val = (st_data_t)table->bins[i*2+1];
-            retval = (*func)(key, val, arg);
+	for (i = 0; i < table->real_entries; i++) {
+	    key = PKEY(table, i);
+	    val = PVAL(table, i);
+	    hash = PHASH(table, i);
+	    if (key == never) continue;
+	    retval = (*func)(key, val, arg);
+	  packed:
 	    if (!table->entries_packed) {
-		FIND_ENTRY(table, ptr, key, i);
+		FIND_ENTRY(table, ptr, hash, i);
 		if (retval == ST_CHECK) {
 		    if (!ptr) goto deleted;
 		    goto unpacked_continue;
 		}
 		goto unpacked;
 	    }
-            switch (retval) {
+	    switch (retval) {
 	      case ST_CHECK:	/* check if hash is modified during iteration */
-                for (j = 0; j < table->num_entries; j++) {
-                    if ((st_data_t)table->bins[j*2] == key)
-                        break;
-                }
-                if (j == table->num_entries) {
+		if (PHASH(table, i) == 0 && PKEY(table, i) == never) {
+		    break;
+		}
+		i = find_packed_index(table, hash, key);
+		if (i == table->real_entries) {
 		    goto deleted;
-                }
+		}
 		/* fall through */
 	      case ST_CONTINUE:
 		break;
 	      case ST_STOP:
 		return 0;
 	      case ST_DELETE:
-                table->num_entries--;
-                memmove(&table->bins[i*2], &table->bins[(i+1)*2],
-                        sizeof(struct st_table_entry*) * 2*(table->num_entries-i));
-                i--;
-                break;
-            }
-        }
-        return 0;
+		remove_safe_packed_entry(table, i, never);
+		break;
+	    }
+	}
+	return 0;
     }
     else {
 	ptr = table->head;
@@ -783,6 +1075,8 @@ st_foreach(st_table *table, int (*func)(ANYARGS), st_data_t arg)
 
     if (ptr != 0) {
 	do {
+	    if (ptr->key == never)
+		goto unpacked_continue;
 	    i = ptr->hash % table->num_bins;
 	    retval = (*func)(ptr->key, ptr->record, arg);
 	  unpacked:
@@ -808,10 +1102,100 @@ st_foreach(st_table *table, int (*func)(ANYARGS), st_data_t arg)
 		for (; (tmp = *last) != 0; last = &tmp->next) {
 		    if (ptr == tmp) {
 			tmp = ptr->fore;
+			remove_entry(table, ptr);
+			ptr->key = ptr->record = never;
+			ptr->hash = 0;
+			ptr = tmp;
+			break;
+		    }
+		}
+	    }
+	} while (ptr && table->head);
+    }
+    return 0;
+}
+
+int
+st_foreach(st_table *table, int (*func)(ANYARGS), st_data_t arg)
+{
+    st_table_entry *ptr, **last, *tmp;
+    enum st_retval retval;
+    st_data_t key, val;
+    st_index_t hash, i = 0;
+
+    if (table->num_entries == 0) {
+	return 0;
+    }
+
+    if (ULTRAPACKED(table)) {
+	key = UPKEY(table);
+	val = UPVAL(table);
+	hash = UPHASH(table);
+	retval = (*func)(key, val, arg);
+	if (!ULTRAPACKED(table)) {
+	    goto packed;
+	}
+	switch (retval) {
+	  case ST_DELETE:
+	    remove_upacked_entry(table);
+	  case ST_CONTINUE:
+	  case ST_CHECK:
+	  case ST_STOP:
+	    break;
+	}
+	return 0;
+    }
+
+    if (table->entries_packed) {
+	for (i = 0; i < table->real_entries; i++) {
+	    key = PKEY(table, i);
+	    val = PVAL(table, i);
+	    hash = PHASH(table, i);
+	    retval = (*func)(key, val, arg);
+	  packed:
+	    if (!table->entries_packed) {
+		FIND_ENTRY(table, ptr, hash, i);
+		if (!ptr) return 0;
+		goto unpacked;
+	    }
+	    switch (retval) {
+	      case ST_CONTINUE:
+		break;
+	      case ST_CHECK:
+	      case ST_STOP:
+		return 0;
+	      case ST_DELETE:
+		remove_packed_entry(table, i);
+		i--;
+		break;
+	    }
+	}
+	return 0;
+    }
+    else {
+	ptr = table->head;
+    }
+
+    if (ptr != 0) {
+	do {
+	    i = ptr->hash % table->num_bins;
+	    retval = (*func)(ptr->key, ptr->record, arg);
+	  unpacked:
+	    switch (retval) {
+	      case ST_CONTINUE:
+		ptr = ptr->fore;
+		break;
+	      case ST_CHECK:
+	      case ST_STOP:
+		return 0;
+	      case ST_DELETE:
+		last = &table->bins[ptr->hash % table->num_bins];
+		for (; (tmp = *last) != 0; last = &tmp->next) {
+		    if (ptr == tmp) {
+			tmp = ptr->fore;
 			*last = ptr->next;
-			REMOVE_ENTRY(table, ptr);
-			free(ptr);
-			if (ptr == tmp) return 0;
+			remove_entry(table, ptr);
+			st_free_entry(ptr);
 			ptr = tmp;
 			break;
 		    }
@@ -834,13 +1218,13 @@ st_reverse_foreach(st_table *table, int (*func)(ANYARGS), st_data_t arg)
         for (i = table->num_entries-1; 0 <= i; i--) {
             int j;
             st_data_t key, val;
-            key = (st_data_t)table->bins[i*2];
-            val = (st_data_t)table->bins[i*2+1];
+            key = PKEY(table, i);
+            val = PVAL(table, i);
             retval = (*func)(key, val, arg);
             switch (retval) {
 	      case ST_CHECK:	/* check if hash is modified during iteration */
                 for (j = 0; j < table->num_entries; j++) {
-                    if ((st_data_t)table->bins[j*2] == key)
+                    if (PKEY(table, j) == key)
                         break;
                 }
                 if (j == table->num_entries) {
@@ -854,9 +1238,7 @@ st_reverse_foreach(st_table *table, int (*func)(ANYARGS), st_data_t arg)
 	      case ST_STOP:
 		return 0;
 	      case ST_DELETE:
-                table->num_entries--;
-                memmove(&table->bins[i*2], &table->bins[(i+1)*2],
-                        sizeof(struct st_table_entry*) * 2*(table->num_entries-i));
+		remove_packed_entry(table, i);
                 break;
             }
         }
@@ -889,8 +1271,8 @@ st_reverse_foreach(st_table *table, int (*func)(ANYARGS), st_data_t arg)
 		    if (ptr == tmp) {
 			tmp = ptr->back;
 			*last = ptr->next;
-			REMOVE_ENTRY(table, ptr);
-			free(ptr);
+			remove_entry(table, ptr);
+			st_free_entry(ptr);
 			ptr = tmp;
 			break;
 		    }
diff --git a/test/ruby/test_array.rb b/test/ruby/test_array.rb
index 28d3e41..bcad2c0 100644
--- a/test/ruby/test_array.rb
+++ b/test/ruby/test_array.rb
@@ -414,6 +414,18 @@ class TestArray < Test::Unit::TestCase
     a = @cls[1, 2, 3]
     a[-1, 0] = a
     assert_equal([1, 2, 1, 2, 3, 3], a)
+
+    a = @cls[]
+    a[5,0] = [5]
+    assert_equal([nil, nil, nil, nil, nil, 5], a)
+
+    a = @cls[1]
+    a[1,0] = [2]
+    assert_equal([1, 2], a)
+
+    a = @cls[1]
+    a[1,1] = [2]
+    assert_equal([1, 2], a)
   end
 
   def test_assoc
diff --git a/test/ruby/test_marshal.rb b/test/ruby/test_marshal.rb
index 7ec6959..f5774cd 100644
--- a/test/ruby/test_marshal.rb
+++ b/test/ruby/test_marshal.rb
@@ -312,7 +312,7 @@ class TestMarshal < Test::Unit::TestCase
         assert_equal(a.instance_variable_get(i), b.instance_variable_get(i), bug1932)
       end
     end
-    a.__send__(a.methods(true).grep(/=\z/)[0], a)
+    a.__send__(a.methods(true).grep(/\Ar.+=\z/)[0], a)
     assert_nothing_raised(bug1932) do
       b = Marshal.load(Marshal.dump(a))
       assert_equal(ClassISO8859_1, b.class, bug1932)
diff --git a/test/ruby/test_method.rb b/test/ruby/test_method.rb
index 2cc0de5..b1bf33e 100644
--- a/test/ruby/test_method.rb
+++ b/test/ruby/test_method.rb
@@ -406,7 +406,7 @@ class TestMethod < Test::Unit::TestCase
     obj = a.new
     assert_equal([:a], obj.public_methods(false), bug)
     obj.extend(m)
-    assert_equal([:m1, :a], obj.public_methods(false), bug)
+    assert_equal([:a, :m1], obj.public_methods(false).sort, bug)
   end
 
   def test_visibility
diff --git a/test/ruby/test_module.rb b/test/ruby/test_module.rb
index 6176f48..a67d845 100644
--- a/test/ruby/test_module.rb
+++ b/test/ruby/test_module.rb
@@ -870,7 +870,7 @@ class TestModule < Test::Unit::TestCase
       (class << self ; self ; end).class_eval do
         define_method :method_added do |sym|
           memo << sym
-          memo << mod.instance_methods(false)
+          memo << mod.instance_methods(false).sort
           memo << (mod.instance_method(sym) rescue nil)
         end
       end
@@ -887,10 +887,10 @@ class TestModule < Test::Unit::TestCase
     assert_equal [:f, :g], memo.shift
     assert_equal mod.instance_method(:f), memo.shift
     assert_equal :a, memo.shift
-    assert_equal [:f, :g, :a], memo.shift
+    assert_equal [:a, :f, :g], memo.shift
     assert_equal mod.instance_method(:a), memo.shift
     assert_equal :a=, memo.shift
-    assert_equal [:f, :g, :a, :a=], memo.shift
+    assert_equal [:a, :a=, :f, :g], memo.shift
     assert_equal mod.instance_method(:a=), memo.shift
   end
 
diff --git a/test/ruby/test_require.rb b/test/ruby/test_require.rb
index 58a9ee2..ec75096 100644
--- a/test/ruby/test_require.rb
+++ b/test/ruby/test_require.rb
@@ -356,4 +356,114 @@ class TestRequire < Test::Unit::TestCase
     $:.replace(loadpath)
     $".replace(features)
   end
+
+  def test_require_changed_current_dir
+    bug7158 = '[ruby-core:47970]'
+    Dir.mktmpdir {|tmp|
+      Dir.chdir(tmp) {
+        Dir.mkdir("a")
+        Dir.mkdir("b")
+        open(File.join("a", "foo.rb"), "w") {}
+        open(File.join("b", "bar.rb"), "w") {|f|
+          f.puts "p :ok"
+        }
+        assert_in_out_err([], <<-INPUT, %w(:ok), [], bug7158)
+          $: << "."
+          Dir.chdir("a")
+          require "foo"
+          Dir.chdir("../b")
+          p :ng unless require "bar"
+          Dir.chdir("..")
+          p :ng if require "b/bar"
+        INPUT
+      }
+    }
+  end
+
+  def test_require_not_modified_load_path
+    bug7158 = '[ruby-core:47970]'
+    Dir.mktmpdir {|tmp|
+      Dir.chdir(tmp) {
+        open("foo.rb", "w") {}
+        assert_in_out_err([], <<-INPUT, %w(:ok), [], bug7158)
+          a = Object.new
+          def a.to_str
+            "#{tmp}"
+          end
+          $: << a
+          require "foo"
+          last_path = $:.pop
+          p :ok if last_path == a && last_path.class == Object
+        INPUT
+      }
+    }
+  end
+
+  def test_require_changed_home
+    bug7158 = '[ruby-core:47970]'
+    Dir.mktmpdir {|tmp|
+      Dir.chdir(tmp) {
+        open("foo.rb", "w") {}
+        Dir.mkdir("a")
+        open(File.join("a", "bar.rb"), "w") {}
+        assert_in_out_err([], <<-INPUT, %w(:ok), [], bug7158)
+          $: << '~'
+          ENV['HOME'] = "#{tmp}"
+          require "foo"
+          ENV['HOME'] = "#{tmp}/a"
+          p :ok if require "bar"
+        INPUT
+      }
+    }
+  end
+
+  def test_require_to_path_redefined_in_load_path
+    bug7158 = '[ruby-core:47970]'
+    Dir.mktmpdir {|tmp|
+      Dir.chdir(tmp) {
+        open("foo.rb", "w") {}
+        assert_in_out_err(["RUBYOPT"=>nil], <<-INPUT, %w(:ok), [], bug7158)
+          a = Object.new
+          def a.to_path
+            "bar"
+          end
+          $: << a
+          begin
+            require "foo"
+            p :ng
+          rescue LoadError
+          end
+          def a.to_path
+            "#{tmp}"
+          end
+          p :ok if require "foo"
+        INPUT
+      }
+    }
+  end
+
+  def test_require_to_str_redefined_in_load_path
+    bug7158 = '[ruby-core:47970]'
+    Dir.mktmpdir {|tmp|
+      Dir.chdir(tmp) {
+        open("foo.rb", "w") {}
+        assert_in_out_err(["RUBYOPT"=>nil], <<-INPUT, %w(:ok), [], bug7158)
+          a = Object.new
+          def a.to_str
+            "foo"
+          end
+          $: << a
+          begin
+            require "foo"
+            p :ng
+          rescue LoadError
+          end
+          def a.to_str
+            "#{tmp}"
+          end
+          p :ok if require "foo"
+        INPUT
+      }
+    }
+  end
 end
diff --git a/time.c b/time.c
index 755812f..83edc83 100644
--- a/time.c
+++ b/time.c
@@ -4712,16 +4712,14 @@ time_mload(VALUE time, VALUE str)
     long nsec;
     VALUE submicro, nano_num, nano_den, offset;
     wideval_t timew;
-    st_data_t data;
 
     time_modify(time);
 
 #define get_attr(attr, iffound) \
     attr = rb_attr_get(str, id_##attr); \
     if (!NIL_P(attr)) { \
-	data = id_##attr; \
 	iffound; \
-        st_delete(rb_generic_ivar_table(str), &data, 0); \
+        sa_delete(rb_generic_ivar_table(str), (sa_index_t)id_##attr, 0); \
     }
 
     get_attr(nano_num, {});
diff --git a/variable.c b/variable.c
index 3da500e..385d4af 100644
--- a/variable.c
+++ b/variable.c
@@ -19,15 +19,15 @@
 #include "constant.h"
 #include "internal.h"
 
-st_table *rb_global_tbl;
-st_table *rb_class_tbl;
+sa_table rb_global_tbl;
+sa_table rb_class_tbl;
 static ID autoload, classpath, tmp_classpath, classid;
 
 void
 Init_var_tables(void)
 {
-    rb_global_tbl = st_init_numtable();
-    rb_class_tbl = st_init_numtable();
+    sa_init_table(&rb_global_tbl, 0);
+    sa_init_table(&rb_class_tbl, 0);
     CONST_ID(autoload, "__autoload__");
     CONST_ID(classpath, "__classpath__");
     CONST_ID(tmp_classpath, "__tmp_classpath__");
@@ -43,7 +43,7 @@ struct fc_result {
 };
 
 static VALUE
-fc_path(struct fc_result *fc, ID name)
+fc_path(struct fc_result *fc, sa_index_t name)
 {
     VALUE path, tmp;
 
@@ -51,8 +51,7 @@ fc_path(struct fc_result *fc, ID name)
     while (fc) {
 	st_data_t n;
 	if (fc->track == rb_cObject) break;
-	if (RCLASS_IV_TBL(fc->track) &&
-	    st_lookup(RCLASS_IV_TBL(fc->track), (st_data_t)classpath, &n)) {
+	if (sa_lookup(RCLASS_IV_TBL(fc->track), (sa_index_t)classpath, &n)) {
 	    tmp = rb_str_dup((VALUE)n);
 	    rb_str_cat2(tmp, "::");
 	    rb_str_append(tmp, path);
@@ -70,7 +69,7 @@ fc_path(struct fc_result *fc, ID name)
 }
 
 static int
-fc_i(ID key, rb_const_entry_t *ce, struct fc_result *res)
+fc_i(sa_index_t key, rb_const_entry_t *ce, struct fc_result *res)
 {
     VALUE value = ce->value;
     if (!rb_is_const_id(key)) return ST_CONTINUE;
@@ -98,7 +97,7 @@ fc_i(ID key, rb_const_entry_t *ce, struct fc_result *res)
 	    arg.klass = res->klass;
 	    arg.track = value;
 	    arg.prev = res;
-	    st_foreach(RCLASS_CONST_TBL(value), fc_i, (st_data_t)&arg);
+	    sa_foreach(RCLASS_CONST_TBL(value), fc_i, (st_data_t)&arg);
 	    if (arg.path) {
 		res->path = arg.path;
 		return ST_STOP;
@@ -123,18 +122,14 @@ find_class_path(VALUE klass)
     arg.track = rb_cObject;
     arg.prev = 0;
     if (RCLASS_CONST_TBL(rb_cObject)) {
-	st_foreach_safe(RCLASS_CONST_TBL(rb_cObject), fc_i, (st_data_t)&arg);
+	sa_foreach(RCLASS_CONST_TBL(rb_cObject), fc_i, (st_data_t)&arg);
     }
     if (arg.path == 0) {
-	st_foreach_safe(rb_class_tbl, fc_i, (st_data_t)&arg);
+	sa_foreach(&rb_class_tbl, fc_i, (st_data_t)&arg);
     }
     if (arg.path) {
-	st_data_t tmp = tmp_classpath;
-	if (!RCLASS_IV_TBL(klass)) {
-	    RCLASS_IV_TBL(klass) = st_init_numtable();
-	}
-	st_insert(RCLASS_IV_TBL(klass), (st_data_t)classpath, arg.path);
-	st_delete(RCLASS_IV_TBL(klass), &tmp, 0);
+	sa_insert(RCLASS_IV_TBL(klass), (sa_index_t)classpath, arg.path);
+	sa_delete(RCLASS_IV_TBL(klass), (sa_index_t)tmp_classpath, 0);
 	return arg.path;
     }
     return Qnil;
@@ -147,16 +142,15 @@ classname(VALUE klass)
     st_data_t n;
 
     if (!klass) klass = rb_cObject;
-    if (RCLASS_IV_TBL(klass)) {
-	if (!st_lookup(RCLASS_IV_TBL(klass), (st_data_t)classpath, &n)) {
-	    if (!st_lookup(RCLASS_IV_TBL(klass), (st_data_t)classid, &n)) {
+    if (RCLASS_IV_TBL(klass)->num_entries) {
+	if (!sa_lookup(RCLASS_IV_TBL(klass), (sa_index_t)classpath, &n)) {
+	    if (!sa_lookup(RCLASS_IV_TBL(klass), (sa_index_t)classid, &n)) {
 		return find_class_path(klass);
 	    }
 	    path = rb_str_dup(rb_id2str(SYM2ID((VALUE)n)));
 	    OBJ_FREEZE(path);
-	    st_insert(RCLASS_IV_TBL(klass), (st_data_t)classpath, (st_data_t)path);
-	    n = classid;
-	    st_delete(RCLASS_IV_TBL(klass), &n, 0);
+	    sa_insert(RCLASS_IV_TBL(klass), (sa_index_t)classpath, (st_data_t)path);
+	    sa_delete(RCLASS_IV_TBL(klass), (sa_index_t)classid, 0);
 	}
 	else {
 	    path = (VALUE)n;
@@ -192,8 +186,7 @@ rb_class_path(VALUE klass)
     st_data_t n = (st_data_t)path;
 
     if (!NIL_P(path)) return path;
-    if (RCLASS_IV_TBL(klass) && st_lookup(RCLASS_IV_TBL(klass),
-					  (st_data_t)tmp_classpath, &n)) {
+    if (sa_lookup(RCLASS_IV_TBL(klass), (sa_index_t)tmp_classpath, &n)) {
 	return (VALUE)n;
     }
     else {
@@ -364,7 +357,7 @@ rb_global_entry(ID id)
     struct global_entry *entry;
     st_data_t data;
 
-    if (!st_lookup(rb_global_tbl, (st_data_t)id, &data)) {
+    if (!sa_lookup(&rb_global_tbl, (sa_index_t)id, &data)) {
 	struct global_variable *var;
 	entry = ALLOC(struct global_entry);
 	var = ALLOC(struct global_variable);
@@ -378,7 +371,7 @@ rb_global_entry(ID id)
 
 	var->block_trace = 0;
 	var->trace = 0;
-	st_add_direct(rb_global_tbl, id, (st_data_t)entry);
+	sa_insert(&rb_global_tbl, (sa_index_t)id, (st_data_t)entry);
     }
     else {
 	entry = (struct global_entry *)data;
@@ -454,8 +447,8 @@ readonly_setter(VALUE val, ID id, void *data, struct global_variable *gvar)
     rb_name_error(id, "%s is a read-only variable", rb_id2name(id));
 }
 
-static int
-mark_global_entry(ID key, struct global_entry *entry)
+static void
+mark_global_entry(struct global_entry *entry)
 {
     struct trace_var *trace;
     struct global_variable *var = entry->var;
@@ -466,14 +459,14 @@ mark_global_entry(ID key, struct global_entry *entry)
 	if (trace->data) rb_gc_mark_maybe(trace->data);
 	trace = trace->next;
     }
-    return ST_CONTINUE;
 }
 
 void
 rb_gc_mark_global_tbl(void)
 {
-    if (rb_global_tbl)
-        st_foreach_safe(rb_global_tbl, mark_global_entry, 0);
+    SA_FOREACH_START(&rb_global_tbl);
+    mark_global_entry((struct global_entry*) value);
+    SA_FOREACH_END();
 }
 
 static ID
@@ -635,7 +628,7 @@ rb_f_untrace_var(int argc, VALUE *argv)
     rb_secure(4);
     rb_scan_args(argc, argv, "11", &var, &cmd);
     id = rb_to_id(var);
-    if (!st_lookup(rb_global_tbl, (st_data_t)id, &data)) {
+    if (!sa_lookup(&rb_global_tbl, (sa_index_t)id, &data)) {
 	rb_name_error(id, "undefined global variable %s", rb_id2name(id));
     }
 
@@ -742,13 +735,6 @@ rb_gvar_defined(struct global_entry *entry)
     return Qtrue;
 }
 
-static int
-gvar_i(ID key, struct global_entry *entry, VALUE ary)
-{
-    rb_ary_push(ary, ID2SYM(key));
-    return ST_CONTINUE;
-}
-
 /*
  *  call-seq:
  *     global_variables    -> array
@@ -765,7 +751,9 @@ rb_f_global_variables(void)
     char buf[2];
     int i;
 
-    st_foreach_safe(rb_global_tbl, gvar_i, ary);
+    SA_FOREACH_START(&rb_global_tbl);
+    rb_ary_push(ary, ID2SYM(entry->key));
+    SA_FOREACH_END();
     buf[0] = '$';
     for (i = 1; i <= 9; ++i) {
 	buf[1] = (char)(i + '0');
@@ -784,10 +772,10 @@ rb_alias_variable(ID name1, ID name2)
 	rb_raise(rb_eSecurityError, "Insecure: can't alias global variable");
 
     entry2 = rb_global_entry(name2);
-    if (!st_lookup(rb_global_tbl, (st_data_t)name1, &data1)) {
+    if (!sa_lookup(&rb_global_tbl, (sa_index_t)name1, &data1)) {
 	entry1 = ALLOC(struct global_entry);
 	entry1->id = name1;
-	st_add_direct(rb_global_tbl, name1, (st_data_t)entry1);
+	sa_insert(&rb_global_tbl, (sa_index_t)name1, (st_data_t)entry1);
     }
     else if ((entry1 = (struct global_entry *)data1)->var != entry2->var) {
 	struct global_variable *var = entry1->var;
@@ -815,7 +803,7 @@ rb_alias_variable(ID name1, ID name2)
 static int special_generic_ivar = 0;
 static st_table *generic_iv_tbl;
 
-st_table*
+sa_table*
 rb_generic_ivar_table(VALUE obj)
 {
     st_data_t tbl;
@@ -823,7 +811,7 @@ rb_generic_ivar_table(VALUE obj)
     if (!FL_TEST(obj, FL_EXIVAR)) return 0;
     if (!generic_iv_tbl) return 0;
     if (!st_lookup(generic_iv_tbl, (st_data_t)obj, &tbl)) return 0;
-    return (st_table *)tbl;
+    return (sa_table *)tbl;
 }
 
 static VALUE
@@ -833,7 +821,7 @@ generic_ivar_get(VALUE obj, ID id, int warn)
 
     if (generic_iv_tbl) {
 	if (st_lookup(generic_iv_tbl, (st_data_t)obj, &tbl)) {
-	    if (st_lookup((st_table *)tbl, (st_data_t)id, &val)) {
+	    if (sa_lookup((sa_table *)tbl, (sa_index_t)id, &val)) {
 		return (VALUE)val;
 	    }
 	}
@@ -847,7 +835,6 @@ generic_ivar_get(VALUE obj, ID id, int warn)
 static void
 generic_ivar_set(VALUE obj, ID id, VALUE val)
 {
-    st_table *tbl;
     st_data_t data;
 
     if (rb_special_const_p(obj)) {
@@ -859,24 +846,22 @@ generic_ivar_set(VALUE obj, ID id, VALUE val)
     }
     if (!st_lookup(generic_iv_tbl, (st_data_t)obj, &data)) {
 	FL_SET(obj, FL_EXIVAR);
-	tbl = st_init_numtable();
-	st_add_direct(generic_iv_tbl, (st_data_t)obj, (st_data_t)tbl);
-	st_add_direct(tbl, (st_data_t)id, (st_data_t)val);
-	return;
+	data = (st_data_t)sa_new_table();
+	st_add_direct(generic_iv_tbl, (st_data_t)obj, data);
     }
-    st_insert((st_table *)data, (st_data_t)id, (st_data_t)val);
+    sa_insert((sa_table *)data, (sa_index_t)id, (st_data_t)val);
 }
 
 static VALUE
 generic_ivar_defined(VALUE obj, ID id)
 {
-    st_table *tbl;
+    sa_table *tbl;
     st_data_t data;
 
     if (!generic_iv_tbl) return Qfalse;
     if (!st_lookup(generic_iv_tbl, (st_data_t)obj, &data)) return Qfalse;
-    tbl = (st_table *)data;
-    if (st_lookup(tbl, (st_data_t)id, &data)) {
+    tbl = (sa_table *)data;
+    if (sa_lookup(tbl, (sa_index_t)id, &data)) {
 	return Qtrue;
     }
     return Qfalse;
@@ -885,18 +870,18 @@ generic_ivar_defined(VALUE obj, ID id)
 static int
 generic_ivar_remove(VALUE obj, ID id, st_data_t *valp)
 {
-    st_table *tbl;
+    sa_table *tbl;
     st_data_t data, key = (st_data_t)id;
     int status;
 
     if (!generic_iv_tbl) return 0;
     if (!st_lookup(generic_iv_tbl, (st_data_t)obj, &data)) return 0;
-    tbl = (st_table *)data;
-    status = st_delete(tbl, &key, valp);
+    tbl = (sa_table *)data;
+    status = sa_delete(tbl, (sa_index_t)id, valp);
     if (tbl->num_entries == 0) {
 	key = (st_data_t)obj;
 	st_delete(generic_iv_tbl, &key, &data);
-	st_free_table((st_table *)data);
+	sa_free_table(tbl);
     }
     return status;
 }
@@ -908,22 +893,17 @@ rb_mark_generic_ivar(VALUE obj)
 
     if (!generic_iv_tbl) return;
     if (st_lookup(generic_iv_tbl, (st_data_t)obj, &tbl)) {
-	rb_mark_tbl((st_table *)tbl);
+	rb_mark_sa_tbl((sa_table *)tbl);
     }
 }
 
 static int
-givar_mark_i(ID key, VALUE value)
-{
-    rb_gc_mark(value);
-    return ST_CONTINUE;
-}
-
-static int
-givar_i(VALUE obj, st_table *tbl)
+givar_i(VALUE obj, sa_table *tbl)
 {
     if (rb_special_const_p(obj)) {
-	st_foreach_safe(tbl, givar_mark_i, 0);
+        SA_FOREACH_START(tbl);
+        rb_gc_mark((VALUE)value);
+        SA_FOREACH_END();
     }
     return ST_CONTINUE;
 }
@@ -943,7 +923,7 @@ rb_free_generic_ivar(VALUE obj)
 
     if (!generic_iv_tbl) return;
     if (st_delete(generic_iv_tbl, &key, &tbl))
-	st_free_table((st_table *)tbl);
+	sa_free_table((sa_table *)tbl);
 }
 
 RUBY_FUNC_EXPORTED size_t
@@ -951,7 +931,7 @@ rb_generic_ivar_memsize(VALUE obj)
 {
     st_data_t tbl;
     if (st_lookup(generic_iv_tbl, (st_data_t)obj, &tbl))
-	return st_memsize((st_table *)tbl);
+	return sa_memsize((sa_table *)tbl);
     return 0;
 }
 
@@ -970,17 +950,17 @@ rb_copy_generic_ivar(VALUE clone, VALUE obj)
         return;
     }
     if (st_lookup(generic_iv_tbl, (st_data_t)obj, &data)) {
-	st_table *tbl = (st_table *)data;
+	sa_table *tbl = (sa_table *)data;
 
         if (tbl->num_entries == 0)
             goto clear;
 
 	if (st_lookup(generic_iv_tbl, (st_data_t)clone, &data)) {
-	    st_free_table((st_table *)data);
-	    st_insert(generic_iv_tbl, (st_data_t)clone, (st_data_t)st_copy(tbl));
+	    sa_free_table((sa_table *)data);
+	    st_insert(generic_iv_tbl, (st_data_t)clone, (st_data_t)sa_copy(tbl));
 	}
 	else {
-	    st_add_direct(generic_iv_tbl, (st_data_t)clone, (st_data_t)st_copy(tbl));
+	    st_add_direct(generic_iv_tbl, (st_data_t)clone, (st_data_t)sa_copy(tbl));
 	    FL_SET(clone, FL_EXIVAR);
 	}
     }
@@ -990,7 +970,7 @@ static VALUE
 ivar_get(VALUE obj, ID id, int warn)
 {
     VALUE val, *ptr;
-    struct st_table *iv_index_tbl;
+    sa_table *iv_index_tbl;
     long len;
     st_data_t index;
 
@@ -1000,7 +980,7 @@ ivar_get(VALUE obj, ID id, int warn)
         ptr = ROBJECT_IVPTR(obj);
         iv_index_tbl = ROBJECT_IV_INDEX_TBL(obj);
         if (!iv_index_tbl) break;
-        if (!st_lookup(iv_index_tbl, (st_data_t)id, &index)) break;
+        if (!sa_lookup(iv_index_tbl, (sa_index_t)id, &index)) break;
         if (len <= (long)index) break;
         val = ptr[index];
         if (val != Qundef)
@@ -1008,7 +988,7 @@ ivar_get(VALUE obj, ID id, int warn)
 	break;
       case T_CLASS:
       case T_MODULE:
-	if (RCLASS_IV_TBL(obj) && st_lookup(RCLASS_IV_TBL(obj), (st_data_t)id, &index))
+	if (sa_lookup(RCLASS_IV_TBL(obj), (sa_index_t)id, &index))
 	    return (VALUE)index;
 	break;
       default:
@@ -1037,7 +1017,7 @@ rb_attr_get(VALUE obj, ID id)
 VALUE
 rb_ivar_set(VALUE obj, ID id, VALUE val)
 {
-    struct st_table *iv_index_tbl;
+    struct sa_table *iv_index_tbl;
     st_data_t index;
     long i, len;
     int ivar_extended;
@@ -1051,14 +1031,11 @@ rb_ivar_set(VALUE obj, ID id, VALUE val)
         if (!iv_index_tbl) {
             VALUE klass = rb_obj_class(obj);
             iv_index_tbl = RCLASS_IV_INDEX_TBL(klass);
-            if (!iv_index_tbl) {
-                iv_index_tbl = RCLASS_IV_INDEX_TBL(klass) = st_init_numtable();
-            }
         }
         ivar_extended = 0;
-        if (!st_lookup(iv_index_tbl, (st_data_t)id, &index)) {
+        if (!sa_lookup(iv_index_tbl, (sa_index_t)id, &index)) {
             index = iv_index_tbl->num_entries;
-            st_add_direct(iv_index_tbl, (st_data_t)id, index);
+            sa_insert(iv_index_tbl, (sa_index_t)id, index);
             ivar_extended = 1;
         }
         len = ROBJECT_NUMIV(obj);
@@ -1098,8 +1075,7 @@ rb_ivar_set(VALUE obj, ID id, VALUE val)
 	break;
       case T_CLASS:
       case T_MODULE:
-	if (!RCLASS_IV_TBL(obj)) RCLASS_IV_TBL(obj) = st_init_numtable();
-	st_insert(RCLASS_IV_TBL(obj), (st_data_t)id, val);
+	sa_insert(RCLASS_IV_TBL(obj), (sa_index_t)id, val);
         break;
       default:
 	generic_ivar_set(obj, id, val);
@@ -1112,13 +1088,13 @@ VALUE
 rb_ivar_defined(VALUE obj, ID id)
 {
     VALUE val;
-    struct st_table *iv_index_tbl;
+    struct sa_table *iv_index_tbl;
     st_data_t index;
     switch (TYPE(obj)) {
       case T_OBJECT:
         iv_index_tbl = ROBJECT_IV_INDEX_TBL(obj);
         if (!iv_index_tbl) break;
-        if (!st_lookup(iv_index_tbl, (st_data_t)id, &index)) break;
+        if (!sa_lookup(iv_index_tbl, (sa_index_t)id, &index)) break;
         if (ROBJECT_NUMIV(obj) <= (long)index) break;
         val = ROBJECT_IVPTR(obj)[index];
         if (val != Qundef)
@@ -1126,7 +1102,7 @@ rb_ivar_defined(VALUE obj, ID id)
 	break;
       case T_CLASS:
       case T_MODULE:
-	if (RCLASS_IV_TBL(obj) && st_lookup(RCLASS_IV_TBL(obj), (st_data_t)id, 0))
+	if (sa_lookup(RCLASS_IV_TBL(obj), (sa_index_t)id, 0))
 	    return Qtrue;
 	break;
       default:
@@ -1137,40 +1113,26 @@ rb_ivar_defined(VALUE obj, ID id)
     return Qfalse;
 }
 
-struct obj_ivar_tag {
-    VALUE obj;
-    int (*func)(ID key, VALUE val, st_data_t arg);
-    st_data_t arg;
-};
-
-static int
-obj_ivar_i(st_data_t key, st_data_t index, st_data_t arg)
-{
-    struct obj_ivar_tag *data = (struct obj_ivar_tag *)arg;
-    if ((long)index < ROBJECT_NUMIV(data->obj)) {
-        VALUE val = ROBJECT_IVPTR(data->obj)[(long)index];
-        if (val != Qundef) {
-            return (data->func)((ID)key, val, data->arg);
-        }
-    }
-    return ST_CONTINUE;
-}
-
 static void
 obj_ivar_each(VALUE obj, int (*func)(ANYARGS), st_data_t arg)
 {
-    st_table *tbl;
-    struct obj_ivar_tag data;
+    sa_table *tbl;
+    long numiv = ROBJECT_NUMIV(obj);
+    VALUE *vars = ROBJECT_IVPTR(obj);
 
     tbl = ROBJECT_IV_INDEX_TBL(obj);
-    if (!tbl)
+    if (!tbl || !numiv)
         return;
 
-    data.obj = obj;
-    data.func = (int (*)(ID key, VALUE val, st_data_t arg))func;
-    data.arg = arg;
-
-    st_foreach_safe(tbl, obj_ivar_i, (st_data_t)&data);
+    SA_FOREACH_START(tbl);
+    if ((long)value < numiv) {
+	VALUE val = vars[value];
+	if (val != Qundef) {
+	    if (((sa_iter_func)func)(entry->key, val, arg) == SA_STOP)
+		break;
+	}
+    }
+    SA_FOREACH_END();
 }
 
 void
@@ -1182,9 +1144,7 @@ rb_ivar_foreach(VALUE obj, int (*func)(ANYARGS), st_data_t arg)
 	break;
       case T_CLASS:
       case T_MODULE:
-	if (RCLASS_IV_TBL(obj)) {
-	    st_foreach_safe(RCLASS_IV_TBL(obj), func, arg);
-	}
+        sa_foreach(RCLASS_IV_TBL(obj), func, arg);
 	break;
       default:
 	if (!generic_iv_tbl) break;
@@ -1192,7 +1152,7 @@ rb_ivar_foreach(VALUE obj, int (*func)(ANYARGS), st_data_t arg)
 	    st_data_t tbl;
 
 	    if (st_lookup(generic_iv_tbl, (st_data_t)obj, &tbl)) {
-		st_foreach_safe((st_table *)tbl, func, arg);
+		sa_foreach((sa_table *)tbl, func, arg);
 	    }
 	}
 	break;
@@ -1202,11 +1162,11 @@ rb_ivar_foreach(VALUE obj, int (*func)(ANYARGS), st_data_t arg)
 st_index_t
 rb_ivar_count(VALUE obj)
 {
-    st_table *tbl;
+    sa_table *tbl;
     switch (TYPE(obj)) {
       case T_OBJECT:
 	if ((tbl = ROBJECT_IV_INDEX_TBL(obj)) != 0) {
-	    st_index_t i, count, num = tbl->num_entries;
+	    sa_index_t i, count, num = tbl->num_entries;
 	    const VALUE *const ivptr = ROBJECT_IVPTR(obj);
 	    for (i = count = 0; i < num; ++i) {
 		if (ivptr[i] != Qundef) {
@@ -1228,7 +1188,7 @@ rb_ivar_count(VALUE obj)
 	    st_data_t data;
 
 	    if (st_lookup(generic_iv_tbl, (st_data_t)obj, &data) &&
-		(tbl = (st_table *)data) != 0) {
+		(tbl = (sa_table *)data) != 0) {
 		return tbl->num_entries;
 	    }
 	}
@@ -1238,7 +1198,7 @@ rb_ivar_count(VALUE obj)
 }
 
 static int
-ivar_i(ID key, VALUE val, VALUE ary)
+ivar_i(sa_index_t key, VALUE val, VALUE ary)
 {
     if (rb_is_instance_id(key)) {
 	rb_ary_push(ary, ID2SYM(key));
@@ -1301,7 +1261,7 @@ rb_obj_remove_instance_variable(VALUE obj, VALUE name)
     VALUE val = Qnil;
     const ID id = rb_to_id(name);
     st_data_t n, v;
-    struct st_table *iv_index_tbl;
+    struct sa_table *iv_index_tbl;
     st_data_t index;
 
     if (!OBJ_UNTRUSTED(obj) && rb_safe_level() >= 4)
@@ -1315,7 +1275,7 @@ rb_obj_remove_instance_variable(VALUE obj, VALUE name)
       case T_OBJECT:
         iv_index_tbl = ROBJECT_IV_INDEX_TBL(obj);
         if (!iv_index_tbl) break;
-        if (!st_lookup(iv_index_tbl, (st_data_t)id, &index)) break;
+        if (!sa_lookup(iv_index_tbl, (sa_index_t)id, &index)) break;
         if (ROBJECT_NUMIV(obj) <= (long)index) break;
         val = ROBJECT_IVPTR(obj)[index];
         if (val != Qundef) {
@@ -1326,14 +1286,14 @@ rb_obj_remove_instance_variable(VALUE obj, VALUE name)
       case T_CLASS:
       case T_MODULE:
 	n = id;
-	if (RCLASS_IV_TBL(obj) && st_delete(RCLASS_IV_TBL(obj), &n, &v)) {
+	if (sa_delete(RCLASS_IV_TBL(obj), (sa_index_t)id, &v)) {
 	    return (VALUE)v;
 	}
 	break;
       default:
 	if (FL_TEST(obj, FL_EXIVAR) || rb_special_const_p(obj)) {
 	    v = val;
-	    if (generic_ivar_remove(obj, (st_data_t)id, &v)) {
+	    if (generic_ivar_remove(obj, id, &v)) {
 		return (VALUE)v;
 	    }
 	}
@@ -1410,20 +1370,20 @@ rb_mod_const_missing(VALUE klass, VALUE name)
 static void
 autoload_mark(void *ptr)
 {
-    rb_mark_tbl((st_table *)ptr);
+    rb_mark_sa_tbl((sa_table *)ptr);
 }
 
 static void
 autoload_free(void *ptr)
 {
-    st_free_table((st_table *)ptr);
+    sa_free_table((sa_table *)ptr);
 }
 
 static size_t
 autoload_memsize(const void *ptr)
 {
-    const st_table *tbl = ptr;
-    return st_memsize(tbl);
+    const sa_table *tbl = ptr;
+    return sa_memsize(tbl);
 }
 
 static const rb_data_type_t autoload_data_type = {
@@ -1432,14 +1392,14 @@ static const rb_data_type_t autoload_data_type = {
 };
 
 #define check_autoload_table(av) \
-    (struct st_table *)rb_check_typeddata((av), &autoload_data_type)
+    (struct sa_table *)rb_check_typeddata((av), &autoload_data_type)
 
 void
 rb_autoload(VALUE mod, ID id, const char *file)
 {
     st_data_t av;
     VALUE fn;
-    struct st_table *tbl;
+    struct sa_table *tbl;
 
     if (!rb_is_const_id(id)) {
 	rb_raise(rb_eNameError, "autoload must be constant name: %s", rb_id2name(id));
@@ -1448,43 +1408,41 @@ rb_autoload(VALUE mod, ID id, const char *file)
 	rb_raise(rb_eArgError, "empty file name");
     }
 
-    if ((tbl = RCLASS_CONST_TBL(mod)) && st_lookup(tbl, (st_data_t)id, &av) && ((rb_const_entry_t*)av)->value != Qundef)
+    if (sa_lookup(RCLASS_CONST_TBL(mod), (sa_index_t)id, &av) && ((rb_const_entry_t*)av)->value != Qundef)
 	return;
 
     rb_const_set(mod, id, Qundef);
     tbl = RCLASS_IV_TBL(mod);
-    if (tbl && st_lookup(tbl, (st_data_t)autoload, &av)) {
+    if (sa_lookup(tbl, (sa_index_t)autoload, &av)) {
 	tbl = check_autoload_table((VALUE)av);
     }
     else {
-	if (!tbl) tbl = RCLASS_IV_TBL(mod) = st_init_numtable();
 	av = (st_data_t)TypedData_Wrap_Struct(0, &autoload_data_type, 0);
-	st_add_direct(tbl, (st_data_t)autoload, av);
-	DATA_PTR(av) = tbl = st_init_numtable();
+	sa_insert(tbl, (sa_index_t)autoload, av);
+	DATA_PTR(av) = tbl = sa_new_table();
     }
     fn = rb_str_new2(file);
     FL_UNSET(fn, FL_TAINT);
     OBJ_FREEZE(fn);
-    st_insert(tbl, (st_data_t)id, (st_data_t)rb_node_newnode(NODE_MEMO, fn, rb_safe_level(), 0));
+    sa_insert(tbl, (sa_index_t)id, (st_data_t)rb_node_newnode(NODE_MEMO, fn, rb_safe_level(), 0));
 }
 
 static NODE*
 autoload_delete(VALUE mod, ID id)
 {
-    st_data_t val, load = 0, n = id;
+    st_data_t val, load = 0;
     rb_const_entry_t *ce;
 
-    st_delete(RCLASS_CONST_TBL(mod), &n, &val);
+    sa_delete(RCLASS_CONST_TBL(mod), (sa_index_t)id, &val);
     ce = (rb_const_entry_t*)val;
     if (ce) xfree(ce);
-    if (st_lookup(RCLASS_IV_TBL(mod), (st_data_t)autoload, &val)) {
-	struct st_table *tbl = check_autoload_table((VALUE)val);
+    if (sa_lookup(RCLASS_IV_TBL(mod), (sa_index_t)autoload, &val)) {
+	struct sa_table *tbl = check_autoload_table((VALUE)val);
 
-	st_delete(tbl, &n, &load);
+	sa_delete(tbl, (sa_index_t)id, &load);
 
 	if (tbl->num_entries == 0) {
-	    n = autoload;
-	    st_delete(RCLASS_IV_TBL(mod), &n, &val);
+	    sa_delete(RCLASS_IV_TBL(mod), (sa_index_t)autoload, &val);
 	}
     }
 
@@ -1509,14 +1467,14 @@ static NODE *
 autoload_node(VALUE mod, ID id, const char **loadingpath)
 {
     VALUE file;
-    struct st_table *tbl;
+    struct sa_table *tbl;
     st_data_t val;
     NODE *load;
     const char *loading;
     int safe;
 
-    if (!st_lookup(RCLASS_IV_TBL(mod), autoload, &val) ||
-	!(tbl = check_autoload_table((VALUE)val)) || !st_lookup(tbl, (st_data_t)id, &val)) {
+    if (!sa_lookup(RCLASS_IV_TBL(mod), (sa_index_t)autoload, &val) ||
+	!(tbl = check_autoload_table((VALUE)val)) || !sa_lookup(tbl, (sa_index_t)id, &val)) {
 	return 0;
     }
     load = (NODE *)val;
@@ -1541,10 +1499,10 @@ autoload_node(VALUE mod, ID id, const char **loadingpath)
 static int
 autoload_node_id(VALUE mod, ID id)
 {
-    struct st_table *tbl = RCLASS_CONST_TBL(mod);
+    struct sa_table *tbl = RCLASS_CONST_TBL(mod);
     st_data_t val;
 
-    if (!tbl || !st_lookup(tbl, (st_data_t)id, &val) || ((rb_const_entry_t*)val)->value != Qundef) {
+    if (!tbl || !sa_lookup(tbl, (sa_index_t)id, &val) || ((rb_const_entry_t*)val)->value != Qundef) {
 	return 0;
     }
     return 1;
@@ -1593,7 +1551,7 @@ rb_const_get_0(VALUE klass, ID id, int exclude, int recurse, int visibility)
     while (RTEST(tmp)) {
 	VALUE am = 0;
 	st_data_t data;
-	while (RCLASS_CONST_TBL(tmp) && st_lookup(RCLASS_CONST_TBL(tmp), (st_data_t)id, &data)) {
+	while (sa_lookup(RCLASS_CONST_TBL(tmp), (sa_index_t)id, &data)) {
 	    rb_const_entry_t *ce = (rb_const_entry_t *)data;
 	    if (visibility && ce->flag == CONST_PRIVATE) {
 		rb_name_error(id, "private constant %s::%s referenced", rb_class2name(klass), rb_id2name(id));
@@ -1686,12 +1644,12 @@ VALUE
 rb_const_remove(VALUE mod, ID id)
 {
     VALUE val;
-    st_data_t v, n = id;
+    st_data_t v;
 
     if (!OBJ_UNTRUSTED(mod) && rb_safe_level() >= 4)
 	rb_raise(rb_eSecurityError, "Insecure: can't remove constant");
     rb_check_frozen(mod);
-    if (!RCLASS_CONST_TBL(mod) || !st_delete(RCLASS_CONST_TBL(mod), &n, &v)) {
+    if (!sa_delete(RCLASS_CONST_TBL(mod), (sa_index_t)id, &v)) {
 	if (rb_const_defined_at(mod, id)) {
 	    rb_name_error(id, "cannot remove %s::%s",
 			  rb_class2name(mod), rb_id2name(id));
@@ -1711,27 +1669,20 @@ rb_const_remove(VALUE mod, ID id)
     return val;
 }
 
-static int
-sv_i(ID key, rb_const_entry_t *ce, st_table *tbl)
-{
-    if (rb_is_const_id(key)) {
-	if (!st_lookup(tbl, (st_data_t)key, 0)) {
-	    st_insert(tbl, (st_data_t)key, (st_data_t)ce);
-	}
-    }
-    return ST_CONTINUE;
-}
-
 void*
 rb_mod_const_at(VALUE mod, void *data)
 {
-    st_table *tbl = data;
+    sa_table *tbl = data;
     if (!tbl) {
-	tbl = st_init_numtable();
+	tbl = sa_new_table();
     }
-    if (RCLASS_CONST_TBL(mod)) {
-	st_foreach_safe(RCLASS_CONST_TBL(mod), sv_i, (st_data_t)tbl);
+    SA_FOREACH_START(RCLASS_CONST_TBL(mod));
+    if (rb_is_const_id(entry->key)) {
+	if (!sa_lookup(tbl, entry->key, 0)) {
+	    sa_insert(tbl, entry->key, value);
+	}
     }
+    SA_FOREACH_END();
     return tbl;
 }
 
@@ -1748,25 +1699,21 @@ rb_mod_const_of(VALUE mod, void *data)
     return data;
 }
 
-static int
-list_i(st_data_t key, st_data_t value, VALUE ary)
-{
-    ID sym = (ID)key;
-    rb_const_entry_t *ce = (rb_const_entry_t *)value;
-    if (ce->flag != CONST_PRIVATE) rb_ary_push(ary, ID2SYM(sym));
-    return ST_CONTINUE;
-}
-
 VALUE
 rb_const_list(void *data)
 {
-    st_table *tbl = data;
+    sa_table *tbl = data;
     VALUE ary;
 
     if (!tbl) return rb_ary_new2(0);
     ary = rb_ary_new2(tbl->num_entries);
-    st_foreach_safe(tbl, list_i, ary);
-    st_free_table(tbl);
+
+    SA_FOREACH_START(tbl);
+    rb_const_entry_t *ce = (rb_const_entry_t *)value;
+    if (ce->flag != CONST_PRIVATE) rb_ary_push(ary, ID2SYM(entry->key));
+    SA_FOREACH_END();
+
+    sa_free_table(tbl);
 
     return ary;
 }
@@ -1790,7 +1737,7 @@ VALUE
 rb_mod_constants(int argc, VALUE *argv, VALUE mod)
 {
     VALUE inherit;
-    st_table *tbl;
+    sa_table *tbl;
 
     if (argc == 0) {
 	inherit = Qtrue;
@@ -1817,7 +1764,7 @@ rb_const_defined_0(VALUE klass, ID id, int exclude, int recurse, int visibility)
     tmp = klass;
   retry:
     while (tmp) {
-	if (RCLASS_CONST_TBL(tmp) && st_lookup(RCLASS_CONST_TBL(tmp), (st_data_t)id, &value)) {
+	if (sa_lookup(RCLASS_CONST_TBL(tmp), (sa_index_t)id, &value)) {
 	    rb_const_entry_t *ce = (rb_const_entry_t *)value;
 	    if (visibility && ce->flag == CONST_PRIVATE) {
 		return (int)Qfalse;
@@ -1885,6 +1832,7 @@ void
 rb_const_set(VALUE klass, ID id, VALUE val)
 {
     rb_const_entry_t *ce;
+    st_data_t value;
     VALUE visibility = CONST_PUBLIC;
 
     if (NIL_P(klass)) {
@@ -1893,21 +1841,14 @@ rb_const_set(VALUE klass, ID id, VALUE val)
     }
 
     check_before_mod_set(klass, id, val, "constant");
-    if (!RCLASS_CONST_TBL(klass)) {
-	RCLASS_CONST_TBL(klass) = st_init_numtable();
-    }
-    else {
-	st_data_t value;
-
-	if (st_lookup(RCLASS_CONST_TBL(klass), (st_data_t)id, &value)) {
-	    rb_const_entry_t *ce = (rb_const_entry_t*)value;
-	    if (ce->value == Qundef)
-		autoload_delete(klass, id);
-	    else {
-		visibility = ce->flag;
-		rb_warn("already initialized constant %s", rb_id2name(id));
-	    }
-	}
+    if (sa_lookup(RCLASS_CONST_TBL(klass), (sa_index_t)id, &value)) {
+        rb_const_entry_t *ce = (rb_const_entry_t*)value;
+        if (ce->value == Qundef)
+            autoload_delete(klass, id);
+        else {
+            visibility = ce->flag;
+            rb_warn("already initialized constant %s", rb_id2name(id));
+        }
     }
 
     rb_vm_change_state();
@@ -1916,7 +1857,7 @@ rb_const_set(VALUE klass, ID id, VALUE val)
     ce->flag = (rb_const_flag_t)visibility;
     ce->value = val;
 
-    st_insert(RCLASS_CONST_TBL(klass), (st_data_t)id, (st_data_t)ce);
+    sa_insert(RCLASS_CONST_TBL(klass), (sa_index_t)id, (st_data_t)ce);
 }
 
 void
@@ -1958,8 +1899,7 @@ set_const_visibility(VALUE mod, int argc, VALUE *argv, rb_const_flag_t flag)
     for (i = 0; i < argc; i++) {
 	VALUE val = argv[i];
 	id = rb_to_id(val);
-	if (RCLASS_CONST_TBL(mod) &&
-	    st_lookup(RCLASS_CONST_TBL(mod), (st_data_t)id, &v)) {
+	if (sa_lookup(RCLASS_CONST_TBL(mod), (sa_index_t)id, &v)) {
 	    ((rb_const_entry_t*)v)->flag = flag;
 	}
 	else {
@@ -2008,7 +1948,7 @@ original_module(VALUE c)
 }
 
 #define CVAR_LOOKUP(v,r) do {\
-    if (RCLASS_IV_TBL(klass) && st_lookup(RCLASS_IV_TBL(klass),(st_data_t)id,(v))) {\
+    if (sa_lookup(RCLASS_IV_TBL(klass),(sa_index_t)id,(v))) {\
 	r;\
     }\
     if (FL_TEST(klass, FL_SINGLETON) ) {\
@@ -2027,7 +1967,7 @@ original_module(VALUE c)
 	klass = RCLASS_SUPER(klass);\
     }\
     while (klass) {\
-	if (RCLASS_IV_TBL(klass) && st_lookup(RCLASS_IV_TBL(klass),(st_data_t)id,(v))) {\
+	if (sa_lookup(RCLASS_IV_TBL(klass),(sa_index_t)id,(v))) {\
 	    r;\
 	}\
 	klass = RCLASS_SUPER(klass);\
@@ -2043,15 +1983,13 @@ rb_cvar_set(VALUE klass, ID id, VALUE val)
     CVAR_LOOKUP(0, {if (!front) front = klass; target = klass;});
     if (target) {
 	if (front && target != front) {
-	    st_data_t did = id;
-
 	    if (RTEST(ruby_verbose)) {
 		rb_warning("class variable %s of %s is overtaken by %s",
 			   rb_id2name(id), rb_class2name(original_module(front)),
 			   rb_class2name(original_module(target)));
 	    }
 	    if (BUILTIN_TYPE(front) == T_CLASS) {
-		st_delete(RCLASS_IV_TBL(front),&did,0);
+		sa_delete(RCLASS_IV_TBL(front),(sa_index_t)id,0);
 	    }
 	}
     }
@@ -2060,11 +1998,7 @@ rb_cvar_set(VALUE klass, ID id, VALUE val)
     }
 
     check_before_mod_set(target, id, val, "class variable");
-    if (!RCLASS_IV_TBL(target)) {
-	RCLASS_IV_TBL(target) = st_init_numtable();
-    }
-
-    st_insert(RCLASS_IV_TBL(target), (st_data_t)id, (st_data_t)val);
+    sa_insert(RCLASS_IV_TBL(target), (sa_index_t)id, (st_data_t)val);
 }
 
 VALUE
@@ -2080,15 +2014,13 @@ rb_cvar_get(VALUE klass, ID id)
 		      rb_id2name(id), rb_class2name(tmp));
     }
     if (front && target != front) {
-	st_data_t did = id;
-
 	if (RTEST(ruby_verbose)) {
 	    rb_warning("class variable %s of %s is overtaken by %s",
 		       rb_id2name(id), rb_class2name(original_module(front)),
 		       rb_class2name(original_module(target)));
 	}
 	if (BUILTIN_TYPE(front) == T_CLASS) {
-	    st_delete(RCLASS_IV_TBL(front),&did,0);
+	    sa_delete(RCLASS_IV_TBL(front),(sa_index_t)id,0);
 	}
     }
     return (VALUE)value;
@@ -2134,7 +2066,7 @@ rb_define_class_variable(VALUE klass, const char *name, VALUE val)
 }
 
 static int
-cv_i(ID key, VALUE value, VALUE ary)
+cv_i(sa_index_t key, VALUE value, VALUE ary)
 {
     if (rb_is_class_id(key)) {
 	VALUE kval = ID2SYM(key);
@@ -2167,7 +2099,7 @@ rb_mod_class_variables(VALUE obj)
     VALUE ary = rb_ary_new();
 
     if (RCLASS_IV_TBL(obj)) {
-	st_foreach_safe(RCLASS_IV_TBL(obj), cv_i, ary);
+	sa_foreach(RCLASS_IV_TBL(obj), cv_i, ary);
     }
     return ary;
 }
@@ -2196,7 +2128,7 @@ VALUE
 rb_mod_remove_cvar(VALUE mod, VALUE name)
 {
     const ID id = rb_to_id(name);
-    st_data_t val, n = id;
+    st_data_t val;
 
     if (!rb_is_class_id(id)) {
 	rb_name_error(id, "wrong class variable name %s", rb_id2name(id));
@@ -2204,7 +2136,7 @@ rb_mod_remove_cvar(VALUE mod, VALUE name)
     if (!OBJ_UNTRUSTED(mod) && rb_safe_level() >= 4)
 	rb_raise(rb_eSecurityError, "Insecure: can't remove class variable");
     rb_check_frozen(mod);
-    if (RCLASS_IV_TBL(mod) && st_delete(RCLASS_IV_TBL(mod), &n, &val)) {
+    if (RCLASS_IV_TBL(mod) && sa_delete(RCLASS_IV_TBL(mod), (sa_index_t)id, &val)) {
 	return (VALUE)val;
     }
     if (rb_cvar_defined(mod, id)) {
diff --git a/vm.c b/vm.c
index 63141ba..61653d7 100644
--- a/vm.c
+++ b/vm.c
@@ -1042,7 +1042,7 @@ static void
 add_opt_method(VALUE klass, ID mid, VALUE bop)
 {
     rb_method_entry_t *me;
-    if (st_lookup(RCLASS_M_TBL(klass), mid, (void *)&me) && me->def &&
+    if (sa_lookup(RCLASS_M_TBL(klass), (sa_index_t)mid, (void *)&me) && me->def &&
 	me->def->type == VM_METHOD_TYPE_CFUNC) {
 	st_insert(vm_opt_method_table, (st_data_t)me, (st_data_t)bop);
     }
@@ -1578,7 +1578,12 @@ rb_vm_mark(void *ptr)
 	RUBY_MARK_UNLESS_NULL(vm->thgroup_default);
 	RUBY_MARK_UNLESS_NULL(vm->mark_object_ary);
 	RUBY_MARK_UNLESS_NULL(vm->load_path);
+	RUBY_MARK_UNLESS_NULL(vm->load_path_snapshot);
+	RUBY_MARK_UNLESS_NULL(vm->load_path_check_cache);
+	RUBY_MARK_UNLESS_NULL(vm->expanded_load_path);
 	RUBY_MARK_UNLESS_NULL(vm->loaded_features);
+	RUBY_MARK_UNLESS_NULL(vm->loaded_features_snapshot);
+	RUBY_MARK_UNLESS_NULL(vm->loaded_features_index);
 	RUBY_MARK_UNLESS_NULL(vm->top_self);
 	RUBY_MARK_UNLESS_NULL(vm->coverages);
 	rb_gc_mark_locations(vm->special_exceptions, vm->special_exceptions + ruby_special_error_count);
diff --git a/vm_core.h b/vm_core.h
index 60146f0..7b25806 100644
--- a/vm_core.h
+++ b/vm_core.h
@@ -298,7 +298,12 @@ typedef struct rb_vm_struct {
     /* load */
     VALUE top_self;
     VALUE load_path;
+    VALUE load_path_snapshot;
+    VALUE load_path_check_cache;
+    VALUE expanded_load_path;
     VALUE loaded_features;
+    VALUE loaded_features_snapshot;
+    VALUE loaded_features_index;
     struct st_table *loading_table;
 
     /* signal */
diff --git a/vm_insnhelper.c b/vm_insnhelper.c
index 55152df..deeed9b 100644
--- a/vm_insnhelper.c
+++ b/vm_insnhelper.c
@@ -1187,7 +1187,7 @@ vm_get_ev_const(rb_thread_t *th, const rb_iseq_t *iseq,
 		st_data_t data;
 	      search_continue:
 		if (RCLASS_CONST_TBL(klass) &&
-		    st_lookup(RCLASS_CONST_TBL(klass), id, &data)) {
+		    sa_lookup(RCLASS_CONST_TBL(klass), (sa_index_t)id, &data)) {
 		    val = ((rb_const_entry_t*)data)->value;
 		    if (val == Qundef) {
 			if (am == klass) break;
@@ -1297,10 +1297,10 @@ vm_getivar(VALUE obj, ID id, IC ic)
 	    st_data_t index;
 	    long len = ROBJECT_NUMIV(obj);
 	    VALUE *ptr = ROBJECT_IVPTR(obj);
-	    struct st_table *iv_index_tbl = ROBJECT_IV_INDEX_TBL(obj);
+	    struct sa_table *iv_index_tbl = ROBJECT_IV_INDEX_TBL(obj);
 
 	    if (iv_index_tbl) {
-		if (st_lookup(iv_index_tbl, id, &index)) {
+		if (sa_lookup(iv_index_tbl, (sa_index_t)id, &index)) {
 		    if ((long)index < len) {
 			val = ptr[index];
 		    }
@@ -1350,9 +1350,9 @@ vm_setivar(VALUE obj, ID id, VALUE val, IC ic)
 	    }
 	}
 	else {
-	    struct st_table *iv_index_tbl = ROBJECT_IV_INDEX_TBL(obj);
+	    struct sa_table *iv_index_tbl = ROBJECT_IV_INDEX_TBL(obj);
 
-	    if (iv_index_tbl && st_lookup(iv_index_tbl, (st_data_t)id, &index)) {
+	    if (iv_index_tbl && sa_lookup(iv_index_tbl, (sa_index_t)id, &index)) {
 		ic->ic_class = klass;
 		ic->ic_value.index = index;
 		ic->ic_vmstat = GET_VM_STATE_VERSION();
diff --git a/vm_method.c b/vm_method.c
index 6e33603..6567440 100644
--- a/vm_method.c
+++ b/vm_method.c
@@ -2,38 +2,33 @@
  * This file is included by vm.c
  */
 
-#define CACHE_SIZE 0x800
-#define CACHE_MASK 0x7ff
-#define EXPR1(c,m) ((((c)>>3)^(m))&CACHE_MASK)
-
 static void rb_vm_check_redefinition_opt_method(const rb_method_entry_t *me);
 
 static ID object_id, respond_to_missing;
 static ID removed, singleton_removed, undefined, singleton_undefined;
 static ID added, singleton_added, attached;
 
-struct cache_entry {		/* method hash table. */
-    VALUE filled_version;        /* filled state version */
-    ID mid;			/* method's id */
-    VALUE klass;		/* receiver's class */
-    rb_method_entry_t *me;
-};
-
-static struct cache_entry cache[CACHE_SIZE];
 #define ruby_running (GET_VM()->running)
 /* int ruby_running = 0; */
 
+static int
+methods_cache_clear_callback(void *vstart, void *vend, size_t stride, void *data)
+{
+    VALUE v = (VALUE)vstart;
+    for (; v != (VALUE)vend; v += stride) {
+	switch(BUILTIN_TYPE(v)) {
+	    case T_CLASS:
+	    case T_MODULE:
+	    case T_ICLASS:
+		RCLASS(v)->cache->method_cache_version = 0;
+	}
+    }
+    return 0;
+}
 static void
 vm_clear_global_method_cache(void)
 {
-    struct cache_entry *ent, *end;
-
-    ent = cache;
-    end = ent + CACHE_SIZE;
-    while (ent < end) {
-	ent->filled_version = 0;
-	ent++;
-    }
+    rb_objspace_each_objects(methods_cache_clear_callback, NULL);
 }
 
 void
@@ -162,7 +157,7 @@ rb_method_entry_make(VALUE klass, ID mid, rb_method_type_t type,
 		     rb_method_definition_t *def, rb_method_flag_t noex)
 {
     rb_method_entry_t *me;
-    st_table *mtbl;
+    sa_table *mtbl;
     st_data_t data;
 
     if (NIL_P(klass)) {
@@ -190,7 +185,7 @@ rb_method_entry_make(VALUE klass, ID mid, rb_method_type_t type,
     mtbl = RCLASS_M_TBL(klass);
 
     /* check re-definition */
-    if (st_lookup(mtbl, mid, &data)) {
+    if (sa_lookup(mtbl, (sa_index_t)mid, &data)) {
 	rb_method_entry_t *old_me = (rb_method_entry_t *)data;
 	rb_method_definition_t *old_def = old_me->def;
 
@@ -248,7 +243,7 @@ rb_method_entry_make(VALUE klass, ID mid, rb_method_type_t type,
 	}
     }
 
-    st_insert(mtbl, mid, (st_data_t) me);
+    sa_insert(mtbl, (sa_index_t)mid, (st_data_t) me);
 
     return me;
 }
@@ -371,7 +366,7 @@ search_method(VALUE klass, ID id)
 	return 0;
     }
 
-    while (!st_lookup(RCLASS_M_TBL(klass), id, &body)) {
+    while (!sa_lookup(RCLASS_M_TBL(klass), (sa_index_t)id, &body)) {
 	klass = RCLASS_SUPER(klass);
 	if (!klass) {
 	    return 0;
@@ -393,20 +388,10 @@ rb_method_entry_get_without_cache(VALUE klass, ID id)
     rb_method_entry_t *me = search_method(klass, id);
 
     if (ruby_running) {
-	struct cache_entry *ent;
-	ent = cache + EXPR1(klass, id);
-	ent->filled_version = GET_VM_STATE_VERSION();
-	ent->klass = klass;
-
 	if (UNDEFINED_METHOD_ENTRY_P(me)) {
-	    ent->mid = id;
-	    ent->me = 0;
-	    me = 0;
-	}
-	else {
-	    ent->mid = id;
-	    ent->me = me;
+            me = 0;
 	}
+        sa_insert(&RCLASS(klass)->cache->m_cache_tbl, (sa_index_t)id, (st_data_t)me);
     }
 
     return me;
@@ -415,21 +400,23 @@ rb_method_entry_get_without_cache(VALUE klass, ID id)
 rb_method_entry_t *
 rb_method_entry(VALUE klass, ID id)
 {
-    struct cache_entry *ent;
+    rb_class_cache_t *cache = RCLASS(klass)->cache;
+    rb_method_entry_t *me;
 
-    ent = cache + EXPR1(klass, id);
-    if (ent->filled_version == GET_VM_STATE_VERSION() &&
-	ent->mid == id && ent->klass == klass) {
-	return ent->me;
+    if (cache->method_cache_version != GET_VM_STATE_VERSION()) {
+        sa_clear_no_free(&cache->m_cache_tbl);
+        cache->method_cache_version = GET_VM_STATE_VERSION();
+    }
+    else if (sa_lookup(&cache->m_cache_tbl, (sa_index_t)id, (st_data_t*)&me)) {
+        return me;
     }
-
     return rb_method_entry_get_without_cache(klass, id);
 }
 
 static void
 remove_method(VALUE klass, ID mid)
 {
-    st_data_t key, data;
+    st_data_t data;
     rb_method_entry_t *me = 0;
 
     if (klass == rb_cObject) {
@@ -443,14 +430,13 @@ remove_method(VALUE klass, ID mid)
 	rb_warn("removing `%s' may cause serious problems", rb_id2name(mid));
     }
 
-    if (!st_lookup(RCLASS_M_TBL(klass), mid, &data) ||
+    if (!sa_lookup(RCLASS_M_TBL(klass), (sa_index_t)mid, &data) ||
 	!(me = (rb_method_entry_t *)data) ||
 	(!me->def || me->def->type == VM_METHOD_TYPE_UNDEF)) {
 	rb_name_error(mid, "method `%s' not defined in %s",
 		      rb_id2name(mid), rb_class2name(klass));
     }
-    key = (st_data_t)mid;
-    st_delete(RCLASS_M_TBL(klass), &key, &data);
+    sa_delete(RCLASS_M_TBL(klass), (sa_index_t)mid, &data);
 
     rb_vm_check_redefinition_opt_method(me);
     rb_clear_cache_for_undef(klass, mid);
src/rvm/patches/ruby/1.9.3/p362/ruby-multilib.patch000066400000002321147511530530015536 0ustar00diff -u -wr a/tool/mkconfig.rb b/tool/mkconfig.rb
--- a/tool/mkconfig.rb  2012-10-08 05:57:16.948702976 +0200
+++ b/tool/mkconfig.rb  2011-08-13 15:17:30.000000000 +0200
@@ -40,6 +40,7 @@
 v_fast = []
 v_others = []
 vars = {}
+v_runtime = {}
 continued_name = nil
 continued_line = nil
 File.foreach "config.status" do |line|
@@ -118,7 +119,10 @@
     val = val.gsub(/\$(?:\$|\{?(\w+)\}?)/) {$1 ? "$(#{$1})" : $&}.dump
     case name
     when /^prefix$/
+      v_runtime[:prefix] = val.slice(1..-2)
       val = "(TOPDIR || DESTDIR + #{val})"
+    when /^libdir$/
+      v_runtime[:libdir] = File.basename(val.slice(1..-2))
     when /^ARCH_FLAG$/
       val = "arch_flag || #{val}" if universal
     when /^UNIVERSAL_ARCHNAMES$/
@@ -145,7 +149,7 @@

 drive = File::PATH_SEPARATOR == ';'

-prefix = "/lib/ruby/#{version}/#{arch}"
+prefix = "/#{v_runtime[:libdir]}/ruby/#{version}/#{arch}"
 print "  TOPDIR = File.dirname(__FILE__).chomp!(#{prefix.dump})\n"
 print "  DESTDIR = ", (drive ? "TOPDIR && TOPDIR[/\\A[a-z]:/i] || " : ""), "'' unless defined? DESTDIR\n"
 print <<'ARCH' if universal
@@ -190,6 +194,7 @@
     x
   end
 end
+v_others.map!{|x| x.gsub(v_runtime[:prefix], "$(prefix)") }
 v_others.compact!

 if $install_name
src/rvm/patches/ruby/1.9.3/p362/segfault_fix_7629.diff000066400000002010147511530530015711 0ustar00--- a/vm.c  (revision 38725)
+++ b/vm.c  (revision 38726)
@@ -468,10 +468,18 @@
 }

 static VALUE vm_make_proc_from_block(rb_thread_t *th, rb_block_t *block);
+static VALUE vm_make_env_object(rb_thread_t * th, rb_control_frame_t *cfp, VALUE *blockprocptr);

 VALUE
 rb_vm_make_env_object(rb_thread_t * th, rb_control_frame_t *cfp)
 {
+    VALUE blockprocval;
+    return vm_make_env_object(th, cfp, &blockprocval);
+}
+
+static VALUE
+vm_make_env_object(rb_thread_t *th, rb_control_frame_t *cfp, VALUE *blockprocptr)
+{
     VALUE envval;
     VALUE *lfp;
     rb_block_t *blockptr;
@@ -489,6 +497,7 @@
  rb_proc_t *p;
  GetProcPtr(blockprocval, p);
  lfp[0] = GC_GUARDED_PTR(&p->block);
+ *blockprocptr = blockprocval;
     }

     envval = vm_make_env_each(th, cfp, cfp->dfp, cfp->lfp);
@@ -559,7 +568,7 @@
  rb_bug("rb_vm_make_proc: Proc value is already created.");
     }

-    envval = rb_vm_make_env_object(th, cfp);
+    envval = vm_make_env_object(th, cfp, &blockprocval);

     if (PROCDEBUG) {
  check_env_value(envval);
src/rvm/patches/ruby/1.9.3/CVE-2015-1855-p484.patch000066400000030315147511530530014347 0ustar00--- a/ext/openssl/lib/openssl/ssl-internal.rb
+++ b/ext/openssl/lib/openssl/ssl-internal.rb
@@ -135,8 +135,7 @@ module OpenSSL
           case san.tag
           when 2 # dNSName in GeneralName (RFC5280)
             should_verify_common_name = false
-            reg = Regexp.escape(san.value).gsub(/\\\*/, "[^.]+")
-            return true if /\A#{reg}\z/i =~ hostname
+            return true if verify_hostname(hostname, san.value)
           when 7 # iPAddress in GeneralName (RFC5280)
             should_verify_common_name = false
             # follows GENERAL_NAME_print() in x509v3/v3_alt.c
@@ -151,8 +150,7 @@ module OpenSSL
       if should_verify_common_name
         cert.subject.to_a.each{|oid, value|
           if oid == "CN"
-            reg = Regexp.escape(value).gsub(/\\\*/, "[^.]+")
-            return true if /\A#{reg}\z/i =~ hostname
+            return true if verify_hostname(hostname, value)
           end
         }
       end
@@ -160,11 +158,67 @@ module OpenSSL
     end
     module_function :verify_certificate_identity
 
+    def verify_hostname(hostname, san) # :nodoc:
+      # RFC 5280, IA5String is limited to the set of ASCII characters
+      return false unless san.ascii_only?
+      return false unless hostname.ascii_only?
+
+      # See RFC 6125, section 6.4.1
+      # Matching is case-insensitive.
+      san_parts = san.downcase.split(".")
+
+      # TODO: this behavior should probably be more strict
+      return san == hostname if san_parts.size < 2
+
+      # Matching is case-insensitive.
+      host_parts = hostname.downcase.split(".")
+
+      # RFC 6125, section 6.4.3, subitem 2.
+      # If the wildcard character is the only character of the left-most
+      # label in the presented identifier, the client SHOULD NOT compare
+      # against anything but the left-most label of the reference
+      # identifier (e.g., *.example.com would match foo.example.com but
+      # not bar.foo.example.com or example.com).
+      return false unless san_parts.size == host_parts.size
+
+      # RFC 6125, section 6.4.3, subitem 1.
+      # The client SHOULD NOT attempt to match a presented identifier in
+      # which the wildcard character comprises a label other than the
+      # left-most label (e.g., do not match bar.*.example.net).
+      return false unless verify_wildcard(host_parts.shift, san_parts.shift)
+
+      san_parts.join(".") == host_parts.join(".")
+    end
+    module_function :verify_hostname
+
+    def verify_wildcard(domain_component, san_component) # :nodoc:
+      parts = san_component.split("*", -1)
+
+      return false if parts.size > 2
+      return san_component == domain_component if parts.size == 1
+
+      # RFC 6125, section 6.4.3, subitem 3.
+      # The client SHOULD NOT attempt to match a presented identifier
+      # where the wildcard character is embedded within an A-label or
+      # U-label of an internationalized domain name.
+      return false if domain_component.start_with?("xn--") && san_component != "*"
+
+      parts[0].length + parts[1].length < domain_component.length &&
+      domain_component.start_with?(parts[0]) &&
+      domain_component.end_with?(parts[1])
+    end
+    module_function :verify_wildcard
+
     class SSLSocket
       include Buffering
       include SocketForwarder
       include Nonblock
 
+      ##
+      # Perform hostname verification after an SSL connection is established
+      #
+      # This method MUST be called after calling #connect to ensure that the
+      # hostname of a remote peer has been verified.
       def post_connection_check(hostname)
         unless OpenSSL::SSL.verify_certificate_identity(peer_cert, hostname)
           raise SSLError, "hostname does not match the server certificate"
--- a/test/openssl/test_ssl.rb
+++ b/test/openssl/test_ssl.rb
@@ -1,3 +1,5 @@
+# encoding: utf-8
+
 require_relative "utils"
 
 if defined?(OpenSSL)
@@ -363,6 +365,155 @@ class OpenSSL::TestSSL < OpenSSL::SSLTestCase
     end
   end
 
+  def test_verify_hostname
+    assert_equal(true,  OpenSSL::SSL.verify_hostname("www.example.com", "*.example.com"))
+    assert_equal(false, OpenSSL::SSL.verify_hostname("www.subdomain.example.com", "*.example.com"))
+  end
+
+  def test_verify_wildcard
+    assert_equal(false, OpenSSL::SSL.verify_wildcard("foo", "x*"))
+    assert_equal(true,  OpenSSL::SSL.verify_wildcard("foo", "foo"))
+    assert_equal(true,  OpenSSL::SSL.verify_wildcard("foo", "f*"))
+    assert_equal(true,  OpenSSL::SSL.verify_wildcard("foo", "*"))
+    assert_equal(false, OpenSSL::SSL.verify_wildcard("abc*bcd", "abcd"))
+    assert_equal(false, OpenSSL::SSL.verify_wildcard("xn--qdk4b9b", "x*"))
+    assert_equal(false, OpenSSL::SSL.verify_wildcard("xn--qdk4b9b", "*--qdk4b9b"))
+    assert_equal(true,  OpenSSL::SSL.verify_wildcard("xn--qdk4b9b", "xn--qdk4b9b"))
+  end
+
+  # Comments in this test is excerpted from http://tools.ietf.org/html/rfc6125#page-27
+  def test_post_connection_check_wildcard_san
+    # case-insensitive ASCII comparison
+    # RFC 6125, section 6.4.1
+    #
+    # "..matching of the reference identifier against the presented identifier
+    # is performed by comparing the set of domain name labels using a
+    # case-insensitive ASCII comparison, as clarified by [DNS-CASE] (e.g.,
+    # "WWW.Example.Com" would be lower-cased to "www.example.com" for
+    # comparison purposes)
+    assert_equal(true, OpenSSL::SSL.verify_certificate_identity(
+      create_cert_with_san('DNS:*.example.com'), 'www.example.com'))
+    assert_equal(true, OpenSSL::SSL.verify_certificate_identity(
+      create_cert_with_san('DNS:*.Example.COM'), 'www.example.com'))
+    assert_equal(true, OpenSSL::SSL.verify_certificate_identity(
+      create_cert_with_san('DNS:*.example.com'), 'WWW.Example.COM'))
+    # 1.  The client SHOULD NOT attempt to match a presented identifier in
+    #     which the wildcard character comprises a label other than the
+    #     left-most label (e.g., do not match bar.*.example.net).
+    assert_equal(false, OpenSSL::SSL.verify_certificate_identity(
+      create_cert_with_san('DNS:www.*.com'), 'www.example.com'))
+    # 2.  If the wildcard character is the only character of the left-most
+    #     label in the presented identifier, the client SHOULD NOT compare
+    #     against anything but the left-most label of the reference
+    #     identifier (e.g., *.example.com would match foo.example.com but
+    #     not bar.foo.example.com or example.com).
+    assert_equal(true, OpenSSL::SSL.verify_certificate_identity(
+      create_cert_with_san('DNS:*.example.com'), 'foo.example.com'))
+    assert_equal(false, OpenSSL::SSL.verify_certificate_identity(
+      create_cert_with_san('DNS:*.example.com'), 'bar.foo.example.com'))
+    # 3.  The client MAY match a presented identifier in which the wildcard
+    #     character is not the only character of the label (e.g.,
+    #     baz*.example.net and *baz.example.net and b*z.example.net would
+    #     be taken to match baz1.example.net and foobaz.example.net and
+    #     buzz.example.net, respectively).  ...
+    assert_equal(true, OpenSSL::SSL.verify_certificate_identity(
+      create_cert_with_san('DNS:baz*.example.com'), 'baz1.example.com'))
+    assert_equal(true, OpenSSL::SSL.verify_certificate_identity(
+      create_cert_with_san('DNS:*baz.example.com'), 'foobaz.example.com'))
+    assert_equal(true, OpenSSL::SSL.verify_certificate_identity(
+      create_cert_with_san('DNS:b*z.example.com'), 'buzz.example.com'))
+    # Section 6.4.3 of RFC6125 states that client should NOT match identifier
+    # where wildcard is other than left-most label.
+    #
+    # Also implicitly mentions the wildcard character only in singular form,
+    # and discourages matching against more than one wildcard.
+    #
+    # See RFC 6125, section 7.2, subitem 2.
+    assert_equal(false, OpenSSL::SSL.verify_certificate_identity(
+      create_cert_with_san('DNS:*b*.example.com'), 'abc.example.com'))
+    assert_equal(false, OpenSSL::SSL.verify_certificate_identity(
+      create_cert_with_san('DNS:*b*.example.com'), 'ab.example.com'))
+    assert_equal(false, OpenSSL::SSL.verify_certificate_identity(
+      create_cert_with_san('DNS:*b*.example.com'), 'bc.example.com'))
+    #                                ...  However, the client SHOULD NOT
+    #   attempt to match a presented identifier where the wildcard
+    #   character is embedded within an A-label or U-label [IDNA-DEFS] of
+    #   an internationalized domain name [IDNA-PROTO].
+    assert_equal(true, OpenSSL::SSL.verify_certificate_identity(
+      create_cert_with_san('DNS:xn*.example.com'), 'xn1ca.example.com'))
+    # part of A-label
+    assert_equal(false, OpenSSL::SSL.verify_certificate_identity(
+      create_cert_with_san('DNS:xn--*.example.com'), 'xn--1ca.example.com'))
+    # part of U-label
+    # dNSName in RFC5280 is an IA5String so U-label should NOT be allowed
+    # regardless of wildcard.
+    #
+    # See Section 7.2 of RFC 5280:
+    #   IA5String is limited to the set of ASCII characters.
+    assert_equal(false, OpenSSL::SSL.verify_certificate_identity(
+      create_cert_with_name('á*.example.com'), 'á1.example.com'))
+  end
+
+  def test_post_connection_check_wildcard_cn
+    assert_equal(true, OpenSSL::SSL.verify_certificate_identity(
+      create_cert_with_name('*.example.com'), 'www.example.com'))
+    assert_equal(true, OpenSSL::SSL.verify_certificate_identity(
+      create_cert_with_name('*.Example.COM'), 'www.example.com'))
+    assert_equal(true, OpenSSL::SSL.verify_certificate_identity(
+      create_cert_with_name('*.example.com'), 'WWW.Example.COM'))
+    assert_equal(false, OpenSSL::SSL.verify_certificate_identity(
+      create_cert_with_name('www.*.com'), 'www.example.com'))
+    assert_equal(true, OpenSSL::SSL.verify_certificate_identity(
+      create_cert_with_name('*.example.com'), 'foo.example.com'))
+    assert_equal(false, OpenSSL::SSL.verify_certificate_identity(
+      create_cert_with_name('*.example.com'), 'bar.foo.example.com'))
+    assert_equal(true, OpenSSL::SSL.verify_certificate_identity(
+      create_cert_with_name('baz*.example.com'), 'baz1.example.com'))
+    assert_equal(true, OpenSSL::SSL.verify_certificate_identity(
+      create_cert_with_name('*baz.example.com'), 'foobaz.example.com'))
+    assert_equal(true, OpenSSL::SSL.verify_certificate_identity(
+      create_cert_with_name('b*z.example.com'), 'buzz.example.com'))
+    # Section 6.4.3 of RFC6125 states that client should NOT match identifier
+    # where wildcard is other than left-most label.
+    #
+    # Also implicitly mentions the wildcard character only in singular form,
+    # and discourages matching against more than one wildcard.
+    #
+    # See RFC 6125, section 7.2, subitem 2.
+    assert_equal(false, OpenSSL::SSL.verify_certificate_identity(
+      create_cert_with_name('*b*.example.com'), 'abc.example.com'))
+    assert_equal(false, OpenSSL::SSL.verify_certificate_identity(
+      create_cert_with_name('*b*.example.com'), 'ab.example.com'))
+    assert_equal(false, OpenSSL::SSL.verify_certificate_identity(
+      create_cert_with_name('*b*.example.com'), 'bc.example.com'))
+    assert_equal(true, OpenSSL::SSL.verify_certificate_identity(
+      create_cert_with_name('xn*.example.com'), 'xn1ca.example.com'))
+    assert_equal(false, OpenSSL::SSL.verify_certificate_identity(
+      create_cert_with_name('xn--*.example.com'), 'xn--1ca.example.com'))
+    # part of U-label
+    # Subject in RFC5280 states case-insensitive ASCII comparison.
+    #
+    # See Section 7.2 of RFC 5280:
+    #   IA5String is limited to the set of ASCII characters.
+    assert_equal(false, OpenSSL::SSL.verify_certificate_identity(
+      create_cert_with_name('á*.example.com'), 'á1.example.com'))
+  end
+
+  def create_cert_with_san(san)
+    ef = OpenSSL::X509::ExtensionFactory.new
+    cert = OpenSSL::X509::Certificate.new
+    cert.subject = OpenSSL::X509::Name.parse("/DC=some/DC=site/CN=Some Site")
+    ext = ef.create_ext('subjectAltName', san)
+    cert.add_extension(ext)
+    cert
+  end
+
+  def create_cert_with_name(name)
+    cert = OpenSSL::X509::Certificate.new
+    cert.subject = OpenSSL::X509::Name.new([['DC', 'some'], ['DC', 'site'], ['CN', name]])
+    cert
+  end
+
   # Create NULL byte SAN certificate
   def create_null_byte_SAN_certificate(critical = false)
     ef = OpenSSL::X509::ExtensionFactory.new
src/rvm/patches/ruby/1.9.3/p286/ruby-multilib.patch000066400000002321147511530530015543 0ustar00diff -u -wr a/tool/mkconfig.rb b/tool/mkconfig.rb
--- a/tool/mkconfig.rb  2012-10-08 05:57:16.948702976 +0200
+++ b/tool/mkconfig.rb  2011-08-13 15:17:30.000000000 +0200
@@ -40,6 +40,7 @@
 v_fast = []
 v_others = []
 vars = {}
+v_runtime = {}
 continued_name = nil
 continued_line = nil
 File.foreach "config.status" do |line|
@@ -118,7 +119,10 @@
     val = val.gsub(/\$(?:\$|\{?(\w+)\}?)/) {$1 ? "$(#{$1})" : $&}.dump
     case name
     when /^prefix$/
+      v_runtime[:prefix] = val.slice(1..-2)
       val = "(TOPDIR || DESTDIR + #{val})"
+    when /^libdir$/
+      v_runtime[:libdir] = File.basename(val.slice(1..-2))
     when /^ARCH_FLAG$/
       val = "arch_flag || #{val}" if universal
     when /^UNIVERSAL_ARCHNAMES$/
@@ -145,7 +149,7 @@

 drive = File::PATH_SEPARATOR == ';'

-prefix = "/lib/ruby/#{version}/#{arch}"
+prefix = "/#{v_runtime[:libdir]}/ruby/#{version}/#{arch}"
 print "  TOPDIR = File.dirname(__FILE__).chomp!(#{prefix.dump})\n"
 print "  DESTDIR = ", (drive ? "TOPDIR && TOPDIR[/\\A[a-z]:/i] || " : ""), "'' unless defined? DESTDIR\n"
 print <<'ARCH' if universal
@@ -190,6 +194,7 @@
     x
   end
 end
+v_others.map!{|x| x.gsub(v_runtime[:prefix], "$(prefix)") }
 v_others.compact!

 if $install_name
src/rvm/patches/ruby/1.9.3/p286/cflags.patch000066400000002231147511530530014202 0ustar00--- a/configure.in
+++ b/configure.in
@@ -267,11 +267,9 @@
     cflagspat="$cflagspat;s|"`eval echo '"'"${debugflags}"'"' | sed 's/[[][|.*]]/\\&/g;s/^ */ /;s/ *$/ /'`'| |g'
 test -z "warnflags" ||
     cflagspat="$cflagspat;s|"`eval echo '"'"${warnflags}"'"' | sed 's/[[][|.*]]/\\&/g;s/^ */ /;s/ *$/ /'`'| |g'
-if test -z "${CFLAGS+set}"; then
-    cflags=`echo " $cflags " | sed "$cflagspat;s/^ *//;s/ *$//"`
-    orig_cflags="$cflags"
-    cflags="$cflags "'${optflags} ${debugflags} ${warnflags}'
-fi
+cflags=`echo " $cflags " | sed "$cflagspat;s/^ *//;s/ *$//"`
+orig_cflags="$cflags"
+cflags="$cflags "'${optflags} ${debugflags} ${warnflags}'
 if test -z "${CXXFLAGS+set}"; then
     cxxflags=`echo " $cxxflags " | sed "$cflagspat;s/^ *//;s/ *$//"`
     orig_cxxflags="$cxxflags"
@@ -511,7 +509,8 @@
     ])
 fi

-test -z "${ac_env_CFLAGS_set}" -a -n "${cflags+set}" && eval CFLAGS="\"$cflags $ARCH_FLAG\""
+test -z "${ac_env_CFLAGS_set}" && CFLAGS="$ARCH_FLAG"
+test -n "${cflags:+set}" && eval CFLAGS="\"$cflags\${CFLAGS:+ $CFLAGS}\""
 test -z "${ac_env_CXXFLAGS_set}" -a -n "${cxxflags+set}" && eval CXXFLAGS="\"$cxxflags $ARCH_FLAG\""

 dnl check for large file stuff
src/rvm/patches/ruby/1.9.3/p286/falcon.diff000066400000370602147511530530014030 0ustar00diff --git a/common.mk b/common.mk
index eb89a2b..59cdfe4 100644
--- a/common.mk
+++ b/common.mk
@@ -630,7 +630,8 @@ file.$(OBJEXT): {$(VPATH)}file.c $(RUBY_H_INCLUDES) {$(VPATH)}io.h \
 gc.$(OBJEXT): {$(VPATH)}gc.c $(RUBY_H_INCLUDES) {$(VPATH)}re.h \
   {$(VPATH)}regex.h $(ENCODING_H_INCLUDES) $(VM_CORE_H_INCLUDES) \
   {$(VPATH)}gc.h {$(VPATH)}io.h {$(VPATH)}eval_intern.h {$(VPATH)}util.h \
-  {$(VPATH)}debug.h {$(VPATH)}internal.h {$(VPATH)}constant.h
+  {$(VPATH)}debug.h {$(VPATH)}internal.h {$(VPATH)}constant.h \
+  {$(VPATH)}pool_alloc.inc.h {$(VPATH)}pool_alloc.h
 hash.$(OBJEXT): {$(VPATH)}hash.c $(RUBY_H_INCLUDES) {$(VPATH)}util.h \
   $(ENCODING_H_INCLUDES)
 inits.$(OBJEXT): {$(VPATH)}inits.c $(RUBY_H_INCLUDES) \
@@ -693,7 +694,7 @@ signal.$(OBJEXT): {$(VPATH)}signal.c $(RUBY_H_INCLUDES) \
   $(VM_CORE_H_INCLUDES) {$(VPATH)}debug.h
 sprintf.$(OBJEXT): {$(VPATH)}sprintf.c $(RUBY_H_INCLUDES) {$(VPATH)}re.h \
   {$(VPATH)}regex.h {$(VPATH)}vsnprintf.c $(ENCODING_H_INCLUDES)
-st.$(OBJEXT): {$(VPATH)}st.c $(RUBY_H_INCLUDES)
+st.$(OBJEXT): {$(VPATH)}st.c $(RUBY_H_INCLUDES) {$(VPATH)}pool_alloc.h
 strftime.$(OBJEXT): {$(VPATH)}strftime.c $(RUBY_H_INCLUDES) \
   {$(VPATH)}timev.h
 string.$(OBJEXT): {$(VPATH)}string.c $(RUBY_H_INCLUDES) {$(VPATH)}re.h \
diff --git a/configure.in b/configure.in
index 6d24689..1e15b10 100644
--- a/configure.in
+++ b/configure.in
@@ -1315,6 +1315,29 @@ main() {
 CFLAGS="$save_CFLAGS"])
 AC_DEFINE_UNQUOTED(GC_MARK_STACKFRAME_WORD, $rb_cv_gc_mark_stackframe_word)
 
+AS_CASE(["$target_os"],
+[openbsd*], [
+  AC_CACHE_CHECK(for heap align log on openbsd, rb_cv_page_size_log,
+    [rb_cv_page_size_log=no
+     for page_log in 12 13; do
+       AC_TRY_RUN([
+#include <math.h>
+#include <unistd.h>
+
+int
+main() {
+  if ((int)log2((double)sysconf(_SC_PAGESIZE)) != $page_log) return 1;
+  return 0;
+}
+       ],
+       rb_cv_page_size_log="$page_log"; break)
+     done])
+  if test $rb_cv_page_size_log != no; then
+    AC_DEFINE_UNQUOTED(HEAP_ALIGN_LOG, $rb_cv_page_size_log)
+  else
+    AC_DEFINE_UNQUOTED(HEAP_ALIGN_LOG, 12)
+  fi
+])
 
 dnl Checks for library functions.
 AC_TYPE_GETGROUPS
@@ -1415,7 +1438,8 @@ AC_CHECK_FUNCS(fmod killpg wait4 waitpid fork spawnv syscall __syscall chroot ge
 	      setsid telldir seekdir fchmod cosh sinh tanh log2 round\
 	      setuid setgid daemon select_large_fdset setenv unsetenv\
               mktime timegm gmtime_r clock_gettime gettimeofday poll ppoll\
-              pread sendfile shutdown sigaltstack dl_iterate_phdr)
+              pread sendfile shutdown sigaltstack dl_iterate_phdr\
+              dup3 pipe2 posix_memalign memalign)
 
 AC_CACHE_CHECK(for unsetenv returns a value, rb_cv_unsetenv_return_value,
   [AC_TRY_COMPILE([
diff --git a/ext/-test-/st/numhash/numhash.c b/ext/-test-/st/numhash/numhash.c
index e186cd4..53d9e1b 100644
--- a/ext/-test-/st/numhash/numhash.c
+++ b/ext/-test-/st/numhash/numhash.c
@@ -54,7 +54,7 @@ numhash_i(st_data_t key, st_data_t value, st_data_t arg, int error)
 static VALUE
 numhash_each(VALUE self)
 {
-    return st_foreach((st_table *)DATA_PTR(self), numhash_i, self) ? Qtrue : Qfalse;
+    return st_foreach_check((st_table *)DATA_PTR(self), numhash_i, self, 0) ? Qtrue : Qfalse;
 }
 
 void
diff --git a/file.c b/file.c
index 67b281a..e89a559 100644
--- a/file.c
+++ b/file.c
@@ -164,6 +164,10 @@ rb_get_path_check(VALUE obj, int level)
     }
     StringValue(tmp);
 
+    if (RBASIC(obj)->klass == rb_cExpandedPath) {
+        return obj;
+    }
+
     tmp = file_path_convert(tmp);
     if (obj != tmp && insecure_obj_p(tmp, level)) {
 	rb_insecure_operation();
@@ -2864,6 +2868,16 @@ file_expand_path(VALUE fname, VALUE dname, int abs_mode, VALUE result)
     BUFINIT();
     tainted = OBJ_TAINTED(fname);
 
+    if (RBASIC(fname)->klass == rb_cExpandedPath) {
+        size_t dlen = RSTRING_LEN(fname);
+        BUFCHECK(dlen > buflen);
+        strncpy(buf, RSTRING_PTR(fname), dlen + 1);
+        rb_str_set_len(result, dlen);
+        rb_enc_associate(result, rb_enc_check(result, fname));
+        ENC_CODERANGE_CLEAR(result);
+        return result;
+    }
+
     if (s[0] == '~' && abs_mode == 0) {      /* execute only if NOT absolute_path() */
 	long userlen = 0;
 	tainted = 1;
diff --git a/gc.c b/gc.c
index e65d0ec..a72a855 100644
--- a/gc.c
+++ b/gc.c
@@ -20,10 +20,12 @@
 #include "vm_core.h"
 #include "internal.h"
 #include "gc.h"
+#include "pool_alloc.h"
 #include "constant.h"
 #include <stdio.h>
 #include <setjmp.h>
 #include <sys/types.h>
+#include <assert.h>
 
 #ifdef HAVE_SYS_TIME_H
 #include <sys/time.h>
@@ -35,7 +37,12 @@
 
 #if defined _WIN32 || defined __CYGWIN__
 #include <windows.h>
+#elif defined(HAVE_POSIX_MEMALIGN)
+#elif defined(HAVE_MEMALIGN)
+#include <malloc.h>
 #endif
+static void aligned_free(void *);
+static void *aligned_malloc(size_t alignment, size_t size);
 
 #ifdef HAVE_VALGRIND_MEMCHECK_H
 # include <valgrind/memcheck.h>
@@ -84,10 +91,12 @@ typedef struct {
     unsigned int initial_malloc_limit;
     unsigned int initial_heap_min_slots;
     unsigned int initial_free_min;
+#if defined(ENABLE_VM_OBJSPACE) && ENABLE_VM_OBJSPACE
     int gc_stress;
+#endif
 } ruby_gc_params_t;
 
-ruby_gc_params_t initial_params = {
+static ruby_gc_params_t initial_params = {
     GC_MALLOC_LIMIT,
     HEAP_MIN_SLOTS,
     FREE_MIN,
@@ -103,7 +112,10 @@ ruby_gc_params_t initial_params = {
 int ruby_gc_debug_indent = 0;
 
 /* for GC profile */
+#ifndef GC_PROFILE_MORE_DETAIL
 #define GC_PROFILE_MORE_DETAIL 0
+#endif
+
 typedef struct gc_profile_record {
     double gc_time;
     double gc_mark_time;
@@ -301,17 +313,20 @@ typedef struct RVALUE {
 #endif
 
 struct heaps_slot {
-    void *membase;
-    RVALUE *slot;
-    size_t limit;
+    struct heaps_header *membase;
+    RVALUE *freelist;
     struct heaps_slot *next;
     struct heaps_slot *prev;
+    struct heaps_slot *free_next;
+    uintptr_t bits[1];
 };
 
-struct sorted_heaps_slot {
+struct heaps_header {
+    struct heaps_slot *base;
+    uintptr_t *bits;
     RVALUE *start;
     RVALUE *end;
-    struct heaps_slot *slot;
+    size_t limit;
 };
 
 struct gc_list {
@@ -319,7 +334,27 @@ struct gc_list {
     struct gc_list *next;
 };
 
+#ifndef CALC_EXACT_MALLOC_SIZE
 #define CALC_EXACT_MALLOC_SIZE 0
+#endif
+
+#ifdef POOL_ALLOC_API
+/* POOL ALLOC API */
+#define POOL_ALLOC_PART 1
+#include "pool_alloc.inc.h"
+#undef POOL_ALLOC_PART
+
+typedef struct pool_layout_t pool_layout_t;
+struct pool_layout_t {
+    pool_header
+      p6,  /* st_table && st_table_entry */
+      p11;  /* st_table.bins init size */
+} pool_layout = {
+    INIT_POOL(void*[6]),
+    INIT_POOL(void*[11])
+};
+static void pool_finalize_header(pool_header *header);
+#endif
 
 typedef struct rb_objspace {
     struct {
@@ -330,16 +365,19 @@ typedef struct rb_objspace {
 	size_t allocations;
 #endif
     } malloc_params;
+#ifdef POOL_ALLOC_API
+    pool_layout_t *pool_headers;
+#endif
     struct {
 	size_t increment;
 	struct heaps_slot *ptr;
 	struct heaps_slot *sweep_slots;
-	struct sorted_heaps_slot *sorted;
+	struct heaps_slot *free_slots;
+	struct heaps_header **sorted;
 	size_t length;
 	size_t used;
-	RVALUE *freelist;
+        struct heaps_slot *reserve_slots;
 	RVALUE *range[2];
-	RVALUE *freed;
 	size_t live_num;
 	size_t free_num;
 	size_t free_min;
@@ -350,6 +388,7 @@ typedef struct rb_objspace {
 	int dont_gc;
 	int dont_lazy_sweep;
 	int during_gc;
+	rb_atomic_t finalizing;
     } flags;
     struct {
 	st_table *table;
@@ -377,7 +416,11 @@ typedef struct rb_objspace {
 #define ruby_initial_gc_stress	initial_params.gc_stress
 int *ruby_initial_gc_stress_ptr = &ruby_initial_gc_stress;
 #else
+#  ifdef POOL_ALLOC_API
+static rb_objspace_t rb_objspace = {{GC_MALLOC_LIMIT}, &pool_layout, {HEAP_MIN_SLOTS}};
+#  else
 static rb_objspace_t rb_objspace = {{GC_MALLOC_LIMIT}, {HEAP_MIN_SLOTS}};
+#  endif
 int *ruby_initial_gc_stress_ptr = &rb_objspace.gc_stress;
 #endif
 #define malloc_limit		objspace->malloc_params.limit
@@ -385,13 +428,12 @@ int *ruby_initial_gc_stress_ptr = &rb_objspace.gc_stress;
 #define heaps			objspace->heap.ptr
 #define heaps_length		objspace->heap.length
 #define heaps_used		objspace->heap.used
-#define freelist		objspace->heap.freelist
 #define lomem			objspace->heap.range[0]
 #define himem			objspace->heap.range[1]
 #define heaps_inc		objspace->heap.increment
-#define heaps_freed		objspace->heap.freed
 #define dont_gc 		objspace->flags.dont_gc
 #define during_gc		objspace->flags.during_gc
+#define finalizing		objspace->flags.finalizing
 #define finalizer_table 	objspace->final.table
 #define deferred_final_list	objspace->final.deferred
 #define mark_stack		objspace->markstack.buffer
@@ -403,7 +445,16 @@ int *ruby_initial_gc_stress_ptr = &rb_objspace.gc_stress;
 #define initial_heap_min_slots	initial_params.initial_heap_min_slots
 #define initial_free_min	initial_params.initial_free_min
 
+#define is_lazy_sweeping(objspace) ((objspace)->heap.sweep_slots != 0)
+
+#define nonspecial_obj_id(obj) (VALUE)((SIGNED_VALUE)(obj)|FIXNUM_FLAG)
+
+#define HEAP_HEADER(p) ((struct heaps_header *)(p))
+
 static void rb_objspace_call_finalizer(rb_objspace_t *objspace);
+static VALUE define_final0(VALUE obj, VALUE block);
+VALUE rb_define_final(VALUE obj, VALUE block);
+VALUE rb_undefine_final(VALUE obj);
 
 #if defined(ENABLE_VM_OBJSPACE) && ENABLE_VM_OBJSPACE
 rb_objspace_t *
@@ -413,6 +464,10 @@ rb_objspace_alloc(void)
     memset(objspace, 0, sizeof(*objspace));
     malloc_limit = initial_malloc_limit;
     ruby_gc_stress = ruby_initial_gc_stress;
+#ifdef POOL_ALLOC_API
+    objspace->pool_headers = (pool_layout_t*) malloc(sizeof(pool_layout));
+    memcpy(objspace->pool_headers, &pool_layout, sizeof(pool_layout));
+#endif
 
     return objspace;
 }
@@ -478,40 +533,60 @@ rb_objspace_free(rb_objspace_t *objspace)
 	struct gc_list *list, *next;
 	for (list = global_List; list; list = next) {
 	    next = list->next;
-	    free(list);
+	    xfree(list);
 	}
     }
+    if (objspace->heap.reserve_slots) {
+        struct heaps_slot *list, *next;
+        for (list = objspace->heap.reserve_slots; list; list = next) {
+            next = list->free_next;
+            free(list);
+        }
+    }
     if (objspace->heap.sorted) {
 	size_t i;
 	for (i = 0; i < heaps_used; ++i) {
-	    free(objspace->heap.sorted[i].slot->membase);
-	    free(objspace->heap.sorted[i].slot);
+            free(objspace->heap.sorted[i]->base);
+	    aligned_free(objspace->heap.sorted[i]);
 	}
 	free(objspace->heap.sorted);
 	heaps_used = 0;
 	heaps = 0;
     }
+#ifdef POOL_ALLOC_API
+    if (objspace->pool_headers) {
+        pool_finalize_header(&objspace->pool_headers->p6);
+        pool_finalize_header(&objspace->pool_headers->p11);
+        free(objspace->pool_headers);
+    }
+#endif
     free(objspace);
 }
 #endif
 
-/* tiny heap size */
-/* 32KB */
-/*#define HEAP_SIZE 0x8000 */
-/* 128KB */
-/*#define HEAP_SIZE 0x20000 */
-/* 64KB */
-/*#define HEAP_SIZE 0x10000 */
-/* 16KB */
-#define HEAP_SIZE 0x4000
-/* 8KB */
-/*#define HEAP_SIZE 0x2000 */
-/* 4KB */
-/*#define HEAP_SIZE 0x1000 */
-/* 2KB */
-/*#define HEAP_SIZE 0x800 */
-
-#define HEAP_OBJ_LIMIT (unsigned int)(HEAP_SIZE / sizeof(struct RVALUE))
+#ifndef HEAP_ALIGN_LOG
+/* default tiny heap size: 16KB */
+#define HEAP_ALIGN_LOG 15
+#endif
+#define HEAP_ALIGN (1UL << HEAP_ALIGN_LOG)
+#define HEAP_ALIGN_MASK (~(~0UL << HEAP_ALIGN_LOG))
+#define REQUIRED_SIZE_BY_MALLOC (sizeof(size_t) * 5)
+#define HEAP_SIZE (HEAP_ALIGN - REQUIRED_SIZE_BY_MALLOC)
+#define CEILDIV(i, mod) (((i) + (mod) - 1)/(mod))
+
+#define HEAP_OBJ_LIMIT (unsigned int)((HEAP_SIZE - sizeof(struct heaps_header))/sizeof(struct RVALUE))
+#define HEAP_BITMAP_LIMIT CEILDIV(CEILDIV(HEAP_SIZE, sizeof(struct RVALUE)), sizeof(uintptr_t)*8)
+#define HEAP_SLOT_SIZE (sizeof(struct heaps_slot) + (HEAP_BITMAP_LIMIT-1) * sizeof(uintptr_t))
+
+#define GET_HEAP_HEADER(x) (HEAP_HEADER(((uintptr_t)x) & ~(HEAP_ALIGN_MASK)))
+#define GET_HEAP_SLOT(x) (GET_HEAP_HEADER(x)->base)
+#define GET_HEAP_BITMAP(x) (GET_HEAP_HEADER(x)->bits)
+#define NUM_IN_SLOT(p) (((uintptr_t)p & HEAP_ALIGN_MASK)/sizeof(RVALUE))
+#define BITMAP_INDEX(p) (NUM_IN_SLOT(p) / (sizeof(uintptr_t) * 8))
+#define BITMAP_OFFSET(p) (NUM_IN_SLOT(p) & ((sizeof(uintptr_t) * 8)-1))
+#define MARKED_IN_BITMAP(bits, p) (bits[BITMAP_INDEX(p)] & ((uintptr_t)1 << BITMAP_OFFSET(p)))
+#define MARK_IN_BITMAP(bits, p) (bits[BITMAP_INDEX(p)] = bits[BITMAP_INDEX(p)] | ((uintptr_t)1 << BITMAP_OFFSET(p)))
+#define CLEAR_IN_BITMAP(bits, p) (bits[BITMAP_INDEX(p)] &= ~((uintptr_t)1 << BITMAP_OFFSET(p)))
 
 extern st_table *rb_class_tbl;
 
@@ -823,8 +898,10 @@ vm_xfree(rb_objspace_t *objspace, void *ptr)
     size_t size;
     ptr = ((size_t *)ptr) - 1;
     size = ((size_t*)ptr)[0];
-    objspace->malloc_params.allocated_size -= size;
-    objspace->malloc_params.allocations--;
+    if (size) {
+	objspace->malloc_params.allocated_size -= size;
+	objspace->malloc_params.allocations--;
+    }
 #endif
 
     free(ptr);
@@ -894,6 +971,27 @@ ruby_xfree(void *x)
 	vm_xfree(&rb_objspace, x);
 }
 
+#ifdef POOL_ALLOC_API
+/* POOL ALLOC API */
+#define POOL_ALLOC_PART 2
+#include "pool_alloc.inc.h"
+#undef POOL_ALLOC_PART
+
+void
+ruby_xpool_free(void *ptr)
+{
+    pool_free_entry((void**)ptr);
+}
+
+#define CONCRET_POOL_MALLOC(pnts) \
+void * ruby_xpool_malloc_##pnts##p () { \
+    return pool_alloc_entry(&rb_objspace.pool_headers->p##pnts ); \
+}
+CONCRET_POOL_MALLOC(6)
+CONCRET_POOL_MALLOC(11)
+#undef CONCRET_POOL_MALLOC
+
+#endif
 
 /*
  *  call-seq:
@@ -984,70 +1082,140 @@ rb_gc_unregister_address(VALUE *addr)
     }
 }
 
-
 static void
 allocate_sorted_heaps(rb_objspace_t *objspace, size_t next_heaps_length)
 {
-    struct sorted_heaps_slot *p;
-    size_t size;
+    struct heaps_header **p;
+    struct heaps_slot *slot;
+    size_t size, add, i;
 
-    size = next_heaps_length*sizeof(struct sorted_heaps_slot);
+    size = next_heaps_length*sizeof(struct heaps_header *);
+    add = next_heaps_length - heaps_used;
 
     if (heaps_used > 0) {
-	p = (struct sorted_heaps_slot *)realloc(objspace->heap.sorted, size);
+	p = (struct heaps_header **)realloc(objspace->heap.sorted, size);
 	if (p) objspace->heap.sorted = p;
     }
     else {
-	p = objspace->heap.sorted = (struct sorted_heaps_slot *)malloc(size);
+	p = objspace->heap.sorted = (struct heaps_header **)malloc(size);
     }
 
     if (p == 0) {
 	during_gc = 0;
 	rb_memerror();
     }
-    heaps_length = next_heaps_length;
+
+    for (i = 0; i < add; i++) {
+        slot = (struct heaps_slot *)malloc(HEAP_SLOT_SIZE);
+        if (slot == 0) {
+            during_gc = 0;
+            rb_memerror();
+            return;
+        }
+        slot->free_next = objspace->heap.reserve_slots;
+        objspace->heap.reserve_slots = slot;
+    }
+}
+
+static void *
+aligned_malloc(size_t alignment, size_t size)
+{
+    void *res;
+
+#if defined __MINGW32__
+    res = __mingw_aligned_malloc(size, alignment);
+#elif defined _WIN32 && !defined __CYGWIN__
+    res = _aligned_malloc(size, alignment);
+#elif defined(HAVE_POSIX_MEMALIGN)
+    if (posix_memalign(&res, alignment, size) == 0) {
+        return res;
+    }
+    else {
+        return NULL;
+    }
+#elif defined(HAVE_MEMALIGN)
+    res = memalign(alignment, size);
+#else
+    char* aligned;
+    res = malloc(alignment + size + sizeof(void*));
+    aligned = (char*)res + alignment + sizeof(void*);
+    aligned -= ((VALUE)aligned & (alignment - 1));
+    ((void**)aligned)[-1] = res;
+    res = (void*)aligned;
+#endif
+
+#if defined(_DEBUG) || defined(GC_DEBUG)
+    /* alignment must be a power of 2 */
+    assert((alignment - 1) & alignment == 0);
+    assert(alignment % sizeof(void*) == 0);
+#endif
+    return res;
+}
+
+static void
+aligned_free(void *ptr)
+{
+#if defined __MINGW32__
+    __mingw_aligned_free(ptr);
+#elif defined _WIN32 && !defined __CYGWIN__
+    _aligned_free(ptr);
+#elif defined(HAVE_MEMALIGN) || defined(HAVE_POSIX_MEMALIGN)
+    free(ptr);
+#else
+    free(((void**)ptr)[-1]);
+#endif
+}
+
+static void
+link_free_heap_slot(rb_objspace_t *objspace, struct heaps_slot *slot)
+{
+    slot->free_next = objspace->heap.free_slots;
+    objspace->heap.free_slots = slot;
+}
+
+static void
+unlink_free_heap_slot(rb_objspace_t *objspace, struct heaps_slot *slot)
+{
+    objspace->heap.free_slots = slot->free_next;
+    slot->free_next = NULL;
 }
 
 static void
 assign_heap_slot(rb_objspace_t *objspace)
 {
-    RVALUE *p, *pend, *membase;
+    RVALUE *p, *pend;
+    struct heaps_header *membase;
     struct heaps_slot *slot;
     size_t hi, lo, mid;
     size_t objs;
 
     objs = HEAP_OBJ_LIMIT;
-    p = (RVALUE*)malloc(HEAP_SIZE);
-    if (p == 0) {
-	during_gc = 0;
-	rb_memerror();
-    }
-    slot = (struct heaps_slot *)malloc(sizeof(struct heaps_slot));
-    if (slot == 0) {
-	xfree(p);
+    membase = (struct heaps_header*)aligned_malloc(HEAP_ALIGN, HEAP_SIZE);
+    if (membase == 0) {
 	during_gc = 0;
 	rb_memerror();
     }
+    assert(objspace->heap.reserve_slots != NULL);
+    slot = objspace->heap.reserve_slots;
+    objspace->heap.reserve_slots = slot->free_next;
     MEMZERO((void*)slot, struct heaps_slot, 1);
 
     slot->next = heaps;
     if (heaps) heaps->prev = slot;
     heaps = slot;
 
-    membase = p;
+    p = (RVALUE*)((VALUE)membase + sizeof(struct heaps_header));
     if ((VALUE)p % sizeof(RVALUE) != 0) {
-	p = (RVALUE*)((VALUE)p + sizeof(RVALUE) - ((VALUE)p % sizeof(RVALUE)));
-	if ((HEAP_SIZE - HEAP_OBJ_LIMIT * sizeof(RVALUE)) < (size_t)((char*)p - (char*)membase)) {
-	    objs--;
-	}
+       p = (RVALUE*)((VALUE)p + sizeof(RVALUE) - ((VALUE)p % sizeof(RVALUE)));
+       objs = (HEAP_SIZE - (size_t)((VALUE)p - (VALUE)membase))/sizeof(RVALUE);
     }
 
     lo = 0;
     hi = heaps_used;
     while (lo < hi) {
-	register RVALUE *mid_membase;
+	register struct heaps_header *mid_membase;
 	mid = (lo + hi) / 2;
-	mid_membase = objspace->heap.sorted[mid].slot->membase;
+        mid_membase = objspace->heap.sorted[mid];
 	if (mid_membase < membase) {
 	    lo = mid + 1;
 	}
@@ -1059,14 +1227,16 @@ assign_heap_slot(rb_objspace_t *objspace)
 	}
     }
     if (hi < heaps_used) {
-	MEMMOVE(&objspace->heap.sorted[hi+1], &objspace->heap.sorted[hi], struct sorted_heaps_slot, heaps_used - hi);
-    }
-    objspace->heap.sorted[hi].slot = slot;
-    objspace->heap.sorted[hi].start = p;
-    objspace->heap.sorted[hi].end = (p + objs);
+	MEMMOVE(&objspace->heap.sorted[hi+1], &objspace->heap.sorted[hi], struct heaps_header*, heaps_used - hi);
+    }
+    objspace->heap.sorted[hi] = membase;
+    membase->start = p;
+    membase->end = (p + objs);
+    membase->base = heaps;
+    membase->bits = heaps->bits;
+    membase->limit = objs;
     heaps->membase = membase;
-    heaps->slot = p;
-    heaps->limit = objs;
+    memset(heaps->bits, 0, HEAP_BITMAP_LIMIT * sizeof(uintptr_t));
     objspace->heap.free_num += objs;
     pend = p + objs;
     if (lomem == 0 || lomem > p) lomem = p;
@@ -1075,19 +1245,24 @@ assign_heap_slot(rb_objspace_t *objspace)
 
     while (p < pend) {
 	p->as.free.flags = 0;
-	p->as.free.next = freelist;
-	freelist = p;
+	p->as.free.next = heaps->freelist;
+	heaps->freelist = p;
 	p++;
     }
+    link_free_heap_slot(objspace, heaps);
 }
 
 static void
 add_heap_slots(rb_objspace_t *objspace, size_t add)
 {
     size_t i;
+    size_t next_heaps_length;
 
-    if ((heaps_used + add) > heaps_length) {
-        allocate_sorted_heaps(objspace, heaps_used + add);
+    next_heaps_length = heaps_used + add;
+
+    if (next_heaps_length > heaps_length) {
+        allocate_sorted_heaps(objspace, next_heaps_length);
+        heaps_length = next_heaps_length;
     }
 
     for (i = 0; i < add; i++) {
@@ -1137,6 +1312,7 @@ set_heaps_increment(rb_objspace_t *objspace)
 
     if (next_heaps_length > heaps_length) {
 	allocate_sorted_heaps(objspace, next_heaps_length);
+        heaps_length = next_heaps_length;
     }
 }
 
@@ -1159,6 +1335,7 @@ rb_during_gc(void)
 }
 
 #define RANY(o) ((RVALUE*)(o))
+#define has_free_object (objspace->heap.free_slots && objspace->heap.free_slots->freelist)
 
 VALUE
 rb_newobj(void)
@@ -1179,15 +1356,18 @@ rb_newobj(void)
 	}
     }
 
-    if (UNLIKELY(!freelist)) {
+    if (UNLIKELY(!has_free_object)) {
 	if (!gc_lazy_sweep(objspace)) {
 	    during_gc = 0;
 	    rb_memerror();
 	}
     }
 
-    obj = (VALUE)freelist;
-    freelist = freelist->as.free.next;
+    obj = (VALUE)objspace->heap.free_slots->freelist;
+    objspace->heap.free_slots->freelist = RANY(obj)->as.free.next;
+    if (objspace->heap.free_slots->freelist == NULL) {
+        unlink_free_heap_slot(objspace, objspace->heap.free_slots);
+    }
 
     MEMZERO((void*)obj, RVALUE, 1);
 #ifdef GC_DEBUG
@@ -1356,10 +1536,10 @@ gc_mark_all(rb_objspace_t *objspace)
 
     init_mark_stack(objspace);
     for (i = 0; i < heaps_used; i++) {
-	p = objspace->heap.sorted[i].start; pend = objspace->heap.sorted[i].end;
+	p = objspace->heap.sorted[i]->start; pend = objspace->heap.sorted[i]->end;
 	while (p < pend) {
-	    if ((p->as.basic.flags & FL_MARK) &&
-		(p->as.basic.flags != FL_MARK)) {
+	    if (MARKED_IN_BITMAP(GET_HEAP_BITMAP(p), p) &&
+		p->as.basic.flags) {
 		gc_mark_children(objspace, (VALUE)p, 0);
 	    }
 	    p++;
@@ -1387,26 +1567,27 @@ static inline int
 is_pointer_to_heap(rb_objspace_t *objspace, void *ptr)
 {
     register RVALUE *p = RANY(ptr);
-    register struct sorted_heaps_slot *heap;
+    register struct heaps_header *heap;
     register size_t hi, lo, mid;
 
     if (p < lomem || p > himem) return FALSE;
     if ((VALUE)p % sizeof(RVALUE) != 0) return FALSE;
+    heap = GET_HEAP_HEADER(p);
 
     /* check if p looks like a pointer using bsearch*/
     lo = 0;
     hi = heaps_used;
     while (lo < hi) {
 	mid = (lo + hi) / 2;
-	heap = &objspace->heap.sorted[mid];
-	if (heap->start <= p) {
-	    if (p < heap->end)
-		return TRUE;
-	    lo = mid + 1;
-	}
-	else {
-	    hi = mid;
-	}
+        if (heap > objspace->heap.sorted[mid]) {
+            lo = mid + 1;
+        }
+        else if (heap < objspace->heap.sorted[mid]) {
+            hi = mid;
+        }
+        else {
+            return (p >= heap->start && p < heap->end) ? TRUE : FALSE;
+        }
     }
     return FALSE;
 }
@@ -1449,10 +1630,10 @@ struct mark_tbl_arg {
 };
 
 static int
-mark_entry(ID key, VALUE value, st_data_t data)
+mark_entry(st_data_t key, st_data_t value, st_data_t data)
 {
     struct mark_tbl_arg *arg = (void*)data;
-    gc_mark(arg->objspace, value, arg->lev);
+    gc_mark(arg->objspace, (VALUE)value, arg->lev);
     return ST_CONTINUE;
 }
 
@@ -1467,10 +1648,10 @@ mark_tbl(rb_objspace_t *objspace, st_table *tbl, int lev)
 }
 
 static int
-mark_key(VALUE key, VALUE value, st_data_t data)
+mark_key(st_data_t key, st_data_t value, st_data_t data)
 {
     struct mark_tbl_arg *arg = (void*)data;
-    gc_mark(arg->objspace, key, arg->lev);
+    gc_mark(arg->objspace, (VALUE)key, arg->lev);
     return ST_CONTINUE;
 }
 
@@ -1491,11 +1672,11 @@ rb_mark_set(st_table *tbl)
 }
 
 static int
-mark_keyvalue(VALUE key, VALUE value, st_data_t data)
+mark_keyvalue(st_data_t key, st_data_t value, st_data_t data)
 {
     struct mark_tbl_arg *arg = (void*)data;
-    gc_mark(arg->objspace, key, arg->lev);
-    gc_mark(arg->objspace, value, arg->lev);
+    gc_mark(arg->objspace, (VALUE)key, arg->lev);
+    gc_mark(arg->objspace, (VALUE)value, arg->lev);
     return ST_CONTINUE;
 }
 
@@ -1565,7 +1746,9 @@ mark_m_tbl(rb_objspace_t *objspace, st_table *tbl, int lev)
 static int
 free_method_entry_i(ID key, rb_method_entry_t *me, st_data_t data)
 {
-    rb_free_method_entry(me);
+    if (!me->mark) {
+	rb_free_method_entry(me);
+    }
     return ST_CONTINUE;
 }
 
@@ -1622,6 +1805,16 @@ rb_gc_mark_maybe(VALUE obj)
     }
 }
 
+static int
+gc_mark_ptr(rb_objspace_t *objspace, VALUE ptr)
+{
+    register uintptr_t *bits = GET_HEAP_BITMAP(ptr);
+    if (MARKED_IN_BITMAP(bits, ptr)) return 0;
+    MARK_IN_BITMAP(bits, ptr);
+    objspace->heap.live_num++;
+    return 1;
+}
+
 static void
 gc_mark(rb_objspace_t *objspace, VALUE ptr, int lev)
 {
@@ -1630,9 +1823,7 @@ gc_mark(rb_objspace_t *objspace, VALUE ptr, int lev)
     obj = RANY(ptr);
     if (rb_special_const_p(ptr)) return; /* special const not marked */
     if (obj->as.basic.flags == 0) return;       /* free cell */
-    if (obj->as.basic.flags & FL_MARK) return;  /* already marked */
-    obj->as.basic.flags |= FL_MARK;
-    objspace->heap.live_num++;
+    if (!gc_mark_ptr(objspace, ptr)) return;	/* already marked */
 
     if (lev > GC_LEVEL_MAX || (lev == 0 && stack_check(STACKFRAME_FOR_GC_MARK))) {
 	if (!mark_stack_overflow) {
@@ -1659,6 +1850,7 @@ static void
 gc_mark_children(rb_objspace_t *objspace, VALUE ptr, int lev)
 {
     register RVALUE *obj = RANY(ptr);
+    register uintptr_t *bits;
 
     goto marking;		/* skip */
 
@@ -1666,8 +1858,9 @@ gc_mark_children(rb_objspace_t *objspace, VALUE ptr, int lev)
     obj = RANY(ptr);
     if (rb_special_const_p(ptr)) return; /* special const not marked */
     if (obj->as.basic.flags == 0) return;       /* free cell */
-    if (obj->as.basic.flags & FL_MARK) return;  /* already marked */
-    obj->as.basic.flags |= FL_MARK;
+    bits = GET_HEAP_BITMAP(ptr);
+    if (MARKED_IN_BITMAP(bits, ptr)) return;  /* already marked */
+    MARK_IN_BITMAP(bits, ptr);
     objspace->heap.live_num++;
 
   marking:
@@ -1819,6 +2012,7 @@ gc_mark_children(rb_objspace_t *objspace, VALUE ptr, int lev)
       case T_CLASS:
       case T_MODULE:
 	mark_m_tbl(objspace, RCLASS_M_TBL(obj), lev);
+	if (!RCLASS_EXT(obj)) break;
 	mark_tbl(objspace, RCLASS_IV_TBL(obj), lev);
 	mark_const_tbl(objspace, RCLASS_CONST_TBL(obj), lev);
 	ptr = RCLASS_SUPER(obj);
@@ -1929,15 +2123,22 @@ gc_mark_children(rb_objspace_t *objspace, VALUE ptr, int lev)
 
 static int obj_free(rb_objspace_t *, VALUE);
 
-static inline void
-add_freelist(rb_objspace_t *objspace, RVALUE *p)
+static inline struct heaps_slot *
+add_slot_local_freelist(rb_objspace_t *objspace, RVALUE *p)
 {
+    struct heaps_slot *slot;
+
     VALGRIND_MAKE_MEM_UNDEFINED((void*)p, sizeof(RVALUE));
     p->as.free.flags = 0;
-    p->as.free.next = freelist;
-    freelist = p;
+    slot = GET_HEAP_SLOT(p);
+    p->as.free.next = slot->freelist;
+    slot->freelist = p;
+
+    return slot;
 }
 
+static void free_unused_heap(rb_objspace_t *objspace, struct heaps_header *heap);
+
 static void
 finalize_list(rb_objspace_t *objspace, RVALUE *p)
 {
@@ -1945,17 +2146,16 @@ finalize_list(rb_objspace_t *objspace, RVALUE *p)
 	RVALUE *tmp = p->as.free.next;
 	run_final(objspace, (VALUE)p);
 	if (!FL_TEST(p, FL_SINGLETON)) { /* not freeing page */
-            if (objspace->heap.sweep_slots) {
-                p->as.free.flags = 0;
-            }
-            else {
+            add_slot_local_freelist(objspace, p);
+            if (!is_lazy_sweeping(objspace)) {
                 GC_PROF_DEC_LIVE_NUM;
-                add_freelist(objspace, p);
             }
 	}
 	else {
-	    struct heaps_slot *slot = (struct heaps_slot *)(VALUE)RDATA(p)->dmark;
-	    slot->limit--;
+            struct heaps_header *heap = GET_HEAP_HEADER(p);
+            if (--heap->limit == 0) {
+                free_unused_heap(objspace, heap);
+            }
 	}
 	p = tmp;
     }
@@ -1976,97 +2176,106 @@ unlink_heap_slot(rb_objspace_t *objspace, struct heaps_slot *slot)
     slot->next = NULL;
 }
 
-
 static void
-free_unused_heaps(rb_objspace_t *objspace)
+free_unused_heap(rb_objspace_t *objspace, struct heaps_header *heap)
 {
-    size_t i, j;
-    RVALUE *last = 0;
-
-    for (i = j = 1; j < heaps_used; i++) {
-	if (objspace->heap.sorted[i].slot->limit == 0) {
-	    if (!last) {
-		last = objspace->heap.sorted[i].slot->membase;
-	    }
-	    else {
-		free(objspace->heap.sorted[i].slot->membase);
-	    }
-            free(objspace->heap.sorted[i].slot);
-	    heaps_used--;
-	}
-	else {
-	    if (i != j) {
-		objspace->heap.sorted[j] = objspace->heap.sorted[i];
-	    }
-	    j++;
-	}
-    }
-    if (last) {
-	if (last < heaps_freed) {
-	    free(heaps_freed);
-	    heaps_freed = last;
-	}
-	else {
-	    free(last);
-	}
+    register size_t hi, lo, mid;
+    lo = 0;
+    hi = heaps_used;
+    while (lo < hi) {
+        mid = (lo + hi) / 2;
+        if (heap > objspace->heap.sorted[mid]) {
+            lo = mid + 1;
+        }
+        else if (heap < objspace->heap.sorted[mid]) {
+            hi = mid;
+        }
+        else {
+            /* remove unused heap */
+            struct heaps_slot* h = objspace->heap.sorted[mid]->base;
+            h->free_next = objspace->heap.reserve_slots;
+            objspace->heap.reserve_slots = h;
+            aligned_free(objspace->heap.sorted[mid]);
+            heaps_used--;
+            MEMMOVE(objspace->heap.sorted + mid, objspace->heap.sorted + mid + 1,
+                    struct heaps_header *, heaps_used - mid);
+            return;
+        }
     }
 }
 
 static void
+gc_clear_slot_bits(struct heaps_slot *slot)
+{
+    memset(slot->bits, 0, HEAP_BITMAP_LIMIT * sizeof(uintptr_t));
+}
+
+static void
 slot_sweep(rb_objspace_t *objspace, struct heaps_slot *sweep_slot)
 {
     size_t free_num = 0, final_num = 0;
     RVALUE *p, *pend;
-    RVALUE *free = freelist, *final = deferred_final_list;
+    RVALUE *final = deferred_final_list;
     int deferred;
+    uintptr_t *bits;
 
-    p = sweep_slot->slot; pend = p + sweep_slot->limit;
+    p = sweep_slot->membase->start; pend = sweep_slot->membase->end;
+    bits = sweep_slot->bits;
     while (p < pend) {
-        if (!(p->as.basic.flags & FL_MARK)) {
-            if (p->as.basic.flags &&
-                ((deferred = obj_free(objspace, (VALUE)p)) ||
-		 (FL_TEST(p, FL_FINALIZE)))) {
-                if (!deferred) {
-                    p->as.free.flags = T_ZOMBIE;
-                    RDATA(p)->dfree = 0;
+        if ((!(MARKED_IN_BITMAP(bits, p))) && BUILTIN_TYPE(p) != T_ZOMBIE) {
+            if (p->as.basic.flags) {
+                if ((deferred = obj_free(objspace, (VALUE)p)) ||
+                    (FL_TEST(p, FL_FINALIZE))) {
+                    if (!deferred) {
+                        p->as.free.flags = T_ZOMBIE;
+                        RDATA(p)->dfree = 0;
+                    }
+                    p->as.free.next = deferred_final_list;
+                    deferred_final_list = p;
+                    assert(BUILTIN_TYPE(p) == T_ZOMBIE);
+                    final_num++;
+                }
+                else {
+                    VALGRIND_MAKE_MEM_UNDEFINED((void*)p, sizeof(RVALUE));
+                    p->as.free.flags = 0;
+                    p->as.free.next = sweep_slot->freelist;
+                    sweep_slot->freelist = p;
+                    free_num++;
                 }
-                p->as.free.flags |= FL_MARK;
-                p->as.free.next = deferred_final_list;
-                deferred_final_list = p;
-                final_num++;
             }
             else {
-                add_freelist(objspace, p);
                 free_num++;
             }
         }
-        else if (BUILTIN_TYPE(p) == T_ZOMBIE) {
-            /* objects to be finalized */
-            /* do nothing remain marked */
-        }
-        else {
-            RBASIC(p)->flags &= ~FL_MARK;
-        }
         p++;
     }
-    if (final_num + free_num == sweep_slot->limit &&
+    gc_clear_slot_bits(sweep_slot);
+    if (final_num + free_num == sweep_slot->membase->limit &&
         objspace->heap.free_num > objspace->heap.do_heap_free) {
         RVALUE *pp;
 
         for (pp = deferred_final_list; pp != final; pp = pp->as.free.next) {
-	    RDATA(pp)->dmark = (void (*)(void *))(VALUE)sweep_slot;
+	    RDATA(pp)->dmark = 0;
             pp->as.free.flags |= FL_SINGLETON; /* freeing page mark */
         }
-        sweep_slot->limit = final_num;
-        freelist = free;	/* cancel this page from freelist */
+        sweep_slot->membase->limit = final_num;
         unlink_heap_slot(objspace, sweep_slot);
+        if (final_num == 0) {
+            free_unused_heap(objspace, sweep_slot->membase);
+        }
     }
     else {
+        if (free_num > 0) {
+            link_free_heap_slot(objspace, sweep_slot);
+        }
+        else {
+            sweep_slot->free_next = NULL;
+        }
         objspace->heap.free_num += free_num;
     }
     objspace->heap.final_num += final_num;
 
-    if (deferred_final_list) {
+    if (deferred_final_list && !finalizing) {
         rb_thread_t *th = GET_THREAD();
         if (th) {
             RUBY_VM_SET_FINALIZER_INTERRUPT(th);
@@ -2078,7 +2287,7 @@ static int
 ready_to_gc(rb_objspace_t *objspace)
 {
     if (dont_gc || during_gc) {
-	if (!freelist) {
+	if (!has_free_object) {
             if (!heaps_increment(objspace)) {
                 set_heaps_increment(objspace);
                 heaps_increment(objspace);
@@ -2092,7 +2301,6 @@ ready_to_gc(rb_objspace_t *objspace)
 static void
 before_gc_sweep(rb_objspace_t *objspace)
 {
-    freelist = 0;
     objspace->heap.do_heap_free = (size_t)((heaps_used * HEAP_OBJ_LIMIT) * 0.65);
     objspace->heap.free_min = (size_t)((heaps_used * HEAP_OBJ_LIMIT)  * 0.2);
     if (objspace->heap.free_min < initial_free_min) {
@@ -2101,6 +2309,7 @@ before_gc_sweep(rb_objspace_t *objspace)
     }
     objspace->heap.sweep_slots = heaps;
     objspace->heap.free_num = 0;
+    objspace->heap.free_slots = NULL;
 
     /* sweep unlinked method entries */
     if (GET_VM()->unlinked_method_entry_list) {
@@ -2123,8 +2332,6 @@ after_gc_sweep(rb_objspace_t *objspace)
 	if (malloc_limit < initial_malloc_limit) malloc_limit = initial_malloc_limit;
     }
     malloc_increase = 0;
-
-    free_unused_heaps(objspace);
 }
 
 static int
@@ -2137,7 +2344,7 @@ lazy_sweep(rb_objspace_t *objspace)
         next = objspace->heap.sweep_slots->next;
 	slot_sweep(objspace, objspace->heap.sweep_slots);
         objspace->heap.sweep_slots = next;
-        if (freelist) {
+        if (has_free_object) {
             during_gc = 0;
             return TRUE;
         }
@@ -2149,10 +2356,10 @@ static void
 rest_sweep(rb_objspace_t *objspace)
 {
     if (objspace->heap.sweep_slots) {
-       while (objspace->heap.sweep_slots) {
-           lazy_sweep(objspace);
-       }
-       after_gc_sweep(objspace);
+	while (objspace->heap.sweep_slots) {
+	    lazy_sweep(objspace);
+	}
+	after_gc_sweep(objspace);
     }
 }
 
@@ -2199,9 +2406,9 @@ gc_lazy_sweep(rb_objspace_t *objspace)
     }
 
     GC_PROF_SWEEP_TIMER_START;
-    if(!(res = lazy_sweep(objspace))) {
+    if (!(res = lazy_sweep(objspace))) {
         after_gc_sweep(objspace);
-        if(freelist) {
+        if (has_free_object) {
             res = TRUE;
             during_gc = 0;
         }
@@ -2234,12 +2441,17 @@ void
 rb_gc_force_recycle(VALUE p)
 {
     rb_objspace_t *objspace = &rb_objspace;
-    GC_PROF_DEC_LIVE_NUM;
-    if (RBASIC(p)->flags & FL_MARK) {
-        RANY(p)->as.free.flags = 0;
+    struct heaps_slot *slot;
+
+    if (MARKED_IN_BITMAP(GET_HEAP_BITMAP(p), p)) {
+        add_slot_local_freelist(objspace, (RVALUE *)p);
     }
     else {
-        add_freelist(objspace, (RVALUE *)p);
+        GC_PROF_DEC_LIVE_NUM;
+        slot = add_slot_local_freelist(objspace, (RVALUE *)p);
+        if (slot->free_next == NULL) {
+            link_free_heap_slot(objspace, slot);
+        }
     }
 }
 
@@ -2611,7 +2823,7 @@ static VALUE
 objspace_each_objects(VALUE arg)
 {
     size_t i;
-    RVALUE *membase = 0;
+    struct heaps_header *membase = 0;
     RVALUE *pstart, *pend;
     rb_objspace_t *objspace = &rb_objspace;
     struct each_obj_args *args = (struct each_obj_args *)arg;
@@ -2619,16 +2831,16 @@ objspace_each_objects(VALUE arg)
 
     i = 0;
     while (i < heaps_used) {
-	while (0 < i && (uintptr_t)membase < (uintptr_t)objspace->heap.sorted[i-1].slot->membase)
+	while (0 < i && membase < objspace->heap.sorted[i-1])
 	    i--;
-	while (i < heaps_used && (uintptr_t)objspace->heap.sorted[i].slot->membase <= (uintptr_t)membase)
+	while (i < heaps_used && objspace->heap.sorted[i] <= membase)
 	    i++;
 	if (heaps_used <= i)
 	  break;
-	membase = objspace->heap.sorted[i].slot->membase;
+	membase = objspace->heap.sorted[i];
 
-	pstart = objspace->heap.sorted[i].slot->slot;
-	pend = pstart + objspace->heap.sorted[i].slot->limit;
+	pstart = membase->start;
+	pend = membase->end;
 
 	for (; pstart != pend; pstart++) {
 	    if (pstart->as.basic.flags) {
@@ -2642,6 +2854,7 @@ objspace_each_objects(VALUE arg)
 	    }
 	}
     }
+    RB_GC_GUARD(v);
 
     return Qnil;
 }
@@ -2885,11 +3098,12 @@ run_single_final(VALUE arg)
 }
 
 static void
-run_finalizer(rb_objspace_t *objspace, VALUE objid, VALUE table)
+run_finalizer(rb_objspace_t *objspace, VALUE obj, VALUE table)
 {
     long i;
     int status;
     VALUE args[3];
+    VALUE objid = nonspecial_obj_id(obj);
 
     if (RARRAY_LEN(table) > 0) {
 	args[1] = rb_obj_freeze(rb_ary_new3(1, objid));
@@ -2913,13 +3127,11 @@ run_finalizer(rb_objspace_t *objspace, VALUE objid, VALUE table)
 static void
 run_final(rb_objspace_t *objspace, VALUE obj)
 {
-    VALUE objid;
     RUBY_DATA_FUNC free_func = 0;
     st_data_t key, table;
 
     objspace->heap.final_num--;
 
-    objid = rb_obj_id(obj);	/* make obj into id */
     RBASIC(obj)->klass = 0;
 
     if (RTYPEDDATA_P(obj)) {
@@ -2934,7 +3146,7 @@ run_final(rb_objspace_t *objspace, VALUE obj)
 
     key = (st_data_t)obj;
     if (st_delete(finalizer_table, &key, &table)) {
-	run_finalizer(objspace, objid, (VALUE)table);
+	run_finalizer(objspace, obj, (VALUE)table);
     }
 }
 
@@ -2952,16 +3164,20 @@ finalize_deferred(rb_objspace_t *objspace)
 void
 rb_gc_finalize_deferred(void)
 {
-    finalize_deferred(&rb_objspace);
+    rb_objspace_t *objspace = &rb_objspace;
+    if (ATOMIC_EXCHANGE(finalizing, 1)) return;
+    finalize_deferred(objspace);
+    ATOMIC_SET(finalizing, 0);
 }
 
 static int
 chain_finalized_object(st_data_t key, st_data_t val, st_data_t arg)
 {
     RVALUE *p = (RVALUE *)key, **final_list = (RVALUE **)arg;
-    if ((p->as.basic.flags & (FL_FINALIZE|FL_MARK)) == FL_FINALIZE) {
+    if ((p->as.basic.flags & FL_FINALIZE) == FL_FINALIZE &&
+        !MARKED_IN_BITMAP(GET_HEAP_BITMAP(p), p)) {
 	if (BUILTIN_TYPE(p) != T_ZOMBIE) {
-	    p->as.free.flags = FL_MARK | T_ZOMBIE; /* remain marked */
+	    p->as.free.flags = T_ZOMBIE;
 	    RDATA(p)->dfree = 0;
 	}
 	p->as.free.next = *final_list;
@@ -3004,6 +3220,8 @@ rb_objspace_call_finalizer(rb_objspace_t *objspace)
     /* run finalizers */
     rest_sweep(objspace);
 
+    if (ATOMIC_EXCHANGE(finalizing, 1)) return;
+
     do {
 	/* XXX: this loop will make no sense */
 	/* because mark will not be removed */
@@ -3018,8 +3236,9 @@ rb_objspace_call_finalizer(rb_objspace_t *objspace)
 	st_foreach(finalizer_table, force_chain_object, (st_data_t)&list);
 	while (list) {
 	    struct force_finalize_list *curr = list;
-	    run_finalizer(objspace, rb_obj_id(curr->obj), curr->table);
-	    st_delete(finalizer_table, (st_data_t*)&curr->obj, 0);
+	    st_data_t obj = (st_data_t)curr->obj;
+	    run_finalizer(objspace, curr->obj, curr->table);
+	    st_delete(finalizer_table, &obj, 0);
 	    list = curr->next;
 	    xfree(curr);
 	}
@@ -3030,7 +3249,7 @@ rb_objspace_call_finalizer(rb_objspace_t *objspace)
 
     /* run data object's finalizers */
     for (i = 0; i < heaps_used; i++) {
-	p = objspace->heap.sorted[i].start; pend = objspace->heap.sorted[i].end;
+	p = objspace->heap.sorted[i]->start; pend = objspace->heap.sorted[i]->end;
 	while (p < pend) {
 	    if (BUILTIN_TYPE(p) == T_DATA &&
 		DATA_PTR(p) && RANY(p)->as.data.dfree &&
@@ -3066,6 +3285,7 @@ rb_objspace_call_finalizer(rb_objspace_t *objspace)
 
     st_free_table(finalizer_table);
     finalizer_table = 0;
+    ATOMIC_SET(finalizing, 0);
 }
 
 void
@@ -3073,8 +3293,39 @@ rb_gc(void)
 {
     rb_objspace_t *objspace = &rb_objspace;
     garbage_collect(objspace);
-    finalize_deferred(objspace);
-    free_unused_heaps(objspace);
+    if (!finalizing) finalize_deferred(objspace);
+}
+
+static inline int
+is_id_value(rb_objspace_t *objspace, VALUE ptr)
+{
+    if (!is_pointer_to_heap(objspace, (void *)ptr)) return FALSE;
+    if (BUILTIN_TYPE(ptr) > T_FIXNUM) return FALSE;
+    if (BUILTIN_TYPE(ptr) == T_ICLASS) return FALSE;
+    return TRUE;
+}
+
+static inline int
+is_dead_object(rb_objspace_t *objspace, VALUE ptr)
+{
+    struct heaps_slot *slot = objspace->heap.sweep_slots;
+    if (!is_lazy_sweeping(objspace) || MARKED_IN_BITMAP(GET_HEAP_BITMAP(ptr), ptr))
+	return FALSE;
+    while (slot) {
+	if ((VALUE)slot->membase->start <= ptr && ptr < (VALUE)(slot->membase->end))
+	    return TRUE;
+	slot = slot->next;
+    }
+    return FALSE;
+}
+
+static inline int
+is_live_object(rb_objspace_t *objspace, VALUE ptr)
+{
+    if (BUILTIN_TYPE(ptr) == 0) return FALSE;
+    if (RBASIC(ptr)->klass == 0) return FALSE;
+    if (is_dead_object(objspace, ptr)) return FALSE;
+    return TRUE;
 }
 
 /*
@@ -3119,11 +3370,10 @@ id2ref(VALUE obj, VALUE objid)
 	return ID2SYM(symid);
     }
 
-    if (!is_pointer_to_heap(objspace, (void *)ptr) ||
-	BUILTIN_TYPE(ptr) > T_FIXNUM || BUILTIN_TYPE(ptr) == T_ICLASS) {
+    if (!is_id_value(objspace, ptr)) {
 	rb_raise(rb_eRangeError, "%p is not id value", p0);
     }
-    if (BUILTIN_TYPE(ptr) == 0 || RBASIC(ptr)->klass == 0) {
+    if (!is_live_object(objspace, ptr)) {
 	rb_raise(rb_eRangeError, "%p is recycled object", p0);
     }
     return (VALUE)ptr;
@@ -3193,7 +3443,7 @@ rb_obj_id(VALUE obj)
     if (SPECIAL_CONST_P(obj)) {
         return LONG2NUM((SIGNED_VALUE)obj);
     }
-    return (VALUE)((SIGNED_VALUE)obj|FIXNUM_FLAG);
+    return nonspecial_obj_id(obj);
 }
 
 static int
@@ -3236,7 +3486,7 @@ count_objects(int argc, VALUE *argv, VALUE os)
     VALUE hash;
 
     if (rb_scan_args(argc, argv, "01", &hash) == 1) {
-        if (TYPE(hash) != T_HASH)
+        if (!RB_TYPE_P(hash, T_HASH))
             rb_raise(rb_eTypeError, "non-hash given");
     }
 
@@ -3247,7 +3497,7 @@ count_objects(int argc, VALUE *argv, VALUE os)
     for (i = 0; i < heaps_used; i++) {
         RVALUE *p, *pend;
 
-        p = objspace->heap.sorted[i].start; pend = objspace->heap.sorted[i].end;
+        p = objspace->heap.sorted[i]->start; pend = objspace->heap.sorted[i]->end;
         for (;p < pend; p++) {
             if (p->as.basic.flags) {
                 counts[BUILTIN_TYPE(p)]++;
@@ -3256,7 +3506,7 @@ count_objects(int argc, VALUE *argv, VALUE os)
                 freed++;
             }
         }
-        total += objspace->heap.sorted[i].slot->limit;
+        total += objspace->heap.sorted[i]->limit;
     }
 
     if (hash == Qnil) {
@@ -3355,7 +3605,7 @@ gc_stat(int argc, VALUE *argv, VALUE self)
     VALUE hash;
 
     if (rb_scan_args(argc, argv, "01", &hash) == 1) {
-        if (TYPE(hash) != T_HASH)
+        if (!RB_TYPE_P(hash, T_HASH))
             rb_raise(rb_eTypeError, "non-hash given");
     }
 
@@ -3410,6 +3660,33 @@ gc_malloc_allocations(VALUE self)
 }
 #endif
 
+/*
+ *  call-seq:
+ *     GC::Profiler.raw_data -> [Hash, ...]
+ *
+ *  Returns an Array of individual raw profile data Hashes ordered
+ *  from earliest to latest by <tt>:GC_INVOKE_TIME</tt>.  For example:
+ *
+ *    [{:GC_TIME=>1.3000000000000858e-05,
+ *      :GC_INVOKE_TIME=>0.010634999999999999,
+ *      :HEAP_USE_SIZE=>289640,
+ *      :HEAP_TOTAL_SIZE=>588960,
+ *      :HEAP_TOTAL_OBJECTS=>14724,
+ *      :GC_IS_MARKED=>false},
+ *      ...
+ *    ]
+ *
+ *  The keys mean:
+ *
+ *  +:GC_TIME+:: Time taken for this run in milliseconds
+ *  +:GC_INVOKE_TIME+:: Time the GC was invoked since startup in seconds
+ *  +:HEAP_USE_SIZE+:: Bytes of heap used
+ *  +:HEAP_TOTAL_SIZE+:: Size of heap in bytes
+ *  +:HEAP_TOTAL_OBJECTS+:: Number of objects
+ *  +:GC_IS_MARKED+:: Is the GC in the mark phase
+ *
+ */
+
 static VALUE
 gc_profile_record_get(void)
 {
@@ -3602,6 +3879,7 @@ Init_GC(void)
     rb_mProfiler = rb_define_module_under(rb_mGC, "Profiler");
     rb_define_singleton_method(rb_mProfiler, "enabled?", gc_profile_enable_get, 0);
     rb_define_singleton_method(rb_mProfiler, "enable", gc_profile_enable, 0);
+    rb_define_singleton_method(rb_mProfiler, "raw_data", gc_profile_record_get, 0);
     rb_define_singleton_method(rb_mProfiler, "disable", gc_profile_disable, 0);
     rb_define_singleton_method(rb_mProfiler, "clear", gc_profile_clear, 0);
     rb_define_singleton_method(rb_mProfiler, "result", gc_profile_result, 0);
diff --git a/hash.c b/hash.c
index fbd8237..32917c3 100644
--- a/hash.c
+++ b/hash.c
@@ -44,7 +44,7 @@ rb_any_cmp(VALUE a, VALUE b)
     if (FIXNUM_P(a) && FIXNUM_P(b)) {
 	return a != b;
     }
-    if (TYPE(a) == T_STRING && RBASIC(a)->klass == rb_cString &&
+    if (RB_TYPE_P(a, T_STRING) && RBASIC(a)->klass == rb_cString &&
 	TYPE(b) == T_STRING && RBASIC(b)->klass == rb_cString) {
 	return rb_str_hash_cmp(a, b);
     }
@@ -80,20 +80,14 @@ rb_any_hash(VALUE a)
     VALUE hval;
     st_index_t hnum;
 
-    switch (TYPE(a)) {
-      case T_FIXNUM:
-      case T_SYMBOL:
-      case T_NIL:
-      case T_FALSE:
-      case T_TRUE:
-	hnum = rb_hash_end(rb_hash_start((unsigned int)a));
-	break;
-
-      case T_STRING:
+    if (SPECIAL_CONST_P(a)) {
+	if (a == Qundef) return 0;
+	hnum = rb_hash_end(rb_hash_start((st_index_t)a));
+    }
+    else if (BUILTIN_TYPE(a) == T_STRING) {
 	hnum = rb_str_hash(a);
-	break;
-
-      default:
+    }
+    else {
         hval = rb_hash(a);
 	hnum = FIX2LONG(hval);
     }
@@ -106,10 +100,8 @@ static const struct st_hash_type objhash = {
     rb_any_hash,
 };
 
-static const struct st_hash_type identhash = {
-    st_numcmp,
-    st_numhash,
-};
+extern const struct st_hash_type st_hashtype_num;
+#define identhash st_hashtype_num
 
 typedef int st_foreach_func(st_data_t, st_data_t, st_data_t);
 
@@ -124,7 +116,6 @@ foreach_safe_i(st_data_t key, st_data_t value, struct foreach_safe_arg *arg)
 {
     int status;
 
-    if (key == Qundef) return ST_CONTINUE;
     status = (*arg->func)(key, value, arg->arg);
     if (status == ST_CONTINUE) {
 	return ST_CHECK;
@@ -140,7 +131,7 @@ st_foreach_safe(st_table *table, int (*func)(ANYARGS), st_data_t a)
     arg.tbl = table;
     arg.func = (st_foreach_func *)func;
     arg.arg = a;
-    if (st_foreach(table, foreach_safe_i, (st_data_t)&arg)) {
+    if (st_foreach_check(table, foreach_safe_i, (st_data_t)&arg, 0)) {
 	rb_raise(rb_eRuntimeError, "hash modified during iteration");
     }
 }
@@ -154,21 +145,21 @@ struct hash_foreach_arg {
 };
 
 static int
-hash_foreach_iter(st_data_t key, st_data_t value, struct hash_foreach_arg *arg)
+hash_foreach_iter(st_data_t key, st_data_t value, st_data_t argp)
 {
+    struct hash_foreach_arg *arg = (struct hash_foreach_arg *)argp;
     int status;
     st_table *tbl;
 
     tbl = RHASH(arg->hash)->ntbl;
-    if ((VALUE)key == Qundef) return ST_CONTINUE;
     status = (*arg->func)((VALUE)key, (VALUE)value, arg->arg);
     if (RHASH(arg->hash)->ntbl != tbl) {
 	rb_raise(rb_eRuntimeError, "rehash occurred during iteration");
     }
     switch (status) {
       case ST_DELETE:
-	st_delete_safe(tbl, &key, 0, Qundef);
 	FL_SET(arg->hash, HASH_DELETED);
+	return ST_DELETE;
       case ST_CONTINUE:
 	break;
       case ST_STOP:
@@ -184,7 +175,7 @@ hash_foreach_ensure(VALUE hash)
 
     if (RHASH(hash)->iter_lev == 0) {
 	if (FL_TEST(hash, HASH_DELETED)) {
-	    st_cleanup_safe(RHASH(hash)->ntbl, Qundef);
+	    st_cleanup_safe(RHASH(hash)->ntbl, (st_data_t)Qundef);
 	    FL_UNSET(hash, HASH_DELETED);
 	}
     }
@@ -192,9 +183,10 @@ hash_foreach_ensure(VALUE hash)
 }
 
 static VALUE
-hash_foreach_call(struct hash_foreach_arg *arg)
+hash_foreach_call(VALUE arg)
 {
-    if (st_foreach(RHASH(arg->hash)->ntbl, hash_foreach_iter, (st_data_t)arg)) {
+    VALUE hash = ((struct hash_foreach_arg *)arg)->hash;
+    if (st_foreach_check(RHASH(hash)->ntbl, hash_foreach_iter, (st_data_t)arg, (st_data_t)Qundef)) {
 	rb_raise(rb_eRuntimeError, "hash modified during iteration");
     }
     return Qnil;
@@ -447,7 +439,7 @@ rb_hash_rehash_i(VALUE key, VALUE value, VALUE arg)
 {
     st_table *tbl = (st_table *)arg;
 
-    if (key != Qundef) st_insert(tbl, key, value);
+    st_insert(tbl, (st_data_t)key, (st_data_t)value);
     return ST_CONTINUE;
 }
 
@@ -490,6 +482,20 @@ rb_hash_rehash(VALUE hash)
     return hash;
 }
 
+static VALUE
+hash_default_value(VALUE hash, VALUE key)
+{
+    if (rb_method_basic_definition_p(CLASS_OF(hash), id_default)) {
+	VALUE ifnone = RHASH_IFNONE(hash);
+	if (!FL_TEST(hash, HASH_PROC_DEFAULT)) return ifnone;
+	if (key == Qundef) return Qnil;
+	return rb_funcall(ifnone, id_yield, 2, hash, key);
+    }
+    else {
+	return rb_funcall(hash, id_default, 1, key);
+    }
+}
+
 /*
  *  call-seq:
  *     hsh[key]    ->  value
@@ -510,13 +516,7 @@ rb_hash_aref(VALUE hash, VALUE key)
     st_data_t val;
 
     if (!RHASH(hash)->ntbl || !st_lookup(RHASH(hash)->ntbl, key, &val)) {
-	if (!FL_TEST(hash, HASH_PROC_DEFAULT) &&
-	    rb_method_basic_definition_p(CLASS_OF(hash), id_default)) {
-	    return RHASH_IFNONE(hash);
-	}
-	else {
-	    return rb_funcall(hash, id_default, 1, key);
-	}
+	return hash_default_value(hash, key);
     }
     return (VALUE)val;
 }
@@ -659,7 +659,7 @@ rb_hash_default(int argc, VALUE *argv, VALUE hash)
 static VALUE
 rb_hash_set_default(VALUE hash, VALUE ifnone)
 {
-    rb_hash_modify(hash);
+    rb_hash_modify_check(hash);
     RHASH_IFNONE(hash) = ifnone;
     FL_UNSET(hash, HASH_PROC_DEFAULT);
     return ifnone;
@@ -707,7 +707,7 @@ rb_hash_set_default_proc(VALUE hash, VALUE proc)
 {
     VALUE b;
 
-    rb_hash_modify(hash);
+    rb_hash_modify_check(hash);
     b = rb_check_convert_type(proc, T_DATA, "Proc", "to_proc");
     if (NIL_P(b) || !rb_obj_is_proc(b)) {
 	rb_raise(rb_eTypeError,
@@ -776,7 +776,7 @@ rb_hash_delete_key(VALUE hash, VALUE key)
     if (!RHASH(hash)->ntbl)
         return Qundef;
     if (RHASH(hash)->iter_lev > 0) {
-	if (st_delete_safe(RHASH(hash)->ntbl, &ktmp, &val, Qundef)) {
+	if (st_delete_safe(RHASH(hash)->ntbl, &ktmp, &val, (st_data_t)Qundef)) {
 	    FL_SET(hash, HASH_DELETED);
 	    return (VALUE)val;
 	}
@@ -809,7 +809,7 @@ rb_hash_delete(VALUE hash, VALUE key)
 {
     VALUE val;
 
-    rb_hash_modify(hash);
+    rb_hash_modify_check(hash);
     val = rb_hash_delete_key(hash, key);
     if (val != Qundef) return val;
     if (rb_block_given_p()) {
@@ -828,7 +828,6 @@ shift_i(VALUE key, VALUE value, VALUE arg)
 {
     struct shift_var *var = (struct shift_var *)arg;
 
-    if (key == Qundef) return ST_CONTINUE;
     if (var->key != Qundef) return ST_STOP;
     var->key = key;
     var->val = value;
@@ -840,7 +839,6 @@ shift_i_safe(VALUE key, VALUE value, VALUE arg)
 {
     struct shift_var *var = (struct shift_var *)arg;
 
-    if (key == Qundef) return ST_CONTINUE;
     var->key = key;
     var->val = value;
     return ST_STOP;
@@ -864,29 +862,25 @@ rb_hash_shift(VALUE hash)
 {
     struct shift_var var;
 
-    rb_hash_modify(hash);
-    var.key = Qundef;
-    rb_hash_foreach(hash, RHASH(hash)->iter_lev > 0 ? shift_i_safe : shift_i,
-		    (VALUE)&var);
-
-    if (var.key != Qundef) {
-	if (RHASH(hash)->iter_lev > 0) {
-	    rb_hash_delete_key(hash, var.key);
+    rb_hash_modify_check(hash);
+    if (RHASH(hash)->ntbl) {
+	var.key = Qundef;
+	rb_hash_foreach(hash, RHASH(hash)->iter_lev > 0 ? shift_i_safe : shift_i,
+			(VALUE)&var);
+
+	if (var.key != Qundef) {
+	    if (RHASH(hash)->iter_lev > 0) {
+		rb_hash_delete_key(hash, var.key);
+	    }
+	    return rb_assoc_new(var.key, var.val);
 	}
-	return rb_assoc_new(var.key, var.val);
-    }
-    else if (FL_TEST(hash, HASH_PROC_DEFAULT)) {
-	return rb_funcall(RHASH_IFNONE(hash), id_yield, 2, hash, Qnil);
-    }
-    else {
-	return RHASH_IFNONE(hash);
     }
+    return hash_default_value(hash, Qnil);
 }
 
 static int
 delete_if_i(VALUE key, VALUE value, VALUE hash)
 {
-    if (key == Qundef) return ST_CONTINUE;
     if (RTEST(rb_yield_values(2, key, value))) {
 	rb_hash_delete_key(hash, key);
     }
@@ -912,8 +906,9 @@ VALUE
 rb_hash_delete_if(VALUE hash)
 {
     RETURN_ENUMERATOR(hash, 0, 0);
-    rb_hash_modify(hash);
-    rb_hash_foreach(hash, delete_if_i, hash);
+    rb_hash_modify_check(hash);
+    if (RHASH(hash)->ntbl)
+	rb_hash_foreach(hash, delete_if_i, hash);
     return hash;
 }
 
@@ -984,7 +979,6 @@ rb_hash_values_at(int argc, VALUE *argv, VALUE hash)
 static int
 select_i(VALUE key, VALUE value, VALUE result)
 {
-    if (key == Qundef) return ST_CONTINUE;
     if (RTEST(rb_yield_values(2, key, value)))
 	rb_hash_aset(result, key, value);
     return ST_CONTINUE;
@@ -1018,7 +1012,6 @@ rb_hash_select(VALUE hash)
 static int
 keep_if_i(VALUE key, VALUE value, VALUE hash)
 {
-    if (key == Qundef) return ST_CONTINUE;
     if (!RTEST(rb_yield_values(2, key, value))) {
 	return ST_DELETE;
     }
@@ -1040,7 +1033,7 @@ rb_hash_select_bang(VALUE hash)
     st_index_t n;
 
     RETURN_ENUMERATOR(hash, 0, 0);
-    rb_hash_modify(hash);
+    rb_hash_modify_check(hash);
     if (!RHASH(hash)->ntbl)
         return Qnil;
     n = RHASH(hash)->ntbl->num_entries;
@@ -1065,8 +1058,9 @@ VALUE
 rb_hash_keep_if(VALUE hash)
 {
     RETURN_ENUMERATOR(hash, 0, 0);
-    rb_hash_modify(hash);
-    rb_hash_foreach(hash, keep_if_i, hash);
+    rb_hash_modify_check(hash);
+    if (RHASH(hash)->ntbl)
+	rb_hash_foreach(hash, keep_if_i, hash);
     return hash;
 }
 
@@ -1144,9 +1138,7 @@ rb_hash_aset(VALUE hash, VALUE key, VALUE val)
 static int
 replace_i(VALUE key, VALUE val, VALUE hash)
 {
-    if (key != Qundef) {
-	rb_hash_aset(hash, key, val);
-    }
+    rb_hash_aset(hash, key, val);
 
     return ST_CONTINUE;
 }
@@ -1227,7 +1219,6 @@ rb_hash_empty_p(VALUE hash)
 static int
 each_value_i(VALUE key, VALUE value)
 {
-    if (key == Qundef) return ST_CONTINUE;
     rb_yield(value);
     return ST_CONTINUE;
 }
@@ -1262,7 +1253,6 @@ rb_hash_each_value(VALUE hash)
 static int
 each_key_i(VALUE key, VALUE value)
 {
-    if (key == Qundef) return ST_CONTINUE;
     rb_yield(key);
     return ST_CONTINUE;
 }
@@ -1296,7 +1286,6 @@ rb_hash_each_key(VALUE hash)
 static int
 each_pair_i(VALUE key, VALUE value)
 {
-    if (key == Qundef) return ST_CONTINUE;
     rb_yield(rb_assoc_new(key, value));
     return ST_CONTINUE;
 }
@@ -1334,7 +1323,6 @@ rb_hash_each_pair(VALUE hash)
 static int
 to_a_i(VALUE key, VALUE value, VALUE ary)
 {
-    if (key == Qundef) return ST_CONTINUE;
     rb_ary_push(ary, rb_assoc_new(key, value));
     return ST_CONTINUE;
 }
@@ -1367,7 +1355,6 @@ inspect_i(VALUE key, VALUE value, VALUE str)
 {
     VALUE str2;
 
-    if (key == Qundef) return ST_CONTINUE;
     str2 = rb_inspect(key);
     if (RSTRING_LEN(str) > 1) {
 	rb_str_cat2(str, ", ");
@@ -1434,7 +1421,6 @@ rb_hash_to_hash(VALUE hash)
 static int
 keys_i(VALUE key, VALUE value, VALUE ary)
 {
-    if (key == Qundef) return ST_CONTINUE;
     rb_ary_push(ary, key);
     return ST_CONTINUE;
 }
@@ -1465,7 +1451,6 @@ rb_hash_keys(VALUE hash)
 static int
 values_i(VALUE key, VALUE value, VALUE ary)
 {
-    if (key == Qundef) return ST_CONTINUE;
     rb_ary_push(ary, value);
     return ST_CONTINUE;
 }
@@ -1524,7 +1509,6 @@ rb_hash_search_value(VALUE key, VALUE value, VALUE arg)
 {
     VALUE *data = (VALUE *)arg;
 
-    if (key == Qundef) return ST_CONTINUE;
     if (rb_equal(value, data[1])) {
 	data[0] = Qtrue;
 	return ST_STOP;
@@ -1568,7 +1552,6 @@ eql_i(VALUE key, VALUE val1, VALUE arg)
     struct equal_data *data = (struct equal_data *)arg;
     st_data_t val2;
 
-    if (key == Qundef) return ST_CONTINUE;
     if (!st_lookup(data->tbl, key, &val2)) {
 	data->result = Qfalse;
 	return ST_STOP;
@@ -1599,7 +1582,7 @@ hash_equal(VALUE hash1, VALUE hash2, int eql)
     struct equal_data data;
 
     if (hash1 == hash2) return Qtrue;
-    if (TYPE(hash2) != T_HASH) {
+    if (!RB_TYPE_P(hash2, T_HASH)) {
 	if (!rb_respond_to(hash2, rb_intern("to_hash"))) {
 	    return Qfalse;
 	}
@@ -1670,7 +1653,6 @@ hash_i(VALUE key, VALUE val, VALUE arg)
     st_index_t *hval = (st_index_t *)arg;
     st_index_t hdata[2];
 
-    if (key == Qundef) return ST_CONTINUE;
     hdata[0] = rb_hash(key);
     hdata[1] = rb_hash(val);
     *hval ^= st_hash(hdata, sizeof(hdata), 0);
@@ -1711,7 +1693,6 @@ rb_hash_hash(VALUE hash)
 static int
 rb_hash_invert_i(VALUE key, VALUE value, VALUE hash)
 {
-    if (key == Qundef) return ST_CONTINUE;
     rb_hash_aset(hash, value, key);
     return ST_CONTINUE;
 }
@@ -1740,7 +1721,6 @@ rb_hash_invert(VALUE hash)
 static int
 rb_hash_update_i(VALUE key, VALUE value, VALUE hash)
 {
-    if (key == Qundef) return ST_CONTINUE;
     hash_update(hash, key);
     st_insert(RHASH(hash)->ntbl, key, value);
     return ST_CONTINUE;
@@ -1749,7 +1729,6 @@ rb_hash_update_i(VALUE key, VALUE value, VALUE hash)
 static int
 rb_hash_update_block_i(VALUE key, VALUE value, VALUE hash)
 {
-    if (key == Qundef) return ST_CONTINUE;
     if (rb_hash_has_key(hash, key)) {
 	value = rb_yield_values(3, key, rb_hash_aref(hash, key), value);
     }
@@ -1806,7 +1785,6 @@ rb_hash_update_func_i(VALUE key, VALUE value, VALUE arg0)
     struct update_arg *arg = (struct update_arg *)arg0;
     VALUE hash = arg->hash;
 
-    if (key == Qundef) return ST_CONTINUE;
     if (rb_hash_has_key(hash, key)) {
 	value = (*arg->func)(key, rb_hash_aref(hash, key), value);
     }
@@ -1863,7 +1841,6 @@ assoc_i(VALUE key, VALUE val, VALUE arg)
 {
     VALUE *args = (VALUE *)arg;
 
-    if (key == Qundef) return ST_CONTINUE;
     if (RTEST(rb_equal(args[0], key))) {
 	args[1] = rb_assoc_new(key, val);
 	return ST_STOP;
@@ -1901,7 +1878,6 @@ rassoc_i(VALUE key, VALUE val, VALUE arg)
 {
     VALUE *args = (VALUE *)arg;
 
-    if (key == Qundef) return ST_CONTINUE;
     if (RTEST(rb_equal(args[0], val))) {
 	args[1] = rb_assoc_new(key, val);
 	return ST_STOP;
@@ -2198,7 +2174,7 @@ rb_env_path_tainted(void)
 }
 
 #if defined(_WIN32) || (defined(HAVE_SETENV) && defined(HAVE_UNSETENV))
-#elif defined __sun__
+#elif defined __sun
 static int
 in_origenv(const char *str)
 {
@@ -2286,7 +2262,7 @@ ruby_setenv(const char *name, const char *value)
 	    rb_sys_fail("unsetenv");
 #endif
     }
-#elif defined __sun__
+#elif defined __sun
     size_t len;
     char **env_ptr, *str;
     if (strchr(name, '=')) {
@@ -3084,11 +3060,9 @@ env_invert(void)
 static int
 env_replace_i(VALUE key, VALUE val, VALUE keys)
 {
-    if (key != Qundef) {
-	env_aset(Qnil, key, val);
-	if (rb_ary_includes(keys, key)) {
-	    rb_ary_delete(keys, key);
-	}
+    env_aset(Qnil, key, val);
+    if (rb_ary_includes(keys, key)) {
+	rb_ary_delete(keys, key);
     }
     return ST_CONTINUE;
 }
@@ -3120,12 +3094,10 @@ env_replace(VALUE env, VALUE hash)
 static int
 env_update_i(VALUE key, VALUE val)
 {
-    if (key != Qundef) {
-	if (rb_block_given_p()) {
-	    val = rb_yield_values(3, key, rb_f_getenv(Qnil, key), val);
-	}
-	env_aset(Qnil, key, val);
+    if (rb_block_given_p()) {
+	val = rb_yield_values(3, key, rb_f_getenv(Qnil, key), val);
     }
+    env_aset(Qnil, key, val);
     return ST_CONTINUE;
 }
 
@@ -3150,15 +3122,116 @@ env_update(VALUE env, VALUE hash)
 }
 
 /*
- *  A <code>Hash</code> is a collection of key-value pairs. It is
- *  similar to an <code>Array</code>, except that indexing is done via
- *  arbitrary keys of any object type, not an integer index. Hashes enumerate
- *  their values in the order that the corresponding keys were inserted.
+ *  A Hash is a dictionary-like collection of unique keys and their values.
+ *  Also called associative arrays, they are similar to Arrays, but where an
+ *  Array uses integers as its index, a Hash allows you to use any object
+ *  type.
+ *
+ *  Hashes enumerate their values in the order that the corresponding keys
+ *  were inserted.
+ *
+ *  A Hash can be easily created by using its implicit form:
+ *
+ *    grades = { "Jane Doe" => 10, "Jim Doe" => 6 }
+ *
+ *  Hashes allow an alternate syntax form when your keys are always symbols.
+ *  Instead of
+ *
+ *    options = { :font_size => 10, :font_family => "Arial" }
+ *
+ *  You could write it as:
+ *
+ *    options = { font_size: 10, font_family: "Arial" }
+ *
+ *  Each named key is a symbol you can access in hash:
+ *
+ *    options[:font_size]  # => 10
+ *
+ *  A Hash can also be created through its ::new method:
+ *
+ *    grades = Hash.new
+ *    grades["Dorothy Doe"] = 9
  *
  *  Hashes have a <em>default value</em> that is returned when accessing
- *  keys that do not exist in the hash. By default, that value is
- *  <code>nil</code>.
+ *  keys that do not exist in the hash. If no default is set +nil+ is used.
+ *  You can set the default value by sending it as an argument to Hash.new:
+ *
+ *    grades = Hash.new(0)
+ *
+ *  Or by using the #default= method:
+ *
+ *    grades = {"Timmy Doe" => 8}
+ *    grades.default = 0
+ *
+ *  Accessing a value in a Hash requires using its key:
+ *
+ *    puts grades["Jane Doe"] # => 10
+ *
+ *  === Common Uses
+ *
+ *  Hashes are an easy way to represent data structures, such as
+ *
+ *    books         = {}
+ *    books[:matz]  = "The Ruby Language"
+ *    books[:black] = "The Well-Grounded Rubyist"
+ *
+ *  Hashes are also commonly used as a way to have named parameters in
+ *  functions. Note that no brackets are used below. If a hash is the last
+ *  argument on a method call, no braces are needed, thus creating a really
+ *  clean interface:
+ *
+ *    Person.create(name: "John Doe", age: 27)
+ *
+ *    def self.create(params)
+ *      @name = params[:name]
+ *      @age  = params[:age]
+ *    end
+ *
+ *  === Hash Keys
+ *
+ *  Two objects refer to the same hash key when their <code>hash</code> value
+ *  is identical and the two objects are <code>eql?</code> to each other.
+ *
+ *  A user-defined class may be used as a hash key if the <code>hash</code>
+ *  and <code>eql?</code> methods are overridden to provide meaningful
+ *  behavior.  By default, separate instances refer to separate hash keys.
+ *
+ *  A typical implementation of <code>hash</code> is based on the
+ *  object's data while <code>eql?</code> is usually aliased to the overridden
+ *  <code>==</code> method:
+ *
+ *    class Book
+ *      attr_reader :author, :title
+ *
+ *      def initialize(author, title)
+ *        @author = author
+ *        @title = title
+ *      end
+ *
+ *      def ==(other)
+ *        self.class === other and
+ *          other.author == @author and
+ *          other.title == @title
+ *      end
+ *
+ *      alias eql? ==
+ *
+ *      def hash
+ *        @author.hash ^ @title.hash # XOR
+ *      end
+ *    end
+ *
+ *    book1 = Book.new 'matz', 'Ruby in a Nutshell'
+ *    book2 = Book.new 'matz', 'Ruby in a Nutshell'
+ *
+ *    reviews = {}
+ *
+ *    reviews[book1] = 'Great reference!'
+ *    reviews[book2] = 'Nice and compact!'
+ *
+ *    reviews.length #=> 1
  *
+ *  See also Object#hash and Object#eql?
  */
 
 void
diff --git a/include/ruby/st.h b/include/ruby/st.h
index 50f2a75..119dfde 100644
--- a/include/ruby/st.h
+++ b/include/ruby/st.h
@@ -36,7 +36,7 @@ typedef unsigned long st_data_t;
 #elif SIZEOF_LONG_LONG == SIZEOF_VOIDP
 typedef unsigned LONG_LONG st_data_t;
 #else
-# error ---->> st.c requires sizeof(void*) == sizeof(long) to be compiled. <<----
+# error ---->> st.c requires sizeof(void*) == sizeof(long) or sizeof(LONG_LONG) to be compiled. <<----
 #endif
 #define ST_DATA_T_DEFINED
 
@@ -74,6 +74,11 @@ struct st_hash_type {
 
 #define ST_INDEX_BITS (sizeof(st_index_t) * CHAR_BIT)
 
+typedef struct st_packed_entry {
+    st_index_t hash;
+    st_data_t key, val;
+} st_packed_entry;
+
 struct st_table {
     const struct st_hash_type *type;
     st_index_t num_bins;
@@ -91,8 +96,17 @@ struct st_table {
     __extension__
 #endif
     st_index_t num_entries : ST_INDEX_BITS - 1;
-    struct st_table_entry **bins;
-    struct st_table_entry *head, *tail;
+    union {
+	struct {
+	    struct st_table_entry **bins;
+	    struct st_table_entry *head, *tail;
+	} big;
+	struct {
+	    struct st_packed_entry *entries;
+	    st_index_t real_entries;
+	} packed;
+	st_packed_entry upacked;
+    } as;
 };
 
 #define st_is_member(table,key) st_lookup((table),(key),(st_data_t *)0)
@@ -114,6 +128,7 @@ int st_insert2(st_table *, st_data_t, st_data_t, st_data_t (*)(st_data_t));
 int st_lookup(st_table *, st_data_t, st_data_t *);
 int st_get_key(st_table *, st_data_t, st_data_t *);
 int st_foreach(st_table *, int (*)(ANYARGS), st_data_t);
+int st_foreach_check(st_table *, int (*)(ANYARGS), st_data_t, st_data_t);
 int st_reverse_foreach(st_table *, int (*)(ANYARGS), st_data_t);
 void st_add_direct(st_table *, st_data_t, st_data_t);
 void st_free_table(st_table *);
diff --git a/internal.h b/internal.h
index 5d0cff0..99b4015 100644
--- a/internal.h
+++ b/internal.h
@@ -112,6 +112,9 @@ VALUE rb_iseq_clone(VALUE iseqval, VALUE newcbase);
 
 /* load.c */
 VALUE rb_get_load_path(void);
+void rb_reset_expanded_cache();
+void rb_load_path_ary_push(VALUE path);
+extern VALUE rb_cExpandedPath;
 
 /* math.c */
 VALUE rb_math_atan2(VALUE, VALUE);
diff --git a/load.c b/load.c
index 0ff4b60..80b2256 100644
--- a/load.c
+++ b/load.c
@@ -4,6 +4,7 @@
 
 #include "ruby/ruby.h"
 #include "ruby/util.h"
+#include "ruby/encoding.h"
 #include "internal.h"
 #include "dln.h"
 #include "eval_intern.h"
@@ -18,6 +19,7 @@ VALUE ruby_dln_librefs;
 #define IS_DLEXT(e) (strcmp((e), DLEXT) == 0)
 #endif
 
+static int sorted_loaded_features = 1;
 
 static const char *const loadable_ext[] = {
     ".rb", DLEXT,
@@ -27,28 +29,45 @@ static const char *const loadable_ext[] = {
     0
 };
 
-VALUE
-rb_get_load_path(void)
-{
-    VALUE load_path = GET_VM()->load_path;
-    return load_path;
-}
+static VALUE rb_checked_expanded_cache(int*);
+static void rb_set_expanded_cache(VALUE, int);
+static VALUE rb_expand_load_paths(long, VALUE*, int*);
+static int cached_expanded_load_path = 1;
+VALUE rb_cExpandedPath;
 
 VALUE
 rb_get_expanded_load_path(void)
 {
-    VALUE load_path = rb_get_load_path();
-    VALUE ary;
-    long i;
+    VALUE expanded = rb_checked_expanded_cache(NULL);
 
-    ary = rb_ary_new2(RARRAY_LEN(load_path));
-    for (i = 0; i < RARRAY_LEN(load_path); ++i) {
-	VALUE path = rb_file_expand_path(RARRAY_PTR(load_path)[i], Qnil);
-	rb_str_freeze(path);
-	rb_ary_push(ary, path);
+    if ( !RTEST(expanded) ) {
+	VALUE load_path = GET_VM()->load_path;
+	int has_relative = 0;
+
+	if (!load_path) return 0;
+
+	expanded = rb_expand_load_paths(
+			RARRAY_LEN(load_path), RARRAY_PTR(load_path),
+			&has_relative);
+	RB_GC_GUARD(load_path);
+
+	if (cached_expanded_load_path) {
+	    rb_set_expanded_cache(expanded, has_relative);
+	}
+    } else {
+	expanded = rb_ary_dup(expanded);
     }
-    rb_obj_freeze(ary);
-    return ary;
+    return expanded;
+}
+
+VALUE
+rb_get_load_path(void)
+{
+    VALUE load_path =
+	cached_expanded_load_path ?
+	    rb_get_expanded_load_path():
+	    GET_VM()->load_path;
+    return load_path;
 }
 
 static VALUE
@@ -129,6 +148,9 @@ loaded_feature_path_i(st_data_t v, st_data_t b, st_data_t f)
     return ST_STOP;
 }
 
+static long rb_feature_first_equal_or_greater(VALUE, const char *, long);
+static int  rb_stop_search_feature(VALUE, const char *, long);
+
 static int
 rb_feature_p(const char *feature, const char *ext, int rb, int expanded, const char **fn)
 {
@@ -151,8 +173,10 @@ rb_feature_p(const char *feature, const char *ext, int rb, int expanded, const c
 	type = 0;
     }
     features = get_loaded_features();
-    for (i = 0; i < RARRAY_LEN(features); ++i) {
+    i = rb_feature_first_equal_or_greater(features, feature, len);
+    for (; i < RARRAY_LEN(features); ++i) {
 	v = RARRAY_PTR(features)[i];
+	if (rb_stop_search_feature(v, feature, len)) break;
 	f = StringValuePtr(v);
 	if ((n = RSTRING_LEN(v)) < len) continue;
 	if (strncmp(f, feature, len) != 0) {
@@ -176,14 +200,14 @@ rb_feature_p(const char *feature, const char *ext, int rb, int expanded, const c
 	}
     }
     loading_tbl = get_loading_table();
-    if (loading_tbl) {
+    if (loading_tbl && loading_tbl->num_entries > 0) {
 	f = 0;
 	if (!expanded) {
 	    struct loaded_feature_searching fs;
 	    fs.name = feature;
 	    fs.len = len;
 	    fs.type = type;
-	    fs.load_path = load_path ? load_path : rb_get_load_path();
+	    fs.load_path = load_path ? load_path : rb_get_expanded_load_path();
 	    fs.result = 0;
 	    st_foreach(loading_tbl, loaded_feature_path_i, (st_data_t)&fs);
 	    if ((f = fs.result) != 0) {
@@ -251,6 +275,170 @@ rb_feature_provided(const char *feature, const char **loading)
     return FALSE;
 }
 
+static long
+feature_basename_length(const char *feature, long flen)
+{
+    if (sorted_loaded_features) {
+	const char *ext = strrchr(feature, '.');
+	return ext && !strchr(ext, '/') ? ext - feature : flen;
+    } else {
+	return 0;
+    }
+}
+
+static int
+compare_feature_name(const char *left, long llen, const char *right, long rlen)
+{
+    int diff = 0;
+    while (llen-- && rlen--) {
+	diff = left[llen] - right[rlen];
+	if (diff) break;
+	if (left[llen] == '/') break;
+    }
+    return diff;
+}
+
+static int
+rb_compare_feature_name(VALUE loaded, const char *feature, long flen)
+{
+    const char *loaded_name = StringValuePtr(loaded);
+    long loaded_len = feature_basename_length(loaded_name, RSTRING_LEN(loaded));
+    return compare_feature_name(loaded_name, loaded_len, feature, flen);
+}
+
+/* used to find when equal features run out */
+static int
+rb_stop_search_feature(VALUE loaded, const char *feature, long flen)
+{
+    if (sorted_loaded_features)
+	return rb_compare_feature_name(loaded, feature, flen) > 0;
+    else
+	return FALSE;
+}
+
+/* returns first position to search feature from */
+static long
+rb_feature_first_equal_or_greater(VALUE features, const char *feature, long flen)
+{
+    if (sorted_loaded_features) {
+	long before = 0, first = RARRAY_LEN(features);
+	VALUE *values = RARRAY_PTR(features);
+	if (first == 0)
+	    return 0;
+	if (rb_compare_feature_name(values[0], feature, flen) >= 0)
+	    return 0;
+
+	while (first - before > 1) {
+	    long mid = (first + before) / 2;
+	    long cmp = rb_compare_feature_name(values[mid], feature, flen);
+	    if (cmp >= 0)
+		first = mid;
+	    else
+		before = mid;
+	}
+	return first;
+    } else {
+	return 0;
+    }
+}
+
+/* returns position to insert new feature in */
+static long
+rb_feature_first_greater(VALUE features, const char *feature, long flen)
+{
+    if (sorted_loaded_features) {
+	long before = 0, first = RARRAY_LEN(features);
+	VALUE *values = RARRAY_PTR(features);
+	if (first == 0)
+	    return 0;
+	if (rb_compare_feature_name(values[0], feature, flen) > 0)
+	    return 0;
+	if (rb_compare_feature_name(values[first-1], feature, flen) <= 0)
+	    return first;
+
+	while (first - before > 1) {
+	    long mid = (first + before) / 2;
+	    long cmp = rb_compare_feature_name(values[mid], feature, flen);
+	    if (cmp > 0)
+		first = mid;
+	    else
+		before = mid;
+	}
+	return first;
+    } else {
+	return RARRAY_LEN(features);
+    }
+}
+
+
+static VALUE
+rb_push_feature_1(VALUE features, VALUE feature)
+{
+    const char *fname = StringValuePtr(feature);
+    long flen = feature_basename_length(fname, RSTRING_LEN(feature));
+    long i = rb_feature_first_greater(features, fname, flen);
+    rb_ary_push(features, feature);
+    if ( i < RARRAY_LEN(features) - 1 ) {
+	MEMMOVE(RARRAY_PTR(features) + i + 1, RARRAY_PTR(features) + i,
+		VALUE, RARRAY_LEN(features) - i - 1);
+	RARRAY_PTR(features)[i] = feature;
+    }
+    return features;
+}
+
+static VALUE
+rb_push_feature_m(long argc, VALUE *argv, VALUE features)
+{
+    while (argc--) {
+	rb_push_feature_1(features, *argv++);
+    }
+    return features;
+}
+
+static VALUE
+rb_concat_features(VALUE features, VALUE add)
+{
+    add = rb_convert_type(add, T_ARRAY, "Array", "to_ary");
+    if (RARRAY_LEN(add)) {
+	rb_push_feature_m(RARRAY_LEN(add), RARRAY_PTR(add), features);
+    }
+    return features;
+}
+static const char *load_features_undefined_methods[] = {
+    "[]=", "reverse!", "rotate!", "sort!", "sort_by!",
+    "collect!", "map!", "shuffle!", "fill", "insert",
+    NULL
+};
+
+static VALUE
+rb_loaded_features_init(void)
+{
+    char *sorted_flag;
+    const char **name;
+    VALUE loaded_features = rb_ary_new();
+    VALUE loaded_features_c = rb_singleton_class(loaded_features);
+
+    sorted_flag = getenv("RUBY_LOADED_FEATURES_SORTED");
+    if (sorted_flag != NULL) {
+	int sorted_set = atoi(sorted_flag);
+	if (RTEST(ruby_verbose))
+	    fprintf(stderr, "sorted_loaded_features=%d (%d)\n", sorted_set, sorted_loaded_features);
+	sorted_loaded_features = sorted_set;
+    }
+
+    for(name = load_features_undefined_methods; *name; name++) {
+	rb_undef_method(loaded_features_c, *name);
+    }
+
+    if (sorted_loaded_features) {
+	rb_define_method(loaded_features_c, "<<", rb_push_feature_1, 1);
+	rb_define_method(loaded_features_c, "push", rb_push_feature_m, -1);
+	rb_define_method(loaded_features_c, "concat", rb_concat_features, 1);
+	rb_define_method(loaded_features_c, "unshift", rb_push_feature_m, -1);
+    }
+    return loaded_features;
+}
+
 static void
 rb_provide_feature(VALUE feature)
 {
@@ -258,7 +446,10 @@ rb_provide_feature(VALUE feature)
 	rb_raise(rb_eRuntimeError,
 		 "$LOADED_FEATURES is frozen; cannot append feature");
     }
-    rb_ary_push(get_loaded_features(), feature);
+    if (sorted_loaded_features)
+	rb_push_feature_1(get_loaded_features(), feature);
+    else
+	rb_ary_push(get_loaded_features(), feature);
 }
 
 void
@@ -760,6 +951,230 @@ rb_f_autoload_p(VALUE obj, VALUE sym)
     return rb_mod_autoload_p(klass, sym);
 }
 
+/* $LOAD_PATH methods which invalidates cache */
+static const char *load_path_reset_cache_methods[] = {
+    "[]=", "collect!", "compact!", "delete",
+    "delete_if", "fill", "flatten!", "insert", "keep_if",
+    "map!", "reject!", "replace", "select!", "shuffle!",
+    "sort!", "sort_by!", "uniq!", NULL
+};
+
+/* $LOAD_PATH methods which sends also to cache */
+static const char *load_path_apply_to_cache_methods[] = {
+    "clear", "delete_at", "pop", "reverse!", "rotate!",
+    "shift", "slice!", NULL
+};
+
+/* $LOAD_PATH methods which sends to cache whith expanded arguments */
+static const char *load_path_apply_expanded_methods[] = {
+    "<<", "push", "unshift", NULL
+};
+
+void
+rb_reset_expanded_cache()
+{
+    GET_VM()->load_path_expanded_cache = 0;
+}
+
+static VALUE
+rb_load_path_expanded_cache()
+{
+    VALUE cache = GET_VM()->load_path_expanded_cache;
+    VALUE expanded = Qnil;
+    if (RTEST(cache)) {
+	expanded = RARRAY_PTR(cache)[2];
+    }
+    return expanded;
+}
+
+/* Return cache only if we still in the same working directory
+ * and filesystem_encoding didn't change
+ * Invalidate cache otherwise
+ */
+static VALUE
+rb_checked_expanded_cache(int *has_relative)
+{
+    VALUE cache = GET_VM()->load_path_expanded_cache;
+    VALUE expanded = Qnil;
+    if (RTEST(cache)) {
+	VALUE curwd = RARRAY_PTR(cache)[0];
+	VALUE encindex = RARRAY_PTR(cache)[1];
+	int cache_valid = rb_filesystem_encindex() == FIX2INT(encindex);
+
+	if ( cache_valid ) {
+	    cache_valid = curwd == Qtrue;
+	    if (has_relative) {
+		*has_relative = cache_valid;
+	    }
+	    if (!cache_valid ) {
+		char *cwd = my_getcwd();
+		cache_valid = !strcmp(RSTRING_PTR(curwd), cwd);
+		xfree(cwd);
+	    }
+	}
+
+	if ( !cache_valid ) {
+	    rb_reset_expanded_cache();
+	} else {
+	    expanded = RARRAY_PTR(cache)[2];
+	}
+    }
+    RB_GC_GUARD(cache);
+    return expanded;
+}
+
+static void
+rb_set_expanded_cache(VALUE expanded, int has_relative)
+{
+    VALUE cache = rb_ary_new2(3);
+
+    if (has_relative) {
+	char *cwd = my_getcwd();
+	rb_ary_push(cache, rb_str_new_cstr(cwd));
+	xfree(cwd);
+    } else {
+	rb_ary_push(cache, Qtrue);
+    }
+
+    rb_ary_push(cache, INT2FIX(rb_filesystem_encindex()));
+    rb_ary_push(cache, rb_ary_dup(expanded));
+    GET_VM()->load_path_expanded_cache = cache;
+}
+
+static VALUE
+rb_expand_load_paths(long pathc, VALUE* paths, int *has_relative)
+{
+    long i;
+    const char *p;
+    VALUE path, expanded = rb_ary_new2(pathc);
+
+    for(i = 0; i < pathc; i++) {
+	path = rb_get_path(paths[i]);
+	p = RSTRING_PTR(path);
+	*has_relative = *has_relative || !rb_is_absolute_path(p);
+	path = rb_file_expand_path(path, Qnil);
+	RBASIC(path)->klass = rb_cExpandedPath;
+	rb_str_freeze(path);
+	rb_ary_push(expanded, path);
+    }
+
+    return expanded;
+}
+
+/* Invalidating $LOAD_PATH methods implementation */
+static VALUE
+rb_load_path_reset_cache_method(int argc, VALUE *argv, VALUE self)
+{
+    rb_reset_expanded_cache();
+    return rb_call_super(argc, argv);
+}
+
+/* Proxying $LOAD_PATH methods implementation */
+static VALUE
+rb_load_path_apply_to_cache_method(int argc, VALUE *argv, VALUE self)
+{
+    VALUE load_path_expanded = rb_load_path_expanded_cache();
+    if (RTEST(load_path_expanded)) {
+	ID func = rb_frame_this_func();
+	rb_funcall2(load_path_expanded, func, argc, argv);
+    }
+    return rb_call_super(argc, argv);
+}
+
+/* Proxying with expansion $LOAD_PATH methods implementation */
+static VALUE
+rb_load_path_apply_expanded_method(int argc, VALUE *argv, VALUE self)
+{
+    int old_has_relative = 0;
+    /* We call methods on cache only if we still in the same working directory */
+    VALUE load_path_expanded = rb_checked_expanded_cache(&old_has_relative);
+    if (RTEST(load_path_expanded)) {
+	int has_relative = 0;
+	ID func = rb_frame_this_func();
+	VALUE expanded = rb_expand_load_paths(argc, argv, &has_relative);
+
+	rb_funcall2(load_path_expanded, func, argc, RARRAY_PTR(expanded));
+
+	if (!old_has_relative && has_relative) {
+	    rb_set_expanded_cache(load_path_expanded, has_relative);
+	}
+	RB_GC_GUARD(expanded);
+    }
+    return rb_call_super(argc, argv);
+}
+/* $LOAD_PATH.concat(ary) - special, we call push(*ary) instead
+ * cause I'm lazy a bit and wish not to rewrite method above second time :)
+ */
+static VALUE
+rb_load_path_concat(VALUE self, VALUE ary)
+{
+    ID push;
+    CONST_ID(push, "push");
+    RB_GC_GUARD(ary);
+    return rb_funcall2(self, push, (int)RARRAY_LEN(ary), RARRAY_PTR(ary));
+}
+
+void
+rb_load_path_ary_push(VALUE path)
+{
+    int old_has_relative = 0;
+    VALUE load_path_expanded = rb_checked_expanded_cache(&old_has_relative);
+    if (RTEST(load_path_expanded)) {
+	int has_relative = 0;
+	VALUE expanded = rb_expand_load_paths(1, &path, &has_relative);
+
+	rb_ary_push(load_path_expanded, RARRAY_PTR(expanded)[0]);
+
+	if (!old_has_relative && has_relative) {
+	    rb_set_expanded_cache(load_path_expanded, has_relative);
+	}
+	RB_GC_GUARD(expanded);
+    }
+
+    rb_ary_push(GET_VM()->load_path, path);
+}
+
+static VALUE
+rb_load_path_init(void)
+{
+    const char **name;
+    VALUE load_path = rb_ary_new();
+    char *cached_flag;
+
+    cached_flag = getenv("RUBY_CACHED_LOAD_PATH");
+    if (cached_flag != NULL) {
+	cached_expanded_load_path = atoi(cached_flag);
+    }
+
+    rb_cExpandedPath = rb_class_new(rb_cString); /* XXX could GC collect it before next line is executed? */
+    rb_iv_set(rb_cFile, "expanded_path", rb_cExpandedPath); /* prevent from GC */
+
+    /* Do all the magick if user did not disable it
+     * with RUBY_CACHED_LOAD_PATH=0 environment variable
+     */
+    if (cached_expanded_load_path) {
+	VALUE load_path_c = rb_singleton_class(load_path);
+
+	for(name = load_path_reset_cache_methods; *name; name++ ) {
+	    rb_define_method(load_path_c, *name, rb_load_path_reset_cache_method, -1);
+	}
+
+	for(name = load_path_apply_to_cache_methods; *name; name++ ) {
+	    rb_define_method(load_path_c, *name, rb_load_path_apply_to_cache_method, -1);
+	}
+
+	for(name = load_path_apply_expanded_methods; *name; name++ ) {
+	    rb_define_method(load_path_c, *name, rb_load_path_apply_expanded_method, -1);
+	}
+
+	rb_define_method(load_path_c, "concat", rb_load_path_concat, 1);
+    }
+
+    rb_reset_expanded_cache();
+
+    return load_path;
+}
+
 void
 Init_load()
 {
@@ -772,11 +1187,11 @@ Init_load()
     rb_define_hooked_variable(var_load_path, (VALUE*)vm, load_path_getter, rb_gvar_readonly_setter);
     rb_alias_variable(rb_intern("$-I"), id_load_path);
     rb_alias_variable(rb_intern("$LOAD_PATH"), id_load_path);
-    vm->load_path = rb_ary_new();
+    vm->load_path = rb_load_path_init();
 
     rb_define_virtual_variable("$\"", get_loaded_features, 0);
     rb_define_virtual_variable("$LOADED_FEATURES", get_loaded_features, 0);
-    vm->loaded_features = rb_ary_new();
+    vm->loaded_features = rb_loaded_features_init();
 
     rb_define_global_function("load", rb_f_load, -1);
     rb_define_global_function("require", rb_f_require, 1);
diff --git a/pool_alloc.h b/pool_alloc.h
new file mode 100644
index 0000000..957708e
--- /dev/null
+++ b/pool_alloc.h
@@ -0,0 +1,11 @@
+#ifndef POOL_ALLOC_H
+#define POOL_ALLOC_H
+
+#define POOL_ALLOC_API
+#ifdef POOL_ALLOC_API
+void  ruby_xpool_free(void *ptr);
+void *ruby_xpool_malloc_6p();
+void *ruby_xpool_malloc_11p();
+#endif
+
+#endif
diff --git a/pool_alloc.inc.h b/pool_alloc.inc.h
new file mode 100644
index 0000000..026f40c
--- /dev/null
+++ b/pool_alloc.inc.h
@@ -0,0 +1,223 @@
+/*
+ * this is generic pool allocator
+ * you should define following macroses:
+ * ITEM_NAME - unique identifier, which allows to hold functions in a namespace
+ * ITEM_TYPEDEF(name) - passed to typedef to localize item type
+ * free_entry - desired name of function for free entry
+ * alloc_entry - defired name of function for allocate entry
+ */
+
+#if POOL_ALLOC_PART == 1
+#ifdef HEAP_ALIGN_LOG
+#define DEFAULT_POOL_SIZE (1 << HEAP_ALIGN_LOG)
+#else
+#define DEFAULT_POOL_SIZE (sizeof(void*) * 2048)
+#endif
+typedef unsigned int pool_holder_counter;
+
+typedef struct pool_entry_list pool_entry_list;
+typedef struct pool_holder pool_holder;
+
+typedef struct pool_header {
+    pool_holder         *first;
+    rb_atomic_t          lock;
+    pool_holder_counter  size; // size of entry in sizeof(void*) items
+    pool_holder_counter  total; // size of entry in sizeof(void*) items
+} pool_header;
+
+struct pool_holder {
+    pool_holder_counter free, total;
+    pool_header  *header;
+    void               *freep;
+    pool_holder        *fore, *back;
+    void *data[1];
+};
+#define POOL_DATA_SIZE(pool_size) (((pool_size) - sizeof(void*) * 6 - offsetof(pool_holder, data)) / sizeof(void*))
+#define POOL_ENTRY_SIZE(item_type) ((sizeof(item_type) - 1) / sizeof(void*) + 1)
+#define POOL_HOLDER_COUNT(pool_size, item_type) (POOL_DATA_SIZE(pool_size)/POOL_ENTRY_SIZE(item_type))
+#define INIT_POOL(item_type) {NULL, 0, POOL_ENTRY_SIZE(item_type), POOL_HOLDER_COUNT(DEFAULT_POOL_SIZE, item_type)}
+
+#elif POOL_ALLOC_PART == 2
+
+#if   defined(_WIN32)
+#define native_thread_yield() Sleep(0)
+#elif HAVE_SCHED_YIELD
+#define native_thread_yield() (void)sched_yield()
+#else
+#define native_thread_yield() ((void)0)
+#endif
+
+#define MAX_TRY_CICLES 5
+static inline int
+living_threads()
+{
+    rb_vm_t *vm = GET_VM();
+    st_table *living_threads;
+    return vm && (living_threads = vm->living_threads) ? living_threads->num_entries : 1;
+}
+
+static void
+lock_header(pool_header *header)
+{
+    int i;
+    if (living_threads() == 1) {
+	header->lock = 1;
+	return;
+    }
+    i = MAX_TRY_CICLES;
+    while(ATOMIC_EXCHANGE(header->lock, 1)) {
+	if (--i == 0) {
+	    native_thread_yield();
+	    i = MAX_TRY_CICLES;
+	}
+    }
+}
+
+static inline void
+unlock_header(pool_header *header)
+{
+    if (living_threads() == 1) {
+	header->lock = 0;
+	return;
+    }
+    ATOMIC_SET(header->lock, 0);
+}
+
+static pool_holder *
+pool_holder_alloc(pool_header *header)
+{
+    pool_holder *holder;
+    pool_holder_counter i, size, count;
+    register void **ptr;
+
+    size_t sz = offsetof(pool_holder, data) +
+	    header->size * header->total * sizeof(void*);
+#define objspace (&rb_objspace)
+    unlock_header(header);
+    vm_malloc_prepare(objspace, DEFAULT_POOL_SIZE);
+    lock_header(header);
+    if (header->first != NULL) {
+	return header->first;
+    }
+    holder = (pool_holder*) aligned_malloc(DEFAULT_POOL_SIZE, sz);
+    if (!holder) {
+	unlock_header(header);
+	if (!garbage_collect_with_gvl(objspace)) {
+	    ruby_memerror();
+	}
+	holder = (pool_holder*) aligned_malloc(DEFAULT_POOL_SIZE, sz);
+	if (!holder) {
+	    ruby_memerror();
+	}
+	lock_header(header);
+    }
+    malloc_increase += DEFAULT_POOL_SIZE;
+#if CALC_EXACT_MALLOC_SIZE
+    objspace->malloc_params.allocated_size += DEFAULT_POOL_SIZE;
+    objspace->malloc_params.allocations++;
+#endif
+#undef objspace
+
+    size = header->size;
+    count = header->total;
+    holder->free = count;
+    holder->total = count;
+    holder->header = header;
+    holder->fore = NULL;
+    holder->back = NULL;
+    holder->freep = &holder->data;
+    ptr = holder->data;
+    for(i = count - 1; i; i-- ) {
+	ptr = *ptr = ptr + size;
+    }
+    *ptr = NULL;
+    header->first = holder;
+    return holder;
+}
+
+static inline void
+pool_holder_unchaing(pool_header *header, pool_holder *holder)
+{
+    register pool_holder *fore = holder->fore, *back = holder->back;
+    holder->fore = NULL;
+    holder->back = NULL;
+    if (fore != NULL)  fore->back     = back;
+    if (back != NULL)  back->fore     = fore;
+    else               header->first = fore;
+}
+
+static inline pool_holder *
+entry_holder(void **entry)
+{
+    return (pool_holder*)(((uintptr_t)entry) & ~(DEFAULT_POOL_SIZE - 1));
+}
+
+static inline void
+pool_free_entry(void **entry)
+{
+    pool_holder *holder = entry_holder(entry);
+    pool_header *header = holder->header;
+
+    lock_header(header);
+
+    if (holder->free++ == 0) {
+	register pool_holder *first = header->first;
+	if (first == NULL) {
+	    header->first = holder;
+	} else {
+	    holder->back = first;
+	    holder->fore = first->fore;
+	    first->fore = holder;
+	    if (holder->fore)
+		holder->fore->back = holder;
+	}
+    } else if (holder->free == holder->total && header->first != holder ) {
+	pool_holder_unchaing(header, holder);
+	aligned_free(holder);
+#if CALC_EXACT_MALLOC_SIZE
+	rb_objspace.malloc_params.allocated_size -= DEFAULT_POOL_SIZE;
+	rb_objspace.malloc_params.allocations--;
+#endif
+        unlock_header(header);
+	return;
+    }
+
+    *entry = holder->freep;
+    holder->freep = entry;
+    unlock_header(header);
+}
+
+static inline void*
+pool_alloc_entry(pool_header *header)
+{
+    pool_holder *holder;
+    void **result;
+
+    lock_header(header);
+    holder = header->first;
+
+    if (holder == NULL) {
+	holder = pool_holder_alloc(header);
+    }
+
+    result = holder->freep;
+    holder->freep = *result;
+
+    if (--holder->free == 0) {
+	pool_holder_unchaing(header, holder);
+    }
+
+    unlock_header(header);
+
+    return result;
+}
+
+static void
+pool_finalize_header(pool_header *header)
+{
+    if (header->first) {
+        aligned_free(header->first);
+        header->first = NULL;
+    }
+}
+#endif
diff --git a/ruby.c b/ruby.c
index 3c97d01..b9b9fd5 100644
--- a/ruby.c
+++ b/ruby.c
@@ -209,7 +209,6 @@ push_include(const char *path, VALUE (*filter)(VALUE))
 {
     const char sep = PATH_SEP_CHAR;
     const char *p, *s;
-    VALUE load_path = GET_VM()->load_path;
 
     p = path;
     while (*p) {
@@ -217,7 +216,7 @@ push_include(const char *path, VALUE (*filter)(VALUE))
 	    p++;
 	if (!*p) break;
 	for (s = p; *s && *s != sep; s = CharNext(s));
-	rb_ary_push(load_path, (*filter)(rubylib_mangled_path(p, s - p)));
+	rb_load_path_ary_push((*filter)(rubylib_mangled_path(p, s - p)));
 	p = s;
     }
 }
@@ -338,7 +337,6 @@ ruby_init_loadpath(void)
 void
 ruby_init_loadpath_safe(int safe_level)
 {
-    VALUE load_path;
     ID id_initial_load_path_mark;
     extern const char ruby_initial_load_paths[];
     const char *paths = ruby_initial_load_paths;
@@ -438,7 +436,6 @@ ruby_init_loadpath_safe(int safe_level)
 #define RUBY_RELATIVE(path, len) rubylib_mangled_path((path), (len))
 #define PREFIX_PATH() RUBY_RELATIVE(exec_prefix, sizeof(exec_prefix)-1)
 #endif
-    load_path = GET_VM()->load_path;
 
     if (safe_level == 0) {
 #ifdef MANGLED_PATH
@@ -452,7 +449,7 @@ ruby_init_loadpath_safe(int safe_level)
 	size_t len = strlen(paths);
 	VALUE path = RUBY_RELATIVE(paths, len);
 	rb_ivar_set(path, id_initial_load_path_mark, path);
-	rb_ary_push(load_path, path);
+	rb_load_path_ary_push(path);
 	paths += len + 1;
     }
 
@@ -1349,6 +1346,7 @@ process_options(int argc, char **argv, struct cmdline_options *opt)
 	for (i = 0; i < RARRAY_LEN(load_path); ++i) {
 	    rb_enc_associate(RARRAY_PTR(load_path)[i], lenc);
 	}
+	rb_reset_expanded_cache();
     }
     if (!(opt->disable & DISABLE_BIT(gems))) {
 #if defined DISABLE_RUBYGEMS && DISABLE_RUBYGEMS
diff --git a/st.c b/st.c
index fda5784..890bdca 100644
--- a/st.c
+++ b/st.c
@@ -7,6 +7,7 @@
 #include "st.h"
 #else
 #include "ruby/ruby.h"
+#include "pool_alloc.h"
 #endif
 
 #include <stdio.h>
@@ -25,8 +26,17 @@ struct st_table_entry {
     st_table_entry *fore, *back;
 };
 
-#define ST_DEFAULT_MAX_DENSITY 5
+#define STATIC_ASSERT(name, expr) typedef int static_assert_##name##_check[(expr) ? 1 : -1];
+
+#define ST_DEFAULT_MAX_DENSITY 2
 #define ST_DEFAULT_INIT_TABLE_SIZE 11
+#define ST_DEFAULT_SECOND_TABLE_SIZE 19
+#define ST_DEFAULT_PACKED_TABLE_SIZE 18
+#define PACKED_UNIT (int)(sizeof(st_packed_entry) / sizeof(st_table_entry*))
+#define MAX_PACKED_HASH (int)(ST_DEFAULT_PACKED_TABLE_SIZE * sizeof(st_table_entry*) / sizeof(st_packed_entry))
+
+STATIC_ASSERT(st_packed_entry, sizeof(st_packed_entry) == sizeof(st_table_entry*[PACKED_UNIT]))
+STATIC_ASSERT(st_packed_bins, sizeof(st_packed_entry[MAX_PACKED_HASH]) <= sizeof(st_table_entry*[ST_DEFAULT_PACKED_TABLE_SIZE]))
 
     /*
      * DEFAULT_MAX_DENSITY is the default for the largest we allow the
@@ -38,7 +48,8 @@ struct st_table_entry {
      *
      */
 
-static const struct st_hash_type type_numhash = {
+#define type_numhash st_hashtype_num
+const struct st_hash_type st_hashtype_num = {
     st_numcmp,
     st_numhash,
 };
@@ -61,20 +72,127 @@ static void rehash(st_table *);
 #ifdef RUBY
 #define malloc xmalloc
 #define calloc xcalloc
+#define realloc xrealloc
 #define free(x) xfree(x)
 #endif
 
 #define numberof(array) (int)(sizeof(array) / sizeof((array)[0]))
 
-#define alloc(type) (type*)malloc((size_t)sizeof(type))
-#define Calloc(n,s) (char*)calloc((n),(s))
-
 #define EQUAL(table,x,y) ((x)==(y) || (*(table)->type->compare)((x),(y)) == 0)
 
-/* remove cast to unsigned int in the future */
-#define do_hash(key,table) (unsigned int)(st_index_t)(*(table)->type->hash)((key))
+#define do_hash(key,table) (st_index_t)(*(table)->type->hash)((key))
 #define do_hash_bin(key,table) (do_hash((key), (table))%(table)->num_bins)
 
+/* preparation for possible allocation improvements */
+#ifdef POOL_ALLOC_API
+#define st_alloc_entry() (st_table_entry *)ruby_xpool_malloc_6p()
+#define st_free_entry(entry) ruby_xpool_free(entry)
+#define st_alloc_table() (st_table *)ruby_xpool_malloc_6p()
+#define st_dealloc_table(table) ruby_xpool_free(table)
+static inline st_table_entry **
+st_alloc_bins(st_index_t size)
+{
+    st_table_entry **result;
+    if (size == 11) {
+        result = (st_table_entry **) ruby_xpool_malloc_11p();
+        memset(result, 0, 11 * sizeof(st_table_entry *));
+    }
+    else
+        result = (st_table_entry **) ruby_xcalloc(size, sizeof(st_table_entry*));
+    return result;
+}
+static inline void
+st_free_bins(st_table_entry **bins, st_index_t size)
+{
+    if (size == 11)
+	ruby_xpool_free(bins);
+    else
+	ruby_xfree(bins);
+}
+static inline st_table_entry**
+st_realloc_bins(st_table_entry **bins, st_index_t newsize, st_index_t oldsize)
+{
+    st_free_bins(bins, oldsize);
+    return st_alloc_bins(newsize);
+}
+#else
+#define st_alloc_entry() (st_table_entry *)malloc(sizeof(st_table_entry))
+#define st_free_entry(entry) free(entry)
+#define st_alloc_table() (st_table *)malloc(sizeof(st_table))
+#define st_dealloc_table(table) free(table)
+#define st_alloc_bins(size) (st_table_entry **)calloc(size, sizeof(st_table_entry *))
+#define st_free_bins(bins, size) free(bins)
+static inline st_table_entry**
+st_realloc_bins(st_table_entry **bins, st_index_t newsize, st_index_t oldsize)
+{
+    bins = (st_table_entry **)realloc(bins, newsize * sizeof(st_table_entry *));
+    MEMZERO(bins, st_table_entry*, newsize);
+    return bins;
+}
+#endif
+
+/* Shortage */
+#define bins as.big.bins
+#define head as.big.head
+#define tail as.big.tail
+#define real_entries as.packed.real_entries
+
+/* preparation for possible packing improvements */
+#define PACKED_BINS(table) ((table)->as.packed.entries)
+#define PACKED_ENT(table, i) PACKED_BINS(table)[i]
+#define PKEY(table, i) PACKED_ENT((table), (i)).key
+#define PVAL(table, i) PACKED_ENT((table), (i)).val
+#define PHASH(table, i) PACKED_ENT((table), (i)).hash
+#define PKEY_SET(table, i, v) (PKEY((table), (i)) = (v))
+#define PVAL_SET(table, i, v) (PVAL((table), (i)) = (v))
+#define PHASH_SET(table, i, v) (PHASH((table), (i)) = (v))
+
+/* this function depends much on packed layout, so that it placed here */
+static inline void
+remove_packed_entry(st_table *table, st_index_t i)
+{
+    table->real_entries--;
+    table->num_entries--;
+    if (i < table->real_entries) {
+	MEMMOVE(&PACKED_ENT(table, i), &PACKED_ENT(table, i+1),
+		st_packed_entry, table->real_entries - i);
+    }
+}
+
+static inline void
+remove_safe_packed_entry(st_table *table, st_index_t i, st_data_t never)
+{
+    table->num_entries--;
+    PKEY_SET(table, i, never);
+    PVAL_SET(table, i, never);
+    PHASH_SET(table, i, 0);
+}
+
+/* ultrapacking */
+#define real_upacked num_bins
+#define MAX_UPACKED_HASH 1
+#define ULTRAPACKED(table) ((table)->real_upacked <= 1)
+#define UPACKED_ENT(table) ((table)->as.upacked)
+#define UPKEY(table) UPACKED_ENT(table).key
+#define UPVAL(table) UPACKED_ENT(table).val
+#define UPHASH(table) UPACKED_ENT(table).hash
+#define UPKEY_SET(table, v) (UPACKED_ENT(table).key = (v))
+#define UPVAL_SET(table, v) (UPACKED_ENT(table).val = (v))
+#define UPHASH_SET(table, v) (UPACKED_ENT(table).hash = (v))
+static inline void
+remove_upacked_entry(st_table *table)
+{
+    table->real_upacked = table->num_entries = 0;
+}
+
+static inline void
+remove_safe_upacked_entry(st_table *table, st_data_t never)
+{
+    table->num_entries = 0;
+    UPKEY_SET(table, never);
+    UPVAL_SET(table, never);
+    UPHASH_SET(table, 0);
+}
 /*
  * MINSIZE is the minimum size of a dictionary.
  */
@@ -85,8 +203,8 @@ static void rehash(st_table *);
 Table of prime numbers 2^n+a, 2<=n<=30.
 */
 static const unsigned int primes[] = {
-	8 + 3,
-	16 + 3,
+	ST_DEFAULT_INIT_TABLE_SIZE,
+	ST_DEFAULT_SECOND_TABLE_SIZE,
 	32 + 5,
 	64 + 3,
 	128 + 3,
@@ -161,8 +279,6 @@ stat_col(void)
 }
 #endif
 
-#define MAX_PACKED_NUMHASH (ST_DEFAULT_INIT_TABLE_SIZE/2)
-
 st_table*
 st_init_table_with_size(const struct st_hash_type *type, st_index_t size)
 {
@@ -181,14 +297,19 @@ st_init_table_with_size(const struct st_hash_type *type, st_index_t size)
     }
 #endif
 
-    size = new_size(size);	/* round up to prime number */
 
-    tbl = alloc(st_table);
+    tbl = st_alloc_table();
     tbl->type = type;
     tbl->num_entries = 0;
-    tbl->entries_packed = type == &type_numhash && size/2 <= MAX_PACKED_NUMHASH;
+    tbl->entries_packed = size <= MAX_PACKED_HASH;
+    if (tbl->entries_packed) {
+	size = size <= MAX_UPACKED_HASH ? 0 : ST_DEFAULT_PACKED_TABLE_SIZE;
+    }
+    else {
+	size = new_size(size);	/* round up to prime number */
+    }
     tbl->num_bins = size;
-    tbl->bins = (st_table_entry **)Calloc(size, sizeof(st_table_entry*));
+    tbl->bins = size ? st_alloc_bins(size) : 0;
     tbl->head = 0;
     tbl->tail = 0;
 
@@ -243,17 +364,23 @@ st_clear(st_table *table)
     register st_table_entry *ptr, *next;
     st_index_t i;
 
+    if (ULTRAPACKED(table)) {
+	remove_upacked_entry(table);
+	return;
+    }
+
     if (table->entries_packed) {
         table->num_entries = 0;
+        table->real_entries = 0;
         return;
     }
 
-    for(i = 0; i < table->num_bins; i++) {
+    for (i = 0; i < table->num_bins; i++) {
 	ptr = table->bins[i];
 	table->bins[i] = 0;
 	while (ptr != 0) {
 	    next = ptr->next;
-	    free(ptr);
+	    st_free_entry(ptr);
 	    ptr = next;
 	}
     }
@@ -266,14 +393,19 @@ void
 st_free_table(st_table *table)
 {
     st_clear(table);
-    free(table->bins);
-    free(table);
+    if (!ULTRAPACKED(table)) {
+	st_free_bins(table->bins, table->num_bins);
+    }
+    st_dealloc_table(table);
 }
 
 size_t
 st_memsize(const st_table *table)
 {
-    if (table->entries_packed) {
+    if (ULTRAPACKED(table)) {
+	return sizeof(st_table);
+    }
+    else if (table->entries_packed) {
 	return table->num_bins * sizeof (void *) + sizeof(st_table);
     }
     else {
@@ -306,46 +438,77 @@ count_collision(const struct st_hash_type *type)
 #define FOUND_ENTRY
 #endif
 
-#define FIND_ENTRY(table, ptr, hash_val, bin_pos) do {\
-    (bin_pos) = (hash_val)%(table)->num_bins;\
-    (ptr) = (table)->bins[(bin_pos)];\
-    FOUND_ENTRY;\
-    if (PTR_NOT_EQUAL((table), (ptr), (hash_val), key)) {\
-	COLLISION;\
-	while (PTR_NOT_EQUAL((table), (ptr)->next, (hash_val), key)) {\
-	    (ptr) = (ptr)->next;\
-	}\
-	(ptr) = (ptr)->next;\
-    }\
-} while (0)
+#define FIND_ENTRY(table, ptr, hash_val, bin_pos) \
+    ((ptr) = find_entry((table), key, (hash_val), ((bin_pos) = (hash_val)%(table)->num_bins)))
+
+static st_table_entry *
+find_entry(st_table *table, st_data_t key, st_index_t hash_val, st_index_t bin_pos)
+{
+    register st_table_entry *ptr = table->bins[bin_pos];
+    FOUND_ENTRY;
+    if (PTR_NOT_EQUAL(table, ptr, hash_val, key)) {
+	COLLISION;
+	while (PTR_NOT_EQUAL(table, ptr->next, hash_val, key)) {
+	    ptr = ptr->next;
+	}
+	ptr = ptr->next;
+    }
+    return ptr;
+}
+
+static inline st_index_t
+find_packed_index(st_table *table, st_index_t hash_val, st_data_t key)
+{
+    st_index_t i = 0;
+    while (i < table->real_entries &&
+	   (PHASH(table, i) != hash_val || !EQUAL(table, key, PKEY(table, i)))) {
+	i++;
+    }
+    return i;
+}
+
+static inline int
+check_upacked(st_table *table, st_index_t hash_val, st_data_t key)
+{
+    return table->num_entries &&
+	UPHASH(table) == hash_val &&
+	EQUAL(table, key, UPKEY(table));
+}
 
 #define collision_check 0
 
 int
 st_lookup(st_table *table, register st_data_t key, st_data_t *value)
 {
-    st_index_t hash_val, bin_pos;
+    st_index_t hash_val;
     register st_table_entry *ptr;
 
+    hash_val = do_hash(key, table);
+
+    if (ULTRAPACKED(table)) {
+	if (check_upacked(table, hash_val, key)) {
+	    if (value != 0) *value = UPVAL(table);
+	    return 1;
+	}
+	return 0;
+    }
+
     if (table->entries_packed) {
-        st_index_t i;
-        for (i = 0; i < table->num_entries; i++) {
-            if ((st_data_t)table->bins[i*2] == key) {
-                if (value !=0) *value = (st_data_t)table->bins[i*2+1];
-                return 1;
-            }
-        }
+	st_index_t i = find_packed_index(table, hash_val, key);
+	if (i < table->real_entries) {
+	    if (value != 0) *value = PVAL(table, i);
+	    return 1;
+	}
         return 0;
     }
 
-    hash_val = do_hash(key, table);
-    FIND_ENTRY(table, ptr, hash_val, bin_pos);
+    ptr = find_entry(table, key, hash_val, hash_val % table->num_bins);
 
     if (ptr == 0) {
 	return 0;
     }
     else {
-	if (value != 0)  *value = ptr->record;
+	if (value != 0) *value = ptr->record;
 	return 1;
     }
 }
@@ -353,22 +516,29 @@ st_lookup(st_table *table, register st_data_t key, st_data_t *value)
 int
 st_get_key(st_table *table, register st_data_t key, st_data_t *result)
 {
-    st_index_t hash_val, bin_pos;
+    st_index_t hash_val;
     register st_table_entry *ptr;
 
+    hash_val = do_hash(key, table);
+
+    if (ULTRAPACKED(table)) {
+	if (check_upacked(table, hash_val, key)) {
+	    if (result != 0) *result = UPKEY(table);
+	    return 1;
+	}
+	return 0;
+    }
+
     if (table->entries_packed) {
-        st_index_t i;
-        for (i = 0; i < table->num_entries; i++) {
-            if ((st_data_t)table->bins[i*2] == key) {
-                if (result !=0) *result = (st_data_t)table->bins[i*2];
-                return 1;
-            }
-        }
+	st_index_t i = find_packed_index(table, hash_val, key);
+	if (i < table->real_entries) {
+	    if (result != 0) *result = PKEY(table, i);
+	    return 1;
+	}
         return 0;
     }
 
-    hash_val = do_hash(key, table);
-    FIND_ENTRY(table, ptr, hash_val, bin_pos);
+    ptr = find_entry(table, key, hash_val, hash_val % table->num_bins);
 
     if (ptr == 0) {
 	return 0;
@@ -382,85 +552,151 @@ st_get_key(st_table *table, register st_data_t key, st_data_t *result)
 #undef collision_check
 #define collision_check 1
 
-#define MORE_PACKABLE_P(table) \
-    ((st_index_t)((table)->num_entries+1) * 2 <= (table)->num_bins && \
-     (table)->num_entries+1 <= MAX_PACKED_NUMHASH)
-
-#define ADD_DIRECT(table, key, value, hash_val, bin_pos)\
-do {\
-    st_table_entry *entry;\
-    if ((table)->num_entries > ST_DEFAULT_MAX_DENSITY * (table)->num_bins) {\
-	rehash(table);\
-        (bin_pos) = (hash_val) % (table)->num_bins;\
-    }\
-    \
-    entry = alloc(st_table_entry);\
-    \
-    entry->hash = (hash_val);\
-    entry->key = (key);\
-    entry->record = (value);\
-    entry->next = (table)->bins[(bin_pos)];\
-    if ((table)->head != 0) {\
-	entry->fore = 0;\
-	(entry->back = (table)->tail)->fore = entry;\
-	(table)->tail = entry;\
-    }\
-    else {\
-	(table)->head = (table)->tail = entry;\
-	entry->fore = entry->back = 0;\
-    }\
-    (table)->bins[(bin_pos)] = entry;\
-    (table)->num_entries++;\
-} while (0)
+static inline st_table_entry *
+new_entry(st_table * table, st_data_t key, st_data_t value,
+	st_index_t hash_val, register st_index_t bin_pos)
+{
+    register st_table_entry *entry = st_alloc_entry();
+
+    entry->next = table->bins[bin_pos];
+    table->bins[bin_pos] = entry;
+    entry->hash = hash_val;
+    entry->key = key;
+    entry->record = value;
+
+    return entry;
+}
+
+static inline void
+add_direct(st_table *table, st_data_t key, st_data_t value,
+	   st_index_t hash_val, register st_index_t bin_pos)
+{
+    register st_table_entry *entry;
+    if (table->num_entries > ST_DEFAULT_MAX_DENSITY * table->num_bins) {
+	rehash(table);
+        bin_pos = hash_val % table->num_bins;
+    }
+
+    entry = new_entry(table, key, value, hash_val, bin_pos);
+
+    if (table->head != 0) {
+	entry->fore = 0;
+	(entry->back = table->tail)->fore = entry;
+	table->tail = entry;
+    }
+    else {
+	table->head = table->tail = entry;
+	entry->fore = entry->back = 0;
+    }
+    table->num_entries++;
+}
 
 static void
 unpack_entries(register st_table *table)
 {
     st_index_t i;
-    struct st_table_entry *packed_bins[MAX_PACKED_NUMHASH*2];
+    st_packed_entry packed_bins[MAX_PACKED_HASH];
+    register st_table_entry *entry, *preventry = 0, **chain;
     st_table tmp_table = *table;
 
-    memcpy(packed_bins, table->bins, sizeof(struct st_table_entry *) * table->num_entries*2);
-    table->bins = packed_bins;
+    MEMCPY(packed_bins, PACKED_BINS(table), st_packed_entry, MAX_PACKED_HASH);
+    table->as.packed.entries = packed_bins;
     tmp_table.entries_packed = 0;
-    tmp_table.num_entries = 0;
-    memset(tmp_table.bins, 0, sizeof(struct st_table_entry *) * tmp_table.num_bins);
-    for (i = 0; i < table->num_entries; i++) {
-        st_insert(&tmp_table, (st_data_t)packed_bins[i*2], (st_data_t)packed_bins[i*2+1]);
-    }
+#if ST_DEFAULT_INIT_TABLE_SIZE == ST_DEFAULT_PACKED_TABLE_SIZE
+    MEMZERO(tmp_table.bins, st_table_entry*, tmp_table.num_bins);
+#else
+    tmp_table.bins = st_realloc_bins(tmp_table.bins, ST_DEFAULT_INIT_TABLE_SIZE, tmp_table.num_bins);
+    tmp_table.num_bins = ST_DEFAULT_INIT_TABLE_SIZE;
+#endif
+    i = 0;
+    chain = &tmp_table.head;
+    do {
+	st_data_t key = packed_bins[i].key;
+	st_data_t val = packed_bins[i].val;
+	st_index_t hash = packed_bins[i].hash;
+	entry = new_entry(&tmp_table, key, val, hash,
+			  hash % ST_DEFAULT_INIT_TABLE_SIZE);
+	*chain = entry;
+	entry->back = preventry;
+	preventry = entry;
+	chain = &entry->fore;
+    } while (++i < MAX_PACKED_HASH);
+    *chain = NULL;
+    tmp_table.tail = entry;
     *table = tmp_table;
 }
 
+static void
+add_packed_direct(st_table *table, st_data_t key, st_data_t value, st_index_t hash_val)
+{
+    if (table->real_entries < MAX_PACKED_HASH) {
+	st_index_t i = table->real_entries++;
+	PKEY_SET(table, i, key);
+	PVAL_SET(table, i, value);
+	PHASH_SET(table, i, hash_val);
+	table->num_entries++;
+    }
+    else {
+	unpack_entries(table);
+	add_direct(table, key, value, hash_val, hash_val % table->num_bins);
+    }
+}
+
+static void
+add_upacked_direct(register st_table *table, register st_data_t key, st_data_t value, st_index_t hash_val)
+{
+    if (table->real_upacked) {
+	st_packed_entry *entries = (st_packed_entry *) st_alloc_bins(ST_DEFAULT_PACKED_TABLE_SIZE);
+	entries[0] = UPACKED_ENT(table);
+	entries[1].hash = hash_val;
+	entries[1].key = key;
+	entries[1].val = value;
+	table->num_bins = ST_DEFAULT_PACKED_TABLE_SIZE;
+	table->real_entries = 2;
+	table->num_entries++;
+	table->as.packed.entries = entries;
+    }
+    else {
+	table->real_upacked = 1;
+	table->num_entries = 1;
+	UPHASH_SET(table, hash_val);
+	UPKEY_SET(table, key);
+	UPVAL_SET(table, value);
+    }
+}
+
 int
 st_insert(register st_table *table, register st_data_t key, st_data_t value)
 {
-    st_index_t hash_val, bin_pos;
+    st_index_t hash_val;
+    register st_index_t bin_pos;
     register st_table_entry *ptr;
 
+    hash_val = do_hash(key, table);
+
+    if (ULTRAPACKED(table)) {
+	if (check_upacked(table, hash_val, key)) {
+	    UPVAL_SET(table, value);
+	    return 1;
+	}
+	add_upacked_direct(table, key, value, hash_val);
+	return 0;
+    }
+
     if (table->entries_packed) {
-        st_index_t i;
-        for (i = 0; i < table->num_entries; i++) {
-            if ((st_data_t)table->bins[i*2] == key) {
-                table->bins[i*2+1] = (struct st_table_entry*)value;
-                return 1;
-            }
-        }
-        if (MORE_PACKABLE_P(table)) {
-            i = table->num_entries++;
-            table->bins[i*2] = (struct st_table_entry*)key;
-            table->bins[i*2+1] = (struct st_table_entry*)value;
-            return 0;
-        }
-        else {
-            unpack_entries(table);
+	st_index_t i = find_packed_index(table, hash_val, key);
+	if (i < table->real_entries) {
+	    PVAL_SET(table, i, value);
+	    return 1;
         }
+	add_packed_direct(table, key, value, hash_val);
+	return 0;
     }
 
-    hash_val = do_hash(key, table);
     FIND_ENTRY(table, ptr, hash_val, bin_pos);
 
     if (ptr == 0) {
-	ADD_DIRECT(table, key, value, hash_val, bin_pos);
+	add_direct(table, key, value, hash_val, bin_pos);
 	return 0;
     }
     else {
@@ -473,34 +709,38 @@ int
 st_insert2(register st_table *table, register st_data_t key, st_data_t value,
 	   st_data_t (*func)(st_data_t))
 {
-    st_index_t hash_val, bin_pos;
+    st_index_t hash_val;
+    register st_index_t bin_pos;
     register st_table_entry *ptr;
 
+    hash_val = do_hash(key, table);
+
+    if (ULTRAPACKED(table)) {
+	if (check_upacked(table, hash_val, key)) {
+	    UPVAL_SET(table, value);
+	    return 1;
+	}
+	key = (*func)(key);
+	add_upacked_direct(table, key, value, hash_val);
+	return 0;
+    }
+
     if (table->entries_packed) {
-        st_index_t i;
-        for (i = 0; i < table->num_entries; i++) {
-            if ((st_data_t)table->bins[i*2] == key) {
-                table->bins[i*2+1] = (struct st_table_entry*)value;
-                return 1;
-            }
-        }
-        if (MORE_PACKABLE_P(table)) {
-            i = table->num_entries++;
-            table->bins[i*2] = (struct st_table_entry*)key;
-            table->bins[i*2+1] = (struct st_table_entry*)value;
-            return 0;
-        }
-        else {
-            unpack_entries(table);
-        }
+	st_index_t i = find_packed_index(table, hash_val, key);
+	if (i < table->real_entries) {
+	    PVAL_SET(table, i, value);
+	    return 1;
+	}
+	key = (*func)(key);
+	add_packed_direct(table, key, value, hash_val);
+	return 0;
     }
 
-    hash_val = do_hash(key, table);
     FIND_ENTRY(table, ptr, hash_val, bin_pos);
 
     if (ptr == 0) {
 	key = (*func)(key);
-	ADD_DIRECT(table, key, value, hash_val, bin_pos);
+	add_direct(table, key, value, hash_val, bin_pos);
 	return 0;
     }
     else {
@@ -512,36 +752,30 @@ st_insert2(register st_table *table, register st_data_t key, st_data_t value,
 void
 st_add_direct(st_table *table, st_data_t key, st_data_t value)
 {
-    st_index_t hash_val, bin_pos;
+    st_index_t hash_val;
+
+    hash_val = do_hash(key, table);
+    if (ULTRAPACKED(table)) {
+	add_upacked_direct(table, key, value, hash_val);
+	return;
+    }
 
     if (table->entries_packed) {
-        int i;
-        if (MORE_PACKABLE_P(table)) {
-            i = table->num_entries++;
-            table->bins[i*2] = (struct st_table_entry*)key;
-            table->bins[i*2+1] = (struct st_table_entry*)value;
-            return;
-        }
-        else {
-            unpack_entries(table);
-        }
+	add_packed_direct(table, key, value, hash_val);
+	return;
     }
 
-    hash_val = do_hash(key, table);
-    bin_pos = hash_val % table->num_bins;
-    ADD_DIRECT(table, key, value, hash_val, bin_pos);
+    add_direct(table, key, value, hash_val, hash_val % table->num_bins);
 }
 
 static void
 rehash(register st_table *table)
 {
     register st_table_entry *ptr, **new_bins;
-    st_index_t i, new_num_bins, hash_val;
+    st_index_t new_num_bins, hash_val;
 
     new_num_bins = new_size(table->num_bins+1);
-    new_bins = (st_table_entry**)
-	xrealloc(table->bins, new_num_bins * sizeof(st_table_entry*));
-    for (i = 0; i < new_num_bins; ++i) new_bins[i] = 0;
+    new_bins = st_realloc_bins(table->bins, new_num_bins, table->num_bins);
     table->num_bins = new_num_bins;
     table->bins = new_bins;
 
@@ -558,34 +792,37 @@ st_table*
 st_copy(st_table *old_table)
 {
     st_table *new_table;
-    st_table_entry *ptr, *entry, *prev, **tail;
+    st_table_entry *ptr, *entry, *prev, **tailp;
     st_index_t num_bins = old_table->num_bins;
     st_index_t hash_val;
 
-    new_table = alloc(st_table);
+    new_table = st_alloc_table();
     if (new_table == 0) {
 	return 0;
     }
 
     *new_table = *old_table;
-    new_table->bins = (st_table_entry**)
-	Calloc((unsigned)num_bins, sizeof(st_table_entry*));
+    if (ULTRAPACKED(old_table)) {
+	return new_table;
+    }
+
+    new_table->bins = st_alloc_bins(num_bins);
 
     if (new_table->bins == 0) {
-	free(new_table);
+	st_dealloc_table(new_table);
 	return 0;
     }
 
     if (old_table->entries_packed) {
-        memcpy(new_table->bins, old_table->bins, sizeof(struct st_table_entry *) * old_table->num_bins);
+        MEMCPY(new_table->bins, old_table->bins, st_table_entry*, old_table->num_bins);
         return new_table;
     }
 
     if ((ptr = old_table->head) != 0) {
 	prev = 0;
-	tail = &new_table->head;
+	tailp = &new_table->head;
 	do {
-	    entry = alloc(st_table_entry);
+	    entry = st_alloc_entry();
 	    if (entry == 0) {
 		st_free_table(new_table);
 		return 0;
@@ -595,8 +832,8 @@ st_copy(st_table *old_table)
 	    entry->next = new_table->bins[hash_val];
 	    new_table->bins[hash_val] = entry;
 	    entry->back = prev;
-	    *tail = prev = entry;
-	    tail = &entry->fore;
+	    *tailp = prev = entry;
+	    tailp = &entry->fore;
 	} while ((ptr = ptr->fore) != 0);
 	new_table->tail = prev;
     }
@@ -604,21 +841,22 @@ st_copy(st_table *old_table)
     return new_table;
 }
 
-#define REMOVE_ENTRY(table, ptr) do					\
-    {									\
-	if ((ptr)->fore == 0 && (ptr)->back == 0) {			\
-	    (table)->head = 0;						\
-	    (table)->tail = 0;						\
-	}								\
-	else {								\
-	    st_table_entry *fore = (ptr)->fore, *back = (ptr)->back;	\
-	    if (fore) fore->back = back;				\
-	    if (back) back->fore = fore;				\
-	    if ((ptr) == (table)->head) (table)->head = fore;		\
-	    if ((ptr) == (table)->tail) (table)->tail = back;		\
-	}								\
-	(table)->num_entries--;						\
-    } while (0)
+static inline void
+remove_entry(st_table *table, st_table_entry *ptr)
+{
+    if (ptr->fore == 0 && ptr->back == 0) {
+	table->head = 0;
+	table->tail = 0;
+    }
+    else {
+	st_table_entry *fore = ptr->fore, *back = ptr->back;
+	if (fore) fore->back = back;
+	if (back) back->fore = fore;
+	if (ptr == table->head) table->head = fore;
+	if (ptr == table->tail) table->tail = back;
+    }
+    table->num_entries--;
+}
 
 int
 st_delete(register st_table *table, register st_data_t *key, st_data_t *value)
@@ -627,30 +865,38 @@ st_delete(register st_table *table, register st_data_t *key, st_data_t *value)
     st_table_entry **prev;
     register st_table_entry *ptr;
 
+    hash_val = do_hash(*key, table);
+
+    if (ULTRAPACKED(table)) {
+	if (check_upacked(table, hash_val, *key)) {
+	    if (value != 0) *value = UPVAL(table);
+	    *key = UPKEY(table);
+	    remove_upacked_entry(table);
+	    return 1;
+	}
+	return 0;
+    }
+
     if (table->entries_packed) {
-        st_index_t i;
-        for (i = 0; i < table->num_entries; i++) {
-            if ((st_data_t)table->bins[i*2] == *key) {
-                if (value != 0) *value = (st_data_t)table->bins[i*2+1];
-                table->num_entries--;
-                memmove(&table->bins[i*2], &table->bins[(i+1)*2],
-                        sizeof(struct st_table_entry*) * 2*(table->num_entries-i));
-                return 1;
-            }
+	st_index_t i = find_packed_index(table, hash_val, *key);
+	if (i < table->real_entries) {
+	    if (value != 0) *value = PVAL(table, i);
+	    *key = PKEY(table, i);
+	    remove_packed_entry(table, i);
+	    return 1;
         }
         if (value != 0) *value = 0;
         return 0;
     }
 
-    hash_val = do_hash_bin(*key, table);
-
-    for (prev = &table->bins[hash_val]; (ptr = *prev) != 0; prev = &ptr->next) {
+    prev = &table->bins[hash_val % table->num_bins];
+    for (;(ptr = *prev) != 0; prev = &ptr->next) {
 	if (EQUAL(table, *key, ptr->key)) {
 	    *prev = ptr->next;
-	    REMOVE_ENTRY(table, ptr);
+	    remove_entry(table, ptr);
 	    if (value != 0) *value = ptr->record;
 	    *key = ptr->key;
-	    free(ptr);
+	    st_free_entry(ptr);
 	    return 1;
 	}
     }
@@ -665,25 +911,36 @@ st_delete_safe(register st_table *table, register st_data_t *key, st_data_t *val
     st_index_t hash_val;
     register st_table_entry *ptr;
 
+    hash_val = do_hash(*key, table);
+
+    if (ULTRAPACKED(table)) {
+	if (check_upacked(table, hash_val, *key)) {
+	    if (value != 0) *value = UPVAL(table);
+	    *key = UPKEY(table);
+	    remove_safe_upacked_entry(table, never);
+	    return 1;
+	}
+	if (value != 0) *value = 0;
+	return 0;
+    }
+
     if (table->entries_packed) {
-	st_index_t i;
-	for (i = 0; i < table->num_entries; i++) {
-	    if ((st_data_t)table->bins[i*2] == *key) {
-		if (value != 0) *value = (st_data_t)table->bins[i*2+1];
-		table->bins[i*2] = (void *)never;
-		return 1;
-	    }
+	st_index_t i = find_packed_index(table, hash_val, *key);
+	if (i < table->real_entries) {
+	    if (value != 0) *value = PVAL(table, i);
+	    *key = PKEY(table, i);
+	    remove_safe_packed_entry(table, i, never);
+	    return 1;
 	}
 	if (value != 0) *value = 0;
 	return 0;
     }
 
-    hash_val = do_hash_bin(*key, table);
-    ptr = table->bins[hash_val];
+    ptr = table->bins[hash_val % table->num_bins];
 
     for (; ptr != 0; ptr = ptr->next) {
 	if ((ptr->key != never) && EQUAL(table, ptr->key, *key)) {
-	    REMOVE_ENTRY(table, ptr);
+	    remove_entry(table, ptr);
 	    *key = ptr->key;
 	    if (value != 0) *value = ptr->record;
 	    ptr->key = ptr->record = never;
@@ -701,17 +958,23 @@ st_cleanup_safe(st_table *table, st_data_t never)
     st_table_entry *ptr, **last, *tmp;
     st_index_t i;
 
+    if (ULTRAPACKED(table)) {
+	table->real_upacked = table->num_entries;
+	return;
+    }
+
     if (table->entries_packed) {
 	st_index_t i = 0, j = 0;
-	while ((st_data_t)table->bins[i*2] != never) {
-	    if (i++ == table->num_entries) return;
+	while (PKEY(table, i) != never) {
+	    if (i++ == table->real_entries) return;
 	}
-	for (j = i; ++i < table->num_entries;) {
-	    if ((st_data_t)table->bins[i*2] == never) continue;
-	    table->bins[j*2] = table->bins[i*2];
-	    table->bins[j*2+1] = table->bins[i*2+1];
+	for (j = i; ++i < table->real_entries;) {
+	    if (PKEY(table, i) == never) continue;
+	    PACKED_ENT(table, j) = PACKED_ENT(table, i);
 	    j++;
 	}
+	table->real_entries = j;
+	/* table->num_entries really should be equal j at this moment, but let set it anyway */
 	table->num_entries = j;
 	return;
     }
@@ -722,7 +985,7 @@ st_cleanup_safe(st_table *table, st_data_t never)
 	    if (ptr->key == never) {
 		tmp = ptr;
 		*last = ptr = ptr->next;
-		free(tmp);
+		st_free_entry(tmp);
 	    }
 	    else {
 		ptr = *(last = &ptr->next);
@@ -732,50 +995,78 @@ st_cleanup_safe(st_table *table, st_data_t never)
 }
 
 int
-st_foreach(st_table *table, int (*func)(ANYARGS), st_data_t arg)
+st_foreach_check(st_table *table, int (*func)(ANYARGS), st_data_t arg, st_data_t never)
 {
     st_table_entry *ptr, **last, *tmp;
     enum st_retval retval;
-    st_index_t i;
+    st_data_t key, val;
+    st_index_t hash, i = 0;
+
+    if (table->num_entries == 0) {
+	return 0;
+    }
+
+    if (ULTRAPACKED(table)) {
+	key = UPKEY(table);
+	val = UPVAL(table);
+	hash = UPHASH(table);
+	if (key == never) return 0;
+	retval = (*func)(key, val, arg);
+	if (!ULTRAPACKED(table)) {
+	    goto packed;
+	}
+	switch(retval) {
+	  case ST_CHECK:
+	    if (UPHASH(table) == 0 && UPKEY(table) == never)
+		break;
+	    if (check_upacked(table, hash, key))
+		break;
+	    goto deleted;
+	  case ST_DELETE:
+	    remove_safe_upacked_entry(table, never);
+	  case ST_CONTINUE:
+	  case ST_STOP:
+	    break;
+	}
+	return 0;
+    }
 
     if (table->entries_packed) {
-        for (i = 0; i < table->num_entries; i++) {
-            st_index_t j;
-            st_data_t key, val;
-            key = (st_data_t)table->bins[i*2];
-            val = (st_data_t)table->bins[i*2+1];
-            retval = (*func)(key, val, arg);
+	for (i = 0; i < table->real_entries; i++) {
+	    key = PKEY(table, i);
+	    val = PVAL(table, i);
+	    hash = PHASH(table, i);
+	    if (key == never) continue;
+	    retval = (*func)(key, val, arg);
+	  packed:
 	    if (!table->entries_packed) {
-		FIND_ENTRY(table, ptr, key, i);
+		FIND_ENTRY(table, ptr, hash, i);
 		if (retval == ST_CHECK) {
 		    if (!ptr) goto deleted;
 		    goto unpacked_continue;
 		}
 		goto unpacked;
 	    }
-            switch (retval) {
+	    switch (retval) {
 	      case ST_CHECK:	/* check if hash is modified during iteration */
-                for (j = 0; j < table->num_entries; j++) {
-                    if ((st_data_t)table->bins[j*2] == key)
-                        break;
-                }
-                if (j == table->num_entries) {
+		if (PHASH(table, i) == 0 && PKEY(table, i) == never) {
+		    break;
+		}
+		i = find_packed_index(table, hash, key);
+		if (i == table->real_entries) {
 		    goto deleted;
-                }
+		}
 		/* fall through */
 	      case ST_CONTINUE:
 		break;
 	      case ST_STOP:
 		return 0;
 	      case ST_DELETE:
-                table->num_entries--;
-                memmove(&table->bins[i*2], &table->bins[(i+1)*2],
-                        sizeof(struct st_table_entry*) * 2*(table->num_entries-i));
-                i--;
-                break;
-            }
-        }
-        return 0;
+		remove_safe_packed_entry(table, i, never);
+		break;
+	    }
+	}
+	return 0;
     }
     else {
 	ptr = table->head;
@@ -783,6 +1074,8 @@ st_foreach(st_table *table, int (*func)(ANYARGS), st_data_t arg)
 
     if (ptr != 0) {
 	do {
+	    if (ptr->key == never)
+		goto unpacked_continue;
 	    i = ptr->hash % table->num_bins;
 	    retval = (*func)(ptr->key, ptr->record, arg);
 	  unpacked:
@@ -808,10 +1101,100 @@ st_foreach(st_table *table, int (*func)(ANYARGS), st_data_t arg)
 		for (; (tmp = *last) != 0; last = &tmp->next) {
 		    if (ptr == tmp) {
 			tmp = ptr->fore;
+			remove_entry(table, ptr);
+			ptr->key = ptr->record = never;
+			ptr->hash = 0;
+			ptr = tmp;
+			break;
+		    }
+		}
+	    }
+	} while (ptr && table->head);
+    }
+    return 0;
+}
+
+int
+st_foreach(st_table *table, int (*func)(ANYARGS), st_data_t arg)
+{
+    st_table_entry *ptr, **last, *tmp;
+    enum st_retval retval;
+    st_data_t key, val;
+    st_index_t hash, i = 0;
+
+    if (table->num_entries == 0) {
+	return 0;
+    }
+
+    if (ULTRAPACKED(table)) {
+	key = UPKEY(table);
+	val = UPVAL(table);
+	hash = UPHASH(table);
+	retval = (*func)(key, val, arg);
+	if (!ULTRAPACKED(table)) {
+	    goto packed;
+	}
+	switch (retval) {
+	  case ST_DELETE:
+	    remove_upacked_entry(table);
+	  case ST_CONTINUE:
+	  case ST_CHECK:
+	  case ST_STOP:
+	    break;
+	}
+	return 0;
+    }
+
+    if (table->entries_packed) {
+	for (i = 0; i < table->real_entries; i++) {
+	    key = PKEY(table, i);
+	    val = PVAL(table, i);
+	    hash = PHASH(table, i);
+	    retval = (*func)(key, val, arg);
+	  packed:
+	    if (!table->entries_packed) {
+		FIND_ENTRY(table, ptr, hash, i);
+		if (!ptr) return 0;
+		goto unpacked;
+	    }
+	    switch (retval) {
+	      case ST_CONTINUE:
+		break;
+	      case ST_CHECK:
+	      case ST_STOP:
+		return 0;
+	      case ST_DELETE:
+		remove_packed_entry(table, i);
+		i--;
+		break;
+	    }
+	}
+	return 0;
+    }
+    else {
+	ptr = table->head;
+    }
+
+    if (ptr != 0) {
+	do {
+	    i = ptr->hash % table->num_bins;
+	    retval = (*func)(ptr->key, ptr->record, arg);
+	  unpacked:
+	    switch (retval) {
+	      case ST_CONTINUE:
+		ptr = ptr->fore;
+		break;
+	      case ST_CHECK:
+	      case ST_STOP:
+		return 0;
+	      case ST_DELETE:
+		last = &table->bins[ptr->hash % table->num_bins];
+		for (; (tmp = *last) != 0; last = &tmp->next) {
+		    if (ptr == tmp) {
+			tmp = ptr->fore;
 			*last = ptr->next;
-			REMOVE_ENTRY(table, ptr);
-			free(ptr);
-			if (ptr == tmp) return 0;
+			remove_entry(table, ptr);
+			st_free_entry(ptr);
 			ptr = tmp;
 			break;
 		    }
@@ -834,13 +1217,13 @@ st_reverse_foreach(st_table *table, int (*func)(ANYARGS), st_data_t arg)
         for (i = table->num_entries-1; 0 <= i; i--) {
             int j;
             st_data_t key, val;
-            key = (st_data_t)table->bins[i*2];
-            val = (st_data_t)table->bins[i*2+1];
+            key = PKEY(table, i);
+            val = PVAL(table, i);
             retval = (*func)(key, val, arg);
             switch (retval) {
 	      case ST_CHECK:	/* check if hash is modified during iteration */
                 for (j = 0; j < table->num_entries; j++) {
-                    if ((st_data_t)table->bins[j*2] == key)
+                    if (PKEY(table, j) == key)
                         break;
                 }
                 if (j == table->num_entries) {
@@ -854,9 +1237,7 @@ st_reverse_foreach(st_table *table, int (*func)(ANYARGS), st_data_t arg)
 	      case ST_STOP:
 		return 0;
 	      case ST_DELETE:
-                table->num_entries--;
-                memmove(&table->bins[i*2], &table->bins[(i+1)*2],
-                        sizeof(struct st_table_entry*) * 2*(table->num_entries-i));
+		remove_packed_entry(table, i);
                 break;
             }
         }
@@ -889,8 +1270,8 @@ st_reverse_foreach(st_table *table, int (*func)(ANYARGS), st_data_t arg)
 		    if (ptr == tmp) {
 			tmp = ptr->back;
 			*last = ptr->next;
-			REMOVE_ENTRY(table, ptr);
-			free(ptr);
+			remove_entry(table, ptr);
+			st_free_entry(ptr);
 			ptr = tmp;
 			break;
 		    }
diff --git a/variable.c b/variable.c
index 3da500e..303bb27 100644
--- a/variable.c
+++ b/variable.c
@@ -473,7 +473,7 @@ void
 rb_gc_mark_global_tbl(void)
 {
     if (rb_global_tbl)
-        st_foreach_safe(rb_global_tbl, mark_global_entry, 0);
+        st_foreach(rb_global_tbl, mark_global_entry, 0);
 }
 
 static ID
@@ -765,7 +765,7 @@ rb_f_global_variables(void)
     char buf[2];
     int i;
 
-    st_foreach_safe(rb_global_tbl, gvar_i, ary);
+    st_foreach(rb_global_tbl, gvar_i, ary);
     buf[0] = '$';
     for (i = 1; i <= 9; ++i) {
 	buf[1] = (char)(i + '0');
@@ -923,7 +923,7 @@ static int
 givar_i(VALUE obj, st_table *tbl)
 {
     if (rb_special_const_p(obj)) {
-	st_foreach_safe(tbl, givar_mark_i, 0);
+	st_foreach(tbl, givar_mark_i, 0);
     }
     return ST_CONTINUE;
 }
@@ -933,7 +933,7 @@ rb_mark_generic_ivar_tbl(void)
 {
     if (!generic_iv_tbl) return;
     if (special_generic_ivar == 0) return;
-    st_foreach_safe(generic_iv_tbl, givar_i, 0);
+    st_foreach(generic_iv_tbl, givar_i, 0);
 }
 
 void
@@ -1170,7 +1170,7 @@ obj_ivar_each(VALUE obj, int (*func)(ANYARGS), st_data_t arg)
     data.func = (int (*)(ID key, VALUE val, st_data_t arg))func;
     data.arg = arg;
 
-    st_foreach_safe(tbl, obj_ivar_i, (st_data_t)&data);
+    st_foreach(tbl, obj_ivar_i, (st_data_t)&data);
 }
 
 void
@@ -1730,7 +1730,7 @@ rb_mod_const_at(VALUE mod, void *data)
 	tbl = st_init_numtable();
     }
     if (RCLASS_CONST_TBL(mod)) {
-	st_foreach_safe(RCLASS_CONST_TBL(mod), sv_i, (st_data_t)tbl);
+	st_foreach(RCLASS_CONST_TBL(mod), sv_i, (st_data_t)tbl);
     }
     return tbl;
 }
@@ -1765,7 +1765,7 @@ rb_const_list(void *data)
 
     if (!tbl) return rb_ary_new2(0);
     ary = rb_ary_new2(tbl->num_entries);
-    st_foreach_safe(tbl, list_i, ary);
+    st_foreach(tbl, list_i, ary);
     st_free_table(tbl);
 
     return ary;
diff --git a/vm.c b/vm.c
index e997afa..064a4f8 100644
--- a/vm.c
+++ b/vm.c
@@ -1575,6 +1575,7 @@ rb_vm_mark(void *ptr)
 	RUBY_MARK_UNLESS_NULL(vm->thgroup_default);
 	RUBY_MARK_UNLESS_NULL(vm->mark_object_ary);
 	RUBY_MARK_UNLESS_NULL(vm->load_path);
+	RUBY_MARK_UNLESS_NULL(vm->load_path_expanded_cache);
 	RUBY_MARK_UNLESS_NULL(vm->loaded_features);
 	RUBY_MARK_UNLESS_NULL(vm->top_self);
 	RUBY_MARK_UNLESS_NULL(vm->coverages);
@@ -1606,16 +1607,17 @@ ruby_vm_destruct(rb_vm_t *vm)
 #if defined(ENABLE_VM_OBJSPACE) && ENABLE_VM_OBJSPACE
 	struct rb_objspace *objspace = vm->objspace;
 #endif
+	if (vm->living_threads) {
+	    st_table *living_threads = vm->living_threads;
+	    vm->living_threads = 0;
+	    st_free_table(living_threads);
+	}
 	rb_gc_force_recycle(vm->self);
 	vm->main_thread = 0;
 	if (th) {
 	    rb_fiber_reset_root_local_storage(th->self);
 	    thread_free(th);
 	}
-	if (vm->living_threads) {
-	    st_free_table(vm->living_threads);
-	    vm->living_threads = 0;
-	}
 #if defined(ENABLE_VM_OBJSPACE) && ENABLE_VM_OBJSPACE
 	if (objspace) {
 	    rb_objspace_free(objspace);
diff --git a/vm_core.h b/vm_core.h
index 7211005..e787d4b 100644
--- a/vm_core.h
+++ b/vm_core.h
@@ -298,6 +298,7 @@ typedef struct rb_vm_struct {
     /* load */
     VALUE top_self;
     VALUE load_path;
+    VALUE load_path_expanded_cache;
     VALUE loaded_features;
     struct st_table *loading_table;
 
src/rvm/patches/ruby/1.9.3/p385/ruby-multilib.patch000066400000000732147511530530015547 0ustar00--- a/tool/mkconfig.rb
+++ b/tool/mkconfig.rb
@@ -121,6 +121,7 @@
     val = val.gsub(/\$(?:\$|\{?(\w+)\}?)/) {$1 ? "$(#{$1})" : $&}.dump
     case name
     when /^prefix$/
+      v_runtime[:prefix] = val.slice(1..-2)
       val = "(TOPDIR || DESTDIR + #{val})"
     when /^ARCH_FLAG$/
       val = "arch_flag || #{val}" if universal
@@ -193,6 +194,7 @@
     x
   end
 end
+v_others.map!{|x| x.gsub(v_runtime[:prefix], "$(prefix)") }
 v_others.compact!
 
 if $install_name
src/rvm/patches/ruby/1.9.3/openssl3.patch000066400000002126147511530530014015 0ustar00diff --git a/ext/openssl/extconf.rb b/ext/openssl/extconf.rb
index 8c04cb5..132d803 100644
--- a/ext/openssl/extconf.rb
+++ b/ext/openssl/extconf.rb
@@ -104,6 +104,9 @@
 have_func("SSLv2_method")
 have_func("SSLv2_server_method")
 have_func("SSLv2_client_method")
+have_func("SSLv3_method")
+have_func("SSLv3_server_method")
+have_func("SSLv3_client_method")
 have_func("TLSv1_1_method")
 have_func("TLSv1_1_server_method")
 have_func("TLSv1_1_client_method")
diff --git a/ext/openssl/ossl_ssl.c b/ext/openssl/ossl_ssl.c
index f7cb7f0..47111f6 100644
--- a/ext/openssl/ossl_ssl.c
+++ b/ext/openssl/ossl_ssl.c
@@ -109,9 +109,12 @@ static const struct {
     OSSL_SSL_METHOD_ENTRY(SSLv2_server),
     OSSL_SSL_METHOD_ENTRY(SSLv2_client),
 #endif
+#if defined(HAVE_SSLV3_METHOD) && defined(HAVE_SSLV3_SERVER_METHOD) && \
+        defined(HAVE_SSLV3_CLIENT_METHOD)
     OSSL_SSL_METHOD_ENTRY(SSLv3),
     OSSL_SSL_METHOD_ENTRY(SSLv3_server),
     OSSL_SSL_METHOD_ENTRY(SSLv3_client),
+#endif
     OSSL_SSL_METHOD_ENTRY(SSLv23),
     OSSL_SSL_METHOD_ENTRY(SSLv23_server),
     OSSL_SSL_METHOD_ENTRY(SSLv23_client),
src/rvm/patches/ruby/1.9.3/p125/debug.diff000066400000000734147511530530013640 0ustar00diff --git a/configure.in b/configure.in
index 5bc2e4e..52a5d19 100644
--- a/configure.in
+++ b/configure.in
@@ -493,7 +493,6 @@ if test "$GCC" = ""; then
     AS_CASE(["$target_os"],[aix*],[warnflags="-qinfo=por"])
 fi
 if test "$GCC" = yes; then
-    RUBY_TRY_CFLAGS(-fvisibility=hidden, [RUBY_APPEND_OPTION(XCFLAGS, -fvisibility=hidden)])
     AC_SUBST(WERRORFLAG, "-Werror")
     if test "$visibility_option" = yes; then
 	RUBY_APPEND_OPTION(XCFLAGS, -fvisibility=hidden)
src/rvm/patches/ruby/1.9.3/p125/xcode-debugopt-fix-r34840.diff000066400000002344147511530530017110 0ustar00Shared library config fix for MacOS X to make Ruby 1.9.3-p125 with XCode 4.3.x
happy.

https://bugs.ruby-lang.org/issues/6080

--- trunk/configure.in	2012/02/28 01:30:15	34839
+++ trunk/configure.in	2012/02/28 02:44:52	34840
@@ -289,12 +289,10 @@
 if test "$GCC" = yes; then
     linker_flag=-Wl,
     : ${optflags=-O3}
-    AS_CASE(["$target_os"], [linux*|darwin*], [: ${debugflags=-ggdb}])
     RUBY_APPEND_OPTIONS(XCFLAGS, ["-include ruby/config.h" "-include ruby/missing.h"])
 else
     linker_flag=
 fi
-test $ac_cv_prog_cc_g = yes && : ${debugflags=-g}
 
 RUBY_PROG_GNU_LD
 RUBY_CPPOUTFILE
@@ -490,6 +488,9 @@
     warnflags=
 fi
 if test "$GCC" = yes; then
+    test "${debugflags+set}" || {RUBY_TRY_CFLAGS(-ggdb, [debugflags=-ggdb])}
+    test "${debugflags+set}" || {RUBY_TRY_CFLAGS(-g3, [debugflags=-g3])}
+
     # -D_FORTIFY_SOURCE
     RUBY_TRY_CFLAGS(-D_FORTIFY_SOURCE=2, [RUBY_APPEND_OPTION(XCFLAGS, -D_FORTIFY_SOURCE=2)])
 
@@ -513,6 +514,7 @@
     # suppress annoying -Wstrict-overflow warnings
     RUBY_TRY_CFLAGS(-fno-strict-overflow, [RUBY_APPEND_OPTION(XCFLAGS, -fno-strict-overflow)])
 fi
+test $ac_cv_prog_cc_g = yes && : ${debugflags=-g}
 
 if test "$GCC" = ""; then
     AS_CASE(["$target_os"],[aix*],[warnflags="-qinfo=por"])
src/rvm/patches/ruby/1.9.3/p125/falcon.patch000066400000363044147511530530014211 0ustar00diff --git a/Changelog.backport_gc b/Changelog.backport_gc
new file mode 100644
index 0000000..b617fc8
--- /dev/null
+++ b/Changelog.backport_gc
@@ -0,0 +1,128 @@
+Tue Jan 17 12:32:46 2012  Nobuyoshi Nakada  <nobu@ruby-lang.org>
+
+	* gc.c (aligned_malloc, aligned_free): covered missing defined
+	  operators and fixes for cygwin.
+
+Wed Jan 11 22:52:51 2012  CHIKANAGA Tomoyuki  <nagachika00@gmail.com>
+
+	* gc.c (ruby_mimmalloc): don't set allocated size to header.
+	  ruby_mimmalloc() doesn't increment allocated_size/allocations and
+	  decrement them in ruby_xfree() cause inconsistency.
+
+	* gc.c (ruby_xfree): don't decrement allocated_size/allocations if
+	  allocated size record is 0.
+
+Tue Jan 10 15:13:58 2012  NARUSE, Yui  <naruse@ruby-lang.org>
+
+	* ext/readline/readline.c (readline_attempted_completion_function):
+	  use rb_memerror().
+
+Tue Jan 10 12:44:11 2012  NARUSE, Yui  <naruse@ruby-lang.org>
+
+	* gc.c (ruby_mimmalloc): defined for objects need not rb_objspace,
+	  but should return pointer suitable for ruby_xfree;
+	  main vm and main thread.
+	  patched by Sokolov Yura. https://github.com/ruby/ruby/pull/79
+
+	* internal.h: ditto.
+
+	* vm.c (Init_BareVM): use ruby_mimmalloc.
+
+	* ext/dl/cfunc.c: #include <ruby/util.h>.
+
+	* ext/syslog/syslog.c: use xfree because it is allocated by
+	  ruby_strdup.
+
+Tue Jan 10 12:13:56 2012  Kazuhiro NISHIYAMA  <zn@mbf.nifty.com>
+
+	* ext/readline/readline.c (readline_attempted_completion_function):
+	  fix compile error.
+
+Tue Jan 10 10:41:11 2012  Nobuyoshi Nakada  <nobu@ruby-lang.org>
+
+	* ext/readline/readline.c (readline_attempted_completion_function):
+	  empty completion result does not mean memory error.
+
+Mon Jan  9 23:37:43 2012  CHIKANAGA Tomoyuki  <nagachika00@gmail.com>
+
+	* ext/readline/readline.c (readline_attempted_completion_function):
+	  fix typos.
+
+Mon Jan  9 20:55:34 2012  Narihiro Nakamura  <authornari@gmail.com>
+
+	* gc.c : don't embed struct heaps_slot to a heap block because it
+	  can causes copy-on-write of memory page on heap block when its
+	  free_next is rewirted.
+
+Mon Jan  9 14:42:41 2012  Narihiro Nakamura  <authornari@gmail.com>
+
+	* gc.c: free_slots is changed Singly linked list. clear
+	  free_slots before sweep.
+
+Mon Jan  9 04:24:59 2012  NARUSE, Yui  <naruse@ruby-lang.org>
+
+	* gc.c (rb_objspace_free): global_List is allocated with xmalloc.
+	  patched by Sokolov Yura.  https://github.com/ruby/ruby/pull/78
+
+	* dln_find.c: remove useless replacement of free.
+
+	* ext/readline/readline.c (readline_attempted_completion_function):
+	  strings for readline must allocated with malloc.
+
+	* process.c (run_exec_dup2): use free; see also r20950.
+
+	* re.c (onig_new_with_source): use malloc for oniguruma.
+
+	* vm.c (ruby_vm_destruct): use free for VMs.
+
+	* vm.c (thread_free): use free for threads.
+
+Mon Jan  9 04:24:59 2012  NARUSE, Yui  <naruse@ruby-lang.org>
+
+	* dln_find.c: remove useless replacement of free.
+
+	* ext/readline/readline.c (filename_completion_proc_call):
+	  matches should use xfree.
+
+	* ext/readline/readline.c (username_completion_proc_call): ditto.
+
+Sun Jan  8 20:31:45 2012  Narihiro Nakamura  <narihiro@netlab.jp>
+
+	* gc.c : consider header bytes which are used by malloc.
+
+Sun Jan  8 11:54:43 2012  Narihiro Nakamura  <authornari@gmail.com>
+
+	* gc.c (aligned_free): support MinGW. Patch by Hiroshi Shirosaki.
+
+Sun Jan  8 11:43:05 2012  Narihiro Nakamura  <authornari@gmail.com>
+
+	* gc.c (slot_sweep): add a assertion instead of a debug print.
+
+Sun Jan  8 00:46:34 2012  KOSAKI Motohiro  <kosaki.motohiro@gmail.com>
+
+	* gc.c: get rid of implicit narrowing conversion.
+
+Sun Jan  8 00:10:10 2012  NARUSE, Yui  <naruse@ruby-lang.org>
+
+	* configure.in: check posix_memalign(3) and menalign(3).
+
+	* gc.c (aligned_malloc): use configure's result instead of
+	  _POSIX_C_SOURCE and _XOPEN_SOURCE because they can't be used
+	  to check availability at least on FreeBSD.
+
+Sat Jan  7 22:25:50 2012  Narihiro Nakamura  <authornari@gmail.com>
+
+	* gc.c: use Bitmap Marking algorithm to avoid copy-on-write of
+	  memory pages. See [ruby-dev:45085] [Feature #5839]
+	  [ruby-core:41916].
+
+	* include/ruby/ruby.h : FL_MARK rename to FL_RESERVED1.
+
+	* node.h : ditto.
+
+	* debug.c : ditto.
+
+	* object.c (rb_obj_clone): FL_MARK move to a bitmap.
+
+	* class.c (rb_singleton_class_clone): ditto.
+
diff --git a/class.c b/class.c
index df19812..56a6f6f 100644
--- a/class.c
+++ b/class.c
@@ -186,7 +186,7 @@ rb_mod_init_copy(VALUE clone, VALUE orig)
 	    rb_free_const_table(RCLASS_CONST_TBL(clone));
 	}
 	RCLASS_CONST_TBL(clone) = st_init_numtable();
-	st_foreach(RCLASS_CONST_TBL(orig), clone_const_i, (st_data_t)RCLASS_CONST_TBL(clone));
+	st_foreach_nocheck(RCLASS_CONST_TBL(orig), clone_const_i, (st_data_t)RCLASS_CONST_TBL(clone));
     }
     if (RCLASS_M_TBL(orig)) {
 	struct clone_method_data data;
@@ -196,7 +196,7 @@ rb_mod_init_copy(VALUE clone, VALUE orig)
 	}
 	data.tbl = RCLASS_M_TBL(clone) = st_init_numtable();
 	data.klass = clone;
-	st_foreach(RCLASS_M_TBL(orig), clone_method,
+	st_foreach_nocheck(RCLASS_M_TBL(orig), clone_method,
 		   (st_data_t)&data);
     }
 
@@ -229,7 +229,7 @@ rb_singleton_class_clone(VALUE obj)
     else {
 	struct clone_method_data data;
 	/* copy singleton(unnamed) class */
-	VALUE clone = class_alloc((RBASIC(klass)->flags & ~(FL_MARK)), 0);
+	VALUE clone = class_alloc(RBASIC(klass)->flags, 0);
 
 	if (BUILTIN_TYPE(obj) == T_CLASS) {
 	    RBASIC(clone)->klass = (VALUE)clone;
@@ -244,12 +244,12 @@ rb_singleton_class_clone(VALUE obj)
 	}
 	if (RCLASS_CONST_TBL(klass)) {
 	    RCLASS_CONST_TBL(clone) = st_init_numtable();
-	    st_foreach(RCLASS_CONST_TBL(klass), clone_const_i, (st_data_t)RCLASS_CONST_TBL(clone));
+	    st_foreach_nocheck(RCLASS_CONST_TBL(klass), clone_const_i, (st_data_t)RCLASS_CONST_TBL(clone));
 	}
 	RCLASS_M_TBL(clone) = st_init_numtable();
 	data.tbl = RCLASS_M_TBL(clone);
 	data.klass = (VALUE)clone;
-	st_foreach(RCLASS_M_TBL(klass), clone_method,
+	st_foreach_nocheck(RCLASS_M_TBL(klass), clone_method,
 		   (st_data_t)&data);
 	rb_singleton_class_attached(RBASIC(clone)->klass, (VALUE)clone);
 	FL_SET(clone, FL_SINGLETON);
@@ -891,13 +891,13 @@ class_instance_method_list(int argc, VALUE *argv, VALUE mod, int obj, int (*func
 
     list = st_init_numtable();
     for (; mod; mod = RCLASS_SUPER(mod)) {
-	st_foreach(RCLASS_M_TBL(mod), method_entry_i, (st_data_t)list);
+	st_foreach_nocheck(RCLASS_M_TBL(mod), method_entry_i, (st_data_t)list);
 	if (BUILTIN_TYPE(mod) == T_ICLASS) continue;
 	if (obj && FL_TEST(mod, FL_SINGLETON)) continue;
 	if (!recur) break;
     }
     ary = rb_ary_new();
-    st_foreach(list, func, ary);
+    st_foreach_nocheck(list, func, ary);
     st_free_table(list);
 
     return ary;
@@ -1123,17 +1123,17 @@ rb_obj_singleton_methods(int argc, VALUE *argv, VALUE obj)
     klass = CLASS_OF(obj);
     list = st_init_numtable();
     if (klass && FL_TEST(klass, FL_SINGLETON)) {
-	st_foreach(RCLASS_M_TBL(klass), method_entry_i, (st_data_t)list);
+	st_foreach_nocheck(RCLASS_M_TBL(klass), method_entry_i, (st_data_t)list);
 	klass = RCLASS_SUPER(klass);
     }
     if (RTEST(recur)) {
 	while (klass && (FL_TEST(klass, FL_SINGLETON) || TYPE(klass) == T_ICLASS)) {
-	    st_foreach(RCLASS_M_TBL(klass), method_entry_i, (st_data_t)list);
+	    st_foreach_nocheck(RCLASS_M_TBL(klass), method_entry_i, (st_data_t)list);
 	    klass = RCLASS_SUPER(klass);
 	}
     }
     ary = rb_ary_new();
-    st_foreach(list, ins_methods_i, ary);
+    st_foreach_nocheck(list, ins_methods_i, ary);
     st_free_table(list);
 
     return ary;
diff --git a/common.mk b/common.mk
index eb89a2b..59cdfe4 100644
--- a/common.mk
+++ b/common.mk
@@ -630,7 +630,8 @@ file.$(OBJEXT): {$(VPATH)}file.c $(RUBY_H_INCLUDES) {$(VPATH)}io.h \
 gc.$(OBJEXT): {$(VPATH)}gc.c $(RUBY_H_INCLUDES) {$(VPATH)}re.h \
   {$(VPATH)}regex.h $(ENCODING_H_INCLUDES) $(VM_CORE_H_INCLUDES) \
   {$(VPATH)}gc.h {$(VPATH)}io.h {$(VPATH)}eval_intern.h {$(VPATH)}util.h \
-  {$(VPATH)}debug.h {$(VPATH)}internal.h {$(VPATH)}constant.h
+  {$(VPATH)}debug.h {$(VPATH)}internal.h {$(VPATH)}constant.h \
+  {$(VPATH)}pool_alloc.inc.h {$(VPATH)}pool_alloc.h
 hash.$(OBJEXT): {$(VPATH)}hash.c $(RUBY_H_INCLUDES) {$(VPATH)}util.h \
   $(ENCODING_H_INCLUDES)
 inits.$(OBJEXT): {$(VPATH)}inits.c $(RUBY_H_INCLUDES) \
@@ -693,7 +694,7 @@ signal.$(OBJEXT): {$(VPATH)}signal.c $(RUBY_H_INCLUDES) \
   $(VM_CORE_H_INCLUDES) {$(VPATH)}debug.h
 sprintf.$(OBJEXT): {$(VPATH)}sprintf.c $(RUBY_H_INCLUDES) {$(VPATH)}re.h \
   {$(VPATH)}regex.h {$(VPATH)}vsnprintf.c $(ENCODING_H_INCLUDES)
-st.$(OBJEXT): {$(VPATH)}st.c $(RUBY_H_INCLUDES)
+st.$(OBJEXT): {$(VPATH)}st.c $(RUBY_H_INCLUDES) {$(VPATH)}pool_alloc.h
 strftime.$(OBJEXT): {$(VPATH)}strftime.c $(RUBY_H_INCLUDES) \
   {$(VPATH)}timev.h
 string.$(OBJEXT): {$(VPATH)}string.c $(RUBY_H_INCLUDES) {$(VPATH)}re.h \
diff --git a/compile.c b/compile.c
index 61e0f32..4f05b26 100644
--- a/compile.c
+++ b/compile.c
@@ -452,7 +452,7 @@ validate_label(st_data_t name, st_data_t label, st_data_t arg)
 static void
 validate_labels(rb_iseq_t *iseq, st_table *labels_table)
 {
-    st_foreach(labels_table, validate_label, (st_data_t)iseq);
+    st_foreach_nocheck(labels_table, validate_label, (st_data_t)iseq);
     if (!NIL_P(iseq->compile_data->err_info)) {
 	rb_exc_raise(iseq->compile_data->err_info);
     }
diff --git a/configure.in b/configure.in
index d645aa7..e1f1760 100644
--- a/configure.in
+++ b/configure.in
@@ -1313,6 +1313,30 @@ main() {
 CFLAGS="$save_CFLAGS"])
 AC_DEFINE_UNQUOTED(GC_MARK_STACKFRAME_WORD, $rb_cv_gc_mark_stackframe_word)
 
+AS_CASE(["$target_os"],
+[openbsd*|darwin[15-9].*|darwin10.[012345]*], [
+  AC_CACHE_CHECK(for heap align log on openbsd/macos, rb_cv_page_size_log,
+    [rb_cv_page_size_log=no
+     for page_log in 12 13; do
+       AC_TRY_RUN([
+#include <math.h>
+#include <unistd.h>
+
+int
+main() {
+  if ((int)log2((double)sysconf(_SC_PAGESIZE)) != $page_log) return 1;
+  return 0;
+}
+       ],
+       rb_cv_page_size_log="$page_log"; break)
+     done])
+  if test $rb_cv_page_size_log != no; then
+    AC_DEFINE_UNQUOTED(USE_PAGESIZE_LOG, $rb_cv_page_size_log)
+  else
+    AC_DEFINE_UNQUOTED(USE_PAGESIZE_LOG, 12)
+  fi
+])
+
 
 dnl Checks for library functions.
 AC_TYPE_GETGROUPS
@@ -1413,7 +1437,8 @@ AC_CHECK_FUNCS(fmod killpg wait4 waitpid fork spawnv syscall __syscall chroot ge
 	      setsid telldir seekdir fchmod cosh sinh tanh log2 round\
 	      setuid setgid daemon select_large_fdset setenv unsetenv\
               mktime timegm gmtime_r clock_gettime gettimeofday poll ppoll\
-              pread sendfile shutdown sigaltstack dl_iterate_phdr)
+              pread sendfile shutdown sigaltstack dl_iterate_phdr \
+              posix_memalign memalign valloc)
 
 AC_CACHE_CHECK(for unsetenv returns a value, rb_cv_unsetenv_return_value,
   [AC_TRY_COMPILE([
diff --git a/debug.c b/debug.c
index dcc710b..b77be0e 100644
--- a/debug.c
+++ b/debug.c
@@ -32,8 +32,8 @@ const union {
         RUBY_ENC_CODERANGE_7BIT    = ENC_CODERANGE_7BIT,
         RUBY_ENC_CODERANGE_VALID   = ENC_CODERANGE_VALID,
         RUBY_ENC_CODERANGE_BROKEN  = ENC_CODERANGE_BROKEN,
-        RUBY_FL_MARK        = FL_MARK,
-        RUBY_FL_RESERVED    = FL_RESERVED,
+        RUBY_FL_RESERVED1   = FL_RESERVED1,
+        RUBY_FL_RESERVED2   = FL_RESERVED2,
         RUBY_FL_FINALIZE    = FL_FINALIZE,
         RUBY_FL_TAINT       = FL_TAINT,
         RUBY_FL_UNTRUSTED   = FL_UNTRUSTED,
diff --git a/dln.c b/dln.c
index 961592d..aadfdba 100644
--- a/dln.c
+++ b/dln.c
@@ -466,7 +466,7 @@ static void
 dln_print_undef(void)
 {
     fprintf(stderr, " Undefined symbols:\n");
-    st_foreach(undef_tbl, undef_print, NULL);
+    st_foreach_nocheck(undef_tbl, undef_print, NULL);
 }
 
 static void
@@ -660,7 +660,7 @@ load_1(int fd, long disp, const char *need_init)
 
 		data.name0 = sym->n_un.n_name;
 		data.name1 = sym[1].n_un.n_name;
-		st_foreach(reloc_tbl, reloc_repl, &data);
+		st_foreach_nocheck(reloc_tbl, reloc_repl, &data);
 
 		st_insert(undef_tbl, strdup(sym[1].n_un.n_name), NULL);
 		if (st_delete(undef_tbl, (st_data_t*)&key, NULL)) {
@@ -982,7 +982,7 @@ load_lib(const char *lib)
 	}
 	for (;;) {
 	    target_offset = -1;
-	    st_foreach(undef_tbl, search_undef, lib_tbl);
+	    st_foreach_nocheck(undef_tbl, search_undef, lib_tbl);
 	    if (target_offset == -1) break;
 	    if (load_1(fd, target_offset, 0) == -1) {
 		st_free_table(lib_tbl);
diff --git a/dln_find.c b/dln_find.c
index 7ce3a95..d9166fa 100644
--- a/dln_find.c
+++ b/dln_find.c
@@ -45,14 +45,6 @@ char *dln_argv0;
 # include <strings.h>
 #endif
 
-#ifndef xmalloc
-void *xmalloc();
-void *xcalloc();
-void *xrealloc();
-#endif
-
-#define free(x) xfree(x)
-
 #include <stdio.h>
 #if defined(_WIN32)
 #include "missing/file.h"
diff --git a/ext/dl/cfunc.c b/ext/dl/cfunc.c
index 66aebf2..70cf6c4 100644
--- a/ext/dl/cfunc.c
+++ b/ext/dl/cfunc.c
@@ -2,7 +2,8 @@
  * $Id$
  */
 
-#include <ruby.h>
+#include <ruby/ruby.h>
+#include <ruby/util.h>
 #include <errno.h>
 #include "dl.h"
 
diff --git a/ext/readline/readline.c b/ext/readline/readline.c
index 9066004..a1cad0e 100644
--- a/ext/readline/readline.c
+++ b/ext/readline/readline.c
@@ -713,7 +713,8 @@ readline_attempted_completion_function(const char *text, int start, int end)
 
 	    low = i1;
 	}
-	result[0] = ALLOC_N(char, low + 1);
+	result[0] = (char*)malloc(low + 1);
+	if (result[0]  == NULL) rb_memerror();
 	strncpy(result[0], result[1], low);
 	result[0][low] = '\0';
     }
diff --git a/ext/syck/emitter.c b/ext/syck/emitter.c
index af0d789..d4bc7cc 100644
--- a/ext/syck/emitter.c
+++ b/ext/syck/emitter.c
@@ -152,7 +152,7 @@ syck_emitter_st_free( SyckEmitter *e )
      */
     if ( e->anchors != NULL )
     {
-        st_foreach( e->anchors, syck_st_free_anchors, 0 );
+        st_foreach_nocheck( e->anchors, syck_st_free_anchors, 0 );
         st_free_table( e->anchors );
         e->anchors = NULL;
     }
diff --git a/ext/syck/rubyext.c b/ext/syck/rubyext.c
index 2ab2e49..e10e72b 100644
--- a/ext/syck/rubyext.c
+++ b/ext/syck/rubyext.c
@@ -754,11 +754,11 @@ syck_mark_parser(SyckParser *parser)
 
     if ( parser->anchors != NULL )
     {
-        st_foreach( parser->anchors, syck_st_mark_nodes, 0 );
+        st_foreach_nocheck( parser->anchors, syck_st_mark_nodes, 0 );
     }
     if ( parser->bad_anchors != NULL )
     {
-        st_foreach( parser->bad_anchors, syck_st_mark_nodes, 0 );
+        st_foreach_nocheck( parser->bad_anchors, syck_st_mark_nodes, 0 );
     }
 }
 
diff --git a/ext/syck/syck.c b/ext/syck/syck.c
index 94e3992..36ed8e7 100644
--- a/ext/syck/syck.c
+++ b/ext/syck/syck.c
@@ -223,7 +223,7 @@ syck_st_free( SyckParser *p )
 
     if ( p->bad_anchors != NULL )
     {
-        st_foreach( p->bad_anchors, syck_st_free_nodes, 0 );
+        st_foreach_nocheck( p->bad_anchors, syck_st_free_nodes, 0 );
         st_free_table( p->bad_anchors );
         p->bad_anchors = NULL;
     }
@@ -253,7 +253,7 @@ syck_free_parser( SyckParser *p )
      */
     if ( p->syms != NULL )
     {
-        st_foreach( p->syms, syck_st_free_syms, 0 );
+        st_foreach_nocheck( p->syms, syck_st_free_syms, 0 );
         st_free_table( p->syms );
         p->syms = NULL;
     }
diff --git a/ext/syslog/syslog.c b/ext/syslog/syslog.c
index f7d622e..912ba6a 100644
--- a/ext/syslog/syslog.c
+++ b/ext/syslog/syslog.c
@@ -49,7 +49,7 @@ static VALUE mSyslog_close(VALUE self)
 
     closelog();
 
-    free((void *)syslog_ident);
+    xfree((void *)syslog_ident);
     syslog_ident = NULL;
     syslog_options = syslog_facility = syslog_mask = -1;
     syslog_opened = 0;
diff --git a/gc.c b/gc.c
index c53bfd9..01c05f1 100644
--- a/gc.c
+++ b/gc.c
@@ -20,10 +20,12 @@
 #include "vm_core.h"
 #include "internal.h"
 #include "gc.h"
+#include "pool_alloc.h"
 #include "constant.h"
 #include <stdio.h>
 #include <setjmp.h>
 #include <sys/types.h>
+#include <assert.h>
 
 #ifdef HAVE_SYS_TIME_H
 #include <sys/time.h>
@@ -35,7 +37,12 @@
 
 #if defined _WIN32 || defined __CYGWIN__
 #include <windows.h>
+#elif defined(HAVE_POSIX_MEMALIGN)
+#elif defined(HAVE_MEMALIGN) || defined(HAVE_VALLOC)
+#include <malloc.h>
 #endif
+static void *aligned_malloc(size_t, size_t);
+static void aligned_free(void *);
 
 #ifdef HAVE_VALGRIND_MEMCHECK_H
 # include <valgrind/memcheck.h>
@@ -84,10 +91,12 @@ typedef struct {
     unsigned int initial_malloc_limit;
     unsigned int initial_heap_min_slots;
     unsigned int initial_free_min;
+#if defined(ENABLE_VM_OBJSPACE) && ENABLE_VM_OBJSPACE
     int gc_stress;
+#endif
 } ruby_gc_params_t;
 
-ruby_gc_params_t initial_params = {
+static ruby_gc_params_t initial_params = {
     GC_MALLOC_LIMIT,
     HEAP_MIN_SLOTS,
     FREE_MIN,
@@ -103,7 +112,10 @@ ruby_gc_params_t initial_params = {
 int ruby_gc_debug_indent = 0;
 
 /* for GC profile */
+#ifndef GC_PROFILE_MORE_DETAIL
 #define GC_PROFILE_MORE_DETAIL 0
+#endif
+
 typedef struct gc_profile_record {
     double gc_time;
     double gc_mark_time;
@@ -301,17 +313,20 @@ typedef struct RVALUE {
 #endif
 
 struct heaps_slot {
-    void *membase;
-    RVALUE *slot;
-    size_t limit;
+    struct heaps_header *membase;
+    RVALUE *freelist;
     struct heaps_slot *next;
     struct heaps_slot *prev;
+    struct heaps_slot *free_next;
+    uintptr_t bits[1];
 };
 
-struct sorted_heaps_slot {
+struct heaps_header {
+    struct heaps_slot *base;
+    uintptr_t *bits;
     RVALUE *start;
     RVALUE *end;
-    struct heaps_slot *slot;
+    size_t limit;
 };
 
 struct gc_list {
@@ -319,7 +334,27 @@ struct gc_list {
     struct gc_list *next;
 };
 
+#ifndef CALC_EXACT_MALLOC_SIZE
 #define CALC_EXACT_MALLOC_SIZE 0
+#endif
+
+#ifdef POOL_ALLOC_API
+/* POOL ALLOC API */
+#define POOL_ALLOC_PART 1
+#include "pool_alloc.inc.h"
+#undef POOL_ALLOC_PART
+
+typedef struct pool_layout_t pool_layout_t;
+struct pool_layout_t {
+    pool_header
+      p6,  /* st_table && st_table_entry */
+      p11;  /* st_table.bins init size */
+} pool_layout = {
+    INIT_POOL(void*[6]),
+    INIT_POOL(void*[11])
+};
+static void pool_finalize_header(pool_header *header);
+#endif
 
 typedef struct rb_objspace {
     struct {
@@ -330,16 +365,20 @@ typedef struct rb_objspace {
 	size_t allocations;
 #endif
     } malloc_params;
+#ifdef POOL_ALLOC_API
+    pool_layout_t *pool_headers;
+#endif
     struct {
 	size_t increment;
 	struct heaps_slot *ptr;
 	struct heaps_slot *sweep_slots;
-	struct sorted_heaps_slot *sorted;
+	struct heaps_slot *free_slots;
+	struct heaps_header **sorted;
 	size_t length;
 	size_t used;
-	RVALUE *freelist;
+        struct heaps_slot *reserve_slots;
 	RVALUE *range[2];
-	RVALUE *freed;
+	struct heaps_header *freed;
 	size_t live_num;
 	size_t free_num;
 	size_t free_min;
@@ -350,6 +389,7 @@ typedef struct rb_objspace {
 	int dont_gc;
 	int dont_lazy_sweep;
 	int during_gc;
+	rb_atomic_t finalizing;
     } flags;
     struct {
 	st_table *table;
@@ -377,7 +417,11 @@ typedef struct rb_objspace {
 #define ruby_initial_gc_stress	initial_params.gc_stress
 int *ruby_initial_gc_stress_ptr = &ruby_initial_gc_stress;
 #else
+#  ifdef POOL_ALLOC_API
+static rb_objspace_t rb_objspace = {{GC_MALLOC_LIMIT}, &pool_layout, {HEAP_MIN_SLOTS}};
+#  else
 static rb_objspace_t rb_objspace = {{GC_MALLOC_LIMIT}, {HEAP_MIN_SLOTS}};
+#  endif
 int *ruby_initial_gc_stress_ptr = &rb_objspace.gc_stress;
 #endif
 #define malloc_limit		objspace->malloc_params.limit
@@ -385,13 +429,13 @@ int *ruby_initial_gc_stress_ptr = &rb_objspace.gc_stress;
 #define heaps			objspace->heap.ptr
 #define heaps_length		objspace->heap.length
 #define heaps_used		objspace->heap.used
-#define freelist		objspace->heap.freelist
 #define lomem			objspace->heap.range[0]
 #define himem			objspace->heap.range[1]
 #define heaps_inc		objspace->heap.increment
 #define heaps_freed		objspace->heap.freed
 #define dont_gc 		objspace->flags.dont_gc
 #define during_gc		objspace->flags.during_gc
+#define finalizing		objspace->flags.finalizing
 #define finalizer_table 	objspace->final.table
 #define deferred_final_list	objspace->final.deferred
 #define mark_stack		objspace->markstack.buffer
@@ -403,6 +447,12 @@ int *ruby_initial_gc_stress_ptr = &rb_objspace.gc_stress;
 #define initial_heap_min_slots	initial_params.initial_heap_min_slots
 #define initial_free_min	initial_params.initial_free_min
 
+#define is_lazy_sweeping(objspace) ((objspace)->heap.sweep_slots != 0)
+
+#define nonspecial_obj_id(obj) (VALUE)((SIGNED_VALUE)(obj)|FIXNUM_FLAG)
+
+#define HEAP_HEADER(p) ((struct heaps_header *)(p))
+
 static void rb_objspace_call_finalizer(rb_objspace_t *objspace);
 
 #if defined(ENABLE_VM_OBJSPACE) && ENABLE_VM_OBJSPACE
@@ -413,6 +463,10 @@ rb_objspace_alloc(void)
     memset(objspace, 0, sizeof(*objspace));
     malloc_limit = initial_malloc_limit;
     ruby_gc_stress = ruby_initial_gc_stress;
+#ifdef POOL_ALLOC_API
+    objspace->pool_headers = (pool_layout_t*) malloc(sizeof(pool_layout));
+    memcpy(objspace->pool_headers, &pool_layout, sizeof(pool_layout));
+#endif
 
     return objspace;
 }
@@ -465,6 +519,7 @@ rb_gc_set_params(void)
 static void gc_sweep(rb_objspace_t *);
 static void slot_sweep(rb_objspace_t *, struct heaps_slot *);
 static void gc_clear_mark_on_sweep_slots(rb_objspace_t *);
+static void aligned_free(void *);
 
 void
 rb_objspace_free(rb_objspace_t *objspace)
@@ -479,40 +534,64 @@ rb_objspace_free(rb_objspace_t *objspace)
 	struct gc_list *list, *next;
 	for (list = global_List; list; list = next) {
 	    next = list->next;
-	    free(list);
+	    xfree(list);
 	}
     }
+    if (objspace->heap.reserve_slots) {
+        struct heaps_slot *list, *next;
+        for (list = objspace->heap.reserve_slots; list; list = next) {
+            next = list->free_next;
+            free(list);
+        }
+    }
     if (objspace->heap.sorted) {
 	size_t i;
 	for (i = 0; i < heaps_used; ++i) {
-	    free(objspace->heap.sorted[i].slot->membase);
-	    free(objspace->heap.sorted[i].slot);
+            free(objspace->heap.sorted[i]->base);
+	    aligned_free(objspace->heap.sorted[i]);
 	}
 	free(objspace->heap.sorted);
 	heaps_used = 0;
 	heaps = 0;
     }
+#ifdef POOL_ALLOC_API
+    if (objspace->pool_headers) {
+        pool_finalize_header(&objspace->pool_headers->p6);
+        pool_finalize_header(&objspace->pool_headers->p11);
+        free(objspace->pool_headers);
+    }
+#endif
     free(objspace);
 }
 #endif
 
-/* tiny heap size */
-/* 32KB */
-/*#define HEAP_SIZE 0x8000 */
-/* 128KB */
-/*#define HEAP_SIZE 0x20000 */
-/* 64KB */
-/*#define HEAP_SIZE 0x10000 */
-/* 16KB */
-#define HEAP_SIZE 0x4000
-/* 8KB */
-/*#define HEAP_SIZE 0x2000 */
-/* 4KB */
-/*#define HEAP_SIZE 0x1000 */
-/* 2KB */
-/*#define HEAP_SIZE 0x800 */
-
-#define HEAP_OBJ_LIMIT (unsigned int)(HEAP_SIZE / sizeof(struct RVALUE))
+#ifndef HEAP_ALIGN_LOG
+#ifdef USE_PAGESIZE_LOG
+#define HEAP_ALIGN_LOG USE_PAGESIZE_LOG
+#else
+/* default tiny heap size: 16KB */
+#define HEAP_ALIGN_LOG 15
+#endif
+#endif
+#define HEAP_ALIGN (1UL << HEAP_ALIGN_LOG)
+#define HEAP_ALIGN_MASK (~(~0UL << HEAP_ALIGN_LOG))
+#define REQUIRED_SIZE_BY_MALLOC (sizeof(size_t) * 5)
+#define HEAP_SIZE (HEAP_ALIGN - REQUIRED_SIZE_BY_MALLOC)
+#define CEILDIV(i, mod) (((i) + (mod) - 1)/(mod))
+
+#define HEAP_OBJ_LIMIT (unsigned int)((HEAP_SIZE - sizeof(struct heaps_header))/sizeof(struct RVALUE))
+#define HEAP_BITMAP_LIMIT CEILDIV(CEILDIV(HEAP_SIZE, sizeof(struct RVALUE)), sizeof(uintptr_t)*8)
+#define HEAP_SLOT_SIZE (sizeof(struct heaps_slot) + (HEAP_BITMAP_LIMIT-1) * sizeof(uintptr_t))
+
+#define GET_HEAP_HEADER(x) (HEAP_HEADER(((uintptr_t)x) & ~(HEAP_ALIGN_MASK)))
+#define GET_HEAP_SLOT(x) (GET_HEAP_HEADER(x)->base)
+#define GET_HEAP_BITMAP(x) (GET_HEAP_HEADER(x)->bits)
+#define NUM_IN_SLOT(p) (((uintptr_t)p & HEAP_ALIGN_MASK)/sizeof(RVALUE))
+#define BITMAP_INDEX(p) (NUM_IN_SLOT(p) / (sizeof(uintptr_t) * 8))
+#define BITMAP_OFFSET(p) (NUM_IN_SLOT(p) & ((sizeof(uintptr_t) * 8)-1))
+#define MARKED_IN_BITMAP(bits, p) (bits[BITMAP_INDEX(p)] & ((uintptr_t)1 << BITMAP_OFFSET(p)))
+#define MARK_IN_BITMAP(bits, p) (bits[BITMAP_INDEX(p)] = bits[BITMAP_INDEX(p)] | ((uintptr_t)1 << BITMAP_OFFSET(p)))
+#define CLEAR_IN_BITMAP(bits, p) (bits[BITMAP_INDEX(p)] &= ~((uintptr_t)1 << BITMAP_OFFSET(p)))
 
 extern st_table *rb_class_tbl;
 
@@ -824,8 +903,10 @@ vm_xfree(rb_objspace_t *objspace, void *ptr)
     size_t size;
     ptr = ((size_t *)ptr) - 1;
     size = ((size_t*)ptr)[0];
-    objspace->malloc_params.allocated_size -= size;
-    objspace->malloc_params.allocations--;
+    if (size) {
+	objspace->malloc_params.allocated_size -= size;
+	objspace->malloc_params.allocations--;
+    }
 #endif
 
     free(ptr);
@@ -895,6 +976,46 @@ ruby_xfree(void *x)
 	vm_xfree(&rb_objspace, x);
 }
 
+#ifdef POOL_ALLOC_API
+/* POOL ALLOC API */
+#define POOL_ALLOC_PART 2
+#include "pool_alloc.inc.h"
+#undef POOL_ALLOC_PART
+
+void
+ruby_xpool_free(void *ptr)
+{
+    pool_free_entry((void**)ptr);
+}
+
+#define CONCRET_POOL_MALLOC(pnts) \
+void * ruby_xpool_malloc_##pnts##p () { \
+    return pool_alloc_entry(&rb_objspace.pool_headers->p##pnts ); \
+}
+CONCRET_POOL_MALLOC(6)
+CONCRET_POOL_MALLOC(11)
+#undef CONCRET_POOL_MALLOC
+
+#endif
+
+/* Mimic ruby_xmalloc, but need not rb_objspace.
+ * should return pointer suitable for ruby_xfree
+ */
+void *
+ruby_mimmalloc(size_t size)
+{
+    void *mem;
+#if CALC_EXACT_MALLOC_SIZE
+    size += sizeof(size_t);
+#endif
+    mem = malloc(size);
+#if CALC_EXACT_MALLOC_SIZE
+    /* set 0 for consistency of allocated_size/allocations */
+    ((size_t *)mem)[0] = 0;
+    mem = (size_t *)mem + 1;
+#endif
+    return mem;
+}
 
 /*
  *  call-seq:
@@ -985,70 +1106,128 @@ rb_gc_unregister_address(VALUE *addr)
     }
 }
 
-
 static void
 allocate_sorted_heaps(rb_objspace_t *objspace, size_t next_heaps_length)
 {
-    struct sorted_heaps_slot *p;
-    size_t size;
+    struct heaps_header **p;
+    struct heaps_slot *slot;
+    size_t size, add, i;
 
-    size = next_heaps_length*sizeof(struct sorted_heaps_slot);
+    size = next_heaps_length*sizeof(struct heaps_header *);
+    add = next_heaps_length - heaps_used;
 
     if (heaps_used > 0) {
-	p = (struct sorted_heaps_slot *)realloc(objspace->heap.sorted, size);
+	p = (struct heaps_header **)realloc(objspace->heap.sorted, size);
 	if (p) objspace->heap.sorted = p;
     }
     else {
-	p = objspace->heap.sorted = (struct sorted_heaps_slot *)malloc(size);
+	p = objspace->heap.sorted = (struct heaps_header **)malloc(size);
     }
 
     if (p == 0) {
 	during_gc = 0;
 	rb_memerror();
     }
-    heaps_length = next_heaps_length;
+
+    for (i = 0; i < add; i++) {
+        slot = (struct heaps_slot *)malloc(HEAP_SLOT_SIZE);
+        if (slot == 0) {
+            during_gc = 0;
+            rb_memerror();
+            return;
+        }
+        slot->free_next = objspace->heap.reserve_slots;
+        objspace->heap.reserve_slots = slot;
+    }
+}
+
+static void *
+aligned_malloc(size_t alignment, size_t size)
+{
+    void *res;
+
+#if defined __MINGW32__
+    res = __mingw_aligned_malloc(size, alignment);
+#elif defined _WIN32 && !defined __CYGWIN__
+    res = _aligned_malloc(size, alignment);
+#elif defined(HAVE_POSIX_MEMALIGN)
+    if (posix_memalign(&res, alignment, size) == 0) {
+        return res;
+    } else {
+        return NULL;
+    }
+#elif defined(HAVE_MEMALIGN)
+    res = memalign(alignment, size);
+#elif defined(HAVE_VALLOC)
+    res = valloc(size);
+#else
+#error no memalign function
+#endif
+    return res;
+}
+
+static void
+aligned_free(void *ptr)
+{
+#if defined __MINGW32__
+    __mingw_aligned_free(ptr);
+#elif defined _WIN32 && !defined __CYGWIN__
+    _aligned_free(ptr);
+#else
+    free(ptr);
+#endif
+}
+
+static void
+link_free_heap_slot(rb_objspace_t *objspace, struct heaps_slot *slot)
+{
+    slot->free_next = objspace->heap.free_slots;
+    objspace->heap.free_slots = slot;
+}
+
+static void
+unlink_free_heap_slot(rb_objspace_t *objspace, struct heaps_slot *slot)
+{
+    objspace->heap.free_slots = slot->free_next;
+    slot->free_next = NULL;
 }
 
 static void
 assign_heap_slot(rb_objspace_t *objspace)
 {
-    RVALUE *p, *pend, *membase;
+    RVALUE *p, *pend;
+    struct heaps_header *membase;
     struct heaps_slot *slot;
     size_t hi, lo, mid;
     size_t objs;
 
     objs = HEAP_OBJ_LIMIT;
-    p = (RVALUE*)malloc(HEAP_SIZE);
-    if (p == 0) {
-	during_gc = 0;
-	rb_memerror();
-    }
-    slot = (struct heaps_slot *)malloc(sizeof(struct heaps_slot));
-    if (slot == 0) {
-	xfree(p);
+    membase = (struct heaps_header*)aligned_malloc(HEAP_ALIGN, HEAP_SIZE);
+    if (membase == 0) {
 	during_gc = 0;
 	rb_memerror();
     }
+    assert(objspace->heap.reserve_slots != NULL);
+    slot = objspace->heap.reserve_slots;
+    objspace->heap.reserve_slots = slot->free_next;
     MEMZERO((void*)slot, struct heaps_slot, 1);
 
     slot->next = heaps;
     if (heaps) heaps->prev = slot;
     heaps = slot;
 
-    membase = p;
+    p = (RVALUE*)((VALUE)membase + sizeof(struct heaps_header));
     if ((VALUE)p % sizeof(RVALUE) != 0) {
-	p = (RVALUE*)((VALUE)p + sizeof(RVALUE) - ((VALUE)p % sizeof(RVALUE)));
-	if ((HEAP_SIZE - HEAP_OBJ_LIMIT * sizeof(RVALUE)) < (size_t)((char*)p - (char*)membase)) {
-	    objs--;
-	}
+       p = (RVALUE*)((VALUE)p + sizeof(RVALUE) - ((VALUE)p % sizeof(RVALUE)));
+       objs = (HEAP_SIZE - (size_t)((VALUE)p - (VALUE)membase))/sizeof(RVALUE);
     }
 
     lo = 0;
     hi = heaps_used;
     while (lo < hi) {
-	register RVALUE *mid_membase;
+	register struct heaps_header *mid_membase;
 	mid = (lo + hi) / 2;
-	mid_membase = objspace->heap.sorted[mid].slot->membase;
+        mid_membase = objspace->heap.sorted[mid];
 	if (mid_membase < membase) {
 	    lo = mid + 1;
 	}
@@ -1060,14 +1239,16 @@ assign_heap_slot(rb_objspace_t *objspace)
 	}
     }
     if (hi < heaps_used) {
-	MEMMOVE(&objspace->heap.sorted[hi+1], &objspace->heap.sorted[hi], struct sorted_heaps_slot, heaps_used - hi);
-    }
-    objspace->heap.sorted[hi].slot = slot;
-    objspace->heap.sorted[hi].start = p;
-    objspace->heap.sorted[hi].end = (p + objs);
+	MEMMOVE(&objspace->heap.sorted[hi+1], &objspace->heap.sorted[hi], struct heaps_header*, heaps_used - hi);
+    }
+    objspace->heap.sorted[hi] = membase;
+    membase->start = p;
+    membase->end = (p + objs);
+    membase->base = heaps;
+    membase->bits = heaps->bits;
+    membase->limit = objs;
     heaps->membase = membase;
-    heaps->slot = p;
-    heaps->limit = objs;
+    memset(heaps->bits, 0, HEAP_BITMAP_LIMIT * sizeof(uintptr_t));
     objspace->heap.free_num += objs;
     pend = p + objs;
     if (lomem == 0 || lomem > p) lomem = p;
@@ -1076,19 +1257,24 @@ assign_heap_slot(rb_objspace_t *objspace)
 
     while (p < pend) {
 	p->as.free.flags = 0;
-	p->as.free.next = freelist;
-	freelist = p;
+	p->as.free.next = heaps->freelist;
+	heaps->freelist = p;
 	p++;
     }
+    link_free_heap_slot(objspace, heaps);
 }
 
 static void
 add_heap_slots(rb_objspace_t *objspace, size_t add)
 {
     size_t i;
+    size_t next_heaps_length;
 
-    if ((heaps_used + add) > heaps_length) {
-        allocate_sorted_heaps(objspace, heaps_used + add);
+    next_heaps_length = heaps_used + add;
+
+    if (next_heaps_length > heaps_length) {
+        allocate_sorted_heaps(objspace, next_heaps_length);
+        heaps_length = next_heaps_length;
     }
 
     for (i = 0; i < add; i++) {
@@ -1138,6 +1324,7 @@ set_heaps_increment(rb_objspace_t *objspace)
 
     if (next_heaps_length > heaps_length) {
 	allocate_sorted_heaps(objspace, next_heaps_length);
+        heaps_length = next_heaps_length;
     }
 }
 
@@ -1160,6 +1347,7 @@ rb_during_gc(void)
 }
 
 #define RANY(o) ((RVALUE*)(o))
+#define has_free_object (objspace->heap.free_slots && objspace->heap.free_slots->freelist)
 
 VALUE
 rb_newobj(void)
@@ -1180,15 +1368,18 @@ rb_newobj(void)
 	}
     }
 
-    if (UNLIKELY(!freelist)) {
+    if (UNLIKELY(!has_free_object)) {
 	if (!gc_lazy_sweep(objspace)) {
 	    during_gc = 0;
 	    rb_memerror();
 	}
     }
 
-    obj = (VALUE)freelist;
-    freelist = freelist->as.free.next;
+    obj = (VALUE)objspace->heap.free_slots->freelist;
+    objspace->heap.free_slots->freelist = RANY(obj)->as.free.next;
+    if (objspace->heap.free_slots->freelist == NULL) {
+        unlink_free_heap_slot(objspace, objspace->heap.free_slots);
+    }
 
     MEMZERO((void*)obj, RVALUE, 1);
 #ifdef GC_DEBUG
@@ -1357,10 +1548,10 @@ gc_mark_all(rb_objspace_t *objspace)
 
     init_mark_stack(objspace);
     for (i = 0; i < heaps_used; i++) {
-	p = objspace->heap.sorted[i].start; pend = objspace->heap.sorted[i].end;
+	p = objspace->heap.sorted[i]->start; pend = objspace->heap.sorted[i]->end;
 	while (p < pend) {
-	    if ((p->as.basic.flags & FL_MARK) &&
-		(p->as.basic.flags != FL_MARK)) {
+	    if (MARKED_IN_BITMAP(GET_HEAP_BITMAP(p), p) &&
+		p->as.basic.flags) {
 		gc_mark_children(objspace, (VALUE)p, 0);
 	    }
 	    p++;
@@ -1388,26 +1579,27 @@ static inline int
 is_pointer_to_heap(rb_objspace_t *objspace, void *ptr)
 {
     register RVALUE *p = RANY(ptr);
-    register struct sorted_heaps_slot *heap;
+    register struct heaps_header *heap;
     register size_t hi, lo, mid;
 
     if (p < lomem || p > himem) return FALSE;
     if ((VALUE)p % sizeof(RVALUE) != 0) return FALSE;
+    heap = GET_HEAP_HEADER(p);
 
     /* check if p looks like a pointer using bsearch*/
     lo = 0;
     hi = heaps_used;
     while (lo < hi) {
 	mid = (lo + hi) / 2;
-	heap = &objspace->heap.sorted[mid];
-	if (heap->start <= p) {
-	    if (p < heap->end)
-		return TRUE;
-	    lo = mid + 1;
-	}
-	else {
-	    hi = mid;
-	}
+        if (heap > objspace->heap.sorted[mid]) {
+            lo = mid + 1;
+        }
+        else if (heap < objspace->heap.sorted[mid]) {
+            hi = mid;
+        }
+        else {
+            return (p >= heap->start && p < heap->end) ? TRUE : FALSE;
+        }
     }
     return FALSE;
 }
@@ -1450,10 +1642,10 @@ struct mark_tbl_arg {
 };
 
 static int
-mark_entry(ID key, VALUE value, st_data_t data)
+mark_entry(st_data_t key, st_data_t value, st_data_t data)
 {
     struct mark_tbl_arg *arg = (void*)data;
-    gc_mark(arg->objspace, value, arg->lev);
+    gc_mark(arg->objspace, (VALUE)value, arg->lev);
     return ST_CONTINUE;
 }
 
@@ -1464,14 +1656,14 @@ mark_tbl(rb_objspace_t *objspace, st_table *tbl, int lev)
     if (!tbl || tbl->num_entries == 0) return;
     arg.objspace = objspace;
     arg.lev = lev;
-    st_foreach(tbl, mark_entry, (st_data_t)&arg);
+    st_foreach_nocheck(tbl, mark_entry, (st_data_t)&arg);
 }
 
 static int
-mark_key(VALUE key, VALUE value, st_data_t data)
+mark_key(st_data_t key, st_data_t value, st_data_t data)
 {
     struct mark_tbl_arg *arg = (void*)data;
-    gc_mark(arg->objspace, key, arg->lev);
+    gc_mark(arg->objspace, (VALUE)key, arg->lev);
     return ST_CONTINUE;
 }
 
@@ -1482,7 +1674,7 @@ mark_set(rb_objspace_t *objspace, st_table *tbl, int lev)
     if (!tbl) return;
     arg.objspace = objspace;
     arg.lev = lev;
-    st_foreach(tbl, mark_key, (st_data_t)&arg);
+    st_foreach_nocheck(tbl, mark_key, (st_data_t)&arg);
 }
 
 void
@@ -1492,11 +1684,11 @@ rb_mark_set(st_table *tbl)
 }
 
 static int
-mark_keyvalue(VALUE key, VALUE value, st_data_t data)
+mark_keyvalue(st_data_t key, st_data_t value, st_data_t data)
 {
     struct mark_tbl_arg *arg = (void*)data;
-    gc_mark(arg->objspace, key, arg->lev);
-    gc_mark(arg->objspace, value, arg->lev);
+    gc_mark(arg->objspace, (VALUE)key, arg->lev);
+    gc_mark(arg->objspace, (VALUE)value, arg->lev);
     return ST_CONTINUE;
 }
 
@@ -1507,7 +1699,7 @@ mark_hash(rb_objspace_t *objspace, st_table *tbl, int lev)
     if (!tbl) return;
     arg.objspace = objspace;
     arg.lev = lev;
-    st_foreach(tbl, mark_keyvalue, (st_data_t)&arg);
+    st_foreach_nocheck(tbl, mark_keyvalue, (st_data_t)&arg);
 }
 
 void
@@ -1560,7 +1752,7 @@ mark_m_tbl(rb_objspace_t *objspace, st_table *tbl, int lev)
     if (!tbl) return;
     arg.objspace = objspace;
     arg.lev = lev;
-    st_foreach(tbl, mark_method_entry_i, (st_data_t)&arg);
+    st_foreach_nocheck(tbl, mark_method_entry_i, (st_data_t)&arg);
 }
 
 static int
@@ -1573,7 +1765,7 @@ free_method_entry_i(ID key, rb_method_entry_t *me, st_data_t data)
 void
 rb_free_m_table(st_table *tbl)
 {
-    st_foreach(tbl, free_method_entry_i, 0);
+    st_foreach_nocheck(tbl, free_method_entry_i, 0);
     st_free_table(tbl);
 }
 
@@ -1592,7 +1784,7 @@ mark_const_tbl(rb_objspace_t *objspace, st_table *tbl, int lev)
     if (!tbl) return;
     arg.objspace = objspace;
     arg.lev = lev;
-    st_foreach(tbl, mark_const_entry_i, (st_data_t)&arg);
+    st_foreach_nocheck(tbl, mark_const_entry_i, (st_data_t)&arg);
 }
 
 static int
@@ -1605,7 +1797,7 @@ free_const_entry_i(ID key, rb_const_entry_t *ce, st_data_t data)
 void
 rb_free_const_table(st_table *tbl)
 {
-    st_foreach(tbl, free_const_entry_i, 0);
+    st_foreach_nocheck(tbl, free_const_entry_i, 0);
     st_free_table(tbl);
 }
 
@@ -1627,12 +1819,14 @@ static void
 gc_mark(rb_objspace_t *objspace, VALUE ptr, int lev)
 {
     register RVALUE *obj;
+    register uintptr_t *bits;
 
     obj = RANY(ptr);
     if (rb_special_const_p(ptr)) return; /* special const not marked */
     if (obj->as.basic.flags == 0) return;       /* free cell */
-    if (obj->as.basic.flags & FL_MARK) return;  /* already marked */
-    obj->as.basic.flags |= FL_MARK;
+    bits = GET_HEAP_BITMAP(ptr);
+    if (MARKED_IN_BITMAP(bits, ptr)) return;  /* already marked */
+    MARK_IN_BITMAP(bits, ptr);
     objspace->heap.live_num++;
 
     if (lev > GC_LEVEL_MAX || (lev == 0 && stack_check(STACKFRAME_FOR_GC_MARK))) {
@@ -1660,6 +1854,7 @@ static void
 gc_mark_children(rb_objspace_t *objspace, VALUE ptr, int lev)
 {
     register RVALUE *obj = RANY(ptr);
+    register uintptr_t *bits;
 
     goto marking;		/* skip */
 
@@ -1667,8 +1862,9 @@ gc_mark_children(rb_objspace_t *objspace, VALUE ptr, int lev)
     obj = RANY(ptr);
     if (rb_special_const_p(ptr)) return; /* special const not marked */
     if (obj->as.basic.flags == 0) return;       /* free cell */
-    if (obj->as.basic.flags & FL_MARK) return;  /* already marked */
-    obj->as.basic.flags |= FL_MARK;
+    bits = GET_HEAP_BITMAP(ptr);
+    if (MARKED_IN_BITMAP(bits, ptr)) return;  /* already marked */
+    MARK_IN_BITMAP(bits, ptr);
     objspace->heap.live_num++;
 
   marking:
@@ -1930,13 +2126,18 @@ gc_mark_children(rb_objspace_t *objspace, VALUE ptr, int lev)
 
 static int obj_free(rb_objspace_t *, VALUE);
 
-static inline void
-add_freelist(rb_objspace_t *objspace, RVALUE *p)
+static inline struct heaps_slot *
+add_slot_local_freelist(rb_objspace_t *objspace, RVALUE *p)
 {
+    struct heaps_slot *slot;
+
     VALGRIND_MAKE_MEM_UNDEFINED((void*)p, sizeof(RVALUE));
     p->as.free.flags = 0;
-    p->as.free.next = freelist;
-    freelist = p;
+    slot = GET_HEAP_SLOT(p);
+    p->as.free.next = slot->freelist;
+    slot->freelist = p;
+
+    return slot;
 }
 
 static void
@@ -1946,17 +2147,13 @@ finalize_list(rb_objspace_t *objspace, RVALUE *p)
 	RVALUE *tmp = p->as.free.next;
 	run_final(objspace, (VALUE)p);
 	if (!FL_TEST(p, FL_SINGLETON)) { /* not freeing page */
-            if (objspace->heap.sweep_slots) {
-                p->as.free.flags = 0;
-            }
-            else {
+            add_slot_local_freelist(objspace, p);
+            if (!is_lazy_sweeping(objspace)) {
                 GC_PROF_DEC_LIVE_NUM;
-                add_freelist(objspace, p);
             }
 	}
 	else {
-	    struct heaps_slot *slot = (struct heaps_slot *)(VALUE)RDATA(p)->dmark;
-	    slot->limit--;
+            GET_HEAP_HEADER(p)->limit--;
 	}
 	p = tmp;
     }
@@ -1977,22 +2174,23 @@ unlink_heap_slot(rb_objspace_t *objspace, struct heaps_slot *slot)
     slot->next = NULL;
 }
 
-
 static void
 free_unused_heaps(rb_objspace_t *objspace)
 {
     size_t i, j;
-    RVALUE *last = 0;
+    struct heaps_header *last = 0;
 
     for (i = j = 1; j < heaps_used; i++) {
-	if (objspace->heap.sorted[i].slot->limit == 0) {
+	if (objspace->heap.sorted[i]->limit == 0) {
+            struct heaps_slot* h = objspace->heap.sorted[i]->base;
+            h->free_next = objspace->heap.reserve_slots;
+            objspace->heap.reserve_slots = h;
 	    if (!last) {
-		last = objspace->heap.sorted[i].slot->membase;
+                last = objspace->heap.sorted[i];
 	    }
 	    else {
-		free(objspace->heap.sorted[i].slot->membase);
+		aligned_free(objspace->heap.sorted[i]);
 	    }
-            free(objspace->heap.sorted[i].slot);
 	    heaps_used--;
 	}
 	else {
@@ -2004,70 +2202,84 @@ free_unused_heaps(rb_objspace_t *objspace)
     }
     if (last) {
 	if (last < heaps_freed) {
-	    free(heaps_freed);
+	    aligned_free(heaps_freed);
 	    heaps_freed = last;
 	}
 	else {
-	    free(last);
+	    aligned_free(last);
 	}
     }
 }
 
 static void
+gc_clear_slot_bits(struct heaps_slot *slot)
+{
+    memset(slot->bits, 0, HEAP_BITMAP_LIMIT * sizeof(uintptr_t));
+}
+
+static void
 slot_sweep(rb_objspace_t *objspace, struct heaps_slot *sweep_slot)
 {
     size_t free_num = 0, final_num = 0;
     RVALUE *p, *pend;
-    RVALUE *free = freelist, *final = deferred_final_list;
+    RVALUE *final = deferred_final_list;
     int deferred;
+    uintptr_t *bits;
 
-    p = sweep_slot->slot; pend = p + sweep_slot->limit;
+    p = sweep_slot->membase->start; pend = sweep_slot->membase->end;
+    bits = sweep_slot->bits;
     while (p < pend) {
-        if (!(p->as.basic.flags & FL_MARK)) {
-            if (p->as.basic.flags &&
-                ((deferred = obj_free(objspace, (VALUE)p)) ||
-		 (FL_TEST(p, FL_FINALIZE)))) {
-                if (!deferred) {
-                    p->as.free.flags = T_ZOMBIE;
-                    RDATA(p)->dfree = 0;
+        if ((!(MARKED_IN_BITMAP(bits, p))) && BUILTIN_TYPE(p) != T_ZOMBIE) {
+            if (p->as.basic.flags) {
+                if ((deferred = obj_free(objspace, (VALUE)p)) ||
+                    (FL_TEST(p, FL_FINALIZE))) {
+                    if (!deferred) {
+                        p->as.free.flags = T_ZOMBIE;
+                        RDATA(p)->dfree = 0;
+                    }
+                    p->as.free.next = deferred_final_list;
+                    deferred_final_list = p;
+                    assert(BUILTIN_TYPE(p) == T_ZOMBIE);
+                    final_num++;
+                }
+                else {
+                    VALGRIND_MAKE_MEM_UNDEFINED((void*)p, sizeof(RVALUE));
+                    p->as.free.flags = 0;
+                    p->as.free.next = sweep_slot->freelist;
+                    sweep_slot->freelist = p;
+                    free_num++;
                 }
-                p->as.free.flags |= FL_MARK;
-                p->as.free.next = deferred_final_list;
-                deferred_final_list = p;
-                final_num++;
             }
             else {
-                add_freelist(objspace, p);
                 free_num++;
             }
         }
-        else if (BUILTIN_TYPE(p) == T_ZOMBIE) {
-            /* objects to be finalized */
-            /* do nothing remain marked */
-        }
-        else {
-            RBASIC(p)->flags &= ~FL_MARK;
-        }
         p++;
     }
-    if (final_num + free_num == sweep_slot->limit &&
+    gc_clear_slot_bits(sweep_slot);
+    if (final_num + free_num == sweep_slot->membase->limit &&
         objspace->heap.free_num > objspace->heap.do_heap_free) {
         RVALUE *pp;
 
         for (pp = deferred_final_list; pp != final; pp = pp->as.free.next) {
-	    RDATA(pp)->dmark = (void (*)(void *))(VALUE)sweep_slot;
+	    RDATA(pp)->dmark = 0;
             pp->as.free.flags |= FL_SINGLETON; /* freeing page mark */
         }
-        sweep_slot->limit = final_num;
-        freelist = free;	/* cancel this page from freelist */
+        sweep_slot->membase->limit = final_num;
         unlink_heap_slot(objspace, sweep_slot);
     }
     else {
+        if (free_num > 0) {
+            link_free_heap_slot(objspace, sweep_slot);
+        }
+        else {
+            sweep_slot->free_next = NULL;
+        }
         objspace->heap.free_num += free_num;
     }
     objspace->heap.final_num += final_num;
 
-    if (deferred_final_list) {
+    if (deferred_final_list && !finalizing) {
         rb_thread_t *th = GET_THREAD();
         if (th) {
             RUBY_VM_SET_FINALIZER_INTERRUPT(th);
@@ -2079,7 +2291,7 @@ static int
 ready_to_gc(rb_objspace_t *objspace)
 {
     if (dont_gc || during_gc) {
-	if (!freelist) {
+	if (!has_free_object) {
             if (!heaps_increment(objspace)) {
                 set_heaps_increment(objspace);
                 heaps_increment(objspace);
@@ -2093,7 +2305,6 @@ ready_to_gc(rb_objspace_t *objspace)
 static void
 before_gc_sweep(rb_objspace_t *objspace)
 {
-    freelist = 0;
     objspace->heap.do_heap_free = (size_t)((heaps_used * HEAP_OBJ_LIMIT) * 0.65);
     objspace->heap.free_min = (size_t)((heaps_used * HEAP_OBJ_LIMIT)  * 0.2);
     if (objspace->heap.free_min < initial_free_min) {
@@ -2102,6 +2313,7 @@ before_gc_sweep(rb_objspace_t *objspace)
     }
     objspace->heap.sweep_slots = heaps;
     objspace->heap.free_num = 0;
+    objspace->heap.free_slots = NULL;
 
     /* sweep unlinked method entries */
     if (GET_VM()->unlinked_method_entry_list) {
@@ -2138,7 +2350,7 @@ lazy_sweep(rb_objspace_t *objspace)
         next = objspace->heap.sweep_slots->next;
 	slot_sweep(objspace, objspace->heap.sweep_slots);
         objspace->heap.sweep_slots = next;
-        if (freelist) {
+        if (has_free_object) {
             during_gc = 0;
             return TRUE;
         }
@@ -2150,10 +2362,10 @@ static void
 rest_sweep(rb_objspace_t *objspace)
 {
     if (objspace->heap.sweep_slots) {
-       while (objspace->heap.sweep_slots) {
-           lazy_sweep(objspace);
-       }
-       after_gc_sweep(objspace);
+	while (objspace->heap.sweep_slots) {
+	    lazy_sweep(objspace);
+	}
+	after_gc_sweep(objspace);
     }
 }
 
@@ -2200,9 +2412,9 @@ gc_lazy_sweep(rb_objspace_t *objspace)
     }
 
     GC_PROF_SWEEP_TIMER_START;
-    if(!(res = lazy_sweep(objspace))) {
+    if (!(res = lazy_sweep(objspace))) {
         after_gc_sweep(objspace);
-        if(freelist) {
+        if (has_free_object) {
             res = TRUE;
             during_gc = 0;
         }
@@ -2235,12 +2447,17 @@ void
 rb_gc_force_recycle(VALUE p)
 {
     rb_objspace_t *objspace = &rb_objspace;
-    GC_PROF_DEC_LIVE_NUM;
-    if (RBASIC(p)->flags & FL_MARK) {
-        RANY(p)->as.free.flags = 0;
+    struct heaps_slot *slot;
+
+    if (MARKED_IN_BITMAP(GET_HEAP_BITMAP(p), p)) {
+        add_slot_local_freelist(objspace, (RVALUE *)p);
     }
     else {
-        add_freelist(objspace, (RVALUE *)p);
+        GC_PROF_DEC_LIVE_NUM;
+        slot = add_slot_local_freelist(objspace, (RVALUE *)p);
+        if (slot->free_next == NULL) {
+            link_free_heap_slot(objspace, slot);
+        }
     }
 }
 
@@ -2433,19 +2650,12 @@ static void
 gc_clear_mark_on_sweep_slots(rb_objspace_t *objspace)
 {
     struct heaps_slot *scan;
-    RVALUE *p, *pend;
 
     if (objspace->heap.sweep_slots) {
         while (heaps_increment(objspace));
         while (objspace->heap.sweep_slots) {
             scan = objspace->heap.sweep_slots;
-            p = scan->slot; pend = p + scan->limit;
-            while (p < pend) {
-                if (p->as.free.flags & FL_MARK && BUILTIN_TYPE(p) != T_ZOMBIE) {
-                    p->as.basic.flags &= ~FL_MARK;
-                }
-                p++;
-            }
+            gc_clear_slot_bits(scan);
             objspace->heap.sweep_slots = objspace->heap.sweep_slots->next;
         }
     }
@@ -2634,7 +2844,7 @@ static VALUE
 objspace_each_objects(VALUE arg)
 {
     size_t i;
-    RVALUE *membase = 0;
+    struct heaps_header *membase = 0;
     RVALUE *pstart, *pend;
     rb_objspace_t *objspace = &rb_objspace;
     struct each_obj_args *args = (struct each_obj_args *)arg;
@@ -2642,16 +2852,16 @@ objspace_each_objects(VALUE arg)
 
     i = 0;
     while (i < heaps_used) {
-	while (0 < i && (uintptr_t)membase < (uintptr_t)objspace->heap.sorted[i-1].slot->membase)
+	while (0 < i && membase < objspace->heap.sorted[i-1])
 	    i--;
-	while (i < heaps_used && (uintptr_t)objspace->heap.sorted[i].slot->membase <= (uintptr_t)membase)
+	while (i < heaps_used && objspace->heap.sorted[i] <= membase)
 	    i++;
 	if (heaps_used <= i)
 	  break;
-	membase = objspace->heap.sorted[i].slot->membase;
+	membase = objspace->heap.sorted[i];
 
-	pstart = objspace->heap.sorted[i].slot->slot;
-	pend = pstart + objspace->heap.sorted[i].slot->limit;
+	pstart = membase->start;
+	pend = membase->end;
 
 	for (; pstart != pend; pstart++) {
 	    if (pstart->as.basic.flags) {
@@ -2665,6 +2875,7 @@ objspace_each_objects(VALUE arg)
 	    }
 	}
     }
+    RB_GC_GUARD(v);
 
     return Qnil;
 }
@@ -2908,11 +3119,12 @@ run_single_final(VALUE arg)
 }
 
 static void
-run_finalizer(rb_objspace_t *objspace, VALUE objid, VALUE table)
+run_finalizer(rb_objspace_t *objspace, VALUE obj, VALUE table)
 {
     long i;
     int status;
     VALUE args[3];
+    VALUE objid = nonspecial_obj_id(obj);
 
     if (RARRAY_LEN(table) > 0) {
 	args[1] = rb_obj_freeze(rb_ary_new3(1, objid));
@@ -2936,13 +3148,11 @@ run_finalizer(rb_objspace_t *objspace, VALUE objid, VALUE table)
 static void
 run_final(rb_objspace_t *objspace, VALUE obj)
 {
-    VALUE objid;
     RUBY_DATA_FUNC free_func = 0;
     st_data_t key, table;
 
     objspace->heap.final_num--;
 
-    objid = rb_obj_id(obj);	/* make obj into id */
     RBASIC(obj)->klass = 0;
 
     if (RTYPEDDATA_P(obj)) {
@@ -2957,7 +3167,7 @@ run_final(rb_objspace_t *objspace, VALUE obj)
 
     key = (st_data_t)obj;
     if (st_delete(finalizer_table, &key, &table)) {
-	run_finalizer(objspace, objid, (VALUE)table);
+	run_finalizer(objspace, obj, (VALUE)table);
     }
 }
 
@@ -2975,16 +3185,20 @@ finalize_deferred(rb_objspace_t *objspace)
 void
 rb_gc_finalize_deferred(void)
 {
-    finalize_deferred(&rb_objspace);
+    rb_objspace_t *objspace = &rb_objspace;
+    if (ATOMIC_EXCHANGE(finalizing, 1)) return;
+    finalize_deferred(objspace);
+    ATOMIC_SET(finalizing, 0);
 }
 
 static int
 chain_finalized_object(st_data_t key, st_data_t val, st_data_t arg)
 {
     RVALUE *p = (RVALUE *)key, **final_list = (RVALUE **)arg;
-    if ((p->as.basic.flags & (FL_FINALIZE|FL_MARK)) == FL_FINALIZE) {
+    if ((p->as.basic.flags & FL_FINALIZE) == FL_FINALIZE &&
+        !MARKED_IN_BITMAP(GET_HEAP_BITMAP(p), p)) {
 	if (BUILTIN_TYPE(p) != T_ZOMBIE) {
-	    p->as.free.flags = FL_MARK | T_ZOMBIE; /* remain marked */
+	    p->as.free.flags = T_ZOMBIE;
 	    RDATA(p)->dfree = 0;
 	}
 	p->as.free.next = *final_list;
@@ -3027,22 +3241,25 @@ rb_objspace_call_finalizer(rb_objspace_t *objspace)
     /* run finalizers */
     gc_clear_mark_on_sweep_slots(objspace);
 
+    if (ATOMIC_EXCHANGE(finalizing, 1)) return;
+
     do {
 	/* XXX: this loop will make no sense */
 	/* because mark will not be removed */
 	finalize_deferred(objspace);
 	mark_tbl(objspace, finalizer_table, 0);
-	st_foreach(finalizer_table, chain_finalized_object,
+	st_foreach_nocheck(finalizer_table, chain_finalized_object,
 		   (st_data_t)&deferred_final_list);
     } while (deferred_final_list);
     /* force to run finalizer */
     while (finalizer_table->num_entries) {
 	struct force_finalize_list *list = 0;
-	st_foreach(finalizer_table, force_chain_object, (st_data_t)&list);
+	st_foreach_nocheck(finalizer_table, force_chain_object, (st_data_t)&list);
 	while (list) {
 	    struct force_finalize_list *curr = list;
-	    run_finalizer(objspace, rb_obj_id(curr->obj), curr->table);
-	    st_delete(finalizer_table, (st_data_t*)&curr->obj, 0);
+	    st_data_t obj = (st_data_t)curr->obj;
+	    run_finalizer(objspace, curr->obj, curr->table);
+	    st_delete(finalizer_table, &obj, 0);
 	    list = curr->next;
 	    xfree(curr);
 	}
@@ -3053,7 +3270,7 @@ rb_objspace_call_finalizer(rb_objspace_t *objspace)
 
     /* run data object's finalizers */
     for (i = 0; i < heaps_used; i++) {
-	p = objspace->heap.sorted[i].start; pend = objspace->heap.sorted[i].end;
+	p = objspace->heap.sorted[i]->start; pend = objspace->heap.sorted[i]->end;
 	while (p < pend) {
 	    if (BUILTIN_TYPE(p) == T_DATA &&
 		DATA_PTR(p) && RANY(p)->as.data.dfree &&
@@ -3089,6 +3306,7 @@ rb_objspace_call_finalizer(rb_objspace_t *objspace)
 
     st_free_table(finalizer_table);
     finalizer_table = 0;
+    ATOMIC_SET(finalizing, 0);
 }
 
 void
@@ -3096,10 +3314,42 @@ rb_gc(void)
 {
     rb_objspace_t *objspace = &rb_objspace;
     garbage_collect(objspace);
-    finalize_deferred(objspace);
+    if (!finalizing) finalize_deferred(objspace);
     free_unused_heaps(objspace);
 }
 
+static inline int
+is_id_value(rb_objspace_t *objspace, VALUE ptr)
+{
+    if (!is_pointer_to_heap(objspace, (void *)ptr)) return FALSE;
+    if (BUILTIN_TYPE(ptr) > T_FIXNUM) return FALSE;
+    if (BUILTIN_TYPE(ptr) == T_ICLASS) return FALSE;
+    return TRUE;
+}
+
+static inline int
+is_dead_object(rb_objspace_t *objspace, VALUE ptr)
+{
+    struct heaps_slot *slot = objspace->heap.sweep_slots;
+    if (!is_lazy_sweeping(objspace) || MARKED_IN_BITMAP(GET_HEAP_BITMAP(ptr), ptr))
+	return FALSE;
+    while (slot) {
+	if ((VALUE)slot->membase->start <= ptr && ptr < (VALUE)(slot->membase->end))
+	    return TRUE;
+	slot = slot->next;
+    }
+    return FALSE;
+}
+
+static inline int
+is_live_object(rb_objspace_t *objspace, VALUE ptr)
+{
+    if (BUILTIN_TYPE(ptr) == 0) return FALSE;
+    if (RBASIC(ptr)->klass == 0) return FALSE;
+    if (is_dead_object(objspace, ptr)) return FALSE;
+    return TRUE;
+}
+
 /*
  *  call-seq:
  *     ObjectSpace._id2ref(object_id) -> an_object
@@ -3142,11 +3392,10 @@ id2ref(VALUE obj, VALUE objid)
 	return ID2SYM(symid);
     }
 
-    if (!is_pointer_to_heap(objspace, (void *)ptr) ||
-	BUILTIN_TYPE(ptr) > T_FIXNUM || BUILTIN_TYPE(ptr) == T_ICLASS) {
+    if (!is_id_value(objspace, ptr)) {
 	rb_raise(rb_eRangeError, "%p is not id value", p0);
     }
-    if (BUILTIN_TYPE(ptr) == 0 || RBASIC(ptr)->klass == 0) {
+    if (!is_live_object(objspace, ptr)) {
 	rb_raise(rb_eRangeError, "%p is recycled object", p0);
     }
     return (VALUE)ptr;
@@ -3216,7 +3465,7 @@ rb_obj_id(VALUE obj)
     if (SPECIAL_CONST_P(obj)) {
         return LONG2NUM((SIGNED_VALUE)obj);
     }
-    return (VALUE)((SIGNED_VALUE)obj|FIXNUM_FLAG);
+    return nonspecial_obj_id(obj);
 }
 
 static int
@@ -3259,7 +3508,7 @@ count_objects(int argc, VALUE *argv, VALUE os)
     VALUE hash;
 
     if (rb_scan_args(argc, argv, "01", &hash) == 1) {
-        if (TYPE(hash) != T_HASH)
+        if (!RB_TYPE_P(hash, T_HASH))
             rb_raise(rb_eTypeError, "non-hash given");
     }
 
@@ -3270,7 +3519,7 @@ count_objects(int argc, VALUE *argv, VALUE os)
     for (i = 0; i < heaps_used; i++) {
         RVALUE *p, *pend;
 
-        p = objspace->heap.sorted[i].start; pend = objspace->heap.sorted[i].end;
+        p = objspace->heap.sorted[i]->start; pend = objspace->heap.sorted[i]->end;
         for (;p < pend; p++) {
             if (p->as.basic.flags) {
                 counts[BUILTIN_TYPE(p)]++;
@@ -3279,14 +3528,14 @@ count_objects(int argc, VALUE *argv, VALUE os)
                 freed++;
             }
         }
-        total += objspace->heap.sorted[i].slot->limit;
+        total += objspace->heap.sorted[i]->limit;
     }
 
     if (hash == Qnil) {
         hash = rb_hash_new();
     }
     else if (!RHASH_EMPTY_P(hash)) {
-        st_foreach(RHASH_TBL(hash), set_zero, hash);
+        st_foreach_nocheck(RHASH_TBL(hash), set_zero, hash);
     }
     rb_hash_aset(hash, ID2SYM(rb_intern("TOTAL")), SIZET2NUM(total));
     rb_hash_aset(hash, ID2SYM(rb_intern("FREE")), SIZET2NUM(freed));
@@ -3378,7 +3627,7 @@ gc_stat(int argc, VALUE *argv, VALUE self)
     VALUE hash;
 
     if (rb_scan_args(argc, argv, "01", &hash) == 1) {
-        if (TYPE(hash) != T_HASH)
+        if (!RB_TYPE_P(hash, T_HASH))
             rb_raise(rb_eTypeError, "non-hash given");
     }
 
@@ -3433,6 +3682,33 @@ gc_malloc_allocations(VALUE self)
 }
 #endif
 
+/*
+ *  call-seq:
+ *     GC::Profiler.raw_data -> [Hash, ...]
+ *
+ *  Returns an Array of individual raw profile data Hashes ordered
+ *  from earliest to latest by <tt>:GC_INVOKE_TIME</tt>.  For example:
+ *
+ *    [{:GC_TIME=>1.3000000000000858e-05,
+ *      :GC_INVOKE_TIME=>0.010634999999999999,
+ *      :HEAP_USE_SIZE=>289640,
+ *      :HEAP_TOTAL_SIZE=>588960,
+ *      :HEAP_TOTAL_OBJECTS=>14724,
+ *      :GC_IS_MARKED=>false},
+ *      ...
+ *    ]
+ *
+ *  The keys mean:
+ *
+ *  +:GC_TIME+:: Time taken for this run in milliseconds
+ *  +:GC_INVOKE_TIME+:: Time the GC was invoked since startup in seconds
+ *  +:HEAP_USE_SIZE+:: Bytes of heap used
+ *  +:HEAP_TOTAL_SIZE+:: Size of heap in bytes
+ *  +:HEAP_TOTAL_OBJECTS+:: Number of objects
+ *  +:GC_IS_MARKED+:: Is the GC in the mark phase
+ *
+ */
+
 static VALUE
 gc_profile_record_get(void)
 {
@@ -3625,6 +3901,7 @@ Init_GC(void)
     rb_mProfiler = rb_define_module_under(rb_mGC, "Profiler");
     rb_define_singleton_method(rb_mProfiler, "enabled?", gc_profile_enable_get, 0);
     rb_define_singleton_method(rb_mProfiler, "enable", gc_profile_enable, 0);
+    rb_define_singleton_method(rb_mProfiler, "raw_data", gc_profile_record_get, 0);
     rb_define_singleton_method(rb_mProfiler, "disable", gc_profile_disable, 0);
     rb_define_singleton_method(rb_mProfiler, "clear", gc_profile_clear, 0);
     rb_define_singleton_method(rb_mProfiler, "result", gc_profile_result, 0);
diff --git a/include/ruby/ruby.h b/include/ruby/ruby.h
index fc17f76..f63358a 100644
--- a/include/ruby/ruby.h
+++ b/include/ruby/ruby.h
@@ -919,8 +919,8 @@ struct RBignum {
 #define RCOMPLEX(obj) (R_CAST(RComplex)(obj))
 
 #define FL_SINGLETON FL_USER0
-#define FL_MARK      (((VALUE)1)<<5)
-#define FL_RESERVED  (((VALUE)1)<<6) /* will be used in the future GC */
+#define FL_RESERVED1 (((VALUE)1)<<5)
+#define FL_RESERVED2 (((VALUE)1)<<6) /* will be used in the future GC */
 #define FL_FINALIZE  (((VALUE)1)<<7)
 #define FL_TAINT     (((VALUE)1)<<8)
 #define FL_UNTRUSTED (((VALUE)1)<<9)
diff --git a/include/ruby/st.h b/include/ruby/st.h
index 50f2a75..d536c1d 100644
--- a/include/ruby/st.h
+++ b/include/ruby/st.h
@@ -74,6 +74,11 @@ struct st_hash_type {
 
 #define ST_INDEX_BITS (sizeof(st_index_t) * CHAR_BIT)
 
+typedef struct st_packed_entry {
+    st_index_t hash;
+    st_data_t key, val;
+} st_packed_entry;
+
 struct st_table {
     const struct st_hash_type *type;
     st_index_t num_bins;
@@ -91,8 +96,14 @@ struct st_table {
     __extension__
 #endif
     st_index_t num_entries : ST_INDEX_BITS - 1;
-    struct st_table_entry **bins;
-    struct st_table_entry *head, *tail;
+    union {
+	struct {
+	    struct st_table_entry **bins;
+	    struct st_table_entry *head, *tail;
+	} big;
+	struct st_packed_bins *packed;
+	struct st_packed_entry upacked;
+    } as;
 };
 
 #define st_is_member(table,key) st_lookup((table),(key),(st_data_t *)0)
@@ -114,6 +125,7 @@ int st_insert2(st_table *, st_data_t, st_data_t, st_data_t (*)(st_data_t));
 int st_lookup(st_table *, st_data_t, st_data_t *);
 int st_get_key(st_table *, st_data_t, st_data_t *);
 int st_foreach(st_table *, int (*)(ANYARGS), st_data_t);
+int st_foreach_nocheck(st_table *, int (*)(ANYARGS), st_data_t);
 int st_reverse_foreach(st_table *, int (*)(ANYARGS), st_data_t);
 void st_add_direct(st_table *, st_data_t, st_data_t);
 void st_free_table(st_table *);
diff --git a/internal.h b/internal.h
index 681e010..d879fb1 100644
--- a/internal.h
+++ b/internal.h
@@ -96,6 +96,7 @@ void Init_File(void);
 
 /* gc.c */
 void Init_heap(void);
+void *ruby_mimmalloc(size_t size);
 
 /* inits.c */
 void rb_call_inits(void);
@@ -112,6 +113,8 @@ VALUE rb_iseq_clone(VALUE iseqval, VALUE newcbase);
 
 /* load.c */
 VALUE rb_get_load_path(void);
+void rb_reset_expanded_cache();
+void rb_load_path_ary_push(VALUE path);
 
 /* math.c */
 VALUE rb_math_atan2(VALUE, VALUE);
diff --git a/load.c b/load.c
index 0ff4b60..b6a46fe 100644
--- a/load.c
+++ b/load.c
@@ -4,6 +4,7 @@
 
 #include "ruby/ruby.h"
 #include "ruby/util.h"
+#include "ruby/encoding.h"
 #include "internal.h"
 #include "dln.h"
 #include "eval_intern.h"
@@ -18,6 +19,7 @@ VALUE ruby_dln_librefs;
 #define IS_DLEXT(e) (strcmp((e), DLEXT) == 0)
 #endif
 
+static int sorted_loaded_features = 1;
 
 static const char *const loadable_ext[] = {
     ".rb", DLEXT,
@@ -27,28 +29,44 @@ static const char *const loadable_ext[] = {
     0
 };
 
-VALUE
-rb_get_load_path(void)
-{
-    VALUE load_path = GET_VM()->load_path;
-    return load_path;
-}
+static VALUE rb_checked_expanded_cache(int*);
+static void rb_set_expanded_cache(VALUE, int);
+static VALUE rb_expand_load_paths(long, VALUE*, int*);
+static int cached_expanded_load_path = 1;
 
 VALUE
 rb_get_expanded_load_path(void)
 {
-    VALUE load_path = rb_get_load_path();
-    VALUE ary;
-    long i;
+    VALUE expanded = rb_checked_expanded_cache(NULL);
 
-    ary = rb_ary_new2(RARRAY_LEN(load_path));
-    for (i = 0; i < RARRAY_LEN(load_path); ++i) {
-	VALUE path = rb_file_expand_path(RARRAY_PTR(load_path)[i], Qnil);
-	rb_str_freeze(path);
-	rb_ary_push(ary, path);
+    if ( !RTEST(expanded) ) {
+	VALUE load_path = GET_VM()->load_path;
+	int has_relative = 0;
+
+	if (!load_path) return 0;
+
+	expanded = rb_expand_load_paths(
+			RARRAY_LEN(load_path), RARRAY_PTR(load_path),
+			&has_relative);
+	RB_GC_GUARD(load_path);
+
+	if (cached_expanded_load_path) {
+	    rb_set_expanded_cache(expanded, has_relative);
+	}
+    } else {
+	expanded = rb_ary_dup(expanded);
     }
-    rb_obj_freeze(ary);
-    return ary;
+    return expanded;
+}
+
+VALUE
+rb_get_load_path(void)
+{
+    VALUE load_path =
+	cached_expanded_load_path ?
+	    rb_get_expanded_load_path():
+	    GET_VM()->load_path;
+    return load_path;
 }
 
 static VALUE
@@ -129,6 +147,9 @@ loaded_feature_path_i(st_data_t v, st_data_t b, st_data_t f)
     return ST_STOP;
 }
 
+static long rb_feature_first_equal_or_greater(VALUE, const char *, long);
+static int  rb_stop_search_feature(VALUE, const char *, long);
+
 static int
 rb_feature_p(const char *feature, const char *ext, int rb, int expanded, const char **fn)
 {
@@ -151,8 +172,10 @@ rb_feature_p(const char *feature, const char *ext, int rb, int expanded, const c
 	type = 0;
     }
     features = get_loaded_features();
-    for (i = 0; i < RARRAY_LEN(features); ++i) {
+    i = rb_feature_first_equal_or_greater(features, feature, len);
+    for (; i < RARRAY_LEN(features); ++i) {
 	v = RARRAY_PTR(features)[i];
+	if (rb_stop_search_feature(v, feature, len)) break;
 	f = StringValuePtr(v);
 	if ((n = RSTRING_LEN(v)) < len) continue;
 	if (strncmp(f, feature, len) != 0) {
@@ -176,16 +199,16 @@ rb_feature_p(const char *feature, const char *ext, int rb, int expanded, const c
 	}
     }
     loading_tbl = get_loading_table();
-    if (loading_tbl) {
+    if (loading_tbl && loading_tbl->num_entries > 0) {
 	f = 0;
 	if (!expanded) {
 	    struct loaded_feature_searching fs;
 	    fs.name = feature;
 	    fs.len = len;
 	    fs.type = type;
-	    fs.load_path = load_path ? load_path : rb_get_load_path();
+	    fs.load_path = load_path ? load_path : rb_get_expanded_load_path();
 	    fs.result = 0;
-	    st_foreach(loading_tbl, loaded_feature_path_i, (st_data_t)&fs);
+	    st_foreach_nocheck(loading_tbl, loaded_feature_path_i, (st_data_t)&fs);
 	    if ((f = fs.result) != 0) {
 		if (fn) *fn = f;
 		goto loading;
@@ -251,6 +274,170 @@ rb_feature_provided(const char *feature, const char **loading)
     return FALSE;
 }
 
+static long
+feature_basename_length(const char *feature, long flen)
+{
+    if (sorted_loaded_features) {
+	const char *ext = strrchr(feature, '.');
+	return ext && !strchr(ext, '/') ? ext - feature : flen;
+    } else {
+	return 0;
+    }
+}
+
+static int
+compare_feature_name(const char *left, long llen, const char *right, long rlen)
+{
+    int diff = 0;
+    while (llen-- && rlen--) {
+	diff = left[llen] - right[rlen];
+	if (diff) break;
+	if (left[llen] == '/') break;
+    }
+    return diff;
+}
+
+static int
+rb_compare_feature_name(VALUE loaded, const char *feature, long flen)
+{
+    const char *loaded_name = StringValuePtr(loaded);
+    long loaded_len = feature_basename_length(loaded_name, RSTRING_LEN(loaded));
+    return compare_feature_name(loaded_name, loaded_len, feature, flen);
+}
+
+/* used to find when equal features run out */
+static int
+rb_stop_search_feature(VALUE loaded, const char *feature, long flen)
+{
+    if (sorted_loaded_features)
+	return rb_compare_feature_name(loaded, feature, flen) > 0;
+    else
+	return FALSE;
+}
+
+/* returns first position to search feature from */
+static long
+rb_feature_first_equal_or_greater(VALUE features, const char *feature, long flen)
+{
+    if (sorted_loaded_features) {
+	long before = 0, first = RARRAY_LEN(features);
+	VALUE *values = RARRAY_PTR(features);
+	if (first == 0)
+	    return 0;
+	if (rb_compare_feature_name(values[0], feature, flen) >= 0)
+	    return 0;
+
+	while (first - before > 1) {
+	    long mid = (first + before) / 2;
+	    long cmp = rb_compare_feature_name(values[mid], feature, flen);
+	    if (cmp >= 0)
+		first = mid;
+	    else
+		before = mid;
+	}
+	return first;
+    } else {
+	return 0;
+    }
+}
+
+/* returns position to insert new feature in */
+static long
+rb_feature_first_greater(VALUE features, const char *feature, long flen)
+{
+    if (sorted_loaded_features) {
+	long before = 0, first = RARRAY_LEN(features);
+	VALUE *values = RARRAY_PTR(features);
+	if (first == 0)
+	    return 0;
+	if (rb_compare_feature_name(values[0], feature, flen) > 0)
+	    return 0;
+	if (rb_compare_feature_name(values[first-1], feature, flen) <= 0)
+	    return first;
+
+	while (first - before > 1) {
+	    long mid = (first + before) / 2;
+	    long cmp = rb_compare_feature_name(values[mid], feature, flen);
+	    if (cmp > 0)
+		first = mid;
+	    else
+		before = mid;
+	}
+	return first;
+    } else {
+	return RARRAY_LEN(features);
+    }
+}
+
+
+static VALUE
+rb_push_feature_1(VALUE features, VALUE feature)
+{
+    const char *fname = StringValuePtr(feature);
+    long flen = feature_basename_length(fname, RSTRING_LEN(feature));
+    long i = rb_feature_first_greater(features, fname, flen);
+    rb_ary_push(features, feature);
+    if ( i < RARRAY_LEN(features) - 1 ) {
+	MEMMOVE(RARRAY_PTR(features) + i + 1, RARRAY_PTR(features) + i,
+		VALUE, RARRAY_LEN(features) - i - 1);
+	RARRAY_PTR(features)[i] = feature;
+    }
+    return features;
+}
+
+static VALUE
+rb_push_feature_m(long argc, VALUE *argv, VALUE features)
+{
+    while (argc--) {
+	rb_push_feature_1(features, *argv++);
+    }
+    return features;
+}
+
+static VALUE
+rb_concat_features(VALUE features, VALUE add)
+{
+    add = rb_convert_type(add, T_ARRAY, "Array", "to_ary");
+    if (RARRAY_LEN(add)) {
+	rb_push_feature_m(RARRAY_LEN(add), RARRAY_PTR(add), features);
+    }
+    return features;
+}
+static const char *load_features_undefined_methods[] = {
+    "[]=", "reverse!", "rotate!", "sort!", "sort_by!",
+    "collect!", "map!", "shuffle!", "fill", "insert",
+    NULL
+};
+
+static VALUE
+rb_loaded_features_init(void)
+{
+    char *sorted_flag;
+    const char **name;
+    VALUE loaded_features = rb_ary_new();
+    VALUE loaded_features_c = rb_singleton_class(loaded_features);
+
+    sorted_flag = getenv("RUBY_LOADED_FEATURES_SORTED");
+    if (sorted_flag != NULL) {
+	int sorted_set = atoi(sorted_flag);
+	if (RTEST(ruby_verbose))
+	    fprintf(stderr, "sorted_loaded_features=%d (%d)\n", sorted_set, sorted_loaded_features);
+	sorted_loaded_features = sorted_set;
+    }
+
+    for(name = load_features_undefined_methods; *name; name++) {
+	rb_undef_method(loaded_features_c, *name);
+    }
+
+    if (sorted_loaded_features) {
+	rb_define_method(loaded_features_c, "<<", rb_push_feature_1, 1);
+	rb_define_method(loaded_features_c, "push", rb_push_feature_m, -1);
+	rb_define_method(loaded_features_c, "concat", rb_concat_features, 1);
+	rb_define_method(loaded_features_c, "unshift", rb_push_feature_m, -1);
+    }
+    return loaded_features;
+}
+
 static void
 rb_provide_feature(VALUE feature)
 {
@@ -258,7 +445,10 @@ rb_provide_feature(VALUE feature)
 	rb_raise(rb_eRuntimeError,
 		 "$LOADED_FEATURES is frozen; cannot append feature");
     }
-    rb_ary_push(get_loaded_features(), feature);
+    if (sorted_loaded_features)
+	rb_push_feature_1(get_loaded_features(), feature);
+    else
+	rb_ary_push(get_loaded_features(), feature);
 }
 
 void
@@ -760,6 +950,226 @@ rb_f_autoload_p(VALUE obj, VALUE sym)
     return rb_mod_autoload_p(klass, sym);
 }
 
+/* $LOAD_PATH methods which invalidates cache */
+static const char *load_path_reset_cache_methods[] = {
+    "[]=", "collect!", "compact!", "delete",
+    "delete_if", "fill", "flatten!", "insert", "keep_if",
+    "map!", "reject!", "replace", "select!", "shuffle!",
+    "sort!", "sort_by!", "uniq!", NULL
+};
+
+/* $LOAD_PATH methods which sends also to cache */
+static const char *load_path_apply_to_cache_methods[] = {
+    "clear", "delete_at", "pop", "reverse!", "rotate!",
+    "shift", "slice!", NULL
+};
+
+/* $LOAD_PATH methods which sends to cache whith expanded arguments */
+static const char *load_path_apply_expanded_methods[] = {
+    "<<", "push", "unshift", NULL
+};
+
+void
+rb_reset_expanded_cache()
+{
+    GET_VM()->load_path_expanded_cache = 0;
+}
+
+static VALUE
+rb_load_path_expanded_cache()
+{
+    VALUE cache = GET_VM()->load_path_expanded_cache;
+    VALUE expanded = Qnil;
+    if (RTEST(cache)) {
+	expanded = RARRAY_PTR(cache)[2];
+    }
+    return expanded;
+}
+
+/* Return cache only if we still in the same working directory
+ * and filesystem_encoding didn't change
+ * Invalidate cache otherwise
+ */
+static VALUE
+rb_checked_expanded_cache(int *has_relative)
+{
+    VALUE cache = GET_VM()->load_path_expanded_cache;
+    VALUE expanded = Qnil;
+    if (RTEST(cache)) {
+	VALUE curwd = RARRAY_PTR(cache)[0];
+	VALUE encindex = RARRAY_PTR(cache)[1];
+	int cache_valid = rb_filesystem_encindex() == FIX2INT(encindex);
+
+	if ( cache_valid ) {
+	    cache_valid = curwd == Qtrue;
+	    if (has_relative) {
+		*has_relative = cache_valid;
+	    }
+	    if (!cache_valid ) {
+		char *cwd = my_getcwd();
+		cache_valid = !strcmp(RSTRING_PTR(curwd), cwd);
+		xfree(cwd);
+	    }
+	}
+
+	if ( !cache_valid ) {
+	    rb_reset_expanded_cache();
+	} else {
+	    expanded = RARRAY_PTR(cache)[2];
+	}
+    }
+    RB_GC_GUARD(cache);
+    return expanded;
+}
+
+static void
+rb_set_expanded_cache(VALUE expanded, int has_relative)
+{
+    VALUE cache = rb_ary_new2(3);
+
+    if (has_relative) {
+	char *cwd = my_getcwd();
+	rb_ary_push(cache, rb_str_new_cstr(cwd));
+	xfree(cwd);
+    } else {
+	rb_ary_push(cache, Qtrue);
+    }
+
+    rb_ary_push(cache, INT2FIX(rb_filesystem_encindex()));
+    rb_ary_push(cache, rb_ary_dup(expanded));
+    GET_VM()->load_path_expanded_cache = cache;
+}
+
+static VALUE
+rb_expand_load_paths(long pathc, VALUE* paths, int *has_relative)
+{
+    long i;
+    const char *p;
+    VALUE path, expanded = rb_ary_new2(pathc);
+
+    for(i = 0; i < pathc; i++) {
+	path = rb_get_path(paths[i]);
+	p = RSTRING_PTR(path);
+	*has_relative = *has_relative || !rb_is_absolute_path(p);
+	path = rb_file_expand_path(path, Qnil);
+	rb_str_freeze(path);
+	rb_ary_push(expanded, path);
+    }
+
+    return expanded;
+}
+
+/* Invalidating $LOAD_PATH methods implementation */
+static VALUE
+rb_load_path_reset_cache_method(int argc, VALUE *argv, VALUE self)
+{
+    rb_reset_expanded_cache();
+    return rb_call_super(argc, argv);
+}
+
+/* Proxying $LOAD_PATH methods implementation */
+static VALUE
+rb_load_path_apply_to_cache_method(int argc, VALUE *argv, VALUE self)
+{
+    VALUE load_path_expanded = rb_load_path_expanded_cache();
+    if (RTEST(load_path_expanded)) {
+	ID func = rb_frame_this_func();
+	rb_funcall2(load_path_expanded, func, argc, argv);
+    }
+    return rb_call_super(argc, argv);
+}
+
+/* Proxying with expansion $LOAD_PATH methods implementation */
+static VALUE
+rb_load_path_apply_expanded_method(int argc, VALUE *argv, VALUE self)
+{
+    int old_has_relative = 0;
+    /* We call methods on cache only if we still in the same working directory */
+    VALUE load_path_expanded = rb_checked_expanded_cache(&old_has_relative);
+    if (RTEST(load_path_expanded)) {
+	int has_relative = 0;
+	ID func = rb_frame_this_func();
+	VALUE expanded = rb_expand_load_paths(argc, argv, &has_relative);
+
+	rb_funcall2(load_path_expanded, func, argc, RARRAY_PTR(expanded));
+
+	if (!old_has_relative && has_relative) {
+	    rb_set_expanded_cache(load_path_expanded, has_relative);
+	}
+	RB_GC_GUARD(expanded);
+    }
+    return rb_call_super(argc, argv);
+}
+/* $LOAD_PATH.concat(ary) - special, we call push(*ary) instead
+ * cause I'm lazy a bit and wish not to rewrite method above second time :)
+ */
+static VALUE
+rb_load_path_concat(VALUE self, VALUE ary)
+{
+    ID push;
+    CONST_ID(push, "push");
+    RB_GC_GUARD(ary);
+    return rb_funcall2(self, push, (int)RARRAY_LEN(ary), RARRAY_PTR(ary));
+}
+
+void
+rb_load_path_ary_push(VALUE path)
+{
+    int old_has_relative = 0;
+    VALUE load_path_expanded = rb_checked_expanded_cache(&old_has_relative);
+    if (RTEST(load_path_expanded)) {
+	int has_relative = 0;
+	VALUE expanded = rb_expand_load_paths(1, &path, &has_relative);
+
+	rb_ary_push(load_path_expanded, RARRAY_PTR(expanded)[0]);
+
+	if (!old_has_relative && has_relative) {
+	    rb_set_expanded_cache(load_path_expanded, has_relative);
+	}
+	RB_GC_GUARD(expanded);
+    }
+
+    rb_ary_push(GET_VM()->load_path, path);
+}
+
+static VALUE
+rb_load_path_init(void)
+{
+    const char **name;
+    VALUE load_path = rb_ary_new();
+    char *cached_flag;
+
+    cached_flag = getenv("RUBY_CACHED_LOAD_PATH");
+    if (cached_flag != NULL) {
+	cached_expanded_load_path = atoi(cached_flag);
+    }
+
+    /* Do all the magick if user did not disable it
+     * with RUBY_CACHED_LOAD_PATH=0 environment variable
+     */
+    if (cached_expanded_load_path) {
+	VALUE load_path_c = rb_singleton_class(load_path);
+
+	for(name = load_path_reset_cache_methods; *name; name++ ) {
+	    rb_define_method(load_path_c, *name, rb_load_path_reset_cache_method, -1);
+	}
+
+	for(name = load_path_apply_to_cache_methods; *name; name++ ) {
+	    rb_define_method(load_path_c, *name, rb_load_path_apply_to_cache_method, -1);
+	}
+
+	for(name = load_path_apply_expanded_methods; *name; name++ ) {
+	    rb_define_method(load_path_c, *name, rb_load_path_apply_expanded_method, -1);
+	}
+
+	rb_define_method(load_path_c, "concat", rb_load_path_concat, 1);
+    }
+
+    rb_reset_expanded_cache();
+
+    return load_path;
+}
+
 void
 Init_load()
 {
@@ -772,11 +1182,11 @@ Init_load()
     rb_define_hooked_variable(var_load_path, (VALUE*)vm, load_path_getter, rb_gvar_readonly_setter);
     rb_alias_variable(rb_intern("$-I"), id_load_path);
     rb_alias_variable(rb_intern("$LOAD_PATH"), id_load_path);
-    vm->load_path = rb_ary_new();
+    vm->load_path = rb_load_path_init();
 
     rb_define_virtual_variable("$\"", get_loaded_features, 0);
     rb_define_virtual_variable("$LOADED_FEATURES", get_loaded_features, 0);
-    vm->loaded_features = rb_ary_new();
+    vm->loaded_features = rb_loaded_features_init();
 
     rb_define_global_function("load", rb_f_load, -1);
     rb_define_global_function("require", rb_f_require, 1);
diff --git a/marshal.c b/marshal.c
index 9a43cdb..a1b46f8 100644
--- a/marshal.c
+++ b/marshal.c
@@ -106,7 +106,7 @@ static void
 mark_marshal_compat_t(void *tbl)
 {
     if (!tbl) return;
-    st_foreach(tbl, mark_marshal_compat_i, 0);
+    st_foreach_nocheck(tbl, mark_marshal_compat_i, 0);
 }
 
 void
diff --git a/node.h b/node.h
index bb96107..37938ea 100644
--- a/node.h
+++ b/node.h
@@ -260,7 +260,7 @@ typedef struct RNode {
 
 #define RNODE(obj)  (R_CAST(RNode)(obj))
 
-/* 0..4:T_TYPES, 5:FL_MARK, 6:reserved, 7:NODE_FL_NEWLINE */
+/* 0..4:T_TYPES, 5:reserved, 6:reserved, 7:NODE_FL_NEWLINE */
 #define NODE_FL_NEWLINE (((VALUE)1)<<7)
 #define NODE_FL_CREF_PUSHED_BY_EVAL NODE_FL_NEWLINE
 
diff --git a/object.c b/object.c
index f45e013..b59e1a0 100644
--- a/object.c
+++ b/object.c
@@ -278,7 +278,7 @@ rb_obj_clone(VALUE obj)
     }
     clone = rb_obj_alloc(rb_obj_class(obj));
     RBASIC(clone)->klass = rb_singleton_class_clone(obj);
-    RBASIC(clone)->flags = (RBASIC(obj)->flags | FL_TEST(clone, FL_TAINT) | FL_TEST(clone, FL_UNTRUSTED)) & ~(FL_FREEZE|FL_FINALIZE|FL_MARK);
+    RBASIC(clone)->flags = (RBASIC(obj)->flags | FL_TEST(clone, FL_TAINT) | FL_TEST(clone, FL_UNTRUSTED)) & ~(FL_FREEZE|FL_FINALIZE);
     init_copy(clone, obj);
     rb_funcall(clone, id_init_clone, 1, obj);
     RBASIC(clone)->flags |= RBASIC(obj)->flags & FL_FREEZE;
diff --git a/parse.y b/parse.y
index b0da1b7..bf054c2 100644
--- a/parse.y
+++ b/parse.y
@@ -10040,7 +10040,7 @@ rb_sym_all_symbols(void)
 {
     VALUE ary = rb_ary_new2(global_symbols.sym_id->num_entries);
 
-    st_foreach(global_symbols.sym_id, symbols_i, ary);
+    st_foreach_nocheck(global_symbols.sym_id, symbols_i, ary);
     return ary;
 }
 
diff --git a/pool_alloc.h b/pool_alloc.h
new file mode 100644
index 0000000..957708e
--- /dev/null
+++ b/pool_alloc.h
@@ -0,0 +1,11 @@
+#ifndef POOL_ALLOC_H
+#define POOL_ALLOC_H
+
+#define POOL_ALLOC_API
+#ifdef POOL_ALLOC_API
+void  ruby_xpool_free(void *ptr);
+void *ruby_xpool_malloc_6p();
+void *ruby_xpool_malloc_11p();
+#endif
+
+#endif
diff --git a/pool_alloc.inc.h b/pool_alloc.inc.h
new file mode 100644
index 0000000..e06baba
--- /dev/null
+++ b/pool_alloc.inc.h
@@ -0,0 +1,152 @@
+/*
+ * this is generic pool allocator
+ * you should define following macroses:
+ * ITEM_NAME - unique identifier, which allows to hold functions in a namespace
+ * ITEM_TYPEDEF(name) - passed to typedef to localize item type
+ * free_entry - desired name of function for free entry
+ * alloc_entry - defired name of function for allocate entry
+ */
+
+#if POOL_ALLOC_PART == 1
+#define DEFAULT_POOL_SIZE 8192
+typedef unsigned int pool_holder_counter;
+
+typedef struct pool_entry_list pool_entry_list;
+typedef struct pool_holder pool_holder;
+
+typedef struct pool_header {
+    pool_holder         *first;
+    pool_holder         *_black_magick;
+    pool_holder_counter  size; // size of entry in sizeof(void*) items
+    pool_holder_counter  total; // size of entry in sizeof(void*) items
+} pool_header;
+
+struct pool_holder {
+    pool_holder_counter free, total;
+    pool_header  *header;
+    void               *freep;
+    pool_holder        *fore, *back;
+    void *data[1];
+};
+#define POOL_DATA_SIZE(pool_size) (((pool_size) - sizeof(void*) * 6 - offsetof(pool_holder, data)) / sizeof(void*))
+#define POOL_ENTRY_SIZE(item_type) ((sizeof(item_type) - 1) / sizeof(void*) + 1)
+#define POOL_HOLDER_COUNT(pool_size, item_type) (POOL_DATA_SIZE(pool_size)/POOL_ENTRY_SIZE(item_type))
+#define INIT_POOL(item_type) {NULL, NULL, POOL_ENTRY_SIZE(item_type), POOL_HOLDER_COUNT(DEFAULT_POOL_SIZE, item_type)}
+
+#elif POOL_ALLOC_PART == 2
+static pool_holder *
+pool_holder_alloc(pool_header *header)
+{
+    pool_holder *holder;
+    pool_holder_counter i, size, count;
+    register void **ptr;
+
+    size_t sz = offsetof(pool_holder, data) +
+	    header->size * header->total * sizeof(void*);
+#define objspace (&rb_objspace)
+    vm_malloc_prepare(objspace, DEFAULT_POOL_SIZE);
+    if (header->first != NULL) return header->first;
+    TRY_WITH_GC(holder = (pool_holder*) aligned_malloc(DEFAULT_POOL_SIZE, sz));
+    malloc_increase += DEFAULT_POOL_SIZE;
+#if CALC_EXACT_MALLOC_SIZE
+    objspace->malloc_params.allocated_size += DEFAULT_POOL_SIZE;
+    objspace->malloc_params.allocations++;
+#endif
+#undef objspace
+
+    size = header->size;
+    count = header->total;
+    holder->free = count;
+    holder->total = count;
+    holder->header = header;
+    holder->fore = NULL;
+    holder->back = NULL;
+    holder->freep = &holder->data;
+    ptr = holder->data;
+    for(i = count - 1; i; i-- ) {
+	ptr = *ptr = ptr + size;
+    }
+    *ptr = NULL;
+    header->first = holder;
+    return holder;
+}
+
+static inline void
+pool_holder_unchaing(pool_header *header, pool_holder *holder)
+{
+    register pool_holder *fore = holder->fore, *back = holder->back;
+    holder->fore = NULL;
+    holder->back = NULL;
+    if (fore != NULL)  fore->back     = back;
+    else               header->_black_magick = back;
+    if (back != NULL)  back->fore     = fore;
+    else               header->first = fore;
+}
+
+static inline pool_holder *
+entry_holder(void **entry)
+{
+    return (pool_holder*)(((uintptr_t)entry) & ~(DEFAULT_POOL_SIZE - 1));
+}
+
+static inline void
+pool_free_entry(void **entry)
+{
+    pool_holder *holder = entry_holder(entry);
+    pool_header *header = holder->header;
+
+    if (holder->free++ == 0) {
+	register pool_holder *first = header->first;
+	if (first == NULL) {
+	    header->first = holder;
+	} else {
+	    holder->back = first;
+	    holder->fore = first->fore;
+	    first->fore = holder;
+	    if (holder->fore)
+		holder->fore->back = holder;
+	    else
+		header->_black_magick = holder;
+	}
+    } else if (holder->free == holder->total && header->first != holder ) {
+	pool_holder_unchaing(header, holder);
+	aligned_free(holder);
+#if CALC_EXACT_MALLOC_SIZE
+	rb_objspace.malloc_params.allocated_size -= DEFAULT_POOL_SIZE;
+	rb_objspace.malloc_params.allocations--;
+#endif
+	return;
+    }
+
+    *entry = holder->freep;
+    holder->freep = entry;
+}
+
+static inline void*
+pool_alloc_entry(pool_header *header)
+{
+    pool_holder *holder = header->first;
+    void **result;
+    if (holder == NULL) {
+	holder = pool_holder_alloc(header);
+    }
+
+    result = holder->freep;
+    holder->freep = *result;
+
+    if (--holder->free == 0) {
+	pool_holder_unchaing(header, holder);
+    }
+
+    return result;
+}
+
+static void
+pool_finalize_header(pool_header *header)
+{
+    if (header->first) {
+        aligned_free(header->first);
+        header->first = NULL;
+    }
+}
+#endif
diff --git a/process.c b/process.c
index 2a16757..7a2201c 100644
--- a/process.c
+++ b/process.c
@@ -666,7 +666,7 @@ rb_waitpid(rb_pid_t pid, int *st, int flags)
 	    struct wait_data data;
 	    data.pid = (rb_pid_t)-1;
 	    data.status = -1;
-	    st_foreach(pid_tbl, wait_each, (st_data_t)&data);
+	    st_foreach_nocheck(pid_tbl, wait_each, (st_data_t)&data);
 	    if (data.status != -1) {
 		rb_last_status_set(data.status, data.pid);
 		return data.pid;
@@ -2162,11 +2162,11 @@ run_exec_dup2(VALUE ary, VALUE save, char *errmsg, size_t errmsg_buflen)
         }
     }
 
-    xfree(pairs);
+    free(pairs);
     return 0;
 
   fail:
-    xfree(pairs);
+    free(pairs);
     return -1;
 }
 
diff --git a/re.c b/re.c
index 9fdbf54..25467d7 100644
--- a/re.c
+++ b/re.c
@@ -769,7 +769,7 @@ onig_new_with_source(regex_t** reg, const UChar* pattern, const UChar* pattern_e
 {
   int r;
 
-  *reg = (regex_t* )xmalloc(sizeof(regex_t));
+  *reg = (regex_t* )malloc(sizeof(regex_t));
   if (IS_NULL(*reg)) return ONIGERR_MEMORY;
 
   r = onig_reg_init(*reg, option, ONIGENC_CASE_FOLD_DEFAULT, enc, syntax);
diff --git a/ruby.c b/ruby.c
index 3c97d01..b9b9fd5 100644
--- a/ruby.c
+++ b/ruby.c
@@ -209,7 +209,6 @@ push_include(const char *path, VALUE (*filter)(VALUE))
 {
     const char sep = PATH_SEP_CHAR;
     const char *p, *s;
-    VALUE load_path = GET_VM()->load_path;
 
     p = path;
     while (*p) {
@@ -217,7 +216,7 @@ push_include(const char *path, VALUE (*filter)(VALUE))
 	    p++;
 	if (!*p) break;
 	for (s = p; *s && *s != sep; s = CharNext(s));
-	rb_ary_push(load_path, (*filter)(rubylib_mangled_path(p, s - p)));
+	rb_load_path_ary_push((*filter)(rubylib_mangled_path(p, s - p)));
 	p = s;
     }
 }
@@ -338,7 +337,6 @@ ruby_init_loadpath(void)
 void
 ruby_init_loadpath_safe(int safe_level)
 {
-    VALUE load_path;
     ID id_initial_load_path_mark;
     extern const char ruby_initial_load_paths[];
     const char *paths = ruby_initial_load_paths;
@@ -438,7 +436,6 @@ ruby_init_loadpath_safe(int safe_level)
 #define RUBY_RELATIVE(path, len) rubylib_mangled_path((path), (len))
 #define PREFIX_PATH() RUBY_RELATIVE(exec_prefix, sizeof(exec_prefix)-1)
 #endif
-    load_path = GET_VM()->load_path;
 
     if (safe_level == 0) {
 #ifdef MANGLED_PATH
@@ -452,7 +449,7 @@ ruby_init_loadpath_safe(int safe_level)
 	size_t len = strlen(paths);
 	VALUE path = RUBY_RELATIVE(paths, len);
 	rb_ivar_set(path, id_initial_load_path_mark, path);
-	rb_ary_push(load_path, path);
+	rb_load_path_ary_push(path);
 	paths += len + 1;
     }
 
@@ -1349,6 +1346,7 @@ process_options(int argc, char **argv, struct cmdline_options *opt)
 	for (i = 0; i < RARRAY_LEN(load_path); ++i) {
 	    rb_enc_associate(RARRAY_PTR(load_path)[i], lenc);
 	}
+	rb_reset_expanded_cache();
     }
     if (!(opt->disable & DISABLE_BIT(gems))) {
 #if defined DISABLE_RUBYGEMS && DISABLE_RUBYGEMS
diff --git a/st.c b/st.c
index fda5784..675918d 100644
--- a/st.c
+++ b/st.c
@@ -7,6 +7,7 @@
 #include "st.h"
 #else
 #include "ruby/ruby.h"
+#include "pool_alloc.h"
 #endif
 
 #include <stdio.h>
@@ -25,8 +26,21 @@ struct st_table_entry {
     st_table_entry *fore, *back;
 };
 
+#define STATIC_ASSERT(name, expr) typedef int static_assert_##name##_check[(expr) ? 1 : -1];
+
 #define ST_DEFAULT_MAX_DENSITY 5
 #define ST_DEFAULT_INIT_TABLE_SIZE 11
+#define ST_DEFAULT_SECOND_TABLE_SIZE 19
+#define ST_DEFAULT_PACKED_TABLE_SIZE 18
+#define PACKED_UNIT (int)(sizeof(st_packed_entry) / sizeof(st_table_entry*))
+#define MAX_PACKED_HASH (int)(ST_DEFAULT_PACKED_TABLE_SIZE * sizeof(st_table_entry*) / sizeof(st_packed_entry))
+
+typedef struct st_packed_bins {
+    st_packed_entry kv[MAX_PACKED_HASH];
+} st_packed_bins;
+
+STATIC_ASSERT(st_packed_entry, sizeof(st_packed_entry) == sizeof(st_table_entry*[PACKED_UNIT]))
+STATIC_ASSERT(st_packed_bins, sizeof(st_packed_bins) <= sizeof(st_table_entry*[ST_DEFAULT_PACKED_TABLE_SIZE]))
 
     /*
      * DEFAULT_MAX_DENSITY is the default for the largest we allow the
@@ -38,7 +52,8 @@ struct st_table_entry {
      *
      */
 
-static const struct st_hash_type type_numhash = {
+#define type_numhash st_hashtype_num
+const struct st_hash_type st_hashtype_num = {
     st_numcmp,
     st_numhash,
 };
@@ -61,20 +76,99 @@ static void rehash(st_table *);
 #ifdef RUBY
 #define malloc xmalloc
 #define calloc xcalloc
+#define realloc xrealloc
 #define free(x) xfree(x)
 #endif
 
 #define numberof(array) (int)(sizeof(array) / sizeof((array)[0]))
 
-#define alloc(type) (type*)malloc((size_t)sizeof(type))
-#define Calloc(n,s) (char*)calloc((n),(s))
-
 #define EQUAL(table,x,y) ((x)==(y) || (*(table)->type->compare)((x),(y)) == 0)
 
-/* remove cast to unsigned int in the future */
-#define do_hash(key,table) (unsigned int)(st_index_t)(*(table)->type->hash)((key))
+#define do_hash(key,table) (st_index_t)(*(table)->type->hash)((key))
 #define do_hash_bin(key,table) (do_hash((key), (table))%(table)->num_bins)
 
+/* preparation for possible allocation improvements */
+#ifdef POOL_ALLOC_API
+#define st_alloc_entry() (st_table_entry *)ruby_xpool_malloc_6p()
+#define st_free_entry(entry) ruby_xpool_free(entry)
+#define st_alloc_table() (st_table *)ruby_xpool_malloc_6p()
+#define st_dealloc_table(table) ruby_xpool_free(table)
+static inline st_table_entry **
+st_alloc_bins(st_index_t size)
+{
+    st_table_entry **result;
+    if (size == 11) {
+        result = (st_table_entry **) ruby_xpool_malloc_11p();
+        memset(result, 0, 11 * sizeof(st_table_entry *));
+    }
+    else
+        result = (st_table_entry **) ruby_xcalloc(size, sizeof(st_table_entry*));
+    return result;
+}
+static inline void
+st_free_bins(st_table_entry **bins, st_index_t size)
+{
+    if (size == 11)
+	ruby_xpool_free(bins);
+    else
+	ruby_xfree(bins);
+}
+static inline st_table_entry**
+st_realloc_bins(st_table_entry **bins, st_index_t newsize, st_index_t oldsize)
+{
+    st_free_bins(bins, oldsize);
+    return st_alloc_bins(newsize);
+}
+#else
+#define st_alloc_entry() (st_table_entry *)malloc(sizeof(st_table_entry))
+#define st_free_entry(entry) free(entry)
+#define st_alloc_table() (st_table *)malloc(sizeof(st_table))
+#define st_dealloc_table(table) free(table)
+#define st_alloc_bins(size) (st_table_entry **)calloc(size, sizeof(st_table_entry *))
+#define st_free_bins(bins, size) free(bins)
+static inline st_table_entry**
+st_realloc_bins(st_table_entry **bins, st_index_t newsize, st_index_t oldsize)
+{
+    bins = (st_table_entry **)realloc(bins, newsize * sizeof(st_table_entry *));
+    MEMZERO(bins, st_table_entry*, newsize);
+    return bins;
+}
+#endif
+
+/* preparation for possible packing improvements */
+#define PACKED_BINS(table) (*(table)->as.packed)
+#define PACKED_ENT(table, i) PACKED_BINS(table).kv[i]
+#define PKEY(table, i) PACKED_ENT((table), (i)).key
+#define PVAL(table, i) PACKED_ENT((table), (i)).val
+#define PHASH(table, i) PACKED_ENT((table), (i)).hash
+#define PKEY_SET(table, i, v) (PKEY((table), (i)) = (v))
+#define PVAL_SET(table, i, v) (PVAL((table), (i)) = (v))
+#define PHASH_SET(table, i, v) (PHASH((table), (i)) = (v))
+/* this function depends much on packed layout, so that it placed here */
+static inline void
+remove_packed_entry(st_table *table, st_index_t i)
+{
+    table->num_entries--;
+    if (i < table->num_entries) {
+	MEMMOVE(&PACKED_ENT(table, i), &PACKED_ENT(table, i+1),
+		st_packed_entry, table->num_entries - i);
+    }
+}
+/* ultra packed values */
+#define MAX_ULTRA_PACKED 1
+#define ULTRA_PACKED(table) ((table)->num_bins == 0)
+#define UPHASH(table) (table)->as.upacked.hash
+#define UPKEY(table)  (table)->as.upacked.key
+#define UPVAL(table)  (table)->as.upacked.val
+#define UPHASH_SET(table, val) (UPHASH(table) = (val))
+#define UPKEY_SET(table, val) (UPKEY(table) = (val))
+#define UPVAL_SET(table, val) (UPVAL(table) = (val))
+
+/* Shortage */
+#define bins as.big.bins
+#define head as.big.head
+#define tail as.big.tail
+
 /*
  * MINSIZE is the minimum size of a dictionary.
  */
@@ -85,8 +179,8 @@ static void rehash(st_table *);
 Table of prime numbers 2^n+a, 2<=n<=30.
 */
 static const unsigned int primes[] = {
-	8 + 3,
-	16 + 3,
+	ST_DEFAULT_INIT_TABLE_SIZE,
+	ST_DEFAULT_SECOND_TABLE_SIZE,
 	32 + 5,
 	64 + 3,
 	128 + 3,
@@ -161,8 +255,6 @@ stat_col(void)
 }
 #endif
 
-#define MAX_PACKED_NUMHASH (ST_DEFAULT_INIT_TABLE_SIZE/2)
-
 st_table*
 st_init_table_with_size(const struct st_hash_type *type, st_index_t size)
 {
@@ -181,14 +273,19 @@ st_init_table_with_size(const struct st_hash_type *type, st_index_t size)
     }
 #endif
 
-    size = new_size(size);	/* round up to prime number */
 
-    tbl = alloc(st_table);
+    tbl = st_alloc_table();
     tbl->type = type;
     tbl->num_entries = 0;
-    tbl->entries_packed = type == &type_numhash && size/2 <= MAX_PACKED_NUMHASH;
+    if ( (tbl->entries_packed = size <= MAX_PACKED_HASH) ) {
+        size = size <= MAX_ULTRA_PACKED ? 0 :
+                ST_DEFAULT_PACKED_TABLE_SIZE;
+    }
+    else {
+        size = new_size(size);	/* round up to prime number */
+    }
     tbl->num_bins = size;
-    tbl->bins = (st_table_entry **)Calloc(size, sizeof(st_table_entry*));
+    tbl->bins = size ? st_alloc_bins(size) : NULL;
     tbl->head = 0;
     tbl->tail = 0;
 
@@ -248,12 +345,12 @@ st_clear(st_table *table)
         return;
     }
 
-    for(i = 0; i < table->num_bins; i++) {
+    for (i = 0; i < table->num_bins; i++) {
 	ptr = table->bins[i];
 	table->bins[i] = 0;
 	while (ptr != 0) {
 	    next = ptr->next;
-	    free(ptr);
+	    st_free_entry(ptr);
 	    ptr = next;
 	}
     }
@@ -266,8 +363,9 @@ void
 st_free_table(st_table *table)
 {
     st_clear(table);
-    free(table->bins);
-    free(table);
+    if (table->num_bins)
+	st_free_bins(table->bins, table->num_bins);
+    st_dealloc_table(table);
 }
 
 size_t
@@ -306,46 +404,77 @@ count_collision(const struct st_hash_type *type)
 #define FOUND_ENTRY
 #endif
 
-#define FIND_ENTRY(table, ptr, hash_val, bin_pos) do {\
-    (bin_pos) = (hash_val)%(table)->num_bins;\
-    (ptr) = (table)->bins[(bin_pos)];\
-    FOUND_ENTRY;\
-    if (PTR_NOT_EQUAL((table), (ptr), (hash_val), key)) {\
-	COLLISION;\
-	while (PTR_NOT_EQUAL((table), (ptr)->next, (hash_val), key)) {\
-	    (ptr) = (ptr)->next;\
-	}\
-	(ptr) = (ptr)->next;\
-    }\
-} while (0)
+#define FIND_ENTRY(table, ptr, hash_val, bin_pos) \
+    ((ptr) = find_entry((table), key, (hash_val), ((bin_pos) = (hash_val)%(table)->num_bins)))
+
+static st_table_entry *
+find_entry(st_table *table, st_data_t key, st_index_t hash_val, st_index_t bin_pos)
+{
+    register st_table_entry *ptr = table->bins[bin_pos];
+    FOUND_ENTRY;
+    if (PTR_NOT_EQUAL(table, ptr, hash_val, key)) {
+	COLLISION;
+	while (PTR_NOT_EQUAL(table, ptr->next, hash_val, key)) {
+	    ptr = ptr->next;
+	}
+	ptr = ptr->next;
+    }
+    return ptr;
+}
+
+static inline st_index_t
+find_packed_index(st_table *table, st_index_t hash_val, st_data_t key)
+{
+    st_index_t i = 0;
+    for(;;i++) {
+        while (i < table->num_entries && PHASH(table, i) != hash_val) i++;
+        if (i == table->num_entries || EQUAL(table, key, PKEY(table, i)))
+            break;
+    }
+    return i;
+}
+
+static inline int
+check_ultra_packed(st_table *table, st_index_t hash_val, st_data_t key)
+{
+    return table->num_entries && UPHASH(table) == hash_val &&
+	    EQUAL(table, key, UPKEY(table));
+}
 
 #define collision_check 0
 
 int
 st_lookup(st_table *table, register st_data_t key, st_data_t *value)
 {
-    st_index_t hash_val, bin_pos;
+    st_index_t hash_val;
     register st_table_entry *ptr;
 
+    hash_val = do_hash(key, table);
+
+    if (ULTRA_PACKED(table)) {
+	if (check_ultra_packed(table, hash_val, key)) {
+	    if (value != 0) *value = UPVAL(table);
+	    return 1;
+	}
+	return 0;
+    }
+
     if (table->entries_packed) {
-        st_index_t i;
-        for (i = 0; i < table->num_entries; i++) {
-            if ((st_data_t)table->bins[i*2] == key) {
-                if (value !=0) *value = (st_data_t)table->bins[i*2+1];
-                return 1;
-            }
-        }
+        st_index_t i = find_packed_index(table, hash_val, key);
+	if (i < table->num_entries) {
+	    if (value != 0) *value = PVAL(table, i);
+	    return 1;
+	}
         return 0;
     }
 
-    hash_val = do_hash(key, table);
-    FIND_ENTRY(table, ptr, hash_val, bin_pos);
+    ptr = find_entry(table, key, hash_val, hash_val % table->num_bins);
 
     if (ptr == 0) {
 	return 0;
     }
     else {
-	if (value != 0)  *value = ptr->record;
+	if (value != 0) *value = ptr->record;
 	return 1;
     }
 }
@@ -353,22 +482,29 @@ st_lookup(st_table *table, register st_data_t key, st_data_t *value)
 int
 st_get_key(st_table *table, register st_data_t key, st_data_t *result)
 {
-    st_index_t hash_val, bin_pos;
+    st_index_t hash_val;
     register st_table_entry *ptr;
 
+    hash_val = do_hash(key, table);
+
+    if (ULTRA_PACKED(table)) {
+	if (check_ultra_packed(table, hash_val, key)) {
+	    if (result != 0) *result = UPKEY(table);
+	    return 1;
+	}
+	return 0;
+    }
+
     if (table->entries_packed) {
-        st_index_t i;
-        for (i = 0; i < table->num_entries; i++) {
-            if ((st_data_t)table->bins[i*2] == key) {
-                if (result !=0) *result = (st_data_t)table->bins[i*2];
-                return 1;
-            }
-        }
+        st_index_t i = find_packed_index(table, hash_val, key);
+	if (i < table->num_entries) {
+	    if (result != 0) *result = PKEY(table, i);
+	    return 1;
+	}
         return 0;
     }
 
-    hash_val = do_hash(key, table);
-    FIND_ENTRY(table, ptr, hash_val, bin_pos);
+    ptr = find_entry(table, key, hash_val, hash_val % table->num_bins);
 
     if (ptr == 0) {
 	return 0;
@@ -382,85 +518,153 @@ st_get_key(st_table *table, register st_data_t key, st_data_t *result)
 #undef collision_check
 #define collision_check 1
 
-#define MORE_PACKABLE_P(table) \
-    ((st_index_t)((table)->num_entries+1) * 2 <= (table)->num_bins && \
-     (table)->num_entries+1 <= MAX_PACKED_NUMHASH)
-
-#define ADD_DIRECT(table, key, value, hash_val, bin_pos)\
-do {\
-    st_table_entry *entry;\
-    if ((table)->num_entries > ST_DEFAULT_MAX_DENSITY * (table)->num_bins) {\
-	rehash(table);\
-        (bin_pos) = (hash_val) % (table)->num_bins;\
-    }\
-    \
-    entry = alloc(st_table_entry);\
-    \
-    entry->hash = (hash_val);\
-    entry->key = (key);\
-    entry->record = (value);\
-    entry->next = (table)->bins[(bin_pos)];\
-    if ((table)->head != 0) {\
-	entry->fore = 0;\
-	(entry->back = (table)->tail)->fore = entry;\
-	(table)->tail = entry;\
-    }\
-    else {\
-	(table)->head = (table)->tail = entry;\
-	entry->fore = entry->back = 0;\
-    }\
-    (table)->bins[(bin_pos)] = entry;\
-    (table)->num_entries++;\
-} while (0)
+static inline st_table_entry *
+new_entry(st_table * table, st_data_t key, st_data_t value,
+	st_index_t hash_val, register st_index_t bin_pos)
+{
+    register st_table_entry *entry = st_alloc_entry();
+
+    entry->next = table->bins[bin_pos];
+    table->bins[bin_pos] = entry;
+    entry->hash = hash_val;
+    entry->key = key;
+    entry->record = value;
+
+    return entry;
+}
+
+static inline void
+add_direct(st_table *table, st_data_t key, st_data_t value,
+	   st_index_t hash_val, register st_index_t bin_pos)
+{
+    register st_table_entry *entry;
+    if (table->num_entries > ST_DEFAULT_MAX_DENSITY * table->num_bins) {
+	rehash(table);
+        bin_pos = hash_val % table->num_bins;
+    }
+
+    entry = new_entry(table, key, value, hash_val, bin_pos);
+
+    if (table->head != 0) {
+	entry->fore = 0;
+	(entry->back = table->tail)->fore = entry;
+	table->tail = entry;
+    }
+    else {
+	table->head = table->tail = entry;
+	entry->fore = entry->back = 0;
+    }
+    table->num_entries++;
+}
 
 static void
 unpack_entries(register st_table *table)
 {
-    st_index_t i;
-    struct st_table_entry *packed_bins[MAX_PACKED_NUMHASH*2];
+    st_index_t i = 0;
+    st_packed_bins packed_bins;
+    register st_table_entry *entry;
     st_table tmp_table = *table;
 
-    memcpy(packed_bins, table->bins, sizeof(struct st_table_entry *) * table->num_entries*2);
-    table->bins = packed_bins;
+    packed_bins = PACKED_BINS(table);
+    table->as.packed = &packed_bins;
     tmp_table.entries_packed = 0;
-    tmp_table.num_entries = 0;
-    memset(tmp_table.bins, 0, sizeof(struct st_table_entry *) * tmp_table.num_bins);
-    for (i = 0; i < table->num_entries; i++) {
-        st_insert(&tmp_table, (st_data_t)packed_bins[i*2], (st_data_t)packed_bins[i*2+1]);
+    tmp_table.num_entries = MAX_PACKED_HASH;
+#if ST_DEFAULT_INIT_TABLE_SIZE == ST_DEFAULT_PACKED_TABLE_SIZE
+    MEMZERO(tmp_table.bins, st_table_entry*, tmp_table.num_bins);
+#else
+    st_free_bins(tmp_table.bins, tmp_table.num_bins);
+    tmp_table.num_bins = ST_DEFAULT_INIT_TABLE_SIZE;
+    tmp_table.bins = st_alloc_bins(ST_DEFAULT_INIT_TABLE_SIZE);
+#endif
+#define ikey packed_bins.kv[i].key
+#define ival packed_bins.kv[i].val
+#define ihash packed_bins.kv[i].hash
+    entry = new_entry(&tmp_table, ikey, ival, ihash,
+                      ihash % ST_DEFAULT_INIT_TABLE_SIZE);
+    tmp_table.head = entry;
+    entry->back = NULL;
+    for (i = 1; i < MAX_PACKED_HASH; i++) {
+        register st_table_entry *oldentry = entry;
+        entry = new_entry(&tmp_table, ikey, ival, ihash,
+                          ihash % ST_DEFAULT_INIT_TABLE_SIZE);
+        oldentry->fore = entry;
+        entry->back = oldentry;
     }
+    entry->fore = NULL;
+    tmp_table.tail = entry;
     *table = tmp_table;
 }
 
+static void
+add_packed_direct(st_table *table, st_data_t key, st_data_t value, st_index_t hash_val)
+{
+    if (table->num_entries < MAX_PACKED_HASH) {
+	st_index_t i = table->num_entries++;
+	PKEY_SET(table, i, key);
+	PVAL_SET(table, i, value);
+	PHASH_SET(table, i, hash_val);
+    }
+    else {
+	unpack_entries(table);
+	add_direct(table, key, value, hash_val, hash_val % table->num_bins);
+    }
+}
+
+static void
+add_upacked_direct(st_table *table, st_data_t key, st_data_t value, st_index_t hash_val)
+{
+    if (table->num_entries) {
+        st_packed_entry tmp = table->as.upacked;
+        table->bins = st_alloc_bins(ST_DEFAULT_PACKED_TABLE_SIZE);
+        table->num_bins = ST_DEFAULT_PACKED_TABLE_SIZE;
+        PACKED_ENT(table, 0) = tmp;
+        PHASH_SET(table, 1, hash_val);
+        PKEY_SET(table, 1, key);
+        PVAL_SET(table, 1, value);
+        table->num_entries = 2;
+        table->head = NULL;
+        table->tail = NULL;
+    }
+    else {
+        UPHASH_SET(table, hash_val);
+        UPKEY_SET(table, key);
+        UPVAL_SET(table, value);
+        table->num_entries = 1;
+    }
+}
+
 int
 st_insert(register st_table *table, register st_data_t key, st_data_t value)
 {
-    st_index_t hash_val, bin_pos;
+    st_index_t hash_val;
+    register st_index_t bin_pos;
     register st_table_entry *ptr;
 
+    hash_val = do_hash(key, table);
+
+    if (ULTRA_PACKED(table)) {
+	if (check_ultra_packed(table, hash_val, key)) {
+	    UPVAL_SET(table, value);
+	    return 1;
+	}
+	add_upacked_direct(table, key, value, hash_val);
+	return 0;
+    }
+
     if (table->entries_packed) {
-        st_index_t i;
-        for (i = 0; i < table->num_entries; i++) {
-            if ((st_data_t)table->bins[i*2] == key) {
-                table->bins[i*2+1] = (struct st_table_entry*)value;
-                return 1;
-            }
-        }
-        if (MORE_PACKABLE_P(table)) {
-            i = table->num_entries++;
-            table->bins[i*2] = (struct st_table_entry*)key;
-            table->bins[i*2+1] = (struct st_table_entry*)value;
-            return 0;
-        }
-        else {
-            unpack_entries(table);
+        st_index_t i = find_packed_index(table, hash_val, key);
+	if (i < table->num_entries) {
+	    PVAL_SET(table, i, value);
+	    return 1;
         }
+	add_packed_direct(table, key, value, hash_val);
+	return 0;
     }
 
-    hash_val = do_hash(key, table);
     FIND_ENTRY(table, ptr, hash_val, bin_pos);
 
     if (ptr == 0) {
-	ADD_DIRECT(table, key, value, hash_val, bin_pos);
+	add_direct(table, key, value, hash_val, bin_pos);
 	return 0;
     }
     else {
@@ -473,34 +677,38 @@ int
 st_insert2(register st_table *table, register st_data_t key, st_data_t value,
 	   st_data_t (*func)(st_data_t))
 {
-    st_index_t hash_val, bin_pos;
+    st_index_t hash_val;
+    register st_index_t bin_pos;
     register st_table_entry *ptr;
 
+    hash_val = do_hash(key, table);
+
+    if (ULTRA_PACKED(table)) {
+	if (check_ultra_packed(table, hash_val, key)) {
+	    UPVAL_SET(table, value);
+	    return 1;
+	}
+	key = (*func)(key);
+	add_upacked_direct(table, key, value, hash_val);
+	return 0;
+    }
+
     if (table->entries_packed) {
-        st_index_t i;
-        for (i = 0; i < table->num_entries; i++) {
-            if ((st_data_t)table->bins[i*2] == key) {
-                table->bins[i*2+1] = (struct st_table_entry*)value;
-                return 1;
-            }
-        }
-        if (MORE_PACKABLE_P(table)) {
-            i = table->num_entries++;
-            table->bins[i*2] = (struct st_table_entry*)key;
-            table->bins[i*2+1] = (struct st_table_entry*)value;
-            return 0;
-        }
-        else {
-            unpack_entries(table);
+        st_index_t i = find_packed_index(table, hash_val, key);
+	if (i < table->num_entries) {
+	    PVAL_SET(table, i, value);
+	    return 1;
         }
+	key = (*func)(key);
+	add_packed_direct(table, key, value, hash_val);
+	return 0;
     }
 
-    hash_val = do_hash(key, table);
     FIND_ENTRY(table, ptr, hash_val, bin_pos);
 
     if (ptr == 0) {
 	key = (*func)(key);
-	ADD_DIRECT(table, key, value, hash_val, bin_pos);
+	add_direct(table, key, value, hash_val, bin_pos);
 	return 0;
     }
     else {
@@ -512,36 +720,31 @@ st_insert2(register st_table *table, register st_data_t key, st_data_t value,
 void
 st_add_direct(st_table *table, st_data_t key, st_data_t value)
 {
-    st_index_t hash_val, bin_pos;
+    st_index_t hash_val;
+
+    hash_val = do_hash(key, table);
+
+    if (ULTRA_PACKED(table)) {
+	add_upacked_direct(table, key, value, hash_val);
+	return;
+    }
 
     if (table->entries_packed) {
-        int i;
-        if (MORE_PACKABLE_P(table)) {
-            i = table->num_entries++;
-            table->bins[i*2] = (struct st_table_entry*)key;
-            table->bins[i*2+1] = (struct st_table_entry*)value;
-            return;
-        }
-        else {
-            unpack_entries(table);
-        }
+	add_packed_direct(table, key, value, hash_val);
+	return;
     }
 
-    hash_val = do_hash(key, table);
-    bin_pos = hash_val % table->num_bins;
-    ADD_DIRECT(table, key, value, hash_val, bin_pos);
+    add_direct(table, key, value, hash_val, hash_val % table->num_bins);
 }
 
 static void
 rehash(register st_table *table)
 {
     register st_table_entry *ptr, **new_bins;
-    st_index_t i, new_num_bins, hash_val;
+    st_index_t new_num_bins, hash_val;
 
     new_num_bins = new_size(table->num_bins+1);
-    new_bins = (st_table_entry**)
-	xrealloc(table->bins, new_num_bins * sizeof(st_table_entry*));
-    for (i = 0; i < new_num_bins; ++i) new_bins[i] = 0;
+    new_bins = st_realloc_bins(table->bins, new_num_bins, table->num_bins);
     table->num_bins = new_num_bins;
     table->bins = new_bins;
 
@@ -558,34 +761,38 @@ st_table*
 st_copy(st_table *old_table)
 {
     st_table *new_table;
-    st_table_entry *ptr, *entry, *prev, **tail;
+    st_table_entry *ptr, *entry, *prev, **tailp;
     st_index_t num_bins = old_table->num_bins;
     st_index_t hash_val;
 
-    new_table = alloc(st_table);
+    new_table = st_alloc_table();
     if (new_table == 0) {
 	return 0;
     }
 
     *new_table = *old_table;
-    new_table->bins = (st_table_entry**)
-	Calloc((unsigned)num_bins, sizeof(st_table_entry*));
+
+    if (ULTRA_PACKED(old_table)) {
+	return new_table;
+    }
+
+    new_table->bins = st_alloc_bins(num_bins);
 
     if (new_table->bins == 0) {
-	free(new_table);
+	st_dealloc_table(new_table);
 	return 0;
     }
 
     if (old_table->entries_packed) {
-        memcpy(new_table->bins, old_table->bins, sizeof(struct st_table_entry *) * old_table->num_bins);
+        MEMCPY(new_table->bins, old_table->bins, st_table_entry*, old_table->num_bins);
         return new_table;
     }
 
     if ((ptr = old_table->head) != 0) {
 	prev = 0;
-	tail = &new_table->head;
+	tailp = &new_table->head;
 	do {
-	    entry = alloc(st_table_entry);
+	    entry = st_alloc_entry();
 	    if (entry == 0) {
 		st_free_table(new_table);
 		return 0;
@@ -595,8 +802,8 @@ st_copy(st_table *old_table)
 	    entry->next = new_table->bins[hash_val];
 	    new_table->bins[hash_val] = entry;
 	    entry->back = prev;
-	    *tail = prev = entry;
-	    tail = &entry->fore;
+	    *tailp = prev = entry;
+	    tailp = &entry->fore;
 	} while ((ptr = ptr->fore) != 0);
 	new_table->tail = prev;
     }
@@ -604,21 +811,22 @@ st_copy(st_table *old_table)
     return new_table;
 }
 
-#define REMOVE_ENTRY(table, ptr) do					\
-    {									\
-	if ((ptr)->fore == 0 && (ptr)->back == 0) {			\
-	    (table)->head = 0;						\
-	    (table)->tail = 0;						\
-	}								\
-	else {								\
-	    st_table_entry *fore = (ptr)->fore, *back = (ptr)->back;	\
-	    if (fore) fore->back = back;				\
-	    if (back) back->fore = fore;				\
-	    if ((ptr) == (table)->head) (table)->head = fore;		\
-	    if ((ptr) == (table)->tail) (table)->tail = back;		\
-	}								\
-	(table)->num_entries--;						\
-    } while (0)
+static inline void
+remove_entry(st_table *table, st_table_entry *ptr)
+{
+    if (ptr->fore == 0 && ptr->back == 0) {
+	table->head = 0;
+	table->tail = 0;
+    }
+    else {
+	st_table_entry *fore = ptr->fore, *back = ptr->back;
+	if (fore) fore->back = back;
+	if (back) back->fore = fore;
+	if (ptr == table->head) table->head = fore;
+	if (ptr == table->tail) table->tail = back;
+    }
+    table->num_entries--;
+}
 
 int
 st_delete(register st_table *table, register st_data_t *key, st_data_t *value)
@@ -627,34 +835,42 @@ st_delete(register st_table *table, register st_data_t *key, st_data_t *value)
     st_table_entry **prev;
     register st_table_entry *ptr;
 
+    hash_val = do_hash(*key, table);
+
+    if (ULTRA_PACKED(table)) {
+	if (check_ultra_packed(table, hash_val, *key)) {
+	    if (value != 0) *value = UPVAL(table);
+	    *key = UPKEY(table);
+	    table->num_entries = 0;
+	    return 1;
+	}
+	goto notfound;
+    }
+
     if (table->entries_packed) {
-        st_index_t i;
-        for (i = 0; i < table->num_entries; i++) {
-            if ((st_data_t)table->bins[i*2] == *key) {
-                if (value != 0) *value = (st_data_t)table->bins[i*2+1];
-                table->num_entries--;
-                memmove(&table->bins[i*2], &table->bins[(i+1)*2],
-                        sizeof(struct st_table_entry*) * 2*(table->num_entries-i));
-                return 1;
-            }
+        st_index_t i = find_packed_index(table, hash_val, *key);
+	if (i < table->num_entries) {
+	    if (value != 0) *value = PVAL(table, i);
+	    *key = PKEY(table, i);
+	    remove_packed_entry(table, i);
+	    return 1;
         }
-        if (value != 0) *value = 0;
-        return 0;
+	goto notfound;
     }
 
-    hash_val = do_hash_bin(*key, table);
-
-    for (prev = &table->bins[hash_val]; (ptr = *prev) != 0; prev = &ptr->next) {
+    prev = &table->bins[hash_val % table->num_bins];
+    for (; (ptr = *prev) != 0; prev = &ptr->next) {
 	if (EQUAL(table, *key, ptr->key)) {
 	    *prev = ptr->next;
-	    REMOVE_ENTRY(table, ptr);
+	    remove_entry(table, ptr);
 	    if (value != 0) *value = ptr->record;
 	    *key = ptr->key;
-	    free(ptr);
+	    st_free_entry(ptr);
 	    return 1;
 	}
     }
 
+notfound:
     if (value != 0) *value = 0;
     return 0;
 }
@@ -665,25 +881,36 @@ st_delete_safe(register st_table *table, register st_data_t *key, st_data_t *val
     st_index_t hash_val;
     register st_table_entry *ptr;
 
+    hash_val = do_hash(*key, table);
+
+    if (ULTRA_PACKED(table)) {
+	if (check_ultra_packed(table, hash_val, *key)) {
+	    if (value != 0) *value = UPVAL(table);
+	    *key = UPKEY(table);
+	    UPKEY_SET(table, never);
+	    UPHASH_SET(table, 0);
+	    return 1;
+	}
+	goto notfound;
+    }
+
     if (table->entries_packed) {
-	st_index_t i;
-	for (i = 0; i < table->num_entries; i++) {
-	    if ((st_data_t)table->bins[i*2] == *key) {
-		if (value != 0) *value = (st_data_t)table->bins[i*2+1];
-		table->bins[i*2] = (void *)never;
-		return 1;
-	    }
+        st_index_t i = find_packed_index(table, hash_val, *key);
+	if (i < table->num_entries) {
+	    if (value != 0) *value = PVAL(table, i);
+	    *key = PKEY(table, i);
+	    PKEY_SET(table, i, never);
+	    PHASH_SET(table, i,  0);
+	    return 1;
 	}
-	if (value != 0) *value = 0;
-	return 0;
+	goto notfound;
     }
 
-    hash_val = do_hash_bin(*key, table);
-    ptr = table->bins[hash_val];
+    ptr = table->bins[hash_val % table->num_bins];
 
     for (; ptr != 0; ptr = ptr->next) {
 	if ((ptr->key != never) && EQUAL(table, ptr->key, *key)) {
-	    REMOVE_ENTRY(table, ptr);
+	    remove_entry(table, ptr);
 	    *key = ptr->key;
 	    if (value != 0) *value = ptr->record;
 	    ptr->key = ptr->record = never;
@@ -691,6 +918,7 @@ st_delete_safe(register st_table *table, register st_data_t *key, st_data_t *val
 	}
     }
 
+notfound:
     if (value != 0) *value = 0;
     return 0;
 }
@@ -701,15 +929,21 @@ st_cleanup_safe(st_table *table, st_data_t never)
     st_table_entry *ptr, **last, *tmp;
     st_index_t i;
 
+    if (ULTRA_PACKED(table)) {
+	if (UPKEY(table) == never) {
+	    table->num_entries = 0;
+	}
+	return;
+    }
+
     if (table->entries_packed) {
 	st_index_t i = 0, j = 0;
-	while ((st_data_t)table->bins[i*2] != never) {
+	while (PKEY(table, i) != never) {
 	    if (i++ == table->num_entries) return;
 	}
 	for (j = i; ++i < table->num_entries;) {
-	    if ((st_data_t)table->bins[i*2] == never) continue;
-	    table->bins[j*2] = table->bins[i*2];
-	    table->bins[j*2+1] = table->bins[i*2+1];
+	    if (PKEY(table, i) == never) continue;
+	    PACKED_ENT(table, j) = PACKED_ENT(table, i);
 	    j++;
 	}
 	table->num_entries = j;
@@ -722,7 +956,7 @@ st_cleanup_safe(st_table *table, st_data_t never)
 	    if (ptr->key == never) {
 		tmp = ptr;
 		*last = ptr = ptr->next;
-		free(tmp);
+		st_free_entry(tmp);
 	    }
 	    else {
 		ptr = *(last = &ptr->next);
@@ -732,21 +966,70 @@ st_cleanup_safe(st_table *table, st_data_t never)
 }
 
 int
+st_foreach_nocheck(st_table *table, int (*func)(ANYARGS), st_data_t arg)
+{
+    enum st_retval retval;
+    if (table->num_entries == 0) return 0;
+    if (ULTRA_PACKED(table)) {
+        (*func)(UPKEY(table), UPVAL(table), arg);
+    }
+    else if (table->entries_packed) {
+        register st_index_t i;
+        for(i = 0; i < table->num_entries; i++) {
+            retval = (*func)(PKEY(table, i), PVAL(table, i), arg);
+            if (retval == ST_STOP) break;
+        }
+    }
+    else {
+        st_table_entry *ptr;
+        for(ptr = table->head; ptr; ptr = ptr->fore) {
+            retval = (*func)(ptr->key, ptr->record, arg);
+            if (retval == ST_STOP) break;
+        }
+    }
+    return 0;
+}
+
+int
 st_foreach(st_table *table, int (*func)(ANYARGS), st_data_t arg)
 {
     st_table_entry *ptr, **last, *tmp;
     enum st_retval retval;
-    st_index_t i;
+    st_index_t i = 0;
 
     if (table->entries_packed) {
+        st_packed_entry packed;
+        if (ULTRA_PACKED(table) && table->num_entries) {
+            packed = table->as.upacked;
+            retval = (*func)(packed.key, packed.val, arg);
+            if (!ULTRA_PACKED(table)) goto packed;
+            switch(retval) {
+              case ST_CHECK:
+                if (UPKEY(table) == Qundef && UPHASH(table) == 0)
+                    break;
+                if (table->num_entries &&
+                        UPHASH(table) == packed.hash &&
+                        EQUAL(table, packed.key, UPKEY(table)))
+                    break;
+                retval = (*func)(0, 0, arg, 1);
+                return 1;
+              case ST_CONTINUE:
+                break;
+              case ST_STOP:
+                return 0;
+              case ST_DELETE:
+                table->num_entries = 0;
+            }
+            return 0;
+        }
+
         for (i = 0; i < table->num_entries; i++) {
-            st_index_t j;
-            st_data_t key, val;
-            key = (st_data_t)table->bins[i*2];
-            val = (st_data_t)table->bins[i*2+1];
-            retval = (*func)(key, val, arg);
+            packed = PACKED_ENT(table, i);
+            retval = (*func)(packed.key, packed.val, arg);
+          packed:
 	    if (!table->entries_packed) {
-		FIND_ENTRY(table, ptr, key, i);
+		st_index_t key = packed.key;
+		FIND_ENTRY(table, ptr, packed.hash, i);
 		if (retval == ST_CHECK) {
 		    if (!ptr) goto deleted;
 		    goto unpacked_continue;
@@ -755,11 +1038,15 @@ st_foreach(st_table *table, int (*func)(ANYARGS), st_data_t arg)
 	    }
             switch (retval) {
 	      case ST_CHECK:	/* check if hash is modified during iteration */
-                for (j = 0; j < table->num_entries; j++) {
-                    if ((st_data_t)table->bins[j*2] == key)
-                        break;
-                }
-                if (j == table->num_entries) {
+                /* work around uncomforming befaviour of hash */
+                if (PKEY(table, i) == Qundef && PHASH(table, i) == 0)
+                    break;
+                else if (i < table->num_entries &&
+                        PHASH(table, i) == packed.hash &&
+                        EQUAL(table, packed.key, PKEY(table, i)))
+                    break;
+                i = find_packed_index(table, packed.hash, packed.key);
+                if (i == table->num_entries) {
 		    goto deleted;
                 }
 		/* fall through */
@@ -768,9 +1055,7 @@ st_foreach(st_table *table, int (*func)(ANYARGS), st_data_t arg)
 	      case ST_STOP:
 		return 0;
 	      case ST_DELETE:
-                table->num_entries--;
-                memmove(&table->bins[i*2], &table->bins[(i+1)*2],
-                        sizeof(struct st_table_entry*) * 2*(table->num_entries-i));
+		remove_packed_entry(table, i);
                 i--;
                 break;
             }
@@ -809,8 +1094,8 @@ st_foreach(st_table *table, int (*func)(ANYARGS), st_data_t arg)
 		    if (ptr == tmp) {
 			tmp = ptr->fore;
 			*last = ptr->next;
-			REMOVE_ENTRY(table, ptr);
-			free(ptr);
+			remove_entry(table, ptr);
+			st_free_entry(ptr);
 			if (ptr == tmp) return 0;
 			ptr = tmp;
 			break;
@@ -834,13 +1119,13 @@ st_reverse_foreach(st_table *table, int (*func)(ANYARGS), st_data_t arg)
         for (i = table->num_entries-1; 0 <= i; i--) {
             int j;
             st_data_t key, val;
-            key = (st_data_t)table->bins[i*2];
-            val = (st_data_t)table->bins[i*2+1];
+            key = PKEY(table, i);
+            val = PVAL(table, i);
             retval = (*func)(key, val, arg);
             switch (retval) {
 	      case ST_CHECK:	/* check if hash is modified during iteration */
                 for (j = 0; j < table->num_entries; j++) {
-                    if ((st_data_t)table->bins[j*2] == key)
+                    if (PKEY(table, j) == key)
                         break;
                 }
                 if (j == table->num_entries) {
@@ -854,9 +1139,7 @@ st_reverse_foreach(st_table *table, int (*func)(ANYARGS), st_data_t arg)
 	      case ST_STOP:
 		return 0;
 	      case ST_DELETE:
-                table->num_entries--;
-                memmove(&table->bins[i*2], &table->bins[(i+1)*2],
-                        sizeof(struct st_table_entry*) * 2*(table->num_entries-i));
+		remove_packed_entry(table, i);
                 break;
             }
         }
@@ -889,8 +1172,8 @@ st_reverse_foreach(st_table *table, int (*func)(ANYARGS), st_data_t arg)
 		    if (ptr == tmp) {
 			tmp = ptr->back;
 			*last = ptr->next;
-			REMOVE_ENTRY(table, ptr);
-			free(ptr);
+			remove_entry(table, ptr);
+			st_free_entry(ptr);
 			ptr = tmp;
 			break;
 		    }
diff --git a/thread.c b/thread.c
index 342d4fe..2387edf 100644
--- a/thread.c
+++ b/thread.c
@@ -2197,7 +2197,7 @@ rb_thread_keys(VALUE self)
     GetThreadPtr(self, th);
 
     if (th->local_storage) {
-	st_foreach(th->local_storage, thread_keys_i, ary);
+	st_foreach_nocheck(th->local_storage, thread_keys_i, ary);
     }
     return ary;
 }
@@ -3068,7 +3068,7 @@ clear_coverage(void)
 {
     VALUE coverages = rb_get_coverages();
     if (RTEST(coverages)) {
-	st_foreach(RHASH_TBL(coverages), clear_coverage_i, 0);
+	st_foreach_nocheck(RHASH_TBL(coverages), clear_coverage_i, 0);
     }
 }
 
@@ -3213,7 +3213,7 @@ thgroup_list(VALUE group)
 
     param.ary = ary;
     param.group = group;
-    st_foreach(GET_THREAD()->vm->living_threads, thgroup_list_i, (st_data_t) & param);
+    st_foreach_nocheck(GET_THREAD()->vm->living_threads, thgroup_list_i, (st_data_t) & param);
     return ary;
 }
 
@@ -4119,7 +4119,7 @@ set_threads_event_flags_i(st_data_t key, st_data_t val, st_data_t flag)
 static void
 set_threads_event_flags(int flag)
 {
-    st_foreach(GET_VM()->living_threads, set_threads_event_flags_i, (st_data_t) flag);
+    st_foreach_nocheck(GET_VM()->living_threads, set_threads_event_flags_i, (st_data_t) flag);
 }
 
 static inline int
@@ -4299,7 +4299,7 @@ static rb_thread_t *
 vm_event_hooks_running_thread(rb_vm_t *vm)
 {
     rb_thread_t *found = NULL;
-    st_foreach(vm->living_threads, running_vm_event_hooks, (st_data_t)&found);
+    st_foreach_nocheck(vm->living_threads, running_vm_event_hooks, (st_data_t)&found);
     return found;
 }
 
diff --git a/transcode.c b/transcode.c
index 4c3a273..db31c19 100644
--- a/transcode.c
+++ b/transcode.c
@@ -319,7 +319,7 @@ transcode_search_path(const char *sname, const char *dname,
         }
 
         bfs.base_enc = q->enc;
-        st_foreach(table2, transcode_search_path_i, (st_data_t)&bfs);
+        st_foreach_nocheck(table2, transcode_search_path_i, (st_data_t)&bfs);
         bfs.base_enc = NULL;
 
         xfree(q);
diff --git a/variable.c b/variable.c
index caadf71..a2751d8 100644
--- a/variable.c
+++ b/variable.c
@@ -98,7 +98,7 @@ fc_i(ID key, rb_const_entry_t *ce, struct fc_result *res)
 	    arg.klass = res->klass;
 	    arg.track = value;
 	    arg.prev = res;
-	    st_foreach(RCLASS_CONST_TBL(value), fc_i, (st_data_t)&arg);
+	    st_foreach_nocheck(RCLASS_CONST_TBL(value), fc_i, (st_data_t)&arg);
 	    if (arg.path) {
 		res->path = arg.path;
 		return ST_STOP;
@@ -123,10 +123,10 @@ find_class_path(VALUE klass)
     arg.track = rb_cObject;
     arg.prev = 0;
     if (RCLASS_CONST_TBL(rb_cObject)) {
-	st_foreach_safe(RCLASS_CONST_TBL(rb_cObject), fc_i, (st_data_t)&arg);
+	st_foreach_nocheck(RCLASS_CONST_TBL(rb_cObject), fc_i, (st_data_t)&arg);
     }
     if (arg.path == 0) {
-	st_foreach_safe(rb_class_tbl, fc_i, (st_data_t)&arg);
+	st_foreach_nocheck(rb_class_tbl, fc_i, (st_data_t)&arg);
     }
     if (arg.path) {
 	st_data_t tmp = tmp_classpath;
@@ -473,7 +473,7 @@ void
 rb_gc_mark_global_tbl(void)
 {
     if (rb_global_tbl)
-        st_foreach_safe(rb_global_tbl, mark_global_entry, 0);
+        st_foreach_nocheck(rb_global_tbl, mark_global_entry, 0);
 }
 
 static ID
@@ -765,7 +765,7 @@ rb_f_global_variables(void)
     char buf[2];
     int i;
 
-    st_foreach_safe(rb_global_tbl, gvar_i, ary);
+    st_foreach_nocheck(rb_global_tbl, gvar_i, ary);
     buf[0] = '$';
     for (i = 1; i <= 9; ++i) {
 	buf[1] = (char)(i + '0');
@@ -923,7 +923,7 @@ static int
 givar_i(VALUE obj, st_table *tbl)
 {
     if (rb_special_const_p(obj)) {
-	st_foreach_safe(tbl, givar_mark_i, 0);
+	st_foreach_nocheck(tbl, givar_mark_i, 0);
     }
     return ST_CONTINUE;
 }
@@ -933,7 +933,7 @@ rb_mark_generic_ivar_tbl(void)
 {
     if (!generic_iv_tbl) return;
     if (special_generic_ivar == 0) return;
-    st_foreach_safe(generic_iv_tbl, givar_i, 0);
+    st_foreach_nocheck(generic_iv_tbl, givar_i, 0);
 }
 
 void
@@ -1731,7 +1731,7 @@ rb_mod_const_at(VALUE mod, void *data)
 	tbl = st_init_numtable();
     }
     if (RCLASS_CONST_TBL(mod)) {
-	st_foreach_safe(RCLASS_CONST_TBL(mod), sv_i, (st_data_t)tbl);
+	st_foreach_nocheck(RCLASS_CONST_TBL(mod), sv_i, (st_data_t)tbl);
     }
     return tbl;
 }
@@ -1766,7 +1766,7 @@ rb_const_list(void *data)
 
     if (!tbl) return rb_ary_new2(0);
     ary = rb_ary_new2(tbl->num_entries);
-    st_foreach_safe(tbl, list_i, ary);
+    st_foreach_nocheck(tbl, list_i, ary);
     st_free_table(tbl);
 
     return ary;
diff --git a/vm.c b/vm.c
index e997afa..634dee8 100644
--- a/vm.c
+++ b/vm.c
@@ -1570,11 +1570,12 @@ rb_vm_mark(void *ptr)
     if (ptr) {
 	rb_vm_t *vm = ptr;
 	if (vm->living_threads) {
-	    st_foreach(vm->living_threads, vm_mark_each_thread_func, 0);
+	    st_foreach_nocheck(vm->living_threads, vm_mark_each_thread_func, 0);
 	}
 	RUBY_MARK_UNLESS_NULL(vm->thgroup_default);
 	RUBY_MARK_UNLESS_NULL(vm->mark_object_ary);
 	RUBY_MARK_UNLESS_NULL(vm->load_path);
+	RUBY_MARK_UNLESS_NULL(vm->load_path_expanded_cache);
 	RUBY_MARK_UNLESS_NULL(vm->loaded_features);
 	RUBY_MARK_UNLESS_NULL(vm->top_self);
 	RUBY_MARK_UNLESS_NULL(vm->coverages);
@@ -2202,8 +2203,8 @@ void
 Init_BareVM(void)
 {
     /* VM bootstrap: phase 1 */
-    rb_vm_t * vm = malloc(sizeof(*vm));
-    rb_thread_t * th = malloc(sizeof(*th));
+    rb_vm_t * vm = ruby_mimmalloc(sizeof(*vm));
+    rb_thread_t * th = ruby_mimmalloc(sizeof(*th));
     if (!vm || !th) {
 	fprintf(stderr, "[FATAL] failed to allocate memory\n");
 	exit(EXIT_FAILURE);
diff --git a/vm_core.h b/vm_core.h
index 7211005..e787d4b 100644
--- a/vm_core.h
+++ b/vm_core.h
@@ -298,6 +298,7 @@ typedef struct rb_vm_struct {
     /* load */
     VALUE top_self;
     VALUE load_path;
+    VALUE load_path_expanded_cache;
     VALUE loaded_features;
     struct st_table *loading_table;
 
src/rvm/patches/ruby/1.9.3/p125/gcdata.patch000066400000007545147511530530014173 0ustar00--- a/gc.c	(revision 34957)
+++ b/gc.c	(working copy)
@@ -319,16 +319,12 @@
     struct gc_list *next;
 };
 
-#define CALC_EXACT_MALLOC_SIZE 0
-
 typedef struct rb_objspace {
     struct {
 	size_t limit;
 	size_t increase;
-#if CALC_EXACT_MALLOC_SIZE
 	size_t allocated_size;
 	size_t allocations;
-#endif
     } malloc_params;
     struct {
 	size_t increment;
@@ -730,10 +726,6 @@
     }
     if (size == 0) size = 1;
 
-#if CALC_EXACT_MALLOC_SIZE
-    size += sizeof(size_t);
-#endif
-
     if ((ruby_gc_stress && !ruby_disable_gc_stress) ||
 	(malloc_increase+size) > malloc_limit) {
 	garbage_collect_with_gvl(objspace);
@@ -747,12 +739,8 @@
 {
     malloc_increase += size;
 
-#if CALC_EXACT_MALLOC_SIZE
     objspace->malloc_params.allocated_size += size;
     objspace->malloc_params.allocations++;
-    ((size_t *)mem)[0] = size;
-    mem = (size_t *)mem + 1;
-#endif
 
     return mem;
 }
@@ -791,11 +779,7 @@
     if (ruby_gc_stress && !ruby_disable_gc_stress)
 	garbage_collect_with_gvl(objspace);
 
-#if CALC_EXACT_MALLOC_SIZE
-    size += sizeof(size_t);
     objspace->malloc_params.allocated_size -= size;
-    ptr = (size_t *)ptr - 1;
-#endif
 
     mem = realloc(ptr, size);
     if (!mem) {
@@ -808,11 +792,7 @@
     }
     malloc_increase += size;
 
-#if CALC_EXACT_MALLOC_SIZE
     objspace->malloc_params.allocated_size += size;
-    ((size_t *)mem)[0] = size;
-    mem = (size_t *)mem + 1;
-#endif
 
     return mem;
 }
@@ -820,14 +800,6 @@
 static void
 vm_xfree(rb_objspace_t *objspace, void *ptr)
 {
-#if CALC_EXACT_MALLOC_SIZE
-    size_t size;
-    ptr = ((size_t *)ptr) - 1;
-    size = ((size_t*)ptr)[0];
-    objspace->malloc_params.allocated_size -= size;
-    objspace->malloc_params.allocations--;
-#endif
-
     free(ptr);
 }
 
@@ -3401,7 +3373,6 @@
 }
 
 
-#if CALC_EXACT_MALLOC_SIZE
 /*
  *  call-seq:
  *     GC.malloc_allocated_size -> Integer
@@ -3411,8 +3382,8 @@
  *  It returns the allocated size by malloc().
  */
 
-static VALUE
-gc_malloc_allocated_size(VALUE self)
+VALUE
+rb_gc_malloc_allocated_size(VALUE self)
 {
     return UINT2NUM((&rb_objspace)->malloc_params.allocated_size);
 }
@@ -3426,12 +3397,11 @@
  *  It returns the number of allocated memory object by malloc().
  */
 
-static VALUE
-gc_malloc_allocations(VALUE self)
+VALUE
+rb_gc_malloc_allocations(VALUE self)
 {
     return UINT2NUM((&rb_objspace)->malloc_params.allocations);
 }
-#endif
 
 static VALUE
 gc_profile_record_get(void)
@@ -3616,6 +3586,8 @@
     rb_define_singleton_method(rb_mGC, "start", rb_gc_start, 0);
     rb_define_singleton_method(rb_mGC, "enable", rb_gc_enable, 0);
     rb_define_singleton_method(rb_mGC, "disable", rb_gc_disable, 0);
+    rb_define_singleton_method(rb_mGC, "malloc_allocated_size", rb_gc_malloc_allocated_size, 0);
+    rb_define_singleton_method(rb_mGC, "malloc_allocations", rb_gc_malloc_allocations, 0);
     rb_define_singleton_method(rb_mGC, "stress", gc_stress_get, 0);
     rb_define_singleton_method(rb_mGC, "stress=", gc_stress_set, 1);
     rb_define_singleton_method(rb_mGC, "count", gc_count, 0);
@@ -3630,6 +3602,7 @@
     rb_define_singleton_method(rb_mProfiler, "result", gc_profile_result, 0);
     rb_define_singleton_method(rb_mProfiler, "report", gc_profile_report, -1);
     rb_define_singleton_method(rb_mProfiler, "total_time", gc_profile_total_time, 0);
+    rb_define_singleton_method(rb_mProfiler, "data", gc_profile_record_get, 0);
 
     rb_mObSpace = rb_define_module("ObjectSpace");
     rb_define_module_function(rb_mObSpace, "each_object", os_each_obj, -1);
@@ -3649,9 +3622,4 @@
     rb_define_method(rb_mKernel, "object_id", rb_obj_id, 0);
 
     rb_define_module_function(rb_mObSpace, "count_objects", count_objects, -1);
-
-#if CALC_EXACT_MALLOC_SIZE
-    rb_define_singleton_method(rb_mGC, "malloc_allocated_size", gc_malloc_allocated_size, 0);
-    rb_define_singleton_method(rb_mGC, "malloc_allocations", gc_malloc_allocations, 0);
-#endif
 }
src/rvm/patches/ruby/1.9.3/p125/cflags.patch000066400000002231147511530530014172 0ustar00--- a/configure.in
+++ b/configure.in
@@ -267,11 +267,9 @@
     cflagspat="$cflagspat;s|"`eval echo '"'"${debugflags}"'"' | sed 's/[[][|.*]]/\\&/g;s/^ */ /;s/ *$/ /'`'| |g'
 test -z "warnflags" ||
     cflagspat="$cflagspat;s|"`eval echo '"'"${warnflags}"'"' | sed 's/[[][|.*]]/\\&/g;s/^ */ /;s/ *$/ /'`'| |g'
-if test -z "${CFLAGS+set}"; then
-    cflags=`echo " $cflags " | sed "$cflagspat;s/^ *//;s/ *$//"`
-    orig_cflags="$cflags"
-    cflags="$cflags "'${optflags} ${debugflags} ${warnflags}'
-fi
+cflags=`echo " $cflags " | sed "$cflagspat;s/^ *//;s/ *$//"`
+orig_cflags="$cflags"
+cflags="$cflags "'${optflags} ${debugflags} ${warnflags}'
 if test -z "${CXXFLAGS+set}"; then
     cxxflags=`echo " $cxxflags " | sed "$cflagspat;s/^ *//;s/ *$//"`
     orig_cxxflags="$cxxflags"
@@ -511,7 +509,8 @@
     ])
 fi

-test -z "${ac_env_CFLAGS_set}" -a -n "${cflags+set}" && eval CFLAGS="\"$cflags $ARCH_FLAG\""
+test -z "${ac_env_CFLAGS_set}" && CFLAGS="$ARCH_FLAG"
+test -n "${cflags:+set}" && eval CFLAGS="\"$cflags\${CFLAGS:+ $CFLAGS}\""
 test -z "${ac_env_CXXFLAGS_set}" -a -n "${cxxflags+set}" && eval CXXFLAGS="\"$cxxflags $ARCH_FLAG\""

 dnl check for large file stuff
src/rvm/patches/ruby/1.9.3/p125/osx-arch-fix.patch000066400000000617147511530530015251 0ustar00diff --git a/Makefile.in b/Makefile.in
index 656ae90..f976cf1 100644
--- a/Makefile.in
+++ b/Makefile.in
@@ -45,7 +45,7 @@ XLDFLAGS = @XLDFLAGS@ $(EXTLDFLAGS)
 EXTLIBS = 
 LIBS = @LIBS@ $(EXTLIBS)
 MISSING = @LIBOBJS@ @ALLOCA@
-LDSHARED = @LIBRUBY_LDSHARED@
+LDSHARED = @LIBRUBY_LDSHARED@ $(LDFLAGS)
 DLDFLAGS = @LIBRUBY_DLDFLAGS@ $(EXTLDFLAGS) @ARCH_FLAG@
 SOLIBS = @SOLIBS@
 MAINLIBS = @MAINLIBS@
src/rvm/patches/ruby/1.9.3/support_joke.patch000066400000000327147511530530014774 0ustar00--- a/vm_opts.h
+++ b/vm_opts.h
@@ -46,6 +46,6 @@
 #define OPT_STACK_CACHING            0
 
 /* misc */
-#define SUPPORT_JOKE                 0
+#define SUPPORT_JOKE                 1
 
 #endif /* RUBY_VM_OPTS_H */
src/rvm/patches/ruby/1.9.3/p429/bsd-shell-fix.patch000066400000000600147511530530015401 0ustar00--- a/Makefile.in
+++ b/Makefile.in
@@ -169,7 +169,6 @@
 		@$(RM) $@
 		$(ECHO) linking $@
 		$(Q) $(PURIFY) $(CC) $(LDFLAGS) $(XLDFLAGS) $(MAINOBJ) $(EXTOBJS) $(LIBRUBYARG) $(MAINLIBS) $(LIBS) $(OUTFLAG)$@
-		$(Q) $(POSTLINK)
 
 # We must `rm' the library each time this rule is invoked because "updating" a
 # MAB library on Apple/NeXT (see --enable-fat-binary in configure) is not
src/rvm/patches/ruby/1.9.3/p194/ruby-multilib.patch000066400000006737147511530530015560 0ustar00diff -u -wr a/configure.in b/configure.in
--- a/configure.in  2012-04-18 16:09:04.000000000 +0200
+++ b/configure.in  2012-10-08 04:34:25.722227142 +0200
@@ -2354,6 +2354,14 @@
   if test "$rb_cv_binary_elf" = yes; then
     SOLIBS='$(LIBS)'
   fi
+
+  # libdir can be overridden in config.site file (on OpenSUSE at least).
+  libdir_basename=lib
+  if test "$bindir" = '${exec_prefix}/bin'; then
+    AS_CASE(["$libdir"], ['${exec_prefix}/'*], [libdir_basename=`basename "$libdir"`])
+  fi
+  AC_DEFINE_UNQUOTED(LIBDIR_BASENAME, ["${libdir_basename}"])
+
   AS_CASE(["$target_os"],
     [sunos4*], [
  LIBRUBY_ALIASES='lib$(RUBY_SO_NAME).so.$(MAJOR).$(MINOR) lib$(RUBY_SO_NAME).so'
@@ -2362,7 +2370,7 @@
  LIBRUBY_DLDFLAGS='-Wl,-soname,lib$(RUBY_SO_NAME).so.$(MAJOR).$(MINOR)'
  LIBRUBY_ALIASES='lib$(RUBY_SO_NAME).so.$(MAJOR).$(MINOR) lib$(RUBY_SO_NAME).so'
  if test "$load_relative" = yes; then
-	    LIBRUBY_RPATHFLAGS="'-Wl,-rpath,\$\${ORIGIN}/../lib'"
+	    LIBRUBY_RPATHFLAGS="'-Wl,-rpath,\$\${ORIGIN}/../${libdir_basename}'"
      LIBRUBY_RELATIVE=yes
  fi
  ],
@@ -2419,7 +2427,7 @@
  RUBY_SO_NAME="$RUBY_SO_NAME"'.$(MAJOR).$(MINOR).$(TEENY)'
  LIBRUBY_LDSHARED='$(CC) -dynamiclib'
  if test "$load_relative" = yes; then
-	    libprefix='@executable_path/../lib'
+	    libprefix='@executable_path/../${libdir_basename}'
      LIBRUBY_RELATIVE=yes
  fi
  LIBRUBY_DLDFLAGS="$LIBRUBY_DLDFLAGS "'-install_name '${libprefix}'/$(LIBRUBY_SO)'
diff -u -wr a/ruby.c b/ruby.c
--- a/ruby.c  2012-02-06 21:35:30.000000000 +0100
+++ b/ruby.c  2012-10-08 04:40:59.940293797 +0200
@@ -410,9 +410,21 @@
 #endif
     p = strrchr(libpath, '/');
     if (p) {
+      static const char bindir[] = "/bin";
+#ifdef LIBDIR_BASENAME
+      static const char libdir[] = "/"LIBDIR_BASENAME;
+#else
+      static const char libdir[] = "/lib";
+#endif
+      const ptrdiff_t bindir_len = (ptrdiff_t)sizeof(bindir) - 1;
+      const ptrdiff_t libdir_len = (ptrdiff_t)sizeof(libdir) - 1;
	*p = 0;
-	if (p - libpath > 3 && !(STRCASECMP(p - 4, "/bin") && strcmp(p - 4, "/lib"))) {
-	    p -= 4;
+   if (p - libpath >= bindir_len && !STRCASECMP(p - bindir_len, bindir)) {
+     p -= bindir_len;
+     *p = 0;
+   }
+   else if (p - libpath >= libdir_len && !strcmp(p - libdir_len, libdir)) {
+     p -= libdir_len;
      *p = 0;
  }
     }
diff -u -wr a/tool/mkconfig.rb b/tool/mkconfig.rb
--- a/tool/mkconfig.rb	2012-10-08 05:57:16.948702976 +0200
+++ b/tool/mkconfig.rb	2011-08-13 15:17:30.000000000 +0200
@@ -40,6 +40,7 @@
 v_fast = []
 v_others = []
 vars = {}
+v_runtime = {}
 continued_name = nil
 continued_line = nil
 File.foreach "config.status" do |line|
@@ -118,7 +119,10 @@
     val = val.gsub(/\$(?:\$|\{?(\w+)\}?)/) {$1 ? "$(#{$1})" : $&}.dump
     case name
     when /^prefix$/
+      v_runtime[:prefix] = val.slice(1..-2)
       val = "(TOPDIR || DESTDIR + #{val})"
+    when /^libdir$/
+      v_runtime[:libdir] = File.basename(val.slice(1..-2))
     when /^ARCH_FLAG$/
       val = "arch_flag || #{val}" if universal
     when /^UNIVERSAL_ARCHNAMES$/
@@ -145,7 +149,7 @@
 
 drive = File::PATH_SEPARATOR == ';'
 
-prefix = "/lib/ruby/#{version}/#{arch}"
+prefix = "/#{v_runtime[:libdir]}/ruby/#{version}/#{arch}"
 print "  TOPDIR = File.dirname(__FILE__).chomp!(#{prefix.dump})\n"
 print "  DESTDIR = ", (drive ? "TOPDIR && TOPDIR[/\\A[a-z]:/i] || " : ""), "'' unless defined? DESTDIR\n"
 print <<'ARCH' if universal
@@ -190,6 +194,7 @@
     x
   end
 end
+v_others.map!{|x| x.gsub(v_runtime[:prefix], "$(prefix)") }
 v_others.compact!
 
 if $install_name
src/rvm/patches/ruby/1.9.3/p194/cflags.patch000066400000002231147511530530014200 0ustar00--- a/configure.in
+++ b/configure.in
@@ -267,11 +267,9 @@
     cflagspat="$cflagspat;s|"`eval echo '"'"${debugflags}"'"' | sed 's/[[][|.*]]/\\&/g;s/^ */ /;s/ *$/ /'`'| |g'
 test -z "warnflags" ||
     cflagspat="$cflagspat;s|"`eval echo '"'"${warnflags}"'"' | sed 's/[[][|.*]]/\\&/g;s/^ */ /;s/ *$/ /'`'| |g'
-if test -z "${CFLAGS+set}"; then
-    cflags=`echo " $cflags " | sed "$cflagspat;s/^ *//;s/ *$//"`
-    orig_cflags="$cflags"
-    cflags="$cflags "'${optflags} ${debugflags} ${warnflags}'
-fi
+cflags=`echo " $cflags " | sed "$cflagspat;s/^ *//;s/ *$//"`
+orig_cflags="$cflags"
+cflags="$cflags "'${optflags} ${debugflags} ${warnflags}'
 if test -z "${CXXFLAGS+set}"; then
     cxxflags=`echo " $cxxflags " | sed "$cflagspat;s/^ *//;s/ *$//"`
     orig_cxxflags="$cxxflags"
@@ -511,7 +509,8 @@
     ])
 fi

-test -z "${ac_env_CFLAGS_set}" -a -n "${cflags+set}" && eval CFLAGS="\"$cflags $ARCH_FLAG\""
+test -z "${ac_env_CFLAGS_set}" && CFLAGS="$ARCH_FLAG"
+test -n "${cflags:+set}" && eval CFLAGS="\"$cflags\${CFLAGS:+ $CFLAGS}\""
 test -z "${ac_env_CXXFLAGS_set}" -a -n "${cxxflags+set}" && eval CXXFLAGS="\"$cxxflags $ARCH_FLAG\""

 dnl check for large file stuff
src/rvm/patches/ruby/1.9.3/p194/falcon.diff000066400000370602147511530530014026 0ustar00diff --git a/common.mk b/common.mk
index eb89a2b..59cdfe4 100644
--- a/common.mk
+++ b/common.mk
@@ -630,7 +630,8 @@ file.$(OBJEXT): {$(VPATH)}file.c $(RUBY_H_INCLUDES) {$(VPATH)}io.h \
 gc.$(OBJEXT): {$(VPATH)}gc.c $(RUBY_H_INCLUDES) {$(VPATH)}re.h \
   {$(VPATH)}regex.h $(ENCODING_H_INCLUDES) $(VM_CORE_H_INCLUDES) \
   {$(VPATH)}gc.h {$(VPATH)}io.h {$(VPATH)}eval_intern.h {$(VPATH)}util.h \
-  {$(VPATH)}debug.h {$(VPATH)}internal.h {$(VPATH)}constant.h
+  {$(VPATH)}debug.h {$(VPATH)}internal.h {$(VPATH)}constant.h \
+  {$(VPATH)}pool_alloc.inc.h {$(VPATH)}pool_alloc.h
 hash.$(OBJEXT): {$(VPATH)}hash.c $(RUBY_H_INCLUDES) {$(VPATH)}util.h \
   $(ENCODING_H_INCLUDES)
 inits.$(OBJEXT): {$(VPATH)}inits.c $(RUBY_H_INCLUDES) \
@@ -693,7 +694,7 @@ signal.$(OBJEXT): {$(VPATH)}signal.c $(RUBY_H_INCLUDES) \
   $(VM_CORE_H_INCLUDES) {$(VPATH)}debug.h
 sprintf.$(OBJEXT): {$(VPATH)}sprintf.c $(RUBY_H_INCLUDES) {$(VPATH)}re.h \
   {$(VPATH)}regex.h {$(VPATH)}vsnprintf.c $(ENCODING_H_INCLUDES)
-st.$(OBJEXT): {$(VPATH)}st.c $(RUBY_H_INCLUDES)
+st.$(OBJEXT): {$(VPATH)}st.c $(RUBY_H_INCLUDES) {$(VPATH)}pool_alloc.h
 strftime.$(OBJEXT): {$(VPATH)}strftime.c $(RUBY_H_INCLUDES) \
   {$(VPATH)}timev.h
 string.$(OBJEXT): {$(VPATH)}string.c $(RUBY_H_INCLUDES) {$(VPATH)}re.h \
diff --git a/configure.in b/configure.in
index 6d24689..1e15b10 100644
--- a/configure.in
+++ b/configure.in
@@ -1315,6 +1315,29 @@ main() {
 CFLAGS="$save_CFLAGS"])
 AC_DEFINE_UNQUOTED(GC_MARK_STACKFRAME_WORD, $rb_cv_gc_mark_stackframe_word)
 
+AS_CASE(["$target_os"],
+[openbsd*], [
+  AC_CACHE_CHECK(for heap align log on openbsd, rb_cv_page_size_log,
+    [rb_cv_page_size_log=no
+     for page_log in 12 13; do
+       AC_TRY_RUN([
+#include <math.h>
+#include <unistd.h>
+
+int
+main() {
+  if ((int)log2((double)sysconf(_SC_PAGESIZE)) != $page_log) return 1;
+  return 0;
+}
+       ],
+       rb_cv_page_size_log="$page_log"; break)
+     done])
+  if test $rb_cv_page_size_log != no; then
+    AC_DEFINE_UNQUOTED(HEAP_ALIGN_LOG, $rb_cv_page_size_log)
+  else
+    AC_DEFINE_UNQUOTED(HEAP_ALIGN_LOG, 12)
+  fi
+])
 
 dnl Checks for library functions.
 AC_TYPE_GETGROUPS
@@ -1415,7 +1438,8 @@ AC_CHECK_FUNCS(fmod killpg wait4 waitpid fork spawnv syscall __syscall chroot ge
 	      setsid telldir seekdir fchmod cosh sinh tanh log2 round\
 	      setuid setgid daemon select_large_fdset setenv unsetenv\
               mktime timegm gmtime_r clock_gettime gettimeofday poll ppoll\
-              pread sendfile shutdown sigaltstack dl_iterate_phdr)
+              pread sendfile shutdown sigaltstack dl_iterate_phdr\
+              dup3 pipe2 posix_memalign memalign)
 
 AC_CACHE_CHECK(for unsetenv returns a value, rb_cv_unsetenv_return_value,
   [AC_TRY_COMPILE([
diff --git a/ext/-test-/st/numhash/numhash.c b/ext/-test-/st/numhash/numhash.c
index e186cd4..53d9e1b 100644
--- a/ext/-test-/st/numhash/numhash.c
+++ b/ext/-test-/st/numhash/numhash.c
@@ -54,7 +54,7 @@ numhash_i(st_data_t key, st_data_t value, st_data_t arg, int error)
 static VALUE
 numhash_each(VALUE self)
 {
-    return st_foreach((st_table *)DATA_PTR(self), numhash_i, self) ? Qtrue : Qfalse;
+    return st_foreach_check((st_table *)DATA_PTR(self), numhash_i, self, 0) ? Qtrue : Qfalse;
 }
 
 void
diff --git a/file.c b/file.c
index 67b281a..e89a559 100644
--- a/file.c
+++ b/file.c
@@ -164,6 +164,10 @@ rb_get_path_check(VALUE obj, int level)
     }
     StringValue(tmp);
 
+    if (RBASIC(obj)->klass == rb_cExpandedPath) {
+        return obj;
+    }
+
     tmp = file_path_convert(tmp);
     if (obj != tmp && insecure_obj_p(tmp, level)) {
 	rb_insecure_operation();
@@ -2864,6 +2868,16 @@ file_expand_path(VALUE fname, VALUE dname, int abs_mode, VALUE result)
     BUFINIT();
     tainted = OBJ_TAINTED(fname);
 
+    if (RBASIC(fname)->klass == rb_cExpandedPath) {
+        size_t dlen = RSTRING_LEN(fname);
+        BUFCHECK(dlen > buflen);
+        strncpy(buf, RSTRING_PTR(fname), dlen + 1);
+        rb_str_set_len(result, dlen);
+        rb_enc_associate(result, rb_enc_check(result, fname));
+        ENC_CODERANGE_CLEAR(result);
+        return result;
+    }
+
     if (s[0] == '~' && abs_mode == 0) {      /* execute only if NOT absolute_path() */
 	long userlen = 0;
 	tainted = 1;
diff --git a/gc.c b/gc.c
index e65d0ec..a72a855 100644
--- a/gc.c
+++ b/gc.c
@@ -20,10 +20,12 @@
 #include "vm_core.h"
 #include "internal.h"
 #include "gc.h"
+#include "pool_alloc.h"
 #include "constant.h"
 #include <stdio.h>
 #include <setjmp.h>
 #include <sys/types.h>
+#include <assert.h>
 
 #ifdef HAVE_SYS_TIME_H
 #include <sys/time.h>
@@ -35,7 +37,12 @@
 
 #if defined _WIN32 || defined __CYGWIN__
 #include <windows.h>
+#elif defined(HAVE_POSIX_MEMALIGN)
+#elif defined(HAVE_MEMALIGN)
+#include <malloc.h>
 #endif
+static void aligned_free(void *);
+static void *aligned_malloc(size_t alignment, size_t size);
 
 #ifdef HAVE_VALGRIND_MEMCHECK_H
 # include <valgrind/memcheck.h>
@@ -84,10 +91,12 @@ typedef struct {
     unsigned int initial_malloc_limit;
     unsigned int initial_heap_min_slots;
     unsigned int initial_free_min;
+#if defined(ENABLE_VM_OBJSPACE) && ENABLE_VM_OBJSPACE
     int gc_stress;
+#endif
 } ruby_gc_params_t;
 
-ruby_gc_params_t initial_params = {
+static ruby_gc_params_t initial_params = {
     GC_MALLOC_LIMIT,
     HEAP_MIN_SLOTS,
     FREE_MIN,
@@ -103,7 +112,10 @@ ruby_gc_params_t initial_params = {
 int ruby_gc_debug_indent = 0;
 
 /* for GC profile */
+#ifndef GC_PROFILE_MORE_DETAIL
 #define GC_PROFILE_MORE_DETAIL 0
+#endif
+
 typedef struct gc_profile_record {
     double gc_time;
     double gc_mark_time;
@@ -301,17 +313,20 @@ typedef struct RVALUE {
 #endif
 
 struct heaps_slot {
-    void *membase;
-    RVALUE *slot;
-    size_t limit;
+    struct heaps_header *membase;
+    RVALUE *freelist;
     struct heaps_slot *next;
     struct heaps_slot *prev;
+    struct heaps_slot *free_next;
+    uintptr_t bits[1];
 };
 
-struct sorted_heaps_slot {
+struct heaps_header {
+    struct heaps_slot *base;
+    uintptr_t *bits;
     RVALUE *start;
     RVALUE *end;
-    struct heaps_slot *slot;
+    size_t limit;
 };
 
 struct gc_list {
@@ -319,7 +334,27 @@ struct gc_list {
     struct gc_list *next;
 };
 
+#ifndef CALC_EXACT_MALLOC_SIZE
 #define CALC_EXACT_MALLOC_SIZE 0
+#endif
+
+#ifdef POOL_ALLOC_API
+/* POOL ALLOC API */
+#define POOL_ALLOC_PART 1
+#include "pool_alloc.inc.h"
+#undef POOL_ALLOC_PART
+
+typedef struct pool_layout_t pool_layout_t;
+struct pool_layout_t {
+    pool_header
+      p6,  /* st_table && st_table_entry */
+      p11;  /* st_table.bins init size */
+} pool_layout = {
+    INIT_POOL(void*[6]),
+    INIT_POOL(void*[11])
+};
+static void pool_finalize_header(pool_header *header);
+#endif
 
 typedef struct rb_objspace {
     struct {
@@ -330,16 +365,19 @@ typedef struct rb_objspace {
 	size_t allocations;
 #endif
     } malloc_params;
+#ifdef POOL_ALLOC_API
+    pool_layout_t *pool_headers;
+#endif
     struct {
 	size_t increment;
 	struct heaps_slot *ptr;
 	struct heaps_slot *sweep_slots;
-	struct sorted_heaps_slot *sorted;
+	struct heaps_slot *free_slots;
+	struct heaps_header **sorted;
 	size_t length;
 	size_t used;
-	RVALUE *freelist;
+        struct heaps_slot *reserve_slots;
 	RVALUE *range[2];
-	RVALUE *freed;
 	size_t live_num;
 	size_t free_num;
 	size_t free_min;
@@ -350,6 +388,7 @@ typedef struct rb_objspace {
 	int dont_gc;
 	int dont_lazy_sweep;
 	int during_gc;
+	rb_atomic_t finalizing;
     } flags;
     struct {
 	st_table *table;
@@ -377,7 +416,11 @@ typedef struct rb_objspace {
 #define ruby_initial_gc_stress	initial_params.gc_stress
 int *ruby_initial_gc_stress_ptr = &ruby_initial_gc_stress;
 #else
+#  ifdef POOL_ALLOC_API
+static rb_objspace_t rb_objspace = {{GC_MALLOC_LIMIT}, &pool_layout, {HEAP_MIN_SLOTS}};
+#  else
 static rb_objspace_t rb_objspace = {{GC_MALLOC_LIMIT}, {HEAP_MIN_SLOTS}};
+#  endif
 int *ruby_initial_gc_stress_ptr = &rb_objspace.gc_stress;
 #endif
 #define malloc_limit		objspace->malloc_params.limit
@@ -385,13 +428,12 @@ int *ruby_initial_gc_stress_ptr = &rb_objspace.gc_stress;
 #define heaps			objspace->heap.ptr
 #define heaps_length		objspace->heap.length
 #define heaps_used		objspace->heap.used
-#define freelist		objspace->heap.freelist
 #define lomem			objspace->heap.range[0]
 #define himem			objspace->heap.range[1]
 #define heaps_inc		objspace->heap.increment
-#define heaps_freed		objspace->heap.freed
 #define dont_gc 		objspace->flags.dont_gc
 #define during_gc		objspace->flags.during_gc
+#define finalizing		objspace->flags.finalizing
 #define finalizer_table 	objspace->final.table
 #define deferred_final_list	objspace->final.deferred
 #define mark_stack		objspace->markstack.buffer
@@ -403,7 +445,16 @@ int *ruby_initial_gc_stress_ptr = &rb_objspace.gc_stress;
 #define initial_heap_min_slots	initial_params.initial_heap_min_slots
 #define initial_free_min	initial_params.initial_free_min
 
+#define is_lazy_sweeping(objspace) ((objspace)->heap.sweep_slots != 0)
+
+#define nonspecial_obj_id(obj) (VALUE)((SIGNED_VALUE)(obj)|FIXNUM_FLAG)
+
+#define HEAP_HEADER(p) ((struct heaps_header *)(p))
+
 static void rb_objspace_call_finalizer(rb_objspace_t *objspace);
+static VALUE define_final0(VALUE obj, VALUE block);
+VALUE rb_define_final(VALUE obj, VALUE block);
+VALUE rb_undefine_final(VALUE obj);
 
 #if defined(ENABLE_VM_OBJSPACE) && ENABLE_VM_OBJSPACE
 rb_objspace_t *
@@ -413,6 +464,10 @@ rb_objspace_alloc(void)
     memset(objspace, 0, sizeof(*objspace));
     malloc_limit = initial_malloc_limit;
     ruby_gc_stress = ruby_initial_gc_stress;
+#ifdef POOL_ALLOC_API
+    objspace->pool_headers = (pool_layout_t*) malloc(sizeof(pool_layout));
+    memcpy(objspace->pool_headers, &pool_layout, sizeof(pool_layout));
+#endif
 
     return objspace;
 }
@@ -478,40 +533,60 @@ rb_objspace_free(rb_objspace_t *objspace)
 	struct gc_list *list, *next;
 	for (list = global_List; list; list = next) {
 	    next = list->next;
-	    free(list);
+	    xfree(list);
 	}
     }
+    if (objspace->heap.reserve_slots) {
+        struct heaps_slot *list, *next;
+        for (list = objspace->heap.reserve_slots; list; list = next) {
+            next = list->free_next;
+            free(list);
+        }
+    }
     if (objspace->heap.sorted) {
 	size_t i;
 	for (i = 0; i < heaps_used; ++i) {
-	    free(objspace->heap.sorted[i].slot->membase);
-	    free(objspace->heap.sorted[i].slot);
+            free(objspace->heap.sorted[i]->base);
+	    aligned_free(objspace->heap.sorted[i]);
 	}
 	free(objspace->heap.sorted);
 	heaps_used = 0;
 	heaps = 0;
     }
+#ifdef POOL_ALLOC_API
+    if (objspace->pool_headers) {
+        pool_finalize_header(&objspace->pool_headers->p6);
+        pool_finalize_header(&objspace->pool_headers->p11);
+        free(objspace->pool_headers);
+    }
+#endif
     free(objspace);
 }
 #endif
 
-/* tiny heap size */
-/* 32KB */
-/*#define HEAP_SIZE 0x8000 */
-/* 128KB */
-/*#define HEAP_SIZE 0x20000 */
-/* 64KB */
-/*#define HEAP_SIZE 0x10000 */
-/* 16KB */
-#define HEAP_SIZE 0x4000
-/* 8KB */
-/*#define HEAP_SIZE 0x2000 */
-/* 4KB */
-/*#define HEAP_SIZE 0x1000 */
-/* 2KB */
-/*#define HEAP_SIZE 0x800 */
-
-#define HEAP_OBJ_LIMIT (unsigned int)(HEAP_SIZE / sizeof(struct RVALUE))
+#ifndef HEAP_ALIGN_LOG
+/* default tiny heap size: 16KB */
+#define HEAP_ALIGN_LOG 15
+#endif
+#define HEAP_ALIGN (1UL << HEAP_ALIGN_LOG)
+#define HEAP_ALIGN_MASK (~(~0UL << HEAP_ALIGN_LOG))
+#define REQUIRED_SIZE_BY_MALLOC (sizeof(size_t) * 5)
+#define HEAP_SIZE (HEAP_ALIGN - REQUIRED_SIZE_BY_MALLOC)
+#define CEILDIV(i, mod) (((i) + (mod) - 1)/(mod))
+
+#define HEAP_OBJ_LIMIT (unsigned int)((HEAP_SIZE - sizeof(struct heaps_header))/sizeof(struct RVALUE))
+#define HEAP_BITMAP_LIMIT CEILDIV(CEILDIV(HEAP_SIZE, sizeof(struct RVALUE)), sizeof(uintptr_t)*8)
+#define HEAP_SLOT_SIZE (sizeof(struct heaps_slot) + (HEAP_BITMAP_LIMIT-1) * sizeof(uintptr_t))
+
+#define GET_HEAP_HEADER(x) (HEAP_HEADER(((uintptr_t)x) & ~(HEAP_ALIGN_MASK)))
+#define GET_HEAP_SLOT(x) (GET_HEAP_HEADER(x)->base)
+#define GET_HEAP_BITMAP(x) (GET_HEAP_HEADER(x)->bits)
+#define NUM_IN_SLOT(p) (((uintptr_t)p & HEAP_ALIGN_MASK)/sizeof(RVALUE))
+#define BITMAP_INDEX(p) (NUM_IN_SLOT(p) / (sizeof(uintptr_t) * 8))
+#define BITMAP_OFFSET(p) (NUM_IN_SLOT(p) & ((sizeof(uintptr_t) * 8)-1))
+#define MARKED_IN_BITMAP(bits, p) (bits[BITMAP_INDEX(p)] & ((uintptr_t)1 << BITMAP_OFFSET(p)))
+#define MARK_IN_BITMAP(bits, p) (bits[BITMAP_INDEX(p)] = bits[BITMAP_INDEX(p)] | ((uintptr_t)1 << BITMAP_OFFSET(p)))
+#define CLEAR_IN_BITMAP(bits, p) (bits[BITMAP_INDEX(p)] &= ~((uintptr_t)1 << BITMAP_OFFSET(p)))
 
 extern st_table *rb_class_tbl;
 
@@ -823,8 +898,10 @@ vm_xfree(rb_objspace_t *objspace, void *ptr)
     size_t size;
     ptr = ((size_t *)ptr) - 1;
     size = ((size_t*)ptr)[0];
-    objspace->malloc_params.allocated_size -= size;
-    objspace->malloc_params.allocations--;
+    if (size) {
+	objspace->malloc_params.allocated_size -= size;
+	objspace->malloc_params.allocations--;
+    }
 #endif
 
     free(ptr);
@@ -894,6 +971,27 @@ ruby_xfree(void *x)
 	vm_xfree(&rb_objspace, x);
 }
 
+#ifdef POOL_ALLOC_API
+/* POOL ALLOC API */
+#define POOL_ALLOC_PART 2
+#include "pool_alloc.inc.h"
+#undef POOL_ALLOC_PART
+
+void
+ruby_xpool_free(void *ptr)
+{
+    pool_free_entry((void**)ptr);
+}
+
+#define CONCRET_POOL_MALLOC(pnts) \
+void * ruby_xpool_malloc_##pnts##p () { \
+    return pool_alloc_entry(&rb_objspace.pool_headers->p##pnts ); \
+}
+CONCRET_POOL_MALLOC(6)
+CONCRET_POOL_MALLOC(11)
+#undef CONCRET_POOL_MALLOC
+
+#endif
 
 /*
  *  call-seq:
@@ -984,70 +1082,140 @@ rb_gc_unregister_address(VALUE *addr)
     }
 }
 
-
 static void
 allocate_sorted_heaps(rb_objspace_t *objspace, size_t next_heaps_length)
 {
-    struct sorted_heaps_slot *p;
-    size_t size;
+    struct heaps_header **p;
+    struct heaps_slot *slot;
+    size_t size, add, i;
 
-    size = next_heaps_length*sizeof(struct sorted_heaps_slot);
+    size = next_heaps_length*sizeof(struct heaps_header *);
+    add = next_heaps_length - heaps_used;
 
     if (heaps_used > 0) {
-	p = (struct sorted_heaps_slot *)realloc(objspace->heap.sorted, size);
+	p = (struct heaps_header **)realloc(objspace->heap.sorted, size);
 	if (p) objspace->heap.sorted = p;
     }
     else {
-	p = objspace->heap.sorted = (struct sorted_heaps_slot *)malloc(size);
+	p = objspace->heap.sorted = (struct heaps_header **)malloc(size);
     }
 
     if (p == 0) {
 	during_gc = 0;
 	rb_memerror();
     }
-    heaps_length = next_heaps_length;
+
+    for (i = 0; i < add; i++) {
+        slot = (struct heaps_slot *)malloc(HEAP_SLOT_SIZE);
+        if (slot == 0) {
+            during_gc = 0;
+            rb_memerror();
+            return;
+        }
+        slot->free_next = objspace->heap.reserve_slots;
+        objspace->heap.reserve_slots = slot;
+    }
+}
+
+static void *
+aligned_malloc(size_t alignment, size_t size)
+{
+    void *res;
+
+#if defined __MINGW32__
+    res = __mingw_aligned_malloc(size, alignment);
+#elif defined _WIN32 && !defined __CYGWIN__
+    res = _aligned_malloc(size, alignment);
+#elif defined(HAVE_POSIX_MEMALIGN)
+    if (posix_memalign(&res, alignment, size) == 0) {
+        return res;
+    }
+    else {
+        return NULL;
+    }
+#elif defined(HAVE_MEMALIGN)
+    res = memalign(alignment, size);
+#else
+    char* aligned;
+    res = malloc(alignment + size + sizeof(void*));
+    aligned = (char*)res + alignment + sizeof(void*);
+    aligned -= ((VALUE)aligned & (alignment - 1));
+    ((void**)aligned)[-1] = res;
+    res = (void*)aligned;
+#endif
+
+#if defined(_DEBUG) || defined(GC_DEBUG)
+    /* alignment must be a power of 2 */
+    assert((alignment - 1) & alignment == 0);
+    assert(alignment % sizeof(void*) == 0);
+#endif
+    return res;
+}
+
+static void
+aligned_free(void *ptr)
+{
+#if defined __MINGW32__
+    __mingw_aligned_free(ptr);
+#elif defined _WIN32 && !defined __CYGWIN__
+    _aligned_free(ptr);
+#elif defined(HAVE_MEMALIGN) || defined(HAVE_POSIX_MEMALIGN)
+    free(ptr);
+#else
+    free(((void**)ptr)[-1]);
+#endif
+}
+
+static void
+link_free_heap_slot(rb_objspace_t *objspace, struct heaps_slot *slot)
+{
+    slot->free_next = objspace->heap.free_slots;
+    objspace->heap.free_slots = slot;
+}
+
+static void
+unlink_free_heap_slot(rb_objspace_t *objspace, struct heaps_slot *slot)
+{
+    objspace->heap.free_slots = slot->free_next;
+    slot->free_next = NULL;
 }
 
 static void
 assign_heap_slot(rb_objspace_t *objspace)
 {
-    RVALUE *p, *pend, *membase;
+    RVALUE *p, *pend;
+    struct heaps_header *membase;
     struct heaps_slot *slot;
     size_t hi, lo, mid;
     size_t objs;
 
     objs = HEAP_OBJ_LIMIT;
-    p = (RVALUE*)malloc(HEAP_SIZE);
-    if (p == 0) {
-	during_gc = 0;
-	rb_memerror();
-    }
-    slot = (struct heaps_slot *)malloc(sizeof(struct heaps_slot));
-    if (slot == 0) {
-	xfree(p);
+    membase = (struct heaps_header*)aligned_malloc(HEAP_ALIGN, HEAP_SIZE);
+    if (membase == 0) {
 	during_gc = 0;
 	rb_memerror();
     }
+    assert(objspace->heap.reserve_slots != NULL);
+    slot = objspace->heap.reserve_slots;
+    objspace->heap.reserve_slots = slot->free_next;
     MEMZERO((void*)slot, struct heaps_slot, 1);
 
     slot->next = heaps;
     if (heaps) heaps->prev = slot;
     heaps = slot;
 
-    membase = p;
+    p = (RVALUE*)((VALUE)membase + sizeof(struct heaps_header));
     if ((VALUE)p % sizeof(RVALUE) != 0) {
-	p = (RVALUE*)((VALUE)p + sizeof(RVALUE) - ((VALUE)p % sizeof(RVALUE)));
-	if ((HEAP_SIZE - HEAP_OBJ_LIMIT * sizeof(RVALUE)) < (size_t)((char*)p - (char*)membase)) {
-	    objs--;
-	}
+       p = (RVALUE*)((VALUE)p + sizeof(RVALUE) - ((VALUE)p % sizeof(RVALUE)));
+       objs = (HEAP_SIZE - (size_t)((VALUE)p - (VALUE)membase))/sizeof(RVALUE);
     }
 
     lo = 0;
     hi = heaps_used;
     while (lo < hi) {
-	register RVALUE *mid_membase;
+	register struct heaps_header *mid_membase;
 	mid = (lo + hi) / 2;
-	mid_membase = objspace->heap.sorted[mid].slot->membase;
+        mid_membase = objspace->heap.sorted[mid];
 	if (mid_membase < membase) {
 	    lo = mid + 1;
 	}
@@ -1059,14 +1227,16 @@ assign_heap_slot(rb_objspace_t *objspace)
 	}
     }
     if (hi < heaps_used) {
-	MEMMOVE(&objspace->heap.sorted[hi+1], &objspace->heap.sorted[hi], struct sorted_heaps_slot, heaps_used - hi);
-    }
-    objspace->heap.sorted[hi].slot = slot;
-    objspace->heap.sorted[hi].start = p;
-    objspace->heap.sorted[hi].end = (p + objs);
+	MEMMOVE(&objspace->heap.sorted[hi+1], &objspace->heap.sorted[hi], struct heaps_header*, heaps_used - hi);
+    }
+    objspace->heap.sorted[hi] = membase;
+    membase->start = p;
+    membase->end = (p + objs);
+    membase->base = heaps;
+    membase->bits = heaps->bits;
+    membase->limit = objs;
     heaps->membase = membase;
-    heaps->slot = p;
-    heaps->limit = objs;
+    memset(heaps->bits, 0, HEAP_BITMAP_LIMIT * sizeof(uintptr_t));
     objspace->heap.free_num += objs;
     pend = p + objs;
     if (lomem == 0 || lomem > p) lomem = p;
@@ -1075,19 +1245,24 @@ assign_heap_slot(rb_objspace_t *objspace)
 
     while (p < pend) {
 	p->as.free.flags = 0;
-	p->as.free.next = freelist;
-	freelist = p;
+	p->as.free.next = heaps->freelist;
+	heaps->freelist = p;
 	p++;
     }
+    link_free_heap_slot(objspace, heaps);
 }
 
 static void
 add_heap_slots(rb_objspace_t *objspace, size_t add)
 {
     size_t i;
+    size_t next_heaps_length;
 
-    if ((heaps_used + add) > heaps_length) {
-        allocate_sorted_heaps(objspace, heaps_used + add);
+    next_heaps_length = heaps_used + add;
+
+    if (next_heaps_length > heaps_length) {
+        allocate_sorted_heaps(objspace, next_heaps_length);
+        heaps_length = next_heaps_length;
     }
 
     for (i = 0; i < add; i++) {
@@ -1137,6 +1312,7 @@ set_heaps_increment(rb_objspace_t *objspace)
 
     if (next_heaps_length > heaps_length) {
 	allocate_sorted_heaps(objspace, next_heaps_length);
+        heaps_length = next_heaps_length;
     }
 }
 
@@ -1159,6 +1335,7 @@ rb_during_gc(void)
 }
 
 #define RANY(o) ((RVALUE*)(o))
+#define has_free_object (objspace->heap.free_slots && objspace->heap.free_slots->freelist)
 
 VALUE
 rb_newobj(void)
@@ -1179,15 +1356,18 @@ rb_newobj(void)
 	}
     }
 
-    if (UNLIKELY(!freelist)) {
+    if (UNLIKELY(!has_free_object)) {
 	if (!gc_lazy_sweep(objspace)) {
 	    during_gc = 0;
 	    rb_memerror();
 	}
     }
 
-    obj = (VALUE)freelist;
-    freelist = freelist->as.free.next;
+    obj = (VALUE)objspace->heap.free_slots->freelist;
+    objspace->heap.free_slots->freelist = RANY(obj)->as.free.next;
+    if (objspace->heap.free_slots->freelist == NULL) {
+        unlink_free_heap_slot(objspace, objspace->heap.free_slots);
+    }
 
     MEMZERO((void*)obj, RVALUE, 1);
 #ifdef GC_DEBUG
@@ -1356,10 +1536,10 @@ gc_mark_all(rb_objspace_t *objspace)
 
     init_mark_stack(objspace);
     for (i = 0; i < heaps_used; i++) {
-	p = objspace->heap.sorted[i].start; pend = objspace->heap.sorted[i].end;
+	p = objspace->heap.sorted[i]->start; pend = objspace->heap.sorted[i]->end;
 	while (p < pend) {
-	    if ((p->as.basic.flags & FL_MARK) &&
-		(p->as.basic.flags != FL_MARK)) {
+	    if (MARKED_IN_BITMAP(GET_HEAP_BITMAP(p), p) &&
+		p->as.basic.flags) {
 		gc_mark_children(objspace, (VALUE)p, 0);
 	    }
 	    p++;
@@ -1387,26 +1567,27 @@ static inline int
 is_pointer_to_heap(rb_objspace_t *objspace, void *ptr)
 {
     register RVALUE *p = RANY(ptr);
-    register struct sorted_heaps_slot *heap;
+    register struct heaps_header *heap;
     register size_t hi, lo, mid;
 
     if (p < lomem || p > himem) return FALSE;
     if ((VALUE)p % sizeof(RVALUE) != 0) return FALSE;
+    heap = GET_HEAP_HEADER(p);
 
     /* check if p looks like a pointer using bsearch*/
     lo = 0;
     hi = heaps_used;
     while (lo < hi) {
 	mid = (lo + hi) / 2;
-	heap = &objspace->heap.sorted[mid];
-	if (heap->start <= p) {
-	    if (p < heap->end)
-		return TRUE;
-	    lo = mid + 1;
-	}
-	else {
-	    hi = mid;
-	}
+        if (heap > objspace->heap.sorted[mid]) {
+            lo = mid + 1;
+        }
+        else if (heap < objspace->heap.sorted[mid]) {
+            hi = mid;
+        }
+        else {
+            return (p >= heap->start && p < heap->end) ? TRUE : FALSE;
+        }
     }
     return FALSE;
 }
@@ -1449,10 +1630,10 @@ struct mark_tbl_arg {
 };
 
 static int
-mark_entry(ID key, VALUE value, st_data_t data)
+mark_entry(st_data_t key, st_data_t value, st_data_t data)
 {
     struct mark_tbl_arg *arg = (void*)data;
-    gc_mark(arg->objspace, value, arg->lev);
+    gc_mark(arg->objspace, (VALUE)value, arg->lev);
     return ST_CONTINUE;
 }
 
@@ -1467,10 +1648,10 @@ mark_tbl(rb_objspace_t *objspace, st_table *tbl, int lev)
 }
 
 static int
-mark_key(VALUE key, VALUE value, st_data_t data)
+mark_key(st_data_t key, st_data_t value, st_data_t data)
 {
     struct mark_tbl_arg *arg = (void*)data;
-    gc_mark(arg->objspace, key, arg->lev);
+    gc_mark(arg->objspace, (VALUE)key, arg->lev);
     return ST_CONTINUE;
 }
 
@@ -1491,11 +1672,11 @@ rb_mark_set(st_table *tbl)
 }
 
 static int
-mark_keyvalue(VALUE key, VALUE value, st_data_t data)
+mark_keyvalue(st_data_t key, st_data_t value, st_data_t data)
 {
     struct mark_tbl_arg *arg = (void*)data;
-    gc_mark(arg->objspace, key, arg->lev);
-    gc_mark(arg->objspace, value, arg->lev);
+    gc_mark(arg->objspace, (VALUE)key, arg->lev);
+    gc_mark(arg->objspace, (VALUE)value, arg->lev);
     return ST_CONTINUE;
 }
 
@@ -1565,7 +1746,9 @@ mark_m_tbl(rb_objspace_t *objspace, st_table *tbl, int lev)
 static int
 free_method_entry_i(ID key, rb_method_entry_t *me, st_data_t data)
 {
-    rb_free_method_entry(me);
+    if (!me->mark) {
+	rb_free_method_entry(me);
+    }
     return ST_CONTINUE;
 }
 
@@ -1622,6 +1805,16 @@ rb_gc_mark_maybe(VALUE obj)
     }
 }
 
+static int
+gc_mark_ptr(rb_objspace_t *objspace, VALUE ptr)
+{
+    register uintptr_t *bits = GET_HEAP_BITMAP(ptr);
+    if (MARKED_IN_BITMAP(bits, ptr)) return 0;
+    MARK_IN_BITMAP(bits, ptr);
+    objspace->heap.live_num++;
+    return 1;
+}
+
 static void
 gc_mark(rb_objspace_t *objspace, VALUE ptr, int lev)
 {
@@ -1630,9 +1823,7 @@ gc_mark(rb_objspace_t *objspace, VALUE ptr, int lev)
     obj = RANY(ptr);
     if (rb_special_const_p(ptr)) return; /* special const not marked */
     if (obj->as.basic.flags == 0) return;       /* free cell */
-    if (obj->as.basic.flags & FL_MARK) return;  /* already marked */
-    obj->as.basic.flags |= FL_MARK;
-    objspace->heap.live_num++;
+    if (!gc_mark_ptr(objspace, ptr)) return;	/* already marked */
 
     if (lev > GC_LEVEL_MAX || (lev == 0 && stack_check(STACKFRAME_FOR_GC_MARK))) {
 	if (!mark_stack_overflow) {
@@ -1659,6 +1850,7 @@ static void
 gc_mark_children(rb_objspace_t *objspace, VALUE ptr, int lev)
 {
     register RVALUE *obj = RANY(ptr);
+    register uintptr_t *bits;
 
     goto marking;		/* skip */
 
@@ -1666,8 +1858,9 @@ gc_mark_children(rb_objspace_t *objspace, VALUE ptr, int lev)
     obj = RANY(ptr);
     if (rb_special_const_p(ptr)) return; /* special const not marked */
     if (obj->as.basic.flags == 0) return;       /* free cell */
-    if (obj->as.basic.flags & FL_MARK) return;  /* already marked */
-    obj->as.basic.flags |= FL_MARK;
+    bits = GET_HEAP_BITMAP(ptr);
+    if (MARKED_IN_BITMAP(bits, ptr)) return;  /* already marked */
+    MARK_IN_BITMAP(bits, ptr);
     objspace->heap.live_num++;
 
   marking:
@@ -1819,6 +2012,7 @@ gc_mark_children(rb_objspace_t *objspace, VALUE ptr, int lev)
       case T_CLASS:
       case T_MODULE:
 	mark_m_tbl(objspace, RCLASS_M_TBL(obj), lev);
+	if (!RCLASS_EXT(obj)) break;
 	mark_tbl(objspace, RCLASS_IV_TBL(obj), lev);
 	mark_const_tbl(objspace, RCLASS_CONST_TBL(obj), lev);
 	ptr = RCLASS_SUPER(obj);
@@ -1929,15 +2123,22 @@ gc_mark_children(rb_objspace_t *objspace, VALUE ptr, int lev)
 
 static int obj_free(rb_objspace_t *, VALUE);
 
-static inline void
-add_freelist(rb_objspace_t *objspace, RVALUE *p)
+static inline struct heaps_slot *
+add_slot_local_freelist(rb_objspace_t *objspace, RVALUE *p)
 {
+    struct heaps_slot *slot;
+
     VALGRIND_MAKE_MEM_UNDEFINED((void*)p, sizeof(RVALUE));
     p->as.free.flags = 0;
-    p->as.free.next = freelist;
-    freelist = p;
+    slot = GET_HEAP_SLOT(p);
+    p->as.free.next = slot->freelist;
+    slot->freelist = p;
+
+    return slot;
 }
 
+static void free_unused_heap(rb_objspace_t *objspace, struct heaps_header *heap);
+
 static void
 finalize_list(rb_objspace_t *objspace, RVALUE *p)
 {
@@ -1945,17 +2146,16 @@ finalize_list(rb_objspace_t *objspace, RVALUE *p)
 	RVALUE *tmp = p->as.free.next;
 	run_final(objspace, (VALUE)p);
 	if (!FL_TEST(p, FL_SINGLETON)) { /* not freeing page */
-            if (objspace->heap.sweep_slots) {
-                p->as.free.flags = 0;
-            }
-            else {
+            add_slot_local_freelist(objspace, p);
+            if (!is_lazy_sweeping(objspace)) {
                 GC_PROF_DEC_LIVE_NUM;
-                add_freelist(objspace, p);
             }
 	}
 	else {
-	    struct heaps_slot *slot = (struct heaps_slot *)(VALUE)RDATA(p)->dmark;
-	    slot->limit--;
+            struct heaps_header *heap = GET_HEAP_HEADER(p);
+            if (--heap->limit == 0) {
+                free_unused_heap(objspace, heap);
+            }
 	}
 	p = tmp;
     }
@@ -1976,97 +2176,106 @@ unlink_heap_slot(rb_objspace_t *objspace, struct heaps_slot *slot)
     slot->next = NULL;
 }
 
-
 static void
-free_unused_heaps(rb_objspace_t *objspace)
+free_unused_heap(rb_objspace_t *objspace, struct heaps_header *heap)
 {
-    size_t i, j;
-    RVALUE *last = 0;
-
-    for (i = j = 1; j < heaps_used; i++) {
-	if (objspace->heap.sorted[i].slot->limit == 0) {
-	    if (!last) {
-		last = objspace->heap.sorted[i].slot->membase;
-	    }
-	    else {
-		free(objspace->heap.sorted[i].slot->membase);
-	    }
-            free(objspace->heap.sorted[i].slot);
-	    heaps_used--;
-	}
-	else {
-	    if (i != j) {
-		objspace->heap.sorted[j] = objspace->heap.sorted[i];
-	    }
-	    j++;
-	}
-    }
-    if (last) {
-	if (last < heaps_freed) {
-	    free(heaps_freed);
-	    heaps_freed = last;
-	}
-	else {
-	    free(last);
-	}
+    register size_t hi, lo, mid;
+    lo = 0;
+    hi = heaps_used;
+    while (lo < hi) {
+        mid = (lo + hi) / 2;
+        if (heap > objspace->heap.sorted[mid]) {
+            lo = mid + 1;
+        }
+        else if (heap < objspace->heap.sorted[mid]) {
+            hi = mid;
+        }
+        else {
+            /* remove unused heap */
+            struct heaps_slot* h = objspace->heap.sorted[mid]->base;
+            h->free_next = objspace->heap.reserve_slots;
+            objspace->heap.reserve_slots = h;
+            aligned_free(objspace->heap.sorted[mid]);
+            heaps_used--;
+            MEMMOVE(objspace->heap.sorted + mid, objspace->heap.sorted + mid + 1,
+                    struct heaps_header *, heaps_used - mid);
+            return;
+        }
     }
 }
 
 static void
+gc_clear_slot_bits(struct heaps_slot *slot)
+{
+    memset(slot->bits, 0, HEAP_BITMAP_LIMIT * sizeof(uintptr_t));
+}
+
+static void
 slot_sweep(rb_objspace_t *objspace, struct heaps_slot *sweep_slot)
 {
     size_t free_num = 0, final_num = 0;
     RVALUE *p, *pend;
-    RVALUE *free = freelist, *final = deferred_final_list;
+    RVALUE *final = deferred_final_list;
     int deferred;
+    uintptr_t *bits;
 
-    p = sweep_slot->slot; pend = p + sweep_slot->limit;
+    p = sweep_slot->membase->start; pend = sweep_slot->membase->end;
+    bits = sweep_slot->bits;
     while (p < pend) {
-        if (!(p->as.basic.flags & FL_MARK)) {
-            if (p->as.basic.flags &&
-                ((deferred = obj_free(objspace, (VALUE)p)) ||
-		 (FL_TEST(p, FL_FINALIZE)))) {
-                if (!deferred) {
-                    p->as.free.flags = T_ZOMBIE;
-                    RDATA(p)->dfree = 0;
+        if ((!(MARKED_IN_BITMAP(bits, p))) && BUILTIN_TYPE(p) != T_ZOMBIE) {
+            if (p->as.basic.flags) {
+                if ((deferred = obj_free(objspace, (VALUE)p)) ||
+                    (FL_TEST(p, FL_FINALIZE))) {
+                    if (!deferred) {
+                        p->as.free.flags = T_ZOMBIE;
+                        RDATA(p)->dfree = 0;
+                    }
+                    p->as.free.next = deferred_final_list;
+                    deferred_final_list = p;
+                    assert(BUILTIN_TYPE(p) == T_ZOMBIE);
+                    final_num++;
+                }
+                else {
+                    VALGRIND_MAKE_MEM_UNDEFINED((void*)p, sizeof(RVALUE));
+                    p->as.free.flags = 0;
+                    p->as.free.next = sweep_slot->freelist;
+                    sweep_slot->freelist = p;
+                    free_num++;
                 }
-                p->as.free.flags |= FL_MARK;
-                p->as.free.next = deferred_final_list;
-                deferred_final_list = p;
-                final_num++;
             }
             else {
-                add_freelist(objspace, p);
                 free_num++;
             }
         }
-        else if (BUILTIN_TYPE(p) == T_ZOMBIE) {
-            /* objects to be finalized */
-            /* do nothing remain marked */
-        }
-        else {
-            RBASIC(p)->flags &= ~FL_MARK;
-        }
         p++;
     }
-    if (final_num + free_num == sweep_slot->limit &&
+    gc_clear_slot_bits(sweep_slot);
+    if (final_num + free_num == sweep_slot->membase->limit &&
         objspace->heap.free_num > objspace->heap.do_heap_free) {
         RVALUE *pp;
 
         for (pp = deferred_final_list; pp != final; pp = pp->as.free.next) {
-	    RDATA(pp)->dmark = (void (*)(void *))(VALUE)sweep_slot;
+	    RDATA(pp)->dmark = 0;
             pp->as.free.flags |= FL_SINGLETON; /* freeing page mark */
         }
-        sweep_slot->limit = final_num;
-        freelist = free;	/* cancel this page from freelist */
+        sweep_slot->membase->limit = final_num;
         unlink_heap_slot(objspace, sweep_slot);
+        if (final_num == 0) {
+            free_unused_heap(objspace, sweep_slot->membase);
+        }
     }
     else {
+        if (free_num > 0) {
+            link_free_heap_slot(objspace, sweep_slot);
+        }
+        else {
+            sweep_slot->free_next = NULL;
+        }
         objspace->heap.free_num += free_num;
     }
     objspace->heap.final_num += final_num;
 
-    if (deferred_final_list) {
+    if (deferred_final_list && !finalizing) {
         rb_thread_t *th = GET_THREAD();
         if (th) {
             RUBY_VM_SET_FINALIZER_INTERRUPT(th);
@@ -2078,7 +2287,7 @@ static int
 ready_to_gc(rb_objspace_t *objspace)
 {
     if (dont_gc || during_gc) {
-	if (!freelist) {
+	if (!has_free_object) {
             if (!heaps_increment(objspace)) {
                 set_heaps_increment(objspace);
                 heaps_increment(objspace);
@@ -2092,7 +2301,6 @@ ready_to_gc(rb_objspace_t *objspace)
 static void
 before_gc_sweep(rb_objspace_t *objspace)
 {
-    freelist = 0;
     objspace->heap.do_heap_free = (size_t)((heaps_used * HEAP_OBJ_LIMIT) * 0.65);
     objspace->heap.free_min = (size_t)((heaps_used * HEAP_OBJ_LIMIT)  * 0.2);
     if (objspace->heap.free_min < initial_free_min) {
@@ -2101,6 +2309,7 @@ before_gc_sweep(rb_objspace_t *objspace)
     }
     objspace->heap.sweep_slots = heaps;
     objspace->heap.free_num = 0;
+    objspace->heap.free_slots = NULL;
 
     /* sweep unlinked method entries */
     if (GET_VM()->unlinked_method_entry_list) {
@@ -2123,8 +2332,6 @@ after_gc_sweep(rb_objspace_t *objspace)
 	if (malloc_limit < initial_malloc_limit) malloc_limit = initial_malloc_limit;
     }
     malloc_increase = 0;
-
-    free_unused_heaps(objspace);
 }
 
 static int
@@ -2137,7 +2344,7 @@ lazy_sweep(rb_objspace_t *objspace)
         next = objspace->heap.sweep_slots->next;
 	slot_sweep(objspace, objspace->heap.sweep_slots);
         objspace->heap.sweep_slots = next;
-        if (freelist) {
+        if (has_free_object) {
             during_gc = 0;
             return TRUE;
         }
@@ -2149,10 +2356,10 @@ static void
 rest_sweep(rb_objspace_t *objspace)
 {
     if (objspace->heap.sweep_slots) {
-       while (objspace->heap.sweep_slots) {
-           lazy_sweep(objspace);
-       }
-       after_gc_sweep(objspace);
+	while (objspace->heap.sweep_slots) {
+	    lazy_sweep(objspace);
+	}
+	after_gc_sweep(objspace);
     }
 }
 
@@ -2199,9 +2406,9 @@ gc_lazy_sweep(rb_objspace_t *objspace)
     }
 
     GC_PROF_SWEEP_TIMER_START;
-    if(!(res = lazy_sweep(objspace))) {
+    if (!(res = lazy_sweep(objspace))) {
         after_gc_sweep(objspace);
-        if(freelist) {
+        if (has_free_object) {
             res = TRUE;
             during_gc = 0;
         }
@@ -2234,12 +2441,17 @@ void
 rb_gc_force_recycle(VALUE p)
 {
     rb_objspace_t *objspace = &rb_objspace;
-    GC_PROF_DEC_LIVE_NUM;
-    if (RBASIC(p)->flags & FL_MARK) {
-        RANY(p)->as.free.flags = 0;
+    struct heaps_slot *slot;
+
+    if (MARKED_IN_BITMAP(GET_HEAP_BITMAP(p), p)) {
+        add_slot_local_freelist(objspace, (RVALUE *)p);
     }
     else {
-        add_freelist(objspace, (RVALUE *)p);
+        GC_PROF_DEC_LIVE_NUM;
+        slot = add_slot_local_freelist(objspace, (RVALUE *)p);
+        if (slot->free_next == NULL) {
+            link_free_heap_slot(objspace, slot);
+        }
     }
 }
 
@@ -2611,7 +2823,7 @@ static VALUE
 objspace_each_objects(VALUE arg)
 {
     size_t i;
-    RVALUE *membase = 0;
+    struct heaps_header *membase = 0;
     RVALUE *pstart, *pend;
     rb_objspace_t *objspace = &rb_objspace;
     struct each_obj_args *args = (struct each_obj_args *)arg;
@@ -2619,16 +2831,16 @@ objspace_each_objects(VALUE arg)
 
     i = 0;
     while (i < heaps_used) {
-	while (0 < i && (uintptr_t)membase < (uintptr_t)objspace->heap.sorted[i-1].slot->membase)
+	while (0 < i && membase < objspace->heap.sorted[i-1])
 	    i--;
-	while (i < heaps_used && (uintptr_t)objspace->heap.sorted[i].slot->membase <= (uintptr_t)membase)
+	while (i < heaps_used && objspace->heap.sorted[i] <= membase)
 	    i++;
 	if (heaps_used <= i)
 	  break;
-	membase = objspace->heap.sorted[i].slot->membase;
+	membase = objspace->heap.sorted[i];
 
-	pstart = objspace->heap.sorted[i].slot->slot;
-	pend = pstart + objspace->heap.sorted[i].slot->limit;
+	pstart = membase->start;
+	pend = membase->end;
 
 	for (; pstart != pend; pstart++) {
 	    if (pstart->as.basic.flags) {
@@ -2642,6 +2854,7 @@ objspace_each_objects(VALUE arg)
 	    }
 	}
     }
+    RB_GC_GUARD(v);
 
     return Qnil;
 }
@@ -2885,11 +3098,12 @@ run_single_final(VALUE arg)
 }
 
 static void
-run_finalizer(rb_objspace_t *objspace, VALUE objid, VALUE table)
+run_finalizer(rb_objspace_t *objspace, VALUE obj, VALUE table)
 {
     long i;
     int status;
     VALUE args[3];
+    VALUE objid = nonspecial_obj_id(obj);
 
     if (RARRAY_LEN(table) > 0) {
 	args[1] = rb_obj_freeze(rb_ary_new3(1, objid));
@@ -2913,13 +3127,11 @@ run_finalizer(rb_objspace_t *objspace, VALUE objid, VALUE table)
 static void
 run_final(rb_objspace_t *objspace, VALUE obj)
 {
-    VALUE objid;
     RUBY_DATA_FUNC free_func = 0;
     st_data_t key, table;
 
     objspace->heap.final_num--;
 
-    objid = rb_obj_id(obj);	/* make obj into id */
     RBASIC(obj)->klass = 0;
 
     if (RTYPEDDATA_P(obj)) {
@@ -2934,7 +3146,7 @@ run_final(rb_objspace_t *objspace, VALUE obj)
 
     key = (st_data_t)obj;
     if (st_delete(finalizer_table, &key, &table)) {
-	run_finalizer(objspace, objid, (VALUE)table);
+	run_finalizer(objspace, obj, (VALUE)table);
     }
 }
 
@@ -2952,16 +3164,20 @@ finalize_deferred(rb_objspace_t *objspace)
 void
 rb_gc_finalize_deferred(void)
 {
-    finalize_deferred(&rb_objspace);
+    rb_objspace_t *objspace = &rb_objspace;
+    if (ATOMIC_EXCHANGE(finalizing, 1)) return;
+    finalize_deferred(objspace);
+    ATOMIC_SET(finalizing, 0);
 }
 
 static int
 chain_finalized_object(st_data_t key, st_data_t val, st_data_t arg)
 {
     RVALUE *p = (RVALUE *)key, **final_list = (RVALUE **)arg;
-    if ((p->as.basic.flags & (FL_FINALIZE|FL_MARK)) == FL_FINALIZE) {
+    if ((p->as.basic.flags & FL_FINALIZE) == FL_FINALIZE &&
+        !MARKED_IN_BITMAP(GET_HEAP_BITMAP(p), p)) {
 	if (BUILTIN_TYPE(p) != T_ZOMBIE) {
-	    p->as.free.flags = FL_MARK | T_ZOMBIE; /* remain marked */
+	    p->as.free.flags = T_ZOMBIE;
 	    RDATA(p)->dfree = 0;
 	}
 	p->as.free.next = *final_list;
@@ -3004,6 +3220,8 @@ rb_objspace_call_finalizer(rb_objspace_t *objspace)
     /* run finalizers */
     rest_sweep(objspace);
 
+    if (ATOMIC_EXCHANGE(finalizing, 1)) return;
+
     do {
 	/* XXX: this loop will make no sense */
 	/* because mark will not be removed */
@@ -3018,8 +3236,9 @@ rb_objspace_call_finalizer(rb_objspace_t *objspace)
 	st_foreach(finalizer_table, force_chain_object, (st_data_t)&list);
 	while (list) {
 	    struct force_finalize_list *curr = list;
-	    run_finalizer(objspace, rb_obj_id(curr->obj), curr->table);
-	    st_delete(finalizer_table, (st_data_t*)&curr->obj, 0);
+	    st_data_t obj = (st_data_t)curr->obj;
+	    run_finalizer(objspace, curr->obj, curr->table);
+	    st_delete(finalizer_table, &obj, 0);
 	    list = curr->next;
 	    xfree(curr);
 	}
@@ -3030,7 +3249,7 @@ rb_objspace_call_finalizer(rb_objspace_t *objspace)
 
     /* run data object's finalizers */
     for (i = 0; i < heaps_used; i++) {
-	p = objspace->heap.sorted[i].start; pend = objspace->heap.sorted[i].end;
+	p = objspace->heap.sorted[i]->start; pend = objspace->heap.sorted[i]->end;
 	while (p < pend) {
 	    if (BUILTIN_TYPE(p) == T_DATA &&
 		DATA_PTR(p) && RANY(p)->as.data.dfree &&
@@ -3066,6 +3285,7 @@ rb_objspace_call_finalizer(rb_objspace_t *objspace)
 
     st_free_table(finalizer_table);
     finalizer_table = 0;
+    ATOMIC_SET(finalizing, 0);
 }
 
 void
@@ -3073,8 +3293,39 @@ rb_gc(void)
 {
     rb_objspace_t *objspace = &rb_objspace;
     garbage_collect(objspace);
-    finalize_deferred(objspace);
-    free_unused_heaps(objspace);
+    if (!finalizing) finalize_deferred(objspace);
+}
+
+static inline int
+is_id_value(rb_objspace_t *objspace, VALUE ptr)
+{
+    if (!is_pointer_to_heap(objspace, (void *)ptr)) return FALSE;
+    if (BUILTIN_TYPE(ptr) > T_FIXNUM) return FALSE;
+    if (BUILTIN_TYPE(ptr) == T_ICLASS) return FALSE;
+    return TRUE;
+}
+
+static inline int
+is_dead_object(rb_objspace_t *objspace, VALUE ptr)
+{
+    struct heaps_slot *slot = objspace->heap.sweep_slots;
+    if (!is_lazy_sweeping(objspace) || MARKED_IN_BITMAP(GET_HEAP_BITMAP(ptr), ptr))
+	return FALSE;
+    while (slot) {
+	if ((VALUE)slot->membase->start <= ptr && ptr < (VALUE)(slot->membase->end))
+	    return TRUE;
+	slot = slot->next;
+    }
+    return FALSE;
+}
+
+static inline int
+is_live_object(rb_objspace_t *objspace, VALUE ptr)
+{
+    if (BUILTIN_TYPE(ptr) == 0) return FALSE;
+    if (RBASIC(ptr)->klass == 0) return FALSE;
+    if (is_dead_object(objspace, ptr)) return FALSE;
+    return TRUE;
 }
 
 /*
@@ -3119,11 +3370,10 @@ id2ref(VALUE obj, VALUE objid)
 	return ID2SYM(symid);
     }
 
-    if (!is_pointer_to_heap(objspace, (void *)ptr) ||
-	BUILTIN_TYPE(ptr) > T_FIXNUM || BUILTIN_TYPE(ptr) == T_ICLASS) {
+    if (!is_id_value(objspace, ptr)) {
 	rb_raise(rb_eRangeError, "%p is not id value", p0);
     }
-    if (BUILTIN_TYPE(ptr) == 0 || RBASIC(ptr)->klass == 0) {
+    if (!is_live_object(objspace, ptr)) {
 	rb_raise(rb_eRangeError, "%p is recycled object", p0);
     }
     return (VALUE)ptr;
@@ -3193,7 +3443,7 @@ rb_obj_id(VALUE obj)
     if (SPECIAL_CONST_P(obj)) {
         return LONG2NUM((SIGNED_VALUE)obj);
     }
-    return (VALUE)((SIGNED_VALUE)obj|FIXNUM_FLAG);
+    return nonspecial_obj_id(obj);
 }
 
 static int
@@ -3236,7 +3486,7 @@ count_objects(int argc, VALUE *argv, VALUE os)
     VALUE hash;
 
     if (rb_scan_args(argc, argv, "01", &hash) == 1) {
-        if (TYPE(hash) != T_HASH)
+        if (!RB_TYPE_P(hash, T_HASH))
             rb_raise(rb_eTypeError, "non-hash given");
     }
 
@@ -3247,7 +3497,7 @@ count_objects(int argc, VALUE *argv, VALUE os)
     for (i = 0; i < heaps_used; i++) {
         RVALUE *p, *pend;
 
-        p = objspace->heap.sorted[i].start; pend = objspace->heap.sorted[i].end;
+        p = objspace->heap.sorted[i]->start; pend = objspace->heap.sorted[i]->end;
         for (;p < pend; p++) {
             if (p->as.basic.flags) {
                 counts[BUILTIN_TYPE(p)]++;
@@ -3256,7 +3506,7 @@ count_objects(int argc, VALUE *argv, VALUE os)
                 freed++;
             }
         }
-        total += objspace->heap.sorted[i].slot->limit;
+        total += objspace->heap.sorted[i]->limit;
     }
 
     if (hash == Qnil) {
@@ -3355,7 +3605,7 @@ gc_stat(int argc, VALUE *argv, VALUE self)
     VALUE hash;
 
     if (rb_scan_args(argc, argv, "01", &hash) == 1) {
-        if (TYPE(hash) != T_HASH)
+        if (!RB_TYPE_P(hash, T_HASH))
             rb_raise(rb_eTypeError, "non-hash given");
     }
 
@@ -3410,6 +3660,33 @@ gc_malloc_allocations(VALUE self)
 }
 #endif
 
+/*
+ *  call-seq:
+ *     GC::Profiler.raw_data -> [Hash, ...]
+ *
+ *  Returns an Array of individual raw profile data Hashes ordered
+ *  from earliest to latest by <tt>:GC_INVOKE_TIME</tt>.  For example:
+ *
+ *    [{:GC_TIME=>1.3000000000000858e-05,
+ *      :GC_INVOKE_TIME=>0.010634999999999999,
+ *      :HEAP_USE_SIZE=>289640,
+ *      :HEAP_TOTAL_SIZE=>588960,
+ *      :HEAP_TOTAL_OBJECTS=>14724,
+ *      :GC_IS_MARKED=>false},
+ *      ...
+ *    ]
+ *
+ *  The keys mean:
+ *
+ *  +:GC_TIME+:: Time taken for this run in milliseconds
+ *  +:GC_INVOKE_TIME+:: Time the GC was invoked since startup in seconds
+ *  +:HEAP_USE_SIZE+:: Bytes of heap used
+ *  +:HEAP_TOTAL_SIZE+:: Size of heap in bytes
+ *  +:HEAP_TOTAL_OBJECTS+:: Number of objects
+ *  +:GC_IS_MARKED+:: Is the GC in the mark phase
+ *
+ */
+
 static VALUE
 gc_profile_record_get(void)
 {
@@ -3602,6 +3879,7 @@ Init_GC(void)
     rb_mProfiler = rb_define_module_under(rb_mGC, "Profiler");
     rb_define_singleton_method(rb_mProfiler, "enabled?", gc_profile_enable_get, 0);
     rb_define_singleton_method(rb_mProfiler, "enable", gc_profile_enable, 0);
+    rb_define_singleton_method(rb_mProfiler, "raw_data", gc_profile_record_get, 0);
     rb_define_singleton_method(rb_mProfiler, "disable", gc_profile_disable, 0);
     rb_define_singleton_method(rb_mProfiler, "clear", gc_profile_clear, 0);
     rb_define_singleton_method(rb_mProfiler, "result", gc_profile_result, 0);
diff --git a/hash.c b/hash.c
index fbd8237..32917c3 100644
--- a/hash.c
+++ b/hash.c
@@ -44,7 +44,7 @@ rb_any_cmp(VALUE a, VALUE b)
     if (FIXNUM_P(a) && FIXNUM_P(b)) {
 	return a != b;
     }
-    if (TYPE(a) == T_STRING && RBASIC(a)->klass == rb_cString &&
+    if (RB_TYPE_P(a, T_STRING) && RBASIC(a)->klass == rb_cString &&
 	TYPE(b) == T_STRING && RBASIC(b)->klass == rb_cString) {
 	return rb_str_hash_cmp(a, b);
     }
@@ -80,20 +80,14 @@ rb_any_hash(VALUE a)
     VALUE hval;
     st_index_t hnum;
 
-    switch (TYPE(a)) {
-      case T_FIXNUM:
-      case T_SYMBOL:
-      case T_NIL:
-      case T_FALSE:
-      case T_TRUE:
-	hnum = rb_hash_end(rb_hash_start((unsigned int)a));
-	break;
-
-      case T_STRING:
+    if (SPECIAL_CONST_P(a)) {
+	if (a == Qundef) return 0;
+	hnum = rb_hash_end(rb_hash_start((st_index_t)a));
+    }
+    else if (BUILTIN_TYPE(a) == T_STRING) {
 	hnum = rb_str_hash(a);
-	break;
-
-      default:
+    }
+    else {
         hval = rb_hash(a);
 	hnum = FIX2LONG(hval);
     }
@@ -106,10 +100,8 @@ static const struct st_hash_type objhash = {
     rb_any_hash,
 };
 
-static const struct st_hash_type identhash = {
-    st_numcmp,
-    st_numhash,
-};
+extern const struct st_hash_type st_hashtype_num;
+#define identhash st_hashtype_num
 
 typedef int st_foreach_func(st_data_t, st_data_t, st_data_t);
 
@@ -124,7 +116,6 @@ foreach_safe_i(st_data_t key, st_data_t value, struct foreach_safe_arg *arg)
 {
     int status;
 
-    if (key == Qundef) return ST_CONTINUE;
     status = (*arg->func)(key, value, arg->arg);
     if (status == ST_CONTINUE) {
 	return ST_CHECK;
@@ -140,7 +131,7 @@ st_foreach_safe(st_table *table, int (*func)(ANYARGS), st_data_t a)
     arg.tbl = table;
     arg.func = (st_foreach_func *)func;
     arg.arg = a;
-    if (st_foreach(table, foreach_safe_i, (st_data_t)&arg)) {
+    if (st_foreach_check(table, foreach_safe_i, (st_data_t)&arg, 0)) {
 	rb_raise(rb_eRuntimeError, "hash modified during iteration");
     }
 }
@@ -154,21 +145,21 @@ struct hash_foreach_arg {
 };
 
 static int
-hash_foreach_iter(st_data_t key, st_data_t value, struct hash_foreach_arg *arg)
+hash_foreach_iter(st_data_t key, st_data_t value, st_data_t argp)
 {
+    struct hash_foreach_arg *arg = (struct hash_foreach_arg *)argp;
     int status;
     st_table *tbl;
 
     tbl = RHASH(arg->hash)->ntbl;
-    if ((VALUE)key == Qundef) return ST_CONTINUE;
     status = (*arg->func)((VALUE)key, (VALUE)value, arg->arg);
     if (RHASH(arg->hash)->ntbl != tbl) {
 	rb_raise(rb_eRuntimeError, "rehash occurred during iteration");
     }
     switch (status) {
       case ST_DELETE:
-	st_delete_safe(tbl, &key, 0, Qundef);
 	FL_SET(arg->hash, HASH_DELETED);
+	return ST_DELETE;
       case ST_CONTINUE:
 	break;
       case ST_STOP:
@@ -184,7 +175,7 @@ hash_foreach_ensure(VALUE hash)
 
     if (RHASH(hash)->iter_lev == 0) {
 	if (FL_TEST(hash, HASH_DELETED)) {
-	    st_cleanup_safe(RHASH(hash)->ntbl, Qundef);
+	    st_cleanup_safe(RHASH(hash)->ntbl, (st_data_t)Qundef);
 	    FL_UNSET(hash, HASH_DELETED);
 	}
     }
@@ -192,9 +183,10 @@ hash_foreach_ensure(VALUE hash)
 }
 
 static VALUE
-hash_foreach_call(struct hash_foreach_arg *arg)
+hash_foreach_call(VALUE arg)
 {
-    if (st_foreach(RHASH(arg->hash)->ntbl, hash_foreach_iter, (st_data_t)arg)) {
+    VALUE hash = ((struct hash_foreach_arg *)arg)->hash;
+    if (st_foreach_check(RHASH(hash)->ntbl, hash_foreach_iter, (st_data_t)arg, (st_data_t)Qundef)) {
 	rb_raise(rb_eRuntimeError, "hash modified during iteration");
     }
     return Qnil;
@@ -447,7 +439,7 @@ rb_hash_rehash_i(VALUE key, VALUE value, VALUE arg)
 {
     st_table *tbl = (st_table *)arg;
 
-    if (key != Qundef) st_insert(tbl, key, value);
+    st_insert(tbl, (st_data_t)key, (st_data_t)value);
     return ST_CONTINUE;
 }
 
@@ -490,6 +482,20 @@ rb_hash_rehash(VALUE hash)
     return hash;
 }
 
+static VALUE
+hash_default_value(VALUE hash, VALUE key)
+{
+    if (rb_method_basic_definition_p(CLASS_OF(hash), id_default)) {
+	VALUE ifnone = RHASH_IFNONE(hash);
+	if (!FL_TEST(hash, HASH_PROC_DEFAULT)) return ifnone;
+	if (key == Qundef) return Qnil;
+	return rb_funcall(ifnone, id_yield, 2, hash, key);
+    }
+    else {
+	return rb_funcall(hash, id_default, 1, key);
+    }
+}
+
 /*
  *  call-seq:
  *     hsh[key]    ->  value
@@ -510,13 +516,7 @@ rb_hash_aref(VALUE hash, VALUE key)
     st_data_t val;
 
     if (!RHASH(hash)->ntbl || !st_lookup(RHASH(hash)->ntbl, key, &val)) {
-	if (!FL_TEST(hash, HASH_PROC_DEFAULT) &&
-	    rb_method_basic_definition_p(CLASS_OF(hash), id_default)) {
-	    return RHASH_IFNONE(hash);
-	}
-	else {
-	    return rb_funcall(hash, id_default, 1, key);
-	}
+	return hash_default_value(hash, key);
     }
     return (VALUE)val;
 }
@@ -659,7 +659,7 @@ rb_hash_default(int argc, VALUE *argv, VALUE hash)
 static VALUE
 rb_hash_set_default(VALUE hash, VALUE ifnone)
 {
-    rb_hash_modify(hash);
+    rb_hash_modify_check(hash);
     RHASH_IFNONE(hash) = ifnone;
     FL_UNSET(hash, HASH_PROC_DEFAULT);
     return ifnone;
@@ -707,7 +707,7 @@ rb_hash_set_default_proc(VALUE hash, VALUE proc)
 {
     VALUE b;
 
-    rb_hash_modify(hash);
+    rb_hash_modify_check(hash);
     b = rb_check_convert_type(proc, T_DATA, "Proc", "to_proc");
     if (NIL_P(b) || !rb_obj_is_proc(b)) {
 	rb_raise(rb_eTypeError,
@@ -776,7 +776,7 @@ rb_hash_delete_key(VALUE hash, VALUE key)
     if (!RHASH(hash)->ntbl)
         return Qundef;
     if (RHASH(hash)->iter_lev > 0) {
-	if (st_delete_safe(RHASH(hash)->ntbl, &ktmp, &val, Qundef)) {
+	if (st_delete_safe(RHASH(hash)->ntbl, &ktmp, &val, (st_data_t)Qundef)) {
 	    FL_SET(hash, HASH_DELETED);
 	    return (VALUE)val;
 	}
@@ -809,7 +809,7 @@ rb_hash_delete(VALUE hash, VALUE key)
 {
     VALUE val;
 
-    rb_hash_modify(hash);
+    rb_hash_modify_check(hash);
     val = rb_hash_delete_key(hash, key);
     if (val != Qundef) return val;
     if (rb_block_given_p()) {
@@ -828,7 +828,6 @@ shift_i(VALUE key, VALUE value, VALUE arg)
 {
     struct shift_var *var = (struct shift_var *)arg;
 
-    if (key == Qundef) return ST_CONTINUE;
     if (var->key != Qundef) return ST_STOP;
     var->key = key;
     var->val = value;
@@ -840,7 +839,6 @@ shift_i_safe(VALUE key, VALUE value, VALUE arg)
 {
     struct shift_var *var = (struct shift_var *)arg;
 
-    if (key == Qundef) return ST_CONTINUE;
     var->key = key;
     var->val = value;
     return ST_STOP;
@@ -864,29 +862,25 @@ rb_hash_shift(VALUE hash)
 {
     struct shift_var var;
 
-    rb_hash_modify(hash);
-    var.key = Qundef;
-    rb_hash_foreach(hash, RHASH(hash)->iter_lev > 0 ? shift_i_safe : shift_i,
-		    (VALUE)&var);
-
-    if (var.key != Qundef) {
-	if (RHASH(hash)->iter_lev > 0) {
-	    rb_hash_delete_key(hash, var.key);
+    rb_hash_modify_check(hash);
+    if (RHASH(hash)->ntbl) {
+	var.key = Qundef;
+	rb_hash_foreach(hash, RHASH(hash)->iter_lev > 0 ? shift_i_safe : shift_i,
+			(VALUE)&var);
+
+	if (var.key != Qundef) {
+	    if (RHASH(hash)->iter_lev > 0) {
+		rb_hash_delete_key(hash, var.key);
+	    }
+	    return rb_assoc_new(var.key, var.val);
 	}
-	return rb_assoc_new(var.key, var.val);
-    }
-    else if (FL_TEST(hash, HASH_PROC_DEFAULT)) {
-	return rb_funcall(RHASH_IFNONE(hash), id_yield, 2, hash, Qnil);
-    }
-    else {
-	return RHASH_IFNONE(hash);
     }
+    return hash_default_value(hash, Qnil);
 }
 
 static int
 delete_if_i(VALUE key, VALUE value, VALUE hash)
 {
-    if (key == Qundef) return ST_CONTINUE;
     if (RTEST(rb_yield_values(2, key, value))) {
 	rb_hash_delete_key(hash, key);
     }
@@ -912,8 +906,9 @@ VALUE
 rb_hash_delete_if(VALUE hash)
 {
     RETURN_ENUMERATOR(hash, 0, 0);
-    rb_hash_modify(hash);
-    rb_hash_foreach(hash, delete_if_i, hash);
+    rb_hash_modify_check(hash);
+    if (RHASH(hash)->ntbl)
+	rb_hash_foreach(hash, delete_if_i, hash);
     return hash;
 }
 
@@ -984,7 +979,6 @@ rb_hash_values_at(int argc, VALUE *argv, VALUE hash)
 static int
 select_i(VALUE key, VALUE value, VALUE result)
 {
-    if (key == Qundef) return ST_CONTINUE;
     if (RTEST(rb_yield_values(2, key, value)))
 	rb_hash_aset(result, key, value);
     return ST_CONTINUE;
@@ -1018,7 +1012,6 @@ rb_hash_select(VALUE hash)
 static int
 keep_if_i(VALUE key, VALUE value, VALUE hash)
 {
-    if (key == Qundef) return ST_CONTINUE;
     if (!RTEST(rb_yield_values(2, key, value))) {
 	return ST_DELETE;
     }
@@ -1040,7 +1033,7 @@ rb_hash_select_bang(VALUE hash)
     st_index_t n;
 
     RETURN_ENUMERATOR(hash, 0, 0);
-    rb_hash_modify(hash);
+    rb_hash_modify_check(hash);
     if (!RHASH(hash)->ntbl)
         return Qnil;
     n = RHASH(hash)->ntbl->num_entries;
@@ -1065,8 +1058,9 @@ VALUE
 rb_hash_keep_if(VALUE hash)
 {
     RETURN_ENUMERATOR(hash, 0, 0);
-    rb_hash_modify(hash);
-    rb_hash_foreach(hash, keep_if_i, hash);
+    rb_hash_modify_check(hash);
+    if (RHASH(hash)->ntbl)
+	rb_hash_foreach(hash, keep_if_i, hash);
     return hash;
 }
 
@@ -1144,9 +1138,7 @@ rb_hash_aset(VALUE hash, VALUE key, VALUE val)
 static int
 replace_i(VALUE key, VALUE val, VALUE hash)
 {
-    if (key != Qundef) {
-	rb_hash_aset(hash, key, val);
-    }
+    rb_hash_aset(hash, key, val);
 
     return ST_CONTINUE;
 }
@@ -1227,7 +1219,6 @@ rb_hash_empty_p(VALUE hash)
 static int
 each_value_i(VALUE key, VALUE value)
 {
-    if (key == Qundef) return ST_CONTINUE;
     rb_yield(value);
     return ST_CONTINUE;
 }
@@ -1262,7 +1253,6 @@ rb_hash_each_value(VALUE hash)
 static int
 each_key_i(VALUE key, VALUE value)
 {
-    if (key == Qundef) return ST_CONTINUE;
     rb_yield(key);
     return ST_CONTINUE;
 }
@@ -1296,7 +1286,6 @@ rb_hash_each_key(VALUE hash)
 static int
 each_pair_i(VALUE key, VALUE value)
 {
-    if (key == Qundef) return ST_CONTINUE;
     rb_yield(rb_assoc_new(key, value));
     return ST_CONTINUE;
 }
@@ -1334,7 +1323,6 @@ rb_hash_each_pair(VALUE hash)
 static int
 to_a_i(VALUE key, VALUE value, VALUE ary)
 {
-    if (key == Qundef) return ST_CONTINUE;
     rb_ary_push(ary, rb_assoc_new(key, value));
     return ST_CONTINUE;
 }
@@ -1367,7 +1355,6 @@ inspect_i(VALUE key, VALUE value, VALUE str)
 {
     VALUE str2;
 
-    if (key == Qundef) return ST_CONTINUE;
     str2 = rb_inspect(key);
     if (RSTRING_LEN(str) > 1) {
 	rb_str_cat2(str, ", ");
@@ -1434,7 +1421,6 @@ rb_hash_to_hash(VALUE hash)
 static int
 keys_i(VALUE key, VALUE value, VALUE ary)
 {
-    if (key == Qundef) return ST_CONTINUE;
     rb_ary_push(ary, key);
     return ST_CONTINUE;
 }
@@ -1465,7 +1451,6 @@ rb_hash_keys(VALUE hash)
 static int
 values_i(VALUE key, VALUE value, VALUE ary)
 {
-    if (key == Qundef) return ST_CONTINUE;
     rb_ary_push(ary, value);
     return ST_CONTINUE;
 }
@@ -1524,7 +1509,6 @@ rb_hash_search_value(VALUE key, VALUE value, VALUE arg)
 {
     VALUE *data = (VALUE *)arg;
 
-    if (key == Qundef) return ST_CONTINUE;
     if (rb_equal(value, data[1])) {
 	data[0] = Qtrue;
 	return ST_STOP;
@@ -1568,7 +1552,6 @@ eql_i(VALUE key, VALUE val1, VALUE arg)
     struct equal_data *data = (struct equal_data *)arg;
     st_data_t val2;
 
-    if (key == Qundef) return ST_CONTINUE;
     if (!st_lookup(data->tbl, key, &val2)) {
 	data->result = Qfalse;
 	return ST_STOP;
@@ -1599,7 +1582,7 @@ hash_equal(VALUE hash1, VALUE hash2, int eql)
     struct equal_data data;
 
     if (hash1 == hash2) return Qtrue;
-    if (TYPE(hash2) != T_HASH) {
+    if (!RB_TYPE_P(hash2, T_HASH)) {
 	if (!rb_respond_to(hash2, rb_intern("to_hash"))) {
 	    return Qfalse;
 	}
@@ -1670,7 +1653,6 @@ hash_i(VALUE key, VALUE val, VALUE arg)
     st_index_t *hval = (st_index_t *)arg;
     st_index_t hdata[2];
 
-    if (key == Qundef) return ST_CONTINUE;
     hdata[0] = rb_hash(key);
     hdata[1] = rb_hash(val);
     *hval ^= st_hash(hdata, sizeof(hdata), 0);
@@ -1711,7 +1693,6 @@ rb_hash_hash(VALUE hash)
 static int
 rb_hash_invert_i(VALUE key, VALUE value, VALUE hash)
 {
-    if (key == Qundef) return ST_CONTINUE;
     rb_hash_aset(hash, value, key);
     return ST_CONTINUE;
 }
@@ -1740,7 +1721,6 @@ rb_hash_invert(VALUE hash)
 static int
 rb_hash_update_i(VALUE key, VALUE value, VALUE hash)
 {
-    if (key == Qundef) return ST_CONTINUE;
     hash_update(hash, key);
     st_insert(RHASH(hash)->ntbl, key, value);
     return ST_CONTINUE;
@@ -1749,7 +1729,6 @@ rb_hash_update_i(VALUE key, VALUE value, VALUE hash)
 static int
 rb_hash_update_block_i(VALUE key, VALUE value, VALUE hash)
 {
-    if (key == Qundef) return ST_CONTINUE;
     if (rb_hash_has_key(hash, key)) {
 	value = rb_yield_values(3, key, rb_hash_aref(hash, key), value);
     }
@@ -1806,7 +1785,6 @@ rb_hash_update_func_i(VALUE key, VALUE value, VALUE arg0)
     struct update_arg *arg = (struct update_arg *)arg0;
     VALUE hash = arg->hash;
 
-    if (key == Qundef) return ST_CONTINUE;
     if (rb_hash_has_key(hash, key)) {
 	value = (*arg->func)(key, rb_hash_aref(hash, key), value);
     }
@@ -1863,7 +1841,6 @@ assoc_i(VALUE key, VALUE val, VALUE arg)
 {
     VALUE *args = (VALUE *)arg;
 
-    if (key == Qundef) return ST_CONTINUE;
     if (RTEST(rb_equal(args[0], key))) {
 	args[1] = rb_assoc_new(key, val);
 	return ST_STOP;
@@ -1901,7 +1878,6 @@ rassoc_i(VALUE key, VALUE val, VALUE arg)
 {
     VALUE *args = (VALUE *)arg;
 
-    if (key == Qundef) return ST_CONTINUE;
     if (RTEST(rb_equal(args[0], val))) {
 	args[1] = rb_assoc_new(key, val);
 	return ST_STOP;
@@ -2198,7 +2174,7 @@ rb_env_path_tainted(void)
 }
 
 #if defined(_WIN32) || (defined(HAVE_SETENV) && defined(HAVE_UNSETENV))
-#elif defined __sun__
+#elif defined __sun
 static int
 in_origenv(const char *str)
 {
@@ -2286,7 +2262,7 @@ ruby_setenv(const char *name, const char *value)
 	    rb_sys_fail("unsetenv");
 #endif
     }
-#elif defined __sun__
+#elif defined __sun
     size_t len;
     char **env_ptr, *str;
     if (strchr(name, '=')) {
@@ -3084,11 +3060,9 @@ env_invert(void)
 static int
 env_replace_i(VALUE key, VALUE val, VALUE keys)
 {
-    if (key != Qundef) {
-	env_aset(Qnil, key, val);
-	if (rb_ary_includes(keys, key)) {
-	    rb_ary_delete(keys, key);
-	}
+    env_aset(Qnil, key, val);
+    if (rb_ary_includes(keys, key)) {
+	rb_ary_delete(keys, key);
     }
     return ST_CONTINUE;
 }
@@ -3120,12 +3094,10 @@ env_replace(VALUE env, VALUE hash)
 static int
 env_update_i(VALUE key, VALUE val)
 {
-    if (key != Qundef) {
-	if (rb_block_given_p()) {
-	    val = rb_yield_values(3, key, rb_f_getenv(Qnil, key), val);
-	}
-	env_aset(Qnil, key, val);
+    if (rb_block_given_p()) {
+	val = rb_yield_values(3, key, rb_f_getenv(Qnil, key), val);
     }
+    env_aset(Qnil, key, val);
     return ST_CONTINUE;
 }
 
@@ -3150,15 +3122,116 @@ env_update(VALUE env, VALUE hash)
 }
 
 /*
- *  A <code>Hash</code> is a collection of key-value pairs. It is
- *  similar to an <code>Array</code>, except that indexing is done via
- *  arbitrary keys of any object type, not an integer index. Hashes enumerate
- *  their values in the order that the corresponding keys were inserted.
+ *  A Hash is a dictionary-like collection of unique keys and their values.
+ *  Also called associative arrays, they are similar to Arrays, but where an
+ *  Array uses integers as its index, a Hash allows you to use any object
+ *  type.
+ *
+ *  Hashes enumerate their values in the order that the corresponding keys
+ *  were inserted.
+ *
+ *  A Hash can be easily created by using its implicit form:
+ *
+ *    grades = { "Jane Doe" => 10, "Jim Doe" => 6 }
+ *
+ *  Hashes allow an alternate syntax form when your keys are always symbols.
+ *  Instead of
+ *
+ *    options = { :font_size => 10, :font_family => "Arial" }
+ *
+ *  You could write it as:
+ *
+ *    options = { font_size: 10, font_family: "Arial" }
+ *
+ *  Each named key is a symbol you can access in hash:
+ *
+ *    options[:font_size]  # => 10
+ *
+ *  A Hash can also be created through its ::new method:
+ *
+ *    grades = Hash.new
+ *    grades["Dorothy Doe"] = 9
  *
  *  Hashes have a <em>default value</em> that is returned when accessing
- *  keys that do not exist in the hash. By default, that value is
- *  <code>nil</code>.
+ *  keys that do not exist in the hash. If no default is set +nil+ is used.
+ *  You can set the default value by sending it as an argument to Hash.new:
+ *
+ *    grades = Hash.new(0)
+ *
+ *  Or by using the #default= method:
+ *
+ *    grades = {"Timmy Doe" => 8}
+ *    grades.default = 0
+ *
+ *  Accessing a value in a Hash requires using its key:
+ *
+ *    puts grades["Jane Doe"] # => 10
+ *
+ *  === Common Uses
+ *
+ *  Hashes are an easy way to represent data structures, such as
+ *
+ *    books         = {}
+ *    books[:matz]  = "The Ruby Language"
+ *    books[:black] = "The Well-Grounded Rubyist"
+ *
+ *  Hashes are also commonly used as a way to have named parameters in
+ *  functions. Note that no brackets are used below. If a hash is the last
+ *  argument on a method call, no braces are needed, thus creating a really
+ *  clean interface:
+ *
+ *    Person.create(name: "John Doe", age: 27)
+ *
+ *    def self.create(params)
+ *      @name = params[:name]
+ *      @age  = params[:age]
+ *    end
+ *
+ *  === Hash Keys
+ *
+ *  Two objects refer to the same hash key when their <code>hash</code> value
+ *  is identical and the two objects are <code>eql?</code> to each other.
+ *
+ *  A user-defined class may be used as a hash key if the <code>hash</code>
+ *  and <code>eql?</code> methods are overridden to provide meaningful
+ *  behavior.  By default, separate instances refer to separate hash keys.
+ *
+ *  A typical implementation of <code>hash</code> is based on the
+ *  object's data while <code>eql?</code> is usually aliased to the overridden
+ *  <code>==</code> method:
+ *
+ *    class Book
+ *      attr_reader :author, :title
+ *
+ *      def initialize(author, title)
+ *        @author = author
+ *        @title = title
+ *      end
+ *
+ *      def ==(other)
+ *        self.class === other and
+ *          other.author == @author and
+ *          other.title == @title
+ *      end
+ *
+ *      alias eql? ==
+ *
+ *      def hash
+ *        @author.hash ^ @title.hash # XOR
+ *      end
+ *    end
+ *
+ *    book1 = Book.new 'matz', 'Ruby in a Nutshell'
+ *    book2 = Book.new 'matz', 'Ruby in a Nutshell'
+ *
+ *    reviews = {}
+ *
+ *    reviews[book1] = 'Great reference!'
+ *    reviews[book2] = 'Nice and compact!'
+ *
+ *    reviews.length #=> 1
  *
+ *  See also Object#hash and Object#eql?
  */
 
 void
diff --git a/include/ruby/st.h b/include/ruby/st.h
index 50f2a75..119dfde 100644
--- a/include/ruby/st.h
+++ b/include/ruby/st.h
@@ -36,7 +36,7 @@ typedef unsigned long st_data_t;
 #elif SIZEOF_LONG_LONG == SIZEOF_VOIDP
 typedef unsigned LONG_LONG st_data_t;
 #else
-# error ---->> st.c requires sizeof(void*) == sizeof(long) to be compiled. <<----
+# error ---->> st.c requires sizeof(void*) == sizeof(long) or sizeof(LONG_LONG) to be compiled. <<----
 #endif
 #define ST_DATA_T_DEFINED
 
@@ -74,6 +74,11 @@ struct st_hash_type {
 
 #define ST_INDEX_BITS (sizeof(st_index_t) * CHAR_BIT)
 
+typedef struct st_packed_entry {
+    st_index_t hash;
+    st_data_t key, val;
+} st_packed_entry;
+
 struct st_table {
     const struct st_hash_type *type;
     st_index_t num_bins;
@@ -91,8 +96,17 @@ struct st_table {
     __extension__
 #endif
     st_index_t num_entries : ST_INDEX_BITS - 1;
-    struct st_table_entry **bins;
-    struct st_table_entry *head, *tail;
+    union {
+	struct {
+	    struct st_table_entry **bins;
+	    struct st_table_entry *head, *tail;
+	} big;
+	struct {
+	    struct st_packed_entry *entries;
+	    st_index_t real_entries;
+	} packed;
+	st_packed_entry upacked;
+    } as;
 };
 
 #define st_is_member(table,key) st_lookup((table),(key),(st_data_t *)0)
@@ -114,6 +128,7 @@ int st_insert2(st_table *, st_data_t, st_data_t, st_data_t (*)(st_data_t));
 int st_lookup(st_table *, st_data_t, st_data_t *);
 int st_get_key(st_table *, st_data_t, st_data_t *);
 int st_foreach(st_table *, int (*)(ANYARGS), st_data_t);
+int st_foreach_check(st_table *, int (*)(ANYARGS), st_data_t, st_data_t);
 int st_reverse_foreach(st_table *, int (*)(ANYARGS), st_data_t);
 void st_add_direct(st_table *, st_data_t, st_data_t);
 void st_free_table(st_table *);
diff --git a/internal.h b/internal.h
index 5d0cff0..99b4015 100644
--- a/internal.h
+++ b/internal.h
@@ -112,6 +112,9 @@ VALUE rb_iseq_clone(VALUE iseqval, VALUE newcbase);
 
 /* load.c */
 VALUE rb_get_load_path(void);
+void rb_reset_expanded_cache();
+void rb_load_path_ary_push(VALUE path);
+extern VALUE rb_cExpandedPath;
 
 /* math.c */
 VALUE rb_math_atan2(VALUE, VALUE);
diff --git a/load.c b/load.c
index 0ff4b60..80b2256 100644
--- a/load.c
+++ b/load.c
@@ -4,6 +4,7 @@
 
 #include "ruby/ruby.h"
 #include "ruby/util.h"
+#include "ruby/encoding.h"
 #include "internal.h"
 #include "dln.h"
 #include "eval_intern.h"
@@ -18,6 +19,7 @@ VALUE ruby_dln_librefs;
 #define IS_DLEXT(e) (strcmp((e), DLEXT) == 0)
 #endif
 
+static int sorted_loaded_features = 1;
 
 static const char *const loadable_ext[] = {
     ".rb", DLEXT,
@@ -27,28 +29,45 @@ static const char *const loadable_ext[] = {
     0
 };
 
-VALUE
-rb_get_load_path(void)
-{
-    VALUE load_path = GET_VM()->load_path;
-    return load_path;
-}
+static VALUE rb_checked_expanded_cache(int*);
+static void rb_set_expanded_cache(VALUE, int);
+static VALUE rb_expand_load_paths(long, VALUE*, int*);
+static int cached_expanded_load_path = 1;
+VALUE rb_cExpandedPath;
 
 VALUE
 rb_get_expanded_load_path(void)
 {
-    VALUE load_path = rb_get_load_path();
-    VALUE ary;
-    long i;
+    VALUE expanded = rb_checked_expanded_cache(NULL);
 
-    ary = rb_ary_new2(RARRAY_LEN(load_path));
-    for (i = 0; i < RARRAY_LEN(load_path); ++i) {
-	VALUE path = rb_file_expand_path(RARRAY_PTR(load_path)[i], Qnil);
-	rb_str_freeze(path);
-	rb_ary_push(ary, path);
+    if ( !RTEST(expanded) ) {
+	VALUE load_path = GET_VM()->load_path;
+	int has_relative = 0;
+
+	if (!load_path) return 0;
+
+	expanded = rb_expand_load_paths(
+			RARRAY_LEN(load_path), RARRAY_PTR(load_path),
+			&has_relative);
+	RB_GC_GUARD(load_path);
+
+	if (cached_expanded_load_path) {
+	    rb_set_expanded_cache(expanded, has_relative);
+	}
+    } else {
+	expanded = rb_ary_dup(expanded);
     }
-    rb_obj_freeze(ary);
-    return ary;
+    return expanded;
+}
+
+VALUE
+rb_get_load_path(void)
+{
+    VALUE load_path =
+	cached_expanded_load_path ?
+	    rb_get_expanded_load_path():
+	    GET_VM()->load_path;
+    return load_path;
 }
 
 static VALUE
@@ -129,6 +148,9 @@ loaded_feature_path_i(st_data_t v, st_data_t b, st_data_t f)
     return ST_STOP;
 }
 
+static long rb_feature_first_equal_or_greater(VALUE, const char *, long);
+static int  rb_stop_search_feature(VALUE, const char *, long);
+
 static int
 rb_feature_p(const char *feature, const char *ext, int rb, int expanded, const char **fn)
 {
@@ -151,8 +173,10 @@ rb_feature_p(const char *feature, const char *ext, int rb, int expanded, const c
 	type = 0;
     }
     features = get_loaded_features();
-    for (i = 0; i < RARRAY_LEN(features); ++i) {
+    i = rb_feature_first_equal_or_greater(features, feature, len);
+    for (; i < RARRAY_LEN(features); ++i) {
 	v = RARRAY_PTR(features)[i];
+	if (rb_stop_search_feature(v, feature, len)) break;
 	f = StringValuePtr(v);
 	if ((n = RSTRING_LEN(v)) < len) continue;
 	if (strncmp(f, feature, len) != 0) {
@@ -176,14 +200,14 @@ rb_feature_p(const char *feature, const char *ext, int rb, int expanded, const c
 	}
     }
     loading_tbl = get_loading_table();
-    if (loading_tbl) {
+    if (loading_tbl && loading_tbl->num_entries > 0) {
 	f = 0;
 	if (!expanded) {
 	    struct loaded_feature_searching fs;
 	    fs.name = feature;
 	    fs.len = len;
 	    fs.type = type;
-	    fs.load_path = load_path ? load_path : rb_get_load_path();
+	    fs.load_path = load_path ? load_path : rb_get_expanded_load_path();
 	    fs.result = 0;
 	    st_foreach(loading_tbl, loaded_feature_path_i, (st_data_t)&fs);
 	    if ((f = fs.result) != 0) {
@@ -251,6 +275,170 @@ rb_feature_provided(const char *feature, const char **loading)
     return FALSE;
 }
 
+static long
+feature_basename_length(const char *feature, long flen)
+{
+    if (sorted_loaded_features) {
+	const char *ext = strrchr(feature, '.');
+	return ext && !strchr(ext, '/') ? ext - feature : flen;
+    } else {
+	return 0;
+    }
+}
+
+static int
+compare_feature_name(const char *left, long llen, const char *right, long rlen)
+{
+    int diff = 0;
+    while (llen-- && rlen--) {
+	diff = left[llen] - right[rlen];
+	if (diff) break;
+	if (left[llen] == '/') break;
+    }
+    return diff;
+}
+
+static int
+rb_compare_feature_name(VALUE loaded, const char *feature, long flen)
+{
+    const char *loaded_name = StringValuePtr(loaded);
+    long loaded_len = feature_basename_length(loaded_name, RSTRING_LEN(loaded));
+    return compare_feature_name(loaded_name, loaded_len, feature, flen);
+}
+
+/* used to find when equal features run out */
+static int
+rb_stop_search_feature(VALUE loaded, const char *feature, long flen)
+{
+    if (sorted_loaded_features)
+	return rb_compare_feature_name(loaded, feature, flen) > 0;
+    else
+	return FALSE;
+}
+
+/* returns first position to search feature from */
+static long
+rb_feature_first_equal_or_greater(VALUE features, const char *feature, long flen)
+{
+    if (sorted_loaded_features) {
+	long before = 0, first = RARRAY_LEN(features);
+	VALUE *values = RARRAY_PTR(features);
+	if (first == 0)
+	    return 0;
+	if (rb_compare_feature_name(values[0], feature, flen) >= 0)
+	    return 0;
+
+	while (first - before > 1) {
+	    long mid = (first + before) / 2;
+	    long cmp = rb_compare_feature_name(values[mid], feature, flen);
+	    if (cmp >= 0)
+		first = mid;
+	    else
+		before = mid;
+	}
+	return first;
+    } else {
+	return 0;
+    }
+}
+
+/* returns position to insert new feature in */
+static long
+rb_feature_first_greater(VALUE features, const char *feature, long flen)
+{
+    if (sorted_loaded_features) {
+	long before = 0, first = RARRAY_LEN(features);
+	VALUE *values = RARRAY_PTR(features);
+	if (first == 0)
+	    return 0;
+	if (rb_compare_feature_name(values[0], feature, flen) > 0)
+	    return 0;
+	if (rb_compare_feature_name(values[first-1], feature, flen) <= 0)
+	    return first;
+
+	while (first - before > 1) {
+	    long mid = (first + before) / 2;
+	    long cmp = rb_compare_feature_name(values[mid], feature, flen);
+	    if (cmp > 0)
+		first = mid;
+	    else
+		before = mid;
+	}
+	return first;
+    } else {
+	return RARRAY_LEN(features);
+    }
+}
+
+
+static VALUE
+rb_push_feature_1(VALUE features, VALUE feature)
+{
+    const char *fname = StringValuePtr(feature);
+    long flen = feature_basename_length(fname, RSTRING_LEN(feature));
+    long i = rb_feature_first_greater(features, fname, flen);
+    rb_ary_push(features, feature);
+    if ( i < RARRAY_LEN(features) - 1 ) {
+	MEMMOVE(RARRAY_PTR(features) + i + 1, RARRAY_PTR(features) + i,
+		VALUE, RARRAY_LEN(features) - i - 1);
+	RARRAY_PTR(features)[i] = feature;
+    }
+    return features;
+}
+
+static VALUE
+rb_push_feature_m(long argc, VALUE *argv, VALUE features)
+{
+    while (argc--) {
+	rb_push_feature_1(features, *argv++);
+    }
+    return features;
+}
+
+static VALUE
+rb_concat_features(VALUE features, VALUE add)
+{
+    add = rb_convert_type(add, T_ARRAY, "Array", "to_ary");
+    if (RARRAY_LEN(add)) {
+	rb_push_feature_m(RARRAY_LEN(add), RARRAY_PTR(add), features);
+    }
+    return features;
+}
+static const char *load_features_undefined_methods[] = {
+    "[]=", "reverse!", "rotate!", "sort!", "sort_by!",
+    "collect!", "map!", "shuffle!", "fill", "insert",
+    NULL
+};
+
+static VALUE
+rb_loaded_features_init(void)
+{
+    char *sorted_flag;
+    const char **name;
+    VALUE loaded_features = rb_ary_new();
+    VALUE loaded_features_c = rb_singleton_class(loaded_features);
+
+    sorted_flag = getenv("RUBY_LOADED_FEATURES_SORTED");
+    if (sorted_flag != NULL) {
+	int sorted_set = atoi(sorted_flag);
+	if (RTEST(ruby_verbose))
+	    fprintf(stderr, "sorted_loaded_features=%d (%d)\n", sorted_set, sorted_loaded_features);
+	sorted_loaded_features = sorted_set;
+    }
+
+    for(name = load_features_undefined_methods; *name; name++) {
+	rb_undef_method(loaded_features_c, *name);
+    }
+
+    if (sorted_loaded_features) {
+	rb_define_method(loaded_features_c, "<<", rb_push_feature_1, 1);
+	rb_define_method(loaded_features_c, "push", rb_push_feature_m, -1);
+	rb_define_method(loaded_features_c, "concat", rb_concat_features, 1);
+	rb_define_method(loaded_features_c, "unshift", rb_push_feature_m, -1);
+    }
+    return loaded_features;
+}
+
 static void
 rb_provide_feature(VALUE feature)
 {
@@ -258,7 +446,10 @@ rb_provide_feature(VALUE feature)
 	rb_raise(rb_eRuntimeError,
 		 "$LOADED_FEATURES is frozen; cannot append feature");
     }
-    rb_ary_push(get_loaded_features(), feature);
+    if (sorted_loaded_features)
+	rb_push_feature_1(get_loaded_features(), feature);
+    else
+	rb_ary_push(get_loaded_features(), feature);
 }
 
 void
@@ -760,6 +951,230 @@ rb_f_autoload_p(VALUE obj, VALUE sym)
     return rb_mod_autoload_p(klass, sym);
 }
 
+/* $LOAD_PATH methods which invalidates cache */
+static const char *load_path_reset_cache_methods[] = {
+    "[]=", "collect!", "compact!", "delete",
+    "delete_if", "fill", "flatten!", "insert", "keep_if",
+    "map!", "reject!", "replace", "select!", "shuffle!",
+    "sort!", "sort_by!", "uniq!", NULL
+};
+
+/* $LOAD_PATH methods which sends also to cache */
+static const char *load_path_apply_to_cache_methods[] = {
+    "clear", "delete_at", "pop", "reverse!", "rotate!",
+    "shift", "slice!", NULL
+};
+
+/* $LOAD_PATH methods which sends to cache whith expanded arguments */
+static const char *load_path_apply_expanded_methods[] = {
+    "<<", "push", "unshift", NULL
+};
+
+void
+rb_reset_expanded_cache()
+{
+    GET_VM()->load_path_expanded_cache = 0;
+}
+
+static VALUE
+rb_load_path_expanded_cache()
+{
+    VALUE cache = GET_VM()->load_path_expanded_cache;
+    VALUE expanded = Qnil;
+    if (RTEST(cache)) {
+	expanded = RARRAY_PTR(cache)[2];
+    }
+    return expanded;
+}
+
+/* Return cache only if we still in the same working directory
+ * and filesystem_encoding didn't change
+ * Invalidate cache otherwise
+ */
+static VALUE
+rb_checked_expanded_cache(int *has_relative)
+{
+    VALUE cache = GET_VM()->load_path_expanded_cache;
+    VALUE expanded = Qnil;
+    if (RTEST(cache)) {
+	VALUE curwd = RARRAY_PTR(cache)[0];
+	VALUE encindex = RARRAY_PTR(cache)[1];
+	int cache_valid = rb_filesystem_encindex() == FIX2INT(encindex);
+
+	if ( cache_valid ) {
+	    cache_valid = curwd == Qtrue;
+	    if (has_relative) {
+		*has_relative = cache_valid;
+	    }
+	    if (!cache_valid ) {
+		char *cwd = my_getcwd();
+		cache_valid = !strcmp(RSTRING_PTR(curwd), cwd);
+		xfree(cwd);
+	    }
+	}
+
+	if ( !cache_valid ) {
+	    rb_reset_expanded_cache();
+	} else {
+	    expanded = RARRAY_PTR(cache)[2];
+	}
+    }
+    RB_GC_GUARD(cache);
+    return expanded;
+}
+
+static void
+rb_set_expanded_cache(VALUE expanded, int has_relative)
+{
+    VALUE cache = rb_ary_new2(3);
+
+    if (has_relative) {
+	char *cwd = my_getcwd();
+	rb_ary_push(cache, rb_str_new_cstr(cwd));
+	xfree(cwd);
+    } else {
+	rb_ary_push(cache, Qtrue);
+    }
+
+    rb_ary_push(cache, INT2FIX(rb_filesystem_encindex()));
+    rb_ary_push(cache, rb_ary_dup(expanded));
+    GET_VM()->load_path_expanded_cache = cache;
+}
+
+static VALUE
+rb_expand_load_paths(long pathc, VALUE* paths, int *has_relative)
+{
+    long i;
+    const char *p;
+    VALUE path, expanded = rb_ary_new2(pathc);
+
+    for(i = 0; i < pathc; i++) {
+	path = rb_get_path(paths[i]);
+	p = RSTRING_PTR(path);
+	*has_relative = *has_relative || !rb_is_absolute_path(p);
+	path = rb_file_expand_path(path, Qnil);
+	RBASIC(path)->klass = rb_cExpandedPath;
+	rb_str_freeze(path);
+	rb_ary_push(expanded, path);
+    }
+
+    return expanded;
+}
+
+/* Invalidating $LOAD_PATH methods implementation */
+static VALUE
+rb_load_path_reset_cache_method(int argc, VALUE *argv, VALUE self)
+{
+    rb_reset_expanded_cache();
+    return rb_call_super(argc, argv);
+}
+
+/* Proxying $LOAD_PATH methods implementation */
+static VALUE
+rb_load_path_apply_to_cache_method(int argc, VALUE *argv, VALUE self)
+{
+    VALUE load_path_expanded = rb_load_path_expanded_cache();
+    if (RTEST(load_path_expanded)) {
+	ID func = rb_frame_this_func();
+	rb_funcall2(load_path_expanded, func, argc, argv);
+    }
+    return rb_call_super(argc, argv);
+}
+
+/* Proxying with expansion $LOAD_PATH methods implementation */
+static VALUE
+rb_load_path_apply_expanded_method(int argc, VALUE *argv, VALUE self)
+{
+    int old_has_relative = 0;
+    /* We call methods on cache only if we still in the same working directory */
+    VALUE load_path_expanded = rb_checked_expanded_cache(&old_has_relative);
+    if (RTEST(load_path_expanded)) {
+	int has_relative = 0;
+	ID func = rb_frame_this_func();
+	VALUE expanded = rb_expand_load_paths(argc, argv, &has_relative);
+
+	rb_funcall2(load_path_expanded, func, argc, RARRAY_PTR(expanded));
+
+	if (!old_has_relative && has_relative) {
+	    rb_set_expanded_cache(load_path_expanded, has_relative);
+	}
+	RB_GC_GUARD(expanded);
+    }
+    return rb_call_super(argc, argv);
+}
+/* $LOAD_PATH.concat(ary) - special, we call push(*ary) instead
+ * cause I'm lazy a bit and wish not to rewrite method above second time :)
+ */
+static VALUE
+rb_load_path_concat(VALUE self, VALUE ary)
+{
+    ID push;
+    CONST_ID(push, "push");
+    RB_GC_GUARD(ary);
+    return rb_funcall2(self, push, (int)RARRAY_LEN(ary), RARRAY_PTR(ary));
+}
+
+void
+rb_load_path_ary_push(VALUE path)
+{
+    int old_has_relative = 0;
+    VALUE load_path_expanded = rb_checked_expanded_cache(&old_has_relative);
+    if (RTEST(load_path_expanded)) {
+	int has_relative = 0;
+	VALUE expanded = rb_expand_load_paths(1, &path, &has_relative);
+
+	rb_ary_push(load_path_expanded, RARRAY_PTR(expanded)[0]);
+
+	if (!old_has_relative && has_relative) {
+	    rb_set_expanded_cache(load_path_expanded, has_relative);
+	}
+	RB_GC_GUARD(expanded);
+    }
+
+    rb_ary_push(GET_VM()->load_path, path);
+}
+
+static VALUE
+rb_load_path_init(void)
+{
+    const char **name;
+    VALUE load_path = rb_ary_new();
+    char *cached_flag;
+
+    cached_flag = getenv("RUBY_CACHED_LOAD_PATH");
+    if (cached_flag != NULL) {
+	cached_expanded_load_path = atoi(cached_flag);
+    }
+
+    rb_cExpandedPath = rb_class_new(rb_cString); /* XXX could GC collect it before next line is executed? */
+    rb_iv_set(rb_cFile, "expanded_path", rb_cExpandedPath); /* prevent from GC */
+
+    /* Do all the magick if user did not disable it
+     * with RUBY_CACHED_LOAD_PATH=0 environment variable
+     */
+    if (cached_expanded_load_path) {
+	VALUE load_path_c = rb_singleton_class(load_path);
+
+	for(name = load_path_reset_cache_methods; *name; name++ ) {
+	    rb_define_method(load_path_c, *name, rb_load_path_reset_cache_method, -1);
+	}
+
+	for(name = load_path_apply_to_cache_methods; *name; name++ ) {
+	    rb_define_method(load_path_c, *name, rb_load_path_apply_to_cache_method, -1);
+	}
+
+	for(name = load_path_apply_expanded_methods; *name; name++ ) {
+	    rb_define_method(load_path_c, *name, rb_load_path_apply_expanded_method, -1);
+	}
+
+	rb_define_method(load_path_c, "concat", rb_load_path_concat, 1);
+    }
+
+    rb_reset_expanded_cache();
+
+    return load_path;
+}
+
 void
 Init_load()
 {
@@ -772,11 +1187,11 @@ Init_load()
     rb_define_hooked_variable(var_load_path, (VALUE*)vm, load_path_getter, rb_gvar_readonly_setter);
     rb_alias_variable(rb_intern("$-I"), id_load_path);
     rb_alias_variable(rb_intern("$LOAD_PATH"), id_load_path);
-    vm->load_path = rb_ary_new();
+    vm->load_path = rb_load_path_init();
 
     rb_define_virtual_variable("$\"", get_loaded_features, 0);
     rb_define_virtual_variable("$LOADED_FEATURES", get_loaded_features, 0);
-    vm->loaded_features = rb_ary_new();
+    vm->loaded_features = rb_loaded_features_init();
 
     rb_define_global_function("load", rb_f_load, -1);
     rb_define_global_function("require", rb_f_require, 1);
diff --git a/pool_alloc.h b/pool_alloc.h
new file mode 100644
index 0000000..957708e
--- /dev/null
+++ b/pool_alloc.h
@@ -0,0 +1,11 @@
+#ifndef POOL_ALLOC_H
+#define POOL_ALLOC_H
+
+#define POOL_ALLOC_API
+#ifdef POOL_ALLOC_API
+void  ruby_xpool_free(void *ptr);
+void *ruby_xpool_malloc_6p();
+void *ruby_xpool_malloc_11p();
+#endif
+
+#endif
diff --git a/pool_alloc.inc.h b/pool_alloc.inc.h
new file mode 100644
index 0000000..026f40c
--- /dev/null
+++ b/pool_alloc.inc.h
@@ -0,0 +1,223 @@
+/*
+ * this is generic pool allocator
+ * you should define following macroses:
+ * ITEM_NAME - unique identifier, which allows to hold functions in a namespace
+ * ITEM_TYPEDEF(name) - passed to typedef to localize item type
+ * free_entry - desired name of function for free entry
+ * alloc_entry - defired name of function for allocate entry
+ */
+
+#if POOL_ALLOC_PART == 1
+#ifdef HEAP_ALIGN_LOG
+#define DEFAULT_POOL_SIZE (1 << HEAP_ALIGN_LOG)
+#else
+#define DEFAULT_POOL_SIZE (sizeof(void*) * 2048)
+#endif
+typedef unsigned int pool_holder_counter;
+
+typedef struct pool_entry_list pool_entry_list;
+typedef struct pool_holder pool_holder;
+
+typedef struct pool_header {
+    pool_holder         *first;
+    rb_atomic_t          lock;
+    pool_holder_counter  size; // size of entry in sizeof(void*) items
+    pool_holder_counter  total; // size of entry in sizeof(void*) items
+} pool_header;
+
+struct pool_holder {
+    pool_holder_counter free, total;
+    pool_header  *header;
+    void               *freep;
+    pool_holder        *fore, *back;
+    void *data[1];
+};
+#define POOL_DATA_SIZE(pool_size) (((pool_size) - sizeof(void*) * 6 - offsetof(pool_holder, data)) / sizeof(void*))
+#define POOL_ENTRY_SIZE(item_type) ((sizeof(item_type) - 1) / sizeof(void*) + 1)
+#define POOL_HOLDER_COUNT(pool_size, item_type) (POOL_DATA_SIZE(pool_size)/POOL_ENTRY_SIZE(item_type))
+#define INIT_POOL(item_type) {NULL, 0, POOL_ENTRY_SIZE(item_type), POOL_HOLDER_COUNT(DEFAULT_POOL_SIZE, item_type)}
+
+#elif POOL_ALLOC_PART == 2
+
+#if   defined(_WIN32)
+#define native_thread_yield() Sleep(0)
+#elif HAVE_SCHED_YIELD
+#define native_thread_yield() (void)sched_yield()
+#else
+#define native_thread_yield() ((void)0)
+#endif
+
+#define MAX_TRY_CICLES 5
+static inline int
+living_threads()
+{
+    rb_vm_t *vm = GET_VM();
+    st_table *living_threads;
+    return vm && (living_threads = vm->living_threads) ? living_threads->num_entries : 1;
+}
+
+static void
+lock_header(pool_header *header)
+{
+    int i;
+    if (living_threads() == 1) {
+	header->lock = 1;
+	return;
+    }
+    i = MAX_TRY_CICLES;
+    while(ATOMIC_EXCHANGE(header->lock, 1)) {
+	if (--i == 0) {
+	    native_thread_yield();
+	    i = MAX_TRY_CICLES;
+	}
+    }
+}
+
+static inline void
+unlock_header(pool_header *header)
+{
+    if (living_threads() == 1) {
+	header->lock = 0;
+	return;
+    }
+    ATOMIC_SET(header->lock, 0);
+}
+
+static pool_holder *
+pool_holder_alloc(pool_header *header)
+{
+    pool_holder *holder;
+    pool_holder_counter i, size, count;
+    register void **ptr;
+
+    size_t sz = offsetof(pool_holder, data) +
+	    header->size * header->total * sizeof(void*);
+#define objspace (&rb_objspace)
+    unlock_header(header);
+    vm_malloc_prepare(objspace, DEFAULT_POOL_SIZE);
+    lock_header(header);
+    if (header->first != NULL) {
+	return header->first;
+    }
+    holder = (pool_holder*) aligned_malloc(DEFAULT_POOL_SIZE, sz);
+    if (!holder) {
+	unlock_header(header);
+	if (!garbage_collect_with_gvl(objspace)) {
+	    ruby_memerror();
+	}
+	holder = (pool_holder*) aligned_malloc(DEFAULT_POOL_SIZE, sz);
+	if (!holder) {
+	    ruby_memerror();
+	}
+	lock_header(header);
+    }
+    malloc_increase += DEFAULT_POOL_SIZE;
+#if CALC_EXACT_MALLOC_SIZE
+    objspace->malloc_params.allocated_size += DEFAULT_POOL_SIZE;
+    objspace->malloc_params.allocations++;
+#endif
+#undef objspace
+
+    size = header->size;
+    count = header->total;
+    holder->free = count;
+    holder->total = count;
+    holder->header = header;
+    holder->fore = NULL;
+    holder->back = NULL;
+    holder->freep = &holder->data;
+    ptr = holder->data;
+    for(i = count - 1; i; i-- ) {
+	ptr = *ptr = ptr + size;
+    }
+    *ptr = NULL;
+    header->first = holder;
+    return holder;
+}
+
+static inline void
+pool_holder_unchaing(pool_header *header, pool_holder *holder)
+{
+    register pool_holder *fore = holder->fore, *back = holder->back;
+    holder->fore = NULL;
+    holder->back = NULL;
+    if (fore != NULL)  fore->back     = back;
+    if (back != NULL)  back->fore     = fore;
+    else               header->first = fore;
+}
+
+static inline pool_holder *
+entry_holder(void **entry)
+{
+    return (pool_holder*)(((uintptr_t)entry) & ~(DEFAULT_POOL_SIZE - 1));
+}
+
+static inline void
+pool_free_entry(void **entry)
+{
+    pool_holder *holder = entry_holder(entry);
+    pool_header *header = holder->header;
+
+    lock_header(header);
+
+    if (holder->free++ == 0) {
+	register pool_holder *first = header->first;
+	if (first == NULL) {
+	    header->first = holder;
+	} else {
+	    holder->back = first;
+	    holder->fore = first->fore;
+	    first->fore = holder;
+	    if (holder->fore)
+		holder->fore->back = holder;
+	}
+    } else if (holder->free == holder->total && header->first != holder ) {
+	pool_holder_unchaing(header, holder);
+	aligned_free(holder);
+#if CALC_EXACT_MALLOC_SIZE
+	rb_objspace.malloc_params.allocated_size -= DEFAULT_POOL_SIZE;
+	rb_objspace.malloc_params.allocations--;
+#endif
+        unlock_header(header);
+	return;
+    }
+
+    *entry = holder->freep;
+    holder->freep = entry;
+    unlock_header(header);
+}
+
+static inline void*
+pool_alloc_entry(pool_header *header)
+{
+    pool_holder *holder;
+    void **result;
+
+    lock_header(header);
+    holder = header->first;
+
+    if (holder == NULL) {
+	holder = pool_holder_alloc(header);
+    }
+
+    result = holder->freep;
+    holder->freep = *result;
+
+    if (--holder->free == 0) {
+	pool_holder_unchaing(header, holder);
+    }
+
+    unlock_header(header);
+
+    return result;
+}
+
+static void
+pool_finalize_header(pool_header *header)
+{
+    if (header->first) {
+        aligned_free(header->first);
+        header->first = NULL;
+    }
+}
+#endif
diff --git a/ruby.c b/ruby.c
index 3c97d01..b9b9fd5 100644
--- a/ruby.c
+++ b/ruby.c
@@ -209,7 +209,6 @@ push_include(const char *path, VALUE (*filter)(VALUE))
 {
     const char sep = PATH_SEP_CHAR;
     const char *p, *s;
-    VALUE load_path = GET_VM()->load_path;
 
     p = path;
     while (*p) {
@@ -217,7 +216,7 @@ push_include(const char *path, VALUE (*filter)(VALUE))
 	    p++;
 	if (!*p) break;
 	for (s = p; *s && *s != sep; s = CharNext(s));
-	rb_ary_push(load_path, (*filter)(rubylib_mangled_path(p, s - p)));
+	rb_load_path_ary_push((*filter)(rubylib_mangled_path(p, s - p)));
 	p = s;
     }
 }
@@ -338,7 +337,6 @@ ruby_init_loadpath(void)
 void
 ruby_init_loadpath_safe(int safe_level)
 {
-    VALUE load_path;
     ID id_initial_load_path_mark;
     extern const char ruby_initial_load_paths[];
     const char *paths = ruby_initial_load_paths;
@@ -438,7 +436,6 @@ ruby_init_loadpath_safe(int safe_level)
 #define RUBY_RELATIVE(path, len) rubylib_mangled_path((path), (len))
 #define PREFIX_PATH() RUBY_RELATIVE(exec_prefix, sizeof(exec_prefix)-1)
 #endif
-    load_path = GET_VM()->load_path;
 
     if (safe_level == 0) {
 #ifdef MANGLED_PATH
@@ -452,7 +449,7 @@ ruby_init_loadpath_safe(int safe_level)
 	size_t len = strlen(paths);
 	VALUE path = RUBY_RELATIVE(paths, len);
 	rb_ivar_set(path, id_initial_load_path_mark, path);
-	rb_ary_push(load_path, path);
+	rb_load_path_ary_push(path);
 	paths += len + 1;
     }
 
@@ -1349,6 +1346,7 @@ process_options(int argc, char **argv, struct cmdline_options *opt)
 	for (i = 0; i < RARRAY_LEN(load_path); ++i) {
 	    rb_enc_associate(RARRAY_PTR(load_path)[i], lenc);
 	}
+	rb_reset_expanded_cache();
     }
     if (!(opt->disable & DISABLE_BIT(gems))) {
 #if defined DISABLE_RUBYGEMS && DISABLE_RUBYGEMS
diff --git a/st.c b/st.c
index fda5784..890bdca 100644
--- a/st.c
+++ b/st.c
@@ -7,6 +7,7 @@
 #include "st.h"
 #else
 #include "ruby/ruby.h"
+#include "pool_alloc.h"
 #endif
 
 #include <stdio.h>
@@ -25,8 +26,17 @@ struct st_table_entry {
     st_table_entry *fore, *back;
 };
 
-#define ST_DEFAULT_MAX_DENSITY 5
+#define STATIC_ASSERT(name, expr) typedef int static_assert_##name##_check[(expr) ? 1 : -1];
+
+#define ST_DEFAULT_MAX_DENSITY 2
 #define ST_DEFAULT_INIT_TABLE_SIZE 11
+#define ST_DEFAULT_SECOND_TABLE_SIZE 19
+#define ST_DEFAULT_PACKED_TABLE_SIZE 18
+#define PACKED_UNIT (int)(sizeof(st_packed_entry) / sizeof(st_table_entry*))
+#define MAX_PACKED_HASH (int)(ST_DEFAULT_PACKED_TABLE_SIZE * sizeof(st_table_entry*) / sizeof(st_packed_entry))
+
+STATIC_ASSERT(st_packed_entry, sizeof(st_packed_entry) == sizeof(st_table_entry*[PACKED_UNIT]))
+STATIC_ASSERT(st_packed_bins, sizeof(st_packed_entry[MAX_PACKED_HASH]) <= sizeof(st_table_entry*[ST_DEFAULT_PACKED_TABLE_SIZE]))
 
     /*
      * DEFAULT_MAX_DENSITY is the default for the largest we allow the
@@ -38,7 +48,8 @@ struct st_table_entry {
      *
      */
 
-static const struct st_hash_type type_numhash = {
+#define type_numhash st_hashtype_num
+const struct st_hash_type st_hashtype_num = {
     st_numcmp,
     st_numhash,
 };
@@ -61,20 +72,127 @@ static void rehash(st_table *);
 #ifdef RUBY
 #define malloc xmalloc
 #define calloc xcalloc
+#define realloc xrealloc
 #define free(x) xfree(x)
 #endif
 
 #define numberof(array) (int)(sizeof(array) / sizeof((array)[0]))
 
-#define alloc(type) (type*)malloc((size_t)sizeof(type))
-#define Calloc(n,s) (char*)calloc((n),(s))
-
 #define EQUAL(table,x,y) ((x)==(y) || (*(table)->type->compare)((x),(y)) == 0)
 
-/* remove cast to unsigned int in the future */
-#define do_hash(key,table) (unsigned int)(st_index_t)(*(table)->type->hash)((key))
+#define do_hash(key,table) (st_index_t)(*(table)->type->hash)((key))
 #define do_hash_bin(key,table) (do_hash((key), (table))%(table)->num_bins)
 
+/* preparation for possible allocation improvements */
+#ifdef POOL_ALLOC_API
+#define st_alloc_entry() (st_table_entry *)ruby_xpool_malloc_6p()
+#define st_free_entry(entry) ruby_xpool_free(entry)
+#define st_alloc_table() (st_table *)ruby_xpool_malloc_6p()
+#define st_dealloc_table(table) ruby_xpool_free(table)
+static inline st_table_entry **
+st_alloc_bins(st_index_t size)
+{
+    st_table_entry **result;
+    if (size == 11) {
+        result = (st_table_entry **) ruby_xpool_malloc_11p();
+        memset(result, 0, 11 * sizeof(st_table_entry *));
+    }
+    else
+        result = (st_table_entry **) ruby_xcalloc(size, sizeof(st_table_entry*));
+    return result;
+}
+static inline void
+st_free_bins(st_table_entry **bins, st_index_t size)
+{
+    if (size == 11)
+	ruby_xpool_free(bins);
+    else
+	ruby_xfree(bins);
+}
+static inline st_table_entry**
+st_realloc_bins(st_table_entry **bins, st_index_t newsize, st_index_t oldsize)
+{
+    st_free_bins(bins, oldsize);
+    return st_alloc_bins(newsize);
+}
+#else
+#define st_alloc_entry() (st_table_entry *)malloc(sizeof(st_table_entry))
+#define st_free_entry(entry) free(entry)
+#define st_alloc_table() (st_table *)malloc(sizeof(st_table))
+#define st_dealloc_table(table) free(table)
+#define st_alloc_bins(size) (st_table_entry **)calloc(size, sizeof(st_table_entry *))
+#define st_free_bins(bins, size) free(bins)
+static inline st_table_entry**
+st_realloc_bins(st_table_entry **bins, st_index_t newsize, st_index_t oldsize)
+{
+    bins = (st_table_entry **)realloc(bins, newsize * sizeof(st_table_entry *));
+    MEMZERO(bins, st_table_entry*, newsize);
+    return bins;
+}
+#endif
+
+/* Shortage */
+#define bins as.big.bins
+#define head as.big.head
+#define tail as.big.tail
+#define real_entries as.packed.real_entries
+
+/* preparation for possible packing improvements */
+#define PACKED_BINS(table) ((table)->as.packed.entries)
+#define PACKED_ENT(table, i) PACKED_BINS(table)[i]
+#define PKEY(table, i) PACKED_ENT((table), (i)).key
+#define PVAL(table, i) PACKED_ENT((table), (i)).val
+#define PHASH(table, i) PACKED_ENT((table), (i)).hash
+#define PKEY_SET(table, i, v) (PKEY((table), (i)) = (v))
+#define PVAL_SET(table, i, v) (PVAL((table), (i)) = (v))
+#define PHASH_SET(table, i, v) (PHASH((table), (i)) = (v))
+
+/* this function depends much on packed layout, so that it placed here */
+static inline void
+remove_packed_entry(st_table *table, st_index_t i)
+{
+    table->real_entries--;
+    table->num_entries--;
+    if (i < table->real_entries) {
+	MEMMOVE(&PACKED_ENT(table, i), &PACKED_ENT(table, i+1),
+		st_packed_entry, table->real_entries - i);
+    }
+}
+
+static inline void
+remove_safe_packed_entry(st_table *table, st_index_t i, st_data_t never)
+{
+    table->num_entries--;
+    PKEY_SET(table, i, never);
+    PVAL_SET(table, i, never);
+    PHASH_SET(table, i, 0);
+}
+
+/* ultrapacking */
+#define real_upacked num_bins
+#define MAX_UPACKED_HASH 1
+#define ULTRAPACKED(table) ((table)->real_upacked <= 1)
+#define UPACKED_ENT(table) ((table)->as.upacked)
+#define UPKEY(table) UPACKED_ENT(table).key
+#define UPVAL(table) UPACKED_ENT(table).val
+#define UPHASH(table) UPACKED_ENT(table).hash
+#define UPKEY_SET(table, v) (UPACKED_ENT(table).key = (v))
+#define UPVAL_SET(table, v) (UPACKED_ENT(table).val = (v))
+#define UPHASH_SET(table, v) (UPACKED_ENT(table).hash = (v))
+static inline void
+remove_upacked_entry(st_table *table)
+{
+    table->real_upacked = table->num_entries = 0;
+}
+
+static inline void
+remove_safe_upacked_entry(st_table *table, st_data_t never)
+{
+    table->num_entries = 0;
+    UPKEY_SET(table, never);
+    UPVAL_SET(table, never);
+    UPHASH_SET(table, 0);
+}
 /*
  * MINSIZE is the minimum size of a dictionary.
  */
@@ -85,8 +203,8 @@ static void rehash(st_table *);
 Table of prime numbers 2^n+a, 2<=n<=30.
 */
 static const unsigned int primes[] = {
-	8 + 3,
-	16 + 3,
+	ST_DEFAULT_INIT_TABLE_SIZE,
+	ST_DEFAULT_SECOND_TABLE_SIZE,
 	32 + 5,
 	64 + 3,
 	128 + 3,
@@ -161,8 +279,6 @@ stat_col(void)
 }
 #endif
 
-#define MAX_PACKED_NUMHASH (ST_DEFAULT_INIT_TABLE_SIZE/2)
-
 st_table*
 st_init_table_with_size(const struct st_hash_type *type, st_index_t size)
 {
@@ -181,14 +297,19 @@ st_init_table_with_size(const struct st_hash_type *type, st_index_t size)
     }
 #endif
 
-    size = new_size(size);	/* round up to prime number */
 
-    tbl = alloc(st_table);
+    tbl = st_alloc_table();
     tbl->type = type;
     tbl->num_entries = 0;
-    tbl->entries_packed = type == &type_numhash && size/2 <= MAX_PACKED_NUMHASH;
+    tbl->entries_packed = size <= MAX_PACKED_HASH;
+    if (tbl->entries_packed) {
+	size = size <= MAX_UPACKED_HASH ? 0 : ST_DEFAULT_PACKED_TABLE_SIZE;
+    }
+    else {
+	size = new_size(size);	/* round up to prime number */
+    }
     tbl->num_bins = size;
-    tbl->bins = (st_table_entry **)Calloc(size, sizeof(st_table_entry*));
+    tbl->bins = size ? st_alloc_bins(size) : 0;
     tbl->head = 0;
     tbl->tail = 0;
 
@@ -243,17 +364,23 @@ st_clear(st_table *table)
     register st_table_entry *ptr, *next;
     st_index_t i;
 
+    if (ULTRAPACKED(table)) {
+	remove_upacked_entry(table);
+	return;
+    }
+
     if (table->entries_packed) {
         table->num_entries = 0;
+        table->real_entries = 0;
         return;
     }
 
-    for(i = 0; i < table->num_bins; i++) {
+    for (i = 0; i < table->num_bins; i++) {
 	ptr = table->bins[i];
 	table->bins[i] = 0;
 	while (ptr != 0) {
 	    next = ptr->next;
-	    free(ptr);
+	    st_free_entry(ptr);
 	    ptr = next;
 	}
     }
@@ -266,14 +393,19 @@ void
 st_free_table(st_table *table)
 {
     st_clear(table);
-    free(table->bins);
-    free(table);
+    if (!ULTRAPACKED(table)) {
+	st_free_bins(table->bins, table->num_bins);
+    }
+    st_dealloc_table(table);
 }
 
 size_t
 st_memsize(const st_table *table)
 {
-    if (table->entries_packed) {
+    if (ULTRAPACKED(table)) {
+	return sizeof(st_table);
+    }
+    else if (table->entries_packed) {
 	return table->num_bins * sizeof (void *) + sizeof(st_table);
     }
     else {
@@ -306,46 +438,77 @@ count_collision(const struct st_hash_type *type)
 #define FOUND_ENTRY
 #endif
 
-#define FIND_ENTRY(table, ptr, hash_val, bin_pos) do {\
-    (bin_pos) = (hash_val)%(table)->num_bins;\
-    (ptr) = (table)->bins[(bin_pos)];\
-    FOUND_ENTRY;\
-    if (PTR_NOT_EQUAL((table), (ptr), (hash_val), key)) {\
-	COLLISION;\
-	while (PTR_NOT_EQUAL((table), (ptr)->next, (hash_val), key)) {\
-	    (ptr) = (ptr)->next;\
-	}\
-	(ptr) = (ptr)->next;\
-    }\
-} while (0)
+#define FIND_ENTRY(table, ptr, hash_val, bin_pos) \
+    ((ptr) = find_entry((table), key, (hash_val), ((bin_pos) = (hash_val)%(table)->num_bins)))
+
+static st_table_entry *
+find_entry(st_table *table, st_data_t key, st_index_t hash_val, st_index_t bin_pos)
+{
+    register st_table_entry *ptr = table->bins[bin_pos];
+    FOUND_ENTRY;
+    if (PTR_NOT_EQUAL(table, ptr, hash_val, key)) {
+	COLLISION;
+	while (PTR_NOT_EQUAL(table, ptr->next, hash_val, key)) {
+	    ptr = ptr->next;
+	}
+	ptr = ptr->next;
+    }
+    return ptr;
+}
+
+static inline st_index_t
+find_packed_index(st_table *table, st_index_t hash_val, st_data_t key)
+{
+    st_index_t i = 0;
+    while (i < table->real_entries &&
+	   (PHASH(table, i) != hash_val || !EQUAL(table, key, PKEY(table, i)))) {
+	i++;
+    }
+    return i;
+}
+
+static inline int
+check_upacked(st_table *table, st_index_t hash_val, st_data_t key)
+{
+    return table->num_entries &&
+	UPHASH(table) == hash_val &&
+	EQUAL(table, key, UPKEY(table));
+}
 
 #define collision_check 0
 
 int
 st_lookup(st_table *table, register st_data_t key, st_data_t *value)
 {
-    st_index_t hash_val, bin_pos;
+    st_index_t hash_val;
     register st_table_entry *ptr;
 
+    hash_val = do_hash(key, table);
+
+    if (ULTRAPACKED(table)) {
+	if (check_upacked(table, hash_val, key)) {
+	    if (value != 0) *value = UPVAL(table);
+	    return 1;
+	}
+	return 0;
+    }
+
     if (table->entries_packed) {
-        st_index_t i;
-        for (i = 0; i < table->num_entries; i++) {
-            if ((st_data_t)table->bins[i*2] == key) {
-                if (value !=0) *value = (st_data_t)table->bins[i*2+1];
-                return 1;
-            }
-        }
+	st_index_t i = find_packed_index(table, hash_val, key);
+	if (i < table->real_entries) {
+	    if (value != 0) *value = PVAL(table, i);
+	    return 1;
+	}
         return 0;
     }
 
-    hash_val = do_hash(key, table);
-    FIND_ENTRY(table, ptr, hash_val, bin_pos);
+    ptr = find_entry(table, key, hash_val, hash_val % table->num_bins);
 
     if (ptr == 0) {
 	return 0;
     }
     else {
-	if (value != 0)  *value = ptr->record;
+	if (value != 0) *value = ptr->record;
 	return 1;
     }
 }
@@ -353,22 +516,29 @@ st_lookup(st_table *table, register st_data_t key, st_data_t *value)
 int
 st_get_key(st_table *table, register st_data_t key, st_data_t *result)
 {
-    st_index_t hash_val, bin_pos;
+    st_index_t hash_val;
     register st_table_entry *ptr;
 
+    hash_val = do_hash(key, table);
+
+    if (ULTRAPACKED(table)) {
+	if (check_upacked(table, hash_val, key)) {
+	    if (result != 0) *result = UPKEY(table);
+	    return 1;
+	}
+	return 0;
+    }
+
     if (table->entries_packed) {
-        st_index_t i;
-        for (i = 0; i < table->num_entries; i++) {
-            if ((st_data_t)table->bins[i*2] == key) {
-                if (result !=0) *result = (st_data_t)table->bins[i*2];
-                return 1;
-            }
-        }
+	st_index_t i = find_packed_index(table, hash_val, key);
+	if (i < table->real_entries) {
+	    if (result != 0) *result = PKEY(table, i);
+	    return 1;
+	}
         return 0;
     }
 
-    hash_val = do_hash(key, table);
-    FIND_ENTRY(table, ptr, hash_val, bin_pos);
+    ptr = find_entry(table, key, hash_val, hash_val % table->num_bins);
 
     if (ptr == 0) {
 	return 0;
@@ -382,85 +552,151 @@ st_get_key(st_table *table, register st_data_t key, st_data_t *result)
 #undef collision_check
 #define collision_check 1
 
-#define MORE_PACKABLE_P(table) \
-    ((st_index_t)((table)->num_entries+1) * 2 <= (table)->num_bins && \
-     (table)->num_entries+1 <= MAX_PACKED_NUMHASH)
-
-#define ADD_DIRECT(table, key, value, hash_val, bin_pos)\
-do {\
-    st_table_entry *entry;\
-    if ((table)->num_entries > ST_DEFAULT_MAX_DENSITY * (table)->num_bins) {\
-	rehash(table);\
-        (bin_pos) = (hash_val) % (table)->num_bins;\
-    }\
-    \
-    entry = alloc(st_table_entry);\
-    \
-    entry->hash = (hash_val);\
-    entry->key = (key);\
-    entry->record = (value);\
-    entry->next = (table)->bins[(bin_pos)];\
-    if ((table)->head != 0) {\
-	entry->fore = 0;\
-	(entry->back = (table)->tail)->fore = entry;\
-	(table)->tail = entry;\
-    }\
-    else {\
-	(table)->head = (table)->tail = entry;\
-	entry->fore = entry->back = 0;\
-    }\
-    (table)->bins[(bin_pos)] = entry;\
-    (table)->num_entries++;\
-} while (0)
+static inline st_table_entry *
+new_entry(st_table * table, st_data_t key, st_data_t value,
+	st_index_t hash_val, register st_index_t bin_pos)
+{
+    register st_table_entry *entry = st_alloc_entry();
+
+    entry->next = table->bins[bin_pos];
+    table->bins[bin_pos] = entry;
+    entry->hash = hash_val;
+    entry->key = key;
+    entry->record = value;
+
+    return entry;
+}
+
+static inline void
+add_direct(st_table *table, st_data_t key, st_data_t value,
+	   st_index_t hash_val, register st_index_t bin_pos)
+{
+    register st_table_entry *entry;
+    if (table->num_entries > ST_DEFAULT_MAX_DENSITY * table->num_bins) {
+	rehash(table);
+        bin_pos = hash_val % table->num_bins;
+    }
+
+    entry = new_entry(table, key, value, hash_val, bin_pos);
+
+    if (table->head != 0) {
+	entry->fore = 0;
+	(entry->back = table->tail)->fore = entry;
+	table->tail = entry;
+    }
+    else {
+	table->head = table->tail = entry;
+	entry->fore = entry->back = 0;
+    }
+    table->num_entries++;
+}
 
 static void
 unpack_entries(register st_table *table)
 {
     st_index_t i;
-    struct st_table_entry *packed_bins[MAX_PACKED_NUMHASH*2];
+    st_packed_entry packed_bins[MAX_PACKED_HASH];
+    register st_table_entry *entry, *preventry = 0, **chain;
     st_table tmp_table = *table;
 
-    memcpy(packed_bins, table->bins, sizeof(struct st_table_entry *) * table->num_entries*2);
-    table->bins = packed_bins;
+    MEMCPY(packed_bins, PACKED_BINS(table), st_packed_entry, MAX_PACKED_HASH);
+    table->as.packed.entries = packed_bins;
     tmp_table.entries_packed = 0;
-    tmp_table.num_entries = 0;
-    memset(tmp_table.bins, 0, sizeof(struct st_table_entry *) * tmp_table.num_bins);
-    for (i = 0; i < table->num_entries; i++) {
-        st_insert(&tmp_table, (st_data_t)packed_bins[i*2], (st_data_t)packed_bins[i*2+1]);
-    }
+#if ST_DEFAULT_INIT_TABLE_SIZE == ST_DEFAULT_PACKED_TABLE_SIZE
+    MEMZERO(tmp_table.bins, st_table_entry*, tmp_table.num_bins);
+#else
+    tmp_table.bins = st_realloc_bins(tmp_table.bins, ST_DEFAULT_INIT_TABLE_SIZE, tmp_table.num_bins);
+    tmp_table.num_bins = ST_DEFAULT_INIT_TABLE_SIZE;
+#endif
+    i = 0;
+    chain = &tmp_table.head;
+    do {
+	st_data_t key = packed_bins[i].key;
+	st_data_t val = packed_bins[i].val;
+	st_index_t hash = packed_bins[i].hash;
+	entry = new_entry(&tmp_table, key, val, hash,
+			  hash % ST_DEFAULT_INIT_TABLE_SIZE);
+	*chain = entry;
+	entry->back = preventry;
+	preventry = entry;
+	chain = &entry->fore;
+    } while (++i < MAX_PACKED_HASH);
+    *chain = NULL;
+    tmp_table.tail = entry;
     *table = tmp_table;
 }
 
+static void
+add_packed_direct(st_table *table, st_data_t key, st_data_t value, st_index_t hash_val)
+{
+    if (table->real_entries < MAX_PACKED_HASH) {
+	st_index_t i = table->real_entries++;
+	PKEY_SET(table, i, key);
+	PVAL_SET(table, i, value);
+	PHASH_SET(table, i, hash_val);
+	table->num_entries++;
+    }
+    else {
+	unpack_entries(table);
+	add_direct(table, key, value, hash_val, hash_val % table->num_bins);
+    }
+}
+
+static void
+add_upacked_direct(register st_table *table, register st_data_t key, st_data_t value, st_index_t hash_val)
+{
+    if (table->real_upacked) {
+	st_packed_entry *entries = (st_packed_entry *) st_alloc_bins(ST_DEFAULT_PACKED_TABLE_SIZE);
+	entries[0] = UPACKED_ENT(table);
+	entries[1].hash = hash_val;
+	entries[1].key = key;
+	entries[1].val = value;
+	table->num_bins = ST_DEFAULT_PACKED_TABLE_SIZE;
+	table->real_entries = 2;
+	table->num_entries++;
+	table->as.packed.entries = entries;
+    }
+    else {
+	table->real_upacked = 1;
+	table->num_entries = 1;
+	UPHASH_SET(table, hash_val);
+	UPKEY_SET(table, key);
+	UPVAL_SET(table, value);
+    }
+}
+
 int
 st_insert(register st_table *table, register st_data_t key, st_data_t value)
 {
-    st_index_t hash_val, bin_pos;
+    st_index_t hash_val;
+    register st_index_t bin_pos;
     register st_table_entry *ptr;
 
+    hash_val = do_hash(key, table);
+
+    if (ULTRAPACKED(table)) {
+	if (check_upacked(table, hash_val, key)) {
+	    UPVAL_SET(table, value);
+	    return 1;
+	}
+	add_upacked_direct(table, key, value, hash_val);
+	return 0;
+    }
+
     if (table->entries_packed) {
-        st_index_t i;
-        for (i = 0; i < table->num_entries; i++) {
-            if ((st_data_t)table->bins[i*2] == key) {
-                table->bins[i*2+1] = (struct st_table_entry*)value;
-                return 1;
-            }
-        }
-        if (MORE_PACKABLE_P(table)) {
-            i = table->num_entries++;
-            table->bins[i*2] = (struct st_table_entry*)key;
-            table->bins[i*2+1] = (struct st_table_entry*)value;
-            return 0;
-        }
-        else {
-            unpack_entries(table);
+	st_index_t i = find_packed_index(table, hash_val, key);
+	if (i < table->real_entries) {
+	    PVAL_SET(table, i, value);
+	    return 1;
         }
+	add_packed_direct(table, key, value, hash_val);
+	return 0;
     }
 
-    hash_val = do_hash(key, table);
     FIND_ENTRY(table, ptr, hash_val, bin_pos);
 
     if (ptr == 0) {
-	ADD_DIRECT(table, key, value, hash_val, bin_pos);
+	add_direct(table, key, value, hash_val, bin_pos);
 	return 0;
     }
     else {
@@ -473,34 +709,38 @@ int
 st_insert2(register st_table *table, register st_data_t key, st_data_t value,
 	   st_data_t (*func)(st_data_t))
 {
-    st_index_t hash_val, bin_pos;
+    st_index_t hash_val;
+    register st_index_t bin_pos;
     register st_table_entry *ptr;
 
+    hash_val = do_hash(key, table);
+
+    if (ULTRAPACKED(table)) {
+	if (check_upacked(table, hash_val, key)) {
+	    UPVAL_SET(table, value);
+	    return 1;
+	}
+	key = (*func)(key);
+	add_upacked_direct(table, key, value, hash_val);
+	return 0;
+    }
+
     if (table->entries_packed) {
-        st_index_t i;
-        for (i = 0; i < table->num_entries; i++) {
-            if ((st_data_t)table->bins[i*2] == key) {
-                table->bins[i*2+1] = (struct st_table_entry*)value;
-                return 1;
-            }
-        }
-        if (MORE_PACKABLE_P(table)) {
-            i = table->num_entries++;
-            table->bins[i*2] = (struct st_table_entry*)key;
-            table->bins[i*2+1] = (struct st_table_entry*)value;
-            return 0;
-        }
-        else {
-            unpack_entries(table);
-        }
+	st_index_t i = find_packed_index(table, hash_val, key);
+	if (i < table->real_entries) {
+	    PVAL_SET(table, i, value);
+	    return 1;
+	}
+	key = (*func)(key);
+	add_packed_direct(table, key, value, hash_val);
+	return 0;
     }
 
-    hash_val = do_hash(key, table);
     FIND_ENTRY(table, ptr, hash_val, bin_pos);
 
     if (ptr == 0) {
 	key = (*func)(key);
-	ADD_DIRECT(table, key, value, hash_val, bin_pos);
+	add_direct(table, key, value, hash_val, bin_pos);
 	return 0;
     }
     else {
@@ -512,36 +752,30 @@ st_insert2(register st_table *table, register st_data_t key, st_data_t value,
 void
 st_add_direct(st_table *table, st_data_t key, st_data_t value)
 {
-    st_index_t hash_val, bin_pos;
+    st_index_t hash_val;
+
+    hash_val = do_hash(key, table);
+    if (ULTRAPACKED(table)) {
+	add_upacked_direct(table, key, value, hash_val);
+	return;
+    }
 
     if (table->entries_packed) {
-        int i;
-        if (MORE_PACKABLE_P(table)) {
-            i = table->num_entries++;
-            table->bins[i*2] = (struct st_table_entry*)key;
-            table->bins[i*2+1] = (struct st_table_entry*)value;
-            return;
-        }
-        else {
-            unpack_entries(table);
-        }
+	add_packed_direct(table, key, value, hash_val);
+	return;
     }
 
-    hash_val = do_hash(key, table);
-    bin_pos = hash_val % table->num_bins;
-    ADD_DIRECT(table, key, value, hash_val, bin_pos);
+    add_direct(table, key, value, hash_val, hash_val % table->num_bins);
 }
 
 static void
 rehash(register st_table *table)
 {
     register st_table_entry *ptr, **new_bins;
-    st_index_t i, new_num_bins, hash_val;
+    st_index_t new_num_bins, hash_val;
 
     new_num_bins = new_size(table->num_bins+1);
-    new_bins = (st_table_entry**)
-	xrealloc(table->bins, new_num_bins * sizeof(st_table_entry*));
-    for (i = 0; i < new_num_bins; ++i) new_bins[i] = 0;
+    new_bins = st_realloc_bins(table->bins, new_num_bins, table->num_bins);
     table->num_bins = new_num_bins;
     table->bins = new_bins;
 
@@ -558,34 +792,37 @@ st_table*
 st_copy(st_table *old_table)
 {
     st_table *new_table;
-    st_table_entry *ptr, *entry, *prev, **tail;
+    st_table_entry *ptr, *entry, *prev, **tailp;
     st_index_t num_bins = old_table->num_bins;
     st_index_t hash_val;
 
-    new_table = alloc(st_table);
+    new_table = st_alloc_table();
     if (new_table == 0) {
 	return 0;
     }
 
     *new_table = *old_table;
-    new_table->bins = (st_table_entry**)
-	Calloc((unsigned)num_bins, sizeof(st_table_entry*));
+    if (ULTRAPACKED(old_table)) {
+	return new_table;
+    }
+
+    new_table->bins = st_alloc_bins(num_bins);
 
     if (new_table->bins == 0) {
-	free(new_table);
+	st_dealloc_table(new_table);
 	return 0;
     }
 
     if (old_table->entries_packed) {
-        memcpy(new_table->bins, old_table->bins, sizeof(struct st_table_entry *) * old_table->num_bins);
+        MEMCPY(new_table->bins, old_table->bins, st_table_entry*, old_table->num_bins);
         return new_table;
     }
 
     if ((ptr = old_table->head) != 0) {
 	prev = 0;
-	tail = &new_table->head;
+	tailp = &new_table->head;
 	do {
-	    entry = alloc(st_table_entry);
+	    entry = st_alloc_entry();
 	    if (entry == 0) {
 		st_free_table(new_table);
 		return 0;
@@ -595,8 +832,8 @@ st_copy(st_table *old_table)
 	    entry->next = new_table->bins[hash_val];
 	    new_table->bins[hash_val] = entry;
 	    entry->back = prev;
-	    *tail = prev = entry;
-	    tail = &entry->fore;
+	    *tailp = prev = entry;
+	    tailp = &entry->fore;
 	} while ((ptr = ptr->fore) != 0);
 	new_table->tail = prev;
     }
@@ -604,21 +841,22 @@ st_copy(st_table *old_table)
     return new_table;
 }
 
-#define REMOVE_ENTRY(table, ptr) do					\
-    {									\
-	if ((ptr)->fore == 0 && (ptr)->back == 0) {			\
-	    (table)->head = 0;						\
-	    (table)->tail = 0;						\
-	}								\
-	else {								\
-	    st_table_entry *fore = (ptr)->fore, *back = (ptr)->back;	\
-	    if (fore) fore->back = back;				\
-	    if (back) back->fore = fore;				\
-	    if ((ptr) == (table)->head) (table)->head = fore;		\
-	    if ((ptr) == (table)->tail) (table)->tail = back;		\
-	}								\
-	(table)->num_entries--;						\
-    } while (0)
+static inline void
+remove_entry(st_table *table, st_table_entry *ptr)
+{
+    if (ptr->fore == 0 && ptr->back == 0) {
+	table->head = 0;
+	table->tail = 0;
+    }
+    else {
+	st_table_entry *fore = ptr->fore, *back = ptr->back;
+	if (fore) fore->back = back;
+	if (back) back->fore = fore;
+	if (ptr == table->head) table->head = fore;
+	if (ptr == table->tail) table->tail = back;
+    }
+    table->num_entries--;
+}
 
 int
 st_delete(register st_table *table, register st_data_t *key, st_data_t *value)
@@ -627,30 +865,38 @@ st_delete(register st_table *table, register st_data_t *key, st_data_t *value)
     st_table_entry **prev;
     register st_table_entry *ptr;
 
+    hash_val = do_hash(*key, table);
+
+    if (ULTRAPACKED(table)) {
+	if (check_upacked(table, hash_val, *key)) {
+	    if (value != 0) *value = UPVAL(table);
+	    *key = UPKEY(table);
+	    remove_upacked_entry(table);
+	    return 1;
+	}
+	return 0;
+    }
+
     if (table->entries_packed) {
-        st_index_t i;
-        for (i = 0; i < table->num_entries; i++) {
-            if ((st_data_t)table->bins[i*2] == *key) {
-                if (value != 0) *value = (st_data_t)table->bins[i*2+1];
-                table->num_entries--;
-                memmove(&table->bins[i*2], &table->bins[(i+1)*2],
-                        sizeof(struct st_table_entry*) * 2*(table->num_entries-i));
-                return 1;
-            }
+	st_index_t i = find_packed_index(table, hash_val, *key);
+	if (i < table->real_entries) {
+	    if (value != 0) *value = PVAL(table, i);
+	    *key = PKEY(table, i);
+	    remove_packed_entry(table, i);
+	    return 1;
         }
         if (value != 0) *value = 0;
         return 0;
     }
 
-    hash_val = do_hash_bin(*key, table);
-
-    for (prev = &table->bins[hash_val]; (ptr = *prev) != 0; prev = &ptr->next) {
+    prev = &table->bins[hash_val % table->num_bins];
+    for (;(ptr = *prev) != 0; prev = &ptr->next) {
 	if (EQUAL(table, *key, ptr->key)) {
 	    *prev = ptr->next;
-	    REMOVE_ENTRY(table, ptr);
+	    remove_entry(table, ptr);
 	    if (value != 0) *value = ptr->record;
 	    *key = ptr->key;
-	    free(ptr);
+	    st_free_entry(ptr);
 	    return 1;
 	}
     }
@@ -665,25 +911,36 @@ st_delete_safe(register st_table *table, register st_data_t *key, st_data_t *val
     st_index_t hash_val;
     register st_table_entry *ptr;
 
+    hash_val = do_hash(*key, table);
+
+    if (ULTRAPACKED(table)) {
+	if (check_upacked(table, hash_val, *key)) {
+	    if (value != 0) *value = UPVAL(table);
+	    *key = UPKEY(table);
+	    remove_safe_upacked_entry(table, never);
+	    return 1;
+	}
+	if (value != 0) *value = 0;
+	return 0;
+    }
+
     if (table->entries_packed) {
-	st_index_t i;
-	for (i = 0; i < table->num_entries; i++) {
-	    if ((st_data_t)table->bins[i*2] == *key) {
-		if (value != 0) *value = (st_data_t)table->bins[i*2+1];
-		table->bins[i*2] = (void *)never;
-		return 1;
-	    }
+	st_index_t i = find_packed_index(table, hash_val, *key);
+	if (i < table->real_entries) {
+	    if (value != 0) *value = PVAL(table, i);
+	    *key = PKEY(table, i);
+	    remove_safe_packed_entry(table, i, never);
+	    return 1;
 	}
 	if (value != 0) *value = 0;
 	return 0;
     }
 
-    hash_val = do_hash_bin(*key, table);
-    ptr = table->bins[hash_val];
+    ptr = table->bins[hash_val % table->num_bins];
 
     for (; ptr != 0; ptr = ptr->next) {
 	if ((ptr->key != never) && EQUAL(table, ptr->key, *key)) {
-	    REMOVE_ENTRY(table, ptr);
+	    remove_entry(table, ptr);
 	    *key = ptr->key;
 	    if (value != 0) *value = ptr->record;
 	    ptr->key = ptr->record = never;
@@ -701,17 +958,23 @@ st_cleanup_safe(st_table *table, st_data_t never)
     st_table_entry *ptr, **last, *tmp;
     st_index_t i;
 
+    if (ULTRAPACKED(table)) {
+	table->real_upacked = table->num_entries;
+	return;
+    }
+
     if (table->entries_packed) {
 	st_index_t i = 0, j = 0;
-	while ((st_data_t)table->bins[i*2] != never) {
-	    if (i++ == table->num_entries) return;
+	while (PKEY(table, i) != never) {
+	    if (i++ == table->real_entries) return;
 	}
-	for (j = i; ++i < table->num_entries;) {
-	    if ((st_data_t)table->bins[i*2] == never) continue;
-	    table->bins[j*2] = table->bins[i*2];
-	    table->bins[j*2+1] = table->bins[i*2+1];
+	for (j = i; ++i < table->real_entries;) {
+	    if (PKEY(table, i) == never) continue;
+	    PACKED_ENT(table, j) = PACKED_ENT(table, i);
 	    j++;
 	}
+	table->real_entries = j;
+	/* table->num_entries really should be equal j at this moment, but let set it anyway */
 	table->num_entries = j;
 	return;
     }
@@ -722,7 +985,7 @@ st_cleanup_safe(st_table *table, st_data_t never)
 	    if (ptr->key == never) {
 		tmp = ptr;
 		*last = ptr = ptr->next;
-		free(tmp);
+		st_free_entry(tmp);
 	    }
 	    else {
 		ptr = *(last = &ptr->next);
@@ -732,50 +995,78 @@ st_cleanup_safe(st_table *table, st_data_t never)
 }
 
 int
-st_foreach(st_table *table, int (*func)(ANYARGS), st_data_t arg)
+st_foreach_check(st_table *table, int (*func)(ANYARGS), st_data_t arg, st_data_t never)
 {
     st_table_entry *ptr, **last, *tmp;
     enum st_retval retval;
-    st_index_t i;
+    st_data_t key, val;
+    st_index_t hash, i = 0;
+
+    if (table->num_entries == 0) {
+	return 0;
+    }
+
+    if (ULTRAPACKED(table)) {
+	key = UPKEY(table);
+	val = UPVAL(table);
+	hash = UPHASH(table);
+	if (key == never) return 0;
+	retval = (*func)(key, val, arg);
+	if (!ULTRAPACKED(table)) {
+	    goto packed;
+	}
+	switch(retval) {
+	  case ST_CHECK:
+	    if (UPHASH(table) == 0 && UPKEY(table) == never)
+		break;
+	    if (check_upacked(table, hash, key))
+		break;
+	    goto deleted;
+	  case ST_DELETE:
+	    remove_safe_upacked_entry(table, never);
+	  case ST_CONTINUE:
+	  case ST_STOP:
+	    break;
+	}
+	return 0;
+    }
 
     if (table->entries_packed) {
-        for (i = 0; i < table->num_entries; i++) {
-            st_index_t j;
-            st_data_t key, val;
-            key = (st_data_t)table->bins[i*2];
-            val = (st_data_t)table->bins[i*2+1];
-            retval = (*func)(key, val, arg);
+	for (i = 0; i < table->real_entries; i++) {
+	    key = PKEY(table, i);
+	    val = PVAL(table, i);
+	    hash = PHASH(table, i);
+	    if (key == never) continue;
+	    retval = (*func)(key, val, arg);
+	  packed:
 	    if (!table->entries_packed) {
-		FIND_ENTRY(table, ptr, key, i);
+		FIND_ENTRY(table, ptr, hash, i);
 		if (retval == ST_CHECK) {
 		    if (!ptr) goto deleted;
 		    goto unpacked_continue;
 		}
 		goto unpacked;
 	    }
-            switch (retval) {
+	    switch (retval) {
 	      case ST_CHECK:	/* check if hash is modified during iteration */
-                for (j = 0; j < table->num_entries; j++) {
-                    if ((st_data_t)table->bins[j*2] == key)
-                        break;
-                }
-                if (j == table->num_entries) {
+		if (PHASH(table, i) == 0 && PKEY(table, i) == never) {
+		    break;
+		}
+		i = find_packed_index(table, hash, key);
+		if (i == table->real_entries) {
 		    goto deleted;
-                }
+		}
 		/* fall through */
 	      case ST_CONTINUE:
 		break;
 	      case ST_STOP:
 		return 0;
 	      case ST_DELETE:
-                table->num_entries--;
-                memmove(&table->bins[i*2], &table->bins[(i+1)*2],
-                        sizeof(struct st_table_entry*) * 2*(table->num_entries-i));
-                i--;
-                break;
-            }
-        }
-        return 0;
+		remove_safe_packed_entry(table, i, never);
+		break;
+	    }
+	}
+	return 0;
     }
     else {
 	ptr = table->head;
@@ -783,6 +1074,8 @@ st_foreach(st_table *table, int (*func)(ANYARGS), st_data_t arg)
 
     if (ptr != 0) {
 	do {
+	    if (ptr->key == never)
+		goto unpacked_continue;
 	    i = ptr->hash % table->num_bins;
 	    retval = (*func)(ptr->key, ptr->record, arg);
 	  unpacked:
@@ -808,10 +1101,100 @@ st_foreach(st_table *table, int (*func)(ANYARGS), st_data_t arg)
 		for (; (tmp = *last) != 0; last = &tmp->next) {
 		    if (ptr == tmp) {
 			tmp = ptr->fore;
+			remove_entry(table, ptr);
+			ptr->key = ptr->record = never;
+			ptr->hash = 0;
+			ptr = tmp;
+			break;
+		    }
+		}
+	    }
+	} while (ptr && table->head);
+    }
+    return 0;
+}
+
+int
+st_foreach(st_table *table, int (*func)(ANYARGS), st_data_t arg)
+{
+    st_table_entry *ptr, **last, *tmp;
+    enum st_retval retval;
+    st_data_t key, val;
+    st_index_t hash, i = 0;
+
+    if (table->num_entries == 0) {
+	return 0;
+    }
+
+    if (ULTRAPACKED(table)) {
+	key = UPKEY(table);
+	val = UPVAL(table);
+	hash = UPHASH(table);
+	retval = (*func)(key, val, arg);
+	if (!ULTRAPACKED(table)) {
+	    goto packed;
+	}
+	switch (retval) {
+	  case ST_DELETE:
+	    remove_upacked_entry(table);
+	  case ST_CONTINUE:
+	  case ST_CHECK:
+	  case ST_STOP:
+	    break;
+	}
+	return 0;
+    }
+
+    if (table->entries_packed) {
+	for (i = 0; i < table->real_entries; i++) {
+	    key = PKEY(table, i);
+	    val = PVAL(table, i);
+	    hash = PHASH(table, i);
+	    retval = (*func)(key, val, arg);
+	  packed:
+	    if (!table->entries_packed) {
+		FIND_ENTRY(table, ptr, hash, i);
+		if (!ptr) return 0;
+		goto unpacked;
+	    }
+	    switch (retval) {
+	      case ST_CONTINUE:
+		break;
+	      case ST_CHECK:
+	      case ST_STOP:
+		return 0;
+	      case ST_DELETE:
+		remove_packed_entry(table, i);
+		i--;
+		break;
+	    }
+	}
+	return 0;
+    }
+    else {
+	ptr = table->head;
+    }
+
+    if (ptr != 0) {
+	do {
+	    i = ptr->hash % table->num_bins;
+	    retval = (*func)(ptr->key, ptr->record, arg);
+	  unpacked:
+	    switch (retval) {
+	      case ST_CONTINUE:
+		ptr = ptr->fore;
+		break;
+	      case ST_CHECK:
+	      case ST_STOP:
+		return 0;
+	      case ST_DELETE:
+		last = &table->bins[ptr->hash % table->num_bins];
+		for (; (tmp = *last) != 0; last = &tmp->next) {
+		    if (ptr == tmp) {
+			tmp = ptr->fore;
 			*last = ptr->next;
-			REMOVE_ENTRY(table, ptr);
-			free(ptr);
-			if (ptr == tmp) return 0;
+			remove_entry(table, ptr);
+			st_free_entry(ptr);
 			ptr = tmp;
 			break;
 		    }
@@ -834,13 +1217,13 @@ st_reverse_foreach(st_table *table, int (*func)(ANYARGS), st_data_t arg)
         for (i = table->num_entries-1; 0 <= i; i--) {
             int j;
             st_data_t key, val;
-            key = (st_data_t)table->bins[i*2];
-            val = (st_data_t)table->bins[i*2+1];
+            key = PKEY(table, i);
+            val = PVAL(table, i);
             retval = (*func)(key, val, arg);
             switch (retval) {
 	      case ST_CHECK:	/* check if hash is modified during iteration */
                 for (j = 0; j < table->num_entries; j++) {
-                    if ((st_data_t)table->bins[j*2] == key)
+                    if (PKEY(table, j) == key)
                         break;
                 }
                 if (j == table->num_entries) {
@@ -854,9 +1237,7 @@ st_reverse_foreach(st_table *table, int (*func)(ANYARGS), st_data_t arg)
 	      case ST_STOP:
 		return 0;
 	      case ST_DELETE:
-                table->num_entries--;
-                memmove(&table->bins[i*2], &table->bins[(i+1)*2],
-                        sizeof(struct st_table_entry*) * 2*(table->num_entries-i));
+		remove_packed_entry(table, i);
                 break;
             }
         }
@@ -889,8 +1270,8 @@ st_reverse_foreach(st_table *table, int (*func)(ANYARGS), st_data_t arg)
 		    if (ptr == tmp) {
 			tmp = ptr->back;
 			*last = ptr->next;
-			REMOVE_ENTRY(table, ptr);
-			free(ptr);
+			remove_entry(table, ptr);
+			st_free_entry(ptr);
 			ptr = tmp;
 			break;
 		    }
diff --git a/variable.c b/variable.c
index 3da500e..303bb27 100644
--- a/variable.c
+++ b/variable.c
@@ -473,7 +473,7 @@ void
 rb_gc_mark_global_tbl(void)
 {
     if (rb_global_tbl)
-        st_foreach_safe(rb_global_tbl, mark_global_entry, 0);
+        st_foreach(rb_global_tbl, mark_global_entry, 0);
 }
 
 static ID
@@ -765,7 +765,7 @@ rb_f_global_variables(void)
     char buf[2];
     int i;
 
-    st_foreach_safe(rb_global_tbl, gvar_i, ary);
+    st_foreach(rb_global_tbl, gvar_i, ary);
     buf[0] = '$';
     for (i = 1; i <= 9; ++i) {
 	buf[1] = (char)(i + '0');
@@ -923,7 +923,7 @@ static int
 givar_i(VALUE obj, st_table *tbl)
 {
     if (rb_special_const_p(obj)) {
-	st_foreach_safe(tbl, givar_mark_i, 0);
+	st_foreach(tbl, givar_mark_i, 0);
     }
     return ST_CONTINUE;
 }
@@ -933,7 +933,7 @@ rb_mark_generic_ivar_tbl(void)
 {
     if (!generic_iv_tbl) return;
     if (special_generic_ivar == 0) return;
-    st_foreach_safe(generic_iv_tbl, givar_i, 0);
+    st_foreach(generic_iv_tbl, givar_i, 0);
 }
 
 void
@@ -1170,7 +1170,7 @@ obj_ivar_each(VALUE obj, int (*func)(ANYARGS), st_data_t arg)
     data.func = (int (*)(ID key, VALUE val, st_data_t arg))func;
     data.arg = arg;
 
-    st_foreach_safe(tbl, obj_ivar_i, (st_data_t)&data);
+    st_foreach(tbl, obj_ivar_i, (st_data_t)&data);
 }
 
 void
@@ -1730,7 +1730,7 @@ rb_mod_const_at(VALUE mod, void *data)
 	tbl = st_init_numtable();
     }
     if (RCLASS_CONST_TBL(mod)) {
-	st_foreach_safe(RCLASS_CONST_TBL(mod), sv_i, (st_data_t)tbl);
+	st_foreach(RCLASS_CONST_TBL(mod), sv_i, (st_data_t)tbl);
     }
     return tbl;
 }
@@ -1765,7 +1765,7 @@ rb_const_list(void *data)
 
     if (!tbl) return rb_ary_new2(0);
     ary = rb_ary_new2(tbl->num_entries);
-    st_foreach_safe(tbl, list_i, ary);
+    st_foreach(tbl, list_i, ary);
     st_free_table(tbl);
 
     return ary;
diff --git a/vm.c b/vm.c
index e997afa..064a4f8 100644
--- a/vm.c
+++ b/vm.c
@@ -1575,6 +1575,7 @@ rb_vm_mark(void *ptr)
 	RUBY_MARK_UNLESS_NULL(vm->thgroup_default);
 	RUBY_MARK_UNLESS_NULL(vm->mark_object_ary);
 	RUBY_MARK_UNLESS_NULL(vm->load_path);
+	RUBY_MARK_UNLESS_NULL(vm->load_path_expanded_cache);
 	RUBY_MARK_UNLESS_NULL(vm->loaded_features);
 	RUBY_MARK_UNLESS_NULL(vm->top_self);
 	RUBY_MARK_UNLESS_NULL(vm->coverages);
@@ -1606,16 +1607,17 @@ ruby_vm_destruct(rb_vm_t *vm)
 #if defined(ENABLE_VM_OBJSPACE) && ENABLE_VM_OBJSPACE
 	struct rb_objspace *objspace = vm->objspace;
 #endif
+	if (vm->living_threads) {
+	    st_table *living_threads = vm->living_threads;
+	    vm->living_threads = 0;
+	    st_free_table(living_threads);
+	}
 	rb_gc_force_recycle(vm->self);
 	vm->main_thread = 0;
 	if (th) {
 	    rb_fiber_reset_root_local_storage(th->self);
 	    thread_free(th);
 	}
-	if (vm->living_threads) {
-	    st_free_table(vm->living_threads);
-	    vm->living_threads = 0;
-	}
 #if defined(ENABLE_VM_OBJSPACE) && ENABLE_VM_OBJSPACE
 	if (objspace) {
 	    rb_objspace_free(objspace);
diff --git a/vm_core.h b/vm_core.h
index 7211005..e787d4b 100644
--- a/vm_core.h
+++ b/vm_core.h
@@ -298,6 +298,7 @@ typedef struct rb_vm_struct {
     /* load */
     VALUE top_self;
     VALUE load_path;
+    VALUE load_path_expanded_cache;
     VALUE loaded_features;
     struct st_table *loading_table;
 
src/rvm/patches/ruby/1.9.3/p374/ruby-multilib.patch000066400000000732147511530530015545 0ustar00--- a/tool/mkconfig.rb
+++ b/tool/mkconfig.rb
@@ -121,6 +121,7 @@
     val = val.gsub(/\$(?:\$|\{?(\w+)\}?)/) {$1 ? "$(#{$1})" : $&}.dump
     case name
     when /^prefix$/
+      v_runtime[:prefix] = val.slice(1..-2)
       val = "(TOPDIR || DESTDIR + #{val})"
     when /^ARCH_FLAG$/
       val = "arch_flag || #{val}" if universal
@@ -193,6 +194,7 @@
     x
   end
 end
+v_others.map!{|x| x.gsub(v_runtime[:prefix], "$(prefix)") }
 v_others.compact!
 
 if $install_name
src/rvm/patches/ruby/1.9.3/p0/osx-arch-fix.patch000066400000000617147511530530015101 0ustar00diff --git a/Makefile.in b/Makefile.in
index 656ae90..f976cf1 100644
--- a/Makefile.in
+++ b/Makefile.in
@@ -45,7 +45,7 @@ XLDFLAGS = @XLDFLAGS@ $(EXTLDFLAGS)
 EXTLIBS = 
 LIBS = @LIBS@ $(EXTLIBS)
 MISSING = @LIBOBJS@ @ALLOCA@
-LDSHARED = @LIBRUBY_LDSHARED@
+LDSHARED = @LIBRUBY_LDSHARED@ $(LDFLAGS)
 DLDFLAGS = @LIBRUBY_DLDFLAGS@ $(EXTLDFLAGS) @ARCH_FLAG@
 SOLIBS = @SOLIBS@
 MAINLIBS = @MAINLIBS@
src/rvm/patches/ruby/1.9.3/p0/falcon.patch000066400000166726147511530530014051 0ustar00diff --git a/common.mk b/common.mk
index ea244cc..4f22609 100644
--- a/common.mk
+++ b/common.mk
@@ -629,7 +629,8 @@ file.$(OBJEXT): {$(VPATH)}file.c $(RUBY_H_INCLUDES) {$(VPATH)}io.h \
 gc.$(OBJEXT): {$(VPATH)}gc.c $(RUBY_H_INCLUDES) {$(VPATH)}re.h \
   {$(VPATH)}regex.h $(ENCODING_H_INCLUDES) $(VM_CORE_H_INCLUDES) \
   {$(VPATH)}gc.h {$(VPATH)}io.h {$(VPATH)}eval_intern.h {$(VPATH)}util.h \
-  {$(VPATH)}debug.h {$(VPATH)}internal.h {$(VPATH)}constant.h
+  {$(VPATH)}debug.h {$(VPATH)}internal.h {$(VPATH)}constant.h \
+  {$(VPATH)}pool_alloc.inc.h {$(VPATH)}pool_alloc.h
 hash.$(OBJEXT): {$(VPATH)}hash.c $(RUBY_H_INCLUDES) {$(VPATH)}util.h \
   $(ENCODING_H_INCLUDES)
 inits.$(OBJEXT): {$(VPATH)}inits.c $(RUBY_H_INCLUDES) \
@@ -692,7 +693,7 @@ signal.$(OBJEXT): {$(VPATH)}signal.c $(RUBY_H_INCLUDES) \
   $(VM_CORE_H_INCLUDES) {$(VPATH)}debug.h
 sprintf.$(OBJEXT): {$(VPATH)}sprintf.c $(RUBY_H_INCLUDES) {$(VPATH)}re.h \
   {$(VPATH)}regex.h {$(VPATH)}vsnprintf.c $(ENCODING_H_INCLUDES)
-st.$(OBJEXT): {$(VPATH)}st.c $(RUBY_H_INCLUDES)
+st.$(OBJEXT): {$(VPATH)}st.c $(RUBY_H_INCLUDES) {$(VPATH)}pool_alloc.h
 strftime.$(OBJEXT): {$(VPATH)}strftime.c $(RUBY_H_INCLUDES) \
   {$(VPATH)}timev.h
 string.$(OBJEXT): {$(VPATH)}string.c $(RUBY_H_INCLUDES) {$(VPATH)}re.h \
diff --git a/configure.in b/configure.in
index 5bc2e4e..b3e60fd 100644
--- a/configure.in
+++ b/configure.in
@@ -1406,7 +1406,8 @@ AC_CHECK_FUNCS(fmod killpg wait4 waitpid fork spawnv syscall __syscall chroot ge
 	      setsid telldir seekdir fchmod cosh sinh tanh log2 round\
 	      setuid setgid daemon select_large_fdset setenv unsetenv\
               mktime timegm gmtime_r clock_gettime gettimeofday poll ppoll\
-              pread sendfile shutdown sigaltstack dl_iterate_phdr)
+              pread sendfile shutdown sigaltstack dl_iterate_phdr \
+	      posix_memalign memalign)
 
 AC_CACHE_CHECK(for unsetenv returns a value, rb_cv_unsetenv_return_value,
   [AC_TRY_COMPILE([
diff --git a/gc.c b/gc.c
index 3238d65..fb8ac5f 100644
--- a/gc.c
+++ b/gc.c
@@ -20,6 +20,7 @@
 #include "vm_core.h"
 #include "internal.h"
 #include "gc.h"
+#include "pool_alloc.h"
 #include "constant.h"
 #include <stdio.h>
 #include <setjmp.h>
@@ -35,6 +36,11 @@
 
 #if defined _WIN32 || defined __CYGWIN__
 #include <windows.h>
+#elif defined POOL_ALLOC_API
+#if   defined(HAVE_POSIX_MEMALIGN)
+#elif defined(HAVE_MEMALIGN)
+#include <malloc.h>
+#endif
 #endif
 
 #ifdef HAVE_VALGRIND_MEMCHECK_H
@@ -311,6 +317,24 @@ struct gc_list {
 
 #define CALC_EXACT_MALLOC_SIZE 0
 
+#ifdef POOL_ALLOC_API
+/* POOL ALLOC API */
+#define POOL_ALLOC_PART 1
+#include "pool_alloc.inc.h"
+#undef POOL_ALLOC_PART
+
+typedef struct pool_layout_t pool_layout_t;
+struct pool_layout_t {
+    pool_header
+      p6,  /* st_table && st_table_entry */
+      p11;  /* st_table.bins init size */
+} pool_layout = {
+    INIT_POOL(void*[6]),
+    INIT_POOL(void*[11])
+};
+static void pool_finalize_header(pool_header *header);
+#endif
+
 typedef struct rb_objspace {
     struct {
 	size_t limit;
@@ -320,6 +344,9 @@ typedef struct rb_objspace {
 	size_t allocations;
 #endif
     } malloc_params;
+#ifdef POOL_ALLOC_API
+    pool_layout_t *pool_headers;
+#endif
     struct {
 	size_t increment;
 	struct heaps_slot *ptr;
@@ -367,7 +394,11 @@ typedef struct rb_objspace {
 static int ruby_initial_gc_stress = 0;
 int *ruby_initial_gc_stress_ptr = &ruby_initial_gc_stress;
 #else
+#  ifdef POOL_ALLOC_API
+static rb_objspace_t rb_objspace = {{GC_MALLOC_LIMIT}, &pool_layout, {HEAP_MIN_SLOTS}};
+#  else
 static rb_objspace_t rb_objspace = {{GC_MALLOC_LIMIT}, {HEAP_MIN_SLOTS}};
+#  endif
 int *ruby_initial_gc_stress_ptr = &rb_objspace.gc_stress;
 #endif
 #define malloc_limit		objspace->malloc_params.limit
@@ -400,6 +431,10 @@ rb_objspace_alloc(void)
     memset(objspace, 0, sizeof(*objspace));
     malloc_limit = initial_malloc_limit;
     ruby_gc_stress = ruby_initial_gc_stress;
+#ifdef POOL_ALLOC_API
+    objspace->pool_headers = (pool_layout_t*) malloc(sizeof(pool_layout));
+    memcpy(objspace->pool_headers, &pool_layout, sizeof(pool_layout));
+#endif
 
     return objspace;
 }
@@ -477,6 +512,13 @@ rb_objspace_free(rb_objspace_t *objspace)
 	heaps_used = 0;
 	heaps = 0;
     }
+#ifdef POOL_ALLOC_API
+    if (objspace->pool_headers) {
+        pool_finalize_header(&objspace->pool_headers->p6);
+        pool_finalize_header(&objspace->pool_headers->p11);
+        free(objspace->pool_headers);
+    }
+#endif
     free(objspace);
 }
 #else
@@ -885,6 +927,27 @@ ruby_xfree(void *x)
 	vm_xfree(&rb_objspace, x);
 }
 
+#ifdef POOL_ALLOC_API
+/* POOL ALLOC API */
+#define POOL_ALLOC_PART 2
+#include "pool_alloc.inc.h"
+#undef POOL_ALLOC_PART
+
+void
+ruby_xpool_free(void *ptr)
+{
+    pool_free_entry((void**)ptr);
+}
+
+#define CONCRET_POOL_MALLOC(pnts) \
+void * ruby_xpool_malloc_##pnts##p () { \
+    return pool_alloc_entry(&rb_objspace.pool_headers->p##pnts ); \
+}
+CONCRET_POOL_MALLOC(6)
+CONCRET_POOL_MALLOC(11)
+#undef CONCRET_POOL_MALLOC
+
+#endif
 
 /*
  *  call-seq:
diff --git a/internal.h b/internal.h
index 172e7f4..11e4d30 100644
--- a/internal.h
+++ b/internal.h
@@ -108,6 +108,8 @@ VALUE rb_iseq_clone(VALUE iseqval, VALUE newcbase);
 
 /* load.c */
 VALUE rb_get_load_path(void);
+void rb_reset_expanded_cache();
+void rb_load_path_ary_push(VALUE path);
 
 /* math.c */
 VALUE rb_math_atan2(VALUE, VALUE);
diff --git a/load.c b/load.c
index 0ff4b60..5d10cc2 100644
--- a/load.c
+++ b/load.c
@@ -4,6 +4,7 @@
 
 #include "ruby/ruby.h"
 #include "ruby/util.h"
+#include "ruby/encoding.h"
 #include "internal.h"
 #include "dln.h"
 #include "eval_intern.h"
@@ -18,6 +19,7 @@ VALUE ruby_dln_librefs;
 #define IS_DLEXT(e) (strcmp((e), DLEXT) == 0)
 #endif
 
+static int sorted_loaded_features = 1;
 
 static const char *const loadable_ext[] = {
     ".rb", DLEXT,
@@ -27,28 +29,44 @@ static const char *const loadable_ext[] = {
     0
 };
 
-VALUE
-rb_get_load_path(void)
-{
-    VALUE load_path = GET_VM()->load_path;
-    return load_path;
-}
+static VALUE rb_checked_expanded_cache(int*);
+static void rb_set_expanded_cache(VALUE, int);
+static VALUE rb_expand_load_paths(long, VALUE*, int*);
+static int cached_expanded_load_path = 1;
 
 VALUE
 rb_get_expanded_load_path(void)
 {
-    VALUE load_path = rb_get_load_path();
-    VALUE ary;
-    long i;
+    VALUE expanded = rb_checked_expanded_cache(NULL);
 
-    ary = rb_ary_new2(RARRAY_LEN(load_path));
-    for (i = 0; i < RARRAY_LEN(load_path); ++i) {
-	VALUE path = rb_file_expand_path(RARRAY_PTR(load_path)[i], Qnil);
-	rb_str_freeze(path);
-	rb_ary_push(ary, path);
+    if ( !RTEST(expanded) ) {
+	VALUE load_path = GET_VM()->load_path;
+	int has_relative = 0;
+
+	if (!load_path) return 0;
+
+	expanded = rb_expand_load_paths(
+			RARRAY_LEN(load_path), RARRAY_PTR(load_path),
+			&has_relative);
+	RB_GC_GUARD(load_path);
+
+	if (cached_expanded_load_path) {
+	    rb_set_expanded_cache(expanded, has_relative);
+	}
+    } else {
+	expanded = rb_ary_dup(expanded);
     }
-    rb_obj_freeze(ary);
-    return ary;
+    return expanded;
+}
+
+VALUE
+rb_get_load_path(void)
+{
+    VALUE load_path =
+	cached_expanded_load_path ?
+	    rb_get_expanded_load_path():
+	    GET_VM()->load_path;
+    return load_path;
 }
 
 static VALUE
@@ -129,6 +147,9 @@ loaded_feature_path_i(st_data_t v, st_data_t b, st_data_t f)
     return ST_STOP;
 }
 
+static long rb_feature_first_equal_or_greater(VALUE, const char *, long);
+static int  rb_stop_search_feature(VALUE, const char *, long);
+
 static int
 rb_feature_p(const char *feature, const char *ext, int rb, int expanded, const char **fn)
 {
@@ -151,8 +172,10 @@ rb_feature_p(const char *feature, const char *ext, int rb, int expanded, const c
 	type = 0;
     }
     features = get_loaded_features();
-    for (i = 0; i < RARRAY_LEN(features); ++i) {
+    i = rb_feature_first_equal_or_greater(features, feature, len);
+    for (; i < RARRAY_LEN(features); ++i) {
 	v = RARRAY_PTR(features)[i];
+	if (rb_stop_search_feature(v, feature, len)) break;
 	f = StringValuePtr(v);
 	if ((n = RSTRING_LEN(v)) < len) continue;
 	if (strncmp(f, feature, len) != 0) {
@@ -176,14 +199,14 @@ rb_feature_p(const char *feature, const char *ext, int rb, int expanded, const c
 	}
     }
     loading_tbl = get_loading_table();
-    if (loading_tbl) {
+    if (loading_tbl && loading_tbl->num_entries > 0) {
 	f = 0;
 	if (!expanded) {
 	    struct loaded_feature_searching fs;
 	    fs.name = feature;
 	    fs.len = len;
 	    fs.type = type;
-	    fs.load_path = load_path ? load_path : rb_get_load_path();
+	    fs.load_path = load_path ? load_path : rb_get_expanded_load_path();
 	    fs.result = 0;
 	    st_foreach(loading_tbl, loaded_feature_path_i, (st_data_t)&fs);
 	    if ((f = fs.result) != 0) {
@@ -251,6 +274,170 @@ rb_feature_provided(const char *feature, const char **loading)
     return FALSE;
 }
 
+static long
+feature_basename_length(const char *feature, long flen)
+{
+    if (sorted_loaded_features) {
+	const char *ext = strrchr(feature, '.');
+	return ext && !strchr(ext, '/') ? ext - feature : flen;
+    } else {
+	return 0;
+    }
+}
+
+static int
+compare_feature_name(const char *left, long llen, const char *right, long rlen)
+{
+    int diff = 0;
+    while (llen-- && rlen--) {
+	diff = left[llen] - right[rlen];
+	if (diff) break;
+	if (left[llen] == '/') break;
+    }
+    return diff;
+}
+
+static int
+rb_compare_feature_name(VALUE loaded, const char *feature, long flen)
+{
+    const char *loaded_name = StringValuePtr(loaded);
+    long loaded_len = feature_basename_length(loaded_name, RSTRING_LEN(loaded));
+    return compare_feature_name(loaded_name, loaded_len, feature, flen);
+}
+
+/* used to find when equal features run out */
+static int
+rb_stop_search_feature(VALUE loaded, const char *feature, long flen)
+{
+    if (sorted_loaded_features)
+	return rb_compare_feature_name(loaded, feature, flen) > 0;
+    else
+	return FALSE;
+}
+
+/* returns first position to search feature from */
+static long
+rb_feature_first_equal_or_greater(VALUE features, const char *feature, long flen)
+{
+    if (sorted_loaded_features) {
+	long before = 0, first = RARRAY_LEN(features);
+	VALUE *values = RARRAY_PTR(features);
+	if (first == 0)
+	    return 0;
+	if (rb_compare_feature_name(values[0], feature, flen) >= 0)
+	    return 0;
+
+	while (first - before > 1) {
+	    long mid = (first + before) / 2;
+	    long cmp = rb_compare_feature_name(values[mid], feature, flen);
+	    if (cmp >= 0)
+		first = mid;
+	    else
+		before = mid;
+	}
+	return first;
+    } else {
+	return 0;
+    }
+}
+
+/* returns position to insert new feature in */
+static long
+rb_feature_first_greater(VALUE features, const char *feature, long flen)
+{
+    if (sorted_loaded_features) {
+	long before = 0, first = RARRAY_LEN(features);
+	VALUE *values = RARRAY_PTR(features);
+	if (first == 0)
+	    return 0;
+	if (rb_compare_feature_name(values[0], feature, flen) > 0)
+	    return 0;
+	if (rb_compare_feature_name(values[first-1], feature, flen) <= 0)
+	    return first;
+
+	while (first - before > 1) {
+	    long mid = (first + before) / 2;
+	    long cmp = rb_compare_feature_name(values[mid], feature, flen);
+	    if (cmp > 0)
+		first = mid;
+	    else
+		before = mid;
+	}
+	return first;
+    } else {
+	return RARRAY_LEN(features);
+    }
+}
+
+
+static VALUE
+rb_push_feature_1(VALUE features, VALUE feature)
+{
+    const char *fname = StringValuePtr(feature);
+    long flen = feature_basename_length(fname, RSTRING_LEN(feature));
+    long i = rb_feature_first_greater(features, fname, flen);
+    rb_ary_push(features, feature);
+    if ( i < RARRAY_LEN(features) - 1 ) {
+	MEMMOVE(RARRAY_PTR(features) + i + 1, RARRAY_PTR(features) + i,
+		VALUE, RARRAY_LEN(features) - i - 1);
+	RARRAY_PTR(features)[i] = feature;
+    }
+    return features;
+}
+
+static VALUE
+rb_push_feature_m(long argc, VALUE *argv, VALUE features)
+{
+    while (argc--) {
+	rb_push_feature_1(features, *argv++);
+    }
+    return features;
+}
+
+static VALUE
+rb_concat_features(VALUE features, VALUE add)
+{
+    add = rb_convert_type(add, T_ARRAY, "Array", "to_ary");
+    if (RARRAY_LEN(add)) {
+	rb_push_feature_m(RARRAY_LEN(add), RARRAY_PTR(add), features);
+    }
+    return features;
+}
+static const char *load_features_undefined_methods[] = {
+    "[]=", "reverse!", "rotate!", "sort!", "sort_by!",
+    "collect!", "map!", "shuffle!", "fill", "insert",
+    NULL
+};
+
+static VALUE
+rb_loaded_features_init(void)
+{
+    char *sorted_flag;
+    const char **name;
+    VALUE loaded_features = rb_ary_new();
+    VALUE loaded_features_c = rb_singleton_class(loaded_features);
+
+    sorted_flag = getenv("RUBY_LOADED_FEATURES_SORTED");
+    if (sorted_flag != NULL) {
+	int sorted_set = atoi(sorted_flag);
+	if (RTEST(ruby_verbose))
+	    fprintf(stderr, "sorted_loaded_features=%d (%d)\n", sorted_set, sorted_loaded_features);
+	sorted_loaded_features = sorted_set;
+    }
+
+    for(name = load_features_undefined_methods; *name; name++) {
+	rb_undef_method(loaded_features_c, *name);
+    }
+
+    if (sorted_loaded_features) {
+	rb_define_method(loaded_features_c, "<<", rb_push_feature_1, 1);
+	rb_define_method(loaded_features_c, "push", rb_push_feature_m, -1);
+	rb_define_method(loaded_features_c, "concat", rb_concat_features, 1);
+	rb_define_method(loaded_features_c, "unshift", rb_push_feature_m, -1);
+    }
+    return loaded_features;
+}
+
 static void
 rb_provide_feature(VALUE feature)
 {
@@ -258,7 +445,10 @@ rb_provide_feature(VALUE feature)
 	rb_raise(rb_eRuntimeError,
 		 "$LOADED_FEATURES is frozen; cannot append feature");
     }
-    rb_ary_push(get_loaded_features(), feature);
+    if (sorted_loaded_features)
+	rb_push_feature_1(get_loaded_features(), feature);
+    else
+	rb_ary_push(get_loaded_features(), feature);
 }
 
 void
@@ -760,6 +950,226 @@ rb_f_autoload_p(VALUE obj, VALUE sym)
     return rb_mod_autoload_p(klass, sym);
 }
 
+/* $LOAD_PATH methods which invalidates cache */
+static const char *load_path_reset_cache_methods[] = {
+    "[]=", "collect!", "compact!", "delete",
+    "delete_if", "fill", "flatten!", "insert", "keep_if",
+    "map!", "reject!", "replace", "select!", "shuffle!",
+    "sort!", "sort_by!", "uniq!", NULL
+};
+
+/* $LOAD_PATH methods which sends also to cache */
+static const char *load_path_apply_to_cache_methods[] = {
+    "clear", "delete_at", "pop", "reverse!", "rotate!",
+    "shift", "slice!", NULL
+};
+
+/* $LOAD_PATH methods which sends to cache whith expanded arguments */
+static const char *load_path_apply_expanded_methods[] = {
+    "<<", "push", "unshift", NULL
+};
+
+void
+rb_reset_expanded_cache()
+{
+    GET_VM()->load_path_expanded_cache = 0;
+}
+
+static VALUE
+rb_load_path_expanded_cache()
+{
+    VALUE cache = GET_VM()->load_path_expanded_cache;
+    VALUE expanded = Qnil;
+    if (RTEST(cache)) {
+	expanded = RARRAY_PTR(cache)[2];
+    }
+    return expanded;
+}
+
+/* Return cache only if we still in the same working directory
+ * and filesystem_encoding didn't change
+ * Invalidate cache otherwise
+ */
+static VALUE
+rb_checked_expanded_cache(int *has_relative)
+{
+    VALUE cache = GET_VM()->load_path_expanded_cache;
+    VALUE expanded = Qnil;
+    if (RTEST(cache)) {
+	VALUE curwd = RARRAY_PTR(cache)[0];
+	VALUE encindex = RARRAY_PTR(cache)[1];
+	int cache_valid = rb_filesystem_encindex() == FIX2INT(encindex);
+
+	if ( cache_valid ) {
+	    cache_valid = curwd == Qtrue;
+	    if (has_relative) {
+		*has_relative = cache_valid;
+	    }
+	    if (!cache_valid ) {
+		char *cwd = my_getcwd();
+		cache_valid = !strcmp(RSTRING_PTR(curwd), cwd);
+		xfree(cwd);
+	    }
+	}
+
+	if ( !cache_valid ) {
+	    rb_reset_expanded_cache();
+	} else {
+	    expanded = RARRAY_PTR(cache)[2];
+	}
+    }
+    RB_GC_GUARD(cache);
+    return expanded;
+}
+
+static void
+rb_set_expanded_cache(VALUE expanded, int has_relative)
+{
+    VALUE cache = rb_ary_new2(3);
+
+    if (has_relative) {
+	char *cwd = my_getcwd();
+	rb_ary_push(cache, rb_str_new_cstr(cwd));
+	xfree(cwd);
+    } else {
+	rb_ary_push(cache, Qtrue);
+    }
+
+    rb_ary_push(cache, INT2FIX(rb_filesystem_encindex()));
+    rb_ary_push(cache, rb_ary_dup(expanded));
+    GET_VM()->load_path_expanded_cache = cache;
+}
+
+static VALUE
+rb_expand_load_paths(long pathc, VALUE* paths, int *has_relative)
+{
+    long i;
+    const char *p;
+    VALUE path, expanded = rb_ary_new2(pathc);
+
+    for(i = 0; i < pathc; i++) {
+	path = rb_get_path(paths[i]);
+	p = RSTRING_PTR(path);
+	*has_relative = *has_relative || !rb_is_absolute_path(p);
+	path = rb_file_expand_path(path, Qnil);
+	rb_str_freeze(path);
+	rb_ary_push(expanded, path);
+    }
+
+    return expanded;
+}
+
+/* Invalidating $LOAD_PATH methods implementation */
+static VALUE
+rb_load_path_reset_cache_method(int argc, VALUE *argv, VALUE self)
+{
+    rb_reset_expanded_cache();
+    return rb_call_super(argc, argv);
+}
+
+/* Proxying $LOAD_PATH methods implementation */
+static VALUE
+rb_load_path_apply_to_cache_method(int argc, VALUE *argv, VALUE self)
+{
+    VALUE load_path_expanded = rb_load_path_expanded_cache();
+    if (RTEST(load_path_expanded)) {
+	ID func = rb_frame_this_func();
+	rb_funcall2(load_path_expanded, func, argc, argv);
+    }
+    return rb_call_super(argc, argv);
+}
+
+/* Proxying with expansion $LOAD_PATH methods implementation */
+static VALUE
+rb_load_path_apply_expanded_method(int argc, VALUE *argv, VALUE self)
+{
+    int old_has_relative = 0;
+    /* We call methods on cache only if we still in the same working directory */
+    VALUE load_path_expanded = rb_checked_expanded_cache(&old_has_relative);
+    if (RTEST(load_path_expanded)) {
+	int has_relative = 0;
+	ID func = rb_frame_this_func();
+	VALUE expanded = rb_expand_load_paths(argc, argv, &has_relative);
+
+	rb_funcall2(load_path_expanded, func, argc, RARRAY_PTR(expanded));
+
+	if (!old_has_relative && has_relative) {
+	    rb_set_expanded_cache(load_path_expanded, has_relative);
+	}
+	RB_GC_GUARD(expanded);
+    }
+    return rb_call_super(argc, argv);
+}
+/* $LOAD_PATH.concat(ary) - special, we call push(*ary) instead
+ * cause I'm lazy a bit and wish not to rewrite method above second time :)
+ */
+static VALUE
+rb_load_path_concat(VALUE self, VALUE ary)
+{
+    ID push;
+    CONST_ID(push, "push");
+    RB_GC_GUARD(ary);
+    return rb_funcall2(self, push, (int)RARRAY_LEN(ary), RARRAY_PTR(ary));
+}
+
+void
+rb_load_path_ary_push(VALUE path)
+{
+    int old_has_relative = 0;
+    VALUE load_path_expanded = rb_checked_expanded_cache(&old_has_relative);
+    if (RTEST(load_path_expanded)) {
+	int has_relative = 0;
+	VALUE expanded = rb_expand_load_paths(1, &path, &has_relative);
+
+	rb_ary_push(load_path_expanded, RARRAY_PTR(expanded)[0]);
+
+	if (!old_has_relative && has_relative) {
+	    rb_set_expanded_cache(load_path_expanded, has_relative);
+	}
+	RB_GC_GUARD(expanded);
+    }
+
+    rb_ary_push(GET_VM()->load_path, path);
+}
+
+static VALUE
+rb_load_path_init(void)
+{
+    const char **name;
+    VALUE load_path = rb_ary_new();
+    char *cached_flag;
+
+    cached_flag = getenv("RUBY_CACHED_LOAD_PATH");
+    if (cached_flag != NULL) {
+	cached_expanded_load_path = atoi(cached_flag);
+    }
+
+    /* Do all the magick if user did not disable it
+     * with RUBY_CACHED_LOAD_PATH=0 environment variable
+     */
+    if (cached_expanded_load_path) {
+	VALUE load_path_c = rb_singleton_class(load_path);
+
+	for(name = load_path_reset_cache_methods; *name; name++ ) {
+	    rb_define_method(load_path_c, *name, rb_load_path_reset_cache_method, -1);
+	}
+
+	for(name = load_path_apply_to_cache_methods; *name; name++ ) {
+	    rb_define_method(load_path_c, *name, rb_load_path_apply_to_cache_method, -1);
+	}
+
+	for(name = load_path_apply_expanded_methods; *name; name++ ) {
+	    rb_define_method(load_path_c, *name, rb_load_path_apply_expanded_method, -1);
+	}
+
+	rb_define_method(load_path_c, "concat", rb_load_path_concat, 1);
+    }
+
+    rb_reset_expanded_cache();
+
+    return load_path;
+}
+
 void
 Init_load()
 {
@@ -772,11 +1182,11 @@ Init_load()
     rb_define_hooked_variable(var_load_path, (VALUE*)vm, load_path_getter, rb_gvar_readonly_setter);
     rb_alias_variable(rb_intern("$-I"), id_load_path);
     rb_alias_variable(rb_intern("$LOAD_PATH"), id_load_path);
-    vm->load_path = rb_ary_new();
+    vm->load_path = rb_load_path_init();
 
     rb_define_virtual_variable("$\"", get_loaded_features, 0);
     rb_define_virtual_variable("$LOADED_FEATURES", get_loaded_features, 0);
-    vm->loaded_features = rb_ary_new();
+    vm->loaded_features = rb_loaded_features_init();
 
     rb_define_global_function("load", rb_f_load, -1);
     rb_define_global_function("require", rb_f_require, 1);
diff --git a/pool_alloc.h b/pool_alloc.h
new file mode 100644
index 0000000..957708e
--- /dev/null
+++ b/pool_alloc.h
@@ -0,0 +1,11 @@
+#ifndef POOL_ALLOC_H
+#define POOL_ALLOC_H
+
+#define POOL_ALLOC_API
+#ifdef POOL_ALLOC_API
+void  ruby_xpool_free(void *ptr);
+void *ruby_xpool_malloc_6p();
+void *ruby_xpool_malloc_11p();
+#endif
+
+#endif
diff --git a/pool_alloc.inc.h b/pool_alloc.inc.h
new file mode 100644
index 0000000..5b735be
--- /dev/null
+++ b/pool_alloc.inc.h
@@ -0,0 +1,187 @@
+/*
+ * this is generic pool allocator
+ * you should define following macroses:
+ * ITEM_NAME - unique identifier, which allows to hold functions in a namespace
+ * ITEM_TYPEDEF(name) - passed to typedef to localize item type
+ * free_entry - desired name of function for free entry
+ * alloc_entry - defired name of function for allocate entry
+ */
+
+#if POOL_ALLOC_PART == 1
+#define DEFAULT_POOL_SIZE 8192
+typedef unsigned int pool_holder_counter;
+
+typedef struct pool_entry_list pool_entry_list;
+typedef struct pool_holder pool_holder;
+
+typedef struct pool_header {
+    pool_holder         *first;
+    pool_holder         *_black_magick;
+    pool_holder_counter  size; // size of entry in sizeof(void*) items
+    pool_holder_counter  total; // size of entry in sizeof(void*) items
+} pool_header;
+
+struct pool_holder {
+    pool_holder_counter free, total;
+    pool_header  *header;
+    void               *freep;
+    pool_holder        *fore, *back;
+    void *data[1];
+};
+#define POOL_DATA_SIZE(pool_size) (((pool_size) - sizeof(void*) * 6 - offsetof(pool_holder, data)) / sizeof(void*))
+#define POOL_ENTRY_SIZE(item_type) ((sizeof(item_type) - 1) / sizeof(void*) + 1)
+#define POOL_HOLDER_COUNT(pool_size, item_type) (POOL_DATA_SIZE(pool_size)/POOL_ENTRY_SIZE(item_type))
+#define INIT_POOL(item_type) {NULL, NULL, POOL_ENTRY_SIZE(item_type), POOL_HOLDER_COUNT(DEFAULT_POOL_SIZE, item_type)}
+
+#elif POOL_ALLOC_PART == 2
+static void *
+aligned_malloc(size_t alignment, size_t size)
+{
+    void *res;
+
+#if __MINGW32__
+    res = __mingw_aligned_malloc(size, alignment);
+#elif _WIN32 || defined __CYGWIN__
+    res = _aligned_malloc(size, alignment);
+#elif defined(HAVE_POSIX_MEMALIGN)
+    if (posix_memalign(&res, alignment, size) == 0) {
+        return res;
+    } else {
+        return NULL;
+    }
+#elif defined(HAVE_MEMALIGN)
+    res = memalign(alignment, size);
+#else
+#error no memalign function
+#endif
+    return res;
+}
+
+static void
+aligned_free(void *ptr)
+{
+#if __MINGW32__
+    __mingw_aligned_free(ptr);
+#elif _WIN32 || defined __CYGWIN__
+    _aligned_free(ptr);
+#else
+    free(ptr);
+#endif
+}
+
+static pool_holder *
+pool_holder_alloc(pool_header *header)
+{
+    pool_holder *holder;
+    pool_holder_counter i, size, count;
+    register void **ptr;
+
+    size_t sz = offsetof(pool_holder, data) +
+	    header->size * header->total * sizeof(void*);
+#define objspace (&rb_objspace)
+    vm_malloc_prepare(objspace, DEFAULT_POOL_SIZE);
+    if (header->first != NULL) return header->first;
+    TRY_WITH_GC(holder = (pool_holder*) aligned_malloc(DEFAULT_POOL_SIZE, sz));
+    malloc_increase += DEFAULT_POOL_SIZE;
+#if CALC_EXACT_MALLOC_SIZE
+    objspace->malloc_params.allocated_size += DEFAULT_POOL_SIZE;
+    objspace->malloc_params.allocations++;
+#endif
+#undef objspace
+
+    size = header->size;
+    count = header->total;
+    holder->free = count;
+    holder->total = count;
+    holder->header = header;
+    holder->fore = NULL;
+    holder->back = NULL;
+    holder->freep = &holder->data;
+    ptr = holder->data;
+    for(i = count - 1; i; i-- ) {
+	ptr = *ptr = ptr + size;
+    }
+    *ptr = NULL;
+    header->first = holder;
+    return holder;
+}
+
+static inline void
+pool_holder_unchaing(pool_header *header, pool_holder *holder)
+{
+    register pool_holder *fore = holder->fore, *back = holder->back;
+    holder->fore = NULL;
+    holder->back = NULL;
+    if (fore != NULL)  fore->back     = back;
+    else               header->_black_magick = back;
+    if (back != NULL)  back->fore     = fore;
+    else               header->first = fore;
+}
+
+static inline pool_holder *
+entry_holder(void **entry)
+{
+    return (pool_holder*)(((uintptr_t)entry) & ~(DEFAULT_POOL_SIZE - 1));
+}
+
+static inline void
+pool_free_entry(void **entry)
+{
+    pool_holder *holder = entry_holder(entry);
+    pool_header *header = holder->header;
+
+    if (holder->free++ == 0) {
+	register pool_holder *first = header->first;
+	if (first == NULL) {
+	    header->first = holder;
+	} else {
+	    holder->back = first;
+	    holder->fore = first->fore;
+	    first->fore = holder;
+	    if (holder->fore)
+		holder->fore->back = holder;
+	    else
+		header->_black_magick = holder;
+	}
+    } else if (holder->free == holder->total && header->first != holder ) {
+	pool_holder_unchaing(header, holder);
+	aligned_free(holder);
+#if CALC_EXACT_MALLOC_SIZE
+	rb_objspace.malloc_params.allocated_size -= DEFAULT_POOL_SIZE;
+	rb_objspace.malloc_params.allocations--;
+#endif
+	return;
+    }
+
+    *entry = holder->freep;
+    holder->freep = entry;
+}
+
+static inline void*
+pool_alloc_entry(pool_header *header)
+{
+    pool_holder *holder = header->first;
+    void **result;
+    if (holder == NULL) {
+	holder = pool_holder_alloc(header);
+    }
+
+    result = holder->freep;
+    holder->freep = *result;
+
+    if (--holder->free == 0) {
+	pool_holder_unchaing(header, holder);
+    }
+
+    return result;
+}
+
+static void
+pool_finalize_header(pool_header *header)
+{
+    if (header->first) {
+        aligned_free(header->first);
+        header->first = NULL;
+    }
+}
+#endif
diff --git a/ruby.c b/ruby.c
index b53784f..0897400 100644
--- a/ruby.c
+++ b/ruby.c
@@ -209,7 +209,6 @@ push_include(const char *path, VALUE (*filter)(VALUE))
 {
     const char sep = PATH_SEP_CHAR;
     const char *p, *s;
-    VALUE load_path = GET_VM()->load_path;
 
     p = path;
     while (*p) {
@@ -217,7 +216,7 @@ push_include(const char *path, VALUE (*filter)(VALUE))
 	    p++;
 	if (!*p) break;
 	for (s = p; *s && *s != sep; s = CharNext(s));
-	rb_ary_push(load_path, (*filter)(rubylib_mangled_path(p, s - p)));
+	rb_load_path_ary_push((*filter)(rubylib_mangled_path(p, s - p)));
 	p = s;
     }
 }
@@ -338,7 +337,6 @@ ruby_init_loadpath(void)
 void
 ruby_init_loadpath_safe(int safe_level)
 {
-    VALUE load_path;
     ID id_initial_load_path_mark;
     extern const char ruby_initial_load_paths[];
     const char *paths = ruby_initial_load_paths;
@@ -438,7 +436,6 @@ ruby_init_loadpath_safe(int safe_level)
 #define RUBY_RELATIVE(path, len) rubylib_mangled_path((path), (len))
 #define PREFIX_PATH() RUBY_RELATIVE(exec_prefix, sizeof(exec_prefix)-1)
 #endif
-    load_path = GET_VM()->load_path;
 
     if (safe_level == 0) {
 #ifdef MANGLED_PATH
@@ -452,7 +449,7 @@ ruby_init_loadpath_safe(int safe_level)
 	size_t len = strlen(paths);
 	VALUE path = RUBY_RELATIVE(paths, len);
 	rb_ivar_set(path, id_initial_load_path_mark, path);
-	rb_ary_push(load_path, path);
+	rb_load_path_ary_push(path);
 	paths += len + 1;
     }
 
@@ -1349,6 +1346,7 @@ process_options(int argc, char **argv, struct cmdline_options *opt)
 	for (i = 0; i < RARRAY_LEN(load_path); ++i) {
 	    rb_enc_associate(RARRAY_PTR(load_path)[i], lenc);
 	}
+	rb_reset_expanded_cache();
     }
     if (!(opt->disable & DISABLE_BIT(gems))) {
 #if defined DISABLE_RUBYGEMS && DISABLE_RUBYGEMS
diff --git a/st.c b/st.c
index ba21b31..ed16995 100644
--- a/st.c
+++ b/st.c
@@ -7,6 +7,7 @@
 #include "st.h"
 #else
 #include "ruby/ruby.h"
+#include "pool_alloc.h"
 #endif
 
 #include <stdio.h>
@@ -27,6 +28,9 @@ struct st_table_entry {
 
 #define ST_DEFAULT_MAX_DENSITY 5
 #define ST_DEFAULT_INIT_TABLE_SIZE 11
+#define ST_DEFAULT_SECOND_TABLE_SIZE 19
+#define ST_DEFAULT_PACKED_TABLE_SIZE 18
+#define MAX_PACKED_HASH (ST_DEFAULT_PACKED_TABLE_SIZE / 3)
 
     /*
      * DEFAULT_MAX_DENSITY is the default for the largest we allow the
@@ -61,20 +65,98 @@ static void rehash(st_table *);
 #ifdef RUBY
 #define malloc xmalloc
 #define calloc xcalloc
+#define realloc xrealloc
 #define free(x) xfree(x)
 #endif
 
 #define numberof(array) (int)(sizeof(array) / sizeof((array)[0]))
 
-#define alloc(type) (type*)malloc((size_t)sizeof(type))
-#define Calloc(n,s) (char*)calloc((n),(s))
-
 #define EQUAL(table,x,y) ((x)==(y) || (*(table)->type->compare)((x),(y)) == 0)
 
 /* remove cast to unsigned int in the future */
 #define do_hash(key,table) (unsigned int)(st_index_t)(*(table)->type->hash)((key))
 #define do_hash_bin(key,table) (do_hash((key), (table))%(table)->num_bins)
 
+/* preparation for possible allocation improvements */
+#ifdef POOL_ALLOC_API
+#define st_alloc_entry() (st_table_entry *)ruby_xpool_malloc_6p()
+#define st_free_entry(entry) ruby_xpool_free(entry)
+#define st_alloc_table() (st_table *)ruby_xpool_malloc_6p()
+#define st_dealloc_table(table) ruby_xpool_free(table)
+static inline st_table_entry **
+st_alloc_bins(st_index_t size)
+{
+    st_table_entry **result;
+    if (size == 11) {
+        result = (st_table_entry **) ruby_xpool_malloc_11p();
+        memset(result, 0, 11 * sizeof(st_table_entry *));
+    }
+    else
+        result = (st_table_entry **) ruby_xcalloc(size, sizeof(st_table_entry*));
+    return result;
+}
+static inline void
+st_free_bins(st_table_entry **bins, st_index_t size)
+{
+    if (size == 11)
+	ruby_xpool_free(bins);
+    else
+	ruby_xfree(bins);
+}
+static inline st_table_entry**
+st_realloc_bins(st_table_entry **bins, st_index_t newsize, st_index_t oldsize)
+{
+    st_free_bins(bins, oldsize);
+    return st_alloc_bins(newsize);
+}
+#else
+#define st_alloc_entry() (st_table_entry *)malloc(sizeof(st_table_entry))
+#define st_free_entry(entry) free(entry)
+#define st_alloc_table() (st_table *)malloc(sizeof(st_table))
+#define st_dealloc_table(table) free(table)
+#define st_alloc_bins(size) (st_table_entry **)calloc(size, sizeof(st_table_entry *))
+#define st_free_bins(bins, size) free(bins)
+static inline st_table_entry**
+st_realloc_bins(st_table_entry **bins, st_index_t newsize, st_index_t oldsize)
+{
+    bins = (st_table_entry **) realloc(bins, newsize * sizeof(st_table_entry *));
+    memset(bins, 0, newsize * sizeof(st_table_entry *));
+    return bins;
+}
+#endif
+
+/* preparation for possible packing improvements */
+#define PKEY_POS(i, num_bins) ((num_bins)-(i)*2-2)
+#define PVAL_POS(i, num_bins) ((num_bins)-(i)*2-1)
+#define PHASH_POS(i, num_bins) (i)
+#define PKEY(table, i) (st_data_t)(table)->bins[PKEY_POS(i, (table)->num_bins)]
+#define PVAL(table, i) (st_data_t)(table)->bins[PVAL_POS(i, (table)->num_bins)]
+#define PHASH(table, i) (st_data_t)(table)->bins[PHASH_POS(i, (table)->num_bins)]
+#define PKEY_SET(table, i, v) do{ (table)->bins[PKEY_POS(i, (table)->num_bins)] = (st_table_entry *)(v); } while(0)
+#define PVAL_SET(table, i, v) do{ (table)->bins[PVAL_POS(i, (table)->num_bins)] = (st_table_entry *)(v); } while(0)
+#define PHASH_SET(table, i, v) do{ (table)->bins[PHASH_POS(i, (table)->num_bins)] = (st_table_entry *)(v); } while(0)
+/* this function depends much on packed layout, so that it placed here */
+static inline void
+remove_packed_entry(st_table *table, st_index_t i)
+{
+    table->num_entries--;
+    if (i < table->num_entries) {
+        st_index_t mv = table->num_entries - i, upto = table->num_bins - 2*table->num_entries;
+        memmove(table->bins + i, table->bins + i + 1, sizeof(st_table_entry *) * mv);
+        memmove(table->bins + upto, table->bins + upto - 2,
+                sizeof(st_table_entry *) * mv * 2);
+    }
+}
+/* ultra packed values */
+#define MAX_ULTRA_PACKED 1
+#define ULTRA_PACKED(table) ((table)->num_bins == 0)
+#define UPHASH(table) ((st_index_t)(table)->bins)
+#define UPKEY(table)  ((st_data_t)(table)->head)
+#define UPVAL(table)  ((st_data_t)(table)->tail)
+#define UPHASH_SET(table, val) do{ (table)->bins = (st_table_entry **)(val); } while(0)
+#define UPKEY_SET(table, val) do{ (table)->head = (st_table_entry *)(val); } while(0)
+#define UPVAL_SET(table, val) do{ (table)->tail = (st_table_entry *)(val); } while(0)
+
 /*
  * MINSIZE is the minimum size of a dictionary.
  */
@@ -85,8 +167,8 @@ static void rehash(st_table *);
 Table of prime numbers 2^n+a, 2<=n<=30.
 */
 static const unsigned int primes[] = {
-	8 + 3,
-	16 + 3,
+	ST_DEFAULT_INIT_TABLE_SIZE,
+	ST_DEFAULT_SECOND_TABLE_SIZE,
 	32 + 5,
 	64 + 3,
 	128 + 3,
@@ -161,8 +243,6 @@ stat_col(void)
 }
 #endif
 
-#define MAX_PACKED_NUMHASH (ST_DEFAULT_INIT_TABLE_SIZE/2)
-
 st_table*
 st_init_table_with_size(const struct st_hash_type *type, st_index_t size)
 {
@@ -181,14 +261,19 @@ st_init_table_with_size(const struct st_hash_type *type, st_index_t size)
     }
 #endif
 
-    size = new_size(size);	/* round up to prime number */
 
-    tbl = alloc(st_table);
+    tbl = st_alloc_table();
     tbl->type = type;
     tbl->num_entries = 0;
-    tbl->entries_packed = type == &type_numhash && size/2 <= MAX_PACKED_NUMHASH;
+    if ( (tbl->entries_packed = size <= MAX_PACKED_HASH) ) {
+	size = size <= MAX_ULTRA_PACKED ? 0 :
+		ST_DEFAULT_PACKED_TABLE_SIZE;
+    }
+    else {
+	size = new_size(size);	/* round up to prime number */
+    }
     tbl->num_bins = size;
-    tbl->bins = (st_table_entry **)Calloc(size, sizeof(st_table_entry*));
+    tbl->bins = size ? st_alloc_bins(size) : NULL;
     tbl->head = 0;
     tbl->tail = 0;
 
@@ -253,7 +338,7 @@ st_clear(st_table *table)
 	table->bins[i] = 0;
 	while (ptr != 0) {
 	    next = ptr->next;
-	    free(ptr);
+	    st_free_entry(ptr);
 	    ptr = next;
 	}
     }
@@ -266,8 +351,9 @@ void
 st_free_table(st_table *table)
 {
     st_clear(table);
-    free(table->bins);
-    free(table);
+    if (table->num_bins)
+	st_free_bins(table->bins, table->num_bins);
+    st_dealloc_table(table);
 }
 
 size_t
@@ -306,40 +392,69 @@ count_collision(const struct st_hash_type *type)
 #define FOUND_ENTRY
 #endif
 
-#define FIND_ENTRY(table, ptr, hash_val, bin_pos) do {\
-    (bin_pos) = (hash_val)%(table)->num_bins;\
-    (ptr) = (table)->bins[(bin_pos)];\
-    FOUND_ENTRY;\
-    if (PTR_NOT_EQUAL((table), (ptr), (hash_val), key)) {\
-	COLLISION;\
-	while (PTR_NOT_EQUAL((table), (ptr)->next, (hash_val), key)) {\
-	    (ptr) = (ptr)->next;\
-	}\
-	(ptr) = (ptr)->next;\
-    }\
-} while (0)
+static st_table_entry *
+find_entry(st_table *table, st_data_t key, st_index_t hash_val, st_index_t bin_pos)
+{
+    register st_table_entry *ptr = table->bins[bin_pos];
+    FOUND_ENTRY;
+    if (PTR_NOT_EQUAL(table, ptr, hash_val, key)) {
+	COLLISION;
+	while (PTR_NOT_EQUAL(table, ptr->next, hash_val, key)) {
+	    ptr = ptr->next;
+	}
+	ptr = ptr->next;
+    }
+    return ptr;
+}
+
+static inline st_index_t
+find_packed_index(st_table *table, st_index_t hash_val, st_data_t key)
+{
+    st_index_t i = 0;
+    for(;;) {
+        while (i < table->num_entries && PHASH(table, i) != hash_val) i++;
+        if (i == table->num_entries || EQUAL(table, key, PKEY(table, i)))
+            break;
+        i++;
+    }
+    return i;
+}
+
+static inline int
+check_ultra_packed(st_table *table, st_index_t hash_val, st_data_t key)
+{
+  return table->num_entries && UPHASH(table) == hash_val &&
+      EQUAL(table, key, UPKEY(table));
+}
 
 #define collision_check 0
 
 int
 st_lookup(st_table *table, register st_data_t key, st_data_t *value)
 {
-    st_index_t hash_val, bin_pos;
+    st_index_t hash_val;
     register st_table_entry *ptr;
 
+    hash_val = do_hash(key, table);
+
     if (table->entries_packed) {
-        st_index_t i;
-        for (i = 0; i < table->num_entries; i++) {
-            if ((st_data_t)table->bins[i*2] == key) {
-                if (value !=0) *value = (st_data_t)table->bins[i*2+1];
-                return 1;
-            }
-        }
+	if (ULTRA_PACKED(table)) {
+	    if (check_ultra_packed(table, hash_val, key)) {
+		if (value != 0) *value = UPVAL(table);
+		return 1;
+	    }
+	}
+	else {
+	    st_index_t i = find_packed_index(table, hash_val, key);
+	    if (i < table->num_entries) {
+		if (value != 0) *value = PVAL(table, i);
+		return 1;
+	    }
+	}
         return 0;
     }
 
-    hash_val = do_hash(key, table);
-    FIND_ENTRY(table, ptr, hash_val, bin_pos);
+    ptr = find_entry(table, key, hash_val, hash_val % table->num_bins);
 
     if (ptr == 0) {
 	return 0;
@@ -353,22 +468,29 @@ st_lookup(st_table *table, register st_data_t key, st_data_t *value)
 int
 st_get_key(st_table *table, register st_data_t key, st_data_t *result)
 {
-    st_index_t hash_val, bin_pos;
+    st_index_t hash_val;
     register st_table_entry *ptr;
 
+    hash_val = do_hash(key, table);
+
     if (table->entries_packed) {
-        st_index_t i;
-        for (i = 0; i < table->num_entries; i++) {
-            if ((st_data_t)table->bins[i*2] == key) {
-                if (result !=0) *result = (st_data_t)table->bins[i*2];
-                return 1;
-            }
-        }
+	if (ULTRA_PACKED(table)) {
+	    if (check_ultra_packed(table, hash_val, key)) {
+		if (result != 0) *result = UPKEY(table);
+		return 1;
+	    }
+	}
+	else {
+	    st_index_t i = find_packed_index(table, hash_val, key);
+	    if (i < table->num_entries) {
+		if (result != 0) *result = PKEY(table, i);
+		return 1;
+	    }
+	}
         return 0;
     }
 
-    hash_val = do_hash(key, table);
-    FIND_ENTRY(table, ptr, hash_val, bin_pos);
+    ptr = find_entry(table, key, hash_val, hash_val % table->num_bins);
 
     if (ptr == 0) {
 	return 0;
@@ -382,85 +504,160 @@ st_get_key(st_table *table, register st_data_t key, st_data_t *result)
 #undef collision_check
 #define collision_check 1
 
-#define MORE_PACKABLE_P(table) \
-    ((st_index_t)((table)->num_entries+1) * 2 <= (table)->num_bins && \
-     (table)->num_entries+1 <= MAX_PACKED_NUMHASH)
-
-#define ADD_DIRECT(table, key, value, hash_val, bin_pos)\
-do {\
-    st_table_entry *entry;\
-    if ((table)->num_entries > ST_DEFAULT_MAX_DENSITY * (table)->num_bins) {\
-	rehash(table);\
-        (bin_pos) = (hash_val) % (table)->num_bins;\
-    }\
-    \
-    entry = alloc(st_table_entry);\
-    \
-    entry->hash = (hash_val);\
-    entry->key = (key);\
-    entry->record = (value);\
-    entry->next = (table)->bins[(bin_pos)];\
-    if ((table)->head != 0) {\
-	entry->fore = 0;\
-	(entry->back = (table)->tail)->fore = entry;\
-	(table)->tail = entry;\
-    }\
-    else {\
-	(table)->head = (table)->tail = entry;\
-	entry->fore = entry->back = 0;\
-    }\
-    (table)->bins[(bin_pos)] = entry;\
-    (table)->num_entries++;\
-} while (0)
+static inline st_table_entry *
+new_entry(st_table * table, st_data_t key, st_data_t value,
+	st_index_t hash_val, register st_index_t bin_pos)
+{
+    register st_table_entry *entry = st_alloc_entry();
+
+    entry->next = table->bins[bin_pos];
+    table->bins[bin_pos] = entry;
+    entry->hash = hash_val;
+    entry->key = key;
+    entry->record = value;
+
+    return entry;
+}
+
+static inline void
+add_direct(st_table * table, st_data_t key, st_data_t value,
+	st_index_t hash_val, register st_index_t bin_pos)
+{
+    register st_table_entry *entry;
+    if (table->num_entries > ST_DEFAULT_MAX_DENSITY * table->num_bins) {
+	rehash(table);
+        bin_pos = hash_val % table->num_bins;
+    }
+
+    entry = new_entry(table, key, value, hash_val, bin_pos);
+
+    if (table->head != 0) {
+	entry->fore = 0;
+	(entry->back = table->tail)->fore = entry;
+	table->tail = entry;
+    }
+    else {
+	table->head = table->tail = entry;
+	entry->fore = entry->back = 0;
+    }
+    table->num_entries++;
+}
 
 static void
 unpack_entries(register st_table *table)
 {
     st_index_t i;
-    struct st_table_entry *packed_bins[MAX_PACKED_NUMHASH*2];
+    register st_table_entry *entry;
+#if ST_DEFAULT_INIT_TABLE_SIZE == ST_DEFAULT_PACKED_TABLE_SIZE
+    struct st_table_entry *packed_bins[ST_DEFAULT_INIT_TABLE_SIZE];
     st_table tmp_table = *table;
 
-    memcpy(packed_bins, table->bins, sizeof(struct st_table_entry *) * table->num_entries*2);
+    memcpy(packed_bins, table->bins, sizeof(st_table_entry *) * ST_DEFAULT_INIT_TABLE_SIZE);
     table->bins = packed_bins;
     tmp_table.entries_packed = 0;
     tmp_table.num_entries = 0;
     memset(tmp_table.bins, 0, sizeof(struct st_table_entry *) * tmp_table.num_bins);
-    for (i = 0; i < table->num_entries; i++) {
-        st_insert(&tmp_table, (st_data_t)packed_bins[i*2], (st_data_t)packed_bins[i*2+1]);
+#else
+    st_table tmp_table = {table->type, 0, 0, 0, 0, 0, 0};
+
+    tmp_table.bins = st_alloc_bins(ST_DEFAULT_INIT_TABLE_SIZE);
+    tmp_table.num_bins = ST_DEFAULT_INIT_TABLE_SIZE;
+#endif
+    entry = new_entry(&tmp_table, PKEY(table, 0), PVAL(table, 0),
+	    PHASH(table, 0), PHASH(table, 0) % tmp_table.num_bins);
+    tmp_table.head = entry;
+    entry->back = 0;
+    for (i = 1; i < MAX_PACKED_HASH; i++) {
+	register st_table_entry *oldentry = entry;
+	st_index_t hash_val = PHASH(table, i);
+	entry = new_entry(&tmp_table, PKEY(table, i), PVAL(table, i),
+		hash_val, hash_val % tmp_table.num_bins);
+	oldentry->fore = entry;
+	entry->back = oldentry;
     }
+    entry->fore = 0;
+    tmp_table.tail = entry;
+    tmp_table.num_entries = MAX_PACKED_HASH;
+#if ST_DEFAULT_INIT_TABLE_SIZE != ST_DEFAULT_PACKED_TABLE_SIZE
+    st_free_bins(table->bins, table->num_bins);
+#endif
     *table = tmp_table;
 }
 
+static void
+add_packed_direct(st_table *table, st_data_t key, st_data_t value, st_index_t hash_val)
+{
+    if (table->num_entries < MAX_PACKED_HASH ) {
+	st_index_t i = table->num_entries++;
+	PKEY_SET(table, i, key);
+	PVAL_SET(table, i, value);
+	PHASH_SET(table, i, hash_val);
+    }
+    else {
+	unpack_entries(table);
+	add_direct(table, key, value, hash_val, hash_val % table->num_bins);
+    }
+}
+
+static void
+add_upacked_direct(st_table *table, st_data_t key, st_data_t value, st_index_t hash_val)
+{
+    if (table->num_entries) {
+	st_index_t fhash = UPHASH(table);
+	st_data_t fkey = UPKEY(table), fval = UPVAL(table);
+	table->bins = st_alloc_bins(ST_DEFAULT_PACKED_TABLE_SIZE);
+	table->num_bins = ST_DEFAULT_PACKED_TABLE_SIZE;
+	PHASH_SET(table, 0, fhash);
+	PKEY_SET(table, 0, fkey);
+	PVAL_SET(table, 0, fval);
+	PHASH_SET(table, 1, hash_val);
+	PKEY_SET(table, 1, key);
+	PVAL_SET(table, 1, value);
+	table->num_entries = 2;
+	table->head = NULL;
+	table->tail = NULL;
+    }
+    else {
+	UPHASH_SET(table, hash_val);
+	UPKEY_SET(table, key);
+	UPVAL_SET(table, value);
+	table->num_entries = 1;
+    }
+}
+
 int
 st_insert(register st_table *table, register st_data_t key, st_data_t value)
 {
-    st_index_t hash_val, bin_pos;
+    st_index_t hash_val;
+    register st_index_t bin_pos;
     register st_table_entry *ptr;
 
+    hash_val = do_hash(key, table);
+
     if (table->entries_packed) {
-        st_index_t i;
-        for (i = 0; i < table->num_entries; i++) {
-            if ((st_data_t)table->bins[i*2] == key) {
-                table->bins[i*2+1] = (struct st_table_entry*)value;
-                return 1;
-            }
-        }
-        if (MORE_PACKABLE_P(table)) {
-            i = table->num_entries++;
-            table->bins[i*2] = (struct st_table_entry*)key;
-            table->bins[i*2+1] = (struct st_table_entry*)value;
-            return 0;
-        }
-        else {
-            unpack_entries(table);
-        }
+	if (ULTRA_PACKED(table)) {
+	    if (check_ultra_packed(table, hash_val, key)) {
+		UPVAL_SET(table, value);
+		return 1;
+	    }
+	    add_upacked_direct(table, key, value, hash_val);
+	}
+	else {
+	    st_index_t i = find_packed_index(table, hash_val, key);
+	    if (i < table->num_entries) {
+		PVAL_SET(table, i, value);
+		return 1;
+	    }
+	    add_packed_direct(table, key, value, hash_val);
+	}
+	return 0;
     }
 
-    hash_val = do_hash(key, table);
-    FIND_ENTRY(table, ptr, hash_val, bin_pos);
+    bin_pos = hash_val % table->num_bins;
+    ptr = find_entry(table, key, hash_val, bin_pos);
 
     if (ptr == 0) {
-	ADD_DIRECT(table, key, value, hash_val, bin_pos);
+	add_direct(table, key, value, hash_val, bin_pos);
 	return 0;
     }
     else {
@@ -473,34 +670,39 @@ int
 st_insert2(register st_table *table, register st_data_t key, st_data_t value,
 	   st_data_t (*func)(st_data_t))
 {
-    st_index_t hash_val, bin_pos;
+    st_index_t hash_val;
+    register st_index_t bin_pos;
     register st_table_entry *ptr;
 
+    hash_val = do_hash(key, table);
+
     if (table->entries_packed) {
-        st_index_t i;
-        for (i = 0; i < table->num_entries; i++) {
-            if ((st_data_t)table->bins[i*2] == key) {
-                table->bins[i*2+1] = (struct st_table_entry*)value;
-                return 1;
-            }
-        }
-        if (MORE_PACKABLE_P(table)) {
-            i = table->num_entries++;
-            table->bins[i*2] = (struct st_table_entry*)key;
-            table->bins[i*2+1] = (struct st_table_entry*)value;
-            return 0;
-        }
-        else {
-            unpack_entries(table);
-        }
+	if (ULTRA_PACKED(table)) {
+	    if (check_ultra_packed(table, hash_val, key)) {
+		UPVAL_SET(table, value);
+		return 1;
+	    }
+	    key = (*func)(key);
+	    add_upacked_direct(table, key, value, hash_val);
+	}
+	else {
+	    st_index_t i = find_packed_index(table, hash_val, key);
+	    if (i < table->num_entries) {
+		PVAL_SET(table, i, value);
+		return 1;
+	    }
+	    key = (*func)(key);
+	    add_packed_direct(table, key, value, hash_val);
+	}
+	return 0;
     }
 
-    hash_val = do_hash(key, table);
-    FIND_ENTRY(table, ptr, hash_val, bin_pos);
+    bin_pos = hash_val % table->num_bins;
+    ptr = find_entry(table, key, hash_val, bin_pos);
 
     if (ptr == 0) {
 	key = (*func)(key);
-	ADD_DIRECT(table, key, value, hash_val, bin_pos);
+	add_direct(table, key, value, hash_val, bin_pos);
 	return 0;
     }
     else {
@@ -512,36 +714,30 @@ st_insert2(register st_table *table, register st_data_t key, st_data_t value,
 void
 st_add_direct(st_table *table, st_data_t key, st_data_t value)
 {
-    st_index_t hash_val, bin_pos;
+    st_index_t hash_val;
 
+    hash_val = do_hash(key, table);
     if (table->entries_packed) {
-        int i;
-        if (MORE_PACKABLE_P(table)) {
-            i = table->num_entries++;
-            table->bins[i*2] = (struct st_table_entry*)key;
-            table->bins[i*2+1] = (struct st_table_entry*)value;
-            return;
-        }
-        else {
-            unpack_entries(table);
-        }
+	if (ULTRA_PACKED(table)) {
+	    add_upacked_direct(table, key, value, hash_val);
+	}
+	else {
+	    add_packed_direct(table, key, value, hash_val);
+	}
+	return;
     }
 
-    hash_val = do_hash(key, table);
-    bin_pos = hash_val % table->num_bins;
-    ADD_DIRECT(table, key, value, hash_val, bin_pos);
+    add_direct(table, key, value, hash_val, hash_val % table->num_bins);
 }
 
 static void
 rehash(register st_table *table)
 {
     register st_table_entry *ptr, **new_bins;
-    st_index_t i, new_num_bins, hash_val;
+    st_index_t new_num_bins, hash_val;
 
     new_num_bins = new_size(table->num_bins+1);
-    new_bins = (st_table_entry**)
-	xrealloc(table->bins, new_num_bins * sizeof(st_table_entry*));
-    for (i = 0; i < new_num_bins; ++i) new_bins[i] = 0;
+    new_bins = st_realloc_bins(table->bins, new_num_bins, table->num_bins);
     table->num_bins = new_num_bins;
     table->bins = new_bins;
 
@@ -562,17 +758,20 @@ st_copy(st_table *old_table)
     st_index_t num_bins = old_table->num_bins;
     st_index_t hash_val;
 
-    new_table = alloc(st_table);
+    new_table = st_alloc_table();
     if (new_table == 0) {
 	return 0;
     }
 
     *new_table = *old_table;
-    new_table->bins = (st_table_entry**)
-	Calloc((unsigned)num_bins, sizeof(st_table_entry*));
+    if (ULTRA_PACKED(old_table)) {
+	return new_table;
+    }
+
+    new_table->bins = st_alloc_bins(num_bins);
 
     if (new_table->bins == 0) {
-	free(new_table);
+	st_dealloc_table(new_table);
 	return 0;
     }
 
@@ -585,7 +784,7 @@ st_copy(st_table *old_table)
 	prev = 0;
 	tail = &new_table->head;
 	do {
-	    entry = alloc(st_table_entry);
+	    entry = st_alloc_entry();
 	    if (entry == 0) {
 		st_free_table(new_table);
 		return 0;
@@ -604,21 +803,22 @@ st_copy(st_table *old_table)
     return new_table;
 }
 
-#define REMOVE_ENTRY(table, ptr) do					\
-    {									\
-	if ((ptr)->fore == 0 && (ptr)->back == 0) {			\
-	    (table)->head = 0;						\
-	    (table)->tail = 0;						\
-	}								\
-	else {								\
-	    st_table_entry *fore = (ptr)->fore, *back = (ptr)->back;	\
-	    if (fore) fore->back = back;				\
-	    if (back) back->fore = fore;				\
-	    if ((ptr) == (table)->head) (table)->head = fore;		\
-	    if ((ptr) == (table)->tail) (table)->tail = back;		\
-	}								\
-	(table)->num_entries--;						\
-    } while (0)
+static inline void
+remove_entry(st_table *table, st_table_entry *ptr)
+{
+    if (ptr->fore == 0 && ptr->back == 0) {
+	table->head = 0;
+	table->tail = 0;
+    }
+    else {
+	st_table_entry *fore = ptr->fore, *back = ptr->back;
+	if (fore) fore->back = back;
+	if (back) back->fore = fore;
+	if (ptr == table->head) table->head = fore;
+	if (ptr == table->tail) table->tail = back;
+    }
+    table->num_entries--;
+}
 
 int
 st_delete(register st_table *table, register st_data_t *key, st_data_t *value)
@@ -627,30 +827,37 @@ st_delete(register st_table *table, register st_data_t *key, st_data_t *value)
     st_table_entry **prev;
     register st_table_entry *ptr;
 
+    hash_val = do_hash(*key, table);
+
     if (table->entries_packed) {
-        st_index_t i;
-        for (i = 0; i < table->num_entries; i++) {
-            if ((st_data_t)table->bins[i*2] == *key) {
-                if (value != 0) *value = (st_data_t)table->bins[i*2+1];
-                table->num_entries--;
-                memmove(&table->bins[i*2], &table->bins[(i+1)*2],
-                        sizeof(struct st_table_entry*) * 2*(table->num_entries-i));
-                return 1;
-            }
-        }
+	if (ULTRA_PACKED(table)) {
+	    if (check_ultra_packed(table, hash_val, *key)) {
+		if (value != 0) *value = UPVAL(table);
+		*key = UPKEY(table);
+		table->num_entries = 0;
+		return 1;
+	    }
+	}
+	else {
+	    st_index_t i = find_packed_index(table, hash_val, *key);
+	    if (i < table->num_entries) {
+		if (value != 0) *value = PVAL(table, i);
+		*key = PKEY(table, i);
+		remove_packed_entry(table, i);
+		return 1;
+	    }
+	}
         if (value != 0) *value = 0;
         return 0;
     }
 
-    hash_val = do_hash_bin(*key, table);
-
-    for (prev = &table->bins[hash_val]; (ptr = *prev) != 0; prev = &ptr->next) {
+    for (prev = &table->bins[hash_val % table->num_bins]; (ptr = *prev) != 0; prev = &ptr->next) {
 	if (EQUAL(table, *key, ptr->key)) {
 	    *prev = ptr->next;
-	    REMOVE_ENTRY(table, ptr);
+	    remove_entry(table, ptr);
 	    if (value != 0) *value = ptr->record;
 	    *key = ptr->key;
-	    free(ptr);
+	    st_free_entry(ptr);
 	    return 1;
 	}
     }
@@ -665,12 +872,25 @@ st_delete_safe(register st_table *table, register st_data_t *key, st_data_t *val
     st_index_t hash_val;
     register st_table_entry *ptr;
 
+    hash_val = do_hash(*key, table);
+
     if (table->entries_packed) {
-	st_index_t i;
-	for (i = 0; i < table->num_entries; i++) {
-	    if ((st_data_t)table->bins[i*2] == *key) {
-		if (value != 0) *value = (st_data_t)table->bins[i*2+1];
-		table->bins[i*2] = (void *)never;
+	if (ULTRA_PACKED(table)) {
+	    if (check_ultra_packed(table, hash_val, *key)) {
+		if (value != 0) *value = UPVAL(table);
+		*key = UPKEY(table);
+		UPKEY_SET(table, never);
+		UPHASH_SET(table, 0);
+		return 1;
+	    }
+	}
+	else {
+	    st_index_t i = find_packed_index(table, hash_val, *key);
+	    if (i < table->num_entries) {
+		if (value != 0) *value = PVAL(table, i);
+		*key = PKEY(table, i);
+		PKEY_SET(table, i, never);
+		PHASH_SET(table, i,  0);
 		return 1;
 	    }
 	}
@@ -678,12 +898,11 @@ st_delete_safe(register st_table *table, register st_data_t *key, st_data_t *val
 	return 0;
     }
 
-    hash_val = do_hash_bin(*key, table);
-    ptr = table->bins[hash_val];
+    ptr = table->bins[hash_val % table->num_bins];
 
     for (; ptr != 0; ptr = ptr->next) {
 	if ((ptr->key != never) && EQUAL(table, ptr->key, *key)) {
-	    REMOVE_ENTRY(table, ptr);
+	    remove_entry(table, ptr);
 	    *key = ptr->key;
 	    if (value != 0) *value = ptr->record;
 	    ptr->key = ptr->record = never;
@@ -702,17 +921,25 @@ st_cleanup_safe(st_table *table, st_data_t never)
     st_index_t i;
 
     if (table->entries_packed) {
-	st_index_t i = 0, j = 0;
-	while ((st_data_t)table->bins[i*2] != never) {
-	    if (i++ == table->num_entries) return;
+	if (ULTRA_PACKED(table)) {
+	    if (UPKEY(table) == never) {
+		table->num_entries = 0;
+	    }
 	}
-	for (j = i; ++i < table->num_entries;) {
-	    if ((st_data_t)table->bins[i*2] == never) continue;
-	    table->bins[j*2] = table->bins[i*2];
-	    table->bins[j*2+1] = table->bins[i*2+1];
-	    j++;
+	else {
+	    st_index_t i = 0, j = 0;
+	    while (PKEY(table, i) != never) {
+		if (i++ == table->num_entries) return;
+	    }
+	    for (j = i; ++i < table->num_entries;) {
+		if (PKEY(table, i) == never) continue;
+		PKEY_SET(table, j,  PKEY(table, i));
+		PVAL_SET(table, j,  PVAL(table, i));
+		PHASH_SET(table, j,  PHASH(table, i));
+		j++;
+	    }
+	    table->num_entries = j;
 	}
-	table->num_entries = j;
 	return;
     }
 
@@ -722,7 +949,7 @@ st_cleanup_safe(st_table *table, st_data_t never)
 	    if (ptr->key == never) {
 		tmp = ptr;
 		*last = ptr = ptr->next;
-		free(tmp);
+		st_free_entry(tmp);
 	    }
 	    else {
 		ptr = *(last = &ptr->next);
@@ -736,23 +963,51 @@ st_foreach(st_table *table, int (*func)(ANYARGS), st_data_t arg)
 {
     st_table_entry *ptr, **last, *tmp;
     enum st_retval retval;
-    st_index_t i;
+    st_index_t i = 0;
 
     if (table->entries_packed) {
-        for (i = 0; i < table->num_entries; i++) {
-            st_index_t j;
-            st_data_t key, val;
-            key = (st_data_t)table->bins[i*2];
-            val = (st_data_t)table->bins[i*2+1];
+	st_index_t hash;
+	st_data_t key, val;
+	if (ULTRA_PACKED(table) && table->num_entries) {
+	    key = UPKEY(table);
+	    val = UPVAL(table);
+	    hash = UPHASH(table);
+	    retval = (*func)(key, val, arg);
+	    if (!ULTRA_PACKED(table)) goto packed;
+	    switch(retval) {
+	      case ST_CHECK:
+		if (UPKEY(table) == Qundef && UPHASH(table) == 0)
+		    break;
+		if (table->num_entries && UPHASH(table) == hash &&
+			EQUAL(table, key, UPKEY(table)))
+		    break;
+		retval = (*func)(0, 0, arg, 1);
+		return 1;
+	      case ST_CONTINUE:
+		break;
+	      case ST_STOP:
+		return 0;
+	      case ST_DELETE:
+		table->num_entries = 0;
+	    }
+	    return 0;
+	}
+        for (; i < table->num_entries; i++) {
+            key = PKEY(table, i);
+            val = PVAL(table, i);
+            hash = PHASH(table,i);
             retval = (*func)(key, val, arg);
+	packed:
 	    if (!table->entries_packed) goto unpacked;
             switch (retval) {
 	      case ST_CHECK:	/* check if hash is modified during iteration */
-                for (j = 0; j < table->num_entries; j++) {
-                    if ((st_data_t)table->bins[j*2] == key)
-                        break;
-                }
-                if (j == table->num_entries) {
+		/* work around uncomforming befaviour of hash */
+		if (PKEY(table, i) == Qundef && PHASH(table, i) == 0)
+		    break;
+		else if (i < table->num_entries &&
+			PHASH(table, i) == hash && EQUAL(table, key, PKEY(table, i)))
+		    break;
+                if (find_packed_index(table, hash, key) == table->num_entries) {
                     /* call func with error notice */
                     retval = (*func)(0, 0, arg, 1);
                     return 1;
@@ -763,9 +1018,7 @@ st_foreach(st_table *table, int (*func)(ANYARGS), st_data_t arg)
 	      case ST_STOP:
 		return 0;
 	      case ST_DELETE:
-                table->num_entries--;
-                memmove(&table->bins[i*2], &table->bins[(i+1)*2],
-                        sizeof(struct st_table_entry*) * 2*(table->num_entries-i));
+		remove_packed_entry(table, i);
                 i--;
                 break;
             }
@@ -773,9 +1026,10 @@ st_foreach(st_table *table, int (*func)(ANYARGS), st_data_t arg)
         return 0;
       unpacked:
 	ptr = table->head;
-	while (i-- > 0) {
-	    if (!(ptr = ptr->fore)) return 0;
-	}
+	for(;ptr && i; i--, ptr = ptr->fore) {}
+	if (ptr == 0) return retval == ST_CHECK ? 1 : 0;
+	i = ptr->hash % table->num_bins;
+	goto check_retval;
     }
     else {
 	ptr = table->head;
@@ -785,6 +1039,7 @@ st_foreach(st_table *table, int (*func)(ANYARGS), st_data_t arg)
 	do {
 	    i = ptr->hash % table->num_bins;
 	    retval = (*func)(ptr->key, ptr->record, arg);
+check_retval:
 	    switch (retval) {
 	      case ST_CHECK:	/* check if hash is modified during iteration */
 		for (tmp = table->bins[i]; tmp != ptr; tmp = tmp->next) {
@@ -806,8 +1061,8 @@ st_foreach(st_table *table, int (*func)(ANYARGS), st_data_t arg)
 		    if (ptr == tmp) {
 			tmp = ptr->fore;
 			*last = ptr->next;
-			REMOVE_ENTRY(table, ptr);
-			free(ptr);
+			remove_entry(table, ptr);
+			st_free_entry(ptr);
 			if (ptr == tmp) return 0;
 			ptr = tmp;
 			break;
@@ -829,18 +1084,21 @@ st_reverse_foreach(st_table *table, int (*func)(ANYARGS), st_data_t arg)
 
     if (table->entries_packed) {
         for (i = table->num_entries-1; 0 <= i; i--) {
-            int j;
+            int hash;
             st_data_t key, val;
-            key = (st_data_t)table->bins[i*2];
-            val = (st_data_t)table->bins[i*2+1];
+            key = PKEY(table, i);
+            val = PVAL(table, i);
+            hash = PHASH(table, i);
             retval = (*func)(key, val, arg);
             switch (retval) {
 	      case ST_CHECK:	/* check if hash is modified during iteration */
-                for (j = 0; j < table->num_entries; j++) {
-                    if ((st_data_t)table->bins[j*2] == key)
-                        break;
-                }
-                if (j == table->num_entries) {
+		/* work around uncomforming befaviour of hash */
+		if (PKEY(table, i) == Qundef && PHASH(table, i) == 0)
+		    break;
+		else if (i < table->num_entries &&
+			PHASH(table, i) == hash && EQUAL(table, key, PKEY(table, i)))
+		    break;
+                if (find_packed_index(table, hash, key) == table->num_entries) {
                     /* call func with error notice */
                     retval = (*func)(0, 0, arg, 1);
                     return 1;
@@ -851,9 +1109,7 @@ st_reverse_foreach(st_table *table, int (*func)(ANYARGS), st_data_t arg)
 	      case ST_STOP:
 		return 0;
 	      case ST_DELETE:
-                table->num_entries--;
-                memmove(&table->bins[i*2], &table->bins[(i+1)*2],
-                        sizeof(struct st_table_entry*) * 2*(table->num_entries-i));
+		remove_packed_entry(table, i);
                 break;
             }
         }
@@ -886,8 +1142,8 @@ st_reverse_foreach(st_table *table, int (*func)(ANYARGS), st_data_t arg)
 		    if (ptr == tmp) {
 			tmp = ptr->back;
 			*last = ptr->next;
-			REMOVE_ENTRY(table, ptr);
-			free(ptr);
+			remove_entry(table, ptr);
+			st_free_entry(ptr);
 			ptr = tmp;
 			break;
 		    }
diff --git a/vm.c b/vm.c
index 2d7e15c..d1fe744 100644
--- a/vm.c
+++ b/vm.c
@@ -1575,6 +1575,7 @@ rb_vm_mark(void *ptr)
 	RUBY_MARK_UNLESS_NULL(vm->thgroup_default);
 	RUBY_MARK_UNLESS_NULL(vm->mark_object_ary);
 	RUBY_MARK_UNLESS_NULL(vm->load_path);
+	RUBY_MARK_UNLESS_NULL(vm->load_path_expanded_cache);
 	RUBY_MARK_UNLESS_NULL(vm->loaded_features);
 	RUBY_MARK_UNLESS_NULL(vm->top_self);
 	RUBY_MARK_UNLESS_NULL(vm->coverages);
diff --git a/vm_core.h b/vm_core.h
index 0dda1c4..f4dc58a 100644
--- a/vm_core.h
+++ b/vm_core.h
@@ -298,6 +298,7 @@ typedef struct rb_vm_struct {
     /* load */
     VALUE top_self;
     VALUE load_path;
+    VALUE load_path_expanded_cache;
     VALUE loaded_features;
     struct st_table *loading_table;
 
src/rvm/patches/ruby/1.9.3/p0/cflags.patch000066400000002231147511530530014022 0ustar00--- a/configure.in
+++ b/configure.in
@@ -267,11 +267,9 @@
     cflagspat="$cflagspat;s|"`eval echo '"'"${debugflags}"'"' | sed 's/[[][|.*]]/\\&/g;s/^ */ /;s/ *$/ /'`'| |g'
 test -z "warnflags" ||
     cflagspat="$cflagspat;s|"`eval echo '"'"${warnflags}"'"' | sed 's/[[][|.*]]/\\&/g;s/^ */ /;s/ *$/ /'`'| |g'
-if test -z "${CFLAGS+set}"; then
-    cflags=`echo " $cflags " | sed "$cflagspat;s/^ *//;s/ *$//"`
-    orig_cflags="$cflags"
-    cflags="$cflags "'${optflags} ${debugflags} ${warnflags}'
-fi
+cflags=`echo " $cflags " | sed "$cflagspat;s/^ *//;s/ *$//"`
+orig_cflags="$cflags"
+cflags="$cflags "'${optflags} ${debugflags} ${warnflags}'
 if test -z "${CXXFLAGS+set}"; then
     cxxflags=`echo " $cxxflags " | sed "$cflagspat;s/^ *//;s/ *$//"`
     orig_cxxflags="$cxxflags"
@@ -511,7 +509,8 @@
     ])
 fi

-test -z "${ac_env_CFLAGS_set}" -a -n "${cflags+set}" && eval CFLAGS="\"$cflags $ARCH_FLAG\""
+test -z "${ac_env_CFLAGS_set}" && CFLAGS="$ARCH_FLAG"
+test -n "${cflags:+set}" && eval CFLAGS="\"$cflags\${CFLAGS:+ $CFLAGS}\""
 test -z "${ac_env_CXXFLAGS_set}" -a -n "${cxxflags+set}" && eval CXXFLAGS="\"$cxxflags $ARCH_FLAG\""

 dnl check for large file stuff
src/rvm/patches/ruby/1.9.3/p0/gcdata.patch000066400000007545147511530530014023 0ustar00--- a/gc.c	(revision 33566)
+++ b/gc.c	(working copy)
@@ -309,16 +309,12 @@
     struct gc_list *next;
 };
 
-#define CALC_EXACT_MALLOC_SIZE 0
-
 typedef struct rb_objspace {
     struct {
 	size_t limit;
 	size_t increase;
-#if CALC_EXACT_MALLOC_SIZE
 	size_t allocated_size;
 	size_t allocations;
-#endif
     } malloc_params;
     struct {
 	size_t increment;
@@ -715,10 +711,6 @@
     }
     if (size == 0) size = 1;
 
-#if CALC_EXACT_MALLOC_SIZE
-    size += sizeof(size_t);
-#endif
-
     if ((ruby_gc_stress && !ruby_disable_gc_stress) ||
 	(malloc_increase+size) > malloc_limit) {
 	garbage_collect_with_gvl(objspace);
@@ -732,12 +724,8 @@
 {
     malloc_increase += size;
 
-#if CALC_EXACT_MALLOC_SIZE
     objspace->malloc_params.allocated_size += size;
     objspace->malloc_params.allocations++;
-    ((size_t *)mem)[0] = size;
-    mem = (size_t *)mem + 1;
-#endif
 
     return mem;
 }
@@ -776,11 +764,7 @@
     if (ruby_gc_stress && !ruby_disable_gc_stress)
 	garbage_collect_with_gvl(objspace);
 
-#if CALC_EXACT_MALLOC_SIZE
-    size += sizeof(size_t);
     objspace->malloc_params.allocated_size -= size;
-    ptr = (size_t *)ptr - 1;
-#endif
 
     mem = realloc(ptr, size);
     if (!mem) {
@@ -793,11 +777,7 @@
     }
     malloc_increase += size;
 
-#if CALC_EXACT_MALLOC_SIZE
     objspace->malloc_params.allocated_size += size;
-    ((size_t *)mem)[0] = size;
-    mem = (size_t *)mem + 1;
-#endif
 
     return mem;
 }
@@ -805,14 +785,6 @@
 static void
 vm_xfree(rb_objspace_t *objspace, void *ptr)
 {
-#if CALC_EXACT_MALLOC_SIZE
-    size_t size;
-    ptr = ((size_t *)ptr) - 1;
-    size = ((size_t*)ptr)[0];
-    objspace->malloc_params.allocated_size -= size;
-    objspace->malloc_params.allocations--;
-#endif
-
     free(ptr);
 }
 
@@ -3384,7 +3356,6 @@
 }
 
 
-#if CALC_EXACT_MALLOC_SIZE
 /*
  *  call-seq:
  *     GC.malloc_allocated_size -> Integer
@@ -3394,8 +3365,8 @@
  *  It returns the allocated size by malloc().
  */
 
-static VALUE
-gc_malloc_allocated_size(VALUE self)
+VALUE
+rb_gc_malloc_allocated_size(VALUE self)
 {
     return UINT2NUM((&rb_objspace)->malloc_params.allocated_size);
 }
@@ -3409,12 +3380,11 @@
  *  It returns the number of allocated memory object by malloc().
  */
 
-static VALUE
-gc_malloc_allocations(VALUE self)
+VALUE
+rb_gc_malloc_allocations(VALUE self)
 {
     return UINT2NUM((&rb_objspace)->malloc_params.allocations);
 }
-#endif
 
 static VALUE
 gc_profile_record_get(void)
@@ -3599,6 +3569,8 @@
     rb_define_singleton_method(rb_mGC, "start", rb_gc_start, 0);
     rb_define_singleton_method(rb_mGC, "enable", rb_gc_enable, 0);
     rb_define_singleton_method(rb_mGC, "disable", rb_gc_disable, 0);
+    rb_define_singleton_method(rb_mGC, "malloc_allocated_size", rb_gc_malloc_allocated_size, 0);
+    rb_define_singleton_method(rb_mGC, "malloc_allocations", rb_gc_malloc_allocations, 0);
     rb_define_singleton_method(rb_mGC, "stress", gc_stress_get, 0);
     rb_define_singleton_method(rb_mGC, "stress=", gc_stress_set, 1);
     rb_define_singleton_method(rb_mGC, "count", gc_count, 0);
@@ -3613,6 +3585,7 @@
     rb_define_singleton_method(rb_mProfiler, "result", gc_profile_result, 0);
     rb_define_singleton_method(rb_mProfiler, "report", gc_profile_report, -1);
     rb_define_singleton_method(rb_mProfiler, "total_time", gc_profile_total_time, 0);
+    rb_define_singleton_method(rb_mProfiler, "data", gc_profile_record_get, 0);
 
     rb_mObSpace = rb_define_module("ObjectSpace");
     rb_define_module_function(rb_mObSpace, "each_object", os_each_obj, -1);
@@ -3632,9 +3605,4 @@
     rb_define_method(rb_mKernel, "object_id", rb_obj_id, 0);
 
     rb_define_module_function(rb_mObSpace, "count_objects", count_objects, -1);
-
-#if CALC_EXACT_MALLOC_SIZE
-    rb_define_singleton_method(rb_mGC, "malloc_allocated_size", gc_malloc_allocated_size, 0);
-    rb_define_singleton_method(rb_mGC, "malloc_allocations", gc_malloc_allocations, 0);
-#endif
 }
src/rvm/patches/ruby/1.9.3/p0/debug.diff000066400000000734147511530530013470 0ustar00diff --git a/configure.in b/configure.in
index 5bc2e4e..52a5d19 100644
--- a/configure.in
+++ b/configure.in
@@ -493,7 +493,6 @@ if test "$GCC" = ""; then
     AS_CASE(["$target_os"],[aix*],[warnflags="-qinfo=por"])
 fi
 if test "$GCC" = yes; then
-    RUBY_TRY_CFLAGS(-fvisibility=hidden, [RUBY_APPEND_OPTION(XCFLAGS, -fvisibility=hidden)])
     AC_SUBST(WERRORFLAG, "-Werror")
     if test "$visibility_option" = yes; then
 	RUBY_APPEND_OPTION(XCFLAGS, -fvisibility=hidden)
src/rvm/patches/ruby/1.9.3/preview1/gcdata.patch000066400000007676147511530530015253 0ustar00--- a/gc.c	(revision 32826)
+++ b/gc.c	(working copy)
@@ -309,16 +309,12 @@
     struct gc_list *next;
 };
 
-#define CALC_EXACT_MALLOC_SIZE 0
-
 typedef struct rb_objspace {
     struct {
 	size_t limit;
 	size_t increase;
-#if CALC_EXACT_MALLOC_SIZE
 	size_t allocated_size;
 	size_t allocations;
-#endif
     } malloc_params;
     struct {
 	size_t increment;
@@ -715,10 +711,6 @@
     }
     if (size == 0) size = 1;
 
-#if CALC_EXACT_MALLOC_SIZE
-    size += sizeof(size_t);
-#endif
-
     if ((ruby_gc_stress && !ruby_disable_gc_stress) ||
 	(malloc_increase+size) > malloc_limit) {
 	garbage_collect_with_gvl(objspace);
@@ -731,13 +723,9 @@
 vm_malloc_fixup(rb_objspace_t *objspace, void *mem, size_t size)
 {
     malloc_increase += size;
-
-#if CALC_EXACT_MALLOC_SIZE
+    
     objspace->malloc_params.allocated_size += size;
     objspace->malloc_params.allocations++;
-    ((size_t *)mem)[0] = size;
-    mem = (size_t *)mem + 1;
-#endif
 
     return mem;
 }
@@ -776,11 +764,7 @@
     if (ruby_gc_stress && !ruby_disable_gc_stress)
 	garbage_collect_with_gvl(objspace);
 
-#if CALC_EXACT_MALLOC_SIZE
-    size += sizeof(size_t);
     objspace->malloc_params.allocated_size -= size;
-    ptr = (size_t *)ptr - 1;
-#endif
 
     mem = realloc(ptr, size);
     if (!mem) {
@@ -792,12 +776,8 @@
         }
     }
     malloc_increase += size;
-
-#if CALC_EXACT_MALLOC_SIZE
+    
     objspace->malloc_params.allocated_size += size;
-    ((size_t *)mem)[0] = size;
-    mem = (size_t *)mem + 1;
-#endif
 
     return mem;
 }
@@ -805,14 +785,6 @@
 static void
 vm_xfree(rb_objspace_t *objspace, void *ptr)
 {
-#if CALC_EXACT_MALLOC_SIZE
-    size_t size;
-    ptr = ((size_t *)ptr) - 1;
-    size = ((size_t*)ptr)[0];
-    objspace->malloc_params.allocated_size -= size;
-    objspace->malloc_params.allocations--;
-#endif
-
     free(ptr);
 }
 
@@ -3368,7 +3340,6 @@
 }
 
 
-#if CALC_EXACT_MALLOC_SIZE
 /*
  *  call-seq:
  *     GC.malloc_allocated_size -> Integer
@@ -3378,8 +3349,8 @@
  *  It returns the allocated size by malloc().
  */
 
-static VALUE
-gc_malloc_allocated_size(VALUE self)
+VALUE
+rb_gc_malloc_allocated_size(VALUE self)
 {
     return UINT2NUM((&rb_objspace)->malloc_params.allocated_size);
 }
@@ -3393,12 +3364,11 @@
  *  It returns the number of allocated memory object by malloc().
  */
 
-static VALUE
-gc_malloc_allocations(VALUE self)
+VALUE
+rb_gc_malloc_allocations(VALUE self)
 {
     return UINT2NUM((&rb_objspace)->malloc_params.allocations);
 }
-#endif
 
 static VALUE
 gc_profile_record_get(void)
@@ -3583,6 +3553,8 @@
     rb_define_singleton_method(rb_mGC, "start", rb_gc_start, 0);
     rb_define_singleton_method(rb_mGC, "enable", rb_gc_enable, 0);
     rb_define_singleton_method(rb_mGC, "disable", rb_gc_disable, 0);
+    rb_define_singleton_method(rb_mGC, "malloc_allocated_size", rb_gc_malloc_allocated_size, 0);
+    rb_define_singleton_method(rb_mGC, "malloc_allocations", rb_gc_malloc_allocations, 0);
     rb_define_singleton_method(rb_mGC, "stress", gc_stress_get, 0);
     rb_define_singleton_method(rb_mGC, "stress=", gc_stress_set, 1);
     rb_define_singleton_method(rb_mGC, "count", gc_count, 0);
@@ -3597,6 +3569,7 @@
     rb_define_singleton_method(rb_mProfiler, "result", gc_profile_result, 0);
     rb_define_singleton_method(rb_mProfiler, "report", gc_profile_report, -1);
     rb_define_singleton_method(rb_mProfiler, "total_time", gc_profile_total_time, 0);
+    rb_define_singleton_method(rb_mProfiler, "data", gc_profile_record_get, 0);
 
     rb_mObSpace = rb_define_module("ObjectSpace");
     rb_define_module_function(rb_mObSpace, "each_object", os_each_obj, -1);
@@ -3616,9 +3589,4 @@
     rb_define_method(rb_mKernel, "object_id", rb_obj_id, 0);
 
     rb_define_module_function(rb_mObSpace, "count_objects", count_objects, -1);
-
-#if CALC_EXACT_MALLOC_SIZE
-    rb_define_singleton_method(rb_mGC, "malloc_allocated_size", gc_malloc_allocated_size, 0);
-    rb_define_singleton_method(rb_mGC, "malloc_allocations", gc_malloc_allocations, 0);
-#endif
 }
src/rvm/patches/ruby/1.9.3/update-autoconf.patch000066400000160120147511530530015344 0ustar00diff -Naur ruby-1.9.3-p551/tool/config.guess ruby-1.9.3-p551+ppc64le/tool/config.guess
--- ruby-1.9.3-p551/tool/config.guess	2010-09-26 01:25:34.000000000 +0000
+++ ruby-1.9.3-p551+ppc64le/tool/config.guess	2016-04-15 05:09:52.078012270 +0000
@@ -1,14 +1,12 @@
 #! /bin/sh
 # Attempt to guess a canonical system name.
-#   Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999,
-#   2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009
-#   Free Software Foundation, Inc.
+#   Copyright 1992-2016 Free Software Foundation, Inc.
 
-timestamp='2009-11-20'
+timestamp='2016-04-02'
 
 # This file is free software; you can redistribute it and/or modify it
 # under the terms of the GNU General Public License as published by
-# the Free Software Foundation; either version 2 of the License, or
+# the Free Software Foundation; either version 3 of the License, or
 # (at your option) any later version.
 #
 # This program is distributed in the hope that it will be useful, but
@@ -17,26 +15,22 @@
 # General Public License for more details.
 #
 # You should have received a copy of the GNU General Public License
-# along with this program; if not, write to the Free Software
-# Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA
-# 02110-1301, USA.
+# along with this program; if not, see <http://www.gnu.org/licenses/>.
 #
 # As a special exception to the GNU General Public License, if you
 # distribute this file as part of a program that contains a
 # configuration script generated by Autoconf, you may include it under
-# the same distribution terms that you use for the rest of that program.
-
-
-# Originally written by Per Bothner.  Please send patches (context
-# diff format) to <config-patches@gnu.org> and include a ChangeLog
-# entry.
+# the same distribution terms that you use for the rest of that
+# program.  This Exception is an additional permission under section 7
+# of the GNU General Public License, version 3 ("GPLv3").
 #
-# This script attempts to guess a canonical system name similar to
-# config.sub.  If it succeeds, it prints the system name on stdout, and
-# exits with 0.  Otherwise, it exits with 1.
+# Originally written by Per Bothner; maintained since 2000 by Ben Elliston.
 #
 # You can get the latest version of this script from:
-# http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.guess;hb=HEAD
+# http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.guess
+#
+# Please send patches to <config-patches@gnu.org>.
+
 
 me=`echo "$0" | sed -e 's,.*/,,'`
 
@@ -56,8 +50,7 @@
 GNU config.guess ($timestamp)
 
 Originally written by Per Bothner.
-Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001,
-2002, 2003, 2004, 2005, 2006, 2007, 2008 Free Software Foundation, Inc.
+Copyright 1992-2016 Free Software Foundation, Inc.
 
 This is free software; see the source for copying conditions.  There is NO
 warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE."
@@ -139,12 +132,33 @@
 UNAME_SYSTEM=`(uname -s) 2>/dev/null`  || UNAME_SYSTEM=unknown
 UNAME_VERSION=`(uname -v) 2>/dev/null` || UNAME_VERSION=unknown
 
+case "${UNAME_SYSTEM}" in
+Linux|GNU|GNU/*)
+	# If the system lacks a compiler, then just pick glibc.
+	# We could probably try harder.
+	LIBC=gnu
+
+	eval $set_cc_for_build
+	cat <<-EOF > $dummy.c
+	#include <features.h>
+	#if defined(__UCLIBC__)
+	LIBC=uclibc
+	#elif defined(__dietlibc__)
+	LIBC=dietlibc
+	#else
+	LIBC=gnu
+	#endif
+	EOF
+	eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep '^LIBC' | sed 's, ,,g'`
+	;;
+esac
+
 # Note: order is significant - the case branches are not exclusive.
 
 case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in
     *:NetBSD:*:*)
 	# NetBSD (nbsd) targets should (where applicable) match one or
-	# more of the tupples: *-*-netbsdelf*, *-*-netbsdaout*,
+	# more of the tuples: *-*-netbsdelf*, *-*-netbsdaout*,
 	# *-*-netbsdecoff* and *-*-netbsd*.  For targets that recently
 	# switched to ELF, *-*-netbsd* would select the old
 	# object file format.  This provides both forward
@@ -154,20 +168,27 @@
 	# Note: NetBSD doesn't particularly care about the vendor
 	# portion of the name.  We always set it to "unknown".
 	sysctl="sysctl -n hw.machine_arch"
-	UNAME_MACHINE_ARCH=`(/sbin/$sysctl 2>/dev/null || \
-	    /usr/sbin/$sysctl 2>/dev/null || echo unknown)`
+	UNAME_MACHINE_ARCH=`(uname -p 2>/dev/null || \
+	    /sbin/$sysctl 2>/dev/null || \
+	    /usr/sbin/$sysctl 2>/dev/null || \
+	    echo unknown)`
 	case "${UNAME_MACHINE_ARCH}" in
 	    armeb) machine=armeb-unknown ;;
 	    arm*) machine=arm-unknown ;;
 	    sh3el) machine=shl-unknown ;;
 	    sh3eb) machine=sh-unknown ;;
 	    sh5el) machine=sh5le-unknown ;;
+	    earmv*)
+		arch=`echo ${UNAME_MACHINE_ARCH} | sed -e 's,^e\(armv[0-9]\).*$,\1,'`
+		endian=`echo ${UNAME_MACHINE_ARCH} | sed -ne 's,^.*\(eb\)$,\1,p'`
+		machine=${arch}${endian}-unknown
+		;;
 	    *) machine=${UNAME_MACHINE_ARCH}-unknown ;;
 	esac
 	# The Operating System including object format, if it has switched
 	# to ELF recently, or will in the future.
 	case "${UNAME_MACHINE_ARCH}" in
-	    arm*|i386|m68k|ns32k|sh3*|sparc|vax)
+	    arm*|earm*|i386|m68k|ns32k|sh3*|sparc|vax)
 		eval $set_cc_for_build
 		if echo __ELF__ | $CC_FOR_BUILD -E - 2>/dev/null \
 			| grep -q __ELF__
@@ -180,7 +201,14 @@
 		fi
 		;;
 	    *)
-	        os=netbsd
+		os=netbsd
+		;;
+	esac
+	# Determine ABI tags.
+	case "${UNAME_MACHINE_ARCH}" in
+	    earm*)
+		expr='s/^earmv[0-9]/-eabi/;s/eb$//'
+		abi=`echo ${UNAME_MACHINE_ARCH} | sed -e "$expr"`
 		;;
 	esac
 	# The OS release
@@ -193,18 +221,26 @@
 		release='-gnu'
 		;;
 	    *)
-		release=`echo ${UNAME_RELEASE}|sed -e 's/[-_].*/\./'`
+		release=`echo ${UNAME_RELEASE} | sed -e 's/[-_].*//' | cut -d. -f1,2`
 		;;
 	esac
 	# Since CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM:
 	# contains redundant information, the shorter form:
 	# CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM is used.
-	echo "${machine}-${os}${release}"
+	echo "${machine}-${os}${release}${abi}"
+	exit ;;
+    *:Bitrig:*:*)
+	UNAME_MACHINE_ARCH=`arch | sed 's/Bitrig.//'`
+	echo ${UNAME_MACHINE_ARCH}-unknown-bitrig${UNAME_RELEASE}
 	exit ;;
     *:OpenBSD:*:*)
 	UNAME_MACHINE_ARCH=`arch | sed 's/OpenBSD.//'`
 	echo ${UNAME_MACHINE_ARCH}-unknown-openbsd${UNAME_RELEASE}
 	exit ;;
+    *:LibertyBSD:*:*)
+	UNAME_MACHINE_ARCH=`arch | sed 's/^.*BSD\.//'`
+	echo ${UNAME_MACHINE_ARCH}-unknown-libertybsd${UNAME_RELEASE}
+	exit ;;
     *:ekkoBSD:*:*)
 	echo ${UNAME_MACHINE}-unknown-ekkobsd${UNAME_RELEASE}
 	exit ;;
@@ -217,13 +253,16 @@
     *:MirBSD:*:*)
 	echo ${UNAME_MACHINE}-unknown-mirbsd${UNAME_RELEASE}
 	exit ;;
+    *:Sortix:*:*)
+	echo ${UNAME_MACHINE}-unknown-sortix
+	exit ;;
     alpha:OSF1:*:*)
 	case $UNAME_RELEASE in
 	*4.0)
 		UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $3}'`
 		;;
 	*5.*)
-	        UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $4}'`
+		UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $4}'`
 		;;
 	esac
 	# According to Compaq, /usr/sbin/psrinfo has been available on
@@ -233,43 +272,46 @@
 	ALPHA_CPU_TYPE=`/usr/sbin/psrinfo -v | sed -n -e 's/^  The alpha \(.*\) processor.*$/\1/p' | head -n 1`
 	case "$ALPHA_CPU_TYPE" in
 	    "EV4 (21064)")
-		UNAME_MACHINE="alpha" ;;
+		UNAME_MACHINE=alpha ;;
 	    "EV4.5 (21064)")
-		UNAME_MACHINE="alpha" ;;
+		UNAME_MACHINE=alpha ;;
 	    "LCA4 (21066/21068)")
-		UNAME_MACHINE="alpha" ;;
+		UNAME_MACHINE=alpha ;;
 	    "EV5 (21164)")
-		UNAME_MACHINE="alphaev5" ;;
+		UNAME_MACHINE=alphaev5 ;;
 	    "EV5.6 (21164A)")
-		UNAME_MACHINE="alphaev56" ;;
+		UNAME_MACHINE=alphaev56 ;;
 	    "EV5.6 (21164PC)")
-		UNAME_MACHINE="alphapca56" ;;
+		UNAME_MACHINE=alphapca56 ;;
 	    "EV5.7 (21164PC)")
-		UNAME_MACHINE="alphapca57" ;;
+		UNAME_MACHINE=alphapca57 ;;
 	    "EV6 (21264)")
-		UNAME_MACHINE="alphaev6" ;;
+		UNAME_MACHINE=alphaev6 ;;
 	    "EV6.7 (21264A)")
-		UNAME_MACHINE="alphaev67" ;;
+		UNAME_MACHINE=alphaev67 ;;
 	    "EV6.8CB (21264C)")
-		UNAME_MACHINE="alphaev68" ;;
+		UNAME_MACHINE=alphaev68 ;;
 	    "EV6.8AL (21264B)")
-		UNAME_MACHINE="alphaev68" ;;
+		UNAME_MACHINE=alphaev68 ;;
 	    "EV6.8CX (21264D)")
-		UNAME_MACHINE="alphaev68" ;;
+		UNAME_MACHINE=alphaev68 ;;
 	    "EV6.9A (21264/EV69A)")
-		UNAME_MACHINE="alphaev69" ;;
+		UNAME_MACHINE=alphaev69 ;;
 	    "EV7 (21364)")
-		UNAME_MACHINE="alphaev7" ;;
+		UNAME_MACHINE=alphaev7 ;;
 	    "EV7.9 (21364A)")
-		UNAME_MACHINE="alphaev79" ;;
+		UNAME_MACHINE=alphaev79 ;;
 	esac
 	# A Pn.n version is a patched version.
 	# A Vn.n version is a released version.
 	# A Tn.n version is a released field test version.
 	# A Xn.n version is an unreleased experimental baselevel.
 	# 1.2 uses "1.2" for uname -r.
-	echo ${UNAME_MACHINE}-dec-osf`echo ${UNAME_RELEASE} | sed -e 's/^[PVTX]//' | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'`
-	exit ;;
+	echo ${UNAME_MACHINE}-dec-osf`echo ${UNAME_RELEASE} | sed -e 's/^[PVTX]//' | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz`
+	# Reset EXIT trap before exiting to avoid spurious non-zero exit code.
+	exitcode=$?
+	trap '' 0
+	exit $exitcode ;;
     Alpha\ *:Windows_NT*:*)
 	# How do we know it's Interix rather than the generic POSIX subsystem?
 	# Should we change UNAME_MACHINE based on the output of uname instead
@@ -295,12 +337,12 @@
 	echo s390-ibm-zvmoe
 	exit ;;
     *:OS400:*:*)
-        echo powerpc-ibm-os400
+	echo powerpc-ibm-os400
 	exit ;;
     arm:RISC*:1.[012]*:*|arm:riscix:1.[012]*:*)
 	echo arm-acorn-riscix${UNAME_RELEASE}
 	exit ;;
-    arm:riscos:*:*|arm:RISCOS:*:*)
+    arm*:riscos:*:*|arm*:RISCOS:*:*)
 	echo arm-unknown-riscos
 	exit ;;
     SR2?01:HI-UX/MPP:*:* | SR8000:HI-UX/MPP:*:*)
@@ -338,16 +380,16 @@
 	exit ;;
     i86pc:SunOS:5.*:* | i86xen:SunOS:5.*:*)
 	eval $set_cc_for_build
-	SUN_ARCH="i386"
+	SUN_ARCH=i386
 	# If there is a compiler, see if it is configured for 64-bit objects.
 	# Note that the Sun cc does not turn __LP64__ into 1 like gcc does.
 	# This test works for both compilers.
-	if [ "$CC_FOR_BUILD" != 'no_compiler_found' ]; then
+	if [ "$CC_FOR_BUILD" != no_compiler_found ]; then
 	    if (echo '#ifdef __amd64'; echo IS_64BIT_ARCH; echo '#endif') | \
-		(CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) | \
+		(CCOPTS="" $CC_FOR_BUILD -E - 2>/dev/null) | \
 		grep IS_64BIT_ARCH >/dev/null
 	    then
-		SUN_ARCH="x86_64"
+		SUN_ARCH=x86_64
 	    fi
 	fi
 	echo ${SUN_ARCH}-pc-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
@@ -372,7 +414,7 @@
 	exit ;;
     sun*:*:4.2BSD:*)
 	UNAME_RELEASE=`(sed 1q /etc/motd | awk '{print substr($5,1,3)}') 2>/dev/null`
-	test "x${UNAME_RELEASE}" = "x" && UNAME_RELEASE=3
+	test "x${UNAME_RELEASE}" = x && UNAME_RELEASE=3
 	case "`/bin/arch`" in
 	    sun3)
 		echo m68k-sun-sunos${UNAME_RELEASE}
@@ -394,23 +436,23 @@
     # MiNT.  But MiNT is downward compatible to TOS, so this should
     # be no problem.
     atarist[e]:*MiNT:*:* | atarist[e]:*mint:*:* | atarist[e]:*TOS:*:*)
-        echo m68k-atari-mint${UNAME_RELEASE}
+	echo m68k-atari-mint${UNAME_RELEASE}
 	exit ;;
     atari*:*MiNT:*:* | atari*:*mint:*:* | atarist[e]:*TOS:*:*)
 	echo m68k-atari-mint${UNAME_RELEASE}
-        exit ;;
+	exit ;;
     *falcon*:*MiNT:*:* | *falcon*:*mint:*:* | *falcon*:*TOS:*:*)
-        echo m68k-atari-mint${UNAME_RELEASE}
+	echo m68k-atari-mint${UNAME_RELEASE}
 	exit ;;
     milan*:*MiNT:*:* | milan*:*mint:*:* | *milan*:*TOS:*:*)
-        echo m68k-milan-mint${UNAME_RELEASE}
-        exit ;;
+	echo m68k-milan-mint${UNAME_RELEASE}
+	exit ;;
     hades*:*MiNT:*:* | hades*:*mint:*:* | *hades*:*TOS:*:*)
-        echo m68k-hades-mint${UNAME_RELEASE}
-        exit ;;
+	echo m68k-hades-mint${UNAME_RELEASE}
+	exit ;;
     *:*MiNT:*:* | *:*mint:*:* | *:*TOS:*:*)
-        echo m68k-unknown-mint${UNAME_RELEASE}
-        exit ;;
+	echo m68k-unknown-mint${UNAME_RELEASE}
+	exit ;;
     m68k:machten:*:*)
 	echo m68k-apple-machten${UNAME_RELEASE}
 	exit ;;
@@ -480,8 +522,8 @@
 	echo m88k-motorola-sysv3
 	exit ;;
     AViiON:dgux:*:*)
-        # DG/UX returns AViiON for all architectures
-        UNAME_PROCESSOR=`/usr/bin/uname -p`
+	# DG/UX returns AViiON for all architectures
+	UNAME_PROCESSOR=`/usr/bin/uname -p`
 	if [ $UNAME_PROCESSOR = mc88100 ] || [ $UNAME_PROCESSOR = mc88110 ]
 	then
 	    if [ ${TARGET_BINARY_INTERFACE}x = m88kdguxelfx ] || \
@@ -494,7 +536,7 @@
 	else
 	    echo i586-dg-dgux${UNAME_RELEASE}
 	fi
- 	exit ;;
+	exit ;;
     M88*:DolphinOS:*:*)	# DolphinOS (SVR3)
 	echo m88k-dolphin-sysv3
 	exit ;;
@@ -551,15 +593,16 @@
 		echo rs6000-ibm-aix3.2
 	fi
 	exit ;;
-    *:AIX:*:[456])
+    *:AIX:*:[4567])
 	IBM_CPU_ID=`/usr/sbin/lsdev -C -c processor -S available | sed 1q | awk '{ print $1 }'`
 	if /usr/sbin/lsattr -El ${IBM_CPU_ID} | grep ' POWER' >/dev/null 2>&1; then
 		IBM_ARCH=rs6000
 	else
 		IBM_ARCH=powerpc
 	fi
-	if [ -x /usr/bin/oslevel ] ; then
-		IBM_REV=`/usr/bin/oslevel`
+	if [ -x /usr/bin/lslpp ] ; then
+		IBM_REV=`/usr/bin/lslpp -Lqc bos.rte.libc |
+			   awk -F: '{ print $3 }' | sed s/[0-9]*$/0/`
 	else
 		IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE}
 	fi
@@ -594,58 +637,58 @@
 	    9000/[678][0-9][0-9])
 		if [ -x /usr/bin/getconf ]; then
 		    sc_cpu_version=`/usr/bin/getconf SC_CPU_VERSION 2>/dev/null`
-                    sc_kernel_bits=`/usr/bin/getconf SC_KERNEL_BITS 2>/dev/null`
-                    case "${sc_cpu_version}" in
-                      523) HP_ARCH="hppa1.0" ;; # CPU_PA_RISC1_0
-                      528) HP_ARCH="hppa1.1" ;; # CPU_PA_RISC1_1
-                      532)                      # CPU_PA_RISC2_0
-                        case "${sc_kernel_bits}" in
-                          32) HP_ARCH="hppa2.0n" ;;
-                          64) HP_ARCH="hppa2.0w" ;;
-			  '') HP_ARCH="hppa2.0" ;;   # HP-UX 10.20
-                        esac ;;
-                    esac
+		    sc_kernel_bits=`/usr/bin/getconf SC_KERNEL_BITS 2>/dev/null`
+		    case "${sc_cpu_version}" in
+		      523) HP_ARCH=hppa1.0 ;; # CPU_PA_RISC1_0
+		      528) HP_ARCH=hppa1.1 ;; # CPU_PA_RISC1_1
+		      532)                      # CPU_PA_RISC2_0
+			case "${sc_kernel_bits}" in
+			  32) HP_ARCH=hppa2.0n ;;
+			  64) HP_ARCH=hppa2.0w ;;
+			  '') HP_ARCH=hppa2.0 ;;   # HP-UX 10.20
+			esac ;;
+		    esac
 		fi
 		if [ "${HP_ARCH}" = "" ]; then
 		    eval $set_cc_for_build
-		    sed 's/^              //' << EOF >$dummy.c
+		    sed 's/^		//' << EOF >$dummy.c
 
-              #define _HPUX_SOURCE
-              #include <stdlib.h>
-              #include <unistd.h>
-
-              int main ()
-              {
-              #if defined(_SC_KERNEL_BITS)
-                  long bits = sysconf(_SC_KERNEL_BITS);
-              #endif
-                  long cpu  = sysconf (_SC_CPU_VERSION);
-
-                  switch (cpu)
-              	{
-              	case CPU_PA_RISC1_0: puts ("hppa1.0"); break;
-              	case CPU_PA_RISC1_1: puts ("hppa1.1"); break;
-              	case CPU_PA_RISC2_0:
-              #if defined(_SC_KERNEL_BITS)
-              	    switch (bits)
-              		{
-              		case 64: puts ("hppa2.0w"); break;
-              		case 32: puts ("hppa2.0n"); break;
-              		default: puts ("hppa2.0"); break;
-              		} break;
-              #else  /* !defined(_SC_KERNEL_BITS) */
-              	    puts ("hppa2.0"); break;
-              #endif
-              	default: puts ("hppa1.0"); break;
-              	}
-                  exit (0);
-              }
+		#define _HPUX_SOURCE
+		#include <stdlib.h>
+		#include <unistd.h>
+
+		int main ()
+		{
+		#if defined(_SC_KERNEL_BITS)
+		    long bits = sysconf(_SC_KERNEL_BITS);
+		#endif
+		    long cpu  = sysconf (_SC_CPU_VERSION);
+
+		    switch (cpu)
+			{
+			case CPU_PA_RISC1_0: puts ("hppa1.0"); break;
+			case CPU_PA_RISC1_1: puts ("hppa1.1"); break;
+			case CPU_PA_RISC2_0:
+		#if defined(_SC_KERNEL_BITS)
+			    switch (bits)
+				{
+				case 64: puts ("hppa2.0w"); break;
+				case 32: puts ("hppa2.0n"); break;
+				default: puts ("hppa2.0"); break;
+				} break;
+		#else  /* !defined(_SC_KERNEL_BITS) */
+			    puts ("hppa2.0"); break;
+		#endif
+			default: puts ("hppa1.0"); break;
+			}
+		    exit (0);
+		}
 EOF
-		    (CCOPTS= $CC_FOR_BUILD -o $dummy $dummy.c 2>/dev/null) && HP_ARCH=`$dummy`
+		    (CCOPTS="" $CC_FOR_BUILD -o $dummy $dummy.c 2>/dev/null) && HP_ARCH=`$dummy`
 		    test -z "$HP_ARCH" && HP_ARCH=hppa
 		fi ;;
 	esac
-	if [ ${HP_ARCH} = "hppa2.0w" ]
+	if [ ${HP_ARCH} = hppa2.0w ]
 	then
 	    eval $set_cc_for_build
 
@@ -658,12 +701,12 @@
 	    # $ CC_FOR_BUILD="cc +DA2.0w" ./config.guess
 	    # => hppa64-hp-hpux11.23
 
-	    if echo __LP64__ | (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) |
+	    if echo __LP64__ | (CCOPTS="" $CC_FOR_BUILD -E - 2>/dev/null) |
 		grep -q __LP64__
 	    then
-		HP_ARCH="hppa2.0w"
+		HP_ARCH=hppa2.0w
 	    else
-		HP_ARCH="hppa64"
+		HP_ARCH=hppa64
 	    fi
 	fi
 	echo ${HP_ARCH}-hp-hpux${HPUX_REV}
@@ -730,22 +773,22 @@
 	exit ;;
     C1*:ConvexOS:*:* | convex:ConvexOS:C1*:*)
 	echo c1-convex-bsd
-        exit ;;
+	exit ;;
     C2*:ConvexOS:*:* | convex:ConvexOS:C2*:*)
 	if getsysinfo -f scalar_acc
 	then echo c32-convex-bsd
 	else echo c2-convex-bsd
 	fi
-        exit ;;
+	exit ;;
     C34*:ConvexOS:*:* | convex:ConvexOS:C34*:*)
 	echo c34-convex-bsd
-        exit ;;
+	exit ;;
     C38*:ConvexOS:*:* | convex:ConvexOS:C38*:*)
 	echo c38-convex-bsd
-        exit ;;
+	exit ;;
     C4*:ConvexOS:*:* | convex:ConvexOS:C4*:*)
 	echo c4-convex-bsd
-        exit ;;
+	exit ;;
     CRAY*Y-MP:*:*:*)
 	echo ymp-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/'
 	exit ;;
@@ -768,15 +811,15 @@
 	echo craynv-cray-unicosmp${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/'
 	exit ;;
     F30[01]:UNIX_System_V:*:* | F700:UNIX_System_V:*:*)
-	FUJITSU_PROC=`uname -m | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'`
-        FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'`
-        FUJITSU_REL=`echo ${UNAME_RELEASE} | sed -e 's/ /_/'`
-        echo "${FUJITSU_PROC}-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}"
-        exit ;;
+	FUJITSU_PROC=`uname -m | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz`
+	FUJITSU_SYS=`uname -p | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz | sed -e 's/\///'`
+	FUJITSU_REL=`echo ${UNAME_RELEASE} | sed -e 's/ /_/'`
+	echo "${FUJITSU_PROC}-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}"
+	exit ;;
     5000:UNIX_System_V:4.*:*)
-        FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'`
-        FUJITSU_REL=`echo ${UNAME_RELEASE} | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/ /_/'`
-        echo "sparc-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}"
+	FUJITSU_SYS=`uname -p | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz | sed -e 's/\///'`
+	FUJITSU_REL=`echo ${UNAME_RELEASE} | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz | sed -e 's/ /_/'`
+	echo "sparc-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}"
 	exit ;;
     i*86:BSD/386:*:* | i*86:BSD/OS:*:* | *:Ascend\ Embedded/OS:*:*)
 	echo ${UNAME_MACHINE}-pc-bsdi${UNAME_RELEASE}
@@ -788,30 +831,35 @@
 	echo ${UNAME_MACHINE}-unknown-bsdi${UNAME_RELEASE}
 	exit ;;
     *:FreeBSD:*:*)
-	case ${UNAME_MACHINE} in
-	    pc98)
-		echo i386-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;;
+	UNAME_PROCESSOR=`/usr/bin/uname -p`
+	case ${UNAME_PROCESSOR} in
 	    amd64)
 		echo x86_64-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;;
 	    *)
-		echo ${UNAME_MACHINE}-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;;
+		echo ${UNAME_PROCESSOR}-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;;
 	esac
 	exit ;;
     i*:CYGWIN*:*)
 	echo ${UNAME_MACHINE}-pc-cygwin
 	exit ;;
+    *:MINGW64*:*)
+	echo ${UNAME_MACHINE}-pc-mingw64
+	exit ;;
     *:MINGW*:*)
 	echo ${UNAME_MACHINE}-pc-mingw32
 	exit ;;
+    *:MSYS*:*)
+	echo ${UNAME_MACHINE}-pc-msys
+	exit ;;
     i*:windows32*:*)
-    	# uname -m includes "-pc" on this system.
-    	echo ${UNAME_MACHINE}-mingw32
+	# uname -m includes "-pc" on this system.
+	echo ${UNAME_MACHINE}-mingw32
 	exit ;;
     i*:PW*:*)
 	echo ${UNAME_MACHINE}-pc-pw32
 	exit ;;
     *:Interix*:*)
-    	case ${UNAME_MACHINE} in
+	case ${UNAME_MACHINE} in
 	    x86)
 		echo i586-pc-interix${UNAME_RELEASE}
 		exit ;;
@@ -848,15 +896,22 @@
 	exit ;;
     *:GNU:*:*)
 	# the GNU system
-	echo `echo ${UNAME_MACHINE}|sed -e 's,[-/].*$,,'`-unknown-gnu`echo ${UNAME_RELEASE}|sed -e 's,/.*$,,'`
+	echo `echo ${UNAME_MACHINE}|sed -e 's,[-/].*$,,'`-unknown-${LIBC}`echo ${UNAME_RELEASE}|sed -e 's,/.*$,,'`
 	exit ;;
     *:GNU/*:*:*)
 	# other systems with GNU libc and userland
-	echo ${UNAME_MACHINE}-unknown-`echo ${UNAME_SYSTEM} | sed 's,^[^/]*/,,' | tr '[A-Z]' '[a-z]'``echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`-gnu
+	echo ${UNAME_MACHINE}-unknown-`echo ${UNAME_SYSTEM} | sed 's,^[^/]*/,,' | tr "[:upper:]" "[:lower:]"``echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`-${LIBC}
 	exit ;;
     i*86:Minix:*:*)
 	echo ${UNAME_MACHINE}-pc-minix
 	exit ;;
+    aarch64:Linux:*:*)
+	echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
+	exit ;;
+    aarch64_be:Linux:*:*)
+	UNAME_MACHINE=aarch64_be
+	echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
+	exit ;;
     alpha:Linux:*:*)
 	case `sed -n '/^cpu model/s/^.*: \(.*\)/\1/p' < /proc/cpuinfo` in
 	  EV5)   UNAME_MACHINE=alphaev5 ;;
@@ -866,52 +921,62 @@
 	  EV6)   UNAME_MACHINE=alphaev6 ;;
 	  EV67)  UNAME_MACHINE=alphaev67 ;;
 	  EV68*) UNAME_MACHINE=alphaev68 ;;
-        esac
+	esac
 	objdump --private-headers /bin/sh | grep -q ld.so.1
-	if test "$?" = 0 ; then LIBC="libc1" ; else LIBC="" ; fi
-	echo ${UNAME_MACHINE}-unknown-linux-gnu${LIBC}
+	if test "$?" = 0 ; then LIBC=gnulibc1 ; fi
+	echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
+	exit ;;
+    arc:Linux:*:* | arceb:Linux:*:*)
+	echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
 	exit ;;
     arm*:Linux:*:*)
 	eval $set_cc_for_build
 	if echo __ARM_EABI__ | $CC_FOR_BUILD -E - 2>/dev/null \
 	    | grep -q __ARM_EABI__
 	then
-	    echo ${UNAME_MACHINE}-unknown-linux-gnu
+	    echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
 	else
-	    echo ${UNAME_MACHINE}-unknown-linux-gnueabi
+	    if echo __ARM_PCS_VFP | $CC_FOR_BUILD -E - 2>/dev/null \
+		| grep -q __ARM_PCS_VFP
+	    then
+		echo ${UNAME_MACHINE}-unknown-linux-${LIBC}eabi
+	    else
+		echo ${UNAME_MACHINE}-unknown-linux-${LIBC}eabihf
+	    fi
 	fi
 	exit ;;
     avr32*:Linux:*:*)
-	echo ${UNAME_MACHINE}-unknown-linux-gnu
+	echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
 	exit ;;
     cris:Linux:*:*)
-	echo cris-axis-linux-gnu
+	echo ${UNAME_MACHINE}-axis-linux-${LIBC}
 	exit ;;
     crisv32:Linux:*:*)
-	echo crisv32-axis-linux-gnu
+	echo ${UNAME_MACHINE}-axis-linux-${LIBC}
+	exit ;;
+    e2k:Linux:*:*)
+	echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
 	exit ;;
     frv:Linux:*:*)
-    	echo frv-unknown-linux-gnu
+	echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
+	exit ;;
+    hexagon:Linux:*:*)
+	echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
 	exit ;;
     i*86:Linux:*:*)
-	LIBC=gnu
-	eval $set_cc_for_build
-	sed 's/^	//' << EOF >$dummy.c
-	#ifdef __dietlibc__
-	LIBC=dietlibc
-	#endif
-EOF
-	eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep '^LIBC'`
-	echo "${UNAME_MACHINE}-pc-linux-${LIBC}"
+	echo ${UNAME_MACHINE}-pc-linux-${LIBC}
 	exit ;;
     ia64:Linux:*:*)
-	echo ${UNAME_MACHINE}-unknown-linux-gnu
+	echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
+	exit ;;
+    k1om:Linux:*:*)
+	echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
 	exit ;;
     m32r*:Linux:*:*)
-	echo ${UNAME_MACHINE}-unknown-linux-gnu
+	echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
 	exit ;;
     m68*:Linux:*:*)
-	echo ${UNAME_MACHINE}-unknown-linux-gnu
+	echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
 	exit ;;
     mips:Linux:*:* | mips64:Linux:*:*)
 	eval $set_cc_for_build
@@ -930,51 +995,63 @@
 	#endif
 EOF
 	eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep '^CPU'`
-	test x"${CPU}" != x && { echo "${CPU}-unknown-linux-gnu"; exit; }
+	test x"${CPU}" != x && { echo "${CPU}-unknown-linux-${LIBC}"; exit; }
 	;;
-    or32:Linux:*:*)
-	echo or32-unknown-linux-gnu
+    openrisc*:Linux:*:*)
+	echo or1k-unknown-linux-${LIBC}
+	exit ;;
+    or32:Linux:*:* | or1k*:Linux:*:*)
+	echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
 	exit ;;
     padre:Linux:*:*)
-	echo sparc-unknown-linux-gnu
+	echo sparc-unknown-linux-${LIBC}
 	exit ;;
     parisc64:Linux:*:* | hppa64:Linux:*:*)
-	echo hppa64-unknown-linux-gnu
+	echo hppa64-unknown-linux-${LIBC}
 	exit ;;
     parisc:Linux:*:* | hppa:Linux:*:*)
 	# Look for CPU level
 	case `grep '^cpu[^a-z]*:' /proc/cpuinfo 2>/dev/null | cut -d' ' -f2` in
-	  PA7*) echo hppa1.1-unknown-linux-gnu ;;
-	  PA8*) echo hppa2.0-unknown-linux-gnu ;;
-	  *)    echo hppa-unknown-linux-gnu ;;
+	  PA7*) echo hppa1.1-unknown-linux-${LIBC} ;;
+	  PA8*) echo hppa2.0-unknown-linux-${LIBC} ;;
+	  *)    echo hppa-unknown-linux-${LIBC} ;;
 	esac
 	exit ;;
     ppc64:Linux:*:*)
-	echo powerpc64-unknown-linux-gnu
+	echo powerpc64-unknown-linux-${LIBC}
 	exit ;;
     ppc:Linux:*:*)
-	echo powerpc-unknown-linux-gnu
+	echo powerpc-unknown-linux-${LIBC}
+	exit ;;
+    ppc64le:Linux:*:*)
+	echo powerpc64le-unknown-linux-${LIBC}
+	exit ;;
+    ppcle:Linux:*:*)
+	echo powerpcle-unknown-linux-${LIBC}
 	exit ;;
     s390:Linux:*:* | s390x:Linux:*:*)
-	echo ${UNAME_MACHINE}-ibm-linux
+	echo ${UNAME_MACHINE}-ibm-linux-${LIBC}
 	exit ;;
     sh64*:Linux:*:*)
-    	echo ${UNAME_MACHINE}-unknown-linux-gnu
+	echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
 	exit ;;
     sh*:Linux:*:*)
-	echo ${UNAME_MACHINE}-unknown-linux-gnu
+	echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
 	exit ;;
     sparc:Linux:*:* | sparc64:Linux:*:*)
-	echo ${UNAME_MACHINE}-unknown-linux-gnu
+	echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
+	exit ;;
+    tile*:Linux:*:*)
+	echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
 	exit ;;
     vax:Linux:*:*)
-	echo ${UNAME_MACHINE}-dec-linux-gnu
+	echo ${UNAME_MACHINE}-dec-linux-${LIBC}
 	exit ;;
     x86_64:Linux:*:*)
-	echo x86_64-unknown-linux-gnu
+	echo ${UNAME_MACHINE}-pc-linux-${LIBC}
 	exit ;;
     xtensa*:Linux:*:*)
-    	echo ${UNAME_MACHINE}-unknown-linux-gnu
+	echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
 	exit ;;
     i*86:DYNIX/ptx:4*:*)
 	# ptx 4.0 does uname -s correctly, with DYNIX/ptx in there.
@@ -983,11 +1060,11 @@
 	echo i386-sequent-sysv4
 	exit ;;
     i*86:UNIX_SV:4.2MP:2.*)
-        # Unixware is an offshoot of SVR4, but it has its own version
-        # number series starting with 2...
-        # I am not positive that other SVR4 systems won't match this,
+	# Unixware is an offshoot of SVR4, but it has its own version
+	# number series starting with 2...
+	# I am not positive that other SVR4 systems won't match this,
 	# I just have to hope.  -- rms.
-        # Use sysv4.2uw... so that sysv4* matches it.
+	# Use sysv4.2uw... so that sysv4* matches it.
 	echo ${UNAME_MACHINE}-pc-sysv4.2uw${UNAME_VERSION}
 	exit ;;
     i*86:OS/2:*:*)
@@ -1019,7 +1096,7 @@
 	fi
 	exit ;;
     i*86:*:5:[678]*)
-    	# UnixWare 7.x, OpenUNIX and OpenServer 6.
+	# UnixWare 7.x, OpenUNIX and OpenServer 6.
 	case `/bin/uname -X | grep "^Machine"` in
 	    *486*)	     UNAME_MACHINE=i486 ;;
 	    *Pentium)	     UNAME_MACHINE=i586 ;;
@@ -1047,13 +1124,13 @@
 	exit ;;
     pc:*:*:*)
 	# Left here for compatibility:
-        # uname -m prints for DJGPP always 'pc', but it prints nothing about
-        # the processor, so we play safe by assuming i586.
+	# uname -m prints for DJGPP always 'pc', but it prints nothing about
+	# the processor, so we play safe by assuming i586.
 	# Note: whatever this is, it MUST be the same as what config.sub
-	# prints for the "djgpp" host, or else GDB configury will decide that
+	# prints for the "djgpp" host, or else GDB configure will decide that
 	# this is a cross-build.
 	echo i586-pc-msdosdjgpp
-        exit ;;
+	exit ;;
     Intel:Mach:3*:*)
 	echo i386-pc-mach3
 	exit ;;
@@ -1088,8 +1165,8 @@
 	/bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \
 	  && { echo i586-ncr-sysv4.3${OS_REL}; exit; } ;;
     3[34]??:*:4.0:* | 3[34]??,*:*:4.0:*)
-        /bin/uname -p 2>/dev/null | grep 86 >/dev/null \
-          && { echo i486-ncr-sysv4; exit; } ;;
+	/bin/uname -p 2>/dev/null | grep 86 >/dev/null \
+	  && { echo i486-ncr-sysv4; exit; } ;;
     NCR*:*:4.2:* | MPRAS*:*:4.2:*)
 	OS_REL='.3'
 	test -r /etc/.relid \
@@ -1132,10 +1209,10 @@
 		echo ns32k-sni-sysv
 	fi
 	exit ;;
-    PENTIUM:*:4.0*:*) # Unisys `ClearPath HMP IX 4000' SVR4/MP effort
-                      # says <Richard.M.Bartel@ccMail.Census.GOV>
-        echo i586-unisys-sysv4
-        exit ;;
+    PENTIUM:*:4.0*:*)	# Unisys `ClearPath HMP IX 4000' SVR4/MP effort
+			# says <Richard.M.Bartel@ccMail.Census.GOV>
+	echo i586-unisys-sysv4
+	exit ;;
     *:UNIX_System_V:4*:FTX*)
 	# From Gerald Hewes <hewes@openmarket.com>.
 	# How about differentiating between stratus architectures? -djm
@@ -1161,11 +1238,11 @@
 	exit ;;
     R[34]000:*System_V*:*:* | R4000:UNIX_SYSV:*:* | R*000:UNIX_SV:*:*)
 	if [ -d /usr/nec ]; then
-	        echo mips-nec-sysv${UNAME_RELEASE}
+		echo mips-nec-sysv${UNAME_RELEASE}
 	else
-	        echo mips-unknown-sysv${UNAME_RELEASE}
+		echo mips-unknown-sysv${UNAME_RELEASE}
 	fi
-        exit ;;
+	exit ;;
     BeBox:BeOS:*:*)	# BeOS running on hardware made by Be, PPC only.
 	echo powerpc-be-beos
 	exit ;;
@@ -1178,6 +1255,9 @@
     BePC:Haiku:*:*)	# Haiku running on Intel PC compatible.
 	echo i586-pc-haiku
 	exit ;;
+    x86_64:Haiku:*:*)
+	echo x86_64-unknown-haiku
+	exit ;;
     SX-4:SUPER-UX:*:*)
 	echo sx4-nec-superux${UNAME_RELEASE}
 	exit ;;
@@ -1196,6 +1276,9 @@
     SX-8R:SUPER-UX:*:*)
 	echo sx8r-nec-superux${UNAME_RELEASE}
 	exit ;;
+    SX-ACE:SUPER-UX:*:*)
+	echo sxace-nec-superux${UNAME_RELEASE}
+	exit ;;
     Power*:Rhapsody:*:*)
 	echo powerpc-apple-rhapsody${UNAME_RELEASE}
 	exit ;;
@@ -1204,24 +1287,36 @@
 	exit ;;
     *:Darwin:*:*)
 	UNAME_PROCESSOR=`uname -p` || UNAME_PROCESSOR=unknown
-	case $UNAME_PROCESSOR in
-	    i386)
-		eval $set_cc_for_build
-		if [ "$CC_FOR_BUILD" != 'no_compiler_found' ]; then
-		  if (echo '#ifdef __LP64__'; echo IS_64BIT_ARCH; echo '#endif') | \
-		      (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) | \
-		      grep IS_64BIT_ARCH >/dev/null
-		  then
-		      UNAME_PROCESSOR="x86_64"
-		  fi
-		fi ;;
-	    unknown) UNAME_PROCESSOR=powerpc ;;
-	esac
+	eval $set_cc_for_build
+	if test "$UNAME_PROCESSOR" = unknown ; then
+	    UNAME_PROCESSOR=powerpc
+	fi
+	if test `echo "$UNAME_RELEASE" | sed -e 's/\..*//'` -le 10 ; then
+	    if [ "$CC_FOR_BUILD" != no_compiler_found ]; then
+		if (echo '#ifdef __LP64__'; echo IS_64BIT_ARCH; echo '#endif') | \
+		    (CCOPTS="" $CC_FOR_BUILD -E - 2>/dev/null) | \
+		    grep IS_64BIT_ARCH >/dev/null
+		then
+		    case $UNAME_PROCESSOR in
+			i386) UNAME_PROCESSOR=x86_64 ;;
+			powerpc) UNAME_PROCESSOR=powerpc64 ;;
+		    esac
+		fi
+	    fi
+	elif test "$UNAME_PROCESSOR" = i386 ; then
+	    # Avoid executing cc on OS X 10.9, as it ships with a stub
+	    # that puts up a graphical alert prompting to install
+	    # developer tools.  Any system running Mac OS X 10.7 or
+	    # later (Darwin 11 and later) is required to have a 64-bit
+	    # processor. This is not true of the ARM version of Darwin
+	    # that Apple uses in portable devices.
+	    UNAME_PROCESSOR=x86_64
+	fi
 	echo ${UNAME_PROCESSOR}-apple-darwin${UNAME_RELEASE}
 	exit ;;
     *:procnto*:*:* | *:QNX:[0123456789]*:*)
 	UNAME_PROCESSOR=`uname -p`
-	if test "$UNAME_PROCESSOR" = "x86"; then
+	if test "$UNAME_PROCESSOR" = x86; then
 		UNAME_PROCESSOR=i386
 		UNAME_MACHINE=pc
 	fi
@@ -1230,7 +1325,10 @@
     *:QNX:*:4*)
 	echo i386-pc-qnx
 	exit ;;
-    NSE-?:NONSTOP_KERNEL:*:*)
+    NEO-?:NONSTOP_KERNEL:*:*)
+	echo neo-tandem-nsk${UNAME_RELEASE}
+	exit ;;
+    NSE-*:NONSTOP_KERNEL:*:*)
 	echo nse-tandem-nsk${UNAME_RELEASE}
 	exit ;;
     NSR-?:NONSTOP_KERNEL:*:*)
@@ -1249,7 +1347,7 @@
 	# "uname -m" is not consistent, so use $cputype instead. 386
 	# is converted to i386 for consistency with other x86
 	# operating systems.
-	if test "$cputype" = "386"; then
+	if test "$cputype" = 386; then
 	    UNAME_MACHINE=i386
 	else
 	    UNAME_MACHINE="$cputype"
@@ -1275,13 +1373,13 @@
 	echo pdp10-unknown-its
 	exit ;;
     SEI:*:*:SEIUX)
-        echo mips-sei-seiux${UNAME_RELEASE}
+	echo mips-sei-seiux${UNAME_RELEASE}
 	exit ;;
     *:DragonFly:*:*)
 	echo ${UNAME_MACHINE}-unknown-dragonfly`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`
 	exit ;;
     *:*VMS:*:*)
-    	UNAME_MACHINE=`(uname -p) 2>/dev/null`
+	UNAME_MACHINE=`(uname -p) 2>/dev/null`
 	case "${UNAME_MACHINE}" in
 	    A*) echo alpha-dec-vms ; exit ;;
 	    I*) echo ia64-dec-vms ; exit ;;
@@ -1291,7 +1389,7 @@
 	echo i386-pc-xenix
 	exit ;;
     i*86:skyos:*:*)
-	echo ${UNAME_MACHINE}-pc-skyos`echo ${UNAME_RELEASE}` | sed -e 's/ .*$//'
+	echo ${UNAME_MACHINE}-pc-skyos`echo ${UNAME_RELEASE} | sed -e 's/ .*$//'`
 	exit ;;
     i*86:rdos:*:*)
 	echo ${UNAME_MACHINE}-pc-rdos
@@ -1299,158 +1397,13 @@
     i*86:AROS:*:*)
 	echo ${UNAME_MACHINE}-pc-aros
 	exit ;;
-esac
-
-#echo '(No uname command or uname output not recognized.)' 1>&2
-#echo "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" 1>&2
-
-eval $set_cc_for_build
-cat >$dummy.c <<EOF
-#ifdef _SEQUENT_
-# include <sys/types.h>
-# include <sys/utsname.h>
-#endif
-main ()
-{
-#if defined (sony)
-#if defined (MIPSEB)
-  /* BFD wants "bsd" instead of "newsos".  Perhaps BFD should be changed,
-     I don't know....  */
-  printf ("mips-sony-bsd\n"); exit (0);
-#else
-#include <sys/param.h>
-  printf ("m68k-sony-newsos%s\n",
-#ifdef NEWSOS4
-          "4"
-#else
-	  ""
-#endif
-         ); exit (0);
-#endif
-#endif
-
-#if defined (__arm) && defined (__acorn) && defined (__unix)
-  printf ("arm-acorn-riscix\n"); exit (0);
-#endif
-
-#if defined (hp300) && !defined (hpux)
-  printf ("m68k-hp-bsd\n"); exit (0);
-#endif
-
-#if defined (NeXT)
-#if !defined (__ARCHITECTURE__)
-#define __ARCHITECTURE__ "m68k"
-#endif
-  int version;
-  version=`(hostinfo | sed -n 's/.*NeXT Mach \([0-9]*\).*/\1/p') 2>/dev/null`;
-  if (version < 4)
-    printf ("%s-next-nextstep%d\n", __ARCHITECTURE__, version);
-  else
-    printf ("%s-next-openstep%d\n", __ARCHITECTURE__, version);
-  exit (0);
-#endif
-
-#if defined (MULTIMAX) || defined (n16)
-#if defined (UMAXV)
-  printf ("ns32k-encore-sysv\n"); exit (0);
-#else
-#if defined (CMU)
-  printf ("ns32k-encore-mach\n"); exit (0);
-#else
-  printf ("ns32k-encore-bsd\n"); exit (0);
-#endif
-#endif
-#endif
-
-#if defined (__386BSD__)
-  printf ("i386-pc-bsd\n"); exit (0);
-#endif
-
-#if defined (sequent)
-#if defined (i386)
-  printf ("i386-sequent-dynix\n"); exit (0);
-#endif
-#if defined (ns32000)
-  printf ("ns32k-sequent-dynix\n"); exit (0);
-#endif
-#endif
-
-#if defined (_SEQUENT_)
-    struct utsname un;
-
-    uname(&un);
-
-    if (strncmp(un.version, "V2", 2) == 0) {
-	printf ("i386-sequent-ptx2\n"); exit (0);
-    }
-    if (strncmp(un.version, "V1", 2) == 0) { /* XXX is V1 correct? */
-	printf ("i386-sequent-ptx1\n"); exit (0);
-    }
-    printf ("i386-sequent-ptx\n"); exit (0);
-
-#endif
-
-#if defined (vax)
-# if !defined (ultrix)
-#  include <sys/param.h>
-#  if defined (BSD)
-#   if BSD == 43
-      printf ("vax-dec-bsd4.3\n"); exit (0);
-#   else
-#    if BSD == 199006
-      printf ("vax-dec-bsd4.3reno\n"); exit (0);
-#    else
-      printf ("vax-dec-bsd\n"); exit (0);
-#    endif
-#   endif
-#  else
-    printf ("vax-dec-bsd\n"); exit (0);
-#  endif
-# else
-    printf ("vax-dec-ultrix\n"); exit (0);
-# endif
-#endif
-
-#if defined (alliant) && defined (i860)
-  printf ("i860-alliant-bsd\n"); exit (0);
-#endif
-
-  exit (1);
-}
-EOF
-
-$CC_FOR_BUILD -o $dummy $dummy.c 2>/dev/null && SYSTEM_NAME=`$dummy` &&
-	{ echo "$SYSTEM_NAME"; exit; }
-
-# Apollos put the system type in the environment.
-
-test -d /usr/apollo && { echo ${ISP}-apollo-${SYSTYPE}; exit; }
-
-# Convex versions that predate uname can use getsysinfo(1)
-
-if [ -x /usr/convex/getsysinfo ]
-then
-    case `getsysinfo -f cpu_type` in
-    c1*)
-	echo c1-convex-bsd
-	exit ;;
-    c2*)
-	if getsysinfo -f scalar_acc
-	then echo c32-convex-bsd
-	else echo c2-convex-bsd
-	fi
-	exit ;;
-    c34*)
-	echo c34-convex-bsd
-	exit ;;
-    c38*)
-	echo c38-convex-bsd
+    x86_64:VMkernel:*:*)
+	echo ${UNAME_MACHINE}-unknown-esx
 	exit ;;
-    c4*)
-	echo c4-convex-bsd
+    amd64:Isilon\ OneFS:*:*)
+	echo x86_64-unknown-onefs
 	exit ;;
-    esac
-fi
+esac
 
 cat >&2 <<EOF
 $0: unable to guess system type
@@ -1459,9 +1412,9 @@
 the operating system you are using. It is advised that you
 download the most up to date version of the config scripts from
 
-  http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.guess;hb=HEAD
+  http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.guess
 and
-  http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.sub;hb=HEAD
+  http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.sub
 
 If the version you run ($0) is already up to date, please
 send the following data and any information you think might be
diff -Naur ruby-1.9.3-p551/tool/config.sub ruby-1.9.3-p551+ppc64le/tool/config.sub
--- ruby-1.9.3-p551/tool/config.sub	2010-10-03 15:06:23.000000000 +0000
+++ ruby-1.9.3-p551+ppc64le/tool/config.sub	2016-04-15 05:09:41.237756446 +0000
@@ -1,38 +1,31 @@
 #! /bin/sh
 # Configuration validation subroutine script.
-#   Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999,
-#   2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009
-#   Free Software Foundation, Inc.
-
-timestamp='2009-11-20'
-
-# This file is (in principle) common to ALL GNU software.
-# The presence of a machine in this file suggests that SOME GNU software
-# can handle that machine.  It does not imply ALL GNU software can.
-#
-# This file is free software; you can redistribute it and/or modify
-# it under the terms of the GNU General Public License as published by
-# the Free Software Foundation; either version 2 of the License, or
+#   Copyright 1992-2016 Free Software Foundation, Inc.
+
+timestamp='2016-03-30'
+
+# This file is free software; you can redistribute it and/or modify it
+# under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 3 of the License, or
 # (at your option) any later version.
 #
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-# GNU General Public License for more details.
+# This program is distributed in the hope that it will be useful, but
+# WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+# General Public License for more details.
 #
 # You should have received a copy of the GNU General Public License
-# along with this program; if not, write to the Free Software
-# Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA
-# 02110-1301, USA.
+# along with this program; if not, see <http://www.gnu.org/licenses/>.
 #
 # As a special exception to the GNU General Public License, if you
 # distribute this file as part of a program that contains a
 # configuration script generated by Autoconf, you may include it under
-# the same distribution terms that you use for the rest of that program.
+# the same distribution terms that you use for the rest of that
+# program.  This Exception is an additional permission under section 7
+# of the GNU General Public License, version 3 ("GPLv3").
 
 
-# Please send patches to <config-patches@gnu.org>.  Submit a context
-# diff and a properly formatted GNU ChangeLog entry.
+# Please send patches to <config-patches@gnu.org>.
 #
 # Configuration subroutine to validate and canonicalize a configuration type.
 # Supply the specified configuration type as an argument.
@@ -40,7 +33,7 @@
 # Otherwise, we print the canonical config type on stdout and succeed.
 
 # You can get the latest version of this script from:
-# http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.sub;hb=HEAD
+# http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.sub
 
 # This file is supposed to be the same for all GNU packages
 # and recognize all the CPU types, system types and aliases
@@ -60,8 +53,7 @@
 me=`echo "$0" | sed -e 's,.*/,,'`
 
 usage="\
-Usage: $0 [OPTION] CPU-MFR-OPSYS
-       $0 [OPTION] ALIAS
+Usage: $0 [OPTION] CPU-MFR-OPSYS or ALIAS
 
 Canonicalize a configuration name.
 
@@ -75,8 +67,7 @@
 version="\
 GNU config.sub ($timestamp)
 
-Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001,
-2002, 2003, 2004, 2005, 2006, 2007, 2008 Free Software Foundation, Inc.
+Copyright 1992-2016 Free Software Foundation, Inc.
 
 This is free software; see the source for copying conditions.  There is NO
 warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE."
@@ -123,13 +114,18 @@
 # Here we must recognize all the valid KERNEL-OS combinations.
 maybe_os=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\2/'`
 case $maybe_os in
-  nto-qnx* | linux-gnu* | linux-dietlibc | linux-newlib* | linux-uclibc* | \
-  uclinux-uclibc* | uclinux-gnu* | kfreebsd*-gnu* | knetbsd*-gnu* | netbsd*-gnu* | \
+  nto-qnx* | linux-gnu* | linux-android* | linux-dietlibc | linux-newlib* | \
+  linux-musl* | linux-uclibc* | uclinux-uclibc* | uclinux-gnu* | kfreebsd*-gnu* | \
+  knetbsd*-gnu* | netbsd*-gnu* | netbsd*-eabi* | \
   kopensolaris*-gnu* | \
   storm-chaos* | os2-emx* | rtmk-nova*)
     os=-$maybe_os
     basic_machine=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'`
     ;;
+  android-linux)
+    os=-linux-android
+    basic_machine=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'`-unknown
+    ;;
   *)
     basic_machine=`echo $1 | sed 's/-[^-]*$//'`
     if [ $basic_machine != $1 ]
@@ -152,12 +148,12 @@
 	-convergent* | -ncr* | -news | -32* | -3600* | -3100* | -hitachi* |\
 	-c[123]* | -convex* | -sun | -crds | -omron* | -dg | -ultra | -tti* | \
 	-harris | -dolphin | -highlevel | -gould | -cbm | -ns | -masscomp | \
-	-apple | -axis | -knuth | -cray | -microblaze)
+	-apple | -axis | -knuth | -cray | -microblaze*)
 		os=
 		basic_machine=$1
 		;;
-        -bluegene*)
-	        os=-cnk
+	-bluegene*)
+		os=-cnk
 		;;
 	-sim | -cisco | -oki | -wec | -winbond)
 		os=
@@ -173,10 +169,10 @@
 		os=-chorusos
 		basic_machine=$1
 		;;
- 	-chorusrdb)
- 		os=-chorusrdb
+	-chorusrdb)
+		os=-chorusrdb
 		basic_machine=$1
- 		;;
+		;;
 	-hiux*)
 		os=-hiuxwe2
 		;;
@@ -221,6 +217,12 @@
 	-isc*)
 		basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
 		;;
+	-lynx*178)
+		os=-lynxos178
+		;;
+	-lynx*5)
+		os=-lynxos5
+		;;
 	-lynx*)
 		os=-lynxos
 		;;
@@ -245,20 +247,29 @@
 	# Some are omitted here because they have special meanings below.
 	1750a | 580 \
 	| a29k \
+	| aarch64 | aarch64_be \
 	| alpha | alphaev[4-8] | alphaev56 | alphaev6[78] | alphapca5[67] \
 	| alpha64 | alpha64ev[4-8] | alpha64ev56 | alpha64ev6[78] | alpha64pca5[67] \
 	| am33_2.0 \
-	| arc | arm | arm[bl]e | arme[lb] | armv[2345] | armv[345][lb] | avr | avr32 \
+	| arc | arceb \
+	| arm | arm[bl]e | arme[lb] | armv[2-8] | armv[3-8][lb] | armv7[arm] \
+	| avr | avr32 \
+	| ba \
+	| be32 | be64 \
 	| bfin \
-	| c4x | clipper \
+	| c4x | c8051 | clipper \
 	| d10v | d30v | dlx | dsp16xx \
-	| fido | fr30 | frv \
+	| e2k | epiphany \
+	| fido | fr30 | frv | ft32 \
 	| h8300 | h8500 | hppa | hppa1.[01] | hppa2.0 | hppa2.0[nw] | hppa64 \
+	| hexagon \
 	| i370 | i860 | i960 | ia64 \
 	| ip2k | iq2000 \
+	| k1om \
+	| le32 | le64 \
 	| lm32 \
 	| m32c | m32r | m32rle | m68000 | m68k | m88k \
-	| maxq | mb | microblaze | mcore | mep | metag \
+	| maxq | mb | microblaze | microblazeel | mcore | mep | metag \
 	| mips | mipsbe | mipseb | mipsel | mipsle \
 	| mips16 \
 	| mips64 | mips64el \
@@ -272,38 +283,55 @@
 	| mips64vr5900 | mips64vr5900el \
 	| mipsisa32 | mipsisa32el \
 	| mipsisa32r2 | mipsisa32r2el \
+	| mipsisa32r6 | mipsisa32r6el \
 	| mipsisa64 | mipsisa64el \
 	| mipsisa64r2 | mipsisa64r2el \
+	| mipsisa64r6 | mipsisa64r6el \
 	| mipsisa64sb1 | mipsisa64sb1el \
 	| mipsisa64sr71k | mipsisa64sr71kel \
+	| mipsr5900 | mipsr5900el \
 	| mipstx39 | mipstx39el \
 	| mn10200 | mn10300 \
 	| moxie \
 	| mt \
 	| msp430 \
-	| nios | nios2 \
+	| nds32 | nds32le | nds32be \
+	| nios | nios2 | nios2eb | nios2el \
 	| ns16k | ns32k \
-	| or32 \
+	| open8 | or1k | or1knd | or32 \
 	| pdp10 | pdp11 | pj | pjl \
-	| powerpc | powerpc64 | powerpc64le | powerpcle | ppcbe \
+	| powerpc | powerpc64 | powerpc64le | powerpcle \
 	| pyramid \
-	| rx \
+	| riscv32 | riscv64 \
+	| rl78 | rx \
 	| score \
-	| sh | sh[1234] | sh[24]a | sh[24]aeb | sh[23]e | sh[34]eb | sheb | shbe | shle | sh[1234]le | sh3ele \
+	| sh | sh[1234] | sh[24]a | sh[24]aeb | sh[23]e | sh[234]eb | sheb | shbe | shle | sh[1234]le | sh3ele \
 	| sh64 | sh64le \
 	| sparc | sparc64 | sparc64b | sparc64v | sparc86x | sparclet | sparclite \
 	| sparcv8 | sparcv9 | sparcv9b | sparcv9v \
-	| spu | strongarm \
-	| tahoe | thumb | tic4x | tic80 | tron \
+	| spu \
+	| tahoe | tic4x | tic54x | tic55x | tic6x | tic80 | tron \
 	| ubicom32 \
-	| v850 | v850e \
+	| v850 | v850e | v850e1 | v850e2 | v850es | v850e2v3 \
+	| visium \
 	| we32k \
-	| x86 | xc16x | xscale | xscalee[bl] | xstormy16 | xtensa \
+	| x86 | xc16x | xstormy16 | xtensa \
 	| z8k | z80)
 		basic_machine=$basic_machine-unknown
 		;;
-	m6811 | m68hc11 | m6812 | m68hc12 | picochip)
-		# Motorola 68HC11/12.
+	c54x)
+		basic_machine=tic54x-unknown
+		;;
+	c55x)
+		basic_machine=tic55x-unknown
+		;;
+	c6x)
+		basic_machine=tic6x-unknown
+		;;
+	leon|leon[3-9])
+		basic_machine=sparc-$basic_machine
+		;;
+	m6811 | m68hc11 | m6812 | m68hc12 | m68hcs12x | nvptx | picochip)
 		basic_machine=$basic_machine-unknown
 		os=-none
 		;;
@@ -313,6 +341,21 @@
 		basic_machine=mt-unknown
 		;;
 
+	strongarm | thumb | xscale)
+		basic_machine=arm-unknown
+		;;
+	xgate)
+		basic_machine=$basic_machine-unknown
+		os=-none
+		;;
+	xscaleeb)
+		basic_machine=armeb-unknown
+		;;
+
+	xscaleel)
+		basic_machine=armel-unknown
+		;;
+
 	# We use `pc' rather than `unknown'
 	# because (1) that's what they normally are, and
 	# (2) the word "unknown" tends to confuse beginning users.
@@ -327,25 +370,32 @@
 	# Recognize the basic CPU types with company name.
 	580-* \
 	| a29k-* \
+	| aarch64-* | aarch64_be-* \
 	| alpha-* | alphaev[4-8]-* | alphaev56-* | alphaev6[78]-* \
 	| alpha64-* | alpha64ev[4-8]-* | alpha64ev56-* | alpha64ev6[78]-* \
-	| alphapca5[67]-* | alpha64pca5[67]-* | arc-* \
+	| alphapca5[67]-* | alpha64pca5[67]-* | arc-* | arceb-* \
 	| arm-*  | armbe-* | armle-* | armeb-* | armv*-* \
 	| avr-* | avr32-* \
+	| ba-* \
+	| be32-* | be64-* \
 	| bfin-* | bs2000-* \
-	| c[123]* | c30-* | [cjt]90-* | c4x-* | c54x-* | c55x-* | c6x-* \
-	| clipper-* | craynv-* | cydra-* \
+	| c[123]* | c30-* | [cjt]90-* | c4x-* \
+	| c8051-* | clipper-* | craynv-* | cydra-* \
 	| d10v-* | d30v-* | dlx-* \
-	| elxsi-* \
+	| e2k-* | elxsi-* \
 	| f30[01]-* | f700-* | fido-* | fr30-* | frv-* | fx80-* \
 	| h8300-* | h8500-* \
 	| hppa-* | hppa1.[01]-* | hppa2.0-* | hppa2.0[nw]-* | hppa64-* \
+	| hexagon-* \
 	| i*86-* | i860-* | i960-* | ia64-* \
 	| ip2k-* | iq2000-* \
+	| k1om-* \
+	| le32-* | le64-* \
 	| lm32-* \
 	| m32c-* | m32r-* | m32rle-* \
 	| m68000-* | m680[012346]0-* | m68360-* | m683?2-* | m68k-* \
-	| m88110-* | m88k-* | maxq-* | mcore-* | metag-* | microblaze-* \
+	| m88110-* | m88k-* | maxq-* | mcore-* | metag-* \
+	| microblaze-* | microblazeel-* \
 	| mips-* | mipsbe-* | mipseb-* | mipsel-* | mipsle-* \
 	| mips16-* \
 	| mips64-* | mips64el-* \
@@ -359,33 +409,43 @@
 	| mips64vr5900-* | mips64vr5900el-* \
 	| mipsisa32-* | mipsisa32el-* \
 	| mipsisa32r2-* | mipsisa32r2el-* \
+	| mipsisa32r6-* | mipsisa32r6el-* \
 	| mipsisa64-* | mipsisa64el-* \
 	| mipsisa64r2-* | mipsisa64r2el-* \
+	| mipsisa64r6-* | mipsisa64r6el-* \
 	| mipsisa64sb1-* | mipsisa64sb1el-* \
 	| mipsisa64sr71k-* | mipsisa64sr71kel-* \
+	| mipsr5900-* | mipsr5900el-* \
 	| mipstx39-* | mipstx39el-* \
 	| mmix-* \
 	| mt-* \
 	| msp430-* \
-	| nios-* | nios2-* \
+	| nds32-* | nds32le-* | nds32be-* \
+	| nios-* | nios2-* | nios2eb-* | nios2el-* \
 	| none-* | np1-* | ns16k-* | ns32k-* \
+	| open8-* \
+	| or1k*-* \
 	| orion-* \
 	| pdp10-* | pdp11-* | pj-* | pjl-* | pn-* | power-* \
-	| powerpc-* | powerpc64-* | powerpc64le-* | powerpcle-* | ppcbe-* \
+	| powerpc-* | powerpc64-* | powerpc64le-* | powerpcle-* \
 	| pyramid-* \
-	| romp-* | rs6000-* | rx-* \
+	| riscv32-* | riscv64-* \
+	| rl78-* | romp-* | rs6000-* | rx-* \
 	| sh-* | sh[1234]-* | sh[24]a-* | sh[24]aeb-* | sh[23]e-* | sh[34]eb-* | sheb-* | shbe-* \
 	| shle-* | sh[1234]le-* | sh3ele-* | sh64-* | sh64le-* \
 	| sparc-* | sparc64-* | sparc64b-* | sparc64v-* | sparc86x-* | sparclet-* \
 	| sparclite-* \
-	| sparcv8-* | sparcv9-* | sparcv9b-* | sparcv9v-* | strongarm-* | sv1-* | sx?-* \
-	| tahoe-* | thumb-* \
-	| tic30-* | tic4x-* | tic54x-* | tic55x-* | tic6x-* | tic80-* | tile-* \
+	| sparcv8-* | sparcv9-* | sparcv9b-* | sparcv9v-* | sv1-* | sx*-* \
+	| tahoe-* \
+	| tic30-* | tic4x-* | tic54x-* | tic55x-* | tic6x-* | tic80-* \
+	| tile*-* \
 	| tron-* \
 	| ubicom32-* \
-	| v850-* | v850e-* | vax-* \
+	| v850-* | v850e-* | v850e1-* | v850es-* | v850e2-* | v850e2v3-* \
+	| vax-* \
+	| visium-* \
 	| we32k-* \
-	| x86-* | x86_64-* | xc16x-* | xps100-* | xscale-* | xscalee[bl]-* \
+	| x86-* | x86_64-* | xc16x-* | xps100-* \
 	| xstormy16-* | xtensa*-* \
 	| ymp-* \
 	| z8k-* | z80-*)
@@ -410,7 +470,7 @@
 		basic_machine=a29k-amd
 		os=-udi
 		;;
-    	abacus)
+	abacus)
 		basic_machine=abacus-unknown
 		;;
 	adobe68k)
@@ -460,6 +520,9 @@
 		basic_machine=i386-pc
 		os=-aros
 		;;
+	asmjs)
+		basic_machine=asmjs-unknown
+		;;
 	aux)
 		basic_machine=m68k-apple
 		os=-aux
@@ -480,11 +543,20 @@
 		basic_machine=powerpc-ibm
 		os=-cnk
 		;;
+	c54x-*)
+		basic_machine=tic54x-`echo $basic_machine | sed 's/^[^-]*-//'`
+		;;
+	c55x-*)
+		basic_machine=tic55x-`echo $basic_machine | sed 's/^[^-]*-//'`
+		;;
+	c6x-*)
+		basic_machine=tic6x-`echo $basic_machine | sed 's/^[^-]*-//'`
+		;;
 	c90)
 		basic_machine=c90-cray
 		os=-unicos
 		;;
-        cegcc)
+	cegcc)
 		basic_machine=arm-unknown
 		os=-cegcc
 		;;
@@ -516,7 +588,7 @@
 		basic_machine=craynv-cray
 		os=-unicosmp
 		;;
-	cr16)
+	cr16 | cr16-*)
 		basic_machine=cr16-unknown
 		os=-elf
 		;;
@@ -674,7 +746,6 @@
 	i370-ibm* | ibm*)
 		basic_machine=i370-ibm
 		;;
-# I'm not sure what "Sysv32" means.  Should this be sysv3.2?
 	i*86v32)
 		basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'`
 		os=-sysv32
@@ -713,6 +784,9 @@
 		basic_machine=m68k-isi
 		os=-sysv
 		;;
+	leon-*|leon[3-9]-*)
+		basic_machine=sparc-`echo $basic_machine | sed 's/-.*//'`
+		;;
 	m68knommu)
 		basic_machine=m68k-unknown
 		os=-linux
@@ -732,11 +806,15 @@
 		basic_machine=ns32k-utek
 		os=-sysv
 		;;
-        microblaze)
+	microblaze*)
 		basic_machine=microblaze-xilinx
 		;;
+	mingw64)
+		basic_machine=x86_64-pc
+		os=-mingw64
+		;;
 	mingw32)
-		basic_machine=i386-pc
+		basic_machine=i686-pc
 		os=-mingw32
 		;;
 	mingw32ce)
@@ -764,6 +842,10 @@
 		basic_machine=powerpc-unknown
 		os=-morphos
 		;;
+	moxiebox)
+		basic_machine=moxie-unknown
+		os=-moxiebox
+		;;
 	msdos)
 		basic_machine=i386-pc
 		os=-msdos
@@ -771,10 +853,18 @@
 	ms1-*)
 		basic_machine=`echo $basic_machine | sed -e 's/ms1-/mt-/'`
 		;;
+	msys)
+		basic_machine=i686-pc
+		os=-msys
+		;;
 	mvs)
 		basic_machine=i370-ibm
 		os=-mvs
 		;;
+	nacl)
+		basic_machine=le32-unknown
+		os=-nacl
+		;;
 	ncr3000)
 		basic_machine=i486-ncr
 		os=-sysv4
@@ -839,6 +929,12 @@
 	np1)
 		basic_machine=np1-gould
 		;;
+	neo-tandem)
+		basic_machine=neo-tandem
+		;;
+	nse-tandem)
+		basic_machine=nse-tandem
+		;;
 	nsr-tandem)
 		basic_machine=nsr-tandem
 		;;
@@ -921,9 +1017,10 @@
 		;;
 	power)	basic_machine=power-ibm
 		;;
-	ppc)	basic_machine=powerpc-unknown
+	ppc | ppcbe)	basic_machine=powerpc-unknown
 		;;
-	ppc-*)	basic_machine=powerpc-`echo $basic_machine | sed 's/^[^-]*-//'`
+	ppc-* | ppcbe-*)
+		basic_machine=powerpc-`echo $basic_machine | sed 's/^[^-]*-//'`
 		;;
 	ppcle | powerpclittle | ppc-le | powerpc-little)
 		basic_machine=powerpcle-unknown
@@ -948,7 +1045,11 @@
 		basic_machine=i586-unknown
 		os=-pw32
 		;;
-	rdos)
+	rdos | rdos64)
+		basic_machine=x86_64-pc
+		os=-rdos
+		;;
+	rdos32)
 		basic_machine=i386-pc
 		os=-rdos
 		;;
@@ -1017,6 +1118,9 @@
 		basic_machine=i860-stratus
 		os=-sysv4
 		;;
+	strongarm-* | thumb-*)
+		basic_machine=arm-`echo $basic_machine | sed 's/^[^-]*-//'`
+		;;
 	sun2)
 		basic_machine=m68000-sun
 		;;
@@ -1073,20 +1177,8 @@
 		basic_machine=t90-cray
 		os=-unicos
 		;;
-	tic54x | c54x*)
-		basic_machine=tic54x-unknown
-		os=-coff
-		;;
-	tic55x | c55x*)
-		basic_machine=tic55x-unknown
-		os=-coff
-		;;
-	tic6x | c6x*)
-		basic_machine=tic6x-unknown
-		os=-coff
-		;;
 	tile*)
-		basic_machine=tile-unknown
+		basic_machine=$basic_machine-unknown
 		os=-linux-gnu
 		;;
 	tx39)
@@ -1156,6 +1248,9 @@
 	xps | xps100)
 		basic_machine=xps100-honeywell
 		;;
+	xscale-* | xscalee[bl]-*)
+		basic_machine=`echo $basic_machine | sed 's/^xscale/arm/'`
+		;;
 	ymp)
 		basic_machine=ymp-cray
 		os=-unicos
@@ -1253,11 +1348,11 @@
 if [ x"$os" != x"" ]
 then
 case $os in
-        # First match some system type aliases
-        # that might get confused with valid system types.
+	# First match some system type aliases
+	# that might get confused with valid system types.
 	# -solaris* is a basic system type, with this one exception.
-        -auroraux)
-	        os=-auroraux
+	-auroraux)
+		os=-auroraux
 		;;
 	-solaris1 | -solaris1.*)
 		os=`echo $os | sed -e 's|solaris1|sunos4|'`
@@ -1281,28 +1376,30 @@
 	-gnu* | -bsd* | -mach* | -minix* | -genix* | -ultrix* | -irix* \
 	      | -*vms* | -sco* | -esix* | -isc* | -aix* | -cnk* | -sunos | -sunos[34]*\
 	      | -hpux* | -unos* | -osf* | -luna* | -dgux* | -auroraux* | -solaris* \
-	      | -sym* | -kopensolaris* \
+	      | -sym* | -kopensolaris* | -plan9* \
 	      | -amigaos* | -amigados* | -msdos* | -newsos* | -unicos* | -aof* \
-	      | -aos* | -aros* \
+	      | -aos* | -aros* | -cloudabi* | -sortix* \
 	      | -nindy* | -vxsim* | -vxworks* | -ebmon* | -hms* | -mvs* \
 	      | -clix* | -riscos* | -uniplus* | -iris* | -rtu* | -xenix* \
 	      | -hiux* | -386bsd* | -knetbsd* | -mirbsd* | -netbsd* \
-	      | -openbsd* | -solidbsd* \
+	      | -bitrig* | -openbsd* | -solidbsd* | -libertybsd* \
 	      | -ekkobsd* | -kfreebsd* | -freebsd* | -riscix* | -lynxos* \
 	      | -bosx* | -nextstep* | -cxux* | -aout* | -elf* | -oabi* \
 	      | -ptx* | -coff* | -ecoff* | -winnt* | -domain* | -vsta* \
 	      | -udi* | -eabi* | -lites* | -ieee* | -go32* | -aux* \
 	      | -chorusos* | -chorusrdb* | -cegcc* \
-	      | -cygwin* | -pe* | -psos* | -moss* | -proelf* | -rtems* \
-	      | -mingw32* | -linux-gnu* | -linux-newlib* | -linux-uclibc* \
-	      | -uxpv* | -beos* | -mpeix* | -udk* \
+	      | -cygwin* | -msys* | -pe* | -psos* | -moss* | -proelf* | -rtems* \
+	      | -mingw32* | -mingw64* | -linux-gnu* | -linux-android* \
+	      | -linux-newlib* | -linux-musl* | -linux-uclibc* \
+	      | -uxpv* | -beos* | -mpeix* | -udk* | -moxiebox* \
 	      | -interix* | -uwin* | -mks* | -rhapsody* | -darwin* | -opened* \
 	      | -openstep* | -oskit* | -conix* | -pw32* | -nonstopux* \
 	      | -storm-chaos* | -tops10* | -tenex* | -tops20* | -its* \
 	      | -os2* | -vos* | -palmos* | -uclinux* | -nucleus* \
 	      | -morphos* | -superux* | -rtmk* | -rtmk-nova* | -windiss* \
 	      | -powermax* | -dnix* | -nx6 | -nx7 | -sei* | -dragonfly* \
-	      | -skyos* | -haiku* | -rdos* | -toppers* | -drops* | -es*)
+	      | -skyos* | -haiku* | -rdos* | -toppers* | -drops* | -es* \
+	      | -onefs* | -tirtos*)
 	# Remember, each alternative MUST END IN *, to match a version number.
 		;;
 	-qnx*)
@@ -1341,7 +1438,7 @@
 	-opened*)
 		os=-openedition
 		;;
-        -os400*)
+	-os400*)
 		os=-os400
 		;;
 	-wince*)
@@ -1390,7 +1487,7 @@
 	-sinix*)
 		os=-sysv4
 		;;
-        -tpf*)
+	-tpf*)
 		os=-tpf
 		;;
 	-triton*)
@@ -1426,15 +1523,16 @@
 	-aros*)
 		os=-aros
 		;;
-	-kaos*)
-		os=-kaos
-		;;
 	-zvmoe)
 		os=-zvmoe
 		;;
 	-dicos*)
 		os=-dicos
 		;;
+	-nacl*)
+		;;
+	-ios)
+		;;
 	-none)
 		;;
 	*)
@@ -1457,10 +1555,10 @@
 # system, and we'll never get to this point.
 
 case $basic_machine in
-        score-*)
+	score-*)
 		os=-elf
 		;;
-        spu-*)
+	spu-*)
 		os=-elf
 		;;
 	*-acorn)
@@ -1472,8 +1570,23 @@
 	arm*-semi)
 		os=-aout
 		;;
-        c4x-* | tic4x-*)
-        	os=-coff
+	c4x-* | tic4x-*)
+		os=-coff
+		;;
+	c8051-*)
+		os=-elf
+		;;
+	hexagon-*)
+		os=-elf
+		;;
+	tic54x-*)
+		os=-coff
+		;;
+	tic55x-*)
+		os=-coff
+		;;
+	tic6x-*)
+		os=-coff
 		;;
 	# This must come before the *-dec entry.
 	pdp10-*)
@@ -1493,14 +1606,11 @@
 		;;
 	m68000-sun)
 		os=-sunos3
-		# This also exists in the configure program, but was not the
-		# default.
-		# os=-sunos4
 		;;
 	m68*-cisco)
 		os=-aout
 		;;
-        mep-*)
+	mep-*)
 		os=-elf
 		;;
 	mips*-cisco)
@@ -1527,7 +1637,7 @@
 	*-ibm)
 		os=-aix
 		;;
-    	*-knuth)
+	*-knuth)
 		os=-mmixware
 		;;
 	*-wec)
src/rvm/patches/ruby/2.1.5/openssl3.patch000066400000003333147511530530014011 0ustar00diff --git a/ext/openssl/extconf.rb b/ext/openssl/extconf.rb
index 8c04cb5..132d803 100644
--- a/ext/openssl/extconf.rb
+++ b/ext/openssl/extconf.rb
@@ -104,6 +104,9 @@
 have_func("SSLv2_method")
 have_func("SSLv2_server_method")
 have_func("SSLv2_client_method")
+have_func("SSLv3_method")
+have_func("SSLv3_server_method")
+have_func("SSLv3_client_method")
 have_func("TLSv1_1_method")
 have_func("TLSv1_1_server_method")
 have_func("TLSv1_1_client_method")
diff --git a/ext/openssl/ossl_ssl.c b/ext/openssl/ossl_ssl.c
index f7cb7f0..47111f6 100644
--- a/ext/openssl/ossl_ssl.c
+++ b/ext/openssl/ossl_ssl.c
@@ -109,9 +109,12 @@ static const struct {
     OSSL_SSL_METHOD_ENTRY(SSLv2_server),
     OSSL_SSL_METHOD_ENTRY(SSLv2_client),
 #endif
+#if defined(HAVE_SSLV3_METHOD) && defined(HAVE_SSLV3_SERVER_METHOD) && \
+        defined(HAVE_SSLV3_CLIENT_METHOD)
     OSSL_SSL_METHOD_ENTRY(SSLv3),
     OSSL_SSL_METHOD_ENTRY(SSLv3_server),
     OSSL_SSL_METHOD_ENTRY(SSLv3_client),
+#endif
     OSSL_SSL_METHOD_ENTRY(SSLv23),
     OSSL_SSL_METHOD_ENTRY(SSLv23_server),
     OSSL_SSL_METHOD_ENTRY(SSLv23_client),
diff --git a/test/openssl/test_ssl.rb b/test/openssl/test_ssl.rb
index 07e081b..0cbfcba 100644
--- a/test/openssl/test_ssl.rb
+++ b/test/openssl/test_ssl.rb
@@ -912,7 +912,7 @@ def test_unset_OP_ALL
   # that has been marked as forbidden, therefore either of these may be raised
   HANDSHAKE_ERRORS = [OpenSSL::SSL::SSLError, Errno::ECONNRESET]

-if OpenSSL::SSL::SSLContext::METHODS.include? :TLSv1
+if OpenSSL::SSL::SSLContext::METHODS.include?(:TLSv1) && OpenSSL::SSL::SSLContext::METHODS.include?(:SSLv3)

   def test_forbid_ssl_v3_for_client
     ctx_proc = Proc.new { |ctx| ctx.options = OpenSSL::SSL::OP_ALL | OpenSSL::SSL::OP_NO_SSLv3 }
src/rvm/patches/ruby/1.8.4/no_sslv2.diff000066400000001252147511530530013624 0ustar00Index: ossl_ssl.c
===================================================================
--- a/ext/openssl/ossl_ssl.c	(revision 32381)
+++ b/ext/openssl/ossl_ssl.c	(revision 32382)
@@ -107,9 +107,12 @@
     OSSL_SSL_METHOD_ENTRY(TLSv1),
     OSSL_SSL_METHOD_ENTRY(TLSv1_server),
     OSSL_SSL_METHOD_ENTRY(TLSv1_client),
+#if defined(HAVE_SSLV2_METHOD) && defined(HAVE_SSLV2_SERVER_METHOD) && \
+        defined(HAVE_SSLV2_CLIENT_METHOD)	
     OSSL_SSL_METHOD_ENTRY(SSLv2),
     OSSL_SSL_METHOD_ENTRY(SSLv2_server),
     OSSL_SSL_METHOD_ENTRY(SSLv2_client),
+#endif
     OSSL_SSL_METHOD_ENTRY(SSLv3),
     OSSL_SSL_METHOD_ENTRY(SSLv3_server),
     OSSL_SSL_METHOD_ENTRY(SSLv3_client),
src/rvm/patches/ruby/1.8.4/syck.patch000066400000001147147511530530013222 0ustar00diff --git a/ext/syck/rubyext.c b/ext/syck/rubyext.c
index 078de4f..8c4027f 100644
--- a/ext/syck/rubyext.c
+++ b/ext/syck/rubyext.c
@@ -268,9 +268,13 @@ rb_syck_mktime(str, len)
     {
         char padded[] = "000000";
         char *end = ptr + 1;
+        char *p = end;
         while ( isdigit( *end ) ) end++;
-        MEMCPY(padded, ptr + 1, char, end - (ptr + 1));
-        usec = strtol(padded, NULL, 10);
+        if (end - p < sizeof(padded)) {
+            MEMCPY(padded, ptr + 1, char, end - (ptr + 1));
+            p = padded;
+        }
+        usec = strtol(p, NULL, 10);
     }
     else
     {
src/rvm/patches/ruby/1.8.4/railsbench.patch000066400000030257147511530530014367 0ustar00--- gc.c.orig	2005-12-16 05:58:51.000000000 +0100
+++ gc.c	2006-07-16 14:46:55.890625000 +0200
@@ -22,8 +22,16 @@
 #include <setjmp.h>
 #include <sys/types.h>
 
+#ifdef _WIN32
+#include <string.h>
+#else
+#include <strings.h>
+#endif
+
 #ifdef HAVE_SYS_TIME_H
 #include <sys/time.h>
+#elif defined(_WIN32)
+#include <time.h> 
 #endif
 
 #ifdef HAVE_SYS_RESOURCE_H
@@ -175,8 +183,17 @@
 	RUBY_CRITICAL(free(x));
 }
 
+#if HAVE_LONG_LONG
+#define GC_TIME_TYPE LONG_LONG
+#else
+#define GC_TIME_TYPE long
+#endif
+
 extern int ruby_in_compile;
 static int dont_gc;
+static int gc_statistics = 0;
+static GC_TIME_TYPE gc_time = 0;
+static int gc_collections = 0;
 static int during_gc;
 static int need_call_final = 0;
 static st_table *finalizer_table = 0;
@@ -211,7 +228,7 @@
  *  Disables garbage collection, returning <code>true</code> if garbage
  *  collection was already disabled.
  *
- *     GC.disable   #=> false
+ *     GC.disable   #=> false or true
  *     GC.disable   #=> true
  *
  */
@@ -225,6 +242,104 @@
     return old;
 }
 
+/*
+ *  call-seq:
+ *     GC.enable_stats    => true or false
+ *
+ *  Enables garbage collection statistics, returning <code>true</code> if garbage
+ *  collection statistics was already enabled.
+ *
+ *     GC.enable_stats   #=> false or true
+ *     GC.enable_stats   #=> true
+ *
+ */
+
+VALUE
+rb_gc_enable_stats()
+{
+    int old = gc_statistics;
+    gc_statistics = Qtrue;
+    return old;
+}
+
+/*
+ *  call-seq:
+ *     GC.disable_stats    => true or false
+ *
+ *  Disables garbage collection statistics, returning <code>true</code> if garbage
+ *  collection statistics was already disabled.
+ *
+ *     GC.disable_stats   #=> false or true
+ *     GC.disable_stats   #=> true
+ *
+ */
+
+VALUE
+rb_gc_disable_stats()
+{
+    int old = gc_statistics;
+    gc_statistics = Qfalse;
+    return old;
+}
+
+/*
+ *  call-seq:
+ *     GC.clear_stats    => nil
+ *
+ *  Clears garbage collection statistics, returning nil. This resets the number
+ *  of collections (GC.collections) and the time used (GC.time) to 0.
+ *
+ *     GC.clear_stats    #=> nil
+ *
+ */
+
+VALUE
+rb_gc_clear_stats()
+{
+    gc_collections = 0;
+    gc_time = 0;
+    return Qnil; 
+}
+
+/*
+ *  call-seq:
+ *     GC.collections    => Integer
+ *
+ *  Returns the number of garbage collections performed while GC statistics collection
+ *  was enabled.
+ *
+ *     GC.collections    #=> 35
+ *
+ */
+
+VALUE
+rb_gc_collections()
+{
+    return INT2NUM(gc_collections);
+}
+
+/*
+ *  call-seq:
+ *     GC.time    => Integer
+ *
+ *  Returns the time spent during garbage collection while GC statistics collection
+ *  was enabled (in micro seconds).
+ *
+ *     GC.time    #=> 20000
+ *
+ */
+
+VALUE
+rb_gc_time()
+{
+#if HAVE_LONG_LONG
+    return LL2NUM(gc_time);
+#else
+    return LONG2NUM(gc_time);
+#endif
+}
+
+
 VALUE rb_mGC;
 
 static struct gc_list {
@@ -308,7 +423,7 @@
 static RVALUE *freelist = 0;
 static RVALUE *deferred_final_list = 0;
 
-#define HEAPS_INCREMENT 10
+static int heaps_increment = 10;
 static struct heaps_slot {
     RVALUE *slot;
     int limit;
@@ -316,13 +431,141 @@
 static int heaps_length = 0;
 static int heaps_used   = 0;
 
-#define HEAP_MIN_SLOTS 10000
-static int heap_slots = HEAP_MIN_SLOTS;
+static int heap_min_slots = 10000;
+static int heap_slots = 10000;
 
-#define FREE_MIN  4096
+static int heap_free_min = 4096;
+
+static long initial_malloc_limit = GC_MALLOC_LIMIT;
+
+static int verbose_gc_stats = Qfalse;
+
+static FILE* gc_data_file = NULL;
 
 static RVALUE *himem, *lomem;
 
+static void set_gc_parameters()
+{
+    char *gc_stats_ptr, *min_slots_ptr, *free_min_ptr,
+	*heap_incr_ptr, *malloc_limit_ptr, *gc_heap_file_ptr;
+
+    gc_data_file = stderr;
+    
+    gc_stats_ptr = getenv("RUBY_GC_STATS");
+    if (gc_stats_ptr != NULL) {
+	int gc_stats_i = atoi(gc_stats_ptr);
+	if (gc_stats_i > 0) {
+	    verbose_gc_stats = Qtrue;
+	}
+    }
+    
+    gc_heap_file_ptr = getenv("RUBY_GC_DATA_FILE");
+    if (gc_heap_file_ptr != NULL) {
+	FILE* data_file = fopen(gc_heap_file_ptr, "w"); 
+	if (data_file != NULL) {
+	    gc_data_file = data_file;
+	}
+	else {
+	    fprintf(stderr,
+		    "can't open gc log file %s for writing, using default\n", gc_heap_file_ptr);
+	}
+    }
+
+    min_slots_ptr = getenv("RUBY_HEAP_MIN_SLOTS");
+    if (min_slots_ptr != NULL) {
+	int min_slots_i = atoi(min_slots_ptr);
+        if (verbose_gc_stats) {
+	    fprintf(gc_data_file, "RUBY_HEAP_MIN_SLOTS=%s\n", min_slots_ptr);
+        }
+	if (min_slots_i > 0) {
+	    heap_slots = min_slots_i;
+	    heap_min_slots = min_slots_i;
+	}
+    }
+
+    free_min_ptr = getenv("RUBY_HEAP_FREE_MIN");
+    if (free_min_ptr != NULL) {
+	int free_min_i = atoi(free_min_ptr);
+        if (verbose_gc_stats) {
+	    fprintf(gc_data_file, "RUBY_HEAP_FREE_MIN=%s\n", free_min_ptr);
+	}
+	if (free_min_i > 0) {
+	    heap_free_min = free_min_i;
+	}
+    }
+
+    heap_incr_ptr = getenv("RUBY_HEAP_INCREMENT");
+    if (heap_incr_ptr != NULL) {
+	int heap_incr_i = atoi(heap_incr_ptr);
+        if (verbose_gc_stats) {
+	    fprintf(gc_data_file, "RUBY_HEAP_INCREMENT=%s\n", heap_incr_ptr);
+	}
+	if (heap_incr_i > 0) {
+	    heaps_increment = heap_incr_i;
+	}
+    }
+
+    malloc_limit_ptr = getenv("RUBY_GC_MALLOC_LIMIT");
+    if (malloc_limit_ptr != NULL) {
+	int malloc_limit_i = atol(malloc_limit_ptr);
+        if (verbose_gc_stats) {
+	    fprintf(gc_data_file, "RUBY_GC_MALLOC_LIMIT=%s\n", malloc_limit_ptr);
+	}
+	if (malloc_limit_i > 0) {
+	    initial_malloc_limit = malloc_limit_i;
+	}
+    }
+}
+
+/*
+ *  call-seq:
+ *     GC.dump    => nil
+ *
+ *  dumps information about the current GC data structures to the GC log file
+ *
+ *     GC.dump    #=> nil
+ *
+ */
+
+VALUE
+rb_gc_dump()
+{
+    int i;
+
+    for (i = 0; i < heaps_used; i++) {
+	int heap_size = heaps[i].limit;
+	fprintf(gc_data_file, "HEAP[%2d]: size=%7d\n", i, heap_size);
+    }
+
+    return Qnil;
+}
+
+/*
+ *  call-seq:
+ *     GC.log String  => String
+ *
+ *  Logs string to the GC data file and returns it.
+ *
+ *     GC.log "manual GC call"    #=> "manual GC call"
+ *
+ */
+
+VALUE
+rb_gc_log(self, original_str)
+     VALUE self, original_str;
+{
+    if (original_str == Qnil) {
+        fprintf(gc_data_file, "\n");
+    }
+    else {
+        VALUE str = StringValue(original_str);
+        char *p = RSTRING(str)->ptr;
+        fprintf(gc_data_file, "%s\n", p);
+    }
+    return original_str;
+}
+
+
 static void
 add_heap()
 {
@@ -333,7 +576,7 @@
 	struct heaps_slot *p;
 	int length;
 
-	heaps_length += HEAPS_INCREMENT;
+	heaps_length += heaps_increment;
 	length = heaps_length*sizeof(struct heaps_slot);
 	RUBY_CRITICAL(
 	    if (heaps_used > 0) {
@@ -350,10 +593,10 @@
 	RUBY_CRITICAL(p = heaps[heaps_used].slot = (RVALUE*)malloc(sizeof(RVALUE)*heap_slots));
 	heaps[heaps_used].limit = heap_slots;
 	if (p == 0) {
-	    if (heap_slots == HEAP_MIN_SLOTS) {
+	    if (heap_slots == heap_min_slots) {
 		rb_memerror();
 	    }
-	    heap_slots = HEAP_MIN_SLOTS;
+	    heap_slots = heap_min_slots;
 	    continue;
 	}
 	break;
@@ -1031,6 +1274,39 @@
     }
 }
 
+static char* obj_type(int tp)
+{
+    switch (tp) {
+	case T_NIL    : return "NIL";   
+	case T_OBJECT : return "OBJECT";
+	case T_CLASS  : return "CLASS";
+	case T_ICLASS : return "ICLASS";
+	case T_MODULE : return "MODULE";
+	case T_FLOAT  : return "FLOAT";
+	case T_STRING : return "STRING";
+	case T_REGEXP : return "REGEXP";
+	case T_ARRAY  : return "ARRAY";
+	case T_FIXNUM : return "FIXNUM";
+	case T_HASH   : return "HASH";
+	case T_STRUCT : return "STRUCT";
+	case T_BIGNUM : return "BIGNUM";
+	case T_FILE   : return "FILE";
+	    
+	case T_TRUE   : return "TRUE";
+	case T_FALSE  : return "FALSE";
+	case T_DATA   : return "DATA";
+	case T_MATCH  : return "MATCH";
+	case T_SYMBOL : return "SYMBOL";
+	    
+	case T_BLKTAG : return "BLKTAG";
+	case T_UNDEF  : return "UNDEF";
+	case T_VARMAP : return "VARMAP";
+	case T_SCOPE  : return "SCOPE";
+	case T_NODE   : return "NODE";
+	default: return "____";
+    }
+}
+
 static void
 gc_sweep()
 {
@@ -1039,6 +1315,15 @@
     int i;
     unsigned long live = 0;
 
+    unsigned long really_freed = 0;
+    int free_counts[256];
+    int live_counts[256];
+    int do_gc_stats = gc_statistics & verbose_gc_stats;
+
+    if (do_gc_stats) {
+	for (i = 0 ; i< 256; i++) { free_counts[i] = live_counts[i] = 0; }
+    }
+
     if (ruby_in_compile && ruby_parser_stack_on_heap()) {
 	/* should not reclaim nodes during compilation
            if yacc's semantic stack is not allocated on machine stack */
@@ -1070,6 +1355,9 @@
 	    if (!(p->as.basic.flags & FL_MARK)) {
 		if (p->as.basic.flags) {
 		    obj_free((VALUE)p);
+		    if (do_gc_stats) {
+			really_freed++;
+		    }
 		}
 		if (need_call_final && FL_TEST(p, FL_FINALIZE)) {
 		    p->as.free.flags = FL_MARK; /* remain marked */
@@ -1077,6 +1365,12 @@
 		    final_list = p;
 		}
 		else {
+		    if (do_gc_stats) {
+			int obt = p->as.basic.flags & T_MASK;
+			if (obt) {
+			    free_counts[obt]++;
+			}
+		    }
 		    p->as.free.flags = 0;
 		    p->as.free.next = freelist;
 		    freelist = p;
@@ -1090,10 +1384,13 @@
 	    else {
 		RBASIC(p)->flags &= ~FL_MARK;
 		live++;
+		if (do_gc_stats) {
+		    live_counts[RANY((VALUE)p)->as.basic.flags & T_MASK]++;
+		}
 	    }
 	    p++;
 	}
-	if (n == heaps[i].limit && freed > FREE_MIN) {
+	if (n == heaps[i].limit && freed > heap_free_min) {
 	    RVALUE *pp;
 
 	    heaps[i].limit = 0;
@@ -1108,14 +1405,28 @@
     }
     if (malloc_increase > malloc_limit) {
 	malloc_limit += (malloc_increase - malloc_limit) * (double)live / (live + freed);
-	if (malloc_limit < GC_MALLOC_LIMIT) malloc_limit = GC_MALLOC_LIMIT;
+	if (malloc_limit < initial_malloc_limit) malloc_limit = initial_malloc_limit;
     }
     malloc_increase = 0;
-    if (freed < FREE_MIN) {
+    if (freed < heap_free_min) {
 	add_heap();
     }
     during_gc = 0;
 
+    if (do_gc_stats) {
+	fprintf(gc_data_file, "objects processed: %.7d\n", live+freed);
+	fprintf(gc_data_file, "live objects     : %.7d\n", live);
+	fprintf(gc_data_file, "freelist objects : %.7d\n", freed - really_freed);
+	fprintf(gc_data_file, "freed objects    : %.7d\n", really_freed);
+	for(i=0; i<256; i++) {
+	    if (free_counts[i]>0) {
+		fprintf(gc_data_file,
+			"kept %.7d / freed %.7d objects of type %s\n",
+			live_counts[i], free_counts[i], obj_type(i));
+	    }
+	}
+    }
+
     /* clear finalization list */
     if (final_list) {
 	deferred_final_list = final_list;
@@ -1311,6 +1622,7 @@
     struct gc_list *list;
     struct FRAME * volatile frame; /* gcc 2.7.2.3 -O2 bug??  */
     jmp_buf save_regs_gc_mark;
+    struct timeval gctv1, gctv2;
     SET_STACK_END;
 
 #ifdef HAVE_NATIVETHREAD
@@ -1327,6 +1639,14 @@
     if (during_gc) return;
     during_gc++;
 
+    if (gc_statistics) {
+        gc_collections++;
+	gettimeofday(&gctv1, NULL);
+        if (verbose_gc_stats) {
+	    fprintf(gc_data_file, "Garbage collection started\n");
+	}
+    }
+
     init_mark_stack();
 
     /* mark frame stack */
@@ -1409,6 +1729,17 @@
 	}
     }
     gc_sweep();
+
+    if (gc_statistics) {
+        GC_TIME_TYPE musecs_used;
+	gettimeofday(&gctv2, NULL);
+	musecs_used = ((GC_TIME_TYPE)(gctv2.tv_sec - gctv1.tv_sec) * 1000000) + (gctv2.tv_usec - gctv1.tv_usec);
+	gc_time += musecs_used;
+
+	if (verbose_gc_stats) {
+	    fprintf(gc_data_file, "GC time: %d msec\n", musecs_used / 1000);
+	}
+    }
 }
 
 void
@@ -1522,6 +1853,7 @@
     if (!rb_gc_stack_start) {
 	Init_stack(0);
     }
+    set_gc_parameters();
     add_heap();
 }
 
@@ -1920,6 +2252,14 @@
     rb_define_singleton_method(rb_mGC, "disable", rb_gc_disable, 0);
     rb_define_method(rb_mGC, "garbage_collect", rb_gc_start, 0);
 
+    rb_define_singleton_method(rb_mGC, "enable_stats", rb_gc_enable_stats, 0);
+    rb_define_singleton_method(rb_mGC, "disable_stats", rb_gc_disable_stats, 0);
+    rb_define_singleton_method(rb_mGC, "clear_stats", rb_gc_clear_stats, 0);
+    rb_define_singleton_method(rb_mGC, "collections", rb_gc_collections, 0);
+    rb_define_singleton_method(rb_mGC, "time", rb_gc_time, 0);
+    rb_define_singleton_method(rb_mGC, "dump", rb_gc_dump, 0);
+    rb_define_singleton_method(rb_mGC, "log", rb_gc_log, 1);
+
     rb_mObSpace = rb_define_module("ObjectSpace");
     rb_define_module_function(rb_mObSpace, "each_object", os_each_obj, -1);
     rb_define_module_function(rb_mObSpace, "garbage_collect", rb_gc_start, 0);
src/rvm/patches/ruby/1.8.4/openssl-1.0.patch000066400000016005147511530530014227 0ustar00From 46b84175dfac14a92fd6bcf3b03bc3c3715ab6cb Mon Sep 17 00:00:00 2001
From: nahi <nahi@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>
Date: Sat, 6 Mar 2010 21:47:30 +0000
Subject: [PATCH] backport the commit from trunk:
 Sun Feb 28 11:49:35 2010  NARUSE, Yui  <naruse@ruby-lang.org>

        * openssl/ossl.c (OSSL_IMPL_SK2ARY): for OpenSSL 1.0.
          patched by Jeroen van Meeuwen at [ruby-core:25210]
          fixed by Nobuyoshi Nakada [ruby-core:25238],
          Hongli Lai [ruby-core:27417],
          and Motohiro KOSAKI [ruby-core:28063]

        * ext/openssl/ossl_ssl.c (ossl_ssl_method_tab),
          (ossl_ssl_cipher_to_ary): constified.

        * ext/openssl/ossl_pkcs7.c (pkcs7_get_certs, pkcs7_get_crls):
          split pkcs7_get_certs_or_crls.


git-svn-id: http://svn.ruby-lang.org/repos/ruby/branches/ruby_1_8@26838 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
---
 ext/openssl/ossl.c          |    6 +++---
 ext/openssl/ossl.h          |    7 +++++++
 ext/openssl/ossl_pkcs7.c    |   40 ++++++++++++++++++++++++++++++----------
 ext/openssl/ossl_ssl.c      |    4 ++--
 ext/openssl/ossl_x509attr.c |    5 +++--
 ext/openssl/ossl_x509crl.c  |    4 ++--
 6 files changed, 47 insertions(+), 19 deletions(-)

diff --git a/ext/openssl/ossl.c b/ext/openssl/ossl.c
index d4a2dc1..85ba654 100644
--- a/ext/openssl/ossl.c
+++ b/ext/openssl/ossl.c
@@ -92,7 +92,7 @@ ossl_x509_ary2sk(VALUE ary)
 
 #define OSSL_IMPL_SK2ARY(name, type)	        \
 VALUE						\
-ossl_##name##_sk2ary(STACK *sk)			\
+ossl_##name##_sk2ary(STACK_OF(type) *sk)	\
 {						\
     type *t;					\
     int i, num;					\
@@ -102,7 +102,7 @@ ossl_##name##_sk2ary(STACK *sk)			\
 	OSSL_Debug("empty sk!");		\
 	return Qnil;				\
     }						\
-    num = sk_num(sk);				\
+    num = sk_##type##_num(sk);			\
     if (num < 0) {				\
 	OSSL_Debug("items in sk < -1???");	\
 	return rb_ary_new();			\
@@ -110,7 +110,7 @@ ossl_##name##_sk2ary(STACK *sk)			\
     ary = rb_ary_new2(num);			\
 						\
     for (i=0; i<num; i++) {			\
-	t = (type *)sk_value(sk, i);		\
+	t = sk_##type##_value(sk, i);		\
 	rb_ary_push(ary, ossl_##name##_new(t));	\
     }						\
     return ary;					\
diff --git a/ext/openssl/ossl.h b/ext/openssl/ossl.h
index 9215dc4..d0edb7d 100644
--- a/ext/openssl/ossl.h
+++ b/ext/openssl/ossl.h
@@ -108,6 +108,13 @@ extern VALUE eOSSLError;
 } while (0)
 
 /*
+ * Compatibility
+ */
+#if OPENSSL_VERSION_NUMBER >= 0x10000000L
+#define STACK _STACK
+#endif
+
+/*
  * String to HEXString conversion
  */
 int string2hex(const unsigned char *, int, char **, int *);
diff --git a/ext/openssl/ossl_pkcs7.c b/ext/openssl/ossl_pkcs7.c
index fe1ef7c..b0cc656 100644
--- a/ext/openssl/ossl_pkcs7.c
+++ b/ext/openssl/ossl_pkcs7.c
@@ -572,12 +572,11 @@ ossl_pkcs7_add_certificate(VALUE self, VALUE cert)
     return self;
 }
 
-static STACK *
-pkcs7_get_certs_or_crls(VALUE self, int want_certs)
+static STACK_OF(X509) *
+pkcs7_get_certs(VALUE self)
 {
     PKCS7 *pkcs7;
     STACK_OF(X509) *certs;
-    STACK_OF(X509_CRL) *crls;
     int i;
 
     GetPKCS7(self, pkcs7);
@@ -585,17 +584,38 @@ pkcs7_get_certs_or_crls(VALUE self, int want_certs)
     switch(i){
     case NID_pkcs7_signed:
         certs = pkcs7->d.sign->cert;
-        crls = pkcs7->d.sign->crl;
         break;
     case NID_pkcs7_signedAndEnveloped:
         certs = pkcs7->d.signed_and_enveloped->cert;
+        break;
+    default:
+        certs = NULL;
+    }
+
+    return certs;
+}
+
+static STACK_OF(X509_CRL) *
+pkcs7_get_crls(VALUE self)
+{
+    PKCS7 *pkcs7;
+    STACK_OF(X509_CRL) *crls;
+    int i;
+
+    GetPKCS7(self, pkcs7);
+    i = OBJ_obj2nid(pkcs7->type);
+    switch(i){
+    case NID_pkcs7_signed:
+        crls = pkcs7->d.sign->crl;
+        break;
+    case NID_pkcs7_signedAndEnveloped:
         crls = pkcs7->d.signed_and_enveloped->crl;
         break;
     default:
-        certs = crls = NULL;
+        crls = NULL;
     }
 
-    return want_certs ? certs : crls;
+    return crls;
 }
 
 static VALUE
@@ -610,7 +630,7 @@ ossl_pkcs7_set_certificates(VALUE self, VALUE ary)
     STACK_OF(X509) *certs;
     X509 *cert;
 
-    certs = pkcs7_get_certs_or_crls(self, 1);
+    certs = pkcs7_get_certs(self);
     while((cert = sk_X509_pop(certs))) X509_free(cert);
     rb_block_call(ary, rb_intern("each"), 0, 0, ossl_pkcs7_set_certs_i, self);
 
@@ -620,7 +640,7 @@ ossl_pkcs7_set_certificates(VALUE self, VALUE ary)
 static VALUE
 ossl_pkcs7_get_certificates(VALUE self)
 {
-    return ossl_x509_sk2ary(pkcs7_get_certs_or_crls(self, 1));
+    return ossl_x509_sk2ary(pkcs7_get_certs(self));
 }
 
 static VALUE
@@ -650,7 +670,7 @@ ossl_pkcs7_set_crls(VALUE self, VALUE ary)
     STACK_OF(X509_CRL) *crls;
     X509_CRL *crl;
 
-    crls = pkcs7_get_certs_or_crls(self, 0);
+    crls = pkcs7_get_crls(self);
     while((crl = sk_X509_CRL_pop(crls))) X509_CRL_free(crl);
     rb_block_call(ary, rb_intern("each"), 0, 0, ossl_pkcs7_set_crls_i, self);
 
@@ -660,7 +680,7 @@ ossl_pkcs7_set_crls(VALUE self, VALUE ary)
 static VALUE
 ossl_pkcs7_get_crls(VALUE self)
 {
-    return ossl_x509crl_sk2ary(pkcs7_get_certs_or_crls(self, 0));
+    return ossl_x509crl_sk2ary(pkcs7_get_crls(self));
 }
 
 static VALUE
diff --git a/ext/openssl/ossl_ssl.c b/ext/openssl/ossl_ssl.c
index 432ca21..facf6ca 100644
--- a/ext/openssl/ossl_ssl.c
+++ b/ext/openssl/ossl_ssl.c
@@ -1291,10 +1291,10 @@ ossl_ssl_get_peer_cert_chain(VALUE self)
     }
     chain = SSL_get_peer_cert_chain(ssl);
     if(!chain) return Qnil;
-    num = sk_num(chain);
+    num = sk_X509_num(chain);
     ary = rb_ary_new2(num);
     for (i = 0; i < num; i++){
-	cert = (X509*)sk_value(chain, i);
+	cert = sk_X509_value(chain, i);
 	rb_ary_push(ary, ossl_x509_new(cert));
     }
 
diff --git a/ext/openssl/ossl_x509attr.c b/ext/openssl/ossl_x509attr.c
index 1f817cd..2a4c481 100644
--- a/ext/openssl/ossl_x509attr.c
+++ b/ext/openssl/ossl_x509attr.c
@@ -218,8 +218,9 @@ ossl_x509attr_get_value(VALUE self)
 	ossl_str_adjust(str, p);
     }
     else{
-	length = i2d_ASN1_SET_OF_ASN1_TYPE(attr->value.set, NULL,
-			i2d_ASN1_TYPE, V_ASN1_SET, V_ASN1_UNIVERSAL, 0);
+	length = i2d_ASN1_SET_OF_ASN1_TYPE(attr->value.set,
+			(unsigned char **) NULL, i2d_ASN1_TYPE,
+			V_ASN1_SET, V_ASN1_UNIVERSAL, 0);
 	str = rb_str_new(0, length);
 	p = (unsigned char *)RSTRING_PTR(str);
 	i2d_ASN1_SET_OF_ASN1_TYPE(attr->value.set, &p,
diff --git a/ext/openssl/ossl_x509crl.c b/ext/openssl/ossl_x509crl.c
index 1be9640..818fdba 100644
--- a/ext/openssl/ossl_x509crl.c
+++ b/ext/openssl/ossl_x509crl.c
@@ -264,7 +264,7 @@ ossl_x509crl_get_revoked(VALUE self)
     VALUE ary, revoked;
 
     GetX509CRL(self, crl);
-    num = sk_X509_CRL_num(X509_CRL_get_REVOKED(crl));
+    num = sk_X509_REVOKED_num(X509_CRL_get_REVOKED(crl));
     if (num < 0) {
 	OSSL_Debug("num < 0???");
 	return rb_ary_new();
@@ -272,7 +272,7 @@ ossl_x509crl_get_revoked(VALUE self)
     ary = rb_ary_new2(num);
     for(i=0; i<num; i++) {
 	/* NO DUP - don't free! */
-	rev = (X509_REVOKED *)sk_X509_CRL_value(X509_CRL_get_REVOKED(crl), i);
+	rev = sk_X509_REVOKED_value(X509_CRL_get_REVOKED(crl), i);
 	revoked = ossl_x509revoked_new(rev);
 	rb_ary_push(ary, revoked);
     }
-- 
1.7.0.3
src/rvm/patches/ruby/1.8.4/backported-ossl-fixes.diff000066400000021562147511530530016275 0ustar00diff -r -u ruby-1.8.5-p231/ext/openssl/extconf.rb ruby-1.8.5-p231-fixed/ext/openssl/extconf.rb
--- ruby-1.8.5-p231/ext/openssl/extconf.rb	2007-02-13 08:01:19.000000000 +0900
+++ ruby-1.8.5-p231-fixed/ext/openssl/extconf.rb	2010-07-13 02:18:18.000000000 +0800
@@ -36,8 +36,6 @@
 message "=== Checking for system dependent stuff... ===\n"
 have_library("nsl", "t_open")
 have_library("socket", "socket")
-have_header("unistd.h")
-have_header("sys/time.h")
 have_header("assert.h")
 
 message "=== Checking for required stuff... ===\n"
@@ -61,6 +59,8 @@
   exit 1
 end
 
+%w"rb_str_set_len rb_block_call".each {|func| have_func(func, "ruby.h")}
+
 message "=== Checking for OpenSSL features... ===\n"
 have_func("ERR_peek_last_error")
 have_func("BN_mod_add")
@@ -83,6 +83,8 @@
 have_func("HMAC_CTX_copy")
 have_func("HMAC_CTX_init")
 have_func("PEM_def_callback")
+have_func("PKCS5_PBKDF2_HMAC")
+have_func("PKCS5_PBKDF2_HMAC_SHA1")
 have_func("X509V3_set_nconf")
 have_func("X509V3_EXT_nconf_nid")
 have_func("X509_CRL_add0_revoked")
@@ -92,6 +94,7 @@
 have_func("X509_STORE_get_ex_data")
 have_func("X509_STORE_set_ex_data")
 have_func("OBJ_NAME_do_all_sorted")
+have_func("SSL_SESSION_get_id")
 have_func("OPENSSL_cleanse")
 if try_compile("#define FOO(a, ...) foo(a, ##__VA_ARGS__)\n int x(){FOO(1);FOO(1,2);FOO(1,2,3);}\n")
   $defs.push("-DHAVE_VA_ARGS_MACRO")
diff -r -u ruby-1.8.5-p231/ext/openssl/openssl_missing.c ruby-1.8.5-p231-fixed/ext/openssl/openssl_missing.c
--- ruby-1.8.5-p231/ext/openssl/openssl_missing.c	2007-02-13 08:01:19.000000000 +0900
+++ ruby-1.8.5-p231-fixed/ext/openssl/openssl_missing.c	2010-07-13 02:22:10.000000000 +0800
@@ -22,17 +22,15 @@
 #include "openssl_missing.h"
 
 #if !defined(HAVE_HMAC_CTX_COPY)
-int
+void
 HMAC_CTX_copy(HMAC_CTX *out, HMAC_CTX *in)
 {
-    if (!out || !in) return 0;
+    if (!out || !in) return;
     memcpy(out, in, sizeof(HMAC_CTX));
 
-    if (!EVP_MD_CTX_copy(&out->md_ctx, &in->md_ctx)
-	    || !EVP_MD_CTX_copy(&out->i_ctx, &in->i_ctx)
-	    || !EVP_MD_CTX_copy(&out->o_ctx, &in->o_ctx))
-	return 0;
-    return 1;
+    EVP_MD_CTX_copy(&out->md_ctx, &in->md_ctx);
+    EVP_MD_CTX_copy(&out->i_ctx, &in->i_ctx);
+    EVP_MD_CTX_copy(&out->o_ctx, &in->o_ctx);
 }
 #endif /* HAVE_HMAC_CTX_COPY */
 #endif /* NO_HMAC */
diff -r -u ruby-1.8.5-p231/ext/openssl/openssl_missing.h ruby-1.8.5-p231-fixed/ext/openssl/openssl_missing.h
--- ruby-1.8.5-p231/ext/openssl/openssl_missing.h	2007-02-13 08:01:19.000000000 +0900
+++ ruby-1.8.5-p231-fixed/ext/openssl/openssl_missing.h	2010-07-13 02:22:10.000000000 +0800
@@ -15,6 +15,10 @@
 extern "C" {
 #endif
 
+#ifndef TYPEDEF_D2I_OF
+typedef char *d2i_of_void();
+#endif
+
 /*
  * These functions are not included in headers of OPENSSL <= 0.9.6b
  */
@@ -56,14 +60,33 @@
 	(char *(*)())d2i_PKCS7_RECIP_INFO, (char *)ri)
 #endif
 
+#if !defined(HAVE_EVP_MD_CTX_INIT)
 void HMAC_CTX_init(HMAC_CTX *ctx);
-int HMAC_CTX_copy(HMAC_CTX *out, HMAC_CTX *in);
+#endif
+
+#if !defined(HAVE_HMAC_CTX_COPY)
+void HMAC_CTX_copy(HMAC_CTX *out, HMAC_CTX *in);
+#endif
+
+#if !defined(HAVE_HMAC_CTX_CLEANUP)
 void HMAC_CTX_cleanup(HMAC_CTX *ctx);
+#endif
 
+#if !defined(HAVE_EVP_MD_CTX_CREATE)
 EVP_MD_CTX *EVP_MD_CTX_create(void);
+#endif
+
+#if !defined(HAVE_EVP_MD_CTX_INIT)
 void EVP_MD_CTX_init(EVP_MD_CTX *ctx);
+#endif
+
+#if !defined(HAVE_EVP_MD_CTX_CLEANUP)
 int EVP_MD_CTX_cleanup(EVP_MD_CTX *ctx);
+#endif
+
+#if !defined(HAVE_EVP_MD_CTX_DESTROY)
 void EVP_MD_CTX_destroy(EVP_MD_CTX *ctx);
+#endif
 
 #if !defined(HAVE_EVP_CIPHER_CTX_COPY)
 int EVP_CIPHER_CTX_copy(EVP_CIPHER_CTX *out, EVP_CIPHER_CTX *in);
@@ -107,19 +130,54 @@
 #define OPENSSL_cleanse(p, l) memset(p, 0, l)
 #endif
 
+#if !defined(HAVE_X509_STORE_SET_EX_DATA)
 void *X509_STORE_get_ex_data(X509_STORE *str, int idx);
 int X509_STORE_set_ex_data(X509_STORE *str, int idx, void *data);
+#endif
+
+#if !defined(HAVE_X509_CRL_SET_VERSION)
 int X509_CRL_set_version(X509_CRL *x, long version);
+#endif
+
+#if !defined(HAVE_X509_CRL_SET_ISSUER_NAME)
 int X509_CRL_set_issuer_name(X509_CRL *x, X509_NAME *name);
+#endif
+
+#if !defined(HAVE_X509_CRL_SORT)
 int X509_CRL_sort(X509_CRL *c);
+#endif
+
+#if !defined(HAVE_X509_CRL_ADD0_REVOKED)
 int X509_CRL_add0_revoked(X509_CRL *crl, X509_REVOKED *rev);
+#endif
+
+#if !defined(HAVE_BN_MOD_SQR)
 int BN_mod_sqr(BIGNUM *r, const BIGNUM *a, const BIGNUM *m, BN_CTX *ctx);
+#endif
+
+#if !defined(HAVE_BN_MOD_ADD)
 int BN_mod_add(BIGNUM *r, const BIGNUM *a, const BIGNUM *b, const BIGNUM *m, BN_CTX *ctx);
+#endif
+
+#if !defined(HAVE_BN_MOD_SUB)
 int BN_mod_sub(BIGNUM *r, const BIGNUM *a, const BIGNUM *b, const BIGNUM *m, BN_CTX *ctx);
+#endif
+
+#if !defined(HAVE_BN_RAND_RANGE)
 int BN_rand_range(BIGNUM *r, BIGNUM *range);
+#endif
+
+#if !defined(HAVE_BN_PSEUDO_RAND_RANGE)
 int BN_pseudo_rand_range(BIGNUM *r, BIGNUM *range);
+#endif
+
+#if !defined(HAVE_CONF_GET1_DEFAULT_CONFIG_FILE)
 char *CONF_get1_default_config_file(void);
+#endif
+
+#if !defined(HAVE_PEM_DEF_CALLBACK)
 int PEM_def_callback(char *buf, int num, int w, void *key);
+#endif
 
 #if defined(__cplusplus)
 }
diff -r -u ruby-1.8.5-p231/ext/openssl/ossl_hmac.c ruby-1.8.5-p231-fixed/ext/openssl/ossl_hmac.c
--- ruby-1.8.5-p231/ext/openssl/ossl_hmac.c	2007-02-13 08:01:19.000000000 +0900
+++ ruby-1.8.5-p231-fixed/ext/openssl/ossl_hmac.c	2010-07-13 02:18:36.000000000 +0800
@@ -57,6 +57,12 @@
     return obj;
 }
 
+
+/*
+ *  call-seq:
+ *     HMAC.new(key, digest) -> hmac
+ *
+ */
 static VALUE
 ossl_hmac_initialize(VALUE self, VALUE key, VALUE digest)
 {
@@ -64,7 +70,7 @@
 
     StringValue(key);
     GetHMAC(self, ctx);
-    HMAC_Init_ex(ctx, RSTRING(key)->ptr, RSTRING(key)->len,
+    HMAC_Init_ex(ctx, RSTRING_PTR(key), RSTRING_LEN(key),
 		 GetDigestPtr(digest), NULL);
 
     return self;
@@ -81,12 +87,15 @@
     GetHMAC(self, ctx1);
     SafeGetHMAC(other, ctx2);
 
-    if (!HMAC_CTX_copy(ctx1, ctx2)) {
-	ossl_raise(eHMACError, NULL);
-    }
+    HMAC_CTX_copy(ctx1, ctx2);
     return self;
 }
 
+/*
+ *  call-seq:
+ *     hmac.update(string) -> self
+ *
+ */
 static VALUE
 ossl_hmac_update(VALUE self, VALUE data)
 {
@@ -94,7 +103,7 @@
 
     StringValue(data);
     GetHMAC(self, ctx);
-    HMAC_Update(ctx, RSTRING(data)->ptr, RSTRING(data)->len);
+    HMAC_Update(ctx, RSTRING_PTR(data), RSTRING_LEN(data));
 
     return self;
 }
@@ -104,9 +113,7 @@
 {
     HMAC_CTX final;
 
-    if (!HMAC_CTX_copy(&final, ctx)) {
-	ossl_raise(eHMACError, NULL);
-    }
+    HMAC_CTX_copy(&final, ctx);
     if (!(*buf = OPENSSL_malloc(HMAC_size(&final)))) {
 	HMAC_CTX_cleanup(&final);
 	OSSL_Debug("Allocating %d mem", HMAC_size(&final));
@@ -116,6 +123,11 @@
     HMAC_CTX_cleanup(&final);
 }
 
+/*
+ *  call-seq:
+ *     hmac.digest -> aString
+ *
+ */
 static VALUE
 ossl_hmac_digest(VALUE self)
 {
@@ -131,6 +143,11 @@
     return digest;
 }
 
+/*
+ *  call-seq:
+ *     hmac.hexdigest -> aString
+ *
+ */
 static VALUE
 ossl_hmac_hexdigest(VALUE self)
 {
@@ -151,6 +168,27 @@
     return hexdigest;
 }
 
+/*
+ *  call-seq:
+ *     hmac.reset -> self
+ *
+ */
+static VALUE
+ossl_hmac_reset(VALUE self)
+{
+    HMAC_CTX *ctx;
+
+    GetHMAC(self, ctx);
+    HMAC_Init_ex(ctx, NULL, 0, NULL, NULL);
+
+    return self;
+}
+
+/*
+ *  call-seq:
+ *     HMAC.digest(digest, key, data) -> aString
+ *
+ */
 static VALUE
 ossl_hmac_s_digest(VALUE klass, VALUE digest, VALUE key, VALUE data)
 {
@@ -159,12 +197,17 @@
 	
     StringValue(key);
     StringValue(data);
-    buf = HMAC(GetDigestPtr(digest), RSTRING(key)->ptr, RSTRING(key)->len,
-	       RSTRING(data)->ptr, RSTRING(data)->len, NULL, &buf_len);
+    buf = HMAC(GetDigestPtr(digest), RSTRING_PTR(key), RSTRING_LEN(key),
+	       RSTRING_PTR(data), RSTRING_LEN(data), NULL, &buf_len);
 
     return rb_str_new(buf, buf_len);
 }
 
+/*
+ *  call-seq:
+ *     HMAC.digest(digest, key, data) -> aString
+ *
+ */
 static VALUE
 ossl_hmac_s_hexdigest(VALUE klass, VALUE digest, VALUE key, VALUE data)
 {
@@ -175,8 +218,8 @@
     StringValue(key);
     StringValue(data);
 	
-    buf = HMAC(GetDigestPtr(digest), RSTRING(key)->ptr, RSTRING(key)->len,
-	       RSTRING(data)->ptr, RSTRING(data)->len, NULL, &buf_len);
+    buf = HMAC(GetDigestPtr(digest), RSTRING_PTR(key), RSTRING_LEN(key),
+	       RSTRING_PTR(data), RSTRING_LEN(data), NULL, &buf_len);
     if (string2hex(buf, buf_len, &hexbuf, NULL) != 2 * buf_len) {
 	ossl_raise(eHMACError, "Cannot convert buf to hexbuf");
     }
@@ -191,6 +234,10 @@
 void
 Init_ossl_hmac()
 {
+#if 0 /* let rdoc know about mOSSL */
+    mOSSL = rb_define_module("OpenSSL");
+#endif
+
     eHMACError = rb_define_class_under(mOSSL, "HMACError", eOSSLError);
 	
     cHMAC = rb_define_class_under(mOSSL, "HMAC", rb_cObject);
@@ -202,6 +249,7 @@
     rb_define_method(cHMAC, "initialize", ossl_hmac_initialize, 2);
     rb_define_copy_func(cHMAC, ossl_hmac_copy);
 
+    rb_define_method(cHMAC, "reset", ossl_hmac_reset, 0);
     rb_define_method(cHMAC, "update", ossl_hmac_update, 1);
     rb_define_alias(cHMAC, "<<", "update");
     rb_define_method(cHMAC, "digest", ossl_hmac_digest, 0);
src/rvm/patches/ruby/1.8.4/fix-irb-completion.diff000066400000000673147511530530015574 0ustar00diff --git a/lib/irb/completion.rb b/lib/irb/completion.rb
index 000658e..609dca3 100644
--- a/lib/irb/completion.rb
+++ b/lib/irb/completion.rb
@@ -157,7 +157,7 @@ module IRB
 	    end
 	    next if name != "IRB::Context" and 
 	      /^(IRB|SLex|RubyLex|RubyToken)/ =~ name
-	    candidates.concat m.instance_methods(false)
+	    candidates.concat m.instance_methods(false).map { |m| m.to_s }
 	  }
 	  candidates.sort!
 	  candidates.uniq!
src/rvm/patches/ruby/1.8.4/stdout-rouge-fix.patch000066400000001273147511530530015476 0ustar00--- a/lib/mkmf.rb	2009-06-10 09:09:22.000000000 +0200
+++ b/lib/mkmf.rb	2011-11-12 02:53:05.862766935 +0100
@@ -168,19 +168,25 @@
 module Logging
   @log = nil
   @logfile = 'mkmf.log'
-  @orgerr = $stderr.dup
-  @orgout = $stdout.dup
   @postpone = 0
 
   def self::open
     @log ||= File::open(@logfile, 'w')
     @log.sync = true
+    orgerr = $stderr.dup
+    orgout = $stdout.dup
     $stderr.reopen(@log)
     $stdout.reopen(@log)
     yield
   ensure
-    $stderr.reopen(@orgerr)
-    $stdout.reopen(@orgout)
+    if orgerr
+      $stderr.reopen(orgerr)
+      orgerr.close
+    end
+    if orgout
+      $stdout.reopen(orgout)
+      orgout.close
+    end
   end
 
   def self::message(*s)
src/rvm/patches/ruby/2.6.4/fix_string_corruption.patch000066400000000442147511530530016705 0ustar00--- a/symbol.c
+++ b/symbol.c
@@ -743,7 +743,8 @@ rb_str_intern(VALUE str)
 	enc = ascii;
     }
     else {
-	str = rb_str_new_frozen(str);
+    str = rb_str_dup(str);
+    OBJ_FREEZE(str);
     }
     str = rb_fstring(str);
     type = rb_str_symname_type(str, IDSET_ATTRSET_FOR_INTERN);
src/rvm/patches/ruby/2.4.0/random_c_using_NR_prefix.patch000066400000001012147511530530017174 0ustar00--- a/random.c
+++ b/random.c
@@ -505,7 +505,7 @@
     CryptGenRandom(prov, size, seed);
     return 0;
 }
-#elif defined __linux__ && defined SYS_getrandom
+#elif defined __linux__ && defined __NR_getrandom
 #include <linux/random.h>
 
 # ifndef GRND_NONBLOCK
@@ -522,7 +522,7 @@
 	if (!need_secure)
 	    flags = GRND_NONBLOCK;
 	errno = 0;
-	ret = syscall(SYS_getrandom, seed, size, flags);
+	ret = syscall(__NR_getrandom, seed, size, flags);
 	if (errno == ENOSYS) {
 	    ATOMIC_SET(try_syscall, 0);
 	    return -1;
src/rvm/patches/ruby/2.4.0/ruby_2_4_gcc7.patch000066400000003005147511530530014565 0ustar00diff --git a/include/ruby/ruby.h b/include/ruby/ruby.h
index 6144c67234..4aa388849b 100644
--- a/include/ruby/ruby.h
+++ b/include/ruby/ruby.h
@@ -536,7 +536,11 @@ static inline int rb_type(VALUE obj);
 
 #ifdef __GNUC__
 #define RB_GC_GUARD(v) \
-    (*__extension__ ({volatile VALUE *rb_gc_guarded_ptr = &(v); rb_gc_guarded_ptr;}))
+    (*__extension__ ({ \
+       volatile VALUE *rb_gc_guarded_ptr = &(v); \
+       __asm__("" : : "m"(rb_gc_guarded_ptr)); \
+       rb_gc_guarded_ptr; \
+    }))
 #elif defined _MSC_VER
 #pragma optimize("", off)
 static inline volatile VALUE *rb_gc_guarded_ptr(volatile VALUE *ptr) {return ptr;}
diff --git a/marshal.c b/marshal.c
index a9926acf56..7e16d0b024 100644
--- a/marshal.c
+++ b/marshal.c
@@ -1026,7 +1026,7 @@ rb_marshal_dump_limited(VALUE obj, VALUE port, int limit)
     struct dump_arg *arg;
     VALUE wrapper; /* used to avoid memory leak in case of exception */
 
-    wrapper = TypedData_Make_Struct(rb_cData, struct dump_arg, &dump_arg_data, arg);
+    wrapper = TypedData_Make_Struct(0, struct dump_arg, &dump_arg_data, arg);
     arg->dest = 0;
     arg->symbols = st_init_numtable();
     arg->data    = rb_init_identtable();
@@ -2053,7 +2053,7 @@ rb_marshal_load_with_proc(VALUE port, VALUE proc)
     else {
        io_needed();
     }
-    wrapper = TypedData_Make_Struct(rb_cData, struct load_arg, &load_arg_data, arg);
+    wrapper = TypedData_Make_Struct(0, struct load_arg, &load_arg_data, arg);
     arg->infection = infection;
     arg->src = port;
     arg->offset = 0;
src/rvm/patches/ruby/changeset_r53419.diff000066400000001010147511530530014267 0ustar00--- a/lib/rubygems/security.rb	(revision 53418)
+++ b/lib/rubygems/security.rb	(revision 53419)
@@ -340,7 +340,7 @@
   # Digest algorithm used to sign gems
 
   DIGEST_ALGORITHM =
-    if defined?(OpenSSL::Digest) then
+    if defined?(OpenSSL::Digest::SHA1) then
       OpenSSL::Digest::SHA1
     end
 
@@ -356,7 +356,7 @@
   # Algorithm for creating the key pair used to sign gems
 
   KEY_ALGORITHM =
-    if defined?(OpenSSL::PKey) then
+    if defined?(OpenSSL::PKey::RSA) then
       OpenSSL::PKey::RSA
     end
 
src/rvm/patches/ruby/2.1/openssl3.patch000066400000003333147511530530013646 0ustar00diff --git a/ext/openssl/extconf.rb b/ext/openssl/extconf.rb
index 8c04cb5..132d803 100644
--- a/ext/openssl/extconf.rb
+++ b/ext/openssl/extconf.rb
@@ -104,6 +104,9 @@
 have_func("SSLv2_method")
 have_func("SSLv2_server_method")
 have_func("SSLv2_client_method")
+have_func("SSLv3_method")
+have_func("SSLv3_server_method")
+have_func("SSLv3_client_method")
 have_func("TLSv1_1_method")
 have_func("TLSv1_1_server_method")
 have_func("TLSv1_1_client_method")
diff --git a/ext/openssl/ossl_ssl.c b/ext/openssl/ossl_ssl.c
index f7cb7f0..47111f6 100644
--- a/ext/openssl/ossl_ssl.c
+++ b/ext/openssl/ossl_ssl.c
@@ -109,9 +109,12 @@ static const struct {
     OSSL_SSL_METHOD_ENTRY(SSLv2_server),
     OSSL_SSL_METHOD_ENTRY(SSLv2_client),
 #endif
+#if defined(HAVE_SSLV3_METHOD) && defined(HAVE_SSLV3_SERVER_METHOD) && \
+        defined(HAVE_SSLV3_CLIENT_METHOD)
     OSSL_SSL_METHOD_ENTRY(SSLv3),
     OSSL_SSL_METHOD_ENTRY(SSLv3_server),
     OSSL_SSL_METHOD_ENTRY(SSLv3_client),
+#endif
     OSSL_SSL_METHOD_ENTRY(SSLv23),
     OSSL_SSL_METHOD_ENTRY(SSLv23_server),
     OSSL_SSL_METHOD_ENTRY(SSLv23_client),
diff --git a/test/openssl/test_ssl.rb b/test/openssl/test_ssl.rb
index 07e081b..0cbfcba 100644
--- a/test/openssl/test_ssl.rb
+++ b/test/openssl/test_ssl.rb
@@ -912,7 +912,7 @@ def test_unset_OP_ALL
   # that has been marked as forbidden, therefore either of these may be raised
   HANDSHAKE_ERRORS = [OpenSSL::SSL::SSLError, Errno::ECONNRESET]

-if OpenSSL::SSL::SSLContext::METHODS.include? :TLSv1
+if OpenSSL::SSL::SSLContext::METHODS.include?(:TLSv1) && OpenSSL::SSL::SSLContext::METHODS.include?(:SSLv3)

   def test_forbid_ssl_v3_for_client
     ctx_proc = Proc.new { |ctx| ctx.options = OpenSSL::SSL::OP_ALL | OpenSSL::SSL::OP_NO_SSLv3 }
src/rvm/patches/ruby/1.9.1/railsbench.patch000066400000044775147511530530014377 0ustar00diff --git a/a/gc.c b/b/gc.c
index bcdc9af..b380842 100644
--- a/a/gc.c
+++ b/b/gc.c
@@ -23,8 +23,16 @@
 #include <setjmp.h>
 #include <sys/types.h>
 
+#ifdef _WIN32
+#include <string.h>
+#else
+#include <strings.h>
+#endif
+
 #ifdef HAVE_SYS_TIME_H
 #include <sys/time.h>
+#elif defined(_WIN32)
+#include <time.h> 
 #endif
 
 #ifdef HAVE_SYS_RESOURCE_H
@@ -211,11 +219,11 @@ getrusage_time(void)
 	if (objspace->profile.run) {\
 	    size_t count = objspace->profile.count;\
 	    objspace->profile.record[count].heap_use_slots = heaps_used;\
-	    objspace->profile.record[count].heap_live_objects = live;\
+	    objspace->profile.record[count].heap_live_objects = live_objects;\
 	    objspace->profile.record[count].heap_free_objects = freed;\
 	    objspace->profile.record[count].heap_total_objects = heaps_used * HEAP_OBJ_LIMIT;\
 	    objspace->profile.record[count].have_finalize = final_list ? Qtrue : Qfalse;\
-	    objspace->profile.record[count].heap_use_size = live * sizeof(RVALUE);\
+	    objspace->profile.record[count].heap_use_size = live_objects * sizeof(RVALUE);\
 	    objspace->profile.record[count].heap_total_size = heaps_used * (HEAP_OBJ_LIMIT * sizeof(RVALUE));\
 	}\
     } while(0)
@@ -232,7 +240,7 @@ getrusage_time(void)
 	if (objspace->profile.run) {\
 	    size_t count = objspace->profile.count;\
 	    objspace->profile.record[count].heap_total_objects = heaps_used * HEAP_OBJ_LIMIT;\
-	    objspace->profile.record[count].heap_use_size = live * sizeof(RVALUE);\
+	    objspace->profile.record[count].heap_use_size = live_objects * sizeof(RVALUE);\
 	    objspace->profile.record[count].heap_total_size = heaps_used * HEAP_SIZE;\
 	}\
     } while(0)
@@ -372,7 +380,7 @@ rb_objspace_alloc(void)
 {
     rb_objspace_t *objspace = malloc(sizeof(rb_objspace_t));
     memset(objspace, 0, sizeof(*objspace));
-    malloc_limit = GC_MALLOC_LIMIT;
+    malloc_limit = initial_malloc_limit;
     ruby_gc_stress = ruby_initial_gc_stress;
 
     return objspace;
@@ -405,6 +413,170 @@ int ruby_disable_gc_stress = 0;
 static void run_final(rb_objspace_t *objspace, VALUE obj);
 static int garbage_collect(rb_objspace_t *objspace);
 
+static unsigned long live_objects = 0;
+unsigned long rb_os_live_objects()
+{ return live_objects; }
+
+#if defined(HAVE_LONG_LONG)
+static unsigned long long allocated_objects = 0;
+unsigned long long rb_os_allocated_objects()
+{ return allocated_objects; }
+#else
+static unsigned long allocated_objects = 0;
+unsigned long rb_os_allocated_objects()
+{ return allocated_objects; }
+#endif
+
+static int heap_min_slots = HEAP_MIN_SLOTS;
+static int heap_free_min = 4096;
+static double heap_slots_growth_factor = 1.8;
+
+static long initial_malloc_limit = GC_MALLOC_LIMIT;
+static int verbose_gc_stats = Qfalse;
+static FILE* gc_data_file = NULL;
+
+static void set_gc_parameters()
+{
+    char *gc_stats_ptr, *min_slots_ptr, *free_min_ptr, *heap_slots_incr_ptr,
+      *heap_incr_ptr, *malloc_limit_ptr, *gc_heap_file_ptr, *heap_slots_growth_factor_ptr;
+
+    gc_data_file = stderr;
+
+    gc_stats_ptr = getenv("RUBY_GC_STATS");
+    if (gc_stats_ptr != NULL) {
+	int gc_stats_i = atoi(gc_stats_ptr);
+	if (gc_stats_i > 0) {
+	    verbose_gc_stats = Qtrue;
+	}
+    }
+
+    gc_heap_file_ptr = getenv("RUBY_GC_DATA_FILE");
+    if (gc_heap_file_ptr != NULL) {
+	FILE* data_file = fopen(gc_heap_file_ptr, "w");
+	if (data_file != NULL) {
+	    gc_data_file = data_file;
+	}
+	else {
+	    fprintf(stderr,
+		    "can't open gc log file %s for writing, using default\n", gc_heap_file_ptr);
+	}
+    }
+
+    min_slots_ptr = getenv("RUBY_HEAP_MIN_SLOTS");
+    if (min_slots_ptr != NULL) {
+	int min_slots_i = atoi(min_slots_ptr);
+        if (verbose_gc_stats) {
+	    fprintf(gc_data_file, "RUBY_HEAP_MIN_SLOTS=%s\n", min_slots_ptr);
+        }
+	if (min_slots_i > 0) {
+	    heap_min_slots = min_slots_i;
+	}
+    }
+
+    free_min_ptr = getenv("RUBY_HEAP_FREE_MIN");
+    if (free_min_ptr != NULL) {
+	int free_min_i = atoi(free_min_ptr);
+        if (verbose_gc_stats) {
+	    fprintf(gc_data_file, "RUBY_HEAP_FREE_MIN=%s\n", free_min_ptr);
+	}
+	if (free_min_i > 0) {
+	    heap_free_min = free_min_i;
+	}
+    }
+
+    heap_incr_ptr = getenv("RUBY_HEAP_INCREMENT");
+    if (heap_incr_ptr != NULL) {
+	int heap_incr_i = atoi(heap_incr_ptr);
+        if (verbose_gc_stats) {
+	    fprintf(gc_data_file, "RUBY_HEAP_INCREMENT=%s\n", heap_incr_ptr);
+	}
+	if (heap_incr_i > 0) {
+	    (&rb_objspace)->malloc_params.increase = heap_incr_i;
+	}
+    }
+
+    heap_slots_incr_ptr = getenv("RUBY_HEAP_SLOTS_INCREMENT");
+    if (heap_slots_incr_ptr != NULL) {
+	int heap_slots_incr_i = atoi(heap_slots_incr_ptr);
+        if (verbose_gc_stats) {
+	    fprintf(gc_data_file, "RUBY_HEAP_SLOTS_INCREMENT=%s\n", heap_slots_incr_ptr);
+	}
+	if (heap_slots_incr_i > 0) {
+	    (&rb_objspace)->malloc_params.increase = heap_slots_incr_i;
+	}
+    }
+
+    heap_slots_growth_factor_ptr = getenv("RUBY_HEAP_SLOTS_GROWTH_FACTOR");
+    if (heap_slots_growth_factor_ptr != NULL) {
+	double heap_slots_growth_factor_d = atoi(heap_slots_growth_factor_ptr);
+        if (verbose_gc_stats) {
+	    fprintf(gc_data_file, "RUBY_HEAP_SLOTS_GROWTH_FACTOR=%s\n", heap_slots_growth_factor_ptr);
+	}
+	if (heap_slots_growth_factor_d > 0) {
+	    heap_slots_growth_factor = heap_slots_growth_factor_d;
+	}
+    }
+
+    malloc_limit_ptr = getenv("RUBY_GC_MALLOC_LIMIT");
+    if (malloc_limit_ptr != NULL) {
+	int malloc_limit_i = atol(malloc_limit_ptr);
+        if (verbose_gc_stats) {
+	    fprintf(gc_data_file, "RUBY_GC_MALLOC_LIMIT=%s\n", malloc_limit_ptr);
+	}
+	if (malloc_limit_i > 0) {
+	    initial_malloc_limit = malloc_limit_i;
+	}
+    }
+}
+
+/*
+ *  call-seq:
+ *     GC.dump    => nil
+ *
+ *  dumps information about the current GC data structures to the GC log file
+ *
+ *     GC.dump    #=> nil
+ *
+ */
+
+VALUE
+rb_gc_dump()
+{
+    int i;
+    rb_objspace_t *objspace = &rb_objspace;
+
+    for (i = 0; i < heaps_used; i++) {
+        int heap_size = heaps[i].limit;
+        fprintf(gc_data_file, "HEAP[%2d]: size=%7d\n", i, heap_size);
+    }
+
+    return Qnil;
+}
+
+/*
+ *  call-seq:
+ *     GC.log String  => String
+ *
+ *  Logs string to the GC data file and returns it.
+ *
+ *     GC.log "manual GC call"    #=> "manual GC call"
+ *
+ */
+
+VALUE
+rb_gc_log(VALUE self, VALUE original_str)
+{
+    if (original_str == Qnil) {
+        fprintf(gc_data_file, "\n");
+    }
+    else {
+        VALUE str = StringValue(original_str);
+        char *p = RSTRING_PTR(str);
+        fprintf(gc_data_file, "%s\n", p);
+    }
+    return original_str;
+}
+
 void
 rb_global_variable(VALUE *var)
 {
@@ -454,6 +626,10 @@ rb_memerror(void)
     rb_exc_raise(nomem_error);
 }
 
+long gc_allocated_size = 0;
+long gc_num_allocations = 0;
+static int gc_statistics = 0;
+
 /*
  *  call-seq:
  *    GC.stress                 => true or false
@@ -699,6 +875,10 @@ vm_xfree(rb_objspace_t *objspace, void *ptr)
 void *
 ruby_xmalloc(size_t size)
 {
+    if (gc_statistics) {
+      gc_allocated_size += size;
+      gc_num_allocations += 1;
+    }
     return vm_xmalloc(&rb_objspace, size);
 }
 
@@ -744,6 +924,13 @@ ruby_xfree(void *x)
       vm_xfree(&rb_objspace, x);
 }
 
+#if HAVE_LONG_LONG
+#define GC_TIME_TYPE LONG_LONG
+#else
+#define GC_TIME_TYPE long
+#endif
+static GC_TIME_TYPE gc_time = 0;
+static int gc_collections = 0;
 
 /*
  *  call-seq:
@@ -775,7 +962,7 @@ rb_gc_enable(void)
  *  Disables garbage collection, returning <code>true</code> if garbage
  *  collection was already disabled.
  *
- *     GC.disable   #=> false
+ *     GC.disable   #=> false or true
  *     GC.disable   #=> true
  *
  */
@@ -790,6 +977,139 @@ rb_gc_disable(void)
     return old;
 }
 
+/*
+ *  call-seq:
+ *     GC.enable_stats    => true or false
+ *
+ *  Enables garbage collection statistics, returning <code>true</code> if garbage
+ *  collection statistics was already enabled.
+ *
+ *     GC.enable_stats   #=> false or true
+ *     GC.enable_stats   #=> true
+ *
+ */
+
+VALUE
+rb_gc_enable_stats()
+{
+    int old = gc_statistics;
+    gc_statistics = Qtrue;
+    return old;
+}
+
+/*
+ *  call-seq:
+ *     GC.disable_stats    => true or false
+ *
+ *  Disables garbage collection statistics, returning <code>true</code> if garbage
+ *  collection statistics was already disabled.
+ *
+ *     GC.disable_stats   #=> false or true
+ *     GC.disable_stats   #=> true
+ *
+ */
+
+VALUE
+rb_gc_disable_stats()
+{
+    int old = gc_statistics;
+    gc_statistics = Qfalse;
+    gc_allocated_size = 0;
+    gc_num_allocations = 0;
+    return old;
+}
+
+/*
+ *  call-seq:
+ *     GC.clear_stats    => nil
+ *
+ *  Clears garbage collection statistics, returning nil. This resets the number
+ *  of collections (GC.collections) and the time used (GC.time) to 0.
+ *
+ *     GC.clear_stats    #=> nil
+ *
+ */
+
+VALUE
+rb_gc_clear_stats()
+{
+    gc_collections = 0;
+    gc_time = 0;
+    gc_allocated_size = 0;
+    gc_num_allocations = 0;
+    return Qnil; 
+}
+
+/*
+ *  call-seq:
+ *     GC.allocated_size    => Integer
+ *
+ *  Returns the size of memory (in bytes) allocated since GC statistics collection
+ *  was enabled.
+ *
+ *     GC.allocated_size    #=> 35
+ *
+ */
+VALUE
+rb_gc_allocated_size()
+{
+    return INT2NUM(gc_allocated_size);
+}
+
+/*
+ *  call-seq:
+ *     GC.num_allocations    => Integer
+ *
+ *  Returns the number of memory allocations since GC statistics collection
+ *  was enabled.
+ *
+ *     GC.num_allocations    #=> 150
+ *
+ */
+VALUE
+rb_gc_num_allocations()
+{
+    return INT2NUM(gc_num_allocations);
+}
+
+/*
+ *  call-seq:
+ *     GC.collections    => Integer
+ *
+ *  Returns the number of garbage collections performed while GC statistics collection
+ *  was enabled.
+ *
+ *     GC.collections    #=> 35
+ *
+ */
+
+VALUE
+rb_gc_collections()
+{
+    return INT2NUM(gc_collections);
+}
+
+/*
+ *  call-seq:
+ *     GC.time    => Integer
+ *
+ *  Returns the time spent during garbage collection while GC statistics collection
+ *  was enabled (in micro seconds).
+ *
+ *     GC.time    #=> 20000
+ *
+ */
+
+VALUE
+rb_gc_time()
+{
+#if HAVE_LONG_LONG
+    return LL2NUM(gc_time);
+#else
+    return LONG2NUM(gc_time);
+#endif
+}
+
 VALUE rb_mGC;
 
 void
@@ -921,7 +1241,7 @@ init_heap(rb_objspace_t *objspace)
 {
     size_t add, i;
 
-    add = HEAP_MIN_SLOTS / HEAP_OBJ_LIMIT;
+    add = heap_min_slots / HEAP_OBJ_LIMIT;
 
     if ((heaps_used + add) > heaps_length) {
     	allocate_heaps(objspace, heaps_used + add);
@@ -934,12 +1254,12 @@ init_heap(rb_objspace_t *objspace)
     objspace->profile.invoke_time = getrusage_time();
 }
 
-
 static void
 set_heaps_increment(rb_objspace_t *objspace)
 {
-    size_t next_heaps_length = heaps_used * 1.8;
+    size_t next_heaps_length = heaps_used * heap_slots_growth_factor;
     heaps_inc = next_heaps_length - heaps_used;
+    if (next_heaps_length <= 0) next_heaps_length = heap_min_slots;
 
     if (next_heaps_length > heaps_length) {
 	allocate_heaps(objspace, next_heaps_length);
@@ -980,6 +1300,8 @@ rb_newobj_from_heap(rb_objspace_t *objspace)
     RANY(obj)->line = rb_sourceline();
 #endif
 
+    live_objects++;
+    allocated_objects++;
     return obj;
 }
 
@@ -1671,6 +1993,39 @@ finalize_list(rb_objspace_t *objspace, RVALUE *p)
     }
 }
 
+static char* obj_type(int tp)
+{
+    switch (tp) {
+	case T_NIL    : return "NIL";   
+	case T_OBJECT : return "OBJECT";
+	case T_CLASS  : return "CLASS";
+	case T_ICLASS : return "ICLASS";
+	case T_MODULE : return "MODULE";
+	case T_FLOAT  : return "FLOAT";
+	case T_STRING : return "STRING";
+	case T_REGEXP : return "REGEXP";
+	case T_ARRAY  : return "ARRAY";
+	case T_FIXNUM : return "FIXNUM";
+	case T_HASH   : return "HASH";
+	case T_STRUCT : return "STRUCT";
+	case T_BIGNUM : return "BIGNUM";
+	case T_FILE   : return "FILE";
+	    
+	case T_TRUE   : return "TRUE";
+	case T_FALSE  : return "FALSE";
+	case T_DATA   : return "DATA";
+	case T_MATCH  : return "MATCH";
+	case T_SYMBOL : return "SYMBOL";
+	    
+	//case T_BLKTAG : return "BLKTAG";
+	case T_UNDEF  : return "UNDEF";
+	case T_RATIONAL : return "RATIONAL";
+	case T_COMPLEX  : return "COMPLEX";
+	case T_NODE   : return "NODE";
+	default: return "____";
+    }
+}
+
 static void
 free_unused_heaps(rb_objspace_t *objspace)
 {
@@ -1711,14 +2066,24 @@ gc_sweep(rb_objspace_t *objspace)
     RVALUE *p, *pend, *final_list;
     size_t freed = 0;
     size_t i;
-    size_t live = 0, free_min = 0, do_heap_free = 0;
+    size_t free_min = 0, do_heap_free = 0;
+    live_objects = 0;
+
+    unsigned long really_freed = 0;
+    int free_counts[256];
+    int live_counts[256];
+    int do_gc_stats = gc_statistics & verbose_gc_stats;
 
     do_heap_free = (heaps_used * HEAP_OBJ_LIMIT) * 0.65;
     free_min = (heaps_used * HEAP_OBJ_LIMIT)  * 0.2;
 
-    if (free_min < FREE_MIN) {
+    if (free_min < heap_free_min) {
 	do_heap_free = heaps_used * HEAP_OBJ_LIMIT;
-        free_min = FREE_MIN;
+        free_min = heap_free_min;
+    }
+    
+    if (do_gc_stats) {
+	for (i = 0 ; i< 256; i++) { free_counts[i] = live_counts[i] = 0; }
     }
 
     freelist = 0;
@@ -1739,6 +2104,9 @@ gc_sweep(rb_objspace_t *objspace)
 		    if (!deferred) {
 			p->as.free.flags = T_ZOMBIE;
 			RDATA(p)->dfree = 0;
+	    if (do_gc_stats) {
+  			really_freed++;
+	    }
 		    }
 		    p->as.free.flags |= FL_MARK;
 		    p->as.free.next = final_list;
@@ -1746,6 +2114,12 @@ gc_sweep(rb_objspace_t *objspace)
 		    final_num++;
 		}
 		else {
+	      if (do_gc_stats) {
+			    int obt = p->as.basic.flags & T_MASK;
+		      if (obt) {
+	      free_counts[obt]++;
+			    }
+	      }
 		    add_freelist(objspace, p);
 		    free_num++;
 		}
@@ -1756,7 +2130,10 @@ gc_sweep(rb_objspace_t *objspace)
 	    }
 	    else {
 		RBASIC(p)->flags &= ~FL_MARK;
-		live++;
+		live_objects++;
+		if (do_gc_stats) {
+ 		    live_counts[RANY((VALUE)p)->as.basic.flags & T_MASK]++;
+ 		}
 	    }
 	    p++;
 	}
@@ -1777,8 +2154,8 @@ gc_sweep(rb_objspace_t *objspace)
     }
     GC_PROF_SET_MALLOC_INFO;
     if (malloc_increase > malloc_limit) {
-	malloc_limit += (malloc_increase - malloc_limit) * (double)live / (live + freed);
-	if (malloc_limit < GC_MALLOC_LIMIT) malloc_limit = GC_MALLOC_LIMIT;
+	malloc_limit += (malloc_increase - malloc_limit) * (double)live_objects / (live_objects + freed);
+	if (malloc_limit < initial_malloc_limit) malloc_limit = initial_malloc_limit;
     }
     malloc_increase = 0;
     if (freed < free_min) {
@@ -1786,6 +2163,20 @@ gc_sweep(rb_objspace_t *objspace)
 	heaps_increment(objspace);
     }
     during_gc = 0;
+    
+    if (do_gc_stats) {
+	fprintf(gc_data_file, "objects processed: %.7d\n", live_objects+freed);
+	fprintf(gc_data_file, "live objects	: %.7d\n", live_objects);
+	fprintf(gc_data_file, "freelist objects : %.7d\n", freed - really_freed);
+	fprintf(gc_data_file, "freed objects	: %.7d\n", really_freed);
+	for(i=0; i<256; i++) {
+	  if (free_counts[i]>0) {
+	fprintf(gc_data_file,
+		"kept %.7d / freed %.7d objects of type %s\n",
+		live_counts[i], free_counts[i], obj_type(i));
+    }
+	}
+    }
 
     /* clear finalization list */
     if (final_list) {
@@ -1994,6 +2385,7 @@ garbage_collect(rb_objspace_t *objspace)
 {
     struct gc_list *list;
     rb_thread_t *th = GET_THREAD();
+    struct timeval gctv1, gctv2;
     INIT_GC_PROF_PARAMS;
 
     if (GC_NOTIFY) printf("start garbage_collect()\n");
@@ -2013,6 +2405,14 @@ garbage_collect(rb_objspace_t *objspace)
     }
     during_gc++;
     objspace->count++;
+    
+    if (gc_statistics) {
+        gc_collections++;
+	      gettimeofday(&gctv1, NULL);
+        if (verbose_gc_stats) {
+	    fprintf(gc_data_file, "Garbage collection started\n");
+	      }
+    }
 
     GC_PROF_TIMER_START;
     GC_PROF_MARK_TIMER_START;
@@ -2060,6 +2460,17 @@ garbage_collect(rb_objspace_t *objspace)
     GC_PROF_SWEEP_TIMER_START;
     gc_sweep(objspace);
     GC_PROF_SWEEP_TIMER_STOP;
+    
+    if (gc_statistics) {
+      GC_TIME_TYPE musecs_used;
+	    gettimeofday(&gctv2, NULL);
+	    musecs_used = ((GC_TIME_TYPE)(gctv2.tv_sec - gctv1.tv_sec) * 1000000) + (gctv2.tv_usec - gctv1.tv_usec);
+	    gc_time += musecs_used;
+
+      if (verbose_gc_stats) {
+    fprintf(gc_data_file, "GC time: %d msec\n", musecs_used / 1000);
+      }
+    }
 
     GC_PROF_TIMER_STOP;
     if (GC_NOTIFY) printf("end garbage_collect()\n");
@@ -2153,6 +2564,7 @@ Init_stack(VALUE *addr)
 void
 Init_heap(void)
 {
+    set_gc_parameters();
     init_heap(&rb_objspace);
 }
 
@@ -2868,6 +3280,34 @@ gc_profile_report(int argc, VALUE *argv, VALUE self)
     return Qnil;
 }
 
+/* call-seq:
+ *  ObjectSpace.live_objects => number
+ *
+ * Returns the count of objects currently allocated in the system. This goes
+ * down after the garbage collector runs.
+ */
+static
+VALUE os_live_objects(VALUE self)
+{ return ULONG2NUM(live_objects); }
+
+/* call-seq:
+ *  ObjectSpace.allocated_objects => number
+ *
+ * Returns the count of objects allocated since the Ruby interpreter has
+ * started.  This number can only increase. To know how many objects are
+ * currently allocated, use ObjectSpace::live_objects
+ */
+static
+VALUE os_allocated_objects(VALUE self)
+{ 
+#if defined(HAVE_LONG_LONG)
+    return ULL2NUM(allocated_objects); 
+#else
+    return ULONG2NUM(allocated_objects); 
+#endif
+}
+
+
 
 /*
  *  The <code>GC</code> module provides an interface to Ruby's mark and
@@ -2897,10 +3337,23 @@ Init_GC(void)
     rb_define_singleton_method(rb_mProfiler, "clear", gc_profile_clear, 0);
     rb_define_singleton_method(rb_mProfiler, "result", gc_profile_result, 0);
     rb_define_singleton_method(rb_mProfiler, "report", gc_profile_report, -1);
+    
+    rb_define_singleton_method(rb_mGC, "enable_stats", rb_gc_enable_stats, 0);
+    rb_define_singleton_method(rb_mGC, "disable_stats", rb_gc_disable_stats, 0);
+    rb_define_singleton_method(rb_mGC, "clear_stats", rb_gc_clear_stats, 0);
+    rb_define_singleton_method(rb_mGC, "allocated_size", rb_gc_allocated_size, 0);
+    rb_define_singleton_method(rb_mGC, "num_allocations", rb_gc_num_allocations, 0);
+    rb_define_singleton_method(rb_mGC, "collections", rb_gc_collections, 0);
+    rb_define_singleton_method(rb_mGC, "time", rb_gc_time, 0);
+    rb_define_singleton_method(rb_mGC, "dump", rb_gc_dump, 0);
+    rb_define_singleton_method(rb_mGC, "log", rb_gc_log, 1);
 
     rb_mObSpace = rb_define_module("ObjectSpace");
     rb_define_module_function(rb_mObSpace, "each_object", os_each_obj, -1);
     rb_define_module_function(rb_mObSpace, "garbage_collect", rb_gc_start, 0);
+    rb_define_module_function(rb_mObSpace, "live_objects", os_live_objects, 0);
+    rb_define_module_function(rb_mObSpace, "allocated_objects", os_allocated_objects, 0);
+
 
     rb_define_module_function(rb_mObSpace, "define_finalizer", define_final, -1);
     rb_define_module_function(rb_mObSpace, "undefine_finalizer", undefine_final, 1);
src/rvm/patches/ruby/1.9.1/openssl-1.0.patch000066400000016005147511530530014225 0ustar00From 46b84175dfac14a92fd6bcf3b03bc3c3715ab6cb Mon Sep 17 00:00:00 2001
From: nahi <nahi@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>
Date: Sat, 6 Mar 2010 21:47:30 +0000
Subject: [PATCH] backport the commit from trunk:
 Sun Feb 28 11:49:35 2010  NARUSE, Yui  <naruse@ruby-lang.org>

        * openssl/ossl.c (OSSL_IMPL_SK2ARY): for OpenSSL 1.0.
          patched by Jeroen van Meeuwen at [ruby-core:25210]
          fixed by Nobuyoshi Nakada [ruby-core:25238],
          Hongli Lai [ruby-core:27417],
          and Motohiro KOSAKI [ruby-core:28063]

        * ext/openssl/ossl_ssl.c (ossl_ssl_method_tab),
          (ossl_ssl_cipher_to_ary): constified.

        * ext/openssl/ossl_pkcs7.c (pkcs7_get_certs, pkcs7_get_crls):
          split pkcs7_get_certs_or_crls.


git-svn-id: http://svn.ruby-lang.org/repos/ruby/branches/ruby_1_8@26838 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
---
 ext/openssl/ossl.c          |    6 +++---
 ext/openssl/ossl.h          |    7 +++++++
 ext/openssl/ossl_pkcs7.c    |   40 ++++++++++++++++++++++++++++++----------
 ext/openssl/ossl_ssl.c      |    4 ++--
 ext/openssl/ossl_x509attr.c |    5 +++--
 ext/openssl/ossl_x509crl.c  |    4 ++--
 6 files changed, 47 insertions(+), 19 deletions(-)

diff --git a/ext/openssl/ossl.c b/ext/openssl/ossl.c
index d4a2dc1..85ba654 100644
--- a/ext/openssl/ossl.c
+++ b/ext/openssl/ossl.c
@@ -92,7 +92,7 @@ ossl_x509_ary2sk(VALUE ary)
 
 #define OSSL_IMPL_SK2ARY(name, type)	        \
 VALUE						\
-ossl_##name##_sk2ary(STACK *sk)			\
+ossl_##name##_sk2ary(STACK_OF(type) *sk)	\
 {						\
     type *t;					\
     int i, num;					\
@@ -102,7 +102,7 @@ ossl_##name##_sk2ary(STACK *sk)			\
 	OSSL_Debug("empty sk!");		\
 	return Qnil;				\
     }						\
-    num = sk_num(sk);				\
+    num = sk_##type##_num(sk);			\
     if (num < 0) {				\
 	OSSL_Debug("items in sk < -1???");	\
 	return rb_ary_new();			\
@@ -110,7 +110,7 @@ ossl_##name##_sk2ary(STACK *sk)			\
     ary = rb_ary_new2(num);			\
 						\
     for (i=0; i<num; i++) {			\
-	t = (type *)sk_value(sk, i);		\
+	t = sk_##type##_value(sk, i);		\
 	rb_ary_push(ary, ossl_##name##_new(t));	\
     }						\
     return ary;					\
diff --git a/ext/openssl/ossl.h b/ext/openssl/ossl.h
index 9215dc4..d0edb7d 100644
--- a/ext/openssl/ossl.h
+++ b/ext/openssl/ossl.h
@@ -108,6 +108,13 @@ extern VALUE eOSSLError;
 } while (0)
 
 /*
+ * Compatibility
+ */
+#if OPENSSL_VERSION_NUMBER >= 0x10000000L
+#define STACK _STACK
+#endif
+
+/*
  * String to HEXString conversion
  */
 int string2hex(const unsigned char *, int, char **, int *);
diff --git a/ext/openssl/ossl_pkcs7.c b/ext/openssl/ossl_pkcs7.c
index fe1ef7c..b0cc656 100644
--- a/ext/openssl/ossl_pkcs7.c
+++ b/ext/openssl/ossl_pkcs7.c
@@ -572,12 +572,11 @@ ossl_pkcs7_add_certificate(VALUE self, VALUE cert)
     return self;
 }
 
-static STACK *
-pkcs7_get_certs_or_crls(VALUE self, int want_certs)
+static STACK_OF(X509) *
+pkcs7_get_certs(VALUE self)
 {
     PKCS7 *pkcs7;
     STACK_OF(X509) *certs;
-    STACK_OF(X509_CRL) *crls;
     int i;
 
     GetPKCS7(self, pkcs7);
@@ -585,17 +584,38 @@ pkcs7_get_certs_or_crls(VALUE self, int want_certs)
     switch(i){
     case NID_pkcs7_signed:
         certs = pkcs7->d.sign->cert;
-        crls = pkcs7->d.sign->crl;
         break;
     case NID_pkcs7_signedAndEnveloped:
         certs = pkcs7->d.signed_and_enveloped->cert;
+        break;
+    default:
+        certs = NULL;
+    }
+
+    return certs;
+}
+
+static STACK_OF(X509_CRL) *
+pkcs7_get_crls(VALUE self)
+{
+    PKCS7 *pkcs7;
+    STACK_OF(X509_CRL) *crls;
+    int i;
+
+    GetPKCS7(self, pkcs7);
+    i = OBJ_obj2nid(pkcs7->type);
+    switch(i){
+    case NID_pkcs7_signed:
+        crls = pkcs7->d.sign->crl;
+        break;
+    case NID_pkcs7_signedAndEnveloped:
         crls = pkcs7->d.signed_and_enveloped->crl;
         break;
     default:
-        certs = crls = NULL;
+        crls = NULL;
     }
 
-    return want_certs ? certs : crls;
+    return crls;
 }
 
 static VALUE
@@ -610,7 +630,7 @@ ossl_pkcs7_set_certificates(VALUE self, VALUE ary)
     STACK_OF(X509) *certs;
     X509 *cert;
 
-    certs = pkcs7_get_certs_or_crls(self, 1);
+    certs = pkcs7_get_certs(self);
     while((cert = sk_X509_pop(certs))) X509_free(cert);
     rb_block_call(ary, rb_intern("each"), 0, 0, ossl_pkcs7_set_certs_i, self);
 
@@ -620,7 +640,7 @@ ossl_pkcs7_set_certificates(VALUE self, VALUE ary)
 static VALUE
 ossl_pkcs7_get_certificates(VALUE self)
 {
-    return ossl_x509_sk2ary(pkcs7_get_certs_or_crls(self, 1));
+    return ossl_x509_sk2ary(pkcs7_get_certs(self));
 }
 
 static VALUE
@@ -650,7 +670,7 @@ ossl_pkcs7_set_crls(VALUE self, VALUE ary)
     STACK_OF(X509_CRL) *crls;
     X509_CRL *crl;
 
-    crls = pkcs7_get_certs_or_crls(self, 0);
+    crls = pkcs7_get_crls(self);
     while((crl = sk_X509_CRL_pop(crls))) X509_CRL_free(crl);
     rb_block_call(ary, rb_intern("each"), 0, 0, ossl_pkcs7_set_crls_i, self);
 
@@ -660,7 +680,7 @@ ossl_pkcs7_set_crls(VALUE self, VALUE ary)
 static VALUE
 ossl_pkcs7_get_crls(VALUE self)
 {
-    return ossl_x509crl_sk2ary(pkcs7_get_certs_or_crls(self, 0));
+    return ossl_x509crl_sk2ary(pkcs7_get_crls(self));
 }
 
 static VALUE
diff --git a/ext/openssl/ossl_ssl.c b/ext/openssl/ossl_ssl.c
index 432ca21..facf6ca 100644
--- a/ext/openssl/ossl_ssl.c
+++ b/ext/openssl/ossl_ssl.c
@@ -1291,10 +1291,10 @@ ossl_ssl_get_peer_cert_chain(VALUE self)
     }
     chain = SSL_get_peer_cert_chain(ssl);
     if(!chain) return Qnil;
-    num = sk_num(chain);
+    num = sk_X509_num(chain);
     ary = rb_ary_new2(num);
     for (i = 0; i < num; i++){
-	cert = (X509*)sk_value(chain, i);
+	cert = sk_X509_value(chain, i);
 	rb_ary_push(ary, ossl_x509_new(cert));
     }
 
diff --git a/ext/openssl/ossl_x509attr.c b/ext/openssl/ossl_x509attr.c
index 1f817cd..2a4c481 100644
--- a/ext/openssl/ossl_x509attr.c
+++ b/ext/openssl/ossl_x509attr.c
@@ -218,8 +218,9 @@ ossl_x509attr_get_value(VALUE self)
 	ossl_str_adjust(str, p);
     }
     else{
-	length = i2d_ASN1_SET_OF_ASN1_TYPE(attr->value.set, NULL,
-			i2d_ASN1_TYPE, V_ASN1_SET, V_ASN1_UNIVERSAL, 0);
+	length = i2d_ASN1_SET_OF_ASN1_TYPE(attr->value.set,
+			(unsigned char **) NULL, i2d_ASN1_TYPE,
+			V_ASN1_SET, V_ASN1_UNIVERSAL, 0);
 	str = rb_str_new(0, length);
 	p = (unsigned char *)RSTRING_PTR(str);
 	i2d_ASN1_SET_OF_ASN1_TYPE(attr->value.set, &p,
diff --git a/ext/openssl/ossl_x509crl.c b/ext/openssl/ossl_x509crl.c
index 1be9640..818fdba 100644
--- a/ext/openssl/ossl_x509crl.c
+++ b/ext/openssl/ossl_x509crl.c
@@ -264,7 +264,7 @@ ossl_x509crl_get_revoked(VALUE self)
     VALUE ary, revoked;
 
     GetX509CRL(self, crl);
-    num = sk_X509_CRL_num(X509_CRL_get_REVOKED(crl));
+    num = sk_X509_REVOKED_num(X509_CRL_get_REVOKED(crl));
     if (num < 0) {
 	OSSL_Debug("num < 0???");
 	return rb_ary_new();
@@ -272,7 +272,7 @@ ossl_x509crl_get_revoked(VALUE self)
     ary = rb_ary_new2(num);
     for(i=0; i<num; i++) {
 	/* NO DUP - don't free! */
-	rev = (X509_REVOKED *)sk_X509_CRL_value(X509_CRL_get_REVOKED(crl), i);
+	rev = sk_X509_REVOKED_value(X509_CRL_get_REVOKED(crl), i);
 	revoked = ossl_x509revoked_new(rev);
 	rb_ary_push(ary, revoked);
     }
-- 
1.7.0.3
src/rvm/patches/ruby/1.9.1/nossl2.diff000066400000001225147511530530013275 0ustar00diff --git a/ext/openssl/ossl_ssl.c b/ext/openssl/ossl_ssl.c
index e8d2e86..be62fcc 100644
--- a/ext/openssl/ossl_ssl.c
+++ b/ext/openssl/ossl_ssl.c
@@ -107,9 +107,12 @@ struct {
     OSSL_SSL_METHOD_ENTRY(TLSv1),
     OSSL_SSL_METHOD_ENTRY(TLSv1_server),
     OSSL_SSL_METHOD_ENTRY(TLSv1_client),
+#if defined(HAVE_SSLV2_METHOD) && defined(HAVE_SSLV2_SERVER_METHOD) && \
+        defined(HAVE_SSLV2_CLIENT_METHOD)
     OSSL_SSL_METHOD_ENTRY(SSLv2),
     OSSL_SSL_METHOD_ENTRY(SSLv2_server),
     OSSL_SSL_METHOD_ENTRY(SSLv2_client),
+#endif
     OSSL_SSL_METHOD_ENTRY(SSLv3),
     OSSL_SSL_METHOD_ENTRY(SSLv3_server),
     OSSL_SSL_METHOD_ENTRY(SSLv3_client),
src/rvm/patches/ruby/1.9.1/p431/backport-2404.patch000066400000000740147511530530015130 0ustar00Index: gem_prelude.rb
===================================================================
--- a/gem_prelude.rb	(revision 25926)
+++ b/gem_prelude.rb	(working copy)
@@ -67,7 +67,7 @@
 
     def self.set_home(home)
       home = home.gsub File::ALT_SEPARATOR, File::SEPARATOR if File::ALT_SEPARATOR
-      @gem_home = home.force_encoding(Encoding.find('filesystem'))
+      @gem_home = home.dup.force_encoding(Encoding.find('filesystem'))
     end
 
     def self.set_paths(gpaths)
src/rvm/patches/ruby/1.9.1/osx-arch-fix.patch000066400000000617147511530530014560 0ustar00diff --git a/Makefile.in b/Makefile.in
index 656ae90..f976cf1 100644
--- a/Makefile.in
+++ b/Makefile.in
@@ -45,7 +45,7 @@ XLDFLAGS = @XLDFLAGS@ $(EXTLDFLAGS)
 EXTLIBS = 
 LIBS = @LIBS@ $(EXTLIBS)
 MISSING = @LIBOBJS@ @ALLOCA@
-LDSHARED = @LIBRUBY_LDSHARED@
+LDSHARED = @LIBRUBY_LDSHARED@ $(LDFLAGS)
 DLDFLAGS = @LIBRUBY_DLDFLAGS@ $(EXTLDFLAGS) @ARCH_FLAG@
 SOLIBS = @SOLIBS@
 MAINLIBS = @MAINLIBS@
src/rvm/patches/ruby/2.1.7/openssl3.patch000066400000003333147511530530014013 0ustar00diff --git a/ext/openssl/extconf.rb b/ext/openssl/extconf.rb
index 8c04cb5..132d803 100644
--- a/ext/openssl/extconf.rb
+++ b/ext/openssl/extconf.rb
@@ -104,6 +104,9 @@
 have_func("SSLv2_method")
 have_func("SSLv2_server_method")
 have_func("SSLv2_client_method")
+have_func("SSLv3_method")
+have_func("SSLv3_server_method")
+have_func("SSLv3_client_method")
 have_func("TLSv1_1_method")
 have_func("TLSv1_1_server_method")
 have_func("TLSv1_1_client_method")
diff --git a/ext/openssl/ossl_ssl.c b/ext/openssl/ossl_ssl.c
index f7cb7f0..47111f6 100644
--- a/ext/openssl/ossl_ssl.c
+++ b/ext/openssl/ossl_ssl.c
@@ -109,9 +109,12 @@ static const struct {
     OSSL_SSL_METHOD_ENTRY(SSLv2_server),
     OSSL_SSL_METHOD_ENTRY(SSLv2_client),
 #endif
+#if defined(HAVE_SSLV3_METHOD) && defined(HAVE_SSLV3_SERVER_METHOD) && \
+        defined(HAVE_SSLV3_CLIENT_METHOD)
     OSSL_SSL_METHOD_ENTRY(SSLv3),
     OSSL_SSL_METHOD_ENTRY(SSLv3_server),
     OSSL_SSL_METHOD_ENTRY(SSLv3_client),
+#endif
     OSSL_SSL_METHOD_ENTRY(SSLv23),
     OSSL_SSL_METHOD_ENTRY(SSLv23_server),
     OSSL_SSL_METHOD_ENTRY(SSLv23_client),
diff --git a/test/openssl/test_ssl.rb b/test/openssl/test_ssl.rb
index 07e081b..0cbfcba 100644
--- a/test/openssl/test_ssl.rb
+++ b/test/openssl/test_ssl.rb
@@ -912,7 +912,7 @@ def test_unset_OP_ALL
   # that has been marked as forbidden, therefore either of these may be raised
   HANDSHAKE_ERRORS = [OpenSSL::SSL::SSLError, Errno::ECONNRESET]

-if OpenSSL::SSL::SSLContext::METHODS.include? :TLSv1
+if OpenSSL::SSL::SSLContext::METHODS.include?(:TLSv1) && OpenSSL::SSL::SSLContext::METHODS.include?(:SSLv3)

   def test_forbid_ssl_v3_for_client
     ctx_proc = Proc.new { |ctx| ctx.options = OpenSSL::SSL::OP_ALL | OpenSSL::SSL::OP_NO_SSLv3 }
src/rvm/patches/ruby/2.0.0/openssl3.patch000066400000003333147511530530014003 0ustar00diff --git a/ext/openssl/extconf.rb b/ext/openssl/extconf.rb
index 8c04cb5..132d803 100644
--- a/ext/openssl/extconf.rb
+++ b/ext/openssl/extconf.rb
@@ -104,6 +104,9 @@
 have_func("SSLv2_method")
 have_func("SSLv2_server_method")
 have_func("SSLv2_client_method")
+have_func("SSLv3_method")
+have_func("SSLv3_server_method")
+have_func("SSLv3_client_method")
 have_func("TLSv1_1_method")
 have_func("TLSv1_1_server_method")
 have_func("TLSv1_1_client_method")
diff --git a/ext/openssl/ossl_ssl.c b/ext/openssl/ossl_ssl.c
index f7cb7f0..47111f6 100644
--- a/ext/openssl/ossl_ssl.c
+++ b/ext/openssl/ossl_ssl.c
@@ -109,9 +109,12 @@ static const struct {
     OSSL_SSL_METHOD_ENTRY(SSLv2_server),
     OSSL_SSL_METHOD_ENTRY(SSLv2_client),
 #endif
+#if defined(HAVE_SSLV3_METHOD) && defined(HAVE_SSLV3_SERVER_METHOD) && \
+        defined(HAVE_SSLV3_CLIENT_METHOD)
     OSSL_SSL_METHOD_ENTRY(SSLv3),
     OSSL_SSL_METHOD_ENTRY(SSLv3_server),
     OSSL_SSL_METHOD_ENTRY(SSLv3_client),
+#endif
     OSSL_SSL_METHOD_ENTRY(SSLv23),
     OSSL_SSL_METHOD_ENTRY(SSLv23_server),
     OSSL_SSL_METHOD_ENTRY(SSLv23_client),
diff --git a/test/openssl/test_ssl.rb b/test/openssl/test_ssl.rb
index 07e081b..0cbfcba 100644
--- a/test/openssl/test_ssl.rb
+++ b/test/openssl/test_ssl.rb
@@ -912,7 +912,7 @@ def test_unset_OP_ALL
   # that has been marked as forbidden, therefore either of these may be raised
   HANDSHAKE_ERRORS = [OpenSSL::SSL::SSLError, Errno::ECONNRESET]

-if OpenSSL::SSL::SSLContext::METHODS.include? :TLSv1
+if OpenSSL::SSL::SSLContext::METHODS.include?(:TLSv1) && OpenSSL::SSL::SSLContext::METHODS.include?(:SSLv3)

   def test_forbid_ssl_v3_for_client
     ctx_proc = Proc.new { |ctx| ctx.options = OpenSSL::SSL::OP_ALL | OpenSSL::SSL::OP_NO_SSLv3 }
src/rvm/patches/ruby/2.0.0/logging.patch000066400000002675147511530530013673 0ustar00--- trunk/ext/extmk.rb  (revision 40079)
+++ trunk/ext/extmk.rb  (revision 40080)
@@ -193,19 +193,11 @@
    Logging::logfile 'mkmf.log'
    rm_f makefile
    if conf
-            stdout = $stdout.dup
-            stderr = $stderr.dup
-            unless verbose?
-              $stderr.reopen($stdout.reopen(@null))
-            end
-            begin
+            Logging.open do
+              unless verbose?
+                $stderr.reopen($stdout.reopen(@null))
+              end
               load $0 = conf
-            ensure
-              Logging::log_close
-              $stderr.reopen(stderr)
-              $stdout.reopen(stdout)
-              stdout.close
-              stderr.close
             end
    else
      create_makefile(target)
@@ -235,11 +227,13 @@
         mess = "#{error}\n#{mess}"
       end

-      Logging::message(mess)
+      Logging::message(mess) if Logging.log_opened?
       print(mess)
       $stdout.flush
+      Logging::log_close
       return true
     end
+    Logging::log_close
     args = sysquote($mflags)
     unless $destdir.to_s.empty? or $mflags.defined?("DESTDIR")
       args += [sysquote("DESTDIR=" + relative_from($destdir, "../"+prefix))]
--- trunk/lib/mkmf.rb (revision 40079)
+++ trunk/lib/mkmf.rb (revision 40080)
@@ -310,6 +310,10 @@
       @log.sync = true
     end

+    def self::log_opened?
+      @log and not @log.closed?
+    end
+
     def self::open
       log_open
       $stderr.reopen(@log)
src/rvm/patches/ruby/2.0.0/43449.patch000066400000000772147511530530012730 0ustar00Index: load.c
===================================================================
--- a/load.c	(revision 43448)
+++ b/load.c	(revision 43449)
@@ -1013,9 +1013,11 @@
 {
     char* const lock_key = load_lock(name);
     if (lock_key) {
+	VALUE feature = rb_usascii_str_new_cstr(name);
+	OBJ_FREEZE(feature);
 	rb_vm_call_cfunc(rb_vm_top_self(), init_ext_call, (VALUE)init,
-			 0, rb_str_new2(name));
-	rb_provide(name);
+			 0, feature);
+	rb_provide_feature(feature);
 	load_unlock(lock_key, 1);
     }
 }
src/rvm/patches/ruby/2.0.0/libyaml_p0-p353.patch000066400000055156147511530530014767 0ustar00diff -uw ruby-2.0.0-p0/ext/psych/yaml/api.c ruby-2.1.2/ext/psych/yaml/api.c
--- ruby-2.0.0-p0/ext/psych/yaml/api.c	2012-11-28 05:35:40.000000000 +0100
+++ ruby-2.1.2/ext/psych/yaml/api.c	2014-02-24 05:24:15.000000000 +0100
@@ -395,7 +395,7 @@
     }
     QUEUE_DEL(emitter, emitter->events);
     STACK_DEL(emitter, emitter->indents);
-    while (!STACK_EMPTY(empty, emitter->tag_directives)) {
+    while (!STACK_EMPTY(emitter, emitter->tag_directives)) {
         yaml_tag_directive_t tag_directive = POP(emitter, emitter->tag_directives);
         yaml_free(tag_directive.handle);
         yaml_free(tag_directive.prefix);
@@ -822,6 +822,7 @@
     yaml_char_t *anchor_copy = NULL;
     yaml_char_t *tag_copy = NULL;
     yaml_char_t *value_copy = NULL;
+    size_t value_length;
 
     assert(event);      /* Non-NULL event object is expected. */
     assert(value);      /* Non-NULL anchor is expected. */
@@ -839,16 +840,19 @@
     }
 
     if (length < 0) {
-        length = strlen((char *)value);
+        value_length = strlen((char *)value);
+    }
+    else {
+        value_length = (size_t)length;
     }
 
-    if (!yaml_check_utf8(value, length)) goto error;
-    value_copy = yaml_malloc(length+1);
+    if (!yaml_check_utf8(value, value_length)) goto error;
+    value_copy = yaml_malloc(value_length+1);
     if (!value_copy) goto error;
-    memcpy(value_copy, value, length);
-    value_copy[length] = '\0';
+    memcpy(value_copy, value, value_length);
+    value_copy[value_length] = '\0';
 
-    SCALAR_EVENT_INIT(*event, anchor_copy, tag_copy, value_copy, length,
+    SCALAR_EVENT_INIT(*event, anchor_copy, tag_copy, value_copy, value_length,
             plain_implicit, quoted_implicit, style, mark, mark);
 
     return 1;
@@ -1202,6 +1206,8 @@
     yaml_char_t *tag_copy = NULL;
     yaml_char_t *value_copy = NULL;
     yaml_node_t node;
+    size_t value_length;
+    ptrdiff_t ret;
 
     assert(document);   /* Non-NULL document object is expected. */
     assert(value);      /* Non-NULL value is expected. */
@@ -1215,19 +1221,26 @@
     if (!tag_copy) goto error;
 
     if (length < 0) {
-        length = strlen((char *)value);
+        value_length = strlen((char *)value);
+    }
+    else {
+        value_length = (size_t)length;
     }
 
-    if (!yaml_check_utf8(value, length)) goto error;
-    value_copy = yaml_malloc(length+1);
+    if (!yaml_check_utf8(value, value_length)) goto error;
+    value_copy = yaml_malloc(value_length+1);
     if (!value_copy) goto error;
-    memcpy(value_copy, value, length);
-    value_copy[length] = '\0';
+    memcpy(value_copy, value, value_length);
+    value_copy[value_length] = '\0';
 
-    SCALAR_NODE_INIT(node, tag_copy, value_copy, length, style, mark, mark);
+    SCALAR_NODE_INIT(node, tag_copy, value_copy, value_length, style, mark, mark);
     if (!PUSH(&context, document->nodes, node)) goto error;
 
-    return document->nodes.top - document->nodes.start;
+    ret = document->nodes.top - document->nodes.start;
+#if PTRDIFF_MAX > INT_MAX
+    if (ret > INT_MAX) goto error;
+#endif
+    return (int)ret;
 
 error:
     yaml_free(tag_copy);
@@ -1255,6 +1268,7 @@
         yaml_node_item_t *top;
     } items = { NULL, NULL, NULL };
     yaml_node_t node;
+    ptrdiff_t ret;
 
     assert(document);   /* Non-NULL document object is expected. */
 
@@ -1272,7 +1286,11 @@
             style, mark, mark);
     if (!PUSH(&context, document->nodes, node)) goto error;
 
-    return document->nodes.top - document->nodes.start;
+    ret = document->nodes.top - document->nodes.start;
+#if PTRDIFF_MAX > INT_MAX
+    if (ret > INT_MAX) goto error;
+#endif
+    return (int)ret;
 
 error:
     STACK_DEL(&context, items);
@@ -1300,6 +1318,7 @@
         yaml_node_pair_t *top;
     } pairs = { NULL, NULL, NULL };
     yaml_node_t node;
+    ptrdiff_t ret;
 
     assert(document);   /* Non-NULL document object is expected. */
 
@@ -1317,7 +1336,11 @@
             style, mark, mark);
     if (!PUSH(&context, document->nodes, node)) goto error;
 
-    return document->nodes.top - document->nodes.start;
+    ret = document->nodes.top - document->nodes.start;
+#if PTRDIFF_MAX > INT_MAX
+    if (ret > INT_MAX) goto error;
+#endif
+    return (int)ret;
 
 error:
     STACK_DEL(&context, pairs);
diff -uw ruby-2.0.0-p0/ext/psych/yaml/config.h ruby-2.1.2/ext/psych/yaml/config.h
--- ruby-2.0.0-p0/ext/psych/yaml/config.h	2012-12-01 04:58:39.000000000 +0100
+++ ruby-2.1.2/ext/psych/yaml/config.h	2014-05-04 17:45:33.000000000 +0200
@@ -1,11 +1,10 @@
-
 #define PACKAGE_NAME "yaml"
 #define PACKAGE_TARNAME "yaml"
-#define PACKAGE_VERSION "0.1.4"
-#define PACKAGE_STRING "yaml 0.1.4"
+#define PACKAGE_VERSION "0.1.6"
+#define PACKAGE_STRING "yaml 0.1.6"
 #define PACKAGE_BUGREPORT "http://pyyaml.org/newticket?component libyaml"
 #define PACKAGE_URL ""
 #define YAML_VERSION_MAJOR 0
 #define YAML_VERSION_MINOR 1
-#define YAML_VERSION_PATCH 4
-#define YAML_VERSION_STRING "0.1.4"
+#define YAML_VERSION_PATCH 6
+#define YAML_VERSION_STRING "0.1.6"
diff -uw ruby-2.0.0-p0/ext/psych/yaml/emitter.c ruby-2.1.2/ext/psych/yaml/emitter.c
--- ruby-2.0.0-p0/ext/psych/yaml/emitter.c	2012-12-05 05:08:17.000000000 +0100
+++ ruby-2.1.2/ext/psych/yaml/emitter.c	2014-02-24 05:24:15.000000000 +0100
@@ -53,7 +53,7 @@
 #define WRITE_BREAK(emitter,string)                                             \
     (FLUSH(emitter)                                                             \
      && (CHECK(string,'\n') ?                                                   \
-         (PUT_BREAK(emitter),                                                   \
+         ((void)PUT_BREAK(emitter),                                             \
           string.pointer ++,                                                    \
           1) :                                                                  \
          (COPY(emitter->buffer,string),                                         \
diff -uw ruby-2.0.0-p0/ext/psych/yaml/loader.c ruby-2.1.2/ext/psych/yaml/loader.c
--- ruby-2.0.0-p0/ext/psych/yaml/loader.c	2012-11-28 05:35:40.000000000 +0100
+++ ruby-2.1.2/ext/psych/yaml/loader.c	2014-02-24 05:24:15.000000000 +0100
@@ -283,9 +283,12 @@
 yaml_parser_load_scalar(yaml_parser_t *parser, yaml_event_t *first_event)
 {
     yaml_node_t node;
+    ptrdiff_t node_index;
     int index;
     yaml_char_t *tag = first_event->data.scalar.tag;
 
+    if (!STACK_LIMIT(parser, parser->document->nodes, INT_MAX-1)) goto error;
+
     if (!tag || strcmp((char *)tag, "!") == 0) {
         yaml_free(tag);
         tag = yaml_strdup((yaml_char_t *)YAML_DEFAULT_SCALAR_TAG);
@@ -298,7 +301,11 @@
 
     if (!PUSH(parser, parser->document->nodes, node)) goto error;
 
-    index = parser->document->nodes.top - parser->document->nodes.start;
+    node_index = parser->document->nodes.top - parser->document->nodes.start;
+#if PTRDIFF_MAX > INT_MAX
+    if (node_index > INT_MAX) goto error;
+#endif
+    index = (int)node_index;
 
     if (!yaml_parser_register_anchor(parser, index,
                 first_event->data.scalar.anchor)) return 0;
@@ -327,8 +334,11 @@
         yaml_node_item_t *top;
     } items = { NULL, NULL, NULL };
     int index, item_index;
+    ptrdiff_t node_index;
     yaml_char_t *tag = first_event->data.sequence_start.tag;
 
+    if (!STACK_LIMIT(parser, parser->document->nodes, INT_MAX-1)) goto error;
+
     if (!tag || strcmp((char *)tag, "!") == 0) {
         yaml_free(tag);
         tag = yaml_strdup((yaml_char_t *)YAML_DEFAULT_SEQUENCE_TAG);
@@ -343,7 +353,11 @@
 
     if (!PUSH(parser, parser->document->nodes, node)) goto error;
 
-    index = parser->document->nodes.top - parser->document->nodes.start;
+    node_index = parser->document->nodes.top - parser->document->nodes.start;
+#if PTRDIFF_MAX > INT_MAX
+    if (node_index > INT_MAX) goto error;
+#endif
+    index = (int)node_index;
 
     if (!yaml_parser_register_anchor(parser, index,
                 first_event->data.sequence_start.anchor)) return 0;
@@ -351,6 +365,9 @@
     if (!yaml_parser_parse(parser, &event)) return 0;
 
     while (event.type != YAML_SEQUENCE_END_EVENT) {
+        if (!STACK_LIMIT(parser,
+                    parser->document->nodes.start[index-1].data.sequence.items,
+                    INT_MAX-1)) return 0;
         item_index = yaml_parser_load_node(parser, &event);
         if (!item_index) return 0;
         if (!PUSH(parser,
@@ -384,9 +401,12 @@
         yaml_node_pair_t *top;
     } pairs = { NULL, NULL, NULL };
     int index;
+    ptrdiff_t node_index;
     yaml_node_pair_t pair;
     yaml_char_t *tag = first_event->data.mapping_start.tag;
 
+    if (!STACK_LIMIT(parser, parser->document->nodes, INT_MAX-1)) goto error;
+
     if (!tag || strcmp((char *)tag, "!") == 0) {
         yaml_free(tag);
         tag = yaml_strdup((yaml_char_t *)YAML_DEFAULT_MAPPING_TAG);
@@ -401,7 +421,11 @@
 
     if (!PUSH(parser, parser->document->nodes, node)) goto error;
 
-    index = parser->document->nodes.top - parser->document->nodes.start;
+    node_index = parser->document->nodes.top - parser->document->nodes.start;
+#if PTRDIFF_MAX > INT_MAX
+    if (node_index > INT_MAX) goto error;
+#endif
+    index = (int)node_index;
 
     if (!yaml_parser_register_anchor(parser, index,
                 first_event->data.mapping_start.anchor)) return 0;
@@ -409,6 +433,9 @@
     if (!yaml_parser_parse(parser, &event)) return 0;
 
     while (event.type != YAML_MAPPING_END_EVENT) {
+        if (!STACK_LIMIT(parser,
+                    parser->document->nodes.start[index-1].data.mapping.pairs,
+                    INT_MAX-1)) return 0;
         pair.key = yaml_parser_load_node(parser, &event);
         if (!pair.key) return 0;
         if (!yaml_parser_parse(parser, &event)) return 0;
diff -uw ruby-2.0.0-p0/ext/psych/yaml/parser.c ruby-2.1.2/ext/psych/yaml/parser.c
--- ruby-2.0.0-p0/ext/psych/yaml/parser.c	2012-12-05 05:08:17.000000000 +0100
+++ ruby-2.1.2/ext/psych/yaml/parser.c	2014-02-24 05:24:15.000000000 +0100
@@ -759,9 +759,8 @@
 
     else if (token->type == YAML_BLOCK_END_TOKEN)
     {
-        yaml_mark_t dummy_mark;     /* Used to eliminate a compiler warning. */
         parser->state = POP(parser, parser->states);
-        dummy_mark = POP(parser, parser->marks);
+        (void)POP(parser, parser->marks);
         SEQUENCE_END_EVENT_INIT(*event, token->start_mark, token->end_mark);
         SKIP_TOKEN(parser);
         return 1;
@@ -869,9 +868,8 @@
 
     else if (token->type == YAML_BLOCK_END_TOKEN)
     {
-        yaml_mark_t dummy_mark;     /* Used to eliminate a compiler warning. */
         parser->state = POP(parser, parser->states);
-        dummy_mark = POP(parser, parser->marks);
+        (void)POP(parser, parser->marks);
         MAPPING_END_EVENT_INIT(*event, token->start_mark, token->end_mark);
         SKIP_TOKEN(parser);
         return 1;
@@ -952,7 +950,6 @@
         yaml_event_t *event, int first)
 {
     yaml_token_t *token;
-    yaml_mark_t dummy_mark;     /* Used to eliminate a compiler warning. */
 
     if (first) {
         token = PEEK_TOKEN(parser);
@@ -997,7 +994,7 @@
     }
 
     parser->state = POP(parser, parser->states);
-    dummy_mark = POP(parser, parser->marks);
+    (void)POP(parser, parser->marks);
     SEQUENCE_END_EVENT_INIT(*event, token->start_mark, token->end_mark);
     SKIP_TOKEN(parser);
     return 1;
@@ -1104,7 +1101,6 @@
         yaml_event_t *event, int first)
 {
     yaml_token_t *token;
-    yaml_mark_t dummy_mark;     /* Used to eliminate a compiler warning. */
 
     if (first) {
         token = PEEK_TOKEN(parser);
@@ -1158,7 +1154,7 @@
     }
 
     parser->state = POP(parser, parser->states);
-    dummy_mark = POP(parser, parser->marks);
+    (void)POP(parser, parser->marks);
     MAPPING_END_EVENT_INIT(*event, token->start_mark, token->end_mark);
     SKIP_TOKEN(parser);
     return 1;
diff -uw ruby-2.0.0-p0/ext/psych/yaml/reader.c ruby-2.1.2/ext/psych/yaml/reader.c
--- ruby-2.0.0-p0/ext/psych/yaml/reader.c	2012-12-05 05:08:17.000000000 +0100
+++ ruby-2.1.2/ext/psych/yaml/reader.c	2014-02-24 05:24:15.000000000 +0100
@@ -460,6 +460,10 @@
 
     }
 
+    if (parser->offset >= PTRDIFF_MAX)
+        return yaml_parser_set_reader_error(parser, "input is too long",
+                PTRDIFF_MAX, -1);
+
     return 1;
 }
 
diff -uw ruby-2.0.0-p0/ext/psych/yaml/scanner.c ruby-2.1.2/ext/psych/yaml/scanner.c
--- ruby-2.0.0-p0/ext/psych/yaml/scanner.c	2013-01-13 08:47:10.000000000 +0100
+++ ruby-2.1.2/ext/psych/yaml/scanner.c	2014-05-04 17:45:33.000000000 +0200
@@ -615,11 +615,11 @@
  */
 
 static int
-yaml_parser_roll_indent(yaml_parser_t *parser, int column,
-        int number, yaml_token_type_t type, yaml_mark_t mark);
+yaml_parser_roll_indent(yaml_parser_t *parser, ptrdiff_t column,
+        ptrdiff_t number, yaml_token_type_t type, yaml_mark_t mark);
 
 static int
-yaml_parser_unroll_indent(yaml_parser_t *parser, int column);
+yaml_parser_unroll_indent(yaml_parser_t *parser, ptrdiff_t column);
 
 /*
  * Token fetchers.
@@ -1103,7 +1103,7 @@
      */
 
     int required = (!parser->flow_level
-            && parser->indent == (int)parser->mark.column);
+            && parser->indent == (ptrdiff_t)parser->mark.column);
 
     /*
      * A simple key is required only when it is the first token in the current
@@ -1176,6 +1176,11 @@
 
     /* Increase the flow level. */
 
+    if (parser->flow_level == INT_MAX) {
+        parser->error = YAML_MEMORY_ERROR;
+        return 0;
+    }
+
     parser->flow_level++;
 
     return 1;
@@ -1188,11 +1193,9 @@
 static int
 yaml_parser_decrease_flow_level(yaml_parser_t *parser)
 {
-    yaml_simple_key_t dummy_key;    /* Used to eliminate a compiler warning. */
-
     if (parser->flow_level) {
         parser->flow_level --;
-        dummy_key = POP(parser, parser->simple_keys);
+        (void)POP(parser, parser->simple_keys);
     }
 
     return 1;
@@ -1206,8 +1209,8 @@
  */
 
 static int
-yaml_parser_roll_indent(yaml_parser_t *parser, int column,
-        int number, yaml_token_type_t type, yaml_mark_t mark)
+yaml_parser_roll_indent(yaml_parser_t *parser, ptrdiff_t column,
+        ptrdiff_t number, yaml_token_type_t type, yaml_mark_t mark)
 {
     yaml_token_t token;
 
@@ -1226,7 +1229,14 @@
         if (!PUSH(parser, parser->indents, parser->indent))
             return 0;
 
-        parser->indent = column;
+#if PTRDIFF_MAX > INT_MAX
+        if (column > INT_MAX) {
+            parser->error = YAML_MEMORY_ERROR;
+            return 0;
+        }
+#endif
+
+        parser->indent = (int)column;
 
         /* Create a token and insert it into the queue. */
 
@@ -1248,13 +1258,13 @@
 
 /*
  * Pop indentation levels from the indents stack until the current level
- * becomes less or equal to the column.  For each indentation level, append
+ * becomes less or equal to the column.  For each intendation level, append
  * the BLOCK-END token.
  */
 
 
 static int
-yaml_parser_unroll_indent(yaml_parser_t *parser, int column)
+yaml_parser_unroll_indent(yaml_parser_t *parser, ptrdiff_t column)
 {
     yaml_token_t token;
 
@@ -1263,7 +1273,7 @@
     if (parser->flow_level)
         return 1;
 
-    /* Loop through the indentation levels in the stack. */
+    /* Loop through the intendation levels in the stack. */
 
     while (parser->indent > column)
     {
@@ -2574,7 +2584,7 @@
 
     /* Resize the string to include the head. */
 
-    while (string.end - string.start <= (int)length) {
+    while ((size_t)(string.end - string.start) <= length) {
         if (!yaml_string_extend(&string.start, &string.pointer, &string.end)) {
             parser->error = YAML_MEMORY_ERROR;
             goto error;
@@ -2619,6 +2629,9 @@
         /* Check if it is a URI-escape sequence. */
 
         if (CHECK(parser->buffer, '%')) {
+            if (!STRING_EXTEND(parser, string))
+                goto error;
+
             if (!yaml_parser_scan_uri_escapes(parser,
                         directive, start_mark, &string)) goto error;
         }
@@ -2769,15 +2782,15 @@
 
         if (IS_DIGIT(parser->buffer))
         {
-            /* Check that the indentation is greater than 0. */
+            /* Check that the intendation is greater than 0. */
 
             if (CHECK(parser->buffer, '0')) {
                 yaml_parser_set_scanner_error(parser, "while scanning a block scalar",
-                        start_mark, "found an indentation indicator equal to 0");
+                        start_mark, "found an intendation indicator equal to 0");
                 goto error;
             }
 
-            /* Get the indentation level and eat the indicator. */
+            /* Get the intendation level and eat the indicator. */
 
             increment = AS_DIGIT(parser->buffer);
 
@@ -2791,7 +2804,7 @@
     {
         if (CHECK(parser->buffer, '0')) {
             yaml_parser_set_scanner_error(parser, "while scanning a block scalar",
-                    start_mark, "found an indentation indicator equal to 0");
+                    start_mark, "found an intendation indicator equal to 0");
             goto error;
         }
 
@@ -2841,7 +2854,7 @@
 
     end_mark = parser->mark;
 
-    /* Set the indentation level if it was specified. */
+    /* Set the intendation level if it was specified. */
 
     if (increment) {
         indent = parser->indent >= 0 ? parser->indent+increment : increment;
@@ -2907,7 +2920,7 @@
 
         if (!READ_LINE(parser, leading_break)) goto error;
 
-        /* Eat the following indentation spaces and line breaks. */
+        /* Eat the following intendation spaces and line breaks. */
 
         if (!yaml_parser_scan_block_scalar_breaks(parser,
                     &indent, &trailing_breaks, start_mark, &end_mark)) goto error;
@@ -2942,8 +2955,8 @@
 }
 
 /*
- * Scan indentation spaces and line breaks for a block scalar.  Determine the
- * indentation level if needed.
+ * Scan intendation spaces and line breaks for a block scalar.  Determine the
+ * intendation level if needed.
  */
 
 static int
@@ -2955,11 +2968,11 @@
 
     *end_mark = parser->mark;
 
-    /* Eat the indentation spaces and line breaks. */
+    /* Eat the intendation spaces and line breaks. */
 
     while (1)
     {
-        /* Eat the indentation spaces. */
+        /* Eat the intendation spaces. */
 
         if (!CACHE(parser, 1)) return 0;
 
@@ -2972,12 +2985,12 @@
         if ((int)parser->mark.column > max_indent)
             max_indent = (int)parser->mark.column;
 
-        /* Check for a tab character messing the indentation. */
+        /* Check for a tab character messing the intendation. */
 
         if ((!*indent || (int)parser->mark.column < *indent)
                 && IS_TAB(parser->buffer)) {
             return yaml_parser_set_scanner_error(parser, "while scanning a block scalar",
-                    start_mark, "found a tab character where an indentation space is expected");
+                    start_mark, "found a tab character where an intendation space is expected");
         }
 
         /* Have we found a non-empty line? */
@@ -3498,12 +3511,12 @@
         {
             if (IS_BLANK(parser->buffer))
             {
-                /* Check for tab character that abuse indentation. */
+                /* Check for tab character that abuse intendation. */
 
                 if (leading_blanks && (int)parser->mark.column < indent
                         && IS_TAB(parser->buffer)) {
                     yaml_parser_set_scanner_error(parser, "while scanning a plain scalar",
-                            start_mark, "found a tab character that violates indentation");
+                            start_mark, "found a tab character that violate intendation");
                     goto error;
                 }
 
@@ -3536,7 +3549,7 @@
             if (!CACHE(parser, 1)) goto error;
         }
 
-        /* Check indentation level. */
+        /* Check intendation level. */
 
         if (!parser->flow_level && (int)parser->mark.column < indent)
             break;
diff -uw ruby-2.0.0-p0/ext/psych/yaml/yaml.h ruby-2.1.2/ext/psych/yaml/yaml.h
--- ruby-2.0.0-p0/ext/psych/yaml/yaml.h	2012-12-05 05:08:17.000000000 +0100
+++ ruby-2.1.2/ext/psych/yaml/yaml.h	2013-09-20 16:51:35.000000000 +0200
@@ -1089,7 +1089,7 @@
     yaml_error_type_t error;
     /** Error description. */
     const char *problem;
-    /** The byte about which the problem occured. */
+    /** The byte about which the problem occurred. */
     size_t problem_offset;
     /** The problematic value (@c -1 is none). */
     int problem_value;
@@ -1851,7 +1851,7 @@
 yaml_emitter_set_canonical(yaml_emitter_t *emitter, int canonical);
 
 /**
- * Set the intendation increment.
+ * Set the indentation increment.
  *
  * @param[in,out]   emitter     An emitter object.
  * @param[in]       indent      The indentation increment (1 < . < 10).
diff -uw ruby-2.0.0-p0/ext/psych/yaml/yaml_private.h ruby-2.1.2/ext/psych/yaml/yaml_private.h
--- ruby-2.0.0-p0/ext/psych/yaml/yaml_private.h	2012-12-05 05:08:17.000000000 +0100
+++ ruby-2.1.2/ext/psych/yaml/yaml_private.h	2014-05-04 17:45:33.000000000 +0200
@@ -10,6 +10,17 @@
 
 #include <assert.h>
 #include <limits.h>
+#include <stddef.h>
+
+#ifndef _MSC_VER
+#include <stdint.h>
+#else
+#ifdef _WIN64
+#define PTRDIFF_MAX _I64_MAX
+#else
+#define PTRDIFF_MAX INT_MAX
+#endif
+#endif
 
 /*
  * Memory management.
@@ -135,9 +146,12 @@
      (string).start = (string).pointer = (string).end = 0)
 
 #define STRING_EXTEND(context,string)                                           \
-    (((string).pointer+5 < (string).end)                                        \
+    ((((string).pointer+5 < (string).end)                                       \
         || yaml_string_extend(&(string).start,                                  \
-            &(string).pointer, &(string).end))
+            &(string).pointer, &(string).end)) ?                                \
+         1 :                                                                    \
+        ((context)->error = YAML_MEMORY_ERROR,                                  \
+         0))
 
 #define CLEAR(context,string)                                                   \
     ((string).pointer = (string).start,                                         \
@@ -422,7 +436,14 @@
      (stack).start = (stack).top = (stack).end = 0)
 
 #define STACK_EMPTY(context,stack)                                              \
-    ((stack).start == (stack).top)
+    ((void)(context),                                                           \
+     ((stack).start == (stack).top))
+
+#define STACK_LIMIT(context,stack,size)                                         \
+    ((stack).top - (stack).start < (size) ?                                     \
+        1 :                                                                     \
+        ((context)->error = YAML_MEMORY_ERROR,                                  \
+         0))
 
 #define PUSH(context,stack,value)                                               \
     (((stack).top != (stack).end                                                \
src/rvm/patches/ruby/2.0.0/p451/libyaml.patch000066400000006412147511530530014360 0ustar00diff -uw ruby-2.0.0-p451/ext/psych/yaml/config.h ruby-2.1.2/ext/psych/yaml/config.h
--- ruby-2.0.0-p451/ext/psych/yaml/config.h	2014-02-15 17:48:09.000000000 +0100
+++ ruby-2.1.2/ext/psych/yaml/config.h	2014-05-04 17:45:33.000000000 +0200
@@ -1,11 +1,10 @@
-
 #define PACKAGE_NAME "yaml"
 #define PACKAGE_TARNAME "yaml"
-#define PACKAGE_VERSION "0.1.5"
-#define PACKAGE_STRING "yaml 0.1.5"
+#define PACKAGE_VERSION "0.1.6"
+#define PACKAGE_STRING "yaml 0.1.6"
 #define PACKAGE_BUGREPORT "http://pyyaml.org/newticket?component libyaml"
 #define PACKAGE_URL ""
 #define YAML_VERSION_MAJOR 0
 #define YAML_VERSION_MINOR 1
-#define YAML_VERSION_PATCH 5
-#define YAML_VERSION_STRING "0.1.5"
+#define YAML_VERSION_PATCH 6
+#define YAML_VERSION_STRING "0.1.6"
diff -uw ruby-2.0.0-p451/ext/psych/yaml/scanner.c ruby-2.1.2/ext/psych/yaml/scanner.c
--- ruby-2.0.0-p451/ext/psych/yaml/scanner.c	2014-02-21 12:55:57.000000000 +0100
+++ ruby-2.1.2/ext/psych/yaml/scanner.c	2014-05-04 17:45:33.000000000 +0200
@@ -2629,6 +2629,9 @@
         /* Check if it is a URI-escape sequence. */
 
         if (CHECK(parser->buffer, '%')) {
+            if (!STRING_EXTEND(parser, string))
+                goto error;
+
             if (!yaml_parser_scan_uri_escapes(parser,
                         directive, start_mark, &string)) goto error;
         }
diff -uw ruby-2.0.0-p451/ext/psych/yaml/yaml.h ruby-2.1.2/ext/psych/yaml/yaml.h
--- ruby-2.0.0-p451/ext/psych/yaml/yaml.h	2012-12-05 05:08:17.000000000 +0100
+++ ruby-2.1.2/ext/psych/yaml/yaml.h	2013-09-20 16:51:35.000000000 +0200
@@ -1089,7 +1089,7 @@
     yaml_error_type_t error;
     /** Error description. */
     const char *problem;
-    /** The byte about which the problem occured. */
+    /** The byte about which the problem occurred. */
     size_t problem_offset;
     /** The problematic value (@c -1 is none). */
     int problem_value;
@@ -1851,7 +1851,7 @@
 yaml_emitter_set_canonical(yaml_emitter_t *emitter, int canonical);
 
 /**
- * Set the intendation increment.
+ * Set the indentation increment.
  *
  * @param[in,out]   emitter     An emitter object.
  * @param[in]       indent      The indentation increment (1 < . < 10).
diff -uw ruby-2.0.0-p451/ext/psych/yaml/yaml_private.h ruby-2.1.2/ext/psych/yaml/yaml_private.h
--- ruby-2.0.0-p451/ext/psych/yaml/yaml_private.h	2014-02-21 12:55:57.000000000 +0100
+++ ruby-2.1.2/ext/psych/yaml/yaml_private.h	2014-05-04 17:45:33.000000000 +0200
@@ -146,9 +146,12 @@
      (string).start = (string).pointer = (string).end = 0)
 
 #define STRING_EXTEND(context,string)                                           \
-    (((string).pointer+5 < (string).end)                                        \
+    ((((string).pointer+5 < (string).end)                                       \
         || yaml_string_extend(&(string).start,                                  \
-            &(string).pointer, &(string).end))
+            &(string).pointer, &(string).end)) ?                                \
+         1 :                                                                    \
+        ((context)->error = YAML_MEMORY_ERROR,                                  \
+         0))
 
 #define CLEAR(context,string)                                                   \
     ((string).pointer = (string).start,                                         \
src/rvm/patches/ruby/2.0.0/update-autoconf.patch000066400000123242147511530530015335 0ustar00diff -Naur ruby-2.0.0-p648/tool/config.guess ruby-2.0.0-p648+ppc64le/tool/config.guess
--- ruby-2.0.0-p648/tool/config.guess	2012-01-29 13:50:18.000000000 +0000
+++ ruby-2.0.0-p648+ppc64le/tool/config.guess	2016-04-15 06:09:11.281978937 +0000
@@ -1,14 +1,12 @@
 #! /bin/sh
 # Attempt to guess a canonical system name.
-#   Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999,
-#   2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010,
-#   2011 Free Software Foundation, Inc.
+#   Copyright 1992-2016 Free Software Foundation, Inc.
 
-timestamp='2011-11-11'
+timestamp='2016-04-02'
 
 # This file is free software; you can redistribute it and/or modify it
 # under the terms of the GNU General Public License as published by
-# the Free Software Foundation; either version 2 of the License, or
+# the Free Software Foundation; either version 3 of the License, or
 # (at your option) any later version.
 #
 # This program is distributed in the hope that it will be useful, but
@@ -17,26 +15,22 @@
 # General Public License for more details.
 #
 # You should have received a copy of the GNU General Public License
-# along with this program; if not, write to the Free Software
-# Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA
-# 02110-1301, USA.
+# along with this program; if not, see <http://www.gnu.org/licenses/>.
 #
 # As a special exception to the GNU General Public License, if you
 # distribute this file as part of a program that contains a
 # configuration script generated by Autoconf, you may include it under
-# the same distribution terms that you use for the rest of that program.
-
-
-# Originally written by Per Bothner.  Please send patches (context
-# diff format) to <config-patches@gnu.org> and include a ChangeLog
-# entry.
+# the same distribution terms that you use for the rest of that
+# program.  This Exception is an additional permission under section 7
+# of the GNU General Public License, version 3 ("GPLv3").
 #
-# This script attempts to guess a canonical system name similar to
-# config.sub.  If it succeeds, it prints the system name on stdout, and
-# exits with 0.  Otherwise, it exits with 1.
+# Originally written by Per Bothner; maintained since 2000 by Ben Elliston.
 #
 # You can get the latest version of this script from:
-# http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.guess;hb=HEAD
+# http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.guess
+#
+# Please send patches to <config-patches@gnu.org>.
+
 
 me=`echo "$0" | sed -e 's,.*/,,'`
 
@@ -56,9 +50,7 @@
 GNU config.guess ($timestamp)
 
 Originally written by Per Bothner.
-Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000,
-2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free
-Software Foundation, Inc.
+Copyright 1992-2016 Free Software Foundation, Inc.
 
 This is free software; see the source for copying conditions.  There is NO
 warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE."
@@ -140,12 +132,33 @@
 UNAME_SYSTEM=`(uname -s) 2>/dev/null`  || UNAME_SYSTEM=unknown
 UNAME_VERSION=`(uname -v) 2>/dev/null` || UNAME_VERSION=unknown
 
+case "${UNAME_SYSTEM}" in
+Linux|GNU|GNU/*)
+	# If the system lacks a compiler, then just pick glibc.
+	# We could probably try harder.
+	LIBC=gnu
+
+	eval $set_cc_for_build
+	cat <<-EOF > $dummy.c
+	#include <features.h>
+	#if defined(__UCLIBC__)
+	LIBC=uclibc
+	#elif defined(__dietlibc__)
+	LIBC=dietlibc
+	#else
+	LIBC=gnu
+	#endif
+	EOF
+	eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep '^LIBC' | sed 's, ,,g'`
+	;;
+esac
+
 # Note: order is significant - the case branches are not exclusive.
 
 case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in
     *:NetBSD:*:*)
 	# NetBSD (nbsd) targets should (where applicable) match one or
-	# more of the tupples: *-*-netbsdelf*, *-*-netbsdaout*,
+	# more of the tuples: *-*-netbsdelf*, *-*-netbsdaout*,
 	# *-*-netbsdecoff* and *-*-netbsd*.  For targets that recently
 	# switched to ELF, *-*-netbsd* would select the old
 	# object file format.  This provides both forward
@@ -155,20 +168,27 @@
 	# Note: NetBSD doesn't particularly care about the vendor
 	# portion of the name.  We always set it to "unknown".
 	sysctl="sysctl -n hw.machine_arch"
-	UNAME_MACHINE_ARCH=`(/sbin/$sysctl 2>/dev/null || \
-	    /usr/sbin/$sysctl 2>/dev/null || echo unknown)`
+	UNAME_MACHINE_ARCH=`(uname -p 2>/dev/null || \
+	    /sbin/$sysctl 2>/dev/null || \
+	    /usr/sbin/$sysctl 2>/dev/null || \
+	    echo unknown)`
 	case "${UNAME_MACHINE_ARCH}" in
 	    armeb) machine=armeb-unknown ;;
 	    arm*) machine=arm-unknown ;;
 	    sh3el) machine=shl-unknown ;;
 	    sh3eb) machine=sh-unknown ;;
 	    sh5el) machine=sh5le-unknown ;;
+	    earmv*)
+		arch=`echo ${UNAME_MACHINE_ARCH} | sed -e 's,^e\(armv[0-9]\).*$,\1,'`
+		endian=`echo ${UNAME_MACHINE_ARCH} | sed -ne 's,^.*\(eb\)$,\1,p'`
+		machine=${arch}${endian}-unknown
+		;;
 	    *) machine=${UNAME_MACHINE_ARCH}-unknown ;;
 	esac
 	# The Operating System including object format, if it has switched
 	# to ELF recently, or will in the future.
 	case "${UNAME_MACHINE_ARCH}" in
-	    arm*|i386|m68k|ns32k|sh3*|sparc|vax)
+	    arm*|earm*|i386|m68k|ns32k|sh3*|sparc|vax)
 		eval $set_cc_for_build
 		if echo __ELF__ | $CC_FOR_BUILD -E - 2>/dev/null \
 			| grep -q __ELF__
@@ -184,6 +204,13 @@
 		os=netbsd
 		;;
 	esac
+	# Determine ABI tags.
+	case "${UNAME_MACHINE_ARCH}" in
+	    earm*)
+		expr='s/^earmv[0-9]/-eabi/;s/eb$//'
+		abi=`echo ${UNAME_MACHINE_ARCH} | sed -e "$expr"`
+		;;
+	esac
 	# The OS release
 	# Debian GNU/NetBSD machines have a different userland, and
 	# thus, need a distinct triplet. However, they do not need
@@ -194,18 +221,26 @@
 		release='-gnu'
 		;;
 	    *)
-		release=`echo ${UNAME_RELEASE}|sed -e 's/[-_].*/\./'`
+		release=`echo ${UNAME_RELEASE} | sed -e 's/[-_].*//' | cut -d. -f1,2`
 		;;
 	esac
 	# Since CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM:
 	# contains redundant information, the shorter form:
 	# CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM is used.
-	echo "${machine}-${os}${release}"
+	echo "${machine}-${os}${release}${abi}"
+	exit ;;
+    *:Bitrig:*:*)
+	UNAME_MACHINE_ARCH=`arch | sed 's/Bitrig.//'`
+	echo ${UNAME_MACHINE_ARCH}-unknown-bitrig${UNAME_RELEASE}
 	exit ;;
     *:OpenBSD:*:*)
 	UNAME_MACHINE_ARCH=`arch | sed 's/OpenBSD.//'`
 	echo ${UNAME_MACHINE_ARCH}-unknown-openbsd${UNAME_RELEASE}
 	exit ;;
+    *:LibertyBSD:*:*)
+	UNAME_MACHINE_ARCH=`arch | sed 's/^.*BSD\.//'`
+	echo ${UNAME_MACHINE_ARCH}-unknown-libertybsd${UNAME_RELEASE}
+	exit ;;
     *:ekkoBSD:*:*)
 	echo ${UNAME_MACHINE}-unknown-ekkobsd${UNAME_RELEASE}
 	exit ;;
@@ -218,6 +253,9 @@
     *:MirBSD:*:*)
 	echo ${UNAME_MACHINE}-unknown-mirbsd${UNAME_RELEASE}
 	exit ;;
+    *:Sortix:*:*)
+	echo ${UNAME_MACHINE}-unknown-sortix
+	exit ;;
     alpha:OSF1:*:*)
 	case $UNAME_RELEASE in
 	*4.0)
@@ -234,42 +272,42 @@
 	ALPHA_CPU_TYPE=`/usr/sbin/psrinfo -v | sed -n -e 's/^  The alpha \(.*\) processor.*$/\1/p' | head -n 1`
 	case "$ALPHA_CPU_TYPE" in
 	    "EV4 (21064)")
-		UNAME_MACHINE="alpha" ;;
+		UNAME_MACHINE=alpha ;;
 	    "EV4.5 (21064)")
-		UNAME_MACHINE="alpha" ;;
+		UNAME_MACHINE=alpha ;;
 	    "LCA4 (21066/21068)")
-		UNAME_MACHINE="alpha" ;;
+		UNAME_MACHINE=alpha ;;
 	    "EV5 (21164)")
-		UNAME_MACHINE="alphaev5" ;;
+		UNAME_MACHINE=alphaev5 ;;
 	    "EV5.6 (21164A)")
-		UNAME_MACHINE="alphaev56" ;;
+		UNAME_MACHINE=alphaev56 ;;
 	    "EV5.6 (21164PC)")
-		UNAME_MACHINE="alphapca56" ;;
+		UNAME_MACHINE=alphapca56 ;;
 	    "EV5.7 (21164PC)")
-		UNAME_MACHINE="alphapca57" ;;
+		UNAME_MACHINE=alphapca57 ;;
 	    "EV6 (21264)")
-		UNAME_MACHINE="alphaev6" ;;
+		UNAME_MACHINE=alphaev6 ;;
 	    "EV6.7 (21264A)")
-		UNAME_MACHINE="alphaev67" ;;
+		UNAME_MACHINE=alphaev67 ;;
 	    "EV6.8CB (21264C)")
-		UNAME_MACHINE="alphaev68" ;;
+		UNAME_MACHINE=alphaev68 ;;
 	    "EV6.8AL (21264B)")
-		UNAME_MACHINE="alphaev68" ;;
+		UNAME_MACHINE=alphaev68 ;;
 	    "EV6.8CX (21264D)")
-		UNAME_MACHINE="alphaev68" ;;
+		UNAME_MACHINE=alphaev68 ;;
 	    "EV6.9A (21264/EV69A)")
-		UNAME_MACHINE="alphaev69" ;;
+		UNAME_MACHINE=alphaev69 ;;
 	    "EV7 (21364)")
-		UNAME_MACHINE="alphaev7" ;;
+		UNAME_MACHINE=alphaev7 ;;
 	    "EV7.9 (21364A)")
-		UNAME_MACHINE="alphaev79" ;;
+		UNAME_MACHINE=alphaev79 ;;
 	esac
 	# A Pn.n version is a patched version.
 	# A Vn.n version is a released version.
 	# A Tn.n version is a released field test version.
 	# A Xn.n version is an unreleased experimental baselevel.
 	# 1.2 uses "1.2" for uname -r.
-	echo ${UNAME_MACHINE}-dec-osf`echo ${UNAME_RELEASE} | sed -e 's/^[PVTX]//' | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'`
+	echo ${UNAME_MACHINE}-dec-osf`echo ${UNAME_RELEASE} | sed -e 's/^[PVTX]//' | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz`
 	# Reset EXIT trap before exiting to avoid spurious non-zero exit code.
 	exitcode=$?
 	trap '' 0
@@ -304,7 +342,7 @@
     arm:RISC*:1.[012]*:*|arm:riscix:1.[012]*:*)
 	echo arm-acorn-riscix${UNAME_RELEASE}
 	exit ;;
-    arm:riscos:*:*|arm:RISCOS:*:*)
+    arm*:riscos:*:*|arm*:RISCOS:*:*)
 	echo arm-unknown-riscos
 	exit ;;
     SR2?01:HI-UX/MPP:*:* | SR8000:HI-UX/MPP:*:*)
@@ -342,16 +380,16 @@
 	exit ;;
     i86pc:SunOS:5.*:* | i86xen:SunOS:5.*:*)
 	eval $set_cc_for_build
-	SUN_ARCH="i386"
+	SUN_ARCH=i386
 	# If there is a compiler, see if it is configured for 64-bit objects.
 	# Note that the Sun cc does not turn __LP64__ into 1 like gcc does.
 	# This test works for both compilers.
-	if [ "$CC_FOR_BUILD" != 'no_compiler_found' ]; then
+	if [ "$CC_FOR_BUILD" != no_compiler_found ]; then
 	    if (echo '#ifdef __amd64'; echo IS_64BIT_ARCH; echo '#endif') | \
-		(CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) | \
+		(CCOPTS="" $CC_FOR_BUILD -E - 2>/dev/null) | \
 		grep IS_64BIT_ARCH >/dev/null
 	    then
-		SUN_ARCH="x86_64"
+		SUN_ARCH=x86_64
 	    fi
 	fi
 	echo ${SUN_ARCH}-pc-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
@@ -376,7 +414,7 @@
 	exit ;;
     sun*:*:4.2BSD:*)
 	UNAME_RELEASE=`(sed 1q /etc/motd | awk '{print substr($5,1,3)}') 2>/dev/null`
-	test "x${UNAME_RELEASE}" = "x" && UNAME_RELEASE=3
+	test "x${UNAME_RELEASE}" = x && UNAME_RELEASE=3
 	case "`/bin/arch`" in
 	    sun3)
 		echo m68k-sun-sunos${UNAME_RELEASE}
@@ -562,8 +600,9 @@
 	else
 		IBM_ARCH=powerpc
 	fi
-	if [ -x /usr/bin/oslevel ] ; then
-		IBM_REV=`/usr/bin/oslevel`
+	if [ -x /usr/bin/lslpp ] ; then
+		IBM_REV=`/usr/bin/lslpp -Lqc bos.rte.libc |
+			   awk -F: '{ print $3 }' | sed s/[0-9]*$/0/`
 	else
 		IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE}
 	fi
@@ -600,13 +639,13 @@
 		    sc_cpu_version=`/usr/bin/getconf SC_CPU_VERSION 2>/dev/null`
 		    sc_kernel_bits=`/usr/bin/getconf SC_KERNEL_BITS 2>/dev/null`
 		    case "${sc_cpu_version}" in
-		      523) HP_ARCH="hppa1.0" ;; # CPU_PA_RISC1_0
-		      528) HP_ARCH="hppa1.1" ;; # CPU_PA_RISC1_1
+		      523) HP_ARCH=hppa1.0 ;; # CPU_PA_RISC1_0
+		      528) HP_ARCH=hppa1.1 ;; # CPU_PA_RISC1_1
 		      532)                      # CPU_PA_RISC2_0
 			case "${sc_kernel_bits}" in
-			  32) HP_ARCH="hppa2.0n" ;;
-			  64) HP_ARCH="hppa2.0w" ;;
-			  '') HP_ARCH="hppa2.0" ;;   # HP-UX 10.20
+			  32) HP_ARCH=hppa2.0n ;;
+			  64) HP_ARCH=hppa2.0w ;;
+			  '') HP_ARCH=hppa2.0 ;;   # HP-UX 10.20
 			esac ;;
 		    esac
 		fi
@@ -645,11 +684,11 @@
 		    exit (0);
 		}
 EOF
-		    (CCOPTS= $CC_FOR_BUILD -o $dummy $dummy.c 2>/dev/null) && HP_ARCH=`$dummy`
+		    (CCOPTS="" $CC_FOR_BUILD -o $dummy $dummy.c 2>/dev/null) && HP_ARCH=`$dummy`
 		    test -z "$HP_ARCH" && HP_ARCH=hppa
 		fi ;;
 	esac
-	if [ ${HP_ARCH} = "hppa2.0w" ]
+	if [ ${HP_ARCH} = hppa2.0w ]
 	then
 	    eval $set_cc_for_build
 
@@ -662,12 +701,12 @@
 	    # $ CC_FOR_BUILD="cc +DA2.0w" ./config.guess
 	    # => hppa64-hp-hpux11.23
 
-	    if echo __LP64__ | (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) |
+	    if echo __LP64__ | (CCOPTS="" $CC_FOR_BUILD -E - 2>/dev/null) |
 		grep -q __LP64__
 	    then
-		HP_ARCH="hppa2.0w"
+		HP_ARCH=hppa2.0w
 	    else
-		HP_ARCH="hppa64"
+		HP_ARCH=hppa64
 	    fi
 	fi
 	echo ${HP_ARCH}-hp-hpux${HPUX_REV}
@@ -772,14 +811,14 @@
 	echo craynv-cray-unicosmp${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/'
 	exit ;;
     F30[01]:UNIX_System_V:*:* | F700:UNIX_System_V:*:*)
-	FUJITSU_PROC=`uname -m | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'`
-	FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'`
+	FUJITSU_PROC=`uname -m | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz`
+	FUJITSU_SYS=`uname -p | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz | sed -e 's/\///'`
 	FUJITSU_REL=`echo ${UNAME_RELEASE} | sed -e 's/ /_/'`
 	echo "${FUJITSU_PROC}-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}"
 	exit ;;
     5000:UNIX_System_V:4.*:*)
-	FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'`
-	FUJITSU_REL=`echo ${UNAME_RELEASE} | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/ /_/'`
+	FUJITSU_SYS=`uname -p | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz | sed -e 's/\///'`
+	FUJITSU_REL=`echo ${UNAME_RELEASE} | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz | sed -e 's/ /_/'`
 	echo "sparc-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}"
 	exit ;;
     i*86:BSD/386:*:* | i*86:BSD/OS:*:* | *:Ascend\ Embedded/OS:*:*)
@@ -803,10 +842,13 @@
     i*:CYGWIN*:*)
 	echo ${UNAME_MACHINE}-pc-cygwin
 	exit ;;
+    *:MINGW64*:*)
+	echo ${UNAME_MACHINE}-pc-mingw64
+	exit ;;
     *:MINGW*:*)
 	echo ${UNAME_MACHINE}-pc-mingw32
 	exit ;;
-    i*:MSYS*:*)
+    *:MSYS*:*)
 	echo ${UNAME_MACHINE}-pc-msys
 	exit ;;
     i*:windows32*:*)
@@ -854,15 +896,22 @@
 	exit ;;
     *:GNU:*:*)
 	# the GNU system
-	echo `echo ${UNAME_MACHINE}|sed -e 's,[-/].*$,,'`-unknown-gnu`echo ${UNAME_RELEASE}|sed -e 's,/.*$,,'`
+	echo `echo ${UNAME_MACHINE}|sed -e 's,[-/].*$,,'`-unknown-${LIBC}`echo ${UNAME_RELEASE}|sed -e 's,/.*$,,'`
 	exit ;;
     *:GNU/*:*:*)
 	# other systems with GNU libc and userland
-	echo ${UNAME_MACHINE}-unknown-`echo ${UNAME_SYSTEM} | sed 's,^[^/]*/,,' | tr '[A-Z]' '[a-z]'``echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`-gnu
+	echo ${UNAME_MACHINE}-unknown-`echo ${UNAME_SYSTEM} | sed 's,^[^/]*/,,' | tr "[:upper:]" "[:lower:]"``echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`-${LIBC}
 	exit ;;
     i*86:Minix:*:*)
 	echo ${UNAME_MACHINE}-pc-minix
 	exit ;;
+    aarch64:Linux:*:*)
+	echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
+	exit ;;
+    aarch64_be:Linux:*:*)
+	UNAME_MACHINE=aarch64_be
+	echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
+	exit ;;
     alpha:Linux:*:*)
 	case `sed -n '/^cpu model/s/^.*: \(.*\)/\1/p' < /proc/cpuinfo` in
 	  EV5)   UNAME_MACHINE=alphaev5 ;;
@@ -874,59 +923,60 @@
 	  EV68*) UNAME_MACHINE=alphaev68 ;;
 	esac
 	objdump --private-headers /bin/sh | grep -q ld.so.1
-	if test "$?" = 0 ; then LIBC="libc1" ; else LIBC="" ; fi
-	echo ${UNAME_MACHINE}-unknown-linux-gnu${LIBC}
+	if test "$?" = 0 ; then LIBC=gnulibc1 ; fi
+	echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
+	exit ;;
+    arc:Linux:*:* | arceb:Linux:*:*)
+	echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
 	exit ;;
     arm*:Linux:*:*)
 	eval $set_cc_for_build
 	if echo __ARM_EABI__ | $CC_FOR_BUILD -E - 2>/dev/null \
 	    | grep -q __ARM_EABI__
 	then
-	    echo ${UNAME_MACHINE}-unknown-linux-gnu
+	    echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
 	else
 	    if echo __ARM_PCS_VFP | $CC_FOR_BUILD -E - 2>/dev/null \
 		| grep -q __ARM_PCS_VFP
 	    then
-		echo ${UNAME_MACHINE}-unknown-linux-gnueabi
+		echo ${UNAME_MACHINE}-unknown-linux-${LIBC}eabi
 	    else
-		echo ${UNAME_MACHINE}-unknown-linux-gnueabihf
+		echo ${UNAME_MACHINE}-unknown-linux-${LIBC}eabihf
 	    fi
 	fi
 	exit ;;
     avr32*:Linux:*:*)
-	echo ${UNAME_MACHINE}-unknown-linux-gnu
+	echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
 	exit ;;
     cris:Linux:*:*)
-	echo cris-axis-linux-gnu
+	echo ${UNAME_MACHINE}-axis-linux-${LIBC}
 	exit ;;
     crisv32:Linux:*:*)
-	echo crisv32-axis-linux-gnu
+	echo ${UNAME_MACHINE}-axis-linux-${LIBC}
+	exit ;;
+    e2k:Linux:*:*)
+	echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
 	exit ;;
     frv:Linux:*:*)
-	echo frv-unknown-linux-gnu
+	echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
 	exit ;;
     hexagon:Linux:*:*)
-	echo hexagon-unknown-linux-gnu
+	echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
 	exit ;;
     i*86:Linux:*:*)
-	LIBC=gnu
-	eval $set_cc_for_build
-	sed 's/^	//' << EOF >$dummy.c
-	#ifdef __dietlibc__
-	LIBC=dietlibc
-	#endif
-EOF
-	eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep '^LIBC'`
-	echo "${UNAME_MACHINE}-pc-linux-${LIBC}"
+	echo ${UNAME_MACHINE}-pc-linux-${LIBC}
 	exit ;;
     ia64:Linux:*:*)
-	echo ${UNAME_MACHINE}-unknown-linux-gnu
+	echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
+	exit ;;
+    k1om:Linux:*:*)
+	echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
 	exit ;;
     m32r*:Linux:*:*)
-	echo ${UNAME_MACHINE}-unknown-linux-gnu
+	echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
 	exit ;;
     m68*:Linux:*:*)
-	echo ${UNAME_MACHINE}-unknown-linux-gnu
+	echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
 	exit ;;
     mips:Linux:*:* | mips64:Linux:*:*)
 	eval $set_cc_for_build
@@ -945,54 +995,63 @@
 	#endif
 EOF
 	eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep '^CPU'`
-	test x"${CPU}" != x && { echo "${CPU}-unknown-linux-gnu"; exit; }
+	test x"${CPU}" != x && { echo "${CPU}-unknown-linux-${LIBC}"; exit; }
 	;;
-    or32:Linux:*:*)
-	echo or32-unknown-linux-gnu
+    openrisc*:Linux:*:*)
+	echo or1k-unknown-linux-${LIBC}
+	exit ;;
+    or32:Linux:*:* | or1k*:Linux:*:*)
+	echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
 	exit ;;
     padre:Linux:*:*)
-	echo sparc-unknown-linux-gnu
+	echo sparc-unknown-linux-${LIBC}
 	exit ;;
     parisc64:Linux:*:* | hppa64:Linux:*:*)
-	echo hppa64-unknown-linux-gnu
+	echo hppa64-unknown-linux-${LIBC}
 	exit ;;
     parisc:Linux:*:* | hppa:Linux:*:*)
 	# Look for CPU level
 	case `grep '^cpu[^a-z]*:' /proc/cpuinfo 2>/dev/null | cut -d' ' -f2` in
-	  PA7*) echo hppa1.1-unknown-linux-gnu ;;
-	  PA8*) echo hppa2.0-unknown-linux-gnu ;;
-	  *)    echo hppa-unknown-linux-gnu ;;
+	  PA7*) echo hppa1.1-unknown-linux-${LIBC} ;;
+	  PA8*) echo hppa2.0-unknown-linux-${LIBC} ;;
+	  *)    echo hppa-unknown-linux-${LIBC} ;;
 	esac
 	exit ;;
     ppc64:Linux:*:*)
-	echo powerpc64-unknown-linux-gnu
+	echo powerpc64-unknown-linux-${LIBC}
 	exit ;;
     ppc:Linux:*:*)
-	echo powerpc-unknown-linux-gnu
+	echo powerpc-unknown-linux-${LIBC}
+	exit ;;
+    ppc64le:Linux:*:*)
+	echo powerpc64le-unknown-linux-${LIBC}
+	exit ;;
+    ppcle:Linux:*:*)
+	echo powerpcle-unknown-linux-${LIBC}
 	exit ;;
     s390:Linux:*:* | s390x:Linux:*:*)
-	echo ${UNAME_MACHINE}-ibm-linux
+	echo ${UNAME_MACHINE}-ibm-linux-${LIBC}
 	exit ;;
     sh64*:Linux:*:*)
-	echo ${UNAME_MACHINE}-unknown-linux-gnu
+	echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
 	exit ;;
     sh*:Linux:*:*)
-	echo ${UNAME_MACHINE}-unknown-linux-gnu
+	echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
 	exit ;;
     sparc:Linux:*:* | sparc64:Linux:*:*)
-	echo ${UNAME_MACHINE}-unknown-linux-gnu
+	echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
 	exit ;;
     tile*:Linux:*:*)
-	echo ${UNAME_MACHINE}-unknown-linux-gnu
+	echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
 	exit ;;
     vax:Linux:*:*)
-	echo ${UNAME_MACHINE}-dec-linux-gnu
+	echo ${UNAME_MACHINE}-dec-linux-${LIBC}
 	exit ;;
     x86_64:Linux:*:*)
-	echo x86_64-unknown-linux-gnu
+	echo ${UNAME_MACHINE}-pc-linux-${LIBC}
 	exit ;;
     xtensa*:Linux:*:*)
-	echo ${UNAME_MACHINE}-unknown-linux-gnu
+	echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
 	exit ;;
     i*86:DYNIX/ptx:4*:*)
 	# ptx 4.0 does uname -s correctly, with DYNIX/ptx in there.
@@ -1068,7 +1127,7 @@
 	# uname -m prints for DJGPP always 'pc', but it prints nothing about
 	# the processor, so we play safe by assuming i586.
 	# Note: whatever this is, it MUST be the same as what config.sub
-	# prints for the "djgpp" host, or else GDB configury will decide that
+	# prints for the "djgpp" host, or else GDB configure will decide that
 	# this is a cross-build.
 	echo i586-pc-msdosdjgpp
 	exit ;;
@@ -1196,6 +1255,9 @@
     BePC:Haiku:*:*)	# Haiku running on Intel PC compatible.
 	echo i586-pc-haiku
 	exit ;;
+    x86_64:Haiku:*:*)
+	echo x86_64-unknown-haiku
+	exit ;;
     SX-4:SUPER-UX:*:*)
 	echo sx4-nec-superux${UNAME_RELEASE}
 	exit ;;
@@ -1214,6 +1276,9 @@
     SX-8R:SUPER-UX:*:*)
 	echo sx8r-nec-superux${UNAME_RELEASE}
 	exit ;;
+    SX-ACE:SUPER-UX:*:*)
+	echo sxace-nec-superux${UNAME_RELEASE}
+	exit ;;
     Power*:Rhapsody:*:*)
 	echo powerpc-apple-rhapsody${UNAME_RELEASE}
 	exit ;;
@@ -1222,24 +1287,36 @@
 	exit ;;
     *:Darwin:*:*)
 	UNAME_PROCESSOR=`uname -p` || UNAME_PROCESSOR=unknown
-	case $UNAME_PROCESSOR in
-	    i386)
-		eval $set_cc_for_build
-		if [ "$CC_FOR_BUILD" != 'no_compiler_found' ]; then
-		  if (echo '#ifdef __LP64__'; echo IS_64BIT_ARCH; echo '#endif') | \
-		      (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) | \
-		      grep IS_64BIT_ARCH >/dev/null
-		  then
-		      UNAME_PROCESSOR="x86_64"
-		  fi
-		fi ;;
-	    unknown) UNAME_PROCESSOR=powerpc ;;
-	esac
+	eval $set_cc_for_build
+	if test "$UNAME_PROCESSOR" = unknown ; then
+	    UNAME_PROCESSOR=powerpc
+	fi
+	if test `echo "$UNAME_RELEASE" | sed -e 's/\..*//'` -le 10 ; then
+	    if [ "$CC_FOR_BUILD" != no_compiler_found ]; then
+		if (echo '#ifdef __LP64__'; echo IS_64BIT_ARCH; echo '#endif') | \
+		    (CCOPTS="" $CC_FOR_BUILD -E - 2>/dev/null) | \
+		    grep IS_64BIT_ARCH >/dev/null
+		then
+		    case $UNAME_PROCESSOR in
+			i386) UNAME_PROCESSOR=x86_64 ;;
+			powerpc) UNAME_PROCESSOR=powerpc64 ;;
+		    esac
+		fi
+	    fi
+	elif test "$UNAME_PROCESSOR" = i386 ; then
+	    # Avoid executing cc on OS X 10.9, as it ships with a stub
+	    # that puts up a graphical alert prompting to install
+	    # developer tools.  Any system running Mac OS X 10.7 or
+	    # later (Darwin 11 and later) is required to have a 64-bit
+	    # processor. This is not true of the ARM version of Darwin
+	    # that Apple uses in portable devices.
+	    UNAME_PROCESSOR=x86_64
+	fi
 	echo ${UNAME_PROCESSOR}-apple-darwin${UNAME_RELEASE}
 	exit ;;
     *:procnto*:*:* | *:QNX:[0123456789]*:*)
 	UNAME_PROCESSOR=`uname -p`
-	if test "$UNAME_PROCESSOR" = "x86"; then
+	if test "$UNAME_PROCESSOR" = x86; then
 		UNAME_PROCESSOR=i386
 		UNAME_MACHINE=pc
 	fi
@@ -1251,7 +1328,7 @@
     NEO-?:NONSTOP_KERNEL:*:*)
 	echo neo-tandem-nsk${UNAME_RELEASE}
 	exit ;;
-    NSE-?:NONSTOP_KERNEL:*:*)
+    NSE-*:NONSTOP_KERNEL:*:*)
 	echo nse-tandem-nsk${UNAME_RELEASE}
 	exit ;;
     NSR-?:NONSTOP_KERNEL:*:*)
@@ -1270,7 +1347,7 @@
 	# "uname -m" is not consistent, so use $cputype instead. 386
 	# is converted to i386 for consistency with other x86
 	# operating systems.
-	if test "$cputype" = "386"; then
+	if test "$cputype" = 386; then
 	    UNAME_MACHINE=i386
 	else
 	    UNAME_MACHINE="$cputype"
@@ -1312,7 +1389,7 @@
 	echo i386-pc-xenix
 	exit ;;
     i*86:skyos:*:*)
-	echo ${UNAME_MACHINE}-pc-skyos`echo ${UNAME_RELEASE}` | sed -e 's/ .*$//'
+	echo ${UNAME_MACHINE}-pc-skyos`echo ${UNAME_RELEASE} | sed -e 's/ .*$//'`
 	exit ;;
     i*86:rdos:*:*)
 	echo ${UNAME_MACHINE}-pc-rdos
@@ -1320,158 +1397,13 @@
     i*86:AROS:*:*)
 	echo ${UNAME_MACHINE}-pc-aros
 	exit ;;
-esac
-
-#echo '(No uname command or uname output not recognized.)' 1>&2
-#echo "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" 1>&2
-
-eval $set_cc_for_build
-cat >$dummy.c <<EOF
-#ifdef _SEQUENT_
-# include <sys/types.h>
-# include <sys/utsname.h>
-#endif
-main ()
-{
-#if defined (sony)
-#if defined (MIPSEB)
-  /* BFD wants "bsd" instead of "newsos".  Perhaps BFD should be changed,
-     I don't know....  */
-  printf ("mips-sony-bsd\n"); exit (0);
-#else
-#include <sys/param.h>
-  printf ("m68k-sony-newsos%s\n",
-#ifdef NEWSOS4
-	"4"
-#else
-	""
-#endif
-	); exit (0);
-#endif
-#endif
-
-#if defined (__arm) && defined (__acorn) && defined (__unix)
-  printf ("arm-acorn-riscix\n"); exit (0);
-#endif
-
-#if defined (hp300) && !defined (hpux)
-  printf ("m68k-hp-bsd\n"); exit (0);
-#endif
-
-#if defined (NeXT)
-#if !defined (__ARCHITECTURE__)
-#define __ARCHITECTURE__ "m68k"
-#endif
-  int version;
-  version=`(hostinfo | sed -n 's/.*NeXT Mach \([0-9]*\).*/\1/p') 2>/dev/null`;
-  if (version < 4)
-    printf ("%s-next-nextstep%d\n", __ARCHITECTURE__, version);
-  else
-    printf ("%s-next-openstep%d\n", __ARCHITECTURE__, version);
-  exit (0);
-#endif
-
-#if defined (MULTIMAX) || defined (n16)
-#if defined (UMAXV)
-  printf ("ns32k-encore-sysv\n"); exit (0);
-#else
-#if defined (CMU)
-  printf ("ns32k-encore-mach\n"); exit (0);
-#else
-  printf ("ns32k-encore-bsd\n"); exit (0);
-#endif
-#endif
-#endif
-
-#if defined (__386BSD__)
-  printf ("i386-pc-bsd\n"); exit (0);
-#endif
-
-#if defined (sequent)
-#if defined (i386)
-  printf ("i386-sequent-dynix\n"); exit (0);
-#endif
-#if defined (ns32000)
-  printf ("ns32k-sequent-dynix\n"); exit (0);
-#endif
-#endif
-
-#if defined (_SEQUENT_)
-    struct utsname un;
-
-    uname(&un);
-
-    if (strncmp(un.version, "V2", 2) == 0) {
-	printf ("i386-sequent-ptx2\n"); exit (0);
-    }
-    if (strncmp(un.version, "V1", 2) == 0) { /* XXX is V1 correct? */
-	printf ("i386-sequent-ptx1\n"); exit (0);
-    }
-    printf ("i386-sequent-ptx\n"); exit (0);
-
-#endif
-
-#if defined (vax)
-# if !defined (ultrix)
-#  include <sys/param.h>
-#  if defined (BSD)
-#   if BSD == 43
-      printf ("vax-dec-bsd4.3\n"); exit (0);
-#   else
-#    if BSD == 199006
-      printf ("vax-dec-bsd4.3reno\n"); exit (0);
-#    else
-      printf ("vax-dec-bsd\n"); exit (0);
-#    endif
-#   endif
-#  else
-    printf ("vax-dec-bsd\n"); exit (0);
-#  endif
-# else
-    printf ("vax-dec-ultrix\n"); exit (0);
-# endif
-#endif
-
-#if defined (alliant) && defined (i860)
-  printf ("i860-alliant-bsd\n"); exit (0);
-#endif
-
-  exit (1);
-}
-EOF
-
-$CC_FOR_BUILD -o $dummy $dummy.c 2>/dev/null && SYSTEM_NAME=`$dummy` &&
-	{ echo "$SYSTEM_NAME"; exit; }
-
-# Apollos put the system type in the environment.
-
-test -d /usr/apollo && { echo ${ISP}-apollo-${SYSTYPE}; exit; }
-
-# Convex versions that predate uname can use getsysinfo(1)
-
-if [ -x /usr/convex/getsysinfo ]
-then
-    case `getsysinfo -f cpu_type` in
-    c1*)
-	echo c1-convex-bsd
+    x86_64:VMkernel:*:*)
+	echo ${UNAME_MACHINE}-unknown-esx
 	exit ;;
-    c2*)
-	if getsysinfo -f scalar_acc
-	then echo c32-convex-bsd
-	else echo c2-convex-bsd
-	fi
-	exit ;;
-    c34*)
-	echo c34-convex-bsd
+    amd64:Isilon\ OneFS:*:*)
+	echo x86_64-unknown-onefs
 	exit ;;
-    c38*)
-	echo c38-convex-bsd
-	exit ;;
-    c4*)
-	echo c4-convex-bsd
-	exit ;;
-    esac
-fi
+esac
 
 cat >&2 <<EOF
 $0: unable to guess system type
@@ -1480,9 +1412,9 @@
 the operating system you are using. It is advised that you
 download the most up to date version of the config scripts from
 
-  http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.guess;hb=HEAD
+  http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.guess
 and
-  http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.sub;hb=HEAD
+  http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.sub
 
 If the version you run ($0) is already up to date, please
 send the following data and any information you think might be
diff -Naur ruby-2.0.0-p648/tool/config.sub ruby-2.0.0-p648+ppc64le/tool/config.sub
--- ruby-2.0.0-p648/tool/config.sub	2012-01-29 13:50:18.000000000 +0000
+++ ruby-2.0.0-p648+ppc64le/tool/config.sub	2016-04-15 06:09:29.352405386 +0000
@@ -1,38 +1,31 @@
 #! /bin/sh
 # Configuration validation subroutine script.
-#   Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999,
-#   2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010,
-#   2011 Free Software Foundation, Inc.
-
-timestamp='2011-11-11'
-
-# This file is (in principle) common to ALL GNU software.
-# The presence of a machine in this file suggests that SOME GNU software
-# can handle that machine.  It does not imply ALL GNU software can.
-#
-# This file is free software; you can redistribute it and/or modify
-# it under the terms of the GNU General Public License as published by
-# the Free Software Foundation; either version 2 of the License, or
+#   Copyright 1992-2016 Free Software Foundation, Inc.
+
+timestamp='2016-03-30'
+
+# This file is free software; you can redistribute it and/or modify it
+# under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 3 of the License, or
 # (at your option) any later version.
 #
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-# GNU General Public License for more details.
+# This program is distributed in the hope that it will be useful, but
+# WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+# General Public License for more details.
 #
 # You should have received a copy of the GNU General Public License
-# along with this program; if not, write to the Free Software
-# Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA
-# 02110-1301, USA.
+# along with this program; if not, see <http://www.gnu.org/licenses/>.
 #
 # As a special exception to the GNU General Public License, if you
 # distribute this file as part of a program that contains a
 # configuration script generated by Autoconf, you may include it under
-# the same distribution terms that you use for the rest of that program.
+# the same distribution terms that you use for the rest of that
+# program.  This Exception is an additional permission under section 7
+# of the GNU General Public License, version 3 ("GPLv3").
 
 
-# Please send patches to <config-patches@gnu.org>.  Submit a context
-# diff and a properly formatted GNU ChangeLog entry.
+# Please send patches to <config-patches@gnu.org>.
 #
 # Configuration subroutine to validate and canonicalize a configuration type.
 # Supply the specified configuration type as an argument.
@@ -40,7 +33,7 @@
 # Otherwise, we print the canonical config type on stdout and succeed.
 
 # You can get the latest version of this script from:
-# http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.sub;hb=HEAD
+# http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.sub
 
 # This file is supposed to be the same for all GNU packages
 # and recognize all the CPU types, system types and aliases
@@ -60,8 +53,7 @@
 me=`echo "$0" | sed -e 's,.*/,,'`
 
 usage="\
-Usage: $0 [OPTION] CPU-MFR-OPSYS
-       $0 [OPTION] ALIAS
+Usage: $0 [OPTION] CPU-MFR-OPSYS or ALIAS
 
 Canonicalize a configuration name.
 
@@ -75,9 +67,7 @@
 version="\
 GNU config.sub ($timestamp)
 
-Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000,
-2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free
-Software Foundation, Inc.
+Copyright 1992-2016 Free Software Foundation, Inc.
 
 This is free software; see the source for copying conditions.  There is NO
 warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE."
@@ -125,13 +115,17 @@
 maybe_os=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\2/'`
 case $maybe_os in
   nto-qnx* | linux-gnu* | linux-android* | linux-dietlibc | linux-newlib* | \
-  linux-uclibc* | uclinux-uclibc* | uclinux-gnu* | kfreebsd*-gnu* | \
-  knetbsd*-gnu* | netbsd*-gnu* | \
+  linux-musl* | linux-uclibc* | uclinux-uclibc* | uclinux-gnu* | kfreebsd*-gnu* | \
+  knetbsd*-gnu* | netbsd*-gnu* | netbsd*-eabi* | \
   kopensolaris*-gnu* | \
   storm-chaos* | os2-emx* | rtmk-nova*)
     os=-$maybe_os
     basic_machine=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'`
     ;;
+  android-linux)
+    os=-linux-android
+    basic_machine=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'`-unknown
+    ;;
   *)
     basic_machine=`echo $1 | sed 's/-[^-]*$//'`
     if [ $basic_machine != $1 ]
@@ -154,7 +148,7 @@
 	-convergent* | -ncr* | -news | -32* | -3600* | -3100* | -hitachi* |\
 	-c[123]* | -convex* | -sun | -crds | -omron* | -dg | -ultra | -tti* | \
 	-harris | -dolphin | -highlevel | -gould | -cbm | -ns | -masscomp | \
-	-apple | -axis | -knuth | -cray | -microblaze)
+	-apple | -axis | -knuth | -cray | -microblaze*)
 		os=
 		basic_machine=$1
 		;;
@@ -223,6 +217,12 @@
 	-isc*)
 		basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
 		;;
+	-lynx*178)
+		os=-lynxos178
+		;;
+	-lynx*5)
+		os=-lynxos5
+		;;
 	-lynx*)
 		os=-lynxos
 		;;
@@ -247,24 +247,29 @@
 	# Some are omitted here because they have special meanings below.
 	1750a | 580 \
 	| a29k \
+	| aarch64 | aarch64_be \
 	| alpha | alphaev[4-8] | alphaev56 | alphaev6[78] | alphapca5[67] \
 	| alpha64 | alpha64ev[4-8] | alpha64ev56 | alpha64ev6[78] | alpha64pca5[67] \
 	| am33_2.0 \
-	| arc | arm | arm[bl]e | arme[lb] | armv[2345] | armv[345][lb] | avr | avr32 \
-        | be32 | be64 \
+	| arc | arceb \
+	| arm | arm[bl]e | arme[lb] | armv[2-8] | armv[3-8][lb] | armv7[arm] \
+	| avr | avr32 \
+	| ba \
+	| be32 | be64 \
 	| bfin \
-	| c4x | clipper \
+	| c4x | c8051 | clipper \
 	| d10v | d30v | dlx | dsp16xx \
-	| epiphany \
-	| fido | fr30 | frv \
+	| e2k | epiphany \
+	| fido | fr30 | frv | ft32 \
 	| h8300 | h8500 | hppa | hppa1.[01] | hppa2.0 | hppa2.0[nw] | hppa64 \
 	| hexagon \
 	| i370 | i860 | i960 | ia64 \
 	| ip2k | iq2000 \
+	| k1om \
 	| le32 | le64 \
 	| lm32 \
 	| m32c | m32r | m32rle | m68000 | m68k | m88k \
-	| maxq | mb | microblaze | mcore | mep | metag \
+	| maxq | mb | microblaze | microblazeel | mcore | mep | metag \
 	| mips | mipsbe | mipseb | mipsel | mipsle \
 	| mips16 \
 	| mips64 | mips64el \
@@ -278,26 +283,29 @@
 	| mips64vr5900 | mips64vr5900el \
 	| mipsisa32 | mipsisa32el \
 	| mipsisa32r2 | mipsisa32r2el \
+	| mipsisa32r6 | mipsisa32r6el \
 	| mipsisa64 | mipsisa64el \
 	| mipsisa64r2 | mipsisa64r2el \
+	| mipsisa64r6 | mipsisa64r6el \
 	| mipsisa64sb1 | mipsisa64sb1el \
 	| mipsisa64sr71k | mipsisa64sr71kel \
+	| mipsr5900 | mipsr5900el \
 	| mipstx39 | mipstx39el \
 	| mn10200 | mn10300 \
 	| moxie \
 	| mt \
 	| msp430 \
 	| nds32 | nds32le | nds32be \
-	| nios | nios2 \
+	| nios | nios2 | nios2eb | nios2el \
 	| ns16k | ns32k \
-	| open8 \
-	| or32 \
+	| open8 | or1k | or1knd | or32 \
 	| pdp10 | pdp11 | pj | pjl \
 	| powerpc | powerpc64 | powerpc64le | powerpcle \
 	| pyramid \
+	| riscv32 | riscv64 \
 	| rl78 | rx \
 	| score \
-	| sh | sh[1234] | sh[24]a | sh[24]aeb | sh[23]e | sh[34]eb | sheb | shbe | shle | sh[1234]le | sh3ele \
+	| sh | sh[1234] | sh[24]a | sh[24]aeb | sh[23]e | sh[234]eb | sheb | shbe | shle | sh[1234]le | sh3ele \
 	| sh64 | sh64le \
 	| sparc | sparc64 | sparc64b | sparc64v | sparc86x | sparclet | sparclite \
 	| sparcv8 | sparcv9 | sparcv9b | sparcv9v \
@@ -305,6 +313,7 @@
 	| tahoe | tic4x | tic54x | tic55x | tic6x | tic80 | tron \
 	| ubicom32 \
 	| v850 | v850e | v850e1 | v850e2 | v850es | v850e2v3 \
+	| visium \
 	| we32k \
 	| x86 | xc16x | xstormy16 | xtensa \
 	| z8k | z80)
@@ -319,8 +328,10 @@
 	c6x)
 		basic_machine=tic6x-unknown
 		;;
-	m6811 | m68hc11 | m6812 | m68hc12 | picochip)
-		# Motorola 68HC11/12.
+	leon|leon[3-9])
+		basic_machine=sparc-$basic_machine
+		;;
+	m6811 | m68hc11 | m6812 | m68hc12 | m68hcs12x | nvptx | picochip)
 		basic_machine=$basic_machine-unknown
 		os=-none
 		;;
@@ -333,7 +344,10 @@
 	strongarm | thumb | xscale)
 		basic_machine=arm-unknown
 		;;
-
+	xgate)
+		basic_machine=$basic_machine-unknown
+		os=-none
+		;;
 	xscaleeb)
 		basic_machine=armeb-unknown
 		;;
@@ -356,28 +370,32 @@
 	# Recognize the basic CPU types with company name.
 	580-* \
 	| a29k-* \
+	| aarch64-* | aarch64_be-* \
 	| alpha-* | alphaev[4-8]-* | alphaev56-* | alphaev6[78]-* \
 	| alpha64-* | alpha64ev[4-8]-* | alpha64ev56-* | alpha64ev6[78]-* \
-	| alphapca5[67]-* | alpha64pca5[67]-* | arc-* \
+	| alphapca5[67]-* | alpha64pca5[67]-* | arc-* | arceb-* \
 	| arm-*  | armbe-* | armle-* | armeb-* | armv*-* \
 	| avr-* | avr32-* \
+	| ba-* \
 	| be32-* | be64-* \
 	| bfin-* | bs2000-* \
 	| c[123]* | c30-* | [cjt]90-* | c4x-* \
-	| clipper-* | craynv-* | cydra-* \
+	| c8051-* | clipper-* | craynv-* | cydra-* \
 	| d10v-* | d30v-* | dlx-* \
-	| elxsi-* \
+	| e2k-* | elxsi-* \
 	| f30[01]-* | f700-* | fido-* | fr30-* | frv-* | fx80-* \
 	| h8300-* | h8500-* \
 	| hppa-* | hppa1.[01]-* | hppa2.0-* | hppa2.0[nw]-* | hppa64-* \
 	| hexagon-* \
 	| i*86-* | i860-* | i960-* | ia64-* \
 	| ip2k-* | iq2000-* \
+	| k1om-* \
 	| le32-* | le64-* \
 	| lm32-* \
 	| m32c-* | m32r-* | m32rle-* \
 	| m68000-* | m680[012346]0-* | m68360-* | m683?2-* | m68k-* \
-	| m88110-* | m88k-* | maxq-* | mcore-* | metag-* | microblaze-* \
+	| m88110-* | m88k-* | maxq-* | mcore-* | metag-* \
+	| microblaze-* | microblazeel-* \
 	| mips-* | mipsbe-* | mipseb-* | mipsel-* | mipsle-* \
 	| mips16-* \
 	| mips64-* | mips64el-* \
@@ -391,28 +409,33 @@
 	| mips64vr5900-* | mips64vr5900el-* \
 	| mipsisa32-* | mipsisa32el-* \
 	| mipsisa32r2-* | mipsisa32r2el-* \
+	| mipsisa32r6-* | mipsisa32r6el-* \
 	| mipsisa64-* | mipsisa64el-* \
 	| mipsisa64r2-* | mipsisa64r2el-* \
+	| mipsisa64r6-* | mipsisa64r6el-* \
 	| mipsisa64sb1-* | mipsisa64sb1el-* \
 	| mipsisa64sr71k-* | mipsisa64sr71kel-* \
+	| mipsr5900-* | mipsr5900el-* \
 	| mipstx39-* | mipstx39el-* \
 	| mmix-* \
 	| mt-* \
 	| msp430-* \
 	| nds32-* | nds32le-* | nds32be-* \
-	| nios-* | nios2-* \
+	| nios-* | nios2-* | nios2eb-* | nios2el-* \
 	| none-* | np1-* | ns16k-* | ns32k-* \
 	| open8-* \
+	| or1k*-* \
 	| orion-* \
 	| pdp10-* | pdp11-* | pj-* | pjl-* | pn-* | power-* \
 	| powerpc-* | powerpc64-* | powerpc64le-* | powerpcle-* \
 	| pyramid-* \
+	| riscv32-* | riscv64-* \
 	| rl78-* | romp-* | rs6000-* | rx-* \
 	| sh-* | sh[1234]-* | sh[24]a-* | sh[24]aeb-* | sh[23]e-* | sh[34]eb-* | sheb-* | shbe-* \
 	| shle-* | sh[1234]le-* | sh3ele-* | sh64-* | sh64le-* \
 	| sparc-* | sparc64-* | sparc64b-* | sparc64v-* | sparc86x-* | sparclet-* \
 	| sparclite-* \
-	| sparcv8-* | sparcv9-* | sparcv9b-* | sparcv9v-* | sv1-* | sx?-* \
+	| sparcv8-* | sparcv9-* | sparcv9b-* | sparcv9v-* | sv1-* | sx*-* \
 	| tahoe-* \
 	| tic30-* | tic4x-* | tic54x-* | tic55x-* | tic6x-* | tic80-* \
 	| tile*-* \
@@ -420,6 +443,7 @@
 	| ubicom32-* \
 	| v850-* | v850e-* | v850e1-* | v850es-* | v850e2-* | v850e2v3-* \
 	| vax-* \
+	| visium-* \
 	| we32k-* \
 	| x86-* | x86_64-* | xc16x-* | xps100-* \
 	| xstormy16-* | xtensa*-* \
@@ -496,6 +520,9 @@
 		basic_machine=i386-pc
 		os=-aros
 		;;
+	asmjs)
+		basic_machine=asmjs-unknown
+		;;
 	aux)
 		basic_machine=m68k-apple
 		os=-aux
@@ -719,7 +746,6 @@
 	i370-ibm* | ibm*)
 		basic_machine=i370-ibm
 		;;
-# I'm not sure what "Sysv32" means.  Should this be sysv3.2?
 	i*86v32)
 		basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'`
 		os=-sysv32
@@ -758,6 +784,9 @@
 		basic_machine=m68k-isi
 		os=-sysv
 		;;
+	leon-*|leon[3-9]-*)
+		basic_machine=sparc-`echo $basic_machine | sed 's/-.*//'`
+		;;
 	m68knommu)
 		basic_machine=m68k-unknown
 		os=-linux
@@ -777,11 +806,15 @@
 		basic_machine=ns32k-utek
 		os=-sysv
 		;;
-	microblaze)
+	microblaze*)
 		basic_machine=microblaze-xilinx
 		;;
+	mingw64)
+		basic_machine=x86_64-pc
+		os=-mingw64
+		;;
 	mingw32)
-		basic_machine=i386-pc
+		basic_machine=i686-pc
 		os=-mingw32
 		;;
 	mingw32ce)
@@ -809,6 +842,10 @@
 		basic_machine=powerpc-unknown
 		os=-morphos
 		;;
+	moxiebox)
+		basic_machine=moxie-unknown
+		os=-moxiebox
+		;;
 	msdos)
 		basic_machine=i386-pc
 		os=-msdos
@@ -817,7 +854,7 @@
 		basic_machine=`echo $basic_machine | sed -e 's/ms1-/mt-/'`
 		;;
 	msys)
-		basic_machine=i386-pc
+		basic_machine=i686-pc
 		os=-msys
 		;;
 	mvs)
@@ -1008,7 +1045,11 @@
 		basic_machine=i586-unknown
 		os=-pw32
 		;;
-	rdos)
+	rdos | rdos64)
+		basic_machine=x86_64-pc
+		os=-rdos
+		;;
+	rdos32)
 		basic_machine=i386-pc
 		os=-rdos
 		;;
@@ -1335,29 +1376,30 @@
 	-gnu* | -bsd* | -mach* | -minix* | -genix* | -ultrix* | -irix* \
 	      | -*vms* | -sco* | -esix* | -isc* | -aix* | -cnk* | -sunos | -sunos[34]*\
 	      | -hpux* | -unos* | -osf* | -luna* | -dgux* | -auroraux* | -solaris* \
-	      | -sym* | -kopensolaris* \
+	      | -sym* | -kopensolaris* | -plan9* \
 	      | -amigaos* | -amigados* | -msdos* | -newsos* | -unicos* | -aof* \
-	      | -aos* | -aros* \
+	      | -aos* | -aros* | -cloudabi* | -sortix* \
 	      | -nindy* | -vxsim* | -vxworks* | -ebmon* | -hms* | -mvs* \
 	      | -clix* | -riscos* | -uniplus* | -iris* | -rtu* | -xenix* \
 	      | -hiux* | -386bsd* | -knetbsd* | -mirbsd* | -netbsd* \
-	      | -openbsd* | -solidbsd* \
+	      | -bitrig* | -openbsd* | -solidbsd* | -libertybsd* \
 	      | -ekkobsd* | -kfreebsd* | -freebsd* | -riscix* | -lynxos* \
 	      | -bosx* | -nextstep* | -cxux* | -aout* | -elf* | -oabi* \
 	      | -ptx* | -coff* | -ecoff* | -winnt* | -domain* | -vsta* \
 	      | -udi* | -eabi* | -lites* | -ieee* | -go32* | -aux* \
 	      | -chorusos* | -chorusrdb* | -cegcc* \
 	      | -cygwin* | -msys* | -pe* | -psos* | -moss* | -proelf* | -rtems* \
-	      | -mingw32* | -linux-gnu* | -linux-android* \
-	      | -linux-newlib* | -linux-uclibc* \
-	      | -uxpv* | -beos* | -mpeix* | -udk* \
+	      | -mingw32* | -mingw64* | -linux-gnu* | -linux-android* \
+	      | -linux-newlib* | -linux-musl* | -linux-uclibc* \
+	      | -uxpv* | -beos* | -mpeix* | -udk* | -moxiebox* \
 	      | -interix* | -uwin* | -mks* | -rhapsody* | -darwin* | -opened* \
 	      | -openstep* | -oskit* | -conix* | -pw32* | -nonstopux* \
 	      | -storm-chaos* | -tops10* | -tenex* | -tops20* | -its* \
 	      | -os2* | -vos* | -palmos* | -uclinux* | -nucleus* \
 	      | -morphos* | -superux* | -rtmk* | -rtmk-nova* | -windiss* \
 	      | -powermax* | -dnix* | -nx6 | -nx7 | -sei* | -dragonfly* \
-	      | -skyos* | -haiku* | -rdos* | -toppers* | -drops* | -es*)
+	      | -skyos* | -haiku* | -rdos* | -toppers* | -drops* | -es* \
+	      | -onefs* | -tirtos*)
 	# Remember, each alternative MUST END IN *, to match a version number.
 		;;
 	-qnx*)
@@ -1481,9 +1523,6 @@
 	-aros*)
 		os=-aros
 		;;
-	-kaos*)
-		os=-kaos
-		;;
 	-zvmoe)
 		os=-zvmoe
 		;;
@@ -1492,6 +1531,8 @@
 		;;
 	-nacl*)
 		;;
+	-ios)
+		;;
 	-none)
 		;;
 	*)
@@ -1532,6 +1573,12 @@
 	c4x-* | tic4x-*)
 		os=-coff
 		;;
+	c8051-*)
+		os=-elf
+		;;
+	hexagon-*)
+		os=-elf
+		;;
 	tic54x-*)
 		os=-coff
 		;;
@@ -1559,9 +1606,6 @@
 		;;
 	m68000-sun)
 		os=-sunos3
-		# This also exists in the configure program, but was not the
-		# default.
-		# os=-sunos4
 		;;
 	m68*-cisco)
 		os=-aout
src/rvm/patches/ruby/2.0.0/broken_stack_protector.patch000066400000001103147511530530016774 0ustar00--- trunk/configure 2013-06-27 13:16:17.000000000 +0200
+++ trunk/configure 2013-09-08 20:47:28.911451551 +0200
@@ -7424,7 +7424,7 @@
   unset ac_c_werror_flag
 fi

- if test "x$stack_protector" = xyes; then
+ if test "x$stack_protector" = xnotbroken; then

     save_LDFLAGS="$LDFLAGS"
     LDFLAGS="$LDFLAGS -fstack-protector"
@@ -7475,7 +7475,7 @@
  fi
      ;;
 esac
-    if test "x$stack_protector" = xyes; then
+    if test "x$stack_protector" = xnotbroken; then
  # RUBY_APPEND_OPTION(XCFLAGS, -fstack-protector)
  case " ${XCFLAGS-} " in #(
   *' -fstack-protector '*) :
src/rvm/patches/ruby/2.0.0/43514.patch000066400000006342147511530530012720 0ustar00Index: load.c
===================================================================
--- a/load.c	(revision 43513)
+++ b/load.c	(revision 43514)
@@ -8,6 +8,7 @@
 #include "dln.h"
 #include "eval_intern.h"
 #include "probes.h"
+#include "node.h"
 
 VALUE ruby_dln_librefs;
 
@@ -482,6 +483,9 @@
 	else {
 	    VALUE bufstr;
 	    char *buf;
+	    static const char so_ext[][4] = {
+		".so", ".o",
+	    };
 
 	    if (ext && *ext) return 0;
 	    bufstr = rb_str_tmp_new(len + DLEXT_MAXLEN);
@@ -495,6 +499,14 @@
 		    return i ? 's' : 'r';
 		}
 	    }
+	    for (i = 0; i < numberof(so_ext); i++) {
+		strlcpy(buf + len, so_ext[i], DLEXT_MAXLEN + 1);
+		if (st_get_key(loading_tbl, (st_data_t)buf, &data)) {
+		    rb_str_resize(bufstr, 0);
+		    if (fn) *fn = (const char*)data;
+		    return 's';
+		}
+	    }
 	    rb_str_resize(bufstr, 0);
 	}
     }
@@ -709,6 +721,14 @@
 	st_insert(loading_tbl, (st_data_t)ftptr, data);
 	return (char *)ftptr;
     }
+    else if (RB_TYPE_P((VALUE)data, T_NODE) && nd_type((VALUE)data) == NODE_MEMO) {
+	NODE *memo = RNODE(data);
+	void (*init)(void) = (void (*)(void))memo->nd_cfnc;
+	data = (st_data_t)rb_thread_shield_new();
+	st_insert(loading_tbl, (st_data_t)ftptr, data);
+	(*init)();
+	return (char *)"";
+    }
     if (RTEST(ruby_verbose)) {
 	rb_warning("loading in progress, circular require considered harmful - %s", ftptr);
 	rb_backtrace_print_to(rb_stderr);
@@ -881,13 +901,16 @@
     switch (type) {
       case 0:
 	if (ft)
-	    break;
+	    goto statically_linked;
 	ftptr = RSTRING_PTR(tmp);
 	return rb_feature_p(ftptr, 0, FALSE, TRUE, 0);
 
       default:
-	if (ft)
-	    break;
+	if (ft) {
+	  statically_linked:
+	    if (loading) *path = rb_filesystem_str_new_cstr(loading);
+	    return ft;
+	}
       case 1:
 	ext = strrchr(ftptr = RSTRING_PTR(tmp), '.');
 	if (rb_feature_p(ftptr, ext, !--type, TRUE, &loading) && !loading)
@@ -957,6 +980,10 @@
 	    if (!path || !(ftptr = load_lock(RSTRING_PTR(path)))) {
 		result = Qfalse;
 	    }
+	    else if (!*ftptr) {
+		rb_provide_feature(path);
+		result = Qtrue;
+	    }
 	    else {
 		switch (found) {
 		  case 'r':
@@ -1005,26 +1032,30 @@
     return rb_require_safe(fn, rb_safe_level());
 }
 
-static VALUE
-init_ext_call(VALUE arg)
+static int
+register_init_ext(st_data_t *key, st_data_t *value, st_data_t init, int existing)
 {
-    SCOPE_SET(NOEX_PUBLIC);
-    (*(void (*)(void))arg)();
-    return Qnil;
+    const char *name = (char *)*key;
+    if (existing) {
+	/* already registered */
+	rb_warn("%s is already registered", name);
+    }
+    else {
+	*value = (st_data_t)NEW_MEMO(init, 0, 0);
+	*key = (st_data_t)ruby_strdup(name);
+    }
+    return ST_CONTINUE;
 }
 
 RUBY_FUNC_EXPORTED void
 ruby_init_ext(const char *name, void (*init)(void))
 {
-    char* const lock_key = load_lock(name);
-    if (lock_key) {
-	VALUE feature = rb_usascii_str_new_cstr(name);
-	OBJ_FREEZE(feature);
-	rb_vm_call_cfunc(rb_vm_top_self(), init_ext_call, (VALUE)init,
-			 0, feature);
-	rb_provide_feature(feature);
-	load_unlock(lock_key, 1);
+    st_table *loading_tbl = get_loading_table();
+
+    if (!loading_tbl) {
+	GET_VM()->loading_table = loading_tbl = st_init_strtable();
     }
+    st_update(loading_tbl, (st_data_t)name, register_init_ext, (st_data_t)init);
 }
 
 /*
src/rvm/patches/ruby/2.0.0/static.patch000066400000000462147511530530013524 0ustar00--- trunk/ext/extmk.rb  2013/05/28 02:30:13 40973
+++ trunk/ext/extmk.rb  2013/07/28 11:10:52 42213
@@ -227,7 +227,7 @@
         f.rewind
         f.print(s)
         f.truncate(f.pos)
-      end
+      end unless $static
     else
       open(makefile, "wb") do |f|
         f.puts "# " + DUMMY_SIGNATURE
src/rvm/patches/ruby/1.8.6/mbari.patch000066400000431447147511530530013357 0ustar00diff --git a/ChangeLog b/ChangeLog
index e66e305..e4c539a 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,20 @@
+Wed Feb 27 12:01:19 2009  Brent Roman  <brent@mbari.org>
+        
+        * rubysig.c:  added support for __anyPowerPC__
+        
+        * version.h:  bumped date
+
+Mon Feb 25 10:53:52 2008  Brent Roman  <brent@mbari.org>
+
+	* backported MBARI 8A patches still
+          fails YAML test_object_id_collision
+
+Mon Feb 16 10:53:52 2008  Brent Roman  <brent@mbari.org>
+
+	* backport from 1.8.7p72-mbari of MBARI patches described at
+          http://sites.google.com/site/brentsrubypatches
+          fails YAML test_object_id_collision
+
 Fri Aug  8 10:53:52 2008  Tanaka Akira  <akr@fsij.org>
 
 	* lib/resolv.rb: randomize source port and transaction id.
diff --git a/common.mk b/common.mk
index 6d5b35d..3e43e41 100644
--- a/common.mk
+++ b/common.mk
@@ -441,7 +441,7 @@ variable.$(OBJEXT): {$(VPATH)}variable.c {$(VPATH)}ruby.h config.h \
   {$(VPATH)}env.h {$(VPATH)}node.h {$(VPATH)}st.h {$(VPATH)}util.h
 version.$(OBJEXT): {$(VPATH)}version.c {$(VPATH)}ruby.h config.h \
   {$(VPATH)}defines.h {$(VPATH)}intern.h {$(VPATH)}missing.h \
-  {$(VPATH)}version.h
+  {$(VPATH)}rubysig.h {$(VPATH)}version.h
 
 dist: $(PROGRAM)
 	$(RUNRUBY) $(srcdir)/distruby.rb
diff --git a/configure.in b/configure.in
index c775862..aafeb30 100644
--- a/configure.in
+++ b/configure.in
@@ -139,6 +139,24 @@ AC_ARG_ENABLE(frame-address,
 if test $frame_address = yes; then
     AC_DEFINE(USE_BUILTIN_FRAME_ADDRESS)
 fi
+AC_ARG_ENABLE(mbari-api,
+       [  --enable-mbari-api      enable API changes from the MBARI patches. ],
+       [mbari_api=$enableval])
+if test "$mbari_api" = yes; then
+    AC_DEFINE(MBARI_API)
+fi
+AC_ARG_WITH(wipe-sites,
+[  --with-wipe-sites=MASK  override default STACK_WIPES_SITES mask in rubysig.h],
+[wipe_sites=$withval])
+if test "$wipe_sites" != ""; then
+  case $wipe_sites in
+       none|no)  wipe_sites=0x0;;
+       yes) wipe_sites=;;
+  esac
+  if test -n "$wipe_sites"; then
+    AC_DEFINE_UNQUOTED(STACK_WIPE_SITES,$wipe_sites)
+  fi
+fi
 
 AC_ARG_PROGRAM
 
diff --git a/eval.c b/eval.c
index 54a0fee..8002203 100644
--- a/eval.c
+++ b/eval.c
@@ -222,9 +222,9 @@ VALUE rb_cProc;
 VALUE rb_cBinding;
 static VALUE proc_invoke _((VALUE,VALUE,VALUE,VALUE));
 static VALUE rb_f_binding _((VALUE));
-static void rb_f_END _((void));
+NOINLINE(static void rb_f_END _((void)));
 static VALUE rb_f_block_given_p _((void));
-static VALUE block_pass _((VALUE,NODE*));
+static VALUE block_pass _((volatile VALUE, NODE *volatile));
 
 VALUE rb_cMethod;
 static VALUE method_call _((int, VALUE*, VALUE));
@@ -246,6 +246,30 @@ static int scope_vmode;
 VALUE (*ruby_sandbox_save)_((rb_thread_t));
 VALUE (*ruby_sandbox_restore)_((rb_thread_t));
 NODE* ruby_current_node;
+
+#if 0
+#define SET_CURRENT_SOURCE() (ruby_sourcefile = ruby_current_node->nd_file, \
+			      ruby_sourceline = nd_line(ruby_current_node))
+#else
+#define SET_CURRENT_SOURCE() ((void)0)
+#endif
+
+void
+ruby_set_current_source()
+{
+    if (ruby_current_node) {
+	ruby_sourcefile = ruby_current_node->nd_file;
+	ruby_sourceline = nd_line(ruby_current_node);
+    }
+}
+
+#ifdef MBARI_API
+#define SET_METHOD_SOURCE()  ruby_set_current_source()
+#else
+#define SET_METHOD_SOURCE()  (void)0
+#endif
+
+
 int ruby_safe_level = 0;
 /* safe-level:
    0 - strings from streams/environment/ARGV are tainted (default)
@@ -490,7 +514,7 @@ rb_get_method_body(klassp, idp, noexp)
 {
     ID id = *idp;
     VALUE klass = *klassp;
-    VALUE origin;
+    VALUE origin = 0;
     NODE * volatile body;
     struct cache_entry *ent;
 
@@ -729,6 +753,7 @@ rb_attr(klass, id, read, write, ex)
     if (!name) {
 	rb_raise(rb_eArgError, "argument needs to be symbol or string");
     }
+    SET_METHOD_SOURCE();
     len = strlen(name)+2;
     buf = ALLOCA_N(char,len);
     snprintf(buf, len, "@%s", name);
@@ -769,11 +794,11 @@ static unsigned long frame_unique = 0;
     _frame.argc = 0;			\
     _frame.flags = 0;			\
     _frame.uniq = frame_unique++;	\
-    ruby_frame = &_frame
+    ruby_frame = (struct FRAME *)&_frame
 
 #define POP_FRAME()  			\
     ruby_current_node = _frame.node;	\
-    ruby_frame = _frame.prev;		\
+    ruby_frame = _frame.prev;           \
 } while (0)
 
 struct BLOCK {
@@ -967,7 +992,7 @@ rb_svar(cnt)
     ID id;
 
     if (!ruby_scope->local_tbl) return NULL;
-    if (cnt >= ruby_scope->local_tbl[0]) return NULL;
+    if ((ID)cnt >= ruby_scope->local_tbl[0]) return NULL;
     id = ruby_scope->local_tbl[cnt+1];
     while (vars) {
 	if (vars->id == id) return &vars->val;
@@ -1030,7 +1055,26 @@ static struct tag *prot_tag;
 #define PROT_LAMBDA INT2FIX(2)	/* 5 */
 #define PROT_YIELD  INT2FIX(3)	/* 7 */
 
-#define EXEC_TAG()    (FLUSH_REGISTER_WINDOWS, ruby_setjmp(((void)0), prot_tag->buf))
+#if STACK_WIPE_SITES & 0x42
+#ifdef __GNUC__
+static inline int wipeAfter(int) __attribute__((always_inline));
+#endif
+static inline int wipeAfter(int status)
+{
+  rb_gc_wipe_stack();
+  return status;
+}
+#else
+#define wipeAfter(status) status
+#endif
+#if STACK_WIPE_SITES & 2
+#define wipeAfterTag(status) wipeAfter(status)
+#else
+#define wipeAfterTag(status) status
+#endif
+
+#define EXEC_TAG_0()  ruby_setjmp(((void)0), prot_tag->buf)
+#define EXEC_TAG()    wipeAfterTag(EXEC_TAG_0())
 
 #define JUMP_TAG(st) do {		\
     ruby_frame = prot_tag->frame;	\
@@ -1106,10 +1150,17 @@ static void scope_dup _((struct SCOPE *));
 } while (0)
 
 static VALUE rb_eval _((VALUE,NODE*));
-static VALUE eval _((VALUE,VALUE,VALUE,char*,int));
-static NODE *compile _((VALUE, char*, int));
+static VALUE eval _((VALUE,VALUE,volatile VALUE,const char* volatile,int));
+static NODE *compile _((VALUE, const char*, int));
 
-static VALUE rb_yield_0 _((VALUE, VALUE, VALUE, int, int));
+static VALUE rb_yield_0 
+               _((volatile VALUE, volatile VALUE, VALUE, int, volatile int));
+
+#if STACK_WIPE_SITES & 0x20
+#define wipeBeforeYield()  rb_gc_wipe_stack()
+#else
+#define wipeBeforeYield()  (void)0
+#endif
 
 #define YIELD_LAMBDA_CALL 1
 #define YIELD_PROC_CALL   2
@@ -1118,7 +1169,7 @@ static VALUE rb_yield_0 _((VALUE, VALUE, VALUE, int, int));
 #define YIELD_FUNC_SVALUE 2
 
 static VALUE rb_call _((VALUE,VALUE,ID,int,const VALUE*,int,VALUE));
-static VALUE module_setup _((VALUE,NODE*));
+static VALUE module_setup _((VALUE,NODE *volatile));
 
 static VALUE massign _((VALUE,NODE*,VALUE,int));
 static void assign _((VALUE,NODE*,VALUE,int));
@@ -1150,22 +1201,6 @@ static VALUE trace_func = 0;
 static int tracing = 0;
 static void call_trace_func _((rb_event_t,NODE*,VALUE,ID,VALUE));
 
-#if 0
-#define SET_CURRENT_SOURCE() (ruby_sourcefile = ruby_current_node->nd_file, \
-			      ruby_sourceline = nd_line(ruby_current_node))
-#else
-#define SET_CURRENT_SOURCE() ((void)0)
-#endif
-
-void
-ruby_set_current_source()
-{
-    if (ruby_current_node) {
-	ruby_sourcefile = ruby_current_node->nd_file;
-	ruby_sourceline = nd_line(ruby_current_node);
-    }
-}
-
 static void
 #ifdef HAVE_STDARG_PROTOTYPES
 warn_printf(const char *fmt, ...)
@@ -1227,20 +1262,15 @@ set_backtrace(info, bt)
 static void
 error_print()
 {
-    VALUE errat = Qnil;		/* OK */
+    VALUE errat;
     volatile VALUE eclass, e;
-    char *einfo;
+    const char * einfo;
     long elen;
 
     if (NIL_P(ruby_errinfo)) return;
 
     PUSH_TAG(PROT_NONE);
-    if (EXEC_TAG() == 0) {
-	errat = get_backtrace(ruby_errinfo);
-    }
-    else {
-	errat = Qnil;
-    }
+    errat = EXEC_TAG() ? Qnil : get_backtrace(ruby_errinfo);
     if (EXEC_TAG()) goto error;
     if (NIL_P(errat)){
 	ruby_set_current_source();
@@ -1422,7 +1452,7 @@ ruby_init()
 }
 
 static VALUE
-eval_node(self, node)
+eval_tree(self, node)
     VALUE self;
     NODE *node;
 {
@@ -1571,12 +1601,13 @@ ruby_finalize()
 }
 
 int
-ruby_cleanup(ex)
-    int ex;
+ruby_cleanup(exArg)
+    int exArg;
 {
     int state;
     volatile VALUE errs[2];
-    int nerr;
+    unsigned nerr;
+    volatile int ex = exArg;
 
     errs[1] = ruby_errinfo;
     ruby_safe_level = 0;
@@ -1639,7 +1670,7 @@ ruby_exec_internal()
     /* default visibility is private at toplevel */
     SCOPE_SET(SCOPE_PRIVATE);
     if ((state = EXEC_TAG()) == 0) {
-	eval_node(ruby_top_self, ruby_eval_tree);
+	eval_tree(ruby_top_self, ruby_eval_tree);
     }
     POP_ITER();
     POP_TAG();
@@ -1847,8 +1878,8 @@ rb_eval_cmd(cmd, arg, level)
     int level;
 {
     int state;
-    VALUE val = Qnil;		/* OK */
-    struct SCOPE *saved_scope;
+    VALUE val;
+    struct SCOPE * volatile saved_scope;
     volatile int safe = ruby_safe_level;
 
     if (OBJ_TAINTED(cmd)) {
@@ -1879,9 +1910,7 @@ rb_eval_cmd(cmd, arg, level)
     ruby_safe_level = level;
 
     PUSH_TAG(PROT_NONE);
-    if ((state = EXEC_TAG()) == 0) {
-	val = eval(ruby_top_self, cmd, Qnil, 0, 0);
-    }
+    val = (state = EXEC_TAG()) ? Qnil : eval(ruby_top_self, cmd, Qnil, 0, 0);
     if (ruby_scope->flags & SCOPE_DONT_RECYCLE)
 	scope_dup(saved_scope);
     ruby_scope = saved_scope;
@@ -1920,6 +1949,10 @@ ev_const_defined(cref, id, self)
     return rb_const_defined(cref->nd_clss, id);
 }
 
+NOINLINE(static VALUE ev_const_get _((NODE *cref, ID id, VALUE self)));
+NOINLINE(static void eval_cvar_set _((NODE *node, VALUE result, int warn)));
+NOINLINE(static void eval_cdecl _((VALUE self, NODE *node, VALUE value)));
+
 static VALUE
 ev_const_get(cref, id, self)
     NODE *cref;
@@ -2032,7 +2065,7 @@ void
 rb_frozen_class_p(klass)
     VALUE klass;
 {
-    char *desc = "something(?!)";
+    const char *desc = "something(?!)";
 
     if (OBJ_FROZEN(klass)) {
 	if (FL_TEST(klass, FL_SINGLETON))
@@ -2070,7 +2103,7 @@ rb_undef(klass, id)
     }
     body = search_method(klass, id, &origin);
     if (!body || !body->nd_body) {
-	char *s0 = " class";
+	const char *s0 = " class";
 	VALUE c = klass;
 
 	if (FL_TEST(c, FL_SINGLETON)) {
@@ -2161,7 +2194,7 @@ rb_alias(klass, name, def)
     VALUE klass;
     ID name, def;
 {
-    VALUE origin;
+    VALUE origin = 0;
     NODE *orig, *body, *node;
     VALUE singleton = 0;
     st_data_t data;
@@ -2247,7 +2280,10 @@ rb_copy_node_scope(node, rval)
     NODE *node;
     NODE *rval;
 {
-    NODE *copy = NEW_NODE(NODE_SCOPE,0,rval,node->nd_next);
+    NODE *copy;
+
+    SET_METHOD_SOURCE();
+    copy=NEW_NODE(NODE_SCOPE,0,rval,node->nd_next);
 
     if (node->nd_tbl) {
 	copy->nd_tbl = ALLOC_N(ID, node->nd_tbl[0]+1);
@@ -2322,9 +2358,9 @@ rb_copy_node_scope(node, rval)
 
 #define MATCH_DATA *rb_svar(node->nd_cnt)
 
-static char* is_defined _((VALUE, NODE*, char*));
+static const char* is_defined _((VALUE, NODE*, char*));
 
-static char*
+static const char*
 arg_defined(self, node, buf, type)
     VALUE self;
     NODE *node;
@@ -2351,13 +2387,13 @@ arg_defined(self, node, buf, type)
     return type;
 }
 
-static char*
+static const char*
 is_defined(self, node, buf)
     VALUE self;
-    NODE *node;			/* OK */
+    NODE *node;
     char *buf;
 {
-    VALUE val;			/* OK */
+    VALUE val;
     int state;
 
   again:
@@ -2671,27 +2707,27 @@ set_trace_func(obj, trace)
     return trace;
 }
 
-static char *
+static const char *
 get_event_name(rb_event_t event)
 {
     switch (event) {
-    case RUBY_EVENT_LINE:
+      case RUBY_EVENT_LINE:
 	return "line";
-    case RUBY_EVENT_CLASS:
+      case RUBY_EVENT_CLASS:
 	return "class";
-    case RUBY_EVENT_END:
+      case RUBY_EVENT_END:
 	return "end";
-    case RUBY_EVENT_CALL:
+      case RUBY_EVENT_CALL:
 	return "call";
-    case RUBY_EVENT_RETURN:
+      case RUBY_EVENT_RETURN:
 	return "return";
-    case RUBY_EVENT_C_CALL:
+      case RUBY_EVENT_C_CALL:
 	return "c-call";
-    case RUBY_EVENT_C_RETURN:
+      case RUBY_EVENT_C_RETURN:
 	return "c-return";
-    case RUBY_EVENT_RAISE:
+      case RUBY_EVENT_RAISE:
 	return "raise";
-    default:
+      default:
 	return "unknown";
     }
 }
@@ -2702,14 +2738,15 @@ call_trace_func(event, node, self, id, klass)
     NODE *node;
     VALUE self;
     ID id;
-    VALUE klass;		/* OK */
+    VALUE klass;
 {
-    int state, raised;
+    int state;
+    volatile int raised;
     struct FRAME *prev;
-    NODE *node_save;
+    NODE * volatile node_save;
     VALUE srcfile;
-    char *event_name;
-    rb_thread_t th = curr_thread;
+    const char *event_name;
+    volatile rb_thread_t th = curr_thread;
 
     if (!trace_func) return;
     if (tracing) return;
@@ -2918,11 +2955,11 @@ class_prefix(self, cpath)
 NORETURN(static void return_jump _((VALUE)));
 NORETURN(static void break_jump _((VALUE)));
 NORETURN(static void next_jump _((VALUE)));
-NORETURN(static void unknown_node _((NODE * volatile)));
+NORETURN(static void unknown_node _((NODE *)));
 
 static void
 unknown_node(node)
-    NODE *volatile node;
+    NODE *node;
 {
     ruby_current_node = 0;
     if (node->flags == 0) {
@@ -2936,40 +2973,886 @@ unknown_node(node)
     }
 }
 
-static VALUE
-rb_eval(self, n)
-    VALUE self;
-    NODE *n;
+/*
+ *  functions factored out of rb_eval() to reduce its stack frame size
+ */
+#define eval_node_0(n,retType, self, node)  \
+NOINLINE(static retType TOKEN_PASTE(eval_,n) _((self, node)));\
+static retType TOKEN_PASTE(eval_,n)(self, node)
+
+#define eval_node(n,retType) \
+  eval_node_0(n,retType, VALUE self, NODE *node)
+#define eval_node_volatile(n,retType) \
+  eval_node_0(n,retType, volatile VALUE self, NODE * volatile node)
+
+eval_node(match2, VALUE)
+{
+    VALUE l = rb_eval(self,node->nd_recv);
+    VALUE r = rb_eval(self,node->nd_value);
+    return rb_reg_match(l, r);
+}
+
+eval_node(match3, VALUE)
 {
-    NODE * volatile contnode = 0;
-    NODE * volatile node = n;
+  VALUE r = rb_eval(self,node->nd_recv);
+  VALUE l = rb_eval(self,node->nd_value);
+  return TYPE(l) == T_STRING ? rb_reg_match(r, l) : rb_funcall(l, match, 1, r);
+}
+
+
+eval_node_volatile(opt_n, void)
+{
+  int state;
+  PUSH_TAG(PROT_LOOP);
+  switch (state = EXEC_TAG()) {
+    case TAG_NEXT:
+      state = 0;
+    case 0:
+      while (!NIL_P(rb_gets())) {
+	opt_n_redo:
+	  rb_eval(self, node->nd_body);
+      }
+      break;
+
+    case TAG_REDO:
+      state = 0;
+      goto opt_n_redo;
+
+    case TAG_BREAK:
+      state = 0;
+    default:
+      break;
+  }
+  POP_TAG();
+  if (state) JUMP_TAG(state);
+}
+
+
+eval_node(when, NODE*)
+{
+  do {
+      NODE *tag = node->nd_head;
+      while (tag) {
+	  EXEC_EVENT_HOOK(RUBY_EVENT_LINE, tag, self,
+			  ruby_frame->last_func,
+			  ruby_frame->last_class);
+	  if (tag->nd_head && nd_type(tag->nd_head) == NODE_WHEN) {
+	      VALUE v = rb_eval(self, tag->nd_head->nd_head);
+	      long i;
+
+	      if (TYPE(v) != T_ARRAY) v = rb_ary_to_ary(v);
+	      for (i=0; i<RARRAY(v)->len; i++) {
+		  if (RTEST(RARRAY(v)->ptr[i])) return node->nd_body;
+	      }
+	      tag = tag->nd_next;
+	      continue;
+	  }
+	  if (RTEST(rb_eval(self, tag->nd_head))) return node->nd_body;
+	  tag = tag->nd_next;
+      }
+  } while ((node = node->nd_next) && nd_type(node) == NODE_WHEN);
+  return node;
+}
+
+
+eval_node(case, NODE*)
+{
+  VALUE val = rb_eval(self, node->nd_head);
+  node = node->nd_body;
+  while (node) {
+      NODE *tag;
+
+      if (nd_type(node) != NODE_WHEN) break;
+      tag = node->nd_head;
+      while (tag) {
+	  EXEC_EVENT_HOOK(RUBY_EVENT_LINE, tag, self,
+			  ruby_frame->last_func,
+			  ruby_frame->last_class);
+	  if (tag->nd_head && nd_type(tag->nd_head) == NODE_WHEN) {
+	      VALUE v = rb_eval(self, tag->nd_head->nd_head);
+	      long i;
+
+	      if (TYPE(v) != T_ARRAY) v = rb_ary_to_ary(v);
+	      for (i=0; i<RARRAY(v)->len; i++) {
+		  if (RTEST(rb_funcall2(RARRAY(v)->ptr[i], eqq, 1, &val)))
+		      return node->nd_body;
+	      }
+	      tag = tag->nd_next;
+	      continue;
+	  }
+	  if (RTEST(rb_funcall2(rb_eval(self, tag->nd_head), eqq, 1, &val)))
+	      return node->nd_body;
+	  tag = tag->nd_next;
+      }
+      node = node->nd_next;
+  }
+  return node;
+}
+
+
+eval_node_volatile(while, VALUE)
+{
+  int state;
+  VALUE result;
+  PUSH_TAG(PROT_LOOP);
+  switch (state = EXEC_TAG()) {
+    case 0:
+      if (!(node->nd_state) || RTEST(rb_eval(self, node->nd_cond))) {
+        do {
+	  while_redo:
+#if STACK_WIPE_SITES & 0x10
+            rb_gc_wipe_stack();
+#endif
+	    rb_eval(self, node->nd_body);
+	  while_next:
+	    ;
+        } while (RTEST(rb_eval(self, node->nd_cond)));
+      }  /* fall thru */
+    default:
+      result=Qnil;
+      break;
+
+    case TAG_REDO:
+      state = 0;
+      goto while_redo;
+    case TAG_NEXT:
+      state = 0;
+      goto while_next;
+    case TAG_BREAK:
+      if (TAG_DST()) {
+	  state = 0;
+	  result = prot_tag->retval;
+      }
+  }
+  POP_TAG();
+  if (state) JUMP_TAG(state);
+  return result;
+}
+
+
+eval_node_volatile(until, VALUE)
+{
+  int state;
+  VALUE result;
+  PUSH_TAG(PROT_LOOP);
+  switch (state = EXEC_TAG()) {
+    case 0:
+      if (!(node->nd_state) || !RTEST(rb_eval(self, node->nd_cond))) {
+        do {
+          until_redo:
+  #if STACK_WIPE_SITES & 0x10
+            rb_gc_wipe_stack();
+  #endif
+	    rb_eval(self, node->nd_body);
+          until_next:
+	    ;
+        } while (!RTEST(rb_eval(self, node->nd_cond)));
+      }  /* fall thru */
+    default:
+      result=Qnil;
+      break;
+
+    case TAG_REDO:
+      state = 0;
+      goto until_redo;
+    case TAG_NEXT:
+      state = 0;
+      goto until_next;
+    case TAG_BREAK:
+      if (TAG_DST()) {
+	  state = 0;
+	  result = prot_tag->retval;
+      }
+  }
+  POP_TAG();
+  if (state) JUMP_TAG(state);
+  return result;
+}
+
+
+eval_node_volatile(iter, VALUE)
+{
+  int state;
+  VALUE result;
+
+  PUSH_TAG(PROT_LOOP);
+  PUSH_BLOCK(node->nd_var, node->nd_body);
+
+  state = EXEC_TAG();
+  switch (state) {
+    case TAG_RETRY:
+      state = 0;  /* fall thru to case 0 */
+    case 0:
+      PUSH_ITER(ITER_PRE);
+      if (nd_type(node) == NODE_ITER) {
+	  result = rb_eval(self, node->nd_iter);
+      }
+      else {
+	  _block.flags &= ~BLOCK_D_SCOPE;
+	  BEGIN_CALLARGS;
+	  result = rb_eval(self, node->nd_iter);
+	  END_CALLARGS;
+	  ruby_current_node = (NODE *)node;
+	  SET_CURRENT_SOURCE();
+	  result = rb_call(CLASS_OF(result),result,each,0,0,0,self);
+      }
+      POP_ITER();
+      break;
+      
+    case TAG_BREAK:
+      if (TAG_DST()) {
+        result = prot_tag->retval;
+        state = 0;
+      }
+  }
+  POP_BLOCK();
+  POP_TAG();
+  if (state) JUMP_TAG(state);
+  return result;
+}
+
+
+eval_node_volatile(rescue, VALUE)
+{
+    volatile VALUE e_info = ruby_errinfo;
+    volatile int rescuing = 0;
     int state;
-    volatile VALUE result = Qnil;
-    st_data_t data;
+    VALUE result;
 
-#define RETURN(v) do { \
-    result = (v); \
-    goto finish; \
-} while (0)
+    PUSH_TAG(PROT_NONE);
+    if ((state = EXEC_TAG()) == 0) {
+      retry_entry:
+	result = rb_eval(self, node->nd_head);
+    }
+    else if (rescuing) {
+	if (rescuing < 0) {
+	    /* in rescue argument, just reraise */
+            result = Qnil;
+	}
+	else if (state == TAG_RETRY) {
+	    rescuing = state = 0;
+	    ruby_errinfo = e_info;
+	    goto retry_entry;
+	}
+	else if (state != TAG_RAISE) {
+	    result = prot_tag->retval;
+	}
+    }
+    else if (state == TAG_RAISE) {
+	NODE *resq = node->nd_resq;
+
+	rescuing = -1;
+	while (resq) {
+	    ruby_current_node = resq;
+	    if (handle_rescue(self, resq)) {
+		state = 0;
+		rescuing = 1;
+		result = rb_eval(self, resq->nd_body);
+		break;
+	    }
+	    resq = resq->nd_head; /* next rescue */
+	}
+    }
+    else {
+	result = prot_tag->retval;
+    }
+    POP_TAG();
+    if (state != TAG_RAISE) ruby_errinfo = e_info;
+    if (state) {
+	JUMP_TAG(state);
+    }
+    /* no exception raised */
+    if (!rescuing && node->nd_else) { /* else clause given */
+	result = Qundef;  /* caller must eval this! */
+    }
+    return result;
+}
+
+
+eval_node_volatile(ensure, VALUE)
+{
+  int state;
+  VALUE result;
+
+  PUSH_TAG(PROT_NONE);
+  if ((state = EXEC_TAG()) == 0) {
+      result = rb_eval(self, node->nd_head);
+  }
+  POP_TAG();
+  if (node->nd_ensr && !thread_no_ensure()) {
+      VALUE retval = prot_tag->retval; /* save retval */
+      VALUE errinfo = ruby_errinfo;
+
+      rb_eval(self, node->nd_ensr);
+      return_value(retval);
+      ruby_errinfo = errinfo;
+  }
+  if (state) JUMP_TAG(state);
+  return result;
+}
+
+
+eval_node(dot, VALUE)
+{
+  VALUE beg = rb_eval(self, node->nd_beg);
+  VALUE end = rb_eval(self, node->nd_end);
+  return rb_range_new(beg, end, nd_type(node) == NODE_DOT3);
+}
+
+
+eval_node(flip2, VALUE)
+{
+  VALUE *flip = rb_svar(node->nd_cnt);
+  if (!flip) rb_bug("unexpected local variable");
+  if (!RTEST(*flip)) {
+    if (!RTEST(rb_eval(self, node->nd_beg)))
+      return Qfalse;
+    *flip = RTEST(rb_eval(self, node->nd_end))?Qfalse:Qtrue;
+  }
+  else if (RTEST(rb_eval(self, node->nd_end)))
+    *flip = Qfalse;
+  return Qtrue;
+}
+
+
+eval_node(flip3, VALUE)
+{
+  VALUE *flip = rb_svar(node->nd_cnt);
+  if (!flip) rb_bug("unexpected local variable");
+  if (!RTEST(*flip))
+    return *flip = (RTEST(rb_eval(self, node->nd_beg)) ? Qtrue : Qfalse);
+  if (RTEST(rb_eval(self, node->nd_end)))
+    *flip = Qfalse;
+  return Qtrue;
+}
+
+
+eval_node(attrasgn, VALUE)
+{
+  VALUE recv;
+  int argc; VALUE *argv; /* used in SETUP_ARGS */
+  int scope;
+  TMP_PROTECT;
+
+  BEGIN_CALLARGS;
+  if (node->nd_recv == (NODE *)1) {
+      recv = self;
+      scope = 1;
+  }
+  else {
+      recv = rb_eval(self, node->nd_recv);
+      scope = 0;
+  }
+  SETUP_ARGS(node->nd_args);
+  END_CALLARGS;
+
+  ruby_current_node = node;
+  SET_CURRENT_SOURCE();
+  rb_call(CLASS_OF(recv),recv,node->nd_mid,argc,argv,scope,self);
+  return argv[argc-1];
+}
+
+
+eval_node(call, VALUE)
+{
+  VALUE recv;
+  int argc; VALUE *argv; /* used in SETUP_ARGS */
+  TMP_PROTECT;
+
+  BEGIN_CALLARGS;
+  recv = rb_eval(self, node->nd_recv);
+  SETUP_ARGS(node->nd_args);
+  END_CALLARGS;
+
+  ruby_current_node = node;
+  SET_CURRENT_SOURCE();
+  return rb_call(CLASS_OF(recv),recv,node->nd_mid,argc,argv,0,self);
+}
+
+
+eval_node(fcall, VALUE)
+{
+  int argc; VALUE *argv; /* used in SETUP_ARGS */
+  TMP_PROTECT;
+
+  BEGIN_CALLARGS;
+  SETUP_ARGS(node->nd_args);
+  END_CALLARGS;
+
+  ruby_current_node = node;
+  SET_CURRENT_SOURCE();
+  return rb_call(CLASS_OF(self),self,node->nd_mid,argc,argv,1,self);
+}
+
+
+eval_node(super, VALUE)
+{
+  int argc; VALUE *argv; /* used in SETUP_ARGS */
+  TMP_PROTECT;
+
+  if (ruby_frame->last_class == 0) {
+      if (ruby_frame->last_func) {
+	  rb_name_error(ruby_frame->last_func,
+			"superclass method `%s' disabled",
+			rb_id2name(ruby_frame->orig_func));
+      }
+      else {
+	  rb_raise(rb_eNoMethodError, "super called outside of method");
+      }
+  }
+  if (nd_type(node) == NODE_ZSUPER) {
+      argc = ruby_frame->argc;
+      if (argc && DMETHOD_P()) {
+	  if (TYPE(RBASIC(ruby_scope)->klass) != T_ARRAY ||
+	      RARRAY(RBASIC(ruby_scope)->klass)->len != argc) {
+	      rb_raise(rb_eRuntimeError, 
+		       "super: specify arguments explicitly");
+	  }
+	  argv = RARRAY(RBASIC(ruby_scope)->klass)->ptr;
+      }
+      else if (!ruby_scope->local_vars) {
+	  argc = 0;
+	  argv = 0;
+      }
+      else {
+	  argv = ruby_scope->local_vars + 2;
+      }
+  }
+  else {
+      BEGIN_CALLARGS;
+      SETUP_ARGS(node->nd_args);
+      END_CALLARGS;
+      ruby_current_node = node;
+  }
+
+  SET_CURRENT_SOURCE();
+  return rb_call_super(argc, argv);
+}
+
+
+eval_node_volatile(scope, VALUE)
+{
+  int state;
+  VALUE result;
+  struct FRAME frame;
+  NODE * volatile saved_cref = 0;
+
+  frame = *ruby_frame;
+  frame.tmp = ruby_frame;
+  ruby_frame = &frame;
+
+  PUSH_SCOPE();
+  PUSH_TAG(PROT_NONE);
+  if (node->nd_rval) {
+      saved_cref = ruby_cref;
+      ruby_cref = (NODE*)node->nd_rval;
+  }
+  if (node->nd_tbl) {
+      VALUE *vars = ALLOCA_N(VALUE, node->nd_tbl[0]+1);
+      *vars++ = (VALUE)node;
+      ruby_scope->local_vars = vars;
+      rb_mem_clear(ruby_scope->local_vars, node->nd_tbl[0]);
+      ruby_scope->local_tbl = node->nd_tbl;
+  }
+  else {
+      ruby_scope->local_vars = 0;
+      ruby_scope->local_tbl  = 0;
+  }
+  if ((state = EXEC_TAG()) == 0) {
+      result = rb_eval(self, node->nd_next);
+  }
+  POP_TAG();
+  POP_SCOPE();
+  ruby_frame = frame.tmp;
+  if (saved_cref)
+      ruby_cref = saved_cref;
+  if (state) JUMP_TAG(state);
+  return result;
+}
+
+eval_node(op_asgn1, VALUE)
+{
+  int argc; VALUE *argv; /* used in SETUP_ARGS */
+  VALUE recv, val, tmp;
+  NODE *rval;
+  TMP_PROTECT;
+
+  recv = rb_eval(self, node->nd_recv);
+  rval = node->nd_args->nd_head;
+  SETUP_ARGS0(node->nd_args->nd_body, 1);
+  val = rb_funcall3(recv, aref, argc, argv);
+  switch (node->nd_mid) {
+  case 0: /* OR */
+    if (RTEST(val)) return val;
+    val = rb_eval(self, rval);
+    break;
+  case 1: /* AND */
+    if (!RTEST(val)) return val;
+    val = rb_eval(self, rval);
+    break;
+  default:
+    tmp = rb_eval(self, rval);
+    val = rb_funcall3(val, node->nd_mid, 1, &tmp);
+  }
+  argv[argc] = val;
+  rb_funcall2(recv, aset, argc+1, argv);
+  return val;
+}
+
+
+eval_node(op_asgn2, VALUE)
+{
+  ID id = node->nd_next->nd_vid;
+  VALUE recv, val, tmp;
+
+  recv = rb_eval(self, node->nd_recv);
+  val = rb_funcall3(recv, id, 0, 0);
+  switch (node->nd_next->nd_mid) {
+  case 0: /* OR */
+    if (RTEST(val)) return val;
+    val = rb_eval(self, node->nd_value);
+    break;
+  case 1: /* AND */
+    if (!RTEST(val)) return val;
+    val = rb_eval(self, node->nd_value);
+    break;
+  default:
+    tmp = rb_eval(self, node->nd_value);
+    val = rb_funcall3(val, node->nd_next->nd_mid, 1, &tmp);
+  }
+
+  rb_funcall2(recv, node->nd_next->nd_aid, 1, &val);
+  return val;
+}
+
+
+eval_node(hash, VALUE)
+{
+  NODE *list;
+  VALUE hash = rb_hash_new();
+  VALUE key, val;
+
+  list = node->nd_head;
+  while (list) {
+      key = rb_eval(self, list->nd_head);
+      list = list->nd_next;
+      if (list == 0)
+	  rb_bug("odd number list for Hash");
+      val = rb_eval(self, list->nd_head);
+      list = list->nd_next;
+      rb_hash_aset(hash, key, val);
+  }
+  return hash;
+}
+
+
+eval_node(array, VALUE)
+{
+  VALUE ary;
+  long i;
+
+  i = node->nd_alen;
+  ary = rb_ary_new2(i);
+  for (i=0;node;node=node->nd_next) {
+      RARRAY(ary)->ptr[i++] = rb_eval(self, node->nd_head);
+      RARRAY(ary)->len = i;
+  }
+  return ary;
+}
+
+
+eval_node(slit, VALUE)
+{
+  VALUE str, str2;
+  NODE *list = node->nd_next;
+
+  str = rb_str_new3(node->nd_lit);
+  while (list) {
+      if (list->nd_head) {
+	  switch (nd_type(list->nd_head)) {
+	    case NODE_STR:
+	      str2 = list->nd_head->nd_lit;
+	      break;
+	    default:
+	      str2 = rb_eval(self, list->nd_head);
+	      break;
+	  }
+	  rb_str_append(str, str2);
+	  OBJ_INFECT(str, str2);
+      }
+      list = list->nd_next;
+  }
+  switch (nd_type(node)) {
+    case NODE_DREGX:
+      str2 = rb_reg_new(RSTRING(str)->ptr, RSTRING(str)->len,
+			  node->nd_cflag);
+      RB_GC_GUARD(str);  /* prevent tail call optimization here */
+      return str2;
+    case NODE_DREGX_ONCE:	/* regexp expand once */
+      str2 = rb_reg_new(RSTRING(str)->ptr, RSTRING(str)->len,
+			  node->nd_cflag);
+      nd_set_type(node, NODE_LIT);
+      RB_GC_GUARD(str);  /* ensure str is not GC'd in rb_reg_new */
+      return node->nd_lit = str2;
+    case NODE_LIT:
+      /* other thread may replace NODE_DREGX_ONCE to NODE_LIT */
+      return Qundef;
+    case NODE_DXSTR:
+      return rb_funcall(self, '`', 1, str);
+    case NODE_DSYM:
+      return rb_str_intern(str);
+  }
+  return str;
+}
+
+        
+eval_node(defn, void)
+{
+  NODE *body,  *defn;
+  VALUE origin = 0;
+  int noex;
+
+  if (NIL_P(ruby_class)) {
+      rb_raise(rb_eTypeError, "no class/module to add method");
+  }
+  if (ruby_class == rb_cObject && node->nd_mid == init) {
+      rb_warn("redefining Object#initialize may cause infinite loop");
+  }
+  if (node->nd_mid == __id__ || node->nd_mid == __send__) {
+      rb_warn("redefining `%s' may cause serious problem",
+	      rb_id2name(node->nd_mid));
+  }
+  rb_frozen_class_p(ruby_class);
+  body = search_method(ruby_class, node->nd_mid, &origin);
+  if (body){
+      if (RTEST(ruby_verbose) && ruby_class == origin && body->nd_cnt == 0 && body->nd_body) {
+	  rb_warning("method redefined; discarding old %s", rb_id2name(node->nd_mid));
+      }
+  }
+
+  if (SCOPE_TEST(SCOPE_PRIVATE) || node->nd_mid == init) {
+      noex = NOEX_PRIVATE;
+  }
+  else if (SCOPE_TEST(SCOPE_PROTECTED)) {
+      noex = NOEX_PROTECTED;
+  }
+  else {
+      noex = NOEX_PUBLIC;
+  }
+  if (body && origin == ruby_class && body->nd_body == 0) {
+      noex |= NOEX_NOSUPER;
+  }
+
+  defn = rb_copy_node_scope(node->nd_defn, ruby_cref);
+  rb_add_method(ruby_class, node->nd_mid, defn, noex);
+  if (scope_vmode == SCOPE_MODFUNC) {
+      rb_add_method(rb_singleton_class(ruby_class),
+		    node->nd_mid, defn, NOEX_PUBLIC);
+  }
+}
+
+
+eval_node(defs, void)
+{
+  VALUE recv = rb_eval(self, node->nd_recv);
+  VALUE klass;
+  NODE *body = 0, *defn;
+  st_data_t data;
+
+  if (ruby_safe_level >= 4 && !OBJ_TAINTED(recv)) {
+      rb_raise(rb_eSecurityError, "Insecure: can't define singleton method");
+  }
+  if (FIXNUM_P(recv) || SYMBOL_P(recv)) {
+      rb_raise(rb_eTypeError,
+	       "can't define singleton method \"%s\" for %s",
+	       rb_id2name(node->nd_mid),
+	       rb_obj_classname(recv));
+  }
+
+  if (OBJ_FROZEN(recv)) rb_error_frozen("object");
+  klass = rb_singleton_class(recv);
+  if (st_lookup(RCLASS(klass)->m_tbl, node->nd_mid, &data)) {
+      body = (NODE *)data;
+      if (ruby_safe_level >= 4) {
+	  rb_raise(rb_eSecurityError, "redefining method prohibited");
+      }
+      if (RTEST(ruby_verbose)) {
+	  rb_warning("redefine %s", rb_id2name(node->nd_mid));
+      }
+  }
+  defn = rb_copy_node_scope(node->nd_defn, ruby_cref);
+  rb_add_method(klass, node->nd_mid, defn,
+		NOEX_PUBLIC|(body?body->nd_noex&NOEX_UNDEF:0));
+}
+
+
+eval_node(class, VALUE)
+{
+    VALUE super, klass, tmp, cbase;
+    ID cname;
+    int gen = Qfalse;
+
+    cbase = class_prefix(self, node->nd_cpath);
+    cname = node->nd_cpath->nd_mid;
+
+    if (NIL_P(ruby_cbase)) {
+	rb_raise(rb_eTypeError, "no outer class/module");
+    }
+    if (node->nd_super) {
+       super = rb_eval(self, node->nd_super);
+       rb_check_inheritable(super);
+    }
+    else {
+	super = 0;
+    }
+
+    if (rb_const_defined_at(cbase, cname)) {
+	klass = rb_const_get_at(cbase, cname);
+	if (TYPE(klass) != T_CLASS) {
+	    rb_raise(rb_eTypeError, "%s is not a class",
+		     rb_id2name(cname));
+	}
+	if (super) {
+	    tmp = rb_class_real(RCLASS(klass)->super);
+	    if (tmp != super) {
+		rb_raise(rb_eTypeError, "superclass mismatch for class %s",
+			 rb_id2name(cname));
+	    }
+	    super = 0;
+	}
+	if (ruby_safe_level >= 4) {
+	    rb_raise(rb_eSecurityError, "extending class prohibited");
+	}
+    }
+    else {
+	if (!super) super = rb_cObject;
+	klass = rb_define_class_id(cname, super);
+	rb_set_class_path(klass, cbase, rb_id2name(cname));
+	rb_const_set(cbase, cname, klass);
+	gen = Qtrue;
+    }
+    if (ruby_wrapper) {
+	rb_extend_object(klass, ruby_wrapper);
+	rb_include_module(klass, ruby_wrapper);
+    }
+    if (super && gen) {
+	rb_class_inherited(super, klass);
+    }
+    return module_setup(klass, node);
+}
+
+
+eval_node(module, VALUE)
+{
+  VALUE module, cbase;
+  ID cname;
+
+  if (NIL_P(ruby_cbase)) {
+      rb_raise(rb_eTypeError, "no outer class/module");
+  }
+  cbase = class_prefix(self, node->nd_cpath);
+  cname = node->nd_cpath->nd_mid;
+  if (rb_const_defined_at(cbase, cname)) {
+      module = rb_const_get_at(cbase, cname);
+      if (TYPE(module) != T_MODULE) {
+	  rb_raise(rb_eTypeError, "%s is not a module",
+		   rb_id2name(cname));
+      }
+      if (ruby_safe_level >= 4) {
+	  rb_raise(rb_eSecurityError, "extending module prohibited");
+      }
+  }
+  else {
+      module = rb_define_module_id(cname);
+      rb_set_class_path(module, cbase, rb_id2name(cname));
+      rb_const_set(cbase, cname, module);
+  }
+  if (ruby_wrapper) {
+      rb_extend_object(module, ruby_wrapper);
+      rb_include_module(module, ruby_wrapper);
+  }
+
+  return module_setup(module, node);
+}
+
+
+eval_node(sclass, VALUE)
+{
+  VALUE klass, result;
+
+  result = rb_eval(self, node->nd_recv);
+  if (FIXNUM_P(result) || SYMBOL_P(result)) {
+      rb_raise(rb_eTypeError, "no virtual class for %s",
+	       rb_obj_classname(result));
+  }
+  if (ruby_safe_level >= 4 && !OBJ_TAINTED(result))
+      rb_raise(rb_eSecurityError, "Insecure: can't extend object");
+  klass = rb_singleton_class(result);
+
+  if (ruby_wrapper) {
+      rb_extend_object(klass, ruby_wrapper);
+      rb_include_module(klass, ruby_wrapper);
+  }
+
+  return module_setup(klass, node);
+}
+
+
+eval_node(defined, VALUE)
+{
+    char buf[20];
+    const char *desc = is_defined(self, node->nd_head, buf);
+    return desc ? rb_str_new2(desc) : Qnil;
+}
+
+
+static void
+eval_cvar_set(node, result, warn)
+  NODE *node;
+  VALUE result;
+  int warn;
+{
+  rb_cvar_set(cvar_cbase(), node->nd_vid, result, warn);
+}
+
+
+static void
+eval_cdecl(self, node, result)
+  VALUE self, result;
+  NODE *node;
+{
+  if (node->nd_vid == 0)
+      rb_const_set(class_prefix(self, node->nd_else), 
+                          node->nd_else->nd_mid, result);
+  else
+      rb_const_set(ruby_cbase, node->nd_vid, result);
+}
 
-  again:
-    if (!node) RETURN(Qnil);
 
+static VALUE
+rb_eval(self, node)
+  VALUE self;
+  NODE * node;
+{
+  VALUE result;
+
+again:
+  CHECK_INTS;
+  result = Qnil;
+  if (node) {
     ruby_current_node = node;
     switch (nd_type(node)) {
       case NODE_BLOCK:
-	if (contnode) {
-	    result = rb_eval(self, node);
-	    break;
+	while (node->nd_next) {
+	    rb_eval(self, node->nd_head);
+	    node = node->nd_next;
 	}
-	contnode = node->nd_next;
 	node = node->nd_head;
 	goto again;
 
       case NODE_POSTEXE:
 	rb_f_END();
 	nd_set_type(node, NODE_NIL); /* exec just once */
-	result = Qnil;
 	break;
 
 	/* begin .. end without clauses */
@@ -2984,223 +3867,57 @@ rb_eval(self, n)
 
 	/* nodes for speed-up(literal match) */
       case NODE_MATCH2:
-	{
-	    VALUE l = rb_eval(self,node->nd_recv);
-	    VALUE r = rb_eval(self,node->nd_value);
-	    result = rb_reg_match(l, r);
-	}
+        result = eval_match2(self, node);
 	break;
 
 	/* nodes for speed-up(literal match) */
       case NODE_MATCH3:
-	{
-	    VALUE r = rb_eval(self,node->nd_recv);
-	    VALUE l = rb_eval(self,node->nd_value);
-	    if (TYPE(l) == T_STRING) {
-		result = rb_reg_match(r, l);
-	    }
-	    else {
-		result = rb_funcall(l, match, 1, r);
-	    }
-	}
+        result = eval_match3(self,node);
 	break;
 
 	/* node for speed-up(top-level loop for -n/-p) */
       case NODE_OPT_N:
-	PUSH_TAG(PROT_LOOP);
-	switch (state = EXEC_TAG()) {
-	  case 0:
-	  opt_n_next:
-	    while (!NIL_P(rb_gets())) {
-	      opt_n_redo:
-		rb_eval(self, node->nd_body);
-	    }
-	    break;
-
-	  case TAG_REDO:
-	    state = 0;
-	    goto opt_n_redo;
-	  case TAG_NEXT:
-	    state = 0;
-	    goto opt_n_next;
-	  case TAG_BREAK:
-	    state = 0;
-	  default:
-	    break;
-	}
-	POP_TAG();
-	if (state) JUMP_TAG(state);
-	RETURN(Qnil);
+        eval_opt_n(self, node);
+        break;
 
       case NODE_SELF:
-	RETURN(self);
+	result = self;
+        break;
 
       case NODE_NIL:
-	RETURN(Qnil);
+	break;
 
       case NODE_TRUE:
-	RETURN(Qtrue);
+	result = Qtrue;
+        break;
 
       case NODE_FALSE:
-	RETURN(Qfalse);
+	result = Qfalse;
+        break;
 
       case NODE_IF:
 	EXEC_EVENT_HOOK(RUBY_EVENT_LINE, node, self,
 			ruby_frame->last_func,
 			ruby_frame->last_class);
-	if (RTEST(rb_eval(self, node->nd_cond))) {
-	    node = node->nd_body;
-	}
-	else {
-	    node = node->nd_else;
-	}
+	node = RTEST(rb_eval(self, node->nd_cond)) ? 
+                                     node->nd_body : node->nd_else;
 	goto again;
 
       case NODE_WHEN:
-	while (node) {
-	    NODE *tag;
-
-	    if (nd_type(node) != NODE_WHEN) goto again;
-	    tag = node->nd_head;
-	    while (tag) {
-		EXEC_EVENT_HOOK(RUBY_EVENT_LINE, tag, self,
-				ruby_frame->last_func,
-				ruby_frame->last_class);
-		if (tag->nd_head && nd_type(tag->nd_head) == NODE_WHEN) {
-		    VALUE v = rb_eval(self, tag->nd_head->nd_head);
-		    long i;
-
-		    if (TYPE(v) != T_ARRAY) v = rb_ary_to_ary(v);
-		    for (i=0; i<RARRAY(v)->len; i++) {
-			if (RTEST(RARRAY(v)->ptr[i])) {
-			    node = node->nd_body;
-			    goto again;
-			}
-		    }
-		    tag = tag->nd_next;
-		    continue;
-		}
-		if (RTEST(rb_eval(self, tag->nd_head))) {
-		    node = node->nd_body;
-		    goto again;
-		}
-		tag = tag->nd_next;
-	    }
-	    node = node->nd_next;
-	}
-	RETURN(Qnil);
+        if (node = eval_when(self, node)) goto again;
+        break;
 
       case NODE_CASE:
-	{
-	    VALUE val;
-
-	    val = rb_eval(self, node->nd_head);
-	    node = node->nd_body;
-	    while (node) {
-		NODE *tag;
-
-		if (nd_type(node) != NODE_WHEN) {
-		    goto again;
-		}
-		tag = node->nd_head;
-		while (tag) {
-		    EXEC_EVENT_HOOK(RUBY_EVENT_LINE, tag, self,
-				    ruby_frame->last_func,
-				    ruby_frame->last_class);
-		    if (tag->nd_head && nd_type(tag->nd_head) == NODE_WHEN) {
-			VALUE v = rb_eval(self, tag->nd_head->nd_head);
-			long i;
-
-			if (TYPE(v) != T_ARRAY) v = rb_ary_to_ary(v);
-			for (i=0; i<RARRAY(v)->len; i++) {
-			    if (RTEST(rb_funcall2(RARRAY(v)->ptr[i], eqq, 1, &val))){
-				node = node->nd_body;
-				goto again;
-			    }
-			}
-			tag = tag->nd_next;
-			continue;
-		    }
-		    if (RTEST(rb_funcall2(rb_eval(self, tag->nd_head), eqq, 1, &val))) {
-			node = node->nd_body;
-			goto again;
-		    }
-		    tag = tag->nd_next;
-		}
-		node = node->nd_next;
-	    }
-	}
-	RETURN(Qnil);
+        if (node = eval_case(self, node)) goto again;
+        break;
 
       case NODE_WHILE:
-	PUSH_TAG(PROT_LOOP);
-	result = Qnil;
-	switch (state = EXEC_TAG()) {
-	  case 0:
-	    if (node->nd_state && !RTEST(rb_eval(self, node->nd_cond)))
-		goto while_out;
-	    do {
-	      while_redo:
-		rb_eval(self, node->nd_body);
-	      while_next:
-		;
-	    } while (RTEST(rb_eval(self, node->nd_cond)));
-	    break;
-
-	  case TAG_REDO:
-	    state = 0;
-	    goto while_redo;
-	  case TAG_NEXT:
-	    state = 0;
-	    goto while_next;
-	  case TAG_BREAK:
-	    if (TAG_DST()) {
-		state = 0;
-		result = prot_tag->retval;
-	    }
-	    /* fall through */
-	  default:
-	    break;
-	}
-      while_out:
-	POP_TAG();
-	if (state) JUMP_TAG(state);
-	RETURN(result);
+        result = eval_while(self,node);
+        break;
 
       case NODE_UNTIL:
-	PUSH_TAG(PROT_LOOP);
-	result = Qnil;
-	switch (state = EXEC_TAG()) {
-	  case 0:
-	    if (node->nd_state && RTEST(rb_eval(self, node->nd_cond)))
-		goto until_out;
-	    do {
-	      until_redo:
-		rb_eval(self, node->nd_body);
-	      until_next:
-		;
-	    } while (!RTEST(rb_eval(self, node->nd_cond)));
-	    break;
-
-	  case TAG_REDO:
-	    state = 0;
-	    goto until_redo;
-	  case TAG_NEXT:
-	    state = 0;
-	    goto until_next;
-	  case TAG_BREAK:
-	    if (TAG_DST()) {
-		state = 0;
-		result = prot_tag->retval;
-	    }
-	    /* fall through */
-	  default:
-	    break;
-	}
-      until_out:
-	POP_TAG();
-	if (state) JUMP_TAG(state);
-	RETURN(result);
+        result = eval_until(self,node);
+        break;
 
       case NODE_BLOCK_PASS:
 	result = block_pass(self, node);
@@ -3208,47 +3925,7 @@ rb_eval(self, n)
 
       case NODE_ITER:
       case NODE_FOR:
-	{
-	    PUSH_TAG(PROT_LOOP);
-	    PUSH_BLOCK(node->nd_var, node->nd_body);
-
-	    state = EXEC_TAG();
-	    if (state == 0) {
-	      iter_retry:
-		PUSH_ITER(ITER_PRE);
-		if (nd_type(node) == NODE_ITER) {
-		    result = rb_eval(self, node->nd_iter);
-		}
-		else {
-		    VALUE recv;
-
-		    _block.flags &= ~BLOCK_D_SCOPE;
-		    BEGIN_CALLARGS;
-		    recv = rb_eval(self, node->nd_iter);
-		    END_CALLARGS;
-		    ruby_current_node = node;
-		    SET_CURRENT_SOURCE();
-		    result = rb_call(CLASS_OF(recv),recv,each,0,0,0,self);
-		}
-		POP_ITER();
-	    }
-	    else if (state == TAG_BREAK && TAG_DST()) {
-		result = prot_tag->retval;
-		state = 0;
-	    }
-	    else if (state == TAG_RETRY) {
-		state = 0;
-		goto iter_retry;
-	    }
-	    POP_BLOCK();
-	    POP_TAG();
-	    switch (state) {
-	      case 0:
-		break;
-	      default:
-		JUMP_TAG(state);
-	    }
-	}
+	result = eval_iter(self, node);
 	break;
 
       case NODE_BREAK:
@@ -3256,17 +3933,14 @@ rb_eval(self, n)
 	break;
 
       case NODE_NEXT:
-	CHECK_INTS;
 	next_jump(rb_eval(self, node->nd_stts));
 	break;
 
       case NODE_REDO:
-	CHECK_INTS;
 	JUMP_TAG(TAG_REDO);
 	break;
 
       case NODE_RETRY:
-	CHECK_INTS;
 	JUMP_TAG(TAG_RETRY);
 	break;
 
@@ -3296,73 +3970,15 @@ rb_eval(self, n)
 	break;
 
       case NODE_RESCUE:
-	{
-	    volatile VALUE e_info = ruby_errinfo;
-	    volatile int rescuing = 0;
-
-	    PUSH_TAG(PROT_NONE);
-	    if ((state = EXEC_TAG()) == 0) {
-	      retry_entry:
-		result = rb_eval(self, node->nd_head);
-	    }
-	    else if (rescuing) {
-		if (rescuing < 0) {
-		    /* in rescue argument, just reraise */
-		}
-		else if (state == TAG_RETRY) {
-		    rescuing = state = 0;
-		    ruby_errinfo = e_info;
-		    goto retry_entry;
-		}
-		else if (state != TAG_RAISE) {
-		    result = prot_tag->retval;
-		}
-	    }
-	    else if (state == TAG_RAISE) {
-		NODE *resq = node->nd_resq;
-
-		rescuing = -1;
-		while (resq) {
-		    ruby_current_node = resq;
-		    if (handle_rescue(self, resq)) {
-			state = 0;
-			rescuing = 1;
-			result = rb_eval(self, resq->nd_body);
-			break;
-		    }
-		    resq = resq->nd_head; /* next rescue */
-		}
-	    }
-	    else {
-		result = prot_tag->retval;
-	    }
-	    POP_TAG();
-	    if (state != TAG_RAISE) ruby_errinfo = e_info;
-	    if (state) {
-		JUMP_TAG(state);
-	    }
-	    /* no exception raised */
-	    if (!rescuing && (node = node->nd_else)) { /* else clause given */
-		goto again;
-	    }
-	}
+        result = eval_rescue(self,node);
+        if (result == Qundef) {  /* handle else clause w/o recursion */
+          node = node->nd_else;
+          goto again;
+        }
 	break;
 
       case NODE_ENSURE:
-	PUSH_TAG(PROT_NONE);
-	if ((state = EXEC_TAG()) == 0) {
-	    result = rb_eval(self, node->nd_head);
-	}
-	POP_TAG();
-	if (node->nd_ensr && !thread_no_ensure()) {
-	    VALUE retval = prot_tag->retval; /* save retval */
-	    VALUE errinfo = ruby_errinfo;
-
-	    rb_eval(self, node->nd_ensr);
-	    return_value(retval);
-	    ruby_errinfo = errinfo;
-	}
-	if (state) JUMP_TAG(state);
+        result = eval_ensure(self,node);
 	break;
 
       case NODE_AND:
@@ -3378,56 +3994,20 @@ rb_eval(self, n)
 	goto again;
 
       case NODE_NOT:
-	if (RTEST(rb_eval(self, node->nd_body))) result = Qfalse;
-	else result = Qtrue;
+	result = RTEST(rb_eval(self, node->nd_body)) ? Qfalse : Qtrue;
 	break;
 
       case NODE_DOT2:
       case NODE_DOT3:
-        {
-	    VALUE beg = rb_eval(self, node->nd_beg);
-	    VALUE end = rb_eval(self, node->nd_end);
-	    result = rb_range_new(beg, end, nd_type(node) == NODE_DOT3);
-	}	
-	break;
+        result = eval_dot(self,node);
+        break;
 
       case NODE_FLIP2:		/* like AWK */
-	{
-	    VALUE *flip = rb_svar(node->nd_cnt);
-	    if (!flip) rb_bug("unexpected local variable");
-	    if (!RTEST(*flip)) {
-		if (RTEST(rb_eval(self, node->nd_beg))) {
-		    *flip = RTEST(rb_eval(self, node->nd_end))?Qfalse:Qtrue;
-		    result = Qtrue;
-		}
-		else {
-		    result = Qfalse;
-		}
-	    }
-	    else {
-		if (RTEST(rb_eval(self, node->nd_end))) {
-		    *flip = Qfalse;
-		}
-		result = Qtrue;
-	    }
-	}
+        result = eval_flip2(self,node);
 	break;
 
       case NODE_FLIP3:		/* like SED */
-	{
-	    VALUE *flip = rb_svar(node->nd_cnt);
-	    if (!flip) rb_bug("unexpected local variable");
-	    if (!RTEST(*flip)) {
-		result = RTEST(rb_eval(self, node->nd_beg)) ? Qtrue : Qfalse;
-		*flip = result;
-	    }
-	    else {
-		if (RTEST(rb_eval(self, node->nd_end))) {
-		    *flip = Qfalse;
-		}
-		result = Qtrue;
-	    }
-	}
+        result = eval_flip3(self,node);
 	break;
 
       case NODE_RETURN:
@@ -3435,75 +4015,25 @@ rb_eval(self, n)
 	break;
 
       case NODE_ARGSCAT:
-	{
-	    VALUE args = rb_eval(self, node->nd_head);
-	    result = rb_ary_concat(args, splat_value(rb_eval(self, node->nd_body)));
-	}
+	result = rb_eval(self, node->nd_head);
+	result = rb_ary_concat(result, splat_value(rb_eval(self, node->nd_body)));
 	break;
 
       case NODE_ARGSPUSH:
-	{
-	    VALUE args = rb_ary_dup(rb_eval(self, node->nd_head));
-	    result = rb_ary_push(args, rb_eval(self, node->nd_body));
-	}
+	result = rb_ary_dup(rb_eval(self, node->nd_head));
+	result = rb_ary_push(result, rb_eval(self, node->nd_body));
 	break;
 
       case NODE_ATTRASGN:
-	{
-	    VALUE recv;
-	    int argc; VALUE *argv; /* used in SETUP_ARGS */
-	    int scope;
-	    TMP_PROTECT;
-
-	    BEGIN_CALLARGS;
-	    if (node->nd_recv == (NODE *)1) {
-		recv = self;
-		scope = 1;
-	    }
-	    else {
-		recv = rb_eval(self, node->nd_recv);
-		scope = 0;
-	    }
-	    SETUP_ARGS(node->nd_args);
-	    END_CALLARGS;
-
-	    ruby_current_node = node;
-	    SET_CURRENT_SOURCE();
-	    rb_call(CLASS_OF(recv),recv,node->nd_mid,argc,argv,scope,self);
-	    result = argv[argc-1];
-	}
-	break;
+        result = eval_attrasgn(self,node);
+        break;
 
       case NODE_CALL:
-	{
-	    VALUE recv;
-	    int argc; VALUE *argv; /* used in SETUP_ARGS */
-	    TMP_PROTECT;
-
-	    BEGIN_CALLARGS;
-	    recv = rb_eval(self, node->nd_recv);
-	    SETUP_ARGS(node->nd_args);
-	    END_CALLARGS;
-
-	    ruby_current_node = node;
-	    SET_CURRENT_SOURCE();
-	    result = rb_call(CLASS_OF(recv),recv,node->nd_mid,argc,argv,0,self);
-	}
+        result = eval_call(self,node);
 	break;
 
       case NODE_FCALL:
-	{
-	    int argc; VALUE *argv; /* used in SETUP_ARGS */
-	    TMP_PROTECT;
-
-	    BEGIN_CALLARGS;
-	    SETUP_ARGS(node->nd_args);
-	    END_CALLARGS;
-
-	    ruby_current_node = node;
-	    SET_CURRENT_SOURCE();
-	    result = rb_call(CLASS_OF(self),self,node->nd_mid,argc,argv,1,self);
-	}
+        result = eval_fcall(self,node);
 	break;
 
       case NODE_VCALL:
@@ -3513,142 +4043,19 @@ rb_eval(self, n)
 
       case NODE_SUPER:
       case NODE_ZSUPER:
-	{
-	    int argc; VALUE *argv; /* used in SETUP_ARGS */
-	    TMP_PROTECT;
-
-	    if (ruby_frame->last_class == 0) {
-		if (ruby_frame->last_func) {
-		    rb_name_error(ruby_frame->last_func,
-				  "superclass method `%s' disabled",
-				  rb_id2name(ruby_frame->orig_func));
-		}
-		else {
-		    rb_raise(rb_eNoMethodError, "super called outside of method");
-		}
-	    }
-	    if (nd_type(node) == NODE_ZSUPER) {
-		argc = ruby_frame->argc;
-		if (argc && DMETHOD_P()) {
-		    if (TYPE(RBASIC(ruby_scope)->klass) != T_ARRAY ||
-			RARRAY(RBASIC(ruby_scope)->klass)->len != argc) {
-			rb_raise(rb_eRuntimeError, 
-				 "super: specify arguments explicitly");
-		    }
-		    argv = RARRAY(RBASIC(ruby_scope)->klass)->ptr;
-		}
-		else if (!ruby_scope->local_vars) {
-		    argc = 0;
-		    argv = 0;
-		}
-		else {
-		    argv = ruby_scope->local_vars + 2;
-		}
-	    }
-	    else {
-		BEGIN_CALLARGS;
-		SETUP_ARGS(node->nd_args);
-		END_CALLARGS;
-		ruby_current_node = node;
-	    }
-
-	    SET_CURRENT_SOURCE();
-	    result = rb_call_super(argc, argv);
-	}
+        result = eval_super(self,node);
 	break;
 
       case NODE_SCOPE:
-	{
-	    struct FRAME frame;
-	    NODE *saved_cref = 0;
-
-	    frame = *ruby_frame;
-	    frame.tmp = ruby_frame;
-	    ruby_frame = &frame;
-
-	    PUSH_SCOPE();
-	    PUSH_TAG(PROT_NONE);
-	    if (node->nd_rval) {
-		saved_cref = ruby_cref;
-		ruby_cref = (NODE*)node->nd_rval;
-	    }
-	    if (node->nd_tbl) {
-		VALUE *vars = ALLOCA_N(VALUE, node->nd_tbl[0]+1);
-		*vars++ = (VALUE)node;
-		ruby_scope->local_vars = vars;
-		rb_mem_clear(ruby_scope->local_vars, node->nd_tbl[0]);
-		ruby_scope->local_tbl = node->nd_tbl;
-	    }
-	    else {
-		ruby_scope->local_vars = 0;
-		ruby_scope->local_tbl  = 0;
-	    }
-	    if ((state = EXEC_TAG()) == 0) {
-		result = rb_eval(self, node->nd_next);
-	    }
-	    POP_TAG();
-	    POP_SCOPE();
-	    ruby_frame = frame.tmp;
-	    if (saved_cref)
-		ruby_cref = saved_cref;
-	    if (state) JUMP_TAG(state);
-	}
-	break;
+        result = eval_scope(self,node);
+        break;
 
       case NODE_OP_ASGN1:
-	{
-	    int argc; VALUE *argv; /* used in SETUP_ARGS */
-	    VALUE recv, val, tmp;
-	    NODE *rval;
-	    TMP_PROTECT;
-
-	    recv = rb_eval(self, node->nd_recv);
-	    rval = node->nd_args->nd_head;
-	    SETUP_ARGS0(node->nd_args->nd_body, 1);
-	    val = rb_funcall3(recv, aref, argc, argv);
-	    switch (node->nd_mid) {
-	    case 0: /* OR */
-	      if (RTEST(val)) RETURN(val);
-	      val = rb_eval(self, rval);
-	      break;
-	    case 1: /* AND */
-	      if (!RTEST(val)) RETURN(val);
-	      val = rb_eval(self, rval);
-	      break;
-	    default:
-	      tmp = rb_eval(self, rval);
-	      val = rb_funcall3(val, node->nd_mid, 1, &tmp);
-	    }
-	    argv[argc] = val;
-	    rb_funcall2(recv, aset, argc+1, argv);
-	    result = val;
-	}
+        result = eval_op_asgn1(self,node);
 	break;
 
       case NODE_OP_ASGN2:
-	{
-	    ID id = node->nd_next->nd_vid;
-	    VALUE recv, val, tmp;
-
-	    recv = rb_eval(self, node->nd_recv);
-	    val = rb_funcall3(recv, id, 0, 0);
-	    switch (node->nd_next->nd_mid) {
-	    case 0: /* OR */
-	      if (RTEST(val)) RETURN(val);
-	      val = rb_eval(self, node->nd_value);
-	      break;
-	    case 1: /* AND */
-	      if (!RTEST(val)) RETURN(val);
-	      val = rb_eval(self, node->nd_value);
-	      break;
-	    default:
-	      tmp = rb_eval(self, node->nd_value);
-	      val = rb_funcall3(val, node->nd_next->nd_mid, 1, &tmp);
-	    }
-
-	    rb_funcall2(recv, node->nd_next->nd_aid, 1, &val);
-	    result = val;
-	}
+        result = eval_op_asgn2(self,node);
 	break;
 
       case NODE_OP_ASGN_AND:
@@ -3697,26 +4104,21 @@ rb_eval(self, n)
 	break;
 
       case NODE_CDECL:
-	result = rb_eval(self, node->nd_value);
-	if (node->nd_vid == 0) {
-	    rb_const_set(class_prefix(self, node->nd_else), node->nd_else->nd_mid, result);
-	}
-	else {
-	    rb_const_set(ruby_cbase, node->nd_vid, result);
-	}
+        result = rb_eval(self, node->nd_value);
+        eval_cdecl(self, node, result);
 	break;
 
       case NODE_CVDECL:
 	if (NIL_P(ruby_cbase)) {
 	    rb_raise(rb_eTypeError, "no class/module to define class variable");
 	}
-	result = rb_eval(self, node->nd_value);
-	rb_cvar_set(cvar_cbase(), node->nd_vid, result, Qtrue);
+        result = rb_eval(self, node->nd_value);
+        eval_cvar_set(node, result, Qtrue);
 	break;
 
       case NODE_CVASGN:
-	result = rb_eval(self, node->nd_value);
-	rb_cvar_set(cvar_cbase(), node->nd_vid, result, Qfalse);
+        result = rb_eval(self, node->nd_value);
+        eval_cvar_set(node, result, Qfalse);
 	break;
 
       case NODE_LVAR:
@@ -3759,26 +4161,21 @@ rb_eval(self, n)
 	break;
 
       case NODE_COLON2:
-	{
-	    VALUE klass;
-
-	    klass = rb_eval(self, node->nd_head);
-	    if (rb_is_const_id(node->nd_mid)) {
-		switch (TYPE(klass)) {
-		  case T_CLASS:
-		  case T_MODULE:
-		    result = rb_const_get_from(klass, node->nd_mid);
-		    break;
-		  default:
-		    rb_raise(rb_eTypeError, "%s is not a class/module",
-			     RSTRING(rb_obj_as_string(klass))->ptr);
-		    break;
-		}
-	    }
-	    else {
-		result = rb_funcall(klass, node->nd_mid, 0, 0);
+	result = rb_eval(self, node->nd_head);
+	if (rb_is_const_id(node->nd_mid)) {
+	    switch (TYPE(result)) {
+	      case T_CLASS:
+	      case T_MODULE:
+		result = rb_const_get_from(result, node->nd_mid);
+		break;
+	      default:
+		rb_raise(rb_eTypeError, "%s is not a class/module",
+			 RSTRING(rb_obj_as_string(result))->ptr);
+		break;
 	    }
 	}
+	else
+	    result = rb_funcall(result, node->nd_mid, 0, 0);
 	break;
 
       case NODE_COLON3:
@@ -3809,23 +4206,7 @@ rb_eval(self, n)
 	break;
 
       case NODE_HASH:
-	{
-	    NODE *list;
-	    VALUE hash = rb_hash_new();
-	    VALUE key, val;
-
-	    list = node->nd_head;
-	    while (list) {
-		key = rb_eval(self, list->nd_head);
-		list = list->nd_next;
-		if (list == 0)
-		    rb_bug("odd number list for Hash");
-		val = rb_eval(self, list->nd_head);
-		list = list->nd_next;
-		rb_hash_aset(hash, key, val);
-	    }
-	    result = hash;
-	}
+        result = eval_hash(self,node);
 	break;
 
       case NODE_ZARRAY:		/* zero length list */
@@ -3833,19 +4214,7 @@ rb_eval(self, n)
 	break;
 
       case NODE_ARRAY:
-	{
-	    VALUE ary;
-	    long i;
-
-	    i = node->nd_alen;
-	    ary = rb_ary_new2(i);
-	    for (i=0;node;node=node->nd_next) {
-		RARRAY(ary)->ptr[i++] = rb_eval(self, node->nd_head);
-		RARRAY(ary)->len = i;
-	    }
-
-	    result = ary;
-	}
+        result = eval_array(self,node);
 	break;
 
       case NODE_STR:
@@ -3861,51 +4230,8 @@ rb_eval(self, n)
       case NODE_DREGX:
       case NODE_DREGX_ONCE:
       case NODE_DSYM:
-	{
-	    VALUE str, str2;
-	    NODE *list = node->nd_next;
-
-	    str = rb_str_new3(node->nd_lit);
-	    while (list) {
-		if (list->nd_head) {
-		    switch (nd_type(list->nd_head)) {
-		      case NODE_STR:
-			str2 = list->nd_head->nd_lit;
-			break;
-		      default:
-			str2 = rb_eval(self, list->nd_head);
-			break;
-		    }
-		    rb_str_append(str, str2);
-		    OBJ_INFECT(str, str2);
-		}
-		list = list->nd_next;
-	    }
-	    switch (nd_type(node)) {
-	      case NODE_DREGX:
-		result = rb_reg_new(RSTRING(str)->ptr, RSTRING(str)->len,
-				    node->nd_cflag);
-		break;
-	      case NODE_DREGX_ONCE:	/* regexp expand once */
-		result = rb_reg_new(RSTRING(str)->ptr, RSTRING(str)->len,
-				    node->nd_cflag);
-		nd_set_type(node, NODE_LIT);
-		node->nd_lit = result;
-		break;
-	      case NODE_LIT:
-		/* other thread may replace NODE_DREGX_ONCE to NODE_LIT */
-		goto again;
-	      case NODE_DXSTR:
-		result = rb_funcall(self, '`', 1, str);
-		break;
-	      case NODE_DSYM:
-		result = rb_str_intern(str);
-		break;
-	      default:
-		result = str;
-		break;
-	    }
-	}
+        result = eval_slit(self, node);
+        if (result == Qundef) goto again;
 	break;
 
       case NODE_XSTR:
@@ -3917,84 +4243,13 @@ rb_eval(self, n)
 	break;
 
       case NODE_DEFN:
-	if (node->nd_defn) {
-	    NODE *body,  *defn;
-	    VALUE origin;
-	    int noex;
-
-	    if (NIL_P(ruby_class)) {
-		rb_raise(rb_eTypeError, "no class/module to add method");
-	    }
-	    if (ruby_class == rb_cObject && node->nd_mid == init) {
-		rb_warn("redefining Object#initialize may cause infinite loop");
-	    }
-	    if (node->nd_mid == __id__ || node->nd_mid == __send__) {
-		rb_warn("redefining `%s' may cause serious problem",
-			rb_id2name(node->nd_mid));
-	    }
-	    rb_frozen_class_p(ruby_class);
-	    body = search_method(ruby_class, node->nd_mid, &origin);
-	    if (body){
-		if (RTEST(ruby_verbose) && ruby_class == origin && body->nd_cnt == 0 && body->nd_body) {
-		    rb_warning("method redefined; discarding old %s", rb_id2name(node->nd_mid));
-		}
-	    }
-
-	    if (SCOPE_TEST(SCOPE_PRIVATE) || node->nd_mid == init) {
-		noex = NOEX_PRIVATE;
-	    }
-	    else if (SCOPE_TEST(SCOPE_PROTECTED)) {
-		noex = NOEX_PROTECTED;
-	    }
-	    else {
-		noex = NOEX_PUBLIC;
-	    }
-	    if (body && origin == ruby_class && body->nd_body == 0) {
-		noex |= NOEX_NOSUPER;
-	    }
-
-	    defn = rb_copy_node_scope(node->nd_defn, ruby_cref);
-	    rb_add_method(ruby_class, node->nd_mid, defn, noex);
-	    if (scope_vmode == SCOPE_MODFUNC) {
-		rb_add_method(rb_singleton_class(ruby_class),
-			      node->nd_mid, defn, NOEX_PUBLIC);
-	    }
-	    result = Qnil;
-	}
+	if (node->nd_defn)
+          eval_defn(self,node);
 	break;
 
       case NODE_DEFS:
-	if (node->nd_defn) {
-	    VALUE recv = rb_eval(self, node->nd_recv);
-	    VALUE klass;
-	    NODE *body = 0, *defn;
-
-	    if (ruby_safe_level >= 4 && !OBJ_TAINTED(recv)) {
-		rb_raise(rb_eSecurityError, "Insecure: can't define singleton method");
-	    }
-	    if (FIXNUM_P(recv) || SYMBOL_P(recv)) {
-		rb_raise(rb_eTypeError,
-			 "can't define singleton method \"%s\" for %s",
-			 rb_id2name(node->nd_mid),
-			 rb_obj_classname(recv));
-	    }
-
-	    if (OBJ_FROZEN(recv)) rb_error_frozen("object");
-	    klass = rb_singleton_class(recv);
-	    if (st_lookup(RCLASS(klass)->m_tbl, node->nd_mid, &data)) {
-		body = (NODE *)data;
-		if (ruby_safe_level >= 4) {
-		    rb_raise(rb_eSecurityError, "redefining method prohibited");
-		}
-		if (RTEST(ruby_verbose)) {
-		    rb_warning("redefine %s", rb_id2name(node->nd_mid));
-		}
-	    }
-	    defn = rb_copy_node_scope(node->nd_defn, ruby_cref);
-	    rb_add_method(klass, node->nd_mid, defn,
-			  NOEX_PUBLIC|(body?body->nd_noex&NOEX_UNDEF:0));
-	    result = Qnil;
-	}
+	if (node->nd_defn) 
+          eval_defs(self,node);
 	break;
 
       case NODE_UNDEF:
@@ -4002,7 +4257,6 @@ rb_eval(self, n)
 	    rb_raise(rb_eTypeError, "no class to undef method");
 	}
 	rb_undef(ruby_class, rb_to_id(rb_eval(self, node->u2.node)));
-	result = Qnil;
 	break;
 
       case NODE_ALIAS:
@@ -4011,134 +4265,26 @@ rb_eval(self, n)
 	}
 	rb_alias(ruby_class, rb_to_id(rb_eval(self, node->u1.node)),
 		             rb_to_id(rb_eval(self, node->u2.node)));
-	result = Qnil;
 	break;
 
       case NODE_VALIAS:
 	rb_alias_variable(node->u1.id, node->u2.id);
-	result = Qnil;
 	break;
 
       case NODE_CLASS:
-	{
-	    VALUE super, klass, tmp, cbase;
-	    ID cname;
-	    int gen = Qfalse;
-
-	    cbase = class_prefix(self, node->nd_cpath);
-	    cname = node->nd_cpath->nd_mid;
-
-	    if (NIL_P(ruby_cbase)) {
-		rb_raise(rb_eTypeError, "no outer class/module");
-	    }
-	    if (node->nd_super) {
-	       super = rb_eval(self, node->nd_super);
-	       rb_check_inheritable(super);
-	    }
-	    else {
-		super = 0;
-	    }
-
-	    if (rb_const_defined_at(cbase, cname)) {
-		klass = rb_const_get_at(cbase, cname);
-		if (TYPE(klass) != T_CLASS) {
-		    rb_raise(rb_eTypeError, "%s is not a class",
-			     rb_id2name(cname));
-		}
-		if (super) {
-		    tmp = rb_class_real(RCLASS(klass)->super);
-		    if (tmp != super) {
-			rb_raise(rb_eTypeError, "superclass mismatch for class %s",
-				 rb_id2name(cname));
-		    }
-		    super = 0;
-		}
-		if (ruby_safe_level >= 4) {
-		    rb_raise(rb_eSecurityError, "extending class prohibited");
-		}
-	    }
-	    else {
-		if (!super) super = rb_cObject;
-		klass = rb_define_class_id(cname, super);
-		rb_set_class_path(klass, cbase, rb_id2name(cname));
-		rb_const_set(cbase, cname, klass);
-		gen = Qtrue;
-	    }
-	    if (ruby_wrapper) {
-		rb_extend_object(klass, ruby_wrapper);
-		rb_include_module(klass, ruby_wrapper);
-	    }
-	    if (super && gen) {
-		rb_class_inherited(super, klass);
-	    }
-	    result = module_setup(klass, node);
-	}
+        result = eval_class(self,node);
 	break;
 
       case NODE_MODULE:
-	{
-	    VALUE module, cbase;
-	    ID cname;
-
-	    if (NIL_P(ruby_cbase)) {
-		rb_raise(rb_eTypeError, "no outer class/module");
-	    }
-	    cbase = class_prefix(self, node->nd_cpath);
-	    cname = node->nd_cpath->nd_mid;
-	    if (rb_const_defined_at(cbase, cname)) {
-		module = rb_const_get_at(cbase, cname);
-		if (TYPE(module) != T_MODULE) {
-		    rb_raise(rb_eTypeError, "%s is not a module",
-			     rb_id2name(cname));
-		}
-		if (ruby_safe_level >= 4) {
-		    rb_raise(rb_eSecurityError, "extending module prohibited");
-		}
-	    }
-	    else {
-		module = rb_define_module_id(cname);
-		rb_set_class_path(module, cbase, rb_id2name(cname));
-		rb_const_set(cbase, cname, module);
-	    }
-	    if (ruby_wrapper) {
-		rb_extend_object(module, ruby_wrapper);
-		rb_include_module(module, ruby_wrapper);
-	    }
-
-	    result = module_setup(module, node);
-	}
+        result = eval_module(self,node);
 	break;
 
       case NODE_SCLASS:
-	{
-	    VALUE klass;
-
-	    result = rb_eval(self, node->nd_recv);
-	    if (FIXNUM_P(result) || SYMBOL_P(result)) {
-		rb_raise(rb_eTypeError, "no virtual class for %s",
-			 rb_obj_classname(result));
-	    }
-	    if (ruby_safe_level >= 4 && !OBJ_TAINTED(result))
-		rb_raise(rb_eSecurityError, "Insecure: can't extend object");
-	    klass = rb_singleton_class(result);
-
-	    if (ruby_wrapper) {
-		rb_extend_object(klass, ruby_wrapper);
-		rb_include_module(klass, ruby_wrapper);
-	    }
-
-	    result = module_setup(klass, node);
-	}
+        result = eval_sclass(self,node);
 	break;
 
       case NODE_DEFINED:
-	{
-	    char buf[20];
-	    char *desc = is_defined(self, node->nd_head, buf);
-
-	    if (desc) result = rb_str_new2(desc);
-	    else result = Qnil;
-	}
+        result = eval_defined(self,node);
 	break;
 
       case NODE_NEWLINE:
@@ -4151,25 +4297,19 @@ rb_eval(self, n)
       default:
 	unknown_node(node);
     }
-  finish:
-    CHECK_INTS;
-    if (contnode) {
-	node = contnode;
-	contnode = 0;
-	goto again;
-    }
-    return result;
+  }
+  return result;
 }
 
 static VALUE
 module_setup(module, n)
     VALUE module;
-    NODE *n;
+    NODE * volatile n;
 {
-    NODE * volatile node = n->nd_body;
+    NODE *node = n->nd_body;
     int state;
     struct FRAME frame;
-    VALUE result = Qnil;	/* OK */
+    VALUE result;
     TMP_PROTECT;
 
     frame = *ruby_frame;
@@ -4560,16 +4700,16 @@ rb_iter_break()
     break_jump(Qnil);
 }
 
-NORETURN(static void rb_longjmp _((int, VALUE)));
+NORETURN(static void rb_longjmp _((volatile int, volatile VALUE)));
 static VALUE make_backtrace _((void));
 
 static void
 rb_longjmp(tag, mesg)
-    int tag;
-    VALUE mesg;
+    volatile int tag;
+    volatile VALUE mesg;
 {
     VALUE at;
-    rb_thread_t th = curr_thread;
+    volatile rb_thread_t th = curr_thread;
 
     if (rb_thread_set_raised(th)) {
 	ruby_errinfo = exception_error;
@@ -4658,7 +4798,8 @@ rb_exc_fatal(mesg)
 void
 rb_interrupt()
 {
-    rb_raise(rb_eInterrupt, "");
+    static const char fmt[1] = {'\0'};
+    rb_raise(rb_eInterrupt, fmt);
 }
 
 /*
@@ -4814,7 +4955,7 @@ proc_jump_error(state, result)
     VALUE result;
 {
     char mesg[32];
-    char *statement;
+    const char *statement;
 
     switch (state) {
       case TAG_BREAK:
@@ -4925,19 +5066,21 @@ rb_need_block()
 
 static VALUE
 rb_yield_0(val, self, klass, flags, avalue)
-    VALUE val, self, klass;	/* OK */
-    int flags, avalue;
+    volatile VALUE val, self;
+    VALUE klass;
+    int flags;
+    volatile int avalue;
 {
-    NODE *node;
+    NODE *volatile node;
     volatile VALUE result = Qnil;
     volatile VALUE old_cref;
     volatile VALUE old_wrapper;
     struct BLOCK * volatile block;
     struct SCOPE * volatile old_scope;
-    int old_vmode;
+    volatile int old_vmode;
     struct FRAME frame;
     NODE *cnode = ruby_current_node;
-    int lambda = flags & YIELD_LAMBDA_CALL;
+    volatile int lambda = flags & YIELD_LAMBDA_CALL;
     int state;
 
     rb_need_block();
@@ -5116,6 +5259,7 @@ rb_yield_0(val, self, klass, flags, avalue)
 		    tt->retval = result;
 		    JUMP_TAG(TAG_BREAK);
 		}
+                if (tt->tag == PROT_THREAD) break;
 		tt = tt->prev;
 	    }
 	    proc_jump_error(TAG_BREAK, result);
@@ -5133,6 +5277,7 @@ VALUE
 rb_yield(val)
     VALUE val;
 {
+    wipeBeforeYield();
     return rb_yield_0(val, 0, 0, 0, Qfalse);
 }
 
@@ -5195,6 +5340,7 @@ static VALUE
 rb_f_loop()
 {
     for (;;) {
+        wipeBeforeYield();
 	rb_yield_0(Qundef, 0, 0, 0, Qfalse);
 	CHECK_INTS;
     }
@@ -5348,11 +5494,12 @@ assign(self, lhs, val, pcall)
 
 VALUE
 rb_iterate(it_proc, data1, bl_proc, data2)
-    VALUE (*it_proc) _((VALUE)), (*bl_proc)(ANYARGS);
-    VALUE data1, data2;
+    VALUE (* volatile it_proc) _((VALUE)), (*bl_proc)(ANYARGS);
+    volatile VALUE data1;
+    VALUE data2;
 {
     int state;
-    volatile VALUE retval = Qnil;
+    VALUE retval = Qnil;
     NODE *node = NEW_IFUNC(bl_proc, data2);
     VALUE self = ruby_top_self;
 
@@ -5376,12 +5523,7 @@ rb_iterate(it_proc, data1, bl_proc, data2)
     POP_BLOCK();
     POP_TAG();
 
-    switch (state) {
-      case 0:
-	break;
-      default:
-	JUMP_TAG(state);
-    }
+    if (state) JUMP_TAG(state);
     return retval;
 }
 
@@ -5413,16 +5555,17 @@ handle_rescue(self, node)
 
 VALUE
 #ifdef HAVE_STDARG_PROTOTYPES
-rb_rescue2(VALUE (*b_proc)(ANYARGS), VALUE data1, VALUE (*r_proc)(ANYARGS), VALUE data2, ...)
+rb_rescue2(VALUE (* volatile b_proc)(ANYARGS), volatile VALUE data1, 
+           VALUE (* volatile r_proc)(ANYARGS), volatile VALUE data2, ...)
 #else
 rb_rescue2(b_proc, data1, r_proc, data2, va_alist)
-    VALUE (*b_proc)(ANYARGS), (*r_proc)(ANYARGS);
-    VALUE data1, data2;
+    VALUE (* volatile b_proc)(ANYARGS), (* volatile r_proc)(ANYARGS);
+    volatile VALUE data1, data2;
     va_dcl
 #endif
 {
     int state;
-    volatile VALUE result;
+    VALUE result;
     volatile VALUE e_info = ruby_errinfo;
     volatile int handle = Qfalse;
     VALUE eclass;
@@ -5481,9 +5624,9 @@ VALUE
 rb_protect(proc, data, state)
     VALUE (*proc) _((VALUE));
     VALUE data;
-    int *state;
+    int * volatile state;
 {
-    VALUE result = Qnil;	/* OK */
+    VALUE result;
     int status;
 
     PUSH_TAG(PROT_NONE);
@@ -5496,22 +5639,18 @@ rb_protect(proc, data, state)
     if (state) {
 	*state = status;
     }
-    if (status != 0) {
-	return Qnil;
-    }
-
-    return result;
+    return status ? Qnil : result;
 }
 
 VALUE
 rb_ensure(b_proc, data1, e_proc, data2)
     VALUE (*b_proc)();
     VALUE data1;
-    VALUE (*e_proc)();
-    VALUE data2;
+    VALUE (* volatile e_proc)();
+    volatile VALUE data2;
 {
     int state;
-    volatile VALUE result = Qnil;
+    VALUE result;
     VALUE retval;
 
     PUSH_TAG(PROT_NONE);
@@ -5519,7 +5658,7 @@ rb_ensure(b_proc, data1, e_proc, data2)
 	result = (*b_proc)(data1);
     }
     POP_TAG();
-    retval = prot_tag ? prot_tag->retval : Qnil;	/* save retval */
+    if (prot_tag) retval = prot_tag->retval;  /* save retval */
     if (!thread_no_ensure()) {
 	(*e_proc)(data2);
     }
@@ -5533,7 +5672,7 @@ rb_with_disable_interrupt(proc, data)
     VALUE (*proc)();
     VALUE data;
 {
-    VALUE result = Qnil;	/* OK */
+    VALUE result;
     int status;
 
     DEFER_INTS;
@@ -5610,7 +5749,7 @@ rb_method_missing(argc, argv, obj)
 {
     ID id;
     VALUE exc = rb_eNoMethodError;
-    char *format = 0;
+    const char *format = 0;
     NODE *cnode = ruby_current_node;
 
     if (argc == 0 || !SYMBOL_P(argv[0])) {
@@ -5785,16 +5924,16 @@ call_cfunc(func, recv, len, argc, argv)
 
 static VALUE
 rb_call0(klass, recv, id, oid, argc, argv, body, flags)
-    VALUE klass, recv;
-    ID    id;
+    volatile VALUE klass, recv;
+    volatile ID    id;
     ID    oid;
-    int argc;			/* OK */
-    VALUE *argv;		/* OK */
-    NODE * volatile body;
+    int argc;
+    VALUE *argv;
+    NODE *volatile body;
     int flags;
 {
     NODE *b2;		/* OK */
-    volatile VALUE result = Qnil;
+    VALUE result;
     int itr;
     static int tick;
     TMP_PROTECT;
@@ -5911,7 +6050,7 @@ rb_call0(klass, recv, id, oid, argc, argv, body, flags)
 	{
 	    int state;
 	    VALUE *local_vars;	/* OK */
-	    NODE *saved_cref = 0;
+	    NODE * volatile saved_cref = 0;
 
 	    PUSH_SCOPE();
 	    if (body->nd_rval) {
@@ -6054,7 +6193,6 @@ rb_call0(klass, recv, id, oid, argc, argv, body, flags)
 
       default:
 	unknown_node(body);
-	break;
     }
     POP_FRAME();
     POP_ITER();
@@ -6222,7 +6360,7 @@ rb_funcall_rescue(recv, mid, n, va_alist)
     va_dcl
 #endif
 {
-    VALUE result = Qnil;	/* OK */
+    VALUE result;
     int status;
     va_list ar;
 
@@ -6413,7 +6551,7 @@ rb_frame_last_func()
 static NODE*
 compile(src, file, line)
     VALUE src;
-    char *file;
+    const char *file;
     int line;
 {
     NODE *node;
@@ -6432,12 +6570,13 @@ compile(src, file, line)
 
 static VALUE
 eval(self, src, scope, file, line)
-    VALUE self, src, scope;
-    char *file;
+    VALUE self, src;
+    volatile VALUE scope;
+    const char * volatile file;
     int line;
 {
     struct BLOCK *data = NULL;
-    volatile VALUE result = Qnil;
+    VALUE result;
     struct SCOPE * volatile old_scope;
     struct BLOCK * volatile old_block;
     struct RVarmap * volatile old_dyna_vars;
@@ -6445,7 +6584,7 @@ eval(self, src, scope, file, line)
     int volatile old_vmode;
     volatile VALUE old_wrapper;
     struct FRAME frame;
-    NODE *nodesave = ruby_current_node;
+    NODE * volatile nodesave = ruby_current_node;
     volatile int iter = ruby_frame->iter;
     volatile int safe = ruby_safe_level;
     int state;
@@ -6510,7 +6649,7 @@ eval(self, src, scope, file, line)
 	    compile_error(0);
 	}
 	if (!NIL_P(result)) ruby_errinfo = result;
-	result = eval_node(self, node);
+	result = eval_tree(self, node);
     }
     POP_TAG();
     POP_CLASS();
@@ -6532,6 +6671,7 @@ eval(self, src, scope, file, line)
 
 	    scope_dup(ruby_scope);
 	    for (tag=prot_tag; tag; tag=tag->prev) {
+                if (tag->tag == PROT_THREAD) break;
 		scope_dup(tag->scope);
 	    }
 	    for (vars = ruby_dyna_vars; vars; vars = vars->next) {
@@ -6594,7 +6734,7 @@ rb_f_eval(argc, argv, self)
     VALUE self;
 {
     VALUE src, scope, vfile, vline;
-    char *file = "(eval)";
+    const char *file = "(eval)";
     int line = 1;
 
     rb_scan_args(argc, argv, "13", &src, &scope, &vfile, &vline);
@@ -6635,12 +6775,13 @@ rb_f_eval(argc, argv, self)
 static VALUE
 exec_under(func, under, cbase, args)
     VALUE (*func)();
-    VALUE under, cbase;
+    VALUE under;
+    volatile VALUE cbase;
     void *args;
 {
-    VALUE val = Qnil;		/* OK */
+    VALUE val;
     int state;
-    int mode;
+    volatile int mode;
     struct FRAME *f = ruby_frame;
 
     PUSH_CLASS(under);
@@ -6732,7 +6873,7 @@ specific_eval(argc, argv, klass, self)
 	return yield_under(klass, self);
     }
     else {
-	char *file = "(eval)";
+	const char *file = "(eval)";
 	int   line = 1;
 
 	if (argc == 0) {
@@ -6846,9 +6987,9 @@ rb_load(fname, wrap)
     volatile int prohibit_int = rb_prohibit_interrupt;
     volatile ID last_func;
     volatile VALUE wrapper = ruby_wrapper;
-    volatile VALUE self = ruby_top_self;
+    VALUE self = ruby_top_self;
     NODE *volatile last_node;
-    NODE *saved_cref = ruby_cref;
+    NODE *volatile saved_cref = ruby_cref;
 
     if (wrap && ruby_safe_level >= 4) {
 	StringValue(fname);
@@ -6897,7 +7038,7 @@ rb_load(fname, wrap)
     ruby_current_node = 0;
     if (state == 0) {
 	NODE *node;
-	volatile int critical;
+        int critical;
 
 	DEFER_INTS;
 	ruby_in_eval++;
@@ -6909,7 +7050,7 @@ rb_load(fname, wrap)
 	rb_thread_critical = critical;
 	ALLOW_INTS;
 	if (ruby_nerrs == 0) {
-	    eval_node(self, node);
+	    eval_tree(self, node);
 	}
     }
     ruby_frame->last_func = last_func;
@@ -6942,7 +7083,7 @@ void
 rb_load_protect(fname, wrap, state)
     VALUE fname;
     int wrap;
-    int *state;
+    int * volatile state;
 {
     int status;
 
@@ -7231,7 +7372,7 @@ rb_require_safe(fname, safe)
     VALUE fname;
     int safe;
 {
-    VALUE result = Qnil;
+    VALUE result;
     volatile VALUE errinfo = ruby_errinfo;
     int state;
     struct {
@@ -7282,7 +7423,8 @@ rb_require_safe(fname, safe)
 		rb_provide_feature(feature);
 		result = Qtrue;
 	    }
-	}
+	}else
+          result = Qnil;
     }
     POP_TAG();
     ruby_current_node = saved.node;
@@ -7950,7 +8092,7 @@ rb_f_at_exit()
 void
 rb_exec_end_proc()
 {
-    struct end_proc_data *link, *tmp;
+    struct end_proc_data *tmp, *volatile link;
     int status;
     volatile int safe = ruby_safe_level;
 
@@ -8595,8 +8737,9 @@ proc_invoke(proc, args, self, klass)
     int state;
     volatile int safe = ruby_safe_level;
     volatile VALUE old_wrapper = ruby_wrapper;
-    volatile int pcall, avalue = Qtrue;
-    volatile VALUE tmp = args;
+    volatile int pcall;
+    int avalue = Qtrue;
+    VALUE tmp = args;
 
     if (rb_block_given_p() && ruby_frame->last_func) {
 	if (klass != ruby_frame->last_class)
@@ -8814,7 +8957,7 @@ proc_to_s(self)
 {
     struct BLOCK *data;
     NODE *node;
-    char *cname = rb_obj_classname(self);
+    const char *cname = rb_obj_classname(self);
     const int w = (sizeof(VALUE) * CHAR_BIT) / 4;
     long len = strlen(cname)+6+w; /* 6:tags 16:addr */
     VALUE str;
@@ -8895,15 +9038,15 @@ proc_binding(proc)
 
 static VALUE
 block_pass(self, node)
-    VALUE self;
-    NODE *node;
+    volatile VALUE self;
+    NODE *volatile node;
 {
-    VALUE proc = rb_eval(self, node->nd_body);	/* OK */
+    volatile VALUE proc = rb_eval(self, node->nd_body);
     VALUE b;
     struct BLOCK * volatile old_block;
     struct BLOCK _block;
     struct BLOCK *data;
-    volatile VALUE result = Qnil;
+    VALUE result;
     int state;
     volatile int orphan;
     volatile int safe = ruby_safe_level;
@@ -8950,20 +9093,24 @@ block_pass(self, node)
 
     PUSH_TAG(PROT_LOOP);
     state = EXEC_TAG();
-    if (state == 0) {
-      retry:
+    switch (state) {
+      case TAG_RETRY:
+        state = 0;
+      case 0:
 	proc_set_safe_level(proc);
 	if (safe > ruby_safe_level)
 	    ruby_safe_level = safe;
 	result = rb_eval(self, node->nd_iter);
-    }
-    else if (state == TAG_BREAK && TAG_DST()) {
-	result = prot_tag->retval;
-	state = 0;
-    }
-    else if (state == TAG_RETRY) {
-	state = 0;
-	goto retry;
+        break;
+      case TAG_BREAK:
+        result = Qnil;
+        if (TAG_DST()) {
+	  result = prot_tag->retval;
+	  state = 0;
+        }
+        break;
+      default:
+        result = Qnil;
     }
     POP_TAG();
     POP_ITER();
@@ -8980,7 +9127,6 @@ block_pass(self, node)
       default:
 	JUMP_TAG(state);
     }
-
     return result;
 }
 
@@ -9239,7 +9385,7 @@ method_call(argc, argv, method)
     VALUE *argv;
     VALUE method;
 {
-    VALUE result = Qnil;	/* OK */
+    VALUE result;
     struct METHOD *data;
     int safe;
 
@@ -9473,7 +9619,7 @@ method_inspect(method)
     struct METHOD *data;
     VALUE str;
     const char *s;
-    char *sharp = "#";
+    const char *sharp = "#";
 
     Data_Get_Struct(method, struct METHOD, data);
     str = rb_str_buf_new2("#<");
@@ -9538,12 +9684,9 @@ static VALUE
 bmcall(args, method)
     VALUE args, method;
 {
-    volatile VALUE a;
-    VALUE ret;
-
-    a = svalue_to_avalue(args);
-    ret = method_call(RARRAY(a)->len, RARRAY(a)->ptr, method);
-    a = Qnil; /* prevent tail call */
+    VALUE a = svalue_to_avalue(args);
+    VALUE ret = method_call(RARRAY(a)->len, RARRAY(a)->ptr, method);
+    RB_GC_GUARD(a);  /* ensure a is not GC'd during method_call */
     return ret;
 }
 
@@ -9658,6 +9801,7 @@ rb_mod_define_method(argc, argv, mod)
     else {
 	rb_raise(rb_eArgError, "wrong number of arguments (%d for 1)", argc);
     }
+    SET_METHOD_SOURCE();
     if (RDATA(body)->dmark == (RUBY_DATA_FUNC)bm_mark) {
 	node = NEW_DMETHOD(method_unbind(body));
     }
@@ -9689,6 +9833,112 @@ rb_mod_define_method(argc, argv, mod)
     return body;
 }
 
+
+#ifdef MBARI_API
+/*
+ * call-seq:
+ *    meth.__file__  => String  
+ *
+ * returns the filename containing this method's definition
+ *
+ * raises ArgumentError if method has no associated ruby source code
+ *
+ * <i>Only available when MBARI_API extentions are enabled at build time</i>
+ */
+ 
+static VALUE
+method_source_file_name(VALUE method)
+{
+    struct METHOD *data;
+    NODE *node;
+
+    Data_Get_Struct(method, struct METHOD, data);   
+    if (node = data->body) {
+      const char *filename = node->nd_file;
+      if (filename)
+        return rb_str_new2(filename);
+    }
+    rb_raise(rb_eArgError, "native Method");
+}
+
+/*
+ * call-seq:
+ *    meth.__line__  => Fixnum  
+ *
+ * returns the starting line number of this method
+ *
+ * raises ArgumentError if method has no associated ruby source code
+ *
+ * <i>Only available when MBARI_API extentions are enabled at build time</i>
+ */
+ 
+static VALUE
+method_source_line(VALUE method)
+{
+    struct METHOD *data;
+    NODE *node;
+
+    Data_Get_Struct(method, struct METHOD, data);
+    if (node = data->body) {
+      int lineno = nd_line(node);
+      if (lineno)
+        return INT2FIX(nd_line(node));
+    }
+    rb_raise(rb_eArgError, "native Method");
+}
+
+
+/*
+ * call-seq:
+ *    prc.__file__  => String  
+ *
+ * returns the filename where this proc is defined
+ *
+ * raises ArgumentError if proc has no associated ruby source
+ *
+ * <i>Only available when MBARI_API extentions are enabled at build time</i>
+ */
+ 
+static VALUE
+proc_source_file_name(VALUE block)
+{
+    struct BLOCK *data;
+    const char *filename;
+    NODE *node;
+
+    Data_Get_Struct(block, struct BLOCK, data);
+    if ((node = data->frame.node) || (node = data->body))
+      return rb_str_new2(node->nd_file);
+    rb_raise(rb_eArgError, "native Proc");
+}
+
+
+/*
+ * call-seq:
+ *    prc.__line__  => Fixnum  
+ *
+ * returns the starting line number of this proc
+ *
+ * raises ArgumentError if proc has no associated ruby source code
+ *
+ * <i>Only available when MBARI_API extentions are enabled at build time</i>
+ */
+ 
+static VALUE
+proc_source_line(VALUE block)
+{
+    struct BLOCK *data;
+    NODE *node;
+    
+    Data_Get_Struct(block, struct BLOCK, data);
+    if ((node = data->frame.node) || (node = data->body))
+      return INT2FIX( nd_line(node) );
+    rb_raise(rb_eArgError, "native Proc");
+}
+
+#endif  /* MBARI_API */
+
+
 /*
  *  <code>Proc</code> objects are blocks of code that have been bound to
  *  a set of local variables. Once bound, the code may be called in
@@ -9768,6 +10018,15 @@ Init_Proc()
     rb_define_method(rb_cUnboundMethod, "to_s", method_inspect, 0);
     rb_define_method(rb_cUnboundMethod, "bind", umethod_bind, 1);
     rb_define_method(rb_cModule, "instance_method", rb_mod_method, 1);
+    
+#ifdef MBARI_API
+    rb_define_method(rb_cUnboundMethod, "__file__", method_source_file_name, 0);
+    rb_define_method(rb_cUnboundMethod, "__line__", method_source_line, 0);
+    rb_define_method(rb_cProc, "__file__", proc_source_file_name, 0);
+    rb_define_method(rb_cProc, "__line__", proc_source_line, 0);
+    rb_define_method(rb_cMethod, "__file__", method_source_file_name, 0);
+    rb_define_method(rb_cMethod, "__line__", method_source_line, 0);
+#endif
 }
 
 /*
@@ -10084,14 +10343,19 @@ timeofday()
     return (double)tv.tv_sec + (double)tv.tv_usec * 1e-6;
 }
 
-#define STACK(addr) (th->stk_pos<(VALUE*)(addr) && (VALUE*)(addr)<th->stk_pos+th->stk_len)
-#define ADJ(addr) (void*)(STACK(addr)?(((VALUE*)(addr)-th->stk_pos)+th->stk_ptr):(VALUE*)(addr))
+
+#define ADJ(addr) \
+   if ((size_t)((void *)addr - stkBase) < stkSize) addr=(void *)addr + stkShift
+
 static void
 thread_mark(th)
     rb_thread_t th;
 {
     struct FRAME *frame;
     struct BLOCK *block;
+    void *stkBase;
+    ptrdiff_t stkShift;
+    size_t stkSize;
 
     rb_gc_mark(th->result);
     rb_gc_mark(th->thread);
@@ -10126,15 +10390,26 @@ thread_mark(th)
 	}
 #endif
     }
+
+    stkBase = (void *)th->stk_start;
+    stkSize = th->stk_len * sizeof(VALUE);
+#if STACK_GROW_DIRECTION == 0
+    if (rb_gc_stack_grow_direction < 0)
+#endif
+#if STACK_GROW_DIRECTION <= 0
+      stkBase -= stkSize;
+#endif
+    stkShift = (void *)th->stk_ptr - stkBase;
+    
     frame = th->frame;
     while (frame && frame != top_frame) {
-	frame = ADJ(frame);
+	ADJ(frame);
 	rb_gc_mark_frame(frame);
 	if (frame->tmp) {
 	    struct FRAME *tmp = frame->tmp;
 
 	    while (tmp && tmp != top_frame) {
-		tmp = ADJ(tmp);
+		ADJ(tmp);
 		rb_gc_mark_frame(tmp);
 		tmp = tmp->prev;
 	    }
@@ -10143,7 +10418,7 @@ thread_mark(th)
     }
     block = th->block;
     while (block) {
-	block = ADJ(block);
+	ADJ(block);
 	rb_gc_mark_frame(&block->frame);
 	block = block->prev;
     }
@@ -10202,16 +10477,57 @@ rb_gc_abort_threads()
     } END_FOREACH_FROM(main_thread, th);
 }
 
-static void
-thread_free(th)
+
+static inline void
+stack_free(th)
     rb_thread_t th;
 {
-    if (th->stk_ptr) free(th->stk_ptr);
-    th->stk_ptr = 0;
+    if (th->stk_ptr) {
+      free(th->stk_ptr);
+      th->stk_ptr = 0;
+    }
 #ifdef __ia64
-    if (th->bstr_ptr) free(th->bstr_ptr);
-    th->bstr_ptr = 0;
+    if (th->bstr_ptr) {
+      free(th->bstr_ptr);
+      th->bstr_ptr = 0;
+    }
 #endif
+}
+
+static void
+rb_thread_die(th)
+    rb_thread_t th;
+{
+    th->thgroup = 0;
+    th->status = THREAD_KILLED;
+    stack_free(th);
+}
+
+#define THREAD_DATA(threadObject)  ((rb_thread_t)RDATA(threadObject)->data)
+
+static inline void
+cc_purge(cc)
+    rb_thread_t cc;
+{  /* free continuation's stack if it has just died */
+  if (cc->thread != Qnil && THREAD_DATA(cc->thread)->status == THREAD_KILLED) {
+    cc->thread = Qnil;
+    rb_thread_die(cc);  /* can't possibly activate this stack */
+  }  
+}
+
+static void
+cc_mark(cc)
+    rb_thread_t cc;
+{  /* mark this continuation's stack only if its parent thread is still alive */
+  cc_purge(cc);
+  thread_mark(cc);
+}
+
+static void
+thread_free(th)
+    rb_thread_t th;
+{
+    stack_free(th);
     if (th->locals) st_free_table(th->locals);
     if (th->status != THREAD_KILLED) {
 	if (th->prev) th->prev->next = th->next;
@@ -10228,7 +10544,7 @@ rb_thread_check(data)
 	rb_raise(rb_eTypeError, "wrong argument type %s (expected Thread)",
 		 rb_obj_classname(data));
     }
-    return (rb_thread_t)RDATA(data)->data;
+    return THREAD_DATA(data);
 }
 
 static VALUE rb_thread_raise _((int, VALUE*, rb_thread_t));
@@ -10255,13 +10571,10 @@ static void
 rb_thread_save_context(th)
     rb_thread_t th;
 {
-    VALUE *pos;
-    int len;
+    size_t len;
     static VALUE tval;
 
-    len = ruby_stack_length(&pos);
-    th->stk_len = 0;
-    th->stk_pos = pos;
+    len = ruby_stack_length(th->stk_start,&th->stk_pos);
     if (len > th->stk_max) {
 	VALUE *ptr = realloc(th->stk_ptr, sizeof(VALUE) * len);
 	if (!ptr) rb_memerror();
@@ -10323,6 +10636,9 @@ static int
 rb_thread_switch(n)
     int n;
 {
+#if STACK_WIPE_SITES & 1
+    rb_gc_wipe_stack();
+#endif
     rb_trap_immediate = (curr_thread->flags&0x100)?1:0;
     switch (n) {
       case 0:
@@ -10359,15 +10675,14 @@ rb_thread_switch(n)
     return 1;
 }
 
-#define THREAD_SAVE_CONTEXT(th) \
-    (rb_thread_switch((FLUSH_REGISTER_WINDOWS, ruby_setjmp(rb_thread_save_context(th), (th)->context))))
+#define THREAD_SAVE_CONTEXT(th) (rb_thread_switch( wipeAfter(\
+                  ruby_setjmp(rb_thread_save_context(th), (th)->context))))
 
 NORETURN(static void rb_thread_restore_context _((rb_thread_t,int)));
-NORETURN(NOINLINE(static void rb_thread_restore_context_0(rb_thread_t,int,void*)));
-NORETURN(NOINLINE(static void stack_extend(rb_thread_t, int, VALUE *)));
+NORETURN(NOINLINE(static void rb_thread_restore_context_0(rb_thread_t,int)));
 
 static void
-rb_thread_restore_context_0(rb_thread_t th, int exit, void *vp)
+rb_thread_restore_context_0(rb_thread_t th, int exit)
 {
     static rb_thread_t tmp;
     static int ex;
@@ -10424,9 +10739,9 @@ static volatile int C(f), C(g), C(h), C(i), C(j);
 static volatile int C(k), C(l), C(m), C(n), C(o);
 static volatile int C(p), C(q), C(r), C(s), C(t);
 int rb_dummy_false = 0;
-NORETURN(NOINLINE(static void register_stack_extend(rb_thread_t, int, void *, VALUE *)));
+NORETURN(NOINLINE(static void register_stack_extend(rb_thread_t, int, VALUE *)));
 static void
-register_stack_extend(rb_thread_t th, int exit, void *vp, VALUE *curr_bsp)
+register_stack_extend(rb_thread_t th, int exit, VALUE *curr_bsp)
 {
     if (rb_dummy_false) {
         /* use registers as much as possible */
@@ -10440,52 +10755,69 @@ register_stack_extend(rb_thread_t th, int exit, void *vp, VALUE *curr_bsp)
         E(p) = E(q) = E(r) = E(s) = E(t) = 0;
     }
     if (curr_bsp < th->bstr_pos+th->bstr_len) {
-        register_stack_extend(th, exit, &exit, (VALUE*)rb_ia64_bsp());
+        register_stack_extend(th, exit, (VALUE*)rb_ia64_bsp());
     }
-    rb_thread_restore_context_0(th, exit, &exit);
+    rb_thread_restore_context_0(th, exit);
 }
 #undef C
 #undef E
 #endif
 
-# if defined(_MSC_VER) && _MSC_VER >= 1300
-__declspec(noinline) static void stack_extend(rb_thread_t, int, VALUE*);
-# endif
-static void
-stack_extend(rb_thread_t th, int exit, VALUE *addr_in_prev_frame)
-{
-#define STACK_PAD_SIZE 1024
-    VALUE space[STACK_PAD_SIZE];
-
-#if STACK_GROW_DIRECTION < 0
-    if (addr_in_prev_frame > th->stk_pos) stack_extend(th, exit, &space[0]);
-#elif STACK_GROW_DIRECTION > 0
-    if (addr_in_prev_frame < th->stk_pos + th->stk_len) stack_extend(th, exit, &space[STACK_PAD_SIZE-1]);
-#else
-    if (addr_in_prev_frame < rb_gc_stack_start) {
-        /* Stack grows downward */
-        if (addr_in_prev_frame > th->stk_pos) stack_extend(th, exit, &space[0]);
-    }
-    else {
-        /* Stack grows upward */
-        if (addr_in_prev_frame < th->stk_pos + th->stk_len) stack_extend(th, exit, &space[STACK_PAD_SIZE-1]);
-    }
-#endif
-#ifdef __ia64
-    register_stack_extend(th, exit, space, (VALUE*)rb_ia64_bsp());
-#else
-    rb_thread_restore_context_0(th, exit, space);
-#endif
-}
 
 static void
 rb_thread_restore_context(th, exit)
     rb_thread_t th;
     int exit;
 {
+    VALUE *pos = th->stk_start;
+
+#if HAVE_ALLOCA  /* use alloca to grow stack in O(1) time */
     VALUE v;
+
+    if (!th->stk_ptr) rb_bug("unsaved context");
+#  if !STACK_GROW_DIRECTION  /* unknown at compile time */
+    if (rb_gc_stack_grow_direction < 0) {
+#  endif
+#  if STACK_GROW_DIRECTION <= 0
+      pos -= th->stk_len;
+      if (&v > pos) 
+        (volatile void *)ALLOCA_N(VALUE, &v-pos);
+#  endif
+#  if !STACK_GROW_DIRECTION
+    }else
+#  endif
+#if STACK_GROW_DIRECTION >= 0  /* stack grows upward */
+      if (&v < pos + th->stk_len) 
+        (volatile void *)ALLOCA_N(VALUE, pos+th->stk_len - &v);
+#  endif
+
+#else  /* recursive O(n/1024) if extending stack > 1024 VALUEs */
+
+    volatile VALUE v[1023];
+
+#  if !STACK_GROW_DIRECTION  /* unknown at compile time */
+    if (rb_gc_stack_grow_direction < 0) {
+#  endif
+#  if STACK_GROW_DIRECTION <= 0
+      pos -= th->stk_len;
+      if (v > pos) rb_thread_restore_context(th, exit);
+#  endif
+#  if !STACK_GROW_DIRECTION
+    }else
+#  endif
+#  if STACK_GROW_DIRECTION >= 0  /* stack grows upward */
+      if (v < pos + th->stk_len) rb_thread_restore_context(th, exit);
+#  endif
     if (!th->stk_ptr) rb_bug("unsaved context");
-    stack_extend(th, exit, &v);
+    
+#endif  /* stack now extended */
+
+
+#ifdef __ia64
+    register_stack_extend(th, exit, (VALUE*)rb_ia64_bsp());
+#else
+    rb_thread_restore_context_0(th, exit);
+#endif
 }
 
 static void
@@ -10499,16 +10831,6 @@ rb_thread_ready(th)
 }
 
 static void
-rb_thread_die(th)
-    rb_thread_t th;
-{
-    th->thgroup = 0;
-    th->status = THREAD_KILLED;
-    if (th->stk_ptr) free(th->stk_ptr);
-    th->stk_ptr = 0;
-}
-
-static void
 rb_thread_remove(th)
     rb_thread_t th;
 {
@@ -11077,8 +11399,6 @@ rb_thread_select(max, read, write, except, timeout)
     return curr_thread->select_value;
 }
 
-static int rb_thread_join _((rb_thread_t, double));
-
 static int
 rb_thread_join(th, limit)
     rb_thread_t th;
@@ -11171,7 +11491,7 @@ rb_thread_join_m(argc, argv, thread)
 {
     VALUE limit;
     double delay = DELAY_INFTY;
-    rb_thread_t th = rb_thread_check(thread);
+    rb_thread_t th = THREAD_DATA(thread);
 
     rb_scan_args(argc, argv, "01", &limit);
     if (!NIL_P(limit)) delay = rb_num2dbl(limit);
@@ -11283,7 +11603,7 @@ VALUE
 rb_thread_wakeup_alive(thread)
     VALUE thread;
 {
-    rb_thread_t th = rb_thread_check(thread);
+    rb_thread_t th = THREAD_DATA(thread);
 
     if (th->status == THREAD_KILLED)
 	return Qnil;
@@ -11358,7 +11678,7 @@ VALUE
 rb_thread_kill(thread)
     VALUE thread;
 {
-    rb_thread_t th = rb_thread_check(thread);
+    rb_thread_t th = THREAD_DATA(thread);
 
     rb_kill_thread(th, 0);
     return thread;
@@ -11382,7 +11702,7 @@ static VALUE
 rb_thread_kill_bang(thread)
     VALUE thread;
 {
-    rb_thread_t th = rb_thread_check(thread);
+    rb_thread_t th = THREAD_DATA(thread);
     rb_kill_thread(th, THREAD_NO_ENSURE);
     return thread;
 }
@@ -11554,7 +11874,7 @@ static VALUE
 rb_thread_priority(thread)
     VALUE thread;
 {
-    return INT2NUM(rb_thread_check(thread)->priority);
+    return INT2NUM(THREAD_DATA(thread)->priority);
 }
 
 
@@ -11588,7 +11908,7 @@ rb_thread_priority_set(thread, prio)
     rb_thread_t th;
 
     rb_secure(4);
-    th = rb_thread_check(thread);
+    th = THREAD_DATA(thread);
 
     th->priority = NUM2INT(prio);
     rb_thread_schedule();
@@ -11614,7 +11934,7 @@ rb_thread_safe_level(thread)
 {
     rb_thread_t th;
 
-    th = rb_thread_check(thread);
+    th = THREAD_DATA(thread);
     if (th == curr_thread) {
 	return INT2NUM(ruby_safe_level);
     }
@@ -11691,7 +12011,7 @@ static VALUE
 rb_thread_abort_exc(thread)
     VALUE thread;
 {
-    return rb_thread_check(thread)->abort?Qtrue:Qfalse;
+    return THREAD_DATA(thread)->abort?Qtrue:Qfalse;
 }
 
 
@@ -11709,7 +12029,7 @@ rb_thread_abort_exc_set(thread, val)
     VALUE thread, val;
 {
     rb_secure(4);
-    rb_thread_check(thread)->abort = RTEST(val);
+    THREAD_DATA(thread)->abort = RTEST(val);
     return val;
 }
 
@@ -11718,7 +12038,7 @@ enum rb_thread_status
 rb_thread_status(thread)
     VALUE thread;
 {
-    rb_thread_t th = rb_thread_check(thread);
+    rb_thread_t th = THREAD_DATA(thread);
     return th->status;
 }
 
@@ -11737,7 +12057,7 @@ VALUE
 rb_thread_group(thread)
     VALUE thread;
 {
-    VALUE group = rb_thread_check(thread)->thgroup;
+    VALUE group = THREAD_DATA(thread)->thgroup;
     if (!group) {
 	group = Qnil;
     }
@@ -11760,6 +12080,7 @@ rb_thread_group(thread)
     th->result = 0;\
     th->flags = 0;\
 \
+    th->stk_start = rb_gc_stack_start;\
     th->stk_ptr = 0;\
     th->stk_len = 0;\
     th->stk_max = 0;\
@@ -11971,6 +12292,16 @@ rb_thread_start_0(fn, arg, th)
 		 "can't start a new thread (frozen ThreadGroup)");
     }
 
+
+    th->stk_start =   /* establish start of new thread's stack */
+#if STACK_GROW_DIRECTION > 0
+      (VALUE *)ruby_frame;
+#elif STACK_GROW_DIRECTION < 0
+      (VALUE *)(ruby_frame+1);
+#else
+      (VALUE *)(ruby_frame+((VALUE *)(&arg)<rb_gc_stack_start))
+#endif
+ 
     if (!thread_init) {
 	thread_init = 1;
 #if defined(HAVE_SETITIMER) || defined(_THREAD_SAFE)
@@ -12016,6 +12347,8 @@ rb_thread_start_0(fn, arg, th)
     PUSH_TAG(PROT_THREAD);
     if ((state = EXEC_TAG()) == 0) {
 	if (THREAD_SAVE_CONTEXT(th) == 0) {
+            ruby_frame->prev = top_frame;     /* hide parent thread's frames */
+            ruby_frame->tmp = 0;           
 	    curr_thread = th;
 	    th->result = (*fn)(arg, th);
 	}
@@ -12127,9 +12460,6 @@ rb_thread_s_new(argc, argv, klass)
     VALUE klass;
 {
     rb_thread_t th = rb_thread_alloc(klass);
-    volatile VALUE *pos;
-
-    pos = th->stk_pos;
     rb_obj_call_init(th->thread, argc, argv);
     if (th->stk_pos == 0) {
 	rb_raise(rb_eThreadError, "uninitialized thread - check `%s#initialize'",
@@ -12167,7 +12497,7 @@ rb_thread_initialize(thread, args)
     if (!rb_block_given_p()) {
 	rb_raise(rb_eThreadError, "must be called with a block");
     }
-    th = rb_thread_check(thread);
+    th = THREAD_DATA(thread);
     if (th->stk_max) {
 	NODE *node = th->node;
 	if (!node) {
@@ -12216,7 +12546,7 @@ static VALUE
 rb_thread_value(thread)
     VALUE thread;
 {
-    rb_thread_t th = rb_thread_check(thread);
+    rb_thread_t th = THREAD_DATA(thread);
 
     while (!rb_thread_join(th, DELAY_INFTY));
 
@@ -12251,7 +12581,7 @@ static VALUE
 rb_thread_status_name(thread)
     VALUE thread;
 {
-    rb_thread_t th = rb_thread_check(thread);
+    rb_thread_t th = THREAD_DATA(thread);
 
     if (rb_thread_dead(th)) {
 	if (!NIL_P(th->errinfo) && (th->flags & RAISED_EXCEPTION))
@@ -12279,7 +12609,7 @@ VALUE
 rb_thread_alive_p(thread)
     VALUE thread;
 {
-    rb_thread_t th = rb_thread_check(thread);
+    rb_thread_t th = THREAD_DATA(thread);
 
     if (rb_thread_dead(th)) return Qfalse;
     return Qtrue;
@@ -12302,7 +12632,7 @@ static VALUE
 rb_thread_stop_p(thread)
     VALUE thread;
 {
-    rb_thread_t th = rb_thread_check(thread);
+    rb_thread_t th = THREAD_DATA(thread);
 
     if (rb_thread_dead(th)) return Qtrue;
     if (th->status == THREAD_STOPPED) return Qtrue;
@@ -12536,7 +12866,7 @@ rb_thread_raise_m(argc, argv, thread)
     VALUE *argv;
     VALUE thread;
 {
-    rb_thread_t th = rb_thread_check(thread);
+    rb_thread_t th = THREAD_DATA(thread);
 
     if (ruby_safe_level > th->safe) {
 	rb_secure(4);
@@ -12553,7 +12883,7 @@ rb_thread_local_aref(thread, id)
     rb_thread_t th;
     VALUE val;
 
-    th = rb_thread_check(thread);
+    th = THREAD_DATA(thread);
     if (ruby_safe_level >= 4 && th != curr_thread) {
 	rb_raise(rb_eSecurityError, "Insecure: thread locals");
     }
@@ -12599,7 +12929,7 @@ rb_thread_local_aset(thread, id, val)
     ID id;
     VALUE val;
 {
-    rb_thread_t th = rb_thread_check(thread);
+    rb_thread_t th = THREAD_DATA(thread);
 
     if (ruby_safe_level >= 4 && th != curr_thread) {
 	rb_raise(rb_eSecurityError, "Insecure: can't modify thread locals");
@@ -12652,7 +12982,7 @@ static VALUE
 rb_thread_key_p(thread, id)
     VALUE thread, id;
 {
-    rb_thread_t th = rb_thread_check(thread);
+    rb_thread_t th = THREAD_DATA(thread);
 
     if (!th->locals) return Qfalse;
     if (st_lookup(th->locals, rb_to_id(id), 0))
@@ -12688,7 +13018,7 @@ static VALUE
 rb_thread_keys(thread)
     VALUE thread;
 {
-    rb_thread_t th = rb_thread_check(thread);
+    rb_thread_t th = THREAD_DATA(thread);
     VALUE ary = rb_ary_new();
 
     if (th->locals) {
@@ -12709,7 +13039,7 @@ rb_thread_inspect(thread)
     VALUE thread;
 {
     char *cname = rb_obj_classname(thread);
-    rb_thread_t th = rb_thread_check(thread);
+    rb_thread_t th = THREAD_DATA(thread);
     const char *status = thread_status_name(th->status);
     VALUE str;
     size_t len = strlen(cname)+7+16+9+1;
@@ -12789,6 +13119,32 @@ rb_thread_atfork()
 
 VALUE rb_cCont;
 
+
+static rb_thread_t prep4callcc(void)
+{
+  rb_thread_t th;
+  struct tag *tag;
+  struct RVarmap *vars;
+
+  THREAD_ALLOC(th);
+  /* must finish th initialization before any possible gc */
+  th->thread = curr_thread->thread;    /* brent@mbari.org */
+  th->thgroup = cont_protect;
+
+  scope_dup(ruby_scope);
+  for (tag=prot_tag; tag; tag=tag->prev) {
+      if (tag->tag == PROT_THREAD) break;
+      scope_dup(tag->scope);
+  }
+
+  for (vars = ruby_dyna_vars; vars; vars = vars->next) {
+      if (FL_TEST(vars, DVAR_DONT_RECYCLE)) break;
+      FL_SET(vars, DVAR_DONT_RECYCLE);
+  }
+  return th;
+}
+
+
 /*
  *  call-seq:
  *     callcc {|cont| block }   =>  obj
@@ -12807,35 +13163,14 @@ static VALUE
 rb_callcc(self)
     VALUE self;
 {
-    volatile VALUE cont;
-    rb_thread_t th;
-    volatile rb_thread_t th_save;
-    struct tag *tag;
-    struct RVarmap *vars;
-
-    THREAD_ALLOC(th);
-    cont = Data_Wrap_Struct(rb_cCont, thread_mark, thread_free, th);
-
-    scope_dup(ruby_scope);
-    for (tag=prot_tag; tag; tag=tag->prev) {
-	scope_dup(tag->scope);
-    }
-    th->thread = curr_thread->thread;
-    th->thgroup = cont_protect;
-
-    for (vars = ruby_dyna_vars; vars; vars = vars->next) {
-	if (FL_TEST(vars, DVAR_DONT_RECYCLE)) break;
-	FL_SET(vars, DVAR_DONT_RECYCLE);
-    }
-    th_save = th;
-    if (THREAD_SAVE_CONTEXT(th)) {
-	return th_save->result;
-    }
-    else {
-	return rb_yield(cont);
-    }
+    volatile rb_thread_t th = prep4callcc();
+    return THREAD_SAVE_CONTEXT(th) ?
+      th->result
+          :
+      rb_yield(Data_Wrap_Struct(rb_cCont, cc_mark, thread_free, th));
 }
 
+
 /*
  *  call-seq:
  *     cont.call(args, ...) 
@@ -12858,7 +13193,7 @@ rb_cont_call(argc, argv, cont)
     VALUE *argv;
     VALUE cont;
 {
-    rb_thread_t th = rb_thread_check(cont);
+    rb_thread_t th = THREAD_DATA(cont);
 
     if (th->thread != curr_thread->thread) {
 	rb_raise(rb_eRuntimeError, "continuation called across threads");
@@ -12882,6 +13217,34 @@ rb_cont_call(argc, argv, cont)
     return Qnil;
 }
 
+
+#ifdef MBARI_API
+/*
+ *  call-seq:
+ *     cont.thread
+ *  
+ *  Returns the thread on which this continuation can be called
+ *  or nil if that thread has died
+ *
+ *     t = Thread.new {callcc{|c| $x=c}; sleep 5}
+ *     sleep 1
+ *     $x.thread                             #=> t
+ *     sleep 10
+ *     $x.thread                             #=> nil
+ *
+ *  <i>Only available when MBARI_API extentions are enabled at build time</i>
+ */
+static VALUE
+rb_cont_thread(cont)
+  VALUE cont;
+{
+  rb_thread_t th = THREAD_DATA(cont);
+  cc_purge(th);
+  return th->thread;
+}
+#endif
+
+
 struct thgroup {
     int enclosed;
     VALUE group;
@@ -13034,10 +13397,6 @@ thgroup_add(group, thread)
 
     rb_secure(4);
     th = rb_thread_check(thread);
-    if (!th->next || !th->prev) {
-	rb_raise(rb_eTypeError, "wrong argument type %s (expected Thread)",
-		 rb_obj_classname(thread));
-    }
 
     if (OBJ_FROZEN(group)) {
       rb_raise(rb_eThreadError, "can't move to the frozen thread group");
@@ -13135,6 +13494,9 @@ Init_Thread()
     rb_undef_method(CLASS_OF(rb_cCont), "new");
     rb_define_method(rb_cCont, "call", rb_cont_call, -1);
     rb_define_method(rb_cCont, "[]", rb_cont_call, -1);
+#ifdef MBARI_API
+    rb_define_method(rb_cCont, "thread", rb_cont_thread, 0);
+#endif
     rb_define_global_function("callcc", rb_callcc, 0);
     rb_global_variable(&cont_protect);
 
@@ -13186,14 +13548,15 @@ Init_Thread()
 
 static VALUE
 rb_f_catch(dmy, tag)
-    VALUE dmy, tag;
+    VALUE dmy;
+    volatile VALUE tag;
 {
     int state;
-    VALUE val = Qnil;		/* OK */
+    VALUE val;
 
     tag = ID2SYM(rb_to_id(tag));
     PUSH_TAG(tag);
-    if ((state = EXEC_TAG()) == 0) {
+    if ((state = wipeAfter(EXEC_TAG_0())) == 0) {
 	val = rb_yield_0(tag, 0, 0, 0, Qfalse);
     }
     else if (state == TAG_THROW && tag == prot_tag->dst) {
@@ -13261,6 +13624,9 @@ rb_f_throw(argc, argv)
     if (!tt) {
 	rb_name_error(SYM2ID(tag), "uncaught throw `%s'", rb_id2name(SYM2ID(tag)));
     }
+#if STACK_WIPE_SITES & 0x800
+    rb_gc_update_stack_extent();
+#endif
     rb_trap_restore_mask();
     JUMP_TAG(TAG_THROW);
 #ifndef __GNUC__
diff --git a/gc.c b/gc.c
index 33f035e..d89ee09 100644
--- a/gc.c
+++ b/gc.c
@@ -22,10 +22,6 @@
 #include <setjmp.h>
 #include <sys/types.h>
 
-#ifdef HAVE_SYS_TIME_H
-#include <sys/time.h>
-#endif
-
 #ifdef HAVE_SYS_RESOURCE_H
 #include <sys/resource.h>
 #endif
@@ -41,39 +37,150 @@ void rb_io_fptr_finalize _((struct OpenFile*));
 #define setjmp(env) _setjmp(env)
 #endif
 
-/* Make alloca work the best possible way.  */
-#ifdef __GNUC__
-# ifndef atarist
-#  ifndef alloca
-#   define alloca __builtin_alloca
-#  endif
-# endif /* atarist */
-#else
-# ifdef HAVE_ALLOCA_H
-#  include <alloca.h>
-# else
-#  ifndef _AIX
-#   ifndef alloca /* predefined by HP cc +Olibcalls */
-void *alloca ();
-#   endif
-#  endif /* AIX */
-# endif /* HAVE_ALLOCA_H */
-#endif /* __GNUC__ */
-
 #ifndef GC_MALLOC_LIMIT
 #if defined(MSDOS) || defined(__human68k__)
 #define GC_MALLOC_LIMIT 200000
 #else
-#define GC_MALLOC_LIMIT 8000000
+#define GC_MALLOC_LIMIT (2000000*sizeof(VALUE))
 #endif
 #endif
 
-static unsigned long malloc_increase = 0;
-static unsigned long malloc_limit = GC_MALLOC_LIMIT;
+#ifndef GC_LEVEL_MAX  /*maximum # of VALUEs on 'C' stack during GC*/
+#define GC_LEVEL_MAX  8000
+#endif
+#ifndef GC_STACK_PAD
+#define GC_STACK_PAD  200  /* extra padding VALUEs for GC stack */
+#endif
+#define GC_STACK_MAX  (GC_LEVEL_MAX+GC_STACK_PAD)
+
+static VALUE *stack_limit, *gc_stack_limit;
+
+static size_t malloc_increase = 0;
+static size_t malloc_limit = GC_MALLOC_LIMIT;
+
+#ifdef MBARI_API
+/*
+ *  call-seq:
+ *     GC.limit    => increase limit in bytes
+ *
+ *  Get the # of bytes that may be allocated before triggering
+ *  a mark and sweep by the garbarge collector to reclaim unused storage.
+ *
+ *  <i>Only available when MBARI_API extentions are enabled at build time</i>
+ */
+static VALUE gc_getlimit(VALUE mod)
+{
+  return ULONG2NUM(malloc_limit);
+}
+
+/*
+ *  call-seq:
+ *     GC.limit=   => updated increase limit in bytes
+ *
+ *  Set the # of bytes that may be allocated before triggering
+ *  a mark and sweep by the garbarge collector to reclaim unused storage.
+ *  Attempts to set the GC.limit= less than 0 will be ignored.
+ *
+ *     GC.limit=5000000   #=> 5000000
+ *     GC.limit           #=> 5000000
+ *     GC.limit=-50       #=> 5000000
+ *     GC.limit=0         #=> 0  #functionally equivalent to GC.stress=true
+ *
+ *  <i>Only available when MBARI_API extentions are enabled at build time</i>
+ */
+static VALUE gc_setlimit(VALUE mod, VALUE newLimit)
+{
+  long limit = NUM2LONG(newLimit);
+  rb_secure(2);
+  if (limit < 0) return gc_getlimit(mod);
+  malloc_limit = limit;
+  return newLimit;
+}
+
+
+/*
+ *  call-seq:
+ *     GC.growth
+ *
+ *  Get # of bytes that have been allocated since the last mark & sweep
+ *
+ *  <i>Only available when MBARI_API extentions are enabled at build time</i>
+ */
+static VALUE gc_growth(VALUE mod)
+{
+  return ULONG2NUM(malloc_increase);
+}
+
+
+/*
+ *  call-seq:
+ *     GC.exorcise
+ *
+ *  Purge ghost references from recently freed stack space
+ *
+ *  <i>Only available when MBARI_API extentions are enabled at build time</i>
+ */
+static VALUE gc_exorcise(VALUE mod)
+{
+  rb_gc_wipe_stack();
+  return Qnil;
+}
+
+#else /* no api changes */
+
+static size_t unstressed_malloc_limit = GC_MALLOC_LIMIT;
+
+/*
+ *  call-seq:
+ *    GC.stress                 => true or false
+ *
+ *  returns current status of GC stress mode.
+ *
+ *  <i>Only available when MBARI_API extentions are disabled at build time</i>
+ */
+
+static VALUE
+gc_stress_get(self)
+    VALUE self;
+{
+    return malloc_limit ? Qfalse : Qtrue;
+}
+
+/*
+ *  call-seq:
+ *    GC.stress = bool          => bool
+ *
+ *  updates GC stress mode.
+ *
+ *  When GC.stress = true, GC is invoked for all GC opportunity:
+ *  all memory and object allocation.
+ *
+ *  Since it makes Ruby very slow, it is only for debugging.
+ *
+ *  <i>Only available when MBARI_API extentions are enabled at build time</i>
+ */
+
+static VALUE
+gc_stress_set(self, bool)
+    VALUE self, bool;
+{
+    rb_secure(2);
+    if (!RTEST(bool))
+      malloc_limit = unstressed_malloc_limit;
+    else if (malloc_limit > 0) {
+      unstressed_malloc_limit = malloc_limit;
+      malloc_limit = 0;
+    }
+    return bool;
+}
+
+#endif /* MBARI_API */
+
 static void run_final();
 static VALUE nomem_error;
 static void garbage_collect();
 
+
 NORETURN(void rb_exc_jump _((VALUE)));
 
 void
@@ -93,6 +200,7 @@ rb_memerror()
     rb_exc_raise(nomem_error);
 }
 
+
 void *
 ruby_xmalloc(size)
     long size;
@@ -104,8 +212,9 @@ ruby_xmalloc(size)
     }
     if (size == 0) size = 1;
 
-    if ((malloc_increase+size) > malloc_limit) {
+    if ((malloc_increase+=size) > malloc_limit) {
 	garbage_collect();
+        malloc_increase = size;
     }
     RUBY_CRITICAL(mem = malloc(size));
     if (!mem) {
@@ -115,8 +224,9 @@ ruby_xmalloc(size)
 	    rb_memerror();
 	}
     }
-    malloc_increase += size;
-
+#if STACK_WIPE_SITES & 0x100
+    rb_gc_update_stack_extent();
+#endif
     return mem;
 }
 
@@ -144,6 +254,10 @@ ruby_xrealloc(ptr, size)
     }
     if (!ptr) return xmalloc(size);
     if (size == 0) size = 1;
+    if ((malloc_increase+=size) > malloc_limit) {
+	garbage_collect();
+        malloc_increase = size;
+    }
     RUBY_CRITICAL(mem = realloc(ptr, size));
     if (!mem) {
 	garbage_collect();
@@ -152,8 +266,9 @@ ruby_xrealloc(ptr, size)
 	    rb_memerror();
         }
     }
-    malloc_increase += size;
-
+#if STACK_WIPE_SITES & 0x200
+    rb_gc_update_stack_extent();
+#endif
     return mem;
 }
 
@@ -393,7 +508,7 @@ rb_newobj()
     if (during_gc)
 	rb_bug("object allocation during garbage collection phase");
 
-    if (!freelist) garbage_collect();
+    if (!malloc_limit || !freelist) garbage_collect();
 
     obj = (VALUE)freelist;
     freelist = freelist->as.free.next;
@@ -428,6 +543,9 @@ VALUE *rb_gc_stack_start = 0;
 VALUE *rb_gc_register_stack_start = 0;
 #endif
 
+VALUE *rb_gc_stack_end = (VALUE *)STACK_GROW_DIRECTION;
+
+
 #ifdef DJGPP
 /* set stack size (http://www.delorie.com/djgpp/v2faq/faq15_9.html) */
 unsigned int _stklen = 0x180000; /* 1.5 kB */
@@ -445,77 +563,90 @@ static unsigned int STACK_LEVEL_MAX = 655300;
 # define STACK_LEVEL_MAX 655300
 #endif
 
-#ifdef C_ALLOCA
-# define SET_STACK_END VALUE stack_end; alloca(0);
+#ifndef nativeAllocA
+  /* portable way to return an approximate stack pointer */
+NOINLINE(VALUE *__sp(void));
+VALUE *__sp(void) {
+  VALUE tos;
+  return &tos;
+}
+# define SET_STACK_END VALUE stack_end
 # define STACK_END (&stack_end)
 #else
-# if defined(__GNUC__) && defined(USE_BUILTIN_FRAME_ADDRESS) && !defined(__ia64)
-#  if ( __GNUC__ == 3 && __GNUC_MINOR__ > 0 ) || __GNUC__ > 3
-__attribute__ ((noinline))
-#  endif
-static void
-stack_end_address(VALUE **stack_end_p)
-{
-    VALUE stack_end;
-    *stack_end_p = &stack_end;
-}
-#  define  SET_STACK_END    VALUE *stack_end; stack_end_address(&stack_end)
-# else
-#  define  SET_STACK_END    VALUE *stack_end = alloca(1)
-# endif
-# define STACK_END (stack_end)
+# define SET_STACK_END ((void)0)
+# define STACK_END __sp()
 #endif
+
 #if STACK_GROW_DIRECTION < 0
-# define STACK_LENGTH  (rb_gc_stack_start - STACK_END)
+# define STACK_LENGTH(start)  ((start) - STACK_END)
 #elif STACK_GROW_DIRECTION > 0
-# define STACK_LENGTH  (STACK_END - rb_gc_stack_start + 1)
+# define STACK_LENGTH(start)  (STACK_END - (start) + 1)
 #else
-# define STACK_LENGTH  ((STACK_END < rb_gc_stack_start) ? rb_gc_stack_start - STACK_END\
-                                           : STACK_END - rb_gc_stack_start + 1)
+# define STACK_LENGTH(start)  ((STACK_END < (start)) ? \
+                                 (start) - STACK_END : STACK_END - (start) + 1)
 #endif
+
 #if STACK_GROW_DIRECTION > 0
-# define STACK_UPPER(x, a, b) a
+# define STACK_UPPER(a, b) a
 #elif STACK_GROW_DIRECTION < 0
-# define STACK_UPPER(x, a, b) b
+# define STACK_UPPER(a, b) b
 #else
-static int grow_direction;
+int rb_gc_stack_grow_direction;
 static int
 stack_grow_direction(addr)
     VALUE *addr;
 {
     SET_STACK_END;
-
-    if (STACK_END > addr) return grow_direction = 1;
-    return grow_direction = -1;
+    return rb_gc_stack_grow_direction = STACK_END > addr ? 1 : -1;
 }
-# define stack_growup_p(x) ((grow_direction ? grow_direction : stack_grow_direction(x)) > 0)
-# define STACK_UPPER(x, a, b) (stack_growup_p(x) ? a : b)
+# define STACK_UPPER(a, b) (rb_gc_stack_grow_direction > 0 ? a : b)
 #endif
 
-#define GC_WATER_MARK 512
-
-#define CHECK_STACK(ret) do {\
-    SET_STACK_END;\
-    (ret) = (STACK_LENGTH > STACK_LEVEL_MAX + GC_WATER_MARK);\
-} while (0)
-
-int
-ruby_stack_length(p)
-    VALUE **p;
+size_t
+ruby_stack_length(start, base)
+    VALUE *start, **base;
 {
     SET_STACK_END;
-    if (p) *p = STACK_UPPER(STACK_END, rb_gc_stack_start, STACK_END);
-    return STACK_LENGTH;
+    if (base) *base = STACK_UPPER(start, STACK_END);
+    return STACK_LENGTH(start);
 }
 
 int
 ruby_stack_check()
 {
-    int ret;
+    SET_STACK_END;
+    return __stack_past(stack_limit, STACK_END);
+}
 
-    CHECK_STACK(ret);
-    return ret;
+/*
+  Zero memory that was (recently) part of the stack, but is no longer.
+  Invoke when stack is deep to mark its extent and when it's shallow to wipe it.
+*/
+#if STACK_WIPE_METHOD != 4
+#if STACK_WIPE_METHOD
+void rb_gc_wipe_stack(void)
+{
+  VALUE *stack_end = rb_gc_stack_end;
+  VALUE *sp = __sp();
+  rb_gc_stack_end = sp;
+#if STACK_WIPE_METHOD == 1
+#warning clearing of "ghost references" from the call stack has been disabled
+#elif STACK_WIPE_METHOD == 2  /* alloca ghost stack before clearing it */
+  if (__stack_past(sp, stack_end)) {
+    size_t bytes = __stack_depth((char *)stack_end, (char *)sp);
+    STACK_UPPER(sp = nativeAllocA(bytes), stack_end = nativeAllocA(bytes));
+    __stack_zero(stack_end, sp);
+  }
+#elif STACK_WIPE_METHOD == 3    /* clear unallocated area past stack pointer */
+  __stack_zero(stack_end, sp);  /* will crash if compiler pushes a temp. here */
+#else
+#error unsupported method of clearing ghost references from the stack
+#endif
 }
+#else
+#warning clearing of "ghost references" from the call stack completely disabled
+#endif
+#endif
 
 #define MARK_STACK_MAX 1024
 static VALUE mark_stack[MARK_STACK_MAX];
@@ -530,7 +661,18 @@ init_mark_stack()
 }
 
 #define MARK_STACK_EMPTY (mark_stack_ptr == mark_stack)
-            
+
+static inline void
+push_mark_stack(VALUE ptr)
+{
+    if (!mark_stack_overflow) {
+	if (mark_stack_ptr - mark_stack < MARK_STACK_MAX)
+	    *mark_stack_ptr++ = ptr;
+	else
+	    mark_stack_overflow = 1;
+    }
+}
+    
 static st_table *source_filenames;
 
 char *
@@ -574,22 +716,22 @@ sweep_source_filename(key, value)
     }
 }
 
-static void gc_mark _((VALUE ptr, int lev));
-static void gc_mark_children _((VALUE ptr, int lev));
+#define gc_mark(ptr) rb_gc_mark(ptr)
+static void gc_mark_children _((VALUE ptr));
 
 static void
 gc_mark_all()
 {
     RVALUE *p, *pend;
-    int i;
+    struct heaps_slot *heap = heaps+heaps_used;
 
     init_mark_stack();
-    for (i = 0; i < heaps_used; i++) {
-	p = heaps[i].slot; pend = p + heaps[i].limit;
+    while (--heap >= heaps) {
+	p = heap->slot; pend = p + heap->limit;
 	while (p < pend) {
 	    if ((p->as.basic.flags & FL_MARK) &&
 		(p->as.basic.flags != FL_MARK)) {
-		gc_mark_children((VALUE)p, 0);
+		gc_mark_children((VALUE)p);
 	    }
 	    p++;
 	}
@@ -599,169 +741,129 @@ gc_mark_all()
 static void
 gc_mark_rest()
 {
+    size_t stackLen = mark_stack_ptr - mark_stack;
+#ifdef nativeAllocA
+    VALUE *tmp_arry = nativeAllocA(stackLen*sizeof(VALUE));
+#else
     VALUE tmp_arry[MARK_STACK_MAX];
-    VALUE *p;
-
-    p = (mark_stack_ptr - mark_stack) + tmp_arry;
-    MEMCPY(tmp_arry, mark_stack, VALUE, MARK_STACK_MAX);
+#endif
+    VALUE *p = tmp_arry + stackLen;
+    
+    MEMCPY(tmp_arry, mark_stack, VALUE, stackLen);
 
     init_mark_stack();
-    while(p != tmp_arry){
-	p--;
-	gc_mark_children(*p, 0);
-    }
+    while(--p >= tmp_arry) gc_mark_children(*p);
 }
 
 static inline int
 is_pointer_to_heap(ptr)
     void *ptr;
 {
-    register RVALUE *p = RANY(ptr);
-    register RVALUE *heap_org;
-    register long i;
+    RVALUE *p = RANY(ptr);
+    struct heaps_slot *heap;
 
-    if (p < lomem || p > himem) return Qfalse;
-    if ((VALUE)p % sizeof(RVALUE) != 0) return Qfalse;
+    if (p < lomem || p > himem || (VALUE)p % sizeof(RVALUE)) return Qfalse;
 
     /* check if p looks like a pointer */
-    for (i=0; i < heaps_used; i++) {
-	heap_org = heaps[i].slot;
-	if (heap_org <= p && p < heap_org + heaps[i].limit)
-	    return Qtrue;
-    }
+    heap = heaps+heaps_used;
+    while (--heap >= heaps) 
+      if (p >= heap->slot && p < heap->slot + heap->limit)
+        return Qtrue;
     return Qfalse;
 }
 
 static void
 mark_locations_array(x, n)
-    register VALUE *x;
-    register long n;
+    VALUE *x;
+    size_t n;
 {
     VALUE v;
     while (n--) {
         v = *x;
 	if (is_pointer_to_heap((void *)v)) {
-	    gc_mark(v, 0);
+	    gc_mark(v);
 	}
 	x++;
     }
 }
 
-void
+inline void
 rb_gc_mark_locations(start, end)
     VALUE *start, *end;
 {
-    long n;
-
-    n = end - start;
-    mark_locations_array(start,n);
+    mark_locations_array(start,end - start);
 }
 
 static int
-mark_entry(key, value, lev)
+mark_entry(key, value)
     ID key;
     VALUE value;
-    int lev;
 {
-    gc_mark(value, lev);
+    gc_mark(value);
     return ST_CONTINUE;
 }
 
-static void
-mark_tbl(tbl, lev)
-    st_table *tbl;
-    int lev;
-{
-    if (!tbl) return;
-    st_foreach(tbl, mark_entry, lev);
-}
-
 void
 rb_mark_tbl(tbl)
     st_table *tbl;
 {
-    mark_tbl(tbl, 0);
+    if (!tbl) return;
+    st_foreach(tbl, mark_entry, 0);
 }
+#define mark_tbl(tbl)  rb_mark_tbl(tbl)
 
 static int
-mark_keyvalue(key, value, lev)
+mark_keyvalue(key, value)
     VALUE key;
     VALUE value;
-    int lev;
 {
-    gc_mark(key, lev);
-    gc_mark(value, lev);
+    gc_mark(key);
+    gc_mark(value);
     return ST_CONTINUE;
 }
 
-static void
-mark_hash(tbl, lev)
-    st_table *tbl;
-    int lev;
-{
-    if (!tbl) return;
-    st_foreach(tbl, mark_keyvalue, lev);
-}
-
 void
 rb_mark_hash(tbl)
     st_table *tbl;
 {
-    mark_hash(tbl, 0);
+    if (!tbl) return;
+    st_foreach(tbl, mark_keyvalue, 0);
 }
+#define mark_hash(tbl)  rb_mark_hash(tbl)
 
 void
 rb_gc_mark_maybe(obj)
     VALUE obj;
 {
     if (is_pointer_to_heap((void *)obj)) {
-	gc_mark(obj, 0);
+	gc_mark(obj);
     }
 }
 
-#define GC_LEVEL_MAX 250
-
-static void
-gc_mark(ptr, lev)
+void
+rb_gc_mark(ptr)
     VALUE ptr;
-    int lev;
 {
-    register RVALUE *obj;
-
-    obj = RANY(ptr);
+    RVALUE *obj = RANY(ptr);
+    SET_STACK_END;
+    
     if (rb_special_const_p(ptr)) return; /* special const not marked */
     if (obj->as.basic.flags == 0) return;       /* free cell */
     if (obj->as.basic.flags & FL_MARK) return;  /* already marked */
     obj->as.basic.flags |= FL_MARK;
 
-    if (lev > GC_LEVEL_MAX || (lev == 0 && ruby_stack_check())) {
-	if (!mark_stack_overflow) {
-	    if (mark_stack_ptr - mark_stack < MARK_STACK_MAX) {
-		*mark_stack_ptr = ptr;
-		mark_stack_ptr++;		
-	    }
-	    else {
-		mark_stack_overflow = 1;
-	    }
-	}
-	return;
+    if (__stack_past(gc_stack_limit, STACK_END))
+      push_mark_stack(ptr);
+    else{
+      gc_mark_children(ptr);
     }
-    gc_mark_children(ptr, lev+1);
-}
-
-void
-rb_gc_mark(ptr)
-    VALUE ptr;
-{
-    gc_mark(ptr, 0);
 }
 
 static void
-gc_mark_children(ptr, lev)
+gc_mark_children(ptr)
     VALUE ptr;
-    int lev;
 {
-    register RVALUE *obj = RANY(ptr);
+    RVALUE *obj = RANY(ptr);
 
     goto marking;		/* skip */
 
@@ -795,7 +897,7 @@ gc_mark_children(ptr, lev)
 	  case NODE_RESCUE:
 	  case NODE_RESBODY:
 	  case NODE_CLASS:
-	    gc_mark((VALUE)obj->as.node.u2.node, lev);
+	    gc_mark((VALUE)obj->as.node.u2.node);
 	    /* fall through */
 	  case NODE_BLOCK:	/* 1,3 */
 	  case NODE_ARRAY:
@@ -808,7 +910,7 @@ gc_mark_children(ptr, lev)
 	  case NODE_CALL:
 	  case NODE_DEFS:
 	  case NODE_OP_ASGN1:
-	    gc_mark((VALUE)obj->as.node.u1.node, lev);
+	    gc_mark((VALUE)obj->as.node.u1.node);
 	    /* fall through */
 	  case NODE_SUPER:	/* 3 */
 	  case NODE_FCALL:
@@ -835,7 +937,7 @@ gc_mark_children(ptr, lev)
 	  case NODE_ALIAS:
 	  case NODE_VALIAS:
 	  case NODE_ARGS:
-	    gc_mark((VALUE)obj->as.node.u1.node, lev);
+	    gc_mark((VALUE)obj->as.node.u1.node);
 	    /* fall through */
 	  case NODE_METHOD:	/* 2 */
 	  case NODE_NOT:
@@ -873,7 +975,7 @@ gc_mark_children(ptr, lev)
 	  case NODE_SCOPE:	/* 2,3 */
 	  case NODE_BLOCK_PASS:
 	  case NODE_CDECL:
-	    gc_mark((VALUE)obj->as.node.u3.node, lev);
+	    gc_mark((VALUE)obj->as.node.u3.node);
 	    ptr = (VALUE)obj->as.node.u2.node;
 	    goto again;
 
@@ -906,25 +1008,26 @@ gc_mark_children(ptr, lev)
 
 	  default:		/* unlisted NODE */
 	    if (is_pointer_to_heap(obj->as.node.u1.node)) {
-		gc_mark((VALUE)obj->as.node.u1.node, lev);
+		gc_mark((VALUE)obj->as.node.u1.node);
 	    }
 	    if (is_pointer_to_heap(obj->as.node.u2.node)) {
-		gc_mark((VALUE)obj->as.node.u2.node, lev);
+		gc_mark((VALUE)obj->as.node.u2.node);
 	    }
 	    if (is_pointer_to_heap(obj->as.node.u3.node)) {
-		gc_mark((VALUE)obj->as.node.u3.node, lev);
+                ptr = (VALUE)obj->as.node.u3.node;
+                goto again;
 	    }
 	}
-	return;			/* no need to mark class. */
+        return;	/* no need to mark class. */
     }
 
-    gc_mark(obj->as.basic.klass, lev);
+    gc_mark(obj->as.basic.klass);
     switch (obj->as.basic.flags & T_MASK) {
       case T_ICLASS:
       case T_CLASS:
       case T_MODULE:
-	mark_tbl(obj->as.klass.m_tbl, lev);
-	mark_tbl(obj->as.klass.iv_tbl, lev);
+	mark_tbl(obj->as.klass.m_tbl);
+	mark_tbl(obj->as.klass.iv_tbl);
 	ptr = obj->as.klass.super;
 	goto again;
 
@@ -934,17 +1037,16 @@ gc_mark_children(ptr, lev)
 	    goto again;
 	}
 	else {
-	    long i, len = obj->as.array.len;
 	    VALUE *ptr = obj->as.array.ptr;
-
-	    for (i=0; i < len; i++) {
-		gc_mark(*ptr++, lev);
+            VALUE *pend = ptr + obj->as.array.len;
+	    while (ptr < pend) {
+		gc_mark(*ptr++);
 	    }
 	}
 	break;
 
       case T_HASH:
-	mark_hash(obj->as.hash.tbl, lev);
+	mark_hash(obj->as.hash.tbl);
 	ptr = obj->as.hash.ifnone;
 	goto again;
 
@@ -961,7 +1063,7 @@ gc_mark_children(ptr, lev)
 	break;
 
       case T_OBJECT:
-	mark_tbl(obj->as.object.iv_tbl, lev);
+	mark_tbl(obj->as.object.iv_tbl);
 	break;
 
       case T_FILE:
@@ -979,7 +1081,7 @@ gc_mark_children(ptr, lev)
 	break;
 
       case T_VARMAP:
-	gc_mark(obj->as.varmap.val, lev);
+	gc_mark(obj->as.varmap.val);
 	ptr = (VALUE)obj->as.varmap.next;
 	goto again;
 
@@ -989,19 +1091,17 @@ gc_mark_children(ptr, lev)
 	    VALUE *vars = &obj->as.scope.local_vars[-1];
 
 	    while (n--) {
-		gc_mark(*vars++, lev);
+		gc_mark(*vars++);
 	    }
 	}
 	break;
 
       case T_STRUCT:
 	{
-	    long len = obj->as.rstruct.len;
 	    VALUE *ptr = obj->as.rstruct.ptr;
-
-	    while (len--) {
-		gc_mark(*ptr++, lev);
-	    }
+            VALUE *pend = ptr + obj->as.rstruct.len;
+            while (ptr < pend)
+	       gc_mark(*ptr++);
 	}
 	break;
 
@@ -1057,13 +1157,12 @@ gc_sweep()
     RVALUE *p, *pend, *final_list;
     int freed = 0;
     int i;
-    unsigned long live = 0;
-    unsigned long free_min = 0;
+    long free_min = 0;
 
     for (i = 0; i < heaps_used; i++) {
         free_min += heaps[i].limit;
     }
-    free_min = free_min * 0.2;
+    free_min /= 5;
     if (free_min < FREE_MIN)
         free_min = FREE_MIN;
 
@@ -1074,7 +1173,7 @@ gc_sweep()
 	    p = heaps[i].slot; pend = p + heaps[i].limit;
 	    while (p < pend) {
 		if (!(p->as.basic.flags&FL_MARK) && BUILTIN_TYPE(p) == T_NODE)
-		    gc_mark((VALUE)p, 0);
+		    gc_mark((VALUE)p);
 		p++;
 	    }
 	}
@@ -1117,7 +1216,6 @@ gc_sweep()
 	    }
 	    else {
 		RBASIC(p)->flags &= ~FL_MARK;
-		live++;
 	    }
 	    p++;
 	}
@@ -1134,10 +1232,6 @@ gc_sweep()
 	    freed += n;
 	}
     }
-    if (malloc_increase > malloc_limit) {
-	malloc_limit += (malloc_increase - malloc_limit) * (double)live / (live + freed);
-	if (malloc_limit < GC_MALLOC_LIMIT) malloc_limit = GC_MALLOC_LIMIT;
-    }
     malloc_increase = 0;
     if (freed < free_min) {
 	add_heap();
@@ -1291,7 +1385,7 @@ void
 rb_gc_mark_frame(frame)
     struct FRAME *frame;
 {
-    gc_mark((VALUE)frame->node, 0);
+    gc_mark((VALUE)frame->node);
 }
 
 #ifdef __GNUC__
@@ -1332,12 +1426,13 @@ int rb_setjmp (rb_jmp_buf);
 #endif /* __human68k__ or DJGPP */
 #endif /* __GNUC__ */
 
+
+
 static void
-garbage_collect()
+garbage_collect_0(VALUE *top_frame)
 {
     struct gc_list *list;
-    struct FRAME * volatile frame; /* gcc 2.7.2.3 -O2 bug??  */
-    jmp_buf save_regs_gc_mark;
+    struct FRAME * frame;
     SET_STACK_END;
 
 #ifdef HAVE_NATIVETHREAD
@@ -1354,9 +1449,10 @@ garbage_collect()
     if (during_gc) return;
     during_gc++;
 
+    gc_stack_limit = __stack_grow(STACK_END, GC_LEVEL_MAX);
     init_mark_stack();
 
-    gc_mark((VALUE)ruby_current_node, 0);
+    gc_mark((VALUE)ruby_current_node);
 
     /* mark frame stack */
     for (frame = ruby_frame; frame; frame = frame->prev) {
@@ -1369,25 +1465,21 @@ garbage_collect()
 	    }
 	}
     }
-    gc_mark((VALUE)ruby_scope, 0);
-    gc_mark((VALUE)ruby_dyna_vars, 0);
+    gc_mark((VALUE)ruby_scope);
+    gc_mark((VALUE)ruby_dyna_vars);
     if (finalizer_table) {
-	mark_tbl(finalizer_table, 0);
+	mark_tbl(finalizer_table);
     }
 
-    FLUSH_REGISTER_WINDOWS;
-    /* This assumes that all registers are saved into the jmp_buf (and stack) */
-    setjmp(save_regs_gc_mark);
-    mark_locations_array((VALUE*)save_regs_gc_mark, sizeof(save_regs_gc_mark) / sizeof(VALUE *));
 #if STACK_GROW_DIRECTION < 0
-    rb_gc_mark_locations((VALUE*)STACK_END, rb_gc_stack_start);
+    rb_gc_mark_locations(top_frame, rb_curr_thread->stk_start);
 #elif STACK_GROW_DIRECTION > 0
-    rb_gc_mark_locations(rb_gc_stack_start, (VALUE*)STACK_END + 1);
+    rb_gc_mark_locations(rb_curr_thread->stk_start, top_frame + 1);
 #else
-    if ((VALUE*)STACK_END < rb_gc_stack_start)
-	rb_gc_mark_locations((VALUE*)STACK_END, rb_gc_stack_start);
+    if (rb_gc_stack_grow_direction < 0)
+	rb_gc_mark_locations(top_frame, rb_curr_thread->stk_start);
     else
-	rb_gc_mark_locations(rb_gc_stack_start, (VALUE*)STACK_END + 1);
+	rb_gc_mark_locations(rb_curr_thread->stk_start, top_frame + 1);
 #endif
 #ifdef __ia64
     /* mark backing store (flushed register window on the stack) */
@@ -1396,7 +1488,7 @@ garbage_collect()
 #endif
 #if defined(__human68k__) || defined(__mc68000__)
     rb_gc_mark_locations((VALUE*)((char*)STACK_END + 2),
-			 (VALUE*)((char*)rb_gc_stack_start + 2));
+			 (VALUE*)((char*)rb_curr_thread->stk_start + 2));
 #endif
     rb_gc_mark_threads();
 
@@ -1427,10 +1519,39 @@ garbage_collect()
 	}
 	rb_gc_abort_threads();
     } while (!MARK_STACK_EMPTY);
-
     gc_sweep();
 }
 
+static void
+garbage_collect()
+{
+  jmp_buf save_regs_gc_mark;
+  VALUE *top = __sp();
+  FLUSH_REGISTER_WINDOWS;
+  /* This assumes that all registers are saved into the jmp_buf (and stack) */
+  setjmp(save_regs_gc_mark);
+
+#if STACK_WIPE_SITES & 0x400
+# ifdef nativeAllocA
+  if (__stack_past (top, stack_limit)) {
+  /* allocate a large frame to ensure app stack cannot grow into GC stack */
+    (volatile void*) nativeAllocA(__stack_depth((void*)stack_limit,(void*)top));
+  }  
+  garbage_collect_0(top);
+# else /* no native alloca() available */
+  garbage_collect_0(top);
+  {
+    VALUE *paddedLimit = __stack_grow(gc_stack_limit, GC_STACK_PAD);
+    if (__stack_past(rb_gc_stack_end, paddedLimit))
+      rb_gc_stack_end = paddedLimit;
+  }
+  rb_gc_wipe_stack();  /* wipe the whole stack area reserved for this gc */  
+# endif
+#else
+  garbage_collect_0(top);
+#endif
+}
+
 void
 rb_gc()
 {
@@ -1455,6 +1576,7 @@ rb_gc_start()
     return Qnil;
 }
 
+
 void
 ruby_set_stack_size(size)
     size_t size;
@@ -1462,6 +1584,29 @@ ruby_set_stack_size(size)
 #ifndef STACK_LEVEL_MAX
     STACK_LEVEL_MAX = size / sizeof(VALUE);
 #endif
+    stack_limit = __stack_grow(rb_gc_stack_start, STACK_LEVEL_MAX-GC_STACK_MAX);
+}
+
+static void
+set_stack_size(void)
+{
+#ifdef HAVE_GETRLIMIT
+  struct rlimit rlim;
+  if (getrlimit(RLIMIT_STACK, &rlim) == 0) {
+    if (rlim.rlim_cur > 0 && rlim.rlim_cur != RLIM_INFINITY) {
+      size_t maxStackBytes = rlim.rlim_cur;
+      if (rlim.rlim_cur != maxStackBytes)
+        maxStackBytes = -1;
+      {
+        size_t space = maxStackBytes/5;
+        if (space > 1024*1024) space = 1024*1024;
+        ruby_set_stack_size(maxStackBytes - space);
+        return;
+      }
+    }
+  }
+#endif
+  ruby_set_stack_size(STACK_LEVEL_MAX*sizeof(VALUE));
 }
 
 void
@@ -1495,7 +1640,7 @@ Init_stack(addr)
     memset(&m, 0, sizeof(m));
     VirtualQuery(&m, &m, sizeof(m));
     rb_gc_stack_start =
-	STACK_UPPER((VALUE *)&m, (VALUE *)m.BaseAddress,
+	STACK_UPPER((VALUE *)m.BaseAddress,
 		    (VALUE *)((char *)m.BaseAddress + m.RegionSize) - 1);
 #elif defined(STACK_END_ADDRESS)
     {
@@ -1504,28 +1649,16 @@ Init_stack(addr)
     }
 #else
     if (!addr) addr = (void *)&addr;
-    STACK_UPPER(&addr, addr, ++addr);
+    STACK_UPPER(addr, ++addr);
     if (rb_gc_stack_start) {
-	if (STACK_UPPER(&addr,
-			rb_gc_stack_start > addr,
+	if (STACK_UPPER(rb_gc_stack_start > addr,
 			rb_gc_stack_start < addr))
 	    rb_gc_stack_start = addr;
 	return;
     }
     rb_gc_stack_start = addr;
 #endif
-#ifdef HAVE_GETRLIMIT
-    {
-	struct rlimit rlim;
-
-	if (getrlimit(RLIMIT_STACK, &rlim) == 0) {
-	    unsigned int space = rlim.rlim_cur/5;
-
-	    if (space > 1024*1024) space = 1024*1024;
-	    STACK_LEVEL_MAX = (rlim.rlim_cur - space) / sizeof(VALUE);
-	}
-    }
-#endif
+    set_stack_size();
 }
 
 void ruby_init_stack(VALUE *addr
@@ -1535,8 +1668,7 @@ void ruby_init_stack(VALUE *addr
     )
 {
     if (!rb_gc_stack_start ||
-        STACK_UPPER(&addr,
-                    rb_gc_stack_start > addr,
+        STACK_UPPER(rb_gc_stack_start > addr,
                     rb_gc_stack_start < addr)) {
         rb_gc_stack_start = addr;
     }
@@ -1547,16 +1679,7 @@ void ruby_init_stack(VALUE *addr
     }
 #endif
 #ifdef HAVE_GETRLIMIT
-    {
-        struct rlimit rlim;
-
-        if (getrlimit(RLIMIT_STACK, &rlim) == 0) {
-            unsigned int space = rlim.rlim_cur/5;
-
-            if (space > 1024*1024) space = 1024*1024;
-            STACK_LEVEL_MAX = (rlim.rlim_cur - space) / sizeof(VALUE);
-        }
-    }
+    set_stack_size();
 #elif defined _WIN32
     {
 	MEMORY_BASIC_INFORMATION mi;
@@ -1567,7 +1690,7 @@ void ruby_init_stack(VALUE *addr
 	    size = (char *)mi.BaseAddress - (char *)mi.AllocationBase;
 	    space = size / 5;
 	    if (space > 1024*1024) space = 1024*1024;
-	    STACK_LEVEL_MAX = (size - space) / sizeof(VALUE);
+	    ruby_set_stack_size(size - space);
 	}
     }
 #endif
@@ -2042,10 +2165,22 @@ Init_GC()
 {
     VALUE rb_mObSpace;
 
+#if !STACK_GROW_DIRECTION
+    rb_gc_stack_end = stack_grow_direction(&rb_mObSpace);
+#endif
     rb_mGC = rb_define_module("GC");
     rb_define_singleton_method(rb_mGC, "start", rb_gc_start, 0);
     rb_define_singleton_method(rb_mGC, "enable", rb_gc_enable, 0);
     rb_define_singleton_method(rb_mGC, "disable", rb_gc_disable, 0);
+#ifdef MBARI_API
+    rb_define_singleton_method(rb_mGC, "limit", gc_getlimit, 0);
+    rb_define_singleton_method(rb_mGC, "limit=", gc_setlimit, 1);
+    rb_define_singleton_method(rb_mGC, "growth", gc_growth, 0);
+    rb_define_singleton_method(rb_mGC, "exorcise", gc_exorcise, 0);
+#else
+    rb_define_singleton_method(rb_mGC, "stress", gc_stress_get, 0);
+    rb_define_singleton_method(rb_mGC, "stress=", gc_stress_set, 1);
+#endif
     rb_define_method(rb_mGC, "garbage_collect", rb_gc_start, 0);
 
     rb_mObSpace = rb_define_module("ObjectSpace");
diff --git a/intern.h b/intern.h
index b251a83..70a7656 100644
--- a/intern.h
+++ b/intern.h
@@ -238,7 +238,7 @@ VALUE rb_file_directory_p _((VALUE,VALUE));
 /* gc.c */
 NORETURN(void rb_memerror __((void)));
 int ruby_stack_check _((void));
-int ruby_stack_length _((VALUE**));
+size_t ruby_stack_length _((VALUE *,VALUE**));
 int rb_during_gc _((void));
 char *rb_source_filename _((const char*));
 void rb_gc_mark_locations _((VALUE*, VALUE*));
diff --git a/missing/alloca.c b/missing/alloca.c
index 39697f1..3facdfe 100644
--- a/missing/alloca.c
+++ b/missing/alloca.c
@@ -29,6 +29,7 @@
 static char	SCCSid[] = "@(#)alloca.c	1.1";	/* for the "what" utility */
 #endif
 
+#include <sys/types.h>
 #include "config.h"
 #ifdef emacs
 #ifdef static
@@ -44,11 +45,7 @@ lose
 #endif /* static */
 #endif /* emacs */
 
-#ifdef X3J11
 typedef void	*pointer;		/* generic pointer type */
-#else
-typedef char	*pointer;		/* generic pointer type */
-#endif /* X3J11 */
 
 #define	NULL	0			/* null pointer constant */
 
@@ -140,8 +137,7 @@ typedef union hdr
 static header *last_alloca_header = NULL; /* -> last alloca header */
 
 pointer
-alloca (size)			/* returns pointer to storage */
-     unsigned	size;		/* # bytes to allocate */
+alloca (size_t size)		/* returns pointer to storage */
 {
   auto char	probe;		/* probes stack depth: */
   register char	*depth = &probe;
diff --git a/node.h b/node.h
index 7d3f756..4a1db92 100644
--- a/node.h
+++ b/node.h
@@ -409,15 +409,11 @@ struct rb_thread {
 
     VALUE result;
 
-    long   stk_len;
-    long   stk_max;
-    VALUE *stk_ptr;
-    VALUE *stk_pos;
+    size_t stk_len, stk_max;
+    VALUE *stk_ptr, *stk_pos, *stk_start;
 #ifdef __ia64
-    long   bstr_len;
-    long   bstr_max;
-    VALUE *bstr_ptr;
-    VALUE *bstr_pos;
+    size_t   bstr_len, bstr_max;
+    VALUE *bstr_ptr, *bstr_pos;
 #endif
 
     struct FRAME *frame;
diff --git a/re.c b/re.c
index 5553d28..129b621 100644
--- a/re.c
+++ b/re.c
@@ -1419,7 +1419,7 @@ VALUE
 rb_reg_regcomp(str)
     VALUE str;
 {
-    volatile VALUE save_str = str;
+    VALUE save_str = str;
     if (reg_cache && RREGEXP(reg_cache)->len == RSTRING(str)->len
 	&& case_cache == ruby_ignorecase
 	&& kcode_cache == reg_kcode
@@ -1428,8 +1428,9 @@ rb_reg_regcomp(str)
 
     case_cache = ruby_ignorecase;
     kcode_cache = reg_kcode;
-    return reg_cache = rb_reg_new(RSTRING(str)->ptr, RSTRING(str)->len,
-				  ruby_ignorecase);
+    reg_cache = rb_reg_new(RSTRING(str)->ptr, RSTRING(str)->len, ruby_ignorecase);
+    RB_GC_GUARD(save_str);
+    return reg_cache;
 }
 
 static int
diff --git a/ruby.h b/ruby.h
index 2701f0d..3cf4e19 100644
--- a/ruby.h
+++ b/ruby.h
@@ -224,6 +224,8 @@ VALUE rb_ull2inum _((unsigned LONG_LONG));
 
 #define TYPE(x) rb_type((VALUE)(x))
 
+#define RB_GC_GUARD(v) (*(volatile VALUE *)&(v))
+
 void rb_check_type _((VALUE,int));
 #define Check_Type(v,t) rb_check_type((VALUE)(v),t)
 
diff --git a/rubysig.h b/rubysig.h
index f716824..fae0869 100644
--- a/rubysig.h
+++ b/rubysig.h
@@ -12,8 +12,80 @@
 
 #ifndef SIG_H
 #define SIG_H
+
 #include <errno.h>
 
+#if defined __ppc__ || defined __powerpc__ || \
+    defined __ppc64__ || defined __powerpc64__
+#define __anyPowerPC__ 1  /* for compatibility with older gcc versions */
+#endif
+
+/* STACK_WIPE_SITES determines where attempts are made to exorcise
+   "ghost object refereces" from the stack and how the stack is cleared:
+   
+   0x*001 -->  wipe stack just after every thread_switch
+   0x*002 -->  wipe stack just after every EXEC_TAG()
+   0x*004 -->  wipe stack in CHECK_INTS
+   0x*010 -->  wipe stack in while & until loops
+   0x*020 -->  wipe stack before yield() in iterators and outside eval.c
+   0x*040 -->  wipe stack on catch and thread save context
+   0x*100 -->  update stack extent on each object allocation
+   0x*200 -->  update stack extent on each object reallocation
+   0x*400 -->  update stack extent during GC marking passes
+   0x*800 -->  update stack extent on each throw (use with 0x040)
+   0x1000 -->  use inline assembly code for x86, PowerPC, or ARM CPUs
+
+   0x0*** -->  do not even call rb_wipe_stack()
+   0x2*** -->  call dummy rb_wipe_stack() (for debugging and profiling)
+   0x4*** -->  safe, portable stack clearing in memory allocated with alloca
+   0x6*** -->  use faster, but less safe stack clearing in unallocated stack
+   0x8*** -->  use faster, but less safe stack clearing (with inline code)
+   
+   for most effective gc use 0x*707
+   for fastest micro-benchmarking use 0x0000
+   0x*770 prevents almost all memory leaks caused by ghost references
+   without adding much overhead for stack clearing.
+   Other good trade offs are 0x*270, 0x*703, 0x*303 or even 0x*03
+   
+   In general, you may lessen the default -mpreferred-stack-boundary
+   only if using less safe stack clearing (0x6***).  Lessening the
+   stack alignment with portable stack clearing (0x4***) may fail to clear 
+   all ghost references off the stack.
+   
+   When using 0x6*** or 0x8***, the compiler could insert 
+   stack push(s) between reading the stack pointer and clearing 
+   the ghost references.  The register(s) pushed will be
+   cleared by the rb_gc_stack_wipe(), typically resulting in a segfault
+   or an interpreter hang.
+   
+   STACK_WIPE_SITES of 0x8770 works well compiled with gcc on most machines
+   using the recommended CFLAGS="-O2 -fno-stack-protector".  However...
+   If it hangs or crashes for you, try changing STACK_WIPE_SITES to 0x4770
+   and please report your details.  i.e. CFLAGS, compiler, version, CPU
+   
+   Note that it is redundant to wipe_stack in looping constructs if 
+   also doing so in CHECK_INTS.  It is also redundant to wipe_stack on
+   each thread_switch if wiping after every thread save context.
+*/
+#ifndef STACK_WIPE_SITES
+# ifdef __x86_64__     /* deal with "red zone" by not inlining stack clearing */
+#  define STACK_WIPE_SITES  0x6770
+# elif defined __anyPowerPC__   /* On any PowerPC, deal with... */
+#  define STACK_WIPE_SITES  0x7764   /* red zone & alloc(0) doesn't return sp */
+# else
+#  define STACK_WIPE_SITES  0x8770 /*normal case, use 0x4770 if problems arise*/
+# endif
+#endif
+
+#if (STACK_WIPE_SITES & 0x14) == 0x14
+#warning  wiping stack in CHECK_INTS makes wiping in loops redundant
+#endif
+#if (STACK_WIPE_SITES & 0x41) == 0x41
+#warning  wiping stack after thread save makes wiping on thread_switch redundant
+#endif
+
+#define STACK_WIPE_METHOD (STACK_WIPE_SITES>>13)
+
 #ifdef _WIN32
 typedef LONG rb_atomic_t;
 
@@ -79,9 +151,152 @@ void rb_trap_restore_mask _((void));
 
 RUBY_EXTERN int rb_thread_critical;
 void rb_thread_schedule _((void));
+
+RUBY_EXTERN VALUE *rb_gc_stack_end;
+RUBY_EXTERN int rb_gc_stack_grow_direction;  /* -1 for down or 1 for up */
+
+#if STACK_GROW_DIRECTION > 0
+
+/* clear stack space between end and sp (not including *sp) */
+#define __stack_zero(end,sp)  __stack_zero_up(end,sp)
+
+/* true if top has grown past limit, i.e. top deeper than limit */
+#define __stack_past(limit,top)  __stack_past_up(limit,top)
+
+/* depth of mid below stack top */
+#define __stack_depth(top,mid)   __stack_depth_up(top,mid)
+
+/* stack pointer top adjusted to include depth more items */
+#define __stack_grow(top,depth)  __stack_grow_up(top,depth)
+
+
+#elif STACK_GROW_DIRECTION < 0
+#define __stack_zero(end,sp)  __stack_zero_down(end,sp)
+#define __stack_past(limit,top)  __stack_past_down(limit,top)
+#define __stack_depth(top,mid)   __stack_depth_down(top,mid)
+#define __stack_grow(top,depth)  __stack_grow_down(top,depth)
+
+#else  /* limp along if stack direction can't be determined at compile time */
+#define __stack_zero(end,sp) if (rb_gc_stack_grow_direction<0) \
+        __stack_zero_down(end,sp); else __stack_zero_up(end,sp);
+#define __stack_past(limit,top)  (rb_gc_stack_grow_direction<0 ? \
+                      __stack_past_down(limit,top) : __stack_past_up(limit,top))
+#define __stack_depth(top,mid) (rb_gc_stack_grow_direction<0 ? \
+                       __stack_depth_down(top,mid) : __stack_depth_up(top,mid))
+#define __stack_grow(top,depth) (rb_gc_stack_grow_direction<0 ? \
+                      __stack_grow_down(top,depth) : __stack_grow_up(top,depth))
+#endif
+ 
+#define __stack_zero_up(end,sp)  while (end >= ++sp) *sp=0
+#define __stack_past_up(limit,top)  ((limit) < (top))
+#define __stack_depth_up(top,mid) ((top) - (mid))
+#define __stack_grow_up(top,depth) ((top)+(depth))
+
+#define __stack_zero_down(end,sp)  while (end <= --sp) *sp=0
+#define __stack_past_down(limit,top)  ((limit) > (top))
+#define __stack_depth_down(top,mid) ((mid) - (top))
+#define __stack_grow_down(top,depth) ((top)-(depth))
+
+/* Make alloca work the best possible way.  */
+#ifdef __GNUC__
+# ifndef atarist
+#  ifndef alloca
+#   define alloca __builtin_alloca
+#  endif
+# endif /* atarist */
+
+# define nativeAllocA __builtin_alloca
+
+/* use assembly to get stack pointer quickly */
+# if STACK_WIPE_SITES & 0x1000
+#  define __defspfn(asmb)  \
+static inline VALUE *__sp(void) __attribute__((always_inline)); \
+static inline VALUE *__sp(void) \
+{ \
+  VALUE *sp; asm(asmb); \
+  return sp; \
+}
+#  ifdef __anyPowerPC__
+__defspfn("addi %0, r1, 0": "=r"(sp))
+#  elif defined  __i386__
+__defspfn("movl %%esp, %0": "=r"(sp))
+#  elif defined __x86_64__
+#warn ===> x86_64 inline assembler is known to crash -- change STACK_WIPE_SITES
+__defspfn("movq %%rsp, %0": "=r"(sp))
+#  elif __arm__
+__defspfn("mov %0, sp": "=r"(sp))
+#  else
+#   define __sp()  ((VALUE *)__builtin_alloca(0))
+#   warning No assembly version of __sp() defined for this CPU.
+#  endif
+# else
+#  define __sp()  ((VALUE *)__builtin_alloca(0))
+# endif
+
+#else  // not GNUC
+
+# ifdef HAVE_ALLOCA_H
+#  include <alloca.h>
+# else
+#  ifndef _AIX
+#   ifndef alloca /* predefined by HP cc +Olibcalls */
+void *alloca ();
+#   endif
+#  endif /* AIX */
+# endif /* HAVE_ALLOCA_H */
+
+# if STACK_WIPE_SITES & 0x1000
+#  warning No assembly versions of __sp() defined for this compiler.
+# endif
+# if HAVE_ALLOCA
+#  define __sp()  ((VALUE *)alloca(0))
+#  define nativeAllocA alloca
+# else
+RUBY_EXTERN VALUE *__sp(void);
+#  if STACK_WIPE_SITES
+#   define STACK_WIPE_SITES 0
+#   warning Disabled Stack Wiping because there is no native alloca()
+#  endif
+# endif
+#endif /* __GNUC__ */
+
+
+/*
+  Zero memory that was (recently) part of the stack, but is no longer.
+  Invoke when stack is deep to mark its extent and when it's shallow to wipe it.
+*/
+#if STACK_WIPE_METHOD == 0
+#define rb_gc_wipe_stack() ((void)0)
+#elif STACK_WIPE_METHOD == 4
+#define rb_gc_wipe_stack() {     \
+  VALUE *end = rb_gc_stack_end;  \
+  VALUE *sp = __sp();            \
+  rb_gc_stack_end = sp;          \
+  __stack_zero(end, sp);   \
+}
+#else
+RUBY_EXTERN void rb_gc_wipe_stack(void);
+#endif
+
+/*
+  Update our record of maximum stack extent without zeroing unused stack
+*/
+#define rb_gc_update_stack_extent() do { \
+    VALUE *sp = __sp(); \
+    if __stack_past(rb_gc_stack_end, sp) rb_gc_stack_end = sp; \
+} while(0)
+
+
+#if STACK_WIPE_SITES & 4
+# define CHECK_INTS_wipe_stack()  rb_gc_wipe_stack()
+#else
+# define CHECK_INTS_wipe_stack()  (void)0
+#endif
+
 #if defined(HAVE_SETITIMER) || defined(_THREAD_SAFE)
 RUBY_EXTERN int rb_thread_pending;
 # define CHECK_INTS do {\
+    CHECK_INTS_wipe_stack(); \
     if (!(rb_prohibit_interrupt || rb_thread_critical)) {\
         if (rb_thread_pending) rb_thread_schedule();\
 	if (rb_trap_pending) rb_trap_exec();\
@@ -92,13 +307,14 @@ RUBY_EXTERN int rb_thread_pending;
 RUBY_EXTERN int rb_thread_tick;
 #define THREAD_TICK 500
 #define CHECK_INTS do {\
+    CHECK_INTS_wipe_stack(); \
     if (!(rb_prohibit_interrupt || rb_thread_critical)) {\
 	if (rb_thread_tick-- <= 0) {\
 	    rb_thread_tick = THREAD_TICK;\
             rb_thread_schedule();\
 	}\
+        if (rb_trap_pending) rb_trap_exec();\
     }\
-    if (rb_trap_pending) rb_trap_exec();\
 } while (0)
 #endif
 
diff --git a/signal.c b/signal.c
index b6cad9d..bc9deae 100644
--- a/signal.c
+++ b/signal.c
@@ -389,6 +389,7 @@ rb_f_kill(argc, argv)
 		rb_sys_fail(0);
 	}
     }
+    CHECK_INTS;  /* in case we killed ourselves */
     return INT2FIX(i-1);
 }
 
diff --git a/test/ruby/suicide.rb b/test/ruby/suicide.rb
index 2687ed0..c7a0a67 100644
--- a/test/ruby/suicide.rb
+++ b/test/ruby/suicide.rb
@@ -1,2 +1,4 @@
 STDERR.reopen(STDOUT)
-at_exit{Process.kill(:INT, $$)}
+at_exit{Process.kill(:INT, $$); sleep 0}
+# brent@mbari.org says
+#  sleep 0 avoids race between process termination and signal reception
diff --git a/version.c b/version.c
index b235673..dbc65b0 100644
--- a/version.c
+++ b/version.c
@@ -14,23 +14,44 @@
 #include "version.h"
 #include <stdio.h>
 
+#define PRINT(type) puts(ruby_##type)
+#define MKSTR(type) rb_obj_freeze(rb_str_new(ruby_##type, sizeof(ruby_##type)-1))
+
 const char ruby_version[] = RUBY_VERSION;
 const char ruby_release_date[] = RUBY_RELEASE_DATE;
 const char ruby_platform[] = RUBY_PLATFORM;
 const int ruby_patchlevel = RUBY_PATCHLEVEL;
+const char *ruby_description;
+const char *ruby_copyright;
 
 void
 Init_version()
 {
-    VALUE v = rb_obj_freeze(rb_str_new2(ruby_version));
-    VALUE d = rb_obj_freeze(rb_str_new2(ruby_release_date));
-    VALUE p = rb_obj_freeze(rb_str_new2(ruby_platform));
+    static char description[128];
+    static char copyright[128];
+    VALUE v = MKSTR(version);
+    VALUE d = MKSTR(release_date);
+    VALUE p = MKSTR(platform);
+    VALUE tmp;
 
     rb_define_global_const("RUBY_VERSION", v);
     rb_define_global_const("RUBY_RELEASE_DATE", d);
     rb_define_global_const("RUBY_PLATFORM", p);
     rb_define_global_const("RUBY_PATCHLEVEL", INT2FIX(RUBY_PATCHLEVEL));
 
+    snprintf(description, sizeof(description), "ruby %s (%s %s %d) [%s]",
+             RUBY_VERSION, RUBY_RELEASE_DATE, RUBY_RELEASE_STR,
+             RUBY_RELEASE_NUM, RUBY_PLATFORM);
+    ruby_description = description;
+    tmp = rb_obj_freeze(rb_str_new2(description));
+    rb_define_global_const("RUBY_DESCRIPTION", tmp);
+
+    snprintf(copyright, sizeof(copyright), "ruby - Copyright (C) %d-%d %s",
+             RUBY_BIRTH_YEAR, RUBY_RELEASE_YEAR, RUBY_AUTHOR);
+    ruby_copyright = copyright;
+    tmp = rb_obj_freeze(rb_str_new2(copyright));
+    rb_define_global_const("RUBY_COPYRIGHT", tmp);
+
     /* obsolete constants */
     rb_define_global_const("VERSION", v);
     rb_define_global_const("RELEASE_DATE", d);
@@ -40,13 +61,13 @@ Init_version()
 void
 ruby_show_version()
 {
-    printf("ruby %s (%s patchlevel %d) [%s]\n", RUBY_VERSION, RUBY_RELEASE_DATE, RUBY_PATCHLEVEL, RUBY_PLATFORM);
+    PRINT(description);
     fflush(stdout);
 }
 
 void
 ruby_show_copyright()
 {
-    printf("ruby - Copyright (C) 1993-%d Yukihiro Matsumoto\n", RUBY_RELEASE_YEAR);
+    PRINT(copyright);
     exit(0);
 }
diff --git a/version.h b/version.h
index 88ddd67..fa36fa5 100644
--- a/version.h
+++ b/version.h
@@ -1,21 +1,43 @@
 #define RUBY_VERSION "1.8.6"
-#define RUBY_RELEASE_DATE "2008-08-11"
+#define RUBY_RELEASE_DATE "2009-3-1"
 #define RUBY_VERSION_CODE 186
-#define RUBY_RELEASE_CODE 20080811
+#define RUBY_RELEASE_CODE 20090301
 #define RUBY_PATCHLEVEL 287
 
 #define RUBY_VERSION_MAJOR 1
 #define RUBY_VERSION_MINOR 8
 #define RUBY_VERSION_TEENY 6
-#define RUBY_RELEASE_YEAR 2008
-#define RUBY_RELEASE_MONTH 8
-#define RUBY_RELEASE_DAY 11
+#define RUBY_RELEASE_YEAR 2009
+#define RUBY_RELEASE_MONTH 3
+#define RUBY_RELEASE_DAY 1
 
 #ifdef RUBY_EXTERN
 RUBY_EXTERN const char ruby_version[];
 RUBY_EXTERN const char ruby_release_date[];
 RUBY_EXTERN const char ruby_platform[];
 RUBY_EXTERN const int ruby_patchlevel;
+RUBY_EXTERN const char *ruby_description;
+RUBY_EXTERN const char *ruby_copyright;
 #endif
 
+#define RUBY_AUTHOR "Yukihiro Matsumoto"
+#define RUBY_BIRTH_YEAR 1993
+#define RUBY_BIRTH_MONTH 2
+#define RUBY_BIRTH_DAY 24
+
+#include "rubysig.h"
+
+#define string_arg(s) #s
+
+#ifdef MBARI_API
+#define _mbari_rev_ "MBARI"
+#else
+#define _mbari_rev_ "mbari"
+#endif
+
+#define MBARI_RELEASE(wipe_sites) _mbari_rev_ " 8B/" string_arg(wipe_sites)
+
+#define RUBY_RELEASE_STR MBARI_RELEASE(STACK_WIPE_SITES) " on patchlevel"
+#define RUBY_RELEASE_NUM RUBY_PATCHLEVEL
+
 
--- ruby-1.8.6-p287/configure	2008-08-10 17:38:35.000000000 -0700
+++ ruby-1.8.6-mbari/configure	2009-02-26 22:43:03.000000000 -0800
@@ -1352,6 +1352,7 @@
                           is disabled or omitted entirely, then the package
                           will be built only for the target platform
   --enable-frame-address  use GCC __builtin_frame_address().
+  --enable-mbari-api      enable API changes from the MBARI patches.
   --disable-largefile     omit support for large files
   --enable-pthread        use pthread library.
   --disable-fastthread    do not use the fastthread mutex
@@ -1364,6 +1365,7 @@
   --with-PACKAGE[=ARG]    use PACKAGE [ARG=yes]
   --without-PACKAGE       do not use PACKAGE (same as --with-PACKAGE=no)
   --without-gcc           never use gcc
+  --with-wipe-sites=MASK  override default STACK_WIPES_SITES mask in rubysig.h
   --with-winsock2         link winsock2 (MinGW only)
   --with-libc_r           link libc_r if possible (FreeBSD only)
   --with-default-kcode=CODE specify default value for \$KCODE (utf8|euc|sjis|none)
@@ -2080,6 +2082,35 @@
 _ACEOF
 
 fi
+# Check whether --enable-mbari-api was given.
+if test "${enable_mbari_api+set}" = set; then
+  enableval=$enable_mbari_api; mbari_api=$enableval
+fi
+
+if test "$mbari_api" = yes; then
+    cat >>confdefs.h <<\_ACEOF
+#define MBARI_API 1
+_ACEOF
+
+fi
+
+# Check whether --with-wipe-sites was given.
+if test "${with_wipe_sites+set}" = set; then
+  withval=$with_wipe_sites; wipe_sites=$withval
+fi
+
+if test "$wipe_sites" != ""; then
+  case $wipe_sites in
+       none|no)  wipe_sites=0x0;;
+       yes) wipe_sites=;;
+  esac
+  if test -n "$wipe_sites"; then
+    cat >>confdefs.h <<_ACEOF
+#define STACK_WIPE_SITES $wipe_sites
+_ACEOF
+
+  fi
+fi
 
 test "$program_prefix" != NONE &&
   program_transform_name="s&^&$program_prefix&;$program_transform_name"
src/rvm/patches/ruby/1.8.6/syck.patch000066400000001147147511530530013224 0ustar00diff --git a/ext/syck/rubyext.c b/ext/syck/rubyext.c
index 078de4f..8c4027f 100644
--- a/ext/syck/rubyext.c
+++ b/ext/syck/rubyext.c
@@ -268,9 +268,13 @@ rb_syck_mktime(str, len)
     {
         char padded[] = "000000";
         char *end = ptr + 1;
+        char *p = end;
         while ( isdigit( *end ) ) end++;
-        MEMCPY(padded, ptr + 1, char, end - (ptr + 1));
-        usec = strtol(padded, NULL, 10);
+        if (end - p < sizeof(padded)) {
+            MEMCPY(padded, ptr + 1, char, end - (ptr + 1));
+            p = padded;
+        }
+        usec = strtol(p, NULL, 10);
     }
     else
     {
src/rvm/patches/ruby/1.8.6/osx-arch-fix.patch000066400000000617147511530530014564 0ustar00diff --git a/Makefile.in b/Makefile.in
index 656ae90..f976cf1 100644
--- a/Makefile.in
+++ b/Makefile.in
@@ -45,7 +45,7 @@ XLDFLAGS = @XLDFLAGS@ $(EXTLDFLAGS)
 EXTLIBS = 
 LIBS = @LIBS@ $(EXTLIBS)
 MISSING = @LIBOBJS@ @ALLOCA@
-LDSHARED = @LIBRUBY_LDSHARED@
+LDSHARED = @LIBRUBY_LDSHARED@ $(LDFLAGS)
 DLDFLAGS = @LIBRUBY_DLDFLAGS@ $(EXTLDFLAGS) @ARCH_FLAG@
 SOLIBS = @SOLIBS@
 MAINLIBS = @MAINLIBS@
src/rvm/patches/ruby/1.8.6/ruby186gc.patch000066400000041716147511530530014013 0ustar00--- a/gc.c	(revision 31212)
+++ b/gc.c	(working copy)
@@ -22,8 +22,16 @@
 #include <setjmp.h>
 #include <sys/types.h>
 
+#ifdef _WIN32
+#include <string.h>
+#else
+#include <strings.h>
+#endif
+
 #ifdef HAVE_SYS_TIME_H
 #include <sys/time.h>
+#elif defined(_WIN32)
+#include <time.h> 
 #endif
 
 #ifdef HAVE_SYS_RESOURCE_H
@@ -40,7 +48,6 @@
 #if !defined(setjmp) && defined(HAVE__SETJMP)
 #define setjmp(env) _setjmp(env)
 #endif
-
 /* Make alloca work the best possible way.  */
 #ifdef __GNUC__
 # ifndef atarist
@@ -76,6 +83,20 @@
 
 NORETURN(void rb_exc_jump _((VALUE)));
 
+static unsigned long live_objects = 0;
+unsigned long rb_os_live_objects()
+{ return live_objects; }
+
+#if defined(HAVE_LONG_LONG)
+static unsigned long long allocated_objects = 0;
+unsigned long long rb_os_allocated_objects()
+{ return allocated_objects; }
+#else
+static unsigned long allocated_objects = 0;
+unsigned long rb_os_allocated_objects()
+{ return allocated_objects; }
+#endif
+
 void
 rb_memerror()
 {
@@ -93,6 +114,10 @@
     rb_exc_raise(nomem_error);
 }
 
+long gc_allocated_size = 0;
+long gc_num_allocations = 0;
+static int gc_statistics = 0;
+
 void *
 ruby_xmalloc(size)
     long size;
@@ -167,6 +192,8 @@
 
 extern int ruby_in_compile;
 static int dont_gc;
+static GC_TIME_TYPE gc_time = 0;
+static int gc_collections = 0;
 static int during_gc;
 static int need_call_final = 0;
 static st_table *finalizer_table = 0;
@@ -201,8 +228,7 @@
  *  Disables garbage collection, returning <code>true</code> if garbage
  *  collection was already disabled.
  *
- *     GC.disable   #=> false
- *     GC.disable   #=> true
+ *     GC.disable   #=> false or true
  *
  */
 
@@ -215,6 +241,139 @@
     return old;
 }
 
+/*
+ *  call-seq:
+ *     GC.enable_stats    => true or false
+ *
+ *  Enables garbage collection statistics, returning <code>true</code> if garbage
+ *  collection statistics was already enabled.
+ *
+ *     GC.enable_stats   #=> false or true
+ *     GC.enable_stats   #=> true
+ *
+ */
+
+VALUE
+rb_gc_enable_stats()
+{
+    int old = gc_statistics;
+    gc_statistics = Qtrue;
+    return old;
+}
+
+/*
+ *  call-seq:
+ *     GC.disable_stats    => true or false
+ *
+ *  Disables garbage collection statistics, returning <code>true</code> if garbage
+ *  collection statistics was already disabled.
+ *
+ *     GC.disable_stats   #=> false or true
+ *     GC.disable_stats   #=> true
+ *
+ */
+
+VALUE
+rb_gc_disable_stats()
+{
+    int old = gc_statistics;
+    gc_statistics = Qfalse;
+    gc_allocated_size = 0;
+    gc_num_allocations = 0;
+    return old;
+}
+
+/*
+ *  call-seq:
+ *     GC.clear_stats    => nil
+ *
+ *  Clears garbage collection statistics, returning nil. This resets the number
+ *  of collections (GC.collections) and the time used (GC.time) to 0.
+ *
+ *     GC.clear_stats    #=> nil
+ *
+ */
+
+VALUE
+rb_gc_clear_stats()
+{
+    gc_collections = 0;
+    gc_time = 0;
+    gc_allocated_size = 0;
+    gc_num_allocations = 0;
+    return Qnil; 
+}
+
+/*
+ *  call-seq:
+ *     GC.allocated_size    => Integer
+ *
+ *  Returns the size of memory (in bytes) allocated since GC statistics collection
+ *  was enabled.
+ *
+ *     GC.allocated_size    #=> 35
+ *
+ */
+VALUE
+rb_gc_allocated_size()
+{
+    return INT2NUM(gc_allocated_size);
+}
+
+/*
+ *  call-seq:
+ *     GC.num_allocations    => Integer
+ *
+ *  Returns the number of memory allocations since GC statistics collection
+ *  was enabled.
+ *
+ *     GC.num_allocations    #=> 150
+ *
+ */
+VALUE
+rb_gc_num_allocations()
+{
+    return INT2NUM(gc_num_allocations);
+}
+
+/*
+ *  call-seq:
+ *     GC.collections    => Integer
+ *
+ *  Returns the number of garbage collections performed while GC statistics collection
+ *  was enabled.
+ *
+ *     GC.collections    #=> 35
+ *
+ */
+
+VALUE
+rb_gc_collections()
+{
+    return INT2NUM(gc_collections);
+}
+
+/*
+ *  call-seq:
+ *     GC.time    => Integer
+ *
+ *  Returns the time spent during garbage collection while GC statistics collection
+ *  was enabled (in micro seconds).
+ *
+ *     GC.time    #=> 20000
+ *
+ */
+
+VALUE
+rb_gc_time()
+{
+#if HAVE_LONG_LONG
+    return LL2NUM(gc_time);
+#else
+    return LONG2NUM(gc_time);
+#endif
+}
+
 VALUE rb_mGC;
 
 static struct gc_list {
@@ -306,7 +465,7 @@
 static RVALUE *freelist = 0;
 static RVALUE *deferred_final_list = 0;
 
-#define HEAPS_INCREMENT 10
+static int heaps_increment = 10;
 static struct heaps_slot {
     void *membase;
     RVALUE *slot;
@@ -315,13 +474,164 @@
 static int heaps_length = 0;
 static int heaps_used   = 0;
 
-#define HEAP_MIN_SLOTS 10000
-static int heap_slots = HEAP_MIN_SLOTS;
+static int heap_min_slots = 10000;
+static int heap_slots = 10000;
 
-#define FREE_MIN  4096
+static int heap_free_min = 4096;
+static int heap_slots_increment = 10000;
+static double heap_slots_growth_factor = 1.8;
 
+static long initial_malloc_limit = GC_MALLOC_LIMIT;
+
+static int verbose_gc_stats = Qfalse;
+
+static FILE* gc_data_file = NULL;
+
 static RVALUE *himem, *lomem;
 
+static void set_gc_parameters()
+{
+    char *gc_stats_ptr, *min_slots_ptr, *free_min_ptr, *heap_slots_incr_ptr,
+      *heap_incr_ptr, *malloc_limit_ptr, *gc_heap_file_ptr, *heap_slots_growth_factor_ptr;
+
+    gc_data_file = stderr;
+
+    gc_stats_ptr = getenv("RUBY_GC_STATS");
+    if (gc_stats_ptr != NULL) {
+	int gc_stats_i = atoi(gc_stats_ptr);
+	if (gc_stats_i > 0) {
+	    verbose_gc_stats = Qtrue;
+	}
+    }
+
+    gc_heap_file_ptr = getenv("RUBY_GC_DATA_FILE");
+    if (gc_heap_file_ptr != NULL) {
+	FILE* data_file = fopen(gc_heap_file_ptr, "w");
+	if (data_file != NULL) {
+	    gc_data_file = data_file;
+	}
+	else {
+	    fprintf(stderr,
+		    "can't open gc log file %s for writing, using default\n", gc_heap_file_ptr);
+	}
+    }
+
+    min_slots_ptr = getenv("RUBY_HEAP_MIN_SLOTS");
+    if (min_slots_ptr != NULL) {
+	int min_slots_i = atoi(min_slots_ptr);
+        if (verbose_gc_stats) {
+	    fprintf(gc_data_file, "RUBY_HEAP_MIN_SLOTS=%s\n", min_slots_ptr);
+        }
+	if (min_slots_i > 0) {
+	    heap_slots = min_slots_i;
+	    heap_min_slots = min_slots_i;
+	}
+    }
+
+    free_min_ptr = getenv("RUBY_HEAP_FREE_MIN");
+    if (free_min_ptr != NULL) {
+	int free_min_i = atoi(free_min_ptr);
+        if (verbose_gc_stats) {
+	    fprintf(gc_data_file, "RUBY_HEAP_FREE_MIN=%s\n", free_min_ptr);
+	}
+	if (free_min_i > 0) {
+	    heap_free_min = free_min_i;
+	}
+    }
+
+    heap_incr_ptr = getenv("RUBY_HEAP_INCREMENT");
+    if (heap_incr_ptr != NULL) {
+	int heap_incr_i = atoi(heap_incr_ptr);
+        if (verbose_gc_stats) {
+	    fprintf(gc_data_file, "RUBY_HEAP_INCREMENT=%s\n", heap_incr_ptr);
+	}
+	if (heap_incr_i > 0) {
+	    heaps_increment = heap_incr_i;
+	}
+    }
+
+    heap_slots_incr_ptr = getenv("RUBY_HEAP_SLOTS_INCREMENT");
+    if (heap_slots_incr_ptr != NULL) {
+	int heap_slots_incr_i = atoi(heap_slots_incr_ptr);
+        if (verbose_gc_stats) {
+	    fprintf(gc_data_file, "RUBY_HEAP_SLOTS_INCREMENT=%s\n", heap_slots_incr_ptr);
+	}
+	if (heap_slots_incr_i > 0) {
+	    heap_slots_increment = heap_slots_incr_i;
+	}
+    }
+
+    heap_slots_growth_factor_ptr = getenv("RUBY_HEAP_SLOTS_GROWTH_FACTOR");
+    if (heap_slots_growth_factor_ptr != NULL) {
+	double heap_slots_growth_factor_d = atoi(heap_slots_growth_factor_ptr);
+        if (verbose_gc_stats) {
+	    fprintf(gc_data_file, "RUBY_HEAP_SLOTS_GROWTH_FACTOR=%s\n", heap_slots_growth_factor_ptr);
+	}
+	if (heap_slots_growth_factor_d > 0) {
+	    heap_slots_growth_factor = heap_slots_growth_factor_d;
+	}
+    }
+
+    malloc_limit_ptr = getenv("RUBY_GC_MALLOC_LIMIT");
+    if (malloc_limit_ptr != NULL) {
+	int malloc_limit_i = atol(malloc_limit_ptr);
+        if (verbose_gc_stats) {
+	    fprintf(gc_data_file, "RUBY_GC_MALLOC_LIMIT=%s\n", malloc_limit_ptr);
+	}
+	if (malloc_limit_i > 0) {
+	    initial_malloc_limit = malloc_limit_i;
+	}
+    }
+}
+
+/*
+ *  call-seq:
+ *     GC.dump    => nil
+ *
+ *  dumps information about the current GC data structures to the GC log file
+ *
+ *     GC.dump    #=> nil
+ *
+ */
+
+VALUE
+rb_gc_dump()
+{
+    int i;
+
+    for (i = 0; i < heaps_used; i++) {
+	int heap_size = heaps[i].limit;
+	fprintf(gc_data_file, "HEAP[%2d]: size=%7d\n", i, heap_size);
+    }
+
+    return Qnil;
+}
+
+/*
+ *  call-seq:
+ *     GC.log String  => String
+ *
+ *  Logs string to the GC data file and returns it.
+ *
+ *     GC.log "manual GC call"    #=> "manual GC call"
+ *
+ */
+
+VALUE
+rb_gc_log(self, original_str)
+     VALUE self, original_str;
+{
+    if (original_str == Qnil) {
+        fprintf(gc_data_file, "\n");
+    }
+    else {
+        VALUE str = StringValue(original_str);
+        char *p = RSTRING(str)->ptr;
+        fprintf(gc_data_file, "%s\n", p);
+    }
+    return original_str;
+}
+
 static void
 add_heap()
 {
@@ -332,7 +642,7 @@
 	struct heaps_slot *p;
 	int length;
 
-	heaps_length += HEAPS_INCREMENT;
+	heaps_length += heaps_increment;
 	length = heaps_length*sizeof(struct heaps_slot);
 	RUBY_CRITICAL(
 	    if (heaps_used > 0) {
@@ -344,14 +654,18 @@
 	    });
 	if (p == 0) rb_memerror();
     }
+    if (gc_statistics) {
+        gc_allocated_size += size;
+	gc_num_allocations += 1;
+    }
 
     for (;;) {
 	RUBY_CRITICAL(p = (RVALUE*)malloc(sizeof(RVALUE)*(heap_slots+1)));
 	if (p == 0) {
-	    if (heap_slots == HEAP_MIN_SLOTS) {
+	    if (heap_slots == heap_min_slots) {
 		rb_memerror();
 	    }
-	    heap_slots = HEAP_MIN_SLOTS;
+	    heap_slots = heap_min_slots;
 	    continue;
 	}
         heaps[heaps_used].membase = p;
@@ -367,10 +681,17 @@
     if (lomem == 0 || lomem > p) lomem = p;
     if (himem < pend) himem = pend;
     heaps_used++;
-    heap_slots *= 1.8;
-    if (heap_slots <= 0) heap_slots = HEAP_MIN_SLOTS;
+    heap_slots += heap_slots_increment;
+    heap_slots_increment *= heap_slots_growth_factor;
+    if (heap_slots <= 0) heap_slots = heap_min_slots;
 
     while (p < pend) {
+    if (do_gc_stats) {
+	int obt = p->as.basic.flags & T_MASK;
+	if (obt) {
+	    free_counts[obt]++;
+	}
+    }
 	p->as.free.flags = 0;
 	p->as.free.next = freelist;
 	freelist = p;
@@ -402,6 +723,8 @@
     RANY(obj)->file = ruby_sourcefile;
     RANY(obj)->line = ruby_sourceline;
 #endif
+    live_objects++;
+    allocated_objects++;
     return obj;
 }
 
@@ -1062,6 +1385,39 @@
     }
 }
 
+static char* obj_type(int tp)
+{
+    switch (tp) {
+	case T_NIL    : return "NIL";   
+	case T_OBJECT : return "OBJECT";
+	case T_CLASS  : return "CLASS";
+	case T_ICLASS : return "ICLASS";
+	case T_MODULE : return "MODULE";
+	case T_FLOAT  : return "FLOAT";
+	case T_STRING : return "STRING";
+	case T_REGEXP : return "REGEXP";
+	case T_ARRAY  : return "ARRAY";
+	case T_FIXNUM : return "FIXNUM";
+	case T_HASH   : return "HASH";
+	case T_STRUCT : return "STRUCT";
+	case T_BIGNUM : return "BIGNUM";
+	case T_FILE   : return "FILE";
+	    
+	case T_TRUE   : return "TRUE";
+	case T_FALSE  : return "FALSE";
+	case T_DATA   : return "DATA";
+	case T_MATCH  : return "MATCH";
+	case T_SYMBOL : return "SYMBOL";
+	    
+	case T_BLKTAG : return "BLKTAG";
+	case T_UNDEF  : return "UNDEF";
+	case T_VARMAP : return "VARMAP";
+	case T_SCOPE  : return "SCOPE";
+	case T_NODE   : return "NODE";
+	default: return "____";
+    }
+}
+
 static void
 free_unused_heaps()
 {
@@ -1093,14 +1449,24 @@
     int i;
     unsigned long live = 0;
     unsigned long free_min = 0;
+    live_objects = 0;
 
+    unsigned long really_freed = 0;
+    int free_counts[256];
+    int live_counts[256];
+    int do_gc_stats = gc_statistics & verbose_gc_stats;
+
     for (i = 0; i < heaps_used; i++) {
         free_min += heaps[i].limit;
     }
     free_min = free_min * 0.2;
-    if (free_min < FREE_MIN)
-        free_min = FREE_MIN;
+    if (free_min < heap_free_min)
+        free_min = heap_free_min;
 
+    if (do_gc_stats) {
+	for (i = 0 ; i< 256; i++) { free_counts[i] = live_counts[i] = 0; }
+    }
+
     if (ruby_in_compile && ruby_parser_stack_on_heap()) {
 	/* should not reclaim nodes during compilation
            if yacc's semantic stack is not allocated on machine stack */
@@ -1138,6 +1504,9 @@
 			p->as.free.flags = T_DEFERRED;
 			RDATA(p)->dfree = 0;
 		    }
+		    if (do_gc_stats) {
+            really_freed++;
+		    }
 		    p->as.free.flags |= FL_MARK;
 		    p->as.free.next = final_list;
 		    final_list = p;
@@ -1153,7 +1522,10 @@
 	    }
 	    else {
 		RBASIC(p)->flags &= ~FL_MARK;
-		live++;
+		live_objects++;
+		if (do_gc_stats) {
+ 		    live_counts[RANY((VALUE)p)->as.basic.flags & T_MASK]++;
+ 		}
 	    }
 	    p++;
 	}
@@ -1171,8 +1543,8 @@
 	}
     }
     if (malloc_increase > malloc_limit) {
-	malloc_limit += (malloc_increase - malloc_limit) * (double)live / (live + freed);
-	if (malloc_limit < GC_MALLOC_LIMIT) malloc_limit = GC_MALLOC_LIMIT;
+	malloc_limit += (malloc_increase - malloc_limit) * (double)live_objects / (live_objects + freed);
+	if (malloc_limit < initial_malloc_limit) malloc_limit = initial_malloc_limit;
     }
     malloc_increase = 0;
     if (freed < free_min) {
@@ -1180,6 +1552,20 @@
     }
     during_gc = 0;
 
+    if (do_gc_stats) {
+	fprintf(gc_data_file, "objects processed: %.7d\n", live+freed);
+	fprintf(gc_data_file, "live objects	: %.7d\n", live);
+	fprintf(gc_data_file, "freelist objects : %.7d\n", freed - really_freed);
+	fprintf(gc_data_file, "freed objects	: %.7d\n", really_freed);
+	for(i=0; i<256; i++) {
+	    if (free_counts[i]>0) {
+		fprintf(gc_data_file,
+			"kept %.7d / freed %.7d objects of type %s\n",
+			live_counts[i], free_counts[i], obj_type(i));
+	    }
+	}
+    }
+
     /* clear finalization list */
     if (final_list) {
 	deferred_final_list = final_list;
@@ -1394,6 +1780,7 @@
     struct gc_list *list;
     struct FRAME * volatile frame; /* gcc 2.7.2.3 -O2 bug??  */
     jmp_buf save_regs_gc_mark;
+    struct timeval gctv1, gctv2;
     SET_STACK_END;
 
 #ifdef HAVE_NATIVETHREAD
@@ -1410,6 +1797,14 @@
     if (during_gc) return;
     during_gc++;
 
+    if (gc_statistics) {
+        gc_collections++;
+	gettimeofday(&gctv1, NULL);
+        if (verbose_gc_stats) {
+	    fprintf(gc_data_file, "Garbage collection started\n");
+	}
+    }
+
     init_mark_stack();
 
     gc_mark((VALUE)ruby_current_node, 0);
@@ -1485,6 +1880,17 @@
     } while (!MARK_STACK_EMPTY);
 
     gc_sweep();
+
+    if (gc_statistics) {
+        GC_TIME_TYPE musecs_used;
+	gettimeofday(&gctv2, NULL);
+	musecs_used = ((GC_TIME_TYPE)(gctv2.tv_sec - gctv1.tv_sec) * 1000000) + (gctv2.tv_usec - gctv1.tv_usec);
+	gc_time += musecs_used;
+
+	if (verbose_gc_stats) {
+	    fprintf(gc_data_file, "GC time: %d msec\n", musecs_used / 1000);
+	}
+    }
 }
 
 void
@@ -1666,6 +2072,7 @@
     if (!rb_gc_stack_start) {
 	Init_stack(0);
     }
+    set_gc_parameters();
     add_heap();
 }
 
@@ -2109,6 +2516,35 @@
     return (VALUE)((long)obj|FIXNUM_FLAG);
 }
 
+/* call-seq:
+ *  ObjectSpace.live_objects => number
+ *
+ * Returns the count of objects currently allocated in the system. This goes
+ * down after the garbage collector runs.
+ */
+static
+VALUE os_live_objects(VALUE self)
+{ return ULONG2NUM(live_objects); }
+
+/* call-seq:
+ *  ObjectSpace.allocated_objects => number
+ *
+ * Returns the count of objects allocated since the Ruby interpreter has
+ * started.  This number can only increase. To know how many objects are
+ * currently allocated, use ObjectSpace::live_objects
+ */
+static
+VALUE os_allocated_objects(VALUE self)
+{ 
+#if defined(HAVE_LONG_LONG)
+    return ULL2NUM(allocated_objects); 
+#else
+    return ULONG2NUM(allocated_objects); 
+#endif
+}
+
+
+
 /*
  *  The <code>GC</code> module provides an interface to Ruby's mark and
  *  sweep garbage collection mechanism. Some of the underlying methods
@@ -2126,6 +2562,16 @@
     rb_define_singleton_method(rb_mGC, "disable", rb_gc_disable, 0);
     rb_define_method(rb_mGC, "garbage_collect", rb_gc_start, 0);
 
+    rb_define_singleton_method(rb_mGC, "enable_stats", rb_gc_enable_stats, 0);
+    rb_define_singleton_method(rb_mGC, "disable_stats", rb_gc_disable_stats, 0);
+    rb_define_singleton_method(rb_mGC, "clear_stats", rb_gc_clear_stats, 0);
+    rb_define_singleton_method(rb_mGC, "allocated_size", rb_gc_allocated_size, 0);
+    rb_define_singleton_method(rb_mGC, "num_allocations", rb_gc_num_allocations, 0);
+    rb_define_singleton_method(rb_mGC, "collections", rb_gc_collections, 0);
+    rb_define_singleton_method(rb_mGC, "time", rb_gc_time, 0);
+    rb_define_singleton_method(rb_mGC, "dump", rb_gc_dump, 0);
+    rb_define_singleton_method(rb_mGC, "log", rb_gc_log, 1);
+
     rb_mObSpace = rb_define_module("ObjectSpace");
     rb_define_module_function(rb_mObSpace, "each_object", os_each_obj, -1);
     rb_define_module_function(rb_mObSpace, "garbage_collect", rb_gc_start, 0);
@@ -2133,6 +2579,8 @@
     rb_define_module_function(rb_mObSpace, "remove_finalizer", rm_final, 1);
     rb_define_module_function(rb_mObSpace, "finalizers", finals, 0);
     rb_define_module_function(rb_mObSpace, "call_finalizer", call_final, 1);
+    rb_define_module_function(rb_mObSpace, "live_objects", os_live_objects, 0);
+    rb_define_module_function(rb_mObSpace, "allocated_objects", os_allocated_objects, 0);
 
     rb_define_module_function(rb_mObSpace, "define_finalizer", define_final, -1);
     rb_define_module_function(rb_mObSpace, "undefine_finalizer", undefine_final, 1);
src/rvm/patches/ruby/1.8.6/stdout-rouge-fix.patch000066400000001273147511530530015500 0ustar00--- a/lib/mkmf.rb	2009-06-10 09:09:22.000000000 +0200
+++ b/lib/mkmf.rb	2011-11-12 02:53:05.862766935 +0100
@@ -168,19 +168,25 @@
 module Logging
   @log = nil
   @logfile = 'mkmf.log'
-  @orgerr = $stderr.dup
-  @orgout = $stdout.dup
   @postpone = 0
 
   def self::open
     @log ||= File::open(@logfile, 'w')
     @log.sync = true
+    orgerr = $stderr.dup
+    orgout = $stdout.dup
     $stderr.reopen(@log)
     $stdout.reopen(@log)
     yield
   ensure
-    $stderr.reopen(@orgerr)
-    $stdout.reopen(@orgout)
+    if orgerr
+      $stderr.reopen(orgerr)
+      orgerr.close
+    end
+    if orgout
+      $stdout.reopen(orgout)
+      orgout.close
+    end
   end
 
   def self::message(*s)
src/rvm/patches/ruby/1.8.6/fix-irb-completion.diff000066400000000673147511530530015576 0ustar00diff --git a/lib/irb/completion.rb b/lib/irb/completion.rb
index 000658e..609dca3 100644
--- a/lib/irb/completion.rb
+++ b/lib/irb/completion.rb
@@ -157,7 +157,7 @@ module IRB
 	    end
 	    next if name != "IRB::Context" and 
 	      /^(IRB|SLex|RubyLex|RubyToken)/ =~ name
-	    candidates.concat m.instance_methods(false)
+	    candidates.concat m.instance_methods(false).map { |m| m.to_s }
 	  }
 	  candidates.sort!
 	  candidates.uniq!
src/rvm/patches/ruby/1.8.6/railsbench.patch000066400000033423147511530530014367 0ustar00Index: gc.c
===================================================================
--- gc.c	(revision 12920)
+++ gc.c	(working copy)
@@ -22,8 +22,16 @@
 #include <setjmp.h>
 #include <sys/types.h>
 
+#ifdef _WIN32
+#include <string.h>
+#else
+#include <strings.h>
+#endif
+
 #ifdef HAVE_SYS_TIME_H
 #include <sys/time.h>
+#elif defined(_WIN32)
+#include <time.h> 
 #endif
 
 #ifdef HAVE_SYS_RESOURCE_H
@@ -40,7 +48,6 @@
 #if !defined(setjmp) && defined(HAVE__SETJMP)
 #define setjmp(env) _setjmp(env)
 #endif
-
 /* Make alloca work the best possible way.  */
 #ifdef __GNUC__
 # ifndef atarist
@@ -159,8 +166,17 @@
 	RUBY_CRITICAL(free(x));
 }
 
+#if HAVE_LONG_LONG
+#define GC_TIME_TYPE LONG_LONG
+#else
+#define GC_TIME_TYPE long
+#endif
+
 extern int ruby_in_compile;
 static int dont_gc;
+static int gc_statistics = 0;
+static GC_TIME_TYPE gc_time = 0;
+static int gc_collections = 0;
 static int during_gc;
 static int need_call_final = 0;
 static st_table *finalizer_table = 0;
@@ -195,7 +211,7 @@
  *  Disables garbage collection, returning <code>true</code> if garbage
  *  collection was already disabled.
  *
- *     GC.disable   #=> false
+ *     GC.disable   #=> false or true
  *     GC.disable   #=> true
  *
  */
@@ -209,6 +225,104 @@
     return old;
 }
 
+/*
+ *  call-seq:
+ *     GC.enable_stats    => true or false
+ *
+ *  Enables garbage collection statistics, returning <code>true</code> if garbage
+ *  collection statistics was already enabled.
+ *
+ *     GC.enable_stats   #=> false or true
+ *     GC.enable_stats   #=> true
+ *
+ */
+
+VALUE
+rb_gc_enable_stats()
+{
+    int old = gc_statistics;
+    gc_statistics = Qtrue;
+    return old;
+}
+
+/*
+ *  call-seq:
+ *     GC.disable_stats    => true or false
+ *
+ *  Disables garbage collection statistics, returning <code>true</code> if garbage
+ *  collection statistics was already disabled.
+ *
+ *     GC.disable_stats   #=> false or true
+ *     GC.disable_stats   #=> true
+ *
+ */
+
+VALUE
+rb_gc_disable_stats()
+{
+    int old = gc_statistics;
+    gc_statistics = Qfalse;
+    return old;
+}
+
+/*
+ *  call-seq:
+ *     GC.clear_stats    => nil
+ *
+ *  Clears garbage collection statistics, returning nil. This resets the number
+ *  of collections (GC.collections) and the time used (GC.time) to 0.
+ *
+ *     GC.clear_stats    #=> nil
+ *
+ */
+
+VALUE
+rb_gc_clear_stats()
+{
+    gc_collections = 0;
+    gc_time = 0;
+    return Qnil; 
+}
+
+/*
+ *  call-seq:
+ *     GC.collections    => Integer
+ *
+ *  Returns the number of garbage collections performed while GC statistics collection
+ *  was enabled.
+ *
+ *     GC.collections    #=> 35
+ *
+ */
+
+VALUE
+rb_gc_collections()
+{
+    return INT2NUM(gc_collections);
+}
+
+/*
+ *  call-seq:
+ *     GC.time    => Integer
+ *
+ *  Returns the time spent during garbage collection while GC statistics collection
+ *  was enabled (in micro seconds).
+ *
+ *     GC.time    #=> 20000
+ *
+ */
+
+VALUE
+rb_gc_time()
+{
+#if HAVE_LONG_LONG
+    return LL2NUM(gc_time);
+#else
+    return LONG2NUM(gc_time);
+#endif
+}
+
+
 VALUE rb_mGC;
 
 static struct gc_list {
@@ -300,7 +414,7 @@
 static RVALUE *freelist = 0;
 static RVALUE *deferred_final_list = 0;
 
-#define HEAPS_INCREMENT 10
+static int heaps_increment = 10;
 static struct heaps_slot {
     void *membase;
     RVALUE *slot;
@@ -309,13 +423,165 @@
 static int heaps_length = 0;
 static int heaps_used   = 0;
 
-#define HEAP_MIN_SLOTS 10000
-static int heap_slots = HEAP_MIN_SLOTS;
+static int heap_min_slots = 10000;
+static int heap_slots = 10000;
+
+static int heap_free_min = 4096;
+static int heap_slots_increment = 10000;
+static double heap_slots_growth_factor = 1.8;
+
+static long initial_malloc_limit = GC_MALLOC_LIMIT;
+
+static int verbose_gc_stats = Qfalse;
 
-#define FREE_MIN  4096
+static FILE* gc_data_file = NULL;
 
 static RVALUE *himem, *lomem;
 
+static void set_gc_parameters()
+{
+    char *gc_stats_ptr, *min_slots_ptr, *free_min_ptr, *heap_slots_incr_ptr,
+      *heap_incr_ptr, *malloc_limit_ptr, *gc_heap_file_ptr, *heap_slots_growth_factor_ptr;
+
+    gc_data_file = stderr;
+
+    gc_stats_ptr = getenv("RUBY_GC_STATS");
+    if (gc_stats_ptr != NULL) {
+	int gc_stats_i = atoi(gc_stats_ptr);
+	if (gc_stats_i > 0) {
+	    verbose_gc_stats = Qtrue;
+	}
+    }
+
+    gc_heap_file_ptr = getenv("RUBY_GC_DATA_FILE");
+    if (gc_heap_file_ptr != NULL) {
+	FILE* data_file = fopen(gc_heap_file_ptr, "w");
+	if (data_file != NULL) {
+	    gc_data_file = data_file;
+	}
+	else {
+	    fprintf(stderr,
+		    "can't open gc log file %s for writing, using default\n", gc_heap_file_ptr);
+	}
+    }
+
+    min_slots_ptr = getenv("RUBY_HEAP_MIN_SLOTS");
+    if (min_slots_ptr != NULL) {
+	int min_slots_i = atoi(min_slots_ptr);
+        if (verbose_gc_stats) {
+	    fprintf(gc_data_file, "RUBY_HEAP_MIN_SLOTS=%s\n", min_slots_ptr);
+        }
+	if (min_slots_i > 0) {
+	    heap_slots = min_slots_i;
+	    heap_min_slots = min_slots_i;
+	}
+    }
+
+    free_min_ptr = getenv("RUBY_HEAP_FREE_MIN");
+    if (free_min_ptr != NULL) {
+	int free_min_i = atoi(free_min_ptr);
+        if (verbose_gc_stats) {
+	    fprintf(gc_data_file, "RUBY_HEAP_FREE_MIN=%s\n", free_min_ptr);
+	}
+	if (free_min_i > 0) {
+	    heap_free_min = free_min_i;
+	}
+    }
+
+    heap_incr_ptr = getenv("RUBY_HEAP_INCREMENT");
+    if (heap_incr_ptr != NULL) {
+	int heap_incr_i = atoi(heap_incr_ptr);
+        if (verbose_gc_stats) {
+	    fprintf(gc_data_file, "RUBY_HEAP_INCREMENT=%s\n", heap_incr_ptr);
+	}
+	if (heap_incr_i > 0) {
+	    heaps_increment = heap_incr_i;
+	}
+    }
+
+    heap_slots_incr_ptr = getenv("RUBY_HEAP_SLOTS_INCREMENT");
+    if (heap_slots_incr_ptr != NULL) {
+	int heap_slots_incr_i = atoi(heap_slots_incr_ptr);
+        if (verbose_gc_stats) {
+	    fprintf(gc_data_file, "RUBY_HEAP_SLOTS_INCREMENT=%s\n", heap_slots_incr_ptr);
+	}
+	if (heap_slots_incr_i > 0) {
+	    heap_slots_increment = heap_slots_incr_i;
+	}
+    }
+
+    heap_slots_growth_factor_ptr = getenv("RUBY_HEAP_SLOTS_GROWTH_FACTOR");
+    if (heap_slots_growth_factor_ptr != NULL) {
+	double heap_slots_growth_factor_d = atoi(heap_slots_growth_factor_ptr);
+        if (verbose_gc_stats) {
+	    fprintf(gc_data_file, "RUBY_HEAP_SLOTS_GROWTH_FACTOR=%s\n", heap_slots_growth_factor_ptr);
+	}
+	if (heap_slots_growth_factor_d > 0) {
+	    heap_slots_growth_factor = heap_slots_growth_factor_d;
+	}
+    }
+
+    malloc_limit_ptr = getenv("RUBY_GC_MALLOC_LIMIT");
+    if (malloc_limit_ptr != NULL) {
+	int malloc_limit_i = atol(malloc_limit_ptr);
+        if (verbose_gc_stats) {
+	    fprintf(gc_data_file, "RUBY_GC_MALLOC_LIMIT=%s\n", malloc_limit_ptr);
+	}
+	if (malloc_limit_i > 0) {
+	    initial_malloc_limit = malloc_limit_i;
+	}
+    }
+}
+
+/*
+ *  call-seq:
+ *     GC.dump    => nil
+ *
+ *  dumps information about the current GC data structures to the GC log file
+ *
+ *     GC.dump    #=> nil
+ *
+ */
+
+VALUE
+rb_gc_dump()
+{
+    int i;
+
+    for (i = 0; i < heaps_used; i++) {
+	int heap_size = heaps[i].limit;
+	fprintf(gc_data_file, "HEAP[%2d]: size=%7d\n", i, heap_size);
+    }
+
+    return Qnil;
+}
+
+/*
+ *  call-seq:
+ *     GC.log String  => String
+ *
+ *  Logs string to the GC data file and returns it.
+ *
+ *     GC.log "manual GC call"    #=> "manual GC call"
+ *
+ */
+
+VALUE
+rb_gc_log(self, original_str)
+     VALUE self, original_str;
+{
+    if (original_str == Qnil) {
+        fprintf(gc_data_file, "\n");
+    }
+    else {
+        VALUE str = StringValue(original_str);
+        char *p = RSTRING(str)->ptr;
+        fprintf(gc_data_file, "%s\n", p);
+    }
+    return original_str;
+}
+
+
 static void
 add_heap()
 {
@@ -326,7 +592,7 @@
 	struct heaps_slot *p;
 	int length;
 
-	heaps_length += HEAPS_INCREMENT;
+	heaps_length += heaps_increment;
 	length = heaps_length*sizeof(struct heaps_slot);
 	RUBY_CRITICAL(
 	    if (heaps_used > 0) {
@@ -342,10 +608,10 @@
     for (;;) {
 	RUBY_CRITICAL(p = (RVALUE*)malloc(sizeof(RVALUE)*(heap_slots+1)));
 	if (p == 0) {
-	    if (heap_slots == HEAP_MIN_SLOTS) {
+	    if (heap_slots == heap_min_slots) {
 		rb_memerror();
 	    }
-	    heap_slots = HEAP_MIN_SLOTS;
+	    heap_slots = heap_min_slots;
 	    continue;
 	}
         heaps[heaps_used].membase = p;
@@ -361,8 +627,9 @@
     if (lomem == 0 || lomem > p) lomem = p;
     if (himem < pend) himem = pend;
     heaps_used++;
-    heap_slots *= 1.8;
-    if (heap_slots <= 0) heap_slots = HEAP_MIN_SLOTS;
+    heap_slots += heap_slots_increment;
+    heap_slots_increment *= heap_slots_growth_factor;
+    if (heap_slots <= 0) heap_slots = heap_min_slots;
 
     while (p < pend) {
 	p->as.free.flags = 0;
@@ -1015,6 +1282,39 @@
     }
 }
 
+static char* obj_type(int tp)
+{
+    switch (tp) {
+	case T_NIL    : return "NIL";   
+	case T_OBJECT : return "OBJECT";
+	case T_CLASS  : return "CLASS";
+	case T_ICLASS : return "ICLASS";
+	case T_MODULE : return "MODULE";
+	case T_FLOAT  : return "FLOAT";
+	case T_STRING : return "STRING";
+	case T_REGEXP : return "REGEXP";
+	case T_ARRAY  : return "ARRAY";
+	case T_FIXNUM : return "FIXNUM";
+	case T_HASH   : return "HASH";
+	case T_STRUCT : return "STRUCT";
+	case T_BIGNUM : return "BIGNUM";
+	case T_FILE   : return "FILE";
+	    
+	case T_TRUE   : return "TRUE";
+	case T_FALSE  : return "FALSE";
+	case T_DATA   : return "DATA";
+	case T_MATCH  : return "MATCH";
+	case T_SYMBOL : return "SYMBOL";
+	    
+	case T_BLKTAG : return "BLKTAG";
+	case T_UNDEF  : return "UNDEF";
+	case T_VARMAP : return "VARMAP";
+	case T_SCOPE  : return "SCOPE";
+	case T_NODE   : return "NODE";
+	default: return "____";
+    }
+}
+
 static void
 free_unused_heaps()
 {
@@ -1045,12 +1345,21 @@
     unsigned long live = 0;
     unsigned long free_min = 0;
 
+    unsigned long really_freed = 0;
+    int free_counts[256];
+    int live_counts[256];
+    int do_gc_stats = gc_statistics & verbose_gc_stats;
+
     for (i = 0; i < heaps_used; i++) {
         free_min += heaps[i].limit;
     }
     free_min = free_min * 0.2;
-    if (free_min < FREE_MIN)
-        free_min = FREE_MIN;
+    if (free_min < heap_free_min)
+        free_min = heap_free_min;
+
+    if (do_gc_stats) {
+	for (i = 0 ; i< 256; i++) { free_counts[i] = live_counts[i] = 0; }
+    }
 
     if (ruby_in_compile && ruby_parser_stack_on_heap()) {
 	/* should not reclaim nodes during compilation
@@ -1083,6 +1392,9 @@
 	    if (!(p->as.basic.flags & FL_MARK)) {
 		if (p->as.basic.flags) {
 		    obj_free((VALUE)p);
+		    if (do_gc_stats) {
+			really_freed++;
+		    }
 		}
 		if (need_call_final && FL_TEST(p, FL_FINALIZE)) {
 		    p->as.free.flags = FL_MARK; /* remain marked */
@@ -1090,6 +1402,12 @@
 		    final_list = p;
 		}
 		else {
+		    if (do_gc_stats) {
+			int obt = p->as.basic.flags & T_MASK;
+			if (obt) {
+			    free_counts[obt]++;
+			}
+		    }
 		    p->as.free.flags = 0;
 		    p->as.free.next = freelist;
 		    freelist = p;
@@ -1103,6 +1421,9 @@
 	    else {
 		RBASIC(p)->flags &= ~FL_MARK;
 		live++;
+		if (do_gc_stats) {
+ 		    live_counts[RANY((VALUE)p)->as.basic.flags & T_MASK]++;
+ 		}
 	    }
 	    p++;
 	}
@@ -1121,7 +1442,7 @@
     }
     if (malloc_increase > malloc_limit) {
 	malloc_limit += (malloc_increase - malloc_limit) * (double)live / (live + freed);
-	if (malloc_limit < GC_MALLOC_LIMIT) malloc_limit = GC_MALLOC_LIMIT;
+	if (malloc_limit < initial_malloc_limit) malloc_limit = initial_malloc_limit;
     }
     malloc_increase = 0;
     if (freed < free_min) {
@@ -1129,6 +1450,20 @@
     }
     during_gc = 0;
 
+    if (do_gc_stats) {
+	fprintf(gc_data_file, "objects processed: %.7d\n", live+freed);
+	fprintf(gc_data_file, "live objects	: %.7d\n", live);
+	fprintf(gc_data_file, "freelist objects : %.7d\n", freed - really_freed);
+	fprintf(gc_data_file, "freed objects	: %.7d\n", really_freed);
+	for(i=0; i<256; i++) {
+	    if (free_counts[i]>0) {
+		fprintf(gc_data_file,
+			"kept %.7d / freed %.7d objects of type %s\n",
+			live_counts[i], free_counts[i], obj_type(i));
+	    }
+	}
+    }
+
     /* clear finalization list */
     if (final_list) {
 	deferred_final_list = final_list;
@@ -1323,6 +1658,7 @@
     struct gc_list *list;
     struct FRAME * volatile frame; /* gcc 2.7.2.3 -O2 bug??  */
     jmp_buf save_regs_gc_mark;
+    struct timeval gctv1, gctv2;
     SET_STACK_END;
 
 #ifdef HAVE_NATIVETHREAD
@@ -1339,6 +1675,14 @@
     if (during_gc) return;
     during_gc++;
 
+    if (gc_statistics) {
+        gc_collections++;
+	gettimeofday(&gctv1, NULL);
+        if (verbose_gc_stats) {
+	    fprintf(gc_data_file, "Garbage collection started\n");
+	}
+    }
+
     init_mark_stack();
 
     gc_mark((VALUE)ruby_current_node, 0);
@@ -1414,6 +1758,17 @@
     } while (!MARK_STACK_EMPTY);
 
     gc_sweep();
+
+    if (gc_statistics) {
+        GC_TIME_TYPE musecs_used;
+	gettimeofday(&gctv2, NULL);
+	musecs_used = ((GC_TIME_TYPE)(gctv2.tv_sec - gctv1.tv_sec) * 1000000) + (gctv2.tv_usec - gctv1.tv_usec);
+	gc_time += musecs_used;
+
+	if (verbose_gc_stats) {
+	    fprintf(gc_data_file, "GC time: %d msec\n", musecs_used / 1000);
+	}
+    }
 }
 
 void
@@ -1595,6 +1950,7 @@
     if (!rb_gc_stack_start) {
 	Init_stack(0);
     }
+    set_gc_parameters();
     add_heap();
 }
 
@@ -2064,6 +2420,14 @@
     rb_define_singleton_method(rb_mGC, "disable", rb_gc_disable, 0);
     rb_define_method(rb_mGC, "garbage_collect", rb_gc_start, 0);
 
+    rb_define_singleton_method(rb_mGC, "enable_stats", rb_gc_enable_stats, 0);
+    rb_define_singleton_method(rb_mGC, "disable_stats", rb_gc_disable_stats, 0);
+    rb_define_singleton_method(rb_mGC, "clear_stats", rb_gc_clear_stats, 0);
+    rb_define_singleton_method(rb_mGC, "collections", rb_gc_collections, 0);
+    rb_define_singleton_method(rb_mGC, "time", rb_gc_time, 0);
+    rb_define_singleton_method(rb_mGC, "dump", rb_gc_dump, 0);
+    rb_define_singleton_method(rb_mGC, "log", rb_gc_log, 1);
+
     rb_mObSpace = rb_define_module("ObjectSpace");
     rb_define_module_function(rb_mObSpace, "each_object", os_each_obj, -1);
     rb_define_module_function(rb_mObSpace, "garbage_collect", rb_gc_start, 0);
src/rvm/patches/ruby/1.8.6/openssl-1.0.patch000066400000016005147511530530014231 0ustar00From 46b84175dfac14a92fd6bcf3b03bc3c3715ab6cb Mon Sep 17 00:00:00 2001
From: nahi <nahi@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>
Date: Sat, 6 Mar 2010 21:47:30 +0000
Subject: [PATCH] backport the commit from trunk:
 Sun Feb 28 11:49:35 2010  NARUSE, Yui  <naruse@ruby-lang.org>

        * openssl/ossl.c (OSSL_IMPL_SK2ARY): for OpenSSL 1.0.
          patched by Jeroen van Meeuwen at [ruby-core:25210]
          fixed by Nobuyoshi Nakada [ruby-core:25238],
          Hongli Lai [ruby-core:27417],
          and Motohiro KOSAKI [ruby-core:28063]

        * ext/openssl/ossl_ssl.c (ossl_ssl_method_tab),
          (ossl_ssl_cipher_to_ary): constified.

        * ext/openssl/ossl_pkcs7.c (pkcs7_get_certs, pkcs7_get_crls):
          split pkcs7_get_certs_or_crls.


git-svn-id: http://svn.ruby-lang.org/repos/ruby/branches/ruby_1_8@26838 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
---
 ext/openssl/ossl.c          |    6 +++---
 ext/openssl/ossl.h          |    7 +++++++
 ext/openssl/ossl_pkcs7.c    |   40 ++++++++++++++++++++++++++++++----------
 ext/openssl/ossl_ssl.c      |    4 ++--
 ext/openssl/ossl_x509attr.c |    5 +++--
 ext/openssl/ossl_x509crl.c  |    4 ++--
 6 files changed, 47 insertions(+), 19 deletions(-)

diff --git a/ext/openssl/ossl.c b/ext/openssl/ossl.c
index d4a2dc1..85ba654 100644
--- a/ext/openssl/ossl.c
+++ b/ext/openssl/ossl.c
@@ -92,7 +92,7 @@ ossl_x509_ary2sk(VALUE ary)
 
 #define OSSL_IMPL_SK2ARY(name, type)	        \
 VALUE						\
-ossl_##name##_sk2ary(STACK *sk)			\
+ossl_##name##_sk2ary(STACK_OF(type) *sk)	\
 {						\
     type *t;					\
     int i, num;					\
@@ -102,7 +102,7 @@ ossl_##name##_sk2ary(STACK *sk)			\
 	OSSL_Debug("empty sk!");		\
 	return Qnil;				\
     }						\
-    num = sk_num(sk);				\
+    num = sk_##type##_num(sk);			\
     if (num < 0) {				\
 	OSSL_Debug("items in sk < -1???");	\
 	return rb_ary_new();			\
@@ -110,7 +110,7 @@ ossl_##name##_sk2ary(STACK *sk)			\
     ary = rb_ary_new2(num);			\
 						\
     for (i=0; i<num; i++) {			\
-	t = (type *)sk_value(sk, i);		\
+	t = sk_##type##_value(sk, i);		\
 	rb_ary_push(ary, ossl_##name##_new(t));	\
     }						\
     return ary;					\
diff --git a/ext/openssl/ossl.h b/ext/openssl/ossl.h
index 9215dc4..d0edb7d 100644
--- a/ext/openssl/ossl.h
+++ b/ext/openssl/ossl.h
@@ -108,6 +108,13 @@ extern VALUE eOSSLError;
 } while (0)
 
 /*
+ * Compatibility
+ */
+#if OPENSSL_VERSION_NUMBER >= 0x10000000L
+#define STACK _STACK
+#endif
+
+/*
  * String to HEXString conversion
  */
 int string2hex(const unsigned char *, int, char **, int *);
diff --git a/ext/openssl/ossl_pkcs7.c b/ext/openssl/ossl_pkcs7.c
index fe1ef7c..b0cc656 100644
--- a/ext/openssl/ossl_pkcs7.c
+++ b/ext/openssl/ossl_pkcs7.c
@@ -572,12 +572,11 @@ ossl_pkcs7_add_certificate(VALUE self, VALUE cert)
     return self;
 }
 
-static STACK *
-pkcs7_get_certs_or_crls(VALUE self, int want_certs)
+static STACK_OF(X509) *
+pkcs7_get_certs(VALUE self)
 {
     PKCS7 *pkcs7;
     STACK_OF(X509) *certs;
-    STACK_OF(X509_CRL) *crls;
     int i;
 
     GetPKCS7(self, pkcs7);
@@ -585,17 +584,38 @@ pkcs7_get_certs_or_crls(VALUE self, int want_certs)
     switch(i){
     case NID_pkcs7_signed:
         certs = pkcs7->d.sign->cert;
-        crls = pkcs7->d.sign->crl;
         break;
     case NID_pkcs7_signedAndEnveloped:
         certs = pkcs7->d.signed_and_enveloped->cert;
+        break;
+    default:
+        certs = NULL;
+    }
+
+    return certs;
+}
+
+static STACK_OF(X509_CRL) *
+pkcs7_get_crls(VALUE self)
+{
+    PKCS7 *pkcs7;
+    STACK_OF(X509_CRL) *crls;
+    int i;
+
+    GetPKCS7(self, pkcs7);
+    i = OBJ_obj2nid(pkcs7->type);
+    switch(i){
+    case NID_pkcs7_signed:
+        crls = pkcs7->d.sign->crl;
+        break;
+    case NID_pkcs7_signedAndEnveloped:
         crls = pkcs7->d.signed_and_enveloped->crl;
         break;
     default:
-        certs = crls = NULL;
+        crls = NULL;
     }
 
-    return want_certs ? certs : crls;
+    return crls;
 }
 
 static VALUE
@@ -610,7 +630,7 @@ ossl_pkcs7_set_certificates(VALUE self, VALUE ary)
     STACK_OF(X509) *certs;
     X509 *cert;
 
-    certs = pkcs7_get_certs_or_crls(self, 1);
+    certs = pkcs7_get_certs(self);
     while((cert = sk_X509_pop(certs))) X509_free(cert);
     rb_block_call(ary, rb_intern("each"), 0, 0, ossl_pkcs7_set_certs_i, self);
 
@@ -620,7 +640,7 @@ ossl_pkcs7_set_certificates(VALUE self, VALUE ary)
 static VALUE
 ossl_pkcs7_get_certificates(VALUE self)
 {
-    return ossl_x509_sk2ary(pkcs7_get_certs_or_crls(self, 1));
+    return ossl_x509_sk2ary(pkcs7_get_certs(self));
 }
 
 static VALUE
@@ -650,7 +670,7 @@ ossl_pkcs7_set_crls(VALUE self, VALUE ary)
     STACK_OF(X509_CRL) *crls;
     X509_CRL *crl;
 
-    crls = pkcs7_get_certs_or_crls(self, 0);
+    crls = pkcs7_get_crls(self);
     while((crl = sk_X509_CRL_pop(crls))) X509_CRL_free(crl);
     rb_block_call(ary, rb_intern("each"), 0, 0, ossl_pkcs7_set_crls_i, self);
 
@@ -660,7 +680,7 @@ ossl_pkcs7_set_crls(VALUE self, VALUE ary)
 static VALUE
 ossl_pkcs7_get_crls(VALUE self)
 {
-    return ossl_x509crl_sk2ary(pkcs7_get_certs_or_crls(self, 0));
+    return ossl_x509crl_sk2ary(pkcs7_get_crls(self));
 }
 
 static VALUE
diff --git a/ext/openssl/ossl_ssl.c b/ext/openssl/ossl_ssl.c
index 432ca21..facf6ca 100644
--- a/ext/openssl/ossl_ssl.c
+++ b/ext/openssl/ossl_ssl.c
@@ -1291,10 +1291,10 @@ ossl_ssl_get_peer_cert_chain(VALUE self)
     }
     chain = SSL_get_peer_cert_chain(ssl);
     if(!chain) return Qnil;
-    num = sk_num(chain);
+    num = sk_X509_num(chain);
     ary = rb_ary_new2(num);
     for (i = 0; i < num; i++){
-	cert = (X509*)sk_value(chain, i);
+	cert = sk_X509_value(chain, i);
 	rb_ary_push(ary, ossl_x509_new(cert));
     }
 
diff --git a/ext/openssl/ossl_x509attr.c b/ext/openssl/ossl_x509attr.c
index 1f817cd..2a4c481 100644
--- a/ext/openssl/ossl_x509attr.c
+++ b/ext/openssl/ossl_x509attr.c
@@ -218,8 +218,9 @@ ossl_x509attr_get_value(VALUE self)
 	ossl_str_adjust(str, p);
     }
     else{
-	length = i2d_ASN1_SET_OF_ASN1_TYPE(attr->value.set, NULL,
-			i2d_ASN1_TYPE, V_ASN1_SET, V_ASN1_UNIVERSAL, 0);
+	length = i2d_ASN1_SET_OF_ASN1_TYPE(attr->value.set,
+			(unsigned char **) NULL, i2d_ASN1_TYPE,
+			V_ASN1_SET, V_ASN1_UNIVERSAL, 0);
 	str = rb_str_new(0, length);
 	p = (unsigned char *)RSTRING_PTR(str);
 	i2d_ASN1_SET_OF_ASN1_TYPE(attr->value.set, &p,
diff --git a/ext/openssl/ossl_x509crl.c b/ext/openssl/ossl_x509crl.c
index 1be9640..818fdba 100644
--- a/ext/openssl/ossl_x509crl.c
+++ b/ext/openssl/ossl_x509crl.c
@@ -264,7 +264,7 @@ ossl_x509crl_get_revoked(VALUE self)
     VALUE ary, revoked;
 
     GetX509CRL(self, crl);
-    num = sk_X509_CRL_num(X509_CRL_get_REVOKED(crl));
+    num = sk_X509_REVOKED_num(X509_CRL_get_REVOKED(crl));
     if (num < 0) {
 	OSSL_Debug("num < 0???");
 	return rb_ary_new();
@@ -272,7 +272,7 @@ ossl_x509crl_get_revoked(VALUE self)
     ary = rb_ary_new2(num);
     for(i=0; i<num; i++) {
 	/* NO DUP - don't free! */
-	rev = (X509_REVOKED *)sk_X509_CRL_value(X509_CRL_get_REVOKED(crl), i);
+	rev = sk_X509_REVOKED_value(X509_CRL_get_REVOKED(crl), i);
 	revoked = ossl_x509revoked_new(rev);
 	rb_ary_push(ary, revoked);
     }
-- 
1.7.0.3
src/rvm/patches/ruby/1.8.6/hs.patch000066400000077342147511530530012677 0ustar00diff --git a/eval.c b/eval.c
index 4098b83..c70f270 100644
--- a/eval.c
+++ b/eval.c
@@ -73,6 +73,7 @@ char *strrchr _((const char*,const char));
 #endif
 
 #include <time.h>
+#include <sys/mman.h>
 
 #ifdef __BEOS__
 #include <net/socket.h>
@@ -1025,7 +1026,7 @@ static struct tag *prot_tag;
     _tag.blkid = 0;			\
     prot_tag = &_tag
 
-#define PROT_NONE   Qfalse	/* 0 */
+#define PROT_EMPTY  Qfalse	/* 0 */
 #define PROT_THREAD Qtrue	/* 2 */
 #define PROT_FUNC   INT2FIX(0)	/* 1 */
 #define PROT_LOOP   INT2FIX(1)	/* 3 */
@@ -1236,7 +1237,7 @@ error_print()
 
     if (NIL_P(ruby_errinfo)) return;
 
-    PUSH_TAG(PROT_NONE);
+    PUSH_TAG(PROT_EMPTY);
     if (EXEC_TAG() == 0) {
 	errat = get_backtrace(ruby_errinfo);
     }
@@ -1396,7 +1397,7 @@ ruby_init()
     /* default visibility is private at toplevel */
     SCOPE_SET(SCOPE_PRIVATE);
 
-    PUSH_TAG(PROT_NONE);
+    PUSH_TAG(PROT_EMPTY);
     if ((state = EXEC_TAG()) == 0) {
 	rb_call_inits();
 	ruby_class = rb_cObject;
@@ -1530,7 +1531,7 @@ ruby_options(argc, argv)
     int state;
 
     Init_stack((void*)&state);
-    PUSH_TAG(PROT_NONE);
+    PUSH_TAG(PROT_EMPTY);
     if ((state = EXEC_TAG()) == 0) {
 	ruby_process_options(argc, argv);
     }
@@ -1547,7 +1548,7 @@ void rb_exec_end_proc _((void));
 static void
 ruby_finalize_0()
 {
-    PUSH_TAG(PROT_NONE);
+    PUSH_TAG(PROT_EMPTY);
     if (EXEC_TAG() == 0) {
 	rb_trap_exit();
     }
@@ -1585,7 +1586,7 @@ ruby_cleanup(ex)
     Init_stack((void *)&state);
     ruby_finalize_0();
     errs[0] = ruby_errinfo;
-    PUSH_TAG(PROT_NONE);
+    PUSH_TAG(PROT_EMPTY);
     PUSH_ITER(ITER_NOT);
     if ((state = EXEC_TAG()) == 0) {
 	rb_thread_cleanup();
@@ -1636,7 +1637,7 @@ ruby_exec_internal()
 {
     int state;
 
-    PUSH_TAG(PROT_NONE);
+    PUSH_TAG(PROT_EMPTY);
     PUSH_ITER(ITER_NOT);
     /* default visibility is private at toplevel */
     SCOPE_SET(SCOPE_PRIVATE);
@@ -1858,7 +1859,7 @@ rb_eval_cmd(cmd, arg, level)
     }
     if (TYPE(cmd) != T_STRING) {
 	PUSH_ITER(ITER_NOT);
-	PUSH_TAG(PROT_NONE);
+	PUSH_TAG(PROT_EMPTY);
 	ruby_safe_level = level;
 	if ((state = EXEC_TAG()) == 0) {
 	    val = rb_funcall2(cmd, rb_intern("call"), RARRAY(arg)->len, RARRAY(arg)->ptr);
@@ -1880,7 +1881,7 @@ rb_eval_cmd(cmd, arg, level)
 
     ruby_safe_level = level;
 
-    PUSH_TAG(PROT_NONE);
+    PUSH_TAG(PROT_EMPTY);
     if ((state = EXEC_TAG()) == 0) {
 	val = eval(ruby_top_self, cmd, Qnil, 0, 0);
     }
@@ -2387,7 +2388,7 @@ is_defined(self, node, buf)
 	val = self;
 	if (node->nd_recv == (NODE *)1) goto check_bound;
       case NODE_CALL:
-	PUSH_TAG(PROT_NONE);
+	PUSH_TAG(PROT_EMPTY);
 	if ((state = EXEC_TAG()) == 0) {
 	    val = rb_eval(self, node->nd_recv);
 	}
@@ -2489,7 +2490,7 @@ is_defined(self, node, buf)
 	break;
 
       case NODE_COLON2:
-	PUSH_TAG(PROT_NONE);
+	PUSH_TAG(PROT_EMPTY);
 	if ((state = EXEC_TAG()) == 0) {
 	    val = rb_eval(self, node->nd_head);
 	}
@@ -2538,7 +2539,7 @@ is_defined(self, node, buf)
 	goto again;
 
       default:
-	PUSH_TAG(PROT_NONE);
+	PUSH_TAG(PROT_EMPTY);
 	if ((state = EXEC_TAG()) == 0) {
 	    rb_eval(self, node);
 	}
@@ -2742,7 +2743,7 @@ call_trace_func(event, node, self, id, klass)
 	    klass = rb_iv_get(klass, "__attached__");
 	}
     }
-    PUSH_TAG(PROT_NONE);
+    PUSH_TAG(PROT_EMPTY);
     raised = rb_thread_reset_raised(th);
     if ((state = EXEC_TAG()) == 0) {
 	srcfile = rb_str_new2(ruby_sourcefile?ruby_sourcefile:"(ruby)");
@@ -3302,7 +3303,7 @@ rb_eval(self, n)
 	    volatile VALUE e_info = ruby_errinfo;
 	    volatile int rescuing = 0;
 
-	    PUSH_TAG(PROT_NONE);
+	    PUSH_TAG(PROT_EMPTY);
 	    if ((state = EXEC_TAG()) == 0) {
 	      retry_entry:
 		result = rb_eval(self, node->nd_head);
@@ -3351,7 +3352,7 @@ rb_eval(self, n)
 	break;
 
       case NODE_ENSURE:
-	PUSH_TAG(PROT_NONE);
+	PUSH_TAG(PROT_EMPTY);
 	if ((state = EXEC_TAG()) == 0) {
 	    result = rb_eval(self, node->nd_head);
 	}
@@ -3569,7 +3570,7 @@ rb_eval(self, n)
 	    ruby_frame = &frame;
 
 	    PUSH_SCOPE();
-	    PUSH_TAG(PROT_NONE);
+	    PUSH_TAG(PROT_EMPTY);
 	    if (node->nd_rval) {
 		saved_cref = ruby_cref;
 		ruby_cref = (NODE*)node->nd_rval;
@@ -4195,7 +4196,7 @@ module_setup(module, n)
     }
 
     PUSH_CREF(module);
-    PUSH_TAG(PROT_NONE);
+    PUSH_TAG(PROT_EMPTY);
     if ((state = EXEC_TAG()) == 0) {
 	EXEC_EVENT_HOOK(RUBY_EVENT_CLASS, n, ruby_cbase,
 			ruby_frame->last_func, ruby_frame->last_class);
@@ -4602,7 +4603,7 @@ rb_longjmp(tag, mesg)
 	VALUE e = ruby_errinfo;
 	int status;
 
-	PUSH_TAG(PROT_NONE);
+	PUSH_TAG(PROT_EMPTY);
 	if ((status = EXEC_TAG()) == 0) {
 	    StringValue(e);
 	    warn_printf("Exception `%s' at %s:%d - %s\n",
@@ -4974,7 +4975,7 @@ rb_yield_0(val, self, klass, flags, avalue)
     node = block->body;
 
     if (block->var) {
-	PUSH_TAG(PROT_NONE);
+	PUSH_TAG(PROT_EMPTY);
 	if ((state = EXEC_TAG()) == 0) {
 	    if (block->var == (NODE*)1) { /* no parameter || */
 		if (lambda && RARRAY(val)->len != 0) {
@@ -5032,7 +5033,7 @@ rb_yield_0(val, self, klass, flags, avalue)
     ruby_current_node = node;
 
     PUSH_ITER(block->iter);
-    PUSH_TAG(lambda ? PROT_NONE : PROT_YIELD);
+    PUSH_TAG(lambda ? PROT_EMPTY : PROT_YIELD);
     if ((state = EXEC_TAG()) == 0) {
       redo:
 	if (nd_type(node) == NODE_CFUNC || nd_type(node) == NODE_IFUNC) {
@@ -5430,7 +5431,7 @@ rb_rescue2(b_proc, data1, r_proc, data2, va_alist)
     VALUE eclass;
     va_list args;
 
-    PUSH_TAG(PROT_NONE);
+    PUSH_TAG(PROT_EMPTY);
     switch (state = EXEC_TAG()) {
       case TAG_RETRY:
 	if (!handle) break;
@@ -5488,7 +5489,7 @@ rb_protect(proc, data, state)
     VALUE result = Qnil;	/* OK */
     int status;
 
-    PUSH_TAG(PROT_NONE);
+    PUSH_TAG(PROT_EMPTY);
     cont_protect = (VALUE)rb_node_newnode(NODE_MEMO, cont_protect, 0, 0);
     if ((status = EXEC_TAG()) == 0) {
 	result = (*proc)(data);
@@ -5516,7 +5517,7 @@ rb_ensure(b_proc, data1, e_proc, data2)
     volatile VALUE result = Qnil;
     VALUE retval;
 
-    PUSH_TAG(PROT_NONE);
+    PUSH_TAG(PROT_EMPTY);
     if ((state = EXEC_TAG()) == 0) {
 	result = (*b_proc)(data1);
     }
@@ -5543,7 +5544,7 @@ rb_with_disable_interrupt(proc, data)
 	int thr_critical = rb_thread_critical;
 
 	rb_thread_critical = Qtrue;
-	PUSH_TAG(PROT_NONE);
+	PUSH_TAG(PROT_EMPTY);
 	if ((status = EXEC_TAG()) == 0) {
 	    result = (*proc)(data);
 	}
@@ -6230,7 +6231,7 @@ rb_funcall_rescue(recv, mid, n, va_alist)
 
     va_init_list(ar, n);
 
-    PUSH_TAG(PROT_NONE);
+    PUSH_TAG(PROT_EMPTY);
     if ((status = EXEC_TAG()) == 0) {
 	result = vafuncall(recv, mid, n, &ar);
     }
@@ -6499,7 +6500,7 @@ eval(self, src, scope, file, line)
     if (TYPE(ruby_class) == T_ICLASS) {
 	ruby_class = RBASIC(ruby_class)->klass;
     }
-    PUSH_TAG(PROT_NONE);
+    PUSH_TAG(PROT_EMPTY);
     if ((state = EXEC_TAG()) == 0) {
 	NODE *node;
 
@@ -6658,7 +6659,7 @@ exec_under(func, under, cbase, args)
 
     mode = scope_vmode;
     SCOPE_SET(SCOPE_PUBLIC);
-    PUSH_TAG(PROT_NONE);
+    PUSH_TAG(PROT_EMPTY);
     if ((state = EXEC_TAG()) == 0) {
 	val = (*func)(args);
     }
@@ -6889,7 +6890,7 @@ rb_load(fname, wrap)
     PUSH_SCOPE();
     /* default visibility is private at loading toplevel */
     SCOPE_SET(SCOPE_PRIVATE);
-    PUSH_TAG(PROT_NONE);
+    PUSH_TAG(PROT_EMPTY);
     state = EXEC_TAG();
     last_func = ruby_frame->last_func;
     last_node = ruby_current_node;
@@ -6948,7 +6949,7 @@ rb_load_protect(fname, wrap, state)
 {
     int status;
 
-    PUSH_TAG(PROT_NONE);
+    PUSH_TAG(PROT_EMPTY);
     if ((status = EXEC_TAG()) == 0) {
 	rb_load(fname, wrap);
     }
@@ -7269,7 +7270,7 @@ rb_require_safe(fname, safe)
     saved.node = ruby_current_node;
     saved.func = ruby_frame->last_func;
     saved.safe = ruby_safe_level;
-    PUSH_TAG(PROT_NONE);
+    PUSH_TAG(PROT_EMPTY);
     if ((state = EXEC_TAG()) == 0) {
 	VALUE feature, path;
 	long handle;
@@ -7977,7 +7978,7 @@ rb_exec_end_proc()
 	tmp_end_procs = link = ephemeral_end_procs;
 	ephemeral_end_procs = 0;
 	while (link) {
-	    PUSH_TAG(PROT_NONE);
+	    PUSH_TAG(PROT_EMPTY);
 	    if ((status = EXEC_TAG()) == 0) {
 		ruby_safe_level = link->safe;
 		(*link->func)(link->data);
@@ -7995,7 +7996,7 @@ rb_exec_end_proc()
 	tmp_end_procs = link = end_procs;
 	end_procs = 0;
 	while (link) {
-	    PUSH_TAG(PROT_NONE);
+	    PUSH_TAG(PROT_EMPTY);
 	    if ((status = EXEC_TAG()) == 0) {
 		ruby_safe_level = link->safe;
 		(*link->func)(link->data);
@@ -8654,7 +8655,7 @@ proc_invoke(proc, args, self, klass)
     ruby_block = &_block;
     PUSH_ITER(ITER_CUR);
     ruby_frame->iter = ITER_CUR;
-    PUSH_TAG(pcall ? PROT_LAMBDA : PROT_NONE);
+    PUSH_TAG(pcall ? PROT_LAMBDA : PROT_EMPTY);
     state = EXEC_TAG();
     if (state == 0) {
 	proc_set_safe_level(proc);
@@ -9896,6 +9897,7 @@ win32_set_exception_list(p)
 int rb_thread_pending = 0;
 
 VALUE rb_cThread;
+static unsigned int rb_thread_stack_size;
 
 extern VALUE rb_last_status;
 
@@ -10123,12 +10125,20 @@ thread_mark(th)
     rb_gc_mark(th->thread);
     if (th->join) rb_gc_mark(th->join->thread);
 
-    rb_gc_mark(th->klass);
-    rb_gc_mark(th->wrapper);
-    rb_gc_mark((VALUE)th->cref);
+    if (curr_thread == th) {
+      rb_gc_mark(ruby_class);
+      rb_gc_mark(ruby_wrapper);
+      rb_gc_mark((VALUE)ruby_cref);
+      rb_gc_mark((VALUE)ruby_scope);
+      rb_gc_mark((VALUE)ruby_dyna_vars);
+    } else {
+      rb_gc_mark(th->klass);
+      rb_gc_mark(th->wrapper);
+      rb_gc_mark((VALUE)th->cref);
+      rb_gc_mark((VALUE)th->scope);
+      rb_gc_mark((VALUE)th->dyna_vars);
+    }
 
-    rb_gc_mark((VALUE)th->scope);
-    rb_gc_mark((VALUE)th->dyna_vars);
     rb_gc_mark(th->errinfo);
     rb_gc_mark(th->last_status);
     rb_gc_mark(th->last_line);
@@ -10138,11 +10148,11 @@ thread_mark(th)
     rb_gc_mark_maybe(th->sandbox);
 
     /* mark data in copied stack */
-    if (th == curr_thread) return;
+    if (th == main_thread) return;
     if (th->status == THREAD_KILLED) return;
     if (th->stk_len == 0) return;  /* stack not active, no need to mark. */
-    if (th->stk_ptr) {
-	rb_gc_mark_locations(th->stk_ptr, th->stk_ptr+th->stk_len);
+    if (th->stk_ptr && th != curr_thread) {
+      rb_gc_mark_locations(th->stk_pos, th->stk_base);
 #if defined(THINK_C) || defined(__human68k__)
 	rb_gc_mark_locations(th->stk_ptr+2, th->stk_ptr+th->stk_len+2);
 #endif
@@ -10152,24 +10162,30 @@ thread_mark(th)
 	}
 #endif
     }
-    frame = th->frame;
+
+    if (curr_thread == th)
+      frame = ruby_frame;
+    else
+      frame = th->frame;
+
     while (frame && frame != top_frame) {
-	frame = ADJ(frame);
 	rb_gc_mark_frame(frame);
 	if (frame->tmp) {
 	    struct FRAME *tmp = frame->tmp;
-
 	    while (tmp && tmp != top_frame) {
-		tmp = ADJ(tmp);
 		rb_gc_mark_frame(tmp);
 		tmp = tmp->prev;
 	    }
 	}
 	frame = frame->prev;
     }
-    block = th->block;
+
+    if (curr_thread == th)
+      block = ruby_block;
+    else
+      block = th->block;
+
     while (block) {
-	block = ADJ(block);
 	rb_gc_mark_frame(&block->frame);
 	block = block->prev;
     }
@@ -10232,7 +10248,7 @@ static inline void
 stack_free(th)
     rb_thread_t th;
 {
-    if (th->stk_ptr) free(th->stk_ptr);
+  if (th->stk_ptr) munmap(th->stk_ptr, th->stk_size);
     th->stk_ptr = 0;
 #ifdef __ia64
     if (th->bstr_ptr) free(th->bstr_ptr);
@@ -10293,35 +10309,8 @@ rb_thread_save_context(th)
     static VALUE tval;
 
     len = ruby_stack_length(&pos);
-    th->stk_len = 0;
-    th->stk_pos = pos;
-    if (len > th->stk_max) {
-	VALUE *ptr = realloc(th->stk_ptr, sizeof(VALUE) * len);
-	if (!ptr) rb_memerror();
-	th->stk_ptr = ptr;
-	th->stk_max = len;
-    }
     th->stk_len = len;
-    FLUSH_REGISTER_WINDOWS;
-    MEMCPY(th->stk_ptr, th->stk_pos, VALUE, th->stk_len);
-#ifdef __ia64
-    th->bstr_pos = rb_gc_register_stack_start;
-    len = (VALUE*)rb_ia64_bsp() - th->bstr_pos;
-    th->bstr_len = 0;
-    if (len > th->bstr_max) {
-        VALUE *ptr = realloc(th->bstr_ptr, sizeof(VALUE) * len);
-        if (!ptr) rb_memerror();
-        th->bstr_ptr = ptr;
-        th->bstr_max = len;
-    }
-    th->bstr_len = len;
-    rb_ia64_flushrs();
-    MEMCPY(th->bstr_ptr, th->bstr_pos, VALUE, th->bstr_len);
-#endif
-#ifdef SAVE_WIN32_EXCEPTION_LIST
-    th->win32_exception_list = win32_get_exception_list();
-#endif
-
+    th->stk_pos = pos;
     th->frame = ruby_frame;
     th->scope = ruby_scope;
     ruby_scope->flags |= SCOPE_DONT_RECYCLE;
@@ -10431,11 +10420,6 @@ rb_thread_restore_context_0(rb_thread_t th, int exit)
 #endif
     tmp = th;
     ex = exit;
-    FLUSH_REGISTER_WINDOWS;
-    MEMCPY(tmp->stk_pos, tmp->stk_ptr, VALUE, tmp->stk_len);
-#ifdef __ia64
-    MEMCPY(tmp->bstr_pos, tmp->bstr_ptr, VALUE, tmp->bstr_len);
-#endif
 
     tval = rb_lastline_get();
     rb_lastline_set(tmp->last_line);
@@ -10526,8 +10510,8 @@ rb_thread_restore_context(th, exit)
     rb_thread_t th;
     int exit;
 {
-    if (!th->stk_ptr) rb_bug("unsaved context");
-    stack_extend(th, exit);
+    if (!th->stk_ptr && th != main_thread) rb_bug("unsaved context");
+    rb_thread_restore_context_0(th, exit);
 }
 
 static void
@@ -10546,7 +10530,6 @@ rb_thread_die(th)
 {
     th->thgroup = 0;
     th->status = THREAD_KILLED;
-    stack_free(th);
 }
 
 static void
@@ -11822,6 +11805,7 @@ rb_thread_group(thread)
 \
     th->stk_ptr = 0;\
     th->stk_len = 0;\
+    th->stk_size = 0;\
     th->stk_max = 0;\
     th->wait_for = 0;\
     IA64_INIT(th->bstr_ptr = 0);\
@@ -11869,6 +11853,48 @@ rb_thread_alloc(klass)
     THREAD_ALLOC(th);
     th->thread = Data_Wrap_Struct(klass, thread_mark, thread_free, th);
 
+    /* if main_thread != NULL, then this is NOT the main thread, so
+     * we create a heap-stack
+     */
+    if (main_thread) {
+      /* Allocate stack, don't forget to add 1 extra word because of the MATH below */
+      unsigned int pagesize = getpagesize();
+      unsigned int total_size = rb_thread_stack_size + pagesize + sizeof(int);
+      void *stack_area = NULL;
+
+      stack_area = mmap(NULL, total_size, PROT_READ | PROT_WRITE | PROT_EXEC,
+			MAP_PRIVATE | MAP_ANON, -1, 0);
+
+      if (stack_area == MAP_FAILED) {
+	fprintf(stderr, "Thread stack allocation failed!\n");
+	rb_memerror();
+      }
+
+      th->stk_ptr = th->stk_pos = stack_area;
+      th->stk_size = total_size;
+
+      if (mprotect(th->stk_ptr, pagesize, PROT_NONE) == -1) {
+	fprintf(stderr, "Failed to create thread guard region: %s\n", strerror(errno));
+	rb_memerror();
+      }
+
+      th->guard = th->stk_ptr + (pagesize/sizeof(VALUE *));
+
+      /* point stk_base at the top of the stack */
+      /* ASSUMPTIONS:
+       * 1.) The address returned by malloc is "suitably aligned" for anything on this system
+       * 2.) Adding a value that is "aligned" for this platform should not unalign the address
+       *     returned from malloc.
+       * 3.) Don't push anything on to the stack, otherwise it'll get unaligned.
+       * 4.) x86_64 ABI says aligned AFTER arguments have been pushed. You *must* then do a call[lq]
+       *     or push[lq] something else on to the stack if you inted to do a ret.
+       */
+      th->stk_base = th->stk_ptr + ((total_size - sizeof(int))/sizeof(VALUE *));
+      th->stk_len = rb_thread_stack_size;
+    } else {
+      th->stk_ptr = th->stk_pos = rb_gc_stack_start;
+    }
+
     for (vars = th->dyna_vars; vars; vars = vars->next) {
 	if (FL_TEST(vars, DVAR_DONT_RECYCLE)) break;
 	FL_SET(vars, DVAR_DONT_RECYCLE);
@@ -12014,17 +12040,22 @@ rb_thread_cancel_timer()
 }
 #endif
 
+struct thread_start_args {
+  VALUE (*fn)();
+  void *arg;
+  rb_thread_t th;
+} new_th;
+
+static VALUE
+rb_thread_start_2();
+
 static VALUE
 rb_thread_start_0(fn, arg, th)
     VALUE (*fn)();
     void *arg;
     rb_thread_t th;
 {
-    volatile rb_thread_t th_save = th;
     volatile VALUE thread = th->thread;
-    struct BLOCK *volatile saved_block = 0;
-    enum rb_thread_status status;
-    int state;
 
     if (OBJ_FROZEN(curr_thread->thgroup)) {
 	rb_raise(rb_eThreadError,
@@ -12054,16 +12085,41 @@ rb_thread_start_0(fn, arg, th)
 	return thread;
     }
 
-    if (ruby_block) {		/* should nail down higher blocks */
-	struct BLOCK dummy;
+    new_th.fn = fn;
+    new_th.arg = arg;
+    new_th.th = th;
+
+#if defined(__i386__)
+    __asm__ __volatile__ ("movl %0, %%esp\n\t"
+                          "calll *%1\n"
+                          :: "r" (th->stk_base),
+                             "r" (rb_thread_start_2));
+#elif defined(__x86_64__)
+    __asm__ __volatile__ ("movq %0, %%rsp\n\t"
+                          "callq *%1\n"
+                          :: "r" (th->stk_base),
+                             "r" (rb_thread_start_2));
+#else
+    #error unsupported architecture!
+#endif
+    /* NOTREACHED */
+    return 0;
+}
 
-	dummy.prev = ruby_block;
-	blk_copy_prev(&dummy);
-	saved_block = ruby_block = dummy.prev;
-    }
-    scope_dup(ruby_scope);
+static VALUE
+rb_thread_start_2()
+{
+   volatile rb_thread_t th = new_th.th;
+   volatile rb_thread_t th_save = th;
+   volatile VALUE thread = th->thread;
+   struct BLOCK *volatile saved_block = 0;
+   enum rb_thread_status status;
+   int state;
+   struct tag *tag;
+   struct RVarmap *vars;
+   struct FRAME dummy_frame;
 
-    if (!th->next) {
+   if (!th->next) {
 	/* merge in thread list */
 	th->prev = curr_thread;
 	curr_thread->next->prev = th;
@@ -12071,13 +12127,27 @@ rb_thread_start_0(fn, arg, th)
 	curr_thread->next = th;
 	th->priority = curr_thread->priority;
 	th->thgroup = curr_thread->thgroup;
+   }
+   curr_thread = th;
+
+   dummy_frame = *ruby_frame;
+   dummy_frame.prev = top_frame;
+   ruby_frame = &dummy_frame;
+
+   if (ruby_block) {		/* should nail down higher blocks */
+	struct BLOCK dummy;
+
+	dummy.prev = ruby_block;
+	blk_copy_prev(&dummy);
+	saved_block = ruby_block = dummy.prev;
     }
 
+    scope_dup(ruby_scope);
+
     PUSH_TAG(PROT_THREAD);
     if ((state = EXEC_TAG()) == 0) {
 	if (THREAD_SAVE_CONTEXT(th) == 0) {
-	    curr_thread = th;
-	    th->result = (*fn)(arg, th);
+	    th->result = (*new_th.fn)(new_th.arg, th);
 	}
 	th = th_save;
     }
@@ -12414,6 +12484,43 @@ rb_thread_cleanup()
     END_FOREACH_FROM(curr, th);
 }
 
+/*
+ * call-seq:
+ *    Thread.stack_size    => fixnum
+ *
+ * Returns the thread stack size in bytes
+ */
+static VALUE
+rb_thread_stacksize_get()
+{
+  return INT2FIX(rb_thread_stack_size);
+}
+
+/*
+ * call-seq:
+ *    Thread.stack_size= fixnum => Qnil
+ *
+ * Sets the global thread stacksize and returns Qnil.
+ */
+static VALUE
+rb_thread_stacksize_set(obj, val)
+     VALUE obj;
+     VALUE val;
+{
+
+  unsigned int size = FIX2UINT(val);
+
+  /* 16byte alignment works for both x86 and x86_64 */
+  if (size & (~0xf)) {
+    size += 0x10;
+    size = size & (~0xf);
+  }
+
+  rb_thread_stack_size = size;
+
+  return Qnil;
+}
+
 int rb_thread_critical;
 
 
@@ -13167,6 +13274,8 @@ Init_Thread()
 {
     VALUE cThGroup;
 
+    rb_thread_stack_size = (1024 * 1024);
+
     rb_eThreadError = rb_define_class("ThreadError", rb_eStandardError);
     rb_cThread = rb_define_class("Thread", rb_cObject);
     rb_undef_alloc_func(rb_cThread);
@@ -13190,6 +13299,9 @@ Init_Thread()
     rb_define_singleton_method(rb_cThread, "abort_on_exception", rb_thread_s_abort_exc, 0);
     rb_define_singleton_method(rb_cThread, "abort_on_exception=", rb_thread_s_abort_exc_set, 1);
 
+    rb_define_singleton_method(rb_cThread, "stack_size", rb_thread_stacksize_get, 0);
+    rb_define_singleton_method(rb_cThread, "stack_size=", rb_thread_stacksize_set, 1);
+
     rb_define_method(rb_cThread, "run", rb_thread_run, 0);
     rb_define_method(rb_cThread, "wakeup", rb_thread_wakeup, 0);
     rb_define_method(rb_cThread, "kill", rb_thread_kill, 0);
diff --git a/gc.c b/gc.c
index 318e24c..0746834 100644
--- a/gc.c
+++ b/gc.c
@@ -466,12 +466,12 @@ stack_end_address(VALUE **stack_end_p)
 # define STACK_END (stack_end)
 #endif
 #if STACK_GROW_DIRECTION < 0
-# define STACK_LENGTH  (rb_gc_stack_start - STACK_END)
+# define STACK_LENGTH(start)  ((start) - STACK_END)
 #elif STACK_GROW_DIRECTION > 0
-# define STACK_LENGTH  (STACK_END - rb_gc_stack_start + 1)
+# define STACK_LENGTH(start)  (STACK_END - (start) + 1)
 #else
-# define STACK_LENGTH  ((STACK_END < rb_gc_stack_start) ? rb_gc_stack_start - STACK_END\
-                                           : STACK_END - rb_gc_stack_start + 1)
+# define STACK_LENGTH(start)  ((STACK_END < (start)) ? (start) - STACK_END\
+                                           : STACK_END - (start) + 1)
 #endif
 #if STACK_GROW_DIRECTION > 0
 # define STACK_UPPER(x, a, b) a
@@ -494,27 +494,36 @@ stack_grow_direction(addr)
 
 #define GC_WATER_MARK 512
 
-#define CHECK_STACK(ret) do {\
+#define CHECK_STACK(ret, start) do {\
     SET_STACK_END;\
-    (ret) = (STACK_LENGTH > STACK_LEVEL_MAX + GC_WATER_MARK);\
+    (ret) = (STACK_LENGTH(start) > STACK_LEVEL_MAX + GC_WATER_MARK);\
 } while (0)
 
 size_t
 ruby_stack_length(p)
     VALUE **p;
 {
-    SET_STACK_END;
-    if (p) *p = STACK_UPPER(STACK_END, rb_gc_stack_start, STACK_END);
-    return STACK_LENGTH;
+  SET_STACK_END;
+  VALUE *start;
+  if (rb_curr_thread == rb_main_thread) {
+    start = rb_gc_stack_start;
+  } else {
+    start = rb_curr_thread->stk_base;
+  }
+  if (p) *p = STACK_UPPER(STACK_END, start, STACK_END);
+  return STACK_LENGTH(start);
 }
 
 int
 ruby_stack_check()
 {
-    int ret;
-
-    CHECK_STACK(ret);
-    return ret;
+  int ret;
+  if (rb_curr_thread == rb_main_thread) {
+    CHECK_STACK(ret, rb_gc_stack_start);
+  } else {
+    CHECK_STACK(ret, rb_curr_thread->stk_base);
+  }
+  return ret;
 }
 
 #define MARK_STACK_MAX 1024
@@ -1404,10 +1413,13 @@ garbage_collect()
 
     init_mark_stack();
 
-    gc_mark((VALUE)ruby_current_node, 0);
-
     /* mark frame stack */
-    for (frame = ruby_frame; frame; frame = frame->prev) {
+    if (rb_curr_thread == rb_main_thread)
+      frame = ruby_frame;
+    else
+      frame = rb_main_thread->frame;
+
+    for (; frame; frame = frame->prev) {
 	rb_gc_mark_frame(frame);
 	if (frame->tmp) {
 	    struct FRAME *tmp = frame->tmp;
@@ -1417,16 +1429,35 @@ garbage_collect()
 	    }
 	}
     }
-    gc_mark((VALUE)ruby_scope, 0);
-    gc_mark((VALUE)ruby_dyna_vars, 0);
+
+    if (rb_curr_thread == rb_main_thread) {
+      gc_mark((VALUE)ruby_current_node, 0);
+      gc_mark((VALUE)ruby_scope, 0);
+      gc_mark((VALUE)ruby_dyna_vars, 0);
+    } else {
+      gc_mark((VALUE)rb_main_thread->node, 0);
+      gc_mark((VALUE)rb_main_thread->scope, 0);
+      gc_mark((VALUE)rb_main_thread->dyna_vars, 0);
+
+      /* scan the current thread's stack */
+      rb_gc_mark_locations((VALUE*)STACK_END, rb_curr_thread->stk_base);
+    }
+
     if (finalizer_table) {
-	mark_tbl(finalizer_table, 0);
+      mark_tbl(finalizer_table, 0);
     }
 
     FLUSH_REGISTER_WINDOWS;
     /* This assumes that all registers are saved into the jmp_buf (and stack) */
     setjmp(save_regs_gc_mark);
     mark_locations_array((VALUE*)save_regs_gc_mark, sizeof(save_regs_gc_mark) / sizeof(VALUE *));
+
+    /* If this is not the main thread, we need to scan the C stack, so
+     * set STACK_END to the end of the C stack.
+     */
+    if (rb_curr_thread != rb_main_thread)
+      STACK_END = rb_main_thread->stk_pos;
+
 #if STACK_GROW_DIRECTION < 0
     rb_gc_mark_locations((VALUE*)STACK_END, rb_gc_stack_start);
 #elif STACK_GROW_DIRECTION > 0
@@ -1446,6 +1477,7 @@ garbage_collect()
     rb_gc_mark_locations((VALUE*)((char*)STACK_END + 2),
 			 (VALUE*)((char*)rb_gc_stack_start + 2));
 #endif
+
     rb_gc_mark_threads();
 
     /* mark protected global variables */
diff --git a/lib/logger.rb b/lib/logger.rb
index e9ab171..2564c33 100644
--- a/lib/logger.rb
+++ b/lib/logger.rb
@@ -170,7 +170,7 @@ require 'monitor'
 
 class Logger
   VERSION = "1.2.6"
-  id, name, rev = %w$Id$
+  id, name, rev = %w$Id logger.rb 1234$
   ProgName = "#{name.chomp(",v")}/#{rev}"
 
   class Error < RuntimeError; end
diff --git a/node.h b/node.h
index 476a826..ecdc053 100644
--- a/node.h
+++ b/node.h
@@ -411,8 +411,11 @@ struct rb_thread {
 
     size_t stk_len;
     size_t stk_max;
+    size_t stk_size;
     VALUE *stk_ptr;
     VALUE *stk_pos;
+    VALUE *stk_base;
+    VALUE *guard;
 #ifdef __ia64
     size_t bstr_len;
     size_t bstr_max;
diff --git a/signal.c b/signal.c
index b6cad9d..116ac05 100644
--- a/signal.c
+++ b/signal.c
@@ -14,6 +14,7 @@
 
 #include "ruby.h"
 #include "rubysig.h"
+#include "node.h"
 #include <signal.h>
 #include <stdio.h>
 
@@ -425,15 +426,22 @@ typedef RETSIGTYPE (*sighandler_t)_((int));
 static sighandler_t
 ruby_signal(signum, handler)
     int signum;
-    sighandler_t handler;
+    void *handler;
 {
     struct sigaction sigact, old;
 
     rb_trap_accept_nativethreads[signum] = 0;
 
-    sigact.sa_handler = handler;
+    if (signum == SIGSEGV || signum == SIGBUS) {
+      sigact.sa_sigaction = handler;
+      sigact.sa_flags = (SA_ONSTACK | SA_RESETHAND | SA_SIGINFO);
+    } else {
+      sigact.sa_handler = handler;
+      sigact.sa_flags = 0;
+    }
+
     sigemptyset(&sigact.sa_mask);
-    sigact.sa_flags = 0;
+
 # ifdef SA_NOCLDWAIT
     if (signum == SIGCHLD && handler == SIG_IGN)
 	sigact.sa_flags |= SA_NOCLDWAIT;
@@ -596,7 +604,132 @@ sighandler(sig)
     }
 }
 
+#include <stdio.h>
+#ifdef HAVE_STDARG_PROTOTYPES
+#include <stdarg.h>
+#define va_init_list(a,b) va_start(a,b)
+#else
+#include <varargs.h>
+#define va_init_list(a,b) va_start(a)
+#endif
+
+void
+#ifdef HAVE_STDARG_PROTOTYPES
+sig_printf(const char *fmt, ...)
+#else
+  sig_printf(fmt, va_alist)
+     const char *fmt;
+    va_dcl
+#endif
+{
+  char buf[BUFSIZ];
+  va_list args;
+  FILE *out = stderr;
+
+  va_init_list(args, fmt);
+  vfprintf(out, fmt, args);
+  va_end(args);
+  fprintf(out, "\n");
+}
+
+static void
+dump_machine_state(uc)
+     ucontext_t *uc;
+{
+  const char *dump64 =
+    " ----------------- Register state dump ----------------------\n"
+    "rax = 0x%.16x  rbx    = 0x%.16x  rcx = 0x%.16x  rdx = 0x%.16x\n"
+    "rdi = 0x%.16x  rsi    = 0x%.16x  rbp = 0x%.16x  rsp = 0x%.16x\n"
+    "r8  = 0x%.16x  r9     = 0x%.16x  r10 = 0x%.16x  r11 = 0x%.16x\n"
+    "r12 = 0x%.16x  r13    = 0x%.16x  r14 = 0x%.16x  r15 = 0x%.16x\n"
+    "rip = 0x%.16x  rflags = 0x%.16x  cs  = 0x%.16x  fs  = 0x%.16x\n"
+    "gs  = 0x%.16x";
+
+  const char *dump32 =
+    " ----------------- Register state dump -------------------\n"
+    "eax = 0x%.8x  ebx    = 0x%.8x  ecx = 0x%.8x  edx = 0x%.8x\n"
+    "edi = 0x%.8x  esi    = 0x%.8x  ebp = 0x%.8x  esp = 0x%.8x\n"
+    "ss  = 0x%.8x  eflags = 0x%.8x  eip = 0x%.8x  cs  = 0x%.8x\n"
+    "ds  = 0x%.8x  es     = 0x%.8x  fs  = 0x%.8x  gs  = 0x%.8x\n";
+
+#if defined(__LP64__) && defined(__APPLE__)
+  sig_printf(dump64, uc->uc_mcontext->__ss.__rax, uc->uc_mcontext->__ss.__rbx,
+	     uc->uc_mcontext->__ss.__rcx, uc->uc_mcontext->__ss.__rdx, uc->uc_mcontext->__ss.__rdi,
+	     uc->uc_mcontext->__ss.__rsi, uc->uc_mcontext->__ss.__rbp, uc->uc_mcontext->__ss.__rsp,
+	     uc->uc_mcontext->__ss.__r8, uc->uc_mcontext->__ss.__r9, uc->uc_mcontext->__ss.__r10,
+	     uc->uc_mcontext->__ss.__r11, uc->uc_mcontext->__ss.__r12, uc->uc_mcontext->__ss.__r13,
+	     uc->uc_mcontext->__ss.__r14, uc->uc_mcontext->__ss.__r15, uc->uc_mcontext->__ss.__rip,
+	     uc->uc_mcontext->__ss.__rflags, uc->uc_mcontext->__ss.__cs, uc->uc_mcontext->__ss.__fs,
+	     uc->uc_mcontext->__ss.__gs);
+#elif !defined(__LP64__) && defined(__APPLE__)
+  sig_printf(dump32, uc->uc_mcontext->__ss.__eax, uc->uc_mcontext->__ss.__ebx,
+	     uc->uc_mcontext->__ss.__ecx, uc->uc_mcontext->__ss.__edx,
+	     uc->uc_mcontext->__ss.__edi, uc->uc_mcontext->__ss.__esi,
+	     uc->uc_mcontext->__ss.__ebp, uc->uc_mcontext->__ss.__esp,
+	     uc->uc_mcontext->__ss.__ss, uc->uc_mcontext->__ss.__eflags,
+	     uc->uc_mcontext->__ss.__eip, uc->uc_mcontext->__ss.__cs,
+	     uc->uc_mcontext->__ss.__ds, uc->uc_mcontext->__ss.__es,
+	     uc->uc_mcontext->__ss.__fs, uc->uc_mcontext->__ss.__gs);
+#elif defined(__i386__)
+  sig_printf(dump32, uc->uc_mcontext.gregs[REG_EAX], uc->uc_mcontext.gregs[REG_EBX],
+	     uc->uc_mcontext.gregs[REG_ECX], uc->uc_mcontext.gregs[REG_EDX],
+	     uc->uc_mcontext.gregs[REG_EDI], uc->uc_mcontext.gregs[REG_ESI],
+	     uc->uc_mcontext.gregs[REG_EBP], uc->uc_mcontext.gregs[REG_ESP],
+	     uc->uc_mcontext.gregs[REG_SS], uc->uc_mcontext.gregs[REG_EFL],
+	     uc->uc_mcontext.gregs[REG_EIP], uc->uc_mcontext.gregs[REG_EIP],
+	     uc->uc_mcontext.gregs[REG_DS], uc->uc_mcontext.gregs[REG_ES],
+	     uc->uc_mcontext.gregs[REG_FS], uc->uc_mcontext.gregs[REG_FS]);
+#elif defined(__x86_64__)
+  sig_printf(dump64, uc->uc_mcontext.gregs[REG_RAX], uc->uc_mcontext.gregs[REG_RBX],
+	     uc->uc_mcontext.gregs[REG_RCX], uc->uc_mcontext.gregs[REG_RDX],
+	     uc->uc_mcontext.gregs[REG_RDI], uc->uc_mcontext.gregs[REG_RSI],
+	     uc->uc_mcontext.gregs[REG_RBP], uc->uc_mcontext.gregs[REG_RSP],
+	     uc->uc_mcontext.gregs[REG_R8], uc->uc_mcontext.gregs[REG_R9],
+	     uc->uc_mcontext.gregs[REG_R10], uc->uc_mcontext.gregs[REG_R11],
+	     uc->uc_mcontext.gregs[REG_R12], uc->uc_mcontext.gregs[REG_R13],
+	     uc->uc_mcontext.gregs[REG_R14], uc->uc_mcontext.gregs[REG_R15],
+	     uc->uc_mcontext.gregs[REG_RIP], uc->uc_mcontext.gregs[REG_EFL],
+	     uc->uc_mcontext.gregs[REG_CSGSFS]);
+#else
+#endif
+}
+
+static int
+check_guard(caddr_t fault_addr, rb_thread_t th) {
+  if(fault_addr <= (caddr_t)rb_curr_thread->guard &&
+     fault_addr >= (caddr_t)rb_curr_thread->stk_ptr) {
+    return 1;
+  }
+  return 0;
+}
+
 #ifdef SIGBUS
+#ifdef POSIX_SIGNAL
+static void sigbus _((int, siginfo_t*, void*));
+static void
+sigbus(sig, ip, context)
+     int sig;
+     siginfo_t *ip;
+     void *context;
+{
+#if defined(HAVE_NATIVETHREAD) && defined(HAVE_NATIVETHREAD_KILL)
+  if (!is_ruby_native_thread() && !rb_trap_accept_nativethreads[sig]) {
+    sigsend_to_ruby_thread(sig);
+    return;
+  }
+#endif
+
+  dump_machine_state(context);
+  if (check_guard((caddr_t)ip->si_addr, rb_curr_thread)) {
+    /* we hit the guard page, print out a warning to help app developers */
+    rb_bug("Thread stack overflow! Try increasing it!");
+  } else {
+    rb_bug("Bus Error");
+  }
+}
+
+#else /* !defined(POSIX_SIGNAL) */
+
 static RETSIGTYPE sigbus _((int));
 static RETSIGTYPE
 sigbus(sig)
@@ -612,8 +745,36 @@ sigbus(sig)
     rb_bug("Bus Error");
 }
 #endif
+#endif
+
 
 #ifdef SIGSEGV
+#ifdef POSIX_SIGNAL
+static void sigsegv _((int, siginfo_t*, void*));
+static void
+sigsegv(sig, ip, context)
+     int sig;
+     siginfo_t *ip;
+     void *context;
+{
+#if defined(HAVE_NATIVETHREAD) && defined(HAVE_NATIVETHREAD_KILL)
+  if (!is_ruby_native_thread() && !rb_trap_accept_nativethreads[sig]) {
+    sigsend_to_ruby_thread(sig);
+    return;
+  }
+#endif
+
+  dump_machine_state(context);
+  if (check_guard((caddr_t)ip->si_addr, rb_curr_thread)) {
+    /* we hit the guard page, print out a warning to help app developers */
+    rb_bug("Thread stack overflow! Try increasing it!");
+  } else {
+    rb_bug("Segmentation fault");
+  }
+}
+
+#else /* !defined(POSIX_SIGNAL) */
+
 static RETSIGTYPE sigsegv _((int));
 static RETSIGTYPE
 sigsegv(sig)
@@ -629,6 +790,7 @@ sigsegv(sig)
     rb_bug("Segmentation fault");
 }
 #endif
+#endif
 
 #ifdef SIGPIPE
 static RETSIGTYPE sigpipe _((int));
@@ -698,7 +860,8 @@ static VALUE
 trap(arg)
     struct trap_arg *arg;
 {
-    sighandler_t func, oldfunc;
+    sighandler_t oldfunc;
+    void *func;
     VALUE command, oldcmd;
     int sig = -1;
     char *s;
@@ -945,6 +1108,20 @@ sig_list()
 }
 
 static void
+create_sigstack()
+{
+  stack_t ss;
+  ss.ss_size = SIGSTKSZ;
+  ss.ss_sp = malloc(ss.ss_size);
+  ss.ss_flags = 0;
+  if (sigaltstack(&ss, NULL) < 0) {
+    free(ss.ss_sp);
+    fprintf(stderr, "Couldn't create signal stack! Error %d: %s\n", errno, strerror(errno));
+    exit(1);
+  }
+}
+
+static void
 install_sighandler(signum, handler)
     int signum;
     sighandler_t handler;
@@ -953,7 +1130,7 @@ install_sighandler(signum, handler)
 
     old = ruby_signal(signum, handler);
     if (old != SIG_DFL) {
-	ruby_signal(signum, old);
+       ruby_signal(signum, old);
     }
 }
 
@@ -1080,6 +1257,8 @@ Init_signal()
     rb_alias(rb_eSignal, rb_intern("signm"), rb_intern("message"));
     rb_define_method(rb_eInterrupt, "initialize", interrupt_init, 1);
 
+    create_sigstack();
+
     install_sighandler(SIGINT, sighandler);
 #ifdef SIGHUP
     install_sighandler(SIGHUP, sighandler);
src/rvm/patches/ruby/1.8.6/no_sslv2.diff000066400000001252147511530530013626 0ustar00Index: ossl_ssl.c
===================================================================
--- a/ext/openssl/ossl_ssl.c	(revision 32381)
+++ b/ext/openssl/ossl_ssl.c	(revision 32382)
@@ -107,9 +107,12 @@
     OSSL_SSL_METHOD_ENTRY(TLSv1),
     OSSL_SSL_METHOD_ENTRY(TLSv1_server),
     OSSL_SSL_METHOD_ENTRY(TLSv1_client),
+#if defined(HAVE_SSLV2_METHOD) && defined(HAVE_SSLV2_SERVER_METHOD) && \
+        defined(HAVE_SSLV2_CLIENT_METHOD)	
     OSSL_SSL_METHOD_ENTRY(SSLv2),
     OSSL_SSL_METHOD_ENTRY(SSLv2_server),
     OSSL_SSL_METHOD_ENTRY(SSLv2_client),
+#endif
     OSSL_SSL_METHOD_ENTRY(SSLv3),
     OSSL_SSL_METHOD_ENTRY(SSLv3_server),
     OSSL_SSL_METHOD_ENTRY(SSLv3_client),
src/rvm/patches/ruby/2.3.3/random_c_using_NR_prefix.patch000066400000001011147511530530017175 0ustar00--- a/random.c
+++ b/random.c
@@ -521,7 +521,7 @@
     CryptGenRandom(prov, size, seed);
     return 0;
 }
-#elif defined __linux__ && defined SYS_getrandom
+#elif defined __linux__ && defined __NR_getrandom
 #include <linux/random.h>

 # ifndef GRND_NONBLOCK
@@ -538,7 +538,7 @@
 	if (!need_secure)
 	    flags = GRND_NONBLOCK;
 	errno = 0;
-	ret = syscall(SYS_getrandom, seed, size, flags);
+	ret = syscall(__NR_getrandom, seed, size, flags);
 	if (errno == ENOSYS) {
 	    ATOMIC_SET(try_syscall, 0);
 	    return -1;
src/rvm/patches/ruby/2.2.4/fix_installing_bundled_gems.patch000066400000002214147511530530017762 0ustar00--- a/tool/rbinstall.rb
+++ b/tool/rbinstall.rb
@@ -719,15 +719,15 @@ install?(:ext, :comm, :gem) do
     directories = Gem.ensure_gem_subdirectories(gem_dir, :mode => $dir_mode)
     prepare "bundle gems", gem_dir, directories
     Dir.glob(srcdir+'/gems/*.gem').each do |gem|
-      Gem.install gem, Gem::Requirement.default, :install_dir => with_destdir(Gem.dir), :domain => :local, :ignore_dependencies => true
+      Gem.install gem, Gem::Requirement.default, :install_dir => with_destdir(gem_dir), :domain => :local, :ignore_dependencies => true
       gemname = Pathname(gem).basename
       puts "#{" "*30}#{gemname}"
     end
     # fix directory permissions
     # TODO: Gem.install should accept :dir_mode option or something
-    File.chmod($dir_mode, *Dir.glob(with_destdir(Gem.dir)+"/**/"))
+    File.chmod($dir_mode, *Dir.glob(with_destdir(gem_dir)+"/**/"))
     # fix .gemspec permissions
-    File.chmod($data_mode, *Dir.glob(with_destdir(Gem.dir)+"/specifications/*.gemspec"))
+    File.chmod($data_mode, *Dir.glob(with_destdir(gem_dir)+"/specifications/*.gemspec"))
   else
     puts "skip installing bundle gems because of lacking zlib"
   end
src/rvm/patches/ruby/2.2.4/openssl3.patch000066400000002126147511530530014010 0ustar00diff --git a/ext/openssl/extconf.rb b/ext/openssl/extconf.rb
index 8c04cb5..132d803 100644
--- a/ext/openssl/extconf.rb
+++ b/ext/openssl/extconf.rb
@@ -104,6 +104,9 @@
 have_func("SSLv2_method")
 have_func("SSLv2_server_method")
 have_func("SSLv2_client_method")
+have_func("SSLv3_method")
+have_func("SSLv3_server_method")
+have_func("SSLv3_client_method")
 have_func("TLSv1_1_method")
 have_func("TLSv1_1_server_method")
 have_func("TLSv1_1_client_method")
diff --git a/ext/openssl/ossl_ssl.c b/ext/openssl/ossl_ssl.c
index f7cb7f0..47111f6 100644
--- a/ext/openssl/ossl_ssl.c
+++ b/ext/openssl/ossl_ssl.c
@@ -109,9 +109,12 @@ static const struct {
     OSSL_SSL_METHOD_ENTRY(SSLv2_server),
     OSSL_SSL_METHOD_ENTRY(SSLv2_client),
 #endif
+#if defined(HAVE_SSLV3_METHOD) && defined(HAVE_SSLV3_SERVER_METHOD) && \
+        defined(HAVE_SSLV3_CLIENT_METHOD)
     OSSL_SSL_METHOD_ENTRY(SSLv3),
     OSSL_SSL_METHOD_ENTRY(SSLv3_server),
     OSSL_SSL_METHOD_ENTRY(SSLv3_client),
+#endif
     OSSL_SSL_METHOD_ENTRY(SSLv23),
     OSSL_SSL_METHOD_ENTRY(SSLv23_server),
     OSSL_SSL_METHOD_ENTRY(SSLv23_client),
src/rvm/patches/ruby/2.2.9/fix_installing_bundled_gems.patch000066400000002214147511530530017767 0ustar00--- a/tool/rbinstall.rb
+++ b/tool/rbinstall.rb
@@ -719,15 +719,15 @@ install?(:ext, :comm, :gem) do
     directories = Gem.ensure_gem_subdirectories(gem_dir, :mode => $dir_mode)
     prepare "bundle gems", gem_dir, directories
     Dir.glob(srcdir+'/gems/*.gem').each do |gem|
-      Gem.install gem, Gem::Requirement.default, :install_dir => with_destdir(Gem.dir), :domain => :local, :ignore_dependencies => true
+      Gem.install gem, Gem::Requirement.default, :install_dir => with_destdir(gem_dir), :domain => :local, :ignore_dependencies => true
       gemname = Pathname(gem).basename
       puts "#{" "*30}#{gemname}"
     end
     # fix directory permissions
     # TODO: Gem.install should accept :dir_mode option or something
-    File.chmod($dir_mode, *Dir.glob(with_destdir(Gem.dir)+"/**/"))
+    File.chmod($dir_mode, *Dir.glob(with_destdir(gem_dir)+"/**/"))
     # fix .gemspec permissions
-    File.chmod($data_mode, *Dir.glob(with_destdir(Gem.dir)+"/specifications/*.gemspec"))
+    File.chmod($data_mode, *Dir.glob(with_destdir(gem_dir)+"/specifications/*.gemspec"))
   else
     puts "skip installing bundle gems because of lacking zlib"
   end
src/rvm/patches/ruby/2.3.4/random_c_using_NR_prefix.patch000066400000001011147511530530017176 0ustar00--- a/random.c
+++ b/random.c
@@ -521,7 +521,7 @@
     CryptGenRandom(prov, size, seed);
     return 0;
 }
-#elif defined __linux__ && defined SYS_getrandom
+#elif defined __linux__ && defined __NR_getrandom
 #include <linux/random.h>

 # ifndef GRND_NONBLOCK
@@ -538,7 +538,7 @@
 	if (!need_secure)
 	    flags = GRND_NONBLOCK;
 	errno = 0;
-	ret = syscall(SYS_getrandom, seed, size, flags);
+	ret = syscall(__NR_getrandom, seed, size, flags);
 	if (errno == ENOSYS) {
 	    ATOMIC_SET(try_syscall, 0);
 	    return -1;
src/rvm/patches/ruby/2.3.4/fix_rb_thread_fd_close.patch000066400000000403147511530530016675 0ustar00--- ruby_2_3/thread.c  2017/04/09 11:53:53 58288
+++ ruby_2_3/thread.c  2017/04/09 13:26:01 58289
@@ -2187,6 +2187,12 @@
     return busy;
 }

+void
+rb_thread_fd_close(int fd)
+{
+    while (rb_notify_fd_close(fd));
+}
+
 /*
  *  call-seq:
  *     thr.raise
src/rvm/patches/ruby/GH-488.patch000066400000001064147511530530012416 0ustar00--- trunk/ext/openssl/ossl_ssl.c	2013/12/25 01:40:53	44401
+++ trunk/ext/openssl/ossl_ssl.c	2013/12/25 01:42:09	44402
@@ -2229,7 +2229,9 @@
     ossl_ssl_def_const(OP_NETSCAPE_REUSE_CIPHER_CHANGE_BUG);
     ossl_ssl_def_const(OP_SSLREF2_REUSE_CERT_TYPE_BUG);
     ossl_ssl_def_const(OP_MICROSOFT_BIG_SSLV3_BUFFER);
+#if defined(SSL_OP_MSIE_SSLV2_RSA_PADDING)
     ossl_ssl_def_const(OP_MSIE_SSLV2_RSA_PADDING);
+#endif
     ossl_ssl_def_const(OP_SSLEAY_080_CLIENT_DH_BUG);
     ossl_ssl_def_const(OP_TLS_D5_BUG);
     ossl_ssl_def_const(OP_TLS_BLOCK_PADDING_BUG);
src/rvm/patches/ruby/2.2.3/openssl3.patch000066400000003333147511530530014010 0ustar00diff --git a/ext/openssl/extconf.rb b/ext/openssl/extconf.rb
index 8c04cb5..132d803 100644
--- a/ext/openssl/extconf.rb
+++ b/ext/openssl/extconf.rb
@@ -104,6 +104,9 @@
 have_func("SSLv2_method")
 have_func("SSLv2_server_method")
 have_func("SSLv2_client_method")
+have_func("SSLv3_method")
+have_func("SSLv3_server_method")
+have_func("SSLv3_client_method")
 have_func("TLSv1_1_method")
 have_func("TLSv1_1_server_method")
 have_func("TLSv1_1_client_method")
diff --git a/ext/openssl/ossl_ssl.c b/ext/openssl/ossl_ssl.c
index f7cb7f0..47111f6 100644
--- a/ext/openssl/ossl_ssl.c
+++ b/ext/openssl/ossl_ssl.c
@@ -109,9 +109,12 @@ static const struct {
     OSSL_SSL_METHOD_ENTRY(SSLv2_server),
     OSSL_SSL_METHOD_ENTRY(SSLv2_client),
 #endif
+#if defined(HAVE_SSLV3_METHOD) && defined(HAVE_SSLV3_SERVER_METHOD) && \
+        defined(HAVE_SSLV3_CLIENT_METHOD)
     OSSL_SSL_METHOD_ENTRY(SSLv3),
     OSSL_SSL_METHOD_ENTRY(SSLv3_server),
     OSSL_SSL_METHOD_ENTRY(SSLv3_client),
+#endif
     OSSL_SSL_METHOD_ENTRY(SSLv23),
     OSSL_SSL_METHOD_ENTRY(SSLv23_server),
     OSSL_SSL_METHOD_ENTRY(SSLv23_client),
diff --git a/test/openssl/test_ssl.rb b/test/openssl/test_ssl.rb
index 07e081b..0cbfcba 100644
--- a/test/openssl/test_ssl.rb
+++ b/test/openssl/test_ssl.rb
@@ -912,7 +912,7 @@ def test_unset_OP_ALL
   # that has been marked as forbidden, therefore either of these may be raised
   HANDSHAKE_ERRORS = [OpenSSL::SSL::SSLError, Errno::ECONNRESET]

-if OpenSSL::SSL::SSLContext::METHODS.include? :TLSv1
+if OpenSSL::SSL::SSLContext::METHODS.include?(:TLSv1) && OpenSSL::SSL::SSLContext::METHODS.include?(:SSLv3)

   def test_forbid_ssl_v3_for_client
     ctx_proc = Proc.new { |ctx| ctx.options = OpenSSL::SSL::OP_ALL | OpenSSL::SSL::OP_NO_SSLv3 }
src/rvm/patches/ruby/2.2.3/fix_installing_bundled_gems.patch000066400000002214147511530530017761 0ustar00--- a/tool/rbinstall.rb
+++ b/tool/rbinstall.rb
@@ -719,15 +719,15 @@ install?(:ext, :comm, :gem) do
     directories = Gem.ensure_gem_subdirectories(gem_dir, :mode => $dir_mode)
     prepare "bundle gems", gem_dir, directories
     Dir.glob(srcdir+'/gems/*.gem').each do |gem|
-      Gem.install gem, Gem::Requirement.default, :install_dir => with_destdir(Gem.dir), :domain => :local, :ignore_dependencies => true
+      Gem.install gem, Gem::Requirement.default, :install_dir => with_destdir(gem_dir), :domain => :local, :ignore_dependencies => true
       gemname = Pathname(gem).basename
       puts "#{" "*30}#{gemname}"
     end
     # fix directory permissions
     # TODO: Gem.install should accept :dir_mode option or something
-    File.chmod($dir_mode, *Dir.glob(with_destdir(Gem.dir)+"/**/"))
+    File.chmod($dir_mode, *Dir.glob(with_destdir(gem_dir)+"/**/"))
     # fix .gemspec permissions
-    File.chmod($data_mode, *Dir.glob(with_destdir(Gem.dir)+"/specifications/*.gemspec"))
+    File.chmod($data_mode, *Dir.glob(with_destdir(gem_dir)+"/specifications/*.gemspec"))
   else
     puts "skip installing bundle gems because of lacking zlib"
   end
src/rvm/patches/ruby/2.1.0/changeset_r44327.diff000066400000002264147511530530014737 0ustar00--- a/gc.c	(revision 44326)
+++ b/gc.c	(revision 44327)
@@ -5724,17 +5724,19 @@
     if (safe_level > 0) return;
 
     /* RUBY_GC_HEAP_FREE_SLOTS */
-    if (get_envparam_int   ("RUBY_FREE_MIN", &gc_params.heap_free_slots, 0)) {
+    if (get_envparam_int("RUBY_GC_HEAP_FREE_SLOTS", &gc_params.heap_free_slots, 0)) {
+	/* ok */
+    }
+    else if (get_envparam_int("RUBY_FREE_MIN", &gc_params.heap_free_slots, 0)) {
 	rb_warn("RUBY_FREE_MIN is obsolete. Use RUBY_GC_HEAP_FREE_SLOTS instead.");
     }
-    get_envparam_int   ("RUBY_GC_HEAP_FREE_SLOTS", &gc_params.heap_free_slots, 0);
 
     /* RUBY_GC_HEAP_INIT_SLOTS */
-    if (get_envparam_int("RUBY_HEAP_MIN_SLOTS", &gc_params.heap_init_slots, 0)) {
-	rb_warn("RUBY_HEAP_MIN_SLOTS is obsolete. Use RUBY_GC_HEAP_INIT_SLOTS instead.");
+    if (get_envparam_int("RUBY_GC_HEAP_INIT_SLOTS", &gc_params.heap_init_slots, 0)) {
 	gc_set_initial_pages();
     }
-    if (get_envparam_int("RUBY_GC_HEAP_INIT_SLOTS", &gc_params.heap_init_slots, 0)) {
+    else if (get_envparam_int("RUBY_HEAP_MIN_SLOTS", &gc_params.heap_init_slots, 0)) {
+	rb_warn("RUBY_HEAP_MIN_SLOTS is obsolete. Use RUBY_GC_HEAP_INIT_SLOTS instead.");
 	gc_set_initial_pages();
     }
 
src/rvm/patches/ruby/2.1.0/openssl3.patch000066400000003333147511530530014004 0ustar00diff --git a/ext/openssl/extconf.rb b/ext/openssl/extconf.rb
index 8c04cb5..132d803 100644
--- a/ext/openssl/extconf.rb
+++ b/ext/openssl/extconf.rb
@@ -104,6 +104,9 @@
 have_func("SSLv2_method")
 have_func("SSLv2_server_method")
 have_func("SSLv2_client_method")
+have_func("SSLv3_method")
+have_func("SSLv3_server_method")
+have_func("SSLv3_client_method")
 have_func("TLSv1_1_method")
 have_func("TLSv1_1_server_method")
 have_func("TLSv1_1_client_method")
diff --git a/ext/openssl/ossl_ssl.c b/ext/openssl/ossl_ssl.c
index f7cb7f0..47111f6 100644
--- a/ext/openssl/ossl_ssl.c
+++ b/ext/openssl/ossl_ssl.c
@@ -109,9 +109,12 @@ static const struct {
     OSSL_SSL_METHOD_ENTRY(SSLv2_server),
     OSSL_SSL_METHOD_ENTRY(SSLv2_client),
 #endif
+#if defined(HAVE_SSLV3_METHOD) && defined(HAVE_SSLV3_SERVER_METHOD) && \
+        defined(HAVE_SSLV3_CLIENT_METHOD)
     OSSL_SSL_METHOD_ENTRY(SSLv3),
     OSSL_SSL_METHOD_ENTRY(SSLv3_server),
     OSSL_SSL_METHOD_ENTRY(SSLv3_client),
+#endif
     OSSL_SSL_METHOD_ENTRY(SSLv23),
     OSSL_SSL_METHOD_ENTRY(SSLv23_server),
     OSSL_SSL_METHOD_ENTRY(SSLv23_client),
diff --git a/test/openssl/test_ssl.rb b/test/openssl/test_ssl.rb
index 07e081b..0cbfcba 100644
--- a/test/openssl/test_ssl.rb
+++ b/test/openssl/test_ssl.rb
@@ -912,7 +912,7 @@ def test_unset_OP_ALL
   # that has been marked as forbidden, therefore either of these may be raised
   HANDSHAKE_ERRORS = [OpenSSL::SSL::SSLError, Errno::ECONNRESET]

-if OpenSSL::SSL::SSLContext::METHODS.include? :TLSv1
+if OpenSSL::SSL::SSLContext::METHODS.include?(:TLSv1) && OpenSSL::SSL::SSLContext::METHODS.include?(:SSLv3)

   def test_forbid_ssl_v3_for_client
     ctx_proc = Proc.new { |ctx| ctx.options = OpenSSL::SSL::OP_ALL | OpenSSL::SSL::OP_NO_SSLv3 }
src/rvm/patches/ruby/2.1.0/libyaml.patch000066400000055455147511530530013703 0ustar00diff -uw ruby-2.1.0/ext/psych/yaml/api.c ruby-2.1.2/ext/psych/yaml/api.c
--- ruby-2.1.0/ext/psych/yaml/api.c	2012-11-28 05:35:40.000000000 +0100
+++ ruby-2.1.2/ext/psych/yaml/api.c	2014-02-24 05:24:15.000000000 +0100
@@ -395,7 +395,7 @@
     }
     QUEUE_DEL(emitter, emitter->events);
     STACK_DEL(emitter, emitter->indents);
-    while (!STACK_EMPTY(empty, emitter->tag_directives)) {
+    while (!STACK_EMPTY(emitter, emitter->tag_directives)) {
         yaml_tag_directive_t tag_directive = POP(emitter, emitter->tag_directives);
         yaml_free(tag_directive.handle);
         yaml_free(tag_directive.prefix);
@@ -822,6 +822,7 @@
     yaml_char_t *anchor_copy = NULL;
     yaml_char_t *tag_copy = NULL;
     yaml_char_t *value_copy = NULL;
+    size_t value_length;
 
     assert(event);      /* Non-NULL event object is expected. */
     assert(value);      /* Non-NULL anchor is expected. */
@@ -839,16 +840,19 @@
     }
 
     if (length < 0) {
-        length = strlen((char *)value);
+        value_length = strlen((char *)value);
+    }
+    else {
+        value_length = (size_t)length;
     }
 
-    if (!yaml_check_utf8(value, length)) goto error;
-    value_copy = yaml_malloc(length+1);
+    if (!yaml_check_utf8(value, value_length)) goto error;
+    value_copy = yaml_malloc(value_length+1);
     if (!value_copy) goto error;
-    memcpy(value_copy, value, length);
-    value_copy[length] = '\0';
+    memcpy(value_copy, value, value_length);
+    value_copy[value_length] = '\0';
 
-    SCALAR_EVENT_INIT(*event, anchor_copy, tag_copy, value_copy, length,
+    SCALAR_EVENT_INIT(*event, anchor_copy, tag_copy, value_copy, value_length,
             plain_implicit, quoted_implicit, style, mark, mark);
 
     return 1;
@@ -1202,6 +1206,8 @@
     yaml_char_t *tag_copy = NULL;
     yaml_char_t *value_copy = NULL;
     yaml_node_t node;
+    size_t value_length;
+    ptrdiff_t ret;
 
     assert(document);   /* Non-NULL document object is expected. */
     assert(value);      /* Non-NULL value is expected. */
@@ -1215,19 +1221,26 @@
     if (!tag_copy) goto error;
 
     if (length < 0) {
-        length = strlen((char *)value);
+        value_length = strlen((char *)value);
+    }
+    else {
+        value_length = (size_t)length;
     }
 
-    if (!yaml_check_utf8(value, length)) goto error;
-    value_copy = yaml_malloc(length+1);
+    if (!yaml_check_utf8(value, value_length)) goto error;
+    value_copy = yaml_malloc(value_length+1);
     if (!value_copy) goto error;
-    memcpy(value_copy, value, length);
-    value_copy[length] = '\0';
+    memcpy(value_copy, value, value_length);
+    value_copy[value_length] = '\0';
 
-    SCALAR_NODE_INIT(node, tag_copy, value_copy, length, style, mark, mark);
+    SCALAR_NODE_INIT(node, tag_copy, value_copy, value_length, style, mark, mark);
     if (!PUSH(&context, document->nodes, node)) goto error;
 
-    return document->nodes.top - document->nodes.start;
+    ret = document->nodes.top - document->nodes.start;
+#if PTRDIFF_MAX > INT_MAX
+    if (ret > INT_MAX) goto error;
+#endif
+    return (int)ret;
 
 error:
     yaml_free(tag_copy);
@@ -1255,6 +1268,7 @@
         yaml_node_item_t *top;
     } items = { NULL, NULL, NULL };
     yaml_node_t node;
+    ptrdiff_t ret;
 
     assert(document);   /* Non-NULL document object is expected. */
 
@@ -1272,7 +1286,11 @@
             style, mark, mark);
     if (!PUSH(&context, document->nodes, node)) goto error;
 
-    return document->nodes.top - document->nodes.start;
+    ret = document->nodes.top - document->nodes.start;
+#if PTRDIFF_MAX > INT_MAX
+    if (ret > INT_MAX) goto error;
+#endif
+    return (int)ret;
 
 error:
     STACK_DEL(&context, items);
@@ -1300,6 +1318,7 @@
         yaml_node_pair_t *top;
     } pairs = { NULL, NULL, NULL };
     yaml_node_t node;
+    ptrdiff_t ret;
 
     assert(document);   /* Non-NULL document object is expected. */
 
@@ -1317,7 +1336,11 @@
             style, mark, mark);
     if (!PUSH(&context, document->nodes, node)) goto error;
 
-    return document->nodes.top - document->nodes.start;
+    ret = document->nodes.top - document->nodes.start;
+#if PTRDIFF_MAX > INT_MAX
+    if (ret > INT_MAX) goto error;
+#endif
+    return (int)ret;
 
 error:
     STACK_DEL(&context, pairs);
diff -uw ruby-2.1.0/ext/psych/yaml/config.h ruby-2.1.2/ext/psych/yaml/config.h
--- ruby-2.1.0/ext/psych/yaml/config.h	2012-12-01 04:58:39.000000000 +0100
+++ ruby-2.1.2/ext/psych/yaml/config.h	2014-05-04 17:45:33.000000000 +0200
@@ -1,11 +1,10 @@
-
 #define PACKAGE_NAME "yaml"
 #define PACKAGE_TARNAME "yaml"
-#define PACKAGE_VERSION "0.1.4"
-#define PACKAGE_STRING "yaml 0.1.4"
+#define PACKAGE_VERSION "0.1.6"
+#define PACKAGE_STRING "yaml 0.1.6"
 #define PACKAGE_BUGREPORT "http://pyyaml.org/newticket?component libyaml"
 #define PACKAGE_URL ""
 #define YAML_VERSION_MAJOR 0
 #define YAML_VERSION_MINOR 1
-#define YAML_VERSION_PATCH 4
-#define YAML_VERSION_STRING "0.1.4"
+#define YAML_VERSION_PATCH 6
+#define YAML_VERSION_STRING "0.1.6"
diff -uw ruby-2.1.0/ext/psych/yaml/emitter.c ruby-2.1.2/ext/psych/yaml/emitter.c
--- ruby-2.1.0/ext/psych/yaml/emitter.c	2013-12-14 02:19:06.000000000 +0100
+++ ruby-2.1.2/ext/psych/yaml/emitter.c	2014-02-24 05:24:15.000000000 +0100
@@ -53,7 +53,7 @@
 #define WRITE_BREAK(emitter,string)                                             \
     (FLUSH(emitter)                                                             \
      && (CHECK(string,'\n') ?                                                   \
-         (PUT_BREAK(emitter),                                                   \
+         ((void)PUT_BREAK(emitter),                                             \
           string.pointer ++,                                                    \
           1) :                                                                  \
          (COPY(emitter->buffer,string),                                         \
@@ -1493,7 +1493,7 @@
     int break_space = 0;
     int space_break = 0;
 
-    int preceded_by_whitespace = 0;
+    int preceeded_by_whitespace = 0;
     int followed_by_whitespace = 0;
     int previous_space = 0;
     int previous_break = 0;
@@ -1524,7 +1524,7 @@
         flow_indicators = 1;
     }
 
-    preceded_by_whitespace = 1;
+    preceeded_by_whitespace = 1;
     followed_by_whitespace = IS_BLANKZ_AT(string, WIDTH(string));
 
     while (string.pointer != string.end)
@@ -1570,7 +1570,7 @@
                 }
             }
 
-            if (CHECK(string, '#') && preceded_by_whitespace) {
+            if (CHECK(string, '#') && preceeded_by_whitespace) {
                 flow_indicators = 1;
                 block_indicators = 1;
             }
@@ -1619,7 +1619,7 @@
             previous_break = 0;
         }
 
-        preceded_by_whitespace = IS_BLANKZ(string);
+        preceeded_by_whitespace = IS_BLANKZ(string);
         MOVE(string);
         if (string.pointer != string.end) {
             followed_by_whitespace = IS_BLANKZ_AT(string, WIDTH(string));
diff -uw ruby-2.1.0/ext/psych/yaml/loader.c ruby-2.1.2/ext/psych/yaml/loader.c
--- ruby-2.1.0/ext/psych/yaml/loader.c	2012-11-28 05:35:40.000000000 +0100
+++ ruby-2.1.2/ext/psych/yaml/loader.c	2014-02-24 05:24:15.000000000 +0100
@@ -283,9 +283,12 @@
 yaml_parser_load_scalar(yaml_parser_t *parser, yaml_event_t *first_event)
 {
     yaml_node_t node;
+    ptrdiff_t node_index;
     int index;
     yaml_char_t *tag = first_event->data.scalar.tag;
 
+    if (!STACK_LIMIT(parser, parser->document->nodes, INT_MAX-1)) goto error;
+
     if (!tag || strcmp((char *)tag, "!") == 0) {
         yaml_free(tag);
         tag = yaml_strdup((yaml_char_t *)YAML_DEFAULT_SCALAR_TAG);
@@ -298,7 +301,11 @@
 
     if (!PUSH(parser, parser->document->nodes, node)) goto error;
 
-    index = parser->document->nodes.top - parser->document->nodes.start;
+    node_index = parser->document->nodes.top - parser->document->nodes.start;
+#if PTRDIFF_MAX > INT_MAX
+    if (node_index > INT_MAX) goto error;
+#endif
+    index = (int)node_index;
 
     if (!yaml_parser_register_anchor(parser, index,
                 first_event->data.scalar.anchor)) return 0;
@@ -327,8 +334,11 @@
         yaml_node_item_t *top;
     } items = { NULL, NULL, NULL };
     int index, item_index;
+    ptrdiff_t node_index;
     yaml_char_t *tag = first_event->data.sequence_start.tag;
 
+    if (!STACK_LIMIT(parser, parser->document->nodes, INT_MAX-1)) goto error;
+
     if (!tag || strcmp((char *)tag, "!") == 0) {
         yaml_free(tag);
         tag = yaml_strdup((yaml_char_t *)YAML_DEFAULT_SEQUENCE_TAG);
@@ -343,7 +353,11 @@
 
     if (!PUSH(parser, parser->document->nodes, node)) goto error;
 
-    index = parser->document->nodes.top - parser->document->nodes.start;
+    node_index = parser->document->nodes.top - parser->document->nodes.start;
+#if PTRDIFF_MAX > INT_MAX
+    if (node_index > INT_MAX) goto error;
+#endif
+    index = (int)node_index;
 
     if (!yaml_parser_register_anchor(parser, index,
                 first_event->data.sequence_start.anchor)) return 0;
@@ -351,6 +365,9 @@
     if (!yaml_parser_parse(parser, &event)) return 0;
 
     while (event.type != YAML_SEQUENCE_END_EVENT) {
+        if (!STACK_LIMIT(parser,
+                    parser->document->nodes.start[index-1].data.sequence.items,
+                    INT_MAX-1)) return 0;
         item_index = yaml_parser_load_node(parser, &event);
         if (!item_index) return 0;
         if (!PUSH(parser,
@@ -384,9 +401,12 @@
         yaml_node_pair_t *top;
     } pairs = { NULL, NULL, NULL };
     int index;
+    ptrdiff_t node_index;
     yaml_node_pair_t pair;
     yaml_char_t *tag = first_event->data.mapping_start.tag;
 
+    if (!STACK_LIMIT(parser, parser->document->nodes, INT_MAX-1)) goto error;
+
     if (!tag || strcmp((char *)tag, "!") == 0) {
         yaml_free(tag);
         tag = yaml_strdup((yaml_char_t *)YAML_DEFAULT_MAPPING_TAG);
@@ -401,7 +421,11 @@
 
     if (!PUSH(parser, parser->document->nodes, node)) goto error;
 
-    index = parser->document->nodes.top - parser->document->nodes.start;
+    node_index = parser->document->nodes.top - parser->document->nodes.start;
+#if PTRDIFF_MAX > INT_MAX
+    if (node_index > INT_MAX) goto error;
+#endif
+    index = (int)node_index;
 
     if (!yaml_parser_register_anchor(parser, index,
                 first_event->data.mapping_start.anchor)) return 0;
@@ -409,6 +433,9 @@
     if (!yaml_parser_parse(parser, &event)) return 0;
 
     while (event.type != YAML_MAPPING_END_EVENT) {
+        if (!STACK_LIMIT(parser,
+                    parser->document->nodes.start[index-1].data.mapping.pairs,
+                    INT_MAX-1)) return 0;
         pair.key = yaml_parser_load_node(parser, &event);
         if (!pair.key) return 0;
         if (!yaml_parser_parse(parser, &event)) return 0;
diff -uw ruby-2.1.0/ext/psych/yaml/parser.c ruby-2.1.2/ext/psych/yaml/parser.c
--- ruby-2.1.0/ext/psych/yaml/parser.c	2012-12-05 05:08:17.000000000 +0100
+++ ruby-2.1.2/ext/psych/yaml/parser.c	2014-02-24 05:24:15.000000000 +0100
@@ -759,9 +759,8 @@
 
     else if (token->type == YAML_BLOCK_END_TOKEN)
     {
-        yaml_mark_t dummy_mark;     /* Used to eliminate a compiler warning. */
         parser->state = POP(parser, parser->states);
-        dummy_mark = POP(parser, parser->marks);
+        (void)POP(parser, parser->marks);
         SEQUENCE_END_EVENT_INIT(*event, token->start_mark, token->end_mark);
         SKIP_TOKEN(parser);
         return 1;
@@ -869,9 +868,8 @@
 
     else if (token->type == YAML_BLOCK_END_TOKEN)
     {
-        yaml_mark_t dummy_mark;     /* Used to eliminate a compiler warning. */
         parser->state = POP(parser, parser->states);
-        dummy_mark = POP(parser, parser->marks);
+        (void)POP(parser, parser->marks);
         MAPPING_END_EVENT_INIT(*event, token->start_mark, token->end_mark);
         SKIP_TOKEN(parser);
         return 1;
@@ -952,7 +950,6 @@
         yaml_event_t *event, int first)
 {
     yaml_token_t *token;
-    yaml_mark_t dummy_mark;     /* Used to eliminate a compiler warning. */
 
     if (first) {
         token = PEEK_TOKEN(parser);
@@ -997,7 +994,7 @@
     }
 
     parser->state = POP(parser, parser->states);
-    dummy_mark = POP(parser, parser->marks);
+    (void)POP(parser, parser->marks);
     SEQUENCE_END_EVENT_INIT(*event, token->start_mark, token->end_mark);
     SKIP_TOKEN(parser);
     return 1;
@@ -1104,7 +1101,6 @@
         yaml_event_t *event, int first)
 {
     yaml_token_t *token;
-    yaml_mark_t dummy_mark;     /* Used to eliminate a compiler warning. */
 
     if (first) {
         token = PEEK_TOKEN(parser);
@@ -1158,7 +1154,7 @@
     }
 
     parser->state = POP(parser, parser->states);
-    dummy_mark = POP(parser, parser->marks);
+    (void)POP(parser, parser->marks);
     MAPPING_END_EVENT_INIT(*event, token->start_mark, token->end_mark);
     SKIP_TOKEN(parser);
     return 1;
diff -uw ruby-2.1.0/ext/psych/yaml/reader.c ruby-2.1.2/ext/psych/yaml/reader.c
--- ruby-2.1.0/ext/psych/yaml/reader.c	2012-12-05 05:08:17.000000000 +0100
+++ ruby-2.1.2/ext/psych/yaml/reader.c	2014-02-24 05:24:15.000000000 +0100
@@ -460,6 +460,10 @@
 
     }
 
+    if (parser->offset >= PTRDIFF_MAX)
+        return yaml_parser_set_reader_error(parser, "input is too long",
+                PTRDIFF_MAX, -1);
+
     return 1;
 }
 
diff -uw ruby-2.1.0/ext/psych/yaml/scanner.c ruby-2.1.2/ext/psych/yaml/scanner.c
--- ruby-2.1.0/ext/psych/yaml/scanner.c	2013-01-13 08:47:10.000000000 +0100
+++ ruby-2.1.2/ext/psych/yaml/scanner.c	2014-05-04 17:45:33.000000000 +0200
@@ -615,11 +615,11 @@
  */
 
 static int
-yaml_parser_roll_indent(yaml_parser_t *parser, int column,
-        int number, yaml_token_type_t type, yaml_mark_t mark);
+yaml_parser_roll_indent(yaml_parser_t *parser, ptrdiff_t column,
+        ptrdiff_t number, yaml_token_type_t type, yaml_mark_t mark);
 
 static int
-yaml_parser_unroll_indent(yaml_parser_t *parser, int column);
+yaml_parser_unroll_indent(yaml_parser_t *parser, ptrdiff_t column);
 
 /*
  * Token fetchers.
@@ -1103,7 +1103,7 @@
      */
 
     int required = (!parser->flow_level
-            && parser->indent == (int)parser->mark.column);
+            && parser->indent == (ptrdiff_t)parser->mark.column);
 
     /*
      * A simple key is required only when it is the first token in the current
@@ -1176,6 +1176,11 @@
 
     /* Increase the flow level. */
 
+    if (parser->flow_level == INT_MAX) {
+        parser->error = YAML_MEMORY_ERROR;
+        return 0;
+    }
+
     parser->flow_level++;
 
     return 1;
@@ -1188,11 +1193,9 @@
 static int
 yaml_parser_decrease_flow_level(yaml_parser_t *parser)
 {
-    yaml_simple_key_t dummy_key;    /* Used to eliminate a compiler warning. */
-
     if (parser->flow_level) {
         parser->flow_level --;
-        dummy_key = POP(parser, parser->simple_keys);
+        (void)POP(parser, parser->simple_keys);
     }
 
     return 1;
@@ -1206,8 +1209,8 @@
  */
 
 static int
-yaml_parser_roll_indent(yaml_parser_t *parser, int column,
-        int number, yaml_token_type_t type, yaml_mark_t mark)
+yaml_parser_roll_indent(yaml_parser_t *parser, ptrdiff_t column,
+        ptrdiff_t number, yaml_token_type_t type, yaml_mark_t mark)
 {
     yaml_token_t token;
 
@@ -1226,7 +1229,14 @@
         if (!PUSH(parser, parser->indents, parser->indent))
             return 0;
 
-        parser->indent = column;
+#if PTRDIFF_MAX > INT_MAX
+        if (column > INT_MAX) {
+            parser->error = YAML_MEMORY_ERROR;
+            return 0;
+        }
+#endif
+
+        parser->indent = (int)column;
 
         /* Create a token and insert it into the queue. */
 
@@ -1248,13 +1258,13 @@
 
 /*
  * Pop indentation levels from the indents stack until the current level
- * becomes less or equal to the column.  For each indentation level, append
+ * becomes less or equal to the column.  For each intendation level, append
  * the BLOCK-END token.
  */
 
 
 static int
-yaml_parser_unroll_indent(yaml_parser_t *parser, int column)
+yaml_parser_unroll_indent(yaml_parser_t *parser, ptrdiff_t column)
 {
     yaml_token_t token;
 
@@ -1263,7 +1273,7 @@
     if (parser->flow_level)
         return 1;
 
-    /* Loop through the indentation levels in the stack. */
+    /* Loop through the intendation levels in the stack. */
 
     while (parser->indent > column)
     {
@@ -2574,7 +2584,7 @@
 
     /* Resize the string to include the head. */
 
-    while (string.end - string.start <= (int)length) {
+    while ((size_t)(string.end - string.start) <= length) {
         if (!yaml_string_extend(&string.start, &string.pointer, &string.end)) {
             parser->error = YAML_MEMORY_ERROR;
             goto error;
@@ -2619,6 +2629,9 @@
         /* Check if it is a URI-escape sequence. */
 
         if (CHECK(parser->buffer, '%')) {
+            if (!STRING_EXTEND(parser, string))
+                goto error;
+
             if (!yaml_parser_scan_uri_escapes(parser,
                         directive, start_mark, &string)) goto error;
         }
@@ -2769,15 +2782,15 @@
 
         if (IS_DIGIT(parser->buffer))
         {
-            /* Check that the indentation is greater than 0. */
+            /* Check that the intendation is greater than 0. */
 
             if (CHECK(parser->buffer, '0')) {
                 yaml_parser_set_scanner_error(parser, "while scanning a block scalar",
-                        start_mark, "found an indentation indicator equal to 0");
+                        start_mark, "found an intendation indicator equal to 0");
                 goto error;
             }
 
-            /* Get the indentation level and eat the indicator. */
+            /* Get the intendation level and eat the indicator. */
 
             increment = AS_DIGIT(parser->buffer);
 
@@ -2791,7 +2804,7 @@
     {
         if (CHECK(parser->buffer, '0')) {
             yaml_parser_set_scanner_error(parser, "while scanning a block scalar",
-                    start_mark, "found an indentation indicator equal to 0");
+                    start_mark, "found an intendation indicator equal to 0");
             goto error;
         }
 
@@ -2841,7 +2854,7 @@
 
     end_mark = parser->mark;
 
-    /* Set the indentation level if it was specified. */
+    /* Set the intendation level if it was specified. */
 
     if (increment) {
         indent = parser->indent >= 0 ? parser->indent+increment : increment;
@@ -2907,7 +2920,7 @@
 
         if (!READ_LINE(parser, leading_break)) goto error;
 
-        /* Eat the following indentation spaces and line breaks. */
+        /* Eat the following intendation spaces and line breaks. */
 
         if (!yaml_parser_scan_block_scalar_breaks(parser,
                     &indent, &trailing_breaks, start_mark, &end_mark)) goto error;
@@ -2942,8 +2955,8 @@
 }
 
 /*
- * Scan indentation spaces and line breaks for a block scalar.  Determine the
- * indentation level if needed.
+ * Scan intendation spaces and line breaks for a block scalar.  Determine the
+ * intendation level if needed.
  */
 
 static int
@@ -2955,11 +2968,11 @@
 
     *end_mark = parser->mark;
 
-    /* Eat the indentation spaces and line breaks. */
+    /* Eat the intendation spaces and line breaks. */
 
     while (1)
     {
-        /* Eat the indentation spaces. */
+        /* Eat the intendation spaces. */
 
         if (!CACHE(parser, 1)) return 0;
 
@@ -2972,12 +2985,12 @@
         if ((int)parser->mark.column > max_indent)
             max_indent = (int)parser->mark.column;
 
-        /* Check for a tab character messing the indentation. */
+        /* Check for a tab character messing the intendation. */
 
         if ((!*indent || (int)parser->mark.column < *indent)
                 && IS_TAB(parser->buffer)) {
             return yaml_parser_set_scanner_error(parser, "while scanning a block scalar",
-                    start_mark, "found a tab character where an indentation space is expected");
+                    start_mark, "found a tab character where an intendation space is expected");
         }
 
         /* Have we found a non-empty line? */
@@ -3498,12 +3511,12 @@
         {
             if (IS_BLANK(parser->buffer))
             {
-                /* Check for tab character that abuse indentation. */
+                /* Check for tab character that abuse intendation. */
 
                 if (leading_blanks && (int)parser->mark.column < indent
                         && IS_TAB(parser->buffer)) {
                     yaml_parser_set_scanner_error(parser, "while scanning a plain scalar",
-                            start_mark, "found a tab character that violates indentation");
+                            start_mark, "found a tab character that violate intendation");
                     goto error;
                 }
 
@@ -3536,7 +3549,7 @@
             if (!CACHE(parser, 1)) goto error;
         }
 
-        /* Check indentation level. */
+        /* Check intendation level. */
 
         if (!parser->flow_level && (int)parser->mark.column < indent)
             break;
diff -uw ruby-2.1.0/ext/psych/yaml/yaml_private.h ruby-2.1.2/ext/psych/yaml/yaml_private.h
--- ruby-2.1.0/ext/psych/yaml/yaml_private.h	2012-12-05 05:08:17.000000000 +0100
+++ ruby-2.1.2/ext/psych/yaml/yaml_private.h	2014-05-04 17:45:33.000000000 +0200
@@ -10,6 +10,17 @@
 
 #include <assert.h>
 #include <limits.h>
+#include <stddef.h>
+
+#ifndef _MSC_VER
+#include <stdint.h>
+#else
+#ifdef _WIN64
+#define PTRDIFF_MAX _I64_MAX
+#else
+#define PTRDIFF_MAX INT_MAX
+#endif
+#endif
 
 /*
  * Memory management.
@@ -135,9 +146,12 @@
      (string).start = (string).pointer = (string).end = 0)
 
 #define STRING_EXTEND(context,string)                                           \
-    (((string).pointer+5 < (string).end)                                        \
+    ((((string).pointer+5 < (string).end)                                       \
         || yaml_string_extend(&(string).start,                                  \
-            &(string).pointer, &(string).end))
+            &(string).pointer, &(string).end)) ?                                \
+         1 :                                                                    \
+        ((context)->error = YAML_MEMORY_ERROR,                                  \
+         0))
 
 #define CLEAR(context,string)                                                   \
     ((string).pointer = (string).start,                                         \
@@ -422,7 +436,14 @@
      (stack).start = (stack).top = (stack).end = 0)
 
 #define STACK_EMPTY(context,stack)                                              \
-    ((stack).start == (stack).top)
+    ((void)(context),                                                           \
+     ((stack).start == (stack).top))
+
+#define STACK_LIMIT(context,stack,size)                                         \
+    ((stack).top - (stack).start < (size) ?                                     \
+        1 :                                                                     \
+        ((context)->error = YAML_MEMORY_ERROR,                                  \
+         0))
 
 #define PUSH(context,stack,value)                                               \
     (((stack).top != (stack).end                                                \
src/rvm/patches/ruby/2.2.7/fix_installing_bundled_gems.patch000066400000002214147511530530017765 0ustar00--- a/tool/rbinstall.rb
+++ b/tool/rbinstall.rb
@@ -719,15 +719,15 @@ install?(:ext, :comm, :gem) do
     directories = Gem.ensure_gem_subdirectories(gem_dir, :mode => $dir_mode)
     prepare "bundle gems", gem_dir, directories
     Dir.glob(srcdir+'/gems/*.gem').each do |gem|
-      Gem.install gem, Gem::Requirement.default, :install_dir => with_destdir(Gem.dir), :domain => :local, :ignore_dependencies => true
+      Gem.install gem, Gem::Requirement.default, :install_dir => with_destdir(gem_dir), :domain => :local, :ignore_dependencies => true
       gemname = Pathname(gem).basename
       puts "#{" "*30}#{gemname}"
     end
     # fix directory permissions
     # TODO: Gem.install should accept :dir_mode option or something
-    File.chmod($dir_mode, *Dir.glob(with_destdir(Gem.dir)+"/**/"))
+    File.chmod($dir_mode, *Dir.glob(with_destdir(gem_dir)+"/**/"))
     # fix .gemspec permissions
-    File.chmod($data_mode, *Dir.glob(with_destdir(Gem.dir)+"/specifications/*.gemspec"))
+    File.chmod($data_mode, *Dir.glob(with_destdir(gem_dir)+"/specifications/*.gemspec"))
   else
     puts "skip installing bundle gems because of lacking zlib"
   end
src/rvm/patches/ruby/2.3.0/random_c_using_NR_prefix.patch000066400000001011147511530530017172 0ustar00--- a/random.c
+++ b/random.c
@@ -521,7 +521,7 @@
     CryptGenRandom(prov, size, seed);
     return 0;
 }
-#elif defined __linux__ && defined SYS_getrandom
+#elif defined __linux__ && defined __NR_getrandom
 #include <linux/random.h>

 # ifndef GRND_NONBLOCK
@@ -538,7 +538,7 @@
 	if (!need_secure)
 	    flags = GRND_NONBLOCK;
 	errno = 0;
-	ret = syscall(SYS_getrandom, seed, size, flags);
+	ret = syscall(__NR_getrandom, seed, size, flags);
 	if (errno == ENOSYS) {
 	    ATOMIC_SET(try_syscall, 0);
 	    return -1;
src/rvm/patches/ruby/2.3.0/fix_resolv_kernel32_dll.patch000066400000000445147511530530016761 0ustar00--- a/ext/win32/lib/win32/resolv.rb
+++ b/ext/win32/lib/win32/resolv.rb
@@ -36,7 +36,7 @@
 
 module Kernel32
   extend Importer
-  dlload "kernel32"
+  dlload "kernel32.dll"
 end
 getv = Kernel32.extern "int GetVersionExA(void *)", :stdcall
 info = [ 148, 0, 0, 0, 0 ].pack('V5') + "\0" * 128
src/rvm/patches/ruby/1.8.5/fix-irb-completion.diff000066400000000673147511530530015575 0ustar00diff --git a/lib/irb/completion.rb b/lib/irb/completion.rb
index 000658e..609dca3 100644
--- a/lib/irb/completion.rb
+++ b/lib/irb/completion.rb
@@ -157,7 +157,7 @@ module IRB
 	    end
 	    next if name != "IRB::Context" and 
 	      /^(IRB|SLex|RubyLex|RubyToken)/ =~ name
-	    candidates.concat m.instance_methods(false)
+	    candidates.concat m.instance_methods(false).map { |m| m.to_s }
 	  }
 	  candidates.sort!
 	  candidates.uniq!
src/rvm/patches/ruby/1.8.5/no_sslv2.diff000066400000001252147511530530013625 0ustar00Index: ossl_ssl.c
===================================================================
--- a/ext/openssl/ossl_ssl.c	(revision 32381)
+++ b/ext/openssl/ossl_ssl.c	(revision 32382)
@@ -107,9 +107,12 @@
     OSSL_SSL_METHOD_ENTRY(TLSv1),
     OSSL_SSL_METHOD_ENTRY(TLSv1_server),
     OSSL_SSL_METHOD_ENTRY(TLSv1_client),
+#if defined(HAVE_SSLV2_METHOD) && defined(HAVE_SSLV2_SERVER_METHOD) && \
+        defined(HAVE_SSLV2_CLIENT_METHOD)	
     OSSL_SSL_METHOD_ENTRY(SSLv2),
     OSSL_SSL_METHOD_ENTRY(SSLv2_server),
     OSSL_SSL_METHOD_ENTRY(SSLv2_client),
+#endif
     OSSL_SSL_METHOD_ENTRY(SSLv3),
     OSSL_SSL_METHOD_ENTRY(SSLv3_server),
     OSSL_SSL_METHOD_ENTRY(SSLv3_client),
src/rvm/patches/ruby/1.8.5/math_gcc_fix.diff000066400000000444147511530530014475 0ustar00--- ruby-1.8.5-p231/math.c	2007-02-13 00:01:19.000000000 +0100
+++ ruby-1.8.6-p420/math.c	2008-07-02 11:25:48.000000000 +0200
@@ -34,7 +34,7 @@
 	if (isnan(x)) {
 #if defined(EDOM)
 	    errno = EDOM;
-#elif define(ERANGE)
+#elif defined(ERANGE)
 	    errno = ERANGE;
 #endif
 	    continue;
src/rvm/patches/ruby/1.8.5/openssl-1.0.patch000066400000016005147511530530014230 0ustar00From 46b84175dfac14a92fd6bcf3b03bc3c3715ab6cb Mon Sep 17 00:00:00 2001
From: nahi <nahi@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>
Date: Sat, 6 Mar 2010 21:47:30 +0000
Subject: [PATCH] backport the commit from trunk:
 Sun Feb 28 11:49:35 2010  NARUSE, Yui  <naruse@ruby-lang.org>

        * openssl/ossl.c (OSSL_IMPL_SK2ARY): for OpenSSL 1.0.
          patched by Jeroen van Meeuwen at [ruby-core:25210]
          fixed by Nobuyoshi Nakada [ruby-core:25238],
          Hongli Lai [ruby-core:27417],
          and Motohiro KOSAKI [ruby-core:28063]

        * ext/openssl/ossl_ssl.c (ossl_ssl_method_tab),
          (ossl_ssl_cipher_to_ary): constified.

        * ext/openssl/ossl_pkcs7.c (pkcs7_get_certs, pkcs7_get_crls):
          split pkcs7_get_certs_or_crls.


git-svn-id: http://svn.ruby-lang.org/repos/ruby/branches/ruby_1_8@26838 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
---
 ext/openssl/ossl.c          |    6 +++---
 ext/openssl/ossl.h          |    7 +++++++
 ext/openssl/ossl_pkcs7.c    |   40 ++++++++++++++++++++++++++++++----------
 ext/openssl/ossl_ssl.c      |    4 ++--
 ext/openssl/ossl_x509attr.c |    5 +++--
 ext/openssl/ossl_x509crl.c  |    4 ++--
 6 files changed, 47 insertions(+), 19 deletions(-)

diff --git a/ext/openssl/ossl.c b/ext/openssl/ossl.c
index d4a2dc1..85ba654 100644
--- a/ext/openssl/ossl.c
+++ b/ext/openssl/ossl.c
@@ -92,7 +92,7 @@ ossl_x509_ary2sk(VALUE ary)
 
 #define OSSL_IMPL_SK2ARY(name, type)	        \
 VALUE						\
-ossl_##name##_sk2ary(STACK *sk)			\
+ossl_##name##_sk2ary(STACK_OF(type) *sk)	\
 {						\
     type *t;					\
     int i, num;					\
@@ -102,7 +102,7 @@ ossl_##name##_sk2ary(STACK *sk)			\
 	OSSL_Debug("empty sk!");		\
 	return Qnil;				\
     }						\
-    num = sk_num(sk);				\
+    num = sk_##type##_num(sk);			\
     if (num < 0) {				\
 	OSSL_Debug("items in sk < -1???");	\
 	return rb_ary_new();			\
@@ -110,7 +110,7 @@ ossl_##name##_sk2ary(STACK *sk)			\
     ary = rb_ary_new2(num);			\
 						\
     for (i=0; i<num; i++) {			\
-	t = (type *)sk_value(sk, i);		\
+	t = sk_##type##_value(sk, i);		\
 	rb_ary_push(ary, ossl_##name##_new(t));	\
     }						\
     return ary;					\
diff --git a/ext/openssl/ossl.h b/ext/openssl/ossl.h
index 9215dc4..d0edb7d 100644
--- a/ext/openssl/ossl.h
+++ b/ext/openssl/ossl.h
@@ -108,6 +108,13 @@ extern VALUE eOSSLError;
 } while (0)
 
 /*
+ * Compatibility
+ */
+#if OPENSSL_VERSION_NUMBER >= 0x10000000L
+#define STACK _STACK
+#endif
+
+/*
  * String to HEXString conversion
  */
 int string2hex(const unsigned char *, int, char **, int *);
diff --git a/ext/openssl/ossl_pkcs7.c b/ext/openssl/ossl_pkcs7.c
index fe1ef7c..b0cc656 100644
--- a/ext/openssl/ossl_pkcs7.c
+++ b/ext/openssl/ossl_pkcs7.c
@@ -572,12 +572,11 @@ ossl_pkcs7_add_certificate(VALUE self, VALUE cert)
     return self;
 }
 
-static STACK *
-pkcs7_get_certs_or_crls(VALUE self, int want_certs)
+static STACK_OF(X509) *
+pkcs7_get_certs(VALUE self)
 {
     PKCS7 *pkcs7;
     STACK_OF(X509) *certs;
-    STACK_OF(X509_CRL) *crls;
     int i;
 
     GetPKCS7(self, pkcs7);
@@ -585,17 +584,38 @@ pkcs7_get_certs_or_crls(VALUE self, int want_certs)
     switch(i){
     case NID_pkcs7_signed:
         certs = pkcs7->d.sign->cert;
-        crls = pkcs7->d.sign->crl;
         break;
     case NID_pkcs7_signedAndEnveloped:
         certs = pkcs7->d.signed_and_enveloped->cert;
+        break;
+    default:
+        certs = NULL;
+    }
+
+    return certs;
+}
+
+static STACK_OF(X509_CRL) *
+pkcs7_get_crls(VALUE self)
+{
+    PKCS7 *pkcs7;
+    STACK_OF(X509_CRL) *crls;
+    int i;
+
+    GetPKCS7(self, pkcs7);
+    i = OBJ_obj2nid(pkcs7->type);
+    switch(i){
+    case NID_pkcs7_signed:
+        crls = pkcs7->d.sign->crl;
+        break;
+    case NID_pkcs7_signedAndEnveloped:
         crls = pkcs7->d.signed_and_enveloped->crl;
         break;
     default:
-        certs = crls = NULL;
+        crls = NULL;
     }
 
-    return want_certs ? certs : crls;
+    return crls;
 }
 
 static VALUE
@@ -610,7 +630,7 @@ ossl_pkcs7_set_certificates(VALUE self, VALUE ary)
     STACK_OF(X509) *certs;
     X509 *cert;
 
-    certs = pkcs7_get_certs_or_crls(self, 1);
+    certs = pkcs7_get_certs(self);
     while((cert = sk_X509_pop(certs))) X509_free(cert);
     rb_block_call(ary, rb_intern("each"), 0, 0, ossl_pkcs7_set_certs_i, self);
 
@@ -620,7 +640,7 @@ ossl_pkcs7_set_certificates(VALUE self, VALUE ary)
 static VALUE
 ossl_pkcs7_get_certificates(VALUE self)
 {
-    return ossl_x509_sk2ary(pkcs7_get_certs_or_crls(self, 1));
+    return ossl_x509_sk2ary(pkcs7_get_certs(self));
 }
 
 static VALUE
@@ -650,7 +670,7 @@ ossl_pkcs7_set_crls(VALUE self, VALUE ary)
     STACK_OF(X509_CRL) *crls;
     X509_CRL *crl;
 
-    crls = pkcs7_get_certs_or_crls(self, 0);
+    crls = pkcs7_get_crls(self);
     while((crl = sk_X509_CRL_pop(crls))) X509_CRL_free(crl);
     rb_block_call(ary, rb_intern("each"), 0, 0, ossl_pkcs7_set_crls_i, self);
 
@@ -660,7 +680,7 @@ ossl_pkcs7_set_crls(VALUE self, VALUE ary)
 static VALUE
 ossl_pkcs7_get_crls(VALUE self)
 {
-    return ossl_x509crl_sk2ary(pkcs7_get_certs_or_crls(self, 0));
+    return ossl_x509crl_sk2ary(pkcs7_get_crls(self));
 }
 
 static VALUE
diff --git a/ext/openssl/ossl_ssl.c b/ext/openssl/ossl_ssl.c
index 432ca21..facf6ca 100644
--- a/ext/openssl/ossl_ssl.c
+++ b/ext/openssl/ossl_ssl.c
@@ -1291,10 +1291,10 @@ ossl_ssl_get_peer_cert_chain(VALUE self)
     }
     chain = SSL_get_peer_cert_chain(ssl);
     if(!chain) return Qnil;
-    num = sk_num(chain);
+    num = sk_X509_num(chain);
     ary = rb_ary_new2(num);
     for (i = 0; i < num; i++){
-	cert = (X509*)sk_value(chain, i);
+	cert = sk_X509_value(chain, i);
 	rb_ary_push(ary, ossl_x509_new(cert));
     }
 
diff --git a/ext/openssl/ossl_x509attr.c b/ext/openssl/ossl_x509attr.c
index 1f817cd..2a4c481 100644
--- a/ext/openssl/ossl_x509attr.c
+++ b/ext/openssl/ossl_x509attr.c
@@ -218,8 +218,9 @@ ossl_x509attr_get_value(VALUE self)
 	ossl_str_adjust(str, p);
     }
     else{
-	length = i2d_ASN1_SET_OF_ASN1_TYPE(attr->value.set, NULL,
-			i2d_ASN1_TYPE, V_ASN1_SET, V_ASN1_UNIVERSAL, 0);
+	length = i2d_ASN1_SET_OF_ASN1_TYPE(attr->value.set,
+			(unsigned char **) NULL, i2d_ASN1_TYPE,
+			V_ASN1_SET, V_ASN1_UNIVERSAL, 0);
 	str = rb_str_new(0, length);
 	p = (unsigned char *)RSTRING_PTR(str);
 	i2d_ASN1_SET_OF_ASN1_TYPE(attr->value.set, &p,
diff --git a/ext/openssl/ossl_x509crl.c b/ext/openssl/ossl_x509crl.c
index 1be9640..818fdba 100644
--- a/ext/openssl/ossl_x509crl.c
+++ b/ext/openssl/ossl_x509crl.c
@@ -264,7 +264,7 @@ ossl_x509crl_get_revoked(VALUE self)
     VALUE ary, revoked;
 
     GetX509CRL(self, crl);
-    num = sk_X509_CRL_num(X509_CRL_get_REVOKED(crl));
+    num = sk_X509_REVOKED_num(X509_CRL_get_REVOKED(crl));
     if (num < 0) {
 	OSSL_Debug("num < 0???");
 	return rb_ary_new();
@@ -272,7 +272,7 @@ ossl_x509crl_get_revoked(VALUE self)
     ary = rb_ary_new2(num);
     for(i=0; i<num; i++) {
 	/* NO DUP - don't free! */
-	rev = (X509_REVOKED *)sk_X509_CRL_value(X509_CRL_get_REVOKED(crl), i);
+	rev = sk_X509_REVOKED_value(X509_CRL_get_REVOKED(crl), i);
 	revoked = ossl_x509revoked_new(rev);
 	rb_ary_push(ary, revoked);
     }
-- 
1.7.0.3
src/rvm/patches/ruby/1.8.5/osx-arch-fix.patch000066400000000617147511530530014563 0ustar00diff --git a/Makefile.in b/Makefile.in
index 656ae90..f976cf1 100644
--- a/Makefile.in
+++ b/Makefile.in
@@ -45,7 +45,7 @@ XLDFLAGS = @XLDFLAGS@ $(EXTLDFLAGS)
 EXTLIBS = 
 LIBS = @LIBS@ $(EXTLIBS)
 MISSING = @LIBOBJS@ @ALLOCA@
-LDSHARED = @LIBRUBY_LDSHARED@
+LDSHARED = @LIBRUBY_LDSHARED@ $(LDFLAGS)
 DLDFLAGS = @LIBRUBY_DLDFLAGS@ $(EXTLDFLAGS) @ARCH_FLAG@
 SOLIBS = @SOLIBS@
 MAINLIBS = @MAINLIBS@
src/rvm/patches/ruby/1.8.5/stdout-rouge-fix.patch000066400000001273147511530530015477 0ustar00--- a/lib/mkmf.rb	2009-06-10 09:09:22.000000000 +0200
+++ b/lib/mkmf.rb	2011-11-12 02:53:05.862766935 +0100
@@ -168,19 +168,25 @@
 module Logging
   @log = nil
   @logfile = 'mkmf.log'
-  @orgerr = $stderr.dup
-  @orgout = $stdout.dup
   @postpone = 0
 
   def self::open
     @log ||= File::open(@logfile, 'w')
     @log.sync = true
+    orgerr = $stderr.dup
+    orgout = $stdout.dup
     $stderr.reopen(@log)
     $stdout.reopen(@log)
     yield
   ensure
-    $stderr.reopen(@orgerr)
-    $stdout.reopen(@orgout)
+    if orgerr
+      $stderr.reopen(orgerr)
+      orgerr.close
+    end
+    if orgout
+      $stdout.reopen(orgout)
+      orgout.close
+    end
   end
 
   def self::message(*s)
src/rvm/patches/ruby/1.8.5/syck.patch000066400000001147147511530530013223 0ustar00diff --git a/ext/syck/rubyext.c b/ext/syck/rubyext.c
index 078de4f..8c4027f 100644
--- a/ext/syck/rubyext.c
+++ b/ext/syck/rubyext.c
@@ -268,9 +268,13 @@ rb_syck_mktime(str, len)
     {
         char padded[] = "000000";
         char *end = ptr + 1;
+        char *p = end;
         while ( isdigit( *end ) ) end++;
-        MEMCPY(padded, ptr + 1, char, end - (ptr + 1));
-        usec = strtol(padded, NULL, 10);
+        if (end - p < sizeof(padded)) {
+            MEMCPY(padded, ptr + 1, char, end - (ptr + 1));
+            p = padded;
+        }
+        usec = strtol(p, NULL, 10);
     }
     else
     {
src/rvm/patches/ruby/1.8.5/gcc44_dtoa.diff000066400000013000147511530530013765 0ustar00diff --git a/util.c b/util.c
index 40104db..708f858 100644
--- a/util.c
+++ b/util.c
@@ -949,23 +949,25 @@ Exactly one of IEEE_LITTLE_ENDIAN, IEEE_BIG_ENDIAN, VAX, or IBM should be define
 typedef union { double d; ULong L[2]; } U;
 
 #ifdef YES_ALIAS
-#define dval(x) x
-#ifdef IEEE_LITTLE_ENDIAN
-#define word0(x) ((ULong *)&x)[1]
-#define word1(x) ((ULong *)&x)[0]
-#else
-#define word0(x) ((ULong *)&x)[0]
-#define word1(x) ((ULong *)&x)[1]
-#endif
-#else
-#ifdef IEEE_LITTLE_ENDIAN
-#define word0(x) ((U*)&x)->L[1]
-#define word1(x) ((U*)&x)->L[0]
-#else
-#define word0(x) ((U*)&x)->L[0]
-#define word1(x) ((U*)&x)->L[1]
-#endif
-#define dval(x) ((U*)&x)->d
+typedef double double_u;
+#  define dval(x) x
+#  ifdef IEEE_LITTLE_ENDIAN
+#    define word0(x) (((ULong *)&x)[1])
+#    define word1(x) (((ULong *)&x)[0])
+#  else
+#    define word0(x) (((ULong *)&x)[0])
+#    define word1(x) (((ULong *)&x)[1])
+#  endif
+#else
+typedef U double_u;
+#  ifdef IEEE_LITTLE_ENDIAN
+#    define word0(x) (x.L[1])
+#    define word1(x) (x.L[0])
+#  else
+#    define word0(x) (x.L[0])
+#    define word1(x) (x.L[1])
+#  endif
+#  define dval(x) (x.d)
 #endif
 
 /* The following definition of Storeinc is appropriate for MIPS processors.
@@ -1695,10 +1697,11 @@ diff(Bigint *a, Bigint *b)
 }
 
 static double
-ulp(double x)
+ulp(double x_)
 {
     register Long L;
-    double a;
+    double_u x, a;
+    dval(x) = x_;
 
     L = (word0(x) & Exp_mask) - (P-1)*Exp_msk1;
 #ifndef Avoid_Underflow
@@ -1736,7 +1739,7 @@ b2d(Bigint *a, int *e)
 {
     ULong *xa, *xa0, w, y, z;
     int k;
-    double d;
+    double_u d;
 #ifdef VAX
     ULong d0, d1;
 #else
@@ -1797,8 +1800,9 @@ ret_d:
 }
 
 static Bigint *
-d2b(double d, int *e, int *bits)
+d2b(double d_, int *e, int *bits)
 {
+    double_u d;
     Bigint *b;
     int de, k;
     ULong *x, y, z;
@@ -1807,6 +1811,9 @@ d2b(double d, int *e, int *bits)
 #endif
 #ifdef VAX
     ULong d0, d1;
+#endif
+    dval(d) = d_;
+#ifdef VAX
     d0 = word0(d) >> 16 | word0(d) << 16;
     d1 = word1(d) >> 16 | word1(d) << 16;
 #else
@@ -1932,7 +1939,7 @@ d2b(double d, int *e, int *bits)
 static double
 ratio(Bigint *a, Bigint *b)
 {
-    double da, db;
+    double_u da, db;
     int k, ka, kb;
 
     dval(da) = b2d(a, &ka);
@@ -2091,7 +2098,8 @@ ruby_strtod(const char *s00, char **se)
     int bb2, bb5, bbe, bd2, bd5, bbbits, bs2, c, dsign,
          e, e1, esign, i, j, k, nd, nd0, nf, nz, nz0, sign;
     const char *s, *s0, *s1;
-    double aadj, aadj1, adj, rv, rv0;
+    double aadj, adj;
+    double_u aadj1, rv, rv0;
     Long L;
     ULong y, z;
     Bigint *bb, *bb1, *bd, *bd0, *bs, *delta;
@@ -2787,14 +2795,14 @@ drop_down:
         }
         if ((aadj = ratio(delta, bs)) <= 2.) {
             if (dsign)
-                aadj = aadj1 = 1.;
+                aadj = dval(aadj1) = 1.;
             else if (word1(rv) || word0(rv) & Bndry_mask) {
 #ifndef Sudden_Underflow
                 if (word1(rv) == Tiny1 && !word0(rv))
                     goto undfl;
 #endif
                 aadj = 1.;
-                aadj1 = -1.;
+                dval(aadj1) = -1.;
             }
             else {
                 /* special case -- power of FLT_RADIX to be */
@@ -2804,12 +2812,12 @@ drop_down:
                     aadj = 1./FLT_RADIX;
                 else
                     aadj *= 0.5;
-                aadj1 = -aadj;
+                dval(aadj1) = -aadj;
             }
         }
         else {
             aadj *= 0.5;
-            aadj1 = dsign ? aadj : -aadj;
+            dval(aadj1) = dsign ? aadj : -aadj;
 #ifdef Check_FLT_ROUNDS
             switch (Rounding) {
               case 2: /* towards +infinity */
@@ -2821,7 +2829,7 @@ drop_down:
             }
 #else
             if (Flt_Rounds == 0)
-                aadj1 += 0.5;
+                dval(aadj1) += 0.5;
 #endif /*Check_FLT_ROUNDS*/
         }
         y = word0(rv) & Exp_mask;
@@ -2831,7 +2839,7 @@ drop_down:
         if (y == Exp_msk1*(DBL_MAX_EXP+Bias-1)) {
             dval(rv0) = dval(rv);
             word0(rv) -= P*Exp_msk1;
-            adj = aadj1 * ulp(dval(rv));
+            adj = dval(aadj1) * ulp(dval(rv));
             dval(rv) += adj;
             if ((word0(rv) & Exp_mask) >=
                     Exp_msk1*(DBL_MAX_EXP+Bias-P)) {
@@ -2851,11 +2859,11 @@ drop_down:
                     if ((z = aadj) <= 0)
                         z = 1;
                     aadj = z;
-                    aadj1 = dsign ? aadj : -aadj;
+                    dval(aadj1) = dsign ? aadj : -aadj;
                 }
                 word0(aadj1) += (2*P+1)*Exp_msk1 - y;
             }
-            adj = aadj1 * ulp(dval(rv));
+            adj = dval(aadj1) * ulp(dval(rv));
             dval(rv) += adj;
 #else
 #ifdef Sudden_Underflow
@@ -3166,7 +3174,7 @@ freedtoa(char *s)
  */
 
 char *
-dtoa(double d, int mode, int ndigits, int *decpt, int *sign, char **rve)
+dtoa(double d_, int mode, int ndigits, int *decpt, int *sign, char **rve)
 {
  /* Arguments ndigits, decpt, sign are similar to those
     of ecvt and fcvt; trailing zeros are suppressed from
@@ -3211,7 +3219,8 @@ dtoa(double d, int mode, int ndigits, int *decpt, int *sign, char **rve)
     ULong x;
 #endif
     Bigint *b, *b1, *delta, *mlo, *mhi, *S;
-    double d2, ds, eps;
+    double ds;
+    double_u d, d2, eps;
     char *s, *s0;
 #ifdef Honor_FLT_ROUNDS
     int rounding;
@@ -3220,6 +3229,8 @@ dtoa(double d, int mode, int ndigits, int *decpt, int *sign, char **rve)
     int inexact, oldinexact;
 #endif
 
+    dval(d) = d_;
+
 #ifndef MULTIPLE_THREADS
     if (dtoa_result) {
         freedtoa(dtoa_result);
src/rvm/patches/ruby/1.8.5/backported-ossl-fixes.diff000066400000021042147511530530016267 0ustar00diff -r -u ruby-1.8.5-p231/ext/openssl/extconf.rb ruby-1.8.5-p231-fixed/ext/openssl/extconf.rb
--- ruby-1.8.5-p231/ext/openssl/extconf.rb	2007-02-13 08:01:19.000000000 +0900
+++ ruby-1.8.5-p231-fixed/ext/openssl/extconf.rb	2010-07-13 02:18:18.000000000 +0800
@@ -1,5 +1,5 @@
 =begin
-= $RCSfile: extconf.rb,v $ -- Generator for Makefile
+= $RCSfile$ -- Generator for Makefile
 
 = Info
   'OpenSSL for Ruby 2' project
@@ -11,7 +11,7 @@
   (See the file 'LICENSE'.)
 
 = Version
-  $Id: extconf.rb,v 1.21.2.9 2006/06/20 11:18:15 gotoyuzo Exp $
+  $Id: extconf.rb 12572 2007-06-18 09:03:15Z technorama $
 =end
 
 require "mkmf"
@@ -36,8 +36,6 @@
 message "=== Checking for system dependent stuff... ===\n"
 have_library("nsl", "t_open")
 have_library("socket", "socket")
-have_header("unistd.h")
-have_header("sys/time.h")
 have_header("assert.h")
 
 message "=== Checking for required stuff... ===\n"
@@ -61,6 +59,8 @@
   exit 1
 end
 
+%w"rb_str_set_len rb_block_call".each {|func| have_func(func, "ruby.h")}
+
 message "=== Checking for OpenSSL features... ===\n"
 have_func("ERR_peek_last_error")
 have_func("BN_mod_add")
@@ -83,6 +83,8 @@
 have_func("HMAC_CTX_copy")
 have_func("HMAC_CTX_init")
 have_func("PEM_def_callback")
+have_func("PKCS5_PBKDF2_HMAC")
+have_func("PKCS5_PBKDF2_HMAC_SHA1")
 have_func("X509V3_set_nconf")
 have_func("X509V3_EXT_nconf_nid")
 have_func("X509_CRL_add0_revoked")
@@ -92,6 +94,7 @@
 have_func("X509_STORE_get_ex_data")
 have_func("X509_STORE_set_ex_data")
 have_func("OBJ_NAME_do_all_sorted")
+have_func("SSL_SESSION_get_id")
 have_func("OPENSSL_cleanse")
 if try_compile("#define FOO(a, ...) foo(a, ##__VA_ARGS__)\n int x(){FOO(1);FOO(1,2);FOO(1,2,3);}\n")
   $defs.push("-DHAVE_VA_ARGS_MACRO")
diff -r -u ruby-1.8.5-p231/ext/openssl/openssl_missing.c ruby-1.8.5-p231-fixed/ext/openssl/openssl_missing.c
--- ruby-1.8.5-p231/ext/openssl/openssl_missing.c	2007-02-13 08:01:19.000000000 +0900
+++ ruby-1.8.5-p231-fixed/ext/openssl/openssl_missing.c	2010-07-13 02:22:10.000000000 +0800
@@ -1,5 +1,5 @@
 /*
- * $Id: openssl_missing.c,v 1.2.2.4 2006/06/02 10:02:56 gotoyuzo Exp $
+ * $Id: openssl_missing.c 16467 2008-05-19 03:00:52Z knu $
  * 'OpenSSL for Ruby' project
  * Copyright (C) 2001-2002  Michal Rokos <m.rokos@sh.cvut.cz>
  * All rights reserved.
@@ -22,17 +22,15 @@
 #include "openssl_missing.h"
 
 #if !defined(HAVE_HMAC_CTX_COPY)
-int
+void
 HMAC_CTX_copy(HMAC_CTX *out, HMAC_CTX *in)
 {
-    if (!out || !in) return 0;
+    if (!out || !in) return;
     memcpy(out, in, sizeof(HMAC_CTX));
 
-    if (!EVP_MD_CTX_copy(&out->md_ctx, &in->md_ctx)
-	    || !EVP_MD_CTX_copy(&out->i_ctx, &in->i_ctx)
-	    || !EVP_MD_CTX_copy(&out->o_ctx, &in->o_ctx))
-	return 0;
-    return 1;
+    EVP_MD_CTX_copy(&out->md_ctx, &in->md_ctx);
+    EVP_MD_CTX_copy(&out->i_ctx, &in->i_ctx);
+    EVP_MD_CTX_copy(&out->o_ctx, &in->o_ctx);
 }
 #endif /* HAVE_HMAC_CTX_COPY */
 #endif /* NO_HMAC */
diff -r -u ruby-1.8.5-p231/ext/openssl/openssl_missing.h ruby-1.8.5-p231-fixed/ext/openssl/openssl_missing.h
--- ruby-1.8.5-p231/ext/openssl/openssl_missing.h	2007-02-13 08:01:19.000000000 +0900
+++ ruby-1.8.5-p231-fixed/ext/openssl/openssl_missing.h	2010-07-13 02:22:10.000000000 +0800
@@ -1,5 +1,5 @@
 /*
- * $Id: openssl_missing.h,v 1.2.2.2 2005/04/15 19:16:18 gotoyuzo Exp $
+ * $Id: openssl_missing.h 18335 2008-08-04 04:44:17Z shyouhei $
  * 'OpenSSL for Ruby' project
  * Copyright (C) 2001-2002  Michal Rokos <m.rokos@sh.cvut.cz>
  * All rights reserved.
@@ -15,6 +15,10 @@
 extern "C" {
 #endif
 
+#ifndef TYPEDEF_D2I_OF
+typedef char *d2i_of_void();
+#endif
+
 /*
  * These functions are not included in headers of OPENSSL <= 0.9.6b
  */
@@ -56,14 +60,33 @@
 	(char *(*)())d2i_PKCS7_RECIP_INFO, (char *)ri)
 #endif
 
+#if !defined(HAVE_EVP_MD_CTX_INIT)
 void HMAC_CTX_init(HMAC_CTX *ctx);
-int HMAC_CTX_copy(HMAC_CTX *out, HMAC_CTX *in);
+#endif
+
+#if !defined(HAVE_HMAC_CTX_COPY)
+void HMAC_CTX_copy(HMAC_CTX *out, HMAC_CTX *in);
+#endif
+
+#if !defined(HAVE_HMAC_CTX_CLEANUP)
 void HMAC_CTX_cleanup(HMAC_CTX *ctx);
+#endif
 
+#if !defined(HAVE_EVP_MD_CTX_CREATE)
 EVP_MD_CTX *EVP_MD_CTX_create(void);
+#endif
+
+#if !defined(HAVE_EVP_MD_CTX_INIT)
 void EVP_MD_CTX_init(EVP_MD_CTX *ctx);
+#endif
+
+#if !defined(HAVE_EVP_MD_CTX_CLEANUP)
 int EVP_MD_CTX_cleanup(EVP_MD_CTX *ctx);
+#endif
+
+#if !defined(HAVE_EVP_MD_CTX_DESTROY)
 void EVP_MD_CTX_destroy(EVP_MD_CTX *ctx);
+#endif
 
 #if !defined(HAVE_EVP_CIPHER_CTX_COPY)
 int EVP_CIPHER_CTX_copy(EVP_CIPHER_CTX *out, EVP_CIPHER_CTX *in);
@@ -107,19 +130,54 @@
 #define OPENSSL_cleanse(p, l) memset(p, 0, l)
 #endif
 
+#if !defined(HAVE_X509_STORE_SET_EX_DATA)
 void *X509_STORE_get_ex_data(X509_STORE *str, int idx);
 int X509_STORE_set_ex_data(X509_STORE *str, int idx, void *data);
+#endif
+
+#if !defined(HAVE_X509_CRL_SET_VERSION)
 int X509_CRL_set_version(X509_CRL *x, long version);
+#endif
+
+#if !defined(HAVE_X509_CRL_SET_ISSUER_NAME)
 int X509_CRL_set_issuer_name(X509_CRL *x, X509_NAME *name);
+#endif
+
+#if !defined(HAVE_X509_CRL_SORT)
 int X509_CRL_sort(X509_CRL *c);
+#endif
+
+#if !defined(HAVE_X509_CRL_ADD0_REVOKED)
 int X509_CRL_add0_revoked(X509_CRL *crl, X509_REVOKED *rev);
+#endif
+
+#if !defined(HAVE_BN_MOD_SQR)
 int BN_mod_sqr(BIGNUM *r, const BIGNUM *a, const BIGNUM *m, BN_CTX *ctx);
+#endif
+
+#if !defined(HAVE_BN_MOD_ADD)
 int BN_mod_add(BIGNUM *r, const BIGNUM *a, const BIGNUM *b, const BIGNUM *m, BN_CTX *ctx);
+#endif
+
+#if !defined(HAVE_BN_MOD_SUB)
 int BN_mod_sub(BIGNUM *r, const BIGNUM *a, const BIGNUM *b, const BIGNUM *m, BN_CTX *ctx);
+#endif
+
+#if !defined(HAVE_BN_RAND_RANGE)
 int BN_rand_range(BIGNUM *r, BIGNUM *range);
+#endif
+
+#if !defined(HAVE_BN_PSEUDO_RAND_RANGE)
 int BN_pseudo_rand_range(BIGNUM *r, BIGNUM *range);
+#endif
+
+#if !defined(HAVE_CONF_GET1_DEFAULT_CONFIG_FILE)
 char *CONF_get1_default_config_file(void);
+#endif
+
+#if !defined(HAVE_PEM_DEF_CALLBACK)
 int PEM_def_callback(char *buf, int num, int w, void *key);
+#endif
 
 #if defined(__cplusplus)
 }
diff -r -u ruby-1.8.5-p231/ext/openssl/ossl_hmac.c ruby-1.8.5-p231-fixed/ext/openssl/ossl_hmac.c
--- ruby-1.8.5-p231/ext/openssl/ossl_hmac.c	2007-02-13 08:01:19.000000000 +0900
+++ ruby-1.8.5-p231-fixed/ext/openssl/ossl_hmac.c	2010-07-13 02:18:36.000000000 +0800
@@ -1,5 +1,5 @@
 /*
- * $Id: ossl_hmac.c,v 1.4.2.2 2004/12/15 01:54:39 matz Exp $
+ * $Id: ossl_hmac.c 16467 2008-05-19 03:00:52Z knu $
  * 'OpenSSL for Ruby' project
  * Copyright (C) 2001-2002  Michal Rokos <m.rokos@sh.cvut.cz>
  * All rights reserved.
@@ -57,6 +57,12 @@
     return obj;
 }
 
+
+/*
+ *  call-seq:
+ *     HMAC.new(key, digest) -> hmac
+ *
+ */
 static VALUE
 ossl_hmac_initialize(VALUE self, VALUE key, VALUE digest)
 {
@@ -81,12 +87,15 @@
     GetHMAC(self, ctx1);
     SafeGetHMAC(other, ctx2);
 
-    if (!HMAC_CTX_copy(ctx1, ctx2)) {
-	ossl_raise(eHMACError, NULL);
-    }
+    HMAC_CTX_copy(ctx1, ctx2);
     return self;
 }
 
+/*
+ *  call-seq:
+ *     hmac.update(string) -> self
+ *
+ */
 static VALUE
 ossl_hmac_update(VALUE self, VALUE data)
 {
@@ -104,9 +113,7 @@
 {
     HMAC_CTX final;
 
-    if (!HMAC_CTX_copy(&final, ctx)) {
-	ossl_raise(eHMACError, NULL);
-    }
+    HMAC_CTX_copy(&final, ctx);
     if (!(*buf = OPENSSL_malloc(HMAC_size(&final)))) {
 	HMAC_CTX_cleanup(&final);
 	OSSL_Debug("Allocating %d mem", HMAC_size(&final));
@@ -116,6 +123,11 @@
     HMAC_CTX_cleanup(&final);
 }
 
+/*
+ *  call-seq:
+ *     hmac.digest -> aString
+ *
+ */
 static VALUE
 ossl_hmac_digest(VALUE self)
 {
@@ -131,6 +143,11 @@
     return digest;
 }
 
+/*
+ *  call-seq:
+ *     hmac.hexdigest -> aString
+ *
+ */
 static VALUE
 ossl_hmac_hexdigest(VALUE self)
 {
@@ -151,6 +168,27 @@
     return hexdigest;
 }
 
+/*
+ *  call-seq:
+ *     hmac.reset -> self
+ *
+ */
+static VALUE
+ossl_hmac_reset(VALUE self)
+{
+    HMAC_CTX *ctx;
+
+    GetHMAC(self, ctx);
+    HMAC_Init_ex(ctx, NULL, 0, NULL, NULL);
+
+    return self;
+}
+
+/*
+ *  call-seq:
+ *     HMAC.digest(digest, key, data) -> aString
+ *
+ */
 static VALUE
 ossl_hmac_s_digest(VALUE klass, VALUE digest, VALUE key, VALUE data)
 {
@@ -191,6 +234,10 @@
 void
 Init_ossl_hmac()
 {
+#if 0 /* let rdoc know about mOSSL */
+    mOSSL = rb_define_module("OpenSSL");
+#endif
+
     eHMACError = rb_define_class_under(mOSSL, "HMACError", eOSSLError);
 	
     cHMAC = rb_define_class_under(mOSSL, "HMAC", rb_cObject);
@@ -202,6 +249,7 @@
     rb_define_method(cHMAC, "initialize", ossl_hmac_initialize, 2);
     rb_define_copy_func(cHMAC, ossl_hmac_copy);
 
+    rb_define_method(cHMAC, "reset", ossl_hmac_reset, 0);
     rb_define_method(cHMAC, "update", ossl_hmac_update, 1);
     rb_define_alias(cHMAC, "<<", "update");
     rb_define_method(cHMAC, "digest", ossl_hmac_digest, 0);
src/rvm/patches/ruby/1.8.5/railsbench.patch000066400000033360147511530530014366 0ustar00--- gc.c.orig	2006-08-25 10:12:46.000000000 +0200
+++ gc.c	2007-05-06 10:55:19.000000000 +0200
@@ -22,8 +22,16 @@
 #include <setjmp.h>
 #include <sys/types.h>
 
+#ifdef _WIN32
+#include <string.h>
+#else
+#include <strings.h>
+#endif
+
 #ifdef HAVE_SYS_TIME_H
 #include <sys/time.h>
+#elif defined(_WIN32)
+#include <time.h> 
 #endif
 
 #ifdef HAVE_SYS_RESOURCE_H
@@ -54,7 +62,6 @@
 #if !defined(setjmp) && defined(HAVE__SETJMP)
 #define setjmp(env) _setjmp(env)
 #endif
-
 /* Make alloca work the best possible way.  */
 #ifdef __GNUC__
 # ifndef atarist
@@ -173,8 +180,17 @@
 	RUBY_CRITICAL(free(x));
 }
 
+#if HAVE_LONG_LONG
+#define GC_TIME_TYPE LONG_LONG
+#else
+#define GC_TIME_TYPE long
+#endif
+
 extern int ruby_in_compile;
 static int dont_gc;
+static int gc_statistics = 0;
+static GC_TIME_TYPE gc_time = 0;
+static int gc_collections = 0;
 static int during_gc;
 static int need_call_final = 0;
 static st_table *finalizer_table = 0;
@@ -209,7 +225,7 @@
  *  Disables garbage collection, returning <code>true</code> if garbage
  *  collection was already disabled.
  *
- *     GC.disable   #=> false
+ *     GC.disable   #=> false or true
  *     GC.disable   #=> true
  *
  */
@@ -223,6 +239,104 @@
     return old;
 }
 
+/*
+ *  call-seq:
+ *     GC.enable_stats    => true or false
+ *
+ *  Enables garbage collection statistics, returning <code>true</code> if garbage
+ *  collection statistics was already enabled.
+ *
+ *     GC.enable_stats   #=> false or true
+ *     GC.enable_stats   #=> true
+ *
+ */
+
+VALUE
+rb_gc_enable_stats()
+{
+    int old = gc_statistics;
+    gc_statistics = Qtrue;
+    return old;
+}
+
+/*
+ *  call-seq:
+ *     GC.disable_stats    => true or false
+ *
+ *  Disables garbage collection statistics, returning <code>true</code> if garbage
+ *  collection statistics was already disabled.
+ *
+ *     GC.disable_stats   #=> false or true
+ *     GC.disable_stats   #=> true
+ *
+ */
+
+VALUE
+rb_gc_disable_stats()
+{
+    int old = gc_statistics;
+    gc_statistics = Qfalse;
+    return old;
+}
+
+/*
+ *  call-seq:
+ *     GC.clear_stats    => nil
+ *
+ *  Clears garbage collection statistics, returning nil. This resets the number
+ *  of collections (GC.collections) and the time used (GC.time) to 0.
+ *
+ *     GC.clear_stats    #=> nil
+ *
+ */
+
+VALUE
+rb_gc_clear_stats()
+{
+    gc_collections = 0;
+    gc_time = 0;
+    return Qnil; 
+}
+
+/*
+ *  call-seq:
+ *     GC.collections    => Integer
+ *
+ *  Returns the number of garbage collections performed while GC statistics collection
+ *  was enabled.
+ *
+ *     GC.collections    #=> 35
+ *
+ */
+
+VALUE
+rb_gc_collections()
+{
+    return INT2NUM(gc_collections);
+}
+
+/*
+ *  call-seq:
+ *     GC.time    => Integer
+ *
+ *  Returns the time spent during garbage collection while GC statistics collection
+ *  was enabled (in micro seconds).
+ *
+ *     GC.time    #=> 20000
+ *
+ */
+
+VALUE
+rb_gc_time()
+{
+#if HAVE_LONG_LONG
+    return LL2NUM(gc_time);
+#else
+    return LONG2NUM(gc_time);
+#endif
+}
+
+
 VALUE rb_mGC;
 
 static struct gc_list {
@@ -314,7 +428,7 @@
 static RVALUE *freelist = 0;
 static RVALUE *deferred_final_list = 0;
 
-#define HEAPS_INCREMENT 10
+static int heaps_increment = 10;
 static struct heaps_slot {
     void *membase;
     RVALUE *slot;
@@ -323,13 +437,165 @@
 static int heaps_length = 0;
 static int heaps_used   = 0;
 
-#define HEAP_MIN_SLOTS 10000
-static int heap_slots = HEAP_MIN_SLOTS;
+static int heap_min_slots = 10000;
+static int heap_slots = 10000;
+
+static int heap_free_min = 4096;
+static int heap_slots_increment = 10000;
+static double heap_slots_growth_factor = 1.8;
+
+static long initial_malloc_limit = GC_MALLOC_LIMIT;
 
-#define FREE_MIN  4096
+static int verbose_gc_stats = Qfalse;
+
+static FILE* gc_data_file = NULL;
 
 static RVALUE *himem, *lomem;
 
+static void set_gc_parameters()
+{
+    char *gc_stats_ptr, *min_slots_ptr, *free_min_ptr, *heap_slots_incr_ptr,
+      *heap_incr_ptr, *malloc_limit_ptr, *gc_heap_file_ptr, *heap_slots_growth_factor_ptr;
+
+    gc_data_file = stderr;
+
+    gc_stats_ptr = getenv("RUBY_GC_STATS");
+    if (gc_stats_ptr != NULL) {
+	int gc_stats_i = atoi(gc_stats_ptr);
+	if (gc_stats_i > 0) {
+	    verbose_gc_stats = Qtrue;
+	}
+    }
+
+    gc_heap_file_ptr = getenv("RUBY_GC_DATA_FILE");
+    if (gc_heap_file_ptr != NULL) {
+	FILE* data_file = fopen(gc_heap_file_ptr, "w");
+	if (data_file != NULL) {
+	    gc_data_file = data_file;
+	}
+	else {
+	    fprintf(stderr,
+		    "can't open gc log file %s for writing, using default\n", gc_heap_file_ptr);
+	}
+    }
+
+    min_slots_ptr = getenv("RUBY_HEAP_MIN_SLOTS");
+    if (min_slots_ptr != NULL) {
+	int min_slots_i = atoi(min_slots_ptr);
+        if (verbose_gc_stats) {
+	    fprintf(gc_data_file, "RUBY_HEAP_MIN_SLOTS=%s\n", min_slots_ptr);
+        }
+	if (min_slots_i > 0) {
+	    heap_slots = min_slots_i;
+	    heap_min_slots = min_slots_i;
+	}
+    }
+
+    free_min_ptr = getenv("RUBY_HEAP_FREE_MIN");
+    if (free_min_ptr != NULL) {
+	int free_min_i = atoi(free_min_ptr);
+        if (verbose_gc_stats) {
+	    fprintf(gc_data_file, "RUBY_HEAP_FREE_MIN=%s\n", free_min_ptr);
+	}
+	if (free_min_i > 0) {
+	    heap_free_min = free_min_i;
+	}
+    }
+
+    heap_incr_ptr = getenv("RUBY_HEAP_INCREMENT");
+    if (heap_incr_ptr != NULL) {
+	int heap_incr_i = atoi(heap_incr_ptr);
+        if (verbose_gc_stats) {
+	    fprintf(gc_data_file, "RUBY_HEAP_INCREMENT=%s\n", heap_incr_ptr);
+	}
+	if (heap_incr_i > 0) {
+	    heaps_increment = heap_incr_i;
+	}
+    }
+
+    heap_slots_incr_ptr = getenv("RUBY_HEAP_SLOTS_INCREMENT");
+    if (heap_slots_incr_ptr != NULL) {
+	int heap_slots_incr_i = atoi(heap_slots_incr_ptr);
+        if (verbose_gc_stats) {
+	    fprintf(gc_data_file, "RUBY_HEAP_SLOTS_INCREMENT=%s\n", heap_slots_incr_ptr);
+	}
+	if (heap_slots_incr_i > 0) {
+	    heap_slots_increment = heap_slots_incr_i;
+	}
+    }
+
+    heap_slots_growth_factor_ptr = getenv("RUBY_HEAP_SLOTS_GROWTH_FACTOR");
+    if (heap_slots_growth_factor_ptr != NULL) {
+	double heap_slots_growth_factor_d = atoi(heap_slots_growth_factor_ptr);
+        if (verbose_gc_stats) {
+	    fprintf(gc_data_file, "RUBY_HEAP_SLOTS_GROWTH_FACTOR=%s\n", heap_slots_growth_factor_ptr);
+	}
+	if (heap_slots_growth_factor_d > 0) {
+	    heap_slots_growth_factor = heap_slots_growth_factor_d;
+	}
+    }
+
+    malloc_limit_ptr = getenv("RUBY_GC_MALLOC_LIMIT");
+    if (malloc_limit_ptr != NULL) {
+	int malloc_limit_i = atol(malloc_limit_ptr);
+        if (verbose_gc_stats) {
+	    fprintf(gc_data_file, "RUBY_GC_MALLOC_LIMIT=%s\n", malloc_limit_ptr);
+	}
+	if (malloc_limit_i > 0) {
+	    initial_malloc_limit = malloc_limit_i;
+	}
+    }
+}
+
+/*
+ *  call-seq:
+ *     GC.dump    => nil
+ *
+ *  dumps information about the current GC data structures to the GC log file
+ *
+ *     GC.dump    #=> nil
+ *
+ */
+
+VALUE
+rb_gc_dump()
+{
+    int i;
+
+    for (i = 0; i < heaps_used; i++) {
+	int heap_size = heaps[i].limit;
+	fprintf(gc_data_file, "HEAP[%2d]: size=%7d\n", i, heap_size);
+    }
+
+    return Qnil;
+}
+
+/*
+ *  call-seq:
+ *     GC.log String  => String
+ *
+ *  Logs string to the GC data file and returns it.
+ *
+ *     GC.log "manual GC call"    #=> "manual GC call"
+ *
+ */
+
+VALUE
+rb_gc_log(self, original_str)
+     VALUE self, original_str;
+{
+    if (original_str == Qnil) {
+        fprintf(gc_data_file, "\n");
+    }
+    else {
+        VALUE str = StringValue(original_str);
+        char *p = RSTRING(str)->ptr;
+        fprintf(gc_data_file, "%s\n", p);
+    }
+    return original_str;
+}
+
+
 static void
 add_heap()
 {
@@ -340,7 +606,7 @@
 	struct heaps_slot *p;
 	int length;
 
-	heaps_length += HEAPS_INCREMENT;
+	heaps_length += heaps_increment;
 	length = heaps_length*sizeof(struct heaps_slot);
 	RUBY_CRITICAL(
 	    if (heaps_used > 0) {
@@ -356,10 +622,10 @@
     for (;;) {
 	RUBY_CRITICAL(p = (RVALUE*)malloc(sizeof(RVALUE)*(heap_slots+1)));
 	if (p == 0) {
-	    if (heap_slots == HEAP_MIN_SLOTS) {
+	    if (heap_slots == heap_min_slots) {
 		rb_memerror();
 	    }
-	    heap_slots = HEAP_MIN_SLOTS;
+	    heap_slots = heap_min_slots;
 	    continue;
 	}
         heaps[heaps_used].membase = p;
@@ -375,8 +641,9 @@
     if (lomem == 0 || lomem > p) lomem = p;
     if (himem < pend) himem = pend;
     heaps_used++;
-    heap_slots *= 1.8;
-    if (heap_slots <= 0) heap_slots = HEAP_MIN_SLOTS;
+    heap_slots += heap_slots_increment;
+    heap_slots_increment *= heap_slots_growth_factor;
+    if (heap_slots <= 0) heap_slots = heap_min_slots;
 
     while (p < pend) {
 	p->as.free.flags = 0;
@@ -1026,6 +1293,39 @@
     }
 }
 
+static char* obj_type(int tp)
+{
+    switch (tp) {
+	case T_NIL    : return "NIL";   
+	case T_OBJECT : return "OBJECT";
+	case T_CLASS  : return "CLASS";
+	case T_ICLASS : return "ICLASS";
+	case T_MODULE : return "MODULE";
+	case T_FLOAT  : return "FLOAT";
+	case T_STRING : return "STRING";
+	case T_REGEXP : return "REGEXP";
+	case T_ARRAY  : return "ARRAY";
+	case T_FIXNUM : return "FIXNUM";
+	case T_HASH   : return "HASH";
+	case T_STRUCT : return "STRUCT";
+	case T_BIGNUM : return "BIGNUM";
+	case T_FILE   : return "FILE";
+	    
+	case T_TRUE   : return "TRUE";
+	case T_FALSE  : return "FALSE";
+	case T_DATA   : return "DATA";
+	case T_MATCH  : return "MATCH";
+	case T_SYMBOL : return "SYMBOL";
+	    
+	case T_BLKTAG : return "BLKTAG";
+	case T_UNDEF  : return "UNDEF";
+	case T_VARMAP : return "VARMAP";
+	case T_SCOPE  : return "SCOPE";
+	case T_NODE   : return "NODE";
+	default: return "____";
+    }
+}
+
 static void
 free_unused_heaps()
 {
@@ -1056,12 +1356,21 @@
     unsigned long live = 0;
     unsigned long free_min = 0;
 
+    unsigned long really_freed = 0;
+    int free_counts[256];
+    int live_counts[256];
+    int do_gc_stats = gc_statistics & verbose_gc_stats;
+
     for (i = 0; i < heaps_used; i++) {
         free_min += heaps[i].limit;
     }
     free_min = free_min * 0.2;
-    if (free_min < FREE_MIN)
-        free_min = FREE_MIN;
+    if (free_min < heap_free_min)
+        free_min = heap_free_min;
+
+    if (do_gc_stats) {
+	for (i = 0 ; i< 256; i++) { free_counts[i] = live_counts[i] = 0; }
+    }
 
     if (ruby_in_compile && ruby_parser_stack_on_heap()) {
 	/* should not reclaim nodes during compilation
@@ -1094,6 +1403,9 @@
 	    if (!(p->as.basic.flags & FL_MARK)) {
 		if (p->as.basic.flags) {
 		    obj_free((VALUE)p);
+		    if (do_gc_stats) {
+			really_freed++;
+		    }
 		}
 		if (need_call_final && FL_TEST(p, FL_FINALIZE)) {
 		    p->as.free.flags = FL_MARK; /* remain marked */
@@ -1101,6 +1413,12 @@
 		    final_list = p;
 		}
 		else {
+		    if (do_gc_stats) {
+			int obt = p->as.basic.flags & T_MASK;
+			if (obt) {
+			    free_counts[obt]++;
+			}
+		    }
 		    p->as.free.flags = 0;
 		    p->as.free.next = freelist;
 		    freelist = p;
@@ -1114,6 +1432,9 @@
 	    else {
 		RBASIC(p)->flags &= ~FL_MARK;
 		live++;
+		if (do_gc_stats) {
+ 		    live_counts[RANY((VALUE)p)->as.basic.flags & T_MASK]++;
+ 		}
 	    }
 	    p++;
 	}
@@ -1132,7 +1453,7 @@
     }
     if (malloc_increase > malloc_limit) {
 	malloc_limit += (malloc_increase - malloc_limit) * (double)live / (live + freed);
-	if (malloc_limit < GC_MALLOC_LIMIT) malloc_limit = GC_MALLOC_LIMIT;
+	if (malloc_limit < initial_malloc_limit) malloc_limit = initial_malloc_limit;
     }
     malloc_increase = 0;
     if (freed < free_min) {
@@ -1140,6 +1461,20 @@
     }
     during_gc = 0;
 
+    if (do_gc_stats) {
+	fprintf(gc_data_file, "objects processed: %.7d\n", live+freed);
+	fprintf(gc_data_file, "live objects	: %.7d\n", live);
+	fprintf(gc_data_file, "freelist objects : %.7d\n", freed - really_freed);
+	fprintf(gc_data_file, "freed objects	: %.7d\n", really_freed);
+	for(i=0; i<256; i++) {
+	    if (free_counts[i]>0) {
+		fprintf(gc_data_file,
+			"kept %.7d / freed %.7d objects of type %s\n",
+			live_counts[i], free_counts[i], obj_type(i));
+	    }
+	}
+    }
+
     /* clear finalization list */
     if (final_list) {
 	deferred_final_list = final_list;
@@ -1334,6 +1669,7 @@
     struct gc_list *list;
     struct FRAME * volatile frame; /* gcc 2.7.2.3 -O2 bug??  */
     jmp_buf save_regs_gc_mark;
+    struct timeval gctv1, gctv2;
     SET_STACK_END;
 
 #ifdef HAVE_NATIVETHREAD
@@ -1350,6 +1686,14 @@
     if (during_gc) return;
     during_gc++;
 
+    if (gc_statistics) {
+        gc_collections++;
+	gettimeofday(&gctv1, NULL);
+        if (verbose_gc_stats) {
+	    fprintf(gc_data_file, "Garbage collection started\n");
+	}
+    }
+
     init_mark_stack();
 
     gc_mark((VALUE)ruby_current_node, 0);
@@ -1438,6 +1782,17 @@
     } while (!MARK_STACK_EMPTY);
 
     gc_sweep();
+
+    if (gc_statistics) {
+        GC_TIME_TYPE musecs_used;
+	gettimeofday(&gctv2, NULL);
+	musecs_used = ((GC_TIME_TYPE)(gctv2.tv_sec - gctv1.tv_sec) * 1000000) + (gctv2.tv_usec - gctv1.tv_usec);
+	gc_time += musecs_used;
+
+	if (verbose_gc_stats) {
+	    fprintf(gc_data_file, "GC time: %d msec\n", musecs_used / 1000);
+	}
+    }
 }
 
 void
@@ -1551,6 +1906,7 @@
     if (!rb_gc_stack_start) {
 	Init_stack(0);
     }
+    set_gc_parameters();
     add_heap();
 }
 
@@ -2020,6 +2376,14 @@
     rb_define_singleton_method(rb_mGC, "disable", rb_gc_disable, 0);
     rb_define_method(rb_mGC, "garbage_collect", rb_gc_start, 0);
 
+    rb_define_singleton_method(rb_mGC, "enable_stats", rb_gc_enable_stats, 0);
+    rb_define_singleton_method(rb_mGC, "disable_stats", rb_gc_disable_stats, 0);
+    rb_define_singleton_method(rb_mGC, "clear_stats", rb_gc_clear_stats, 0);
+    rb_define_singleton_method(rb_mGC, "collections", rb_gc_collections, 0);
+    rb_define_singleton_method(rb_mGC, "time", rb_gc_time, 0);
+    rb_define_singleton_method(rb_mGC, "dump", rb_gc_dump, 0);
+    rb_define_singleton_method(rb_mGC, "log", rb_gc_log, 1);
+
     rb_mObSpace = rb_define_module("ObjectSpace");
     rb_define_module_function(rb_mObSpace, "each_object", os_each_obj, -1);
     rb_define_module_function(rb_mObSpace, "garbage_collect", rb_gc_start, 0);
src/rvm/patches/ruby/2.1.4/openssl3.patch000066400000003333147511530530014010 0ustar00diff --git a/ext/openssl/extconf.rb b/ext/openssl/extconf.rb
index 8c04cb5..132d803 100644
--- a/ext/openssl/extconf.rb
+++ b/ext/openssl/extconf.rb
@@ -104,6 +104,9 @@
 have_func("SSLv2_method")
 have_func("SSLv2_server_method")
 have_func("SSLv2_client_method")
+have_func("SSLv3_method")
+have_func("SSLv3_server_method")
+have_func("SSLv3_client_method")
 have_func("TLSv1_1_method")
 have_func("TLSv1_1_server_method")
 have_func("TLSv1_1_client_method")
diff --git a/ext/openssl/ossl_ssl.c b/ext/openssl/ossl_ssl.c
index f7cb7f0..47111f6 100644
--- a/ext/openssl/ossl_ssl.c
+++ b/ext/openssl/ossl_ssl.c
@@ -109,9 +109,12 @@ static const struct {
     OSSL_SSL_METHOD_ENTRY(SSLv2_server),
     OSSL_SSL_METHOD_ENTRY(SSLv2_client),
 #endif
+#if defined(HAVE_SSLV3_METHOD) && defined(HAVE_SSLV3_SERVER_METHOD) && \
+        defined(HAVE_SSLV3_CLIENT_METHOD)
     OSSL_SSL_METHOD_ENTRY(SSLv3),
     OSSL_SSL_METHOD_ENTRY(SSLv3_server),
     OSSL_SSL_METHOD_ENTRY(SSLv3_client),
+#endif
     OSSL_SSL_METHOD_ENTRY(SSLv23),
     OSSL_SSL_METHOD_ENTRY(SSLv23_server),
     OSSL_SSL_METHOD_ENTRY(SSLv23_client),
diff --git a/test/openssl/test_ssl.rb b/test/openssl/test_ssl.rb
index 07e081b..0cbfcba 100644
--- a/test/openssl/test_ssl.rb
+++ b/test/openssl/test_ssl.rb
@@ -912,7 +912,7 @@ def test_unset_OP_ALL
   # that has been marked as forbidden, therefore either of these may be raised
   HANDSHAKE_ERRORS = [OpenSSL::SSL::SSLError, Errno::ECONNRESET]

-if OpenSSL::SSL::SSLContext::METHODS.include? :TLSv1
+if OpenSSL::SSL::SSLContext::METHODS.include?(:TLSv1) && OpenSSL::SSL::SSLContext::METHODS.include?(:SSLv3)

   def test_forbid_ssl_v3_for_client
     ctx_proc = Proc.new { |ctx| ctx.options = OpenSSL::SSL::OP_ALL | OpenSSL::SSL::OP_NO_SSLv3 }
src/rvm/patches/ruby/1.9.2/head/r42282.patch000066400000002333147511530530014012 0ustar00From 2f086f0aa11d55fa2c03d4bd55bafff5bd51ed9a Mon Sep 17 00:00:00 2001
From: kazu <kazu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>
Date: Wed, 31 Jul 2013 13:01:57 +0000
Subject: [PATCH] parse.y: fix build error with bison-3.0

---
 parse.y | 9 ++++++---
 1 file changed, 6 insertions(+), 3 deletions(-)

diff --git a/parse.y b/parse.y
index 3f05fd5..f438920 100644
--- a/parse.y
+++ b/parse.y
@@ -277,8 +277,6 @@ struct parser_params {
 static int parser_yyerror(struct parser_params*, const char*);
 #define yyerror(msg) parser_yyerror(parser, (msg))
 
-#define YYLEX_PARAM parser
-
 #define lex_strterm		(parser->parser_lex_strterm)
 #define lex_state		(parser->parser_lex_state)
 #define cond_stack		(parser->parser_cond_stack)
@@ -319,7 +317,11 @@ static int parser_yyerror(struct parser_params*, const char*);
 #define ruby_coverage		(parser->coverage)
 #endif
 
+#if YYPURE
 static int yylex(void*, void*);
+#else
+static int yylex(void*);
+#endif
 
 #ifndef RIPPER
 #define yyparse ruby_yyparse
@@ -610,7 +612,8 @@ static void token_info_pop(struct parser_params*, const char *token);
 #endif
 %}
 
-%pure_parser
+%pure-parser
+%lex-param {struct parser_params *parser}
 %parse-param {struct parser_params *parser}
 
 %union {
-- 
1.8.4-fc

src/rvm/patches/ruby/1.9.2/openssl3.patch000066400000003333147511530530014015 0ustar00diff --git a/ext/openssl/extconf.rb b/ext/openssl/extconf.rb
index 8c04cb5..132d803 100644
--- a/ext/openssl/extconf.rb
+++ b/ext/openssl/extconf.rb
@@ -104,6 +104,9 @@
 have_func("SSLv2_method")
 have_func("SSLv2_server_method")
 have_func("SSLv2_client_method")
+have_func("SSLv3_method")
+have_func("SSLv3_server_method")
+have_func("SSLv3_client_method")
 have_func("TLSv1_1_method")
 have_func("TLSv1_1_server_method")
 have_func("TLSv1_1_client_method")
diff --git a/ext/openssl/ossl_ssl.c b/ext/openssl/ossl_ssl.c
index f7cb7f0..47111f6 100644
--- a/ext/openssl/ossl_ssl.c
+++ b/ext/openssl/ossl_ssl.c
@@ -109,9 +109,12 @@ static const struct {
     OSSL_SSL_METHOD_ENTRY(SSLv2_server),
     OSSL_SSL_METHOD_ENTRY(SSLv2_client),
 #endif
+#if defined(HAVE_SSLV3_METHOD) && defined(HAVE_SSLV3_SERVER_METHOD) && \
+        defined(HAVE_SSLV3_CLIENT_METHOD)
     OSSL_SSL_METHOD_ENTRY(SSLv3),
     OSSL_SSL_METHOD_ENTRY(SSLv3_server),
     OSSL_SSL_METHOD_ENTRY(SSLv3_client),
+#endif
     OSSL_SSL_METHOD_ENTRY(SSLv23),
     OSSL_SSL_METHOD_ENTRY(SSLv23_server),
     OSSL_SSL_METHOD_ENTRY(SSLv23_client),
diff --git a/test/openssl/test_ssl.rb b/test/openssl/test_ssl.rb
index 07e081b..0cbfcba 100644
--- a/test/openssl/test_ssl.rb
+++ b/test/openssl/test_ssl.rb
@@ -912,7 +912,7 @@ def test_unset_OP_ALL
   # that has been marked as forbidden, therefore either of these may be raised
   HANDSHAKE_ERRORS = [OpenSSL::SSL::SSLError, Errno::ECONNRESET]

-if OpenSSL::SSL::SSLContext::METHODS.include? :TLSv1
+if OpenSSL::SSL::SSLContext::METHODS.include?(:TLSv1) && OpenSSL::SSL::SSLContext::METHODS.include?(:SSLv3)

   def test_forbid_ssl_v3_for_client
     ctx_proc = Proc.new { |ctx| ctx.options = OpenSSL::SSL::OP_ALL | OpenSSL::SSL::OP_NO_SSLv3 }
src/rvm/patches/ruby/1.9.2/osx-arch-fix.patch000066400000000617147511530530014561 0ustar00diff --git a/Makefile.in b/Makefile.in
index 656ae90..f976cf1 100644
--- a/Makefile.in
+++ b/Makefile.in
@@ -45,7 +45,7 @@ XLDFLAGS = @XLDFLAGS@ $(EXTLDFLAGS)
 EXTLIBS = 
 LIBS = @LIBS@ $(EXTLIBS)
 MISSING = @LIBOBJS@ @ALLOCA@
-LDSHARED = @LIBRUBY_LDSHARED@
+LDSHARED = @LIBRUBY_LDSHARED@ $(LDFLAGS)
 DLDFLAGS = @LIBRUBY_DLDFLAGS@ $(EXTLDFLAGS) @ARCH_FLAG@
 SOLIBS = @SOLIBS@
 MAINLIBS = @MAINLIBS@
src/rvm/patches/ruby/1.9.2/support_joke.patch000066400000000327147511530530014773 0ustar00--- a/vm_opts.h
+++ b/vm_opts.h
@@ -46,6 +46,6 @@
 #define OPT_STACK_CACHING            0
 
 /* misc */
-#define SUPPORT_JOKE                 0
+#define SUPPORT_JOKE                 1
 
 #endif /* RUBY_VM_OPTS_H */
src/rvm/patches/ruby/1.9.2/p290/gcdata.patch000066400000007665147511530530014200 0ustar00Index: gc.c
===================================================================
--- a/gc.c	(revision 32826)
+++ b/gc.c	(working copy)
@@ -291,16 +291,12 @@
     struct gc_list *next;
 };
 
-#define CALC_EXACT_MALLOC_SIZE 0
-
 typedef struct rb_objspace {
     struct {
 	size_t limit;
 	size_t increase;
-#if CALC_EXACT_MALLOC_SIZE
 	size_t allocated_size;
 	size_t allocations;
-#endif
     } malloc_params;
     struct {
 	size_t increment;
@@ -647,10 +643,6 @@
     }
     if (size == 0) size = 1;
 
-#if CALC_EXACT_MALLOC_SIZE
-    size += sizeof(size_t);
-#endif
-
     if ((ruby_gc_stress && !ruby_disable_gc_stress) ||
 	(malloc_increase+size) > malloc_limit) {
 	garbage_collect_with_gvl(objspace);
@@ -665,13 +657,9 @@
 	}
     }
     malloc_increase += size;
-
-#if CALC_EXACT_MALLOC_SIZE
+    
     objspace->malloc_params.allocated_size += size;
     objspace->malloc_params.allocations++;
-    ((size_t *)mem)[0] = size;
-    mem = (size_t *)mem + 1;
-#endif
 
     return mem;
 }
@@ -691,12 +679,8 @@
     }
     if (ruby_gc_stress && !ruby_disable_gc_stress)
 	garbage_collect_with_gvl(objspace);
-
-#if CALC_EXACT_MALLOC_SIZE
-    size += sizeof(size_t);
+	
     objspace->malloc_params.allocated_size -= size;
-    ptr = (size_t *)ptr - 1;
-#endif
 
     mem = realloc(ptr, size);
     if (!mem) {
@@ -708,27 +692,15 @@
         }
     }
     malloc_increase += size;
-
-#if CALC_EXACT_MALLOC_SIZE
+    
     objspace->malloc_params.allocated_size += size;
-    ((size_t *)mem)[0] = size;
-    mem = (size_t *)mem + 1;
-#endif
-
+    
     return mem;
 }
 
 static void
 vm_xfree(rb_objspace_t *objspace, void *ptr)
 {
-#if CALC_EXACT_MALLOC_SIZE
-    size_t size;
-    ptr = ((size_t *)ptr) - 1;
-    size = ((size_t*)ptr)[0];
-    objspace->malloc_params.allocated_size -= size;
-    objspace->malloc_params.allocations--;
-#endif
-
     free(ptr);
 }
 
@@ -2998,7 +2970,6 @@
     return UINT2NUM((&rb_objspace)->count);
 }
 
-#if CALC_EXACT_MALLOC_SIZE
 /*
  *  call-seq:
  *     GC.malloc_allocated_size -> Integer
@@ -3008,8 +2979,8 @@
  *  It returns the allocated size by malloc().
  */
 
-static VALUE
-gc_malloc_allocated_size(VALUE self)
+VALUE
+rb_gc_malloc_allocated_size(VALUE self)
 {
     return UINT2NUM((&rb_objspace)->malloc_params.allocated_size);
 }
@@ -3023,12 +2994,11 @@
  *  It returns the number of allocated memory object by malloc().
  */
 
-static VALUE
-gc_malloc_allocations(VALUE self)
+VALUE
+rb_gc_malloc_allocations(VALUE self)
 {
     return UINT2NUM((&rb_objspace)->malloc_params.allocations);
 }
-#endif
 
 static VALUE
 gc_profile_record_get(void)
@@ -3186,6 +3156,8 @@
     rb_define_singleton_method(rb_mGC, "stress", gc_stress_get, 0);
     rb_define_singleton_method(rb_mGC, "stress=", gc_stress_set, 1);
     rb_define_singleton_method(rb_mGC, "count", gc_count, 0);
+    rb_define_singleton_method(rb_mGC, "malloc_allocated_size", rb_gc_malloc_allocated_size, 0);
+    rb_define_singleton_method(rb_mGC, "malloc_allocations", rb_gc_malloc_allocations, 0);
     rb_define_method(rb_mGC, "garbage_collect", rb_gc_start, 0);
 
     rb_mProfiler = rb_define_module_under(rb_mGC, "Profiler");
@@ -3196,6 +3168,7 @@
     rb_define_singleton_method(rb_mProfiler, "result", gc_profile_result, 0);
     rb_define_singleton_method(rb_mProfiler, "report", gc_profile_report, -1);
     rb_define_singleton_method(rb_mProfiler, "total_time", gc_profile_total_time, 0);
+    rb_define_singleton_method(rb_mProfiler, "data", gc_profile_record_get, 0);
 
     rb_mObSpace = rb_define_module("ObjectSpace");
     rb_define_module_function(rb_mObSpace, "each_object", os_each_obj, -1);
@@ -3215,9 +3188,4 @@
     rb_define_method(rb_mKernel, "object_id", rb_obj_id, 0);
 
     rb_define_module_function(rb_mObSpace, "count_objects", count_objects, -1);
-
-#if CALC_EXACT_MALLOC_SIZE
-    rb_define_singleton_method(rb_mGC, "malloc_allocated_size", gc_malloc_allocated_size, 0);
-    rb_define_singleton_method(rb_mGC, "malloc_allocations", gc_malloc_allocations, 0);
-#endif
 }
src/rvm/patches/ruby/1.9.2/p180/nossl2.diff000066400000001225147511530530013766 0ustar00diff --git a/ext/openssl/ossl_ssl.c b/ext/openssl/ossl_ssl.c
index e8d2e86..be62fcc 100644
--- a/ext/openssl/ossl_ssl.c
+++ b/ext/openssl/ossl_ssl.c
@@ -107,9 +107,12 @@ struct {
     OSSL_SSL_METHOD_ENTRY(TLSv1),
     OSSL_SSL_METHOD_ENTRY(TLSv1_server),
     OSSL_SSL_METHOD_ENTRY(TLSv1_client),
+#if defined(HAVE_SSLV2_METHOD) && defined(HAVE_SSLV2_SERVER_METHOD) && \
+        defined(HAVE_SSLV2_CLIENT_METHOD)
     OSSL_SSL_METHOD_ENTRY(SSLv2),
     OSSL_SSL_METHOD_ENTRY(SSLv2_server),
     OSSL_SSL_METHOD_ENTRY(SSLv2_client),
+#endif
     OSSL_SSL_METHOD_ENTRY(SSLv3),
     OSSL_SSL_METHOD_ENTRY(SSLv3_server),
     OSSL_SSL_METHOD_ENTRY(SSLv3_client),
src/rvm/patches/ruby/1.9.2/p180/gcdata.patch000066400000007561147511530530014171 0ustar00--- a/gc.c	(revision 31173)
+++ b/gc.c	(working copy)
@@ -291,16 +291,12 @@
     struct gc_list *next;
 };
 
-#define CALC_EXACT_MALLOC_SIZE 0
-
 typedef struct rb_objspace {
     struct {
 	size_t limit;
 	size_t increase;
-#if CALC_EXACT_MALLOC_SIZE
 	size_t allocated_size;
 	size_t allocations;
-#endif
     } malloc_params;
     struct {
 	size_t increment;
@@ -647,10 +643,6 @@
     }
     if (size == 0) size = 1;
 
-#if CALC_EXACT_MALLOC_SIZE
-    size += sizeof(size_t);
-#endif
-
     if ((ruby_gc_stress && !ruby_disable_gc_stress) ||
 	(malloc_increase+size) > malloc_limit) {
 	garbage_collect_with_gvl(objspace);
@@ -665,13 +657,9 @@
 	}
     }
     malloc_increase += size;
-
-#if CALC_EXACT_MALLOC_SIZE
+    
     objspace->malloc_params.allocated_size += size;
     objspace->malloc_params.allocations++;
-    ((size_t *)mem)[0] = size;
-    mem = (size_t *)mem + 1;
-#endif
 
     return mem;
 }
@@ -691,12 +679,8 @@
     }
     if (ruby_gc_stress && !ruby_disable_gc_stress)
 	garbage_collect_with_gvl(objspace);
-
-#if CALC_EXACT_MALLOC_SIZE
-    size += sizeof(size_t);
+	
     objspace->malloc_params.allocated_size -= size;
-    ptr = (size_t *)ptr - 1;
-#endif
 
     mem = realloc(ptr, size);
     if (!mem) {
@@ -708,12 +692,8 @@
         }
     }
     malloc_increase += size;
-
-#if CALC_EXACT_MALLOC_SIZE
+    
     objspace->malloc_params.allocated_size += size;
-    ((size_t *)mem)[0] = size;
-    mem = (size_t *)mem + 1;
-#endif
 
     return mem;
 }
@@ -721,14 +701,6 @@
 static void
 vm_xfree(rb_objspace_t *objspace, void *ptr)
 {
-#if CALC_EXACT_MALLOC_SIZE
-    size_t size;
-    ptr = ((size_t *)ptr) - 1;
-    size = ((size_t*)ptr)[0];
-    objspace->malloc_params.allocated_size -= size;
-    objspace->malloc_params.allocations--;
-#endif
-
     free(ptr);
 }
 
@@ -2998,7 +2970,6 @@
     return UINT2NUM((&rb_objspace)->count);
 }
 
-#if CALC_EXACT_MALLOC_SIZE
 /*
  *  call-seq:
  *     GC.malloc_allocated_size -> Integer
@@ -3008,8 +2979,8 @@
  *  It returns the allocated size by malloc().
  */
 
-static VALUE
-gc_malloc_allocated_size(VALUE self)
+VALUE
+rb_gc_malloc_allocated_size(VALUE self)
 {
     return UINT2NUM((&rb_objspace)->malloc_params.allocated_size);
 }
@@ -3023,12 +2994,11 @@
  *  It returns the number of allocated memory object by malloc().
  */
 
-static VALUE
-gc_malloc_allocations(VALUE self)
+VALUE
+rb_gc_malloc_allocations(VALUE self)
 {
     return UINT2NUM((&rb_objspace)->malloc_params.allocations);
 }
-#endif
 
 static VALUE
 gc_profile_record_get(void)
@@ -3186,6 +3156,8 @@
     rb_define_singleton_method(rb_mGC, "stress", gc_stress_get, 0);
     rb_define_singleton_method(rb_mGC, "stress=", gc_stress_set, 1);
     rb_define_singleton_method(rb_mGC, "count", gc_count, 0);
+    rb_define_singleton_method(rb_mGC, "malloc_allocated_size", rb_gc_malloc_allocated_size, 0);
+    rb_define_singleton_method(rb_mGC, "malloc_allocations", rb_gc_malloc_allocations, 0);
     rb_define_method(rb_mGC, "garbage_collect", rb_gc_start, 0);
 
     rb_mProfiler = rb_define_module_under(rb_mGC, "Profiler");
@@ -3196,6 +3168,7 @@
     rb_define_singleton_method(rb_mProfiler, "result", gc_profile_result, 0);
     rb_define_singleton_method(rb_mProfiler, "report", gc_profile_report, -1);
     rb_define_singleton_method(rb_mProfiler, "total_time", gc_profile_total_time, 0);
+    rb_define_singleton_method(rb_mProfiler, "data", gc_profile_record_get, 0);
 
     rb_mObSpace = rb_define_module("ObjectSpace");
     rb_define_module_function(rb_mObSpace, "each_object", os_each_obj, -1);
@@ -3215,9 +3188,4 @@
     rb_define_method(rb_mKernel, "object_id", rb_obj_id, 0);
 
     rb_define_module_function(rb_mObSpace, "count_objects", count_objects, -1);
-
-#if CALC_EXACT_MALLOC_SIZE
-    rb_define_singleton_method(rb_mGC, "malloc_allocated_size", gc_malloc_allocated_size, 0);
-    rb_define_singleton_method(rb_mGC, "malloc_allocations", gc_malloc_allocations, 0);
-#endif
 }
src/rvm/patches/ruby/changeset_r45225.diff000066400000000656147511530530014302 0ustar00--- a/ext/readline/readline.c	(revision 45224)
+++ b/ext/readline/readline.c	(revision 45225)
@@ -1974,7 +1974,7 @@
 
     rl_attempted_completion_function = readline_attempted_completion_function;
 #if defined(HAVE_RL_PRE_INPUT_HOOK)
-    rl_pre_input_hook = (Function *)readline_pre_input_hook;
+    rl_pre_input_hook = (rl_hook_func_t *)readline_pre_input_hook;
 #endif
 #ifdef HAVE_RL_CATCH_SIGNALS
     rl_catch_signals = 0;
src/rvm/patches/ruby/2.4.1/random_c_using_NR_prefix.patch000066400000001012147511530530017175 0ustar00--- a/random.c
+++ b/random.c
@@ -505,7 +505,7 @@
     CryptGenRandom(prov, size, seed);
     return 0;
 }
-#elif defined __linux__ && defined SYS_getrandom
+#elif defined __linux__ && defined __NR_getrandom
 #include <linux/random.h>
 
 # ifndef GRND_NONBLOCK
@@ -522,7 +522,7 @@
 	if (!need_secure)
 	    flags = GRND_NONBLOCK;
 	errno = 0;
-	ret = syscall(SYS_getrandom, seed, size, flags);
+	ret = syscall(__NR_getrandom, seed, size, flags);
 	if (errno == ENOSYS) {
 	    ATOMIC_SET(try_syscall, 0);
 	    return -1;
src/rvm/patches/ruby/2.5.1/libressl_2_7.patch000066400000001067147511530530014533 0ustar00--- a/ext/openssl/extconf.rb
+++ b/ext/openssl/extconf.rb
@@ -122,8 +122,11 @@
 have_func("SSL_is_server")

 # added in 1.1.0
+if !have_struct_member("SSL", "ctx", "openssl/ssl.h") ||
+    try_static_assert("LIBRESSL_VERSION_NUMBER >= 0x2070000fL", "openssl/opensslv.h")
+  $defs.push("-DHAVE_OPAQUE_OPENSSL")
+end
 have_func("CRYPTO_lock") || $defs.push("-DHAVE_OPENSSL_110_THREADING_API")
-have_struct_member("SSL", "ctx", "openssl/ssl.h") || $defs.push("-DHAVE_OPAQUE_OPENSSL")
 have_func("BN_GENCB_new")
 have_func("BN_GENCB_free")
 have_func("BN_GENCB_get_arg")
src/rvm/patches/ruby/2.1.3/openssl3.patch000066400000003333147511530530014007 0ustar00diff --git a/ext/openssl/extconf.rb b/ext/openssl/extconf.rb
index 8c04cb5..132d803 100644
--- a/ext/openssl/extconf.rb
+++ b/ext/openssl/extconf.rb
@@ -104,6 +104,9 @@
 have_func("SSLv2_method")
 have_func("SSLv2_server_method")
 have_func("SSLv2_client_method")
+have_func("SSLv3_method")
+have_func("SSLv3_server_method")
+have_func("SSLv3_client_method")
 have_func("TLSv1_1_method")
 have_func("TLSv1_1_server_method")
 have_func("TLSv1_1_client_method")
diff --git a/ext/openssl/ossl_ssl.c b/ext/openssl/ossl_ssl.c
index f7cb7f0..47111f6 100644
--- a/ext/openssl/ossl_ssl.c
+++ b/ext/openssl/ossl_ssl.c
@@ -109,9 +109,12 @@ static const struct {
     OSSL_SSL_METHOD_ENTRY(SSLv2_server),
     OSSL_SSL_METHOD_ENTRY(SSLv2_client),
 #endif
+#if defined(HAVE_SSLV3_METHOD) && defined(HAVE_SSLV3_SERVER_METHOD) && \
+        defined(HAVE_SSLV3_CLIENT_METHOD)
     OSSL_SSL_METHOD_ENTRY(SSLv3),
     OSSL_SSL_METHOD_ENTRY(SSLv3_server),
     OSSL_SSL_METHOD_ENTRY(SSLv3_client),
+#endif
     OSSL_SSL_METHOD_ENTRY(SSLv23),
     OSSL_SSL_METHOD_ENTRY(SSLv23_server),
     OSSL_SSL_METHOD_ENTRY(SSLv23_client),
diff --git a/test/openssl/test_ssl.rb b/test/openssl/test_ssl.rb
index 07e081b..0cbfcba 100644
--- a/test/openssl/test_ssl.rb
+++ b/test/openssl/test_ssl.rb
@@ -912,7 +912,7 @@ def test_unset_OP_ALL
   # that has been marked as forbidden, therefore either of these may be raised
   HANDSHAKE_ERRORS = [OpenSSL::SSL::SSLError, Errno::ECONNRESET]

-if OpenSSL::SSL::SSLContext::METHODS.include? :TLSv1
+if OpenSSL::SSL::SSLContext::METHODS.include?(:TLSv1) && OpenSSL::SSL::SSLContext::METHODS.include?(:SSLv3)

   def test_forbid_ssl_v3_for_client
     ctx_proc = Proc.new { |ctx| ctx.options = OpenSSL::SSL::OP_ALL | OpenSSL::SSL::OP_NO_SSLv3 }
src/rvm/patches/ruby/2.2.0/openssl3.patch000066400000003333147511530530014005 0ustar00diff --git a/ext/openssl/extconf.rb b/ext/openssl/extconf.rb
index 8c04cb5..132d803 100644
--- a/ext/openssl/extconf.rb
+++ b/ext/openssl/extconf.rb
@@ -104,6 +104,9 @@
 have_func("SSLv2_method")
 have_func("SSLv2_server_method")
 have_func("SSLv2_client_method")
+have_func("SSLv3_method")
+have_func("SSLv3_server_method")
+have_func("SSLv3_client_method")
 have_func("TLSv1_1_method")
 have_func("TLSv1_1_server_method")
 have_func("TLSv1_1_client_method")
diff --git a/ext/openssl/ossl_ssl.c b/ext/openssl/ossl_ssl.c
index f7cb7f0..47111f6 100644
--- a/ext/openssl/ossl_ssl.c
+++ b/ext/openssl/ossl_ssl.c
@@ -109,9 +109,12 @@ static const struct {
     OSSL_SSL_METHOD_ENTRY(SSLv2_server),
     OSSL_SSL_METHOD_ENTRY(SSLv2_client),
 #endif
+#if defined(HAVE_SSLV3_METHOD) && defined(HAVE_SSLV3_SERVER_METHOD) && \
+        defined(HAVE_SSLV3_CLIENT_METHOD)
     OSSL_SSL_METHOD_ENTRY(SSLv3),
     OSSL_SSL_METHOD_ENTRY(SSLv3_server),
     OSSL_SSL_METHOD_ENTRY(SSLv3_client),
+#endif
     OSSL_SSL_METHOD_ENTRY(SSLv23),
     OSSL_SSL_METHOD_ENTRY(SSLv23_server),
     OSSL_SSL_METHOD_ENTRY(SSLv23_client),
diff --git a/test/openssl/test_ssl.rb b/test/openssl/test_ssl.rb
index 07e081b..0cbfcba 100644
--- a/test/openssl/test_ssl.rb
+++ b/test/openssl/test_ssl.rb
@@ -912,7 +912,7 @@ def test_unset_OP_ALL
   # that has been marked as forbidden, therefore either of these may be raised
   HANDSHAKE_ERRORS = [OpenSSL::SSL::SSLError, Errno::ECONNRESET]

-if OpenSSL::SSL::SSLContext::METHODS.include? :TLSv1
+if OpenSSL::SSL::SSLContext::METHODS.include?(:TLSv1) && OpenSSL::SSL::SSLContext::METHODS.include?(:SSLv3)

   def test_forbid_ssl_v3_for_client
     ctx_proc = Proc.new { |ctx| ctx.options = OpenSSL::SSL::OP_ALL | OpenSSL::SSL::OP_NO_SSLv3 }
src/rvm/patches/ruby/2.2.0/fix_installing_bundled_gems.patch000066400000002024147511530530017755 0ustar00--- a/tool/rbinstall.rb
+++ b/tool/rbinstall.rb
@@ -714,15 +714,15 @@
   directories = Gem.ensure_gem_subdirectories(gem_dir, :mode => $dir_mode)
   prepare "bundle gems", gem_dir, directories
   Dir.glob(srcdir+'/gems/*.gem').each do |gem|
-    Gem.install gem, Gem::Requirement.default, :install_dir => with_destdir(Gem.dir), :domain => :local, :ignore_dependencies => true
+    Gem.install gem, Gem::Requirement.default, :install_dir => with_destdir(gem_dir), :domain => :local, :ignore_dependencies => true
     gemname = Pathname(gem).basename
     puts "#{" "*30}#{gemname}"
   end
   # fix directory permissions
   # TODO: Gem.install should accept :dir_mode option or something
-  File.chmod($dir_mode, *Dir.glob(with_destdir(Gem.dir)+"/**/"))
+  File.chmod($dir_mode, *Dir.glob(with_destdir(gem_dir)+"/**/"))
   # fix .gemspec permissions
-  File.chmod($data_mode, *Dir.glob(with_destdir(Gem.dir)+"/specifications/*.gemspec"))
+  File.chmod($data_mode, *Dir.glob(with_destdir(gem_dir)+"/specifications/*.gemspec"))
 end

 parse_args()
src/rvm/patches/tcs/support_joke.patch000066400000000327147511530530014134 0ustar00--- a/vm_opts.h
+++ b/vm_opts.h
@@ -46,6 +46,6 @@
 #define OPT_STACK_CACHING            0
 
 /* misc */
-#define SUPPORT_JOKE                 0
+#define SUPPORT_JOKE                 1
 
 #endif /* RUBY_VM_OPTS_H */
src/rvm/patches/ree/ruby-binary-shebang.patch000066400000000413147511530530015236 0ustar00--- a/installer.rb
+++ b/installer.rb
@@ -596,7 +596,7 @@
 				rest = nil
 				File.open(filename, 'rb') do |f|
 					shebang = f.readline
-					if shebang =~ /ruby/
+					if shebang =~ /^#!.*ruby/
 						puts "Updating #{filename}..."
 						rest = f.read
 					end
src/rvm/patches/ree/1.8.6/openssl-1.0.patch000066400000016005147511530530014023 0ustar00From 46b84175dfac14a92fd6bcf3b03bc3c3715ab6cb Mon Sep 17 00:00:00 2001
From: nahi <nahi@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>
Date: Sat, 6 Mar 2010 21:47:30 +0000
Subject: [PATCH] backport the commit from trunk:
 Sun Feb 28 11:49:35 2010  NARUSE, Yui  <naruse@ruby-lang.org>

        * openssl/ossl.c (OSSL_IMPL_SK2ARY): for OpenSSL 1.0.
          patched by Jeroen van Meeuwen at [ruby-core:25210]
          fixed by Nobuyoshi Nakada [ruby-core:25238],
          Hongli Lai [ruby-core:27417],
          and Motohiro KOSAKI [ruby-core:28063]

        * ext/openssl/ossl_ssl.c (ossl_ssl_method_tab),
          (ossl_ssl_cipher_to_ary): constified.

        * ext/openssl/ossl_pkcs7.c (pkcs7_get_certs, pkcs7_get_crls):
          split pkcs7_get_certs_or_crls.


git-svn-id: http://svn.ruby-lang.org/repos/ruby/branches/ruby_1_8@26838 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
---
 ext/openssl/ossl.c          |    6 +++---
 ext/openssl/ossl.h          |    7 +++++++
 ext/openssl/ossl_pkcs7.c    |   40 ++++++++++++++++++++++++++++++----------
 ext/openssl/ossl_ssl.c      |    4 ++--
 ext/openssl/ossl_x509attr.c |    5 +++--
 ext/openssl/ossl_x509crl.c  |    4 ++--
 6 files changed, 47 insertions(+), 19 deletions(-)

diff --git a/ext/openssl/ossl.c b/ext/openssl/ossl.c
index d4a2dc1..85ba654 100644
--- a/ext/openssl/ossl.c
+++ b/ext/openssl/ossl.c
@@ -92,7 +92,7 @@ ossl_x509_ary2sk(VALUE ary)
 
 #define OSSL_IMPL_SK2ARY(name, type)	        \
 VALUE						\
-ossl_##name##_sk2ary(STACK *sk)			\
+ossl_##name##_sk2ary(STACK_OF(type) *sk)	\
 {						\
     type *t;					\
     int i, num;					\
@@ -102,7 +102,7 @@ ossl_##name##_sk2ary(STACK *sk)			\
 	OSSL_Debug("empty sk!");		\
 	return Qnil;				\
     }						\
-    num = sk_num(sk);				\
+    num = sk_##type##_num(sk);			\
     if (num < 0) {				\
 	OSSL_Debug("items in sk < -1???");	\
 	return rb_ary_new();			\
@@ -110,7 +110,7 @@ ossl_##name##_sk2ary(STACK *sk)			\
     ary = rb_ary_new2(num);			\
 						\
     for (i=0; i<num; i++) {			\
-	t = (type *)sk_value(sk, i);		\
+	t = sk_##type##_value(sk, i);		\
 	rb_ary_push(ary, ossl_##name##_new(t));	\
     }						\
     return ary;					\
diff --git a/ext/openssl/ossl.h b/ext/openssl/ossl.h
index 9215dc4..d0edb7d 100644
--- a/ext/openssl/ossl.h
+++ b/ext/openssl/ossl.h
@@ -108,6 +108,13 @@ extern VALUE eOSSLError;
 } while (0)
 
 /*
+ * Compatibility
+ */
+#if OPENSSL_VERSION_NUMBER >= 0x10000000L
+#define STACK _STACK
+#endif
+
+/*
  * String to HEXString conversion
  */
 int string2hex(const unsigned char *, int, char **, int *);
diff --git a/ext/openssl/ossl_pkcs7.c b/ext/openssl/ossl_pkcs7.c
index fe1ef7c..b0cc656 100644
--- a/ext/openssl/ossl_pkcs7.c
+++ b/ext/openssl/ossl_pkcs7.c
@@ -572,12 +572,11 @@ ossl_pkcs7_add_certificate(VALUE self, VALUE cert)
     return self;
 }
 
-static STACK *
-pkcs7_get_certs_or_crls(VALUE self, int want_certs)
+static STACK_OF(X509) *
+pkcs7_get_certs(VALUE self)
 {
     PKCS7 *pkcs7;
     STACK_OF(X509) *certs;
-    STACK_OF(X509_CRL) *crls;
     int i;
 
     GetPKCS7(self, pkcs7);
@@ -585,17 +584,38 @@ pkcs7_get_certs_or_crls(VALUE self, int want_certs)
     switch(i){
     case NID_pkcs7_signed:
         certs = pkcs7->d.sign->cert;
-        crls = pkcs7->d.sign->crl;
         break;
     case NID_pkcs7_signedAndEnveloped:
         certs = pkcs7->d.signed_and_enveloped->cert;
+        break;
+    default:
+        certs = NULL;
+    }
+
+    return certs;
+}
+
+static STACK_OF(X509_CRL) *
+pkcs7_get_crls(VALUE self)
+{
+    PKCS7 *pkcs7;
+    STACK_OF(X509_CRL) *crls;
+    int i;
+
+    GetPKCS7(self, pkcs7);
+    i = OBJ_obj2nid(pkcs7->type);
+    switch(i){
+    case NID_pkcs7_signed:
+        crls = pkcs7->d.sign->crl;
+        break;
+    case NID_pkcs7_signedAndEnveloped:
         crls = pkcs7->d.signed_and_enveloped->crl;
         break;
     default:
-        certs = crls = NULL;
+        crls = NULL;
     }
 
-    return want_certs ? certs : crls;
+    return crls;
 }
 
 static VALUE
@@ -610,7 +630,7 @@ ossl_pkcs7_set_certificates(VALUE self, VALUE ary)
     STACK_OF(X509) *certs;
     X509 *cert;
 
-    certs = pkcs7_get_certs_or_crls(self, 1);
+    certs = pkcs7_get_certs(self);
     while((cert = sk_X509_pop(certs))) X509_free(cert);
     rb_block_call(ary, rb_intern("each"), 0, 0, ossl_pkcs7_set_certs_i, self);
 
@@ -620,7 +640,7 @@ ossl_pkcs7_set_certificates(VALUE self, VALUE ary)
 static VALUE
 ossl_pkcs7_get_certificates(VALUE self)
 {
-    return ossl_x509_sk2ary(pkcs7_get_certs_or_crls(self, 1));
+    return ossl_x509_sk2ary(pkcs7_get_certs(self));
 }
 
 static VALUE
@@ -650,7 +670,7 @@ ossl_pkcs7_set_crls(VALUE self, VALUE ary)
     STACK_OF(X509_CRL) *crls;
     X509_CRL *crl;
 
-    crls = pkcs7_get_certs_or_crls(self, 0);
+    crls = pkcs7_get_crls(self);
     while((crl = sk_X509_CRL_pop(crls))) X509_CRL_free(crl);
     rb_block_call(ary, rb_intern("each"), 0, 0, ossl_pkcs7_set_crls_i, self);
 
@@ -660,7 +680,7 @@ ossl_pkcs7_set_crls(VALUE self, VALUE ary)
 static VALUE
 ossl_pkcs7_get_crls(VALUE self)
 {
-    return ossl_x509crl_sk2ary(pkcs7_get_certs_or_crls(self, 0));
+    return ossl_x509crl_sk2ary(pkcs7_get_crls(self));
 }
 
 static VALUE
diff --git a/ext/openssl/ossl_ssl.c b/ext/openssl/ossl_ssl.c
index 432ca21..facf6ca 100644
--- a/ext/openssl/ossl_ssl.c
+++ b/ext/openssl/ossl_ssl.c
@@ -1291,10 +1291,10 @@ ossl_ssl_get_peer_cert_chain(VALUE self)
     }
     chain = SSL_get_peer_cert_chain(ssl);
     if(!chain) return Qnil;
-    num = sk_num(chain);
+    num = sk_X509_num(chain);
     ary = rb_ary_new2(num);
     for (i = 0; i < num; i++){
-	cert = (X509*)sk_value(chain, i);
+	cert = sk_X509_value(chain, i);
 	rb_ary_push(ary, ossl_x509_new(cert));
     }
 
diff --git a/ext/openssl/ossl_x509attr.c b/ext/openssl/ossl_x509attr.c
index 1f817cd..2a4c481 100644
--- a/ext/openssl/ossl_x509attr.c
+++ b/ext/openssl/ossl_x509attr.c
@@ -218,8 +218,9 @@ ossl_x509attr_get_value(VALUE self)
 	ossl_str_adjust(str, p);
     }
     else{
-	length = i2d_ASN1_SET_OF_ASN1_TYPE(attr->value.set, NULL,
-			i2d_ASN1_TYPE, V_ASN1_SET, V_ASN1_UNIVERSAL, 0);
+	length = i2d_ASN1_SET_OF_ASN1_TYPE(attr->value.set,
+			(unsigned char **) NULL, i2d_ASN1_TYPE,
+			V_ASN1_SET, V_ASN1_UNIVERSAL, 0);
 	str = rb_str_new(0, length);
 	p = (unsigned char *)RSTRING_PTR(str);
 	i2d_ASN1_SET_OF_ASN1_TYPE(attr->value.set, &p,
diff --git a/ext/openssl/ossl_x509crl.c b/ext/openssl/ossl_x509crl.c
index 1be9640..818fdba 100644
--- a/ext/openssl/ossl_x509crl.c
+++ b/ext/openssl/ossl_x509crl.c
@@ -264,7 +264,7 @@ ossl_x509crl_get_revoked(VALUE self)
     VALUE ary, revoked;
 
     GetX509CRL(self, crl);
-    num = sk_X509_CRL_num(X509_CRL_get_REVOKED(crl));
+    num = sk_X509_REVOKED_num(X509_CRL_get_REVOKED(crl));
     if (num < 0) {
 	OSSL_Debug("num < 0???");
 	return rb_ary_new();
@@ -272,7 +272,7 @@ ossl_x509crl_get_revoked(VALUE self)
     ary = rb_ary_new2(num);
     for(i=0; i<num; i++) {
 	/* NO DUP - don't free! */
-	rev = (X509_REVOKED *)sk_X509_CRL_value(X509_CRL_get_REVOKED(crl), i);
+	rev = sk_X509_REVOKED_value(X509_CRL_get_REVOKED(crl), i);
 	revoked = ossl_x509revoked_new(rev);
 	rb_ary_push(ary, revoked);
     }
-- 
1.7.0.3
src/rvm/patches/ree/1.8.6/perftools-gcc46.patch000066400000000535147511530530014766 0ustar00--- a/vendor/google-perftools-1.2/src/system-alloc.cc	2011-11-11 20:31:45.809796278 -0800
+++ b/vendor/google-perftools-1.2/src/system-alloc.cc	2011-11-11 20:33:00.067244007 -0800
@@ -31,6 +31,7 @@
 // Author: Sanjay Ghemawat
 
 #include "config.h"
+#include <stddef.h>
 #if defined HAVE_STDINT_H
 #include <stdint.h>
 #elif defined HAVE_INTTYPES_H
src/rvm/patches/ree/1.8.6/no_sslv2.diff000066400000001252147511530530013420 0ustar00Index: ossl_ssl.c
===================================================================
--- a/ext/openssl/ossl_ssl.c	(revision 32381)
+++ b/ext/openssl/ossl_ssl.c	(revision 32382)
@@ -107,9 +107,12 @@
     OSSL_SSL_METHOD_ENTRY(TLSv1),
     OSSL_SSL_METHOD_ENTRY(TLSv1_server),
     OSSL_SSL_METHOD_ENTRY(TLSv1_client),
+#if defined(HAVE_SSLV2_METHOD) && defined(HAVE_SSLV2_SERVER_METHOD) && \
+        defined(HAVE_SSLV2_CLIENT_METHOD)	
     OSSL_SSL_METHOD_ENTRY(SSLv2),
     OSSL_SSL_METHOD_ENTRY(SSLv2_server),
     OSSL_SSL_METHOD_ENTRY(SSLv2_client),
+#endif
     OSSL_SSL_METHOD_ENTRY(SSLv3),
     OSSL_SSL_METHOD_ENTRY(SSLv3_server),
     OSSL_SSL_METHOD_ENTRY(SSLv3_client),
src/rvm/patches/ree/1.8.6/stdout-rouge-fix.patch000066400000001273147511530530015272 0ustar00--- a/lib/mkmf.rb	2009-06-10 09:09:22.000000000 +0200
+++ b/lib/mkmf.rb	2011-11-12 02:53:05.862766935 +0100
@@ -168,19 +168,25 @@
 module Logging
   @log = nil
   @logfile = 'mkmf.log'
-  @orgerr = $stderr.dup
-  @orgout = $stdout.dup
   @postpone = 0
 
   def self::open
     @log ||= File::open(@logfile, 'w')
     @log.sync = true
+    orgerr = $stderr.dup
+    orgout = $stdout.dup
     $stderr.reopen(@log)
     $stdout.reopen(@log)
     yield
   ensure
-    $stderr.reopen(@orgerr)
-    $stdout.reopen(@orgout)
+    if orgerr
+      $stderr.reopen(orgerr)
+      orgerr.close
+    end
+    if orgout
+      $stdout.reopen(orgout)
+      orgout.close
+    end
   end
 
   def self::message(*s)
src/rvm/patches/ree/1.8.6/tcmalloc.patch000066400000002000147511530530013630 0ustar00--- a/vendor/google-perftools-1.2/src/tcmalloc.cc       2011-02-24 02:09:12.000000000 -0800
+++ b/vendor/google-perftools-1.2/src/tcmalloc.cc       2011-11-11 12:46:13.704738476 -0800
@@ -137,6 +137,13 @@
 # define WIN32_DO_PATCHING 1
 #endif
 
+// GLibc 2.14+ requires the hook functions be declared volatile, based on the value of the
+// define __MALLOC_HOOK_VOLATILE. For compatibility with older/non-GLibc implementations,
+// provide an empty definition.
+#if !defined(__MALLOC_HOOK_VOLATILE)
+#define __MALLOC_HOOK_VOLATILE
+#endif
+
 using STL_NAMESPACE::max;
 using STL_NAMESPACE::numeric_limits;
 using STL_NAMESPACE::vector;
@@ -1669,5 +1676,5 @@ static void *MemalignOverride(size_t align, size_t size, const void *caller)
   MallocHook::InvokeNewHook(result, size);
   return result;
 }
-void *(*__memalign_hook)(size_t, size_t, const void *) = MemalignOverride;
+void *(*__MALLOC_HOOK_VOLATILE __memalign_hook)(size_t, size_t, const void *) = MemalignOverride;
 #endif  // #ifndef TCMALLOC_FOR_DEBUGALLOCATION
src/rvm/patches/ree/lib64.patch000066400000001663147511530530012316 0ustar00--- a/installer.rb
+++ b/installer.rb
@@ -281,7 +281,7 @@
 		if install_autoconf_package('source', 'Ruby Enterprise Edition')
 			# Some installed files may have wrong permissions
 			# (not world-readable). So we fix this.
-			if sh("chmod -R g+r,o+r,o-w #{@destdir}#{@prefix}/lib/ruby")
+			if sh("chmod -R g+r,o+r,o-w #{@destdir}#{@prefix}/lib*/ruby")
 				if @using_system_allocator_library &&
 				   !sh("install source/libsystem_allocator.dylib #{@destdir}#{@prefix}/lib/")
 					return false
@@ -307,7 +307,7 @@
 	def install_rubygems
 		# We might be installing into a fakeroot, so add the fakeroot's library
 		# search paths to RUBYLIB so that gem installation will work.
-		basedir = "#{@destdir}#{@prefix}/lib/ruby"
+		basedir = "#{@destdir}#{@prefix}/lib*/ruby"
 		libdir = "#{basedir}/1.8"
 		archname = File.basename(File.dirname(Dir["#{libdir}/*/thread.#{PlatformInfo::RUBYLIBEXT}"].first))
 		extlibdir = "#{libdir}/#{archname}"
src/rvm/patches/ree/GH-488.patch000066400000001064147511530530012210 0ustar00--- trunk/ext/openssl/ossl_ssl.c	2013/12/25 01:40:53	44401
+++ trunk/ext/openssl/ossl_ssl.c	2013/12/25 01:42:09	44402
@@ -2229,7 +2229,9 @@
     ossl_ssl_def_const(OP_NETSCAPE_REUSE_CIPHER_CHANGE_BUG);
     ossl_ssl_def_const(OP_SSLREF2_REUSE_CERT_TYPE_BUG);
     ossl_ssl_def_const(OP_MICROSOFT_BIG_SSLV3_BUFFER);
+#if defined(SSL_OP_MSIE_SSLV2_RSA_PADDING)
     ossl_ssl_def_const(OP_MSIE_SSLV2_RSA_PADDING);
+#endif
     ossl_ssl_def_const(OP_SSLEAY_080_CLIENT_DH_BUG);
     ossl_ssl_def_const(OP_TLS_D5_BUG);
     ossl_ssl_def_const(OP_TLS_BLOCK_PADDING_BUG);
src/rvm/patches/ree/1.8.7/p358-p374.patch000066400000166141147511530530013246 0ustar00From c31e7c1e8b2895ef33204938487597e2b3acaaf7 Mon Sep 17 00:00:00 2001
From: nobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>
Date: Fri, 2 Mar 2012 02:45:35 +0000
Subject: [PATCH 01/19] merge revision(s) 25230,34866:

	* marshal.c (struct {dump,load}_arg): manage with dfree, instead
	  of using local variable which may be moved by context switch.
	  [ruby-dev:39425]

	* marshal.c (mark_dump_arg): mark destination string.  patch by
	  Vit Ondruch.  [Bug #4339]

	* marshal.c (clear_dump_arg, clear_load_arg): clean up also data
	  tables as same as symbols tables.


git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/branches/ruby_1_8_7@34867 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
---
 ChangeLog                 |  14 +++++
 marshal.c                 | 145 +++++++++++++++++++++++-----------------------
 test/ruby/test_marshal.rb |  28 +++++++++
 version.h                 |  10 ++--
 4 files changed, 120 insertions(+), 77 deletions(-)

diff --git a/ChangeLog b/ChangeLog
index a09237e..352a30f 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,17 @@
+Fri Mar  2 11:44:33 2012  Nobuyoshi Nakada  <nobu@ruby-lang.org>
+
+	* marshal.c (mark_dump_arg): mark destination string.  patch by
+	  Vit Ondruch.  [Bug #4339]
+
+	* marshal.c (clear_dump_arg, clear_load_arg): clean up also data
+	  tables as same as symbols tables.
+
+Fri Mar  2 11:44:33 2012  Nobuyoshi Nakada  <nobu@ruby-lang.org>
+
+	* marshal.c (struct {dump,load}_arg): manage with dfree, instead
+	  of using local variable which may be moved by context switch.
+	  [ruby-dev:39425]
+
 Wed Feb  8 14:06:59 2012  Hiroshi Nakamura  <nahi@ruby-lang.org>
 
 	* ext/openssl/ossl_ssl.c: Add SSL constants and allow to unset SSL
diff --git a/marshal.c b/marshal.c
index 35e0d60..632f6ca 100644
--- a/marshal.c
+++ b/marshal.c
@@ -85,12 +85,10 @@
 static ID s_getc, s_read, s_write, s_binmode;
 
 struct dump_arg {
-    VALUE obj;
     VALUE str, dest;
     st_table *symbols;
     st_table *data;
     int taint;
-    VALUE wrapper;
 };
 
 struct dump_call_arg {
@@ -104,20 +102,31 @@ struct dump_call_arg {
     struct dump_arg *arg;
     ID sym;
 {
-    if (!DATA_PTR(arg->wrapper)) {
+    if (!arg->symbols) {
         rb_raise(rb_eRuntimeError, "Marshal.dump reentered at %s",
 		 rb_id2name(sym));
     }
 }
 
+static void clear_dump_arg _((struct dump_arg *arg));
+
 static void
 mark_dump_arg(ptr)
     void *ptr;
 {
     struct dump_arg *p = ptr;
-    if (!ptr)
+    if (!p->symbols)
         return;
     rb_mark_set(p->data);
+    rb_gc_mark(p->str);
+}
+
+static void
+free_dump_arg(ptr)
+    void *ptr;
+{
+    clear_dump_arg(ptr);
+    xfree(ptr);
 }
 
 static VALUE
@@ -699,32 +708,18 @@ class2path(klass)
     }
 }
 
-static VALUE
-dump(arg)
-    struct dump_call_arg *arg;
-{
-    w_object(arg->obj, arg->arg, arg->limit);
-    if (arg->arg->dest) {
-	rb_io_write(arg->arg->dest, arg->arg->str);
-	rb_str_resize(arg->arg->str, 0);
-    }
-    return 0;
-}
-
-static VALUE
-dump_ensure(arg)
+static void
+clear_dump_arg(arg)
     struct dump_arg *arg;
 {
-    if (!DATA_PTR(arg->wrapper)) return 0;
+    if (!arg->symbols) return;
     st_free_table(arg->symbols);
+    arg->symbols = 0;
     st_free_table(arg->data);
-    DATA_PTR(arg->wrapper) = 0;
-    arg->wrapper = 0;
+    arg->data = 0;
     if (arg->taint) {
 	OBJ_TAINT(arg->str);
     }
-
-    return 0;
 }
 
 /*
@@ -760,8 +755,8 @@ class2path(klass)
 {
     VALUE obj, port, a1, a2;
     int limit = -1;
-    struct dump_arg arg;
-    struct dump_call_arg c_arg;
+    struct dump_arg *arg;
+    VALUE wrapper;
 
     port = Qnil;
     rb_scan_args(argc, argv, "12", &obj, &a1, &a2);
@@ -775,37 +770,40 @@ class2path(klass)
 	else if (NIL_P(a1)) goto type_error;
 	else port = a1;
     }
-    arg.dest = 0;
-    arg.symbols = st_init_numtable();
-    arg.data    = st_init_numtable();
-    arg.taint   = Qfalse;
-    arg.str = rb_str_buf_new(0);
-    RBASIC(arg.str)->klass = 0;
-    arg.wrapper = Data_Wrap_Struct(rb_cData, mark_dump_arg, 0, &arg);
+    wrapper = Data_Make_Struct(rb_cData, struct dump_arg, mark_dump_arg, free_dump_arg, arg);
+    arg->dest = 0;
+    arg->symbols = st_init_numtable();
+    arg->data    = st_init_numtable();
+    arg->taint   = Qfalse;
+    arg->str = rb_str_buf_new(0);
+    RBASIC(arg->str)->klass = 0;
     if (!NIL_P(port)) {
 	if (!rb_respond_to(port, s_write)) {
 	  type_error:
 	    rb_raise(rb_eTypeError, "instance of IO needed");
 	}
-	arg.dest = port;
+	arg->dest = port;
 	if (rb_respond_to(port, s_binmode)) {
 	    rb_funcall2(port, s_binmode, 0, 0);
-	    check_dump_arg(&arg, s_binmode);
+	    check_dump_arg(arg, s_binmode);
 	}
     }
     else {
-	port = arg.str;
+	port = arg->str;
     }
 
-    c_arg.obj   = obj;
-    c_arg.arg   = &arg;
-    c_arg.limit = limit;
+    w_byte(MARSHAL_MAJOR, arg);
+    w_byte(MARSHAL_MINOR, arg);
 
-    w_byte(MARSHAL_MAJOR, &arg);
-    w_byte(MARSHAL_MINOR, &arg);
+    w_object(obj, arg, limit);
+    if (arg->dest) {
+	rb_io_write(arg->dest, arg->str);
+	rb_str_resize(arg->str, 0);
+    }
 
-    rb_ensure(dump, (VALUE)&c_arg, dump_ensure, (VALUE)&arg);
-    RBASIC(arg.str)->klass = rb_cString;
+    RBASIC(arg->str)->klass = rb_cString;
+    clear_dump_arg(arg);
+    RB_GC_GUARD(wrapper);
 
     return port;
 }
@@ -817,7 +815,6 @@ struct load_arg {
     st_table *data;
     VALUE proc;
     int taint;
-    VALUE wrapper;
 };
 
 static void
@@ -825,22 +822,31 @@ struct load_arg {
     struct load_arg *arg;
     ID sym;
 {
-    if (!DATA_PTR(arg->wrapper)) {
+    if (!arg->symbols) {
         rb_raise(rb_eRuntimeError, "Marshal.load reentered at %s",
 		 rb_id2name(sym));
     }
 }
 
+static void clear_load_arg _((struct load_arg *arg));
+
 static void
 mark_load_arg(ptr)
     void *ptr;
 {
     struct load_arg *p = ptr;
-    if (!ptr)
+    if (!p->symbols)
         return;
     rb_mark_tbl(p->data);
 }
 
+static void
+free_load_arg(void *ptr)
+{
+    clear_load_arg(ptr);
+    xfree(ptr);
+}
+
 static VALUE r_object _((struct load_arg *arg));
 
 static int
@@ -1415,23 +1421,15 @@ struct load_arg {
     return r_object0(arg, arg->proc, 0, Qnil);
 }
 
-static VALUE
-load(arg)
-    struct load_arg *arg;
-{
-    return r_object(arg);
-}
-
-static VALUE
-load_ensure(arg)
+static void
+clear_load_arg(arg)
     struct load_arg *arg;
 {
-    if (!DATA_PTR(arg->wrapper)) return 0;
+    if (!arg->symbols) return;
     st_free_table(arg->symbols);
+    arg->symbols = 0;
     st_free_table(arg->data);
-    DATA_PTR(arg->wrapper) = 0;
-    arg->wrapper = 0;
-    return 0;
+    arg->data = 0;
 }
 
 /*
@@ -1452,8 +1450,8 @@ struct load_arg {
 {
     VALUE port, proc;
     int major, minor, taint = Qfalse;
-    VALUE v;
-    struct load_arg arg;
+    VALUE v, wrapper;
+    struct load_arg *arg;
 
     rb_scan_args(argc, argv, "11", &port, &proc);
     v = rb_check_string_type(port);
@@ -1470,17 +1468,18 @@ struct load_arg {
     else {
 	rb_raise(rb_eTypeError, "instance of IO needed");
     }
-    arg.src = port;
-    arg.offset = 0;
-    arg.symbols = st_init_numtable();
-    arg.data    = st_init_numtable();
-    arg.proc = 0;
-    arg.wrapper = Data_Wrap_Struct(rb_cData, mark_load_arg, 0, &arg);
-    arg.taint = taint;
-
-    major = r_byte(&arg);
-    minor = r_byte(&arg);
+    wrapper = Data_Make_Struct(rb_cData, struct load_arg, mark_load_arg, free_load_arg, arg);
+    arg->src = port;
+    arg->offset = 0;
+    arg->symbols = st_init_numtable();
+    arg->data    = st_init_numtable();
+    arg->proc = 0;
+    arg->taint = taint;
+
+    major = r_byte(arg);
+    minor = r_byte(arg);
     if (major != MARSHAL_MAJOR || minor > MARSHAL_MINOR) {
+	clear_load_arg(arg);
 	rb_raise(rb_eTypeError, "incompatible marshal file format (can't be read)\n\
 \tformat version %d.%d required; %d.%d given",
 		 MARSHAL_MAJOR, MARSHAL_MINOR, major, minor);
@@ -1491,8 +1490,10 @@ struct load_arg {
 		MARSHAL_MAJOR, MARSHAL_MINOR, major, minor);
     }
 
-    if (!NIL_P(proc)) arg.proc = proc;
-    v = rb_ensure(load, (VALUE)&arg, load_ensure, (VALUE)&arg);
+    if (!NIL_P(proc)) arg->proc = proc;
+    v = r_object(arg);
+    clear_load_arg(arg);
+    RB_GC_GUARD(wrapper);
 
     return v;
 }
diff --git a/test/ruby/test_marshal.rb b/test/ruby/test_marshal.rb
index 5ae521e..d40c9da 100644
--- a/test/ruby/test_marshal.rb
+++ b/test/ruby/test_marshal.rb
@@ -72,6 +72,34 @@ def test_too_long_string
     assert_equal("marshal data too short", e.message)
   end
 
+  class DumpTest
+    def marshal_dump
+      loop { Thread.pass }
+    end
+  end
+
+  class LoadTest
+    def marshal_dump
+      nil
+    end
+    def marshal_load(obj)
+      loop { Thread.pass }
+    end
+  end
+
+  def test_context_switch
+    o = DumpTest.new
+    Thread.new { Marshal.dump(o) }
+    GC.start
+    assert(true, '[ruby-dev:39425]')
+
+    o = LoadTest.new
+    m = Marshal.dump(o)
+    Thread.new { Marshal.load(m) }
+    GC.start
+    assert(true, '[ruby-dev:39425]')
+  end
+
   def test_taint
     x = Object.new
     x.taint
diff --git a/version.h b/version.h
index d6f16f5..1f2a143 100644
--- a/version.h
+++ b/version.h
@@ -1,15 +1,15 @@
 #define RUBY_VERSION "1.8.7"
-#define RUBY_RELEASE_DATE "2012-02-08"
+#define RUBY_RELEASE_DATE "2012-03-02"
 #define RUBY_VERSION_CODE 187
-#define RUBY_RELEASE_CODE 20120208
-#define RUBY_PATCHLEVEL 358
+#define RUBY_RELEASE_CODE 20120302
+#define RUBY_PATCHLEVEL 359
 
 #define RUBY_VERSION_MAJOR 1
 #define RUBY_VERSION_MINOR 8
 #define RUBY_VERSION_TEENY 7
 #define RUBY_RELEASE_YEAR 2012
-#define RUBY_RELEASE_MONTH 2
-#define RUBY_RELEASE_DAY 8
+#define RUBY_RELEASE_MONTH 3
+#define RUBY_RELEASE_DAY 2
 
 #ifdef RUBY_EXTERN
 RUBY_EXTERN const char ruby_version[];
-- 
1.8.5.1


From acc55c25c587fef5c7327c5912f3aa50a969ec34 Mon Sep 17 00:00:00 2001
From: nobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>
Date: Tue, 6 Mar 2012 03:06:11 +0000
Subject: [PATCH 02/19] merge revision(s) 34919:

	* lib/yaml/rubytypes.rb (Exception.yaml_new): fix bug that causes
	  YAML serialization problem for Exception.
	  Exception#initialize doesn't use visible instance variable for
	  the exception message, so call the method with the message.
	  patched by Jingwen Owen Ou <jingweno AT gmail.com>.
	  http://github.com/ruby/ruby/pull/41


git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/branches/ruby_1_8_7@34920 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
---
 ChangeLog                   |  9 ++++++++
 lib/yaml/rubytypes.rb       |  3 ++-
 test/yaml/test_exception.rb | 52 +++++++++++++++++++++++++++++++++++++++++++++
 version.h                   |  8 +++----
 4 files changed, 67 insertions(+), 5 deletions(-)
 create mode 100644 test/yaml/test_exception.rb

diff --git a/ChangeLog b/ChangeLog
index 352a30f..886be66 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,12 @@
+Tue Mar  6 12:05:42 2012  Nobuyoshi Nakada  <nobu@ruby-lang.org>
+
+	* lib/yaml/rubytypes.rb (Exception.yaml_new): fix bug that causes
+	  YAML serialization problem for Exception.
+	  Exception#initialize doesn't use visible instance variable for
+	  the exception message, so call the method with the message.
+	  patched by Jingwen Owen Ou <jingweno AT gmail.com>.
+	  http://github.com/ruby/ruby/pull/41
+
 Fri Mar  2 11:44:33 2012  Nobuyoshi Nakada  <nobu@ruby-lang.org>
 
 	* marshal.c (mark_dump_arg): mark destination string.  patch by
diff --git a/lib/yaml/rubytypes.rb b/lib/yaml/rubytypes.rb
index 35b7191..55d59fa 100644
--- a/lib/yaml/rubytypes.rb
+++ b/lib/yaml/rubytypes.rb
@@ -117,7 +117,8 @@ def to_yaml( opts = {} )
 class Exception
     yaml_as "tag:ruby.yaml.org,2002:exception"
     def Exception.yaml_new( klass, tag, val )
-        o = YAML.object_maker( klass, { 'mesg' => val.delete( 'message' ) } )
+        o = klass.allocate
+        Exception.instance_method(:initialize).bind(o).call(val.delete('message'))
         val.each_pair do |k,v|
             o.instance_variable_set("@#{k}", v)
         end
diff --git a/test/yaml/test_exception.rb b/test/yaml/test_exception.rb
new file mode 100644
index 0000000..1dc3044
--- /dev/null
+++ b/test/yaml/test_exception.rb
@@ -0,0 +1,52 @@
+require 'test/unit'
+require 'yaml'
+
+module Syck
+  class TestException < Test::Unit::TestCase
+    class Wups < Exception
+      attr_reader :foo, :bar
+      def initialize *args
+        super
+        @foo = 1
+        @bar = 2
+      end
+
+      def ==(other)
+        self.class == other.class and
+          self.message == other.message and
+          self.backtrace == other.backtrace
+      end
+    end
+
+    def setup
+      @wups = Wups.new('test_message')
+    end
+
+    def test_to_yaml
+      w = YAML.load(@wups.to_yaml)
+      assert_equal @wups, w
+      assert_equal 1, w.foo
+      assert_equal 2, w.bar
+    end
+
+    def test_dump
+      w = YAML.load(@wups.to_yaml)
+      assert_equal @wups, w
+      assert_equal 1, w.foo
+      assert_equal 2, w.bar
+    end
+
+    def test_to_yaml_properties
+      class << @wups
+        def to_yaml_properties
+          [:@foo]
+        end
+      end
+
+      w = YAML.load(YAML.dump(@wups))
+      assert_equal @wups, w
+      assert_equal 1, w.foo
+      assert_nil w.bar
+    end
+  end
+end
diff --git a/version.h b/version.h
index 1f2a143..13e41e8 100644
--- a/version.h
+++ b/version.h
@@ -1,15 +1,15 @@
 #define RUBY_VERSION "1.8.7"
-#define RUBY_RELEASE_DATE "2012-03-02"
+#define RUBY_RELEASE_DATE "2012-03-06"
 #define RUBY_VERSION_CODE 187
-#define RUBY_RELEASE_CODE 20120302
-#define RUBY_PATCHLEVEL 359
+#define RUBY_RELEASE_CODE 20120306
+#define RUBY_PATCHLEVEL 360
 
 #define RUBY_VERSION_MAJOR 1
 #define RUBY_VERSION_MINOR 8
 #define RUBY_VERSION_TEENY 7
 #define RUBY_RELEASE_YEAR 2012
 #define RUBY_RELEASE_MONTH 3
-#define RUBY_RELEASE_DAY 2
+#define RUBY_RELEASE_DAY 6
 
 #ifdef RUBY_EXTERN
 RUBY_EXTERN const char ruby_version[];
-- 
1.8.5.1


From 698d21a276f862da823c7a6536f9c15afe602e19 Mon Sep 17 00:00:00 2001
From: nobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>
Date: Sat, 14 Apr 2012 09:52:10 +0000
Subject: [PATCH 03/19] merge revision(s) 35325:

	* bignum.c (rb_big2str0): prevent working clone from
	  GC. [exerb-dev:0578].  patched by MURASE Masamitsu
	  <masamitsu.murase AT gmail.com> at [exerb-dev:0580]


git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/branches/ruby_1_8_7@35327 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
---
 ChangeLog |  6 ++++++
 bignum.c  |  3 ++-
 version.h | 10 +++++-----
 3 files changed, 13 insertions(+), 6 deletions(-)

diff --git a/ChangeLog b/ChangeLog
index 886be66..fae1bb1 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,9 @@
+Sat Apr 14 18:51:41 2012  Nobuyoshi Nakada  <nobu@ruby-lang.org>
+
+	* bignum.c (rb_big2str0): prevent working clone from
+	  GC. [exerb-dev:0578].  patched by MURASE Masamitsu
+	  <masamitsu.murase AT gmail.com> at [exerb-dev:0580]
+
 Tue Mar  6 12:05:42 2012  Nobuyoshi Nakada  <nobu@ruby-lang.org>
 
 	* lib/yaml/rubytypes.rb (Exception.yaml_new): fix bug that causes
diff --git a/bignum.c b/bignum.c
index 0c5ae3e..77697ae 100644
--- a/bignum.c
+++ b/bignum.c
@@ -772,7 +772,7 @@
     int base;
     int trim;
 {
-    volatile VALUE t;
+    VALUE t;
     BDIGIT *ds;
     long i, j, hbase;
     VALUE ss;
@@ -847,6 +847,7 @@
 	    if (trim && i == 0 && num == 0) break;
 	}
     }
+    RB_GC_GUARD(t);
     if (trim) {while (s[j] == '0') j++;}
     i = RSTRING(ss)->len - j;
     if (RBIGNUM(x)->sign) {
diff --git a/version.h b/version.h
index 13e41e8..a2b4487 100644
--- a/version.h
+++ b/version.h
@@ -1,15 +1,15 @@
 #define RUBY_VERSION "1.8.7"
-#define RUBY_RELEASE_DATE "2012-03-06"
+#define RUBY_RELEASE_DATE "2012-04-14"
 #define RUBY_VERSION_CODE 187
-#define RUBY_RELEASE_CODE 20120306
-#define RUBY_PATCHLEVEL 360
+#define RUBY_RELEASE_CODE 20120414
+#define RUBY_PATCHLEVEL 361
 
 #define RUBY_VERSION_MAJOR 1
 #define RUBY_VERSION_MINOR 8
 #define RUBY_VERSION_TEENY 7
 #define RUBY_RELEASE_YEAR 2012
-#define RUBY_RELEASE_MONTH 3
-#define RUBY_RELEASE_DAY 6
+#define RUBY_RELEASE_MONTH 4
+#define RUBY_RELEASE_DAY 14
 
 #ifdef RUBY_EXTERN
 RUBY_EXTERN const char ruby_version[];
-- 
1.8.5.1


From a4e76099bf44ae7d75bd24c3c8233d710e590fac Mon Sep 17 00:00:00 2001
From: nobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>
Date: Fri, 11 May 2012 05:09:58 +0000
Subject: [PATCH 04/19] 	* ext/bigdecimal/bigdecimal.c (PUSH): to prevent VALUE
 from GC, 	  must not cast it to unsigned long, which may be shorter than
 	  VALUE, and the result can be mere garbage.

git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/branches/ruby_1_8_7@35619 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
---
 ChangeLog                   |  6 ++++++
 ext/bigdecimal/bigdecimal.c |  2 +-
 version.h                   | 10 +++++-----
 3 files changed, 12 insertions(+), 6 deletions(-)

diff --git a/ChangeLog b/ChangeLog
index fae1bb1..9201d3e 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,9 @@
+Fri May 11 14:09:48 2012  Nobuyoshi Nakada  <nobu@ruby-lang.org>
+
+	* ext/bigdecimal/bigdecimal.c (PUSH): to prevent VALUE from GC,
+	  must not cast it to unsigned long, which may be shorter than
+	  VALUE, and the result can be mere garbage.
+
 Sat Apr 14 18:51:41 2012  Nobuyoshi Nakada  <nobu@ruby-lang.org>
 
 	* bignum.c (rb_big2str0): prevent working clone from
diff --git a/ext/bigdecimal/bigdecimal.c b/ext/bigdecimal/bigdecimal.c
index 7846c0d..16be520 100644
--- a/ext/bigdecimal/bigdecimal.c
+++ b/ext/bigdecimal/bigdecimal.c
@@ -32,7 +32,7 @@
 
 /* MACRO's to guard objects from GC by keeping them in stack */
 #define ENTER(n) volatile VALUE vStack[n];int iStack=0
-#define PUSH(x)  vStack[iStack++] = (unsigned long)(x);
+#define PUSH(x)  vStack[iStack++] = (VALUE)(x);
 #define SAVE(p)  PUSH(p->obj);
 #define GUARD_OBJ(p,y) {p=y;SAVE(p);}
 
diff --git a/version.h b/version.h
index a2b4487..9dcae40 100644
--- a/version.h
+++ b/version.h
@@ -1,15 +1,15 @@
 #define RUBY_VERSION "1.8.7"
-#define RUBY_RELEASE_DATE "2012-04-14"
+#define RUBY_RELEASE_DATE "2012-05-11"
 #define RUBY_VERSION_CODE 187
-#define RUBY_RELEASE_CODE 20120414
-#define RUBY_PATCHLEVEL 361
+#define RUBY_RELEASE_CODE 20120511
+#define RUBY_PATCHLEVEL 362
 
 #define RUBY_VERSION_MAJOR 1
 #define RUBY_VERSION_MINOR 8
 #define RUBY_VERSION_TEENY 7
 #define RUBY_RELEASE_YEAR 2012
-#define RUBY_RELEASE_MONTH 4
-#define RUBY_RELEASE_DAY 14
+#define RUBY_RELEASE_MONTH 5
+#define RUBY_RELEASE_DAY 11
 
 #ifdef RUBY_EXTERN
 RUBY_EXTERN const char ruby_version[];
-- 
1.8.5.1


From b0901e0f63ed056c9c95273052a029930cad87af Mon Sep 17 00:00:00 2001
From: knu <knu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>
Date: Mon, 21 May 2012 07:35:21 +0000
Subject: [PATCH 05/19] * ext/syslog/syslog.c (mSyslog_inspect): Make sure self
 is a   module before calling rb_class2name().

git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/branches/ruby_1_8_7@35746 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
---
 ChangeLog           | 5 +++++
 ext/syslog/syslog.c | 2 ++
 2 files changed, 7 insertions(+)

diff --git a/ChangeLog b/ChangeLog
index 9201d3e..3c477b4 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,8 @@
+Mon May 21 16:29:47 2012  Akinori MUSHA  <knu@iDaemons.org>
+
+	* ext/syslog/syslog.c (mSyslog_inspect): Make sure self is a
+	  module before calling rb_class2name().
+
 Fri May 11 14:09:48 2012  Nobuyoshi Nakada  <nobu@ruby-lang.org>
 
 	* ext/bigdecimal/bigdecimal.c (PUSH): to prevent VALUE from GC,
diff --git a/ext/syslog/syslog.c b/ext/syslog/syslog.c
index ecc4931..1372cb7 100644
--- a/ext/syslog/syslog.c
+++ b/ext/syslog/syslog.c
@@ -168,6 +168,8 @@ static VALUE mSyslog_inspect(VALUE self)
 {
     char buf[1024];
 
+    Check_Type(self, T_MODULE);
+
     if (syslog_opened) {
 	snprintf(buf, sizeof(buf),
 	  "<#%s: opened=true, ident=\"%s\", options=%d, facility=%d, mask=%d>",
-- 
1.8.5.1


From c869f69c3543552c0ffa27628d587bae460b6213 Mon Sep 17 00:00:00 2001
From: svn <svn@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>
Date: Mon, 21 May 2012 07:35:26 +0000
Subject: [PATCH 06/19] * 2012-05-21

git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/branches/ruby_1_8_7@35747 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
---
 version.h | 6 +++---
 1 file changed, 3 insertions(+), 3 deletions(-)

diff --git a/version.h b/version.h
index 9dcae40..927ae53 100644
--- a/version.h
+++ b/version.h
@@ -1,7 +1,7 @@
 #define RUBY_VERSION "1.8.7"
-#define RUBY_RELEASE_DATE "2012-05-11"
+#define RUBY_RELEASE_DATE "2012-05-21"
 #define RUBY_VERSION_CODE 187
-#define RUBY_RELEASE_CODE 20120511
+#define RUBY_RELEASE_CODE 20120521
 #define RUBY_PATCHLEVEL 362
 
 #define RUBY_VERSION_MAJOR 1
@@ -9,7 +9,7 @@
 #define RUBY_VERSION_TEENY 7
 #define RUBY_RELEASE_YEAR 2012
 #define RUBY_RELEASE_MONTH 5
-#define RUBY_RELEASE_DAY 11
+#define RUBY_RELEASE_DAY 21
 
 #ifdef RUBY_EXTERN
 RUBY_EXTERN const char ruby_version[];
-- 
1.8.5.1


From 69883b3ee6502cc210e598fd440b65e20629cd9c Mon Sep 17 00:00:00 2001
From: shyouhei <shyouhei@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>
Date: Wed, 6 Jun 2012 05:20:08 +0000
Subject: [PATCH 07/19] merge revision(s) 33611: 	*
 lib/webrick/utils.rb: fix fcntl call. 	* lib/drb/unix.rb: ditto.

git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/branches/ruby_1_8_7@35939 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
---
 ChangeLog            |  6 ++++++
 lib/drb/unix.rb      |  2 +-
 lib/webrick/utils.rb |  2 +-
 version.h            | 10 +++++-----
 4 files changed, 13 insertions(+), 7 deletions(-)

diff --git a/ChangeLog b/ChangeLog
index 3c477b4..dd5808a 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,9 @@
+Wed Jun  6 14:06:02 2012  Tanaka Akira  <akr@fsij.org>
+
+	* lib/webrick/utils.rb: fix fcntl call.
+
+	* lib/drb/unix.rb: ditto.
+
 Mon May 21 16:29:47 2012  Akinori MUSHA  <knu@iDaemons.org>
 
 	* ext/syslog/syslog.c (mSyslog_inspect): Make sure self is a
diff --git a/lib/drb/unix.rb b/lib/drb/unix.rb
index 57feed8..90ca292 100644
--- a/lib/drb/unix.rb
+++ b/lib/drb/unix.rb
@@ -100,7 +100,7 @@ def accept
     end
 
     def set_sockopt(soc)
-      soc.fcntl(Fcntl::F_SETFL, Fcntl::FD_CLOEXEC) if defined? Fcntl::FD_CLOEXEC
+      soc.fcntl(Fcntl::F_SETFD, Fcntl::FD_CLOEXEC) if defined? Fcntl::FD_CLOEXEC
     end
   end
 
diff --git a/lib/webrick/utils.rb b/lib/webrick/utils.rb
index cf9da6f..1c29ef5 100644
--- a/lib/webrick/utils.rb
+++ b/lib/webrick/utils.rb
@@ -29,7 +29,7 @@ def set_non_blocking(io)
 
     def set_close_on_exec(io)
       if defined?(Fcntl::FD_CLOEXEC)
-        io.fcntl(Fcntl::FD_CLOEXEC, 1)
+        io.fcntl(Fcntl::F_SETFD, Fcntl::FD_CLOEXEC)
       end
     end
     module_function :set_close_on_exec
diff --git a/version.h b/version.h
index 927ae53..d084c57 100644
--- a/version.h
+++ b/version.h
@@ -1,15 +1,15 @@
 #define RUBY_VERSION "1.8.7"
-#define RUBY_RELEASE_DATE "2012-05-21"
+#define RUBY_RELEASE_DATE "2012-06-06"
 #define RUBY_VERSION_CODE 187
-#define RUBY_RELEASE_CODE 20120521
-#define RUBY_PATCHLEVEL 362
+#define RUBY_RELEASE_CODE 20120606
+#define RUBY_PATCHLEVEL 363
 
 #define RUBY_VERSION_MAJOR 1
 #define RUBY_VERSION_MINOR 8
 #define RUBY_VERSION_TEENY 7
 #define RUBY_RELEASE_YEAR 2012
-#define RUBY_RELEASE_MONTH 5
-#define RUBY_RELEASE_DAY 21
+#define RUBY_RELEASE_MONTH 6
+#define RUBY_RELEASE_DAY 6
 
 #ifdef RUBY_EXTERN
 RUBY_EXTERN const char ruby_version[];
-- 
1.8.5.1


From 996e9cf4e9c78c4bf8fdbf937f3984e0b2eb6e40 Mon Sep 17 00:00:00 2001
From: shyouhei <shyouhei@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>
Date: Wed, 6 Jun 2012 05:34:55 +0000
Subject: [PATCH 08/19] @nobu you must run make test-all _before_ you check in.

reverting revision r34920 because it fails.


git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/branches/ruby_1_8_7@35940 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
---
 lib/yaml/rubytypes.rb       |  3 +--
 test/yaml/test_exception.rb | 52 ---------------------------------------------
 version.h                   |  2 +-
 3 files changed, 2 insertions(+), 55 deletions(-)
 delete mode 100644 test/yaml/test_exception.rb

diff --git a/lib/yaml/rubytypes.rb b/lib/yaml/rubytypes.rb
index 55d59fa..35b7191 100644
--- a/lib/yaml/rubytypes.rb
+++ b/lib/yaml/rubytypes.rb
@@ -117,8 +117,7 @@ def to_yaml( opts = {} )
 class Exception
     yaml_as "tag:ruby.yaml.org,2002:exception"
     def Exception.yaml_new( klass, tag, val )
-        o = klass.allocate
-        Exception.instance_method(:initialize).bind(o).call(val.delete('message'))
+        o = YAML.object_maker( klass, { 'mesg' => val.delete( 'message' ) } )
         val.each_pair do |k,v|
             o.instance_variable_set("@#{k}", v)
         end
diff --git a/test/yaml/test_exception.rb b/test/yaml/test_exception.rb
deleted file mode 100644
index 1dc3044..0000000
--- a/test/yaml/test_exception.rb
+++ /dev/null
@@ -1,52 +0,0 @@
-require 'test/unit'
-require 'yaml'
-
-module Syck
-  class TestException < Test::Unit::TestCase
-    class Wups < Exception
-      attr_reader :foo, :bar
-      def initialize *args
-        super
-        @foo = 1
-        @bar = 2
-      end
-
-      def ==(other)
-        self.class == other.class and
-          self.message == other.message and
-          self.backtrace == other.backtrace
-      end
-    end
-
-    def setup
-      @wups = Wups.new('test_message')
-    end
-
-    def test_to_yaml
-      w = YAML.load(@wups.to_yaml)
-      assert_equal @wups, w
-      assert_equal 1, w.foo
-      assert_equal 2, w.bar
-    end
-
-    def test_dump
-      w = YAML.load(@wups.to_yaml)
-      assert_equal @wups, w
-      assert_equal 1, w.foo
-      assert_equal 2, w.bar
-    end
-
-    def test_to_yaml_properties
-      class << @wups
-        def to_yaml_properties
-          [:@foo]
-        end
-      end
-
-      w = YAML.load(YAML.dump(@wups))
-      assert_equal @wups, w
-      assert_equal 1, w.foo
-      assert_nil w.bar
-    end
-  end
-end
diff --git a/version.h b/version.h
index d084c57..3b58c4e 100644
--- a/version.h
+++ b/version.h
@@ -2,7 +2,7 @@
 #define RUBY_RELEASE_DATE "2012-06-06"
 #define RUBY_VERSION_CODE 187
 #define RUBY_RELEASE_CODE 20120606
-#define RUBY_PATCHLEVEL 363
+#define RUBY_PATCHLEVEL 364
 
 #define RUBY_VERSION_MAJOR 1
 #define RUBY_VERSION_MINOR 8
-- 
1.8.5.1


From 1acfb03370704aee624b7a1e5ccf4776f40f2895 Mon Sep 17 00:00:00 2001
From: shyouhei <shyouhei@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>
Date: Wed, 6 Jun 2012 05:47:45 +0000
Subject: [PATCH 09/19] merge revision(s) 28324: 	* bignum.c
 (rb_big2dbl), test/ruby/test_bignum.rb (test_to_f): 	  A negative Bignum
 out of Float range should be converted to -Infinity. 	  [ruby-core:30492]
 [Bug #3362]

git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/branches/ruby_1_8_7@35941 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
---
 ChangeLog                | 15 ++++++---------
 bignum.c                 |  5 ++++-
 test/ruby/test_bignum.rb |  6 ++++++
 version.h                |  2 +-
 4 files changed, 17 insertions(+), 11 deletions(-)

diff --git a/ChangeLog b/ChangeLog
index dd5808a..69c7ced 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,9 @@
+Wed Jun  6 14:44:13 2012  Kenta Murata  <mrkn@mrkn.jp>
+
+	* bignum.c (rb_big2dbl), test/ruby/test_bignum.rb (test_to_f):
+	  A negative Bignum out of Float range should be converted to -Infinity.
+	  [ruby-core:30492] [Bug #3362]
+
 Wed Jun  6 14:06:02 2012  Tanaka Akira  <akr@fsij.org>
 
 	* lib/webrick/utils.rb: fix fcntl call.
@@ -21,15 +27,6 @@ Sat Apr 14 18:51:41 2012  Nobuyoshi Nakada  <nobu@ruby-lang.org>
 	  GC. [exerb-dev:0578].  patched by MURASE Masamitsu
 	  <masamitsu.murase AT gmail.com> at [exerb-dev:0580]
 
-Tue Mar  6 12:05:42 2012  Nobuyoshi Nakada  <nobu@ruby-lang.org>
-
-	* lib/yaml/rubytypes.rb (Exception.yaml_new): fix bug that causes
-	  YAML serialization problem for Exception.
-	  Exception#initialize doesn't use visible instance variable for
-	  the exception message, so call the method with the message.
-	  patched by Jingwen Owen Ou <jingweno AT gmail.com>.
-	  http://github.com/ruby/ruby/pull/41
-
 Fri Mar  2 11:44:33 2012  Nobuyoshi Nakada  <nobu@ruby-lang.org>
 
 	* marshal.c (mark_dump_arg): mark destination string.  patch by
diff --git a/bignum.c b/bignum.c
index 77697ae..6c0bf65 100644
--- a/bignum.c
+++ b/bignum.c
@@ -1069,7 +1069,10 @@
 
     if (isinf(d)) {
 	rb_warn("Bignum out of Float range");
-	d = HUGE_VAL;
+	if (d < 0.0)
+	    d = -HUGE_VAL;
+	else
+	    d = HUGE_VAL;
     }
     return d;
 }
diff --git a/test/ruby/test_bignum.rb b/test/ruby/test_bignum.rb
index 99c5952..a0405ca 100644
--- a/test/ruby/test_bignum.rb
+++ b/test/ruby/test_bignum.rb
@@ -103,4 +103,10 @@ def test_too_big_to_s
     e = assert_raise(RangeError) {(1 << big).to_s}
     assert_match(/too big to convert/, e.message)
   end
+
+  def test_to_f
+    inf = 1 / 0.0
+    assert_equal(inf,  (1  << 65536).to_f)
+    assert_equal(-inf, (-1 << 65536).to_f) # [ruby-core:30492] [Bug #3362]
+  end
 end
diff --git a/version.h b/version.h
index 3b58c4e..3d64d07 100644
--- a/version.h
+++ b/version.h
@@ -2,7 +2,7 @@
 #define RUBY_RELEASE_DATE "2012-06-06"
 #define RUBY_VERSION_CODE 187
 #define RUBY_RELEASE_CODE 20120606
-#define RUBY_PATCHLEVEL 364
+#define RUBY_PATCHLEVEL 365
 
 #define RUBY_VERSION_MAJOR 1
 #define RUBY_VERSION_MINOR 8
-- 
1.8.5.1


From d18b653719687756c82c7c800dee5e91b388fefd Mon Sep 17 00:00:00 2001
From: shyouhei <shyouhei@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>
Date: Wed, 6 Jun 2012 06:16:25 +0000
Subject: [PATCH 10/19] merge revision(s) 23432: 	* eval.c
 (rb_thread_join), ext/thread/thread.c (wake_one): adjusts 	  targets of
 rest waiting threads to join.  [ruby-core:23457]

git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/branches/ruby_1_8_7@35942 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
---
 ChangeLog                  |  5 ++++
 eval.c                     | 10 ++++++++
 ext/thread/thread.c        | 26 +++++++++++++++++--
 test/thread/test_thread.rb | 63 ++++++++++++++++++++++++++++++++++++++++++++++
 version.h                  |  2 +-
 5 files changed, 103 insertions(+), 3 deletions(-)

diff --git a/ChangeLog b/ChangeLog
index 69c7ced..8956096 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,8 @@
+Wed Jun  6 15:09:00 2012  Nobuyoshi Nakada  <nobu@ruby-lang.org>
+
+	* eval.c (rb_thread_join), ext/thread/thread.c (wake_one): adjusts
+	  targets of rest waiting threads to join.  [ruby-core:23457]
+
 Wed Jun  6 14:44:13 2012  Kenta Murata  <mrkn@mrkn.jp>
 
 	* bignum.c (rb_big2dbl), test/ruby/test_bignum.rb (test_to_f):
diff --git a/test/thread/test_thread.rb b/test/thread/test_thread.rb
index 699f4fe..e3246d1 100644
--- a/test/thread/test_thread.rb
+++ b/test/thread/test_thread.rb
@@ -86,5 +86,68 @@ def test_queue_rescue
         assert_nothing_raised("[ruby-dev:37545]") {assert_equal(1, queue.pop)}
         assert(queue.empty?)
     end
+
+  # This test checks that a thread in Mutex#lock which is raised is
+  # completely removed from the wait_list of the mutex
+  def test_mutex_exception_handling
+    m = Mutex.new
+    m.lock
+
+    sleeping = false
+    t = Thread.new do
+      begin
+        m.lock
+      rescue
+      end
+
+      sleeping = true
+      # Keep that thread alive: if the thread returns, the test method
+      # won't be able to check that +m+ has not been taken (dead mutex
+      # owners are ignored)
+      sleep
+    end
+
+    # Wait for t to wait for the mutex and raise it
+    while true
+      sleep 0.1
+      break if t.stop?
+    end
+    t.raise ArgumentError
+    assert(t.alive? || sleeping)
+
+    # Wait for +t+ to reach the sleep
+    while true
+      sleep 0.1
+      break if t.stop?
+    end
+
+    # Now unlock. The mutex should be free, so Mutex#unlock should return nil
+    assert(! m.unlock)
+  end
+
+  def test_mutex_join
+    m = Mutex.new
+    m.lock
+    wt2 = Thread.new do
+      m.lock
+      sleep 0.5
+      m.unlock
+    end
+
+    # Ensure wt2 is waiting on m
+    sleep 0.1
+
+    wt1 = Thread.new do
+      m.lock
+      m.unlock
+    end
+    # Ensure wt1 is waiting on m
+    sleep 0.1
+
+    # Give it to wt2
+    m.unlock
+
+    assert_nothing_raised {wt1.join}
+  end
 end
 
diff --git a/version.h b/version.h
index 3d64d07..293cd6e 100644
--- a/version.h
+++ b/version.h
@@ -2,7 +2,7 @@
 #define RUBY_RELEASE_DATE "2012-06-06"
 #define RUBY_VERSION_CODE 187
 #define RUBY_RELEASE_CODE 20120606
-#define RUBY_PATCHLEVEL 365
+#define RUBY_PATCHLEVEL 366
 
 #define RUBY_VERSION_MAJOR 1
 #define RUBY_VERSION_MINOR 8
-- 
1.8.5.1


From 15fbb87b594a47ed622829cfdd6891eb97ea4726 Mon Sep 17 00:00:00 2001
From: shyouhei <shyouhei@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>
Date: Thu, 7 Jun 2012 10:05:59 +0000
Subject: [PATCH 11/19] merge revision(s) 30993: 	*
 ext/bigdecimal/bigdecimal.c (VpMemAlloc): Fixes a bug reported by Drew Yao
 <ayao at apple.com>

git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/branches/ruby_1_8_7@35953 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
---
 ChangeLog                   | 5 +++++
 ext/bigdecimal/bigdecimal.c | 8 ++++----
 version.h                   | 8 ++++----
 3 files changed, 13 insertions(+), 8 deletions(-)

diff --git a/ChangeLog b/ChangeLog
index 8956096..3ac2f87 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,8 @@
+Thu Jun  7 19:00:35 2012  Kenta Murata <mrkn@mrkn.jp>
+
+	* ext/bigdecimal/bigdecimal.c (VpMemAlloc): Fixes a bug reported
+	  by Drew Yao <ayao at apple.com>
+
 Wed Jun  6 15:09:00 2012  Nobuyoshi Nakada  <nobu@ruby-lang.org>
 
 	* eval.c (rb_thread_join), ext/thread/thread.c (wake_one): adjusts
diff --git a/ext/bigdecimal/bigdecimal.c b/ext/bigdecimal/bigdecimal.c
index 16be520..7ebb3f7 100644
--- a/ext/bigdecimal/bigdecimal.c
+++ b/ext/bigdecimal/bigdecimal.c
@@ -2032,11 +2032,11 @@
 VP_EXPORT void *
 VpMemAlloc(U_LONG mb)
 {
-    void *p = xmalloc((unsigned int)mb);
-    if(!p) {
-        VpException(VP_EXCEPTION_MEMORY,"failed to allocate memory",1);
+    void *p = xmalloc(mb);
+    if (!p) {
+        VpException(VP_EXCEPTION_MEMORY, "failed to allocate memory", 1);
     }
-    memset(p,0,mb);
+    memset(p, 0, mb);
 #ifdef _DEBUG
     gnAlloc++; /* Count allocation call */
 #endif /* _DEBUG */
diff --git a/version.h b/version.h
index 293cd6e..7a53a5c 100644
--- a/version.h
+++ b/version.h
@@ -1,15 +1,15 @@
 #define RUBY_VERSION "1.8.7"
-#define RUBY_RELEASE_DATE "2012-06-06"
+#define RUBY_RELEASE_DATE "2012-06-07"
 #define RUBY_VERSION_CODE 187
-#define RUBY_RELEASE_CODE 20120606
-#define RUBY_PATCHLEVEL 366
+#define RUBY_RELEASE_CODE 20120607
+#define RUBY_PATCHLEVEL 367
 
 #define RUBY_VERSION_MAJOR 1
 #define RUBY_VERSION_MINOR 8
 #define RUBY_VERSION_TEENY 7
 #define RUBY_RELEASE_YEAR 2012
 #define RUBY_RELEASE_MONTH 6
-#define RUBY_RELEASE_DAY 6
+#define RUBY_RELEASE_DAY 7
 
 #ifdef RUBY_EXTERN
 RUBY_EXTERN const char ruby_version[];
-- 
1.8.5.1


From ef73b34c87f52be6a87e0f7ab8d5a03bfcaa983f Mon Sep 17 00:00:00 2001
From: shyouhei <shyouhei@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>
Date: Sat, 9 Jun 2012 18:12:07 +0000
Subject: [PATCH 12/19] merge revision(s) 32542: 	* eval.c
 (ruby_setjmp): need to save the stack after r2 (the Table 	  of Contents
 on ppc64) is saved onto the stack by getcontext(). 	  based on
 <https://bugzilla.redhat.com/show_bug.cgi?id=628715>. 	  Bug#4411

git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/branches/ruby_1_8_7@35995 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
---
 ChangeLog |  7 +++++++
 eval.c    | 18 ++++++++++++++----
 version.h |  8 ++++----
 3 files changed, 25 insertions(+), 8 deletions(-)

diff --git a/ChangeLog b/ChangeLog
index 3ac2f87..9637df1 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,10 @@
+Sun Jun 10 03:00:21 2012  Nobuyoshi Nakada  <nobu@ruby-lang.org>
+
+	* eval.c (ruby_setjmp): need to save the stack after r2 (the Table
+	  of Contents on ppc64) is saved onto the stack by getcontext().
+	  based on <https://bugzilla.redhat.com/show_bug.cgi?id=628715>.
+	  Bug#4411
+
 Thu Jun  7 19:00:35 2012  Kenta Murata <mrkn@mrkn.jp>
 
 	* ext/bigdecimal/bigdecimal.c (VpMemAlloc): Fixes a bug reported
diff --git a/eval.c b/eval.c
index c350159..4458dff 100644
--- a/eval.c
+++ b/eval.c
@@ -179,6 +179,9 @@
        (function_call_may_return_twice_false_2 ? \
         setjmp(function_call_may_return_twice_jmp_buf) : \
         0)
+#  elif defined(__PPC64__)
+#    define JUST_BEFORE_SETJMP(extra_save, j) ((void)0)
+#    define JUST_AFTER_SETJMP(extra_save, j) ((j)->status ? (void)0 : (extra_save))
 #  elif defined(__FreeBSD__) && __FreeBSD__ < 7
 /*
  * workaround for FreeBSD/i386 getcontext/setcontext bug.
@@ -196,16 +199,23 @@
 #  ifndef POST_GETCONTEXT
 #    define POST_GETCONTEXT 0
 #  endif
+#  ifndef JUST_BEFORE_SETJMP
+#    define JUST_BEFORE_SETJMP(extra_save, j) (extra_save)
+#  endif
+#  ifndef JUST_AFTER_SETJMP
+#    define JUST_AFTER_SETJMP(extra_save, j) ((void)0)
+#  endif
 #  define ruby_longjmp(env, val) rb_jump_context(env, val)
-#  define ruby_setjmp(just_before_setjmp, j) ((j)->status = 0, \
-     (just_before_setjmp), \
+#  define ruby_setjmp(extra_save, j) ((j)->status = 0, \
+     JUST_BEFORE_SETJMP(extra_save, j), \
      PRE_GETCONTEXT, \
      getcontext(&(j)->context), \
      POST_GETCONTEXT, \
+     JUST_AFTER_SETJMP(extra_save, j), \
      (j)->status)
 #else
-#  define ruby_setjmp(just_before_setjmp, env) \
-     ((just_before_setjmp), RUBY_SETJMP(env))
+#  define ruby_setjmp(extra_save, env) \
+     ((extra_save), RUBY_SETJMP(env))
 #  define ruby_longjmp(env,val) RUBY_LONGJMP(env,val)
 #  ifdef __CYGWIN__
 int _setjmp(), _longjmp();
diff --git a/version.h b/version.h
index 7a53a5c..6341599 100644
--- a/version.h
+++ b/version.h
@@ -1,15 +1,15 @@
 #define RUBY_VERSION "1.8.7"
-#define RUBY_RELEASE_DATE "2012-06-07"
+#define RUBY_RELEASE_DATE "2012-06-10"
 #define RUBY_VERSION_CODE 187
-#define RUBY_RELEASE_CODE 20120607
-#define RUBY_PATCHLEVEL 367
+#define RUBY_RELEASE_CODE 20120610
+#define RUBY_PATCHLEVEL 368
 
 #define RUBY_VERSION_MAJOR 1
 #define RUBY_VERSION_MINOR 8
 #define RUBY_VERSION_TEENY 7
 #define RUBY_RELEASE_YEAR 2012
 #define RUBY_RELEASE_MONTH 6
-#define RUBY_RELEASE_DAY 7
+#define RUBY_RELEASE_DAY 10
 
 #ifdef RUBY_EXTERN
 RUBY_EXTERN const char ruby_version[];
-- 
1.8.5.1


From d761c9b178d8a2b7757ca5ea41135c7ea37c70b2 Mon Sep 17 00:00:00 2001
From: shyouhei <shyouhei@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>
Date: Mon, 18 Jun 2012 09:53:29 +0000
Subject: [PATCH 13/19] merge revision(s) 32605:32610: 	* backport r32609 from
 trunk. 	* ext/openssl/ossl_hmac.c: Revert checking return type of 
   HMAC_Init_ex as it is not compatible with OpenSSL < 1.0.0. 	* backport
 r32606 from trunk. 	* ext/openssl/ossl_digest.c: Check return value of
 EVP_DigestInit_ex. 	* ext/openssl/ossl_hmac.c: Check return value of
 HMAC_Init_ex. 	  Thanks, Jared Jennings, for the patch. 	  [ Ruby 1.9 -
 Bug #4944 ] [ruby-core:37670]

git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/branches/ruby_1_8_7@36126 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
---
 ChangeLog                 | 16 ++++++++++++++++
 ext/openssl/ossl_digest.c | 12 +++++++++---
 version.h                 |  8 ++++----
 3 files changed, 29 insertions(+), 7 deletions(-)

diff --git a/ChangeLog b/ChangeLog
index 9637df1..e7445fa 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,19 @@
+Mon Jun 18 18:32:43 2012  Martin Bosslet  <Martin.Bosslet@googlemail.com>
+
+	* backport r32609 from trunk.
+
+	* ext/openssl/ossl_hmac.c: Revert checking return type of
+	  HMAC_Init_ex as it is not compatible with OpenSSL < 1.0.0.
+
+Mon Jun 18 18:32:43 2012  Martin Bosslet  <Martin.Bosslet@googlemail.com>
+
+	* backport r32606 from trunk.
+
+	* ext/openssl/ossl_digest.c: Check return value of EVP_DigestInit_ex.
+	* ext/openssl/ossl_hmac.c: Check return value of HMAC_Init_ex.
+	  Thanks, Jared Jennings, for the patch.
+	  [ Ruby 1.9 - Bug #4944 ] [ruby-core:37670]
+
 Sun Jun 10 03:00:21 2012  Nobuyoshi Nakada  <nobu@ruby-lang.org>
 
 	* eval.c (ruby_setjmp): need to save the stack after r2 (the Table
diff --git a/ext/openssl/ossl_digest.c b/ext/openssl/ossl_digest.c
index 879d399..13111ce 100644
--- a/ext/openssl/ossl_digest.c
+++ b/ext/openssl/ossl_digest.c
@@ -62,7 +62,9 @@
 
     ret = ossl_digest_alloc(cDigest);
     GetDigest(ret, ctx);
-    EVP_DigestInit_ex(ctx, md, NULL);
+    if (EVP_DigestInit_ex(ctx, md, NULL) != 1) {
+	ossl_raise(eDigestError, "Digest initialization failed.");
+    }
    
     return ret;
 }
@@ -104,7 +106,9 @@
     if (!NIL_P(data)) StringValue(data);
 
     GetDigest(self, ctx);
-    EVP_DigestInit_ex(ctx, md, NULL);
+    if (EVP_DigestInit_ex(ctx, md, NULL) != 1) {
+	ossl_raise(eDigestError, "Digest initialization failed.");
+    }
     
     if (!NIL_P(data)) return ossl_digest_update(self, data);
     return self;
@@ -138,7 +142,9 @@
     EVP_MD_CTX *ctx;
 
     GetDigest(self, ctx);
-    EVP_DigestInit_ex(ctx, EVP_MD_CTX_md(ctx), NULL);
+    if (EVP_DigestInit_ex(ctx, EVP_MD_CTX_md(ctx), NULL) != 1) {
+	ossl_raise(eDigestError, "Digest initialization failed.");
+    }
 
     return self;
 }
diff --git a/version.h b/version.h
index 6341599..7b2f01a 100644
--- a/version.h
+++ b/version.h
@@ -1,15 +1,15 @@
 #define RUBY_VERSION "1.8.7"
-#define RUBY_RELEASE_DATE "2012-06-10"
+#define RUBY_RELEASE_DATE "2012-06-18"
 #define RUBY_VERSION_CODE 187
-#define RUBY_RELEASE_CODE 20120610
-#define RUBY_PATCHLEVEL 368
+#define RUBY_RELEASE_CODE 20120618
+#define RUBY_PATCHLEVEL 369
 
 #define RUBY_VERSION_MAJOR 1
 #define RUBY_VERSION_MINOR 8
 #define RUBY_VERSION_TEENY 7
 #define RUBY_RELEASE_YEAR 2012
 #define RUBY_RELEASE_MONTH 6
-#define RUBY_RELEASE_DAY 10
+#define RUBY_RELEASE_DAY 18
 
 #ifdef RUBY_EXTERN
 RUBY_EXTERN const char ruby_version[];
-- 
1.8.5.1


From e48d99f0e574a36f0e9c7337b396a437cbff4cc5 Mon Sep 17 00:00:00 2001
From: shyouhei <shyouhei@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>
Date: Fri, 29 Jun 2012 12:31:25 +0000
Subject: [PATCH 14/19] merge revision(s) 36251: 	* eval.c
 (stack_extend): prevent ALLOCA_N, which reserves a memory 	  space with
 for restoring machine stack stored in each threads, from 	  optimization
 out.  backport r34278 from the trunk.

git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/branches/ruby_1_8_7@36253 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
---
 ChangeLog | 6 ++++++
 eval.c    | 2 ++
 version.h | 8 ++++----
 3 files changed, 12 insertions(+), 4 deletions(-)

diff --git a/ChangeLog b/ChangeLog
index e7445fa..2d4bcb0 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,9 @@
+Fri Jun 29 21:26:05 2012  Nobuyoshi Nakada  <nobu@ruby-lang.org>
+
+	* eval.c (stack_extend): prevent ALLOCA_N, which reserves a memory
+	  space with for restoring machine stack stored in each threads, from
+	  optimization out.  backport r34278 from the trunk.
+
 Mon Jun 18 18:32:43 2012  Martin Bosslet  <Martin.Bosslet@googlemail.com>
 
 	* backport r32609 from trunk.
diff --git a/version.h b/version.h
index 7b2f01a..d90d5b1 100644
--- a/version.h
+++ b/version.h
@@ -1,15 +1,15 @@
 #define RUBY_VERSION "1.8.7"
-#define RUBY_RELEASE_DATE "2012-06-18"
+#define RUBY_RELEASE_DATE "2012-06-29"
 #define RUBY_VERSION_CODE 187
-#define RUBY_RELEASE_CODE 20120618
-#define RUBY_PATCHLEVEL 369
+#define RUBY_RELEASE_CODE 20120629
+#define RUBY_PATCHLEVEL 370
 
 #define RUBY_VERSION_MAJOR 1
 #define RUBY_VERSION_MINOR 8
 #define RUBY_VERSION_TEENY 7
 #define RUBY_RELEASE_YEAR 2012
 #define RUBY_RELEASE_MONTH 6
-#define RUBY_RELEASE_DAY 18
+#define RUBY_RELEASE_DAY 29
 
 #ifdef RUBY_EXTERN
 RUBY_EXTERN const char ruby_version[];
-- 
1.8.5.1


From 2ac236dcbd90bd33bfeac4f699763c3baef4038e Mon Sep 17 00:00:00 2001
From: shyouhei <shyouhei@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>
Date: Fri, 12 Oct 2012 04:05:35 +0000
Subject: [PATCH 15/19] * error.c (name_err_to_s): we need not infect msg.

* test/ruby/test_exception.rb (TestException#test_exception_to_s_should_not_propagate_untrustedness): test for it.


git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/branches/ruby_1_8_7@37148 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
---
 ChangeLog                   |  6 ++++++
 error.c                     |  3 ---
 test/ruby/test_exception.rb | 30 +++++++++++++++++++++++++++++-
 version.h                   | 10 +++++-----
 4 files changed, 40 insertions(+), 9 deletions(-)

diff --git a/ChangeLog b/ChangeLog
index 2d4bcb0..e2e1059 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,9 @@
+Fri Oct 12 12:25:15 2012  URABE Shyouhei  <shyouhei@ruby-lang.org>
+
+	* error.c (name_err_to_s): we need not infect msg.
+
+	* test/ruby/test_exception.rb (TestException#test_exception_to_s_should_not_propagate_untrustedness): test for it.
+
 Fri Jun 29 21:26:05 2012  Nobuyoshi Nakada  <nobu@ruby-lang.org>
 
 	* eval.c (stack_extend): prevent ALLOCA_N, which reserves a memory
diff --git a/error.c b/error.c
index 59b445e..2b3bf3f 100644
--- a/error.c
+++ b/error.c
@@ -665,9 +665,6 @@
 
     if (NIL_P(mesg)) return rb_class_name(CLASS_OF(exc));
     StringValue(str);
-    if (str != mesg) {
-	OBJ_INFECT(str, mesg);
-    }
     return str;
 }
 
diff --git a/test/ruby/test_exception.rb b/test/ruby/test_exception.rb
index c5f4091..434838f 100644
--- a/test/ruby/test_exception.rb
+++ b/test/ruby/test_exception.rb
@@ -204,6 +204,34 @@ def o.to_str
     o.taint
     e = NameError.new(o)
     s = e.to_s
-    assert_equal(true, s.tainted?)
+    assert_equal(false, s.tainted?)
+  end
+
+  def test_exception_to_s_should_not_propagate_untrustedness
+    favorite_lang = "Ruby"
+
+    for exc in [Exception, NameError]
+      assert_raise(SecurityError) do
+        lambda {
+          $SAFE = 4
+          exc.new(favorite_lang).to_s
+          favorite_lang.replace("Python")
+        }.call
+      end
+    end
+
+    assert_raise(SecurityError) do
+      lambda {
+        $SAFE = 4
+        o = Object.new
+        (class << o; self; end).send(:define_method, :to_str) {
+          favorite_lang
+        }
+        NameError.new(o).to_s
+        favorite_lang.replace("Python")
+      }.call
+    end
+
+    assert_equal("Ruby", favorite_lang)
   end
 end
diff --git a/version.h b/version.h
index d90d5b1..e509ed2 100644
--- a/version.h
+++ b/version.h
@@ -1,15 +1,15 @@
 #define RUBY_VERSION "1.8.7"
-#define RUBY_RELEASE_DATE "2012-06-29"
+#define RUBY_RELEASE_DATE "2012-10-12"
 #define RUBY_VERSION_CODE 187
-#define RUBY_RELEASE_CODE 20120629
-#define RUBY_PATCHLEVEL 370
+#define RUBY_RELEASE_CODE 20121012
+#define RUBY_PATCHLEVEL 371
 
 #define RUBY_VERSION_MAJOR 1
 #define RUBY_VERSION_MINOR 8
 #define RUBY_VERSION_TEENY 7
 #define RUBY_RELEASE_YEAR 2012
-#define RUBY_RELEASE_MONTH 6
-#define RUBY_RELEASE_DAY 29
+#define RUBY_RELEASE_MONTH 10
+#define RUBY_RELEASE_DAY 12
 
 #ifdef RUBY_EXTERN
 RUBY_EXTERN const char ruby_version[];
-- 
1.8.5.1


From eca9bf617ab517b73598f449388b543d19c72b7d Mon Sep 17 00:00:00 2001
From: shyouhei <shyouhei@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>
Date: Sat, 18 May 2013 14:55:14 +0000
Subject: [PATCH 16/19] merge revision(s) 39384,39509,39511: [Backport #7961]

	* lib/rexml/document.rb (REXML::Document.entity_expansion_text_limit):
	  new attribute to read/write entity expansion text limit.  the default
	  limit is 10Kb.

	* lib/rexml/text.rb (REXML::Text.unnormalize): check above attribute.

	* lib/rexml/document.rb: move entity_expansion_limit accessor to ...

	* lib/rexml/rexml.rb: ... here to make rexml/text independent from
	  REXML::Document. It causes circular require.

	* lib/rexml/document.rb (REXML::Document.entity_expansion_limit):
	  deprecated.

	* lib/rexml/document.rb (REXML::Document.entity_expansion_limit=):
	  deprecated.

	* lib/rexml/text.rb: add missing require "rexml/rexml" for
	  REXML.entity_expansion_limit.
	  Reported by Robert Ulejczyk. Thanks!!! [ruby-core:52895] [Bug #7961]

	* lib/rexml/document.rb: move entity_expansion_text_limit accessor to ...

	* lib/rexml/document.rb (REXML::Document.entity_expansion_text_limit):

	* lib/rexml/document.rb (REXML::Document.entity_expansion_text_limit=):
	  REXML.entity_expansion_text_limit.


git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/branches/ruby_1_8_7@40812 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
---
 ChangeLog             | 21 ++++++++++++++++++++
 lib/rexml/document.rb | 14 ++++++++++++++
 lib/rexml/rexml.rb    | 12 ++++++++++++
 lib/rexml/text.rb     | 53 +++++++++++++++++++++++++--------------------------
 version.h             | 12 ++++++------
 5 files changed, 79 insertions(+), 33 deletions(-)

diff --git a/ChangeLog b/ChangeLog
index e2e1059..c80774f 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,24 @@
+Sat May 18 23:34:50 2013  Kouhei Sutou  <kou@cozmixng.org>
+
+	* lib/rexml/document.rb: move entity_expansion_text_limit accessor to ...
+	* lib/rexml/rexml.rb: ... here to make rexml/text independent from
+	  REXML::Document. It causes circular require.
+	* lib/rexml/document.rb (REXML::Document.entity_expansion_text_limit):
+	  deprecated.
+	* lib/rexml/document.rb (REXML::Document.entity_expansion_text_limit=):
+	  deprecated.
+	* lib/rexml/text.rb: add missing require "rexml/rexml" for
+	  REXML.entity_expansion_text_limit.
+	  Reported by Robert Ulejczyk. Thanks!!! [ruby-core:52895] [Bug #7961]
+
+Sat May 18 23:34:50 2013  Aaron Patterson <aaron@tenderlovemaking.com>
+
+	* lib/rexml/document.rb (REXML::Document.entity_expansion_text_limit):
+	  new attribute to read/write entity expansion text limit.  the default
+	  limit is 10Kb.
+
+	* lib/rexml/text.rb (REXML::Text.unnormalize): check above attribute.
+
 Fri Oct 12 12:25:15 2012  URABE Shyouhei  <shyouhei@ruby-lang.org>
 
 	* error.c (name_err_to_s): we need not infect msg.
diff --git a/lib/rexml/document.rb b/lib/rexml/document.rb
index 3d1300a..16a2c77 100644
--- a/lib/rexml/document.rb
+++ b/lib/rexml/document.rb
@@ -213,6 +213,20 @@ def Document::entity_expansion_limit
       return @@entity_expansion_limit
     end
 
+    # Set the entity expansion limit. By default the limit is set to 10240.
+    #
+    # Deprecated. Use REXML.entity_expansion_text_limit= instead.
+    def Document::entity_expansion_text_limit=( val )
+      REXML.entity_expansion_text_limit = val
+    end
+
+    # Get the entity expansion limit. By default the limit is set to 10000.
+    #
+    # Deprecated. Use REXML.entity_expansion_text_limit instead.
+    def Document::entity_expansion_text_limit
+      return REXML.entity_expansion_text_limit
+    end
+
     attr_reader :entity_expansion_count
     
     def record_entity_expansion
diff --git a/lib/rexml/rexml.rb b/lib/rexml/rexml.rb
index 95bc2a7..8845300 100644
--- a/lib/rexml/rexml.rb
+++ b/lib/rexml/rexml.rb
@@ -29,4 +29,16 @@ module REXML
 
   Copyright = COPYRIGHT
   Version = VERSION
+
+  @@entity_expansion_text_limit = 10_240
+
+  # Set the entity expansion limit. By default the limit is set to 10240.
+  def self.entity_expansion_text_limit=( val )
+    @@entity_expansion_text_limit = val
+  end
+
+  # Get the entity expansion limit. By default the limit is set to 10240.
+  def self.entity_expansion_text_limit
+    return @@entity_expansion_text_limit
+  end
 end
diff --git a/lib/rexml/text.rb b/lib/rexml/text.rb
index a4a30b6..b6dbf45 100644
--- a/lib/rexml/text.rb
+++ b/lib/rexml/text.rb
@@ -1,3 +1,4 @@
+require 'rexml/rexml'
 require 'rexml/entity'
 require 'rexml/doctype'
 require 'rexml/child'
@@ -308,37 +309,35 @@ def Text::normalize( input, doctype=nil, entity_filter=nil )
 
     # Unescapes all possible entities
     def Text::unnormalize( string, doctype=nil, filter=nil, illegal=nil )
-      rv = string.clone
-      rv.gsub!( /\r\n?/, "\n" )
-      matches = rv.scan( REFERENCE )
-      return rv if matches.size == 0
-      rv.gsub!( NUMERICENTITY ) {|m|
-        m=$1
-        m = "0#{m}" if m[0] == ?x
-        [Integer(m)].pack('U*')
+      sum = 0
+      string.gsub( /\r\n?/, "\n" ).gsub( REFERENCE ) {
+        s = Text.expand($&, doctype, filter)
+        if sum + s.bytesize > REXML.entity_expansion_text_limit
+          raise "entity expansion has grown too large"
+        else
+          sum += s.bytesize
+        end
+        s
       }
-      matches.collect!{|x|x[0]}.compact!
-      if matches.size > 0
-        if doctype
-          matches.each do |entity_reference|
-            unless filter and filter.include?(entity_reference)
-              entity_value = doctype.entity( entity_reference )
-              re = /&#{entity_reference};/
-              rv.gsub!( re, entity_value ) if entity_value
-            end
-          end
+    end
+
+    def Text.expand(ref, doctype, filter)
+      if ref[1] == ?#
+        if ref[2] == ?x
+          [ref[3...-1].to_i(16)].pack('U*')
         else
-          matches.each do |entity_reference|
-            unless filter and filter.include?(entity_reference)
-              entity_value = DocType::DEFAULT_ENTITIES[ entity_reference ]
-              re = /&#{entity_reference};/
-              rv.gsub!( re, entity_value.value ) if entity_value
-            end
-          end
+          [ref[2...-1].to_i].pack('U*')
         end
-        rv.gsub!( /&amp;/, '&' )
+      elsif ref == '&amp;'
+        '&'
+      elsif filter and filter.include?( ref[1...-1] )
+        ref
+      elsif doctype
+        doctype.entity( ref[1...-1] ) or ref
+      else
+        entity_value = DocType::DEFAULT_ENTITIES[ ref[1...-1] ]
+        entity_value ? entity_value.value : ref
       end
-      rv
     end
   end
 end
diff --git a/version.h b/version.h
index e509ed2..2158647 100644
--- a/version.h
+++ b/version.h
@@ -1,15 +1,15 @@
 #define RUBY_VERSION "1.8.7"
-#define RUBY_RELEASE_DATE "2012-10-12"
+#define RUBY_RELEASE_DATE "2013-05-18"
 #define RUBY_VERSION_CODE 187
-#define RUBY_RELEASE_CODE 20121012
-#define RUBY_PATCHLEVEL 371
+#define RUBY_RELEASE_CODE 20130518
+#define RUBY_PATCHLEVEL 372
 
 #define RUBY_VERSION_MAJOR 1
 #define RUBY_VERSION_MINOR 8
 #define RUBY_VERSION_TEENY 7
-#define RUBY_RELEASE_YEAR 2012
-#define RUBY_RELEASE_MONTH 10
-#define RUBY_RELEASE_DAY 12
+#define RUBY_RELEASE_YEAR 2013
+#define RUBY_RELEASE_MONTH 5
+#define RUBY_RELEASE_DAY 18
 
 #ifdef RUBY_EXTERN
 RUBY_EXTERN const char ruby_version[];
-- 
1.8.5.1


From 961bf7496ded3acfe847cf56fa90bbdcfd6e614f Mon Sep 17 00:00:00 2001
From: shyouhei <shyouhei@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>
Date: Thu, 27 Jun 2013 11:22:26 +0000
Subject: [PATCH 17/19] 	* ext/openssl/lib/openssl/ssl-internal.rb
 (OpenSSL::SSL#verify_certificate_identity): 	  fix hostname verification.
 Patch by nahi.

	* test/openssl/test_ssl.rb (OpenSSL#test_verify_certificate_identity):
	  test for above.


git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/branches/ruby_1_8_7@41676 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
---
 ChangeLog                               |  8 ++++++++
 ext/openssl/lib/openssl/ssl-internal.rb | 18 +++++++++++++-----
 test/openssl/test_ssl.rb                | 23 +++++++++++++++++++++++
 version.h                               | 10 +++++-----
 4 files changed, 49 insertions(+), 10 deletions(-)

diff --git a/ChangeLog b/ChangeLog
index c80774f..cbba5f0 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,11 @@
+Thu Jun 27 20:21:18 2013  URABE Shyouhei  <shyouhei@ruby-lang.org>
+
+	* ext/openssl/lib/openssl/ssl-internal.rb (OpenSSL::SSL#verify_certificate_identity):
+	  fix hostname verification. Patch by nahi.
+
+	* test/openssl/test_ssl.rb (OpenSSL#test_verify_certificate_identity):
+	  test for above.
+
 Sat May 18 23:34:50 2013  Kouhei Sutou  <kou@cozmixng.org>
 
 	* lib/rexml/document.rb: move entity_expansion_text_limit accessor to ...
diff --git a/ext/openssl/lib/openssl/ssl-internal.rb b/ext/openssl/lib/openssl/ssl-internal.rb
index abf0e8d..9ef6f92 100644
--- a/ext/openssl/lib/openssl/ssl-internal.rb
+++ b/ext/openssl/lib/openssl/ssl-internal.rb
@@ -90,14 +90,22 @@ def verify_certificate_identity(cert, hostname)
       should_verify_common_name = true
       cert.extensions.each{|ext|
         next if ext.oid != "subjectAltName"
-        ext.value.split(/,\s+/).each{|general_name|
-          if /\ADNS:(.*)/ =~ general_name
+        id, ostr = OpenSSL::ASN1.decode(ext.to_der).value
+        sequence = OpenSSL::ASN1.decode(ostr.value)
+        sequence.value.each{|san|
+          case san.tag
+          when 2 # dNSName in GeneralName (RFC5280)
             should_verify_common_name = false
-            reg = Regexp.escape($1).gsub(/\\\*/, "[^.]+")
+            reg = Regexp.escape(san.value).gsub(/\\\*/, "[^.]+")
             return true if /\A#{reg}\z/i =~ hostname
-          elsif /\AIP Address:(.*)/ =~ general_name
+          when 7 # iPAddress in GeneralName (RFC5280)
             should_verify_common_name = false
-            return true if $1 == hostname
+            # follows GENERAL_NAME_print() in x509v3/v3_alt.c
+            if san.value.size == 4
+              return true if san.value.unpack('C*').join('.') == hostname
+            elsif san.value.size == 16
+              return true if san.value.unpack('n*').map { |e| sprintf("%X", e) }.join(':') == hostname
+            end
           end
         }
       }
diff --git a/test/openssl/test_ssl.rb b/test/openssl/test_ssl.rb
index 177b684..098ccdd 100644
--- a/test/openssl/test_ssl.rb
+++ b/test/openssl/test_ssl.rb
@@ -547,6 +547,29 @@ def test_unset_OP_ALL
       ssl.close
     }
   end
+ 
+  def test_verify_certificate_identity
+    # creating NULL byte SAN certificate
+    ef = OpenSSL::X509::ExtensionFactory.new
+    cert = OpenSSL::X509::Certificate.new
+    cert.subject = OpenSSL::X509::Name.parse "/DC=some/DC=site/CN=Some Site"
+    ext = ef.create_ext('subjectAltName', 'DNS:placeholder,IP:192.168.7.1,IP:13::17')
+    ext_asn1 = OpenSSL::ASN1.decode(ext.to_der)
+    san_list_der = ext_asn1.value.reduce(nil) { |memo,val| val.tag == 4 ? val.value : memo }
+    san_list_asn1 = OpenSSL::ASN1.decode(san_list_der)
+    san_list_asn1.value[0].value = 'www.example.com\0.evil.com'
+    ext_asn1.value[1].value = san_list_asn1.to_der
+    real_ext = OpenSSL::X509::Extension.new ext_asn1
+    cert.add_extension(real_ext)
+
+    assert_equal(false, OpenSSL::SSL.verify_certificate_identity(cert, 'www.example.com'))
+    assert_equal(true,  OpenSSL::SSL.verify_certificate_identity(cert, 'www.example.com\0.evil.com'))
+    assert_equal(false, OpenSSL::SSL.verify_certificate_identity(cert, '192.168.7.255'))
+    assert_equal(true,  OpenSSL::SSL.verify_certificate_identity(cert, '192.168.7.1'))
+    assert_equal(false, OpenSSL::SSL.verify_certificate_identity(cert, '13::17'))
+    assert_equal(true,  OpenSSL::SSL.verify_certificate_identity(cert, '13:0:0:0:0:0:0:17'))
+  end
+L
 end
 
 end
diff --git a/version.h b/version.h
index 2158647..97111c5 100644
--- a/version.h
+++ b/version.h
@@ -1,15 +1,15 @@
 #define RUBY_VERSION "1.8.7"
-#define RUBY_RELEASE_DATE "2013-05-18"
+#define RUBY_RELEASE_DATE "2013-06-27"
 #define RUBY_VERSION_CODE 187
-#define RUBY_RELEASE_CODE 20130518
-#define RUBY_PATCHLEVEL 372
+#define RUBY_RELEASE_CODE 20130627
+#define RUBY_PATCHLEVEL 373
 
 #define RUBY_VERSION_MAJOR 1
 #define RUBY_VERSION_MINOR 8
 #define RUBY_VERSION_TEENY 7
 #define RUBY_RELEASE_YEAR 2013
-#define RUBY_RELEASE_MONTH 5
-#define RUBY_RELEASE_DAY 18
+#define RUBY_RELEASE_MONTH 6
+#define RUBY_RELEASE_DAY 27
 
 #ifdef RUBY_EXTERN
 RUBY_EXTERN const char ruby_version[];
-- 
1.8.5.1


From 469d4b9389cc2f877f2f17ba248146831d69c66b Mon Sep 17 00:00:00 2001
From: shyouhei <shyouhei@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>
Date: Thu, 27 Jun 2013 11:56:26 +0000
Subject: [PATCH 18/19] Oops, sorry!

git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/branches/ruby_1_8_7@41678 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
---
 ChangeLog                | 4 ++++
 test/openssl/test_ssl.rb | 1 -
 version.h                | 2 +-
 3 files changed, 5 insertions(+), 2 deletions(-)

diff --git a/ChangeLog b/ChangeLog
index cbba5f0..dbba29d 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,7 @@
+Thu Jun 27 20:55:23 2013  URABE Shyouhei  <shyouhei@ruby-lang.org>
+
+	* test/openssl/test_ssl.rb: Oops, sorry!
+
 Thu Jun 27 20:21:18 2013  URABE Shyouhei  <shyouhei@ruby-lang.org>
 
 	* ext/openssl/lib/openssl/ssl-internal.rb (OpenSSL::SSL#verify_certificate_identity):
diff --git a/test/openssl/test_ssl.rb b/test/openssl/test_ssl.rb
index 098ccdd..2e014f1 100644
--- a/test/openssl/test_ssl.rb
+++ b/test/openssl/test_ssl.rb
@@ -569,7 +569,6 @@ def test_verify_certificate_identity
     assert_equal(false, OpenSSL::SSL.verify_certificate_identity(cert, '13::17'))
     assert_equal(true,  OpenSSL::SSL.verify_certificate_identity(cert, '13:0:0:0:0:0:0:17'))
   end
-L
 end
 
 end
diff --git a/version.h b/version.h
index 97111c5..6b6d57e 100644
--- a/version.h
+++ b/version.h
@@ -2,7 +2,7 @@
 #define RUBY_RELEASE_DATE "2013-06-27"
 #define RUBY_VERSION_CODE 187
 #define RUBY_RELEASE_CODE 20130627
-#define RUBY_PATCHLEVEL 373
+#define RUBY_PATCHLEVEL 374
 
 #define RUBY_VERSION_MAJOR 1
 #define RUBY_VERSION_MINOR 8
-- 
1.8.5.1

src/rvm/patches/ree/1.8.7/tcmalloc.patch000066400000002061147511530530013640 0ustar00diff --git a/distro/google-perftools-1.7/src/tcmalloc.cc b/distro/google-perftools-1.7/src/tcmalloc.cc
index 8d94d20..0769425 100644
--- a/distro/google-perftools-1.7/src/tcmalloc.cc
+++ b/distro/google-perftools-1.7/src/tcmalloc.cc
@@ -137,6 +137,13 @@
 # define WIN32_DO_PATCHING 1
 #endif
 
+// GLibc 2.14+ requires the hook functions be declared volatile, based on the value of the
+// define __MALLOC_HOOK_VOLATILE. For compatibility with older/non-GLibc implementations,
+// provide an empty definition.
+#if !defined(__MALLOC_HOOK_VOLATILE)
+#define __MALLOC_HOOK_VOLATILE
+#endif
+
 using STL_NAMESPACE::max;
 using STL_NAMESPACE::numeric_limits;
 using STL_NAMESPACE::vector;
@@ -1669,5 +1676,5 @@ static void *MemalignOverride(size_t align, size_t size, const void *caller)
   MallocHook::InvokeNewHook(result, size);
   return result;
 }
-void *(*__memalign_hook)(size_t, size_t, const void *) = MemalignOverride;
+void *(*__MALLOC_HOOK_VOLATILE __memalign_hook)(size_t, size_t, const void *) = MemalignOverride;
 #endif  // #ifndef TCMALLOC_FOR_DEBUGALLOCATION
src/rvm/patches/ree/1.8.7/2010.02/tcmalloc.patch000066400000002061147511530530014442 0ustar00diff --git a/distro/google-perftools-1.4/src/tcmalloc.cc b/distro/google-perftools-1.4/src/tcmalloc.cc
index 8d94d20..0769425 100644
--- a/distro/google-perftools-1.4/src/tcmalloc.cc
+++ b/distro/google-perftools-1.4/src/tcmalloc.cc
@@ -137,6 +137,13 @@
 # define WIN32_DO_PATCHING 1
 #endif
 
+// GLibc 2.14+ requires the hook functions be declared volatile, based on the value of the
+// define __MALLOC_HOOK_VOLATILE. For compatibility with older/non-GLibc implementations,
+// provide an empty definition.
+#if !defined(__MALLOC_HOOK_VOLATILE)
+#define __MALLOC_HOOK_VOLATILE
+#endif
+
 using STL_NAMESPACE::max;
 using STL_NAMESPACE::numeric_limits;
 using STL_NAMESPACE::vector;
@@ -1669,5 +1676,5 @@ static void *MemalignOverride(size_t align, size_t size, const void *caller)
   MallocHook::InvokeNewHook(result, size);
   return result;
 }
-void *(*__memalign_hook)(size_t, size_t, const void *) = MemalignOverride;
+void *(*__MALLOC_HOOK_VOLATILE __memalign_hook)(size_t, size_t, const void *) = MemalignOverride;
 #endif  // #ifndef TCMALLOC_FOR_DEBUGALLOCATION
src/rvm/patches/ree/1.8.7/stdout-rouge-fix.patch000066400000001317147511530530015272 0ustar00diff --git a/lib/mkmf.rb b/lib/mkmf.rb
index c9e738a..7a8004d 100644
--- a/lib/mkmf.rb
+++ b/lib/mkmf.rb
@@ -201,20 +201,26 @@ end
 module Logging
   @log = nil
   @logfile = 'mkmf.log'
-  @orgerr = $stderr.dup
-  @orgout = $stdout.dup
   @postpone = 0
   @quiet = $extmk
 
   def self::open
     @log ||= File::open(@logfile, 'w')
     @log.sync = true
+    orgerr = $stderr.dup
+    orgout = $stdout.dup
     $stderr.reopen(@log)
     $stdout.reopen(@log)
     yield
   ensure
-    $stderr.reopen(@orgerr)
-    $stdout.reopen(@orgout)
+    if orgerr
+      $stderr.reopen(orgerr)
+      orgerr.close
+    end
+    if orgout
+      $stdout.reopen(orgout)
+      orgout.close
+    end
   end
 
   def self::message(*s)
src/rvm/patches/ree/1.8.7/no_sslv2.diff000066400000001252147511530530013421 0ustar00Index: ossl_ssl.c
===================================================================
--- a/ext/openssl/ossl_ssl.c	(revision 32381)
+++ b/ext/openssl/ossl_ssl.c	(revision 32382)
@@ -107,9 +107,12 @@
     OSSL_SSL_METHOD_ENTRY(TLSv1),
     OSSL_SSL_METHOD_ENTRY(TLSv1_server),
     OSSL_SSL_METHOD_ENTRY(TLSv1_client),
+#if defined(HAVE_SSLV2_METHOD) && defined(HAVE_SSLV2_SERVER_METHOD) && \
+        defined(HAVE_SSLV2_CLIENT_METHOD)	
     OSSL_SSL_METHOD_ENTRY(SSLv2),
     OSSL_SSL_METHOD_ENTRY(SSLv2_server),
     OSSL_SSL_METHOD_ENTRY(SSLv2_client),
+#endif
     OSSL_SSL_METHOD_ENTRY(SSLv3),
     OSSL_SSL_METHOD_ENTRY(SSLv3_server),
     OSSL_SSL_METHOD_ENTRY(SSLv3_client),
src/rvm/patches/ree/fix-irb-completion.diff000066400000000673147511530530014716 0ustar00diff --git a/lib/irb/completion.rb b/lib/irb/completion.rb
index 000658e..609dca3 100644
--- a/lib/irb/completion.rb
+++ b/lib/irb/completion.rb
@@ -157,7 +157,7 @@ module IRB
 	    end
 	    next if name != "IRB::Context" and 
 	      /^(IRB|SLex|RubyLex|RubyToken)/ =~ name
-	    candidates.concat m.instance_methods(false)
+	    candidates.concat m.instance_methods(false).map { |m| m.to_s }
 	  }
 	  candidates.sort!
 	  candidates.uniq!
src/rvm/patches/ree/ssl_no_ec2m.patch000066400000001476147511530530013603 0ustar00--- trunk/ext/openssl/ossl_pkey_ec.c  2013/07/05 22:16:09 41807
+++ trunk/ext/openssl/ossl_pkey_ec.c  2013/07/05 22:46:42 41808
@@ -762,8 +762,10 @@
                 method = EC_GFp_mont_method();
             } else if (id == s_GFp_nist) {
                 method = EC_GFp_nist_method();
+#if !defined(OPENSSL_NO_EC2M)
             } else if (id == s_GF2m_simple) {
                 method = EC_GF2m_simple_method();
+#endif
             }

             if (method) {
@@ -817,8 +819,10 @@

             if (id == s_GFp) {
                 new_curve = EC_GROUP_new_curve_GFp;
+#if !defined(OPENSSL_NO_EC2M)
             } else if (id == s_GF2m) {
                 new_curve = EC_GROUP_new_curve_GF2m;
+#endif
             } else {
                 ossl_raise(rb_eArgError, "unknown symbol, must be :GFp or :GF2m");
             }
src/rvm/patches/readline-5.2/shobj-conf.patch000066400000000737147511530530014741 0ustar00--- support/shobj-conf.orig	2010-10-01 22:46:26.000000000 +0900
+++ support/shobj-conf	2010-10-01 22:46:50.000000000 +0900
@@ -171,7 +171,7 @@
 	SHLIB_LIBSUFF='dylib'
 
 	case "${host_os}" in
-	darwin[78]*)	SHOBJ_LDFLAGS=''
+	darwin[789]*|darwin10*)	SHOBJ_LDFLAGS=''
 			SHLIB_XLDFLAGS='-dynamiclib -arch_only `/usr/bin/arch` -install_name $(libdir)/$@ -current_version $(SHLIB_MAJOR)$(SHLIB_MINOR) -compatibility_version $(SHLIB_MAJOR) -v'
 			;;
 	*)		SHOBJ_LDFLAGS='-dynamic'
src/rvm/patches/libxslt-1.1.26/solaris.patch000066400000000303147511530530014471 0ustar00--- libxslt/Makefile.in
+++ libxslt/Makefile.in_nosyms
@@ -339,2 +339,5 @@ man_MANS = libxslt.3
 EXTRA_DIST = $(man_MANS) trio.h triodef.h libxslt.syms
+
+LIBXSLT_VERSION_SCRIPT =
+
 all: all-am
src/rvm/patches/readline-6.2/patch-shobj-conf.diff000066400000003471147511530530015646 0ustar00--- support/shobj-conf.orig	2009-10-29 00:20:21.000000000 +1100
+++ support/shobj-conf	2011-03-24 13:43:03.000000000 +1100
@@ -157,19 +157,19 @@
 	;;
 
 # Darwin/MacOS X
-darwin[89]*|darwin10*)
+darwin[89]*|darwin1[0-9]*)
 	SHOBJ_STATUS=supported
 	SHLIB_STATUS=supported
 	
 	SHOBJ_CFLAGS='-fno-common'
 
-	SHOBJ_LD='MACOSX_DEPLOYMENT_TARGET=10.3 ${CC}'
+	SHOBJ_LD='${CC}'
 
 	SHLIB_LIBVERSION='$(SHLIB_MAJOR)$(SHLIB_MINOR).$(SHLIB_LIBSUFF)'
 	SHLIB_LIBSUFF='dylib'
 
-	SHOBJ_LDFLAGS='-dynamiclib -dynamic -undefined dynamic_lookup -arch_only `/usr/bin/arch`'
-	SHLIB_XLDFLAGS='-dynamiclib -arch_only `/usr/bin/arch` -install_name $(libdir)/$@ -current_version $(SHLIB_MAJOR)$(SHLIB_MINOR) -compatibility_version $(SHLIB_MAJOR) -v'
+	SHOBJ_LDFLAGS='-dynamiclib -dynamic -undefined dynamic_lookup'
+	SHLIB_XLDFLAGS='-dynamiclib -install_name $(libdir)/$@ -current_version $(SHLIB_MAJOR)$(SHLIB_MINOR) -compatibility_version $(SHLIB_MAJOR) -v'
 
 	SHLIB_LIBS='-lncurses'	# see if -lcurses works on MacOS X 10.1 
 	;;
@@ -186,11 +186,11 @@
 	SHLIB_LIBSUFF='dylib'
 
 	case "${host_os}" in
-	darwin[789]*|darwin10*)	SHOBJ_LDFLAGS=''
-			SHLIB_XLDFLAGS='-dynamiclib -arch_only `/usr/bin/arch` -install_name $(libdir)/$@ -current_version $(SHLIB_MAJOR)$(SHLIB_MINOR) -compatibility_version $(SHLIB_MAJOR) -v'
+	darwin[789]*|darwin1[0-9]*)	SHOBJ_LDFLAGS=''
+			SHLIB_XLDFLAGS='-dynamiclib -install_name $(libdir)/$@ -current_version $(SHLIB_MAJOR)$(SHLIB_MINOR) -compatibility_version $(SHLIB_MAJOR) -v'
 			;;
 	*)		SHOBJ_LDFLAGS='-dynamic'
-			SHLIB_XLDFLAGS='-arch_only `/usr/bin/arch` -install_name $(libdir)/$@ -current_version $(SHLIB_MAJOR)$(SHLIB_MINOR) -compatibility_version $(SHLIB_MAJOR) -v'
+			SHLIB_XLDFLAGS='-install_name $(libdir)/$@ -current_version $(SHLIB_MAJOR)$(SHLIB_MINOR) -compatibility_version $(SHLIB_MAJOR) -v'
 			;;
 	esac
 
src/rvm/.gems000066400000000014147511530530007074 0ustar00travis-lint
src/rvm/sign-releases.sh000066400000003251147511530530011243 0ustar00#!/usr/bin/env bash

calculate_last()
{
  git checkout stable
  last_release="$( git tag --list --sort=v:refname | tail -n 1 )"
}

go_to_temp()
{
  mkdir -p ~/tmp/${last_release}/$1/unpacked
  cd  ~/tmp/${last_release}/$1
  echo -e "\n------------\nWorking dir: $PWD"
}

download_from_github()
{
  [[ -e ${last_release}.tar.gz ]] ||
  curl -OL https://github.com/rvm/rvm/archive/${last_release}.tar.gz
}

download_from_bitbucket()
{
  [[ -e ${last_release}.tar.gz ]] ||
  curl -OL https://bitbucket.org/mpapis/rvm/get/${last_release}.tar.gz
}

unpack_package()
{
  tar -xzf ${last_release}.tar.gz --strip-components=1 -C unpacked
}

compare_package_with_stable()
{
  diff -ur -x .git -x rvm-test -x .idea "$rvm_project_path" $PWD/unpacked ||
  {
    typeset __result=$?
    echo "found differences (result:$__result), skipping signature generation"
    return $__result
  }
}

sign_release()
{
  gpg2 --armor --detach-sig ${last_release}.tar.gz
}

remove_extra_files()
{
  rm -rf ${last_release}.tar.gz unpacked
}

upload_github()
{
  echo "Upload ${last_release}.tar.gz.asc to: https://github.com/rvm/rvm/releases/new?tag=${last_release}"
}

upload_bitbucket()
{
  echo "Upload ${last_release}.tar.gz.asc to: https://bitbucket.org/mpapis/rvm/downloads"
}

back_to_rvm_master()
{
  echo -e "\n------------"
  cd "$rvm_project_path"
  git checkout master
}

main()
{
  typeset last_release rvm_project_path

  rvm_project_path="$PWD"
  calculate_last
  for current in github bitbucket
  do
    go_to_temp ${current}
    download_from_${current}
    unpack_package
    compare_package_with_stable || continue
    sign_release
    remove_extra_files
    upload_${current}
  done
  back_to_rvm_master
}

main
src/rvm/rvm-test-rvm1/version_compare_comment_test.sh000066400000002214147511530530017120 0ustar00source "$rvm_path/scripts/rvm"

: numbers
__rvm_version_compare 1  ==  1  # status=0
__rvm_version_compare 2  \>  1  # status=0
__rvm_version_compare 10 \>  1  # status=0
__rvm_version_compare 2  \>= 1  # status=0
__rvm_version_compare 10 \>= 1  # status=0
__rvm_version_compare 2  \>= 2  # status=0
__rvm_version_compare 1  \<  2  # status=0
__rvm_version_compare 1  \<  10 # status=0
__rvm_version_compare 1  \<= 2  # status=0
__rvm_version_compare 2  \<= 2  # status=0
__rvm_version_compare 2  \<= 20 # status=0
__rvm_version_compare 1  !=  1  # status=1
__rvm_version_compare 1  \<  1  # status=1
__rvm_version_compare 2  \<  1  # status=1
__rvm_version_compare 20 \<  2  # status=1
__rvm_version_compare 2  \<= 1  # status=1
__rvm_version_compare 20 \<= 2  # status=1
__rvm_version_compare 1  \>  1  # status=1
__rvm_version_compare 1  \>  2  # status=1
__rvm_version_compare 1  \>  10 # status=1
__rvm_version_compare 1  \>= 2  # status=1
__rvm_version_compare 2  \>= 20 # status=1
__rvm_version_compare head \>  1 # status=0
__rvm_version_compare head \>= 1 # status=0
__rvm_version_compare head \<  1 # status=1
__rvm_version_compare head \<= 1 # status=1
src/rvm/rvm-test-rvm1/array_comment_test.sh000066400000000647147511530530015053 0ustar00source "$rvm_path/scripts/rvm"

: __rvm_remove_from_array
arr=( working on a problem or problem/test and not other/problem )
__rvm_remove_from_array arr "*problem*" "${arr[@]}" # env[arr][]=6; env[arr][]!=/problem/
arr=( working on a problem or problem/test and not other/problem )
__rvm_remove_from_array arr "problem*" "${arr[@]}" # env[arr][]=7

: add/remove
__rvm_remove_from_path /test-bin    # env[PATH]!=//test-bin/
src/rvm/rvm-test-rvm1/bundler_cd_hook_comment_test.sh000066400000001704147511530530017051 0ustar00source "$rvm_path/scripts/rvm"

: setup
true TMPDIR:${TMPDIR:=/tmp}:
d=$TMPDIR/test-rvmrc
mkdir -p $d/.bundle
cd $d

: test BUNDLE_BIN not set
source "$rvm_path/hooks/after_cd_bundler"
[[ -z "$LAST_BUNDLER_BIN_PATH" ]]
# status=0

: test BUNDLE_BIN full path
echo 'BUNDLE_BIN: /full/path' > .bundle/config
source "$rvm_path/hooks/after_cd_bundler"
[[ "$LAST_BUNDLER_BIN_PATH" == "/full/path" ]]
# status=0

: test BUNDLE_BIN with ~
echo 'BUNDLE_BIN: ~/binstubs' > .bundle/config
source "$rvm_path/hooks/after_cd_bundler"
[[ "$LAST_BUNDLER_BIN_PATH" == "$HOME/binstubs" ]]
# status=0

: test BUNDLE_BIN with $HOME
echo 'BUNDLE_BIN: $HOME/binstubs' > .bundle/config
source "$rvm_path/hooks/after_cd_bundler"
[[ "$LAST_BUNDLER_BIN_PATH" == "$HOME/binstubs" ]]
# status=0

: test BUNDLE_BIN relative
echo 'BUNDLE_BIN: bin/' > .bundle/config
source "$rvm_path/hooks/after_cd_bundler" <<<Yes
[[ "$LAST_BUNDLER_BIN_PATH" == "$PWD/bin/" ]]
# status=0

: cleanup
rm -rf $d
src/rvm/rvm-test-rvm1/ruby-env_comment_test.sh000066400000010671147511530530015502 0ustar00source "$rvm_path/scripts/rvm"
source "$rvm_path/scripts/functions/rvmrc_project"
rvm_scripts_path="$rvm_path/scripts" rvm_project_rvmrc=cd source "$rvm_path/scripts/cd"

: prepare
true TMPDIR:${TMPDIR:=/tmp}:
d=$TMPDIR/test-ruby-env
mkdir -p $d
rvm use --install 2.4.1
typeset -a __file_env_variables rvm_saved_env

### test with disabled trusting
export rvm_trust_rvmrcs_flag=1

: simple file loading
printf "a\nb\n" > $d/.env
__rvm_file_load_env $d/.env ""
# env[__file_env_variables][]=2
# env[__file_env_variables][0]=/^a$/
# env[__file_env_variables][1]=/^b$/

: prefixed file loading
printf "env-c\nenv-d\n" > $d/.env
__rvm_file_load_env $d/.env "env-"
# env[__file_env_variables][]=2
# env[__file_env_variables][0]=/^c$/
# env[__file_env_variables][1]=/^d$/

: remove empty new lines and comments
printf "d\n\n\043e\nf\n" > $d/.env    ## \043 for # as tf has a parsing bug
__rvm_file_load_env $d/.env ""
# env[__file_env_variables][]=2
# env[__file_env_variables][0]=/^d$/
# env[__file_env_variables][1]=/^f$/

: setting env variables with save
rvm_saved_env=()
unset a b
__rvm_set_env "rvm_saved_env" a=1 b=2
# env[a]=/^1$/
# env[b]=/^2$/
# env[rvm_saved_env][]=2
# env[rvm_saved_env][0]=/^a=$/
# env[rvm_saved_env][1]=/^b=$/

: setting env variables without save
rvm_saved_env=()
unset a b
__rvm_set_env "" a=3 b=4
# env[a]=/^3$/
# env[b]=/^4$/
# env[rvm_saved_env][]=0

: load/unload from file
printf "a=1\nb=2\n" > $d/.env
rvm_saved_env=( a=3 b=4 )
__rvm_file_load_env $d/.env
__rvm_file_set_env
# env[a]=/^1$/
# env[b]=/^2$/
# env[rvm_saved_env][]=2
# env[rvm_saved_env][0]=/^a=3$/
# env[rvm_saved_env][1]=/^b=4$/
__rvm_file_env_check_unload
# env[a]=/^3$/
# env[b]=/^4$/
# env[rvm_saved_env][]=0

: load from file no execution
printf "a=\`uname\`\nb=\$(uname)\n" > $d/.env
__rvm_file_load_env $d/.env
__rvm_file_set_env
# env[a]=/^`uname`$/
# env[b]=/uname/

: cd + .ruby-env + ';;'
rvm_saved_env=()
cd
RAILS_ENV=""
printf "2.4.1" > $d/.ruby-version
printf "RAILS_ENV=development';echo bla>&2;'" > $d/.ruby-env
cd "$d"
# match!=/bla/
# match[stderr]!=/bla/
# env[RAILS_ENV]=/^development'/
# env[rvm_saved_env][]=1
# env[rvm_saved_env][0]=/^RAILS_ENV=$/
cd
# env[RAILS_ENV]=/^$/
# env[rvm_saved_env][]=0
rm $d/.ruby-version

: cd + .ruby-env + ''
rvm_saved_env=()
cd
RAILS_ENV=""
printf "2.4.1" > $d/.ruby-version
printf "RAILS_ENV='development'" > $d/.ruby-env
cd "$d"
# env[RAILS_ENV]=/^development$/
# env[rvm_saved_env][]=1
# env[rvm_saved_env][0]=/^RAILS_ENV=$/
cd
# env[RAILS_ENV]=/^$/
# env[rvm_saved_env][]=0
rm $d/.ruby-version

: cd + Gemfile + ""
cd
RAILS_ENV="production"
printf "\043ruby=2.4.1\n" > $d/Gemfile
printf "\043ruby-env-RAILS_ENV=\"development\"\n" >> $d/Gemfile
printf "gem 'rvm'\n" >> $d/Gemfile
cd "$d"
# env[RAILS_ENV]=/^development$/
# env[rvm_saved_env][]=1
# env[rvm_saved_env][0]=/^RAILS_ENV=production$/
cd
# env[RAILS_ENV]=/^production$/
# env[rvm_saved_env][]=0
rm $d/Gemfile

: cd + .versions.conf
cd
BLA0="test"
printf 'ruby=2.4.1\n' > $d/.versions.conf
printf 'env-BLA0=`development`\n' >> $d/.versions.conf
printf 'env-BLA1=\`development\`\n' >> $d/.versions.conf
printf 'env-BLA2=\\`development\\`\n' >> $d/.versions.conf
printf 'env-BLA3=\\\`development\\\`\n' >> $d/.versions.conf
printf 'env-BLA4=\\\\`development\\\\`\n' >> $d/.versions.conf
printf 'env-BLA5=\\\\\`development\\\\\`\n' >> $d/.versions.conf
printf 'env-BLA6=\\\\\\`development\\\\\\`\n' >> $d/.versions.conf
cd "$d"
# match!=/bla/
# match[stderr]!=/bla/
# env[BLA0]=/^`development`$/
# env[BLA1]=/^\\`development\\`$/
# env[BLA2]=/^\\`development\\`$/
# env[BLA3]=/^\\\\`development\\\\`$/
# env[BLA4]=/^\\\\`development\\\\`$/
# env[BLA5]=/^\\\\\\`development\\\\\\`$/
# env[BLA6]=/^\\\\\\`development\\\\\\`$/
# env[rvm_saved_env][]=7
# env[rvm_saved_env][0]=/^BLA0=test$/
cd
# env[BLA0]=/^test$/
# env[rvm_saved_env][]=0
rm $d/.versions.conf

### test with enabled trusting
unset rvm_trust_rvmrcs_flag

: cd + .ruby-env + ''
rvm_saved_env=()
cd
RAILS_ENV=""
printf "2.4.1" > $d/.ruby-version
printf "RAILS_ENV='development'" > $d/.ruby-env
rvm rvmrc reset $d/.ruby-env
cd "$d"
# env[RAILS_ENV]=/^$/
# env[rvm_saved_env][]=0
cd
# env[RAILS_ENV]=/^$/
# env[rvm_saved_env][]=0
rvm rvmrc trust $d/.ruby-env
# match=/Marked .*\/.ruby-env as trusted/
# match!=/Marked .*\/.rvmrc as trusted/
cd "$d"
# env[RAILS_ENV]=/^development$/
# env[rvm_saved_env][]=1
# env[rvm_saved_env][0]=/^RAILS_ENV=$/
cd
# env[RAILS_ENV]=/^$/
# env[rvm_saved_env][]=0
rvm rvmrc reset $d/.ruby-env
rm $d/.ruby-version

: cleanup
rm -rf $d
src/rvm/rvm-test-rvm1/rvm_project_rvmrc_comment_test.sh000066400000007401147511530530017473 0ustar00source "$rvm_path/scripts/rvm"
export rvm_rubies_path

: prepare
true TMPDIR:${TMPDIR:=/tmp}:
d=$TMPDIR/test-user
mkdir -p $d
cd $d
rvm use 2.4.0 --install           # status=0
rvm use 2.4.1 --install --default # status=0

## use system
: loads default if nothing else set
rvm use system
# env[GEM_HOME]=/^$/
source "$rvm_path/scripts/initialize"
# env[rvm_rubies_path]!=/^$/
rvm_current_rvmrc=""
rvm_previous_environment=""
rvm_project_rvmrc_default=1 rvm_promptless=1 __rvm_project_rvmrc
# env[GEM_HOME]=/2.4.1$/
# env[PATH]=/2.4.1/

: load project
echo "2.4.0" > .ruby-version
rvm use system
# env[GEM_HOME]=/^$/
source "$rvm_path/scripts/initialize"
# env[rvm_rubies_path]!=/^$/
rvm_current_rvmrc=""
rvm_previous_environment=""
rvm_project_rvmrc_default=1
rvm_promptless=1
__rvm_project_rvmrc
# env[GEM_HOME]=/2.4.0$/
# env[PATH]=/2.4.0/

: load project and gemset
echo "@test" > .ruby-gemset
rvm use system
# env[GEM_HOME]=/^$/
source "$rvm_path/scripts/initialize"
# env[rvm_rubies_path]!=/^$/
rvm_current_rvmrc=""
rvm_previous_environment=""
rvm_create_flag=1
rvm_project_rvmrc_default=1
rvm_promptless=1
## ( set -x ; PS4=="+ \${BASH_SOURCE} : \${FUNCNAME[0]:+\${FUNCNAME[0]}()}  \${LINENO} > " ; __rvm_project_rvmrc )
__rvm_project_rvmrc
# env[GEM_HOME]=/2.4.0@test$/
# env[PATH]=/2.4.0@test/

## use default
: loads default if nothing else set
rm .ruby-version .ruby-gemset
rvm use default
# env[GEM_HOME]=/2.4.1$/
# env[PATH]=/2.4.1/
source "$rvm_path/scripts/initialize"
# env[rvm_rubies_path]!=/^$/
rvm_current_rvmrc=""
rvm_previous_environment=""
rvm_project_rvmrc_default=1 rvm_promptless=1 __rvm_project_rvmrc
# env[GEM_HOME]=/2.4.1$/
# env[PATH]=/2.4.1/

: load project
echo "2.4.0" > .ruby-version
rvm use default
# env[GEM_HOME]=/2.4.1$/
# env[PATH]=/2.4.1/
source "$rvm_path/scripts/initialize"
# env[rvm_rubies_path]!=/^$/
rvm_current_rvmrc=""
rvm_previous_environment=""
rvm_project_rvmrc_default=1
rvm_promptless=1
__rvm_project_rvmrc
# env[GEM_HOME]=/2.4.0$/
# env[PATH]=/2.4.0/

: load project and gemset
echo "@test" > .ruby-gemset
rvm use default
# env[GEM_HOME]=/2.4.1$/
# env[PATH]=/2.4.1/
source "$rvm_path/scripts/initialize"
# env[rvm_rubies_path]!=/^$/
rvm_current_rvmrc=""
rvm_previous_environment=""
rvm_create_flag=1
rvm_project_rvmrc_default=1
rvm_promptless=1
## ( set -x ; PS4=="+ \${BASH_SOURCE} : \${FUNCNAME[0]:+\${FUNCNAME[0]}()}  \${LINENO} > " ; __rvm_project_rvmrc )
__rvm_project_rvmrc
# env[GEM_HOME]=/2.4.0@test$/
# env[PATH]=/2.4.0@test/

## source default
: loads default if nothing else set
rm .ruby-version .ruby-gemset
rvm use system
source "$rvm_path/scripts/initialize"
# env[rvm_rubies_path]!=/^$/
source $rvm_path/environments/default
# env[GEM_HOME]=/2.4.1$/
# env[PATH]=/2.4.1/
rvm_current_rvmrc=""
rvm_previous_environment=""
rvm_project_rvmrc_default=1 rvm_promptless=1 __rvm_project_rvmrc
# env[GEM_HOME]=/2.4.1$/
# env[PATH]=/2.4.1/

: load project
echo "2.4.0" > .ruby-version
rvm use system
source "$rvm_path/scripts/initialize"
# env[rvm_rubies_path]!=/^$/
source $rvm_path/environments/default
# env[GEM_HOME]=/2.4.1$/
# env[PATH]=/2.4.1/
rvm_current_rvmrc=""
rvm_previous_environment=""
rvm_project_rvmrc_default=1
rvm_promptless=1
__rvm_project_rvmrc
# env[GEM_HOME]=/2.4.0$/
# env[PATH]=/2.4.0/

: load project and gemset
echo "@test" > .ruby-gemset
rvm use system
source "$rvm_path/scripts/initialize"
# env[rvm_rubies_path]!=/^$/
source $rvm_path/environments/default
# env[GEM_HOME]=/2.4.1$/
# env[PATH]=/2.4.1/
rvm_current_rvmrc=""
rvm_previous_environment=""
rvm_create_flag=1
rvm_project_rvmrc_default=1
rvm_promptless=1
## ( set -x ; PS4=="+ \${BASH_SOURCE} : \${FUNCNAME[0]:+\${FUNCNAME[0]}()}  \${LINENO} > " ; __rvm_project_rvmrc )
__rvm_project_rvmrc
# env[GEM_HOME]=/2.4.0@test$/
# env[PATH]=/2.4.0@test/

: teardown
rvm alias delete default 2.4.1
rm -rf $d
src/rvm/rvm-test-rvm1/exports_comment_test.sh000066400000000574147511530530015440 0ustar00source "$rvm_path/scripts/rvm"

export TEST_VAR=2     # env[TEST_VAR]=/^2$/; env[rvm_old_TEST_VAR]=/^$/
rvm export TEST_VAR=3 # env[TEST_VAR]=/^3$/; env[rvm_old_TEST_VAR]=/^2$/
rvm unexport          # env[TEST_VAR]=/^2$/; env[rvm_old_TEST_VAR]=/^$/

unset TEST_VAR        # env[TEST_VAR]=/^$/
rvm export TEST_VAR=3 # env[TEST_VAR]=/^3$/
rvm unexport          # env[TEST_VAR]=/^$/
src/rvm/rvm-test-rvm1/pwd_cd_hook_comment_test.sh000066400000001774147511530530016217 0ustar00source "$rvm_path/scripts/rvm"
source "$rvm_path/scripts/functions/rvmrc_project"
rvm_scripts_path="$rvm_path/scripts" rvm_project_rvmrc=cd source "$rvm_path/scripts/cd"

: setup basic
true TMPDIR:${TMPDIR:=/tmp}:
d=$TMPDIR/test-rvm-pwd-hook
mkdir -p $d/.rvm/hooks
f=$d/.rvm/hooks/after_cd_test
echo "echo test it" > $f
chmod +x $f

: test not trusted
cd $d
# match!=/^test it$/
# status=0

: test trusted
rvm rvmrc trust $f
cd $d
# match=/^test it$/
# status=0

: test untrusted
rvm rvmrc reset $f
cd $d
# match!=/^test it$/
# status=0

: cleanup
rm -rf $d

: setup spaces
true TMPDIR:${TMPDIR:=/tmp}:
d=$TMPDIR/test-rvm-pwd-hook
mkdir -p $d/.rvm/hooks
f="$d/.rvm/hooks/after_cd_test install.sh"
echo "echo test it" > "$f"
echo "echo spaces" > $d/.rvm/hooks/after_cd_test
echo "echo install" > $d/install.sh
chmod +x "$f" $d/.rvm/hooks/after_cd_test $d/install.sh

: test trusted
rvm rvmrc trust "$f"
cd $d
# match=/^test it$/
# match!=/^spaces$/
# match!=/^install$/
# status=0

: cleanup
rvm rvmrc reset $f
rm -rf $d
src/rvm/rvm-test-rvm1/rvm-user_comment_test.sh000066400000001461147511530530015510 0ustar00source "$rvm_path/scripts/rvm"
rvm_scripts_path=$rvm_path/scripts
source "$rvm_path/scripts/tools"

: prepare
true TMPDIR:${TMPDIR:=/tmp}:
d=$TMPDIR/test-user
mkdir -p $d

: rvm user none
printf "rvm_path=a\nrvm_gemset_path=b\n" > $d/.fake-rvmrc
tools_user_none $d/.fake-rvmrc
# status=0
cat $d/.fake-rvmrc
# match=/rvm_path=/
# match!=/rvm_gemset_path=/

: __rvm_env_string
rvm use 2.4.1 --install
__rvm_env_string # match=/2.4.1/

: __rvm_env_string fake + gems_path
export rvm_gems_path=/tmp/gems2
export GEM_HOME=$rvm_gems_path/3.0.0-p1000
export PATH=$GEM_HOME/bin:$PATH
__rvm_env_string # match=/^3.0.0-p1000$/
: __rvm_env_string fake + gems_path

export rvm_gems_path=/tmp/gems2
export GEM_HOME=$rvm_path/gems/3.0.0-p9000
export PATH=$GEM_HOME/bin:$PATH
__rvm_env_string # match=/^3.0.0-p9000$/

rvm use 2.4.1
src/rvm/rvm-test-rvm1/load_ruby-version_comment_test.sh000066400000001227147511530530017373 0ustar00: prepare
true TMPDIR:${TMPDIR:=/tmp}:
d=$TMPDIR/test-user
mkdir -p $d
cd $d
unset GEM_HOME GEM_PATH
PATH="$( echo $PATH | sed 's/^.*rvm[^:]*://' )" # env[PATH]!=/rvm/
"$rvm_path/bin/rvm" install 2.4.0               # status=0
"$rvm_path/bin/rvm" 2.4.0 do rvm gemset create test # status=0
"$rvm_path/bin/rvm" install 2.4.1               # status=0
"$rvm_path/bin/rvm" alias delete default        # status=0
"$rvm_path/bin/rvm" alias create default 2.4.1  # status=0

echo "2.4.0" > .ruby-version
echo "test" > .ruby-gemset
source "$rvm_path/scripts/rvm"
# env[GEM_HOME]=/2.4.0@test$/
# env[PATH]=/2.4.0@test/

: teardown
rvm alias delete default 2.4.1
rm -rf $d
src/rvm/rvm-test-rvm1/path_mismatch_comment_test.sh000066400000003330147511530530016546 0ustar00source "$rvm_path/scripts/rvm"
rvm_scripts_path="$rvm_path/scripts" rvm_project_rvmrc=cd source "$rvm_path/scripts/cd"

: test no error
rvm use 2.4.1 --install   # status=0
rvm version
# match!=/is not at first place/
# match!=/is not available/

: test GEM_HOME second
rvm use 2.4.1             # status=0
GEM_HOME=$GEM_HOME@global # env[GEM_HOME]=/2.4.1@global$/
rvm version               # match=/is not at first place/

: test GEM_HOME missing
rvm use 2.4.1             # status=0
rvm gemset delete veve
GEM_HOME=$GEM_HOME@veve   # env[GEM_HOME]=/2.4.1@veve$/
rvm version               # match=/is not available/

: rvm-shell check
rvm use 2.4.1             # status=0
GEM_HOME=$GEM_HOME@veve
rvm-shell 2.4.1 -c 'true'
# match!=/is not at first place/
# match!=/is not available/

: test silencing
export rvm_silence_path_mismatch_check_flag=1
rvm use 2.4.1             # status=0
GEM_HOME=$GEM_HOME@veve
rvm version
# match!=/is not at first place/
# match!=/is not available/
unset rvm_silence_path_mismatch_check_flag

## cd + .rvmrc
: prepare
rvm use system
rvm alias delete default
true TMPDIR:${TMPDIR:=/tmp}:
d=$TMPDIR/test-cd-rvmrc
mkdir -p $d
echo "rvm use 2.4.1@veve --create" >> $d/.rvmrc
rvm rvmrc trust $d/.rvmrc

: entering
cd $d
# match!=/is not at first place/
# match!=/is not available/
# env[GEM_HOME]=/@veve$/

: leaving
cd ..
# match!=/is not at first place/
# match!=/is not available/
# env[GEM_HOME]=/^$/

: simulate 'rvm reload'
cd
rvm use 2.4.1@veve
# env[GEM_HOME]=/@veve$/
# env[PATH]=/@veve/
rvm_previous_environment="$(__rvm_env_string)"
rvm_promptless=1 __rvm_project_rvmrc
# match!=/is not at first place/
# match!=/is not available/
# env[GEM_HOME]=/@veve$/
# env[PATH]=/@veve/

rvm rvmrc reset $d/.rvmrc
rm -rf $d
src/rvm/update-remote.sh000066400000001247147511530530011260 0ustar00#!/usr/bin/env bash

echo "Linking: OSX binaries"
ssh rvm@ssh.rvm.io -C ./site/bin/rvm-link-binaries.sh osx 10.9

echo "Processing: remote - all"
ssh rvm@ssh.rvm.io -C ./site/bin/rvm-list-binary.sh remote | sort > config/remote

for type in md5 sha512
do
  ssh rvm@ssh.rvm.io ./site/bin/rvm-list-binary.sh $type | while IFS="=" read name value
  do
    echo "Processing: $type - $name"
    if \grep "^$name=" config/$type >/dev/null
    then sed -i.bak -e 's#^'"$name"'=.*$#'"$name=$value"'#' config/$type
    else echo "$name=$value" >> config/$type
    fi
  done
  LANG=C sort -n config/$type > config/$type.new
  mv -f config/$type.new config/$type
  rm config/$type.bak
done
src/rvm/rvm-test/long/ruby-1.8.7_comment_test.sh000066400000000351147511530530015433 0ustar00rvm reinstall 1.8.7-ntest -C --program-suffix=1.8 # status=0; match=/linking ruby1.8 -> ruby/; match=/linking gem1.8 -> gem/

rvm 1.8.7-ntest do ruby1.8 -v  # match=/1.8.7/
rvm remove 1.8.7-ntest         # status=0; match=/Removing/
src/rvm/rvm-test/long/named_ruby_and_gemsets_comment_test.sh000077500000003553147511530530020511 0ustar00source "$rvm_path/scripts/rvm"

rvm remove  1.8.7-p374-ntest --gems

## without gemsets

rvm install 1.8.7-p374-ntest --skip-gemsets --disable-binary
# status=0
# match!=/Already installed/
# match=/Skipped importing default gemsets/
## match=/WARNING: Please be aware that you just installed a ruby that/
## match=/for a list of maintained rubies visit:/

rvm install 1.8.7-p374-ntest
# status=0; match=/Already installed/

rvm 1.8.7-p374-ntest do which gem
# match=/1.8.7-p374-ntest/

rvm 1.8.7-p374-ntest do gem env

rvm 1.8.7-p374-ntest do gem list
# match[stderr]=/\A\Z/
# match[stdout]!=/rubygems-bundler/

rvm 1.8.7-p374-ntest do ruby -v
# match=/1.8.7.*patchlevel 374/

rvm remove  1.8.7-p374-ntest --gems
# status=0; match=/[Rr]emoving/


## default/global gemsets

mkdir -p $rvm_path/gemsets/ruby/1.8.7/p374/
printf "gem-wrappers\ntf\n"   > $rvm_path/gemsets/ruby/1.8.7/p374/global.gems
printf "gem-wrappers\nhaml -v <5\n" > $rvm_path/gemsets/ruby/1.8.7/p374/default.gems

rvm install 1.8.7-p374-ntest
# status=0
# match!=/Already installed/
# match=/importing gemset .*gemsets\/ruby\/1.8.7\/p374\/global.gems/
# match=/importing gemset .*gemsets\/ruby\/1.8.7\/p374\/default.gems/
## match=/WARNING: Please be aware that you just installed a ruby that/
## match=/for a list of maintained rubies visit:/

rvm 1.8.7-p374-ntest do gem list
# match[stderr]=/\A\Z/
# match[stdout]=/haml/
# match[stdout]=/tf/

rvm 1.8.7-p374-ntest@global do gem list
# match[stderr]=/\A\Z/
# match[stdout]!=/haml/
# match[stdout]=/tf/

## Cleanup

rvm remove 1.8.7-p374-ntest --gems
# status=0; match=/[Rr]emoving/

rm -rf $rvm_path/gemsets/ruby/1.8.7/p374

ls -1d $rvm_path/environments/*1.8.7-p374-ntest*   # status!=0
ls -1d $rvm_path/wrappers/*1.8.7-p374-ntest*       # status!=0
ls -1d $rvm_path/gems/*1.8.7-p374-ntest*           # status!=0
ls -1d $rvm_path/bin/*1.8.7-p374-ntest*            # status!=0

src/rvm/rvm-test/long/jruby_comment_test.sh000077500000000276147511530530015145 0ustar00rvm reinstall jruby            # status=0; match!=/Already installed/
rvm jruby-ntest do ruby -v     # match=/1.9./; match=/Java/
rvm remove jruby-ntest         # status=0; match=/Removing/
src/rvm/rvm-test/long/rubinius_comment_test.sh000077500000000312147511530530015641 0ustar00rvm use 1.9.3
rvm reinstall rbx-ntest --19 # status=0; match!=/Already installed/
rvm rbx-ntest do ruby -v     # match=/1.9./; match=/rubinius/
rvm remove rbx-ntest         # status=0; match=/Removing/
src/rvm/rvm-test/long/ruby-1.9.3_comment_test.sh000077500000000355147511530530015437 0ustar00rvm reinstall 1.9.3-ntest    # status=0; match!=/Already installed/
rvm 1.9.3-ntest do ruby -v   # match=/1.9.3/
rvm 1.9.3-ntest do which gem # match=/1.9.3-p[[:digit:]]+-ntest/
rvm remove 1.9.3-ntest       # status=0; match=/Removing/

src/rvm/rvm-test/long/truffleruby_comment_test.sh000077500000002233147511530530016356 0ustar00## Test the latest TruffleRuby release
rvm install truffleruby # status=0; match!=/Already installed/; match=/compiling c-extensions/
rvm truffleruby do ruby -v # status=0; match=/truffleruby/
rvm truffleruby do rake --version # status=0; match=/rake, version/
rvm truffleruby do ruby -S bundle --version # status=0; match=/Bundler version/
echo 'gem "rake"' > Gemfile # status=0
rvm truffleruby do bundle install # status=0
rvm truffleruby do ruby -S bundle exec rake --version # status=0; match=/rake, version/
rm Gemfile
rvm truffleruby do ruby -ropen-uri -e 'puts open("https://rubygems.org/") { |f| f.read(1024) }'
# status=0; match=/RubyGems.org/
rvm remove truffleruby # status=0; match=/removing.+truffleruby/

## Test installing truffleruby-head
rvm install truffleruby-head # status=0; match!=/Already installed/
rvm truffleruby-head do ruby -v # status=0; match=/truffleruby/
rvm remove truffleruby-head # status=0

## Test that the right version is installed (#4633)
rvm install truffleruby-1.0.0-rc13 # status=0; match!=/Already installed/
rvm truffleruby-1.0.0-rc13 do ruby -v # status=0; match=/truffleruby 1.0.0-rc13/
rvm remove truffleruby-1.0.0-rc13 # status=0
src/rvm/rvm-test/.gitignore000066400000000157147511530530011721 0ustar00*.log
config/database.yml
db/config.yml
db/*.rvm
db/*.db
.idea
config/github.yml
config/github.rb
Gemfile.lock
src/rvm/rvm-test/.travis.yml000066400000001014147511530530012033 0ustar00language: ruby
rvm:
  - 2.4.1
before_install:
  - unset BUNDLE_GEMFILE
  - rvm get head
  - rvm alias delete default
  - hash -r
  - rm ~/.rvm/hooks/after_use
install: gem install tf -v '>=0.4.1'
script: 'NOEXEC=skip tf --text $TEST'
env:
  - TEST=fast/*
  - TEST=long/named_ruby_and_gemsets_comment_test.sh
  - TEST=long/truffleruby_comment_test.sh
notifications:
  irc:
    channels:
      - "irc.freenode.org#rvm-test"
  email:
    recipients:
      - mpapis@gmail.com
      - me@deryldoucette.com
    on_failure: change
src/rvm/rvm-test/.versions.conf000066400000000122147511530530012516 0ustar00ruby=2.4.1
ruby-gemset=rvm-test
ruby-gem-install=bundler
ruby-bundle-install=true
src/rvm/rvm-test/fast/rvmrc-create_comment_test.sh000077500000002262147511530530016377 0ustar00source "$rvm_path/scripts/rvm"

: prepare
true TMPDIR:${TMPDIR:=/tmp}:
d=$TMPDIR/test-rvmrc
mkdir $d
pushd $d
command rvm install 2.4.1
rvm 2.4.1 do rvm gemset reset_env
rvm use 2.3.4 --install

: .rvmrc generated
rvm rvmrc create 2.4.1
[ -f .rvmrc ]         # status=0
rvm current           # match=/2.3.4/
rvm rvmrc trust .rvmrc
rvm rvmrc load .rvmrc # env[GEM_HOME]=/2.4.1$/ ; env[PATH]=/2.4.1/
rvm current           # match=/2.4.1/

: .rvmrc with use
rvm_current_rvmrc=""
echo "rvm use 2.3.4" > .rvmrc
rvm rvmrc trust .
rvm rvmrc load .
rvm current           # match=/2.3.4/

: .rvmrc without use
rvm_current_rvmrc=""
echo "rvm 2.4.0" > .rvmrc
rvm rvmrc trust
rvm rvmrc load
rvm current           # match=/2.4.0/

rm -f .rvmrc
rvm use 2.3.4

: .versions.conf
rvm rvmrc create 2.4.0 .versions.conf
[ -f .versions.conf ] # status=0
rvm current           # match=/2.3.4/
rvm rvmrc load .
rvm current           # match=/2.4.0/

rm -f .versions.conf
rvm use 2.3.4

: .ruby-version
rvm rvmrc create 2.4.0 .ruby-version
[ -f .ruby-version ]  # status=0
rvm current           # match=/2.3.4/
rvm rvmrc load .
rvm current           # match=/2.4.0/

rm -f .ruby-version
rvm use 2.3.4

: clean
popd
rm -rf $d
src/rvm/rvm-test/fast/globalcache_comment_test.sh000066400000003360147511530530016226 0ustar00source "$rvm_path/scripts/rvm"

rvm use 2.3.4 --install                           # status=0; env[GEM_HOME]=/2.3.4/
rvm --force gemset globalcache disable
rvm gemset globalcache enabled                    # match=/Disabled/

[[ -L "$rvm_path/gems/cache" ]]                   # status!=0

rvm gemset globalcache enable                     # status=0; match=/ global cache /
rvm gemset globalcache enabled                    # status=0; match=/Enabled/
rvm gemset list                                   # status=0; match!=/ testset$/

rvm gemset create testset                         # status=0; match=/gemset created/
rvm gemset list                                   # status=0; match=/ testset$/

[[ -L "$rvm_path/gems/cache" ]]                   # status!=0
[[ -d "$rvm_path/gems/cache" ]]                   # status=0

rvm gemset copy 2.3.4@testset 2.3.4@testset2
# status=0
# match=/Copying gemset/
# match!=/Unknown file type/
# match!=/cannot overwrite directory/
# match!=/with non-directory/
# match!=/Error running/
# match[stderr]=/^$/
rvm gemset list                                   # status=0; match=/ testset2$/

rvm gemset --force delete testset                 # status=0; match=/Removing gemset testset/
rvm gemset --force delete testset2                # status=0; match=/Removing gemset testset2/

rvm system                                        # status=0

[[ -L "$rvm_path/gems/cache" ]]                   # status!=0
[[ -d "$rvm_path/gems/cache" ]]                   # status=0
[[ -d "$rvm_path/gems/cache/cache" ]]             ## status!=0 ... need more testing for this

rvm --force gemset globalcache disable            # status=0;  match=/Removing the global cache/
rvm gemset globalcache enabled                    # status!=0; match=/Disabled/
src/rvm/rvm-test/fast/rvmrc-warning_comment_test.sh000066400000003170147511530530016575 0ustar00source "$rvm_path/scripts/rvm"

: prepare
unset __rvmrc_warning_path
true TMPDIR:${TMPDIR:=/tmp}:
d=$TMPDIR/test-rvmrc-warning
f=$d/Gemfile
mkdir -p $d
touch $f
mv $rvm_path/user/rvmrc_ignored $d/rvmrc_ignored

: single file
rvm rvmrc warning list      # match!=/Gemfile/
rvm --debug rvmrc warning check  $f # status=1 ; match=/is not ignored/
rvm rvmrc warning ignore $f # status=0
rvm rvmrc warning check  $f # status=0 ; match=/is ignored/
rvm rvmrc warning list      # match=/test-rvmrc-warning/Gemfile/
rvm rvmrc warning reset  $f # status=0
rvm rvmrc warning check  $f # status=1 ; match=/is not ignored/
rvm rvmrc warning list      # match!=/Gemfile/

: all files
rvm rvmrc warning check  allGemfiles # status=1 ; match=/is not ignored/
rvm rvmrc warning ignore allGemfiles # status=0
rvm rvmrc warning check  $f          # status=0 ; match=/is ignored/
rvm rvmrc warning check  allGemfiles # status=0 ; match=/is ignored/
rvm rvmrc warning list               # match=/allGemfiles/
rvm rvmrc warning reset  allGemfiles # status=0
rvm rvmrc warning check  $f          # status=1 ; match=/is not ignored/
rvm rvmrc warning check  allGemfiles # status=1 ; match=/is not ignored/
rvm rvmrc warning list               # match!=/Gemfile/

: single + all
rvm rvmrc warning ignore $f          # status=0
rvm rvmrc warning ignore allGemfiles # status=0
rvm rvmrc warning list               # match=/allGemfiles/ ; match=/test-rvmrc-warning/Gemfile/
rvm rvmrc warning check  $f          # status=0 ; match=/is ignored/
rvm rvmrc warning check  allGemfiles # status=0 ; match=/is ignored/

: clean
mv -f $d/rvmrc_ignored $rvm_path/user/rvmrc_ignored
rm -rf $d
src/rvm/rvm-test/fast/wrapper_comment_test.sh000066400000002164147511530530015463 0ustar00source "$rvm_path/scripts/rvm"

: prepare
true TMPDIR:${TMPDIR:=/tmp}:
d=$TMPDIR/test-wrappers
mkdir $d
pushd $d
rvm install 2.4.0 # status=0
rvm use --install 2.3.4 # status=0
rvm 2.3.4@global do gem install rake -v "<10.2"

: help
rvm wrapper      # status!=0; match=/Usage/
rvm wrapper help # status=0;  match=/Usage/

: show
rvm wrapper show
# status=0
# match=/Wrappers path: .*/gems/ruby-2.3.4\/wrappers/
# match=/Environment file: .*/gems/ruby-2.3.4/environment/
# match=/Executables: .*, rake, /

: show rake
rvm wrapper show rake
# status=0
# match=/.*/gems/ruby-2.3.4\/wrappers\/rake/

: for file
echo 'echo "$GEM_HOME"' > $d/custom-script
chmod +x $d/custom-script
rvm 2.4.0 do rvm wrapper $d/custom-script # status=0
wrapper_script=`rvm 2.4.0 do rvm wrapper show custom-script`
# status=0
# env[wrapper_script]=/.*/gems/ruby-2.4.0\/wrappers\/custom-script/
$wrapper_script
# status=0
# match=/.*/gems/ruby-2.4.0\Z/
# env[GEM_HOME]=/.*/gems/ruby-2.3.4\Z/

: regenerate
rm -f $GEM_HOME/wrappers/rake
rvm wrapper show rake   # status!=0
rvm wrapper regenerate  # status=0
rvm wrapper show rake   # status=0

: clean
popd
rm -rf $d
src/rvm/rvm-test/fast/do_comment_test.sh000066400000005573147511530530014414 0ustar00source "$rvm_path/scripts/rvm"

rvm use 2.3.4 --install # status=0
rvm gemset create test1 # status=0
rvm gemset create test2 # status=0
rvm use 2.4.0 --install # status=0

: do
rvm 8.9.9 do rvm gemdir # status=1; match=/is not installed/
rvm 2.3.4 do rvm gemdir # status=0; match=/2.3.4/
rvm 2.3.4@test0 do rvm gemdir # status=2; match=/Gemset .* does not exist/
rvm 2.3.4@test1 do rvm gemdir # status=0; match=/2.3.4@test1/
rvm 2.3.4@test2 do rvm gemdir # status=0; match=/2.3.4@test2/

rvm 2.3.4@global,2.3.4 do rvm gemdir # status=0; match=/2.3.4@global$/; match=/2.3.4$/

rvm --force gemset delete test1 # status=0
rvm --force gemset delete test2 # status=0

: FIXME: The following tests have awful duplication due to https://github.com/mpapis/tf/issues/6

: -----------------------------------------------------------------
: do in directory with no version

true TMPDIR:${TMPDIR:=/tmp}:
d=$TMPDIR/test-rvm-do-in
mkdir -p $d

: absolute directory
rvm in $d do rvm info ruby  # status=1; match=/Could not determine which Ruby to use/
rvm in $d do ruby --version # status=1; match=/Could not determine which Ruby to use/

: relative directory
cd $TMPDIR
rvm in test-rvm-do-in do rvm info ruby  # status=1; match=/Could not determine which Ruby to use/
rvm in test-rvm-do-in do ruby --version # status=1; match=/Could not determine which Ruby to use/

: current directory
cd $d
rvm in . do rvm info ruby  # status=1; match=/Could not determine which Ruby to use/
rvm in . do ruby --version # status=1; match=/Could not determine which Ruby to use/
rvm    . do rvm info ruby  # status=1; match=/Could not determine which Ruby to use/
rvm    . do ruby --version # status=1; match=/Could not determine which Ruby to use/

: -----------------------------------------------------------------
mkdir -p $d/2.3.4
echo "2.3.4" > $d/2.3.4/.ruby-version

: absolute directory
rvm in $d/2.3.4 do rvm info ruby  # status=0; match=/version: *"2.3.4/
rvm in $d/2.3.4 do ruby --version # status=0; match=/^ruby 2.3.4/

: relative directory
cd $d
rvm in 2.3.4 do rvm info ruby  # status=0; match=/version: *"2.3.4/
rvm in 2.3.4 do ruby --version # status=0; match=/^ruby 2.3.4/

: current directory
cd $d/2.3.4
rvm . do rvm info ruby  # status=0; match=/version: *"2.3.4/
rvm . do ruby --version # status=0; match=/^ruby 2.3.4/

: -----------------------------------------------------------------
ver=2.4.0
mkdir -p $d/2.4.0
echo "2.4.0" > $d/2.4.0/.ruby-version

: absolute directory
rvm in $d/2.4.0 do rvm info ruby  # status=0; match=/version: *"2.4.0/
rvm in $d/2.4.0 do ruby --version # status=0; match=/^ruby 2.4.0/

: relative directory
cd $d
rvm in 2.4.0 do rvm info ruby  # status=0; match=/version: *"2.4.0/
rvm in 2.4.0 do ruby --version # status=0; match=/^ruby 2.4.0/

: current directory
cd $d/2.4.0
rvm . do rvm info ruby  # status=0; match=/version: *"2.4.0/
rvm . do ruby --version # status=0; match=/^ruby 2.4.0/

## cleanup
rm -rf $d
src/rvm/rvm-test/fast/alias_comment_test.sh000077500000003034147511530530015074 0ustar00source "$rvm_path/scripts/rvm"

rvm use 2.3.4 --install
rvm use 2.4.0 --install
rvm gemset create test_gemset

rvm alias create default 2.4.0@test_gemset # status=0
ls -l $rvm_path/environments/default       # status=0; match=/2.4.0@test_gemset/
rvm alias list                             # match=/^default => ruby-2.4.0@test_gemset$/
rvm alias delete default                   # status=0
ls -l $rvm_path/environments/default       # status!=0

rvm alias create ruby-test-default 2.4.0@test_gemset # status=0
ls -l $rvm_path/environments/ruby-test-default       # status=0
rvm alias list                                       # match=/^ruby-test-default => ruby-2.4.0@test_gemset$/
rvm alias list names                                 # match=/^ruby-test-default$/
rvm alias delete ruby-test-default                   # status=0
ls -l $rvm_path/environments/ruby-test-default       # status!=0

rvm --force gemset delete test_gemset

: overwrite existing aliases
rvm alias create veve 2.3.4  # status=0
ls -l $rvm_path/environments/veve # status=0; match=/2.3.4/
ls -l $rvm_path/wrappers/veve     # status=0; match=/2.3.4/
rvm alias list                    # match=/^veve => ruby-2.3.4$/
rvm alias create veve 2.4.0       # status=0
ls -l $rvm_path/environments/veve # status=0; match=/2.4.0/
ls -l $rvm_path/wrappers/veve     # status=0; match=/2.4.0/
rvm alias list                    # match=/^veve => ruby-2.4.0$/
rvm alias delete veve             # status=0
ls -l $rvm_path/environments/veve # status!=0
rvm alias list                    # match!=/^veve => /
src/rvm/rvm-test/fast/remote_comment_test.sh000077500000001003147511530530015270 0ustar00source "$rvm_path/scripts/rvm"

: prepare
true TMPDIR:${TMPDIR:=/tmp}:
d=$TMPDIR/test-remote
mkdir $d
pushd $d
rvm use 2.3.4 --install # status=0
rvm list
# match=/ruby-2.3.4/

: tast packaging
rvm prepare 2.3.4           # status=0
[[ -f ruby-2.3.4.tar.bz2 ]] # status=0

: remove it
rvm remove --gems 2.3.4     # status=0
rvm list
# match!=/ruby-2.3.4/

: get local ruby
rvm mount -r ruby-2.3.4.tar.bz2 # status=0
rvm list
# match=/ruby-2.3.4/
rvm use 2.3.4 # status=0; match[stderr]=/^$/

: clean
popd
rm -rf $d
src/rvm/rvm-test/fast/gemset-copy_comment_test.sh000066400000000553147511530530016237 0ustar00source "$rvm_path/scripts/rvm"

rvm use 2.4.0 --install

:
rvm gemset copy 2.4.0 2.4.0@testset # status=0; match=/Copying gemset/; match[stderr]=/^$/
rvm gemset list                     # status=0; match=/ testset$/
rvm gemset --force delete testset   # status=0; match=/Removing gemset testset/
rvm gemset list                     # status=0; match!=/ testset$/
src/rvm/rvm-test/fast/exports_comment_test.sh000066400000000447147511530530015511 0ustar00source "$rvm_path/scripts/rvm"

export TEST_VAR=2     # env[TEST_VAR]=/^2$/
rvm export TEST_VAR=3 # env[TEST_VAR]=/^3$/
rvm unexport          # env[TEST_VAR]=/^2$/

unset TEST_VAR        # env[TEST_VAR]=/^$/
rvm export TEST_VAR=3 # env[TEST_VAR]=/^3$/
rvm unexport          # env[TEST_VAR]=/^$/
src/rvm/rvm-test/fast/env_comment_test.sh000066400000000403147511530530014565 0ustar00source "$rvm_path/scripts/rvm"

rvm use 2.4.0 --install

rvm env 2.4.0           # match=/2.4.0/; match=/GEM_HOME=/; match=/GEM_PATH=/
rvm env 2.4.0 --path    # match=/2.4.0/; match=/environments/
rvm env 2.4.0 -- --path # match=/2.4.0/; match=/environments/
src/rvm/rvm-test/fast/versions.conf_comment_test.sh000066400000003046147511530530016577 0ustar00rvm_reload_flag=1 source "$rvm_path/scripts/rvm"

: prepare
true TMPDIR:${TMPDIR:=/tmp}:
d=$TMPDIR/test-versions-conf
mcd(){ mkdir -p $1 ; cd $1 ; }
mcd $d
rm -f */*

: generate
mcd $d/a
rvm use 2.4.0@versions-conf-a --create --versions-conf --install
rvm current             # match=/^ruby-2.4.0@versions-conf-a$/
[[ -f .versions.conf ]] # status=0

mcd $d/b
rvm use 2.3.4@versions-conf-b --create --versions-conf --install
rvm current             # match=/^ruby-2.3.4@versions-conf-b$/
[[ -f .versions.conf ]] # status=0

: test
rvm rvmrc load $d/a
rvm current         # match=/^ruby-2.4.0@versions-conf-a$/
rvm rvmrc load $d/b
rvm current         # match=/^ruby-2.3.4@versions-conf-b$/

: test bundler without flag of doom
mcd $d/b ## on travis cd hook is disabled ?
rvm rvmrc load $d/b
gem list # match!=/haml/
printf "ruby-gem-install=bundler\nruby-bundle-install=true\n" >> .versions.conf
printf "source :rubygems\n\ngem 'haml'\n" > Gemfile
rvm_current_rvmrc=""
rvm rvmrc load . # match!=/Installing haml/
gem list # match!=/haml/; match=/bundler/

: test bundler with flag of doom
mcd $d/b ## on travis cd hook is disabled ?
rvm rvmrc load $d/b
gem list # match!=/haml/
printf "ruby-gem-install=bundler\nruby-bundle-install=true\n" >> .versions.conf
printf "source :rubygems\n\ngem 'haml'\n" > Gemfile
rvm_current_rvmrc=""
rvm_autoinstall_bundler_flag=1
rvm rvmrc load . # match=/Installing haml/
gem list # match=/haml/; match=/bundler/

: clean
rvm 2.4.0 do rvm --force gemset delete versions-conf-a
rvm 2.3.4 do rvm --force gemset delete versions-conf-b
rm -rf $d
src/rvm/rvm-test/fast/use_comment_test.sh000066400000001236147511530530014576 0ustar00source "$rvm_path/scripts/rvm"

command rvm install 2.3.4
command rvm install 2.4.0

rvm use 8.9.9           # status=1; match!=/Using /; env[GEM_HOME]!=/8.9.9/ ; match=/Unknown ruby interpreter version/
rvm reset               # env[GEM_HOME]=/^$/
rvm current             # match=/system/
rvm use 2.3.4      # status=0; match=/Using / ; env[GEM_HOME]=/2.3.4/
rvm current             # match=/2.3.4/
command rvm use 2.4.0   # status=0; match!=/Using /; env[GEM_HOME]!=/2.4.0/ ; match=/RVM is not a function/
rvm use 2.4.0           # status=0; match=/Using / ; env[GEM_HOME]=/2.4.0/
rvm use 1.9.1           # status=1; env[rvm_recommended_ruby]=/rvm install ruby-1.9.1/
src/rvm/rvm-test/fast/current_and_list_comment_test.sh000066400000001237147511530530017342 0ustar00source "$rvm_path/scripts/rvm"

rvm try_install 2.4.0
rvm try_install 2.3.4
rvm try_install 2.4.1

: separate default/current
rvm use 2.4.0@abc-test --create --default
# status=0
# match=/Using .*ruby-2.4.0 with gemset abc-test/
rvm current
# match=/ruby-2.4.0@abc-test/

rvm use 2.3.4@abc-test --create
# status=0
# match=/Using .*ruby-2.3.4 with gemset abc-test/
rvm current
# match=/ruby-2.3.4@abc-test/

rvm list
# match=/^ \* ruby-2.4.0/
# match=/^=> ruby-2.3.4/

: default == current
rvm use 2.4.1@abc-test --create --default
# status=0
# match=/Using .*ruby-2.4.1 with gemset abc-test/
rvm current
# match=/ruby-2.4.1@abc-test/

rvm list
# match=/^=\* ruby-2.4.1/
src/rvm/rvm-test/fast/gem-bundle_comment_test.sh000077500000001151147511530530016020 0ustar00source "$rvm_path/scripts/rvm"

: setup/pretest
export BUNDLE_GEMFILE=${TMPDIR:-/tmp}/Gemfile
touch ${BUNDLE_GEMFILE}
rvm alias delete default
rvm use 2.3.4 --install
rvm @global do gem uninstall bundler
rvm gemset create gemtest
rvm gemset use gemtest # status=0

: test
## this only happens after installing rvm: match=/Gem bundler is not installed/
bundle config             # status=127
gem install bundler --pre # status=0
bundle config             # status=0 ; match=/Settings are listed in order of priority/

: reset
rvm gemset use default
rvm --force gemset delete gemtest # status=0
rm -f ${BUNDLE_GEMFILE}
src/rvm/rvm-test/fast/ruby-version_comment_test.sh000066400000003057147511530530016451 0ustar00source "$rvm_path/scripts/rvm"

: prepare
true TMPDIR:${TMPDIR:=/tmp}:
d=$TMPDIR/test-ruby-version
f=$d/.ruby-version
g=$d/.ruby-gemset
e=$d/.ruby-env
mkdir -p $d
cd $d
rvm use --install 2.4.1
rvm use --install 2.4.0
rvm use --install 2.3.4

## simple
: short version
echo "2.4.0" > $f           # env[GEM_HOME]=/2.3.4/
rvm use .                   # env[GEM_HOME]=/2.4.0/

: ruby version
rvm use 2.3.4
echo "ruby-2.4.0" > $f      # env[GEM_HOME]=/2.3.4/
rvm use .                   # env[GEM_HOME]=/2.4.0/

: patch version
rvm use 2.3.4
echo "2.4.1" > $f      # env[GEM_HOME]=/2.3.4/
rvm use .                   # env[GEM_HOME]=/2.4.1/

: full version
rvm use 2.3.4
echo "ruby-2.4.1" > $f # env[GEM_HOME]=/2.3.4/
rvm use .                   # env[GEM_HOME]=/2.4.1/

: gemset
rvm use 2.3.4
echo "veve" > $g            # env[GEM_HOME]=/2.3.4/
rvm use .                   # env[GEM_HOME]=/2.4.1@veve/
rm -f $g

: environment
rvm use 2.3.4
echo "test_me=3" > $e
rvm use .                   # env[GEM_HOME]=/2.4.1/; env[test_me]=/^3$/
rvm use 2.3.4               # env[GEM_HOME]=/2.3.4/; env[test_me]=/^$/

: environment spaces
rvm use 2.3.4
echo 'test_space=test me' > $e
rvm use .                   # env[GEM_HOME]=/2.4.1/; env[test_space]=/^test me$/
rvm use 2.3.4               # env[GEM_HOME]=/2.3.4/; env[test_space]=/^$/

: environment quotes and spaces
rvm use 2.3.4
echo 'test_space="test me"' > $e
rvm use .                   # env[GEM_HOME]=/2.4.1/; env[test_space]=/^test me$/
rvm use 2.3.4               # env[GEM_HOME]=/2.3.4/; env[test_space]=/^$/

: clean
cd ..
rm -rf $d
src/rvm/rvm-test/fast/gemsets_comment_test.sh000066400000010163147511530530015450 0ustar00source "$rvm_path/scripts/rvm"

rvm use 2.4.0 --install

: create/use/rename/delete
rvm gemset create test_gemset            # status=0 ; match=/gemset created/
rvm gemset use test_gemset               # status=0 ; match=/Using /
rvm current                              # match=/test_gemset/
rvm gemset list                          # match=/test_gemset/; match!=/other_gems/
rvm gemset rename test_gemset other_gems # status=0
rvm current                              # match=/other_gems/
rvm gemset list                          # match!=/test_gemset/; match=/other_gems/
rvm --force gemset delete other_gems     # status=0
rvm gemset list                          # match!=/test_gemset/
rvm gemset create test_gemset            # status=0 ; match=/gemset created/
rvm gemset use test_gemset               # status=0 ; match=/Using /
rvm current                              # match=/test_gemset/
rvm --force gemset delete test_gemset    # status=0
rvm current                              # match=/^ruby-2.4.0$/
rvm gemset list                          # match!=/test_gemset/

: rvm ... do
rvm 2.4.0 do rvm gemset create test_gemset            # status=0 ; match=/gemset created/
rvm 2.4.0 do rvm gemset list                          # match=/test_gemset/; match!=/other_gems/
rvm 2.4.0 do rvm --force gemset delete test_gemset    # status=0

: rvm ... do new rvm_gemsets_path
rvm use 2.4.0
true TMPDIR:${TMPDIR:=/tmp}:
d=$TMPDIR/test-rvm_gemsets_path
mkdir -p $d
echo rvm_gems_path=$d  >> ~/.rvmrc
echo rvm_create_flag=1 >> ~/.rvmrc
rvm gemset create test_gemset            # status=0 ; match=/gemset created/; match=/test-rvm_gemsets_path/
rvm gemset list                          # match=/test_gemset/; match!=/other_gems/; match=/test-rvm_gemsets_path/
rvm --force gemset delete test_gemset    # status=0
rvm 2.4.0 do rvm gemset create test_gemset            # status=0 ; match=/gemset created/; match=/test-rvm_gemsets_path/
rvm 2.4.0 do rvm gemset list                          # match=/test_gemset/; match!=/other_gems/; match=/test-rvm_gemsets_path/
rvm 2.4.0 do rvm --force gemset delete test_gemset    # status=0
\sed -e "\%rvm_gems_path=$d% d" -e "\%rvm_create_flag=1% d" < ~/.rvmrc > ~/.rvmrc.new && \mv -f ~/.rvmrc.new ~/.rvmrc
rm -rf $d

: export/import/use/empty
rvm use 2.4.0
rvm gemset create test_gemset
rvm gemset use test_gemset               # status=0 ; match=/Using /
rvm gemdir                               # match=/@test_gemset$/
gem install haml
rvm gemset export haml.gems              # status=0; match=/Exporting /
[[ -f haml.gems ]]                       # status=0
rvm --force gemset empty                 # status=0
gem list                                 # match!=/haml/
rvm gemset import haml.gems              # status=0; match=/Installing /
rm haml.gems
gem list                                 # match=/haml/
rvm gemset use default                   # status=0 ; match=/Using /
rvm --force --debug gemset empty test_gemset # status=0 ; match=/GEM_HOME=.*ruby-2.4.0@test_gemset/
rvm gemset use test_gemset               # status=0 ; match=/Using /
gem list                                 # match!=/haml/
echo yes | rvm gemset delete test_gemset # status=0
rvm gemset list                          # match!=/test_gemset/

: use/create
ls $rvm_path/wrappers/*test_gemset*      # status!=0
ls $rvm_path/gems/*test_gemset*          # status!=0
rvm gemset list                          # match!=/test_gemset/
rvm --force gemset delete test_gemset    # status=0
rvm gemset use test_gemset --create      # status=0 ; match=/Using /
ls $rvm_path/wrappers/*test_gemset*      # status=0
ls $rvm_path/gems/*test_gemset*          # status=0
rvm gemset list                          # match=/test_gemset/
rvm --force gemset delete test_gemset    # status=0

: cleanup
rm -rf $rvm_path/log/*
ls $rvm_path/*/*test_gemset*             # status!=0
rvm gemset list                          # match!=/test_gemset/

: use
rvm --force gemset delete unknown_gemset # status=0
rvm gemset use unknown_gemset            # status!=0; match=/does not exist/
rvm current                              # match!=/unknown_gemset/

: default
rvm gemset list                          # match=/default/
src/rvm/rvm-test/fast/rvm-prompt_comment_test.sh000066400000001032147511530530016117 0ustar00source "$rvm_path/scripts/rvm"

command rvm install 2.4.1
command rvm install 2.4.0
command rvm install 2.3.4

rvm 1.9.1 do rvm-prompt      # match=/Ruby (ruby-)?1.9.1(-p[[:digit:]]+)? is not installed./
rvm 2.4.0 do rvm-prompt      # match=/^ruby-2.4.0$/
rvm 2.3.4 do rvm-prompt i    # match=/^ruby$/
rvm 2.3.4 do rvm-prompt i v  # match=/^ruby-2.3.4$/
rvm 2.3.4 do rvm-prompt v    # match=/^2.3.4$/
rvm system do rvm-prompt     # match=/^$/
rvm system do rvm-prompt s v # match=/^system$/
rvm 2.4.1 do rvm-prompt s v  # match=/^2.4.1$/
src/rvm/rvm-test/fast/gemfile_comment_test.sh000077500000002243147511530530015414 0ustar00source "$rvm_path/scripts/rvm"

: settings
true TMPDIR:${TMPDIR:=/tmp}:
d=$TMPDIR/test-rvmrc
f_rvmrc=$d/.rvmrc
f_gemfile=$d/sub/Gemfile

: prepare1
rvm use 2.3.4 --install
rvm gemset create gemfile
rvm gemset create rvmrc
mkdir -p $d/sub
printf "rvm use 2.3.4@rvmrc\n"   > $f_rvmrc

: test1
rvm current           # match=/^ruby-2.3.4$/
rvm_current_rvmrc=""
rvm rvmrc load $d/sub # status=0; match=/Using .*ruby-2.3.4.*rvmrc/
rvm current           # match=/^ruby-2.3.4@rvmrc$/

: prepare2
rvm use 2.3.4
printf "source :rubygems\n\ngem 'haml'\n" > $f_gemfile

: test2
rvm current           # match=/^ruby-2.3.4$/
rvm_current_rvmrc=""
rvm rvmrc load $d/sub # status=0; match=/Using .*ruby-2.3.4.*rvmrc/
rvm current           # match=/^ruby-2.3.4@rvmrc$/

: prepare3
rvm use 2.3.4
## escape # -> \x23
printf "source :rubygems\n\x23ruby=2.3.4\n\x23ruby-gemset=gemfile\ngem 'haml'\n" > $f_gemfile

: test3
rvm current           # match=/^ruby-2.3.4$/
rvm_current_rvmrc=""
rvm rvmrc load $d/sub # status=0; match!=/Using .*ruby-2.3.4.*rvmrc/
rvm current           # match=/^ruby-2.3.4@gemfile$/

: clean
rvm use 2.3.4
rvm --force gemset delete gemfile
rvm --force gemset delete rvmrc
rm -rf $d
src/rvm/rvm-test/fast/rvmrc_comment_test.sh000066400000004154147511530530015135 0ustar00source "$rvm_path/scripts/rvm"
rvm_scripts_path="$rvm_path/scripts" rvm_project_rvmrc=cd source "$rvm_path/scripts/cd"

: prepare
true TMPDIR:${TMPDIR:=/tmp}:
d=$TMPDIR/test-rvmrc
f=$d/.rvmrc
mkdir -p $d
echo "echo loading-rvmrc" > $f
rvm use 2.4.0 --install # status=0
rvm use 2.4.1 --install # status=0

## simple
: trust
rvm rvmrc trust $d     # match=/ as trusted$/
rvm rvmrc trusted $d   # match=/is currently trusted/

: untrust
rvm rvmrc untrust $d   # match=/ as untrusted$/
rvm rvmrc trusted $d   # match=/is currently untrusted/

: reset
rvm rvmrc reset $d     # match=/^Reset/
rvm rvmrc trusted $d   # match=/contains unreviewed changes/

## spaces
ds="$d/with spaces"
mkdir -p "$ds"
echo "echo loading-rvmrc" > "$ds/.rvmrc"
rvm rvmrc trust "$ds"     # match=/ as trusted$/
rvm rvmrc trusted "$ds"   # match=/is currently trusted/
rvm rvmrc reset "$ds"     # match=/^Reset/

## brackets
ds="$d/with(brackets)"
mkdir -p "$ds"
echo "echo loading-rvmrc" > "$ds/.rvmrc"
rvm rvmrc trust "$ds"     # match=/ as trusted$/
rvm rvmrc trusted "$ds"   # match=/is currently trusted/
rvm rvmrc reset "$ds"     # match=/^Reset/

: prepare for load/cd test
rvm alias create default 2.4.1
rvm alias list            # match=/default => ruby-2.4.1/
export rvm_project_rvmrc_default=1

## load default
builtin cd
rvm use 2.4.0
rvm rvmrc load            # env[GEM_HOME]!=/^$/

## load ruby
cd
rvm use 2.4.0
echo "rvm use 2.4.1" > "$d/.rvmrc"
rvm rvmrc trust "$d"      # match=/ as trusted$/
cd "$d"                   # env[GEM_HOME]=/2.4.1$/

## load ruby@gemset
cd
rvm use 2.4.0
echo "rvm use 2.4.1@vee --create" > "$d/.rvmrc"
rvm rvmrc trust "$d"      # match=/ as trusted$/
cd "$d"                   # env[GEM_HOME]=/2.4.1@vee$/

## load @gemset
cd
rvm use 2.4.0
echo "rvm use @vee --create" > "$d/.rvmrc"
rvm rvmrc trust "$d"      # match=/ as trusted$/
cd "$d"                   # env[GEM_HOME]=/2.4.0@vee$/

## load @gemset after system
cd
rvm use system
echo "rvm use @vee --create" > "$d/.rvmrc"
rvm rvmrc trust "$d"      # match=/ as trusted$/
cd "$d"                   # env[GEM_HOME]=/2.4.1@vee$/

: clean
rvm alias delete default  # status=0
rm -rf $d
src/rvm/rvm-test/fast/rvm-shell_comment_test.sh000066400000002706147511530530015716 0ustar00source "$rvm_path/scripts/rvm"

: prepare
d=${TMPDIR:=/tmp}/test-rvm-shell/ # status=0
mkdir -p $d                       # status=0
echo "rvm current" > $d/rvm-shell-rvm-current-script.sh # status=0
chmod +x $d/rvm-shell-rvm-current-script.sh
rvm use 2.3.4 --install
rvm use system

: Test1
echo "rvm use 2.3.4@acme --create" > $d/.rvmrc     # status=0
ls -ld $d/.rvmrc
rvm rvmrc trust $d/.rvmrc                               # status=0
rvm $d do rvm current                                   # match=/ruby-2.3.4@acme/
rvm-shell --path $d -c "rvm current"                    # match=/ruby-2.3.4@acme/
rvm $d do $d/rvm-shell-rvm-current-script.sh            # match=/ruby-2.3.4@acme/
rvm-shell --path $d $d/rvm-shell-rvm-current-script.sh  # match=/ruby-2.3.4@acme/
rvm use $d                                              # env[GEM_HOME]=/ruby-2.3.4@acme$/
rvm use system

: Test2
echo "rvm 2.3.4@acme --create" > $d/.rvmrc         # status=0
ls -ld $d/.rvmrc
rvm rvmrc trust $d/.rvmrc                               # status=0
rvm $d do rvm current                                   # match=/ruby-2.3.4@acme/
rvm-shell --path $d -c "rvm current"                    # match=/ruby-2.3.4@acme/
rvm $d do $d/rvm-shell-rvm-current-script.sh            # match=/ruby-2.3.4@acme/
rvm-shell --path $d $d/rvm-shell-rvm-current-script.sh  # match=/ruby-2.3.4@acme/
rvm $d                                                  # env[GEM_HOME]=/ruby-2.3.4@acme$/

: Cleaning
rm -rf $d # status=0
src/rvm/rvm-test/Gemfile000066400000000050147511530530011214 0ustar00source 'https://rubygems.org'

gem 'tf'
src/rvm/rvm-test/README.md000066400000001203147511530530011201 0ustar00# RVM - Tests

Set of tests for [RVM](https://github.com/wayneeseguin/rvm/).

## Usage

    $ gem install tf    # Install testing framework
    $ tf fast/*         # Run the short tests (those are run on travis)
    $ tf long/*         # Run the long set of tests, like installing rubies.
    $ tf --text long/*  # Same as above, but watch output

## Comment tests

Filenames have to end with `_comment_test.sh`

Example test file:

    ## User comments start with double #
    ## command can be writen in one line with multiple tests:
    true # status=0; match=/^$/
    ## or tests can be placed in following lines:
    false
    # status=1
src/rvm/.travis.yml000066400000004606147511530530010264 0ustar00language: c
os: [osx, linux]
osx_image: xcode9.3
sudo: true
addons:
  apt:
    packages:
      - gawk
      - libgmp-dev
before_install:
  - rm ~/.rvm/hooks/after_use
  - "sed -i'' -e '/rvm_project_rvmrc/d ; /rvm_silence_path_mismatch_check_flag/d' ~/.rvmrc || true"
  - "echo rvm_show_log_lines_on_error=all >> ~/.rvmrc"
  - "head -n 100 /etc/rvmrc ~/.rvmrc || true"
  - rvm list
  - "rvm use ruby-2.4 --fuzzy || rvm use ruby-2.3 --fuzzy"
  - "[[ -n \"${LANG:-}\" ]] || export LANG=en_US.UTF-8"
  - "env | grep '^rvm' || true"
install:
  - gem install tf -v '>=0.4.1'
before_script:
  - "echo ruby_1.8.7_rubygems_version=1.8.25 > $rvm_path/user/db"
  - "if [[ -f ~/.rvmrc ]] ; then sed -i'' -r -e '/rvm_silence_path_mismatch_check_flag|rvm_project_rvmrc/ d' ~/.rvmrc ; fi"
  - unset rvm_silence_path_mismatch_check_flag rvm_project_rvmrc
  - rvm alias delete default
  - hash -r
  - ./install
  - git submodule init
  - git submodule update
  - rvm reload
  - if [[ "$TRAVIS_OS_NAME" == "osx" ]]; then rvm autolibs read-only; fi
script:
  - tf --text $TEST
env:
  - TEST=rvm-test/fast/* rvm-test-rvm1/*
  - TEST=rvm-test/long/named_ruby_and_gemsets_comment_test.sh
  - TEST=rvm-test/long/truffleruby_comment_test.sh
matrix:
  include:
    - os: linux
      env: TEST="rvm-installer GPG signature"
      addons:
        apt:
          packages:
            - dirmngr
            - gnupg2
      script:
        - gpg2 --keyserver hkp://pool.sks-keyservers.net --recv-keys 409B6B1796C275462A1703113804BB82D39DC0E3 7D2BAF1CF37B13E2069D6956105BD0E739499BDB
        - gpg2 --verify binscripts/rvm-installer.asc binscripts/rvm-installer
    - language: ruby
      os: linux
      env: TEST="Test TruffleRuby in TravisCI"
      rvm: truffleruby
      before_install: true
      install: true
      before_script: true
      script:
        - ruby -v
        - rake --version
        - ruby -S bundle --version
        - ruby -ropen-uri -e 'puts open("https://rubygems.org/") { |f| f.read(1024) }'
  allow_failures:
    - os: osx
      env: TEST=rvm-test/fast/* rvm-test-rvm1/*
notifications:
  email:
    recipients:
      - mpapis@gmail.com
    on_failure: change
  slack:
    rooms:
      secure: KUEuifsnQ76ZZRj/5V2uFEtv0u3irvAdOSEHps/0MSLo2mkJAeja8L4salKKEIsvh3Ftl4t6Bs2z6sut2L5Bu0JlU1UBXtNe0QuYpBs5UL7kv7lxIbnGlQDvAmDjmItVMDg0cSSNfegl6t0xQknO4V7PUu7xNkfQkh+FklvFBBI=
    on_success: change
    on_failure: always
    on_pull_requests: true
src/rvm/VERSION000066400000000010147511530530007204 0ustar001.29.12
src/rvm/man/man1/rvm.1000066400000020005147511530530010437 0ustar00'\" t
.\"     Title: rvm
.\"    Author: [FIXME: author] [see http://docbook.sf.net/el/author]
.\" Generator: DocBook XSL Stylesheets v1.75.2 <http://docbook.sf.net/>
.\"      Date: 07/16/2010
.\"    Manual: [FIXME: manual]
.\"    Source: [FIXME: source]
.\"  Language: English
.\"
.TH "RVM" "1" "07/16/2010" "[FIXME: source]" "[FIXME: manual]"
.\" -----------------------------------------------------------------
.\" * set default formatting
.\" -----------------------------------------------------------------
.\" disable hyphenation
.nh
.\" disable justification (adjust text to left margin only)
.ad l
.\" -----------------------------------------------------------------
.\" * MAIN CONTENT STARTS HERE *
.\" -----------------------------------------------------------------
.SH "NAME"
rvm \- The Ruby Version Manager
.SH "SYNOPSIS"
.sp
\fBrvm\fR [\fIFLAGS\fR] [\fIOPTIONS\fR] \fIACTION\fR [\fIIMPLEMENTATION\fR[,\fIIMPLEMENTATION\fR[,\fI\&...\fR]]
.SH "DESCRIPTION"
.sp
RVM is a command line tool which allows us to easily install, manage and work with multiple ruby environments from interpreters to sets of gems\&.
.SH "FLAGS"
.PP
\fB\-\-head\fR
.RS 4
with update, updates rvm to git head version\&.
.RE
.PP
\fB\-\-rubygems\fR
.RS 4
with update, updates rubygems for selected ruby
.RE
.PP
\fB\-\-default\fR
.RS 4
with ruby select, sets a default ruby for new shells\&.
.RE
.PP
\fB\-\-debug\fR
.RS 4
Toggle debug mode on for very verbose output\&.
.RE
.PP
\fB\-\-trace\fR
.RS 4
Toggle trace mode on to see EVERYTHING rvm is doing\&.
.RE
.PP
\fB\-\-force\fR
.RS 4
Force install, removes old install & source before install\&.
.RE
.PP
\fB\-\-summary\fR
.RS 4
Used with rubydo to print out a summary of the commands run\&.
.RE
.PP
\fB\-\-latest\fR
.RS 4
with gemset \-\-dump skips version strings for latest gem\&.
.RE
.PP
\fB\-\-gems\fR
.RS 4
with uninstall/remove removes gems with the interpreter\&.
.RE
.PP
\fB\-\-docs\fR
.RS 4
with install, attempt to generate ri after installation\&.
.RE
.PP
\fB\-\-reconfigure\fR
.RS 4
Force \&./configure on install even if Makefile already exists\&.
.RE
.SH "OPTIONS"
.PP
\fB\-v, \-\-version\fR
.RS 4
Emit rvm version loaded for current shell\&.
.RE
.PP
\fB\-l, \-\-level\fR
.RS 4
patch level to use with rvm use / install
.RE
.PP
\fB\-\-bin\fR
.RS 4
path for binaries to be placed (\fI~/\&.rvm/bin/\fR)
.RE
.PP
\fB\-\-source\fR
.RS 4
src directory to use (\fI~/\&.rvm/src/\fR)
.RE
.PP
\fB\-\-archives\fR
.RS 4
directory for downloaded files (\fI~/\&.rvm/archives/\fR)
.RE
.PP
\fB\-S\fR
.RS 4
Specify a script file to attempt to load and run (rubydo)\&.
.RE
.PP
\fB\-e\fR
.RS 4
Execute code from the command line\&.
.RE
.PP
\fB\-G\fR
.RS 4
root gem path to use
.RE
.PP
\fB\-\-gems\fR
.RS 4
Used to set the
\fIgems_flag\fR, use with
\fIremove\fR
to remove gems\&.
.RE
.PP
\fB\-\-archive\fR
.RS 4
Used to set the
\fIarchive_flag\fR, use with
\fIremove\fR
to remove archive\&.
.RE
.PP
\fB\-\-patch\fR, \fB\-\-patches\fR
.RS 4
With any ruby build from source, allows you to specify patch paths and patch names to be applied prior to building\&. Values should be a relative / absolute path to a patch or the name of known patch / patchset\&. Optionally, paths or names may be followed by
\fI%someinteger\fR
\- e\&.g\&.
\fI\-\-patches mypatch%2\fR
\- where the number following the % specifies the value of the \-p argument to patch, defaulting to two\&.
.RE
.PP
\fB\-C, \-\-configure\fR
.RS 4
custom configure options\&. If you need to pass several configure options then append them comma separated:
\fI\-C \-\-\&...,\-\-\&...,\-\-\&...\fR\&.
.RE
.PP
\fB\-\-nice\fR
.RS 4
process niceness (for slow computers, default 0)
.RE
.PP
\fB\-\-ree\-options\fR
.RS 4
Options passed directly to ree\(cqs
\fI\&./installer\fR
on the command line\&.
.RE
.SH "ACTIONS"
.PP
\fBversion\fR
.RS 4
Show the rvm version installed in rvm_path\&.
.RE
.PP
\fBuse\fR
.RS 4
Setup current shell to use a specific ruby version\&.
.RE
.PP
\fBreload\fR
.RS 4
Reload rvm source itself (useful after changing rvm source)\&.
.RE
.PP
\fBdo\fR
.RS 4
Executes the command against either all or a listed subset of rubies. eg. rvm do gem --version ; rvm 1.8.7,1.9.2 do rake --version
.RE
.PP
\fBenv\fR
.RS 4
Displays information about an environment specified but the given ruby string\&. Useful for getting a sourceable path or an evaluatable set of shell variable declarations\&.
.RE
.PP
\fBimplode\fR
.RS 4
(seppuku) removes the rvm installation completely\&. This means everything in $rvm_path (\fI~/\&.rvm\fR)\&. This does not touch your profiles. However, this means that you must manually clean up your profiles and remove the lines which source RVM.
\fIscripts/rvm\fR\&.
.RE
.PP
\fBupdate\fR
.RS 4
Upgrades rvm to the latest version\&. (If you experience bugs try this first with \-\-head)\&.
.RE
.PP
\fBget\fR
.RS 4
RVM get will 'get' the version you specify. This must be one of latest or head\&. With no arguments the rvm get help section will be shown.\&.
.RE
.PP
\fBreset\fR
.RS 4
Remove current and stored default & system settings\&. (If you experience odd behavior try this second)\&.
.RE
.PP
\fBinfo\fR
.RS 4
Show the
\fBcurrent\fR
environment information for current ruby\&.
.RE
.PP
\fBdebug\fR
.RS 4
Show info plus additional information for common issues\&.
.RE
.PP
\fBinstall\fR
.RS 4
Install one or many ruby versions\&.
https://rvm\&.io/rubies/installing/
.RE
.PP
\fBuninstall\fR
.RS 4
Uninstall one or many ruby versions, leaves their sources\&.
.RE
.PP
\fBremove\fR
.RS 4
Uninstall one or many ruby versions and remove their sources\&.
.RE
.PP
\fBdelete\fR
.RS 4
Same as remove\&.
.RE
.PP
\fBwrapper\fR
.RS 4
Generates a set of wrapper executables for a given ruby with the specified ruby and gemset combination\&. Used under the hood for passenger support and the like\&.
.RE
.PP
\fBruby\fR
.RS 4
Runs a named ruby file against specified and/or all rubies\&.
.RE
.PP
\fBgem\fR
.RS 4
Runs a gem command using selected ruby\(cqs
\fIgem\fR\&.
.RE
.PP
\fBrake\fR
.RS 4
Runs a rake task against specified and/or all rubies\&.
.RE
.PP
\fBtests\fR
.RS 4
Runs
\fIrake test\fR
across selected ruby versions\&.
.RE
.PP
\fBspecs\fR
.RS 4
Runs
\fIrake spec\fR
across selected ruby versions\&.
.RE
.PP
\fBmonitor\fR
.RS 4
Monitor cwd for testing, run
\fIrake {spec,test}\fR
on changes\&.
.RE
.PP
\fBgemset\fR
.RS 4
gemsets:
https://rvm\&.io/gemsets/
.RE
.PP
\fBgemdir\fR
.RS 4
Display the path to the current gem directory (\fI$GEM_HOME\fR)\&.
.RE
.PP
\fBsrcdir\fR
.RS 4
Display the path to rvm source directory (may be yanked)\&.
.RE
.PP
\fBfetch\fR
.RS 4
Performs an archive / src fetch only of the selected ruby\&.
.RE
.PP
\fBlist\fR
.RS 4
Show currently installed rubies, interactive output\&.
https://rvm\&.io/rubies/list/
.RE
.PP
\fBpackage\fR
.RS 4
Install a dependency package {readline,iconv,zlib,openssl}\&.
https://rvm\&.io/packages/
.RE
.PP
\fBrequirements\fR
.RS 4
Show additional OS specific dependencies/requirements for building various rubies.
.RE
.PP
\fBnotes\fR
.RS 4
Display notes. Operating system specifics are now under 'requirements'\&.
.RE
.SH "IMPLEMENTATION"
.PP
\fBruby\fR
.RS 4
MRI/YARV Ruby (The Gold Standard) {1\&.8\&.x, 1\&.9\&.x, 2\&.0\&.x, 2\&.1\&.x, 2\&.2\&.x}
.RE
.PP
\fBjruby\fR
.RS 4
JRuby, Ruby interpreter on the Java Virtual Machine\&.
.RE
.PP
\fBrbx\fR
.RS 4
Rubinius
.RE
.PP
\fBtruffleruby\fR
.RS 4
TruffleRuby, a high performance implementation of Ruby built on GraalVM\&.
.RE
.PP
\fBree\fR
.RS 4
Ruby Enterprise Edition, MRI Ruby with several custom patches for performance, stability, and memory\&.
.RE
.PP
\fBmacruby\fR
.RS 4
MacRuby, insanely fast, can make real apps (Mac OS X Only)\&.
.RE
.PP
\fBmaglev\fR
.RS 4
GemStone Ruby, awesome persistent ruby object store\&.
.RE
.PP
\fBironruby\fR
.RS 4
IronRuby, NOT supported yet\&. Looking for volunteers to help\&.
.RE
.PP
\fBsystem\fR
.RS 4
Use the system ruby (eg\&. pre\-rvm state)\&.
.RE
.PP
\fBdefault\fR
.RS 4
Use the default ruby (or the system ruby if a default hasn\(cqt been set)\&.
https://rvm\&.io/rubies/default/
.RE
.SH "RESOURCES"
.sp
Main web site
.sp
Online issue\-tracker
.SH "COPYING"
.sp
Copyright (c) 2009 Wayne E\&. Seguin
.sp
See LICENSE file for details\&.
src/rvm/man/man1/rvm.1.gz000066400000005771147511530530011073 0ustar00��M&[rvm.1�Ymo�F��_�0��.d��p�먎��6$�mŊ\J�I.�KJ���~��.�D���5@q����<3�|�p(��!��?wq��sa�i5tQ+m�Ň�'?M��B��G�*%VE���F�Z?m4�T1R���b�+�)#y���0Q�4+��6Qv�Ta�l��_���?����O���;�zt��ѫӳ���Tf�L1S~�X�����ym�ٿ~+�e)�x=ΖIlW4|0�{#g��Cqx��͖x؁i��}���(_	�
�H�I!"mRYq���c+	��W*�E���a��T�"��ߊ#Ҁ(���"QQ�Ûe�	�%�メE�az1��7�w��;1�����ś�l,�����������"@<�����r���X:7��b�����dk��!������M�{q5��G~�����\�g<^\�c5u2�};��P~����ч/��!�|t"��/gFwR�cEl��NጰA�)XH'b�����I�7V��̦�����3[`|@��	Z���Ql�b%R�]��iBe���,U72:��B��(�ˠ�BZGb�Ry����x{K�z8y8Y)�$��\��w*��=�[�!\ƅ��b���q�D�~�O�0���

��.���<ր[7p�ud�;���F�ؒ��4T�r٠�����Q��P!zG��?m1VyY�A+�T�Gk4�����ݛ��>j��Pl���1*�k�R'a5(��L(
���{�m	�4����j݆���
\�
��O��{5Yr�$d�]�������2ͅ}�s[���v[:�p�i��}����Vj小�� �<B������*͙a�.�b�X�P�,&�}!��E�4=cb��~I>RR�"�ܣ�b��LQ�ۢ�g�h�i��^X�U�֛�S09]��D�f'��1�0�S$1�\I���Dƃ���<[�è:ϮJq�AY��&V�]%���#��G��#La�qϝ��Lk$Lh�ζ����{��	V1\��jpH�Po�Jm0��V��@��y��8�RT&�[��!e��h��8r1yܳK���'�E&��A+N9��V_5���o����ہDŽ��I��s�H��A����#-�
�uZ�k������{U���؇�=ж����2ۺIJ(c.��9ݠ��[]��޸.8H����3��.�<�q6�,����q/�3�J�؏f�,�1k�+��:!kW���`vچ��1���W#�?�H�79�D����1Y�Tni�Hӹ �2���T���"�*#}r⢂�Q�H����+?o�R�7��L`L�����3}<���U�*��,���Dȃ*�3r�F�L{�(k�(�a��.��$b;f�\.-l�32�/ 32��}�;u����;�\�$\2���d{3�ۄ�(�B��8��	Z�=Q���k�����N�s֨7�tL�1]„I��_�+vG�ɝ�y�\(%���II�L4_Ap�hg�j�g����;�A��PTQ���Uq��|*pa��bED�v�;�g�Rq�*3G����'�`�N�\���K͡�1���L.%�W(� )�à��T
�rA|� ����P�!�j��*��������׃��h�1Šph�%C�Ј�:�H�[�����K���b�!
:(���
P��*q��(~�9=�s.��d
Vw��WtP�S�˂��Y�	רx4TAB�䃳}�8�$��$G��|,��گr�vy���L�$��
�w�$B�b|[�H`x���u�;%�zY��G���J�+XÀ�5C��	����(V�`vI�cw7� �[tF]��]���P�Y�:z�D����;r�w\�l�/
����clWn71"�<��\�$˨�(Q�TMщ��`W{U��+��c+`���Q��a��'��*��Ŝ
���nW!"��L�ɡ18�GB�6#t�XH��l���ԩ�"���!v��&k�M�i��3
�!��\sv�g���¯ώ��B/��؎�v�N�KE�N��i9
�n������*�ekQ��v�e
;��ːwo;��t�h�G�_c=r�V%(s��ݬ�ͻj��H�'��`ٕ�)�0�ND>�1T��_�RLWD��](5ٹ�W�Y��[��q���0uM��\*�Y�\���5w��3n�+y���kG+��U1�P%��+C���G}�jD�H�D�ڣ�����J&HSZ���]P]����r"�9��>���."��3d`4��-1;.�£��ãw�-�15�S7 ��33		%�g�w���ЫϾt��e�}:D��y?h����jT��‚}��Q���<E�okJ�_\��?����}��h����*�Z������Q�X7R����R�W
#�&�J�|�^�%]?��R	�÷����[	�[)pg�\0>G���|.�G�T}&�Q�L����Y�W�F�Zb#��J��@c������]s�K	%s��9j+��̛*����^�~|�˵�.mU���D��n�+�a�g�c�B|v�;Ü���{b|��e�m�^��'��l2z1�w�#�������4�������@��o��W��y���O��g�����k�vl]b
߇� �R�Ǧ@A)��ۻ�1��6!iĥ퐟)��]g�;7�v�b/W"wQ"�ġ*���Ƭ�#)H�+#er?���oc�؝)F�6v�3гC�4X��w�n8�5
P��E��ɋ��"]��LA�]���)3�"���D��"h���vc.��O↾�����Z�3:/����(�D!�-�y�^z�	d����:_W�	F��]��A'[w��V�G��v�������$��U��U�c7B,ܑ���p�c���ݯ4R�̑��j��Q���Jڌ�>U����e����Q������r�?NQ��Z�G`5��5��l�X}E���}?��r+/u�5p�B������G���1)c��e��ĹR���r|=�ʈ/�U!c���?��^��src/rvm/.editorconfig000066400000000331147511530530010617 0ustar00[*]
charset=utf-8
end_of_line=lf
trim_trailing_whitespace=true
insert_final_newline=true
indent_style=space
indent_size=2

[*.java]
indent_style=space
indent_size=4

[{*.yaml,*.yml}]
indent_style=space
indent_size=2

src/rvm/config/solaris/noask000066400000000247147511530530012127 0ustar00mail=
instance=overwrite
partial=nocheck
runlevel=nocheck
idepend=nocheck
rdepend=nocheck
space=nocheck
setuid=nocheck
conflict=nocheck
action=nocheck
basedir=default
src/rvm/config/known000066400000002062147511530530010471 0ustar00# MRI Rubies
[ruby-]1.8.6[-p420]
[ruby-]1.8.7[-head] # security released on head
[ruby-]1.9.1[-p431]
[ruby-]1.9.2[-p330]
[ruby-]1.9.3[-p551]
[ruby-]2.0.0[-p648]
[ruby-]2.1[.10]
[ruby-]2.2[.10]
[ruby-]2.3[.8]
[ruby-]2.4[.10]
[ruby-]2.5[.8]
[ruby-]2.6[.6]
[ruby-]2.7[.2]
[ruby-]3[.0.0]
ruby-head

# for forks use: rvm install ruby-head-<name> --url https://github.com/github/ruby.git --branch 2.2

# JRuby
jruby-1.6[.8]
jruby-1.7[.27]
jruby-9.1[.17.0]
jruby[-9.2.14.0]
jruby-head

# Rubinius
rbx-1[.4.3]
rbx-2.3[.0]
rbx-2.4[.1]
rbx-2[.5.8]
rbx-3[.107]
rbx-4[.20]
rbx-5[.0]
rbx-head

# TruffleRuby
truffleruby[-20.3.0]

# Opal
opal

# Minimalistic ruby implementation - ISO 30170:2012
mruby-1.0.0
mruby-1.1.0
mruby-1.2.0
mruby-1.3.0
mruby-1[.4.1]
mruby-2.0.1
mruby-2[.1.1]
mruby[-head]

# Ruby Enterprise Edition
ree-1.8.6
ree[-1.8.7][-2012.02]

# Topaz
topaz

# MagLev
maglev-1.0.0
maglev-1.1[RC1]
maglev[-1.2Alpha4]
maglev-head

# Mac OS X Snow Leopard Or Newer
macruby-0.10
macruby-0.11
macruby[-0.12]
macruby-nightly
macruby-head

# IronRuby
ironruby[-1.1.3]
ironruby-head
src/rvm/config/md5000066400000521456147511530530010037 0ustar00apache-maven-3.5.0-bin.tar.gz=35c39251d2af99b6624d40d801f6ff02
curl-7_19_7.tar.gz=ecb2e37e45c9933e2a963cabe03670ab
GemStone-27184.Darwin-i386.tar.gz=292b3b169656a8451cfa19c228828e5a
GemStone-27184.Linux-x86_64.tar.gz=cfabd4dd73d2656fc10243e35dd7452b
GemStone-27184.SunOS-i86pc.tar.gz=5755a0689488748dfeab3bc74572aaa8
GemStone-29516.Darwin-i386.tar.gz=9ced19859ea165fc1277332d32d8d219
GemStone-29516.Linux-x86_64.tar.gz=516b8bdd27cb5f22bb9a942e954743d5
GemStone-29639.Darwin-i386.tar.gz=6568a00e19604a0a2653b14c9c99a73c
GemStone-29639.Linux-x86_64.tar.gz=dff9cfbda7169dae9d8b9cd2893cdb2e
GemStone-29699.Darwin-i386.tar.gz=f682383ed3013c886404856ea3b81384
GemStone-29699.Linux-x86_64.tar.gz=f827100b4c0ddba855d2352f5813489e
GemStone-30086.Darwin-i386.tar.gz=dd1421fa1fd9e05b79b997d005f5e002
GemStone-30086.Linux-x86_64.tar.gz=f46a1201d23679fcfa5c63753673255d
GemStone-30246.Darwin-i386.tar.gz=133ea0934d41eab2537f0c43ab490f18
GemStone-30246.Linux-x86_64.tar.gz=d64a6ff61ae77346f1c3f8fa41f34bce
GemStone-30441.Darwin-i386.tar.gz=c97fae686a5d054e11a4e5586ffeb4c5
GemStone-30441.Linux-x86_64.tar.gz=a950086650a7a2303e711f60c9ff7312
GemStone-30866.Darwin-i386.tar.gz=0fb1375643069ddce7322224345fbeb5
GemStone-30866.Linux-x86_64.tar.gz=622a1a6ef5da10b1feecbde74731af33
GemStone-34619.Darwin-i386.tar.gz=19531b50f2d5d06d559843a9cf6ac565
GemStone-34619.Linux-x86_64.tar.gz=b67e767bd7fa12481343c03f1e253d6d
GemStone-36816.Darwin-i386.tar.gz=3ee9ff6bafcfc3141cb54268b7c4fc08
GemStone-36816.Linux-x86_64.tar.gz=e5797c0e0d49ef0f8046c85814548cfc
GemStone-36916.Darwin-i386.tar.gz=2ce86efa0bd4fc6df3aec0cba5fe42d8
GemStone-36916.Linux-x86_64.tar.gz=3165ae521d8594a58cfd1c3b2774a116
GemStone-36962.Darwin-i386.tar.gz=a5466307771632b6f596eb2433397995
GemStone-36962.Linux-x86_64.tar.gz=9d274b9c6aa98e12e01d317c7e12cf80
http://downloads.sourceforge.net/fink/fink-0.34.8.tar.gz=780cf6099b04df7c0461a3ca6f0dae5a
https://bitbucket.org/mpapis/libyaml/get/0.1.4.3.tar.gz=022516bf5d40b8a1ebd8b12035cfc994
https://dl.fedoraproject.org/pub/epel/5/i386/epel-release-5-4.noarch.rpm=3b3280f24c2afacf75e70f2284569161
https://dl.fedoraproject.org/pub/epel/6/i386/epel-release-6-8.noarch.rpm=2cd0ae668a585a14e07c2ea4f264d79b
https://dl.fedoraproject.org/pub/epel/RPM-GPG-KEY-EPEL-5=0466c259781def56dafe0a2cdc9de0c5
https://dl.fedoraproject.org/pub/epel/RPM-GPG-KEY-EPEL-6=d865e6b948a74cb03bc3401c0b01b785
https://rvm_io.global.ssl.fastly.net/binaries/amazon/2/x86_64/ruby-2.4.0.tar.bz2=4cfce86d6ee34b8faffaaef178addc7d
https://rvm_io.global.ssl.fastly.net/binaries/amazon/2/x86_64/ruby-2.4.1.tar.bz2=2419039e0358dc10c70ed14f26c2c100
https://rvm_io.global.ssl.fastly.net/binaries/amazon/2/x86_64/ruby-2.4.2.tar.bz2=3e6acde262f2cc7b9b9d5874c8b8a735
https://rvm_io.global.ssl.fastly.net/binaries/amazon/2/x86_64/ruby-2.4.3.tar.bz2=7cc6866010f3a3d655c828b815a06414
https://rvm_io.global.ssl.fastly.net/binaries/amazon/2/x86_64/ruby-2.4.4.tar.bz2=b0322504ee7c0557a4b3734a9b287b27
https://rvm_io.global.ssl.fastly.net/binaries/amazon/2/x86_64/ruby-2.4.5.tar.bz2=e7ed3c6e45fa7ea4b850c639ef99666b
https://rvm_io.global.ssl.fastly.net/binaries/amazon/2/x86_64/ruby-2.4.6.tar.bz2=179142e43af2146d2c306324a3b4793f
https://rvm_io.global.ssl.fastly.net/binaries/amazon/2/x86_64/ruby-2.4.7.tar.bz2=3dfbafb9fdf1e0e00f14ca9cd98ebae6
https://rvm_io.global.ssl.fastly.net/binaries/amazon/2/x86_64/ruby-2.4.8.tar.bz2=c46e9e1485f05cd579ed8aaeaad407d0
https://rvm_io.global.ssl.fastly.net/binaries/amazon/2/x86_64/ruby-2.4.9.tar.bz2=c6ece39a0a4e181958108b2919424c4c
https://rvm_io.global.ssl.fastly.net/binaries/amazon/2/x86_64/ruby-2.4.10.tar.bz2=7df4afbcc1814fba83cd5126a53e26ca
https://rvm_io.global.ssl.fastly.net/binaries/amazon/2/x86_64/ruby-2.5.0.tar.bz2=8270fdec8b48ff4b2d7fe10192a167a7
https://rvm_io.global.ssl.fastly.net/binaries/amazon/2/x86_64/ruby-2.5.1.tar.bz2=d7ec905ed3f95104f24c33db79734f0c
https://rvm_io.global.ssl.fastly.net/binaries/amazon/2/x86_64/ruby-2.5.2.tar.bz2=80a1a14b85bca5034ee40037b4ef515f
https://rvm_io.global.ssl.fastly.net/binaries/amazon/2/x86_64/ruby-2.5.3.tar.bz2=aeedcca992e0874d44698e8eaaf01d00
https://rvm_io.global.ssl.fastly.net/binaries/amazon/2/x86_64/ruby-2.5.4.tar.bz2=751ad38c451758b8f59cc7bf7ed5c1c3
https://rvm_io.global.ssl.fastly.net/binaries/amazon/2/x86_64/ruby-2.5.5.tar.bz2=4a5ab3420fe7883d02c9c883f944fa09
https://rvm_io.global.ssl.fastly.net/binaries/amazon/2/x86_64/ruby-2.5.6.tar.bz2=8729176d6737a8a2c544362577f23047
https://rvm_io.global.ssl.fastly.net/binaries/amazon/2/x86_64/ruby-2.5.7.tar.bz2=e5592f0a10207436d255bb39f6fac090
https://rvm_io.global.ssl.fastly.net/binaries/amazon/2/x86_64/ruby-2.5.8.tar.bz2=7e2199c4b9720e58bfaf01f21ce5fd61
https://rvm_io.global.ssl.fastly.net/binaries/amazon/2/x86_64/ruby-2.6.0.tar.bz2=420468ba11db6e0396f8db44ac3b0774
https://rvm_io.global.ssl.fastly.net/binaries/amazon/2/x86_64/ruby-2.6.1.tar.bz2=e82b80ed0e1c6e4c229f90c749a9bbdb
https://rvm_io.global.ssl.fastly.net/binaries/amazon/2/x86_64/ruby-2.6.2.tar.bz2=2604323d82fa29639fcce66a5492ee93
https://rvm_io.global.ssl.fastly.net/binaries/amazon/2/x86_64/ruby-2.6.3.tar.bz2=639ff73bdd7a3fdd9eda0ea8634c67c2
https://rvm_io.global.ssl.fastly.net/binaries/amazon/2/x86_64/ruby-2.6.4.tar.bz2=5ea78640e1aeaacbefb95a4099a96267
https://rvm_io.global.ssl.fastly.net/binaries/amazon/2/x86_64/ruby-2.6.5.tar.bz2=2b2e44fb3d4dc82664d221ed27653ebb
https://rvm_io.global.ssl.fastly.net/binaries/amazon/2/x86_64/ruby-2.6.6.tar.bz2=cfedd64441560cccf85a09eaa2d9b959
https://rvm_io.global.ssl.fastly.net/binaries/amazon/2/x86_64/ruby-2.7.0.tar.bz2=d3c56ac789644b86c90f6a05391a53d6
https://rvm_io.global.ssl.fastly.net/binaries/amazon/2/x86_64/ruby-2.7.1.tar.bz2=1801df87bbf59615878c7462ff8b1bed
https://rvm_io.global.ssl.fastly.net/binaries/amazon/2/x86_64/ruby-2.7.2.tar.bz2=0db424c01ac7b124c5f50aac4b1fb0a1
https://rvm_io.global.ssl.fastly.net/binaries/amazon/2/x86_64/ruby-3.0.0-preview1.tar.bz2=8f1f825a5c1f05100f054d2bc60ac5bf
https://rvm_io.global.ssl.fastly.net/binaries/amazon/2013.03/x86_64/ruby-1.9.3-p448.tar.bz2=fa4a24991caa2a8e0ee1c221d4430345
https://rvm_io.global.ssl.fastly.net/binaries/amazon/2013.03/x86_64/ruby-2.0.0-p247.tar.bz2=bb907c7719fb96aae77b8f540a64c1b9
https://rvm_io.global.ssl.fastly.net/binaries/amazon/2018.03/x86_64/ruby-2.4.0.tar.bz2=2ea89978566ab92fa05e0c53e26f7abb
https://rvm_io.global.ssl.fastly.net/binaries/amazon/2018.03/x86_64/ruby-2.4.1.tar.bz2=4c9d97f76727a41a1905d18f3146d404
https://rvm_io.global.ssl.fastly.net/binaries/amazon/2018.03/x86_64/ruby-2.4.2.tar.bz2=ca060310022740e484956bca48aa6bfc
https://rvm_io.global.ssl.fastly.net/binaries/amazon/2018.03/x86_64/ruby-2.4.3.tar.bz2=e787eca4995c04d93c5a11222d5fa34d
https://rvm_io.global.ssl.fastly.net/binaries/amazon/2018.03/x86_64/ruby-2.4.4.tar.bz2=9ca0136556b5208a5ed8fd635925a817
https://rvm_io.global.ssl.fastly.net/binaries/amazon/2018.03/x86_64/ruby-2.4.5.tar.bz2=e7ef0efcf5387f75ec38f40b796a1901
https://rvm_io.global.ssl.fastly.net/binaries/amazon/2018.03/x86_64/ruby-2.4.6.tar.bz2=15471c9f0a8c2eeaec378a59d750bd25
https://rvm_io.global.ssl.fastly.net/binaries/amazon/2018.03/x86_64/ruby-2.4.7.tar.bz2=00a3542583f329f12ac69aa708fb856f
https://rvm_io.global.ssl.fastly.net/binaries/amazon/2018.03/x86_64/ruby-2.4.8.tar.bz2=d3ef7447735273b20562d12e1d4b1742
https://rvm_io.global.ssl.fastly.net/binaries/amazon/2018.03/x86_64/ruby-2.4.9.tar.bz2=ce4afc6e2ba0b8cf75f5b390e0e52fff
https://rvm_io.global.ssl.fastly.net/binaries/amazon/2018.03/x86_64/ruby-2.4.10.tar.bz2=48aee12752ee05637ee5e3880e5a9047
https://rvm_io.global.ssl.fastly.net/binaries/amazon/2018.03/x86_64/ruby-2.5.0.tar.bz2=99b32364d92b808d5ae793dc361bae7b
https://rvm_io.global.ssl.fastly.net/binaries/amazon/2018.03/x86_64/ruby-2.5.1.tar.bz2=83812a64168454da3caf43c0d188dd05
https://rvm_io.global.ssl.fastly.net/binaries/amazon/2018.03/x86_64/ruby-2.5.2.tar.bz2=a748d0760b2c06e8e31030e47e64fa8c
https://rvm_io.global.ssl.fastly.net/binaries/amazon/2018.03/x86_64/ruby-2.5.3.tar.bz2=aa48c81ef23670a70b93aa1715092647
https://rvm_io.global.ssl.fastly.net/binaries/amazon/2018.03/x86_64/ruby-2.5.4.tar.bz2=205a51c9c30e3fcf9eb64a2b82ae4191
https://rvm_io.global.ssl.fastly.net/binaries/amazon/2018.03/x86_64/ruby-2.5.5.tar.bz2=b41b0cae3c5f1452ba0c6aabe3bf6606
https://rvm_io.global.ssl.fastly.net/binaries/amazon/2018.03/x86_64/ruby-2.5.6.tar.bz2=910299b1cd5245e9be4ac328c445c888
https://rvm_io.global.ssl.fastly.net/binaries/amazon/2018.03/x86_64/ruby-2.5.7.tar.bz2=e13a54d9f47d64fa8c64a0f69347a9f4
https://rvm_io.global.ssl.fastly.net/binaries/amazon/2018.03/x86_64/ruby-2.5.8.tar.bz2=bd6034745b9e22f6f0bdf93aa9a67d02
https://rvm_io.global.ssl.fastly.net/binaries/amazon/2018.03/x86_64/ruby-2.6.0.tar.bz2=7d769e1b361a533ebec9e768bc6ac800
https://rvm_io.global.ssl.fastly.net/binaries/amazon/2018.03/x86_64/ruby-2.6.1.tar.bz2=11796ee377a03dd7326da84d9b4f11be
https://rvm_io.global.ssl.fastly.net/binaries/amazon/2018.03/x86_64/ruby-2.6.2.tar.bz2=c0bd4baf1800153a9e66474fc708a942
https://rvm_io.global.ssl.fastly.net/binaries/amazon/2018.03/x86_64/ruby-2.6.3.tar.bz2=433807558c7b4dc0070b86ad6034cdcb
https://rvm_io.global.ssl.fastly.net/binaries/amazon/2018.03/x86_64/ruby-2.6.4.tar.bz2=fae89188211bf58d9c60a9ff17dcb37a
https://rvm_io.global.ssl.fastly.net/binaries/amazon/2018.03/x86_64/ruby-2.6.5.tar.bz2=ac93c37df48cbc34dce363251ef9def3
https://rvm_io.global.ssl.fastly.net/binaries/amazon/2018.03/x86_64/ruby-2.6.6.tar.bz2=d0ed8d03f5b1f651b6bfd3cebe26c912
https://rvm_io.global.ssl.fastly.net/binaries/amazon/2018.03/x86_64/ruby-2.7.0.tar.bz2=c388a64e20b73ef05866a2b66ceeaf78
https://rvm_io.global.ssl.fastly.net/binaries/amazon/2018.03/x86_64/ruby-2.7.1.tar.bz2=80c8b14ea582515ea4b1e518040ecc94
https://rvm_io.global.ssl.fastly.net/binaries/amazon/2018.03/x86_64/ruby-2.7.2.tar.bz2=d1c7e0cae96cb5857f90cf2b6dec78b6
https://rvm_io.global.ssl.fastly.net/binaries/amazon/2018.03/x86_64/ruby-3.0.0-preview1.tar.bz2=d2218ea099475456c12252f4f9cabd2b
https://rvm_io.global.ssl.fastly.net/binaries/arch/libc-2.15/x86_64/ruby-1.9.3-p194.tar.bz2=384ea18aef77b95e49df6f3944fc3e11
https://rvm_io.global.ssl.fastly.net/binaries/arch/libc-2.15/x86_64/ruby-1.9.3-p286.tar.bz2=e7ee7c1a6dc913f6e7fad3ba03e459da
https://rvm_io.global.ssl.fastly.net/binaries/arch/libc-2.15/x86_64/ruby-1.9.3-p327.tar.bz2=7ac51e55e5d83365cbe5855aeef2d0eb
https://rvm_io.global.ssl.fastly.net/binaries/arch/libc-2.15/x86_64/ruby-1.9.3-p374.tar.bz2=78e6e2563956a450199a5221a84a7e9c
https://rvm_io.global.ssl.fastly.net/binaries/arch/libc-2.15/x86_64/ruby-1.9.3-p392.tar.bz2=504e703ab755c22232382f58e0226ba2
https://rvm_io.global.ssl.fastly.net/binaries/arch/libc-2.15/x86_64/ruby-2.0.0-p0.tar.bz2=0b43d9516e7f0021cbaa3f093707e348
https://rvm_io.global.ssl.fastly.net/binaries/centos/5/x86_64/ruby-1.9.3-p286.tar.bz2=f53728e7ef82a7c2c6dfdb21202f2376
https://rvm_io.global.ssl.fastly.net/binaries/centos/5/x86_64/ruby-1.9.3-p327.tar.bz2=b3151790549e71091793b03d4c7914b3
https://rvm_io.global.ssl.fastly.net/binaries/centos/5/x86_64/ruby-1.9.3-p362.tar.bz2=de7ea0c9966b415a165b6e9b4ae2c97c
https://rvm_io.global.ssl.fastly.net/binaries/centos/5/x86_64/ruby-1.9.3-p374.tar.bz2=75357314100fc4a777c64c5606a3e867
https://rvm_io.global.ssl.fastly.net/binaries/centos/5/x86_64/ruby-1.9.3-p392.tar.bz2=d0fbe4cf69cbe52a4e82e458fd6f06aa
https://rvm_io.global.ssl.fastly.net/binaries/centos/5/x86_64/ruby-1.9.3-p429.tar.bz2=85919f00c561c46f1ded9deb59847421
https://rvm_io.global.ssl.fastly.net/binaries/centos/5/x86_64/ruby-1.9.3-p448.tar.bz2=8bebaa3b919474a61efe3e8cdb2fd84c
https://rvm_io.global.ssl.fastly.net/binaries/centos/5/x86_64/ruby-1.9.3-p484.tar.bz2=f28d8413f9db17f8d6dddd91ba80d17a
https://rvm_io.global.ssl.fastly.net/binaries/centos/5/x86_64/ruby-1.9.3-p545.tar.bz2=61a2cdb5ebd8c8ccc5aae3ebed219591
https://rvm_io.global.ssl.fastly.net/binaries/centos/5/x86_64/ruby-1.9.3-p547.tar.bz2=7f5587224441cbcbf30434ee88f4705b
https://rvm_io.global.ssl.fastly.net/binaries/centos/5/x86_64/ruby-1.9.3-p551.tar.bz2=7129464679a86ff2c68281f5d471fd44
https://rvm_io.global.ssl.fastly.net/binaries/centos/5/x86_64/ruby-2.0.0-p0.tar.bz2=b6b1bf6f8b54d8f9eec7cb6a36771f0e
https://rvm_io.global.ssl.fastly.net/binaries/centos/5/x86_64/ruby-2.0.0-p195.tar.bz2=2310177bc3cd69a2bf193a052561ccf3
https://rvm_io.global.ssl.fastly.net/binaries/centos/5/x86_64/ruby-2.0.0-p247.tar.bz2=0ea8658f766262ddc6c2492de4e3fccf
https://rvm_io.global.ssl.fastly.net/binaries/centos/5/x86_64/ruby-2.0.0-p353.tar.bz2=6456f508884c4f746e127acfc51c60bf
https://rvm_io.global.ssl.fastly.net/binaries/centos/5/x86_64/ruby-2.0.0-p451.tar.bz2=21d4121aa0245fa874de64a0bbd58ab5
https://rvm_io.global.ssl.fastly.net/binaries/centos/5/x86_64/ruby-2.0.0-p481.tar.bz2=a80a7914e0915bb0c9d477fd2921b24d
https://rvm_io.global.ssl.fastly.net/binaries/centos/5/x86_64/ruby-2.0.0-p576.tar.bz2=e24303f92beb6adc48ff605b32f3bd8e
https://rvm_io.global.ssl.fastly.net/binaries/centos/5/x86_64/ruby-2.0.0-p598.tar.bz2=a36767d1f8356c6b53cabbd2bbe3490a
https://rvm_io.global.ssl.fastly.net/binaries/centos/5/x86_64/ruby-2.1.0.tar.bz2=905877bba0068e5c112e06248d9ccbde
https://rvm_io.global.ssl.fastly.net/binaries/centos/5/x86_64/ruby-2.1.1.tar.bz2=07935b66d25f4ab1ccad0321b8aa318a
https://rvm_io.global.ssl.fastly.net/binaries/centos/5/x86_64/ruby-2.1.2.tar.bz2=3e85c96ff2d6409e590f7bc7fb97cda0
https://rvm_io.global.ssl.fastly.net/binaries/centos/5/x86_64/ruby-2.1.3.tar.bz2=08222821dd86df2be39ddad4ed5df16b
https://rvm_io.global.ssl.fastly.net/binaries/centos/5/x86_64/ruby-2.1.5.tar.bz2=8809b74c122906ba795d67d96c87ab16
https://rvm_io.global.ssl.fastly.net/binaries/centos/5/x86_64/ruby-2.2.0.tar.bz2=5ef0309cabba7786a884d1ca45b02e13
https://rvm_io.global.ssl.fastly.net/binaries/centos/5/x86_64/ruby-2.2.1.tar.bz2=1747205375568f8f0c1ef8b8c5b022f2
https://rvm_io.global.ssl.fastly.net/binaries/centos/6/x86_64/ruby-1.9.3-p194.tar.bz2=0065d82b7454db5954f3f725c8c2e7fc
https://rvm_io.global.ssl.fastly.net/binaries/centos/6/x86_64/ruby-1.9.3-p286.tar.bz2=b1a2e3c7ee37897ae49652572d63d674
https://rvm_io.global.ssl.fastly.net/binaries/centos/6/x86_64/ruby-1.9.3-p327.tar.bz2=fd226cba32fea404aa4bb0cb0f815cb6
https://rvm_io.global.ssl.fastly.net/binaries/centos/6/x86_64/ruby-1.9.3-p362.tar.bz2=6fe76491223f7a592e7b87f6845e1684
https://rvm_io.global.ssl.fastly.net/binaries/centos/6/x86_64/ruby-1.9.3-p392.tar.bz2=f7d8e1807902f9525ad2d7ec3db97dbb
https://rvm_io.global.ssl.fastly.net/binaries/centos/6/x86_64/ruby-1.9.3-p429.tar.bz2=818c683fa81a80d69500cbb49ab84877
https://rvm_io.global.ssl.fastly.net/binaries/centos/6/x86_64/ruby-1.9.3-p448.tar.bz2=fa4a24991caa2a8e0ee1c221d4430345
https://rvm_io.global.ssl.fastly.net/binaries/centos/6/x86_64/ruby-1.9.3-p484.tar.bz2=bf97437afe0598d3732dbb90153a39e1
https://rvm_io.global.ssl.fastly.net/binaries/centos/6/x86_64/ruby-1.9.3-p547.tar.bz2=6dbce14074df14936386da94608b49cf
https://rvm_io.global.ssl.fastly.net/binaries/centos/6/x86_64/ruby-1.9.3-p551.tar.bz2=41e24831c16e5dca4bbea5e7f3f7744c
https://rvm_io.global.ssl.fastly.net/binaries/centos/6/x86_64/ruby-2.0.0-p0.tar.bz2=308c9088d6ead744cd957c60f0dd0d93
https://rvm_io.global.ssl.fastly.net/binaries/centos/6/x86_64/ruby-2.0.0-p195.tar.bz2=dcb4fd272f080e4da432682ac54c3016
https://rvm_io.global.ssl.fastly.net/binaries/centos/6/x86_64/ruby-2.0.0-p247.tar.bz2=bb907c7719fb96aae77b8f540a64c1b9
https://rvm_io.global.ssl.fastly.net/binaries/centos/6/x86_64/ruby-2.0.0-p353.tar.bz2=b3c249f415851ce37cdbf43ea88750d0
https://rvm_io.global.ssl.fastly.net/binaries/centos/6/x86_64/ruby-2.0.0-p481.tar.bz2=b5349c7195e5f0b48d316fdcda39d2c8
https://rvm_io.global.ssl.fastly.net/binaries/centos/6/x86_64/ruby-2.0.0-p576.tar.bz2=594472df09ae698a40928301fdc9fa3e
https://rvm_io.global.ssl.fastly.net/binaries/centos/6/x86_64/ruby-2.0.0-p598.tar.bz2=b66a335f07a56e9d3a1c22eb269dfafa
https://rvm_io.global.ssl.fastly.net/binaries/centos/6/x86_64/ruby-2.1.0.tar.bz2=b7f4dac1461116730a2366f03b0efe36
https://rvm_io.global.ssl.fastly.net/binaries/centos/6/x86_64/ruby-2.1.2.tar.bz2=55b27f9eb936c32fd11ed487882131b5
https://rvm_io.global.ssl.fastly.net/binaries/centos/6/x86_64/ruby-2.1.3.tar.bz2=6aaac784961ce980fa319525a2399244
https://rvm_io.global.ssl.fastly.net/binaries/centos/6/x86_64/ruby-2.1.5.tar.bz2=accd60a83aa2b116fab0dc8585cee0b0
https://rvm_io.global.ssl.fastly.net/binaries/centos/6/x86_64/ruby-2.2.0.tar.bz2=2bc0a309957c8ef0b29769d273dcb533
https://rvm_io.global.ssl.fastly.net/binaries/centos/6/x86_64/ruby-2.2.1.tar.bz2=412a1bc74570e02a21c045910930497a
https://rvm_io.global.ssl.fastly.net/binaries/centos/6/x86_64/ruby-2.3.1.tar.bz2=477310d14a5d624a70d9571ce3bcaf59
https://rvm_io.global.ssl.fastly.net/binaries/centos/6/x86_64/ruby-2.4.0.tar.bz2=c6434221a72bb308e903ab5135057d86
https://rvm_io.global.ssl.fastly.net/binaries/centos/6/x86_64/ruby-2.4.1.tar.bz2=6c8ce1558521ba320678642deaadd198
https://rvm_io.global.ssl.fastly.net/binaries/centos/6/x86_64/ruby-2.4.2.tar.bz2=95663883e7b3f60ac660548c223462bc
https://rvm_io.global.ssl.fastly.net/binaries/centos/6/x86_64/ruby-2.4.3.tar.bz2=61b4e0029bde62fb026bfa64ff181330
https://rvm_io.global.ssl.fastly.net/binaries/centos/6/x86_64/ruby-2.4.4.tar.bz2=5e555a947a59ed91761cad50b481e8ba
https://rvm_io.global.ssl.fastly.net/binaries/centos/6/x86_64/ruby-2.4.5.tar.bz2=c603fa0b6afe89b77ad5f344f2186cb8
https://rvm_io.global.ssl.fastly.net/binaries/centos/6/x86_64/ruby-2.4.6.tar.bz2=d300e50f444cc8650a59850f1f46ddd3
https://rvm_io.global.ssl.fastly.net/binaries/centos/6/x86_64/ruby-2.4.7.tar.bz2=6aab9cde2648a0bfb55fdf854e85991c
https://rvm_io.global.ssl.fastly.net/binaries/centos/6/x86_64/ruby-2.4.8.tar.bz2=ece00e010f9a731cd4d563755e424ef4
https://rvm_io.global.ssl.fastly.net/binaries/centos/6/x86_64/ruby-2.4.9.tar.bz2=d5addeb54bb6a41ffb5f7d232c542410
https://rvm_io.global.ssl.fastly.net/binaries/centos/6/x86_64/ruby-2.4.10.tar.bz2=f6464a6b8274478aff1a4a6b6c6ed5f9
https://rvm_io.global.ssl.fastly.net/binaries/centos/6/x86_64/ruby-2.5.0.tar.bz2=b24afd02a9ffb7e5aa2a371c9df0f937
https://rvm_io.global.ssl.fastly.net/binaries/centos/6/x86_64/ruby-2.5.1.tar.bz2=1ccf0a1100b311c7dae54fc938054f74
https://rvm_io.global.ssl.fastly.net/binaries/centos/6/x86_64/ruby-2.5.2.tar.bz2=4af8ff88c5461d20ee2cac40c40e3125
https://rvm_io.global.ssl.fastly.net/binaries/centos/6/x86_64/ruby-2.5.3.tar.bz2=dbe8d98c19f02de668cf4faf000ce881
https://rvm_io.global.ssl.fastly.net/binaries/centos/6/x86_64/ruby-2.5.4.tar.bz2=e7d61644a67c8426a134daa0dea4db4d
https://rvm_io.global.ssl.fastly.net/binaries/centos/6/x86_64/ruby-2.5.5.tar.bz2=451f1b010a89fa4226b16ad8bf536ed0
https://rvm_io.global.ssl.fastly.net/binaries/centos/6/x86_64/ruby-2.5.6.tar.bz2=acb8a1b6199bbd63ec4ae0fddf56b77b
https://rvm_io.global.ssl.fastly.net/binaries/centos/6/x86_64/ruby-2.5.7.tar.bz2=e7c791ccbd56e08f7bb4a9058b0d7242
https://rvm_io.global.ssl.fastly.net/binaries/centos/6/x86_64/ruby-2.5.8.tar.bz2=d0c2d13e7d4945897c16064ef883cd18
https://rvm_io.global.ssl.fastly.net/binaries/centos/6/x86_64/ruby-2.6.0.tar.bz2=437e2bde0fa66705871c414fbef883e6
https://rvm_io.global.ssl.fastly.net/binaries/centos/6/x86_64/ruby-2.6.1.tar.bz2=b76d09dba15af404881b1d15bce4e8be
https://rvm_io.global.ssl.fastly.net/binaries/centos/6/x86_64/ruby-2.6.2.tar.bz2=387d1569208bdb4bea1564da974e616d
https://rvm_io.global.ssl.fastly.net/binaries/centos/6/x86_64/ruby-2.6.3.tar.bz2=b4e73791ea1c9d6ca3407740a2712c9f
https://rvm_io.global.ssl.fastly.net/binaries/centos/6/x86_64/ruby-2.6.4.tar.bz2=9fc035ebcee4a6b4032c87dadc10cbca
https://rvm_io.global.ssl.fastly.net/binaries/centos/6/x86_64/ruby-2.6.5.tar.bz2=cd4785ad4fd7920692ad93b98de20a71
https://rvm_io.global.ssl.fastly.net/binaries/centos/6/x86_64/ruby-2.6.6.tar.bz2=df3a62cc09b9be8410cabcf24a34e71b
https://rvm_io.global.ssl.fastly.net/binaries/centos/6/x86_64/ruby-2.7.0.tar.bz2=57652298608551ab9ee5b6dcb46ca65a
https://rvm_io.global.ssl.fastly.net/binaries/centos/6/x86_64/ruby-2.7.1.tar.bz2=06beae98d67b20202351ac02324ca6d9
https://rvm_io.global.ssl.fastly.net/binaries/centos/6/x86_64/ruby-2.7.2.tar.bz2=813896b63509355f3691827276f16822
https://rvm_io.global.ssl.fastly.net/binaries/centos/7/x86_64/ruby-2.4.0.tar.bz2=d0758dfc415f00ed9d03f8c0a3a8f034
https://rvm_io.global.ssl.fastly.net/binaries/centos/7/x86_64/ruby-2.4.1.tar.bz2=2314a6ef42ddbed234e754d456479b90
https://rvm_io.global.ssl.fastly.net/binaries/centos/7/x86_64/ruby-2.4.2.tar.bz2=fe832d44821625255603b3a1feb9d217
https://rvm_io.global.ssl.fastly.net/binaries/centos/7/x86_64/ruby-2.4.3.tar.bz2=600ace79b20621c505e6edb8ada2dd6e
https://rvm_io.global.ssl.fastly.net/binaries/centos/7/x86_64/ruby-2.4.4.tar.bz2=cd1d9edf13c3f3a1cb7b9fb821f9fbaa
https://rvm_io.global.ssl.fastly.net/binaries/centos/7/x86_64/ruby-2.4.5.tar.bz2=8f6bd79338bf7d187478e86a79a4fd35
https://rvm_io.global.ssl.fastly.net/binaries/centos/7/x86_64/ruby-2.4.6.tar.bz2=0594f0de7eff7d7d285541f933862cbb
https://rvm_io.global.ssl.fastly.net/binaries/centos/7/x86_64/ruby-2.4.7.tar.bz2=ed45410fb3faef2e4631bba9f6844a27
https://rvm_io.global.ssl.fastly.net/binaries/centos/7/x86_64/ruby-2.4.8.tar.bz2=c47adfa8e2e227f707812cd3dcd89fba
https://rvm_io.global.ssl.fastly.net/binaries/centos/7/x86_64/ruby-2.4.9.tar.bz2=826543ed67e6a21ce76e72653baebdca
https://rvm_io.global.ssl.fastly.net/binaries/centos/7/x86_64/ruby-2.4.10.tar.bz2=993b2ff1b2043bab1b09af207f3c077a
https://rvm_io.global.ssl.fastly.net/binaries/centos/7/x86_64/ruby-2.5.0.tar.bz2=e4008aa1347cd7be0904c8130c57096f
https://rvm_io.global.ssl.fastly.net/binaries/centos/7/x86_64/ruby-2.5.1.tar.bz2=4e0b49616e7fdc49143096075a401767
https://rvm_io.global.ssl.fastly.net/binaries/centos/7/x86_64/ruby-2.5.2.tar.bz2=f05841a855b2b2518f50b49df15e03b2
https://rvm_io.global.ssl.fastly.net/binaries/centos/7/x86_64/ruby-2.5.3.tar.bz2=97fdd56eb20b33b388de2c4d18990a5d
https://rvm_io.global.ssl.fastly.net/binaries/centos/7/x86_64/ruby-2.5.4.tar.bz2=a0fd674ee72cb26c7ab13aa87b1dad26
https://rvm_io.global.ssl.fastly.net/binaries/centos/7/x86_64/ruby-2.5.5.tar.bz2=6934cdb879dec0c6985bace4825c2936
https://rvm_io.global.ssl.fastly.net/binaries/centos/7/x86_64/ruby-2.5.6.tar.bz2=ecefdd30613a77951b694d61e3000e27
https://rvm_io.global.ssl.fastly.net/binaries/centos/7/x86_64/ruby-2.5.7.tar.bz2=7a69a2411b3d9fbbc02e5d814527e838
https://rvm_io.global.ssl.fastly.net/binaries/centos/7/x86_64/ruby-2.5.8.tar.bz2=0facb21719aef3ffbdae741e270d608b
https://rvm_io.global.ssl.fastly.net/binaries/centos/7/x86_64/ruby-2.6.0.tar.bz2=dd77de80b7d923e434032b6bf483bc5b
https://rvm_io.global.ssl.fastly.net/binaries/centos/7/x86_64/ruby-2.6.1.tar.bz2=76ffc89431b29cf8c240653a851fb4a4
https://rvm_io.global.ssl.fastly.net/binaries/centos/7/x86_64/ruby-2.6.2.tar.bz2=0338f06d734ea325482792a8a40ecb97
https://rvm_io.global.ssl.fastly.net/binaries/centos/7/x86_64/ruby-2.6.3.tar.bz2=60c02f3d518826c77e8a69c971c085d2
https://rvm_io.global.ssl.fastly.net/binaries/centos/7/x86_64/ruby-2.6.4.tar.bz2=39e774baa4338ccea016cdbfc0eb2d33
https://rvm_io.global.ssl.fastly.net/binaries/centos/7/x86_64/ruby-2.6.5.tar.bz2=e8b7b94c8adfbebab96a64b281b90c7c
https://rvm_io.global.ssl.fastly.net/binaries/centos/7/x86_64/ruby-2.6.6.tar.bz2=f2066744834ea77335bf52ffdcbb7174
https://rvm_io.global.ssl.fastly.net/binaries/centos/7/x86_64/ruby-2.7.0.tar.bz2=ab0ac481cc438e4bc3dd127baadb90fc
https://rvm_io.global.ssl.fastly.net/binaries/centos/7/x86_64/ruby-2.7.1.tar.bz2=af38afb8573af59144ca70df2a3bf0b2
https://rvm_io.global.ssl.fastly.net/binaries/centos/7/x86_64/ruby-2.7.2.tar.bz2=e57be086b20e8246fed27b5efe1d9304
https://rvm_io.global.ssl.fastly.net/binaries/centos/7/x86_64/ruby-3.0.0-preview1.tar.bz2=b0546d3b6c222f6c97545e079c9234e4
https://rvm_io.global.ssl.fastly.net/binaries/centos/8/x86_64/ruby-2.4.0.tar.bz2=9633d1229122c7f484f73033f6223f75
https://rvm_io.global.ssl.fastly.net/binaries/centos/8/x86_64/ruby-2.4.1.tar.bz2=2daa47a66fe068be061274fbea0d135d
https://rvm_io.global.ssl.fastly.net/binaries/centos/8/x86_64/ruby-2.4.2.tar.bz2=497d259504176b4278dd6f5b76eb184a
https://rvm_io.global.ssl.fastly.net/binaries/centos/8/x86_64/ruby-2.4.3.tar.bz2=193b0db714c66bb2042cb4f6a1162f67
https://rvm_io.global.ssl.fastly.net/binaries/centos/8/x86_64/ruby-2.4.4.tar.bz2=a14e69b4c7e651af4071d26ba00321ce
https://rvm_io.global.ssl.fastly.net/binaries/centos/8/x86_64/ruby-2.4.5.tar.bz2=334d8988e2f1e3b0b5e1b3278cfb76cc
https://rvm_io.global.ssl.fastly.net/binaries/centos/8/x86_64/ruby-2.4.6.tar.bz2=4c920526d3d6ad47550a808be7188a69
https://rvm_io.global.ssl.fastly.net/binaries/centos/8/x86_64/ruby-2.4.7.tar.bz2=8875abcf3217df0f8a5995a44b3f9137
https://rvm_io.global.ssl.fastly.net/binaries/centos/8/x86_64/ruby-2.4.8.tar.bz2=fb656e41911f0cd61262414b3a0a8342
https://rvm_io.global.ssl.fastly.net/binaries/centos/8/x86_64/ruby-2.4.9.tar.bz2=b6dcdd4939acf39645effc3dd6e7e60d
https://rvm_io.global.ssl.fastly.net/binaries/centos/8/x86_64/ruby-2.4.10.tar.bz2=a83b937873093e1de444a7a84876b98e
https://rvm_io.global.ssl.fastly.net/binaries/centos/8/x86_64/ruby-2.5.0.tar.bz2=c5576117a4220589cccc64b98a11f918
https://rvm_io.global.ssl.fastly.net/binaries/centos/8/x86_64/ruby-2.5.1.tar.bz2=e032423e6617f29a2ce0a242147bccf9
https://rvm_io.global.ssl.fastly.net/binaries/centos/8/x86_64/ruby-2.5.2.tar.bz2=84e62879bc39db390a462d6b26be3342
https://rvm_io.global.ssl.fastly.net/binaries/centos/8/x86_64/ruby-2.5.3.tar.bz2=d1db0f1d5a73b4711a0e97929840e36a
https://rvm_io.global.ssl.fastly.net/binaries/centos/8/x86_64/ruby-2.5.4.tar.bz2=e79c988dec12d1a6e96b66f98587da3c
https://rvm_io.global.ssl.fastly.net/binaries/centos/8/x86_64/ruby-2.5.5.tar.bz2=ab8fde821eeef3a5907f96e66ecb397b
https://rvm_io.global.ssl.fastly.net/binaries/centos/8/x86_64/ruby-2.5.6.tar.bz2=37f78443cdb27bf68c83c601265e10c3
https://rvm_io.global.ssl.fastly.net/binaries/centos/8/x86_64/ruby-2.5.7.tar.bz2=12cc0235c29c8dcdc937978013be0fc1
https://rvm_io.global.ssl.fastly.net/binaries/centos/8/x86_64/ruby-2.5.8.tar.bz2=9d426b003835271afbc36aa6119a4303
https://rvm_io.global.ssl.fastly.net/binaries/centos/8/x86_64/ruby-2.6.0.tar.bz2=dccc19e3701748f1ddaab56f905b2f87
https://rvm_io.global.ssl.fastly.net/binaries/centos/8/x86_64/ruby-2.6.1.tar.bz2=7737f5f1da8df5f2e2c4c77ea8f10eb5
https://rvm_io.global.ssl.fastly.net/binaries/centos/8/x86_64/ruby-2.6.2.tar.bz2=267ba117102f8277fc248bb9d4f3fb4a
https://rvm_io.global.ssl.fastly.net/binaries/centos/8/x86_64/ruby-2.6.3.tar.bz2=44bb0b16fdc1f874e18a80856e610891
https://rvm_io.global.ssl.fastly.net/binaries/centos/8/x86_64/ruby-2.6.4.tar.bz2=96bcb0de1781cc26a3499c0f3e3021c9
https://rvm_io.global.ssl.fastly.net/binaries/centos/8/x86_64/ruby-2.6.5.tar.bz2=66b659b6c88c87b34a6703b006ffb81f
https://rvm_io.global.ssl.fastly.net/binaries/centos/8/x86_64/ruby-2.6.6.tar.bz2=2ee192cf53e1e5f5d5d011d89db7a511
https://rvm_io.global.ssl.fastly.net/binaries/centos/8/x86_64/ruby-2.7.0.tar.bz2=a046e64db4f7a60898e22f1694c36362
https://rvm_io.global.ssl.fastly.net/binaries/centos/8/x86_64/ruby-2.7.1.tar.bz2=302691bc2e32ce8f24f2c0dfc48509cd
https://rvm_io.global.ssl.fastly.net/binaries/centos/8/x86_64/ruby-2.7.2.tar.bz2=b0d287890b00a85c4d66180ed097598e
https://rvm_io.global.ssl.fastly.net/binaries/centos/8/x86_64/ruby-3.0.0-preview1.tar.bz2=93134fce505ca84212eb768120a48e63
https://rvm_io.global.ssl.fastly.net/binaries/debian/6/i386/ruby-1.9.3-p429.tar.bz2=048c2ab350edf5e10de5b889a4e2928a
https://rvm_io.global.ssl.fastly.net/binaries/debian/6/i386/ruby-1.9.3-p448.tar.bz2=aeba37b8f72df75352f0aeda32e0be73
https://rvm_io.global.ssl.fastly.net/binaries/debian/6/i386/ruby-2.0.0-p195.tar.bz2=3796d1497b7d1b03ecc09d8df016a162
https://rvm_io.global.ssl.fastly.net/binaries/debian/6/i386/ruby-2.0.0-p247.tar.bz2=1aa09f91ed227d3757573be7ae640637
https://rvm_io.global.ssl.fastly.net/binaries/debian/6/x86_64/ruby-1.9.3-p194.tar.bz2=7b59a3619b85826edd546377888ce2b9
https://rvm_io.global.ssl.fastly.net/binaries/debian/6/x86_64/ruby-1.9.3-p286.tar.bz2=0f0c3dbe9398d75c633cc8a2e54ab641
https://rvm_io.global.ssl.fastly.net/binaries/debian/6/x86_64/ruby-1.9.3-p327.tar.bz2=fb8a6d154404cb6bb8e5ce491964b8a0
https://rvm_io.global.ssl.fastly.net/binaries/debian/6/x86_64/ruby-1.9.3-p362.tar.bz2=c9e820fe966c4d7371e2e76156599892
https://rvm_io.global.ssl.fastly.net/binaries/debian/6/x86_64/ruby-1.9.3-p374.tar.bz2=eefea86668908424ac23f3f1ea880ab7
https://rvm_io.global.ssl.fastly.net/binaries/debian/6/x86_64/ruby-1.9.3-p392.tar.bz2=e9d0e8578c402b853dde5fec789ddfb2
https://rvm_io.global.ssl.fastly.net/binaries/debian/6/x86_64/ruby-1.9.3-p429.tar.bz2=074ea4b8f7442d97872db5641e3e3f3c
https://rvm_io.global.ssl.fastly.net/binaries/debian/6/x86_64/ruby-1.9.3-p448.tar.bz2=82ddacb2f62114798100232f0e5759fe
https://rvm_io.global.ssl.fastly.net/binaries/debian/6/x86_64/ruby-2.0.0-p0.tar.bz2=7e8b3d983794f717ba50ec544d7ab0ab
https://rvm_io.global.ssl.fastly.net/binaries/debian/6/x86_64/ruby-2.0.0-p195.tar.bz2=427e570dbb3da669b5aa2f39f69e9a6c
https://rvm_io.global.ssl.fastly.net/binaries/debian/6/x86_64/ruby-2.0.0-p247.tar.bz2=755c276734c038ac11f55eff7a41e932
https://rvm_io.global.ssl.fastly.net/binaries/debian/7/armhf/ruby-1.9.3-p362.tar.bz2=c7ae82f6808669332be9a0e269df1894
https://rvm_io.global.ssl.fastly.net/binaries/debian/7/armhf/ruby-1.9.3-p392.tar.bz2=7e09bcfc2439a6d57c8728a608f960b1
https://rvm_io.global.ssl.fastly.net/binaries/debian/7/armhf/ruby-1.9.3-p448.tar.bz2=c5ed1a1231479c211cd279eeaac7b6aa
https://rvm_io.global.ssl.fastly.net/binaries/debian/7/armhf/ruby-2.0.0-p0.tar.bz2=4412e6a0ba4b98245e824e7b7a9d7116
https://rvm_io.global.ssl.fastly.net/binaries/debian/7/armhf/ruby-2.0.0-p247.tar.bz2=707b369ffece5fa1ff5e9a5fa1061159
https://rvm_io.global.ssl.fastly.net/binaries/debian/7/i386/ruby-1.9.3-p429.tar.bz2=579db12bcbf421dd117c54e71f49c475
https://rvm_io.global.ssl.fastly.net/binaries/debian/7/i386/ruby-1.9.3-p448.tar.bz2=6f86f0d51a2fb8422fcc186e2d361359
https://rvm_io.global.ssl.fastly.net/binaries/debian/7/i386/ruby-1.9.3-p484.tar.bz2=65486462881275854058c19d181be895
https://rvm_io.global.ssl.fastly.net/binaries/debian/7/i386/ruby-1.9.3-p545.tar.bz2=0dfe0a6fb07d8e369fe1f2a8dc1165cc
https://rvm_io.global.ssl.fastly.net/binaries/debian/7/i386/ruby-1.9.3-p547.tar.bz2=a5bef945da9bec99f147c63d3150e593
https://rvm_io.global.ssl.fastly.net/binaries/debian/7/i386/ruby-1.9.3-p551.tar.bz2=b27fe6c838fcf0b904c6f3cd5aa0e46a
https://rvm_io.global.ssl.fastly.net/binaries/debian/7/i386/ruby-2.0.0-p195.tar.bz2=1b81a1a4d6a2f615c1cdb06e9762425e
https://rvm_io.global.ssl.fastly.net/binaries/debian/7/i386/ruby-2.0.0-p247.tar.bz2=a0a85eabcde5ebd782d07016ab6aae84
https://rvm_io.global.ssl.fastly.net/binaries/debian/7/i386/ruby-2.0.0-p353.tar.bz2=764b3caf7c74846503869a5e2ea75c13
https://rvm_io.global.ssl.fastly.net/binaries/debian/7/i386/ruby-2.0.0-p451.tar.bz2=55552c21ebe885f56b568e6829e25d2c
https://rvm_io.global.ssl.fastly.net/binaries/debian/7/i386/ruby-2.0.0-p481.tar.bz2=61596f2b7d1b5365f238613cd0e736c4
https://rvm_io.global.ssl.fastly.net/binaries/debian/7/i386/ruby-2.0.0-p576.tar.bz2=2df3615ad8bf188ad4293edc3748fff8
https://rvm_io.global.ssl.fastly.net/binaries/debian/7/i386/ruby-2.0.0-p598.tar.bz2=abe838399f64c0ce7616fd160ea67463
https://rvm_io.global.ssl.fastly.net/binaries/debian/7/i386/ruby-2.1.0.tar.bz2=d3edccf815a7ca9b220b8419a92ed835
https://rvm_io.global.ssl.fastly.net/binaries/debian/7/i386/ruby-2.1.1.tar.bz2=541707f5a5099333ac2afda5ba2af0f7
https://rvm_io.global.ssl.fastly.net/binaries/debian/7/i386/ruby-2.1.2.tar.bz2=3f1cbf54547bfa38522e815d22793bda
https://rvm_io.global.ssl.fastly.net/binaries/debian/7/i386/ruby-2.1.3.tar.bz2=0102725a3237f971e2e8fecf88e269f5
https://rvm_io.global.ssl.fastly.net/binaries/debian/7/i386/ruby-2.1.5.tar.bz2=712bf0628826cdc73377989ec3fb8824
https://rvm_io.global.ssl.fastly.net/binaries/debian/7/i386/ruby-2.2.0.tar.bz2=6c1d82b5451285ad770983109d57eb1f
https://rvm_io.global.ssl.fastly.net/binaries/debian/7/i386/ruby-2.2.1.tar.bz2=eac7973fc0035c9894dc922672fbad33
https://rvm_io.global.ssl.fastly.net/binaries/debian/7/x86_64/ruby-1.9.3-p194.tar.bz2=b2179251fab0f9286dfc7ede62d3bf98
https://rvm_io.global.ssl.fastly.net/binaries/debian/7/x86_64/ruby-1.9.3-p286.tar.bz2=d511950fe06b95f1780dae9fcc0a2db5
https://rvm_io.global.ssl.fastly.net/binaries/debian/7/x86_64/ruby-1.9.3-p374.tar.bz2=d28bb8dd50b3c8fe9c4aa4dbf2271651
https://rvm_io.global.ssl.fastly.net/binaries/debian/7/x86_64/ruby-1.9.3-p392.tar.bz2=74000d05d48b1dcae127dfd5728c5f5d
https://rvm_io.global.ssl.fastly.net/binaries/debian/7/x86_64/ruby-1.9.3-p429.tar.bz2=54b2d9b0ecebfafb9c8747ee0c4d281d
https://rvm_io.global.ssl.fastly.net/binaries/debian/7/x86_64/ruby-1.9.3-p448.tar.bz2=aee9e64140470d4510b6a42a3f487349
https://rvm_io.global.ssl.fastly.net/binaries/debian/7/x86_64/ruby-1.9.3-p484.tar.bz2=36f8fcaa5001387efdac6181da71a0ad
https://rvm_io.global.ssl.fastly.net/binaries/debian/7/x86_64/ruby-1.9.3-p545.tar.bz2=b58ff966b2bac1cdd373ded74cf95694
https://rvm_io.global.ssl.fastly.net/binaries/debian/7/x86_64/ruby-1.9.3-p547.tar.bz2=ef99ef4bbf8b7ba25fd03bf41f237594
https://rvm_io.global.ssl.fastly.net/binaries/debian/7/x86_64/ruby-1.9.3-p551.tar.bz2=800f49b0225a561f4ccafb4858a93c57
https://rvm_io.global.ssl.fastly.net/binaries/debian/7/x86_64/ruby-2.0.0-p0.tar.bz2=b348c5b603061cbea2ecbcb15d2e16ff
https://rvm_io.global.ssl.fastly.net/binaries/debian/7/x86_64/ruby-2.0.0-p195.tar.bz2=1e91e7a5476dbdc639b651b523fe636d
https://rvm_io.global.ssl.fastly.net/binaries/debian/7/x86_64/ruby-2.0.0-p247.tar.bz2=873b9542a896db11c4df683e0e9293c9
https://rvm_io.global.ssl.fastly.net/binaries/debian/7/x86_64/ruby-2.0.0-p353.tar.bz2=eea29f40af055e208b4c9d44f52b3b9a
https://rvm_io.global.ssl.fastly.net/binaries/debian/7/x86_64/ruby-2.0.0-p451.tar.bz2=949ace8f19b52643df465f4b2573601a
https://rvm_io.global.ssl.fastly.net/binaries/debian/7/x86_64/ruby-2.0.0-p481.tar.bz2=2d8f4161a9a67fa6a2f3895f25607b0c
https://rvm_io.global.ssl.fastly.net/binaries/debian/7/x86_64/ruby-2.0.0-p576.tar.bz2=6abfb085cb08966fe18dbed039bad386
https://rvm_io.global.ssl.fastly.net/binaries/debian/7/x86_64/ruby-2.0.0-p598.tar.bz2=81cb26788456a10b584683b127603b91
https://rvm_io.global.ssl.fastly.net/binaries/debian/7/x86_64/ruby-2.1.0.tar.bz2=7e36f263ce96349e28e9ed4d8b5f3760
https://rvm_io.global.ssl.fastly.net/binaries/debian/7/x86_64/ruby-2.1.1.tar.bz2=1ff41bb6eedc7468f976aa6e6eb3d39e
https://rvm_io.global.ssl.fastly.net/binaries/debian/7/x86_64/ruby-2.1.2.tar.bz2=89e833e606422a540aa1ea0e499e895d
https://rvm_io.global.ssl.fastly.net/binaries/debian/7/x86_64/ruby-2.1.3.tar.bz2=6b673707b879c6f33b4f92f7ceb71747
https://rvm_io.global.ssl.fastly.net/binaries/debian/7/x86_64/ruby-2.1.5.tar.bz2=d0bf88cf225862d5888df781133eeae2
https://rvm_io.global.ssl.fastly.net/binaries/debian/7/x86_64/ruby-2.2.0.tar.bz2=fec79009244dcb2053bf4e255ffb17b8
https://rvm_io.global.ssl.fastly.net/binaries/debian/7/x86_64/ruby-2.2.1.tar.bz2=67b967628dc0706a2ac69aee278f8121
https://rvm_io.global.ssl.fastly.net/binaries/debian/8/x86_64/ruby-1.9.3-p547.tar.bz2=a65c9cb946cbf5bae4178ef716cef100
https://rvm_io.global.ssl.fastly.net/binaries/debian/8/x86_64/ruby-1.9.3-p551.tar.bz2=1f9db401628dab272ac5d23d55b1b43d
https://rvm_io.global.ssl.fastly.net/binaries/debian/8/x86_64/ruby-2.0.0-p353.tar.bz2=1c0143bf3fa0047c37207c9fcb5dd20d
https://rvm_io.global.ssl.fastly.net/binaries/debian/8/x86_64/ruby-2.0.0-p481.tar.bz2=a0e613046dbce6ec2fba5d47928359f2
https://rvm_io.global.ssl.fastly.net/binaries/debian/8/x86_64/ruby-2.0.0-p576.tar.bz2=678a1256c2be34eca3597af0cd8b6dc3
https://rvm_io.global.ssl.fastly.net/binaries/debian/8/x86_64/ruby-2.0.0-p598.tar.bz2=4223acfcad99874ede78789858b36d97
https://rvm_io.global.ssl.fastly.net/binaries/debian/8/x86_64/ruby-2.1.0.tar.bz2=afa716b4146eab54cad96c7fa05c7674
https://rvm_io.global.ssl.fastly.net/binaries/debian/8/x86_64/ruby-2.1.2.tar.bz2=47cf33426a907cb4ea445cd2e6245b6e
https://rvm_io.global.ssl.fastly.net/binaries/debian/8/x86_64/ruby-2.1.3.tar.bz2=74afd20fdf8726c5586f0b474228b6f5
https://rvm_io.global.ssl.fastly.net/binaries/debian/8/x86_64/ruby-2.1.5.tar.bz2=98c4ffbcbfaac330adfe8680908b822e
https://rvm_io.global.ssl.fastly.net/binaries/debian/8/x86_64/ruby-2.2.0.tar.bz2=33aa0bc5c28cbacd3cbfa5a77375a355
https://rvm_io.global.ssl.fastly.net/binaries/debian/8/x86_64/ruby-2.2.1.tar.bz2=427bdc3906ad33b191697cf0e37b9a85
https://rvm_io.global.ssl.fastly.net/binaries/debian/8/x86_64/ruby-2.2.6.tar.bz2=78be4688c73e9790892ede8bff91fd27
https://rvm_io.global.ssl.fastly.net/binaries/debian/8/x86_64/ruby-2.3.0.tar.bz2=eaa39b2b2b0ad645541aefd5cff1a449
https://rvm_io.global.ssl.fastly.net/binaries/debian/8/x86_64/ruby-2.3.1.tar.bz2=83a1cefb874b0e9ed9a41bfc7d901923
https://rvm_io.global.ssl.fastly.net/binaries/debian/8/x86_64/ruby-2.3.2.tar.bz2=96e5dd9d7760e9c8e588b02d1395847d
https://rvm_io.global.ssl.fastly.net/binaries/debian/8/x86_64/ruby-2.3.3.tar.bz2=7aaffcc1d4c12a0d55234a994afd6b78
https://rvm_io.global.ssl.fastly.net/binaries/debian/8/x86_64/ruby-2.4.0.tar.bz2=5b300b7d38b8690332d17f566d0c9946
https://rvm_io.global.ssl.fastly.net/binaries/debian/8/x86_64/ruby-2.4.1.tar.bz2=8e0ede5b98b1354030512750d9c1a6f0
https://rvm_io.global.ssl.fastly.net/binaries/debian/8/x86_64/ruby-2.4.2.tar.bz2=ab6ab453a52a22bef13bdd4293931954
https://rvm_io.global.ssl.fastly.net/binaries/debian/8/x86_64/ruby-2.4.3.tar.bz2=594be8106dfafc4ca7edc439193767b0
https://rvm_io.global.ssl.fastly.net/binaries/debian/8/x86_64/ruby-2.4.4.tar.bz2=601fcd9011cb796f802751254087a003
https://rvm_io.global.ssl.fastly.net/binaries/debian/8/x86_64/ruby-2.4.5.tar.bz2=87524c2b76c03f9df5aaa72db8814db6
https://rvm_io.global.ssl.fastly.net/binaries/debian/8/x86_64/ruby-2.4.6.tar.bz2=5375035d69d7b27ac508e398549faf9f
https://rvm_io.global.ssl.fastly.net/binaries/debian/8/x86_64/ruby-2.4.7.tar.bz2=a1c029ac74ce8c9b7406bb98f57dd4b4
https://rvm_io.global.ssl.fastly.net/binaries/debian/8/x86_64/ruby-2.4.8.tar.bz2=ceedd129e2e9e4a7526d239244c0762a
https://rvm_io.global.ssl.fastly.net/binaries/debian/8/x86_64/ruby-2.4.9.tar.bz2=42f9bcf1b83c984379d08f731c824b9e
https://rvm_io.global.ssl.fastly.net/binaries/debian/8/x86_64/ruby-2.4.10.tar.bz2=e48b66f784febbd547316ea53088ce39
https://rvm_io.global.ssl.fastly.net/binaries/debian/8/x86_64/ruby-2.5.0.tar.bz2=03cb330dec734d1f942736bc98c94dd2
https://rvm_io.global.ssl.fastly.net/binaries/debian/8/x86_64/ruby-2.5.1.tar.bz2=02ff313c92f6df7e1b413a5dc6ce228f
https://rvm_io.global.ssl.fastly.net/binaries/debian/8/x86_64/ruby-2.5.2.tar.bz2=674608a59bf651ba6e0a4d13c01c1b2a
https://rvm_io.global.ssl.fastly.net/binaries/debian/8/x86_64/ruby-2.5.3.tar.bz2=9075ae59e9bf38b98ce58abc394c6a24
https://rvm_io.global.ssl.fastly.net/binaries/debian/8/x86_64/ruby-2.5.4.tar.bz2=1161ca36bb713d1bd0dd867597902185
https://rvm_io.global.ssl.fastly.net/binaries/debian/8/x86_64/ruby-2.5.5.tar.bz2=326fc1b16ed83a689307a375b94cdd14
https://rvm_io.global.ssl.fastly.net/binaries/debian/8/x86_64/ruby-2.5.6.tar.bz2=7dab5ebeb1ff078166574e541fbcdfea
https://rvm_io.global.ssl.fastly.net/binaries/debian/8/x86_64/ruby-2.5.7.tar.bz2=2b086c4a62633c07b13c08b1e19a625f
https://rvm_io.global.ssl.fastly.net/binaries/debian/8/x86_64/ruby-2.5.8.tar.bz2=9c37bf5350fdc4b7712f1b944f77a4f4
https://rvm_io.global.ssl.fastly.net/binaries/debian/8/x86_64/ruby-2.6.0.tar.bz2=00db1ad8ac2c0acf84c58e438d489575
https://rvm_io.global.ssl.fastly.net/binaries/debian/8/x86_64/ruby-2.6.1.tar.bz2=f9a4aace5303c5d02bb6f1757cda462c
https://rvm_io.global.ssl.fastly.net/binaries/debian/8/x86_64/ruby-2.6.2.tar.bz2=8afe698bb6aacb20e14c17cf5610e6d5
https://rvm_io.global.ssl.fastly.net/binaries/debian/8/x86_64/ruby-2.6.3.tar.bz2=ddc7d00f082675e6074578ec219f2f7a
https://rvm_io.global.ssl.fastly.net/binaries/debian/8/x86_64/ruby-2.6.4.tar.bz2=abbcca050110438b057b9958f5557f1e
https://rvm_io.global.ssl.fastly.net/binaries/debian/8/x86_64/ruby-2.6.5.tar.bz2=30bbaf942743ee58fbbe6f3531fc70ed
https://rvm_io.global.ssl.fastly.net/binaries/debian/8/x86_64/ruby-2.6.6.tar.bz2=dd62bafdf288fc117bba81bea236b6de
https://rvm_io.global.ssl.fastly.net/binaries/debian/8/x86_64/ruby-2.7.0.tar.bz2=5882ff4755ad757bcec35aa45ad4ec2b
https://rvm_io.global.ssl.fastly.net/binaries/debian/8/x86_64/ruby-2.7.1.tar.bz2=239f45c247285e3d86ead9e9a06cea4a
https://rvm_io.global.ssl.fastly.net/binaries/debian/8/x86_64/ruby-2.7.2.tar.bz2=fc657e12d17981119f9a949fb7bd0429
https://rvm_io.global.ssl.fastly.net/binaries/debian/8/x86_64/ruby-3.0.0-preview1.tar.bz2=3f576f1bb3a7c5a817937b57fc2225c5
https://rvm_io.global.ssl.fastly.net/binaries/debian/9/x86_64/ruby-2.4.0.tar.bz2=fa6614d9e1da65fe019ad5f30a2750e5
https://rvm_io.global.ssl.fastly.net/binaries/debian/9/x86_64/ruby-2.4.1.tar.bz2=45f0cc2188dc73a547702eb2caeec1b4
https://rvm_io.global.ssl.fastly.net/binaries/debian/9/x86_64/ruby-2.4.2.tar.bz2=7b129d618a6a1eebd85dba9fe98f6e91
https://rvm_io.global.ssl.fastly.net/binaries/debian/9/x86_64/ruby-2.4.3.tar.bz2=3f1ac79e888dc16b5378db888b27886a
https://rvm_io.global.ssl.fastly.net/binaries/debian/9/x86_64/ruby-2.4.4.tar.bz2=ed1b10e292fa203d293939df0b7e2aa7
https://rvm_io.global.ssl.fastly.net/binaries/debian/9/x86_64/ruby-2.4.5.tar.bz2=d5857e812a2c24ee658334878f20c552
https://rvm_io.global.ssl.fastly.net/binaries/debian/9/x86_64/ruby-2.4.6.tar.bz2=f1b6e718064730b47e3d196f4a8796dc
https://rvm_io.global.ssl.fastly.net/binaries/debian/9/x86_64/ruby-2.4.7.tar.bz2=23b36cbf4bd7825810af9039d56f6b4d
https://rvm_io.global.ssl.fastly.net/binaries/debian/9/x86_64/ruby-2.4.8.tar.bz2=a02775ed1a6cf0252d2d87d97651d770
https://rvm_io.global.ssl.fastly.net/binaries/debian/9/x86_64/ruby-2.4.9.tar.bz2=eba5c1b415e2445f72cec6710c0533ed
https://rvm_io.global.ssl.fastly.net/binaries/debian/9/x86_64/ruby-2.4.10.tar.bz2=65f1fcf8aaa74291cbbc2dcfd6893049
https://rvm_io.global.ssl.fastly.net/binaries/debian/9/x86_64/ruby-2.5.0.tar.bz2=12ac8af3151366556602a757b43add92
https://rvm_io.global.ssl.fastly.net/binaries/debian/9/x86_64/ruby-2.5.1.tar.bz2=6b4420c6cb234e42caf1f157396b658a
https://rvm_io.global.ssl.fastly.net/binaries/debian/9/x86_64/ruby-2.5.2.tar.bz2=0641fa31af9f40beb82a686776778ab0
https://rvm_io.global.ssl.fastly.net/binaries/debian/9/x86_64/ruby-2.5.3.tar.bz2=5759b1900de4facf31bcc41ca54c7307
https://rvm_io.global.ssl.fastly.net/binaries/debian/9/x86_64/ruby-2.5.4.tar.bz2=255912fa6b4527ebde3fa6c35fdd4672
https://rvm_io.global.ssl.fastly.net/binaries/debian/9/x86_64/ruby-2.5.5.tar.bz2=de55f4a4269023b18dbc5ad474d3725d
https://rvm_io.global.ssl.fastly.net/binaries/debian/9/x86_64/ruby-2.5.6.tar.bz2=3e0fabf8db055387d23c719888c1fd80
https://rvm_io.global.ssl.fastly.net/binaries/debian/9/x86_64/ruby-2.5.7.tar.bz2=d1913ce78886194e5016aebd825bacb6
https://rvm_io.global.ssl.fastly.net/binaries/debian/9/x86_64/ruby-2.5.8.tar.bz2=368f9972ad0d47fded67ad408e5b56aa
https://rvm_io.global.ssl.fastly.net/binaries/debian/9/x86_64/ruby-2.6.0.tar.bz2=49cf3c65b754a045419b5bc6ec09e7fd
https://rvm_io.global.ssl.fastly.net/binaries/debian/9/x86_64/ruby-2.6.1.tar.bz2=ffb1f027c8d51d853fe304ff5b77bd53
https://rvm_io.global.ssl.fastly.net/binaries/debian/9/x86_64/ruby-2.6.2.tar.bz2=6b710c0d5495c7818157805ac3f21f57
https://rvm_io.global.ssl.fastly.net/binaries/debian/9/x86_64/ruby-2.6.3.tar.bz2=e243ef988299a300c78e70e985067a0e
https://rvm_io.global.ssl.fastly.net/binaries/debian/9/x86_64/ruby-2.6.4.tar.bz2=b499b6713beaebdf202b97b0ea360c8b
https://rvm_io.global.ssl.fastly.net/binaries/debian/9/x86_64/ruby-2.6.5.tar.bz2=729dc7cc63462456a6e07a7e92f0449f
https://rvm_io.global.ssl.fastly.net/binaries/debian/9/x86_64/ruby-2.6.6.tar.bz2=49a475e58b67ee419965c3fc7ae6e5d0
https://rvm_io.global.ssl.fastly.net/binaries/debian/9/x86_64/ruby-2.7.0.tar.bz2=f4e179729f25b4da8301080ec2d63209
https://rvm_io.global.ssl.fastly.net/binaries/debian/9/x86_64/ruby-2.7.1.tar.bz2=01e093c928caca77b85cedff64af1d2e
https://rvm_io.global.ssl.fastly.net/binaries/debian/9/x86_64/ruby-2.7.2.tar.bz2=a3f9c556acf9ce24b9c228eaf0ce1a5b
https://rvm_io.global.ssl.fastly.net/binaries/debian/9/x86_64/ruby-3.0.0-preview1.tar.bz2=8bedca44418065773deb8711b563cebe
https://rvm_io.global.ssl.fastly.net/binaries/debian/10/x86_64/ruby-2.4.0.tar.bz2=e311fd7d62b273b17e467c24afd46656
https://rvm_io.global.ssl.fastly.net/binaries/debian/10/x86_64/ruby-2.4.1.tar.bz2=4521f00ffdba4e33972ff591e853b79f
https://rvm_io.global.ssl.fastly.net/binaries/debian/10/x86_64/ruby-2.4.2.tar.bz2=1a0c54769a563c2bc0aef788ebc5ce82
https://rvm_io.global.ssl.fastly.net/binaries/debian/10/x86_64/ruby-2.4.3.tar.bz2=3cbbd659a84e15cb3d6f67cf1c057256
https://rvm_io.global.ssl.fastly.net/binaries/debian/10/x86_64/ruby-2.4.4.tar.bz2=0fbc2a234968dfc0db1f5b32bd8c4b53
https://rvm_io.global.ssl.fastly.net/binaries/debian/10/x86_64/ruby-2.4.5.tar.bz2=0505dee913b42fed2248ffe9326b6d71
https://rvm_io.global.ssl.fastly.net/binaries/debian/10/x86_64/ruby-2.4.6.tar.bz2=94e3d0a16ded63d65b12b773d0768eb8
https://rvm_io.global.ssl.fastly.net/binaries/debian/10/x86_64/ruby-2.4.7.tar.bz2=cdd93e353b65baafddf14f6e31db17c4
https://rvm_io.global.ssl.fastly.net/binaries/debian/10/x86_64/ruby-2.4.8.tar.bz2=46a228d40c3fa72ee79a6873525212d7
https://rvm_io.global.ssl.fastly.net/binaries/debian/10/x86_64/ruby-2.4.9.tar.bz2=b9c77e3f709abbb7dccad3a021333542
https://rvm_io.global.ssl.fastly.net/binaries/debian/10/x86_64/ruby-2.4.10.tar.bz2=55b799d61a7cd1c44660530d843cdc4d
https://rvm_io.global.ssl.fastly.net/binaries/debian/10/x86_64/ruby-2.5.0.tar.bz2=4b2dcbc3cfae9f926c2a35c666fb7f34
https://rvm_io.global.ssl.fastly.net/binaries/debian/10/x86_64/ruby-2.5.1.tar.bz2=cc48bec77bac7494fc71041fbadcf037
https://rvm_io.global.ssl.fastly.net/binaries/debian/10/x86_64/ruby-2.5.2.tar.bz2=3e39b27876aff2d9892e1f2b875cbe19
https://rvm_io.global.ssl.fastly.net/binaries/debian/10/x86_64/ruby-2.5.3.tar.bz2=0a2d7fa5852ba14a0596fd4caceff453
https://rvm_io.global.ssl.fastly.net/binaries/debian/10/x86_64/ruby-2.5.4.tar.bz2=f0ece4b322e25fcee423d6830d2e5da4
https://rvm_io.global.ssl.fastly.net/binaries/debian/10/x86_64/ruby-2.5.5.tar.bz2=8f3acc5038bc63420253cd90daf18a96
https://rvm_io.global.ssl.fastly.net/binaries/debian/10/x86_64/ruby-2.5.6.tar.bz2=68570aaf875248ba04c8011370e1970e
https://rvm_io.global.ssl.fastly.net/binaries/debian/10/x86_64/ruby-2.5.7.tar.bz2=f8decfdb914f4b4b3f91eff4dde1df21
https://rvm_io.global.ssl.fastly.net/binaries/debian/10/x86_64/ruby-2.5.8.tar.bz2=65b112ef6b72cc152c1b08dcc4db1ea3
https://rvm_io.global.ssl.fastly.net/binaries/debian/10/x86_64/ruby-2.6.0.tar.bz2=143122343b187e4f9684704752695755
https://rvm_io.global.ssl.fastly.net/binaries/debian/10/x86_64/ruby-2.6.1.tar.bz2=6a23d67169695df7acdda0320ac067ec
https://rvm_io.global.ssl.fastly.net/binaries/debian/10/x86_64/ruby-2.6.2.tar.bz2=5d1a4829163f90941ee6bcf90a391ae8
https://rvm_io.global.ssl.fastly.net/binaries/debian/10/x86_64/ruby-2.6.3.tar.bz2=59d621379c5df523d26a189f9392ebc4
https://rvm_io.global.ssl.fastly.net/binaries/debian/10/x86_64/ruby-2.6.4.tar.bz2=8de0a69d3abc0404b83ebc74224fcf0b
https://rvm_io.global.ssl.fastly.net/binaries/debian/10/x86_64/ruby-2.6.5.tar.bz2=c7ced4cfe6be9f247bdfb36b551d1519
https://rvm_io.global.ssl.fastly.net/binaries/debian/10/x86_64/ruby-2.6.6.tar.bz2=49709ad68580a768a6df34e06f009005
https://rvm_io.global.ssl.fastly.net/binaries/debian/10/x86_64/ruby-2.7.0.tar.bz2=6633798a074e9926bdcccc36cdd4c792
https://rvm_io.global.ssl.fastly.net/binaries/debian/10/x86_64/ruby-2.7.1.tar.bz2=5d41b77af4c99af1acd188942ff05153
https://rvm_io.global.ssl.fastly.net/binaries/debian/10/x86_64/ruby-2.7.2.tar.bz2=627fcabc6fdadb4619d52fd250d94474
https://rvm_io.global.ssl.fastly.net/binaries/debian/10/x86_64/ruby-3.0.0-preview1.tar.bz2=c4336ba12aa3863f760e419863026b37
https://rvm_io.global.ssl.fastly.net/binaries/fedora/17/x86_64/ruby-1.9.3-p429.tar.bz2=e8b54fd757dfd0ff485113be66b2088d
https://rvm_io.global.ssl.fastly.net/binaries/fedora/17/x86_64/ruby-1.9.3-p448.tar.bz2=32deef7f911a26115175cd8f82ed8f4e
https://rvm_io.global.ssl.fastly.net/binaries/fedora/17/x86_64/ruby-2.0.0-p195.tar.bz2=aed98505973fd86021baa52310232537
https://rvm_io.global.ssl.fastly.net/binaries/fedora/17/x86_64/ruby-2.0.0-p247.tar.bz2=b3327c1ee2bf46c915e4238a6ce5eebf
https://rvm_io.global.ssl.fastly.net/binaries/fedora/18/x86_64/ruby-1.9.3-p429.tar.bz2=ecdc50201bcba0fefaa77e4f5e1af79d
https://rvm_io.global.ssl.fastly.net/binaries/fedora/18/x86_64/ruby-1.9.3-p448.tar.bz2=cf6d32f6530549cc3462b8f9ee0120b8
https://rvm_io.global.ssl.fastly.net/binaries/fedora/18/x86_64/ruby-1.9.3-p484.tar.bz2=6176e2b6a07c3b3c50f2a424b997618e
https://rvm_io.global.ssl.fastly.net/binaries/fedora/18/x86_64/ruby-2.0.0-p195.tar.bz2=d5d2e25b11cc000abfdc6baf73357ae5
https://rvm_io.global.ssl.fastly.net/binaries/fedora/18/x86_64/ruby-2.0.0-p247.tar.bz2=76c1cac2220ae64627e0767e23da6f90
https://rvm_io.global.ssl.fastly.net/binaries/fedora/18/x86_64/ruby-2.0.0-p353.tar.bz2=4f966a046d102e3ea57ef80d45af8260
https://rvm_io.global.ssl.fastly.net/binaries/fedora/18/x86_64/ruby-2.1.0.tar.bz2=955ae6bc1eeb8989ac187ce78dd40540
https://rvm_io.global.ssl.fastly.net/binaries/fedora/19/x86_64/ruby-1.9.3-p448.tar.bz2=735efd2878524d3dfff88bfe2830dedb
https://rvm_io.global.ssl.fastly.net/binaries/fedora/19/x86_64/ruby-1.9.3-p484.tar.bz2=3671ba92aca3a99b624e37a57fb9eb84
https://rvm_io.global.ssl.fastly.net/binaries/fedora/19/x86_64/ruby-1.9.3-p545.tar.bz2=14bd56937214382279745add5c179b2f
https://rvm_io.global.ssl.fastly.net/binaries/fedora/19/x86_64/ruby-1.9.3-p547.tar.bz2=f518e8bafd1506ab88dd75959fdef09e
https://rvm_io.global.ssl.fastly.net/binaries/fedora/19/x86_64/ruby-1.9.3-p551.tar.bz2=2ec012bbdd28612dedfd4d7c30f7c8db
https://rvm_io.global.ssl.fastly.net/binaries/fedora/19/x86_64/ruby-2.0.0-p247.tar.bz2=0f00ff920a9d45dfd05943ae79236762
https://rvm_io.global.ssl.fastly.net/binaries/fedora/19/x86_64/ruby-2.0.0-p353.tar.bz2=7feee293fb5746077231b1dbdf7ccdb5
https://rvm_io.global.ssl.fastly.net/binaries/fedora/19/x86_64/ruby-2.0.0-p451.tar.bz2=cbffe7a954df812e3d076737871f522f
https://rvm_io.global.ssl.fastly.net/binaries/fedora/19/x86_64/ruby-2.0.0-p481.tar.bz2=7ede42eadce775395c7130f113cf9f52
https://rvm_io.global.ssl.fastly.net/binaries/fedora/19/x86_64/ruby-2.0.0-p576.tar.bz2=68c9916eb2dc9c68ba666b37787adbd5
https://rvm_io.global.ssl.fastly.net/binaries/fedora/19/x86_64/ruby-2.0.0-p598.tar.bz2=2fd0fa0a99bdff307d6d92818e1ad0d7
https://rvm_io.global.ssl.fastly.net/binaries/fedora/19/x86_64/ruby-2.1.0.tar.bz2=d0aa5745c1e39b4d9786fc4ec1811d82
https://rvm_io.global.ssl.fastly.net/binaries/fedora/19/x86_64/ruby-2.1.1.tar.bz2=61bdd81e15e63e5158c11d4ba6a6f7fc
https://rvm_io.global.ssl.fastly.net/binaries/fedora/19/x86_64/ruby-2.1.2.tar.bz2=164b9607ec3946852daf7bd3409a028f
https://rvm_io.global.ssl.fastly.net/binaries/fedora/19/x86_64/ruby-2.1.3.tar.bz2=708c6367dd0ffed2f429fbed196c8cb6
https://rvm_io.global.ssl.fastly.net/binaries/fedora/19/x86_64/ruby-2.1.5.tar.bz2=966e64f70d6b5e1a7c8a56bf13948edb
https://rvm_io.global.ssl.fastly.net/binaries/fedora/19/x86_64/ruby-2.2.0.tar.bz2=e72cb18c63fe1bfd22ed926e191895fe
https://rvm_io.global.ssl.fastly.net/binaries/fedora/19/x86_64/ruby-2.2.1.tar.bz2=8db2d1b680dd8a8ad03ac3262924a638
https://rvm_io.global.ssl.fastly.net/binaries/fedora/20/x86_64/ruby-1.9.3-p547.tar.bz2=fd94930d2879efac2f56e436f8a59b3f
https://rvm_io.global.ssl.fastly.net/binaries/fedora/20/x86_64/ruby-1.9.3-p551.tar.bz2=ae6ff3492b321cf9af45506917ef622d
https://rvm_io.global.ssl.fastly.net/binaries/fedora/20/x86_64/ruby-2.0.0-p481.tar.bz2=5f591ce9ef9eec5adc7a974b99681d3e
https://rvm_io.global.ssl.fastly.net/binaries/fedora/20/x86_64/ruby-2.0.0-p576.tar.bz2=d73750dee8af3f0939a8bb6e43495f04
https://rvm_io.global.ssl.fastly.net/binaries/fedora/20/x86_64/ruby-2.0.0-p598.tar.bz2=4b1662b6552554a92cb1c7f1b87c9068
https://rvm_io.global.ssl.fastly.net/binaries/fedora/20/x86_64/ruby-2.1.2.tar.bz2=b9c25e0ce0a17c86fea3eaa3b3c680bb
https://rvm_io.global.ssl.fastly.net/binaries/fedora/20/x86_64/ruby-2.1.3.tar.bz2=3a881b62e88d72ad99c31425faad497d
https://rvm_io.global.ssl.fastly.net/binaries/fedora/20/x86_64/ruby-2.1.5.tar.bz2=740b731037b86295a1907b6393f0d7e4
https://rvm_io.global.ssl.fastly.net/binaries/fedora/20/x86_64/ruby-2.2.0.tar.bz2=41b89fc327d076c7658052a72c6bc79c
https://rvm_io.global.ssl.fastly.net/binaries/fedora/20/x86_64/ruby-2.2.1.tar.bz2=b4e8febbcde4ecaa7189428c1b4f8532
https://rvm_io.global.ssl.fastly.net/binaries/fedora/21/x86_64/ruby-1.9.3-p551.tar.bz2=d974619e5d62a2391c5f00c31672fad1
https://rvm_io.global.ssl.fastly.net/binaries/fedora/21/x86_64/ruby-2.0.0-p598.tar.bz2=83e16e3843582f734e2b8f6a5133aad3
https://rvm_io.global.ssl.fastly.net/binaries/fedora/21/x86_64/ruby-2.1.5.tar.bz2=4eba5ed5ecf1f26fb395473840853048
https://rvm_io.global.ssl.fastly.net/binaries/fedora/21/x86_64/ruby-2.2.0.tar.bz2=5dc7646dfbf5f20e529ec52b9f47b796
https://rvm_io.global.ssl.fastly.net/binaries/fedora/21/x86_64/ruby-2.2.1.tar.bz2=69d890bc613a02f5ab410366589bf667
https://rvm_io.global.ssl.fastly.net/binaries/opensuse/12.1/x86_64/ruby-1.9.3-p194.tar.bz2=dc6ba7f9d018b24925e0fbd8c4ea9eb7
https://rvm_io.global.ssl.fastly.net/binaries/opensuse/12.1/x86_64/ruby-1.9.3-p286.tar.bz2=8534aa8d63ac5251ee675ded2012717c
https://rvm_io.global.ssl.fastly.net/binaries/opensuse/12.1/x86_64/ruby-1.9.3-p374.tar.bz2=f29663cc36615fa612a15b19a1ca2620
https://rvm_io.global.ssl.fastly.net/binaries/opensuse/12.1/x86_64/ruby-1.9.3-p392.tar.bz2=e0338591fd94d6161af10eb00f34278d
https://rvm_io.global.ssl.fastly.net/binaries/opensuse/12.1/x86_64/ruby-2.0.0-p0.tar.bz2=16a62a3506fd3322ae6fa69324a70c68
https://rvm_io.global.ssl.fastly.net/binaries/opensuse/12.2/x86_64/ruby-1.9.3-p194.tar.bz2=8ee8576a71e66710b23fbd1a5b24997e
https://rvm_io.global.ssl.fastly.net/binaries/opensuse/12.2/x86_64/ruby-1.9.3-p286.tar.bz2=10670d95d2b3b1534144e91e187c7337
https://rvm_io.global.ssl.fastly.net/binaries/opensuse/12.2/x86_64/ruby-1.9.3-p327.tar.bz2=827ee1f154eca895b2f31f516c0a2ca1
https://rvm_io.global.ssl.fastly.net/binaries/opensuse/12.2/x86_64/ruby-1.9.3-p362.tar.bz2=5803537c0d4d0af89c47586768718602
https://rvm_io.global.ssl.fastly.net/binaries/opensuse/12.2/x86_64/ruby-1.9.3-p374.tar.bz2=dc5f0265fbc5e36560b3deddaf9fe763
https://rvm_io.global.ssl.fastly.net/binaries/opensuse/12.2/x86_64/ruby-1.9.3-p385.tar.bz2=23c24b2b78d10213e62cf7d66c8f0779
https://rvm_io.global.ssl.fastly.net/binaries/opensuse/12.2/x86_64/ruby-1.9.3-p392.tar.bz2=791eb1b60cb0abc0d602eccb348d0b62
https://rvm_io.global.ssl.fastly.net/binaries/opensuse/12.2/x86_64/ruby-2.0.0-p0.tar.bz2=00d6fc9b5dcc058aa8db921242123e29
https://rvm_io.global.ssl.fastly.net/binaries/opensuse/12.3/x86_64/ruby-1.9.3-p392.tar.bz2=d8d9349150d66ce54a4a5f6ff30b5733
https://rvm_io.global.ssl.fastly.net/binaries/opensuse/12.3/x86_64/ruby-1.9.3-p429.tar.bz2=a2d1878207e8937c87e9bd905ae8bdc3
https://rvm_io.global.ssl.fastly.net/binaries/opensuse/12.3/x86_64/ruby-1.9.3-p448.tar.bz2=9e02a04e5f0f8463e3f419adcc257b47
https://rvm_io.global.ssl.fastly.net/binaries/opensuse/12.3/x86_64/ruby-1.9.3-p484.tar.bz2=11d89f9dddd910f47a6498ca9374a2b1
https://rvm_io.global.ssl.fastly.net/binaries/opensuse/12.3/x86_64/ruby-1.9.3-p545.tar.bz2=8b32a889187ac9955d4c3fbe914c2edb
https://rvm_io.global.ssl.fastly.net/binaries/opensuse/12.3/x86_64/ruby-1.9.3-p547.tar.bz2=b651c414aa9105f890ab32ce6e9f38ea
https://rvm_io.global.ssl.fastly.net/binaries/opensuse/12.3/x86_64/ruby-1.9.3-p551.tar.bz2=e26d57759d936af3b37853b6aea15330
https://rvm_io.global.ssl.fastly.net/binaries/opensuse/12.3/x86_64/ruby-2.0.0-p0.tar.bz2=5eccf0d1ea5aba8ea2684296eb0c8249
https://rvm_io.global.ssl.fastly.net/binaries/opensuse/12.3/x86_64/ruby-2.0.0-p195.tar.bz2=cf656cb51dbc1e1008d271952a2287ae
https://rvm_io.global.ssl.fastly.net/binaries/opensuse/12.3/x86_64/ruby-2.0.0-p247.tar.bz2=63118d9a28264fdaa57923cc36829d75
https://rvm_io.global.ssl.fastly.net/binaries/opensuse/12.3/x86_64/ruby-2.0.0-p353.tar.bz2=a855d883b605b31ae34e8198fd7d4156
https://rvm_io.global.ssl.fastly.net/binaries/opensuse/12.3/x86_64/ruby-2.0.0-p451.tar.bz2=a74390cab7ba33cbc4fbb6f4588756be
https://rvm_io.global.ssl.fastly.net/binaries/opensuse/12.3/x86_64/ruby-2.0.0-p481.tar.bz2=49c24b6552ed8d32ead09619b0710104
https://rvm_io.global.ssl.fastly.net/binaries/opensuse/12.3/x86_64/ruby-2.0.0-p576.tar.bz2=b349282abbc4cacebefd63583122177c
https://rvm_io.global.ssl.fastly.net/binaries/opensuse/12.3/x86_64/ruby-2.0.0-p598.tar.bz2=c4edab93180f72e79dfe5fdee2fa0598
https://rvm_io.global.ssl.fastly.net/binaries/opensuse/12.3/x86_64/ruby-2.1.0.tar.bz2=353ef9282ee9fdae9d4dd7c5d7f6aff4
https://rvm_io.global.ssl.fastly.net/binaries/opensuse/12.3/x86_64/ruby-2.1.1.tar.bz2=db805467a09906846296a3a815ba45e3
https://rvm_io.global.ssl.fastly.net/binaries/opensuse/12.3/x86_64/ruby-2.1.2.tar.bz2=96a39796381be219cbe6461321154f66
https://rvm_io.global.ssl.fastly.net/binaries/opensuse/12.3/x86_64/ruby-2.1.3.tar.bz2=e6de5a6b287afc36fe69ce604767a065
https://rvm_io.global.ssl.fastly.net/binaries/opensuse/12.3/x86_64/ruby-2.1.5.tar.bz2=87dc2011fbf529fce011d5182575c849
https://rvm_io.global.ssl.fastly.net/binaries/opensuse/12.3/x86_64/ruby-2.2.0.tar.bz2=bcdecc78e7634e97780517ca06b9b445
https://rvm_io.global.ssl.fastly.net/binaries/opensuse/12.3/x86_64/ruby-2.2.1.tar.bz2=defa3f959e6817b465460281ca436b7c
https://rvm_io.global.ssl.fastly.net/binaries/opensuse/13.1/x86_64/ruby-1.9.3-p551.tar.bz2=f96d76663ef1e6ff03f6d961e2d1062e
https://rvm_io.global.ssl.fastly.net/binaries/opensuse/13.1/x86_64/ruby-2.0.0-p576.tar.bz2=7405ca61a45298e45761eeb8b84b1c37
https://rvm_io.global.ssl.fastly.net/binaries/opensuse/13.1/x86_64/ruby-2.0.0-p598.tar.bz2=fd47ded50b2c00b4014947f0c38ec3c3
https://rvm_io.global.ssl.fastly.net/binaries/opensuse/13.1/x86_64/ruby-2.1.3.tar.bz2=010c58b44d47b01adca014b52411468b
https://rvm_io.global.ssl.fastly.net/binaries/opensuse/13.1/x86_64/ruby-2.1.5.tar.bz2=24deecf424828b3638ba45adc6ff1c9b
https://rvm_io.global.ssl.fastly.net/binaries/opensuse/13.1/x86_64/ruby-2.2.0.tar.bz2=5d645075a46137bd6ca27f333ff921f8
https://rvm_io.global.ssl.fastly.net/binaries/opensuse/13.1/x86_64/ruby-2.2.1.tar.bz2=de032abda6c4d792eaecfe891c7d819f
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.7/x86_64/ruby-2.0.0-p451.tar.bz2=72740441714ea5732c219efe3a4a17a0
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.7/x86_64/ruby-2.0.0-p481.tar.bz2=4f5ab89e550cbd446c4457b5ba7c17d0
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.7/x86_64/ruby-2.0.0-p576.tar.bz2=343d32583855b6adf7d8fe393a2575cf
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.7/x86_64/ruby-2.0.0-p594.tar.bz2=6480351f5302c00b4a40a9ab5c9a3db3
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.7/x86_64/ruby-2.0.0-p598.tar.bz2=16da64f05aeca63c5e7c8fe90ebc64e0
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.7/x86_64/ruby-2.0.0-p643.tar.bz2=1937d9b31c9c3a67a8dff0831dd483b5
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.7/x86_64/ruby-2.0.0-p645.tar.bz2=a927b7b167805e7155b50d2c8d807f2b
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.7/x86_64/ruby-2.0.0-p647.tar.bz2=19db8641c96b80bfe516d81debafc9e7
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.7/x86_64/ruby-2.1.0.tar.bz2=841f405d073132b198cd526422d86dbd
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.7/x86_64/ruby-2.1.1.tar.bz2=b57951057dc2d129ca59ee1d03666059
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.7/x86_64/ruby-2.1.2.tar.bz2=2c846aa1fbd5910584f54d2655a1ed6f
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.7/x86_64/ruby-2.1.3.tar.bz2=2cf6d1dcff40ecff3242aca4fcccdaf9
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.7/x86_64/ruby-2.1.4.tar.bz2=c66e257248512feacb323e26089e5817
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.7/x86_64/ruby-2.1.5.tar.bz2=b3b007e8033da456f8a0ca84e210f4af
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.7/x86_64/ruby-2.1.6.tar.bz2=ec5da63a2e3ecc6123cdacedb20ac909
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.7/x86_64/ruby-2.1.7.tar.bz2=6c2558fcf9b874d2f7121f23117b85d4
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.7/x86_64/ruby-2.2.0.tar.bz2=1c975f87a30c4ad6b7bce00b38281946
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.7/x86_64/ruby-2.2.1.tar.bz2=fbf2a76172c2c93e5f480dbfb56bf538
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.7/x86_64/ruby-2.2.2.tar.bz2=aa129936fc65ee252a36df3022f4c3b1
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.7/x86_64/ruby-2.2.3.tar.bz2=82b261a8112fd009f3eb8619d8e3a472
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.8/x86_64/ruby-2.0.0-p451.tar.bz2=72740441714ea5732c219efe3a4a17a0
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.8/x86_64/ruby-2.0.0-p481.tar.bz2=4f5ab89e550cbd446c4457b5ba7c17d0
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.8/x86_64/ruby-2.0.0-p576.tar.bz2=343d32583855b6adf7d8fe393a2575cf
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.8/x86_64/ruby-2.0.0-p594.tar.bz2=6480351f5302c00b4a40a9ab5c9a3db3
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.8/x86_64/ruby-2.0.0-p598.tar.bz2=16da64f05aeca63c5e7c8fe90ebc64e0
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.8/x86_64/ruby-2.0.0-p643.tar.bz2=1937d9b31c9c3a67a8dff0831dd483b5
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.8/x86_64/ruby-2.0.0-p645.tar.bz2=a927b7b167805e7155b50d2c8d807f2b
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.8/x86_64/ruby-2.0.0-p647.tar.bz2=19db8641c96b80bfe516d81debafc9e7
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.8/x86_64/ruby-2.1.0.tar.bz2=841f405d073132b198cd526422d86dbd
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.8/x86_64/ruby-2.1.1.tar.bz2=b57951057dc2d129ca59ee1d03666059
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.8/x86_64/ruby-2.1.2.tar.bz2=2c846aa1fbd5910584f54d2655a1ed6f
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.8/x86_64/ruby-2.1.3.tar.bz2=2cf6d1dcff40ecff3242aca4fcccdaf9
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.8/x86_64/ruby-2.1.4.tar.bz2=c66e257248512feacb323e26089e5817
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.8/x86_64/ruby-2.1.5.tar.bz2=b3b007e8033da456f8a0ca84e210f4af
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.8/x86_64/ruby-2.1.6.tar.bz2=ec5da63a2e3ecc6123cdacedb20ac909
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.8/x86_64/ruby-2.1.7.tar.bz2=6c2558fcf9b874d2f7121f23117b85d4
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.8/x86_64/ruby-2.2.0.tar.bz2=1c975f87a30c4ad6b7bce00b38281946
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.8/x86_64/ruby-2.2.1.tar.bz2=fbf2a76172c2c93e5f480dbfb56bf538
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.8/x86_64/ruby-2.2.2.tar.bz2=aa129936fc65ee252a36df3022f4c3b1
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.8/x86_64/ruby-2.2.3.tar.bz2=82b261a8112fd009f3eb8619d8e3a472
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.9/x86_64/ruby-2.0.0-p451.tar.bz2=72740441714ea5732c219efe3a4a17a0
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.9/x86_64/ruby-2.0.0-p481.tar.bz2=4f5ab89e550cbd446c4457b5ba7c17d0
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.9/x86_64/ruby-2.0.0-p576.tar.bz2=343d32583855b6adf7d8fe393a2575cf
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.9/x86_64/ruby-2.0.0-p594.tar.bz2=6480351f5302c00b4a40a9ab5c9a3db3
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.9/x86_64/ruby-2.0.0-p598.tar.bz2=16da64f05aeca63c5e7c8fe90ebc64e0
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.9/x86_64/ruby-2.0.0-p643.tar.bz2=1937d9b31c9c3a67a8dff0831dd483b5
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.9/x86_64/ruby-2.0.0-p645.tar.bz2=a927b7b167805e7155b50d2c8d807f2b
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.9/x86_64/ruby-2.0.0-p647.tar.bz2=19db8641c96b80bfe516d81debafc9e7
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.9/x86_64/ruby-2.1.0.tar.bz2=841f405d073132b198cd526422d86dbd
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.9/x86_64/ruby-2.1.1.tar.bz2=b57951057dc2d129ca59ee1d03666059
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.9/x86_64/ruby-2.1.2.tar.bz2=2c846aa1fbd5910584f54d2655a1ed6f
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.9/x86_64/ruby-2.1.3.tar.bz2=2cf6d1dcff40ecff3242aca4fcccdaf9
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.9/x86_64/ruby-2.1.4.tar.bz2=c66e257248512feacb323e26089e5817
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.9/x86_64/ruby-2.1.5.tar.bz2=b3b007e8033da456f8a0ca84e210f4af
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.9/x86_64/ruby-2.1.6.tar.bz2=ec5da63a2e3ecc6123cdacedb20ac909
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.9/x86_64/ruby-2.1.7.tar.bz2=6c2558fcf9b874d2f7121f23117b85d4
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.9/x86_64/ruby-2.2.0.tar.bz2=1c975f87a30c4ad6b7bce00b38281946
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.9/x86_64/ruby-2.2.1.tar.bz2=fbf2a76172c2c93e5f480dbfb56bf538
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.9/x86_64/ruby-2.2.2.tar.bz2=aa129936fc65ee252a36df3022f4c3b1
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.9/x86_64/ruby-2.2.3.tar.bz2=82b261a8112fd009f3eb8619d8e3a472
https://rvm_io.global.ssl.fastly.net/binaries/oracle/7/x86_64/ruby-2.4.0.tar.bz2=37eb66681a66770b0c7bda05b064ba21
https://rvm_io.global.ssl.fastly.net/binaries/oracle/7/x86_64/ruby-2.4.1.tar.bz2=59e66f8d57e301f0f7700c63da48b9ee
https://rvm_io.global.ssl.fastly.net/binaries/oracle/7/x86_64/ruby-2.4.2.tar.bz2=f362ce8e6852ee534c67b2eff49ffbc5
https://rvm_io.global.ssl.fastly.net/binaries/oracle/7/x86_64/ruby-2.4.3.tar.bz2=97dfec0ef7db8d9f10144565077ebc6e
https://rvm_io.global.ssl.fastly.net/binaries/oracle/7/x86_64/ruby-2.4.4.tar.bz2=49725cf6b590a226be825cf9b13f3dae
https://rvm_io.global.ssl.fastly.net/binaries/oracle/7/x86_64/ruby-2.4.5.tar.bz2=12cc89dfe3eb14417533b33494c2e6bb
https://rvm_io.global.ssl.fastly.net/binaries/oracle/7/x86_64/ruby-2.4.6.tar.bz2=1539b4609610cf6069f72c4b098bda0e
https://rvm_io.global.ssl.fastly.net/binaries/oracle/7/x86_64/ruby-2.4.7.tar.bz2=c4d51b0b61baf22707c3d339e8a2c0e3
https://rvm_io.global.ssl.fastly.net/binaries/oracle/7/x86_64/ruby-2.4.8.tar.bz2=f95912983dce40cc6af353faeddcfbfa
https://rvm_io.global.ssl.fastly.net/binaries/oracle/7/x86_64/ruby-2.4.9.tar.bz2=8a8522d9d02d117b030d404888e16403
https://rvm_io.global.ssl.fastly.net/binaries/oracle/7/x86_64/ruby-2.4.10.tar.bz2=d0e9f0121818e67ef5cdef6d8573bd5c
https://rvm_io.global.ssl.fastly.net/binaries/oracle/7/x86_64/ruby-2.5.0.tar.bz2=dea3a75ec2287dc6c13cf2ac73ba768e
https://rvm_io.global.ssl.fastly.net/binaries/oracle/7/x86_64/ruby-2.5.1.tar.bz2=3c713c37b4d4b7dca05bb79a70108ddb
https://rvm_io.global.ssl.fastly.net/binaries/oracle/7/x86_64/ruby-2.5.2.tar.bz2=40f05208b0c8090347dbcf464176df42
https://rvm_io.global.ssl.fastly.net/binaries/oracle/7/x86_64/ruby-2.5.3.tar.bz2=54dee2a2b391160a1a0c103f89aa237f
https://rvm_io.global.ssl.fastly.net/binaries/oracle/7/x86_64/ruby-2.5.4.tar.bz2=25c3ced7dbb55b4e72813af352a71802
https://rvm_io.global.ssl.fastly.net/binaries/oracle/7/x86_64/ruby-2.5.5.tar.bz2=df9cb16150a9ada0e9f6ee093c591718
https://rvm_io.global.ssl.fastly.net/binaries/oracle/7/x86_64/ruby-2.5.6.tar.bz2=e28af2248ea55aa9804fd83f5fdef032
https://rvm_io.global.ssl.fastly.net/binaries/oracle/7/x86_64/ruby-2.5.7.tar.bz2=c2c191daf055114a70ea75101a0f0baf
https://rvm_io.global.ssl.fastly.net/binaries/oracle/7/x86_64/ruby-2.5.8.tar.bz2=4b2583745e509a35a0715812b455a168
https://rvm_io.global.ssl.fastly.net/binaries/oracle/7/x86_64/ruby-2.6.0.tar.bz2=c6170eafd5f63520000cba146865c48c
https://rvm_io.global.ssl.fastly.net/binaries/oracle/7/x86_64/ruby-2.6.1.tar.bz2=d12d75ee230a6651721ae07eb0f27c4f
https://rvm_io.global.ssl.fastly.net/binaries/oracle/7/x86_64/ruby-2.6.2.tar.bz2=8a8f372299a24266ffb214828f692f8f
https://rvm_io.global.ssl.fastly.net/binaries/oracle/7/x86_64/ruby-2.6.3.tar.bz2=d742178a0b026ee2f1f9040554e9c2a9
https://rvm_io.global.ssl.fastly.net/binaries/oracle/7/x86_64/ruby-2.6.4.tar.bz2=b8c49d3ad00e275a6fa3389f4bedc5d2
https://rvm_io.global.ssl.fastly.net/binaries/oracle/7/x86_64/ruby-2.6.5.tar.bz2=7672f83f93ade41141f59426883502fd
https://rvm_io.global.ssl.fastly.net/binaries/oracle/7/x86_64/ruby-2.6.6.tar.bz2=cc67163e8b3fd4b37665e345ee26106d
https://rvm_io.global.ssl.fastly.net/binaries/oracle/7/x86_64/ruby-2.7.0.tar.bz2=fbe7994459d18e6852a1e5af46b1cd31
https://rvm_io.global.ssl.fastly.net/binaries/oracle/7/x86_64/ruby-2.7.1.tar.bz2=387c28826a4be5d8b60e856971ffdf75
https://rvm_io.global.ssl.fastly.net/binaries/oracle/7/x86_64/ruby-2.7.2.tar.bz2=b5c970be1e67ed72b4476cb3fd34346f
https://rvm_io.global.ssl.fastly.net/binaries/oracle/7/x86_64/ruby-3.0.0-preview1.tar.bz2=9eb48cd2e2092bf01cb0e35663473a22
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.10/x86_64/ruby-2.0.0-p451.tar.bz2=72740441714ea5732c219efe3a4a17a0
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.10/x86_64/ruby-2.0.0-p481.tar.bz2=4f5ab89e550cbd446c4457b5ba7c17d0
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.10/x86_64/ruby-2.0.0-p576.tar.bz2=343d32583855b6adf7d8fe393a2575cf
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.10/x86_64/ruby-2.0.0-p594.tar.bz2=6480351f5302c00b4a40a9ab5c9a3db3
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.10/x86_64/ruby-2.0.0-p598.tar.bz2=16da64f05aeca63c5e7c8fe90ebc64e0
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.10/x86_64/ruby-2.0.0-p643.tar.bz2=1937d9b31c9c3a67a8dff0831dd483b5
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.10/x86_64/ruby-2.0.0-p645.tar.bz2=a927b7b167805e7155b50d2c8d807f2b
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.10/x86_64/ruby-2.0.0-p647.tar.bz2=19db8641c96b80bfe516d81debafc9e7
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.10/x86_64/ruby-2.1.0.tar.bz2=841f405d073132b198cd526422d86dbd
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.10/x86_64/ruby-2.1.1.tar.bz2=b57951057dc2d129ca59ee1d03666059
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.10/x86_64/ruby-2.1.2.tar.bz2=2c846aa1fbd5910584f54d2655a1ed6f
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.10/x86_64/ruby-2.1.3.tar.bz2=2cf6d1dcff40ecff3242aca4fcccdaf9
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.10/x86_64/ruby-2.1.4.tar.bz2=c66e257248512feacb323e26089e5817
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.10/x86_64/ruby-2.1.5.tar.bz2=b3b007e8033da456f8a0ca84e210f4af
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.10/x86_64/ruby-2.1.6.tar.bz2=ec5da63a2e3ecc6123cdacedb20ac909
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.10/x86_64/ruby-2.1.7.tar.bz2=6c2558fcf9b874d2f7121f23117b85d4
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.10/x86_64/ruby-2.2.0.tar.bz2=1c975f87a30c4ad6b7bce00b38281946
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.10/x86_64/ruby-2.2.1.tar.bz2=fbf2a76172c2c93e5f480dbfb56bf538
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.10/x86_64/ruby-2.2.2.tar.bz2=aa129936fc65ee252a36df3022f4c3b1
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.10/x86_64/ruby-2.2.3.tar.bz2=82b261a8112fd009f3eb8619d8e3a472
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.11/x86_64/ruby-2.0.0-p451.tar.bz2=72740441714ea5732c219efe3a4a17a0
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.11/x86_64/ruby-2.0.0-p481.tar.bz2=4f5ab89e550cbd446c4457b5ba7c17d0
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.11/x86_64/ruby-2.0.0-p576.tar.bz2=343d32583855b6adf7d8fe393a2575cf
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.11/x86_64/ruby-2.0.0-p594.tar.bz2=6480351f5302c00b4a40a9ab5c9a3db3
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.11/x86_64/ruby-2.0.0-p598.tar.bz2=16da64f05aeca63c5e7c8fe90ebc64e0
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.11/x86_64/ruby-2.0.0-p643.tar.bz2=1937d9b31c9c3a67a8dff0831dd483b5
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.11/x86_64/ruby-2.0.0-p645.tar.bz2=a927b7b167805e7155b50d2c8d807f2b
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.11/x86_64/ruby-2.0.0-p647.tar.bz2=19db8641c96b80bfe516d81debafc9e7
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.11/x86_64/ruby-2.0.0-p648.tar.bz2=1d747217772641b7795ab0715a5072fc
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.11/x86_64/ruby-2.1.0.tar.bz2=841f405d073132b198cd526422d86dbd
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.11/x86_64/ruby-2.1.1.tar.bz2=b57951057dc2d129ca59ee1d03666059
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.11/x86_64/ruby-2.1.2.tar.bz2=2c846aa1fbd5910584f54d2655a1ed6f
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.11/x86_64/ruby-2.1.3.tar.bz2=2cf6d1dcff40ecff3242aca4fcccdaf9
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.11/x86_64/ruby-2.1.4.tar.bz2=c66e257248512feacb323e26089e5817
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.11/x86_64/ruby-2.1.5.tar.bz2=b3b007e8033da456f8a0ca84e210f4af
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.11/x86_64/ruby-2.1.6.tar.bz2=ec5da63a2e3ecc6123cdacedb20ac909
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.11/x86_64/ruby-2.1.7.tar.bz2=6c2558fcf9b874d2f7121f23117b85d4
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.11/x86_64/ruby-2.1.8.tar.bz2=547440bb4fc03f025b31d00a6276e7c4
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.11/x86_64/ruby-2.1.9.tar.bz2=ce7376e89b097c465606d6efa6051182
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.11/x86_64/ruby-2.1.10.tar.bz2=147a8f6136f853e0582650c44a9875aa
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.11/x86_64/ruby-2.2.0.tar.bz2=1c975f87a30c4ad6b7bce00b38281946
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.11/x86_64/ruby-2.2.1.tar.bz2=fbf2a76172c2c93e5f480dbfb56bf538
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.11/x86_64/ruby-2.2.2.tar.bz2=aa129936fc65ee252a36df3022f4c3b1
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.11/x86_64/ruby-2.2.3.tar.bz2=82b261a8112fd009f3eb8619d8e3a472
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.11/x86_64/ruby-2.2.4.tar.bz2=69381008b00c8e28d876888f355c2832
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.11/x86_64/ruby-2.2.5.tar.bz2=e41bd7b8ac059ea1fce256fe38811e8c
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.12/x86_64/ruby-2.0.0-p451.tar.bz2=72740441714ea5732c219efe3a4a17a0
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.12/x86_64/ruby-2.0.0-p481.tar.bz2=4f5ab89e550cbd446c4457b5ba7c17d0
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.12/x86_64/ruby-2.0.0-p576.tar.bz2=343d32583855b6adf7d8fe393a2575cf
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.12/x86_64/ruby-2.0.0-p594.tar.bz2=6480351f5302c00b4a40a9ab5c9a3db3
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.12/x86_64/ruby-2.0.0-p598.tar.bz2=16da64f05aeca63c5e7c8fe90ebc64e0
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.12/x86_64/ruby-2.0.0-p643.tar.bz2=1937d9b31c9c3a67a8dff0831dd483b5
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.12/x86_64/ruby-2.0.0-p645.tar.bz2=a927b7b167805e7155b50d2c8d807f2b
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.12/x86_64/ruby-2.0.0-p647.tar.bz2=19db8641c96b80bfe516d81debafc9e7
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.12/x86_64/ruby-2.1.0.tar.bz2=841f405d073132b198cd526422d86dbd
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.12/x86_64/ruby-2.1.1.tar.bz2=b57951057dc2d129ca59ee1d03666059
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.12/x86_64/ruby-2.1.2.tar.bz2=2c846aa1fbd5910584f54d2655a1ed6f
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.12/x86_64/ruby-2.1.3.tar.bz2=2cf6d1dcff40ecff3242aca4fcccdaf9
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.12/x86_64/ruby-2.1.4.tar.bz2=c66e257248512feacb323e26089e5817
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.12/x86_64/ruby-2.1.5.tar.bz2=b3b007e8033da456f8a0ca84e210f4af
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.12/x86_64/ruby-2.1.6.tar.bz2=ec5da63a2e3ecc6123cdacedb20ac909
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.12/x86_64/ruby-2.1.7.tar.bz2=6c2558fcf9b874d2f7121f23117b85d4
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.12/x86_64/ruby-2.2.0.tar.bz2=1c975f87a30c4ad6b7bce00b38281946
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.12/x86_64/ruby-2.2.1.tar.bz2=fbf2a76172c2c93e5f480dbfb56bf538
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.12/x86_64/ruby-2.2.2.tar.bz2=aa129936fc65ee252a36df3022f4c3b1
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.12/x86_64/ruby-2.2.3.tar.bz2=82b261a8112fd009f3eb8619d8e3a472
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.12/x86_64/ruby-2.2.5.tar.bz2=7f2182fb1ef53b9ef78039338361b9c8
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/10.04/i386/ruby-1.9.3-p194.tar.bz2=bd2374de86a84fa8b909a0580e06b266
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/10.04/i386/ruby-1.9.3-p286.tar.bz2=401de19111fc06be4af42bdcba68e903
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/10.04/i386/ruby-1.9.3-p327.tar.bz2=c525c2cba0f87846f70d08bfd028314b
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/10.04/i386/ruby-1.9.3-p362.tar.bz2=dff3ab746554c295ae19f35aff05e98b
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/10.04/i386/ruby-1.9.3-p374.tar.bz2=50f7bfa2843c38379f4141c894cefa73
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/10.04/i386/ruby-1.9.3-p392.tar.bz2=e25403e598cf81afda9251cc5ea63e6f
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/10.04/i386/ruby-1.9.3-p429.tar.bz2=0b4728f3ffdaa6c4946bb000057d28b4
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/10.04/i386/ruby-1.9.3-p448.tar.bz2=dc2a7c85e427d9a089e3a429348f963f
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/10.04/i386/ruby-1.9.3-p484.tar.bz2=a82a49e755da8c9ca178a3268b10d866
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/10.04/i386/ruby-1.9.3-p545.tar.bz2=a9483a0606cfc094794e189f99f5e18f
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/10.04/i386/ruby-1.9.3-p547.tar.bz2=4407ae4d5597d4fd68fbc7a4d7cecaff
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/10.04/i386/ruby-1.9.3-p551.tar.bz2=f8b91bc9aa28c3e5954a902354d4fd8d
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/10.04/i386/ruby-2.0.0-p0.tar.bz2=e4d87439e6ee3ed028e578d1611bc962
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/10.04/i386/ruby-2.0.0-p195.tar.bz2=d5d60e81b6897397f470be65a2d4d303
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/10.04/i386/ruby-2.0.0-p247.tar.bz2=88893477e3fcdafc5e360a2f63eaeaf4
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/10.04/i386/ruby-2.0.0-p353.tar.bz2=8d18203816ec337958ebcdd575690490
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/10.04/i386/ruby-2.0.0-p451.tar.bz2=60cb4f248136e812dbec83144220c7a8
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/10.04/i386/ruby-2.0.0-p481.tar.bz2=006ddc759b1a404df96e4b4ff6160da8
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/10.04/i386/ruby-2.0.0-p576.tar.bz2=6b0ee517ec2e180339b84abfe0940193
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/10.04/i386/ruby-2.0.0-p598.tar.bz2=2ce0ce8d2e24324cce7726820c6ed04b
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/10.04/i386/ruby-2.1.0.tar.bz2=07606459c843efc4b23d6857c5863706
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/10.04/i386/ruby-2.1.1.tar.bz2=6fb07b7d85ca6d7eb1a775dd31961185
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/10.04/i386/ruby-2.1.2.tar.bz2=a0a00d79b0e030710a2f6275880abf9b
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/10.04/i386/ruby-2.1.3.tar.bz2=515240757133afb702d1e3c0176666a2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/10.04/i386/ruby-2.1.5.tar.bz2=0a80da44572581d650f48c2094d32f53
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/10.04/i386/ruby-2.2.0.tar.bz2=5d16163ace4769919c4f03bbff5809d3
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/10.04/i386/ruby-2.2.1.tar.bz2=f9a5d6d2faae2366a1413a05443b1942
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/10.04/x86_64/ruby-1.9.3-p194.tar.bz2=e6daf85653c842e14bca9248d5643535
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/10.04/x86_64/ruby-1.9.3-p286.tar.bz2=46aa957ed112ad3ea0c3dff1d9f413e9
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/10.04/x86_64/ruby-1.9.3-p327.tar.bz2=aaad5ffefe8ce22d4f499f4c8b15ed38
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/10.04/x86_64/ruby-1.9.3-p362.tar.bz2=7fe09d85a48438e1aab0458eadb8034b
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/10.04/x86_64/ruby-1.9.3-p374.tar.bz2=e8b5b366cb3ee907d471f113081bce4f
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/10.04/x86_64/ruby-1.9.3-p392.tar.bz2=2601d90fd98af5a0b7c293256cdf1432
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/10.04/x86_64/ruby-1.9.3-p429.tar.bz2=9393c5a7e330448f43f1a7de562ed2dc
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/10.04/x86_64/ruby-1.9.3-p448.tar.bz2=2e7e4438b898b33339c5aa628e2b7123
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/10.04/x86_64/ruby-1.9.3-p484.tar.bz2=dd0e1cf11e1181aac924bc3c99062281
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/10.04/x86_64/ruby-1.9.3-p545.tar.bz2=f4fad922e404e29abe277172b3504dd4
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/10.04/x86_64/ruby-1.9.3-p547.tar.bz2=16bb78fca5a7c9cdc7f3803bc123536d
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/10.04/x86_64/ruby-1.9.3-p551.tar.bz2=6f991d8a92004e994f0c2cc561aedaa6
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/10.04/x86_64/ruby-2.0.0-p0.tar.bz2=9aa98b22fae02028609b4e2527099429
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/10.04/x86_64/ruby-2.0.0-p195.tar.bz2=ba9a5af389513b7b27441a20981d77dc
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/10.04/x86_64/ruby-2.0.0-p247.tar.bz2=ea089d9b3b62706ef5bd4b50e077ea39
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/10.04/x86_64/ruby-2.0.0-p353.tar.bz2=59aceed534d3e9bca884801700efe225
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/10.04/x86_64/ruby-2.0.0-p451.tar.bz2=0d8a8cb38662783ce34649745eda2255
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/10.04/x86_64/ruby-2.0.0-p481.tar.bz2=5782d8a122a9f70381805deb68240995
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/10.04/x86_64/ruby-2.0.0-p576.tar.bz2=5acd3909c7691d635325b8357633bf4a
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/10.04/x86_64/ruby-2.0.0-p598.tar.bz2=efd4b998c3347f29c1ec87be130c7d92
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/10.04/x86_64/ruby-2.1.0.tar.bz2=66bf82c476c714567dfde77df4fd7fb6
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/10.04/x86_64/ruby-2.1.1.tar.bz2=1a10830366a9e8f7d5d491c9dba87990
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/10.04/x86_64/ruby-2.1.2.tar.bz2=b187b50731aca5f017963376a0aa4063
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/10.04/x86_64/ruby-2.1.3.tar.bz2=d2f760d4836f37e031e2f8681c1f7920
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/10.04/x86_64/ruby-2.1.5.tar.bz2=10a9aad5907d6e75c596deb05ac9b96a
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/10.04/x86_64/ruby-2.2.0.tar.bz2=389418d05c1d2d8137d9bdd33cabbc9d
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/10.04/x86_64/ruby-2.2.1.tar.bz2=80147d238433a3f3a5a849183c83c2e1
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/11.10/x86_64/ruby-1.9.3-p194.tar.bz2=43bf0907e9eb98c4eceecab8dd9f1344
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/11.10/x86_64/ruby-1.9.3-p286.tar.bz2=97af43b1396a01410d5f8a54cd7579ec
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/11.10/x86_64/ruby-1.9.3-p327.tar.bz2=e3e05138d1d3565cdc3b849fafc94583
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/11.10/x86_64/ruby-1.9.3-p362.tar.bz2=289e6701503c33fbcf26b45bb502ca12
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/11.10/x86_64/ruby-1.9.3-p374.tar.bz2=10d76b94881d02ee0922118645e0ab02
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/11.10/x86_64/ruby-1.9.3-p392.tar.bz2=8a5f826d2ab845e9e614016b7012170a
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/11.10/x86_64/ruby-2.0.0-p0.tar.bz2=51dd19149c13d483ccd6bafc36333ac1
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.04/i386/ruby-1.9.3-p194.tar.bz2=d3776996b7d4a623dd357d78d51eb2af
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.04/i386/ruby-1.9.3-p286.tar.bz2=100da166dc129ab3fd3313350599190a
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.04/i386/ruby-1.9.3-p327.tar.bz2=00186d2614a9225e52aec4d3089d67fe
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.04/i386/ruby-1.9.3-p362.tar.bz2=e30f14d63141e106e55608b089ee7dc4
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.04/i386/ruby-1.9.3-p374.tar.bz2=202a5d7d85f16d52e53da9bf3271c63a
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.04/i386/ruby-1.9.3-p392.tar.bz2=30554c4016d7396a17f223d0800fef01
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.04/i386/ruby-1.9.3-p429.tar.bz2=2d6d1afef853501ba881404275cb35a2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.04/i386/ruby-1.9.3-p448.tar.bz2=6a25f011129dfe34e49127eb43554d67
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.04/i386/ruby-1.9.3-p484.tar.bz2=eb6161b9524357795624e81ca51e29b0
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.04/i386/ruby-1.9.3-p545.tar.bz2=ce4a4550969617f14ae2316d8ba5ba0b
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.04/i386/ruby-1.9.3-p547.tar.bz2=6ccdd46dae4a56c4de05b29f95a5af6b
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.04/i386/ruby-1.9.3-p551.tar.bz2=630298b62ff63401d4abb14bf01a1a0c
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.04/i386/ruby-2.0.0-p0.tar.bz2=cd39c859b49751aa46971a705addb23f
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.04/i386/ruby-2.0.0-p195.tar.bz2=9de9d52b7a6b216f68b78b4a072d4a06
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.04/i386/ruby-2.0.0-p247.tar.bz2=44e3b9cbe9af8d2a7450ada1a1d3616d
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.04/i386/ruby-2.0.0-p353.tar.bz2=3e6d1db77b1a07be55fdcebe397c86f3
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.04/i386/ruby-2.0.0-p451.tar.bz2=f12c2050b09f115e144769f089a8a6cb
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.04/i386/ruby-2.0.0-p481.tar.bz2=80655dcddb5b5487dc30cf9be3b49aab
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.04/i386/ruby-2.0.0-p576.tar.bz2=44594b5bee637abe1a9b24faad294d35
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.04/i386/ruby-2.0.0-p598.tar.bz2=6b152f032b756fba70e18407eb4d0f0b
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.04/i386/ruby-2.1.0.tar.bz2=2c40d547c698c2a27098995040e72337
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.04/i386/ruby-2.1.1.tar.bz2=696b95e37c0f3ae26f50a68d55144fac
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.04/i386/ruby-2.1.2.tar.bz2=b1b734ca8f2c3f684bff25e006174938
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.04/i386/ruby-2.1.3.tar.bz2=66cfc896a3117dc5c27b32c3fdb83fcb
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.04/i386/ruby-2.1.5.tar.bz2=b67a1cb3f718fad3fbc46141e72be79c
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.04/i386/ruby-2.2.0.tar.bz2=2d33dd94378cfe149b6c6edadaae4a0c
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.04/i386/ruby-2.2.1.tar.bz2=0223ae5914af94c947dbe2d1c535caa1
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.04/x86_64/ruby-1.9.3-p194.tar.bz2=e3a0cdb8ab87e793155ada7d9d0c5bc0
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.04/x86_64/ruby-1.9.3-p286.tar.bz2=0ee6e14dfc79b74aaa192df3838ee700
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.04/x86_64/ruby-1.9.3-p327.tar.bz2=aeebd81005968d4b5807ef0ac25db0df
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.04/x86_64/ruby-1.9.3-p362.tar.bz2=83ed9201cb57e253e8b35d28f7b1949b
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.04/x86_64/ruby-1.9.3-p374.tar.bz2=22e1fa6f96118e2ad13f4f89d7fb6d5a
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.04/x86_64/ruby-1.9.3-p392.tar.bz2=045e43ec5e0073f6915624b965957109
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.04/x86_64/ruby-1.9.3-p429.tar.bz2=b52a81a4bb640d8127f48f3e89a40d70
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.04/x86_64/ruby-1.9.3-p448.tar.bz2=8fe402922f9088cb6f0a86365b8cf91e
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.04/x86_64/ruby-1.9.3-p484.tar.bz2=2d1cf81b6901ee0548ca4beefa4e3d2e
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.04/x86_64/ruby-1.9.3-p547.tar.bz2=4bad3281915673532f96a28ccd84fd75
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.04/x86_64/ruby-1.9.3-p551.tar.bz2=52a2afc7f43bea8b04a69f4d01bbd310
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.04/x86_64/ruby-2.0.0-p0.tar.bz2=3052147f8d5ba7f4d01db9a45c2185a4
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.04/x86_64/ruby-2.0.0-p195.tar.bz2=56ce2fbbfe30ec6055903195e39dcec4
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.04/x86_64/ruby-2.0.0-p247.tar.bz2=4709bc674f3727faa39118bab1eb6dbf
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.04/x86_64/ruby-2.0.0-p353.tar.bz2=d14338a893fcf89bb4a37d885a7507aa
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.04/x86_64/ruby-2.0.0-p481.tar.bz2=883d0f532ea82e04638020adfd0bcf59
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.04/x86_64/ruby-2.0.0-p576.tar.bz2=7ab773a83191bdfd8d9e957f8c911bbd
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.04/x86_64/ruby-2.0.0-p598.tar.bz2=e3647faad4d2b8a41855dfb35c05bd4f
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.04/x86_64/ruby-2.1.0.tar.bz2=da87c5d151db70dc50320ee5efa079f9
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.04/x86_64/ruby-2.1.2.tar.bz2=3338e780744829b9f3611f3ff2036dc3
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.04/x86_64/ruby-2.1.3.tar.bz2=261063ec081a2988d2029c48cffe0054
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.04/x86_64/ruby-2.1.5.tar.bz2=2d59afae0d85c6d14ae89423aff39754
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.04/x86_64/ruby-2.2.0.tar.bz2=ae7604b4608903b1dd7eddd4a5f49fed
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.04/x86_64/ruby-2.2.1.tar.bz2=a6d73861ffa3f1dd21501f0de4a17bc1
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.04/x86_64/ruby-2.4.0.tar.bz2=aaa94fc47d72c1c54b9046925728b4b6
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.04/x86_64/ruby-2.4.1.tar.bz2=5d4274218e870aed3e9cc01b523566e0
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.04/x86_64/ruby-2.4.2.tar.bz2=e94804e084db70d63b138936f5ad11af
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.04/x86_64/ruby-2.4.3.tar.bz2=ada2b1e371d5feee8e00bc5a5f419810
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.04/x86_64/ruby-2.4.4.tar.bz2=f675198c446c2b36829debb60e90d812
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.04/x86_64/ruby-2.4.5.tar.bz2=65525ee685b83ba8128e5cd9ed6e40d3
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.04/x86_64/ruby-2.4.6.tar.bz2=a24af24516642d09386bc907cccb8fa7
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.04/x86_64/ruby-2.4.7.tar.bz2=ebc796f1380785f0fd97ce73a6bae41a
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.04/x86_64/ruby-2.4.8.tar.bz2=dba02a096bd490be6f6dd3c920d43b9c
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.04/x86_64/ruby-2.4.9.tar.bz2=ec8ec7af4b3bf6a698c202bd83a56034
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.04/x86_64/ruby-2.4.10.tar.bz2=dd448afcaab707006ff19717f65cf951
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.04/x86_64/ruby-2.5.0.tar.bz2=1f9cbe880e61a695e3dae7dfb4c76de1
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.04/x86_64/ruby-2.5.1.tar.bz2=72d499a66c85ecd380276901212f02e5
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.04/x86_64/ruby-2.5.2.tar.bz2=c29ed227034a9c5bf7ce503d94b95050
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.04/x86_64/ruby-2.5.3.tar.bz2=2355e8c78c81efb15521b3047faa5f53
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.04/x86_64/ruby-2.5.4.tar.bz2=9f434bb9103a02dd33ff48d57c51ea76
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.04/x86_64/ruby-2.5.5.tar.bz2=a0cc16ee869e2707a82115c46f559c9e
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.04/x86_64/ruby-2.5.6.tar.bz2=04a4dacbda5d7970924fac7c490ebbb9
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.04/x86_64/ruby-2.5.7.tar.bz2=a3249d7e8250bc838814178b2fef53e5
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.04/x86_64/ruby-2.5.8.tar.bz2=bceed6c5598b1a6f0dd613612b00702c
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.04/x86_64/ruby-2.6.0.tar.bz2=8a5b2f90309e2f139180ff32d57607be
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.04/x86_64/ruby-2.6.1.tar.bz2=314efd94e8d9c3bb87c22a54d09310b5
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.04/x86_64/ruby-2.6.2.tar.bz2=8760b74ac9285b91d06de90411fa789c
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.04/x86_64/ruby-2.6.3.tar.bz2=fc74b2be87110ce914f94c8913a5e7ea
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.04/x86_64/ruby-2.6.4.tar.bz2=ba407f04e6b62b9a60e24ea54d81dadd
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.04/x86_64/ruby-2.6.5.tar.bz2=b19ccc4812bff55249d81867e1070599
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.04/x86_64/ruby-2.6.6.tar.bz2=3801b5aa44285be922943ff156bce721
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.04/x86_64/ruby-2.7.0.tar.bz2=c6d4429cddea4043e26c8224a6ec521b
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.04/x86_64/ruby-2.7.1.tar.bz2=cf3c72f440c6ec4b44590b6af102411b
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.10/x86_64/ruby-1.9.3-p194.tar.bz2=ab8d6c680db0ce0f2ada9870b2196a5a
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.10/x86_64/ruby-1.9.3-p286.tar.bz2=e3ec337c6185fd3349bac1a9c46f5880
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.10/x86_64/ruby-1.9.3-p327.tar.bz2=a38dde3ed805183ef2ac19be001cd848
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.10/x86_64/ruby-1.9.3-p362.tar.bz2=0d68fe34b17ff947cda407f09956cd62
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.10/x86_64/ruby-1.9.3-p374.tar.bz2=8345d70129f7561aaa1b3c3bdef9c74e
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.10/x86_64/ruby-1.9.3-p392.tar.bz2=7a03015e1c24c5759770f350d3fb0904
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.10/x86_64/ruby-1.9.3-p429.tar.bz2=255edb8771c8c74c64fadb1d17acbec8
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.10/x86_64/ruby-1.9.3-p448.tar.bz2=0147a15c8d7bf61d9f9fe7008f18411e
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.10/x86_64/ruby-1.9.3-p484.tar.bz2=0512ff786375aa27553588df09b0d02e
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.10/x86_64/ruby-1.9.3-p545.tar.bz2=79e192cc5267dd8af866e3bd212610db
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.10/x86_64/ruby-1.9.3-p547.tar.bz2=6ada5d311c22b254b1b6cc5b19f84c0d
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.10/x86_64/ruby-1.9.3-p551.tar.bz2=7f03236a1b2dee336f19460a7b5bd33a
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.10/x86_64/ruby-2.0.0-p0.tar.bz2=a995b01e364830d29295bc90bdbdcdc1
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.10/x86_64/ruby-2.0.0-p195.tar.bz2=de62ea6bdb887ce3008c7ea415aaaf00
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.10/x86_64/ruby-2.0.0-p247.tar.bz2=2603e7a4031ee65cfc0e633745800ec6
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.10/x86_64/ruby-2.0.0-p353.tar.bz2=171057bfa8d0dfd71afae447ef0cc49e
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.10/x86_64/ruby-2.0.0-p451.tar.bz2=f9e49323f9ed628be382c7a51b1eddd0
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.10/x86_64/ruby-2.0.0-p481.tar.bz2=1e60ed9bf20120aaf532c8d7b7814571
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.10/x86_64/ruby-2.0.0-p576.tar.bz2=616469de30be2f720487322eb09a971e
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.10/x86_64/ruby-2.0.0-p598.tar.bz2=4ed3643a9cd09769915659e5fd4b1acc
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.10/x86_64/ruby-2.1.0.tar.bz2=0c5023fc9aa305674ea0f91266a4211c
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.10/x86_64/ruby-2.1.1.tar.bz2=c4e7f2109ad57245610eec81d743b12b
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.10/x86_64/ruby-2.1.2.tar.bz2=3a9da31b18ff3c9859472e0cd66e12bf
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.10/x86_64/ruby-2.1.3.tar.bz2=d8208fae2b601a6f4fda72570a29e6f7
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.10/x86_64/ruby-2.1.5.tar.bz2=0d9f44a6a8dc183b2e0dabdb240146fe
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/13.04/i386/ruby-1.9.3-p429.tar.bz2=8d65645f849e88a3006145833fc25731
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/13.04/i386/ruby-1.9.3-p448.tar.bz2=a9f36dc07f76f88087c247e67d6a6235
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/13.04/i386/ruby-1.9.3-p484.tar.bz2=5053cf455065ff782a6b980bf51dc260
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/13.04/i386/ruby-1.9.3-p545.tar.bz2=2815c3877e548708c5a6eef489cd1a58
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/13.04/i386/ruby-1.9.3-p547.tar.bz2=0a3f6e22564572dae2c0702a031d0e62
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/13.04/i386/ruby-1.9.3-p551.tar.bz2=523a355c5dabca4e1da3a9214d8fc362
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/13.04/i386/ruby-2.0.0-p195.tar.bz2=9b285d301b57bd25d0a50158f7224060
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/13.04/i386/ruby-2.0.0-p247.tar.bz2=b34d2e404c6d538175608a2157d1f887
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/13.04/i386/ruby-2.0.0-p353.tar.bz2=1497089586295d8248747265bda1c0da
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/13.04/i386/ruby-2.0.0-p451.tar.bz2=11d8ac804910ef1ce22df7e9c3e520d8
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/13.04/i386/ruby-2.0.0-p481.tar.bz2=cd65b2d2572f840faf8a0a7566971bf7
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/13.04/i386/ruby-2.0.0-p576.tar.bz2=d6e01f74df250eb00369572a4defcd84
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/13.04/i386/ruby-2.0.0-p598.tar.bz2=1760a7f15f9ff4798e9e3fcb8c36df0b
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/13.04/i386/ruby-2.1.0.tar.bz2=dadd8a67df896dbf60d381fbdd91668a
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/13.04/i386/ruby-2.1.1.tar.bz2=a56114214ea7e16d9c6a9e94f6626b18
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/13.04/i386/ruby-2.1.2.tar.bz2=00eec727677a938eae7dfff7fc27ab4f
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/13.04/i386/ruby-2.1.3.tar.bz2=7d3bf7e450ea9cecc3f30d462de006af
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/13.04/i386/ruby-2.1.5.tar.bz2=363f51ede3df57798a00d6ecf2e91788
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/13.04/x86_64/ruby-1.9.3-p392.tar.bz2=1da1cdf0ad7132dccc419ee5e6417817
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/13.04/x86_64/ruby-1.9.3-p429.tar.bz2=941927833d92edbe336f153c55e69908
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/13.04/x86_64/ruby-1.9.3-p448.tar.bz2=a5eb5d163a7e8a96c7f9878b3a2dfdc2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/13.04/x86_64/ruby-1.9.3-p484.tar.bz2=13126e2844d7564c39c598c24cca130f
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/13.04/x86_64/ruby-1.9.3-p545.tar.bz2=a4432d689d283bd1778f75a0756372e6
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/13.04/x86_64/ruby-1.9.3-p547.tar.bz2=cce83f1950ce786687bec0b5979d5ed6
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/13.04/x86_64/ruby-1.9.3-p551.tar.bz2=4b882815c1a1cc543bd1a5d7bcca48e7
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/13.04/x86_64/ruby-2.0.0-p0.tar.bz2=a67083d106c1c9826f367861ee45aed0
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/13.04/x86_64/ruby-2.0.0-p195.tar.bz2=f4af51b60144b62264fb3e3018c4f62b
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/13.04/x86_64/ruby-2.0.0-p247.tar.bz2=2197c5407cc6ec7d6c21d52ef31bfcc0
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/13.04/x86_64/ruby-2.0.0-p353.tar.bz2=6b7a37fd2c5cc9b2ce603f1013afd71c
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/13.04/x86_64/ruby-2.0.0-p451.tar.bz2=06062291c2b1bf865bdc5a0ca1ea0918
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/13.04/x86_64/ruby-2.0.0-p481.tar.bz2=547f74419caf61a87b9a44a99ab8d6e1
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/13.04/x86_64/ruby-2.0.0-p576.tar.bz2=d266d565b94d73e83c9ef92bba2d133f
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/13.04/x86_64/ruby-2.0.0-p598.tar.bz2=885b8f8687942e820e76bf83ddfc377d
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/13.04/x86_64/ruby-2.1.0.tar.bz2=47e921af0c6b5657ea53a079763c2710
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/13.04/x86_64/ruby-2.1.1.tar.bz2=53a6908399733d73094ba6e3b17208bd
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/13.04/x86_64/ruby-2.1.2.tar.bz2=dae0be6976122b5b9597982ef9dfc2dc
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/13.04/x86_64/ruby-2.1.3.tar.bz2=66846633346bedadc98bfc7b9ee03b59
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/13.04/x86_64/ruby-2.1.5.tar.bz2=32dc49aef048175a1122e7af9d7b948e
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/13.10/x86_64/ruby-1.9.3-p547.tar.bz2=c09e0e1dad6fa3f7f06898d8e2ed3be5
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/13.10/x86_64/ruby-1.9.3-p551.tar.bz2=2389decc618897cf35f18b1d615ae03f
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/13.10/x86_64/ruby-2.0.0-p481.tar.bz2=1f7d8d7f685de746796edb2fb0f3aab0
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/13.10/x86_64/ruby-2.0.0-p576.tar.bz2=c571d3a13097be2e9b8645f226ddf7e5
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/13.10/x86_64/ruby-2.0.0-p598.tar.bz2=c8f42be8f586fead4b043f6050787879
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/13.10/x86_64/ruby-2.1.2.tar.bz2=995cdfd48a25d21ee8a9404a2c0bf3e4
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/13.10/x86_64/ruby-2.1.3.tar.bz2=56e18a9acc542acf8d39dbb613058fbc
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/13.10/x86_64/ruby-2.1.5.tar.bz2=42534aadb3d31881811f01419b578e8a
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/14.04/x86_64/ruby-1.9.3-p547.tar.bz2=b28057020cffb885bfce0115d48838be
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/14.04/x86_64/ruby-1.9.3-p551.tar.bz2=ef7f2cfb521530bf6e9f391d810cab19
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/14.04/x86_64/ruby-2.0.0-p481.tar.bz2=2e372d47c91e9316e0cb20bdd0382f1a
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/14.04/x86_64/ruby-2.0.0-p576.tar.bz2=0ee8d92f9e2c5d7f110f39ce7b982cbd
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/14.04/x86_64/ruby-2.0.0-p598.tar.bz2=bd1aa419ebd57b9fd364ac79dce29191
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/14.04/x86_64/ruby-2.1.0.tar.bz2=9373fa00348bb903002e999367ce4428
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/14.04/x86_64/ruby-2.1.1.tar.bz2=41c4dfd54aaf4db22e6ab2e54cd75697
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/14.04/x86_64/ruby-2.1.2.tar.bz2=bf1798366e1864661b9b53e72f554151
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/14.04/x86_64/ruby-2.1.3.tar.bz2=53ee3a800f99e4c8011f3544a70f67df
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/14.04/x86_64/ruby-2.1.4.tar.bz2=73aedf3fa542445977eafe8ba1c77790
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/14.04/x86_64/ruby-2.1.5.tar.bz2=1a201d082586036092cfc5b79dd26718
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/14.04/x86_64/ruby-2.1.6.tar.bz2=5913a2f52e493fa780669ee84ac3f0ac
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/14.04/x86_64/ruby-2.1.7.tar.bz2=2a6959f54de6a77c68d70a469c5ac8bc
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/14.04/x86_64/ruby-2.1.8.tar.bz2=1773b9b59bd3062e09f5d1ffd7646bed
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/14.04/x86_64/ruby-2.1.9.tar.bz2=de1a366480c14b83631a6d0ee862f801
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/14.04/x86_64/ruby-2.1.10.tar.bz2=97b3b8804949a303f9ad0b453b8c9280
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/14.04/x86_64/ruby-2.2.0.tar.bz2=5237363d121d99da78c15a78a49272f7
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/14.04/x86_64/ruby-2.2.1.tar.bz2=99e6387fc425d0db01b276e60ee23d27
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/14.04/x86_64/ruby-2.2.2.tar.bz2=cd15a1bf39cffae501b524ba34ad75a7
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/14.04/x86_64/ruby-2.2.3.tar.bz2=0801cb6f00448b09e0ee725f087fa233
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/14.04/x86_64/ruby-2.2.4.tar.bz2=05932ee063c5e3e10c9e599624b89ef2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/14.04/x86_64/ruby-2.2.5.tar.bz2=bd4e6ba1b8f878cc3cb39c98ef6ca73e
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/14.04/x86_64/ruby-2.2.6.tar.bz2=53d594a8ac844ef8e386ddb7150bbf3b
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/14.04/x86_64/ruby-2.2.7.tar.bz2=11ba717ec231adf265626a9ba02106e6
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/14.04/x86_64/ruby-2.2.8.tar.bz2=08afbb32bc6838ab6668d8cbc734db33
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/14.04/x86_64/ruby-2.2.9.tar.bz2=0a019a99ac09b17a2e36ecb511b67ed4
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/14.04/x86_64/ruby-2.2.10.tar.bz2=b7494e51fc7eacb81038f95abfa56b8e
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/14.04/x86_64/ruby-2.3.0.tar.bz2=d14ec8e205b77bb06cefd26b1b47e8f1
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/14.04/x86_64/ruby-2.3.1.tar.bz2=00ce2390c2f3aac14caa817afe1773c0
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/14.04/x86_64/ruby-2.3.2.tar.bz2=da0f72cb39d8a72b72d8729c54ca8331
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/14.04/x86_64/ruby-2.3.3.tar.bz2=8596cc4c6f65c45c8ed97249486f6753
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/14.04/x86_64/ruby-2.3.4.tar.bz2=15fe89e253cbe2b48eb78f0bbe1c0a46
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/14.04/x86_64/ruby-2.3.5.tar.bz2=6df2795ad9c30bd7cd6c3bf18e81ec01
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/14.04/x86_64/ruby-2.3.6.tar.bz2=25c91754d206b82c1d444f18c620325c
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/14.04/x86_64/ruby-2.3.7.tar.bz2=5a53a6c85cf9b536cbd2226a839cc48b
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/14.04/x86_64/ruby-2.3.8.tar.bz2=53fef1ef2d3080e3f7a7be05c62e7f51
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/14.04/x86_64/ruby-2.4.0.tar.bz2=b54079037b377d9d2839476a30bafa74
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/14.04/x86_64/ruby-2.4.1.tar.bz2=9ea2f049fc14047e20f09aa17f0fe24e
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/14.04/x86_64/ruby-2.4.2.tar.bz2=8767e88cd1717e2efc4a7bdaa2036b1b
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/14.04/x86_64/ruby-2.4.3.tar.bz2=2b0f8db27e92ad09eec268603a687422
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/14.04/x86_64/ruby-2.4.4.tar.bz2=4b838e0872d6f69a73134df8dd29e9f4
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/14.04/x86_64/ruby-2.4.5.tar.bz2=6e179e274abe2976a07e4f3b3ecb736c
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/14.04/x86_64/ruby-2.4.6.tar.bz2=7d8c651b1be386f163d7f6ffb9e46152
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/14.04/x86_64/ruby-2.4.7.tar.bz2=9be6f845ff36dab622b28cec04499315
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/14.04/x86_64/ruby-2.4.8.tar.bz2=8b81068cd52f213efa1119ef58bef84f
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/14.04/x86_64/ruby-2.4.9.tar.bz2=883214fe300335b8a4166ceab2e5d9d2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/14.04/x86_64/ruby-2.4.10.tar.bz2=89d66460782d81dae90dc1679d95f563
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/14.04/x86_64/ruby-2.5.0.tar.bz2=ec34c626b2b8096fae34b09eaab73dfe
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/14.04/x86_64/ruby-2.5.1.tar.bz2=39e849b9a1384d2bcb7bfdbd74d7aef0
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/14.04/x86_64/ruby-2.5.2.tar.bz2=b31e3dbe733b16becd94f3cdcd3b7a06
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/14.04/x86_64/ruby-2.5.3.tar.bz2=b68b7f7eab3c1939030e1e261f6b1bf9
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/14.04/x86_64/ruby-2.5.4.tar.bz2=c745018aa209787f22dd1c334ed11fc3
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/14.04/x86_64/ruby-2.5.5.tar.bz2=b30036e2925eb4c328fc589a0f2225bc
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/14.04/x86_64/ruby-2.5.6.tar.bz2=f4016383f1dccb966844c42f09ec7999
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/14.04/x86_64/ruby-2.5.7.tar.bz2=e7e2b53f0957b9269e556121a86740dc
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/14.04/x86_64/ruby-2.5.8.tar.bz2=b77eacd12e0079e6abbf4c0060147c40
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/14.04/x86_64/ruby-2.6.0.tar.bz2=3568bc0a7409da46e35360849a46c649
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/14.04/x86_64/ruby-2.6.1.tar.bz2=e02858014b999e1418d7b868b7397b24
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/14.04/x86_64/ruby-2.6.2.tar.bz2=b4949884c04570219ae4d020a24332ea
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/14.04/x86_64/ruby-2.6.3.tar.bz2=9372a20220bb50d91685372e2fd424ef
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/14.04/x86_64/ruby-2.6.4.tar.bz2=911c07ee9fba6d82445bf812dcedee84
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/14.04/x86_64/ruby-2.6.5.tar.bz2=127b8efeeef2b793932814d6599cfa4e
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/14.04/x86_64/ruby-2.6.6.tar.bz2=93efb782a5126fd9f9b3cdf408203c69
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/14.04/x86_64/ruby-2.7.0.tar.bz2=bfd780adf595bae1b62a3d1bb4509673
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/14.04/x86_64/ruby-2.7.1.tar.bz2=2aca144193ecdad128c588bb3ec50ca2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/14.04/x86_64/ruby-2.7.2.tar.bz2=b28af0400378c66a257ab7e2bdc45722
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/14.04/x86_64/ruby-3.0.0-preview1.tar.bz2=79aa27d2147989874a01c1093695a805
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/14.10/x86_64/ruby-1.9.3-p551.tar.bz2=89eb6e2329dcc59375570836a41fb26d
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/14.10/x86_64/ruby-2.0.0-p598.tar.bz2=9f33e9eb6b8f8c30515ccd17394d4300
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/14.10/x86_64/ruby-2.1.5.tar.bz2=57bd1de4797ef8c4b151622a47a10e4a
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/14.10/x86_64/ruby-2.2.0.tar.bz2=e68c9d66cf6309e05056b8e381a9f05c
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/14.10/x86_64/ruby-2.2.1.tar.bz2=30ddde33731e10c38e4857384edca8f2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/16.04/x86_64/ruby-2.0.0-p648.tar.bz2=7c1d6de9b87613abcb9e21fff871352c
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/16.04/x86_64/ruby-2.1.0.tar.bz2=9379ac4dfde8087ddf0cdb5015274e6b
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/16.04/x86_64/ruby-2.1.1.tar.bz2=f565fc095825c45b5a19abfff5609d56
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/16.04/x86_64/ruby-2.1.2.tar.bz2=52fbd7251723038c6570db27d0c56afe
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/16.04/x86_64/ruby-2.1.3.tar.bz2=22cbde066f7c8686837d4e4e214bf4df
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/16.04/x86_64/ruby-2.1.4.tar.bz2=e0ff2e068b376f0db37355954b91468c
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/16.04/x86_64/ruby-2.1.5.tar.bz2=f470ce5b7bce1230a3e35707cc88a473
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/16.04/x86_64/ruby-2.1.6.tar.bz2=859a3b3be3c8de1d23f932429156e601
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/16.04/x86_64/ruby-2.1.7.tar.bz2=c651673627f75bf6a6f3483a9ac59a2c
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/16.04/x86_64/ruby-2.1.8.tar.bz2=b00c812b5279ca119af5967818fc1d49
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/16.04/x86_64/ruby-2.1.9.tar.bz2=2b0cbe2199557e5cd8dc66252fac0d98
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/16.04/x86_64/ruby-2.1.10.tar.bz2=d8efc048e1a66f6445b1a6607c7a63bc
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/16.04/x86_64/ruby-2.2.0.tar.bz2=9e2d569d47f8f3840c347a802b271608
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/16.04/x86_64/ruby-2.2.1.tar.bz2=6b1c6ee4fc726505ad22c0b16404e92c
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/16.04/x86_64/ruby-2.2.2.tar.bz2=5947b564dc3be93113388640747a9e10
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/16.04/x86_64/ruby-2.2.3.tar.bz2=70807938a120b1bc5265d4426543cccd
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/16.04/x86_64/ruby-2.2.4.tar.bz2=d63b41c1072e2dcd97e621a33139e4e2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/16.04/x86_64/ruby-2.2.5.tar.bz2=c2ff70014815b5840f3de53706e37d18
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/16.04/x86_64/ruby-2.2.6.tar.bz2=5884019c484888c2455fef33b300f80c
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/16.04/x86_64/ruby-2.2.7.tar.bz2=abefdec3485bbfff4a4a985c85bf2315
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/16.04/x86_64/ruby-2.2.8.tar.bz2=a2055f46518bd435bd032c359a5bf76c
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/16.04/x86_64/ruby-2.2.9.tar.bz2=8cdc440be6efa45a1cc14d472823bf0f
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/16.04/x86_64/ruby-2.2.10.tar.bz2=8a3e5b9770a09cc510a9671bd88b5140
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/16.04/x86_64/ruby-2.3.0.tar.bz2=928f951e46c85c533fd5f1f6e1210a2f
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/16.04/x86_64/ruby-2.3.1.tar.bz2=0a10f47d0182ca8e3df4fa7017255308
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/16.04/x86_64/ruby-2.3.2.tar.bz2=37e2d33082d944488d8ac1ca03c652b5
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/16.04/x86_64/ruby-2.3.3.tar.bz2=74478a06e4b9ed90475a42c36edd5981
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/16.04/x86_64/ruby-2.3.4.tar.bz2=2b84069dd5b686c81ae01ed721112dd3
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/16.04/x86_64/ruby-2.3.5.tar.bz2=302b062bfc5bc5b7a2df7aabe9cd115b
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/16.04/x86_64/ruby-2.3.6.tar.bz2=4ad3902f1217e3852b32444d9a7d9791
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/16.04/x86_64/ruby-2.3.7.tar.bz2=bcd9744eb90731ce1e99a0484889fb69
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/16.04/x86_64/ruby-2.3.8.tar.bz2=555936c18248c1e868e3bcc277412ba7
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/16.04/x86_64/ruby-2.4.0.tar.bz2=08d064ed710c18bd7dedb11580bb183d
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/16.04/x86_64/ruby-2.4.1.tar.bz2=1e95a7cc99b0b4594c33a2e21780a245
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/16.04/x86_64/ruby-2.4.2.tar.bz2=8da9501c6c99a0e996c5a0387c4a83f7
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/16.04/x86_64/ruby-2.4.3.tar.bz2=9fd63c6e1a4bece21e9de2a54dcb4801
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/16.04/x86_64/ruby-2.4.4.tar.bz2=02802a4834754cd568eb926d5c3b031f
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/16.04/x86_64/ruby-2.4.5.tar.bz2=0adf349d1f27c6dca18fc6e7f084d67f
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/16.04/x86_64/ruby-2.4.6.tar.bz2=c99bd914ebe870720e7b1fb313fde7a1
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/16.04/x86_64/ruby-2.4.7.tar.bz2=f805b9218307befe03217e72f2565722
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/16.04/x86_64/ruby-2.4.8.tar.bz2=de70a4c002f7254ebf50487c0cfdb8cf
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/16.04/x86_64/ruby-2.4.9.tar.bz2=37ce24ce666973d68b6bd47b2a25100a
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/16.04/x86_64/ruby-2.4.10.tar.bz2=01b03f0c5622c7485cdde96909f38eaa
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/16.04/x86_64/ruby-2.5.0.tar.bz2=7cf5ea980164942d4a812cc67445de26
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/16.04/x86_64/ruby-2.5.1.tar.bz2=bc3e80da0f3d787bd3fe2021bf00e5bc
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/16.04/x86_64/ruby-2.5.2.tar.bz2=c0ed3864a5200b3539117309538ca63a
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/16.04/x86_64/ruby-2.5.3.tar.bz2=3402a99f0c296286d992a5d2328f54b4
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/16.04/x86_64/ruby-2.5.4.tar.bz2=c7bcd6882092c06751a76c0b83b95ad0
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/16.04/x86_64/ruby-2.5.5.tar.bz2=d2073ac18fdbc2cae34bded0585eee61
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/16.04/x86_64/ruby-2.5.6.tar.bz2=39b093d15110f5ddd5b209efa662df1f
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/16.04/x86_64/ruby-2.5.7.tar.bz2=dd63a20fe164ea6bda55023dcbe26d67
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/16.04/x86_64/ruby-2.5.8.tar.bz2=0345e3acd59b68b60284773c1da854cc
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/16.04/x86_64/ruby-2.6.0.tar.bz2=27a556b2b6c2b654aa47ba4122432e40
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/16.04/x86_64/ruby-2.6.1.tar.bz2=18b35b2b398ed626b0630ad2964414ce
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/16.04/x86_64/ruby-2.6.2.tar.bz2=b8d254c0ca20c5eba8b05748f63cc5f3
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/16.04/x86_64/ruby-2.6.3.tar.bz2=3ae1bf399e74ef1360990260c1137018
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/16.04/x86_64/ruby-2.6.4.tar.bz2=b50fce574b7e84859b87f323053d4b1f
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/16.04/x86_64/ruby-2.6.5.tar.bz2=f5e3b90ee7fc3a622b0077a0b581e057
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/16.04/x86_64/ruby-2.6.6.tar.bz2=dc58b8ee61b3f42047c6006f2688169f
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/16.04/x86_64/ruby-2.7.0.tar.bz2=bccd28da6673bff560d6c4f04471b791
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/16.04/x86_64/ruby-2.7.1.tar.bz2=34f47de95284ad5b14f8faf22247e4c7
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/16.04/x86_64/ruby-2.7.2.tar.bz2=554222ac3cd1788afaf5029e01b7cfcb
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/16.04/x86_64/ruby-3.0.0-preview1.tar.bz2=e6aef74993bfa500c421fae1034dd3b6
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/16.10/x86_64/ruby-1.9.3-p551.tar.bz2=a04478dbac501036026226018b865129
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/16.10/x86_64/ruby-2.0.0-p648.tar.bz2=3987aa6e901a5982c30403cfafee4908
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/16.10/x86_64/ruby-2.1.5.tar.bz2=d6c1d353c2840e17e22c366e52ddd851
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/16.10/x86_64/ruby-2.1.6.tar.bz2=c214782a854195f2ce63e9d2cf8d2db3
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/16.10/x86_64/ruby-2.1.8.tar.bz2=a36f2ec355c1582053c20d625823c2f9
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/16.10/x86_64/ruby-2.1.9.tar.bz2=79aa449287c003f7eb06330af1e1ff1e
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/16.10/x86_64/ruby-2.2.4.tar.bz2=f21e382f2f788e2480fbdeffad1ccc8e
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/16.10/x86_64/ruby-2.2.5.tar.bz2=93eb667e54ea4e2f2370e472938bc1f2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/16.10/x86_64/ruby-2.2.6.tar.bz2=601f626af6decfa9ad4bdbd6b9156b1f
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/16.10/x86_64/ruby-2.3.0.tar.bz2=26daead0deb97bb7c1ed98edee068353
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/16.10/x86_64/ruby-2.3.1.tar.bz2=2d3cff6fe5978189fc73c0157f602c61
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/16.10/x86_64/ruby-2.3.2.tar.bz2=7573676a86bece578b1177f27dfaa3d5
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/16.10/x86_64/ruby-2.3.3.tar.bz2=5888df148ae5de71ed90ecda158d9ad1
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/17.04/x86_64/ruby-2.1.6.tar.bz2=4367fa1ac264de76dbfe2120d3a9b559
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/17.04/x86_64/ruby-2.1.7.tar.bz2=bfee08462a0a40d63d2625cadab4bc7d
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/17.04/x86_64/ruby-2.1.8.tar.bz2=a33e2b25f14c3f19af293c30ba9b7b6c
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/17.04/x86_64/ruby-2.1.9.tar.bz2=cb6dd6bffb68fb8637e3f2059ad1feb0
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/17.04/x86_64/ruby-2.1.10.tar.bz2=9c7b500f42c67177e220522fcb9d9101
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/17.04/x86_64/ruby-2.2.0.tar.bz2=8665e0e4d4bba33a93b193665c14e945
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/17.04/x86_64/ruby-2.2.1.tar.bz2=2afb54e3ab2443b530725439a7fd7990
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/17.04/x86_64/ruby-2.2.2.tar.bz2=f74a2cd4dc0f48fa46292eb58411d1a9
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/17.04/x86_64/ruby-2.2.3.tar.bz2=62fa590c9e1d216b98e10a56146101e5
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/17.04/x86_64/ruby-2.2.4.tar.bz2=85c92fe9bed193b139cba0f30177a8bf
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/17.04/x86_64/ruby-2.2.5.tar.bz2=25af07701faa1ec0e31812cad9933456
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/17.04/x86_64/ruby-2.2.6.tar.bz2=f087dee968efb4c56bb7c2c95b9ef3b0
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/17.04/x86_64/ruby-2.2.7.tar.bz2=506ef95ba154a3ff2de08fcf2bce10c3
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/17.04/x86_64/ruby-2.2.8.tar.bz2=d71b1c7c08347c1f07f2701e6bfb4681
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/17.04/x86_64/ruby-2.3.0.tar.bz2=3a530cb1fcae2380856635ad49ed4091
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/17.04/x86_64/ruby-2.3.1.tar.bz2=ca08a9eb33548c50e610e3574cabc202
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/17.04/x86_64/ruby-2.3.3.tar.bz2=5cf80d6af8aad67a04d421d5cc95ea10
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/17.04/x86_64/ruby-2.3.4.tar.bz2=b5446e14e22a1e033e6dd471b28d53fa
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/17.04/x86_64/ruby-2.3.5.tar.bz2=0cb7d0e08e7c147b462c7444cf9c7f17
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/17.04/x86_64/ruby-2.4.0.tar.bz2=cbacb4f1d0748888b52890f9ea7b97e9
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/17.04/x86_64/ruby-2.4.1.tar.bz2=95ec227eb51178795ac7722aa3bd724b
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/17.04/x86_64/ruby-2.4.2.tar.bz2=d13c87567cfdc20058af94e67144041f
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/18.04/x86_64/ruby-2.1.0.tar.bz2=c390bf206d64f77766c8c3abec24c2a7
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/18.04/x86_64/ruby-2.1.1.tar.bz2=91773baeedf04c1854d881093e532b88
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/18.04/x86_64/ruby-2.1.2.tar.bz2=f160d406ea31847df50939c24d1d8b07
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/18.04/x86_64/ruby-2.1.3.tar.bz2=4f6eda7e9c8990385a5a809b0b405b0f
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/18.04/x86_64/ruby-2.1.4.tar.bz2=be006111958a9e1e603f43299b202979
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/18.04/x86_64/ruby-2.1.5.tar.bz2=94742ba211dd35c1ce39d05bfc78a514
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/18.04/x86_64/ruby-2.1.6.tar.bz2=a4c52c07a6e74cfa069ada9e33752809
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/18.04/x86_64/ruby-2.1.7.tar.bz2=e8bbd5a47b7eecf74cbcd856789f8ea1
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/18.04/x86_64/ruby-2.1.8.tar.bz2=70a3bb472c1d61a83b380c1a9e419577
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/18.04/x86_64/ruby-2.1.9.tar.bz2=d4c1a5094b7b21bd925caaf72b4c5a20
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/18.04/x86_64/ruby-2.1.10.tar.bz2=06e57a3b96868df25b013dc0dc02ca69
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/18.04/x86_64/ruby-2.2.0.tar.bz2=9a1c1a66f206bb94c6c5ac20ec0a40c0
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/18.04/x86_64/ruby-2.2.1.tar.bz2=98b7a28f649dd24e0f5d0c10c81793a5
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/18.04/x86_64/ruby-2.2.2.tar.bz2=aadb63b8af901625e4951028c80fd92a
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/18.04/x86_64/ruby-2.2.3.tar.bz2=e0264280dd1424d7ecb51e1fda74c11e
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/18.04/x86_64/ruby-2.2.4.tar.bz2=69427baf1549e96663ba69669c991635
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/18.04/x86_64/ruby-2.2.5.tar.bz2=f8bb5e6320461b3fcdb9613aba79d4ac
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/18.04/x86_64/ruby-2.2.6.tar.bz2=f776e97df883393611ab668768b56613
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/18.04/x86_64/ruby-2.2.7.tar.bz2=8c37359c6fb6488786d495aa8123af4d
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/18.04/x86_64/ruby-2.2.8.tar.bz2=be14f201cfdfcb9135d0feeba62a9ac4
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/18.04/x86_64/ruby-2.2.9.tar.bz2=d5537150dc223a3f7776538b01e3c8f6
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/18.04/x86_64/ruby-2.2.10.tar.bz2=bfbd365a2c1bda2ec7c48cf3bbf7aabf
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/18.04/x86_64/ruby-2.3.0.tar.bz2=5b92868017c06f4be8c0e4245417a0ad
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/18.04/x86_64/ruby-2.3.1.tar.bz2=35b5b77a67fa42fbc3aea18029f1c7a0
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/18.04/x86_64/ruby-2.3.2.tar.bz2=712ac0bdc835bacc156c33af87ca2c96
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/18.04/x86_64/ruby-2.3.3.tar.bz2=c492161ced6bed6762c3d4167451f1c3
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/18.04/x86_64/ruby-2.3.4.tar.bz2=1f7f9496307b6c1e5d67b1ddec83ea78
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/18.04/x86_64/ruby-2.3.5.tar.bz2=436c38c4d3b246bc682f7c3921eeb5be
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/18.04/x86_64/ruby-2.3.6.tar.bz2=055ca864df4cda28e7b8b3cc6a06a492
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/18.04/x86_64/ruby-2.3.7.tar.bz2=78cf3caecf5ed03331c8b1cbafbf1eb2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/18.04/x86_64/ruby-2.3.8.tar.bz2=eb54a7f98a5a7c1cf5dfe815271abb1e
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/18.04/x86_64/ruby-2.4.0.tar.bz2=9883c6747cb96321f26f9dc33ff3bd97
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/18.04/x86_64/ruby-2.4.1.tar.bz2=846fd328f6167b8c08c9796e54a6d18a
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/18.04/x86_64/ruby-2.4.2.tar.bz2=6fe31603873e045df6cee5e2abc9af3f
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/18.04/x86_64/ruby-2.4.3.tar.bz2=c121e93b827d9b9fce59e6ca536c315d
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/18.04/x86_64/ruby-2.4.4.tar.bz2=894765a817a52fd4d4334ca7af9513e3
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/18.04/x86_64/ruby-2.4.5.tar.bz2=32fd57846b1041e522af49e613437168
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/18.04/x86_64/ruby-2.4.6.tar.bz2=389cebcb7f816e9fcdd612e1364c6da2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/18.04/x86_64/ruby-2.4.7.tar.bz2=b7bfb61cc723a5051951d96bda3304b7
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/18.04/x86_64/ruby-2.4.8.tar.bz2=89e46d414d7eccc5cc6863da90a999fb
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/18.04/x86_64/ruby-2.4.9.tar.bz2=a2d22f0e8c88878d48ab8ce4dd082e81
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/18.04/x86_64/ruby-2.4.10.tar.bz2=c62b3457b2162e0ebc85e4b7f3941949
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/18.04/x86_64/ruby-2.5.0.tar.bz2=6975c90f7d27a3b7dae181400409fcde
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/18.04/x86_64/ruby-2.5.1.tar.bz2=70f37aa2d14341e6e9af7b8d1b9c4936
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/18.04/x86_64/ruby-2.5.2.tar.bz2=8f56be7a98c12dda9cf920878b3c6c21
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/18.04/x86_64/ruby-2.5.3.tar.bz2=07ebf2f5577eed6dea2ea87228d5623f
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/18.04/x86_64/ruby-2.5.4.tar.bz2=6598b2e182cbc8474b3bcdfc5dffc0ee
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/18.04/x86_64/ruby-2.5.5.tar.bz2=bea688b485a0a904d3f737f92317a8fa
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/18.04/x86_64/ruby-2.5.6.tar.bz2=7e8ccadf6baa8c9177bbd8dcb99bfe89
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/18.04/x86_64/ruby-2.5.7.tar.bz2=ffd69059aa6a31b91ecee817fcfe8b68
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/18.04/x86_64/ruby-2.5.8.tar.bz2=3f2b59843b96bc2e4a9bbd953c33fea4
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/18.04/x86_64/ruby-2.6.0.tar.bz2=a602d4c9b1a51905363c5cdfffa297b7
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/18.04/x86_64/ruby-2.6.1.tar.bz2=873616df4527b304c03a143001710ea6
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/18.04/x86_64/ruby-2.6.2.tar.bz2=92f97f02261d800bf4e047a1ecce82b6
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/18.04/x86_64/ruby-2.6.3.tar.bz2=37929d238ccb7955d5b5abf645eb86ab
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/18.04/x86_64/ruby-2.6.4.tar.bz2=2fba68f2976e827df4fd8abcdc182263
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/18.04/x86_64/ruby-2.6.5.tar.bz2=160cb36e600df0265b20401330b9b5a8
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/18.04/x86_64/ruby-2.6.6.tar.bz2=ea85f316610e2fab7494aca4ed923c11
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/18.04/x86_64/ruby-2.7.0.tar.bz2=ec1f46977ad59ab2d19b0e5b2e0a52db
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/18.04/x86_64/ruby-2.7.1.tar.bz2=e4a3b51c9ebae6a59a46862c47a27b34
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/18.04/x86_64/ruby-2.7.2.tar.bz2=d4ffdd35e8d4790d17271dddd3f37aa1
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/18.04/x86_64/ruby-3.0.0-preview1.tar.bz2=bac846895e3f3bd235871b0ccf17a366
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/19.10/x86_64/ruby-2.4.0.tar.bz2=494942e29d7fc3bdd211239ba6eefe5a
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/19.10/x86_64/ruby-2.4.1.tar.bz2=ba2a1245e0901efdb51e77d84328dd7f
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/19.10/x86_64/ruby-2.4.2.tar.bz2=2e5bee0c0a78845d255a6280700079b1
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/19.10/x86_64/ruby-2.4.3.tar.bz2=8eff04caee532d5fe305b80828deeb18
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/19.10/x86_64/ruby-2.4.4.tar.bz2=950cf5be717f67e27032f74ee9b7b50a
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/19.10/x86_64/ruby-2.4.5.tar.bz2=de685c84c30de17f19ebfe5ef954d85e
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/19.10/x86_64/ruby-2.4.6.tar.bz2=6b74fb9d949f0cc856c2c0392bfd26a5
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/19.10/x86_64/ruby-2.4.7.tar.bz2=9e818fd4bd93f98ee6eae552c5072393
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/19.10/x86_64/ruby-2.4.8.tar.bz2=77105ef5196841d25d8dfbbb70c163b0
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/19.10/x86_64/ruby-2.4.9.tar.bz2=51f48e1e516d6fc8c63195e1619c67c3
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/19.10/x86_64/ruby-2.4.10.tar.bz2=b96bd17d21a7737b4577e6be8affa2f4
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/19.10/x86_64/ruby-2.5.0.tar.bz2=2f9f24948f4d30e2b5623272f0f43c62
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/19.10/x86_64/ruby-2.5.1.tar.bz2=f384304fd892aa5a4ebcfd6ede314f35
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/19.10/x86_64/ruby-2.5.2.tar.bz2=14bea4413c36b459078690d003fc4530
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/19.10/x86_64/ruby-2.5.3.tar.bz2=29a9788efe8e0f1b36a017798dc12ecc
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/19.10/x86_64/ruby-2.5.4.tar.bz2=edf0db535d93b008f75be409e4c98946
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/19.10/x86_64/ruby-2.5.5.tar.bz2=bf0738decc7b9227bacebbed7d97ba78
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/19.10/x86_64/ruby-2.5.6.tar.bz2=d4d92f8aa49d894a987802b8f7814e6e
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/19.10/x86_64/ruby-2.5.7.tar.bz2=efe5dcc5cc88b4cadc2cb285832446fb
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/19.10/x86_64/ruby-2.5.8.tar.bz2=5d3a194259a818dea54b7b621ef87386
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/19.10/x86_64/ruby-2.6.0.tar.bz2=03274650203d5ce5219fc22834cb9e33
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/19.10/x86_64/ruby-2.6.1.tar.bz2=5de9a66505ed57cab0528565e170bfe2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/19.10/x86_64/ruby-2.6.2.tar.bz2=237e88cc4601ae148c346c003851b348
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/19.10/x86_64/ruby-2.6.3.tar.bz2=7165d73c6d0594e191bb64322cb86e74
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/19.10/x86_64/ruby-2.6.4.tar.bz2=f9fc931feb7c62fce4be37fe9021bf08
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/19.10/x86_64/ruby-2.6.5.tar.bz2=0805df8363a8d07c7259645858bf0212
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/19.10/x86_64/ruby-2.6.6.tar.bz2=3784961ef35311274cac83b4f4ec3056
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/19.10/x86_64/ruby-2.7.0.tar.bz2=73063f321a567b5eb12cb82975c5260a
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/19.10/x86_64/ruby-2.7.1.tar.bz2=c90d33cb17de38c68af149d72788da78
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/19.10/x86_64/ruby-2.7.2.tar.bz2=508e6114231bfa467f38cd09ec1f1392
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/19.10/x86_64/ruby-3.0.0-preview1.tar.bz2=c419f043e0160195e01c7e7bd5f1c00b
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/20.04/x86_64/ruby-2.1.0.tar.bz2=3597c93169b75494017e8a107aadc12d
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/20.04/x86_64/ruby-2.1.1.tar.bz2=fd11d47796e7c08a0760c8c2afbb78fc
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/20.04/x86_64/ruby-2.1.2.tar.bz2=a76edd96faa49d6a7ce68796bcd3293f
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/20.04/x86_64/ruby-2.1.3.tar.bz2=e647b0b25349e09f7a5f6049979f279c
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/20.04/x86_64/ruby-2.1.4.tar.bz2=9e1e37e0bde5738de2bffef1087f3f3c
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/20.04/x86_64/ruby-2.1.5.tar.bz2=505649230579c19a5b441193cff4b5c4
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/20.04/x86_64/ruby-2.1.6.tar.bz2=55e0ad8c9c68d4cffcf8da84f980126d
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/20.04/x86_64/ruby-2.1.7.tar.bz2=8a8f4e4efa17939727ff7b65d31e8327
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/20.04/x86_64/ruby-2.1.8.tar.bz2=3b2983ed60a52a8fa8ec1023fef134af
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/20.04/x86_64/ruby-2.1.9.tar.bz2=1a369513e9ecc328d7f4cb4e5c3b8361
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/20.04/x86_64/ruby-2.1.10.tar.bz2=fc86685e5ed6feae1db8da8f4a78da6c
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/20.04/x86_64/ruby-2.2.0.tar.bz2=35f7216ddb43b753b3408334fa0e27c1
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/20.04/x86_64/ruby-2.2.1.tar.bz2=a5ed8baee0b886fe74586818366dddb4
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/20.04/x86_64/ruby-2.2.2.tar.bz2=539d8f898ffdddc00a92209dd14e59d8
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/20.04/x86_64/ruby-2.2.3.tar.bz2=cb9113d5f3fec455bbdf1f651b1829a3
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/20.04/x86_64/ruby-2.2.4.tar.bz2=9ad8b0cc7fee0240c3f697ef8b6c93e2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/20.04/x86_64/ruby-2.2.5.tar.bz2=526799aca827be822e772d5de53cb8b2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/20.04/x86_64/ruby-2.2.6.tar.bz2=60f7b4f4bee2b0ca760b2df70156c634
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/20.04/x86_64/ruby-2.2.7.tar.bz2=dacbe838be290ddcc053062764d2a1e7
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/20.04/x86_64/ruby-2.2.8.tar.bz2=de6bca6bce8059b8f08363f647c6c0c0
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/20.04/x86_64/ruby-2.2.9.tar.bz2=72c9b8d4a19d48d4c54176f58f6176f3
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/20.04/x86_64/ruby-2.2.10.tar.bz2=79a8bf433d8319a34ad8c443b8d32aab
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/20.04/x86_64/ruby-2.3.0.tar.bz2=52005b50d0fdc4191acad31095733afe
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/20.04/x86_64/ruby-2.3.1.tar.bz2=189f474a83aaa3e7f1a12ef6e2dd0d46
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/20.04/x86_64/ruby-2.3.2.tar.bz2=1c2822a1b545dec34ea5d9bc891d863b
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/20.04/x86_64/ruby-2.3.3.tar.bz2=66e88ec5b93c730b205dc1915c3817f3
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/20.04/x86_64/ruby-2.3.4.tar.bz2=22f71aae51742bb7c4545ba4b543d281
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/20.04/x86_64/ruby-2.3.5.tar.bz2=52cdcb424b4c29868bcb0415dc6800cf
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/20.04/x86_64/ruby-2.3.6.tar.bz2=563e406cb9e6877f3fd407996094e285
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/20.04/x86_64/ruby-2.3.7.tar.bz2=ec657c2cbf0d007bf08a3cd4966dfc74
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/20.04/x86_64/ruby-2.3.8.tar.bz2=fc8d9a43176a0e8d417a5bf591ac5a24
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/20.04/x86_64/ruby-2.4.0.tar.bz2=3aecd4c9e10d785ea02f061a3d23ef4f
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/20.04/x86_64/ruby-2.4.1.tar.bz2=1b83408afb875f75f601a2df4561b5ba
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/20.04/x86_64/ruby-2.4.2.tar.bz2=b226f7e1519b647916c6f4c644d2aa76
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/20.04/x86_64/ruby-2.4.3.tar.bz2=3ed590b52d0b2169632c000775bf42a6
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/20.04/x86_64/ruby-2.4.4.tar.bz2=4215fda256b8e85af09a0280df7ff6c9
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/20.04/x86_64/ruby-2.4.5.tar.bz2=dca93c0453d9520f463cdc402bee5c1b
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/20.04/x86_64/ruby-2.4.6.tar.bz2=c6bf82998ca467e5c3fc10508d3e88ba
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/20.04/x86_64/ruby-2.4.7.tar.bz2=3d8108f21c103ba7d9af83a0489bfc7b
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/20.04/x86_64/ruby-2.4.8.tar.bz2=ab70a3ca42220b575d6beccf9e0bc25b
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/20.04/x86_64/ruby-2.4.9.tar.bz2=ff66ffe02c21d2163a4db3b4daeaa13d
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/20.04/x86_64/ruby-2.4.10.tar.bz2=5c4c43e0fd5435099adc86c9985dd4c4
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/20.04/x86_64/ruby-2.5.0.tar.bz2=c66bd4ed120999159fba088549c755cf
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/20.04/x86_64/ruby-2.5.1.tar.bz2=5a8c6a0955be75e5d461624b596a08e2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/20.04/x86_64/ruby-2.5.2.tar.bz2=0071aeae2ad582f89c4704531d0e7a5d
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/20.04/x86_64/ruby-2.5.3.tar.bz2=5da9cf19b005948398f3541a1ded7105
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/20.04/x86_64/ruby-2.5.4.tar.bz2=a27a413146d903d258fe9fc907e60c1a
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/20.04/x86_64/ruby-2.5.5.tar.bz2=77794ae2fb09dca79bfb636198ccaaed
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/20.04/x86_64/ruby-2.5.6.tar.bz2=565f3c0dbc3211c6f86ebcb60cbd5de7
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/20.04/x86_64/ruby-2.5.7.tar.bz2=5cc60a18ac4cca5322994c6d19753846
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/20.04/x86_64/ruby-2.5.8.tar.bz2=45b547a987088761a88143e5fabef13e
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/20.04/x86_64/ruby-2.6.0.tar.bz2=032a73d5182d84cbbf20b6e7e310c7c2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/20.04/x86_64/ruby-2.6.1.tar.bz2=07c61bc0c9e09fc87808f62985cbff25
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/20.04/x86_64/ruby-2.6.2.tar.bz2=62745ec761a45826841002e72cfca795
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/20.04/x86_64/ruby-2.6.3.tar.bz2=538383cc35e5710a2175f36416ca3b7c
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/20.04/x86_64/ruby-2.6.4.tar.bz2=8a17255fa833fe3ff9c0275db79bfbff
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/20.04/x86_64/ruby-2.6.5.tar.bz2=66dc3fdf49b1371fd6d362f3ea9d019b
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/20.04/x86_64/ruby-2.6.6.tar.bz2=873b63cc2e4abbb6ec5126ab07ce429a
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/20.04/x86_64/ruby-2.7.0.tar.bz2=fba1bf0b819f52561deab198fd36743d
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/20.04/x86_64/ruby-2.7.1.tar.bz2=3ec8f383026889e2f3c328d86839a7b2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/20.04/x86_64/ruby-2.7.2.tar.bz2=9c3775365cab8e1e82aa19e87b9711dd
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/20.04/x86_64/ruby-3.0.0.tar.bz2=ea7767cbfacd744813ccaedd1b4e0013
ironruby-1.0.zip=7a92888837b3507355ed391dbfc0ab83
ironruby-1.1.3.zip=4f2af6253a459cc054d6c55956e514a9
jruby-bin-1.3.1.tar.gz=4a95db8fc93ed7219663fbede98b6117
jruby-bin-1.4.tar.gz=54dba9a88b2b3f99ac86a79828d0178b
jruby-bin-1.4.0.tar.gz=f37322c18e9134e91e064aebb4baa4c7
jruby-bin-1.4.0.zip=3a9c8a5115a679da7d7a49a56d57d4c0
jruby-bin-1.4.1.tar.gz=a4aa8c43d1b9ffd9dbc6cb738d55a034
jruby-bin-1.5.0.tar.gz=ee2b4e326e8b87858e5dd0c8e94102e6
jruby-bin-1.5.1.tar.gz=74251383e08e8c339cacc35a7900d3af
jruby-bin-1.5.2.tar.gz=d239deb9a108a6abbfbd6cb79cf8255b
jruby-bin-1.5.3.tar.gz=ccb0b2dbc300d8dd4ad1bd4da48b8320
jruby-bin-1.5.5.tar.gz=8e00f7d40cbf221f733d6f7a15784e9a
jruby-bin-1.5.6.tar.gz=94033a36517645b7a7ec781a3507c654
jruby-bin-1.6.0.tar.gz=f4d7e339dfc0fbaef5b878d1c0a66fbe
jruby-bin-1.6.2.tar.gz=a46f978c24a208717023bb4b8995c678
jruby-bin-1.6.3.tar.gz=694b80e4eea784cdc1eb39fb1e3132c9
jruby-bin-1.6.4.tar.gz=0e96b6f4d1c6f12b5ac480cd7ab7da78
jruby-bin-1.6.5.tar.gz=54354082673bd115f945890dc6864413
jruby-bin-1.6.5.1.tar.gz=246a7aa2b7d7e6e9e8a0c2e282cbcfd0
jruby-bin-1.6.7.tar.gz=fd1b8d7389aa92da69ea6efb4782e40a
jruby-bin-1.6.7.2.tar.gz=1e520f1b5130114464e5f1950cb24774
jruby-bin-1.6.8.tar.gz=a76ac5845640e4a1ebdfa74421efc935
jruby-bin-1.7.0.preview1.tar.gz=7b9e5e1cd0d818d0199086d948f948b4
jruby-bin-1.7.0.preview2.tar.gz=e8f1623759590aadbf49e4cc53f1cb61
jruby-bin-1.7.0.RC1.tar.gz=bdddcee3d126cddd9a85b5a066a7e25e
jruby-bin-1.7.0.RC2.tar.gz=ffe2dd61711f4574fed344af151e5de5
jruby-bin-1.7.0.tar.gz=21861e0ecdbf48cda713c8ade82fdddb
jruby-bin-1.7.1.tar.gz=86e659863541d8b987cb7bfbe3b4cfb0
jruby-bin-1.7.2.tar.gz=6ec9293b6dffd1e8ee57e9b7c6d18cbe
jruby-bin-1.7.3.tar.gz=f0adf8ccee6f6777f7ab8e5e1d7a1f47
jruby-bin-1.7.4.tar.gz=c6a56eae78db28dddba911ccd0848c32
jruby-bin-1.7.5.tar.gz=c2a28c43c8095127d4a4aee0cf9b1439
jruby-bin-1.7.6.tar.gz=5d10011516a3d3bde10209b60cfcc0ef
jruby-bin-1.7.7.tar.gz=9d6df2188fa57f12bf6fde4e4b2e3f09
jruby-bin-1.7.8.tar.gz=1e68f39d6dba7b6d9db81e24bb6b7d0a
jruby-bin-1.7.9.tar.gz=b2e44f1f44837c07068ee453a89f4b55
jruby-bin-1.7.10.tar.gz=c84fe9245a73f9cd29f56343b7d2e39a
jruby-bin-1.7.11.tar.gz=d6e6ab72426fa7fdc9ae55950980d877
jruby-bin-1.7.12.tar.gz=2073aa6dfc7c701ef7c3d3143d181582
jruby-bin-1.7.14.tar.gz=bc33284f27a3508a70d2ade100a2f6bd
jruby-bin-1.7.15.tar.gz=92e63cffcb86842511aeeed95bdf96ed
jruby-bin-1.7.16.tar.gz=92cb058d1a896257b5ac1c26dc433506
jruby-bin-1.7.16.1.tar.gz=eec2f0e03560bacf02a09c0096a99cad
jruby-bin-1.7.16.2.tar.gz=cd31909b67239c5c6a795521fca5c239
jruby-bin-1.7.17.tar.gz=8b78ba1acdb718431f71c38287c07967
jruby-bin-1.7.18.tar.gz=aa7286140be0f6f60534ebffededc708
jruby-bin-1.7.19.tar.gz=bc38596757d8000d6ca4c4c3f8eacea6
jruby-bin-1.7.20.tar.gz=0c2adc160cb85c888b269e8ac4f886fc
jruby-bin-1.7.21.tar.gz=bc91594072032023d146f330764d3274
jruby-bin-1.7.22.tar.gz=1da904bf41d362d0d0b366d9e781168f
jruby-bin-1.7.23.tar.gz=41e3f45c28c94a275f9eeb22721da35d
jruby-bin-1.7.25.tar.gz=fc43ead73f657f5261428923974fd605
jruby-bin-1.7.26.tar.gz=4ca60264a9560f37fdba8108543e72c2
jruby-bin-1.7.27.tar.gz=b98b0a2c52e885a868a2b60092e1cd3d
jruby-bin-9.0.0.0.pre1.tar.gz=d5c8b30648348aa883f893d464d46bf1
jruby-bin-9.0.0.0.pre2.tar.gz=86994a9d7ed2cf318c75392623a3e6da
jruby-bin-9.0.0.0.tar.gz=fe9036ea69bf23dc3b69cfc94adb5404
jruby-bin-9.0.1.0.tar.gz=a82bc640e0080b1d9a21d1477c8400e3
jruby-bin-9.0.3.0.tar.gz=828dd6c6dd18e5b186ccfd65753077bd
jruby-bin-9.0.4.0.tar.gz=645bf4a1dcde3f19dc0fff75c8b4b685
jruby-bin-9.0.5.0.tar.gz=1d2dc649cbacbe26418ef3ba421018b1
jruby-bin-9.1.0.0.tar.gz=fe26e6308d006d35eb613cdd47d1dc99
jruby-bin-9.1.1.0.tar.gz=8356334270df07a214590d00a986837b
jruby-bin-9.1.2.0.tar.gz=749bb917dde9666e365e12bbe776a5c2
jruby-bin-9.1.3.0.tar.gz=91c246cd623702032e88283565da5480
jruby-bin-9.1.4.0.tar.gz=5b80b78c09bf0cd4dcbcb9e1fe3e8b73
jruby-bin-9.1.5.0.tar.gz=e9b2cc44757db4cfbe7da79601d0169a
jruby-bin-9.1.6.0.tar.gz=4092a89b01b55d1fb5498113f97ab0ca
jruby-bin-9.1.7.0.tar.gz=b120c3eaeef7ff2aed3a57701e414e78
jruby-bin-9.1.8.0.tar.gz=0fdee002c56ec91dff1efffce205265c
jruby-bin-9.1.9.0.tar.gz=170efc34297d7ac2a56bb1163e96b363
jruby-bin-9.1.10.0.tar.gz=b75e0d1a200e8f790d8bbc84f91e3002
jruby-bin-9.1.11.0.tar.gz=0502a14141da25a460ce197720bab4c3
jruby-bin-9.1.12.0.tar.gz=74bd7ae08c159fc62cb6f64845a868cc
jruby-bin-9.1.13.0.tar.gz=6c642c8a2653a585779f453d8c843fd7
jruby-bin-9.1.14.0.tar.gz=a7e0ecd529690025d327c45744f60fa4
jruby-bin-9.1.15.0.tar.gz=01c29690324d7eb414fba66e4c009c9e
jruby-bin-9.1.16.0.tar.gz=e64c3aa1310c272194fd1750b0b79fac
jruby-bin-9.1.17.0.tar.gz=f28d1fcbb60e550f3abd839102ad0069
jruby-bin-9.2.0.0.tar.gz=bd476da4bed39ffcfff7116f448a5365
jruby-bin-9.2.1.0.tar.gz=4b78b0a40ca541556f5ee75a815e0be0
jruby-bin-9.2.2.0.tar.gz=be678559801be029fe233c33396e34d2
jruby-bin-9.2.3.0.tar.gz=79328ab1ed37d612da35271183e46bbd
jruby-bin-9.2.4.0.tar.gz=f538f2be459f0f0e517a53446e78a354
jruby-bin-9.2.4.1.tar.gz=d373bbc2bd6caabfcc9914c4067e9d24
jruby-bin-9.2.5.0.tar.gz=14582fd6eee19610f0a7433ce5dd5ce4
jruby-bin-9.2.6.0.tar.gz=dba182ac9943b726b609ca61747c1835
jruby-bin-9.2.7.0.tar.gz=c0111b2cafa920df76284044e1aeedc7
jruby-bin-9.2.8.0.tar.gz=7d652b586a18f1c665289fd7e6edf4f5
jruby-bin-9.2.9.0.tar.gz=74b3451f79c13c2fc66c6dee69d46699
jruby-bin-9.2.10.0.tar.gz=e6ce97eae6e35b622c1b572f9297705b
jruby-bin-9.2.11.0.tar.gz=22b003adfb03b253721cc85db248698f
jruby-bin-9.2.11.1.tar.gz=687586132f7b649b1bdd7b823577c9d8
jruby-bin-9.2.12.0.tar.gz=cc7599837fbd0839cce7293577a34f2c
jruby-bin-9.2.13.0.tar.gz=99df4eb89f88c7582bfe7c313daec7b4
jruby-bin-9.2.14.0.tar.gz=421c5b8146701177a738a0a691190018
libiconv-1.13.1.tar.gz=7ab33ebd26687c744a37264a330bbe9a
MacRuby%200.5.zip=675454a8c7bc19d606d90a726e08427c
MacRuby%200.6.zip=a80afd3700c88cf95c539fc63b272faf
MacRuby%200.7.1.zip=e8245dcd03c0757dfae7e6fee913947a
MacRuby%200.7.zip=0bb60588c9ec9b1517665743bb05132f
MacRuby%200.8.zip=735ac0a70f539e00b5de6fbec09c2c5c
MacRuby%200.9.zip=fa01345e8fbfee620bbac64743a45f69
MacRuby%200.10.zip=1662d13d2f73cfc26258598f6988dcbc
MacRuby%200.11.zip=b0cc23d60484a07012bcad549cef6054
MacRuby%200.12.zip=e1c5fa1b007a1cdc38c527a47302bf5e
MagLev-1.0.0.tar.gz=e02cb8ee04438451eb78df14f91a68a9
MagLev-1.1beta.tar.gz=d542c7af290ce3b588b57629906b19e9
MagLev-1.1beta2.tar.gz=0ef88d5d145611aef324cb51be0aaafd
MagLev-1.1RC1.tar.gz=41f4a0994daf1e5271cbd0ebe57816f4
MagLev-1.2Alpha.tar.gz=5c7dd3acef9dbddc0829bb1daa087abb
MagLev-1.2Alpha2.tar.gz=cbbeae109854a6bf107a747a93fd478b
MagLev-1.2Alpha3.tar.gz=b7470518f2b697eb1a5a39eff9b6d749
MagLev-1.2Alpha4.tar.gz=d54f04a611ce838b9d7009627065b7ca
mruby-1.0.0.tar.gz=d9aec6a20fc1add65ee07ff6cf0e1ef2
mruby-1.1.0.tar.gz=60d75ea704c9285f3c80b3ad1d2b68de
mruby-1.2.0.tar.gz=b5a3b7962d9db8cb8fb8105aa914d16c
mruby-1.3.0.tar.gz=9714dd2804064d0043e099b7211d72b9
mruby-1.4.0.tar.gz=25efc35511070454074b36863c4d5b5e
mruby-1.4.1.tar.gz=b40bf09af3f4c6e2bc443b9ac803a3ad
mruby-2.0.0.tar.gz=b86c6a1dd86cb4ebe51e3fe38964a830
mruby-2.0.1.tar.gz=15b426a8a94a610c45414578786d05e3
mruby-2.1.0-rc.tar.gz=58a85fcb102d72900a25190da670e01d
mruby-2.1.0.tar.gz=c01a4bbf62e6f5765c70b8813e0ce7da
mruby-2.1.1-rc.tar.gz=809edd80e680855e7c4cf3c569972f28
mruby-2.1.1-rc2.tar.gz=24879fa5eb587f9415f03f8f3701842e
mruby-2.1.1.tar.gz=c0ee4a112695046b9e4f177e31096d6c
ncurses.tar.gz=cce05daf61a64501ef6cd8da1f727ec6
openssl-0.9.8k.tar.gz=e555c6d58d276aec7fdc53363e338ab3
openssl-0.9.8n.tar.gz=076d8efc3ed93646bd01f04e23c07066
openssl-1.0.1c.tar.gz=ae412727c8c15b67880aef7bd2999b2e
openssl-1.0.1i.tar.gz=c8dc151a671b9b92ff3e4c118b174972
pkg-config-0.23.tar.gz=d922a88782b64441d06547632fd85744
readline-5.2.tar.gz=e39331f32ad14009b9ff49cc10c5e751
readline-6.0.tar.gz=b7f65a48add447693be6e86f04a63019
readline-6.2.tar.gz=67948acb2ca081f23359d0256e9a271c
release-2.0.0-rc1.zip=b05b5e3c2712a294e4b09ebf450c1bfe
rubinius-1.0.0-20100514.tar.gz=b05f4e791d3712c5a50b3d210dac6eb0
rubinius-1.0.1-20100603.tar.gz=eb185703c7ae0c0210e8dcb7f783ee8e
rubinius-1.1.0-20100923.tar.gz=e2ae16238b201de09975abe19da09ea9
rubinius-1.1.1-20101116.tar.gz=b39f618eeba37c3aff215da8bca55fd7
rubinius-1.2.0-20101221.tar.gz=4284c2660f1f648942de35d4fc871f70
rubinius-1.2.1-20110215.tar.gz=e4a5127480062fddddc7ce2860b3b813
rubinius-1.2.2-20110222.tar.gz=59124378fb7ee040e9ee4e4736d89fc0
rubinius-1.2.3-20110315.tar.gz=9782dab18c2dd440af6b76e8eb5bc0f0
rubinius-1.2.4-20110705.tar.gz=403c777d19b3553e9cb36701fe002c5e
rubinius-1.3.2.tar.bz2=64801ad8dd4e5e4fcb74ff313fec0a69
rubinius-1.3.3.tar.bz2=79f1f860ed8242257bd7f3e88c81a197
rubinius-1.4.1.tar.bz2=76b840405d4b9303261c27cf15002386
rubinius-2.0.0.tar.bz2=62e379e044c822b81e7b20a27daf133e
rubinius-2.1.0.tar.bz2=908053f38fd840c75a93aab7487c20a5
rubinius-2.1.1.tar.bz2=6b4df0caec5ea88373e113f97a3b4c72
rubinius-2.2.0.tar.bz2=f1fbc6f3baf1da5ad86b3858f30f3349
rubinius-2.2.2.tar.bz2=ac70d629ea43525d91e81f4ccf135299
rubinius-2.2.3.tar.bz2=d9978cf1a4e8f0310db63e49834f9837
rubinius-2.2.4.tar.bz2=c10699da85a8eb5861a37b29077213bd
rubinius-2.2.5.tar.bz2=5996dc8529b2ffe5921c5e7020bee20e
rubinius-2.2.6.tar.bz2=85339bb6dd525eee719edf0551868f56
rubinius-2.2.7.tar.bz2=de2e6f4c3bd9a90bcb89f2ea27ddee9e
rubinius-2.2.8.tar.bz2=c4db1ffb8dbdf864240cabe8b7758b49
rubinius-2.2.9.tar.bz2=0bf87ba617fa989e47d20942410028af
rubinius-2.2.10.tar.bz2=8680da7eb921e6f595a1d716915ca7e0
rubinius-2.3.0.tar.bz2=e003a30af6689c8198116b3405d09d8e
rubinius-2.4.0.tar.bz2=62391a51f49820daa51463066c3ce007
rubinius-2.4.1.tar.bz2=7758721b6e848387c3943ddb9ebd9479
rubinius-2.5.0.tar.bz2=178baa1ad172df0801765ea93bc36d87
rubinius-2.5.1.tar.bz2=77e1b87dc357691ad44b561a5f45c188
rubinius-2.5.2.tar.bz2=e5973d6e0a16f0390dc2a7478db83ff5
rubinius-2.5.3.tar.bz2=b19709eb3fa9e05b3fa6a357b33e3b5b
rubinius-2.5.4.tar.bz2=64587916e5d445ed9bc630017a04498e
rubinius-2.5.5.tar.bz2=ef671bbab50cbe2f70f953c491311261
rubinius-2.5.6.tar.bz2=597e4b049f49966c646faf699856c1b9
rubinius-2.5.7.tar.bz2=9a7f404019bce9fc34a7af7feb7cbb74
rubinius-2.5.8.tar.bz2=a24520892cada1f660e719a25abf63e3
ruby-1.8.5-p115.tar.bz2=03955e3c367b9beb3efe144c9f00d689
ruby-1.8.5-p115.tar.gz=20ca6cc87eb077296806412feaac0356
ruby-1.8.5-p231.tar.bz2=327f5aa6573787432222e96195cffd1e
ruby-1.8.5-p231.tar.gz=e900cf225d55414bffe878f00a85807c
ruby-1.8.6-p286.tar.bz2=e6b6bf8f34370e433936adb7a7065e63
ruby-1.8.6-p286.tar.gz=797ea136fe43e4286c9362ee4516674e
ruby-1.8.6-p287.tar.bz2=80b5f3db12531d36e6c81fac6d05dda9
ruby-1.8.6-p287.tar.gz=6ff3420094711266c3201a0c7c2faa38
ruby-1.8.6-p369.tar.bz2=c3c1f3dd0dfbd2e17a04e59c2f12cfc8
ruby-1.8.6-p369.tar.gz=8c140ae28b4c3947b92dfad69109d90b
ruby-1.8.6-p383.tar.bz2=a48703cd982b9f0e3002700a50b0e88e
ruby-1.8.6-p383.tar.gz=4f49544d4a4d0d34e9d86c41e853db2e
ruby-1.8.6-p398.tar.bz2=fbd43dc44ee26be4d37e6bebbed6f8bd
ruby-1.8.6-p398.tar.gz=736db5f56c2d9b0136e563d049249fa8
ruby-1.8.6-p399.tar.bz2=f77c307cb72fb8808b0e85af5d05cefc
ruby-1.8.6-p399.tar.gz=c3d16cdd3c1ee8f3b7d1c399d4884e33
ruby-1.8.6-p420.tar.bz2=1c7a978e9ffd4f56dc2ad74bbd2c34f3
ruby-1.8.6-p420.tar.gz=ca1eee44f842e93b5098bc5a2bb9a40b
ruby-1.8.7-p160.tar.bz2=f8ddb886b8a81cf005f53e9a9541091d
ruby-1.8.7-p160.tar.gz=945398f97e2de6dd8ab6df68d10bb1a1
ruby-1.8.7-p174.tar.bz2=88c45aaf627b4404e5e4273cb03ba2ee
ruby-1.8.7-p174.tar.gz=18dcdfef761a745ac7da45b61776afa5
ruby-1.8.7-p248.tar.bz2=37e19d46b7d4b845f57d3389084b94a6
ruby-1.8.7-p248.tar.gz=60a65374689ac8b90be54ca9c61c48e3
ruby-1.8.7-p249.tar.bz2=37200cc956a16996bbfd25bb4068f242
ruby-1.8.7-p249.tar.gz=d7db7763cffad279952eb7e9bbfc221c
ruby-1.8.7-p299.tar.bz2=244439a87d75ab24170a9c2b451ce351
ruby-1.8.7-p299.tar.gz=43533980ee0ea57381040d4135cf9677
ruby-1.8.7-p302.tar.bz2=a6a9e37079ed8cf8726b455dad3de939
ruby-1.8.7-p302.tar.gz=a6a9e37079ed8cf8726b455dad3de939
ruby-1.8.7-p330.tar.bz2=2689719fb42c8cf0aa336f8c8933f413
ruby-1.8.7-p330.tar.gz=50a49edb787211598d08e756e733e42e
ruby-1.8.7-p334.tar.bz2=2f14f604bf981bb938ab5fc8b09eb1a6
ruby-1.8.7-p334.tar.gz=aacb6ee5dfe2367682bba56af7f415b8
ruby-1.8.7-p352.tar.bz2=0c61ea41d1b1183b219b9afe97f18f52
ruby-1.8.7-p352.tar.gz=0c33f663a10a540ea65677bb755e57a7
ruby-1.8.7-p357.tar.bz2=3abd9e2a29f756a0d30c7bfca578cdeb
ruby-1.8.7-p357.tar.gz=b2b8248ff5097cfd629f5b9768d1df82
ruby-1.8.7-p358.tar.bz2=de35f00997f4ccee3e22dff0f2d01b8a
ruby-1.8.7-p370.tar.bz2=1e4c3194537dd8ff92e756993e55a29d
ruby-1.8.7-p371.tar.bz2=c27526b298659a186bdb5107fcec2341
ruby-1.8.7-p371.tar.gz=653f07bb45f03d0bf3910491288764df
ruby-1.8.7-p374.tar.bz2=83c92e2b57ea08f31187060098b2200b
ruby-1.8.7-p374.tar.gz=b72a0bc5b824398537762e5272bbb8dc
ruby-1.9.0.tar.bz2=17eb66ac3721340d21db352d8f5dec76
ruby-1.9.1-p129.tar.bz2=6fa62b20f72da471195830dec4eb2013
ruby-1.9.1-p129.tar.gz=c71f413514ee6341c627be2957023a5c
ruby-1.9.1-p243.tar.bz2=66d4f8403d13623051091347764881a0
ruby-1.9.1-p243.tar.gz=515bfd965814e718c0943abf3dde5494
ruby-1.9.1-p376.tar.bz2=e019ae9c643c5efe91be49e29781fb94
ruby-1.9.1-p376.tar.gz=ebb20550a11e7f1a2fbd6fdec2a3e0a3
ruby-1.9.1-p378.tar.bz2=5922459622a23612eb9b68a3586cb5f8
ruby-1.9.1-p378.tar.gz=9fc5941bda150ac0a33b299e1e53654c
ruby-1.9.1-p429.tar.bz2=09df32ae51b6337f7a2e3b1909b26213
ruby-1.9.1-p429.tar.gz=0f6d7630f26042e00bc59875755cf879
ruby-1.9.1-p431.tar.bz2=03179138ae95dbfae872ef49e9cc6da7
ruby-1.9.1-p431.tar.gz=23f28cffc007ed5ac72c8e9bec6837ce
ruby-1.9.2-p0.tar.bz2=d8a02cadf57d2571cd4250e248ea7e4b
ruby-1.9.2-p0.tar.gz=755aba44607c580fddc25e7c89260460
ruby-1.9.2-p136.tar.bz2=52958d35d1b437f5d9d225690de94c13
ruby-1.9.2-p136.tar.gz=6e17b200b907244478582b7d06cd512e
ruby-1.9.2-p180.tar.bz2=68510eeb7511c403b91fe5476f250538
ruby-1.9.2-p180.tar.gz=0d6953820c9918820dd916e79f4bfde8
ruby-1.9.2-p290.tar.bz2=096758c3e853b839dc980b183227b182
ruby-1.9.2-p290.tar.gz=604da71839a6ae02b5b5b5e1b792d5eb
ruby-1.9.2-p318.tar.bz2=be431c6cbfa27e3836a06c6315717747
ruby-1.9.2-p318.tar.gz=cc7bf1025128e1985882ae243f348802
ruby-1.9.2-p320.tar.bz2=b226dfe95d92750ee7163e899b33af00
ruby-1.9.2-p320.tar.gz=5ef5d9c07af207710bd9c2ad1cef4b42
ruby-1.9.2-p330.tar.bz2=8ba4aaf707023e76f80fc8f455c99858
ruby-1.9.2-p330.tar.gz=4b9330730491f96b402adc4a561e859a
ruby-1.9.3-p0.tar.bz2=65401fb3194cdccd6c1175ab29b8fdb8
ruby-1.9.3-p0.tar.gz=8e2fef56185cfbaf29d0c8329fc77c05
ruby-1.9.3-p125.tar.bz2=702529a7f8417ed79f628b77d8061aa5
ruby-1.9.3-p125.tar.gz=e3ea86b9d3fc2d3ec867f66969ae3b92
ruby-1.9.3-p194.tar.bz2=2278eff4cfed3cbc0653bc73085caa34
ruby-1.9.3-p194.tar.gz=bc0c715c69da4d1d8bd57069c19f6c0e
ruby-1.9.3-p286.tar.bz2=e76848a86606a4fd5dcf14fc4b4e755e
ruby-1.9.3-p327.tar.bz2=7d602aba93f31ceef32800999855fbca
ruby-1.9.3-p327.tar.gz=96118e856b502b5d7b3a4398e6c6e98c
ruby-1.9.3-p362.tar.bz2=13c26ea368d88a560f07cc8c5eb4fa05
ruby-1.9.3-p374.tar.bz2=944e73eba9ee9e1f2647ff32ec0b14b2
ruby-1.9.3-p385.tar.bz2=5ec9aff670f4912b0f6f0e11e855ef6c
ruby-1.9.3-p392.tar.bz2=a810d64e2255179d2f334eb61fb8519c
ruby-1.9.3-p392.tar.gz=f689a7b61379f83cbbed3c7077d83859
ruby-1.9.3-p429.tar.bz2=c2b2de5ef15ea9b1aaa3152f9112af1b
ruby-1.9.3-p429.tar.gz=993c72f7f805a9eb453f90b0b7fe0d2b
ruby-1.9.3-p448.tar.bz2=aa710d386e5903f78f0231868255e6af
ruby-1.9.3-p448.tar.gz=a893cff26bcf351b8975ebf2a63b1023
ruby-1.9.3-p484.tar.bz2=03f5b08804927ceabe5122cb90f5d0a9
ruby-1.9.3-p484.tar.gz=8ac0dee72fe12d75c8b2d0ef5d0c2968
ruby-1.9.3-p545.tar.bz2=4743c1dc48491070bae8fc8b423bc1a7
ruby-1.9.3-p545.tar.gz=8e8f6e4d7d0bb54e0edf8d9c4120f40c
ruby-1.9.3-p547.tar.bz2=5363d399be7f827c77bf8ae5d1a69b38
ruby-1.9.3-p547.tar.gz=7531f9b1b35b16f3eb3d7bea786babfd
ruby-1.9.3-p550.tar.bz2=c2169c8b14ccefd036081aba5ffa96da
ruby-1.9.3-p551.tar.bz2=0d8b272b05c3449dc848bb7570f65bfe
ruby-1.9.3-preview1.tar.bz2=7d93dc773c5824f05c6e6630d8c4bf9b
ruby-1.9.3-preview1.tar.gz=0f0220be4cc7c51a82c1bd8f6a0969f3
ruby-1.9.3-rc1.tar.bz2=26f0dc51ad981e12c58b48380112fa4d
ruby-1.9.3-rc1.tar.gz=46a2a481536ca0ca0b80ad2b091df68e
ruby-2.0.0-p0.tar.bz2=895c1c581f8d28e8b3bb02472b2ccf6a
ruby-2.0.0-p195.tar.bz2=2f54faea6ee1ca500632ec3c0cb59cb6
ruby-2.0.0-p247.tar.bz2=60913f3eec0c4071f44df42600be2604
ruby-2.0.0-p353.tar.bz2=20eb8f067d20f6b76b7e16cce2a85a55
ruby-2.0.0-p451.tar.bz2=908e4d1dbfe7362b15892f16af05adf8
ruby-2.0.0-p481.tar.bz2=ea406a8d415a1a5d8365596d4288f3da
ruby-2.0.0-p576.tar.bz2=eccd42d43620544a085c5e3834572f37
ruby-2.0.0-p594.tar.bz2=58469c0daf5f3a892a70cc674ea59c7f
ruby-2.0.0-p598.tar.bz2=a3f3908103a7d209d1d1cf4712e3953c
ruby-2.0.0-p643.tar.bz2=1390888cac6cd175e6f164eff378cdde
ruby-2.0.0-p645.tar.bz2=d576240c97cfcc3ed9bdc457eb1e8280
ruby-2.0.0-p647.tar.bz2=27a3ea1a8b8bca1a6de43a7d08e88b69
ruby-2.0.0-p648.tar.bz2=3544031334f4665aa2eb1414babc9345
ruby-2.0.0-preview1.tar.bz2=47a0f662f0e258aa1c5e429c310861b3
ruby-2.0.0-preview2.tar.bz2=a645a783c3302cc094a9963a5e700a4d
ruby-2.0.0-rc1.tar.bz2=24cebdda11e01ff4889ac983cd7dc02c
ruby-2.0.0-rc2.tar.bz2=e92420131bd7994513e0bf09a3e2a19b
ruby-2.1.0-preview1.tar.bz2=d32d1ea23988399afadbd21c5a7a37fc
ruby-2.1.0-preview2.tar.bz2=9d566a9b2d2e7e35ad6125e2a14ce672
ruby-2.1.0-rc1.tar.bz2=cae095b90349b5b0f7026060cc3dd2c5
ruby-2.1.0.tar.bz2=1546eeb763ac7754365664be763a1e8f
ruby-2.1.1.tar.bz2=53edc33b2f590ecdd9f6a344b9d92d0d
ruby-2.1.1.tar.gz=e57fdbb8ed56e70c43f39c79da1654b2
ruby-2.1.2.tar.bz2=ed9b8565bdeccb401d628ec8d54a0774
ruby-2.1.2.tar.gz=a5b5c83565f8bd954ee522bd287d2ca1
ruby-2.1.3.tar.bz2=02b7da3bb06037c777ca52e1194efccb
ruby-2.1.4.tar.bz2=f4136e781d261e3cc20748005e1740b7
ruby-2.1.5.tar.bz2=a7c3e5fec47eff23091b566e9e1dac1b
ruby-2.1.6.tar.bz2=e1a8e6c6bfbb09bb7f8d6be8f508e4a1
ruby-2.1.7.tar.bz2=3a878e98311d543e5de3533b82ef4a5a
ruby-2.1.8.tar.bz2=b17130b5f02a61640ae3b629af931610
ruby-2.1.9.tar.bz2=62bd1cbfcbc22e4d137462bce992f6d1
ruby-2.1.10.tar.bz2=5155c624807ff2418a9e9f15202954d0
ruby-2.2.0-preview1.tar.bz2=767b132eec3e70b14afe5884a7a767b1
ruby-2.2.0-preview2.tar.bz2=d7abace25a8ffe861cb2807bef1c58a6
ruby-2.2.0-rc1.tar.bz2=7144732d30dd4547c0a59862b3345d54
ruby-2.2.0.tar.bz2=d03cd4690fec1fff81d096d1c1255fde
ruby-2.2.1.tar.bz2=06973777736d8e6bdad8dcaa469a9da3
ruby-2.2.2.tar.bz2=af6eb4fa7247f1f7b2e19c8e6f3e3145
ruby-2.2.3.tar.bz2=f49a734729a71774d4a94a9a603114b2
ruby-2.2.4.tar.bz2=c3d65f6d2ebe90dda81a37885ea244f5
ruby-2.2.5.tar.bz2=0c7edd1ff3650c3b74da2efaf641bf34
ruby-2.2.6.tar.bz2=3d13cf447142b8a11cd9beb7bc63fee0
ruby-2.2.7.tar.bz2=ca7224d80c08b015bc3b8c226d0914c3
ruby-2.2.8.tar.bz2=054d2e2904d5175662293e29c3bdb927
ruby-2.2.9.tar.bz2=575adf8ede6b1ca7236a5341e73536b0
ruby-2.2.10.tar.bz2=bef1909a4c885157870ef69548cdad3a
ruby-2.3.0-preview1.tar.bz2=776000d74ec6dd34bf355ff6921c8311
ruby-2.3.0-preview2.tar.bz2=3ad442ccb337e77e4acaa4113f25b76a
ruby-2.3.0.tar.bz2=f0d9f9bbdc87372ca98988a571875819
ruby-2.3.1.tar.bz2=c194281f63d7fcd816747fe78474be5e
ruby-2.3.2.tar.bz2=9d00f3772f1c8fa5eecdfea089e3032f
ruby-2.3.3.tar.bz2=04b9c461a2bc1eec0535ad1947cad4fb
ruby-2.3.4.tar.bz2=99961e97566aee6d63635e2da4cf73ac
ruby-2.3.5.tar.bz2=e1efc3d5a948ca1f552005efe5925513
ruby-2.3.6.tar.bz2=b2443b11ee80319a119f7ec0c9b8d79a
ruby-2.3.7.tar.bz2=5eb580d5cd13ffb5aacfb96580c0043d
ruby-2.3.8.tar.bz2=78045332e298dfd859ceef9fe946950f
ruby-2.4.0-preview1.tar.bz2=64b8983b5f53d053906e394f734aa296
ruby-2.4.0-preview2.tar.bz2=1074e8dea5baa89af7f7c2d1d2b9ebaa
ruby-2.4.0-preview3.tar.bz2=9f767e6bc61830735ea7dc9cd5a63653
ruby-2.4.0-rc1.tar.bz2=0f8b665acf4e883334adc121a42a206f
ruby-2.4.0.tar.bz2=98f29161860fe1b6c65396717847a358
ruby-2.4.1.tar.bz2=07b2ae5d2f46321c95b37066c8415900
ruby-2.4.2.tar.bz2=5ff3ad6ec816bcce8806a55090936ab6
ruby-2.4.3.tar.bz2=ac8215ba561cc7c79b4f61daee11b706
ruby-2.4.4.tar.bz2=d994274eaa95b82aa5d31ec2188253c6
ruby-2.4.5.tar.bz2=45d70a8bb9397d818795ffe992163d27
ruby-2.4.6.tar.bz2=4abd13c50c1fc273a0a81a0ae74ed39f
ruby-2.4.7.tar.bz2=1ce166ced489908993d78e8bb68325e0
ruby-2.4.8.tar.bz2=396d35f1a2d1deaf303f59cb5245d4ae
ruby-2.4.9.tar.bz2=0b3447370651df55a2014a170c0cb1d5
ruby-2.4.10.tar.bz2=b10a7d2fcaf218c98edbaf57efc36e58
ruby-2.5.0-preview1.tar.bz2=889454189f41e271ae5ba15382911b6a
ruby-2.5.0-rc1.tar.bz2=f5acdeacf56aced3c00ae6a8fa816bbc
ruby-2.5.0.tar.bz2=63a6cd49546783d62de25a0ffc4aecc3
ruby-2.5.1.tar.bz2=5aaaf2fb4893214fa316516f3ac43519
ruby-2.5.2.tar.bz2=e90ab127e2ac3ee1d8840835e8ba1f13
ruby-2.5.3.tar.bz2=49aea0bf56d25351ccaf938c642400df
ruby-2.5.4.tar.bz2=0c923215470f1debe593fe21e66fd37b
ruby-2.5.5.tar.bz2=8f41b5cb683d48b5cb6cdfe03d135d6b
ruby-2.5.6.tar.bz2=f2a74416ab3016434896194120796f04
ruby-2.5.7.tar.bz2=65597b69aa54bdca8745502c10349f96
ruby-2.5.8.tar.bz2=9ec96e7a590ef801ede294b6184c9c0f
ruby-2.6.0-preview1.tar.bz2=1ce507e27fa02aeb36100dabcf1da94f
ruby-2.6.0-preview2.tar.bz2=e45011116334d21857b9e1712a01e6b3
ruby-2.6.0-preview3.tar.bz2=b326ceee3d3756f892515009e148f4b2
ruby-2.6.0-rc1.tar.bz2=40457a72e36cbecd0c51d9f895347302
ruby-2.6.0-rc2.tar.bz2=9665e6d886a9da2d4076fa75836798f1
ruby-2.6.0.tar.bz2=d3372daec93f83e7a91c669821053014
ruby-2.6.1.tar.bz2=73d19ac478db1a178be5ae2f2fb8c9ec
ruby-2.6.2.tar.bz2=658fcc0da15578c2420ded807b11cce1
ruby-2.6.3.tar.bz2=52e609b756735115814b9c8463f185e2
ruby-2.6.4.tar.bz2=d9b35753c65f54c745ab6b0094511839
ruby-2.6.5.tar.bz2=d1b89c88effb71d75cd7ef77c35e1985
ruby-2.6.6.tar.bz2=abc030870bfbe18ae9c356abebd95cb6
ruby-2.7.0-preview1.tar.bz2=82fab0496947acd847a6b2eb758acfc6
ruby-2.7.0-preview2.tar.bz2=966a544ab59114591898403c23d91397
ruby-2.7.0-preview3.tar.bz2=2fa6c213774744b287e7e0212b43f626
ruby-2.7.0-rc1.tar.bz2=48a8837cb352f5b95e97a1ae0d62a9d0
ruby-2.7.0-rc2.tar.bz2=cca58fdb8c5e8be8273842d54199c42d
ruby-2.7.0.tar.bz2=89347748b7414f5bc7aeb8f4a87ebef4
ruby-2.7.1.tar.bz2=4bb2b2b2f0c6953859e30af140cf249a
ruby-2.7.2.tar.bz2=a8acc9c24708fe29dfc287823ecaae65
ruby-3.0.0-preview1.tar.gz=991df063b86a8f8412ca07f548579f39
ruby-3.0.0-preview2.tar.gz=ce14b24e923f2e269fea6441791a7248
ruby-3.0.0-rc1.tar.gz=848a8628c8abde270b66e2474049a4a3
ruby-3.0.0.tar.gz=d6af36269a1b0bc278236d371543ad97
ruby-enterprise-1.8.6-20080507.tar.gz=17e3c52e73e42809f57ad0000a6cb4ab
ruby-enterprise-1.8.6-20080621.tar.gz=626fc3811eee2dc92ac27ea63d37a8b2
ruby-enterprise-1.8.6-20080623.tar.gz=0bf8a3a93c6b37bb1260cc09b05e81fd
ruby-enterprise-1.8.6-20080624.tar.gz=de58b97128aa65209f291c66eab7c4a7
ruby-enterprise-1.8.6-20080709.tar.gz=f0ded08cec64959fa388ec6a237b9c47
ruby-enterprise-1.8.6-20080810.tar.gz=bfdcf06f437af825cd9f2d321f9d1896
ruby-enterprise-1.8.6-20081205.tar.gz=50206bec9be2e08a862e5ec2e70fa693
ruby-enterprise-1.8.6-20081215.tar.gz=aab57b7d5061c1980bec5dbe311ec9b2
ruby-enterprise-1.8.6-20090113.tar.gz=e8d796a5bae0ec1029a88ba95c5d901d
ruby-enterprise-1.8.6-20090201.tar.gz=a965e6789b553efaed72191825b13713
ruby-enterprise-1.8.6-20090421.tar.gz=c777b361aadccda7988be16ede7ab15f
ruby-enterprise-1.8.6-20090520.tar.gz=156572a8296bd0440970a6bb95018a13
ruby-enterprise-1.8.6-20090610.tar.gz=0bf66ee626918464a6eccdd83c99d63a
ruby-enterprise-1.8.7-2009.10.tar.gz=3727eef7b6b1b2f31db7d091328d966e
ruby-enterprise-1.8.7-2010.01.tar.gz=587aaea02c86ddbb87394a340a25e554
ruby-enterprise-1.8.7-2010.02.tar.gz=4df7b09c01adfd711b0ab76837611542
ruby-enterprise-1.8.7-2011.01.tar.gz=4640634347cd8e5469cb718853e2112e
ruby-enterprise-1.8.7-2011.02.tar.gz=8c5faa11c1ddaed3f44b7294711980cc
ruby-enterprise-1.8.7-2011.03.tar.gz=038604ce25349e54363c5df9cd535ec8
ruby-enterprise-1.8.7-2011.12.tar.gz=1e5f3059d52a67ab5d91d472b756de08
ruby-enterprise-1.8.7-2012.02.tar.gz=8d086d2fe68a4c57ba76228e97fb3116
ruby-enterprise-1.8.7-20090928.tar.gz=ae00018ce89d95419dfde370fcd485ac
rubygems-0.4.0.tgz=86a64616548a793e1a5f825f0dd385b9
rubygems-0.5.0.tgz=80d151edd94a06bcd2452a7e272b4d96
rubygems-0.6.0.tgz=5df803f5a04654833690dd32283de741
rubygems-0.6.1.tgz=c4a0faa9f876ad805ae80d1396a29d97
rubygems-0.7.0.tgz=ede9b55343219e8b3491793aa12c46f3
rubygems-0.8.0.tgz=9ef6e3c34dcb54e295c8e57321ddc079
rubygems-0.8.1.tgz=6276d268b420c0d61796cdbf6d28dae4
rubygems-0.8.3.tgz=6e6da80f61d6e77d0ad9e531767f6fd5
rubygems-0.8.4.tgz=a2ad2d03dae8a98002c2a7cd6c3ed352
rubygems-0.8.5.tgz=b917c084e1e6e99d8e102af8dd687ddb
rubygems-0.8.6.tgz=9de98d2f62e3f91521b0207a4dcdeb5b
rubygems-0.8.7.tgz=7fc04b9f9acc0c18cbbe6222be8d0bd3
rubygems-0.8.8.tgz=a8535e9c35a4c215d6ef9268d4bc69ed
rubygems-0.8.10.tgz=d26592e280c0fb24c51f2837c3f48e67
rubygems-0.8.11.tgz=aa363b428c4c1fc2e076a4ff77b957d7
rubygems-0.9.0.tgz=5d496e1f415b8b4033ab867f01d1161f
rubygems-0.9.1.tgz=a62314cdb174ccc88a27b8924fa79e4a
rubygems-0.9.2.tgz=cc525053dd465ab6e33af382166fa808
rubygems-0.9.3.tgz=600940a22ecd79e28e0fd37ad1f1d871
rubygems-0.9.4.tgz=b5680acaa019c80ea44fe87cc2e227da
rubygems-0.9.5.tgz=91f7036a724e34cc66dd8d09348733d9
rubygems-1.0.0.tgz=b0b74eac0cbfc5a13f895ab6f803edc1
rubygems-1.0.1.tgz=0d5851084955c327ee1dc9cbd631aa5f
rubygems-1.1.0.tgz=85f994904c5b4045f0a859b29d0be717
rubygems-1.1.1.tgz=1a77c5b6b293a3ccd5261dc120641ccc
rubygems-1.2.0.tgz=b77a4234360735174d1692e6fc598402
rubygems-1.3.0.tgz=63d3dfc038710eaf532b6a133225115a
rubygems-1.3.1.tgz=a04ee6f6897077c5b75f5fd1e134c5a9
rubygems-1.3.2.tgz=6204d0a4c526a1d8fdbce746647b179a
rubygems-1.3.3.tgz=0e9697db44d812712350baf28016b4a7
rubygems-1.3.4.tgz=b17b398503253bf36a101c58f02a226f
rubygems-1.3.5.tgz=6e317335898e73beab15623cdd5f8cff
rubygems-1.3.6.tgz=789ca8e9ad1d4d3fe5f0534fcc038a0d
rubygems-1.3.7.tgz=e85cfadd025ff6ab689375adbf344bbe
rubygems-1.4.1.tgz=e915dbf79e22249d10c0fcf503a5adda
rubygems-1.4.2.tgz=b5badb7c5adda38d9866fa21ae46bbcc
rubygems-1.5.0.tgz=49bef7186bf3c0ca6ee7adf4b585bccc
rubygems-1.5.1.tgz=47577a5e33c9c6f1e3a56aff7f51d0ff
rubygems-1.5.2.tgz=3951f94c09c16c774c8bcebc94fa5374
rubygems-1.5.3.tgz=38bbbdc17aef923fb41f054cf8421116
rubygems-1.6.0.tgz=abd27b5a9002100ff74ddb398a1c9689
rubygems-1.6.1.tgz=a77c64896aaa10d64aaf34f5c1488173
rubygems-1.6.2.tgz=0c95a9869914ba1a45bf71d3b8048420
rubygems-1.8.6.tgz=8e95d0c5b377a003f3d54a49461e81d9
rubygems-1.8.9.tgz=fc399445d693c29778779e5828ee5e90
rubygems-1.8.10.tgz=5b08ee31740c9b0bd36f6c04d537e7d4
rubygems-1.8.23.1.tgz=5259ce3eb7988950fa3aff9051a5de91
rubygems-1.8.23.2.tgz=fb377c7fd387df14a33e529153adc316
rubygems-1.8.23.tgz=178b0ebae78dbb46963c51ad29bb6bd9
rubygems-1.8.24.tgz=3a555b9d579f6a1a1e110628f5110c6b
rubygems-1.8.25.tgz=1376a258d43c53750a8df30e67853e10
rubygems-1.8.26.tgz=0ea47f1efd010f4c82b8a51a934f48dc
rubygems-1.8.27.tgz=6686ad26735c21d0d6e58b6192c7da5d
rubygems-1.8.28.tgz=2df78039f391fb1f71c02c2fc5671c94
rubygems-1.8.29.tgz=a57fec0af33e2e2e1dbb3a68f6cc7269
rubygems-2.0.0.tgz=89ce467eb2d55657e9965a46559acbcf
rubygems-2.0.1.tgz=2652ab6f001a873b8933e2ca09505974
rubygems-2.0.2.tgz=3471f140a70bcd32a7495b545cfce790
rubygems-2.0.3.tgz=854691f145cea98b4100e5b0831b73ed
rubygems-2.0.4.tgz=3ec32dbe783bab37a87f50758f8efe13
rubygems-2.0.5.tgz=641d82672937d40d664dbc18f49cdcec
rubygems-2.0.6.tgz=0633f50db16112bf6c3cf9bfb9ceb9bd
rubygems-2.0.7.tgz=9046700f1222712fedfb836fafa08c50
rubygems-2.0.8.tgz=5432214a740c0d13482e43a5328a6518
rubygems-2.0.9.tgz=bc55898247297ffa190223276b1b1bd7
rubygems-2.0.10.tgz=5457ba403cd9a5f4f5fb2ef4a2a1c03e
rubygems-2.0.11.tgz=0f28e3fde3348c0f23ceecba73a6cbef
rubygems-2.0.12.tgz=99c416517e2de1146d2c6fbb4c4c1441
rubygems-2.0.13.tgz=3970e66a670ddb6d1aade9c7b18033d4
rubygems-2.0.14.tgz=4a7aa0b144e465230ab5d7b59dfd7e8f
rubygems-2.1.0.tgz=9a9d242baef5e58fbfe79ec5206cd316
rubygems-2.1.1.tgz=b34d6f4028b69a84123a6b7cb0ac8028
rubygems-2.1.2.tgz=b5c5c4430be60f911014216d41886ef3
rubygems-2.1.3.tgz=ac7bbdfecd49f9304756aa5ebeb51400
rubygems-2.1.4.tgz=aa502b1ea90fbdd14ca9b32634795c2b
rubygems-2.1.5.tgz=60564b762d4e186815997653b1c876ab
rubygems-2.1.6.tgz=e11237a8f87dbd8c085770551d64a8f8
rubygems-2.1.7.tgz=b721ed7d5fd57ed05f77eb21a3a592ee
rubygems-2.1.8.tgz=cc4c84c0482840389a457740e8083ed9
rubygems-2.1.9.tgz=2636bf26c0a9ec889c7bd938887bd9a3
rubygems-2.1.10.tgz=6fa671d7d6605de73d16f529cf7bffb8
rubygems-2.1.11.tgz=b561b7aaa70d387e230688066e46e448
rubygems-2.2.0.rc.1.tgz=f7d80b612339169569f2675155c202f1
rubygems-2.2.0.tgz=3c16e50673adb99d1ce76d5231f764bd
rubygems-2.4.8.tgz=dc77b51449dffe5b31776bff826bf559
rubygems-2.6.10.tgz=ab5a0028d2a0653691b29d7463bd0892
rubygems-2.6.11.tgz=8d514b836fcf3ae2c20b4fe8d5cdc3c5
rubygems-2.6.12.tgz=7c454ef88b716c1a123f62b26bb9612b
rubygems-2.6.13.tgz=e6f19b51614055d826e431549a12a80b
rubygems-2.6.14.tgz=e0a6914ce03b91dfc6d448ebf292f145
rubygems-2.7.0.tgz=771c40015538c0f225c5249e4bc7d441
rubygems-2.7.1.tgz=65646f28f3c36ccaa7f991c17e15b8a9
rubygems-2.7.2.tgz=312a238ed98a61d2b3d165b790b6062b
rubygems-2.7.3.tgz=fb3a1927a1842b75677a24f48dd63ddc
rubygems-2.7.4.tgz=e9bbf5a4cc9a74293884b91f49603ea0
rubygems-2.7.5.tgz=516a4f219976003feb4b4f797cbc66b0
rubygems-2.7.6.tgz=366cea352c2b1243db726013c3d76fc4
rubygems-2.7.7.tgz=b6721f6ce4af08f68c6f513bbddfe484
rubygems-2.7.8.tgz=a3ed89a34e1ae8f9da0c620a8aa35f12
rubygems-2.7.9.tgz=173272ed55405caf7f858b6981fff526
rubygems-2.7.10.tgz=464754059d8ca01c1121a1233d866e8c
rubygems-3.0.0.tgz=3908105894e531f7ad3aceb8b41dcbcd
rubygems-3.0.1.tgz=1e8af9b87a67f15841ad2be7d5725a5f
rubygems-3.0.2.tgz=d8db1b516ae1e35b8f6f56cb526f879a
rubygems-3.0.3.tgz=b7a7dd5f85485334a6cb61b7dac20cff
rubygems-3.0.4.tgz=7d0c49077a2d19f48d88567cfa3cf17a
rubygems-3.0.5.tgz=4664467d621d719688e4778d147c306a
rubygems-3.0.6.tgz=60d84e843b131fb87c8fd67e8fac6470
truffleruby-1.0.0-rc2-linux-amd64.tar.gz=3e9afdf72f153e2f66259fc2b6fca594
truffleruby-1.0.0-rc2-macos-amd64.tar.gz=c30459287aec83548cfcb17340fa73d5
truffleruby-1.0.0-rc3-linux-amd64.tar.gz=138f6814451ce634b0fae3aca5579248
truffleruby-1.0.0-rc3-macos-amd64.tar.gz=94ed54ecb65bea2166a2159431b0362b
truffleruby-1.0.0-rc5-linux-amd64.tar.gz=9e5428611e22b093d05afebbe0ccbc2b
truffleruby-1.0.0-rc5-macos-amd64.tar.gz=b32a254fed71434c3431fb2effb35c5a
truffleruby-1.0.0-rc6-linux-amd64.tar.gz=7f394a8c7fe356b7bd36683c57f74ebd
truffleruby-1.0.0-rc6-macos-amd64.tar.gz=f033329d03f1f846d25728c2af9d7524
truffleruby-1.0.0-rc7-linux-amd64.tar.gz=184e98f2d6939f63db4b915943ff60c6
truffleruby-1.0.0-rc7-macos-amd64.tar.gz=d19213b33011f7a55e0f32d25e19184f
truffleruby-1.0.0-rc8-linux-amd64.tar.gz=a394167c0331c6d8c1123e1f992e5411
truffleruby-1.0.0-rc8-macos-amd64.tar.gz=dc1bf0fcfdd5837ae0ca56d6d6e5f7b0
truffleruby-1.0.0-rc9-linux-amd64.tar.gz=f6ec25bd532bf0551d35327d1aa4caf9
truffleruby-1.0.0-rc9-macos-amd64.tar.gz=c80a345f9071521cf1961ab75ebc7dd1
truffleruby-1.0.0-rc10-linux-amd64.tar.gz=3a889726efcdf33feb7ef3df13fd5f39
truffleruby-1.0.0-rc10-macos-amd64.tar.gz=bba618b4483b79eebf9f0e7af4078502
truffleruby-1.0.0-rc11-linux-amd64.tar.gz=a25e179ca0be96a1bc737a600729c195
truffleruby-1.0.0-rc11-macos-amd64.tar.gz=bb8d8f5525e1ba86bb039e56291c6c7c
truffleruby-1.0.0-rc12-linux-amd64.tar.gz=872774837057489250527bf863192115
truffleruby-1.0.0-rc12-macos-amd64.tar.gz=bb4a64e6c4882fd0c5e412bf9c57720b
truffleruby-1.0.0-rc13-linux-amd64.tar.gz=0f36eed2eb36846785fdd4eae24adfa0
truffleruby-1.0.0-rc13-macos-amd64.tar.gz=1bd3087a0f2df4c006b87c9488ada6d4
truffleruby-1.0.0-rc14-linux-amd64.tar.gz=9eddd1aa98c9649e7c01bb10bf28c471
truffleruby-1.0.0-rc14-macos-amd64.tar.gz=c93643f1d00b370411310ee7a1dd5330
truffleruby-1.0.0-rc15-linux-amd64.tar.gz=bc7339a6218ea991f2c72ce8759cb6e3
truffleruby-1.0.0-rc15-macos-amd64.tar.gz=1671d08dd2f5026d58b326fd55c9b7de
truffleruby-1.0.0-rc16-linux-amd64.tar.gz=5564d17f19b8ee0edb96ab5b1bfbda98
truffleruby-1.0.0-rc16-macos-amd64.tar.gz=61583b529b6a1337398b0966db952d24
truffleruby-19.0.0-linux-amd64.tar.gz=006220c7bde7d0b5c72481133624a83f
truffleruby-19.0.0-macos-amd64.tar.gz=9ef7f5a311465d35e54ac6e00ec3d169
truffleruby-19.0.2-linux-amd64.tar.gz=2f7fe574e0695fb6001f4f5282aa2f79
truffleruby-19.0.2-macos-amd64.tar.gz=aa20f76b3eac1f4976a507364201d1ad
truffleruby-19.1.0-linux-amd64.tar.gz=71368f8371069017d911528f052b0a55
truffleruby-19.1.0-macos-amd64.tar.gz=7f086adbc89fdfaed35273394ac3ac66
truffleruby-19.1.1-linux-amd64.tar.gz=c1ad4d17bb40e214b124222f3a7c6db6
truffleruby-19.1.1-macos-amd64.tar.gz=f4e76b0612319b4a82480cbd1fc90210
truffleruby-19.2.0-linux-amd64.tar.gz=458ed5fec1a849ef5b00e19b0e25d5e9
truffleruby-19.2.0-macos-amd64.tar.gz=dc324575ad20e3054980835c24ea7161
truffleruby-19.2.0.1-linux-amd64.tar.gz=ad7444145550d89931199159163077c1
truffleruby-19.2.0.1-macos-amd64.tar.gz=b5bcfb0aaded1e2d1763089ab6c9a14d
truffleruby-19.2.1-linux-amd64.tar.gz=fc4879d2b0cc22c152a8bf893a72c346
truffleruby-19.2.1-macos-amd64.tar.gz=71448ff3f8f1da086f222751d3f853bc
truffleruby-19.3.0-linux-amd64.tar.gz=dd44ac30b5a1ef3a7d61172cda9b30b6
truffleruby-19.3.0-macos-amd64.tar.gz=41daa52f0f308abb77a2b91c1b7e0f3d
truffleruby-19.3.0.2-linux-amd64.tar.gz=2db2cb5c29523c9bdb6f59dfa0bd74ce
truffleruby-19.3.0.2-macos-amd64.tar.gz=edf1603643938686dce57139aadf7d3c
truffleruby-19.3.1-linux-amd64.tar.gz=a14c028351f7a3965bcb56e9b22364de
truffleruby-19.3.1-macos-amd64.tar.gz=a8707d0af3eda694ec07a5387d3443fb
truffleruby-20.0.0-linux-amd64.tar.gz=b30110ecbc50c4fce402fdf44c45dad5
truffleruby-20.0.0-macos-amd64.tar.gz=0671e5909cefb9a2c12c473fc0110821
truffleruby-20.1.0-linux-amd64.tar.gz=4592b5fc3636d82fc998ab6fe0a43584
truffleruby-20.1.0-macos-amd64.tar.gz=3c0be43db86817c7037d3ff5053d322d
truffleruby-20.2.0-linux-amd64.tar.gz=e9859decb24829f9a189d88b3c2e9b79
truffleruby-20.2.0-macos-amd64.tar.gz=49e7ccf8f9e60d6c59b3b07b854466cf
truffleruby-20.3.0-linux-amd64.tar.gz=93a20845f7d9d39100761424dfc0a734
truffleruby-20.3.0-macos-amd64.tar.gz=b178b7a94fac58400450417612fe3441
yaml-0.1.4.tar.gz=36c852831d02cf90508c29852361d01b
zlib-1.2.3.tar.gz=debc62758716a169df9f62e6ab2bc634
zlib-1.2.5.tar.gz=c735eab2d659a96e5a594c9e8541ad63
src/rvm/config/known_aliases000066400000000111147511530530012163 0ustar00jruby9k=jruby-9.2.14.0
jruby-9k=jruby-9.2.14.0
jruby-9000=jruby-9.2.14.0
src/rvm/config/sha512000066400001104527147511530530010352 0ustar00GemStone-27184.Darwin-i386.tar.gz=02126a9fc4a8d32fd797bc2c95ecf451bc9f400857d1fef26257e404328bf5b224335cf7499a322daf74776a26070f08462b0fad8f58e62950f0c640f6aaa62b
GemStone-27184.Linux-x86_64.tar.gz=55eabbb0378784a734ac5af3d42fd80c0793ef4cca4dc9572c51198292d2dab5159191d82429c6a00e7193b1e3ade41f845373a2bfc056edc0f8eb496034347f
GemStone-29516.Darwin-i386.tar.gz=2f09cfc1a90f298577bd016fa7690eebdfe0a166443db1f1e9156e177cdab4feda5548f5833a98578b9e90e7af3d81af7c63b67b69531a8f8ab8aec12c0678f7
GemStone-29516.Linux-x86_64.tar.gz=35738d619f731706b15f7dd8ea40ac1ebf2903e14951121d26e36aa7947f309280897f8d5918202d89acfe27b1781581fe851a5b6109294a54b46f9d9e6585c8
GemStone-29639.Darwin-i386.tar.gz=cda54b3584f2615268e357a35341e946da10f1185003825a881b3d758be82b8f9cefece35272b8167cd24ea2c560f765d806710de04cd2437d8c96f7025a626a
GemStone-29639.Linux-x86_64.tar.gz=38340117d4ab6a99135dafec761bbe5e3f1c7483a446b7c7d53465296167e11829ea6685c553c6ebc08d96c96884fec4093b19209ca5b7f91fcd47fb1776be9c
GemStone-29699.Darwin-i386.tar.gz=400c3b10b94096d787d56cf1e6c19a60981d78698e1af3f4b2ca5283517e6b69d0fc02e47483434e9283a71d731d2e317ffa8c8b82a888650d225c1df1d32134
GemStone-29699.Linux-x86_64.tar.gz=cdddabde773ffa9e986b24372fa3e42f856eb2a2ca4f0ab5ea71bdbe433d48ba852f5f7630a2fc869c60cbc0c6391dfafd4c6f3a92ac76728a0f6305f8c4818e
GemStone-30086.Darwin-i386.tar.gz=fa70ed2f9d13a6277a26f81fd86ed5d084b6a565c257c4856425dd95bb825762d0d91e4122dccb0377dc2b1d2edfdbd2643fac52d5393961fbe435159b5a1f2f
GemStone-30086.Linux-x86_64.tar.gz=129db8ab883b95b42f2eee2ec33f136fce049ec24e6741b949178a30a21e7b81731c2e3425b000894aec242ed41058497aec308b18610d4b4a06c3ae8ec0e1a0
GemStone-30246.Darwin-i386.tar.gz=57d6e1fc5b52ea29c315f3ea9640fa1599e6a3a2749b2c444a214210403ee3fe7e15332fd907a5bb2795d7d25e865b4e95d30823cbd097b286bb07f54562901b
GemStone-30246.Linux-x86_64.tar.gz=66d2ae5646cfe7112cd3a5600b6fd4a32db211b5e624203cb6b0c43605aad1776ab508b29db07ef5346530733d9143e1edcb01c2fde6e2ef25052fea65b4c2f8
GemStone-30441.Darwin-i386.tar.gz=a9fbd5b7809e5df20f98df4ff22355979d6dd647f737af82befe5a2163a3909a2e1f50fd3d991b5f2b5292fc759068a9e658cb98b8ee65d514c89f7da6e27967
GemStone-30441.Linux-x86_64.tar.gz=297eea1e8550cb97a6a904563a13bab1c3cc148bebb9a996b65457d192cbe35949d93a7f1829d408d9d552e2dcbde61ab756cc0108a3642cfaae0b07d732f915
GemStone-30866.Darwin-i386.tar.gz=b4826b2a25b2f996addd6b7b32b97a122533579671d47dcaaa8a1e919c1096e657e216145a547ecbb866c41823e6cfa27e6ee2342e09f4eb3fd9dd8064cda2d2
GemStone-30866.Linux-x86_64.tar.gz=2faaf102509f962d2edf67188184499cde4a57320fb301fe37308383302a2bd22a63aac922f032d19348aed2d0f015cb2654b69cd30a1e8becbbe24f59acaa5a
GemStone-34619.Darwin-i386.tar.gz=d3b3b3582ee0253cbfcbf82347893708e9901dff712bc038b6c2e6fab26921523e68de95c2288c5634abb01e334bd32ad23d6f572f74d8dd556bca1ff6c46714
GemStone-34619.Linux-x86_64.tar.gz=c6d32822a2228c94bb1b476cd64d9db42d423abdbbfc5ab03b670338a734dc5a5180afb9fec3a87bdffd2d53d8d8c4e8f09da5909fdce7290aaa9ea5c5b41264
GemStone-36816.Darwin-i386.tar.gz=d597b8448856ddc406b6d5ff741d484ec545afaab5e96db154a7b6c3ff5e2b31e52611e23a9457a1b290f7cd81828b769c855e945c9a11ea3b6b4679dd2e100a
GemStone-36816.Linux-x86_64.tar.gz=8a9a90c07f1a5309b259ee95c78a702256e85f600fcb9fa56386135d5b3218dfa97bc22af07683e363cf33ef894dd970b2e475814846302d553279e05a4eaae9
GemStone-36916.Darwin-i386.tar.gz=9e2a888e14f742825d35f160c4d22bce2886c3f30ce680650c97bdac76acd068b63af50daa098c94e6f48d36f097d1a020ea7a03d59f121196f6c703041a3ea5
GemStone-36916.Linux-x86_64.tar.gz=e2b87ae307322eabad8169963ce3fa6091e6da79ee2fec9c8d81eae20edac8873698e8b73a74b6dee29a1c9bdf00848f723129cca03a30c82cc4484ffba43cc1
GemStone-36962.Darwin-i386.tar.gz=c654583ad3aeb175fa88dd304d46dc3f3a3701a2b994a1c2df7a7fa40f0733f6bc6031f1906e889a4e6ea5f53f57b63f7ebfe6bd944177b25f3788dc2a4b71f5
GemStone-36962.Linux-x86_64.tar.gz=d5a5abde66040589214b338b7aa33c448006e3c9053078b1a5fc1a0a11292a3a2305378b5a6a85e0b407f258af967c374ea3eda7e792b0abfcbe634ec1483275
https://dl.fedoraproject.org/pub/epel/5/i386/epel-release-5-4.noarch.rpm=2f177390baaff9f8edd4d596c6cf73f77817e44bbcb2ee7e6064dc4cde190ae5a8497aebb245c49380fe1b63fd0ebce33d0eab3ad2b2f681d7b2620cf3a71b48
https://dl.fedoraproject.org/pub/epel/6/i386/epel-release-6-8.noarch.rpm=9b87357849b7d3bc464cd6098518ee3cfd6009111b630d342faaa462e21cad9cc480b8cb2b42a065aaac0108d24f5fe43a0ac487876a6cf88bd29baa87015c8e
https://dl.fedoraproject.org/pub/epel/RPM-GPG-KEY-EPEL-5=face1d4eb6775306afb15244efa4a835ee7c0b491dddbcda55d9640287f293a6527743ffbb8a6964cd80ce255e23ca84588e98a6a129288c51fbeadc1bea095d
https://dl.fedoraproject.org/pub/epel/RPM-GPG-KEY-EPEL-6=c38c8888846069c996d0d5fdfb8a62ade947195253cfbb9732ae08542e74691cd2c96993b2d4a342bed6b83fe1259fcc5b1c024f633849d4d4a1ecada67d6625
https://rvm_io.global.ssl.fastly.net/binaries/amazon/2/x86_64/ruby-2.4.0.tar.bz2=16cee181e353f454698f1540548acf7199a0fc48ba71b16415cb0e003e9f54d6622f7688ef8e53a60cb021f12c750cc19752dd7b533a4fa2236e8f524c62869d
https://rvm_io.global.ssl.fastly.net/binaries/amazon/2/x86_64/ruby-2.4.1.tar.bz2=1080a19d0087b8c0a917bc412467d8432a9852e5b9e7bd5e218c6d6caa056c57543644949d39b45571899a4b000e7217616566727d2e3a46c35980e7c24d35c9
https://rvm_io.global.ssl.fastly.net/binaries/amazon/2/x86_64/ruby-2.4.2.tar.bz2=eb299d94caeb59b4cf915355846873f9c67166d94444de62dc53ec435ba0ae4a7ced44a0d632f7317473f56f7664b2cc4e636b7d3ec0637c6b3873c55bc8bc0f
https://rvm_io.global.ssl.fastly.net/binaries/amazon/2/x86_64/ruby-2.4.3.tar.bz2=e29ba7d685a70b373b1434e552c33e330e979db9fe7ec88a9be1949c2b84fa03a44a135c07bae26427120a0102ddfec8711494349b16421883a159a95bedaa5b
https://rvm_io.global.ssl.fastly.net/binaries/amazon/2/x86_64/ruby-2.4.4.tar.bz2=416df41c77836cd298d6ad02dda9f5152ca8d4785a4db0248f4040127b3de7196bd8a50a50300e3ead7ab5ddb7887beb64199088ff005e8e3c53a4f0f620f60d
https://rvm_io.global.ssl.fastly.net/binaries/amazon/2/x86_64/ruby-2.4.5.tar.bz2=c0f28a5754e093b8fb28f427d32395dfad71110d9753658f68d7444f46a2bb027ccd79fb116cce8be1420bf339e596f7700b6cc2cc5a8722ef651e973da9ed80
https://rvm_io.global.ssl.fastly.net/binaries/amazon/2/x86_64/ruby-2.4.6.tar.bz2=9f92ddef878c5b5ff3a8a64d82e2889e475e209df8440fc901560f99b59aa332b9112ac876f83197b7db545bf42d10d5b75541d5fe2e2ded7f11911929e0696a
https://rvm_io.global.ssl.fastly.net/binaries/amazon/2/x86_64/ruby-2.4.7.tar.bz2=f00b225ec86206115910b1b847d44f6ed0dc4797be91bdf2e35bf9a55cbabf60898608b0e32fc7c2e13d31679010703d45c1b16cf217eecf70d42232d19c7ada
https://rvm_io.global.ssl.fastly.net/binaries/amazon/2/x86_64/ruby-2.4.8.tar.bz2=f2a278e5142509c38e6fbf01f9fd070556c40c1d67b489f136424e7e61732d1f84f96f8cbf55c471f0f4ca7b101150a961efe54e8cb466d2c2fd186ec0cfa4e9
https://rvm_io.global.ssl.fastly.net/binaries/amazon/2/x86_64/ruby-2.4.9.tar.bz2=0059f92ac83cb42223849d89a0a5d47375b11e2c2d8d86a8d5372a0fd9d0f4a993257a5f9ea40d00843a663295fe1dfb04d3304f21ef4cba4264f4ac41fb91eb
https://rvm_io.global.ssl.fastly.net/binaries/amazon/2/x86_64/ruby-2.4.10.tar.bz2=af7f738b4ed3bf7b7c939e4fbccd296e6a59dce4a851de4ddcb23e9de4de8af68dd43754b2ca354ac4131d053e0dfd7a065cebc8f7031702e9eed15a6d605449
https://rvm_io.global.ssl.fastly.net/binaries/amazon/2/x86_64/ruby-2.5.0.tar.bz2=4b43e1900ee653ec1c37dda01a5dcebebacb8eb07208b046bbecc76d33274e9728134269faee5161e1ca9b7cace962d45f61713f70349a9eda8b32adfec70ce7
https://rvm_io.global.ssl.fastly.net/binaries/amazon/2/x86_64/ruby-2.5.1.tar.bz2=f3f20d23b2970fd3c92762b91b812c7b582df67dd204266c489a82d4e89a2245f5a9f8c8a87a15fab2912a1a3a720af98a623f01c955f0088a1b7c8b9bbcda18
https://rvm_io.global.ssl.fastly.net/binaries/amazon/2/x86_64/ruby-2.5.2.tar.bz2=ef3e567a31b2f69c00a2b2c289d8eefc2c3f30d03b39202c1e0c6380d0fb4f327f96815905e2360ee7b7fc945420d80282ef8b9477d7d3f4d72de7f0554b96ee
https://rvm_io.global.ssl.fastly.net/binaries/amazon/2/x86_64/ruby-2.5.3.tar.bz2=4a43ecbb80a85d7a9fc50ff38c055cac5e4a901e649a4a6662716e5d7cc0176d4381527ab2526badae724628070e33256cb3a673e0de3c63540a3244d54a06da
https://rvm_io.global.ssl.fastly.net/binaries/amazon/2/x86_64/ruby-2.5.4.tar.bz2=73430af6abe655bb1a032ad9610b27e7cab060833c561d01a8d9709adb60b427623343bbc92f4ce9a7598e32f309b34dc07513aae738c9f1737a72e4bcd41d5b
https://rvm_io.global.ssl.fastly.net/binaries/amazon/2/x86_64/ruby-2.5.5.tar.bz2=d06abb58721c59a715d6b039d9eeb7a7317903b93377186b174a00284a16b4c725c6d6107bc3404536ca930e687bd560377e1f73012ac79e2e2f0f7268cce63d
https://rvm_io.global.ssl.fastly.net/binaries/amazon/2/x86_64/ruby-2.5.6.tar.bz2=7be8a0219bed86028b1bd4ec01715ece304403e5c907cda044e905c47333d7503d02dbbbbc168493377fbbf51446fec66e31256581bbe58abaf4ae262c18deab
https://rvm_io.global.ssl.fastly.net/binaries/amazon/2/x86_64/ruby-2.5.7.tar.bz2=6db505330a993a0a6d9d5ace93187efdc6f8bb54d28bb522a6d098d3098bb8395cd8b6105e4a30ed5a80a591ea2772d3bc717579b5e46333825bc010e4d246b8
https://rvm_io.global.ssl.fastly.net/binaries/amazon/2/x86_64/ruby-2.5.8.tar.bz2=29a75c2d422dbfdaf1218ff513c73231b8bb2ed99e11432d9df08a11cd3a10477dd2b894cda8ba6de8275771d2652e695bd605cd4f43793de1cbf2b0a6ccd18f
https://rvm_io.global.ssl.fastly.net/binaries/amazon/2/x86_64/ruby-2.6.0.tar.bz2=6b4f4b3c76939123c3907d833e95737bedfdc5291802336bdb77aaa0df3f8c66f00c96f8091fef689afa88a68a53bdaec87c816479d7eb3d539d139f595ff00e
https://rvm_io.global.ssl.fastly.net/binaries/amazon/2/x86_64/ruby-2.6.1.tar.bz2=a26de96951bc113001711bb161150d0790e95ced40492d4ce23e4a6c1ca703a622c6ba83a0034d64fc15c1104d4aa56ddfec54fe09ca633497202892950c5449
https://rvm_io.global.ssl.fastly.net/binaries/amazon/2/x86_64/ruby-2.6.2.tar.bz2=983f34a367325c3e401bea56cab2d725703cbb15cdd4f7904ba4aa9e124ad41caf6f0a4e1cd047597b12bb3d85e22230e6df3b9997b0353deaae134ad6237795
https://rvm_io.global.ssl.fastly.net/binaries/amazon/2/x86_64/ruby-2.6.3.tar.bz2=94573b033560609a51bf44858ce4153fea2a4e95bee51a2dcda402d53c7c572346b9a9a7456e34301dd7d73d7b9ef16ae71e0002c6346af215df11d4d21410e4
https://rvm_io.global.ssl.fastly.net/binaries/amazon/2/x86_64/ruby-2.6.4.tar.bz2=cf471d6ae19a7efdab483bf767ca268335a6741f7dd9c81a9b3b3c5e6d5e4a7cf01d66a666028639c705ee85b85b4e34dc80b16ac0c713a407ec80ec2509b2e6
https://rvm_io.global.ssl.fastly.net/binaries/amazon/2/x86_64/ruby-2.6.5.tar.bz2=d67cc932309b81454bfef10afb7ef578c5312028d8657495743a572eb431ae08ed70e0def5e4ffc640ef50574a428164f67c498fee788032615260249fb0ba73
https://rvm_io.global.ssl.fastly.net/binaries/amazon/2/x86_64/ruby-2.6.6.tar.bz2=b9a2d61e8f85bb8780871fbe051b6226bf179f670fdb197642002489fb23a6e2b90eccecc0effe1ab593d36b0059b69ba5045d5e55d58c1a712091caaa3e2fdf
https://rvm_io.global.ssl.fastly.net/binaries/amazon/2/x86_64/ruby-2.7.0.tar.bz2=68a719597f42f974819708a48bd3a45e0d76d92b3bcda3fd3d87c1100c9209027c4973d607ef3d2e5cfee3be4bb70846b300f74452945c2d9f16be28e18b5065
https://rvm_io.global.ssl.fastly.net/binaries/amazon/2/x86_64/ruby-2.7.1.tar.bz2=3817ab89d3beefbba2caa41a02282b22c04b666a312594d0b2a37acd69828a20a9caa308c5f7f2da8b6d4e1a081a3697498719934b178fd8c793166cdfe5ddb5
https://rvm_io.global.ssl.fastly.net/binaries/amazon/2/x86_64/ruby-2.7.2.tar.bz2=4a24d4baaf4f0e0ca1adad5a76b5eb98955ae5445653bdbc12e0754ad518219a23059b714504df1487efec30642948a3f5727ea5c513ca9de1234974c7439392
https://rvm_io.global.ssl.fastly.net/binaries/amazon/2/x86_64/ruby-3.0.0-preview1.tar.bz2=ab84066d5959735f175b0e5ec98b4ecc0f2aef0323bcd750c3889da327c164f06fb5f42b2b29f1835820260852e9fc7eaf99bcd0191336e259f1c34918d563cd
https://rvm_io.global.ssl.fastly.net/binaries/amazon/2013.03/x86_64/ruby-1.9.3-p448.tar.bz2=2e7bc5f6d501928f01de2a6d9035f56f40678d410bc0629ef00e0e70565b49991c4570f19c34faa1bfef2ad4cb460e4c28ee2eaf5c0696a403d0847f17d4c22a
https://rvm_io.global.ssl.fastly.net/binaries/amazon/2013.03/x86_64/ruby-2.0.0-p247.tar.bz2=6929240b591970249153fd7cb9aae47821a3efe60cdda3bfacc334cd7301635d6b71bdbd5e122b5e17d02559b6bad8711ecfbf38aa6f947ed28b5b1154a38efd
https://rvm_io.global.ssl.fastly.net/binaries/amazon/2018.03/x86_64/ruby-2.4.0.tar.bz2=ba4cd3c2a4c64e372fb2baba10be8d4e6757f1264e8153fd26810d9b1c6f5714c2465ca372522395269a3841dbfd1b060cc6e1080d3caaa54b14c8a59dc6a24b
https://rvm_io.global.ssl.fastly.net/binaries/amazon/2018.03/x86_64/ruby-2.4.1.tar.bz2=59ec83fce87794ca3cd0600f3fab4fc46ac0f4858ff2b0264c177bda418264174d6d7a36083addadba54a2b981ef971698f30bdf77a7312e473c372ef63acc6e
https://rvm_io.global.ssl.fastly.net/binaries/amazon/2018.03/x86_64/ruby-2.4.2.tar.bz2=2da4d5494519230b1e3951a17e1bb937f443dc7f0a6f058512fbd2be386e150ee7396493c27af554515ea0fb5ddb5426dc679025f253d8c435d7f95aab8955a1
https://rvm_io.global.ssl.fastly.net/binaries/amazon/2018.03/x86_64/ruby-2.4.3.tar.bz2=03144d9ed9ead5f2b85b7185cff806e120e5972f79b249d7792b1822374de7a067d5c3705b4131d5898e4f915ef38eacebc5542f29c8b3d5790b6505a654469c
https://rvm_io.global.ssl.fastly.net/binaries/amazon/2018.03/x86_64/ruby-2.4.4.tar.bz2=bda50a28f33133c5d8422a91f9bb105cc2c4127dae2dc6bbf267210a3428e7015c93b09ca82dce380e83aa64ec428fcd3e661d3da49bcd051faf3129a09601e7
https://rvm_io.global.ssl.fastly.net/binaries/amazon/2018.03/x86_64/ruby-2.4.5.tar.bz2=6a2857e4a49ea3253b8600f4bf45b7b46c5b6c33871e17ee84825e0ab5665535bcb7e926cae1506a889715bebab7cc14bb9ee1de4002aa02694a0660e4720b8b
https://rvm_io.global.ssl.fastly.net/binaries/amazon/2018.03/x86_64/ruby-2.4.6.tar.bz2=c478ff01c77953742a9d6d8410ebbed2565289f85780951b70d7c7b040e4f280db5da467605bd0266edc4a891e90a31d9b99eefa778c3bee869b5144c763faec
https://rvm_io.global.ssl.fastly.net/binaries/amazon/2018.03/x86_64/ruby-2.4.7.tar.bz2=0429550ec3efc0d4bc291fea0309661b32d2f3666d4fafc9f7e5bfeb13dafada37d6a8482f0b887816d3d582a3c555a32c1ef73988b1f47c8f0701b12298bd51
https://rvm_io.global.ssl.fastly.net/binaries/amazon/2018.03/x86_64/ruby-2.4.8.tar.bz2=6c8cd7c457d4e7cc144f51d55b339f05092106c71f398b4db7ed3e294e55f7139bceadf170974eeb08607194e1c43fa6defb8b77ad910a573cda81eff205b5ea
https://rvm_io.global.ssl.fastly.net/binaries/amazon/2018.03/x86_64/ruby-2.4.9.tar.bz2=add41021a14bbaf05316b00a9e9d37155c830cb2b99f4bb212764aa0927d207e353236c35678432669a2d5562c8768b6fb63110a33273dfb797242ab31b98894
https://rvm_io.global.ssl.fastly.net/binaries/amazon/2018.03/x86_64/ruby-2.4.10.tar.bz2=e7dc581ea1f0d60c0ccad9105a790a922c4a8747d74946fdca362bf44c6a5cd226b3e58b959e42b1d3ab9b0c3b8f3cd3e4aafdb074c420f37dbe7efd8649cb18
https://rvm_io.global.ssl.fastly.net/binaries/amazon/2018.03/x86_64/ruby-2.5.0.tar.bz2=ab993e1bc73ed7fc106c05ebdbcf202c0d6d210739a504762c511ec8d468bd4a2034054b7843451d645094e1d0b19c79f9e83253dc949f4a786212a2e47cad80
https://rvm_io.global.ssl.fastly.net/binaries/amazon/2018.03/x86_64/ruby-2.5.1.tar.bz2=4eeaa5d13432f8e6d02a6947d3f5dfdb5470e960a7139fa686ee708184b61d74a05bf74b34cb7408867f8085bec5d8521c1772d8761a4ae2e9b1d9631f7e953d
https://rvm_io.global.ssl.fastly.net/binaries/amazon/2018.03/x86_64/ruby-2.5.2.tar.bz2=e65266b821d7cb167624108df832358905cf1e520b2f1b0e1ec55d82bf149bf783ecc589889d58180786114702acaa6f4354bf15080dd740a6c88a7ca594cfa1
https://rvm_io.global.ssl.fastly.net/binaries/amazon/2018.03/x86_64/ruby-2.5.3.tar.bz2=1e8df4367b81e591f349d8d78cd321fd72bc908de5cd1b5f29211ce75bae6d3943f6c04f7223a6025c3250eeaf4f3fd1143c5bf41acbe574c516e5fc6468212a
https://rvm_io.global.ssl.fastly.net/binaries/amazon/2018.03/x86_64/ruby-2.5.4.tar.bz2=3e9adaa23225d44bee6f14ae968856bf22dfc9e9b834de4dffa664a836b47754cbbd3d378e14120e0dfb9bacbba5ed7a18c0a7315f371d37b1c05cece343fd38
https://rvm_io.global.ssl.fastly.net/binaries/amazon/2018.03/x86_64/ruby-2.5.5.tar.bz2=eaa3b71951a09c0805a012e4465f81bad629d1924823f01c72f776ac04b9aae89e2cc9ebd3e809ec4f9793b4d0aa787e96716fa024a904c65ea700e1a5f5298c
https://rvm_io.global.ssl.fastly.net/binaries/amazon/2018.03/x86_64/ruby-2.5.6.tar.bz2=21c26e7c621f0e85b3c797dda0e320bae9d0897778b0956aafb2fb46b2ba7d96d011d4003e5a4de01ac9d0f0dd51bdd10a5235cf81ee8c87bb13bf8cf8377d02
https://rvm_io.global.ssl.fastly.net/binaries/amazon/2018.03/x86_64/ruby-2.5.7.tar.bz2=8d8c755819da752d81bd1e4e768bc4734b9f9bdb5b7041dc2adba3066e7afe4027752d34cd7488a19b3cb15f9d9fd1104a7650f1ff579349f66032b2f3bcc0be
https://rvm_io.global.ssl.fastly.net/binaries/amazon/2018.03/x86_64/ruby-2.5.8.tar.bz2=dc4823b99a45e40e87bca3ab4152cce7081f43f1de98bc71736c34e91a738bd5e5af78046e7d9fb20635d025a72cc64d21855c5df6c39c388d685543ee1efdab
https://rvm_io.global.ssl.fastly.net/binaries/amazon/2018.03/x86_64/ruby-2.6.0.tar.bz2=e446f193164a74fb41b02942ec9581c98a7c83001fa68fb3b100abf7e47f0d2a5fcdd9b16d34f9b1925264fe84472cfc7cf695851198ac79375704b02e91fffd
https://rvm_io.global.ssl.fastly.net/binaries/amazon/2018.03/x86_64/ruby-2.6.1.tar.bz2=a03a2a12a6aa676b87da02a35210ae433eb765cfcf5b41ec029fdc039ce382de6b505eaf5cfb797b1092aeecbf73d5a33e1c87be9774b43a59f4ebfc194c185f
https://rvm_io.global.ssl.fastly.net/binaries/amazon/2018.03/x86_64/ruby-2.6.2.tar.bz2=97812438de220ec8c08ca536eed5f28f1e6e257ecf9298771c9911f67eb189a2cecc06864250440b330a2bc69ab546f5900aea27dae9c7faed8362da883a3789
https://rvm_io.global.ssl.fastly.net/binaries/amazon/2018.03/x86_64/ruby-2.6.3.tar.bz2=9ca7600666652158b70618eb9a75be02319ebcae85514130108f88a849ad75e033214ce737b6bcb5b55d4eb58d5b3e027dce6398f672e79169cd8300d9900a8e
https://rvm_io.global.ssl.fastly.net/binaries/amazon/2018.03/x86_64/ruby-2.6.4.tar.bz2=941eb3a54ae31b62e169054bf65832af0aed6fd7c7e1b8a7762c91bb0d697c56f8cfda1a59a8da5f5f3d7dbaa2b9b2dc00bcf321473fbf871df911802b946ab7
https://rvm_io.global.ssl.fastly.net/binaries/amazon/2018.03/x86_64/ruby-2.6.5.tar.bz2=697dc14af56b0b91730560038e8a10c47971fd3c6bf8ed8c73cfdb0fd2b489a73816f09591507fb51e8408a434c3f2c0e742ee01a1a785d19015bd7145b595fb
https://rvm_io.global.ssl.fastly.net/binaries/amazon/2018.03/x86_64/ruby-2.6.6.tar.bz2=f0d1631e6999c22516975f5d937d3f5a7eab5d6b41d2ae1805a5ba53d271dc4f1d91221b2f05d3547914af71de5b4f7dad324ed874b673efac583ac9ec8990ce
https://rvm_io.global.ssl.fastly.net/binaries/amazon/2018.03/x86_64/ruby-2.7.0.tar.bz2=24e047cf668d25b92293ee548951f983d8c1bb001e9c7e7e7044023970b64a9fb33f480eb68ec601a58746785d931c9561ac32506aecfb3a3bb7d8b2374b7a32
https://rvm_io.global.ssl.fastly.net/binaries/amazon/2018.03/x86_64/ruby-2.7.1.tar.bz2=b1005864d9941ff5a6c66b3d08235781a13960b62cacf27b72aaea02ddb0854a4753281526e89ad06826d469b673d9d5f3a2079b5f19c003486716ce17b52b91
https://rvm_io.global.ssl.fastly.net/binaries/amazon/2018.03/x86_64/ruby-2.7.2.tar.bz2=4c5ecf9c0f63b5dbe25d4723a5588d68ed7c44dc93bbb9428fca5a6369e709079f02047e0ffc2318557a3e2d54b8cdedf5dec817cca063b87e37f71725900f9b
https://rvm_io.global.ssl.fastly.net/binaries/amazon/2018.03/x86_64/ruby-3.0.0-preview1.tar.bz2=5447a46dfc35b786ac92f992c356db94f43e6d7dc9cef550ad6689a5b2a14b2dcdf63d4837887c2923542efdffd00d20d951b15a5abf1a5557adaf5f5b060717
https://rvm_io.global.ssl.fastly.net/binaries/arch/libc-2.15/x86_64/ruby-1.9.3-p194.tar.bz2=289f3921543eb096b0d50a2ce7f8655176f6f4dbc8a52aa1342b5238e33f36c9dc78948e4144f41eeca616920ba3422adb0a17d216ec7d2cfaae51f570c1f9b3
https://rvm_io.global.ssl.fastly.net/binaries/arch/libc-2.15/x86_64/ruby-1.9.3-p286.tar.bz2=29d827ca2241fe8b6ee2b6e5bf454820594c4631f46748e8cb4402052b848b43b3f2095d97f57aeb84815193af0e191f80b0f4967aeeaacf9109af1386f17295
https://rvm_io.global.ssl.fastly.net/binaries/arch/libc-2.15/x86_64/ruby-1.9.3-p327.tar.bz2=5cb51f8f9e788c4e9dc3314834683fae4dd2a0ab4b987f5c8253ab9d6e00813f862e2f5b58a984cb5d777ff98cef781a52e2f123c39be65842e1074ccc8739bc
https://rvm_io.global.ssl.fastly.net/binaries/arch/libc-2.15/x86_64/ruby-1.9.3-p374.tar.bz2=2883226de3e447d2f5ca8c78b1615cc7e5a994cff3edad9a042b3fe9672f3ddb19d266e0942d95e57d676c4e2c8b3cd4e99a6694fd2631bceaea12cd133712ef
https://rvm_io.global.ssl.fastly.net/binaries/arch/libc-2.15/x86_64/ruby-1.9.3-p392.tar.bz2=8bfed3cac9e8edeb3de3b661e9011baad4c1fc6903f4f758298121ca5d814bf99652ddaeb39c431f0c726b27da4c18ce1187001ea67f26f765386142c85f9e99
https://rvm_io.global.ssl.fastly.net/binaries/arch/libc-2.15/x86_64/ruby-2.0.0-p0.tar.bz2=1361da1e026595d5b0c5b1adfd070c600b818ed1d053d3a33950b6748df9493cb59852d167cb17fcc384bfe9e65e1c4d8f9e4d9886fa1bdfc44f10bc4c3466e4
https://rvm_io.global.ssl.fastly.net/binaries/centos/5/x86_64/ruby-1.9.3-p286.tar.bz2=d23f786009bcceea143bd0e0af0d3faab16cdfafc93d16c4431c878b812b9f1576a6efeb9104acf2176eb4cf1bf36425f7109a8c6b658273b2de41b419936ce6
https://rvm_io.global.ssl.fastly.net/binaries/centos/5/x86_64/ruby-1.9.3-p327.tar.bz2=210b873ca88af8296ea9b254c84e7108ac6dfdd988c2c740e8616479bf7075087f361bdcb21b3c392abe7045831336c47639f41687a0f43f58e97c18bbb6ca64
https://rvm_io.global.ssl.fastly.net/binaries/centos/5/x86_64/ruby-1.9.3-p362.tar.bz2=daec451a0ed5ff59809b0492a94b4a0d5d3b2ddcffa726651525770cfe879aa9bc63aadb33f9b71b54f2cf2d4f10e3ff2b1e050e37dccc8d11c35848aba199a5
https://rvm_io.global.ssl.fastly.net/binaries/centos/5/x86_64/ruby-1.9.3-p374.tar.bz2=bbac2f710f5bc37cf67855c40fbf49bb422c735c410938d3d05662a798717f0004fbcb900e76816eac0950fda5c590b638e6ac42d2173de1aed062cbcc4c1ac6
https://rvm_io.global.ssl.fastly.net/binaries/centos/5/x86_64/ruby-1.9.3-p392.tar.bz2=f810db858f2900558d33f4935aaf92c5dac3b24e4f37cfc7787e4e02d66e605651eceb04d618414d5827e74a983462c6c3baac2e91a9942947184842be5dc27b
https://rvm_io.global.ssl.fastly.net/binaries/centos/5/x86_64/ruby-1.9.3-p429.tar.bz2=d0a553479ec212a31f2d055882a52d0c4bee749f6b557f20803dc023673c773f221e6737384c8efc2a5192961547d6e56a7ea4e9953d3f2a992bc76aa287b8e0
https://rvm_io.global.ssl.fastly.net/binaries/centos/5/x86_64/ruby-1.9.3-p448.tar.bz2=720364659014e7955d1c18a40d71cc4d4c8b1938ad1d708bfa103b16809552fccf6440c575d1774652147812c7565a5979892fc87cbe3828eb5165108a51897e
https://rvm_io.global.ssl.fastly.net/binaries/centos/5/x86_64/ruby-1.9.3-p484.tar.bz2=3ed6d153faec5391800f088a3f4da3432a913972fdcffa1fecd81daf11d9b46d8abdcd5567ec84361ecbb583d276cfa905ad285497a2594791ada0ec5030dd84
https://rvm_io.global.ssl.fastly.net/binaries/centos/5/x86_64/ruby-1.9.3-p545.tar.bz2=09771e0c108393356eabc0415b1295c6d5d3d75c65797d9757ec451d278fe02534532661119309889581d10d359db8185977c168662e4f65d1e6ac64e4192ac4
https://rvm_io.global.ssl.fastly.net/binaries/centos/5/x86_64/ruby-1.9.3-p547.tar.bz2=9c9a9f8853581e3609f706e93990301c55c04e9b4c0f68cc6324d1a1040e6170069462c732c3eb8e809775a5d747c4311daf283ad832654abdd36f5361813a3a
https://rvm_io.global.ssl.fastly.net/binaries/centos/5/x86_64/ruby-1.9.3-p551.tar.bz2=a04bc818dcbcf3aa39b239207f7c4ce508d5cc2b02b29279a8e371622fe7bc2c086f3f7532eeb3e73e54b127debc3dc30df975db4bb35133c67e420a96888fde
https://rvm_io.global.ssl.fastly.net/binaries/centos/5/x86_64/ruby-2.0.0-p0.tar.bz2=e7de3f7ed558950e548cfbf61312ef6402ec63ef96489fa18c0b108b12e631db2264b95454e50b1e0567048f44974ca1d6aeccf5b82ae6ee09fac0f6616c9c80
https://rvm_io.global.ssl.fastly.net/binaries/centos/5/x86_64/ruby-2.0.0-p195.tar.bz2=3895faea29f2188c3ea9fb2deeac49453ba2f0942bf94ff55fb66937493deb5c0d7969d93198ddbce8a4a060fe12a7cdf83bae0e07793a1c147a5a82f945fbed
https://rvm_io.global.ssl.fastly.net/binaries/centos/5/x86_64/ruby-2.0.0-p247.tar.bz2=779479c5b73112eb1b8fb46876b4133b840f491cfca5738f509a5af211668e171884b8261c2b2360744da192d799a387108d426474953419b7b0e3b95ac9cd38
https://rvm_io.global.ssl.fastly.net/binaries/centos/5/x86_64/ruby-2.0.0-p353.tar.bz2=b9f77ff0be691ebabddfa50827c001ca5423cef39bc7be4ebca6d67a0eb77d0038c3ec7eb6646e1dad22e453827f7b3faa2b82d0c4006a727aaebdee17b17143
https://rvm_io.global.ssl.fastly.net/binaries/centos/5/x86_64/ruby-2.0.0-p451.tar.bz2=61c78e926ee795759c969ec8c289f14ea42e0de736c0873773946dd07484ae1a804bf8a586057e052fb281a5042cab6157faf95729b68e103ffd0dd5fe7cfa92
https://rvm_io.global.ssl.fastly.net/binaries/centos/5/x86_64/ruby-2.0.0-p481.tar.bz2=7d4243d7f029f779e9a90d4dec1d224ee72ba2d94cef971632dc007ecab24a0824e75311955fbebaad10ad50f778ebbbf0be0f064041ff989a2cc87f1dd20e08
https://rvm_io.global.ssl.fastly.net/binaries/centos/5/x86_64/ruby-2.0.0-p576.tar.bz2=cb706e710673731b586953bf0816872b030f265325c76986860734d3f62bf504988e767812e3f0ebe17be6bdd216b61f0591ab75dd78f75b77eea47ceb1e50e0
https://rvm_io.global.ssl.fastly.net/binaries/centos/5/x86_64/ruby-2.0.0-p598.tar.bz2=9109450a5d20b137a1c4e354fcc8f86361fa585450e7b062f1bd43d2ab337d0fa4f2a63ce8cf47d72ef00050cc8d4999a2fe87bc74363f7311dbb20d9bfd4464
https://rvm_io.global.ssl.fastly.net/binaries/centos/5/x86_64/ruby-2.1.0.tar.bz2=15b15ab378f0eeb4c4f08a586e739908146eb276da824b455ea836659b4f7f34129c51eb8cd1b63acb3a1cf73c2ff8a6d4f45498ccf212f4511dd1f7fb521f9c
https://rvm_io.global.ssl.fastly.net/binaries/centos/5/x86_64/ruby-2.1.1.tar.bz2=265fe9c5e2df8e36fc7da739cb1252f52434dbc63a084c44ec742b1b365e65eb5ce7c2de6fe9c3e0c377a5a20301372a8a5b4dfad21d2b7ee435f34ed579e3f0
https://rvm_io.global.ssl.fastly.net/binaries/centos/5/x86_64/ruby-2.1.2.tar.bz2=2045c596282b7288fbb018701f917e005e96a760904c1a11a0854424f710c3fe5876d42de5376b4f14cde33bc4ce3b44033703a4e8311a9f78d0db174797d386
https://rvm_io.global.ssl.fastly.net/binaries/centos/5/x86_64/ruby-2.1.3.tar.bz2=cd2c589780369ce062ffb1fb0c59a5790abbdddbb5c46fd39527ef727eae9bdf048fa891b4a8a577de9e680e6967369852c4d7c5010892432d6ba09f3b30d893
https://rvm_io.global.ssl.fastly.net/binaries/centos/5/x86_64/ruby-2.1.5.tar.bz2=d5f3c570d8e1b004912310a4b223630bebf63d8c460830b9d74f053e3eb2387e3fa5424c7e71249bef2e8d3547d9b51e8d42d0f5579dc1709579d2b58a9ccbfc
https://rvm_io.global.ssl.fastly.net/binaries/centos/5/x86_64/ruby-2.2.0.tar.bz2=1c1cf43f27d0336169ac51a01d8a8524f30d702d3c860cdd41b093b80576d0a7300740ecc2bec75a92e389b50df449b6d477b3ab55f711c3a7474bcde4228d68
https://rvm_io.global.ssl.fastly.net/binaries/centos/5/x86_64/ruby-2.2.1.tar.bz2=64dc05e0a4fe1081aaedd5b9b2a39f7db476519f6fe7d4010da24cd46472086b251b4fee02bd97a582c8a9e97a2270c2d7a01d3281043ba668b58ac21ce9a98f
https://rvm_io.global.ssl.fastly.net/binaries/centos/6/x86_64/ruby-1.9.3-p194.tar.bz2=3aa98bbde868c5056d6684f2cb321da2f491a65aac92ad39c9a541aab3928cea63d299583a795380e8185a94dafc142ef6eb80e8510c8024a5d4d5d176cedf46
https://rvm_io.global.ssl.fastly.net/binaries/centos/6/x86_64/ruby-1.9.3-p286.tar.bz2=69b2c7c0b0b2113e94b782bd6a9c938d46befc5e7f0594b303b7f0f249871557af37c25307cc955873ef91c83759f350ed0cec003224bd54d51bd76e5e76d9ef
https://rvm_io.global.ssl.fastly.net/binaries/centos/6/x86_64/ruby-1.9.3-p327.tar.bz2=2c5a08a01f4cabaf4fdb3f043c9e324fff4847ddb999415cb99c05db7c447cd13833b6905288391040e87ddfa06223f8a9b9e2f733a4a5c94325ebf2b55732c0
https://rvm_io.global.ssl.fastly.net/binaries/centos/6/x86_64/ruby-1.9.3-p362.tar.bz2=108e4809fc7fdee55932ec86374867a34876156a907f85628ddfcf252abad26c38c008fdedd5d684f55ddbfe254be1328cf180df5737a5219db76edde5e64fa8
https://rvm_io.global.ssl.fastly.net/binaries/centos/6/x86_64/ruby-1.9.3-p392.tar.bz2=0e9770b53b84192182ea113f400828b47df8407c9162d0b8d4caa7e6cae5b999db9559dd1b142adc7e750cf4c053d9b02c46664df6dec85a3a6b1b2fdb317104
https://rvm_io.global.ssl.fastly.net/binaries/centos/6/x86_64/ruby-1.9.3-p429.tar.bz2=a9288365f55ab39b1214b046dd77f0f25b7ffb4a8c63ece7200e8173d69c82f766cbcb0c322cf0f2dc5e66ec4d3f111f2681f1abf0e4110342b4c99888bebe29
https://rvm_io.global.ssl.fastly.net/binaries/centos/6/x86_64/ruby-1.9.3-p448.tar.bz2=2e7bc5f6d501928f01de2a6d9035f56f40678d410bc0629ef00e0e70565b49991c4570f19c34faa1bfef2ad4cb460e4c28ee2eaf5c0696a403d0847f17d4c22a
https://rvm_io.global.ssl.fastly.net/binaries/centos/6/x86_64/ruby-1.9.3-p484.tar.bz2=1f3d919f6540dae79971d3c9218532f289bed5fcdb2028056b33292f423cc718abb4ad3a3b33e02747770d62291abda7f5ab9b784067adbce39bb5d147e6f88a
https://rvm_io.global.ssl.fastly.net/binaries/centos/6/x86_64/ruby-1.9.3-p547.tar.bz2=47df6c48290704b5ee4741010c20a79dd70a4412737e3bc5f14ed99191849cd5411edcee880b9005e510147068061906753a91da907bb9f0a72c55fbb4a6ca69
https://rvm_io.global.ssl.fastly.net/binaries/centos/6/x86_64/ruby-1.9.3-p551.tar.bz2=16abcbe568ff3cbe557f949e6c34015149fe2a6c836ebdabb8079346af59ae129ef586c9b0166b73f11f73e2c5769eec8e35de02306817f2d14b455a2a12c9e3
https://rvm_io.global.ssl.fastly.net/binaries/centos/6/x86_64/ruby-2.0.0-p0.tar.bz2=1b9afddbf147eee824d8b9e1e182d01d2fca9730925241cba19359044ebb87ed15cca7f2bba7ca9c9a1125bee235b99e0beaddf20e20ba6540c00a3ab4984a4e
https://rvm_io.global.ssl.fastly.net/binaries/centos/6/x86_64/ruby-2.0.0-p195.tar.bz2=03546af00dac6fcc1a25f4cf75d1b4d56d7d9180ae8af841cc86f7ea1adcf1d558a006a2a88fd10964df50c59f2bdf61c3ab3c1e648292295ce7408cb7e208d4
https://rvm_io.global.ssl.fastly.net/binaries/centos/6/x86_64/ruby-2.0.0-p247.tar.bz2=6929240b591970249153fd7cb9aae47821a3efe60cdda3bfacc334cd7301635d6b71bdbd5e122b5e17d02559b6bad8711ecfbf38aa6f947ed28b5b1154a38efd
https://rvm_io.global.ssl.fastly.net/binaries/centos/6/x86_64/ruby-2.0.0-p353.tar.bz2=3ec257a3be47ad20245c2d561f87d60990698dea0a6127066e73ca8cf46a3a80cc974a562fddf156e0ebb54b3ec29e84afb27699a95ce344b2092b8e441c7c27
https://rvm_io.global.ssl.fastly.net/binaries/centos/6/x86_64/ruby-2.0.0-p481.tar.bz2=726ebfca4fc27e81f69136f1f2e1e49882335400debc8873b9b0ef8f21fa7a3ac04c1d2af5137b50ef6f5b1affce13e0d9e24b02e7b57317b2e561a43348655b
https://rvm_io.global.ssl.fastly.net/binaries/centos/6/x86_64/ruby-2.0.0-p576.tar.bz2=2f3330ed76aa9fde3e1b450a625d68e24e829da3200c069ba83a542248ec80cf703a4594cd1e8e221b51a47213f8c03e707080502a1fc804e8ff1d14eac4fe5b
https://rvm_io.global.ssl.fastly.net/binaries/centos/6/x86_64/ruby-2.0.0-p598.tar.bz2=545fcb7a7720669afc3feb493d7207f17cfa4ba3aca052370e309a6773ff107e544f8456d14b4a01c1b73a53178e8e068cc617a14d8bda58ad3d39a078623ecf
https://rvm_io.global.ssl.fastly.net/binaries/centos/6/x86_64/ruby-2.1.0.tar.bz2=e533422da11aa4c4ee18f38aa3384327b1df5ceb12014ab36ec1ceaaefa1743174e4f722791bd05bdd10528ba0dc16e61219ec398817463c3af0bf96fb38d1f5
https://rvm_io.global.ssl.fastly.net/binaries/centos/6/x86_64/ruby-2.1.2.tar.bz2=5b83a132c25f020344b82b1720d570faa517d6af1bbefda9997f96f3464b6c72a55aa71f1458bb2330e2d2e22b305c53e6ea76a581920d7fd1cab853b0567039
https://rvm_io.global.ssl.fastly.net/binaries/centos/6/x86_64/ruby-2.1.3.tar.bz2=435502600737de465999f6052b8177477c363cb33ec402ad19a39dff1c5489923981d5b0df1133c91dad7b8fd683cb7dd60eaae4d687884ba59cc2559fefacc2
https://rvm_io.global.ssl.fastly.net/binaries/centos/6/x86_64/ruby-2.1.5.tar.bz2=44be9ae84a92df919689853359b480f433ea502440bef7d8b87f4374cde918c1f401a66999d554db95e61637bbf8c4934bbd93d03561835598c1c6c94735c0a8
https://rvm_io.global.ssl.fastly.net/binaries/centos/6/x86_64/ruby-2.2.0.tar.bz2=ad5b8e922c3a231a0c29b70183bcbbdfe44a37ab1b89a12630263d39280b1b5ad01fb0145a63743945e6301b8ea501a0fe32a341f7b1db71f15d1dcc3562b45c
https://rvm_io.global.ssl.fastly.net/binaries/centos/6/x86_64/ruby-2.2.1.tar.bz2=4cea7399c9ae0b67325618f42b41e91c1d09786c45e2b6b0f319b4fa38a8b9f28e9599b490831e257763599c4a0d0c49b0fcdb3585e6b0484eea8566dedb69e8
https://rvm_io.global.ssl.fastly.net/binaries/centos/6/x86_64/ruby-2.3.1.tar.bz2=54e888794440c8c6f5c2d9c14f164f9e88d0ade45822004ed133d68131d2536f3048ddd9a854ce392e1e38992389de4786d8fd0e4d271a4a6295eafc73ffea32
https://rvm_io.global.ssl.fastly.net/binaries/centos/6/x86_64/ruby-2.4.0.tar.bz2=cf31d026fae221ded2c0a1c38917857d9a2258d7215ad74f36f4709b5e619b15786bf7108517c451361ae41b1148f94b7e8730bd8f9196a290517b4d6d4868cc
https://rvm_io.global.ssl.fastly.net/binaries/centos/6/x86_64/ruby-2.4.1.tar.bz2=69af5beba0234356c38f624fdbc7fdc6bff38a866b90cba2c2ba808f5030ba2cc7a818f58e22e35fad4f18cdd6067498cd48e8fc23755008c7efd52e03eab2e5
https://rvm_io.global.ssl.fastly.net/binaries/centos/6/x86_64/ruby-2.4.2.tar.bz2=601ad7c34274cdac4f26415d2677767d8dec01f6a3dfbc4d3a34bbe3274a8feba76a403b15d044ca4f56aefcc16d7b4d9d3c74c18cc5cc943427b151f0966d3b
https://rvm_io.global.ssl.fastly.net/binaries/centos/6/x86_64/ruby-2.4.3.tar.bz2=44fd554795d51a4f02e25c742ffdc1c771fdd5c9e3710d1732b9381e912619553ea5376faa5c2bbe2527df9d69fb5b21628b3c017e034952e3c33dc9ff71fb7a
https://rvm_io.global.ssl.fastly.net/binaries/centos/6/x86_64/ruby-2.4.4.tar.bz2=645804075fed9a4207a9c9c923d4c7f8ce962a108fe4aee7bc3a469b04680d897a3e4f45e953807afb98f822572f989409fee1b9d76c55301866aa6884ebe4e1
https://rvm_io.global.ssl.fastly.net/binaries/centos/6/x86_64/ruby-2.4.5.tar.bz2=22152d7226f783df36780d13c59c5e28956c56cc92e557d979e8128dea83e65c8b611705fdbf53564c31c1e7dd48c32de38267812b08ff0f778b5339573a55f2
https://rvm_io.global.ssl.fastly.net/binaries/centos/6/x86_64/ruby-2.4.6.tar.bz2=f17a36a189310c0497618e1d3977be47978b9de3033ef707a4d0979ccea4332dc8d12e7f99555870d5863b0e911d301d0694043d9dd82b85dfdef4664b60da78
https://rvm_io.global.ssl.fastly.net/binaries/centos/6/x86_64/ruby-2.4.7.tar.bz2=959db6e7983c02d6fd86904a58cd9c0b577b181d123911cb8fe1749d34f43d4b0e84df6635e93d9d17c7da3bf18c256f8a854bb1b7adf846130f3d00e45aeb8a
https://rvm_io.global.ssl.fastly.net/binaries/centos/6/x86_64/ruby-2.4.8.tar.bz2=5eaa61b86a54b1acc0f03e731a09414e39f59baf35f09be5e679827c9558b00da276f91cc5ec0e54c15d29d0ea66f8b0ccfba2936aec769b24f65c931294df96
https://rvm_io.global.ssl.fastly.net/binaries/centos/6/x86_64/ruby-2.4.9.tar.bz2=7db75f5f97044fc832725bf3849fe85e2e4f7926bde98cd2bf4bdf7de54b32286e6479dad5b0d917f8d89995ad2c87f3522b09534b027799dc497f291f2f151f
https://rvm_io.global.ssl.fastly.net/binaries/centos/6/x86_64/ruby-2.4.10.tar.bz2=c7ceebe11ae3756c2a7719ef63ccb51adaa58daeb4c0b751f98ff8bdf84949aa12229c956c4504fd1a60a8ebbf5a1d9b38bbd33e5b1211806fb02c8b1570d669
https://rvm_io.global.ssl.fastly.net/binaries/centos/6/x86_64/ruby-2.5.0.tar.bz2=958d344a99bd7cdb716e3a1497aac1e87df9ce8e2053948ec94f2448ffa46097ed1481d02c1245ce7e009ae57491503f018d79da61249071e19e3583eea77fba
https://rvm_io.global.ssl.fastly.net/binaries/centos/6/x86_64/ruby-2.5.1.tar.bz2=36b00718bc74d3149fa40d10ab7f66f837eb92760f14f16a3e6fc50386ed76ef8fb7758660b24726924502bed1c0dc409d49487ff7f85a4f54cdac8e47e9d461
https://rvm_io.global.ssl.fastly.net/binaries/centos/6/x86_64/ruby-2.5.2.tar.bz2=cb3251a05b2b8859a3432c21e3677f65e84ca4510dc87a9a81dbe3d8bc5edc89e7863bcf29f6011d54d35e10d1122ff798cb622569af9ab0f266de2ab767d961
https://rvm_io.global.ssl.fastly.net/binaries/centos/6/x86_64/ruby-2.5.3.tar.bz2=b57f799987115e6ddd3aae6fbfd79d5a02582e00180e4f9e347290a6d84ff6a57222300310d0c221a8dd3d84d7321481ad7508aa574a7c8a3e91bdfb2112b32d
https://rvm_io.global.ssl.fastly.net/binaries/centos/6/x86_64/ruby-2.5.4.tar.bz2=9829e4f4e2c98b09f5bbe8f004cd9cdf422ea6a0a42fa91892fc61725442443dca901f1b055b094476a2023842453da6e33dad8102f0330fef464430914079aa
https://rvm_io.global.ssl.fastly.net/binaries/centos/6/x86_64/ruby-2.5.5.tar.bz2=b76cdedb329a3fe92b92fce95ff477d6019ab42fc33d71ba6a408b818199c4b9ec160c4a6de5d179516e3213950642a32e0f2c2a65f6dc4cc62805f61a01b350
https://rvm_io.global.ssl.fastly.net/binaries/centos/6/x86_64/ruby-2.5.6.tar.bz2=6ed84e55e55d42ce208b24278fda3e515126026cb91ce9f89813f12890d7f4b30553f0850d7cccd070083cd64db8d4ebeb2a696a4cca98ef01d6bccb7533ef2d
https://rvm_io.global.ssl.fastly.net/binaries/centos/6/x86_64/ruby-2.5.7.tar.bz2=043a9266146dc9e4b86d4bf25bd48f6dc9fe6e5d94a536106a875bd7a9c78fef508a64421b7ae33c4108075f05613072f364f760356532bff095790c0cb9fae1
https://rvm_io.global.ssl.fastly.net/binaries/centos/6/x86_64/ruby-2.5.8.tar.bz2=065625542b046272ac8ac844a38382b0dc40b01e1c70d79d1cdd76b720120ecf00080481bbb4c65d87aca0893982a5e7d5de364c98ba583669313ca75b94c158
https://rvm_io.global.ssl.fastly.net/binaries/centos/6/x86_64/ruby-2.6.0.tar.bz2=1bf007a38c450f06e919ef01ae38106f336a43b347660633b8484f14f5d9b02b67d2de8cb913b49511b83c984c04f290606571913ab937136e87d264f42c943a
https://rvm_io.global.ssl.fastly.net/binaries/centos/6/x86_64/ruby-2.6.1.tar.bz2=d8813c1e6d3fafcc3a7bf33a5261ca8990b05e08a45446e31748275862fdf0c8c17e7db89b10f7023d2b4fb72d5f751cf7c549323937d4daa3c1c33e2e57b9d0
https://rvm_io.global.ssl.fastly.net/binaries/centos/6/x86_64/ruby-2.6.2.tar.bz2=3eb93723d016020b4ad97146e8df4d62c735a57b9a6b99059f2c46b1e5e9337a1dc82a1bbd6ca7567c461b8a97fe763f6766585adc93e67d312c95897814ec8a
https://rvm_io.global.ssl.fastly.net/binaries/centos/6/x86_64/ruby-2.6.3.tar.bz2=0a78e80bc86e844fa2144ca140dabbd24df464ce12b1f119f6658098b9634db619b272587db11da779c268bbef893875b2d2e68db74dab5d57280152f11d11f9
https://rvm_io.global.ssl.fastly.net/binaries/centos/6/x86_64/ruby-2.6.4.tar.bz2=ed1d973d688cafb94a59335393c012780377c56a657314e2be510b775bddbb551d09b44f30be03339f3b59637518bff68b8f8bc6c23a6e637c88d11243585e26
https://rvm_io.global.ssl.fastly.net/binaries/centos/6/x86_64/ruby-2.6.5.tar.bz2=2f87b57bb177abc6dcad218a10ae5876d2f364b2af3c42c26f4ef55d60c5e9899aed75b647aed8149114d4da27ac98e4eb8858c2f1c2333fbaf726eaf23a49b9
https://rvm_io.global.ssl.fastly.net/binaries/centos/6/x86_64/ruby-2.6.6.tar.bz2=98a32d7bd78edce70b76d90c9e1953f2e25ef52d99425eb7be7d708c54c8564ee73700187ce3da5f9c470d25dee72a0152fc46a7d3957da20e408ddeadc0498e
https://rvm_io.global.ssl.fastly.net/binaries/centos/6/x86_64/ruby-2.7.0.tar.bz2=8d20da9561db37893841cae98ed3252e3fe19c81e49e02b4775c87fe015df9c25c1cd9a15e92c47f436665a1b139c272725f13ad52074018a9ab5ae63343d407
https://rvm_io.global.ssl.fastly.net/binaries/centos/6/x86_64/ruby-2.7.1.tar.bz2=b1559a30c2140d4110897d86e118276262668f07a8c341a3e85e615c703e69ce7a25bc5579a266bc091dac6235c5b0c608fdd32db83c3f7601585711d8e99e28
https://rvm_io.global.ssl.fastly.net/binaries/centos/6/x86_64/ruby-2.7.2.tar.bz2=b375e5f4ba4774c31e35a8be92bee2a2c779ab159d2426e7cddfe3ceacc2b5b9b8be2585e7b9d613ad2b4906dc0312d93312a7edcce161aa2c523a4f7722f2a7
https://rvm_io.global.ssl.fastly.net/binaries/centos/7/x86_64/ruby-2.4.0.tar.bz2=6b03d4817def6fbfcc12ce39ff97435984c22804f6488a1177eb0782b070f6a72fa080daa3f563741b7185c79b73c34b25778e6c68ab6646e86a6c131351ebce
https://rvm_io.global.ssl.fastly.net/binaries/centos/7/x86_64/ruby-2.4.1.tar.bz2=9b49faee96730806942a104e1c128ae29f6949608f81075a5d430d33996fd5fe4ae6c1ee9ab0ac41e8cefc8efdcf50e8d315fa3e8c5e228e19d83e03aa4db7db
https://rvm_io.global.ssl.fastly.net/binaries/centos/7/x86_64/ruby-2.4.2.tar.bz2=cefe856736de3893a0caa763f120ef9a06e7ece608c486553e4228f820872e733d412ef047d9e6262b54fc59e066b5682f07dae5ddaf01a5b08836a9808fa9e2
https://rvm_io.global.ssl.fastly.net/binaries/centos/7/x86_64/ruby-2.4.3.tar.bz2=136171b2596c29ddbac97794d71bb9fff406f34d1e35cfb3d5c87d8ced3c41c113b4d535eb50734c9638e04f7b145bddbe098bfdb23146dcba004c5b7197f7c7
https://rvm_io.global.ssl.fastly.net/binaries/centos/7/x86_64/ruby-2.4.4.tar.bz2=88de8e6406d5bfbf4af173abf561797c97fe4458a9041723c139e1380f10df3c7792664b86d320c13414177303bb2c84e87137da2b20a5ae6ab638c63cb44d56
https://rvm_io.global.ssl.fastly.net/binaries/centos/7/x86_64/ruby-2.4.5.tar.bz2=57e4227d89bdfc643f949efa59648b0c6d310cab38ed3be3874861134c513c8ecc4f063ee8fa6bc0d9ce93785d08eaf75ec6a96334eb232cc0754254aa791292
https://rvm_io.global.ssl.fastly.net/binaries/centos/7/x86_64/ruby-2.4.6.tar.bz2=36051e04bd9c8334d72ecd9c5d3e96635316a3cbc8aaa173b8a6da7c975ab7376ff766ba2f0a9dcbd5717fec43470189e4e7e062eea37e825a313ac07deeb0c0
https://rvm_io.global.ssl.fastly.net/binaries/centos/7/x86_64/ruby-2.4.7.tar.bz2=cd1ead729cc06a47dd601c6f3bc1c07e558432d824e7e80726cb15c619dd5a17d0d9b3e321dfdb0e8cf7e309942cf6ea3f94bc9c61a6024dde04b8437645f863
https://rvm_io.global.ssl.fastly.net/binaries/centos/7/x86_64/ruby-2.4.8.tar.bz2=6151ade45905067b4ead2dba600fa1c59da7ab4b459610f97ebece336e1a3cc85efc23b0beca0c08315125b42ce73847d84ca83a18b80bd7f93fafe8bb6a095a
https://rvm_io.global.ssl.fastly.net/binaries/centos/7/x86_64/ruby-2.4.9.tar.bz2=ea647a4cd6a90c4cb514d0fe5389b74c55c1d27e73e09c770f7905f744886ce29d8622e9b20826493810db81436b640c838f2c2b0022fecc3c4703d7a759c6f5
https://rvm_io.global.ssl.fastly.net/binaries/centos/7/x86_64/ruby-2.4.10.tar.bz2=9643ec3cfda7cfdfa89c56254ccca492fa00ba43feba348319f406767f5f8b61be7c7b8ed2f5d0bc887b0034929588660ab80de5fd602e2158de251e28e1b553
https://rvm_io.global.ssl.fastly.net/binaries/centos/7/x86_64/ruby-2.5.0.tar.bz2=de9d090626279955d8f46b98d6234b0bba8f58594afe36e59347a6d409acca99f40df3e1a32b78c7713af824c368b8c764af5b6f7951a40a9f6bb0d5292780c2
https://rvm_io.global.ssl.fastly.net/binaries/centos/7/x86_64/ruby-2.5.1.tar.bz2=b496953a5f1a80503944002c22e1dbafd0f3cde997c2d4932b8c03bc57e4bd901ec48ab0cbf80bd0fceeb975b7539adfb84d43f70a53905c547bd2d4a6c4415e
https://rvm_io.global.ssl.fastly.net/binaries/centos/7/x86_64/ruby-2.5.2.tar.bz2=f76579c383f2a7fa34256a79faaa4241f9c7fec1c3047435388f4296b164b3c7fd744d455967ba9e7b24a1390097894bd22a38e5398b047174cb6fc175cbae32
https://rvm_io.global.ssl.fastly.net/binaries/centos/7/x86_64/ruby-2.5.3.tar.bz2=18e66e6eade1547a285b7c316044dfc367e7990d4ed1c730991e2b2bc8a5875a5f55acae666dcf0e065d3c4079e14164f936d2394a383bfa5cb445a507b9408d
https://rvm_io.global.ssl.fastly.net/binaries/centos/7/x86_64/ruby-2.5.4.tar.bz2=953f7685d2040b9d917e707b0474ce287ceb908ff8419e7144000fec1ea907d136e8f8561f572303d2b31f5297de486ade5063ef89eb22f41cbbc4ce3f18a51a
https://rvm_io.global.ssl.fastly.net/binaries/centos/7/x86_64/ruby-2.5.5.tar.bz2=239f2aea96b30c5f69cd9f472e2f2197e69ce66edb3d7f9dc2fdec124a9b06ef1c737ca81c7237e085cfef7c5bf0b2fcef1b446ee9cbc9089ad9bb7c56467e4a
https://rvm_io.global.ssl.fastly.net/binaries/centos/7/x86_64/ruby-2.5.6.tar.bz2=dfd9f31e01baedff47bbd1018c337a30065784d9b4744bf8eb11b983c96757ff2c9b79b8d1dbfca67dd9544130967acf6070179394321a7eff57b7269fcd9138
https://rvm_io.global.ssl.fastly.net/binaries/centos/7/x86_64/ruby-2.5.7.tar.bz2=c843f2ea3030a5d695570c92ae104c8a5647d9dfa0d3002c5ab72235eecf9eb296c0afc36a390d29e800f7e3b16243998561c493bc0dd3335978d004151c3c91
https://rvm_io.global.ssl.fastly.net/binaries/centos/7/x86_64/ruby-2.5.8.tar.bz2=7ed0779a16e40da80d60a4933e0a2fdfe4517cda2702e4f93ed2a284ff348b127136d81e10f828af86ee58a5fde534dc0cc26c9e54c6c287cf5600300533d98a
https://rvm_io.global.ssl.fastly.net/binaries/centos/7/x86_64/ruby-2.6.0.tar.bz2=7eaf2809ded5af6db68c00650447bf3a606e258bdb336d392242f409431ef6756de90e5c751da9b3477a6587bf8bd63d7be74723f8d2298183f3df2c82579d79
https://rvm_io.global.ssl.fastly.net/binaries/centos/7/x86_64/ruby-2.6.1.tar.bz2=f6da0db7bd87bbad6b6557cafb833be38175557555980bae5d1b651b49428df4f9d73af601134cb8165c469acffe8422c2948e09c9515e2c15eec36f1dc27267
https://rvm_io.global.ssl.fastly.net/binaries/centos/7/x86_64/ruby-2.6.2.tar.bz2=cb92fcf0f6e55ab073cac78135b6a10516c463df263038a05dd2bc453dd724daddf9a03e0b90cf65e683b37e5024a427a7cfa62222b50f67cfa692adba5e1878
https://rvm_io.global.ssl.fastly.net/binaries/centos/7/x86_64/ruby-2.6.3.tar.bz2=9137b907700750aad5a7041400279be191888f10007b3f36092619aba242b72db875a47a76f11c0edd625d154f687f29321b461d258ffd7bad6f2ec434230d3e
https://rvm_io.global.ssl.fastly.net/binaries/centos/7/x86_64/ruby-2.6.4.tar.bz2=42659c35dd5ef48f148dcef911e30307850f54897dfcf59c22254559b504173c78ab6be4ae1a9bad7767e4762018d709038f7ad2968db5844f0c2e2ad1071b2a
https://rvm_io.global.ssl.fastly.net/binaries/centos/7/x86_64/ruby-2.6.5.tar.bz2=bee9931fa058ded6b64d4ae728cdee352f14308a56240c6f6f6d0bf6dc6886a76406bdfc25fa8b5631cb0e0fdf9e8c8942af4f25bc97d30376db53f0f1a75aac
https://rvm_io.global.ssl.fastly.net/binaries/centos/7/x86_64/ruby-2.6.6.tar.bz2=1aedf80e0ed1c8251cec75ce9fcd20c734969787f49b188a86634edd654a4942187da222d693cea35f86d9195c576ef0aabf400eb921f0897ee630a71397aa2f
https://rvm_io.global.ssl.fastly.net/binaries/centos/7/x86_64/ruby-2.7.0.tar.bz2=e9ed50ef02387e544fcddea115fcef88354b481d4e706713de804bc97c470dcb31eafe3ffb4a29d47122e6739652e85bc93a0eb03ec37d3f414d5f2a10c74cd8
https://rvm_io.global.ssl.fastly.net/binaries/centos/7/x86_64/ruby-2.7.1.tar.bz2=90d337be14eda27893fb12e09fa8785c49071d358f846b22addaa4161116124ed3d0b9672a4272734a6580443530b6fae5073da4ba4ed0334dc847d1f4453698
https://rvm_io.global.ssl.fastly.net/binaries/centos/7/x86_64/ruby-2.7.2.tar.bz2=0c3a7832b789730b5b456473734611ce862c2813dd1b274a18b70e0dd00c82628f59e5284c99cda518d58682581cae707a67418f798fd4322ab60840b4a91bf5
https://rvm_io.global.ssl.fastly.net/binaries/centos/7/x86_64/ruby-3.0.0-preview1.tar.bz2=22b5d90fd1445ca6379e549788c17f77a9c38557483e6399e74dd9e46b2254aa594b70a8479915317d727ea6028c56b5b41ee703061d3f372c412fc58073d621
https://rvm_io.global.ssl.fastly.net/binaries/centos/8/x86_64/ruby-2.4.0.tar.bz2=6601387c5a961f0daa477ff3f1a418dc24a508384a9ee121c22785ef2e03899fe11fc5494866febf2394672279ce9417ceb803e439d2edce88f9f072a334eda8
https://rvm_io.global.ssl.fastly.net/binaries/centos/8/x86_64/ruby-2.4.1.tar.bz2=707476a427d7a46538c10a3d0593952ecb8e1184f8e792099eff108f4a18622bfb86294049f81a2e99ee6c4ff1a0374c23e0e558cd85740c90cab70c9e2857e7
https://rvm_io.global.ssl.fastly.net/binaries/centos/8/x86_64/ruby-2.4.2.tar.bz2=c3cf83c9be600728ae621d0c77d67be5ba4dab7174c5fa443a73a0ea5218d0ced6e28461bc34c5e873f30c78b2388873c393b084d97bb7287e831763a17151b6
https://rvm_io.global.ssl.fastly.net/binaries/centos/8/x86_64/ruby-2.4.3.tar.bz2=4fa411fc611c841911e9c481800eb8fe02782f5bf98411830b7c98c1c3cbc5c6dc402c492a183f1a747dad4bcce09fae8a92349da4a1725aa3de782b26a4cf38
https://rvm_io.global.ssl.fastly.net/binaries/centos/8/x86_64/ruby-2.4.4.tar.bz2=12a48147ed46cd69ae1e42c410ff7756f744fc4881560bcb31f31ec6bc30438f85dad51cc25c87b7c963587f1f0caee711feb97ac7fe0b9b4221bc525bd9c67d
https://rvm_io.global.ssl.fastly.net/binaries/centos/8/x86_64/ruby-2.4.5.tar.bz2=0dbe1110b62a3520de4cf80f02170967557e369dfd69f9ff91bf8d5d280b99f5d25840b1b3b5ebcd800c755b293da481065f26d48b8779040dec9e04402ff357
https://rvm_io.global.ssl.fastly.net/binaries/centos/8/x86_64/ruby-2.4.6.tar.bz2=8edd6a1bc396868f072e5f2f90cc58e50a9062312bc9a6541cad3678909e0d2b6c91068c52fa0b161c20eb7b023df163dd9438a9c9ebc2020fe707a61216de38
https://rvm_io.global.ssl.fastly.net/binaries/centos/8/x86_64/ruby-2.4.7.tar.bz2=5ab411416e3f61571556000c054f2e9314b8f9d9dd6300ba47c4835f8f4d050b50f46039ea12947d39187ec95c66f3075c166d9cc1ebc57b1deed036ea03ff9e
https://rvm_io.global.ssl.fastly.net/binaries/centos/8/x86_64/ruby-2.4.8.tar.bz2=6bb44abf86d0005d653416ed2b13a545d63cdd108a99402bc9b0d6acc447bdb2c76e1764a787005ed50885eb8ec75a6a3fcfc0c3056cfc8da610a953fdf7545a
https://rvm_io.global.ssl.fastly.net/binaries/centos/8/x86_64/ruby-2.4.9.tar.bz2=e3b761b1c2bec8161757ee57a029cbddd088da4f2c78e69e1115c07b37dcbed9a5e80965da84285839a9df98015618894630d593905412f68701f636802de6c9
https://rvm_io.global.ssl.fastly.net/binaries/centos/8/x86_64/ruby-2.4.10.tar.bz2=dccd096c8bad96b13601188f37814bcfe7833710785eeac9d405c40b1543027c330fe815cd605c78c8c0533ce923f5f3f99df349ca6209f69768ccbdd7275969
https://rvm_io.global.ssl.fastly.net/binaries/centos/8/x86_64/ruby-2.5.0.tar.bz2=fa3f051827d3fb5c23a6538bdd9e86f60b208e8b1c47c58d91a025cc53aa67189b5e6edeccd4ba930ae45033b389e0f40ac79b57d3add00d9cb6470e7ad04264
https://rvm_io.global.ssl.fastly.net/binaries/centos/8/x86_64/ruby-2.5.1.tar.bz2=edf4958f078a9417ecca6de7f408967b16743bbed1175a61b0640671c0ec528aaf21852dfc8c4fd71be721616c8c241386b7f5e9e4dffe78abe97c9b4c97b00c
https://rvm_io.global.ssl.fastly.net/binaries/centos/8/x86_64/ruby-2.5.2.tar.bz2=993346eb5cd7d936039b1f7d6492bc4a4e4372734e361e90b8bbaaf06acd0961373733d8d6a1798bfbcc1b5cc9f63aab654518b4eb3cdb3d301f7f13f3c68cb7
https://rvm_io.global.ssl.fastly.net/binaries/centos/8/x86_64/ruby-2.5.3.tar.bz2=127fcc79580095c5ef57322c7e11ed33238f578e14de574632182255814f91e1affd0c4f25a8461257c9c4977c49eba619e8514d746b587831ed9d028d9f4e81
https://rvm_io.global.ssl.fastly.net/binaries/centos/8/x86_64/ruby-2.5.4.tar.bz2=b7b5092829bab05e16299318edb97ba5abdb84d73ff4b26bf1615fdf59176bf1811b8ab9c53b44afdb1461cade44cd0f5ed1efcce094237be7247c05fa721659
https://rvm_io.global.ssl.fastly.net/binaries/centos/8/x86_64/ruby-2.5.5.tar.bz2=a63b8105d07584f75646cdc22bda6223bd3009fbb4781e6c93e97ab4c3ddc8d22c6faab00b6b6ec84e968bfa5b866159142df09fb5b7ad82b6a305fc73688bc6
https://rvm_io.global.ssl.fastly.net/binaries/centos/8/x86_64/ruby-2.5.6.tar.bz2=5c15a8337cf2e5643290e86270179a31cd9f393225debab0906297838e457c36c8adc6913050303d04ab24aca9e86c8d71a8ac80007c030eebda4cbdf7e6f48c
https://rvm_io.global.ssl.fastly.net/binaries/centos/8/x86_64/ruby-2.5.7.tar.bz2=62203385eba3770df3ee40272212a83f731d5fde56b39dd05ede8f72083215943e1c2bf95139ed2ab36c3f90bab94a766564294c1a0e6c207e1906c48181a496
https://rvm_io.global.ssl.fastly.net/binaries/centos/8/x86_64/ruby-2.5.8.tar.bz2=2074747e2c578b55c368afd5d8b24506c7076b1fb248a591b34aee07b32d08e32148768aa1943bc5a6b5cc4667b4cbae57b65192b0e0a9cbb1abbc15ac881dc7
https://rvm_io.global.ssl.fastly.net/binaries/centos/8/x86_64/ruby-2.6.0.tar.bz2=eda0a22616d65fa39acc7d0649c9200d8c6b439df15881722b3b49564b8d979b59feb5f650e936c8c0d3d1076820cc9074fe78504d8477a6eb3727500bc5a2ef
https://rvm_io.global.ssl.fastly.net/binaries/centos/8/x86_64/ruby-2.6.1.tar.bz2=d0d53f923ea689c30c31757c0a6c79a05da6474b667d99bd97235ff34133d7b03e3165d94c6b9532b92aeb683106fb297d799a4a4758ba0f16ba9571a30732e3
https://rvm_io.global.ssl.fastly.net/binaries/centos/8/x86_64/ruby-2.6.2.tar.bz2=f598d793465c3069f931f95aca587dcd79f47424927004856beb2008ee3370d20c2dd7d0faf302ba289ea4667e2628c20a13b2337be51bffbe47686b7fa696c1
https://rvm_io.global.ssl.fastly.net/binaries/centos/8/x86_64/ruby-2.6.3.tar.bz2=23a1d949ec2773d80676b94a1ad062348fc6e58c71627c1f1f0e6b8566c09579a39ee1dc8c96d8a1f5566e158abe5d5968e1e9b29525a29712a755b30042a590
https://rvm_io.global.ssl.fastly.net/binaries/centos/8/x86_64/ruby-2.6.4.tar.bz2=cfd9ba893510772906d831194bcc7c0b7d21c5b083c9adc9665dcd1f7bdfd1a47c5050e39385d49f29bcaef4765fa21596fdbc566eb5b7d889d215fe0feb7892
https://rvm_io.global.ssl.fastly.net/binaries/centos/8/x86_64/ruby-2.6.5.tar.bz2=dcf5f9f63880a2b9263c240b69e1d6a9ed373d63292d4e16c6cec3fc2005fa6e6b1857809c792a3ec885d98b86d29efc9198e1e87dc2f05640a95fb054193a08
https://rvm_io.global.ssl.fastly.net/binaries/centos/8/x86_64/ruby-2.6.6.tar.bz2=6abaadf131996baecf0d9cb7abcef0c600f69e5dfccdbc1baa9476894526a80ce3ba5f1a0e3a33968da3bf918b18670b1d9e62a63afdfdb0f59025b961b57936
https://rvm_io.global.ssl.fastly.net/binaries/centos/8/x86_64/ruby-2.7.0.tar.bz2=8cc6cd133408f91b010f9d43bf75efed758cb2661bc1f2e81aa0594f67bc8b66a88cf269d7292f695652fa91564806ec2dfd656669f3a349d585c801c0dc04a6
https://rvm_io.global.ssl.fastly.net/binaries/centos/8/x86_64/ruby-2.7.1.tar.bz2=83c718094b6d16659b69267083f9cda1973a3702f972d4e64a95b934d26495c2d851fd325e2f03172d18317313aae10fb23c01fff1eaaab1673342b027fdd614
https://rvm_io.global.ssl.fastly.net/binaries/centos/8/x86_64/ruby-2.7.2.tar.bz2=f5f263321172620a653f9429b7d7e8e0f24a131887fc55668e201be65a7cac847d2e164924fc38bcc1dbe09cb41816cb0b375f2de390d241ecabf1af90102b36
https://rvm_io.global.ssl.fastly.net/binaries/centos/8/x86_64/ruby-3.0.0-preview1.tar.bz2=a76916fa6ca3313f986c15e0b015a878251949fcbb8dd440246de16b0c183673c6d07dafe927414df7c4fb7b89c56b8212851cf69bd79c93e0c76a1c420bbc15
https://rvm_io.global.ssl.fastly.net/binaries/debian/6/i386/ruby-1.9.3-p429.tar.bz2=4d70cef193c653d47192e42ffaefdcf7f1e31f10ae19e6925ed8b36d2ca2593dec79bb52a43fb56a489c614c4c0d2c609d0d182126cd5deee4a2bb1ff98fe309
https://rvm_io.global.ssl.fastly.net/binaries/debian/6/i386/ruby-1.9.3-p448.tar.bz2=6a4e742f09b038521741bbc4d9a5a65b050b978ecc056f2779b4f45d00dfb700629b3d1ac929a5b53b99ab4c86cc3fad91f152932d575af8e6167e303aa5ccc7
https://rvm_io.global.ssl.fastly.net/binaries/debian/6/i386/ruby-2.0.0-p195.tar.bz2=df0be41109ccc22b1efcf80915517dde7eb0a80258d41128541116ae4e21a09919de100c0a6e43bfdeb145e46098108c7472366c49325a25ef7a7c365b962b35
https://rvm_io.global.ssl.fastly.net/binaries/debian/6/i386/ruby-2.0.0-p247.tar.bz2=2942d171d1e7fb04f67b1ffea28cdaccbff0b88e84688734079bdcccc4e88344a00411b34ef352d69b17812f9d3aeb06c73b156d91da68398e752ec7a54ef34c
https://rvm_io.global.ssl.fastly.net/binaries/debian/6/x86_64/ruby-1.9.3-p194.tar.bz2=841debcf4328f39526d9d489c2430c329cdae9e130f6f775b78b3b340278f3aaa291f37f9626ba7d5e4a584e2263ff7d9783574b5445b0243a7a81a273ce9aef
https://rvm_io.global.ssl.fastly.net/binaries/debian/6/x86_64/ruby-1.9.3-p286.tar.bz2=05a93169f08e85deca44474e3cf76276e0ad5343922218fefc8c9afee1831d1e11d5349cd9c315cc37ac2f9bebc059941474108fb029fddd80934b7b69b1a62e
https://rvm_io.global.ssl.fastly.net/binaries/debian/6/x86_64/ruby-1.9.3-p327.tar.bz2=828ecd6357df30ed1c9aed6a929db94a543b13a75c5c5798b0f84f5b95dd88f538c0e85a509230c9ad613af017ca190585f6b99dffa1f726a4ea491d6e221465
https://rvm_io.global.ssl.fastly.net/binaries/debian/6/x86_64/ruby-1.9.3-p362.tar.bz2=a64b5b97d02e1a946a47f2e4d5e70ac62a459ff5bc53f2909243638b12aa0e0228a7d507eb4b3d8f70cf105ea7c13928c2475d6654611bee56b6b1a0a9ccad75
https://rvm_io.global.ssl.fastly.net/binaries/debian/6/x86_64/ruby-1.9.3-p374.tar.bz2=7d38c266a71a5461d6dae350779723df8fe6f5c6ec4d22dce46a8adc7aa1bb6ced90e4bfb3b023fdb0c046649667f8f53adde1b5819e0ad282da39e5552e4a06
https://rvm_io.global.ssl.fastly.net/binaries/debian/6/x86_64/ruby-1.9.3-p392.tar.bz2=179d7100eb7a67d7a94957e44373db4a15096a8a708cc4ce5af2877b7d23ff12a4e4ed7deb1fa8ec3baecb41042908de3cefb2ae2b42af1d25f8fbbf665fb96c
https://rvm_io.global.ssl.fastly.net/binaries/debian/6/x86_64/ruby-1.9.3-p429.tar.bz2=3d98626b1c3d9be2a6b08be6d13578e8061cc34c3280cabba90f02b287bc3d21d587e0edf79c600bb8a450312d0175c3a9470bfba6d0b0c32721a53eb80c4121
https://rvm_io.global.ssl.fastly.net/binaries/debian/6/x86_64/ruby-1.9.3-p448.tar.bz2=9427a0b640ce7d108cd580da5df865f35c9e4dd2ed8000d5181fac478f23ff4dcf542e83d7afc8a8139ce66c9caafff8e9469af056fc037b39523e9264f15034
https://rvm_io.global.ssl.fastly.net/binaries/debian/6/x86_64/ruby-2.0.0-p0.tar.bz2=d7bb877878c1bf90019204e86acf1666da0c926d40e68d03930b67c81ab2fb058794cde69a934d040f12a5c5b194f231280863f0e8d5565fdd6f55947f0f98e2
https://rvm_io.global.ssl.fastly.net/binaries/debian/6/x86_64/ruby-2.0.0-p195.tar.bz2=5a249cfeb73461beac3eb53ecd8a8b003fa62f7a83e0eef02885b6a1e05b67322c4d1682d08a57e239671bba9bcd7f3335d29495413feae38e628b9be985303d
https://rvm_io.global.ssl.fastly.net/binaries/debian/6/x86_64/ruby-2.0.0-p247.tar.bz2=f38145afb70463d7241ad4bcad13c5ef41e3cd52a416d7900eaccdc76bee6fae0fdf2dca798940c307aac4a1b891bd0317ab1dd0c90c781d1bc8cf731f336aaa
https://rvm_io.global.ssl.fastly.net/binaries/debian/7/armhf/ruby-1.9.3-p362.tar.bz2=74c06b59ad4f7b2e50aafe241a1fdc86fdc07bc5d5f7fe2f0b331802953addd96d56cc0313acb1a3241a555b50d0da8af7e869cff0a37343036e88543ac60d13
https://rvm_io.global.ssl.fastly.net/binaries/debian/7/armhf/ruby-1.9.3-p392.tar.bz2=1d22ffd5cc2c595541172a7cb5b8844edc11d34fb4e997692fd8de87e790dd315ff81d6269c1d2b4d20d1c82d2f2635de23e27102c1c56638304c67919cb8336
https://rvm_io.global.ssl.fastly.net/binaries/debian/7/armhf/ruby-1.9.3-p448.tar.bz2=9cd4a10f38bc25c7295868109c0729a85b48d868145231a99e370d116cd74dff028ace2ed3e880614d034d6194233163201f526d6d035b16487bcfae0c65f0bf
https://rvm_io.global.ssl.fastly.net/binaries/debian/7/armhf/ruby-2.0.0-p0.tar.bz2=a003bc21e59831ff2fcbe176167b946f4cd3b77caedb421fecee52aac00cf09ad51d06b52b772cf6a11d268624732d3a7cfcd2a63f19d2654906b5c51f712268
https://rvm_io.global.ssl.fastly.net/binaries/debian/7/armhf/ruby-2.0.0-p247.tar.bz2=dd24b832b3c077c81605694f36e5b6468889829f7932aa11f37ed09b173116b8288ae4ff21a64b0d4fd8ce772fdd1947a51d2b2fffbaa8c5080a0f2d50d657b3
https://rvm_io.global.ssl.fastly.net/binaries/debian/7/i386/ruby-1.9.3-p429.tar.bz2=858e04b639210ba6d781f4cd055c943baf2bbe956990de272def48c75b90aeadab891d0b2dd1926f8398bd3ae1ec4810a1641dd3bf393737fb295ce99743e563
https://rvm_io.global.ssl.fastly.net/binaries/debian/7/i386/ruby-1.9.3-p448.tar.bz2=d443df9db09cdc46a39243ee7817b8a43ad88fe664ba2b9707d6e456cc698990dd2cfb502f652d95eb84623e644ffa2ee8b7b1e4a0c961e3a97ba8aca3c20771
https://rvm_io.global.ssl.fastly.net/binaries/debian/7/i386/ruby-1.9.3-p484.tar.bz2=8974166cd04d605f47c42c84c90d5a0e1a013573d4c2c3dc4b5b1027d65674f76aabbd4d4c296ccb477948f37b46f409fb4acd0a235e900e9ebeeb9077ea1c42
https://rvm_io.global.ssl.fastly.net/binaries/debian/7/i386/ruby-1.9.3-p545.tar.bz2=04be7e8f9a3a0856f2d94e6ac02c6ad85a34a4a583734b8d40edfdc92da3f7b30e5e36710233f5ddacb1fa3d773ed19aa24ecc8ff7ab6cde807dc142264586c4
https://rvm_io.global.ssl.fastly.net/binaries/debian/7/i386/ruby-1.9.3-p547.tar.bz2=7f1cabac9a3d2f432453b0fe33e59e67159560e310ab7adb1a719a1b3bc7cfdfab7d42fc47e0193c6e6191d0f0809c8f3366472672bc5c210cbf37d9e21c8dcc
https://rvm_io.global.ssl.fastly.net/binaries/debian/7/i386/ruby-1.9.3-p551.tar.bz2=27c3e275a9b55481f5b7f81ba9388a00c69d639edc4f48df8ca38a9f65e465ee838733c4bd8aa1984a21e0802c8c313d2799ec762bb65f3cbff2338240f2ad20
https://rvm_io.global.ssl.fastly.net/binaries/debian/7/i386/ruby-2.0.0-p195.tar.bz2=22c0d6df741b4a92cda77747cc8496d251b04b012bf043e69509c3c74475449b1533a30a85da66473a39eccdb3cef16a75fc87d9a309e8adf6871cd7f0650e82
https://rvm_io.global.ssl.fastly.net/binaries/debian/7/i386/ruby-2.0.0-p247.tar.bz2=7742db6d34f0e7121c3bbfff922a2e848e9d9e750df001a0539cae860edabef9a762346c2b7e25bfdb956d97d14d0374559f18614f26bd0f400ee7c9da4288aa
https://rvm_io.global.ssl.fastly.net/binaries/debian/7/i386/ruby-2.0.0-p353.tar.bz2=45c4706a81e9bac8855508cd9ee4c96248f6d0f2606b735a9a7fa8e82315003808bd65ac93aff50bd46ec9baa863026f2e9e76f0438589db666018afb4aff6fd
https://rvm_io.global.ssl.fastly.net/binaries/debian/7/i386/ruby-2.0.0-p451.tar.bz2=98878fe51c0c4fa1bda30be9b6dc7f4b52a640d8ea9e7ed8257a55df6184b4d85296cf7927568c17cb1711a5ab55023e88390a72478dafd571473f46442abe2b
https://rvm_io.global.ssl.fastly.net/binaries/debian/7/i386/ruby-2.0.0-p481.tar.bz2=7fc39fb97da6addd2fedfda5936917f5ca13972033fdb8e0474cdf14fc2e94d825c10c14d78aeef8317ea7e720e10d25a5c01a99c58eb1e625bc78ce39495d4c
https://rvm_io.global.ssl.fastly.net/binaries/debian/7/i386/ruby-2.0.0-p576.tar.bz2=394f5405b2e0b23e850dc763cd63e4cdfba45cf10ab830f2b704637cc3832305ba222064e6661fbce8a43e36b99096d8dd99af4f9916793b6d86191dde35b21a
https://rvm_io.global.ssl.fastly.net/binaries/debian/7/i386/ruby-2.0.0-p598.tar.bz2=7ffe365e9eb4674e723da040ea8157bc1d572f525b9c69d4cd3409a033dfcd32bbf9bc574a6e22cb292174a4b7d1cb3a184ea5f908c69ba1b76f10550d85adae
https://rvm_io.global.ssl.fastly.net/binaries/debian/7/i386/ruby-2.1.0.tar.bz2=7e5cc8503f1feca560af2b834ef2e84f50db803b958fc74b7cb3bfd4f99b6d296bed4682331a8ae3107ebdfcf36955fbf7884060531c12af2b4bd411cf3c1eaa
https://rvm_io.global.ssl.fastly.net/binaries/debian/7/i386/ruby-2.1.1.tar.bz2=acbb338d7ac3f436a58721d58fa005c5f654c7ae5f1cadec3b0a3a4619754d4249653014570921f158ceb70786cb12f868080635db73251f9d2dae6f5f4a3659
https://rvm_io.global.ssl.fastly.net/binaries/debian/7/i386/ruby-2.1.2.tar.bz2=cdd2c7c30f4ce5d8ec8b7cbce54231b990e840bbfe44ade5a78a854aea6d1474f8bed9301b4a30aa0344835d3583161b24fbd7267b3cc592edaed8e9e30bf85d
https://rvm_io.global.ssl.fastly.net/binaries/debian/7/i386/ruby-2.1.3.tar.bz2=1a3bc8fe845d7c2335168e55d8c977b7f8b28a024420da2295d404009f1b4c5ab8861321987e1dfb71a293f37defefec092e5afcc48a3b6178b2ad540aa89ebe
https://rvm_io.global.ssl.fastly.net/binaries/debian/7/i386/ruby-2.1.5.tar.bz2=b3be3e5efc889a8001ab3cb861db100b0445f7c87cb070f6dbc4aaa435f4659a2538cff4394ab54d90abc34dc7ee4cb2ea7dbbfae7caaab05c490983566011be
https://rvm_io.global.ssl.fastly.net/binaries/debian/7/i386/ruby-2.2.0.tar.bz2=774534b0bfe7a49775a51f6c5cd660c477994ca6d93bcc1f4429e41ebe7f1cdc7fe7993bb336433443810c3563b888018b2db1dc6c7e6cd6adb7dd925df6f4b4
https://rvm_io.global.ssl.fastly.net/binaries/debian/7/i386/ruby-2.2.1.tar.bz2=70b33dc43967e2bb2929a428c8f86159de9e1417211a06f07ae889f02ab8e0e96d812643c380489681fded5039ba06535f052d487085dab1afd6a505fee3e47e
https://rvm_io.global.ssl.fastly.net/binaries/debian/7/x86_64/ruby-1.9.3-p194.tar.bz2=432a5648f80fafe07499da961b1acb22f30bc9d22b4a5f1a6c2896cafc460b631f75147f33081d3493b2c42a94dbe593e8e881c11e3b0487e4adc973bcb7d01f
https://rvm_io.global.ssl.fastly.net/binaries/debian/7/x86_64/ruby-1.9.3-p286.tar.bz2=85749a4e49897b3fd93360358c77c1939eb1a2deea82893737c00d3211fae9dba93977a7707525337dbb422d6f8a8a2852ec201779178b78fdd59d4d3b94bfbc
https://rvm_io.global.ssl.fastly.net/binaries/debian/7/x86_64/ruby-1.9.3-p374.tar.bz2=e58ecdbec37538a5e4775ef9e99edbb7d4ac735f502f9aac25acaba9298a6adf2cb8eba5941dac570d7acd49d956b6fd69655d4a83d6147d24b69de87b1cc702
https://rvm_io.global.ssl.fastly.net/binaries/debian/7/x86_64/ruby-1.9.3-p392.tar.bz2=c57de5a446cc41c2823864a636761543179a789288a52b52e2117c6ba67cf75cc86df6b157d96c01aef2835091b81bd3a0f1014d9adbf6e8a3af82a99eeba4df
https://rvm_io.global.ssl.fastly.net/binaries/debian/7/x86_64/ruby-1.9.3-p429.tar.bz2=8c2e3c3b5823e53b3e9ccabb83968a3796daf453e1d71c1120f59f69a9631c98cb7682ea2d39e8f1e814c5f35a1ece29af6d24cbf02b59b5ad02160bb0eddea6
https://rvm_io.global.ssl.fastly.net/binaries/debian/7/x86_64/ruby-1.9.3-p448.tar.bz2=b40c6909b31c176d2a2c9285f31d104dde138136cf9ed9423ef094b8048cc39d29fbc797c122c4669291edb29670b52b0634c1d65df3ac35289bc425d990b523
https://rvm_io.global.ssl.fastly.net/binaries/debian/7/x86_64/ruby-1.9.3-p484.tar.bz2=7e8b068a563de470deaf9a9b6b79dd5e3e49119e46a563a2e5b591eea779ebf91b7c510e390e6957114768e5577edeebb40eed19a6f0fedbe3bf6c0de0e7a1f9
https://rvm_io.global.ssl.fastly.net/binaries/debian/7/x86_64/ruby-1.9.3-p545.tar.bz2=a99c7aa56559c77eab2c857ce1085ebb3f741f0ac9fad04057fa00deb3f24b33a5a96b12703c8a4f16212e969a6d22f5c5fd8d919faa6a85808938bb7f971392
https://rvm_io.global.ssl.fastly.net/binaries/debian/7/x86_64/ruby-1.9.3-p547.tar.bz2=d52311e6f76751cda4bb05a21ca60e080161a6fbfeff356796ebf0ee6f5a3d3625cfaa2654002c62640abb08e61af53eef580814f03744372c4301c75695c33d
https://rvm_io.global.ssl.fastly.net/binaries/debian/7/x86_64/ruby-1.9.3-p551.tar.bz2=98929857cc130253704e251c70dc7279ad02fc14c349e709ec757ac75145af3f95d8d1a351eea4a33a742c6113a9b29b0a4d239e8893eb518db973d0aa7a76d8
https://rvm_io.global.ssl.fastly.net/binaries/debian/7/x86_64/ruby-2.0.0-p0.tar.bz2=8cb51732ba1ddbebae3bf5e5fcbb22bbb4d3de32c33168583ea26fa0515562dd6e4d7610ba0650aa3c5106ee4c8ff94ef0b2860c094f7732af81c9dcb6934038
https://rvm_io.global.ssl.fastly.net/binaries/debian/7/x86_64/ruby-2.0.0-p195.tar.bz2=f81b9d5811e6bc234a4547957f74ef4d854eead399d12a00fa0533ce2331a152409481ba3a85c77d386d0b7f3dce6f65c76d818b87d7e29b5c714822bce4df81
https://rvm_io.global.ssl.fastly.net/binaries/debian/7/x86_64/ruby-2.0.0-p247.tar.bz2=5378320b84e7d7dde01c63751c2e615246c1539874456340f6618540703feba37272a14be67a5f73ea5aae882b090c857231bbc7dc425e14aa7f4bab909d66eb
https://rvm_io.global.ssl.fastly.net/binaries/debian/7/x86_64/ruby-2.0.0-p353.tar.bz2=719c6d643e4fdf97331219f613776255c6be661062aac0cb3354e77412232503c8e106c4b8b0ac8cac5bf87f96ef4cf8932ef8c0b10f718675628e8e26886a77
https://rvm_io.global.ssl.fastly.net/binaries/debian/7/x86_64/ruby-2.0.0-p451.tar.bz2=2a10dfe370ad9b7aa9745d18854c34992ee3f8a32a4277614fd51cb3d0d4b71d712807ecc89389c2d6c2921bec9157ce8f0e6b5f441c77052987e58bc2c62d02
https://rvm_io.global.ssl.fastly.net/binaries/debian/7/x86_64/ruby-2.0.0-p481.tar.bz2=51b274eb239bb7c2dc75afed893ed7504d7ddc8b4c3a945570dfd2f7bc5559211cf4b810bc13acf4fd55536be08999ed5e2559b1918c228c17c3426d8e84973f
https://rvm_io.global.ssl.fastly.net/binaries/debian/7/x86_64/ruby-2.0.0-p576.tar.bz2=e7c78e28eaa5474ec28f44d16b82ff59bb730ab4eef81de972f5515eed86d6b1b13f0a7eac2290f13ff2699ef397bcf0935ad2866d08286235ec43c87749f001
https://rvm_io.global.ssl.fastly.net/binaries/debian/7/x86_64/ruby-2.0.0-p598.tar.bz2=0c910fc58f999a5bbe0a5106f8a5707d8b26f9791fbf528c2dc4f2c3e9664e2ef4661ed2265aaca1874b9ff81dbda98034cac8f03adc9942bb36f2d6ba70fd86
https://rvm_io.global.ssl.fastly.net/binaries/debian/7/x86_64/ruby-2.1.0.tar.bz2=286f9ee75138129e65ccf13ac51825eda60bfed99b70fd2a7988c9e9f1deb9667e1941ae1daffaebd7fb11e4814dc5c9a9cc23748034a063bb8b59c7df529a31
https://rvm_io.global.ssl.fastly.net/binaries/debian/7/x86_64/ruby-2.1.1.tar.bz2=caaced64ee59e9a74ca774d410f57aab00fcb094443e435f62d99fea8e960f8f7211d6e00a0b42c539ed971effceecfd172e7302c0c4de764cd9768423234d06
https://rvm_io.global.ssl.fastly.net/binaries/debian/7/x86_64/ruby-2.1.2.tar.bz2=f8e97b5f624a0d72ec719dcc4c0f113644ab771fb2b205b3df37f6564abea0f2c477a7f2f254bdca12ef9ec1167b4b3f77377d13473e60976cb3a3c8b63dba60
https://rvm_io.global.ssl.fastly.net/binaries/debian/7/x86_64/ruby-2.1.3.tar.bz2=7c1585a6ebc3ab09f4631b6043e66143313362a325677e98af18a8e77eb38e245c759eda728d7e518f44edae1767b3dc917c5f347eee3f969b82c1b7a4278262
https://rvm_io.global.ssl.fastly.net/binaries/debian/7/x86_64/ruby-2.1.5.tar.bz2=11e5f701e569c00c16d841fa1a8ba1aefa4c7c24a724ec552ec751a480a24a23eb2fbfe1d7fbc69c7790d78c7408e3f793a87e6c5e4a21f4b56369de9c3edc14
https://rvm_io.global.ssl.fastly.net/binaries/debian/7/x86_64/ruby-2.2.0.tar.bz2=f5d2b72a948c0a7ca42ca95e3d8a67908f075e51b70048eb927de9bcf22c2b0522614cf1e35718cbcbbc6f945425fa3e388dc335b7d2cce76ac1862424a0d509
https://rvm_io.global.ssl.fastly.net/binaries/debian/7/x86_64/ruby-2.2.1.tar.bz2=d9c85799864390dc3b728f84e0272429e9fbf41826ff261c1b4747448d2794590f9f1f0cc04b7061b37c0862bb64cda45b0c0d52dbffc1a4516efdc94b49daae
https://rvm_io.global.ssl.fastly.net/binaries/debian/8/x86_64/ruby-1.9.3-p547.tar.bz2=2e51ed52ba71f55ead585f81855a5975df1948565fd84d8a13616958e25e141b300e846e38d0407a821c0bd3d71306b1f948f028de7ead4ca1bc4938c5cfd7b8
https://rvm_io.global.ssl.fastly.net/binaries/debian/8/x86_64/ruby-1.9.3-p551.tar.bz2=f44c1f8195da86beb3fcce58c227217b52f925a075acad54276ffdf9358599f7a26badb26862aecae29422ba7b668b62ba913911ec046d47463165e341795bfb
https://rvm_io.global.ssl.fastly.net/binaries/debian/8/x86_64/ruby-2.0.0-p353.tar.bz2=2b789adb43702694c4626dfc9531c636f5976acf899baaae40e49492441755016162e0f7be8a22548435e2872ff043c7fa74a59e12c5d0e9fb5521fc71ac84f0
https://rvm_io.global.ssl.fastly.net/binaries/debian/8/x86_64/ruby-2.0.0-p481.tar.bz2=2f34b913a404c53e54c2d59486dc09351683acdda3eab4214508515fc9fb96951fe42adaa1c9bbba366b856980fcb41ed80a24f014c245a4a3dab66daebb9be7
https://rvm_io.global.ssl.fastly.net/binaries/debian/8/x86_64/ruby-2.0.0-p576.tar.bz2=31fb155b0c6a265a205925b13dc2b03d959c63c93f2ffceea32863769456199660072fbfb1dd15ddacc047235ab4acbf6298e887d5de42ebca756e7bf2675a19
https://rvm_io.global.ssl.fastly.net/binaries/debian/8/x86_64/ruby-2.0.0-p598.tar.bz2=3fa6df83fe2c8e8a71b4ad35e71c232134d651a5e04873f158f9ce8d3a2a582c9c132970285fbfb62300194a8688694a87fb062c3a9051c3455e14dd47ab61cf
https://rvm_io.global.ssl.fastly.net/binaries/debian/8/x86_64/ruby-2.1.0.tar.bz2=82b813497a3e768a45837444fec6f2212b68375a77613f9365330e7fb43d0b4c830d39e8a043bcb63b7f0e33ca2917ec52c41c338c81f6f8f5a9f341d5ddacfe
https://rvm_io.global.ssl.fastly.net/binaries/debian/8/x86_64/ruby-2.1.2.tar.bz2=9b8a74e1be4111a24c4e53facf17db98c7092d5bc29bd845a50d74c3847232b4162de3ebb1292dfd414378adefcf3abb547cbef4bfb673a88904bf9acf6a74ea
https://rvm_io.global.ssl.fastly.net/binaries/debian/8/x86_64/ruby-2.1.3.tar.bz2=8c3f7ca497194668bc7c9877981f6277d126a336ec35e03f8f503477369238d078b661804a9142b92339fa6f88fa66493093bc4621472c354d2bab9e99ad1ba8
https://rvm_io.global.ssl.fastly.net/binaries/debian/8/x86_64/ruby-2.1.5.tar.bz2=c8c6e8fb5a4b936696b2cec9b95720e926ed4d65ffba6730e4751c800e5928659de32d25febe3580dbc8b81153d531414af631c68c6488e17a3c9883c12fcde7
https://rvm_io.global.ssl.fastly.net/binaries/debian/8/x86_64/ruby-2.2.0.tar.bz2=194359246ec0396ef5ee794af25d5ef2148736ae2d903e615f4c6a18e048e21b19369894cb0938c196537e825ead42ae3006e4116ee2174441935ad157d41464
https://rvm_io.global.ssl.fastly.net/binaries/debian/8/x86_64/ruby-2.2.1.tar.bz2=df25f6121c2e42bf359077c3f9b76a3524436f56c36db448163334bff403b4caae3cfef1aff4fceb3d09d41d448089cd563f0a6fb4e88bebdbe12895b18fcc36
https://rvm_io.global.ssl.fastly.net/binaries/debian/8/x86_64/ruby-2.2.6.tar.bz2=b4a404c9e3f39e624fe45e6a1ebd46b51063068f88944d79af1d8fdc1c8d6eb7fc3611248ac8934a85a0898ed36b1d8892ada5d7b173f1cdf2d9a079adffa3fb
https://rvm_io.global.ssl.fastly.net/binaries/debian/8/x86_64/ruby-2.3.0.tar.bz2=212443eb00ed31d216fdab40ba0371ed11ceeaeb5372be1e2c35b76153b067c017a734dd7525e1d1899362e671f09968147d427211d95aa724a5eacdaa3872c4
https://rvm_io.global.ssl.fastly.net/binaries/debian/8/x86_64/ruby-2.3.1.tar.bz2=c1031628607de509fc11d8e38d3b8318475abf1ee60e0450e01a381cdda09e5606a6553042477ef2568bdefbad35c6c5df8fa00bd0e2be446bf186f18c556ca3
https://rvm_io.global.ssl.fastly.net/binaries/debian/8/x86_64/ruby-2.3.2.tar.bz2=1f75a32a153db289ed9948a2fe3c120ad30fc0d5ae3d74e1ff6e487b73c0d4451c6660f72ac5204b76f581a00d1ad62ab4337b90cf55c907e8546fba1af4e571
https://rvm_io.global.ssl.fastly.net/binaries/debian/8/x86_64/ruby-2.3.3.tar.bz2=ab9e9ca948a28a44e401aa01a7264b0aa5a2a43236d55962ed8280f819b15205d40690546b50a97eaf4a867d344825aebc153e6f6d5abf73b6dc399253dc7051
https://rvm_io.global.ssl.fastly.net/binaries/debian/8/x86_64/ruby-2.4.0.tar.bz2=82c4bf2bba4cf7a1b09b6cff9fc6a445f16109a6c4647f554f1dd920a9f1dbac6450ec75b0d903b679af7eb7ca94ea7781cf37757d98ce18dc0432c280506601
https://rvm_io.global.ssl.fastly.net/binaries/debian/8/x86_64/ruby-2.4.1.tar.bz2=5f2dfa53eccc43c28f40a12fd53cf76acd3466a0b3f3a63bfd95ada53598bb26a5449d36f62a4edd468d62e2de04ffbeaa115936a5e5d5b310e42128ee839afc
https://rvm_io.global.ssl.fastly.net/binaries/debian/8/x86_64/ruby-2.4.2.tar.bz2=87f446db73e70274181cd71d75e902db6b96ee73ff2556037814513d9a00dad2de98f4da1801384b5ef44eb20a7699d4f8552028892a2a1f42b41e0b53bc81ba
https://rvm_io.global.ssl.fastly.net/binaries/debian/8/x86_64/ruby-2.4.3.tar.bz2=54d20dde89fcd32e198f5fc75134686bfcf9355b752dc86c2f3ce9290950c7ebdf257573cff5364ebfa8e7287aa2903254dbc5ad4edf65b5a53bff577cb29800
https://rvm_io.global.ssl.fastly.net/binaries/debian/8/x86_64/ruby-2.4.4.tar.bz2=11e12a4b844bcc3ef0e969dc02225ebcc2153805427e0b803a36622564ee824474010f1a6e2c514b99fff6a5a65b6460c42b6bb08ddcee8945deb46988e429d2
https://rvm_io.global.ssl.fastly.net/binaries/debian/8/x86_64/ruby-2.4.5.tar.bz2=9a109453adf3f6d92a1817832170625e44b23842698119812ca1e368a00c1b0f2ecd3ea9f7df58badee61a75d125ec424263def8d2f4d386f226869ac5836a5a
https://rvm_io.global.ssl.fastly.net/binaries/debian/8/x86_64/ruby-2.4.6.tar.bz2=e90f8da1cf38366b668c06b187cd13a0b7e0a7731f71ba144d03f404f08704c762886308e5df7bca8cd0a7cdc4c3393d4153d5600e75dbd6fc004f32f1b0cf07
https://rvm_io.global.ssl.fastly.net/binaries/debian/8/x86_64/ruby-2.4.7.tar.bz2=6beee6bbe64a4c535bbf7a04c560703c88da97ea64b3fe703a981b44c45de00e42bf840a5dc0c7a07123a21c0893e6a38cf26ecef1d2265c53a14b5007a3eb20
https://rvm_io.global.ssl.fastly.net/binaries/debian/8/x86_64/ruby-2.4.8.tar.bz2=7ce346c5d84e9a25d5befa0c6732ed8b2e210cd58d1c7bf0c9bcd8f555f3f28ac9906ca945f97438c394f31ef282d92eafc6bbce4e19621889173ac3745ee5ce
https://rvm_io.global.ssl.fastly.net/binaries/debian/8/x86_64/ruby-2.4.9.tar.bz2=049d48307fc6ee640836eeed7f079ca37ed242eb574cd6f315e38a5fa324dd090bf3e200cc8115db68cc8e810d0814e8050311be4f96911585f2ee476d56cb13
https://rvm_io.global.ssl.fastly.net/binaries/debian/8/x86_64/ruby-2.4.10.tar.bz2=33908c1e123f238bd4a187c1d1a2f46a5d215ca6238aed9d2be477b569c1de1ea676725342fc7e623fcfe21aca3f30c292c003e8a2d07f962c497c782b576f52
https://rvm_io.global.ssl.fastly.net/binaries/debian/8/x86_64/ruby-2.5.0.tar.bz2=298fc6eae9e55c70b216ae3ecff5333fa666213ac3359d8b14335e0f566e5bff46083b43b7c81cd40c23e6a61084d3af4d0f62f883e5bc839cd4c3e4a093bdd1
https://rvm_io.global.ssl.fastly.net/binaries/debian/8/x86_64/ruby-2.5.1.tar.bz2=26265260777fe7ef1794e2cce71d254e07f160643e25696c7f2e2009d698a57493c677c32289013ee147af26e4f9297c8a6f59313ebba48a22478f492bbe6162
https://rvm_io.global.ssl.fastly.net/binaries/debian/8/x86_64/ruby-2.5.2.tar.bz2=196943cfc3fdf700df342e18bb5f50713ddc875e4b22b3a3ec79f7fe5c5803eb5c0b999d73ac9b6cee094c9551ef7a7d5e1d7444d907909620949d353160a48b
https://rvm_io.global.ssl.fastly.net/binaries/debian/8/x86_64/ruby-2.5.3.tar.bz2=7118fd81e8e73b49d3c3e2dd62e60db09b67a7a8f4c16b3594d88e632079a88beec4740500db55e44ca6d607afa4d6c5eec47c20183ed339b91d05077a050068
https://rvm_io.global.ssl.fastly.net/binaries/debian/8/x86_64/ruby-2.5.4.tar.bz2=c55b37c26ad7a1bd9647439058af7d90edd5c4ed87824658487b861395e71c7161b4b2f1aa40b41c3394968a333a0bf70601b6344c9d5fc35a9ee463d2e87c72
https://rvm_io.global.ssl.fastly.net/binaries/debian/8/x86_64/ruby-2.5.5.tar.bz2=8631dda6f18edf9b5a34f8d5b42ec82a53c493c4697c6f4d5643cee1d92e95aa6724ba302d8e51915d6a2e00d0bcbf5748dd9de0ff5518f433a97e3602c035c0
https://rvm_io.global.ssl.fastly.net/binaries/debian/8/x86_64/ruby-2.5.6.tar.bz2=b99c82c4903d39215dad1cd4e09cb5c2849d3207289a1d84bdf2b37e2042c218b1582710bed146de812f9dd3229d82025ca84572417111c7e2c67d22421409e8
https://rvm_io.global.ssl.fastly.net/binaries/debian/8/x86_64/ruby-2.5.7.tar.bz2=c1adca93c140dc81581907ecf29d46157d7077046ebd09753eaba34106622a83057d48aae4f0729c367a41d35b83d0616ab0e3f926895485a9e36397e06f5d62
https://rvm_io.global.ssl.fastly.net/binaries/debian/8/x86_64/ruby-2.5.8.tar.bz2=3d9af3fe6240955176732288dc847d8c4a986bfedac387c1d5c7b8ea9625cbf036e6f8542fd1e8222c507836584fd80f2151238bbea1c16b466233aac408e4c7
https://rvm_io.global.ssl.fastly.net/binaries/debian/8/x86_64/ruby-2.6.0.tar.bz2=ed9d3cd6e1a99ce822cb8972182b20e15dcfbf95f45b37d4de3057df81545af32a180a91634743b0410dc2ca33b7da9289c306b0b4f0b8770c019ee490e60f2c
https://rvm_io.global.ssl.fastly.net/binaries/debian/8/x86_64/ruby-2.6.1.tar.bz2=306a4176e6e93a5a1c412a003bb73fb31504a0ef7eb6e439802b4026ee9759ab09102a298956ac11dcdaf33426c19a4da101c7c6c8b8ad7304e43670f8de1e02
https://rvm_io.global.ssl.fastly.net/binaries/debian/8/x86_64/ruby-2.6.2.tar.bz2=1edb923ede2f08dbb68abd5592449448489c2224a5c693faf95c17a78fcd211d4bfaa203f7f223134f2dcb3d53ae55c728b6a4943f512def585e8bfcf7013ab9
https://rvm_io.global.ssl.fastly.net/binaries/debian/8/x86_64/ruby-2.6.3.tar.bz2=ac582f7e4d23fddf9a0c78d6aa7bc67f3f3bce8e452fcca115a205fedacc4f1e179683eb8607783cd532641b2635e83649fb6c52dd4d3df9e9559ea5999136d6
https://rvm_io.global.ssl.fastly.net/binaries/debian/8/x86_64/ruby-2.6.4.tar.bz2=55fdad99241db7153d907926c6fbf030b19933cacf3ddb58ee95e849dcf262eb373c2346d7b42fb99d62e154aafc14df9d696a7649047ff9bee0a627062dabb6
https://rvm_io.global.ssl.fastly.net/binaries/debian/8/x86_64/ruby-2.6.5.tar.bz2=b468c508fae6e7d542cab5e6215f94e83144b24a7a4b532e8a9f78e16d174caf8a51c19b00fac11a03099d15580c16205ca9713e03237534e2ca003cf3f4abea
https://rvm_io.global.ssl.fastly.net/binaries/debian/8/x86_64/ruby-2.6.6.tar.bz2=b3df19a3ce52e1bce62ea016cb75d383a81a70268d37ffca104830394d365ddce57d21fe17a6a7fde180f336598f5486c3e716f32cffecf7d24b13de782fa9eb
https://rvm_io.global.ssl.fastly.net/binaries/debian/8/x86_64/ruby-2.7.0.tar.bz2=7a8159f2667265be96a54689b48836778cf1d433caf8b737d55d52fce3ce4d50da101b41b9c5927a22d659b4861772efe7d44d2a0c76c1757b8244efa95c9bc2
https://rvm_io.global.ssl.fastly.net/binaries/debian/8/x86_64/ruby-2.7.1.tar.bz2=1b673bc33abc96e0abda406d1e028a80f287e0b99e73aa4d0ec0591709177bf2f9d75f3ec94bafae4e24e23f056848bfa9741486eec0d6599f34911304792ebd
https://rvm_io.global.ssl.fastly.net/binaries/debian/8/x86_64/ruby-2.7.2.tar.bz2=705b0f7002807e2db0db6f38f0eb9fe4d6012d6d1673c19a363c29a034551102fb92cb7e13efb90c0559acae9a45bad5ea13c50e0af35b0dc1776b8d917fd802
https://rvm_io.global.ssl.fastly.net/binaries/debian/8/x86_64/ruby-3.0.0-preview1.tar.bz2=b0c2665b89fed26095bab8e7bf54f2b4718b05a3e4c6c612c9e36785c432ea46e43eea584c2123df5f9f18e2ce51db3a4425c56f371def69cfa8e7e1d6bd0b2a
https://rvm_io.global.ssl.fastly.net/binaries/debian/9/x86_64/ruby-2.4.0.tar.bz2=e9cd5b3bcdfadf36bb6f9fa836cb24386af680f583c15954cea969ea12b8932aa2cc5f304e73a18d4d6524d6202e0055864f535aa40cb028ea6b026653368b62
https://rvm_io.global.ssl.fastly.net/binaries/debian/9/x86_64/ruby-2.4.1.tar.bz2=4cf75eabe008e882ceff21c09b47b0f22b2ad34c55ca51bbd1b316532e21baaeebaa273cc69537d4f379ae3f37187b3ae48f249c09ca5cadb06174ca1f3958df
https://rvm_io.global.ssl.fastly.net/binaries/debian/9/x86_64/ruby-2.4.2.tar.bz2=e7f5eea4250f0262a5b9b42d74e1469c4c25da14845d254bdf146552e086bbd7faa9702fe1da8e7a3e04560ace7f104195d88b77cf1dc439258030baaac1af6c
https://rvm_io.global.ssl.fastly.net/binaries/debian/9/x86_64/ruby-2.4.3.tar.bz2=e4ea5e496e03b85335c9d0f00f21ff30c30dcfaec9b431b811cd591a71760beab1ae285c1629da13281db326a4863c1cc3b7f96c30ab9c9c1eb6adcefea660b6
https://rvm_io.global.ssl.fastly.net/binaries/debian/9/x86_64/ruby-2.4.4.tar.bz2=4cb24c4d59e1dd441d6e24e375fba003ecf3fc2a22e9a15e2790440887f779ac33e36d795b49dafc612cd891d670b599c5ec6ecdb44fb69b10e56d174b6f0d18
https://rvm_io.global.ssl.fastly.net/binaries/debian/9/x86_64/ruby-2.4.5.tar.bz2=f52b1b0a0136dff8a91fcfea64b89153ee3bb32093adb16679175a80daa476c1e33586bcd3b0fad870865673868001147a27a5064b60c7bb5ffb3fb17ca95a49
https://rvm_io.global.ssl.fastly.net/binaries/debian/9/x86_64/ruby-2.4.6.tar.bz2=736348b6f35633b3c0a0a459557126b6220df2afd14f5b25147aed66bf710967b4c2e78d3bc87b528059c29e76d08fe0ae385a142387282ec70395f110a702a1
https://rvm_io.global.ssl.fastly.net/binaries/debian/9/x86_64/ruby-2.4.7.tar.bz2=d548e0c43c68cb1a1444b564f3013900d0f994bb0b5d30b0088ee10491ce3341ff9a6ebe30493a8adcaf1e2e774891e03fe483e333070f995ead1810d588856f
https://rvm_io.global.ssl.fastly.net/binaries/debian/9/x86_64/ruby-2.4.8.tar.bz2=61ee8434d4e98e4daf750d41ec20837f53e79800798065c24c586c8bdb39baa047f80c6ec72688ad499836a92f1dc120c1e9bda8f337db5ef29e025a955d223d
https://rvm_io.global.ssl.fastly.net/binaries/debian/9/x86_64/ruby-2.4.9.tar.bz2=208a9a46870b50ce4a490ca876f926b1ff4f32a0287cb080151b0430c65879d2ff13bf2a0d7dd7dd9e17790cbfa2f55efb26bf4c28a8551be7e05685e2c2792c
https://rvm_io.global.ssl.fastly.net/binaries/debian/9/x86_64/ruby-2.4.10.tar.bz2=42848d61292bed5a51d2962e6b50d2e5b1cd1b514f65a76e066dce15d88df2794b8beee80234b131bcd8fc5c70c2c0c68089facde2e6683496645f9d36ea4921
https://rvm_io.global.ssl.fastly.net/binaries/debian/9/x86_64/ruby-2.5.0.tar.bz2=13852ffcd40f8babf49be082e75c9f709b080d804709e6adb3398f2b1e44a32163a95aa403baec62c2f7a88d5509d12728586e87f01c243488ab8ea7d950a557
https://rvm_io.global.ssl.fastly.net/binaries/debian/9/x86_64/ruby-2.5.1.tar.bz2=af3dd86b31467da497bacf62aa976b5612a41f101e8c0e18591378cac5df0a9e696bcbe5c3bc6926328263ffa4d4fb7a8a0099bc32ebe62d9733d6fb4c6d84ed
https://rvm_io.global.ssl.fastly.net/binaries/debian/9/x86_64/ruby-2.5.2.tar.bz2=f3e667aa6b774915b339a620b22a83bf1cd886ceee8cbea378e4df44bbe3dcf072b38b5d17b31041c730f4984147ab464c20707b382a74f84edac3ca6e839c62
https://rvm_io.global.ssl.fastly.net/binaries/debian/9/x86_64/ruby-2.5.3.tar.bz2=1b6b37e9a5f6214169e63e4221caf53d9558b8b72289012ac8ebc49d8fb21708c18963bd6d1a20208cfc0b594fe2c73490832461ed8c6d79050c1af666a9ad52
https://rvm_io.global.ssl.fastly.net/binaries/debian/9/x86_64/ruby-2.5.4.tar.bz2=2b12c40623778a9d9d1700b62e22ae348bf5c9989929abbe9b9abe6f4bb39c198df4167849da58765235802021b43ff1b3f6b69f33a15945b6cd231666aa1d8e
https://rvm_io.global.ssl.fastly.net/binaries/debian/9/x86_64/ruby-2.5.5.tar.bz2=83a2f4bf477d7c489404da62679887352ee5b550aab83f1c629e0ace9f2668e8252c1408f564e24eb1a35fcd6d0734b0cdd0c93ccda5c49c36f688a824eac676
https://rvm_io.global.ssl.fastly.net/binaries/debian/9/x86_64/ruby-2.5.6.tar.bz2=9c71f859026ec49959861b09c7493c50ed168e5fb224ea3d2005a78d089f9bfbda513f40f6cb7c1e7050beb20e0e9ab624572915330532643d57d6555f422043
https://rvm_io.global.ssl.fastly.net/binaries/debian/9/x86_64/ruby-2.5.7.tar.bz2=812635ca8a90726f080d6f489a68733e7eb6ec0302b57678eb2e5297ea3ffff2fd95a9789d7435df30d97bfefd33384d4e0a2ce0e0c8ccd5781ec31c7c9d0e3d
https://rvm_io.global.ssl.fastly.net/binaries/debian/9/x86_64/ruby-2.5.8.tar.bz2=3d2117ce007f0848326075f4670ac3fa428f56946978002a3ae08a7ce76b19b6e5b27e6f0d36e60cf2eb052504b859bfe9aa560178ce77bf29885e5436da7508
https://rvm_io.global.ssl.fastly.net/binaries/debian/9/x86_64/ruby-2.6.0.tar.bz2=5a092389edeb8219f680b2c00a0db51113a29457653d8023414465122dd5999246064b344551063d9476cc49126c52a6d41196fb17de08c0d8019e7823d49d16
https://rvm_io.global.ssl.fastly.net/binaries/debian/9/x86_64/ruby-2.6.1.tar.bz2=bf4647bc871fa684b3888abcc371024bc1211f38778a2b2eff15f72e18ef9746bf504f406c2cf8f1e252aecbfa05117cf282e30adfefcf64a238bfea64523aa5
https://rvm_io.global.ssl.fastly.net/binaries/debian/9/x86_64/ruby-2.6.2.tar.bz2=0b6a1e1de3ab61a9dce7ff785c72d61eec1a342a34dd93ea4ea3d68fcee0d207df1e398176ae7ca9653229ea4be19275afc2a00d24f17ab5be96883e1d4703e3
https://rvm_io.global.ssl.fastly.net/binaries/debian/9/x86_64/ruby-2.6.3.tar.bz2=7992a690846d273df96b2b247f1272393b9a77241936e5309f0adfe113e7743c37d7569ac2f35146ec754e2e4cde27ab5ff76f2b5df435f3481a802342277f3e
https://rvm_io.global.ssl.fastly.net/binaries/debian/9/x86_64/ruby-2.6.4.tar.bz2=02c6ceb9476b6025dceb654380133722db10733ca0467cb309ed49dd7fc9f820bd36da41df6ae0d7ed4e8b9429e7ba53587b629f3b49344a3e45af31484aebd6
https://rvm_io.global.ssl.fastly.net/binaries/debian/9/x86_64/ruby-2.6.5.tar.bz2=63d205c6559e61899f52d6ad83a609af1c88ba70292fc396497ddaca02dd322a232d664d75dcd496ab1e3bc51efc4b7e2f5c8273d4ee2b2ec4e90e36a514d853
https://rvm_io.global.ssl.fastly.net/binaries/debian/9/x86_64/ruby-2.6.6.tar.bz2=b137c1039798987cb4dcc4de1aa2cef4798dd7725bbfa395744214b288c63468bcc667ba480b98d532da362ceb9f90a61a3c200716fe435677caf72b0453d1ea
https://rvm_io.global.ssl.fastly.net/binaries/debian/9/x86_64/ruby-2.7.0.tar.bz2=5148d6ae9ef2c17ab9cf8974565bfb89dd2c20b787339f51ca410ea687914596be250a80ce7f42c7b0add297d1f1e67e8818e84eaa798ec40e6862ac65840f27
https://rvm_io.global.ssl.fastly.net/binaries/debian/9/x86_64/ruby-2.7.1.tar.bz2=f66dabdc67725ec330513b5efcf474cad222651a34c0c4a0c96bfef0302686075e62c7dd8e4050b2237ce28171679c4a5dbd1cd545a1f2acef63009b5b9347a6
https://rvm_io.global.ssl.fastly.net/binaries/debian/9/x86_64/ruby-2.7.2.tar.bz2=2b9f9645c01f62393ec498faff9afbc18b3be80e719bab0609dde2f5d3ae705c7a0e7439094b5e33f41fcb0be1b4292a847e57dbd4ace3266188ff5bedb7110b
https://rvm_io.global.ssl.fastly.net/binaries/debian/9/x86_64/ruby-3.0.0-preview1.tar.bz2=465c51f9b6f958e9daf2e881a93ac9908d0b771d5a4e261e4e23088b3a4952cd0f6f75b82bcd117cec72d1b5e35c31416cddd16ab7fab81972a2f337e8f2b5e5
https://rvm_io.global.ssl.fastly.net/binaries/debian/10/x86_64/ruby-2.4.0.tar.bz2=99e5e98b69e5b46d44081be06847005caee31f0837bf312d005d30bda6ec463bf69e13cd0c3517f5ccf95a933720e471b5a2a031c0481c75889e16e620c58edd
https://rvm_io.global.ssl.fastly.net/binaries/debian/10/x86_64/ruby-2.4.1.tar.bz2=3db44a23cb29901a862adce0aee3be01dfcb4daf96ead2363d803fd12c5e0b79e70716194d54a49ee28f2cbc7e1d9e32786b71e3873b9f0f58d96888ad139821
https://rvm_io.global.ssl.fastly.net/binaries/debian/10/x86_64/ruby-2.4.2.tar.bz2=0ac254ce732677f3f6390938d8dfb139ac28977b2fc40b4dac7c235b7b496131c7f5e0afb1db8907f82dda1103fc3dbc64f1c6a601c8ea13e06d9c3dae8bf5f8
https://rvm_io.global.ssl.fastly.net/binaries/debian/10/x86_64/ruby-2.4.3.tar.bz2=b7165ac09b7009435c76ff1aba08624bf195e504c804b468dc8bfc83739392fa3c0e935c1cda3d8e4878127374bb9725726ffeb1f80e403d37a7e873e8e86f93
https://rvm_io.global.ssl.fastly.net/binaries/debian/10/x86_64/ruby-2.4.4.tar.bz2=f7895f6709101937035a560326cede956705a2deb21e8170627d2b4e38dfe0e61bee497a591100b4f4312d5575a7431508cc3b551e7f5fb152f57976b12aea42
https://rvm_io.global.ssl.fastly.net/binaries/debian/10/x86_64/ruby-2.4.5.tar.bz2=4c8a040d86df08e054411585af4148cead774e3765c34bca8ad5d7f8445861c66f34c20ffc13043f760723728af7c19d9c62b8e45816008b3b927aab8c6992d4
https://rvm_io.global.ssl.fastly.net/binaries/debian/10/x86_64/ruby-2.4.6.tar.bz2=8abbe5d7066498b5b7500676aa7112bedcc403017fcd6020bef0f87bbc2dae34fa434a44f6977fe52bba465c0c2d9041ffa1c1888c20f28b5b376acd7f0d0a9e
https://rvm_io.global.ssl.fastly.net/binaries/debian/10/x86_64/ruby-2.4.7.tar.bz2=b6cf8d5f79a164dd270a3bfec2aeefb86f24de20f3b8736946185eff8c6c78ea38059e7983ad73819f08904f38c290fefec805371e2229a21207582655a3f1a3
https://rvm_io.global.ssl.fastly.net/binaries/debian/10/x86_64/ruby-2.4.8.tar.bz2=615fff14f4596ebf9a8823630645c3f7ec2cec332b3ab948954bde8d44b50db6988326db98aac6d8a10fe372c251a823bf997715d30152de5b5f0b341e00bb94
https://rvm_io.global.ssl.fastly.net/binaries/debian/10/x86_64/ruby-2.4.9.tar.bz2=b12787880ce7cacca1738769fb14a415cd440b909288dd7a1464be7b0f80411355bf85f73c2c792b6160d9bb4002e8a38c830ed2e10bbcc52b9bd865d29be1a1
https://rvm_io.global.ssl.fastly.net/binaries/debian/10/x86_64/ruby-2.4.10.tar.bz2=d140e2964724cf8ebed4320c294b754718d57324dfce46f8edea5a8d57a8db5a5036dfb1cd348e002cb6e9526906681000436caa22a6cd32c440a4994c7e72b2
https://rvm_io.global.ssl.fastly.net/binaries/debian/10/x86_64/ruby-2.5.0.tar.bz2=e2d5e8d67dcc7d2d4196e2af66e2587333136249079cb1c2cc661da40602cb6261488565b23b907be64830460324c93e08dd4c2efbb65b8f448b84b3c9a2c950
https://rvm_io.global.ssl.fastly.net/binaries/debian/10/x86_64/ruby-2.5.1.tar.bz2=27116d0906c4aa518d019bc532acb95d1c98ace8db149eb6b0cef2fe1d2a2359e7e6b5c8984df3329112c88846fb34f10780dbd2c3c046a5e4b0275e7126becd
https://rvm_io.global.ssl.fastly.net/binaries/debian/10/x86_64/ruby-2.5.2.tar.bz2=7115539523cf667f655e4c81feb7eba793e25e8ff50011515350752f86ce6f64a97ad38c22b8acf0ac91271438cc6664c056aa644864979dff02596bedb9ce24
https://rvm_io.global.ssl.fastly.net/binaries/debian/10/x86_64/ruby-2.5.3.tar.bz2=effe3181bd28d72546398c24e6ecb80d5e6d7ce27c20ee110e4eaead3964f90324dbecf33656af09fa4dfa65f836debacc18c338e9b7df20919f1aa4859028b6
https://rvm_io.global.ssl.fastly.net/binaries/debian/10/x86_64/ruby-2.5.4.tar.bz2=2c925dcae638211883aa122b10913a1cb503274e503d0aa3bbd5b9e395607d9fdb02cd9985c77862ebdcd0bda21b76cbb61477ca3147f091c7cec52abe56861d
https://rvm_io.global.ssl.fastly.net/binaries/debian/10/x86_64/ruby-2.5.5.tar.bz2=da5219acd86539bd73c95cfe7af2b81f045b9c8c11e1fecfbc423d659b34510eb052750aa1a0d139651385eff2b9d854792780e4ae128dd737a6105ad75c88db
https://rvm_io.global.ssl.fastly.net/binaries/debian/10/x86_64/ruby-2.5.6.tar.bz2=646185415933b831d240e497e56cf17d95ab059110499877c383a22408038ebb39ff834f15768b7fcb56e6f697632306c6f12367bfa5c33e9b5a0030d0dec39f
https://rvm_io.global.ssl.fastly.net/binaries/debian/10/x86_64/ruby-2.5.7.tar.bz2=f76d827ea22e6e5785d58c028ea6f5571461d0ad0daff99ac0adc8b08f105b2614777491cdb022a48d15fc58953988c79245ba1d47f6b6f5ee818806ced1ba5b
https://rvm_io.global.ssl.fastly.net/binaries/debian/10/x86_64/ruby-2.5.8.tar.bz2=59caf112cd6ec722190114c02e1aed89029a96367ac1fc9b016202f619b0db62c7ec3c330c359c50e165661cbd1b59626e261fc404bff50c1ceb5c23f716775c
https://rvm_io.global.ssl.fastly.net/binaries/debian/10/x86_64/ruby-2.6.0.tar.bz2=33f7e5160b61579acd25d9185d3ba5d2b9765b1d22035e2d6990a116bd4d3df4acac22bf369e492ca57ea333f18ad34fa44e00e86ae4a11db082919c96f3caa5
https://rvm_io.global.ssl.fastly.net/binaries/debian/10/x86_64/ruby-2.6.1.tar.bz2=965335518ee4e55eebe7bca28f7c529d3afac2f5220f820756f8e5117f5a9ab79ff72da9c0960e44bb07db6a90302a698a590d071172d72ddc3ae97252b1bb11
https://rvm_io.global.ssl.fastly.net/binaries/debian/10/x86_64/ruby-2.6.2.tar.bz2=2792ada933da84a9fad641fc91a14fbe3f66a9a43dd75153be74f68f5e9b174226e962c4e5c9fdd67114bcc931d76922f966025642d136a1cbb2a0b1b99f7fbe
https://rvm_io.global.ssl.fastly.net/binaries/debian/10/x86_64/ruby-2.6.3.tar.bz2=3521ddd9b421c67fe002964b801eaf6e0e1278e2edce480241b1978d75a83f9b69bb57da2113e69d206c89734ad7127da71c6c1ac0e6817f898242c511190d75
https://rvm_io.global.ssl.fastly.net/binaries/debian/10/x86_64/ruby-2.6.4.tar.bz2=5bce9da48d7858600193d879ed6fba659cef7ec749848c2ac404cf3b8470ca3e64b742fda2d220436bd972ad20f1a0d044f4580d1dc1fb41a72f2b0ce0bf8295
https://rvm_io.global.ssl.fastly.net/binaries/debian/10/x86_64/ruby-2.6.5.tar.bz2=c62dace52c22e02caf64ad32187d15cb2c8f56acf89bf9839376c97e1f33b46d8bd79920376c77a7bc989f50b9b2b4c5c0356f7fc3cbac0decfc03b5fd3397b4
https://rvm_io.global.ssl.fastly.net/binaries/debian/10/x86_64/ruby-2.6.6.tar.bz2=1a944edc5b3a6e0aec41ee30e3291f66c6c6e09972f7edf77f4ff850d4c850edec51a11a983f77f0ed35fef81bffd3a18dd78cef4a21a41407540dc1448c57d7
https://rvm_io.global.ssl.fastly.net/binaries/debian/10/x86_64/ruby-2.7.0.tar.bz2=4fd5d7cec68aceb3abe2720fa124833cc47f9efb36a7cbb6ea39f0eba9ab9c9adc1ff78d18bc536f400dd8132ca7a2f72867be7ae9591fb50278963e048ea5da
https://rvm_io.global.ssl.fastly.net/binaries/debian/10/x86_64/ruby-2.7.1.tar.bz2=c64148e5aec8e8eef3344c1900eebae445052662c4cf2f2906652a4a33e4cc9726bdc44c05c41d10c1fb94bbcf95c5a7743a95e25d528a85e6f806264756a1b7
https://rvm_io.global.ssl.fastly.net/binaries/debian/10/x86_64/ruby-2.7.2.tar.bz2=ebed21fddbbfb6ef6e6913212c860fdba01887cbb0cc62190664c2c6eee1c01980e7b1bed26eaf8d3f15294f6f385b58fb93782293344e0df79f2484da2bb168
https://rvm_io.global.ssl.fastly.net/binaries/debian/10/x86_64/ruby-3.0.0-preview1.tar.bz2=f04bd808b854ca339c0ea257d178351a287f770ba36f1a06d2e28dbce95aa54cb8c8e7164ee6f097e77d56ec24d6e9a2fa9adbc96c541c0a6eabcb546140ccb0
https://rvm_io.global.ssl.fastly.net/binaries/fedora/17/x86_64/ruby-1.9.3-p429.tar.bz2=f63bac1909e05ef7448afbe395c3e7e9d7a82839f5498b8d650d0ef121706aee17fb1235d566890387336c7fc2fb8df7b73227c09279b526370198f6ff82c450
https://rvm_io.global.ssl.fastly.net/binaries/fedora/17/x86_64/ruby-1.9.3-p448.tar.bz2=0dabf5af3a9736e10eef283fd6ce49bf4a57452aa11902721c4a5a5579d07d9e35272b07f5577153a25a1db7dc0abb3cc8aca75f4074949be1ce8e8123f2a526
https://rvm_io.global.ssl.fastly.net/binaries/fedora/17/x86_64/ruby-2.0.0-p195.tar.bz2=0204725cac76d8dc43bcb9dc3a3bdd830aea8782747cae6f1ce21f9f675a2cb74945a759b7a7391447ff31704eb3e9dfd158ab3e5f9bcc3283e46c8af6329bca
https://rvm_io.global.ssl.fastly.net/binaries/fedora/17/x86_64/ruby-2.0.0-p247.tar.bz2=0f2382e3de3188e088db249268e2980799144182902553fe02dfa66a58156bf38332bab9ebeb4cb0fa81f56d6dac3d8a0af58293c0c3abe0ee833bec39d1885a
https://rvm_io.global.ssl.fastly.net/binaries/fedora/18/x86_64/ruby-1.9.3-p429.tar.bz2=3b470156170d467b4ff61e3ceceebfbd5f93d3e4cee5963bbadf3666328685d8c126e841a982dd6de328a2cfc4001f00366913f16429e616bf9b15607b9ed1b7
https://rvm_io.global.ssl.fastly.net/binaries/fedora/18/x86_64/ruby-1.9.3-p448.tar.bz2=2fb622f5ac6470714bf6cd8d5b01d6bf11c9260a293a3bf5f8dc93291d202e897d212d9a44fbafc94d6e3af2cfda522d564884c3c158e75a8b3ea43e9e5b43c1
https://rvm_io.global.ssl.fastly.net/binaries/fedora/18/x86_64/ruby-1.9.3-p484.tar.bz2=149e963b4a402516b0593d6e299e1ba33eb86ba051d96c3d1b19731388777d6b6fcf4a26706a8255622ee1bd2b88500b5b6b3cbc3172e9a9819ca933ea388b32
https://rvm_io.global.ssl.fastly.net/binaries/fedora/18/x86_64/ruby-2.0.0-p195.tar.bz2=3df20b598f963a955f4039ca2246647ade3ffc7121530051e816a49855e05f593487a8843c739212ce452c006cedfb1281332dc9b7f5dffd7079c254c356d051
https://rvm_io.global.ssl.fastly.net/binaries/fedora/18/x86_64/ruby-2.0.0-p247.tar.bz2=50e22c1b0330d79b2bd53fd011ddb9dc43a06ac2d289bb170dbebcea3ae67dd5118b5344580902f3b9ad7388e632f060131ff449d49e44e9295c3a2e875fb608
https://rvm_io.global.ssl.fastly.net/binaries/fedora/18/x86_64/ruby-2.0.0-p353.tar.bz2=c62344a0e281a3aee566300ce61c4eb18165f3a935d3a03f48be720d9993b73a1363e4a2e5a604d3ec911c8b01e4d30e3c29c18325089acafc7d5df2231b22c5
https://rvm_io.global.ssl.fastly.net/binaries/fedora/18/x86_64/ruby-2.1.0.tar.bz2=0a2275fe2d6e215b284e57d3830d3df1675146d78d4287f55fb5a9620a5cc27513dc6407ced0dbd4a210ce8cf643c57ce718db9b9afa27ddbe491a5a3e4eb532
https://rvm_io.global.ssl.fastly.net/binaries/fedora/19/x86_64/ruby-1.9.3-p448.tar.bz2=5b00d257663619e8c50427fc925a658a7b03ce3bce3611bc3c404af00ddead011aff83c9fe5142fd959f0a2a73aaafffa0563fd000b8ef3fe4e93f8ce3998bed
https://rvm_io.global.ssl.fastly.net/binaries/fedora/19/x86_64/ruby-1.9.3-p484.tar.bz2=8691b035289ac1ca5a6f44fe3e5f022184a27f85976e055ee8caeaf03162c4cf77c9acf524b42ec289316a3c481e482fcd2896aa87f495011aa37d9ee1e4f52a
https://rvm_io.global.ssl.fastly.net/binaries/fedora/19/x86_64/ruby-1.9.3-p545.tar.bz2=b6475388eab8c0c66c5c7276cb1aa531b656c033c6d02231ea8bb225051fd2fd1522d8ac00bffb43a0775f32a0a676d39403bf3dda2c70566767ab7a83e3e72d
https://rvm_io.global.ssl.fastly.net/binaries/fedora/19/x86_64/ruby-1.9.3-p547.tar.bz2=89184aedac3f748a7262c73932bc19ddc0b26940c94ed30e83ae481fa379b7efee941d8c215c73b42f79686d872fe963146a51aad47d2492376e51ce1e6001a8
https://rvm_io.global.ssl.fastly.net/binaries/fedora/19/x86_64/ruby-1.9.3-p551.tar.bz2=04446d1369e872c94a254f682460ecbc8f5d816bc2d9d7cf5e00587c47dd5e21a02eb6e79ef199ab73d6732014b5764c59679940788e03f029b10c5c7e8c093a
https://rvm_io.global.ssl.fastly.net/binaries/fedora/19/x86_64/ruby-2.0.0-p247.tar.bz2=3470a37cf752ab937ec217b7edfc943842c5fae107277c304457e79592c030d82df2b483d96972a9d1401a14980a929dcc0b62b1f9540618ba3b4fcd410ae87e
https://rvm_io.global.ssl.fastly.net/binaries/fedora/19/x86_64/ruby-2.0.0-p353.tar.bz2=28af5e7d4e0114abc3832beaea0157f3b2ccbd05af390aa3dd94f1f139a40f607df9fa139b0cbc0e8d9b66543fab43abe1367ce720cb75bf04882163bd8fdbe3
https://rvm_io.global.ssl.fastly.net/binaries/fedora/19/x86_64/ruby-2.0.0-p451.tar.bz2=b6c860ed7568aa5dc468adfe67eded1da476fd9477d9c418acc6151ed60707da42ad086801bcd16ea9addf862590833facd90ebd59ce6a71a93364a178dea43d
https://rvm_io.global.ssl.fastly.net/binaries/fedora/19/x86_64/ruby-2.0.0-p481.tar.bz2=2731b23e4baa248079d9f38a896bf6a84ba6e547d588cf34b056b5b98a316fbdc0a5b07d72add24f38e3e1947c964643f00b8542996f22dcbf350e30e2f31e4b
https://rvm_io.global.ssl.fastly.net/binaries/fedora/19/x86_64/ruby-2.0.0-p576.tar.bz2=9fedf133f6b28e1687d562da0442a7d16084065e8d434f1ebf12a227e7a8a8b43a384c20a6e1f5d7e5c956ae10f1d34ad9c2478d134ca7d3884796b2db1db0ac
https://rvm_io.global.ssl.fastly.net/binaries/fedora/19/x86_64/ruby-2.0.0-p598.tar.bz2=fceff5855d65c6c04082c4796eeda7a45d8204ac182d25c60a8a5b679c6511bffc36124f477ca32466c6043769e79c3a0262ecb6d67b414a6c0a4e91856ec828
https://rvm_io.global.ssl.fastly.net/binaries/fedora/19/x86_64/ruby-2.1.0.tar.bz2=e5dfabdcbb2929f76fac4696922d1695b25bcd79013793bca2e54729435688cfaf9a4753812e8ec807462d3c88c1e7c271558179a683b1dc48ae333948040483
https://rvm_io.global.ssl.fastly.net/binaries/fedora/19/x86_64/ruby-2.1.1.tar.bz2=05040489b0e73a7b02f268fe7ec38182e0fcd9bef7fd41c4871374cac52a2ee82d5bafb9d6c42adbfe6f4ca17c755de6763faf587ba73367a6efe521823fd0ec
https://rvm_io.global.ssl.fastly.net/binaries/fedora/19/x86_64/ruby-2.1.2.tar.bz2=1678ec02ed6f187779cdff3e45c329fd83b0841cc77ada33139236d2c15dcf96ba2ee5889be56f1d0c897ccf9f3da0789029c8da8eb269740d10250109971333
https://rvm_io.global.ssl.fastly.net/binaries/fedora/19/x86_64/ruby-2.1.3.tar.bz2=fdceb48c2aab963893efd931e65641611f0076f0476cdf6bff2a87d5bfec357794eecc2777d5a0666b91221e537b41e2ce5ba5011c704ac34d90f64c17cc794e
https://rvm_io.global.ssl.fastly.net/binaries/fedora/19/x86_64/ruby-2.1.5.tar.bz2=0791b51f5048c329b8bbd49dc77150e4eace33e6206534f42ce5d8b6f44aec077593ca43cd1658378c489efebde064b31bd494bf2ec4245a24268be60431c4c6
https://rvm_io.global.ssl.fastly.net/binaries/fedora/19/x86_64/ruby-2.2.0.tar.bz2=3e58ee967574fc80432ecc83c7a3b128a5c13c1ff92ae3eabfd75b70ad96ce774e176dc752d4f20fb27605f76c9bb83db930528c280c6c22811f997c907991e4
https://rvm_io.global.ssl.fastly.net/binaries/fedora/19/x86_64/ruby-2.2.1.tar.bz2=c155e7050315feca7b116b737c61e6af3f68f5a3c471a4757b6f744fc6c5e33f408ef8bbeb46a4e830bea4ba2e1aca3865152486b9d19566b71d4db69fe8da80
https://rvm_io.global.ssl.fastly.net/binaries/fedora/20/x86_64/ruby-1.9.3-p547.tar.bz2=554886ec6c88cec8e01c9f148d5f7f7f4a1f4b7bd81e79d98e805d33ada85228db4908373ec41451bed59333435900ef337eeaae7b8e850aaf1580bc6c4c82a6
https://rvm_io.global.ssl.fastly.net/binaries/fedora/20/x86_64/ruby-1.9.3-p551.tar.bz2=2581e666c8f186b6f7e2ebff796650508b9243f727f9b1f240bc9c180e741f435d74e711a4eed3220212627b26bf4e3fea42cfbc339198595ae3c7cbc348c7a3
https://rvm_io.global.ssl.fastly.net/binaries/fedora/20/x86_64/ruby-2.0.0-p481.tar.bz2=d7ebcddad8b05d1836c434dbc47549a2f9a19cefb4ad4ef2458d41411f4c5d341dcc20f6eb6a6d1c7c12379fb623eb1b5ea4193c6c6a5b8ccb1cfda77c8fb531
https://rvm_io.global.ssl.fastly.net/binaries/fedora/20/x86_64/ruby-2.0.0-p576.tar.bz2=09bdc1d17fb42e2523f5cbdd35da5fb25b9f1a7f2b4e63bbc72edbe40ba9f296dab5cd9bb29065b56b43c812162598f977dacac67bf8d1f215e1b5ea1ca2586c
https://rvm_io.global.ssl.fastly.net/binaries/fedora/20/x86_64/ruby-2.0.0-p598.tar.bz2=951ad4950e0720273cad3cf0637aabbf58ed9c559b40744c75640902279c8dfcfc994034e19ce35bbbfd9d6de599f476e57070e97522b8c97908ea5661912c2e
https://rvm_io.global.ssl.fastly.net/binaries/fedora/20/x86_64/ruby-2.1.2.tar.bz2=87d18685cc18e804d019bf8799087e205193f56cc434f4c1d9b53885c5e7a82b2489e170959c50c2d4c5cf35b4b1ee7e3f0c037c1ba803365fe756211d8cc07b
https://rvm_io.global.ssl.fastly.net/binaries/fedora/20/x86_64/ruby-2.1.3.tar.bz2=2fb54e0d01b4858411d8dc636aa79c34b8c848d3e4986efc36f8c4b1f9b930f7c17f67c56b55146a9d1c128a9364604a5eebe3b9154e443e897eaba970f21b4d
https://rvm_io.global.ssl.fastly.net/binaries/fedora/20/x86_64/ruby-2.1.5.tar.bz2=5161a8596bae6a5eadb8e4828606e643019df2689cab1de3a160b4c7736ab6d41f366f1787226ac00a8ead2d1cfbfe78041dff8e6b64be2327cbe2cf60185c89
https://rvm_io.global.ssl.fastly.net/binaries/fedora/20/x86_64/ruby-2.2.0.tar.bz2=d2bb5664bbd6ffa02e9cbf144cdd816526f7b4c433c52cfb90b00427a093f07faed74e386ae9105b67441dff7ff157fb8cd6c0b9cdec126631ece55be664d1a7
https://rvm_io.global.ssl.fastly.net/binaries/fedora/20/x86_64/ruby-2.2.1.tar.bz2=9490954e3ae80d222f4efbd28bf9d453f0a007be060359c4b11dd84ebd161caabe2039c030b77c9fe7fd9850093ace5ed8090e78fbfc57d7801d4abaa8a31494
https://rvm_io.global.ssl.fastly.net/binaries/fedora/21/x86_64/ruby-1.9.3-p551.tar.bz2=be7789781b183414875d2a19292ebd6f9f472b2a8e0d376e08a6f6128dd4c182673c652d5e493514220793951a5c2fbdf180b3de1ec3aba27316e68a925ef242
https://rvm_io.global.ssl.fastly.net/binaries/fedora/21/x86_64/ruby-2.0.0-p598.tar.bz2=cb71f575832f4dddeb5e60589988b590902a4c60a8b70cf0347baccfe07da8b8a3f172455f805bc01f78a591d3fda20cff9cb07d6dae491b77c6cf15d4a9d909
https://rvm_io.global.ssl.fastly.net/binaries/fedora/21/x86_64/ruby-2.1.5.tar.bz2=cf7cb1014d6094ccddafaf4277ccc8b9611aa86f058071a251be346d720978f645de195dde426ef0065f14a82035b835401a5e1f8002ba14529c9b9d3b5997ee
https://rvm_io.global.ssl.fastly.net/binaries/fedora/21/x86_64/ruby-2.2.0.tar.bz2=1a816f73598f507ee1d1872e4ed08dd5fbc3d2c96b43672c9644c18e3f738a815e498c190a894d1bfb52a94ddfa666ed50eb918596d5cf69eb8410fb70ffe405
https://rvm_io.global.ssl.fastly.net/binaries/fedora/21/x86_64/ruby-2.2.1.tar.bz2=d1216b4deb53b44329f04c1b796f69a102a3bcf5156cd2401dff80d17f1d1876842a38e84b083d222d28bf3cad68d48b9343f4a693000f4001f18d3dc9b9a196
https://rvm_io.global.ssl.fastly.net/binaries/opensuse/12.1/x86_64/ruby-1.9.3-p194.tar.bz2=8811c1c5d233be78e869ae2c197720b1b0279d2bac467621f43bac4050226f44696d4be7cd6a229809b03cd23ed37056006c1c90a9487e13122906fb3bb0a62f
https://rvm_io.global.ssl.fastly.net/binaries/opensuse/12.1/x86_64/ruby-1.9.3-p286.tar.bz2=c42db69fc1e226a85c69883316512d599d33567fcf852e17de4a1abf04d69393d5339497605cafae0bc6c17b69e2c74d537efc530813ddb9a321b1ab6b8432cc
https://rvm_io.global.ssl.fastly.net/binaries/opensuse/12.1/x86_64/ruby-1.9.3-p374.tar.bz2=745492a1e3f14d816ea5658c0b84dd761633748b2a2ce5eab8ff119315f2222f577c7d802e5f2305060605f48f58e43089fcfb03e33ef40ffbdc22f46062983b
https://rvm_io.global.ssl.fastly.net/binaries/opensuse/12.1/x86_64/ruby-1.9.3-p392.tar.bz2=93772bb86172c9adf2ba48804962431d2a4db74801067a65d8820f57940e6138bc74ed0e476a901e40120a42aa4353b762d1503d9a8c740bfddf12227d7053d3
https://rvm_io.global.ssl.fastly.net/binaries/opensuse/12.1/x86_64/ruby-2.0.0-p0.tar.bz2=3ebd7d732745a30e02ee2a5549d8b90d74a87a1bf56509f43be2e168930fb12c4abdf6ae471115b77eb6709064bf0c1de33c6739a37466c2d118d70c0a2a2955
https://rvm_io.global.ssl.fastly.net/binaries/opensuse/12.2/x86_64/ruby-1.9.3-p194.tar.bz2=af328268eb1b876acedbd3af1208b29be338acc308e41ff78c398b04e357a575eb56accc2167a4761d419d88b5a6302a1e9aaa527812b4edcfee8b896a19d1d8
https://rvm_io.global.ssl.fastly.net/binaries/opensuse/12.2/x86_64/ruby-1.9.3-p286.tar.bz2=3a2fa83968e750fad4a256d04fd272b9d4f7530ea1535ed12ff7b8b5d630b2324abdf05213aa6379fa64255bfec047275430b2b03d958d982bbcc8a3fa6cf350
https://rvm_io.global.ssl.fastly.net/binaries/opensuse/12.2/x86_64/ruby-1.9.3-p327.tar.bz2=d1aed2bb0ee2f5f4d4e7148e4e5def7990dec269a66ce445ef48587a7d73a0cf83f15352c09494f33adb4cbbc625850b77a608efaf42548e17c97f32e5c070bf
https://rvm_io.global.ssl.fastly.net/binaries/opensuse/12.2/x86_64/ruby-1.9.3-p362.tar.bz2=98fc1ca7b69a64f48425ec319385535284822e215de0b51e0c13311147240f086f94b9ec77163b3c826c41682c06bbed1539bbab2232d55876b66828ed745fdd
https://rvm_io.global.ssl.fastly.net/binaries/opensuse/12.2/x86_64/ruby-1.9.3-p374.tar.bz2=56b901033e0461103ad2e8d783499dcd13c43791b8f266e384bbff5a1a4ef4cf89b48b3fdefcc2c591e4acc6d7e8f317c3a6f3199a97d7d241a3861b86e0fa09
https://rvm_io.global.ssl.fastly.net/binaries/opensuse/12.2/x86_64/ruby-1.9.3-p385.tar.bz2=7ee21d68c0a4ddfe102fc51078ffd114163b158acb831979239b7764393fc7397a5e4f2fe33515c01c49381a434b50fcf4152d181c80bf84757cb000ab70f71b
https://rvm_io.global.ssl.fastly.net/binaries/opensuse/12.2/x86_64/ruby-1.9.3-p392.tar.bz2=197564715b6f7fa093c96a4ccaec287ec3848f7fe9d6a983a7a9270c19f32243622a66162cf479c3823c6104509d74051cc4d701f3bf08382cf36f3687a94157
https://rvm_io.global.ssl.fastly.net/binaries/opensuse/12.2/x86_64/ruby-2.0.0-p0.tar.bz2=322e1161c624a62828061159c3e31ad2b58361a35da245a036479469c0b48d9ccff850edb836597d885c6bb60ed230d665ab1b1a4855d056cf60e151b38e81af
https://rvm_io.global.ssl.fastly.net/binaries/opensuse/12.3/x86_64/ruby-1.9.3-p392.tar.bz2=9000e0fa88cb4624913cacbc749751d651228887a9ee130cd61061159dcdc22550935b1309fc8625599e42caab3a88ba2ada0054c33a43ad6b5ba898d0bdeb17
https://rvm_io.global.ssl.fastly.net/binaries/opensuse/12.3/x86_64/ruby-1.9.3-p429.tar.bz2=9aa209fb00ae445a898c0a3923fcf2d8ef50d536c7f7b0ef12b7052814b6b70577b538010753c3f5d857a5dd4a985f7ed98d7b1afcf8be5cf089e4fddc2bb5c7
https://rvm_io.global.ssl.fastly.net/binaries/opensuse/12.3/x86_64/ruby-1.9.3-p448.tar.bz2=63741375122282772a7a50a2befaff48d923e8736924b79afe6f75a6552964d014f0b65d112e9aec9356095f6f12f758613e1b2c626cd1aca5494aba96ccb462
https://rvm_io.global.ssl.fastly.net/binaries/opensuse/12.3/x86_64/ruby-1.9.3-p484.tar.bz2=44b1e8bafbe636977d28f6fdf9ad661fbef115eff5ceeb3c16b7ad285e4ab74c880f887c8b189c126a458f40d93464a1b08e36501e07d786d4768a8fbeab0894
https://rvm_io.global.ssl.fastly.net/binaries/opensuse/12.3/x86_64/ruby-1.9.3-p545.tar.bz2=76e9044322875a62891082dd2ebf2a06871d03654fe669c8fbc1123df6053c5fb9ce5583b1bc6a9f2085aa0477bd7f0a7623ebf92460f2c60a929cbd2ceba851
https://rvm_io.global.ssl.fastly.net/binaries/opensuse/12.3/x86_64/ruby-1.9.3-p547.tar.bz2=411f0beb15e9759554607fa9866471e443e62ac7a4e2537e92f9181db418a91c6845c583de3bbab43aa89f8f555aa7a42dd6dd7495ab8f63963b598b82d88d6c
https://rvm_io.global.ssl.fastly.net/binaries/opensuse/12.3/x86_64/ruby-1.9.3-p551.tar.bz2=29c03464d7a6a875bdea7e7e69ff8bf4ec5d575737d6b952c3dd88e05905d03fe801b6e38ec91ac9eca67e0fe25e002f339574e9363ea0a9be57dc47133197ff
https://rvm_io.global.ssl.fastly.net/binaries/opensuse/12.3/x86_64/ruby-2.0.0-p0.tar.bz2=7d80de8afbe5421c5651f5a2fe466ffe42d00a7d3a3c262d63581f3f7249804a9ec3d0b2d8a817fc6321d96d8ec7af864bcc3dc72878dd036c595893230a98ed
https://rvm_io.global.ssl.fastly.net/binaries/opensuse/12.3/x86_64/ruby-2.0.0-p195.tar.bz2=330b80c13df4a13ff4cb460e4df79607200f4167ee9dc1d0c5bd9851ba74167a4b5c06d239a362a7fece7018e7d81cebadca8bfb3fbad5f97ee8860d6c7f7c3e
https://rvm_io.global.ssl.fastly.net/binaries/opensuse/12.3/x86_64/ruby-2.0.0-p247.tar.bz2=8f50263e54a44efac9f6e16f316d83c7749791c19854715bbce7555573701dbf82be4e7159314f40cef08bec234185d338905ed8fd23086f12c45d55e4877d09
https://rvm_io.global.ssl.fastly.net/binaries/opensuse/12.3/x86_64/ruby-2.0.0-p353.tar.bz2=58102067069f25a20615cfa8293c9365136996a91769c62675a4a6d5f6bd2d1a3c3ee32f7636c292eeae5233422b74d822a7e7888dd02d613918a9d929ad2638
https://rvm_io.global.ssl.fastly.net/binaries/opensuse/12.3/x86_64/ruby-2.0.0-p451.tar.bz2=102c31793e886da587372379ca229132487f1c4bd7c478c085cc5cc219836977e3826686f3c410bac5c6fc3d61ba5b2dfeb769a8300d37a73fb2eae5faf28d5f
https://rvm_io.global.ssl.fastly.net/binaries/opensuse/12.3/x86_64/ruby-2.0.0-p481.tar.bz2=6a0a99b405cf54b0f26e5b36b4bcda49df4af6d053abb3f7b5f0816856e3f7d0954567a5b04517166e5c51d72bfcde45fdbea6138ee4c8e897e895ae429e3c5b
https://rvm_io.global.ssl.fastly.net/binaries/opensuse/12.3/x86_64/ruby-2.0.0-p576.tar.bz2=7e38637138b1474dd4bfdcc5b4afd5711032a2207c936cb5a95ac63971ede51cb1ea46ac1a0305f27823c7aa86411a9946cb96f928fa682822e3cf85ad7f50c1
https://rvm_io.global.ssl.fastly.net/binaries/opensuse/12.3/x86_64/ruby-2.0.0-p598.tar.bz2=546432775f662e4ba636b20f6707d49d78072907651a268a2ca743ecbcc101c159ddfd8d894e7bacf8e090985d836cf9902122244e7aa889047c3f759b7f4aed
https://rvm_io.global.ssl.fastly.net/binaries/opensuse/12.3/x86_64/ruby-2.1.0.tar.bz2=96439259115766ff0761858c3b85f4f6d4ab40a525d11d76c78b2892490d7b1bc65aaf717a37198aeff9a3054fb2cb744c24bfd1afc5ab63a7caa6fd633acdf6
https://rvm_io.global.ssl.fastly.net/binaries/opensuse/12.3/x86_64/ruby-2.1.1.tar.bz2=8aa3fce0517ba1177428bf575b6be95626af81693ddd886794a49af2b241ffff85247aefabb3e42f3262818dea433614655fefc32ea4cb18afcd54fd06b47596
https://rvm_io.global.ssl.fastly.net/binaries/opensuse/12.3/x86_64/ruby-2.1.2.tar.bz2=3491e71daf3b008c3e994e83a1d5172fef45afcae246bdec30e618891c9b44bad74877a1dfe3da7d2deca5030411fca294b08a695bbc70a98072c8ec9ac05939
https://rvm_io.global.ssl.fastly.net/binaries/opensuse/12.3/x86_64/ruby-2.1.3.tar.bz2=774cecf8e5619a20ba7e6d5eaf020ccf27b54cde7e9c93669378cd7833373eeefee893e0afaefab658ecd2f9b0dd2cfc9a6a59e5a987b3616e8860dede79cfc3
https://rvm_io.global.ssl.fastly.net/binaries/opensuse/12.3/x86_64/ruby-2.1.5.tar.bz2=395b783adabd97846419e927e51e4fec878f1f9a40d3def51f11411d5f896de02bf97b3ba579510371c2dd4aed12300e62c42e17ed0be88e16d70c81d8c0cf58
https://rvm_io.global.ssl.fastly.net/binaries/opensuse/12.3/x86_64/ruby-2.2.0.tar.bz2=1a8ddfbca6bedb07917beb6f88735896aa73f3fbbbd5b56421ef74aa15a56ce483b64011ea60f028cd4ba66e030621eb76983068719345e8640c188a5f24061f
https://rvm_io.global.ssl.fastly.net/binaries/opensuse/12.3/x86_64/ruby-2.2.1.tar.bz2=b37f1fd17f89efde2a2e6c045df69ea059b3158a0dfd65026c25634f18263f7cd00e8f1bd25090ba8b3a0730a1b282c41824b9e2f93ecdebfde79b1178b9b600
https://rvm_io.global.ssl.fastly.net/binaries/opensuse/13.1/x86_64/ruby-1.9.3-p551.tar.bz2=5285189906d8d1ffd83cef6da33cd440250ca75be0cba9a92932c46f24561b5970b5526c1d1a8639c9bcb0999a0c04b508b38eed2a6e15e80b2233e0d5b15d29
https://rvm_io.global.ssl.fastly.net/binaries/opensuse/13.1/x86_64/ruby-2.0.0-p576.tar.bz2=74b75b557d60046312f21e0e53a34f52a3de983973c1e7ca978a0462a082f39319b8b20169d604105bf1aff62c4ae3f3e3a95724b62b35185eb7f0d4e4a79769
https://rvm_io.global.ssl.fastly.net/binaries/opensuse/13.1/x86_64/ruby-2.0.0-p598.tar.bz2=c8d5ea402f63ab6733043db5022bc4eece07073d0ddffc91426d22bb507cfdaf8c38e84ea5059d570b7b0da6bf50e47c325101e807eabdc9b94dd800720ea89d
https://rvm_io.global.ssl.fastly.net/binaries/opensuse/13.1/x86_64/ruby-2.1.3.tar.bz2=02f61304ba51e5a17047379acdefafb169da85eb71cb6e73dc128f4ca837fc4c03f09eac5abd5435dda7c4443cbd420426c9519b81f8ac671098e6180c99ceee
https://rvm_io.global.ssl.fastly.net/binaries/opensuse/13.1/x86_64/ruby-2.1.5.tar.bz2=d3ffc449d5cbdf08e771630562384e925cebbb8461e140cf2c69875a1b162bc12fc8c52ac867988930990f238df366ae11e0cac6218406dae268af63277f4cf5
https://rvm_io.global.ssl.fastly.net/binaries/opensuse/13.1/x86_64/ruby-2.2.0.tar.bz2=94d9f49d5fa1b68c83e4803903a117d126d3ff5a005b1fcfc28946e55423591df41e6e30bd20116c1de13e05cf3f236a29fc1983e7527a045064244a4d7a924b
https://rvm_io.global.ssl.fastly.net/binaries/opensuse/13.1/x86_64/ruby-2.2.1.tar.bz2=94599c8d86e6c90e4c2e9f176ced783d51c819072334eba7012cbac1f6cd17c94340fa5cb1307a24dd144f85b3a9c367d1c1d5aef196dda4c8e509d450330f00
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.7/x86_64/ruby-2.0.0-p451.tar.bz2=e56a56b467157f6255b5a49d16ca658118bf2262c48d8f73a6facdf357a7c505ba20aea070843bd0c1110b54ef19324c23ea84939006a7de22597f48e32e6443
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.7/x86_64/ruby-2.0.0-p481.tar.bz2=54b0776e3bec895b90aceb61ab9ba1606e684a32508670a7a538ebbbaa4245fb49ac186241ccbee12542e0f40f99669b13992d708b79110a52f722ea42f8bd62
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.7/x86_64/ruby-2.0.0-p576.tar.bz2=a9063b6c3b7eeee9fc1a4fb871a5c7b2813712ecc4d52b117503678035a66274c743c42ec6ba9faebb40ec07548043b6091b285b9096c3701605fcbe8a935267
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.7/x86_64/ruby-2.0.0-p594.tar.bz2=8fb533f6fbb9e027aaf80a894528d88ef2c78139a0bf363a804db7cd9e0362899cbc436ce20b990e10779203bfbe11138438e571344dd9692ac04af7508f9c19
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.7/x86_64/ruby-2.0.0-p598.tar.bz2=5ba0fb1ae4765d05b1a1551f39c78819609e4975d4b1ebe26ecee4afcf893725095fe222e6a231222258fb20961feda4a257f06b3b37201aff5fc6ef59b86b95
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.7/x86_64/ruby-2.0.0-p643.tar.bz2=1e9a83c21cf7521ee25da2a5f239bc68e08ca6acc30c2a99dc2e2be8d5eaaaed13bb3e8d36982ff8dac880af7b598c503a93097adf726722e9f2f7dc9ce1c880
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.7/x86_64/ruby-2.0.0-p645.tar.bz2=81a70d35521fb52cc3e97aa4a4c5bd3f09733bc5caccb16d0ace6981afc4e89c553a657cf1e7d4d682d4b9014c1877975a6483cd076677ba6fd1ca651446ce39
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.7/x86_64/ruby-2.0.0-p647.tar.bz2=950ccc8b0898f9dc3339358affa67f97ddaa6c3e95bc5fcbeecb07206e5b45a25e509ea02eae6313707e63616e4e2f626474c0a7cc991ef9d928b5028e9b142d
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.7/x86_64/ruby-2.1.0.tar.bz2=fc9eb5367a7b44d0bdf5228222a1222fd4ac4dce1a234231294050fd4aa5eaf838d6d6d8c8cefa98cd52b83377219f52f51fd2a1084ff6e9e028ef392469fb21
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.7/x86_64/ruby-2.1.1.tar.bz2=027469cac8c866c80d7bd4e114cb514948c09f5a9bab186172f6d8c948b5aec440e7657dce3adb7cdb87ef5c76c606e7f4f75d1d0704c210d4467193a1f1d605
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.7/x86_64/ruby-2.1.2.tar.bz2=0593e6b2091712c0222bd750b7b7490e7a227e43d307089f1383b1d888d67ca25080a9316ae3c253f4d7086510fbcdf3ea327fa8d942afde569041bfbaf1b18f
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.7/x86_64/ruby-2.1.3.tar.bz2=23c8d1410694d972495f9901c382fc43ac0963e18a42c8c39587f87936510feb9c9924796235187ef5b4379757d5ec096f8ccb24712b8834c98456361e4828db
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.7/x86_64/ruby-2.1.4.tar.bz2=35eaf6ede369260ae50d0f8d6fd05a68fe777d483cc8beab68f7d6e53d199d9c792148620b6ddf599e2021736eeda5e3cb8460f9c1d0e160cac21e7c9b32c178
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.7/x86_64/ruby-2.1.5.tar.bz2=58ad84de8ba3e991d0e9bf3629678f61c0f19c41aa064b4593571d5a935b0c995b4048b5d2b9cdd68a7e41f9be10ae89b0e03ed87b4fb06a64cfa9c4398214ec
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.7/x86_64/ruby-2.1.6.tar.bz2=e8c14032ffb23a952614a049f0f9115479b84c2d7ed6dffb0c918a6bfa67d1e313f2e36d426f18100b6a52d188d9e39f009d6cf0aaa91ab4e4ae3ca2b58d0ff9
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.7/x86_64/ruby-2.1.7.tar.bz2=e1198b86e3e14197447c1ac9c9b52b00dc3f0c2e07e99da2389894549af0907f28a8fc9b84ccda7b64a7b9d237567cd77de09846d0fa3539225ebbdc9c2c57ae
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.7/x86_64/ruby-2.2.0.tar.bz2=df6cc8de8fb27825e855943780fc8e3c586e1c462456fb448f0b2c2d75619b022848adf9bd1c134fa532575ad08ad8e4714e726424c2a192c14ea416236e4d3b
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.7/x86_64/ruby-2.2.1.tar.bz2=169bdc17ccffe0d7991e4c56d07e224b3207628109b614a4d96788524fb34a72c71e6f675eb23ddcb4b0c20f012460e95c0215e86b4e5a35351343fd1d1931cc
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.7/x86_64/ruby-2.2.2.tar.bz2=3a656bc64b42f43a922a0a93938e10055e93ed2157e23ab7dd1f54b21cec70263df74370edd314c946ac53eb6cda95a811a03b51985dc1447c8d71031afcab16
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.7/x86_64/ruby-2.2.3.tar.bz2=7a1f42721c3c3cdf7a0cdbcacd3151860127dd5aaaa8780880068c1cbbdbaeafa02c80160f0061fe88d8a93599796a52b8cc7981a6a21d786b31dcca5d2a4250
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.8/x86_64/ruby-2.0.0-p451.tar.bz2=e56a56b467157f6255b5a49d16ca658118bf2262c48d8f73a6facdf357a7c505ba20aea070843bd0c1110b54ef19324c23ea84939006a7de22597f48e32e6443
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.8/x86_64/ruby-2.0.0-p481.tar.bz2=54b0776e3bec895b90aceb61ab9ba1606e684a32508670a7a538ebbbaa4245fb49ac186241ccbee12542e0f40f99669b13992d708b79110a52f722ea42f8bd62
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.8/x86_64/ruby-2.0.0-p576.tar.bz2=a9063b6c3b7eeee9fc1a4fb871a5c7b2813712ecc4d52b117503678035a66274c743c42ec6ba9faebb40ec07548043b6091b285b9096c3701605fcbe8a935267
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.8/x86_64/ruby-2.0.0-p594.tar.bz2=8fb533f6fbb9e027aaf80a894528d88ef2c78139a0bf363a804db7cd9e0362899cbc436ce20b990e10779203bfbe11138438e571344dd9692ac04af7508f9c19
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.8/x86_64/ruby-2.0.0-p598.tar.bz2=5ba0fb1ae4765d05b1a1551f39c78819609e4975d4b1ebe26ecee4afcf893725095fe222e6a231222258fb20961feda4a257f06b3b37201aff5fc6ef59b86b95
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.8/x86_64/ruby-2.0.0-p643.tar.bz2=1e9a83c21cf7521ee25da2a5f239bc68e08ca6acc30c2a99dc2e2be8d5eaaaed13bb3e8d36982ff8dac880af7b598c503a93097adf726722e9f2f7dc9ce1c880
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.8/x86_64/ruby-2.0.0-p645.tar.bz2=81a70d35521fb52cc3e97aa4a4c5bd3f09733bc5caccb16d0ace6981afc4e89c553a657cf1e7d4d682d4b9014c1877975a6483cd076677ba6fd1ca651446ce39
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.8/x86_64/ruby-2.0.0-p647.tar.bz2=950ccc8b0898f9dc3339358affa67f97ddaa6c3e95bc5fcbeecb07206e5b45a25e509ea02eae6313707e63616e4e2f626474c0a7cc991ef9d928b5028e9b142d
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.8/x86_64/ruby-2.1.0.tar.bz2=fc9eb5367a7b44d0bdf5228222a1222fd4ac4dce1a234231294050fd4aa5eaf838d6d6d8c8cefa98cd52b83377219f52f51fd2a1084ff6e9e028ef392469fb21
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.8/x86_64/ruby-2.1.1.tar.bz2=027469cac8c866c80d7bd4e114cb514948c09f5a9bab186172f6d8c948b5aec440e7657dce3adb7cdb87ef5c76c606e7f4f75d1d0704c210d4467193a1f1d605
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.8/x86_64/ruby-2.1.2.tar.bz2=0593e6b2091712c0222bd750b7b7490e7a227e43d307089f1383b1d888d67ca25080a9316ae3c253f4d7086510fbcdf3ea327fa8d942afde569041bfbaf1b18f
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.8/x86_64/ruby-2.1.3.tar.bz2=23c8d1410694d972495f9901c382fc43ac0963e18a42c8c39587f87936510feb9c9924796235187ef5b4379757d5ec096f8ccb24712b8834c98456361e4828db
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.8/x86_64/ruby-2.1.4.tar.bz2=35eaf6ede369260ae50d0f8d6fd05a68fe777d483cc8beab68f7d6e53d199d9c792148620b6ddf599e2021736eeda5e3cb8460f9c1d0e160cac21e7c9b32c178
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.8/x86_64/ruby-2.1.5.tar.bz2=58ad84de8ba3e991d0e9bf3629678f61c0f19c41aa064b4593571d5a935b0c995b4048b5d2b9cdd68a7e41f9be10ae89b0e03ed87b4fb06a64cfa9c4398214ec
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.8/x86_64/ruby-2.1.6.tar.bz2=e8c14032ffb23a952614a049f0f9115479b84c2d7ed6dffb0c918a6bfa67d1e313f2e36d426f18100b6a52d188d9e39f009d6cf0aaa91ab4e4ae3ca2b58d0ff9
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.8/x86_64/ruby-2.1.7.tar.bz2=e1198b86e3e14197447c1ac9c9b52b00dc3f0c2e07e99da2389894549af0907f28a8fc9b84ccda7b64a7b9d237567cd77de09846d0fa3539225ebbdc9c2c57ae
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.8/x86_64/ruby-2.2.0.tar.bz2=df6cc8de8fb27825e855943780fc8e3c586e1c462456fb448f0b2c2d75619b022848adf9bd1c134fa532575ad08ad8e4714e726424c2a192c14ea416236e4d3b
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.8/x86_64/ruby-2.2.1.tar.bz2=169bdc17ccffe0d7991e4c56d07e224b3207628109b614a4d96788524fb34a72c71e6f675eb23ddcb4b0c20f012460e95c0215e86b4e5a35351343fd1d1931cc
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.8/x86_64/ruby-2.2.2.tar.bz2=3a656bc64b42f43a922a0a93938e10055e93ed2157e23ab7dd1f54b21cec70263df74370edd314c946ac53eb6cda95a811a03b51985dc1447c8d71031afcab16
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.8/x86_64/ruby-2.2.3.tar.bz2=7a1f42721c3c3cdf7a0cdbcacd3151860127dd5aaaa8780880068c1cbbdbaeafa02c80160f0061fe88d8a93599796a52b8cc7981a6a21d786b31dcca5d2a4250
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.9/x86_64/ruby-2.0.0-p451.tar.bz2=e56a56b467157f6255b5a49d16ca658118bf2262c48d8f73a6facdf357a7c505ba20aea070843bd0c1110b54ef19324c23ea84939006a7de22597f48e32e6443
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.9/x86_64/ruby-2.0.0-p481.tar.bz2=54b0776e3bec895b90aceb61ab9ba1606e684a32508670a7a538ebbbaa4245fb49ac186241ccbee12542e0f40f99669b13992d708b79110a52f722ea42f8bd62
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.9/x86_64/ruby-2.0.0-p576.tar.bz2=a9063b6c3b7eeee9fc1a4fb871a5c7b2813712ecc4d52b117503678035a66274c743c42ec6ba9faebb40ec07548043b6091b285b9096c3701605fcbe8a935267
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.9/x86_64/ruby-2.0.0-p594.tar.bz2=8fb533f6fbb9e027aaf80a894528d88ef2c78139a0bf363a804db7cd9e0362899cbc436ce20b990e10779203bfbe11138438e571344dd9692ac04af7508f9c19
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.9/x86_64/ruby-2.0.0-p598.tar.bz2=5ba0fb1ae4765d05b1a1551f39c78819609e4975d4b1ebe26ecee4afcf893725095fe222e6a231222258fb20961feda4a257f06b3b37201aff5fc6ef59b86b95
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.9/x86_64/ruby-2.0.0-p643.tar.bz2=1e9a83c21cf7521ee25da2a5f239bc68e08ca6acc30c2a99dc2e2be8d5eaaaed13bb3e8d36982ff8dac880af7b598c503a93097adf726722e9f2f7dc9ce1c880
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.9/x86_64/ruby-2.0.0-p645.tar.bz2=81a70d35521fb52cc3e97aa4a4c5bd3f09733bc5caccb16d0ace6981afc4e89c553a657cf1e7d4d682d4b9014c1877975a6483cd076677ba6fd1ca651446ce39
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.9/x86_64/ruby-2.0.0-p647.tar.bz2=950ccc8b0898f9dc3339358affa67f97ddaa6c3e95bc5fcbeecb07206e5b45a25e509ea02eae6313707e63616e4e2f626474c0a7cc991ef9d928b5028e9b142d
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.9/x86_64/ruby-2.1.0.tar.bz2=fc9eb5367a7b44d0bdf5228222a1222fd4ac4dce1a234231294050fd4aa5eaf838d6d6d8c8cefa98cd52b83377219f52f51fd2a1084ff6e9e028ef392469fb21
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.9/x86_64/ruby-2.1.1.tar.bz2=027469cac8c866c80d7bd4e114cb514948c09f5a9bab186172f6d8c948b5aec440e7657dce3adb7cdb87ef5c76c606e7f4f75d1d0704c210d4467193a1f1d605
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.9/x86_64/ruby-2.1.2.tar.bz2=0593e6b2091712c0222bd750b7b7490e7a227e43d307089f1383b1d888d67ca25080a9316ae3c253f4d7086510fbcdf3ea327fa8d942afde569041bfbaf1b18f
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.9/x86_64/ruby-2.1.3.tar.bz2=23c8d1410694d972495f9901c382fc43ac0963e18a42c8c39587f87936510feb9c9924796235187ef5b4379757d5ec096f8ccb24712b8834c98456361e4828db
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.9/x86_64/ruby-2.1.4.tar.bz2=35eaf6ede369260ae50d0f8d6fd05a68fe777d483cc8beab68f7d6e53d199d9c792148620b6ddf599e2021736eeda5e3cb8460f9c1d0e160cac21e7c9b32c178
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.9/x86_64/ruby-2.1.5.tar.bz2=58ad84de8ba3e991d0e9bf3629678f61c0f19c41aa064b4593571d5a935b0c995b4048b5d2b9cdd68a7e41f9be10ae89b0e03ed87b4fb06a64cfa9c4398214ec
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.9/x86_64/ruby-2.1.6.tar.bz2=e8c14032ffb23a952614a049f0f9115479b84c2d7ed6dffb0c918a6bfa67d1e313f2e36d426f18100b6a52d188d9e39f009d6cf0aaa91ab4e4ae3ca2b58d0ff9
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.9/x86_64/ruby-2.1.7.tar.bz2=e1198b86e3e14197447c1ac9c9b52b00dc3f0c2e07e99da2389894549af0907f28a8fc9b84ccda7b64a7b9d237567cd77de09846d0fa3539225ebbdc9c2c57ae
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.9/x86_64/ruby-2.2.0.tar.bz2=df6cc8de8fb27825e855943780fc8e3c586e1c462456fb448f0b2c2d75619b022848adf9bd1c134fa532575ad08ad8e4714e726424c2a192c14ea416236e4d3b
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.9/x86_64/ruby-2.2.1.tar.bz2=169bdc17ccffe0d7991e4c56d07e224b3207628109b614a4d96788524fb34a72c71e6f675eb23ddcb4b0c20f012460e95c0215e86b4e5a35351343fd1d1931cc
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.9/x86_64/ruby-2.2.2.tar.bz2=3a656bc64b42f43a922a0a93938e10055e93ed2157e23ab7dd1f54b21cec70263df74370edd314c946ac53eb6cda95a811a03b51985dc1447c8d71031afcab16
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.9/x86_64/ruby-2.2.3.tar.bz2=7a1f42721c3c3cdf7a0cdbcacd3151860127dd5aaaa8780880068c1cbbdbaeafa02c80160f0061fe88d8a93599796a52b8cc7981a6a21d786b31dcca5d2a4250
https://rvm_io.global.ssl.fastly.net/binaries/oracle/7/x86_64/ruby-2.4.0.tar.bz2=91e34f1fc7a34ad182cd5e97f58e32c1d9ce83aa6513638f68abaf304dea74cb7ebd7812f7bafeb11a16be334d193e64cbbaf23bf424a5fce11962384eb9ba61
https://rvm_io.global.ssl.fastly.net/binaries/oracle/7/x86_64/ruby-2.4.1.tar.bz2=b6337cb1d902f3407ca45a0f145186115bef7329419cccd9462b2a1aaccbe80828510dbdd8e362e3d84067830c491af78559e09357f9ffdf5ddf404c10c73cfc
https://rvm_io.global.ssl.fastly.net/binaries/oracle/7/x86_64/ruby-2.4.2.tar.bz2=5c8dbbef50eddce5c7d52feba1f48a3c7b6c7d76b66af21df5df4fa8deb4fb496d65082d9983acb37231a371854d6f4af3929b49b2ba6c2e4a2f527eb04fe1dd
https://rvm_io.global.ssl.fastly.net/binaries/oracle/7/x86_64/ruby-2.4.3.tar.bz2=42237e7ea0c10050bb4faa940ab64da700a79e4b0115f2783d451952b6d87c19db92c502f0281502caa0e6f54319e4dc9956f2cb90b89776211e0c37fff3671a
https://rvm_io.global.ssl.fastly.net/binaries/oracle/7/x86_64/ruby-2.4.4.tar.bz2=78435976f97501e5b303ba80a62bb16359c4eb586d4052ad680af75ef42f2484be149baa6bdeaca95d69d22fa9ab7697f1a8e37a0276f6142a54377aa2f08765
https://rvm_io.global.ssl.fastly.net/binaries/oracle/7/x86_64/ruby-2.4.5.tar.bz2=86edc8e4330ec65df7fcfb7590db53edb93801377d72b35a6841e07a2bacec7207b2b440e599e43d6b9a66a6f8ee1c095e12ad0bbbd8cd831241cd411079dc15
https://rvm_io.global.ssl.fastly.net/binaries/oracle/7/x86_64/ruby-2.4.6.tar.bz2=a382bc4f6de9725990f540aef8139451feac06e1452abdd952c04b543f2a40d265b9df950311ef7e35c27abf3c140171c1eedf0690033ca5e44efeae65c27a8b
https://rvm_io.global.ssl.fastly.net/binaries/oracle/7/x86_64/ruby-2.4.7.tar.bz2=9a29d2b6a3adf2c08e5cdbe8fe384d618d830c344d3a10cc92f2cdb196ea2e8f6753b776f7554bfe9c4aa95b568363ef7849dbf4fc04e20f02eb8e758ae70fb6
https://rvm_io.global.ssl.fastly.net/binaries/oracle/7/x86_64/ruby-2.4.8.tar.bz2=ae71fac22d3d99ba49e6125949c61e31e409d1e6fcb648ebbb9b2690f0a2bd7eaa8415d3b17d224391acbc29669453e54b78a563592c3bc6df5a7e1fb05777b7
https://rvm_io.global.ssl.fastly.net/binaries/oracle/7/x86_64/ruby-2.4.9.tar.bz2=5f30821bbdca06bbd3f44126ba20d97234bcb10b94d041573bf15f6d967b18ea25e6e5c56f22b5faf6416ecde3cc9b33519610b1100919b78b382f7cccb82569
https://rvm_io.global.ssl.fastly.net/binaries/oracle/7/x86_64/ruby-2.4.10.tar.bz2=868c54be451154b82b6f4ec2ffb0070b7c899a88528b00b2b3bc6896b480d119b5393a055f8e4d0bebb7c5a73659b2cc7b5e1710fc5ee70b116bb8d43f107fe4
https://rvm_io.global.ssl.fastly.net/binaries/oracle/7/x86_64/ruby-2.5.0.tar.bz2=c4d10c5423dff521d1c0d25657a92933ee285c0ffca5af31713d591ba7d2457789f83988be04d3b88765ba7acb919580031b901ab390cf7bfec5cc477cc6cf0e
https://rvm_io.global.ssl.fastly.net/binaries/oracle/7/x86_64/ruby-2.5.1.tar.bz2=17df19aab57b55d543a3028163b5e4f2f3e5e6a9809e79dd0e9f8de1b6f18396cf963b5d193546fe5f58ba677c91adc129bc6922c0a7bd11c74e6bf90491e6e2
https://rvm_io.global.ssl.fastly.net/binaries/oracle/7/x86_64/ruby-2.5.2.tar.bz2=2917d9403c573b4a3d5063db71cf949321361921898e52231772a3e381231deb39d5b75da09a5c5a29d052f6c9bcbe3bb5b216de3bef293f0ca43c67f1e3dda5
https://rvm_io.global.ssl.fastly.net/binaries/oracle/7/x86_64/ruby-2.5.3.tar.bz2=9c12f7753e2068bb94ce79b1ec053f8a234db64d0ce42a1d84b076b6d52b7fb377c1ed7f0042990809fd7b435f703d57a42cc8de76192d79e858a18247a6c990
https://rvm_io.global.ssl.fastly.net/binaries/oracle/7/x86_64/ruby-2.5.4.tar.bz2=3f52b090320e7d72c27e7745cb20492ba6e119b186a1a540d5787774ce230a49281859e68bab2926ad325fabd7f3297a931ddf989972ef655d72cc46eb4b3680
https://rvm_io.global.ssl.fastly.net/binaries/oracle/7/x86_64/ruby-2.5.5.tar.bz2=e128ec63d26759953a8b01cc5569c4537d802a2fe971940e76671dc012bff1cbc378c2acbfeaa01c1bac596f999d577831ef2c37172d920ac9a2dd90a9e92f9e
https://rvm_io.global.ssl.fastly.net/binaries/oracle/7/x86_64/ruby-2.5.6.tar.bz2=12b44f6d7a011460025bc0386c40afdff65a3471fab6120cd3efe64aa424ba373f009ad9767b0729e35e534f671f7bf04f8ddfcadc9382fc7cd131dcdc0d82bc
https://rvm_io.global.ssl.fastly.net/binaries/oracle/7/x86_64/ruby-2.5.7.tar.bz2=55073ede1f99e620edd49b565555cd45d31e40bd2a314c7fd37fa834edb1ba617b98fe1a6ef1af71f8430830a99ff3357377be4297351f5cf9f238c1ac803395
https://rvm_io.global.ssl.fastly.net/binaries/oracle/7/x86_64/ruby-2.5.8.tar.bz2=197c7b91efa0cdb02144c6366f74d177f34baff19b8c78a7f34e93480152f67e1637309d93a83d950bbd16f44d4ce4365a02199152f7301a5774616e5ff7e655
https://rvm_io.global.ssl.fastly.net/binaries/oracle/7/x86_64/ruby-2.6.0.tar.bz2=d83d2d9f7bc1b18fb6d19baf38d7273c3758bc743939738bb6fc0becdf6aa8ffc79f9581605625aa41eae7f884b9c71f669598acd045ef6f302c4a5211325547
https://rvm_io.global.ssl.fastly.net/binaries/oracle/7/x86_64/ruby-2.6.1.tar.bz2=ece6c1900ea425a331e359c06f7299f15d03c16d7c2177dd0437b71070ac9aa40ff8611c04b9c0859d85bbd4387e42722b632c5ac09d88ed82ec4fa636f244a0
https://rvm_io.global.ssl.fastly.net/binaries/oracle/7/x86_64/ruby-2.6.2.tar.bz2=a744d7788f79e5ba730476ccd14a1372f2f69195207f4faa98b084bcd96095242af9bfa63ffab9d4576e4229cd1674b258bc29a17e186154efc56a855ae82179
https://rvm_io.global.ssl.fastly.net/binaries/oracle/7/x86_64/ruby-2.6.3.tar.bz2=b56e4571b4b3d5f443975a400f501e87de2187f66a018c2f9c231a743b9fdd174ae3046630229b8d8f2d1dc0ff36a60aa6d228ca9f37f5320f020d930afab634
https://rvm_io.global.ssl.fastly.net/binaries/oracle/7/x86_64/ruby-2.6.4.tar.bz2=68a7752f44e61056deea4756a18d9f5ff5f9c47bc11423ffdb148f177db42c089191baddb935fe238d774e5c1f03b1d2572162d18e71ed1461d2043ba2f60eb7
https://rvm_io.global.ssl.fastly.net/binaries/oracle/7/x86_64/ruby-2.6.5.tar.bz2=f971b472c50d94e86d756d492db9d97ba81202763163f53afa34891995880d890534192f9ccc3f2fc0115804af2f8539da4cf3bdb64cd7e690262d467988d513
https://rvm_io.global.ssl.fastly.net/binaries/oracle/7/x86_64/ruby-2.6.6.tar.bz2=80d8610328dffc028e443a5a882dd77132c2c539965fcf03b905194c662f26c7dea52491306789ae6e9ffc382f909302b1e6e295f8bdf490ff06b1a7e29f26f0
https://rvm_io.global.ssl.fastly.net/binaries/oracle/7/x86_64/ruby-2.7.0.tar.bz2=30b1ffde1f4c47bdf0edfd0da4a059b14daa882f1b9948575cf7f99ede6dce98250443c86155c07e84ad6531d5b34b397392584e1d2fc86f44f1bc74cfda703f
https://rvm_io.global.ssl.fastly.net/binaries/oracle/7/x86_64/ruby-2.7.1.tar.bz2=660547030b0dd4a3c454dacc37a12d06d2d8da279bb1a0a77d696ea56e51ab344fd56a0ae71daf49a80989fdef3c8280023edcdeecd01507176e44814dbc6b9d
https://rvm_io.global.ssl.fastly.net/binaries/oracle/7/x86_64/ruby-2.7.2.tar.bz2=19f9801bb3b325c8d850c7fa7fe10b23fbd219ed0e2fcdb014f1df2f5da4504f06b2f581d3a79efa524755612afd1478e16fe35416cfdca761177d8ef31a18f1
https://rvm_io.global.ssl.fastly.net/binaries/oracle/7/x86_64/ruby-3.0.0-preview1.tar.bz2=e456da0dfa5f1cf1495193680dffa1b470a706425e56df0d8532fc995432bdaaef9f9ba6b04de88603b11156f094d16128e22b05b6e1bbb0cec4679e112b572f
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.10/x86_64/ruby-2.0.0-p451.tar.bz2=e56a56b467157f6255b5a49d16ca658118bf2262c48d8f73a6facdf357a7c505ba20aea070843bd0c1110b54ef19324c23ea84939006a7de22597f48e32e6443
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.10/x86_64/ruby-2.0.0-p481.tar.bz2=54b0776e3bec895b90aceb61ab9ba1606e684a32508670a7a538ebbbaa4245fb49ac186241ccbee12542e0f40f99669b13992d708b79110a52f722ea42f8bd62
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.10/x86_64/ruby-2.0.0-p576.tar.bz2=a9063b6c3b7eeee9fc1a4fb871a5c7b2813712ecc4d52b117503678035a66274c743c42ec6ba9faebb40ec07548043b6091b285b9096c3701605fcbe8a935267
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.10/x86_64/ruby-2.0.0-p594.tar.bz2=8fb533f6fbb9e027aaf80a894528d88ef2c78139a0bf363a804db7cd9e0362899cbc436ce20b990e10779203bfbe11138438e571344dd9692ac04af7508f9c19
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.10/x86_64/ruby-2.0.0-p598.tar.bz2=5ba0fb1ae4765d05b1a1551f39c78819609e4975d4b1ebe26ecee4afcf893725095fe222e6a231222258fb20961feda4a257f06b3b37201aff5fc6ef59b86b95
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.10/x86_64/ruby-2.0.0-p643.tar.bz2=1e9a83c21cf7521ee25da2a5f239bc68e08ca6acc30c2a99dc2e2be8d5eaaaed13bb3e8d36982ff8dac880af7b598c503a93097adf726722e9f2f7dc9ce1c880
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.10/x86_64/ruby-2.0.0-p645.tar.bz2=81a70d35521fb52cc3e97aa4a4c5bd3f09733bc5caccb16d0ace6981afc4e89c553a657cf1e7d4d682d4b9014c1877975a6483cd076677ba6fd1ca651446ce39
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.10/x86_64/ruby-2.0.0-p647.tar.bz2=950ccc8b0898f9dc3339358affa67f97ddaa6c3e95bc5fcbeecb07206e5b45a25e509ea02eae6313707e63616e4e2f626474c0a7cc991ef9d928b5028e9b142d
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.10/x86_64/ruby-2.1.0.tar.bz2=fc9eb5367a7b44d0bdf5228222a1222fd4ac4dce1a234231294050fd4aa5eaf838d6d6d8c8cefa98cd52b83377219f52f51fd2a1084ff6e9e028ef392469fb21
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.10/x86_64/ruby-2.1.1.tar.bz2=027469cac8c866c80d7bd4e114cb514948c09f5a9bab186172f6d8c948b5aec440e7657dce3adb7cdb87ef5c76c606e7f4f75d1d0704c210d4467193a1f1d605
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.10/x86_64/ruby-2.1.2.tar.bz2=0593e6b2091712c0222bd750b7b7490e7a227e43d307089f1383b1d888d67ca25080a9316ae3c253f4d7086510fbcdf3ea327fa8d942afde569041bfbaf1b18f
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.10/x86_64/ruby-2.1.3.tar.bz2=23c8d1410694d972495f9901c382fc43ac0963e18a42c8c39587f87936510feb9c9924796235187ef5b4379757d5ec096f8ccb24712b8834c98456361e4828db
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.10/x86_64/ruby-2.1.4.tar.bz2=35eaf6ede369260ae50d0f8d6fd05a68fe777d483cc8beab68f7d6e53d199d9c792148620b6ddf599e2021736eeda5e3cb8460f9c1d0e160cac21e7c9b32c178
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.10/x86_64/ruby-2.1.5.tar.bz2=58ad84de8ba3e991d0e9bf3629678f61c0f19c41aa064b4593571d5a935b0c995b4048b5d2b9cdd68a7e41f9be10ae89b0e03ed87b4fb06a64cfa9c4398214ec
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.10/x86_64/ruby-2.1.6.tar.bz2=e8c14032ffb23a952614a049f0f9115479b84c2d7ed6dffb0c918a6bfa67d1e313f2e36d426f18100b6a52d188d9e39f009d6cf0aaa91ab4e4ae3ca2b58d0ff9
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.10/x86_64/ruby-2.1.7.tar.bz2=e1198b86e3e14197447c1ac9c9b52b00dc3f0c2e07e99da2389894549af0907f28a8fc9b84ccda7b64a7b9d237567cd77de09846d0fa3539225ebbdc9c2c57ae
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.10/x86_64/ruby-2.2.0.tar.bz2=df6cc8de8fb27825e855943780fc8e3c586e1c462456fb448f0b2c2d75619b022848adf9bd1c134fa532575ad08ad8e4714e726424c2a192c14ea416236e4d3b
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.10/x86_64/ruby-2.2.1.tar.bz2=169bdc17ccffe0d7991e4c56d07e224b3207628109b614a4d96788524fb34a72c71e6f675eb23ddcb4b0c20f012460e95c0215e86b4e5a35351343fd1d1931cc
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.10/x86_64/ruby-2.2.2.tar.bz2=3a656bc64b42f43a922a0a93938e10055e93ed2157e23ab7dd1f54b21cec70263df74370edd314c946ac53eb6cda95a811a03b51985dc1447c8d71031afcab16
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.10/x86_64/ruby-2.2.3.tar.bz2=7a1f42721c3c3cdf7a0cdbcacd3151860127dd5aaaa8780880068c1cbbdbaeafa02c80160f0061fe88d8a93599796a52b8cc7981a6a21d786b31dcca5d2a4250
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.11/x86_64/ruby-2.0.0-p451.tar.bz2=e56a56b467157f6255b5a49d16ca658118bf2262c48d8f73a6facdf357a7c505ba20aea070843bd0c1110b54ef19324c23ea84939006a7de22597f48e32e6443
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.11/x86_64/ruby-2.0.0-p481.tar.bz2=54b0776e3bec895b90aceb61ab9ba1606e684a32508670a7a538ebbbaa4245fb49ac186241ccbee12542e0f40f99669b13992d708b79110a52f722ea42f8bd62
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.11/x86_64/ruby-2.0.0-p576.tar.bz2=a9063b6c3b7eeee9fc1a4fb871a5c7b2813712ecc4d52b117503678035a66274c743c42ec6ba9faebb40ec07548043b6091b285b9096c3701605fcbe8a935267
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.11/x86_64/ruby-2.0.0-p594.tar.bz2=8fb533f6fbb9e027aaf80a894528d88ef2c78139a0bf363a804db7cd9e0362899cbc436ce20b990e10779203bfbe11138438e571344dd9692ac04af7508f9c19
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.11/x86_64/ruby-2.0.0-p598.tar.bz2=5ba0fb1ae4765d05b1a1551f39c78819609e4975d4b1ebe26ecee4afcf893725095fe222e6a231222258fb20961feda4a257f06b3b37201aff5fc6ef59b86b95
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.11/x86_64/ruby-2.0.0-p643.tar.bz2=1e9a83c21cf7521ee25da2a5f239bc68e08ca6acc30c2a99dc2e2be8d5eaaaed13bb3e8d36982ff8dac880af7b598c503a93097adf726722e9f2f7dc9ce1c880
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.11/x86_64/ruby-2.0.0-p645.tar.bz2=81a70d35521fb52cc3e97aa4a4c5bd3f09733bc5caccb16d0ace6981afc4e89c553a657cf1e7d4d682d4b9014c1877975a6483cd076677ba6fd1ca651446ce39
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.11/x86_64/ruby-2.0.0-p647.tar.bz2=950ccc8b0898f9dc3339358affa67f97ddaa6c3e95bc5fcbeecb07206e5b45a25e509ea02eae6313707e63616e4e2f626474c0a7cc991ef9d928b5028e9b142d
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.11/x86_64/ruby-2.0.0-p648.tar.bz2=489fcc942a3bcf7cf4e793b7f98bdbda1de081da2e027bcf4788430600bd73c0a0b448f5bdd96323a4cf824b6d4c759a7d45df50ac9cca86b9c791132c2699a1
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.11/x86_64/ruby-2.1.0.tar.bz2=fc9eb5367a7b44d0bdf5228222a1222fd4ac4dce1a234231294050fd4aa5eaf838d6d6d8c8cefa98cd52b83377219f52f51fd2a1084ff6e9e028ef392469fb21
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.11/x86_64/ruby-2.1.1.tar.bz2=027469cac8c866c80d7bd4e114cb514948c09f5a9bab186172f6d8c948b5aec440e7657dce3adb7cdb87ef5c76c606e7f4f75d1d0704c210d4467193a1f1d605
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.11/x86_64/ruby-2.1.2.tar.bz2=0593e6b2091712c0222bd750b7b7490e7a227e43d307089f1383b1d888d67ca25080a9316ae3c253f4d7086510fbcdf3ea327fa8d942afde569041bfbaf1b18f
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.11/x86_64/ruby-2.1.3.tar.bz2=23c8d1410694d972495f9901c382fc43ac0963e18a42c8c39587f87936510feb9c9924796235187ef5b4379757d5ec096f8ccb24712b8834c98456361e4828db
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.11/x86_64/ruby-2.1.4.tar.bz2=35eaf6ede369260ae50d0f8d6fd05a68fe777d483cc8beab68f7d6e53d199d9c792148620b6ddf599e2021736eeda5e3cb8460f9c1d0e160cac21e7c9b32c178
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.11/x86_64/ruby-2.1.5.tar.bz2=58ad84de8ba3e991d0e9bf3629678f61c0f19c41aa064b4593571d5a935b0c995b4048b5d2b9cdd68a7e41f9be10ae89b0e03ed87b4fb06a64cfa9c4398214ec
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.11/x86_64/ruby-2.1.6.tar.bz2=e8c14032ffb23a952614a049f0f9115479b84c2d7ed6dffb0c918a6bfa67d1e313f2e36d426f18100b6a52d188d9e39f009d6cf0aaa91ab4e4ae3ca2b58d0ff9
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.11/x86_64/ruby-2.1.7.tar.bz2=e1198b86e3e14197447c1ac9c9b52b00dc3f0c2e07e99da2389894549af0907f28a8fc9b84ccda7b64a7b9d237567cd77de09846d0fa3539225ebbdc9c2c57ae
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.11/x86_64/ruby-2.1.8.tar.bz2=0237f5377cbae4e055cc37dbfc9b14600a52a1598a5d06aed84968e28d7e3b365d767c1a13ae76bffde09e8259aaa96e6e6b1757b720f4bbcaf970fa1a4a447a
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.11/x86_64/ruby-2.1.9.tar.bz2=afa5f69786a9dfc8127046f6bedf5bf52e2cb272e643374d91e080d6662f7af57411d62a1594ff2f081a614ad160e28c825c416a70aca346df1e8fa1b9007e18
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.11/x86_64/ruby-2.1.10.tar.bz2=347472d568d7cc4fee04435ba7a2166761d0d7414605879226f125982c7f0f1176b32db8088b90a8dc0acdb59d722a8715bc52e5ad913ec45538199fca0622e4
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.11/x86_64/ruby-2.2.0.tar.bz2=df6cc8de8fb27825e855943780fc8e3c586e1c462456fb448f0b2c2d75619b022848adf9bd1c134fa532575ad08ad8e4714e726424c2a192c14ea416236e4d3b
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.11/x86_64/ruby-2.2.1.tar.bz2=169bdc17ccffe0d7991e4c56d07e224b3207628109b614a4d96788524fb34a72c71e6f675eb23ddcb4b0c20f012460e95c0215e86b4e5a35351343fd1d1931cc
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.11/x86_64/ruby-2.2.2.tar.bz2=3a656bc64b42f43a922a0a93938e10055e93ed2157e23ab7dd1f54b21cec70263df74370edd314c946ac53eb6cda95a811a03b51985dc1447c8d71031afcab16
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.11/x86_64/ruby-2.2.3.tar.bz2=7a1f42721c3c3cdf7a0cdbcacd3151860127dd5aaaa8780880068c1cbbdbaeafa02c80160f0061fe88d8a93599796a52b8cc7981a6a21d786b31dcca5d2a4250
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.11/x86_64/ruby-2.2.4.tar.bz2=c11cc579541a7b685d97f4eb9f99eddca746dc0aa5f50308763d2649b0a3b459e4e6dfffd1bc881741f0636c3e1d0988e476d93b06c6b8a25fcc30bb98a34044
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.11/x86_64/ruby-2.2.5.tar.bz2=04340d3ceb20558c3022431a8d348768fb7e3e63544966e4f93c450a674ba7e40f86e5232057f580ac9a9d30d6a6abdf51a60316ec33f8f2e2dd9e9fc0d22d22
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.12/x86_64/ruby-2.0.0-p451.tar.bz2=e56a56b467157f6255b5a49d16ca658118bf2262c48d8f73a6facdf357a7c505ba20aea070843bd0c1110b54ef19324c23ea84939006a7de22597f48e32e6443
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.12/x86_64/ruby-2.0.0-p481.tar.bz2=54b0776e3bec895b90aceb61ab9ba1606e684a32508670a7a538ebbbaa4245fb49ac186241ccbee12542e0f40f99669b13992d708b79110a52f722ea42f8bd62
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.12/x86_64/ruby-2.0.0-p576.tar.bz2=a9063b6c3b7eeee9fc1a4fb871a5c7b2813712ecc4d52b117503678035a66274c743c42ec6ba9faebb40ec07548043b6091b285b9096c3701605fcbe8a935267
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.12/x86_64/ruby-2.0.0-p594.tar.bz2=8fb533f6fbb9e027aaf80a894528d88ef2c78139a0bf363a804db7cd9e0362899cbc436ce20b990e10779203bfbe11138438e571344dd9692ac04af7508f9c19
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.12/x86_64/ruby-2.0.0-p598.tar.bz2=5ba0fb1ae4765d05b1a1551f39c78819609e4975d4b1ebe26ecee4afcf893725095fe222e6a231222258fb20961feda4a257f06b3b37201aff5fc6ef59b86b95
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.12/x86_64/ruby-2.0.0-p643.tar.bz2=1e9a83c21cf7521ee25da2a5f239bc68e08ca6acc30c2a99dc2e2be8d5eaaaed13bb3e8d36982ff8dac880af7b598c503a93097adf726722e9f2f7dc9ce1c880
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.12/x86_64/ruby-2.0.0-p645.tar.bz2=81a70d35521fb52cc3e97aa4a4c5bd3f09733bc5caccb16d0ace6981afc4e89c553a657cf1e7d4d682d4b9014c1877975a6483cd076677ba6fd1ca651446ce39
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.12/x86_64/ruby-2.0.0-p647.tar.bz2=950ccc8b0898f9dc3339358affa67f97ddaa6c3e95bc5fcbeecb07206e5b45a25e509ea02eae6313707e63616e4e2f626474c0a7cc991ef9d928b5028e9b142d
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.12/x86_64/ruby-2.1.0.tar.bz2=fc9eb5367a7b44d0bdf5228222a1222fd4ac4dce1a234231294050fd4aa5eaf838d6d6d8c8cefa98cd52b83377219f52f51fd2a1084ff6e9e028ef392469fb21
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.12/x86_64/ruby-2.1.1.tar.bz2=027469cac8c866c80d7bd4e114cb514948c09f5a9bab186172f6d8c948b5aec440e7657dce3adb7cdb87ef5c76c606e7f4f75d1d0704c210d4467193a1f1d605
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.12/x86_64/ruby-2.1.2.tar.bz2=0593e6b2091712c0222bd750b7b7490e7a227e43d307089f1383b1d888d67ca25080a9316ae3c253f4d7086510fbcdf3ea327fa8d942afde569041bfbaf1b18f
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.12/x86_64/ruby-2.1.3.tar.bz2=23c8d1410694d972495f9901c382fc43ac0963e18a42c8c39587f87936510feb9c9924796235187ef5b4379757d5ec096f8ccb24712b8834c98456361e4828db
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.12/x86_64/ruby-2.1.4.tar.bz2=35eaf6ede369260ae50d0f8d6fd05a68fe777d483cc8beab68f7d6e53d199d9c792148620b6ddf599e2021736eeda5e3cb8460f9c1d0e160cac21e7c9b32c178
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.12/x86_64/ruby-2.1.5.tar.bz2=58ad84de8ba3e991d0e9bf3629678f61c0f19c41aa064b4593571d5a935b0c995b4048b5d2b9cdd68a7e41f9be10ae89b0e03ed87b4fb06a64cfa9c4398214ec
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.12/x86_64/ruby-2.1.6.tar.bz2=e8c14032ffb23a952614a049f0f9115479b84c2d7ed6dffb0c918a6bfa67d1e313f2e36d426f18100b6a52d188d9e39f009d6cf0aaa91ab4e4ae3ca2b58d0ff9
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.12/x86_64/ruby-2.1.7.tar.bz2=e1198b86e3e14197447c1ac9c9b52b00dc3f0c2e07e99da2389894549af0907f28a8fc9b84ccda7b64a7b9d237567cd77de09846d0fa3539225ebbdc9c2c57ae
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.12/x86_64/ruby-2.2.0.tar.bz2=df6cc8de8fb27825e855943780fc8e3c586e1c462456fb448f0b2c2d75619b022848adf9bd1c134fa532575ad08ad8e4714e726424c2a192c14ea416236e4d3b
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.12/x86_64/ruby-2.2.1.tar.bz2=169bdc17ccffe0d7991e4c56d07e224b3207628109b614a4d96788524fb34a72c71e6f675eb23ddcb4b0c20f012460e95c0215e86b4e5a35351343fd1d1931cc
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.12/x86_64/ruby-2.2.2.tar.bz2=3a656bc64b42f43a922a0a93938e10055e93ed2157e23ab7dd1f54b21cec70263df74370edd314c946ac53eb6cda95a811a03b51985dc1447c8d71031afcab16
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.12/x86_64/ruby-2.2.3.tar.bz2=7a1f42721c3c3cdf7a0cdbcacd3151860127dd5aaaa8780880068c1cbbdbaeafa02c80160f0061fe88d8a93599796a52b8cc7981a6a21d786b31dcca5d2a4250
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.12/x86_64/ruby-2.2.5.tar.bz2=57dd15b2dd14cf2708fac6f78e865d8798e5a70452aa17baa8ead228cd14fe28667e7b15a2892e7c43dbca4eeb1e52eed5d564c5bd8ae4ec6372c3c1843fa714
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/10.04/i386/ruby-1.9.3-p194.tar.bz2=ec402709e69439c3064d57f677446ee090b235484a80245e819993595e55ff3a065ae47fd70cc765ace6edb522ad5477b7f494e0f6443e0ebcdae6e78cfd97bc
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/10.04/i386/ruby-1.9.3-p286.tar.bz2=beebce0b101b693c7b077cfd3f070df93fa7b494c70fdc2c9a3d7dcc5f65d0029944f1c7a7083fcb0371a93ff71aeb9dae9ea51595bfec40a9364c33d487d282
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/10.04/i386/ruby-1.9.3-p327.tar.bz2=64000a391027fedfac806aa4817a8e4ad625e9641efc625da4270c59955ef91f74806e143af33086f24510b8ede527fac98430ba8a1e90aae631451b1dd92ff4
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/10.04/i386/ruby-1.9.3-p362.tar.bz2=9bca59f0bc404ef79e250d2208769826284460f0257ff1a06976cc0654da6e17b8db5d8cd48703135068f8b53502173b62718777f92724407b44640c9290c45a
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/10.04/i386/ruby-1.9.3-p374.tar.bz2=6110b46165a79298db1923915890d4382985a6d14bee6b8ee8d9773ade7214695c3af46d558b454cc41f923cf839435aec8cf81104f8c58f7e81b7593a0bc0a5
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/10.04/i386/ruby-1.9.3-p392.tar.bz2=eb6cf0583c450241cb56bdef5fce1b9c483779a1ab78ef3714f040e9d0aa8de4a00b0dbd3034e650783db683b90970c3058da6bcc76970749fbb817b99571847
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/10.04/i386/ruby-1.9.3-p429.tar.bz2=9b53873bed0d02718d0be0b6e992eb8db675c79e628d2d2d957046b2aa48a2d410c51f137151f55b8574a0ba4e10ddf7b02784b0d352de202eecf31f30284cee
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/10.04/i386/ruby-1.9.3-p448.tar.bz2=842f73a5cc8e04e9efdb743c93ef8faa54bc87b66ea2b6b3f121738323de7434a59d26723fa0a7044c3d300dc86c2598ccf2295446323b89a6b5198a9cd928ce
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/10.04/i386/ruby-1.9.3-p484.tar.bz2=13e8f2c7b1dd3f35b56cd7087e7a713a738676ec4badb70ba7409be2fd99aed9fb264d6bc749c9f78308ac619c2a4900902fa0fd70a32cc3167fab4d1b2b9d23
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/10.04/i386/ruby-1.9.3-p545.tar.bz2=d226b6365df54bc5b356a85ae76dae96e18521f2958e873ebc268ff5048257146f415ce13d1a93cee666f7ba3d7557a234ffd468eeab57015335b52d1475140b
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/10.04/i386/ruby-1.9.3-p547.tar.bz2=5b4cb043973735b8fd0fde30a652e2efa1747d75de59ce9beaffc58bd4e2fe1ce57d5647e8d0bf2accfff900beec5521ba701ae8cae23bc01bb6b17d61c72f06
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/10.04/i386/ruby-1.9.3-p551.tar.bz2=5b667c4191475d023af8cd863f565a5f6c74644cfc7241683ea1a98bdf39679f740196a1d186d0935f4269926e4583557ef394298994dcc9099000c118d01d27
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/10.04/i386/ruby-2.0.0-p0.tar.bz2=1eeb92edd5f05fa2a693c46bedd477084a8360c61dc26cdc63d871caa2983525b79dfc00cb0b0f8c2cf6d1d9ae18d0b73a25252b6e0c724018a8a7a414b60e71
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/10.04/i386/ruby-2.0.0-p195.tar.bz2=7a02e49c43fef2aa241c01985d676cb11eb1134050ec87e4c6ac98d75b0e04407627d8374dd528fc2575405c552080995ce0e69dfebfadf3bf1166713ed4da88
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/10.04/i386/ruby-2.0.0-p247.tar.bz2=92274d11815e19eccb4b3c39ce7e0abadb21162e53ff1148719ca5b0ee6a5fa231afab6a1aaddab5b0ac31ff5e342a255b1fad2a548e7ecae60b2bca03fe8e11
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/10.04/i386/ruby-2.0.0-p353.tar.bz2=e6e1767c977f334bcccd27085ed409259365c0e5c5fb518f4560fbea7aa2500681456b1d8a8b47fdcca9b1f798b65f193a9f7ca1fa4ac5f950a68c556014919d
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/10.04/i386/ruby-2.0.0-p451.tar.bz2=14cbfeb44f60beb05eb0edfb8ec72fc38cb255783199353fc4a3d6f153264e3def4f23e2eac26125b461ab971b99fc5a9d6d420d1395c84dcdd476b706f34b76
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/10.04/i386/ruby-2.0.0-p481.tar.bz2=1ae4b07609e959359fa2475be7648d809637de9da9f3552e8a66754d34f94450cfec39713c7b0cb8ac0db2f2cc966e98668235dc568118d547b3f6122e1b89aa
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/10.04/i386/ruby-2.0.0-p576.tar.bz2=e24be4452fee764e49681ff72cc7affeac191400a52cef05fd41931413f652101c7128dd2cf4faec2d840400f3fde22b85d567ead0a1dfd45517ad3c1f96bf2a
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/10.04/i386/ruby-2.0.0-p598.tar.bz2=1e75da56bc9e92c4f6b772ed9818c59c72c524097af9bd2f5820793dcfa83d3b233f85c0ee296be784d701f88f90e880bd9e823d304152e828ed189c7f9dedca
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/10.04/i386/ruby-2.1.0.tar.bz2=5e4805e1efcea1ecede50336da6a94b429b6c78268137ad07803cbf5e3af24eb7efdd9e5e998b3aed3ed0548a69792e7f484ca630cc62f774c4e95334d23ec5e
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/10.04/i386/ruby-2.1.1.tar.bz2=66bc7897bc8a05071d6939763e2d160f91056882233448264096cac4431f3e1e0656f3e48b5e60bcb7efb1efb8730db64192cdf945b7a36092a4482ff065c37c
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/10.04/i386/ruby-2.1.2.tar.bz2=05ac266ce91940d027c6e8ecb4c045165af5bc3069bfb213c74a9d139ed365f756c52b8a1fdccdeb48fcb875aba99fcb744380a9c856dcc251f65e2efdf674d0
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/10.04/i386/ruby-2.1.3.tar.bz2=2eea54602da08d250d71e12ac1fefb96b07f3de839dceeb2bfe18a290008a6b92219d257b63c1934c8729d9d3d85b74bd52dcd0eef5c5e4546e1a47d51468c40
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/10.04/i386/ruby-2.1.5.tar.bz2=1bc9ddc5e5c2e1a93ebefb5c82fd318f80c9d5da67c6834dfce6fb03209afe81542dec08b946cce4a2f95ad05fe98600c419cffc801cd9d1250268c9046d2c0e
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/10.04/i386/ruby-2.2.0.tar.bz2=a4880f1e822986ff63670f39e5f2970a1c1363ae91c0dcea3d47f0daa0d86d57202bf4fa92994ee32d60a6c9661b66c651c991df6d8e1316b16a0be44e025e82
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/10.04/i386/ruby-2.2.1.tar.bz2=951202e9a4fefdcc180d1673b3289f974928d4f72f1f75ff03cfbc443202bee95124f5549fc2df9af614012a4624d1ad0fcc20154e64181fefacf034ee8d7f6e
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/10.04/x86_64/ruby-1.9.3-p194.tar.bz2=cb917714ec1d666c2431f0cd9eee16f7fd0d2b45d01a297c7fb9e44a18ee48611ace2cde0cf9bc2de50326affdbe347ce5230fa8dddec0386d5a17ae80ead8b6
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/10.04/x86_64/ruby-1.9.3-p286.tar.bz2=35d5f129c5a0aaae7646e4bf6b689194f62e28efea9fb62f539ed2dafbd52834f30780a6116dc9ca278be068b4f9e169e29969373e4293499e03dc4771beab1e
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/10.04/x86_64/ruby-1.9.3-p327.tar.bz2=0205f41ab8935ec70362b953ac1bae3324317f6ab3d2f1f45fc49fc642775517623c79eea10b7a3bd91a01a319feba38950fdc01600b190f112aea78b3961f06
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/10.04/x86_64/ruby-1.9.3-p362.tar.bz2=6e446d34c2ee8141922fe17c226cdbe218983a0ee399f0b211866351002624b5c0ea7e2adc6002e35d8c446fdfe6f2cbccd6b08d904164d0a091612f76cb6f18
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/10.04/x86_64/ruby-1.9.3-p374.tar.bz2=02b3c22b2ce31b821dc324bbcaf3188803233498332fb48be929b46159219fcbb9ec0ec715e6342346019027f6d9c98da4d40681578cb86011ea9fac2d6683d6
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/10.04/x86_64/ruby-1.9.3-p392.tar.bz2=4780b7cfa49fc1789373b79234b18fb6c7488c30d2c8907d3e12ec08aa4e4c92636bee8c6d2a1a26f833e97d9ba66133e6cc4244ef6ca7659b2a5bf8b84f44e2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/10.04/x86_64/ruby-1.9.3-p429.tar.bz2=e4b3f9be1997a62720a9ea14aa7598c95feeef6e4f7cd076f8b3063acdf9ff0403ab0d3324b1729187228224d3eb6c4facc94aa787728dd21148ba0ba5f427bf
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/10.04/x86_64/ruby-1.9.3-p448.tar.bz2=9a84cd3293b6ffe27ff6a7d10059f82f96ab9193647c2a20fd4114615fb2d8594bc12b5e40e3c36aab28d16a0bba35e86752b501135a82e74a6eaa3b472d8f8f
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/10.04/x86_64/ruby-1.9.3-p484.tar.bz2=b95e81e9f1bebadb4d21db02b12f17aa3af1025b3d8f9526e889b1b3032f189bb65a7f3b2d02326d8abaa26d5a1d6884ef79fe959fe350e566950dfabb470579
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/10.04/x86_64/ruby-1.9.3-p545.tar.bz2=82af8465671af0bfa4accac469dad51bf4cde92a63e07b1ae00d30485380e458ecd0fdaed7e72fec9e542cf3acefdd4771cba5b2577dbb6254ad00faa1691a97
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/10.04/x86_64/ruby-1.9.3-p547.tar.bz2=aee222096a4df97ba0cccad8eb34cdfd5e90cb77916abcdcb09266080317860c2193284e6f68765d7d23671ce46794d4d6a56804b93ae40a79dea310caee9079
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/10.04/x86_64/ruby-1.9.3-p551.tar.bz2=9eff0d8d6a6249bf64b7f72c3adf2fb7be94dda6a314a368a62a885d60beb3870734592f31547229e12a40bcef5128d21d6a8dc9e564225f0a2b42b7b714ee3f
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/10.04/x86_64/ruby-2.0.0-p0.tar.bz2=dd40aa67becf040c87f093118d39090390fdb20618d66de28ac17cedb75bbfb0ab4e6a87552ef82e9cc0afc34b3d8cc51bd8b77c7348030b21998ec0af7146ec
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/10.04/x86_64/ruby-2.0.0-p195.tar.bz2=d73999318cc26887e4b71b36fbb0c427e46fa81119ace23e810f19810154b2c1286671cba4c4a71ceb3c8fc4040bead648ed84623bb217693811592ea72ee691
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/10.04/x86_64/ruby-2.0.0-p247.tar.bz2=98a85e1ea27057ce31680f22641fb6b07694a6d90e68f87b0a99eb225f5b061daac7797c2b1356f4671cfac1c58199f92ddf8690e369d2effa25d685022af5ba
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/10.04/x86_64/ruby-2.0.0-p353.tar.bz2=d8be66f0be167e7b8bb7ff1c551a1ae6e438cb56436258bd887293320d9c925e9a7866bf7d89fdbf45bb936226599116402ce89260b1998aab022854ae6913ec
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/10.04/x86_64/ruby-2.0.0-p451.tar.bz2=b85a4cf9f30d3f8e0bd369f8c6c4a12182473b2f1e74f6f325f8f2c09534029f25c6e7c1b1d9ccd0141c0d4fd71e1b95d4dfe2efd816ed4126b664b6daf138ea
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/10.04/x86_64/ruby-2.0.0-p481.tar.bz2=74df44a16e9b5644337d01ebcc6a0e47b370c92c752ec33b74af43befa8c089d28295f27e0ab10a0cf2dab64135ec77624663d4dce76c3d2e0f3932f2fa37259
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/10.04/x86_64/ruby-2.0.0-p576.tar.bz2=5a102ef456de2718b015dd2810aaaab14d7d860bf8c6ad497c46987f76b8d1334d73ecde49b75b93fa238527e61d6dcaa2b24fa48959080144dfdb69fe84621a
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/10.04/x86_64/ruby-2.0.0-p598.tar.bz2=6a1aa2ada9143df7757fb283e006ff6612b1deef2942ae458b41baf4537554a906e3bdc0808bf1ba0de0f7ad73baba99da682bb8204144357dfa6143eca194bf
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/10.04/x86_64/ruby-2.1.0.tar.bz2=5e985f874885debde4959a819662e14df5270552a547d455c9537edc6802f090393d151159292223c5c634e423994886f9f0b898d21b78c5dc14c2fc0fbc7b5d
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/10.04/x86_64/ruby-2.1.1.tar.bz2=38da271ad70700babfd9fe30b39477097761291d1d77c37045323a14d96aa667d30208dba0d3e6b05de8da74c9cb2e8da1e773df87b0c70bbae07ddd6eb2d9d7
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/10.04/x86_64/ruby-2.1.2.tar.bz2=6564f954859bdd5c11d3e2b021b95edae718c81a565b3a7c654c90de5fb9f17285c8b794f468e56f6ce020cb776ccf865a118df43249911eaec70d58d1993cd0
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/10.04/x86_64/ruby-2.1.3.tar.bz2=2bfdff11fdd09c5e78824445fd12a8b958e8655237b3604c0b762b5782445805b37efbaaa08fe297b011d4c3671dda0083816eeb364bd71cbce1d370ce223681
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/10.04/x86_64/ruby-2.1.5.tar.bz2=4ea0214e0b7419fe1c9f8111c88e9182dc1baa894af89531f3f4130121b40421e8bd9319a8daa4af002d7bd73bbcca6a994dd5c40eef45934e37a4458dc84f30
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/10.04/x86_64/ruby-2.2.0.tar.bz2=26b5215dd175b408549da2204ca8d22957c87b6972c814a86be160280091e93b9e81e10155543c8a9b7e6c9777022f59b80fcea5a139b9deaac478e794db1ed6
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/10.04/x86_64/ruby-2.2.1.tar.bz2=db4d1ebc449fe2f7632ca55833796983e44d2146f5ae1a834944ed6ae54b8e9e44f8f2a9a998c1b6add6e75121cf30a8783f57a5168c7ec570efa189af918a81
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/11.10/x86_64/ruby-1.9.3-p194.tar.bz2=6ca4101373a9ba4b4f5da9c3f13d3991b528d31a54047b0bcd68866bf7c7e0df49d98f321226f63927bcd52e1f4b49f6018c68bb18395abf575a7d47b2ce8fbc
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/11.10/x86_64/ruby-1.9.3-p286.tar.bz2=0a1f46ce1f675b1b8c37de93066caf93b9e525f6f8f62af2c912226d0eefd56e53a8fab1d6a482b9d50b38f31d1eb36994ac2de735f5d323564dd24addd716bb
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/11.10/x86_64/ruby-1.9.3-p327.tar.bz2=fe261dcfed03499c4535f6f1408e5a7deecff02fff893b88cc688569e02f35dfa1b3f6d0ebb424d6045eaa4838a580c8cc49294e4b3baf265f255bcf78222fb0
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/11.10/x86_64/ruby-1.9.3-p362.tar.bz2=65ce2247eef29c6d10245b16a568c3be5b2a0b29c7b42597a1e807359190644e30485a11b34f37e6f1c5e99aad7751df9e6116ac36b0364ff17015864a57445d
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/11.10/x86_64/ruby-1.9.3-p374.tar.bz2=677f55ae51facf85b3cc53b375242eaeff64e23fb8280c0e31e87ed8d35c8f2d02689bcc5b3eedb27c6f7b78925598a8f7d5ab9c8d50a665ae88cfd25fb2f282
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/11.10/x86_64/ruby-1.9.3-p392.tar.bz2=70761c618b21b8e1a3ec3ac1bc9397888a2f785ed9aca49574b609e20b1d6a4b02d67706c0e537cec580f9dbf0e46c39a2e91dbd1d9a4481d712c51cfa04a6e5
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/11.10/x86_64/ruby-2.0.0-p0.tar.bz2=4d6aeee4ef89cbb8476df65803080fbc88b062269f9872eba13b743a3e55620ba07f8fa58dafa1b11ec1b4de3389ccc4956fc92da6561bd6cf90cd5a27f542a0
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.04/i386/ruby-1.9.3-p194.tar.bz2=ef03f832f8296d9b2d8b6c93eb0fdf8cf3d2408772082e6ec02a7da8a9ae10574cfaf7105b123cf480cfcad4bbffc86f4fb8f91e88b8a1da0e3541420e1915c1
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.04/i386/ruby-1.9.3-p286.tar.bz2=ac056fe566f275681f8403f027c16f80070be5889c7d4f93fcc6b81bb22c5faf7e7d90ff833cc4ee43bfca28b1f19946a5fcf5218777fc1c4e44c288460daf0f
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.04/i386/ruby-1.9.3-p327.tar.bz2=e01bad5804713b767798bdf8213d081488957ee037992786d2a2e9b7b5a5455c7d8355fb4045fa5d34e82d0c90049ff29e0af80aa12d7599e6be8866e6af3de8
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.04/i386/ruby-1.9.3-p362.tar.bz2=df05056ae1d37798485c965429e23ecc03e828549ca198b7b627f70170e24970237280a1e3bcb1c23c056008ca1e814b8af77415b3d3f3f7ed0706513b6dfd83
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.04/i386/ruby-1.9.3-p374.tar.bz2=b5932a68e2189f4d661fcb086e12e46f1059e2ed719fe238869c7a22170daefef979710e99d64a920b375fa96af7c6d24089140d839e5ef0bd2662a74b4f5a12
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.04/i386/ruby-1.9.3-p392.tar.bz2=d4b1402009fb78c6a24a7ca89709ecd97dbb064a134adbd8534b4fdddce38f4dd4d8e79fd584e84eb9f4b13c17a5b4d88eeb90a7e356ee1bda440455b04588b8
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.04/i386/ruby-1.9.3-p429.tar.bz2=3abce0071a4b6976e405c959a7ffddb42ea0e190a054e8447b0aa18f414c3f0d0c8b90bb4c888c0b65042c895f34c2c161170258f757829bff9f5bbb920ac129
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.04/i386/ruby-1.9.3-p448.tar.bz2=92d4a3049783ea9b80bf3f514e13a7f9b64e54df65364d213ed2318ccaecdc97ec9120af452593cb722f3208e0d24843ff8700d5282993e2a9c8ce6392f22058
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.04/i386/ruby-1.9.3-p484.tar.bz2=d9eca92a0a63403500344d23b5ab4bfd2c6204ded09f7ee48b8a24080a591c1ee134b32b4a29799cab118008d180787dc59c6682c97b3537f4ac35f17e7ac7ed
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.04/i386/ruby-1.9.3-p545.tar.bz2=977997ca087074ddd3fcb3d98e49f042a22fa98e40d1ef6f9260ed1278a2e556a30d024019d7215cebcc0e246b9a90d9c4b58e465dff4364d8a1c5363fc77817
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.04/i386/ruby-1.9.3-p547.tar.bz2=cc7fad07712ca8744dc3338559922156fb3c0fff12b0dc5485624532a3af025282422478ac5befe14d5c6eee7104f2f6e5fd8a6e49eb0994dd68d1ed51feb535
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.04/i386/ruby-1.9.3-p551.tar.bz2=1d4e920b488492f11a07ce30bc97ef80a7dd41e477a9ec1dbde35e53327da1307b6fe2240232ee3b3713dff06f4b0b5a651fe7f710731d9c4f576402e85800e4
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.04/i386/ruby-2.0.0-p0.tar.bz2=7cefb5471a7d2167d75fe03b596ff5f518d2e6ce7bc885ed6eb1c2cfa522d0bc81b2706dbacdab75c29771aa6d47d512a7def29db9f9cb842cfcfadfa255e0cd
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.04/i386/ruby-2.0.0-p195.tar.bz2=ae3a1c97fa71c8d812664f1ec38cdb21b01db813c98253ebc4e2636d54266a48717bae7f1a510dc5e1a645879d6214b7bbbadc40585752c2ae3975492bc19eca
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.04/i386/ruby-2.0.0-p247.tar.bz2=710a3cc5273a0d92acbd59a2bc6e5075a4db4a93651dc93a09ea936b8116e1ca6bd9e60cce5ccbbcb4a2157bb3fe0ebe77cab5f607ee6c99730e4cfce0af232e
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.04/i386/ruby-2.0.0-p353.tar.bz2=830d7a50104fde2e8a0c2d8bf04428fb961a7212414d8d75b0d917e333a14f5452ca35f96516d8e240da9f553bdce8720036bdf4b554ea06b35c0ad29b0acb94
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.04/i386/ruby-2.0.0-p451.tar.bz2=0ae998adea0f58b436093468ee69a0a2cd3b9d619dfbf4fbaccb47659281471e88ba22b5c6832408ec8ba731fe52715d560a203de899a01c600ffc5a0a62d947
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.04/i386/ruby-2.0.0-p481.tar.bz2=e958f89bf5be6ad6e293951f7e09567471db8303226c589e8e9b744dda9f29d57f7e2728699ee615c14b23acd75a82d347c9141ff0e3e3af3cb06c0ae982e818
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.04/i386/ruby-2.0.0-p576.tar.bz2=a596d9e3828df17c84e3bfd84c5418df67266ccb2c587b31dfc8d98eed7182c0324d37fa07ab8748801c9d190beb3b145302fbdb307969261fb6009594ded134
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.04/i386/ruby-2.0.0-p598.tar.bz2=e6a1ca2291f3c8618d475c1943be1adac4c245a394e60733fec55637e9f91d036b2add8084a021d222a283a36db9fcbcbb853426399bba4bf71015ee7c4c3a03
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.04/i386/ruby-2.1.0.tar.bz2=56fffc5b857b1cfe91d1f8a4914005428f9ef23bff68b46667d89f7f825f037c2e5d5cb6a14c62c1350e9c9dc6b8e5147f2fed66a1e099fced2364aba0ea570c
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.04/i386/ruby-2.1.1.tar.bz2=671699a89352dae148114fad949e22146d520aad479d808c175b9e00429da6e3fbaff7c7a1a500caea67570f2d55d78d9e13ce0adbd48308853432e69833b5da
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.04/i386/ruby-2.1.2.tar.bz2=829fe891145409f46a0d591a6097107c57765383119346cce4395faa89bb836f206925175ffd8a6610d88e9dbd34a227e0563553574b41b15d59631dbdc189ac
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.04/i386/ruby-2.1.3.tar.bz2=f4855902901a5e5b14d3acb8cc64e248338d8fc38ea69c94c61c6c9d7c4ce28a43efd29cc23bb4612c9bb8ee1426f7a3d0c19cdd903d0b4a78b59babeb2f8532
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.04/i386/ruby-2.1.5.tar.bz2=1a21ed9a4f0e22b9a74f8675b89ea986caf6b1c589b66d2186e58e6c61f6497003574830a109e4d172fe6632d8975e107a6aeea99f8c348686e6126c047c13ba
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.04/i386/ruby-2.2.0.tar.bz2=8694ee79a7cc43041bf5e89b84fb6c4a31c8ccab3e2e2075eaaa5da19f022d0f59d3e0f22235047d06c6b97425dafa3bf2777610ebad21742a4ab6432ed410c7
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.04/i386/ruby-2.2.1.tar.bz2=3ccd3dc48a49dc68620e720db38c5acc78f877e7592ed47b498e6847f1aee05436c7815496d151c5dd50fddafdc18158689efdb0f21bf54deef71a0e20142c97
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.04/x86_64/ruby-1.9.3-p194.tar.bz2=a237d43509cfa02da5adac04e34e973b31959b2cca86980cad03f4abcb106e181d3d795ba5396ba0b646c69206b0e0f5c313dba4348ea6e9e186080145dede75
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.04/x86_64/ruby-1.9.3-p286.tar.bz2=779aff6af688367ad444dca85c6e8cba136216b2bc5d53a2c4fbde25fe516fcb6aa493223bde7f1e38a926c9007a8581772314eb838d51001748bb5901b07432
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.04/x86_64/ruby-1.9.3-p327.tar.bz2=f6d679733f05153b99d4595c474ffbadd331f9e9955294f8a80525bd0c7da75e5f801a410aecb7ed60a526fa92f08119a6896693f81b9bdef4a9087e53f01dfb
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.04/x86_64/ruby-1.9.3-p362.tar.bz2=91fc7ffdfa279f74d0c5fe8f2ce7f1a9b1cfa3c607f9bbc67f15e834cacec1c8267f9e96a71dc92fd65387ac9374445da1a1a375762cb2d9329c02c5ea68c657
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.04/x86_64/ruby-1.9.3-p374.tar.bz2=4e41ed0ebd7e92fd3028dfbaa89351a0a53b10bcdbe980552b7446f299e692a05a02d2f2ac0dd476e71df6f1c1184f8df369ece906750ae98bf7b920a0ac8b4a
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.04/x86_64/ruby-1.9.3-p392.tar.bz2=65c7ea838862659c3e8fc83a5be86e6eb9b8354ac515d2295e331d35c4de6655ef2e69a55b55bab0bd875220e797ff8ebd290c0fee77c4b63f1b77bca677ec7d
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.04/x86_64/ruby-1.9.3-p429.tar.bz2=cc8c855c0feb72e94dfccffdea592954df4864d307aa254542fff545ff668dce65f2d857b7ef3bc33cbd73ab66dcfb03ba6e2306573412cff6663a442dfcdb3c
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.04/x86_64/ruby-1.9.3-p448.tar.bz2=1e4b11137bf43f9138d5a1b0174e8c1158b54385bbcd320f3b704144bfcd7e491b4496c3ea99c21535d662eb24f5ec4b398e54fd22a574dc1210a1d3518b82e8
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.04/x86_64/ruby-1.9.3-p484.tar.bz2=979e06d9a61fda73fb6aed553beadf59de4f3fff4341bb4d8c0eea3e8f608e46a7a0485893f89a2b86d9ae0c65276930a361096c31facc4a527248163d286f22
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.04/x86_64/ruby-1.9.3-p547.tar.bz2=80ecc7ac49b6c37168bbd6d0e34fa64ea8c494dd483d5c4dae5ab9de6184d70e819a0c4af500d069994a548239eb0f02cd746cd88bb1d02cf9bdc124ae51d783
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.04/x86_64/ruby-1.9.3-p551.tar.bz2=33f3be658fa2edcd0465bd33b6dcec07f5e869e53e5efadecdaa5c600070887a9bc96d83e389e54a4f620c644357f53622168d26d1239d5183217642897e9429
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.04/x86_64/ruby-2.0.0-p0.tar.bz2=7bc8993f3650158a61fe7dae473780ecb384efa268bcba75b4c368aab34b6ec59d37c751687b7df10750ebc88af392502577c36fb0a06f66de7d8a1727062672
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.04/x86_64/ruby-2.0.0-p195.tar.bz2=766b4cc8c0aa109f0ba09284eadc8db46ed657b9363b575433fbc0262b99e415471d663765527eff7ee28e04809978cfe2185f7733411bf9e0e71f5be33b6c21
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.04/x86_64/ruby-2.0.0-p247.tar.bz2=f114fc3bf9c311b4650c8b1843f1873e733dc047a13fea862989692f09c766be26a986e9f146c9c2709ee9efc3b85ca055a7f292162ce081cf01668592427870
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.04/x86_64/ruby-2.0.0-p353.tar.bz2=e066218d19314307fad17165e68b9d2388ae0e9dad03a37b8485db8c6cd8d512f378491032c07c0818d532ede45ea6803cd0bd00b4b6e8586ecb5f5452aff138
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.04/x86_64/ruby-2.0.0-p481.tar.bz2=13675ab2c2707672fb7668fbd8d2010aa563488c037cd84f72a5388e9d5f99a431ce7f50d08945d8db413bb5ca7b20bfd313aa1504fb9467d21a26c1e2a16194
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.04/x86_64/ruby-2.0.0-p576.tar.bz2=3e63c3d8d918f80d5138228905abf00f28ed2376b5dca8a1fb59a7201acca9da2b7e9e695fd2fe0f0390f301359480ef2c0c23bdbe9fecdfc78cfeac5ef1e855
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.04/x86_64/ruby-2.0.0-p598.tar.bz2=b9559370f2a1e17c96492144eb3e47b981606b9e41855b1a0b86ff3f96691b4a693b834baa6430147755ae60a9f43e4671e1e8931b6521d70c3f081aae6bf9ca
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.04/x86_64/ruby-2.1.0.tar.bz2=58f301ab3ab95ad9f2efa16e4922c9e8ee3e22a31a01051d31d5704a46cc736b26bb9eb55a62b309908ea497199240c5f139b1acaf1cbc3a23b2c6e28e2c4fb9
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.04/x86_64/ruby-2.1.2.tar.bz2=40871f37c5b6b17354a5fca17c9035817c2021896a9d49a93c12046cc28bc6a5aafcbcaedb69504f7e837e2f628a25f827245c13f3c00c88bed5a5137fe8f210
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.04/x86_64/ruby-2.1.3.tar.bz2=850506e7d9cc14772730445e7a60eca00142ece55faea48d34e26654360050cc4b18cc4074948e6e3eb907004e2a7e69d59878767ff4c6bc9642e6f226ae703f
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.04/x86_64/ruby-2.1.5.tar.bz2=0ff649a9a06909c2cde1bf1de0a48028fcb68a590baa7c0402a26f825ad8dfdb092312331f2ba65b2422d0610bb69032b4cc7660580df411343d0a5ea7591848
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.04/x86_64/ruby-2.2.0.tar.bz2=428be61f0bfba4c3ea22963fad95704a05829c608a40120938ce52da9e3e69428ae63f8065f4beb89a57231945a896a04ee0e2a8e70b8aeeeaea0cbaa551f108
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.04/x86_64/ruby-2.2.1.tar.bz2=612efb525cf243c46940ae9fdc149c4b5b71a18fbfaa704a927bb05a4a573ed807f9cc0c6360a296dad506b399c52bb63e51adae70c819769f85096c9fdfad17
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.04/x86_64/ruby-2.4.0.tar.bz2=2e9d991f8b10cf2a0ff8c783b43d6773473f949d7f8e66c45a172820332d65dc2204da1e965cb4327e8e30882b43a394b34aaff3816ac6224d59346976c2b18e
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.04/x86_64/ruby-2.4.1.tar.bz2=a4e41a355968d0cd42e04af2a7dfe961ce0d0689857a823366238187cd7a7023608cb0923e5bf6f7b734fe9ad5c8ee5e31637be4d225b2bb1428cac9099b4126
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.04/x86_64/ruby-2.4.2.tar.bz2=0380ac728c0a05d41d49bfeab7e9c66b5730487365ce785cc482475925d5cc4add9fc4078c25eed18c5a8deb28d5d1dd5c7c73f357c45e947520578407fbcddc
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.04/x86_64/ruby-2.4.3.tar.bz2=3729e9a99417d2d942fa70c77396bd56cfe434cfd881abae5a8ba2ebb7064c1ff218acfeb7415f6c55b2685f4fa413e3beef6cb3dc9f80cf73cbb2e3823c1c21
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.04/x86_64/ruby-2.4.4.tar.bz2=9ca7f42de4e36cb08f79e263ca0996f3e9e445cb04caeb786c673d7fb574337695968a0bdcee39c820d7eee46f6132cc9efe2d6642655993669ab28496a5ecfb
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.04/x86_64/ruby-2.4.5.tar.bz2=04ff6eebb3882f5eecd24c81256de025398feec8625e162896161834f6f17334b1cf9b76f093d3789f0c493373b2ffb1eb65cc0e0572be81bd6d2df4c6589ed9
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.04/x86_64/ruby-2.4.6.tar.bz2=9b58e0ef98ee4de423850248921673f6b36a20a1a7a123b033174a9dd6ef7e618ccce0d0dc9f5cab77e53b76aba56278f33f83d63b0fc40e839bb1633465fe1a
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.04/x86_64/ruby-2.4.7.tar.bz2=b71482e061f1d5ee011879b9d59c3b22c368ed0c6e30b56d2fb8c1a1dad48b7ceb8f2bb1f2b4d86370d503cfc1490034d0974b84df59ff5149f747f1019e1315
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.04/x86_64/ruby-2.4.8.tar.bz2=74f066487c1ef4486d860d1eaff6ceefe5fab3d407740324edb17f12c61ddd4e90e006ed4842243e218fdf4adc4cb77158eba976f81cf459e0dd28cfcca4cc3f
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.04/x86_64/ruby-2.4.9.tar.bz2=710c1cee3842df9feb5ead6ea30573d7ff29dfd077c78914491707afd3572c37698052688107b2eab0bb5368779e991fe820b4cb80abc11b4063e50faf0ff680
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.04/x86_64/ruby-2.4.10.tar.bz2=9931336979f6d07f89e147e306c50655b619d3625d3b70a4097bb3ed645906a5217fb77aa7824186c93fc87467c9203f03236aa080e8732b2dc484bdc289515a
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.04/x86_64/ruby-2.5.0.tar.bz2=856decc23a99b9edc721d79ddd4ad7a153be475be8486402936736cce8570fc3e9183e87553ce1eedc6880ac567d0a41b719acef516d54ba5896de4cadd59ee6
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.04/x86_64/ruby-2.5.1.tar.bz2=0acce307455c7befdfe24eb2841641a826ca436a6dd9ac970c99ed69cc1202651131a7200bf3c5c1f0802a1da266cd32eaf94cf93ef353a9257dcf5fedc85b2c
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.04/x86_64/ruby-2.5.2.tar.bz2=3cfa7d6bbdd5104575b9896f24d81c9a16a31f7782a6b516fa6c73374f44d160e02f32de20ab1aef2225b8aceaa56756f47d6266fb3ef0793918a488b13000ce
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.04/x86_64/ruby-2.5.3.tar.bz2=a64cbf0c237a13b44f583a1ea7e18c17a911dc2b4a8d1713aa8b0726a852677175588cd76c81bf30b46c426e5aaefa593400536b46388b61735e99c1beaf6b23
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.04/x86_64/ruby-2.5.4.tar.bz2=733d3a0e44b3f5e212bf7453727a79c77494489107f79f2146bfb6ca8a967f6908fe6f33f5e1c8f00d4e2cb1a44760c59ba53cfb5428c73fa82c54edb018b92b
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.04/x86_64/ruby-2.5.5.tar.bz2=d62274dc8ed208892ac97291129cc15662233cb5205b5303ada0fbb67ca2e833001cf1647b65c46ea9e6f5697e1b939addd22e1ebe666e7584c39e03e212ebec
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.04/x86_64/ruby-2.5.6.tar.bz2=94a12b8cfd70c41f5d1b12ef6cda08edfeb74901e14af141d277487046d49a5541f743ae68a9a861d81249d60aef50a7d963810f6964b933bde5136370f7488c
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.04/x86_64/ruby-2.5.7.tar.bz2=19dd3842a15d9dc7345a1bcdbe2e2ae1017694260427396e0b2610d10abe8f11621f5bf5792955d719f5f71b909913bb4c6a915ed7c8d893f4428807fd9385dc
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.04/x86_64/ruby-2.5.8.tar.bz2=0ff7116f2b863b31fe417c347c7903feabf799b3510e41e00cfb4fca6a50c1a47e8f390a617e3ae2d5b92d568f6434a2dc3d397cfed9e33a9073f3290fbab97c
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.04/x86_64/ruby-2.6.0.tar.bz2=180e80ae58e1b7b1a94c9fb7ac1f3994c10943f84a797fef82823e60be92d46d305ff30ab41fc59dfde5a4c942f5d4cde31eabf536910ea6dbc55dce931744b4
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.04/x86_64/ruby-2.6.1.tar.bz2=bb8aa78f260bdc0aae65934b97bb6b17e3d0b764adcf783f6ff90dd8157fd8d34652ec66b46421d3657d33f3f81b874b1615a21b733f8dd207e6e6140406dc6d
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.04/x86_64/ruby-2.6.2.tar.bz2=c830febb691dc0b92d431c71fe55c2dcf021466ee96ae41dbb2d86bd03ca938831708df50b65d90b625ba7e31ee1e886ca3962a743d4d57855c7b410a0d47397
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.04/x86_64/ruby-2.6.3.tar.bz2=d0a45e33f0d332451eae1ee48fd954a92d84129671bbe4abc09b3b8f63aeb1d1dc43cc790429f40f8fbdefe2ce7d2303618d3aae95713f9e8eed0eb561e80f88
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.04/x86_64/ruby-2.6.4.tar.bz2=043dd6bba9907ef2b2a3678ac7144ff948830b44c37bf313286fc6ae49ffce40cd5fe1995aa0c10479e62a5a6b4078b6dbb8bbff584584b8e61d81e7c5bf9ebb
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.04/x86_64/ruby-2.6.5.tar.bz2=b93c581cfc4a9ccb6a34245bdd84c8b3972ee5d65b2065432be7fbb0ccbf0171a4a0dadc9ae36cf8304a863974debe45b247ebf02c0556b23d84732e31aed0bf
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.04/x86_64/ruby-2.6.6.tar.bz2=4175f7f931a803393116e95944b777bd151ba61d3ce5911d8f61f8431b068cf64c1b83d6c8472d162bcd89419e21f90333717c58ea67b69184027af799b0f6b3
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.04/x86_64/ruby-2.7.0.tar.bz2=0f3a13cd62540e250daa43d44f97cd9d398ffbaa8fbb2fc23b45b2beed805c3d5b3ee3b3aa51f876314a7bc3445bf2c8660b3993d565b1525b26ae4f87d1cf4e
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.04/x86_64/ruby-2.7.1.tar.bz2=86363c8b0dde874552a0cdd2a73cbc6ea7e9d2461ac434bba67028d6c846d19bbb69efc4a2ea56c003d5f0bcf1da1fb2c5b8655e2c249321a2bbb92391ebee66
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.10/x86_64/ruby-1.9.3-p194.tar.bz2=b8b57644c56d64f1e1872dc55a5697976642d0ace802804784796c3e2c98c679109379f31a1692208fb316951fedf9e622f302643bc0c22fce7d697f3b544f47
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.10/x86_64/ruby-1.9.3-p286.tar.bz2=c0c581beca1df86d60e60b6c1b9b48ac6ff7ed156c0105f883535d2893f1fc97aa5eaca190493c610ef108c995c59f5830b4dfe0609900a9a13e285869b80fc6
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.10/x86_64/ruby-1.9.3-p327.tar.bz2=77e06e768cc56ec53e18798229ca17a3e7657c983ea9b854c08bc64ac66782515b74a08dd67bf826e528eb3d07c0d7bca16a88876996c58af8e0bf3d7fef840d
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.10/x86_64/ruby-1.9.3-p362.tar.bz2=e5ebe07cae1c455fa36a359c1ba16eecda736f7f3f585e5515270ca5ffa1f762079f7b2bfb3d36f93b9e663ce515c2b600e0a59993b0f2c7eab5ad05f405b637
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.10/x86_64/ruby-1.9.3-p374.tar.bz2=a08b0f359bd7a798ba93dacbf7c9b0f7e48a0cbe2f6b52f60916dd4c2cfe22c8bb49d3a690f77c1b2a61e140a4b2cde3890dbf6d24e79b54309862c0412f2949
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.10/x86_64/ruby-1.9.3-p392.tar.bz2=717643cdb0cc82d128c554d62202df6fae1b5cb843e262a0065ede5f4437f2661af0440364ef23fa7af78306248774210be906fde73f6543a405d46a87a119ea
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.10/x86_64/ruby-1.9.3-p429.tar.bz2=e119ab3404a9722ab79f613d1f8ca6eece16a35c8e56bd0a27b3192392be6cdf0674764674b96bd0315d23b89c39ca040cbc00a69a70e7cb22442ac689207daa
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.10/x86_64/ruby-1.9.3-p448.tar.bz2=8fac05050ca90daa53dd3c55595494193ef4309c3ac6dd91ff34ba21c3f3719d803c647b5b47945fd86f89c67cfdda8d435123c3e9f8430c901579f0a190c809
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.10/x86_64/ruby-1.9.3-p484.tar.bz2=8b87769f2f4a7d5f1b45c59bb8f2a5fefacaa4c5eab6ecdb4c1a58e2ce4814e87ab667aed7f1d64b135ce6f3f89dc207be6cc540c9fd9e2fe848b51e363b8722
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.10/x86_64/ruby-1.9.3-p545.tar.bz2=23185492c48096269e92af0928774234b275e179943171254b92ad27d68738370a7f61b44540b6b91fe42ce713d5e10c748d7a304f69fd6af0b5ee3c9f973954
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.10/x86_64/ruby-1.9.3-p547.tar.bz2=3d3dd4c440c32a46845f4dcbdc9e883f3a0ab204cb5e850242e95be1f529a8bce80f04a490df0cd6b03dc7129bc2ede42abe78d5c56725a7ebec475dfce144f5
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.10/x86_64/ruby-1.9.3-p551.tar.bz2=5a6b4e5fd9543547ba99c477b7466ec723c837efa56c9dfd7d5a0613c7464dfdab77f1e2da39974dbaac2a4df4f7162b86a2f956e8dbf40b02ea68fe6498e4be
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.10/x86_64/ruby-2.0.0-p0.tar.bz2=454d2830296c564c0a4564640f256b62d23743c48317e94a30270ccdebf350e3e51f74d846a1239dd09a45e5a8fdfd4ba468a8c6bdb899b1ab234869ba86a1e1
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.10/x86_64/ruby-2.0.0-p195.tar.bz2=8705eb748302b9a67fde63d8e62f89cd0696dd33bb1a31c42b401a7003a4f1fdfbc43461b1e5bf6abf12421c2e6696aaa0a9baec8bcdf27c380727a71329b2d7
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.10/x86_64/ruby-2.0.0-p247.tar.bz2=7bbf30ae8b6413e3f010abcad9446b77e62115e91bdc1a45aefb5aa28e6f1425d0103394a17e3dd6b4cd0a369037332d8972701850a18f2aaeb8be9448509e53
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.10/x86_64/ruby-2.0.0-p353.tar.bz2=46bd11ea6a0ec70ab232e2ce8fb74c6fecffb75aa487f60b784a1f4ba3a0f44143cee2589ac80256f88b2c59f1a99346929cd0a9452862fa4f1cea580b095f5a
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.10/x86_64/ruby-2.0.0-p451.tar.bz2=0c6794386c1daaff4e7b65dd77472e5a127e4920a0c35f4531fcd1f2f75fe935d0e30893c34119bdef4490354677156bc7ae58531494aff8012c658696be90aa
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.10/x86_64/ruby-2.0.0-p481.tar.bz2=f97f4e88d69acf22cbe8bb4253aeedd111e4bd481f2dd6405cc84afb8efe6394c8e4e136a0e02bf0c787c033790bcb292813e0349c4fa986775be2065f4a5245
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.10/x86_64/ruby-2.0.0-p576.tar.bz2=1fe66961e2a30eedc15100077d36a85fc22a40a6a1d268f69ceab05e7bdfb28b4bd45fc4264ce24a9827417f85d7de145e87a7f44c91d9b7858310eb39e25d8b
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.10/x86_64/ruby-2.0.0-p598.tar.bz2=a75e17ac79ab55834d0908e0f70e0ece24f0cbc4cfa187cb0f6244b1c7f609ca58f3c3d1d7a68e1a5dab0877d26449849fe7dbcd55f2091e8645e8bb8b6f50e3
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.10/x86_64/ruby-2.1.0.tar.bz2=b319514aa6ad2b3f60103b08deef4f8c68e909a44824314f390f66719dfc5d5bd4a122772869fcc7beeafa480b81147c9b339919234cbb73843c624093e9b4e8
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.10/x86_64/ruby-2.1.1.tar.bz2=97a71cd013c62679138f5fe5d93cae54e295e1b474afe46dcfa1809b4dba56f7f773eb689ca7b5c49a82dab4b41dc3cab973bbbcbb902d1ce664512593413bab
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.10/x86_64/ruby-2.1.2.tar.bz2=f760412e36216dfd1f975055f1f468df9cb0d36db3e7800bbb704d08c52db489bcb02313bc2c4e4ca73b410297dea350ef6340a824f177983e91f22f74c40acb
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.10/x86_64/ruby-2.1.3.tar.bz2=76979fd7e59ef26e95577806af15bf361f16244bae556baa8837ca4f48845682595c48e2159ae6629c043d74937eda19ac6987853bc8f0e40b3b22f111d8e349
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.10/x86_64/ruby-2.1.5.tar.bz2=fa03e3373fec43620f935aa60fd58251d8cd8b049a7580e8d14c779e2dc530befebc3b8a4e14928e2c0107bc8aad9a0817b4a5d75c2db43dfc3a7857dc655ccd
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/13.04/i386/ruby-1.9.3-p429.tar.bz2=a11f3f33aecc83bfa4bff2553bcd6bc6d8ecb23e8d49be5a6d3fdb77dde9e6ad2e0335a761b226d0915e078ff9789d296c7d6deafc5431e4ca5de0aa142af67f
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/13.04/i386/ruby-1.9.3-p448.tar.bz2=e72efca189137c8dc1eeb0a2ab09e0c305c5e8eaca81e9f755aa70d71ce5730d0a4e3806c96c9bdbe619fb13a0be3fd6c3721f7eb5f956533f0d8db6df001a67
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/13.04/i386/ruby-1.9.3-p484.tar.bz2=0ca2d928e760fe9f44c0c1ffe2ffda62bd443c8f291639dd2c68089686d4c062ae32153e0f38edef765cc68cf2a70ec2a7ecdb9f117c0f3fbf6268782ef4cafa
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/13.04/i386/ruby-1.9.3-p545.tar.bz2=cd6b71239333fa4b42dea290d277dc845b91f213060771afbf7b41a4914a7f5bb052eb8e34869bfa697eb76690975dbcf5ec24d47089192fac904cfec565ce03
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/13.04/i386/ruby-1.9.3-p547.tar.bz2=2ffb1cd6d30cc8df1f673b6368b3721dcf3b08c150a0bc50e7b2c2f9e860451c778b0ee5088e6f62afc741ebe9a0319479e62eed1ecc5f5c2fea2c4b8b1b0a09
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/13.04/i386/ruby-1.9.3-p551.tar.bz2=ea66bde1a7af3589c5f89d8f5b98ee4e4c9a4577c0d811f727e49cfe7d505b4ac9f6b6ef3dbb7f7438f97ebb9f073d9e1b7cc0e067f7f7abbd346ad50f3af29c
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/13.04/i386/ruby-2.0.0-p195.tar.bz2=8a5e9f863c063972ae6753e6adeed95d2e131aabca34b724fde507f1420cf4f052ed24510aa38e1d88a5079e3c34e3f4193a9a5eafd6360de05f82140e827b8f
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/13.04/i386/ruby-2.0.0-p247.tar.bz2=fbcdd746d82c0c52feeef7e520015b3692c436cf4d035469c0a673b48f55cab036903f9afdfe73a9b85d137952b8cd76d0c21d3c13fb51c282533287b2c413b5
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/13.04/i386/ruby-2.0.0-p353.tar.bz2=9733203b40e305e79103b82325652558c40dfcbfab61ebf088b6e5353bd7dd345f058d68cb019d8586fc04a072b285e962655166d1b86f1fd50d006d5af13917
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/13.04/i386/ruby-2.0.0-p451.tar.bz2=60b95d1c022f79bd591fcd857a3bd049a34fb41df0a9dc91300b57aa1c54d7367b7aa0a3a9e9f9ba8194d1791184156b73505170e17f12ea11068d35e2d85a12
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/13.04/i386/ruby-2.0.0-p481.tar.bz2=4d3959ba6b25dfddd900ca12a83d9358fe45f98e73c1330323d1933e4a76b4b108d1ea8965600ba88a0b99de243b6713132620c1017b8b14501ded4201237d59
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/13.04/i386/ruby-2.0.0-p576.tar.bz2=15437d579f26d64c254becc52a9c93d26208f3400396341dc4bae50a6a832fe5836765b8db59ddc69220a7d54585f83f055773915cdc5528e04ce1f65a7603cf
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/13.04/i386/ruby-2.0.0-p598.tar.bz2=f6a67ce770da6da636867a0dae365d2e1e0e203c28d8c01e0d3e44621e80fbea8bf7ab99b6c7a746c106758c794809ec161cceaee064f158493f0ce044edd466
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/13.04/i386/ruby-2.1.0.tar.bz2=ac6679ba6ec0f904169b36456d055fa0c2b7a7b81cb2f9defe2c494b9d5214bad430ada9b10d2d53d38fa2abd6b21e2031604c6952756bf8304a332f64269408
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/13.04/i386/ruby-2.1.1.tar.bz2=97f2da7c3239756c30310515cc219fb0dc06e2ceddfc1f9f22cc63c4944b822bc1e012a9c2daffde7c000b150825c49d35a50fc3051e72c68fa7b6db8fd2c944
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/13.04/i386/ruby-2.1.2.tar.bz2=e5d29e0f74a19cfda22c6af0df364d97e4541f68d90783775f1fa451f6b646cd6e72f4353247d4d58166bf26e9df51484a5e27d692da1c5b858cc08c48a357bc
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/13.04/i386/ruby-2.1.3.tar.bz2=f6f73134a1d8cb41f119c4903d7052b716c877b576493b5546624d20e36c4d2ce9c7adb23461ca72245c8ed2b4b041df347f2a099426682fa26363b4980e45e5
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/13.04/i386/ruby-2.1.5.tar.bz2=54676ae10d84d7ab68e54a54d72b997b58f4c26c0a8df4d163f4af5fa187847dc369308e87a40af94ad9bd1c2d850dd7f1ef6193af2b8d238ae8c6868f05026a
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/13.04/x86_64/ruby-1.9.3-p392.tar.bz2=de6f0d921359ef00be9e3e48843c6684ed05ad869472a2011dbc0592ec79ca820b9e0c56296dbe3a95d6cd7637265fa5ef09b62cc467fd043ed190a0e91be911
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/13.04/x86_64/ruby-1.9.3-p429.tar.bz2=95769da966a6efeda6c1d0f7d49a15b12b8dc609a255b6ad948435aec820081f326c7730fa84737a12bbfc06eda6e70b0f1615782c35b8a841662f9c5536b9c2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/13.04/x86_64/ruby-1.9.3-p448.tar.bz2=25a90df41057ca57ecba14d221cf62934b72e2a01da936ed09b678dc8394780c06e558d3f4af901917728d0e952f67e1905694f2db551b4d7e068e077329c777
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/13.04/x86_64/ruby-1.9.3-p484.tar.bz2=dc38f85007d02b4f1e0928ff181379dc0ad2bb85437432bf6ec84900bb58671f7491e005306edf323fbb2cb96b50096a6a9bafa22b8241156e73852574bf5dff
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/13.04/x86_64/ruby-1.9.3-p545.tar.bz2=b580f53ad8921c3343c5deed2466cbd8fcff2dcad79bbc73ea2e6821d2f82b0590db96be97b2af8a64376586270e188abb78f1255e0de3705f7f46635384cd2e
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/13.04/x86_64/ruby-1.9.3-p547.tar.bz2=6a23906f4f8dbf0d5dd3f1cb75a3e507b6b24c7fa195ab990ae8562ef5baed14c0ebb426bfe9a30ec9240c93142f654d1c7a7222484cc90e9ac46beec7400dec
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/13.04/x86_64/ruby-1.9.3-p551.tar.bz2=406f684011a4c5c0f09cb15036ccf16587f0c301db5812a531a9805142c1d16e5fdda4e76890d4dcc5d66ce193bfc938aa1362031df1636bf70c8266afa9f4cc
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/13.04/x86_64/ruby-2.0.0-p0.tar.bz2=5e5c1a774825d9b3ded77dec7786a622a737edbdf92a2f6f394755659682da717e62a252ff0afc105a2e46f7daa381c29db31c012aee826612de3fe177da1a14
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/13.04/x86_64/ruby-2.0.0-p195.tar.bz2=1119d79fdbb287e9678c87c2767407194c7f56842864639ba25f3eb3f62e17d4e4bc0959bbe180ff8dca16fc0561fed57c1d5cd9c90a63665cc406bf1de022cb
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/13.04/x86_64/ruby-2.0.0-p247.tar.bz2=76da8e68edabc7e68035e8cf38f031d19a80fee8e60a2790d0eb1cc625c6bd28a61228c70749bc539ede37af686b802cebf4437c4c0304133d3afdbf50b223a1
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/13.04/x86_64/ruby-2.0.0-p353.tar.bz2=603d0fef706f2da08216d00db9bc60116a7fa8883851ae180731af0f560887ffaf1520c324b283b98589cd7fff4f7318d6621d88b9383f3ab6daa4c61b4b380d
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/13.04/x86_64/ruby-2.0.0-p451.tar.bz2=33cc1db835f035a49a4e80169b77eedfa2ed05eca0be9217310882898e287f7e490c6c9eb747d2d8169acda4e3124ac726830a827cce989bc605d5c7787ba18c
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/13.04/x86_64/ruby-2.0.0-p481.tar.bz2=c677f565b206a087349e9a7993e67ec7d51537446fff6aa8395896a36e143e8f8337d224bb5509ac2f5ab7e0315e5448cf3f6d3e6ceca56b7a04361197fca373
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/13.04/x86_64/ruby-2.0.0-p576.tar.bz2=16148fa428b283ac9e7896b51b9808b766e449aad4c760a133f3cb48fe5d069606d877b5358dfdeb0b73e0650f08327396571eabaf56847751e9d41e8dd817d6
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/13.04/x86_64/ruby-2.0.0-p598.tar.bz2=1e4ccb5145dd0da35e45935d6d91392894caa42b2e8b1882cfa55f74c703635f3899eaa21630ce1d09cc1be75a3b635090a530179309890783ec2973442ad3f5
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/13.04/x86_64/ruby-2.1.0.tar.bz2=e8f8b17d094392db35eef0fe415d01393f0c98b30a93eb9d11306128aeacdcf2f713de33f1b8e0440dc7333e74530c78f49b43b1631683ef3601ba759aabff94
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/13.04/x86_64/ruby-2.1.1.tar.bz2=d3cde8ebc83b313a6915bc985d3ec4e8b4048b88f773f3af0be7a5c4bf597f9d2c5d18eba8b32bc3405b71d8c6e750a5bbde0df8c08febc5e3188820a5a5250f
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/13.04/x86_64/ruby-2.1.2.tar.bz2=8b390c19822164871f383b227444a407d2fcd42e799fdf67fda14c87dc9793646c7dc4b3903544179eb4d35355cfc101fd58ba02e52d005e9eeaf4c478e5e6c6
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/13.04/x86_64/ruby-2.1.3.tar.bz2=f5403bf4a9ec4321c248b78a37d178693eac383cabb1306b93a6c82070c54cb7afe4494e0c9be6914c57ec1126a182fc40e7011769395b1ba2cf5da1bf9d376c
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/13.04/x86_64/ruby-2.1.5.tar.bz2=e070cafb7e91d5af12ff9850109ca33d92343d5186f2beba9e88f87261c12345c435a540098c391a3a0b2f60386bce7b8790e158ece15e40adc53ac43431af8d
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/13.10/x86_64/ruby-1.9.3-p547.tar.bz2=f4a78a997ba011b115114c351217a440caf1bd136e5bd1f546e6a25791bf73e1b605d6915c991731f94284dbd360d9d9f67616cbfdc8d72cac284642813a8a8d
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/13.10/x86_64/ruby-1.9.3-p551.tar.bz2=9bba6d3d8631e57da6104a54c0d6f88ba3168db9c3124bc44c54e63ec6a2e13aec6844f6b15d89a5a454ba768f47a68946b9c99c6786811a2f319ed7167d981a
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/13.10/x86_64/ruby-2.0.0-p481.tar.bz2=b0144fc6b0a4e2b44a7df5a3159dc06aa0e9643a1458745c3c7f87f9eed34706ece8fcd0246e31d23f582701209ceb82b7c4da498946642cc03c9b7ac6ef2578
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/13.10/x86_64/ruby-2.0.0-p576.tar.bz2=70a52902245f45a5adcadbf6afa7eb7cef31ee1bdaf6822ec3434f3704530cffb2f51ae22e10751f8141f5053257a228e0b13e5e7c1a2469c21782e9038dd2ea
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/13.10/x86_64/ruby-2.0.0-p598.tar.bz2=41d720411d69192bfcffb262139aae1a6ec03855a87c84294cf33b11917ebf4a9c301be7bbde60febb633297441c97104a17717257ee8c51f36822177dd70a8f
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/13.10/x86_64/ruby-2.1.2.tar.bz2=04f47f7249a319d478216b3a125c6dfc44ea82733459cf68adb0c002e2300411fa9e7707db87695cfb1173e6bad1c416b9290b56a4b7c295ef85dd256078e9a2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/13.10/x86_64/ruby-2.1.3.tar.bz2=05492a1bee7678fd434faeb9a6e789e1c4f09abaf7d73873701de841909705932442f56a0ab578357339d2604b1c67caa0033f52547c199e256ac6ed2ba0e63a
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/13.10/x86_64/ruby-2.1.5.tar.bz2=eafb8f31d511f1bf2480ff86ec568164fde3725b4505f8a29cacc7ddbd2a0099bc63e4a3edcf7997b5bfba45008dc8b5a518e0722b3662db8dbf921050ef8f83
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/14.04/x86_64/ruby-1.9.3-p547.tar.bz2=bc5aa6d1008481309211ac003c043a0c2952cea5105c44954a5c3a51e02baad5f99f7f31a657815aeb1fe9212bd710ce632ca397d0a206d36711c02f9649a12b
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/14.04/x86_64/ruby-1.9.3-p551.tar.bz2=e8deb5060ebc85946d3b544efd50cb27c22ba2788b78dcec6d578e3db15388b934cf56a04a0201d6a36a67af011987b81dec3cd152fc2bcc7a89d346d3820f09
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/14.04/x86_64/ruby-2.0.0-p481.tar.bz2=5574a4dc2258580485fb34792a1ff103abaa3c8caceffc9cc4346c15e0e8dc40952df69371967b0cbff7147fef911cf446843b0422dcc75327ce63359d4b0762
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/14.04/x86_64/ruby-2.0.0-p576.tar.bz2=7d7756df55546489d9a0adb378ba5b5a96fc09a100ac2a6eaf9bdec76233929419cca493fb54378b31994576de5d2920a2c6dc7283669d976568a8580149837e
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/14.04/x86_64/ruby-2.0.0-p598.tar.bz2=dd40bb74fa1f2049c1f48080f0039d6c330b5c1bc0f0b8f8ad5e5d0d02fea93142d265a20bc35d35c409badea2719d6ad87eb82812e14bbcd131a9c60dbe5b74
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/14.04/x86_64/ruby-2.1.0.tar.bz2=c01621912baef4b506f51680a695c0e62c1eb872dc6d6c812ae1c954c3324f09a0fc4959cd48e3aa5c3e2f6be616d2e9f1377a8c3b65faa867ff40963afefbd9
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/14.04/x86_64/ruby-2.1.1.tar.bz2=e1a78226560f6a74aecfbfbe313a7c896949e9abb593291022f825698497add9ef2e2638063b9ae35da61b7be3ee3b19d24d8e00f4720e2597b69cfc892a5db0
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/14.04/x86_64/ruby-2.1.2.tar.bz2=b812765dd5fb38fc9896cab403a4db3ca2395e4e5451b18c7702a599c2a5a9bc42260e7c60a85cda14752646149397ca31698caff0c66ce883e67b8607f02380
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/14.04/x86_64/ruby-2.1.3.tar.bz2=e9469906cd1be856bd15f12280ffb3367c111dc76e95af592875bd82a5fd3e8d96a7a3108658d8181fceb13994835cbf9ebc8b7867d83c9a9c051832f97f7b0e
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/14.04/x86_64/ruby-2.1.4.tar.bz2=89b275b447ed17e537bc445e6f5d40a42a30448947e126b05a3572cae9089f49fe49d183739e25f1849a8a4b8213a985b774e49b108d093d1372b58d04d6b668
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/14.04/x86_64/ruby-2.1.5.tar.bz2=91216074cb5f66ef5e33d47e5d3410148cc672dc73cc0d9edff92e00d20c9973bec7ab21a3462ff4e9ff9b23eff952e83b51b96a3b11cb5c23be587046eb0c57
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/14.04/x86_64/ruby-2.1.6.tar.bz2=aa77949340fe77a51842244a4a5ef76890010844765bb2c3b5055cb42a97b6b963161fd0ba56ed831c78b3e28aa00ba21ae3f2301ecf98376ec9740152acc97e
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/14.04/x86_64/ruby-2.1.7.tar.bz2=7e32988985d72d90c286e1485f0f374f84637ff1257e42b8edad0c2411275235dffec2dbfde0e0966bbbb7316870e4569fcc347936ffd9956a6e93953a32df2a
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/14.04/x86_64/ruby-2.1.8.tar.bz2=32683629f0e0a7c42516f1dddf96ee4629d6680fb0cf3882ab733870816cb2271ada1673d4f9bc4815e19a0954e6d16fbe4928f23bf43ef1bba456982a072948
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/14.04/x86_64/ruby-2.1.9.tar.bz2=23f3f7717a6a45bb10d630aa54b8f4a30a22c75aa425121a624bfff853985a848dca7197d1b374201486a3b6c660e43d2d1180f32d436fd7778ef0fef867e8a7
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/14.04/x86_64/ruby-2.1.10.tar.bz2=395e305d28a396a8f925f5939bebecc9210c287e7734871d2c5c8de91455a2aa35b5f6af6348ced49e15331b8278359d9e5f3c05914cfafff8d9ea1ae47a35e2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/14.04/x86_64/ruby-2.2.0.tar.bz2=dc1c52ee9530308b450c3b8e29777fc7c761cf9ee8af6d9639fcfcfd85bd15db43e068da24786d1dee242c3adf170207cab5867a37d7c350dc99ced4e1346b22
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/14.04/x86_64/ruby-2.2.1.tar.bz2=cf685c425623e742a2ede15fb30ff96239620689e272d9d343b022d3718ad72d22cf8d9a5bf98ef7813db2aac63520494adf225c16d6d6cdb0cbf79fe823738b
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/14.04/x86_64/ruby-2.2.2.tar.bz2=13cfde1ece46ab9e4eef659d86775fe638acd619af54340f0ea87b38c421c1504f2d496975fcad161f86fd92089739e02499cdf4c588903521619587fede1aca
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/14.04/x86_64/ruby-2.2.3.tar.bz2=a4f3e98a692c26c0465de4751980b4b2c62e05fb45f576c9c61182ec95920b57da9a37e66b7f3372ddb43c4f0c479a3e1825d4f736fad3aba9f3e425f239f018
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/14.04/x86_64/ruby-2.2.4.tar.bz2=afa9e2a64312c00b844389bf07df36c190698bec0cba220ec2d2d76645f0f4e1ef918f883f13d8934ba1317032eb5de67f860e032084444275a2f9ed590cf9af
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/14.04/x86_64/ruby-2.2.5.tar.bz2=98c6011240ed91974fb1c2034765349edfbe78368320e8a1389cd61d213b27030016a9b61d0382531712972ed1c0902bc0c257bf3f03be98059823389a6a85d6
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/14.04/x86_64/ruby-2.2.6.tar.bz2=d18c7573368557d1efac9bbbc903ace65f687592e5c4b8e0a714f8ed1a38ab858ebce5b0c654a2f93df5220ad158b84db2ea9b51145ccea3fb99e01be74823fa
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/14.04/x86_64/ruby-2.2.7.tar.bz2=09f86bd32a0f389f82d730f5982f3f5187e15ebd0a2e24d0d13dd81db731780b9628d6d627d9dd844e670a8f6c3e257d905bda8e88d1be12080112b616cb01fd
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/14.04/x86_64/ruby-2.2.8.tar.bz2=9d102e335df58140dfbeb7c36f0a501aab21a278f66abb9dba8f04a9f10986fe683024a0b6c1297a7bd78bdf3bb989295bbc5fee912ddfdedc6b399a512dd4e7
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/14.04/x86_64/ruby-2.2.9.tar.bz2=579b2675fef10af3b716920c5a244c90b6c11ee02b7a6ec6c9629c55ceae701c31d64463fd5c2cb19246026b99117c2850f44b7cb92f92fe62b1401ef1f45ba8
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/14.04/x86_64/ruby-2.2.10.tar.bz2=0d84fce115d8b0ba01c6efb6a3be437c3d4488f97c677c1f10d86dcbb6a483005e691e5979b7efb4a81a32ceadb45abc50d3b24b31d4af1b05adac84e5c31e6a
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/14.04/x86_64/ruby-2.3.0.tar.bz2=4e3db4375906eecb03b4b67e890cc8e9e03a6e03f4eaffd0a83cf768259e57ed3c1b47cd9e70522b24ffb33c9f1462c807aa39f0b22c2c3f223fb58e383c33d6
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/14.04/x86_64/ruby-2.3.1.tar.bz2=df364b5a203e87a8865e30559df2146c14ebf3b7d25398a3ef0afbabcbbb31f256adbfa93cf254ab1b28107f20c1a2ce4d306f16326fd830d9f6a4081b4d4bbb
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/14.04/x86_64/ruby-2.3.2.tar.bz2=8c3ea77729c80d2748950c121db5e7c0480b36a7cf7c3b7a6e35f06baef53bf8a2bd636b82279c1b663d3a4fb8bc97e66a0d8d8021e89d41ae92275b4319e012
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/14.04/x86_64/ruby-2.3.3.tar.bz2=c107b3c8b3a66d9e7567f164aab5802a1ae5df1596d2dc24e3757f169a5cf891c129de3d067e1d29f70dd42f14fe1062b2b389808de602bd18f70f5d86f343d7
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/14.04/x86_64/ruby-2.3.4.tar.bz2=46661572fa38669c3f53272ed6082593e61baf48304280c2b91bd229293b6025c83bb0317677a681303c8e599acfab98a89064be2cb8aee3e2fb374d1f88a24b
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/14.04/x86_64/ruby-2.3.5.tar.bz2=cfcaf85acc96523e49455758510e0068800a5b819e74c26560960700e4ccdcf36c6e1b02e52366021f033eebd595427a9143c5a40c6fc8d20ea46a9e661b5afb
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/14.04/x86_64/ruby-2.3.6.tar.bz2=bc98a5a6e5842772034180bdd2c9d4afcb4062e626ba73035ab1df5158507b610f4d8a2a29d3a0588356f210624f678d025356e39efc1bde248f84028653a475
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/14.04/x86_64/ruby-2.3.7.tar.bz2=35adeed89fe33a8ab999d268622d5da431f0157570893f158abbed0f2384576243ab3faeeb0b4415168338a85d15c55ca69449b1c381d16efe59dcb3da624002
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/14.04/x86_64/ruby-2.3.8.tar.bz2=8010efdcbe8f3fcce9960ac7c8e748c7c1d4640b274300a684674899076751665f9724a185bf86b757359f13b9975db6bab14566091ea776b71acd6a2c30d7ec
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/14.04/x86_64/ruby-2.4.0.tar.bz2=66d7a19418a51585fc86ec032a6e9245d61669c013a8237b9025811e20b552871d3f585515da44e5c52d710254d3c2deafccb3e58c235c4792ac54f81a3862e7
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/14.04/x86_64/ruby-2.4.1.tar.bz2=7643447ed8d394e36f5756b7d7bfd054a102c7aefebb4bb001c2f7e585991ef0dfc77f6e83b86ba37e0c4efbb4700b6724f9ed56af19c77205988e1ada3c8ed9
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/14.04/x86_64/ruby-2.4.2.tar.bz2=82276c237dc3993d2da6ab08da636db43c9db5e4e23c28fdd47577e7c9087cfa88df1da3807a8e70c3eb8aff01a201ade41fea16a25fff61036b3a3d640b6ca6
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/14.04/x86_64/ruby-2.4.3.tar.bz2=ee23a8a3891fa3ad5de08b94850c6cfefc1ac5dcb10180dc9698f7de6c38f79cbde2c5ed894e36b4aca791850a25a712ccdbbe54b04d6da53bd8cc6f0934f9b4
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/14.04/x86_64/ruby-2.4.4.tar.bz2=a7450bb7b6db279d4ab13e4fe72e605c489ab3371a201d255fab6715a642d6d87e2103004592f23d695fa90942f651c3596aa1a6a0d77a7883ae884f9185524a
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/14.04/x86_64/ruby-2.4.5.tar.bz2=f28dcc7791c5abac9da90ff151f8af1cdb90fecce577c85738bd659ed0d5e02300fa1684871e21474c3aa6c060e245e5eee927f3ca66f2339ff80d263e7f4c69
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/14.04/x86_64/ruby-2.4.6.tar.bz2=d2a656f8ded181030221db631c81dc172eb4467b0c4dbaa8d7fd2159cea50c905af2ecc06ac7bf0e60148368639888c2311ba15feb6eaaeada71889e136ca701
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/14.04/x86_64/ruby-2.4.7.tar.bz2=6377bfc650eb93364c6cc3ef289b7e20f4c950611fcb1c6684543341ae68dcacff05ab97a1c16204e391893a3a473ba45a9fa069091077b441050d4630ab6395
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/14.04/x86_64/ruby-2.4.8.tar.bz2=75a38c62495be1cba3e97491cec07651b5067ae5083072a64c80946dfef9eb7acdd6fecf450f0ad84e000d085844ae8601d5a87c38e3169ed89eebeaf5ee5232
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/14.04/x86_64/ruby-2.4.9.tar.bz2=46287634441560e05311a6e127012872f0855019af02a3a96c33b3b80ba913070e45fe83b7f45851f048bc1a21831dbc93252c5bb97de427251868d7de415711
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/14.04/x86_64/ruby-2.4.10.tar.bz2=308a2d241211c2632eaf57c24accb1bf6ef292c732e7eb274ff56e176f5e8a326a8429aa2ef4e501ba5dca8412610f31f00efd90445f57dbf279fdb7fcd78c7a
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/14.04/x86_64/ruby-2.5.0.tar.bz2=398fd09ab52357bf5b927b158011b3ffe50b25244af6278a6d3f345c7007b7f84b6ce9f19b1bdf0a8ba7d0d1c0b84c2bb6c27ffea375875c242c108fe863c163
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/14.04/x86_64/ruby-2.5.1.tar.bz2=fa39af7f0012c3f5c534d5b2c612af22010b9004a4e10dd60a27bff9046351af427a6e8d49d8ffa003661ec875de9e2974c1eeeeae9f66d8eda74c03035308ae
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/14.04/x86_64/ruby-2.5.2.tar.bz2=3c246c39b8f1c4215ff1a8131a319500e7cc943dadd849ff50b14e5ab1f2214932dce2085e4112e36d522fe3d849b67816fdf993f4cf00b3c5cdb65c28f3cdbb
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/14.04/x86_64/ruby-2.5.3.tar.bz2=82dde569a2a53445dbbd5540b436de6cfa942b3b4f73fcd62ad480eafb3cfa2a89557a16f766fe3c030416e7a822e8bb0a487aeec2ae0b156de83790ef808b15
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/14.04/x86_64/ruby-2.5.4.tar.bz2=5a7d9673cf6512bd9856ceeefa325d9caa1f417f2fa2962ab45766f047c995d85c6dfea31c567a04f33cade3958a754e192b02e77bfd86fa004b245986b54431
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/14.04/x86_64/ruby-2.5.5.tar.bz2=012fe70a51e7464ed425197c16056a4785db889a9bad1ee9c8cf58487c37c4931dc9c697f2e0d79e36c01848e08c3680f4733c4b22c472264bd1554a92f36067
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/14.04/x86_64/ruby-2.5.6.tar.bz2=1217eb7ef34aed306d30227c972d89a0fce12bc384eaa595d0588a386f7234938b27a140d08936e630a7b29b6c270b793019b6498db5299b5442f0dec8b7674e
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/14.04/x86_64/ruby-2.5.7.tar.bz2=ec68ccbbc1115e0b28345d35ccce8906dec9b080fc38f7c4b3ffb965934e9b9a44053f42510fb62c265955bd2e6f97487265af9c3b2c2df1f8d6b71927e4c0cf
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/14.04/x86_64/ruby-2.5.8.tar.bz2=f37da2cc3ec6ecf231d399cb47ca6214b906ad3dd378a002ae6c6a2f05e76ac0b53307e3422ecf2847e925a90529f1b8ccfa6971221bb0414e12f3c40bdb06d6
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/14.04/x86_64/ruby-2.6.0.tar.bz2=418d71c7d0f89ca839e821f09e3a09d12bf9151d15cbd71c25547bd8781eec91ae50db6d1a778f82ee3c652fc24f7e147243e6fe68211b400e267933e2ca8ee6
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/14.04/x86_64/ruby-2.6.1.tar.bz2=2a638e167fb001693b8162aa17d6ec4419723f2735cbcd1b13b415283e6e8b3db5308e557d7f68d775a5e0b1db0e5d27ae84039bae76e7585ca92d2663b4ddd5
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/14.04/x86_64/ruby-2.6.2.tar.bz2=55473059823dee21b83ddd9a710dd2b5029d53139f7d623519eb339d21e39d342d4a3464f3dafe9989cb5ff3e70fe9edb9b0c4fd6c6aa7b104cc0ce5c9359786
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/14.04/x86_64/ruby-2.6.3.tar.bz2=598b667cc912cb5efdbbf8f684f9400bb099c86b19c5bcb96e0d15aabf1867243ca8b738f43eb6bf8188d031dd72f97a01632974213b75204126bcb0d25544f4
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/14.04/x86_64/ruby-2.6.4.tar.bz2=105eee594b711b29919dc2fdae39deb8dc282d3c80deec6975ad440794153a8105138b761f37ed875f6194a740057f0612ba95841233c6bfa09ba2c1b7cb4b09
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/14.04/x86_64/ruby-2.6.5.tar.bz2=aadf21040ae35be641d50f166e441e1369221d748773f8e067b99642cedddfef0b159ccf8f1554e6a88b2fdc3bf3e979273d5c645152ee22e79447e2eb9f3792
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/14.04/x86_64/ruby-2.6.6.tar.bz2=1d7e7d7f39eb7c71ba891c908973e1d439207165f21ca3152d66c54f7f34b5fe2d532fcaf084398771dbc79406bf68183725ef96c4ea3fd82b769b74e9ddeaff
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/14.04/x86_64/ruby-2.7.0.tar.bz2=03fa403e800492f99f0901716285bcf26020bfc9575dfce64c4967610fab0bf14614a9f0e2d0fc89a75fb5fcdeeca4ea971db32423594e798365c03b93413ea9
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/14.04/x86_64/ruby-2.7.1.tar.bz2=eddef51dd73c93deb0846000862253d1ebd46c3f87ef80844e1b983bb52eadacf58bc30fb3f21783440d03a71e7b4cea4452ca41d2413fda1fb0a671584ca41d
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/14.04/x86_64/ruby-2.7.2.tar.bz2=a5bbbbe91899388f48d7b19bb4f7bb1866d5f0ca1c73712c9e4cc4471908a072b206e25746c5f5b38ff6c9c49810a480ee87f588d1095b0414852f4559666e14
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/14.04/x86_64/ruby-3.0.0-preview1.tar.bz2=1bf6286090a4e8f87815dea2d07e108f85d70a61b76535d6f8782ffeaae57161e19aa76c9cc9696e2e9a2f2c67395f3fcd1db2ae5dfbfea147cefdfeea9c3309
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/14.10/x86_64/ruby-1.9.3-p551.tar.bz2=26532a0b2c191debd920825d4b271a6bddb0e9405c83cef116f30c0823af22e87c51a30d3067f42d21ca7b98dfdb258e4a143783c029d773d404bbdb4d484885
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/14.10/x86_64/ruby-2.0.0-p598.tar.bz2=e79e1366bf913fdc11818383abe5cd5fd539813345d89db7fd0d93b550e0e53b3a4c954334d2b1a0062aa6de5629f278da377a2484eb650cc3cd9d0ef5720671
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/14.10/x86_64/ruby-2.1.5.tar.bz2=30af7196c27c2bfa64bd4e74db7f5b2edd780a3c16a7e899b901190d9d50584bbe18055b6f3c76ef94552b95dbaac181d89041202e74ae0db12aa7916b18f994
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/14.10/x86_64/ruby-2.2.0.tar.bz2=7abf544280301d3fa1ce28b37a299de9c156c7d930cbe74f9959b7f14eecef40333afe06430b470e2108f4da438acb00e957322bab0d0d4abd157f2614276de9
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/14.10/x86_64/ruby-2.2.1.tar.bz2=e271acd4682ac90f2854e00be01376523bd764b0ecd10e13aa95f3f2745d954a7ff5ca6484c1184e9b9353dd11a815b1676b4c53fa2f6a6c05854331c9aeb6c5
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/16.04/x86_64/ruby-2.0.0-p648.tar.bz2=e47ef33f5e1f5f8b72bdf89f4b19a9d5212afad0a07feee1699b8a84a3c75ff2840502ecddd8ddf9d38fc40fdd4a8ae7e83fedae526a6bede5c62f6fefa5564d
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/16.04/x86_64/ruby-2.1.0.tar.bz2=9aa4a9c52e27db48432becbecc41160ffbae4fe96f9d87c74ace9fadc48ad4a33466133e34b3c2bb4510d24e324d3018bbffe5f3b1b080d4ac78b43e4c0a083d
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/16.04/x86_64/ruby-2.1.1.tar.bz2=96fc55b3b7a89281bc8c26d567966a31d36712f26ac2f34b76c39b3dcfb2b390ec27b843e40f230e9a5fe3cf7a2f3c6933036090e3719ae48f532b69b1b47af3
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/16.04/x86_64/ruby-2.1.2.tar.bz2=35f8beddb176502cfa26a7007c6a20b23154e5757a765925abcadc57f7e7e864a7a6e6b315664083854a2768f3bd4934f169d53eb3d24d95f56506e48fcf2b86
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/16.04/x86_64/ruby-2.1.3.tar.bz2=7b35a184abbbf5b142019e02cf23b24e0cb1e601ed8713d66c89e654a5fe31020384779c879de8a419daab6a47f8c5e75af21be0c21b46afd4d3eb38f3f5d0af
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/16.04/x86_64/ruby-2.1.4.tar.bz2=bf22497a43a1f76d2a44a93dec8bedbc03c806ad1041cf167203fb2c74aa60c599ad44fe5cecbb0dab8281a96e6c07728cdfe73e02ec0d78461026156944c632
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/16.04/x86_64/ruby-2.1.5.tar.bz2=e0fc5d6e0bebcda5dbfb8c0825db9617bba4d6c1ddedfce6bf6aba07f8642490c1417e42b97738830dc0e1c772d272c97e93250b07e6f5b6464e141f57b76f84
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/16.04/x86_64/ruby-2.1.6.tar.bz2=d12cdb74c5ec72bc0492d472605c86958b39b21c784c9965c3d9f53621464a6cefa60cc4314bbf39c7648626105c25d0f7f4525e7cf881c30c1bbb1904e3fa08
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/16.04/x86_64/ruby-2.1.7.tar.bz2=9fab7cad89b6d8d460a427efb1ff110e9ceb6d112dcf054ecd13cf9dd029b4bdd08fe5efab8b93a4c5dfbf552239d66d9ae3b51edea1f4020f334acd943620b4
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/16.04/x86_64/ruby-2.1.8.tar.bz2=144246fa14ae76be71091c51ccc7a0d7587fb1a9649b8dbb2e65ceccec5a974de789e425503993bd19dcb74a52a2a97dc0c3d5a7e1e050efe75d9090495ba850
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/16.04/x86_64/ruby-2.1.9.tar.bz2=79b0e18cd775a69996c05bf35856ed2610de54865981c5a2c111f0b7eb9ffc29b6bc9faa5b5435e56f90a918bfea2553a0e62f818d708a8fb55a438a3237a766
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/16.04/x86_64/ruby-2.1.10.tar.bz2=987998a862fcbc25644fcd580d6fc11220fbe20156ea39b76e8c91290b8f50f2c90c54e7425f307b8d93673aca272d3576ddf29016b98b21f744ec5f58415af8
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/16.04/x86_64/ruby-2.2.0.tar.bz2=eb8802d457ebe834360894cbb297175e7199288594772fc6c7550648983c2641e377c02fd5d5f176aabfa1c5b820b8004b32cb729ff04fb278ac15a08253bfda
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/16.04/x86_64/ruby-2.2.1.tar.bz2=3c5f7a59a92fcd0487bac80b0c4d8c35ef584b94012c62820932256340659a27657da6f44fda8c899b38349db93ce8c36b698dbf166f1f4f1fb8d437a4e4e693
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/16.04/x86_64/ruby-2.2.2.tar.bz2=d725c0ab7e8715c83a07106fbc11ef0b104501c182033935f4d2aca5d6ccd06ad36bcc4f44fcf2cb88cf43e8086474becbcc1065d95e8ff607111f14f67e5dc2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/16.04/x86_64/ruby-2.2.3.tar.bz2=ff325a26ad8ce53bc61ff84691ca2541d171e182cd6c0ff18b54422c2d65c114995390ea693ca828b0d07663b81d4bfdd99a5a5e6dc55a074484aa07a5196ee0
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/16.04/x86_64/ruby-2.2.4.tar.bz2=e63a46f35fe30dcac4736ce18fa42cbdd012c9f701bfcede4099adbb4632ea4c5dc585683a28fea58ffee109d512a027b0793a33ee84c54570308252449f9a6c
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/16.04/x86_64/ruby-2.2.5.tar.bz2=a665acffc149959b4c766059611b8bfc55f3153efcc29c58893646b31312fde894fabff3343e0e121689fdc52ce633175526e3a54f0bd6f2cef7407ba36026a7
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/16.04/x86_64/ruby-2.2.6.tar.bz2=364377d5f7f4c2187e1f5d823deacfd8afceefee8cce2effe4d127da8b0f165663c2b8c0a15250969d739c58286625e761b9a0127fa29b427c1cae9deb3acbaf
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/16.04/x86_64/ruby-2.2.7.tar.bz2=711e2358dd0d2c171e10c580f6789739af44735b76857b9c97af1cb1e2e149e563042a81efb8e3eb5de6be1f5d698d89767811cea94a6cdbc6b9a08f74fd8fb4
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/16.04/x86_64/ruby-2.2.8.tar.bz2=2cb3916644485fee5ba08337cde89b3c2aa9bd4aba11b3c45d197df1988827109cf3a7fc31cf98d51ede1d2c2ac3aa81011f86def4fde26db108f74d4b8407b3
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/16.04/x86_64/ruby-2.2.9.tar.bz2=71460b8823fb8c2eec9a9cb6c52ee78b579553d19a21ea87b4e778fa9105977bc15bc165e4ede1be41448501dfabd3413871cc297faa5e7df3ddbd809f18a027
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/16.04/x86_64/ruby-2.2.10.tar.bz2=985c945e37a6186b81ce7dee3ba3b0ac6d2b64af33ef8ce3fea10f3ff4fa4ad4eb5e926d7e0979caa4e0ae88beb63f3a0cd27d6301dffaf6b1bf664202bda0a1
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/16.04/x86_64/ruby-2.3.0.tar.bz2=866dca3ef7ffa1123d9866aa5aa9fbbd4cda847b91690183b3c8f49f017b4907286a7d114aeb4060ec6c9339c6804f1f22d4744c18c2786df752f2103731d266
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/16.04/x86_64/ruby-2.3.1.tar.bz2=ccd3c02c84a03ffe889407828556a958fb8dadf8532c70ae6ebf82578906eb8906dd86a4dba790b067a9004c612fc0928f1270b889ca52d19e54ee9482b519c4
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/16.04/x86_64/ruby-2.3.2.tar.bz2=d93e8996557d78f0b424f300d4d7aaeb78f467e07cb0ffdf819bfed4d70934ea19fa3f9098f57f1e79775fc8b8be911db9b7fa531a2930735f9c5dc0a9faf42e
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/16.04/x86_64/ruby-2.3.3.tar.bz2=309724b89ab01a9690804ab572b9fc5e14a7d7e3f55a66cd6822375f353a5405aaa809fd3434073078d032a04f837201cc915db255e8b1bd8a8f37436b83f4fc
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/16.04/x86_64/ruby-2.3.4.tar.bz2=a1674c9ed6d939d86e0e8a41d91d188b7244f10b56359929736d5c9cecc55dd457ec5d234978060b0ddd77b089db86b517f25e977e2cd72d9cfee186d40ed16c
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/16.04/x86_64/ruby-2.3.5.tar.bz2=b672ed3106b7268f0371446d3e8c6bd73a6f1792c67bd586f446f6a399dfd7a5191ea9475751844db1d1b9eb1e349e3e0949d2e3ec5f11afcd460477f953361c
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/16.04/x86_64/ruby-2.3.6.tar.bz2=ebcddf2eb2b553f4287e5d339aa59de107f1a0d9db3c25369efd2673d94c2f24cf214ebb96daf0844cad265cbbd783e4fbc9cddc287e363df2808b0c70d0e4ea
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/16.04/x86_64/ruby-2.3.7.tar.bz2=ededc5c15515ada55a6a3304016e50dedc616e5d264e36572193d714704a2c78d9e2d26a2c6fc31313dee3a65ecc62e729f21ed34e0c11676fa99f06011c67f9
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/16.04/x86_64/ruby-2.3.8.tar.bz2=05e27b056f81630c1f58f01ba025600237a99aff4da275e304414856c292f97ae1798dfef00f0ac29e43578edd7383d066eb9bf16fec13e206219a1f9004ce11
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/16.04/x86_64/ruby-2.4.0.tar.bz2=8e44a183164b9067223c3c4cc8e98a4b7ca7b58d7a762043a0d82932174dd4087a34f1cd1893e8fe632cb0bb333785a3412d2c65275cdd7b1fd8aa57467182e3
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/16.04/x86_64/ruby-2.4.1.tar.bz2=2aa07623e101816d0e09a20dee617aaa48c507aa60bd64a3d202e5f217f2ce4a7ebccd6d9bb03d005617a78f4f32ef50f5c41f0683dc6d2fbd097e6910f92f94
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/16.04/x86_64/ruby-2.4.2.tar.bz2=9cf6fc78ea5264fa69b3facf66862a510b840e499a43ebfbf834b7a4888bbc1977685f231316c6093a347206eba2107c5e7c95803476414fa04b9d9cec76aeb4
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/16.04/x86_64/ruby-2.4.3.tar.bz2=3f0908483e1f170d20350dd56eedea2a5dcbf778e53be0704f087aea4c8191eba49224026452044a3fc22bc5499a228716a78a4c69051fab95ea24177d3118c2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/16.04/x86_64/ruby-2.4.4.tar.bz2=a6535b5430f1279ec89eafcf93a69f728b091ffafbe84a6e4f425615c63bf20f1742727d37afbd64bd75f7be4918f0f199bc37c44cced718a732f997b64c8796
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/16.04/x86_64/ruby-2.4.5.tar.bz2=8e97c7f0cdbbb82afd35905c7e3d1f86a82b8153868b3164e0bb0fe1aaa8684fa2c5d6adba4f263a15c1d16e06f7ef74f98a6a01c670215ecef11d30811f79ea
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/16.04/x86_64/ruby-2.4.6.tar.bz2=a7de0d145d2f14447a69afc24574d1461d70e0e97bedea9d6a0967d76b0cfaa8cb2355208fce45af55841b606ea94e0b2c19491807e84e8025502f0c03cf410f
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/16.04/x86_64/ruby-2.4.7.tar.bz2=bd5793063b85bd39eb9f46f0bc4062a9a9f3d294514822fd0329f61bd424d55800de0d0c8feb372cfca52421e2e2e4c3a64adf735ecd8fcb7c74298eedf2cfd0
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/16.04/x86_64/ruby-2.4.8.tar.bz2=dde0a75b4bc9d02fc9f580c32483d2c426d7a5593833b8417d19710ea3548f48fd152be912f73e58360cf9665585efb66fbe1d6f6ea63153732b62987fc13bbc
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/16.04/x86_64/ruby-2.4.9.tar.bz2=8b03462db9909ae91670ce8c4c8a392e309cf11e5ca3488b2927df435b2215955bd05752f361d8089e1b8e03a9eed86f7b475ce7cfd232847db5f095dd6848ae
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/16.04/x86_64/ruby-2.4.10.tar.bz2=954151b863411ad2dde262b8fcaa44099cf21c3ac3161be33149a94f33bf41dddfaa261e9c418d499a120598092c8278271884beba8325ef825cf0d112542c70
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/16.04/x86_64/ruby-2.5.0.tar.bz2=dc410c051fb4a8a52b533ff674d99b8ebd161dc151b31833a510ee0fe2271438f36fd1c5e58d9c83fd78efc942fa38daf899e3526b1eb7b840de7e3a7c167100
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/16.04/x86_64/ruby-2.5.1.tar.bz2=ff230469beb7d01d32f0680479b0c78a755b4339ff86163ce5e202ac5dc81868372d7fc4e2f0650cebc01494678b8400e6813c09a17d7ccfddcfd2cc8899d99e
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/16.04/x86_64/ruby-2.5.2.tar.bz2=435e131b912802666a606ec45d5e89668cec4c0d7796457fd6ed091aeacef5ba1afe7c204b692d144f680ca5b2859b2257eb1036869cafaa158ad4b75b26fbcd
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/16.04/x86_64/ruby-2.5.3.tar.bz2=2dd5aa1761ad23c0da7d1b5af7a9dd6567facaace2a11d4f8281a3c7939d679d0efada3345f7f7bb4bcd817ee71a7b4c9363643a8568d5e6e337dfd494f8e072
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/16.04/x86_64/ruby-2.5.4.tar.bz2=932f8ef957c7272a7a699d1de68939154a8e5b58e07ddc02647c9006b1ef2248d7cbd7f2f07c967750ead3d344f6a381b9e573669dd6b704ca520e74ce09be6d
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/16.04/x86_64/ruby-2.5.5.tar.bz2=42092b69108253e5c80a6ce924ba4efce0e5d9df134ae6cc5449e2483f856c90e58832f31314f7c548a0babc7139e1a66b6a068b7475ff9796f321428a62d9b1
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/16.04/x86_64/ruby-2.5.6.tar.bz2=42ab6fdb6c88db88337a06f159d2ea8f4ffbf3f501450ef624f312ca582ce3bdf754cda42bf89393c5201ddc20efb3c7889fa1692b101516845c83187ece1a86
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/16.04/x86_64/ruby-2.5.7.tar.bz2=e96351acede27ce290b3ebd5f69bfe836d53932da0988841868a6de88eff6ac10f42f4e2a11e2e4592ed76b1c57f436ce199f825483eba7dabc3e934db5bc11a
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/16.04/x86_64/ruby-2.5.8.tar.bz2=f36cdafa048d965b41ed5f0124494e55be507778aabf8dd24143230bae80f18b0897a91da7d1f96b49b32b9c3310fc379102aa971dafbae302d056544b4d85fb
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/16.04/x86_64/ruby-2.6.0.tar.bz2=c642b0aadd2c324d63bebc66a5d25d0892d23fdc3258256f482a583f82205c5933872b9b5ff88535457a89f86cea1329ecb7e266026f171c18fae8dcc7785c6c
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/16.04/x86_64/ruby-2.6.1.tar.bz2=73b7509703b7466a53b9186550281cf909dc2d803509961c959d9e649eb830dbae1fbdb383850acab12bef6c0fcb536700956dbfa5edb856d06ad1613644cf1e
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/16.04/x86_64/ruby-2.6.2.tar.bz2=a2de3f85903c0b39beda2c58a82d0973c0967c99ff0c7f31dd0a55b3177ecfd8d77b53694a863fe351a9f4721623ccd00a14dcd2c01e6dffa25829b57533cb06
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/16.04/x86_64/ruby-2.6.3.tar.bz2=1d298f7a59ec4d7994a28af9601eb838c71d738646176cd8b8d423f8aa03e356377b0349401a768122961e26bb358c1eef90e24ca2a440756dc04c6b8b84eb74
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/16.04/x86_64/ruby-2.6.4.tar.bz2=6c8508d7ffc547ee3eddff562c80bdd6dbd6349a5d6b036a91eafa3c3a28a8a7a6d3120d756c2d199ef9c6299620bc0ddeafa5d65caeabb68af32d329e415c28
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/16.04/x86_64/ruby-2.6.5.tar.bz2=05120b1f5fe11d0ed67935050a6ccbc81b23635caeb9b742e55900ccf1eacdaecdc686f5ce9dd9a614268b69ab7d9eb2176984225b30f141e0ee9765efaf5aab
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/16.04/x86_64/ruby-2.6.6.tar.bz2=a7de0764c9a8a6a6b00eff5983f6ccc24441512a0ef782820ec7fd260932984a7eb9ef338e2c2bfd053606ae09845a44c55d7ec98b3b844d080d3f8a271045a6
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/16.04/x86_64/ruby-2.7.0.tar.bz2=6f2899f866573fd78b0875c00bf9bdf296126a9d8f55a5e42d7028744b69e86f83b713112dd5f548b7b091674dfb907c3728a89c3b981a198c60f7f38723ab6f
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/16.04/x86_64/ruby-2.7.1.tar.bz2=ad63f201bc06025419dcd4341597b22c5f9afb0031cb09c2530371bbba7a54b6528c802ca7b764fc97d439c0bc798ec1fc43d3cf7bab4fa9db9ec9c2509d21be
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/16.04/x86_64/ruby-2.7.2.tar.bz2=81889577a41b982b3d59b4da5f9137453927e1d4776e1c394f7e67c4fbf24fbaaf3444ac623751ea576d6c127d9226bd23e86ea6c09d4c1a76677fd753343ba1
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/16.04/x86_64/ruby-3.0.0-preview1.tar.bz2=76a2dcb3dc48c0fee3f235a2f552af83478b4669346b09241143205d48c0377ca566cee9106e4c5721f38c0fe8b6c4b41b489165e9653326c9d8a89f74334138
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/16.10/x86_64/ruby-1.9.3-p551.tar.bz2=6609231a7dfc6cb3bc4f7b3d9da19856725149bf83b3526ea389722884fba76d2eefc0bab56eda126acc1cad624b1e159975daaa71a9a3a602e99b239385174d
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/16.10/x86_64/ruby-2.0.0-p648.tar.bz2=f8f78e9d6f2f4fe4be2484600bf95012cac675dcad9f6928419b06ca4223c923c60a0cb7de9cd2381ef77f6a196f3f0aaf04fad81230c33d6865eee7361b26ff
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/16.10/x86_64/ruby-2.1.5.tar.bz2=21f30cb5caf51e257572ac6a974d67f8b7a0459c1edbb6367753e1badafe75dd37f8674e8864cf8c47811a66bc59f0ca43e7b96ed48fdd1392e61bb453681cf3
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/16.10/x86_64/ruby-2.1.6.tar.bz2=afe189f0cf56fbd4dd44c207e9bf9d5cf304cb265476ead067d62505637fbeba4a06d47aaa084eb140bdddfba933902c897c218fc616e5690b816fdbf386d440
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/16.10/x86_64/ruby-2.1.8.tar.bz2=f9f7720e08f6b86d5b1f9bacdc4e710525b05cd7358dc0bf333fe615ee6206a8460237c90e7fdbeb8b8b03ebcdcbf712674537d4afdf0a3df52ce8113b5278ed
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/16.10/x86_64/ruby-2.1.9.tar.bz2=7c07672903671a2a4015f0a33b8e237ded2bf6f56fcf4421ebd226e9bd39c4a516f609acdc070dad225ce3e52d468332fd37fbeb06e687796520c7d6e83dcccd
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/16.10/x86_64/ruby-2.2.4.tar.bz2=2e617f392865371b8f19be3f9b65945bc70898dbb3960f0c790200e0f34ee299717bd6fc7361a8404a12caa2bb248c346221341303218675bb0d02fd68a9bef8
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/16.10/x86_64/ruby-2.2.5.tar.bz2=5a68c41afe6f2d7bdbf381b5bf36104944530e7b09246152764469e28a0c842f8e3edb0ad60e2a8fcc5db85b9496a9465b312cab645b61550ab1cb9a9d11f0e4
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/16.10/x86_64/ruby-2.2.6.tar.bz2=3ced80471546c33775873c64b98cd924fc9386af0a7f8cdf462c133ea546e894190a0b040c64c33950c90b0f2e6a2acb54db9277716e8f885d14daba7a669fe7
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/16.10/x86_64/ruby-2.3.0.tar.bz2=9e1e827b35dd75250b4c71c03f437b674d364d9b1b52990a897c742a07e86ec615878d87384871f15147fe05eb67cdc03c5df5f40ad189517b28c5889ca843c4
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/16.10/x86_64/ruby-2.3.1.tar.bz2=399961f149c48fe687139ae247175ebcd58b6659a3b050cea523ac4d5351f2cb44670b2a7fa1c97efe852414f27a50213a8ecfecd36baf889bf9163c82babb71
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/16.10/x86_64/ruby-2.3.2.tar.bz2=4976f36f8c5291facc9553fdb2dd0c6a23d655461a8f8a7965e871edbb8cf9042df3e2292bf03ddeec455570835b834278f0beb32baef26fc159e4b4a86d6614
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/16.10/x86_64/ruby-2.3.3.tar.bz2=d77a51c0b1d0cfcf0b0385d32fd87adc57896f64729ca822f7c1bd7ecce79264b8b5e1799ebe0f7b079f4590e7740db97d027ef4fe5387556dce2c689630f118
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/17.04/x86_64/ruby-2.1.6.tar.bz2=e80ebc162e44f407f5c830fb55f995ce29e28ed871d365631764db395860239bd570aff3092b18b169ef0b9b70495bf86600677c616cbd63c80f1ab50eddaadf
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/17.04/x86_64/ruby-2.1.7.tar.bz2=af76486c65259084dcc3afbff212b7cd5d9e17d5ac6b496db37c6c28285b41f0a72523b92505df2c7efbf5e64ff7dd6d86610f84c5efa7452d2bd01908ca0390
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/17.04/x86_64/ruby-2.1.8.tar.bz2=8f8829fda202863105c0453ad40e1f8806833446d44fa01f97e742e83cb086da7eeaf3349899c9120879395ede20a192ef4546a00062585e47b6b2fe2253c89d
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/17.04/x86_64/ruby-2.1.9.tar.bz2=3c249490017b902b43e58a199dc420b9dc038ec139949d9bc620f58a70c7f8dd093d12313f695899ad53ee314c4bdcfeaa50cb72c196b889f38faa22936137c3
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/17.04/x86_64/ruby-2.1.10.tar.bz2=6bcfe2a2983f6b476adfb7863c9b483aa0c7cd84abd70c59f4de427ee6274bed71200cd91269bc0b3cd418645aee6371cfd3cd77e93b98a2c6c64efac6e817d0
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/17.04/x86_64/ruby-2.2.0.tar.bz2=e610c0029dd68d15b582f09086ac39a6e5d039ffa9c18e5fefaffe4b0279445258050327bf7c02c8ef672a7ec58a32f5850c044d9083694d0b55424f2b75e945
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/17.04/x86_64/ruby-2.2.1.tar.bz2=d841aff173f5a0af71384b56e1430395b287a771f80131279e22647e368acb20b5c22e5c0d4858510525b9783da499b6f6fade081e1d37fac3fe7a50cb34cee0
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/17.04/x86_64/ruby-2.2.2.tar.bz2=17be6eea903f162178edae84c67f263b9532405c0cb5bb320fa51b019869d114e0dc4ad7fafd6cb2597e45b73d4777d3c4e0d4f22141de30bd2ad02ccdd41ee3
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/17.04/x86_64/ruby-2.2.3.tar.bz2=8dd4bb1cafb2d82586b199bf032edaf23fd9bcf8a05b7e2087de172b8a8c6c4fb96584fb15372033b97bbe11a7f8aab25057c03d71e5ee21ec4a647f95687413
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/17.04/x86_64/ruby-2.2.4.tar.bz2=54f9fceb0496f647b3c59dd7411a583c74e7886d8f127aba10379de739c85e45d62c2688280ba5d21a45c5054f42a2645ac2a9d990ec1a16cbb2c533edd9eff4
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/17.04/x86_64/ruby-2.2.5.tar.bz2=1aee7aa974a08c6bb5a29b0782efa2950c1e530bc2100e018d66450e8e89701673a034a45adcf70bdc37f52d4027ae263d7e4410d64fc637b594ad624f10a25c
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/17.04/x86_64/ruby-2.2.6.tar.bz2=693173e4e235300cf30ce1592bada6aba5bb29a123157aa419ba8403757682cff31c9b2b0a4e97daed557953f52c26ebe0e49605e1d12f5e4247e0096d736630
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/17.04/x86_64/ruby-2.2.7.tar.bz2=8af3b57425f7cac45e7bc61029f872facc87e9ffeb3243f8fb43407cbc0a581491f38091b0fa45c8c148b730fd8cd493aa5286177b68092d7944dd73ba585299
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/17.04/x86_64/ruby-2.2.8.tar.bz2=f1a7801bd0116914a055ff4013840faeac0e432b55aaae4c0bb61eda3d812eb5b3093c2c536fd9e2e28eca81137300f84418d8bc8dd9e48ffe245ad90dd3eab7
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/17.04/x86_64/ruby-2.3.0.tar.bz2=e1fea7c85410615f76b02df366ee49f929cd3bf3e52c3fef8b848a8a6d2b982de03c325aac664c6550b216a11cde64ae571bd5a5467ddd4a8b61039d874b2955
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/17.04/x86_64/ruby-2.3.1.tar.bz2=e8b6b5dafc4b46e97fd905a5396d09ee1cfd1c0b4b74b9c3bd9e1056684f05345ac1599817cd9cb1dcd410e4e3ea23d5f2fc86da12e01fd076434c1b2917f117
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/17.04/x86_64/ruby-2.3.3.tar.bz2=8172c35a381adfdbf0f90fddf526e3a5c5d4590e133e041aeb339137c1c31f16a47b904c61048c29906dfd2245572dd69caec507432628bbc98bb3eb94891575
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/17.04/x86_64/ruby-2.3.4.tar.bz2=fe9370f2f45c557fd24574219e9597826f4614a8c59f092bce54338a2e927d16bfd4abbcaf0203a60a35a11169310d45e79c4a33fa4d45916bd6e4eefcc7b888
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/17.04/x86_64/ruby-2.3.5.tar.bz2=e42fe5b628b6a6cfc87abaadbd9140cbc5c0000993c3272740ee6e20d07d2bacffe5148213f9628d6bc6f97211c0905e55d7bd304763ae095d86df8c2b2d15fa
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/17.04/x86_64/ruby-2.4.0.tar.bz2=baadb5c405fab06da091e75af6497370757cb694d50c9f76fb06bc0a281df13f4ae893df49657c7dd7e86dfbd052d2cb7297961f9739cda4089ed71e52ae7bed
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/17.04/x86_64/ruby-2.4.1.tar.bz2=71ad68ef1317ce5ba51353cc226fc7b11923d9022770b355cb1180be7c2ba4bdd87b079a8dec15c09ef3ad42056018a41a603bd0a10b8124433f36b0930153d0
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/17.04/x86_64/ruby-2.4.2.tar.bz2=440f27f682a7f9d2a99ff8c0687c1fecebd8bce494b9db48ab9d303250b8ea12dee51eed0f68d940f141d8e2699653fca7d2a6811eddc5c512a9fe39430fde3f
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/18.04/x86_64/ruby-2.1.0.tar.bz2=cfe087a9daa6de2ef00a6501d568a25a3386da730304697e1bdb9fbb098617a143f073e58629876de4f09a1e8a60a48ec05864fcbccbd6733d9e1b3d309a1100
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/18.04/x86_64/ruby-2.1.1.tar.bz2=b74cc64103a31b9b9545474fe202ab9f9b15569681262438056865e4dcad08419c44bb696c7dc8a18f72b3bd8e5e98201d0c3608ea652c907372c3c95cb7e16f
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/18.04/x86_64/ruby-2.1.2.tar.bz2=fafffbcd24eb3c55c89704e6e8ea48ad6be286bbb4e38f56c3b3d61f9bf4f6bec28882da2ff60f17f79516476ae50cc4cb8c6a8cf4a0f31b910d6153727caed2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/18.04/x86_64/ruby-2.1.3.tar.bz2=4daaf8bba3a04d46e04720ff2af1469e1caa68168f5c27d1d3e0cab922055b1f9c0b26ee64c3cb46c17b6a9651ee7a11bad19e9414102455e96454f1a7929408
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/18.04/x86_64/ruby-2.1.4.tar.bz2=988c13e900168b901a3a3deb4bb96e19b15205cf4c2793b56854b58924fff652946a083be6615b2053fb5285df0fd218d1f9f91562798f0386f0758973765dcd
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/18.04/x86_64/ruby-2.1.5.tar.bz2=c7396627e45d8df68b18c2491fa756085aeb4ec28c1cc707617cd903fcd47d4fdd3cd6ed225dccc14497afb14200b9bea5ba38f1e8dc621c4aea8b8f0f1ccc7d
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/18.04/x86_64/ruby-2.1.6.tar.bz2=389aa514d93d165fe299856a5348b1667f295aaeb49094bb5ff49e9c6861bac603e698c36bf81777797d05a1d3c405e37c1a00a4dbb85f262bf02c1b0e16ff04
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/18.04/x86_64/ruby-2.1.7.tar.bz2=5a38bc1dd227658347114b935ad66e27fab67b8da9529a7f9083d6aac5743c40aea8c33ca95d4f10ed1d56f29bcc2c0747a3e88b87425a5786245792d8851301
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/18.04/x86_64/ruby-2.1.8.tar.bz2=44e36e4918ab4c354cacdd20be30acf12f060aab808172184251186758f750ce688eef72f39ea110ab6429fbaaa5a792b1915a5c2d845b6e22a3cc4bc851c6b9
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/18.04/x86_64/ruby-2.1.9.tar.bz2=358f12ae2d4e177a080bbcde8b275691418884eae9a42c98161170c7b0f6029ffebf7ffad27961bfc8a50a393796934a2dd2c7f0ad2a35992c35dbd6c8c6349f
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/18.04/x86_64/ruby-2.1.10.tar.bz2=e7e98be6cf658eaab81486360f4d5d22f86805582feee4aa11a8e2fe6b461db69b850c7ea98840af0811910be7f534317ab5887bc48f47a9591b65fa7262feea
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/18.04/x86_64/ruby-2.2.0.tar.bz2=307ee69b3051fcec2942fce075232a62f6adf6486239a89fab7bd63a9bf068e36371e67a5e42f86ed60e31b8219ff431c2d4bcf519b2c10393504942d2d90a9d
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/18.04/x86_64/ruby-2.2.1.tar.bz2=a0a30a805be9c43cfe52793d103e9f0dc6076d02b0c5af36d650564aa43958164a278958f7a7e1132ee5d3357cdcfaa8d59a4cc0bab027e288d935a44958b743
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/18.04/x86_64/ruby-2.2.2.tar.bz2=d3218d01a18f5dbcdb65f216469a463215784170d32110f06372fda6325bc17e2c2aec1601a5bf3319ad753b123de056e6bee8aacdd7c64c4859570d40571ec6
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/18.04/x86_64/ruby-2.2.3.tar.bz2=4fb3bc10aa46a85cc37fb041d351b2a8f74d70c3de32fbceefebcd6e757cd8dffdfc86cd14fa6ae7d5273f875e1d4e13e6446b6dd1882c8fb015d1d34ab5ed2a
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/18.04/x86_64/ruby-2.2.4.tar.bz2=a008439e903b1e97eb5a66a88cf72c2e7438b12b78750411ba0ffa496c68beb8cacc2037763be1c8c8841fe9a248d4be0d0976420db0520b4b8456aed5480f3d
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/18.04/x86_64/ruby-2.2.5.tar.bz2=14573495aadfabb81b985aa485c0090a816f459a0db8e790a7d1bd948897cf650fef4e8aad7d2ab8232d2ebf56bf08363730dbbfbc2318625dcab04d3904b3dc
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/18.04/x86_64/ruby-2.2.6.tar.bz2=e915bc10ecd1129d7ed55a12fdefdd6b6fccc281cb3cc0790e5970978f17652068ccd7fdc160608cadc8556abb73a2c187d041899adfcfcb4a311285415145ac
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/18.04/x86_64/ruby-2.2.7.tar.bz2=d80b934273b84d7ccc4e17fa07c9e0a0f95cb4a38224bd60ff73772ef7ecb3d1974e686bb10aa319642709e49789c0886f98f4fc1ccc5312a19ca19f03674e7e
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/18.04/x86_64/ruby-2.2.8.tar.bz2=9bf0cc35deab5f53900bc8e8264dc1b57f91a3477f241848df48109f4b5c97f3140470f523fa768a7543c61cdb7a93427866d871d09ebf8060a5cb75ac6d3790
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/18.04/x86_64/ruby-2.2.9.tar.bz2=0cdefbcc88c5b9d34c08c8871c548772bd473dbaf54738f9855afddae8da5eecda607b36c546077efd0165114da385cd1f296433afe411f57a524fbff0a69291
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/18.04/x86_64/ruby-2.2.10.tar.bz2=3aed1b12ca46e34fce66ac23bdd97ef815918275d91ca4723f9a6f2a2b93cb2b66f845747951593eaaf078bd0d982e06efa7641fc3e11d141b7605b086f93393
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/18.04/x86_64/ruby-2.3.0.tar.bz2=ac6a699d5d08b33e7580a24c9357c0c8e8378208fc7385f5582f088a879f61e48a4654d72f03263a1dcf33fb0838b01c8c21fd39c5e2549d683466e0441381d5
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/18.04/x86_64/ruby-2.3.1.tar.bz2=77cb7698c66ccede33f558f6ab9ebe4be3b775a567d1d4dc12fd85d7b0f28d7bd446b18ef48ba1c879dadd76b50540b57f283e9f226e904e620afc3ba6585bae
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/18.04/x86_64/ruby-2.3.2.tar.bz2=9592c8e2fd9266f5d1cc780706f558e15d775cece995f5b6e933c54be7b7f2be2839b28ef1898b2072c5cdce36b830e72f967062ece4393765f8dbc88c6dff88
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/18.04/x86_64/ruby-2.3.3.tar.bz2=8243575f30eb38409003b0450ddece621a589e29a4ffe219410820bc2afb97b7daec4c81d59d95dcfc83138414a2df707c925f0eb56907d565dac4bbd5a929d0
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/18.04/x86_64/ruby-2.3.4.tar.bz2=ae16edab6e55d1b2506c4cb30d836639035a7fc153511125b578d6da8a8b40cd87650855fc6b4cf777c1fa0428c593325af88d9ad25d53acfbde0051a730eaa5
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/18.04/x86_64/ruby-2.3.5.tar.bz2=10f4aff595d12bdb425eb3268c868e0efb92059e6aed8683fefa5abedc1ef21d23a45e17802edd8e5e0924ba1c3277b653c0559ef4ad4c9dd2be2fee17226f8d
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/18.04/x86_64/ruby-2.3.6.tar.bz2=bc352df203155008da7a1099f7f7d26eb9f80e0d2e41c8adec5eb47f976529c6126bccc207563de87ccc2867d1e4c43797efbf295c9a7a4afce002ee19116074
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/18.04/x86_64/ruby-2.3.7.tar.bz2=d71dc217011d154ef7b33780366bff07e4232ae77321ad6d16f19090f924ed3867c31f2af4aca4ffbc6a536b0320b676716ffb43e34b0323e81eafab13f17fa1
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/18.04/x86_64/ruby-2.3.8.tar.bz2=aae74010426e2a1288280f3611ba6aac842ff573f9b122fda9a4f1c514e09cb3d22281e6957b4acfcc753c94113852e083a9a80d0cae6b33682b83669c475eab
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/18.04/x86_64/ruby-2.4.0.tar.bz2=4a083c168d9facf3346b67dde02d9705109feef6fcd4e3c7c59c2bcb35c83597305e09ee143915fd993799a888d6d9ffffadb386bd57e9477312566dd6164deb
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/18.04/x86_64/ruby-2.4.1.tar.bz2=58b30b00156691de2acc5d21d3255029fc3f9f2536e668298ab160d300fa0bf3eb0705aa524c9123ff09d770807cda0154bae012632b7e87120d7538f844560f
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/18.04/x86_64/ruby-2.4.2.tar.bz2=4c3c586765fd5afb55383d16eb9d0e7ffa5b1ff988a2b1d847e3f972a211b2401f035ff6c02d71de558cc161655438727079aafcc8ab80c97e07e16cd7fb1304
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/18.04/x86_64/ruby-2.4.3.tar.bz2=e66a4ca4b95496964ff4d77e36caf0894d913c1116f901c9b589da5a0e388302b64a79ad6acfe7eb1ca5917825bc0f866b482f074f1d5fed96d91e238f7ef454
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/18.04/x86_64/ruby-2.4.4.tar.bz2=f95eee611be949327224b89942f4344e7d8e075b958ce3418b5874e9b23981113e4fd58254629fa9f6c2fdaf5840d44785ecf5f04433987f8fc4415df5c3e367
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/18.04/x86_64/ruby-2.4.5.tar.bz2=447b28420be5b19f6b1381d232920e3c20bc894c2e0d1d2e394cc44e7859d02d177ec3ee09ce96e922f55b7fe2651918805f00fb783af3780e5f25c21f330195
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/18.04/x86_64/ruby-2.4.6.tar.bz2=5f60bde5843fdc0b05bb852a2f1b30ce085dbcf7acaf105d5af951398b845c766113ff3740d44585ce3814b4953c004230eb4dc2ce8746b6236ea4b7a1d1cb10
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/18.04/x86_64/ruby-2.4.7.tar.bz2=929a03725dba7de8d7eee3fe8987b858b9b9d6d377beee710af5c3e84b02501996444aa7b2c1db458aefc3e765da17cd17ac30fb0b4d77ab1e54239e72fa2a63
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/18.04/x86_64/ruby-2.4.8.tar.bz2=227849b5809072b3aee211125c2aad3e2e4984e9d9b4415dd8c01dbff70eb9c3758c3cf54f2b97fe282f7a42f205a2becf7b86e1e6ebb4a4d048ca32659603e1
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/18.04/x86_64/ruby-2.4.9.tar.bz2=c15a46ba1e89cc41523a21eec90d4e3af5b9739d27c2f2b51047f2c1db832e2773cbc04871a176f71e7124eb3f7b53262e40a1baab87262f8811a8d69d8e5358
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/18.04/x86_64/ruby-2.4.10.tar.bz2=b83334e272e78995b699de28bff67accfc151cc7fb193d5c5746fcf06087643564b3a0b538cb64f50706642a620dba2cc54191357321852db42cc8c5648270df
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/18.04/x86_64/ruby-2.5.0.tar.bz2=82038a66827fbdaf60f404103b3956ead4e03c999893f0095109e7d853919992cab615f85cd96ba9158402b2de5a68fcbdb8b32e9d07c6f754e0591f72851b40
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/18.04/x86_64/ruby-2.5.1.tar.bz2=31e9f176ba61480b33b7761d2a19119a200ad61c8f85145f736eb196de50babaf278d023b274274c6a31f2173c5d022bb93e0f8d46a88223659d8ebcf6f5e278
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/18.04/x86_64/ruby-2.5.2.tar.bz2=75d25fa6dc81ce8a62d02adc2e163e7c222c5946116c4880cec19460e2309457ee1a11a8eac94243ee8437514bfbba9ebee939218b6ccc7e5c1f15b673d432e7
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/18.04/x86_64/ruby-2.5.3.tar.bz2=84c93c85aa3733f2ac82e695c19e714ad4afd096edd6abda8a4915311d1f604453fc3fdc290c6ae1f9055d305ef400f8f8f152c5e15eb230baf7cfd5e192b7fb
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/18.04/x86_64/ruby-2.5.4.tar.bz2=131b874ac376f42f3427dcbeb0adb0edd18ece834514ff5cc15f3b3e29b8f14697050051224d7ba2b509d428f780c653a4d7101149b8ded41ae373aab871e90a
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/18.04/x86_64/ruby-2.5.5.tar.bz2=f55d2ff7f2eae4d30fbc14226c928d1caff21db1f2cd559d3caeb0c07a7a3f034fa369d95f783e6f38cecb493d99aa1928def9d8574698e3edea3d33515749f4
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/18.04/x86_64/ruby-2.5.6.tar.bz2=06b12b2a1e85248311cf55620499806078b3b67110fb45dad9cb11cbaf1e230ce8a0da23c7de0a5abfccdeada8eb799f038b1a09980ee9572ec415e24fcf8c76
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/18.04/x86_64/ruby-2.5.7.tar.bz2=49128b7845954f1f04502a484f17d5c0c6ecf8990047f5a383b2752ea9e09839e5994b210c2f60307d44ffa8b440472116fa1231ea899caf639e1b8a72f7f97c
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/18.04/x86_64/ruby-2.5.8.tar.bz2=24290aab4e0d48719659f8c1153d2b08020f17ae845e9ac6d6b6d3203e4a5b19061e907a214e8d4390277584ff4b46dd4a0113c6b201fa37e8a95c42fab5aea5
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/18.04/x86_64/ruby-2.6.0.tar.bz2=1be48c38da41f462c23d516f465ed34e2fe90c6fd53ee06f1efc9107077d9937413bee589d5d3384aee5c09da7087fa84864a50089bd1cf3c385ba3399e9b0a2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/18.04/x86_64/ruby-2.6.1.tar.bz2=b7e1204e0e501312828ca0e30b77434b2d8d94581627196f0195ba93fb10a11046d44942393bd8a261585c564bc721313152a9087aa56b57b433ed14cc7922be
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/18.04/x86_64/ruby-2.6.2.tar.bz2=e91a187a9e726ed26ddfaf09cc49473c8379545e2265934fcd1a1fa78ba99f9a119fe2c3c8247eab583389c3af7ec40a0e71da19f6ecc17ffc086759cebaaa15
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/18.04/x86_64/ruby-2.6.3.tar.bz2=77d9be5bbcd115131ec7c842a4449729d1515bf2106a6a235472dc96b58a56873c2d0fe6a3b824dd15ad00194b30e72a75813d8b4e10ee11cc793973130e2401
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/18.04/x86_64/ruby-2.6.4.tar.bz2=a2e5409a1a88557bef747ca9b1ea65ac90e430500a8f9370023b4314cb5d1e0679a1b03761980ab2e933ac3521188e2151e521408e33cb4dde5f0bf802d81a41
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/18.04/x86_64/ruby-2.6.5.tar.bz2=ed6288a4d81a740d722b43925db8f22f794cc704bf834a1f9c844e2072baceb8938547abb8f4fb1a50f92c34a8616904fc2679a44bf4adec4e78ce00e8456b45
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/18.04/x86_64/ruby-2.6.6.tar.bz2=08cda5ff00b9297b46d1fb620301066b21240951924337b8b87d27526e55024e61121e51d9b35feea2ac5eed4027658b39ff487195140e7abe9158181c3349af
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/18.04/x86_64/ruby-2.7.0.tar.bz2=cada908be34428bc2f302bad6ebd778a2c7a8e979476e00e45c9444b65d7f48f397b838549d56ceb91f0e5593ffd663e9facc4ea5f5c6a4aecda85a5a1136496
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/18.04/x86_64/ruby-2.7.1.tar.bz2=06cb5f2f0c0941802119dbdf34995446d6d69ee59eed9a5e9d7f9e7f0e14de440a9e77eee330357fa305e81ee39a6868651c740ebc91bb9a2085a74b33685f4c
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/18.04/x86_64/ruby-2.7.2.tar.bz2=23654c65e6e62354857f86098852af0ba50a15643df5e7f6fc8b710e35a3872f6eb7dc1bf9266375361f696d8ded0bcdb9ee9acdc8d0c975955d299292da7e21
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/18.04/x86_64/ruby-3.0.0-preview1.tar.bz2=8fe71fdb37955b031769359dadc5062b6c15e0618fd8961c932212a6a2610829aba8b1dbdcf4bdcc2e133665e043b29088f714874e3ef3a41d688b7beba78928
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/19.10/x86_64/ruby-2.4.0.tar.bz2=172189c66b3c721e7413f0088f50e4eb8dd80d87779c3a4e74231f7036eeaacb8e373b7f5ff017f8aa274c1e1c872066f2f93485a2a369a7e9b442d157840bf2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/19.10/x86_64/ruby-2.4.1.tar.bz2=829fcc1a3d878ee28e89a58a2f6d4221cec115d241a007b048953672d57548002c3a105ea4e65e344137091baaf5d5c54232a54c116afe03d0f3d61c07547c2c
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/19.10/x86_64/ruby-2.4.2.tar.bz2=ec2e7bd32e2d574773486e1c1d733611465765cf14895fa6b017b6ed6301ef40cd062496a3926788851e7ff3bdd62b488d03385aeacc66bed53aed18a6dec225
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/19.10/x86_64/ruby-2.4.3.tar.bz2=79f822725d4e3bb7daf416e736d87f3b01c21d011423a2b3c65d9019a47ad4df256fd4a1f171961267ab8f20387019fec8f3f4ebfb6664f682bdf36914f6a329
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/19.10/x86_64/ruby-2.4.4.tar.bz2=aba571bed773554b18863e6b942f2bca743729834657689a016938a34b7e4352e68d9fffc440b2fd4fcdd1bed4d1ba5dde689da535088d7ff8ae7dc364ac3b2a
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/19.10/x86_64/ruby-2.4.5.tar.bz2=0e46655028859f5abb64d71a5585db638d00edb9d20a487739d307bc1dfa2fca4ad196e04044dceab0e279286379e73110590c772a06786214c4eb23557324f9
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/19.10/x86_64/ruby-2.4.6.tar.bz2=177e9f0a193f9dc45f8653306cf6a87bffba16780220fedbd8be67a3608a8f8d370011f3993590d58805a8ea4833d95196385fede4b513d908fd4263a82f113b
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/19.10/x86_64/ruby-2.4.7.tar.bz2=88bfad0d6258372d4e9739613a07352e954db3deb43c0e2d2a176f9cf55bc5e2df73e4cb04bda75e2dbb210799649f020a7284cd2acb5fb92d2b115a933a4f03
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/19.10/x86_64/ruby-2.4.8.tar.bz2=3710f83ed7f3f30c9b5d3dd515c168534d01811cd33f20d3a54e654dfb5140afc8198f46dd823ac45072a83d844ad866af1e2b8265f54f9997356be88fa254a6
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/19.10/x86_64/ruby-2.4.9.tar.bz2=078ce0d7433e63d947fe4cb0cd5a14e6f5fca00b7309d7288359ed90989dbf618bd8c1f5f31b607f3ad6b0cf540d715dec2c38cfbf71cd170e572321598bde7e
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/19.10/x86_64/ruby-2.4.10.tar.bz2=f97f877f7afa604dfa7e8f1b399a4c034e79b616c95bd4e48927d88d1e8adf8e203901fa178f93c6af4511d26a38e2d8cced7225c2e75457bb02dc27b8feedad
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/19.10/x86_64/ruby-2.5.0.tar.bz2=ad619ccf77132166151e4982996e93135fb91d97701ef9aea12b6bd05e18e585dc4d5fc34883b3369ebba15474741db238fb90192eb273dd5428864429525d9b
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/19.10/x86_64/ruby-2.5.1.tar.bz2=9094c9bbda4c3d830382e89e4e1c24fe43cebd9d733b6878a43a34d679092bdb6c7b23cb3cc08d4efc6e15449c68862799713006703f95e2862bad1c0b0bb94a
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/19.10/x86_64/ruby-2.5.2.tar.bz2=54c8fc2f2a99f834292b83ef8e68e2b120f20fc4ff74856c13137065b95262f62188ed5c6ffea8fc4b0c1034d9f8a1b497878d6a581391d422994911f5fcb35d
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/19.10/x86_64/ruby-2.5.3.tar.bz2=b26daf1825cbc9cbe51e1abea84f3aae542beec7c26628201325026b4d4bdeeb46f8053a1c105973242ef532e66bd4eda5199dc1aa4faba1a6393f9cc126d856
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/19.10/x86_64/ruby-2.5.4.tar.bz2=e5718fb13f2fe7f6b34fbc2b1a6db95576fcf9cbed481fea59fd4dd28d064104a912a1000533810221141ec09e9fd8d1e59850ae5a26ae441bb6d8878f42c418
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/19.10/x86_64/ruby-2.5.5.tar.bz2=71ae2c5bac04a97694310daf76e896a1a02c245274e9c96ca96740f78a0e245302564bce757f1688d3e83b7c0c88989f702814c434101f8df786c1276a4f5a2d
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/19.10/x86_64/ruby-2.5.6.tar.bz2=1693ebd7cd3a452f51ce2ef32144aa36f6fa8121ec68cd0fff715db8981214ea9fc729099e4495e1e8bc346409551d4b93c6c3803fe187fc0c25360b80caab72
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/19.10/x86_64/ruby-2.5.7.tar.bz2=53b05c51b970a239fab953dcf3bb433f59465fa0b4dfe58066132a1bf6247cbe4adcafe41b219ba453ea392f88a521349df14d58a91a855c53c9b9ba4cc16c4c
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/19.10/x86_64/ruby-2.5.8.tar.bz2=b9b0d99e590a48ceedbd1d6318c29b8fecc12b02ce5a6f1555593eb1b3e284c766f2f8800ee3070fb7a041593e4a3806d53590be760381268ef0f9588e127b08
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/19.10/x86_64/ruby-2.6.0.tar.bz2=90491968190f4809fefb4068fcc37fb7e2ef179454f57c90bf2af308541f1ec175a72ded53202c1e86dbb63cb6b47678656f753574bf6ba525e982f3278a7602
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/19.10/x86_64/ruby-2.6.1.tar.bz2=7f9ce1b6872352a6feb539948d26dbdfefb3d4225ba582ef8730be8fd85d5c350bd6f21346d43cfe26a8501c4ad145d733d94da5dbf25b15e7610ca037ad4227
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/19.10/x86_64/ruby-2.6.2.tar.bz2=8544797f46d54cc4098227809561023bb7bd01eb2330724a94921c5a79ac64b44bd56069d7a77a3e6d2d3dbc504ec25157daf7fdf921c3acb3b4289ce1bbfb5c
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/19.10/x86_64/ruby-2.6.3.tar.bz2=fe086aad84ac7fe8009ea2bc16f0ccb7c60a5fc9034690af38fce1a05582a6226dc3d7b80d08d1952d03a9abcebd7b361f5fa2d506d71e1f5aae9b5f31ac22af
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/19.10/x86_64/ruby-2.6.4.tar.bz2=ce06ce97ea1554972b00781332f126e767a3ab98f5023d3dc83195bb36b954b1b497961c74bf31340827d9a5de2e0bb34240accbadad550b2e692d26cb097d4e
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/19.10/x86_64/ruby-2.6.5.tar.bz2=6fa248065a48cebd1e9950ae07f3e653b3e29e369fdd914908be0b215257fa2766b0182e392fb869af51cd498e258435f6d9b45a03452356dc08da0e96877ae4
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/19.10/x86_64/ruby-2.6.6.tar.bz2=ce912342033f395ba6298051b081c89832f656d61ecf2064e9568692552a938599c816d2cd1fd1f9bee721611f890b8329985c69f4d5b2bdbfa6635b48afe3b1
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/19.10/x86_64/ruby-2.7.0.tar.bz2=cbfc7a1cddff0385187a7bf2eb9dc71a8d14912cbbe4e9529b79414e49e681302ac9009b7c8e6fcf92a9f19a0ca5053a6ed25edfdb510e3e4e247474d471c58c
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/19.10/x86_64/ruby-2.7.1.tar.bz2=29b99b3e04325ceca89b64c7846aeadb412215270f6f7c390fb1e275ebe19b2faef811778c0615b2d4720ddd942a2cc209c72e623f559e6c04e78849cc1c1b1e
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/19.10/x86_64/ruby-2.7.2.tar.bz2=f67ab3ac13ae90622fb3664a869b0c584b97df0500384a28bda9c5c36cf2a27ac1f66afafea08bb29bbfbfc1e0ddc444427993ff4163987f5510c4158a90a96d
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/19.10/x86_64/ruby-3.0.0-preview1.tar.bz2=aaeeafee545dd1ba1c4df5b7e46e82f7e89e0dcf4fb10677b7e177e66f86e6825e85fa5ae3e74062363883768b3485495a3378f97693d45f675a6e547e989cba
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/20.04/x86_64/ruby-2.1.0.tar.bz2=3e78b2a73167c3680aebb1ed015c583d4f6c58804d3b272253bee2cef37fd2d1cb3852fd2b408f4af1abca17725d923a1f28d40d2a33896e5cc21c4c6711d7ca
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/20.04/x86_64/ruby-2.1.1.tar.bz2=14e7962e180b9ae16607347ba5360b9ec086eb8055b88d2f60b1c9284fafd93fea905aceb441f07d594a34b53647520f9dec38e4e9f6ad3e5a6850750d981a27
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/20.04/x86_64/ruby-2.1.2.tar.bz2=5b7d88d4405cd45a6a720295cb0b7d3152dd757aac996c8d1a576c6ab2a45cf9ed0b0ac006423791cb038a14153048e96308ecc8ba1e761d4b7671dd6f880d15
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/20.04/x86_64/ruby-2.1.3.tar.bz2=320734a124e26de068457237b5f973278286d7e529e92405c1b856b6e57441b5e76c59d0f519fe43fbdd2c8c48c9dd37dc5094831c0e6a81d804e88888ab6237
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/20.04/x86_64/ruby-2.1.4.tar.bz2=ca34ccbfc24adc4b2c6c5c0e3b27bd2754c2c5be61e9dfa7b919b4902174e351f45128d887c179c37ccd5163a7f51c213fae96be4d0c356e2d7f96acdd4f164b
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/20.04/x86_64/ruby-2.1.5.tar.bz2=fabb151c29ad7ef7432efd4d51ea1e20180006601617ba896f8b1379555f4088d398e96f7bddd7c9815b266acf5ea94527ef4acfad2446950da6fabc3770f788
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/20.04/x86_64/ruby-2.1.6.tar.bz2=2728c38987d41169b7110fce2b507b5d3e971d5b043b60c9a3b8d6d385ec2a40d24e464f6cf081844282d6b9fadd4abce670e79f02e4606bdd5aeacd1b57f773
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/20.04/x86_64/ruby-2.1.7.tar.bz2=f98f4dacd9d8c6c9515ddc2597da8b868c66897577cc5a76819db742f3649881ef5a7f85a880f1e359772b1ab08750dda6fa74ee826938e06b93a9848699b929
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/20.04/x86_64/ruby-2.1.8.tar.bz2=47fb4b41e60b1e536b3a54e18e9ee92aefee7eef92d49716b46884b2a3d73a02e88e4815df64baedebff80e9e17ac7b0af6e65b406a2c53a4f90421dbc948415
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/20.04/x86_64/ruby-2.1.9.tar.bz2=c81ad5e16aa18beb7c34eeee68ffa96da243f99ff69cf00932ad5ebe427c1f80e3f7fee31b15ec0d96c1be5c2007dfa6e96c38114f61e958c6b7ecc40270db4e
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/20.04/x86_64/ruby-2.1.10.tar.bz2=856210b3eb2bf338c5da2668e830b95d48feb82c1c4407371b18c772df12878703a9eec948a2778acd098bcc8eb402ba6d57b2b935766847f3e652c3dadaf6f9
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/20.04/x86_64/ruby-2.2.0.tar.bz2=6ea5e6338319e5d6861d420b10f93b5e6634a9925380c61acfbb258b6609ada76bf2a6b474b53a30b0a81f0dd81cfdd1e610b68698df73f69091f479ad39bc63
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/20.04/x86_64/ruby-2.2.1.tar.bz2=8e8e4ef137b9394ee34b760dbeaf4d23953bec083e5775a423ef6c16b75faf8bdfe99df975ab6b6d762509536b017f3510a9a5e9ab63060208edd4d2d96371eb
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/20.04/x86_64/ruby-2.2.2.tar.bz2=756c9ecbe3c9801a0a364143478903318c524f7aba026239a1fb42d7390f74110805543a9ac2a9f8bbbeaee48bc867fd15d400d8bd46576bf4fd417d6136a3b2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/20.04/x86_64/ruby-2.2.3.tar.bz2=594ff95e33d0f7af7be448a781ac68f895f8344ebb1c9a03898813baa5963024aa84b11baa405fa584070e4195fbfda9b908f1fe171f75f19e5e1d7879bdaaf9
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/20.04/x86_64/ruby-2.2.4.tar.bz2=a9703c6edcfa2ddb87bb73c070d963fc4d59599919865be9b1d93989906698c6f3b9c4fd7f2d597e5d710276555de0b5865676b92aa3aba1f1f41be4052bedc1
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/20.04/x86_64/ruby-2.2.5.tar.bz2=dbd91cccc0a00a1ca7e901d56f9840e62e4f139ff4dbae530169f41897d06523c7e8977138ffc6212e1b60589f3091a4e2f6b6714c0fad22fa65e442b248f61e
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/20.04/x86_64/ruby-2.2.6.tar.bz2=ec967415b5bec95154cd9ff8338a602a6d005fa647afb1e1cff54a0fd4e9c0697b9e952c2dfd8e4b30068a697f5391b9cd165d5d33f3b146fe35f2a8fdf9823c
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/20.04/x86_64/ruby-2.2.7.tar.bz2=b8786ef31db7d950b1309646f81e6a99d56b76223bb8d2d20ae045f09917332a869b14cee1bf235675c7d8eebc6942b5ebd6cf0cbd290ea75d9f9be1475352f5
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/20.04/x86_64/ruby-2.2.8.tar.bz2=4d949a715a04cd45f6817b1b26093f7bbf03ca630aaa015972e7d0ca72bae094add18664e1489ebf8ade27c160d2fbcebdb105701d719461af13c4d5fcf2cd22
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/20.04/x86_64/ruby-2.2.9.tar.bz2=ec6cd8bd90ee99aa6470d9d524d89531f96f992efab8a9d6a709a3959ef4c314828276e67b84ed97d415cb3e0c837458d13732dc940c93d4d069d9b881d7f92c
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/20.04/x86_64/ruby-2.2.10.tar.bz2=1f60cae30581e3467c7ec07391de5045f238b61a49661ef0cf76d72ef78d220b7ae70b86b1e72625cf37085b6507fb1dfccfbe5554195f0c6eefaa996e199c16
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/20.04/x86_64/ruby-2.3.0.tar.bz2=343f5dd6703b6b58d61fabefc8a50ce5d02d98c32c8b4e52b8deacc9824369a9f0dc8faff69e90ca7585a194a4d742791765b16c3f5e2417b0f54e0e6f6220b4
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/20.04/x86_64/ruby-2.3.1.tar.bz2=aaf7f9e30b3998b8586764f61d09e434c32aba7479aa79fb6afa71ab11c067384ef3a4b9215a1a3639da807f4f642b9efc62b37b55e989b7ed7d75cedc7cab40
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/20.04/x86_64/ruby-2.3.2.tar.bz2=b834ef95d52abc1f0c224193391bded9b4d2089c694378dd5aa45f8b2b1ea41b1c300445f766841cbb8cdb1114491ffe0095f518e1600746f5f583dd0cff9c1f
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/20.04/x86_64/ruby-2.3.3.tar.bz2=9df5ba9423e0a8af9d825e59f8c69889c70af0f6d67f96708a02d7d61260c83474e2f7b2f240af399911bdfc56850255b4f34554f7013d0417a13bb782403aa4
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/20.04/x86_64/ruby-2.3.4.tar.bz2=1d4b55a6a34249e82880fbacfc1d97a093600005deb982c6b42ccb14bbd7bf1db14e0f6d73bc25f1addd72378850f7edcd63738f2b3cbab569e34e89d563188d
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/20.04/x86_64/ruby-2.3.5.tar.bz2=29a76dbb28d5b63ee0ce64cc2e7d022118350a550d3693b8e38d559bbc4f42fdb6b63af4bcc4ebfffc5c0fbabbf2e18db7228e655de3bb416e344a61737870c7
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/20.04/x86_64/ruby-2.3.6.tar.bz2=122322fb462f8fdcb065e6f9d9968027c320ba9be9ad6fba9011760a7296cec1892a0780d7436903cb7763f5d18cce11860c5c7fce82890eaa139a94d5e89428
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/20.04/x86_64/ruby-2.3.7.tar.bz2=0c17f52a74b73041c588ed76f73862d179d7b9abf9de61279dc74ba7b7f170179e0db5672a403dcc209b6dec9a865a88a382f5df01f5e6ba4cfe0f66232b4a15
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/20.04/x86_64/ruby-2.3.8.tar.bz2=1a30bbda34fee311762a2f05ac7fbcfb4f373f8840f86b9762b0c07f1cd397e3eb3be83210221384333b625a243c7161ef4f368602a613760391265309e4f304
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/20.04/x86_64/ruby-2.4.0.tar.bz2=edf31b2dd02208c96be25c2f4f7d35e2b122e5d327133545e16038836b848b90f81079be4df47c5493bf4ead1d464fa72a8d0d405bb2509ab0db6335c58ff793
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/20.04/x86_64/ruby-2.4.1.tar.bz2=91cc7a9cf493c7361f3d507cdbb8e258b7dd710100cca8053b77569c07c04fbc2f72fdceb9fd9a3a5d01f4c423a206da97730c356d017157bc2454041e1f1fd4
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/20.04/x86_64/ruby-2.4.2.tar.bz2=8ea603a27560ddde5fc639b86381a303f886ce80384d8edd0e7bc806f10649760d75a76dd5f2ee445371254e727544ec12df49d7fc8876890b73237f4eecea1c
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/20.04/x86_64/ruby-2.4.3.tar.bz2=c42f24668695be5c291836ae6f39b4366e0357c9bb63cf8be2ad36cefe0c6d19cb921a43159d49d4d062dccc15902ec1698a1a6842d13ccaec45c6cb628da4b7
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/20.04/x86_64/ruby-2.4.4.tar.bz2=3ac89131407faefde80bf2e1bed4baa51c371ab4bffc18c8dcf2624f4d1068c9f933eb66486a2bc7c6c67f674c5bd06747bddfe1f1f9dcd939458a08e1bc6108
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/20.04/x86_64/ruby-2.4.5.tar.bz2=8ca9a9387b8cb434828fa36e5886bc8a28d70fa46d3e20df60389880477fa2ee54fe63c0c14611a2cb0168ef1149d205640c6003e6a507400ad5fc34fa641bd2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/20.04/x86_64/ruby-2.4.6.tar.bz2=52795cd7d112ff437adf603f58130ce539209628d2224a685d060d67a07325717981fc6f91736d4abfe014ccc8057bb40a097fcf85f5046aabde0019d08bef16
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/20.04/x86_64/ruby-2.4.7.tar.bz2=bc179a31c746ac6e632ce08f57a8f403d4e463ad72285c0ce008d7fa39b88a22be3a43014c9eb019f6a39d022f9448ef151a8d03e89a4d2e767c4f77684e3750
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/20.04/x86_64/ruby-2.4.8.tar.bz2=d693e3a800c2200c74b24c207425f41cef206a0b3f20625d18b1590e9891f409d6643ee0e7ab8fdb6e1e85de6fea52c6a307bf8f65324ee0f9ac33306ed1e876
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/20.04/x86_64/ruby-2.4.9.tar.bz2=4b6cab99f6b7be7705efa5eb6f321b5eeb1d1c6e96d4113bf96b57378aaa4950b39f40ad555f630f17d216d235972f028617ea43c28b1970772ffd16be3d9a67
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/20.04/x86_64/ruby-2.4.10.tar.bz2=40bd90d231fcedbe34ec9963eb59645fdd1036b03056b9b8fa3b56900deb86d94e2a256f90e6aed297288d6797857a3ef9fc27bc6ed05c017b5c8e8ddc465df1
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/20.04/x86_64/ruby-2.5.0.tar.bz2=c1df39ae526da7ebf87510017d7694e6f78c59871baac4e9c5f2d13c22cbecc30925e2783ad93f741110b7c3802e9f25a6c3ff85160b33a4080b0f1fb02f7740
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/20.04/x86_64/ruby-2.5.1.tar.bz2=930f6f7f654fa14076c84365fbc771d5b09679588c4c478d8f6944770c53fdd37213bdad159fd231efbc079b85ab7ab648b0a97fafd666c38d0e280046c6e2ef
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/20.04/x86_64/ruby-2.5.2.tar.bz2=cb62ca82d57dfc0e21e532d4b523f49c559c4ed5f3d73adbd9d650bbf23c694d382f3cc25eed6a8630f23e4780db127b4b8b6ecf6fc24b0f6febc820dbc6af3e
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/20.04/x86_64/ruby-2.5.3.tar.bz2=708209a89a18cd99c02392307d2bc63e46bd38c72c8ab0e982b28285f8e006d4ed77e04da3900c880eff01c3350033cd00ffc3be1d3a12c4ee5b263282f0dd05
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/20.04/x86_64/ruby-2.5.4.tar.bz2=c94f5b3129ff41da1b07da1cf742592e9822febf6bcfd0e9eb7145c00b732fc66625056bddc72fe9b631742c70d0e731cc6a9a16a089c7b559ae963b072578eb
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/20.04/x86_64/ruby-2.5.5.tar.bz2=b4d20f79eebc5496768fc6adb0735c6a23cffbb39ceaf9c2da42851ff7842dd2318c07877d89564176d206e22b8824d2a3c637b5ef02c5caed0b2b5276581032
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/20.04/x86_64/ruby-2.5.6.tar.bz2=a09ab93c3d6936d30065236ff2abbd0295988a9359f5a76425cecab47af0ca5b6829530d1708e9ddc9e78d1fbb7c0359b9c7e90227870537d099ccc89c73844b
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/20.04/x86_64/ruby-2.5.7.tar.bz2=f6086c879f8737eaf6eef4461d23270e9e43811186a22f35ed69a8303eb933136e7a690bce2d9e18bcff730725292075e09db0f2384d0e26018b7f2a0df70b32
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/20.04/x86_64/ruby-2.5.8.tar.bz2=62c631026560ee310a849483f1b48690075477942ce86e0564e92f5ca7834553c435a35a1d6d8dd957c3a7be24c63c32104518995eb3a96e61066a04887bb0d6
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/20.04/x86_64/ruby-2.6.0.tar.bz2=908132a47bd996f8c76bed54078e71abb154294f97dcba779b4cf0d3b82e31c4635dff89e97d5f6b4f1d797d854c6d020afdf9dc77b10c0e522755fa194a17c3
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/20.04/x86_64/ruby-2.6.1.tar.bz2=39c867ac0af48410c0bc6b01f1ecac00616a59cc07f3f5a3e7cfe8f786b70c7cacab65550dfee777d11b8b7a3ac173bb22c602df370eef6a04b40f8e539025ae
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/20.04/x86_64/ruby-2.6.2.tar.bz2=2f04566f6d778121281bc6ba23ec57ad408049e649b351585bc9a3184848c71873910e159f7fd3909c7372378152f5ed264070aefd45933b97980e80f6df4deb
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/20.04/x86_64/ruby-2.6.3.tar.bz2=940375b11c525e3f0bf00e19013eeb886bf85b8d8b66d86d53740170b0ae16b14faa491dbcbec29238f875f84204cb0d52ade17c180d71e129cef5254f338f0c
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/20.04/x86_64/ruby-2.6.4.tar.bz2=1c9d41d7ab7bd69d7e3baa3c4149b1938cc147beb2a63923dadf2fd959732c8cc824e2add0946bcd62f44b0e1d509b80b4796a5929841cda8d28f3a8207b17df
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/20.04/x86_64/ruby-2.6.5.tar.bz2=f47443a53e3008cb7b7b7afcbbf1adf44887769e42b3defafceacc1e50e349c9000b98010f853c6b7cafdb54b85b640732a56a8e11ad8e58fedb5fa4724f68d0
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/20.04/x86_64/ruby-2.6.6.tar.bz2=fc1c9a08c48ad91edb4afcac5244f386d63940fa906dadaabe02a1eb025375443c8174a6ad1acd50f4583d6c57a88feae86e697ec15c8a25bb49f280b1357783
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/20.04/x86_64/ruby-2.7.0.tar.bz2=b41557c83084c8e5bb263aa944499932ce7d84457e4e307f1cffecf62aa44f8543a06299e38fee17ba64f8952048612f9289e24c35acfe2ba02b913c15dc1405
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/20.04/x86_64/ruby-2.7.1.tar.bz2=001d10af5833a03b42d9a254bde844731d3a796d98ce2efea90fc68e4638c7cc3be31a34fa163d4c5ac18c60e685e5cf2ccf88fac46ae6bc587a48ea35cfb09b
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/20.04/x86_64/ruby-2.7.2.tar.bz2=0a8681afc19372ccd9409bb017967f86c2e6642e083ca47ec904cccc34242040f710392d916a69a327ae6a0bb287d97bc05bbe116a1d93478ae282b32e5fcfab
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/20.04/x86_64/ruby-3.0.0.tar.bz2=92a3b217079f9d960cc4fbb5908f7fc7ef71cc3ec8e5e404341e2b8875534c0542167d03b61577776e0b0f049f9ba2e3235842be381b4d484845768adaa6e3f7
jruby-bin-1.7.0.tar.gz=1e466a3f8d52b553c9def09827fda4b8433576b0262c40ee505602754521a00defd821d5ead5052be52baf281c6cb080fd03a8b15c628a0ee67b4e417633e5e2
jruby-bin-1.7.1.tar.gz=ef28381ca30664cf450f9d3df9927530db771d30e86ebcf535af38e1a7e26724ae2bcfe8487cd2eb349bf609a733a25528aae14beab4d13d298b5604ac7353cc
jruby-bin-1.7.2.tar.gz=8155c81eea6743951db7383bd9f6b1750614927c9c0b25a6574f6d64898bb3ada2f626c6e0df6c5486561a03cc7d472fc12fe804ce66a3972d2fe02e3f407100
jruby-bin-1.7.3.tar.gz=1d19be25bf4a7dbb0edad71008704377893d3967aa4204a0d59d6883aa04462ef6798c64d0c0fdd3f5129c16ccb42e8507f3fef38ed56054bf6e689de745935a
jruby-bin-1.7.4.tar.gz=d7c0ee0316c50ae5413757e956c18ca68e9d99a25cf85be978da0787c13b8978d4ff2712a3effa564cfdf07144be4a56a0cb8acc794a01f43264fe8baeb125e5
jruby-bin-1.7.5.tar.gz=a4984591a3809330b93f4ce79fd1b9c24360f89d88a03bbc76351be623893c4bfc6441375bbea452ba4f24ca8b9357e03ac938fd6c065b3e2348c0f896b22a1b
jruby-bin-1.7.6.tar.gz=98600a2d46bfce14111c7eebc62716352a4b685043afdd696b8fe51c6b205eb9569fc2860423a653b842b173198c76c59767156aa48e0d23482dff3358d884f3
jruby-bin-1.7.7.tar.gz=71da2e72c65899216fa15ec568b51aa7004e2ed7dff99ca376b332d3692c83a674c688dc21ee04d177a3961a2bb3973714509d88cc14d0ba9f79c864c6258a06
jruby-bin-1.7.8.tar.gz=42d54243653ec260abdafecce1143161be63fcc38a80f71ab70fcece4bf91545a2b12ed2319f9fd6f6b41916c398a9a8e89e7f0389f59da56f2739665e74522d
jruby-bin-1.7.9.tar.gz=f519f53b1d9f57cfe28982ad70b892dc6fc20fe6601d98d65a1dca9f617a0eb8fff74d0fd82ddb858fe105d05ca7c7bbf3a987677ae0363caa2981bea358c096
jruby-bin-1.7.10.tar.gz=160b701f2f500dfab64beb635e5c4dc57760dd422d0fffe8d3cf8d84ee6ea17a877ef77a0087b4888ea9db64ce7750de01a73a51530aa6666a2efdcdccdb89e0
jruby-bin-1.7.11.tar.gz=a53b0fa327b98344cb4a8aad1ba537ddacb709a0e173b1e32656de8a610cb9896e9a4554d54d0d01d2361f8ff1539a0e2ee01308f670df2004225231b704065c
jruby-bin-1.7.12.tar.gz=bf2be8a37b53d38c75712a6331f96b999fa6b0e87f453fac7b9d11eeb1b66098ea0778172f1a6a84345e1881f05d63012e28d4068a0bd31122bf2473bbdae5bf
jruby-bin-1.7.14.tar.gz=f14e658da7f2abd469edcfd657dbc2505d6a2c04ba1e5f65f2164256f54625da154b338bd3d286ea6a18da61d04d90a61ad6b012bd9461182753483efcd0f603
jruby-bin-1.7.16.tar.gz=47ca714c3211c95c84e9c80ae4fbc894bfd7ee03e1bcc494cb48d839f8538db4aaca7029a4913b8d323e7227450e4e41bb943dc670f43df8a654eb127012033f
jruby-bin-1.7.16.1.tar.gz=9bacdf6e212d08e46ac2c49183c8611873f6ecebfcb0e928b5110bdebfeb8751ac087cf8aba09afb9a8ccb58e59f3c3e06a241c1db445835d7a875b0c3deb4b5
jruby-bin-1.7.16.2.tar.gz=349283bb5344a62f282021ce39648a0c8d0b41ecf8f800ab5099b5ce161ff771e688f205a918324cef6ba0ded6b3694b8dd83f46f56be584202b8fee496b37e7
jruby-bin-1.7.17.tar.gz=a3b171df08e789f91c260c5a57ec842a5d62cc8d6b462b772905ec5284e394ed7b78f5b327ca1ff20f5deba8371a86cb03fade75b5f34f233df47bc3f08d469e
jruby-bin-1.7.18.tar.gz=b259da2967e246a387687117eb13e8986b57de6ca8e570d6f8f8f07b8097db6e01cea8b0ec3a860b091fde14de535260dc6dbfc638f9e9b49d348f726e969642
jruby-bin-1.7.19.tar.gz=da91efcd51cfc833666f8b7cf949d3b5c41cd8da99ae1559c88a7358fb48df1245c66702c7cf23e7ca012cbefae98787c200352976d4e8aa3e9120057a89dc8c
jruby-bin-1.7.20.tar.gz=77131afe46e72c406ab4250e43cd1f98e59a8351c494044ac89f97a7c9a81492f8a8194541055fcf1fc59569e99a577fd6a36a9f6a3952a99f399d4970e80e69
jruby-bin-1.7.21.tar.gz=111883df12a60d06e9924d33057ba72094fcffd44f7e3954d6c6d2190f8e6442804e739cc525a9e75159251a8dc1cc487570792b1b4f5773f4d0082f0eb360d0
jruby-bin-1.7.22.tar.gz=6ed6cbe7b81a8aee60906fdf965bc217b3db794698e2cb37559f36ac119a0cd2a1ae1a7a766535ab491d647e8b4e6b2f63e62011714b757f8691455831ef365c
jruby-bin-1.7.23.tar.gz=6f4b97c4e08274f96195deb176e3126e8d047c981cb655cded9665624033fb905d60d5586704a3f91b2ca06d7e78918d9d31131c93e4c90c75a38182e309ac9c
jruby-bin-1.7.25.tar.gz=a89ab8d539bff346ad56d345b6a205f74890b9aafe82a2c82e7c19cfc30b77fefde1003e8bd7ed15f141151bc0fd21946203219691383a64f2234fa586e1905b
jruby-bin-1.7.26.tar.gz=feee03a50900e459d9ed7d2096056bef126c4551c02c335c4132e2307411f3fc4fd435e8fe44411184773c80f0630a7812b3d798b7e9be2818e1b5a712bc6995
jruby-bin-1.7.27.tar.gz=656f4313fbfe5db8d2d4fc2087a012c91efef848394c48aeaa0041e9a19b87ab74686702955413d2c51d6b4b11c758ba0555b30fdc42e86d66094411324139b6
jruby-bin-9.0.0.0.pre1.tar.gz=988c6a058336ab9ac8b27c7501ceccf3940837f9b9d3ed32a466b891bda1bc13f76199f5bc3baaa1240dd0dfdaee40775f721294d667f3b8b5bb9ac8206e2e83
jruby-bin-9.0.0.0.pre2.tar.gz=f207f9477a12d7ffacd92b1bb5154ba8101dda8f7b2eeadd4fa83eadec9a75727bc1831733d27fde63ba63322ec491201dd23cc6e2c2b5a4b8381a8fbe49e8f2
jruby-bin-9.0.0.0.tar.gz=33308a983533c129cffbf521bdb8c1996a10a6159a4a436248e645bda682c5a5395ac1aa767e971ae679c935f3b61573cb22d5b8c64af026752db3411a6356e1
jruby-bin-9.0.1.0.tar.gz=277dca63f3faad01c98a793f06bb4d558a970a10a66a38482e8372b25f4cf4fea85f1d5624fce7fb5b4310c42ea8aa360f24f6b9b6ef4bb0ebcb036736009ccd
jruby-bin-9.0.3.0.tar.gz=d82f83e20ef17a0675843e306ec5e90993e5952cf5a53957a91e369d2c90d92306aa515b1e135c04b45844a81a0f4ae34289b966821ae5f46ea51fe012627352
jruby-bin-9.0.4.0.tar.gz=b9cd4f4a00da8152740b468914046633d5341b10aa26b0ac56835d5896531030c8afbc4c965b30c36923555ed5b145de8ada69e05ca38b01d43621914a331335
jruby-bin-9.0.5.0.tar.gz=7c61cf010fbae571cd6ba334aefcfd917f6de8224d014026297b840d0b890523e94b2fea20f154c82c25c4f9d5992b9481fb569646a7023e5ddb42db1baf5f34
jruby-bin-9.1.0.0.tar.gz=1ffdd352823436086ebfd37c03401a1f3a9cb8a8c5f75476af1f704c4764396a20f49ddb7fb7f0911e1608f7c88a332944330b8849d13e6badb170efb736dbe2
jruby-bin-9.1.1.0.tar.gz=475acda79ab8c54467ae70094aa86842959200127c1e92709f0a731014c469d3e52e4c48770b64ab1bf31e1b710ac4570b421077c85c08071c1356bee55a2900
jruby-bin-9.1.2.0.tar.gz=cc6b1e1a2907c128dd04edf9da11933a54bbed5e861ab6f0208505bca5aa2aa9d9acdd04bfde65824346fbb435584081fc8ec2e2e9a3aeea1bef8047915e0c61
jruby-bin-9.1.3.0.tar.gz=88339f4cc05f7f0ded21f100755156ade33f19873f49c0c64110916da8c0b059df541a77bb36e54fda9cebf042591450d2d6312ffaa879df926870806985e774
jruby-bin-9.1.4.0.tar.gz=ebe0e9d67cb91721d589461e93e26338e3e3a1f0f98de53f25906684140b49d989ca6d3704cd3f6cbf650f30aed9a3989f117bb4732c83ed870364ce4c31fa36
jruby-bin-9.1.5.0.tar.gz=f2a11e6fc88d37fc1b640ea8c9feda4607bea6da5e6520f61ff85e8d6a51543612ae267b45c033214f8fd0e2283153da02001cbc9fd90be4761b7544e1413b9f
jruby-bin-9.1.6.0.tar.gz=ca59d199a0fe791efc57f05801ae26c6cf6402bdc0f1a795250b1a2dda39b233ed24c8cb005016e79727f4bcdceb1bad726a60c16935e76fc87e5d1a078fb5bd
jruby-bin-9.1.7.0.tar.gz=f2569d4858a33280e90d984aac53662c25ef057ef9903bace6a2214aa2e6a537c9bc8fc76b08f846b3093cc4a12c70c98d725576a4ac771e640b95cfe3697c7d
jruby-bin-9.1.8.0.tar.gz=dba3b41b65ff27dbaa203a5cfc78ac7cb9d952c52b452bc774f593383e4ef9389c0bc37549b798f48b63497ce7007b1ac2d2fa252d9a7c3e52146b4ae192ee49
jruby-bin-9.1.9.0.tar.gz=f8f6419be34aeb7b7577e946a62a094f5921d7319b51876c5e07322d99249b3a9f29fea4ee5c2b8184dfccbd5da8f8262fa97f5e93874887f3355dabfccfa0df
jruby-bin-9.1.10.0.tar.gz=857783bb45fc5d62148bd687b43af9ce776099dfea75ec4b5d947a46ed270568bceba2a630a3277746a3a9c1fd3111caa9a4cd13493ea8824c1ee190e6d2abf1
jruby-bin-9.1.11.0.tar.gz=718ed3f5a39cd9f9b45c4e11ba44cd32e035f8d9f26fe59230dbaecb71adfb2513ee1bb86ff72e075b02f20151f3f30e53bfa30b6c4b011a93a138d4f479fbf7
jruby-bin-9.1.12.0.tar.gz=8a9f88d517d8002be570aa95aebb0063eb62a47efee191155f9fa4f045854910f78431514f857c438167ec42f4241faf74d4a8d236ae36feae58732312e4bbed
jruby-bin-9.1.13.0.tar.gz=ef88f613ada2665d4f63b2e2f15594739de8ba501406e76de417821f44847b0e258524687b0ae0cf5b737520aa4dd9bb59d80a4b89a81408cda638f28bebbead
jruby-bin-9.1.14.0.tar.gz=d15ae0c60421951b830524acd21a0f2a56f480e983b148a2722cd36afed8e99a41f518eb8a679bfa2cf87f08637e81c24ea88be40c0a5390e081322f1fc6f8da
jruby-bin-9.1.15.0.tar.gz=74a411f42149510180706b2c70610caeea357f6fc3d2a12ff0227586862e6a9dedf09e752596d6c486af7a310a07241f311a1dfc73ead229d7225c09d4508605
jruby-bin-9.1.16.0.tar.gz=94e88dbeb2545250ba5bef50bbe0baa6f3851e9817f67f879ffaab50048bb0d41cd7a0e87ac9ef547e37c2b82cf1d7aae6b8caa43d03c6a9931b8ce0ad4b2afe
jruby-bin-9.1.17.0.tar.gz=4c06b9674e20f48d3815b4084bb38e6994670eac804fbc56d717cde7abdb74d57e0ac17b7fa0b500318de405c187c3eaa01441c22621139dfdbeef62a5467a63
jruby-bin-9.2.0.0.tar.gz=79f5e8674089d2f6b260e033e3ceb4571f54cb5cedbca74ba76b52dd7cb30085a8c6c2676e9be57a8ecd9e962fbcb3682a8de38e1cdde2dc6e05bd179556edc3
jruby-bin-9.2.1.0.tar.gz=185e67da4964c9cf1d9142446efa77605e77894444bdc96bbd10fee22637f197aea9fbb0f60d3a42540e5f383d5b06fcf095d572f432544a40c2145deec81926
jruby-bin-9.2.2.0.tar.gz=85e16e38748b6ec5f237eabc8a17eb225c484c20f7ab6728f2a0f650061bc50c8a9601c04b0128e73c410ffe84dacd2b8bb37167aae5595728aa25e88c4c9b92
jruby-bin-9.2.3.0.tar.gz=97ee210157c451567946b38d33380051f82e7e8cb5f7649fffe050542ff6cd627e2c42f4c46739d1f0995c87e7338865b18844741285bf3f72364aa3c841c54c
jruby-bin-9.2.4.0.tar.gz=9fe1506e862a17e261cf726e1bb70a9f612a6d7beda919a01405899660d1f4b79ee690ddf9aeed1d2b2f3cbd698be8df4f98d3815352772cc680e9646d721761
jruby-bin-9.2.4.1.tar.gz=2c41e7884cc54819da17ea9b2b773d05d3240d53a2ecb57ba430ab61308066eeb1bfbe6627e6c261f5f27ab5df7f5972656366a04a191a81b0379f620b74512d
jruby-bin-9.2.5.0.tar.gz=d548eba8de420c80062021f5b6e6b203f8b7b36e3f11409919eeab87a028a18f9346f27d2cd8b1f33419adcc83fc804a36dbc3cee169ef1d93383b8f5835ba2c
jruby-bin-9.2.6.0.tar.gz=20c7897da0d2b585616ea5848998fe8770517e24e16955797db2e5bff4622c348082628d304240a71a97e9551ef7aa63271cfb728eb5fb7e7d19bb48aff20d4c
jruby-bin-9.2.7.0.tar.gz=8e71e27fdb149cb7470fb736e7ce858719d13ce6ff8a1e9ab1c1dc71fcc068fb601946bb28ed2feee3670b5e6ebfa8a655a6618d1badfc3763897912c41b1c82
jruby-bin-9.2.8.0.tar.gz=7f71fb5bc8c6c31b31b4c0430ae091871b21aa345777662f264c728c60212365dadb63a7a4b2fff31adbbf8a2e7cfa678d47486e28840f57b86cd45fe9354013
jruby-bin-9.2.9.0.tar.gz=7df33150858ddff586b3bd86120d4bdd80546c7f8e62245f61facbaa5527400a1aebbb33e4a1a8af52066487e3d29760eb96c7ecb9875eb9bc954ccbcb37a4d2
jruby-bin-9.2.10.0.tar.gz=f4ca024602ddab37154f5547132accb26e7c0ac2e913ebe1b5c7806727eb148249e76031ed4623ab53814beb8fb3f472e386f44d57adb5d2b3b00fb2773c8a63
jruby-bin-9.2.11.0.tar.gz=f736a9e139694c84d0a5ea42f36b972adc82c9be13e0b80bd61045c026e4fe31ccdd4be3dd3e94781c846f356e026465e41716fd2744ded2ab0ca39cd33bb46b
jruby-bin-9.2.11.1.tar.gz=2f758fabf5910ea01e9c04c7600d9c666f2df3db8622f3eeb3534578075ce65013c42fe9ea6f95d4499945f795e6d566eed2b1545e149af823eb1d29167a1223
jruby-bin-9.2.12.0.tar.gz=1dbc5bb3814a6590f5e8ecf4889152684b5625fe81794a2c4064d598614a85129256002dcd239e294f209b98e3abaf9bfe70467fff48ef66b1531162dc6c3be6
jruby-bin-9.2.13.0.tar.gz=2cba016ad6a376252083122d51335610209d860c41de1902f5cd49ffc2f6b49c350b68df8fc4113c221255af4db7ec07980267b9888369811faf66db369e757c
jruby-bin-9.2.14.0.tar.gz=ee3d17e875dd197f92744c7cba62320bfd3f166bbb2ca117f2910780a7c571779c0940e024351e9d4685ee9781dd207e773ace57a4a8a7011869c8b6209513c5
MagLev-1.0.0.tar.gz=8da29f16e08f657b0d2f147b64f2202ac027db26f85da8dec29f926898f178ac8d11260fd6c0a539a9b9b15eb92d8c7ced86a8cab1861ae7f8a33b6fa468e5cb
MagLev-1.1beta.tar.gz=7122af70530e76b9a4cee93244d6872b49616e78086bc8a5db0f32d2b846560b352c4831addbbecc72e0e3158bd52f26c2da14f5d83a515ead30efe7c538b62e
MagLev-1.1beta2.tar.gz=43b4b831791074f6e8c12f6fbe6ccec2bd0446dae029d3e6717cde1e7adca8462a2d7dc49c14112cb568b5b3adc8cd051767044b41d57ae51f38aca035ff8597
MagLev-1.1RC1.tar.gz=942c1cf43f1a911230aa43bbac1cea2e2e61b5e19af755e29a6a71139d66d304efcc519072dcc3487a2da7462847530564aff4a2159d675e3270cc938a297dd9
MagLev-1.2Alpha.tar.gz=2672e3e5425df2d2ecc49f85df5845fdb083f74a7b242cac75e33d0c1837079ced8ec8b273807326d08e7bf6f95cb4f1d8351f37af8bb38c4150e6292fc553dc
MagLev-1.2Alpha2.tar.gz=4492ed58b6c2b852502a2195836f1db5a80f0619467e4d7b44981a993a5e9a9ea5c9fecf1198de1891583e334bbc3c3a86648ce8afea1137ae9c73a4d76b0f4a
MagLev-1.2Alpha3.tar.gz=6290895b22efb986ffd7305b7d651f20a051ab6869d51310bf891fa3eed48526a8617b69f72793e8ac0b57f99bc5de75f34235ef94de967bbdcd51857efc2af6
MagLev-1.2Alpha4.tar.gz=a621e9c615ffec503910540db770754f29bab1646d8e67650d5b82413bd551adfb0bbbb8155407ccb6f80933bfe8ae1bf9b688eb0defbc88710308bde1325683
mruby-1.0.0.tar.gz=4a0f2927da3401df23d5c19ba566995f76775def3badbb14f16510a271e7b40a833fc61841f89d8adc6d57b5b12cb453708961c16a22133c092fab8ecfcd1e3c
mruby-1.1.0.tar.gz=afa99a973e9c1b72a5a418d709c4aca08dc7449c427cedef5f12db4ccefb15e11a4fd1c23ceb7e31e49d4d2e602c0b1f9dcf2e0f6cf8ea3466f0b9bee23b53df
mruby-1.2.0.tar.gz=bd5de32ba52b6642358752755329fa45a954082122a8983012930056c286ac328fb52fbdd11f34ff7c80af2c0e9a6348abcd5214602aca1150f2e7ae25cad1f2
mruby-1.3.0.tar.gz=13a57306706d2d60693151919ae15bb3621e6e7ed3b5e9c6d3b1c8d44e52b898c1ad394b39946d730ff82a19f5e3b7c2a374f9dcc3b6c6f990581e504f1cb9cb
mruby-1.4.0.tar.gz=d2dd6e17c7f8e890ef5b6887538cccdea08a2376ba8f9a478d7d5c4377fd4c31a4af6323b1fc73952ef80e5a4778ca22eac3d724ce7d50b76770f7e614df7da0
mruby-1.4.1.tar.gz=2cbf155ba7819211b6410ea606c4d0db3adf4f47a4018ac45285ab3e32b94f280aa0af0936ead7233411957cfca62979d14bbaaf0d8f40521cba5c12272f2af4
mruby-2.0.0.tar.gz=8379f76b7a06d280e2a2552eec2975ffa3fe85b99028f6f7c009cd908f95faf3cd36a9975f502a5779559baf3c45a4297da0b6bcc038d213a0fdee851f9d01ea
mruby-2.0.1.tar.gz=74403f928c5af52c615ee2490b0aa685b4d62238f3da3778b3e44748e523e1916f110b42f2e73729be24d561b89a9ae498ff32f549ebe241e97a70d83cf39ded
mruby-2.0.1.tar.gz=74403f928c5af52c615ee2490b0aa685b4d62238f3da3778b3e44748e523e1916f110b42f2e73729be24d561b89a9ae498ff32f549ebe241e97a70d83cf39ded
mruby-2.1.0-rc.tar.gz=f310b385cbf80c6b6ab67e2a41b931411149639c0bf778799e3358d6a9a59f508f42e3faf72fef9e8ef91088d6184c445af7933a47e4e2b2fe114362d579bac0
mruby-2.1.0.tar.gz=da28b5a078e121c75edf62fc68fad6d5810212bd53a3424d4f585ffe5bbd09f652393ffea0f4b3ddd802e5fe178554dc67040c39c9d5069bdfad4ef22ead7e8d
mruby-2.1.1-rc.tar.gz=97c9cc2c79a5dbf2f634ea08532f0f512f8af6ffb99ab4eefd83fc336ca9d97b943e76643971047b4508aaddb5e40176d6cc8fa39a17022455aa15d774eb5b98
mruby-2.1.1-rc2.tar.gz=13aa32a35bd5d8f02a9bfd08d17818dbae78ce46c8b0224a029f9f191cb64ac330eddf3871f4396b9221b987a91e4cd6f8933f59814ac0018155ec8454abff18
mruby-2.1.1.tar.gz=66f9b4bebb5a7b19f5cb1be2bd8b9bc65e4dbb5d4350d238ad5f947c9195fd431f2069f7334036ea63a750e9257e59ae1aef16ac99c7e1f4e17724cd1cbe2e50
rubinius-1.3.3.tar.bz2=8b91baf429dac60663d0e4da3152a60ec6e007f5d6c17ffa430876ec88eb87ade44efae90f2e32e238fd74f1b3d54e27492315f08e7bb073220b402e1e2d3163
rubinius-1.4.1.tar.bz2=928d12aa01a1d0f6c80175d67d3b1f8b9840f69f045c8148786612316421223f4cea71e3c373ee18a3f686b1457557ae547645afe758a99d21c4818dff47b9d1
rubinius-2.0.0.tar.bz2=5c81a6b8cf7b59e08c3b9353b0eb37ce985aaf391f5064df65ffb10f6d12b668287e4d4e61e2c6b560d9234c10f0b64bba74259f2c06f1dac488928544d4131d
rubinius-2.1.1.tar.bz2=154cfa93ed59835814b8b974f6d738b049942fcc2b75095d21c87647d002c879fd55aa3d1ec95414b5b66eb9926c25a5c6e3e19a7c0da7dec6edbf434acb9c68
rubinius-2.2.10.tar.bz2=c2168e676059c197123916dd948b83e39bb96e99786bdcaef2e690936b761fedb13740b9f19883f991f1b475f3249ea1696213e8448c41ae15dfc14b3d4e1fda
rubinius-2.3.0.tar.bz2=d0f3dd5e3b891bff2eb79b7810c6041e15fbbf0606c379f89575cefd829ac7a394b0c12ed3c5a4d452730797bc0a2c6c82646a19a078b56dcac7acad015a4559
rubinius-2.4.1.tar.bz2=7bcea320006b8cd3d122c407d89c325973a74c32456ba0b649657ac848f4682f2eb7455c13e3007709c22932bc2e1b65e2dd43fda0d3c9f993ddf8a74d1e2cb1
rubinius-2.5.0.tar.bz2=ac94d5bc11524e715fc24c1de33f4d358c2cd65e92fbb64c850dc8151d2a712d268227733c99fcffe298c3bdd6ce080c5e9553e4e8f3238868323498a9d10cae
rubinius-2.5.1.tar.bz2=9315f76126d0aa754ee63b190385c24cb084f36293a99aa30fc482fd880d5393aabce361e09ff5514bc2540dfede8e179b7e9212b2dd59bd14ca2aa69d209a83
rubinius-2.5.2.tar.bz2=b48bd8d54a450441a50904b07c75c8d31b59822830a74c952720d6f8d2d86e6a27a84775e975ff2bf55bf3346f34e69d742f308933a9d8476e5e78109cb525f6
rubinius-2.5.3.tar.bz2=b923446d325dc3ce5ad28af9ee527607fae3259b85e85aeff97c1bebbb4520daf70616957b1c0ded900ed19e59025826dee66977c19cd2a2d4e9a0296811eb20
rubinius-2.5.4.tar.bz2=75b7ddbe218e4c92210dbf5a06eb8b3c3aa028d16146982a4e813e3af10a90d33f3e239f4508469c6aba17f02cb8bd10e96a204839975e06519869cacd456c92
rubinius-2.5.5.tar.bz2=a862146ddbbdcd4439eb64e78bfe6d09ae4cca540d19869618426d3f451544658713fe8eb7d46493785eb0cc721077e624293cc44d68eea3ef584967b43a18d7
rubinius-2.5.6.tar.bz2=9a0bdb5d77f80f163925ce409d00be3cee34871baae8bcfdb34c3c7545b92fd14102fecb970e42b3012588d299e504b724025f397a5a00e181ab75f1448e426a
rubinius-2.5.7.tar.bz2=8048110b3ba4e5ff8c3f35282896067e1b1b46dccaf9ef4f6c9b6098782f27591ff59ccae0234fd7e881e3aaf17a0b420286b1b52ecd2cb672249655795a6982
rubinius-2.5.8.tar.bz2=23fca2f9747d2b0e544af890c3baacfb7b3a009cc59cbe653762ccdd827a6c915dcc57902d317fa1f7a81f8c12682f6c3a93195331b6de0f705b118e2e8c13f1
ruby-1.9.3-p550.tar.bz2=38767e98df25484f7292437f3cb0f798b3a43e9a7414a5401677e96ad1cc367cb3fa23ac3abe568d5bf2b2ca553713469a8770d41b79bc63daf3fa59cb4e15c6
ruby-1.9.3-p551.tar.bz2=5ea40f8c40cf116030ffdedbe436c1fdbf9a50b7bb44bc890845c9c2a885c34da711bc1a9e9694788c2f4710f7e6e0adc4410aec1ab18a25a27168f25ac3d68c
ruby-2.0.0-p576.tar.bz2=e089cca4867cd9c715f4f37e40a1db9af6ba0c74b47e79568121bb980476f8877a87ccb848b973381edb4667c0c73165f5e1761f60db839e67f6326302dbd864
ruby-2.0.0-p594.tar.bz2=8301a51c73fb63a8cfeb14af47d0c18b5bc3c45e3d62fc2ed56a673a1cd6b0015c41f275e70eb14a9e40036b1530977199321e05285e107a6adf58514bef1b3d
ruby-2.0.0-p598.tar.bz2=10026a04e01a8ad14ea9c99bbdf4f7d04029b73ee0c01bbf6c2eb2817332d49adacf127b646693b67b5dd7010eaf3b696b23b6335cc0f7ee5a6b56dbba0f6f82
ruby-2.0.0-p643.tar.bz2=453117152e6facdcd5bedaa9c3b1e349382bc5bc1dd3d650ec58b398cb9d2519a2822d05da10bcc5dbbb4f513fc5fef310caa3529d176fa2d453befb28e4d83a
ruby-2.0.0-p645.tar.bz2=e9ca186b1cf0877cdbecd43dcab2c5161a53103e926609d5e1b769a4980eab4571bfd0951788b4fc92dfd9d10175b0f5f36ea2c7289e575a9db9b62c02f93185
ruby-2.0.0-p647.tar.bz2=3416af771ebb0b27ceacf23d309bd2a1ede832c2edf48a5ca46f0b0b84b2ab94fb6362a0c7fe4f77b21253539db8161ae26d23a78d1ba729bf03812454d93d04
ruby-2.0.0-p648.tar.bz2=609acf6d6352c9746e21cd7f0e7d29f5eb522e6fff2d5fad0431d63c568cc084ed5b7141f84cd33512d8213200d2d1a22e8d7df71469a980a3a92886133fea38
ruby-2.1.3.tar.bz2=9b48adb161e5e4550a71f61252c8edf59944affb82250babcb64240749af4b672e4a54ccd0feac5b36ea447a358b350b5080125ef2d4acf6e9e8b1ab82612f48
ruby-2.1.4.tar.bz2=68db1567751166c5e7d24b6e5015124b8a15568c50556e1f429486395352fa56c4a195a74820ab135697924149d014b445b345a1b9755678aaf824fba79c606b
ruby-2.1.5.tar.bz2=d4b1e3c2b6a0dc79846cce056043c48a2a2a97599c76e9a07af21a77fd10e04c8a34f3a60b6975181bff17b2c452af874fa073ad029549f3203e59095ab70196
ruby-2.1.6.tar.bz2=75d58120b5f387bcadbf6d19e85624f78c74f81b9018baef39207214673f7ebc0700ab31145acd88b4071c896ba8e1302a29c90955bcf5f8c863634125022aa6
ruby-2.1.7.tar.bz2=f610d2dd6a93f0a5e84e04ddedf847bbcea5dd3289b3164cdf60be64f67a80dfd5f9836ea5d169970cd0ce24a7e05ea6190699706567cb0d5cf450de6a70e445
ruby-2.1.8.tar.bz2=7129c012bca7f0e7cfa51c73ba0898697f7a9f31abd5ae57d38be5b6b646fd80ab33be9b262cd3e2486c66f65aaf4ec6e881ae6e5a82ec9df62f00fa072510fc
ruby-2.1.9.tar.bz2=a86422132e4c64007a84a91696f4557bdcbc8716fbfe1962f1eef3754ee7f994f4de0b5b7e7231c25057515767040d5c4af33339750b6db15744662e9bd24f38
ruby-2.1.10.tar.bz2=4b7213695416876e4de3cbce912f61ac89db052c74f0daa8424477991cfc49b07300e960177ff576b634a97ee8afef3c5aded5d5806329dbd01d0ce7b42b9b63
ruby-2.2.0-preview1.tar.bz2=2f1190f5d8cd1fa9962d1ff416dae97759d032a96801d77bc6b10136eba59dde1a554ff8c0c2d9ce0d3c1361d4dd12ad573b1266fd53b90ab238d8ce39e6b862
ruby-2.2.0-preview2.tar.bz2=c654d4c047f9463a5fb81eaea0fa5ab7bf316962bc7fb0fb356861e6336ce8ce2162c7779d8b27f72d7bc0e9604b5e5af2910abcb0b0a1f197b3138eaddfd4a5
ruby-2.2.0-rc1.tar.bz2=181201168360bee37dceeef3481a69e8a333a5d329680031fd9d371d30ac64460bbdf4db07546133024f541774e51301f1630cfd988c5e5bf2464834f3abe6bf
ruby-2.2.0.tar.bz2=04edc53e8cd1732c3ca61ebeb1d6133614beb10f77f9abb80d8d36352fe8aa205112068e460bf600b2c7e81e0ddcc3b311e7e027c320366f1bd992b3e378a6ad
ruby-2.2.1.tar.bz2=af6a8e75a66b953ff33ecbca5111bcf1c6560b6b48b370b700820fcbe91363146c5ac8abd670a14e693b44343ae598bab472ed2902834304c03ffcd9550886d1
ruby-2.2.2.tar.bz2=d6693251296e9c6e8452786ce6b0447c8730aff7f92d0a92733444dbf298a1e7504b7bd29bb6ee4f2155ef94ccb63148311c3ed7ac3403b60120a3ab5c70a162
ruby-2.2.3.tar.bz2=795f1b66a6d4f0baef897068899c3a1a4370ce1268618e6a7d6d4720234444259f371d1ba2e174b2f7580265e9f18eda3f295fbb087447aa6e8fb7a0f07526ce
ruby-2.2.4.tar.bz2=d27ca2f19c214ce87f906b57edd41f2f8af35b2871c191470facded9cfda15ba46e5c3bc7d5540225a38da6bd65050fcc8aaa4ffbadbb6bf7dc891c1821da0df
ruby-2.2.5.tar.bz2=d3224814361c297bc36646c2e40f63c461ccf5a77fea5a3acdcb2c7ad1705bb229ac6abbd7ad1ae61cbe0fefd7a008c6102568d11366ad3107179302cd3e734e
ruby-2.2.6.tar.bz2=7a93f72d236521ac28c8a0bc0c73cf805797a8813d22e02f42c5fc05dd39f6e422817272e0db6a24c245f6f97ad4b2b412a9a47ac50156ab186df596918a5f34
ruby-2.2.7.tar.bz2=83756cd1c91516962b83961e0de59d858618f7ed3e9795f930aab4f199d47a95ed8f867d8aa9b51d508be26d9babf2140117c88241168bac41e6ef702cfadf20
ruby-2.2.8.tar.bz2=aa1c65f76a51a57d9059a38a13a823112b53850a9e7d6f72c3f3e38d381412014521049f7065c1b00877501b3b554235135d0f308045c2a9da133c766f5b9e46
ruby-2.2.9.tar.bz2=2a8c8770fda20a22b79c9115b6f468f8e7ea1092c84a5089af7a3122163e5ad298b493e6637e4d93ba02d899d8a619c94064dda8ac98cf3b93f64f45d5401085
ruby-2.2.10.tar.bz2=f8ec96c2a5f4ecf22052ee0b1029989ded52d7bf5d41be24fef67e732e76f72119302240bca08f0547510a9cd29e941a32e263cad9c8a2bf80023d6bc97b2373
ruby-2.3.0-preview1.tar.bz2=ae6d46c87f59e1fd3703b76dfc45bfcf208625f95ab9f4559f0b9f7050e8681f1a6e419f5fa06b704c83e56879c3a9ff1337dba443bcfca76fadb49c97d97a93
ruby-2.3.0-preview2.tar.bz2=e397f321d4338edba8d005d871408775f03d975da90c8abcfdb457a1bc7e6c87efe58c53b2c3bc122e9f58f619767b271bcc8d5d9663ed4b4288c60556e8d288
ruby-2.3.0.tar.bz2=77b707359e754c3616699d21697752741497c719dc3d6fdfb55ed639e76d52560d293ae54cbe5c63be78dc73fbe60f1b8615d704d017bdfe1994aa9747d26a6c
ruby-2.3.1.tar.bz2=a8659b96a3a481a3dbdbb6997eb18ff1f8cd926a9707a90d071e937315c21d372c89252f0d44732ae5007d2678fda8c8fbceafa4e4b4ff500d236fb796284d8d
ruby-2.3.2.tar.bz2=78699bae5b0a2382a58f9d51f7d891341f00ad3a90d9ca06b68b1b245cf5acebc3a82133e39bf6a412ac999a5c0f778a0dab177c2569ffbee085ffff6f6ec38e
ruby-2.3.3.tar.bz2=88f7782effd35bfe0b4c33140b5eb147d09b63fbb35b9c42d2200c010f387e2b70984ead1eca86569e8ec31f08b35289d440c0ca76b662dadb760f848e863d91
ruby-2.3.4.tar.bz2=ad1f16142615498232d0de85149585be1d2c5de2bc40ec160d272a09e098ef6f317d8b25026001735261fd1c5bc0d1f8513a8474e89f0d86eed5b2fe7338d64e
ruby-2.3.5.tar.bz2=3ecc7c0ac10672166e1a58cfcd5ae45dfc637c22cec549a30975575cbe59ec39945d806e47661f45071962ef9404566007a982aedccb7d4241b4459cb88507df
ruby-2.3.6.tar.bz2=bc3c7a115745a38e44bd91eb5637b1e412011c471d9749db7960185ef75737b944dd0e524f22432809649952ca7d93f46d458990e9cd2b0db5ca8abf4bc8ea99
ruby-2.3.7.tar.bz2=e72754f7703f0706c4b0bccd053035536053451fe069a55427984cc0bc5692b86bd51c243c5f62f78527c66b08300d2e4aa19b73e6ded13d6020aa2450e66a7d
rubu-2.3.8.tar.bz2=6d79e0d25757fd37188a8db3e630a52539bce7927fcb779a2ce9a97b9e5f330753035c16843552f1a1fb6c9a1e5c0f916b3cc8b5c0bfe81e20f35f8442e40ae8
ruby-2.4.0-preview1.tar.bz2=c9873e8686eb54dbde61d6e23cd5197beebccd6cb31fd12c82763ebe1fde17095d7514d9d93c2c82b238032c98691df5479dc2d666a8a590e0fc54450ec29cb5
ruby-2.4.0-preview2.tar.bz2=0c9a59a2f57a99c4ee8539a30f41da1de7547566203f89d856e1be9dbb44365754e6c470145dc9336eb324e0feb2f53d9fef18a1564968ac21f9ee528905949f
ruby-2.4.0-preview3.tar.bz2=6602c65a7b1e3bc680acc48217108f4335e84fdd74a9cf06f2e2f9ad00a2fccacf9fa035a912bc9d5cc3f0c7a5e21475971dfac37b0364311ef3645f25c7ddf9
ruby-2.4.0-rc1.tar.bz2=b43902ac7794487197df55a45256819d2e7540b77f1ed4eb68def3e0473ee98860a400862075bafadbde74f242e1dfe36a18cd6fe05ac42aae1ea6dddc9978ce
ruby-2.4.0.tar.bz2=bef7bb53f63fb74073d071cc125fb67b273ed0779ef43c2d2969089b9ca21fff1bd012281c5b748f7a3c24dd26e71730d7248c05a01cb23ab2089eb4d02115fe
ruby-2.4.1.tar.bz2=1c80d4c30ecb51758a193b26b76802a06d214de7f15570f1e85b5fae4cec81bda7237f086b81f6f2b5767f2e93d347ad1fa3f49d7b5c2e084d5f57c419503f74
ruby-2.4.2.tar.bz2=1a5302d2558089a6b91b815fff9b75a29e690f10861de5fdd48211f3f45025a70dad7495f216e6af9c62d72e69ed316f1a52fada704bdc7e6d8c094d141ea77c
ruby-2.4.3.tar.bz2=fb4339e30c04d03b1422b6c32ede45902e072cd26325b36f3fc05c341d42eea6431d88718242dcc9ce24d9cad26f3d26772f2e806bd7d93f40be50268c318409
ruby-2.4.4.tar.bz2=ae632852a5f413561d8134e9ef3bb82adb37317696dd293ef92cb76709ecd45718f14116ecce35b12f1c2dd53ccae8dabc7a924a270072b697512d11f4922347
ruby-2.4.5.tar.bz2=7034fcaeaee41f14bc0ecce0d3d93bd1abe95310e1a0b95fac66eaba867adfb2bf7ba4d0d70d67a15ce8df16052dee405c38cdb18987602e64a2f701d37d3df0
ruby-2.4.6.tar.bz2=292802984e5cff6d526d817bde08216fe801d255c4cede0646e450f22d4a3a81ae612ec5d193dcc2a888e3e98b2531af845b6b863a2952bcf3fb863f95368bcf
ruby-2.4.7.tar.bz2=2665bca5f55d4b37f100eec0e2e632d41158139b85fcb8d5806c6dc1699e64194f17b9fe757b5afd6aa2c6e7ccabba8710a9aa8182a2d697add11f2b76cf6958
ruby-2.4.8.tar.bz2=2d7e0f5ad766e2a12a1b53ff838e6bfe86244ffb7202196769c25e9df6f71f3ccdd8605e7ef35c53e54310bc82caf6b368ad5111dd0a3ad70a3aae1a7be93f08
ruby-2.4.9.tar.bz2=d485444dcd025a261a16bd740dae63c0aa23e4138a095584e7a83aec47af34415c7d9cbc1313e92da2ec416b11bfddf20bb1a7b60c80f12906d11ef27409b3e8
ruby-2.4.10.tar.bz2=4d730d2d7cb96b002167ee358258f2620862a5a6d8627cfa5b49bd43c6e59c50c0f437b959d4689b231d57706ec7d5910d9b144f4ca1c1ed56bc879ed92e8a59
ruby-2.5.0-preview1.tar.bz2=2d39ef64aaf7a52014905f4ad59b53e83b71433e50a9227f9f50cbb7a2c9a5db9cd69fa7dbe01234819f7edd2216b3d915f21676f07d12bb5f0f3276358bce7f
ruby-2.5.0-rc1.tar.bz2=bf0eb114097f9e505ff846f25e7556a2fb393573b4e8b773f94cf5b47998e221f3962a291db15a3cdbdf4ced5a523812937f80d95f4ee3f7b13c4e37f178d7a7
ruby-2.5.0.tar.bz2=8f6fdf6708e7470f55bc009db2567cd8d4e633ad0678d83a015441ecf5b5d88bd7da8fb8533a42157ff83b74d00b6dc617d39bbb17fc2c6c12287a1d8eaa0f2c
ruby-2.5.1.tar.bz2=82e799ecf7257a9f5fe8691c50a478b0f91bd4bdca50341c839634b0da5cd76c5556965cb9437264b66438434c94210c949fe9dab88cbc5b3b7fa34b5382659b
ruby-2.5.2.tar.bz2=9f9388a162a3ae9c14ec8999fa3b12ff5397de14f55996cc8761d21c757113db37ace4d326b9606de7ad3a5875aa94fec900dd9b81b2fb0dff558c39422f4aa1
ruby-2.5.3.tar.bz2=6fe89fe9d406bb454457442f908774577369ab2501da4fd15725ccbab77675b88faad739a6c8ad1c7b6690b439a27de5e08035b7546406cdeca65c7b295e2c77
ruby-2.5.4.tar.bz2=3c4f54f38ee50914a44d07e4fd299e53dddd045f2d38da2140586b8a9c45d1172fec2ad5b0411c228a9b31f5e161214820903a65b98caf3b0dfeeaabf2cab6ad
ruby-2.5.5.tar.bz2=1b56aa79569b818446440b9f2d13122bf7c2976ab9b2865f5fb62d247d7768dd4ac5b5e463709ffec0f757bff7088afd293c2a8c5349c3780763b6444bb354a8
ruby-2.5.6.tar.bz2=e4511d42d19a7bb39ea79f66bb4eca54b63c2a9d27addc035d6d670c1e59ee48a0c6e9c6bc7d082d1f1114b0668831dce3b7422034517f3c4a06ced0e47a7914
ruby-2.5.7.tar.bz2=7d6a7d41b4f3789f46be5f996099f3eb8321aa4778b2a8ff44142654e769ba4ba2df127dd0f267547e4c8cd6ff46364f18e79838df54fcd7e3fb714294ee0099
ruby-2.5.8.tar.bz2=037a5a0510d50b4da85f081d934b07bd6e1c9b5a1ab9b069b3d6eb131ee811351cf02b61988dda7d7aa248aec91612a58d00929d342f0b19ddd7302712caec58
ruby-2.6.0-preview1.tar.bz2=d9cb270529a97670d54f43a0236fab072714e715c39277dab70b7a1843ec818e6700e47e1384c7256f9e0ae41ab2c0b768a0de38a5ecf4f4fff5da6ef5ad4944
ruby-2.6.0-preview2.tar.bz2=3872227e9b1c97c206d19bf1e6ce15a38ee15a26c431b4436605dea67affcf16372358984df76b35e7abaa902c15c16f533ac7af47e3031dea9451bbe459b693
ruby-2.6.0-preview3.tar.bz2=d1693625723796e8902f3e4c4fae444f2912af9173489f7cf18c99db2a217afc971b082fce7089e39f8edd54d762d2b4e72843c8306ed29b05ccb15ac03dbb5b
ruby-2.6.0-rc1.tar.bz2=cbd6281b2aab6fbce3f699c1ab57e5423304dca7a547a0b3cd4e8e980326dc7b85b2ca2bfaf3f3a648d40f4222fdf1740d81d422790ee7ae1ba1ed33eb11e3e8
ruby-2.6.0-rc2.tar.bz2=9bfbe83fd3699b71bae2350801d8c967eb128e79b62a9d36fc0f011b83c53cab28a280939f4cc9f0a28f9bf02dce8eea30866ca4d06480dc44289400abf580ba
ruby-2.6.0.tar.bz2=ca3daf9acf11d3db2900af21b66231bd1f025427a9d2212b35f6137ca03f77f57171ddfdb99022c8c8bcd730ff92a7a4af54e8a2a770a67d8e16c5807aa391f1
ruby-2.6.1.tar.bz2=fc41429491935b89532733b95476ab9f8a4efc310aad8f4c2bd3b68fba08fd7b6e9ac84c6c88ca892022d1ba76435295f3299ea466f9b5453c07d41cb539af59
ruby-2.6.2.tar.bz2=cad678d2ced4085e99009e4fef83c067dd0e6ead27a8695bc212c0e5112a7fa09ceb27f82638faf91932ef8bdd090f844e0a878ffdf6845a891da4b858588aa0
ruby-2.6.3.tar.bz2=c63c3f527bef88922345f4abb4b9ad467117b63f2132e41722ea6b4234cec3446626c3338e673065a06d2894feee92472807c284cbe613a442c8fda234ea7f88
ruby-2.6.4.tar.bz2=a9fa2f51fb5f86cd8dcaa0925fe6f13d4f19f110b5d4c5fd251f199d16aaf920db39ad3bb50460eb94ab8d471ab2ac8bb54daea4a3bb080eaf45250aac3437fe
ruby-2.6.5.tar.bz2=28e0b04ac8ca85203eb8939137b5e5de4850c933faf7f62fc69648fe1886faaabf6cdf48382f9d9585c1720876d10b41dafd33efaeb23341c309917fbd8a6e21
ruby-2.6.6.tar.bz2=001851cf55c4529287ca7cc132afc8c7af4293cdef71feb1922da4901ece255ec453d7697b102a9a90aef2a048fe3d09017ea9378ab4a4df998c21ec3890cdbb
ruby-2.7.0-preview1.tar.bz2=a36b241fc1eccba121bb7c2cc5675b11609e0153e25a3a8961b67270c05414b1aa669ce5d4a5ebe4c6b2328ea2b8f8635fbba046b70de103320b3fdcb3d51248
ruby-2.7.0-preview2.tar.bz2=7066ececebbbba4b2933ba1a4f70cdef373169910802259a3e52b4fc144ba298f3cffda4be5fe8a7be8ef769ed43076fa046a9ac2c13bb733475b9852112c6f0
ruby-2.7.0-preview3.tar.bz2=5d8e99e3fd984c7d05c0bc483e1504e81ccdb920cbb2d78cad3c314e197b30316b692fd0199f836acac41246e3a713cb81dc6dd64c27cba56f807df4c193db1a
ruby-2.7.0-rc1.tar.bz2=b5f96227775f8bdf19f944a555d0a83d7e84b37bd31fe4b8ac008a3272b1a28a4d94abbb1b5570ee32ec0690ba9d476b837a020a5194bee14bebf6f0e768bc79
ruby-2.7.0-rc2.tar.bz2=9010f72bb3f33b6cd3f515531e6e05198f295bb2a8a788e3a46cdfd776a9f6176b6ba8612f07f0236a11359302d2b77fdecca1dc6be33581edbb028069397a0a
ruby-2.7.0.tar.bz2=8b8dd0ceba65bdde53b7c59e6a84bc6bf634c676bfeb2ff0b3604c362c663b465397f31ff6c936441b3daabb78fb7a619be5569480c95f113dd0453488761ce7
ruby-2.7.1.tar.bz2=4af568f5210379239531dbc54d35739f6ff7ab1d7ffcafc54fed2afeb2b30450d2df386504edf96a494465b3f5fd90cb030974668aa7a1fde5a6b042ea9ca858
ruby-2.7.2.tar.bz2=f07592cce4de3532c0fa1c84d53a134527d28ba95e310cd3487ac321c49ee680faeace285de544ee6db432a90aa7538a1d49ff10c72b235968ca362ef9be621d
ruby-3.0.0-preview1.tar.gz=b94892951f842a1538f4b99022606ac2c0b5031f1ede7eef3833a8caa9ed63e9b22868509173bfefb406f263c65211db75597b152b61f49e5ba2a875fce63a27
ruby-3.0.0-preview2.tar.gz=6fa4191425ae71e41894b60bd9c31d483a562ee8216886360ce18238ab48115b95be0367708612c45f634e7584fba8940a524ba0113ce0f36ce4df78a112d0b7
ruby-3.0.0-rc1.tar.gz=798926db82d27366b39be97556ac5cb322986b96df913c398449bd3ece533e484a3047fe35e7a6241dfbd0f7da803438f5b04b805b33f95c73e3e41d0bb51183
ruby-3.0.0.tar.gz=e62f4f63dc12cff424e8a09adc06477e1fa1ee2a9b2b6e28ca22fd52a211e8b8891c0045d47935014a83f2df2d6fc7c8a4fd87f01e63c585afc5ef753e1dd1c1
rubygems-2.6.11.tgz=3b0dd38c0aaf313c59e299dcf54f7bfb6e6d84b8b739573ddaf599e584da45ed7b1465f6521131b32f237e31a4796d9ef455b8be685064b3fd77a0355dfff13e
rubygems-2.6.12.tgz=ebb672488b50f5fc988eab66ab14ce8e887dcc635f71239a85e32fbf1e919ca70196eb4d3f2fee3486cace7064bab0b8b08339c754b723198e1b0b0a0984ab54
rubygems-2.6.13.tgz=c952b6061a9a0778db304c3aa5bea693e71ae2564abfb19f8b123eef66eb1e3877fc7c36f4f1527da97bb320870cbfd4574ac57ad88e850a44fadd67ebdac152
rubygems-2.6.14.tgz=7743845bc5265df3782f85a23896cbb250d8a2bbc9934a27f274b001afa7aa62f7f00f616296f74747ea612d2cb37dd7f533c931aa72550d84c64d2a73d60daf
rubygems-2.7.0.tgz=0bd08fbabcc33687c98365ffe6794ca2a5e82160b0297479d4f19bd899d176b7f4efb95248898b26d873f9fc7d86c10cada6e40cdc48738b0bac261c3aad261f
rubygems-2.7.1.tgz=fa4ea123760b03b8b8e8ececc55c9dc34249073fb267d310bd903aa7a613267e5d27990bbf28e32c9a746bf884af8a84a0dc202297272f9d477f7710c21bfb60
rubygems-2.7.2.tgz=0f48c6e46663780a571c7ee0e6e772f2e18a755031e7dd8ede7870f238c214b9e3e38153b1ae8f1f78a9aad63c1a079b86573b3a25c57a600d842bdf92b9c4d1
rubygems-2.7.3.tgz=2782331b31947a23f85b285a3d5e7b66e34fe5847bc84dca4f1e6bfe33ce187ab0cbc814229de8111aa19490b656ca78b7c821e4ea6b425449991c01371b7565
rubygems-2.7.4.tgz=90f72a46709ef847666a6a23eecf24521abd5c294b2da8a246bb4c7f85daf4af39a0634fc8093c7bb7ded2ac137ea27fac5ed94af3b70c49e78594285c7a40ce
rubygems-2.7.5.tgz=86957f1c438070135df527a15102e40487fcee93a55251463095e4c8794a8616d16ed9bdead0e0ef83c44806bd5016ecd9e178bef608b66af2e68e2c9c49e941
rubygems-2.7.6.tgz=bc168afc40c974dbc7c37eb5678432ba2ed7469c3f007a159699467ff2cff5205c508237193ee8becaa6eb555b043969cc5f92b2aaa6bf7c958dd7c187e258a7
rubygems-2.7.7.tgz=f93b7eacf5ef8725c40d618daf9deabc7e9eed74b3b7f13ecd16f89205fe24958e782314c52f8a8fe3205b93e20b830b4fbf7ff8944ff1cf56feb7de2d773252
rubygems-2.7.8.tgz=3d1cf68377dfcf102028342258aaff5a7257d2d2b34a80508c85aa258d810add46e65a157f902c271b0b7b568c437372d17246e89cd88f8500e47c008d17f1a6
rubygems-2.7.9.tgz=5f699f47bc24d8ffd4f8f44a509a9df71fcd945ca2574dc9d5050bfe06a44830a368f45d204112d7a4f1877e1600a6fe4d1b6b68f9a55288664667b4220a7d72
rubygems-2.7.10.tgz=48a18c0f202f463c38cf5dafecfbc7cc39245e63c7a059ef2cefadda478483794a929ea6b7e0ef062dd4423230746f1f09d7bec06a97fe3ceccc3325397a3e71
rubygems-3.0.0.tgz=047f4d446aae414e4803517088ef47d5cc66319ff08a3795c6d69e83eee9f3e7c3b05419858f7e5b6a8ec224990ca01178a9259961ef2d7ab737bac352a0f18d
rubygems-3.0.1.tgz=dc29ad51ec67b1dca82a23973ea92153482788964d0755bdcd3c650116915c461c6e5fb1c826be3ee04a497fec4ac2826904bd406f24611e77cd8c9eaf4d8729
rubygems-3.0.2.tgz=90b46c2cd4f8baee74eb488a40691cc00e754cefc42029d485163d6ad7782df78ba5cbeab08eec6a4f71febe0f6e635e12a9381393008c58eb5e16396df93fbe
rubygems-3.0.3.tgz=1dd585243341901c7b4cc60a4902000c10ce57fe2cc9c28e27e274a2e6029f936cde1c99d7097c93c2c5b2c8bcee5d692c8fe5cc00c996a040e4954b674e330e
rubygems-3.0.4.tgz=887c64226ec0b32d33f2ea331936683406d54dc74d19e658a23521e25ab50aa23534fe9eecaf696154247ad1df1d24c233d8900b9aabc79096eebd6afef3f775
rubygems-3.0.5.tgz=f5a97cf67d7d043afba7c1aed014f1b64ff6376ea74d3d6533496bc5ca9742e0ccce1a157e6f67d8fcbe59d8e34bbfbcf4ed8be97acf2970603de6381043cb78
rubygems-3.0.6.tgz=1ef1822a2b19790a36a6d242b7d4584222617baa27787ec58961a9cfeb2733f19f9085490ffc72ee375d3153c7114e050c42e68fc8039e727fe5961b09365ee5
truffleruby-1.0.0-rc2-linux-amd64.tar.gz=5dfb040b746e462c297ebcdf84e0f07cd74b86852055dcf0a7cf1814112099bc674bcccd94b03726aee76b253c9345a45d046cbfea230647644f0fd6b1c1ec96
truffleruby-1.0.0-rc2-macos-amd64.tar.gz=17983c442c54d19196be3626e25c64f5474139c0b973624832ba8730efb047bc747c02e59c82f38397bf012c63ab83f79a9c1b64311cab796f08fe96d7d12a1a
truffleruby-1.0.0-rc3-linux-amd64.tar.gz=b0b57082d61317911f101da617333d81ee6bede6b6e18f9bed86544dc413339c830198d90cad7ac94c0c8fb690adcfc559dd9f530abb70507ff6a76eee552b61
truffleruby-1.0.0-rc3-macos-amd64.tar.gz=18f9782de56269389320ddad779ec69c168909198d4572e2ea4c18bc8082a539569a76760a6a6da58722fe08d77d83904aaba14baf4075a2833cbd2efc45dff3
truffleruby-1.0.0-rc5-linux-amd64.tar.gz=134d9ba5db7b8a1960d3a88390cd6f7503a0e8565094fb127333d122cd773bfbf9dc976c659029007e6fb68e93486293bac2ee29ab21dae9cb0c06ba57dd2c72
truffleruby-1.0.0-rc5-macos-amd64.tar.gz=5804f1f27916176f5a270de8aac85bc48c38ba37c4e719b09f5777e5c42429271819378cfe096c3cc33d406cd0726f2e37658020f97a438fd53751019831569a
truffleruby-1.0.0-rc6-linux-amd64.tar.gz=2597b375f590755b851d3b8cbad3eeab4c965eb02d0c944044f57e39f6c3db1e2f513e2aa55db789e4a885c697f81ce5c8bdbe9a7e44ee30fc09d234e44fb512
truffleruby-1.0.0-rc6-macos-amd64.tar.gz=2eb177190de0408dfdaf30264132955d1db7783ddfb63880d97d5933f66c5662794c3bb6198edf230fbff348674203e61f7f5481e74ac875974467f2f128e939
truffleruby-1.0.0-rc7-linux-amd64.tar.gz=ab3a3dc19f903e68e36b135729693fa025a7c1950139277255e48c972387ef8399beceb3252ac37cc70c0df92838f8a0ba8c45f53665ac4286ef23f9b240806a
truffleruby-1.0.0-rc7-macos-amd64.tar.gz=b8423f50a5292e211db7ebd7e2b987fd5c9eaaf34eba86b0644d2716a7f068f2e56deb4357c516b87b437e64fd5ce8515bc181165cc1042c6763f27d71baa59d
truffleruby-1.0.0-rc8-linux-amd64.tar.gz=bcd05d304ee9b4da97193575fb1ad78041a0c7710bb444af6aef12ab4261b1873f472175ec51a187a5e99da481d66b81a132fb691643b793e87d655f31d54657
truffleruby-1.0.0-rc8-macos-amd64.tar.gz=2c758221793c38ca8af1831a5d9f3abd555c406569508ac3a86d3c1ea5baeeacf65abb6e904ed3b1e58f555f51bc85ab171135ff4c3d0e08cdae994a861cbda4
truffleruby-1.0.0-rc9-linux-amd64.tar.gz=42e60b69957f77a8623e0dccb7d215e800c27c622364fa76b9c574e8b1d3a4056a058b61ed91eac2375ecf4e51e482a6e17550aa2894a44d1db70687958033da
truffleruby-1.0.0-rc9-macos-amd64.tar.gz=18556ee8d2fdec6907fbc8fc33d8b32ea0c58d40ee3df084ffb233e2fcd3a514a553f97c31dcc25dda3f86b1b805ca5fe3c9bf8cb078b92325515f09db6b88ba
truffleruby-1.0.0-rc10-linux-amd64.tar.gz=10a7cb1be6214347469d5797091f73c3d7824bfb32a47c13566573a383380b1df9b79b7901ce0fa3af1c97285c90afac21e2de7a66ed88d9495846743b3b25e2
truffleruby-1.0.0-rc10-macos-amd64.tar.gz=53f0939d9d8c3470cb79316d865b765816032528d77a3cf497134f3aa667a6253ae037410801261a8e7d0628198ac5f6aea5ecf9b7313f06ccc1d5e9f94e74ea
truffleruby-1.0.0-rc11-linux-amd64.tar.gz=f89bc9a3310634d39f68006307da0b0ddafae036089bdd663e8372777a9562d201a4e69b2e1a602cff5fba6c78a8d4861b6d1020679bd0c72c71b938a4f36a27
truffleruby-1.0.0-rc11-macos-amd64.tar.gz=3f461c12fa9fa57a55cc390eb9887df88f404661a77bffb44f82b4c7e9021513a6df9f6d5f332a36ce0c28ae7e3d5afbbe15cc4b814bc7f86dac2e5ec280f947
truffleruby-1.0.0-rc12-linux-amd64.tar.gz=85f042c308ccdfbeb318cec37056d8d970cab51cb0779425b85b8f76b0a1dd9cdec3191ae2b6b9b6be6e95767db814496450ed20076addd9bd495742f9de3c8c
truffleruby-1.0.0-rc12-macos-amd64.tar.gz=067a0f63bbaaed4c8d4120f758c8ecf8c52afd1d30ea9d41489e26289d57a574d2d4ae29e29655378510adfb3f4a07b04b403d6ee98ee6b3d3aa8bff9c8d718f
truffleruby-1.0.0-rc13-linux-amd64.tar.gz=1eb6b80cb05133d253f20629a11ed9ec3f37da002d5668cdc6577b2a20524e0cdd4d739d3f1aa2e8c518e2f7ebfd519ec1c647293714a1133ad4d569375c0e69
truffleruby-1.0.0-rc13-macos-amd64.tar.gz=e3cddb0d0ae48f7d5ee4dd094ddb5a13f6a7aff1521b1adf25710971664b235cf67144e3b81525fd710dc49b6f6f6ba06e10eee1df5dc08119e9494c6be86934
truffleruby-1.0.0-rc14-linux-amd64.tar.gz=c982194675b66a0433bd5517fc6f1564db669f595f8c7ba4819bf37e0599474d49a0c606577a898c27fa5ba40ab793c62d8211e7ea398d6b3e2bcc31eb5d55f4
truffleruby-1.0.0-rc14-macos-amd64.tar.gz=c14e396396385644333fb4c4aa1fb4b934a3f4e46312146821e5dcdaa097cb5b1efbf397c1dd6117d909803fd27ba8d835904672e98d43dc565e907fed752e1b
truffleruby-1.0.0-rc15-linux-amd64.tar.gz=f27a75f929a6e945e49ceaad12f484fdaa918469a2f639b572fc4737b78e1cde0881697057e13a58b2fab7ac64c3a71bc9951561c3a8728e3dec814ef5e95fee
truffleruby-1.0.0-rc15-macos-amd64.tar.gz=7aa029c4999d4608c9bcc491771b0434267032dbe9dbf504728079f87ce93e6a90e0fa839295b88c00e5a025186ed0fcc42361428b7874c05e222edb108d6c02
truffleruby-1.0.0-rc16-linux-amd64.tar.gz=e8c508dede11d4f54cf0b15cf92b50caad93076a6065bd2d6784c5ca739f5923ea2b894c6b2b52131f62187c8b305cd11a960fb5a670789802d59b6b2999f0af
truffleruby-1.0.0-rc16-macos-amd64.tar.gz=841eff077c38bf594b101edb15942f601ba0dada2122b21b016f53251aa2a635b8d0b63b49bdfb50259b2545d1f498bca95d5f771a15a28edb0dd07216c9b709
truffleruby-19.0.0-linux-amd64.tar.gz=8ec6c7829351e0dc2cce57305947cd540734fe5a0b95b9501d4179993727ab2c331e9fb639b9865c0fed596df3906adf3dcf2efb22c4cfdd23a3dc2137025fd4
truffleruby-19.0.0-macos-amd64.tar.gz=912e0c15d32e40c884b2caaaf9a86a71450d441c960ef98a63dfce80353619073b146dcfe03d9af4273b2811d0899eebe922cc84a51d6f5e6826cc436d793f78
truffleruby-19.0.2-linux-amd64.tar.gz=eec92bfbd776acd61709a428b90b1029c5ea83e5ea839304d23cae3a541dd4fab3b387691fa76643f55d5939c9cac0cbe70dc0b5786e5e0e5d20f3fcd9a21356
truffleruby-19.0.2-macos-amd64.tar.gz=ce647b76c9931feac55baa5acd2c87d8335c606bc5cd7e462bd92ba1b09f4bab5db927f021e3119abfd85c33377003d060f36cf64eb121954fce8878112f01b5
truffleruby-19.1.0-linux-amd64.tar.gz=db01e6dc09fc5f39ca466aa94f725023d49a8f52343f129bf8c32b7f5f76ccf2d573ee3344fce3d5aff9983bc9af618cc5ca6e1dbba93b3f604e4f33f8a69b3f
truffleruby-19.1.0-macos-amd64.tar.gz=f002bc0b6efca11eb97c4aa6df33d2e0fcc1de3443efd39d912b028df9dd8954cb76ef3ca7fbe140f4e922d6ae4c1a6a20853490ef1ea0749293e2fcd4ffe8fc
truffleruby-19.1.1-linux-amd64.tar.gz=ec031e8c216e31f034d97aaccd6441869221d6946e18f375b44a866550b8e8eb4b2fb923f9ce1a62853bdcd5b9201e0f5d2732ca6525d80171d5732ef522bd25
truffleruby-19.1.1-macos-amd64.tar.gz=1c15918af939a8fe1779b71d9e53d2ce09ca7353173a3b357905d9fe1981ff013cf0f90c6b47e1ca66dd168c2f2d742f28a5fb134cc0231d36146da99f91c3cc
truffleruby-19.2.0-linux-amd64.tar.gz=1248bdde9cd3651d7042fe4cecff4ad35534868d543fe2e6f3a5bfc3bc9d10d57b4139fc070f0a03861436a1aabc9a8ebdf3356f39b77a4b8f6a1dcf492f70a4
truffleruby-19.2.0-macos-amd64.tar.gz=92c3154ed229a115cf392826494745aae06dd9228dd0996c2c44c550552f13f9c254367d068452fa4a84eef79c19601c79b87e10f3121fd7b83b803514a41cfd
truffleruby-19.2.0.1-linux-amd64.tar.gz=53c78cd1f255f2b7031a70a42b65c0bf80c510b9254f5d7ba82b4787f55f5b09cfa9544c424a90f4619a74179fed07c168bd501e34772ef836a773e89c467cc5
truffleruby-19.2.0.1-macos-amd64.tar.gz=ac11523cd49fac50de1e441039e429fb8cd6c7051d537e5083b64fa68eaa19c9f0a966b269da906c367985f229af82a4811282dbfd0a76ef6565162e1081a659
truffleruby-19.2.1-linux-amd64.tar.gz=c5ffc1b592a74e836a4f6ec75b0e103150a4a40d3183ae853ead38c951a85378163111cf0bd2b81e44548c0a7aeaded3ae8a7ae558d5a02dc9e2cce992b79b58
truffleruby-19.2.1-macos-amd64.tar.gz=bb467b91f66eb7d1e6f1a54a7bc0a3d9503bcbd935e8a02da9ea0b749a51e354b1140d4a4dad6fc05312b560bb9ccdcce4f6583bccd19bb5afee19bf494102fe
truffleruby-19.3.0-linux-amd64.tar.gz=0e94777a3feabbf0107ed40847e20dd4e3696ff2b7c3f6ceddf3a53ccd812bd003c84c62a750e8fac9d2490374bf792d69174b48c3ed36b593485d86729136c1
truffleruby-19.3.0-macos-amd64.tar.gz=95470c389e24c865ecdc3d299005cd98f8221a128f3cd75f899b6b7ae5d6dc07962443ce0ff38dfd014589d5aaf08b718dc870a72eb7ea6ced18ec2b2db63095
truffleruby-19.3.0.2-linux-amd64.tar.gz=dc5309b71980657f750b4dd4f8b3bc4e191bc305b638b1e562ff5b0ad7fbba40079ba674caf46226a46b5ca58c10f812354786696264742f351b129fb088a672
truffleruby-19.3.0.2-macos-amd64.tar.gz=ff1c37485ebeff3edcc7081ce09bebe5541012dedff6997662c7f8a064e0ab10bef9a5cdf834263a06ae04ca0391743948bcdea6e6c9d7e1cfef9f21523c2bdb
truffleruby-19.3.1-linux-amd64.tar.gz=c724547a9eacfdd135ce05eac9dcfe74e58a5e77c97f88103f83b8513c15c975a0ecf623f623a425ec81fad1b64d3b5e135660d6943608ad08048cda00eace79
truffleruby-19.3.1-macos-amd64.tar.gz=d746b2ad410c15d145d36c676a070ae454ba8e5ec6c594d5ebcf54b1fc719f98e8b8f71b6fd504c3d38df286bd11c5114f73b5ba39be312b11d42d4ca1a17d02
truffleruby-20.0.0-linux-amd64.tar.gz=4efea5ded5fcc6886befba3a3720fe1e5b2e376d46738565e8871a1ce0201a33ed52e78b8af2fb389618bdea99466d126d8537dd0919b0c13f8ff1940cb3e52e
truffleruby-20.0.0-macos-amd64.tar.gz=b36488330514b77c7115689042cf2482a0beb9f72a0b05fb4c7a6ecb0835a3da47c3b15c41abd6ffced023e65ecf7eabcfbcc6e41901dcddd0fb3dfed46564c6
truffleruby-20.1.0-linux-amd64.tar.gz=116d57404540b85c15b321793a6f985624a2044af544e659b3607e50159703af5d445e22bff28ae2182dfa752f7500d420e250f6deccc98a2f01e89adba8ac3a
truffleruby-20.1.0-macos-amd64.tar.gz=9b1267101dfe78b85c79f7528eb4de96b16933e66d5771efa6272372dac0fb35b199bb9d42773d61f4fa7a15d6cbd18b5753c148f7c3e477c7c4b21633f12b88
truffleruby-20.2.0-linux-amd64.tar.gz=a37eaf8475364b74d948979ac13dc6e6423bf11949ad1d0f2925f78a4495e80de9767001ccdb777c8cfd7f545839fad4d842522620c3acad179404bc4ce6752c
truffleruby-20.2.0-macos-amd64.tar.gz=964c1e02cc53e1646060334a9911771e679a8344d811a0f77d5cae3529dfefff259c45505ac84b7debb958514cd5d2276ffd435802085494e0229dd140ce8f00
truffleruby-20.3.0-linux-amd64.tar.gz=ec2d8ff6a5d45fd7091e26430c67cbbdc0f8ffa41e9ac574d48802766fcd144e1f446db807700247ad6d8046b7ed070b5da70ef667e576d6fea60cc64ea5484f
truffleruby-20.3.0-macos-amd64.tar.gz=1878f94e05a3c40484bf944a72412b179aa5415a16a7ebc1610cb512a1e1c4a2ce0e98685257ad6e5c14745245c35bb5b28205fb687292c4f17193cbfb3bb606
src/rvm/config/ssh.example000066400000000274147511530530011567 0ustar00Host ubuntu
Port 2220

Host *
HostName localhost
User vboxtest
UserKnownHostsFile /dev/null
StrictHostKeyChecking no
IdentitiesOnly yes
ControlMaster auto
ControlPath /tmp/socket-%r@%h:%p
src/rvm/config/db000066400000013020147511530530007716 0ustar00# General
default_ruby=ruby
interpreter=ruby
niceness=0
#
# RVM
#
rvm_remote_server_path1=maven2/org/jruby/jruby-dist
rvm_remote_server_url1=https://repo1.maven.org
rvm_remote_server_url2=https://rubies.travis-ci.org
rvm_remote_server_url=https://rvm_io.global.ssl.fastly.net/binaries
#
# RubyGems
#
gem_gem-empty_version=>=1.1.2
gem_gem-wrappers_version=>=1.4.0
gem_rdoc_version=>=4.1.1
gem_rvm_version=>=1.11.3.9
rubygems_repo_url=https://github.com/rubygems/rubygems.git
rubygems_url=https://rubygems.org/rubygems
rubygems_url_fallback_1=https://github.com/rubygems/rubygems/archive/v\1.tar.gz
rubygems_url_fallback_1_pattern=https://rubygems.org/rubygems/rubygems-([[:digit:]\.]+).tgz
rubygems_version=latest-3.0
#
# Packages
#
autoconf_url=https://ftp.gnu.org/gnu/autoconf
curl_url=https://github.com/bagder/curl/archive
gettext_url=https://ftp.gnu.org/pub/gnu/gettext
glib_url=http://ftp.gnome.org/pub/gnome/sources/glib/2.23
libiconv_url=https://ftp.gnu.org/pub/gnu/libiconv
libxml2_url=ftp://xmlsoft.org/libxml2
libxslt_url=ftp://xmlsoft.org/libxslt
llvm_url=https://llvm.org/svn/llvm-project/llvm/trunk
mono_url=http://ftp.novell.com/pub/mono/sources/mono
ncurses_url=https://ftp.gnu.org/pub/gnu/ncurses
openssl_url=https://www.openssl.org/source
openssl_version=1.0.1i
pkg-config_url=http://pkgconfig.freedesktop.org/releases
readline_url=https://ftp.gnu.org/gnu/readline
yaml_url=http://pyyaml.org/download/libyaml
yaml_version=0.1.6
zlib_url=https://prdownloads.sourceforge.net/libpng
#
# CentOS / Fedora EPEL
#
epel5_i386_rpm=https://dl.fedoraproject.org/pub/epel/5/i386/epel-release-5-4.noarch.rpm
epel5_key=https://dl.fedoraproject.org/pub/epel/RPM-GPG-KEY-EPEL-5
epel5_x86_64_rpm=https://dl.fedoraproject.org/pub/epel/5/x86_64/epel-release-5-4.noarch.rpm
epel6_i386_rpm=https://dl.fedoraproject.org/pub/epel/6/i386/epel-release-6-8.noarch.rpm
epel6_key=https://dl.fedoraproject.org/pub/epel/RPM-GPG-KEY-EPEL-6
epel6_x86_64_rpm=https://dl.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm
epel7_key=https://dl.fedoraproject.org/pub/epel/RPM-GPG-KEY-EPEL-7
epel7_x86_64_rpm=https://dl.fedoraproject.org/pub/epel/7/x86_64/e/epel-release-7-8.noarch.rpm
#
# MRI Ruby
#
CentOS_5_ruby_1.8.7_patch_level=p374
CentOS_5_ruby_1.8.7_patch_level_warn=Warning, Centos 5 can not build head version of ruby, falling back to latest patchlevel, your ruby will be less secure because of this.
CentOS_5_ruby_1.9.2_patch_level=p320
CentOS_5_ruby_1.9.2_patch_level_warn=Warning, Centos 5 can not build head version of ruby, falling back to latest patchlevel, your ruby will be less secure because of this.
ruby_1.8.4_rubygems_version=1.3.5
ruby_1.8.5_patch_level=p231
ruby_1.8.5_rubygems_version=1.3.5
ruby_1.8.6_patch_level=p420
ruby_1.8.6_rubygems_version=1.3.7
ruby_1.8.7_patch_level=head
ruby_1.8.7_rubygems_version=latest-2.0
ruby_1.9.1_patch_level=p431
ruby_1.9.1_rubygems_version=latest-1.8
ruby_1.9.2_patch_level=p330
ruby_1.9.3_patch_level=p551
ruby_2.0.0_patch_level=p648
ruby_head_rubygems_version=ignore
ruby_repo_url=https://github.com/ruby/ruby.git
ruby_unmaintained_date=2017-04-01
ruby_unmaintained_version=2.1.0
ruby_url=https://cache.ruby-lang.org/pub/ruby
ruby_url_fallback_1=https://ftp.ruby-lang.org/pub/ruby
ruby_version=3.0.0
#
# REE
#
ree_1.8.6_patch_level=20090610
ree_1.8.6_repo_url=https://github.com/FooBarWidget/rubyenterpriseedition.git
ree_1.8.6_rubygems_version=1.3.7
ree_1.8.6_url=http://rubyforge.org/frs/download.php/58677
ree_1.8.7_2010.02_url=https://storage.googleapis.com/google-code-archive-downloads/v2/code.google.com/rubyenterpriseedition/ruby-enterprise-1.8.7-2012.02.tar.gz
ree_1.8.7_patch_level=2012.02
ree_1.8.7_repo_url=https://github.com/FooBarWidget/rubyenterpriseedition187-330
ree_1.8.7_rubygems_version=latest-2.0
ree_1.8.7_url=https://storage.googleapis.com/google-code-archive-downloads/v2/code.google.com/rubyenterpriseedition
ree_configure_flags=--dont-install-useful-gems
ree_version=1.8.7
#
# Rubinius
#
rbx_1.0.0_patch_level=20100514
rbx_1.0.1_patch_level=20100603
rbx_1.1.0_patch_level=20100923
rbx_1.1.1_patch_level=20101116
rbx_1.2.0_patch_level=20101221
rbx_1.2.1_patch_level=20110215
rbx_1.2.2_patch_level=20110222
rbx_1.2.3_patch_level=20110315
rbx_1.2.4_patch_level=20110705
rbx_repo_url=https://github.com/rubinius/rubinius.git
rbx_url=https://s3.amazonaws.com/asset.rubini.us
rbx_url_2.0_and_newer=https://rubinius-releases-rubinius-com.s3.amazonaws.com
rbx_version=4.1
#
# MRuby
#
mruby_repo_url=https://github.com/mruby/mruby.git
mruby_url=https://github.com/mruby/mruby/archive
mruby_version=2.0.1
#
# JRuby
#
jruby_repo_url=https://github.com/jruby/jruby.git
jruby_url=https://repo1.maven.org/maven2/org/jruby/jruby-dist
jruby_version=9.2.9.0
maven_version=3.5.0
#
# TruffleRuby
#
truffleruby_url=https://github.com/oracle/truffleruby/releases/download
truffleruby_version=20.3.0
#
# MacRuby
#
macruby_0.10_url=http://macruby.macosforge.org/files
macruby_nightly_url=http://macruby.jp/files/nightlies
macruby_repo_url=https://github.com/MacRuby/MacRuby.git
macruby_url=https://github.com/downloads/MacRuby/MacRuby
macruby_version=0.12
#
# Maglev
#
maglev_repo_url=https://github.com/MagLev/maglev.git
maglev_url=http://seaside.gemtalksystems.com/maglev
maglev_version=1.2Alpha4
#
# IronRuby
#
ironruby_1.1.3_url=https://download-codeplex.sec.s-msft.com/Download/Release?ProjectName=ironruby&DownloadId=217153&FileTime=129445296766130000&Build=19727
ironruby_repo_url=https://github.com/ironruby/ironruby.git
ironruby_version=1.1.3
#
# Topaz
#
topaz_repo_url=https://github.com/topazproject/topaz.git
topaz_url=https://d3sgc2zfsedosj.cloudfront.net
topaz_version=head
src/rvm/config/pre_commit.yml000066400000000061147511530530012270 0ustar00---
:checks_add:
- :gpg
:checks_remove:
- :rails
src/rvm/config/remote000066400000301327147511530530010636 0ustar00https://rvm_io.global.ssl.fastly.net/binaries/amazon/2/x86_64/ruby-2.4.0.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/amazon/2/x86_64/ruby-2.4.1.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/amazon/2/x86_64/ruby-2.4.2.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/amazon/2/x86_64/ruby-2.4.3.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/amazon/2/x86_64/ruby-2.4.4.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/amazon/2/x86_64/ruby-2.4.5.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/amazon/2/x86_64/ruby-2.4.6.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/amazon/2/x86_64/ruby-2.4.7.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/amazon/2/x86_64/ruby-2.4.8.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/amazon/2/x86_64/ruby-2.4.9.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/amazon/2/x86_64/ruby-2.4.10.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/amazon/2/x86_64/ruby-2.5.0.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/amazon/2/x86_64/ruby-2.5.1.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/amazon/2/x86_64/ruby-2.5.2.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/amazon/2/x86_64/ruby-2.5.3.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/amazon/2/x86_64/ruby-2.5.4.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/amazon/2/x86_64/ruby-2.5.5.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/amazon/2/x86_64/ruby-2.5.6.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/amazon/2/x86_64/ruby-2.5.7.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/amazon/2/x86_64/ruby-2.5.8.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/amazon/2/x86_64/ruby-2.6.0.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/amazon/2/x86_64/ruby-2.6.1.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/amazon/2/x86_64/ruby-2.6.2.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/amazon/2/x86_64/ruby-2.6.3.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/amazon/2/x86_64/ruby-2.6.4.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/amazon/2/x86_64/ruby-2.6.5.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/amazon/2/x86_64/ruby-2.6.6.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/amazon/2/x86_64/ruby-2.7.0.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/amazon/2/x86_64/ruby-2.7.1.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/amazon/2/x86_64/ruby-2.7.2.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/amazon/2/x86_64/ruby-3.0.0-preview1.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/amazon/2013.03/x86_64/ruby-1.9.3-p448.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/amazon/2013.03/x86_64/ruby-2.0.0-p247.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/amazon/2018.03/x86_64/ruby-2.4.0.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/amazon/2018.03/x86_64/ruby-2.4.1.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/amazon/2018.03/x86_64/ruby-2.4.2.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/amazon/2018.03/x86_64/ruby-2.4.3.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/amazon/2018.03/x86_64/ruby-2.4.4.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/amazon/2018.03/x86_64/ruby-2.4.5.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/amazon/2018.03/x86_64/ruby-2.4.6.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/amazon/2018.03/x86_64/ruby-2.4.7.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/amazon/2018.03/x86_64/ruby-2.4.8.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/amazon/2018.03/x86_64/ruby-2.4.9.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/amazon/2018.03/x86_64/ruby-2.4.10.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/amazon/2018.03/x86_64/ruby-2.5.0.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/amazon/2018.03/x86_64/ruby-2.5.1.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/amazon/2018.03/x86_64/ruby-2.5.2.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/amazon/2018.03/x86_64/ruby-2.5.3.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/amazon/2018.03/x86_64/ruby-2.5.4.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/amazon/2018.03/x86_64/ruby-2.5.5.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/amazon/2018.03/x86_64/ruby-2.5.6.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/amazon/2018.03/x86_64/ruby-2.5.7.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/amazon/2018.03/x86_64/ruby-2.5.8.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/amazon/2018.03/x86_64/ruby-2.6.0.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/amazon/2018.03/x86_64/ruby-2.6.1.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/amazon/2018.03/x86_64/ruby-2.6.2.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/amazon/2018.03/x86_64/ruby-2.6.3.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/amazon/2018.03/x86_64/ruby-2.6.4.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/amazon/2018.03/x86_64/ruby-2.6.5.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/amazon/2018.03/x86_64/ruby-2.6.6.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/amazon/2018.03/x86_64/ruby-2.7.0.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/amazon/2018.03/x86_64/ruby-2.7.1.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/amazon/2018.03/x86_64/ruby-2.7.2.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/amazon/2018.03/x86_64/ruby-3.0.0-preview1.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/arch/libc-2.15/x86_64/ruby-1.9.3-p194.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/arch/libc-2.15/x86_64/ruby-1.9.3-p286.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/arch/libc-2.15/x86_64/ruby-1.9.3-p327.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/arch/libc-2.15/x86_64/ruby-1.9.3-p374.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/arch/libc-2.15/x86_64/ruby-1.9.3-p392.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/arch/libc-2.15/x86_64/ruby-2.0.0-p0.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/centos/5/x86_64/ruby-1.9.3-p286.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/centos/5/x86_64/ruby-1.9.3-p327.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/centos/5/x86_64/ruby-1.9.3-p362.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/centos/5/x86_64/ruby-1.9.3-p374.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/centos/5/x86_64/ruby-1.9.3-p392.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/centos/5/x86_64/ruby-1.9.3-p429.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/centos/5/x86_64/ruby-1.9.3-p448.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/centos/5/x86_64/ruby-1.9.3-p484.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/centos/5/x86_64/ruby-1.9.3-p545.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/centos/5/x86_64/ruby-1.9.3-p547.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/centos/5/x86_64/ruby-1.9.3-p551.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/centos/5/x86_64/ruby-2.0.0-p0.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/centos/5/x86_64/ruby-2.0.0-p195.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/centos/5/x86_64/ruby-2.0.0-p247.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/centos/5/x86_64/ruby-2.0.0-p353.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/centos/5/x86_64/ruby-2.0.0-p451.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/centos/5/x86_64/ruby-2.0.0-p481.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/centos/5/x86_64/ruby-2.0.0-p576.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/centos/5/x86_64/ruby-2.0.0-p598.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/centos/5/x86_64/ruby-2.1.0.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/centos/5/x86_64/ruby-2.1.1.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/centos/5/x86_64/ruby-2.1.2.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/centos/5/x86_64/ruby-2.1.3.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/centos/5/x86_64/ruby-2.1.5.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/centos/5/x86_64/ruby-2.2.0.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/centos/5/x86_64/ruby-2.2.1.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/centos/6/x86_64/ruby-1.9.3-p194.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/centos/6/x86_64/ruby-1.9.3-p286.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/centos/6/x86_64/ruby-1.9.3-p327.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/centos/6/x86_64/ruby-1.9.3-p362.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/centos/6/x86_64/ruby-1.9.3-p392.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/centos/6/x86_64/ruby-1.9.3-p429.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/centos/6/x86_64/ruby-1.9.3-p448.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/centos/6/x86_64/ruby-1.9.3-p484.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/centos/6/x86_64/ruby-1.9.3-p547.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/centos/6/x86_64/ruby-1.9.3-p551.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/centos/6/x86_64/ruby-2.0.0-p0.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/centos/6/x86_64/ruby-2.0.0-p195.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/centos/6/x86_64/ruby-2.0.0-p247.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/centos/6/x86_64/ruby-2.0.0-p353.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/centos/6/x86_64/ruby-2.0.0-p481.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/centos/6/x86_64/ruby-2.0.0-p576.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/centos/6/x86_64/ruby-2.0.0-p598.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/centos/6/x86_64/ruby-2.1.0.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/centos/6/x86_64/ruby-2.1.2.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/centos/6/x86_64/ruby-2.1.3.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/centos/6/x86_64/ruby-2.1.5.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/centos/6/x86_64/ruby-2.2.0.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/centos/6/x86_64/ruby-2.2.1.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/centos/6/x86_64/ruby-2.3.1.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/centos/6/x86_64/ruby-2.4.0.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/centos/6/x86_64/ruby-2.4.1.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/centos/6/x86_64/ruby-2.4.2.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/centos/6/x86_64/ruby-2.4.3.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/centos/6/x86_64/ruby-2.4.4.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/centos/6/x86_64/ruby-2.4.5.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/centos/6/x86_64/ruby-2.4.6.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/centos/6/x86_64/ruby-2.4.7.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/centos/6/x86_64/ruby-2.4.8.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/centos/6/x86_64/ruby-2.4.9.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/centos/6/x86_64/ruby-2.4.10.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/centos/6/x86_64/ruby-2.5.0.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/centos/6/x86_64/ruby-2.5.1.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/centos/6/x86_64/ruby-2.5.2.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/centos/6/x86_64/ruby-2.5.3.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/centos/6/x86_64/ruby-2.5.4.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/centos/6/x86_64/ruby-2.5.5.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/centos/6/x86_64/ruby-2.5.6.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/centos/6/x86_64/ruby-2.5.7.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/centos/6/x86_64/ruby-2.5.8.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/centos/6/x86_64/ruby-2.6.0.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/centos/6/x86_64/ruby-2.6.1.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/centos/6/x86_64/ruby-2.6.2.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/centos/6/x86_64/ruby-2.6.3.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/centos/6/x86_64/ruby-2.6.4.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/centos/6/x86_64/ruby-2.6.5.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/centos/6/x86_64/ruby-2.6.6.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/centos/6/x86_64/ruby-2.7.0.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/centos/6/x86_64/ruby-2.7.1.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/centos/6/x86_64/ruby-2.7.2.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/centos/7/x86_64/ruby-2.4.0.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/centos/7/x86_64/ruby-2.4.1.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/centos/7/x86_64/ruby-2.4.2.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/centos/7/x86_64/ruby-2.4.3.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/centos/7/x86_64/ruby-2.4.4.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/centos/7/x86_64/ruby-2.4.5.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/centos/7/x86_64/ruby-2.4.6.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/centos/7/x86_64/ruby-2.4.7.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/centos/7/x86_64/ruby-2.4.8.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/centos/7/x86_64/ruby-2.4.9.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/centos/7/x86_64/ruby-2.4.10.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/centos/7/x86_64/ruby-2.5.0.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/centos/7/x86_64/ruby-2.5.1.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/centos/7/x86_64/ruby-2.5.2.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/centos/7/x86_64/ruby-2.5.3.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/centos/7/x86_64/ruby-2.5.4.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/centos/7/x86_64/ruby-2.5.5.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/centos/7/x86_64/ruby-2.5.6.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/centos/7/x86_64/ruby-2.5.7.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/centos/7/x86_64/ruby-2.5.8.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/centos/7/x86_64/ruby-2.6.0.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/centos/7/x86_64/ruby-2.6.1.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/centos/7/x86_64/ruby-2.6.2.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/centos/7/x86_64/ruby-2.6.3.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/centos/7/x86_64/ruby-2.6.4.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/centos/7/x86_64/ruby-2.6.5.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/centos/7/x86_64/ruby-2.6.6.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/centos/7/x86_64/ruby-2.7.0.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/centos/7/x86_64/ruby-2.7.1.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/centos/7/x86_64/ruby-2.7.2.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/centos/7/x86_64/ruby-3.0.0-preview1.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/centos/8/x86_64/ruby-2.4.0.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/centos/8/x86_64/ruby-2.4.1.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/centos/8/x86_64/ruby-2.4.2.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/centos/8/x86_64/ruby-2.4.3.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/centos/8/x86_64/ruby-2.4.4.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/centos/8/x86_64/ruby-2.4.5.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/centos/8/x86_64/ruby-2.4.6.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/centos/8/x86_64/ruby-2.4.7.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/centos/8/x86_64/ruby-2.4.8.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/centos/8/x86_64/ruby-2.4.9.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/centos/8/x86_64/ruby-2.4.10.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/centos/8/x86_64/ruby-2.5.0.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/centos/8/x86_64/ruby-2.5.1.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/centos/8/x86_64/ruby-2.5.2.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/centos/8/x86_64/ruby-2.5.3.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/centos/8/x86_64/ruby-2.5.4.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/centos/8/x86_64/ruby-2.5.5.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/centos/8/x86_64/ruby-2.5.6.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/centos/8/x86_64/ruby-2.5.7.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/centos/8/x86_64/ruby-2.5.8.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/centos/8/x86_64/ruby-2.6.0.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/centos/8/x86_64/ruby-2.6.1.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/centos/8/x86_64/ruby-2.6.2.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/centos/8/x86_64/ruby-2.6.3.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/centos/8/x86_64/ruby-2.6.4.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/centos/8/x86_64/ruby-2.6.5.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/centos/8/x86_64/ruby-2.6.6.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/centos/8/x86_64/ruby-2.7.0.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/centos/8/x86_64/ruby-2.7.1.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/centos/8/x86_64/ruby-2.7.2.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/centos/8/x86_64/ruby-3.0.0-preview1.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/debian/6/i386/ruby-1.9.3-p429.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/debian/6/i386/ruby-1.9.3-p448.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/debian/6/i386/ruby-2.0.0-p195.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/debian/6/i386/ruby-2.0.0-p247.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/debian/6/x86_64/ruby-1.9.3-p194.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/debian/6/x86_64/ruby-1.9.3-p286.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/debian/6/x86_64/ruby-1.9.3-p327.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/debian/6/x86_64/ruby-1.9.3-p362.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/debian/6/x86_64/ruby-1.9.3-p374.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/debian/6/x86_64/ruby-1.9.3-p392.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/debian/6/x86_64/ruby-1.9.3-p429.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/debian/6/x86_64/ruby-1.9.3-p448.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/debian/6/x86_64/ruby-2.0.0-p0.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/debian/6/x86_64/ruby-2.0.0-p195.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/debian/6/x86_64/ruby-2.0.0-p247.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/debian/7/armhf/ruby-1.9.3-p362.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/debian/7/armhf/ruby-1.9.3-p392.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/debian/7/armhf/ruby-1.9.3-p448.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/debian/7/armhf/ruby-2.0.0-p0.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/debian/7/armhf/ruby-2.0.0-p247.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/debian/7/i386/ruby-1.9.3-p429.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/debian/7/i386/ruby-1.9.3-p448.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/debian/7/i386/ruby-1.9.3-p484.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/debian/7/i386/ruby-1.9.3-p545.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/debian/7/i386/ruby-1.9.3-p547.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/debian/7/i386/ruby-1.9.3-p551.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/debian/7/i386/ruby-2.0.0-p195.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/debian/7/i386/ruby-2.0.0-p247.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/debian/7/i386/ruby-2.0.0-p353.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/debian/7/i386/ruby-2.0.0-p451.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/debian/7/i386/ruby-2.0.0-p481.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/debian/7/i386/ruby-2.0.0-p576.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/debian/7/i386/ruby-2.0.0-p598.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/debian/7/i386/ruby-2.1.0.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/debian/7/i386/ruby-2.1.1.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/debian/7/i386/ruby-2.1.2.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/debian/7/i386/ruby-2.1.3.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/debian/7/i386/ruby-2.1.5.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/debian/7/i386/ruby-2.2.0.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/debian/7/i386/ruby-2.2.1.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/debian/7/x86_64/ruby-1.9.3-p194.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/debian/7/x86_64/ruby-1.9.3-p286.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/debian/7/x86_64/ruby-1.9.3-p374.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/debian/7/x86_64/ruby-1.9.3-p392.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/debian/7/x86_64/ruby-1.9.3-p429.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/debian/7/x86_64/ruby-1.9.3-p448.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/debian/7/x86_64/ruby-1.9.3-p484.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/debian/7/x86_64/ruby-1.9.3-p545.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/debian/7/x86_64/ruby-1.9.3-p547.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/debian/7/x86_64/ruby-1.9.3-p551.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/debian/7/x86_64/ruby-2.0.0-p0.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/debian/7/x86_64/ruby-2.0.0-p195.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/debian/7/x86_64/ruby-2.0.0-p247.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/debian/7/x86_64/ruby-2.0.0-p353.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/debian/7/x86_64/ruby-2.0.0-p451.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/debian/7/x86_64/ruby-2.0.0-p481.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/debian/7/x86_64/ruby-2.0.0-p576.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/debian/7/x86_64/ruby-2.0.0-p598.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/debian/7/x86_64/ruby-2.1.0.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/debian/7/x86_64/ruby-2.1.1.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/debian/7/x86_64/ruby-2.1.2.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/debian/7/x86_64/ruby-2.1.3.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/debian/7/x86_64/ruby-2.1.5.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/debian/7/x86_64/ruby-2.2.0.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/debian/7/x86_64/ruby-2.2.1.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/debian/8/x86_64/ruby-1.9.3-p547.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/debian/8/x86_64/ruby-1.9.3-p551.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/debian/8/x86_64/ruby-2.0.0-p353.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/debian/8/x86_64/ruby-2.0.0-p481.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/debian/8/x86_64/ruby-2.0.0-p576.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/debian/8/x86_64/ruby-2.0.0-p598.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/debian/8/x86_64/ruby-2.1.0.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/debian/8/x86_64/ruby-2.1.2.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/debian/8/x86_64/ruby-2.1.3.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/debian/8/x86_64/ruby-2.1.5.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/debian/8/x86_64/ruby-2.2.0.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/debian/8/x86_64/ruby-2.2.1.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/debian/8/x86_64/ruby-2.2.6.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/debian/8/x86_64/ruby-2.3.0.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/debian/8/x86_64/ruby-2.3.1.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/debian/8/x86_64/ruby-2.3.2.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/debian/8/x86_64/ruby-2.3.3.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/debian/8/x86_64/ruby-2.4.0.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/debian/8/x86_64/ruby-2.4.1.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/debian/8/x86_64/ruby-2.4.2.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/debian/8/x86_64/ruby-2.4.3.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/debian/8/x86_64/ruby-2.4.4.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/debian/8/x86_64/ruby-2.4.5.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/debian/8/x86_64/ruby-2.4.6.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/debian/8/x86_64/ruby-2.4.7.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/debian/8/x86_64/ruby-2.4.8.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/debian/8/x86_64/ruby-2.4.9.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/debian/8/x86_64/ruby-2.4.10.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/debian/8/x86_64/ruby-2.5.0.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/debian/8/x86_64/ruby-2.5.1.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/debian/8/x86_64/ruby-2.5.2.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/debian/8/x86_64/ruby-2.5.3.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/debian/8/x86_64/ruby-2.5.4.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/debian/8/x86_64/ruby-2.5.5.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/debian/8/x86_64/ruby-2.5.6.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/debian/8/x86_64/ruby-2.5.7.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/debian/8/x86_64/ruby-2.5.8.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/debian/8/x86_64/ruby-2.6.0.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/debian/8/x86_64/ruby-2.6.1.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/debian/8/x86_64/ruby-2.6.2.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/debian/8/x86_64/ruby-2.6.3.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/debian/8/x86_64/ruby-2.6.4.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/debian/8/x86_64/ruby-2.6.5.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/debian/8/x86_64/ruby-2.6.6.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/debian/8/x86_64/ruby-2.7.0.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/debian/8/x86_64/ruby-2.7.1.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/debian/8/x86_64/ruby-2.7.2.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/debian/8/x86_64/ruby-3.0.0-preview1.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/debian/9/x86_64/ruby-2.4.0.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/debian/9/x86_64/ruby-2.4.1.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/debian/9/x86_64/ruby-2.4.2.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/debian/9/x86_64/ruby-2.4.3.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/debian/9/x86_64/ruby-2.4.4.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/debian/9/x86_64/ruby-2.4.5.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/debian/9/x86_64/ruby-2.4.6.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/debian/9/x86_64/ruby-2.4.7.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/debian/9/x86_64/ruby-2.4.8.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/debian/9/x86_64/ruby-2.4.9.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/debian/9/x86_64/ruby-2.4.10.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/debian/9/x86_64/ruby-2.5.0.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/debian/9/x86_64/ruby-2.5.1.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/debian/9/x86_64/ruby-2.5.2.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/debian/9/x86_64/ruby-2.5.3.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/debian/9/x86_64/ruby-2.5.4.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/debian/9/x86_64/ruby-2.5.5.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/debian/9/x86_64/ruby-2.5.6.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/debian/9/x86_64/ruby-2.5.7.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/debian/9/x86_64/ruby-2.5.8.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/debian/9/x86_64/ruby-2.6.0.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/debian/9/x86_64/ruby-2.6.1.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/debian/9/x86_64/ruby-2.6.2.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/debian/9/x86_64/ruby-2.6.3.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/debian/9/x86_64/ruby-2.6.4.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/debian/9/x86_64/ruby-2.6.5.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/debian/9/x86_64/ruby-2.6.6.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/debian/9/x86_64/ruby-2.7.0.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/debian/9/x86_64/ruby-2.7.1.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/debian/9/x86_64/ruby-2.7.2.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/debian/9/x86_64/ruby-3.0.0-preview1.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/debian/10/x86_64/ruby-2.4.0.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/debian/10/x86_64/ruby-2.4.1.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/debian/10/x86_64/ruby-2.4.2.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/debian/10/x86_64/ruby-2.4.3.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/debian/10/x86_64/ruby-2.4.4.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/debian/10/x86_64/ruby-2.4.5.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/debian/10/x86_64/ruby-2.4.6.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/debian/10/x86_64/ruby-2.4.7.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/debian/10/x86_64/ruby-2.4.8.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/debian/10/x86_64/ruby-2.4.9.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/debian/10/x86_64/ruby-2.4.10.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/debian/10/x86_64/ruby-2.5.0.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/debian/10/x86_64/ruby-2.5.1.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/debian/10/x86_64/ruby-2.5.2.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/debian/10/x86_64/ruby-2.5.3.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/debian/10/x86_64/ruby-2.5.4.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/debian/10/x86_64/ruby-2.5.5.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/debian/10/x86_64/ruby-2.5.6.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/debian/10/x86_64/ruby-2.5.7.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/debian/10/x86_64/ruby-2.5.8.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/debian/10/x86_64/ruby-2.6.0.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/debian/10/x86_64/ruby-2.6.1.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/debian/10/x86_64/ruby-2.6.2.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/debian/10/x86_64/ruby-2.6.3.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/debian/10/x86_64/ruby-2.6.4.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/debian/10/x86_64/ruby-2.6.5.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/debian/10/x86_64/ruby-2.6.6.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/debian/10/x86_64/ruby-2.7.0.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/debian/10/x86_64/ruby-2.7.1.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/debian/10/x86_64/ruby-2.7.2.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/debian/10/x86_64/ruby-3.0.0-preview1.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/fedora/17/x86_64/ruby-1.9.3-p429.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/fedora/17/x86_64/ruby-1.9.3-p448.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/fedora/17/x86_64/ruby-2.0.0-p195.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/fedora/17/x86_64/ruby-2.0.0-p247.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/fedora/18/x86_64/ruby-1.9.3-p429.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/fedora/18/x86_64/ruby-1.9.3-p448.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/fedora/18/x86_64/ruby-1.9.3-p484.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/fedora/18/x86_64/ruby-2.0.0-p195.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/fedora/18/x86_64/ruby-2.0.0-p247.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/fedora/18/x86_64/ruby-2.0.0-p353.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/fedora/18/x86_64/ruby-2.1.0.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/fedora/19/x86_64/ruby-1.9.3-p448.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/fedora/19/x86_64/ruby-1.9.3-p484.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/fedora/19/x86_64/ruby-1.9.3-p545.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/fedora/19/x86_64/ruby-1.9.3-p547.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/fedora/19/x86_64/ruby-1.9.3-p551.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/fedora/19/x86_64/ruby-2.0.0-p247.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/fedora/19/x86_64/ruby-2.0.0-p353.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/fedora/19/x86_64/ruby-2.0.0-p451.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/fedora/19/x86_64/ruby-2.0.0-p481.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/fedora/19/x86_64/ruby-2.0.0-p576.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/fedora/19/x86_64/ruby-2.0.0-p598.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/fedora/19/x86_64/ruby-2.1.0.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/fedora/19/x86_64/ruby-2.1.1.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/fedora/19/x86_64/ruby-2.1.2.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/fedora/19/x86_64/ruby-2.1.3.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/fedora/19/x86_64/ruby-2.1.5.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/fedora/19/x86_64/ruby-2.2.0.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/fedora/19/x86_64/ruby-2.2.1.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/fedora/20/x86_64/ruby-1.9.3-p547.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/fedora/20/x86_64/ruby-1.9.3-p551.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/fedora/20/x86_64/ruby-2.0.0-p481.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/fedora/20/x86_64/ruby-2.0.0-p576.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/fedora/20/x86_64/ruby-2.0.0-p598.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/fedora/20/x86_64/ruby-2.1.2.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/fedora/20/x86_64/ruby-2.1.3.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/fedora/20/x86_64/ruby-2.1.5.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/fedora/20/x86_64/ruby-2.2.0.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/fedora/20/x86_64/ruby-2.2.1.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/fedora/21/x86_64/ruby-1.9.3-p551.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/fedora/21/x86_64/ruby-2.0.0-p598.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/fedora/21/x86_64/ruby-2.1.5.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/fedora/21/x86_64/ruby-2.2.0.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/fedora/21/x86_64/ruby-2.2.1.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/opensuse/12.1/x86_64/ruby-1.9.3-p194.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/opensuse/12.1/x86_64/ruby-1.9.3-p286.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/opensuse/12.1/x86_64/ruby-1.9.3-p374.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/opensuse/12.1/x86_64/ruby-1.9.3-p392.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/opensuse/12.1/x86_64/ruby-2.0.0-p0.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/opensuse/12.2/x86_64/ruby-1.9.3-p194.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/opensuse/12.2/x86_64/ruby-1.9.3-p286.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/opensuse/12.2/x86_64/ruby-1.9.3-p327.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/opensuse/12.2/x86_64/ruby-1.9.3-p362.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/opensuse/12.2/x86_64/ruby-1.9.3-p374.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/opensuse/12.2/x86_64/ruby-1.9.3-p385.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/opensuse/12.2/x86_64/ruby-1.9.3-p392.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/opensuse/12.2/x86_64/ruby-2.0.0-p0.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/opensuse/12.3/x86_64/ruby-1.9.3-p392.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/opensuse/12.3/x86_64/ruby-1.9.3-p429.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/opensuse/12.3/x86_64/ruby-1.9.3-p448.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/opensuse/12.3/x86_64/ruby-1.9.3-p484.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/opensuse/12.3/x86_64/ruby-1.9.3-p545.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/opensuse/12.3/x86_64/ruby-1.9.3-p547.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/opensuse/12.3/x86_64/ruby-1.9.3-p551.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/opensuse/12.3/x86_64/ruby-2.0.0-p0.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/opensuse/12.3/x86_64/ruby-2.0.0-p195.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/opensuse/12.3/x86_64/ruby-2.0.0-p247.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/opensuse/12.3/x86_64/ruby-2.0.0-p353.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/opensuse/12.3/x86_64/ruby-2.0.0-p451.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/opensuse/12.3/x86_64/ruby-2.0.0-p481.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/opensuse/12.3/x86_64/ruby-2.0.0-p576.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/opensuse/12.3/x86_64/ruby-2.0.0-p598.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/opensuse/12.3/x86_64/ruby-2.1.0.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/opensuse/12.3/x86_64/ruby-2.1.1.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/opensuse/12.3/x86_64/ruby-2.1.2.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/opensuse/12.3/x86_64/ruby-2.1.3.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/opensuse/12.3/x86_64/ruby-2.1.5.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/opensuse/12.3/x86_64/ruby-2.2.0.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/opensuse/12.3/x86_64/ruby-2.2.1.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/opensuse/13.1/x86_64/ruby-1.9.3-p551.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/opensuse/13.1/x86_64/ruby-2.0.0-p576.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/opensuse/13.1/x86_64/ruby-2.0.0-p598.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/opensuse/13.1/x86_64/ruby-2.1.3.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/opensuse/13.1/x86_64/ruby-2.1.5.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/opensuse/13.1/x86_64/ruby-2.2.0.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/opensuse/13.1/x86_64/ruby-2.2.1.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.7/x86_64/ruby-2.0.0-p451.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.7/x86_64/ruby-2.0.0-p481.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.7/x86_64/ruby-2.0.0-p576.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.7/x86_64/ruby-2.0.0-p594.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.7/x86_64/ruby-2.0.0-p598.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.7/x86_64/ruby-2.0.0-p643.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.7/x86_64/ruby-2.0.0-p645.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.7/x86_64/ruby-2.0.0-p647.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.7/x86_64/ruby-2.1.0.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.7/x86_64/ruby-2.1.1.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.7/x86_64/ruby-2.1.2.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.7/x86_64/ruby-2.1.3.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.7/x86_64/ruby-2.1.4.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.7/x86_64/ruby-2.1.5.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.7/x86_64/ruby-2.1.6.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.7/x86_64/ruby-2.1.7.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.7/x86_64/ruby-2.2.0.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.7/x86_64/ruby-2.2.1.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.7/x86_64/ruby-2.2.2.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.7/x86_64/ruby-2.2.3.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.8/x86_64/ruby-2.0.0-p451.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.8/x86_64/ruby-2.0.0-p481.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.8/x86_64/ruby-2.0.0-p576.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.8/x86_64/ruby-2.0.0-p594.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.8/x86_64/ruby-2.0.0-p598.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.8/x86_64/ruby-2.0.0-p643.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.8/x86_64/ruby-2.0.0-p645.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.8/x86_64/ruby-2.0.0-p647.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.8/x86_64/ruby-2.1.0.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.8/x86_64/ruby-2.1.1.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.8/x86_64/ruby-2.1.2.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.8/x86_64/ruby-2.1.3.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.8/x86_64/ruby-2.1.4.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.8/x86_64/ruby-2.1.5.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.8/x86_64/ruby-2.1.6.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.8/x86_64/ruby-2.1.7.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.8/x86_64/ruby-2.2.0.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.8/x86_64/ruby-2.2.1.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.8/x86_64/ruby-2.2.2.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.8/x86_64/ruby-2.2.3.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.9/x86_64/ruby-2.0.0-p451.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.9/x86_64/ruby-2.0.0-p481.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.9/x86_64/ruby-2.0.0-p576.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.9/x86_64/ruby-2.0.0-p594.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.9/x86_64/ruby-2.0.0-p598.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.9/x86_64/ruby-2.0.0-p643.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.9/x86_64/ruby-2.0.0-p645.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.9/x86_64/ruby-2.0.0-p647.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.9/x86_64/ruby-2.1.0.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.9/x86_64/ruby-2.1.1.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.9/x86_64/ruby-2.1.2.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.9/x86_64/ruby-2.1.3.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.9/x86_64/ruby-2.1.4.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.9/x86_64/ruby-2.1.5.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.9/x86_64/ruby-2.1.6.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.9/x86_64/ruby-2.1.7.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.9/x86_64/ruby-2.2.0.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.9/x86_64/ruby-2.2.1.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.9/x86_64/ruby-2.2.2.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.9/x86_64/ruby-2.2.3.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/oracle/7/x86_64/ruby-2.4.0.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/oracle/7/x86_64/ruby-2.4.1.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/oracle/7/x86_64/ruby-2.4.2.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/oracle/7/x86_64/ruby-2.4.3.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/oracle/7/x86_64/ruby-2.4.4.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/oracle/7/x86_64/ruby-2.4.5.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/oracle/7/x86_64/ruby-2.4.6.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/oracle/7/x86_64/ruby-2.4.7.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/oracle/7/x86_64/ruby-2.4.8.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/oracle/7/x86_64/ruby-2.4.9.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/oracle/7/x86_64/ruby-2.4.10.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/oracle/7/x86_64/ruby-2.5.0.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/oracle/7/x86_64/ruby-2.5.1.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/oracle/7/x86_64/ruby-2.5.2.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/oracle/7/x86_64/ruby-2.5.3.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/oracle/7/x86_64/ruby-2.5.4.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/oracle/7/x86_64/ruby-2.5.5.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/oracle/7/x86_64/ruby-2.5.6.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/oracle/7/x86_64/ruby-2.5.7.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/oracle/7/x86_64/ruby-2.5.8.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/oracle/7/x86_64/ruby-2.6.0.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/oracle/7/x86_64/ruby-2.6.1.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/oracle/7/x86_64/ruby-2.6.2.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/oracle/7/x86_64/ruby-2.6.3.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/oracle/7/x86_64/ruby-2.6.4.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/oracle/7/x86_64/ruby-2.6.5.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/oracle/7/x86_64/ruby-2.6.6.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/oracle/7/x86_64/ruby-2.7.0.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/oracle/7/x86_64/ruby-2.7.1.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/oracle/7/x86_64/ruby-2.7.2.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/oracle/7/x86_64/ruby-3.0.0-preview1.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.10/x86_64/ruby-2.0.0-p451.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.10/x86_64/ruby-2.0.0-p481.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.10/x86_64/ruby-2.0.0-p576.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.10/x86_64/ruby-2.0.0-p594.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.10/x86_64/ruby-2.0.0-p598.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.10/x86_64/ruby-2.0.0-p643.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.10/x86_64/ruby-2.0.0-p645.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.10/x86_64/ruby-2.0.0-p647.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.10/x86_64/ruby-2.1.0.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.10/x86_64/ruby-2.1.1.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.10/x86_64/ruby-2.1.2.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.10/x86_64/ruby-2.1.3.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.10/x86_64/ruby-2.1.4.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.10/x86_64/ruby-2.1.5.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.10/x86_64/ruby-2.1.6.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.10/x86_64/ruby-2.1.7.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.10/x86_64/ruby-2.2.0.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.10/x86_64/ruby-2.2.1.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.10/x86_64/ruby-2.2.2.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.10/x86_64/ruby-2.2.3.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.11/x86_64/ruby-2.0.0-p451.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.11/x86_64/ruby-2.0.0-p481.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.11/x86_64/ruby-2.0.0-p576.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.11/x86_64/ruby-2.0.0-p594.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.11/x86_64/ruby-2.0.0-p598.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.11/x86_64/ruby-2.0.0-p643.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.11/x86_64/ruby-2.0.0-p645.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.11/x86_64/ruby-2.0.0-p647.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.11/x86_64/ruby-2.0.0-p648.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.11/x86_64/ruby-2.1.0.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.11/x86_64/ruby-2.1.1.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.11/x86_64/ruby-2.1.2.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.11/x86_64/ruby-2.1.3.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.11/x86_64/ruby-2.1.4.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.11/x86_64/ruby-2.1.5.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.11/x86_64/ruby-2.1.6.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.11/x86_64/ruby-2.1.7.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.11/x86_64/ruby-2.1.8.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.11/x86_64/ruby-2.1.9.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.11/x86_64/ruby-2.1.10.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.11/x86_64/ruby-2.2.0.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.11/x86_64/ruby-2.2.1.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.11/x86_64/ruby-2.2.2.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.11/x86_64/ruby-2.2.3.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.11/x86_64/ruby-2.2.4.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.11/x86_64/ruby-2.2.5.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.12/x86_64/ruby-2.0.0-p451.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.12/x86_64/ruby-2.0.0-p481.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.12/x86_64/ruby-2.0.0-p576.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.12/x86_64/ruby-2.0.0-p594.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.12/x86_64/ruby-2.0.0-p598.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.12/x86_64/ruby-2.0.0-p643.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.12/x86_64/ruby-2.0.0-p645.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.12/x86_64/ruby-2.0.0-p647.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.12/x86_64/ruby-2.1.0.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.12/x86_64/ruby-2.1.1.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.12/x86_64/ruby-2.1.2.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.12/x86_64/ruby-2.1.3.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.12/x86_64/ruby-2.1.4.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.12/x86_64/ruby-2.1.5.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.12/x86_64/ruby-2.1.6.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.12/x86_64/ruby-2.1.7.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.12/x86_64/ruby-2.2.0.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.12/x86_64/ruby-2.2.1.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.12/x86_64/ruby-2.2.2.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.12/x86_64/ruby-2.2.3.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/osx/10.12/x86_64/ruby-2.2.5.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/10.04/i386/ruby-1.9.3-p194.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/10.04/i386/ruby-1.9.3-p286.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/10.04/i386/ruby-1.9.3-p327.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/10.04/i386/ruby-1.9.3-p362.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/10.04/i386/ruby-1.9.3-p374.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/10.04/i386/ruby-1.9.3-p392.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/10.04/i386/ruby-1.9.3-p429.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/10.04/i386/ruby-1.9.3-p448.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/10.04/i386/ruby-1.9.3-p484.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/10.04/i386/ruby-1.9.3-p545.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/10.04/i386/ruby-1.9.3-p547.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/10.04/i386/ruby-1.9.3-p551.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/10.04/i386/ruby-2.0.0-p0.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/10.04/i386/ruby-2.0.0-p195.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/10.04/i386/ruby-2.0.0-p247.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/10.04/i386/ruby-2.0.0-p353.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/10.04/i386/ruby-2.0.0-p451.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/10.04/i386/ruby-2.0.0-p481.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/10.04/i386/ruby-2.0.0-p576.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/10.04/i386/ruby-2.0.0-p598.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/10.04/i386/ruby-2.1.0.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/10.04/i386/ruby-2.1.1.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/10.04/i386/ruby-2.1.2.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/10.04/i386/ruby-2.1.3.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/10.04/i386/ruby-2.1.5.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/10.04/i386/ruby-2.2.0.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/10.04/i386/ruby-2.2.1.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/10.04/x86_64/ruby-1.9.3-p194.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/10.04/x86_64/ruby-1.9.3-p286.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/10.04/x86_64/ruby-1.9.3-p327.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/10.04/x86_64/ruby-1.9.3-p362.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/10.04/x86_64/ruby-1.9.3-p374.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/10.04/x86_64/ruby-1.9.3-p392.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/10.04/x86_64/ruby-1.9.3-p429.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/10.04/x86_64/ruby-1.9.3-p448.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/10.04/x86_64/ruby-1.9.3-p484.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/10.04/x86_64/ruby-1.9.3-p545.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/10.04/x86_64/ruby-1.9.3-p547.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/10.04/x86_64/ruby-1.9.3-p551.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/10.04/x86_64/ruby-2.0.0-p0.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/10.04/x86_64/ruby-2.0.0-p195.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/10.04/x86_64/ruby-2.0.0-p247.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/10.04/x86_64/ruby-2.0.0-p353.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/10.04/x86_64/ruby-2.0.0-p451.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/10.04/x86_64/ruby-2.0.0-p481.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/10.04/x86_64/ruby-2.0.0-p576.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/10.04/x86_64/ruby-2.0.0-p598.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/10.04/x86_64/ruby-2.1.0.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/10.04/x86_64/ruby-2.1.1.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/10.04/x86_64/ruby-2.1.2.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/10.04/x86_64/ruby-2.1.3.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/10.04/x86_64/ruby-2.1.5.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/10.04/x86_64/ruby-2.2.0.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/10.04/x86_64/ruby-2.2.1.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/11.10/x86_64/ruby-1.9.3-p194.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/11.10/x86_64/ruby-1.9.3-p286.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/11.10/x86_64/ruby-1.9.3-p327.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/11.10/x86_64/ruby-1.9.3-p362.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/11.10/x86_64/ruby-1.9.3-p374.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/11.10/x86_64/ruby-1.9.3-p392.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/11.10/x86_64/ruby-2.0.0-p0.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.04/i386/ruby-1.9.3-p194.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.04/i386/ruby-1.9.3-p286.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.04/i386/ruby-1.9.3-p327.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.04/i386/ruby-1.9.3-p362.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.04/i386/ruby-1.9.3-p374.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.04/i386/ruby-1.9.3-p392.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.04/i386/ruby-1.9.3-p429.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.04/i386/ruby-1.9.3-p448.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.04/i386/ruby-1.9.3-p484.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.04/i386/ruby-1.9.3-p545.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.04/i386/ruby-1.9.3-p547.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.04/i386/ruby-1.9.3-p551.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.04/i386/ruby-2.0.0-p0.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.04/i386/ruby-2.0.0-p195.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.04/i386/ruby-2.0.0-p247.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.04/i386/ruby-2.0.0-p353.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.04/i386/ruby-2.0.0-p451.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.04/i386/ruby-2.0.0-p481.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.04/i386/ruby-2.0.0-p576.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.04/i386/ruby-2.0.0-p598.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.04/i386/ruby-2.1.0.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.04/i386/ruby-2.1.1.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.04/i386/ruby-2.1.2.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.04/i386/ruby-2.1.3.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.04/i386/ruby-2.1.5.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.04/i386/ruby-2.2.0.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.04/i386/ruby-2.2.1.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.04/x86_64/ruby-1.9.3-p194.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.04/x86_64/ruby-1.9.3-p286.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.04/x86_64/ruby-1.9.3-p327.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.04/x86_64/ruby-1.9.3-p362.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.04/x86_64/ruby-1.9.3-p374.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.04/x86_64/ruby-1.9.3-p392.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.04/x86_64/ruby-1.9.3-p429.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.04/x86_64/ruby-1.9.3-p448.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.04/x86_64/ruby-1.9.3-p484.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.04/x86_64/ruby-1.9.3-p547.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.04/x86_64/ruby-1.9.3-p551.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.04/x86_64/ruby-2.0.0-p0.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.04/x86_64/ruby-2.0.0-p195.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.04/x86_64/ruby-2.0.0-p247.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.04/x86_64/ruby-2.0.0-p353.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.04/x86_64/ruby-2.0.0-p481.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.04/x86_64/ruby-2.0.0-p576.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.04/x86_64/ruby-2.0.0-p598.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.04/x86_64/ruby-2.1.0.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.04/x86_64/ruby-2.1.2.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.04/x86_64/ruby-2.1.3.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.04/x86_64/ruby-2.1.5.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.04/x86_64/ruby-2.2.0.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.04/x86_64/ruby-2.2.1.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.04/x86_64/ruby-2.4.0.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.04/x86_64/ruby-2.4.1.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.04/x86_64/ruby-2.4.2.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.04/x86_64/ruby-2.4.3.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.04/x86_64/ruby-2.4.4.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.04/x86_64/ruby-2.4.5.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.04/x86_64/ruby-2.4.6.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.04/x86_64/ruby-2.4.7.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.04/x86_64/ruby-2.4.8.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.04/x86_64/ruby-2.4.9.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.04/x86_64/ruby-2.4.10.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.04/x86_64/ruby-2.5.0.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.04/x86_64/ruby-2.5.1.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.04/x86_64/ruby-2.5.2.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.04/x86_64/ruby-2.5.3.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.04/x86_64/ruby-2.5.4.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.04/x86_64/ruby-2.5.5.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.04/x86_64/ruby-2.5.6.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.04/x86_64/ruby-2.5.7.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.04/x86_64/ruby-2.5.8.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.04/x86_64/ruby-2.6.0.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.04/x86_64/ruby-2.6.1.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.04/x86_64/ruby-2.6.2.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.04/x86_64/ruby-2.6.3.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.04/x86_64/ruby-2.6.4.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.04/x86_64/ruby-2.6.5.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.04/x86_64/ruby-2.6.6.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.04/x86_64/ruby-2.7.0.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.04/x86_64/ruby-2.7.1.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.10/x86_64/ruby-1.9.3-p194.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.10/x86_64/ruby-1.9.3-p286.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.10/x86_64/ruby-1.9.3-p327.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.10/x86_64/ruby-1.9.3-p362.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.10/x86_64/ruby-1.9.3-p374.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.10/x86_64/ruby-1.9.3-p392.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.10/x86_64/ruby-1.9.3-p429.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.10/x86_64/ruby-1.9.3-p448.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.10/x86_64/ruby-1.9.3-p484.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.10/x86_64/ruby-1.9.3-p545.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.10/x86_64/ruby-1.9.3-p547.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.10/x86_64/ruby-1.9.3-p551.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.10/x86_64/ruby-2.0.0-p0.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.10/x86_64/ruby-2.0.0-p195.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.10/x86_64/ruby-2.0.0-p247.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.10/x86_64/ruby-2.0.0-p353.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.10/x86_64/ruby-2.0.0-p451.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.10/x86_64/ruby-2.0.0-p481.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.10/x86_64/ruby-2.0.0-p576.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.10/x86_64/ruby-2.0.0-p598.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.10/x86_64/ruby-2.1.0.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.10/x86_64/ruby-2.1.1.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.10/x86_64/ruby-2.1.2.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.10/x86_64/ruby-2.1.3.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/12.10/x86_64/ruby-2.1.5.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/13.04/i386/ruby-1.9.3-p429.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/13.04/i386/ruby-1.9.3-p448.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/13.04/i386/ruby-1.9.3-p484.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/13.04/i386/ruby-1.9.3-p545.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/13.04/i386/ruby-1.9.3-p547.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/13.04/i386/ruby-1.9.3-p551.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/13.04/i386/ruby-2.0.0-p195.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/13.04/i386/ruby-2.0.0-p247.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/13.04/i386/ruby-2.0.0-p353.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/13.04/i386/ruby-2.0.0-p451.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/13.04/i386/ruby-2.0.0-p481.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/13.04/i386/ruby-2.0.0-p576.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/13.04/i386/ruby-2.0.0-p598.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/13.04/i386/ruby-2.1.0.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/13.04/i386/ruby-2.1.1.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/13.04/i386/ruby-2.1.2.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/13.04/i386/ruby-2.1.3.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/13.04/i386/ruby-2.1.5.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/13.04/x86_64/ruby-1.9.3-p392.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/13.04/x86_64/ruby-1.9.3-p429.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/13.04/x86_64/ruby-1.9.3-p448.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/13.04/x86_64/ruby-1.9.3-p484.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/13.04/x86_64/ruby-1.9.3-p545.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/13.04/x86_64/ruby-1.9.3-p547.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/13.04/x86_64/ruby-1.9.3-p551.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/13.04/x86_64/ruby-2.0.0-p0.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/13.04/x86_64/ruby-2.0.0-p195.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/13.04/x86_64/ruby-2.0.0-p247.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/13.04/x86_64/ruby-2.0.0-p353.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/13.04/x86_64/ruby-2.0.0-p451.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/13.04/x86_64/ruby-2.0.0-p481.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/13.04/x86_64/ruby-2.0.0-p576.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/13.04/x86_64/ruby-2.0.0-p598.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/13.04/x86_64/ruby-2.1.0.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/13.04/x86_64/ruby-2.1.1.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/13.04/x86_64/ruby-2.1.2.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/13.04/x86_64/ruby-2.1.3.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/13.04/x86_64/ruby-2.1.5.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/13.10/x86_64/ruby-1.9.3-p547.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/13.10/x86_64/ruby-1.9.3-p551.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/13.10/x86_64/ruby-2.0.0-p481.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/13.10/x86_64/ruby-2.0.0-p576.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/13.10/x86_64/ruby-2.0.0-p598.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/13.10/x86_64/ruby-2.1.2.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/13.10/x86_64/ruby-2.1.3.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/13.10/x86_64/ruby-2.1.5.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/14.04/x86_64/ruby-1.9.3-p547.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/14.04/x86_64/ruby-1.9.3-p551.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/14.04/x86_64/ruby-2.0.0-p481.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/14.04/x86_64/ruby-2.0.0-p576.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/14.04/x86_64/ruby-2.0.0-p598.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/14.04/x86_64/ruby-2.1.0.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/14.04/x86_64/ruby-2.1.1.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/14.04/x86_64/ruby-2.1.2.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/14.04/x86_64/ruby-2.1.3.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/14.04/x86_64/ruby-2.1.4.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/14.04/x86_64/ruby-2.1.5.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/14.04/x86_64/ruby-2.1.6.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/14.04/x86_64/ruby-2.1.7.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/14.04/x86_64/ruby-2.1.8.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/14.04/x86_64/ruby-2.1.9.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/14.04/x86_64/ruby-2.1.10.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/14.04/x86_64/ruby-2.2.0.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/14.04/x86_64/ruby-2.2.1.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/14.04/x86_64/ruby-2.2.2.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/14.04/x86_64/ruby-2.2.3.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/14.04/x86_64/ruby-2.2.4.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/14.04/x86_64/ruby-2.2.5.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/14.04/x86_64/ruby-2.2.6.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/14.04/x86_64/ruby-2.2.7.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/14.04/x86_64/ruby-2.2.8.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/14.04/x86_64/ruby-2.2.9.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/14.04/x86_64/ruby-2.2.10.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/14.04/x86_64/ruby-2.3.0.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/14.04/x86_64/ruby-2.3.1.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/14.04/x86_64/ruby-2.3.2.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/14.04/x86_64/ruby-2.3.3.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/14.04/x86_64/ruby-2.3.4.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/14.04/x86_64/ruby-2.3.5.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/14.04/x86_64/ruby-2.3.6.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/14.04/x86_64/ruby-2.3.7.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/14.04/x86_64/ruby-2.3.8.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/14.04/x86_64/ruby-2.4.0.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/14.04/x86_64/ruby-2.4.1.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/14.04/x86_64/ruby-2.4.2.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/14.04/x86_64/ruby-2.4.3.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/14.04/x86_64/ruby-2.4.4.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/14.04/x86_64/ruby-2.4.5.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/14.04/x86_64/ruby-2.4.6.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/14.04/x86_64/ruby-2.4.7.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/14.04/x86_64/ruby-2.4.8.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/14.04/x86_64/ruby-2.4.9.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/14.04/x86_64/ruby-2.4.10.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/14.04/x86_64/ruby-2.5.0.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/14.04/x86_64/ruby-2.5.1.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/14.04/x86_64/ruby-2.5.2.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/14.04/x86_64/ruby-2.5.3.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/14.04/x86_64/ruby-2.5.4.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/14.04/x86_64/ruby-2.5.5.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/14.04/x86_64/ruby-2.5.6.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/14.04/x86_64/ruby-2.5.7.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/14.04/x86_64/ruby-2.5.8.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/14.04/x86_64/ruby-2.6.0.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/14.04/x86_64/ruby-2.6.1.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/14.04/x86_64/ruby-2.6.2.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/14.04/x86_64/ruby-2.6.3.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/14.04/x86_64/ruby-2.6.4.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/14.04/x86_64/ruby-2.6.5.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/14.04/x86_64/ruby-2.6.6.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/14.04/x86_64/ruby-2.7.0.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/14.04/x86_64/ruby-2.7.1.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/14.04/x86_64/ruby-2.7.2.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/14.04/x86_64/ruby-3.0.0-preview1.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/14.10/x86_64/ruby-1.9.3-p551.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/14.10/x86_64/ruby-2.0.0-p598.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/14.10/x86_64/ruby-2.1.5.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/14.10/x86_64/ruby-2.2.0.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/14.10/x86_64/ruby-2.2.1.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/16.04/x86_64/ruby-2.0.0-p648.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/16.04/x86_64/ruby-2.1.0.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/16.04/x86_64/ruby-2.1.1.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/16.04/x86_64/ruby-2.1.2.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/16.04/x86_64/ruby-2.1.3.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/16.04/x86_64/ruby-2.1.4.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/16.04/x86_64/ruby-2.1.5.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/16.04/x86_64/ruby-2.1.6.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/16.04/x86_64/ruby-2.1.7.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/16.04/x86_64/ruby-2.1.8.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/16.04/x86_64/ruby-2.1.9.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/16.04/x86_64/ruby-2.1.10.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/16.04/x86_64/ruby-2.2.0.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/16.04/x86_64/ruby-2.2.1.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/16.04/x86_64/ruby-2.2.2.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/16.04/x86_64/ruby-2.2.3.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/16.04/x86_64/ruby-2.2.4.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/16.04/x86_64/ruby-2.2.5.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/16.04/x86_64/ruby-2.2.6.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/16.04/x86_64/ruby-2.2.7.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/16.04/x86_64/ruby-2.2.8.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/16.04/x86_64/ruby-2.2.9.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/16.04/x86_64/ruby-2.2.10.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/16.04/x86_64/ruby-2.3.0.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/16.04/x86_64/ruby-2.3.1.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/16.04/x86_64/ruby-2.3.2.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/16.04/x86_64/ruby-2.3.3.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/16.04/x86_64/ruby-2.3.4.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/16.04/x86_64/ruby-2.3.5.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/16.04/x86_64/ruby-2.3.6.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/16.04/x86_64/ruby-2.3.7.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/16.04/x86_64/ruby-2.3.8.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/16.04/x86_64/ruby-2.4.0.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/16.04/x86_64/ruby-2.4.1.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/16.04/x86_64/ruby-2.4.2.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/16.04/x86_64/ruby-2.4.3.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/16.04/x86_64/ruby-2.4.4.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/16.04/x86_64/ruby-2.4.5.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/16.04/x86_64/ruby-2.4.6.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/16.04/x86_64/ruby-2.4.7.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/16.04/x86_64/ruby-2.4.8.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/16.04/x86_64/ruby-2.4.9.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/16.04/x86_64/ruby-2.4.10.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/16.04/x86_64/ruby-2.5.0.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/16.04/x86_64/ruby-2.5.1.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/16.04/x86_64/ruby-2.5.2.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/16.04/x86_64/ruby-2.5.3.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/16.04/x86_64/ruby-2.5.4.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/16.04/x86_64/ruby-2.5.5.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/16.04/x86_64/ruby-2.5.6.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/16.04/x86_64/ruby-2.5.7.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/16.04/x86_64/ruby-2.5.8.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/16.04/x86_64/ruby-2.6.0.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/16.04/x86_64/ruby-2.6.1.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/16.04/x86_64/ruby-2.6.2.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/16.04/x86_64/ruby-2.6.3.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/16.04/x86_64/ruby-2.6.4.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/16.04/x86_64/ruby-2.6.5.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/16.04/x86_64/ruby-2.6.6.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/16.04/x86_64/ruby-2.7.0.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/16.04/x86_64/ruby-2.7.1.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/16.04/x86_64/ruby-2.7.2.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/16.04/x86_64/ruby-3.0.0-preview1.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/16.10/x86_64/ruby-1.9.3-p551.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/16.10/x86_64/ruby-2.0.0-p648.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/16.10/x86_64/ruby-2.1.5.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/16.10/x86_64/ruby-2.1.6.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/16.10/x86_64/ruby-2.1.8.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/16.10/x86_64/ruby-2.1.9.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/16.10/x86_64/ruby-2.2.4.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/16.10/x86_64/ruby-2.2.5.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/16.10/x86_64/ruby-2.2.6.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/16.10/x86_64/ruby-2.3.0.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/16.10/x86_64/ruby-2.3.1.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/16.10/x86_64/ruby-2.3.2.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/16.10/x86_64/ruby-2.3.3.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/17.04/x86_64/ruby-2.1.6.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/17.04/x86_64/ruby-2.1.7.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/17.04/x86_64/ruby-2.1.8.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/17.04/x86_64/ruby-2.1.9.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/17.04/x86_64/ruby-2.1.10.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/17.04/x86_64/ruby-2.2.0.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/17.04/x86_64/ruby-2.2.1.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/17.04/x86_64/ruby-2.2.2.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/17.04/x86_64/ruby-2.2.3.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/17.04/x86_64/ruby-2.2.4.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/17.04/x86_64/ruby-2.2.5.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/17.04/x86_64/ruby-2.2.6.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/17.04/x86_64/ruby-2.2.7.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/17.04/x86_64/ruby-2.2.8.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/17.04/x86_64/ruby-2.3.0.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/17.04/x86_64/ruby-2.3.1.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/17.04/x86_64/ruby-2.3.3.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/17.04/x86_64/ruby-2.3.4.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/17.04/x86_64/ruby-2.3.5.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/17.04/x86_64/ruby-2.4.0.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/17.04/x86_64/ruby-2.4.1.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/17.04/x86_64/ruby-2.4.2.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/18.04/x86_64/ruby-2.1.0.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/18.04/x86_64/ruby-2.1.1.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/18.04/x86_64/ruby-2.1.2.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/18.04/x86_64/ruby-2.1.3.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/18.04/x86_64/ruby-2.1.4.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/18.04/x86_64/ruby-2.1.5.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/18.04/x86_64/ruby-2.1.6.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/18.04/x86_64/ruby-2.1.7.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/18.04/x86_64/ruby-2.1.8.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/18.04/x86_64/ruby-2.1.9.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/18.04/x86_64/ruby-2.1.10.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/18.04/x86_64/ruby-2.2.0.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/18.04/x86_64/ruby-2.2.1.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/18.04/x86_64/ruby-2.2.2.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/18.04/x86_64/ruby-2.2.3.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/18.04/x86_64/ruby-2.2.4.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/18.04/x86_64/ruby-2.2.5.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/18.04/x86_64/ruby-2.2.6.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/18.04/x86_64/ruby-2.2.7.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/18.04/x86_64/ruby-2.2.8.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/18.04/x86_64/ruby-2.2.9.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/18.04/x86_64/ruby-2.2.10.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/18.04/x86_64/ruby-2.3.0.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/18.04/x86_64/ruby-2.3.1.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/18.04/x86_64/ruby-2.3.2.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/18.04/x86_64/ruby-2.3.3.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/18.04/x86_64/ruby-2.3.4.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/18.04/x86_64/ruby-2.3.5.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/18.04/x86_64/ruby-2.3.6.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/18.04/x86_64/ruby-2.3.7.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/18.04/x86_64/ruby-2.3.8.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/18.04/x86_64/ruby-2.4.0.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/18.04/x86_64/ruby-2.4.1.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/18.04/x86_64/ruby-2.4.2.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/18.04/x86_64/ruby-2.4.3.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/18.04/x86_64/ruby-2.4.4.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/18.04/x86_64/ruby-2.4.5.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/18.04/x86_64/ruby-2.4.6.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/18.04/x86_64/ruby-2.4.7.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/18.04/x86_64/ruby-2.4.8.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/18.04/x86_64/ruby-2.4.9.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/18.04/x86_64/ruby-2.4.10.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/18.04/x86_64/ruby-2.5.0.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/18.04/x86_64/ruby-2.5.1.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/18.04/x86_64/ruby-2.5.2.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/18.04/x86_64/ruby-2.5.3.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/18.04/x86_64/ruby-2.5.4.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/18.04/x86_64/ruby-2.5.5.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/18.04/x86_64/ruby-2.5.6.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/18.04/x86_64/ruby-2.5.7.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/18.04/x86_64/ruby-2.5.8.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/18.04/x86_64/ruby-2.6.0.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/18.04/x86_64/ruby-2.6.1.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/18.04/x86_64/ruby-2.6.2.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/18.04/x86_64/ruby-2.6.3.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/18.04/x86_64/ruby-2.6.4.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/18.04/x86_64/ruby-2.6.5.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/18.04/x86_64/ruby-2.6.6.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/18.04/x86_64/ruby-2.7.0.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/18.04/x86_64/ruby-2.7.1.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/18.04/x86_64/ruby-2.7.2.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/18.04/x86_64/ruby-3.0.0-preview1.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/19.10/x86_64/ruby-2.4.0.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/19.10/x86_64/ruby-2.4.1.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/19.10/x86_64/ruby-2.4.2.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/19.10/x86_64/ruby-2.4.3.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/19.10/x86_64/ruby-2.4.4.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/19.10/x86_64/ruby-2.4.5.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/19.10/x86_64/ruby-2.4.6.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/19.10/x86_64/ruby-2.4.7.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/19.10/x86_64/ruby-2.4.8.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/19.10/x86_64/ruby-2.4.9.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/19.10/x86_64/ruby-2.4.10.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/19.10/x86_64/ruby-2.5.0.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/19.10/x86_64/ruby-2.5.1.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/19.10/x86_64/ruby-2.5.2.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/19.10/x86_64/ruby-2.5.3.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/19.10/x86_64/ruby-2.5.4.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/19.10/x86_64/ruby-2.5.5.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/19.10/x86_64/ruby-2.5.6.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/19.10/x86_64/ruby-2.5.7.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/19.10/x86_64/ruby-2.5.8.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/19.10/x86_64/ruby-2.6.0.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/19.10/x86_64/ruby-2.6.1.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/19.10/x86_64/ruby-2.6.2.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/19.10/x86_64/ruby-2.6.3.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/19.10/x86_64/ruby-2.6.4.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/19.10/x86_64/ruby-2.6.5.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/19.10/x86_64/ruby-2.6.6.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/19.10/x86_64/ruby-2.7.0.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/19.10/x86_64/ruby-2.7.1.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/19.10/x86_64/ruby-2.7.2.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/19.10/x86_64/ruby-3.0.0-preview1.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/20.04/x86_64/ruby-2.1.0.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/20.04/x86_64/ruby-2.1.1.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/20.04/x86_64/ruby-2.1.2.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/20.04/x86_64/ruby-2.1.3.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/20.04/x86_64/ruby-2.1.4.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/20.04/x86_64/ruby-2.1.5.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/20.04/x86_64/ruby-2.1.6.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/20.04/x86_64/ruby-2.1.7.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/20.04/x86_64/ruby-2.1.8.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/20.04/x86_64/ruby-2.1.9.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/20.04/x86_64/ruby-2.1.10.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/20.04/x86_64/ruby-2.2.0.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/20.04/x86_64/ruby-2.2.1.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/20.04/x86_64/ruby-2.2.2.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/20.04/x86_64/ruby-2.2.3.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/20.04/x86_64/ruby-2.2.4.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/20.04/x86_64/ruby-2.2.5.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/20.04/x86_64/ruby-2.2.6.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/20.04/x86_64/ruby-2.2.7.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/20.04/x86_64/ruby-2.2.8.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/20.04/x86_64/ruby-2.2.9.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/20.04/x86_64/ruby-2.2.10.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/20.04/x86_64/ruby-2.3.0.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/20.04/x86_64/ruby-2.3.1.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/20.04/x86_64/ruby-2.3.2.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/20.04/x86_64/ruby-2.3.3.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/20.04/x86_64/ruby-2.3.4.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/20.04/x86_64/ruby-2.3.5.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/20.04/x86_64/ruby-2.3.6.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/20.04/x86_64/ruby-2.3.7.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/20.04/x86_64/ruby-2.3.8.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/20.04/x86_64/ruby-2.4.0.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/20.04/x86_64/ruby-2.4.1.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/20.04/x86_64/ruby-2.4.2.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/20.04/x86_64/ruby-2.4.3.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/20.04/x86_64/ruby-2.4.4.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/20.04/x86_64/ruby-2.4.5.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/20.04/x86_64/ruby-2.4.6.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/20.04/x86_64/ruby-2.4.7.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/20.04/x86_64/ruby-2.4.8.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/20.04/x86_64/ruby-2.4.9.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/20.04/x86_64/ruby-2.4.10.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/20.04/x86_64/ruby-2.5.0.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/20.04/x86_64/ruby-2.5.1.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/20.04/x86_64/ruby-2.5.2.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/20.04/x86_64/ruby-2.5.3.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/20.04/x86_64/ruby-2.5.4.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/20.04/x86_64/ruby-2.5.5.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/20.04/x86_64/ruby-2.5.6.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/20.04/x86_64/ruby-2.5.7.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/20.04/x86_64/ruby-2.5.8.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/20.04/x86_64/ruby-2.6.0.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/20.04/x86_64/ruby-2.6.1.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/20.04/x86_64/ruby-2.6.2.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/20.04/x86_64/ruby-2.6.3.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/20.04/x86_64/ruby-2.6.4.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/20.04/x86_64/ruby-2.6.5.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/20.04/x86_64/ruby-2.6.6.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/20.04/x86_64/ruby-2.7.0.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/20.04/x86_64/ruby-2.7.1.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/20.04/x86_64/ruby-2.7.2.tar.bz2
https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/20.04/x86_64/ruby-3.0.0.tar.bz2
src/rvm/config/known_strings000066400000014637147511530540012256 0ustar00ironruby-1.0
ironruby-1.1.3
jruby-0.9.0
jruby-0.9.1
jruby-0.9.2
jruby-0.9.8
jruby-0.9.9
jruby-1.0.0RC1
jruby-1.0.0RC2
jruby-1.0.0RC3
jruby-1.0
jruby-1.0.1
jruby-1.0.2
jruby-1.0.3
jruby-1.1b1
jruby-1.1RC1
jruby-1.1RC2
jruby-1.1RC3
jruby-1.1
jruby-1.1.1
jruby-1.1.2
jruby-1.1.3
jruby-1.1.4
jruby-1.1.5
jruby-1.1.6RC1
jruby-1.1.6
jruby-1.2.0RC1
jruby-1.2.0RC2
jruby-1.2.0
jruby-1.3.0RC1
jruby-1.3.0RC2
jruby-1.3.0
jruby-1.3.1
jruby-1.4.0RC1
jruby-1.4.0RC2
jruby-1.4.0RC3
jruby-1.4.0
jruby-1.4.1
jruby-1.5.0.RC1
jruby-1.5.0.RC2
jruby-1.5.0.RC3
jruby-1.5.0
jruby-1.5.1
jruby-1.5.2
jruby-1.5.3
jruby-1.5.4
jruby-1.5.5
jruby-1.5.6
jruby-1.6.0.RC1
jruby-1.6.0.RC2
jruby-1.6.0.RC3
jruby-1.6.0
jruby-1.6.1
jruby-1.6.2
jruby-1.6.3
jruby-1.6.4
jruby-1.6.5
jruby-1.6.5.1
jruby-1.6.7
jruby-1.6.7.2
jruby-1.6.8
jruby-1.7.0.preview1
jruby-1.7.0.preview2
jruby-1.7.0.RC1
jruby-1.7.0.RC2
jruby-1.7.0
jruby-1.7.1
jruby-1.7.2
jruby-1.7.3
jruby-1.7.4
jruby-1.7.5
jruby-1.7.6
jruby-1.7.7
jruby-1.7.8
jruby-1.7.9
jruby-1.7.10
jruby-1.7.11
jruby-1.7.12
jruby-1.7.13
jruby-1.7.14
jruby-1.7.15
jruby-1.7.16
jruby-1.7.16.1
jruby-1.7.16.2
jruby-1.7.17
jruby-1.7.18
jruby-1.7.19
jruby-1.7.20
jruby-1.7.20.1
jruby-1.7.21
jruby-1.7.22
jruby-1.7.23
jruby-1.7.24
jruby-1.7.25
jruby-1.7.26
jruby-1.7.27
jruby-9.0.0.0.pre1
jruby-9.0.0.0.pre2
jruby-9.0.0.0.rc1
jruby-9.0.0.0.rc2
jruby-9.0.0.0
jruby-9.0.1.0
jruby-9.0.2.0
jruby-9.0.3.0
jruby-9.0.4.0
jruby-9.0.5.0
jruby-9.1.0.0
jruby-9.1.1.0
jruby-9.1.2.0
jruby-9.1.3.0
jruby-9.1.4.0
jruby-9.1.5.0
jruby-9.1.6.0
jruby-9.1.7.0
jruby-9.1.8.0
jruby-9.1.9.0
jruby-9.1.10.0
jruby-9.1.11.0
jruby-9.1.12.0
jruby-9.1.13.0
jruby-9.1.14.0
jruby-9.1.15.0
jruby-9.1.16.0
jruby-9.1.17.0
jruby-9.2.0.0
jruby-9.2.1.0
jruby-9.2.2.0
jruby-9.2.3.0
jruby-9.2.4.0
jruby-9.2.4.1
jruby-9.2.5.0
jruby-9.2.6.0
jruby-9.2.7.0
jruby-9.2.8.0
jruby-9.2.9.0
jruby-9.2.10.0
jruby-9.2.11.0
jruby-9.2.11.1
jruby-9.2.12.0
jruby-9.2.13.0
jruby-9.2.14.0
macruby-0.12
maglev-1.0.0
maglev-1.1beta
maglev-1.1beta2
maglev-1.1RC1
maglev-1.2Alpha
maglev-1.2Alpha2
maglev-1.2Alpha3
maglev-1.2Alpha4
mruby-1.0.0
mruby-1.1.0
mruby-1.2.0
mruby-1.3.0
mruby-1.4.0
mruby-1.4.1
mruby-2.0.0
mruby-2.0.1
mruby-2.1.0-rc
mruby-2.1.0
mruby-2.1.1-rc
mruby-2.1.1-rc2
mruby-2.1.1
rbx-1.0.0-20100514
rbx-1.0.1-20100603
rbx-1.1.0-20100923
rbx-1.1.1-20101116
rbx-1.2.0-20101221
rbx-1.2.1-20110215
rbx-1.2.2-20110222
rbx-1.2.3-20110315
rbx-1.2.4-20110705
rbx-1.3.2
rbx-1.3.3
rbx-1.4.1
rbx-1.4.3
rbx-2.0.0
rbx-2.1.0
rbx-2.1.1
rbx-2.2.0
rbx-2.2.2
rbx-2.2.3
rbx-2.2.4
rbx-2.2.5
rbx-2.2.6
rbx-2.2.7
rbx-2.2.8
rbx-2.2.9
rbx-2.2.10
rbx-2.3.0
rbx-2.4.0
rbx-2.4.1
rbx-2.5.0
rbx-2.5.1
rbx-2.5.2
rbx-2.5.3
rbx-2.5.4
rbx-2.5.5
rbx-2.5.6
rbx-2.5.7
rbx-2.5.8
rbx-3.70
rbx-3.71
rbx-3.72
rbx-3.73
rbx-3.74
rbx-3.75
rbx-3.76
rbx-3.77
rbx-3.78
rbx-3.79
rbx-3.80
rbx-3.81
rbx-3.82
rbx-3.83
rbx-3.84
rbx-3.85
rbx-3.86
rbx-3.87
rbx-3.88
rbx-3.89
rbx-3.90
rbx-3.91
rbx-3.92
rbx-3.93
rbx-3.94
rbx-3.95
rbx-3.96
rbx-3.97
rbx-3.98
rbx-3.99
rbx-3.100
rbx-3.101
rbx-3.102
rbx-3.103
rbx-3.104
rbx-3.105
rbx-3.106
rbx-3.107
rbx-4.0
rbx-4.1
rbx-4.2
rbx-4.3
rbx-4.4
rbx-4.5
rbx-4.6
rbx-4.7
rbx-4.8
rbx-4.9
rbx-4.10
rbx-4.11
rbx-4.12
rbx-4.13
rbx-4.14
rbx-4.15
rbx-4.16
rbx-4.17
rbx-4.18
rbx-4.19
rbx-4.20
rbx-5.0
ree-1.8.6-20080507
ree-1.8.6-20080621
ree-1.8.6-20080623
ree-1.8.6-20080624
ree-1.8.6-20080709
ree-1.8.6-20080810
ree-1.8.6-20081205
ree-1.8.6-20081215
ree-1.8.6-20090113
ree-1.8.6-20090201
ree-1.8.6-20090421
ree-1.8.6-20090520
ree-1.8.6-20090610
ree-1.8.6-20090928
ree-1.8.7-2009.10
ree-1.8.7-2010.01
ree-1.8.7-2010.02
ree-1.8.7-2011.01
ree-1.8.7-2011.02
ree-1.8.7-2011.03
ree-1.8.7-2011.12
ree-1.8.7-2012.02
ruby-1.8.5-p115
ruby-1.8.5-p231
ruby-1.8.6-p286
ruby-1.8.6-p287
ruby-1.8.6-p369
ruby-1.8.6-p383
ruby-1.8.6-p398
ruby-1.8.6-p399
ruby-1.8.6-p420
ruby-1.8.7-p160
ruby-1.8.7-p174
ruby-1.8.7-p248
ruby-1.8.7-p249
ruby-1.8.7-p299
ruby-1.8.7-p302
ruby-1.8.7-p330
ruby-1.8.7-p334
ruby-1.8.7-p352
ruby-1.8.7-p357
ruby-1.8.7-p358
ruby-1.8.7-p370
ruby-1.8.7-p371
ruby-1.8.7-p374
ruby-1.9.0
ruby-1.9.1-p129
ruby-1.9.1-p243
ruby-1.9.1-p376
ruby-1.9.1-p378
ruby-1.9.1-p429
ruby-1.9.1-p431
ruby-1.9.2-p0
ruby-1.9.2-p136
ruby-1.9.2-p180
ruby-1.9.2-p290
ruby-1.9.2-p318
ruby-1.9.2-p320
ruby-1.9.2-p330
ruby-1.9.3-preview1
ruby-1.9.3-rc1
ruby-1.9.3-p0
ruby-1.9.3-p125
ruby-1.9.3-p194
ruby-1.9.3-p286
ruby-1.9.3-p327
ruby-1.9.3-p362
ruby-1.9.3-p374
ruby-1.9.3-p385
ruby-1.9.3-p392
ruby-1.9.3-p429
ruby-1.9.3-p448
ruby-1.9.3-p484
ruby-1.9.3-p545
ruby-1.9.3-p547
ruby-1.9.3-p550
ruby-1.9.3-p551
ruby-2.0.0-preview1
ruby-2.0.0-preview2
ruby-2.0.0-rc1
ruby-2.0.0-rc2
ruby-2.0.0-p0
ruby-2.0.0-p195
ruby-2.0.0-p247
ruby-2.0.0-p353
ruby-2.0.0-p451
ruby-2.0.0-p481
ruby-2.0.0-p576
ruby-2.0.0-p594
ruby-2.0.0-p598
ruby-2.0.0-p643
ruby-2.0.0-p645
ruby-2.0.0-p647
ruby-2.0.0-p648
ruby-2.1.0-preview1
ruby-2.1.0-preview2
ruby-2.1.0-rc1
ruby-2.1.0
ruby-2.1.1
ruby-2.1.2
ruby-2.1.3
ruby-2.1.4
ruby-2.1.5
ruby-2.1.6
ruby-2.1.7
ruby-2.1.8
ruby-2.1.9
ruby-2.1.10
ruby-2.2.0-preview1
ruby-2.2.0-preview2
ruby-2.2.0-rc1
ruby-2.2.0
ruby-2.2.1
ruby-2.2.2
ruby-2.2.3
ruby-2.2.4
ruby-2.2.5
ruby-2.2.6
ruby-2.2.7
ruby-2.2.8
ruby-2.2.9
ruby-2.2.10
ruby-2.3.0-preview1
ruby-2.3.0-preview2
ruby-2.3.0
ruby-2.3.1
ruby-2.3.2
ruby-2.3.3
ruby-2.3.4
ruby-2.3.5
ruby-2.3.6
ruby-2.3.7
ruby-2.3.8
ruby-2.4.0-preview1
ruby-2.4.0-preview2
ruby-2.4.0-preview3
ruby-2.4.0-rc1
ruby-2.4.0
ruby-2.4.1
ruby-2.4.2
ruby-2.4.3
ruby-2.4.4
ruby-2.4.5
ruby-2.4.6
ruby-2.4.7
ruby-2.4.8
ruby-2.4.9
ruby-2.4.10
ruby-2.5.0-preview1
ruby-2.5.0-rc1
ruby-2.5.0
ruby-2.5.1
ruby-2.5.2
ruby-2.5.3
ruby-2.5.4
ruby-2.5.5
ruby-2.5.6
ruby-2.5.7
ruby-2.5.8
ruby-2.6.0-preview1
ruby-2.6.0-preview2
ruby-2.6.0-preview3
ruby-2.6.0-rc1
ruby-2.6.0-rc2
ruby-2.6.0
ruby-2.6.1
ruby-2.6.2
ruby-2.6.3
ruby-2.6.4
ruby-2.6.5
ruby-2.6.6
ruby-2.7.0-preview1
ruby-2.7.0-preview2
ruby-2.7.0-preview3
ruby-2.7.0-rc1
ruby-2.7.0-rc2
ruby-2.7.0
ruby-2.7.1
ruby-2.7.2
ruby-3.0.0-preview1
ruby-3.0.0-preview2
ruby-3.0.0-rc1
ruby-3.0.0
truffleruby-1.0.0-rc2
truffleruby-1.0.0-rc3
truffleruby-1.0.0-rc5
truffleruby-1.0.0-rc6
truffleruby-1.0.0-rc7
truffleruby-1.0.0-rc8
truffleruby-1.0.0-rc9
truffleruby-1.0.0-rc10
truffleruby-1.0.0-rc11
truffleruby-1.0.0-rc12
truffleruby-1.0.0-rc13
truffleruby-1.0.0-rc14
truffleruby-1.0.0-rc15
truffleruby-1.0.0-rc16
truffleruby-19.0.0
truffleruby-19.0.2
truffleruby-19.1.0
truffleruby-19.1.1
truffleruby-19.2.0
truffleruby-19.2.0.1
truffleruby-19.2.1
truffleruby-19.3.0
truffleruby-19.3.0.2
truffleruby-19.3.1
truffleruby-20.0.0
truffleruby-20.1.0
truffleruby-20.2.0
truffleruby-20.3.0
src/rvm/Rakefile000066400000003373147511530540007621 0ustar00#!/usr/bin/env ruby
require "rubygems"

#
# VirtualBox Helpers
#

# Matches a host declaration in a ssh config file.
HOST_REGEXP     = /^\s*Host\s+([^\s#*]+)/
SNAPSHOT        = (ENV['SNAPSHOT'] || 'CURRENT').upcase
SSH_CONFIG_FILE = ENV['SSH_CONFIG_FILE'] || File.expand_path('../config/ssh', __FILE__)

def shell(cmd)
  puts "$ #{cmd}"
  system(cmd)
end

def hosts
  @hosts ||= begin
    hosts = []

    File.open(SSH_CONFIG_FILE) do |io|
      io.each_line do |line|
        next unless line =~ HOST_REGEXP
        hosts << $1
      end
    end

    hosts
  end
end

namespace :vbox do
  desc "start each vm"
  task :start => :stop do
    hosts.each do |host|
      shell "VBoxManage -q snapshot #{host} restore #{SNAPSHOT}"
      shell "VBoxManage -q startvm #{host} --type headless"
      shell "ssh -MNf -F '#{SSH_CONFIG_FILE}' '#{host}' >/dev/null 2>&1 </dev/null"
    end
  end

  desc "stop each vm"
  task :stop do
    hosts.each do |host|
      if `VBoxManage -q list runningvms`.include?(host)
        shell "VBoxManage -q controlvm #{host} poweroff"
      end
    end
  end

  desc 'Run the tests remotely on each VM'
  task :test do
    begin
      Rake::Task["vbox:start"].invoke
      Rake::Task["vbox:remote_test"].invoke
    ensure
      Rake::Task["vbox:stop"].execute(nil)
    end
  end

  desc 'Run the tests remotely (assuming each VM is running)'
  task :remote_test do
    local_dir  = File.expand_path("..", __FILE__)
    remote_dir = "$(pwd)/rvm"
    remote_script = "vboxtest/test_suite.sh"
    sh "'#{File.expand_path("../vboxtest.sh", __FILE__)}' -L '#{local_dir}' -R '#{remote_dir}' -S '#{remote_script}' #{hosts.join(' ')}"
  end

  desc 'Run the tests locally'
  task :local_test do
    sh File.expand_path("../vboxtest/test_suite.sh", __FILE__)
  end
end
src/rvm/FORMATTING.md000066400000004737147511530540010155 0ustar00# general

1. Try to make code readable. This is the most important rule.
Turn your eyes away from code and look on it again.
If you cannot quickly understand the code, reformat to make it better.

2. Avoid semicolons, just because they make code harder to read (see rule 1).

# variables

## defining
```bash
typeset var          # avoid local - it breaks code in some rare cases
typeset -a arr
arr=()               # define and reset array. required for arr+=( ... )
typeset -x important # the same export, just for consistency
```

Variables defined in one local in function are available in all other functions called by it.

## numeric variables comparison
```bash
: variable:${variable:=0} # Ensures it is set and simplifies debugging
(( variable ))      # when not zero
(( variable == 0 )) # when zero
: $(( variable++ )) # increase
```

## string variables comparison
```bash
[[ -n "${var:-}" ]]       # var is set
[[ "${var:-}" == "bla" ]] # var equals bla
[[ -n "${var1:-}" &&      # multi line check, first check has to be after [[ - for Zsh
  -n "${var2:-}" &&
  -n "${var3:-}"
]]
```

## multiple values check
```
case "$action" in
  (show)
    cat $1
    ;;
  (edit)
    ${EDITOR:-vim} $1
    ;;
  (help)
    echo "Usage this [show|edit]"
    ;;
esac
```

## dynamic invocation
```bash
_show(){ cat $1 || return $?; }
_edit(){ ${EDITOR:-vim} $1 || return $?; }
action=_$1
shift
${action} "$@" ||
case $? in
  (127) echo "Unknown action '$action'." ;;
  (*)   echo "Error '$?' occurred."      ;;
esac
```

# if's

## dens form for short statements / commands
```bash
if [[ -n "${bla:-}" ]]
then x=bla
else x=
fi
```

## sparse form for long statements / more commands
```bash
if
  [[ -n "${bla_asd_sf_affdfs_dsf_sdf_sdf:-}" ]] ||
  [[ -n "${bar_Dfs_dsg_FG_fd_fd_df_dfgdf:-}" ]]
then
  some more commands
  and even more
else
  or other commands
fi
```

## mixed for large else
```bash
if [[ -n "${bla:-}" ]]
then x=bla
else
  x=...
  some more commands
  and even more
fi
```

## just else
```bash
[[ -n "${bla:-}" ]] ||
{
  x=...
  some more commands
  and even more
}
```

# loops

## params parsing
```bash
while
  (( $# ))
do
  case "$1" in
    (-s|--silent)
      silent_flag=1
      ;;
    (-n|--name)
      (( $# > 1 )) ||
      {
        printf "ERROR: name required"
        exit 1
      }
      bla_name_flag="$2"
      shift
      ;;
    (*)
      bla_extra_flags+=( "$1" )
      ;;
  esac
  shift
done
```

## params iterate
```bash
# the - in "$@" - is default
for __param
do echo "$__param"
done
```
src/rvm/hooks/after_use_current000066400000001055147511530540012734 0ustar00#!/usr/bin/env bash

function set_current_alias()
{
  typeset __current_ruby

  if
    __current_ruby="${rvm_environments_path}/current" &&
    [[ -L "${__current_ruby:-}" ]]
  then
    __current_ruby="$( readlink "${__current_ruby:-}" )"
    __current_ruby="${__current_ruby##*/}"
  fi
  if
    [[ -z "${__current_ruby}" || "${__current_ruby}" != "${rvm_ruby_string}" ]]
  then
    "$rvm_scripts_path/alias" create current "${rvm_ruby_string}"
  fi
}

if
  [[ $TM_WRAPPING != "1" ]]
then
  export TM_WRAPPING="1"
  set_current_alias
  unset TM_WRAPPING
fi
src/rvm/hooks/after_cd_bundler000066400000003226147511530540012501 0ustar00#!/usr/bin/env bash

\. "${rvm_path}/scripts/functions/hooks/binstubs"

function add_binstubs_to_path()
{
  remove_binstubs_from_path "${2:-$1}"
  export PATH="$1:$PATH"
  export LAST_BUNDLER_BIN_PATH="$1"
}

BUNDLER_BIN_PATH=""

# see BUNDLE_BIN is set in the current directories .bundle/config
if
  [[ -f .bundle/config && -r .bundle/config ]] &&
  BUNDLER_BIN_PATH="$(\awk -F": " '$1=="BUNDLE_BIN"{print $2}' .bundle/config)" &&
  [[ -n "$BUNDLER_BIN_PATH" ]]
then
  case "$BUNDLER_BIN_PATH" in
    (/*)
      true # it's all fine
      ;;
    (\~*)
      BUNDLER_BIN_PATH="${BUNDLER_BIN_PATH/\~/$HOME}"
      ;;
    (*HOME*)
      eval BUNDLER_BIN_PATH=\"${BUNDLER_BIN_PATH}\"
      ;;
    (*)
      BUNDLER_BIN_PATH="$PWD/${BUNDLER_BIN_PATH}"
      ;;
  esac
  if
    [[ ":$PATH:" =~ ":$BUNDLER_BIN_PATH:" ]]
  then
    echo "The bundler binstubs directory is already on path."
    add_binstubs_to_path "${BUNDLER_BIN_PATH}"
  else
    case "${BUNDLER_BIN_PATH}" in
      (${PWD}*)
        if
          __rvm_ask_for \
         "The bundler binstubs directory is in the current directory, which may be unsafe.
Consider using rubygems-bundler instead => https://github.com/rvm/rubygems-bundler
Remove the BUNDLE_BIN line from .bundle/config to disable this prompt.
Are you sure you want to add the bundler binstubs directory to the path?" \
         'Yes'
        then
          add_binstubs_to_path "${BUNDLER_BIN_PATH}" "${LAST_BUNDLER_BIN_PATH}"
        fi
        ;;
      (*)
        add_binstubs_to_path "${BUNDLER_BIN_PATH}" "${LAST_BUNDLER_BIN_PATH}"
        ;;
    esac
  fi
else
  # There is no BUNDLE_BIN setting
  remove_binstubs_from_path "${LAST_BUNDLER_BIN_PATH}"
fi
src/rvm/hooks/after_use_maglev000077500000000223147511530540012524 0ustar00#!/usr/bin/env bash

\. "${rvm_path}/scripts/functions/hooks/maglev"

if
  [[ "${rvm_ruby_string}" =~ "maglev" ]]
then
  _maglev_gemstone start
fi
src/rvm/hooks/after_use_rbx_opts000066400000000353147511530540013112 0ustar00#!/usr/bin/env bash

\. "${rvm_path}/scripts/functions/hooks/rbx"

if [[ "${rvm_ruby_string}" =~ "rbx" ]]
then
  rbx_options_append "${PROJECT_RBXOPT[@]}"
else
  rbx_options_remove "${PROJECT_RBXOPT[@]}"
  rbx_clean_project_options
fi
src/rvm/hooks/after_use_jruby_opts000066400000000375147511530540013456 0ustar00#!/usr/bin/env bash

\. "${rvm_path}/scripts/functions/hooks/jruby"

if [[ "${rvm_ruby_string}" =~ "jruby" ]]
then
  jruby_options_append "${PROJECT_JRUBY_OPTS[@]}"
else
  jruby_options_remove "${PROJECT_JRUBY_OPTS[@]}"
  jruby_clean_project_options
fi
src/rvm/hooks/after_use_home_bin000066400000000366147511530540013036 0ustar00#!/usr/bin/env bash

\. "${rvm_path}/scripts/functions/hooks/binstubs"

function add_binstubs_to_path()
{
  remove_binstubs_from_path "${2:-$1}"
  export PATH="$1:$PATH"
}

if
  [[ -d "${HOME}/bin" ]]
then
  add_binstubs_to_path "${HOME}/bin"
fi
src/rvm/hooks/after_install_codesign000066400000002462147511530540013722 0ustar00#!/usr/bin/env bash

####################################################
# Signing compiled ruby for OSX, for details visit #
# https://rvm.io/rubies/codesign/                  #
####################################################

# Go to subprocess so we can use returns and 'use' ruby temporarily
(
  # Require Mac OS
  [[ "${_system_type}" == Darwin ]] || return 1

  # Require 10.7 - FIXME: Should be 10.7 or newer.
  [[ "${_system_version}" == 10.7* ]] || return 2

  # Find out ruby executable to sign
  typeset _ruby_name
  _ruby_name="$(sed -n '/^ruby_install_name=/ {s/ruby_install_name="\(.*\)"/\1/; p; };' "$MY_RUBY_HOME/config" )"

  # Require rvm_codesign_identity
  [[ -n "${rvm_codesign_identity:-}" ]] || {
    rvm_warn "'rvm_codesign_identity' is not set so RVM can't sign ${_ruby_name}\n" \
             "Set it in ~/.rvmrc after reading the following about OS X code signing:\n" \
             "https://developer.apple.com/library/mac/#documentation/Security/Conceptual/CodeSigningGuide/Introduction/Introduction.html"
    return 3
  }

  # Require using ruby - btw this should not happen
  __rvm_use || {
    rvm_warn "can not use ruby which was just installed ... so can not sign it neither"
    return 4
  }

  # Sign ruby
  /usr/bin/codesign -f -s "${rvm_codesign_identity}" "$(which "${_ruby_name}")"
)
src/rvm/hooks/after_install_auto_gem000077500000000676147511530540013737 0ustar00#!/usr/bin/env bash

if
  [[ -f "/etc/gentoo-release" ||
    "${RUBYOPT:-}" =~ "-rauto_gem"
  ]]
then
  typeset __sitelib
  __sitelib="$( $rvm_ruby_binary -rrbconfig -e "puts RbConfig::CONFIG['sitelibdir']" )"
  if [[ -n "${__sitelib}" ]]
  then touch "${__sitelib}/auto_gem.rb"
  else echo "WARN: Installed ruby does not have valid 'sitelibdir', no 'auto_gem.rb' was created, please report a bug here: https://github.com/rvm/rvm/issues"
  fi
fi
src/rvm/hooks/after_cd_install_vendored_gems000066400000000223147511530540015407 0ustar00#!/usr/bin/env bash
# From @mpapis

if
  which bundle >/dev/null &&
  [[ -d vendor/cache ]] &&
  [[ -f Gemfile ]]
then
  bundle install --local
fi
src/rvm/hooks/after_use_textmate000066400000002160147511530540013103 0ustar00#!/usr/bin/env bash
#
# Automatically sets the wrappers for textmate's use
# Based on article posted: http://www.christopherirish.com/2010/06/28/how-to-setup-textmate-to-use-rvm/
# Set up the TM_RUBY shell variable as described and remove the Builder as described and restart TextMate
#
# Make this script executable and you should be good to go! TextMate will stay in sync with rvm, which
# generally means the last project folder you switched into from terminal shell.
#

function set_textmate_wrapper()
{
  typeset __current_ruby __textmate_ruby
  __current_ruby=${RUBY_VERSION:-${GEM_HOME##*/}}

  if
    __textmate_ruby="$( \which textmate_ruby 2>/dev/null )" &&
    [[ -n "${__textmate_ruby:-}" ]]
  then
    __textmate_ruby="$( readlink "${__textmate_ruby:-}" )"
    __textmate_ruby="${__textmate_ruby%/ruby}"
    __textmate_ruby="${__textmate_ruby%/bin}"
  fi
  if
    [[ -z "${__textmate_ruby}" || "${__textmate_ruby}" != "${__current_ruby:-}" ]]
  then
    rvm wrapper ${RUBY_VERSION:-${GEM_HOME##*/}} textmate
  fi
}

if
  [[ $TM_WRAPPING != "1" ]]
then
  export TM_WRAPPING="1"
  set_textmate_wrapper
  unset TM_WRAPPING
fi
src/rvm/hooks/after_use_jruby000066400000000442147511530540012404 0ustar00#!/usr/bin/env bash

\. "${rvm_path}/scripts/functions/hooks/jruby"

if [[ "${rvm_ruby_string}" =~ "jruby" ]]
then
  jruby_ngserver_start
  jruby_options_append "--ng" "${PROJECT_JRUBY_OPTS[@]}"
else
  jruby_options_remove "--ng" "${PROJECT_JRUBY_OPTS[@]}"
  jruby_clean_project_options
fi
src/rvm/patchsets/rbx/2.5.2/default000066400000000107147511530540012750 0ustar00clean_bundler_environment_before_running_homebrew
this_can_not_be_null
src/rvm/patchsets/jruby/1.7.9/default000066400000000005147511530540013315 0ustar00joni
src/rvm/patchsets/ree/1.8.7/2012.02/default000066400000000100147511530540013534 0ustar00tcmalloc
stdout-rouge-fix
no_sslv2
ssl_no_ec2m
p358-p374
GH-488
src/rvm/patchsets/ree/1.8.7/default000066400000000057147511530540012743 0ustar00tcmalloc
stdout-rouge-fix
no_sslv2
ssl_no_ec2m
src/rvm/patchsets/ree/1.8.6/default000066400000000113147511530540012733 0ustar00openssl-1.0
tcmalloc
stdout-rouge-fix
perftools-gcc46
no_sslv2
ssl_no_ec2m
src/rvm/patchsets/ruby/2.3/head/float_warnings000066400000000205147511530540015265 0ustar00https://raw.githubusercontent.com/knugie/rvm-patchsets/master/patches/ruby/2.3/head/float_warnings/01-bigdecimal_float_warning.patch
src/rvm/patchsets/ruby/2.3/head/railsexpress000066400000000600147511530540014773 0ustar00https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.3/head/railsexpress/01-skip-broken-tests.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.3/head/railsexpress/02-improve-gc-stats.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.3/head/railsexpress/03-display-more-detailed-stack-trace.patch
src/rvm/patchsets/ruby/1.8.4/default000066400000000101147511530540013134 0ustar00openssl-1.0
stdout-rouge-fix
no_sslv2
syck
backported-ossl-fixes
src/rvm/patchsets/ruby/1.9.3/fedora000066400000000014147511530540012753 0ustar00ssl_no_ec2m
src/rvm/patchsets/ruby/1.9.3/p392/default000066400000000011147511530540013631 0ustar00openssl3
src/rvm/patchsets/ruby/1.9.3/p392/railsexpress000066400000003655147511530540014752 0ustar00https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.9.3/p392/railsexpress/01-fix-make-clean.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.9.3/p392/railsexpress/02-railsbench-gc.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.9.3/p392/railsexpress/03-display-more-detailed-stack-trace.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.9.3/p392/railsexpress/04-fork-support-for-gc-logging.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.9.3/p392/railsexpress/05-track-live-dataset-size.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.9.3/p392/railsexpress/06-webrick_204_304_keep_alive_fix.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.9.3/p392/railsexpress/07-export-a-few-more-symbols-for-ruby-prof.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.9.3/p392/railsexpress/08-thread-variables.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.9.3/p392/railsexpress/09-faster-loading.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.9.3/p392/railsexpress/10-falcon-st-opt.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.9.3/p392/railsexpress/11-falcon-sparse-array.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.9.3/p392/railsexpress/12-falcon-array-queue.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.9.3/p392/railsexpress/13-railsbench-gc-fixes.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.9.3/p392/railsexpress/14-show-full-backtrace-on-stack-overflow.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.9.3/p392/railsexpress/15-configurable-fiber-stack-sizes.patch
src/rvm/patchsets/ruby/1.9.3/p392/float_warnings000066400000000207147511530540015231 0ustar00https://raw.githubusercontent.com/knugie/rvm-patchsets/master/patches/ruby/1.9.3/p392/float_warnings/01-bigdecimal_float_warning.patch
src/rvm/patchsets/ruby/1.9.3/default000066400000000040147511530540013136 0ustar00GH-488
openssl3
update-autoconf
src/rvm/patchsets/ruby/1.9.3/p286/default000066400000000011147511530540013633 0ustar00openssl3
src/rvm/patchsets/ruby/1.9.3/p286/float_warnings000066400000000207147511530540015233 0ustar00https://raw.githubusercontent.com/knugie/rvm-patchsets/master/patches/ruby/1.9.3/p286/float_warnings/01-bigdecimal_float_warning.patch
src/rvm/patchsets/ruby/1.9.3/p286/railsexpress000066400000001651147511530540014746 0ustar00https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.9.3/p286/railsexpress/01-railsbench-gc.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.9.3/p286/railsexpress/02-display-more-detailed-stack-trace.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.9.3/p286/railsexpress/03-fork-support-for-gc-logging.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.9.3/p286/railsexpress/04-track-live-dataset-size.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.9.3/p286/railsexpress/05-webrick_204_304_keep_alive_fix.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.9.3/p286/railsexpress/06-export-a-few-more-symbols-for-ruby-prof.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.9.3/p286/railsexpress/07-thread-variables.patch
src/rvm/patchsets/ruby/1.9.3/p551/float_warnings000066400000000207147511530540015226 0ustar00https://raw.githubusercontent.com/knugie/rvm-patchsets/master/patches/ruby/1.9.3/p551/float_warnings/01-bigdecimal_float_warning.patch
src/rvm/patchsets/ruby/1.9.3/p551/railsexpress000066400000004660147511530540014744 0ustar00https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.9.3/p551/railsexpress/01-fix-make-clean.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.9.3/p551/railsexpress/02-zero-broken-tests.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.9.3/p551/railsexpress/03-railsbench-gc.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.9.3/p551/railsexpress/04-display-more-detailed-stack-trace.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.9.3/p551/railsexpress/05-fork-support-for-gc-logging.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.9.3/p551/railsexpress/06-track-live-dataset-size.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.9.3/p551/railsexpress/07-webrick_204_304_keep_alive_fix.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.9.3/p551/railsexpress/08-export-a-few-more-symbols-for-ruby-prof.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.9.3/p551/railsexpress/09-thread-variables.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.9.3/p551/railsexpress/10-faster-loading.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.9.3/p551/railsexpress/11-falcon-st-opt.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.9.3/p551/railsexpress/12-falcon-sparse-array.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.9.3/p551/railsexpress/13-falcon-array-queue.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.9.3/p551/railsexpress/14-railsbench-gc-fixes.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.9.3/p551/railsexpress/15-show-full-backtrace-on-stack-overflow.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.9.3/p551/railsexpress/16-configurable-fiber-stack-sizes.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.9.3/p551/railsexpress/17-backport-psych-20.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.9.3/p551/railsexpress/18-fix-missing-c-return-event.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.9.3/p551/railsexpress/19-fix-process-daemon-call.patch
src/rvm/patchsets/ruby/1.9.3/p551/default000066400000000063147511530540013635 0ustar00GH-488
CVE-2015-1855-p484
update-autoconf
openssl3
src/rvm/patchsets/ruby/1.9.3/p362/default000077500000000062147511530540013637 0ustar00segfault_fix_7629
GH-488
update-autoconf
openssl3
src/rvm/patchsets/ruby/1.9.3/p362/railsexpress000066400000003023147511530540014734 0ustar00https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.9.3/p362/railsexpress/01-fix-make-clean.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.9.3/p362/railsexpress/02-railsbench-gc.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.9.3/p362/railsexpress/03-display-more-detailed-stack-trace.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.9.3/p362/railsexpress/04-fork-support-for-gc-logging.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.9.3/p362/railsexpress/05-track-live-dataset-size.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.9.3/p362/railsexpress/06-webrick_204_304_keep_alive_fix.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.9.3/p362/railsexpress/07-export-a-few-more-symbols-for-ruby-prof.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.9.3/p362/railsexpress/08-thread-variables.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.9.3/p362/railsexpress/09-faster-loading.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.9.3/p362/railsexpress/10-falcon-st-opt.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.9.3/p362/railsexpress/11-falcon-sparse-array.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.9.3/p362/railsexpress/12-falcon-array-queue.patch
src/rvm/patchsets/ruby/1.9.3/p362/float_warnings000066400000000207147511530540015226 0ustar00https://raw.githubusercontent.com/knugie/rvm-patchsets/master/patches/ruby/1.9.3/p362/float_warnings/01-bigdecimal_float_warning.patch
src/rvm/patchsets/ruby/1.9.3/p327/float_warnings000066400000000207147511530540015227 0ustar00https://raw.githubusercontent.com/knugie/rvm-patchsets/master/patches/ruby/1.9.3/p327/float_warnings/01-bigdecimal_float_warning.patch
src/rvm/patchsets/ruby/1.9.3/p327/default000066400000000011147511530540013627 0ustar00openssl3
src/rvm/patchsets/ruby/1.9.3/p327/railsexpress000066400000003023147511530540014735 0ustar00https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.9.3/p327/railsexpress/01-fix-make-clean.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.9.3/p327/railsexpress/02-railsbench-gc.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.9.3/p327/railsexpress/03-display-more-detailed-stack-trace.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.9.3/p327/railsexpress/04-fork-support-for-gc-logging.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.9.3/p327/railsexpress/05-track-live-dataset-size.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.9.3/p327/railsexpress/06-webrick_204_304_keep_alive_fix.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.9.3/p327/railsexpress/07-export-a-few-more-symbols-for-ruby-prof.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.9.3/p327/railsexpress/08-thread-variables.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.9.3/p327/railsexpress/09-faster-loading.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.9.3/p327/railsexpress/10-falcon-st-opt.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.9.3/p327/railsexpress/11-falcon-array-queue.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.9.3/p327/railsexpress/12-falcon-sparse-array.patch
src/rvm/patchsets/ruby/1.9.3/p545/default000066400000000063147511530540013640 0ustar00GH-488
CVE-2015-1855-p484
update-autoconf
openssl3
src/rvm/patchsets/ruby/1.9.3/p545/float_warnings000066400000000207147511530540015231 0ustar00https://raw.githubusercontent.com/knugie/rvm-patchsets/master/patches/ruby/1.9.3/p545/float_warnings/01-bigdecimal_float_warning.patch
src/rvm/patchsets/ruby/1.9.3/p545/railsexpress000066400000004463147511530540014750 0ustar00https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.9.3/p545/railsexpress/01-fix-make-clean.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.9.3/p545/railsexpress/02-railsbench-gc.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.9.3/p545/railsexpress/03-display-more-detailed-stack-trace.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.9.3/p545/railsexpress/04-fork-support-for-gc-logging.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.9.3/p545/railsexpress/05-track-live-dataset-size.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.9.3/p545/railsexpress/06-webrick_204_304_keep_alive_fix.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.9.3/p545/railsexpress/07-export-a-few-more-symbols-for-ruby-prof.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.9.3/p545/railsexpress/08-thread-variables.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.9.3/p545/railsexpress/09-faster-loading.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.9.3/p545/railsexpress/10-falcon-st-opt.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.9.3/p545/railsexpress/11-falcon-sparse-array.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.9.3/p545/railsexpress/12-falcon-array-queue.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.9.3/p545/railsexpress/13-railsbench-gc-fixes.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.9.3/p545/railsexpress/14-show-full-backtrace-on-stack-overflow.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.9.3/p545/railsexpress/15-configurable-fiber-stack-sizes.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.9.3/p545/railsexpress/16-backport-psych-20.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.9.3/p545/railsexpress/17-fix-missing-c-return-event.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.9.3/p545/railsexpress/18-fix-process-daemon-call.patch
src/rvm/patchsets/ruby/1.9.3/p448/default000066400000000011147511530540013633 0ustar00openssl3
src/rvm/patchsets/ruby/1.9.3/p448/railsexpress000066400000003655147511530540014754 0ustar00https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.9.3/p448/railsexpress/01-fix-make-clean.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.9.3/p448/railsexpress/02-railsbench-gc.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.9.3/p448/railsexpress/03-display-more-detailed-stack-trace.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.9.3/p448/railsexpress/04-fork-support-for-gc-logging.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.9.3/p448/railsexpress/05-track-live-dataset-size.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.9.3/p448/railsexpress/06-webrick_204_304_keep_alive_fix.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.9.3/p448/railsexpress/07-export-a-few-more-symbols-for-ruby-prof.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.9.3/p448/railsexpress/08-thread-variables.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.9.3/p448/railsexpress/09-faster-loading.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.9.3/p448/railsexpress/10-falcon-st-opt.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.9.3/p448/railsexpress/11-falcon-sparse-array.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.9.3/p448/railsexpress/12-falcon-array-queue.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.9.3/p448/railsexpress/13-railsbench-gc-fixes.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.9.3/p448/railsexpress/14-show-full-backtrace-on-stack-overflow.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.9.3/p448/railsexpress/15-configurable-fiber-stack-sizes.patch
src/rvm/patchsets/ruby/1.9.3/p448/float_warnings000066400000000207147511530540015233 0ustar00https://raw.githubusercontent.com/knugie/rvm-patchsets/master/patches/ruby/1.9.3/p448/float_warnings/01-bigdecimal_float_warning.patch
src/rvm/patchsets/ruby/1.9.3/p448/osx_static000066400000000021147511530540014370 0ustar00remove_digest_so
src/rvm/patchsets/ruby/1.9.3/scientific000066400000000014147511530540013633 0ustar00ssl_no_ec2m
src/rvm/patchsets/ruby/1.9.3/p385/railsexpress000066400000003023147511530540014741 0ustar00https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.9.3/p385/railsexpress/01-fix-make-clean.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.9.3/p385/railsexpress/02-railsbench-gc.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.9.3/p385/railsexpress/03-display-more-detailed-stack-trace.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.9.3/p385/railsexpress/04-fork-support-for-gc-logging.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.9.3/p385/railsexpress/05-track-live-dataset-size.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.9.3/p385/railsexpress/06-webrick_204_304_keep_alive_fix.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.9.3/p385/railsexpress/07-export-a-few-more-symbols-for-ruby-prof.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.9.3/p385/railsexpress/08-thread-variables.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.9.3/p385/railsexpress/09-faster-loading.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.9.3/p385/railsexpress/10-falcon-st-opt.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.9.3/p385/railsexpress/11-falcon-sparse-array.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.9.3/p385/railsexpress/12-falcon-array-queue.patch
src/rvm/patchsets/ruby/1.9.3/p385/default000066400000000011147511530540013633 0ustar00openssl3
src/rvm/patchsets/ruby/1.9.3/p385/float_warnings000066400000000207147511530540015233 0ustar00https://raw.githubusercontent.com/knugie/rvm-patchsets/master/patches/ruby/1.9.3/p385/float_warnings/01-bigdecimal_float_warning.patch
src/rvm/patchsets/ruby/1.9.3/p484/float_warnings000066400000000207147511530540015233 0ustar00https://raw.githubusercontent.com/knugie/rvm-patchsets/master/patches/ruby/1.9.3/p484/float_warnings/01-bigdecimal_float_warning.patch
src/rvm/patchsets/ruby/1.9.3/p484/default000066400000000063147511530540013642 0ustar00GH-488
CVE-2015-1855-p484
update-autoconf
openssl3
src/rvm/patchsets/ruby/1.9.3/p484/railsexpress000066400000004463147511530540014752 0ustar00https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.9.3/p484/railsexpress/01-fix-make-clean.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.9.3/p484/railsexpress/02-railsbench-gc.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.9.3/p484/railsexpress/03-display-more-detailed-stack-trace.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.9.3/p484/railsexpress/04-fork-support-for-gc-logging.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.9.3/p484/railsexpress/05-track-live-dataset-size.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.9.3/p484/railsexpress/06-webrick_204_304_keep_alive_fix.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.9.3/p484/railsexpress/07-export-a-few-more-symbols-for-ruby-prof.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.9.3/p484/railsexpress/08-thread-variables.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.9.3/p484/railsexpress/09-faster-loading.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.9.3/p484/railsexpress/10-falcon-st-opt.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.9.3/p484/railsexpress/11-falcon-sparse-array.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.9.3/p484/railsexpress/12-falcon-array-queue.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.9.3/p484/railsexpress/13-railsbench-gc-fixes.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.9.3/p484/railsexpress/14-show-full-backtrace-on-stack-overflow.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.9.3/p484/railsexpress/15-configurable-fiber-stack-sizes.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.9.3/p484/railsexpress/16-backport-psych-20.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.9.3/p484/railsexpress/17-fix-missing-c-return-event.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.9.3/p484/railsexpress/18-fix-process-daemon-call.patch
src/rvm/patchsets/ruby/1.9.3/centos000066400000000014147511530540013006 0ustar00ssl_no_ec2m
src/rvm/patchsets/ruby/1.9.3/redhat000066400000000014147511530540012762 0ustar00ssl_no_ec2m
src/rvm/patchsets/ruby/1.9.3/p125/float_warnings000066400000000207147511530540015223 0ustar00https://raw.githubusercontent.com/knugie/rvm-patchsets/master/patches/ruby/1.9.3/p125/float_warnings/01-bigdecimal_float_warning.patch
src/rvm/patchsets/ruby/1.9.3/p125/railsexpress000066400000002325147511530540014735 0ustar00https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.9.3/p125/railsexpress/01-merge-revision-s-34719-34720-b.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.9.3/p125/railsexpress/02-railsbench-gc.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.9.3/p125/railsexpress/03-display-more-detailed-stack-trace.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.9.3/p125/railsexpress/04-fork-support-for-gc-logging.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.9.3/p125/railsexpress/05-track-live-dataset-size.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.9.3/p125/railsexpress/06-export-some-symbols-for-rubyprof.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.9.3/p125/railsexpress/07-revert-f6b49243eb0c21bea1c4198cdd52a549e6ead075.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.9.3/p125/railsexpress/08-backport-c2086cc7ff1142b14c95c.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.9.3/p125/railsexpress/09-webrick_204_304_keep_alive_fix.patch
src/rvm/patchsets/ruby/1.9.3/p125/default000066400000000011147511530540013623 0ustar00openssl3
src/rvm/patchsets/ruby/1.9.3/head/default000066400000000011147511530540014035 0ustar00openssl3
src/rvm/patchsets/ruby/1.9.3/head/float_warnings000066400000000207147511530540015435 0ustar00https://raw.githubusercontent.com/knugie/rvm-patchsets/master/patches/ruby/1.9.3/head/float_warnings/01-bigdecimal_float_warning.patch
src/rvm/patchsets/ruby/1.9.3/head/railsexpress000066400000004660147511530540015153 0ustar00https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.9.3/head/railsexpress/01-fix-make-clean.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.9.3/head/railsexpress/02-zero-broken-tests.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.9.3/head/railsexpress/03-railsbench-gc.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.9.3/head/railsexpress/04-display-more-detailed-stack-trace.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.9.3/head/railsexpress/05-fork-support-for-gc-logging.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.9.3/head/railsexpress/06-track-live-dataset-size.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.9.3/head/railsexpress/07-webrick_204_304_keep_alive_fix.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.9.3/head/railsexpress/08-export-a-few-more-symbols-for-ruby-prof.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.9.3/head/railsexpress/09-thread-variables.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.9.3/head/railsexpress/10-faster-loading.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.9.3/head/railsexpress/11-falcon-st-opt.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.9.3/head/railsexpress/12-falcon-sparse-array.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.9.3/head/railsexpress/13-falcon-array-queue.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.9.3/head/railsexpress/14-railsbench-gc-fixes.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.9.3/head/railsexpress/15-show-full-backtrace-on-stack-overflow.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.9.3/head/railsexpress/16-configurable-fiber-stack-sizes.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.9.3/head/railsexpress/17-backport-psych-20.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.9.3/head/railsexpress/18-fix-missing-c-return-event.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.9.3/head/railsexpress/19-fix-process-daemon-call.patch
src/rvm/patchsets/ruby/1.9.3/p550/railsexpress000066400000004660147511530540014743 0ustar00https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.9.3/p550/railsexpress/01-fix-make-clean.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.9.3/p550/railsexpress/02-zero-broken-tests.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.9.3/p550/railsexpress/03-railsbench-gc.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.9.3/p550/railsexpress/04-display-more-detailed-stack-trace.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.9.3/p550/railsexpress/05-fork-support-for-gc-logging.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.9.3/p550/railsexpress/06-track-live-dataset-size.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.9.3/p550/railsexpress/07-webrick_204_304_keep_alive_fix.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.9.3/p550/railsexpress/08-export-a-few-more-symbols-for-ruby-prof.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.9.3/p550/railsexpress/09-thread-variables.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.9.3/p550/railsexpress/10-faster-loading.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.9.3/p550/railsexpress/11-falcon-st-opt.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.9.3/p550/railsexpress/12-falcon-sparse-array.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.9.3/p550/railsexpress/13-falcon-array-queue.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.9.3/p550/railsexpress/14-railsbench-gc-fixes.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.9.3/p550/railsexpress/15-show-full-backtrace-on-stack-overflow.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.9.3/p550/railsexpress/16-configurable-fiber-stack-sizes.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.9.3/p550/railsexpress/17-backport-psych-20.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.9.3/p550/railsexpress/18-fix-missing-c-return-event.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.9.3/p550/railsexpress/19-fix-process-daemon-call.patch
src/rvm/patchsets/ruby/1.9.3/p550/float_warnings000066400000000207147511530540015225 0ustar00https://raw.githubusercontent.com/knugie/rvm-patchsets/master/patches/ruby/1.9.3/p550/float_warnings/01-bigdecimal_float_warning.patch
src/rvm/patchsets/ruby/1.9.3/p550/default000066400000000063147511530540013634 0ustar00GH-488
CVE-2015-1855-p484
update-autoconf
openssl3
src/rvm/patchsets/ruby/1.9.3/p547/default000066400000000063147511530540013642 0ustar00GH-488
CVE-2015-1855-p484
update-autoconf
openssl3
src/rvm/patchsets/ruby/1.9.3/p547/railsexpress000066400000004463147511530540014752 0ustar00https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.9.3/p547/railsexpress/01-fix-make-clean.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.9.3/p547/railsexpress/02-railsbench-gc.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.9.3/p547/railsexpress/03-display-more-detailed-stack-trace.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.9.3/p547/railsexpress/04-fork-support-for-gc-logging.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.9.3/p547/railsexpress/05-track-live-dataset-size.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.9.3/p547/railsexpress/06-webrick_204_304_keep_alive_fix.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.9.3/p547/railsexpress/07-export-a-few-more-symbols-for-ruby-prof.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.9.3/p547/railsexpress/08-thread-variables.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.9.3/p547/railsexpress/09-faster-loading.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.9.3/p547/railsexpress/10-falcon-st-opt.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.9.3/p547/railsexpress/11-falcon-sparse-array.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.9.3/p547/railsexpress/12-falcon-array-queue.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.9.3/p547/railsexpress/13-railsbench-gc-fixes.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.9.3/p547/railsexpress/14-show-full-backtrace-on-stack-overflow.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.9.3/p547/railsexpress/15-configurable-fiber-stack-sizes.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.9.3/p547/railsexpress/16-backport-psych-20.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.9.3/p547/railsexpress/17-fix-missing-c-return-event.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.9.3/p547/railsexpress/18-fix-process-daemon-call.patch
src/rvm/patchsets/ruby/1.9.3/p547/float_warnings000066400000000207147511530540015233 0ustar00https://raw.githubusercontent.com/knugie/rvm-patchsets/master/patches/ruby/1.9.3/p547/float_warnings/01-bigdecimal_float_warning.patch
src/rvm/patchsets/ruby/1.9.3/p429/float_warnings000066400000000207147511530540015232 0ustar00https://raw.githubusercontent.com/knugie/rvm-patchsets/master/patches/ruby/1.9.3/p429/float_warnings/01-bigdecimal_float_warning.patch
src/rvm/patchsets/ruby/1.9.3/p429/openbsd000066400000000016147511530540013645 0ustar00bsd-shell-fix
src/rvm/patchsets/ruby/1.9.3/p429/railsexpress000066400000003655147511530540014753 0ustar00https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.9.3/p429/railsexpress/01-fix-make-clean.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.9.3/p429/railsexpress/02-railsbench-gc.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.9.3/p429/railsexpress/03-display-more-detailed-stack-trace.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.9.3/p429/railsexpress/04-fork-support-for-gc-logging.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.9.3/p429/railsexpress/05-track-live-dataset-size.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.9.3/p429/railsexpress/06-webrick_204_304_keep_alive_fix.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.9.3/p429/railsexpress/07-export-a-few-more-symbols-for-ruby-prof.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.9.3/p429/railsexpress/08-thread-variables.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.9.3/p429/railsexpress/09-faster-loading.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.9.3/p429/railsexpress/10-falcon-st-opt.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.9.3/p429/railsexpress/11-falcon-sparse-array.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.9.3/p429/railsexpress/12-falcon-array-queue.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.9.3/p429/railsexpress/13-railsbench-gc-fixes.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.9.3/p429/railsexpress/14-show-full-backtrace-on-stack-overflow.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.9.3/p429/railsexpress/15-configurable-fiber-stack-sizes.patch
src/rvm/patchsets/ruby/1.9.3/p429/default000066400000000011147511530540013632 0ustar00openssl3
src/rvm/patchsets/ruby/1.9.3/p429/freebsd000066400000000016147511530540013625 0ustar00bsd-shell-fix
src/rvm/patchsets/ruby/1.9.3/cygwin000066400000000007147511530540013015 0ustar00GH-433
src/rvm/patchsets/ruby/1.9.3/p194/float_warnings000066400000000207147511530540015231 0ustar00https://raw.githubusercontent.com/knugie/rvm-patchsets/master/patches/ruby/1.9.3/p194/float_warnings/01-bigdecimal_float_warning.patch
src/rvm/patchsets/ruby/1.9.3/p194/railsexpress000066400000002357147511530540014750 0ustar00https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.9.3/p194/railsexpress/01-revert-f6b49243eb0c21bea1c4198cdd52a549e6ead075.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.9.3/p194/railsexpress/02-backport-c2086cc7ff1142b14c95c8758af24b8689b78ffc.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.9.3/p194/railsexpress/03-railsbench-gc.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.9.3/p194/railsexpress/04-display-more-detailed-stack-trace.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.9.3/p194/railsexpress/05-fork-support-for-gc-logging.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.9.3/p194/railsexpress/06-track-live-dataset-size.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.9.3/p194/railsexpress/07-webrick_204_304_keep_alive_fix.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.9.3/p194/railsexpress/08-export-a-few-more-symbols-for-ruby-prof.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.9.3/p194/railsexpress/09-avoid-using-broken-ffi-headers.patch
src/rvm/patchsets/ruby/1.9.3/p194/default000066400000000011147511530540013631 0ustar00openssl3
src/rvm/patchsets/ruby/1.9.3/p374/default000066400000000011147511530540013631 0ustar00openssl3
src/rvm/patchsets/ruby/1.9.3/p374/float_warnings000066400000000207147511530540015231 0ustar00https://raw.githubusercontent.com/knugie/rvm-patchsets/master/patches/ruby/1.9.3/p374/float_warnings/01-bigdecimal_float_warning.patch
src/rvm/patchsets/ruby/1.9.3/p374/railsexpress000066400000003023147511530540014737 0ustar00https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.9.3/p374/railsexpress/01-fix-make-clean.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.9.3/p374/railsexpress/02-railsbench-gc.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.9.3/p374/railsexpress/03-display-more-detailed-stack-trace.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.9.3/p374/railsexpress/04-fork-support-for-gc-logging.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.9.3/p374/railsexpress/05-track-live-dataset-size.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.9.3/p374/railsexpress/06-webrick_204_304_keep_alive_fix.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.9.3/p374/railsexpress/07-export-a-few-more-symbols-for-ruby-prof.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.9.3/p374/railsexpress/08-thread-variables.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.9.3/p374/railsexpress/09-faster-loading.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.9.3/p374/railsexpress/10-falcon-st-opt.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.9.3/p374/railsexpress/11-falcon-sparse-array.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.9.3/p374/railsexpress/12-falcon-array-queue.patch
src/rvm/patchsets/ruby/2.1.5/default000066400000000011147511530540013127 0ustar00openssl3
src/rvm/patchsets/ruby/2.1.5/float_warnings000066400000000202147511530540014522 0ustar00https://raw.githubusercontent.com/knugie/rvm-patchsets/master/patches/ruby/2.1.5/float_warnings/01-bigdecimal_float_warning.patch
src/rvm/patchsets/ruby/2.1.5/railsexpress000066400000002006147511530540014235 0ustar00https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.1.5/railsexpress/01-zero-broken-tests.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.1.5/railsexpress/02-improve-gc-stats.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.1.5/railsexpress/03-display-more-detailed-stack-trace.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.1.5/railsexpress/04-show-full-backtrace-on-stack-overflow.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.1.5/railsexpress/05-funny-falcon-stc-density.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.1.5/railsexpress/06-funny-falcon-stc-pool-allocation.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.1.5/railsexpress/07-aman-opt-aset-aref-str.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.1.5/railsexpress/08-funny-falcon-method-cache.patch
src/rvm/patchsets/ruby/2.2.6/default000066400000000034147511530540013136 0ustar00fix_installing_bundled_gems
src/rvm/patchsets/ruby/2.2.6/railsexpress000066400000000567147511530540014251 0ustar00https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.2.6/railsexpress/01-zero-broken-tests.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.2.6/railsexpress/02-improve-gc-stats.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.2.6/railsexpress/03-display-more-detailed-stack-trace.patch
src/rvm/patchsets/ruby/2.2.6/float_warnings000066400000000202147511530540014524 0ustar00https://raw.githubusercontent.com/knugie/rvm-patchsets/master/patches/ruby/2.2.6/float_warnings/01-bigdecimal_float_warning.patch
src/rvm/patchsets/ruby/2.3.1/float_warnings000066400000000202147511530540014520 0ustar00https://raw.githubusercontent.com/knugie/rvm-patchsets/master/patches/ruby/2.3.1/float_warnings/01-bigdecimal_float_warning.patch
src/rvm/patchsets/ruby/2.3.1/cygwin000066400000000027147511530540013010 0ustar00fix_resolv_kernel32_dllsrc/rvm/patchsets/ruby/2.3.1/railsexpress000066400000000567147511530540014245 0ustar00https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.3.1/railsexpress/01-skip-broken-tests.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.3.1/railsexpress/02-improve-gc-stats.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.3.1/railsexpress/03-display-more-detailed-stack-trace.patch
src/rvm/patchsets/ruby/2.3.1/default000066400000000047147511530540013136 0ustar00ruby_2_3_gcc7
random_c_using_NR_prefix
src/rvm/patchsets/ruby/2.4.0/railsexpress000066400000000567147511530540014245 0ustar00https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.4.0/railsexpress/01-skip-broken-tests.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.4.0/railsexpress/02-improve-gc-stats.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.4.0/railsexpress/03-display-more-detailed-stack-trace.patch
src/rvm/patchsets/ruby/2.4.0/float_warnings000066400000000202147511530540014520 0ustar00https://raw.githubusercontent.com/knugie/rvm-patchsets/master/patches/ruby/2.4.0/float_warnings/01-bigdecimal_float_warning.patch
src/rvm/patchsets/ruby/2.4.0/default000066400000000047147511530540013136 0ustar00ruby_2_4_gcc7
random_c_using_NR_prefix
src/rvm/patchsets/ruby/2.5.7/railsexpress000066400000000572147511530540014251 0ustar00https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.5.7/railsexpress/01-fix-broken-tests-caused-by-ad.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.5.7/railsexpress/02-improve-gc-stats.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.5.7/railsexpress/03-more-detailed-stacktrace.patch
src/rvm/patchsets/ruby/2.6.4/railsexpress000066400000001172147511530540014244 0ustar00https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.6.4/railsexpress/01-fix-broken-tests-caused-by-ad.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.6.4/railsexpress/02-improve-gc-stats.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.6.4/railsexpress/03-more-detailed-stacktrace.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.6.4/railsexpress/04-04-malloc-trim.patch.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.6.4/railsexpress/05-use-after-free-bug-in-symbol-c.patch
src/rvm/patchsets/ruby/2.6.4/default000066400000000026147511530540013141 0ustar00fix_string_corruption
src/rvm/patchsets/ruby/2.6.3/railsexpress000066400000000754147511530540014250 0ustar00https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.6.3/railsexpress/01-fix-broken-tests-caused-by-ad.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.6.3/railsexpress/02-improve-gc-stats.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.6.3/railsexpress/03-more-detailed-stacktrace.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.6.3/railsexpress/04-malloc-trim.patch
src/rvm/patchsets/ruby/2.5.0/railsexpress000066400000000776147511530540014250 0ustar00https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.5.0/railsexpress/01-fix-broken-tests-caused-by-ad.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.5.0/railsexpress/02-improve-gc-stats.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.5.0/railsexpress/03-more-detailed-stacktrace.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.5.0/railsexpress/04-fix-fd-mask-detection-on-os-x.patch
src/rvm/patchsets/ruby/2.5.0/default000066400000000044147511530540013134 0ustar00prelude_gcc_diagnostic
libressl_2_7
src/rvm/patchsets/ruby/2.2.1/default000066400000000045147511530540013133 0ustar00fix_installing_bundled_gems
openssl3
src/rvm/patchsets/ruby/2.2.1/float_warnings000066400000000202147511530540014517 0ustar00https://raw.githubusercontent.com/knugie/rvm-patchsets/master/patches/ruby/2.2.1/float_warnings/01-bigdecimal_float_warning.patch
src/rvm/patchsets/ruby/2.2.1/railsexpress000066400000000567147511530540014244 0ustar00https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.2.1/railsexpress/01-zero-broken-tests.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.2.1/railsexpress/02-improve-gc-stats.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.2.1/railsexpress/03-display-more-detailed-stack-trace.patch
src/rvm/patchsets/ruby/2.3.6/railsexpress000066400000000567147511530540014252 0ustar00https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.3.6/railsexpress/01-skip-broken-tests.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.3.6/railsexpress/02-improve-gc-stats.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.3.6/railsexpress/03-display-more-detailed-stack-trace.patch
src/rvm/patchsets/ruby/2.1.8/default000066400000000011147511530540013132 0ustar00openssl3
src/rvm/patchsets/ruby/2.1.8/railsexpress000066400000002176147511530540014250 0ustar00https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.1.8/railsexpress/01-zero-broken-tests.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.1.8/railsexpress/02-improve-gc-stats.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.1.8/railsexpress/03-display-more-detailed-stack-trace.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.1.8/railsexpress/04-show-full-backtrace-on-stack-overflow.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.1.8/railsexpress/05-funny-falcon-stc-density.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.1.8/railsexpress/06-funny-falcon-stc-pool-allocation.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.1.8/railsexpress/07-aman-opt-aset-aref-str.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.1.8/railsexpress/08-funny-falcon-method-cache.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.1.8/railsexpress/09-heap-dump-support.patch
src/rvm/patchsets/ruby/2.1.8/float_warnings000066400000000202147511530540014525 0ustar00https://raw.githubusercontent.com/knugie/rvm-patchsets/master/patches/ruby/2.1.8/float_warnings/01-bigdecimal_float_warning.patch
src/rvm/patchsets/ruby/2.1.2/default000066400000000011147511530540013124 0ustar00openssl3
src/rvm/patchsets/ruby/2.1.2/float_warnings000066400000000202147511530540014517 0ustar00https://raw.githubusercontent.com/knugie/rvm-patchsets/master/patches/ruby/2.1.2/float_warnings/01-bigdecimal_float_warning.patch
src/rvm/patchsets/ruby/2.1.2/railsexpress000066400000002437147511530540014242 0ustar00https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.1.2/railsexpress/01-zero-broken-tests.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.1.2/railsexpress/02-improve-gc-stats.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.1.2/railsexpress/03-display-more-detailed-stack-trace.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.1.2/railsexpress/04-show-full-backtrace-on-stack-overflow.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.1.2/railsexpress/05-fix-missing-c-return-event.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.1.2/railsexpress/06-backport-006e66b6680f60adfb434ee7397f0dbc77de7873.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.1.2/railsexpress/07-funny-falcon-stc-density.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.1.2/railsexpress/08-funny-falcon-stc-pool-allocation.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.1.2/railsexpress/09-aman-opt-aset-aref-str.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.1.2/railsexpress/10-funny-falcon-method-cache.patch
src/rvm/patchsets/ruby/2.4/head/railsexpress000066400000000600147511530540014774 0ustar00https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.4/head/railsexpress/01-skip-broken-tests.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.4/head/railsexpress/02-improve-gc-stats.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.4/head/railsexpress/03-display-more-detailed-stack-trace.patch
src/rvm/patchsets/ruby/2.4/head/float_warnings000066400000000205147511530540015266 0ustar00https://raw.githubusercontent.com/knugie/rvm-patchsets/master/patches/ruby/2.4/head/float_warnings/01-bigdecimal_float_warning.patch
src/rvm/patchsets/ruby/2.3.2/default000066400000000047147511530540013137 0ustar00ruby_2_3_gcc7
random_c_using_NR_prefix
src/rvm/patchsets/ruby/2.3.2/float_warnings000066400000000202147511530540014521 0ustar00https://raw.githubusercontent.com/knugie/rvm-patchsets/master/patches/ruby/2.3.2/float_warnings/01-bigdecimal_float_warning.patch
src/rvm/patchsets/ruby/2.3.8/railsexpress000066400000000567147511530540014254 0ustar00https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.3.8/railsexpress/01-skip-broken-tests.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.3.8/railsexpress/02-improve-gc-stats.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.3.8/railsexpress/03-display-more-detailed-stack-trace.patch
src/rvm/patchsets/ruby/2.2.5/default000066400000000045147511530540013137 0ustar00fix_installing_bundled_gems
openssl3
src/rvm/patchsets/ruby/2.2.5/float_warnings000066400000000202147511530540014523 0ustar00https://raw.githubusercontent.com/knugie/rvm-patchsets/master/patches/ruby/2.2.5/float_warnings/01-bigdecimal_float_warning.patch
src/rvm/patchsets/ruby/2.2.5/railsexpress000066400000000567147511530540014250 0ustar00https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.2.5/railsexpress/01-zero-broken-tests.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.2.5/railsexpress/02-improve-gc-stats.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.2.5/railsexpress/03-display-more-detailed-stack-trace.patch
src/rvm/patchsets/ruby/2.1.6/default000066400000000011147511530540013130 0ustar00openssl3
src/rvm/patchsets/ruby/2.1.6/float_warnings000066400000000202147511530540014523 0ustar00https://raw.githubusercontent.com/knugie/rvm-patchsets/master/patches/ruby/2.1.6/float_warnings/01-bigdecimal_float_warning.patch
src/rvm/patchsets/ruby/2.1.6/railsexpress000066400000002176147511530540014246 0ustar00https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.1.6/railsexpress/01-zero-broken-tests.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.1.6/railsexpress/02-improve-gc-stats.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.1.6/railsexpress/03-display-more-detailed-stack-trace.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.1.6/railsexpress/04-show-full-backtrace-on-stack-overflow.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.1.6/railsexpress/05-funny-falcon-stc-density.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.1.6/railsexpress/06-funny-falcon-stc-pool-allocation.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.1.6/railsexpress/07-aman-opt-aset-aref-str.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.1.6/railsexpress/08-funny-falcon-method-cache.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.1.6/railsexpress/09-heap-dump-support.patch
src/rvm/patchsets/ruby/2.2.10/default000066400000000034147511530540013211 0ustar00fix_installing_bundled_gems
src/rvm/patchsets/ruby/2.2.10/railsexpress000066400000000572147511530540014320 0ustar00https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.2.10/railsexpress/01-zero-broken-tests.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.2.10/railsexpress/02-improve-gc-stats.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.2.10/railsexpress/03-display-more-detailed-stack-trace.patch
src/rvm/patchsets/ruby/1.8.7/p370/default000066400000000055147511530540013640 0ustar00stdout-rouge-fix
no_sslv2
GH-488
ssl_no_ec2m
src/rvm/patchsets/ruby/1.8.7/p370/railsexpress000066400000004644147511530540014750 0ustar00https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.8.7/p370/railsexpress/01-ignore-generated-files.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.8.7/p370/railsexpress/02-fix-tests-for-osx.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.8.7/p370/railsexpress/03-sigvtalrm-fix.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.8.7/p370/railsexpress/04-railsbench-gc-patch.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.8.7/p370/railsexpress/05-display-full-stack-trace.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.8.7/p370/railsexpress/06-better-source-file-tracing.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.8.7/p370/railsexpress/07-heap-dump-support.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.8.7/p370/railsexpress/08-fork-support-for-gc-logging.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.8.7/p370/railsexpress/09-track-malloc-size.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.8.7/p370/railsexpress/10-track-object-allocation.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.8.7/p370/railsexpress/11-expose-heap-slots.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.8.7/p370/railsexpress/12-fix-heap-size-growth-logic.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.8.7/p370/railsexpress/13-heap-slot-size.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.8.7/p370/railsexpress/14-add-trace-stats-enabled-methods.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.8.7/p370/railsexpress/15-track-live-dataset-size.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.8.7/p370/railsexpress/16-add-object-size-information-to-heap-dump.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.8.7/p370/railsexpress/17-caller-for-all-threads.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.8.7/p370/railsexpress/18-fix-zlib-deflate.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.8.7/p370/railsexpress/19-fix-broken-seek-on-osx.patch
src/rvm/patchsets/ruby/1.8.7/default000066400000000046147511530540013147 0ustar00stdout-rouge-fix
no_sslv2
ssl_no_ec2m
src/rvm/patchsets/ruby/1.8.7/head/railsexpress000066400000004246147511530540015156 0ustar00https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.8.7/head/railsexpress/01-ignore-generated-files.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.8.7/head/railsexpress/02-fix-tests-for-osx.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.8.7/head/railsexpress/03-sigvtalrm-fix.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.8.7/head/railsexpress/04-railsbench-gc-patch.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.8.7/head/railsexpress/05-display-full-stack-trace.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.8.7/head/railsexpress/06-better-source-file-tracing.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.8.7/head/railsexpress/07-heap-dump-support.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.8.7/head/railsexpress/08-fork-support-for-gc-logging.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.8.7/head/railsexpress/09-track-malloc-size.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.8.7/head/railsexpress/10-track-object-allocation.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.8.7/head/railsexpress/11-expose-heap-slots.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.8.7/head/railsexpress/12-fix-heap-size-growth-logic.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.8.7/head/railsexpress/13-heap-slot-size.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.8.7/head/railsexpress/14-add-trace-stats-enabled-methods.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.8.7/head/railsexpress/15-track-live-dataset-size.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.8.7/head/railsexpress/16-add-object-size-information-to-heap-dump.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.8.7/head/railsexpress/17-caller-for-all-threads.patch
src/rvm/patchsets/ruby/1.8.7/p373/default000066400000000055147511530540013643 0ustar00stdout-rouge-fix
no_sslv2
GH-488
ssl_no_ec2m
src/rvm/patchsets/ruby/1.8.7/p352/railsexpress000066400000004051147511530540014740 0ustar00https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.8.7/p352/railsexpress/01-ignore-generated-files.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.8.7/p352/railsexpress/02-sigvtalrm-fix.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.8.7/p352/railsexpress/03-railsbench-gc-patch.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.8.7/p352/railsexpress/04-display-full-stack-trace.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.8.7/p352/railsexpress/05-better-source-file-tracing.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.8.7/p352/railsexpress/06-heap-dump-support.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.8.7/p352/railsexpress/07-fork-support-for-gc-logging.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.8.7/p352/railsexpress/08-track-malloc-size.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.8.7/p352/railsexpress/09-track-object-allocation.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.8.7/p352/railsexpress/10-expose-heap-slots.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.8.7/p352/railsexpress/11-fix-heap-size-growth-logic.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.8.7/p352/railsexpress/12-heap-slot-size.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.8.7/p352/railsexpress/13-add-trace-stats-enabled-methods.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.8.7/p352/railsexpress/14-track-live-dataset-size.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.8.7/p352/railsexpress/15-add-object-size-information-to-heap-dump.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.8.7/p352/railsexpress/16-caller-for-all-threads.patch
src/rvm/patchsets/ruby/1.8.7/p358/railsexpress000066400000004246147511530540014754 0ustar00https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.8.7/p358/railsexpress/01-ignore-generated-files.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.8.7/p358/railsexpress/02-fix-tests-for-osx.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.8.7/p358/railsexpress/03-sigvtalrm-fix.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.8.7/p358/railsexpress/04-railsbench-gc-patch.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.8.7/p358/railsexpress/05-display-full-stack-trace.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.8.7/p358/railsexpress/06-better-source-file-tracing.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.8.7/p358/railsexpress/07-heap-dump-support.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.8.7/p358/railsexpress/08-fork-support-for-gc-logging.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.8.7/p358/railsexpress/09-track-malloc-size.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.8.7/p358/railsexpress/10-track-object-allocation.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.8.7/p358/railsexpress/11-expose-heap-slots.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.8.7/p358/railsexpress/12-fix-heap-size-growth-logic.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.8.7/p358/railsexpress/13-heap-slot-size.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.8.7/p358/railsexpress/14-add-trace-stats-enabled-methods.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.8.7/p358/railsexpress/15-track-live-dataset-size.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.8.7/p358/railsexpress/16-add-object-size-information-to-heap-dump.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.8.7/p358/railsexpress/17-caller-for-all-threads.patch
src/rvm/patchsets/ruby/1.8.7/p374/default000066400000000055147511530540013644 0ustar00stdout-rouge-fix
no_sslv2
GH-488
ssl_no_ec2m
src/rvm/patchsets/ruby/1.8.7/p374/railsexpress000066400000004246147511530540014752 0ustar00https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.8.7/p374/railsexpress/01-ignore-generated-files.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.8.7/p374/railsexpress/02-fix-tests-for-osx.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.8.7/p374/railsexpress/03-sigvtalrm-fix.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.8.7/p374/railsexpress/04-railsbench-gc-patch.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.8.7/p374/railsexpress/05-display-full-stack-trace.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.8.7/p374/railsexpress/06-better-source-file-tracing.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.8.7/p374/railsexpress/07-heap-dump-support.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.8.7/p374/railsexpress/08-fork-support-for-gc-logging.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.8.7/p374/railsexpress/09-track-malloc-size.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.8.7/p374/railsexpress/10-track-object-allocation.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.8.7/p374/railsexpress/11-expose-heap-slots.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.8.7/p374/railsexpress/12-fix-heap-size-growth-logic.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.8.7/p374/railsexpress/13-heap-slot-size.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.8.7/p374/railsexpress/14-add-trace-stats-enabled-methods.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.8.7/p374/railsexpress/15-track-live-dataset-size.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.8.7/p374/railsexpress/16-add-object-size-information-to-heap-dump.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.8.7/p374/railsexpress/17-caller-for-all-threads.patch
src/rvm/patchsets/ruby/1.8.7/p357/railsexpress000066400000004051147511530540014745 0ustar00https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.8.7/p357/railsexpress/01-ignore-generated-files.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.8.7/p357/railsexpress/02-sigvtalrm-fix.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.8.7/p357/railsexpress/03-railsbench-gc-patch.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.8.7/p357/railsexpress/04-display-full-stack-trace.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.8.7/p357/railsexpress/05-better-source-file-tracing.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.8.7/p357/railsexpress/06-heap-dump-support.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.8.7/p357/railsexpress/07-fork-support-for-gc-logging.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.8.7/p357/railsexpress/08-track-malloc-size.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.8.7/p357/railsexpress/09-track-object-allocation.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.8.7/p357/railsexpress/10-expose-heap-slots.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.8.7/p357/railsexpress/11-fix-heap-size-growth-logic.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.8.7/p357/railsexpress/12-heap-slot-size.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.8.7/p357/railsexpress/13-add-trace-stats-enabled-methods.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.8.7/p357/railsexpress/14-track-live-dataset-size.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.8.7/p357/railsexpress/15-add-object-size-information-to-heap-dump.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.8.7/p357/railsexpress/16-caller-for-all-threads.patch
src/rvm/patchsets/ruby/1.8.7/p371/default000066400000000055147511530540013641 0ustar00stdout-rouge-fix
no_sslv2
GH-488
ssl_no_ec2m
src/rvm/patchsets/ruby/1.8.7/p371/railsexpress000066400000004644147511530540014751 0ustar00https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.8.7/p371/railsexpress/01-ignore-generated-files.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.8.7/p371/railsexpress/02-fix-tests-for-osx.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.8.7/p371/railsexpress/03-sigvtalrm-fix.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.8.7/p371/railsexpress/04-railsbench-gc-patch.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.8.7/p371/railsexpress/05-display-full-stack-trace.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.8.7/p371/railsexpress/06-better-source-file-tracing.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.8.7/p371/railsexpress/07-heap-dump-support.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.8.7/p371/railsexpress/08-fork-support-for-gc-logging.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.8.7/p371/railsexpress/09-track-malloc-size.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.8.7/p371/railsexpress/10-track-object-allocation.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.8.7/p371/railsexpress/11-expose-heap-slots.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.8.7/p371/railsexpress/12-fix-heap-size-growth-logic.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.8.7/p371/railsexpress/13-heap-slot-size.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.8.7/p371/railsexpress/14-add-trace-stats-enabled-methods.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.8.7/p371/railsexpress/15-track-live-dataset-size.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.8.7/p371/railsexpress/16-add-object-size-information-to-heap-dump.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.8.7/p371/railsexpress/17-caller-for-all-threads.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.8.7/p371/railsexpress/18-fix-zlib-deflate.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.8.7/p371/railsexpress/19-fix-broken-seek-on-osx.patch
src/rvm/patchsets/ruby/1.8.7/p334/railsexpress000066400000004252147511530540014743 0ustar00https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.8.7/p334/railsexpress/01-ignore-generated-files.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.8.7/p334/railsexpress/02-fix-rcs-keyword-idiom.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.8.7/p334/railsexpress/03-sigvtalrm-fix.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.8.7/p334/railsexpress/04-railsbench-gc-patch.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.8.7/p334/railsexpress/05-display-full-stack-trace.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.8.7/p334/railsexpress/06-better-source-file-tracing.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.8.7/p334/railsexpress/07-heap-dump-support.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.8.7/p334/railsexpress/08-fork-support-for-gc-logging.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.8.7/p334/railsexpress/09-track-malloc-size.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.8.7/p334/railsexpress/10-track-object-allocation.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.8.7/p334/railsexpress/11-expose-heap-slots.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.8.7/p334/railsexpress/12-fix-heap-size-growth-logic.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.8.7/p334/railsexpress/13-heap-slot-size.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.8.7/p334/railsexpress/14-add-trace-stats-enabled-methods.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.8.7/p334/railsexpress/15-track-live-dataset-size.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.8.7/p334/railsexpress/16-add-object-size-information-to-heap-dump.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.8.7/p334/railsexpress/17-caller-for-all-threads.patch
src/rvm/patchsets/ruby/2.7.0/railsexpress000066400000000572147511530540014244 0ustar00https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.7.0/railsexpress/01-fix-broken-tests-caused-by-ad.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.7.0/railsexpress/02-improve-gc-stats.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.7.0/railsexpress/03-more-detailed-stacktrace.patch
src/rvm/patchsets/ruby/2.4.9/railsexpress000066400000000567147511530540014256 0ustar00https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.4.9/railsexpress/01-skip-broken-tests.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.4.9/railsexpress/02-improve-gc-stats.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.4.9/railsexpress/03-display-more-detailed-stack-trace.patch
src/rvm/patchsets/ruby/2.5.4/railsexpress000066400000000572147511530540014246 0ustar00https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.5.4/railsexpress/01-fix-broken-tests-caused-by-ad.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.5.4/railsexpress/02-improve-gc-stats.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.5.4/railsexpress/03-more-detailed-stacktrace.patch
src/rvm/patchsets/ruby/2.4.3/railsexpress000066400000000567147511530540014250 0ustar00https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.4.3/railsexpress/01-skip-broken-tests.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.4.3/railsexpress/02-improve-gc-stats.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.4.3/railsexpress/03-display-more-detailed-stack-trace.patch
src/rvm/patchsets/ruby/2.5.3/railsexpress000066400000000572147511530540014245 0ustar00https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.5.3/railsexpress/01-fix-broken-tests-caused-by-ad.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.5.3/railsexpress/02-improve-gc-stats.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.5.3/railsexpress/03-more-detailed-stacktrace.patch
src/rvm/patchsets/ruby/2.4.4/railsexpress000066400000000567147511530540014251 0ustar00https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.4.4/railsexpress/01-skip-broken-tests.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.4.4/railsexpress/02-improve-gc-stats.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.4.4/railsexpress/03-display-more-detailed-stack-trace.patch
src/rvm/patchsets/ruby/2.6.0/railsexpress000066400000000572147511530540014243 0ustar00https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.6.0/railsexpress/01-fix-broken-tests-caused-by-ad.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.6.0/railsexpress/02-improve-gc-stats.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.6.0/railsexpress/03-more-detailed-stacktrace.patch
src/rvm/patchsets/ruby/2.1.1/default000066400000000063147511530540013132 0ustar00libyaml
changeset_r45225
changeset_r45240
openssl3
src/rvm/patchsets/ruby/2.1.1/railsexpress000066400000002625147511530540014240 0ustar00https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.1.1/railsexpress/01-zero-broken-tests.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.1.1/railsexpress/02-improve-gc-stats.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.1.1/railsexpress/03-display-more-detailed-stack-trace.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.1.1/railsexpress/04-show-full-backtrace-on-stack-overflow.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.1.1/railsexpress/05-fix-missing-c-return-event.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.1.1/railsexpress/06-backport-006e66b6680f60adfb434ee7397f0dbc77de7873.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.1.1/railsexpress/07-funny-falcon-stc-density.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.1.1/railsexpress/08-funny-falcon-stc-pool-allocation.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.1.1/railsexpress/09-aman-opt-aset-aref-str.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.1.1/railsexpress/10-funny-falcon-method-cache.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.1.1/railsexpress/11-backport-r44370.patch
src/rvm/patchsets/ruby/2.1.1/float_warnings000066400000000202147511530540014516 0ustar00https://raw.githubusercontent.com/knugie/rvm-patchsets/master/patches/ruby/2.1.1/float_warnings/01-bigdecimal_float_warning.patch
src/rvm/patchsets/ruby/2.1.1/osx_static000066400000000007147511530540013664 0ustar00cc_env
src/rvm/patchsets/ruby/2.2.8/railsexpress000066400000000567147511530540014253 0ustar00https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.2.8/railsexpress/01-zero-broken-tests.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.2.8/railsexpress/02-improve-gc-stats.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.2.8/railsexpress/03-display-more-detailed-stack-trace.patch
src/rvm/patchsets/ruby/2.2.8/float_warnings000066400000000202147511530540014526 0ustar00https://raw.githubusercontent.com/knugie/rvm-patchsets/master/patches/ruby/2.2.8/float_warnings/01-bigdecimal_float_warning.patch
src/rvm/patchsets/ruby/2.2.8/default000066400000000034147511530540013140 0ustar00fix_installing_bundled_gems
src/rvm/patchsets/ruby/2.3.5/railsexpress000066400000000763147511530540014247 0ustar00https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.3.5/railsexpress/01-skip-broken-tests.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.3.5/railsexpress/02-improve-gc-stats.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.3.5/railsexpress/03-display-more-detailed-stack-trace.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.3.5/railsexpress/04-fix-gmp-compile-issue.patch
src/rvm/patchsets/ruby/2.3.5/float_warnings000066400000000202147511530540014524 0ustar00https://raw.githubusercontent.com/knugie/rvm-patchsets/master/patches/ruby/2.3.5/float_warnings/01-bigdecimal_float_warning.patch
src/rvm/patchsets/ruby/2.2.2/default000066400000000045147511530540013134 0ustar00fix_installing_bundled_gems
openssl3
src/rvm/patchsets/ruby/2.2.2/float_warnings000066400000000202147511530540014520 0ustar00https://raw.githubusercontent.com/knugie/rvm-patchsets/master/patches/ruby/2.2.2/float_warnings/01-bigdecimal_float_warning.patch
src/rvm/patchsets/ruby/2.2.2/railsexpress000066400000001173147511530540014237 0ustar00https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.2.2/railsexpress/01-zero-broken-tests.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.2.2/railsexpress/02-improve-gc-stats.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.2.2/railsexpress/03-display-more-detailed-stack-trace.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.2.2/railsexpress/04-backported-bugfixes-222.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.2.2/railsexpress/05-fix-backports-parser-regression.patch
src/rvm/patchsets/ruby/2.1.10/float_warnings000066400000000203147511530540014577 0ustar00https://raw.githubusercontent.com/knugie/rvm-patchsets/master/patches/ruby/2.1.10/float_warnings/01-bigdecimal_float_warning.patch
src/rvm/patchsets/ruby/3.0/head/railsexpress000066400000000357147511530540015002 0ustar00https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/3.0/head/railsexpress/01-improve-gc-stats.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/3.0/head/railsexpress/02-malloc-trim.patch
src/rvm/patchsets/ruby/2.7/head/railsexpress000066400000000770147511530540015007 0ustar00https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.7/head/railsexpress/01-fix-broken-tests-caused-by-ad.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.7/head/railsexpress/02-improve-gc-stats.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.7/head/railsexpress/03-more-detailed-stacktrace.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.7/head/railsexpress/04-malloc-trim.patch
src/rvm/patchsets/ruby/2.5/head/railsexpress000066400000000603147511530540015000 0ustar00https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.5/head/railsexpress/01-fix-broken-tests-caused-by-ad.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.5/head/railsexpress/02-improve-gc-stats.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.5/head/railsexpress/03-more-detailed-stacktrace.patch
src/rvm/patchsets/ruby/2.6.2/railsexpress000066400000000572147511530540014245 0ustar00https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.6.2/railsexpress/01-fix-broken-tests-caused-by-ad.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.6.2/railsexpress/02-improve-gc-stats.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.6.2/railsexpress/03-more-detailed-stacktrace.patch
src/rvm/patchsets/ruby/2.5.1/default000066400000000015147511530540013133 0ustar00libressl_2_7
src/rvm/patchsets/ruby/2.5.1/railsexpress000066400000000572147511530540014243 0ustar00https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.5.1/railsexpress/01-fix-broken-tests-caused-by-ad.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.5.1/railsexpress/02-improve-gc-stats.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.5.1/railsexpress/03-more-detailed-stacktrace.patch
src/rvm/patchsets/ruby/2.4.6/railsexpress000066400000000567147511530540014253 0ustar00https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.4.6/railsexpress/01-skip-broken-tests.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.4.6/railsexpress/02-improve-gc-stats.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.4.6/railsexpress/03-display-more-detailed-stack-trace.patch
src/rvm/patchsets/ruby/2.3.7/railsexpress000066400000000567147511530540014253 0ustar00https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.3.7/railsexpress/01-skip-broken-tests.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.3.7/railsexpress/02-improve-gc-stats.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.3.7/railsexpress/03-display-more-detailed-stack-trace.patch
src/rvm/patchsets/ruby/2.2.0/float_warnings000066400000000202147511530540014516 0ustar00https://raw.githubusercontent.com/knugie/rvm-patchsets/master/patches/ruby/2.2.0/float_warnings/01-bigdecimal_float_warning.patch
src/rvm/patchsets/ruby/2.2.0/railsexpress000066400000001206147511530540014232 0ustar00https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.2.0/railsexpress/01-zero-broken-tests.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.2.0/railsexpress/02-improve-gc-stats.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.2.0/railsexpress/03-display-more-detailed-stack-trace.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.2.0/railsexpress/04-backport-401c8bb.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.2.0/railsexpress/05-fix-packed-bitfield-compat-warning-for-older-gccs.patch
src/rvm/patchsets/ruby/2.2.0/default000066400000000045147511530540013132 0ustar00fix_installing_bundled_gems
openssl3
src/rvm/patchsets/ruby/2.1.3/default000066400000000011147511530540013125 0ustar00openssl3
src/rvm/patchsets/ruby/2.1.3/railsexpress000066400000002006147511530540014233 0ustar00https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.1.3/railsexpress/01-zero-broken-tests.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.1.3/railsexpress/02-improve-gc-stats.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.1.3/railsexpress/03-display-more-detailed-stack-trace.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.1.3/railsexpress/04-show-full-backtrace-on-stack-overflow.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.1.3/railsexpress/05-funny-falcon-stc-density.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.1.3/railsexpress/06-funny-falcon-stc-pool-allocation.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.1.3/railsexpress/07-aman-opt-aset-aref-str.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.1.3/railsexpress/08-funny-falcon-method-cache.patch
src/rvm/patchsets/ruby/2.1.3/float_warnings000066400000000202147511530540014520 0ustar00https://raw.githubusercontent.com/knugie/rvm-patchsets/master/patches/ruby/2.1.3/float_warnings/01-bigdecimal_float_warning.patch
src/rvm/patchsets/ruby/2.1.9/float_warnings000066400000000202147511530540014526 0ustar00https://raw.githubusercontent.com/knugie/rvm-patchsets/master/patches/ruby/2.1.9/float_warnings/01-bigdecimal_float_warning.patch
src/rvm/patchsets/ruby/2.1.4/railsexpress000066400000002006147511530540014234 0ustar00https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.1.4/railsexpress/01-zero-broken-tests.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.1.4/railsexpress/02-improve-gc-stats.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.1.4/railsexpress/03-display-more-detailed-stack-trace.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.1.4/railsexpress/04-show-full-backtrace-on-stack-overflow.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.1.4/railsexpress/05-funny-falcon-stc-density.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.1.4/railsexpress/06-funny-falcon-stc-pool-allocation.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.1.4/railsexpress/07-aman-opt-aset-aref-str.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.1.4/railsexpress/08-funny-falcon-method-cache.patch
src/rvm/patchsets/ruby/2.1.4/default000066400000000011147511530540013126 0ustar00openssl3
src/rvm/patchsets/ruby/2.1.4/float_warnings000066400000000202147511530540014521 0ustar00https://raw.githubusercontent.com/knugie/rvm-patchsets/master/patches/ruby/2.1.4/float_warnings/01-bigdecimal_float_warning.patch
src/rvm/patchsets/ruby/1.9.2/p320/default000066400000000011147511530540013617 0ustar00openssl3
src/rvm/patchsets/ruby/1.9.2/p320/railsexpress000066400000001026147511530540014726 0ustar00https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.9.2/p320/railsexpress/01-railsbench-gc-patch.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.9.2/p320/railsexpress/02-display-more-detailed-stack-trace.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.9.2/p320/railsexpress/03-fork-support-for-gc-logging.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.9.2/p320/railsexpress/04-track-live-dataset-size.patch
src/rvm/patchsets/ruby/1.9.2/p318/railsexpress000066400000001026147511530540014735 0ustar00https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.9.2/p318/railsexpress/01-railsbench-gc-patch.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.9.2/p318/railsexpress/02-display-more-detailed-stack-trace.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.9.2/p318/railsexpress/03-fork-support-for-gc-logging.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.9.2/p318/railsexpress/04-track-live-dataset-size.patch
src/rvm/patchsets/ruby/1.9.2/p318/default000066400000000011147511530540013626 0ustar00openssl3
src/rvm/patchsets/ruby/1.9.2/p180/default000066400000000043147511530540013630 0ustar00nossl2
GH-488
ssl_no_ec2m
openssl3
src/rvm/patchsets/ruby/1.9.2/p180/railsexpress000066400000001226147511530540014734 0ustar00https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.9.2/p180/railsexpress/01-railsbench-gc-patch.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.9.2/p180/railsexpress/02-display-more-detailed-stack-trace.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.9.2/p180/railsexpress/03-fork-support-for-gc-logging.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.9.2/p180/railsexpress/04-track-live-dataset-size.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.9.2/p180/railsexpress/05-load-performance-fix.patch
src/rvm/patchsets/ruby/1.9.2/p290/railsexpress000066400000001420147511530540014732 0ustar00https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.9.2/p290/railsexpress/01-railsbench-gc-patch.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.9.2/p290/railsexpress/02-display-more-detailed-stack-trace.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.9.2/p290/railsexpress/03-fork-support-for-gc-logging.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.9.2/p290/railsexpress/04-track-live-dataset-size.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.9.2/p290/railsexpress/05-load-performance-fix.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/1.9.2/p290/railsexpress/06-trace-bmethods.patch
src/rvm/patchsets/ruby/1.9.2/p290/default000066400000000011147511530540013625 0ustar00openssl3
src/rvm/patchsets/ruby/1.9.2/default000066400000000034147511530540013140 0ustar00GH-488
ssl_no_ec2m
openssl3
src/rvm/patchsets/ruby/1.9.2/head/default000066400000000034147511530540014041 0ustar00r42282
ssl_no_ec2m
openssl3
src/rvm/patchsets/ruby/1.8.5/default000066400000000131147511530540013140 0ustar00openssl-1.0
stdout-rouge-fix
no_sslv2
syck
backported-ossl-fixes
math_gcc_fix
gcc44_dtoa
src/rvm/patchsets/ruby/2.3.0/default000066400000000070147511530540013131 0ustar00ruby_2_3_gcc7
changeset_r53419
random_c_using_NR_prefix
src/rvm/patchsets/ruby/2.3.0/cygwin000066400000000027147511530540013007 0ustar00fix_resolv_kernel32_dllsrc/rvm/patchsets/ruby/2.3.0/railsexpress000066400000000567147511530540014244 0ustar00https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.3.0/railsexpress/01-skip-broken-tests.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.3.0/railsexpress/02-improve-gc-stats.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.3.0/railsexpress/03-display-more-detailed-stack-trace.patch
src/rvm/patchsets/ruby/2.3.0/float_warnings000066400000000202147511530540014517 0ustar00https://raw.githubusercontent.com/knugie/rvm-patchsets/master/patches/ruby/2.3.0/float_warnings/01-bigdecimal_float_warning.patch
src/rvm/patchsets/ruby/2.2.7/railsexpress000066400000000567147511530540014252 0ustar00https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.2.7/railsexpress/01-zero-broken-tests.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.2.7/railsexpress/02-improve-gc-stats.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.2.7/railsexpress/03-display-more-detailed-stack-trace.patch
src/rvm/patchsets/ruby/2.2.7/float_warnings000066400000000202147511530540014525 0ustar00https://raw.githubusercontent.com/knugie/rvm-patchsets/master/patches/ruby/2.2.7/float_warnings/01-bigdecimal_float_warning.patch
src/rvm/patchsets/ruby/2.2.7/default000066400000000034147511530540013137 0ustar00fix_installing_bundled_gems
src/rvm/patchsets/ruby/2.5.6/railsexpress000066400000000572147511530540014250 0ustar00https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.5.6/railsexpress/01-fix-broken-tests-caused-by-ad.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.5.6/railsexpress/02-improve-gc-stats.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.5.6/railsexpress/03-more-detailed-stacktrace.patch
src/rvm/patchsets/ruby/2.4.1/default000066400000000031147511530540013130 0ustar00random_c_using_NR_prefix
src/rvm/patchsets/ruby/2.4.1/railsexpress000066400000000567147511530540014246 0ustar00https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.4.1/railsexpress/01-skip-broken-tests.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.4.1/railsexpress/02-improve-gc-stats.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.4.1/railsexpress/03-display-more-detailed-stack-trace.patch
src/rvm/patchsets/ruby/2.4.1/float_warnings000066400000000202147511530540014521 0ustar00https://raw.githubusercontent.com/knugie/rvm-patchsets/master/patches/ruby/2.4.1/float_warnings/01-bigdecimal_float_warning.patch
src/rvm/patchsets/ruby/2.7.2/railsexpress000066400000000754147511530540014250 0ustar00https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.7.2/railsexpress/01-fix-broken-tests-caused-by-ad.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.7.2/railsexpress/02-improve-gc-stats.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.7.2/railsexpress/03-more-detailed-stacktrace.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.7.2/railsexpress/04-malloc-trim.patch
src/rvm/patchsets/ruby/2.6.5/railsexpress000066400000000754147511530540014252 0ustar00https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.6.5/railsexpress/01-fix-broken-tests-caused-by-ad.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.6.5/railsexpress/02-improve-gc-stats.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.6.5/railsexpress/03-more-detailed-stacktrace.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.6.5/railsexpress/04-malloc-trim.patch
src/rvm/patchsets/ruby/2.2/head/default000066400000000011147511530540013666 0ustar00openssl3
src/rvm/patchsets/ruby/2.2/head/railsexpress000066400000000600147511530540014772 0ustar00https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.2/head/railsexpress/01-zero-broken-tests.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.2/head/railsexpress/02-improve-gc-stats.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.2/head/railsexpress/03-display-more-detailed-stack-trace.patch
src/rvm/patchsets/ruby/2.2/head/float_warnings000066400000000205147511530540015264 0ustar00https://raw.githubusercontent.com/knugie/rvm-patchsets/master/patches/ruby/2.2/head/float_warnings/01-bigdecimal_float_warning.patch
src/rvm/patchsets/ruby/head/osx_static000066400000000021147511530540014122 0ustar00remove_digest_so
src/rvm/patchsets/ruby/head/railsexpress000066400000000567147511530540014505 0ustar00https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/head/railsexpress/01-fix-broken-tests-caused-by-ad.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/head/railsexpress/02-improve-gc-stats.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/head/railsexpress/03-more-detailed-stacktrace.patch
src/rvm/patchsets/ruby/3.0.0/railsexpress000066400000000351147511530540014231 0ustar00https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/3.0.0/railsexpress/01-improve-gc-stats.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/3.0.0/railsexpress/02-malloc-trim.patch
src/rvm/patchsets/ruby/osx_static000066400000000001147511530540013217 0ustar00
src/rvm/patchsets/ruby/2.6/head/railsexpress000066400000000770147511530540015006 0ustar00https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.6/head/railsexpress/01-fix-broken-tests-caused-by-ad.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.6/head/railsexpress/02-improve-gc-stats.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.6/head/railsexpress/03-more-detailed-stacktrace.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.6/head/railsexpress/04-malloc-trim.patch
src/rvm/patchsets/ruby/2.5.8/railsexpress000066400000000572147511530540014252 0ustar00https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.5.8/railsexpress/01-fix-broken-tests-caused-by-ad.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.5.8/railsexpress/02-improve-gc-stats.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.5.8/railsexpress/03-more-detailed-stacktrace.patch
src/rvm/patchsets/ruby/2.4.5/railsexpress000066400000000567147511530540014252 0ustar00https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.4.5/railsexpress/01-skip-broken-tests.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.4.5/railsexpress/02-improve-gc-stats.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.4.5/railsexpress/03-display-more-detailed-stack-trace.patch
src/rvm/patchsets/ruby/2.6.1/railsexpress000066400000000572147511530540014244 0ustar00https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.6.1/railsexpress/01-fix-broken-tests-caused-by-ad.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.6.1/railsexpress/02-improve-gc-stats.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.6.1/railsexpress/03-more-detailed-stacktrace.patch
src/rvm/patchsets/ruby/2.1.0/default000066400000000072147511530540013131 0ustar00libyaml
GH-488
changeset_r45225
changeset_r45240
openssl3
src/rvm/patchsets/ruby/2.1.0/railsexpress000066400000003017147511530540014233 0ustar00https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.1.0/railsexpress/01-current-2.1.1-fixes.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.1.0/railsexpress/02-zero-broken-tests.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.1.0/railsexpress/03-improve-gc-stats.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.1.0/railsexpress/04-display-more-detailed-stack-trace.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.1.0/railsexpress/05-show-full-backtrace-on-stack-overflow.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.1.0/railsexpress/06-fix-missing-c-return-event.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.1.0/railsexpress/07-backport-006e66b6680f60adfb434ee7397f0dbc77de7873.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.1.0/railsexpress/08-funny-falcon-stc-density.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.1.0/railsexpress/09-funny-falcon-stc-pool-allocation.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.1.0/railsexpress/10-aman-opt-aset-aref-str.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.1.0/railsexpress/11-funny-falcon-method-cache.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.1.0/railsexpress/12-backport-r44370.patch
src/rvm/patchsets/ruby/2.1.0/osx_static000066400000000007147511530540013663 0ustar00cc_env
src/rvm/patchsets/ruby/2.1.0/float_warnings000066400000000202147511530540014515 0ustar00https://raw.githubusercontent.com/knugie/rvm-patchsets/master/patches/ruby/2.1.0/float_warnings/01-bigdecimal_float_warning.patch
src/rvm/patchsets/ruby/2.1.0/optional000066400000000021147511530540013324 0ustar00changeset_r44327
src/rvm/patchsets/ruby/2.2.3/railsexpress000066400000000567147511530540014246 0ustar00https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.2.3/railsexpress/01-zero-broken-tests.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.2.3/railsexpress/02-improve-gc-stats.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.2.3/railsexpress/03-display-more-detailed-stack-trace.patch
src/rvm/patchsets/ruby/2.2.3/default000066400000000045147511530540013135 0ustar00fix_installing_bundled_gems
openssl3
src/rvm/patchsets/ruby/2.2.3/float_warnings000066400000000202147511530540014521 0ustar00https://raw.githubusercontent.com/knugie/rvm-patchsets/master/patches/ruby/2.2.3/float_warnings/01-bigdecimal_float_warning.patch
src/rvm/patchsets/ruby/2.2.9/default000066400000000034147511530540013141 0ustar00fix_installing_bundled_gems
src/rvm/patchsets/ruby/2.2.9/railsexpress000066400000000567147511530540014254 0ustar00https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.2.9/railsexpress/01-zero-broken-tests.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.2.9/railsexpress/02-improve-gc-stats.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.2.9/railsexpress/03-display-more-detailed-stack-trace.patch
src/rvm/patchsets/ruby/2.3.4/default000066400000000076147511530540013143 0ustar00ruby_2_3_gcc7
fix_rb_thread_fd_close
random_c_using_NR_prefix
src/rvm/patchsets/ruby/2.3.4/float_warnings000066400000000202147511530540014523 0ustar00https://raw.githubusercontent.com/knugie/rvm-patchsets/master/patches/ruby/2.3.4/float_warnings/01-bigdecimal_float_warning.patch
src/rvm/patchsets/ruby/2.3.4/railsexpress000066400000000567147511530540014250 0ustar00https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.3.4/railsexpress/01-skip-broken-tests.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.3.4/railsexpress/02-improve-gc-stats.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.3.4/railsexpress/03-display-more-detailed-stack-trace.patch
src/rvm/patchsets/ruby/2.2.4/float_warnings000066400000000202147511530540014522 0ustar00https://raw.githubusercontent.com/knugie/rvm-patchsets/master/patches/ruby/2.2.4/float_warnings/01-bigdecimal_float_warning.patch
src/rvm/patchsets/ruby/2.2.4/default000066400000000045147511530540013136 0ustar00fix_installing_bundled_gems
openssl3
src/rvm/patchsets/ruby/2.2.4/railsexpress000066400000000567147511530540014247 0ustar00https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.2.4/railsexpress/01-zero-broken-tests.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.2.4/railsexpress/02-improve-gc-stats.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.2.4/railsexpress/03-display-more-detailed-stack-trace.patch
src/rvm/patchsets/ruby/2.3.3/railsexpress000066400000000567147511530540014247 0ustar00https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.3.3/railsexpress/01-skip-broken-tests.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.3.3/railsexpress/02-improve-gc-stats.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.3.3/railsexpress/03-display-more-detailed-stack-trace.patch
src/rvm/patchsets/ruby/2.3.3/float_warnings000066400000000202147511530540014522 0ustar00https://raw.githubusercontent.com/knugie/rvm-patchsets/master/patches/ruby/2.3.3/float_warnings/01-bigdecimal_float_warning.patch
src/rvm/patchsets/ruby/2.3.3/default000066400000000047147511530540013140 0ustar00ruby_2_3_gcc7
random_c_using_NR_prefix
src/rvm/patchsets/ruby/2.0.0/p645/float_warnings000066400000000207147511530540015217 0ustar00https://raw.githubusercontent.com/knugie/rvm-patchsets/master/patches/ruby/2.0.0/p645/float_warnings/01-bigdecimal_float_warning.patch
src/rvm/patchsets/ruby/2.0.0/p645/railsexpress000066400000001026147511530540014726 0ustar00https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.0.0/p645/railsexpress/01-zero-broken-tests.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.0.0/p645/railsexpress/02-railsexpress-gc.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.0.0/p645/railsexpress/03-display-more-detailed-stack-trace.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.0.0/p645/railsexpress/04-show-full-backtrace-on-stack-overflow.patch
src/rvm/patchsets/ruby/2.0.0/scientific000066400000000014147511530540013620 0ustar00ssl_no_ec2m
src/rvm/patchsets/ruby/2.0.0/p247/optional000066400000000010147511530540014015 0ustar00logging
src/rvm/patchsets/ruby/2.0.0/p247/osx_static000066400000000053147511530540014357 0ustar0043449
43514
cc_env
static
remove_digest_so
src/rvm/patchsets/ruby/2.0.0/p247/default000066400000000111147511530540013616 0ustar00libyaml_p0-p353
GH-488
changeset_r45225
changeset_r45240
update-autoconf
src/rvm/patchsets/ruby/2.0.0/p247/synology000066400000000027147511530540014063 0ustar00broken_stack_protector
src/rvm/patchsets/ruby/2.0.0/p247/float_warnings000066400000000207147511530540015215 0ustar00https://raw.githubusercontent.com/knugie/rvm-patchsets/master/patches/ruby/2.0.0/p247/float_warnings/01-bigdecimal_float_warning.patch
src/rvm/patchsets/ruby/2.0.0/p353/float_warnings000066400000000207147511530540015213 0ustar00https://raw.githubusercontent.com/knugie/rvm-patchsets/master/patches/ruby/2.0.0/p353/float_warnings/01-bigdecimal_float_warning.patch
src/rvm/patchsets/ruby/2.0.0/p353/railsexpress000066400000001234147511530540014723 0ustar00https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.0.0/p353/railsexpress/01-zero-broken-tests.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.0.0/p353/railsexpress/02-railsexpress-gc.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.0.0/p353/railsexpress/03-display-more-detailed-stack-trace.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.0.0/p353/railsexpress/04-show-full-backtrace-on-stack-overflow.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.0.0/p353/railsexpress/05-fix-missing-c-return-event.patch
src/rvm/patchsets/ruby/2.0.0/p353/default000066400000000111147511530540013614 0ustar00libyaml_p0-p353
GH-488
changeset_r45225
changeset_r45240
update-autoconf
src/rvm/patchsets/ruby/2.0.0/cygwin000066400000000007147511530540013002 0ustar00GH-433
src/rvm/patchsets/ruby/2.0.0/p195/default000066400000000111147511530540013620 0ustar00libyaml_p0-p353
GH-488
changeset_r45225
changeset_r45240
update-autoconf
src/rvm/patchsets/ruby/2.0.0/p648/float_warnings000066400000000207147511530540015222 0ustar00https://raw.githubusercontent.com/knugie/rvm-patchsets/master/patches/ruby/2.0.0/p648/float_warnings/01-bigdecimal_float_warning.patch
src/rvm/patchsets/ruby/2.0.0/p648/railsexpress000066400000001026147511530540014731 0ustar00https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.0.0/p648/railsexpress/01-zero-broken-tests.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.0.0/p648/railsexpress/02-railsexpress-gc.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.0.0/p648/railsexpress/03-display-more-detailed-stack-trace.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.0.0/p648/railsexpress/04-show-full-backtrace-on-stack-overflow.patch
src/rvm/patchsets/ruby/2.0.0/p451/float_warnings000066400000000207147511530540015212 0ustar00https://raw.githubusercontent.com/knugie/rvm-patchsets/master/patches/ruby/2.0.0/p451/float_warnings/01-bigdecimal_float_warning.patch
src/rvm/patchsets/ruby/2.0.0/p451/railsexpress000066400000001234147511530540014722 0ustar00https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.0.0/p451/railsexpress/01-zero-broken-tests.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.0.0/p451/railsexpress/02-railsexpress-gc.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.0.0/p451/railsexpress/03-display-more-detailed-stack-trace.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.0.0/p451/railsexpress/04-show-full-backtrace-on-stack-overflow.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.0.0/p451/railsexpress/05-fix-missing-c-return-event.patch
src/rvm/patchsets/ruby/2.0.0/p451/default000066400000000072147511530540013621 0ustar00libyaml
changeset_r45225
changeset_r45240
update-autoconf
src/rvm/patchsets/ruby/2.0.0/redhat000066400000000014147511530540012747 0ustar00ssl_no_ec2m
src/rvm/patchsets/ruby/2.0.0/default000066400000000031147511530540013123 0ustar00openssl3
update-autoconf
src/rvm/patchsets/ruby/2.0.0/osx_static000066400000000007147511530540013662 0ustar00cc_env
src/rvm/patchsets/ruby/2.0.0/p594/railsexpress000066400000001026147511530540014731 0ustar00https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.0.0/p594/railsexpress/01-zero-broken-tests.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.0.0/p594/railsexpress/02-railsexpress-gc.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.0.0/p594/railsexpress/03-display-more-detailed-stack-trace.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.0.0/p594/railsexpress/04-show-full-backtrace-on-stack-overflow.patch
src/rvm/patchsets/ruby/2.0.0/p594/float_warnings000066400000000207147511530550015223 0ustar00https://raw.githubusercontent.com/knugie/rvm-patchsets/master/patches/ruby/2.0.0/p594/float_warnings/01-bigdecimal_float_warning.patch
src/rvm/patchsets/ruby/2.0.0/p0/default000066400000000111147511530550013442 0ustar00libyaml_p0-p353
GH-488
changeset_r45225
changeset_r45240
update-autoconf
src/rvm/patchsets/ruby/2.0.0/centos000066400000000014147511530550012774 0ustar00ssl_no_ec2m
src/rvm/patchsets/ruby/2.0.0/fedora000066400000000014147511530550012741 0ustar00ssl_no_ec2m
src/rvm/patchsets/ruby/2.0.0/p481/railsexpress000066400000001234147511530550014726 0ustar00https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.0.0/p481/railsexpress/01-zero-broken-tests.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.0.0/p481/railsexpress/02-railsexpress-gc.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.0.0/p481/railsexpress/03-display-more-detailed-stack-trace.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.0.0/p481/railsexpress/04-show-full-backtrace-on-stack-overflow.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.0.0/p481/railsexpress/05-fix-missing-c-return-event.patch
src/rvm/patchsets/ruby/2.0.0/p481/float_warnings000066400000000207147511530550015216 0ustar00https://raw.githubusercontent.com/knugie/rvm-patchsets/master/patches/ruby/2.0.0/p481/float_warnings/01-bigdecimal_float_warning.patch
src/rvm/patchsets/ruby/2.0.0/head/railsexpress000066400000001026147511530550015132 0ustar00https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.0.0/head/railsexpress/01-zero-broken-tests.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.0.0/head/railsexpress/02-railsexpress-gc.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.0.0/head/railsexpress/03-display-more-detailed-stack-trace.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.0.0/head/railsexpress/04-show-full-backtrace-on-stack-overflow.patch
src/rvm/patchsets/ruby/2.0.0/head/float_warnings000066400000000207147511530550015423 0ustar00https://raw.githubusercontent.com/knugie/rvm-patchsets/master/patches/ruby/2.0.0/head/float_warnings/01-bigdecimal_float_warning.patch
src/rvm/patchsets/ruby/2.0.0/p647/float_warnings000066400000000207147511530550015222 0ustar00https://raw.githubusercontent.com/knugie/rvm-patchsets/master/patches/ruby/2.0.0/p647/float_warnings/01-bigdecimal_float_warning.patch
src/rvm/patchsets/ruby/2.0.0/p647/railsexpress000066400000001026147511530550014731 0ustar00https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.0.0/p647/railsexpress/01-zero-broken-tests.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.0.0/p647/railsexpress/02-railsexpress-gc.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.0.0/p647/railsexpress/03-display-more-detailed-stack-trace.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.0.0/p647/railsexpress/04-show-full-backtrace-on-stack-overflow.patch
src/rvm/patchsets/ruby/2.0.0/p598/float_warnings000066400000000207147511530550015227 0ustar00https://raw.githubusercontent.com/knugie/rvm-patchsets/master/patches/ruby/2.0.0/p598/float_warnings/01-bigdecimal_float_warning.patch
src/rvm/patchsets/ruby/2.0.0/p598/railsexpress000066400000001026147511530550014736 0ustar00https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.0.0/p598/railsexpress/01-zero-broken-tests.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.0.0/p598/railsexpress/02-railsexpress-gc.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.0.0/p598/railsexpress/03-display-more-detailed-stack-trace.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.0.0/p598/railsexpress/04-show-full-backtrace-on-stack-overflow.patch
src/rvm/patchsets/ruby/1.8.6/default000066400000000053147511530550013145 0ustar00openssl-1.0
stdout-rouge-fix
no_sslv2
syck
src/rvm/patchsets/ruby/1.9.1/p431/default000066400000000055147511530550013632 0ustar00backport-2404
openssl-1.0
nossl2
ssl_no_ec2m
src/rvm/patchsets/ruby/1.9.1/default000066400000000037147511530550013143 0ustar00openssl-1.0
nossl2
ssl_no_ec2m
src/rvm/patchsets/ruby/2.1.7/default000066400000000011147511530550013132 0ustar00openssl3
src/rvm/patchsets/ruby/2.1.7/float_warnings000066400000000202147511530550014525 0ustar00https://raw.githubusercontent.com/knugie/rvm-patchsets/master/patches/ruby/2.1.7/float_warnings/01-bigdecimal_float_warning.patch
src/rvm/patchsets/ruby/2.1.7/railsexpress000066400000002176147511530550014250 0ustar00https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.1.7/railsexpress/01-zero-broken-tests.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.1.7/railsexpress/02-improve-gc-stats.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.1.7/railsexpress/03-display-more-detailed-stack-trace.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.1.7/railsexpress/04-show-full-backtrace-on-stack-overflow.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.1.7/railsexpress/05-funny-falcon-stc-density.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.1.7/railsexpress/06-funny-falcon-stc-pool-allocation.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.1.7/railsexpress/07-aman-opt-aset-aref-str.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.1.7/railsexpress/08-funny-falcon-method-cache.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.1.7/railsexpress/09-heap-dump-support.patch
src/rvm/patchsets/ruby/2.6.6/railsexpress000066400000000754147511530550014254 0ustar00https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.6.6/railsexpress/01-fix-broken-tests-caused-by-ad.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.6.6/railsexpress/02-improve-gc-stats.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.6.6/railsexpress/03-more-detailed-stacktrace.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.6.6/railsexpress/04-malloc-trim.patch
src/rvm/patchsets/ruby/2.7.1/railsexpress000066400000000754147511530550014250 0ustar00https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.7.1/railsexpress/01-fix-broken-tests-caused-by-ad.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.7.1/railsexpress/02-improve-gc-stats.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.7.1/railsexpress/03-more-detailed-stacktrace.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.7.1/railsexpress/04-malloc-trim.patch
src/rvm/patchsets/ruby/2.4.2/railsexpress000066400000000763147511530550014246 0ustar00https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.4.2/railsexpress/01-skip-broken-tests.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.4.2/railsexpress/02-improve-gc-stats.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.4.2/railsexpress/03-display-more-detailed-stack-trace.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.4.2/railsexpress/04-fix-gmp-compile-issue.patch
src/rvm/patchsets/ruby/2.4.2/float_warnings000066400000000202147511530550014523 0ustar00https://raw.githubusercontent.com/knugie/rvm-patchsets/master/patches/ruby/2.4.2/float_warnings/01-bigdecimal_float_warning.patch
src/rvm/patchsets/ruby/2.5.5/railsexpress000066400000000572147511530550014250 0ustar00https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.5.5/railsexpress/01-fix-broken-tests-caused-by-ad.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.5.5/railsexpress/02-improve-gc-stats.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.5.5/railsexpress/03-more-detailed-stacktrace.patch
src/rvm/patchsets/ruby/2.1/head/float_warnings000066400000000205147511530550015264 0ustar00https://raw.githubusercontent.com/knugie/rvm-patchsets/master/patches/ruby/2.1/head/float_warnings/01-bigdecimal_float_warning.patch
src/rvm/patchsets/ruby/2.1/head/railsexpress000066400000002231147511530550014774 0ustar00https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.1/head/railsexpress/01-zero-broken-tests.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.1/head/railsexpress/02-improve-gc-stats.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.1/head/railsexpress/03-display-more-detailed-stack-trace.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.1/head/railsexpress/04-show-full-backtrace-on-stack-overflow.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.1/head/railsexpress/05-funny-falcon-stc-density.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.1/head/railsexpress/06-funny-falcon-stc-pool-allocation.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.1/head/railsexpress/07-aman-opt-aset-aref-str.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.1/head/railsexpress/08-funny-falcon-method-cache.patch
https://raw.githubusercontent.com/skaes/rvm-patchsets/master/patches/ruby/2.1/head/railsexpress/09-heap-dump-support.patch
src/rvm/patchsets/ruby/2.1/head/default000066400000000011147511530550013666 0ustar00openssl3
src/rvm/scripts/hash000077500000002140147511530550010504 0ustar00#!/usr/bin/env bash

#
# The idea is that we emulate a hash using two methods
#
# The first method is providing functions by sourcing this file
#
# The second method is where this script is called directly,
# we then provide functionality of a file based hash
#

if [[ "$rvm_trace_flag" -eq 2 ]] ; then set -x ; export rvm_trace_flag ; fi

[[ -z "${ZSH_VERSION:-}" ]] ; array_start=$?

hash()
{
  hash_name=$1 ; hash_key=$2 ; hash_value=$3

  eval "_hash_${hash_name}_keys=\${_hash_${hash_name}_keys:-()} ; _hash_${hash_name}_values=\${_hash_${hash_name}_values:-()}"

  if [[ -z "$hash_value" ]] ; then
    eval "length=\${#_hash_${hash_name}_keys[@]}"
    for (( index=$__array_start ; index < $length; index++ )) ; do
      eval "key=\"\${_hash_${hash_name}_keys[$index]}\""
      if [[ "$hash_key" == "$key" ]] ; then
        eval "echo -n \${_hash_${hash_name}_values[$index]}"
        break
      fi
    done
  else
    eval "index=\$((\${#_hash_${hash_name}_keys[*]} + $__array_start))"
    eval "_hash_${hash_name}_keys[$index]=\"$hash_key\""
    eval "_hash_${hash_name}_values[$index]=\"$hash_value\""
  fi
}

src/rvm/scripts/extras/completion.zsh/_rvm000066400000010147147511530550015011 0ustar00#compdef rvm

\typeset curcontext state line cmds ret

curcontext="$curcontext"
ret=1

_arguments -C \
  '(- 1 *)'{-v,--version}'[display version information]' \
  '(-l|--level)'{-l,--level}'+[patch level to use with rvm use / install]:number' \
  '(--bin)--bin[path for binaries to be placed (~/.rvm/bin/)]:path:_files' \
  '(--source)--source[src directory to use (~/.rvm/src/)]:path:_files' \
  '(--archives)--archives[directory for downloaded files (~/.rvm/archives/)]:path:_files' \
  '-S[Specify a script file to attempt to load and run (rubydo)]:file:_files' \
  '-e[Execute code from the command line]:code' \
  '(-G)-G[root gem path to use]:path:_files' \
  '(--gems)--gems[Used to set the gems_flag, use with remove to remove gems]' \
  '(--archive)--archive[Used to set the archive_flag, use with remove to remove archive]' \
  '(--patch)--patch[With MRI Rubies you may specify one or more full paths to patches]' \
  '(-C|--configure)'{-C,--configure}'=[custom configure options]' \
  '(--nice)--nice[process niceness (for slow computers, default 0)]:number' \
  '(--ree)--ree-options[Options passed directly to ree ./installer on the command line]:options' \
  '(--head)--head[with update, updates rvm to git head version]' \
  '(--rubygems)--rubygems[with update, updates rubygems for selected ruby]' \
  '(--default)--default[with ruby select, sets a default ruby for new shells]' \
  '(--debug)--debug[Toggle debug mode on for very verbose output]' \
  '(--trace)--trace[Toggle trace mode on to see EVERYTHING rvm is doing]' \
  '(--force)--force[Force install, even given ruby is already install]' \
  '(--summary)--summary[Used with rubydo to print out a summary of the commands run]' \
  '(--latest)--latest[with gemset --dump skips version strings for latest gem]' \
  '(--gems)--gems[with uninstall/remove removes gems with the interpreter]' \
  '(--docs)--docs[with install, attempt to generate ri after installation]' \
  '(--reconfigure)--reconfigure[Force ./configure on install even if Makefile already exists]' \
  '(--quiet-curl)--quiet-curl[Makes curl silent when fetching data]' \
  '1: :->cmds' \
  '*: :->args' && ret=0

case $state in

  cmds)

    cmds=( ${(f)"$(_call_program commands rvm help 2> /dev/null | __rvm_sed -e '/^== Action/,/^== Implementation/!d; / :: /!d; s/^[ *]*\([^ ]*\) *:: *\(.*\)/\1:\2/')"} )
    cmds+=( $(rvm list strings) )
    _describe -t commands 'rvm command' cmds && ret=0
    ;;

  args)

    case $line[1] in

      (use|uninstall|remove|list)

        if (( CURRENT == 3 )); then
          # See if we’ve made it to the ‘@’; eg, 1.9.2@
          if ! __rvm_grep '@' <<< "${line[CURRENT-1]}" >/dev/null ; then
            _values -S , 'rubies' \
              $(rvm list strings | __rvm_sed -e 's/ruby-\([^) ]*\)-\([^) ]*\)/ruby-\1-\2 \1-\2 \1/g') \
              default system $(rvm alias list names) && ret=0
          else
            # Construct a full version string for each of the gemsets.
            # Eg, 1.9.2@min 1.9.2@rail3 …
            _values -S , 'gemsets' \
              $(rvm ${line[CURRENT-1]%%@*} gemset list | __rvm_awk '/^[ -_[:alnum:]]+$/ {print "'${line[CURRENT-1]%%@*}'@"$1}')
          fi
        fi
        ;;

      (install|fetch)

        _values -S , 'rubies' $(rvm list known_strings) && ret=0
        ;;

      gemset)

        if (( CURRENT == 3 )); then
          _values 'gemset_commands' $(rvm gemset help | __rvm_sed -e '/create/!d; s/^.*[{]\(.*\)[}].*$/\1/; s/,/ /g')
        else
          #_values -S , 'gemsets' $(rvm gemset list | __rvm_grep -v gemset 2>/dev/null)
          _values -S , 'gemsets' $(rvm gemset list | __rvm_grep -Ev '(gemset|info)' 2>/dev/null | __rvm_awk '/^[ -_[:alnum:]]+$/ {print '$1'}')
        fi
        ret=0
        ;;

      package)

        if (( CURRENT == 3 )); then
          _values 'package_commands' $(rvm package | __rvm_sed -e '/Usage/!d; s/^.*[{]\(.*\)[}] [{].*$/\1/; s/,/ /g')
        else
          _values 'packages' $(rvm package | __rvm_sed -e '/Usage/!d; s/^.*[}] [{]\(.*\)[}].*$/\1/; s/,/ /g')
        fi
        ret=0
        ;;

      *)
        (( ret )) && _message 'no more arguments'
        ;;

    esac
    ;;
esac

return ret
src/rvm/scripts/requirements000077500000000427147511530550012312 0ustar00#!/usr/bin/env bash

: rvm_scripts_path:${rvm_scripts_path:=$rvm_path/scripts}

source "$rvm_scripts_path/base"
source "$rvm_scripts_path/patches"
source "$rvm_scripts_path/functions/build"

__rvm_setup_compile_environment_setup
__rvm_setup_compile_environment_requirements "$@"
src/rvm/scripts/cli000077500000077633147511530550010353 0ustar00#!/usr/bin/env bash

__rvm_parse_args_find_known_flags()
{
  \typeset _args_array_name _temp_var
  \typeset -a _new_args
  _args_array_name="$1"
  (( $# == 0 )) || shift
  _new_args=()
  while
    (( $# ))
  do
    case "$1" in
      (--verify-downloads)
        export "rvm_verify_downloads_flag_cli"="${2:-}"
        shift
        ;;
      (--force|--verbose|--debug|--quiet|--silent|--create)
        export "rvm_${1#--}_flag=1"
        ;;
      (--only-path)
        _temp_var="${1#--}"
        export "rvm_${_temp_var//-/_}_flag=1"
        ;;
      (--32|--64)
        rvm_architectures+=( "${1#--}" )
        rvm_disable_binary_flag=1
        ;;
      (--universal)
        rvm_architectures+=( "32" "64" )
        rvm_disable_binary_flag=1
        ;;
      (--patches|--patch)
        __rvm_custom_separated_array rvm_patch_names , "${2:-}"
        rvm_patch_original_pwd="$PWD"
        rvm_disable_binary_flag=1
        shift
        ;;
      (--autolibs=*)
        export rvm_autolibs_flag="${1#*=}"
        ;;
      (--)
        shift
        _new_args+=( "$@" )
        shift $#
        ;;
      (*)
        _new_args+=( "$1" )
        ;;
    esac
    (( $# == 0 )) || shift # check in case shifted already
  done
  eval "${_args_array_name}+=( \"\${_new_args[@]}\" )"
}

__rvm_parse_args_error_finding_project_file()
{
  unset RVM_PROJECT_PATH
  case $? in
    101)
      true # should be printed already
      ;;
    *)
      rvm_error_message="Could not determine which Ruby to use; $rvm_token should contain .rvmrc or .versions.conf or .ruby-version or .rbfu-version or .rbenv-version, or an appropriate line in Gemfile."
      ;;
  esac
  rvm_action="error"
}

__rvm_parse_args()
{
  \typeset _string
  export rvm_ruby_string

  rvm_action="${rvm_action:-""}"
  rvm_parse_break=0

  if
    [[ " $* " == *" --trace "* ]]
  then
    echo "$@"
    __rvm_print_headline
  fi

  while
    [[ -n "$next_token" ]]
  do
    rvm_token="$next_token"
    if
      (( $# > 0 ))
    then
      next_token="$1"
      shift
    else
      next_token=""
    fi

    case "$rvm_token" in

      [0-9a-zA-ZuU]*|@*) # Commands, Rubies and Gemsets
        case "$rvm_token" in
          use)
            rvm_action="$rvm_token"
            rvm_verbose_flag=1
            __rvm_file_env_check_unload
            if
              [[ -n "${next_token:-}" && ! -d "${next_token:-}" &&
                "${next_token:-}" != "-"* && "${next_token:-}" != "@"*
              ]]
            then
              rvm_ruby_interpreter="$next_token"
              rvm_ruby_string="$next_token"
              rvm_ruby_strings="$next_token"
              next_token="${1:-}"
              (( $# == 0 )) || shift
            elif
              [[ -z "${next_token:-}" ]] &&
              __rvm_project_dir_check .
            then
              __rvm_rvmrc_tools try_to_read_ruby . ||
                __rvm_parse_args_error_finding_project_file
            fi
            ;;

          install|uninstall|reinstall|try_install)
            export ${rvm_token}_flag=1
            rvm_action=$rvm_token
            ;;

          gemset)
            rvm_action=$rvm_token
            rvm_ruby_args=()
            __rvm_parse_args_find_known_flags rvm_ruby_args  "$next_token" "$@"
            : rvm_ruby_args:${#rvm_ruby_args[@]}:${rvm_ruby_args[*]}:
            next_token="${rvm_ruby_args[__array_start]}"
            rvm_gemset_name="${rvm_ruby_args[__array_start+1]}"

            case "${next_token:-help}" in
              (help)
                true
                ;;
              (use|delete|remove)
                [[ "delete" != "$next_token" ]] || [[ "remove" != "$next_token" ]] || rvm_delete_flag=1
                [[ "use"    != "$next_token" ]] || rvm_action+="_$next_token"

                case "$rvm_gemset_name" in
                  *${rvm_gemset_separator:-"@"}*)
                    rvm_ruby_string="${rvm_gemset_name%%${rvm_gemset_separator:-"@"}*}"
                    rvm_gemset_name="${rvm_gemset_name##*${rvm_gemset_separator:-"@"}}"
                    if
                      [[ "${rvm_ruby_string:-""}" != "${rvm_gemset_name:-""}" ]]
                    then
                      rvm_ruby_string="$rvm_ruby_string${rvm_gemset_separator:-"@"}$rvm_gemset_name"
                    fi
                    rvm_ruby_gem_home="$rvm_ruby_gem_home${rvm_gemset_separator:-"@"}$rvm_gemset_name"
                    ;;
                  ("")
                    rvm_error "Gemset was not given.\n  Usage:\n    rvm gemset $rvm_gemset_name <gemsetname>\n"
                    return 1
                    ;;
                esac
                ;;
            esac
            rvm_parse_break=1
            ;;

          gemdir|gempath|gemhome)
            rvm_ruby_args=("$rvm_token")
            rvm_action="gemset"
            rvm_gemdir_flag=1
            if
              [[ "system" == "$next_token" ]]
            then
              rvm_system_flag=1
              next_token="${1:-}"
              (( $# == 0 )) || shift
            fi
            if
              [[ "user" == "$next_token" ]]
            then
              rvm_user_flag=1
              next_token="${1:-}"
              (( $# == 0 )) || shift
            fi
            ;;

          pkg)
            rvm_action="$rvm_token"
            __rvm_parse_args_find_known_flags rvm_ruby_args  "$next_token" "$@"
            rvm_parse_break=1
            ;;

          do|exec)
            if
              [[ -z "$next_token" ]]
            then
              rvm_action="error"
              rvm_error_message="'rvm $rvm_token' must be followed by arguments."
              break
            fi
            rvm_action="do"
            rvm_ruby_args=("$next_token" "$@")
            rvm_parse_break=1
            ;;

          gem|rake|ruby)
            [[ "$rvm_token" == "ruby" ]] &&
            case $rvm_action in
              install|reinstall|use|delete|remove)
                rvm_ruby_string=ruby
                rvm_ruby_strings=ruby
                continue
              ;;
            esac
            # deprecated 2011.10.11 for RVM 1.9.0, removed 2012.09.13 for RVM 1.16.0
            rvm_action=error
            rvm_error_message="Please note that \`rvm $rvm_token ...\` was removed, try \`$rvm_token $next_token $*\` or \`rvm all do $rvm_token $next_token $*\` instead."
            ;;

          fetch|version|remote_version|reset|debug|reload|update|monitor|notes|implode|seppuku|env|unexport|automount|prepare)
            rvm_action=$rvm_token
            ;;

          doctor)
            rvm_action=notes
            ;;

          mount)
            rvm_action=$rvm_token
            while
              [[ -n "${next_token:-}" ]] &&
              [[ -x "${next_token:-}" ||
                -d "${next_token:-}" ||
                "${next_token:-}" == http* ||
                "${next_token:-}" == *tar.bz2 ||
                "${next_token:-}" == *tar.gz
              ]]
            do
              rvm_ruby_args=("$next_token" "${rvm_ruby_args[@]}")
              next_token="${1:-}"
              (( $# == 0 )) || shift
            done
            ;;

          rm|remove|delete)
            rvm_action="remove"
            rvm_remove_flag=1
            ;;

          rtfm|RTFM|rvmrc|help|inspect|list|ls|info|strings|get|current|docs|alias|rubygems|cleanup|tools|disk-usage|snapshot|repair|migrate|downgrade|upgrade|cron|group|switch|which|config-get|requirements|autolibs|osx-ssl-certs|fix-permissions)
            case "$rvm_token" in
              (downgrade) rvm_action="upgrade" ;;
              (ls)    rvm_action="list" ;;
              (RTFM)  rvm_action="rtfm" ;;
              (*)     rvm_action="$rvm_token" ;;
            esac
            rvm_ruby_args=()
            __rvm_parse_args_find_known_flags rvm_ruby_args "$next_token" "$@"
            rvm_parse_break=1
            ;;

          user)
            rvm_action="tools"
            rvm_ruby_args=("$rvm_token" "$next_token" "$@")
            rvm_parse_break=1
            ;;

          load-rvmrc)
            rvm_action="rvmrc"
            rvm_ruby_args=("load" "$next_token" "$@")
            rvm_parse_break=1
            ;;

          specs|tests)
            rvm_action="rake"
            rvm_ruby_args=("${rvm_token/%ss/s}")
            ;;

          export)
            if
              [[ -n "$next_token" ]]
            then
              \typeset -a ___args
              ___args=( "$next_token" "$@" )
              rvm_export_args="${___args[*]}"
              rvm_action="export"
              rvm_parse_break=1
            else
              rvm_action="error"
              rvm_error_message="rvm export must be followed by a NAME=VALUE argument"
            fi
            ;;

          alt*)
            rvm_action="help"
            rvm_ruby_args=("alt.md")
            rvm_parse_break=1
            ;;

          wrapper)
            rvm_action="wrapper"
            rvm_ruby_args=( "$next_token" "$@")
            rvm_parse_break=1
            ;;

          in)
            rvm_token="${next_token}"
            next_token="${1:-}"
            (( $# == 0 )) || shift
            export rvm_in_flag="$rvm_token"
            __rvm_project_dir_check "$rvm_token" &&
            __rvm_rvmrc_tools try_to_read_ruby $rvm_token ||
            __rvm_parse_args_error_finding_project_file
            ;;

          usage)
            rvm_action="deprecated"
            rvm_error_message="This command has been deprecated. Use ${rvm_notify_clr:-}rvm help${rvm_error_clr:-} instead."
            rvm_parse_break=1
            ;;

          *,*)
            rvm_ruby_strings="$rvm_token"
            [[ -n "${rvm_action:-""}" ]] ||
              rvm_action="ruby" # Not sure if we really want to do this but we'll try it out.
            ;;

          ${rvm_gemset_separator:-"@"}*)
            rvm_action="${rvm_action:-use}"
            rvm_gemset_name="${rvm_token#${rvm_gemset_separator:-"@"}}"
            rvm_ruby_string="${rvm_ruby_string:-${GEM_HOME##*/}}"
            rvm_ruby_string="${rvm_ruby_string%%${rvm_gemset_separator:-"@"}*}"
            rvm_ruby_strings="${rvm_ruby_string}${rvm_gemset_separator:-"@"}${rvm_gemset_name}"
            ;;

          *${rvm_gemset_separator:-"@"}*)
            rvm_verbose_flag=1
            rvm_action="${rvm_action:-use}"
            rvm_gemset_name="${rvm_token/*${rvm_gemset_separator:-"@"}/}"
            rvm_ruby_string="$rvm_token"
            rvm_ruby_strings="$rvm_token"
            ;;

          *+*)
            rvm_action="${rvm_action:-use}"
            rvm_ruby_alias="${rvm_token/*+/}"
            rvm_ruby_string="${rvm_token/+*/}"
            rvm_ruby_strings="$rvm_ruby_string"
            ;;

          *-*|+([0-9]).+([0-9])*)
            rvm_verbose_flag=1
            rvm_action="${rvm_action:-use}"
            rvm_ruby_string="$rvm_token"
            rvm_ruby_strings="$rvm_token"
            ;;

          opal*|jruby*|ree*|macruby*|rbx*|rubinius*|mruby|ironruby*|default*|maglev*|topaz*|truffleruby*|ruby*|system|default|all)
            rvm_action="${rvm_action:-use}"
            rvm_ruby_interpreter="$rvm_token"
            rvm_ruby_string="$rvm_token"
            rvm_ruby_strings="$rvm_token"
            ;;

          kiji*|tcs*|jamesgolick*)
            rvm_error_message="The $rvm_token was removed from RVM, use: rvm install ruby-head-<name> --url https://github.com/github/ruby.git --branch 2.1"
            rvm_action="error"
            ;;

          old)
            case "${rvm_action:-action-missing}" in
              remove)
                rvm_ruby_strings="old:${next_token:-}"
                next_token="${1:-}"
                (( $# == 0 )) || shift
                ;;
              action-missing)
                rvm_error_message="what do you want to do with old rubies? rvm can only remove old rubies."
                rvm_action="error"
                ;;
              *)
                rvm_error_message="rvm can not $rvm_action old rubies, rvm can only remove old rubies."
                rvm_action="error"
                ;;
            esac
            ;;

          *.rb) # we have a specified ruby script
            rvm_ruby_args=("$rvm_token")
            rvm_ruby_file="$rvm_token"
            if
              [[ -z "${rvm_action:-""}" || "$rvm_action" == "use" ]]
            then
              rvm_action="ruby"
            fi
            ;;

          *.gems)
            rvm_file_name="${rvm_token}"
            ;;

          ("")
            rvm_action="error"
            rvm_error_message="Unrecognized command line argument(s): $@"
            ;;

          *)
            if
              [[ "gemset" == "$rvm_action" ]]
            then
              rvm_gemset_name="${rvm_token/.gems/}"
              rvm_file_name="$rvm_gemset_name.gems"
            elif
              [[ -f "$rvm_rubies_path/$rvm_token" || -L "$rvm_rubies_path/$rvm_token" ]] # ruby || alias
            then
              rvm_ruby_string=$rvm_token
              rvm_ruby_strings="$rvm_token"
              rvm_action="${rvm_action:-use}"
            elif
              [[ -d  "$rvm_token" ]] ||
              __rvm_project_dir_check "$rvm_token"
            then
              __rvm_rvmrc_tools try_to_read_ruby $rvm_token ||
              __rvm_parse_args_error_finding_project_file
            else
              rvm_action="error"
              rvm_error_message="Unrecognized command line argument: $rvm_token"
            fi
            ;;
        esac
        ;;

      -*) # Flags
        case "$rvm_token" in
          -S)
            rvm_action="ruby"
            rvm_ruby_args=("$rvm_token" "$next_token" "$@")
            rvm_parse_break=1
            ;;

          -e)
            rvm_action="ruby"
            IFS="\n"
            rvm_ruby_args=("$rvm_token" "'$next_token $@'")
            IFS=" "
            rvm_parse_break=1
            ;;

          -v|--version)
            if [[ -z "$next_token" ]] ; then
              rvm_action="version"
            else
              rvm_ruby_version="$next_token"
              next_token="${1:-}"
              (( $# == 0 )) || shift
            fi
            ;;

          -n|--name)
            rvm_ruby_name="$next_token"
            next_token="${1:-}"
            (( $# == 0 )) || shift
            #TODO: ??? rvm_disable_binary_flag=1
            ;;

          --branch)
            rvm_ruby_repo_branch="$next_token"
            next_token="${1:-}"
            (( $# == 0 )) || shift
            rvm_disable_binary_flag=1
            ;;

          --tag)
            rvm_ruby_repo_tag="$next_token"
            next_token="${1:-}"
            (( $# == 0 )) || shift
            rvm_disable_binary_flag=1
            ;;

          --repository|--repo|--url)
            rvm_ruby_repo_url="$next_token"
            next_token="${1:-}"
            (( $# == 0 )) || shift
            rvm_disable_binary_flag=1
            ;;

          -r|--remote|--binary|--latest-binary)
            rvm_remote_flag=1
            if [[ "$rvm_token" == "--latest-binary" ]]
            then rvm_fuzzy_flag=1
            fi
            while
              [[ -n "${next_token:-}" ]] &&
              [[ "${next_token:-}" == http* ||
                "${next_token:-}" == *tar.bz2 ||
                "${next_token:-}" == *tar.gz ||
                "${next_token:-}" == *":"*
              ]]
            do
              rvm_ruby_args=("${rvm_ruby_args[@]}" "$next_token")
              next_token="${1:-}"
              (( $# == 0 )) || shift
            done
            ;;

          --ree-options)
            if
              [[ -n "$next_token" ]]
            then
              __rvm_custom_separated_array rvm_ree_options , "${next_token}"
              next_token="${1:-}"
              (( $# == 0 )) || shift
            else
              rvm_action="error"
              rvm_error_message="--ree-options *must* be followed by... well... comma,separated,list,of,options."
            fi
            ;;

          --patches|--patch)
            __rvm_custom_separated_array rvm_patch_names , "$next_token"
            next_token="${1:-}"
            (( $# == 0 )) || shift
            rvm_patch_original_pwd="$PWD"
            rvm_disable_binary_flag=1
            ;;

          --arch|--archflags)
            rvm_architectures+=( "${next_token#-arch }" )
            next_token="${1:-}"
            (( $# == 0 )) || shift
            rvm_disable_binary_flag=1
            ;;

          --with-arch=*)
            rvm_architectures+=( "${rvm_token#--with-arch=}" )
            rvm_disable_binary_flag=1
            ;;

          --32|--64)
            rvm_architectures+=( "${rvm_token#--}" )
            rvm_disable_binary_flag=1
            ;;

          --universal)
            rvm_architectures+=( "32" "64" )
            rvm_disable_binary_flag=1
            ;;

          --bin)
            rvm_bin_path="$next_token"
            next_token="${1:-}"
            (( $# == 0 )) || shift
            ;;

          --rdoc|--yard)
            rvm_docs_type="$rvm_token"
            rvm_docs_type
            ;;

          -f|--file)
            rvm_action="ruby"
            rvm_ruby_file="$next_token"
            next_token="${1:-}"
            (( $# == 0 )) || shift
            ;;

          --passenger|--editor)
            rvm_warn "NOTE: ${rvm_token} flag is deprecated, RVM now automatically generates wrappers" # 2017-09-21
            ;;

          -h|--help)
            rvm_action=help
            ;;

          -l|--level)
            rvm_ruby_patch_level="p$next_token"
            next_token="${1:-}"
            (( $# == 0 )) || shift
            ;;

          --sha|--make|--make-install)
            rvm_token=${rvm_token#--}
            rvm_token=${rvm_token//-/_}
            export "rvm_ruby_${rvm_token}"="$next_token"
            next_token="${1:-}"
            rvm_disable_binary_flag=1
            (( $# == 0 )) || shift
            ;;

          --nice|--sdk|--autoconf-flags|--proxy)
            rvm_token=${rvm_token#--}
            rvm_token=${rvm_token//-/_}
            export "rvm_${rvm_token}"="$next_token"
            next_token="${1:-}"
            (( $# == 0 )) || shift
            ;;

          --disable-llvm|--disable-jit)
            rvm_llvm_flag=0
            ;;

          --enable-llvm|--enable-jit)
            rvm_llvm_flag=1
            ;;

          --install)
            rvm_install_on_use_flag=1
            ;;

          --autolibs=*)
            export rvm_autolibs_flag="${rvm_token#*=}"
            ;;

          --color=*)
            rvm_pretty_print_flag=${rvm_token#--color=}
            ;;

          --pretty)
            rvm_pretty_print_flag=auto
            ;;

          --1.8|--1.9|--2.0|--2.1|--18|--19|--20|--21)
            rvm_token=${rvm_token#--}
            rvm_token=${rvm_token//\./}
            export "rvm_${rvm_token}_flag"=1
            rvm_disable_binary_flag=1
            ;;

          --rvmrc|--versions-conf|--ruby-version)
            rvm_token=${rvm_token#--}
            rvm_token=${rvm_token//-/_}
            export rvm_rvmrc_flag="${rvm_token}"
            ;;

          --list-missing-packages)
            export rvm_list_missing_packages_flag=1
            export rvm_quiet_flag=1
            ;;

          --list-undesired-packages)
            export rvm_list_undesired_packages_flag=1
            export rvm_quiet_flag=1
            ;;

          --list-installed-packages)
            export rvm_list_installed_packages_flag=1
            export rvm_quiet_flag=1
            ;;

          --list-all-packages)
            export rvm_list_missing_packages_flag=1
            export rvm_list_undesired_packages_flag=1
            export rvm_list_installed_packages_flag=1
            export rvm_quiet_flag=1
            ;;

          --head|--static|--self|--gem|--reconfigure|--default|--force|--export|--summary|--latest|--yaml|--json|--archive|--shebang|--path|--cron|--tail|--delete|--verbose|--import|--sticky|--create|--gems|--docs|--skip-autoreconf|--force-autoconf|--auto-dotfiles|--autoinstall-bundler|--disable-binary|--ignore-gemsets|--skip-gemsets|--debug|--quiet|--silent|--skip-openssl|--fuzzy|--quiet-curl|--skip-pristine|--dynamic-extensions)
            rvm_token=${rvm_token#--}
            rvm_token=${rvm_token//-/_}
            export "rvm_${rvm_token}_flag"=1
            ;;

          --no-docs)
            rvm_token=${rvm_token#--no-}
            rvm_token=${rvm_token//-/_}
            export "rvm_${rvm_token}_flag"=0
            ;;

          --auto)
            export "rvm_auto_dotfiles_flag"=1
            rvm_warn "Warning, --auto is deprecated in favor of --auto-dotfiles."
            ;;

          --rubygems)
            rvm_token=${rvm_token#--}
            rvm_token=${rvm_token//-/_}
            export "rvm_${rvm_token}_version"="$next_token"
            next_token="${1:-}"
            (( $# == 0 )) || shift
            ;;

          --dump-environment|--max-time)
            rvm_token=${rvm_token#--}
            rvm_token=${rvm_token//-/_}
            export "rvm_${rvm_token}_flag"="$next_token"
            next_token="${1:-}"
            (( $# == 0 )) || shift
            ;;

          --verify-downloads)
            rvm_token=${rvm_token#--}
            rvm_token=${rvm_token//-/_}
            export "rvm_${rvm_token}_flag_cli"="$next_token"
            next_token="${1:-}"
            (( $# == 0 )) || shift
            ;;

          --clang)
            export CC=clang
            export CXX=clang++
            rvm_disable_binary_flag=1
            ;;

          -M)
            if
              [[ -n "$next_token" ]]
            then
              __rvm_custom_separated_array rvm_make_flags , "${next_token}"
              next_token="${1:-}"
              (( $# == 0 )) || shift
              rvm_disable_binary_flag=1
            else
              rvm_action="error"
              rvm_error_message="--make *must* be followed by make flags."
            fi
            ;;

          -j)
            if
              [[ -n "$next_token" ]]
            then
              rvm_make_flags+=( -j$next_token )
              next_token="${1:-}"
              (( $# == 0 )) || shift
            else
              rvm_action="error"
              rvm_error_message="-j *must* be followed by an integer (normally the # of CPU's in your machine)."
            fi
            ;;

          --with-rubies)
            rvm_ruby_strings="$next_token"
            next_token="${1:-}"
            (( $# == 0 )) || shift
            ;;

          -C|--configure)
            if
              [[ -n "$next_token" ]]
            then
              __rvm_custom_separated_array rvm_configure_flags , "${next_token}"
              next_token="${1:-}"
              (( $# == 0 )) || shift
              rvm_disable_binary_flag=1
            else
              rvm_action="error"
              rvm_error_message="--configure *must* be followed by configure flags."
            fi
            ;;

          -E|--env)
            if
              [[ -n "$next_token" ]]
            then
              __rvm_custom_separated_array rvm_configure_env , "${next_token}"
              next_token="${1:-}"
              (( $# == 0 )) || shift
              rvm_disable_binary_flag=1
            else
              rvm_action="error"
              rvm_error_message="--configure *must* be followed by configure flags."
            fi
            ;;

          --movable)
            rvm_movable_flag=1
            rvm_disable_binary_flag=1
            ;;

          --with-*|--without-*|--enable-*|--disable-*)
            rvm_configure_flags+=( "$rvm_token" )
            rvm_disable_binary_flag=1
            ;;

          --trace)
            export rvm_trace_flag=1
            # duplication marker jkdfkdfngjdjkfngjkdfngjkd
            if   [[ -n "${BASH_VERSION:-}" ]]
            then export PS4="+ \$(__rvm_date \"+%s.%N\" 2>/dev/null) \${BASH_SOURCE##\${rvm_path:-}} : \${FUNCNAME[0]:+\${FUNCNAME[0]}()}  \${LINENO} > "
            elif [[ -n "${ZSH_VERSION:-}" ]]
            then export PS4="+ %* %F{red}%x:%I %F{green}%N:%i%F{white} %_"
            fi
            set -o xtrace
            ;;

          --)
            if [[ "${rvm_action}" == *install ]]
            then rvm_configure_flags+=( "$next_token" "$@" )
            else rvm_ruby_args=( "$next_token" "$@" )
            fi
            rvm_disable_binary_flag=1
            rvm_parse_break=1
            ;;

          *)
            rvm_action="error"
            rvm_error_message="Unrecognized command line flag: '$rvm_token'"
        esac

        ;;

      *)
        if
          [[ -d  "$rvm_token" ]] ||
          __rvm_project_dir_check "$rvm_token"
        then
          __rvm_rvmrc_tools try_to_read_ruby "$rvm_token" ||
          __rvm_parse_args_error_finding_project_file
        else
          rvm_action="error"
          rvm_error_message="Unrecognized command line argument(s): '$rvm_token $@'"
        fi
        ;;
    esac

    if [[ -z "${rvm_action:-""}" && -n "${rvm_ruby_string:-""}" ]]
    then rvm_action="use"
    fi

    if [[ "error" == "${rvm_action:-""}" || ${rvm_parse_break:-0} -eq 1 || -n "${rvm_error_message:-""}" ]]
    then break
    fi
  done

  : rvm_ruby_args:${#rvm_ruby_args[@]}:${rvm_ruby_args[*]}:
  if
    [[ -n "${rvm_error_message:-""}" ]]
  then
    if
      [[ "${rvm_action}" == "deprecated" ]]
    then
      rvm_error "$rvm_error_message"
    else
      rvm_error "$rvm_error_message"
      rvm_out "Run \`rvm help\` to see usage information"
    fi
    unset rvm_error_message
    return 1
  fi
}

rvm()
{
  \typeset result current_result
  rvm_ruby_args=()

  __rvm_teardown_if_broken
  __rvm_cli_posix_check        || return $?
  __rvm_cli_load_rvmrc         || return $?
  __rvm_cli_version_check "$@" || return $?
  __rvm_initialize
  __rvm_path_match_gem_home_check
  __rvm_setup
  __rvm_cli_autoupdate    "$@" || return $?

  next_token="$1"
  (( $# == 0 )) || shift
  __rvm_parse_args "$@"
  result=$?
  : rvm_ruby_args:${#rvm_ruby_args[@]}:${rvm_ruby_args[*]}:

  (( ${rvm_trace_flag:-0} == 0 )) || set -o xtrace

  (( result )) ||
  case "${rvm_action:=help}" in
    use)
      if rvm_is_a_shell_function
      then __rvm_use && __rvm_use_ruby_warnings
      fi
      ;;
    switch)
      if rvm_is_a_shell_function
      then __rvm_switch "${rvm_ruby_args[@]}"
      fi
      ;;
    inspect|strings|version|remote_version)
      __rvm_${rvm_action}
      ;;
    ls|list)
      "$rvm_scripts_path/list" "${rvm_ruby_args[@]}"
      ;;
    # TODO: Make debug run in the current environment, issues with not exported vars.
    debug)
      rvm_is_not_a_shell_function="${rvm_is_not_a_shell_function}" "$rvm_scripts_path/info" '' debug
      ;;
    info)
      rvm_is_not_a_shell_function="${rvm_is_not_a_shell_function}" "$rvm_scripts_path/${rvm_action}" "${rvm_ruby_args[@]}"
      ;;
    reset)
      source "$rvm_scripts_path/functions/${rvm_action}"
      __rvm_${rvm_action}
      ;;
    update)
      printf "%b" "ERROR: rvm update has been removed. Try 'rvm get head' or see the 'rvm get' and rvm 'rubygems' CLI API instead\n"
      ;;
    implode|seppuku)
      source "$rvm_scripts_path/functions/implode"
      __rvm_implode
      ;;

    get)
      next_token="${1:-}"
      (( $# == 0 )) || shift
      [[ "$next_token" == "${rvm_action}" ]] && shift

      __rvm_cli_rvm_get "${rvm_ruby_args[@]}"
      ;;

    current)
      __rvm_env_string
      ;;

    help|rtfm|env|list|monitor|notes|pkg|requirements)
      next_token="${1:-}"
      (( $# == 0 )) || shift
      if (( $# )) && [[ "$next_token" == "${rvm_action}" ]] #TODO why is this check here ???
      then shift
      fi
      "$rvm_scripts_path/${rvm_action}" "${rvm_ruby_args[@]}"
      ;;

    cleanup|tools|snapshot|disk-usage|repair|alias|docs|rubygems|migrate|cron|group|wrapper)
      "$rvm_scripts_path/${rvm_action}" "${rvm_ruby_args[@]}"
      ;;

    upgrade)
      #                  file          action        params
      __rvm_fix_selected_ruby \
      __rvm_run_wrapper "$rvm_action" "$rvm_action" "${rvm_ruby_args[@]}"
      ;;

    autolibs|osx-ssl-certs|fix-permissions)
      #                  file          action        params
      __rvm_run_wrapper "$rvm_action" "$rvm_action" "${rvm_ruby_args[@]}"
      ;;

    do)
      old_rvm_ruby_string=${rvm_ruby_string:-}
      unset rvm_ruby_string
      export rvm_ruby_strings rvm_in_flag

      result=0
      # run in a subprocess only when a function, when called via PATH just replace the process
      if rvm_is_a_shell_function no_warning
      then      "$rvm_scripts_path/set" "$rvm_action" "${rvm_ruby_args[@]}" || result=$?
      else exec "$rvm_scripts_path/set" "$rvm_action" "${rvm_ruby_args[@]}" || result=$?
      fi

      # Restore the state pre-sets.
      [[ -n "$old_rvm_ruby_string" ]] && rvm_ruby_string=$old_rvm_ruby_string

      unset old_rvm_ruby_string
      ;;

    rvmrc)
      __rvm_rvmrc_tools "${rvm_ruby_args[@]}"
      ;;

    config-get)
      \typeset __ruby __var
      __ruby=$( __rvm_which ruby )
      for __var in "${rvm_ruby_args[@]}"
      do
        __rvm_ruby_config_get "${__var}" "${__ruby}"
      done
      ;;

    gemset_use)
      if rvm_is_a_shell_function
      then __rvm_gemset_use
      fi
      ;;

    gemset)
      export rvm_ruby_strings
      "$rvm_scripts_path/gemsets" "${rvm_ruby_args[@]}"
      result=$?
      rvm_ruby_strings=""
      if
        rvm_is_a_shell_function no_warning
      then
        # Clear the gemset.
        if
          [[ ${rvm_delete_flag:-0} -eq 1 ]]
        then
          if
            [[ "${GEM_HOME:-""}" == "${GEM_HOME%%${rvm_gemset_separator:-@}*}${rvm_gemset_separator:-@}${rvm_gemset_name}" ]]
          then
            rvm_delete_flag=0
            __rvm_use "@default"
          fi
          unset gem_prefix
        elif
          [[ "${rvm_ruby_args[*]}" == rename* ]] || [[ "${rvm_ruby_args[*]}" == move* ]]
        then
          \typeset _command _from _to
          read _command _from _to <<<"${rvm_ruby_args[*]}"
          if
            [[ "${GEM_HOME:-""}" == "${GEM_HOME%%${rvm_gemset_separator:-@}*}${rvm_gemset_separator:-@}${_from}" ]]
          then
            __rvm_use "@${_to}"
          fi
        fi
      fi
      ;;

    reload)
      rvm_reload_flag=1
      ;;

    tests|specs)
      rvm_action="rake"
      __rvm_do
      ;;

    delete|remove)
      export rvm_path
      if [[ -n "${rvm_ruby_strings}" ]]
      then __rvm_run_wrapper manage "$rvm_action" "${rvm_ruby_strings//*-- }"
      else __rvm_run_wrapper manage "$rvm_action"
      fi
      __rvm_use default
      ;;
    fetch|uninstall|reinstall)
      export rvm_path
      if [[ -n "${rvm_ruby_strings}" ]]
      then __rvm_run_wrapper manage "$rvm_action" "${rvm_ruby_strings//*-- }"
      else __rvm_run_wrapper manage "$rvm_action"
      fi
      ;;
    try_install|install)
      export rvm_path
      __rvm_cli_install_ruby "${rvm_ruby_strings}"
      ;;

    automount)
      if [[ -n "$rvm_ruby_string" ]]
      then rvm_ruby_args=( "$rvm_ruby_string" "${rvm_ruby_args[@]}" )
      fi
      "${rvm_scripts_path}/mount" "$rvm_action" "${rvm_ruby_args[@]}"
      ;;

    mount|prepare)
      if [[ -n "$rvm_ruby_string" ]]
      then rvm_ruby_args=( "$rvm_ruby_string" "${rvm_ruby_args[@]}" )
      fi
      "${rvm_scripts_path}/$rvm_action" "$rvm_action" "${rvm_ruby_args[@]}"
      ;;

    export)
      __rvm_export "$rvm_export_args"
      ;;

    unexport)
      __rvm_unset_exports
      ;;

    error)
      false
      ;;

    which)
      __rvm_which "${rvm_ruby_args[@]}"
      ;;

    *)
      rvm_error "unknown action '$rvm_action'"
      false # result
      ;;
  esac
  current_result=$? # Use the result of first found error
  (( result )) || result=${current_result}

  (( result )) ||
  case "$rvm_action" in
    reinstall|try_install|install)
      if
        [[ -n "${rvm_ruby_string}" ]]
        rvm_is_a_shell_function no_warning
      then
        if [[ -e "${rvm_environments_path}/default" ]]
        then rvm_verbose_flag=0 __rvm_use
        else rvm_verbose_flag=0 rvm_default_flag=1 __rvm_use
        fi
      fi
    ;;
  esac
  current_result=$? # Use the result of first found error
  (( result )) || result=${current_result}

  \typeset __local_rvm_trace_flag
  __local_rvm_trace_flag=${rvm_trace_flag:-0}

  __rvm_cli_autoreload

  if (( __local_rvm_trace_flag > 0 ))
  then
    set +o verbose
    set +o xtrace
    [[ -n "${ZSH_VERSION:-""}" ]] || set +o errtrace
  fi

  return ${result:-0}
}
src/rvm/scripts/cd000077500000005733147511530550010162 0ustar00#!/usr/bin/env bash

# Source a .rvmrc file in a directory after changing to it, if it exists.  To
# disable this feature, set rvm_project_rvmrc=0 in /etc/rvmrc or $HOME/.rvmrc
case "${rvm_project_rvmrc:-1}" in
1|cd)
  # cloned from git@github.com:mpapis/bash_zsh_support.git
  source "$rvm_scripts_path/extras/bash_zsh_support/chpwd/function.sh"

  # not using default loading to support older Zsh
  [[ -n "${ZSH_VERSION:-}" ]] &&
  __rvm_version_compare "$ZSH_VERSION" -gt  4.3.4 ||
  {
    function cd()    { __zsh_like_cd cd    "$@" ; }
    function popd()  { __zsh_like_cd popd  "$@" ; }
    function pushd() { __zsh_like_cd pushd "$@" ; }
  }

  __rvm_after_cd()
  {
    \typeset rvm_hook
    rvm_hook="after_cd"
    if [[ -n "${rvm_scripts_path:-}" || -n "${rvm_path:-}" ]]
    then source "${rvm_scripts_path:-$rvm_path/scripts}/hook"
    fi
  }
  __rvm_cd_functions_set()
  {
    __rvm_do_with_env_before
    if [[ -n "${rvm_current_rvmrc:-""}" && "$OLDPWD" == "$PWD" ]]
    then rvm_current_rvmrc=""
    fi
    __rvm_project_rvmrc >&2 || true
    __rvm_after_cd || true
    __rvm_do_with_env_after
    return 0
  }
  [[ " ${chpwd_functions[*]} " == *" __rvm_cd_functions_set "* ]] ||
  chpwd_functions=( "${chpwd_functions[@]}" __rvm_cd_functions_set )

  # This functionality is opt-in by setting rvm_cd_complete_flag=1 in ~/.rvmrc
  # Generic bash cd completion seems to work great for most, so this is only
  # for those that have some issues with that.
  if (( ${rvm_cd_complete_flag:-0} == 1 ))
  then
    # If $CDPATH is set, bash should tab-complete based on directories in those paths,
    # but with the cd function above, the built-in tab-complete ignores $CDPATH. This
    # function returns that functionality.
    _rvm_cd_complete ()
    {
      \typeset directory current matches item index sep
      sep="${IFS}"
      export IFS
      IFS=$'\n'
      COMPREPLY=()
      current="${COMP_WORDS[COMP_CWORD]}"
      if [[ -n "$CDPATH" && ${current:0:1} != "/" ]] ; then
        index=0
        # The change to IFS above means that the \command \tr below should replace ':'
        # with a newline rather than a space. A space would be ignored, breaking
        # TAB completion based on CDPATH again
        for directory in $(printf "%b" "$CDPATH" | \command \tr -s ':' '\n') ; do
          for item in $( compgen -d "$directory/$current" ) ; do
            COMPREPLY[index++]=${item#$directory/}
          done
        done
      else
        COMPREPLY=( $(compgen -d ${current}) )
      fi
      IFS="${sep}";
    }
    complete -o bashdefault -o default -o filenames -o dirnames -o nospace -F _rvm_cd_complete cd
  fi
  ;;
2|prompt)
  if
    [[ -n "${ZSH_VERSION:-}" ]]
  then
    precmd_functions+=(__rvm_do_with_env_before __rvm_project_rvmrc __rvm_do_with_env_after)
  else
    PROMPT_COMMAND="${PROMPT_COMMAND%% }"
    PROMPT_COMMAND="${PROMPT_COMMAND%%;}"
    PROMPT_COMMAND="${PROMPT_COMMAND:-}${PROMPT_COMMAND:+; }__rvm_do_with_env_before; __rvm_project_rvmrc; __rvm_do_with_env_after"
  fi
  ;;
esac
src/rvm/scripts/rvm000077500000017320147511530550010373 0ustar00#!/usr/bin/env bash

# rvm : Ruby enVironment Manager
# https://rvm.io
# https://github.com/rvm/rvm

# partial duplication marker dkjnkjvnckbjncvbkjnvkj
# prevent from loading in sh shells
if
  builtin test -n "${BASH_VERSION:-}" -o -n "${ZSH_VERSION:-}" -o -n "${KSH_VERSION:-}"
then
  case "`uname`" in
    (CYGWIN*|MINGW*)
      __shell_name="`\command \ps -p $$ | \command \awk 'END {print $NF}'` 2>/dev/null" ;;

    (SunOS)
      __shell_name="`\command \ps -p $$ -o comm=`" ;;

    (Linux)
      case "$(command uname -o)" in
        (Android)
          __shell_name="gawk 'BEGIN{RS=\"\"}; NR==1{print; exit}' /proc/$$/cmdline | tr - '\0'" ;;

        (*)
          __shell_name="`\command \ps -p $$ -o ucomm=`" ;;
      esac ;;

    (*)
      __shell_name="`\command \ps -p $$ -o ucomm=`" ;;
  esac

  case "$__shell_name" in
    (""|dash|sh|ksh|*/dash|*/sh|*/ksh) return 0 ;; # silently stop in sh shells
  esac

  unset __shell_name
else
  return 0
fi

# also duplicated in scripts/base
__rvm_has_opt()
{
  if # pre-gnu
   [[ -n "${ZSH_VERSION:-}"  ]]
  then
    setopt | GREP_OPTIONS="" \command \grep "^${1:-}$" >/dev/null 2>&1 || return $?
  elif # mksh
    [[ -n "${KSH_VERSION:-}"  ]]
  then
    set +o | GREP_OPTIONS="" \command \grep "-o ${1:-}$" >/dev/null 2>&1 || return $?
  elif # bash
    [[ -n "${BASH_VERSION:-}" ]]
  then
    [[ ":${SHELLOPTS:-}:" == *":${1:-}:"* ]] || return $?
  else # what is this?!
    return 1
  fi
}

# Do not allow sourcing RVM in `sh` - it's not supported
# return 0 to exit from sourcing this script without breaking sh
if __rvm_has_opt "posix"
then return 0
fi

# TODO: Alter the variable names to make sense
\export HOME rvm_prefix rvm_user_install_flag rvm_path
HOME="${HOME%%+(\/)}" # Remove trailing slashes if they exist on HOME

[[ -n "${rvm_stored_umask:-}" ]] || export rvm_stored_umask=$(umask)
if (( ${rvm_ignore_rvmrc:=0} == 0 ))
then
  rvm_rvmrc_files=("/etc/rvmrc" "$HOME/.rvmrc")
  if [[ -n "${rvm_prefix:-}" ]] && ! [[ "$HOME/.rvmrc" -ef "${rvm_prefix}/.rvmrc" ]]
  then rvm_rvmrc_files+=( "${rvm_prefix}/.rvmrc" )
  fi

  for rvmrc in "${rvm_rvmrc_files[@]}"
  do
    if [[ -f "$rvmrc" ]]
    then
      # pre-gnu
      if GREP_OPTIONS="" \command \grep '^\s*rvm .*$' "$rvmrc" >/dev/null 2>&1
      then
        printf "%b" "
Error:
        $rvmrc is for rvm settings only.
        rvm CLI may NOT be called from within $rvmrc.
        Skipping the loading of $rvmrc"
        return 1
      else
        source "$rvmrc"
      fi
    fi
  done
  unset rvm_rvmrc_files
fi

# duplication marker jdgkjnfnkjdngjkfnd4fd
# detect rvm_path if not set
if
  [[ -z "${rvm_path:-}" ]]
then
  if
    [[ -n "${BASH_SOURCE:-$_}" && -f "${BASH_SOURCE:-$_}" ]]
  then
    rvm_path="${BASH_SOURCE:-$_}"
    rvm_path="$( \command \cd "${rvm_path%/scripts/rvm}">/dev/null; pwd )"
    rvm_prefix=$( dirname $rvm_path )
  elif
    [[ "${UID:-}" == "0" || "${USER:-}" == "root" ]]
  then
    if
      (( ${rvm_user_install_flag:-0} == 0 ))
    then
      rvm_prefix="/usr/local"
      rvm_path="${rvm_prefix}/rvm"
    else
      rvm_prefix="$HOME"
      rvm_path="${rvm_prefix}/.rvm"
    fi
  else
    if
      [[ -d "$HOME/.rvm" && -s "$HOME/.rvm/scripts/rvm" ]]
    then
      rvm_prefix="$HOME"
      rvm_path="${rvm_prefix}/.rvm"
    else
      rvm_prefix="/usr/local"
      rvm_path="${rvm_prefix}/rvm"
    fi
  fi
else
  # remove trailing slashes, btw. %%/ <- does not work as expected
  rvm_path="${rvm_path%%+(\/)}"
fi

# guess rvm_prefix if not set
if [[ -z "${rvm_prefix}" ]]
then
  rvm_prefix=$( dirname $rvm_path )
fi

# duplication marker kkdfkgnjfndgjkndfjkgnkfjdgn
[[ -n "${rvm_user_install_flag:-}" ]] ||
case "$rvm_path" in
  (/usr/local/rvm)         rvm_user_install_flag=0 ;;
  ($HOME/*|/${USER// /_}*) rvm_user_install_flag=1 ;;
  (*)                      rvm_user_install_flag=0 ;;
esac

export rvm_loaded_flag
if [[ -n "${BASH_VERSION:-}" || -n "${ZSH_VERSION:-}" ]] &&
  \typeset -f rvm >/dev/null 2>&1
then
  rvm_loaded_flag=1
else
  rvm_loaded_flag=0
fi

if
  (( ${rvm_loaded_flag:=0} == 0 )) || (( ${rvm_reload_flag:=0} == 1 ))
then
  if
    [[ -n "${rvm_path}" && -d "$rvm_path" ]]
  then
    true ${rvm_scripts_path:="$rvm_path/scripts"}

    if
      [[ ! -f "$rvm_scripts_path/base" ]]
    then
      printf "%b" "WARNING:
      Could not source '$rvm_scripts_path/base' as file does not exist.
      RVM will likely not work as expected.\n"
    elif
      ! source "$rvm_scripts_path/base"
    then
      printf "%b" "WARNING:
      Errors sourcing '$rvm_scripts_path/base'.
      RVM will likely not work as expected.\n"
    else
      __rvm_ensure_is_a_function
      __rvm_setup

      export rvm_version
      rvm_version="$(__rvm_version_installed)"

      alias rvm-restart="rvm_reload_flag=1 source '${rvm_scripts_path:-${rvm_path}/scripts}/rvm'"

      # Try to load RVM ruby if none loaded yet
      __path_to_ruby="$( builtin command -v ruby 2>/dev/null || true )"
      if
        [[ -z "${__path_to_ruby}" ]] ||
        [[ "${__path_to_ruby}" != "${rvm_path}"* ]] ||
        [[ "${__path_to_ruby}" == "${rvm_path}/bin/ruby" ]]
      then
        if
          [[ -n "${rvm_environments_path:-}" &&
            -s "${rvm_environments_path}/default"
          ]]
        then
          source "${rvm_environments_path}/default"
        elif
          [[ "${rvm_environments_path:-}" != "${rvm_path}/environments" &&
            -s "${rvm_path}/environments/default"
          ]]
        then
          source "${rvm_path}/environments/default"
        fi
        if
          [[ ${rvm_project_rvmrc:-1} -gt 0 ]] &&
          ! __function_on_stack __rvm_project_rvmrc
        then
          # Reload the rvmrc, use promptless ensuring shell processes does not
          # prompt if .rvmrc trust value is not stored, revert to default on fail
          if
            rvm_current_rvmrc=""
            rvm_project_rvmrc_default=2 rvm_promptless=1 __rvm_project_rvmrc
          then
            rvm_hook=after_cd
            source "${rvm_scripts_path:-${rvm_path}/scripts}/hook"
          fi
        fi
      elif
        [[ "${__path_to_ruby}" == "${rvm_path}"* ]] &&
        [[ -z "${GEM_HOME:-}" || -z "${GEM_PATH:-}" ]]
      then
        echo "
Warning: PATH set to RVM ruby but GEM_HOME and/or GEM_PATH not set, see:
    https://github.com/rvm/rvm/issues/3212
" >&2
        if
          [[ -n "${SUDO_USER:-}" ]]
        then
          echo "Hint: To fix PATH errors try using 'rvmsudo' instead of 'sudo', see:
    https://stackoverflow.com/questions/27784961/received-warning-message-path-set-to-rvm-after-updating-ruby-version-using-rvm/28080063#28080063
" >&2
        fi
      fi
      unset __path_to_ruby

      # Makes sure rvm_bin_path is in PATH atleast once.
      [[ ":${PATH}:" == *":${rvm_bin_path}:"* ]] || PATH="$PATH:${rvm_bin_path}"

      if
        (( ${rvm_reload_flag:=0} == 1 ))
      then
        [[ "${rvm_auto_reload_flag:-0}" == 2 ]] || rvm_notify "RVM reloaded!"
        unset __rvm_project_rvmrc_lock
      fi

      rvm_loaded_flag=1
      __rvm_teardown

      # Opt-in for custom prompt through by setting:
      #     rvm_ps1=1
      # in either /etc/rvmrc or $HOME/.rvmrc
      if
        [[ ${rvm_ps1:-0} -eq 1 ]]
      then
        # Source RVM ps1 functions for a great prompt.
        if
          [[ -s "$rvm_path/contrib/ps1_functions" ]]
        then
          source "$rvm_path/contrib/ps1_functions"
        elif
          [[ -s "/usr/local/rvm/contrib/ps1_functions" ]]
        then
          source "/usr/local/rvm/contrib/ps1_functions"
        fi

        if command -v ps1_set >/dev/null 2>&1
        then ps1_set
        fi
      fi

    fi
  else
    printf "%b" "\n\$rvm_path ($rvm_path) does not exist."
  fi
  unset rvm_prefix_needs_trailing_slash rvm_gems_cache_path rvm_gems_path rvm_project_rvmrc_default rvm_gemset_separator rvm_reload_flag
fi
src/rvm/scripts/override_gem000077500000001067147511530550012237 0ustar00#!/usr/bin/env bash

if [[ ${rvm_leave_gem_alone:-0} -eq 0 ]]
then
  function gem
  {
    \typeset result
    (
      \typeset rvmrc
      rvm_rvmrc_files=("/etc/rvmrc" "$HOME/.rvmrc")
      if [[ -n "${rvm_prefix:-}" ]] && ! [[ "$HOME/.rvmrc" -ef "${rvm_prefix}/.rvmrc" ]]
         then rvm_rvmrc_files+=( "${rvm_prefix}/.rvmrc" )
      fi

      for rvmrc in "${rvm_rvmrc_files[@]}"
      do [[ -s "${rvmrc}" ]] && source "${rvmrc}" || true
      done
      unset rvm_rvmrc_files
      command gem "$@"
    ) || result=$?
    hash -r
    return ${result:-0}
  }
fi
src/rvm/scripts/cron000077500000002574147511530550010535 0ustar00#!/usr/bin/env bash

source "$rvm_scripts_path/base"

# Add rvm variables on the beginning of crontab
__rvm_cron_setup()
{
  {
    echo "#sm start rvm"
    __rvm_env_print --cron
    echo "#sm end rvm"
    __sm.cron.show | __sm.filter.remove.group "^#sm start rvm$" "^#sm end rvm$"
  } | crontab -
}

__rvm_cron_remove()
{
  __sm.cron.show | __sm.filter.remove.group "^#sm start rvm$" "^#sm end rvm$" | crontab -
}

__rvm_cron_command()
{
  \typeset v schedule
  schedule="$1"
  shift || {
    rvm_error "Schedule not given, example: rvm cron command \"@daily\" rake calculate:stats"
    rvm_info  "Refer to \`man 5 crontab\` for format of the scheduling definition."
    exit 1
  }
  [[ -n "$1" ]] || {
    rvm_error "Command not given, example: rvm cron command \"@daily\" rake calculate:stats"
    exit 2
  }
  {
    __sm.cron.show
    printf "%b" "${schedule} $(__rvm_which rvm) in \"$PWD\" do"
    for v in "$@"
    do printf "%b" " \"$v\""
    done
    printf "\n"
  } | crontab -
}

__sm.cron.show()
{
  EDITOR="\command \cat" crontab -e 2>/dev/null
}

__sm.filter.remove.group()
{
  __rvm_awk 'BEGIN{in_group=0} /'"$1"'/ {in_group=1} in_group==0 {print} /'"$2"'/ {in_group=0}'
}

action="${1:-}"
shift

case "$action" in
  setup|remove|command)
    __rvm_cron_$action "$@"
    ;;
  help)
    rvm_help cron
    ;;
  *)
    rvm_error_help "Unknown subcommand '$action'" cron
    exit 1
    ;;
esac
src/rvm/scripts/prepare000077500000005467147511530550011236 0ustar00#!/usr/bin/env bash

source "$rvm_scripts_path/base"

external_prepare()
{
  \typeset remote_shell
  rvm_ruby_string="${1:-}"
  remote_shell="${2:-}"
  shift || [[ -n "${rvm_ruby_string}" ]] || {
    rvm_error_help "Missing ruby name to export for prepare." external prepare
    return 3
  }
  __rvm_ruby_string
  __rvm_remote_extension "${rvm_ruby_string}"

  external_prepare_package "${rvm_ruby_string}.${rvm_remote_extension}" &&
  external_prepare_upload "${rvm_ruby_string}.${rvm_remote_extension}" "${remote_shell}"
}

external_prepare_package()
{
  \typeset file_name
  file_name="$1"

  [[ -d "${rvm_rubies_path}/${rvm_ruby_string}" ]] ||
  {
    rvm_error "Ruby ${rvm_ruby_string} does not exist, maybe install first?."
    return 2
  }

  rvm_log "Preparing ${rvm_ruby_string} ..."
  if
    __rvm_package_create "${file_name}" "${rvm_rubies_path}" "${rvm_ruby_string}"
  then
    rvm_log "Prepared ${file_name}."
  else
    case $? in
      199)
        rvm_error "Unrecognized archive format for ${file_name}"
        return 199
        ;;
      *)
        rvm_error "Error packaging ${file_name}."
        return 1
        ;;
    esac
  fi
}

#TODO: move to SMF ! RVM2 ?
external_prepare_upload()
{
  \typeset remote_path remote_shell remote_directory system_path __remote_file file_name local_file path_prefix

  file_name="$1"
  remote_path="${2:-rvm@ssh.rvm.io:~/site/shared/public/binaries}"
  system_path="$(__rvm_system_path - 99 )"
  remote_directory="${remote_path#*:}/${system_path}"
  remote_shell="${remote_path%:*}"
  if
    [[ ${rvm_path_flag:-0} -eq 1 ]]
  then
    path_prefix="${remote_path#*:}"
    path_prefix="${path_prefix##*/}"
    mkdir -p "${path_prefix}/${system_path}"
    local_file="${path_prefix}/${system_path}/${file_name}"
    \command \mv "${file_name}" "${local_file}"
  else
    local_file="${file_name}"
  fi
  __rvm_calculate_remote_file  0 1 1 "${file_name}"

  rvm_log "--- upload:"
  printf "%b" "ssh \"$remote_shell\" \"mkdir -p $remote_directory/\"\n"
  if
    [[ ${rvm_path_flag:-0} -eq 1 ]]
  then
    printf "%b" "rsync -av --rsh=ssh \"${path_prefix}/\" \"${remote_path}/\"\n"
  else
    printf "%b" "scp \"${local_file}\" \"$remote_shell:$remote_directory/${file_name}\"\n"
  fi
  rvm_log "--- rvm/config/remote:"
  printf "%b" "${__remote_file}\n"
  rvm_log "--- rvm/config/md5:"
  printf "%b" "${__remote_file}=$( __rvm_md5_calculate      "${local_file}" )\n"
  rvm_log "--- rvm/config/sha512:"
  printf "%b" "${__remote_file}=$( __rvm_sha__calculate 512 "${local_file}" )\n"
}

action="${1:-}"
shift || {
  rvm_error_help "Missing action for prepare." prepare
  exit 1
}

# skip first param if empty
[[ -n "${1:-}" ]] || (( $#==0 )) || shift

case "${action}" in
  (prepare)
    external_prepare "$@"
    ;;
  (*)
    rvm_error_help "Wrong action for prepare '$action'." prepare $action
    exit 2
    ;;
esac
src/rvm/scripts/hook000077500000002643147511530550010531 0ustar00#!/usr/bin/env bash

# need additional step to not redefine variables value if already set
\typeset old_rvm_verbose_flag old_rvm_debug_flag >/dev/null 2>/dev/null
old_rvm_verbose_flag=${rvm_verbose_flag:-0}
old_rvm_debug_flag=${rvm_debug_flag:-0}

# silence Zsh redefinitions
\typeset rvm_verbose_flag rvm_debug_flag hooks >/dev/null 2>/dev/null

true rvm_verbose_flag:${rvm_verbose_flag:=${old_rvm_verbose_flag}} \
  rvm_hooks_path:${rvm_hooks_path:="$rvm_path/hooks"} \
  rvm_debug_flag:${rvm_debug_flag:=${old_rvm_debug_flag}} rvm_hook:${rvm_hook:=}

if
  [[ -n "$rvm_hook" ]]
then
  hooks=()
  if
    [[ -d "$rvm_hooks_path" ]]
  then
    hooks+=( "$rvm_hooks_path" )
  fi
  if
    [[ "$PWD/.rvm/hooks" != "$rvm_hooks_path" && -d "$PWD/.rvm/hooks" ]]
  then
    hooks+=( "$PWD/.rvm/hooks" )
  fi

  if
    [[ -n "${hooks[*]}" ]]
  then
    __rvm_read_lines _hooks_list <(
      __rvm_find -L "${hooks[@]}" -iname "$rvm_hook*" -type f 2>/dev/null || true
    )
    for hook in "${_hooks_list[@]}"
    do
      if
        [[ -x "${hook}" || "${hook##*/}" == "$rvm_hook" ]]
      then
        if
          [[ "${hook}" == "$rvm_hooks_path/"* ]] ||   # trust internal hooks
          __rvm_check_rvmrc_trustworthiness "${hook}" # ask user to trust other files
        then
          rvm_debug "Running $hook"
          __rvm_conditionally_do_with_env . "${hook}" >&2
        fi
      fi
    done
  fi
fi

unset rvm_hook hooks _hooks_list hook
src/rvm/scripts/fix-permissions000077500000003611147511530550012724 0ustar00#!/usr/bin/env bash

__rvm_if_sudo()
{
  \typeset -a __command
  __command=()
  (( UID == 0 )) || __command+=( \command \sudo -p "%p password required for '$*': " )
  __command+=( $@ )
  "${__command[@]}" || return $?
}

__rvm_fix_permissions_fix_rights()
{
  case "${__user}" in
    (*:*)
      rvm_log "Fixing rights with 'g+w' - this might take a few long minutes..."
      __rvm_if_sudo chmod -R g+w "${rvm_path}" || return $?
      ;;
  esac
}

__rvm_fix_permissions_fix_directories()
{
  \typeset -a __broken_dirs
  \typeset __broken_dir

  while
    __rvm_read_lines __broken_dirs <(
      find "${rvm_path}" -type d -not -perm -111 2>/dev/null || true
    ) &&
    (( ${#__broken_dirs[@]} ))
  do
    for __broken_dir in "${__broken_dirs[@]}"
    do chmod +x "${__broken_dir}" || return $?
    done
  done
}

__rvm_fix_permissions_fix_message()
{
  \typeset __type
  case "${__user}" in
    (:*)  __type="group"      ;;
    (*:*) __type="user/group" ;;
    (*)   __type="user"       ;;
  esac
  rvm_log "Fixing ${__type} for ${__user} - this might take a few long minutes..."
}

__rvm_fix_permissions_fix()
{
  __rvm_fix_permissions_fix_message
  __rvm_if_sudo chown -R "${__user}" "${rvm_path}" &&
  __rvm_fix_permissions_fix_rights &&
  rvm_log "Finished fixing." ||
  {
    \typeset __result=$?
    rvm_error "Failed fixing, read the above messages."
    return ${__result}
  }
}

__rvm_fix_permissions_select()
{
  case "${__user}" in
    ("")
      if (( ${rvm_user_install_flag:=0} == 0 ))
      then __user="system"
      else __user="user"
      fi
      ;;
  esac
  case "${__user}" in
    (system)
      __user=":${rvm_group_name:-rvm}"
      ;;
    (user)
      __user="$USER"
      ;;
  esac
}

__rvm_fix_permissions()
{
  \typeset __user="${1:-}"
  __rvm_fix_permissions_select &&
  __rvm_fix_permissions_fix    &&
  __rvm_fix_permissions_fix_directories ||
  return $?
}

__rvm_fix_permissions "${args[@]}"
src/rvm/scripts/irbrc000077500000000626147511530550010671 0ustar00
# This loads some niceties for irb, courtesy of rvm.
# It also loads your custom ~/.irbrc if it exists.
# If you want to customize the irbrc for ONLY this version of
# ruby then edit this file. It will only be deleted if you do
# an "rvm install" over this ruby version.

if ENV["rvm_path"].nil?
  require File.join(ENV["HOME"], "irbrc")
else
  require File.join(ENV["rvm_path"], "scripts", "irbrc")
end

src/rvm/scripts/tools000077500000012611147511530550010725 0ustar00#!/usr/bin/env bash

source "$rvm_scripts_path/base"
source "$rvm_scripts_path/functions/tools"

usage()
{
  echo "Usage: rvm tools {identifier,path-identifier,strings,user}" 1>&2
  return 1
}

# Return the identifier that's current in use.
tools_identifier()
{
  __rvm_env_string
}

tools_path_identifier()
{
  if [[ -z "$1" || ! -d "$1" ]]; then
    echo "Usage: rvm tools path-identifier 'path-to-check'"
    return 1
  fi

  __rvm_cd "$1"
  __rvm_do_with_env_before
  rvm_promptless=1 __rvm_project_rvmrc >/dev/null 2>&1
  rvmrc_result="$?"
  __rvm_env_string
  __rvm_do_with_env_after
  return $rvmrc_result
}

tools_user_usage()
{
  \typeset msg

  for msg in "$@"
  do
    rvm_error "$msg"
  done

  rvm_error "Usage: rvm user [[gemsets] [rubies] [hooks] [pkgs] [wrappers] [all] [--skel]|none]"
}

tools_user_setup_path()
{
  tools_user_setup "$1" "rvm_$2_path" "\${HOME}/.rvm/$2"
}

tools_user_setup()
( # subprocess cause we change the HOME
  \typeset _target _var_name _user_value
  _target="$1"
  _var_name="$2"
  _user_value="$3"

  # detect _var_name in config
  if [[ -f "${_target}/.rvmrc" ]] && __rvm_grep "^export ${_var_name}=" "${_target}/.rvmrc" > /dev/null
  then
    # if defined read path
    _user_value="$( __rvm_grep "^export ${_var_name}=" "${_target}/.rvmrc" | __rvm_sed "s/^export ${_var_name}=//" )"
  else
    # if not defined - define it
    echo "export ${_var_name}=\"${_user_value}\"" >> "${_target}/.rvmrc"
  fi

  # set home to _target, so --skel works fine
  HOME="${_target}"
  # resolve the stored path
  eval "_user_value=\"${_user_value}\""

  # ensure the defined path exists
  [[ -d "${_user_value}" ]] || mkdir -p "${_user_value}"

  # create empty db files for rvm_user_value
  if [[ "$_var_name" == "rvm_user_path" ]]
  then
    \typeset _file
    for _file in db md5 rvmrcs sha512
    do
      [[ -f "${_user_value}/${_file}" ]] || touch "${_user_value}/${_file}"
    done
  fi
)

tools_user_none()
{
  __rvm_sed_i "$1" -E -e "/^(export )?rvm_[a-z_]+_path=/ d" -e "/^(export )?rvm_create_flag=/ d"
}

tools_user()
{
  \typeset item dir target
  \typeset -a selection
  selection=()

  for item in $@
  do
    case "$item" in
      all)     selection+=( gemsets rubies hooks pkgs wrappers userdb log ) ;;
      gemsets) selection+=( gemsets userdb log ) ;;
      --skel)  rvm_skel_flag=1 ;;
      rubies|hooks|pkgs|userdb|log|wrappers)  selection+=( "$item" ) ;;
      (none)
        tools_user_none "${HOME}/.rvmrc"
        return $?
        ;;
      *)
        tools_user_usage "Unrecognized option '$item'."
        return 1
        ;;
    esac
  done

  if (( ${#selection[@]} == 0 ))
  then
    tools_user_usage
    return 1
  fi

  if [[ ${rvm_skel_flag:-0} == 1 ]] && (( UID ))
  then
    tools_user_usage "The --skel flag should be run as root: rvmsudo rvm user $@."
    return 1
  fi

  [[ ${rvm_skel_flag:-0} == 1 ]] && target=/etc/skel || target="${HOME}"

  if [[ ! -w "${target}" ]] || [[ -d "${target}/.rvm" && ! -w "${target}/.rvm" ]]
  then
    tools_user_usage "Directory '${target}' or '${target}/.rvm' is not writable for current user."
    return 1
  fi

  if [[ -f "${target}/.rvmrc" && ! -w "${target}/.rvmrc" ]]
  then
    tools_user_usage "Configuration file '${target}/.rvmrc' is not writable for current user."
    return 1
  fi

  for item in "${selection[@]}"
  do
    case "$item" in
      rubies)
        for dir in archives bin environments gems gems_cache log repos rubies rubygems src tmp wrappers user
        do
          tools_user_setup_path "${target}" $dir
        done
        tools_user_setup "${target}" rvm_create_flag 1
        ;;
      gemsets)
        for dir in environments gems gems_cache wrappers
        do
          tools_user_setup_path "${target}" $dir
        done
        tools_user_setup "${target}" rvm_create_flag 1
        ;;
      wrappers|hooks|pkgs|log)
        tools_user_setup_path "${target}" "$item"
        ;;
      userdb)
        tools_user_setup_path "${target}" user
        ;;
    esac
  done
}

tools_mirror()
{
  \typeset file="$rvm_user_path/db"
  if
    [[ -f "$file" ]] &&
    __rvm_grep "^ruby_url=" "$file" >/dev/null
  then
    if
     (( ${rvm_force_flag:-0} == 1 ))
    then
      __rvm_sed_i "${file}" -e "s/^ruby_${n}_url=.*$/ruby_${n}_url=https:\/\/www.mirrorservice.org\/sites\/ftp.ruby-lang.org\/pub\/ruby\/${n}/"
    else
      rvm_warn "Some settings already exist, use 'rvm --force tools mirror' to overwrite."
    fi
  else
    printf "ruby_url=https://www.mirrorservice.org/sites/ftp.ruby-lang.org/pub/ruby\n" >> "$file"
  fi
}

tools_rvm_env()
{
  \typeset script
  rvm_log "# use shebang: #!/usr/bin/$1-rvm-env 1.9.3"
  for script in $@
  do
    if builtin command -v ${script} >/dev/null
    then
      __rvm_sudo ln -nfs $rvm_bin_path/rvm-shell /usr/bin/${script}-rvm-env &&
        rvm_log "Created link '/usr/bin/${script}-rvm-env'." ||
        rvm_error "Cannot create link '/usr/bin/${script}-rvm-env'."
    else
      rvm_error "There is no command/script '${script}' in system."
    fi
  done
}

args=($*)
action="${args[0]}"
args="$(echo ${args[@]:1})" # Strip trailing / leading / extra spacing.

[[ -z "$action" ]] && usage

case "$action" in
  identifier)      tools_identifier ;;
  path-identifier) tools_path_identifier "$args" ;;
  strings)         tools_strings "$args" ;;
  mirror)          tools_mirror ;;
  user)            __rvm_call_with_restored_umask tools_user "$args" ;;
  rvm-env)         tools_rvm_env $args ;;
  *)               usage ;;
esac
src/rvm/scripts/osx-ssl-certs000077500000010635147511530550012317 0ustar00#!/usr/bin/env bash

source "$rvm_scripts_path/functions/osx-ssl-certs"
source "$rvm_scripts_path/functions/osx-ssl-certs-curl"

__rvm_osx_ssl_certs_run_select_rubies()
{
  case "$2" in
    (all)
      __rvm_read_lines __rubies <(
        __rvm_cd "$rvm_rubies_path"
        __rvm_find . -maxdepth 1 -mindepth 1 -type d 2>/dev/null | cut -c 3-
      )
      __rubies+=(curl)
      ;;
    (*,*)
      __rvm_custom_separated_array __rubies , "$2"
      ;;
    ("")
      __rubies=( "${GEM_HOME##*/}" )
      ;;
    (*)
      __rubies=( "$2" )
      ;;
  esac

  rvm_log "Selected SSL certs for: $__rubies"
}

__rvm_osx_ssl_certs_run_filter_and_run()
{
  \typeset cert_file
  for __ruby in "${__rubies[@]}"
  do
    if
      [[ "${__ruby}" == "curl" ]]
    then
      rvm_debug "Getting SSL certs path for ${__ruby}"
      __path=$(__rvm_osx_ssl_certs_curl_cert_find_path)
      [[ -z $__path || " ${__paths[*]} " == *" ${__path} "* ]] || __paths+=( "${__path}" )
    elif
      [[ -f "${__ruby}" && -x "${__ruby}" ]]
    then
      rvm_debug "Getting SSL certs for ${__ruby}"
      __rvm_osx_ssl_certs_file_from_openssl "${__ruby}" || return $?
      __path="$cert_file"
      [[ " ${__paths[*]} " == *" ${__path} "* ]] || __paths+=( "${__path}" )
    elif
      [[ -f "${__ruby}" ]] &&
      __rvm_grep -- "-----BEGIN CERTIFICATE-----" "${__ruby}" 1>/dev/null 2>&1
    then
      rvm_debug "SSL certs file for ${__ruby}"
      [[ " ${__paths[*]} " == *" ${__ruby} "* ]] || __paths+=( "${__ruby}" )
    elif
      [[ -d "${__ruby}" ]]
    then
      rvm_debug "SSL certs path for ${__ruby}"
      [[ " ${__paths[*]} " == *" ${__ruby} "* ]] || __paths+=( "${__ruby}" )
    else
      rvm_debug "Getting ruby certs path for ${__ruby}"
      __path="$( __rvm_with "${__ruby}" "__rvm_osx_ssl_certs_file_for_ruby" )"
      [[ " ${__paths[*]} " == *" ${__path} "* ]] || __paths+=( "${__path}" )
    fi
  done

  for __path in "${__paths[@]}"
  do
    rvm_debug  "Updating SSL certs ${__path}"
    "$1" "${__path}"
  done
}

__rvm_osx_ssl_certs_run()
{
  \typeset __ruby __path
  \typeset -a __rubies __paths
  __rubies=()
  __paths=()

  __rvm_osx_ssl_certs_run_select_rubies  "$@"
  __rvm_osx_ssl_certs_run_filter_and_run "$@"
}

__rvm_osx_ssl_certs_status()
{
  __rvm_osx_ssl_certs_run __rvm_osx_ssl_certs_status_for_path "$1"
}

__rvm_osx_ssl_certs_update()
{
  __rvm_osx_ssl_certs_run __rvm_osx_ssl_certs_update_for_path "$1"
}

__rvm_osx_ssl_certs_cron_status()
{
  if __rvm_cron_find "$RVM_OSX_SSL_UPDATER"
  then rvm_log "Automatic certs updating installed."
  else rvm_warn "Automatic certs updating not installed."
  fi
}

__rvm_osx_ssl_certs_cron_install()
{
  if
    __rvm_cron_find "$RVM_OSX_SSL_UPDATER"
  then
    __rvm_cron_uninstall "$RVM_OSX_SSL_UPDATER" ||
    {
      \typeset result=$?
      rvm_error "Automatic certs updating failed uninstalling."
      return $result
    }
  fi
  if
    __rvm_cron_install "$RVM_OSX_SSL_UPDATER"
  then
    rvm_log "Automatic certs updating installed."
  else
    \typeset result=$?
    rvm_error "Automatic certs updating failed installing."
    return $result
  fi
}

__rvm_osx_ssl_certs_cron_uninstall()
{
  if
    __rvm_cron_find "$RVM_OSX_SSL_UPDATER"
  then
    if
      __rvm_cron_uninstall "$RVM_OSX_SSL_UPDATER"
    then
      rvm_log "Automatic certs updating uninstalled."
    else
      \typeset result=$?
      rvm_error "Automatic certs updating failed uninstalling."
      return $result
    fi
  else
    rvm_log "Automatic certs updating already uninstalled."
  fi
}

__rvm_osx_ssl_certs_cron()
{
  \typeset cron_action="${1:-status}"
  shift 1
  case "${cron_action}" in
    (status|install|uninstall)
      __rvm_osx_ssl_certs_cron_${cron_action}
      ;;
    (help)
      rvm_help osx-ssl-certs cron "$@"
      ;;
    (*)
      rvm_error_help "Unknown subcommand '$*' for osx-ssl-certs cron" osx-ssl-certs cron "$@"
      return 1
      ;;
  esac
}

__rvm_osx_ssl_certs()
{
  \typeset action="${1:-status}"
  shift 1
  case "${action}" in
    (status|update|cron)
      if
        [[ "${_system_name}" == "OSX" ]]
      then
        __rvm_osx_ssl_certs_${action} "$@"
      else
        rvm_error "'rvm osx-ssl-certs' is intended only for OSX systems, it is not required on ${_system_name}."
        return 1
      fi
      ;;
    (help)
      rvm_help osx-ssl-certs "$@"
      ;;
    (*)
      rvm_error_help "Unknown subcommand '$*' for osx-ssl-certs" osx-ssl-certs "$@"
      return 1
      ;;
  esac
}

__rvm_osx_ssl_certs "${args[@]}"
src/rvm/scripts/info000077500000012073147511530550010522 0ustar00#!/usr/bin/env bash

if
  [[ "$rvm_trace_flag" -eq 2 ]]
then
  set -x
  export rvm_trace_flag
fi

source "$rvm_scripts_path/base"
source "$rvm_scripts_path/functions/autolibs"
source "$rvm_scripts_path/functions/detect/system"
source "$rvm_scripts_path/functions/version"
source "$rvm_scripts_path/functions/version-installed-when"

version_for()
{
  \typeset binary
  binary=${1:-""}
  if
    builtin command -v "$binary" >/dev/null
  then
    $binary --version | \command \head -n1
  else
    echo "not installed"
  fi
}

info_system()
{
  source "$rvm_scripts_path/functions/detect/xcode"

  rvm_info="
  system:
    uname:        \"${_system_info}\"
    name:         \"${_system_name}\"
    version:      \"${_system_version}\"
    architecture: \"${_system_arch}\"
    bash:         \"$(command -v bash) => $(version_for bash)\"
    zsh:          \"$(command -v zsh) => $(version_for zsh)\"
    remote_path:  \"$(__rvm_system_path - 99 )\""

  [[ "$_system_name" == "OSX" ]] && rvm_info="${rvm_info}
    xcode:        \"$(__rvm_detect_xcode_version)\""

  rvm_info="${rvm_info}\n"
}

info_rvm()
{
  __rvm_autolibs_get
  __rvm_autolibs_translate_description

  rvm_info="
  rvm:
    version:      \"${rvm_version}\"
    updated:      \"$(__rvm_version_installed_when)\"
    path:         \"$rvm_path\"
    autolibs:     \"[${rvm_autolibs_flag}] ${rvm_autolibs_flag_description}\"
"
}

info_ruby()
{
  [[ "$(__rvm_env_string)" == "system" ]] && return
  ruby=$(builtin command -v ruby)
  if
    [[ $? -eq 0 ]] && [[ -x "$ruby" ]]
  then
    full_version="$($ruby -v)"
  fi
  rvm_info="
  ruby:
    interpreter:  \"$(printf "%b" "${full_version}" | __rvm_awk '{print $1}')\"
    version:      \"$(printf "%b" "${full_version}" | __rvm_awk '{print $2}')\"
    date:         \"$(printf "%b" "${full_version}" | __rvm_sed 's/^.*(\([0-9]\{4\}\(-[0-9][0-9]\)\{2\}\).*$/\1/')\"
    platform:     \"$(printf "%b" "${full_version}" | __rvm_sed 's/^.*\[//' | __rvm_sed 's/\].*$//')\"
    patchlevel:   \"$(printf "%b" "${full_version}" | __rvm_sed 's/^.*(//' | __rvm_sed 's/).*$//')\"
    full_version: \"${full_version}\"
"
}

info_homes()
{
  rvm_info="
  homes:
    gem:          \"${GEM_HOME:-"not set"}\"
    ruby:         \"${MY_RUBY_HOME:-"not set"}\"
"
}

info_binaries()
{
  rvm_info="
  binaries:
    ruby:         \"$(command -v ruby)\"
    irb:          \"$(command -v irb)\"
    gem:          \"$(command -v gem)\"
    rake:         \"$(command -v rake)\"
"
}

info_environment()
{
  rvm_info="
  environment:
    PATH:         \"${PATH:-""}\"
    GEM_HOME:     \"${GEM_HOME:-""}\"
    GEM_PATH:     \"${GEM_PATH:-""}\"
    MY_RUBY_HOME: \"${MY_RUBY_HOME:-""}\"
    IRBRC:        \"${IRBRC:-""}\"
    RUBYOPT:      \"${RUBYOPT:-""}\"
    gemset:       \"$(__rvm_current_gemset)\"\n
"
  if [[ -n "${MAGLEV_HOME:-""}" ]]
  then rvm_info="$rvm_info\n  MAGLEV_HOME: \"$MAGLEV_HOME\""
  fi
  rvm_info="$rvm_info\n"
}

info_debug()
{
  rvm_info="

$(__rvm_print_headline)
  $("$rvm_scripts_path/info" "$rvm_ruby_string" "" )
  PATH:\n$(printf "%b" "$PATH" | __rvm_awk -F":" '{print $1":"$2":"$3":"$4":"$5}' )
  uname -a: ${_system_info}
  permissions: $(__rvm_ls -la "$rvm_path" "$rvm_rubies_path")
"

  if [[ "Darwin" == "${_system_type}" ]]
  then
    rvm_info="$rvm_info
  sw_vers: $(sw_vers | \command \tr "\n" ',')
  ARCHFLAGS: ${ARCHFLAGS:-""}
  LDFLAGS: ${LDFLAGS:-""}
  CFLAGS: ${CFLAGS:-""}
"
  fi
  for file_name in "$HOME/.bashrc" "$HOME/.bash_profile" "$HOME/.zshenv"
  do
    if
      [[ -s "$file_name" ]]
    then
      rvm_info="$rvm_info\n$file_name:\n$(__rvm_grep 'rvm' "$file_name" 2>/dev/null || true)"
    fi
  done

  debug_files=(
    "$rvm_path/config/alias" "$rvm_path/config/system" "$rvm_path/config/db"
    "/etc/rvmrc" "$HOME/.rvmrc" "/etc/gemrc" "$HOME/.gemrc"
  )

  for file_name in "${debug_files[@]}"
  do
    if
      [[ -f "$file_name" && -s "$file_name" ]]
    then
      rvm_info="$rvm_info\n$file_name \(filtered\):\n$(__rvm_awk '!/assword|_key/{print}' "$file_name" )\n"
    fi
  done
  rvm_info="$rvm_info\ngem sources:\n$(gem sources | __rvm_awk '/gems/{print}')\n\n"
}

info_sections()
{
  for section in $(printf "%b" "${sections//,/ }")
  do
    rvm_info=""
    "info_${section}"
    printf "%b" "$rvm_info"
  done
}

rvm_ruby_gem_home="${rvm_ruby_gem_home:-${GEM_HOME:-""}}"

if
  [[ ! -d "$rvm_ruby_gem_home" ]] &&
  builtin command -v gem > /dev/null 2>&1
then
  rvm_ruby_gem_home="$(gem env home)"
fi

rvm_info=""
args=($*)

ruby_strings="${args[$__array_start]// /}"
args[$__array_start]=""
args=(${args[@]})

sections="${args// /}"
all_sections="system rvm ruby homes binaries environment"

# TODO: Figure out what was the thought here and remove external match script
#       dependency
if
  __rvm_string_match "$all_sections debug" "*${ruby_strings%%,*}*"
then
  sections="$ruby_strings"
  ruby_strings=""
fi

if
  [[ -z "${sections// /}" ]]
then
  sections="$all_sections"
fi

if
  [[ -z "$ruby_strings" ]]
then
  printf "%b" "\n$(__rvm_env_string):\n"
  info_sections
else
  for ruby_string in ${ruby_strings//,/ }
  do
    __rvm_become "$ruby_string"
    printf "%b" "\n$(__rvm_env_string):\n"
    info_sections
  done
fi
src/rvm/scripts/maglev000077500000016531147511530550011045 0ustar00#!/usr/bin/env bash

source "$rvm_scripts_path/base"

true ${rvm_trace_flag:-0}

if (( rvm_trace_flag == 2 ))
then
  set -x
  export rvm_trace_flag
fi

system="${_system_type}"
version="${rvm_ruby_string}.${system}"

# Check we're on a suitable 64-bit machine
case "$system" in
  Linux)
    if [[ "${_system_arch}" != "x86_64" ]]
    then
      rvm_error "This script only works on a 64-bit Linux OS."
      echo "The result from \"uname -sm\" is \"${_system_type} ${_system_arch}\" not \"Linux x86_64\""
      exit 1
    fi
    ;;

  Darwin)
    system_version="$(sw_vers -productVersion)"
    MAJOR="$(echo $system_version | cut -f1 -d.)"
    MINOR="$(echo $system_version | cut -f2 -d.)"
    CPU_CAPABLE="$(sysctl hw.cpu64bit_capable | cut -f2 -d' ')"
    #
    # Check the CPU and Mac OS profile.
    if [[ $CPU_CAPABLE -ne 1 || $MAJOR -lt 10 || $MINOR -lt 5 ]]
    then
      rvm_error "This script requires Mac OS 10.5 or later on a 64-bit Intel CPU."
      exit 1
    fi
    ;;

  SunOS)
    if [[ "${_system_arch}" != "i386" || "$(isainfo -b)" != "64" ]]
    then
      rvm_error "This script only works on a 64-bit Solaris-x86 OS."
      exit 1
    fi
    ;;

  *)
    rvm_error "This script only works on a 64-bit Linux, Mac OS X, or Solaris-x86 machine"
    echo "The result from \"uname -sm\" is \"${_system_type} ${_system_version}\""
    exit 1
    ;;
esac

# We should run this as a normal user, not root.
if (( UID == 0 ))
then
  rvm_error "This script should be run as a normal user, not root."
  exit 1
fi

# Check that the current directory is writable
if [[ ! -w "." ]]
then
  rvm_error "This script requires write permission on your current directory."
  __rvm_ls -ld $PWD
  exit 1
fi

# We're good to go. Let user know.
machine_name="$(command uname -n)"

rvm_log "Starting installation of $version on $machine_name"

# Figure out how much total memory is installed
rvm_log "Setting up shared memory"
#
# Ref: http://wiki.finkproject.org/index.php/Shared_Memory_Regions_on_Darwin
# Ref: http://developer.postgresql.org/pgdocs/postgres/kernel-resources.html
# Ref: http://www.idevelopment.info/data/Oracle/DBA_tips/Linux/LINUX_8.shtml
#
case "$system" in
  Linux)
    # use TotalMem: kB because Ubuntu doesn't have Mem: in Bytes
    totalMemKB=$(__rvm_awk '/MemTotal:/{print($2);}' /proc/meminfo)
    totalMem=$(($totalMemKB * 1024))
    # Figure out the max shared memory segment size currently allowed
    shmmax=$(\command \cat /proc/sys/kernel/shmmax)
    # Figure out the max shared memory currently allowed
    shmall=$(\command \cat /proc/sys/kernel/shmall)
    ;;

  Darwin)
    totalMem="$(sysctl hw.memsize | cut -f2 -d' ')"
    # Figure out the max shared memory segment size currently allowed
    shmmax="$(sysctl kern.sysv.shmmax | cut -f2 -d' ')"
    # Figure out the max shared memory currently allowed
    shmall="$(sysctl kern.sysv.shmall | cut -f2 -d' ')"
    ;;

  SunOS)
    # TODO: figure memory needs for SunOS
    # Investigate project.max-shm-memory
    totalMemMB="$(/usr/sbin/prtconf | __rvm_grep Memory | cut -f3 -d' ')"
    totalMem=$(($totalMemMB * 1048576))
    shmmax=$(($totalMem / 4))
    shmall=$(($shmmax / 4096))
    ;;

  *)
    rvm_error "Can't determine operating system. Check script."
    exit 1
    ;;
esac
totalMemMB=$(($totalMem / 1048576))
shmmaxMB=$(($shmmax / 1048576))
shmallMB=$(($shmall / 256))

# Print current values
echo "  Total memory available is $totalMemMB MB"
echo "  Max shared memory segment size is $shmmaxMB MB"
echo "  Max shared memory allowed is $shmallMB MB"

# Figure out the max shared memory segment size (shmmax) we want
# Use 75% of available memory but not more than 2GB
shmmaxNew=$(($totalMem * 3/4))
if (( shmmaxNew > 2147483648 ))
then
  shmmaxNew=2147483648
fi
shmmaxNewMB=$(($shmmaxNew / 1048576))

# Figure out the max shared memory allowed (shmall) we want
# The Darwin (OSX) default is 4MB, way too small
# The Linux default is 2097152 or 8GB, so we should never need this
# but things will certainly break if it's been reset too small
# so ensure it's at least big enough to hold a fullsize shared memory segment
shmallNew=$(($shmmaxNew / 4096))
if (( shmallNew < shmall ))
then
  shmallNew=$shmall
fi
shmallNewMB=$(($shmallNew / 256))

# Increase shmmax if appropriate
if (( shmmaxNew > shmmax ))
then
  rvm_log "Increasing max shared memory segment size to $shmmaxNewMB MB"
  case "${system}" in
    Darwin)
      __rvm_try_sudo sysctl -w kern.sysv.shmmax=$shmmaxNew
      ;;
    Linux)
      __rvm_try_sudo bash -c "echo $shmmaxNew > /proc/sys/kernel/shmmax"
      ;;
    SunOS)
      echo "[[Warning]] shmmax must be set manually on SunOS"
      ;;
  esac
else
  rvm_log "No need to increase max shared memory segment size"
fi

# Increase shmall if appropriate
if (( shmallNew > shmall ))
then
  rvm_log "Increasing max shared memory allowed to $shmallNewMB MB"
  case "${system}" in
    Darwin)
      __rvm_try_sudo sysctl -w kern.sysv.shmall=$shmallNew
      ;;
    Linux)
      __rvm_try_sudo bash -c "echo $shmallNew > /proc/sys/kernel/shmall"
      ;;
    SunOS)
      echo "[[Warning]]shmall must be set manually on SunOS"
      ;;
  esac
else
  rvm_log "No need to increase max shared memory allowed"
fi

# At this point, shared memory settings contain the values we want,
# put them in sysctl.conf so they are preserved.
if [[ ! -f /etc/sysctl.conf ]] || (( $(__rvm_grep -sc "kern.*.shm" /etc/sysctl.conf) == 0 ))
then
  case "$system" in
    Linux)
      echo "# kernel.shm* settings added by MagLev installation" > /tmp/sysctl.conf.$$
      echo "kernel.shmmax=$(\command \cat /proc/sys/kernel/shmmax)" >> /tmp/sysctl.conf.$$
      echo "kernel.shmall=$(\command \cat /proc/sys/kernel/shmall)" >> /tmp/sysctl.conf.$$
      ;;
    Darwin)
      # On Mac OS X Leopard, you must have all five settings in sysctl.conf
      # before they will take effect.
      echo "# kern.sysv.shm* settings added by MagLev installation" > /tmp/sysctl.conf.$$
      sysctl kern.sysv.shmmax kern.sysv.shmall kern.sysv.shmmin kern.sysv.shmmni \
        kern.sysv.shmseg  | \command \tr ":" "=" | \command \tr -d " " >> /tmp/sysctl.conf.$$
      ;;
    SunOS)
      # Do nothing in SunOS since /etc/sysctl.conf is ignored on Solaris 10.
      # Must configure shared memory settings manually.
      ;;
    *)
      rvm_error "Can't determine operating system. Check script."
      exit 1
      ;;
  esac

  # Do nothing on SunOS since /etc/sysctl.conf is ignored on Solaris 10.
  if [[ "$system" != "SunOS" ]]
  then
    rvm_log "Adding the following section to /etc/sysctl.conf"
    \command \cat /tmp/sysctl.conf.$$
    __rvm_try_sudo bash -c "\command \cat /tmp/sysctl.conf.$$ >> /etc/sysctl.conf"
    /bin/\command \rm -f /tmp/sysctl.conf.$$
  fi
else
  rvm_log "The following shared memory settings already exist in /etc/sysctl.conf"
  echo "To change them, remove the following lines from /etc/sysctl.conf and rerun this script"
  __rvm_grep "kern.*.shm" /etc/sysctl.conf
fi

# Now setup for NetLDI in case we ever need it.
rvm_log "Setting up GemStone netldi service port"
if (( $(__rvm_grep -sc "^gs64ldi" /etc/services) == 0 ))
then
  echo '[[Info]] Adding "gs64ldi  50378/tcp" to /etc/services'
  __rvm_try_sudo bash -c 'echo "gs64ldi         50378/tcp        # Gemstone netldi"  >> /etc/services'
else
  rvm_log "GemStone netldi service port is already set in /etc/services"
  echo "To change it, remove the following line from /etc/services and rerun this script"
  __rvm_grep "^gs64ldi" /etc/services
fi
src/rvm/scripts/alias000077500000005667147511530550010673 0ustar00#!/usr/bin/env bash

unset rvm_default_flag

source "$rvm_scripts_path/base"
source "$rvm_scripts_path/functions/alias"

usage() {
  printf "%b" "

  Usage:

    rvm alias [action] [arguments]

  Examples:

    rvm alias create [alias_name] [ruby]
    rvm alias delete [alias_name]
    rvm alias show [alias_name]
    rvm alias list

"
}

alias_create_execute()
{
  for _path in "$rvm_rubies_path" "$rvm_gems_path" "$rvm_environments_path" "$rvm_wrappers_path"
  do
    if [[ -L "$_path/$alias_name" ]]
    then \command \rm -fv "$_path/$alias_name" || return $?
    fi
    \command \ln -fs "$_path/$rvm_ruby_string" "$_path/$alias_name" || return $?
  done

  __rvm_db_ "$rvm_path/config/alias" "$alias_name" "$rvm_ruby_string"
}

alias_create()
{
  alias_name="${alias_name:-""}"
  rvm_ruby_string="$rvm_environment_identifier"
  rvm_expanding_aliases=1
  __rvm_become
  unset rvm_expanding_aliases

  if
    [[ -z "${rvm_environment_identifier:-""}" || -z "$rvm_ruby_string" || -z "$alias_name" ]]
  then
    rvm_error "usage: 'rvm alias [action] [alias_name] [ruby_string]'"
    return 1
  elif
    [[ ! -L "$rvm_rubies_path/$alias_name" && -d "$rvm_rubies_path/$alias_name" ]]
  then
    rvm_error "$alias_name is a full ruby name and can not be used as alias name."
    return 2
  else
    __rvm_log_command "alias_create" \
      "Creating alias $alias_name for $rvm_ruby_string" \
      alias_create_execute
  fi
}

alias_list_show()
{
  __rvm_cd "$rvm_rubies_path"
  __rvm_find . -maxdepth 1 -mindepth 1 -type l | __rvm_sed -e 's#.*/##'
}

alias_list() {
  case "${alias_name}" in
    (names)
      alias_list_show # just show it
      ;;
    (*)
      \typeset -a items
      __rvm_read_lines items <(alias_list_show)
      \typeset item
      for item in "${items[@]}"
      do echo "$item => $(__rvm_db_ "$rvm_path/config/alias" "$item")"
      done
      ;;
  esac
}

alias_search_by_target() {
  \typeset item items target search
  search="${alias_name}@${gemset_name}"

  items=($(__rvm_cd "$rvm_rubies_path" ; __rvm_find . -maxdepth 1 -mindepth 1 -type l | __rvm_sed -e 's#./##'))

  for item in "${items[@]}"
  do
    target=$(__rvm_db_ "$rvm_path/config/alias" "$(basename "$item")")
    if [[ "${search}" == "${target}" ]]
    then
      echo "$(basename "$item")"
    fi
  done
}

args=($*)
action="${args[0]:-""}"
alias_name="${args[1]:-""}"
rvm_environment_identifier="${args[2]:-""}"
shift 3
args="$@"
result=0

if
  [[ "$alias_name" == *"/"* ]]
then
  printf "%b" "Can not use path separator '/' in alias names."
  exit 1
fi

[[ -f "$rvm_path/config/alias" ]] || touch "$rvm_path/config/alias"

if
  [[ "$alias_name" == *"${rvm_gemset_separator:-"@"}"* ]]
then
  gemset_name="${alias_name/*${rvm_gemset_separator:-"@"}/}"
  alias_name="${alias_name/${rvm_gemset_separator:-"@"}*/}"
else
  gemset_name=""
fi

case "$action" in
  delete|create|list|show|search_by_target)
    alias_${action}
    ;;
  help|usage)
    usage
    ;;
  *)
    usage
    exit 1
    ;;
esac

exit $?
src/rvm/scripts/cleanup000077500000006667147511530550011232 0ustar00#!/usr/bin/env bash

rvm_base_except="selector"
source "$rvm_scripts_path/base"

chmod_unless_link()
{
  if [[ -e "$1" && ! -L "$1" ]]
  then chmod -R u+w "$1" || return $?
  fi
}

remove_or_log()
{
  rvm_verbose_log " - removing - $1"
  chmod_unless_link "$1" &&
  __rvm_rm_rf "$1" ||
  {
    : $(( failed_counter+=1 ))
    rvm_error " - failed removing $1 - please check ownership and permissions"
  }
}

empty_or_log()
{
  rvm_verbose_log " - emptying - $1"
  chmod_unless_link "$1" &&
  echo "" > "$1" ||
  {
    : $(( failed_counter+=1 ))
    rvm_error " - failed emptying $1 - please check ownership and permissions"
  }
}

cleanup_single()
{
  \typeset current_path entry
  current_path="${rvm_path}/${1}"

  if
    [[ -n "$current_path" && -d "$current_path" && "$current_path" != "/" ]]
  then
    for entry in "$current_path"/*
    do
      case $entry in
        (*\*) continue ;; # skip empty dirs
      esac
      remove_or_log "$entry"
    done
  fi
}

cleanup_checksums()
{
  empty_or_log "${rvm_user_path:-${rvm_path}/user}/md5"
  empty_or_log "${rvm_user_path:-${rvm_path}/user}/sha512"
}

cleanup_gemsets()
{
  \typeset current_path ruby_path

  for current_path in "${rvm_path}"/gems/*
  do
    case "${current_path##*/}" in
      (\*)    continue ;; # skip no gemsets
      (cache) continue ;; # skip cache dir
    esac
    ruby_path="${current_path%@*}"
    ruby_path="${ruby_path//\/gems\///rubies/}"
    [[ -d "${ruby_path}" ]] ||
      remove_or_log "$current_path"
  done
  \typeset __found __search_path_gems __search_path_rubies gemset_name __need_a_cleanup=0
  for __found in "$rvm_path"/environments/*  "$rvm_path"/wrappers/*
  do
    gemset_name="${__found##*/}"
    __search_path_gems="$rvm_path/gems/${gemset_name}"
    __search_path_rubies="$rvm_path/rubies/${gemset_name}"
    if
      [[ -e "$__found" &&
        "$gemset_name" != default &&
        ! -e "$__search_path_gems" &&
        ! -e "$__search_path_rubies"
      ]]
    then
      remove_or_log "$__found"
    fi
  done
  (( __need_a_cleanup )) ||
  for __found in "$rvm_path"/gems/*
  do
    gemset_name="${__found##*/}"
    gemset_name="${gemset_name%@*}"
    __search_path_rubies="$rvm_path/rubies/${gemset_name}"
    if
      [[ -e "$__found" &&
        "$gemset_name" != cache &&
        ! -e "$__search_path_rubies"
      ]]
    then
      remove_or_log "$__found"
    fi
  done
}

cleanup_links()
{
  \typeset current_link
  \typeset -a all_links

  __rvm_read_lines all_links <(
    __rvm_find "${rvm_path}"/{environments,wrappers,gems,bin} -type l
  )
  for current_link in "${all_links[@]}"
  do
    if
      [[ -L "${current_link}" && ! -s "${current_link}" ]]
    then
      remove_or_log "${current_link}"
    fi
  done
}

cleanup()
{
  while (( $# ))
  do
    rvm_log "Cleaning up rvm $1"
    case "$1" in
      (archives)
        cleanup_checksums
        cleanup_single $1
        ;;
      (checksums|gemsets|links)
        cleanup_$1
        ;;
      (logs)
        cleanup_single log
        ;;
      (sources)
        cleanup_single src
        ;;
      (*)
        cleanup_single $1
        ;;
    esac
    shift
  done
}

failed_counter=0
case "$1" in
  archives|checksums|repos|sources|tmp|gemsets|logs|links)
    cleanup "$1"
    ;;
  all)
    cleanup archives repos src log tmp gemsets links
    ;;
  help)
    rvm_help cleanup
    ;;
  *)
    rvm_help cleanup
    exit 1
    ;;
esac

if (( failed_counter ))
then rvm_warn "Cleanup failed for $failed_counter"
else rvm_log "Cleanup done."
fi
src/rvm/scripts/help000077500000002453147511530550010520 0ustar00#!/usr/bin/env bash

rvm_base_except="selector"

source "$rvm_scripts_path/base"
source "$rvm_scripts_path/functions/version"

__rvm_help_find()
{
  \typeset _full_name
  \typeset -a _full_paths

  _full_name=""
  _full_paths=()
  _matched=""

  case "$1" in
    (*/*) return 1 ;;
  esac

  # start with shortest, build path and prepend it to beginning
  while (( $# > 0 ))
  do
    _full_name="${_full_name:-}${1:-}"
    _full_paths=( "${_full_name}.md" "${_full_paths[@]}" )
    _full_name="${_full_name:-}/"
    shift
  done

  # check longest paths first
  for _full_name in "${_full_paths[@]}"
  do
    if
      [[ -n "${_full_name}" && -s "${rvm_help_path}/${_full_name}" ]]
    then
      echo "${rvm_help_path}/${_full_name}"
      return 0
    elif
      [[ -n "${_full_name}" && -s "${rvm_docs_path}/${_full_name}" ]]
    then
      echo "${rvm_docs_path}/${_full_name}"
      return 0
    fi
  done
  return 1
}

__rvm_help()
{
  \typeset _matched

  __rvm_print_headline

  if
    _matched="$(__rvm_help_find "$@")"
  then
    __rvm_pager_or_cat_v "${_matched}"
  else
    [[ -z "$1" ]] || rvm_error "Documentation for 'rvm $*' not found"

    __rvm_pager_or_cat_v "${rvm_path:-$HOME/.rvm}/help/index.txt"
  fi

  rvm_log "
For additional documentation please visit $(__rvm_version_website)
"
}
__rvm_help "$@"
src/rvm/scripts/repair000077500000007463147511530550011060 0ustar00#!/usr/bin/env bash

source "$rvm_scripts_path/base"

usage()
{
  printf "%b" "
  Usage:

    rvm repair [option]

  Options:
    wrappers     - Repair wrappers
    symlinks     - Repair symlinks
    environments - Repair environments
    archives     - Repair archives
    gemsets      - Repair gemsets
    all          - Repair all of the above

"
}

repair_gemsets()
{
  \typeset directory directories

  rvm_log "Removing gemsets missing names or interpreters."

  (
    __rvm_cd "${rvm_gems_path:-"rvm_path/gems"}"

    directories=(
      $( __rvm_find . -mindepth 1 -maxdepth 1 -type d | __rvm_grep '@$' )
      $( __rvm_find . -mindepth 1 -maxdepth 1 -type d | __rvm_grep '^./@')
    )

    for directory in "${directories[@]//.\/}"
    do
      __rvm_rm_rf "./$directory/"
    done
  )

  rvm_log "Gemsets repaired."
  return 0
}

repair_wrappers()
{
  rvm_log "Regenerating all wrappers..."
  __rvm_read_lines ruby_names <(__rvm_list_gemset_strings)

  for ruby_name in "${ruby_names[@]}"
  do
    __rvm_log_command \
      "wrappers.regenerate.$ruby_name" \
      "Regenerating wrappers for $ruby_name" \
      __rvm_with $ruby_name run_gem_wrappers regenerate ||
    failed_wrappers+=( "$wrapper_ruby_name" )
  done

  if (( ${#failed_wrappers[@]} ))
  then rvm_error "Wrappers regeneration failed for: ${failed_wrappers[*]}"
  else rvm_log "Wrappers regenerated"
  fi
  return ${#failed_wrappers[@]}
}

# Removes stale symlinks in $rvm_bin_path, likely related to wrappers.
repair_symlinks()
{
  rvm_log "Repairing symlinks..."
  for executable_name in "${rvm_bin_path}"/*
  do
    if
      [[ -L "$executable_name" && ! -e "$executable_name" && "$executable_name" != "${rvm_bin_path}/*" ]]
    then
      rvm_log "removing stale symlink from $(basename "$executable_name")"
      \command \rm -f "$executable_name"
    fi
  done
  rvm_log "Symlinks repaired"
}

# Regenerates each symlink file.
repair_environments()
{
  \typeset environment_name environments

  rvm_log "Regenerating environments..."

  environments=($(__rvm_cd "$rvm_environments_path" ; __rvm_find . -maxdepth 1 -mindepth 1 -type f))

  for environment_name in "${environments[@]//.\/}"
  do
    [[ -L "$rvm_environments_path/$environment_name" ]] && continue
    rvm_log "Regenerating environment file for '$environment_name'"

    [[ -f "$rvm_environments_path/$environment_name" ]] && \command \rm -f "$rvm_environments_path/$environment_name"

    (
      source "$rvm_scripts_path/base"
      __rvm_become "$environment_name"
      __rvm_ensure_has_environment_files
    )
  done

  rvm_log "Environments regenerated"
}

# Removes archives that have incorrect md5 sums.
repair_archives()
{
  \typeset archive_file archives stored_md5sum

  rvm_log "Repairing archives..."

  __rvm_read_lines archives <(
    __rvm_cd "${rvm_archives_path}"
    __rvm_find . -maxdepth 1 -mindepth 1 -type f
  )

  for archive_file in "${archives[@]//.\/}"
  do
    if
      __rvm_checksum_read "$archive_file" &&
      __rvm_checksum_any
    then
      __rvm_checksum_validate_file "${rvm_archives_path}/$archive_file" ||
      {
        rvm_log "Removing archive for '$archive_file' - Incorrect md5 checksum."
        __rvm_rm_rf "${rvm_archives_path}/$archive_file"
      }
    fi
  done

  rvm_log "Archives repaired"
  return 0
}

repair_all()
{
  repair_symlinks
  repair_archives
  repair_environments
  repair_wrappers

  return 0
}

args=($*)
action="${args[$__array_start]}"
args[$__array_start]=""
args=(${args[@]})

if [[ -z "$action" ]]
then
  usage
  exit $?
fi

case "$action" in
  all)          repair_all          ;;
  symlinks)     repair_symlinks     ;;
  gemsets)      repair_gemsets      ;;
  environments) repair_environments ;;
  archives)     repair_archives     ;;
  wrappers)     repair_wrappers     ;;
  help)         usage               ;;
  *)            usage >&2 ; exit 1  ;;
esac

exit $?
src/rvm/scripts/functions/rvmrc_warning000066400000010642147511530550014452 0ustar00#!/usr/bin/env bash

__rvmrc_warning()
{
  \typeset __rvmrc_warning_path __rvmrc_warning_file
  __rvmrc_warning_path="$rvm_user_path/rvmrc_ignored"

  case "${1:-help}" in
    (list)
      __rvmrc_warning_$1 "${2:-}" || return $?
      ;;
    (check|check_quiet|ignore|reset)
      __rvmrc_full_path_to_file "${2:-}" &&
      __rvmrc_warning_$1 "${__rvmrc_warning_file:-${2:-}}" ||
      return $?
      ;;
    (help)
      rvm_help rvmrc warning
      ;;
    (*)
      rvm_error_help "Unknown subcommand '$1'" rvmrc warning
      return 1
      ;;
  esac
}

__rvmrc_full_path_to_file()
{
  if
    [[ "$1" == "all.rvmrcs" || "$1" == "allGemfiles" ]]
  then
    # extra case when managing all
    __rvmrc_warning_file="$1"
  elif
    [[ -d "$1" && -s "$1/.rvmrc" ]]
  then
    # read full path and append .rvmrc
    __rvmrc_warning_file="$( __rvm_cd "$1" >/dev/null 2>&1; pwd )/.rvmrc"
  elif
    [[ -d "$1" && -s "$1/Gemfile" ]]
  then
    # read full path and append Gemfile
    __rvmrc_warning_file="$( __rvm_cd "$1" >/dev/null 2>&1; pwd )/Gemfile"
  elif
    [[ -f "$1" || "$1" == *".rvmrc" || "$1" == *"Gemfile" ]]
  then
    # read dir from file name
    __rvmrc_warning_file="$( dirname "$1" )"
    # default to current dir if not given in file name
    : __rvmrc_warning_file:${__rvmrc_warning_file:=$PWD}
    # build full path to file
    __rvmrc_warning_file="${__rvmrc_warning_file}/${1##*/}"
  else
    rvm_warn "Do not know how to handle '$1', please report: https://github.com/rvm/rvm/issues ~ __rvmrc_full_path_to_file"
    return 1
  fi
}

__rvmrc_warning_list()
{
  rvm_log "# List of project files that ignore warnings:"
  if [[ -s "$__rvmrc_warning_path" ]]
  then \command \cat "$__rvmrc_warning_path"
  fi
}

__rvmrc_warning_check()
{
  if __rvmrc_warning_check_quiet "$1"
  then rvm_log "path '$1' is ignored."
  else
    \typeset ret=$?
    rvm_log "path '$1' is not ignored."
    return $ret
  fi
}

__rvmrc_warning_check_quiet()
{
  [[ -f "$__rvmrc_warning_path" ]] || return $?
  \typeset __rvmrc_type
  case "$1" in
    (all.rvmrcs|allGemfiles) true ;;
    (*)
      # convert to all<file>s
      __rvmrc_type="^all${1##*/}s"
      if __rvm_grep "${__rvmrc_type}$" "$__rvmrc_warning_path" >/dev/null
      then return 0
      fi
      ;;
  esac
  __rvm_grep "^$1$" "$__rvmrc_warning_path" >/dev/null || return $?
}

__rvmrc_warning_ignore()
{
  __rvmrc_warning_check_quiet "$1" ||
  case "$1" in
    (all.rvmrcs|allGemfiles)
      echo "$1" >>  "$__rvmrc_warning_path"
      ;;
    (*)
      echo "$1" >> "$__rvmrc_warning_path"
      ;;
  esac
}

__rvmrc_warning_reset()
{
  \typeset __rvmrc_type
  case "${1:-}" in
    (all.rvmrcs|allGemfiles)
      if
        __rvmrc_warning_check_quiet "$1"
      then
        __rvm_sed_i "$__rvmrc_warning_path" -e "\#^${1}\$# d" -e '/^$/ d'
        __rvmrc_type="${1#all}"
        __rvmrc_type="${__rvmrc_type%s}"
        __rvm_sed_i "$__rvmrc_warning_path" -e "\#/${__rvmrc_type}\$# d" -e '\#^$# d'
      else
        rvm_debug "Already removed warning ignore from '$1'."
      fi
      ;;
    (*)
      if __rvmrc_warning_check_quiet "$1"
      then __rvm_sed_i "$__rvmrc_warning_path" -e "\#^${1}\$# d" -e '\#^$# d'
      else rvm_debug "Already removed warning ignore from '$1'."
      fi
      ;;
  esac
}

__rvmrc_warning_display_for_rvmrc()
{
  \typeset __rvmrc_warning_path __rvmrc_warning_file
  __rvmrc_warning_path="$rvm_user_path/rvmrc_ignored"
  if
    [[ -t 2 ]] &&
    __rvmrc_full_path_to_file "${1:-}" &&
    ! __rvmrc_warning_check_quiet "${__rvmrc_warning_file:-${2:-}}"
  then
    rvm_warn "You are using '.rvmrc', it requires trusting, it is slower and it is not compatible with other ruby managers,
you can switch to '.ruby-version' using 'rvm rvmrc to ruby-version'
or ignore this warning with 'rvm rvmrc warning ignore $1',
'.rvmrc' will continue to be the default project file in RVM 1 and RVM 2,
to ignore the warning for all files run 'rvm rvmrc warning ignore all.rvmrcs'.
"
  fi
}

__rvmrc_warning_display_for_Gemfile()
{
  \typeset __rvmrc_warning_path __rvmrc_warning_file
  __rvmrc_warning_path="$rvm_user_path/rvmrc_ignored"
  if
    [[ -t 2 ]] &&
    __rvmrc_full_path_to_file "${1:-}" &&
    ! __rvmrc_warning_check_quiet "${__rvmrc_warning_file:-${2:-}}"
  then
    rvm_warn "RVM used your Gemfile for selecting Ruby, it is all fine - Heroku does that too,
you can ignore these warnings with 'rvm rvmrc warning ignore $1'.
To ignore the warning for all files run 'rvm rvmrc warning ignore allGemfiles'.
"
  fi
}
src/rvm/scripts/functions/installer000066400000123774147511530550013604 0ustar00#!/usr/bin/env bash

case "`date +%s:%N`" in
  (*:%N)
    __install_time()
    {
      __time="$SECONDS:"
    }
    ;;
  (*)
    __install_time()
    {
      __time="$(date +%s:%N)"
    }
    ;;
esac

install_run_debug_time()
{
  # 1st s = start, 1st e = end, 1st d = difference, 2nd s = seconds, 2nd n = nanoseconds
  \typeset __ss __sn __es __en __ds __dn __time __status=0
  rvm_debug "step> '$1' started"

  __install_time
  __ss="${__time}"
  "$@" || __status=$?
  __install_time
  __es="${__time}"

  # split seconds and nano
  __sn="${__ss#*:}"
  __sn="${__sn##*(0)}"
  __ss="${__ss%:*}"
  __ss="${__ss##*(0)}"
  __en="${__es#*:}"
  __en="${__en##*(0)}"
  __es="${__es%:*}"
  __es="${__es##*(0)}"

  __ds="$(( __es - __ss ))"
  __dn=""
  if
    [[ -n "${__sn}" && -n "${__en}" ]]
  then
    __dn="$(( __en - __sn ))"
    if
      (( __dn < 0 ))
    then
      __dn="$(( __dn + 1000000000 ))"
      __ds="$(( __ds - 1 ))"
    fi
    if [[ "${__dn}" == "0" ]]
    then __dn=""
    fi
  fi
  __time="${__ds}${__dn:+"$(printf ".%09d" "$__dn")"} seconds"

  rvm_debug "step< '$1' finished with status 0 in ${__time}"
}

install_rvm_step()
{
  install_run_debug_time $1 ||
  {
    \typeset __status=$?
    rvm_error "Installer failed at step '$1' with status ${__status}, please run it with --debug and report a bug."
    return ${__status}
  }
}

install_rvm()
{
  \typeset __step
  \typeset -a __steps
  __steps=()

  load_configuration
  parse_args "$@"
  setup_installer
  load_rvm

  if (( rvm_user_install_flag == 0 ))
  then __steps+=( system_installation_check setup_rvm_group_and_users )
  fi
  __steps+=(
    print_install_header
    cleanse_old_entities
    create_install_paths
    load_custom_flags
    save_custom_flags
    install_rvm_directories
    install_rvm_files
    install_rvm_scripts
    cleanup_old_help_and_docs_files
    install_rvm_hooks
    remove_old_hooks
    install_binaries
    install_gemsets
    install_patchsets
    install_man_pages
    setup_configuration_files
    setup_login_shell
  )
  # not using elif for clarity
  if (( rvm_user_install_flag == 1 ))
  then __steps+=( setup_user_profile )
  else
    if (( UID == 0 ))
    then __steps+=( setup_etc_profile setup_etc_bashrc setup_etc_rvmrc )
    else
      if (( upgrade_flag == 0 ))
      then __steps+=( warning_no_loading_of_rvm )
      fi
    fi
  fi
  __steps+=(
    cleanse_old_environments
    migrate_old_gemsets
    migrate_defaults
    migrate_environments_and_wrappers
    create_gems_aliases
    restore_missing_environments
    record_ruby_configs
    update_gemsets_install_rvm
    configure_autolibs
    update_yaml_if_needed
    cleanup_tmp_files
    record_installation_time
  )
  if
    (( rvm_user_install_flag == 0 ))
  then
    __steps+=(
      setup_rvm_path_permissions_root
      setup_rvm_path_permissions_check_group
      setup_rvm_path_permissions_check_dirs
      setup_rvm_path_permissions_check_files
    )
  fi
  __steps+=(
    print_install_footer
    display_notes
  )
  for __step in "${__steps[@]}"
  do install_rvm_step ${__step} || return $?
  done
}

load_configuration()
{
  set -o errtrace
  export PS4 PATH HOME

  HOME="${HOME%%+(\/)}" # Remove trailing slashes if they exist on HOME

  case "$MACHTYPE" in
    *aix*) name_opt=-name  ;;
    *)     name_opt=-iname ;;
  esac

  if
    (( ${rvm_ignore_rvmrc:=0} == 0 ))
  then
    [[ -n "${rvm_stored_umask:-}" ]] || export rvm_stored_umask=$(umask)

    rvm_rvmrc_files=("/etc/rvmrc" "$HOME/.rvmrc")
    if [[ -n "${rvm_prefix:-}" ]] && ! [[ "$HOME/.rvmrc" -ef "${rvm_prefix}/.rvmrc" ]]
    then rvm_rvmrc_files+=( "${rvm_prefix}/.rvmrc" )
    fi
    for file in "${rvm_rvmrc_files[@]}"
    do
      if [[ -s "$file" ]]
      then . "$file"
      fi
    done
    unset rvm_rvmrc_files
  fi

  PS4="+ \${BASH_SOURCE##\${rvm_path:-}} : \${FUNCNAME[0]:+\${FUNCNAME[0]}()}  \${LINENO} > "

  [[ -z "${rvm_user_path_prefix:-}" ]] || PATH="${rvm_user_path_prefix}:$PATH"

  export ORIGINAL_PATH="$PATH"

  true ${rvm_group_name:=rvm}
  unset rvm_auto_dotfiles_flag
}

parse_args()
{
  true ${DESTDIR:=}
  # Parse RVM Installer CLI arguments.
  while (( $# > 0 ))
  do
    token="$1"
    shift

    case "$token" in
      (--auto-dotfiles|--ignore-dotfiles|--debug|--quiet-curl)
        token=${token#--}
        token=${token//-/_}
        export "rvm_${token}_flag"=1
        ;;
      (--autolibs=*)
        export rvm_autolibs_flag="${token#--autolibs=}"
        ;;
      (--without-gems=*|--with-gems=*|--with-default-gems=*)
        value="${token#*=}"
        token="${token%%=*}"
        token="${token#--}"
        token="${token//-/_}"
        export "rvm_${token}"="${value}"
        ;;
      (--path)
        export rvm_path="$1"
        export rvm_bin_path="$1/bin"
        export rvm_ignore_rvmrc=1
        shift
        ;;
      (--add-to-rvm-group)
        export rvm_add_users_to_rvm_group="$1"
        shift
        ;;
      (--version)
        (
          export rvm_path="${PWD%%+(\/)}"
          echo "$rvm_version"
        )
        exit
        ;;
      (--trace)
        export rvm_trace_flag=1
        set -o xtrace
        echo "$@"
        env | GREP_OPTIONS="" \grep '^rvm_'
        export PS4="+ \${BASH_SOURCE##\${rvm_path:-}} : \${FUNCNAME[0]:+\${FUNCNAME[0]}()}  \${LINENO} > "
        ;;
      (--help)
        install_usage
        exit 0
        ;;
      (*)
        echo "Unrecognized option: $token"
        install_usage
        exit 1
        ;;
    esac
  done

  if [[ -n "${DESTDIR}" ]]
  then
    rvm_prefix="${DESTDIR}"
  fi
}

install_usage()
{
  printf "%b" "
  Usage:

    ${0} [options]

  options:

    --auto-dotfiles   : Automatically update shell profile files.

    --ignore-dotfiles : Do not update shell profile files.

    --path    : Installation directory (rvm_path).

    --help    : Display usage information

    --version : display rvm package version

"
}

setup_installer()
{
  export rvm_prefix rvm_path rvm_user_install_flag rvm_debug_flag rvm_trace_flag upgrade_flag HOME

  HOME="${HOME%%+(\/)}" # Remove trailing slashes if they exist on HOME

  if
    [[ -z "${rvm_path:-}" ]]
  then
    if (( UID == 0 ))
    then rvm_path="/usr/local/rvm"
    else rvm_path="${HOME}/.rvm"
    fi
    rvm_prefix="${rvm_path%/*}"
  fi

  : \
    rvm_bin_path:${rvm_bin_path:=$rvm_path/bin} \
    rvm_man_path:${rvm_man_path:=$rvm_path/man} \
    rvm_user_path:${rvm_user_path:=$rvm_path/user} \
    rvm_scripts_path:${rvm_scripts_path:=$rvm_path/scripts}

  # duplication marker kkdfkgnjfndgjkndfjkgnkfjdgn
  [[ -n "${rvm_user_install_flag:-}" ]] ||
  case "$rvm_path" in
    (/usr/local/rvm)         rvm_user_install_flag=0 ;;
    ($HOME/*|/${USER// /_}*) rvm_user_install_flag=1 ;;
    (*)                      rvm_user_install_flag=0 ;;
  esac

  if [[ -d "$rvm_path" && -s "${rvm_path}/scripts/rvm" ]]
  then upgrade_flag=1
  else upgrade_flag=0
  fi
}

load_rvm()
{
  export install_source_path="$0"
  install_source_path="${install_source_path%/install}"
  install_source_path="${install_source_path%/scripts}" # install -> scripts/install
  \typeset save_rvm_scripts_path="$rvm_scripts_path"
  export rvm_scripts_path="${install_source_path}/scripts"

  source "$rvm_scripts_path/base"
  source "$rvm_scripts_path/functions/autolibs"
  source "$rvm_scripts_path/functions/group"
  source "$rvm_scripts_path/functions/pkg"

  rvm_scripts_path="$save_rvm_scripts_path"

  if [[ "$install_source_path/scripts" != "." && "$install_source_path/scripts" != "$PWD" ]]
  then __rvm_cd "$install_source_path"
  fi

  true "${source_path:=${PWD%%+(\/)}}"
}

system_installation_check()
{
  case "${_system_type}" in
    Linux|Darwin|SunOS|BSD)
      return 0 # Accounted for, continue.
    ;;
    *)
      # it will report 'unknown' or even nothing here!
      rvm_error "Installing RVM as root is currently only supported on the following known OS's (uname):
    Linux, FreeBSD, OpenBSD, DragonFly, Darwin and SunOS
Whereas your OS is reported as '${_system_type}'"
      return 1
    ;;
  esac
}

setup_rvm_group_and_users()
{
  if
    __rvm_group_exists "$rvm_group_name"
  then
    rvm_debug "Group '$rvm_group_name' already exists"
  else
    rvm_log "Creating group '$rvm_group_name'"
    __rvm_create_group "${rvm_group_name}" "${rvm_group_id:-}"
  fi
  if
    [[ -n "${rvm_add_users_to_rvm_group:-}" ]]
  then
    \typeset __user
    \typeset -a __users
    if
      [[ "$rvm_add_users_to_rvm_group" == "all" ]]
    then
      __users=( $( __rvm_list_all_users ) )
    else
      if [[ -n "${ZSH_VERSION:-}" ]]
      then __users=( ${=rvm_add_users_to_rvm_group//,/ } )
      else __users=( ${rvm_add_users_to_rvm_group//,/ } )
      fi
    fi
    for __user in "${__users[@]}"
    do
      if
        __rvm_is_user_in_group "$rvm_group_name" "$__user"
      then
        rvm_debug "User '$__user' already in the RVM group '${rvm_group_name}'"
      else
        rvm_log "Adding user '$__user' to the RVM group '${rvm_group_name}'"
        __rvm_add_user_to_group "$rvm_group_name" "$__user"
      fi
    done
  fi
}

print_install_header()
{
  if [[ ${upgrade_flag:-0} -eq 1 ]]
  then rvm_notify "Upgrading the RVM installation in $rvm_path/"
  else rvm_notify "Installing RVM to $rvm_path/"
  fi
}

cleanse_old_entities()
{
  #
  # Remove old files that no longer exist.
  #
  for script in utility array
  do
    if test -f "$rvm_path/scripts/${script}"
    then \command \rm -f "$rvm_path/scripts/${script}"
    fi
  done
  return 0
}

create_install_paths()
{
  \typeset -a install_paths
  install_paths=(
   archives src log bin gems man rubies config user tmp gems environments wrappers
  )
  for install_path in "${install_paths[@]}"
  do [[ -d "$rvm_path/$install_path" ]] || mkdir -p "$rvm_path/$install_path"
  done

  [[ -z "$rvm_bin_path" || -d "$rvm_bin_path" ]] || mkdir -p "$rvm_bin_path"
  return 0
}

# duplication marker kdfkjkjfdkfjdjkdfkjfdkj
load_custom_flags()
{
  if
    [[ -s "${rvm_path:-}/user/custom_flags" ]]
  then
    \typeset __key __value
    while IFS== read __key __value
    do
      eval "export ${__key}=\"\${__value}\""
    done < "${rvm_path:-}/user/custom_flags"
  fi
}

save_custom_flags()
{
  \typeset -a __variables
  __variables=(
    ^rvm_ignore_dotfiles_flag=
  )
  \typeset IFS="|"
  set | __rvm_grep -E "${__variables[*]}" > "${rvm_path:-}/user/custom_flags"
  true # no failing from __rvm_grep filtering
}

install_rvm_directories()
{
  for entry in $(__rvm_find -L config patches patchsets gem-cache contrib examples lib hooks help docs scripts -type d 2>/dev/null)
  do
    # Target is supposed to be a directory, remove if it is a file.
    if [[ -f "$rvm_path/$entry" ]]
    then \command \rm -f "$rvm_path/$entry"
    fi
    [[ -d "$rvm_path/$entry" ]] || mkdir -p "$rvm_path/$entry"
  done
}

install_rvm_files()
{
  for file in README.md LICENSE VERSION
  do
    __rvm_cp -f "$source_path/${file}" "$rvm_path/${file}"
  done

  for entry in $(__rvm_find -L config patches gem-cache contrib examples lib help docs -type f 2>/dev/null)
  do
    # Target is supposed to be a file, remove if it is a directory.
    if [[ -d "$rvm_path/$entry" ]]
    then __rvm_rm_rf "$rvm_path/$entry"
    fi
    \command \cat < "$source_path/$entry" > "$rvm_path/$entry"
    if [[ -x "$source_path/$entry" && ! -x "$rvm_path/$entry" ]]
    then chmod +x "$rvm_path/$entry"
    fi
  done
}

install_rvm_scripts()
{
  case "${_system_type}" in
    (SunOS)
      # SmartOS bash and /opt/local/bin/test have a bug checking for executable bit when
      # run as root user. Reported here: https://github.com/joyent/smartos-live/issues/318
      chmod_if_needed()
      {
        if /usr/bin/test -x "$1" && ! /usr/bin/test -x "$2"
        then chmod +x "$2"
        fi
      }
    ;;
    *)
      chmod_if_needed()
      {
        if [[ -x "$1" && ! -x "$2" ]]
        then chmod +x "$2"
        fi
      }
    ;;
  esac

  for entry in $(__rvm_find -L scripts -type f 2>/dev/null)
  do
    # Target is supposed to be a file, remove if it is a directory.
    if [[ -d "$rvm_path/$entry" ]]
    then __rvm_rm_rf "$rvm_path/$entry"
    fi
    if
      [[ "$entry" == "scripts/extras/completion.zsh/_rvm" || "$entry" == "scripts/zsh/Completion/_rvm" ]]
    then
      if [[ ! -f "$rvm_path/$entry" ]] || __rvm_rm_rf "$rvm_path/$entry" 2>/dev/null
      then __rvm_cp -f "$source_path/$entry" "$rvm_path/$entry"
      else rvm_log "    Can not update '$entry', it's a conflict between Zsh and multiuser installation, prefix the command with 'rvmsudo' to update this file."
      fi
    else
      \command \cat < "$source_path/$entry" > "$rvm_path/$entry"
      chmod_if_needed "$source_path/$entry" "$rvm_path/$entry"
    fi
  done
  true # for osx
}

cleanup_old_help_and_docs_files()
{
  find "$rvm_path/help" -type f \! \( -name '*.md' -o -name '*.txt' \) -exec rm '{}' \;
  find "$rvm_path/docs" -type f \! \( -name '*.md' -o -name '*.txt' \) -exec rm '{}' \;
  true # for osx
}

install_rvm_hooks()
{
  \typeset hook_x_flag entry name

  for entry in $(__rvm_find -L hooks -type f 2>/dev/null)
  do
    # Target is supposed to be a file, remove if it is a directory.
    if [[ -d "$rvm_path/$entry" ]]
    then __rvm_rm_rf "$rvm_path/$entry"
    fi
    # Source is first level hook (after_use) and target is custom user hook, preserve it
    if
      [[ -f "$rvm_path/$entry" ]] &&
      __rvm_grep -E '^hooks/[[:alpha:]]+_[[:alpha:]]+$' >/dev/null <<<"$entry" &&
      ! __rvm_grep "$(basename ${entry})_\*" "$rvm_path/$entry" >/dev/null
    then
      \command \mv -f "$rvm_path/$entry" "$rvm_path/${entry}_custom"
    fi
    hook_x_flag=0
    [[ -x "$rvm_path/$entry" ]] || hook_x_flag=$?

    __rvm_cp -f "$source_path/$entry" "$rvm_path/$entry"

    if (( hook_x_flag == 0 ))
    then [[ -x "$rvm_path/$entry" ]] || chmod a+rx "$rvm_path/$entry"
    fi
  done
}

remove_old_hooks()
{
  for entry in after_use_custom after_use after_cd
  do
    name=${entry#after_}
    name=${name%_*}
    if
      [[ -f "$rvm_path/hooks/$entry" ]] &&
      __rvm_grep "after_${name}_\*" "$rvm_path/hooks/$entry" >/dev/null
    then
      \command \rm -f "$rvm_path/hooks/$entry"
    fi
  done
}

install_binaries()
{
  \typeset -a files
  \typeset system_bin
  files=(
    rvm-prompt rvm rvmsudo rvm-shell rvm-smile rvm-exec rvm-auto-ruby
    ruby-rvm-env rvm-shebang-ruby
  )

  [[ -d "${rvm_bin_path}" ]] || mkdir -p "${rvm_bin_path}"

  for file in "${files[@]}"
  do
    if [[ -e "${rvm_bin_path}/${file}" ]] &&
    [[ ! -f "${rvm_bin_path}/${file}"  || -L "${rvm_bin_path}/${file}" ]]
    then \command \rm -f "${rvm_bin_path}/${file}"
    fi

    if
      [[ -L "${source_path}/bin/${file}" ]]
    then
      ln -s "$( readlink "${source_path}/bin/${file}" )" "${rvm_bin_path}/${file}"
    else
      \command \cat < "${source_path}/bin/${file}" > "${rvm_bin_path}/${file}"
    fi

    [[ -x "${rvm_bin_path}/${file}" ]] || chmod a+rx "${rvm_bin_path}/${file}"

    # try to clean old installer files left in usual places added to PATH
    for system_bin in ~/bin /usr/bin /usr/local/bin
    do
      if
        [[ "${system_bin}" != "${rvm_bin_path}" && -x "${system_bin}/${file}" ]]
      then
        \command \rm -f "${system_bin}/${file}" 2>/dev/null ||
        rvm_out "!!! could not remove ${system_bin}/${file}, remove it manually with:
!!! > sudo \command \rm -f ${system_bin}/${file}
"
      fi
    done
  done
  return 0
}

update_gemsets_rvmrc()
{
  if
    [[ -n "$2" ]]
  then
    if [[ -f ~/.rvmrc ]] && __rvm_grep "^$1=" ~/.rvmrc >/dev/null
    then __rvm_sed_i ~/.rvmrc -e "s/^$1=.*$/$1=\"$2\"/"
    else printf "%b" "\n$1=\"$2\"\n" >> ~/.rvmrc
    fi
  else
    if [[ -f ~/.rvmrc ]]
    then __rvm_sed_i ~/.rvmrc -e "/^$1=/ d"
    fi
  fi
}

install_gemsets()
{
  \typeset gemset_files

  if [[ ${rvm_keep_gemset_defaults_flag:-0} == 0 && -d "$rvm_path/gemsets" ]]
  then __rvm_find "$rvm_path/gemsets" -type f -exec rm '{}' \;
  fi

  [[ -d "$rvm_path/gemsets" ]] || mkdir -p "$rvm_path/gemsets"

  __rvm_read_lines gemset_files <(
    __rvm_find "gemsets" "${name_opt}" '*.gems'
  )

  for gemset_file in "${gemset_files[@]}"
  do
    destination="$rvm_path/gemsets/${gemset_file#gemsets/}"
    if
      [[ ! -s "$destination" ]]
    then
      destination_path="${destination%/*}"
      [[ -d "$destination_path" ]] || mkdir -p "$destination_path"
      \command \cat < "$gemset_file" > "$destination"
    fi
  done

  update_gemsets_rvmrc rvm_without_gems      "${rvm_without_gems}"
  update_gemsets_rvmrc rvm_with_gems         "${rvm_with_gems}"
  update_gemsets_rvmrc rvm_with_default_gems "${rvm_with_default_gems}"
}

install_patchsets()
{
  if
    [[ ${rvm_keep_patchsets_flag:-0} == 0 && -d "$rvm_path/patchsets" ]]
  then
    __rvm_find "$rvm_path/patchsets/" -type f -exec rm '{}' \;
  fi
  if
    [[ -d patchsets/ ]]
  then
    [[ -d "$rvm_path/patchsets" ]] || mkdir -p "$rvm_path/patchsets"
    patchsets=($(
      __rvm_find patchsets/ -type f
    ))
    for patchset_file in "${patchsets[@]}"
    do
      destination="$rvm_path/$patchset_file"
      if
        [[ ! -s "$destination" || "${patchset_file##*/}" == "default" ]]
      then
        if [[ -d "$destination"    ]]
        then \command \rm -f "$destination"
        fi
        \command \cat < "$patchset_file" > "$destination"
      fi
    done
  fi
}

install_man_pages()
{
  files=($(
    __rvm_cd "$install_source_path/man"
    __rvm_find . -maxdepth 2 -mindepth 1 -type f -print
  ))

  for file in "${files[@]//.\/}"
  do
    [[ -d $rvm_man_path/${file%\/*} ]] ||
    {
      mkdir -p $rvm_man_path/${file%\/*}
      install_fix_rights $rvm_man_path/${file%\/*}
    }
    __rvm_cp -Rf "$install_source_path/man/$file" "$rvm_man_path/$file" || \
      rvm_out "

    Please run the installer using rvmsudo to fix file permissions

"
    install_fix_rights "$rvm_man_path/$file"
  done
}

setup_configuration_files()
{
  \typeset _save_dir
  _save_dir="$PWD"
  __rvm_cd "$rvm_path"

  if [[ -f config/user ]]
  then \command \mv config/user user/db
  fi

  if [[ -f config/installs ]]
  then \command \mv config/installs user/installs
  fi

  if [[ -s config/rvmrcs ]]
  then \command \mv config/rvmrcs user/rvmrcs
  fi

  [[ -s user/db ]] ||
    echo '# User settings, overrides db settings and persists across installs.' >> user/db

  [[ -f user/rvmrcs ]] || > user/rvmrcs
  [[ -f user/md5    ]] || > user/md5
  [[ -f user/sha512 ]] || > user/sha512

  # Prune old (keyed-by-hash) trust entries
  __rvm_grep '^_' user/rvmrcs > user/rvmrcs.new || true
  \command \mv user/rvmrcs.new user/rvmrcs

  __rvm_cd "${_save_dir}"
}

setup_login_shell()
{
  if [ "$COLORTERM" = "gnome-terminal" ]
  then
    if __rvm_grep "entry name=['\"]login_shell['\"]" ~/.gconf/apps/gnome-terminal/profiles/Default/%gconf.xml > /dev/null
    then
      :
    else
      __rvm_sed_i "/<gconf>/ a<entry name='login_shell' mtime='`date +%s`' type='bool' value='true'/>" ~/.gconf/apps/gnome-terminal/profiles/Default/%gconf.xml
    fi
  fi
}

check_file_group()
{
  \typeset _group
  _group="$( __rvm_statf "%G" "%Sg" "$1" )"
  [[ "${_group}" == "$2" ]] || return $?
  true # for OSX
}

check_file_rights()
{
  \typeset _all
  _all="$( __rvm_statf "%A" "%Sp" "$1" )"
  shift
  while
    (( $# ))
  do
    case "$1" in
      (g+w) [[ "${_all:5:1}" == "w" ]] || return $? ;;
      (a+r) [[ "${_all:7:1}" == "r" ]] || return $? ;;
      (a-r) [[ "${_all:7:1}" == "-" ]] || return $? ;;
    esac
    shift
  done
  true # for OSX
}

permissions_warning()
{
  rvm_warn "    $1, prefix the command with 'rvmsudo' to fix it, if the situation persist report a bug."
  if [[ -n "${2:-}" ]]
  then return $2
  fi
}

install_fix_rights()
{
  (( ${rvm_user_install_flag:-0} == 0 ))   || return 0
  check_file_group  "$1" "$rvm_group_name" || chown :$rvm_group_name "$1" || permissions_warning "could not set group of '$1'"
  check_file_rights "$1" g+w               || chmod g+rwX "$1"            || permissions_warning "could not fix perissions of '$1'"
}

setup_etc_profile()
{
  export etc_profile_file="/etc/profile.d/rvm.sh"

  if [[ -s "${etc_profile_file}" ]] || (( ${rvm_auto_dotfiles_flag:-1} == 0 ))
  then return 0
  fi

  \typeset executable add_to_profile_flag zshrc_file ps_ucomm_alias
  if
    [[ -d /etc/profile.d ]]
  then
    add_to_profile_flag=0
    executable=1
  else
    add_to_profile_flag=1
    executable=0
    mkdir -p /etc/profile.d
  fi
  if [[ "$(uname)" == "SunOS" ]]
  then
    # Solaris default ps doesn't provide ucomm
    ps_ucomm_alias=comm
  else
    ps_ucomm_alias=ucomm
  fi

# partial duplication marker dkjnkjvnckbjncvbkjnvkj
# prevent from loading in sh shells
  printf "%b" "#
# RVM profile
#
# /etc/profile.d/rvm.sh # sh extension required for loading.
#

if
  [ -n \"\${BASH_VERSION:-}\" -o -n \"\${ZSH_VERSION:-}\" ] &&
  test \"\`\\\\command \\\\ps -p \$\$ -o ${ps_ucomm_alias}=\`\" != dash &&
  test \"\`\\\\command \\\\ps -p \$\$ -o ${ps_ucomm_alias}=\`\" != sh
then
  [[ -n \"\${rvm_stored_umask:-}\" ]] || export rvm_stored_umask=\$(umask)

  # Load user rvmrc configurations, if exist
  for file in \"/etc/rvmrc\" \"\$HOME/.rvmrc\"
  do
    [[ -s \"\$file\" ]] && source \$file
  done
  if
    [[ -n \"\${rvm_prefix:-}\" ]] &&
    [[ -s \"\${rvm_prefix}/.rvmrc\" ]] &&
    [[ ! \"\$HOME/.rvmrc\" -ef \"\${rvm_prefix}/.rvmrc\" ]]
  then
    source \"\${rvm_prefix}/.rvmrc\"
  fi

  # Load RVM if it is installed, try user then root install
  if
    [[ -s \"\$rvm_path/scripts/rvm\" ]]
  then
    source \"\$rvm_path/scripts/rvm\"
  elif
    [[ -s \"\$HOME/.rvm/scripts/rvm\" ]]
  then
    true \${rvm_path:=\"\$HOME/.rvm\"}
    source \"\$HOME/.rvm/scripts/rvm\"
  elif
    [[ -s \"/usr/local/rvm/scripts/rvm\" ]]
  then
    true \${rvm_path:=\"/usr/local/rvm\"}
    source \"/usr/local/rvm/scripts/rvm\"
  fi

  # Add \$rvm_bin_path to \$PATH if necessary. Make sure this is the last PATH variable change
  if [[ -n \"\${rvm_bin_path}\" && ! \":\${PATH}:\" == *\":\${rvm_bin_path}:\"* ]]
  then PATH=\"\${PATH}:\${rvm_bin_path}\"
  fi
fi
" > "${etc_profile_file}"

  if
    (( executable )) && check_file_rights "${etc_profile_file}" a-x
  then
    chmod a+rx "${etc_profile_file}" || permissions_warning "could not fix '${etc_profile_file}' rights"
  fi

  if
    (( add_to_profile_flag )) &&
    ! __rvm_grep "source ${etc_profile_file}" /etc/profile >/dev/null 2>&1
  then
    printf "%b" "\ntest -f ${etc_profile_file} && source ${etc_profile_file}\n" >> /etc/profile
  fi

  for zshrc_file in $(
      __rvm_find /etc/ -name zprofile -type f 2>/dev/null ;
      __rvm_find /etc/ -name zlogin   -type f 2>/dev/null ;
      true
    ) /etc/zprofile
  do
    if
      [[ ! -f "${zshrc_file}" ]]
    then
      printf "%b" "\ntest -f ${etc_profile_file} && source ${etc_profile_file}\n" > $zshrc_file
    elif
      ! __rvm_grep "source /etc/bash"    "${zshrc_file}" &&
      ! __rvm_grep "source /etc/profile" "${zshrc_file}"
    then
      printf "%b" "\ntest -f ${etc_profile_file} && source ${etc_profile_file}\n" >> $zshrc_file
    fi
    break # process only first file found
  done
}

print_etc_bashrc_change()
{
  printf "%b" "
type rvm >/dev/null 2>/dev/null || echo \${PATH} | __rvm_grep \"${rvm_bin_path}\" > /dev/null || export PATH=\"\${PATH}:${rvm_bin_path}\"
"
}

# Ubuntu does not source /etc/profile when we're running command such as "ssh my-ubuntu env"
# So we add source ${etc_profile_file} in /etc/bash.bashrc
setup_etc_bashrc()
{
  \typeset system_bashrc_file new_content_path
  system_bashrc_file="/etc/bash.bashrc"

  if [[ -s "${system_bashrc_file}" ]] || (( ${rvm_auto_dotfiles_flag:-1} == 0 ))
  then return 0
  fi

  if
    [[ ! -f "${system_bashrc_file}" ]]
  then
    print_etc_bashrc_change > "${system_bashrc_file}" 2>/dev/null ||
      permissions_warning "could not create '${system_bashrc_file}'" $? ||
      return $?
  elif
    ! __rvm_grep "PATH=.*${rvm_bin_path}" "${system_bashrc_file}" >/dev/null
  then
    new_content_path="$( mktemp ${TMPDIR:-/tmp}/tmp.XXXXXXXXXXXXXXXXXX )"
    [[ ! -f "${new_content_path}" ]] || \command \rm -f "${new_content_path}"
    {
      print_etc_bashrc_change # prepend
      __rvm_grep -v "|| export PATH=\"\${PATH}:\"" < "${system_bashrc_file}"
      true
    } > "${new_content_path}" &&
    \command \mv "${new_content_path}" "${system_bashrc_file}" 2>/dev/null ||
      permissions_warning "could not update '${system_bashrc_file}'" $? ||
      return $?
  fi
  check_file_rights $system_bashrc_file a+r ||
    chmod a+r $system_bashrc_file ||
    permissions_warning "File '$system_bashrc_file' is not readable for all users, this might cause problems in loading RVM" $? ||
    return $?
}

setup_etc_rvmrc()
{
  rvmrc_file="/etc/rvmrc"
  if
    [[ -f $rvmrc_file ]] &&
    __rvm_grep '#umask' $rvmrc_file >/dev/null
  then
    true # commented out, skip it!
  elif
    [[ -f $rvmrc_file ]] &&
    __rvm_grep 'umask g+w' $rvmrc_file >/dev/null
  then
    __rvm_sed_i $rvmrc_file -e 's/umask g+w/umask u=rwx,g=rwx,o=rx/'
  elif
    ! [[ -f $rvmrc_file ]] ||
    ! __rvm_grep 'umask' $rvmrc_file >/dev/null
  then
    echo 'umask u=rwx,g=rwx,o=rx' >> $rvmrc_file
  fi
  if
    [[ "${rvm_path}" != "/usr/local/rvm" ]] &&
    ! __rvm_grep 'rvm_path' $rvmrc_file >/dev/null
  then
    echo "rvm_path=\"${rvm_path}\"" >> $rvmrc_file
  fi
  if [[ -s $rvmrc_file ]]
  then install_fix_rights $rvmrc_file
  fi
  return 0
}

pick_a_file()
{
  \typeset _file _result
  _result=$1
  shift
  for _file
  do
    if
      [[ -f "$_file" ]]
    then
      eval "${_result}+=( \"\$_file\" )"
      return 0
    fi
  done
  eval "${_result}+=( \"\$1\" )"
}

setup_user_profile_check()
{
  case "${rvm_ignore_dotfiles_flag:-${rvm_ignore_dotfiles:-no}}" in
    (yes|1) return 1 ;;
  esac
  return 0
}

setup_user_profile_detect()
{
  etc_profile_file="/etc/profile.d/rvm.sh"
  search_list_mksh=( "$HOME/.mkshrc" "$HOME/.profile" )
  search_list_bash=( "$HOME/.bashrc" "$HOME/.bash_profile" "$HOME/.bash_login" )
  search_list_zsh=( "${ZDOTDIR:-${HOME}}/.zshenv" "${ZDOTDIR:-${HOME}}/.zprofile" "${ZDOTDIR:-${HOME}}/.zshrc" "${ZDOTDIR:-${HOME}}/.zlogin" )
  search_list=( "${search_list_mksh[@]}" "${search_list_bash[@]}" "${search_list_zsh[@]}" )

  target_rc=( "$HOME/.profile" "$HOME/.mkshrc" "$HOME/.bashrc" "${ZDOTDIR:-${HOME}}/.zshrc" )

  target_login=( "$HOME/.profile" )
  pick_a_file target_login "$HOME/.bash_profile" "$HOME/.bash_login"
  target_login+=( "${ZDOTDIR:-${HOME}}/.zlogin" )

  for profile_file in "${search_list[@]}"
  do
    if
      [[ -f "$profile_file" ]]
    then
      if
        __rvm_grep PATH=.*$local_rvm_path/bin "$profile_file" >/dev/null
      then
        found_rc+=( "$profile_file" )
      fi
      if
        __rvm_grep \..*scripts/rvm "$profile_file" >/dev/null
      then
        found_login+=( "$profile_file" )
      elif
        __rvm_grep source.*scripts/rvm "$profile_file" >/dev/null
      then
        found_login+=( "$profile_file" )
      fi
    fi
  done
}

setup_user_profile_summary()
{
  eval "\typeset __list_found=\"\${${1}[*]}\""
  \typeset __target="$2"
  rvm_log "    RVM ${__target} line found in ${__list_found}."

  \typeset __bash_included=0
  \typeset  __zsh_included=0
  __rvm_string_includes "${__list_found}" "${search_list_bash[@]}" || __bash_included=$?
  __rvm_string_includes "${__list_found}" "${search_list_zsh[@]}"  ||  __zsh_included=$?

  \typeset __missing=""
  if (( __bash_included>0 && __zsh_included>0  ))
  then __missing="Bash or Zsh"
  elif (( __bash_included>0 ))
  then __missing="Bash"
  elif (( __zsh_included>0 ))
  then __missing="Zsh"
  fi
  if [[ -n "${__missing}" ]]
  then rvm_warn "    RVM ${__target} line not found for ${__missing}, rerun this command with '--auto-dotfiles' flag to fix it."
  fi
}

setup_user_profile_rc()
{
  if
    (( rvm_auto_dotfiles_flag == 1 && ${#found_rc[@]} > 0 ))
  then
    rvm_out "    Removing rvm PATH line from ${found_rc[*]}."
    for profile_file in "${found_rc[@]}"
    do
      __rvm_sed_i "${profile_file}" -e '/PATH=.*'"$local_rvm_path_sed"'\/bin/ d;'
      # also delete duplicate blank lines
      __rvm_sed_i "${profile_file}" -e '/^\s*$/{ N; /^\n$/ D; };'
    done
    found_rc=()
  fi
  if
    (( rvm_auto_dotfiles_flag == 1 || ${#found_rc[@]} == 0 ))
  then
    rvm_out "    Adding rvm PATH line to ${target_rc[*]}."
    for profile_file in "${target_rc[@]}"
    do
      touch "$profile_file"
      printf "%b" "
# Add RVM to PATH for scripting. Make sure this is the last PATH variable change.
export PATH=\"\$PATH:$local_rvm_path/bin\"
" >> "$profile_file"
    done
  else
    setup_user_profile_summary found_rc "PATH"
  fi
}

setup_user_profile_login()
{
  if
    (( rvm_auto_dotfiles_flag == 1 && ${#found_login[@]} > 0 ))
  then
    rvm_out "    Removing rvm loading line from ${found_login[*]}."
    for profile_file in "${found_login[@]}"
    do
      __rvm_sed_i "${profile_file}" -e '/source.*scripts\/rvm/ d; /\. .*scripts\/rvm/ d;'
      # also delete duplicate blank lines
      __rvm_sed_i "${profile_file}" -e '/^\s*$/{ N; /^\n$/ D; };'
    done
    found_rc=()
  fi
  if
    (( rvm_auto_dotfiles_flag == 1 || ${#found_login[@]} == 0 ))
  then
    rvm_out "    Adding rvm loading line to ${target_login[*]}."
    for profile_file in "${target_login[@]}"
    do
      [[ -f "$profile_file" ]] ||
      {
        touch "$profile_file"
        if
          [[ "$profile_file" == "$HOME/.bash_"* && -f "$HOME/.profile" ]]
        then
          printf "%b" "
[[ -s \"\$HOME/.profile\" ]] && source \"\$HOME/.profile\" # Load the default .profile
" >> "$profile_file"
        fi
      }
      printf "%b" "
[[ -s \"$local_rvm_path/scripts/rvm\" ]] && source \"$local_rvm_path/scripts/rvm\" # Load RVM into a shell session *as a function*
" >> "$profile_file"
    done
  else
    setup_user_profile_summary found_login "sourcing"
  fi
}

setup_user_profile()
{
  setup_user_profile_check || return 0

  export user_profile_file
  \typeset -a search_list search_list_mksh search_list_bash search_list_zsh
  \typeset -a target_rc target_login found_rc found_login
  \typeset etc_profile_file profile_file local_rvm_path local_rvm_path_sed
  local_rvm_path="${rvm_path/#$HOME/\$HOME}"
  local_rvm_path_sed="\\${local_rvm_path//\./\\.}"
  local_rvm_path_sed="${local_rvm_path_sed//\//\/}"

  setup_user_profile_detect
  setup_user_profile_rc
  setup_user_profile_login

  true # for osx
}

warning_no_loading_of_rvm()
{
  rvm_error "    Warning! Installing RVM in system mode without root permissions, make sure to modify PATH / source rvm when it's needed."
}

cleanse_old_environments()
{
  if
    [[ -d "$rvm_path/environments" ]]
  then
    for file in "$rvm_path/environments"/*
    do
      # Remove broken links
      if
        [[ -L "$file" && ! -e "$file" ]]
      then
        rm -f "$file"
      fi
      if
        [[ -f "$file" ]]
      then
        # Remove BUNDLE_PATH from environment files
        if
          __rvm_grep 'BUNDLE_PATH' "$file" >/dev/null 2>&1
        then
          __rvm_grep -v 'BUNDLE_PATH' "$file" > "$file.new" &&
          \command \mv "$file.new" "$file"
        fi
        # regenerate when found broken path :/bin:/bin or missing $PATH
        if
          __rvm_grep ':/bin:/bin' "$file" >/dev/null 2>&1 ||
          __rvm_grep "[^_]PATH=" "$file" | __rvm_grep -v "\$PATH" >/dev/null 2>&1
        then
          ruby_version="${file##*environments/}"
          rvm_out "    Fixing environment for ${ruby_version}."
          __rvm_with "${ruby_version}" __rvm_ensure_has_environment_files
        fi
      fi
    done
  fi
}

migrate_old_gemsets()
{
  for gemset in "$rvm_path"/gems/*\%*
  do
    new_path=${gemset/\%/${rvm_gemset_separator:-"@"}}
    if
      [[ -d "$gemset" ]] && [[ ! -d "$new_path" ]]
    then
      rvm_out "    Renaming $(basename "$gemset") to $(basename "$new_path") for new gemset separator."
      \command \mv "$gemset" "$new_path"
    fi
  done

  for gemset in "$rvm_path"/gems/*\+*
  do
    new_path=${gemset/\+/${rvm_gemset_separator:-"@"}}
    if
      [[ -d "$gemset" && ! -d "$new_path" ]]
    then
      rvm_out "    Renaming $(basename "$gemset") to $(basename "$new_path") for new gemset separator."
      \command \mv $gemset $new_path
    fi
  done

  for gemset in "$rvm_path"/gems/*\@
  do
    new_path="$( __rvm_sed -e 's#\@$##' <<<"$gemset" )"
    if
      [[ -d "$gemset" && ! -d "$new_path" ]]
    then
      rvm_out "    Fixing: $(basename "$gemset") to $(basename "$new_path") for new gemset separator."
      \command \mv "$gemset" "$new_path"
    fi
  done
}

# Move from legacy defaults to the new, alias based system.
migrate_defaults()
{
  [[ -s "$rvm_path/config/default" ]] || return 0

  \typeset original_version="$(
    basename "$(
      __rvm_grep GEM_HOME "$rvm_path/config/default" |
        __rvm_awk -F"'" '{print $2}' | __rvm_sed "s#\%#${rvm_gemset_separator:-"@"}#"
    )"
  )"
  if [[ -n "$original_version" ]]
  then "$rvm_scripts_path/alias" create default "$original_version" &> /dev/null
  fi
  __rvm_rm_rf "$rvm_path/config/default"
}

migrate_environments_and_wrappers()
{
  \typeset environment_file wrappers_path new_path ruby_version

  for environment_file in "$rvm_path"/environments/*
  do
    ruby_version="${environment_file##*/}"
    new_path="$rvm_path/gems/${ruby_version}/environment"
    if
      [[ -f "$environment_file" && ! -L "$environment_file" && -d "${new_path%/*}" && ! -e "$new_path" ]]
    then
      rvm_out "    Migrating environment ${ruby_version} to use with 'gem-wrappers' gem."
      \command \mv "$environment_file" "$new_path" && \command \ln -s "$new_path" "$environment_file"
    fi
  done

  for wrappers_path in "$rvm_path"/wrappers/*
  do
    ruby_version="${wrappers_path##*/}"
    new_path="$rvm_path/gems/${ruby_version}/wrappers"
    if
      [[ -d "$wrappers_path" && ! -L "$wrappers_path" && -d "${new_path%/*}" && ! -e "$new_path" ]]
    then
      rvm_out "    Migrating wrappers ${ruby_version} to use with 'gem-wrappers' gem."
      \command \mv "$wrappers_path" "$new_path" && \command \ln -snf "$new_path" "$wrappers_path"
    fi
  done

  __rvm_grep -rl 'unset GEM_HOME' "$rvm_path/gems"/*/environment "$rvm_path/environments"/ 2>/dev/null |
  while read environment_file
  do
    ruby_version="${environment_file%/environment}"
    ruby_version="${ruby_version##*/}"
    rvm_out "    Fixing environment for ${ruby_version}."
    __rvm_with "${ruby_version}" __rvm_ensure_has_environment_files
  done
}

create_gems_aliases()
{
  [[ -s "$rvm_path/config/alias" ]] || return 0
  \typeset __alias __ruby
  \typeset -a __aliases
  __rvm_read_lines __aliases "$rvm_path/config/alias"
  for __alias in "${__aliases[@]}"
  do
    __ruby="${__alias#*=}"
    __alias="${__alias%%=*}"
    [[ -e "$rvm_path/gems/${__alias}" ]] ||
      \command \ln -snf "$rvm_path/gems/${__ruby}" "$rvm_path/gems/${__alias}"
  done
}

restore_missing_environments()
{
  if
    [[ -d "$rvm_path/rubies" ]]
  then
    [[ -d "$rvm_path/environments" ]] || mkdir -p "$rvm_path/environments"

    for ruby_path in "$rvm_path"/rubies/*
    do
      ruby_version="${ruby_path##*/}"
      environment_path="$rvm_path/environments/${ruby_version}"
      if
        [[ "${ruby_version}" == "*" || -e "$environment_path" ]]
      then
        true
      elif
        [[ "${ruby_version}" == "gems" ]]
      then
        rvm_out "    Removing unexpected ruby: ${ruby_version}."
        \command \rm -rf "${ruby_path}"
      elif
        [[ -L "$ruby_path" ]]
      then
        ruby_target="$(readlink "$ruby_path")"
        ruby_target="${ruby_target##*/}"
        environment_tareget="$rvm_path/environments/${ruby_target}"
        rvm_out "    Fixing environment link for ${ruby_version}."
        \command \ln -nsf "$environment_tareget" "$environment_path"
      else
        rvm_out "    Fixing environment for ${ruby_version}."
        __rvm_with "${ruby_version}" __rvm_ensure_has_environment_files
      fi
    done
  fi
}

record_ruby_configs()
{
  __rvm_record_ruby_configs
}

update_gemsets_install_rvm()
{
  \typeset _iterator _gem installed found missing _current_path
  \typeset -a paths missing

  [[ ${rvm_keep_gemset_defaults_flag:-0} == 0 ]] || return 0

  # rvm /gems
  paths=($(
    __rvm_find "$rvm_path/gems" -maxdepth 1 "${name_opt}" '*@global'
  ))

  for _gem in rvm gem-wrappers
  do
    [[ " ${rvm_without_gems:-} " == *" ${_gem} "* ]] ||
    {
      missing=()

      for _iterator in "${paths[@]}"
      do
        # skip unless this ruby is installed
        installed="${_iterator%@global}"
        installed="${installed/\/gems\//\/rubies\//}/bin"
        installed="${installed//\\/}"
        [[ -x "${installed}/ruby" ]] || continue
        [[ -x "${installed}/gem" ]] || continue

        _current_path="${_iterator%%+(\/)}/gems"
        # rvm /gems @global /gems
        found=($(
          [[ ! -d "${_current_path}" ]] ||
          __rvm_find "${_current_path}" -maxdepth 1 "${name_opt}" ${_gem}-'*'
        ))
        (( ${#found[@]} > 0 )) || missing+=( "${installed}=${_iterator}" )
      done

      if
        (( ${#missing[@]} > 0 ))
      then
        for _iterator in "${missing[@]}"
        do
          __gem_home="${_iterator#*=}"
          __rvm_with "${__gem_home##*/}" gem_install ${_gem}
        done | __rvm_dotted "    Installing ${_gem} gem in ${#missing[@]} gemsets"
      fi

      if
        [[ "${_gem}" == "gem-wrappers" ]] &&
        (( ${#missing[@]} > 0 ))
      then
        for _iterator in "${missing[@]}"
        do
          installed="${_iterator#*=}"
          installed="${installed%@global}"
          for __gem_home in "${installed}"{,@*}
          do
            if [[ "${__gem_home}" == *"@*" ]]
            then continue
            fi
            __rvm_with "${__gem_home##*/}" gem pristine gem-wrappers --only-plugins
            __rvm_with "${__gem_home##*/}" gem wrappers regenerate
          done
        done | __rvm_dotted "    Regenerating gem wrappers in ${#missing[@]} rubies"
      fi
    }
  done
}

configure_autolibs()
(
  # remove old version from rvmrc
  for rvmrc in /etc/rvmrc "$HOME/.rvmrc"
  do
    if
      [[ -s "$rvmrc" ]] &&
      __rvm_grep 'rvm_autolibs_flag=' "$rvmrc" >/dev/null 2>&1
    then
      [[ -w "$rvmrc" ]] &&
      __rvm_sed '/rvm_autolibs_flag=/ d' < "$rvmrc" > "$rvmrc.backup" &&
      \command \mv -f "$rvmrc.backup" "$rvmrc" ||
      rvm_error "    Can not automatically remove lines with 'rvm_autolibs_flag=' from '$rvmrc', please clean it manually."
    fi
  done

  if
    [[ -s "$rvmrc" ]] &&
    __rvm_grep 'rvm_autolibs_flag=' "$rvmrc" >/dev/null 2>&1
  then
    export rvm_autolibs_flag="$( __rvm_awk -F'=' '/rvm_autolibs_flag=/{print $2}' <"$rvmrc" )"
    [[ -w "$rvmrc" ]] &&
    __rvm_sed '/rvm_autolibs_flag/ d' < "$rvmrc" > "$rvmrc.backup" &&
    \command \mv -f "$rvmrc.backup" "$rvmrc" || true
  fi

  # migrate SMF settings
  rvmrc=/etc/rvmrc
  if
    [[ -s "$rvmrc" ]] &&
    __rvm_grep 'rvm_configure_env=.*/opt/sm' "$rvmrc" >/dev/null 2>&1
  then
    export rvm_autolibs_flag=smf
    [[ -w "$rvmrc" ]] &&
    __rvm_sed '/rvm_configure_env/ d' < "$rvmrc" > "$rvmrc.backup" &&
    \command \mv -f "$rvmrc.backup" "$rvmrc" || true
  fi

  [[ -n "${rvm_autolibs_flag:-}" ]] || return 0

  # save if proper value
  if
    __rvm_autolibs_translate
  then
    __rvm_db_ "$rvm_user_path/db" "autolibs" "$rvm_autolibs_flag"
  else
    rvm_error "    Unknown mode '$rvm_autolibs_flag' for autolibs, please read 'rvm autolibs'."
    return 1
  fi

  if [[ -x "${rvm_bin_path}/brew" && -L "${rvm_bin_path}/brew" ]]
  then \command \rm -rf "${rvm_bin_path}/brew"
  fi
)

update_yaml_if_needed()
{
  \typeset yaml_version
  __rvm_db "yaml_version" "yaml_version"
  if
    libyaml_installed &&
    ! __rvm_grep -r "${yaml_version//\./\\.}" "${rvm_usr_path:=$rvm_path/usr}" >/dev/null 2>&1
  then
    __rvm_log_command "update_yaml" \
      "    Updating libyaml in $rvm_usr_path to version $yaml_version, see https://github.com/rvm/rvm/issues/2594 " \
      install_libyaml
  fi
}

record_installation_time()
{
  __rvm_date +%s > $rvm_path/installed.at
  [[ -s "$rvm_path/RELEASE" ]] || echo "manual" > "$rvm_path/RELEASE"
  touch "$rvm_path/config/displayed-notes.txt"
  return 0
}

cleanup_tmp_files()
{
  files=($(
    __rvm_find "$rvm_path/" -mindepth 1 -maxdepth 2 "${name_opt}" '*.swp' -type f
  ))
  if
    (( ${#files[@]} > 0 ))
  then
    rvm_out "    Cleanup any .swp files."
    \command \rm -f  "${files[@]}"
  fi
}

setup_rvm_path_permissions_root()
{
  # ignore if not root
  (( UID == 0 )) || return 0
  chown -R root:"$rvm_group_name" "$rvm_path"

  chmod -R u+rwX,g+rwX,o+rX "$rvm_path"

  if [[ -d "$rvm_path" ]]
  then __rvm_find "$rvm_path" -type d -print0 | __rvm_xargs -n1 -0 chmod g+s
  fi

  chmod -R g-ws "$rvm_path/scripts/zsh" "$rvm_path/scripts/extras/completion.zsh"
}

setup_rvm_path_permissions_check_single()
{
  \typeset __ignore __message __file
  __ignore="$1"
  __message="$2"
  shift 2
  \typeset -a __found
  __rvm_read_lines __found <( "$@" )
  if
    (( ${#__found[@]} > __ignore ))
  then
    permissions_warning "Found ${#__found[@]} ${__message},
use \`--debug\` to see the list, run \`rvmsudo rvm get stable\` to fix it."
    if
      (( ${rvm_debug_flag:-0} ))
    then
      for __file in "${__found[@]}"
      do printf "%b" "        ${__file}\n"
      done
    fi
  fi
}

setup_rvm_path_permissions_check_group()
{
  setup_rvm_path_permissions_check_single 0 "files not belonging to '$rvm_group_name'" \
    __rvm_find "$rvm_path" \! -group "$rvm_group_name"
}

setup_rvm_path_permissions_check_dirs()
{
  setup_rvm_path_permissions_check_single 3 "directories with mode different than '775'" \
    __rvm_find "$rvm_path" -type d \! -perm -2775
}

setup_rvm_path_permissions_check_files()
{
  setup_rvm_path_permissions_check_single 2 "files with mode different than '664' or '775'" \
    __rvm_find "$rvm_path" \! -type d \! -type l \! -perm -775 \! -perm -664
}

print_install_footer()
{
  true ${upgrade_flag:=0}
  \typeset itype profile_file

  if (( upgrade_flag == 0 ))
  then itype=Installation
  else itype=Upgrade
  fi

  if
    (( upgrade_flag == 0 ))
  then
    profile_file="${user_profile_file:-${etc_profile_file:-$rvm_path/scripts/rvm}}"
    rvm_log "$itype of RVM in $rvm_path/ is almost complete:"
    if
      (( ${rvm_user_install_flag:=0} == 0 )) &&
      [[ -z "${rvm_add_users_to_rvm_group:-}" ]]
    then
      rvm_out "
  * First you need to add all users that will be using rvm to '${rvm_group_name}' group,
    and logout - login again, anyone using rvm will be operating with \`umask u=rwx,g=rwx,o=rx\`."
    fi
    rvm_out "
  * To start using RVM you need to run \`source ${profile_file}\`
    in all your open shell windows, in rare cases you need to reopen all shell windows."
  else
    rvm_notify "$itype of RVM in $rvm_path/ is complete."
  fi
}

display_notes()
{
  if (( upgrade_flag == 0 ))
  then bash ./scripts/notes initial
  else bash ./scripts/notes upgrade
  fi
}
src/rvm/scripts/functions/rvmrc_project000066400000016456147511530550014464 0ustar00#!/usr/bin/env bash

# Checks the rvmrc for the given directory. Note that if
# argument is passed, it will be used instead of pwd.
__rvm_project_rvmrc()
{
  export __rvm_project_rvmrc_lock
  : __rvm_project_rvmrc_lock:${__rvm_project_rvmrc_lock:=0}
  : __rvm_project_rvmrc_lock:$((__rvm_project_rvmrc_lock+=1))
  if (( __rvm_project_rvmrc_lock > 1 ))
  then return 0 # no nesting
  fi

  \typeset working_dir found_file rvm_trustworthiness_result save_PATH

  # Get the first argument or the pwd.
  working_dir="${1:-"$PWD"}"
  save_PATH="${PATH}"

  while :
  do
    if
      [[ -z "$working_dir" || "$HOME" == "$working_dir" || "${rvm_prefix:-}" == "$working_dir" || "$working_dir" == "." ]]
    then
      if (( ${rvm_project_rvmrc_default:-0} >= 1 ))
      then rvm_previous_environment=default
      fi
      if [[ -n "${rvm_previous_environment:-""}" ]] && (( ${rvm_project_rvmrc_default:-0} < 2 ))
      then __rvm_load_environment "$rvm_previous_environment"
      fi
      __rvm_file_env_check_unload
      unset rvm_current_rvmrc rvm_previous_environment
      break
    else
      if
        __rvm_project_dir_check "$working_dir" found_file
      then
        rvm_trustworthiness_result=0
        if
          [[ "${found_file}" != "${rvm_current_rvmrc:-""}" ]]
        then
          __rvm_conditionally_do_with_env __rvm_load_project_config "${found_file}" ||
          {
            rvm_trustworthiness_result=$?
            PATH="${save_PATH}" # restore PATH if project file load failed
            unset RVM_PROJECT_PATH
          }
        fi
        unset __rvm_project_rvmrc_lock
        return "$rvm_trustworthiness_result"
      else
        working_dir="${working_dir%/*}"
      fi
    fi
  done

  unset __rvm_project_rvmrc_lock
  return 1
}

__rvm_load_project_config()
{
  rvm_debug "__rvm_load_project_config $1"
  \typeset __gemfile _bundle_install
  \typeset -a __file_env_variables
  __file_env_variables=()
  __gemfile=""
  rvm_previous_environment="$(__rvm_env_string)"
  : rvm_autoinstall_bundler_flag:${rvm_autoinstall_bundler_flag:=0}
  case "$1" in
    (*/.rvmrc)
      __rvmrc_warning_display_for_rvmrc "$1"
      if
        __rvm_check_rvmrc_trustworthiness "$1"
      then
        __rvm_remove_rvm_from_path ; __rvm_conditionally_add_bin_path
        rvm_current_rvmrc="$1"
        __rvm_ensure_is_a_function

        unset GEM_HOME GEM_PATH
        rvm_ruby_string="${rvm_previous_environment/system/default}" rvm_action=use source "$1" ||
          return $?
      else
        return $?
      fi
      ;;

    (*/.versions.conf)
      __rvm_ensure_is_a_function
      rvm_current_rvmrc="$1"

      rvm_ruby_string="$( \command \tr -d '\r' <"$1" | __rvm_sed -n '/^ruby=/ {s/ruby=//;p;}' | tail -n 1 )"
      [[ -n "${rvm_ruby_string}" ]] || return 2
      rvm_gemset_name="$( \command \tr -d '\r' <"$1" | __rvm_sed -n '/^ruby-gemset=/ {s/ruby-gemset=//;p;}' | tail -n 1 )"
      rvm_create_flag=1 __rvm_use   || return 3

      __rvm_file_load_env_and_trust "$1" "env-"

      _bundle_install="$( \command \tr -d '\r' <"$1" | __rvm_sed -n '/^ruby-bundle-install=/ {s/ruby-bundle-install=//;p;}' )"
      if
        [[ -n "${_bundle_install}" ]]
      then
        if [[ -f "${_bundle_install}" ]]
        then __gemfile="${_bundle_install}"
        else __gemfile="${1%/*}/Gemfile"
        fi
      fi
      ;;

    (*/Gemfile)
      __rvm_ensure_is_a_function
      rvm_current_rvmrc="$1"

      rvm_ruby_string="$( \command \tr -d '\r' <"$1" | __rvm_sed -n '/^#ruby=/ {s/#ruby=//;p;}' | tail -n 1 )"
      [[ -n "${rvm_ruby_string}" ]] || {
        rvm_ruby_string="$(
          \command \tr -d '\r' <"$1" |
          __rvm_sed -n "s/[[:space:]]+rescue[[:space:]]+nil$//; /^\s*ruby[[:space:](]/ {s/^\s*ruby//; s/[[:space:]()'\"]//g; p;}" |
          \tail -n 1
        )"
        [[ -n "${rvm_ruby_string}" ]] || return 2

        rvm_ruby_string="${rvm_ruby_string%%\#*}"
        rvm_ruby_string="${rvm_ruby_string/,:engine=>/-}"
        rvm_ruby_string="${rvm_ruby_string/,engine:/-}"
        rvm_ruby_string="${rvm_ruby_string/,:engine_version=>[^,]*/}"
        rvm_ruby_string="${rvm_ruby_string/,engine_version:[^,]*/}"
        rvm_ruby_string="${rvm_ruby_string/,:patchlevel=>/-p}"
        rvm_ruby_string="${rvm_ruby_string/,patchlevel:/-p}"
      } #'
      rvm_gemset_name="$( \command \tr -d '\r' <"$1" | __rvm_sed -n '/^#ruby-gemset=/ {s/#ruby-gemset=//;p;}' | tail -n 1 )"
      if [[ -z "${rvm_gemset_name:-}" && -f "${1%/*}/.ruby-gemset" ]]
      then rvm_gemset_name="$( \command \tr -d '\r' <"${1%/*}/.ruby-gemset" )"
      fi
      __rvmrc_warning_display_for_Gemfile "$1"

      rvm_create_flag=1 __rvm_use   || return 3

      __rvm_file_load_env_and_trust "$1" "#ruby-env-"
      __gemfile="$1"
      ;;

    (*/.ruby-version|*/.rbfu-version|*/.rbenv-version)
      __rvm_ensure_is_a_function
      rvm_current_rvmrc="$1"

      rvm_ruby_string="$( \command \tr -d '\r' <"$1" )"
      if [[ -z "${rvm_ruby_string}" ]]
      then return 2
      fi
      if [[ -f "${1%/*}/.ruby-gemset" ]]
      then rvm_gemset_name="$( \command \tr -d '\r' <"${1%/*}/.ruby-gemset" )"
      else rvm_gemset_name=""
      fi
      rvm_create_flag=1 __rvm_use || return 3

      __rvm_file_load_env_and_trust "${1%/*}/.ruby-env"
      __rvm_file_load_env_and_trust "${1%/*}/.rbenv-vars"
      __gemfile="${1%/*}/Gemfile"
      ;;

    (*)
      rvm_error "Unsupported file format for '$1'"
      return 1
      ;;
  esac

  __rvm_file_set_env

  if
    [[ "${rvm_autoinstall_bundler_flag:-0}" == 1 && -n "${__gemfile:-}" && -f "${__gemfile:-}" ]]
  then
    __rvm_which bundle >/dev/null 2>&1 ||
      gem install --remote bundler
    bundle install --gemfile="${__gemfile}" | __rvm_grep -vE '^Using|Your bundle is complete'
  fi
}

# Detect if project file is in given PATH,
#
# Usage:
#   __rvm_project_dir_check <file_or_dir_to_check> [variable_name_to_set [default_value]]
#
# @param file_or_dir_to_check  file or directory to check if it's valid project file
# @param variable_name_to_set  when project file is found - set this variable to it's location
# @param default_value         when no project file found - set variable to this value
# @return                      0 - found, >0 - not found
# @env   RVM_PROJECT_PATH      unsets when not found, sets to project root when found
__rvm_project_dir_check()
{
  \typeset _found_file path_to_check variable variable_default
  \typeset -a _valid_files
  path_to_check="$1"
  variable="${2:-}"
  variable_default="${3:-}"
  _valid_files=(
    "$path_to_check"
    "$path_to_check/.rvmrc" "$path_to_check/.versions.conf" "$path_to_check/.ruby-version"
    "$path_to_check/.rbfu-version" "$path_to_check/.rbenv-version" "$path_to_check/Gemfile"
  )

  __rvm_find_first_file _found_file "${_valid_files[@]}" || true

  if
    [[ ! -s "$_found_file" ||
      "${_found_file}" == "$HOME/.rvmrc"
    ]]
  then
    _found_file=""
  elif
    [[ "${_found_file##*/}" == "Gemfile" ]] &&
    ! __rvm_grep    "^#ruby="  "$_found_file" >/dev/null &&
    ! __rvm_grep -E "^\s*ruby" "$_found_file" >/dev/null
  then
    _found_file=""
  fi

  if [[ -n "$variable" ]]
  then eval "$variable=\"\${_found_file:-$variable_default}\""
  fi

  if
    [[ -n "${_found_file:-$variable_default}" ]]
  then
    RVM_PROJECT_PATH="${_found_file:-$variable_default}"
    RVM_PROJECT_PATH="${RVM_PROJECT_PATH%/*}"
  else
    \typeset __result=$?
    unset RVM_PROJECT_PATH
    return $__result
  fi
}
src/rvm/scripts/functions/irbrc000066400000000370147511530550012672 0ustar00#!/usr/bin/env bash

# Create the irbrc for the currently selected ruby installation.
__rvm_irbrc()
{
  if
    [[ -d "$rvm_ruby_home" && ! -s "$rvm_ruby_irbrc" ]]
  then
    __rvm_cp "$rvm_scripts_path/irbrc" "$rvm_ruby_irbrc" || return $?
  fi
}

src/rvm/scripts/functions/tools000066400000000422147511530550012727 0ustar00#!/usr/bin/env bash

tools_strings()
{
  \typeset __ruby_name
  for __ruby_name in "$@"
  do
    if
      __rvm_select "$__ruby_name" 1>&2
    then
      echo "${rvm_ruby_gem_home##*/}"
    else
      : status:$?
      echo ""
    fi
    __rvm_unset_ruby_variables
  done
}
src/rvm/scripts/functions/utility_rubygems000066400000002664147511530550015221 0ustar00#!/usr/bin/env bash

rubygems_detect_ruby_lib_gem_path_from()
{
  ruby_lib_gem_path="$( __rvm_ruby_config_get ${1}prefix "$ruby_path" )" || ruby_lib_gem_path=""
  [[ -z "${ruby_lib_gem_path:-}" ]] ||
  {
    ruby_lib_gem_path="$( __rvm_ruby_config_get ${1}dir  "$ruby_path" )" || ruby_lib_gem_path=""
    ruby_lib_gem_path="${ruby_lib_gem_path%/*}"
  }
  [[ -n "${ruby_lib_gem_path:-}"    ]] || return 1
  [[ -d "${ruby_lib_gem_path}/gems" ]] || return 2
}

rubygems_detect_ruby_lib_gem_path_fallback()
{
  rubygems_detect_ruby_lib_gem_path_from "rubylib" ||
  rubygems_detect_ruby_lib_gem_path_from "lib"     ||
  return $?

  ruby_lib_gem_path+="/gems"

  \typeset ruby_version
  ruby_version="$( __rvm_ruby_config_get ruby_version "$ruby_path")" || ruby_version=""
  if
    [[ -n "${ruby_version:-}" && -d "${ruby_lib_gem_path}/${ruby_version:-}" ]]
  then
    ruby_lib_gem_path+="$ruby_version"
  elif
    [[ -d "${ruby_lib_gem_path}/shared" ]]
  then
    ruby_lib_gem_path+="shared"
  else
    return 3
  fi
}

rubygems_detect_ruby_lib_gem_path()
{
  \typeset ruby_path
  ruby_path="$( __rvm_which "${1:-ruby}" )" ||
  {
    rvm_error "Missing 'ruby' in 'rubygems_detect_ruby_lib_gem_path'."
    return 1
  }

  ruby_lib_gem_path="$(
    unset GEM_HOME GEM_PATH
    "$ruby_path" -rrubygems -e 'puts Gem.default_dir' 2>/dev/null
  )" || ruby_lib_gem_path=""

  [[ -n "$ruby_lib_gem_path" ]] ||
  rubygems_detect_ruby_lib_gem_path_fallback ||
  return $?
}
src/rvm/scripts/functions/rvmrc_env000066400000006001147511530550013567 0ustar00#!/usr/bin/env bash

# Read variables from file, if there are any variables asks user to trust it,
#
# Usage:
#   __rvm_file_load_env_and_trust <file_to_load> [variables_prefix]
#
# @param file_to_load          the file to load variables from
# @param variables_prefix      optional filter for variables, ex: "#ruby-env-"
# @env   __file_env_variables  contains the variables loaded from file, empty if user does not trust the file
#
__rvm_file_load_env_and_trust()
{
  [[ -f "$1" ]] || return 0

  __rvm_file_load_env "$1" "${2:-}"
  if
    (( ${#__file_env_variables[@]} == 0 )) ||
    __rvm_check_rvmrc_trustworthiness "$1"
  then
    true
  else
    rvm_debug "Envirionment variables variables from '$1' wont be loaded because of lack of trust (status=$?)."
    __file_env_variables=()
  fi
}

# Read variables from file,
#
# Usage:
#   __rvm_file_load_env_and_trust <file_to_load> [variables_prefix]
#
# @param file_to_load          the file to load variables from
# @param variables_prefix      optional filter for variables, ex: "#ruby-env-"
# @env   __file_env_variables  contains the variables loaded from file,
#
__rvm_file_load_env()
{
  \typeset -a __sed_commands
  __sed_commands=()
  if [[ -n "${2:-}" ]]
  then __sed_commands+=( -e "/^$2/ !d" -e "s/^$2//" ) # filter other content and remove prefix
  else __sed_commands+=( -e "/^#/ d"   -e "/^$/ d"  ) # remove comments and empty lines
  fi
  __rvm_read_lines __file_env_variables <( { cat "$1"; echo ""; } | __rvm_sed "${__sed_commands[@]}" )
}

# Resets previously loaded environment,
# if any new variables are available - loads them,
#
# @env rvm_saved_env         used to restore variables, emptied out on the end
# @env __file_env_variables  used to load new variables
#
__rvm_file_set_env()
{
  __rvm_file_env_check_unload
  __rvm_set_env "rvm_saved_env" "${__file_env_variables[@]}"
}

# Resets previously loaded environment,
#
# @env rvm_saved_env  used to restore variables, emptied out on the end
#
__rvm_file_env_check_unload()
{
  if (( ${#rvm_saved_env[@]} > 0 ))
  then __rvm_set_env "" "${rvm_saved_env[@]}"
  fi
  rvm_saved_env=()
}

# Sets environment variables,
#
# Usage:
#   __rvm_set_env <save_to> [var1 [var2]...]
#
# @param save_to   store previous values of environment variables in this variable if it's provided
# @param var...    "key=value" pairs for the environment to set to
#
# @env ${save_to}  "key=value" pairs of saved environment
#
__rvm_set_env()
{
  \typeset __save_to __set __key __value
  __save_to="$1"
  shift
  for __set in "$@"
  do
    __key="${__set%%=*}"
    __value="${__set#*=}"
    case "$__value" in
      (\"*\")
        __value="${__value#\"}"
        __value="${__value%\"}"
        ;;
      (\'*\')
        __value="${__value#\'}"
        __value="${__value%\'}"
        ;;
    esac
    rvm_debug "key=$__key; value=$__value;"
    if [[ -n "${__save_to}" ]]
    then eval "${__save_to}+=( \"\${__key}=\${${__key}}\" )"
    fi
    if [[ -n "${__value}" ]]
    then eval "export \${__key}=\"\${__value}\""
    else eval "unset \${__key}"
    fi
  done
}
src/rvm/scripts/functions/utility_package000066400000006357147511530550014762 0ustar00#!/usr/bin/env bash

__rvm_fix_group_permissions()
{
  if
    \umask -S | __rvm_grep 'g=rw' >/dev/null
  then
    chmod -R g+rwX "$@"
  fi
}

# params: archive_file
__rvm_package_list()
{
  rvm_debug __rvm_package_list:$#: "$@"
  case "$1" in
    *.zip)
      unzip -Z -1 "$1"
      ;;
    *.tar.bz2)
      __rvm_tar tjf "$1"
      ;;
    *.tar.gz|*.tgz)
      __rvm_tar tzf "$1"
      ;;
    *)
      return 199
      ;;
  esac
}

__map_tar_excludes()
{
  \typeset __exclude_element
  for __exclude_element
  do __exclude_elements+=( --exclude "${__exclude_element}" )
  done
}

__rvm_package_extract_run()
{
  \typeset __extract_run_src __extract_run_target __exclude_elements
  __extract_run_src="$1"
  __extract_run_target="$2"
  shift 2
  __exclude_elements=()

  if
    [[ " ${rvm_tar_options:-} " != *" --no-same-owner "*  ]] &&
    __rvm_tar --help 2>&1 | __rvm_grep -- --no-same-owner >/dev/null
  then
    rvm_tar_options="${rvm_tar_options:-}${rvm_tar_options:+ }--no-same-owner"
  fi

  [[ -d "$__extract_run_target" ]] || mkdir -p "$__extract_run_target"
  case "$__extract_run_src" in
    *.zip)
      #__map_unzip_excludes
      unzip -q -o "$__extract_run_src" -d "$__extract_run_target"
      ;;
    *.tar.bz2)
      __map_tar_excludes "$@"
      if [[ -n "$ZSH_VERSION" ]]
      then __rvm_tar "${__exclude_elements[@]}" -xjf "$__extract_run_src" -C "$__extract_run_target" ${=rvm_tar_options:-}
      else __rvm_tar "${__exclude_elements[@]}" -xjf "$__extract_run_src" -C "$__extract_run_target" ${rvm_tar_options:-}
      fi
      ;;
    *.tar.gz|*.tgz)
      __map_tar_excludes "$@"
      if [[ -n "$ZSH_VERSION" ]]
      then __rvm_tar "${__exclude_elements[@]}" -xzf "$__extract_run_src" -C "$__extract_run_target" ${=rvm_tar_options:-}
      else __rvm_tar "${__exclude_elements[@]}" -xzf "$__extract_run_src" -C "$__extract_run_target" ${rvm_tar_options:-}
      fi
      ;;
    *)
      return 199
      ;;
  esac &&
  __rvm_fix_group_permissions "$__extract_run_target"/* ||
  return $?
}

# params: archive_file path [excludes...]
__rvm_package_extract()
{
  rvm_debug __rvm_package_extract:$#: "$@"
  \typeset __extract_src __extract_target __tempdir __path __file __return
  __extract_src="$1"
  __extract_target="$2"
  shift 2
  __return=0
  __tempdir="$( TMPDIR="${rvm_tmp_path}" mktemp -d -t rvm-tmp.XXXXXXXXX )"
  __rvm_package_extract_run "$__extract_src" "$__tempdir" "$@" || __return=$?
  if
    (( __return == 0 ))
  then
    for __path in "$__tempdir"/*
    do
      __file="${__path##*/}"
      if
        [[ -n "${__file}" && -e "$__extract_target/${__file}" ]]
      then
        \command \rm -rf "$__extract_target/${__file}" || __return=$?
      fi
      \command \mv -f "${__path}" "$__extract_target/" || __return=$?
    done
  fi
  if [[ -n "$__tempdir" ]]
  then \command \rm -rf "$__tempdir"
  fi
  return $__return
}

# params: archive_file [path [path2]]
__rvm_package_create()
{
  rvm_debug __rvm_package_create:$#: "$@"
  case "$1" in
    *.tar.bz2)
      if [[ -z "${3:-}" ]]
      then __rvm_tar cjf "$1" "$2"
      else __rvm_tar cjf "$1" -C "$2" "$3"
      fi
      ;;
    *.tar.gz|*.tgz)
      if [[ -z "${3:-}" ]]
      then __rvm_tar czf "$1" "$2"
      else __rvm_tar czf "$1" -C "$2" "$3"
      fi
      ;;
    *)
      return 199
      ;;
  esac
}
src/rvm/scripts/functions/env000066400000017640147511530550012371 0ustar00#!/usr/bin/env bash

#
# Environment manipulation functions.
#

__rvm_nuke_rvm_variables()
{
  unset rvm_head_flag $(env | __rvm_awk -F= '/^rvm_/{print $1" "}')
}

# Unset ruby-specific variables
__rvm_unset_ruby_variables()
{
  # unset rvm_ruby_flag $(env | __rvm_awk -F= '/^rvm_ruby_/{printf $1" "}')
  unset rvm_env_string rvm_ruby_string rvm_ruby_strings rvm_ruby_binary rvm_ruby_gem_home rvm_ruby_gem_path rvm_ruby_home rvm_ruby_interpreter rvm_ruby_irbrc rvm_ruby_log_path rvm_ruby_major_version rvm_ruby_minor_version rvm_ruby_package_name rvm_ruby_patch_level rvm_ruby_release_version rvm_ruby_repo_url rvm_ruby_repo_branch rvm_ruby_revision rvm_ruby_selected_flag rvm_ruby_tag rvm_ruby_version rvm_head_flag rvm_ruby_package_file rvm_ruby_configure rvm_ruby_name rvm_ruby_url rvm_ruby_global_gems_path rvm_ruby_args rvm_ruby_name rvm_llvm_flag rvm_ruby_repo_tag
  __rvm_load_rvmrc # restore important variables
}


# TODO: Should be able to...
#   Unset both rvm variables as well as ruby-specific variables
# Preserve gemset if 'rvm_sticky' is set
# (persist gemset unless clear is explicitly called).
__rvm_cleanse_variables()
{
  __rvm_unset_ruby_variables
  if [[ ${rvm_sticky_flag:-0} -eq 1 ]]
  then export rvm_gemset_name
  else unset  rvm_gemset_name
  fi

  # arrays
  unset rvm_configure_flags rvm_patch_names rvm_make_flags
  # variables
  unset rvm_env_string rvm_ruby_string rvm_action rvm_error_message rvm_force_flag rvm_debug_flag rvm_delete_flag rvm_summary_flag rvm_json_flag rvm_yaml_flag rvm_file_name rvm_user_flag rvm_system_flag rvm_install_flag rvm_llvm_flag rvm_sticky_flag rvm_rvmrc_flag rvm_gems_flag rvm_docs_flag rvm_ruby_alias rvm_static_flag rvm_archive_extension rvm_hook rvm_ruby_name rvm_remote_flag
  # rvm_gemsets_path rvm_user_path rvm_wrappers_path rvm_patches_path rvm_docs_path rvm_examples_path rvm_rubies_path rvm_usr_path rvm_src_path rvm_tmp_path rvm_lib_path rvm_repos_path rvm_log_path rvm_help_path rvm_environments_path rvm_archives_path
  __rvm_load_rvmrc # restore important variables
}

# Add bin path if not present
__rvm_conditionally_add_bin_path()
{
  [[ ":${PATH}:" == *":${rvm_bin_path}:"* ]] ||
  {
    if [[ "${rvm_ruby_string:-"system"}" == "system" && -z "$GEM_HOME" ]]
    then PATH="$PATH:${rvm_bin_path}"
    else PATH="${rvm_bin_path}:$PATH"
    fi
  }
}

__rvm_load_environment()
{
  \typeset __hook
  if
    [[ -f "$rvm_environments_path/$1" ]]
  then
    # Restore the environment
    unset GEM_HOME GEM_PATH
    __rvm_remove_rvm_from_path ; __rvm_conditionally_add_bin_path

    # source the environment file
    \. "$rvm_environments_path/$1"

    rvm_hook="after_use"
    if [[ -n "${rvm_scripts_path:-}" || -n "${rvm_path:-}" ]]
    then source "${rvm_scripts_path:-$rvm_path/scripts}/hook"
    fi
    # clear the PATH cache
    builtin hash -r
  else
    __rvm_use "$1"
  fi
}

__rvm_export()
{
  # extract the variable name from the first arg.
  \typeset name
  name=${1%%\=*}

  # store the current value, to be restored later.
  builtin export rvm_old_$name=${!name}

  # pass-through the return value of the builtin.
  export "$@"
  return $?
}

__rvm_unset_exports()
{
  \typeset wrap_name name value
  \typeset -a __variables_list
  __rvm_read_lines __variables_list <<< "$(
    printenv | __rvm_sed '/^rvm_old_.*=/ { s/=.*$//; p; }; d;'
  )"

  for wrap_name in "${__variables_list[@]}"
  do
    eval "value=\"\${${wrap_name}}\""
    name=${wrap_name#rvm_old_}
    if [[ -n "${value:-}" ]]
    then export $name="${value}"
    else unset $name
    fi
    unset $wrap_name
  done
}

__rvm_fix_path_from_gem_path()
{
  [[ -n "${GEM_PATH:-}" ]] || return 0
  export PATH
  \typeset IFS _iterator_path
  \typeset -a _gem_path _new_path
  IFS=:
  _gem_path=()
  _new_path=()
  __rvm_custom_separated_array _gem_path : "${GEM_PATH}"

  for _iterator_path in "${_gem_path[@]}"
  do
    _new_path+=( "${_iterator_path}/bin" )
  done
  _new_path+=( "${MY_RUBY_HOME:-${GEM_HOME/gems/rubies}}/bin" )
  _new_path+=( "${rvm_bin_path}" )

  PATH="${_new_path[*]}:$PATH"
  builtin hash -r
}

# Clean all rvm items out of the current working path.
__rvm_remove_rvm_from_path()
{
  \typeset local_rvm_path
  __rvm_remove_from_path "${rvm_path%/}/*"
  __rvm_remove_from_path "${rvm_gems_path%/}/*"
  __rvm_remove_from_path "${rvm_bin_path}"  #TODO: this might be dangerous if rvm is available in some common path

  while local_rvm_path="$( __rvm_which rvm 2>/dev/null )"
  do __rvm_remove_from_path "${local_rvm_path%/*}"
  done
  builtin hash -r
}

__rvm_switch()
{
  \typeset new_rvm_path new_rvm_bin_path

  (( $# )) && [[ -z "$1" ]] && shift || true # skip first empty argument
  (( $# )) && [[ -n "$1" ]] && [[ -d "$1" || -d "${1%/*}" ]] && [[ ! -f "$1" ]] ||
  {
    rvm_error "No valid path given."
    return 1
  }
  [[ "${rvm_path}" != "${new_rvm_path}" ]] ||
  {
    rvm_warn "Already there!"
    return 2
  }
  rvm_log "Switching ${rvm_path} => ${1}"

  new_rvm_path="${1%/}"
  new_rvm_bin_path="${2:-$new_rvm_path/bin}"
  new_rvm_bin_path="${new_rvm_bin_path%/}"

  __rvm_use_system
  __rvm_remove_from_path "${rvm_path%/}/*"

  rvm_reload_flag=1
  rvm_path="${new_rvm_path}"
  rvm_bin_path="${new_rvm_bin_path}"
  rvm_scripts_path="${rvm_path}/scripts"
  rvm_environments_path="${rvm_path}/environments"

  __rvm_remove_from_path "${rvm_path%/}/*"
  __rvm_add_to_path prepend "${rvm_bin_path}"
}

__rvm_unload_action()
{
  \typeset _element IFS
  \typeset -a _list

  IFS=$'\n'
  _list=( $( \command \cat ${2:--} | sort -u ) )
  for _element in "${_list[@]}"
  do $1 "${_element}"
  done
}

__function_unset()
{
  if [[ -n "${ZSH_VERSION:-}" ]]
  then unset -f "$1"
  else unset "$1"
  fi
}

__rvm_unload()
{
  \typeset _element
  \typeset -a _list

  #PATH
  __rvm_remove_rvm_from_path

  # fpath
  if [[ -n "${ZSH_VERSION:-}" ]]
  then
    __rvm_remove_from_array fpath "$rvm_path/scripts/extras/completion.zsh" "${fpath[@]}"
  fi

  # aliases
  __rvm_unload_action unalias <<< "$(
    if [[ -n "${ZSH_VERSION:-}" ]]
    then alias | __rvm_awk -F"=" '/rvm/ {print $1}'
    else alias | __rvm_awk -F"[= ]" '/rvm/ {print $2}'
    fi
  )"

  # variables
  __rvm_unload_action unset <<< "$(
    set |
      __rvm_awk -F"=" 'BEGIN{v=0;} /^[a-zA-Z_][a-zA-Z0-9_]*=/{v=1;} v==1&&$2~/^['\''\$]/{v=2;}
        v==1&&$2~/^\(/{v=3;} v==2&&/'\''$/&&!/'\'\''$/{v=1;} v==3&&/\)$/{v=1;} v{print;} v==1{v=0;}' |
      __rvm_awk -F"=" '/^[^ ]*(RUBY|GEM|IRB|gem|rubies|rvm)[^ ]*=/ {print $1} /^[^ ]*=.*rvm/ {print $1}' |
      __rvm_grep -vE "^PROMPT|^prompt|^PS|^BASH_SOURCE|^PATH"
  )"

  # functions
  __rvm_unload_action __function_unset <<< "$(
    \typeset -f | __rvm_awk '$2=="()" {fun=$1} /rvm/{print fun}' | sort -u | __rvm_grep -v __rvm_unload_action
  )"
  if
    [[ -n "${ZSH_VERSION:-}" ]]
  then
    unset -f __rvm_unload_action
    unset -f __function_unset
    if
      [[ -n "${_comp_dumpfile:-}" ]]
    then
      \command \rm -f "$_comp_dumpfile"
      compinit -d "$_comp_dumpfile"
    fi
  else
    unset __rvm_unload_action __function_unset
  fi
}

__rvm_ruby_config_get()
{
  \typeset variable_name ruby_path
  variable_name="$1"
  ruby_path="${2:-$rvm_ruby_home/bin/ruby}"
  # mruby doesn't support -r requires or RbConfig
  __rvm_string_match "$ruby_path" "*mruby*" && return
  case "${variable_name:---all}" in
    (--all)
      "$ruby_path" -rrbconfig -e 'puts RbConfig::CONFIG.sort.map{|k,v| "#{k}: #{v}" }' 2>/dev/null || return $?
      ;;
    (*)
      "$ruby_path" -rrbconfig -e 'puts RbConfig::CONFIG["'"$variable_name"'"]' 2>/dev/null || return $?
      ;;
  esac
}

__rvm_env_print()
{
  environment_file_path="$rvm_environments_path/$(__rvm_env_string)"
  # Echo the path or environment file.
  if
    [[ "$rvm_path_flag" == "1" || "$*" == *"--path"* ]]
  then
    echo "$environment_file_path"
  elif
    [[ "$rvm_cron_flag" == "1" || "$*" == *"--cron"* ]]
  then
    \command \cat "$environment_file_path" |
      __rvm_grep -Eo "[^ ]+=[^;]+" |
      __rvm_sed -e 's/\$PATH/'"${PATH//\//\\/}"'/' -e 's/\${PATH}/'"${PATH//\//\\/}"'/'
  else
    \command \cat "$environment_file_path"
  fi
}
src/rvm/scripts/functions/list000066400000001630147511530550012544 0ustar00#!/usr/bin/env bash

# Query for valid rvm ruby strings
# This is meant to be used with scripting.
__rvm_list_strings()
{
  __rvm_find "$rvm_rubies_path" -mindepth 1 -maxdepth 1 -type d | __rvm_awk -F'/' '{print $NF}'
}

# This is meant to be used with scripting.
__rvm_list_gemset_strings()
{
  \typeset all_rubies ruby_name gemset

  all_rubies="$(__rvm_list_strings | tr "\n" ":")"

  for gemset in "${rvm_gems_path:-"$rvm_path/gems"}"/*
  do
    case "$gemset" in
      (*/\*|@*|doc|cache|system) continue ;;
    esac
    ruby_name="${gemset%%@*}"
    ruby_name="${ruby_name##*/}"
    case ":$all_rubies" in
      (*:${ruby_name}:*) true ;;
      (*) continue ;;
    esac
    echo "${gemset##*/}"
  done | sort

  return 0
}

# This is meant to be used with scripting.
__rvm_list_known_strings()
{
  __rvm_sed -e 's/#.*$//g' -e 's#\[##g' -e 's#\]##g' < "$rvm_path/config/known" | \
    sort -r | uniq

  return $?
}
src/rvm/scripts/functions/hooks/binstubs000066400000000344147511530550014546 0ustar00#!/usr/bin/env bash

function remove_binstubs_from_path()
{
  if
    [[ -n "$1" ]]
  then
    export PATH
    PATH=":${PATH}:"
    PATH="${PATH//:$1:/:}"
    PATH="${PATH//::/:}"
    PATH="${PATH#:}"
    PATH="${PATH%:}"
  fi
}
src/rvm/scripts/functions/hooks/maglev000077500000000705147511530550014174 0ustar00#!/usr/bin/env bash


_maglev_gemstone()
{
  case "$1" in
    start)
      export MAGLEV_HOME="$rvm_ruby_home"
      export GEMSTONE_GLOBAL_DIR=$MAGLEV_HOME
      if
        [[ -x "$MAGLEV_HOME/gemstone/bin/gslist" ]]
      then
        if
          "$MAGLEV_HOME/gemstone/bin/gslist" -clv > /dev/null 2>&1
        then
          true # it's running already
        else
          "$rvm_ruby_home/bin/maglev" start
        fi
      fi
      ;;
  esac
}
src/rvm/scripts/functions/hooks/jruby000066400000001661147511530550014053 0ustar00#!/usr/bin/env bash

export JRUBY_OPTS

jruby_ngserver_is_running()
{
  \command \ps auxww | __rvm_grep -e '[o]rg.jruby.main.NailServerMain' -e '[c]om.martiansoftware.nailgun.NGServer' >/dev/null
}

jruby_ngserver_start()
{
  if ! jruby_ngserver_is_running
  then
    (JRUBY_OPTS='' jruby --ng-server 2>&1 1>/dev/null)&
  fi
}

jruby_options_trim()
{
  JRUBY_OPTS="${JRUBY_OPTS## }"
  JRUBY_OPTS="${JRUBY_OPTS%% }"
}

jruby_options_append()
{
  for param in "$@"
  do
    if
      [[ " ${JRUBY_OPTS} " != *" $param "* ]]
    then
      JRUBY_OPTS="${JRUBY_OPTS} $param"
    fi
  done
  jruby_options_trim
}

jruby_options_remove()
{
  JRUBY_OPTS=" ${JRUBY_OPTS} "
  for param in "$@"
  do
    if
      [[ "${JRUBY_OPTS}" == *" $param "* ]]
    then
      JRUBY_OPTS="${JRUBY_OPTS// $param / }"
    fi
  done
  jruby_options_trim
}

jruby_clean_project_options()
{
  if [[ -n "${PROJECT_JRUBY_OPTS}" ]]
  then
    unset PROJECT_JRUBY_OPTS
  fi
}
src/rvm/scripts/functions/hooks/rbx000066400000001075147511530550013512 0ustar00#!/usr/bin/env bash

export RBXOPT

rbx_options_trim()
{
  RBXOPT="${RBXOPT## }"
  RBXOPT="${RBXOPT%% }"
}

rbx_options_append()
{
  for param in "$@"
  do
    if [[ " ${RBXOPT} " != *" $param "* ]]
    then
      RBXOPT="${RBXOPT} $param"
    fi
  done
  rbx_options_trim
}

rbx_options_remove()
{
  RBXOPT=" ${RBXOPT} "
  for param in "$@"
  do
    if [[ "${RBXOPT}" == *" $param "* ]]
    then
      RBXOPT="${RBXOPT// $param / }"
    fi
  done
  rbx_options_trim
}

rbx_clean_project_options()
{
  if [[ -n "${PROJECT_RBXOPT}" ]]
  then
    unset PROJECT_RBXOPT
  fi
}
src/rvm/scripts/functions/alias000066400000003175147511530550012670 0ustar00#!/usr/bin/env bash

alias_show() {
  \typeset expanded_alias_name

  if
    [[ -z "${1:-$alias_name}" ]]
  then
    rvm_log "usage: 'rvm alias show [alias_name]'"
    return 1
  fi

  [[ -s "$rvm_path/config/alias" ]] || return 2

  expanded_alias_name="$( __rvm_db_ "$rvm_path/config/alias" "${1:-$alias_name}")"

  if
    [[ -z "$expanded_alias_name" ]]
  then
    rvm_error "Unknown alias name: '${1:-$alias_name}'"
    return 3
  else
    if [[ -n "$gemset_name" ]]
    then printf "%b" "${expanded_alias_name}${rvm_gemset_separator:-"@"}${gemset_name}\n"
    else printf "%b" "${expanded_alias_name}\n"
    fi
  fi
}

alias_after_delete_default()
{
  [[ "$1" == "default" ]] || return 0

  for _path in "$rvm_bin_path"/default_*
  do
    # remove default_ruby
    if [[ -f "$_path" ]]
    then \command \rm -rfv "${_path}" || return $?
    fi
    # remove ruby
    _path="${_path#default_}"
    if [[ -f "$_path" ]]
    then \command \rm -rfv "${_path}" || return $?
    fi
  done

  for _path in "$rvm_path"/wrappers/default/* gem irb erb ri rdoc testrb rake ruby bundle
  do
    _path="${_path##*\/}"
    \command \rm -fv "$rvm_bin_path/${_path}" || return $?
  done
}

alias_delete_execute()
{
  for _path in "$rvm_rubies_path" "$rvm_gems_path" "$rvm_environments_path" "$rvm_wrappers_path"
  do
    if [[ -L "$_path/$1" ]]
    then \command \rm -fv "$_path/$1" || return $?
    fi
  done

  __rvm_db_ "$rvm_path/config/alias" "$1" "delete"

  alias_after_delete_default "$1" || return $?
}

alias_delete()
{
  __rvm_log_command "alias_delete" \
    "Deleting alias: ${1:-$alias_name}" \
    alias_delete_execute "${1:-$alias_name}" ||
    return $?
}
src/rvm/scripts/functions/checksum000077500000013014147511530550013375 0ustar00#!/usr/bin/env bash

__rvm_md5_calculate()
{
  rvm_debug "Calculate md5 checksum for $@"

  \typeset _sum
  if
    builtin command -v md5 > /dev/null 2>&1
  then
    _sum=$(md5 "$@")
    echo ${_sum##* }
    return 0
  elif
    builtin command -v md5sum > /dev/null 2>&1
  then
    _sum=$(md5sum "$@")
    echo ${_sum%% *}
    return 0
  elif
    builtin command -v gmd5sum > /dev/null 2>&1
  then
    _sum=$(gmd5sum "$@")
    echo ${_sum%% *}
    return 0
  else
    for _path in /usr/gnu/bin /opt/csw/bin /sbin /bin /usr/bin /usr/sbin
    do
      if
        [[ -x "${_path}/md5" ]]
      then
        _sum=$(${_path}/md5 "$@")
        echo ${_sum##* }
        return 0
      elif
        [[ -x "${_path}/md5sum" ]]
      then
        _sum=$(${_path}/md5sum "$@")
        echo ${_sum%% *}
        return 0
      elif
        [[ -x "${_path}/gmd5sum" ]]
      then
        _sum=$(${_path}/gmd5sum "$@")
        echo ${_sum%% *}
        return 0
      fi
    done
  fi

  rvm_error "Neither of md5sum, md5, gmd5sum found in the PATH"
  return 1
}

__rvm_sha__calculate()
{
  rvm_debug "Calculate sha512 checksum for $@"

  \typeset bits _sum
  bits=${1:-512}
  shift

  if
    builtin command -v sha${bits}sum >/dev/null
  then
    _sum=$(sha${bits}sum    "$@")
    echo ${_sum% *}
    return 0
  elif
    builtin command -v sha${bits}    >/dev/null
  then
    _sum=$(sha${bits}       "$@")
    if [[ "${_sum%% *}" == "SHA${bits}" ]]
    then echo ${_sum##* } # take last of:  SHA512 (file) = ....
    else echo ${_sum% *}  # take first of: ... file
    fi
    return 0
  elif
    builtin command -v shasum    >/dev/null
  then
    _sum=$(shasum -a${bits} "$@")
    echo ${_sum% *}
    return 0
  elif
    # Drop-in for Solaris 10
    builtin command -v /opt/csw/bin/shasum >/dev/null
  then
    _sum=$(/opt/csw/bin/shasum -a${bits} "$@")
    echo ${_sum% *}
    return 0
  fi

  rvm_error "Neither sha512sum nor shasum found in the PATH"
  return 1
}

# __rvm_checksum_calculate_file {file}
# ENV out: _checksum_md5 _checksum_sha512
__rvm_checksum_calculate_file()
{
  rvm_debug "Calculate checksums for file ${1}"

  _checksum_md5="$(    __rvm_md5_calculate      "${1:-}" )"
  _checksum_sha512="$( __rvm_sha__calculate 512 "${1:-}" )"
}

__rvm_checksum_none()
{
  [[ -z "${_checksum_md5:-}" && -z "${_checksum_sha512:-}" ]]
}

__rvm_checksum_any()
{
  [[ -n "${_checksum_md5:-}" || -n "${_checksum_sha512:-}" ]]
}

__rvm_checksum_all()
{
  [[ -n "${_checksum_md5:-}" && -n "${_checksum_sha512:-}" ]]
}

# __rvm_checksum_validate_file {file}
# ENV in: _checksum_md5 _checksum_sha512
__rvm_checksum_validate_file()
{
  rvm_debug "Validating checksums for file ${1}"

  if
    __rvm_checksum_any
  then
    rvm_debug "    ...checksums found in db"
  else
    rvm_debug "    ...checksums not found in db"
    return 1
  fi

  # Validate md5 checksum
  if
    [[ -n "${_checksum_md5:-}" ]]
  then
    rvm_debug "Validating md5 checksum"
    if
      [[ "$(__rvm_md5_calculate "${1:-}")" == "${_checksum_md5:-}" ]]
    then
      rvm_debug "    ...md5 checksum is valid!"
    else
      rvm_debug "    ...md5 checksum is not valid!!!"
      return 2
    fi
  fi

  # Validate sha512 checksum
  if
    [[ -n "${_checksum_sha512:-}" ]]
  then
    rvm_debug "Validating sha15 checksum"

    if
      [[ "$(__rvm_sha__calculate 512 "${1:-}")" == "${_checksum_sha512:-}" ]]
    then
      rvm_debug "    ...sha512 checksum is valid!"
    else
      rvm_debug "    ...sha512 checksum is not valid!!!"
      return 3
    fi
  fi

  return 0
}

# __rvm_checksum_read {name...}
# name - list of names to check, like:
#
#     __rvm_checksum_read https://rvm.io/binaries/.../ruby-1.9.3-p194.tar.bz2 bin-ruby-1.9.3-p194.tar.bz2
#
# ENV in/out: _checksum_md5 _checksum_sha512
__rvm_checksum_read()
{
  rvm_debug "Load checksums for $1"

  __rvm_checksum_any && return 0
  \typeset _type _value _name
  \typeset -a _list
  list=()

  for _name in "$@"
  do
    if
      [[ "$_name" == *"?"* ]] # try url without ?... like ?rvm={version}
    then
      list+=( "${_name%\?*}" )
    else
      list+=( "$_name" )
    fi
  done

  for _name in "${list[@]}"
  do
    rvm_debug "Searching checksum config files for $_name"

    # md5
    _checksum_md5="$(      __rvm_db_ "$rvm_path/config/md5"    "$_name" | \command \head -n 1 )"

    [[ -n "${_checksum_md5:-}" ]] ||
      _checksum_md5="$(    __rvm_db_ "$rvm_user_path/md5"      "$_name" | \command \head -n 1 )"

    # sha512
    _checksum_sha512="$(   __rvm_db_ "$rvm_path/config/sha512" "$_name" | \command \head -n 1 )"

    [[ -n "${_checksum_sha512:-}" ]] ||
      _checksum_sha512="$( __rvm_db_ "$rvm_user_path/sha512"   "$_name" | \command \head -n 1 )"

    __rvm_checksum_any && return 0
  done

  # Try to get the Rubinius checksum from the network
  for _name in "${list[@]}"
  do
    if [[ $_name == http*rubinius* ]]; then
      if [[ -z "${_checksum_md5:-}" ]]; then
        _checksum_md5="$(__rvm_curl -s -L $_name.md5)"
      fi

      if [[ -z "${_checksum_sha512:-}" ]]; then
        _checksum_sha512="$(__rvm_curl -s -L $_name.sha512)"
      fi
    fi

    __rvm_checksum_any && return 0
  done

  rvm_debug "    ...checksums not found"
  return 1 # not found
}

# Record checksums in user settings
# Usage: __rvm_checksum_write {name}
# ENV in/out: _checksum_md5 _checksum_sha512
__rvm_checksum_write()
{
  [[ -n "${1:-}" ]]  || return 1
  __rvm_checksum_any || return 1

  [[ -z "${_checksum_md5:-}"    ]] || __rvm_db_ "$rvm_user_path/md5"    "${1:-}" "${_checksum_md5:-}"
  [[ -z "${_checksum_sha512:-}" ]] || __rvm_db_ "$rvm_user_path/sha512" "${1:-}" "${_checksum_sha512:-}"

  return 0
}
src/rvm/scripts/functions/osx-support000066400000001144147511530550014114 0ustar00#!/usr/bin/env bash

requiremnts_osx_java_fail()
{
  __rvm_which java >/dev/null 2>&1 || return $?
  java_version=$(java -version 2>&1  | __rvm_awk -F'"' '/ version /{print $2}')
  case "$java_version" in
    (1.5.*)
      printf "%b" "\n\nWARNING: A very outdated JAVA version is being used ($java_version), it is strongly recommended that you upgrade to the latest version.\n\n"
      ;;
    (1.3.*|1.4.*)
      printf "%b" "\n\nERROR: Unsupported JAVA version $java_version. In order to install and use JRuby you must upgrade to the latest JAVA version.\n\n"
      return 1
      ;;
  esac
  true # for OSX
}
src/rvm/scripts/functions/cleanup000066400000003664147511530550013231 0ustar00#!/usr/bin/env bash

# wrapper for smaller output from __rvm_log_command
__rvm_rm_rf()
{
  __rvm_rm_rf_verbose "$@"
}
#
# \command \rm -rf with *some* safeguards in place.
#
__rvm_rm_rf_verbose()
{
  \typeset target
  target="${1%%+(/|.)}"

  #NOTE: RVM Requires extended globbing shell feature turned on.
  if
    [[ -n "${ZSH_VERSION:-}" ]]
  then
    \builtin setopt extendedglob
  elif
    [[ -n "${BASH_VERSION:-}" ]]
  then
    \builtin shopt -s extglob
  else
    rvm_error "What the heck kind of shell are you running here???"
  fi
  case "${target}" in
    (*(/|.)@(|/Applications|/Developer|/Guides|/Information|/Library|/Network|/System|/User|/Users|/Volumes|/backups|/bdsm|/bin|/boot|/cores|/data|/dev|/etc|/home|/lib|/lib64|/mach_kernel|/media|/misc|/mnt|/net|/opt|/private|/proc|/root|/sbin|/selinux|/srv|/sys|/tmp|/usr|/var))
      rvm_debug "__rvm_rm_rf target is not valid - can not remove"
      return 1
      ;;
    (*)
      if
        [[ -z "${target}" ]]
      then
        rvm_debug "__rvm_rm_rf target not given"
        return 1
      elif
        [[ -d "${target}" ]]  # directory
      then
        \command \rm -rf "${target}" ||
        {
          \typeset ret=$?
          rvm_debug "__rvm_rm_rf error removing target dir '${target}'."
          return $ret
        }
      elif
        [[ -f "${target}" || -L "${target}" ]] # file / broken symbolic link
      then
        \command \rm -f "${target}" ||
        {
          \typeset ret=$?
          rvm_debug "__rvm_rm_rf error removing target file/link '${target}'."
          return $ret
        }
      else
        rvm_debug "__rvm_rm_rf already gone: $*"
      fi
      ;;
  esac
  true # for OSX
}

# Cleans up temp folders for a given prefix ($1),
# or the current process id.
__rvm_cleanup_tmp()
{
  if
    [[ -d "${rvm_tmp_path}/" ]]
  then
    case "${rvm_tmp_path%\/}" in
      *tmp)
        __rvm_rm_rf "${rvm_tmp_path}/${1:-$$}*"
        ;;
    esac
  fi
  true # for osx
}
src/rvm/scripts/functions/requirements/gentoo_paludis000066400000001113147511530550017324 0ustar00#!/usr/bin/env bash

requirements_find_gentoo_paludis()
{
  if
    eselect package-manager >/dev/null 2>&1
  then
    [[ $(eselect package-manager show | __rvm_tail -1 | __rvm_sed 's/ //g') = 'paludis' ]] || return $?
  else
    __rvm_which cave >/dev/null 2>&1 || return $?
  fi
}

requirements_gentoo_paludis_lib_installed()
{
  cave show "$1" | __rvm_grep "::installed" >/dev/null || return $?
}

requirements_gentoo_paludis_libs_install()
{
  __rvm_try_sudo cave resolve -x "$@" || return $?
}

requirements_gentoo_paludis_update_system()
{
  __rvm_try_sudo cave sync || return $?
}
src/rvm/scripts/functions/requirements/trisquel000066400000001746147511530550016174 0ustar00#!/usr/bin/env bash

source "$rvm_scripts_path/functions/requirements/debian"

requirements_ubuntu_define_libgmp()
{
  requirements_check libgmp-dev
}

requirements_ubuntu_define_libreadline()
{
  if
    __rvm_version_compare ${_system_version} -ge 9
  then
    requirements_check libreadline-dev
  else
    requirements_check libreadline6-dev
  fi
}

requirements_trisquel_define_libssl()
{
  # Legacy libssl-dev required by older version of ruby has been renamed to libssl1.0-dev
  # starting from Trisquel 9 (based on Ubuntu 18.04 LTS "Bionic Beaver")

  case "$1" in
    (ruby-2.3*|ruby-2.2*|ruby-2.1*|ruby-2.0*|ruby-1.9*)
      if
        __rvm_version_compare ${_system_version} -ge 9
      then
        undesired_check libssl-dev
        requirements_check libssl1.0-dev
      else
        requirements_check libssl-dev
      fi
      ;;

    (*)
      requirements_check libssl-dev
      ;;
  esac
}

requirements_trisquel_define()
{
  __lib_type=debian
  requirements_debian_define "$@"
}
src/rvm/scripts/functions/requirements/fedora_yum000066400000001463147511530550016452 0ustar00#!/usr/bin/env bash

source "$rvm_scripts_path/functions/requirements/centos"

requirements_fedora_before_update_cache()
{
  __rvm_try_sudo yum clean all || true      # can fail to clean
  __rvm_try_sudo yum makecache || return $? # but must rebuild cache
}

requirements_fedora_before()
{
  requirements_centos_lib_available_no_caching yum ||
    rvm_requiremnts_fail_or_run_action 2 \
      "It is not possible to check if packages are installed, make sure the cache is up to date with 'yum makecache' and try again." \
      __rvm_log_command fedora_update_cache "Updating packages cache" requirements_fedora_before_update_cache ||
      return $?
}

requirements_fedora_define_libyaml()
{
  requirements_check libyaml-devel
}

requirements_fedora_define()
{
  __lib_type=centos

  requirements_centos_define "$@"
}
src/rvm/scripts/functions/requirements/fedora_dnf000066400000004260147511530550016405 0ustar00#!/usr/bin/env bash

requirements_fedora_lib_installed()
{
  dnf list installed "$1" >/dev/null 2>&1 || return $?
}

requirements_fedora_lib_available()
{
  dnf info "$1" >/dev/null 2>&1 || return $?
}

requirements_fedora_libs_install()
{
  __rvm_try_sudo dnf install -y "$@" || return $?
}

requirements_fedora_libs_remove()
{
  __rvm_try_sudo dnf remove -y "$@" || return $?
}

requirements_fedora_check_binary()
{
  {
    __rvm_which update-alternatives >/dev/null &&
    update-alternatives --display "$1" >/dev/null 2>&1
  } ||
  __rvm_which "$1" >/dev/null || return $?
}

requirements_fedora_define()
{
  case "$1" in
    (rvm)
      requirements_check bash curl patch
      ;;

    (jruby*)
      requirements_check make

      if
        is_head_or_disable_binary "$1"
      then
        requirements_check git

        requirements_fedora_check_binary javac ||
          requirements_check_fallback java-1.8.0-openjdk-devel java-devel ||
          requirements_check_fallback java-1.7.0-openjdk-devel java-devel

        case $( jruby_installation_method  "$1" ) in
          mvn) requirements_check_custom_after mvn=maven ;;
        esac

      else
        requirements_fedora_check_binary java ||
          requirements_check_fallback java-1.8.0-openjdk java ||
          requirements_check_fallback java-1.7.0-openjdk java
      fi
      ;;

    (rbx*|rubinius*)
      requirements_check automake bison clang-3.6 flex gdbm-devel git libyaml-devel llvm-devel llvm-static \
                         make ncurses-devel openssl-devel readline-devel ruby-devel rubygems zlib-devel
      ;;

    (truffleruby*)
      requirements_check zlib-devel make gcc libxml2
      requirements_fedora_define_openssl "$1"
      ;;

    (ir*)
      true # not that easy
      ;;

    (opal)
      true # not that easy
      ;;

    (*-head)
      requirements_check git
      requirements_fedora_define "${1%-head}"
      ;;

    (*)

      requirements_check autoconf automake bison bzip2 gcc-c++ libffi-devel libtool \
                         libyaml-devel make patch readline readline-devel sqlite-devel zlib zlib-devel
      requirements_fedora_define_openssl $1
      requirements_fedora_define_glibc $1
      ;;
  esac
}
src/rvm/scripts/functions/requirements/gentoo_portage000066400000001216147511530550017330 0ustar00#!/usr/bin/env bash

requirements_find_gentoo_portage()
{
  if
    eselect package-manager >/dev/null 2>&1
  then
    [[ $(eselect package-manager show | __rvm_tail -1 | __rvm_sed 's/ //g') = 'portage' ]] ||
    [[ $(eselect package-manager show | __rvm_tail -1 | __rvm_sed 's/ //g') = '(none)'  ]] || return $?
  else
    __rvm_which emerge >/dev/null 2>&1 || return $?
  fi
}

requirements_gentoo_portage_lib_installed() [[ -n "$(portageq match / "$1" 2>/dev/null)" ]]

requirements_gentoo_portage_libs_install()
{
  __rvm_try_sudo emerge "$@" || return $?
}

requirements_gentoo_portage_update_system()
{
  __rvm_try_sudo emerge --sync || return $?
}
src/rvm/scripts/functions/requirements/termux000066400000002043147511530550015637 0ustar00#!/usr/bin/env bash

requirements_termux_lib_installed()
{
  pkg-query -s "$1" > /dev/null 2>&1 || return $?
}

requirements_termux_libs_install()
{
  pkg install "$@" || return $?
}

requirements_termux_libs_remove()
{
  pkg --yes remove "$@" || return $?
}

requirements_termux_define_base()
{
  requirements_check "$@" \
    autoconf automake bison ca-certificates curl libc6-dev libffi-dev libgdbm-dev libncurses5-dev \
    libsqlite3-dev libtool libyaml-dev make openssl patch pkg-config sqlite3 zlib1g zlib1g-dev

  requirements_${_system_name_lowercase}_define_libgmp
  requirements_${_system_name_lowercase}_define_libreadline
}

requirements_termux_define()
{
  case "$1" in
    (rvm)
      requirements_check bash curl patch bzip2 ca-certificates gawk
      ;;

    (*)
      requirements_check clang coreutils curl gawk git gnupg gpgv \
                         libc++ libclang libclang-dev libllvm libxml2 make ncurses ncurses-ui-libs \
                         openssl openssl-dev openssl-tool readline sqlite tar zlib zlib-dev
      ;;
  esac
}
src/rvm/scripts/functions/requirements/ubuntu000066400000003011147511530550015631 0ustar00#!/usr/bin/env bash

source "$rvm_scripts_path/functions/requirements/debian"

requirements_ubuntu_define_libgmp()
{
  requirements_check libgmp-dev
}

requirements_ubuntu_define_libreadline()
{
  if
    __rvm_version_compare ${_system_version} -ge 16.10
  then
    requirements_check libreadline-dev
  else
    requirements_check libreadline6-dev
  fi
}

requirements_ubuntu_define_libssl()
{
  # Legacy libssl-dev required by older version of ruby has been renamed to libssl1.0-dev
  # starting from Ubuntu 17.10 (Artful Aardvark)

  case "$1" in
    (ruby-2.3*|ruby-2.2*|ruby-2.1*|ruby-2.0*|ruby-1.9*|ruby-1.8*|ree-1.8*)
      if
        __rvm_version_compare ${_system_version} -ge 17.10
      then
        undesired_check libssl-dev
        requirements_check libssl1.0-dev
      else
        requirements_check libssl-dev
      fi
      ;;

    (*)
      requirements_check libssl-dev
      ;;
  esac
}

requirements_ubuntu_define_clang_llvm()
{
  if
    __rvm_version_compare ${_system_version} -ge 17.04
  then
    requirements_check clang-4.0 llvm-4.0 llvm-4.0-dev libc++-dev libc++abi-dev
    rvm_configure_flags+=( --cc=clang-4.0 --cxx=clang++-4.0 --llvm-config=llvm-config-4.0)
    __rvm_update_configure_env CXXFLAGS="-nostdinc++ -I/usr/include/c++/v1" LDFLAGS="-stdlib=libc++ -lc++"
  else
    requirements_check clang-3.6 llvm-3.6 llvm-3.6-dev
    rvm_configure_flags+=( --cc=clang-3.6 --cxx=clang++-3.6 --llvm-config=llvm-config-3.6)
  fi
}

requirements_ubuntu_define()
{
  __lib_type=debian
  requirements_debian_define "$@"
}
src/rvm/scripts/functions/requirements/amazon000066400000000630147511530550015600 0ustar00#!/usr/bin/env bash

source "$rvm_scripts_path/functions/requirements/centos"

requirements_amazon_define_glibc()
{
  requirements_check glibc-headers glibc-devel
}

requirements_amazon_define_libyaml()
{
  requirements_check libyaml-devel
}

requirements_amazon_define_openssl()
{
  requirements_check openssl-devel
}

requirements_amazon_define()
{
  __lib_type=centos

  requirements_centos_define "$@"
}
src/rvm/scripts/functions/requirements/cygwin000066400000003654147511530550015624 0ustar00#!/usr/bin/env bash

requirements_cygwin_lib_installed()
{
  cygcheck -c -d | __rvm_grep "^$1" >/dev/null || return $?
}

requirements_cygwin_libs_install()
{
  \typeset __packages_list __manager

  rvm_debug "__manager: detecting administrative permissions"
  net session > /dev/null 2>&1
  if [ $? -eq 0 ];
  then __manager_admin_mode=""
  else __manager_admin_mode="--no-admin"
  fi

  if [[ "${_system_arch}" == "x86_64" ]]
  then __manager="setup-x86_64.exe"
  else __manager="setup-x86.exe"
  fi
  rvm_debug "__manager: ${__manager} ${__manager_admin_mode}"

  __packages_list="$*"
  ${__manager} ${__manager_admin_mode} -q -P "${__packages_list// /,}" || return $?
}

requirements_cygwin_update_system()
{
  true # really???
}

requirements_cygwin_define()
{
  # Verify cygwin package names using:
  # https://cygwin.com/cgi-bin2/package-grep.cgi

  case "$1" in
    (rvm)
      requirements_check bash curl patch gnupg
      ;;

    (jruby*)
      requirements_check make

      if
        is_head_or_disable_binary "$1"
      then
        requirements_check git
        case $( jruby_installation_method  "$1" ) in
          ant)  echo "Need Java JDK and Ant"   ;;
          mvn)  echo "Need Java JDK and Maven" ;;
          mvnw) echo "Need Java JDK"           ;;
        esac
      else
        echo "Need Java"
      fi
      ;;

    (ir*)
      true # should be already there in most cases
      ;;

    (opal)
      echo "Need Node.js"
      ;;

    (*-head)
      requirements_check autoconf git
      requirements_cygwin_define "${1%-head}"
      ;;

    (*)
      requirements_check make autoconf automake bison m4 libtool \
        gcc gcc-core mingw64-i686-gcc-core mingw64-x86_64-gcc-core \
        libiconv zlib zlib-devel \
        openssl libssl-devel \
        libcrypt-devel libcrypt0 \
        libyaml-devel libyaml0_2 \
        libffi-devel \
        libreadline-devel \
        sqlite3 \
        patch \
        gnupg
      ;;
  esac
}
src/rvm/scripts/functions/requirements/unknown000066400000004074147511530550016020 0ustar00#!/usr/bin/env bash

requirements_unknown_binaries()
{
  while
    (( $# ))
  do
    __rvm_which "$1" >/dev/null || missing_libs+=( "$1" )
    shift
  done
}

requirements_unknown_run()
{
  case "$1" in
    (update-system)
      echo "Always update your system first!"
      ;;

    (rvm)
      requirements_unknown_binaries bash curl patch
      ;;

    (jruby*)
      requirements_unknown_binaries make java

      if
        is_head_or_disable_binary "$1"
      then
        requirements_unknown_binaries git
        case $( jruby_installation_method  "$1" ) in
          ant) requirements_unknown_binaries ant ;;
          mvn) requirements_unknown_binaries mvn ;;
        esac
      fi
      ;;

    (ir*)
      requirements_unknown_binaries mono
      ;;

    (opal)
      requirements_unknown_binaries nodejs npm
      ;;

    (*-head)
      requirements_unknown_binaries openssl sqlite3 libtool autoconf automake bison pkg-config git
      missing_libs+=( build-essential libreadline zlib1g libyaml libc6 libgdbm ncurses )
      ;;

    (*)
      requirements_unknown_binaries openssl sqlite3 libtool autoconf automake bison pkg-config git
      missing_libs+=( build-essential libreadline zlib1g libyaml libc6 libgdbm ncurses )
      ;;
  esac
}

requirements_unknown_wait_key()
{
  rvm_is_a_shell_function no_warning ||
  {
    rvm_error "
RVM was not able to detect your system type and does not know how to load extra library paths for your system (if it's needed), read:

    rvm help autolibs

for details how to disable this message.
"
    return 1
  }
  rvm_log "press any key to continue"
  \typeset _read_char_flag anykey
  [[ -n "${ZSH_VERSION:-}" ]] && _read_char_flag=k || _read_char_flag=n
  builtin read -${_read_char_flag} 1 -s -r anykey
}

requirements_unknown_update_system()
{
  echo "Always update your system first!"
}

requirements_unknown_define()
{
  \typeset __reqirement
  \typeset -a missing_libs
  missing_libs=()
  for __reqirement
  do requirements_unknown_run "${__reqirement}"
  done
  echo "Install: ${missing_libs[*]}"
  requirements_unknown_wait_key || return $?
}
src/rvm/scripts/functions/requirements/freebsd000066400000006373147511530550015737 0ustar00#!/usr/bin/env bash

# old handlers before pkgng
requirements_freebsd_lib_installed()
{
  pkg_info | __rvm_grep "^$1" >/dev/null 2>&1 || return $?
}

requirements_freebsd_libs_install()
{
  __rvm_try_sudo pkg_add -r "$@" || return $?
}

# new handlers for pkgng
requirements_freebsd_pkgng_lib_installed()
{
  pkg info | __rvm_grep "^$1" >/dev/null 2>&1 || return $?
}

requirements_freebsd_pkgng_libs_install()
{
  __rvm_try_sudo pkg install -y "$@" || return $?
}

requirements_freebsd_install_node()
{
  # TODO: missing pkgng!
  if
    [[ -d /usr/ports ]]
  then
    __rvm_try_sudo portsnap fetch update  || return $?
  else
    rvm_requiremnts_fail_or_run_action 2 \
      "Skipping portsnap fetch extract, make sure your system is up to date." \
      __rvm_try_sudo portsnap fetch extract || return $?
    packages_flags+=( "portsnap-extracted" )
  fi
  # plain make is required for sudo
  __rvm_try_sudo make -C /usr/ports/www/node install clean || return $?
}

requirements_freebsd_before_detect_package_manager()
{
  if
    __rvm_version_compare ${_system_version} -ge 10.0
  then
    __lib_type="freebsd_pkgng"
  else
    __lib_type="freebsd"
    if
      __rvm_which pkg >/dev/null    &&
      [[ -s /var/db/pkg/local.sqlite ]]
    then
      __lib_type+='_pkgng'
    fi
  fi
}

requirements_freebsd_before()
{
  if
    __rvm_version_compare ${_system_version} -le 10.0
  then
    rvm_warn "rvm is best supported on FreeBSD 10+"
  fi

  requirements_freebsd_before_detect_package_manager
  # TODO: when the time is out deprecate the old pkg_tools https://wiki.freebsd.org/pkgng/CharterAndRoadMap
}

requirements_freebsd_libs_default()
{
  requirements_check autoconf automake libtool bison readline libyaml sqlite3 gdbm
}

requirements_freebsd_update_system()
{
  case "${__lib_type}" in
    (freebsd_pkgng)
      if
        [[ -s /usr/local/etc/pkg.conf ]]
      then
        __rvm_try_sudo pkg update || return $?
      fi
      ;;
  esac
}

requirements_freebsd_define()
{
  case "$1" in
    (rvm)
      requirements_check bash curl
      ;;

    (jruby*)
      requirements_check make openjdk

      if
        is_head_or_disable_binary "$1"
      then
        requirements_check git
        case $( jruby_installation_method  "$1" ) in
          ant) __rvm_which ant >/dev/null || requirements_check apache-ant ;;
          mvn) __rvm_which mvn >/dev/null || requirements_check maven3     ;;
        esac
      fi
      ;;

    (ir*)
      requirements_check mono
      ;;

    (opal)
      requirements_check_custom node
      ;;

    (rbx*)
      if
        __rvm_version_compare ${_system_version} -ge 10.0
      then
        rvm_configure_flags+=( --cc=clang --cxx=clang++ )
        requirements_check gmake llvm35
        rvm_warn "If rbx installation fails, make sure llvm-config is in your PATH"
      else
        rvm_warn "rbx installation by rvm is only supported on FreeBSD 10 or higher"
      fi
      ;;

    (*-head)
      requirements_check git
      requirements_freebsd_define "${1%-head}"
      requirements_freebsd_libs_default
      __rvm_update_configure_opt_dir "$1" "/usr/local"
      ;;

    (*)
      # OpenSSL is installed by default http://www.freebsd.org/crypto.html
      requirements_freebsd_libs_default
      __rvm_update_configure_opt_dir "$1" "/usr/local"
      ;;
  esac
}
src/rvm/scripts/functions/requirements/kali000066400000001514147511530550015235 0ustar00#!/usr/bin/env bash

source "$rvm_scripts_path/functions/requirements/debian"

requirements_kali_define_libgmp()
{
  requirements_check libgmp-dev
}

requirements_kali_define_libreadline()
{
  requirements_check libreadline6-dev
}

requirements_kali_define_libssl()
{
  case "$1" in
    (ruby-2.3*|ruby-2.2*|ruby-2.1*|ruby-2.0*|ruby-1.9*)
        undesired_check libssl-dev libssl1.1
        requirements_check libssl1.0-dev libssl1.0.2
      ;;

    (*)
        undesired_check libssl1.0-dev libssl1.0.2
        requirements_check libssl-dev libssl1.1
        ;;
  esac
}

requirements_kali_define_clang_llvm()
{
  requirements_check clang-3.6 llvm-3.6 llvm-3.6-dev
  rvm_configure_flags+=( --cc=clang-3.6 --cxx=clang++-3.6 --llvm-config=llvm-config-3.6)
}

requirements_kali_define()
{
  __lib_type=debian
  requirements_debian_define "$@"
}
src/rvm/scripts/functions/requirements/osx_fink000066400000013772147511530550016146 0ustar00#!/usr/bin/env bash

requirements_find_osx_fink()
{
  if # find macports in PATH
    __rvm_which fink >/dev/null 2>&1
  then
    return 0
  else # find fink out of PATH and link to rvm/bin
    \typeset __binary
    for __binary in ~/sw/bin/fink ~/.sw/bin/fink /sw/bin/fink /usr/local/bin/fink
    do
      if
        [[ -f "${__binary}" && -s "${__binary}" && -x "${__binary}" ]]
      then
        PATH="$PATH:${__binary%/*}"
        return 0
      fi
    done
    return 1
  fi
}

requirements_osx_fink_path()
(
  \typeset fink_binary="$( __rvm_which fink )"
  __rvm_readlink_deep fink_binary
  echo "${fink_binary%/bin/fink}"
)

requirements_osx_fink_packages_path()
{
  __rvm_awk '/Basepath:/ {print$2}' < "$(requirements_osx_fink_path)"/etc/fink.conf
}

__rvm_fink_sudo()
{
  if
    [[ -w "$( requirements_osx_fink_path )" &&
       -w "$( requirements_osx_fink_packages_path )"
    ]]
  then
    "$@" || return $?
  else
    __rvm_try_sudo "$@" || return $?
  fi
}

requirements_osx_fink_lib_installed()
{
  fink list -i $1 2>/dev/null | __rvm_awk 'BEGIN{result=1} $2=="'"$1"'" {result=0} END{exit result}' || return $?
}

requirements_osx_fink_libs_install()
{
  __rvm_fink_sudo fink --yes install "$@"  ||
  {
    \typeset ret=$?
    rvm_warn "There were package installation errors, make sure to read the log."
    return $ret
  }
}

requirements_osx_fink_update_system()
{
  # enable unstable for needed packages
  __rvm_fink_sudo __rvm_sed -i'' -e 's#^\(Trees: .*\)$#\1 unstable/main#' "$(requirements_osx_fink_path)"/etc/fink.conf

  # update package definitions
  __rvm_log_command fink_update "Updating fink" __rvm_fink_sudo fink selfupdate || return $?
}

requirements_osx_fink_gcc_version_detect()
{
  if
    __rvm_version_compare "${_system_version}" -le 10.5
  then
    fink_libs+=( gcc43 )
  elif
    __rvm_version_compare "${_system_version}" -le 10.6
  then
    fink_libs+=( gcc45 )
  elif
    __rvm_version_compare "${_system_version}" -le 10.7
  then
    fink_libs+=( gcc46 )
  elif 
    __rvm_version_compare "${_system_version}" -le 10.10
  then 
    _libs+=( gcc49 )
  else # 10.10
    fink_libs+=( gcc49 )
  fi
}

requirements_osx_fink_libs_default_tools()
{
  fink_libs+=( autoconf2.6 automake1.14 pkgconfig )

  if
    __rvm_version_compare "${_system_version}" -le 10.6
  then
    fink_libs+=( libtool14 )
  fi

  if
    ! __ruby_clang_ok "$1" &&
    [[ -z "${selected_compiler}" || "${selected_compiler}" == *"gcc-4.2"* ]]
  then
    # install gcc only if no gcc-4.2 available, prevents problems with gcc-4.2 on OSX 10.6
    __rvm_which gcc-4.2 >/dev/null || requirements_osx_fink_gcc_version_detect
  fi
}

requirements_osx_fink_libs_default_libs()
{
  \typeset __lib

  for __lib in libyaml readline6 libksba8 sqlite3
  do
    fink_libs+=( ${__lib} ${__lib}-shlibs )
  done

  case "$1" in
    (ruby-1.8*|ree-1.8*)
      rvm_error "Ruby: $1 is not supported with Fink, consider switching Autolibs to Macports or Homebrew:
    rvm autolibs port # OR:
    rvm autolibs brew
"
      return 12
      ;;
    (*)
      fink_libs+=( openssl openssl100-dev openssl100-shlibs )
      ;;
  esac
  fink_libs+=( ca-bundle )
}

requirements_osx_fink_libs_default()
{
  # FIXME: what packages are needed for installation
  # lib search => http://pdb.finkproject.org/pdb/browse.php?summary=openssl
  \typeset -a fink_libs
  fink_libs=()

  requirements_osx_fink_libs_default_tools "$@" || return $?
  requirements_osx_fink_libs_default_libs  "$@" || return $?

  requirements_check "${fink_libs[@]}" || return $?
}

requirements_osx_fink_define()
{
  case "$1" in
    (rvm)
      true
      ;;

    (jruby*)
      requirements_check make

      if
        is_head_or_disable_binary "$1"
      then
        __rvm_which git >/dev/null || requirements_check git
        case $( jruby_installation_method  "$1" ) in
          mvn) requirements_check_custom_after mvn=maven ;;
        esac
      fi

      requiremnts_osx_java_fail || return $?
      ;;

    (ir*)
      __rvm_which mono >/dev/null 2>&1 || return $?
      ;;

    (opal)
      requirements_check node
      ;;

    (truffleruby*)
      requirements_osx_fink_libs_default "$1"
      ;;

    (*-head)
      __rvm_which git >/dev/null || requirements_check git
      requirements_osx_fink_libs_default "$1"
      ;;

    (*)
      requirements_osx_fink_libs_default "$1"
      ;;
  esac
}

requirements_osx_fink_libs_configure()
{
  \typeset package fink_lib fink_lib_prefix
  package="$1"

  if
    # FIXME: how to find out package paths
    fink_lib_prefix="$( requirements_osx_fink_packages_path )" &&
    [[ -n "${fink_lib_prefix}" && -d "${fink_lib_prefix}" ]]
  then
    __rvm_update_configure_opt_dir "${package}" "${fink_lib_prefix}"
  fi
}

requirements_osx_fink_after()
{
  requirements_osx_fink_libs_configure "$1" || return $?

  case "$1" in
    (jruby*) true ;;
    (*) requirements_osx_fink_after_update_certs_openssl ;;
  esac
}

requirements_osx_fink_after_update_certs_openssl()
{
  requirements_osx_update_openssl_cert "$(requirements_osx_fink_packages_path)/bin/openssl" || return $?
}

requirements_osx_fink_install_fink()
{
  \typeset fink_home fink_version
  fink_version=0.34.8
  rvm_warn "About to install fink-${fink_version}, press ENTER to use default answers.
Make sure to watch the graphical login, questions for X11 installation will appear!"

  mkdir -p "${rvm_src_path}/fink-${fink_version}" || return $?
  __rvm_curl http://downloads.sourceforge.net/fink/fink-${fink_version}.tar.gz |
    tar xz --strip 1 -C "${rvm_src_path}/fink-${fink_version}"
  __rvm_check_pipestatus ${PIPESTATUS[@]} ${pipestatus[@]} || return $?
  cd "${rvm_src_path}/fink-${fink_version}"

  __rvm_try_sudo ./bootstrap /sw && /sw/bin/pathsetup.sh || return $?

  PATH="$PATH:/sw/bin"
}

requirements_osx_fink_ensure_fink_available()
{
  __rvm_which fink >/dev/null ||
  {
    rvm_requiremnts_fail_or_run_action 2 \
      "Requested installation with fink libs, but fink is not available." \
      requirements_osx_fink_install_fink ||
      return $?
  }
}

requirements_osx_fink_before()
{
  requirements_osx_fink_ensure_fink_available || return $?
}
src/rvm/scripts/functions/requirements/suse000066400000000672147511530550015300 0ustar00#!/usr/bin/env bash

source "$rvm_scripts_path/functions/requirements/opensuse"

requirements_suse_define_libyaml()
{
    requirements_opensuse_lib_installed libyaml-devel ||
    {
      requirements_check pkg-config
      requirements_rvm_pkg_lib_installed_custom yaml
    }
}

requirements_suse_define()
{
  __lib_type=opensuse
  requirements_opensuse_define "$@"
}

requirements_suse_after()
{
  requirements_rvm_pkg_configure "$1" yaml
}
src/rvm/scripts/functions/requirements/clearos000066400000000634147511530550015747 0ustar00#!/usr/bin/env bash

source "$rvm_scripts_path/functions/requirements/centos"

requirements_clearos_define_glibc()
{
  requirements_check glibc-headers glibc-devel
}

requirements_clearos_define_libyaml()
{
  requirements_check libyaml-devel
}

requirements_clearos_define_openssl()
{
  requirements_check openssl-devel
}

requirements_clearos_define()
{
  __lib_type=centos

  requirements_centos_define "$@"
}
src/rvm/scripts/functions/requirements/deepin000066400000001603147511530550015560 0ustar00#!/usr/bin/env bash

source "$rvm_scripts_path/functions/requirements/debian"

requirements_deepin_define_libgmp()
{
  requirements_check libgmp-dev
}

requirements_deepin_define_libreadline()
{
  requirements_check libreadline-dev
}

requirements_deepin_define_libssl()
{
  case "$1" in
    (ruby-2.3*|ruby-2.2*|ruby-2.1*|ruby-2.0*|ruby-1.9*)
        # legacy libssl-dev required by older version of ruby has been renamed to libssl1.0-dev
        undesired_check libssl-dev
        requirements_check libssl1.0-dev
      ;;

    (*)
      undesired_check libssl1.0-dev
      requirements_check libssl-dev
      ;;
  esac
}

requirements_deepin_define_clang_llvm()
{
  requirements_check clang-3.6 llvm-3.6 llvm-3.6-dev
  rvm_configure_flags+=( --cc=clang-3.6 --cxx=clang++-3.6 --llvm-config=llvm-config-3.6)
}

requirements_deepin_define()
{
  __lib_type=debian
  requirements_debian_define "$@"
}
src/rvm/scripts/functions/requirements/openmandriva000066400000003553147511530550017005 0ustar00#!/usr/bin/env bash

requirements_openmandriva_lib_installed()
{
  rpm -q --whatprovides "$1" >/dev/null || return $?
}

requirements_openmandriva_lib_available()
{
  urpmq "$1" >/dev/null 2>&1 || return $?
}

requirements_openmandriva_version_list()
{
  rpm -q --whatprovides "$1" | sed -e "s#^$1-##"
}

requirements_openmandriva_libs_install()
{
  __rvm_try_sudo urpmi --downloader wget --wget-options --auth-no-challenge --auto "$@" || return $?
}

requirements_openmandriva_update_system()
{
  __rvm_try_sudo urpmi.update -a ||
  {
    \typeset __ret=$?
    case ${__ret} in
      (100)
        rvm_error "There has been error while updating 'urpmi.update', please give it some time and try again later.
404 errors should be fixed for rvm to proceed. Check your sources configured in:
    /etc/urpmi/urpmi.cfg
"
        ;;
    esac
    return ${__ret}
  }
}

requirements_openmandriva_define()
{
  case "$1" in
    (rvm)
      requirements_check bash curl patch
      ;;

    (jruby*)
      requirements_check make
      
      true # not that easy
      ;;

    (ir*)
      true # not that easy
      ;;

    (opal)
      true # not that easy
      ;;

    (*-head)
      requirements_check git
      requirements_openmandriva_define "${1%-head}"
      ;;

    (*)
      if [[ ${#rvm_patch_names[@]} -gt 0 || "$1" == *"-head" ]]
      then requirements_version_minimal autoconf 2.67
      else requirements_check autoconf
      fi

      if [[ "${_system_arch}" == "x86_64" || "${_system_arch}" == "aarch64" ]]
      then requirements_check lib64yaml-devel lib64ffi-devel
      else requirements_check libyaml-devel libffi-devel
      fi

      requirements_check autoconf gcc-c++ glibc-devel patch readline sqlite3-devel \
        readline-devel zlib zlib-devel openssl-devel make bzip2 automake libtool bison
      ;;
  esac
}

requirements_rosadesktop_before()
{
  __lib_type=openmandriva
}
src/rvm/scripts/functions/requirements/gentoo_pkgcore000066400000001100147511530550017311 0ustar00#!/usr/bin/env bash

requirements_find_gentoo_pkgcore()
{
  if
    eselect package-manager >/dev/null 2>&1
  then
    [[ $(eselect package-manager show | __rvm_tail -1 | __rvm_sed 's/ //g') = 'pkgcore' ]] || return $?
  else
    __rvm_which pmerge >/dev/null 2>&1 || return $?
  fi
}

requirements_gentoo_pkgcore_lib_installed()
{
  pquery --vdb "$1" | __rvm_grep "$1" >/dev/null || return $?
}

requirements_gentoo_pkgcore_libs_install()
{
  __rvm_try_sudo pmerge "$@" || return $?
}

requirements_gentoo_pkgcore_update_system()
{
  __rvm_try_sudo pmaint sync || return $?
}
src/rvm/scripts/functions/requirements/pclinuxos000066400000004475147511530550016352 0ustar00#!/usr/bin/env bash

requirements_pclinuxos_lib_installed()
{
  rpm -q --whatprovides "$1" >/dev/null || return $?
  # Alternative: rpm -qa | grep "$1" >/dev/null || return $?
}

requirements_pclinuxos_lib_available()
{
  apt-cache search "$1" >/dev/null 2>&1 || return $?
}

requirements_pclinuxos_version_list()
{
  rpm -q --whatprovides "$1" | sed -e "s#^$1-##"
}

requirements_pclinuxos_libs_install()
{
  __rvm_try_sudo apt-get -y install "$@" || return $?
}

requirements_pclinuxos_update_system()
{
  true
}

requirements_pclinuxos_check_binary()
{
  {
    __rvm_which update-alternatives >/dev/null &&
    update-alternatives --display "$1" >/dev/null 2>&1
  } ||
  __rvm_which "$1" >/dev/null || return $?
}

requirements_pclinuxos_define()
{
  case "$1" in
    (rvm)
      requirements_check bash curl patch
      ;;

    (jruby*)
      requirements_check make

      if
        is_head_or_disable_binary "$1"
      then
        requirements_pclinuxos_check_binary javac ||
          requirements_check_fallback java-1.7.0-openjdk-devel java-devel

        requirements_check git

        case $( jruby_installation_method  "$1" ) in
          mvn) requirements_check_custom_after mvn=maven ;;
        esac
      else
        requirements_pclinuxos_check_binary java ||
          requirements_check_fallback java-1.7.0-openjdk java
      fi
      ;;

    (ir*)
      true # not that easy
      ;;

    (opal)
      true # not that easy
      ;;

    (rbx*|rubinius*)
      requirements_check clang clang-devel llvm llvm-devel
      ;;

    (truffleruby*)
      requirements_check lib64openssl-devel zlib zlib-devel make gcc libxml2
      ;;

    (*-head)
      requirements_check git
      requirements_pclinuxos_define "${1%-head}"
      ;;

    (*)
      if [[ ${#rvm_patch_names[@]} -gt 0 || "$1" == *"-head" ]]
      then requirements_version_minimal autoconf 2.67
      else requirements_check autoconf
      fi

      case "${_system_arch}" in
        (x86_64)
          requirements_check lib64yaml-devel lib64ffi-devel lib64readline-devel lib64openssl-devel
          ;;
        (*)
          requirements_check libyaml-devel libffi5-devel readline-devel libopenssl-devel
          ;;
      esac

      requirements_check automake bison bzip2 gcc-c++ glibc-devel glibc-headers-devel libtool make patch \
         zlib zlib-devel
      ;;
  esac
}
src/rvm/scripts/functions/requirements/elementary000066400000001632147511530550016463 0ustar00#!/usr/bin/env bash

source "$rvm_scripts_path/functions/requirements/debian"

requirements_elementary_define_libgmp()
{
  requirements_check libgmp-dev
}

requirements_elementary_define_libreadline()
{
  requirements_check libreadline6-dev
}

requirements_elementary_define_libssl()
{
  case "$1" in
    (ruby-2.3*|ruby-2.2*|ruby-2.1*|ruby-2.0*|ruby-1.9*)
      if
        __rvm_version_compare ${_system_version} -ge 5
      then
        undesired_check libssl-dev
        requirements_check libssl1.0-dev
      else
        requirements_check libssl-dev
      fi
      ;;

    (*)
      requirements_check libssl-dev
      ;;
  esac
}

requirements_elementary_define_clang_llvm()
{
  requirements_check clang-3.6 llvm-3.6 llvm-3.6-dev
  rvm_configure_flags+=( --cc=clang-3.6 --cxx=clang++-3.6 --llvm-config=llvm-config-3.6)
}


requirements_elementary_define()
{
  __lib_type=debian
  requirements_debian_define "$@"
}
src/rvm/scripts/functions/requirements/solaris000066400000012436147511530550015776 0ustar00#!/usr/bin/env bash

requirements_solaris_lib_installed()
{
  pkg info "$1" > /dev/null 2>&1 || return $?
}

requirements_solaris_lib_available()
{
  pkg search "$1" 2>/dev/null | __rvm_grep "^$1-" > /dev/null 2>&1 || return $?
}

requirements_solaris_custom_lib_installed()
{
  pkginfo -q "$1" || return $?
}

requirements_solaris_libs_install()
{
  __rvm_try_sudo pkg install "$@" ||
  {
    \typeset ret=$?
    case $ret in
      (4) return 0 ;; # means the package does not need updates
    esac
    return $ret
  }
}

requirements_solaris_update_system()
{
  case "${_system_version}" in
    (10)
      return 0
      ;;
    (*)
      __rvm_try_sudo pkg refresh ||
      {
        \typeset ret=$?
        case $ret in
          (4) return 0 ;; # means nothing to install
        esac
        return $ret
      }
      ;;
  esac
}

requirements_solaris_check_custom()
{
  for lib in "$@"
  do
    [[ " ${packages_custom[*]} " == *" $lib "* ]] ||
    requirements_solaris_custom_lib_installed "$lib" || __rvm_add_once packages_custom "$lib"
  done
  unset lib
}

requirements_solaris_check_opencsw_enabled()
{
  requirements_solaris_custom_lib_installed CSWpkgutil || return $?
}

requirements_solaris_enable_opencsw()
{
  __rvm_try_sudo pkgadd -a $rvm_path/config/solaris/noask -d https://get.opencsw.org/now CSWpkgutil > /dev/null 2>&1 || return $?
}

requirements_solaris_install_custom()
{
  requirements_solaris_check_opencsw_enabled || requirements_solaris_enable_opencsw
  __rvm_try_sudo /opt/csw/bin/pkgutil -iy "$@" -t https://mirror.opencsw.org/opencsw/unstable || return $?
}

requirements_solaris_define()
{
  if
    is_a_function requirements_solaris_${_system_version}_define
  then
    requirements_solaris_${_system_version}_define "$@" || return $?
  else
    rvm_error "Solaris ${_system_version} is not supported"
    return 40
  fi
}

requirements_solaris_11_update_after()
{
  __rvm_try_sudo pkg update "${packages_installed[@]}" ||
  {
    \typeset ret=$?
    case $ret in
      (4) return 0 ;; # means nothing to install
    esac
    return $ret
  }
}

requirements_solaris_after()
{
  case "${_system_version}" in
    (10)
      return 0
      ;;
    (*)
      if
        [[ -n "${packages_installed[*]}" ]]
      then
        rvm_requiremnts_fail_or_run_action 3 \
          "Updating installed packages: ${packages_installed[*]}" \
          requirements_solaris_11_update_after ||
          return $?
      fi
      ;;
  esac
}

requirements_solaris_10_define()
{
  case "$1" in
    (rvm)
      requirements_solaris_check_custom CSWbash CSWgit CSWgpatch CSWmd5deep CSWwhich
      ;;

    (jruby-head*)
      requirements_solaris_check_custom git make
      ;;

    (jruby*)
      # JDK is already installed on Solaris 10
      # TODO: is ant installed also?
      requirements_solaris_check_custom make

      if
        is_head_or_disable_binary "$1"
      then
        requirements_solaris_check_custom git
        case $( jruby_installation_method  "$1" ) in
          mvn) requirements_check_custom_after mvn=maven ;;
        esac
      fi
      ;;

    (ir*)
      # No support
      true
      ;;

    (opal)
      # No support
      true
      ;;

    (*-head)
      requirements_solaris_check_custom CSWgpatch CSWgcc4core CSWgmake CSWcoreutils CSWpkgconfig CSWautoconf CSWautomake CSWlibtool CSWlibyaml-dev CSWlibreadline-dev CSWlibncurses-dev CSWlibssl-dev CSWcurl CSWgit
      __rvm_update_configure_opt_dir "$1" "/opt/csw"
      ;;

    (*)
      requirements_solaris_check_custom CSWgpatch CSWgcc4core CSWgmake CSWcoreutils CSWpkgconfig CSWautoconf CSWautomake CSWlibtool CSWlibyaml-dev CSWlibreadline-dev CSWlibncurses-dev CSWlibssl-dev CSWcurl
      __rvm_update_configure_opt_dir "$1" "/opt/csw"
      ;;
  esac
}

requirements_solaris_11_define()
{
  case "$1" in
    (rvm)
      requirements_check bash curl text/gnu-patch
      requirements_check_fallback git scmgit-base
      ;;
    (jruby*)
      # This will fail with the message
      ## To indicate that you agree to and accept the terms of the licenses of the packages listed above, use the --accept option.
      ## To display all of the related licenses, use the --licenses option.
      # Need to handle this somehow
      if
        is_head_or_disable_binary "$1"
      then
        requirements_check jdk
        requirements_check_fallback git scmgit-base
        case $( jruby_installation_method  "$1" ) in
          ant) requirements_check ant                    ;;
          mvn) requirements_check_custom_after mvn=maven ;;
        esac
      else
        requirements_check jdk
      fi
      ;;
    (ir*)
      # No support
      true
      ;;
    (opal)
      # No support
      true
      ;;
    (*-head)
      requirements_check_fallback git scmgit-base
      requirements_check text/gnu-patch developer/gcc-45 system/header developer/build/autoconf developer/build/automake developer/build/libtool system/library/math/header-math file/gnu-coreutils
      requirements_solaris_check_custom CSWlibyaml-dev
      __rvm_update_configure_opt_dir "$1" "/opt/csw"
      ;;
    (*)
      requirements_check text/gnu-patch developer/gcc-45 system/header developer/build/autoconf developer/build/automake developer/build/libtool system/library/math file/gnu-coreutils
      requirements_solaris_check_custom CSWlibyaml-dev
      __rvm_update_configure_opt_dir "$1" "/opt/csw"
      ;;
  esac
}
src/rvm/scripts/functions/requirements/gentoo000066400000003206147511530550015610 0ustar00#!/usr/bin/env bash

source "$rvm_scripts_path/functions/requirements/gentoo_paludis"
source "$rvm_scripts_path/functions/requirements/gentoo_pkgcore"
source "$rvm_scripts_path/functions/requirements/gentoo_portage"

requirements_gentoo_before()
{
  \typeset __iterator
  for __iterator in gentoo_portage gentoo_paludis gentoo_pkgcore
  do
    if
      requirements_find_${__iterator}
    then
      __lib_type=${__iterator}
      return 0
    fi
  done

  # fallback
  __lib_type=gentoo_portage
}

requirements_gentoo_define()
{
  case "$1" in
    (rvm)
      requirements_check net-misc/curl sys-devel/patch app-shells/bash
      ;;

    (jruby*)
      requirements_check make

      if
        is_head_or_disable_binary "$1"
      then
        requirements_check virtual/jdk dev-vcs/git
        case $( jruby_installation_method  "$1" ) in
          ant) requirements_check dev-java/ant-core  ;;
          mvn) requirements_check dev-java/maven-bin ;;
        esac
      else
        requirements_check virtual/jre
      fi
      ;;

    (truffleruby*)
      requirements_check sys-libs/zlib dev-libs/openssl net-misc/curl sys-devel/make sys-devel/gcc dev-libs/libxml2
      ;;

    (ir*)
      requirements_check dev-lang/mono
      ;;

    (opal)
      requirements_check net-libs/nodejs
      ;;

    (*-head)
      requirements_gentoo_define "${1%-head}"
      requirements_check dev-vcs/git
      ;;

    (*)
      requirements_check virtual/libiconv sys-libs/readline sys-libs/zlib dev-libs/openssl net-misc/curl dev-libs/libyaml dev-db/sqlite sys-devel/libtool sys-devel/gcc sys-devel/autoconf sys-devel/automake sys-devel/bison sys-devel/m4
      ;;
  esac
}
src/rvm/scripts/functions/requirements/mageia000066400000000763147511530550015545 0ustar00#!/usr/bin/env bash

source "$rvm_scripts_path/functions/requirements/centos"

requirements_mageia_define_glibc()
{
  requirements_check glibc-devel
}

requirements_mageia_define_libyaml()
{
  if
    [[ "${_system_arch}" == "x86_64" ]]
  then
    requirements_check lib64yaml-devel
  else
    requirements_check libyaml-devel
  fi
}

requirements_mageia_define_openssl()
{
  requirements_check openssl-devel
}

requirements_mageia_define()
{
  __lib_type=centos

  requirements_centos_define "$@"
}
src/rvm/scripts/functions/requirements/redhat000066400000000677147511530550015575 0ustar00#!/usr/bin/env bash

source "$rvm_scripts_path/functions/requirements/centos"

requirements_redhat_define_glibc()
{
  requirements_check glibc-headers glibc-devel
}

requirements_redhat_define_libyaml()
{
  case "$1" in
    (ruby-1*) requirements_check libyaml-devel ;;
  esac
}

requirements_redhat_define_openssl()
{
  requirements_check openssl-devel
}

requirements_redhat_define()
{
  __lib_type=centos
  
  requirements_centos_define "$@"
}
src/rvm/scripts/functions/requirements/openindiana000066400000010474147511530550016607 0ustar00#!/usr/bin/env bash

requirements_openindiana_lib_installed()
{
  pkg info "$1" > /dev/null 2>&1 || return $?
}

requirements_openindiana_lib_available()
{
  pkg info -r "$1" > /dev/null 2>&1 || return $?
}

requirements_openindiana_custom_lib_installed()
{
  pkginfo -q "$1" || return $?
}

requirements_openindiana_libs_install()
{
  __rvm_try_sudo pkg install "$@" ||
  {
    \typeset ret=$?
    case $ret in
      (4) return 0 ;; # means the package does not need updates
    esac
    return $ret
  }
}

requirements_openindiana_update_system()
{
  __rvm_try_sudo pkg refresh && __rvm_try_sudo pkg update ||
  {
    \typeset ret=$?
    case $ret in
      (4) return 0 ;; # means nothing to install
    esac
    return $ret
  }
}

requirements_openindiana_check_custom()
{
  for lib in "$@"
  do
    [[ " ${packages_custom[*]} " == *" $lib "* ]] ||
    requirements_openindiana_custom_lib_installed "$lib" || __rvm_add_once packages_custom "$lib"
  done
  unset lib
}

requirements_openindiana_check_opencsw_enabled()
{
  requirements_openindiana_custom_lib_installed CSWpkgutil || return $?
}

requirements_openindiana_enable_opencsw()
{
  __rvm_try_sudo pkgadd -a $rvm_path/config/solaris/noask -d https://get.opencsw.org/now CSWpkgutil > /dev/null 2>&1 || return $?
}

requirements_openindiana_install_custom()
{
  requirements_openindiana_check_opencsw_enabled || requirements_openindiana_enable_opencsw
  __rvm_try_sudo /opt/csw/bin/pkgutil -iy "$@" -t https://mirror.opencsw.org/opencsw/unstable || return $?
}

requirements_openindiana_after()
{
  # https://www.illumos.org/issues/782
  if ! __rvm_which automake >/dev/null 2>&1 && __rvm_which /usr/bin/automake-1.10 >/dev/null 2>&1
  then ln -s /usr/bin/automake-1.10 "${rvm_bin_path}"/automake
  fi
  if ! __rvm_which aclocal >/dev/null 2>&1 && __rvm_which /usr/bin/aclocal-1.10 >/dev/null 2>&1
  then ln -s /usr/bin/aclocal-1.10 "${rvm_bin_path}"/aclocal
  fi
}

requirements_openindiana_define()
{
  case "$1" in
    (rvm)
      requirements_check bash curl text/gnu-patch
      ;;

    (jruby*)
      requirements_check make jdk

      if
        is_head_or_disable_binary "$1"
      then
        requirements_check git
        case $( jruby_installation_method  "$1" ) in
          ant) requirements_check apache-ant             ;;
          mvn) requirements_check_custom_after mvn=maven ;;
        esac
      fi
      ;;

    (ir*)
      requirements_check mono
      ;;

    (opal)
      requirements_check runtime/javascript/nodejs
      ;;

    (*-head)
      requirements_check git
      requirements_openindiana_define "${1%-head}"
      ;;

    (*)
      requirements_check_fallback \
        developer/gcc47 developer/gcc-47 \
        developer/gcc46 developer/gcc-46 \
        developer/gcc44 developer/gcc-43 developer/gcc/gcc-43
      requirements_check_fallback \
        developer/build/automake \
        developer/build/automake-111 \
        developer/build/automake-110
      requirements_check \
        text/gnu-patch system/header developer/build/autoconf \
        developer/build/libtool system/library/math/header-math \
        file/gnu-coreutils developer/object-file developer/build/gnu-make
      requirements_openindiana_check_custom CSWlibyaml-dev
      __rvm_update_configure_opt_dir "$1" "/opt/csw"
      ;;
  esac
}

requirements_openindiana_after()
{
  if is_a_function requirements_openindiana_after_${_system_name}
  then requirements_openindiana_after_${_system_name} || return $?
  else requirements_openindiana_after_Other || return $?
  fi
}

requirements_openindiana_after_OmniOS()
{
  case "${packages_installed[*]}" in
    (*developer/gcc47*)
      __rvm_update_configure_env CC="/opt/gcc-4.7.2/bin/gcc" ;;
    (*developer/gcc-3*)
      __rvm_update_configure_env CC="/usr/sfw/bin/gcc" ;;
    (*)
      return 1 ;;
  esac
}

requirements_openindiana_after_Other()
{
  case "${packages_installed[*]}" in
    (*developer/gcc47*|*developer/gcc-47*)
      __rvm_update_configure_env CC="/usr/gcc/4.7/bin/gcc" ;;
    (*developer/gcc46*|*developer/gcc-46*)
      __rvm_update_configure_env CC="/usr/gcc/4.6/bin/gcc" ;;
    (*developer/gcc44*)
      __rvm_update_configure_env CC="/usr/gcc/4.4/bin/gcc" ;;
    (*developer/gcc-43*|*developer/gcc/gcc-43*)
      __rvm_update_configure_env CC="/usr/gcc/4.3/bin/gcc" ;;
    (*)
      return 1 ;;
  esac
}

requirements_omnios_before()
{
  __lib_type=openindiana
}
src/rvm/scripts/functions/requirements/devuan000066400000001107147511530550015575 0ustar00#!/usr/bin/env bash

source "$rvm_scripts_path/functions/requirements/debian"

requirements_devuan_define_libgmp()
{
  requirements_check libgmp-dev
}

requirements_devuan_define_libreadline()
{
  requirements_check libreadline6-dev
}

requirements_devuan_define_libssl()
{
  requirements_check libssl-dev
}

requirements_devuan_define_clang_llvm()
{
  requirements_check clang-3.6 llvm-3.6 llvm-3.6-dev
  rvm_configure_flags+=( --cc=clang-3.6 --cxx=clang++-3.6 --llvm-config=llvm-config-3.6)
}

requirements_devuan_define()
{
  __lib_type=debian
  requirements_debian_define "$@"
}
src/rvm/scripts/functions/requirements/openbsd000066400000004767147511530550015764 0ustar00#!/usr/bin/env bash

requirements_openbsd_lib_installed()
{
  pkg_info | __rvm_grep "^$1" >/dev/null 2>&1 || return $?
}

requirements_openbsd_lib_available()
{
  pkg_info -Q "${1%%-[[:digit:]]}" | __rvm_grep "^$1" >/dev/null 2>&1 || return $?
}

requirements_openbsd_libs_install()
{
  __rvm_try_sudo pkg_add -z "$@" || return $?
}

requirements_openbsd_install_node()
{
  # plain make is required for sudo
  __rvm_try_sudo make -C /usr/ports/www/node install clean || return $?
}

requirements_openbsd_update_system()
{
  [[ -d /usr/ports ]] ||
  {
    \typeset __url __target __result=0
    __url="http://ftp.openbsd.org/pub/OpenBSD/${_system_version}/ports.tar.gz"
    __target="$( TMPDIR="${rvm_tmp_path}" mktemp ${TMPDIR:-/tmp}/tmp.XXXXXXXXXXXXXXXXXX )"
    __rvm_curl "${__url}" -o "${__target}"        &&
    __rvm_try_sudo tar -C /usr -zxf "${__target}" ||
    __result=$?
    rm -f "${__target}"
    return ${__result}
  }
  true
}

requirements_openbsd_define()
{
  case "$1" in
    (rvm)
      requirements_check bash curl
      ;;

    (jruby*)
      requirements_check make jdk

      if
        is_head_or_disable_binary "$1"
      then
        requirements_check git
        case $( jruby_installation_method  "$1" ) in
          ant) requirements_check apache-ant ;;
          mvn) requirements_check maven      ;;
        esac
      fi
      ;;

    (ir*)
      requirements_check mono
      ;;

    (opal)
      requirements_check_custom node
      ;;

    (ruby-1.9.3*|ruby-2.0.0*)
      rvm_error "Beware there is a compilation bug in $1 on OpenBSD, it's fixed in ruby-2.1.0
for more details see https://bugs.ruby-lang.org/issues/7959"
      return 103
      ;;

    (*-head)
      # OpenSSL is installed by default http://www.openbsd.org/crypto.html
      requirements_check gcc-4 automake-1 libtool bison readline-6 libyaml-0 git
      requirements_check_fallback autoconf-2.69p0 autoconf-2.68 autoconf-2.67
      __rvm_update_configure_opt_dir "$1" "/usr/local"
      ;;

    (*)
      # OpenSSL is installed by default http://www.openbsd.org/crypto.html
      requirements_check gcc-4 autoconf-2 automake-1 libtool bison readline-6 libyaml-0
      __rvm_update_configure_opt_dir "$1" "/usr/local"
      ;;
  esac
}

requirements_openbsd_before()
{
  [[ -n "${PKG_PATH:-}" ]] ||
  {
    export PKG_PATH=http://ftp.openbsd.org/pub/OpenBSD/${_system_version}/packages/$(arch -s)/
    rvm_warn "WARNING: \$PKG_PATH was not set, using fallback '$PKG_PATH',
see http://www.openbsd.org/ftp.html for list of available mirrors."
  }
}
src/rvm/scripts/functions/requirements/centos000066400000015275147511530550015621 0ustar00#!/usr/bin/env bash

requirements_centos_lib_installed()
{
  rpm -q --whatprovides "$1" >/dev/null || return $?
}

requirements_centos_lib_available()
{
  yum list --cacheonly --quiet "$1" >/dev/null 2>&1 || return $?
}

# required only for libyaml-devel check as fedora is broken ...
requirements_centos_lib_available_no_caching()
{
  yum list --quiet "$1" >/dev/null 2>&1 || return $?
}

requirements_centos_version_list()
{
  rpm -q --whatprovides "$1" | sed -e "s#^$1-##"
}

requirements_centos_install_custom()
{
  requirements_rvm_pkg_libs_install "$@" || return $?
}

requirements_centos_libs_install()
{
  __rvm_try_sudo yum install -y "$@" || return $?
}

requirements_centos_before_update_check_repos_missing_error()
{
  rvm_error "There is no '$*' package available for installation and RVM does not know how to make that happen,
please tell us how to install '$*' on '${_system_name}-${_system_version}' here: https://github.com/rvm/rvm/issues"
  return 49
}

requirements_centos_before_update_check_rhn_channel()
{
  __rvm_try_sudo rhn-channel -l | grep optional >/dev/null ||
  {
    \typeset __package_name="$(
      __rvm_try_sudo rhn-channel -l |
      awk '/^rhel-'"${_system_arch}"'-(server|client|workstation)-[0-9]+$/{print gensub(/(-[0-9]+)$/, "-optional\\1", "g")}'
    )"
    rvm_log "Enabling optional repository"
    rvm_requiremnts_fail_or_run_action 2 \
      "It is not possible to enable optional repository for $*, enable it using: rhn-channel -a -c ${__package_name}" \
      __rvm_try_sudo rhn-channel -a -c "${__package_name}" ||
      return $?
  }
}

requirements_centos_before_install_epel()
{
  "${rvm_scripts_path}/fetch" "${epel_key}"
  "${rvm_scripts_path}/fetch" "${epel_rpm}"
  __rvm_try_sudo rpm --import   "${rvm_archives_path}/${epel_key##*/}"
  __rvm_try_sudo rpm --quiet -i "${rvm_archives_path}/${epel_rpm##*/}" ||
  {
    \typeset __ret=$?
    rvm_error "Error installing EPEL, it is required for libyaml-devel,
either there was an error installing EPEL package,
or there was problem checking if libyaml-devel is available / installed."
    return ${__ret}
  }
}

requirements_centos_before_update_check_epel()
{
  [[ " $* " == *" libyaml-devel "* ]] || return 0
  # if you change this, change the scripts/functions/pkg version too
  [[ -f /etc/yum.repos.d/epel.repo ]] ||
  {
    \typeset version="${_system_version%%.*}"
    __rvm_db "epel${version}_key" "epel_key"
    __rvm_db "epel${version}_${_system_arch}_rpm" "epel_rpm"
    if
      [[ -z "$epel_rpm" || -z "$epel_key" ]]
    then
      requirements_centos_before_update_check_repos_missing_error $* || return $?
    fi
    rvm_requiremnts_fail_or_run_action 2 \
      "It is not possible to install EPEL repository for YAML, install it using: $epel_rpm" \
      __rvm_log_command centos_install_epel "Installing EPEL repository" requirements_centos_before_install_epel ||
      return $?
  }
}

# return 0  when found missing packages
# return >0 when no missing packages
requirements_centos_before_update_check_missing_packages()
{
  \typeset -a __packages_to_check
  \typeset __package_name
  case "${_system_name_lowercase}" in
    (redhat)
      __packages_to_check=( libyaml-devel libffi-devel )
      ;;
    (centos)
      __packages_to_check=( libyaml-devel )
      ;;
    (*)
      return 1
      ;;
  esac
  __missing_packages=()
  for __package_name in "${__packages_to_check[@]}"
  do
    if
      [[ " ${packages_to_install[*]} " == *" ${__package_name} "* ]] &&
      ! requirements_centos_lib_installed "${__package_name}" &&
      ! requirements_centos_lib_available_no_caching "${__package_name}"
    then
      __missing_packages+=( "${__package_name}" )
    fi
  done
  [[ ${#__missing_packages[*]} -gt 0 ]] || return 2
}

requirements_centos_before_update_check_repos()
{
  \typeset -a __missing_packages
  requirements_centos_before_update_check_missing_packages || return 0

  case "${_system_name_lowercase}" in
    (redhat)
      requirements_centos_before_update_check_rhn_channel "${__missing_packages[@]}" || return $?
      ;;
    (centos)
      requirements_centos_before_update_check_epel "${__missing_packages[@]}" || return $?
      ;;
    (*)
      requirements_centos_before_update_check_repos_missing_error "${__missing_packages[@]}" || return $?
      ;;
  esac
}

requirements_centos_before_update()
{
  case "$1" in
    (ruby-1*)
      requirements_centos_before_update_check_repos || return $?
      ;;
  esac
}

requirements_centos_check_binary()
{
  {
    __rvm_which update-alternatives >/dev/null &&
    update-alternatives --display "$1" >/dev/null 2>&1
  } ||
  __rvm_which "$1" >/dev/null || return $?
}

requirements_centos_define_glibc()
{
  requirements_check glibc-headers glibc-devel
}

requirements_centos_define_libyaml()
{
  case "$1" in
    (ruby-1*) requirements_check libyaml-devel ;;
  esac
}

requirements_centos_define_openssl()
{
  requirements_check openssl-devel
}

requirements_centos_define()
{
  case "$1" in
    (rvm)
      requirements_check bash curl patch
      ;;

    (jruby*)
      requirements_check make

      if
        is_head_or_disable_binary "$1"
      then
        requirements_centos_check_binary javac ||
          requirements_check_fallback java-1.8.0-openjdk-devel java-devel ||
          requirements_check_fallback java-1.7.0-openjdk-devel java-devel
        requirements_check git
        case $( jruby_installation_method  "$1" ) in
          mvn) requirements_check_custom_after mvn=maven ;;
        esac
      else
        requirements_centos_check_binary java ||
          requirements_check_fallback java-1.8.0-openjdk java ||
          requirements_check_fallback java-1.7.0-openjdk java
      fi
      ;;

    (rbx*|rubinius*)
      requirements_check automake bison clang-3.6 flex gdbm-devel git libyaml-devel llvm-devel llvm-static \
                         make ncurses-devel openssl-devel readline-devel ruby-devel rubygems zlib-devel
      ;;

    (truffleruby*)
      requirements_check zlib-devel make gcc libxml2
      requirements_${_system_name_lowercase}_define_openssl $1
      ;;

    (ir*)
      true # not that easy
      ;;

    (opal)
      true # not that easy
      ;;

    (*-head)
      requirements_check git
      requirements_centos_define "${1%-head}"
      requirements_version_minimal autoconf 2.67
      ;;

    (*)
      if [[ ${#rvm_patch_names[@]} -gt 0 ]]
      then requirements_version_minimal autoconf 2.67
      fi

      requirements_check autoconf automake bison bzip2 gcc-c++ libffi-devel libtool make patch readline \
                         readline-devel ruby sqlite-devel zlib zlib-devel

      requirements_${_system_name_lowercase}_define_glibc $1
      requirements_${_system_name_lowercase}_define_libyaml $1
      requirements_${_system_name_lowercase}_define_openssl $1
      ;;
  esac
}
src/rvm/scripts/functions/requirements/sabayon000066400000000655147511530550015756 0ustar00#!/usr/bin/env bash

source "$rvm_scripts_path/functions/requirements/gentoo"

requirements_sabayon_define()
{
  requirements_gentoo_define "$@"
}

requirements_sabayon_lib_installed()
{
  __rvm_try_sudo equo query installed "$1" >/dev/null || return $?
}

requirements_sabayon_libs_install()
{
  __rvm_try_sudo equo install "$@" || return $?
}

requirements_sabayon_update_system()
{
  __rvm_try_sudo equo update || return $?
}
src/rvm/scripts/functions/requirements/arch000066400000011240147511530550015227 0ustar00#!/usr/bin/env bash

requirements_arch_lib_installed_all_missing()
{
  pacman -T "$@" || true
}

requirements_arch_lib_installed() {
  pacman -Qq "$1" >/dev/null 2>&1 || return $?
}

requirements_arch_lib_available()
{
  pacman -Ssq "^${1}$" >/dev/null 2>&1 || return $?
}

requirements_arch_libs_install()
{
  __rvm_try_sudo pacman -Sy --needed --noconfirm "$@" || return $?
}

requirements_arch_libs_remove()
{
  __rvm_try_sudo pacman -Rs --noconfirm "$@" || return $?
}

requirements_arch_update_system()
{
  # Has to be ran separately so new version can be used for installing missing libs
  requirements_arch_libs_install pacman || return $?
}

requirements_arch_define_check_raspberry_pi()
{
  if
    [[ "${_system_arch}" == "arm"* ]]
  then
    # assuming all arm will need this fix
    requirements_check_fallback ntp openntpd chrony
  fi
}

requirements_arch_define_openssl()
{
  case "$1" in
    (ruby-2.3*|ruby-2.2*|ruby-2.1*|ruby-2.0*|ruby-1.9*)
      requirements_check openssl-1.0

      # Ruby should respect pkg-config in case of openssl (it does not have to be the case with other extensions)
      # https://github.com/ruby/ruby/blob/trunk/ext/openssl/extconf.rb#L38
      export PKG_CONFIG_PATH="/usr/lib/openssl-1.0/pkgconfig${PKG_CONFIG_PATH:+:}${PKG_CONFIG_PATH:-}"
      ;;
    (*)
      requirements_check openssl
      ;;
  esac
}

requirements_arch_define()
{
  requirements_arch_define_check_raspberry_pi

  case "$1" in
    (rvm)
      requirements_check bash curl patch
      ;;
    (jruby*)
      requirements_check curl make

      if
        is_head_or_disable_binary "$1"
      then
        requirements_check_fallback jdk8-openjdk jdk7-openjdk
        requirements_check git
        case $( jruby_installation_method  "$1" ) in
          ant) __rvm_which ant >/dev/null || requirements_check apache-ant ;;
          mvn) __rvm_which mvn >/dev/null || requirements_check maven      ;;
        esac
      else
        requirements_check_fallback jre8-openjdk jre7-openjdk
      fi
      ;;
    (ir*)
      requirements_check mono
      ;;
    (opal)
      requirements_check nodejs
      ;;
    (rbx*head|rubinius*head)
      undesired_check clang35 llvm35 llvm35-libs
      requirements_check clang llvm llvm-libs patch curl zlib readline autoconf automake diffutils make libtool bison git
      ;;
    (rbx-3*|rubinius-3*)
      undesired_check clang35 llvm35 llvm35-libs
      requirements_check clang llvm llvm-libs patch curl zlib readline autoconf automake diffutils make libtool bison
      ;;
    (rbx-2*|rubinius-2*)
      undesired_check clang llvm llvm-libs
      requirements_check clang35 llvm35 llvm35-libs patch curl zlib readline autoconf automake diffutils make libtool bison
      ;;
    (rbx-1*|rubinius-1*)
      undesired_check clang llvm llvm-libs
      requirements_check clang35 llvm35 llvm35-libs patch curl zlib readline autoconf automake diffutils make libtool bison
      ;;
    (truffleruby*)
      requirements_check zlib make gcc libxml2
      requirements_arch_define_openssl "$1"
      ;;
    (ruby-2.3*|ruby-2.2*|ruby-2.1*|ruby-2.0*|ruby-1.9*)
      requirements_check gcc patch curl zlib readline autoconf automake diffutils make libtool bison sqlite git
      requirements_arch_define_openssl "$1"
      ;;
    (*-head)
      requirements_check gcc patch curl zlib readline autoconf automake diffutils make libtool bison sqlite git
      requirements_arch_define_openssl "$1"
      ;;
    (*)
      requirements_check gcc patch curl zlib readline autoconf automake diffutils make libtool bison sqlite
      requirements_arch_define_openssl "$1"
      ;;
  esac
}

requirements_arch_service()
{
  systemctl $1 $3 >/dev/null ||
  if __rvm_try_sudo systemctl $2 $3
  then true
  else
    \typeset __arch_status=$?
    rvm_error "There was a problem running 'systemctl $2 $3' with exit status '$__arch_status'."
    return $__arch_status
  fi
}

requirements_arch_after_check_raspberry_pi()
{
  if
    [[ "${_system_arch}" == "arm"* ]]
  then
    ntp_servers=( ntpd systemd-timesyncd openntpd chronyd )
    for ntp_server in "${ntp_servers[@]}"
    do
      if
        systemctl list-unit-files | grep -Fq "$ntp_server.service" &&
        systemctl is-active $ntp_server
      then
        return 0
      fi
    done
    for ntp_server in "${ntp_servers[@]}"
    do
      if
        systemctl list-unit-files | grep -Fq "$ntp_server.service"
      then
        requirements_arch_service is-enabled enable $ntp_server &&
        requirements_arch_service is-active  start  $ntp_server ||
        return $?
      fi
    done
  fi
}

requirements_arch_after()
{
  requirements_arch_after_check_raspberry_pi
}

requirements_manjaro_define()
{
  __lib_type=arch
  requirements_arch_define "$@" || return $?
}
src/rvm/scripts/functions/requirements/rvm_pkg000066400000004237147511530550015767 0ustar00#!/usr/bin/env bash

source "$rvm_scripts_path/functions/pkg"

requirements_rvm_pkg_wait_key()
{
  rvm_is_a_shell_function no_warning ||
  {
    rvm_error "
You are using 'rvm autolibs rvm_pkg', this does not know how to install some of the packages, make sure to install those first.
"
    return 1
  }
  rvm_log "press any key to continue"
  \typeset _read_char_flag anykey
  [[ -n "${ZSH_VERSION:-}" ]] && _read_char_flag=k || _read_char_flag=n
  builtin read -${_read_char_flag} 1 -s -r anykey
}

requirements_rvm_pkg_install_custom()
{
  if
    (( $# > 0 ))
  then
    rvm_warn "Before continuing install: $*"
    requirements_rvm_pkg_wait_key || return $?
  fi
}

requirements_rvm_pkg_before()
{
  __rvm_which pkg-config >/dev/null 2>&1 ||
  {
    rvm_error "
ERROR: can not find 'pkg-config', it is required for autolibs rvm_pkg to work, install it before continuing.
"
    return 1
  }
  rvm_warn "
Warning, you are using 'rvm autolibs rvm_pkg', this is rarely used and can produce errors,
make sure to report any problems to https://github.com/rvm/rvm/issues
"
}

requirements_rvm_pkg_update_system()
{
  rvm_warn "Always update your system first!"
}

requirements_rvm_pkg_define()
{
  case "$1" in
    (rvm)
      requirements_check_custom bash curl patch
      ;;

    (jruby*)
      requirements_check make

      if
        is_head_or_disable_binary "$1"
      then
        requirements_check_custom git
        case $( jruby_installation_method  "$1" ) in
          ant) requirements_check_custom ant             ;;
          mvn) requirements_check_custom_after mvn=maven ;;
        esac
      fi

      requirements_check_custom java
      ;;

    (ir*)
      requirements_check_custom mono
      ;;

    (opal)
      requirements_check_custom node
      ;;

    (yaml|zlib|openssl|readline|xml2|xslt)
      true # just skip the packages
      ;;

    (*-head)
      requirements_check_custom git
      requirements_rvm_pkg_define "${1%-head}"
      ;;

    (*)
      requirements_check_custom gcc g++ libtool bison bzip2
      requirements_check yaml zlib openssl readline
      ;;
  esac
}

requirements_rvm_pkg_after()
{
  requirements_rvm_pkg_configure "$1" yaml zlib openssl readline
}
src/rvm/scripts/functions/requirements/void000066400000003141147511530550015254 0ustar00#!/usr/bin/env bash

requirements_void_lib_installed()
{
  xbps-query -l | __rvm_grep "ii $1-[0-9]" >/dev/null || return $?
}

requirements_void_libs_install()
{
  __rvm_try_sudo xbps-install -S "$@" || return $?
}

requirements_void_libs_remove()
{
  __rvm_try_sudo xbps-remove -R "$@" || return $?
}

requirements_void_define_base()
{
  requirements_check "$@" \
    autoconf automake bison ca-certificates curl \
    gdbm-devel glibc-devel gmp-devel \
    libffi-devel libressl-devel libtool libyaml-devel \
    make ncurses-devel \
    patch pkg-config readline-devel \
    sqlite-devel zlib-devel

   # libc6-dev > glibc-devel ?
   # libgdbm-dev > gdbm-devel
   # libncurses5-dev > ncurses-devel
   # libreadline-dev > readline-devel
   # libgmp-dev > gmp-devel
   # libssl-dev > libssl45 ???
   # libsqlite3-dev > sqlite-devel
   # libyaml-dev > libyaml-devel
   # sqlite3 > sqlite
   # zlib1g > zlib
   # zlib1g-dev > zlib-devel

   # check https://www.reddit.com/r/voidlinux/comments/9i42l1/installing_asdf_version_manager_with_openssl/
}

requirements_void_define()
{
  # https://voidlinux.org/packages/

  if [[ "$1" == *head ]]
  then
      requirements_check git
  fi

  case "$1" in
    (rvm)
      requirements_check bash curl patch bzip2 gawk
      ;;

    (jruby*)
      # Not implemented
      true
      ;;

    (ir*)
      # Not implemented
      true
      ;;

    (opal)
      # Not implemented
      true
      ;;

    (rbx*|rubinius*)
      # Not implemented
      true
      ;;

    (truffleruby*)
      # Not implemented
      true
      ;;

    (*)
      requirements_void_define_base gcc
      ;;
  esac
}
src/rvm/scripts/functions/requirements/solus000066400000003336147511530550015466 0ustar00#!/usr/bin/env bash

requirements_solus_lib_installed()
{
  eopkg li --no-color | __rvm_grep "^$1[[:space:]]\+" > /dev/null 2>&1 || return $?
}

requirements_solus_lib_available()
{
  eopkg la --no-color | __rvm_grep "^$1[[:space:]]\+" > /dev/null 2>&1 || return $?
}

requirements_solus_install_custom()
{
  requirements_rvm_pkg_libs_install "$@" || return $?
}

requirements_solus_libs_install()
{
  __rvm_try_sudo eopkg --no-color --yes-all it "$@" || return $?
}

requirements_solus_check_binary()
{
  __rvm_which "$1" >/dev/null || return $?
}

requirements_solus_define()
{
  case "$1" in
    (rvm)
      requirements_check bash curl patch ca-certs gawk bzip2
      ;;

    (jruby*)
      requirements_check make

      if
        is_head_or_disable_binary "$1"
      then
        requirements_solus_check_binary javac ||
          requirements_check_fallback openjdk-8-devel
        requirements_check git
        case $( jruby_installation_method  "$1" ) in
          mvn) requirements_check_custom_after mvn=maven ;;
        esac
      else
        requirements_solus_check_binary java ||
          requirements_check_fallback openjdk-8
      fi
      ;;

    (ir*)
      true
      ;;

    (opal)
      true
      ;;

    (*-head)
      requirements_check git
      requirements_solus_define "${1%-head}"
      requirements_version_minimal autoconf 2.67
      ;;

    (*)
      if [[ ${#rvm_patch_names[@]} -gt 0 ]]
      then requirements_version_minimal autoconf 2.67
      fi
      requirements_check autoconf gcc g++ glibc-devel patch readline readline-devel \
        zlib zlib-devel libffi-devel openssl-devel make bzip2 automake libtool \
        bison sqlite3-devel yaml-devel gmp-devel pkg-config ncurses-devel binutils
      ;;
  esac
}

src/rvm/scripts/functions/requirements/netbsd000066400000005072147511530550015577 0ustar00#!/usr/bin/env bash

requirements_netbsd_lib_installed()
{
  [[ -f /etc/mtree/set.$1 ]] || return $?
}

requirements_netbsd_libs_install()
{
  \typeset _set_base_url _set _set_url _set_md5
  _set_base_url="http://ftp.netbsd.org/pub/NetBSD/NetBSD-${_system_version_full}/${_system_arch/x86_64/amd64}/binary/sets"
  for _set in "$@"
  do
    _set_url="${_set_base_url}/${_set}.tgz"
    _set_md5="$(__rvm_curl -s ${_set_base_url}/MD5 | __rvm_grep "(${_set}.tgz)" | __rvm_awk '{print $NF}')"
    __rvm_curl ${_set_url} -o ${rvm_archives_path}/${_set}.tgz || return $?
    [[ "$(__rvm_md5_calculate ${rvm_archives_path}/${_set}.tgz)" == ${_set_md5} ]] ||
      {
        \typeset result=$?
        rvm_error "Set checksum verification failed"
        return $result
      }
    __rvm_try_sudo tar xzf ${rvm_archives_path}/${_set}.tgz -C / || return $?
  done
}

requirements_netbsd_check_custom()
{
  \typeset _lib
  for _lib in "$@"
  do
    [[ " ${packages_custom[*]} " == *" ${_lib} "* ]] ||
    requirements_netbsd_custom_lib_installed "${_lib}" ||
    __rvm_add_once packages_custom "${_lib}"
  done
}

requirements_netbsd_custom_lib_installed()
{
  pkg_info -qE "$1" || return $?
}

requirements_netbsd_install_custom()
{
  __rvm_try_sudo \
    PKG_PATH="http://ftp.netbsd.org/pub/pkgsrc/packages/NetBSD/amd64/${_system_version}/All/" \
    pkg_add "$@" || return $?
}

requirements_netbsd_after()
{
  \typeset _certs
  _certs="$(__rvm_ls /etc/openssl/certs)"
  [[ ! -n "${certs}" && -f /etc/ssl/certs/ca-certificates.crt ]] ||
    __rvm_try_sudo mozilla-rootcerts install >/dev/null 2>&1 || return $?
}

requirements_netbsd_define()
{
  case "$1" in
    (rvm)
      requirements_netbsd_check_custom bash curl mozilla-rootcerts p5-Digest-SHA
      ;;

    (jruby*)
      requirements_netbsd_check_custom openjdk7 make
      if
        is_head_or_disable_binary "$1"
      then
        case $( jruby_installation_method  "$1" ) in
          ant) __rvm_which ant >/dev/null || requirements_netbsd_check_custom apache-ant   ;;
          mvn) __rvm_which mvn >/dev/null || requirements_netbsd_check_custom apache-maven ;;
        esac
      fi
      ;;

    (ir*)
      true
      ;;

    (opal)
      true
      ;;

    (*-head)
      requirements_check comp
      requirements_netbsd_check_custom automake autoconf libtool bison gdbm libffi libyaml scmgit
      __rvm_update_configure_opt_dir "$1" "/usr/pkg"
      ;;

    (*)
      requirements_check comp
      requirements_netbsd_check_custom automake autoconf libtool bison gdbm libffi libyaml
      __rvm_update_configure_opt_dir "$1" "/usr/pkg"
      ;;
  esac
}
src/rvm/scripts/functions/requirements/scientific000066400000000650147511530550016435 0ustar00#!/usr/bin/env bash

source "$rvm_scripts_path/functions/requirements/centos"

requirements_scientific_define_glibc()
{
  requirements_check glibc-headers glibc-devel
}

requirements_scientific_define_libyaml()
{
  requirements_check libyaml-devel
}

requirements_scientific_define_openssl()
{
  requirements_check openssl-devel
}

requirements_scientific_define()
{
  __lib_type=centos

  requirements_centos_define "$@"
}
src/rvm/scripts/functions/requirements/osx_brew000066400000035143147511530550016152 0ustar00#!/usr/bin/env bash

requirements_find_osx_brew()
{
  if
    __rvm_which brew >/dev/null 2>&1
  then
    return 0
  else
    \typeset __binary
    for __binary in ~/homebrew/bin/brew ~/.homebrew/bin/brew /usr/local/bin/brew
    do
      if
        [[ -f "${__binary}" && -s "${__binary}" && -x "${__binary}" ]]
      then
        PATH="$PATH:${__binary%/*}"
        return 0
      fi
    done
    return 1
  fi
}

requirements_osx_brew_version_list()
{
  if __rvm_which $1 >/dev/null
  then $1 --version 2>/dev/null | __rvm_sed -n -e '1{s/^.* //; p;}'
  fi
  __rvm_ls -1 $( brew --cellar )/$1/ 2>/dev/null
}

requirements_osx_brew_lib_installed_prefix_check()
{
  brew_lib_prefix="$( brew --prefix "$1" 2>/dev/null )" &&
  [[ -n "${brew_lib_prefix}" && -d "${brew_lib_prefix}" ]] ||
  return $?
}

requirements_osx_brew_lib_installed()
{
  \typeset brew_lib_prefix

  # Test for older versions of Homebrew before adding the `--formula` flag.
  brew_version=$( brew --version | awk 'NR==1 { print $2 }' )
  if __rvm_version_compare $brew_version -ge 2.5.7
  then brew_ls_flags="--formula"
  fi

  brew list -1 $brew_ls_flags | __rvm_grep "^${1}$" >/dev/null &&
  requirements_osx_brew_lib_installed_prefix_check "$1" ||
  return $?
}

requirements_osx_brew_lib_available()
{
  brew search | __rvm_grep "^${1}$" >/dev/null || return $?
}

requirements_osx_brew_libs_error()
{
    rvm_warn "There were package ${1} errors, make sure to read the log.

Try \`brew tap --repair\` and make sure \`brew doctor\` looks reasonable.

Check Homebrew requirements https://docs.brew.sh/Installation"
}

requirements_osx_brew_libs_install()
{
  brew install "$@" --force ||
  {
    \typeset ret=$?

    requirements_osx_brew_libs_error "installation"

    return $ret
  }
}

requirements_osx_brew_libs_remove()
{
  brew remove "$@" ||
  {
    \typeset ret=$?

    requirements_osx_brew_libs_error "removal"

    return $ret
  }
}

requirements_osx_brew_check_custom()
{
  brew tap | __rvm_grep "$1" >/dev/null || __rvm_add_once packages_custom "$1"
}

requirements_osx_brew_install_custom()
{
  \typeset __tap
  for __tap
  do brew tap "${__tap}" || return $?
  done
}

requirements_osx_brew_libs_outdated_filter()
{
  \typeset IFS
  IFS="|"
  brew outdated --quiet | __rvm_grep -E "$*"
}

requirements_osx_brew_libs_try_upgrade()
{
  (( rvm_autolibs_flag_number > 0 )) || return 0

  \typeset -a outdated_libs
  __rvm_read_lines outdated_libs <(
    requirements_osx_brew_libs_outdated_filter "$@"
  )
  if
    (( ${#outdated_libs[@]} ))
  then
    rvm_requiremnts_fail_or_run_action 2 \
      "Homebrew libs '${outdated_libs[*]}' require update - skipping." \
      brew upgrade "${outdated_libs[@]}" ||
      return $?
  fi
}

requirements_osx_brew_libs_set_path()
{
  \typeset brew_lib brew_lib_prefix

  for brew_lib
  do
    if requirements_osx_brew_lib_installed_prefix_check "${brew_lib}"
    then __rvm_add_to_path prepend "${brew_lib_prefix}/bin"
    fi
  done
  rvm_debug "PATH=$PATH"
}

requirements_osx_brew_libs_configure()
{
  \typeset package brew_lib brew_lib_prefix
  package="$1"
  shift

  for brew_lib
  do
    if requirements_osx_brew_lib_installed_prefix_check "${brew_lib}"
    then __rvm_update_configure_opt_dir "${package}" "${brew_lib_prefix}"
    fi
  done
}

requirements_osx_brew_after()
{
  (( ${#packages_installed[@]} == 0 )) ||
  requirements_osx_brew_libs_try_upgrade "${packages_installed[@]}" || return $?

  requirements_osx_brew_libs_set_path       "${brew_libs[@]}"       || return $?
  requirements_osx_brew_libs_configure "$1" "${brew_libs_conf[@]}"  || return $?

  case "$1" in
    (jruby*) true ;;
    (*) requirements_osx_brew_after_update_certs_openssl "$1" ;;
  esac

  unset brew_libs brew_libs_conf brew_openssl_package
}

requirements_osx_brew_after_update_certs_openssl()
{
  \typeset brew_lib_prefix
  if
    requirements_osx_brew_lib_installed_prefix_check "$brew_openssl_package" &&
    [[ -x "${brew_lib_prefix}/bin/openssl" ]]
  then
    requirements_osx_update_openssl_cert "${brew_lib_prefix}/bin/openssl" || return $?
  else
    rvm_requiremnts_fail_always 2 \
      "Somehow it happened there is no executable 'openssl',
run 'brew doctor' and make sure latest '$brew_openssl_package' is installed properly." ||
      return 12 # passing by 127 could be read as missing rvm.
  fi
}

requirements_osx_brew_libs_default_check_gcc()
{
  if
    requirements_detect_installed gcc gcc@8 gcc@7 gcc@6 gcc@5 gcc@4.9
  then
    case "${packages_installed[*]}" in
      (*gcc*)         export CC="$(brew --prefix gcc        )/bin/gcc-8" ;;
      (*gcc@8*)       export CC="$(brew --prefix gcc@8      )/bin/gcc-8" ;;
      (*gcc@7*)       export CC="$(brew --prefix gcc@7      )/bin/gcc-7" ;;
      (*gcc@6*)       export CC="$(brew --prefix gcc@6      )/bin/gcc-6" ;;
      (*gcc@5*)       export CC="$(brew --prefix gcc@5      )/bin/gcc-5" ;;
      (*gcc@4.9*)     export CC="$(brew --prefix gcc@4.9    )/bin/gcc-4.9" ;;
      (*)             return 1 ;;
    esac
  else
    return $?
  fi
}

requirements_osx_brew_libs_default_add_gcc_v_auto()
{
  # Install gcc from brew only for macOS earlier then Mojave (10.14)
  if __rvm_version_compare "${_system_version}" -lt 10.14
  then
    if __rvm_version_compare "${_system_version}" -ge 10.10
    then requirements_osx_brew_libs_default_add_gcc_v 6.0
    else requirements_osx_brew_libs_default_add_gcc_v 4.9
    fi
  fi
}

requirements_osx_brew_libs_default_add_gcc_v()
{
  case "$1" in
    (4.9) requirements_osx_brew_libs_default_add_gcc "$2" gcc-4.9 gcc@4.9     ;;
    (5.0) requirements_osx_brew_libs_default_add_gcc "$2" gcc-5.0 gcc@5       ;;
    (6.0) requirements_osx_brew_libs_default_add_gcc "$2" gcc-6.0 gcc@6       ;;
    (7.0) requirements_osx_brew_libs_default_add_gcc "$2" gcc-7.0 gcc@7       ;;
    (8.0) requirements_osx_brew_libs_default_add_gcc "$2" gcc-8.0 gcc@8       ;;
    (*)
      rvm_error "Do not know how to check/install gcc '$1'."
      return 1
      ;;
  esac
}

requirements_osx_brew_libs_default_add_gcc()
{
  if [[ -n "$1" ]] && __rvm_which "$1" >/dev/null
  then true
  else
    export CC="$2"
    if __rvm_which "$2" >/dev/null
    then true
    else
      if [[ -z "${3:-}" ]]
      then false           # no package known and binary not found
      else
        if [[ -z "$(brew --prefix $3 2>/dev/null)" ]]
        then
          rvm_error "We don't know how to install <code>$3</code>"
          rvm_log "Try to run <code>brew install $3</code> and re-run the same rvm command afterwards."
          false
        else
          export CC="$(brew --prefix $3 2>/dev/null || brew --prefix)/bin/$2"
          brew_libs+=( "$3" )
        fi
      fi
    fi
  fi
}

requirements_osx_brew_define_gcc()
{
  # Old gcc46 but it will most likely not work on OSX 10.10+
  if __rvm_version_compare "${_system_version}" -ge 10.10
  then
    undesired_check gcc46
  fi

  \typeset selected_compiler="$( __rvm_selected_compiler )"

  case "${selected_compiler:-}" in
    ("")
      case "$1" in
        (rbx-2*|rubinius-2*)
            brew_libs_conf+=( llvm@3.5 )
            ;;

        (rbx-3*|rubinius-3*|rbx*head|rubinius*head)
            requirements_check git openssl readline libyaml gdbm llvm@5
            rvm_configure_flags+=( --llvm-config="$(brew --prefix llvm@5)/bin/llvm-config" )
            ;;

        (truffleruby*)
            ;;

        (*)
          # Install gcc from brew only for macOS earlier then Mojave (10.14)
          if __rvm_version_compare "${_system_version}" -lt 10.14
          then
            __ruby_clang_ok "$1" ||
            requirements_osx_brew_libs_default_check_gcc ||
            requirements_osx_brew_libs_default_add_gcc_v_auto ||
            return $?
          fi
          ;;
      esac
      ;;

    (*gcc-4.9|*gcc-5|*gcc-6|*gcc-7|*gcc-8|*gcc)
      requirements_osx_brew_libs_default_add_gcc_v ${selected_compiler##*-} "${selected_compiler}" || return $?
                                                   # version                # full_path
      ;;

    (*)
      rvm_warn "We don't know how to ensure that selected compiler '${selected_compiler}' exists."
      ;;
  esac
}

requirements_osx_brew_define_openssl()
{
  # OpenSSL version depends on the version of Ruby being installed
  undesired_check openssl098

  case "$1" in
    (ruby-2.3*|ruby-2.2*|ruby-2.1*|ruby-2.0*|ruby-1.9*|ruby-1.8*)
      brew_openssl_package="openssl"
      ;;

    (ree-1.8*)
      brew_openssl_package="openssl"
      ;;

    (rbx-1*|rbx-2*)
      brew_openssl_package="openssl"
      ;;

    (truffleruby*)
      brew_openssl_package="openssl"
      ;;

    (*)
      brew_openssl_package="openssl@1.1"
      ;;
  esac

  brew_libs_conf+=( "$brew_openssl_package" )
}

requirements_osx_brew_libs_default()
{
  brew_libs=(
    autoconf automake libtool pkg-config coreutils
  )
  brew_libs_conf=(
    libyaml libksba readline zlib
  )

  requirements_osx_brew_define_gcc "$1"
  requirements_osx_brew_define_openssl "$1"

  requirements_check "${brew_libs[@]}" "${brew_libs_conf[@]}" || return $?
}

requirements_osx_brew_define()
{
  case "$1" in
    (rvm)
      true
      ;;

    (jruby*)
      requirements_check make

      if
        is_head_or_disable_binary "$1"
      then
        __rvm_which git >/dev/null || requirements_check git
        case $( jruby_installation_method  "$1" ) in
          mvn) requirements_check_custom_after mvn=maven ;;
        esac
      fi
      requiremnts_osx_java_fail  || return $?
      ;;

    (ir*)
      __rvm_which mono >/dev/null 2>&1 || return $?
      ;;

    (opal)
      requirements_check node
      ;;

    (truffleruby*)
      requirements_osx_brew_libs_default "$1"
      ;;

    (ruby*head)
      __rvm_which git >/dev/null || requirements_check git
      requirements_osx_brew_libs_default "$1"
      requirements_version_minimal autoconf 2.67
      ;;

    (*-head)
      __rvm_which git >/dev/null || requirements_check git
      requirements_osx_brew_libs_default "$1"
      ;;

    (*)
      requirements_osx_brew_libs_default "$1"
      ;;
  esac
}

__CLT_version_at_least()
{
  \typeset __version="$(
    pkgutil --pkg-info com.apple.pkg.DeveloperToolsCLI 2>/dev/null | __rvm_awk '$1~/version:/{print $2}'
  )"
  [[ -n "${__version}" ]] || __version="$(
    pkgutil --pkg-info com.apple.pkg.CLTools_Executables 2>/dev/null | __rvm_awk '$1~/version:/{print $2}'
  )"
  [[ -n "${__version}" ]] ||return $?
  __rvm_version_compare "${__version}" -ge "$1" || return $?
}

requirements_osx_brew_update_system()
{
  if
    __rvm_version_compare "${_system_version}" -ge 10.7
  then
    __rvm_detect_xcode_version_at_least 4.6.2 ||
    __CLT_version_at_least 4.6.0 ||
    {
      \typeset ret=$?
      rvm_error "
Xcode version older than 4.6.2 installed, download and install newer version from:

    http://connect.apple.com

After installation open Xcode, go to Downloads and install Command Line Tools.
"
      return $ret
    }
  fi
  brew update ||
  {
    \typeset ret=$?
    rvm_error "Failed to update Homebrew, follow instructions at

    https://docs.brew.sh/Common-Issues

and make sure \`brew update\` works before continuing."
    return $ret
  }
}

requirements_osx_brew_install_brew_setup()
{
  if
    __rvm_version_compare "${_system_version}" -ge 10.5
  then
    homebrew_repo="Homebrew/brew"
    homebrew_installer="https://raw.githubusercontent.com/Homebrew/install/master/install"
    homebrew_name="Homebrew"
  else
    homebrew_repo="mistydemeo/tigerbrew"
    homebrew_installer="https://raw.githubusercontent.com/mistydemeo/tigerbrew/go/install"
    homebrew_name="Tigerbrew"
  fi
  if
    (( UID == 0 )) && [[ -z "${SUDO_USER:-}" ]]
  then
    rvm_error "Requested installation of ${homebrew_name} but the process is running as 'root', make sure to run with 'sudo' from normal user and try again."
    return 1
  fi
  homebrew_home_default="/usr/local"
  printf "%b" "About to install ${homebrew_name} in the default location \`$homebrew_home_default\`.\n
It is possible to select a custom location, however it is not recommended and some things might not work.
You should do it only if you do not have write rights to \`$homebrew_home_default\`.

Press ENTER to install ${homebrew_name} in the default location \`$homebrew_home_default\`
or type a custom path (needs to be writable for the current user)\n: "
  read homebrew_home || return $?
  rvm_debug "homebrew_home=${homebrew_home:=$homebrew_home_default}"
}

requirements_osx_brew_install_brew_install()
{
  if
    [[ "${homebrew_home}" == "${homebrew_home_default}" ]]
  then
    rvm_debug "Default homebrew installation from: $homebrew_installer"
    if [[ -n "${SUDO_USER:-}" ]]
    then su - ${SUDO_USER} -c "ruby -e \"$(curl -fsSL $homebrew_installer)\"" || return $?
    else ruby -e "$(curl -fsSL $homebrew_installer)" || return $?
    fi
  else
    rvm_debug "Simplified homebrew installation from: https://github.com/${homebrew_repo}/tarball/master"
    mkdir -p "${homebrew_home}" || return $?
    __rvm_curl https://github.com/${homebrew_repo}/tarball/master | tar xz --strip 1 -C "${homebrew_home}"
    __rvm_check_pipestatus ${PIPESTATUS[@]} ${pipestatus[@]} || return $?
    chmod +x "${homebrew_home}/bin/brew" # just in case
    if [[ -n "${SUDO_USER:-}" ]]
    then chown -R ${SUDO_USER} "${homebrew_home}"
    fi
  fi
  PATH="$PATH:${homebrew_home}/bin"
}

requirements_osx_brew_install_brew()
{
  \typeset homebrew_home_default homebrew_home homebrew_repo homebrew_installer homebrew_name

  requirements_osx_brew_install_brew_setup   || return $?
  requirements_osx_brew_install_brew_install || return $?
}

requirements_osx_brew_ensure_brew_available()
{
  __rvm_which brew >/dev/null ||
  {
    rvm_requiremnts_fail_or_run_action 2 \
      "Requested installation with Homebrew libs, but Homebrew is not available." \
      requirements_osx_brew_install_brew || return $?
  }

  __rvm_which brew >/dev/null ||
  {
    \typeset __result=$?
    rvm_error "\
Something went wrong during Homebrew installation,
can not find 'brew' command, please report a bug: https://github.com/rvm/rvm/issues"
    return $__result
  }
}

requirements_osx_brew_ensure_brew_can_install()
{
  # only check for 3+ (packages install, enabled)
  (( rvm_autolibs_flag_number > 2 )) || return 0

  \typeset __celar_path
  __celar_path="$(brew --cellar)"
  if
    [[ ! -w "${__celar_path%/*}/bin" ]]
  then
    rvm_error "ERROR: '${__celar_path%/*}/bin' is not writable - it is required for Homebrew, try 'brew doctor' to fix it!"
    return 1
  elif
    [[ ! -w "${__celar_path}" && -e "${__celar_path}" ]]
  then
    rvm_error "ERROR: '${__celar_path}' is not writable - it is required for Homebrew, try 'brew doctor' to fix it!"
    return 1
  else
    rvm_debug "brew seems to be writable"
  fi
}

requirements_osx_brew_before()
{
  requirements_osx_brew_ensure_brew_available   || return $?
  requirements_osx_brew_ensure_brew_can_install || return $?
}
src/rvm/scripts/functions/requirements/smartos000066400000002513147511530550016005 0ustar00#!/usr/bin/env bash

requirements_smartos_lib_installed()
{
  pkgin list | __rvm_grep "^$1-[0-9]" >/dev/null 2>&1|| return $?
}

requirements_smartos_lib_available()
{
  pkgin avail | __rvm_grep "^$1-[0-9]" >/dev/null 2>&1|| return $?
}

requirements_smartos_libs_install()
{
  __rvm_try_sudo pkgin -y install "$@" || return $?
}

requirements_smartos_update_system()
{
  __rvm_try_sudo pkgin -y full-upgrade || return $?
}

requirements_smartos_define()
{
  case "$1" in
    (rvm)
      requirements_check bash curl patch git
      ;;

    (jruby*)
      requirements_check make openjdk7

      if
        is_head_or_disable_binary "$1"
      then
        requirements_check git
        case $( jruby_installation_method  "$1" ) in
          ant) requirements_check apache-ant   ;;
          mvn) requirements_check apache-maven ;;
        esac
      fi
      ;;

    (ir*)
      requirements_check mono
      ;;

    (opal)
      requirements_check nodejs
      ;;

    (*-head)
      requirements_check coreutils gcc47 gmake readline sqlite3 ncurses libyaml autoconf automake libtool libxslt
      __rvm_update_configure_opt_dir "$1" "/opt/local"
      ;;

    (*)
      requirements_check coreutils gcc47 gmake readline sqlite3 ncurses libyaml autoconf automake libtool libxslt
      __rvm_update_configure_opt_dir "$1" "/opt/local"
      ;;
  esac
}
src/rvm/scripts/functions/requirements/osx000066400000001042147511530550015122 0ustar00#!/usr/bin/env bash

source "$rvm_scripts_path/functions/detect/xcode"

source "$rvm_scripts_path/functions/requirements/osx_brew"
source "$rvm_scripts_path/functions/requirements/osx_fink"
source "$rvm_scripts_path/functions/requirements/osx_port"
source "$rvm_scripts_path/functions/requirements/smf"

requirements_osx_before()
{
  \typeset __type
  for __type in osx_brew osx_port smf osx_fink
  do
    if
      requirements_find_${__type}
    then
      __lib_type=${__type}
      return 0
    fi
  done

  # fallback
  __lib_type=osx_brew
}
src/rvm/scripts/functions/requirements/opensuse000066400000004524147511530550016162 0ustar00#!/usr/bin/env bash

source "$rvm_scripts_path/functions/pkg"

requirements_opensuse_lib_available()
{
  zypper search --provides --match-exact "$1" >/dev/null 2>&1 || return $?
}

requirements_opensuse_lib_installed()
{
  rpm -q --whatprovides "$1" >/dev/null || return $?
}

requirements_opensuse_libs_install()
{
  __rvm_try_sudo zypper install -y "$@" || return $?
}

requirements_opensuse_libs_remove()
{
  __rvm_try_sudo zypper rm -y "$@" || return $?
}

requirements_opensuse_update_system()
{
  __rvm_try_sudo zypper --gpg-auto-import-keys refresh ||
  __rvm_try_sudo zypper refresh || # just in case the flag was not supported
  return $?
}

requirements_opensuse_install_custom()
{
  requirements_rvm_pkg_libs_install "$@" || return $?
}

requirements_opensuse_define_libyaml()
{
  requirements_check libyaml-devel
}

requirements_opensuse_define_default()
{
  undesired_check libressl-devel

  requirements_check automake binutils bison bzip2 libtool m4 make patch \
    gdbm-devel glibc-devel libffi-devel libopenssl-devel readline-devel \
    sqlite3-devel zlib-devel

  requirements_${_system_name_lowercase}_define_libyaml

  if
    __rvm_version_compare "${_system_version}" -ge 12.0
    then requirements_check libdb-4_8
    else requirements_check libdb-4_5
  fi
}

requirements_opensuse_define()
{
  case "$1" in
    (rvm)
      requirements_check bash curl patch
      ;;

    (jruby*)
      requirements_check make

      if is_head_or_disable_binary "$1"
      then requirements_check java-devel git
      else requirements_check java
      fi

      case $( jruby_installation_method  "$1" ) in
        ant) requirements_check ant                    ;;
        mvn) requirements_check_custom_after mvn=maven ;;
      esac
      ;;

    (ir*)
      requirements_check mono
      ;;

    (opal)
      requirements_check nodejs
      ;;

    (*-head)
      requirements_check autoconf git
      requirements_opensuse_define "${1%-head}"
      ;;

    (rbx*|rubinius*)
      requirements_opensuse_define_default
      requirements_check_fallback llvm-devel llvm6-devel llvm5-devel llvm4-devel
      requirements_check_fallback clang clang6 clang5 clang4
      ;;

    (truffleruby*)
      requirements_check zlib-devel libopenssl-devel make gcc libxml2
      ;;

    (*)
      requirements_opensuse_define_default
      requirements_check gcc gcc-c++
      ;;
  esac
}
src/rvm/scripts/functions/requirements/oracle000066400000000630147511530550015560 0ustar00#!/usr/bin/env bash

source "$rvm_scripts_path/functions/requirements/centos"

requirements_oracle_define_glibc()
{
  requirements_check glibc-headers glibc-devel
}

requirements_oracle_define_libyaml()
{
  requirements_check libyaml-devel
}

requirements_oracle_define_openssl()
{
  requirements_check openssl-devel
}

requirements_oracle_define()
{
  __lib_type=centos

  requirements_centos_define "$@"
}
src/rvm/scripts/functions/requirements/smf000066400000014262147511530550015106 0ustar00#!/usr/bin/env bash

requirements_find_smf()
{
  if # find SMF in PATH
    __rvm_which sm >/dev/null 2>&1
  then
    return 0
  else # find SMF out of PATH and link to rvm/bin
    \typeset __binary
    for __binary in ~/.sm/bin/sm /opt/sm/bin/sm
    do
      if
        [[ -f "${__binary}" && -s "${__binary}" && -x "${__binary}" ]]
      then
        PATH="$PATH:${__binary%/*}"
        return 0
      fi
    done
    return 1
  fi
}

__smf_try_sudo()
{
  if [[ -w "$( __rvm_which sm )" ]]
  then "$@"
  else __rvm_try_sudo "$@"
  fi
}

requirements_smf_lib_installed()
{
  sm pkg list | __rvm_grep "^${1}:" >/dev/null || return $?
}

requirements_smf_lib_install_command()
{
  __smf_install_command=( sm "$1" install )
  if
    [[ "${rvm_static_flag:-}" == "1" ]]
  then
    __smf_install_command=(
      /usr/bin/env CFLAGS="-fPIC" LDFLAGS="-fPIC" "${__smf_install_command[@]}" static
    )
  fi
  __smf_install_command=( __smf_try_sudo "${__smf_install_command[@]}" )
}

requirements_smf_lib_install()
{
  \typeset -a __smf_install_command
  requirements_smf_lib_install_command "$@"
  rvm_debug "__smf_install_command: ${__smf_install_command[*]};"
  "${__smf_install_command[@]}" ||
  {
    \typeset ret=$?
    rvm_warn "There were package installation errors with SM Framework, make sure to read the log.
If you see this on OSX, then you might want to try macports (https://www.macports.org/) or homebrew (http://brew.sh/) and tell RVM to use them by running:

    rvm autolibs macports #OR
    rvm autolibs homebrew

You might get help by reporting tickets to https://github.com/sm/sm/issues"
    return $ret
  }
  shift
}

requirements_smf_gcc_42_check()
{
  case "$1" in
    (ruby-2*|ruby-head) true ;; # ruby-2.0.0+ is supposed to work with clang
    (*)
      # install gcc-4.2 only if not yet available, prevents problems with gcc-4.2 on OSX 10.6
      if
        ! __rvm_which gcc-4.2 >/dev/null &&
        __rvm_compiler_is_llvm
      then
        rvm_error "SM Framework does not know how to install gcc-4.2, please install osx-gcc-installer first for older rubies."
      fi
      ;;
  esac
}

requirements_smf_install_extension_sets()
{
  \typeset __set
  for __set
  do __smf_try_sudo sm set install "${__set}" || return $?
  done
}

requirements_smf_update_system_ensure_etc_openssl()
{
  [[ -d "/etc/openssl" ]] || __rvm_try_sudo mkdir -p "/etc/openssl" || return $?
  [[ -w "/etc/openssl" ]] ||
  {
    __rvm_try_sudo chmod -R 755   "/etc/openssl" &&
    __rvm_try_sudo chown -R $USER "/etc/openssl"
  } || return $?
}

requirements_smf_update_system()
{
  requirements_smf_update_system_ensure_etc_openssl || return $?
  __rvm_log_command sm_get_head "Updating SMF" __smf_try_sudo sm get head || return $?
  if
    [[ "${#required_extension_sets[@]}" -gt 0 ]]
  then
    __rvm_log_command sm_install_extension_sets "Installing/updating extension sets: ${required_extension_sets[*]}" \
      requirements_smf_install_extension_sets "${required_extension_sets[@]}" ||
      return $?
  fi
}

requirements_smf_define_git()
{
  __rvm_which git >/dev/null || {
    required_extension_sets+=( vcs )
    requirements_check autoconf git || return $?
  }
}

requirements_smf_define()
{
  case "$1" in
    (rvm)
      true
      ;;

    (jruby*)
      requirements_check make

      if
        is_head_or_disable_binary "$1"
      then
        requirements_smf_define_git || return $?
        case $( jruby_installation_method  "$1" ) in
          ant) __rvm_which ant >/dev/null 2>&1 || return $? ;;
          mvn) requirements_check_custom_after mvn=maven    ;;
        esac
      fi
      __rvm_which java >/dev/null 2>&1 || return $?
      ;;

    (ir*)
      __rvm_which mono >/dev/null 2>&1 || return $?
      ;;

    (opal)
      required_extension_sets+=( javascript )
      requirements_check node
      ;;

    (*-head)
      requirements_smf_define default
      requirements_smf_define_git || return $?
      ;;

    (*)
      required_extension_sets+=( databases gnu libraries tools )
      if
        [[ "${_system_name}" == "OSX" ]]
      then
        # TODO: ruby up to 1.9.3 requires openssl 0.9.8 on OSX
        if __rvm_version_compare "${_system_version}" -ge 10.9
        then requirements_check pkg-config libyaml zlib ncurses readline openssl sqlite3 gdbm
        else requirements_check pkg-config libtool libyaml zlib ncurses readline openssl sqlite3 gdbm
        fi
      else
        requirements_check pkg-config libtool libyaml zlib ncurses ncursesw readline openssl sqlite3 gdbm
      fi
      ;;
  esac
}

requirements_smf_install_sm()
{
  rvm_error "SMF Framework support is only intended for RailsInstaller / Tokaido.app, please use Macports / Homebrew integration instead."
  return 100
}

requirements_smf_ensure_smf_available()
{
  __rvm_which sm >/dev/null ||
  {
    rvm_requiremnts_fail_or_run_action 2 \
      "Requested installation with SM Framework, but SM Framework is not available." \
      requirements_smf_install_sm ||
      return $?
  }
}

requirements_smf_find_sm()
{
  export __sm_path
  : __sm_path:${__sm_path:=$( __rvm_which sm )}
  __rvm_readlink_deep __sm_path
  [[ -n "${__sm_path}" ]] || return $?
}

requirements_smf_before()
{
  required_extension_sets=()
  requirements_smf_ensure_smf_available || return $?
  requirements_smf_find_sm              || return $?
}

requirements_smf_after()
{
  requirements_smf_gcc_42_check "$1" || return $?

  if
    [[ "${_system_name}" == "OSX" ]]
  then
    case "$1" in
      (ruby-1*|ruby-2.0*)
        __rvm_update_configure_env LDFLAGS="-Z -L${__sm_path%/bin/sm}/pkg/active/lib -L/usr/lib"
        ;;
      (*) # 2.1.0+
        __rvm_update_configure_env LDFLAGS="-L${__sm_path%/bin/sm}/pkg/active/lib"
        ;;
    esac
    __rvm_update_configure_env CFLAGS="-I${__sm_path%/bin/sm}/pkg/active/include"
  fi

  case "$PATH" in
   (${__sm_path%/bin/sm}/pkg/active/bin:*)
     true
     ;;
   (*)
     __rvm_add_to_path prepend "${__sm_path%/bin/sm}/pkg/active/bin"
     ;;
  esac

  export PKG_CONFIG_PATH="${__sm_path%/bin/sm}/pkg/active/lib/pkgconfig"

  case "$1" in
    (jruby*) true ;;
    (*) requirements_smf_after_update_certs_openssl ;;
  esac
}

requirements_smf_after_update_certs_openssl()
{
  requirements_osx_update_openssl_cert "${__sm_path%/bin/sm}/pkg/active/bin/openssl" || return $?
}
src/rvm/scripts/functions/requirements/dragonfly000066400000002424147511530550016303 0ustar00#!/usr/bin/env bash

# new handlers for pkgng
requirements_dragonfly_lib_installed()
{
  pkg info | __rvm_grep "^$1" >/dev/null 2>&1 || return $?
}

requirements_dragonfly_libs_install()
{
  __rvm_try_sudo pkg install -y "$@" || return $?
}

requirements_dragonfly_update_system()
{
    __rvm_try_sudo pkg update || return $?
}

requirements_dragonfly_define()
{
  case "$1" in
    (rvm)
      requirements_check bash curl
      ;;

    (jruby*)
      requirements_check make jdk

      if
        is_head_or_disable_binary "$1"
      then
        requirements_check git
        case $( jruby_installation_method  "$1" ) in
          ant) __rvm_which ant >/dev/null || requirements_check apache-ant ;;
          mvn) requirements_check_custom_after mvn=maven                   ;;
        esac
      fi
      ;;

    (truffleruby*)
      requirements_check openssl gmake gcc libxml2
      ;;

    (ir*)
      requirements_check mono
      ;;

    (opal)
      requirements_check node
      ;;

    (*-head)
      requirements_check git
      requirements_freebsd_define "${1%-head}"
      ;;

    (*)
      # OpenSSL is installed by default
      requirements_check autoconf automake libtool bison readline libyaml sqlite3 gdbm
      __rvm_update_configure_opt_dir "$1" "/usr/local"
      ;;
  esac
}
src/rvm/scripts/functions/requirements/fedora000066400000001662147511530550015561 0ustar00#!/usr/bin/env bash

requirements_fedora_define_openssl()
{
  case "$1" in
    (ruby-2.3*|ruby-2.2*|ruby-2.1*|ruby-2.0*|ruby-1.9*|ruby-1.8*)
      if
        __rvm_version_compare "${_system_version}" -ge 26
      then
        undesired_check openssl-devel
        requirements_check compat-openssl10-devel
      else
        undesired_check compat-openssl10-devel
        requirements_check openssl-devel
      fi
      ;;

    (*)
      undesired_check compat-openssl10-devel
      requirements_check openssl-devel
      ;;
  esac
}

requirements_fedora_define_glibc()
{
  if
    __rvm_version_compare "${_system_version}" -lt 33
  then
    requirements_check glibc-headers glibc-devel
  else
    requirements_check glibc-devel
  fi
}

if
  __rvm_which dnf >/dev/null 2>&1 # should be true for Fedora 22+
then
  source "$rvm_scripts_path/functions/requirements/fedora_dnf"
else
  source "$rvm_scripts_path/functions/requirements/fedora_yum"
fi
src/rvm/scripts/functions/requirements/osx_port000066400000014375147511530550016203 0ustar00#!/usr/bin/env bash

requirements_find_osx_port()
{
  if # find macports in PATH
    __rvm_which port >/dev/null 2>&1
  then
    return 0
  else # find macports out of PATH and link to rvm/bin
    \typeset __binary
    for __binary in ~/opt/local/bin/port ~/.opt/local/bin/port /usr/local/bin/port /opt/local/bin/port
    do
      if
        [[ -f "${__binary}" && -s "${__binary}" && -x "${__binary}" ]]
      then
        PATH="$PATH:${__binary%/*}"
        return 0
      fi
    done
    return 1
  fi
}

requirements_osx_port_version_list()
{
  if __rvm_which $1 >/dev/null
  then $1 --version 2>/dev/null | __rvm_sed -n -e '1{s/^.* //; p;}'
  fi
  port -q installed $1* 2>/dev/null | __rvm_sed -e 's/.* @//' -e 's/_.*//' -e 's/ .*//'
}

requirements_osx_port_lib_available()
{
  port info $1 >/dev/null 2>&1 || return $?
}

requirements_osx_port_lib_installed()
{
  port -q installed $1 | __rvm_grep active >/dev/null || return $? ;
}

requirements_osx_port_libs_install()
{
  __rvm_try_sudo port install "$@" ||
  {
    \typeset ret=$?
    # TODO: offer more help!
    rvm_warn "There were package installation errors, make sure to read the log."
    return $ret
  }
}

requirements_osx_port_before()
{
  requirements_osx_port_ensure_port_available || return $?
}

requirements_osx_port_libs_default()
{
  port_libs=(
    autoconf automake gdbm libffi libiconv libksba libtool libyaml pkgconfig readline sqlite3 zlib
  )
  
  case "$1" in
    (*-head) __rvm_which git >/dev/null || port_libs+=( git )
      ;;
  esac
  
  __rvm_selected_compiler >/dev/null ||
  case "$1" in
    (ruby-1*|ree*)
      if
        __rvm_compiler_is_llvm # install gcc only if not yet available
      then
        if __rvm_version_compare "${_system_version}" -ge 10.8
        then port_libs+=( gcc49 )
        else port_libs+=( apple-gcc42 )
        fi
      fi
      ;;
  esac
  
  # LibreSSL is a fork of OpenSSL and is interchangable
  # If it is installed, then don't worry about OpenSSL
  if
    ! requirements_osx_port_lib_installed libressl
  then
    port_libs+=( openssl )
  fi
  
  if
    requirements_osx_port_lib_installed ncursesw
  then
    rvm_error "\
Error! ncursesw was replaced by ncurses a long time ago, please uninstall 'ncursesw',
         for more details check http://comments.gmane.org/gmane.os.apple.macports.user/28039"
    return 1
  else
    port_libs+=( ncurses  )
  fi
  
  requirements_check_fallback curl-ca-bundle certsync || return $?
  requirements_check "${port_libs[@]}" || return $?
}

requirements_osx_port_update_system()
{
  __rvm_try_sudo port -dv selfupdate || return $?
}

requirements_osx_port_define()
{
  case "$1" in
    (rvm)
      true
      ;;

    (jruby*)
      requirements_check make

      if
        is_head_or_disable_binary "$1"
      then
        __rvm_which git >/dev/null || requirements_check git
        case $( jruby_installation_method  "$1" ) in
          mvn) requirements_check_custom_after mvn=maven ;;
        esac
      fi

      requiremnts_osx_java_fail || return $?
      ;;

    (ir*)
      __rvm_which mono >/dev/null 2>&1 || return $?
      ;;

    (opal)
      requirements_osx_port_libs_ensure node
      ;;

    (truffleruby*)
      requirements_check openssl
      ;;

    (ruby*head)
      __rvm_which git >/dev/null || requirements_check git
      requirements_osx_port_libs_default "$1"
      requirements_version_minimal autoconf 2.67
      ;;

    (*-head)
      __rvm_which git >/dev/null || requirements_check git
      requirements_osx_port_libs_default "$1" || return $?
      ;;

    (*)
      requirements_osx_port_libs_default "$1" || return $?
      ;;
  esac
}

requirements_osx_port_after()
{
  \typeset port_root
  port_root="$( __rvm_which port 2>/dev/null )" && # get    binary and
  [[ -n "${port_root}" && -x "${port_root}"  ]] && # verify binary and
  __rvm_readlink_deep port_root                    # resolve any links to point to the final target
  [[ -n "${port_root}" && -x "${port_root}"  ]] && # verify binary and
  port_root="${port_root%%/bin/port}"              # get    root
  [[ -n "${port_root}" && -d "${port_root}" ]]  || # verify root   or
  port_root="/opt/local"                           # fallback to default

  __rvm_update_configure_opt_dir "$1" "${port_root}" || return $?

  __rvm_selected_compiler >/dev/null ||
  case "${port_libs[*]}" in
    (*apple-gcc42*)
      export CC=gcc-apple-4.2
      ;;
    (*gcc48*)
      export CC=gcc-mp-4.8
      ;;
    (*gcc49*)
      export CC=gcc-mp-4.9
      ;;
  esac

  unset port_libs

  __rvm_add_to_path prepend "${port_root}/bin"
  rvm_debug "PATH=$PATH"

  case "$1" in
    (jruby*) true ;;
    (*) requirements_osx_port_after_update_certs_openssl ;;
  esac
}

requirements_osx_port_after_update_certs_openssl()
{
  requirements_osx_update_openssl_cert "${port_root}/bin/openssl" || return $?
}

requirements_osx_port_install_port()
{
  \typeset macports_version
  macports_version="$(
    __rvm_curl https://distfiles.macports.org/MacPorts/ |
    __rvm_grep -Eo "<a href=\"MacPorts-[[:digit:]\.]+.tar.bz2\">" |
    __rvm_awk -F'"' '{print $2}' |
    __rvm_version_sort |
    __rvm_tail -n 1
  )" #'
  macports_version="${macports_version%.tar.bz2}"
  : macports_version:${macports_version:=MacPorts-2.1.3}
  mkdir "${rvm_src_path}/${macports_version}"
  cd    "${rvm_src_path}/${macports_version}"
  __rvm_curl "https://distfiles.macports.org/MacPorts/${macports_version}.tar.bz2" | tar -xj --strip 1
  __rvm_check_pipestatus ${PIPESTATUS[@]} ${pipestatus[@]} || return $?
  ./configure &&
  __rvm_make &&
  # plain make is required for sudo
  __rvm_try_sudo make install || return $?
  true # for OSX
}

requirements_osx_port_ensure_port_available()
{
  __rvm_which port >/dev/null ||
  {
    __rvm_which make > /dev/null &&
    {
      __rvm_which clang > /dev/null ||
      __rvm_which gcc-4.2 > /dev/null
    } ||
    {
      rvm_error "Can not find compiler and 'make' tool - make sure Xcode and/or Command Line Tools are installed."
      return 11
    }
    rvm_requiremnts_fail_or_run_action 2 \
      "Requested installation with macports libs, but macports is not available." \
      __rvm_log_command port_install "Installing macports" requirements_osx_port_install_port ||
      return $?

    # make sure the new installation is in PATH
    __rvm_which port >/dev/null || PATH="$PATH:/opt/local/bin"
  }
  true # for OSX
}
src/rvm/scripts/functions/requirements/mint000066400000002374147511530550015271 0ustar00#!/usr/bin/env bash

source "$rvm_scripts_path/functions/requirements/debian"

requirements_mint_define_libgmp()
{
  requirements_check libgmp-dev
}

requirements_mint_define_libreadline()
{
  requirements_check libreadline-dev
}

requirements_mint_define_libssl()
{
  # Legacy libssl-dev required by older version of ruby has been renamed to libssl1.0-dev
  # starting from Mint 19 (Tara)

  case "$1" in
    (ruby-2.3*|ruby-2.2*|ruby-2.1*|ruby-2.0*|ruby-1.9*)
      if
        __rvm_version_compare ${_system_version} -ge 19
      then
        undesired_check libssl-dev
        requirements_check libssl1.0-dev
      else
        requirements_check libssl-dev
      fi
      ;;

    (*)
      requirements_check libssl-dev
      ;;
  esac

  requirements_check libssl-dev
}

requirements_mint_define_clang_llvm()
{
  if
    __rvm_version_compare ${_system_version} -ge 19.1
  then
    requirements_check clang-3.9 llvm-3.9 llvm-3.9-dev
    rvm_configure_flags+=( --cc=clang-3.9 --cxx=clang++-3.9 --llvm-config=llvm-config-3.9)
  else
    requirements_check clang-3.6 llvm-3.6 llvm-3.6-dev
    rvm_configure_flags+=( --cc=clang-3.6 --cxx=clang++-3.6 --llvm-config=llvm-config-3.6)
  fi
}

requirements_mint_define()
{
  __lib_type=debian
  requirements_debian_define "$@"
}
src/rvm/scripts/functions/requirements/synology000066400000003510147511530550016176 0ustar00#!/usr/bin/env bash

source "$rvm_scripts_path/functions/pkg"

requirements_synology_lib_installed()
{
  ipkg list_installed | __rvm_grep "^$1 - " >/dev/null 2>&1 || return $?
}

requirements_synology_lib_available()
{
  ipkg list | __rvm_grep "^$1 - " >/dev/null 2>&1 || return $?
}

requirements_synology_libs_install()
{
  __rvm_try_sudo ipkg add -z "$@" || return $?
}

requirements_synology_install_custom()
{
  requirements_rvm_pkg_libs_install "$@" || return $?
}

requirements_synology_check_binaries()
{
  \typeset -a __missing_binaries
  __missing_binaries=()
  while
    (( $# ))
  do
    __rvm_which $1 >/dev/null || __missing_binaries+=( $1 )
    shift
  done
  if
    (( ${#__missing_binaries[@]} ))
  then
    rvm_error "Missing required binaries: ${__missing_binaries[*]} - make sure those are installed to continue."
    return ${#__missing_binaries[@]}
  fi
  true
}

requirements_synology_define()
{
  case "$1" in
    (rvm)
      true
      ;;

    (jruby*)
      requirements_check make

      if
        is_head_or_disable_binary "$1"
      then
        case $( jruby_installation_method  "$1" ) in
          ant) requirements_synology_check_binaries java git ant || return $? ;;
          mvn) requirements_synology_check_binaries java git mvn || return $? ;;
        esac
      else
        requirements_synology_check_binaries java || return $?
      fi
      ;;

    (ir*)
      requirements_synology_check_binaries mono || return $?
      ;;

    (opal)
      requirements_synology_check_binaries node || return $?
      ;;

    (*-head)
      requirements_check git
      requirements_synology_define "${1%-head}"
      ;;

    (*)
      requirements_check gcc autoconf automake libtool bison readline openssl
      requirements_rvm_pkg_lib_installed_custom yaml
      __rvm_update_configure_opt_dir "$1" "/usr/local"
      ;;
  esac
}
src/rvm/scripts/functions/requirements/debian000066400000012322147511530550015536 0ustar00#!/usr/bin/env bash

# AMD64, i386, ARM - this is different from _system_arch as it's not translated.
requirements_debian_arch()
{
  __architecture="$(dpkg --print-architecture)"
}

# Queries the dpkg system for packages that are installed only asking about
# the package name and it's arch.  This package will fall back to :all for
# cases where we cannot get an arch specific package (such is the case
# for a few packages.)

requirements_debian_lib_installed()
{
  dpkg-query -s "${1}:${__architecture}" >/dev/null 2>&1 ||
  dpkg-query -s "${1}:all"               >/dev/null 2>&1 ||
  dpkg-query -s "$1" 2>/dev/null | __rvm_grep "Architecture: ${__architecture}" >/dev/null ||
  dpkg-query -s "$1" 2>/dev/null | __rvm_grep "Architecture: all"               >/dev/null ||
  return $?
}

# Informs us if a package is even available on the distro we are working
# with, this is more of a transitional method kind of like Ubuntu
# has a transitional git-core package right now.  This will allow us
# to continue to support older versions of Ubuntu while enforcing newer
# packages on newer Ubuntu.

requirements_debian_lib_available()
{
  apt-cache show "$1" >/dev/null 2>&1 || return $?
}

requirements_debian_libs_install()
{
  __rvm_try_sudo apt-get --no-install-recommends --yes install "$@" || return $?
}

requirements_debian_libs_remove()
{
  __rvm_try_sudo apt-get --yes remove "$@" || return $?
}

requirements_debian_update_system()
{
  __rvm_try_sudo apt-get --quiet --yes update ||
  {
    \typeset __ret=$?
    case ${__ret} in
      (100)
        rvm_error "There has been an error while updating your system using \`apt-get\`.
It seems that there are some 404 Not Found errors for repositories listed in:

    /etc/apt/sources.list
    /etc/apt/sources.list.d/*.list

Make sure that all repositories are available from your system and verify your setup by running manually:

    sudo apt-get update

Make sure that it works correctly before proceeding with RVM.

If you are working from the GUI instead of the terminal, you might want to verify and fix broken
repositories using \"Software & Updates\" application.
"
        ;;
    esac
    return ${__ret}
  }
}

requirements_debian_define_libgmp()
{
  if [[ "${_system_version}" == 6* ]]
  then
    requirements_check libgmp3-dev
  else
    requirements_check libgmp-dev
  fi
}

requirements_debian_define_libreadline()
{
  if
    __rvm_version_compare ${_system_version} -ge 9
  then
    requirements_check libreadline-dev
  else
    requirements_check libreadline6-dev
  fi
}

requirements_debian_define_libssl()
{
  # Legacy libssl-dev required by older version of ruby has been renamed to libssl1.0-dev
  # starting from Debian 9 (Stretch)

  case "$1" in
    (ruby-2.3*|ruby-2.2*|ruby-2.1*|ruby-2.0*|ruby-1.9*|ruby-1.8*)
      if
        __rvm_version_compare ${_system_version} -ge 9
      then
        undesired_check libssl-dev
        requirements_check libssl1.0-dev
      else
        requirements_check libssl-dev
      fi
      ;;

    (*)
      requirements_check libssl-dev
      ;;
  esac
}

requirements_debian_define_clang_llvm()
{
  requirements_check clang-3.6 llvm-3.6 llvm-3.6-dev
}

requirements_debian_define_base()
{
  requirements_check "$@" \
    autoconf automake bison ca-certificates curl libc6-dev libffi-dev libgdbm-dev libncurses5-dev \
    libsqlite3-dev libtool libyaml-dev make openssl patch pkg-config sqlite3 zlib1g zlib1g-dev

  requirements_${_system_name_lowercase}_define_libgmp
  requirements_${_system_name_lowercase}_define_libreadline
}

requirements_debian_define_java()
{
  update-alternatives --list ${1:-java} >/dev/null 2>&1 ||
    requirements_check_fallback \
      openjdk-8-jre-headless openjdk-8-jdk oracle-j2sdk1.8 \
      openjdk-7-jre-headless openjdk-7-jdk oracle-j2sdk1.7 \
      openjdk-6-jre-headless opendjk-6-jdk oracle-j2sdk1.6
}

requirements_debian_define()
{
  \typeset __architecture
  requirements_debian_arch

  if [[ "$1" == *head ]]
  then
      requirements_check_fallback git git-core
  fi

  case "$1" in
    (rvm)
      requirements_check bash curl patch bzip2 ca-certificates gawk
      ;;

    (jruby*)
      requirements_check g++ make
      if
        is_head_or_disable_binary "$1"
      then
        requirements_debian_define_java javac
        requirements_check_fallback git git-core
        case $( jruby_installation_method  "$1" ) in
          ant) __rvm_which ant >/dev/null || requirements_check ant                   ;;
          mvn) __rvm_which mvn >/dev/null || requirements_check_fallback maven maven2 ;;
        esac
      else
        requirements_debian_define_java java
      fi
      ;;

    (ir*)
      requirements_check curl mono-2.0-devel
      ;;

    (opal)
      requirements_check nodejs npm
      ;;

    (rbx*|rubinius*)
      requirements_debian_define_base flex ruby-dev libreadline-dev libedit-dev
      requirements_${_system_name_lowercase}_define_libssl "$1"
      requirements_${_system_name_lowercase}_define_clang_llvm "$1"
      ;;

    (truffleruby*)
      requirements_debian_define_base
      requirements_${_system_name_lowercase}_define_libssl "$1"
      requirements_check make gcc libxml2
      ;;

    (*)
      requirements_debian_define_base g++ gcc
      requirements_${_system_name_lowercase}_define_libssl "$1"
      ;;
  esac
}
src/rvm/scripts/functions/logging000066400000012375147511530550013227 0ustar00#!/usr/bin/env bash

__rvm_set_color_single()
{
  case "$1" in
    # emphasized (bolded) colors
    (bold)     __buffer+='7' ;;
    (offbold)  __buffer+='27' ;;

    # regular colors
    (black)    __buffer+='30' ;;
    (red)      __buffer+='31' ;;
    (green)    __buffer+='32' ;;
    (yellow)   __buffer+='33' ;;
    (blue)     __buffer+='34' ;;
    (magenta)  __buffer+='35' ;;
    (cyan)     __buffer+='36' ;;
    (white)    __buffer+='37' ;;
    (default)  __buffer+='39' ;;

    # intense (bright) colors
    (iblack)    __buffer+='30;1' ;;
    (ired)      __buffer+='31;1' ;;
    (igreen)    __buffer+='32;1' ;;
    (iyellow)   __buffer+='33;1' ;;
    (iblue)     __buffer+='34;1' ;;
    (imagenta)  __buffer+='35;1' ;;
    (icyan)     __buffer+='36;1' ;;
    (iwhite)    __buffer+='37;1' ;;

    # background colors
    (bblack)   __buffer+='40' ;;
    (bred)     __buffer+='41' ;;
    (bgreen)   __buffer+='42' ;;
    (byellow)  __buffer+='43' ;;
    (bblue)    __buffer+='44' ;;
    (bmagenta) __buffer+='45' ;;
    (bcyan)    __buffer+='46' ;;
    (bwhite)   __buffer+='47' ;;
    (bdefault) __buffer+='49' ;;

    # Reset
    (*)        __buffer+='0' ;;
  esac
}

__rvm_set_color()
{
  \typeset __buffer __variable

  __buffer=$'\E['
  __variable="$1"
  shift

  while
    (( $# ))
  do
    __rvm_set_color_single "$1"
    shift

    if (( $# ))
    then __buffer+=';'
    fi
  done

  __buffer+='m'

  if [[ "${__variable}" == "" || "${__variable}" == "print" ]]
  then printf "${__buffer}"
  else eval "${__variable}='${__buffer}'"
  fi
}

# check if user wants colors and if output goes to terminal
# rvm_pretty_print_flag:
# - 0|no    - disabled always
# - 1|auto  - automatic depending if the output goes to terminal (default)
# - 2|force - forced always
# to select which terminal output should be checked use first param:
# - stdout - for stdout (default)
# - stderr - for stderr
# - number - for the given terminal fd
# - else   - for both stdout and stderr
rvm_pretty_print()
{
  case "${rvm_pretty_print_flag:=auto}" in
    (0|no)
      return 1
      ;;

    (1|auto)
      case "${TERM:-dumb}" in
        (dumb|unknown) return 1 ;;
      esac

      case "$1" in
        (stdout) [[ -t 1           ]] || return 1 ;;
        (stderr) [[ -t 2           ]] || return 1 ;;
        ([0-9])  [[ -t $1          ]] || return 1 ;;
        (any)    [[ -t 1  || -t 2  ]] || return 1 ;;
        (*)      [[ -t 1  && -t 2  ]] || return 1 ;;
      esac
      return 0
      ;;

    (2|force)
      return 0
      ;;
  esac
}

__rvm_set_colors()
{
  case "${TERM:-dumb}" in
    (dumb|unknown)
      rvm_error_clr=""
      rvm_warn_clr=""
      rvm_debug_clr=""
      rvm_notify_clr=""
      rvm_code_clr=""
      rvm_comment_clr=""
      rvm_reset_clr=""
      ;;
    (*)
      __rvm_set_color rvm_error_clr   "${rvm_error_color:-red}"
      __rvm_set_color rvm_warn_clr    "${rvm_warn_color:-yellow}"
      __rvm_set_color rvm_debug_clr   "${rvm_debug_color:-magenta}"
      __rvm_set_color rvm_notify_clr  "${rvm_notify_color:-green}"
      __rvm_set_color rvm_code_clr    "${rvm_code_color:-blue}"
      __rvm_set_color rvm_comment_clr "${rvm_comment_color:-iblack}"
      __rvm_set_color rvm_reset_clr   "${rvm_reset_color:-reset}"
      ;;
  esac
}

__rvm_replace_colors()
{
  \typeset ___text

  ___text="${1//<error>/$rvm_error_clr}"
  ___text="${___text//<warn>/$rvm_warn_clr}"
  ___text="${___text//<debug>/$rvm_debug_clr}"
  ___text="${___text//<notify>/$rvm_notify_clr}"
  ___text="${___text//<code>/$rvm_code_clr}"
  ___text="${___text//<comment>/$rvm_comment_clr}"
  ___text="${___text//<log>/$rvm_reset_clr}"

  ___text="${___text//<\/error>/$rvm_reset_clr}"
  ___text="${___text//<\/warn>/$rvm_reset_clr}"
  ___text="${___text//<\/debug>/$rvm_reset_clr}"
  ___text="${___text//<\/notify>/$rvm_reset_clr}"
  ___text="${___text//<\/code>/$rvm_reset_clr}"
  ___text="${___text//<\/comment>/$rvm_reset_clr}"
  ___text="${___text//<\/log>/$rvm_reset_clr}"

  printf "%b" "${___text}$rvm_reset_clr"
}

rvm_printf_to_stderr()
{
  printf "$@" >&6
}

rvm_error()
{
  if rvm_pretty_print stderr
  then __rvm_replace_colors "<error>$*</error>\n" >&6
  else printf "%b" "$*\n" >&6
  fi
}

rvm_help()
{
  "${rvm_scripts_path}/help" "$@"
}

rvm_error_help()
{
  rvm_error "$1"
  shift
  rvm_help "$@"
}

rvm_fail()
{
  rvm_error "$1"
  exit "${2:-1}"
}

rvm_warn()
{
  if rvm_pretty_print stderr
  then __rvm_replace_colors "<warn>$*</warn>\n" >&6
  else printf "%b" "$*\n" >&6
  fi
}

rvm_notify()
{
  if rvm_pretty_print stdout
  then __rvm_replace_colors "<notify>$*</notify>\n"
  else printf "%b" "$*\n"
  fi
}

rvm_log()
{
  [[ ${rvm_quiet_flag} == 1 ]] && return

  printf "%b" "$*\n"
}

rvm_debug()
{
  (( ${rvm_debug_flag:-0} )) || return 0

  if rvm_pretty_print stderr
  then __rvm_replace_colors "<debug>$*</debug>\n" >&6
  else printf "%b" "$*\n" >&6
  fi
}

rvm_debug_stream()
{
  if (( ${rvm_debug_flag:-0} == 0 && ${rvm_trace_flag:-0} == 0 ))
  then cat - >/dev/null # suppress output when not debugging/tracing
  elif rvm_pretty_print stdout
  then \command \cat - | __rvm_awk '{print "'"${rvm_debug_clr:-}"'"$0"'"${rvm_reset_clr:-}"'"}' >&6
  else \command \cat - >&6
  fi
}

rvm_verbose_log()
{
  if (( ${rvm_verbose_flag:=0} == 1 ))
  then rvm_log "$@"
  fi
}

rvm_out()
{
  printf "$*\n"
}

__rvm_set_colors

# Redirect &6 to stderr
exec 6>&2
src/rvm/scripts/functions/rvmrc_trust000066400000016213147511530550014166 0ustar00#!/usr/bin/env bash

__rvm_md5_for_contents()
{
  if   builtin command -v md5     > /dev/null
  then md5         | __rvm_awk '{print $1}'
  elif builtin command -v md5sum  > /dev/null
  then md5sum      | __rvm_awk '{print $1}'
  elif builtin command -v openssl > /dev/null
  then openssl md5 | __rvm_awk '{print $1}'
  else return 1
  fi
  true # for osx
}

__rvm_sha256_for_contents()
{
  if   builtin command -v sha256sum > /dev/null
  then sha256sum           | __rvm_awk '{print $1}'
  elif builtin command -v sha256    > /dev/null
  then sha256              | __rvm_awk '{print $1}'
  elif builtin command -v shasum    > /dev/null
  then shasum -a256        | __rvm_awk '{print $1}'
  elif builtin command -v openssl   > /dev/null
  then openssl sha -sha256 | __rvm_awk '{print $1}'
  else return 1
  fi
  true # for osx
}

__rvm_checksum_for_contents()
{
  \typeset __sum
  __sum=$(  echo "$1" | \command \cat - "$1" | __rvm_md5_for_contents   ) ||
  {
    rvm_error "Neither md5 nor md5sum were found in the PATH"
    return 1
  }
  __sum+=$( echo "$1" | \command \cat - "$1" | __rvm_sha256_for_contents ) ||
  {
    rvm_error "Neither sha256sum nor shasum found in the PATH"
    return 1
  }
  echo ${__sum}
}

__rvm_rvmrc_key()
{
  printf "%b" "$1" | \command \tr '[#/.=()]' _
  return $?
}

__rvm_reset_rvmrc_trust()
{
  if [[ "$1" == all ]]
  then
    echo "" > "${rvm_user_path:-${rvm_path}/user}/rvmrcs"
  else
    __rvm_db_ "${rvm_user_path:-${rvm_path}/user}/rvmrcs" "$(__rvm_rvmrc_key "$1")" "delete" >/dev/null 2>&1
  fi
}

__rvm_trust_rvmrc()
{
  [[ -f "$1" ]] || return 1
  __rvm_reset_rvmrc_trust "$1"
  __rvm_db_ "${rvm_user_path:-${rvm_path}/user}/rvmrcs" "$(__rvm_rvmrc_key "$1")" "1;$(__rvm_checksum_for_contents "$1")" >/dev/null 2>&1 ||
  return $?
}

__rvm_untrust_rvmrc()
{
  [[ -f "$1" ]] || return 1
  __rvm_reset_rvmrc_trust "$1"
  __rvm_db_ "${rvm_user_path:-${rvm_path}/user}/rvmrcs" "$(__rvm_rvmrc_key "$1")" "0;$(__rvm_checksum_for_contents "$1")" >/dev/null 2>&1 ||
  return $?
}

__rvm_rvmrc_stored_trust()
{
  [[ -f "$1" ]] || return 1
  __rvm_db_ "${rvm_user_path:-${rvm_path}/user}/rvmrcs" "$(__rvm_rvmrc_key "$1")" ||
  return $?
}

__rvm_rvmrc_stored_trust_check()
{
  \typeset _first _second _rvmrc _rvmrc_base
  if [[ -n "${ZSH_VERSION:-}" ]]
  then _first=1
  else _first=0
  fi
  _second=$(( _first + 1 ))
  _rvmrc="${1}"
  _rvmrc_base="$(basename "${_rvmrc}")"

  if [[ -f "$_rvmrc" ]]
  then
    saveIFS=$IFS
    IFS=$';'
    trust=($(__rvm_rvmrc_stored_trust "$_rvmrc"))
    IFS=$saveIFS

    if
      [[ "${trust[${_second}]:-'#'}" != "$(__rvm_checksum_for_contents "$_rvmrc")" ]]
    then
      echo "The '$_rvmrc' contains unreviewed changes."
      return 1
    elif
      [[ "${trust[${_first}]}" == '1' ]]
    then
      echo "The '$_rvmrc' is currently trusted."
      return 0
    elif
      [[ "${trust[${_first}]}" == '0' ]]
    then
      echo "The '$_rvmrc' is currently untrusted."
      return 1
    else
      echo "The trustiworthiness of '$_rvmrc' is currently unknown."
      return 1
    fi
  else
    echo "There is no '$_rvmrc'"
    return 1
  fi
}

__rvm_check_rvmrc_trustworthiness()
{
  # Trust when they have the flag... of doom!
  (( ${rvm_trust_rvmrcs_flag:-0} == 0 )) || return 0

  # Fail if no file given or no extra params
  [[ -n "$1" ]] || (( $# > 1 )) || return 1

  \typeset _first _second saveIFS

  if [[ -n "${ZSH_VERSION:-}" ]]
  then _first=1
  else _first=0
  fi
  _second=$(( _first + 1 ))
  saveIFS="$IFS"
  IFS=$';'
  \typeset -a trust
  trust=( $( __rvm_rvmrc_stored_trust "$1" ) )
  IFS="$saveIFS"
  if
    [[ "${trust[${_second}]:-'#'}" == "$(__rvm_checksum_for_contents "$1")" ]]
  then
    [[ "${trust[${_first}]}" == '1' ]] || return $?
  else
    __rvm_ask_to_trust "$@" || return $?
  fi
  true
}

__rvm_display_rvmrc()
{
  __rvm_file_notice_display_pre
  __rvm_wait_anykey "(( press a key to review the ${_rvmrc_base} file ))"
  printf "%b" "${rvm_warn_clr}"
  command cat -v "${_rvmrc}"
  printf "%b" "${rvm_reset_clr}"
  __rvm_file_notice_display_post
}

__rvm_ask_to_trust()
{
  \typeset trusted value anykey _rvmrc _rvmrc_base
  _rvmrc="${1}"
  _rvmrc_base="$(basename "${_rvmrc}")"

  if [[ ! -t 0 || -n "$MC_SID" ]] || (( ${rvm_promptless:=0} == 1 ))
  then return 2
  fi

  __rvm_file_notice_initial
  trusted=0
  while (( ! trusted ))
  do
    printf "%b" 'y[es], n[o], v[iew], c[ancel]> '

    builtin read response
    value="$(echo -n "${response}" | \command \tr '[[:upper:]]' '[[:lower:]]' | __rvm_strip)"

    case "${value:-n}" in
      v|view)
        __rvm_display_rvmrc
        ;;
      y|yes)
        trusted=1
        ;;
      n|no)
        break
        ;;
      c|cancel)
        return 1
        ;;
    esac
  done

  if (( trusted ))
  then
    __rvm_trust_rvmrc "$1"
    return 0
  else
    __rvm_untrust_rvmrc "$1"
    return 1
  fi
}

__rvm_file_notice_initial()
{
  case "${_rvmrc}" in
    (*/.rvmrc) __rvm_rvmrc_notice_initial    ;;
    (*)        __rvm_env_file_notice_initial ;;
  esac
}

__rvm_rvmrc_notice_initial()
{
  __rvm_table "NOTICE" <<-TEXT
RVM has encountered a new or modified ${_rvmrc_base} file in the current directory, this is a shell script and therefore may contain any shell commands.

Examine the contents of this file carefully to be sure the contents are safe before trusting it!
Do you wish to trust '${_rvmrc}'?
Choose v[iew] below to view the contents
TEXT
}

__rvm_env_file_notice_initial()
{
  __rvm_table "NOTICE" <<-TEXT
RVM has encountered a new or modified ${_rvmrc_base} file in the current directory, environment variables from this file will be exported and therefore may influence your shell.

Examine the contents of this file carefully to be sure the contents are safe before trusting it!
Do you wish to trust '${_rvmrc}'?
Choose v[iew] below to view the contents
TEXT
}

__rvm_file_notice_display_pre()
{
  __rvm_table <<-TEXT
The contents of the ${_rvmrc_base} file will now be displayed.
After reading the file, you will be prompted again for 'yes or no' to set the trust level for this particular version of the file.

Note: You will be re-prompted each time the ${_rvmrc_base} file's contents change
changes, and may change the trust setting manually at any time.
TEXT
}

__rvm_file_notice_display_post()
{
  case "${_rvmrc}" in
    (*/.rvmrc) __rvm_rvmrc_notice_display_post    ;;
    (*)        __rvm_env_file_notice_display_post ;;
  esac
}

__rvm_rvmrc_notice_display_post()
{
  __rvm_table "Viewing of ${_rvmrc} complete." <<-TEXT
Trusting an ${_rvmrc_base} file means that whenever you cd into this directory, RVM will run this ${_rvmrc_base} shell script.
Note that if the contents of the file change, you will be re-prompted to review the file and adjust its trust settings. You may also change the trust settings manually at any time with the 'rvm rvmrc' command.
TEXT
}

__rvm_env_file_notice_display_post()
{
  __rvm_table "Viewing of ${_rvmrc} complete." <<-TEXT
Trusting an ${_rvmrc_base} file means that whenever you cd into this directory, RVM will export environment variables from ${_rvmrc_base}.
Note that if the contents of the file change, you will be re-prompted to review the file and adjust its trust settings. You may also change the trust settings manually at any time with the 'rvm rvmrc' command.
TEXT
}
src/rvm/scripts/functions/build_undesired_helpers000066400000003411147511530550016453 0ustar00#!/usr/bin/env bash

undesired_check()
{
  \typeset _package_name

  if
    is_a_function "requirements_${__lib_type}_lib_installed"
  then
    for _package_name in "$@"
    do __rvm_filter_undesired_package_check "requirements_${__lib_type}_lib_installed" "${_package_name}"
    done
  else
    echo "RVM does not support checking for undesired packages for this platform (${_system_name})"
    exit 1
  fi

  true
}

__rvm_filter_undesired_package_check()
{
  if
    "$1" "$2"
  then
    case "$rvm_autolibs_flag_number" in
      (0|1|2) __rvm_add_once packages_undesired "$2" ;; # just ignore
      (*)     __rvm_add_once packages_to_remove "$2" ;; # 2+
    esac
  fi
}

__rvm_requirements_run_remove()
{
  (( ${#packages_to_remove[@]} )) || return 0
  if
    is_a_function requirements_${__lib_type}_lib_remove
  then
    \typeset __package
    for __package in "${packages_to_remove[@]}"
    do
      __rvm_log_command package_remove_${__package} "Removing undesired package: ${__package}" \
        "requirements_${__lib_type}_lib_remove" "${__package}" ||
      {
        \typeset __status=$?
        _list="${packages_to_remove[*]}"
        rvm_warn "Failed package removal: ${__package} of: ${_list// /, }."
        return ${__status}
      }
    done
  elif
    is_a_function requirements_${__lib_type}_libs_remove
  then
    _list="${packages_to_remove[*]}"
    __rvm_log_command package_remove_${_list// /_} "Removing undesired packages: ${_list// /, }" \
      "requirements_${__lib_type}_libs_remove" "${packages_to_remove[@]}" ||
      return $?
  else
    rvm_error "\nRVM does not support removing undesired packages for this platform (${_system_name})"
    rvm_error "You need to manually uninstall following packages before continue:\n\n\t${packages_to_remove}\n"
    exit 1
  fi
}
src/rvm/scripts/functions/rvmrc_set000066400000013745147511530550013607 0ustar00#!/usr/bin/env bash

__rvm_set_versions_conf()
{
  \typeset gemset identifier

  if [[ -s .versions.conf ]]
  then
    \command \mv .versions.conf .versions.conf.$(__rvm_date +%m.%d.%Y-%H:%M:%S)
    rvm_warn ".version.conf is not empty, moving aside to preserve."
  fi

  identifier=$(__rvm_env_string)
  gemset=${identifier#*@}
  identifier=${identifier%@*}

  printf "%b" "ruby=$identifier
" >> .versions.conf
  if [[ -n "$gemset" && "$gemset" != "$identifier" ]]
  then
    printf "%b" "ruby-gemset=$gemset
" >> .versions.conf
  else
    printf "%b" "#ruby-gemset=my-projectit
" >> .versions.conf
  fi
  printf "%b" "#ruby-gem-install=bundler rake
#ruby-bundle-install=true
" >> .versions.conf
}

__rvm_set_ruby_version()
{
  if
    [[ -s .ruby-version ]]
  then
    \command \mv .ruby-version .ruby-version.$(__rvm_date +%m.%d.%Y-%H:%M:%S)
    rvm_warn ".ruby-version is not empty, moving aside to preserve."
  fi
  \typeset __version="$(__rvm_env_string)"
  case "${__version}" in
    (*@*)
      if
        [[ -s .ruby-gemset ]]
      then
        \command \mv .ruby-gemset .ruby-gemset.$(__rvm_date +%m.%d.%Y-%H:%M:%S)
        rvm_warn ".ruby-gemset is not empty, moving aside to preserve."
      fi
      echo "${__version##*@}" > .ruby-gemset
      ;;
    (*)
      if
        [[ -s .ruby-gemset ]]
      then
        \command \mv .ruby-gemset .ruby-gemset.$(__rvm_date +%m.%d.%Y-%H:%M:%S)
        rvm_warn ".ruby-gemset not needed, moving aside to preserve."
      fi
      ;;
  esac
  echo "${__version%@*}" > .ruby-version
}

__rvm_set_rvmrc()
{
  \typeset flags identifier short_identifier gem_file
  true ${rvm_verbose_flag:=0}

  if [[ "$HOME" != "$PWD" && "${rvm_prefix:-}" != "$PWD" ]]
  then
    if (( rvm_verbose_flag ))
    then flags="use "
    fi

    if [[ -s .rvmrc ]]
    then
      \command \mv .rvmrc .rvmrc.$(__rvm_date +%m.%d.%Y-%H:%M:%S)
      rvm_warn ".rvmrc is not empty, moving aside to preserve."
    fi

    identifier=$(__rvm_env_string)
    short_identifier="${identifier#ruby-}"
    short_identifier="${short_identifier%%-*}"

    printf "%b" "#!/usr/bin/env bash

# This is an RVM Project .rvmrc file, used to automatically load the ruby
# development environment upon cd'ing into the directory

# First we specify our desired <ruby>[@<gemset>], the @gemset name is optional,
# Only full ruby name is supported here, for short names use:
#     echo \"rvm use ${short_identifier}\" > .rvmrc
environment_id=\"$identifier\"

# Uncomment the following lines if you want to verify rvm version per project
# rvmrc_rvm_version=\"${rvm_version}\" # 1.10.1 seems like a safe start
# eval \"\$(echo \${rvm_version}.\${rvmrc_rvm_version} | awk -F. '{print \"[[ \"\$1*65536+\$2*256+\$3\" -ge \"\$4*65536+\$5*256+\$6\" ]]\"}' )\" || {
#   echo \"This .rvmrc file requires at least RVM \${rvmrc_rvm_version}, aborting loading.\"
#   exit 1
# }
" >> .rvmrc
    if __rvm_string_match "$identifier" "jruby*"
    then
      printf "%b" "
# Uncomment following line if you want options to be set only for given project.
# PROJECT_JRUBY_OPTS=( --1.9 )
# The variable PROJECT_JRUBY_OPTS requires the following to be run in shell:
#    chmod +x \${rvm_path}/hooks/after_use_jruby_opts
" >> .rvmrc
    fi
    printf "%b" "
# First we attempt to load the desired environment directly from the environment
# file. This is very fast and efficient compared to running through the entire
# CLI and selector. If you want feedback on which environment was used then
# insert the word 'use' after --create as this triggers verbose mode.
if [[ -d \"\${rvm_path:-\$HOME/.rvm}/environments\"
  && -s \"\${rvm_path:-\$HOME/.rvm}/environments/\$environment_id\" ]]
then
  \\. \"\${rvm_path:-\$HOME/.rvm}/environments/\$environment_id\"
  for __hook in \"\${rvm_path:-\$HOME/.rvm}/hooks/after_use\"*
  do
    if [[ -f \"\${__hook}\" && -x \"\${__hook}\" && -s \"\${__hook}\" ]]
    then \\. \"\${__hook}\" || true
    fi
  done
  unset __hook
" >> .rvmrc
    if [[ " $flags " == *" use "* ]]
    then printf "%b" "  if (( \${rvm_use_flag:=1} >= 1 )) # display automatically"    >> .rvmrc
    else printf "%b" "  if (( \${rvm_use_flag:=1} >= 2 )) # display only when forced" >> .rvmrc
    fi
    printf "%b" "
  then
    if [[ \$- == *i* ]] # check for interactive shells
    then printf \"%b\" \"Using: \$(tput setaf 2 2>/dev/null)\$GEM_HOME\$(tput sgr0 2>/dev/null)\\\\n\" # show the user the ruby and gemset they are using in green
    else printf \"%b\" \"Using: \$GEM_HOME\\\\n\" # don't use colors in non-interactive shells
    fi
  fi
" >> .rvmrc
    printf "%b" "else
  # If the environment file has not yet been created, use the RVM CLI to select.
  rvm --create $flags \"\$environment_id\" || {
    echo \"Failed to create RVM environment '\${environment_id}'.\"
    return 1
  }
fi
" >> .rvmrc
    for gem_file in *.gems
    do
      case "$gem_file" in
        (\*.gems) continue ;;
      esac
      printf "%b" "
# If you use an RVM gemset file to install a list of gems (*.gems), you can have
# it be automatically loaded. Uncomment the following and adjust the filename if
# necessary.
#
# filename=\".gems\"
# if [[ -s \"\$filename\" ]]
# then
#   rvm gemset import \"\$filename\" | GREP_OPTIONS=\"\" \\\\command \\grep -v already | GREP_OPTIONS=\"\" \command \grep -v listed | GREP_OPTIONS=\"\" \command \grep -v complete | \command \sed '/^$/d'
# fi
" >> .rvmrc
    done
    if [[ -s Gemfile ]]
    then
      printf "%b" "
# If you use bundler, this might be useful to you:
# if [[ -s Gemfile ]] && {
#   ! builtin command -v bundle >/dev/null ||
#   builtin command -v bundle | GREP_OPTIONS=\"\" \\\\command \\grep \$rvm_path/bin/bundle >/dev/null
# }
# then
#   printf \"%b\" \"The rubygem 'bundler' is not installed. Installing it now.\\\\n\"
#   gem install bundler
# fi
# if [[ -s Gemfile ]] && builtin command -v bundle >/dev/null
# then
#   bundle install | GREP_OPTIONS=\"\" \\\\command \\grep -vE '^Using|Your bundle is complete'
# fi
" >> .rvmrc
    fi
  else
    rvm_error ".rvmrc cannot be set in your home directory.\
      \nThe home .rvmrc is for global rvm settings only."
  fi
}
src/rvm/scripts/functions/build_config_system000066400000026616147511530550015634 0ustar00#!/usr/bin/env bash

# fail for old rubies
__rvm_setup_compile_environment_system_early_osx_old_rubies()
{
  # skip if 10.10+
  __rvm_version_compare "${_system_version}" -ge 10.10 || return 0

  case ${rvm_ruby_string:-""} in
    ruby-1.8.7*)
      true # 1.8.7 should build fine
      ;;
    ruby-1.8.*|ruby-1.9.2*)
      rvm_error "
RVM does not know how to build working ${rvm_ruby_string} on OSX ${_system_version},
if you know please let us know by opening a ticket with instructions here:

    https://github.com/rvm/rvm/issues
"
      return 1
      ;;
  esac
}

# Cleanup broken devtools setup
__rvm_setup_compile_environment_system_early_osx_fix_devtools()
{
  \typeset __xcode_dir_path
  if
    [[ -r "/usr/share/xcode-select/xcode_dir_path" ]] &&
    __xcode_dir_path="$( cat /usr/share/xcode-select/xcode_dir_path 2>/dev/null )" &&
    [[ -n "${__xcode_dir_path}" && ! -d "${__xcode_dir_path}" ]]
  then
    __rvm_try_sudo rm -f "/usr/share/xcode-select/xcode_dir_path"
  fi
}

# Install CLT on 10.9 if not yet installed
__rvm_setup_compile_environment_system_early_osx_install_clt()
{
  \typeset __developer_update
  # skip if older then 10.9
  __rvm_version_compare "${_system_version}" -ge 10.9 || return 0
  # continue if already using some xcode
  xcode-select -p >/dev/null 2>&1 && return 0 || true
  # trick the update to think user opened the dialog
  touch /tmp/.com.apple.dt.CommandLineTools.installondemand.in-progress
  # find pending update
  __developer_update="$(
    __rvm_try_sudo softwareupdate -l 2>/dev/null |
    awk -F'*' '/Command Line Developer Tools/{print last_line} {last_line=$2}'
  )"
  # remove white-space from the beginning
  __developer_update="${__developer_update# }"
  # run the update or clean the trick file
  if [[ -n "${__developer_update}" ]]
  then __rvm_try_sudo softwareupdate -i "${__developer_update}" -v || return $?
  else rm -f /tmp/.com.apple.dt.CommandLineTools.installondemand.in-progress
  fi
}

__rvm_setup_compile_environment_system_early_OSX()
{
  __rvm_setup_compile_environment_system_early_osx_old_rubies   &&
  __rvm_setup_compile_environment_system_early_osx_fix_devtools &&
  __rvm_setup_compile_environment_system_early_osx_install_clt  ||
  return $?
}

__rvm_setup_compile_environment_system_SmartOS()
{
  [[ "${_system_name}" == "SmartOS" ]] || return 0

  if __rvm_string_match "$1" "ruby-2.0.*"; then
    __rvm_update_configure_env CFLAGS="-R -fPIC"
  fi
  if __rvm_string_match "$1" "ruby-2.0.0-p0"; then
      # work around a make error.. see https://bugs.ruby-lang.org/issues/8268
      # patch included in p195.
      rvm_configure_env+=( rb_cv_have_signbit=no )
  fi
  return 0
}

__rvm_setup_compile_environment_system_SunOS()
{
  case "$1" in
    ruby-1.9*|ruby-2*)
      # Temporary solution for this bug http://bugs.ruby-lang.org/issues/5384
      rvm_configure_flags+=( ac_cv_func_dl_iterate_phdr=no )
      ;;
  esac
  # Commented for now as it breaks configure script call
  # with prepended environment variables
  # if __rvm_string_match "$1" "ruby-2.0.*"
  # then rvm_configure_env+=( bash )
  # fi
  case "${_system_version}" in
    (10)
      __rvm_update_configure_env AR="/opt/csw/bin/gar"
      __rvm_update_configure_env MAKE="/opt/csw/bin/gmake"
      __rvm_add_to_path prepend "/opt/csw/bin"
      ;;
    (11)
      __rvm_add_to_path prepend "/usr/gnu/bin"
      ;;
  esac
  return 0
}

__rvm_setup_compile_environment_system_OpenBSD()
{
  # https://github.com/rvm/rvm/issues/1581
  rvm_configure_env+=( sh )
  case "$1" in
    ruby-1.9*|ruby-2*)
      # Temporary solution for this bug http://bugs.ruby-lang.org/issues/5384
      rvm_configure_flags+=( ac_cv_func_dl_iterate_phdr=no )
      ;;
  esac
}

__rvm_setup_compile_environment_system_BSD()
{
  if
    [[  -z "${AUTOCONF_VERSION:-}" ]]
  then
    export AUTOCONF_VERSION
    AUTOCONF_VERSION="$(
      __rvm_ls -1 /usr/local/bin/autoreconf-* |
      __rvm_awk -F- '{print $NF}' |
      __rvm_version_sort |
      __rvm_tail -n 1
    )"
  fi
  if
    [[  -z "${AUTOMAKE_VERSION:-}" ]]
  then
    export AUTOMAKE_VERSION
    # FreeBSD might have automake-wrapper
    AUTOMAKE_VERSION="$(
      __rvm_ls -1 /usr/local/bin/automake-1* |
      __rvm_awk -F- '{print $NF}' |
      __rvm_version_sort |
      __rvm_tail -n 1
    )"
  fi
}

# MRI-2.0.0+ && osx-10.7+ - clang in newer Xcode/command line tools works properly
__ruby_clang_ok()
{
  case "$1" in
    (ruby-2*|ruby-head*)
      __rvm_version_compare "${_system_version}" -ge 10.7 || return 1
      ;;
    (ruby*|ree*)
      return 1
      ;;
  esac
  true
}

__rvm_setup_compile_environment_osx_compiler_selected()
{
  case "${rvm_autolibs_flag_number}" in
    (0) rvm_debug "User selected compiler: $initially_selected_compiler"
      ;;
    (1) rvm_warn  "Warning: found user selected compiler '$initially_selected_compiler', this will suppress RVM auto detection mechanisms."
      ;;
    (*) rvm_error "Warning: found user selected compiler '$initially_selected_compiler', this will suppress RVM auto detection mechanisms."
      ;;
  esac
}

__rvm_setup_compile_environment_osx_compiler_find_gcc42()
{
  if
    [[ -x /usr/local/bin/gcc-4.2 ]] # HomeBrew
  then
    export CC=/usr/local/bin/gcc-4.2
  elif
    [[ -x /opt/local/bin/gcc-apple-4.2 ]] # MacPorts
  then
    export CC=/opt/local/bin/gcc-apple-4.2
  elif
    __rvm_which gcc-apple-4.2 > /dev/null # MacPorts via PATH
  then
    export CC=gcc-apple-4.2
  elif
    __rvm_which gcc-4.2 > /dev/null # Any gcc-4.2
  then
    export CC=gcc-4.2
  elif
    [[ -x /usr/bin/gcc-4.2 ]] # OSX-GCC-Installer / Xcode - might be LLVM
  then
    export CC=/usr/bin/gcc-4.2
  else
    return 1
  fi
  true # for osx
}

__rvm_setup_compile_environment_osx_compiler_find_clang()
{
  if
    __rvm_compiler_is_llvm
  then
    if
      __rvm_which clang > /dev/null # Any clang
    then
      export CC=clang
    elif
      [[ -x /usr/bin/clang ]]
    then
      export CC=/usr/bin/clang
    else
      return 1
    fi
  fi
  true # for osx
}

__rvm_setup_compile_environment_osx_compiler_find()
{
  if
    __rvm_version_compare "${_system_version}" -ge 10.9
  then
    if
      __rvm_version_compare "${1#ruby-}" -ge 2.1.0 &&
      __rvm_which gcc >/dev/null
    then
      export CC=gcc
    else
      if
        __rvm_setup_compile_environment_osx_compiler_clang_installed &&
        __rvm_setup_compile_environment_osx_compiler_clang_latest
      then
        export CC=/usr/bin/clang
      else
        __rvm_setup_compile_environment_osx_compiler_find_clang ||
        return $?
      fi
    fi
    return 0
  fi
  case "$1" in
    (ruby-2.0*)
      if
        __rvm_setup_compile_environment_osx_compiler_clang_installed &&
        __rvm_setup_compile_environment_osx_compiler_clang_latest
      then
        export CC=/usr/bin/clang
      else
        __rvm_setup_compile_environment_osx_compiler_find_gcc42 ||
        __rvm_setup_compile_environment_osx_compiler_find_clang ||
        return $?
      fi
      ;;
    (ruby-2*|ruby-head*)
      if
        __rvm_setup_compile_environment_osx_compiler_clang_installed &&
        __rvm_setup_compile_environment_osx_compiler_clang_latest
      then
        export CC=/usr/bin/clang
      else
        __rvm_setup_compile_environment_osx_compiler_find_clang ||
        return $?
      fi
      ;;
    (ruby*|ree*)
      __rvm_setup_compile_environment_osx_compiler_find_gcc42 ||
      __rvm_setup_compile_environment_osx_compiler_find_clang ||
      return $?
      ;;
  esac
  true # for osx
}

__rvm_setup_compile_environment_osx_compiler_clang_installed() [[ -x /usr/bin/clang ]]

__rvm_setup_compile_environment_osx_compiler_clang_latest()
{
  \typeset __clang_version
  __clang_version="$( /usr/bin/clang --version | __rvm_grep -oE "clang-[0-9]+\.[0-9]+\.[0-9]+" )" || return $?
  [[ -n "${__clang_version}" ]] || return $?
  __clang_version="${__clang_version#clang-}"
  __rvm_version_compare "${__clang_version:-0}" -ge "425.0.24" || return $?
  true # for osx
}

__rvm_setup_compile_environment_osx_compiler_clang()
{
  if
    __rvm_version_compare "${_system_version}" -ge 10.7
  then
    __rvm_setup_compile_environment_osx_compiler_clang_installed ||
    rvm_requiremnts_fail_or_run_action 2 \
      "Can not find 'Command Line Tools for Xcode',
You should install the latest version from: http://connect.apple.com" \
      true || return $?

    __rvm_setup_compile_environment_osx_compiler_clang_latest ||
    rvm_requiremnts_fail_or_run_action 2 \
      "Found older 'Command Line Tools for Xcode',
You should install the latest version from: http://connect.apple.com" \
      true || return $?
  else
    rvm_requiremnts_fail_or_run_action 2 \
      "You are using 'clang' which is known to be buggy on older OSX (like: ${_system_version}).
Make sure 'gcc-4.2' is available and try again." \
      true || return $?
  fi
}

__rvm_setup_compile_environment_osx_compiler_missing()
{
  if
    __rvm_version_compare "${_system_version}" -ge 10.7
  then
    rvm_requiremnts_fail_always 2 \
      "Can not find 'Command Line Tools for Xcode',
You should install the latest version from: http://connect.apple.com" ||
      return $?
  else
    rvm_requiremnts_fail_always 2 \
      "Can not find 'Xcode',
You should install the latest version from: http://connect.apple.com" ||
      return $?
  fi
}

__rvm_setup_compile_environment_osx_compiler()
{
  if __rvm_array_contains "*debug*" "${rvm_patch_names[@]}"
  then rvm_force_autoconf_flag=1
  fi
  if   [[ -n "${initially_selected_compiler:-}" ]]
  then __rvm_setup_compile_environment_osx_compiler_selected "$@"
  elif [[ -n "${CC:-}" ]]
  then rvm_debug "Automatically selected compiler: $CC"
  else __rvm_setup_compile_environment_osx_compiler_find     "$@"
  fi
  if __rvm_compiler_is_clang
  then __rvm_setup_compile_environment_osx_compiler_clang    "$@"
  elif [[ "$( __rvm_found_compiler )" == "" ]]
  then __rvm_setup_compile_environment_osx_compiler_missing  "$@"
  fi
}

__rvm_setup_compile_environment_osx_107_ruby21()
{
  if
    [[ "${_system_version}" == "10.7" ]]
  then
    case "$1" in
      (ruby-2.1.3|ruby-2.1.4)
        rvm_configure_flags+=( --with-setjmp-type=setjmp )
        ;;
    esac
  fi
}

__rvm_setup_compile_environment_flags_tcltk()
{
  case "$1" in
    (ruby*|ree*)
      \typeset __ruby_version="${1#*-}"
      __ruby_version="${__ruby_version%%-*}"
      __rvm_version_compare ${__ruby_version} -ge 2.1.1 ||
      [[ " ${rvm_configure_flags[*]} " == *" --with-tcl "*    ]] ||
      [[ " ${rvm_configure_flags[*]} " == *" --with-tk "*     ]] ||
      [[ " ${rvm_configure_flags[*]} " == *" --without-tcl "* ]] ||
      [[ " ${rvm_configure_flags[*]} " == *" --without-tk "*  ]] ||
      rvm_configure_flags+=( --without-tcl --without-tk )
      ;;
  esac
  true # OSX --trace FIX
}

__rvm_setup_compile_environment_system_OSX()
{
  __rvm_setup_compile_environment_flags_tcltk  "$@" || return $?
  __rvm_setup_compile_environment_osx_compiler "$@" || return $?
  __rvm_setup_compile_environment_osx_107_ruby21 "$@" || return $?
  true # OSX --trace FIX
}

__rvm_setup_compile_environment_system_Cygwin()
{
  __rvm_setup_compile_environment_flags_tcltk  "$@" || return $?
  true # OSX --trace FIX
}

__rvm_setup_compile_environment_flags_dtrace()
{
  case "$1" in
    (ruby*)
      [[ " ${rvm_configure_flags[*]} " == *" --enable-dtrace "*  ]] ||
      [[ " ${rvm_configure_flags[*]} " == *" --disable-dtrace "* ]] ||
      rvm_configure_flags+=( --disable-dtrace )
      ;;
  esac
  true # OSX --trace FIX
}

__rvm_setup_compile_environment_system_FreeBSD()
{
  __rvm_setup_compile_environment_flags_dtrace "$@" || return $?
  true # OSX --trace FIX
}
src/rvm/scripts/functions/detect/system_version/codename000066400000001036147511530550017705 0ustar00#!/usr/bin/env bash

__rvm_detect_debian_major_version_from_codename()
{
  case $_system_version in
    buster*)  _system_version="10";;
    stretch*) _system_version="9";;
    jessie*)  _system_version="8";;
    wheezy*)  _system_version="7";;
    squeeze*) _system_version="6";;
    lenny*)   _system_version="5";;
    etch*)    _system_version="4";;
    sarge*)   _system_version="3";;
    woody*)   _system_version="3";;
    potato*)  _system_version="2";;
    slink*)   _system_version="2";;
    hamm*)    _system_version="2";;
  esac
}
src/rvm/scripts/functions/detect/xcode000066400000001664147511530550014152 0ustar00#!/usr/bin/env bash

__rvm_detect_xcode_version()
{
  \typeset version_file
  for version_file in \
    /Applications/Xcode.app/Contents/version.plist \
    /Developer/Applications/Xcode.app/Contents/version.plist
  do
    if
      [[ -f $version_file ]]
    then
      if
        [[ -x /usr/libexec/PlistBuddy ]]
      then
        /usr/libexec/PlistBuddy -c "Print CFBundleShortVersionString" $version_file
      else
        __rvm_sed -n '/<key>CFBundleShortVersionString<\/key>/{n; s/^.*>\(.*\)<.*$/\1/; p;}' < $version_file
      fi
      return 0
    fi
  done

  if
    builtin command -v xcodebuild >/dev/null
  then
    xcodebuild -version | __rvm_sed -n '/Xcode/ {s/Xcode //; p;}'
    return 0
  fi
  return 1
}

__rvm_detect_xcode_version_at_least()
{
  \typeset __xcode_version="$(__rvm_detect_xcode_version)"
  [[ -n "$__xcode_version" ]] || return 0
  __rvm_version_compare "$__xcode_version" -ge "$1" || return $?
  true # for OSX
}
src/rvm/scripts/functions/detect/system_name/lsb_release000066400000001507147511530550017650 0ustar00#!/usr/bin/env bash

__rvm_detect_system_from_lsb_release()
{
  local __system_name="$( awk -F'=' '$1=="DISTRIB_ID"{print $2}' /etc/lsb-release | head -n 1 | tr '[A-Z]' '[a-z]' | tr -d \" )"

  case $__system_name in
    deepin*)        _system_name="Deepin";;
    elementary*)    _system_name="Elementary";;
    kali*)          _system_name="Kali";;
    linuxmint*)     _system_name="Mint";;
    manjarolinux*)  _system_name="Manjaro";;
    neon*)          _system_name="Ubuntu";;
    solus*)         _system_name="Solus";;
    trisquel*)      _system_name="Trisquel";;
    ubuntu*)        _system_name="Ubuntu";;
    zorin*)         _system_name="Ubuntu";;
    *)              return 1
  esac

  _system_version="$( awk -F'=' '$1=="DISTRIB_RELEASE"{print $2}' /etc/lsb-release | head -n 1 )"
  _system_arch="$( uname -m )"

  return 0
}
src/rvm/scripts/functions/detect/system_name/os_release000066400000002777147511530550017523 0ustar00#!/usr/bin/env bash

__rvm_detect_system_from_os_release()
{
  local __system_name="$( awk -F'=' '$1=="ID"{print $2}' /etc/os-release | head -n 1 | tr '[A-Z]' '[a-z]' | tr -d \" )"

  case $__system_name in
    amzn*)
      _system_name="Amazon"
      _system_version="$( awk -F'=' '$1=="VERSION_ID"{gsub(/"/,"");print $2}' /etc/os-release | head -n 1 )"
      _system_arch="$( uname -m )"
      ;;

    opensuse*)
      _system_name="OpenSuSE"
      _system_version="$( awk -F'=' '$1=="VERSION_ID"{gsub(/"/,"");print $2}' /etc/os-release | head -n 1 )"
      _system_arch="$( uname -m )"
      ;;

    pclinuxos*)
      _system_name="PCLinuxOS"
      _system_version="$(GREP_OPTIONS="" \command \grep -Eo '[0-9\.]+' /etc/redhat-release  | \command \awk -F. '{print $1}' | head -n 1)"
      _system_arch="$( uname -m )"
      ;;

    void*)
      _system_name="Void"
      _system_version="$(\command \lsb_release -a | \command awk -F: '/Release/{gsub(" |\t",""); print $2}')"
      _system_arch="$( uname -m )"
      ;;

    debian*)
      _system_name="Debian"
      _system_version="$(awk -F'=' '$1=="VERSION_ID"{gsub(/"/,"");print $2}' /etc/os-release | \command \awk -F. '{print $1}' | head -n 1)"
      _system_arch="$( dpkg --print-architecture )"

      if
        [ -z "$_system_version" ]
      then
        _system_version="$(\command \cat /etc/debian_version | \command \awk -F. '{print $1}' | head -n 1)"
      fi

      __rvm_detect_debian_major_version_from_codename
      ;;

    *)
      return 1
  esac

  return 0
}
src/rvm/scripts/functions/detect/system000066400000015416147511530550014374 0ustar00#!/usr/bin/env bash

source "$rvm_scripts_path/functions/detect/system_version/codename"

__rvm_detect_system()
{
  unset  _system_type _system_name _system_version _system_arch
  export _system_type _system_name _system_version _system_arch

  _system_info="$(command uname -a)"
  _system_type="unknown"
  _system_name="unknown"
  _system_name_lowercase="unknown"
  _system_version="unknown"
  _system_arch="$(command uname -m)"

  case "$(command uname)" in
    (Linux|GNU*)
      source "$rvm_scripts_path/functions/detect/system_name/lsb_release"
      source "$rvm_scripts_path/functions/detect/system_name/os_release"

      _system_type="Linux"

      if [[ -f /etc/lsb-release ]] && __rvm_detect_system_from_lsb_release
      then
        :
      elif
        [[ -f /etc/os-release ]] && __rvm_detect_system_from_os_release
      then
        :
      elif
        [[ -f /etc/altlinux-release ]]
      then
        _system_name="Arch"
        _system_version="libc-$(ldd --version  | \command \awk 'NR==1 {print $NF}' | \command \awk -F. '{print $1"."$2}' | head -n 1)"
      elif
        [[ -f /etc/SuSE-release ]]
      then
        _system_name="SuSE"
        _system_version="$( \command \awk -F'=' '{gsub(/ /,"")} $1~/VERSION/ {version=$2} $1~/PATCHLEVEL/ {patch=$2} END {print version"."patch}' < /etc/SuSE-release )"
      elif
       [[ -f /etc/devuan_version ]]
      then
        _system_name="Devuan"
        _system_version="$(\command \cat /etc/devuan_version | \command \awk -F. '{print $1}' | head -n 1)"
        _system_arch="$( dpkg --print-architecture )"
      elif
        [[ -f /etc/sabayon-release ]]
      then
        # needs to be before gentoo
        _system_name="Sabayon"
        _system_version="$(\command \cat /etc/sabayon-release | \command \awk 'NR==1 {print $NF}' | \command \awk -F. '{print $1"."$2}' | head -n 1)"
      elif
        [[ -f /etc/gentoo-release ]]
      then
        _system_name="Gentoo"
        _system_version="base-$(\command \cat /etc/gentoo-release | \command \awk 'NR==1 {print $NF}' | \command \awk -F. '{print $1"."$2}' | head -n 1)"
      elif
        [[ -f /etc/arch-release ]]
      then
        _system_name="Arch"
        _system_version="libc-$(ldd --version  | \command \awk 'NR==1 {print $NF}' | \command \awk -F. '{print $1"."$2}' | head -n 1)"
      elif
        [[ -f /etc/fedora-release ]]
      then
        _system_name="Fedora"
        _system_version="$(GREP_OPTIONS="" \command \grep -Eo '[0-9]+' /etc/fedora-release | head -n 1)"
      elif
        [[ -f /etc/oracle-release ]]
      then
        _system_name="Oracle"
        _system_version="$(GREP_OPTIONS="" \command \grep -Eo '[0-9\.]+' /etc/oracle-release  | \command \awk -F. '{print $1}' | head -n 1)"
      elif
        [[ -f /etc/redhat-release ]]
      then
        _system_name="$( GREP_OPTIONS="" \command \grep -Eo 'CentOS|PCLinuxOS|ClearOS|Mageia|Scientific|ROSA Desktop|OpenMandriva' /etc/redhat-release 2>/dev/null | \command \head -n 1 | \command \sed "s/ //" )"
        _system_name="${_system_name:-CentOS}"
        _system_version="$(GREP_OPTIONS="" \command \grep -Eo '[0-9\.]+' /etc/redhat-release  | \command \awk -F. 'NR==1{print $1}' | head -n 1)"
        _system_arch="$( uname -m )"
      elif
        [[ -f /etc/centos-release ]]
      then
        _system_name="CentOS"
        _system_version="$(GREP_OPTIONS="" \command \grep -Eo '[0-9\.]+' /etc/centos-release  | \command \awk -F. '{print $1}' | head -n 1)"
      elif
        [[ -f /etc/debian_version ]]
      then
        _system_name="Debian"
        _system_version="$(\command \cat /etc/debian_version | \command \awk -F. '{print $1}' | head -n 1)"
        _system_arch="$( dpkg --print-architecture )"
        __rvm_detect_debian_major_version_from_codename
      elif
        [[ -f /proc/devices ]] &&
        GREP_OPTIONS="" \command \grep -Eo "synobios" /proc/devices >/dev/null
      then
        _system_type="BSD"
        _system_name="Synology"
        _system_version="libc-$(ldd --version  | \command \awk 'NR==1 {print $NF}' | \command \awk -F. '{print $1"."$2}' | head -n 1)"
      elif
        [[ "$(command uname -o)" == "Android" ]]
      then
        _system_name="Termux"
        _system_version="$(command uname -r)"
      else
        _system_version="libc-$(ldd --version  | \command \awk 'NR==1 {print $NF}' | \command \awk -F. '{print $1"."$2}' | head -n 1)"
      fi
      ;;

    (SunOS)
      _system_type="SunOS"
      _system_name="Solaris"
      _system_version="$(command uname -v)"
      _system_arch="$(command isainfo -k)"

      if
        [[ "${_system_version}" == joyent* ]]
      then
        _system_name="SmartOS"
        _system_version="${_system_version#* }"
      elif
        [[ "${_system_version}" == omnios* ]]
      then
        _system_name="OmniOS"
        _system_version="${_system_version#* }"
      elif
        [[ "${_system_version}" == oi* || "${_system_version}" == illumos* ]]
      then
        _system_name="OpenIndiana"
        _system_version="${_system_version#* }"
      elif
        [[ "${_system_version}" == Generic* ]]
      then
        _system_version="10"
      elif
        [[ "${_system_version}" == *11* ]]
      then
        _system_version="11"
      # is else needed here?
      fi
      ;;

    (FreeBSD)
      _system_type="BSD"
      _system_name="FreeBSD"
      _system_version="$(command uname -r)"
      _system_version="${_system_version%%-*}"
      ;;

    (OpenBSD)
      _system_type="BSD"
      _system_name="OpenBSD"
      _system_version="$(command uname -r)"
      ;;

    (DragonFly)
      _system_type="BSD"
      _system_name="DragonFly"
      _system_version="$(command uname -r)"
      _system_version="${_system_version%%-*}"
      ;;

    (NetBSD)
      _system_type="BSD"
      _system_name="NetBSD"
      _system_version_full="$(command uname -r)"
      _system_version="$(echo ${_system_version_full} | \command \awk -F. '{print $1"."$2}')"
      ;;

    (Darwin)
      _system_type="Darwin"
      _system_name="OSX"
      _system_version="$(sw_vers -productVersion | \command \awk -F. '{print $1"."$2}')"
      ;;

    (CYGWIN*)
      _system_type="Windows"
      _system_name="Cygwin"
      ;;

    (MINGW*)
      _system_type="Windows"
      _system_name="Mingw"
      ;;

    (*)
      return 1
      ;;
  esac

  _system_type="${_system_type//[ \/]/_}"
  _system_name="${_system_name//[ \/]/_}"
  _system_name_lowercase="$(echo ${_system_name} | \command \tr '[A-Z]' '[a-z]')"
  _system_version="${_system_version//[ \/]/_}"
  _system_arch="${_system_arch//[ \/]/_}"
  _system_arch="${_system_arch/amd64/x86_64}"
  _system_arch="${_system_arch/i[123456789]86/i386}"
}

__rvm_detect_system_override()
{
  \typeset _var
  for _var in system_type system_name system_name_lowercase system_version system_arch
  do __rvm_db ${_var} _${_var}
  done
}

__rvm_detect_system
__rvm_detect_system_override
src/rvm/scripts/functions/pkg000077500000026622147511530550012365 0ustar00#!/usr/bin/env bash

## common part of requirements_rvm_pkg_* extracted from scripts/functions/requirements/rvm_pkg ->
requirements_rvm_pkg_config()
{
  PKG_CONFIG_PATH="${rvm_usr_path:-${rvm_path}/usr}/lib/pkgconfig:${rvm_usr_path:-${rvm_path}/usr}/lib64/pkgconfig:/opt:/usr:/usr/local" pkg-config "$@"
}

requirements_rvm_pkg_lib_installed()
{
  if is_a_function ${1}_installed && ${1}_installed
  then return 0
  fi
  requirements_rvm_pkg_config --list-all | __rvm_grep "^$1[- ]" >/dev/null || return $?
  true
}

requirements_rvm_pkg_libs_install()
{
  while
    (( $# ))
  do
    PKG_CONFIG_LIBDIR="${rvm_usr_path:-${rvm_path}/usr}/lib/pkgconfig" install_$1 || return $?
    shift
  done
}

requirements_rvm_pkg_after_uniqe_paths()
{
  \typeset __lib __lib_full_name
  for __lib
  do
    __lib_full_name=$( requirements_rvm_pkg_config --list-all | __rvm_awk "/^${__lib}[- ]/{print \$1}" )
    if
      [[ -n "${__lib_full_name}" ]]
    then
      requirements_rvm_pkg_config ${__lib_full_name} --variable=prefix
    elif
      [[ "${__lib}" == 'readline' ]]
    then
      # http://lists.gnu.org/archive/html/bug-readline/2010-09/msg00002.html
      echo ${rvm_usr_path:-${rvm_path}/usr}
    else
      rvm_error "Can not find ${__lib} in 'pkg-config'"
    fi
  done | sort -u
}

requirements_rvm_pkg_configure()
{
  \typeset -a __packages
  \typeset __package __target
  __target="$1"
  shift
  __rvm_read_lines __packages <(
    requirements_rvm_pkg_after_uniqe_paths "$@"
  )
  for __package in "${__packages[@]}"
  do __rvm_update_configure_opt_dir "$__target" "$__package"
  done
}
## common part of requirements_rvm_pkg_* extracted from scripts/functions/requirements/rvm_pkg <-

## helper for checking marking missing custom packages
requirements_rvm_pkg_lib_installed_custom()
{
  while
     (( $# ))
  do
    requirements_rvm_pkg_lib_installed "$1" || packages_custom+=( "$1" )
    shift
  done
}

## Real work for installing packages from source
install_package()
{
  __rvm_db "${package}_url" "package_url"
  __rvm_db "${package}_rename_dir" "package_rename_dir"
  (
    __rvm_cd "$rvm_src_path"
    __rvm_rm_rf "$rvm_src_path/$package-$version"
    local_file="$package-$version.$archive_format"
    rvm_log "Fetching $local_file to $rvm_archives_path"

    "$rvm_scripts_path/fetch" "$package_url/${remote_file:-$local_file}" "$local_file" || return $?
    __rvm_log_command "$package/extract" "Extracting ${package} to $rvm_src_path/$package-$version" \
      __rvm_package_extract "$rvm_archives_path/$local_file" "$rvm_src_path" ||
    case $? in
      199)
        rvm_error "\nUnrecognized archive format '$archive_format'"
        return 199
        ;;
      *)
        rvm_error "There has been an error while trying to extract the source. Halting the installation."
        return 1
        ;;
    esac

    if [[ -n "${package_rename_dir:-}" ]]
    then \command \mv "$rvm_src_path/${package_rename_dir}" "$rvm_src_path/$package-$version"
    fi
    __rvm_cd "$rvm_src_path/$package-$version"
    __rvm_add_to_path append /usr/bin

    if
      [[ -n "$patches" ]]
    then
      for patch in $(echo $patches | \command \tr ',' ' ')
      do
        __rvm_log_command "$package/patch" "Applying patch '$patch'..." __rvm_patch -p0 -f -i "$patch" ||
        {
          \typeset result=$?
          rvm_error "Patch $patch did not apply cleanly... back to the patching board :("
          exit $result
        }
      done
    fi

    if
      [[ "${rvm_skip_autoreconf_flag:-0}" == 0 ]] &&
      [[ -f configure.ac || -f configure.in ]]
    then
      if
        (( ${#rvm_autoconf_flags[@]} == 0 ))
      then
        case "${_system_type}" in
          (Windows) rvm_autoconf_flags=( -ivf )        ;; # no symlinks on windows :(
          (*)       rvm_autoconf_flags=( -is --force ) ;;
        esac
      fi
      __rvm_log_command "$package/autoreconf" "Prepare $package in $rvm_src_path/$package-$version." \
        __rvm_autoreconf "${rvm_autoconf_flags[@]}"
    fi

    [[ -n "${rvm_configure_env[*]}" ]] || rvm_configure_env=() # zsh can assume empty var => ( '' )
    (( ${#configure[@]} )) || configure=( ./configure )
    configure=(
      "${rvm_configure_env[@]}"
      "${configure[@]}" --prefix="${prefix_path:-$rvm_usr_path}"
      "${rvm_configure_flags[@]}" "${configure_flags[@]}"
    )

    __rvm_log_command "$package/configure" "Configuring $package in $rvm_src_path/$package-$version." \
      "${configure[@]}"

    unset configure_flags configure

    touch "$rvm_path/config/packages"
    if [[ "$action" == "uninstall" ]]
    then
      __rvm_log_command "$package/make.uninstall" "Uninstalling $package from ${prefix_path:-$rvm_usr_path}"  __rvm_make uninstall &&
      __rvm_cd "$rvm_src_path" &&
      __rvm_log_command "$package/rm_src.uninstall" "Removing ${package}-${version} from $rvm_src_path" \
        \command \rm -rf "$rvm_src_path/$package-$version" &&
      __rvm_db_ "$rvm_path/config/packages" "${package}" delete
    else
      __rvm_log_command "$package/make"         "Compiling $package in $rvm_src_path/$package-$version." \
        __rvm_make "${rvm_make_flags[@]}" &&
      __rvm_log_command "$package/make.install" "Installing $package to ${prefix_path:-$rvm_usr_path}" \
        __rvm_make install &&
      __rvm_db_ "$rvm_path/config/packages" "${package}" "${version}"
    fi
  )

  __function_on_stack __rvm_install_ruby ||
  rvm_warn "
Please note that it's required to reinstall all rubies:

    rvm reinstall all --force
"
}

package_installed()
{
  \typeset __search_path __lib_file __extension
  __search_path="${prefix_path:-${rvm_usr_path:-${rvm_path}/usr}}"

  [[ -f "${__search_path}/include/$1" ]] || return $?

  # __rvm_detect_system() does not support CYGWIN MINGW!
  case "${_system_type}" in
    (Darwin)  __extension="dylib" ;;
    (Windows) __extension="dll"   ;;
    (*)       __extension="so"    ;;
  esac
  __lib_file=$( __rvm_find "${__search_path}" -name "$2.${__extension}" | \command \head -n 1 )

  [[ -n "${__lib_file}" ]] || return $?

  case "${_system_type}" in
    (Darwin) lipo -info "${__lib_file}" | __rvm_grep "${_system_arch}" >/dev/null || return $? ;;
  esac
}

install_readline()
{
  package="readline" ; archive_format="tar.gz"
  __rvm_update_configure_opt_dir readline "${rvm_usr_path}"

  configure=( ./configure --disable-dependency-tracking )
  version="5.2"
  patches="$rvm_patches_path/$package-$version/shobj-conf.patch"
  install_package

  configure=( ./configure --disable-dependency-tracking )
  version="6.2"
  patches="$rvm_patches_path/$package-$version/patch-shobj-conf.diff"
  install_package
}
readline_installed()
{
  package_installed "readline/readline.h" "libreadline" || return $?
}

install_iconv()
{
  package="libiconv" ; version=1.13.1 ; archive_format="tar.gz"
  install_package
}

install_curl()
{
  package="curl" ; version=7.19.7 ; archive_format="tar.gz"
  install_package
}

install_openssl()
{
  \typeset -a openssl_use_asm
  package="openssl" ; archive_format="tar.gz"
  openssl_use_asm=( "no-asm" )
  __rvm_db "${package}_version" "version"
  if
    [[ "Darwin" == "${_system_type}" ]]
  then
    configure=( "./Configure" )
    if
      (( ${#rvm_architectures[@]} > 0 ))
    then
      if __rvm_string_match "${rvm_architectures[*]}" "64"
      then hw_cpu64bit=1
      fi
      if __rvm_string_match "${rvm_architectures[*]}" "ppc"
      then hw_machine="Power Macintosh"
      fi
    else
      hw_machine=$(sysctl hw.machine | __rvm_awk -F: '{print $2}' | __rvm_sed 's/^ //')
      hw_cpu64bit=$(sysctl hw.cpu64bit_capable | __rvm_awk '{print $2}')
    fi
    if
      [[ "Power Macintosh" == "$hw_machine" ]]
    then
      if [[ $hw_cpu64bit == 1 ]]
      then configure+=( "darwin64-ppc-cc" )
      else configure+=( "darwin-ppc-cc" )
      fi
    else
      if
       [[ $hw_cpu64bit == 1 ]]
      then
        configure+=( "darwin64-x86_64-cc" )
        openssl_use_asm=()
      else
        configure+=( "darwin-i386-cc" )
      fi
    fi
  else
    configure=( "./config" )
    if __rvm_compiler_version_or_higher "4.6"
    then openssl_use_asm=()
    fi
  fi
  configure+=( -I$rvm_usr_path/include -L$rvm_usr_path/lib zlib "${openssl_use_asm[@]}" no-krb5 )
  install_package
  __rvm_log_command openssl.certs "Updating openssl certificates" update_openssl_certs
}

update_openssl_certs()
(
  __rvm_cd "$rvm_usr_path/ssl" &&
  __rvm_curl https://raw.githubusercontent.com/bagder/ca-bundle/master/ca-bundle.crt -o cert.pem ||
  __rvm_curl https://curl.haxx.se/ca/cacert.pem -o cert.pem
)
openssl_installed()
{
  package_installed "openssl/opensslv.h" "libssl" || return $?
}

install_zlib()
{
  package="zlib" ; version="1.2.7" ; archive_format="tar.gz"
  install_package
}

install_autoconf()
{
  package="autoconf" ; version="2.65" ; archive_format="tar.gz"
  prefix_path="$rvm_usr_path"
  install_package
}

install_ncurses()
{
  package="ncurses" ; version="5.7" ; archive_format="tar.gz"
  configure_flags=(
    --disable-rpath --without-debug --without-ada --enable-safe-sprintf --enable-sigwinch --without-progs
  )
  install_package
}

install_pkgconfig()
{
  package="pkg-config" ; version="0.23" archive_format="tar.gz"
  install_package
}

install_gettext()
{
  package="gettext" ; version="0.17" ; archive_format="tar.gz"
  install_package
}

install_libxml()
{
  install_libxml2 "$@"
}

install_libxml2()
{
  package="libxml2" ; version="2.7.3" ; archive_format="tar.gz"
  if
    [[ "Darwin" == "${_system_type}" ]]
  then
    configure=(
      ./configure --build=i686-apple-darwin$(command uname -r) --host=i686-apple-darwin$(command uname -r)
    )
  fi
  install_package
  unset prefix_path
}

install_libxslt()
{
  package="libxslt" ; version="1.1.26" ; archive_format="tar.gz"
  configure_flags=( --with-libxml-prefix="$rvm_usr_path" )
  if
    [[ "SunOS" == "${_system_type}" ]]
  then
    patches="$rvm_patches_path/$package-$version/solaris.patch"
  fi
  install_package
  unset prefix_path
}

install_yaml()
{
  install_libyaml "$@"
}

install_libyaml()
{
  package="yaml" ; archive_format="tar.gz"
  __rvm_db "${package}_version" "version"
  install_package
}

libyaml_installed()
{
  package_installed "yaml.h" "libyaml"
}

install_glib()
{
  ( install_pkgconfig; )
  ( install_gettext; )
  package="glib" ; version="2.23.1" ; archive_format="tar.gz"
  __rvm_update_configure_env CC="cc" \
    CFLAGS="-I${rvm_usr_path}/include" \
    LDFLAGS="-L${rvm_usr_path}/lib" \
    PKG_CONFIG="$rvm_usr_path/bin/pkg-config"
  install_package
}

install_mono()
{
  ( install_glib; )

  __rvm_mono_env
  package="mono" ; version="2.6.1" ; archive_format="tar.bz2"
  install_package
}

install_llvm()
{
  package="llvm"
  version="89156"
  (
    __rvm_cd $rvm_src_path
    if [[ ! -d "$rvm_src_path/llvm/.svn" ]] ; then
      __rvm_db "${package}_url" "package_url"
      __rvm_rm_rf "$rvm_src_path/llvm"
      svn co -r "$version" "$package_url" llvm
      __rvm_cd "$rvm_src_path/llvm"
      ./configure --enable-bindings=none
      UNIVERSAL=1 UNIVERSAL_ARCH="i386 x86_64" ENABLE_OPTIMIZED=1 __rvm_make -j2
      __rvm_try_sudo env UNIVERSAL=1 UNIVERSAL_ARCH="i386 x86_64" ENABLE_OPTIMIZED=1 __rvm_make install
    fi
  )
}

install_epel()
{
  mv="${_system_version%%.*}"
  if [[ "${_system_name}" == "CentOS" ]] && [[ -f /etc/yum.repos.d/epel.repo ]] ; then
    __rvm_db "epel${mv}_key" "epel_key"
    __rvm_db "epel${mv}_rpm" "epel_rpm"
    "${rvm_scripts_path}/fetch" "${epel_key}"
    "${rvm_scripts_path}/fetch" "${epel_rpm}"
    __rvm_try_sudo rpm --import "${rvm_archives_path}/${epel_key##*/}"
    __rvm_try_sudo rpm --quiet -i "${rvm_archives_path}/${epel_rpm##*/}"
  fi
}
src/rvm/scripts/functions/init000066400000002150147511530550012532 0ustar00#!/usr/bin/env bash

__rvm_load_rvmrc()
{
  \typeset _file
  \typeset -a rvm_rvmrc_files
  if (( ${rvm_ignore_rvmrc:=0} == 1 ))
  then
    return 0
  fi

  [[ -n "${rvm_stored_umask:-}" ]] || export rvm_stored_umask=$(umask)

  rvm_rvmrc_files=("/etc/rvmrc" "$HOME/.rvmrc")
  if [[ -n "${rvm_prefix:-}" ]] && ! [[ "$HOME/.rvmrc" -ef "${rvm_prefix}/.rvmrc" ]]
     then rvm_rvmrc_files+=( "${rvm_prefix}/.rvmrc" )
  fi
  for _file in "${rvm_rvmrc_files[@]}"
  do
    if [[ -s "$_file" ]]
    then
      if __rvm_grep '^\s*rvm .*$' "$_file" >/dev/null 2>&1
      then
        rvm_error "
$_file is for rvm settings only.
rvm CLI may NOT be called from within $_file.
Skipping the loading of $_file
"
        return 1
      else
        source "$_file"
      fi
    fi
  done
  return 0
}

# Initialize rvm, ensuring that the path and directories are as expected.
__rvm_initialize()
{
  true ${rvm_scripts_path:="$rvm_path/scripts"}
  export rvm_scripts_path
  source "$rvm_scripts_path/base"

  __rvm_conditionally_add_bin_path
  export PATH

  [[ -d "${rvm_tmp_path:-/tmp}" ]] || command mkdir -p "${rvm_tmp_path}"

  return 0
}
src/rvm/scripts/functions/osx-ssl-certs000077500000013376147511530550014334 0ustar00#!/usr/bin/env bash

requirements_osx_update_openssl_cert_is_old()
{
  [[ ! -f "$cert_file" ||
    "$cert_file" -ot /Library/Keychains/System.keychain ||
    "$cert_file" -ot /System/Library/Keychains/SystemRootCertificates.keychain
  ]] || (( ${rvm_force_flag:-0} > 0 ))
}

requirements_osx_update_openssl_cert_create_dir_sudo()
{
  rvm_warn "mkdir -p \"$ssl_dir\" failed, retrying with sudo"
  if __rvm_try_sudo mkdir -p "$ssl_dir"
  then rvm_log "and sudo mkdir worked"
  else return $?
  fi
}

requirements_osx_update_openssl_cert_create_dir()
{
  [[ -d "$ssl_dir" ]] ||
  mkdir -p "$ssl_dir" ||
  requirements_osx_update_openssl_cert_create_dir_sudo ||
  {
    \typeset __ret=$?
    rvm_error "Can not create directory '$ssl_dir' for certificates."
    return ${__ret}
  }
}

requirements_osx_update_openssl_cert_target_select()
{
  if
    [[ -f "$cert_file" && -w "$cert_file" ]] ||
    [[ ! -e "$cert_file" && -d "$ssl_dir" && -w "$ssl_dir" ]]
  then
    __target="$cert_file"
  else
    __target="$(
      TMPDIR="${rvm_tmp_path}" mktemp ${TMPDIR:-/tmp}/tmp.XXXXXXXXXXXXXXXXXX
    )"
  fi
}

requirements_osx_update_openssl_cert_create_cert()
{
  security find-certificate -a -p /Library/Keychains/System.keychain > "$__target"
  security find-certificate -a -p /System/Library/Keychains/SystemRootCertificates.keychain >> "$__target"
}

requirements_osx_update_openssl_cert_target_move()
{
  [[ "$__target" == "$cert_file" ]] ||
  __rvm_try_sudo \command \tee "$cert_file" < "$__target" > /dev/null ||
  {
    \typeset __ret=$?
    rm -f "$__target"
    return ${__ret}
  }
}

requirements_osx_update_openssl_cert_ensure_readable()
{
  __target="$cert_file"
  while
    [[ ! -r "$__target" && "$__target" != "" ]]
  do
    __rvm_try_sudo \chmod ugo+rX "$__target"
    __target="${__target%/*}"
  done
}

requirements_osx_update_openssl_cert_run()
{
  \typeset __target="$cert_file"

  if
    [[ -z "$cert_file" ]]
  then
    rvm_error "Empty path passed to certificates update, functions stack: ${FUNCNAME[*]}"
    return 1
  fi

  rvm_log "Updating certificates bundle '$cert_file'"

  requirements_osx_update_openssl_cert_create_dir      || return $?
  requirements_osx_update_openssl_cert_target_select   || return $?
  requirements_osx_update_openssl_cert_create_cert     || return $?
  requirements_osx_update_openssl_cert_target_move     || return $?
}

requirements_osx_update_openssl_cert()
{
  [[ "Darwin" == "${_system_type}" ]] || return 0

  \typeset ssl_binary ssl_dir cert_file
  ssl_binary="${1:-$(__rvm_which openssl)}"
  __rvm_osx_ssl_certs_file_from_openssl "${ssl_binary}" || return $?
  ssl_dir="${cert_file%/*}"

  case "${rvm_autolibs_flag_number}" in
    (0)
      rvm_debug "Skipping update of certificates bundle '$cert_file', to force update run:
    rvm osx-ssl-certs update ${cert_file}
"
      return 0
      ;;
  esac

  if
    requirements_osx_update_openssl_cert_is_old
  then
    rvm_requiremnts_fail_or_run_action 2 \
      "Skipping update of certificates bundle '$cert_file', to force update run:
    rvm osx-ssl-certs update ${cert_file}
" \
      requirements_osx_update_openssl_cert_run ||
      return $?
  else
    rvm_log "Certificates bundle '$cert_file' is already up to date."
  fi
  requirements_osx_update_openssl_cert_ensure_readable || return $?
}

__rvm_osx_ssl_certs_update_for_path()
{
  \typeset ssl_dir cert_file
  cert_file="${1:-$( __rvm_osx_ssl_certs_file_for_ruby )}"
  ssl_dir="${cert_file%/*}"

  if (( ${rvm_silent_flag:-0} == 0 ))
  then printf "%b" "Updating certificates bundle ${cert_file}: "
  fi
  if
    requirements_osx_update_openssl_cert_is_old
  then
    if
      requirements_osx_update_openssl_cert_run
    then
      if (( ${rvm_silent_flag:-0} == 0 ))
      then printf "%b" "Updated.\n"
      fi
    else
      \typeset result=$?
      if (( ${rvm_silent_flag:-0} == 0 ))
      then printf "%b" "Failed.\n"
      else printf "%b" "Updating certificates for ${cert_file}: Failed.\n"
      fi
      return $result
    fi
  else
    if (( ${rvm_silent_flag:-0} == 0 ))
    then printf "%b" "Already up to date.\n"
    fi
  fi
  requirements_osx_update_openssl_cert_ensure_readable || return $?
}

__rvm_osx_ssl_certs_status_for_path()
{
  \typeset ssl_dir cert_file
  cert_file="$1"
  ssl_dir="${cert_file%/*}"

  printf "%b" "Certificates bundle ${cert_file} is "
  if requirements_osx_update_openssl_cert_is_old
  then printf "%b" "old.\n"
  else printf "%b" "up to date.\n"
  fi
}

__rvm_osx_ssl_certs_file_for_ruby()
{
  "${1:-ruby}" -ropenssl -e 'puts OpenSSL::X509::DEFAULT_CERT_FILE' 2>/dev/null
}

__rvm_osx_ssl_certs_ensure_for_ruby()
{
  [[ "${_system_name}" == "OSX" ]] || return 0

  \typeset ssl_dir cert_file
  cert_file="$( __rvm_osx_ssl_certs_file_for_ruby "$1" )"
  ssl_dir="${cert_file%/*}"
  if
    requirements_osx_update_openssl_cert_is_old
  then
    rvm_requiremnts_fail_or_run_action 2 \
      "Skipping update of certificates bundle '$cert_file'." \
      requirements_osx_update_openssl_cert_run ||
      true # Ignore failure - ruby is already installed
  fi
  requirements_osx_update_openssl_cert_ensure_readable || return $?
  true # for osx
}

__rvm_osx_ssl_certs_file_from_openssl()
{
  cert_file="$( "${1:-openssl}" version -d )" ||
    rvm_requiremnts_fail_always 2 "Failed reading certificates path for '${1:-openssl}' with return code: ($__result)." $? ||
    return $?
  cert_file="${cert_file#*\"}"
  cert_file="${cert_file%\"*}"
  cert_file="${cert_file}/cert.pem"
}

__sm.cron.show()
{
  EDITOR="\command \cat" crontab -e 2>/dev/null
}

__rvm_cron_find()
{
  __sm.cron.show | __rvm_grep "$1" >/dev/null || return $?
}

__rvm_cron_uninstall()
{
  __sm.cron.show | __rvm_grep -v "$1" | crontab -
}

__rvm_cron_install()
{
  {
    __sm.cron.show
    echo "@daily $1"
  } | crontab -
}

export RVM_OSX_SSL_UPDATER="$rvm_path/bin/rvm --silent osx-ssl-certs update all"
src/rvm/scripts/functions/selector_interpreters000066400000034147147511530550016230 0ustar00#!/usr/bin/env bash

__rvm_select_rbx_nightly()
{
  (( ${rvm_nightly_flag:=0} == 1 )) || return 0

  \typeset org_rvm_ruby_patch_level _rvm_ruby_name
  if [[ "$rvm_ruby_version" == head ]]
  then rvm_ruby_version=""
  fi
  rvm_debug "searching for binary rbx ${rvm_ruby_version:-}${rvm_ruby_version:+-}${rvm_ruby_patch_level}*${rvm_ruby_name:+-}${rvm_ruby_name:-}"
  org_rvm_ruby_patch_level="$rvm_ruby_patch_level"
  _rvm_ruby_name="${rvm_ruby_name:-${detected_rvm_ruby_name:-}}"
  rvm_ruby_patch_level="$(
    __list_remote_all |
      __rvm_grep ${rvm_ruby_version:-}${rvm_ruby_version:+-}${org_rvm_ruby_patch_level}.*${_rvm_ruby_name:+-}${_rvm_ruby_name:-} |
      __rvm_tail -n 1
  )"
  [[ -n "${rvm_ruby_patch_level:-}" ]] ||
  {
    rvm_error "Could not find rbx binary '${rvm_ruby_version:-}${rvm_ruby_version:+-}${org_rvm_ruby_patch_level}*${rvm_ruby_name:+-}${rvm_ruby_name:-}' binary release."
    return 1
  }
  rvm_ruby_patch_level="${rvm_ruby_patch_level##*/}"
  rvm_ruby_patch_level="${rvm_ruby_patch_level%.tar.*}"
  if
    [[ -z "${rvm_ruby_version:-}" ]]
  then
    rvm_ruby_patch_level="${rvm_ruby_patch_level#rubinius-}"
    rvm_ruby_version="${rvm_ruby_patch_level%%-*}"
  fi
  if
    [[ -z "${rvm_ruby_name:-}" ]]
  then
    rvm_ruby_name="${rvm_ruby_patch_level##*-}"
  fi
  rvm_ruby_patch_level="${rvm_ruby_patch_level##*${org_rvm_ruby_patch_level}}"
  rvm_ruby_patch_level="${rvm_ruby_patch_level%%-*}"
  rvm_ruby_patch_level="${org_rvm_ruby_patch_level}${rvm_ruby_patch_level}"
  rvm_ruby_string="rubinius-${rvm_ruby_version}-${rvm_ruby_patch_level}-${rvm_ruby_name}"
  rvm_debug "detected rbx ${rvm_ruby_string}"
  rvm_verify_downloads_flag=1

  true # for OSX
}

__rvm_select_rbx_compatibility_branch()
{
  case "${rvm_ruby_version}" in
    (2.0pre)      rvm_ruby_repo_branch="master"              ;;
    (2.0.testing) rvm_ruby_repo_branch="${rvm_ruby_version}" ;;
  esac

  if
    [[ ${rvm_19_flag:-0} == 1 ]]
  then
    rvm_ruby_repo_branch="1.9.3"
    rvm_head_flag=1
  elif
    [[ ${rvm_18_flag:-0} == 1 ]]
  then
    rvm_ruby_repo_branch="1.8.7"
    rvm_head_flag=1
  fi

  true # for OSX
}

__rvm_select_interpreter_rbx()
{
  __rvm_select_rbx_nightly || return $?

  rvm_ruby_interpreter="rbx"

  __rvm_select_rbx_compatibility_branch

  if
    (( ${rvm_head_flag:=1} == 0 )) &&
    [[ -z "${rvm_ruby_repo_branch:-}" ]] &&
    [[ "${rvm_ruby_version}" != "head" ]]
  then
    if
      __rvm_version_compare "${rvm_ruby_version}" -ge "2.0.0"
    then
      rbx_url="$( __rvm_db "rbx_url_2.0_and_newer" )"
      rvm_archive_extension="tar.bz2"
      rvm_ruby_package_file="rubinius-${rvm_ruby_version}"
      rvm_ruby_url="${rbx_url}/${rvm_ruby_package_file}.${rvm_archive_extension}"
    else
      rbx_url=${rbx_url:-$(__rvm_db "rbx_url")}
      rvm_archive_extension="tar.gz"
      rvm_ruby_package_file="rubinius-${rvm_ruby_version}"
      rvm_ruby_url="${rbx_url}/$rvm_ruby_package_file.${rvm_archive_extension}"
    fi
  else
    rvm_ruby_repo_url=${rvm_rbx_repo_url:-$(__rvm_db "rbx_repo_url")}
    rvm_head_flag=1
    rvm_ruby_patch_level=""
    rvm_ruby_tag="${rvm_ruby_version:+v}${rvm_ruby_version:-}"
    rvm_ruby_version="head"
    rvm_disable_binary_flag=1
  fi

  if [[ -n "${rvm_rbx_opt:-}" ]]
  then export RBXOPT="${RBXOPT:=${rvm_rbx_opt}}"
  fi
  true # for OSX
}

__rvm_select_interpreter_rubinius()
{
  __rvm_select_interpreter_rbx || return $?
}

__rvm_select_macruby_nightly_selected()
{
  \typeset __string_version
  __string_version="${rvm_ruby_version//./-}"
  __string_version="${__string_version#nightly_}"

  rvm_ruby_package_name="${rvm_ruby_interpreter}_nightly-${__string_version}"
  rvm_ruby_package_file="$rvm_ruby_package_name.pkg"
}

__rvm_select_macruby_nightly_detect()
{
  \typeset __string_version
  rvm_ruby_version="$(
    __rvm_curl -s "$rvm_ruby_url" |
    __rvm_grep -oE "<a href=\"macruby_nightly-[^<]+\.pkg</a>" |
    __rvm_awk -F"[<>]" '{print $3}' |
    __rvm_version_sort |
    __rvm_tail -n 1
  )"
  [[ -n "${rvm_ruby_version}" ]] ||
  {
    rvm_error "Could not find MacRuby nightly binary."
    return 1
  }
  rvm_ruby_package_file="${rvm_ruby_version}"
  rvm_ruby_package_name="${rvm_ruby_package_file%.pkg}"

  __string_version="${rvm_ruby_package_name#macruby_nightly-}"
  __string_version="${__string_version//-/.}"

  rvm_ruby_version="nightly_${__string_version}"
  rvm_ruby_string="macruby-${rvm_ruby_version}${rvm_ruby_name:+-}${rvm_ruby_name:-}"

  true # for OSX
}

__rvm_select_macruby_nightly()
{
  __rvm_db "macruby_nightly_url" "rvm_ruby_url"

  case "${rvm_ruby_version:-}" in
    (nightly_*)
      __rvm_select_macruby_nightly_selected
      ;;
    (*)
      __rvm_select_macruby_nightly_detect
      ;;
  esac

  rvm_ruby_url+="/${rvm_ruby_package_file}"
  rvm_verify_downloads_flag=1
  rvm_debug "selected macruby $rvm_ruby_string => $rvm_ruby_url"

  true # for OSX
}

__rvm_select_interpreter_macruby()
{
  if
    [[ "Darwin" == "${_system_type}" ]]
  then
    rvm_ruby_package_name="${rvm_ruby_interpreter}-${rvm_ruby_version}"
    if
      (( ${rvm_head_flag:=0} == 1 ))
    then
      rvm_ruby_version=""
      rvm_ruby_tag=""
      rvm_ruby_revision="head"
      __rvm_db "macruby_repo_url" "rvm_ruby_repo_url"
      rvm_ruby_url="$rvm_ruby_repo_url"
      rvm_disable_binary_flag=1
    elif
      [[ "${rvm_ruby_version:-}" == *"nightly"* ]]
    then
      __rvm_select_macruby_nightly
    elif
      [[ -n "${rvm_ruby_version:-}" ]]
    then
      __rvm_db "macruby_${rvm_ruby_version}_url" "rvm_ruby_url"
      [[ -n "${rvm_ruby_url:-}" ]] || __rvm_db "macruby_url" "rvm_ruby_url"
      rvm_ruby_package_name="MacRuby%20${rvm_ruby_version}.zip"
      rvm_ruby_package_file="$rvm_ruby_package_name"
      rvm_ruby_url="$rvm_ruby_url/$rvm_ruby_package_name"
    else
      __rvm_db "macruby_version" "rvm_ruby_version"
      __rvm_db "macruby_url" "rvm_ruby_url"
      rvm_ruby_package_name="MacRuby%20${rvm_ruby_version}.zip"
      rvm_ruby_package_file="$rvm_ruby_package_name"
      rvm_ruby_url="$rvm_ruby_url/$rvm_ruby_package_name"
    fi
    rvm_ruby_patch_level=""
  else
    rvm_error "MacRuby can only be installed on a Darwin OS."
  fi
  true # for OSX
}

__rvm_select_interpreter_jruby()
{
  rvm_ruby_patch_level=""
  rvm_ruby_repo_url="${rvm_ruby_repo_url:-$(__rvm_db "jruby_repo_url")}"
  rvm_ruby_url="${rvm_ruby_repo_url:-$(__rvm_db "jruby_repo_url")}"
  if (( ${rvm_head_flag:=0} == 1 ))
  then
    (( ${rvm_remote_flag:-0} == 1 )) || rvm_disable_binary_flag=1
    rvm_ruby_version="head"
  else
    if (( ${rvm_18_flag:-0} || ${rvm_19_flag:-0} || ${rvm_20_flag:-0} || ${#rvm_patch_names[@]} ))
    then rvm_disable_binary_flag=1
    fi
    rvm_ruby_version="${rvm_ruby_version:-"$(__rvm_db "jruby_version")"}"
    rvm_ruby_tag="${rvm_ruby_tag:-${rvm_ruby_version}}"
  fi

  alias jruby_ng="jruby --ng"
  alias jruby_ng_server="jruby --ng-server"

  true # for OSX
}

__rvm_truffleruby_set_version()
{
  if (( ${rvm_head_flag:=0} == 1 ))
  then
    rvm_ruby_version="head"
    truffleruby_version="head"
  else
    rvm_ruby_version="${rvm_ruby_version:-$(__rvm_db "truffleruby_version")}"
    truffleruby_version="${rvm_ruby_version}${rvm_ruby_patch_level:+-}${rvm_ruby_patch_level:-}"
  fi

  true # for OSX
}

__rvm_truffleruby_set_rvm_ruby_url()
{
  case "${_system_type}" in
    Linux) platform="linux" ;;
    Darwin) platform="macos" ;;
    *) rvm_error "TruffleRuby does not support ${_system_type} currently." ;;
  esac

  case "${_system_arch}" in
    x86_64) arch=amd64 ;;
    *) rvm_error "TruffleRuby does not support ${_system_arch} currently." ;;
  esac

  rvm_ruby_package_name="truffleruby-${truffleruby_version}"

  if (( ${rvm_head_flag:=0} == 1 )); then
    case "$platform" in
      linux) platform="ubuntu-18.04" ;;
      macos) platform="macos-latest" ;;
    esac

    rvm_ruby_package_file="${rvm_ruby_package_name}-${platform}"
    rvm_ruby_url="${rvm_ruby_repo_url:-https://github.com/ruby/truffleruby-dev-builder/releases/latest/download/${rvm_ruby_package_file}.tar.gz}"
  else
    rvm_ruby_package_file="${rvm_ruby_package_name}-${platform}-${arch}"
    rvm_ruby_url="${rvm_ruby_repo_url:-$(__rvm_db "truffleruby_url")/vm-${truffleruby_version}/${rvm_ruby_package_file}.tar.gz}"
  fi

  true # for OSX
}

__rvm_select_interpreter_truffleruby()
{
  __rvm_truffleruby_set_version
  __rvm_truffleruby_set_rvm_ruby_url

  true # for OSX
}

__rvm_select_interpreter_maglev()
{
  rvm_ruby_patch_level=""
  maglev_url="$(__rvm_db "maglev_url")"

  system="${_system_type}"
  if [[ "$MACHTYPE" == x86_64-apple-darwin* ]]
  then arch="i386" # x86_64-apple-darwin supports both i386 and x86_64 maglev implements only i386
  else arch="${_system_arch}"
  fi

  if
    (( ${rvm_head_flag:=0} == 1 )) || [[ "$rvm_ruby_version" == "head" ]]
  then
    rvm_head_flag=1
    rvm_ruby_version="head"
    rvm_ruby_repo_url="${rvm_ruby_repo_url:-$(__rvm_db "maglev_repo_url")}"
    rvm_ruby_url="${rvm_ruby_repo_url:-$(__rvm_db "maglev_repo_url")}"
    rvm_gemstone_version=$(
      __rvm_curl -s https://raw.githubusercontent.com/MagLev/maglev/master/version.txt |
        __rvm_grep "^GEMSTONE" | cut -f2 -d-
    )
    rvm_gemstone_package_file="GemStone-${rvm_gemstone_version}.${system}-${arch}"
    rvm_disable_binary_flag=1
  else
    rvm_ruby_package_file="MagLev-${rvm_ruby_version}" # removed from 1.0: .${system}-${arch}
    rvm_ruby_version="${rvm_ruby_version:-"$(__rvm_db "maglev_version")"}"
    rvm_ruby_package_name="${rvm_ruby_interpreter}-${rvm_ruby_version}"
    rvm_ruby_url="${rvm_ruby_url:-"$maglev_url/${rvm_ruby_package_file}.${rvm_archive_extension}"}"
    rvm_gemstone_version=$(
      __rvm_curl -s https://raw.githubusercontent.com/MagLev/maglev/MagLev-${rvm_ruby_version}/version.txt |
        __rvm_grep "^GEMSTONE" | cut -f2 -d-
    )
    rvm_gemstone_package_file="GemStone-${rvm_gemstone_version}.${system}-${arch}"
  fi

  export MAGLEV_HOME="$rvm_ruby_home"
  export GEMSTONE_GLOBAL_DIR=$MAGLEV_HOME

  rvm_gemstone_url="$maglev_url/${rvm_gemstone_package_file}.${rvm_archive_extension}"

  true # for OSX
}

__rvm_select_interpreter_ironruby()
{
  rvm_ruby_patch_level=""
  if
    (( ${rvm_head_flag:=0} == 1 ))
  then
    rvm_ruby_version="head"
    rvm_ruby_package_name="${rvm_ruby_string}"
    rvm_ruby_repo_url="${rvm_ruby_repo_url:-$(__rvm_db "ironruby_repo_url")}"
    rvm_ruby_url="${rvm_ruby_repo_url:-$(__rvm_db "ironruby_repo_url")}"
    rvm_disable_binary_flag=1
  else
    rvm_archive_extension="zip"
    rvm_ruby_version=${rvm_ruby_version:-"$(__rvm_db "ironruby_version")"}
    rvm_ruby_package_name="${rvm_ruby_interpreter}-${rvm_ruby_version}"
    rvm_ruby_package_file="${rvm_ruby_interpreter}-${rvm_ruby_version}.${rvm_archive_extension}"
    rvm_ruby_url="$(__rvm_db "ironruby_${rvm_ruby_version}_url")"
  fi
  export rvm_ruby_version rvm_ruby_string rvm_ruby_package_name rvm_ruby_repo_url rvm_ruby_url rvm_archive_extension
  true # for OSX
}

__rvm_select_interpreter_ree()
{
  rvm_ruby_interpreter=ree
  rvm_ruby_version=${rvm_ruby_version:-"$(__rvm_db "ree_version")"}

  case "$rvm_ruby_version" in
    1.8.*) true ;; # all good!
    *) rvm_error "Unknown Ruby Enterprise Edition version: $rvm_ruby_version" ;;
  esac

  if [[ -n "${rvm_ruby_patch_level:-0}" ]]
  then rvm_ruby_patch_level="${rvm_ruby_patch_level#p}"
  fi

  rvm_ruby_package_file="ruby-enterprise-$rvm_ruby_version-$rvm_ruby_patch_level"
  rvm_ruby_url="$(__rvm_db "${rvm_ruby_interpreter}_${rvm_ruby_version}_${rvm_ruby_patch_level}_url")"
  rvm_ruby_url="${rvm_ruby_url:-$(__rvm_db "${rvm_ruby_interpreter}_${rvm_ruby_version}_url")}"
  rvm_ruby_url="${rvm_ruby_url}/$rvm_ruby_package_file.tar.gz"

  true # for OSX
}

__rvm_select_interpreter_common()
{
  rvm_ruby_interpreter="${1}"
  rvm_ruby_version="head"
  rvm_ruby_patch_level=""
  export rvm_head_flag=1
  rvm_ruby_repo_url="${rvm_ruby_repo_url:-$(__rvm_db "${1}_repo_url")}"
  rvm_ruby_url=$rvm_ruby_repo_url
  rvm_ruby_configure=""
  rvm_ruby_make=""
  rvm_ruby_make_install=""
}

__rvm_select_interpreter_opal()
{
  __rvm_select_interpreter_common "opal"
}

__rvm_select_interpreter_topaz()
{
  __rvm_select_interpreter_common "topaz"
}

__rvm_select_interpreter_mruby()
{
  rvm_ruby_interpreter="mruby"
  rvm_ruby_patch_level=""
  rvm_ruby_repo_url="${rvm_ruby_repo_url:-$(__rvm_db "mruby_repo_url")}"
  rvm_ruby_url=$rvm_ruby_repo_url
  rvm_ruby_configure=""
  rvm_ruby_make=""
  rvm_ruby_make_install=""
  export rvm_skip_autoreconf_flag=1
  if
    [[ -z "${rvm_ruby_version:-}" ]]
  then
    rvm_head_flag=1
  else
    rvm_head_flag=0
    rvm_archive_extension="tar.gz"
    rvm_ruby_package_file="${rvm_ruby_version}"
  fi
}

__rvm_select_interpreter_ruby()
{
  if
    [[ "${rvm_ruby_patch_level:-}" == "p0" ]] &&
    __rvm_version_compare "${rvm_ruby_version}" -ge 2.1.0 &&
    [[ ! -d "$rvm_rubies_path/$rvm_ruby_string" ]]
  then
    rvm_ruby_patch_level=""
    rvm_ruby_string="${rvm_ruby_string%-p0}"
  fi

  rvm_ruby_package_name="${rvm_ruby_interpreter}-${rvm_ruby_version}${rvm_ruby_patch_level:+-}${rvm_ruby_patch_level:-}"
  rvm_ruby_package_file="${rvm_ruby_package_name}"

  if
    [[ -z "${rvm_ruby_version:-""}" ]] &&
    (( ${rvm_head_flag:=0} == 0 ))
  then
    rvm_error "Ruby version was not specified!"
  else
    rvm_ruby_repo_url="${rvm_ruby_repo_url:-"$(__rvm_db "ruby_repo_url")"}"

    if
      (( ${rvm_head_flag:=0} == 0 ))
    then
      if __rvm_version_compare "${rvm_ruby_version}" -ge "3.0.0"
      then rvm_archive_extension="tar.gz"
      elif __rvm_version_compare "${rvm_ruby_version}" -lt "1.8.5"
      then rvm_archive_extension="tar.gz"
      else rvm_archive_extension="tar.bz2"
      fi
    else
      rvm_disable_binary_flag=1
    fi
  fi

  true # for OSX
}

__rvm_select_interpreter_ext()
{
  if
    [[ -z "${rvm_ruby_name:-${detected_rvm_ruby_name:-}}" ]]
  then
    rvm_error "External ruby name was not specified!"
    return 1
  fi
}

__rvm_select_interpreter_current()
{
  ruby_binary="$(builtin command -v ruby)"
  if
    (( $? == 0)) &&
    __rvm_string_match "$ruby_binary" "*rvm*"
  then
    rvm_ruby_string="$(dirname "$ruby_binary" | __rvm_xargs dirname | __rvm_xargs basename)"
  else
    rvm_ruby_interpreter="system"
  fi
}

__rvm_select_interpreter_default()
{
  true # do nothing
}

__rvm_select_interpreter_system()
{
  true # do nothing
}

__rvm_select_interpreter_user()
{
  true # do nothing
}

__rvm_select_interpreter_missing()
{
  return 2
}
src/rvm/scripts/functions/environment000066400000025523147511530550014144 0ustar00#!/usr/bin/env bash

__rvm_env_string()
{
  \typeset _string
  _string="${GEM_HOME:-}"
  _string="${_string##*/}"
  printf "%b" "${_string:-system}\n"
}

__rvm_expand_ruby_string()
{
  \typeset string current_ruby

  string="$1"

  case "${string:-all}" in

    all)
      __rvm_list_strings | \command \tr ' ' "\n"
      ;;

    all-gemsets)
      __rvm_list_gemset_strings
      ;;

    default-with-rvmrc|rvmrc)
      "$rvm_scripts_path/tools" path-identifier "$PWD"
      ;;

    all-rubies|rubies)
      __rvm_list_strings
      ;;

    current-ruby|gemsets)
      current_ruby="$(__rvm_env_string)"
      current_ruby="${current_ruby%@*}"

      rvm_silence_logging=1 "$rvm_scripts_path/gemsets" list strings \
        | __rvm_sed "s/ (default)//; s/^/$current_ruby${rvm_gemset_separator:-@}/ ; s/@default// ;"
      ;;

    current)
      __rvm_env_string
      ;;

    aliases)
      __rvm_awk -F= '{print $string}' < "$rvm_path/config/alias"
      ;;

    *)
      __rvm_ruby_strings_exist $( echo "$string" | \command \tr "," "\n" | __rvm_strip )
      ;;

  esac
}

__rvm_become()
{
  # set rvm_rvmrc_flag=0 to not create .rvmrc in random places of code
  \typeset string rvm_rvmrc_flag
  string="$1"
  rvm_rvmrc_flag=0

  [[ -n "$string" ]] && {
    rvm_ruby_string="$string"
    rvm_gemset_name=""
  }

  __rvm_use >/dev/null || return $?

  rvm_ruby_string="${rvm_ruby_string}${rvm_gemset_name:+${rvm_gemset_separator:-'@'}}${rvm_gemset_name:-}"

  return 0
}

__rvm_ensure_has_environment_files()
{
  \typeset file_name variable value environment_id __path __gem_home

  __gem_home="${rvm_ruby_gem_home}"
  file_name="${__gem_home}/environment"
  __path=""
  if [[ "${__gem_home##*@}" != "global" ]]
  then __path+="${__gem_home}/bin:"
  fi
  __path+="${rvm_ruby_global_gems_path}/bin:${rvm_ruby_home}/bin"


  \command \rm -f "$file_name"
  \command \mkdir -p "${__gem_home}/wrappers" "${rvm_environments_path}" "${rvm_wrappers_path}"

  printf "%b" "export PATH=\"${__path}:\$PATH\"\n" > "$file_name"

  for variable in GEM_HOME GEM_PATH MY_RUBY_HOME IRBRC MAGLEV_HOME RBXOPT RUBY_VERSION
  do
    eval "value=\${${variable}:-""}"
    if [[ -n "$value" ]]
    then printf "export %b='%b'\n" "${variable}" "${value}" >> "$file_name"
    else printf "unset %b\n"       "${variable}"            >> "$file_name"
    fi
  done

  environment_id="${__gem_home##*/}"
  [[ -L "${rvm_environments_path}/${environment_id}" ]] ||
  {
    if [[ -f "${rvm_environments_path}/${environment_id}" ]]
    then rm -rf "${rvm_environments_path}/${environment_id}"
    fi
    ln -nfs "${__gem_home}/environment" "${rvm_environments_path}/${environment_id}"
  }

  ln -nfs "${__gem_home}/wrappers" "$rvm_wrappers_path/${environment_id}"

  return 0
}

# Runs a command in a given env.
__rvm_with()
(
  unset rvm_rvmrc_flag
  export rvm_create_flag=1
  export rvm_delete_flag=0
  export rvm_internal_use_flag=1
  export rvm_use_flag=0
  __rvm_use "$1" || return $?
  shift
  "$@" || return $?
)

__variables_definition()
{
  \typeset -a __variables_list __array_list
  \typeset __method

  __method="$1"

  # NOTE: Removing rvm_bin_path here causes system wide installations to generate
  # a corrupt PATH, breaking the RVM installation.
  __variables_list=(
    rvm_head_flag rvm_ruby_selected_flag rvm_user_install_flag rvm_path_flag rvm_cron_flag
    rvm_static_flag rvm_default_flag rvm_loaded_flag rvm_llvm_flag rvm_skip_autoreconf_flag rvm_dynamic_extensions_flag
    rvm_18_flag rvm_19_flag rvm_20_flag rvm_21_flag
    rvm_force_autoconf_flag rvm_dump_environment_flag rvm_curl_flags rvm_rubygems_version
    rvm_verbose_flag rvm_debug_flag rvm_trace_flag __array_start rvm_skip_pristine_flag
    rvm_create_flag rvm_remove_flag rvm_movable_flag rvm_archive_flag
    rvm_gemdir_flag rvm_reload_flag rvm_auto_reload_flag rvm_disable_binary_flag
    rvm_ignore_gemsets_flag rvm_skip_gemsets_flag rvm_install_on_use_flag rvm_remote_flag
    rvm_verify_downloads_flag rvm_skip_openssl_flag rvm_gems_cache_path rvm_gems_path
    rvm_man_path rvm_ruby_gem_path rvm_ruby_log_path rvm_gems_cache_path rvm_archives_path
    rvm_docs_path rvm_environments_path rvm_examples_path rvm_gems_path rvm_gemsets_path
    rvm_help_path rvm_hooks_path rvm_lib_path rvm_log_path rvm_patches_path rvm_repos_path
    rvm_rubies_path rvm_scripts_path rvm_src_path rvm_tmp_path rvm_user_path rvm_usr_path
    rvm_wrappers_path rvm_stored_errexit rvm_ruby_strings rvm_ruby_binary
    rvm_ruby_gem_home rvm_ruby_home rvm_ruby_interpreter rvm_ruby_irbrc rvm_ruby_major_version
    rvm_ruby_minor_version rvm_ruby_package_name rvm_ruby_patch_level rvm_ruby_release_version
    rvm_ruby_repo_url rvm_ruby_repo_branch rvm_ruby_revision rvm_ruby_tag rvm_ruby_sha rvm_ruby_repo_tag
    rvm_ruby_version rvm_ruby_package_file rvm_ruby_name rvm_ruby_name rvm_ruby_args
    rvm_ruby_user_tag rvm_ruby_patch detected_rvm_ruby_name __rvm_env_loaded next_token
    rvm_error_message rvm_gemset_name rvm_parse_break rvm_token rvm_action rvm_export_args
    rvm_gemset_separator rvm_expanding_aliases rvm_tar_command rvm_tar_options
    rvm_patch_original_pwd rvm_project_rvmrc rvm_archive_extension rvm_autoinstall_bundler_flag
    rvm_codesign_identity rvm_expected_gemset_name
    rvm_without_gems rvm_with_gems rvm_with_default_gems
    rvm_ignore_dotfiles_flag rvm_fuzzy_flag rvm_autolibs_flag
    rvm_autolibs_flag_number rvm_autolibs_flag_runner rvm_quiet_curl_flag rvm_max_time_flag
    rvm_error_clr   rvm_warn_clr   rvm_debug_clr   rvm_notify_clr   rvm_code_clr    rvm_comment_clr     rvm_reset_clr
    rvm_error_color rvm_warn_color rvm_debug_color rvm_notify_color rvm_code_color  rvm_comment_color   rvm_reset_color
    rvm_log_timestamp rvm_log_filesystem rvm_log_namelen rvm_show_log_lines_on_error
  )

  __array_list=(
    rvm_patch_names rvm_ree_options rvm_autoconf_flags rvm_architectures
  )

  case "${__method}" in
    (export) true ;;
    (unset)  unset "${__array_list[@]}" || true ;;
    (*)
      rvm_error "Unknown action given to __variables_definition: ${__method}"
      return 1
      ;;
  esac

  ${__method} "${__variables_list[@]}" || true

  # prevent errors with bash "set -a", see https://github.com/rvm/rvm/issues/2872
  if [[ -n "${BASH_VERSION:-}" ]]
  then export -fn __rvm_select_version_variables __rvm_ruby_string_parse_ __rvm_rm_rf_verbose __rvm_parse_args __rvm_ruby_string_find __rvm_file_load_env __rvm_remove_without_gems 2>/dev/null || true
  fi
}

# Set shell options that RVM needs temporarily, these are reverted by __rvm_teardown.
# see the top of ./scripts/initialize for settings that are needed all the time.
# Setup must be always called after initialize, otherwise it does nothing ... except exporting.
__rvm_setup()
{
  __variables_definition export

  # Setup only on first load.
  if (( __rvm_env_loaded != 1 ))
  then return 0
  fi

  if
    [[ -n "${BASH_VERSION:-}" ]] && ! __function_on_stack cd pushd popd
  then
    export rvm_shell_nounset

    if __rvm_has_opt "nounset"
    then rvm_bash_nounset=1
    else rvm_bash_nounset=0
    fi

    set +o nounset
    _rvm_old_traps=$( trap | __rvm_grep -E 'EXIT|HUP|INT|QUIT|TERM' || true )
    trap '__rvm_teardown_final ; set +x' EXIT HUP INT QUIT TERM
  fi

  if [[ -n "${ZSH_VERSION:-}" ]]
  then
    export rvm_zsh_clobber rvm_zsh_nomatch
    # Set clobber for zsh users, for compatibility with bash's append operator ( >> file ) behavior
    if setopt | __rvm_grep -s '^noclobber$' >/dev/null 2>&1
    then rvm_zsh_clobber=0
    else rvm_zsh_clobber=1
    fi
    setopt clobber
    # Set no_nomatch so globs that don't match any files don't print out a warning
    if setopt | __rvm_grep -s '^nonomatch$' >/dev/null 2>&1
    then rvm_zsh_nomatch=0
    else rvm_zsh_nomatch=1
    fi
    setopt no_nomatch
  fi
}

__rvm_teardown()
{
  if builtin command -v __rvm_cleanup_tmp >/dev/null 2>&1
  then __rvm_cleanup_tmp
  fi

  export __rvm_env_loaded
  # if __rvm_env_loaded is not set - detect it via rvm_tmp_path
  : __rvm_env_loaded:${__rvm_env_loaded:=${rvm_tmp_path:+1}}:
  # if not loaded then fallback to 0
  : __rvm_env_loaded:${__rvm_env_loaded:=0}:
  # decrease load count counter
  : __rvm_env_loaded:$(( __rvm_env_loaded-=1 )):

  # skip teardown when already done or when not yet finished
  if [[ -z "${rvm_tmp_path:-}" ]] || (( __rvm_env_loaded > 0 ))
  then return 0
  fi

  if
    [[ -n "${BASH_VERSION:-}" ]]
  then
    trap - EXIT HUP INT QUIT TERM # Clear all traps, we do not want to go into an loop.
    if
      [[ -n "${_rvm_old_traps:-}" ]]
    then
      eval "${_rvm_old_traps}"
    fi

    (( rvm_bash_nounset == 1 )) && set -o nounset
    unset rvm_bash_nounset
  fi

  if
    [[ -n "${ZSH_VERSION:-""}" ]]
  then
    # If rvm_zsh_clobber is 0 then "setopt" contained "noclobber" before rvm performed "setopt clobber".
    (( rvm_zsh_clobber == 0 )) && setopt noclobber
    # If rvm_zsh_nomatch is 0 then "setopt" contained "nonomatch" before rvm performed "setopt nonomatch".
    (( rvm_zsh_nomatch == 0 )) || setopt nomatch

    unset rvm_zsh_clobber rvm_zsh_nomatch
  fi

  if
    [[ -n "${rvm_stored_umask:-}" ]]
  then
    umask ${rvm_stored_umask}
    unset rvm_stored_umask
  fi

  if builtin command -v __rvm_cleanup_download >/dev/null 2>&1
  then __rvm_cleanup_download
  fi

  if [[ "${rvm_stored_errexit:-""}" == "1" ]]
  then set -e
  fi

  __variables_definition unset

  unset _system_arch _system_name _system_type _system_version

  return 0
}

__rvm_teardown_if_broken()
{
  if
    __function_on_stack __rvm_load_project_config ||
    __function_on_stack __rvm_with
  then
    true # inside of loading .rvmrc / __rvm_with
  elif
    (( ${__rvm_env_loaded:-0} > 0 ))
  then
    __rvm_teardown_final
  fi
}

__rvm_teardown_final()
{
  __rvm_env_loaded=1
  unset __rvm_project_rvmrc_lock
  __rvm_teardown
}

__rvm_do_with_env_before()
{
  if [[ -n "${rvm_scripts_path:-}" || -n "${rvm_path:-}" ]]
  then
    # Load env - setup all required variables, __rvm_teardown is called on the end
    source "${rvm_scripts_path:-"$rvm_path/scripts"}/initialize"
    __rvm_setup
  fi
}

__rvm_do_with_env_after()
{
  __rvm_teardown
}

__rvm_do_with_env()
{
  \typeset result

  __rvm_do_with_env_before

  "$@"
  result=$?

  __rvm_do_with_env_after

  return ${result:-0}
}

__rvm_conditionally_do_with_env()
{
  if (( __rvm_env_loaded > 0 ))
  then
    "$@"
  else
    __rvm_do_with_env "$@"
  fi
}

__rvm_ensure_is_a_function()
{
  if [[ ${rvm_reload_flag:=0} == 1 ]] || ! is_a_function rvm
  then
    for script in functions/version functions/selector cd functions/cli cli override_gem
    do
      if [[ -f "$rvm_scripts_path/$script" ]]
      then
        source "$rvm_scripts_path/$script"
      else
        printf "%b" \
"WARNING:
        Could not source '$rvm_scripts_path/$script' as file does not exist.
        RVM will likely not work as expected.\n"
      fi
    done
  fi
}

__rvm_call_with_restored_umask()
{
  rvm_umask="$(umask)"

  if [[ -n "${rvm_stored_umask:-}" ]];
  then
    umask ${rvm_stored_umask}
  fi

  "$@"

  umask "${rvm_umask}"
  unset rvm_umask
}
src/rvm/scripts/functions/gemset000066400000032634147511530550013065 0ustar00#!/usr/bin/env bash

__rvm_current_gemset()
{
  # Fetch the current gemset via GEM_HOME
  \typeset current_gemset
  current_gemset="${GEM_HOME:-}"

  # We only care about the stuff to the right of the separator.
  current_gemset="${current_gemset##*${rvm_gemset_separator:-@}}"

  if [[ "${current_gemset}" == "${GEM_HOME:-}" ]] ; then
    echo ''
  else
    echo "${current_gemset}"
  fi
}

__rvm_using_gemset_globalcache()
{
  __rvm_db_ "$rvm_user_path/db" "use_gemset_globalcache" |
    __rvm_grep '^true$' >/dev/null 2>&1
  return $?
}

__rvm_remove_broken_symlinks()
{
  if [[ ! -e "$1" && -L "$1" ]]
  then __rvm_rm_rf "$1"
  fi
}

gemset_create()
{
  \typeset gem_home gemset gemsets prefix

  [[ -n "$rvm_ruby_string" ]] || __rvm_select

  prefix="${rvm_ruby_gem_home%%${rvm_gemset_separator:-"@"}*}"

  for gemset in "$@"
  do
    if
      [[ -z "$rvm_ruby_string" || "$rvm_ruby_string" == "system" ]]
    then
      rvm_error "Can not create gemset when using system ruby.  Try 'rvm use <some ruby>' first."
      return 1
    elif
      [[ "$gemset" == *"${rvm_gemset_separator:-"@"}"* ]]
    then
      rvm_error "Can not create gemset '$gemset', it contains a \"${rvm_gemset_separator:-"@"}\"."
      return 2
    elif
      [[ "$gemset" == *"${rvm_gemset_separator:-"@"}" ]]
    then
      rvm_error "Can not create gemset '$gemset', Missing name. "
      return 3
    fi

    gem_home="${prefix}${gemset:+${rvm_gemset_separator:-"@"}}${gemset}"
    __rvm_remove_broken_symlinks "$gem_home"
    [[ -d "$gem_home/bin" ]] || mkdir -p "$gem_home/bin"
    if
      [[ ! -d "$gem_home/bin" ]]
    then
      rvm_error "Can not create gemset '$gemset', permissions problem? "
      return 4
    fi

    : rvm_gems_cache_path:${rvm_gems_cache_path:=${rvm_gems_path:-"$rvm_path/gems"}/cache}
    # When the globalcache is enabled, we need to ensure we setup the cache directory correctly.
    if
      __rvm_using_gemset_globalcache
    then
      if [[ -d "$gem_home/cache" && ! -L "$gem_home/cache" ]]
      then \command \mv -n "$gem_home/cache"/*.gem "$rvm_gems_cache_path/" 2>/dev/null
      fi
      __rvm_rm_rf "$gem_home/cache"
      ln -fs "$rvm_gems_cache_path" "$gem_home/cache"
    else
      __rvm_remove_broken_symlinks "$gem_home/cache"
      mkdir -p "$gem_home/cache"
    fi

    rvm_log "$rvm_ruby_string - #gemset created $gem_home"
    if
      (( ${rvm_skip_gemsets_flag:-0} == 0 ))
    then
      __rvm_with "${rvm_ruby_string}${gemset:+@}${gemset}" gemset_initial ${gemset:-default}
    fi
  done

  if
    (( ${rvm_skip_gemsets_flag:-0} != 0 ))
  then
    rvm_log "Skipped importing default gemsets"
  fi
}

__rvm_parse_gems_args()
{
  \typeset gem="${*%%;*}"
  if
    __rvm_string_match "$gem" "*.gem$"
  then
    gem_name="$(basename "${gem/.gem/}" |  __rvm_awk -F'-' '{$NF=NULL;print}')"
    gem_version="$(basename "${gem/.gem/}" |  __rvm_awk -F'-' '{print $NF}' )"
  else
    gem_name="${gem/ */}"
    case "$gem" in
      *--version*)
        gem_version=$(
          echo "$gem" | __rvm_sed -e 's#.*--version[=]*[ ]*##' | __rvm_awk '{print $1}'
        )
        ;;
      *-v*)
        gem_version=$(
          echo "$gem" | __rvm_sed -e 's#.*-v[=]*[ ]*##' | __rvm_awk '{print $1}'
        )
        ;;
    esac
  fi
}

is_gem_installed()
{
  \typeset gem_spec
  gem_spec="gem '$gem_name'"
  if
    [[ -n "${gem_version}" ]]
  then
    gem_spec+=", '$gem_version'"
    version_check="${gem_version#*=}"
  else
    version_check="*([[:digit:]\.])"
  fi

  __rvm_ls -ld "${rvm_ruby_gem_home:-$GEM_HOME}/gems"/${gem_name}-${version_check} >/dev/null 2>&1 ||
  "${rvm_ruby_binary}" -rrubygems -e "$gem_spec" 2>/dev/null ||
  return $?
}

# Install a gem
gem_install()
{
  \typeset gem_name gem_version version_check

  gem_version="" # no version
  __rvm_parse_gems_args "$@"

  if [[ -z "${gem_version}" ]]
  then __rvm_db "gem_${gem_name}_version" "gem_version"
  fi

  if
    (( ${rvm_force_flag:-0} == 0 )) && is_gem_installed
  then
    rvm_log "gem ${gem_name} ${gem_version:-} is already installed"
    return 0
  else
    gem_install_force || return $?
  fi
  true # for OSX
}

gem_install_force()
{
  \typeset __available_gem
  \typeset -a install_params

  install_params=()
  __available_gem="$( __rvm_ls -v1 "${rvm_path}/gem-cache"/${gem_name}-${version_check}.gem 2>/dev/null | tail -n 1 )"

  if   [[ -n "${__available_gem}" ]]
  then install_params+=( --local )
  elif [[ -n "${gem_version}" ]]
  then install_params+=( -v "${gem_version}" )
  fi

  if __rvm_version_compare "$(\command \gem --version)" -ge 2.2
  then install_params+=( --no-document )
  else install_params+=( --no-ri --no-rdoc )
  fi

  for __gem_option in ${rvm_gem_options}
  do
    case "${__gem_option}" in
      (--no-ri|--no-rdoc|--no-document)
        # skip
        ;;
      (*)
        install_params+=( "${__gem_option}" )
        ;;
    esac
  done

  __rvm_log_command \
    "gem.install.${gem_name}${gem_version:+-}${gem_version:-}" \
    "installing gem ${__available_gem:-${gem_name}} ${install_params[*]}" \
    \command \gem install "${__available_gem:-${gem_name}}" "${install_params[@]}" ||
    return $?
}

__rvm_lines_without_comments()
{
  __rvm_remove_from_array lines "#*|+( )" "${lines[@]}"
}

__rvm_lines_without_gems()
{
  [[ -n "${rvm_without_gems}" ]] || return 0

  \typeset -a __gems_to_remove
  __gems_to_remove=()
  __rvm_custom_separated_array __gems_to_remove " " "${rvm_without_gems}"

  (( ${#__gems_to_remove[@]} )) || return 0

  \typeset __gem
  for __gem in "${__gems_to_remove[@]}"
  do  __rvm_remove_from_array lines "${__gem}|${__gem% *} *" "${lines[@]}"
  done
}

__rvm_lines_with_gems()
{
  \typeset -a __gems_to_add
  __gems_to_add=()
  case "${1}" in
    (global)  __rvm_custom_separated_array __gems_to_add " " "${rvm_with_gems:-}"         ;;
    (default) __rvm_custom_separated_array __gems_to_add " " "${rvm_with_default_gems:-}" ;;
    (*)       return 0 ;;
  esac

  (( ${#__gems_to_add[@]} )) || return 0

  \typeset __gem __version
  for __gem in "${__gems_to_add[@]}"
  do
    __version="${__gem#*=}"
    __gem="${__gem%%=*}"
    if [[ "${__gem}" == "${__version}" ]] # no version given
    then lines+=( "${__gem}" )
    else lines+=( "${__gem} -v ${__version}" )
    fi
  done
}

gemset_import_list()
{
  case "${rvm_ruby_string}" in
    (*jruby*)
      # jruby is very slow to install gems one by one, install everything in one call
      \command \gem install "$@"
      ;;
    (*)
      \typeset line
      for line
      do gem_install $line || rvm_error "there was an error installing gem $line"
      done
      ;;
  esac
}

gemset_import()
{
  \typeset __prefix rvm_file_name
  unset -f gem

  __rvm_select

  __prefix="$1"

  if
    [[ -n "${2:-}" ]]
  then
    rvm_file_name="${2%.gems*}.gems"
  else
    \typeset -a gem_file_names
    gem_file_names=( "${rvm_gemset_name}.gems" "default.gems" "system.gems" ".gems" )
    __rvm_find_first_file rvm_file_name "${gem_file_names[@]}" ||
    {
      rvm_error "No *.gems file found."
      return 1
    }
  fi

  [[ -d "$rvm_ruby_gem_home/specifications/" ]] || mkdir -p "$rvm_ruby_gem_home/specifications/"
  [[ -d "$rvm_gems_cache_path" ]] || mkdir -p "$rvm_gems_cache_path" # Ensure the base cache dir is initialized.

  \typeset -a lines
  lines=()
  if
    [[ -s "$rvm_file_name" ]]
  then
    __rvm_read_lines lines "${rvm_file_name}"
    __rvm_lines_without_comments
  fi
  rvm_debug "lines from ${rvm_file_name}: ${lines[*]}"
  if
    [[ -n "${3:-}" ]]
  then
    __rvm_lines_without_gems
    __rvm_lines_with_gems "${3}"
    rvm_debug "recalculated lines($3): ${lines[*]}"
  fi

  if
    (( ${#lines[@]} ))
  then
    __rvm_log_command "gemsets.import${3:+.}${3:-}" \
      "${__prefix} $rvm_file_name" \
      gemset_import_list "${lines[@]}"
  else
    rvm_log "${__prefix}file $rvm_file_name evaluated to empty gem list"
  fi
}

# Loads the default gemsets for the current interpreter and gemset.
gemset_initial()
{
  \typeset gemsets gemset _iterator paths _jruby_opts

  _jruby_opts=$JRUBY_OPTS
  export JRUBY_OPTS="${JRUBY_OPTS} --dev"

  true ${rvm_gemsets_path:="$rvm_path/gemsets"}

  [[ -d "$rvm_gems_path/${rvm_ruby_string}/cache" ]] ||
    mkdir -p "$rvm_gems_path/${rvm_ruby_string}/cache" 2>/dev/null

  __rvm_ensure_has_environment_files

  paths=( $( __rvm_ruby_string_paths_under "$rvm_gemsets_path" | sort -r ) )

  for _iterator in "${paths[@]}"
  do
    if
      [[ -f "${_iterator}/$1.gems" ]]
    then
      gemset_import "$rvm_ruby_string - #importing gemset" "${_iterator}/$1.gems" "$1"
      break # stop right here
    else
      rvm_debug "$rvm_ruby_string - #gemset definition does not exist ${_iterator}/$1.gems"
    fi
  done
  
  __rvm_log_command "gemset.wrappers.$1" \
    "$rvm_ruby_string - #generating ${1} wrappers" \
    run_gem_wrappers regenerate 2>/dev/null || true

   export JRUBY_OPTS=${_jruby_opts}
}

run_gem_wrappers()
{
  gem_install gem-wrappers >/dev/null &&
  gem_wrappers_pristine &&
    gem wrappers "$@" ||
    return $?
}

gem_wrappers_pristine()
{
  if [ "$(printf '%s\n' "3.2.0" "$(gem -v)" | sort -V | head -n1)" == "3.2.0" ]
  then gem pristine gem-wrappers --only-plugins > /dev/null
  fi
}

__rvm_rubygems_create_link()
{
  \typeset ruby_lib_gem_path

  \command \mkdir -p "$rvm_ruby_gem_home/bin"

  rubygems_detect_ruby_lib_gem_path "${1:-ruby}" || return 0

  if [[ -L "$ruby_lib_gem_path" && -w "$ruby_lib_gem_path" ]]
  then rm -rf "$ruby_lib_gem_path"
  fi

  if [[ -e "$rvm_ruby_global_gems_path" && ! -L "$rvm_ruby_global_gems_path" ]]
  then rm -rf "$rvm_ruby_global_gems_path"
  fi

  [[ -d "$ruby_lib_gem_path" ]] ||
    \command \mkdir -p "$ruby_lib_gem_path"

  if
    [[ -w "$ruby_lib_gem_path" ]]
  then
    [[ -L "$rvm_ruby_global_gems_path" ]] ||
      ln -fs "$ruby_lib_gem_path" "$rvm_ruby_global_gems_path"
  else
    [[ -d "$rvm_ruby_global_gems_path" ]] ||
      \command \mkdir -p "$rvm_ruby_global_gems_path"
  fi

  \command \mkdir -p "$rvm_ruby_global_gems_path/bin"
}

__rvm_set_executable()
{
  for __file
  do [[ -x "${__file}" ]] || chmod +x "${__file}"
  done
}

__rvm_initial_gemsets_create()
{
  __rvm_initial_gemsets_setup "$1" &&
  __rvm_initial_gemsets_create_gemsets
}

__rvm_initial_gemsets_setup()
{
  __rvm_log_command "chmod.bin" \
    "$rvm_ruby_string - #making binaries executable" \
    __rvm_set_executable "$rvm_ruby_home/bin"/* &&
  __rvm_rubygems_create_link "$1" &&
  (
    rvm_ruby_binary="${1:-$rvm_ruby_home/bin/ruby}" \
      rubygems_setup ${rvm_rubygems_version:-latest}
  ) # () for exit in rubygems_fatal_error
}

__rvm_initial_gemsets_create_without_rubygems()
{
  __rvm_rubygems_create_link "$1" &&
  __rvm_initial_gemsets_create_gemsets
}

__rvm_initial_gemsets_create_gemsets()
{
  gemset_create "global" &&
  __rvm_with "${rvm_ruby_string}@global" __rvm_remove_without_gems &&
  gemset_create ""
}

__rvm_remove_without_gems()
{
  [[ -n "${rvm_without_gems}" ]] || return 0

  \typeset -a __gems_to_remove __extra_flags
  __rvm_read_lines __gems_to_remove <(
    GEM_PATH="$GEM_HOME" __rvm_list_gems "" "${rvm_without_gems}"
  )

  (( ${#__gems_to_remove[@]} )) || return 0

  __extra_flags=()
  if __rvm_version_compare "$(\command \gem --version)" -ge 2.1.0
  then __extra_flags+=( --abort-on-dependent )
  fi

  \typeset __gem __name __version
  for __gem in "${__gems_to_remove[@]}"
  do
    __name="${__gem% *}"
    __version="${__gem##* }"

    __rvm_log_command "gem.uninstall.${__name}-${__version}" \
      "$rvm_ruby_string - #uninstalling gem ${__name}-${__version}" \
      \command \gem uninstall "${__name}" -v "${__version}" -x "${__extra_flags[@]}" || true
  done
}

gemset_reset_env()
(
  export rvm_internal_use_flag=1
  export rvm_use_flag=0
  __rvm_use "${1:-}"
  __rvm_ensure_has_environment_files &&
  run_gem_wrappers regenerate ||
    return $?
)

# Transform the list of gems one version per line
__rvm_list_gems()
{
  \typeset __checks __names
  __checks="${1:-}"
  shift || true
  __names="$*"

  if [[ -n "${__names}" ]]
  then __checks="%w{${__names}}.include?(gem.name)${__checks:+" && ( ${__checks} )"}"
  fi

  if [[ -n "${__checks}" ]]
  then __checks="if ${__checks}"
  fi

  rvm_debug "gem list check: ${__checks}"

  ruby -rrubygems -e "
    Gem::Specification.each{|gem|
      puts \"#{gem.name} #{gem.version}\" ${__checks}
    }
  " 2>/dev/null ||
  gem list $@ |
    __rvm_sed '/\*\*\*/ d ; /^$/ d; s/ (/,/; s/, /,/g; s/)//;' |
    __rvm_awk -F ',' '{for(i=2;i<=NF;i++) print $1" "$i }'
}

gemset_pristine()
{
  if
    (
      unset -f gem
      builtin command -v gem > /dev/null
    )
  then
    \typeset _gem _version _platforms
    \typeset -a _failed _pristine_command
    _failed=()
    _pristine_command=( \command \gem pristine )
    if __rvm_version_compare "$(\command \gem --version)" -ge 2.2.0
    then _pristine_command+=( --extensions )
    fi
    rvm_log "Restoring gems to pristine condition..."
    while
      read _gem _version _platforms
    do
      printf "%b" "${_gem}-${_version} "
      "${_pristine_command[@]}" "${_gem}" --version "${_version}" >/dev/null ||
        _failed+=(  "${_gem} --version ${_version}" )
    done <<<"$(
      GEM_PATH="$GEM_HOME" __rvm_list_gems \
        "${pristine_gems_filter:-"! gem.executables.empty? || ! gem.extensions.empty?"}"
    )"
    if
      (( ${#_failed[@]} > 0 ))
    then
      rvm_error "\n'${_pristine_command[*]} ${_failed[*]}' failed, you need to fix these gems manually."
      return 1
    else
      rvm_log "\nfinished."
    fi
  else
    rvm_error "'gem' command not found in PATH."
    return 1
  fi
}

__rvm_gemset_pristine()
{
  __rvm_log_command "gemset.pristine-$1" "Making gemset $1 pristine" \
    __rvm_with "$1" gemset_pristine
}
src/rvm/scripts/functions/db000077500000003575147511530550012173 0ustar00#!/usr/bin/env bash

# Query the rvm key-value database for a specific key
# allow system specific overrides + warnings / errors
__rvm_db_system()
{
  \typeset __key __message
  for __key in "${_system_name}_${_system_version}_$1" "${_system_name}_$1" "$1"
  do
    if __rvm_db "${__key}_error" __message
    then rvm_error "${__message}"
    fi
    if __rvm_db "${__key}_warn" __message
    then rvm_warn "${__message}"
    fi
    if __rvm_db "${__key}" "$2"
    then return 0
    fi
  done
  true # for OSX
}

# Query the rvm key-value database for a specific key
# Allow overrides from user specifications in $rvm_user_path/db
__rvm_db()
{
  \typeset value key variable
  key="${1:-}"
  variable="${2:-}"
  value=""

  if [[ -f "$rvm_user_path/db" ]]
  then value="$( __rvm_db_ "$rvm_user_path/db"   "$key" )"
  fi
  if [[ -z "$value" && -f "$rvm_path/config/db" ]]
  then value="$( __rvm_db_ "$rvm_path/config/db" "$key" )"
  fi
  [[ -n "$value" ]] || return 1
  if [[ -n "$variable" ]]
  then eval "$variable='$value'"
  else echo "$value"
  fi
  true # for OSX
}

__rvm_db_remove()
{
  if
    [[ -f "$1" ]]
  then
    __rvm_sed -e "\#^$2=# d"  -e '/^$/d' "$1" > "$1.new"
    \command \mv -f "$1.new" "$1"
  fi
}

__rvm_db_add()
{
  \typeset __dir="${1%/*}"
  if   [[ -f "${1}" ]]
  then __rvm_db_remove "${1}" "${2}"
  elif [[ ! -d "${__dir}" ]]
  then mkdir -p "${__dir}"
  fi
  printf "%b=%b\n" "$2" "$3" >> "$1"
}

__rvm_db_get()
{
  if [[ -f "$1" ]]
  then __rvm_sed -n -e "\#^$2=# { s#^$2=##;; p; }" -e '/^$/d' < "$1"
  else echo -n ""
  fi
}

__rvm_db_()
{
  \typeset __db __key __value
  __db="$1"
  __key="${2%%\?*}" # remove ?x=y from urls
  shift 2
  __value="$*"
  case "${__value}" in
    (unset|delete)
      __rvm_db_remove "${__db}" "${__key}"
      ;;
    ("")
      __rvm_db_get    "${__db}" "${__key}"
      ;;
    (*)
      __rvm_db_add    "${__db}" "${__key}" "${__value}"
      ;;
  esac
}
src/rvm/scripts/functions/implode000066400000004647147511530550013235 0ustar00#!/usr/bin/env bash

# Remove binaries.
__rvm_implode_binaries()
{
  # Load inside a subshell to avoid polutting the current shells env.
  (
    source "$rvm_scripts_path/base"

    rvm_log "Removing rvm-shipped binaries (rvm-prompt, rvm, rvm-sudo rvm-shell and rvm-auto-ruby)"
    for entry in "$rvm_bin_path/"{rvm-prompt,rvm,rvmsudo,rvm-shell,rvm-auto-ruby} ; do
      __rvm_rm_rf "$entry"
    done

    rvm_log "Removing rvm wrappers in $rvm_bin_path"
    __rvm_find "$rvm_bin_path" -type l | while read symlinked_rvm_file; do
      if [[ "$(__rvm_readlink "$symlinked_rvm_file")" == "$rvm_wrappers_path/"* ]]; then
        __rvm_rm_rf "$symlinked_rvm_file"
      fi
    done
    unset symlinked_rvm_file
  )
}

# Implode removes the entire rvm installation under $rvm_path, including removing wrappers.
__rvm_implode()
{
  if
    [[ ${rvm_force_flag:-0} -gt 0 ]] ||
    __rvm_ask_for "Are you SURE you wish for rvm to implode?\nThis will recursively remove $rvm_path and other rvm traces?" yes
  then
    if
      [[ "/" == "$rvm_path" ]]
    then
      rvm_error "remove '/' ?!... Ni!"
      return 1
    elif
      [[ -d "$rvm_path" ]]
    then
      __rvm_implode_binaries
      rvm_log "Hai! Removing $rvm_path"
      for file in /etc/profile.d/rvm.sh $rvm_man_path/man1/rvm.1* $rvm_path/
      do
        __rvm_rm_rf $file || rvm_error "Could not remove '$file', please try removing it manually."
      done

      if
        [[ -e $rvm_path ]]
      then
        rvm_warn "Failed to completely remove $rvm_path -- You will have to do so manually."
      else
        rvm_log "$rvm_path has been removed."
      fi

      if
        [[ "$rvm_path" == "/usr/local/rvm"* && -f "/usr/local/lib/rvm" ]]
      then
        rvm_log "Removing the rvm loader at /usr/local/lib/rvm"
        __rvm_rm_rf /usr/local/lib/rvm
      fi
      rvm_warn "
Note you may need to manually remove /etc/rvmrc and ~/.rvmrc if they exist still.
Please check all .bashrc .bash_profile .profile and .zshrc for RVM source lines and delete or comment out if this was a Per-User installation.
Also make sure to remove \`${rvm_group_name:-rvm}\` group if this was a system installation.
Finally it might help to relogin / restart if you want to have fresh environment (like for installing RVM again).
"
    else
      rvm_log "It appears that $rvm_path is already non existant."
    fi
  else
    rvm_log "Psychologist intervened, cancelling implosion, crisis avoided :)"
    return 2
  fi
}
src/rvm/scripts/functions/rubygems000077500000027473147511530550013446 0ustar00#!/usr/bin/env bash

rubygems_remove()
{
  \typeset rubygems_path __ruby entry

  rvm_log "Removing old Rubygems files..."

  case "$rvm_ruby_string" in
    (rbx-*)
      __ruby="['prefix']"
      ;;
    (*)
      __ruby=".values_at('sitelibdir','vendorlibdir').detect{ |path| File.directory?(File.join(path.to_s, 'rubygems')) }.to_s"
      ;;
  esac
  rubygems_path="$(${1:-ruby} -rrbconfig -e "puts ::Kernel.const_get('RbConfig')::CONFIG${ruby__}")"

  # Remove common files installed by ruby gems.
  entries=(
  "${rubygems_path}/ubygems.rb"
  "${rubygems_path}/gauntlet_rubygems.rb"
  "${rubygems_path}/rbconfig/"
  )
  for entry in "${entries[@]}" "${rubygems_path}/rubygems"*
  do
    __rvm_rm_rf "$entry"
  done
}

can_switch_rubygems()
{
  case "$rvm_ruby_string" in
    maglev*)
      return 1
      ;;
    *)
      return 0
      ;;
  esac
}

make_sure_jruby_can_work_with_rubygems()
{
  case "$rvm_ruby_string" in
    jruby-head*)
      true
      ;;
    jruby*)
      __rvm_version_compare "$rvm_ruby_version" -ge 1.7.1 || return 1
      ;;
    *)
      return 0 # do not care about other rubies
      ;;
  esac

  case "${rvm_rubygems_version}" in
    head|master)
      true
      ;;
    *)
      __rvm_version_compare "$rvm_rubygems_version" -ge 2.0.0 || return 1
      ;;
  esac
}

rubygems_fatal_error()
{
  rvm_error "$1"
  exit ${2:-1}
}

rubygems_version_list()
{
  __rvm_curl -sS https://rubygems.org/api/v1/versions/rubygems-update.json |
    __rvm_awk -v RS=',' -v FS='"' '$2=="number"{print $4}' |
    __rvm_version_sort |
    __rvm_grep '^[[:digit:]\.]*$'
}

rubygems_current_rubygems_version()
{
  "${rvm_ruby_binary}" -rrubygems -e 'puts(Gem::VERSION)' 2>/dev/null
}

rubygems_master_sha()
{
  __rvm_curl -s "https://api.github.com/repos/rubygems/rubygems/commits?page=last&per_page=1" |
    __rvm_sed -n '/^    "sha":/ {s/^.*".*": "\(.*\)".*$/\1/;p;}'
}

bundler_rubygems_master_sha()
{
  __rvm_curl -s "https://api.github.com/repos/rubygems/rubygems/contents/bundler" |
    __rvm_sed -n '/^  "sha":/ {s/^.*".*": "\(.*\)".*$/\1/;p;}'
}

rubygems_select_current()
{
  case "$version" in
    latest|current)
      version="$(__rvm_db "${rvm_ruby_string//-/_}_rubygems_version")"
      version="${version:-"$(__rvm_db "${rvm_ruby_interpreter}_${rvm_ruby_version}_rubygems_version")"}"
      if (( ${rvm_head_flag:-0} == 1 )) && [[ -z "${version:-}" ]]
      then version="$(__rvm_db "${rvm_ruby_interpreter}_head_rubygems_version")"
      fi
      version="${version:-"$(__rvm_db "${rvm_ruby_interpreter}_rubygems_version")"}"
      version="${version:-"$(__rvm_db "rubygems_version")"}"
      ;;
  esac
}

rubygems_select_latest()
{
  case "$version" in
    latest-*)
      version="${version#latest-}"
      version="$(rubygems_version_list | __rvm_grep "^${version}\." | __rvm_tail -n 1 )"
      version="${version}"
      ;;
  esac
}

rubygems_select_version_url()
{
  case "${version:-missing}" in
    ignore|none)
      rvm_rubygems_version="$version"
      ;;
    head|master)
      \typeset sha
      sha="$(rubygems_master_sha)"
      rvm_rubygems_version="$version"
      rvm_gem_package_name="rubygems-${sha}"
      rvm_gem_url="https://github.com/rubygems/rubygems/archive/${sha}.tar.gz"

      __bundler_sha="$(bundler_rubygems_master_sha)"
      __bundler_package_name="bundler-${__bundler_sha}"
      __bundler_url="https://github.com/bundler/bundler/archive/${__bundler_sha}.tar.gz"
      export rvm_verify_downloads_flag=1
      ;;
    v*)
      rvm_rubygems_version="$version"
      rvm_gem_package_name="rubygems-${version#v}"
      rvm_gem_url="https://github.com/rubygems/rubygems/archive/$version.tar.gz"
      export rvm_verify_downloads_flag=1
      ;;
    missing)
      rvm_error "There was an error while trying to resolve rubygems version for '$1'. \nHalting the installation."
      return 4
      ;;
    *)
      rvm_rubygems_version="$version"
      rvm_gem_package_name="rubygems-${rvm_rubygems_version}"
      rvm_rubygems_url=$(__rvm_db "rubygems_url")
      rvm_gem_url="${rvm_rubygems_url}/${rvm_gem_package_name}.tgz"
      ;;
  esac
}

rubygems_select_version()
{
  rubygems_select_current     "$1" &&
  rubygems_select_latest      "$1" &&
  rubygems_select_version_url "$1" ||
  return $?
}

__rvm_warn_on_rubyopt()
{
  if [[ -n "${RUBYOPT:-""}" ]]; then
    rvm_warn \
      "Please note: You have the RUBYOPT environment variable set and this \
            may interfere with normal rvm operations. We sugges unsetting it."
    return 1
  else
    return 0
  fi
}

rubygems_setup()
{
  export version="$1"
  \typeset __bundler_sha __bundler_package_name __bundler_url

  rvm_debug "rubygems_setup version:${version} rvm_ruby_string:${rvm_ruby_string} rvm_ruby_home:${rvm_ruby_home} rvm_ruby_binary:${rvm_ruby_binary}"

  case "${version:-missing}" in
    ignore|none)
      rvm_debug "Skipping installing rubygems."
      return 0
      ;;
  esac

  can_switch_rubygems ||
  rubygems_fatal_error "RVM can not install rubygems for maglev and older jruby, select other ruby and try again." $?

  __rvm_warn_on_rubyopt

  true ${rvm_ruby_selected_flag:=0}

  unset RUBYOPT

  (( rvm_ruby_selected_flag == 0 ))  || __rvm_select

  rubygems_select_version "$version" || return $?
  rvm_debug "rubygems_setup_rubygems version:${rvm_rubygems_version} rvm_gem_package_name:${rvm_gem_package_name} rvm_gem_url:${rvm_gem_url}"
  rvm_debug "rubygems_setup_bundler sha:${__bundler_sha} __bundler_package_name:${__bundler_package_name} __bundler_url:${__bundler_url}"

  if
    [[ "${rvm_force_flag:-0}" -eq 1 ]]
  then
    true # just let us continue with installation
  else
    \typeset __current_rubygems_version="$( rubygems_current_rubygems_version )"
    if
      __rvm_version_compare "${__current_rubygems_version}" -eq "$version"
    then
      rvm_log "Rubygems $version already available in installed ruby, skipping installation, use --force to reinstall."
      return 0
    elif
      __rvm_version_compare "${__current_rubygems_version}" -gt "$version"
    then
      rvm_log "Installed rubygems ${__current_rubygems_version} is newer than $version provided with installed ruby, skipping installation, use --force to force installation."
      return 0
    fi
  fi

  make_sure_jruby_can_work_with_rubygems ||
  rubygems_fatal_error "RVM can not install rubygems for older jruby, select other ruby and try again." $?

  # always cleanup!
  [[ -d "${rvm_src_path}/$rvm_gem_package_name" ]] ||
    __rvm_rm_rf "${rvm_src_path}/$rvm_gem_package_name"

  rvm_log "$rvm_ruby_string - #downloading $rvm_gem_package_name"
  "$rvm_scripts_path/fetch" "$rvm_gem_url" "${rvm_gem_package_name}.tgz" ||
  rubygems_fatal_error "There has been an error while trying to fetch rubygems. \nHalting the installation." $?

  if
    [[ -n "${__bundler_sha:-}" ]]
  then
    rvm_log "$rvm_ruby_string - #downloading $__bundler_package_name"
    "$rvm_scripts_path/fetch" "$__bundler_url" "${__bundler_package_name}.tgz" ||
    rubygems_fatal_error "There has been an error while trying to fetch bundler. \nHalting the installation." $?
  fi

  __rvm_log_command "rubygems.extract" "$rvm_ruby_string - #extracting $rvm_gem_package_name" \
  __rvm_package_extract "${rvm_archives_path}/$rvm_gem_package_name.tgz" "${rvm_src_path}" ||
  rubygems_fatal_error "There has been an error while trying to extract rubygems. \nHalting the installation." $?

  if
    [[ -n "${__bundler_sha:-}" ]]
  then
    __rvm_log_command "rubygems.bundler.extract" "$rvm_ruby_string - #extracting $__bundler_package_name" \
    __rvm_package_extract "${rvm_archives_path}/$__bundler_package_name.tgz" "${rvm_src_path}" "*/spec/*" ||
    rubygems_fatal_error "There has been an error while trying to extract bundler. \nHalting the installation." $?

    \rm -rf "${rvm_src_path}/$rvm_gem_package_name/bundler" &&
    ln -nfs "${rvm_src_path}/$__bundler_package_name/" "${rvm_src_path}/$rvm_gem_package_name/bundler" ||
    rubygems_fatal_error "There has been an error while linking bundler. \nHalting the installation." $?
  fi

  __rvm_log_command "rubygems.remove" "$rvm_ruby_string - #removing old rubygems" rubygems_remove "${rvm_ruby_binary}"

  __rvm_cd "${rvm_src_path}/$rvm_gem_package_name"

  \typeset -a __command
  __command=(
    GEM_HOME="$rvm_gems_path/${rvm_ruby_string}@global" GEM_PATH="" "${rvm_ruby_binary}" -d "${rvm_src_path}/$rvm_gem_package_name/setup.rb"
  )
  if [[ ${rvm_debug_flag:-0} == 1 || ${rvm_trace_flag:-0} == 1 ]]
  then __command+=( --verbose )
  fi
  if
    (( ${rvm_docs_flag:-0} == 0 ))
  then
    if __rvm_version_compare "$version" -ge 2.2
    then __command+=( --no-document )
    else __command+=( --no-ri --no-rdoc )
    fi
  fi
  __setup_lang_fallback
  __rvm_log_command "rubygems.install" \
    "$rvm_ruby_string - #installing $rvm_gem_package_name" \
    "${__command[@]}" ||
    return $?
  [[ -e "$rvm_ruby_home/bin/gem" ]] ||
  {
    \typeset program_suffix
    program_suffix="$( __rvm_ruby_config_get configure_args "${rvm_ruby_binary}" )"
    case "${program_suffix:-}" in
      (*--program-suffix=*)
        program_suffix="${program_suffix#*--program-suffix=}"
        program_suffix="${program_suffix%%[\' ]*}"
        __rvm_log_command "link.gem" "$rvm_ruby_string - #linking gem${program_suffix} -> gem" \
          ln -s "$rvm_ruby_home/bin/gem${program_suffix}" "$rvm_ruby_home/bin/gem"
        ;;
    esac
  }
  true # for osx
}

rubygems_validate_gemfile_extract()
(
  \command \mkdir -p "$2/gem" &&
  \command \tar -C "$2" -xf "$1" --touch &&
  \command \cd "$2" &&
  \command \gzip -d "metadata.gz" &&
  \command \tar -C gem -xzf "data.tar.gz" --touch &&
  \command \rm "data.tar.gz" ||
  {
    \typeset ret=$?
    rvm_error "Error extracting '$1' to '$2'."
    \command \rm -rf "${rvm_tmp_path}/rg$$"
    return $ret
  }
)

# Adapted from: https://gist.github.com/4678778
rubygems_validate_gemfile()
(
  gem_file="$1"
  downloaded_file="${gem_file##*/}"
  gem__url="${2:-https://d2chzxaqi4y7f8.cloudfront.net/gems/$downloaded_file}"
  dir_local_copy="${downloaded_file%.gem}--local"
  dir_remote_copy="${downloaded_file%.gem}-remote"

  mkdir -p "${rvm_tmp_path}/rg$$"
  cd "${rvm_tmp_path}/rg$$"

  __rvm_curl "$gem__url" -o "$downloaded_file" &&
  [[ -f "$downloaded_file" ]] ||
  {
    \typeset ret=$?
    rvm_error "Could not download '$gem__url'."
    \command \rm -rf "${rvm_tmp_path}/rg$$"
    return $ret
  }

  rubygems_validate_gemfile_extract "$gem_file"        "$dir_local_copy"  || return $?
  rubygems_validate_gemfile_extract "$downloaded_file" "$dir_remote_copy" || return $?

  # compare
  diff -ru "$dir_local_copy" "$dir_remote_copy"

  # cleanup
  \command \rm -rf "${rvm_tmp_path}/rg$$"
)

rubygems_validate_list_gemdirs()
{
  for gemdir in "$@"
  do
    __rvm_readlink_deep gemdir
    echo "${gemdir}"
  done | sort -u
}

# Adapted from: https://gist.github.com/4678189
rubygems_validate()
{
  __rvm_which openssl > /dev/null ||
    rubygems_fatal_error "'openssl' was not found, please install it."

  \typeset gemdir gemfile url gem loc rem log
  \typeset -a gemdirs

  rvm_log  "Validating RubyGems... This will take a while..."

  __rvm_read_lines gemdirs <(
    rubygems_validate_list_gemdirs "$@"
  )

  (( ${#gemdirs[@]} )) ||
  __rvm_read_lines gemdirs <(
    rubygems_validate_list_gemdirs "$rvm_gems_path"/*/cache
  )

  for gemdir in "${gemdirs[@]}"
  do
    for gem in "$gemdir"/*.gem
    do
      gemfile="${gem##*/}"
      url="https://d2chzxaqi4y7f8.cloudfront.net/gems/$gemfile"
      printf "%b" "${rvm_notify_clr}${gem}${rvm_reset_clr}"

      loc=$(openssl md5 $gem |cut -d" " -f2)
      rem=$(__rvm_curl -3 -s -D - -X HEAD -H 'Connection:close' "$url" | __rvm_grep 'ETag' | cut -d'"' -f2)

      [[ $loc == $rem ]] ||
      {
        printf "%b" " "
        log="${rvm_log_path}/$gemfile.diff"
        rubygems_validate_gemfile "$gem" "$url" > "$log"
        printf "%b" "${rvm_error_clr}mismatch, local: $loc, remote: $rem${rvm_reset_clr}, differences recorded in '$log'"
      }
      printf "%b" ", "
    done
  done

  rvm_log "\nDone verifying gems."
}
src/rvm/scripts/functions/manage/base_fetch000066400000030530147511530550015105 0ustar00#!/usr/bin/env bash

__rvm_git_clean_repo()
{
  \command \git checkout -f master
  \command \git reset --hard HEAD
  \command \rm -fr .git/rebase-apply
}

__rvm_fetch_ruby()
{
  \typeset _current_command

  if (( ${rvm_ruby_selected_flag:=0} == 0 ))
  then __rvm_select
  fi

  if
    (( ${rvm_head_flag:=0} == 0 )) &&
    [[ -z "${rvm_ruby_tag:-}" && -z "${rvm_ruby_revision:-}" && -z "${rvm_ruby_sha:-}"  && -z "${rvm_ruby_repo_tag:-}" ]]
  then
    __rvm_fetch_ruby_package || return $?
  elif [[ "${rvm_ruby_interpreter}" == "truffleruby" ]]; then
    # Always use __rvm_fetch_ruby_package() for TruffleRuby, building from the repository is not supported in RVM
    __rvm_fetch_ruby_package || return $?
  else
    \typeset result=0

    mkdir -p "${rvm_repos_path}/${rvm_ruby_interpreter}"
    true ${rvm_ruby_url:="$rvm_ruby_repo_url"}

    if
      echo "$rvm_ruby_url" | __rvm_grep 'git' >/dev/null 2>&1
    then
      __rvm_fetch_ruby_head_git || return $?
    else
      __rvm_fetch_ruby_head_svn || return $?
    fi

    rvm_log "Copying from repo to src path..."

    __rvm_rm_rf "${rvm_src_path}/$rvm_ruby_string"
    __rvm_cp -R "${rvm_repos_path}/${rvm_ruby_interpreter}" "${rvm_src_path}/$rvm_ruby_string"

    return ${result:-0}
  fi
}

__rvm_fetch_ruby_cleanup()
{
  if
    (( ${rvm_head_flag:=0} == 0 )) &&
    [[ -z "${rvm_ruby_tag:-}" && -z "${rvm_ruby_revision:-}" && -z "${rvm_ruby_sha:-}" && -z "${rvm_ruby_repo_tag:-}" ]]
  then
    true # nothing to cleanup
  else
    __rvm_rm_rf "${rvm_src_path}/$rvm_ruby_string"/.git
    __rvm_rm_rf "${rvm_src_path}/$rvm_ruby_string"/.svn
  fi
}

__rvm_fetch_ruby_package()
{
    rvm_ruby_package_name="${rvm_ruby_package_name:-"$rvm_ruby_string"}"
    rvm_ruby_package_file="${rvm_ruby_package_file:-"$rvm_ruby_package_name"}"

    case "$rvm_ruby_string" in
      (ruby-1.8.4*) rvm_archive_extension="${rvm_archive_extension:-tar.gz}"  ;;
      (ruby-*)      rvm_archive_extension="${rvm_archive_extension:-tar.bz2}" ;;
      (*)           rvm_archive_extension="${rvm_archive_extension:-tar.gz}"  ;;
    esac

    case "$rvm_ruby_interpreter" in
      (ruby)
        rvm_ruby_url="$(__rvm_db "${rvm_ruby_interpreter}_url")/${rvm_ruby_release_version}.${rvm_ruby_major_version}/$rvm_ruby_package_file.$rvm_archive_extension"
        ;;
      (ree)
        rvm_ruby_url="$(__rvm_db "${rvm_ruby_interpreter}_${rvm_ruby_version}_url")/${rvm_ruby_package_file}.${rvm_archive_extension}"
        ;;
      (jruby)
        rvm_error "Trying to compile jruby from binary package - this is a bug, please report to RVM."
        return 198
        ;;
      (maglev|rubinius|rbx|truffleruby)
        true # Should already be set from scripts/functions/selector_interpreters
        ;;
      (*)
        rvm_ruby_url="$(__rvm_db "${rvm_ruby_interpreter}_url")/${rvm_ruby_package_file}.${rvm_archive_extension}"
        ;;
    esac

    rvm_log "$rvm_ruby_string - #downloading ${rvm_ruby_package_file}, this may take a while depending on your connection..."
    "$rvm_scripts_path/fetch" "${rvm_ruby_url}" ||
      return $?

    # Remove the directory if it is empty -- empty how?
    [[ -d "${rvm_src_path}/$rvm_ruby_string" ]] && rmdir "${rvm_src_path}/$rvm_ruby_string" 2>/dev/null || true

    if
      [[ ! -d "${rvm_src_path}/$rvm_ruby_string" ]]
    then
      mkdir -p "${rvm_tmp_path:-/tmp}/rvm_src_$$"

      __rvm_log_command "extract" "$rvm_ruby_string - #extracting $rvm_ruby_package_file to ${rvm_src_path}/$rvm_ruby_string" \
        __rvm_package_extract "${rvm_archives_path}/$rvm_ruby_package_file.$rvm_archive_extension" "${rvm_tmp_path:-/tmp}/rvm_src_$$" ||
      case $? in
        199)
          rvm_error "\nUnrecognized archive format '$archive_format'"
          return 199
          ;;
        *)
          rvm_error "There has been an error while trying to extract the source. Halting the installation."
          return 1
          ;;
      esac

      __rvm_rm_rf "${rvm_src_path}/$rvm_ruby_string"

      \command \mv "$(
        __rvm_find ${rvm_tmp_path:-/tmp}/rvm_src_$$ -mindepth 1 -maxdepth 1 -type d
      )" "${rvm_src_path}/$rvm_ruby_string"

      __rvm_rm_rf "${rvm_tmp_path:-/tmp}/rvm_src_$$"

      if
        [[ -n "${rvm_ruby_name:-""}" && -d "${rvm_src_path}/$(echo $rvm_ruby_string | __rvm_sed -e 's/-n.*//')" ]]
      then
        \command \mv "${rvm_src_path}/$(echo "$rvm_ruby_string" | __rvm_sed -e 's/-n.*//')" "${rvm_src_path}/$rvm_ruby_string"
      fi
    else
      rvm_log "$rvm_ruby_string - #already extracted to ${rvm_src_path}/$rvm_ruby_string"
    fi

    true # for osx
}

__rvm_fetch_ruby_head_git()
{
      case "$rvm_ruby_interpreter" in
        ruby)
          # Determine Branch
          if [[ -z "${rvm_ruby_repo_branch:-}" ]]
          then
            if [[ -n "${rvm_ruby_major_version:-}" ]]
            then
              if
                [[ -n "${rvm_ruby_minor_version:-}" ]] &&
                __rvm_version_compare "${rvm_ruby_version}" -lt 2.1.0
              then
                rvm_ruby_repo_branch="ruby_${rvm_ruby_release_version:-1}_${rvm_ruby_major_version}_${rvm_ruby_minor_version}"
              else
                rvm_ruby_repo_branch="ruby_${rvm_ruby_release_version:-1}_${rvm_ruby_major_version}"
              fi
            else
              rvm_ruby_repo_branch="master" # NOTE: Ruby Core team maps 'master' as HEAD
            fi
          fi
          ;;

        *)
          rvm_ruby_repo_branch="${rvm_ruby_repo_branch:-"master"}"
          ;;

      esac

      # Clone if repository does not yet exist locally
      if
        [[ -d "${rvm_repos_path}/${rvm_ruby_interpreter}/.git" ]]
      then
        (
          __rvm_cd "${rvm_repos_path}/${rvm_ruby_interpreter}"
          \typeset current_url
          current_url="$(\command \git remote -v | __rvm_awk '$1=="origin" && $3=="(fetch)" {print $2}')"
          [[ "$current_url" == "$rvm_ruby_repo_url" ]] || \command \git remote set-url origin "$rvm_ruby_repo_url"
        )
      else
        __rvm_rm_rf "${rvm_repos_path}/${rvm_ruby_interpreter}"

        rvm_ruby_repo_http_url="${rvm_ruby_repo_url//git:/https:}"

        \typeset git_clone_options
        git_clone_options=()
        # do not use '--depth 1' be default, we need to allow getting different commits
        if [[ -n "${rvm_git_clone_depth:-}" ]]
        then git_clone_options+=( --depth ${rvm_git_clone_depth} )
        fi
        __rvm_log_command "git.clone.git" \
          "Cloning from $rvm_ruby_repo_url, this may take a while depending on your connection" \
          \command \git clone "${git_clone_options[@]}" "$rvm_ruby_repo_url"      "${rvm_repos_path}/${rvm_ruby_interpreter}" ||
        __rvm_log_command "git.clone.http" \
          "Cloning from $rvm_ruby_repo_http_url, this may take a while depending on your connection" \
          \command \git clone "${git_clone_options[@]}" "$rvm_ruby_repo_http_url" "${rvm_repos_path}/${rvm_ruby_interpreter}" ||
        return $?
      fi

      # Use the selected branch.
      (
        __rvm_cd "${rvm_repos_path}/${rvm_ruby_interpreter}"

        remote="${remote:-origin}"
        branch=$(\command \git symbolic-ref -q HEAD 2>/dev/null)
        branch=${branch##refs/heads/}
        tag=$(\command \git describe --tags 2>/dev/null)

        # Ensure we are in a good state.
        \command \git reset --hard HEAD
        # just in case fix the fetch for the remote, new git restricts it to master
        \command \git config "remote.${remote}.fetch" "+refs/heads/*:refs/remotes/${remote}/*"
        # Download the latest updates locally.
        \command \git fetch --tags "${remote}"
        if [[ -n "${rvm_ruby_repo_tag:-}" ]]
        then
          if [[ "$tag" != "${rvm_ruby_repo_tag}" ]]
          then
            \command \git checkout -f "${rvm_ruby_repo_tag}"
          fi
          \command \git pull "$remote" "${rvm_ruby_repo_tag}" # Bring local to latest
        fi ||
        {
          result=$?
          rvm_error "There has been an error while checking out tag ${rvm_ruby_repo_tag}.  \nHalting the installation."
          return $result
        }

        if
          [[ "$branch" == "${rvm_ruby_repo_branch}" ]]
        then
          \command \git pull "${remote}" "${rvm_ruby_repo_branch}"
        else
          case "$(git branch 2>/dev/null)" in
            (*[[:space:]]${rvm_ruby_repo_branch}*)
              # Not already on the desired branch, but it does exist locally.
              \command \git checkout -f "${rvm_ruby_repo_branch}" # Branch is local, checkout
              \command \git pull "$remote" "${rvm_ruby_repo_branch}" # Bring local to latest
              ;;
            (*)
              # Desired branch does not exist locally.
              \command \git checkout -f -b "${rvm_ruby_repo_branch}" -t "${remote}/${rvm_ruby_repo_branch}" ||
              {
                result=$?
                rvm_error "Branch $remote/$rvm_ruby_repo_branch not found."
                return $result
              }
              ;;
          esac
        fi ||
        {
          result=$?
          rvm_error "There has been an error while checking out branch ${rvm_ruby_repo_branch}.  \nHalting the installation."
          return $result
        }
        __rvm_fetch_from_git_revision_or_sha || return $?
      )
      true # for OSX
}

__rvm_fetch_from_git_revision_or_sha()
{
  \typeset result __from
  __from=""
  if   [[ -n "${rvm_ruby_tag:-}" ]]
  then __from="${rvm_ruby_tag#t}"
  elif [[ -n "$rvm_ruby_revision" ]]
  then __from="${rvm_ruby_revision}"
  elif [[ -n "${rvm_ruby_sha:-}" ]]
  then __from="${rvm_ruby_sha}"
  elif [[ -n "${rvm_ruby_repo_branch:-}" ]]
  then __from="${rvm_ruby_repo_branch}"
  elif [[ -n "${rvm_ruby_repo_tag:-}" ]]
  then __from="${rvm_ruby_repo_tag}"
  fi
  if
    [[ -n "$__from" ]]
  then
    if [[ "$__from" == "head" ]]
    then __from="master"
    fi
    rvm_log "git checkout $__from"
    \command \git checkout -f -q "$__from" ||
    {
      result=$?
      rvm_error "There has been an error while trying to checkout the source branch.\nHalting the installation."
      return $result
    }
  fi
}

__rvm_fetch_ruby_head_svn()
{
      if
        [[ -n "${rvm_ruby_tag:-""}" ]]
      then
        # TODO: Check if tag v is valid
        true "${rvm_ruby_url:="$rvm_ruby_repo_url/tags/$(echo "$rvm_ruby_tag" | __rvm_sed 's/^t//')"}"
      elif
        [[ -z "${rvm_ruby_version:-""}" && ${rvm_head_flag:-0} -eq 1 ]]
      then
        true "${rvm_ruby_url:="$rvm_ruby_repo_url/trunk"}"
      elif
        [[  "${rvm_ruby_major_version:-""}" == "9" ]]
      then
        if
          [[ -z "${rvm_ruby_minor_version:-""}" || "${rvm_ruby_minor_version:-""}" = 3 ]]
        then
          true "${rvm_ruby_url:="$rvm_ruby_repo_url/trunk"}"
        else
          true "${rvm_ruby_url:="$rvm_ruby_repo_url/branches/ruby_${rvm_ruby_release_version}_${rvm_ruby_major_version}_${rvm_ruby_minor_version}"}"
        fi
      elif
        [[ -z "${rvm_ruby_minor_version:-""}" ||
          "${rvm_ruby_major_version:-""}.${rvm_ruby_minor_version:-""}" = "8.8"
        ]]
      then
        true "${rvm_ruby_url:="$rvm_ruby_repo_url/branches/ruby_${rvm_ruby_release_version}_${rvm_ruby_major_version}"}"
      else
        "${rvm_ruby_url:="$rvm_ruby_repo_url/branches/ruby_${rvm_ruby_release_version}_${rvm_ruby_major_version}_${rvm_ruby_minor_version}"}"
      fi

      rvm_rev=""
      if
        [[ -n "${rvm_ruby_revision:-""}" ]]
      then
        rvm_rev="-$rvm_ruby_revision"
      fi
      (
        __rvm_cd "${rvm_repos_path}/${rvm_ruby_interpreter}"
        if
          [[ -d "${rvm_repos_path}/${rvm_ruby_interpreter}/.svn" ]]
        then
          rvm_log "Updating ruby from $rvm_ruby_url"
          __rvm_log_command "svn.switch" "Switch to $rvm_ruby_url" svn switch $rvm_ruby_url
          __rvm_log_command "svn.update" "Update svn" svn update

          if
            [[ -n "${rvm_rev:-""}" ]]
          then
            __rvm_log_command "svn.checkout" "Checking out revision ${rvm_rev/-r/-r } from $rvm_ruby_url" \
              svn update -q ${rvm_rev/-r/-r }
          fi
        else
          __rvm_rm_rf "${rvm_repos_path}/${rvm_ruby_interpreter}"
          __rvm_log_command "svn.checkout" "Downloading source from ${rvm_ruby_url}." \
            svn checkout -q ${rvm_rev/-r/-r } "$rvm_ruby_url" "${rvm_repos_path}/${rvm_ruby_interpreter}"
        fi
      )
      result=$?
      if (( result > 0 ))
      then
        rvm_error "There has been an error while trying to fetch / update the source.  \nHalting the installation."
        return $result
      fi
}
src/rvm/scripts/functions/manage/ree000077500000010331147511530550013575 0ustar00#!/usr/bin/env bash


ree_transform_configure_flags()
{
  \typeset flag
  \typeset -a new_flags
  new_flags=()
  for flag in "${rvm_configure_flags[@]}"
  do
    new_flags+=( -c "${flag}" )
  done
  rvm_configure_flags=( "${new_flags[@]}" )
}

ree_install()
{
  if
    [[ -n "$(echo "$rvm_ruby_version" | __rvm_awk '/^1\.8/{print}')" ]] && (( rvm_head_flag == 0 ))
  then
    ruby="ree-|ruby-1.8.|ruby-1.8.7-p|ruby-1.8.7-p374"
    __rvm_ensure_has_mri_ruby "$ruby" &&
    ruby="$(__rvm_mri_ruby "$ruby")"  ||
    return $?

    rvm_log "Installing Ruby Enterprise Edition from source to: $rvm_ruby_home"

    __rvm_cd "${rvm_src_path}"

    if
      [[ -d "${rvm_src_path}/$rvm_ruby_string" ]] &&
      [[ -x "${rvm_src_path}/$rvm_ruby_string/installer" ]]
    then
      rvm_log "It appears that the archive has already been extracted. Skipping extract (use reinstall to do fresh installation)."
    else
      rvm_log "$rvm_ruby_string - #fetching ($rvm_ruby_package_file)"
      if
        "$rvm_scripts_path/fetch" "$rvm_ruby_url"
      then
        true
      else
        result=$?
        rvm_error "There has been an error while trying to fetch the source. \nHalting the installation."
        return $result
      fi

      __rvm_log_command "extract" "$rvm_ruby_string - #extracting $rvm_ruby_package_file to ${rvm_src_path}/$rvm_ruby_string" \
        __rvm_package_extract "${rvm_archives_path}/$rvm_ruby_package_file.$rvm_archive_extension" "${rvm_src_path}/" ||
      case $? in
        199)
          rvm_error "\nUnrecognized archive format '$archive_format'"
          return 199
          ;;
        *)
          rvm_error "There has been an error while trying to extract the source. Halting the installation."
          return 1
          ;;
      esac

      __rvm_rm_rf "${rvm_src_path}/$rvm_ruby_string"
      \command \mv "${rvm_src_path}/$rvm_ruby_package_file" "${rvm_src_path}/$rvm_ruby_string"
    fi

    __rvm_cd "${rvm_src_path}/$rvm_ruby_string"

    __rvm_setup_compile_environment "${rvm_ruby_string}"

    #TODO: wait, what? Investigate line smell.
    mkdir -p "${rvm_ruby_home}/lib/ruby/gems/1.8/gems"

    ree_transform_configure_flags

    #TODO: are there any other versions then 1.8.6 || 1.8.7
    if
      [[ "Darwin" == "${_system_type}" ]] &&
      [[ "1.8.6" == "$rvm_ruby_version" || "1.8.7" == "$rvm_ruby_version" ]] &&
      [[ " ${rvm_ree_options[*]} " != *" --no-tcmalloc "* ]]
    then
      rvm_ree_options+=( --no-tcmalloc )
    fi

    __rvm_db "${rvm_ruby_interpreter}_configure_flags" "db_configure_flags"
    if [[ -n "${ZSH_VERSION:-}" ]]
    then rvm_configure_flags=( ${=db_configure_flags} "${rvm_configure_flags[@]}" )
    else rvm_configure_flags=( ${db_configure_flags}  "${rvm_configure_flags[@]}" )
    fi

    __rvm_apply_patches "${rvm_src_path}/$rvm_ruby_string/source"
    result=$?

    if (( result == 0 )) && [[ "${_system_arch}" == "x86_64" ]]
    then
      __rvm_apply_patches "${rvm_src_path}/$rvm_ruby_string" lib64
      result=$?
    fi
    __rvm_apply_patches "${rvm_src_path}/$rvm_ruby_string" ruby-binary-shebang

    if (( result > 0 ))
    then
      rvm_error "There has been an error while trying to apply patches to ree. \nHalting the installation."
      return $result
    fi

    __rvm_log_command "install" "$rvm_ruby_string - #installing" \
      __rvm_with "$ruby" env \
      "${rvm_configure_env[@]}" ./installer -a "$rvm_rubies_path/$rvm_ruby_string" "${rvm_ree_options[@]}" "${rvm_configure_flags[@]}" ||
      return $?

    [[ -x "$rvm_rubies_path/$rvm_ruby_string"/bin/ruby ]] ||
    {
      rvm_error "There has been an error while trying to run the ree installer - bin/ruby was not created,
check the log file: $( __rvm_ls -1t "${rvm_log_path}/${rvm_ruby_string:-}"/*_install.log | __rvm_tail -n 1 )"
      return 11
    }

    __rvm_initial_gemsets_create "$rvm_ruby_home/bin/ruby" &&
    __rvm_post_install
  else

    __rvm_db "${rvm_ruby_interpreter}_${rvm_ruby_version}_repo_url" "rvm_ruby_url"

    if [[ -z "$rvm_ruby_url" ]] ; then
      rvm_error "rvm does not know the rvm repo url for '${rvm_ruby_interpreter}_${rvm_ruby_version}'"
      result=1

    else
      rvm_ruby_repo_url="$rvm_ruby_url"
      __rvm_setup_compile_environment "${rvm_ruby_string}"
      __rvm_install_source $*
    fi
  fi
}
src/rvm/scripts/functions/manage/opal000066400000003121147511530550013751 0ustar00#!/usr/bin/env bash

opal_install()
{
  rvm_log "Running Opal prereqs checking script."

  __rvm_which node > /dev/null &&
  __rvm_which npm  > /dev/null ||
  {
    result=$?
    rvm_error "Prerequisite checks have failed - can not find 'node' and/or 'npm' commands.
Halting the installation."
    return $result
  }

  __rvm_log_command "prepare_directories" \
    "Preparing directories for opal" \
    opal_install_prepare_directories

  __rvm_cd "${rvm_ruby_home}"

  system="${_system_type}"
  arch="$(file "$( __rvm_which node)" )"
  arch="$(echo "${arch##* }" )"

  if
    node_binary="$(
      __rvm_which opal-node 2>/dev/null ||
      npm explore opal -- which bin/opal-node 2>/dev/null
    )"
  then
    rvm_log "Found opal-node at $node_binary"
  else
    __rvm_log_command "npm.install.opal" \
      "Installing opal-node globally" \
      npm install -g opal ||
      return $result

    node_binary="$(
      npm explore opal -- which bin/opal-node 2>/dev/null
    )"
  fi

  __rvm_log_command "install" \
    "Installing opal to $rvm_ruby_home" \
    opal_install_files
}

opal_install_prepare_directories()
{
  __rvm_rm_rf "$rvm_ruby_home" &&
  \command \mkdir -vp "${rvm_ruby_home}/bin/" &&
  \command \mkdir -vp "$rvm_ruby_gem_home/bin" &&
  \command \mkdir -vp "$rvm_ruby_global_gems_path/bin" ||
  return $?
}

opal_install_files()
{
  __rvm_cd "$rvm_ruby_home/bin/"

  ln -fs "$node_binary" "ruby"

  cat <<-FAKE_GEM > gem
#!/usr/bin/env bash

echo "OPAL FAKE GEM COMMAND: $@"
exit 127
FAKE_GEM

  chmod +x ruby gem

  cat <<-FAKE_CONFIG > "$rvm_ruby_home/config"
target_cpu=$arch
FAKE_CONFIG
}
src/rvm/scripts/functions/manage/topaz000077500000005045147511530550014165 0ustar00#!/usr/bin/env bash

topaz_install()
{
  __rvm_cd "${rvm_src_path}"

  if [[ "$rvm_ruby_string" != *head* ]]
  then
    case "${_system_type} ${_system_arch}" in
      "Linux x86_64")
        version="linux64"
        ;;
      "Linux i386")
        version="linux32"
        ;;
      "Darwin x86_64")
        version="osx64"
        ;;
      *)
        rvm_error "Topaz only provides binary packages for Linux i386 and x86_64 and Darwin x86_64. You try to build the HEAD version"
        ;;
    esac
    rvm_ruby_package_file="$(__rvm_curl "${rvm_ruby_url}" | __rvm_grep -Eo "topaz-${version}-[^.]+\.tar\.bz2" | \command \head -1)"
    rvm_ruby_url="${rvm_ruby_url}/${rvm_ruby_package_file}"

    __rvm_cd "${rvm_archives_path}"
    __rvm_curl -O "$rvm_ruby_url" &&
    __rvm_log_command "extract" \
      "${rvm_ruby_string} - #extracting ${rvm_ruby_package_file} to ${rvm_src_path}" \
      __rvm_package_extract \
      "${rvm_archives_path}/${rvm_ruby_package_file}" "${rvm_src_path}" ||
    case $? in
      199)
        rvm_error "\nUnrecognized archive format '$archive_format'"
        return 199
        ;;
      *)
        rvm_error "There has been an error while trying to extract the source. Halting the installation."
        return 1
        ;;
    esac

    \command \mv "${rvm_src_path}/topaz" "${rvm_src_path}/$rvm_ruby_string"
  else
    rvm_ruby_url="${rvm_ruby_repo_url}"
    __rvm_fetch_ruby || return $?

    __rvm_rm_rf pypy
    __rvm_rm_rf rply

    __rvm_curl -O https://bitbucket.org/pypy/pypy/get/default.tar.bz2
    \command \tar xf default.tar.bz2
    __rvm_rm_rf default.tar.bz2
    \command \mv pypy* pypy

    __rvm_curl -O https://github.com/alex/rply/archive/master.zip
    \command \unzip master.zip
    __rvm_rm_rf master.zip
    \command \mv rply* rply

    __rvm_cd "${rvm_src_path}/$rvm_ruby_string"

    _old_python_path="$PYTHONPATH"
    export PYTHONPATH="${rvm_src_path}/pypy:${rvm_src_path}/rply:${rvm_src_path}/$rvm_ruby_string"
    __rvm_log_command "python" \
    "Building topaz with JIT, this will take a (long) while." \
    /usr/bin/env python "${rvm_src_path}/pypy/rpython/translator/goal/translate.py" -Ojit "${rvm_src_path}/${rvm_ruby_string}/targettopaz.py"
    export PYTHONPATH="$_old_python_path"
  fi

  __rvm_rm_rf $rvm_ruby_home
  __rvm_log_command "install" \
    "Installing topaz to $rvm_ruby_home" \
    __rvm_cp -Rf "${rvm_src_path}/${rvm_ruby_string}" "${rvm_ruby_home}"

  __rvm_cd "$rvm_ruby_home/bin/"

  \command \ln -fs "topaz" "ruby"

  __rvm_initial_gemsets_create "$rvm_ruby_home/bin/ruby" &&
  __rvm_fetch_ruby_cleanup
}
src/rvm/scripts/functions/manage/jruby000066400000011010147511530550014145 0ustar00#!/usr/bin/env bash

jruby_install_build_nailgun()
{
  __rvm_cd "${rvm_src_path}/$rvm_ruby_string/tool/nailgun" &&
  case "$rvm_ruby_version" in
    1.2*|1.3*)
      true
      ;;
    *)
      env "${rvm_configure_env[@]}" ./configure --prefix=$rvm_ruby_home
      ;;
  esac &&
  __rvm_make "${rvm_make_flags[@]}"
}

jruby_install_ant()
{
  __rvm_log_command "ant.jar" "$rvm_ruby_string - #ant jar" __rvm_ant jar || return $?

  [[ -f "${rvm_src_path}/$rvm_ruby_string/bin/jruby" ]] ||
  {
    result=$?
    rvm_error "JRuby reported it was installed successfully, but RVM could not find proper installation,
please check why '${rvm_src_path}/$rvm_ruby_string/bin/jruby' was not created,
maybe here '$rvm_log_path/$rvm_ruby_string/ant.jar.log',
also make sure to report an error here 'https://github.com/jruby/jruby/issues'
about not returning non zero status in case of errors."
    return $result
  }

  if
    (( ${#rvm_configure_flags[@]} ))
  then
    __rvm_log_command "ant.jar.flags" "$rvm_ruby_string - #ant jar ${rvm_configure_flags[*]}" \
      __rvm_ant jar "${rvm_configure_flags[@]}" || return $?
  fi

  __rvm_log_command "ant.cext" "$rvm_ruby_string - #ant cext" __rvm_ant cext "${rvm_configure_flags[@]}" ||
  rvm_warn "cext is known to fail please report here: https://jira.codehaus.org/browse/JRUBY"

  __rvm_version_compare "$rvm_ruby_version" -ge "1.7.0" ||
  __rvm_log_command "nailgun" "$rvm_ruby_string - #nailgun" jruby_install_build_nailgun ||
  return $?
}

jruby_install_mvn_command()
{
  __rvm_log_command "$mvn_label" "$rvm_ruby_string - #$mvn_label" "${mvn_command[@]}" || return $?
}

jruby_install_mvn()
{
  \typeset -a mvn_command
  \typeset mvn_label
  mvn_command=( "${1:-mvn}" )
  mvn_label="{1:-mvn}"
  mvn_label="${mvn_command##*/}"

  jruby_install_mvn_command || return $?
  if
    (( ${#rvm_configure_flags[@]} ))
  then
    mvn_command+=( "${rvm_configure_flags[@]}" )
    mvn_label+="_flags"
    jruby_install_mvn_command || return $?
  fi
}

jruby_install_mvnw()
{
  jruby_install_mvn "${rvm_src_path}/$rvm_ruby_string/mvnw" || return $?
}

jruby_install_check_java()
{
  builtin command -v java > /dev/null ||
  {
    printf "%b" "java must be installed and in PATH for JRuby."
    return 1
  }
}

jruby_install_check_jruby_home()
{
  if
    [[ -n "$JRUBY_HOME" ]]
  then
    printf "%b" "You have environment variable JRUBY_HOME set, please unset it before installing/using JRuby."
    return 2
  fi
}

jruby_install_check_java_home()
{
  if
    [[ -z "${JAVA_HOME:-}" ]]
  then
    export JAVA_HOME="$(
      cd "${rvm_scripts_path}/extras/java_read_properties"
      java ReadProperties java.home
    )"
    if
      [[ -n "$JAVA_HOME" &&
        -x "$JAVA_HOME/../bin/javac" &&
        -f "$JAVA_HOME/../lib/tools.jar"
      ]]
    then
      rvm_debug "Detected JAVA_HOME=$JAVA_HOME has JDK level up"
      JAVA_HOME="${JAVA_HOME%/*}" # cd ..
    fi
    rvm_warn "\$JAVA_HOME was empty, setting up JAVA_HOME=$JAVA_HOME, if it fails try setting JAVA_HOME to something sane and try again."
  fi
}

jruby_install()
{
  __rvm_setup_compile_environment "${rvm_ruby_string}" || return $?

  jruby_install_check_java || return $?
  jruby_install_check_jruby_home || return $?
  jruby_install_check_java_home

  __rvm_cd "${rvm_src_path}"

  rvm_ruby_tag="${rvm_ruby_version}"
  __rvm_fetch_ruby || return $?

  __rvm_cd "${rvm_src_path}/$rvm_ruby_string"

  __rvm_apply_patches

  \typeset method
  method=$( jruby_installation_method  "${rvm_ruby_string}" "${rvm_ruby_version}" )  || return $?
  jruby_install_$method  || return $?

  __rvm_rm_rf "$rvm_ruby_home" && \command \mkdir -p "$rvm_ruby_home" &&
  __rvm_log_command "install" "$rvm_ruby_string - #installing to $rvm_ruby_home" \
    __rvm_cp -Rf "${rvm_src_path}/$rvm_ruby_string"/{bin,lib} "$rvm_ruby_home"/ || return $?

  case ${rvm_ruby_string} in
    jruby-head*|jruby-1.7.*)
      (
        __rvm_cd "$rvm_ruby_home/bin/"
        for binary in irb ruby gem
        do
          [[ -f "${binary}" ]] || ln -fs "j${binary}" "${binary}"
        done
      )
      ;;
    *)
      (
        __rvm_cd "$rvm_ruby_home/bin/"
        for binary in jirb jruby jgem
        do
          ln -fs "$binary" "${binary#j}"
        done
      )
      ;;
  esac

  chmod +x "$rvm_ruby_home/bin/jruby"
  __rvm_initial_gemsets_create "$rvm_ruby_home/bin/ruby"

  case ${rvm_ruby_string} in
    jruby-head*|jruby-1.7.*)
      binaries=()
      ;;
    *)
      binaries=(jrubyc jirb_swing jirb jgem rdoc ri spec autospec testrb ast generate_yaml_index.rb rake)
      ;;
  esac
  __rvm_post_install
  __rvm_fetch_ruby_cleanup
}
src/rvm/scripts/functions/manage/mruby000066400000004640147511530550014163 0ustar00#!/usr/bin/env bash

mruby_install()
{
  \typeset result temp_flags

  __rvm_check_for_bison # && Run like hell...
  if __rvm_check_for_bison
  then true
  else
    result=$?
    rvm_log "Bison required but not found. Halting."
    return $result
  fi

  __rvm_setup_compile_environment "${rvm_ruby_string}"

  true ${rvm_ruby_selected_flag:=0}

  \typeset directory db_configure_flags
  \typeset -a autoconf_flags

  (( rvm_ruby_selected_flag )) || __rvm_select

  rvm_log "Installing Ruby from source to: $rvm_ruby_home, this may take a while depending on your cpu(s)..."
  __rvm_cd "${rvm_src_path}"

  if __rvm_fetch_ruby
  then true
  else
    result=$?
    rvm_error "There has been an error fetching the ruby interpreter. Halting the installation."
    return $result
  fi

  if __rvm_cd "${rvm_src_path}/$rvm_ruby_string"
  then true
  else
    result=$?
    rvm_error "Source directory is missing.  \nDid the download or extraction fail?  \nHalting the installation."
    return $result
  fi

  if [[ -d "${rvm_path}/usr" ]]
  then
    __rvm_add_to_path prepend "${rvm_path}/usr/bin"
    builtin hash -r
  fi

  if __rvm_apply_patches
  then true
  else
    result="$?"
    rvm_error "There has been an error applying the specified patches. Halting the installation."
    return $result
  fi

  if __rvm_log_command "make" "$rvm_ruby_string - #compiling" ${rvm_ruby_make:-__rvm_make} "${rvm_make_flags[@]}"
  then true
  else
    result=$?
    rvm_error "There has been an error while running make. Halting the installation."
    return $result
  fi

  \command \mkdir -p "$rvm_ruby_home/"
  \command \mkdir -p "$rvm_ruby_gem_home/bin"
  \command \mkdir -p "$rvm_ruby_global_gems_path/bin"

  [[ -n "${rvm_ruby_make_install:-}" ]] || rvm_ruby_make_install=( __rvm_cp -Rf "${rvm_src_path}/$rvm_ruby_string"/{bin,mrblib,include} "$rvm_ruby_home/" )

  __rvm_log_command "install" "$rvm_ruby_string - #installing" "${rvm_ruby_make_install[@]}" ||
  {
    result=$?
    rvm_error "There has been an error while running make install. Halting the installation."
    return $result
  }

  \typeset __bin_file __target_file
  for __bin_file in "$rvm_ruby_home/bin"/m*
  do
    __bin_file="${__bin_file##*/}"
    __target_file="${__bin_file#m}"
    ln -s "${__bin_file}" "$rvm_ruby_home/bin/${__target_file}"
  done

  __rvm_ruby_config_save "$rvm_ruby_home/bin/ruby"
  __rvm_fetch_ruby_cleanup || return $?

  rvm_log "Install of $rvm_ruby_string - #complete "
}
src/rvm/scripts/functions/manage/maglev000066400000007311147511530550014276 0ustar00#!/usr/bin/env bash

maglev_install()
{
  __rvm_ensure_has_mri_ruby
  compatible_ruby="$(__rvm_mri_ruby)"

  rvm_log "Running MagLev prereqs checking script."

  "$rvm_scripts_path/maglev" ||
  {
    result=$?
    rvm_error "Prerequisite checks have failed. \nHalting the installation."
    return $result
  }

  __rvm_cd "${rvm_src_path}"

  if
    [[ ! -d "${rvm_src_path}/$rvm_ruby_string" ]] ||
    (( ${rvm_head_flag:=0} == 1 ))
  then
    __rvm_fetch_ruby ||
    {
      result=$?
      rvm_error "There has been an error while trying to fetch the source.  \nHalting the installation."
      exit $result
    }
  fi

  system="${_system_type}"
  arch="${_system_arch}"
  if [[ "${system}-${arch}" == "Darwin-x86_64" ]]
  then arch="i386"
  fi

  if
    (( ${rvm_head_flag:=0} == 1 ))
  then
    __rvm_cd "${rvm_src_path}/$rvm_ruby_string"

    rvm_gemstone_package_file="GemStone-$(__rvm_grep "^GEMSTONE" version.txt | cut -f2 -d-).${system}-${arch}"

    rvm_gemstone_url="$maglev_url/${rvm_gemstone_package_file}.${rvm_archive_extension}"
  fi

  rvm_log "Downloading the GemStone package, this may take a while depending on your connection..."

  "$rvm_scripts_path/fetch" "$rvm_gemstone_url" ||
  {
    result=$?
    rvm_error "There has been an error while trying to fetch the GemStone package.\nHalting the installation."
    return $result
  }

  __rvm_cd "${rvm_src_path}"

  if [[ -s "$rvm_ruby_package_file" ]]
  then \command \mv "$rvm_ruby_package_file" "${rvm_src_path}/$rvm_ruby_string"
  fi

  __rvm_cd "${rvm_src_path}/$rvm_ruby_string"

  if
    [[ -d "${rvm_src_path}/${rvm_gemstone_package_file}" ]]
  then
    __rvm_log_command "gemstone.fix_rights" \
      "Fixing gemstone rights" \
      chmod -R u+w "${rvm_src_path}/${rvm_gemstone_package_file}"
  else
    mkdir -p "${rvm_src_path}/${rvm_gemstone_package_file}"
  fi

  __rvm_log_command "extract" \
    "$rvm_ruby_string - #extracting $rvm_gemstone_package_file to ${rvm_src_path}" \
    __rvm_package_extract "${rvm_archives_path}/$rvm_gemstone_package_file.$rvm_archive_extension" "${rvm_src_path}" ||
  case $? in
    199)
      rvm_error "\nUnrecognized archive format '$archive_format'"
      return 199
      ;;
    *)
      rvm_error "There has been an error while trying to extract the source. Halting the installation."
      return 1
      ;;
  esac

  ln -fs "${rvm_src_path}/$rvm_gemstone_package_file" "gemstone"

  __rvm_rm_rf $rvm_ruby_home

  __rvm_log_command "install" \
    "Installing maglev to $rvm_ruby_home" \
    __rvm_cp -Rf "${rvm_src_path}/$rvm_ruby_string" "$rvm_ruby_home"

  (
    __rvm_cd "$rvm_ruby_home/bin/"

    for binary in maglev-irb maglev-ruby maglev-gem
    do
      ln -fs "$binary" "${binary#maglev-}"
    done
    unset binary
  )

  __rvm_cd "$rvm_ruby_home"

  if
    (( ${rvm_head_flag:=0} == 1 ))
  then
    \command \git submodule update --init
    "$rvm_ruby_home/bin/maglev" force-reload
  fi

  ln -fs maglev.demo.key-${system}-${arch} etc/maglev.demo.key

  __rvm_log_command "build:maglev" \
    "Bootstrapping a new image" \
    "$rvm_wrappers_path/$compatible_ruby/rake" "build:maglev"

  [[ -e ${rvm_ruby_home}/etc/conf.d/maglev.conf ]] ||
  __rvm_log_command "stone.create" \
    "Creating default 'maglev' repository." \
    "$rvm_wrappers_path/$compatible_ruby/rake" "stone:create[maglev]" >/dev/null 2>&1

  __rvm_log_command "rdoc" \
    "Generating maglev HTML documentation" \
    "$rvm_wrappers_path/$compatible_ruby/rake" rdoc >/dev/null 2>&1

  __rvm_log_command "stwrappers" \
    "Generating smalltalk FFI." \
    "$rvm_wrappers_path/$compatible_ruby/rake" stwrappers >/dev/null 2>&1

  unset compatible_ruby

  __rvm_initial_gemsets_create_without_rubygems "$rvm_ruby_home/bin/ruby" &&
  __rvm_irbrc &&
  __rvm_fetch_ruby_cleanup
}
src/rvm/scripts/functions/manage/ruby000066400000011111147511530550013775 0ustar00#!/usr/bin/env bash

ruby_install_baseruby_check()
{
  __rvm_ensure_has_mri_ruby || return $?
  \typeset compatible_baseruby
  if
    compatible_baseruby="$rvm_wrappers_path/$(__rvm_mri_ruby)/ruby" &&
    [[ -x "$compatible_baseruby" ]]
  then
    rvm_configure_flags+=( --with-baseruby="$compatible_baseruby" )
  else
    return $?
  fi
}

ruby_install()
{
  \typeset result temp_flags _iterator

  case ${rvm_ruby_string:-""} in
    ruby-1.8.*-head)
      __rvm_ensure_has_mri_ruby "ree-|ruby-1.8.|ruby-1.8.7-p|ruby-1.8.7-p374" || return $?
      ;;
    ruby-1.8.*)
      if (( ${rvm_head_flag:-0} == 1 ))
      then __rvm_ensure_has_mri_ruby "ree-|ruby-1.8.|ruby-1.8.7-p|ruby-1.8.7-p374" || return $?
      fi
      ;;
    ruby*-head)
      ruby_install_baseruby_check || return $?
      ;;
    ruby*)
      if (( ${rvm_head_flag:-0} == 1 ))
      then ruby_install_baseruby_check || return $?
      fi
      ;;
  esac

  # TODO: needed on some 1.9.3, confirm with http://bugs.ruby-lang.org/issues/6903
  if
    [[ " ${rvm_configure_flags[*]}" == *" --enable-load-relative"* ]]
  then
    case ${rvm_ruby_string} in
      ruby-1.9.3-p125|ruby-1.9.3-p286|ruby-1.9.3-p327|ruby-1.9.3-p362|ruby-1.9.3-p374|ruby-1.9.3-p385)
        rvm_patch_names+=( ruby-multilib )
        ;;
    esac
  fi

  (
    __rvm_setup_compile_environment "${rvm_ruby_string}" &&
    __rvm_install_source $* &&
    ruby_install_warn_clang
  ) || return $?

  ruby_install_warnings
}

ruby_install_warn_clang()
{
  if
    ! __ruby_clang_ok ${rvm_ruby_string} &&
    [[ -n "${initially_selected_compiler:-}" ]] &&
    __rvm_compiler_is_llvm "${initially_selected_compiler:-}"
  then
    rvm_warn "Ruby '${rvm_ruby_string}' was built using clang - but it's not (fully) supported, expect errors."
  fi
}

ruby_install_warnings()
{
  \typeset patches_count
  patches_count=$(
    rvm_ruby_string="${rvm_ruby_string}" lookup_patchset default | wc -l
  )

  \typeset _default _version _patch _memo _unmaintained_ruby _unmaintained_date
  _unmaintained_ruby=$(__rvm_db "ruby_unmaintained_version")
  _default=$(__rvm_db "default_ruby")
  _version=$(__rvm_db "${_default}_version")
  _patch=$(__rvm_db "${_default}_${_version}_patch_level")
  _version="${_default}-${_version}${_patch:+-}${_patch:-}"
  _memo="Please consider upgrading to ${_version} which will have all of the latest security patches."
  if
    (( ${rvm_head_flag:-0} == 0 )) &&
    [[ "$rvm_ruby_version" != "head" ]] &&
    __rvm_version_compare "$rvm_ruby_version" -le "${_unmaintained_ruby}"
  then
    _unmaintained_date=$(__rvm_db "ruby_unmaintained_date")
    if
      __rvm_version_compare "$rvm_ruby_version" -eq "${_unmaintained_ruby}" &&
      __rvm_version_compare "$(date +%F)" -lt "${_unmaintained_date}"
    then
      rvm_error "WARNING: Please be aware that you just installed a ruby that will finish normal maintenance on ${_unmaintained_date}, for a list of maintained rubies visit:

    http://bugs.ruby-lang.org/projects/ruby/wiki/ReleaseEngineering

${_memo}"
    else
      rvm_error "WARNING: Please be aware that you just installed a ruby that is no longer maintained (${_unmaintained_date}), for a list of maintained rubies visit:

    http://bugs.ruby-lang.org/projects/ruby/wiki/ReleaseEngineering

${_memo}"
    fi
  elif
    [[ "${rvm_ruby_string}" != *"${_version}"* ]] && (( patches_count > 0 ))
  then
    rvm_warn "Please be aware that you just installed a ruby that requires ${patches_count} patches just to be compiled on an up to date linux system.
This may have known and unaccounted for security vulnerabilities.
${_memo}"
  fi
  if (( ${rvm_docs_flag:-0} == 1 ))
  then rvm_log "Ruby was built with documentation, to read it try: ri String"
  else rvm_log "Ruby was built without documentation, to build it run: rvm docs generate-ri"
  fi
}

__rvm_post_configure_ruby()
{
  __rvm_post_configure_ruby_fix_athlon_sse2
  __rvm_post_configure_ruby_update_setup
}

__rvm_post_configure_ruby_fix_athlon_sse2()
{
  if
    [[ -f /proc/cpuinfo && -f Makefile ]] &&
    __rvm_grep "^XCFLAGS = .*-msse2" Makefile >/dev/null &&
    ! __rvm_grep "^flags.*sse2" /proc/cpuinfo
  then
    __rvm_sed_i Makefile -e '/^XCFLAGS =/s/-msse2//'
  fi
}

__rvm_post_configure_ruby_update_setup()
{
  \typeset option
  if
    (( ${rvm_static_flag:-0} == 1 )) && (( ${rvm_dynamic_extensions_flag:-0} == 0 ))
  then
    for option in 'option nodynamic' openssl psych zlib readline
    do
      __rvm_update_ext_setup ${option}
    done
  fi
}

__rvm_update_ext_setup()
{
  echo "extension setup: $1"
  if
    __rvm_grep "$1" ext/Setup >/dev/null
  then
    __rvm_sed_i ext/Setup -e "s/#$1/$1/"
  else
    echo "$1" >> ext/Setup
  fi
}
src/rvm/scripts/functions/manage/rubinius000066400000013144147511530550014664 0ustar00#!/usr/bin/env bash

source "$rvm_scripts_path/functions/osx-ssl-certs"

make_sure_its_enough_ram_for_rbx()
{
  \typeset rvm_rbx_required_ram
  rvm_rbx_required_ram_mb=500

  __rvm_compiler_is_llvm ||
    __rvm_is_enough_ram ${rvm_rbx_required_ram_mb} ||
      rvm_error "For rbx (Rubinius) more than ${rvm_rbx_required_ram_mb}MB of free RAM might be required."
}

rubinius_install_detect_required_ruby()
{
  export ruby

  case "${rvm_ruby_version}" in
    (2.0.0)
      case "${rvm_ruby_patch_level}" in
        (rc1) ruby="ruby-1.9" ;;
        (*)   ruby="ruby-2.2"   ;;
      esac
      ;;

    (2*)
      case "$rvm_ruby_repo_branch" in
        (1.8.7|1.9.3) ruby="ruby-1.9|ruby-2.2" ;;
        (*)           ruby="ruby-2.2"          ;;
      esac
      ;;

    (*)
      ruby="ruby-2.3.1"
      ;;
  esac

  __rvm_ensure_has_mri_ruby "$ruby" || {
      rvm_log "No $ruby found, cannot build rbx."
      return 1
  }

  ruby="$(__rvm_mri_ruby "$ruby")"
}

rubinius_install_ensure_gem()
{
  __rvm_which "$1" >/dev/null &&
  [[ -x "$rvm_wrappers_path/$ruby/$1" ]] ||
  __rvm_log_command "install.${2:-$1}" \
    "$ruby - #install gem ${2:-$1}" \
    gem_install ${2:-$1} &&
  __rvm_which "$1" >/dev/null &&
  [[ -x "$rvm_wrappers_path/$ruby/$1" ]] ||
  return $?
}

rubinius_install_regenerate_binstubs()
{
  gem_install executable-hooks &&
  gem regenerate_binstubs ||
  return $?
}

rubinius_install_ensure_wrappers()
{
  [[ -x "$rvm_wrappers_path/$ruby/ruby" && -x "$rvm_wrappers_path/$ruby/gem" ]] ||
    __rvm_log_command "gemset.wrappers.rubinius" "$ruby - #generating wrappers" \
    run_gem_wrappers regenerate ||
    return $?
  rubinius_install_ensure_gem rake || return $?
  rubinius_install_ensure_gem bundle bundler || return $?
  __rvm_log_command "regenerate_binstubs" \
    "$ruby - #regenerating binstubs" \
    rubinius_install_regenerate_binstubs ||
    return $?
}

rubinius_install_setup_ruby()
{
  if [[ ${rvm_ignore_gemsets_flag:-0} -eq 0 ]]
  then ruby="${ruby}@rubinius"
  fi
  __rvm_with "$ruby" rubinius_install_ensure_wrappers
  __rvm_osx_ssl_certs_ensure_for_ruby "$rvm_wrappers_path/$ruby/ruby"
}

rubinius_install()
{
  rubinius_install_detect_required_ruby || return $?

  make_sure_its_enough_ram_for_rbx

  \typeset rvm_configure_args
  \typeset -a rvm_ruby_configure
  unset CFLAGS LDFLAGS ARCHFLAGS # Important.
  unset GEM_HOME GEM_PATH MY_RUBY_HOME IRBRC RBXOPT
  export PATH
  rvm_ruby_make=""

  __rvm_setup_compile_environment "${rvm_ruby_string}" || return $?
  __rvm_remove_rvm_from_path
  __rvm_conditionally_add_bin_path

  rubinius_install_setup_ruby || return $?

  __rvm_fetch_ruby || return $?

  __rvm_cd "${rvm_src_path}/$rvm_ruby_string"

  chmod +x ./configure

  __rvm_apply_patches ||
  {
    result=$?
    rvm_error "There has been an error while trying to apply patches to rubinius.  \nHalting the installation."
    return $result
  }
  rvm_configure_flags=( --prefix="$rvm_ruby_home"  "${rvm_configure_flags[@]}" )

  __rvm_db "${rvm_ruby_interpreter}_configure_flags" "db_configure_flags"
  if [[ -n "${ZSH_VERSION:-}" ]]
  then rvm_configure_flags=( ${=db_configure_flags} "${rvm_configure_flags[@]}" )
  else rvm_configure_flags=( ${db_configure_flags}  "${rvm_configure_flags[@]}" )
  fi

  # Explicitly disabled
  (( ${rvm_llvm_flag:=1} )) || rvm_configure_flags+=( --disable-llvm )

  if
    [[ -f "Gemfile" ]]
  then
    __rvm_log_command "bundle" "$ruby - #bundle install" "$rvm_wrappers_path/$ruby/bundle" install ||
      return $?
  fi
  if
    [[ -f "$HOME/.gem/credentials" && -w "$HOME/.gem/credentials" ]]
  then
    chmod 600 "$HOME/.gem/credentials"
  fi
  __rvm_log_command "configure" "$rvm_ruby_string - #configuring" \
    env "${rvm_configure_env[@]}" $rvm_wrappers_path/$ruby/ruby ./configure "${rvm_configure_flags[@]}" ||
    return $?

  if [[ -n "${rvm_configure_args:-}" ]]
  then rvm_ruby_make="CONFIGURE_ARGS=${rvm_configure_args## } "
  fi

  __setup_lang_fallback
  __rvm_log_command rake "$rvm_ruby_string - #compiling" \
    "${rvm_ruby_make:-}$rvm_wrappers_path/$ruby/rake" install --trace ||
    return $?
  [[ -d "$rvm_ruby_home" && -f "$rvm_ruby_home/bin/rbx" ]] ||
  {
    result=$?
    rvm_error "Rubinius reported it was installed successfully, but RVM could not find proper installation,
please check why '$rvm_ruby_home/bin/rbx' was not created,
maybe here '$rvm_log_path/$rvm_ruby_string/rake.log',
also make sure to report an error here 'https://github.com/rubinius/rubinius/issues'
about not returning non zero status in case of errors."
    return $result
  }
  unset ruby

  # Symlink rubinius wrapper if not available
  [[ -f "$rvm_ruby_home/bin/ruby" ]] ||
    ln -fs "$rvm_ruby_home/bin/rbx" "$rvm_ruby_home/bin/ruby"

  # remove the rdoc link, the gem is not builtin
  if [[ -f "$rvm_ruby_home/bin/rdoc" ]]
  then rm -f "$rvm_ruby_home/bin/rdoc"
  fi

  case ${rvm_ruby_string} in
    rbx-head*|rubinius-head*|rbx-2.*|rubinius-2.*)
      binaries=()
      ;;
    *) # older rbx had issues
      # Install IRB Wrapper on Rubinius.
      file_name="$rvm_ruby_home/bin/irb"
      \command \rm -f "$file_name"
      printf "%b" '#!/usr/bin/env bash\n' > "$file_name"
      printf "%b" "exec '$rvm_ruby_home/bin/rbx' 'irb' \"\$@\"\n" >> "$file_name"
      [[ -x "$file_name" ]] || chmod +x "$file_name"

      # Install Gem Wrapper on Rubinius.
      file_name="$rvm_ruby_home/bin/gem"
      __rvm_cp -f "$rvm_ruby_home/lib/bin/gem.rb" "$file_name"
      __rvm_inject_ruby_shebang "$file_name"
      [[ -x "$file_name" ]] || chmod +x "$file_name"
      unset file_name
      binaries=(erb ri)
      ;;
  esac

  __rvm_initial_gemsets_create "$rvm_ruby_home/bin/ruby" &&
  __rvm_post_install &&
  __rvm_fetch_ruby_cleanup
}
src/rvm/scripts/functions/manage/base000066400000007300147511530550013733 0ustar00#!/usr/bin/env bash

source "$rvm_scripts_path/functions/manage/base_fetch"
source "$rvm_scripts_path/functions/manage/base_install"
source "$rvm_scripts_path/functions/manage/base_install_patches"
source "$rvm_scripts_path/functions/manage/base_remove"

__rvm_uninstall_ruby()
{
  __rvm_remove_ruby uninstall
}

__rvm_reinstall_ruby()
{
  export pristine_gems_filter="! gem.extensions.empty?"
  __rvm_remove_ruby reinstall &&
  __rvm_install_ruby "$@" &&
  __rvm_gemset_pristine_all "$rvm_ruby_string"
}

__rvm_gemset_pristine_all()
{
  if (( ${rvm_skip_pristine_flag:-0} ))
  then return 0
  fi
  case "$rvm_ruby_string" in
    (mruby*) return 0 ;;
  esac
  \typeset -a destination_gemsets
  \typeset destination_gemset
  __rvm_read_lines destination_gemsets <(
    __rvm_list_gemset_strings | __rvm_grep -E "^$1(@.*)?$"
  )
  for destination_gemset in "${destination_gemsets[@]}"
  do __rvm_gemset_pristine "$destination_gemset"
  done
}

__rvm_manage_rubies()
{
  \typeset manage_result bin_line current_ruby_string
  \typeset -a rubies
  rubies=()

  rvm_gemset_name=""
  rvm_ruby_selected_flag=0
  rvm_ruby_gem_home="${rvm_ruby_gem_home%%${rvm_gemset_separator:-"@"}*}"
  rvm_ruby_string="${rvm_ruby_string%%${rvm_gemset_separator:-"@"}*}"

  # Given list of ruby strings.
  if
    __rvm_string_match "${rubies_string:-}" "old:*"
  then
    \typeset _older_then
    _older_then=${rubies_string#old:}
    if
      [[ -z "${_older_then}" ]]
    then
      # minified https://github.com/mpapis/home_dotfiles/blob/master/bin/git-summary#L5-L50
      case "${_system_type}" in
        (Darwin) _older_then="$( __rvm_date -j -v6m           +%F )" ;;
        (*)      _older_then="$( __rvm_date --date="-6months" +%F )" ;;
      esac
    fi
    __rvm_read_lines rubies <(
      __rvm_cd "$rvm_rubies_path"
      # find on bsd does not have -not, we need to use \!
      __rvm_find . -maxdepth 1 -mindepth 1 -type d \! -newermt $_older_then 2>/dev/null | cut -c 3-
    )
    (( ${#rubies[*]} )) ||
    {
      rvm_warn "No rubies older then ${_older_then}."
      return 1
    }
    __rvm_ask_for "Are you SURE you wish to '$action' ${rubies[*]}?" yes || return $?
  elif
    [[ -n "${rubies_string:-}" && "${rubies_string}" != "all" ]]
  then
    if
      [[ "${rubies_string}" == *,* || -z "${rvm_ruby_string:-}" ]]
    then
      __rvm_custom_separated_array rubies , "${rubies_string}"
    else
      rubies=( "${rvm_ruby_string}" )
    fi
  elif
    [[ "$action" == "install" ]]
  then
    rvm_error 'Really? '"$action"', all? See "rvm list known" and limit the selection to something more sane please :)'
    return 1
  elif
    [[ -z "${rubies_string}" ]]
  then
    rvm_error 'Really? '"$action"', all? See "rvm list" and limit the selection to something more sane please :)'
    return 1
  else
    # explicit all && not install
    if
      (( ${rvm_force_flag:-0} == 0 )) &&
      [[ "$action" == "reinstall" || "$action" == "delete" || "$action" == "remove" || "$action" == "uninstall" ]]
    then
      __rvm_ask_for "Are you SURE you wish to '$action' all rubies?" yes || return $?
    fi
    __rvm_read_lines rubies <(
      __rvm_cd "$rvm_rubies_path"
      __rvm_find . -maxdepth 1 -mindepth 1 -type d 2>/dev/null | cut -c 3-
    )
  fi

  for rvm_ruby_string in "${rubies[@]}"
  do
    rvm_debug "${rvm_ruby_string} - $action"
    current_ruby_string="$rvm_ruby_string"
    if
      # in () so it does not mess with env. variables
      (
        rvm_hook="before_install"
        source "$rvm_scripts_path/hook"
        __rvm_${action}_ruby
      )
    then
      if [[ "$action" == "install" ]]
      then __rvm_record_install "$current_ruby_string"
      fi
    else
      : manage_result:${manage_result:=$?}
    fi
  done
  return "${manage_result:-0}"
}
src/rvm/scripts/functions/manage/ironruby000066400000010262147511530550014673 0ustar00#!/usr/bin/env bash

ironruby_install()
{
  rvm_error "WARNING! IronRuby is not anywhere around usable (with or without RVM),
there are multiple issues with it, here is an effort to improve/fix it:
    https://github.com/rvm/rvm/pull/1543"

  builtin command -v mono > /dev/null ||
  {
    printf "%b" "mono must be installed and in your path in order to install IronRuby."
    return 1
  }
  if
    (( ${rvm_head_flag:=0} == 1 ))
  then
    mono_version="$(mono -V | \command \head -n 1 | __rvm_grep -oE '[0-9]+\.[0-9]+\.[0-9]+' | \command \head -n 1 )"
    if
      [[ -n "${mono_version:-}" ]]
    then
      mono_major_ver="$(echo "$mono_version" | cut -d '.' -f1)"
      mono_minor_ver="$(echo "$mono_version" | cut -d '.' -f2)"
      if
        [[ $mono_major_ver -lt 2 ]] ||
        [[ $mono_major_ver -eq 2 && $mono_minor_ver -lt 6 ]]
      then
        printf "%b" "Mono 2.6 (or greater) must be installed and in your path in order to build IronRuby from the repository."
        printf "%b" "Version detected: ${mono_version}"
        return 1
      fi
    else
      printf "%b" "Cannot recognize mono version."
      return 1
    fi

    __rvm_ensure_has_mri_ruby

    __rvm_fetch_ruby || return $?

    __rvm_cd "${rvm_src_path}/$rvm_ruby_string"

    compatible_ruby="$(__rvm_mri_ruby)"

    "$rvm_wrappers_path/$compatible_ruby/gem" install pathname2 --no-rdoc --no-ri

    # MONO_LIB=/Library/Frameworks/Mono.framework/Versions/current/lib/
    rvm_ruby_make=( $rvm_wrappers_path/$compatible_ruby/rake MERLIN_ROOT="${rvm_src_path}/$rvm_ruby_string/Merlin/Main" compile mono=1 configuration=release --trace )

    __rvm_log_command rake "Building IronRuby..." "${rvm_ruby_make[@]}" || return $?

    __rvm_rm_rf "$rvm_ruby_home"/*

    mkdir -p "$rvm_ruby_home/bin" "$rvm_ruby_home/lib" "$rvm_ruby_home/Lib/ruby" "$rvm_ruby_home/Lib/IronRuby"

    __rvm_cp -r "${rvm_src_path}/$rvm_ruby_string/Merlin/Main/Bin/mono_release"/* "$rvm_ruby_home/bin/"
    __rvm_cp -r "${rvm_src_path}/$rvm_ruby_string/Merlin/Main/Languages/Ruby/Scripts/bin"/* "$rvm_ruby_home/bin/"
    __rvm_cp -r "${rvm_src_path}/$rvm_ruby_string/Merlin/External.LCA_RESTRICTED/Languages/Ruby/redist-libs/ruby"/* "$rvm_ruby_home/lib/ruby"
    __rvm_cp -r "${rvm_src_path}/$rvm_ruby_string/Merlin/Main/Languages/Ruby/Libs"/* "$rvm_ruby_home/lib/IronRuby"
  else
    rvm_log "Retrieving IronRuby"

    "$rvm_scripts_path/fetch" "$rvm_ruby_url" "$rvm_ruby_package_file" ||
    {
      result=$?
      rvm_error "There has been an error while trying to fetch the source. \nHalting the installation."
      exit $result
    }

    mkdir -p "${rvm_src_path}/$rvm_ruby_string" "$rvm_ruby_home"

    __rvm_log_command "extract" "$rvm_ruby_string - #extracting $rvm_ruby_package_file to ${rvm_src_path}/$rvm_ruby_string" \
      __rvm_package_extract "${rvm_archives_path}/${rvm_ruby_package_file}" "${rvm_src_path}/$rvm_ruby_string" ||
    case $? in
      199)
        rvm_error "\nUnrecognized archive format '$archive_format'"
        return 199
        ;;
      *)
        rvm_error "There has been an error while trying to extract the source. Halting the installation."
        return 1
        ;;
    esac

    for dir in bin Lib Silverlight
    do
      __rvm_cp -Rf "${rvm_src_path}/$rvm_ruby_string/$dir" "$rvm_ruby_home/$dir"
    done
  fi

  binaries=(gem irb rdoc rake ri ruby)

  for binary_name in "${binaries[@]}"
  do
    if
      [[ -s "$rvm_ruby_home/bin/$binary_name" ]]
    then
      \command \tr -d '\r' < "$rvm_ruby_home/bin/$binary_name" > "$rvm_ruby_home/bin/$binary_name.new" &&
      \command \mv -f "$rvm_ruby_home/bin/$binary_name.new" "$rvm_ruby_home/bin/$binary_name"
      chmod +x "$rvm_ruby_home/bin/$binary_name"
    fi
  done
  unset binaries

  if
    [[ -f "$rvm_ruby_home/bin/ir" ]]
  then
    __rvm_sed -e '1,1s=.*=#!'"/usr/bin/env bash=" "$rvm_ruby_home/bin/ir" | \command \tr -d '\r' > "$rvm_ruby_home/bin/ir.new" &&
    \command \mv -f "$rvm_ruby_home/bin/ir.new" "$rvm_ruby_home/bin/ir"
  else
    echo "mono \"$rvm_ruby_home/bin/ir\" \"\$@\"" > "$rvm_ruby_home/bin/ir"
  fi

  chmod +x "$rvm_ruby_home/bin/ir"

  ln -fs "$rvm_ruby_home/bin/ir" "$rvm_ruby_home/bin/ruby"

  __rvm_initial_gemsets_create "$rvm_ruby_home/bin/ruby"
  __rvm_fetch_ruby_cleanup
}
src/rvm/scripts/functions/manage/install/osx000066400000000565147511530550015306 0ustar00#!/usr/bin/env bash

__rvm_make_failed_osx()
{
  __rvm_make_failed_osx_avira
}

__rvm_make_failed_osx_avira()
{
  if ps ax | __rvm_grep -v grep | __rvm_grep Avira.app &> /dev/null
  then
    rvm_error "\nIt seems that Avira antivirus is running. It has been reported to cause failures on ruby compilation.
Disable it for the time of the installation and try again."
  fi
}
src/rvm/scripts/functions/manage/macruby000066400000012337147511530550014471 0ustar00#!/usr/bin/env bash

macruby_install_extract_pkg()
(
  set -x
  \typeset __source __target __temp1 __temp1_org __temp2 __result
  __source="$1"
  __target="$2"
  __temp1="$( TMPDIR="${rvm_tmp_path}" mktemp -d -t rvm-tmp1.XXXXXXXXX )"
  __temp2="$( TMPDIR="${rvm_tmp_path}" mktemp -d -t rvm-tmp2.XXXXXXXXX )"
  [[ -n "${__temp1}" && -d "${__temp1}" && -n "${__temp2}" && -d "${__temp2}" ]] || return $?
  __result=0
  __temp1_org="${__temp1}"
  __temp1+="/${rvm_ruby_package_name}" # required for the next command to run at all
  pkgutil --expand "${__source}" "${__temp1}" || __result=$?
  __temp1="$( __rvm_find "${__temp1}" -name Payload -type f )"
  [[ -n "${__temp1}" ]] &&
  tar xzf "${__temp1}" -C "${__temp2}" &&
  mkdir -p "${__target}/" &&
  mv -f "${__temp2}/Library/Frameworks/MacRuby.framework/Versions/Current"/* "${__target}/" ||
  __result=$?
  rm -rf "${__temp1}" "${__temp1_org}" "${__temp2}" || true
  return ${__result}
)

macruby_install_extract_zip()
{
  mkdir -p ${rvm_src_path}/$rvm_ruby_string &&
  unzip -o -j "${rvm_archives_path}/$rvm_ruby_package_file" \
    "MacRuby ${rvm_ruby_version}/MacRuby ${rvm_ruby_version}.pkg" \
    -d "${rvm_src_path}/$rvm_ruby_string"  &&
  \command \mv "${rvm_src_path}/$rvm_ruby_string/MacRuby ${rvm_ruby_version}.pkg" \
    "${rvm_src_path}/$rvm_ruby_string/$rvm_ruby_string.pkg" &&
  macruby_install_extract_pkg "${rvm_src_path}/$rvm_ruby_string/$rvm_ruby_string.pkg" "$rvm_ruby_home" ||
  return $?
}

macruby_install_wrapper()
{
  \command \cat <<RubyWrapper
#!/usr/bin/env bash

export DYLD_LIBRARY_PATH="$rvm_ruby_home/usr/lib\${DYLD_LIBRARY_PATH:+:}\${DYLD_LIBRARY_PATH:-}"
export RUBYOPT="\${RUBYOPT:-} $extra_rubyopt"
export GEM_HOME="\${GEM_HOME:-$rvm_ruby_gem_home}"
export GEM_PATH="\${GEM_PATH:-$rvm_ruby_gem_path}"
export MY_RUBY_HOME="$rvm_ruby_home"
export PATH="$rvm_ruby_gem_home/bin:$rvm_ruby_global_gems_path/bin:$rvm_ruby_home/bin:\$PATH"

exec "$rvm_ruby_home/usr/bin/mac$1" "\$@"
RubyWrapper
}

macruby_install_wrap_binaries_detect_rubyopt()
{
  \typeset __path
  extra_rubyopt=""
  for __path in $(
    DYLD_LIBRARY_PATH="$rvm_ruby_home/usr/lib" "$rvm_ruby_home/usr/bin/macruby" -e 'puts $LOAD_PATH'
  )
  do
    [[ "${__path}" == "." ]] ||
    extra_rubyopt+="-I$rvm_ruby_home/usr${__path#*/usr} "
  done
}

macruby_install_fix_shebang()
{
  case "$1" in
    (ruby) return 0 ;; # it's a binary, no fixing needed
  esac
  {
    echo "#!$rvm_ruby_home/usr/bin/macruby"
    __rvm_tail -n +2 "$rvm_ruby_home/usr/bin/mac$1"
  } > "$rvm_ruby_home/usr/bin/mac$1.new"
  mv -f "$rvm_ruby_home/usr/bin/mac$1.new" "$rvm_ruby_home/usr/bin/mac$1"
  chmod +x "$rvm_ruby_home/usr/bin/mac$1"
}

macruby_install_wrap_binary()
{
  binary_name="${binary_name#$rvm_ruby_home/usr/bin/mac}"
  file_name="$rvm_ruby_home/bin/$binary_name"

  if [[ -f "$file_name" ]]
  then \command \rm -f "$file_name"
  fi

  macruby_install_fix_shebang "$binary_name"
  macruby_install_wrapper "$binary_name" > "$file_name"

  [[ -x "$file_name" ]] || chmod +x $file_name
}

macruby_install_wrap_binaries()
{
  mkdir -p "$rvm_ruby_home/bin/" ||
  {
    rvm_error "Can not create binaries directory => $rvm_ruby_home/bin/"
    return 1
  }
  \typeset binary_name extra_rubyopt
  macruby_install_wrap_binaries_detect_rubyopt

  for binary_name in "$rvm_ruby_home/usr/bin"/mac*
  do
    macruby_install_wrap_binary
  done
}

macruby_install()
{
  [[ "Darwin" == "${_system_type}" ]] ||
  {
    rvm_error "MacRuby can only be installed on a Darwin OS."
    exit 1
  }

  if
    (( rvm_head_flag == 1 ))
  then
    rvm_error "macruby-head is temporarily disabled(broken), use macruby-nightly for now."
    return 1

    if (( ${rvm_llvm_flag:=0} == 1 ))
    then "$rvm_scripts_path/package" llvm install
    fi

    macruby_path="/usr/local/bin"
    # TODO: configure & make variables should be set here.
    rvm_ruby_configure=" true "
    rvm_ruby_make="rake"
    rvm_ruby_make_install="$rvm_bin_path/rvmsudo rake install"

    __rvm_db "${rvm_ruby_interpreter}_repo_url" "rvm_ruby_url"

    rvm_ruby_repo_url=$rvm_ruby_url

    __rvm_setup_compile_environment "${rvm_ruby_string}"

    __rvm_install_source $* ||
    {
      result=$?
      rvm_error "There has been an error while trying to install from source. \nHalting the installation."
      return $result
    }
  else
    macruby_path="/Library/Frameworks/MacRuby.framework/Versions/${rvm_ruby_version}/usr/bin"

    rvm_log "Retrieving MacRuby ${rvm_ruby_version} ..."
    "$rvm_scripts_path/fetch" "$rvm_ruby_url" ||
    {
      result=$?
      rvm_error "There has been an error while trying to fetch the source. Halting the installation."
      return $result
    }

    case "$rvm_ruby_package_file" in
      (*.zip)
        __rvm_log_command "install" "Installing package" \
          macruby_install_extract_zip ||
          return $?
        ;;
      (*.pkg)
        __rvm_log_command "install" "Installing package" \
          macruby_install_extract_pkg "${rvm_archives_path}/$rvm_ruby_package_file" "$rvm_ruby_home" ||
          return $?
        ;;
      (*)
        rvm_error "Do not know what to do with archive: ${rvm_archives_path}/$rvm_ruby_package_file"
        return 1
        ;;
    esac
  fi
  macruby_install_wrap_binaries
  __rvm_initial_gemsets_create "$rvm_ruby_home/bin/ruby"
  binaries=()
  __rvm_post_install
}
src/rvm/scripts/functions/manage/base_remove000066400000011254147511530550015313 0ustar00#!/usr/bin/env bash

source "$rvm_scripts_path/functions/alias"

__rvm_check_default()
{
  \typeset default_ruby_interpreter current_ruby_interpreter
  default_ruby_interpreter="$( alias_show default 2>/dev/null )"
  default_ruby_interpreter="${default_ruby_interpreter%%${rvm_gemset_separator:-"@"}*}"
  current_ruby_interpreter="${rvm_ruby_string%%${rvm_gemset_separator:-"@"}*}"
  if
    [[ -n "$current_ruby_interpreter" ]] &&
    [[ "$current_ruby_interpreter" == "$default_ruby_interpreter" ]]
  then
    __rvm_log_command 'default.restore' \
      "$rvm_ruby_string - #removing default ruby interpreter" \
      alias_delete default
  fi
}

__rvm_remove_ruby()
{
  case "${rvm_ruby_string:-}" in
    (*@*)
      rvm_error "'rvm remove' does not work with gemsets, use '--gems' to remove all gemsets or
'rvm ${rvm_ruby_string%@*} do rvm gemset delete ${rvm_ruby_string#*@}' to remove the '${rvm_ruby_string#*@}' gemset."
      return 1
      ;;
  esac
  rvm_fuzzy_flag=1
  (( ${rvm_ruby_selected_flag:=0} )) || __rvm_select
  [[ -n "${rvm_ruby_string:-}"    ]] ||
  {
    rvm_error "Cannot ${1:-remove} unknown package '$rvm_ruby_string'"
    return 1
  }

  \typeset __removed_counter=0
  __rvm_remove_install_record "$rvm_ruby_string"
  __rvm_remove_src_and_ruby      &&
  case "${1:-remove}" in
    (remove)
      __rvm_remove_gemsets       &&
      __rvm_remove_archives      &&
      __rvm_remove_aliases       &&
      __rvm_remove_wrappers      &&
      __rvm_remove_environments  &&
      __rvm_remove_binaries      &&
      __rvm_remove_ruby_done
      ;;
    (uninstall)
      __rvm_remove_gemsets_check &&
      __rvm_check_default        &&
      __rvm_remove_ruby_done
      ;;
    (reinstall)
      __rvm_remove_gemsets_check
      ;;
  esac
  unset rvm_remove_flag
}

__rvm_remove_ruby_done()
{
  (( __removed_counter )) || rvm_log "$rvm_ruby_string - #already gone"
}

__rvm_remove_src_and_ruby()
{
  \typeset _dir
  for _dir in "${rvm_src_path}" "${rvm_rubies_path}"
  do
    if
      [[ -d "${_dir}/$rvm_ruby_string" ]]
    then
      let __removed_counter+=1
      __rvm_log_command "remove.${_dir##*/}" \
        "$rvm_ruby_string - #removing ${_dir##*/}/$rvm_ruby_string" \
        __rvm_rm_rf "${_dir}/$rvm_ruby_string" ||
        return $?
    else
      rvm_debug "$rvm_ruby_string - #already removed ${_dir##*/}/$rvm_ruby_string"
    fi
  done

  if [[ -e "${rvm_bin_path}/$rvm_ruby_string" ]]
  then \command \rm -f "${rvm_bin_path}/$rvm_ruby_string"
  fi
}

__rvm_remove_gemsets_check()
{
  if (( ${rvm_gems_flag:=0} == 1 ))
  then __rvm_remove_gemsets || return $?
  fi
  true
}

__rvm_remove_path_list_remove()
{
  \typeset __item
  for __item
  do
    printf "Removing ${__item} - "
    __rvm_rm_rf "${__item}" && printf "ok\n" ||
    {
      \typeset __res=$?
      echo "failed\n"
      return ${__res}
    }
  done
}

__rvm_remove_path_list_filter()
{
  __list=()
  \typeset __item
  for __item
  do
    if [[ -e "${__item}" || -L "${__item}" ]]
    then __list+=( "${__item}" )
    fi
  done
}

__rvm_remove_path_list()
{
  \typeset -a __list
  \typeset __type_name="$1"
  shift
  __rvm_remove_path_list_filter "$@"
  if
    (( ${#__list[@]} ))
  then
    let __removed_counter+=1
    __rvm_log_command "remove_${__type_name}" \
      "$rvm_ruby_string - #removing ${__type_name}" \
      __rvm_remove_path_list_remove "${__list[@]}" ||
      return $?
  else
    rvm_debug "$rvm_ruby_string - #already removed ${__type_name}"
  fi
  true
}

__rvm_remove_gemsets()
{
  __rvm_remove_path_list gems "${rvm_gems_path:-"$rvm_path/gems"}/${rvm_ruby_string}"{,@*}
}

__rvm_remove_wrappers()
{
  __rvm_remove_path_list wrappers "$rvm_wrappers_path/$rvm_ruby_string"{,@*} "$rvm_bin_path"/*-"$rvm_ruby_string"
}

__rvm_remove_environments()
{
  __rvm_remove_path_list environments "$rvm_environments_path/$rvm_ruby_string"{,@*}
}

__rvm_remove_aliases()
{
  \typeset alias_name
  \typeset -a aliases

  __rvm_read_lines aliases <(
    __rvm_awk '/'$rvm_ruby_string'/{print}' "$rvm_path/config/alias" | __rvm_sed 's/=.*//'
  )
  if
    (( ${#aliases[@]} ))
  then
    let __removed_counter+=1
    rvm_log "$rvm_ruby_string - #removing aliases"
    for alias_name in "${aliases[@]}"
    do
      # Remove from alias key-value store
      "$rvm_scripts_path/alias" delete "$alias_name" >/dev/null 2>&1
    done
  else
    rvm_debug "$rvm_ruby_string - #already removed aliases"
  fi
}

__rvm_remove_archives()
{
  if (( ${rvm_archive_flag:=0} == 1 ))
  then __rvm_remove_path_list archives "${rvm_archives_path}/${rvm_ruby_package_file:-$rvm_ruby_string}".*
  fi
}

# Iterate over all binaries and check for symlinked wrappers etc.
__rvm_remove_binaries()
{
  __rvm_remove_path_list binaries "${rvm_bin_path:-$rvm_path/bin}"/*"$rvm_ruby_string"{,@*}
}
src/rvm/scripts/functions/manage/base_install_patches000066400000010146147511530550017172 0ustar00#!/usr/bin/env bash

# Emits a number of patches to STDOUT, each on a new line
# Expands patchsets etc.
#TODO: Lookup default patches on rvm_ruby_string heirarchy.
__rvm_current_patch_names()
{
  \typeset -a expanded_names patches_to_check
  \typeset _variable patch_level_separator level name expanded_name
  _variable="${1:-}"
  # Need variable for ${x%...}
  patch_level_separator="%"

  if (( ${#rvm_patch_names[@]} ))
  then patches_to_check=( "${rvm_patch_names[@]}" )
  else patches_to_check=( optional )
  fi
  patches_to_check+=( default ${_system_name_lowercase} )

  for name in "${patches_to_check[@]}"
  do
    [[ -n "${name:-}" ]] || continue

    if __rvm_string_match "${name}" "*${patch_level_separator}*"
    then level="${name##*${patch_level_separator}}"
    else level=1
    fi

    name="${name%${patch_level_separator}*}"
    __rvm_read_lines expanded_names <( __rvm_expand_patch_name "$name" "$level" )

    rvm_debug "Patch name '$name', expanded_name(s) '${expanded_names[*]}'."

    for expanded_name in "${expanded_names[@]}"
    do
      [[ -z "${expanded_name}" ]] || eval "${_variable}+=( \"\${expanded_name}\" )"
    done
  done
}

__rvm_apply_patches()
{
  \typeset patch_name patch_level_separator patch_fuzziness patch_level source_directory full_patch_path _save_dir
  \typeset -a patches
  patches=()
  patch_level_separator="%"
  patch_fuzziness="25" # max fuziness that makes sense is 3 (or there are patches with bigger context ?)
  result=0
  source_directory="${1:-"${rvm_src_path}/$rvm_ruby_string"}"
  (( $# == 0 )) || shift

  _save_dir="$PWD"
  __rvm_cd "$source_directory"
  case "${1:-all}" in
    (all) __rvm_current_patch_names patches ;;
    (*) patches=( "$@" ) ;;
  esac
  rvm_debug "All found patches(${#patches[*]}): ${patches[*]}."

  if
    [[ -n "${rvm_ruby_name:-${detected_rvm_ruby_name:-}}" ]] &&
    [[ "${rvm_configure_flags[*]}${patches[*]}" == "" ]]
  then
    rvm_error "\
Warning: Installing named ruby without patches, you might need to consider adding extra flags/patches like:
    --patch falcon
    --patch railsexpress
    --patch float_warnings
Options starting: '--with*' '--disable*' '--enable*' are passed to rubys './configure', also anything after '--'."
  fi

  for patch_name in "${patches[@]}"
  do
    if __rvm_string_match "${patch_name}" "*${patch_level_separator}*"
    then patch_level="${patch_name##*${patch_level_separator}}"
    else patch_level=1
    fi
    patch_name="${patch_name%${patch_level_separator}*}"

    full_patch_path="$(__rvm_lookup_full_patch_path "$patch_name")"
    rvm_debug "Patch full path '$full_patch_path'."
    if
      [[ -z "${full_patch_path:-}" ]]
    then
      rvm_warn "Patch '$patch_name' not found."
      result=1
    elif
      ! __rvm_apply_patch "${patch_name}" "$full_patch_path" "$patch_fuzziness" "$patch_level"
    then
      result=1
    fi
  done
  __rvm_cd "${_save_dir}"
  return ${result:-0}
}

__rvm_apply_patch_prepare()
{
  if
    __rvm_string_match "${_full_patch_path}" "http://*" "https://*"
  then
    _local_patch_path="$(
      mktemp ${TMPDIR:-/tmp}/tmp.XXXXXXXXXXXXXXXXXX
    )"
    rvm_log "Fetching patch ${_full_patch_path}"
    __rvm_curl --create-dirs -sS -C - -o "${_local_patch_path}" "${_full_patch_path}"
  else
    _local_patch_path="${_full_patch_path}"
  fi
}

__rvm_apply_patch_remove()
{
  if
    __rvm_string_match "${_full_patch_path}" "http://*" "https://*"
  then
    \command \rm -f "${_local_patch_path}"
  fi
}

__rvm_apply_patch()
{
  \typeset _patch_name _full_patch_path _local_patch_path _patch_fuzziness _patch_level
  _patch_name="$1"
  _full_patch_path="$2"
  _patch_fuzziness="$3"
  _patch_level="$4"

  if
    [[ -r "patches.list" ]] &&
    __rvm_grep "${_patch_name}" "patches.list" >/dev/null
  then
    rvm_warn "Patch ${_patch_name} was already applied."
  else
    __rvm_apply_patch_prepare
    touch "patches.list"
    __rvm_log_command "patch.apply.${_patch_name##*\/}" "$rvm_ruby_string - #applying patch ${_full_patch_path}" \
      __rvm_patch -F ${_patch_fuzziness} -p${_patch_level} -N -f -i "${_local_patch_path}" &&
    printf "%b" "${_patch_name}\n" >> "patches.list"
    __rvm_apply_patch_remove
  fi
}
src/rvm/scripts/functions/manage/truffleruby000066400000002166147511530550015377 0ustar00#!/usr/bin/env bash

truffleruby_post_install_hook()
{
  # Run the TruffleRuby post-install hook
  __rvm_log_command "cext" "${rvm_ruby_string} - #compiling c-extensions" \
    "$1/lib/truffle/post_install_hook.sh"
}

truffleruby_install()
{
  __rvm_setup_compile_environment "${rvm_ruby_string}" || return $?

  __rvm_cd "${rvm_src_path}"

  __rvm_fetch_ruby || return $?

  __rvm_cd "${rvm_src_path}/${rvm_ruby_string}"

  __rvm_apply_patches

  __rvm_rm_rf "${rvm_ruby_home}" && \command \mkdir -p "$(dirname "${rvm_ruby_home}")" &&
  __rvm_log_command "install" "${rvm_ruby_string} - #installing to ${rvm_ruby_home}" \
    __rvm_cp -Rf "${rvm_src_path}/${rvm_ruby_string}" "${rvm_ruby_home}" || return $?

  __rvm_cd "${rvm_ruby_home}"

  truffleruby_post_install_hook "${rvm_ruby_home}"

  # Avoid updating RubyGems for now as it seems fragile
  rvm_rubygems_version="ignore"
  __rvm_initial_gemsets_create "$rvm_ruby_home/bin/ruby"

  __rvm_post_install

  __rvm_fetch_ruby_cleanup

  rvm_log "RVM gem rubygems-bundler is not installed by default for TruffleRuby."
  rvm_log "Use 'bundle exec' instead when needed. See rvm/rvm#4765."
}
src/rvm/scripts/functions/manage/base_install000066400000035113147511530550015464 0ustar00#!/usr/bin/env bash

__rvm_install_source()
{
  __rvm_require "$rvm_scripts_path/functions/manage/install/$_system_name_lowercase"

  true ${rvm_ruby_selected_flag:=0}

  \typeset directory db_configure_flags
  \typeset -a autoconf_flags

  (( rvm_ruby_selected_flag )) || __rvm_select

  if [[ -n "${DYLD_LIBRARY_PATH:-}" ]]
  then rvm_error "Warning: DYLD_LIBRARY_PATH environment variable is set, this might interact with the compilation and ruby."
  fi

  rvm_log "Installing Ruby from source to: $rvm_ruby_home, this may take a while depending on your cpu(s)..."
  __rvm_cd "${rvm_src_path}"

  __rvm_fetch_ruby ||
  {
    result=$?
    rvm_error "There has been an error fetching the ruby interpreter. Halting the installation."
    return $result
  }

  __rvm_cd "${rvm_src_path}/$rvm_ruby_string" ||
  {
    result=$?
    rvm_error "Source directory is missing.  \nDid the download or extraction fail?  \nHalting the installation."
    return $result
  }

  if
    [[ -d "${rvm_path}/usr" ]]
  then
    __rvm_add_to_path prepend "${rvm_path}/usr/bin"
    builtin hash -r
  fi

  __rvm_apply_patches ||
  {
    result="$?"
    rvm_error "There has been an error applying the specified patches. Halting the installation."
    return $result
  }

  if
    (( ${rvm_force_autoconf_flag:-0} == 1 )) || {
      [[ -z "${rvm_ruby_configure:-}" ]] &&
      [[ ! -s "${rvm_src_path}/$rvm_ruby_string/configure" ||
        "${rvm_src_path}/$rvm_ruby_string/configure.in" -nt "${rvm_src_path}/$rvm_ruby_string/configure"
      ]]
    }
  then
    (( ${rvm_force_autoconf_flag:-0} == 1 )) &&
      autoconf_flags+=( -f )
    __rvm_log_command "autoreconf" "$rvm_ruby_string - #autoreconf${autoconf_flags:-}" __rvm_autoreconf "${autoconf_flags[@]}"
  fi

  if
    [[ -n "${rvm_ruby_configure:-""}" ]]
  then
    __rvm_log_command "configure" "$rvm_ruby_string - #configuring" "$rvm_ruby_configure" ||
    {
      result=$?
      rvm_error "There has been an error while configuring. Halting the installation."
      return $result
    }
  elif
    [[ -s ./configure ]]
  then
    rvm_configure_flags=( --prefix="$rvm_ruby_home"  "${rvm_configure_flags[@]}" )

    __rvm_db "${rvm_ruby_interpreter}_configure_flags" db_configure_flags
    if [[ -n "${ZSH_VERSION:-}" ]]
    then rvm_configure_flags=( ${=db_configure_flags} "${rvm_configure_flags[@]}" )
    else rvm_configure_flags=( ${db_configure_flags}  "${rvm_configure_flags[@]}" )
    fi
    __rvm_array_prepend_or_ignore rvm_configure_env   CFLAGS= " " "-O3" "-O"
    __rvm_array_prepend_or_ignore rvm_configure_env  CCFLAGS= " " "-O3" "-O"
    __rvm_array_prepend_or_ignore rvm_configure_env CXXFLAGS= " " "-O3" "-O"
    __rvm_log_command "configure" "$rvm_ruby_string - #configuring" \
      "${rvm_configure_env[@]}" ./configure "${rvm_configure_flags[@]}" ||
    {
      result=$?
      rvm_error "There has been an error while running configure. Halting the installation."
      if [[ -f config.log ]]
      then cp config.log "${rvm_log_path}/${rvm_log_timestamp:-}${rvm_ruby_string:+_}${rvm_ruby_string:-}/"
      fi
      return $result
    }
  else
    rvm_error "Skipping configure step, 'configure' does not exist, did autoreconf not run successfully?"
  fi

  if
    is_a_function __rvm_post_configure_${rvm_ruby_interpreter}
  then
    __rvm_log_command "postconfigure" "$rvm_ruby_string - #post-configuration" \
      __rvm_post_configure_${rvm_ruby_interpreter}
  fi

  __rvm_log_command "make" "$rvm_ruby_string - #compiling" ${rvm_ruby_make:-__rvm_make} "${rvm_make_flags[@]}" ||
  {
    result=$?

    rvm_error "\nThere has been an error while running make. Halting the installation."

    if is_a_function __rvm_make_failed_${_system_name_lowercase}
    then __rvm_make_failed_${_system_name_lowercase}
    fi

    return $result
  }

  __rvm_rm_rf "$PWD/.ext/rdoc" # WTF?

  [[ -n "${rvm_ruby_make_install:-}" ]] || rvm_ruby_make_install=( __rvm_make install )

  __rvm_log_command "install" "$rvm_ruby_string - #installing" "${rvm_ruby_make_install[@]}" ||
  {
    result=$?
    rvm_error "There has been an error while running make install. Halting the installation."
    return $result
  }

  if [[ -s "${rvm_src_path}/$rvm_ruby_string/patches.list" ]]
  then __rvm_cp -f "${rvm_src_path}/$rvm_ruby_string/patches.list" "$rvm_ruby_home/patches.list"
  fi

  case "${rvm_ruby_string:-""}" in
    ruby-1.8.4|ruby-1.8.5-*)
      \typeset libdir
      libdir="$rvm_ruby_home/lib"
      if
        [[ -d "${libdir}64" ]]
      then
        \command \rm -rf "${libdir}"
        ln -s "${libdir}64" "${libdir}"
      fi
    ;;
  esac

  case " ${rvm_configure_flags[*]} " in
    (*[[:space:]]--program-suffix=*)
      \typeset program_suffix
      program_suffix="${rvm_configure_flags[*]}"
      program_suffix="${program_suffix#*--program-suffix=}"
      program_suffix="${program_suffix%%[\' ]*}"
      __rvm_log_command "link.ruby" "$rvm_ruby_string - #linking ruby${program_suffix} -> ruby " \
        ln -s "$rvm_ruby_home/bin/ruby${program_suffix}" "$rvm_ruby_home/bin/ruby"
      ;;
  esac

  __rvm_initial_gemsets_create "$rvm_ruby_home/bin/ruby" &&
  __rvm_post_install &&
  __rvm_fetch_ruby_cleanup ||
  return $?

  rvm_log "Install of $rvm_ruby_string - #complete "
}

__rvm_post_install()
{
  case "$rvm_ruby_interpreter" in
  (jruby|ree|rbx|mruby|macruby|truffleruby) true ;; #skip
  (*)
    (( ${#binaries[@]} )) || binaries=(gem irb erb ri rdoc testrb rake)
    ;;
  esac

  if
    (( ${#binaries[@]} ))
  then
    rvm_log "$rvm_ruby_string - #adjusting #shebangs for (${binaries[@]})."
    for binary in "${binaries[@]}"
    do
      if
        [[ -e "$rvm_ruby_home/bin/$binary" || -e "${rvm_src_path}/$rvm_ruby_string/bin/$binary" ]]
      then
        if
          [[ "${rvm_src_path}/$rvm_ruby_string" != "$rvm_ruby_home" ]] &&
          [[ -f "${rvm_src_path}/$rvm_ruby_string/bin/$binary" && ! -L "$rvm_ruby_home/bin/$binary" ]]
        then
          __rvm_cp -f "${rvm_src_path}/$rvm_ruby_string/bin/$binary" "$rvm_ruby_home/bin/$binary"
        elif
          [[ -f "$rvm_ruby_gem_home/bin/$binary" ]]
        then
          __rvm_cp -f "$rvm_ruby_gem_home/bin/$binary" "$rvm_ruby_home/bin/$binary"
        fi
        __rvm_inject_ruby_shebang "$rvm_ruby_home/bin/$binary"
        [[ -x "$rvm_ruby_home/bin/$binary" ]] || chmod +x "$rvm_ruby_home/bin/$binary"
      fi
    done
  fi
  binaries=(gem irb erb ri rdoc testrb rake) #reset
  __rvm_irbrc
}

__rvm_inject_ruby_shebang()
{
  \typeset actual_file="$1"
  __rvm_readlink_deep actual_file
  if
    [[ -f "$actual_file" ]]
  then
    __rvm_sed_i "${actual_file}" -e '1,1s=.*=#!'"/usr/bin/env ruby="
    [[ -x "$actual_file" ]] || chmod +x "$actual_file"
  fi
}

__rvm_old_ruby()
{
  case "$1" in
    (ree*|ruby-1.8*|ruby-1.9.1*|ruby-1.9.2*) return 0 ;;
    (*) return 1 ;;
  esac
}

__rvm_install_ruby_try_remote()
{
  : rvm_disable_binary_flag:${rvm_disable_binary_flag:=0}: rvm_remote_flag:${rvm_remote_flag:=0}:
  if
    (( rvm_remote_flag > 0 )) || # remote flag wins!
    (( rvm_head_flag == 0 && rvm_disable_binary_flag == 0 )) # not a head and disabled binary
  then
    case "$rvm_ruby_string" in
      truffleruby*)
        # always use the "from source" installation path for TruffleRuby
        return 2
        ;;
    esac

    rvm_log "Searching for binary rubies, this might take some time."
    \typeset __rvm_ruby_url __rvm_ruby_verify_download_flag __ruby_identifier
    __ruby_identifier="${rvm_ruby_string}"
    __rvm_ruby_url="$( __rvm_remote_server_path "${__ruby_identifier}" )"
    if
      [[ -z "${__rvm_ruby_url}" ]]
    then
      __ruby_identifier="${rvm_ruby_string%-${detected_rvm_ruby_name:-}}"
      __rvm_ruby_url="$( __rvm_remote_server_path "${__ruby_identifier}" )"
    fi
    IFS=: read __rvm_ruby_verify_download_flag __rvm_ruby_url <<<"${__rvm_ruby_url}"
    if
      (( ${rvm_verify_downloads_flag_cli:-${rvm_verify_downloads_flag:-1}} > ${__rvm_ruby_verify_download_flag:=0} ))
    then
      __rvm_ruby_verify_download_flag=${rvm_verify_downloads_flag_cli:-${rvm_verify_downloads_flag}}
    fi
    if
      [[ -z "${__rvm_ruby_url}" ]]
    then
      if
        (( rvm_remote_flag ))
      then
        rvm_error "Requested binary installation but no rubies are available to download, consider skipping --binary flag."
        return 1
      elif
        __rvm_old_ruby "${__ruby_identifier}"
      then
        rvm_log "No binary rubies available for: $(__rvm_system_path -)/${__ruby_identifier}.
It is not possible to build movable binaries for rubies 1.8-1.9.2, but you can do it for your system only.
Continuing with compilation. Please read 'rvm help mount' to get more information on binary rubies."
      else
        rvm_warn "No binary rubies available for: $(__rvm_system_path -)/${__ruby_identifier}.
Continuing with compilation. Please read 'rvm help mount' to get more information on binary rubies."
      fi
    else
      rvm_log "Found remote file ${__rvm_ruby_url}"
      __rvm_setup_compile_environment_setup
      __rvm_setup_compile_environment_requirements "${rvm_ruby_string}" || return 1
      __rvm_check_available_space "${rvm_ruby_string}"
      if
        rvm_verify_downloads_flag=${__rvm_ruby_verify_download_flag} rvm_remote_flag=1 \
          "${rvm_scripts_path}/mount" mount "${__rvm_ruby_url}" "${rvm_ruby_string}" autodetect
      then
        return 0
      else
        \typeset __status=$?
        __rvm_rm_rf "$rvm_rubies_path/$rvm_ruby_string" # cleanup so standard installation works
        if
          (( rvm_remote_flag ))
        then
          rvm_error "Mounting remote ruby failed with status $__status, stopping installation."
          return ${__status}
        else
          rvm_warn "Mounting remote ruby failed with status $__status, trying to compile."
        fi
      fi
    fi
  fi
  return 2 # continue with compilation
}

__rvm_check_available_space()
{
  \typeset __required_space __free_space __i_have_no_idea
  __rvm_calculate_space_free "${rvm_rubies_path}"

  __i_have_no_idea=0
  case "$1" in
    # this should be enough for binary only version, including package file
    (jruby*)         __required_space=50  ;;
    (maglev*)        __required_space=950 ;;
    (ree-*)          __required_space=70  ;;
    (rbx*|rubinius*) __required_space=170 ;;
    (truffleruby*)   __required_space=200 ;;
    (ruby-1.8.5*)    __required_space=20  ;;
    (ruby-1.8.6*)    __required_space=20  ;;
    (ruby-1.8.7*)    __required_space=25  ;;
    (ruby-1.9.1*)    __required_space=60  ;;
    (ruby-1.9.2*)    __required_space=60  ;;
    (ruby-1.9.3*)    __required_space=70  ;;
    (ruby-2.0.0*)    __required_space=90  ;;
    (ruby-head*)     __required_space=130 ;;
    (ruby*)          __required_space=100 ;; #2.1.0+
    (*)
      __required_space=50
      __i_have_no_idea=1
      ;;
  esac

  if
    [[ "${2:-}" == "sources" ]]
  then
    # this adds sources and repository size to the installed size, even if we would remove sources
    # after installation we still need them during installation so it's needed to add it
    case "$1" in
      (jruby*)         let __required_space+=230 ;;
      (maglev*)        let __required_space+=120 ;;
      (rbx*|rubinius*) let __required_space+=600 ;;
      (truffleruby*)   let __required_space+=160 ;;
      (ree-1.8.6*)     let __required_space+=40  ;;
      (ree-1.8.7*)     let __required_space+=130 ;;
      (ruby-1.8.5*)    let __required_space+=35  ;;
      (ruby-1.8.6*)    let __required_space+=40  ;;
      (ruby-1.8.7*)    let __required_space+=40  ;;
      (ruby-1.9.1*)    let __required_space+=120 ;;
      (ruby-1.9.2*)    let __required_space+=160 ;;
      (ruby-1.9.3*)    let __required_space+=170 ;;
      (ruby-2.0.0*)    let __required_space+=300 ;;
      (ruby-head*)     let __required_space+=560 ;;
      (ruby-*)         let __required_space+=340 ;; # 2.1.0+
      (*)              let __required_space+=100 ;;
    esac
  fi

  if (( __i_have_no_idea ))
  then rvm_warn "RVM does not have prediction for required space for $1, assuming ${__required_space}MB should be enough, let us know if it was not."
  fi

  if
    (( __required_space > __free_space ))
  then
    rvm_error "Not enough space (${__free_space}MB) to install ruby (${__required_space}MB)."
    return 1
  elif
    (( __required_space*12 > __free_space*10 )) # 20% check
  then
    rvm_warn "You are running low on disk space ${__free_space}MB, required ${__required_space}MB."
  else
    rvm_debug "Free disk space ${__free_space}MB, required ${__required_space}MB."
  fi
}

__rvm_install_ruby()
{
  true ${rvm_head_flag:=0} ${rvm_ruby_selected_flag:=0}
  \typeset binary __rvm_ruby_name ruby_install_type __result=0

  if
    (( rvm_ruby_selected_flag == 0 ))
  then
    __rvm_ruby_name="$rvm_ruby_name"
    __rvm_select || __result=$?
    case $__result in
      (0|2) true      ;; # 2 => missing gemset, it's fine, we will install it
      (*)   return $? ;;
    esac
    if
      [[ -n "$__rvm_ruby_name" ]]
    then
      __rvm_select || return $? # second detection for -n verification
      if
        [[ "$__rvm_ruby_name" != "$detected_rvm_ruby_name" ]]
      then
        rvm_error "
The used ruby name (-n) is not valid, it was matched as:

$( env | __rvm_grep "^rvm.*=$__rvm_ruby_name$" || printf "# Was not used at all\n")

for more details on selecting names please visit:
https://rvm.io/rubies/named/
" #" fix escaping
        return 1
      fi
    fi
  fi

  if [[ -n "${RUBYOPT:-""}" ]]
  then
    ruby_options="$RUBYOPT"
    unset RUBYOPT
  fi

  __rvm_select_late
  if (( ${rvm_force_flag:-0} == 0 ))
  then __rvm_remove_src_and_ruby
  fi

  if __rvm_install_ruby_try_remote
  then return 0
  else (( $? == 2 )) || return 1 # 2 => continue with compilation
  fi

  __rvm_check_available_space "${rvm_ruby_string}" sources || return $?
  __rvm_check_for_compiler || return $?

  case "${rvm_ruby_interpreter}" in
    opal|macruby|ree|jruby|maglev|rubinius|ironruby|ruby|mruby|topaz|truffleruby)
      ruby_install_type=$rvm_ruby_interpreter
      ;;
    rbx)      ruby_install_type=rubinius ;;
    ir)       ruby_install_type=ironruby ;;
    default)
      rvm_error "a ruby interpreter to install must be specified and not simply 'default'."
      return 1
      ;;
    *)
      rvm_error "Either the ruby interpreter is unknown or there was an error!."
      return 1
      ;;
  esac

  [[ -n "${rvm_configure_env[*]}" ]] || rvm_configure_env=() # zsh can assume empty var => ( '' )

  source "$rvm_scripts_path/functions/manage/${ruby_install_type}"
  ${ruby_install_type}_install || return $?

  # Record the Ruby's configuration to a file, key=value format.
  __rvm_ruby_config_save "$rvm_ruby_home/bin/ruby"
  __rvm_fix_group_permissions "$rvm_ruby_home"

  rvm_hook="after_install"
  source "$rvm_scripts_path/hook"

  if [[ -n "$ruby_options" ]]
  then
    RUBYOPT="$ruby_options"
    export RUBYOPT
  fi
}
src/rvm/scripts/functions/build000066400000022674147511530550012703 0ustar00#!/usr/bin/env bash

source "$rvm_scripts_path/functions/autolibs"
source "$rvm_scripts_path/functions/db"
source "$rvm_scripts_path/functions/build_config"
source "$rvm_scripts_path/functions/build_config_system"
source "$rvm_scripts_path/functions/build_requirements"
if
  [[ "Darwin" == "${_system_type}" ]]
then
  source "$rvm_scripts_path/functions/osx-ssl-certs"
  source "$rvm_scripts_path/functions/osx-support"
fi

# show the user selected compiler or return 1
__rvm_selected_compiler()
{
  #TODO: add handling for rvm_configure_env
  if
    [[ " ${rvm_configure_flags[*]}" == *" --with-gcc="* ]]
  then
    \typeset __compiler
    for __compiler in "${rvm_configure_flags[@]}"
    do
      case "$__compiler" in
        (--with-gcc=*)
          echo "${__compiler#--with-gcc=}"
          return 0
          ;;
      esac
    done
  elif
    [[ -n "${CC:-}" ]]
  then
    echo "${CC}"
    return 0
  fi
  return 1
}

__rvm_found_compiler()
{
  __rvm_selected_compiler  ||
  __rvm_which gcc   2>/dev/null ||
  __rvm_which clang 2>/dev/null
}

__rvm_fix_rbconfig()
{
  \typeset __config_file
  __config_file="$( __rvm_find $1/ -name rbconfig.rb 2>/dev/null )"
  [[ -n "${__config_file}" ]]   &&
  __rvm_remove_static_flag "$@" &&
  __rvm_fix_gcc_path       "$@" &&
  __rvm_fix_install_path   "$@"
}

__rvm_remove_static_flag()
{
  if
    __rvm_grep -- "-Z" "${__config_file}" >/dev/null
  then
    rvm_debug "Removing '-Z' from rbconfig."
    __rvm_sed_i "${__config_file}" -e "s#-Z##"
  fi
}

__rvm_fix_gcc_path()
{
  \typeset __cc_value __cc_new
  __rvm_which $(
    "$1/bin/ruby" -rrbconfig -e 'puts RbConfig::CONFIG["CC"]||"true"' 2>/dev/null
  ) >/dev/null 2>/dev/null ||
  {
    __cc_value="$( "$1/bin/ruby" -rrbconfig -e 'puts RbConfig::CONFIG["CC"]' 2>/dev/null )" &&
    if
      __rvm_grep "CONFIG\[\"CC\"\]" "${__config_file}" >/dev/null
    then
      __cc_new="$( __rvm_found_compiler )"
      rvm_debug "Fixing ruby compiler from '${__cc_value}' to '${__cc_new}'."
      __rvm_sed_i "${__config_file}" \
        -e "s#CONFIG\[\"CC\"\].*\$#CONFIG[\"CC\"] = ENV[\"CC\"] || \"${__cc_new}\"#"
    else
      rvm_warn "Installed ruby contains path to non existing compiler '${__cc_value}', compiling native gems might be impossible."
    fi
  }
}

__rvm_fix_install_path()
{
  \typeset __install_value __install_new
  __rvm_which $(
    "$1/bin/ruby" -rrbconfig -e 'puts RbConfig::CONFIG["INSTALL"]||"true"' 2>/dev/null
  ) >/dev/null 2>/dev/null ||
  {
    __install_value="$( "$1/bin/ruby" -rrbconfig -e 'puts RbConfig::CONFIG["INSTALL"]' 2>/dev/null )"
    if
      __rvm_grep "CONFIG\[\"INSTALL\"\]" "${__config_file}" >/dev/null
    then
      __install_new="$( \command \which install )"
      rvm_debug "Fixing ruby installer from '${__install_value}' to '${__install_new}'."
      __rvm_sed_i "${__config_file}" \
        -e "s#CONFIG\[\"INSTALL\"\].*\$#CONFIG[\"INSTALL\"] = \"${__install_new}\"#"
    else
      rvm_warn "Installed ruby contains path to non existing compiler '${__install_value}', compiling native gems might be impossible."
    fi
  }
}

__rvm_run_compiler()
{
  if
    [[ -n "${1:-}" ]]
  then
    \typeset compiler="$1"
    shift
    if [[ -n "${ZSH_VERSION:-}" ]]
    then ${=compiler} "$@" 2>&1 || return $?
    else ${compiler}  "$@" 2>&1 || return $?
    fi
  else
    return 1
  fi
}

__rvm_compiler_is()
{
  __rvm_run_compiler "$1" "$2" | __rvm_grep -i "$3" >/dev/null
}

__rvm_compiler_version_is()
{
  \typeset compiler __check
  __check="$1"
  compiler="${2:-$( __rvm_found_compiler )}" &&
  __rvm_compiler_is "$compiler" "--version" "${__check}" ||
  return $?
}

__rvm_compiler_is_llvm()
{
  __rvm_compiler_version_is "llvm" "${1:-}" || return $?
}

__rvm_compiler_is_clang()
{
  __rvm_compiler_version_is "clang" "${1:-}" || return $?
}

__rvm_compiler_version_or_higher()
{
  \typeset __version compiler
  compiler="${2:-$(  __rvm_found_compiler )}" &&
  __version="$( __rvm_run_compiler "$compiler" "-dumpversion" )" &&
  __rvm_version_compare "${__version:-0}" -ge "$1" ||
  return $?
}

__rvm_update_configure_env()
{
  \typeset -a local_configure_env
  \typeset _variable _value _iterator _found

  rvm_debug "__rvm_update_configure_env($#):$*:"

  while (( $# ))
  do
    _variable="${1%%\=*}"
    _value="${1#*=}"
    shift
    __rvm_array_add_or_update rvm_configure_env "$_variable=" " " "$_value"
  done
}

__rvm_update_configure_env_arch()
{
  __rvm_update_configure_env CFLAGS="$1" CCFLAGS="$1" CXXFLAGS="$1" LDFLAGS="$1"
}

__rvm_update_configure_opt_dir()
{
  case "$1" in
    (rbx*|rubinius*)
      __rvm_update_configure_opt_dir_options "$2"
      ;;
    (ruby-head*|ruby-2*)
      __rvm_update_configure_opt_dir_option "$2"
      ;;
    (ruby-1.9.3-p*)
      \typeset __patchlevel
      __patchlevel="${1##ruby-1.9.3-p}"
      if
        (( __patchlevel < 297 ))
      then
        rvm_patch_names+=( cflags )
        __rvm_update_configure_opt_dir_option_or_flags "$2"
      else
        __rvm_update_configure_opt_dir_option "$2"
      fi
      ;;
    (ruby-1.9*)
      __rvm_update_configure_opt_dir_option_or_flags "$2"
      ;;
    (*)
      __rvm_update_configure_opt_dir_flags "$2"
      ;;
  esac
}

# add multiple --with-opt-dir=
__rvm_update_configure_opt_dir_options()
{
  rvm_debug "rvm_configure_flags+=( --with-opt-dir=$1 )"
  rvm_configure_flags+=( --with-opt-dir="$1" )
}

# update single --with-opt-dir=
__rvm_update_configure_opt_dir_option()
{
  rvm_debug "rvm_configure_flags+=( --with-opt-dir=$1 )"
  __rvm_array_add_or_update rvm_configure_flags --with-opt-dir= : "$1"
}

__rvm_update_configure_opt_dir_option_or_flags()
{
  # Use option if first time - use flags if option available already
  case " ${rvm_configure_flags[*]} " in
    (*[[:space:]]--with-opt-dir=*)
      __rvm_update_configure_opt_dir_flags "$@"
      ;;
    (*)
      __rvm_update_configure_opt_dir_option "$@"
      ;;
  esac
}

__rvm_update_configure_opt_dir_flags()
{
  \typeset __enable_rpath __lib_path

  if
    #                  __rvm_xargs \head -n 1 -- can not have \command - breaks xargs
    __rvm_which bash | __rvm_xargs \head -n 1 | \command \cat -e | __rvm_grep -b '^^?ELF' >/dev/null
  then
    __enable_rpath="true"
  fi

  __rvm_update_configure_env CFLAGS="-I$1/include"
  __rvm_update_configure_env LDFLAGS="-L$1/lib"

  [[ -z "${__enable_rpath:-}" ]] ||
    __rvm_update_configure_env LDFLAGS="-Wl,-rpath,$1/lib"

  if [[ -d "$1/lib64" ]]
  then
    __rvm_update_configure_env LDFLAGS="-L$1/lib64"

    [[ -z "${__enable_rpath:-}" ]] ||
      __rvm_update_configure_env LDFLAGS="-Wl,-rpath,$1/lib64"
  fi
}

__rvm_check_for_compiler()
{
  if __rvm_selected_compiler > /dev/null &&
    ! builtin command -v $(__rvm_selected_compiler) >/dev/null
  then
    rvm_error "You requested building with '$(__rvm_selected_compiler)' but it is not in your path."
    return 1
  fi
}

# Checks for bison, returns zero iff it is found
__rvm_check_for_bison()
{
  true ${rvm_head_flag:=0}
  if (( rvm_head_flag > 0 ))
  then
    if ! builtin command -v bison > /dev/null
    then
      rvm_error "\nbison is not available in your path. \nPlease ensure bison is installed before compiling from head.\n"
      return 1
    fi
  fi
}

__rvm_mono_env()
{
  DYLD_LIBRARY_PATH="${rvm_usr_path}/lib:$DYLD_LIBRARY_PATH"
  C_INCLUDE_PATH="${rvm_usr_path}/include:$C_INCLUDE_PATH"
  ACLOCAL_PATH="${rvm_usr_path}/share/aclocal"
  ACLOCAL_FLAGS="-I $ACLOCAL_PATH"
  PKG_CONFIG_PATH="${rvm_usr_path}/lib/pkgconfig:$PKG_CONFIG_PATH"

  export  DYLD_LIBRARY_PATH C_INCLUDE_PATH ACLOCAL_PATH ACLOCAL_FLAGS PKG_CONFIG_PATH

  __rvm_add_to_path prepend "${rvm_usr_path}/bin"

  builtin hash -r

  return 0
}

# Returns all mri compatible (partly) ruby for use
# with things like rbx etc which require a ruby be installed.
__rvm_mri_rubies()
(
  # find on bsd does not have -not, we need to use \!
  \typeset versions="${1:-"ruby-1.9|ruby-2"}"
  __rvm_cd "$rvm_rubies_path" &&
  __rvm_find . -maxdepth 1 -mindepth 1 -type d \! -type l |
  __rvm_awk -F/ "/$versions/"' {if (system("test -x \""$0"/bin/ruby\"")==0) print $2}' ||
  return $?
)

# Returns the first mri compatible (partly) ruby for use
# with things like rbx etc which require a ruby be installed.
__rvm_mri_ruby()
{
  __rvm_mri_rubies "${1:-"ruby-1.9|ruby-2"}" |
  __rvm_version_sort |
  __rvm_awk 'BEGIN{ selected=$0 } /'"$(__rvm_env_string)"'/{ selected=$0 } END {print $0}'
}

__rvm_ensure_has_mri_ruby()
{
  \typeset versions
  versions="${1:-"ruby-1.9|ruby-2"}"
  if
    [[ -z "$(__rvm_mri_ruby $versions)" ]]
  then
    \typeset compat_result
    compat_result=0
    rvm_warn "
Warning! Requested ruby installation which requires another ruby available - installing ${versions##*|} first.
"
    if
      (
        __rvm_select "${versions##*|}" # prevents endless loop for rbx
        __rvm_run_wrapper manage install "${versions##*|}"
      )
    then
      true
    else
      compat_result=$?
      rvm_error "
To proceed rvm requires a ${versions##*|} compatible ruby is installed.
We attempted to install it automatically but it failed with status $compat_result.
Please install it manually (or a compatible alternative) to proceed.
"
    fi
    return $compat_result
  fi

  return 0
}

__rvm_is_enough_ram()
{
  \typeset __required_ram __existing_ram

  __required_ram=$(( $1 * 1024 * 1024 ))

  __existing_ram="$(free -b 2>/dev/null | __rvm_awk '{if (NR==3) print $4}')"
  : ${__existing_ram:="$(sysctl hw.physmem 2>/dev/null | __rvm_awk -F"[:=]" '{print $2}')"}
  : __existing_ram: ${__existing_ram:=0}
  rvm_debug "Existing ram $(( __existing_ram /1024 /1024 ))MB."

  (( __existing_ram >= __required_ram )) || return $?
}
src/rvm/scripts/functions/selector000077500000037754147511530550013434 0ustar00#!/usr/bin/env bash

source "${rvm_scripts_path}/functions/selector_gemsets"
source "${rvm_scripts_path}/functions/selector_late"
source "${rvm_scripts_path}/functions/selector_parse"
source "${rvm_scripts_path}/functions/selector_interpreters"

__rvm_select_set_variable_defaults()
{
  export GEM_HOME GEM_PATH MY_RUBY_HOME RUBY_VERSION IRBRC
  export rvm_env_string rvm_action rvm_alias_expanded rvm_archive_extension rvm_bin_flag rvm_bin_path rvm_debug_flag rvm_default_flag rvm_delete_flag rvm_docs_type rvm_dump_environment_flag rvm_error_message rvm_expanding_aliases rvm_file_name rvm_gemdir_flag rvm_gemset_name rvm_gemstone_package_file rvm_gemstone_url rvm_head_flag rvm_hook rvm_install_on_use_flag rvm_llvm_flag rvm_loaded_flag rvm_niceness rvm_nightly_flag rvm_only_path_flag rvm_parse_break rvm_patch_original_pwd rvm_pretty_print_flag rvm_proxy rvm_quiet_flag rvm_reload_flag rvm_remove_flag rvm_ruby_alias rvm_ruby_args rvm_ruby_binary rvm_ruby_bits rvm_ruby_configure rvm_ruby_file rvm_ruby_gem_home rvm_ruby_gem_path rvm_ruby_global_gems_path rvm_ruby_home rvm_ruby_interpreter rvm_ruby_irbrc rvm_ruby_major_version rvm_ruby_make rvm_ruby_make_install rvm_ruby_minor_version rvm_ruby_mode rvm_ruby_name rvm_ruby_package_file rvm_ruby_package_name rvm_ruby_patch rvm_ruby_patch_level rvm_ruby_release_version rvm_ruby_repo_url rvm_ruby_revision rvm_ruby_selected_flag rvm_ruby_sha rvm_ruby_string rvm_ruby_strings rvm_ruby_tag rvm_ruby_url rvm_ruby_user_tag rvm_ruby_version rvm_script_name rvm_sdk rvm_silent_flag rvm_sticky_flag rvm_system_flag rvm_token rvm_trace_flag rvm_use_flag rvm_user_flag rvm_verbose_flag rvm_ruby_repo_tag
}

__rvm_select_detect_ruby_string()
{
  rvm_ruby_string="${1:-${rvm_ruby_string:-${rvm_env_string:-}}}"
  if
    [[ -z "${rvm_ruby_string:-}" ]]
  then
    rvm_ruby_string="${rvm_ruby_interpreter:-}"
    rvm_ruby_string="${rvm_ruby_string:-}${rvm_ruby_version:+-}${rvm_ruby_version:-}"
    rvm_ruby_string="${rvm_ruby_string:-}${rvm_ruby_patch_level:+-}${rvm_ruby_patch_level:-}"
    rvm_ruby_string="${rvm_ruby_string:-}${rvm_ruby_revision:+-}${rvm_ruby_revision:-}"
    if [[ -n "${rvm_ruby_name:-}" ]]
    then rvm_ruby_name="$rvm_ruby_string-$rvm_ruby_name"
    fi
  fi
}

__rvm_select_interpreter_variables()
{
  rvm_archive_extension="tar.gz"

  if [[ -z "${rvm_ruby_interpreter:-}" ]]
  then rvm_ruby_interpreter="${rvm_ruby_string//-*/}"
  fi

  rvm_ruby_interpreter="${rvm_ruby_interpreter:-missing}"

  if
    is_a_function __rvm_select_interpreter_${rvm_ruby_interpreter}
  then
    __rvm_select_interpreter_${rvm_ruby_interpreter} || return $?
  elif
    [[ -n "${MY_RUBY_HOME:-""}" ]]
  then
    __rvm_select "${MY_RUBY_HOME##*/}" || return $?
  elif
    [[ -z "${rvm_ruby_string:-""}" ]]
  then
    rvm_error "Ruby implementation '$rvm_ruby_interpreter' is not known."
    return 1
  fi
}

__rvm_select_version_variables()
{
  case "$rvm_ruby_version" in
    (+([0-9]).+([0-9]).+([0-9]))
      rvm_ruby_release_version="${rvm_ruby_version/.*/}"
      rvm_ruby_major_version=${rvm_ruby_version%.*}
      rvm_ruby_major_version=${rvm_ruby_major_version#*.}
      rvm_ruby_minor_version="${rvm_ruby_version//*.}"
      ;;
    (+([0-9]).+([0-9]))
      rvm_ruby_release_version="${rvm_ruby_version/.*/}"
      rvm_ruby_major_version="${rvm_ruby_version#*.}"
      rvm_ruby_minor_version=""
      ;;
  esac
}

__rvm_select_default_variables()
{
  if [[ "${rvm_ruby_interpreter}" != ext ]]
  then rvm_ruby_package_name="${rvm_ruby_package_name:-${rvm_ruby_string//-n*}}"
  fi

  rvm_ruby_home="$rvm_rubies_path/$rvm_ruby_string"
  rvm_ruby_binary="$rvm_ruby_home/bin/ruby"
  rvm_ruby_irbrc="$rvm_ruby_home/.irbrc"
}

# __rvm_select implementation-version-patch_level
__rvm_select()
{
  true ${rvm_gemset_name:=}

  __rvm_select_set_variable_defaults &&
  __rvm_select_detect_ruby_string "${1:-}" &&
  __rvm_ruby_string &&
  __rvm_select_after_parse ||
  return $?
}

__rvm_select_after_parse()
{
  __rvm_select_interpreter_variables &&
  __rvm_select_version_variables     &&
  __rvm_select_default_variables     ||
  return $?

  [[ "system" == "$rvm_ruby_interpreter" ]] || __rvm_gemset_select ||
    return $result

  rvm_ruby_selected_flag=1
}


__rvm_use_system() {

  unset GEM_HOME GEM_PATH MY_RUBY_HOME RUBY_VERSION IRBRC

  if
    [[ -s "$rvm_path/config/system" ]]
  then
    if
      __rvm_grep "MY_RUBY_HOME='$rvm_rubies_path" "$rvm_path/config/system" > /dev/null
    then
      # 'system' should *not* point to an rvm ruby.
      if [[ -f "$rvm_path/config/system" ]]
      then \command \rm -f "$rvm_path/config/system"
      fi
    else
      source "$rvm_path/config/system"
    fi
  fi

  if
    (( ${rvm_default_flag:=0} == 1 ))
  then
    "$rvm_scripts_path/alias" delete default &> /dev/null
    __rvm_find "${rvm_bin_path}" -maxdepth 0 -name 'default_*' -exec rm '{}' \;
    \command \rm -f "$rvm_path/config/default"
    \command \rm -f "$rvm_environments_path/default"
    __rvm_rm_rf "$rvm_wrappers_path/default"
  fi

  rvm_verbose_log "Now using system ruby."

  __path_prefix=""
  __path_suffix="${rvm_bin_path}"
  export rvm_ruby_string="system"
}

__rvm_use()
{
  \typeset binary full_binary_path rvm_ruby_gem_home __path_prefix __path_suffix

  __rvm_select "$@" || return $?

  if [[ "system" == ${rvm_ruby_interpreter:="system"} ]]
  then __rvm_use_system
  else __rvm_use_ || return $?
  fi
  __rvm_use_common
}

__rvm_use_()
{
  rvm_ruby_home="${rvm_ruby_home%%@*}"

    if
      [[ ! -d "$rvm_ruby_home" ]]
    then
      if
        [[ ${rvm_install_on_use_flag:-0} -eq 1 ]]
      then
        rvm_warn "Required $rvm_ruby_string is not installed - installing."
        __rvm_run_wrapper manage "install" "$rvm_ruby_string"
      else
        rvm_error "Required $rvm_ruby_string is not installed."
        rvm_log "To install do: 'rvm install \"$rvm_ruby_string\"'"
        export rvm_recommended_ruby="rvm install $rvm_ruby_string"
        return 1
      fi
    fi

    __rvm_gemset_use_ensure || return $?

    export GEM_HOME GEM_PATH MY_RUBY_HOME RUBY_VERSION IRBRC
    GEM_HOME="$rvm_ruby_gem_home"
    GEM_PATH="$rvm_ruby_gem_path"
    MY_RUBY_HOME="$rvm_ruby_home"
    RUBY_VERSION="$rvm_ruby_string"
    IRBRC="$rvm_ruby_irbrc"
    unset BUNDLE_PATH # Ensure that BUNDLE_PATH is not set!

    # Handle MagLev pre-installed gems
    if [[ "maglev" == "$rvm_ruby_interpreter" ]]
    then GEM_PATH="$GEM_PATH:$MAGLEV_HOME/lib/maglev/gems/1.8/"
    fi

    [[ -n "${IRBRC:-}" ]] || unset IRBRC

    if
      (( ${rvm_use_flag:-1} >= 2 && ${rvm_internal_use_flag:-0} == 0 )) ||
      (( ${rvm_use_flag:-1} == 1 && ${rvm_verbose_flag:-0} == 1 ))
    then
      rvm_log "Using ${GEM_HOME/${rvm_gemset_separator:-'@'}/ with gemset }"
    fi

    if [[ "$GEM_HOME" != "$rvm_ruby_global_gems_path" ]]
    then __path_prefix="$GEM_HOME/bin:$rvm_ruby_global_gems_path/bin:${rvm_ruby_binary%/*}:${rvm_bin_path}"
    else __path_prefix="$GEM_HOME/bin:${rvm_ruby_binary%/*}:${rvm_bin_path}"
    fi
    __path_suffix=""
}

__rvm_use_common()
{
  [[ -z "${rvm_ruby_string:-}" ]] || export rvm_ruby_string
  [[ -z "${rvm_gemset_name:-}" ]] || export rvm_gemset_name

  \typeset __save_PATH
  __rvm_remove_rvm_from_path
  __save_PATH=$PATH
  if
    [[ -n "${_OLD_VIRTUAL_PATH}" ]]
  then
    # _OLD_VIRTUAL_PATH means we deal with virtualenv - see #2585,
    # PATH is saved in __save_PATH, use __rvm_remove_rvm_from_path to
    # clean _OLD_VIRTUAL_PATH via PATH ... a trick so we can transform
    # _OLD_VIRTUAL_PATH the same way like PATH for new ruby, from now on
    # any virtualenv operations will be aware of rvm
    PATH="${_OLD_VIRTUAL_PATH}"
    __rvm_remove_rvm_from_path
    _OLD_VIRTUAL_PATH="${__path_prefix:-}${__path_prefix:+:}${PATH}${__path_suffix:+:}${__path_suffix:-}"
  fi
  PATH="${__path_prefix:-}${__path_prefix:+:}$__save_PATH${__path_suffix:+:}${__path_suffix:-}"
  export PATH
  builtin hash -r

  if
    [[ "$rvm_ruby_string" != "system" ]]
  then
    case "${rvm_rvmrc_flag:-0}" in
      (rvmrc|versions_conf|ruby_version) __rvm_set_${rvm_rvmrc_flag} ;;
    esac

    \typeset environment_id
    environment_id="$(__rvm_env_string)"
    if
      (( ${rvm_default_flag:=0} == 1 )) &&
      [[ "default" != "${rvm_ruby_interpreter:-}" ]] &&
      [[ "system"  != "${rvm_ruby_interpreter:-}" ]]
    then
      # Switch the default alias to the new environment id
      "$rvm_scripts_path/alias" delete default &> /dev/null
      "$rvm_scripts_path/alias" create default "$environment_id" >& /dev/null
    fi
    rvm_default_flag=0
    if
      [[ -n "${rvm_ruby_alias:-}" ]]
    then
      rvm_log "Attempting to alias $environment_id to $rvm_ruby_alias"
      "$rvm_scripts_path/alias" delete "$rvm_ruby_alias" > /dev/null 2>&1
      rvm_alias_expanded=1 "$rvm_scripts_path/alias" create "$rvm_ruby_alias" "$environment_id" > /dev/null 2>&1
      ruby_alias="" ; rvm_ruby_alias=""
    fi
  else
    if
      (( ${rvm_default_flag:=0} == 1 ))
    then
      builtin command -v __rvm_reset >> /dev/null 2>&1 || source "$rvm_scripts_path/functions/reset"
      __rvm_reset
    fi
  fi
  rvm_hook="after_use"
  source "$rvm_scripts_path/hook"
  return 0
}

__rvm_ruby_string_installed()
{
  \typeset __ruby_inst_dir="$rvm_rubies_path/${rvm_ruby_string}"
  if [[ -n "${rvm_ruby_name:-}" && ! "${rvm_ruby_string}" == *"-${rvm_ruby_name}" ]]
  then __ruby_inst_dir="${__ruby_inst_dir}-${rvm_ruby_name}"
  fi
  [[ -n "$rvm_ruby_interpreter" && -n "${rvm_ruby_string}" &&
    -d "${__ruby_inst_dir}"
  ]] &&
  [[ -z "${rvm_gemset_name}" || ${rvm_create_flag:-0} -eq 1 ||
    -d "${__ruby_inst_dir}${rvm_gemset_separator}${rvm_gemset_name}"
  ]]
}

__rvm_ruby_string_remotely_available()
{
  (( ${rvm_remote_flag:-0} == 1 )) &&
  [[ -n "$rvm_ruby_interpreter" && -n "${rvm_ruby_string}" ]] &&
  __rvm_remote_server_path "${rvm_ruby_string}" >/dev/null
}

__rvm_ruby_string()
{
  # rvm_ruby_string may designate any of the following items:
  # * rvm_gemset_name
  # * rvm_ruby_interpreter
  # * rvm_ruby_version
  # * rvm_ruby_patch_level
  # * rvm_ruby_revision
  # * rvm_ruby_tag

  true ${rvm_head_flag:=0} ${rvm_delete_flag:=0}
  rvm_expanding_aliases=''
  true \
    "${rvm_ruby_version:=}" "${rvm_gemset_name:=}" "${rvm_ruby_interpreter:=}"\
    "${rvm_ruby_version:=}" "${rvm_ruby_tag:=}" "${rvm_ruby_patch_level:=}"\
    "${rvm_ruby_revision:=}" ${rvm_gemset_separator:="@"} "${rvm_ruby_string:=}"\
    ${rvm_expanding_aliases:=0} ${rvm_head_flag:=0}

  if
    [[ "$rvm_ruby_string" == *"${rvm_gemset_separator}"* ]]
  then
    rvm_gemset_name="${rvm_ruby_string/*${rvm_gemset_separator}/}"
    rvm_ruby_string="${rvm_ruby_string/${rvm_gemset_separator}*/}"
  fi
  # known ruby aliases
  if
    (( rvm_expanding_aliases == 0 )) &&
    [[ -n "${rvm_ruby_string}" && "$rvm_ruby_string" != "system" ]]
  then
    if
      [[ -f "$rvm_path/config/known_aliases" && -s "$rvm_path/config/known_aliases" ]] &&
      expanded_alias_name="$(__rvm_db_ "$rvm_path/config/known_aliases" "$rvm_ruby_string")" &&
      [[ -n "$expanded_alias_name" ]]
    then
      rvm_ruby_string="$expanded_alias_name"
    fi
  fi
  # Alias'd rubies
  if
    (( rvm_expanding_aliases == 0 )) &&
    [[ -n "${rvm_ruby_string}" && "$rvm_ruby_string" != "system" ]]
  then
    if
      [[ -f "$rvm_path/config/alias" && -s "$rvm_path/config/alias" ]] &&
      expanded_alias_name="$(__rvm_db_ "$rvm_path/config/alias" "$rvm_ruby_string")" &&
      [[ -n "$expanded_alias_name" ]]
    then
      rvm_ruby_string="$expanded_alias_name"
    elif
      [[ "$rvm_ruby_string" == default ]]
    then
      # Default is not a known value. Instead, we need to therefore set it to system.
      rvm_ruby_string="system"
    fi
    if
      [[ "$rvm_ruby_string" == *"${rvm_gemset_separator}"* ]]
    then
      rvm_gemset_name="${rvm_ruby_string/*${rvm_gemset_separator}/}"
      rvm_ruby_string="${rvm_ruby_string/${rvm_gemset_separator}*/}"
    fi
  fi
  if
    [[ -n "$gemset_name" ]]
  then
    rvm_gemset_name="$gemset_name"
    rvm_sticky_flag=1 # <- not sold on this.
  fi

  __rvm_ruby_string_parse || return $?
  __rvm_ruby_string_find

  # record the name for validation of -n option
  detected_rvm_ruby_name="${rvm_ruby_name:-}"
  # clean the name so it is not added again (rbx -n install problem)
  rvm_ruby_name=""
  true
}

__rvm_ruby_string_find()
{
  if
    __rvm_ruby_string_installed
  then
    true  # use the selected/detected rvm_ruby_string
  elif
    __rvm_ruby_string_remotely_available
  then
    true # use the selected/detected rvm_ruby_string
  else
    __rvm_ruby_string_autodetect
    case "${rvm_ruby_string}" in
      (ruby-+([1-9])|ruby-+([1-9]).+([0-9])|ruby-1.+([1-9]).+([0-9])|jruby-[19]*)
        __rvm_ruby_string_latest &&
        __rvm_ruby_string_parse_ ||
        return $?
        ;;
    esac
  fi
  if [[ -n "${rvm_ruby_name:-}" && ! "${rvm_ruby_string}" == *"-${rvm_ruby_name}" ]]
  then rvm_ruby_string="${rvm_ruby_string}${rvm_ruby_name:+-}${rvm_ruby_name:-}"
  fi
}

__rvm_ruby_string_autodetect()
{
  if
    [[ -z "${rvm_ruby_version:-}" &&
      "${rvm_ruby_interpreter}" != "ext" &&
      "${rvm_ruby_interpreter}" != "system"
    ]] &&
    (( ${rvm_head_flag:=0} == 0 ))
  then
    if
      (( ${rvm_fuzzy_flag:-0} == 1 ))
    then
      rvm_ruby_version="$(
        __rvm_list_strings |
        __rvm_grep "^${rvm_ruby_interpreter}-.*${rvm_ruby_name:-}" |
        __rvm_awk -F- '{print $2}' |
        __rvm_version_sort |
        __rvm_tail -n 1
      )"
    fi
    rvm_ruby_version="${rvm_ruby_version:-"$(
      __rvm_db "${rvm_ruby_interpreter}_version"
    )"}"
  fi
  if
    (( ${rvm_head_flag:=0} )) &&
    [[ "${rvm_ruby_interpreter}" == "ruby" ]] &&
    __rvm_version_compare "${rvm_ruby_version}" -ge 2.1
  then
    __rvm_take_n rvm_ruby_version 2 .
  fi
  rvm_ruby_string="${rvm_ruby_interpreter}${rvm_ruby_version:+-}${rvm_ruby_version:-}"
  if
    [[ "${rvm_ruby_interpreter}" == "ext" ]]
  then
    true # skip checking for external rubies
  elif
    [[ "${rvm_head_flag:=0}" == "1" || -n "${rvm_ruby_sha:-}" || -n "${rvm_ruby_tag:-}"  || -n "${rvm_ruby_repo_tag:-}" ]]
  then
    if [[ "${rvm_head_flag:=0}" == "1" ]]
    then rvm_ruby_string="${rvm_ruby_string}-head"
    fi
    if [[ -n "${rvm_ruby_sha:-}" ]]
    then rvm_ruby_string="${rvm_ruby_string}-s${rvm_ruby_sha}"
    elif [[ -n "${rvm_ruby_repo_tag:-}" ]]
    then rvm_ruby_string="${rvm_ruby_string}-tag${rvm_ruby_repo_tag}"
    elif [[ -n "${rvm_ruby_tag:-}" ]]
    then rvm_ruby_string="${rvm_ruby_string}-${rvm_ruby_tag}"
    fi
    if
      [[ ! -d "${rvm_rubies_path}/${rvm_ruby_string}" ]] &&
      (( ${rvm_fuzzy_flag:-0} == 1 ))
    then
      \typeset new_ruby_string
      new_ruby_string="$(
        __rvm_list_strings |
        __rvm_grep "^${rvm_ruby_string}.*${rvm_ruby_name:-}" |
        __rvm_version_sort |
        __rvm_tail -n 1
      )"
      rvm_ruby_string="${new_ruby_string:-$rvm_ruby_string}"
    fi
  elif
    [[ -n "${rvm_ruby_revision:-}" ]]
  then
    rvm_ruby_string="${rvm_ruby_string}-${rvm_ruby_revision}"
  elif
    [[ -n "${rvm_ruby_patch_level:-}" ]]
  then
    rvm_ruby_string="${rvm_ruby_string}-${rvm_ruby_patch_level}"
  elif
    [[ -n "${rvm_ruby_user_tag:-}" ]]
  then
    rvm_ruby_string="${rvm_ruby_string}-${rvm_ruby_user_tag}"
  else
    if
      (( ${rvm_fuzzy_flag:-0} == 1 )) &&
      [[ "${rvm_ruby_interpreter}" == "ruby" || "${rvm_ruby_interpreter}" == "ree" ]]
    then
      rvm_ruby_patch_level="$(
        __rvm_list_strings |
        __rvm_grep "^${rvm_ruby_interpreter}-${rvm_ruby_version}-.*${rvm_ruby_name:-}" |
        __rvm_awk -F- '{print $3}' |
        __rvm_version_sort |
        __rvm_tail -n 1
      )"
    fi
    [[ -n "${rvm_ruby_patch_level:-""}" ]] ||
      __rvm_db_system \
        "${rvm_ruby_interpreter}_${rvm_ruby_version}_patch_level" \
        rvm_ruby_patch_level
    if [[ -n "${rvm_ruby_patch_level:-""}" ]]
    then rvm_ruby_string="${rvm_ruby_string}-${rvm_ruby_patch_level}"
    fi
  fi
  true # OSX --trace FIX
}

__rvm_ruby_strings_exist()
{
  for rvm_ruby_string in ${@//,/ }
  do
    rvm_gemset_name=""
    rvm_verbose_flag=0 __rvm_use "${rvm_ruby_string}" >/dev/null 2>&1 || return $?
    true rvm_gemset_name:${rvm_gemset_name:=${rvm_expected_gemset_name}}
    printf "%b" "${rvm_ruby_string}${rvm_gemset_name:+@}${rvm_gemset_name:-}\n"
  done
  unset rvm_ruby_string
}
src/rvm/scripts/functions/group000066400000005017147511530550012730 0ustar00#!/usr/bin/env bash

__rvm_add_user_to_group()
{
  case "${_system_type}" in
    "OpenBSD")
      __rvm_try_sudo usermod -G "$1" "$2"
      ;;
    "FreeBSD"|"DragonFly")
      __rvm_try_sudo pw usermod "$2" -G "$1"
      ;;
    "Linux")
      if [[ -f "/etc/SuSE-release" ]] ; then
        __rvm_try_sudo groupmod -A "$2" "$1"
      else
        __rvm_try_sudo /usr/sbin/usermod -a -G "$1" "$2"
      fi
    ;;
    "Darwin")
      __rvm_try_sudo dscl . -append "/Groups/$1" GroupMembership "$2"
      ;;
    "SunOS")
      groups="$(id -G "$2") \"$1\""
      __rvm_try_sudo usermod -G "${1// /, }" "$2"
      ;;
  esac
}

__rvm_show_user_groups()
{
  groups "$1" | __rvm_sed -e 's/.*:[[:space:]]*//' | \command \tr ' ' $'\n'
}

__rvm_is_user_in_group()
{
  __rvm_show_user_groups "$2" | __rvm_grep "^$1$" >/dev/null
}

__rvm_list_all_users()
{
  case "${_system_type}" in
    "Darwin")
      dscl . -search /Users PrimaryGroupID 20 | __rvm_grep PrimaryGroupID | cut -f 1
      ;;
    *)
      __rvm_grep -xF -f <(\command \cat /etc/passwd | cut -d: -f1) <(__rvm_find /home -mindepth 1 -maxdepth 1 -type d | cut -d '/' -f 3)
      ;;
  esac
}

__rvm_group_exists()
{
  case "${_system_type}" in
    (Darwin)
      dscl . -read "/Groups/$1" 1>/dev/null 2>&1 || return $?
      ;;
    (*)
      __rvm_grep "^$1:" /etc/group >/dev/null 2>&1
      ;;
  esac
}

__rvm_create_group()
{
  \typeset -a __group_params
  __group_params=()

  if [[ -n "${2:-}" ]]
  then __group_params+=( -g "$2" )
  fi

  case "${_system_type}" in
    (Linux|SunOS)
      __rvm_try_sudo groupadd "${__group_params[@]}" "$1"
      ;;
    (BSD)
      case "${_system_name}" in
        (OpenBSD)
          __rvm_try_sudo groupadd "${__group_params[@]}" "$1"
          ;;
        (FreeBSD|DragonFly)
          __rvm_try_sudo pw groupadd "${__group_params[@]}" "$1" -q
          ;;
        esac
        ;;
    (Darwin)
      \typeset _new_group_id
      if
        [[ -n "${2:-}" ]]
      then
        _new_group_id="$2"
      else
        _new_group_id="501" #only gids > 500 show up in user preferences
        #Find an open gid
        while true
        do
          name=$(dscl . search /groups PrimaryGroupID ${_new_group_id} | cut -f1 -s)
          if [[ -z "$name" ]]
          then break
          fi
          _new_group_id=$(( _new_group_id + 1 ))
        done
      fi
      # Create the group, isn't OSX "fun"?! :)
      # Thanks for the assist frogor of ##osx-server on freenode! Appreciate the assist!
      __rvm_try_sudo dscl . -create "/Groups/$1" gid "${_new_group_id}"
      ;;
  esac
}
src/rvm/scripts/functions/osx-ssl-certs-curl000066400000001454147511530550015266 0ustar00#!/usr/bin/env bash

__rvm_osx_ssl_certs_curl_cert_find_path()
{
  # Find correct curl CA Bundle path
  # See: https://curl.haxx.se/docs/sslcerts.html

  \typeset osx_ssl_certs_curl_ca_bundle

  osx_ssl_certs_curl_ca_bundle="$CURL_CA_BUNDLE"

  if [[ ! -f "$osx_ssl_certs_curl_ca_bundle" ]]
  then
    \typeset curl_bin
    curl_bin="$(type -p curl)"

    osx_ssl_certs_curl_ca_bundle="${curl_bin%/bin/curl}/share/curl/curl-ca-bundle.crt"
  fi

  rvm_debug "Expected cURL certificate bundle location: ${osx_ssl_certs_curl_ca_bundle}"

  if [[ -f "$osx_ssl_certs_curl_ca_bundle" ]]
  then
    rvm_debug "Found cURL certificate bundle ${osx_ssl_certs_curl_ca_bundle}"
    echo $osx_ssl_certs_curl_ca_bundle
  else
    rvm_warn "cURL certificate bundle ${osx_ssl_certs_curl_ca_bundle} not found"
    echo ""
  fi
}
src/rvm/scripts/functions/rvmrc000066400000011131147511530550012717 0ustar00#!/usr/bin/env bash

source "${rvm_scripts_path}/functions/rvmrc_env"
source "${rvm_scripts_path}/functions/rvmrc_project"
source "${rvm_scripts_path}/functions/rvmrc_set"
source "${rvm_scripts_path}/functions/rvmrc_to"
source "${rvm_scripts_path}/functions/rvmrc_trust"
source "${rvm_scripts_path}/functions/rvmrc_warning"

__rvm_rvmrc_match_all() [[ "${1:-}" == "all" || "${1:-}" == "all.rvmrcs" || "${1:-}" == "allGemfiles" ]]

__rvm_rvmrc_tools()
{
  \typeset rvmrc_action rvmrc_warning_action rvmrc_path saveIFS trust rvmrc_ruby

  rvmrc_action="$1"
  (( $# )) && shift || true

  if
    [[ "${rvmrc_action}" == "warning" ]]
  then
    rvmrc_warning_action="${1:-}"
    (( $# )) && shift || true
  fi

  if
    [[ "${rvmrc_action}" == "create" ]]
  then
    rvmrc_ruby="${1:-${GEM_HOME##*/}}"
    rvmrc_path="$(__rvm_cd "$PWD" >/dev/null 2>&1; pwd)/${2:-.rvmrc}"
  elif
    [[ "$1" == ".rvmrc" ]]
  then
    rvmrc_path="$PWD/.rvmrc"
  elif
    [[ "${rvmrc_action}" == "to" || "${rvmrc_action}" == "warning" ]] ||
    [[ -n "${1:-}" ]]
  then
    rvmrc_path="$1"
  else
    rvmrc_path="$PWD/.rvmrc"
  fi

  if
    [[ "${rvmrc_action}" == "to" ||
       "${rvmrc_action}" == "warning" ||
       "${rvmrc_action}" == "create"
    ]]||
    __rvm_rvmrc_match_all "${rvmrc_path:-}" # ignore all*
  then
    true 
  else
    __rvm_project_dir_check "${rvmrc_path}" rvmrc_path "${rvmrc_path}/.rvmrc"
  fi
  rvmrc_path="${rvmrc_path//\/\///}"
  rvmrc_path="${rvmrc_path%/}"

  case "$rvmrc_action" in
    warning)
      __rvmrc_warning "${rvmrc_warning_action:-}" "$rvmrc_path" || return $?
      ;;

    to)
      __rvm_rvmrc_to "$rvmrc_path" || return $?
      ;;

    create)
      (
        rvm_create_flag=1 __rvm_use "${rvmrc_ruby}"
        case "${rvmrc_path}" in
          (*/.rvmrc|*/--rvmrc)                 __rvm_set_rvmrc         ;;
          (*/.ruby-version|*/--ruby-version)   __rvm_set_ruby_version  ;;
          (*/.versions.conf|*/--versions-conf) __rvm_set_versions_conf ;;
          (*)
            rvm_error "Unrecognized project file format."
            return 1
            ;;
        esac
      )
      ;;
    reset)
      __rvm_reset_rvmrc_trust "$rvmrc_path" &&
        rvm_log "Reset trust for $rvmrc_path" ||
        rvm_error "Reset trust for $rvmrc_path - failed"
      ;;
    trust)
      __rvm_trust_rvmrc "$rvmrc_path" &&
        rvm_log "Marked $rvmrc_path as trusted" ||
        rvm_error "Marked $rvmrc_path as trusted - failed"
      ;;

    untrust)
      __rvm_untrust_rvmrc "$rvmrc_path" &&
        rvm_log "Marked $rvmrc_path as untrusted" ||
        rvm_error "Marked $rvmrc_path as untrusted - failed"
      ;;

    trusted)
      __rvm_rvmrc_stored_trust_check "$rvmrc_path" || return $?
      ;;

    is_trusted)
      __rvm_rvmrc_stored_trust_check "$rvmrc_path" >/dev/null
      ;;

    load)
      rvm_current_rvmrc="" rvm_trust_rvmrcs_flag=1 __rvm_project_rvmrc "${rvmrc_path%/.rvmrc}"
      ;;

    try_to_read_ruby)
      __rvm_rvmrc_tools_try_to_read_ruby "$@" || return $?
      ;;

    *)
      rvm_error "Usage: rvm rvmrc {trust,untrust,trusted,load,reset,is_trusted,try_to_read_ruby,create}"
      return 1
      ;;
  esac

  return $?
}

__rvm_rvmrc_tools_try_to_read_ruby()
{
  case "$rvmrc_path" in
    (*/.rvmrc)
      # make sure the flag is passed on to sub-process () / $()
      if [[ -n "${rvm_trust_rvmrcs_flag:-}" ]]
      then export rvm_trust_rvmrcs_flag
      fi

      rvmrc_path="$(cd "$(dirname "$rvmrc_path")"; pwd)/.rvmrc"

      __rvm_rvmrc_tools is_trusted "$(dirname "$rvmrc_path")" .rvmrc ||
      (
        # subprocess to not mess with current process variables
        rvm_promptless=1 __rvm_project_rvmrc "$rvmrc_path" >/dev/null 2>&1
      )

      if __rvm_rvmrc_tools is_trusted "$(dirname "$rvmrc_path")" .rvmrc
      then __rvm_rvmrc_tools_read_ruby "$@" || return $?
      else return 1
      fi
      ;;
    (*)
      __rvm_rvmrc_tools_read_ruby "$@" || return $?
      ;;
  esac
}

__rvm_save_variables()
{
  \typeset __save_to __key
  __save_to="$1"
  shift
  for __key in "$@"
  do
    eval "${__save_to}+=( \"\${__key}=\${${__key}}\" )"
  done
}

__rvm_rvmrc_tools_read_ruby()
{
  \typeset __result
  \typeset -a rvmrc_tools_read_ruby
  rvmrc_tools_read_ruby=()
  __rvm_save_variables rvmrc_tools_read_ruby \
    rvm_current_rvmrc result current_result rvm_token next_token \
    rvm_action _string
  rvm_current_rvmrc=""

  rvm_action="${rvm_action:-use}" rvm_trust_rvmrcs_flag=1 __rvm_project_rvmrc "$rvmrc_path" >/dev/null &&
    rvm_ruby_string="${GEM_HOME##*/}" &&
    rvm_ruby_strings="$rvm_ruby_string" ||
    __result=101

  __rvm_set_env "" "${rvmrc_tools_read_ruby[@]}"
  return ${__result:-0}
}
src/rvm/scripts/functions/cli000066400000026412147511530550012345 0ustar00#!/usr/bin/env bash

source "$rvm_scripts_path/functions/version"

__rvm_fix_selected_ruby()
{
  \typeset __ret=0
  if (( $# ))
  then "$@" || __ret=$?
  fi
  [[ -d "$GEM_HOME" && -d "$MY_RUBY_HOME" ]] ||
  {
    if [[ -d ${MY_RUBY_HOME%/*}/defaul ]]
    then __rvm_use default
    else __rvm_use system
    fi
  }
}

__rvm_path_match_gem_home_check_warn()
{
  rvm_warn "\
Warning! PATH is not properly set up, $1.
         <log>Usually this is caused by shell initialization files. Search for <code>PATH=...</code> entries.
         You can also re-add RVM to your profile by running: <code>rvm get stable --auto-dotfiles</code>
         To fix it temporarily in this shell session run: <code>rvm use $2</code>
         To ignore this error add <code>rvm_silence_path_mismatch_check_flag=1</code> to your <code>~/.rvmrc</code> file."
}

__rvm_path_match_gem_home_check_warning()
{
  __rvm_path_match_gem_home_check_warn "$GEM_HOME/bin $1" "${GEM_HOME##*/}"
}

__rvm_path_match_gem_home_check_warning_missing()
{
  __rvm_path_match_gem_home_check_warn "\$GEM_HOME is not set" "$1"
}

__rvm_path_match_gem_home_check()
{
  (( ${rvm_silence_path_mismatch_check_flag:-0} == 0 )) || return 0
  if
    [[ -n "${GEM_HOME:-}" ]]
  then
    case "$PATH:" in
      ($GEM_HOME/bin:*) true ;; # all fine here
      (*:$GEM_HOME/bin:*)
        __rvm_path_match_gem_home_check_warning "is not at first place"
        ;;
      (*)
        __rvm_path_match_gem_home_check_warning "is not available"
        ;;
    esac
  else
    \typeset __path_to_ruby
    if
      __path_to_ruby="$( builtin command -v ruby 2>/dev/null )" &&
      [[ "${__path_to_ruby}" == "${rvm_path}"* ]]
    then
      # get the ruby string from path to ruby executable
      __path_to_ruby="${__path_to_ruby%/bin/ruby}"
      __path_to_ruby="${__path_to_ruby##*/}"
      # warning
      __rvm_path_match_gem_home_check_warning_missing "${__path_to_ruby}"
    fi
  fi
}

__rvm_use_ruby_warnings()
{
  if [[ "${rvm_ruby_string}" == "system" || "${rvm_ruby_string}" == "" ]]
  then return 0
  fi
  \typeset __executable __gem_version

  for __executable in ruby gem irb
  do
    [[ -x "$MY_RUBY_HOME/bin/${__executable}" ]] ||
      rvm_warn "Warning! Executable '${__executable}' missing, something went wrong with this ruby installation!"
  done

  if
    [[ "${rvm_ruby_interpreter}" == "ruby" ]] &&
    {
      __rvm_version_compare "${rvm_ruby_version}" -ge 2.0.0 ||
      [[ "${rvm_ruby_version}" == "head" ]]
    } &&
    __rvm_which gem >/dev/null &&
    __gem_version="$(RUBYGEMS_GEMDEPS= gem --version)" &&
    [[ -n "${__gem_version}" ]] &&
    __rvm_version_compare "${__gem_version}" -lt "2.0.0"
  then
    rvm_warn "Warning! You have just used ruby 2.0.0 or newer, which is not fully compatible with rubygems 1.8.x or older,
         consider upgrading rubygems with: <code>rvm rubygems latest</code>"
  fi
}

__rvm_cli_posix_check()
{
  if
    __rvm_has_opt "posix"
  then
    echo "RVM can not be run with \`set -o posix\`, please turn it off and try again."
    return 100
  fi
}

__rvm_cli_load_rvmrc()
{
  if
    (( ${rvm_ignore_rvmrc:=0} == 0 ))
  then
    [[ -n "${rvm_stored_umask:-}" ]] || export rvm_stored_umask=$(umask)
    rvm_rvmrc_files=("/etc/rvmrc" "$HOME/.rvmrc")
    if
      [[ -n "${rvm_prefix:-}" ]] &&
      [[ ! "$HOME/.rvmrc" -ef "${rvm_prefix}/.rvmrc" ]]
    then
      rvm_rvmrc_files+=( "${rvm_prefix}/.rvmrc" )
    fi
    for rvmrc in "${rvm_rvmrc_files[@]}"
    do
      if
        [[ -f "$rvmrc" ]]
      then
        if
          __rvm_grep '^\s*rvm .*$' "$rvmrc" >/dev/null 2>&1
        then
          printf "%b" "
Error:
        $rvmrc is for rvm settings only.
        rvm CLI may NOT be called from within $rvmrc.
        Skipping the loading of $rvmrc"
          return 1
        else
          source "$rvmrc"
        fi
      fi
    done
    unset rvm_rvmrc_files
  fi
}

__rvm_cli_rvm_reload()
{
  __rvm_project_rvmrc_lock=0
  rvm_reload_flag=1
  source "${rvm_scripts_path:-${rvm_path}/scripts}/rvm"
}

__rvm_cli_version_check()
{
  \typeset disk_version
  disk_version="$( __rvm_version_installed )"

  if
    [[ -s "$rvm_path/VERSION" && "${rvm_version:-}" != "${disk_version:-}" && " $* " != *" reload "* ]]
  then
    if
      (( ${rvm_auto_reload_flag:-0} ))
    then
      __rvm_cli_rvm_reload
    else
      rvm_warn "RVM version <notify>${disk_version}</notify> is installed, yet version <error>${rvm_version}</error> is loaded.

Please open a new shell or run one of the following commands:

    <code>rvm reload</code>
    <code>echo rvm_auto_reload_flag=1 >> ~/.rvmrc</code> <comment># OR for auto reload with msg</comment>
    <code>echo rvm_auto_reload_flag=2 >> ~/.rvmrc</code> <comment># OR for silent auto reload</comment>
"
      return 1
    fi
  fi
}

__rvm_cli_autoupdate_version_old()
{
  online_version="$( __rvm_version_remote )"
  version_release="$(\command \cat "$rvm_path/RELEASE" 2>/dev/null)"
  : version_release:"${version_release:=master}"
  if [[ "${online_version}-next" == "${rvm_version%% *}" ]]; then # development version newer than latest release
    return 1
  fi
  [[ -s "$rvm_path/VERSION" && -n "${online_version:-}" ]] && __rvm_version_compare "${rvm_version%% *}" -lt "${online_version:-}" || return $?
}

__rvm_cli_autoupdate_warning()
{
  rvm_warn "Warning, new version of rvm available '${online_version}', you are using older version '${rvm_version%% *}'.
You can disable this warning with:   echo rvm_autoupdate_flag=0 >> ~/.rvmrc
You can enable auto-update with:     echo rvm_autoupdate_flag=2 >> ~/.rvmrc
You can update manually with:        rvm get VERSION                         (e.g. 'rvm get stable')
"
}

# duplication marker flnglfdjkngjndkfjhsbdjgfghdsgfklgg
rvm_install_gpg_setup()
{
  {
    rvm_gpg_command="$( \which gpg2 2>/dev/null )" &&
    [[ ${rvm_gpg_command} != "/cygdrive/"* ]]
  } || {
    rvm_gpg_command="$( \which gpg 2>/dev/null )" &&
    [[ ${rvm_gpg_command} != "/cygdrive/"* ]]
  } || rvm_gpg_command=""

  rvm_debug "Detected GPG program: '$rvm_gpg_command'"

  [[ -n "$rvm_gpg_command" ]] || return $?
}

# duplication marker rdjgndfnghdfnhgfdhbghdbfhgbfdhbn
verify_package_pgp()
{
  if
    "${rvm_gpg_command}" --verify "$2" "$1"
  then
    rvm_notify "GPG verified '$1'"
  else
    \typeset _return=$?

    rvm_error "\
GPG signature verification failed for '$1' - '$3'! Try to install GPG v2 and then fetch the public key:

    ${SUDO_USER:+sudo }${rvm_gpg_command##*/} --keyserver hkp://pool.sks-keyservers.net --recv-keys 409B6B1796C275462A1703113804BB82D39DC0E3 7D2BAF1CF37B13E2069D6956105BD0E739499BDB

or if it fails:

    command curl -sSL https://rvm.io/mpapis.asc | ${SUDO_USER:+sudo }${rvm_gpg_command##*/} --import -
    command curl -sSL https://rvm.io/pkuczynski.asc | ${SUDO_USER:+sudo }${rvm_gpg_command##*/} --import -

In case of further problems with validation please refer to https://rvm.io/rvm/security
"

    return ${_return}
  fi
}

__rvm_cli_get_and_verify_pgp()
{
  \typeset rvm_gpg_command

  if
    rvm_install_gpg_setup
  then
    pgp_signature_url="$( __rvm_curl -sSI https://get.rvm.io | \tr "\r" " " | __rvm_awk '/Location:/{print $2".asc"}' )"

    rvm_notify "Downloading $pgp_signature_url"

    __rvm_curl -s "${pgp_signature_url}" -o "${rvm_archives_path}/rvm-installer.asc" || return $?

    rvm_notify "Verifying ${rvm_archives_path}/rvm-installer.asc"

    verify_package_pgp "${rvm_archives_path}/rvm-installer" "${rvm_archives_path}/rvm-installer.asc" "$pgp_signature_url" || return $?
  else
    rvm_warn "No GPG software exists to validate rvm-installer, skipping."
  fi
}

__rvm_cli_get_installer_cleanup()
{
  [[ -w "${rvm_archives_path}" ]] ||
  {
    rvm_error "Archives path '${rvm_archives_path}' not writable, aborting."
    return 1
  }
  [[ ! -e "${rvm_archives_path}/rvm-installer" ]] ||
  rm -f "${rvm_archives_path}/rvm-installer" ||
  {
    rvm_error "Previous installer '${rvm_archives_path}/rvm-installer' exists and can not be removed, aborting."
    return 2
  }
}

__rvm_cli_get_and_execute_installer()
{
  __rvm_cli_get_installer_cleanup || return $?

  rvm_log "Downloading https://get.rvm.io"
  __rvm_curl -s https://get.rvm.io -o "${rvm_archives_path}/rvm-installer" ||
  {
    \typeset _ret=$?
    rvm_error "Could not download rvm-installer, please report to https://github.com/rvm/rvm/issues"
    return ${_ret}
  }

  __rvm_cli_get_and_verify_pgp || return $?

  bash "${rvm_archives_path}/rvm-installer" "$@" ||
  {
    \typeset _ret=$?
    rvm_error "Could not update RVM, please report to https://github.com/rvm/rvm/issues"
    return ${_ret}
  }
}

__rvm_cli_rvm_get()
{
  case "$1" in
    ([0-9]*.[0-9]*.[0-9]*)
      rvm_warn "
Hi there, it looks like you have requested updating rvm to version $1,
if your intention was ruby installation use instead: rvm install $1
"
      ;;
  esac
  case "$1" in
    (stable|master|head|branch|latest|latest-*|[0-9]*.[0-9]*.[0-9]*)
      __rvm_cli_get_and_execute_installer "$@" || return $?

      \typeset -x rvm_hook
      rvm_hook="after_update"
      source "${rvm_scripts_path:-"$rvm_path/scripts"}/hook"

      rvm_reload_flag=1
      ;;
    (*)
      rvm_help get
      ;;
  esac
}

__rvm_cli_autoupdate_execute()
{
  printf "%b" "Found old RVM ${rvm_version%% *} - updating.\n"
  __rvm_cli_rvm_get "${version_release}" || return $?
  __rvm_cli_rvm_reload
}

__rvm_cli_autoupdate()
{
  [[ " $* " == *" install "* && " $* " != *" help install "* ]] ||
  [[ " $* " == *" list known "* ]] ||
  return 0

  \typeset online_version version_release
  case "${rvm_autoupdate_flag:-1}" in
    (0|disabled)
      true
      ;;
    (1|warn)
      if __rvm_cli_autoupdate_version_old
      then __rvm_cli_autoupdate_warning
      fi
      ;;
    (2|enabled)
      if __rvm_cli_autoupdate_version_old
      then __rvm_cli_autoupdate_execute || return $?
      fi
      ;;
  esac
  true
}

__rvm_cli_autoreload()
{
  if
    [[ ${rvm_reload_flag:-0} -eq 1 ]]
  then
    if
      [[ -s "$rvm_scripts_path/rvm" ]]
     then
      __rvm_project_rvmrc_lock=0
      source "$rvm_scripts_path/rvm"
    else
      echo "rvm not found in $rvm_path, please install and run 'rvm reload'"
      __rvm_teardown
    fi
  else
    __rvm_teardown
  fi
}

__rvm_cli_install_ruby()
(
  if
    [[ -n "$1" ]]
  then
    \typeset __rubies __installed __missing __search_list
    \typeset -a __search
    __rvm_custom_separated_array __search , "$1"
    __rubies="$1"
    __search_list=""
    __rvm_cli_rubies_select || return $?
    if __rvm_cli_rubies_not_installed
    then __rvm_run_wrapper manage install "${__rubies}" || return $?
    fi
  else
    rvm_error "Can not use or install 'all' rubies. You can get a list of installable rubies with 'rvm list known'."
    false #report error
  fi
)

__rvm_cli_rubies_select()
{
  \typeset __ruby
  for __ruby in "${__search[@]}"
  do
    rvm_ruby_string="${__ruby}"
    __rvm_select &&
    if [[ -n "$rvm_ruby_string" ]]
    then __search_list+="^$rvm_ruby_string\$|"
    else
      rvm_error "Could not detect ruby version/name for installation '${__ruby}', please be more specific."
      return 1
    fi
  done
  __search_list="${__search_list%|}"
}

__rvm_cli_rubies_not_installed()
{
  if
    (( ${rvm_force_flag:-0} == 0 )) &&
    __installed="$(
      __rvm_list_strings | __rvm_grep -E "${__search_list}"
    )" &&
    [[ -n "${__installed}" ]]
  then
    rvm_warn "Already installed ${__installed//|/,}.
To reinstall use:

    rvm reinstall ${__installed//|/,}
"
    return 2
  fi
  true
}
src/rvm/scripts/functions/selector_late000066400000002701147511530550014416 0ustar00#!/usr/bin/env bash

__rvm_select_late()
{
  if
    is_a_function __rvm_select_late_${rvm_ruby_interpreter}
  then
    __rvm_select_late_${rvm_ruby_interpreter}
  fi
}

__rvm_select_late_rbx_partial()
{
  \typeset __found __ext __patern
  __ext=".${rvm_archive_extension}"
  __patern="${2//\./\.}.*\.${rvm_archive_extension//\./\.}\$"
  __found="$(
    __rvm_curl -s $1/index.txt "rubinius-" |
    __rvm_awk -F"${__ext}" "/${__patern}/"'{print $1}' |
    __rvm_version_sort |
    __rvm_tail -n 1
  )"
  if
    [[ -n "${__found}" ]]
  then
    rvm_ruby_version="${__found#rubinius-}"
    rvm_ruby_string="rbx-${rvm_ruby_version}"
    rvm_ruby_package_file="${__found}"
    rvm_ruby_url="$1/${__found}.${rvm_archive_extension}"
    return 0
  else
    return 1
  fi
}

__rvm_select_late_rbx()
{
  if
    {
      [[ -n "${rvm_ruby_package_file:-}" &&
         -f "${rvm_archives_path}/${rvm_ruby_package_file}" &&
         -s "${rvm_archives_path}/${rvm_ruby_package_file}" ]]
    } ||
    {
      [[ -n "${rvm_ruby_url:-}" ]] &&
      file_exists_at_url "${rvm_ruby_url}"
    } ||
    {
      [[ -n "${rbx_url:-}" && -n "${rvm_ruby_version:-}" ]] &&
      __rvm_select_late_rbx_partial "${rbx_url}" "${rvm_ruby_version}"
    }
  then
    rvm_head_flag=0
  else
    rvm_head_flag=1
    if [[ "${rvm_ruby_version}" == 'head' ]]
    then true ${rvm_ruby_repo_branch:="master"}
    else true ${rvm_ruby_repo_branch:="master"} ${rvm_ruby_tag:="${rvm_ruby_version}"}
    fi
  fi
}
src/rvm/scripts/functions/reset000066400000002626147511530550012721 0ustar00#!/usr/bin/env bash

# Reset any rvm gathered information about the system and its state.
# rvm will refresh the stored information the next time it is called after reset.
__rvm_reset()
{
  \typeset flag flags file files config configs variable

  __rvm_remove_rvm_from_path ; __rvm_conditionally_add_bin_path

  export PATH

  builtin hash -r

  flags=( default passenger editor )

  for flag in "${flags[@]}"; do

    \command \rm -f "${rvm_bin_path}"/${flag}_*

  done

  for file in system default ; do

    if [[ -f "$rvm_path/${file}" ]] ; then
      \command \rm -f "$rvm_path/${file}"
    fi

    if [[ -f "$rvm_path/config/${file}" ]] ; then
      \command \rm -f "$rvm_path/config/${file}"
    fi

    if [[ -f "$rvm_environments_path/${file}" ]] ; then
      \command \rm -f "$rvm_environments_path/${file}"
    fi

  done

  # Go back to a clean state.
  __rvm_use_system

  __rvm_unset_ruby_variables

  __rvm_unset_exports

  configs=(system_ruby system_gem_path system_user_gem_path)

  for system_config in "${configs[@]}"
  do
    __rvm_db_ "$rvm_user_path/db" "$system_config" "delete"
  done

  files=(ruby gem rake irb $(__rvm_cd "${rvm_bin_path}" ; \
    __rvm_find . -mindepth 1 -maxdepth 1 -iname 'default*' -type f \
    | __rvm_sed -e 's#./##g'))

  for file in "${files[@]}"; do

    if [[ -f "${rvm_bin_path}/$file" ]] ; then

      \command \rm -f "${rvm_bin_path}/$file"

    fi

  done

  return 0
}
src/rvm/scripts/functions/version000077500000001275147511530550013266 0ustar00#!/usr/bin/env bash

__rvm_version()
{
  echo "rvm $(__rvm_version_installed) by $(__rvm_version_authors) [$(__rvm_version_website)]"
}

__rvm_version_website()
{
  echo "https://rvm.io"
}

__rvm_version_authors()
{
  echo "Michal Papis, Piotr Kuczynski, Wayne E. Seguin"
}

__rvm_version_copyright()
{
  echo "(c) 2009-2020 $(__rvm_version_authors)"
}

__rvm_print_headline()
{
  rvm_log "Ruby enVironment Manager ${rvm_version} $(__rvm_version_copyright)
"
}

__rvm_version_remote()
{
  __rvm_curl -s --max-time 10 https://github.com/rvm/rvm/raw/stable/VERSION || true
}

__rvm_version_installed()
{
  echo "$(\command \cat "$rvm_path/VERSION") ($(\command \cat "$rvm_path/RELEASE" 2>/dev/null))"
}
src/rvm/scripts/functions/build_config000077500000025767147511530550014241 0ustar00#!/usr/bin/env bash

__rvm_setup_compile_environment()
{
  \typeset __type
  \typeset -a __types
  __types=(
    setup movable_early system_early requirements
    movable parse_name system architectures gcc47plus bison
    flags_docs flags_shared_static flags_threads compatibility_flag
  )
  for __type in "${__types[@]}"
  do
    rvm_debug "__rvm_setup_compile_environment_${__type} $1"
    __rvm_setup_compile_environment_${__type} "$1" || return $?
  done
  rvm_debug "found compiler: $( __rvm_found_compiler )"
}

__rvm_setup_compile_environment_setup()
{
  __rvm_autolibs_get
  rvm_debug "rvm_autolibs_flag=${rvm_autolibs_flag}"

  __rvm_autolibs_translate || return $?
  [[ -n "${rvm_autolibs_flag_number:-}" ]] || return $?

  export initially_selected_compiler="$( __rvm_selected_compiler )"
  true
}

__rvm_setup_compile_environment_movable_early()
{
  (( ${rvm_movable_flag:-0} > 0 ))  || return 0
  case "${_system_type}" in
    (BSD)
      rvm_error "It is not yet supported to build movable rubies on *BSD systems."
      return 3
      ;;
    (Darwin)
      case "$1" in
        ruby-2*|ruby-head*) true ;;
        (*)
          if
            (( ${rvm_force_flag:-0} > 0 ))
          then
            true # allow forcing installation of older rubies
          else
            rvm_error "Only MRI Ruby 2.0+ can be compiled movable with RVM on OSX,
use '--force' if the binary will be moved to the same installation path."
            return 2
          fi
          ;;
      esac
      [[ "${rvm_autolibs_flag_runner}" == "smf" ]] ||
      {
        rvm_error "It is not yet supported to build movable rubies with '${rvm_autolibs_flag}',
please install SMF and switch autolibs to it (make sure to follow any displayed instructions):

    curl -L https://get.smf.sh | sh
    rvm autolibs smf
"
        return 3
      }
      export rvm_static_flag=1
      ;;
    (*)
      case "$1" in
        ruby-1.9.3*|ruby-2*|ruby-3*|ruby-head*) true ;;
        (*)
          rvm_error "Only MRI Ruby 1.9.3+ can be compiled movable with RVM"
          return 2
          ;;
      esac
      ;;
  esac
}

__rvm_setup_compile_environment_system_early()
{
  if   is_a_function __rvm_setup_compile_environment_system_early_${_system_name}
  then __rvm_setup_compile_environment_system_early_${_system_name} "$@" || return $?
  fi
}

#
# rvm_autolibs_flag
# - 0 - disabled
# - 1 - use libs, do not install
# - 2 - use libs, fail if missing - default
# - 3 - use libs, install if missing, fallback to 2 if brew not writable
# - 4 - 3 + install package manager if not available
#
__rvm_setup_compile_environment_requirements()
{
  (( ${rvm_autolibs_flag_number} > 0 ))  || return 0
  rvm_log "Checking requirements for ${rvm_autolibs_flag_runner}."
  if
    __rvm_requirements_run ${rvm_autolibs_flag_runner} "$@"
  then
    rvm_log "Requirements installation successful."
  else
    \typeset __status=$?
    [[ ${rvm_quiet_flag} == 1 ]] || rvm_error "Requirements installation failed with status: ${__status}."
    return ${__status}
  fi
}

__rvm_setup_compile_environment_parse_name()
{
  case "${rvm_ruby_name:-}" in
    (clang) true ${CC:=clang} ;;
  esac
}

__rvm_setup_compile_environment_movable()
{
  (( ${rvm_movable_flag:-0} > 0 ))  || return 0
  case "${_system_type}" in
    (Darwin)
      rvm_configure_flags+=(
        --enable-load-relative --with-static-linked-ext
        --with-out-ext=dl/win32,fiddle/win32,tk/tkutil,tk,win32ole,-test-/win32/dln,-test-/win32/fd_setsize
      )
      rvm_patch_names+=( osx_static )
      ;;
    (*)
      rvm_configure_flags+=( --enable-load-relative )
      ;;
  esac
  rvm_configure_flags+=( --sysconfdir=/etc )
}

__rvm_setup_compile_environment_bison()
{
  (( ${rvm_autolibs_flag_number} > 1 )) || return 0
  case "$1" in
    (ruby*|ree*|rbx*)
      __rvm_check_for_bison ||
      {
        result=$?
        rvm_error "Bison required but not found. Halting."
        return $result
      }
      ;;
  esac
}

__rvm_setup_compile_environment_architectures_osx_map()
{
  \typeset _architecture
  \typeset _prefix="${1:-}"
  \typeset -a _architectures
  _architectures=()
  for _architecture in "${rvm_architectures[@]}"
  do
    case "${_architecture}" in
      (32)  _architecture="i386"   ;;
      (64)  _architecture="x86_64" ;;
    esac
    _architectures+=( "${_prefix}${_architecture}" )
  done
  rvm_architectures=( "${_architectures[@]}" )
}

__rvm_setup_compile_environment_architectures_ruby_osx()
{
  \typeset -a _flags
  _flags=(
    MACOSX_DEPLOYMENT_TARGET="$( sw_vers -productVersion | __rvm_awk -F'.' '{print $1"."$2}' )"
    CFLAGS="$1 -g -Os -pipe -no-cpp-precomp"
    CCFLAGS="$1 -g -Os -pipe"
    CXXFLAGS="$1 -g -Os -pipe"
    LDFLAGS="$1 -bind_at_load"
    LDSHARED="cc $1 -dynamiclib -undefined suppress -flat_namespace"
  )
  __rvm_update_configure_env "${_flags[@]}"
  __rvm_array_contains "*osx-arch-fix*" "${rvm_patch_names[@]}" || rvm_patch_names+=( osx-arch-fix )
}

__rvm_setup_compile_environment_architectures_OSX()
{
  case "$1" in
    ruby-1.9*|ruby-2*|ruby-head*)
      # Ruby 1.9+ supports the easy way
      __rvm_setup_compile_environment_architectures_osx_map
      rvm_configure_flags+=( --with-arch="${rvm_architectures[*]}" )
      ;;
    ruby*|ree*)
      __rvm_setup_compile_environment_architectures_osx_map "-arch "
      __rvm_setup_compile_environment_architectures_ruby_osx "${rvm_architectures[*]}"
      ;;
    (*)
      __rvm_setup_compile_environment_architectures_osx_map "-arch "
      __rvm_update_configure_env_arch "${rvm_architectures[*]}"
      rvm_configure_flags+=( --disable-dependency-tracking )
      ;;
  esac
}

__rvm_setup_compile_environment_architectures_Other()
{
  (( ${#rvm_architectures[@]} == 1 )) ||
  {
    rvm_error "Only OSX supports fat binaries, any other system supports only single architecture, please be more specific."
    return 1
  }
  \typeset _architecture
  case  "${rvm_architectures[*]}" in
    (i386)   _architecture=( -m32 ) ;;
    (x86_64) _architecture=( -m64 ) ;;
    (32|64)  _architecture=( -m${rvm_architectures[*]}      ) ;;
    (*)      _architecture=( -march=${rvm_architectures[*]} ) ;;
  esac
  __rvm_update_configure_env_arch ${_architecture}

  # Ruby 2+ supports also platform setting needed for different os/kernel architectures, see #2928
  case "$1" in
    ruby-2*|ruby-head*)
      case  "${rvm_architectures[*]}" in
        (32|i386)   rvm_configure_flags+=( --with-arch="i686"   ) ;;
        (64|x86_64) rvm_configure_flags+=( --with-arch="x86_64" ) ;;
      esac
      ;;
  esac
}

__rvm_setup_compile_environment_architectures()
{
  rvm_debug "rvm_architectures(${#rvm_architectures[@]}):${rvm_architectures[*]}."
  (( ${#rvm_architectures[@]} > 0 )) || return 0
  if   is_a_function __rvm_setup_compile_environment_architectures_${_system_name}
  then __rvm_setup_compile_environment_architectures_${_system_name} "$@" || return $?
  else __rvm_setup_compile_environment_architectures_Other           "$@" || return $?
  fi
}

__rvm_setup_compile_environment_gcc47plus()
{
  __rvm_compiler_version_or_higher "4.7"      || return 0
  __rvm_string_match "$1" "ruby-1.8.*" "ree*" || return 0

  # -g -O2 from 1.8.7-p370 is not enough, need all the flags to fix it
  __rvm_update_configure_env CFLAGS="-O2 -fno-tree-dce -fno-optimize-sibling-calls"
}

__rvm_setup_compile_environment_system()
{
  if   is_a_function __rvm_setup_compile_environment_system_${_system_name}
  then __rvm_setup_compile_environment_system_${_system_name} "$@" || return $?
  elif is_a_function __rvm_setup_compile_environment_system_${_system_type}
  then __rvm_setup_compile_environment_system_${_system_type} "$@" || return $?
  fi
}

__rvm_setup_compile_environment_flags_docs()
{
  # disable docs, see https://github.com/rvm/rvm/issues/2656
  # enable docs on OSX by default (that's development system)
  # if [[ "Darwin" == "${_system_type}" ]]
  # then : rvm_docs_flag=${rvm_docs_flag:=1}
  # fi

  # handle docs flag, docs are enabled by default, lets disable this
  (( ${rvm_docs_flag:-0} == 1 )) ||
  {
    case "$1" in
      (ruby*|ree*) rvm_configure_flags+=( --disable-install-doc ) ;;
    esac
  }
  true # OSX --trace FIX
}

__rvm_setup_compile_environment_flags_static_darwin()
{
  if
    [[ "${_system_type}" == "Darwin" ]]
  then
    __rvm_update_configure_env CFLAGS="-fPIC -mmacosx-version-min=10.7" LDFLAGS="-fPIC" "$@"
    rvm_configure_flags+=( --with-arch=x86_64 )
  fi
}

__rvm_setup_compile_environment_flags_shared_static()
{
  if
    (( ${rvm_static_flag:-0} == 1 ))
  then
    case "$1" in
      (openssl*)
        rvm_configure_flags+=( no-shared )
        __rvm_setup_compile_environment_flags_static_darwin
        ;;
      (ncurses*)
        rvm_configure_flags+=( --without-shared )
        __rvm_setup_compile_environment_flags_static_darwin
        ;;
      (rbx*|rubinius*|jruby*)
        true # no flag yet for rbx, does not apply to jruby!
        ;;
      (*)
        rvm_configure_flags+=( --disable-shared )
        __rvm_setup_compile_environment_flags_static_darwin LDFLAGS="-Bstatic -lz"
        ;;
    esac
  else
    case "$1" in
      (openssl*)
        rvm_configure_flags+=( shared )
        ;;
      (readline*)
        rvm_configure_flags+=( --disable-static --enable-shared )
        ;;
      (ncurses*)
        rvm_configure_flags+=( --with-shared )
        ;;
      (rbx*|rubinius*|jruby*)
        true # no flag yet for rbx, does not apply to jruby!
        ;;
      (*)
        [[ "${rvm_configure_flags[*]}" == *--disable-shared* ]] ||
          rvm_configure_flags+=( --enable-shared )
        ;;
    esac
  fi
  true # OSX --trace FIX
}

__rvm_detect_max_threads()
{
  case "${_system_name}" in
    (OSX|Darwin|FreeBSD|DragonFly)
      if
        __rvm_which sysctl >/dev/null
      then
        \command \sysctl -n hw.ncpu
      elif
        [[ -x /usr/sbin/sysctl ]]
      then
        /usr/sbin/sysctl -n hw.ncpu
      elif
        [[ -x /sbin/sysctl ]]
      then
        /sbin/sysctl -n hw.ncpu
      else
        echo 1
      fi
      ;;
    (*)
      \command \cat /proc/cpuinfo 2>/dev/null | (\command \grep vendor_id || \command \echo 'one';) | \command \wc -l
      ;;
  esac
}

__rvm_setup_compile_environment_flags_threads()
{
  case "$1" in
    (openssl*)
      # Don't use -j option for make OpenSSL
      __rvm_remove_from_array rvm_make_flags "-j*" "${rvm_make_flags[@]}"
      rvm_make_flags+=( -j1 )
      ;;
    (*)
      if [[ "${_system_name}" == "FreeBSD" || "${_system_name}" == "DragonFly" ]]
      then rvm_make_flags+=( -B )
      fi
      if [[ " ${rvm_make_flags[*]}" == *" -j"* ]]
      then rvm_warn "Found user configured '-j' flag in 'rvm_make_flags', please note that RVM can detect number of CPU threads and set the '-j' flag automatically if you do not set it."
      else rvm_make_flags+=( -j$(__rvm_detect_max_threads) )
      fi
      ;;
  esac
}

__rvm_setup_compile_environment_compatibility_flag()
{
  case "$1" in
    (jruby*)
      for mode in 2.1 2.0 1.9 1.8
      do
        eval "
          if
            [[ \${rvm_${mode//./}_flag:-0} == 1 ]]
          then
            rvm_configure_flags+=( -Djruby.default.ruby.version=${mode} )
            break
          fi
        "
      done
      ;;
  esac
}
src/rvm/scripts/functions/utility_logging000066400000015046147511530550015010 0ustar00#!/usr/bin/env bash

__rvm_log_command_caclulate_log_timestamp()
{
  export rvm_log_timestamp="$(__rvm_date "+%s")"
  rvm_debug "Log prefix: ${rvm_log_path}/${rvm_log_timestamp}${rvm_ruby_string:+_}${rvm_ruby_string:-}/"
}

__rvm_log_command_caclulate_log_filesystem()
{
  export rvm_log_filesystem="$(
    __rvm_mount 2>/dev/null | __rvm_awk -v rvm_path=$rvm_path '
      BEGIN{longest=""; fstype=""}
      {if (index(rvm_path,$3)==1 && length($3)>length(longest)){longest=$3; fstype=$5}}
      END{print fstype}
    '
  )"
  rvm_debug "Log filesystem: ${rvm_log_filesystem}"
}

__rvm_log_command_caclulate_log_namelen()
{
  case "${rvm_log_filesystem}" in
    (ecryptfs) export rvm_log_namelen=138 ;;
    (*)        export rvm_log_namelen=250 ;;
  esac
  rvm_debug "Log max name length: ${rvm_log_namelen}"
}

__rvm_log_command_caclulate_log_file_name()
{
  [[ -n "${rvm_log_timestamp:-}"  ]] || __rvm_log_command_caclulate_log_timestamp
  [[ -n "${rvm_log_filesystem:-}" ]] || __rvm_log_command_caclulate_log_filesystem
  [[ -n "${rvm_log_namelen:-}"    ]] || __rvm_log_command_caclulate_log_namelen
  name="${name//[ \/]/_}"
  _log="${rvm_log_path}/${rvm_log_timestamp}${rvm_ruby_string:+_}${rvm_ruby_string:-}/${name}"
  if [[ -n "${ZSH_VERSION:-}" ]]
  then _log="${_log[0,${rvm_log_namelen}]}.log"
  else _log="${_log:0:${rvm_log_namelen}}.log"
  fi
}

# Run a specified command and log it (once).
__rvm_log_command()
{
  \typeset name message _command_start _command_name
  \typeset -a _command

  name="${1:-}"
  message="${2:-}"
  shift 2
  _command=( "$@" )   # store full command so we can manipulate it
  _command_start="$1" # store first part so we can detect variables
  while (( $# )) && [[ "$1" == *"="* ]] # skip variables from beginning
  do shift
  done
  _command_name="$1"  # store the real command so we can detect functions

  [[ "${_command_start}" != *"="* ]] || _command=( "env" "${_command[@]}" )
  if __function_on_stack __rvm_log_command_internal
  then __rvm_log_command_simple   "$@" || return $?
  else __rvm_log_command_internal "$@" || return $?
  fi
}

# basic debugging information for the command
__rvm_log_command_debug()
{
  printf "%b" "[$(__rvm_date +'%Y-%m-%d %H:%M:%S')] ${_command_name}\n"
  if is_a_function "${_command_name}"
  then \typeset -f  "${_command_name}"
  fi
  printf "%b" "current path: $PWD\n"
  env | __rvm_grep -E '^GEM_HOME=|^GEM_PATH=|^PATH='
  printf "%b" "command(${#_command[@]}): ${_command[*]}\n"
}

# Run a specified command and do not log it again.
__rvm_log_command_simple()
{
  __rvm_log_command_debug
  rvm_log "$message"
  "$@" || return $?
}

# Run a specified command and log it.
__rvm_log_command_internal()
{
  \typeset _log

  (( ${rvm_niceness:-0} == 0 ))      || _command=( nice -n $rvm_niceness "${_command[@]}" )

  __rvm_log_command_caclulate_log_file_name
  rvm_debug "Log file: ${_log}"

  [[ -d "${_log%\/*}" ]] || \command \mkdir -p "${_log%\/*}"
  [[ -f "${_log}"     ]] || \command \rm -f "${_log}"

  __rvm_log_command_debug | tee "${_log}" | rvm_debug_stream

  __rvm_log_dotted "${_log}" "$message" "${_command[@]}" ||
  {
    \typeset result=$?
    \typeset __show_lines="${rvm_show_log_lines_on_error:-0}"
    rvm_error "Error running '${_command[*]}',"
    case "${__show_lines}" in
      (0)
        rvm_error "please read ${_log}"
        ;;
      (all)
        rvm_error "content of log ${_log}"
        cat "${_log}" >&6
        ;;
      (*)
        rvm_error "showing last ${__show_lines} lines of ${_log}"
        tail -n "${__show_lines}" "${_log}" >&6
        ;;
    esac
    return ${result}
  }
}

__rvm_debug_command()
{
  rvm_debug "Running($#): $*"
  "$@" || return $?
}

__rvm_pager_or_cat_v()
{
  eval "${PAGER:-\command \cat} '$1'"
}

__rvm_ask_for()
{
  \typeset response
  rvm_warn "$1"
  printf "%b" "(anything other than '$2' will cancel) > "

  # need and IF to properly handle CTRL+C ... wtf?
  if read response && [[ "$2" == "$response" ]]
  then return 0
  else return 1
  fi
}

__rvm_dotted()
{
  set +x
  \typeset flush

  if (( $# ))
  then printf "%b" "${rvm_notify_clr:-}$*${rvm_reset_clr:-}"
  fi

  if __rvm_awk '{fflush;}' <<<EO 2>/dev/null
  then flush=fflush
  else flush=flush
  fi

  # the nasty '${flush}' inside is for compatibility,
  # old awk does not allow running function from variable
  awk -v go_back="$( tput cub1 2>/dev/null || true)" \
'
  BEGIN{
    spin[0]="|"go_back;
    spin[1]="/"go_back;
    spin[2]="-"go_back;
    spin[3]="\\"go_back }
  {
    if ((NR-1)%(10)==9)
      printf ".";
    else
      if (go_back!="") printf spin[(NR-1)%4];
    '${flush}' }
  END{
    print "." }
  '
}

__rvm_log_dotted()
{
  \typeset __log_file __message __iterator __result __local_rvm_trace_flag
  __log_file="$1"
  __message="$2"
  shift 2
  __result=0
  __local_rvm_trace_flag=${rvm_trace_flag:-0}
  if
    (( ${rvm_trace_flag:-0} ))
  then
    {
      set -x
      "$@" 2>&1 | tee -a "${__log_file}"
      __rvm_check_pipestatus ${PIPESTATUS[@]} ${pipestatus[@]} || __result=$?
      (( __local_rvm_trace_flag > 0 )) || set +x
    } 1>&2
  elif
    [[ -n "${ZSH_VERSION:-}" ]]
  then
    rvm_log "${__message} - please wait"
    {
      set -x
      "$@" > "${__log_file}" 2>&1 || __result=$?
      (( __local_rvm_trace_flag > 0 )) || set +x
    } 2>/dev/null
  else
    {
      set -x
      "$@" 2>&1 | tee -a "${__log_file}" | __rvm_dotted "${__message}"
      __rvm_check_pipestatus ${PIPESTATUS[@]} ${pipestatus[@]} || __result=$?
      (( __local_rvm_trace_flag > 0 )) || set +x
    } 2>/dev/null
  fi
  return $__result
}

__rvm_check_pipestatus()
{
  for __iterator
  do
    case "${__iterator}" in
      ("") true ;;
      (0)  true ;;
      (*)  return ${__iterator} ;;
    esac
  done
  return 0
}

__rvm_wait_anykey()
{
  if [[ -n "${1:-}" ]]
  then echo "$1"
  fi
  \typeset _read_char_flag
  if [[ -n "${ZSH_VERSION:-}" ]]
  then _read_char_flag=k
  else _read_char_flag=n
  fi
  builtin read -${_read_char_flag} 1 -s -r anykey
}

__rvm_table_br()
{
  \typeset width=${COLUMNS:-78}
  width=$(( width > 116 ? 116 : width ))
  printf "%-${width}s\n" " " | __rvm_sed 's/ /*/g'
}

__rvm_fold()
{
  if fold -s -w 10 <<<bla >/dev/null
  then fold -s -w $1
  else fold    -w $1
  fi
}

__rvm_table_wrap_text()
{
  \typeset width=${COLUMNS:-78}
  width=$(( width > 116 ? 116 : width ))
  width=$(( width - 4 )) # "* <content> *"
  __rvm_fold $width | __rvm_awk -v width=$width '{printf "* %-"width"s *\n", $0}'
}

# echo text | __rvm_table [header]
__rvm_table()
{
  if
    [[ -n "${1:-}" ]]
  then
    __rvm_table_br
    echo "$1" | __rvm_table_wrap_text
  fi
  __rvm_table_br
  \command \cat "${2:--}" | __rvm_table_wrap_text
  __rvm_table_br
}
src/rvm/scripts/functions/install000066400000002565147511530550013247 0ustar00#!/usr/bin/env bash

__rvm_record_install()
{
  [[ -n "$1" ]] || return

  \typeset recorded_ruby_name rvm_install_record_file
  recorded_ruby_name="$( "$rvm_scripts_path/tools" strings "$1" )"
  rvm_install_record_file="$rvm_user_path/installs"

  [[ -f "$rvm_install_record_file" ]] || \command \touch "$rvm_install_record_file"
  __rvm_sed_i "$rvm_install_record_file" -e "/^$recorded_ruby_name/d"

  #TODO: use `for` so  rvm_configure_flags are quoted properly
  printf "%b" "$recorded_ruby_name -- ${rvm_configure_flags[*]}\n" >> "$rvm_install_record_file"
}

__rvm_remove_install_record()
{
  \typeset recorded_ruby_name rvm_install_record_file
  recorded_ruby_name="$( "$rvm_scripts_path/tools" strings "$1" )"
  rvm_install_record_file="$rvm_user_path/installs"

  if [[ -s "$rvm_install_record_file" ]]
  then __rvm_sed_i "$rvm_install_record_file" -e "/^$recorded_ruby_name/d"
  fi
}

__rvm_recorded_install_command()
{
  \typeset recorded_ruby_name
  recorded_ruby_name="$( "$rvm_scripts_path/tools" strings "$1" )"
  recorded_ruby_name=${recorded_ruby_name%%${rvm_gemset_seperator:-"@"}*}

  [[ -n "$recorded_ruby_name" ]] || return 1

  if
    [[ -s "$rvm_user_path/installs" ]] &&
    __rvm_grep "^$recorded_ruby_name " "$rvm_user_path/installs" >/dev/null 2>&1
  then
    __rvm_grep "^$recorded_ruby_name " "$rvm_user_path/installs" | \command \head -n 1
  else
    return 1
  fi
}
src/rvm/scripts/functions/version-installed-when000066400000001767147511530550016205 0ustar00#!/usr/bin/env bash

__rvm_version_installed_when()
{
  \typeset installed_at years months days hours minutes seconds part

  installed_at="$(\command \cat ${rvm_path}/installed.at)"

  if
    [[ -n "${installed_at:-}" ]] && (( installed_at ))
  then
    seconds="$(( $(__rvm_date +%s) - installed_at ))"
    if
      (( seconds ))
    then
      minutes="$(( seconds / 60 % 60 ))"
      hours="$(( seconds / 3600 % 24 ))"
      days="$(( seconds / 86400 % 31 ))"
      months="$(( seconds / 2678400 % 12 ))"
      years="$(( seconds / 31536000 ))"
      seconds="$(( seconds % 60 ))"

      installed_at=""
      for part in year month day hour minute second
      do
        partvar="${part}s"
        (( ${!partvar} )) || continue
        installed_at="${installed_at}${!partvar} ${part}$( (( ${!partvar} == 1 )) || echo "s") "
      done
      installed_at="${installed_at}ago"
    else
      installed_at="just now"
    fi
  else
    installed_at="can not read installation time"
  fi

  echo ${installed_at}
}src/rvm/scripts/functions/build_requirements000077500000020717147511530550015505 0ustar00#!/usr/bin/env bash

source "$rvm_scripts_path/functions/build_requirements_helpers"
source "$rvm_scripts_path/functions/build_undesired_helpers"

__rvm_requirements_run()
{
  \typeset -a packages_installed packages_missing packages_to_install packages_flags
  \typeset -a packages_undesired packages_to_remove
  \typeset -a packages_custom packages_custom_after
  \typeset __type __lib_type __iterator
  __type=$1
  __lib_type=$1
  shift

  for __iterator in load reset before define summary remove before_update update custom install custom_after after
  do
    __rvm_requirements_run_${__iterator} "$@" || return $?
  done
}

__rvm_requirements_run_load()
{
  if
    is_a_function requirements_${__type}_before ||
    is_a_function requirements_${__type}_define
  then
    rvm_debug "requirements code for ${__type} already loaded"
  else
    [[ -s "$rvm_scripts_path/functions/requirements/${__type}" ]] ||
    {
      rvm_error "Requirements support for ${__type} is not implemented yet,
report a bug here => https://github.com/rvm/rvm/issues"
      return 1
    }
    source "$rvm_scripts_path/functions/requirements/${__type}"
    if
      is_a_function requirements_${__type}_before ||
      is_a_function requirements_${__type}_define
    then
      rvm_debug "requirements code for ${__type} loaded"
    else
      rvm_error "Failed loading requirements for ${__type}!"
      return 1
    fi
  fi
}

__rvm_requirements_run_reset()
{
  packages_installed=()
  packages_missing=()
  packages_to_install=()
  packages_flags=()
  packages_undesired=()
  packages_to_remove=()
  packages_custom=()
  packages_custom_after=()
}

__rvm_requirements_run_before()
{
  if is_a_function requirements_${__type}_before
  then requirements_${__type}_before "$@" || return $?
  fi
  if [[ "${__lib_type}" != "${__type}" ]]
  then rvm_debug "requirements lib type set to ${__lib_type}"
  fi
  if [[ "${__lib_type}" != "${__type}" ]] && is_a_function requirements_${__lib_type}_before
  then requirements_${__lib_type}_before "$@" || return $?
  fi
  true # for osx
}

__rvm_requirements_run_define()
{
  \typeset -a list
  \typeset element __handler
  if is_a_function requirements_${__lib_type}_define
  then __handler=requirements_${__lib_type}_define
  else __handler=requirements_${__type}_define
  fi

  list=( rvm )
  while (( $# )) && [[ -z "$1" ]]
  do shift
  done
  if (( $# ))
  then list+=( "$@" )
  else list+=( ruby )
  fi

  for element in "${list[@]}"
  do ${__handler} "${element}" || return $?
  done
  true
}

__rvm_requirements_run_summary_custom()
{
  if (( ${rvm_autolibs_flag_number} > 2 ))
  then rvm_debug "Install $1 packages: ${_list// /, }."
  fi
  rvm_requiremnts_fail_or_run_action 3 "Missing $1 packages: ${_list}" true ||
    return $?
  true
}

__rvm_requirements_run_summary()
{
  \typeset __summary_status=0

  (( ${#packages_custom[@]} == 0 )) ||
  {
    _list="${packages_custom[*]}"
    __rvm_requirements_run_summary_custom "custom" ||
      __summary_status=$?
  }
  (( ${#packages_installed[@]} == 0 )) ||
  {
    if (( ${rvm_list_installed_packages_flag:-0} == 1 ))
    then
      requirements_print_list ${packages_installed[*]}
    fi
    _list="${packages_installed[*]}"
    rvm_debug "Found required packages: ${_list// /, }."
  }
  (( ${#packages_missing[@]} == 0 )) ||
  {
    if (( ${rvm_list_missing_packages_flag:-0} == 1 ))
    then
      requirements_print_list ${packages_missing[*]}
      __summary_status=1
    else
    _list="${packages_missing[*]}"
    rvm_requiremnts_fail_or_run_action 2 \
      "Missing required packages: ${_list}" true ||
      __summary_status=$?
    fi
  }
  (( ${#packages_undesired[@]} == 0 )) ||
  {
    if (( ${rvm_list_undesired_packages_flag:-0} == 1 ))
    then
      requirements_print_list ${packages_undesired[*]}
      __summary_status=1
    else
    _list="${packages_undesired[*]}"
    rvm_requiremnts_fail_or_run_action 2 \
      "Found undesired packages: ${_list}" true ||
      __summary_status=$?
    fi
  }
  (( ${#packages_custom_after[@]} == 0 )) ||
  {
    _list="${packages_custom_after[*]}"
    __rvm_requirements_run_summary_custom "custom after" ||
      __summary_status=$?
  }
  return ${__summary_status}
}

__rvm_requirements_run_before_update()
{
  if is_a_function requirements_${__lib_type}_before_update
  then requirements_${__lib_type}_before_update "$@" || return $?
  fi
  true # for osx
}

__rvm_requirements_run_update()
{
  if
    (( ${#packages_to_install[@]} > 0 )) ||
    (( ${#packages_custom[@]}+${#packages_custom_after[@]} > 0 && ${rvm_autolibs_flag_number} > 2 ))
  then
    rvm_log "Installing requirements for ${rvm_autolibs_flag_runner}."
    if
      is_a_function requirements_${__lib_type}_update_system
    then
      rvm_requiremnts_fail_or_run_action 3 \
        "Skipping system update, make sure your system is up to date." \
        __rvm_log_command update_system "Updating system" \
        requirements_${__lib_type}_update_system "$@" || return $?
    elif
      is_a_function requirements_${__type}_update_system
    then
      rvm_requiremnts_fail_or_run_action 3 \
        "Skipping system update, make sure your system is up to date." \
        __rvm_log_command update_system "Updating system" \
        requirements_${__type}_update_system "$@" || return $?
    fi
  fi
}

__rvm_requirements_run_custom_()
{
  \typeset __package __custom
  \typeset -a __missing_custom
  __missing_custom=()
  __custom="$1"
  shift

  while
    (( $# ))
  do
    __package="$1"
    if
      is_a_function requirements_${__lib_type}_install_${__package}
    then
      rvm_requiremnts_fail_or_run_action 2 \
        "Skipping ${__package} installation, make sure ${__package} is installed." \
        __rvm_log_command install_${__custom}_${__package} \
        "Installing required ${__custom//_/ } package: ${__package}" \
        "requirements_${__lib_type}_install_${__package}" || return $?
    elif
      is_a_function requirements_install_${__package}
    then
      rvm_requiremnts_fail_or_run_action 2 \
        "Skipping ${__package} installation, make sure ${__package} is installed." \
        __rvm_log_command install_${__custom}_${__package} \
        "Installing required ${__custom//_/ } package: ${__package}" \
        "requirements_install_${__package}" || return $?
    else
      __rvm_add_once __missing_custom "${__package}"
    fi
    shift
  done

  if
    (( ${#__missing_custom[@]} ))
  then
    if
      is_a_function requirements_${__lib_type}_install_${__custom}
    then
      rvm_requiremnts_fail_or_run_action 2 \
        "Skipping ${__missing_custom[*]} installation, make sure listed software is installed." \
        __rvm_log_command install_${__custom} \
        "Installing required ${__custom//_/ } packages: ${__missing_custom[*]}" \
        "requirements_${__lib_type}_install_${__custom}" "${__missing_custom[@]}" || return $?
    else
      rvm_requiremnts_fail_always 2 "\
Can not find function 'requirements_${__lib_type}_install_${__custom}' to install missing ${__custom//_/ } packages:
   ${__missing_custom[*]}
report a bug here:
   https://github.com/rvm/rvm/issues
" || return $?
    fi
  fi
}

__rvm_requirements_run_custom()
{
  (( ${#packages_custom[@]} )) || return 0
  __rvm_requirements_run_custom_ "custom" "${packages_custom[@]}" || return $?
}

__rvm_requirements_run_install()
{
  (( ${#packages_to_install[@]} )) || return 0
  if
    is_a_function requirements_${__lib_type}_lib_install
  then
    \typeset __package
    for __package in "${packages_to_install[@]}"
    do
      __rvm_log_command package_install_${__package} "Installing required package: ${__package}" \
        "requirements_${__lib_type}_lib_install" "${__package}" ||
      {
        \typeset __status=$?
        _list="${packages_to_install[*]}"
        rvm_warn "Failed installation package: ${__package} of: ${_list// /, }."
        return ${__status}
      }
    done
  else
    _list="${packages_to_install[*]}"
    __rvm_log_command package_install_${_list// /_} "Installing required packages: ${_list// /, }" \
      "requirements_${__lib_type}_libs_install" "${packages_to_install[@]}" ||
      return $?
  fi
}

__rvm_requirements_run_custom_after()
{
  (( ${#packages_custom_after[@]} )) || return 0
  __rvm_requirements_run_custom_ "custom_after" "${packages_custom_after[@]}" || return $?
}

__rvm_requirements_run_after()
{
  if
    is_a_function requirements_${__lib_type}_after
  then
    requirements_${__lib_type}_after "$@" || return $?
  elif
    is_a_function requirements_${__type}_after
  then
    requirements_${__type}_after "$@" || return $?
  fi
  true # for osx
}
src/rvm/scripts/functions/build_requirements_helpers000066400000014241147511530550017217 0ustar00#!/usr/bin/env bash

requirements_check()
{
  \typeset _package_name _list
  if
    is_a_function "requirements_${__lib_type}_lib_installed_all_missing"
  then
    __rvm_filter_installed_package_from_missing "requirements_${__lib_type}_lib_installed_all_missing" "$@"
  elif
    is_a_function "requirements_${__lib_type}_lib_installed"
  then
    for _package_name in "$@"
    do __rvm_filter_installed_package_check "requirements_${__lib_type}_lib_installed" "${_package_name}"
    done
  else
    return 1
  fi
  true # for OSX (and SuSE 11.3)
}

requirements_print_list()
{
  for output_package in "$@"
  do
    rvm_out "${output_package}"
  done
}

requirements_check_custom()
{
  \typeset __package __binary
  for __package
  do
    __binary="${__package%%=*}"
    __package="${__package#*=}"
    __rvm_which "${__binary}" >/dev/null || __rvm_add_once packages_custom "${__package}"
  done
}

requirements_check_custom_after()
{
  \typeset __package __binary
  for __package
  do
    __binary="${__package%%=*}"
    __package="${__package#*=}"
    __rvm_which "${__binary}" >/dev/null 2>&1 || __rvm_add_once packages_custom_after "${__package}"
  done
}

__rvm_filter_installed_package_from_missing()
{
  packages_missing=( $( "$@" ) )
  shift # remove callback function name

  \typeset __package
  for __package
  do
    [[ " ${packages_missing[*]} " == *" ${__package} "* ]] || __rvm_add_once packages_installed "${__package}"
  done
  case "$rvm_autolibs_flag_number" in
    (0|1|2) # just ignore
      true
      ;;
    (*) # 2+
      packages_to_install=( "${packages_missing[@]}" )
      packages_missing=()
      ;;
  esac
}

__rvm_filter_installed_package_check()
{
  if
    "$1" "$2"
  then
    __rvm_add_once packages_installed "$2"
  else
    case "$rvm_autolibs_flag_number" in
      (0|1|2) __rvm_add_once packages_missing    "$2" ;; # just ignore
      (*)     __rvm_add_once packages_to_install "$2" ;; # 2+
    esac
  fi
}

requirements_fallback_lib_available()
{
  for __package
  do
    if
      requirements_${__lib_type}_lib_available "${__package}"
    then
      __rvm_add_once __available_dependencies "${__package}"
    fi
  done
  __rvm_add_once __available_dependencies "$1"
}

requirements_fallback_lib_installed()
{
  for __package
  do
    if
      requirements_${__lib_type}_lib_installed "${__package}"
    then
      requirements_check "${__package}"
      return 0
    fi
  done
  return 1
}

requirements_check_fallback()
{
  \typeset -a __available_dependencies
  __available_dependencies=()
  \typeset __package
  requirements_fallback_lib_available "$@"
  requirements_fallback_lib_installed "${__available_dependencies[@]}" || requirements_check "${__available_dependencies[0]}"
}

requirements_detect_installed()
{
  \typeset -a __available_dependencies
  __available_dependencies=()
  \typeset __package
  requirements_fallback_lib_available "$@"
  requirements_fallback_lib_installed "${__available_dependencies[@]}" || return $?
}

requirements_version_minimal()
{
  if [[ " ${packages_to_install[*]} " == *" $1 "* ]]
  then return 0
  fi
  \typeset latest_version="$(
    requirements_${__lib_type}_version_list $1 |
    __rvm_version_sort |
    __rvm_tail -n 1
  )"
  if
    [[ -z "${latest_version}" ]] ||
    __rvm_version_compare ${latest_version} -lt $2
  then
    __rvm_add_once packages_to_install "$1"
  fi
}

rvm_requiremnts_fail()
{
  rvm_$1 "$2
RVM autolibs is now configured with mode '$rvm_autolibs_flag_number' =>
  '$(__rvm_autolibs_translate_description; echo $rvm_autolibs_flag_description)',
please run \`rvm autolibs enable\` to let RVM do its job or run and read \`rvm autolibs [help]\`
or visit https://rvm.io/rvm/autolibs for more information."
}

rvm_requiremnts_fail_or_run_action()
{
  case "${rvm_autolibs_flag_number}" in
    (0) rvm_debug "$2" ;;
    (1) rvm_warn  "$2" ;;
    (2) rvm_requiremnts_fail_on "$1" "$2" || return $? ;;
    (*)
      shift 2
      "$@" || return $?
      ;;
  esac
  true # for osx
}

rvm_requiremnts_fail_always()
{
  case "${rvm_autolibs_flag_number}" in
    (0) rvm_debug "$2" ;;
    (1) rvm_warn  "$2" ;;
    (*) rvm_requiremnts_fail_on "$1" "$2" $3 || return $? ;;
  esac
  true # for osx
}

rvm_requiremnts_fail_on()
{
  if
    (( $1 > $rvm_autolibs_flag_number ))
  then
    rvm_requiremnts_fail warn "$2"
  else
    rvm_requiremnts_fail error "$2"
    return ${3:-1}
  fi
}

# is_head_or_disable_binary $rvm_ruby_string
is_head_or_disable_binary()
{
  case "$1" in
    (*-head*)
      true
      ;;
    (*)
      if (( ${rvm_binary_flag:-0} == 1 || ${rvm_disable_binary_flag:-0} == 0 ))
      then return 1
      fi
      ;;
  esac
  true # for OSX
}

# Usage:
#   jruby_installation_method $rvm_ruby_string [$rvm_ruby_version]
# @stdout ant|mvn|mvnw
jruby_installation_method()
{
  \typeset __jversion
  if [[ -n "${2:-}" ]]
  then __jversion="$2"
  else
    __jversion="${1#jruby-}"
    __jversion="${__jversion%%-*}"
  fi
  case "$1" in
    (jruby-head*)
      echo "mvnw"
      ;;
    (*)
      if __rvm_version_compare "${__jversion}" -ge "1.7.25"
      then echo "mvnw"
      elif __rvm_version_compare "${__jversion}" -ge "1.7.0"
      then echo "mvn"
      else echo "ant"
      fi
      ;;
  esac
  true # for OSX
}

latest_maven_version()
{
  # contains some headers/footers and lines like this:
  # <img src="/icons/folder.gif" alt="[DIR]"> <a href="3.5.0/">3.5.0/</a> 2017-06-26 18:07 -
  curl -sSL https://archive.apache.org/dist/maven/maven-3/ |
    grep -oE '<a href="[0-9\.]+/">' |
    awk -F'["/]' '{print $2}' |
    __rvm_version_sort |
    tail -n 1
}

set_maven_variables()
{
  maven_version="$1"
  maven_file="apache-maven-${maven_version}-bin.tar.gz"
  maven_url="https://www.apache.org/dist/maven/maven-${maven_version%%.*}/${maven_version}/binaries/${maven_file}"
}

requirements_install_maven()
{
  \typeset maven_version maven_file maven_url
  set_maven_variables "$( __rvm_db "maven_version" )"

  file_exists_at_url_command "${maven_url}" ||
    set_maven_variables "$( latest_maven_version )"

  mkdir -p "${rvm_path}/java/" &&
  "${rvm_scripts_path}/fetch" "${maven_url}" &&
  __rvm_package_extract "${rvm_archives_path}/${maven_file}" "${rvm_path}/java/"
  ln -nfs "${rvm_path}/java/apache-maven-${maven_version}/bin"/mvn "${rvm_bin_path}"/mvn ||
  return $?
}
src/rvm/scripts/functions/autolibs000077500000005533147511530550013424 0ustar00#!/usr/bin/env bash

source "$rvm_scripts_path/functions/db"

__rvm_autolibs_set()
{
  __rvm_db_ "$rvm_user_path/db" "autolibs" "$rvm_autolibs_flag"
}

__rvm_autolibs_get()
{
  if [[ -z "${rvm_autolibs_flag:-}" ]]
  then rvm_autolibs_flag="$( __rvm_db_ "$rvm_user_path/db" "autolibs" )"
  fi

  rvm_autolibs_flag="${rvm_autolibs_flag:=4}"
}

__rvm_autolibs_reset()
{
  __rvm_db_ "$rvm_user_path/db" "autolibs" "delete"
}

__rvm_autolibs_translate()
{
  case "${1:-$rvm_autolibs_flag}" in
    (0|disable|disabled)
      rvm_autolibs_flag_number=0
      rvm_autolibs_flag_runner="${_system_name_lowercase}"
      ;;
    (1|read|read-only)
      rvm_autolibs_flag_number=1
      rvm_autolibs_flag_runner="${_system_name_lowercase}"
      ;;
    (2|fail|read-fail)
      rvm_autolibs_flag_number=2
      rvm_autolibs_flag_runner="${_system_name_lowercase}"
      ;;
    (3|packages|install-packages)
      rvm_autolibs_flag_number=3
      rvm_autolibs_flag_runner="${_system_name_lowercase}"
      ;;
    (portage|gentoo_portage)
      rvm_autolibs_flag_number=3
      rvm_autolibs_flag_runner="gentoo_portage"
      ;;
    (paludis|gentoo_paludis)
      rvm_autolibs_flag_number=3
      rvm_autolibs_flag_runner="gentoo_paludis"
      ;;
    (pkgcore|gentoo_pkgcore)
      rvm_autolibs_flag_number=3
      rvm_autolibs_flag_runner="gentoo_pkgcore"
      ;;
    (4|enable|enabled)
      rvm_autolibs_flag_number=4
      rvm_autolibs_flag_runner="${_system_name_lowercase}"
      ;;
    (brew|homebrew|osx_brew)
      rvm_autolibs_flag_number=4
      rvm_autolibs_flag_runner="osx_brew"
      ;;
    (port|macports|osx_port)
      rvm_autolibs_flag_number=4
      rvm_autolibs_flag_runner="osx_port"
      ;;
    (fink|osx_fink)
      rvm_autolibs_flag_number=4
      rvm_autolibs_flag_runner="osx_fink"
      ;;
    (smf|rvm_pkg)
      rvm_autolibs_flag_number=4
      rvm_autolibs_flag_runner="${rvm_autolibs_flag}"
      ;;
    (*)
      rvm_debug "Unknown 'rvm_autolibs_flag' value '$rvm_autolibs_flag'."
      return 1
      ;;
  esac

  if [[ -n "${1:-}" ]]
  then rvm_autolibs_flag="$1"
  fi
}

__rvm_autolibs_translate_description()
{
  __rvm_autolibs_translate

  case "${rvm_autolibs_flag_number}" in
    (0)
      rvm_autolibs_flag_description="Limit RVM automation as much as possible."
      ;;
    (1)
      rvm_autolibs_flag_description="Allow RVM to use package manager if found but do not install or fail if dependencies are missing."
      ;;
    (2)
      rvm_autolibs_flag_description="Allow RVM to use package manager if found, fail if dependencies are missing. This is default."
      ;;
    (3)
      rvm_autolibs_flag_description="Allow RVM to use package manager if found, install missing dependencies."
      ;;
    (4)
      rvm_autolibs_flag_description="Allow RVM to use package manager if found, install missing dependencies, install package manager (only OS X)."
      ;;
  esac
}
src/rvm/scripts/functions/rvmrc_to000066400000001206147511530550013423 0ustar00#!/usr/bin/env bash

__rvm_rvmrc_to()
{
  case "${1:-help}" in
    (.ruby-version|ruby-version)
      __rvm_rvmrc_to_ruby_version || return $?
      ;;
    (help)
      rvm_help rvmrc to
      return 0
      ;;
    (*)
      rvm_error_help "Unknown subcommand '$1'" rvmrc to
      return 1
      ;;
  esac
}

__rvm_rvmrc_to_ruby_version()
(
  [[ -s "$PWD/.rvmrc" ]] ||
  {
    rvm_error "No .rvmrc to convert"
    return 2
  }
  __rvm_load_project_config "$PWD/.rvmrc" ||
  {
    rvm_error "Could not load .rvmrc"
    return 3
  }

  __rvm_set_ruby_version

  \command \rm .rvmrc ||
  {
    rvm_error "Could not remove .rvmrc"
    return 4
  }
)
src/rvm/scripts/functions/selector_parse000066400000016332147511530550014610 0ustar00#!/usr/bin/env bash

__rvm_ruby_string_fuzzy_remote()
{
  \typeset new_ruby_string __search
  __search="${rvm_ruby_string}"
  if [[ -n "${rvm_ruby_name:-}" ]]
  then __search="${__search%${rvm_ruby_name:-}}.*${rvm_ruby_name:-}"
  fi
  new_ruby_string="$(
    __list_remote_all |
    __rvm_awk -F/ '{ x=$NF;
      gsub(".tar.*","",x);
      gsub("jruby-bin","jruby",x);
      gsub("rubinius","rbx",x);
      print x}' |
    __rvm_version_sort |
    __rvm_awk '
BEGIN{found=""; any=""}
/^'"${__search}"'$/ {found=$1}
/^'"${__search}"'/ {any=$1}
END{if (found) print found; else if (any) print any;}
'
  )"
  rvm_ruby_string="${new_ruby_string:-$rvm_ruby_string}"
}

__rvm_ruby_string_fuzzy()
{
  \typeset new_ruby_string __search
  __search="${rvm_ruby_string}"
  if [[ -n "${rvm_ruby_name:-}" ]]
  then __search="${__search%${rvm_ruby_name:-}}.*${rvm_ruby_name:-}"
  fi
  new_ruby_string="$(
    __rvm_list_strings |
    __rvm_grep "${__search//\./\\.}" |
    __rvm_version_sort |
    __rvm_tail -n 1
  )"
  if [[ -n "${new_ruby_string}" ]]
  then rvm_ruby_string="${new_ruby_string}"
  else return $?
  fi
}

__rvm_ruby_string_parse_()
{
  \typeset ruby_string gemset_name expanded_alias_name repo_url branch_name ruby_name tag_name

  # Stash the ruby string.
  ruby_string="${rvm_ruby_string:-}"
  gemset_name="${rvm_gemset_name:-}"
  repo_url="${rvm_ruby_repo_url:-}"
  branch_name="${rvm_ruby_repo_branch:-}"
  ruby_name="${rvm_ruby_name:-}"
  tag_name="${rvm_ruby_repo_tag:-}"

  __rvm_unset_ruby_variables

  rvm_ruby_repo_url="${repo_url:-}"
  rvm_ruby_repo_branch="${branch_name:-}"
  rvm_ruby_name="$ruby_name"
  rvm_ruby_repo_tag="${rvm_ruby_repo_tag:-}"

  export rvm_head_flag=0

  if
    [[ -z "${ruby_string}" || "${ruby_string}" == "current" ]]
  then
    if
      [[ "${GEM_HOME:-}" == *"${rvm_gems_path}"* ]]
    then
      # Current Ruby
      ruby_string="${GEM_HOME##*\/}"
      ruby_string="${ruby_string/%${rvm_gemset_separator:-"@"}*}"
    else
      ruby_string="system"
    fi
  fi

  strings=()
  __rvm_custom_separated_array strings - "${ruby_string}"
  rvm_ruby_string="${ruby_string}"

  # +() in ZSH, see https://github.com/rvm/rvm/issues/2807
  if [[ -n "${ZSH_VERSION:-}" ]]
  then setopt LOCAL_OPTIONS KSH_GLOB
  fi

  for string in ${strings[@]}
  do
    case "$string" in
      (head)
        rvm_ruby_patch_level=""
        rvm_ruby_revision=""
        rvm_ruby_tag=""
        rvm_head_flag=1
        ;;

      (system)
        rvm_ruby_interpreter="system"
        rvm_ruby_patch_level=""
        rvm_ruby_tag=""
        rvm_ruby_revision=""
        rvm_ruby_version=""
        rvm_gemset_name=""
        rvm_head_flag=0
        return 0
        ;;

      (ext|external)
        rvm_ruby_interpreter="ext"
        rvm_ruby_patch_level=""
        rvm_ruby_tag=""
        rvm_ruby_revision=""
        rvm_ruby_version=""
        rvm_head_flag=0

        rvm_ruby_name="${ruby_string:-${rvm_ruby_string}}"
        rvm_ruby_name="${rvm_ruby_name#*-}"
        break
        ;;

      (nightly|weekly|monthly)
        case "${rvm_ruby_interpreter}" in
          (rbx|rubinius) rvm_ruby_patch_level="$string" ;;
          (*)            rvm_ruby_version="$string"     ;;
        esac
        rvm_nightly_flag=1
        ;;

      (nightly*|weekly*|monthly*)
        case "${rvm_ruby_interpreter}" in
          (rbx|rubinius) rvm_ruby_patch_level="$string" ;;
          (*)            rvm_ruby_version="$string"     ;;
        esac
        ;;

      (preview*)
        rvm_ruby_patch_level="$string"
        ;;

      (rc[0-9]*)
        rvm_ruby_patch_level="$string"
        ;;

      (+([0-9]).+([0-9]).[0-9]*)
        rvm_ruby_version="${string}"
        rvm_ruby_revision=""
        rvm_ruby_tag=""
        ;;

      ([0-9][0-9]*)
        case "${rvm_ruby_interpreter:-""}" in
          (ree)
            rvm_ruby_patch_level="$string"
            rvm_ruby_revision=""
            ;;
          (maglev)
            rvm_ruby_version="$string"
            rvm_ruby_revision=""
            rvm_ruby_patch_level=""
            ;;
          (*)
            rvm_ruby_version="${string}"
            rvm_ruby_revision=""
            rvm_ruby_tag=""
            ;;
        esac
        ;;

      ([0-9]*)
        rvm_ruby_version="${string}"
        rvm_ruby_revision=""
        rvm_ruby_tag=""
        ;;

      (p[0-9]*)
        rvm_ruby_patch_level="$string"
        ;;

      (r[0-9]*)
        rvm_ruby_patch_level=""
        rvm_ruby_revision="$string"
        ;;

      (s[0-9a-zA-ZuU]*)
        rvm_ruby_revision=""
        rvm_ruby_sha="${string#s}"
        ;;

      (tag[0-9])
        rvm_ruby_repo_tag="$string"
        ;;

      (tv[0-9]*|t[0-9]*)
        rvm_ruby_patch_level="" ; rvm_ruby_revision=""
        rvm_ruby_tag="$string"
        ;;

      (m[0-9]*)
        rvm_ruby_mode="$string"
        ;;

      (u[0-9a-zA-ZuU]*)
        rvm_ruby_patch_level="" ; rvm_ruby_revision="" ; rvm_ruby_tag="" ; rvm_ruby_patch=""
        rvm_ruby_user_tag="$string"
        ;;

      (b[0-9]*)
        rvm_ruby_repo_branch="${string}"
        rvm_head_flag=1
        ;;

      (rubinius)
        rvm_ruby_interpreter="rbx"
        ;;

      (opal|ruby|rbx|jruby|macruby|ree|maglev|ironruby|mruby|topaz|truffleruby)
        rvm_ruby_interpreter="$string"
        ;;

      ([a-zA-ZuU]*([0-9a-zA-ZuU]|_))
        rvm_ruby_name="$string"
        ;;

      (*)
        rvm_ruby_string="${ruby_string:-}"
        return 0
        ;;
    esac
  done
  if
    [[ -z "${rvm_ruby_interpreter}" && -n "${rvm_ruby_version}" ]]
  then
    case "${rvm_ruby_version}" in
      (1.[5-7]*|9*)    rvm_ruby_interpreter=jruby ;;
      (1.[8-9]*|2*|3*) rvm_ruby_interpreter=ruby  ;;
    esac
    if [[ -n "${rvm_ruby_interpreter}" ]]
    then rvm_ruby_string="${rvm_ruby_interpreter}-${rvm_ruby_string}"
    fi
  fi
  true # OSX --trace FIX
}

__rvm_ruby_string_latest()
{
  \typeset check_ruby_string new_ruby_string
  check_ruby_string=""
  if [[ -n "${rvm_ruby_interpreter}" ]]
  then check_ruby_string+="${rvm_ruby_interpreter}-"
  fi
  if [[ -n "${rvm_ruby_version}" ]]
  then check_ruby_string+="${rvm_ruby_version//\./\.}.*"
  fi
  if [[ -n "${rvm_ruby_patch_level}" ]]
  then check_ruby_string+="${rvm_ruby_patch_level//\./\.}.*"
  fi
  if [[ -z "${check_ruby_string}" ]]
  then check_ruby_string="$rvm_ruby_string"
  fi
  new_ruby_string="$(
    \command \cat "$rvm_path/config/known_strings" |
    __rvm_grep "${check_ruby_string}" |
    __rvm_version_sort |
    __rvm_tail -n 1
  )"
  if
    [[ -n "${new_ruby_string}" ]]
  then
    rvm_ruby_string="${new_ruby_string}"
  else
    rvm_error "Unknown ruby string (do not know how to handle): $rvm_ruby_string."
    return 1
  fi
}

__rvm_ruby_string_parse()
{
  # detect rvm_ruby_name early so it can be used in fuzzy/remote
  __rvm_ruby_string_parse_ || true

  if
    (( ${rvm_fuzzy_flag:-0} == 1 )) &&
    [[ ! -d "${rvm_rubies_path}/${rvm_ruby_string}" ]]
  then
    if
      (( ${rvm_remote_flag:-0} == 1 ))
    then
      __rvm_ruby_string_fuzzy        ||
      __rvm_ruby_string_fuzzy_remote ||
      return $?
    else
      __rvm_ruby_string_fuzzy || true
    fi
  fi

  # parse the detected version
  __rvm_ruby_string_parse_ || return $?

  if
    [[ -z "${rvm_ruby_interpreter}" ]]
  then
    rvm_error "Unknown ruby interpreter version (do not know how to handle): $rvm_ruby_string."
    return 1
  fi
}
src/rvm/scripts/functions/utility000077500000024533147511530550013306 0ustar00#!/usr/bin/env bash

source "${rvm_scripts_path}/functions/utility_logging"
source "${rvm_scripts_path}/functions/utility_package"
source "${rvm_scripts_path}/functions/utility_rubygems"
source "${rvm_scripts_path}/functions/utility_system"

__rvm_strings()
{
  \typeset strings ruby_strings

  ruby_strings=($(echo ${rvm_ruby_args:-$rvm_ruby_string}))

  for rvm_ruby_string in "${ruby_strings[@]}" ; do
    strings="$strings $(__rvm_select ; echo $rvm_ruby_string)"
  done

  echo $strings

  return 0
}

# Return a list of directories under a given base path.
# Derived from rvm_ruby_string.
__rvm_ruby_string_paths_under()
{
  \typeset __search_path part parts IFS
  IFS=" "

  __search_path="${1%/}" # Strip off any trailing slash

  if [[ -n "${ZSH_VERSION:-}" ]]
  then parts=(${=rvm_ruby_string//-/ })
  else parts=(${rvm_ruby_string//-/ }) # Strip white space.
  fi

  echo "$__search_path"
  for part in "${parts[@]}"
  do
    __search_path="$__search_path/$part"
    echo "$__search_path"
  done
}

# Strip whitespace and normalize it all.
__rvm_strip()
{
  __rvm_sed -e 's/^[[:space:]]*//' -e 's/[[:space:]]*$//' -e 's/[[:space:]]\{1,\}/ /g'
  return $?
}

# remove all entries from $PATH starting with $1
__rvm_remove_from_path()
{
  export PATH
  \typeset _value
  _value="${1//+(\/)//}"

  # Guard to prevent removal of the entire path
  # https://github.com/rvm/rvm/issues/4759
  if
    [[ $_value == "/*" ]]
  then
    return
  fi

  # remove multiple slashes https://github.com/rvm/rvm/issues/1364
  while [[ "$PATH" == *"//"* ]] ; do PATH="${PATH/\/\///}" ; done
  while [[ "$PATH" == *"/:"* ]] ; do PATH="${PATH/\/:/:}" ; done

  if
    __rvm_string_match ":$PATH:" "*:${_value}:*"
  then
      \typeset -a _path
      _path=()
      __rvm_custom_separated_array _path : "${PATH}"
      __rvm_remove_from_array _path "${_value}" "${_path[@]}"
      __rvm_join_array PATH : _path
  fi
}

__rvm_add_to_path()
{
  export PATH

  if (( $# != 2 )) || [[ -z "$2" ]]
  then
    rvm_error "__rvm_add_to_path requires two parameters"
    return 1
  fi

  __rvm_remove_from_path "$2"
  case "$1" in
    prepend) PATH="$2:$PATH" ;;
    append)  PATH="$PATH:$2" ;;
    #*) anything else will just remove it from PATH - not adding back
  esac

  if
    [[ -n "${rvm_user_path_prefix:-}" ]]
  then
    __rvm_remove_from_path "${rvm_user_path_prefix}"
    PATH="${rvm_user_path_prefix}:$PATH"
  fi
  builtin hash -r
}

rvm_is_a_shell_function()
{
  \typeset _message
  if
    (( ${rvm_is_not_a_shell_function:-0} )) &&
    [[ "${1:-}" != "no_warning" ]]
  then
    if rvm_pretty_print stderr
    then rvm_log "" # newline when error is shown to user
    fi
    if rvm_pretty_print stderr
    then rvm_error "${rvm_notify_clr:-}RVM is not a function, selecting rubies with '${rvm_error_clr:-}rvm use ...${rvm_notify_clr:-}' will not work."
    else rvm_error "RVM is not a function, selecting rubies with 'rvm use ...' will not work."
    fi
    if
      [[ -n "${SUDO_USER:-}" ]]
    then
      rvm_warn '
Please avoid using "sudo" in front of "rvm".
RVM knows when to use "sudo" and will use it only when it is necessary.
'
    else
      rvm_warn '
You need to change your terminal emulator preferences to allow login shell.
Sometimes it is required to use `/bin/bash --login` as the command.
Please visit https://rvm.io/integration/gnome-terminal/ for an example.
'
    fi
  fi
  return ${rvm_is_not_a_shell_function:-0}
}

__rvm_version_sort()
{
  \command \awk -F'[.-]' -v OFS=. '{                   # split on "." and "-", merge back with "."
    original=$0                                        # save original to preserve it before the line is changed
    for (n=1; n<10; n++) {                             # iterate through max 9 components of version
      $n=tolower($n)                                   # ignore case for sorting
      if ($n == "")                 $n="0"             # treat non existing parts as 0
      if ($n ~ /^p[0-9]/)           $n=substr($n, 2)   # old ruby -p notation
      if ($n ~ /^[0-9](rc|b)/)      $n=substr($n, 1, 1)". "substr($n, 2)   # old jruby 0RC1 notation
      if (n == 1 && $n ~ /^[0-9]/)  $n="zzz."$n        # first group must be a string
      if (n > 1 && $n ~ /^[a-z]/)   $n=" "$n           # names go before numbers thanks to space
    }
    print $0"\t"original                               # print the transformed version and original separated by \t
                                                       # so we can extract original after sorting
  }'  \
  | LC_ALL=C \sort -t. -k 1,1d -k 2,2n -k 3,3n -k 4,4n -k 5,5n -k 6,6n -k 7,7n -k 8,8n -k 9,9n \
  | \awk -F'\t' '{print $2}'
}

__rvm_version_compare()
{
  \typeset first

  # first is the lower version number
  first="$( \command \printf "%b" "$1\n$3\n" | __rvm_version_sort | \command \head -n1 )"

  case "$2" in
    (-eq|==|=)
      [[ "$1" == "$3" ]] || return $?
      ;;
    (-ne|!=)
      [[ "$1" != "$3" ]] || return $?
      ;;
    (-gt|\>)
      if [[ "$first" == "head" ]]
      then [[ "$first" == "$1" && "$1" != "$3" ]] || return $?
      else [[ "$first" == "$3" && "$1" != "$3" ]] || return $?
      fi
      ;;
    (-ge|\>=)
      if [[ "$first" == "head" ]]
      then [[ "$first" == "$1" || "$1" == "$3" ]] || return $?
      else [[ "$first" == "$3" || "$1" == "$3" ]] || return $?
      fi
      ;;
    (-lt|\<)
      if [[ "$first" == "head" ]]
      then [[ "$first" == "$3" && "$1" != "$3" ]] || return $?
      else [[ "$first" == "$1" && "$1" != "$3" ]] || return $?
      fi
      ;;
    (-le|\<=)
      if [[ "$first" == "head" ]]
      then [[ "$first" == "$3" || "$1" == "$3" ]] || return $?
      else [[ "$first" == "$1" || "$1" == "$3" ]] || return $?
      fi
      ;;
    (*)
      rvm_error "Unsupported operator '$2'."
      return 1
      ;;
  esac
  return 0
}

# parse comma separated string into an array
# Ex. __rvm_custom_separated_array strings - ruby_string
# adds all elements from `ruby_string` to `strings` array
__rvm_custom_separated_array()
{
  \typeset IFS
  IFS=$2
  if [[ -n "${ZSH_VERSION:-}" ]]
  then eval "$1+=( \${=3} )"
  else eval "$1+=( \$3 )"
  fi
}

__rvm_remove_from_array()
{
  \typeset _array_name _iterator _search
  \typeset -a _temp_array
  _array_name="$1"
  _search="$2"
  shift 2
  _temp_array=()
  for _iterator
  do
    __rvm_string_match "$_iterator" "$_search" || _temp_array+=( "$_iterator" )
  done
  eval "$_array_name=( \"\${_temp_array[@]}\" )"
}

__rvm_join_array()
{
  \typeset IFS
  IFS="$2"
  eval "$1=\"\${$3[*]}\""
}

# take a variable and cut it only to contain only count fields from separator
# Usage: __rvm_take_n variable count separator
__rvm_take_n()
{
  \typeset IFS __temp_counter
  \typeset -a __temp_arr1 __temp_arr2
  IFS=$3
  if [[ -n "${ZSH_VERSION:-}" ]]
  then eval "__temp_arr1=( \${=$1} )"
  else eval "__temp_arr1=( \$$1 )"
  fi
  __temp_counter=0
  __temp_arr2=()
  while (( __temp_counter < $2 ))
  do __temp_arr2+=( "${__temp_arr1[__array_start+__temp_counter++]}" )
  done
  eval "$1=\"\${__temp_arr2[*]}\""
}

__rvm_add_once()
{
  \typeset IFS
  IFS="|"
  eval "[[ \"${IFS}\${${1}[*]}${IFS}\" == \*\"${IFS}\${2}${IFS}\"\* ]] || ${1}+=( \"\${2}\" )"
}

__rvm_find_first_file()
{
  \typeset _first_file _variable_first_file __file_enum
  _first_file=""
  _variable_first_file="$1"
  shift

  for __file_enum in "$@"
  do
    if
      [[ -f "$__file_enum" ]]
    then
      eval "$_variable_first_file=\"\$__file_enum\""
      return 0
    fi
  done
  eval "$_variable_first_file=\"\""
  return 1
}

file_exists_at_url_command()
{
  __rvm_curl --silent --insecure --location --list-only \
    --max-time ${rvm_max_time_flag:-5} --head "$@" 2>&1 |
    __rvm_grep -E 'HTTP/[0-9\.]+ 200' >/dev/null 2>&1 ||
    {
      \typeset __ret=$?
      case ${__ret} in
        (28)
          rvm_warn "RVM was not able to check existence of remote files with timeout of ${rvm_max_time_flag:-3} seconds
you can increase the timeout by setting it in ~/.rvmrc => rvm_max_time_flag=10"
          ;;
      esac
      return ${__ret}
    }
}

file_exists_at_url()
(
  if
    [[ -n "${1:-}" ]]
  then
    unset curl
    file_exists_at_url_command "$1" --insecure ||
    {
      \typeset __ret=$?
      case ${__ret} in
        (60)
          # detect double --insecure and avoid duplication, see:
          # https://github.com/rvm/rvm/issues/2640#issuecomment-35669722
          file_exists_at_url_command "$1" || return $?
          return 0
          ;;
        (*)
          # anything else then 60 just return it
          return ${__ret}
          ;;
      esac
    }
  else
    rvm_warn "Warning: URL was not passed to file_exists_at_url"
    return 1
  fi
)

__rvm_try_sudo()
(
  \typeset -a command_to_run
  \typeset sudo_path sbin_path missing_paths
  command_to_run=( "$@" )
  (( UID == 0 )) ||
  case "$rvm_autolibs_flag_number" in
    (0)
      rvm_debug "Running '$*' would require sudo."
      return 0
      ;;
    (1)
      rvm_warn  "Running '$*' would require sudo."
      return 0
      ;;
    (2)
      rvm_requiremnts_fail error "Running '$*' would require sudo."
      return 1
      ;;
    (*)
      if
        is_a_function __rvm_sudo
      then
        missing_paths=""
        for sbin_path in /sbin /usr/sbin /usr/local/sbin
        do
          if [[ -d "${sbin_path}" ]] && [[ ":$PATH:" != *":${sbin_path}:"* ]]
          then missing_paths+=":${sbin_path}"
          fi
        done
        if [[ -n "${missing_paths}" ]]
        then command_to_run=( /usr/bin/env PATH="${PATH}${missing_paths}" "${command_to_run[@]}" )
        fi
        command_to_run=( __rvm_sudo -p "%p password required for '$*': " "${command_to_run[@]}" )
      else
        rvm_error "Running '$*' would require sudo, but 'sudo' is not found!"
        return 1
      fi
      ;;
  esac
  "${command_to_run[@]}" || return $?
)

__rvm_run_wrapper()
( # ( = subprocess
  file="$1"
  action="${2:-}"
  shift 2
  rubies_string="${1:-}"
  args=( $@ )
  source "$rvm_scripts_path"/base
  source "$rvm_scripts_path"/$file
)

__rvm_calculate_space_free()
{
  # OpenBSD does not have 'df -m' param
  __free_space="$( \command \df -Pk "$1" | __rvm_awk 'BEGIN{x=4} /Free/{x=3} $3=="Avail"{x=3} END{print $x}' )"
  if [[ "${__free_space}" == *M ]]
  then __free_space="${__free_space%M}" # some systems ignore -k and print M
  else __free_space="$(( __free_space / 1024 ))"
  fi
}

__rvm_calculate_space_used()
{
  __used_space="$( \command \du -msc "$@" | __rvm_awk 'END {print $1}' )"
  __used_space="${__used_space%M}"
}

__rvm_require()
{
  [[ -f "$1" ]] && source "$1"
}
src/rvm/scripts/functions/selector_gemsets000077500000011676147511530550015156 0ustar00#!/usr/bin/env bash

__rvm_gemset_handle_default()
{
  rvm_gemset_name="${rvm_gemset_separator:-@}${rvm_gemset_name:-}${rvm_gemset_separator:-@}"
  rvm_gemset_name="${rvm_gemset_name/${rvm_gemset_separator:-@}default${rvm_gemset_separator:-@}/}"
  # also does filter any extra rvm_gemset_separator from the gemset name
  rvm_gemset_name="${rvm_gemset_name//${rvm_gemset_separator:-@}/}"
}

__rvm_gemset_select_cli_validation()
{
  \typeset orig_gemset

  if ! builtin command -v gem > /dev/null
  then
    rvm_log "'gem' command not found, cannot select a gemset."
    return 0
  fi

  orig_gemset="${rvm_gemset_name:-}"
  __rvm_gemset_handle_default

  # No longer defaulting to 'sticky' gem sets.
  # Set 'rvm_sticky_flag=1' in ~/.rvmrc to enable.
  if [[ -z "${rvm_gemset_name:-}"  && "$orig_gemset" != "default" && ${rvm_sticky_flag:-0} -eq 1 ]]
  then
    if [[ -n "${rvm_ruby_gem_home:-}" ]]
    then
      rvm_gemset_name="$rvm_ruby_gem_home"
    elif [[ -n "${GEM_HOME:-}" ]]
    then
      rvm_gemset_name="$GEM_HOME"
    fi
    rvm_gemset_name="${rvm_gemset_name##*/}"
    rvm_gemset_name="${rvm_gemset_name#*${rvm_gemset_separator:-"@"}}"
  fi

  if [[ -z "${rvm_ruby_string:-}" && -n "${GEM_HOME:-}" && -n "${GEM_HOME%@*}" ]]
  then
    rvm_ruby_string="${GEM_HOME%@*}"
    rvm_ruby_string="${rvm_ruby_string##*/}"
  fi

  if [[ -z "${rvm_ruby_string:-}" ]]
  then
    rvm_error "Gemsets can not be used with non rvm controlled rubies (currently)."
    return 3
  fi
}

__rvm_gemset_select_only()
{
  rvm_ruby_gem_home="${rvm_gems_path:-"$rvm_path/gems"}/$rvm_ruby_string"

  : rvm_ignore_gemsets_flag:${rvm_ignore_gemsets_flag:=0}:
  if (( rvm_ignore_gemsets_flag ))
  then
    rvm_ruby_global_gems_path="${rvm_ruby_gem_home}"
    rvm_ruby_gem_path="${rvm_ruby_gem_home}"
    rvm_gemset_name=""
  else
    rvm_ruby_global_gems_path="${rvm_ruby_gem_home}${rvm_gemset_separator:-"@"}global"

    __rvm_gemset_handle_default
    [[ -z "$rvm_gemset_name" ]] ||
      rvm_ruby_gem_home="${rvm_ruby_gem_home}${rvm_gemset_separator:-"@"}${rvm_gemset_name}"

    if [[ "$rvm_gemset_name" == "global" ]]
    then
      rvm_ruby_gem_path="${rvm_ruby_gem_home}"
    else
      rvm_ruby_gem_path="${rvm_ruby_gem_home}:${rvm_ruby_global_gems_path}"
    fi
  fi

  if [[ -n "${rvm_gemset_name}" ]]
  then
    rvm_env_string="${rvm_ruby_string}@${rvm_gemset_name}"
  else
    rvm_env_string=${rvm_ruby_string}
  fi
  true # OSX --trace FIX
}

__rvm_gemset_select_validation()
{
  # If the gemset does not exist, then notify the user as such and abort the action.
  if
    [[ ! -d "${rvm_ruby_gem_home}" ]]
  then
    if
      (( ${rvm_gemset_create_on_use_flag:=0} == 0 && ${rvm_create_flag:=0} == 0 && ${rvm_delete_flag:=0} == 0 ))
    then
      rvm_expected_gemset_name="${rvm_gemset_name}"
      rvm_gemset_name=""
      __rvm_gemset_select_only
      return 2
    fi
  elif
    (( ${rvm_delete_flag:=0} == 1 ))
  then
    return 4
  fi

  case "${rvm_gemset_name}" in
    (*/*)
      rvm_error "Gemsets can not contain path separator '/'."
      return 5
      ;;
    (*:*)
      rvm_error "Gemsets can not contain PATH separator ':'."
      return 5
      ;;
  esac

  \typeset rvm_ruby_gem_home_254
  if [[ -n "${ZSH_VERSION:-}" ]]
  then rvm_ruby_gem_home_254="${rvm_ruby_gem_home[0,254]}"
  else rvm_ruby_gem_home_254="${rvm_ruby_gem_home:0:254}"
  fi
  if
    [[ "${rvm_ruby_gem_home}" != "${rvm_ruby_gem_home_254}" ]]
  then
    rvm_error "Gemset gem home to long ${#rvm_ruby_gem_home}."
    return 6
  fi
}

# Select a gemset based on CLI set options and environment.
__rvm_gemset_select_cli()
{
  __rvm_gemset_select_cli_validation &&
  __rvm_gemset_select ||
  return $?
}

__rvm_gemset_select()
{
  __rvm_gemset_select_only &&
  __rvm_gemset_select_validation ||
  return $?
}

__rvm_gemset_use_ensure()
{
  if
    [[ ! -d "$rvm_ruby_gem_home" ]] ||
    [[ -n "${rvm_expected_gemset_name}" && ! -d "${rvm_ruby_gem_home%@*}@${rvm_expected_gemset_name}" ]]
  then
    if
      (( ${rvm_gemset_create_on_use_flag:=0} == 1 || ${rvm_create_flag:=0} == 1 ))
    then
      gemset_create "${rvm_expected_gemset_name:-${rvm_gemset_name:-}}"
    else
      rvm_error "Gemset '${rvm_expected_gemset_name:-${rvm_gemset_name:-}}' does not exist, \
'rvm $rvm_ruby_string do rvm gemset create ${rvm_expected_gemset_name:-${rvm_gemset_name:-}}' first, or append '--create'."
      return 2
    fi
  fi
}

# Use a gemset specified by 'rvm_ruby_gem_home'
__rvm_gemset_use()
{
  if
    [[ "$(__rvm_env_string)" == "system" ]]
  then
    rvm_error "System ruby is not controlled by RVM, but you can use it with 'rvm automount', read more: 'rvm help mount'."
    return 2
  elif
    __rvm_gemset_select_cli
  then
    rvm_log "Using $rvm_ruby_string with gemset ${rvm_gemset_name:-default}"
    __rvm_use # Now ensure the selection takes effect for the environment.
  elif
    [[ -n "${rvm_expected_gemset_name}" ]]
  then
    __rvm_gemset_use_ensure
  else
    rvm_error "Gemset was not given.\n  Usage:\n    rvm gemset use <gemsetname>\n"
    return 1
  fi
}
src/rvm/scripts/functions/notes/opencollective000066400000000432147511530550015733 0ustar00#!/usr/bin/env bash

__rvm_notes_opencollective()
{
  rvm_notify "<warn>Thanks for installing RVM 🙏</warn>
Please consider donating to our open collective to help us maintain RVM.

👉  Donate: <code>https://opencollective.com/rvm/donate</code>

"
}

__rvm_notes_opencollective
src/rvm/scripts/functions/notes/warnings/warning_rvm_in_usr000066400000000523147511530550020461 0ustar00#!/usr/bin/env bash

__rvm_notes_warning_rvm_in_usr()
{
  if
    [[ -x /usr/local/bin/rvm ]]
  then
    rvm_warn "
  * WARNING: you have <code>/usr/local/bin/rvm</code><warn>, it's most likely a bug of old installation, in most cases it's safe to remove it:

    <code>rm /usr/local/bin/rvm</code>
"
  fi
}

__rvm_notes_warning_rvm_in_usr
src/rvm/scripts/functions/notes/warnings/warning_profile000066400000001244147511530550017737 0ustar00#!/usr/bin/env bash

__rvm_notes_warning_profile()
{
  if
    [[ ${rvm_ignore_dotfiles_flag:-0} == 0 ]] &&
    [[ -f "$HOME/.profile" ]] && ! [[ "$rvm_path" == "/usr/local/rvm" || $UID == 0 ]]
  then
    for __var in "$HOME/.bash_profile" "$HOME/.bash_login"
    do
      if
        [[ -f "${__var}" ]]
      then
        __rvm_grep -E '(source|\.).+profile' "${__var}" >/dev/null 2>&1 ||
        {
          rvm_warn "
  * WARNING: <code>~/.profile</code> <warn>file found. To load it into your shell, add the following line to <code>${__var}</code><warn>:

      <code>source ~/.profile</code>
"
        }
        break
      fi
    done
  fi
}

__rvm_notes_warning_profile
src/rvm/scripts/functions/notes/warnings/warning_rvm_configure_env000066400000000777147511530550022026 0ustar00#!/usr/bin/env bash

__rvm_notes_warning_rvm_configure_env()
{
  if
    [[ -f /etc/rvmrc && -s /etc/rvmrc ]] &&
    __rvm_grep 'rvm_configure_env=.*/opt/sm' /etc/rvmrc >/dev/null 2>&1
  then
    rvm_warn "  * WARNING: you have <code>rvm_configure_env</code> <warn>in <code>/etc/rvmrc</code><warn>, run the following to fix:<code>\n\n" \
             "      sudo sed -i'' -e \"/rvm_configure_env=.*\/opt\/sm/d\" /etc/rvmrc\n" \
             "      rvm autolibs smf"
  fi
}

__rvm_notes_warning_rvm_configure_env
src/rvm/scripts/functions/notes/warnings/warning_needs_cleanup000066400000002614147511530550021106 0ustar00#!/usr/bin/env bash

__rvm_notes_warning_needs_cleanup()
{
  \typeset __found __search_path_gems __search_path_rubies gemset_name __need_a_cleanup=0

  for __found in "$rvm_path"/environments/*  "$rvm_path"/wrappers/*
  do
    gemset_name="${__found##*/}"
    __search_path_gems="$rvm_path/gems/${gemset_name}"
    __search_path_rubies="$rvm_path/rubies/${gemset_name}"

    if
      [[ -e "$__found" &&
        "$gemset_name" != default &&
        ! -e "$__search_path_gems" &&
        ! -e "$__search_path_rubies"
      ]]
    then
      rvm_debug "    found: $__found missing gems: $__search_path_gems or rubies: $__search_path_rubies"

      __need_a_cleanup=1

      (( ${rvm_debug_flag:-0} == 1 )) || break
    fi
  done

  (( __need_a_cleanup )) ||
  for __found in "$rvm_path"/gems/*
  do
    gemset_name="${__found##*/}"
    gemset_name="${gemset_name%@*}"
    __search_path_rubies="$rvm_path/rubies/${gemset_name}"

    if
      [[ -e "$__found" &&
        "$gemset_name" != cache &&
        ! -e "$__search_path_rubies"
      ]]
    then
      rvm_debug "    found: $__found - missing rubies: $__search_path_rubies"

      __need_a_cleanup=1

      (( ${rvm_debug_flag:-0} == 1 )) || break
    fi
  done

  if
    (( __need_a_cleanup ))
  then
    rvm_warn "  * It looks like some old stuff is laying around RVM, you can cleanup with: <code>rvm cleanup all</code>\n"
  fi
}

__rvm_notes_warning_needs_cleanup
src/rvm/scripts/functions/notes/warnings/warning_path_reset000066400000001664147511530550020443 0ustar00#!/usr/bin/env bash

__rvm_notes_warning_path_reset()
{
  \typeset -a __files

  __files=()

  for __file in ~/.zlogin ~/.zshrc ~/.bash_profile ~/.bashrc
  do
    if [[ -f "${__file}" ]]
    then __files+=( "${__file}" )
    fi
  done

  if
    [[ ${rvm_ignore_dotfiles_flag:-0} == 0 ]] &&
    (( ${#__files[@]} )) &&
    __rvm_grep -rn '^[^#]*PATH=' "${__files[@]}" |
      __rvm_grep -vE '[[:alnum:]_]PATH=|PATH=.*PATH'
  then
    # account for __rvm_grep not showing file name for just one file checked
    if (( ${#__files[*]} == 1 ))
    then __file="Your '${__files[*]}'"
    else __file="Above files"
    fi

    rvm_warn "
  * WARNING: ${__file} contains <code>PATH=</code> <warn>with no <code>\$PATH<code> <warn>inside, this can break RVM,
    for details check https://github.com/rvm/rvm/issues/1351#issuecomment-10939525
    to avoid this warning prepend <code>\$PATH<code>
"
  fi | \command \cat - >&2
}

__rvm_notes_warning_path_reset
src/rvm/scripts/functions/notes/warnings/warning_apt_get_rvm000066400000001263147511530550020607 0ustar00#!/usr/bin/env bash

__rvm_notes_warning_apt_get_rvm()
{
  if [[ "$rvm_path" == "/usr/share/ruby-rvm" ]]
  then
    rvm_warn "
  * WARNING: You are using apt-get broken RVM, you should now:
    <code>
      sudo apt-get --purge remove ruby-rvm
      sudo \command \rm -rf /usr/share/ruby-rvm /etc/rvmrc /etc/profile.d/rvm.sh
    </code>
    <warn>open new terminal and validate environment is clean from old rvm settings:

      <code>env | __rvm_grep rvm</code>

    <warn>install RVM:

      <code>curl -L https://get.rvm.io | bash -s stable --autolibs=enable</code>

    <warn>for details check:

      https://stackoverflow.com/a/9056395/497756
"
  fi
}

__rvm_notes_warning_apt_get_rvm
src/rvm/scripts/functions/notes/warnings/warning_zsh000066400000003372147511530550017107 0ustar00#!/usr/bin/env bash

__rvm_get_user_shell()
{
  case "${_system_type}:${_system_name}" in
    (Linux:*|SunOS:*|BSD:*|*:Cygwin)
      \typeset __shell
      __shell="$( getent passwd $USER )" ||
        {
          rvm_error "Error checking user shell via getent ... something went wrong, report a bug."
          return 2
        }

      echo "${__shell##*:}"
      ;;
    (Darwin:*)
      \typeset __version

      __version="$(dscl localhost -read "/Search/Users/$USER" UserShell)" ||
        {
          rvm_error "Error checking user shell via dscl ... something went wrong, report a bug."
          return 3
        }

      echo ${__version#*: }
      ;;
    (*)
      rvm_error "Do not know how to check user shell on '$(command uname)'."
      return 1
      ;;
  esac
}

__rvm_zsh_version()
{
  \typeset __user_shell

  __user_shell="$(__rvm_get_user_shell)"

  if [[ -n "${__user_shell:-}" ]]
  then
    echo "$(${__user_shell} -c 'echo $ZSH_VERSION' 2>/dev/null)"
  fi
}

__rvm_notes_warning_zsh()
{
  \typeset __zsh_version="$(__rvm_zsh_version)"

  if
      [[ -n "${__zsh_version:-}" ]]
  then
    if
      __rvm_version_compare "${__zsh_version}" -ne 4.3.12 &&
      __rvm_version_compare "${__zsh_version}" -lt 5.0.0
    then
      rvm_warn "  * WARNING: ${__user_shell} version ${__zsh_version} detected - Zsh 4.3.12 / 5.0.0+ is recommended,\n" \
               "    with current one errors to be expected - bugs in shell code interpretation."
      fi
    else

    if
      __rvm_version_compare "${__zsh_version}" -eq 5.0.3
    then
      rvm_warn "  * WARNING: ${__user_shell} version 5.0.3 detected it is BROKEN, either downgrade or upgrade it,\n" \
               "    for details see https://github.com/rvm/rvm/pull/2431"
    fi
  fi
}

__rvm_notes_warning_zsh
src/rvm/scripts/functions/notes/warnings/warning_gemrc000066400000001554147511530550017400 0ustar00#!/usr/bin/env bash

__rvm_notes_warning_gemrc()
{
  if
    [[ -z "${rvm_ignore_gemrc_issues:-}" ]]
  then
    \typeset _check _gemrc _found
    _found=0

    for _gemrc in "/etc/gemrc" "${HOME}/.gemrc"
    do
      if
        [[ -r "${_gemrc}" ]]
      then
        for _check in " -n" --user-install gemhome gempath
        do
          if
            __rvm_grep -E -- '^'"${_check}"'|^[^#]*'"${_check}" "${_gemrc}" >/dev/null
          then
            (( _found++ ))
            rvm_warn "  * WARNING: Found <code>${_check}</code> <warn>in <code>${_gemrc}</code><warn>, please remove it, as it will break rubygems in RVM."
          fi
        done
      fi
    done
    if
      (( _found ))
    then
      rvm_warn "    If it is intended or a mistake <code>export rvm_ignore_gemrc_issues=1</code> <warn>to avoid this warning.\n"
    fi
  fi
}

__rvm_notes_warning_gemrc
src/rvm/scripts/functions/notes/warnings/warning_missing_devfd000066400000000543147511530550021121 0ustar00#!/usr/bin/env bash

__rvm_notes_warning_missing_devfd ()
{
  if
    [[ ! -e /dev/fd ]]
  then
    rvm_warn "
  * WARNING: you are missing <code>/dev/fd</code> <warn>it is important for shell scripting used by RVM,
    You can fix it on most linux systems with:

      <code>ln -sf /proc/self/fd /dev/fd</code>
"
  fi
}

__rvm_notes_warning_missing_devfd
src/rvm/scripts/functions/notes/warnings/warning_var000066400000000710147511530550017064 0ustar00#!/usr/bin/env bash

__rvm_notes_warning_var()
{
  for __var in RUBYOPT RUBYLIB
  do
    if eval "[[ -n \"\${${__var}:-}\" ]]"
    then
      rvm_warn "
  * WARNING: You have <code>${__var}</code> <warn>set in your current environment.
    This may cause rubies to not work as you expect them to as it is not supported
    by all of them If errors show up, please try unsetting <code>${__var}</code> <warn>first.
"
    fi
  done
}

__rvm_notes_warning_var
src/rvm/scripts/functions/notes/warnings/warning_rvm_group000066400000001073147511530550020317 0ustar00#!/usr/bin/env bash

__rvm_notes_warning_rvm_group()
{
  if
    [[ "$rvm_path" == "/usr/local/rvm" ]] || (( UID == 0 ))
  then
    rvm_warn "  * Please do NOT forget to add your users to the <code>rvm</code> group.\n" \
             "    The installer no longer auto-adds root or users to the rvm group. Admins must do this.\n" \
             "    Also, please note that group memberships are ONLY evaluated at login time.\n" \
             "    This means that users must log out then back in before group membership takes effect!"
  fi
}

__rvm_notes_warning_rvm_group
src/rvm/scripts/functions/notes/warnings/warning_loading_script000066400000001076147511530550021303 0ustar00#!/usr/bin/env bash

__rvm_notes_warning_loading_script()
{
  if
    [[ ${rvm_ignore_dotfiles_flag:-0} == 0 ]] &&
    [[ -f /etc/profile.d/rvm.sh ]] &&
    ! __rvm_grep rvm_stored_umask /etc/profile.d/rvm.sh >/dev/null
  then
    rvm_warn "  * WARNING: your RVM loading script <code>/etc/profile.d/rvm.sh</code> <warn>is deprecated\n" \
             "    and causes you to have <code>umask g+w</code> <warn>set in your shell.\n" \
             "    Run <code>rvm get master --auto-dotfiles</code> <warn>again to fix your scripts."
  fi
}

__rvm_notes_warning_loading_script
src/rvm/scripts/functions/notes/warnings/warning_gem_home000066400000000610147511530550020053 0ustar00#!/usr/bin/env bash

__rvm_notes_warning_gem_home()
{
  if
    [[ -n "${GEM_HOME:-}" ]] && ! [[ "${GEM_HOME}" == "$rvm_path/"* ]]
  then
    rvm_warn "  * WARNING: you have set <code>GEM_HOME=\"${GEM_HOME}\"</code>\n" \
             "    <warn>This is conflicting with RVM. Make sure to call:\n\n" \
             "          <code>unset GEM_HOME</code>\n"
  fi
}

__rvm_notes_warning_gem_home
src/rvm/scripts/functions/support000066400000034064147511530550013314 0ustar00#!/usr/bin/env bash

is_a_function()
{
  \typeset -f $1 >/dev/null 2>&1 || return $?
}

# Functions RVM is built on
# __rvm_string_match <value> <string|glob>
if
  [[ -n "${ZSH_VERSION:-}" ]]
then
  __rvm_string_match()
  {
    \typeset _string _search
    _string="$1"
    shift
    while (( $# ))
    do
      _search="$1"
      _search="${_search// /[[:space:]]}"
      _search="${_search//\#/\#}"
      eval "\
      case \"\${_string}\" in\
        ($_search) return 0 ;;\
      esac\
      "
      shift
    done
    return 1
  }
else
  __rvm_string_match()
  {
    \typeset _string
    _string="$1"
    shift
    while (( $# ))
    do
      case "${_string}" in
        (${1// /[[:space:]]}) return 0 ;;
      esac
      shift
    done
    return 1
  }
fi

__rvm_array_contains()
{
  \typeset _search _iterator
  _search="$1"
  shift
  for _iterator
  do
    case "${_iterator}" in
      (${_search}) return 0 ;;
    esac
  done
  return 1
}

__rvm_array_add_or_update()
{
  \typeset _array_name _variable _separator _value _local_value
  \typeset -a _array_value_old _array_value_new

  _array_name="$1"
  _variable="$2"
  _separator="$3"
  _value="${4##${_separator}}"
  _array_value_new=()
  eval "_array_value_old=( \"\${${_array_name}[@]}\" )"

  case " ${_array_value_old[*]} " in
    (*[[:space:]]${_variable}*)
      for _local_value in "${_array_value_old[@]}"
      do
        case "${_local_value}" in
          (${_variable}*)
            _array_value_new+=( "${_local_value}${_separator}${_value}" )
            ;;
          (*)
            _array_value_new+=( "${_local_value}" )
            ;;
        esac
      done
      ;;
    (*)
      _array_value_new=( "${_array_value_old[@]}" "${_variable}${_value}" )
      ;;
  esac

  eval "${_array_name}=( \"\${_array_value_new[@]}\" )"
}

__rvm_array_prepend_or_ignore()
{
  \typeset _array_name _variable _separator _value _prefix _local_value
  \typeset -a _array_value_old _array_value_new

  _array_name="$1"
  _variable="$2"
  _separator="$3"
  _value="$4"
  _prefix="$5"
  _array_value_new=()
  eval "_array_value_old=( \"\${${_array_name}[@]}\" )"

  case " ${_array_value_old[*]} " in
    (*[[:space:]]${_variable}*)
      for _local_value in "${_array_value_old[@]}"
      do
        case "${_local_value}" in
          (${_variable}*${_prefix}*)
            rvm_debug "__rvm_array_prepend_or_ignore ${_array_name} ${_local_value}"
            _array_value_new+=( "${_local_value}" )
            ;;
          (${_variable}*)
            rvm_debug "__rvm_array_prepend_or_ignore ${_array_name} ${_variable}\"${_value}${_separator}${_local_value#${_variable}}\""
            _array_value_new+=( "${_variable}${_value}${_separator}${_local_value#${_variable}}" )
            ;;
          (*)
            _array_value_new+=( "${_local_value}" )
            ;;
        esac
      done
      eval "${_array_name}=( \"\${_array_value_new[@]}\" )"
      ;;
  esac
}

# Drop in replacement for sed -i compatible with OpenBSD
# Assumes that filename is the first argument, all others are passed onto sed
__rvm_sed_i()
{
  \typeset _filename _executable _user
  [[ -n "${1:-}" ]] || {
    rvm_debug "no file given for __rvm_sed_i"
    return 0
  }
  _filename="$1"
  shift

  if [[ -x "${_filename}" ]]
  then _executable=true
  fi
  _user="$( __rvm_statf "%u:%g" "%u:%g" "${_filename}" )"

  {
    __rvm_sed "$@" < "${_filename}" > "${_filename}.new" &&
    \command \mv -f "${_filename}.new" "${_filename}"
  } 2>&1 | rvm_debug_stream

  if [[ -n "${_executable:-}" && ! -x "${_filename}" ]]
  then chmod +x "${_filename}"
  fi
  if [[ "$_user" != "$( __rvm_statf "%u:%g" "%u:%g" "${_filename}" )" ]]
  then chown "$_user" "${_filename}"
  fi
}

# Drop in cd which _doesnt't_ respect cdpath
__rvm_cd()
{
    \typeset old_cdpath ret
    ret=0
    old_cdpath="${CDPATH}"
    CDPATH="."
    chpwd_functions="" builtin cd "$@" || ret=$?
    CDPATH="${old_cdpath}"
    return $ret
}

__rvm_setup_utils_functions()
{
  \typeset gnu_tools_path gnu_prefix gnu_util
  \typeset -a gnu_utils gnu_missing
  gnu_utils=( awk cp date find sed tail tar xargs )
  gnu_missing=()

  if is_a_function __rvm_setup_utils_functions_${_system_name}
  then __rvm_setup_utils_functions_${_system_name} "$@" || return $?
  else __rvm_setup_utils_functions_Other "$@" || return $?
  fi
}

__rvm_setup_utils_functions_Solaris()
{
  case "${_system_version}" in
    (10)
      gnu_tools_path=/opt/csw/bin
      gnu_prefix="g"
      ;;
    (11)
      gnu_tools_path=/usr/gnu/bin
      gnu_prefix=""
      ;;
  esac

  if [[ -x $gnu_tools_path/${gnu_prefix}grep ]]
  then eval "__rvm_grep() { GREP_OPTIONS=\"\" $gnu_tools_path/${gnu_prefix}grep \"\$@\" || return \$?; }"
  else gnu_missing+=( ${gnu_prefix}grep )
  fi

  if [[ "${_system_name}" == "OpenIndiana" || "${_system_version}" == "11" ]]
  then __rvm_stat() { \command \stat "$@" || return $?; }
  elif [[ -x $gnu_tools_path/${gnu_prefix}stat ]]
  then eval "__rvm_stat() { $gnu_tools_path/${gnu_prefix}stat \"\$@\" || return \$?; }"
  else gnu_missing+=( ${gnu_prefix}stat )
  fi

  if [[ "${_system_name}" == "SmartOS" ]]
  then __rvm_which() { \command \which "$@" || return $?; }
  elif [[ -x $gnu_tools_path/${gnu_prefix}which ]]
  then eval "__rvm_which() { $gnu_tools_path/${gnu_prefix}which \"\$@\" || return \$?; }"
  else gnu_missing+=( ${gnu_prefix}which )
  fi

  for gnu_util in "${gnu_utils[@]}"
  do
    if [[ -x $gnu_tools_path/$gnu_prefix$gnu_util ]]
    then eval "__rvm_$gnu_util() { $gnu_tools_path/$gnu_prefix$gnu_util \"\$@\" || return \$?; }"
    else gnu_missing+=( $gnu_prefix$gnu_util )
    fi
  done

  if
    (( ${#gnu_missing[@]} ))
  then
    rvm_error "ERROR: Missing GNU tools: ${gnu_missing[@]}. Make sure they are installed in '$gnu_tools_path/' before using RVM!"
    if [[ "${_system_name} ${_system_version}" == "Solaris 10" ]]
    then rvm_error "You might want to look at OpenCSW project to install the above mentioned tools (https://www.opencsw.org/about)"
    fi
    exit 200
  fi
}

__rvm_setup_utils_functions_OSX()
{
  if
    [[ -x /usr/bin/stat ]]
  then
    __rvm_stat() { /usr/bin/stat "$@" || return $?; }
  else
    rvm_error "ERROR: Missing (executable) /usr/bin/stat. Falling back to '\\\\command \\\\stat' which might be something else."
    __rvm_stat() { \command \stat "$@" || return $?; }
  fi
  __rvm_setup_utils_functions_common
}

__rvm_setup_utils_functions_Other()
{
  __rvm_stat() { \command \stat "$@" || return $?; }
  __rvm_setup_utils_functions_common
}

__rvm_setup_utils_functions_common()
{
  __rvm_grep() { GREP_OPTIONS="" \command \grep "$@" || return $?; }

  if \command \which --skip-alias --skip-functions which >/dev/null 2>&1
  then __rvm_which() { \command \which --skip-alias --skip-functions "$@" || return $?; }
  elif \command \which whence >/dev/null 2>&1 && \command \whence whence >/dev/null 2>&1
  then __rvm_which() { \command \whence -p "$@" || return $?; }
  elif \command \which which >/dev/null 2>&1
  then __rvm_which() { \command \which "$@" || return $?; }
  elif \which which >/dev/null 2>&1
  then __rvm_which() { \which "$@" || return $?; }
  else
    \typeset __result=$?
    rvm_error "ERROR: Missing proper 'which' command. Make sure it is installed before using RVM!"
    return ${__result}
  fi

  for gnu_util in "${gnu_utils[@]}"
  do eval "__rvm_$gnu_util() { \\$gnu_util \"\$@\" || return \$?; }"
  done
}

__rvm_setup_utils_functions || return $?

# detect system after setting up __rvm_sed and before setting up __rvm_statf
source "${rvm_scripts_path}/functions/db"
source "${rvm_scripts_path}/functions/detect/system"

__rvm_setup_statf_function()
{
  if
    [[ "${_system_type}" == Darwin || "${_system_type}" == BSD ]]
  then
    __rvm_statf()
    {
      __rvm_stat -f "$2" "$3"
    }
  else
    __rvm_statf()
    {
      __rvm_stat -c "$1" "$3"
    }
  fi
}

__rvm_setup_statf_function || return $?


__rvm_setup_sudo_function()
{
  if is_a_function __rvm_setup_sudo_function_${_system_name}
  then __rvm_setup_sudo_function_${_system_name} "$@" || return $?
  else __rvm_setup_sudo_function_Other "$@" || return $?
  fi
}

__rvm_setup_sudo_function_PCLinuxOS()
{
  __rvm_sudo()
  {
    if
      [[ "$1" == "-p" ]]
    then
      rvm_printf_to_stderr "${2//%p/[root]/}"
      shift 2
    fi
    su -c "$*"
  }
}

__rvm_setup_sudo_function_Solaris()
{
  if
    [[ -x /opt/csw/bin/sudo ]]
  then
    __rvm_sudo()
    {
      /opt/csw/bin/sudo "$@"
    }
  elif
    [[ -x /usr/bin/sudo ]]
  then
    __rvm_sudo()
    {
      /usr/bin/sudo "$@"
    }
  else
    rvm_debug "Warning: No '/opt/csw/bin/sudo' found."
  fi
}

__rvm_setup_sudo_function_Other()
{
  if
    __rvm_which sudo >/dev/null 2>&1
  then
    __rvm_sudo()
    {
      \command \sudo "$@"
    }
  else
    rvm_debug "Warning: No 'sudo' found."
  fi
}

__rvm_setup_sudo_function || return $?

# Utils that are not needed for RVM installation
# but have non-standard paths in Solaris 10
other_utils=( ant automake autoreconf libtoolize make mount patch readlink )

if
  [[ "${_system_name} ${_system_version}" == "Solaris 10" ]]
then
  __rvm_ant()        { /usr/sfw/bin/ant        "$@" || return $?; }
  __rvm_automake()   { /opt/csw/bin/automake   "$@" || return $?; }
  __rvm_autoreconf() { /opt/csw/bin/autoreconf "$@" || return $?; }
  __rvm_libtoolize() { /opt/csw/bin/libtoolize "$@" || return $?; }
  __rvm_make()       { /opt/csw/bin/gmake      "$@" || return $?; }
  __rvm_mount()      { /sbin/mount             "$@" || return $?; }
  __rvm_patch()      { /opt/csw/bin/gpatch     "$@" || return $?; }
  __rvm_readlink()   { /opt/csw/bin/greadlink  "$@" || return $?; }
else
  for other_util in "${other_utils[@]}"
  do eval "__rvm_$other_util() { \\$other_util \"\$@\" || return \$?; }"
  done
fi
unset other_util other_utils

__rvm_readlink_deep()
{
  eval "
    while [[ -n \"\${$1}\" && -L \"\${$1}\" ]]
    do $1=\"\$(__rvm_readlink \"\${$1}\")\"
    done
  "
}

## duplication marker 32fosjfjsznkjneuera48jae
__rvm_curl_output_control()
{
  if
    (( ${rvm_quiet_curl_flag:-0} == 1 ))
  then
    __flags+=( "--silent" "--show-error" )
  elif
    [[ " $*" == *" -s"* || " $*" == *" --silent"* ]]
  then
    # make sure --show-error is used with --silent
    [[ " $*" == *" -S"* || " $*" == *" -sS"* || " $*" == *" --show-error"* ]] ||
    {
      __flags+=( "--show-error" )
    }
  fi
}

## duplication marker 32fosjfjsznkjneuera48jae
# -S is automatically added to -s
__rvm_curl()
(
  \typeset curl_path
  if
    [[ "${_system_name} ${_system_version}" == "Solaris 10" ]] &&
    ! __rvm_which curl >/dev/null 2>&1
  then
    curl_path=/opt/csw/bin/
  else
    curl_path=""
  fi
  __rvm_which ${curl_path}curl >/dev/null 2>&1 ||
  {
    rvm_error "RVM requires 'curl'. Install 'curl' first and try again."
    return 200
  }

  \typeset -a __flags
  __flags=( --fail --location )

  # allow overriding default 30 minutes for download, but should be plenty of time
  if [[ -n "${rvm_curl_flags[*]}" ]]
  then __flags+=( "${rvm_curl_flags[@]}" )
  else __flags+=( --max-redirs 10 --max-time 1800 )
  fi

  [[ "$*" == *"--max-time"* ]] ||
  [[ "$*" == *"--connect-timeout"* ]] ||
  [[ "${__flags[*]}" == *"--connect-timeout"* ]] ||
    __flags+=( --connect-timeout 30 --retry-delay 2 --retry 3 )

  if [[ -n "${rvm_proxy:-}" ]]
  then __flags+=( --proxy "${rvm_proxy:-}" )
  fi

  __rvm_curl_output_control

  unset curl
  __rvm_debug_command ${curl_path}curl "${__flags[@]}" "$@" || return $?
)

is_parent_of()
{
  \typeset name pid ppid pname
  name=$1
  pid=$2
  while [[ -n "$pid" && "$pid" != "0" ]]
  do
    case "`uname`" in
      (SunOS)
        read ppid pname <<<"$(\command \ps -p $pid -o ppid= -o comm=)"
        ;;
      (*)
        read ppid pname <<<"$(\command \ps -p $pid -o ppid= -o ucomm=)"
        ;;
    esac
    if [[ -n "$ppid" && -n "$pname" ]]
    then
      if [[ "$pname" == "$name" ]]
      then
        echo $pid
        return 0
      else
        pid=$ppid
      fi
    else
      break
    fi
  done
  return 1
}

__rvm_string_includes()
{
  \typeset __search __text="$1"
  shift
  for __search in "$@"
  do
    if [[ " ${__text} " == *" ${__search} "* ]]
    then return 0
    fi
  done
  return 1
}

__function_on_stack()
{
  __rvm_string_includes "${FUNCNAME[*]}" "$@" || return $?
}

# read lines from file / stdin(-)
__rvm_read_lines()
{
  \typeset IFS
  # NEW LINE, BE CAREFUL
  IFS="
"
  if [[ "${2:--}" == "-" ]]
  then eval "$1=( \$( \command \cat - ) )"
  else eval "$1=( \$( \command \cat \"\${2:--}\" ) )"
  fi
}

__setup_lang_fallback()
{
  if
    [[ -z "${LANG:-}" ]]
  then
    LANG="$(
      {
        locale -a | __rvm_grep "^en_US.utf8" ||
        locale -a | __rvm_grep "^en_US" ||
        locale -a | __rvm_grep "^en" ||
        locale -a
      } 2>/dev/null | \command \head -n 1
    )"
    : LANG=${LANG:=en_US.utf-8}
    export LANG
    rvm_warn "\$LANG was empty, setting up LANG=$LANG, if it fails again try setting LANG to something sane and try again."
  fi
}

__rvm_ruby_config_save()
{
  \typeset ruby_path
  ruby_path="${1:-$rvm_ruby_home/bin/ruby}"
  case "$ruby_path" in
    (*/mruby*)
      __rvm_ruby_config_save_mruby "${2:-${ruby_path%%/bin/ruby}/config}"
      ;;
    (*)
      __rvm_ruby_config_save_generic "$2"
      ;;
  esac
}

__rvm_ruby_config_save_mruby()
{
  echo "target_cpu=\"$_system_arch\"" > "$1"
}

__rvm_ruby_config_save_generic()
{
  \typeset config_path default_config_path
  default_config_path="#{RbConfig::CONFIG[\"prefix\"]}/config"
  config_path="${1:-$default_config_path}"
  "$ruby_path" -rrbconfig -e '\
    File.open("'"$config_path"'","w") { |file|
      RbConfig::CONFIG.sort.each{|key,value|
        file.write("#{key.gsub(/\.|-/,"_")}=\"#{value.to_s.gsub("$","\\$")}\"\n")
      }
    }
  ' >/dev/null 2>&1
}

__rvm_record_ruby_configs()
{
  \typeset __dir
  for __dir in "$rvm_path/rubies/"*
  do
    if
      [[ ! -L "${__dir}" && ! -s "${__dir}/config" && -x "${__dir}/bin/ruby" ]]
    then
      __rvm_ruby_config_save "${__dir}/bin/ruby" "${__dir}/config" ||
      {
        \typeset string="${__dir##*/}"
        rvm_error "    Can not save config data for ruby: '${string}', most likely it is broken installation and you can:
    - try fix it: 'rvm reinstall ${string}', OR:
    - remove  it: 'rvm uninstall ${string} --gems'"
      }
    fi
  done
}

__rvm_ls() { \command \ls "$@" || return $?; }
src/rvm/scripts/functions/utility_system000066400000015460147511530550014706 0ustar00#!/usr/bin/env bash

# params: [printf_if=-] [suffix]
__rvm_system_path()
{
  rvm_remote_server_path="$(__rvm_db "rvm_remote_server_path${2:-}")"
  [[ -n "${rvm_remote_server_path}" ]] ||
  rvm_remote_server_path="${_system_name_lowercase}/${_system_version}/${_system_arch}"
  if [[ "${1:-}" == "-" ]]
  then printf "%b" "${rvm_remote_server_path}\n"
  fi
}

__rvm_remote_extension()
{
  case "$1" in
    *.tar.*)
      rvm_remote_extension="tar${1##*tar}"
      ;;
    jruby-*)
      rvm_remote_extension="tar.gz"
      ;;
    *)
      rvm_remote_extension="tar.bz2"
      ;;
  esac
  [[ "$2" != "-" ]] || printf "%b" "${rvm_remote_extension}"
}

# params: ruby-string-to-transform
__rvm_ruby_package_file()
{
  case "$1" in
    *.tar.*)
      rvm_ruby_package_file="/$1"
      ;;
    rbx*|rubinius*)
      rvm_ruby_package_file="/${1//rbx/rubinius}.$(__rvm_remote_extension "$1" -)"
      ;;
    jruby-head)
      rvm_ruby_package_file="/jruby-head.$(__rvm_remote_extension "$1" -)"
      ;;
    jruby*)
      \typeset __version
      __version="$(
        rvm_ruby_string="$1"
        rvm_remote_flag=0 __rvm_ruby_string
        echo "$rvm_ruby_version"
      )"
      rvm_ruby_package_file="/${__version}/jruby-dist-${__version}-bin.$(__rvm_remote_extension "$1" -)"
      ;;
    "")
      rvm_ruby_package_file=""
      ;;
    ruby*|mruby*)
      rvm_ruby_package_file="/$1.$(__rvm_remote_extension "$1" -)"
      ;;
    *)
      rvm_ruby_package_file="/ruby-$1.$(__rvm_remote_extension "$1" -)"
      ;;
  esac
}

__rvm_include_travis_binaries()
{
  if [[ $rvm_remote_server_url == *"travis"* && $TRAVIS != true && $_system_name_lowercase == "osx" ]]
  then
      rvm_debug "Travis binaries for OSX are not movable and can't be used outside of Travis environment. \
Skip that source."
      return 1
  fi

  return 0
}

__rvm_calculate_remote_file()
{
  rvm_remote_server_url="$( __rvm_db "rvm_remote_server_url${3:-}" )"

  [[ -n "$rvm_remote_server_url" ]] || {
    rvm_debug "rvm_remote_server_url${3:-} not found"
    return $1
  }

  __rvm_include_travis_binaries || return $1

  __rvm_system_path "" "${3:-}"
  __rvm_ruby_package_file "${4:-}"
  __remote_file="${rvm_remote_server_url}/${rvm_remote_server_path}${rvm_ruby_package_file}"
}

# params: return_on_end return_on_failed_link [suffix] [file]
__rvm_remote_server_path_single()
{
  \typeset __remote_file
  __rvm_calculate_remote_file "$@" || return $?
  if
    [[ -z "${__remote_file:-}" ]]
  then
    rvm_debug "No remote file name found"
    return $1
  elif
    file_exists_at_url "${__remote_file}"
  then
    rvm_debug "Remote file exists ${__remote_file}"
    printf "%b" "$( __rvm_db "rvm_remote_server_verify_downloads${3:-}" ):${__remote_file}"
  elif
    [[ -f "${rvm_archives_path}/${rvm_ruby_package_file##*/}" && "${rvm_ruby_package_file##*/}" == *bin-* ]]
  then
    rvm_debug "Cached file exists ${__remote_file}"
    printf "%b" "$( __rvm_db "rvm_remote_server_verify_downloads${3:-}" ):${rvm_archives_path}/${rvm_ruby_package_file##*/}"
  else
    rvm_debug "Remote file does not exist ${__remote_file}"
    return $2
  fi
}

# params: [file_name]
__rvm_remote_server_path()
{
  \typeset _iterator
  _iterator=""
  while ! __rvm_remote_server_path_single 0 1 "${_iterator}" "${1:-}"
  do : $(( _iterator+=1 ))
  done
}

__list_remote_all()
{
  \typeset _iterator rvm_remote_server_url rvm_remote_server_path
  _iterator=""

  while
    __rvm_db "rvm_remote_server_url${_iterator:-}" rvm_remote_server_url
  do
    if
      __rvm_include_travis_binaries
    then
      __rvm_system_path "" "${_iterator}"
      rvm_debug "__list_remote_all${_iterator:-} $rvm_remote_server_url $rvm_remote_server_path"

      __list_remote_for "${rvm_remote_server_url}" "$rvm_remote_server_path"
    fi
    : $(( _iterator+=1 ))
  done | \command \sort -u | __rvm_version_sort
}

__list_remote_for()
{
  __list_remote_for_local "$@" ||
  __list_remote_for_index "$@" ||
  __list_remote_for_s3    "$@" ||
  return $?
}

__list_remote_for_local()
{
  \typeset __status1 __status2
  __status1=0
  __status2=0
  if [[ -f $rvm_user_path/remote ]]
  then __rvm_grep "${1}/${2}" < $rvm_user_path/remote || __status1=$?
  fi
  __rvm_grep "${1}/${2}" < $rvm_path/config/remote || __status2=$?
  if (( __status1 || __status2 ))
  then return 1
  else rvm_debug "__list_remote_for_local found"
  fi
  true # for OSX
}

__list_remote_for_index()
{
  if
    file_exists_at_url "${1}/index.txt"
  then
    rvm_debug "__list_remote_for_index ${1}/index.txt"
    __rvm_curl -s "${1}/index.txt" | GREP_OPTIONS="" \command \grep -E "${1}/${2}/.*\.tar\.(gz|bz2)$"
  elif
    file_exists_at_url "${1}/${2}/index.txt"
  then
    rvm_debug "__list_remote_for_index ${1}/${2}/index.txt"
    __rvm_curl -s "${1}/${2}/index.txt" | GREP_OPTIONS="" \command \grep -E "${1}/${2}/.*\.tar\.(gz|bz2)$"
  else
    return 1
  fi
  true # for OSX
}

__list_remote_for_s3()
{
  curl -ILfs "${1}" | __rvm_grep "Server: AmazonS3" >/dev/null || return $?
  \typeset __tmp_name __iterator __next __local_url
  __iterator=0
  __next=""
  __tmp_name="$(
    : ${TMPDIR:=${rvm_tmp_path:-/tmp}}
    mktemp "${TMPDIR}/tmp.XXXXXXXXXXXXXXXXXX"
  )"
  while
    [[ __iterator -eq 0 || -n "${__next}" ]]
  do
    __local_url="${1}?prefix=${2}/${__next:+&marker=${__next}}"
    rvm_debug "__list_remote_for_s3-${__iterator} ${__local_url}"
    __rvm_curl -s "${__local_url}" > "${__tmp_name}${__iterator}"

    GREP_OPTIONS="" \command \grep -oE "<Key>[^<]*</Key>" < "${__tmp_name}${__iterator}" |
    __rvm_awk -F"[<>]" '{print $3}' > "${__tmp_name}"

    if __rvm_grep "<IsTruncated>true</IsTruncated>" < "${__tmp_name}${__iterator}"
    then __next="$(__rvm_tail -n 1 "${__tmp_name}")"
    else __next=""
    fi

    rm "${__tmp_name}${__iterator}"
    : $(( __iterator+=1 ))
  done
  GREP_OPTIONS="" \command \grep -E "${2}/.*\.tar\.(gz|bz2)$" < "${__tmp_name}" |
  GREP_OPTIONS="" \command \grep -v -- "-src-" |
  __rvm_awk "{ print "'"'$1/'"'"\$1 }"
  rm "${__tmp_name}"*
}

__rvm_get_user_shell()
{
  case "${_system_type}:${_system_name}" in
    (Linux:*|SunOS:*|BSD:*|Windows:Cygwin)
      __shell="$( getent passwd $USER )" ||
      {
        rvm_error "Error checking user shell via getent ... something went wrong, report a bug."
        return 2
      }
      echo "${__shell##*:}"
      ;;

    (Windows:Mingw)
      __shell="$( echo $SHELL )" ||
      {
        rvm_error "Error checking user shell from echo $SHELL ... something went wrong, report a bug."
        return 2
      }
      echo "${__shell##*:}"
      ;;

    (Darwin:*)
      \typeset __version

      __version="$(dscl localhost -read "/Search/Users/$USER" UserShell)" ||
      {
        rvm_error "Error checking user shell via dscl ... something went wrong, report a bug."
        return 3
      }
      echo ${__version#*: }
      ;;

    (*)
      rvm_error "Do not know how to check user shell on '$(command uname)'."
      return 1
      ;;
  esac
}
src/rvm/scripts/monitor000077500000005356147511530550011264 0ustar00#!/usr/bin/env bash

original_ruby_strings=$rvm_ruby_strings
original_ruby_string=$rvm_ruby_string

source "$rvm_scripts_path/base"

rvm_monitor_sleep="${rvm_monitor_sleep:-2}"

array_length()
{
  eval "echo \${#$1[*]}"
}

array_push()
{
  array=$1
  shift
  eval "$array+=( \"\$@\" )"
}

timestamp()
{
  __rvm_statf "%Y" "%m" $1
}

push_if_timestamp_changed()
{
  \typeset file file_timestamp time

  file=$1
  file_timestamp=$(timestamp "$file")

  eval "time=\$${framework}_timestamp"

  if [[ "$file_timestamp" -gt $time ]]
  then
    array_push "changed_${framework}_files" $file
  fi
}

update_timestamp()
{
  if [[ -d "${1}/" ]]
  then
    \command \touch "$rvm_path/${$}_${1}_timestamp"
    eval "${1}_timestamp=\$(timestamp \"$rvm_path/${$}_${1}_timestamp\")"
  fi
}

rvm_warn "rvm monitor is deprecated, take a look on autotest, guard, watchr or ruby-inotify"

update_timestamp "test"
update_timestamp "spec"

while : ; do
  changed_test_files=() ; changed_spec_files=() ; changed_code_files=()

  for file in lib/**/*.rb lib/*.rb app/**/*.rb app/*.rb ; do
    if [[ -f "$file" ]] ; then push_if_timestamp_changed $file "code" ; fi
  done

  for framework in test spec ; do

    if [[ -d "$framework/" ]] ; then

      for file in ${framework}/**/*_${framework}.rb ${framework}/*_${framework}.rb ; do
        if [[ -f "$file" ]] ; then
          push_if_timestamp_changed $file $framework
        fi
      done

      if [[ "$(array_length "changed_${framework}_files")" -gt 0 ]] ; then
        rvm_ruby_strings=$original_ruby_strings
        rvm_ruby_string=$original_ruby_string
        if [[ "spec" == "$framework" ]] ; then
          rvm_action="spec"
          rvm_ruby_args="spec/spec_helper.rb ${changed_spec_files[*]}"
          "$rvm_scripts_path/set" $rvm_action $rvm_ruby_args
        elif [[ "test" == "$framework" ]] ; then
          rvm_action="ruby"
          rvm_ruby_args=" -r$(echo "${changed_test_files[*]}" | __rvm_sed 's/ / -r/g') test/test_helper.rb"
          "$rvm_scripts_path/set" $rvm_action $rvm_ruby_args
        fi
        update=1
      fi

      if [[ "$(array_length "changed_code_files")" -gt 0 ]] ; then
        rvm_ruby_strings=$original_ruby_strings
        rvm_ruby_string=$original_ruby_string
        if [[ "spec" == "$framework" ]] ; then
          rvm_action="spec"
          rvm_ruby_args="spec/"
          "$rvm_scripts_path/set" $rvm_action $rvm_ruby_args
        elif [[ "test" == "$framework" ]] ; then
          rvm_action="rake"
          rvm_ruby_args="test"
          "$rvm_scripts_path/set" "$rvm_action" $rvm_ruby_args
        fi
        update=1
      fi
    fi

    if [[ "$update" -eq 1 ]] ; then
      update_timestamp $framework
    fi
  done

  unset update changed_test_files changed_spec_files

  sleep $rvm_monitor_sleep
done
src/rvm/scripts/docs000077500000007741147511530550010525 0ustar00#!/usr/bin/env bash

source "$rvm_scripts_path/base"
source "$rvm_scripts_path/functions/gemset"

rvm_docs_ruby_string="$(__rvm_env_string)"
rvm_docs_ruby_string="${rvm_docs_ruby_string%%${rvm_gemset_seperator:-"@"}*}"

if [[ "$rvm_docs_ruby_string" == "system" || -z "$rvm_docs_ruby_string" ]]
then
  rvm_error "Currently 'rvm docs ...' does not work with non-rvm rubies."
  exit 1
fi

install_ruby_source()
{
  [[ -d "${rvm_src_path}/$rvm_docs_ruby_string" ]] || (
    action="fetch"
    rubies_string="$rvm_docs_ruby_string"
    source "$rvm_scripts_path"/manage
  ) || {
    rvm_error "'rvm docs ...' requires ruby sources to be available but fetching failed, run \`rvm reinstall $rvm_docs_ruby_string --disable-binary\`"
    exit 2
  }
}

rvm_docs_type="${rvm_docs_type:-rdoc}"

# Ensure we have the doc directories.
[[ -d "${rvm_docs_path:-"$rvm_path/docs"}" ]] ||
  mkdir -p "${rvm_docs_path:-"$rvm_path/docs"}/rdoc" "${rvm_docs_path:-"$rvm_path/docs"}/yard"

open_docs()
{
  if [[ -s "${rvm_docs_path:-"$rvm_path/docs"}/$rvm_docs_ruby_string/$rvm_docs_type/index.html" ]]
  then
    if
      [[ "${DESKTOP_SESSION}" == "gnome" ]] && builtin command -v gnome-open >/dev/null
    then
      gnome-open "${rvm_docs_path:-"$rvm_path/docs"}/$rvm_docs_ruby_string/$rvm_docs_type/index.html" &>/dev/null
    elif
      [[ -n "${XDG_SESSION_COOKIE}" || -n "${XDG_SESSION_ID}" ]] && builtin command -v xdg-open >/dev/null
    then
      xdg-open "${rvm_docs_path:-"$rvm_path/docs"}/$rvm_docs_ruby_string/$rvm_docs_type/index.html" &>/dev/null
    elif
      builtin command -v open >/dev/null
    then
      open "${rvm_docs_path:-"$rvm_path/docs"}/$rvm_docs_ruby_string/$rvm_docs_type/index.html"
    else
      rvm_error "None of open, xdg-open or gnome-open were found, in order to open the docs one of these two are required. \n(OR you can let me know how else to open the html in your browser from comand line on your OS :) )"
    fi
  else
    rvm_error "$rvm_docs_type docs are missing, perhaps run 'rvm docs generate' first?"
  fi
}

run_rdoc()
{
  update_rdoc
  if rdoc -V --help >/dev/null 2>&1
  then rdoc -V "$@" || return $?
  else rdoc    "$@" || return $?
  fi
}

generate_ri()
{
  install_ruby_source
  (
    __rvm_cd "${rvm_src_path}/$rvm_docs_ruby_string/"
    __rvm_log_command "generate_ri" "Generating ri documentation" run_rdoc -a --ri-site
  )
}

generate_rdoc()
{
  install_ruby_source
  (
    __rvm_cd "${rvm_src_path}/$rvm_docs_ruby_string/"
    if
      gem list | __rvm_grep ^hanna >/dev/null 2>&1
    then
      __rvm_log_command "generate_hanna" "Generating hanna documentation" \
        hanna -o "${rvm_docs_path:-"$rvm_path/docs"}/$rvm_docs_ruby_string/$rvm_docs_type" --inline-source --line-numbers --fmt=html
    else
      __rvm_log_command "generate_rdoc" "Generating rdoc documentation" \
        run_rdoc -a -o "${rvm_docs_path:-"$rvm_path/docs"}/$rvm_docs_ruby_string/$rvm_docs_type"
    fi
  )
}

generate_gems()
{
  __rvm_log_command "generate_gems" "Generating gems documentation" \command \gem rdoc --all --ri
}

update_rdoc()
{
  if
    (( rdoc_installed == 0 ))
  then
    rdoc_installed=1
    gem_install rdoc
  fi
}

install_rdoc_data()
{
  __rvm_use ${rvm_docs_ruby_string%%@*}@global
  update_rdoc
  gem list rdoc-data | __rvm_grep "^rdoc" || gem install rdoc-data
  rdoc-data --install
}

generate_docs()
{
  case "${rvm_docs_ruby_string}" in
    (*1.8.7*|*1.9.2*|*1.9.3*|*2.0.0*|jruby*|rbx*)
      __rvm_log_command install_rdoc_data "Installing rdoc-data" \
        install_rdoc_data || return $?
      ;;
    (*)
      generate_ri
      generate_rdoc
      ;;
  esac
  generate_gems
}

args=($*)
action="${args[0]}"
args=($(echo ${args[@]:1})) # Strip trailing / leading / extra spacing.
rdoc_installed=0

case "$action" in
  rdoc_data)     install_rdoc_data ;;
  generate)      generate_docs ;;
  generate-ri)   generate_ri   ;;
  generate-rdoc) generate_rdoc ;;
  generate-gems) generate_gems ;;
  open)          open_docs     ;;
  help)          rvm_help docs ;;
  *)
    rvm_help docs
    exit 1
    ;;
esac
src/rvm/scripts/wrapper000077500000001005147511530550011240 0ustar00#!/usr/bin/env bash

unset rvm_default_flag

source "$rvm_scripts_path/base"

[[ -n "${MY_RUBY_HOME:-}" ]] || __rvm_become default
[[ -n "${MY_RUBY_HOME:-}" ]] || {
  rvm_error "No ruby used, try 'rvm use ruby' or 'rvm ruby do rvm wrapper $*'"
  exit 3
}

case "${1:-}" in
  (show|regenerate)
    run_gem_wrappers "$@"
    ;;
  (help)
    shift
    rvm_help wrapper "$@"
    ;;
  (*)
    if
      [[ -x "$1" ]]
    then
      run_gem_wrappers "$@"
    else
      rvm_help wrapper "$@"
      exit 1
    fi
    ;;
esac
src/rvm/scripts/disk-usage000077500000003775147511530550011634 0ustar00#!/usr/bin/env bash

rvm_base_except="selector"
source "$rvm_scripts_path/base"

disk_usage()
{
  \typeset directory name _pre
  name="$1"
  directory="$2"
  shift 2
  printf "%${length}s" "${name} Usage: "
  if [[ -n "$directory" && -d "$directory" && "$directory" != "/" ]]
  then
    # echo needed to clean spaces (different systems displays this differently)
    _pre="$( echo $( du -hs "$@" "${directory}/" ) )"
    echo ${_pre%% *}
  else
    echo "0B"
  fi
  return 0
}

all_disk_usage()
{
  \typeset name
  export length=30
  for name in archives repos sources logs pkg \
    rubies gemsets wrappers temporary others total
  do
    ${name}_disk_usage
  done
}

archives_disk_usage()  { disk_usage "Downloaded Archives"   "archives"; }
docs_disk_usage()      { disk_usage "Documentation"         "docs";     }
repos_disk_usage()     { disk_usage "Repositories"          "repos";    }
sources_disk_usage()   { disk_usage "Extracted Source Code" "src";      }
logs_disk_usage()      { disk_usage "Log Files"             "log";      }
pkg_disk_usage()       { disk_usage "Packages"              "usr";      }
rubies_disk_usage()    { disk_usage "Rubies"                "rubies";   }
gemsets_disk_usage()   { disk_usage "Gemsets"               "gems";     }
wrappers_disk_usage()  { disk_usage "Wrappers"              "wrappers"; }
temporary_disk_usage() { disk_usage "Temporary Files"       "tmp";      }
total_disk_usage()     { disk_usage "Total Disk"            ".";        }
others_disk_usage()
{
  \typeset flag filter
  \typeset -a flags

  if du --exclude=* . 2>/dev/null 1>/dev/null
  then flag="--exclude="
  else flag="-I "
  fi

  for filter in archives docs repos src log usr rubies gems wrappers tmp
  do flags+=( ${flag}${filter} )
  done

  disk_usage "Other Files" "." "${flags[@]}"
}

case "${1:-help}" in
  all|total|archives|docs|repos|sources|logs|pkg|rubies|gemsets|wrappers|tmp|others)
    (
      export length=""
      __rvm_cd $rvm_path
      $1_disk_usage
    )
    ;;
  help|*)
    rvm_help disk-usage
    ;;
esac
src/rvm/scripts/aliases000077500000000141147511530550011201 0ustar00alias rubydo="rvm ruby"
alias gemdo="rvm gem"
alias rakedo="rvm rake"
alias multiruby="rvm ruby"
src/rvm/scripts/fetch000077500000014662147511530550010666 0ustar00#!/usr/bin/env bash

url="$1"
archive="$2"

[[ -n "$url" ]] || rvm_fail "BUG: no url given for fetch"
shift || rvm_fail "BUG: $0 called without an argument :/"

rvm_base_except="selector"
source "$rvm_scripts_path/base"

# handled by teardown - scripts/functions/environment:314
__rvm_cleanup_download()
{
  [[ -f "$archive" ]] && __rvm_rm_rf "$archive"
}

__rvm_cd "$rvm_archives_path"

[[ -n "$archive" ]] || archive=$(basename "$url")
fetch_command=( __rvm_curl --create-dirs -C - -o "${archive}.part" )

download=1
try_ftp=0
result=0
retry=0

__rvm_checksum_read "$url" "$archive"
__rvm_checksum_any || (( ${rvm_verify_downloads_flag_cli:-${rvm_verify_downloads_flag:-1}} > 0 )) ||
  rvm_fail "There is no checksum for '$url' or '$archive', it's not possible to validate it.
This could be because your RVM install's list of versions is out of date. You may want to
update your list of rubies by running 'rvm get stable' and try again.
If that does not resolve the issue and you wish to continue with unverified download
add '--verify-downloads 1' after the command.
"

function verification_check()
{
  if
    (( ${rvm_verify_downloads_flag_cli:-${rvm_verify_downloads_flag:-1}}>=$1 ))
  then
    rvm_debug "Archive ${archive} checksum $2, continuing anyway."
  else
    rvm_warn "Archive ${archive} checksum $2, downloading again."
    download=1
  fi
}

rvm_debug "Fetch $url => $archive"

download=0
if
  [[ -e "$archive" ]]
then
  # Check first if we have the correct archive
  if
    __rvm_checksum_validate_file "$rvm_archives_path/${archive}"
  then
    rvm_debug "    ...archive checksum matched, not downloading"
  else
    case $? in
      (1) verification_check 1 "not found"     ;;
      (*) verification_check 2 "did not match" ;;
    esac
  fi
else
  rvm_debug "    ...no archive, downloading"
  download=1
fi

function download_the_url()
{
  \typeset counter=${1:-0}
  if
    (( counter >3 ))
  then
    rvm_error "ERROR: Retried 3 times and failed!"
    return 200
  fi
  "${fetch_command[@]}" "$url" &&
  \command \mv "${archive}.part" "${archive}" ||
  {
    result=$?
    case "$result" in
      (22|78)
        rvm_error "The requested url does not exist($result): '$url'"
        ;;
      (18)
        rvm_error "Partial file($result). Only a part of the file was transferred. Removing partial and re-trying."
        \command \rm -f "${archive}.part"
        download_the_url $counter
        ;;
      (33)
        rvm_debug "Server does not support 'range' command($result), removing '${archive}.part'"
        \command \rm -f "${archive}.part"
        download_the_url $counter
        ;;
      # duplication marker lfdgzkngdkjvnfjknkjvcnbjkncvjxbn
      (60)
        log "
Could not download '${_url}', you can read more about it here:
https://rvm.io/support/fixing-broken-ssl-certificates/
To continue in insecure mode run 'echo insecure >> ~/.curlrc'.
"
        ;;
      # duplication marker lfdgzkngdkjvnfjknkjvcnbjkncvjxbn
      (77)
        log "
It looks like you have old certificates, you can read more about it here:
https://rvm.io/support/fixing-broken-ssl-certificates/
"
        ;;
      # duplication marker lfdgzkngdkjvnfjknkjvcnbjkncvjxbn
      (141)
        rvm_warn "Curl returned 141 - it is result of a segfault which means it's Curls fault.
Try again and if it crashes more than a couple of times you either need to
reinstall Curl or consult with your distribution manual and contact support."
        ;;
      (*)
        rvm_error "There was an error($result)."
        ;;
    esac
    return $result
  }
}

if
  (( download > 0 ))
then
  download_the_url ||
  {
    \typeset __fallback __default_url __default __iterator result=$?
    \typeset -a __fallbacks
    __fallbacks=()
    for __default in ruby rubygems
    do
      __default_url="$(__rvm_db ${__default}_url)"
      if
        [[ "${url}" == "${__default_url}"* ]]
      then
        __iterator=1
        while
          __fallback="$(__rvm_db ${__default}_url_fallback_${__iterator})" &&
          [[ -n "${__fallback}" ]]
        do
          __fallback_patern="$(__rvm_db ${__default}_url_fallback_${__iterator}_pattern)"
          if
            [[ -n "${__fallback_patern}" ]]
          then
            __fallbacks+=( "$(__rvm_sed -E "s#${__fallback_patern}#${__fallback}#" <<<"${url}")" )
          else
            __fallbacks+=( "${url/${__default_url}/${__fallback}}" )
          fi
          : $(( __iterator+=1 ))
        done
      fi
    done
    if
      [[ -n "${__fallbacks[*]}" ]] # already detected something
    then
      true
    elif
      [[ "${url}" == "http://"* ]]
    then
      __fallbacks+=( "${url/http:/ftp:}"  "${url/http:\/\//https://www.mirrorservice.org/sites/}"  )
    elif
      [[ "${url}" == "https://"* ]]
    then
      __fallbacks+=( "${url/https:/ftp:}" "${url/https:\/\//https://www.mirrorservice.org/sites/}" )
    else
      rvm_fail "
No fallback URL can be calculated for ${url}, open a ticket with full output here:

    https://github.com/rvm/rvm/issues

" $result
    fi
    for __fallback in "${__fallbacks[@]}"
    do
      rvm_warn "Checking fallback: ${__fallback}"
      if
        file_exists_at_url "${__fallback}"
      then
        url="${__fallback}"
        download_the_url 1 || rvm_fail "Failed download" $?
        result=0
        break
      fi
    done
    if
      (( result ))
    then
      rvm_fail "\
No fallback URL could be found, try increasing timeout with:

    echo \"export rvm_max_time_flag=20\" >> ~/.rvmrc
" $result
    fi
  }
fi

# Check if we have downloaded the correct archive
if
  __rvm_checksum_validate_file "$rvm_archives_path/${archive}"
then
  rvm_debug "Downloaded archive checksum matched."
else
  result=$?
  if
   (( result==1 && ${rvm_verify_downloads_flag_cli:-${rvm_verify_downloads_flag:-1}}>0 ))
  then
    rvm_warn "No checksum for downloaded archive, recording checksum in user configuration."
    __rvm_checksum_calculate_file "$archive"
    __rvm_checksum_write          "$url"
  elif
   (( result>1  && ${rvm_verify_downloads_flag_cli:-${rvm_verify_downloads_flag:-1}}>1 ))
  then
    rvm_warn "Downloaded archive checksum did not match!"
  elif
   (( result == 1 ))
  then
    rvm_fail "Downloaded archive checksum could not be verified!
If you wish to continue with unverified download add '--verify-downloads 1' after the command.
"
  else
    \command \rm -f $archive
    rvm_fail "Downloaded archive checksum did not match, archive was removed!
If you wish to continue with not matching download add '--verify-downloads 2' after the command.
"
  fi
fi
src/rvm/scripts/extras/bash_zsh_support/LICENSE000066400000016717147511530550015562 0ustar00GNU LESSER GENERAL PUBLIC LICENSE
                       Version 3, 29 June 2007

 Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
 Everyone is permitted to copy and distribute verbatim copies
 of this license document, but changing it is not allowed.


  This version of the GNU Lesser General Public License incorporates
the terms and conditions of version 3 of the GNU General Public
License, supplemented by the additional permissions listed below.

  0. Additional Definitions.

  As used herein, "this License" refers to version 3 of the GNU Lesser
General Public License, and the "GNU GPL" refers to version 3 of the GNU
General Public License.

  "The Library" refers to a covered work governed by this License,
other than an Application or a Combined Work as defined below.

  An "Application" is any work that makes use of an interface provided
by the Library, but which is not otherwise based on the Library.
Defining a subclass of a class defined by the Library is deemed a mode
of using an interface provided by the Library.

  A "Combined Work" is a work produced by combining or linking an
Application with the Library.  The particular version of the Library
with which the Combined Work was made is also called the "Linked
Version".

  The "Minimal Corresponding Source" for a Combined Work means the
Corresponding Source for the Combined Work, excluding any source code
for portions of the Combined Work that, considered in isolation, are
based on the Application, and not on the Linked Version.

  The "Corresponding Application Code" for a Combined Work means the
object code and/or source code for the Application, including any data
and utility programs needed for reproducing the Combined Work from the
Application, but excluding the System Libraries of the Combined Work.

  1. Exception to Section 3 of the GNU GPL.

  You may convey a covered work under sections 3 and 4 of this License
without being bound by section 3 of the GNU GPL.

  2. Conveying Modified Versions.

  If you modify a copy of the Library, and, in your modifications, a
facility refers to a function or data to be supplied by an Application
that uses the facility (other than as an argument passed when the
facility is invoked), then you may convey a copy of the modified
version:

   a) under this License, provided that you make a good faith effort to
   ensure that, in the event an Application does not supply the
   function or data, the facility still operates, and performs
   whatever part of its purpose remains meaningful, or

   b) under the GNU GPL, with none of the additional permissions of
   this License applicable to that copy.

  3. Object Code Incorporating Material from Library Header Files.

  The object code form of an Application may incorporate material from
a header file that is part of the Library.  You may convey such object
code under terms of your choice, provided that, if the incorporated
material is not limited to numerical parameters, data structure
layouts and accessors, or small macros, inline functions and templates
(ten or fewer lines in length), you do both of the following:

   a) Give prominent notice with each copy of the object code that the
   Library is used in it and that the Library and its use are
   covered by this License.

   b) Accompany the object code with a copy of the GNU GPL and this license
   document.

  4. Combined Works.

  You may convey a Combined Work under terms of your choice that,
taken together, effectively do not restrict modification of the
portions of the Library contained in the Combined Work and reverse
engineering for debugging such modifications, if you also do each of
the following:

   a) Give prominent notice with each copy of the Combined Work that
   the Library is used in it and that the Library and its use are
   covered by this License.

   b) Accompany the Combined Work with a copy of the GNU GPL and this license
   document.

   c) For a Combined Work that displays copyright notices during
   execution, include the copyright notice for the Library among
   these notices, as well as a reference directing the user to the
   copies of the GNU GPL and this license document.

   d) Do one of the following:

       0) Convey the Minimal Corresponding Source under the terms of this
       License, and the Corresponding Application Code in a form
       suitable for, and under terms that permit, the user to
       recombine or relink the Application with a modified version of
       the Linked Version to produce a modified Combined Work, in the
       manner specified by section 6 of the GNU GPL for conveying
       Corresponding Source.

       1) Use a suitable shared library mechanism for linking with the
       Library.  A suitable mechanism is one that (a) uses at run time
       a copy of the Library already present on the user's computer
       system, and (b) will operate properly with a modified version
       of the Library that is interface-compatible with the Linked
       Version.

   e) Provide Installation Information, but only if you would otherwise
   be required to provide such information under section 6 of the
   GNU GPL, and only to the extent that such information is
   necessary to install and execute a modified version of the
   Combined Work produced by recombining or relinking the
   Application with a modified version of the Linked Version. (If
   you use option 4d0, the Installation Information must accompany
   the Minimal Corresponding Source and Corresponding Application
   Code. If you use option 4d1, you must provide the Installation
   Information in the manner specified by section 6 of the GNU GPL
   for conveying Corresponding Source.)

  5. Combined Libraries.

  You may place library facilities that are a work based on the
Library side by side in a single library together with other library
facilities that are not Applications and are not covered by this
License, and convey such a combined library under terms of your
choice, if you do both of the following:

   a) Accompany the combined library with a copy of the same work based
   on the Library, uncombined with any other library facilities,
   conveyed under the terms of this License.

   b) Give prominent notice with the combined library that part of it
   is a work based on the Library, and explaining where to find the
   accompanying uncombined form of the same work.

  6. Revised Versions of the GNU Lesser General Public License.

  The Free Software Foundation may publish revised and/or new versions
of the GNU Lesser General Public License from time to time. Such new
versions will be similar in spirit to the present version, but may
differ in detail to address new problems or concerns.

  Each version is given a distinguishing version number. If the
Library as you received it specifies that a certain numbered version
of the GNU Lesser General Public License "or any later version"
applies to it, you have the option of following the terms and
conditions either of that published version or of any later version
published by the Free Software Foundation. If the Library as you
received it does not specify a version number of the GNU Lesser
General Public License, you may choose any version of the GNU Lesser
General Public License ever published by the Free Software Foundation.

  If the Library as you received it specifies that a proxy can decide
whether future versions of the GNU Lesser General Public License shall
apply, that proxy's public statement of acceptance of any version is
permanent authorization for you to choose that version for the
Library.src/rvm/scripts/extras/bash_zsh_support/chpwd/README.md000066400000001142147511530550017123 0ustar00# Bash support for Zsh like chpwd hook

Implemented based on the description from
http://zsh.sourceforge.net/Doc/Release/Functions.html#Hook-Functions

## Usage

1. load `function.sh` and `load.sh`, eg:

        source chpwd/functions.sh
        source chpwd/load.sh

2. add the hook - replace `_hook_name` with your function name:

        export -a chpwd_functions                              # define hooks as an shell array
        [[ " ${chpwd_functions[*]} " == *" _hook_name "* ]] || # prevent double addition
        chpwd_functions+=(_hook_name)                          # finally add it to the list
src/rvm/scripts/extras/bash_zsh_support/chpwd/load.sh000066400000000271147511530550017121 0ustar00[[ -n "${ZSH_VERSION:-}" ]] ||
{
  function cd()    { __zsh_like_cd cd    "$@" ; }
  function popd()  { __zsh_like_cd popd  "$@" ; }
  function pushd() { __zsh_like_cd pushd "$@" ; }
}
src/rvm/scripts/extras/bash_zsh_support/chpwd/function.sh000066400000000523147511530550020027 0ustar00function __zsh_like_cd()
{
  \typeset __zsh_like_cd_hook
  if
    builtin "$@"
  then
    for __zsh_like_cd_hook in chpwd "${chpwd_functions[@]}"
    do
      if \typeset -f "$__zsh_like_cd_hook" >/dev/null 2>&1
      then "$__zsh_like_cd_hook" || break # finish on first failed hook
      fi
    done
    true
  else
    return $?
  fi
}
src/rvm/scripts/extras/bash_zsh_support/README.md000066400000000107147511530550016016 0ustar00bash_zsh_support
================

support Zsh function hooks for Bash
src/rvm/scripts/extras/java_read_properties/ReadProperties.class000066400000001121147511530550021306 0ustar00���3&


	
<init>()VCodeLineNumberTablemain([Ljava/lang/String;)V
StackMapTable
SourceFileReadProperties.java	 !"#$%ReadPropertiesjava/lang/Objectjava/lang/Stringjava/lang/Systemexit(I)VgetProperty&(Ljava/lang/String;)Ljava/lang/String;outLjava/io/PrintStream;java/io/PrintStreamprintln(Ljava/lang/String;)V!	
*��	

W *���*2�L+���+��				�src/rvm/scripts/extras/java_read_properties/.gitignore000066400000000025147511530550017321 0ustar00ReadProperties.class
src/rvm/scripts/extras/java_read_properties/ReadProperties.java000066400000000372147511530550021131 0ustar00public class ReadProperties
{
  public static void main(String[] args)
  {
    if (args.length == 0) System.exit(1);
    String property = System.getProperty(args[0]);
    if (property == null) System.exit(2);
    System.out.println(property);
  }
}
src/rvm/scripts/extras/java_read_properties/README.md000066400000000766147511530550016624 0ustar00# Java Read Properties

Read java system properties

## Usage

Download [ReadProperties.class](https://github.com/mpapis/java_read_properties/releases/download/1.0.0/ReadProperties.class)(right click - save as) or:

    wget https://github.com/mpapis/java_read_properties/releases/download/1.0.0/ReadProperties.class

Run:

    java ReadProperties java.home

And it will display:

    /usr/lib64/jvm/java-1.7.0-openjdk-1.7.0/jre

## Development

Fork the repository and open pull request with changes.
src/rvm/scripts/extras/java_read_properties/LICENSE000066400000001055147511530550016342 0ustar00Copyright (c) 2013 Michal Papis

Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at

    http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
src/rvm/scripts/extras/rails000066400000014136147511530550012206 0ustar00#!/usr/bin/env bash

# Copyright (c) 2011 Wayne E. Seguin <wayneeseguin@gmail.com>
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#     http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.

#
# This feature is opt-in, in order to use the functions provided below source
# this script in your start up from your profile(s).
#
# For example, if RVM is installed to $HOME/.rvm, you can put this in your
# ~/.bash_profile:
#
# [[ -s "$HOME/.rvm/scripts/extras/rails" ]] && . "$HOME/.rvm/scripts/extras/rails"
#

enable_extendglob() {
  if [[ -n "${ZSH_VERSION:-}" ]] ; then
    setopt extendedglob
  else
    if [[ -n "${BASH_VERSION:-}" ]] ; then
      shopt -s extglob # Extended globs
    else
      printf "%b" "What the heck kind of shell are you running here???\n"
    fi
  fi
}

rails_routes()
{
  # Usage:
  #
  #   rails_routes <or list, space separated> [options]
  #
  #   include string is a valid shell glob: http://mywiki.wooledge.org/glob
  #
  #   options are among
  #
  #     * a valid shell glob pattern
  #     * -a <and glob>
  #     * -o <or glob>
  #     * -e <exclude (not) glob>
  #
  #   Processing occurs as ((or list) AND (and list)) NOT (exclude list)
  #
  # Examples:
  #
  #   rails_routes admin
  #                       /admin/reports/agent/:id(.:format)        {:controller=>"reports", :action=>"agent"}
  #
  #   rails_routes "P@(OS|U)T"
  #                POST   /current(.:format)                        {:action=>"create", :controller=>"current"}
  #                PUT    /current/:id(.:format)                    {:action=>"update", :controller=>"current"}
  #
  #   or, equivalently, rails_routes POST -o PUT
  #
  #   List all routes containing admin but not test
  #   rails_routes admin -e test
  #
  #   rails_routes

  enable_extendglob

  \typeset md5_current md5_cached cache_file routes
  \typeset -a ands ors nots

  while [[ $# -gt 0 ]] ; do
    token="$1" ; shift
    case "$token" in

      --trace)
        set -o xtrace
        export PS4="+ \${BASH_SOURCE##\${rvm_path:-}} : \${FUNCNAME[0]:+\${FUNCNAME[0]}()}  \${LINENO} > "
        ;;

      -a|and)
        ands=(${ands[@]} "$1")
        shift
        ;;

      -o|or)
        ors=(${ors[@]} "$1")
        shift
        ;;

      -e|exclude)
        nots=(${exclude[@]} "$1")
        shift
        ;;
      *) # Default is or.
        ors=(${ors[@]} "$token")
        ;;
    esac
  done

  [[ -d tmp/rake ]] || mkdir -p "tmp/rake"
  cache_file="tmp/rake/routes"

  if ! builtin command -v rake >/dev/null 2>&1 ; then
    printf "%b" "ERROR: rake not found.\n" >&2
    return 1
  fi

  case ${_system_type} in
    Linux)  md5="md5sum" ;;
    Darwin) md5="/sbin/md5 -q" ;;
    *)      printf "%b" "ERROR: Unknown OS Type.\n" >&2 ;  return 1 ;;
  esac

  md5_current=$($md5 config/routes.rb)
  md5_current=${md5%% *}

  if [[ -s "$cache_file" && -s "$cache_file.md5" ]]; then
    md5_cached=$(\command \cat -v "${cache_file}.md5")
    md5_cached=${md5%% *}
  else
    md5_cached=""
  fi

  if [[ -s "$cache_file" && $md5_current == $md5_cached ]]; then
    routes=$(\command \cat -v "$cache_file")
  else
    routes=$(rake routes 2>/dev/null)
    if [[ $? -gt 0 ]]; then
      printf "%b" "ERROR: There was an error running 'rake routes', does your application load console properly?" >&2
      return 1
    else
      printf "%b" "$md5_current" > "${cache_file}.md5"
      printf "%b" "$routes" > "$cache_file"
    fi
  fi
  routes="${routes#\|\(in *\)}"

  orig_ifs="$IFS"
  condition="${ors[@]}"
  condition="*${condition// /*|*}*"

  IFS="
"
  # ORs
  results=()

  for route in ${routes} ; do
    eval "case '${route}' in (${condition}) results=(\"${results[@]}\" \"${route}\") ;; esac"
  done
  routes=(${results[@]})


  # ANDs
  results=()
  for condition in "${ands[@]}" ; do
    for route in ${routes[@]} ; do
      if [[ ${route} == ${condition} ]]; then
        results=(${results[@]} ${route})
      fi
    done
    routes=(${results[@]})
    results=()
  done

  # NOTs
  results=()
  for condition in "${nots[@]}" ; do
    for route in ${routes[@]} ; do
      if [[ ${route} != *${condition}* ]]; then
        results=(${results[@]} ${route})
      fi
    done
    routes=(${results[@]})
    results=()
  done

  for route in ${routes[@]} ; do
    printf "%b" "${route}\n"
  done

  IFS="$orig_ifs"
}

#
# r - Rails scripts helper function.
#
r() {
  \typeset action args

  action="$1" ; shift

  args="$@"

  enable_extendglob

  case "$action" in

    c|console)
      action=console
      ;;

    d|db)
      action=dbconsole
      ;;

    g|generate)
      action=generate
      ;;

    d|destroy)
      action=destroy
      ;;

    s|server)
      action=server
      ;;

    r|routes)
      rails_routes $args
      return $?
      ;;
    n|new)
      rails_version=$(rails -v)
      rails_version=${rails_version##* }
      rails_version=${rails_version%%.*}
      if [[ $rails_version -ge 3 ]]; then
        rails new $args
      elif [[ $rails_version == 1 || $rails_version == 2 ]] ; then
        rails $args
      fi
      ;;

    (*(-)@(h|?|help))
      action="-h"
      ;;

    (*(-)@(v|V|version))
      action="-h"
      ;;

    usage)
      printf "%b" "

r - Rails shell convenience function

Usage:

  r [action]

Actions:

  c - Start a Rails Console
  d - Start a database console
  c - rails generate
  s - rails server
  r - rails routes <include filter glob> [-e <exclude filter glob>]

      \n"
      ;;

  esac

  if [[ -s ./bin/rails ]] ; then  # For Rails4 or bundler's binstubs

    ruby ./bin/rails $action $args

  elif [[ -s ./script/rails ]] ; then

    ruby ./script/rails $action $args

  elif [[ -s ./script/$action ]] ; then

      ruby ./script/$action $args

  else

    printf "%b" "ERROR: rails $action not found!!!"

  fi

  return 0
}
src/rvm/scripts/extras/completion.bash000077500000021231147511530550014156 0ustar00#!/usr/bin/env bash

# bash completion for Ruby Version Manager (RVM)

__rvm_comp()
{
  \typeset cur
  cur="${COMP_WORDS[COMP_CWORD]}"
  COMPREPLY=($(compgen -W "$1" -- "$cur"))
  return 0
}

__rvm_subcommand()
{
  \typeset word subcommand c
  c=1

  while [[ $c -lt $COMP_CWORD ]] ; do
    word="${COMP_WORDS[c]}"
    for subcommand in $1; do
      if [[ "$subcommand" == "$word" ]]; then
        echo "$subcommand"
        return
      fi
    done
    c=$((++c))
  done
}

__rvm_rubies ()
{
  echo "$(rvm list strings) default system  $(rvm alias list names)"
}

__rvm_gemsets ()
{
  echo "$(rvm gemset list | __rvm_grep -v gemset 2>/dev/null)"
}

__rvm_help_pages ()
{
  \command \ls "$rvm_help_path"
}

__rvm_known ()
{
  # Strips comments and expands known patterns into each variation
  rvm list known | __rvm_sed -e 's/#.*$//;' \
                       -e '/^$/d;' \
                       -e 's/^\[\(.*-\)\]\(.*\)\[\(-.*\)\]$/\1\2\3 \1\2 \2\3 \2/;' \
                       -e 's/^\[\(.*-\)\]\(.*\)$/\1\2 \2/;' \
                       -e 's/^\(.*\)\[\(-.*\)\]\[\(-.*\)\]$/\1\2\3 \1\2 \1/;' \
                       -e 's/^\(.*\)\[\(-.*\)\]$/\1\2 \1/ ' # | \command \tr ' ' "\n" | sort
}

_rvm_commands ()
{
  \typeset cur
  cur=${COMP_WORDS[COMP_CWORD]}

  COMMANDS='\
        version use reload implode update reset info debug\
        install uninstall reinstall remove\
        ruby gem rake tests specs monitor gemset\
        gemdir fetch list package notes snapshot\
        help automount disk-usage upgrade current migrate\
        alias autolibs cleanup cron docs get config-get\
        snapshot export fix-permissions repair rubygems\
        tools user info usage rvmrc osx-ssl-certs patchset\
        pkg group requirements do unexport wrapper'

  case "${cur}" in
  -*)       _rvm_opts ;;
  *)        __rvm_comp "$COMMANDS $(__rvm_rubies)" ;;
  esac
}

_rvm_opts ()
{
  RVM_OPTS='\
    -h\
    --help\
    -v\
    --version\
    -l --level\
    --bin\
    --gems\
    --archive\
    --patch
    -S\
    -e\
    -G\
    -C\
    --configure\
    --nice\
    --ree-options\
    --head\
    --rubygems\
    --default\
    --debug\
    --trace\
    --force\
    --summary\
    --latest\
    --docs\
    --reconfigure\
    --quiet-curl\
    --create'

  __rvm_comp "$RVM_OPTS"
}

_rvm_use ()
{
  \typeset _command
  _command="${COMP_WORDS[COMP_CWORD-2]}"

  case "${_command}" in
  gemset) __rvm_comp "$(__rvm_gemsets)" ;;
  *)      __rvm_comp "$(__rvm_rubies)" ;;
  esac
}

_rvm_gemset ()
{
  \typeset subcommand subcommands
  subcommands="import export create copy rename move empty delete remove name dir list list_all gemdir install pristine clear use update unpack globalcache"
  subcommand="$(__rvm_subcommand "$subcommands")"

  if [[ -z "$subcommand" ]]; then
    __rvm_comp "$subcommands"
    return
  fi
}

_rvm_remove ()
{
  \typeset subcommand subcommands
  subcommands="all old --gems --archive $(__rvm_rubies)"
  subcommand="$(__rvm_subcommand "$subcommands")"

  if [[ -z "$subcommand" ]]; then
    __rvm_comp "$subcommands"
    return
  fi
}

_rvm_disk_usage()
{
  \typeset subcommand subcommands
  subcommands="all total archives docs repos sources logs pkg rubies gemsets wrappers tmp others"
  subcommand="$(__rvm_subcommand "$subcommands")"

  if [[ -z "$subcommand" ]]; then
    __rvm_comp "$subcommands"
    return
  fi
}

_rvm_list()
{
  \typeset subcommand subcommands
  subcommands="help known remote gemsets default rubies strings known_strings ruby_svn_tags"
  subcommand="$(__rvm_subcommand "$subcommands")"

  if [[ -z "$subcommand" ]]; then
    __rvm_comp "$subcommands"
    return
  fi
}

_rvm_reinstall()
{
  \typeset subcommand subcommands
  subcommands="$(rvm list strings)"
  subcommand="$(__rvm_subcommand "$subcommands")"

  if [[ -z "$subcommand" ]]; then
    __rvm_comp "$subcommands"
    return
  fi
}

_rvm_uninstall()
{
  \typeset subcommand subcommands
  subcommands="$(rvm list strings) --gems"
  subcommand="$(__rvm_subcommand "$subcommands")"

  if [[ -z "$subcommand" ]]; then
    __rvm_comp "$subcommands"
    return
  fi
}

_rvm_upgrade()
{
  \typeset subcommand subcommands
  subcommands="$(rvm list strings)"
  subcommand="$(__rvm_subcommand "$subcommands")"

  if [[ -z "$subcommand" ]]; then
    __rvm_comp "$subcommands"
    return
  fi
}

_rvm_migrate()
{
  \typeset subcommand subcommands
  subcommands="$(rvm list strings)"
  subcommand="$(__rvm_subcommand "$subcommands")"

  if [[ -z "$subcommand" ]]; then
    __rvm_comp "$subcommands"
    return
  fi
}

_rvm_autolibs()
{
  \typeset subcommand subcommands
  subcommands="disable disabled read read-only fail read-fail packages enable enabled reset status help show"
  subcommand="$(__rvm_subcommand "$subcommands")"

  if [[ -z "$subcommand" ]]; then
    __rvm_comp "$subcommands"
    return
  fi
}

_rvm_cleanup()
{
  \typeset subcommand subcommands
  subcommands="all archives checksums repos sources logs gemsets links"
  subcommand="$(__rvm_subcommand "$subcommands")"

  if [[ -z "$subcommand" ]]; then
    __rvm_comp "$subcommands"
    return
  fi
}

_rvm_cron()
{
  \typeset subcommand subcommands
  subcommands="setup remove"
  subcommand="$(__rvm_subcommand "$subcommands")"

  if [[ -z "$subcommand" ]]; then
    __rvm_comp "$subcommands"
    return
  fi
}

_rvm_docs()
{
  \typeset subcommand subcommands
  subcommands="generate generate-ri generate-rdoc generate-gems rdoc_data"
  subcommand="$(__rvm_subcommand "$subcommands")"

  if [[ -z "$subcommand" ]]; then
    __rvm_comp "$subcommands"
    return
  fi
}

_rvm_get()
{
  \typeset subcommand subcommands
  subcommands="stable latest head master branch help --auto-dotfiles --autolibs="
  subcommand="$(__rvm_subcommand "$subcommands")"

  if [[ -z "$subcommand" ]]; then
    __rvm_comp "$subcommands"
    return
  fi
}

_rvm_snapshot()
{
  \typeset subcommand subcommands
  subcommands="load save"
  subcommand="$(__rvm_subcommand "$subcommands")"

  if [[ -z "$subcommand" ]]; then
    __rvm_comp "$subcommands"
    return
  fi
}

_rvm_fix_permissions()
{
  \typeset subcommand subcommands
  subcommands="user system"
  subcommand="$(__rvm_subcommand "$subcommands")"

  if [[ -z "$subcommand" ]]; then
    __rvm_comp "$subcommands"
    return
  fi
}

_rvm_repair()
{
  \typeset subcommand subcommands
  subcommands="symlinks environments archives all"
  subcommand="$(__rvm_subcommand "$subcommands")"

  if [[ -z "$subcommand" ]]; then
    __rvm_comp "$subcommands"
    return
  fi
}

_rvm_rubygems()
{
  \typeset subcommand subcommands
  subcommands="latest current master head"
  subcommand="$(__rvm_subcommand "$subcommands")"

  if [[ -z "$subcommand" ]]; then
    __rvm_comp "$subcommands"
    return
  fi
}

_rvm_tools()
{
  \typeset subcommand subcommands
  subcommands="identifier path-identifier strings mirror rvm-env"
  subcommand="$(__rvm_subcommand "$subcommands")"

  if [[ -z "$subcommand" ]]; then
    __rvm_comp "$subcommands"
    return
  fi
}

_rvm_user()
{
  \typeset subcommand subcommands
  subcommands="all gemsets"
  subcommand="$(__rvm_subcommand "$subcommands")"

  if [[ -z "$subcommand" ]]; then
    __rvm_comp "$subcommands"
    return
  fi
}

_rvm_info()
{
  \typeset subcommand subcommands
  subcommands="$(rvm list strings) system rvm ruby homes binaries environment debug"
  subcommand="$(__rvm_subcommand "$subcommands")"

  if [[ -z "$subcommand" ]]; then
    __rvm_comp "$subcommands"
    return
  fi
}

_rvm_rvmrc()
{
  \typeset subcommand subcommands
  subcommands="trust untrust trusted load reset create warning"
  subcommand="$(__rvm_subcommand "$subcommands")"

  if [[ -z "$subcommand" ]]; then
    __rvm_comp "$subcommands"
    return
  fi
}

_rvm_osx_ssl_certs()
{
  \typeset subcommand subcommands
  subcommands="status update cron"
  subcommand="$(__rvm_subcommand "$subcommands")"

  if [[ -z "$subcommand" ]]; then
    __rvm_comp "$subcommands"
    return
  fi
}

_rvm_help ()
{
  __rvm_comp "$(__rvm_help_pages)"
}

_rvm_install ()
{
  __rvm_comp "$(__rvm_known)"
}

_rvm ()
{
  \typeset prev
  prev=${COMP_WORDS[COMP_CWORD-1]}

  case "${prev}" in
  use)      _rvm_use ;;
  gemset)   _rvm_gemset ;;
  help)     _rvm_help ;;
  install)  _rvm_install ;;
  autolibs) _rvm_autolibs ;;
  disk-usage) _rvm_disk_usage ;;
  reinstall) _rvm_reinstall ;;
  uninstall) _rvm_uninstall ;;
  upgrade)  _rvm_upgrade ;;
  list)     _rvm_list ;;
  remove)   _rvm_remove ;;
  migrate) _rvm_migrate ;;
  cleanup) _rvm_cleanup ;;
  snapshot) _rvm_snapshot ;;
  cron)    _rvm_cron ;;
  fix-permissions)    _rvm_fix_permissions ;;
  docs)    _rvm_docs ;;
  repair)    _rvm_repair ;;
  rubygems)    _rvm_rubygems ;;
  get)    _rvm_get ;;
  tools)    _rvm_tools ;;
  user)    _rvm_user ;;
  info)    _rvm_info ;;
  rvmrc)    _rvm_rvmrc ;;
  osx-ssl-certs)    _rvm_osx_ssl_certs ;;
  *)        _rvm_commands ;;
  esac

  return 0
}
src/rvm/scripts/extras/chruby.sh000066400000001630147511530550012774 0ustar00#!/usr/bin/env bash

# Set RUBIES when sourced.
RUBIES=($( \command \ls -1d "$rvm_path/rubies"/* 2>/dev/null ))

# Install rubies via rvm and reload RUBIES
function mrvm()
{
  \typeset __result=0
  # duplication marker jdgkjnfnkjdngjkfnd4fd
  if
    [[ -z "$rvm_path" ]]
  then
    \typeset reset_rvm_path=true
    if [[ -n "${BASH_SOURCE:-$_}" && -f "${BASH_SOURCE:-$_}" ]]
    then
      export rvm_path="${BASH_SOURCE:-$_}"
      rvm_path="$( \command \cd "${rvm_path%/scripts/extras/chruby.sh}">/dev/null; pwd )"
    elif [[ -x "$HOME/.rvm/bin/rvm" ]]
    then export rvm_path="$HOME/.rvm"
    elif [[ -x "/usr/local/rvm/bin/rvm" ]]
    then export rvm_path="/usr/local/rvm"
    else return 127
    fi
  fi
  "$rvm_path/bin/rvm" "$@" || __result=$?
  RUBIES=($( \command \ls -1d "$rvm_path/rubies"/* 2>/dev/null ))
  if [[ -n "${reset_rvm_path:-}" ]]
  then unset rvm_path reset_rvm_path
  fi
  return ${__result}
}
src/rvm/scripts/extras/rvm.fish000066400000000633147511530550012625 0ustar00#!/usr/bin/env fish

function load_env_file
  sed -e "s/export\(.*\);\(.*\)=/set -x \1 /" -e "s/export\(.*\)=/set -x \1 /" -e 's/unset/set -e /' -e "/ PATH / s/[\"':]/ /g" -e 's/$/; /' < $argv | source
end

load_env_file ~/.rvm/environments/default

function rvm
  switch $argv[1]
  case 'use'
    load_env_file (~/.rvm/bin/rvm $argv do rvm env --path | tail -n 1)
  case '*'
    ~/.rvm/bin/rvm $argv
  end
end
src/rvm/scripts/manage000077500000001334147511530550011015 0ustar00#!/usr/bin/env bash

# __rvm_detect_system() does not support AIX
sys=$( command uname -s )
if [[ "${sys}" == AIX ]]
then name_opt=-name
else name_opt=-iname
fi
original_ruby_version=${rvm_ruby_version:-""}
original_ruby_string=${rvm_ruby_string:-""}

source "$rvm_scripts_path/patches"
source "$rvm_scripts_path/functions/build"
source "$rvm_scripts_path/functions/pkg"
source "$rvm_scripts_path/functions/irbrc"
source "$rvm_scripts_path/functions/support"
source "$rvm_scripts_path/functions/rubygems"
source "$rvm_scripts_path/functions/manage/base"

if [[ -n "${RUBYOPT:-""}" ]]
then ruby_options="$RUBYOPT"
fi
unset RUBYLIB RUBYOPT # Sanity check.

binaries=()

__rvm_manage_rubies  # located in scripts/functions/manage/base
src/rvm/scripts/irbrc.rb000066400000003074147511530550011270 0ustar00# This is the common irbrc file used by all rvm ruby installations.
# This file will be overriden every time you update rvm.

# Calculate the ruby string.
rvm_ruby_string = ENV["rvm_ruby_string"] ||
  (
    ENV['GEM_HOME'] &&
    ( path = ( File.realpath(ENV['GEM_HOME'].to_s) rescue nil ) ) &&
    ( path = $1 if path =~ /(.+)\/$/ ; true ) &&
    String(String(path).split(/\//).last).split(/@/).first
  ) ||
  ("#{RUBY_VERSION}-p#{RUBY_PATCHLEVEL}" rescue nil) ||
  (RUBY_DESCRIPTION.split(" ")[1].sub('p', '-p') rescue nil ) ||
  (`ruby -v` || '').split(" ")[1].sub('p', '-p')

# cut ruby- ... everyone knows it's ruby
rvm_ruby_string = $1 if rvm_ruby_string =~ /^ruby[- ](.*)/

# Set up the prompt to be RVM specific.
@prompt = {
  :PROMPT_I => "#{rvm_ruby_string} :%03n > ",  # default prompt
  :PROMPT_S => "#{rvm_ruby_string} :%03n%l> ", # known continuation
  :PROMPT_C => "#{rvm_ruby_string} :%03n > ",
  :PROMPT_N => "#{rvm_ruby_string} :%03n?> ", # unknown continuation
  :RETURN => " => %s \n",
  :AUTO_INDENT => true
}
IRB.conf[:PROMPT] ||= {}
IRB.conf[:PROMPT][:RVM] = @prompt
IRB.conf[:PROMPT_MODE] = :RVM if IRB.conf[:PROMPT_MODE] == :DEFAULT

require "irb/completion" rescue nil

IRB.conf[:SAVE_HISTORY] = 100
IRB.conf[:HISTORY_FILE] = File.join(ENV["HOME"], ".irb-history")

# Load the user's irbrc file, if possible.
# Report any errors that occur.
begin
  load File.join(ENV["HOME"], ".irbrc") if File.exist?("#{ENV["HOME"]}/.irbrc")
rescue LoadError => load_error
  puts load_error
rescue => exception
  puts "Error : 'load #{ENV["HOME"]}/.irbrc' : #{exception.message}"
end
src/rvm/scripts/upgrade000077500000006522147511530550011220 0ustar00#!/usr/bin/env bash

unset GREP_OPTIONS

usage()
{
  printf "%b" "

  Usage:

    rvm upgrade {source-ruby} [destination-ruby] [--force]

  Description:

    Upgrades the specified (already installed) source ruby given to the
    given destination ruby version. Will migrate gemsets, wrappers, aliases
    and environment files.

    To upgrade rvm itself you want 'rvm get'.

  Examples:

    $ rvm upgrade 1.9.2-p136 1.9.2-p180

    $ rvm upgrade ree-2011.01 ree-2011-02

"
}

confirm()
{
  if (( ${rvm_force_flag:-0} > 0 ))
  then return 0
  fi

  \typeset confirmation_response

  printf "%b" "$1 (Y/n): "

  read -r confirmation_response

  if [[ -n "$confirmation_response" ]]
  then
    echo $confirmation_response | __rvm_grep -i '^y\|^Y' >/dev/null 2>&1
  fi
}

die_with_error()
{
  rvm_error "$1"
  exit "${2:-1}"
}

expand_ruby_name()
(
  source "$rvm_scripts_path/functions/tools"
  tools_strings "${1%%@*}"
)

existing_ruby_patch()
{
  {
    __rvm_list_strings | __rvm_grep -E "^ruby-$1|^$1$" ||
    (
      rvm_ruby_string="$1"
      __rvm_ruby_string
      __rvm_list_strings | __rvm_grep -E "^${rvm_ruby_interpreter}-${rvm_ruby_version}(-.*|$)" ||
      __rvm_list_strings | __rvm_grep "^${rvm_ruby_interpreter}-"
    )
  } | __rvm_version_sort | __rvm_tail -n 1
}

highest_ruby_patch()
{
  \typeset patch_level _version
  (
    rvm_ruby_string=$1
    __rvm_ruby_string

    patch_level="$(
      __rvm_db "${rvm_ruby_interpreter}_${rvm_ruby_version}_patch_level"
    )"
    _version="$(
      __rvm_db "${rvm_ruby_interpreter}_version"
    )"
    if
      [[ -n "${patch_level:-""}" ]]
    then
      rvm_ruby_patch_level="${patch_level}"
      echo ${rvm_ruby_interpreter}-${rvm_ruby_version}-${rvm_ruby_patch_level}
    elif
      [[ -n "${_version:-""}" ]]
    then
      echo ${rvm_ruby_interpreter}-${_version}
    else
      echo ${rvm_ruby_interpreter}
    fi
  )
}

upgrade_ruby()
{
  [[ -n "$expanded_source"      ]] || die_with_error "The source ruby was not a valid ruby string."
  [[ -n "$expanded_destination" ]] || die_with_error "The destination ruby was not a valid ruby string."

  confirm "Are you sure you wish to upgrade from $expanded_source to $expanded_destination?" ||
    die_with_error "Cancelling upgrade."

  [[ -d "$rvm_rubies_path/$expanded_destination" ]] ||
  {
    rvm_log "Installing new ruby $expanded_destination"
    __rvm_run_wrapper manage install "$expanded_destination" ||
      die_with_error "Unable to install ruby $expanded_destination. Please install it manually to continue." $?
  }

  rvm_log "Migrating gems from $expanded_source to $expanded_destination"

  "$rvm_scripts_path/migrate" "$expanded_source" "$expanded_destination" || die_with_error "Error migrating gems." "$result"

  rvm_log "Upgrade complete!"
}

source_ruby="${args[__array_start]:-}"
destination_ruby="${args[__array_start+1]:-}"
expanded_source="$(existing_ruby_patch "$source_ruby")"

if
  [[ -n "$source_ruby" && -z "$destination_ruby" ]]
then
  highest_source="$(highest_ruby_patch "$(expand_ruby_name "$source_ruby")")"
  if [[ "${expanded_source}" != "${highest_source}" ]]
  then destination_ruby="$(expand_ruby_name "$highest_source")"
  fi
fi

if
  [[ -z "$source_ruby" || -z "$destination_ruby" ]]
then
  usage >&2
  exit 1
elif
  [[ "help" == "$source_ruby" ]]
then
  usage
else
  expanded_destination="$(expand_ruby_name "$destination_ruby")"
  upgrade_ruby
fi
src/rvm/scripts/mount000077500000046434147511530550010741 0ustar00#!/usr/bin/env bash

source "$rvm_scripts_path/base"
source "$rvm_scripts_path/functions/build"
source "$rvm_scripts_path/functions/irbrc"
source "$rvm_scripts_path/functions/osx-ssl-certs"
source "$rvm_scripts_path/functions/rubygems"
source "$rvm_scripts_path/functions/manage/truffleruby"

external_automount()
{
  external_mount_uniq $(
    __rvm_remove_rvm_from_path
    __rvm_which -a ruby
  )
}

external_reject_existing()
{
  \typeset __check
  \typeset -a __existing __failed
  __failed=()
  __existing=( $(
    for ext in $rvm_rubies_path/ext-*/bin/ruby
    do
      if [[ -L "$ext" ]]
      then __rvm_readlink "$ext"
      fi
    done
  ) )
  rvm_debug "existing:${__existing[*]}:"

  for __check
  do
    if
      [[ " ${__existing[*]} " == *" ${__check} "* ]]
    then
      __failed+=( ${__check} )
    fi
  done
  if
    (( ${#__failed[@]} > 1 ))
  then
    rvm_error "The given paths '${__failed[*]}' are already mounted."
  elif
    (( ${#__failed[@]} > 0 ))
  then
    rvm_error "The given path '${__failed[*]}' is already mounted."
  fi
  return ${#__failed[@]}
}

external_mount_uniq()
{
  \typeset ruby_path
  \typeset -a ruby_paths

  __rvm_read_lines ruby_paths <(
    for ruby_path in "$@"
    do
      if
        [[ -d "${ruby_path}" && -x "${ruby_path}/bin/ruby" ]]
      then
        echo "${ruby_path}/bin/ruby"
      elif
        [[ -f "${ruby_path}" && -x "${ruby_path}" ]]
      then
        echo "${ruby_path}"
      fi
    done | sort -u
  )

  if
    (( ${#ruby_paths[@]} == 0 ))
  then
    rvm_error "The given paths '$*' do not point to a ruby installation."
    return 1
  else
    external_reject_existing ${#ruby_paths[@]} || exit $?
    for ruby_path in ${ruby_paths[@]}
    do
      ( external_mount "${ruby_path}" ) || exit $?
    done
  fi
}

external_mount_link_default_binaries_detect_link()
{
  rvm_debug "ruby_path:${ruby_path}"
  if
    [[ "${ruby_path##*/}" == "ruby" && -L "${ruby_path}" ]]
  then
    _binary_long="$( \command \readlink "${ruby_path}" )"
    case "${_binary_long}" in
      (/*)
        ruby_path="${_binary_long}"
        ;;
      (*/*)
        ruby_path="$( cd "${ruby_path}" ; cd "${_binary_long%/*}" ; pwd )${_binary_long##*/}"
        ;;
      (*)
        ruby_path="${ruby_path%ruby}${_binary_long}"
        ;;
    esac
    rvm_debug "linked ruby_path:${ruby_path}"
  fi
}

external_mount_link_default_binaries_detect_prefix_suffix()
{
  _binary="${ruby_path##*/}"
  case "${_binary}" in
    (ruby)
      _binary_prefix=""
      _binary_suffix=""
      ;;
    (*ruby)
      _binary_prefix="${_binary%ruby}"
      _binary_suffix=""
      ;;
    (ruby*)
      _binary_prefix=""
      _binary_suffix="${_binary#ruby}"
      ;;
  esac
  rvm_debug "_binary_prefix:${_binary_prefix}: _binary_suffix:${_binary_suffix}:"
}

external_mount_link_default_binaries_create_links()
{
  for _binary in "${_binaries[@]}"
  do
    _binary_long="${_binary_prefix}${_binary}${_binary_suffix}"
    # link short
    if
      [[ -e "${prefix_path}/bin/${_binary}" ]]
    then
      ln -s "${prefix_path}/bin/${_binary}" "${_target_path}/${_binary}"
    fi
    # link long
    if
      [[ -e "${prefix_path}/bin/${_binary_long}" && "${_binary_long}" != "${_binary}" ]]
    then
      ln -s "${prefix_path}/bin/${_binary_long}" "${_target_path}/${_binary_long}"
      # link short - long if there was no short
      [[ -e "${_target_path}/${_binary}" ]] ||
        ln -s "${prefix_path}/bin/${_binary_long}" "${_target_path}/${_binary}"
    fi
    # relink links
    if
      [[ -L "${prefix_path}/bin/${_binary}" ]]
    then
      _binary="$( __rvm_readlink "${prefix_path}/bin/${_binary}" )"
      case "${_binary}" in
        (*/*)
          true # skip relative paths
          ;;
        (*)
          [[ -e "${_target_path}/${_binary}" ]] || # avoid duplicate relinking
          ln -s "${prefix_path}/bin/${_binary}" "${_target_path}/${_binary}"
          ;;
      esac
    fi
  done
}

external_mount_link_default_binaries()
{
  \typeset _binary _binary_prefix _binary_suffix _binary_long _target_path
  \typeset -a _binaries
  _binaries=( erb gem irb rake ri rdoc ruby testrb )

  external_mount_link_default_binaries_detect_link
  external_mount_link_default_binaries_detect_prefix_suffix

  _target_path="$rvm_rubies_path/$rvm_ruby_string/bin"
  mkdir -p "${_target_path}"

  external_mount_link_default_binaries_create_links
}

__rvm_osx_ssl_certs_ensure_for_ruby_except_jruby()
{
  case "$1" in
    (jruby*) true ;;
    (*)      __rvm_osx_ssl_certs_ensure_for_ruby "$2" ;;
  esac
}

external_mount()
{
  \typeset _given_path ruby_path prefix_path
  _given_path="$1"
  if [[ ! -d "${_given_path}" && -x "${_given_path}" ]] && "${_given_path}" --version | __rvm_grep rub >/dev/null
  then
    ruby_path="${_given_path}"
    prefix_path="$( __rvm_ruby_config_get prefix "${_given_path}" )"
  elif [[ -d "${_given_path}" && -x "${_given_path}/bin/ruby" ]] && "${_given_path}/bin/ruby" --version | __rvm_grep rub >/dev/null
  then
    ruby_path="${_given_path}/bin/ruby"
    prefix_path="$( __rvm_ruby_config_get prefix "${ruby_path}" )"
    if [[ "${_given_path}" != "${prefix_path}" ]]
    then
      rvm_error "The given path '$_given_path' contains ruby but it has different prefix '$prefix_path'."
      exit 2
    fi
  else
    rvm_error "The given path '$_given_path' does not point to a ruby installation."
    exit 3
  fi

  if [[ -z "${rvm_ruby_string:-}" && -n "${rvm_ruby_name:-}" ]]
  then rvm_ruby_string="$rvm_ruby_name"
  fi
  if [[ -z "${rvm_ruby_string:-}" ]]
  then
    if ! external_select_name "${ruby_path}" "${prefix_path}" ||
      [[ -z "${rvm_ruby_string:-}" ]]
    then
      rvm_error "No name selected for ruby in '$prefix_path'."
      exit 4
    fi
  fi

  rvm_ruby_string="ext-${rvm_ruby_string}"
  echo "Mounting '${rvm_ruby_string}' from '${prefix_path}' with 'bin/${ruby_path##*/}'"

  external_mount_link_default_binaries
  mkdir -p "$rvm_gems_path/$rvm_ruby_string" "$rvm_gems_path/$rvm_ruby_string@global"

  __rvm_select "$rvm_ruby_string"
  __rvm_fix_rbconfig "$rvm_rubies_path/$rvm_ruby_string"
  __rvm_ruby_post_install_hook "$rvm_ruby_string" "$rvm_rubies_path/$rvm_ruby_string"
  __rvm_initial_gemsets_create_without_rubygems "$rvm_rubies_path/$rvm_ruby_string/bin/ruby"
  __rvm_irbrc
  __rvm_ruby_config_save "$ruby_path" "$rvm_rubies_path/$rvm_ruby_string/config"
  __rvm_fix_group_permissions "$rvm_rubies_path/$rvm_ruby_string"
  __rvm_record_install "$rvm_ruby_string"
  __rvm_osx_ssl_certs_ensure_for_ruby_except_jruby "$rvm_ruby_string" "$ruby_path"
}

external_select_name()
{
  \typeset proposed_name ruby_version ruby_path prefix_path
  export rvm_ruby_string
    ruby_path="$1"
  prefix_path="$2"
  ruby_version="$( "${ruby_path}" --version)"
  if [[ -x "${ruby_path}" ]] &&
    proposed_name="$( external_propose_name "$ruby_version" )" &&
    [[ -n "${proposed_name:-}" ]]
  then
    echo "Found '${ruby_version}' in '${prefix_path}'"
    printf "\n# Please enter name [${proposed_name}]: "
    read rvm_ruby_string
    printf "\n"
    : rvm_ruby_string:${rvm_ruby_string:=${proposed_name}}:
  else
    echo "Name not found for '${ruby_path}' in '${prefix_path}'"
    false
  fi
}

external_propose_name()
{
  \typeset parts __tmp1 __tmp2
  parts="$( echo "$1" | __rvm_sed 's/[()]//g; s/\[.*\]//;' )"
  case "${parts}" in
    (*Ruby[[:space:]]Enterprise[[:space:]]Edition*)
      __tmp1="${parts#* }"
      __tmp1="${__tmp1%% *}"
      __tmp2="${parts##* }"
      printf "ree-${__tmp1}-${__tmp2}"
      ;;
    (ruby[[:space:]]*patchlevel[[:space:]]*)
      __tmp1="${parts#* }"
      __tmp1="${__tmp1%% *}"
      __tmp2="${parts##*patchlevel }"
      __tmp2="${__tmp2%% *}"
      printf "ruby-${__tmp1}-p${__tmp2}"
      ;;
    (ruby[[:space:]][0-9].[0-9].[0-9]p[0-9]*)
      __tmp1="${parts#* }"
      __tmp1="${__tmp1%% *}"
      __tmp2="${__tmp1##+([0-9\.])}"
      __tmp1="${__tmp1%${__tmp2}}"
      printf "ruby-${__tmp1}-${__tmp2}"
      ;;
    (ruby[[:space:]]*revision[[:space:]]*|ruby[[:space:]]*trunk[[:space:]]*)
      __tmp1="${parts#* }"
      __tmp1="${__tmp1%% *}"
      __tmp2="${parts##*trunk }"
      __tmp2="${__tmp2##*revision }"
      __tmp2="${__tmp2%% *}"
      printf "ruby-${__tmp1}-r${__tmp2}"
      ;;
    (ruby[[:space:]]*)
      __tmp1="${parts#* }"
      __tmp1="${__tmp1%% *}"
      __tmp2="${__tmp1##+([0-9\.])}"
      __tmp1="${__tmp1%${__tmp2}}"
      printf "ruby-${__tmp1}-${__tmp2}"
      ;;
    (jruby[[:space:]]*)
      __tmp1="${parts#* }"
      __tmp1="${__tmp1%% *}"
      __tmp2="${parts#* }"
      __tmp2="${__tmp2#* }"
      __tmp2="${__tmp2%% *}"
      __tmp2="${__tmp2#ruby-}"
      __tmp2="${__tmp2//-/_}"
      printf "jruby-${__tmp1}-default_${__tmp2}"
      ;;
    (maglev[[:space:]]*)
      __tmp1="${parts#* }"
      __tmp1="${__tmp1%% *}"
      __tmp2="${parts#* }"
      __tmp2="${__tmp2#* }"
      __tmp2="${__tmp2#* }"
      __tmp2="${__tmp2%% *}"
      printf "maglev-${__tmp1}-default_${__tmp2}"
      ;;
    (topaz[[:space:]]*)
      __tmp1="${parts#* }"
      __tmp1="${__tmp1%% *}"
      __tmp2="${parts#* }"
      __tmp2="${__tmp2#* }"
      __tmp2="${__tmp2#* }"
      __tmp2="${__tmp2%% *}"
      printf "topaz-${__tmp1}-default_${__tmp2}"
      ;;
    (rubinius[[:space:]]*)
      __tmp1="${parts#* }"
      __tmp1="${__tmp1%% *}"
      __tmp2="${parts#* }"
      __tmp2="${__tmp2#* }"
      __tmp2="${__tmp2%% *}"
      printf "rbx-${__tmp1}-default_${__tmp2}"
      ;;
    (*)
      false
      ;;
  esac
}

external_import_configure()
{
  \typeset platform architecture libc __flags

  if (( ${rvm_install_on_use_flag:-0} > 0 ))
  then err_command=rvm_warn
  else err_command=rvm_error
  fi

  rvm_ruby_url="$1"
  rvm_ruby_string="${2:-${rvm_ruby_name:-${rvm_ruby_url}}}"
  rvm_ruby_package_file=""

  # autodetect skips assignment of package name from URL
  __flags="$*"

  if
    [[ -r "${rvm_ruby_url}" ]]
  then
    if
      [[ "${__flags}" != *"autodetect"* ]]
    then
      rvm_ruby_package_file="${rvm_ruby_url##*/}"
    fi
  else
    case "${rvm_ruby_url}" in
      (http*)
        if
          [[ "${__flags}" != *"autodetect"* ]]
        then
          rvm_ruby_package_file="${rvm_ruby_url##*/}"
          # lets hope nobody uses the same file name with ?version=...
          rvm_ruby_package_file="${rvm_ruby_package_file%%\?*}"
        fi
        ;;
      (*)
        __rvm_ruby_string
        \typeset __rvm_ruby_verify_download_flag
        rvm_ruby_url="$( __rvm_remote_server_path "${rvm_ruby_string}" )"
        IFS=: read __rvm_ruby_verify_download_flag rvm_ruby_url <<<"$rvm_ruby_url"
        rvm_log "Found remote file ${rvm_ruby_url}"
        if
          (( ${__rvm_ruby_verify_download_flag:-0} > ${rvm_verify_downloads_flag_cli:-${rvm_verify_downloads_flag:-1}} ))
        then
          rvm_verify_downloads_flag=${__rvm_ruby_verify_download_flag}
        fi
        ;;
    esac
  fi

  rvm_ruby_string="${rvm_ruby_string##*/}"
  rvm_ruby_string="${rvm_ruby_string/bin-/}"
  rvm_ruby_string="${rvm_ruby_string%.t*}"
  if
    [[ -n "${rvm_ruby_name}" ]]
  then
    if
      [[ "${rvm_ruby_name}" == "${rvm_ruby_string}"* ]]
    then
      detected_rvm_ruby_name="${rvm_ruby_name#${rvm_ruby_string}-}"
      rvm_ruby_string="${rvm_ruby_name}"
    else
      detected_rvm_ruby_name="${rvm_ruby_name}"
      rvm_ruby_string="${rvm_ruby_string}-${rvm_ruby_name}"
    fi
  fi
  if
    [[ -z "${rvm_ruby_package_file:-}" ]]
  then
    __rvm_ruby_package_file "${rvm_ruby_string}"
    if
      [[ "${rvm_ruby_package_file}" == *bin-* ]]
    then
      rvm_ruby_package_file="${rvm_ruby_package_file##*/}"
    elif
      [[ "${rvm_ruby_url##*/}" == *bin-* ]]
    then
      rvm_ruby_package_file="${rvm_ruby_url##*/}"
    else
      rvm_ruby_package_file="bin-${rvm_ruby_string}.$(__rvm_remote_extension "${rvm_ruby_string}" -)"
    fi
  fi
}

external_import_download()
{
  if
    [[ -r "${rvm_ruby_url}" ]]
  then
    [[ "${rvm_ruby_url}" == "$rvm_archives_path/${rvm_ruby_package_file}" ]] ||
    __rvm_cp -f "${rvm_ruby_url}" "$rvm_archives_path/${rvm_ruby_package_file}" || {
      $err_command "Copying ${rvm_ruby_url} failed."
      return 3
    }
  elif
    [[ -n "${rvm_ruby_url}" ]]
  then
    "$rvm_scripts_path/fetch" "${rvm_ruby_url}?rvm=${rvm_version%% *}" "${rvm_ruby_package_file}" || {
      $err_command "Downloading ${rvm_ruby_url} failed."
      return 2
    }
  else
    $err_command "No remote url detected for ${rvm_ruby_string}."
    return 4
  fi
}

external_import_validate_archive()
{
  \typeset -a downloaded_names path_to_bin_ruby
  \typeset short_ruby_string

  __rvm_read_lines path_to_bin_ruby <(
    __rvm_package_list "$rvm_archives_path/${rvm_ruby_package_file}" | __rvm_grep "bin/ruby$" ||
    __rvm_package_list "$rvm_archives_path/${rvm_ruby_package_file}" | __rvm_grep "bin/jruby$"
  )
  __rvm_read_lines downloaded_names <(
    __rvm_package_list "$rvm_archives_path/${rvm_ruby_package_file}" | __rvm_awk -F/ '{print $1}' | sort -u
  )
  rvm_debug "downloaded_names:${#downloaded_names[@]}:${downloaded_names[*]}:"
  short_ruby_string="${rvm_ruby_string%-${detected_rvm_ruby_name:-}}"
  if
    [[ "${#path_to_bin_ruby[*]}" -eq 1 ]]
  then
    __path_to_extract="${path_to_bin_ruby[*]}"
    __path_to_extract="${__path_to_extract%bin/ruby}"
    __path_to_extract="${__path_to_extract%bin/jruby}"
  elif
    [[ "${short_ruby_string}" == "${downloaded_names[*]}" ]]
  then
    __path_to_extract="${short_ruby_string}"
  elif
    [[ "${short_ruby_string/-bin-/-}" == "${downloaded_names[*]}" ]]
  then
    if [[ -z "${rvm_ruby_string}" ]]
    then rvm_ruby_string="${short_ruby_string/-bin-/-}"
    fi
    __path_to_extract="${short_ruby_string}"
  elif
    [[ "${short_ruby_string/rbx-/rubinius-}" == "${downloaded_names[*]}" ]]
  then
    __path_to_extract="${short_ruby_string/rbx-/rubinius-}"
  else
    $err_command "The downloaded package for ${rvm_ruby_url},
Does not contains single 'bin/ruby' or '${short_ruby_string}',
Only '${downloaded_names[*]}' were found instead."
    return 4
  fi
}


external_import_extract()
{
  \command \rm -rf "${rvm_rubies_path}/${rvm_ruby_string}"
  mkdir -p "${rvm_rubies_path}/${rvm_ruby_string}"
  __rvm_package_extract "$rvm_archives_path/${rvm_ruby_package_file}" "${rvm_rubies_path}/${rvm_ruby_string}" || {
    $err_command "Unpacking ${rvm_ruby_package_file} failed."
    return 6
  }

  if
    [[ -n "${__path_to_extract}" &&
      "${__path_to_extract}" != "/" &&
      "${__path_to_extract}" != "./"
    ]]
  then
    [[ -d "${rvm_rubies_path}/${rvm_ruby_string}/${__path_to_extract}/bin" ]] || {
      $err_command "Target directory '${__path_to_extract}' was not created,
make sure '${rvm_ruby_url}' is a valid binary ruby archive."
      return 8
    }
    \command \mv "${rvm_rubies_path}/${rvm_ruby_string}/${__path_to_extract}"/* "${rvm_rubies_path}/${rvm_ruby_string}/"
    \command \rm -rf "${rvm_rubies_path}/${rvm_ruby_string}/${__path_to_extract%%/*}"
  fi
}

# validate libraries - make sure everything can be loaded
external_import_validate_binary()
{
  \typeset IFS
  \typeset -a found_libs missing_libs
  export _libdir
  _libdir="$( __rvm_ruby_config_get libdir "${rvm_rubies_path}/${rvm_ruby_string}/bin/ruby" )"

  case "${rvm_ruby_string}" in
    (*jruby*)
      case ${_system_type} in
        (Darwin)
          external_libdir="lib/{native,jni}/Darwin"
          ;;
        (*)
          external_libdir="lib/{native,jni}/${_system_arch}-${_system_type}"
          ;;
      esac
      ;;
    (*)
      external_libdir=""
      ;;
  esac

  missing_libs=()
  found_libs=()
  if [[ -x "${rvm_rubies_path}/${rvm_ruby_string}/bin/ruby" ]]
  then found_libs+=( "${rvm_rubies_path}/${rvm_ruby_string}/bin/ruby" )
  fi
  case ${_system_type} in
    (Linux|SunOS)
      found_libs+=( $(
        __rvm_find "${rvm_rubies_path}/${rvm_ruby_string}/${external_libdir}" -name '*.so' 2>/dev/null
      ) )
      if
        [[ -n "${found_libs[*]}" ]]
      then
        missing_libs=( $(
          LD_LIBRARY_PATH="${_libdir}" ldd "${found_libs[@]}" 2>/dev/null |
          __rvm_awk '/not found/{print $1}' | sort -u
        ) )
      fi
      ;;
    (Darwin)
      found_libs+=( $(
        __rvm_find "${rvm_rubies_path}/${rvm_ruby_string}/${external_libdir}" -name "*.bundle" 2>/dev/null
      ) )
      if
        [[ -n "${found_libs[*]}" ]]
      then
        missing_libs=( $(
          LD_LIBRARY_PATH="${_libdir}" otool -L "${found_libs[@]}" 2>&1 |
          __rvm_awk -F"[ :]" '{print $1}' |
          __rvm_sed 's#@executable_path#'"${rvm_rubies_path}/${rvm_ruby_string}"'/bin#' |
          __rvm_xargs __rvm_ls -1 2>&1 1>/dev/null |
          __rvm_awk -F"[ :]" '{print $3}' | sort -u
        ) )
      fi
      ;;
    (*)
      rvm_warn "$(command uname) libraries validation not yet implemented"
      ;;
  esac
  unset _libdir
  [[ -z "${missing_libs[*]}" ]] || {
    IFS=","
    $err_command "Libraries missing for ${rvm_ruby_string}: ${missing_libs[*]}. Refer to your system manual for installing libraries"
    return 10
  }
}

__rvm_fix_wrappers()
{
  \typeset actual_file
  __rvm_find "$rvm_rubies_path/$rvm_ruby_string/bin/" -type f |
  while read actual_file
  do
    if
      [[ -s "$actual_file" ]]
    then
      __rvm_sed_i "$actual_file" \
        -e "/^ENV\[[\"']GEM_HOME[\"']\]=/ d" \
        -e "/^ENV\[[\"']GEM_PATH[\"']\]=/ d" \
        -e "/^ENV\[[\"']PATH[\"']\]=/ d"
    fi
  done
  if
    [[ ! -f "$rvm_rubies_path/$rvm_ruby_string/bin/ruby" ]] &&
    [[ -f "$rvm_rubies_path/$rvm_ruby_string/bin/jruby" ]]
  then
    ln -s "$rvm_rubies_path/$rvm_ruby_string/bin/jruby" "$rvm_rubies_path/$rvm_ruby_string/bin/ruby"
  fi
}

__rvm_fix_lib_files()
{
  \typeset __path __file
  __path="$rvm_rubies_path/$rvm_ruby_string"

  __file="$( __rvm_find "${__path}" -name libyaml.la )"
  __rvm_sed_i "${__file}" -e "s#^libdir=.*\$#libdir='$(dirname "${__file}")'#"

  __rvm_find "${__path}" -name "*.pc" | while read __file
  do
    __rvm_sed_i "${__file}" -e "s#^prefix=.*\$#prefix=${__path}#"
  done
}

__rvm_ruby_post_install_hook()
{
  case "$1" in
    truffleruby*)
      truffleruby_post_install_hook "$2"
      ;;
    *)
      ;;
  esac
}

external_import_setup()
{
  __rvm_select
  __rvm_fix_wrappers
  __rvm_fix_lib_files
  __rvm_fix_rbconfig "$rvm_rubies_path/$rvm_ruby_string"
  __rvm_ruby_post_install_hook "$rvm_ruby_string" "$rvm_rubies_path/$rvm_ruby_string"
  __rvm_initial_gemsets_create_without_rubygems "$rvm_rubies_path/$rvm_ruby_string/bin/ruby"
  __rvm_irbrc
  __rvm_ruby_config_save "$rvm_rubies_path/$rvm_ruby_string/bin/ruby" "$rvm_rubies_path/$rvm_ruby_string/config"
  __rvm_record_install "$rvm_ruby_string"
  __rvm_osx_ssl_certs_ensure_for_ruby_except_jruby "$rvm_ruby_string" "$rvm_rubies_path/$rvm_ruby_string/bin/ruby"
}

external_import()
{
  \typeset step err_command rvm_ruby_url rvm_ruby_string rvm_ruby_package_file __path_to_extract

  for step in configure download validate_archive extract validate_binary setup
  do
    rvm_log "${rvm_ruby_string:-${2:-$1}} - #${step//_/ }"
    external_import_${step} "$@" || return $?
  done
}

action="${1:-}"
shift || {
  rvm_error_help "Missing action for external." mount
  exit 1
}

# skip first param if empty
[[ -n "${1:-}" ]] || (( $#==0 )) || shift

case "${action}" in
  (automount)
    external_automount "$@"
    ;;
  (mount|*_name)
    [[ -n "${1:-}" ]] ||
    {
      rvm_error_help "Missing path/url for '$action'." mount $action
      exit 2
    }
    if
      (( rvm_remote_flag > 0 )) ||
      [[ "$1" == http* || "$1" == *tar.bz2 ]]
    then
      external_import "$@"
    else
      external_mount_uniq "$@"
    fi
    ;;
  (*)
    rvm_error_help "Wrong action for mount '$action'." mount $action
    exit 2
    ;;
esac
src/rvm/scripts/notes000077500000005236147511530550010722 0ustar00#!/usr/bin/env bash

: rvm_scripts_path:${rvm_scripts_path:="$rvm_path/scripts"}
: rvm_user_path:${rvm_user_path:="$rvm_path/user"}

source "$rvm_scripts_path/initialize"
source "$rvm_scripts_path/functions/logging"
source "$rvm_scripts_path/functions/support"
source "$rvm_scripts_path/functions/utility"

if [[ "$1" == "initial" ]]
then
  notes_type=Upgrade
  PAGER="\command \cat"

  new_notes()
  {
    \typeset file
    file="$rvm_path/config/displayed-notes.txt"

    \command \rm -f "${file}"

    tee "${file}" > /dev/null
  }
elif [[ "$1" == "upgrade" ]]
then
  notes_type=Upgrade
  PAGER="\command \cat"

  new_notes()
  {
    \typeset file
    file="$rvm_path/config/displayed-notes.txt"

    touch "${file}"

    tee "${file}.new" | (
      diff - "${file}" &&
      true
    ) | __rvm_sed -e '/^[^<]/ d' -e 's/^< //'

    printf "\n" >&2
    \command \mv -f "${file}.new" "${file}"
  }
else
  notes_type=Installation

  new_notes()
  {
    \command \cat
  }
fi

# duplication marker kdfkjkjfdkfjdjkdfkjfdkj
load_custom_flags()
{
  if
    [[ -s "${rvm_path:-}/user/custom_flags" ]]
  then
    \typeset __key __value
    while IFS== read __key __value
    do
      eval "export ${__key}=\"\${__value}\""
    done < "${rvm_path:-}/user/custom_flags"
  fi
}
load_custom_flags

# this block groups generated and static notes,
# to add generated msgs put them below in code
# for general messages put them in docs/upgrade-notes.md
{
  if [[ -z "$1" ]]
  then
    printf "%b" "
$notes_type Notes:

"
  fi

  : rvm_scripts_path:${rvm_scripts_path:-$rvm_path/scripts}:

  \command \cat "$rvm_path/docs/upgrade-notes.md" | __rvm_sed \
   -e "s#\${SHELL}#${SHELL}#g" \
   -e "s#\${rvm_scripts_path}#${rvm_scripts_path}#g"

  printf "\n"

  source "$rvm_scripts_path/functions/notes/warnings/warning_loading_script"
  source "$rvm_scripts_path/functions/notes/warnings/warning_rvm_group"
  source "$rvm_scripts_path/functions/notes/warnings/warning_missing_devfd"
  source "$rvm_scripts_path/functions/notes/warnings/warning_apt_get_rvm"
  source "$rvm_scripts_path/functions/notes/warnings/warning_var"
  source "$rvm_scripts_path/functions/notes/warnings/warning_zsh"
  source "$rvm_scripts_path/functions/notes/warnings/warning_path_reset"
  source "$rvm_scripts_path/functions/notes/warnings/warning_gem_home"
  source "$rvm_scripts_path/functions/notes/warnings/warning_rvm_configure_env"
  source "$rvm_scripts_path/functions/notes/warnings/warning_gemrc"
  source "$rvm_scripts_path/functions/notes/warnings/warning_rvm_in_usr"
  source "$rvm_scripts_path/functions/notes/warnings/warning_needs_cleanup"
} | new_notes | eval "${PAGER:-\command \cat}"

source "$rvm_scripts_path/functions/notes/opencollective"
src/rvm/scripts/autolibs000077500000001443147511530550011410 0ustar00#!/usr/bin/env bash

source "$rvm_scripts_path/functions/autolibs"

__rvm_autolibs_show()
{
  __rvm_autolibs_get

  echo "${rvm_autolibs_flag}"
}

__rvm_autolibs_status()
{
  __rvm_autolibs_get
  __rvm_autolibs_translate_description

  printf "%b" "---
value: ${rvm_autolibs_flag}
number: ${rvm_autolibs_flag_number}
runner: ${rvm_autolibs_flag_runner}
description: ${rvm_autolibs_flag_description}
"
}

__rvm_autolibs()
{
  if
    __rvm_autolibs_translate "$1"
  then
    __rvm_autolibs_set
  else
    case "${1:-help}" in
      (show|status|reset)
        __rvm_autolibs_${1}
        ;;
      (help)
        rvm_help autolibs "$@"
        ;;
      (*)
        rvm_error_help "Unknown subcommand '$*' for autolibs" autolibs "$@"
        return 1
        ;;
    esac
  fi
}

__rvm_autolibs "${args[@]}"
src/rvm/scripts/gemsets000077500000044454147511530550011246 0ustar00#!/usr/bin/env bash

source "$rvm_scripts_path/base"
source "$rvm_scripts_path/functions/build" # For gems with C extensions.

gemset_list_all()
{
  for rvm_ruby_string in $( __rvm_list_strings )
  do
    (__rvm_use ; gemset_list)
  done
  unset rvm_ruby_string
}

gemset_list_strings()
{
  \typeset gem_string
  for rvm_ruby_string in $( __rvm_list_strings )
  do
    for gem_string in "${rvm_gems_path:-${rvm_path}/gems}/${rvm_ruby_string}" "${rvm_gems_path:-${rvm_path}/gems}/${rvm_ruby_string}${rvm_gemset_separator:-@}"*
    do
      printf "%b" "${gem_string##*/}\n"
    done
  done
  unset rvm_ruby_string
}

gemset_update()
{

  if
    [[ -z "$rvm_ruby_strings" ]]
  then
    rvm_log "Running gem update for all rubies and gemsets."
  else
    rvm_log "Running gem update for the specified rubies."
  fi
  export rvm_ruby_strings="${rvm_ruby_strings:-all-gemsets}"
  export rvm_verbose_flag=1
  "$rvm_scripts_path/set" do gem update
  return $?
}

gemset_globalcache()
{
  \typeset gc_status globalcache_enabled directories directory_name \
    full_directory_path directory_name

  if [[ "$1" == "enabled" ]]
  then
    if __rvm_using_gemset_globalcache
    then
      gc_status="Enabled"
      globalcache_enabled=0
    else
      gc_status="Disabled"
      globalcache_enabled=1
    fi
    rvm_log "Gemset global cache is currently: $gc_status"
    return $globalcache_enabled
  elif [[ "$1" == "disable" ]]
  then
    rvm_log "Removing the global cache (note: this will empty the caches)"
    __rvm_read_lines directories <(
      __rvm_cd "${rvm_gems_path:-"$rvm_path/gems"}" ;
      __rvm_find . -maxdepth 1 -mindepth 1 -type d -print | cut -c 3-
    )

    for directory_name in "${directories[@]//.\/}"
    do
      current_cache_path="${rvm_gems_path:-"$rvm_path/gems"}/$directory_name/cache"
      if [[ -L "$current_cache_path" \
        && "$(__rvm_readlink "$current_cache_path")" == "$rvm_gems_cache_path" ]]
      then
        rvm_log "Reverting the gem cache for $directory_name to an empty directory."
        \command \rm -f "$current_cache_path" 2>/dev/null
        mkdir -p "$current_cache_path" 2>/dev/null
      fi
    done
    __rvm_db_ "$rvm_user_path/db" "use_gemset_globalcache" "delete"
  elif [[ "$1" == "enable" ]]
  then
    rvm_log "Enabling global cache for gems."
    mkdir -p "$rvm_gems_cache_path"
    __rvm_read_lines directories <(
      __rvm_cd "${rvm_gems_path:-"$rvm_path/gems"}" ;
      __rvm_find . -maxdepth 1 -mindepth 1 -type d -print | cut -c 3-
    )
    for directory_name in "${directories[@]//.\/}"
    do
      current_cache_path="${rvm_gems_path:-"$rvm_path/gems"}/$directory_name/cache"
      if [[ -d "$current_cache_path" && ! -L "$current_cache_path" ]]
      then
        rvm_log "Moving the gem cache for $directory_name to the global cache."
        \command \mv "$current_cache_path/"*.gem "$rvm_gems_cache_path/" 2>/dev/null
        case "${current_cache_path%\/}" in
          *cache)
            __rvm_rm_rf "$current_cache_path"
            ln -fs "$rvm_gems_cache_path" "$current_cache_path"
            ;;
        esac
      fi
    done
    __rvm_db_ "$rvm_user_path/db" "use_gemset_globalcache" "true"
  else
    printf "%b" "

  Usage:

    rvm gemset globalcache {enable,disable,enabled}

    Enable / Disable / Status the use of a global gem cachedir.

"
    return 1
  fi
}

gemset_name()
{
  echo "${rvm_ruby_gem_home##*${rvm_gemset_separator:-"@"}}"
  return $?
}

gemset_dir()
{
  echo "$rvm_ruby_gem_home"
  return $?
}

__gemset_list_single()
{
  \typeset gemset current_gemset ruby_name default_name
  gemset="$1"
  current_gemset="$2"
  gemset="${gemset##*/}"
  ruby_name="${gemset%%${rvm_gemset_separator:-@}*}"
  gemset="${gemset#${ruby_name}}"
  gemset="${gemset#${rvm_gemset_separator:-@}}"

  if [[ "${_second_param}" == "strings" ]]
  then default_name="default"
  else default_name="(default)"
  fi
  [[ -n "${gemset}"         ]] || gemset="$default_name"
  [[ -n "${current_gemset}" ]] || current_gemset="$default_name"
  if
    [[ "${gemset}" == "${current_gemset}" ]]
  then
    if [[ "${_second_param}" == "strings" ]]
    then echo "${gemset} #current"
    else echo "=> ${gemset}"
    fi
  else
    if [[ "${_second_param}" == "strings" ]]
    then echo "${gemset}"
    else echo "   ${gemset}"
    fi
  fi
}

gemset_list()
{
  [[ -d "${rvm_gems_path:-"$rvm_path/gems"}" ]] || {
    rvm_error "${rvm_gems_path:-"$rvm_path/gems"} does not exist!"
    return 1
  }
  [[ -n "${rvm_ruby_string:-""}" ]] || {
    rvm_error "\$rvm_ruby_string is not set!"
    return 1
  }

  \typeset current_gemset IFS
  current_gemset=$(__rvm_current_gemset)
  IFS=""

  [[ "${_second_param}" == "strings" ]] ||
    rvm_log "\ngemsets for $rvm_ruby_string (found in ${rvm_gems_path:-"$rvm_path/gems"}/$rvm_ruby_string)"

  for gemset in ${rvm_gems_path:-${rvm_path}/gems}/${rvm_ruby_string} ${rvm_gems_path:-${rvm_path}/gems}/${rvm_ruby_string}${rvm_gemset_separator:-@}*
  do
    __gemset_list_single "${gemset}" "${current_gemset}"
  done

  [[ "${_second_param}" == "strings" ]] || printf "%b" "\n"
}

gemset_delete_task()
{
  \typeset rvm_gemset_name ruby_at_gemset gemdir
  rvm_gemset_name=$1
  ruby_at_gemset=$2
  gemdir=$3

  case ${_system_type} in
    (BSD)
      # will not find broken links
      __rvm_find "${rvm_bin_path:=$rvm_path/bin}" -name \*${ruby_at_gemset} -exec rm -rf '{}' \;
      __rvm_find -L "${rvm_bin_path:=$rvm_path/bin}" -name \*${ruby_at_gemset} -exec rm -rf '{}' \;
      ;;
    (*)
      __rvm_find "${rvm_bin_path:=$rvm_path/bin}" \( -name \*${ruby_at_gemset} -or -lname \*${ruby_at_gemset}/\* \) -delete
      ;;
  esac
  for item in $( $rvm_scripts_path/alias search_by_target ${ruby_at_gemset} )
  do
    $rvm_scripts_path/alias delete ${item}
  done
  __rvm_rm_rf "$gemdir" &&
  __rvm_rm_rf "${rvm_wrappers_path:="$rvm_path/wrappers"}/${ruby_at_gemset}" &&
  __rvm_rm_rf "${rvm_environments_path:="$rvm_path/environments"}/${ruby_at_gemset}"
}

gemset_delete()
{
  [[ -n "${GEM_HOME:-}" ]] ||
  {
    rvm_error "A ruby must be selected in order to delete a gemset."
    return 1
  }
  if (( ${rvm_ruby_selected_flag:-0} == 0))
  then __rvm_ruby_string
  fi
  [[ -n "$rvm_gemset_name" ]] ||
  {
    rvm_error "A gemset name must be specified in order to delete a gemset."
    return 1
  }

  ruby_at_gemset="$rvm_ruby_string${rvm_gemset_separator:-"@"}$rvm_gemset_name"
  gemdir="${rvm_gems_path:-$rvm_path/gems}/${ruby_at_gemset}"

  [[ -e "$gemdir" ]] ||
  {
    rvm_warn "$gemdir did not previously exist. Ignoring."
    return 0
  }

  (( ${rvm_force_flag:-0} )) ||
  __rvm_ask_for "Are you SURE you wish to remove the entire gemset directory '$rvm_gemset_name' ($gemdir)?" yes ||
  {
    rvm_log "Not doing anything, phew... close call that one eh?"
    return 2
  }

  __rvm_log_command "gemset.delete" "Removing gemset $rvm_gemset_name" \
    gemset_delete_task "$rvm_gemset_name" "$ruby_at_gemset" "$gemdir"
}

gemset_remove()
{
  gemset_delete $1
}

gemset_empty()
{
  \typeset gemdir entry
  if
    [[ -n "${GEM_HOME}" ]]
  then
    if
      [[ ${rvm_force_flag:-0} -gt 0 ]] ||
      __rvm_ask_for "Are you SURE you wish to remove the installed gems for ${GEM_HOME}?" yes
    then
      gem_install gem-empty &&
      \command \gem empty &&
      rvm_log "Removed successfully." ||
      return $?
    else
      rvm_log "Not doing anything, phew... close call that one eh?"
      return 2
    fi
  fi
}

# Migrate gemsets from ruby X to ruby Y
gemset_copy()
{
  \typeset source_ruby destination_ruby source_path destination_path

  # Clear the current environment so that it does not influence this operation.
  unset rvm_gemset_name rvm_ruby_gem_home GEM_HOME GEM_PATH

  source_ruby="${1:-}"
  destination_ruby="${2:-}"
  shift 2
  if
    [[ -z "$destination_ruby" || -z "$source_ruby" ]]
  then
    rvm_help gemset copy
    return 1
  fi
  # Verify the destination gemset exists before attempting to use it.
  (
    rvm_ruby_string="$destination_ruby"
    export rvm_create_flag=1
    { __rvm_ruby_string && __rvm_gemset_select; } 2> /dev/null
  ) ||
  {
    rvm_error "Destination gemset '$destination_ruby' does not yet exist."
    return 1
  }

  # TODO: Account for more possibilities:
  #   rvm gemset copy 1.9.2 @gemsetb        # From 1.9.2 default to current ruby, 1.9.2 exists.
  #   rvm gemset copy @gemseta @gemsetb     # Current ruby, gemseta exists.
  #   rvm gemset copy gemseta gemsetb       # Currently Ruby, gemseta exists.
  #   rvm gemset copy gemseta 1.8.7@gemsetb # Currently Ruby@gemseta, current ruby@gemseta exists.

  source_path=$(
    __rvm_select "$source_ruby" > /dev/null 2>&1
    echo $rvm_ruby_gem_home
  )
  destination_path=$(
    __rvm_select "$destination_ruby" > /dev/null 2>&1
    echo $rvm_ruby_gem_home${rvm_expected_gemset_name:+@}${rvm_expected_gemset_name:-}
  )
  if
    [[ -z "$source_path" || ! -d "$source_path" ]]
  then
    rvm_error "Unable to expand '$source_ruby' or directory does not exist."
    return 1
  elif
    [[ -z "$destination_path" ]]
  then
    rvm_error "Unable to expand '$destination_ruby'."
    return 1
  fi

  if
    [[ -d "$source_path" ]]
  then
    rvm_log "Copying gemset from $source_ruby to $destination_ruby"
    for dir in "$source_path"/*
    do
      if
        [[ -d "$dir" ]]
      then
        __rvm_cp -Rf "$dir" "$destination_path/"
      elif
        [[ -L "$dir" ]]
      then
        __rvm_cp "$dir" "$destination_path/${dir##*/}"
      else
        rvm_debug "$dir not a file or link, not copying"
      fi
    done
    __rvm_log_command "gemset.wrappers"  "Generating gemset wrappers ${destination_path##*/}" gemset_reset_env "${destination_path##*/}" &&
    __rvm_gemset_pristine "$destination_ruby"
  else
    rvm_error "Gems directory does not exist for $source_path ($source_path)"
    return 1
  fi
}

# Migrate gemsets from ruby X to ruby Y
gemset_rename_()
{
  \command \mv "$source_path" "$destination_path" &&
  \command \rm "${rvm_wrappers_path:="$rvm_path/wrappers"}/${source_path##*/}" &&
  \command \rm "${rvm_environments_path:="$rvm_path/environments"}/${source_path##*/}"
}

# Migrate gemsets from ruby X to ruby Y
gemset_rename()
{
  \typeset source_name destination_name source_path destination_path

  source_name="${1:-}"
  destination_name="${2:-""}"
  shift 2
  if
    [[ -z "$destination_name" || -z "$source_name" ]]
  then
    rvm_error "Source and destination gemsets must be specified: 'rvm gemset rename X Y'"
    return 1
  fi
  source_path="$(
    rvm_use_flag=0 rvm_silence_logging=1 rvm_gemset_name=${source_name} __rvm_use "${rvm_ruby_string}@${source_name}" 1>&2 ;
    gem env gemdir
  )"
  if
    [[ -z "$source_path" || ! -d "$source_path" ]]
  then
    rvm_error "gemset '$source_name' does not exist."
    return 2
  fi
  destination_path=${source_path/%$source_name/$destination_name}
  if
    [[ -d "$source_path" ]]
  then
    if
      [[ ! -d "$destination_path" ]]
    then
      __rvm_log_command "gemset.rename" "Renaming gemset ${source_path##*/} => ${destination_path##*/}" gemset_rename_ &&
      __rvm_log_command "gemset.reset"  "Reseting gemset ${destination_path##*/}" gemset_reset_env "${destination_path##*/}" &&
      __rvm_gemset_pristine "${destination_path##*/}"
    else
      rvm_error "Gemset $destination_name already exists!"
      return 1
    fi
  else
    rvm_error "Gems directory does not exist for $source_path ($source_path)"
    return 1
  fi
}

gemset_move()
{
  gemset_rename $1 $2
}

gemset_unpack()
{
  \typeset gems name directory version  _platforms
  directory="${1:-vendor/gems}"
  if
    [[ -n "$rvm_ruby_gem_home" ]]
  then
    export GEM_HOME="$rvm_ruby_gem_home"
    export GEM_PATH="$rvm_ruby_gem_home:$rvm_ruby_global_gems_path"
  fi

  rvm_log "Unpacking current environments gemset to ${directory}\n"
  unset -f gem

  while read gem_name version _platforms
  do
    ( command gem unpack "$gem_name" -v"$version" --target "$directory" )&
  done <<<"$(
    GEM_PATH="$GEM_HOME" __rvm_list_gems
  )"
  wait
  rvm_log "Unpacking into ${directory} complete\n"
  return 0
}

gemset_export()
{
  \typeset rvm_file_name gem_name version versions _platforms
  rvm_file_name="${1:-}"
  if
    [[ -n "$rvm_ruby_gem_home" ]]
  then
    export GEM_HOME="$rvm_ruby_gem_home"
    export GEM_PATH="$rvm_ruby_gem_home:$rvm_ruby_global_gems_path"
  fi
  if
    [[ -n "$rvm_file_name" ]]
  then
    [[ "${rvm_file_name}" == *Gemfile ]] || rvm_file_name="${rvm_file_name%.gems}.gems"
  else
    if [[ -n "$rvm_gemset_name" ]]
    then rvm_file_name="$rvm_gemset_name.gems"
    else rvm_file_name="default.gems"
    fi
  fi
  rvm_log "Exporting current environments gemset to $rvm_file_name"
  if [[ -f "$rvm_file_name" ]]
  then \command \rm -f "$rvm_file_name"
  fi
  if
    [[ "${rvm_file_name}" == *Gemfile ]]
  then
    printf "%b" "source 'https://rubygems.org'

#ruby=${GEM_HOME##*/}

"
  else
    printf "%b" "# $rvm_file_name generated gem export file. \
Note that any env variable settings will be missing. \
Append these after using a ';' field separator

"
  fi > "$rvm_file_name"
  if
    (( ${rvm_latest_flag:-0} == 0 ))
  then
    while read gem_name version _platforms
    do
      if [[ "${rvm_file_name}" == *Gemfile ]]
      then echo "gem '$gem_name', '$version'"
      else echo "$gem_name -v$version"
      fi
    done <<<"$( GEM_PATH="$GEM_HOME" __rvm_list_gems )"
  else
    while read gem_name versions
    do
      if [[ "${rvm_file_name}" == *Gemfile ]]
      then echo "gem '$gem_name'"
      else echo "$gem_name"
      fi
    done <<<"$( GEM_PATH="$GEM_HOME" gem list )"
  fi >> "$rvm_file_name"
}

# Output the user's current gem directory.
gemset_info()
{
  if
    (( ${rvm_user_flag:-0} == 1 ))
  then
    (__rvm_use system ; gem env | __rvm_grep "\- $HOME" | __rvm_awk '{print $NF}')
  elif
    [[ ${rvm_system_flag:-0} == 1 ]]
  then
    (__rvm_use system ; gem env $action system)
  elif
    [[ -n "${rvm_ruby_string:-""}${rvm_gemset_name:+${rvm_gemset_separator:-"@"}}${rvm_gemset_name:-}" ]]
  then
    #TODO: why on ubuntu oneiric 32bit it's not enough to use gem env? why need to use again???
    (
      __rvm_use "${rvm_ruby_string:-""}${rvm_gemset_name:+${rvm_gemset_separator:-"@"}}${rvm_gemset_name:-}"
      gem env $action
    )
  else
    gem env $action
  fi
  return $?
}

gemset_prune()
{
  \typeset temporary_cache_path live_cache_path gemset_name version versions cached_gem_name cached_file_path

  temporary_cache_path="$GEM_HOME/temporary-cache"
  live_cache_path="$GEM_HOME/cache"

  mkdir -p "$temporary_cache_path"
  rvm_log "Moving active gems into temporary cache..."
  while
    read gem_name version _platforms
  do
    cached_gem_name="${gem_name}-${version}.gem"
    cached_file_path="${live_cache_path}/${cached_gem_name}"
    if
      [[ -f "$cached_file_path" ]]
    then
      \command \mv "$cached_file_path" "${temporary_cache_path}/${cached_gem_name}"
    fi
  done <<<"$( GEM_PATH="$GEM_HOME" __rvm_list_gems )"

  rvm_log "Removing live cache and restoring temporary cache..."
  # Switch the cache back.
  __rvm_rm_rf "$live_cache_path"
  \command \mv "$temporary_cache_path" "$live_cache_path"
  return 0
}

gem_search()
{
  \typeset gemspec gemspecs gem_name option environment_id ruby_string name gem_version
  gem_name="${1:-}"
  option="${2:-}"

  if [[ -z "${gem_name}" ]]
  then
    return 0
  fi

  true "${rvm_gems_path:="$rvm_path/gems"}"

  __rvm_read_lines gemspecs <(
    __rvm_find "${rvm_gems_path}" -mindepth 3 -iname "${gem_name}*.gemspec"  -type f
  )

  if [[ "${option}" != "strings" ]]
  then
    printf "%-40s %-20s %-20s\n" "environment_id" "name" "version"
    printf "%b" "================================================================================\n"
  fi

  for gemspec in "${gemspecs[@]}"
  do
    environment_id="${gemspec//${rvm_gems_path}\/}"
    environment_id="${environment_id//\/*}"
    ruby_string="${environment_id//@*}"
    gemset_name="${environment_id//${ruby_string}}"
    name=${gemspec//*\/}
    name=${name/%.gemspec}
    gem_version=${name}
    name=${name%%-+([0-9\.])}
    gem_version=${gem_version#${name}-}
    if [[ "$name" == "$gem_version" ]]
    then gem_version=""
    fi

    if [[ "${option}" != "strings" ]]
    then
      printf "%-40s %-20s %-20s\n" "${environment_id}" "${name}" "${gem_version}"
    else
      printf "%b" "${environment_id}\n"
    fi
  done
}

action="$1"
(( $# == 0 )) || shift
export _second_param="${1:-}"
export rvm_gemset_name="${1:-}"
rvm_sticky_flag=1

gemset_actions_with_gem=(
  gemdir gempath gemhome home path version export dump import
  load pristine copy install initial prune rename move update unpack
)
if
  [[ " ${gemset_actions_with_gem[*]} " == *" $action "* ]] &&
  ! builtin command -v gem > /dev/null
then
  rvm_error "'gem' was not found, cannot perform gem actions (Do you have an RVM ruby selected?)"
  exit 1
fi

if [[ " $* " == *" --force "* ]]
then export rvm_force_flag=1
fi

if
  [[ -z "$rvm_ruby_string" && "${GEM_HOME:-""}" == "${rvm_path}"* ]]
then
  rvm_ruby_string="${GEM_HOME##*/}"
  rvm_ruby_string="${rvm_ruby_string%%@*}"
fi
if
  [[ -z "$rvm_gemset_name" && "${GEM_HOME:-""}" == "${rvm_path}"* ]]
then
  rvm_gemset_name="${GEM_HOME##*/}"
  rvm_gemset_name="${rvm_gemset_name#${rvm_gemset_name%%@*}}"
  rvm_gemset_name="${rvm_gemset_name#@}"
fi

rvm_ruby_gem_home="${rvm_ruby_gem_home:-$GEM_HOME}"
if
  [[ ! -d "$rvm_ruby_gem_home" ]] &&
  builtin command -v gem > /dev/null 2>&1
then
  rvm_ruby_gem_home="$(gem env home)"
fi

case "$action" in
  import|load)
    if
      [[ -z "${rvm_ruby_strings:-""}" ]]
    then
      gemset_import "Installing gems" "$1"
    else
      rubies=()
      __rvm_custom_separated_array rubies , "$rvm_ruby_strings"
      for rvm_ruby_string in "${rubies[@]}"
      do
        __rvm_with "$rvm_ruby_string" gemset_import "Installing gems" "$1"
      done
    fi
    ;;
  export|dump)
    gemset_export "$@"
    ;;
  empty)
    __rvm_use "${1:+@}${1:-${GEM_HOME##*/}}"
    gemset_$action "$@"
    ;;
  create|initial|list)
    __rvm_select
    rvm_gemset_name="${rvm_gemset_name:-${rvm_expected_gemset_name:-}}"
    gemset_$action "$@"
    ;;
  copy|delete|dir|globalcache|list_all|list_strings|move|pristine|prune|rename|remove|update|unpack|reset_env)
    gemset_$action "$@"
    ;;
  name|string)
    gemset_name "$@"
    ;;
  strings)
    gemset_list "$@"
    ;;
  gemdir|gempath|gemhome|home|path|version)
    gemset_info "$@"
    ;;
  install|search)
    gem_$action "$@"
    ;;
  clear)
    rvm_error "'rvm gemset clear' has been deprecated. Please use 'rvm use @default' instead."
    ;;
  help)
    rvm_help gemset
    ;;
  *)
    rvm_error_help "Unknown subcommand '$action'" gemset
    exit 1
    ;;
esac
src/rvm/scripts/migrate000077500000021046147511530550011217 0ustar00#!/usr/bin/env bash

unset GREP_OPTIONS

source "$rvm_scripts_path/base"

usage()
{
  printf "%b" "

  Usage:

    rvm migrate {source-ruby} {destination-ruby} [--force]

  Description:

    Moves all gemsets from {source-ruby} ruby to {destination-ruby}.

" >&2
}

confirm()
{
  if (( ${rvm_force_flag:-0} > 0 ))
  then return 0
  fi

  \typeset confirmation_response

  printf "%b" "$1 (Y/n): "

  read -r confirmation_response

  [[ -z "$confirmation_response" ]] ||
    echo "$confirmation_response" | __rvm_grep -i '^y' >/dev/null 2>&1
}

die_with_error()
{
  rvm_error "$1"

  exit "${2:-1}"
}

expand_ruby_name()
{
  "$rvm_scripts_path/tools" strings "$1" | __rvm_awk -F"${rvm_gemset_separator:-"@"}" '{print $1}'
}

migrate_rubies()
{
  \typeset -a origin_gemsets alias_pairs
  \typeset origin_gemset destination_gemset gemset_name migrate_ruby_name \
    migrate_alias_name migrate_new_alias_name binaries origin_wrappers_path \
    full_bin_path expanded_symlink linked_binary_name new_wrapper_destination

  expanded_source="$(expand_ruby_name "$source_ruby")"
  expanded_destination="$(expand_ruby_name "$destination_ruby")"

  migrate_rubies_checks   &&
  migrate_rubies_gemsets  &&
  migrate_rubies_aliases  &&
  migrate_rubies_summary  ||
  return $?
}

migrate_rubies_checks()
{
  if
    [[ -z "$expanded_source" ]]
  then
    die_with_error "Could not expand source ruby '$source_ruby'"
  elif
    [[ -z "$expanded_destination" ]]
  then
    die_with_error "Could not expand destination ruby '$destination_ruby'"
  elif
    [[ "$expanded_destination" == "$expanded_source" ]]
  then
    die_with_error "Source and Destination Ruby are the same ($expanded_destination)"
  elif
    [[ ! -d "$rvm_rubies_path/$expanded_source" ]]
  then
    die_with_error "Ruby '$expanded_source' is not installed - please install it first."
  elif
    [[ ! -d "$rvm_rubies_path/$expanded_destination" ]]
  then
    die_with_error "Ruby '$expanded_destination' is not installed - please install it first."
  fi

  migrate_rubies_checks_required_space
}

migrate_rubies_checks_required_space()
{
  \typeset __used_space __free_space
  __rvm_calculate_space_free "${rvm_gems_path}"
  __rvm_calculate_space_used "$rvm_gems_path/$expanded_source"{,@*}

  if
    (( __used_space > __free_space ))
  then
    die_with_error "Not enough space (${__free_space}MB) to copy gemsets (${__used_space}MB)."
  elif
    (( __used_space*12 > __free_space*10 )) # 20% check
  then
    rvm_warn "You are running low on disk space ${__free_space}MB, required ${__used_space}MB."
  else
    rvm_log "Free disk space ${__free_space}MB, required ${__used_space}MB."
  fi
}

migrate_rubies_gemset_calculate_destination()
{
  destination_gemset="$expanded_destination"
  case "$origin_gemset" in
    (*${rvm_gemset_separator:-@}*)
      gemset_name="${origin_gemset/*${rvm_gemset_separator:-"@"}/}"
      destination_gemset="${destination_gemset}${rvm_gemset_separator:-"@"}${gemset_name}"
    ;;
    (*)
      gemset_name="default"
    ;;
  esac
}

migrate_rubies_gemsets_run_each_ask()
{
  case "$__action" in
    (copy)
      echo "Moving gems from $* to $expanded_destination?"
      ;;
    (merge)
      confirm "Are you sure you wish to Merge gems from $* to $expanded_destination" || return 1
      ;;
    (overwrite)
      echo "Are you sure you wish to MOVE gems from $* to $expanded_destination?"
      confirm "This will overwrite existing gems in $expanded_destination and remove them from $expanded_source" || return 1
      ;;
    (*)
      rvm_error "Unknown action($__action) for migrate_rubies_gemsets_run_each"
      return 204
  esac
}

migrate_rubies_gemset_clean_destination()
{
  case "$__action" in
    (overwrite)
      __rvm_log_command "remove.gemset.$gemset_name" "Removing $destination_gemset" \
        \command \rm -rfv  "${rvm_gems_path:-"$rvm_path/gems"}/$destination_gemset"/* ||
        return $?
      ;;
  esac
}

__migrate_gemset()
{
  \command \mkdir -p "${rvm_gems_path:-"$rvm_path/gems"}/$destination_gemset"/ &&
  \command \mv -v "${rvm_gems_path:-"$rvm_path/gems"}/$1"/* "${rvm_gems_path:-"$rvm_path/gems"}/$2"/ &&
  gemset_reset_env "$2"
}

__merge_gemset()
(
  \typeset __file
  \typeset -a __files
  __files=()
  cd "${rvm_gems_path:-"$rvm_path/gems"}/$1"/
  __rvm_read_lines __files <(
    __rvm_find . -type d
  )
  for __file in "${__files[@]}"
  do
    mkdir -p "${rvm_gems_path:-"$rvm_path/gems"}/$2/${__file#./}"
  done
  __files=()
  __rvm_read_lines __files <(
    __rvm_find . -type f
  )
  for __file in "${__files[@]}"
  do
    \command \mv -v "${__file}" "${rvm_gems_path:-"$rvm_path/gems"}/$2/${__file#./}"
  done
  rm -rf "${rvm_gems_path:-"$rvm_path/gems"}/$1"/
  cd ..
  gemset_reset_env "$2"
)

migrate_rubies_gemsets_run_migration()
{
  case "$__action" in
    (copy|overwrite)
      __rvm_log_command "migrate.gemset.$gemset_name" "Moving $origin_gemset to $destination_gemset" \
        __migrate_gemset "$origin_gemset" "$destination_gemset" ||
        return $?
      ;;
    (merge)
      __rvm_log_command "merge.gemset.$gemset_name" "Merging $origin_gemset to $destination_gemset" \
        __merge_gemset "$origin_gemset" "$destination_gemset" ||
        return $?
      ;;
  esac
}

migrate_rubies_gemsets_run_each()
{
  \typeset __action=$1
  shift
  migrate_rubies_gemsets_run_each_ask "$@" || return $?

  for origin_gemset in "$@"
  do
    migrate_rubies_gemset_calculate_destination
    migrate_rubies_gemset_clean_destination
    migrate_rubies_gemsets_run_migration
    __rvm_gemset_pristine "$destination_gemset"
  done
}

migrate_rubies_gemset_partition()
{
  if
    [[ ! -d "${rvm_gems_path:-"$rvm_path/gems"}/$destination_gemset" ]]
  then
    __list_new+=( "$origin_gemset" )
  elif
    [[ "$gemset_name" == "global" ]]
  then
    __list_global+=( "$origin_gemset" )
  elif
    [[ "$gemset_name" == "default" ]]
  then
    __list_default+=( "$origin_gemset" )
  else
    __list_existing+=( "$origin_gemset" )
  fi
}

migrate_rubies_gemsets_run()
{
  if [[ -n "${__list_global[*]}" ]]
  then migrate_rubies_gemsets_run_each overwrite "${__list_global[@]}"
  fi
  if [[ -n "${__list_default[*]}" ]]
  then migrate_rubies_gemsets_run_each merge "${__list_default[@]}"
  fi
  if [[ -n "${__list_existing[*]}" ]]
  then migrate_rubies_gemsets_run_each overwrite "${__list_existing[@]}"
  fi
  if [[ -n "${__list_new[*]}" ]]
  then migrate_rubies_gemsets_run_each copy "${__list_new[@]}"
  fi
}

migrate_rubies_gemsets()
{
  \typeset origin_gemsets __list_global __list_default __list_existing __list_new
  __list_global=()
  __list_default=()
  __list_existing=()
  __list_new=()
  __rvm_read_lines origin_gemsets <(
    __rvm_list_gemset_strings | __rvm_grep -E "^$expanded_source(@.*)?$"
  )
  for origin_gemset in "${origin_gemsets[@]}"
  do
    migrate_rubies_gemset_calculate_destination
    migrate_rubies_gemset_partition
  done
  rvm_debug "__list_global=  ${__list_global[*]};"
  rvm_debug "__list_default= ${__list_default[*]};"
  rvm_debug "__list_existing=${__list_existing[*]};"
  rvm_debug "__list_new=     ${__list_new[*]};"
  migrate_rubies_gemsets_run
}

migrate_rubies_alias()
{
  "$rvm_scripts_path/alias" delete "$migrate_alias_name"
  "$rvm_scripts_path/alias" create "$migrate_alias_name" "$migrate_new_alias_name"
}

migrate_rubies_aliases()
{
  __rvm_read_lines alias_pairs < "$rvm_path/config/alias"
  aliases=()
  for alias_pair in "${alias_pairs[@]}"
  do
    migrate_alias_name="${alias_pair/=*/}"
    migrate_ruby_name="${alias_pair/*=/}"
    if
      [[ "$migrate_ruby_name" == "$expanded_source" ||
         "$migrate_ruby_name" == "${expanded_source}${rvm_gemset_separator:-"@"}"*
      ]]
    then
      migrate_new_alias_name="${migrate_ruby_name/$expanded_source/$expanded_destination}"
      aliases+=( "$migrate_alias_name=$migrate_new_alias_name" )
    fi
  done
  if
    (( ${#aliases[@]} )) &&
    confirm 'Do you wish to move over aliases?'
  then
    for alias_pair in "${aliases[@]}"
    do
      migrate_alias_name="${alias_pair%%=*}"
      migrate_new_alias_name="${alias_pair#*=}"
      __rvm_log_command "migrate.alias.$migrate_alias_name" \
        "Updating alias $migrate_alias_name to point to $migrate_new_alias_name" \
        migrate_rubies_alias
    done
  fi
  true
}

migrate_rubies_summary()
{
  if confirm "Do you also wish to completely remove $expanded_source (inc. archive)?"
  then __rvm_log_command "rvm.remove" "Removing $expanded_source" __rvm_run_wrapper manage remove "$expanded_source" --archive --gems
  fi

  echo "Successfully migrated $expanded_source to $expanded_destination"
}

source_ruby="$1"
destination_ruby="$2"

if
  [[ -z "$source_ruby" || -z "$destination_ruby" ]]
then
  usage
  exit 1
fi

migrate_rubies
src/rvm/scripts/env000077500000000113147511530550010347 0ustar00#!/usr/bin/env bash

source "$rvm_scripts_path/base"

__rvm_env_print "$@"
src/rvm/scripts/completion000077500000001343147511530550011736 0ustar00#!/usr/bin/env bash


if
  [[ -n "${ZSH_VERSION:-}" ]]
then
  # zsh completion for Ruby Version Manager (RVM), thanks to https://github.com/JoeKun
  [[ " ${fpath[*]} " == *" ${rvm_scripts_path:-$rvm_path/scripts}/extras/completion.zsh "* ]] ||
  {
    fpath+=( "${rvm_scripts_path:-$rvm_path/scripts}/extras/completion.zsh" )
    if
      [[ -n "${_comp_dumpfile:-}" ]]
    then
      \command \rm -f "$_comp_dumpfile"
      compinit -d "$_comp_dumpfile"
    fi
  }
elif
  [[ -n "${BASH_VERSION:-}" ]]
then
  # bash completion for Ruby Version Manager (RVM)
  source "${rvm_scripts_path:-$rvm_path/scripts}/extras/completion.bash"
  complete -o default -F _rvm rvm
else
  echo "RVM does not currently support completion in your shell."
fi
src/rvm/scripts/initialize000077500000014756147511530550011742 0ustar00#!/usr/bin/env bash

# Set shell options that RVM cannot live without,
# see __rvm_setup and __rvm_teardown for further settings.
if
  [[ -n "${BASH_VERSION:-}" ]]
then
  shopt -s extglob
elif
  [[ -n "${ZSH_VERSION:-}" ]]
then
  setopt extendedglob
  setopt kshglob
  setopt no_glob_subst
elif
  [[ -n "${KSH_VERSION:-}" ]]
then
  true # mksh
else
  printf "%b" "What the heck kind of shell are you running here???\n"
fi

# duplication marker jkdfkdfngjdjkfngjkdfngjkd
if
  (( ${rvm_trace_flag:-0} == 1 ))
then
  if   [[ -n "${BASH_VERSION:-}" ]]
  then export PS4="+ \$(__rvm_date \"+%s.%N\" 2>/dev/null) \${BASH_SOURCE##\${rvm_path:-}} : \${FUNCNAME[0]:+\${FUNCNAME[0]}()}  \${LINENO} > "
  elif [[ -n "${ZSH_VERSION:-}" ]]
  then export PS4="+ %* %F{red}%x:%I %F{green}%N:%i%F{white} %_"
  fi
  set -o xtrace
fi

export __rvm_env_loaded
# set env loaded flag if not yet set
: __rvm_env_loaded:${__rvm_env_loaded:=0}:
# increase load count counter
: __rvm_env_loaded:$(( __rvm_env_loaded+=1 )):

# load only if not yet loaded or first time loading
if [[ -z "${rvm_tmp_path:-}" ]] || (( __rvm_env_loaded == 1 ))
then

  if
    \typeset -f __rvm_cleanse_variables >/dev/null 2>&1
  then
    __rvm_cleanse_variables ||
    if [[ -n "${ZSH_VERSION:-}" ]]
    then rvm_error "ZSH Error, run \`rm -f ~/.zcompdump\` and try again."
    fi
  fi

  # Ensure that /etc/rvmrc and $HOME/.rvmrc values take precedence.
  if (( ${rvm_ignore_rvmrc:=0} == 0 ))
  then
    [[ -n "${rvm_stored_umask:-}" ]] || export rvm_stored_umask=$(umask)

    rvm_rvmrc_files=("/etc/rvmrc" "$HOME/.rvmrc")
    if [[ -n "${rvm_prefix:-}" ]] && ! [[ "$HOME/.rvmrc" -ef "${rvm_prefix}/.rvmrc" ]]
    then rvm_rvmrc_files+=( "${rvm_prefix}/.rvmrc" )
    fi
    for rvmrc in "${rvm_rvmrc_files[@]}"
    do
      if [[ -f "$rvmrc" ]]
      then
        if GREP_OPTIONS="" \command \grep '^\s*rvm .*$' "$rvmrc" >/dev/null 2>&1
        then
          printf "%b" "
Error:
          $rvmrc is for rvm settings only.
          rvm CLI may NOT be called from within $rvmrc.
          Skipping the loading of $rvmrc"
          return 1
        else
          source "$rvmrc"
        fi
      fi
    done
    unset rvm_rvmrc_files
  fi

  # duplication marker jdgkjnfnkjdngjkfnd4fd
  export rvm_path
  if [[ -z "${rvm_path:-}" ]]
  then
    if [[ -n "${BASH_SOURCE:-$_}" && -f "${BASH_SOURCE:-$_}" ]]
    then
      rvm_path="${BASH_SOURCE:-$_}"
      rvm_path="$( \command \cd "${rvm_path%/scripts/initialize}">/dev/null; pwd )"
    elif (( UID == 0 )) && [[ -d "/usr/local/rvm" ]]
    then rvm_path="/usr/local/rvm"
    elif [[ -d "${HOME}/.rvm" ]]
    then rvm_path="${HOME}/.rvm"
    elif [[ -d "/usr/local/rvm" ]]
    then rvm_path="/usr/local/rvm"
    else echo "Can't find rvm install!" 1>&2 ; exit 1
    fi
  fi

  true ${rvm_scripts_path:="$rvm_path/scripts"}

  #
  # Setup RVM Environment variables.  Each RVM internal path is intended to be
  # configurable by the end users for whatever their needs may be.
  # They should be set in /etc/rvmrc and then $HOME/.rvmrc
  #
  # duplication marker kkdfkgnjfndgjkndfjkgnkfjdgn
  [[ -n "${rvm_user_install_flag:-}" ]] ||
  case "$rvm_path" in
    (/usr/local/rvm)         rvm_user_install_flag=0 ;;
    ($HOME/*|/${USER// /_}*) rvm_user_install_flag=1 ;;
    (*)                      rvm_user_install_flag=0 ;;
  esac
  export rvm_user_install_flag

  : \
    rvm_bin_path:${rvm_bin_path:="$rvm_path/bin"} \
    rvm_man_path:${rvm_man_path:="$rvm_path/share/man"} \
    rvm_archives_path:${rvm_archives_path:="$rvm_path/archives"} \
    rvm_docs_path:${rvm_docs_path:="$rvm_path/docs"} \
    rvm_environments_path:${rvm_environments_path:="$rvm_path/environments"} \
    rvm_examples_path:${rvm_examples_path:="$rvm_path/examples"} \
    rvm_gems_path:${rvm_gems_path:="$rvm_path/gems"} \
    rvm_gemsets_path:${rvm_gemsets_path:="$rvm_path/gemsets"} \
    rvm_help_path:${rvm_help_path:="$rvm_path/help"} \
    rvm_docs_path:${rvm_docs_path:="$rvm_path/docs"} \
    rvm_hooks_path:${rvm_hooks_path:="$rvm_path/hooks"} \
    rvm_lib_path:${rvm_lib_path:="$rvm_path/lib"} \
    rvm_log_path:${rvm_log_path:="$rvm_path/log"} \
    rvm_patches_path:${rvm_patches_path:="$rvm_path/patches"} \
    rvm_repos_path:${rvm_repos_path:="$rvm_path/repos"} \
    rvm_rubies_path:${rvm_rubies_path:="$rvm_path/rubies"} \
    rvm_rubygems_path:${rvm_rubygems_path:="$rvm_path/rubygems"} \
    rvm_src_path:${rvm_src_path:="$rvm_path/src"} \
    rvm_tmp_path:${rvm_tmp_path:="$rvm_path/tmp"} \
    rvm_user_path:${rvm_user_path:="$rvm_path/user"} \
    rvm_usr_path:${rvm_usr_path:="$rvm_path/usr"} \
    rvm_wrappers_path:${rvm_wrappers_path:="$rvm_path/wrappers"} \
    rvm_verbose_flag:${rvm_verbose_flag:=0} \
    rvm_debug_flag:${rvm_debug_flag:=0} \
    rvm_gems_cache_path:${rvm_gems_cache_path:=${rvm_gems_path:-"$rvm_path/gems"}/cache}

  export rvm_action rvm_alias_expanded rvm_archive_extension rvm_archives_path rvm_bin_flag rvm_bin_path rvm_debug_flag rvm_default_flag rvm_delete_flag rvm_docs_path rvm_docs_type rvm_dump_environment_flag rvm_environments_path rvm_error_message rvm_examples_path rvm_expanding_aliases rvm_file_name rvm_gemdir_flag rvm_gems_cache_path rvm_gems_path rvm_gemset_name rvm_gemset_separator rvm_gemsets_path rvm_gemstone_package_file rvm_gemstone_url rvm_head_flag rvm_help_path rvm_docs_path rvm_hook rvm_hooks_path rvm_install_on_use_flag rvm_lib_path rvm_llvm_flag rvm_loaded_flag rvm_log_path rvm_niceness rvm_nightly_flag rvm_only_path_flag rvm_parse_break rvm_patch_original_pwd rvm_patches_path rvm_path rvm_pretty_print_flag rvm_proxy rvm_quiet_flag rvm_reload_flag rvm_remove_flag rvm_repos_path rvm_rubies_path rvm_ruby_alias rvm_ruby_args rvm_ruby_binary rvm_ruby_bits rvm_ruby_configure rvm_ruby_file rvm_ruby_gem_home rvm_ruby_gem_path rvm_ruby_global_gems_path rvm_ruby_home rvm_ruby_interpreter rvm_ruby_irbrc rvm_ruby_major_version rvm_ruby_make rvm_ruby_make_install rvm_ruby_minor_version rvm_ruby_mode rvm_ruby_name rvm_ruby_package_file rvm_ruby_package_name rvm_ruby_patch rvm_ruby_patch_level rvm_ruby_release_version rvm_ruby_repo_url rvm_ruby_revision rvm_ruby_selected_flag rvm_ruby_sha rvm_ruby_string rvm_ruby_strings rvm_ruby_tag rvm_ruby_url rvm_ruby_user_tag rvm_ruby_version rvm_script_name rvm_scripts_path rvm_sdk rvm_user_install_flag rvm_silent_flag rvm_src_path rvm_sticky_flag rvm_system_flag rvm_tmp_path rvm_token rvm_trace_flag rvm_use_flag rvm_user_flag rvm_user_path rvm_usr_path rvm_verbose_flag rvm_wrappers_path rvm_ruby_repo_branch rvm_man_path rvm_remote_flag rvm_ruby_repo_tag

fi # if [[ -z "${rvm_tmp_path:-}" ]] || (( __rvm_env_loaded == 1 ))
src/rvm/scripts/rubygems000077500000001070147511530550011417 0ustar00#!/usr/bin/env bash

source "$rvm_scripts_path/base"
source "$rvm_scripts_path/functions/rubygems"

result=0

__rvm_become

builtin command -v ruby > /dev/null || {
  rvm_error "'ruby' was not found, cannot install rubygems unless ruby is present (Do you have an RVM ruby installed & selected?)"
  exit 1
}

version="$1"
shift

[[ -n "$version" ]] || {
  rvm_error "Usage: rvm rubygems [x.y.z|latest-x.y|latest|remove]"
  exit 1
}

case "$version" in
  remove|validate|validate_gemfile)
    rubygems_$version "$@"
    ;;
  *)
    rubygems_setup ${version}
    ;;
esac
src/rvm/scripts/rtfm000077500000000451147511530550010534 0ustar00#!/usr/bin/env bash

rvm_url="https://rvm.io/"

source "$rvm_path/scripts/functions/logging"

if builtin command -v open >/dev/null ; then

  open "$rvm_url"

elif builtin command -v xdg-open >/dev/null ; then

  xdg-open "$rvm_url"

else

  rvm_log "Please RTFM at the URL $rvm_url"

fi

exit $?
src/rvm/scripts/snapshot000077500000016404147511530550011430 0ustar00#!/usr/bin/env bash

# __rvm_detect_system() does not support AIX
sys=$( command uname -s )
if [[ "${sys}" == AIX ]] ; then
    name_opt=-name
else
    name_opt=-iname
fi

unset GREP_COLOR
unset GREP_OPTIONS

source "$rvm_scripts_path/base"

__error_on_result()
{
  if [[ "$1" -gt 0 ]]; then
    rvm_error "$2 - Aborting now."
    return 0
  else
    return 1
  fi
}

snapshot_save()
{
  \typeset snapshot_temp_path snapshot_ruby_name_file \
    snapshot_alias_name_file snapshot_installable_file \
    snapshot_primary_ruby snapshot_ruby_order destination_path

  if [[ -z "$1" ]]
  then
    printf "%b" "

    Usage:

      rvm snapshot save name

    Description:

    Saves a snapshot describing the rvm installation
    to <name>.tar.gz in the current working directory.\

    " >&2
    return 1
  fi

  # Create the temporary directory.
  snapshot_temp_path="${rvm_tmp_path}/$$-snapshot"

  __rvm_rm_rf "$snapshot_temp_path"

  mkdir -p "$snapshot_temp_path"

  rvm_log "Backing up a list of aliases"
  __rvm_cp "$rvm_path/config/alias" "$snapshot_temp_path/"

  rvm_log "Backing up your user preferences"
  __rvm_cp "$rvm_user_path/db" "$snapshot_temp_path/"

  rvm_log "Backing up your installed packages"
  __rvm_sed -e 's/-//' -e 's/^lib//' < "$rvm_path/config/pkg" | __rvm_awk -F= '{print $1}' | sort | uniq > "$snapshot_temp_path/pkg"

  rvm_log "Backing up all of your gemsets"
  mkdir -p "$snapshot_temp_path/gems"

  (
    __rvm_cd "$snapshot_temp_path/gems"

    for snapshot_gemset in $(__rvm_list_gemset_strings)
    do

      __rvm_become "$snapshot_gemset" ; result="$?"

      __error_on_result "$result" "Error becoming ruby $snapshot_gemset" && return "$result"

      "$rvm_scripts_path/gemsets" export "${snapshot_gemset}.gems" >/dev/null ; result="$?"

      __error_on_result "$result" "Error exporting gemset contents for $snapshot_gemset" && return "$result"

      mkdir -p "./$snapshot_gemset/"

      [[ -d "$GEM_HOME/cache/" ]] && __rvm_cp -R "$GEM_HOME/cache/" "./$snapshot_gemset/"

    done
  )

  rvm_log "Backing up all of your installed rubies"

  printf "%b" "#!/usr/bin/env bash\n\nset -e\n\n" > "$snapshot_temp_path/install-rubies.sh"

  echo "source \"\$rvm_scripts_path/rvm\" || true" >> "$snapshot_temp_path/install-rubies.sh"

  snapshot_ruby_name_file="${rvm_tmp_path}/$$-rubies"
  snapshot_alias_name_file="${rvm_tmp_path}/$$-aliases"
  snapshot_installable_file="${rvm_tmp_path}/$$-installable"

  "$rvm_scripts_path/alias" list | __rvm_awk -F ' => ' '{print $1}' | sort | uniq 2>/dev/null > "$snapshot_alias_name_file"

  __rvm_list_strings | \command \tr ' ' '\n' | sort | uniq > "$snapshot_ruby_name_file"

  comm -2 -3 "$snapshot_ruby_name_file" "$snapshot_alias_name_file" > "$snapshot_installable_file"

  __rvm_rm_rf "$snapshot_ruby_name_file"
  __rvm_rm_rf "$snapshot_alias_name_file"

  snapshot_primary_ruby="$(__rvm_grep '^\(ree\|ruby-1.8.7\)' < "$snapshot_installable_file" | __rvm_grep -v '-head$' | \command \sort -r | \command \head -n1)"
  snapshot_ruby_order="$snapshot_primary_ruby $(__rvm_grep -v "$snapshot_primary_ruby" < "$snapshot_installable_file")"

  for snapshot_ruby_name in $snapshot_ruby_order
  do
    snapshot_install_command="$(__rvm_recorded_install_command "$snapshot_ruby_name")"
    if [[ -n "$snapshot_install_command" ]]
    then
      echo "rvm install $snapshot_install_command" | __rvm_sed "s#$rvm_path#'\\\"\$rvm_path\\\"'#" >> "$snapshot_temp_path/install-rubies.sh"
    else
      __rvm_become "$snapshot_ruby_name"
      ruby "$rvm_path/lib/rvm/install_command_dumper.rb" >> "$snapshot_temp_path/install-rubies.sh"
    fi
    unset snapshot_install_command
  done

  unset snapshot_ruby_name snapshot_primary_ruby

  __rvm_rm_rf "$snapshot_installable_file"

  rvm_log "Compressing snapshotting"
  destination_path="$PWD"
  (
    __rvm_cd "$snapshot_temp_path"
    __rvm_rm_rf "$destination_path/$1.tar.gz"
    __rvm_tar czf "$destination_path/$1.tar.gz" .
    result="$?"
    __error_on_result "$result" "Error creating archive $destination_path/$1.tar.gz" && return "$result"
  )

  rvm_log "Cleaning up"
  __rvm_rm_rf "$snapshot_temp_path"

  rvm_log "Snapshot complete"
}

snapshot_load()
{
  \typeset package_info snapshot_archive snapshot_temp_path \
    alias_name alias_ruby
  export rvm_create_flag

  if [[ -z "$1" ]]
  then
    echo "Usage: rvm snapshot load name" >&2
    echo "Loads a snapshot from <name>.tar.gz in the current directory." >&2
    return 1
  fi

  snapshot_archive="$PWD/$(echo "$1" | __rvm_sed 's/.tar.gz$//').tar.gz"

  if ! [[ -s "$snapshot_archive" ]]
  then
    echo "The provides snapshot '$(basename "$snapshot_archive")' doesn't exist." >&2
    return 1
  fi

  snapshot_temp_path="${rvm_tmp_path}/$$-snapshot"

  __rvm_rm_rf "$snapshot_temp_path"
  \command \mkdir -p "$snapshot_temp_path"

  rvm_log "Extracting snapshot"
  (
    __rvm_cd "$snapshot_temp_path"
    __rvm_tar xzf "$snapshot_archive"
    result="$?"
    __error_on_result "$result" "Error extracting the archive '$snapshot_archive'" && return "$result"
  )

  rvm_log "Restoring user settings"
  __rvm_cp -f "$snapshot_temp_path/db" "$rvm_user_path/db"

  rvm_log "Installing rvm-managed packages"
  for snapshot_package in $(\command \cat "$snapshot_temp_path/pkg")
  do
    "$rvm_scripts_path/package" install "$snapshot_package"
    result="$?"
    __error_on_result "$result" "Error installing package '$snapshot_package'" && return "$result"
  done
  unset snapshot_package

  rvm_log "Installing rubies"

  chmod +x "$snapshot_temp_path/install-rubies.sh"
  __rvm_sed_i "${snapshot_temp_path}/install-rubies.sh" -e '1 s/#!\/usr\/bin\/env bash -e/#!\/usr\/bin\/env bash\n\nset -e/'

  "$snapshot_temp_path/install-rubies.sh"
  result="$?"

  __error_on_result "$result" "Error importing rubies." && return "$result"

  rvm_create_flag=1

  rvm_log "Setting up gemsets"

  (
    __rvm_cd "$snapshot_temp_path/gems"

    gems=($(__rvm_find . -mindepth 0 -maxdepth 0 -type f "${name_opt}" '*.gems' | __rvm_sed 's/.gems$//'))

    for snapshot_gemset in "${gems[@]//.\/}"
    do

      __rvm_become "$snapshot_gemset"
      result="$?"

      __error_on_result "$result" \
        "Error becoming '$snapshot_gemset'" && return "$result"

      mkdir -p "$GEM_HOME/cache/"

      __rvm_cp -Rf "$snapshot_gemset/" "$GEM_HOME/cache/"
      result="$?"

      __error_on_result "$result" \
        "Error copying across cache for $snapshot_gemset" && return "$result"

      "$rvm_scripts_path/gemsets" import "$snapshot_gemset" >/dev/null 2>&1
      result="$?"

      __error_on_result "$result" \
        "Error importing gemset for $snapshot_gemset" && return "$result"
    done
  )

  rvm_log "Restoring aliases"

  while read -r package_info
  do
    # Note: this assumes an '=' int the input...
    alias_name="${package_info/=*}"
    alias_ruby="${package_info/*=}"

    "$rvm_scripts_path/alias" create "$alias_name" "$alias_ruby"
  done < "$snapshot_temp_path/alias"

  rvm_log "Cleaning up load process"
  __rvm_rm_rf "$snapshot_temp_path"

  rvm_log "Loaded snapshot from $(basename "$snapshot_archive")"
}

snapshot_usage()
{
  echo "Usage: rvm snapshot {save,load} file" >&2
  return 1
}


args=($*)
action="${args[0]}"
args="$(echo ${args[@]:1})" # Strip trailing / leading / extra spacing.

case "$action" in
  save) snapshot_save "$args" ;;
  load) snapshot_load "$args" ;;
  *)    snapshot_usage ;;
esac

exit $?
src/rvm/scripts/patches000077500000003727147511530550011224 0ustar00#!/usr/bin/env bash

# General tools for manipulating patches
# and dealing with patches.

lookup_patchset()
{
  \typeset paths lookup_path

  if [[ -z "$1" ]]
  then
    echo "Usage: rvm patchset show name"
    return 1
  fi

  paths=($(__rvm_ruby_string_paths_under "$rvm_path/patchsets" | sort -r))

  for lookup_path in "${paths[@]}"
  do
    if [[ -s "$lookup_path/$1" ]]
    then
      \command \cat "$lookup_path/$1"
      return 0
    fi
  done

  return 1
}

# Returns the path used to look for a patch given a specific name.
__rvm_patch_lookup_path()
{
  echo "/"
  [[ -z "${rvm_patch_original_pwd:-""}" ]] || echo "$rvm_patch_original_pwd/"
  echo "$PWD/"
  __rvm_ruby_string_paths_under "$rvm_patches_path" | __rvm_sed 's/$/\//' | sort -r
  return $?
}

__rvm_expand_patch_name()
{
  \typeset name level expanded_patch_name not_required_patches
  not_required_patches="optional default ${_system_name_lowercase}"
  name="${1:-""}"
  level="${2:-}"
  [[ -n "$name" ]] || return 0
  if
    expanded_patch_name="$(
      rvm_ruby_string="${rvm_ruby_string}" lookup_patchset "$name"
    )"
  then
    echo "${expanded_patch_name}"
  elif
    [[ " $not_required_patches " != *" $name "* ]]
  then
    echo "${name}${level:+%}${level:-}"
  fi
}

# Return the full patch for a given patch.
__rvm_lookup_full_patch_path()
{
  \typeset extension patch_path directory directories __old_IFS
  # Absolute path, pwd and then finally the rvm patches path.
  __old_IFS="$IFS"
  IFS=$'\n'
  directories=($( __rvm_patch_lookup_path ))
  IFS="$__old_IFS"
  for directory in "${directories[@]}"
  do
    for extension in "" .patch .diff
    do
      patch_path="${directory}${1}${extension}"
      # -s reports directories too - so additional check -f needed
      if
        [[ -s "$patch_path" && -f "$patch_path" ]]
      then
        echo "$patch_path"
        return 0
      fi
    done
  done
  if
    __rvm_string_match "$1" "http://*" "https://*" &&
    file_exists_at_url "$1"
  then
    echo "$1"
  fi
}
src/rvm/scripts/group000077500000001726147511530550010726 0ustar00#!/usr/bin/env bash

source "$rvm_scripts_path/base"
source "$rvm_scripts_path/functions/group"
source "$rvm_scripts_path/functions/utility"
source "$rvm_scripts_path/functions/version"

group_add()
{
  \typeset user group
  group="$1"
  shift
  for user in "$@"
  do
    if
      __rvm_is_user_in_group "$group" "$user"
    then
      echo "User '$user' already in the group '$group'"
    else
      echo "Adding user '$user' to the group '$group'"
      __rvm_add_user_to_group "$group" "$user"
    fi
  done
}

group_create()
{
  \typeset -a _params
  _params=( "${1:-$rvm_group_name}" )
  shift
  if
    (( $# ))
  then
    _params+=( "$1" )
  else
    if [[ "$1" == "${rvm_group_name}" && -n "${rvm_group_id:-}" ]]
    then _params+=( "${rvm_group_id:-}" )
    fi
  fi
  __rvm_create_group "${_params[@]}"
}

action="$1"
shift

true "${rvm_group_name:=rvm}"

case "$action" in
  add|create|help)
    group_$action "$@"
    ;;
  *)
    rvm_help group "$@"
    false
    ;;
esac
src/rvm/scripts/pkg000077500000002323147511530550010345 0ustar00#!/usr/bin/env bash

if (( ${rvm_trace_flag:=0} == 2 ))
then
  set -x
  export rvm_trace_flag
fi

rvm_base_except="selector"

source "$rvm_scripts_path/base"
source "$rvm_scripts_path/functions/build"
source "$rvm_scripts_path/functions/pkg"

set +o errexit

# Tools to make managing ruby dependencies inside of rvm easier.
args=($*)
action="${args[0]:-""}"
library="${args[1]:-""}"
args="$(echo ${args[@]:2})"

rvm_warn "
Beware, 'rvm pkg ...' is deprecated, read about the new autolibs feature: 'rvm help autolibs'.
"

if [[ -n "$library" ]]
then
  case $library in
    readline|iconv|curl|openssl|zlib|autoconf|ncurses|pkgconfig|gettext|glib|mono|llvm|libxml2|libxslt|libyaml|epel)
      __rvm_setup_compile_environment ${library}
      install_${library}
      ;;
    ree_dependencies)
      for i in zlib ncurses readline openssl iconv
      do
        (
          __rvm_setup_compile_environment ${i}
          install_${i}
        )
      done
      ;;
    *)
      rvm_error "Package '${library}' is unknown."
      ;;
  esac

  exit $?
elif [[ "$action" == remove ]]
then
  rvm_log "Removing '$rvm_usr_path' ..."
  __rvm_rm_rf "$rvm_usr_path" &&
    rvm_log "Removed" ||
    rvm_error "Failed"
else
  rvm_help pkg
  exit 1
fi
src/rvm/scripts/base000077500000006002147511530550010474 0ustar00#!/usr/bin/env bash

# Base is a collection of general files + commonly included setup functions.

#duplicated from scripts/rvm - rare reload issue
__rvm_has_opt()
{
  if # pre-gnu
   [[ -n "${ZSH_VERSION:-}"  ]]
  then
    setopt | GREP_OPTIONS="" \command \grep "^${1:-}$" >/dev/null 2>&1 || return $?
  elif # mksh
    [[ -n "${KSH_VERSION:-}"  ]]
  then
    set +o | GREP_OPTIONS="" \command \grep "-o ${1:-}$" >/dev/null 2>&1 || return $?
  elif # bash
    [[ -n "${BASH_VERSION:-}" ]]
  then
    [[ ":${SHELLOPTS:-}:" == *":${1:-}:"* ]] || return $?
  else # what is this?!
    return 1
  fi
}

if __rvm_has_opt "errexit"
then rvm_stored_errexit=1
fi

set +e

# duplication marker jkdfkdfngjdjkfngjkdfngjkd
if
  (( ${rvm_trace_flag:-0} == 1 ))
then
  if   [[ -n "${BASH_VERSION:-}" ]]
  then export PS4="+ \$(__rvm_date \"+%s.%N\" 2>/dev/null) \${BASH_SOURCE##\${rvm_path:-}} : \${FUNCNAME[0]:+\${FUNCNAME[0]}()}  \${LINENO} > "
  elif [[ -n "${ZSH_VERSION:-}" ]]
  then export PS4="+ %* %F{red}%x:%I %F{green}%N:%i%F{white} %_"
  fi
  set -o xtrace
fi
export __array_start rvm_path >/dev/null

#
# Setup environment parameters.
#
if [[ -n "${ZSH_VERSION:-}" ]]
then __array_start=1
else __array_start=0
fi

if (( ${rvm_ignore_rvmrc:=0} == 0 ))
then
  [[ -n "${rvm_stored_umask:-}" ]] || export rvm_stored_umask=$(umask)
  rvm_rvmrc_files=("/etc/rvmrc" "$HOME/.rvmrc")
  if [[ -n "${rvm_prefix:-}" ]] && ! [[ "$HOME/.rvmrc" -ef "${rvm_prefix}/.rvmrc" ]]
     then rvm_rvmrc_files+=( "${rvm_prefix}/.rvmrc" )
  fi

  for rvmrc in "${rvm_rvmrc_files[@]}"
  do
    if [[ -f "$rvmrc" ]]
    then
      # pre-gnu
      if GREP_OPTIONS="" \command \grep '^\s*rvm .*$' "$rvmrc" >/dev/null 2>&1
      then
        printf "%b" "
Error:
        $rvmrc is for rvm settings only.
        rvm CLI may NOT be called from within $rvmrc.
        Skipping the loading of $rvmrc"
        return 1
      else
        source "$rvmrc"
      fi
    fi
  done
  unset rvm_rvmrc_files
fi

# duplication marker jdgkjnfnkjdngjkfnd4fd
export rvm_path
if [[ -z "${rvm_path:-}" ]]
then
  if [[ -n "${BASH_SOURCE:-$_}" && -f "${BASH_SOURCE:-$_}" ]]
  then
    rvm_path="${BASH_SOURCE:-$_}"
    rvm_path="$( \command \cd "${rvm_path%/scripts/base}">/dev/null; pwd )"
  elif (( UID == 0 )) && [[ -d "/usr/local/rvm" ]]
  then rvm_path="/usr/local/rvm"
  elif [[ -d "${HOME}/.rvm" ]]
  then rvm_path="${HOME}/.rvm"
  elif [[ -d "/usr/local/rvm" ]]
  then rvm_path="/usr/local/rvm"
  else echo "Can't find rvm install!" 1>&2 ; exit 1
  fi
fi

true ${rvm_scripts_path:="$rvm_path/scripts"}

# Load the general scripts.
# Use rvm_base_except="selector", for example, to override the loading.
load_rvm_scripts()
{
  \typeset -a scripts
  scripts=(
    selector logging support utility init cleanup env rvmrc install environment gemset checksum list
  )

  source "${rvm_scripts_path}/initialize"


  for entry in ${scripts[@]}
  do
    [[ " ${rvm_base_except:-} " == *" $entry "* ]] ||
    source "${rvm_scripts_path}/functions/$entry"  ||
    return $?
  done

  unset rvm_base_except
}
load_rvm_scripts
src/rvm/scripts/set000077500000014161147511530550010362 0ustar00#!/usr/bin/env bash

source "$rvm_scripts_path/base"

rvm_is_not_a_shell_function=0 # for nested invocations of rvm

if [[ -n "${rvm_in_flag}" && -d "${rvm_in_flag}" ]]
then __rvm_cd "${rvm_in_flag}"
fi

__rvm_attempt_single_exec()
{
  # Return if we have multiple rubies. or we're not running exec.
  if (( ${#rvm_ruby_strings[@]} == 1 ))
  then
    __rvm_become "$rvm_ruby_strings"
    __rvm_load_rvmrc
    export rvm_project_rvmrc=0
    exec "${args[@]}"
  fi

  return 1
}

__rvm_ruby_do()
{
  # Return on invalid rubies.
  __rvm_become "$current_set_ruby" || return 1

  rvm_hook="before_do"
  source "$rvm_scripts_path/hook"

  if [[ -n "$rvm_json_flag" || -n "$rvm_yaml_flag" || -n "$rvm_summary_flag" ]]
  then
    if [[ ! -d "./log/$rvm_ruby_string/" ]]
    then
      mkdir -p "./log/$rvm_ruby_string/"
    fi
    touch "./log/$rvm_ruby_string/$action.log"
    "${args[@]}" >> "./log/$rvm_ruby_string/$action.log" 2>&1
  else
    if (( ${rvm_verbose_flag:-0} > 0 ))
    then
      current_env="$(__rvm_env_string)"
      if [[ "$current_env" != "$current_set_ruby" ]]
      then
        current_env="$current_set_ruby ($current_env)"
      fi
      rvm_log "$current_env: $(ruby -v $rvm_ruby_mode | \command \tr "\n" ' ')"
      unset current_env
    fi
    (
      __rvm_load_rvmrc
      export rvm_project_rvmrc=0
      "${args[@]}"
    )
  fi
  result=$?

  string=$rvm_ruby_string #$(basename $rvm_ruby_gem_home)

  if (( result == 0 ))
  then
    eval "successes=(${successes[*]} $string)"
  else
    eval "errors=(${errors[*]} $string)"
  fi
  eval "rubies=(${rubies[*]} $string)"
  eval "statuses=(${statuses[*]} $result)"
  unset string

  rvm_hook="after_do"
  source "$rvm_scripts_path/hook"
  __rvm_unset_ruby_variables
}

# Output the summary in a human readable format.
__rvm_summary()
{
  export successes errors statuses

  summary="\nSummary:\n\n"

  if [[ ${#successes[*]} -gt 0 ]]
  then
    if rvm_pretty_print stdout
    then
      summary="$summary ${rvm_notify_clr:-}${#successes[*]} successful: $(echo "${successes[*]}" | __rvm_sed 's# #, #g')${rvm_reset_clr:-}\n"
    else
      summary="$summary ${#successes[*]} successful: $(echo "${successes[*]}" | __rvm_sed 's# #, #g')\n"
    fi
  fi

  if [[ ${#errors[*]} -gt 0 ]] ; then
    if rvm_pretty_print stdout
    then
      summary="$summary ${rvm_error_clr:-}${#errors[*]} errors: $(echo "${errors[*]}" | __rvm_sed 's# #, #g')${rvm_reset_clr:-}\n"
    else
      summary="$summary ${#errors[*]} errors: $(echo "${errors[*]}" | __rvm_sed 's# #, #g')\n"
    fi
  fi

  total=${#rubies[*]}

  [[ -z "${ZSH_VERSION:-}" ]] ; array_start=$?

  printf "%b" "$summary" | tee -a log/summary.log

  return ${#errors[*]}

}

# Output the summary in a yaml format.
__rvm_yaml()
{
  export successes errors statuses
  yaml="totals:\n  rubies: ${#rubies[*]}\n  successes: ${#successes[*]}\n  errors: ${#errors[*]}\nsuccesses:"

  for var in ${successes[*]} ; do yaml="$yaml\n  - $var" ; done
  yaml="$yaml\nerrors:"

  for var in ${errors[*]} ; do yaml="$yaml\n  - $var" ; done
  yaml="$yaml\nrubies:"
  total=${#rubies[*]}

  [[ -z "${ZSH_VERSION:-}" ]] ; array_start=$?

  for (( index = $array_start ; index < $total + $array_start ; index++ )) ; do
    if [[ ${rvm_debug_flag:-0} -gt 0 ]] ; then
      rvm_debug "${rubies[$index]}: ${statuses[$index]}"
    fi
    yaml="$yaml\n  \"${rubies[$index]}\": ${statuses[$index]}"
  done
  unset index array_start

  \command \mkdir -p log

  printf "%b" "$yaml" | tee -a log/summary.yaml

  return ${#errors[*]}
}

# Output the summary in a json format.
__rvm_json()
{
  \typeset index array_start

  json="{
\"totals\": { \"rubies\": ${#rubies[*]}, \"successes\": ${#successes[*]}, \"errors\": ${#errors[*]} },
\"successful\": [$(echo \"${successes[*]}\" | __rvm_sed 's# #", "#g' | __rvm_sed 's#\"\"##')],
\"errors\": [$(echo \"${errors[*]}\" | __rvm_sed 's# #", "#g' | __rvm_sed 's#\"\"##')],
\"rubies\": { "

  total=${#rubies[*]}
  [[ -z "${ZSH_VERSION:-}" ]] ; array_start=$?

  for (( index = $array_start ; index < $total + $array_start ; index++ )) ; do
    if [[ ${rvm_debug_flag:-0} -gt 0 ]] ; then
      rvm_debug "${rubies[$index]}: ${statuses[$index]}"
    fi
    json="$json\n    {\"${rubies[$index]}\": ${statuses[$index]}}"
    if (( $index + 1 < $total + $array_start )) ; then json="$json,  " ; fi
  done

  json="$json\n  }\n}"

  if [[ ! -d log ]] ; then
    mkdir -p log
  fi
  printf "%b" "$json" | tee -a log/summary.json

  return ${#errors[*]}
}

# Loop over a set or all rvm installed rubies to perform some action.
# Record the results and report based on CLI selections.

rubies=() ; successes=() ; errors=() ; statuses=()

args=( "$@" )
action="${args[$__array_start]}"
unset args[$__array_start]
args=( "${args[@]}" )

if [[ -z "$action" ]]
then
  rvm_error "Action must be specified."
  exit 1
elif [[ "$action" != "do" ]]
then
  rvm_error "Only 'do' action is allowed."
  exit 1
fi

# deprecated 2011.10.22 for RVM 1.9.0, removed 2012.09.13 for RVM 1.16.0
if [[ -z "${rvm_ruby_strings}" ]]
then
  rvm_error "\`rvm do ${args[@]}\` was removed, use \`rvm 1.9.2,1.9.3 do ${args[@]}\` or \`rvm all do ${args[@]}\` instead."
  exit 1
fi

previous_rvm_ruby_strings="$rvm_ruby_strings"
rvm_ruby_strings=( $( __rvm_expand_ruby_string "$rvm_ruby_strings" ) ) || {
  \typeset result=$?
  if
    [[ $result -eq 2 && -n "${rvm_expected_gemset_name:-${rvm_gemset_name:-}}" ]]
  then
    rvm_ruby_string="${previous_rvm_ruby_strings## }"
    __rvm_ruby_string
    rvm_error "Gemset '${rvm_expected_gemset_name:-${rvm_gemset_name:-}}' does not exist, \
'rvm $rvm_ruby_string do rvm gemset create ${rvm_expected_gemset_name:-${rvm_gemset_name:-}}' first, or append '--create'."
  else
    rvm_ruby_string="${previous_rvm_ruby_strings## }"
    __rvm_ruby_string
    rvm_error "Ruby ${rvm_ruby_string} is not installed."
  fi
  exit $result
}
unset previous_rvm_ruby_strings

__rvm_attempt_single_exec

for current_set_ruby in ${rvm_ruby_strings[@]}
do
  __rvm_ruby_do
done

if [[ -n "$rvm_summary_flag" ]] ; then __rvm_summary ; fi
if [[ -n "$rvm_yaml_flag" ]]    ; then __rvm_yaml    ; fi
if [[ -n "$rvm_json_flag" ]]    ; then __rvm_json    ; fi

rvm_hook="after_do" ; source "$rvm_scripts_path/hook"

exit ${#errors[*]}
src/rvm/scripts/list000077500000015314147511530550010543 0ustar00#!/usr/bin/env bash

rvm_base_except="selector"

source "$rvm_scripts_path/base"
source "$rvm_scripts_path/functions/list"

__rvm_list_remote()
{
  \typeset version
  rubies=($(
    __list_remote_all |
      __rvm_sed -e 's/.tar.*$//' -e 's/jruby-bin-/jruby-/' |
      __rvm_awk -F/ '{print $NF}' |
      \command \sort -u
  ))

  if
    (( ${#rubies[@]} == 0 ))
  then
    rvm_error "
# No remote rubies available
# Check 'rvm list known' for what can be installed.
"
    return 1
  fi

  printf "%b" "\n# Remote rubies available:\n\n"

  for version in "${rubies[@]}"
  do
    if [[ -r "$rvm_rubies_path/$version/bin/ruby" ]]
    then rvm_log " * $version"
    else rvm_log "   $version"
    fi
  done

  rvm_log "\n<comment># * - installed already</comment>\n"
  rvm_log "<comment># To download and install:</comment> <code>rvm install {name} --binary</code>\n\n"
}

__rvm_list_detect_arch()
{
  if
    [[ -d "$rvm_gems_path/${__version}" && ! -d "$rvm_rubies_path/${__version%%@*}" ]]
  then
    __arch="ruby not installed"
  elif
    [[ ! -x "$rvm_rubies_path/${__version%%@*}/bin/ruby" ]]
  then
    __arch="missing bin/ruby"
  elif
    [[ -f "$rvm_rubies_path/${__version%%@*}/config" ]]
  then
    __arch="$(
      __rvm_awk -F= "\$1==\"target_cpu\" {gsub(/[\"']/,\"\"); print \$2}" < \
        $rvm_rubies_path/${__version%%@*}/config
    )" #'
  else
    __arch="$( __rvm_ruby_config_get "target_cpu" "$rvm_rubies_path/${__version%%@*}/bin/ruby" )"
  fi
  if
    [[ -z "${__arch}" ]]
  then
    case "${__version}" in
      (maglev-*|macruby-*) __arch="x86_64" ;;
      (mruby|mruby-*)      __arch="x86_64" ;;
      (*)                  __arch="broken" ;;
    esac
  fi
}

__rvm_list_show_version_with_arch()
{
  \typeset __arch __prefix __version __suffix
  __prefix="$1"
  __version="$2"
  __suffix="${3:-}"

  __rvm_list_detect_arch

  if rvm_pretty_print stdout
  then __version="${rvm_notify_clr:-}${__version}${rvm_reset_clr:-}"
  fi
  printf "%b" "${__prefix}${__version} [ ${__arch} ]${__suffix}"
}

__rvm_list_gemsets()
{
  \typeset all_rubies version versions ruby_version_name current_ruby selected system_ruby system_version string binary prefix

  if [[ "${1:-""}" == "strings" ]]
  then
    __rvm_list_gemset_strings
    return 0
  fi

  current_ruby="$(__rvm_env_string)"

  all_rubies="$(__rvm_list_strings | sort)"

  printf "%b" "\nrvm gemsets\n"

  versions=($(
    __rvm_cd "${rvm_gems_path:-"$rvm_path/gems"}/"
    __rvm_find . -maxdepth 1 -mindepth 1 -print 2> /dev/null |
      __rvm_awk '/[a-z]*-.*/ {print $NF}' | sort
  ))

  for version in "${versions[@]//.\/}"
  do
    ruby_version_name="$(echo "$version" | __rvm_awk -F"${rvm_gemset_separator:-"@"}" '{print $1}')"

    if [[ "$all_rubies" != *"$ruby_version_name"* ]]
    then continue
    fi
    if [[ "$version" == "$current_ruby" ]]
    then prefix="=> "
    else prefix="   "
    fi
    __rvm_list_show_version_with_arch "\n${prefix}" "$version"
  done

  if [[ -f "$rvm_path/config/default" && -s "$rvm_path/config/default" ]]
  then
    version=$(
      __rvm_grep 'MY_RUBY_HOME' "$rvm_path/config/default" |
        \command \head -1 | __rvm_awk -F"'" '{print $2}' | __rvm_xargs basename --
    )
    if
      [[ -n "$version" ]]
    then
      printf "%b" "\nDefault Ruby (for new shells)\n"
      __rvm_list_show_version_with_arch "\n  " "$version" "\n"
    fi
  fi
  printf "%b" "\n\n"
  return 0
}

__rvm_list_default()
{
  \typeset version string
  if
    [[ "$1" == "string" ]]
  then
    "$rvm_scripts_path/alias" show default 2>/dev/null |
      __rvm_awk -F"${rvm_gemset_separator:-"@"}" '{print $1}' |
      __rvm_xargs basename --
  else
    if
      [[ -L "$rvm_rubies_path/default" ]]
    then
      version=$(
      "$rvm_scripts_path/alias" show default 2>/dev/null |
        __rvm_awk -F"${rvm_gemset_separator:-"@"}" '{print $1}' |
        __rvm_xargs basename --
      )
      if
        [[ -n "$version" ]]
      then
        printf "%b" "\nDefault Ruby (for new shells)\n"
        __rvm_list_show_version_with_arch "\n   " "$version" "\n"
      fi
    fi
  fi
  printf "%b" "\n"
  return 0
}

__rvm_list_ruby_svn_tags()
{
  \typeset -a tags
  \typeset prefix tag

  __rvm_read_lines tags <(
    svn list http://svn.ruby-lang.org/repos/ruby/tags/ | __rvm_awk '/^v1_[8|9]/{print}'
  )

  for tag in "${tags[@]}"
  do
    prefix="$(
      echo ${tag/\//} |
      __rvm_sed 's#^v1_##' |
      __rvm_awk -F'_' '{print "(ruby-)1."$1"."$2}' |
      __rvm_sed 's#p$##'
    )"
    echo "${prefix}-t${tag/\//}"
  done

  return 0
}

__rvm_list_known()
{
  if [[ "${1:-""}" == "strings" ]]
  then
    __rvm_list_known_strings
    return 0
  fi

  if [[ -t 0 ]]
  then
    __rvm_pager_or_cat_v "$rvm_path/config/known"
  else
    \command \cat "$rvm_path/config/known"
  fi

  return $?
}

__rvm_list_rubies()
{
  \typeset current_ruby rubies version selected system_ruby system_version \
    default_ruby string binary prefix

  if [[ "${1:-""}" == "strings" ]]
  then
    __rvm_list_strings
    return 0
  fi

  current_ruby="$( __rvm_env_string )"
  current_ruby="${current_ruby%${rvm_gemset_separator:-"@"}*}"

  default_ruby="$( "$rvm_scripts_path/alias" show default 2>/dev/null )"
  default_ruby="${default_ruby%${rvm_gemset_separator:-"@"}*}"

  rubies=($(
    __rvm_cd "$rvm_rubies_path/"
    __rvm_find . -maxdepth 1 -mindepth 1 -type d 2> /dev/null | sort
  ))

  for version in "${rubies[@]//.\/}"
  do
    if
      [[ "$version" == "$current_ruby" && "$version" == "$default_ruby" ]]
    then
      prefix="=* "
    elif
      [[ "$version" == "$current_ruby" ]]
    then
      prefix="=> "
    elif
      [[ "$version" == "$default_ruby" ]]
    then
      prefix=" * "
    else
      prefix="   "
    fi
    __rvm_list_show_version_with_arch "${prefix}" "$version" "\n"
  done

  if (( ${#rubies[@]} == 0 ))
  then
    printf "%b" "
# No rvm rubies installed yet. Try 'rvm help install'.
"
  else
    if [[ -z "${default_ruby}" ]]
    then
      printf "%b" "
# Default ruby not set. Try 'rvm alias create default <ruby>'.
"
    fi
    printf "%b" "
# => - current
# =* - current && default
#  * - default
"
  fi

  printf "%b" "\n"

  return 0
}

# List all rvm installed rubies, default ruby and system ruby.
# Display the rubies, indicate their architecture and indicate which is currently used.
# This is not meant to be used with scripting. This is for interactive mode usage only.
__rvm_list()
{
  \typeset action="${1:-rubies}"
  shift

  case "${action}" in
    -r|--remote|remote)
       __rvm_list_remote "$@"
       ;;
    known|known_strings|gemsets|default|rubies|strings|ruby_svn_tags)
      __rvm_list_${action} "$@"
      ;;
    help)
      rvm_help list "${action}" "$@"
      ;;
    *)
      rvm_error_help "Unknown action '$action' for 'rvm list'." list "${action}" "$@"
      return 1
      ;;
  esac
}

__rvm_list "$@"
src/rvm/docs/color.md000066400000002442147511530550010541 0ustar00RVM will automatically use colors when it is possible.

To overwrite use command line parameter --color=no or --color=force.

It is also possible to set it with variable in ~/.rvmrc:

    rvm_pretty_print_flag=[no|auto|force]


To change default colors use following variables in ~/.rvmrc:

    rvm_error_color=red
    rvm_warn_color=yellow
    rvm_debug_color=magenta
    rvm_notify_color=green
    rvm_code_color=blue
    rvm_comment_color=iblack

Available colors are:

    black red green yellow blue magenta cyan white default

You can add emphasis to the color using bold/offbold.

It is also possible to change background color:

    bblack bred bgreen byellow bblue bmagenta bcyan bwhite bdefault

On some terminals like xterm ( echo $TERM ) the bold and background colors give the same effect.

Use commas to put multiple definitions in one color.  You can mix color, bold and background in one definition.
Specifying multiple colors/bold/background definitions will use last defined.

Using bold in one definition requires resetting it in others with offbold.

Using background in one definition requires resetting it in others with bdefault.

Example:

    $ cat ~/.rvmrc
    rvm_error_color=bold,red
    rvm_warn_color=bold,yellow
    rvm_debug_color=offbold,magenta
    rvm_notify_color=offbold,green
src/rvm/docs/gpg.md000066400000000712147511530550010176 0ustar00# GPG

1. [Creating GPG Keys](https://alexcabal.com/creating-the-perfect-gpg-keypair/)

2. Add public key to rvm-site repo

    `gpg --armor --export developer_name > developer_name.asc`

2. [Extending key expiration date](https://www.g-loaded.eu/2010/11/01/change-expiration-date-gpg-key/)

3. Signing installer

    `gpg --armor --detach-sign --yes binscripts/rvm-installer`

4. Signing release (follow on screen instructions)

    `bash sign-releases.sh`
src/rvm/docs/release-procedure.md000066400000002200147511530550013021 0ustar00# Release procedure

## Preconditions

Add `bitbucket` remote:

```bash
git remote add bitbucket git@bitbucket.org:mpapis/rvm.git
```

## Procedure

1. Merge `master` to `stable`

```bash
git checkout master
git pull
git checkout stable
git pull
git merge master
```

2. Increase [VERSION](../VERSION) number and remove `-next`
3. Update [CHANGELOG](../CHANGELOG.md) with release date and links to changes (do not add new `Next` section yet)
4. Commit changes

```bash
git commit -m "Release 1.29.6"
```

5. Tag stable with version

```bash
git tag 1.29.6
```

6. Merge `stable` to `master`

```bash
git checkout master
git merge stable
```

5. Push to github and bitbucket

```bash
git push origin master stable
git push origin --tags

git push bitbucket master stable
git push bitbucket --tags
```

7. Sign release and upload files to GitHub and BitBucket

```bash
bash ./sign-releases.sh
```

8. Close milestone in github
9. Publish blog entry on http://rvm.io
10. Publish info on twitter
11. Prepare for the next release on `master` branch
    * add `-next` to the [VERSION](../VERSION)
    * add new `Next` section to [CHANGELOG](../CHANGELOG.md)
src/rvm/docs/alt.md000066400000003501147511530550010200 0ustar00# RVM is not the only Ruby enVironment Manager

Other implementations allowing you to switch your Ruby environment:

- https://github.com/postmodern/chruby (Shell)
- https://github.com/TomFreudenberg/rvm-mini (Shell)
- https://github.com/vertiginous/pik (Windows)
- https://github.com/kwatch/versionswitcher (Python)
- https://bitbucket.org/jonforums/uru (Go)
- https://github.com/jayferd/ry (Shell)
- https://github.com/terlar/fry (Fish)
- https://github.com/niw/rubies (Shell)
- https://github.com/nkryptic/sandbox (Ruby)
- https://github.com/regularfry/gemenv (Ruby)
- https://github.com/sstephenson/rbenv (Shell)
- https://github.com/HashNuke/asdf-ruby (Shell)
- https://github.com/cpetschnig/switch-ruby (Ruby)
- https://github.com/uninets/p5-Ruby-VersionManager (Perl)
- https://github.com/seattlerb/zentest (Ruby)
- http://www.dribin.org/dave/blog/archives/2006/01/07/rails_encap/ (Tutorial)
- http://www.mjwall.com/2008/08/multiple-versions-of-ruby-with-stow/ (Tutorial)
- https://github.com/hmans/rbfu (Deprecated)
- https://github.com/wilmoore/ruby-version (Deprecated)

# RVM is not the only Ruby Version Manager

Other implementations allowing to install new Ruby versions:

- you can use your system to install ruby,
  most distributions come with ruby 1.8 already installed
- https://github.com/postmodern/ruby-install (Shell)
- https://github.com/TomFreudenberg/rvm-mini (Shell)
- https://github.com/vertiginous/pik (Windows)
- https://github.com/kwatch/versionswitcher (Python)
- https://github.com/jayferd/ry (Shell)
- https://github.com/sstephenson/ruby-build (Shell)
- https://github.com/HashNuke/asdf-ruby (Shell)
- https://github.com/uninets/p5-Ruby-VersionManager (Perl)

# RVM IDE support

RVM is supported by the following IDE products:

- [RubyMine](http://www.jetbrains.com/ruby/)
- Vim [rvm.vim](https://github.com/tpope/vim-rvm)
src/rvm/docs/upgrade-notes.md000066400000006431147511530550012202 0ustar00  * If you wish to disable the project .rvmrc file functionality, set
    rvm_project_rvmrc=0 in either /etc/rvmrc or ~/.rvmrc.
    then log out and back in.

  * after_use and after_cd hook now supports multiple files with after_*_*
    the custom hooks can be easily turned on/off by:
      chmod +x $rvm_path/hooks/after_cd_[hook_name]
      chmod -x $rvm_path/hooks/after_use_[hook_name]

  * If your shell exits on entering a directory with freshly checked out sources
    you should update .rvmrc file, and replace any `exit ` with `return `.

  * In case you have some old RVM files/rubies in '/usr/local/bin' or '$HOME/bin' feel free to remove them,
    they were copied there because of bug in path detection.

  * Zsh 4.3.15 is buggy, be careful with it, it can break RVM, especially multiuser installations,
    You should consider downgrading Zsh to 4.3.12 which has proven to work more reliable with RVM.

  * Optionally you can run \`rvm tools rvm-env ruby bash\` which will generate
    shebang wrappers for easier selecting ruby in scripts.

  * If you wish to get more default(global) gems installed, install RVM with this flag: --with-gems="pry vagrant"
    this option is remembered, it's enough to use it once.

  * Binary rubies are installed by default if available, you can read about it in help:
      rvm help install
      rvm help mount

  * RVM comes with a set of default gems including 'bundler', 'rake', 'rubygems-bundler' and 'rvm' gems;
    if you do not wish to get these gems, install RVM with this flag: --without-gems="rvm rubygems-bundler"
    this option is remembered, it's enough to use it once.

  * RVM will try to automatically use available package manager, might require `sudo`,
    read more about it in `rvm help autolibs`

  * The default umask for multi-user installation got extended to `umask u=rwx,g=rwx,o=rx`,
    comment it out to avoid automatic updates.

  * If you encounter any issues with a ruby 'X' your best bet is to:
      rvm get head && rvm reinstall X --debug

  * RVM will run 'rvm requirements' by default, to disable run:
      echo rvm_autolibs_flag=0 >> ~/.rvmrc

  * RVM 1.20.12 removes the automated --progress-bar from curl options,
    if you liked this then you can restore this behavior with:

      echo progress-bar >> ~/.curlrc

  * RVM will set first installed ruby as default and use it if run as function.
    To avoid this behavior either use full path to rvm binary or prefix it with `command `.

  * To update RVM loading code run 'rvm get ... --auto-dotfiles'

  * RVM 1.20 changes default behavior of Autolibs to Enabled - if you prefer the 1.19 behavior
    then run "rvm autolibs read-fail", read more details: rvm help autolibs

  * RVM 1.24 changes default package manager on OSX to Homebrew,
    use `rvm autolibs macports` if you prefer Macports.

  * RVM 1.24 changes default `--verify-downloads` flag to `1` you can get the paranoid mode again with:

      echo rvm_verify_downloads_flag=0 >> ~/.rvmrc

  * RVM 1.25 disables default pollution of rvm_path/bin, you still can generate the links using:

      rvm wrapper ruby-name           # or for default:
      rvm wrapper default --no-prefix

  * RVM 1.25.11 'rvm remove' will by default remove gems, to remove only ruby use 'rvm uninstall'

  * RVM 1.30 simplifies behavior of 'rvm wrapper' subcommand
src/rvm/binscripts/rvm-installer.asc000066400000001501147511530550013613 0ustar00-----BEGIN PGP SIGNATURE-----

iQIzBAABCAAdFiEEfSuvHPN7E+IGnWlWEFvQ5zlJm9sFAl03g1EACgkQEFvQ5zlJ
m9uBUxAAzVpuznkfRKSVcKVCIVi84mcNg4+Ju31ToFXAYxjNiPfWQcB5LOwrK+o+
IiWACs4rQ2W725Mv+xKat9k0Ex7HMFDHJiAoj/SQd0NYJkrNArsl9sMoV4E2QRPY
iQK2yVfyEnM+pQcMYLG2YwfYgJNGZO5GfEBVMIlZe59xi9GGMMpVNuZzQPLEDLko
Tu4MwwjuOeJezT9vWYCy8kOb7yip1STrQrNXdXPpZRjC8zumFpeFTjjCUrUaqVup
ejl9GHAgFBK7vs2SH6yyonwwbJjgvFNGz0hUieHZsokMLnYpSq9FTohCTTLFeIED
z7XYcX6LvYoyjnq/OoITx58uAjaG/FAqgV9mDZBMYVU1ndUVRnu01YjaNfzFFisU
V4QLnnsTrpihMkcBnUZFcNMXeUCbGRBdKyouMyDZN1pS6OZfZwrT9F/rhaIuBnUu
KSBNng8ER+3ITA+tG9mRj7dJnH3lsVWFwjwMFtTjGcgYPktHt5OoSbEn8LGN6oIN
SwufLKW2VbPQyZZ3Yafmrbgmy34k14+RU09D3AYvPr3f6cX4nG6oA7YXSGsrhS6C
aFb9XzTUWnotB0BaeaC6Jwe8Bi496BQyCmLrvX/aLpzV2fZXtz7puyJACOPv02JI
xY4zM9PCgTozc/NLuRNGLDj/iPfyN6fm0ey7wljPJpeZgg0asZ0=
=Sr0u
-----END PGP SIGNATURE-----
src/rvm/examples/rvmrc000066400000005200147511530550011036 0ustar00# Example ~/.rvmrc file.
#
# This file shows some examples of setting defaults to your own tastes.
#
# If you wish to adjust the default ruby interpreter/version/patchlevel
# settings they can be found in the $rvm_path/config/db file.
# Beware that currently that file is overwritten on install so
# back it up if you change anything.

# RVM path
#   This is where rvm installs and manages everything in by default.
#
# export rvm_path="$HOME/.rvm"

# Source path
#   This is where rvm extracts to for compiling & installing.
#
# export rvm_source_path="${rvm_path}/src"

# Log path
#   This is where rvm logs all of it's actions to
#   (not including the 'do' actions)
#
# export rvm_log_path="${rvm_path}/log"

# Bin path
#   This is where rvm places all of it's executable/wrapper scripts.
#
# export rvm_bin_path="${rvm_path}/bin"

# Gem path
#   This is where rvm installs all gems to for each ruby
#   interpreter/version%gemset
#
# export rvm_gems_path="$rvm_path/gems"

# Gem options
#   These options are passed to the 'gem' command in a RVM environment.
#
# export rvm_gem_options="--no-rdoc --no-ri"

# Temp path
#   This is where rvm stores all of its temporary files.
#
# export rvm_tmp_path="${rvm_tmp_path:-"$rvm_path/tmp"}"

# Install on use
#   Install rubies when used if are not installed.
#
# export rvm_install_on_use_flag=1

# Gemset create on use
#   This will create a gemset when the gemset is used if it does not exist
#
# export rvm_gemset_create_on_use_flag=1

# Make flags
#   I have 8 cpu's so I might use 7 make threads:
#
# export rvm_make_flags="-j7"

# Source a .rvmrc file in a directory after changing to it, if it exists.
# To disable this feature, set in root/home .rvmrc file:
#
# export rvm_project_rvmrc=0
#
# Or don't even bother sourcing rvm, it *is* optional. Always has been, you can
# instead add $rvm_path/bin to your PATH and use --default to switch...

# Automatically trust project .rvmrc files
#
# export rvm_trust_rvmrcs_flag=1

# Always trust an rvmrc, even if it's contents change.
#   CAUTION: Can be dangerous / security risk. Only use this feature if you know
#          what you are doing / accept the implications :)
#
# export rvm_always_trust_rvmrc_flag

# Specify RBXOPT enviroment settings that should always be set when calling
# Rubinius scripts. For example, to always run the agent when running from
# an Rubinius environment, set the value to '-Xagent'
#
# export rvm_rbx_opt

# Disable automatic system configuration of RVM via /etc/profile.d/rvm.sh:
#
# export rvm_etc_profile_flag=0

# Add configure flags for builds
#
# export rvm_configure_flags="--with-openssl-dir=$rvm_path/usr --with-readline-dir=$rvm_path/usr"
src/rvm/update-truffleruby.rb000066400000002417147511530550012331 0ustar00require "digest"

raise "Usage: #{$0} VERSION RELEASE_DIRECTORY" unless ARGV.size == 2

version, release_directory = ARGV

def replace_line(file, pattern, replacement)
  lines = File.readlines(file)
  i = lines.index { |line| pattern =~ line }
  lines[i] = replacement
  File.write(file, lines.join)
end

def insert_after(file, pattern, new_lines, last: true)
  lines = File.readlines(file)
  search = last ? :rindex : :index
  i = lines.send(search) { |line| pattern =~ line }
  lines.insert(i+1, *new_lines)
  File.write(file, lines.join)
end

replace_line "config/db", /truffleruby_version=/, "truffleruby_version=#{version}\n"
replace_line "config/known", /truffleruby\[/, "truffleruby[-#{version}]\n"

insert_after "config/known_strings", /^truffleruby/, ["truffleruby-#{version}\n"]

%w[md5 sha512].each { |algorithm|
  digests = %w[linux-amd64 macos-amd64].map { |platform|
    basename = "truffleruby-#{version}-#{platform}.tar.gz"
    archive = "#{release_directory}/#{basename}"
    digest = Digest(algorithm.upcase).file(archive).hexdigest
    "#{basename}=#{digest}\n"
  }
  insert_after "config/#{algorithm}", /^truffleruby/, digests
}

changelog_entry = ["* Add support for TruffleRuby #{version}\n"]
insert_after "CHANGELOG.md", /# New interpreters/, changelog_entry, last: false
src/rvm/contrib/ps1_functions000066400000010231147511530550012322 0ustar00#!/usr/bin/env bash

#
# Opt-in for custom prompt through by setting:
#     rvm_ps1=1
# in either /etc/rvmrc or $HOME/.rvmrc
#
# Then in order to set your prompt you simply do the following for example
#
# Examples:
#
#   ps1_set --prompt ∫
#
#   or
#
#   ps1_set --prompt ∴
#
# This will yield a prompt like the following, for example,
#
# 00:00:50 wayneeseguin@GeniusAir:~/projects/db0/rvm/rvm  (git:master:156d0b4)  ruby-1.8.7-p334@rvm
# ∴
#
ps1_titlebar()
{
  case $TERM in
    (xterm*|rxvt*)
      printf "%s" "\033]0;\\u@\\h: \W\\007"
      ;;
  esac
}

ps1_identity()
{
  if (( $UID == 0 )) ; then
    printf "%s" "\[\033[31m\]\\u\[\033[0m\]@\[\033[36m\]\\h\[\033[35m\]:\w\[\033[0m\] "
  else
    printf "%s" "\[\033[32m\]\\u\[\033[0m\]@\[\033[36m\]\\h\[\033[35m\]:\w\[\033[0m\] "
  fi
}

ps1_git()
{
  local branch="" sha1="" line="" attr="" color=0

  shopt -s extglob # Important, for our nice matchers :)

  command -v git >/dev/null 2>&1 || {
    printf " \033[1;37m\033[41m[git not found]\033[m "
    return 0
  }

  branch=$(git symbolic-ref -q HEAD 2>/dev/null) || return 0 # Not in git repo.
  branch=${branch##refs/heads/}

  # Now we display the branch.
  sha1=$(git rev-parse --short --quiet HEAD)

  case "${branch:-"(no branch)"}" in
   production|prod) attr="1;37m\033[" ; color=41 ;; # red
   master|deploy)   color=31                     ;; # red
   stage|staging)   color=33                     ;; # yellow
   dev|develop|development) color=34             ;; # blue
   next)            color=36                     ;; # gray
   *)
     if [[ -n "${branch}" ]] ; then # Feature Branch :)
       color=32 # green
     else
       color=0 # reset
     fi
     ;;
  esac

  [[ $color -gt 0 ]] &&
    printf "\[\033[${attr}${color}m\](git:${branch}$(ps1_git_status):$sha1)\[\033[0m\] "
}

ps1_git_status()
{
  local git_status="$(git status 2>/dev/null)"

  [[ "${git_status}" = *deleted* ]]                    && printf "%s" "-"
  [[ "${git_status}" = *Untracked[[:space:]]files:* ]] && printf "%s" "+"
  [[ "${git_status}" = *modified:* ]]                  && printf "%s" "*"
}

ps1_rvm()
{
  command -v rvm-prompt >/dev/null 2>&1 && printf "%s" " $(rvm-prompt) "
}

ps1_update()
{
  local prompt_char='$' separator="\n" notime=0

  (( $UID == 0 )) && prompt_char='#'

  while [[ $# -gt 0 ]] ; do
    local token="$1" ; shift

    case "$token" in
      --trace)
        export PS4="+ \${BASH_SOURCE##\${rvm_path:-}} : \${FUNCNAME[0]:+\${FUNCNAME[0]}()}  \${LINENO} > "
        set -o xtrace
        ;;
      --prompt)
        prompt_char="$1"
        shift
        ;;
      --noseparator)
        separator=""
        ;;
      --separator)
        separator="$1"
        shift
        ;;
      --notime)
        notime=1
        ;;
      *)
        true # Ignore everything else.
        ;;
    esac
  done

  if (( notime > 0 )) ; then
    PS1="$(ps1_titlebar)$(ps1_identity)$(ps1_git)$(ps1_rvm)${separator}${prompt_char} "
  else
    PS1="$(ps1_titlebar)\D{%H:%M:%S} $(ps1_identity)$(ps1_git)$(ps1_rvm)${separator}${prompt_char} "
  fi
}

ps2_set()
{
  PS2="  \[\033[0;40m\]\[\033[0;33m\]> \[\033[1;37m\]\[\033[1m\]"
}

ps4_set()
{
  export PS4="+ \${BASH_SOURCE##\${rvm_path:-}} : \${FUNCNAME[0]:+\${FUNCNAME[0]}()}  \${LINENO} > "
}

# WARNING:  This clobbers your PROMPT_COMMAND so if you need to write your own, call
#           ps1_update within your PROMPT_COMMAND with the same arguments you pass
#           to ps1_set
#
# The PROMPT_COMMAND is used to help the prompt work if the separator is not a new line.
# In the event that the separator is not a new line, the prompt line may become distorted if
# you add or delete a certian number of characters, making the string wider than the
# $COLUMNS + len(your_input_line).
#
# This orginally was done with callbacks within the PS1 to add in things like the git
# commit, but this results in the PS1 being of an unknown width which results in the prompt
# being distorted if you add or remove a certain number of characters. To work around this
# it now uses the PROMPT_COMMAND callback to re-set the PS1 with a known width of chracters
# each time a new command is entered. See PROMPT_COMMAND for more details.
#
ps1_set()
{
  PROMPT_COMMAND="ps1_update $@"
}
src/rvm/contrib/hudson/rvmRubyMetrics-1.0-SNAPSHOT-20100819.hpi000066400001603355147511530550017256 0ustar00PK
��=	META-INF/PK
��=@��META-INF/MANIFEST.MF�P�N�0�[�?��*h}K� R"R�"7Y����{��@+�8�4;;�3���,�70V5Z��(�LV���T�u�}-(�5 r>�	�2+�ŲM�ܩ
G�:�f�1���^��Pr�EЃ6_�3]��ֻШ�R�P�ԠQ�@Z)��g���2J��󊒴l�����Ⱒ��T�����Ba��^��~:��K����T���+T�:����֨���S?���A�`&&>VtN�b/~t~ξU����X��烱��Sr�47%�PK
��=css/PK
��=images/PK
��=
images/24x24/PK
��=js/PK
��=WEB-INF/PK
��=WEB-INF/classes/PK
��=WEB-INF/classes/hudson/PK
��=WEB-INF/classes/hudson/plugins/PK
��=.WEB-INF/classes/hudson/plugins/rvmRubyMetrics/PK
��=3WEB-INF/classes/hudson/plugins/rvmRubyMetrics/flog/PK
��=CWEB-INF/classes/hudson/plugins/rvmRubyMetrics/flog/FlogBuildAction/PK
��=EWEB-INF/classes/hudson/plugins/rvmRubyMetrics/flog/FlogProjectAction/PK
��=AWEB-INF/classes/hudson/plugins/rvmRubyMetrics/flog/FlogPublisher/PK
��=9WEB-INF/classes/hudson/plugins/rvmRubyMetrics/flog/model/PK
��=9WEB-INF/classes/hudson/plugins/rvmRubyMetrics/railsNotes/PK
��=?WEB-INF/classes/hudson/plugins/rvmRubyMetrics/railsNotes/model/PK
��=OWEB-INF/classes/hudson/plugins/rvmRubyMetrics/railsNotes/RailsNotesBuildAction/PK
��=QWEB-INF/classes/hudson/plugins/rvmRubyMetrics/railsNotes/RailsNotesProjectAction/PK
��=MWEB-INF/classes/hudson/plugins/rvmRubyMetrics/railsNotes/RailsNotesPublisher/PK
��=9WEB-INF/classes/hudson/plugins/rvmRubyMetrics/railsStats/PK
��=?WEB-INF/classes/hudson/plugins/rvmRubyMetrics/railsStats/model/PK
��=OWEB-INF/classes/hudson/plugins/rvmRubyMetrics/railsStats/RailsStatsBuildAction/PK
��=QWEB-INF/classes/hudson/plugins/rvmRubyMetrics/railsStats/RailsStatsProjectAction/PK
��=MWEB-INF/classes/hudson/plugins/rvmRubyMetrics/railsStats/RailsStatsPublisher/PK
��=3WEB-INF/classes/hudson/plugins/rvmRubyMetrics/rcov/PK
��=9WEB-INF/classes/hudson/plugins/rvmRubyMetrics/rcov/model/PK
��=HWEB-INF/classes/hudson/plugins/rvmRubyMetrics/rcov/model/RcovFileDetail/PK
��=CWEB-INF/classes/hudson/plugins/rvmRubyMetrics/rcov/RcovBuildAction/PK
��=EWEB-INF/classes/hudson/plugins/rvmRubyMetrics/rcov/RcovProjectAction/PK
��=AWEB-INF/classes/hudson/plugins/rvmRubyMetrics/rcov/RcovPublisher/PK
��=6WEB-INF/classes/hudson/plugins/rvmRubyMetrics/saikuro/PK
��=<WEB-INF/classes/hudson/plugins/rvmRubyMetrics/saikuro/model/PK
��=NWEB-INF/classes/hudson/plugins/rvmRubyMetrics/saikuro/model/SaikuroFileDetail/PK
��=IWEB-INF/classes/hudson/plugins/rvmRubyMetrics/saikuro/SaikuroBuildAction/PK
��=KWEB-INF/classes/hudson/plugins/rvmRubyMetrics/saikuro/SaikuroProjectAction/PK
��=GWEB-INF/classes/hudson/plugins/rvmRubyMetrics/saikuro/SaikuroPublisher/PK
��=3WEB-INF/classes/hudson/plugins/rvmRubyMetrics/tags/PK
��=WEB-INF/classes/META-INF/PK
��=%WEB-INF/classes/META-INF/annotations/PK
��=WEB-INF/lib/PK
��=���q�t
css/style.css�WQ��6~n~���I�	r�lv�٧�Ԫ}�T��������ٴ�~c;@��[6��7��3�'MͪU�dӄ
�P]�A2Y����D�����m�x��3
�:�JŴ�ՎT��	c4MX�ϕ<V<Le)�n���nj=�Tz�_	gM�,��5����Fp���q.�|G�jc_�PY)O;RΡ2��sk��y�™�^���$K����h�	HQ�Q�:梩Kvޑ���~�=�Ƞ����2Pj�ӣEy�S5�jkQ�eu�R�⳴�a"�Tx��^��`���f�Ћ��E��&Rkyؑ-�T#K�q
sS�x�����(2v%R@�*�+R@�Z����I�A
��a��Kk��S���ۢ�$��?����3�b�2�݌�ը�V� �x�hm�r
�kAZ~���H�֯���G�YPi�Dy��"	h��Y"J����^Y��~'?ᴅf	�VD����*�-4_���W�|(>����hmS���UK�J4��"	��� h�x�jP)�5W�.�@c����rK�e��n=�����0��lv�)����mi/�U^�J3J�NW�!��H_~}����PPK�͒z�ie�R!X�%�ܕ���ׅq�	��.�?~��{�B�e�{����=�yp���Ҽ�J�J�����A͸�f=G�S�e)��g�{M�d5�ds8�.E���[����t	�f��)(��I3Bzo�݌��8�\sBl����oDd��,�a��N�<���z%q�W�ZA@� �KzIt�k��oB7��@�EA ���!�J�w�����gyTw���"�:,�/O���lGؕ�jm��W֫��w}Sb�N�k�	���C�⹗$����A�m��R#^�����p�m�|t]�[�C[Ž��T��1.Ϯ�ڡN�϶��c���<ڃ��`a�i��Ɂ'�� �>V?}*�[H	�8���}=Z�[)l�m:B�& n���0-����v^�놜��v`��G)s�R�9�צX�����1o���)5�}��̙��s=����!aO�WBb'���'�Fn[�o��]*!գ�0�)��0�⎞��8�q4�A�h�L}Z�G�ڵ��_��#oܯ��ȚO���=�d��ɉ&|`����i�PK
��=ϱ ��images/24x24/tab.png���PNG


IHDRH-�bKGD�������tIME��op�IDAT(����KTa���|�:sgq&
$7A."$ZHA��
m[Y1 �hc��6����� �
�*܄B�/��,*qP��̝�w�w�4ဆB��{�9���ȿ�C������c��Oݺ^\*L�o�vqw���������/��pvW>-?z^�0y 8����
�Yb#���[��n�߿�N�y�;V5&�끇U	�.M�a;*�����D2'##3��1�
���4>�L[X1���1���|�R�7c%9�mP��PB���ؚ���RУ�D�o������j��Uesk5w�BCBe��u:��Tq�r��l�]ۚ[x�>�?��� 
���W��d�ξ[���įy��aǍ�4�`�k��>�4�-�<��*�Gj<�~9H��XS��IEND�B`�
PK
��=D�JhQ;js/flog.accordion.js�R�N�0���D
~*
�@B������cG���B}wΎRT����K/:��zG��V+�
�pl�H��E6��RkF��
	[W�r�Ē)]�����E(�V�[��Z�Y��Ii���*'�
����@���ՠq3nF�|BA�<�'h??��z�f�Br�)J�h�BWd��2i��d
�y*�ڱ��TO��4��N"4+�5-�U�F�#��B���Xy���r����ُ���Hطª_��,�w'of�軃�pf}�|vq/�x�%�ë�0��'b��Z�\�z�;�m`\��:92�(��V�]Ō
o�5�?\��PK
��="�\urailsNotesHelp.html�
�0C�;Sx���1�E+P����������� Ԓ��8 �ai�� к��<��,}Jg��UF��P�&�<�&��ǟ��QM�v��oZp>PK
��=4e*�^urailsStatsHelp.html�A�0C�}O�pv]N�j"��8 nO�Z���6"eJ�r���_��
�ׅ-����I��aG��m�NB
ɝ��2o�ddm�{��\�����PK
��=���"��NWEB-INF/classes/hudson/plugins/rvmRubyMetrics/AbstractRailsTaskPublisher.class�V�WU��d�	�����
�V�Ѷ�4`���F�T�V'��Lf�,Pܷ.n�����	G9�G��<~���C{|�{���~w���������8��&<���&��ɸFo��x���|}'��!��{2�0rȇI��&c2�F������������0�x_�FFe8a���y\rFƬ����Nk]�)��Xf�lxE�tR�Li�8)�d�^nnԵu����QgԔ����*�$�9�M˞��%�&dWu��C���g��lU�	%>FX�yْ�M�W�i�
5gh�+�c���s�(�S�Ðn�1�p�I��9����U7��l���3�����l���'�(�\lS�ͺ# ��uG˻\w͓+��eUwj0>����
���浲�[&�6��SV�$�w�6�\��I�.1dj�%ʑQ�ꂧ��5^F��<��^Xet��L�q���8j��r��pp;|��Q���h�gWѷ��f�[�/c��T�$�Tϡ�iwi�\ݨ&���=���Z�m�j�fe_}G̕׺"�MC��Y��82�d|@�Ջ��z6!d�K��x�t�I>��6E-�$��
�oM���q����y�w"���ߠ~��
��P�s�Q�zl3i��G
��1+��R_�岂��9͒�eN�t}���C����B���J��8E�g���ծTLwb����،j腘�ݏ�Cϫ\=V�m���=�б�֋�h��{�O��c
����5�����=݇j:H�j����e����2����OP&j�:�R�:�g�'�Rp
��v�ݡ�:m���]5]Ͷ���jUZ��n��^�@���V�����N(�@˦�J�Qw.�W�ܠ*��p��7�[
&s��o��2l<C�,޻�l�R+j&��52��TmH�*�5�DW3�Zk/�4Iee��;�hN5�abs�u45ɑ�U,�}���IeΒ���nm@�O?��§�E{j�u,>&uӿ�Q���Ƨ���k\�>�h
�L��,����$K`��"|��E�}����'����1Z�����'q���I`@;�#�4c?Z%C�H'�
���Gb�]bbǝ�w�O��8Qu*E+�
p����K@+�Uh��
�����(����*ߧ��ց�
�'+=B2i� ��#��.��&#���IFv��,�
ɿ0�_�'	��j�Y�#J��$���N�4Dj��E4�H�|bC�E�x��OKZJD�{~����t *��{��%�F�E���*�Gk�@"��9���D��*�$>eH�:Ve+8��.�J�qx<XB,$)9�
V��D4@~��#���8�A�v-T�V����i�L��)/a�N�p����"#�l/qz�_-�8K�L�����<.����<9��.�2��R�]!n�Ԫ�1^��UQ{^��ȈjK��z���
��PK
��=C��
�RWEB-INF/classes/hudson/plugins/rvmRubyMetrics/AbstractRubyMetricsBuildAction.class�X|W�?[�Y�ىlj��)�r���v�:��(Ubc+nJ�Yz�/�u��)�ٲ
Z
�P(�6�Ĵr�@	�-eS�ޔUV��{w�aIvſ�������;=������7y��+}p�Un�x
^+�n�[%�΋��z	o�7��v�Q�����Z܉�ܷ���|D�m>���w��]>��n/ރ���>�������ć��b8!�'}��I|D�
�}b��0�����^܏3>|�b���
��(���)	��a>��f<��CxX�g=W4����"<"P?'��K��]����b$�ԅ/��+5�j
��5	_gpk�R\gX��
-���<�5L]���2j2���R)���a�,�]��[	�ӥ�Ts+Ê�lt[�\=t�0/������(ף�h� �-�$�]{�2�T�ak�j:�I�)#��̌��M]�y6E0�cw�T�	�<���t������B7$�9�󃪖1��I�WZ��T��FvtE;�����h��t�b*C��@�zyAЌ�&C��;%|���vE*yĂG�Q�d��)����b��p��"��J(���!�0�蜆�3���^Z��ĬSđ�v�Jz�!�hz"4���q2L%��:ѵ�A~}�f��8FZK�r`�ίgX;��H3��qr �B������䩸�ӑ��p����	�d���\1�e�[��u�Cq2e(F�	M?B4�0��I�2˶ݍ	z�]}��H[��o2�̙	C�Nx�a�p��XΘRH̖��"x�<A��'V�g�f��"�yT�	ݕNjf%d��:@aظ6��)!i�+
��W��hy�VU�a���_��p\�2��Y��"�u��CcJ�:��
��~;�=��9w��N����`A����U+��6�u��DU�}�y�;��4�.+�>�i͊�yt!�R}j��Q&(����@��=�m"ȸߒ�;e|�aX2��d|ߓ�}?�e�?�����뙤X	?��s��aQ�M��'�2Í2~�_��Bꄒ�Fh�+�$7���TB�op������{�A��'#�'��2��_d� ��8 ������)�_2���HxR�S���Y���Kfn摘$�教���tV'�z��<����(����R�.��Cc�~�Njߌ0��2[Ț%�Hf��_bKdv[*�el��V�a%
x^,�Ul5�E��K!kYFU��m���Ȱ�8'���e�$�^fX��N�CF

�I�H�0%cS��Zd���H($%��2kgeb�d�Y賅-g����C�~����� ��Vg�w�;`Z�^�XLT-��W
*EQ�����mN�a0#:
�x�N����: ��P}����^��3���j�Ĵ�`�9��2����V4%��]�Fm�G�\HV�ӵC����܅�N\=Z���E$.��N[%�=P����΅!L�Q��C��Pg�AWu
�-�G%��vz��$�2A=Hs�ʥ�ż���������~��
]�J�sk���i���*��tm��������u;-݁�_K7[�C��XE9��U�2;Hk�{����ʕ��J�d�Y|��r���5V�'Ҝ�����9A���I�}����k\2�#NK�.PN�RS��r��'�M��;vF����XDc�9QcMV��v�lEt��M���D�SM"4?2���7�mJl<�k�T|��NS����ȊF���l�J
�����hoeː�	ԟ1�`�4�
�yۡ�q7�UC�?���d��$�@y�ӡ@���^�S�/�+˛jA�mV4���Cd�{��t��٩O�V)ʄa����tuJZ!B�"�!��Vt��%���{�l��
E|s�Z��z��
AP��h�M>Q��
�	�uV�n�D�/�
��^<����R`��vS�KR~�,��?g)�����K�]�g�g#X7WW���a%���gH��<�T�\����)Up�0����EA$��#�Q��E3�@���-o/��[�`�]��E/��}��$>Ih��.�_�D�ֻ	r5�U�Ǹ�)�ֶ�Pu�v��Cc=�:�_O�6��v�66�,�G<�� �e�mȮ<�!ZE���v͂慭��*ҖE�Y�"m��N��=	�Qx�=�X[kR5g��|��cO=�����э �Ўl������	��V��x�%�J���$��BG|7a]5M|R�j�K|�����:<�Q��h�N� VϠvd
r�i�1dQ�8��,�FCN
��h���<�ո��m�VҴ)��45OaQ{����?��j���A�wb-��!���ݸ�p)�y���o�Ò%�(�Z.�"�8Qk''r�'k$ꢳ1��W�Hf��
g,�6	��U}
K��gq^�����,��Oby+����'���b��ͲX�w��X+`�XF����ɢ�����Q���n�[��,B��6����l���Y\�9���3�h�	���0�K��h?���0Ҹ���*
������נ����<v1Y�2�G/Y���0Lv���' �1�Ø�K�­�p;t�
Ӳ�5�U�=N�I˲��F�$��]t'M�m����0���h<$��<D�D|8��o��8�����RP�c[�د��c���}��n$᪭W���T�Yt���eYl
6��,��d�m��f"�����#2�D�<�=�r�P^�e�FԔ���U�µ�;�W7����"٫r���R�jйZ�Jo�\t�*�e�n/�zK�U$�_��XɊ�on#��PK
��=�G�w��
TWEB-INF/classes/hudson/plugins/rvmRubyMetrics/AbstractRubyMetricsProjectAction.class�VYs�T�;Q�M�w	�IljK�qqӤܤ$i�청:jɕ�Ж����\�3Ly)3�����+�򖦙Ƀu�s���v�׿���Y|�0C8��N\s}M<��Šx[�ĥ.\��2�#��N\���V'��;a���d�F/�2Ȋ�9�ɸ*ּx���㚌�2
2�%�E˼�e	�k��m�u3��Ɍ�XjֹX�OH��yCuJ�&atK��ht�:�uCwf$�D���,!8�-	�i��K��ZU3Jz�fV-\V-]|{ ���f���B)�v��X_.en]�K�ھ�:�g3�utӠ����U�;Ğ^]M�(ݚ�+�p^��$��=)G���%�����i,�mQ]'�~��n��j��+���SQ�⊦ZٵKVAB?ϖ�B��f���x_�YWȣ{[�U�r�<o��5	�Hڴ����]���mG-4���uY�Q�l'���]4
[s����v0��]d&��L���jE�ږa�RFN�)�+#"R)O��t�p��f��..��K�r����WR]�	)��̎A2�7�WQ��Ic�m��U{d�U�m��jHh��Z`�L�N��L�g�Ttk�q���1b8��^1KVV��rxRO

Fa*8��9�'�UEW0����xNA
�p�fNuT7X`�5���F�N`r2��AI<6�~}��2n*����?>	
>�G2>V�	>Up'�g�w]�㶂/𥌯|�oXt;��c&��62�s���Ԓߔ^�:09�*C��6Z��ikFnY��m���:	t�Z,RS��f
-"/��&��L�v�B��1+"��Vü�j��y���|,�D���[?C-*���6s�-$S�K���c�	�j~"���V���>�~�6t�d/�΂�&�y<du�2�)	=-��m����t��v$�ٌ	��O�0$<�_��Y���?�
#�}��~���6���}H����8��n�@��a�5X��3��[}�a/����Äg7�/�k{�'���Mv�½�)���k��I��8Χ�}Ƀ
��A��@-�T��*X��2��p���c0(���S|��B�O���폠�e<VFGs�A&��s
�����y���L��F��*�_��i�^���HA�S�,/N��ݱ��_j�]Db�r]�J�&�����	.e�q�j��2��vf8Ĥ�3�gH^x�X�=��=��<ngXf��@��S���{��W����2z��#L���#��G�]��݁2b�B��c���W������Qt�y��>:7L�"t-F'&)?C���G������.�ü�l��jZ��y_�V�/S���+�?<B�FB'�	h"���}�`��[h͒V��Β�;GZ�,�Y�|-ŧuʧ�l����N����6�ثH��PK
��=��3~bPWEB-INF/classes/hudson/plugins/rvmRubyMetrics/AbstractRubyMetricsPublisher.class�T[S�P�BKi�*�ږK�_h�P�a&8�
���1M���0��Ay���?�qO
��v��=�o����?}���iaa9\O�n�p�Ӹ�|
u,�Xb,O�k������op�QKx�UԬ��]s)������فP�$���B2����!}�l��#<i�JT;��a ��\��0����NTs���A�X���e�Ο�4��4k#n��[���G�{��6]�s�*�{N��a��@��h�܄������R�N,ƅ��
�NTZ��@�X\��TU8�F�_��!���+�c$��i�~P��S�\�pB��lVC�J��_��GA�o
5O��>WT})�u,X���A��⑎��੎gVA�}�;z��4T|��"�ޤ��;��'i�X4�;�XH�q�I}e�������t����e;JW��ܐ�6׷���Kʳ�J�[��;�,�
�TS����\�U�[���e�`���εt�Q�~0�Oz��$����}!�=�`
��i��(Y
�1F(����f����a���GЎ1�}�+)���$MdctR��vZB��}Y�]�8�*o��;uڂBM�7�y��Y�%s�$shG�|n�̙1��&õ5�PK
��=+s�Q�NWEB-INF/classes/hudson/plugins/rvmRubyMetrics/flog/FlogBuildAction/index.jelly}TM��0=7�µr]�������%j�&`j0�
�w0�C'<3o�{�2,Aʞ�*Y����;���@'����X�Hг#��E��˘2)>��j-ݑ��vrmfT=�����t5�tWڏ�7X-R�#�5��Em��g��&�\$ñ:I���1c{	�!r��a�
E��6"��,l�>k�J�CL�Ƞ�5�駄-`V\�/Λ,ң�[�&UN44Jۈ�yw���8f��h�j�L+-�����B�	$����4׼)(��-b��9QR�����
6T�������i���ޯbPI�-ѪΓ?�rI�p9ˆMF�(kG�v��s�m&�ف�N>O�ǠU��!cO�t�����b�L+�|����)C�j�xZ��k	c�)N*3�b&s�C}���׀�㲅�!�\��G=�ː��I�ڸ&^�-T����s���K�

܈��\�
(y�hr�u=V��V�>����n)"��Ac���;�82�l�f�M�lK5��a��&E�]��4�#l7�]5�M�Ec���tN���㣕�g�Jٿ����f-
^c�������e�v4��t�غU�4�PK
��=A.iN3�HWEB-INF/classes/hudson/plugins/rvmRubyMetrics/flog/FlogBuildAction.class�V�SW�mذ��4�R�h
!��Z��!��M���b��&����nz��b��L?���W۱�)3?��T�sw�"j'37��{��s��?��]�װ��Ѓq�5�񡊏$���\ҐEN�$����ǟH�L��\Q1�a���L�N,�媊�5�p�_��})���%E!��
�@��YnUA*����mT,�d�UC,�g��J���,T�E�)e��-c����ig唂��6�
��v�t��
Vp}���18� ��3=Y��^9�����ӛu
̚g”t�q�LJ��V���K\ӱ)��ͅ�}��Q���J�@��D��v͚%��� ���p��_��%�1�����@|�a�sM�x�\�`�<����lk�?�l}�&�2�V9!�|�Xf�	w�vG[)˞a>�
��j�	�֡\ks<��ɖ�a1�d�v)�2��Z\o��@'�gH���Ȯ�gQ2n.
΍�T��:��a./9be����s2������Cv#RM��-���ڂqMݘ�7 z��-;ЬV,�2����12����9a2ڬ�7坊=sMOHmX�q�o^B)VR�� ����8��
S�M�RAt԰ۮ8.��Gp*:��-���\�o�l'_~��pu�����j�c�u�
��cYf�1j��x�,3K�}W��:���:��=��?⮎�p�����8�)"R0�>��xj�5�Oq�}�<
�庫e-�{�FS����;��b��H�Q��2�<>�({p��	�s�0+��MG�&N�)W���~��Pvs�-�!<-���x� ^��Z���=�»��p|�i2/������5a�&=�f��=��ʹ2�5%�*wg]f�(6�??�Z�||�o��v�ђq(�;�H�إ�D.�=uR��lK!�r	dz��F|��l��B�Q�v}L����[M�U*\�&%�un�i����1G_!rѮ����0Q�����*�D��~#2�#�v�G{�So/4��(Q�8��ۀ��!D&�N:a��z�s	�
�>�$"8�u�kDE�b
�UD��\�	F�б�|��U��C���}��^�x
��]2�KF��������a��Q
��2�'�?B�e
I�� �������<NQB!P=�(�8��(�FBgx=�3d�,�-�O0Ih��j��;s�G���b�L~YŮ��W������������|�2�>�+J`�\�N�������}���NPv�ɂ��X�ȠY��}�A��<���Q7HםR��וýo>��jR
����P�����!d�u�������PK
��=�$�	�EWEB-INF/classes/hudson/plugins/rvmRubyMetrics/flog/FlogExecutor.class�X�W�N���dr�B�

G`��@!�k9%H�p4�5�6��uf6Qk+x[Ϫ�Z�(�
Z��b�@k��������}�G��!~��{��]����[^���6�
����F�(�W4����	2�
b8�`��>���~*�|@���1�H��xB�~X�Qp��
�>.�?!F���)˄�I|Z����h>+�ω���/*X%l<%�/E�e_��2�*����0���7�ᛢ���s2�-!�ʹL�!	�X�!	��vƐ��oZ�����Gs�i��z���<��LW���BƵ�d>WȚ��t&Ƈ
����c��䱜�M�a�{�H<���3}��鹜���%VQӯ����V&v[��V���9cP��z;��q��IX�\�Г��(x��7�9�>NC���s��M�Lyϴ-�EreKZ���`X�c[�E-���P�vN�y=mLSPuN�l�s5;:�:gZ�ޅ�[
R��v�>��K���4�:���[$m�M:�;ق��[Y����^^�7]oG��e|���M�ɋ1��2��$;_��s���8k����s��5�OB��A}E�a9�3'�a,����Fgt��i���F��C��qZB�L���p9u�ܖ�d��|��3�n��ą��m)U�2��q���YK�
-��?0�F�T;���K����H�p)�zj��y4�,|�fɐFqdm��5kxCS�<��{�`g��hN�t�5\AG��:y��<�ش�����F�5j&��5(�v�I�"m�~2�B*6�A����0'cF.��:FY�5�V*���^�#�T|d|W�pQ�U<�HX:�H9#t�3څ��v/�<��3��Z�vc��k7-�n��1,N�x;��Z�MO�%\��#?Ƌ*�`��	�2������xB�ȸ��:Tq97�S	����g2^V�s�B�/�+��-����+��{̊`����U�R]]ɮ�Ψ�߫��HN̢	�8�k"Y͟%,w
�I����i�^f��@�5�E�_qG���w	�^�3(10z�g��SS}�g8N!��iTXT�o`�l�n�x�w� sg�ʘU?��Y�F�_�cU�q�.�<��'*˔����Wh��Y1^묖� ��v��a��DM���cq!zv�~�j��I�����h-�|��<��/Ж�Z���p��M]�D��7�HD��a5��3j��RJq�ܙιS�Ǡc��=���j�Elw��"�JO%�k������I�g�����������Y����®��_�[b����)�O�<�^�z|�6-���'��Lfʇ�^r�_��R��h�1d�m�s�;f<�F��^��rmO�ձ��S���Y���/9���>�.\ٴ2�����w�n�|�������ն�Iܝl7�+�^b��2u��6�O����Zڀ7b+{	oB�,����wtu_B�H�-0\D�;�("�
j�[��<��?_M;=	���!�6�%X����o�!�X��bw���7sN��(;!Fo�þ�l����؅gwc{�X����v��+����)Y�o�D=��h��kr�~SJт�RD�mtNjP��A�]�R�����f����¦��"�.�tEB���E��!�j�͞�@OS�)�xG55ڴ)լQbq�TKW�Ӓᑠ�"�J�vi����im�Ѩ��a)����4Ek�����k�8|�I�����Գ��
,�C���V���"�q���X��N�Y��~�8�ՋH�2��E���_��kL��2;KPߊ�h�D�/��Q�y���ۙ��l�	u3d��ɑ��шq����D�'0��zs��'�w�%���|���/Q/UM��>��d�#��?���C8�4�3�G1B�)��4s�3��9]�w�]�N��=\��#��g���7�2f��T�xCw�I�Z��D�ڋX����AD��ҥj�4�^m����K��ޒ�jD|$%T�hC5�
���s�zT���L�/�r�P�{�
��߫�����q�{�fO0�����sX���6��q-,τH�Ƨ|_F�`�Dȣf潃���o��8:���(̼��3`�.�3d�.�3(N���x7㘟��ey��[�*u	���q���h[��u�o 6r�#���T�N���*�U�"�P��"Sq����}����V����R�?|
�#�� 5$��]�qz6�ī��
�_H(�8�����/��Q�~{iWվš��+~�	�,_��MV“��Kh�PK
��=����CWEB-INF/classes/hudson/plugins/rvmRubyMetrics/flog/FlogParser.class�W[w���iƣ!�ь
��.8��؅8NLhl��j0n��X�+i�hDp��u�{I/��Jҵ춬�c����_�;#Y60]����9{��g_���=�������5Ü�����(�U\װ����@<[
5�ȉ�|'[ëX�P@QEI��*�&v�**B���ѰW�QQSqC̮�ZW�)hh�.pSFq+*>Ұ��������
�|S��$�rj�ky�;c�[�&�]!e�-ϳ�간h��N��)UK�Y	�D�e	򘓷%�(U틍ʢ�o-���prV����skQ������D���;�l��(����{�2�X\��=���g��N!;�a�r���5!IXML,[7�l٪��Ԯ�'���1��ըӤ}�S�+�[
S
���(�Ve��i\Wh��0^*�3v�Q��B]�#�)��C��6U%d�)(	���/�Y"N��I�s-(�lW�)]��Q�.U��z+��Z��ڞ�Y��j~�&�S�հ�B����ff�E"�[��ٜ���S�j�U����R��\�vw�{���͗�|~|g�VP)�;��yk�敺hU�Ԯ���
`�ټM�<̈́b5����Js�I��Oɯ�$��7�����x�)��WrD���m_�m�d�'��k$Wnum�i�9[@I�m��qPG
i�ֱ����i�U�|W��ǘ5�8ϼ��p��u|	��H�_ǻ����~,�t���#t|ฎ$�����1�i��������:~.�~I�/�6���k�L�ꞎ_��:~��*������8����G{;��|=�X��Y�ϧ�8����㵁d��O���v*���{��h檕�ȼ�J�3�|l��<�n�L��t�S�ˤ���3�S��9�e6�D ��_�p,���� ���ܣ�hB���[V��^%�
�Ө�&�[�$��s�i"�nڜj4��9��Y�&�wg
cE˝�o4�j��)�bjIB<(U�H:��z�x�B`5�5	���3�����U���Q�8�}��K����e�DS#����M00��8̏�c���@���zD#�@M�c�OY��prҧ���q7�����t�A��:�.B��d*���
��?f!�[8��jY�8��k�)�VO7�J3���{��1yዙϡf~��t?�E�f�IC
nB1Ôd_�<�:g���&:MER�<vg2q�u���|8�����h\���GM=�2C߄���_�*��
e;�!?�����1�~�B�2��"?]�����
��y�����y��N�a���L�
Q�I�~g)E�&�s�WE�m�n�Ѻ�HN2&+�&����(%��\�[�u���-��m�C���iU�:�D=z?C4�}���uz:��v�C8ֵ���d�ʣۥ�m��'�k�=��jw�WS�տ��y�3tg�ʔ
�w�&�r,F��c�`����G���I�ؾ{8� 9OS�Tkio��m�&����I:u��	�	�w����H���uB��	�P�eL��� d��ȑ�3\hÿ���K"��\򳖹�k���`�	�A��c=���;�����1�F��P$4�ĕx�.��2h��*��A��l��ʆ�7�u��'s?�We
�H���&�������;�`���g�0��9�/�g����_f*�7�2Lޞ�Y!O��Y)�g����`X>h�4MV.���z��~�k4W.qE��v�9�S���^���D�_���|��S��l����b\���+�PK
��=.6 �VWEB-INF/classes/hudson/plugins/rvmRubyMetrics/flog/FlogProjectAction/floatingBox.jellyE�1� E�r����u�
H��@�Jnߪ�֛�_��U����vO!�u��*�4T����j#��X_�qᗧ�܄��XD���\��,9�V2���|c^srs��3��B���2��#+�a����V����{�{ǎIp�hG�c�}oPK
��=�Zſt)QWEB-INF/classes/hudson/plugins/rvmRubyMetrics/flog/FlogProjectAction/nodata.jelly�Sˎ�0��+��Z��pr�=��bl%�d�t����^��mv��:Y3CrF��Ku!�����e[�)S���;*�#S�	���!��X8�c|�I��k�u���K�{�yC�)�i���Z[l�ܦ���:7�ԅ(.߆S�F�C+N��ZS���
�胩��m�2N�
���3��5h9�t�V0bG�B��#q�$/�_�\
��/T���=�
9x���xT�a`l�jg���y?���k�`��7m2�o}�)_�{O8\-��`1��{�~AK�A{�2u���6ᇡK+M��=�@3���Gf�����l���+���?�n֋3��9&5wc�.�5�����C&4�)�C�#]]��D�>�ٌ���t��{��PK
��=�����JWEB-INF/classes/hudson/plugins/rvmRubyMetrics/flog/FlogProjectAction.class�SMo�@}k�8qCZ��KS��	�8�(P�*!��H���1�V���J�WpB��G!f'rR������ff�_���,�p��F���4�2��P�P$]��v�$�Qh���{N�H�&dt����1��O)�՞��t�x�;!�^���K��s�HND��|�;
R_��-φSg��K�pc�K��-�Ӟ��(�e0G�acyi�y��hZ��K�w��:� ��K&[K��ۊT�?�I*���f'�X������;�S~�퀇����_#��>>�C2Y������'�E�O2�p��~^��w�!v�1�i�l�¬~�J�;j��sS}�<�0Qfxz�k)�̰��M�"I��H�.s���-\��I=��	*�F��~���tX�ZZ�SVhל�P��L��VIim.wm��S�A{
��x�8,�{E��*о��JV˜��|�6�(}��������(V/�����ح���b��iyǷq'�w�PK
��={0τ��MWEB-INF/classes/hudson/plugins/rvmRubyMetrics/flog/FlogPublisher/config.jellyUPKn�0]3���.�a��U��L15	r�Z��
L��YD����7X'v�+s�E�M��hP;3�It'�aO�Oϕə����58ߝ�DK�;M}B{/����}�Ne%e����lв
:l�a0�ah�f%�*#���0yG���I:�+��gd�t�]�C��|�ٶx�KdYLW\��+8;�>��Ҽ<F�,/�z�&����@^��de�꤆e��__~PK
��=(��Y��UWEB-INF/classes/hudson/plugins/rvmRubyMetrics/flog/FlogPublisher$DescriptorImpl.class�SKo�@�6N�6���%P�A�Ѐ��S��Ъ�R�*�����lY?������NH��(��q�&=Tff���7���~��j(�"�Tq��������fp6�G�x(V�2i�	��{�<�~�suĵ�΅�lG�0,�
�k��Xb��G��;�#(��ҡ�#7Qi #���m����o��*�=����	�p�C���DI�y}��O��x�y�N��:�bX�dh�0N�C<�O�>��
i��y�j��C�v�	mi ���T��\.G��.��J�(>>�a>T�Ҁ�ԫ;��|1�T���lGs�k̩�q�}�'�k�Y�Ӭ[�0��V���"�������?/��u��mBo١��}X6�*�\Ҍ�£`��(a�d%w���$5\%M��ʊ_ө�Ք��g����$ZTf�5�R�q��y��Z���d5q������4J��}:G�)��&6r}������+�PK
��=��=خ4FWEB-INF/classes/hudson/plugins/rvmRubyMetrics/flog/FlogPublisher.class�W�C��:I�m�We;�<ڀ0R�:i,�[�qC����I}Hgq��So�t{6i���i�$Ŵi��6�{�/m?�;IH ����~�{����?`?�C3Q������[��b�m2�C31���w��#xO���m��>��!q�aq�q�Q�a3>.�?фO�S2>C32>�v�4�Q|�	��cMx��/�bv�	_�e|E�|U0|M��ch�7�i�J.�V���o���uG5'k�ײ��
���45���:��HXk��m-�s]�[�'�i5m�f>=�ں��)��j�ҍg��Ǝ������?���L/��Nڞ���gNh$�:��O�g�7tgB����K��.����6�.��6&!t��i��6�M�k��:nh�.VV5�T[��fȝ�i��U[FS�Þ��Sژ���m�����eR`�߲��ք�]�Ҏ��NU]�������'�����������rA��[����ֲ�S�����@5�x���,��������D���jt~g�	��bKŽ�J�%�6,�!�K2���H�����ދZ��j��iݶ�)�t�]YB�9M�:$�>l����ժ�<�ڐ�N�(lXs<�uD��8{�n�O��+>�Ε��RX�S�,��1$$\�U}�>���F�L���e<ՕL&�P�պ�F��Y
�P=��i9�����<�sM��"c��Z�rߕq�p��ySu=�F
-��U��̉���ym��uv0=f�"\$dV'N0-Hkd|�3{�qs��{�m�5�{��U�}�f�A��i�N�?P>Y��{)B����Kv��U���$��R.�u�+������(	;� a���=��>ՍlY�k-TG	{[+���\p�Tq��������b��	���.��F|�+k�
�VQ�c#�gg� �ZjJhJą�{0��^��I|O��b؟���=خ��� �b��Pȸ��)<��\SPĬ�{F4m�Iڄ�$X�媆��R�^��V9���MOu�ާ���q]�<~��_�#5 ���e��TJƏ<�C
~���?U0�7��X��/������2�W�K�JBǪ^�M'��_+x���[���e�A��'�_���y\�U5/Nw��Hz�?��b�\靫s\��ow�U
�"��[l=%ܹZ	�˳�ӽj��y��}&K���sW�o������
��w'���c��u	w�k����n���D����:=a�|2���L<['���JiY�߸�T�h�uG@�W���'{I�P�D�hB�U��;��v�^R�3�A��`G�;�[���o-7�����U��}U�~��ʠ#c�_1�&U�q?Q�4��㳚k�����U��mI_|fE�D���o�����Z�]+������-�88�ozhm���L~;6��qC�xnu֐�4�ԅ��!���Z���-�3�]t�h���?t%;����q��a��1����F���H��]U�ʾ��}]Gt�v$�3���z�6l��B������p��ǝc,�8�d��"eǎ�,�d�54$�Ϡ�ylCk�@L�.��%��XD��dh@�/<��m��D�c��Ζ@(��a��	cXU8s|
G	���W���(ql��T�=�H% (��pGi;���I�9���YD3���"b��"�2�xh_�1.ByJ���em�.w�a=#���
���>9Z�ؘ���qy�2�yl>���bK&�ӭ��^ր���>�����m%I4�����)�q'?���(�?ǕA��m�W2ыc�
M�������#
�2�	r3�	�-8�A��ǩ�~C��ml�F��sX�0FΓg
��!�?M�3>�
8���A�c�Ć���#ܟ�G��n��v�;2�}s�M�v�{���9�.�1�YB�sؕ	w��s�-{�l�����Wd��芇���"����Е
��}��{.,��=Ǜ䉒�q���9���A">��0ñ���'R����d�I�r�S��n &���Y�;�4���S������z5Ȧ�R6E��z�}m
B��*;���LC��'+a.v,�%�ؔ���J�z
�ũrU��J�Ns7e�K��B��ɷ<L�����M���x�xɫ~J.�x�$�b/b��N40R4�'�Qd��PK
��=�iU78HWEB-INF/classes/hudson/plugins/rvmRubyMetrics/flog/FlogPublisher.staplerSOMQp,MW0�P02�21�2�TQ0204�J��+.)*M.�/�-Jr�,J13S��PK
��=�R�;��OWEB-INF/classes/hudson/plugins/rvmRubyMetrics/flog/model/FlogBuildResults.class��YOQ��n�J�A��(�eQP�XE��Ã�i;C�Kf!�KM ����P�sg�۴>H�eιg�Y��s����2�"�rO"�r���
��F���X�J����[��F�6f͔4V`I�.)2C�D��}ٰ4�`�9��%�2UMܕ�9��T%��i��R���x`�jU��Ze�V뚥�UC��+�V�bW��%C<�j�X��eM,�[h���WpS��f����1��i'�I��o�JQ���F��N�$iG����*��Gxm�Z�9à"��&��@E(��d�E��H:��7v�b�g�D�3�7�
���)�_��cR��5�^�&�����R�K�֛}7�߄�`XW�t�7�P����A��Kr��c�+�%>��Q��Lڼ�H�)10�����1�y�ᕀ,
X�"����os�+��%�a���I�u��k�W�l�F2�!J�.\L��4Do��2�@��`["�[��� ����)��F6�m�e`���_�����O#�aL�'8�qw�2�Cʭ%���K>�
�Бh%���&�&?�$��&��x��}�S�ƌ[�Y���y���8�Nؕ�\ N%�9����H���y��sϩPU�u~�B>��.\b��0���m�	�b,�$�G��CL:EZC��F�n�B�QH�n�m[@4{LW3S�B�{��dg:�m��ڂb]�_0��g���`�.���x��?PK
��=CoKE�NWEB-INF/classes/hudson/plugins/rvmRubyMetrics/flog/model/FlogFileResults.class�T[S�P�Ni�R.��J�"�!E�(Z.��o��%L�t���)�GfDDg��Q�{�Ж��eϞ����������	l�hä��"B�lB+�x�G�{��T3�`��473�<0+Bœ�g�"��[f��V�CKAs��ܦ��ah���RruC�莛fh����l:�V�y&�W�9���R^7�>(l�vW5�ֳ���J��i��L�j5Yz���3�����	�Pͼ�E�f>]�w���Ж�Mm�T���muנHG�ʪƎj�|��N����B�uC;+��BJ�5w��x	�^����Ekw�;��\��yE�g���=~Ś8Y���U��WA�Q;��R}1�m�H3�Z�YuaS-�'k��n�~n�O�!!�#)0�N�-�dg5>]5#2ε�Ѓ�Ԉ���rq%t�K���E,IhGLBb�%��K	+x%�52V�F�z��JXG/��e����2��Z���|�$��bQ�-�t_����Ш5�}����~M��T(��+�Î�Q�6+d�%<uE�Ofh�j2���F��ĸ��Ÿ洆x7@0��@~z�QĤ�Z��'`ɟ�;A�1���wD�M�y�p�e���#B�a4#��5��c�:�k�
b�^y!��y�
�H�+�_�Q/�%�@�_a�b71�l��Y��}�I�QD/�M�q)�*�
d�Uf�xY����h �b�"�RS�h�mE���D���\���&��[��2G<E�'r�ߋ4
�S4��Rj�Z*t�^��� �*��2��T����@��ȫ��~�Q~���\�,�&�^�|�;5�PK
��=t��PWEB-INF/classes/hudson/plugins/rvmRubyMetrics/flog/model/FlogMethodResults.class�SkOA=���v��
��
�YQ��/&
���`�8m���v��	�J	>�?�xgwY�%��e�Ι{�=����??~XE-�,$,f�B��Rɠ�%-��y+P$���ʐ0y_e(��c��Ԕ�k�VcH:˦KVg�Y��e7U�3\����suC���O�t��'j֮�n��_A����Q��uSww����M���B�n��~[�?���du�q�m]�C0�t����e*��t�Q��~�k��D�q�C�Ҕ>B�Fp�ꆣ�̢���aC
�ʈ%���Qtn�P,5�/^�J�G>\��Q��A�����L���Z�iiĚ�!c/Ɏˆ���QSyd���J�^�GN�:6$l�x�-��ۿC�r�F�H��#74�2ඣ���>�
}��17<�q�0Sƈgc�|����7�V�j�He��_
�Q�QT��v��
?�@��IL�Z"�3U�i����U"���3$�KgHV��!u��/�Kk	IZ�D�&r�cx@���8 �4f?B��S��>e��
��]���/Q��|B9H	���=ģ��=�1Q%�&N��K�G����3���HZ��
O�.��\zB��ȣf�Q^H]"O�|G:������ɒ�+V�~�Ȋ|d�3�z�/PK
��=&�����	>WEB-INF/classes/hudson/plugins/rvmRubyMetrics/HtmlParser.class�V[{E~'�d�%��9��������hZj��T��6]����	-���/����<^z�����4�z�ٙ�~�����o����N`��Hǒ�.,�X6�DI�=+Ҹo@��j)+�'J�S��Z>7Џ/t��/
|��40��C���KǺ��@O)?]�]-�o�.��g��̇f�1�ZnY��[�8<㹁4]�b:M+�
�C�[m�4lE(u����˫�Ri�E�J �{���kє��y�����Sڱi��/p��Ѭ���{U��M7m�Zlq)��a���)З}��Ȋ�6CB(ڮ�Ь�Y~�\s,�W1�ӷչE���>s�p�5�
r��Rs�Ѽ�<T��YwM?��5K*��Ȟ���hJf�2�S#q�L�JB`(VE l
m3#���-C���f��"���L�DU��x[`���n�Vu)�PFs�cv�b5�͢�`��d��X� ���r�J��i�6���{���:[�y+Y[2/�]��nJ��)�*�T!6�i��8�r�0�UkK@�
���Q�ʬ$�Wq.Y
ϗ�&�~h+�ɑf-ȕ��R`�e��W,՜lɽ.���`npQ`0��1Wj[%���1��fC-_g�#�@���Cp�b�`SIl�g�e�����n;��3�s!�!�T�0}�������e��D
�k��k�
�$eT����EQ*
EGJw۳ p..��~�TWV�0{S�AE=����y��<*jZMm1��l����̳8qs�,H/:�r
,��S�/
t[�U�\��V8Ч���4V)�#�[��9�[p%���o�ǨBz�.���;�0��x�?�WyJ���u�Os��|��s��|�8I�kxY~��`��Os�I�k��@�����/��8����7�^��e����4.!�;e��.�N�6���S��*�@��E�<����.��.��t�Ԇ�m*O&�@fb8���O��5���O� N���󑿀>�p��'�-r����6�)�����z
o�J_(}���eR��;;J�$Ӕ��J
�]Z�B�ǯ
�w=�w~|lGƟ���e����t����T�Pz�^X�4����<5�9��:�[��HI~'�Nn��I�ˁImbX��`yC;8�Ǻ0�uQ�)��A�10�c�etg�F��mÙ�,�-��mܡv��,���ec}H��i(b�R{PB_w�PK
��=�+��6�AWEB-INF/classes/hudson/plugins/rvmRubyMetrics/HtmlPublisher.class�V[wU�N�v�a*�Pza�iz���Dii�����h��$9M�Nf���Իx�<�����e-}��/r���$MҴ�җs��ٗ�|�2��_�>p
��8����L1+coȸ��}xoI�Ȑ0ǂ��,�%o#G.�ea�"�+q�#�]�
GW�ɵ8ދ�}�� �C|�&!/���p�m9�E�a��\�6�����t�st�t����n��y�����،U��3���J�;�Z����*h����st�ʺ�0�)�E�2Ӷ�t�M;����Z���/yc���[��TJ��n�:�m��M�5�G^B�i�f9|Is\
ϓ��Bm�/�]��
޴�ų���z�$a<�J��7�
�ݫ�7���Е�G�
�7"�;4��3���"��d�

C�gYF�L_�cJ�嬻�V �@-��ZҼ��f��uNP��)X��J��4����7'uˮ%V���R��d+��,p��-ӕ@9�dj��Wb��/9�TL3��ݻ.vq?������c��s����LM1)T���)����$��@�u	�
T$�
,��D�D)�$uSs�Ou�B���o���nۤJ1n�4{�Zu��P�bD�>6�D#x„�GJ���
6qS�>��O��)	�(��)�%_�K�ӑ�Z�^�,g��i��͢�¯W檭yD���0t���pK��
���4jn�~Q׈�&?c�b�0L�]�o�Y���m��M��Nj�.`8�T,Y�� �Vfffs9��L*��݋��*������]�nc���N��(�7|͠n�OfZ��3�{�a3V�$��|�j^�r��V�F�m.�0�lӜ;��2�ҳ�#b��kb�O���暾T=�p�*��Z��69
Q���C��p��-O�]+�.(�P�� w�
�Qw�%w�mҜ�e�]o�t�7k?㤹��,���.��d�j>�k�n0,��d+��bF|�;�|�Y;N?*G跈`�yGR�d���4����H�	Z��C'�5P��x&p�,Fv���{-��ǐ�(:�1�E�q:{t�cUĪ躍��_�������%����ܷ��*�*zbw�u����됿ީ��.��p}}?�����85v���O��G.B�ôU!�<
�.&�����ߑ����V��m��]�Sg����z���j�~M���l�R�)6ea����عC��H�I�޲!7oBJa,���1ALi��v�s�3F�7)�ibv�����E�"�z>���Iz%��)�
�w��^�y�DzWi�������OP�P�5Q��v4ND��p���z ]�PK
��=!���aWEB-INF/classes/hudson/plugins/rvmRubyMetrics/railsNotes/model/RailsNotesMetrics$COMPARATOR.class�SMO�@}�8q�(��
�|C�A�i�J	�B���&Y#�Fk�����^��JU�QUgPҞ҃gfgf߬������}��`C�s)lа�Ķ����Q�Q�QbHخ2$
�S�d��Ŧ��p���{y��^�;�\��;����3�v�]�S�;f�u��;��Zͳp�{�u�C�-y9ꄽO-H�OGn;���Qi��\;┭�*��F\R�υ����#����f~,��a��<��r�;�ڽs�������=ՙ���Г2'���A��r���c�#Ry�Ƀ���'^(�⭭�du&gW�6q&����n �B�(���/M��bx=�L� �p�g�!7�(���(eHEЖ!�5��%
�m�x���t��1�dl��f@��f'Hg$�t�H3��+��dh�K29�X$iN��=�L�_~�$���C�P#q��2+s��/S��#�ɭQY�a���,-W�*�*G����O�*�O�og����8�g�,��O��ϰ�u,�6('MHK�PK
��=�^�\SVVWEB-INF/classes/hudson/plugins/rvmRubyMetrics/railsNotes/model/RailsNotesMetrics.class�U[S�F�˖�e��I�&���ƥ	IS���F�6�R�¨�Ybta���Bf�L;<�Guzv�zL��3{|.�Ξ=+}���?����e�P�
?���O|y�"���?�X��5�x���k�򔣋
f�\W0��/2~�QbPze+_��*�Vr�+؆�>�Tן�O���}�u��vز?�����ˊxV�Tò�M70�l��7�l�k�Br���"��o�K���W�k����Ca�*(G���̕$�
�b.[����L�n��d���C#]>0���m8�l��N+��
�4��Y�2��mr_'�~�r�`�aꂒJ����ug�f�#=�Ks�x����?ٓ���i����2��7=���HYi����˷c�(՚zMs�⍘ꋹ�I5\�ㆆg�`X�,���(k�i
�й�u삶h�7eli�
U5
ul��k��0×YL3����e+�����:ԥ�t��,��P'�{D\��EC|�F|Đ���Cze~_w2;�0��l��4[	�/[~�0���/1�"<,�Ǻ����o��Wp2}A�����&�)�M�$g"9�����H`�n�v�$���8C�4��D$��i
��ekr��)�g�8`�`�V��y|-�4�vR������!�WIrx�=)ddx�Xq�Tͷ�jt��\x��q�G �;i�[�,�R"����;�=W'C�G�F[M�B=%�����͎�T��*U�#�%��΅?���v�R�wz�a��HB�X\(㉿I��`��#�`��?�x�
���t�$SG��N[~�=!��AsB�S�PK
��=�.Q'�ckWEB-INF/classes/hudson/plugins/rvmRubyMetrics/railsNotes/model/RailsNotesResults$SortLabelsComparator.class�T[OA�f[��ݖr�xG�R���mE�jҸBBド�2�%�]����[b|�G�l+��	1�Μ�w�3s�����Y<�"�B
n	iZ��fccN,��rG�����x 㡌GS�q�eHi[�����a���zE�h�hX��;�!��.�tS�j�s�Q�����i���%m��pmK�6��a����\�k{/9����.�wզ��Mu�а�]��\�V2,Ûgx�==]�����e3h�ŗ�f�;kz�$ːf�us]w���aq9����xZP�����ݳ�bY�)���rB�>��3��PU�u�4ҝG��{����J\_���b�cz-Sɞ���	�\�Jm�׽b�% ڝ�$j���R�N�	�uT�1V�}�Ο�"��N� CV0���$��*��ܑQR���D�,�L��
�qM�S�������(��C(+���j�am�ݕ��}�$z�V����M�`�ZOU����5[��@��i+A5�ӣƐ�D͢&���'O�`*%�Gr�l#%[�����h��r�!�
�}��hM�aD)(Iac��)�Bp��@�L��+$��-� YZɯ���M�H���V�9��7�O�⌄ψ�(_ �� Z�"����[ч�'�w=�O C��Z$̍v���D.��}�u��'�����@�$Q�օ���<.�#L�q�PK
��="��m;VWEB-INF/classes/hudson/plugins/rvmRubyMetrics/railsNotes/model/RailsNotesResults.class�W[wW�F�4�4�؉�8��C�Ė��44Vp��	1�j'N݆6cibM"��h��ʭ��
��{��rk��1^��?���
�o�ɒ-��B���e�}��;��[����.��V}(���Њ��Gğu��C!'���؇OI�&P�'�\�P�1G��z.�x^��\��i�|F&�#/$�9|^�/��	|	/�xQǗ���Kb�eY���W��W�y5������ůo�xM�75�(�ވ9m�C��9�5����v�*��U֠�Z�k�8�6r՜73�.fF͹���	{�1��kix�q��?-��Lf����Z�B%_.9��be�v�w~v�2�0��qM�X+yV93[�[��xM�d�v<k�r���ceFf��4l�;y�.{��^#j���*�\��о~��'l�5���Nj�O��v�����7���l.�����2�a�`ӷG�{ƭr���H|���Zf�riqwOo]pC�b��yv�����ԩU������~O�-�ƴa
!��P��c�h:a]��B�j�c�+No����|���<S��ȃ��ӄ뛆D�7��b�1s�øY;\Õ�ϓ�$�y[��ր��v�I�=K%I�i�s��o/���sZ^�h5yE�����d��J,�ru���zU���Z幒S慼�����RM�ހϯ�����V^ٹ ��z֘t[˫*�&/O�M|�Tqs�[�AǺ�yX6�&�Wc;k���ad4�X]8��T	G�]��ùf�e�E�br�Ç��[���
|�5�=�t�a�M�|�7�{޵,�[���"N�0�����c
[��O�S9⤁�ᦎ��~i�WX4�k���7��}i���"��췆D�[i~g�x���S2�	�m,��d`±��8ƌ�����L��^���2�ܿ�t��l�S,�*Y�����$Ƽ��i
[�p-Wr<��5$���-�pϰ���>n�j�׋h`F�|�Y���c��M�Ŋ?��E�>��SW��K���1�yO"�aGM�A���5kA��ƲDQ��(�=����������ӼN�ZL�u|���;�j���~����D� �u��C���q�TS��?�αN��=�����%h�����ra#FoCG`ێ0[��l�V�vd�D��	|���A��1�.�(��
b4�:��_F"���1��;�r,��w{���H_g���/���{�컥���(S]�"�Ϗ�p�&�?Α�1�Ct���'T���b��c8M+{q?�p$adwc��1����A(���5��h�>b�$O�Q�f����5��L��o�n��
�w��w�����&���M��'�G�N};�Z��s�e�Wf�}I`�#��`�XZ�Ӂ`��_��~���a$��e=D������,#�b�,�F���DJ0��V��a�r��W�ɘ�a�6(�\$��F44et�<������}�� �A��S��,dR�i��x���|#k��Uc��2���ѩa{4���kf��h>�˸O��� �(�����W�ͮ��*��]�wcUGI�s�u�g�zR�|qR�-���ހ��p0�j;��S�:��򔜡���wAA�l%	\5J/bR%�*྾��=Q#�E�����v���tM���K�?"�з����>@'0*���u����4vE���o�C�;����H]"I���&���wW8+(��ҟ�|�Sx��@ZE+��D���_�'G�3�;����Y��D�rMK���I�4rABԄ���{����JX�Kw�Z���
6R[."�껍���W�y�yNY��jo&�r3?\���K�
1�C1���S��PK
��= 6��fZWEB-INF/classes/hudson/plugins/rvmRubyMetrics/railsNotes/RailsNotesBuildAction/index.jelly�T�n�0<K_��j�z$=�X��-ѥH�%B�/��,��wvfwgM��VW�^F.tum`�V*
�MF�!�*'��w����7qvF�,�X��ŴI�vZ�,�$�"՘1�����&n{&4R�x���5���k�C��W���A��cFʖ�rH��Ӄ��Z���M�D�mGs�^�9�gA�
���ut"��C�i,�'	_%e�W��!�!�I���a\P�(:Iej�H��M�k�.�)�x��3�V���܀O
���T)j6�@����"��3����OO�e��jC���#�߃r�����G7�!�@I�E�vX᜺����j�W���u2��i}�9�w��.M��iL��5*n52�q
o7�ƛT�Kf7(̝%s0g�-������ǎb.:���u�9+�z�C�lg�ش�	�T�Z&q�s�"�!�����7X�j�߯f�J[-�E���yy;Z���f��zq�'Q�f�ܳ%C:/��ݭ�w��7���N���kty3� \z����/PK
��=���[��TWEB-INF/classes/hudson/plugins/rvmRubyMetrics/railsNotes/RailsNotesBuildAction.class�W�SU�m^�-��)XbA
���HxYlJ�ԛd	K7����ߝ��:Sa�3N?���%빻!$4�Z���s�=�w��ܻ����n��˜o�U,��wD,��W�EZD�o-��|+�:�,V�X�:�l��&�|+b���D|@7�s��$�%�?�`DC6+�e
�I�T
����j��hf��+e+��%�2�<M���ݒ�xI/�j<[[�:	���)֔=�s�S9�2Xޚ�(j!qqU#<��)�#�hr�R���˩�J�y�n0C�����Q�����}�ն:��]#'��cM6�rQ@_��K"-䒱�ɶ�*E�Y���V���/'���leO�a.:r��N�s�YV�A��ș��e{,�2�_%(��pt����Ņ��Ve�G��T,E�7��Țe�8�ҢFI�U�i��O��Ֆ]b�a���\�0U��h��tRe9Y�m���5��֗v����a��N�p3nB费f��n����-��n0�v�fN$�<OU�D]F5K.��ﷰ3�j�K88�v�7��[-k�<��%y9�������#//(��_k�Jnr���p
��)M���=3�e"!�S�	�|w8^^DA��mE��F��E�HP�+�%�e	�@'��I
J0�V�i$t	_��hf%T0&a�%�N��Ś��`]�$[Ýtܺ�������(��yj}�O���􇮓VZ�!z��Z��F���%U�YZJ4��<~���Vk`�떡WW�y��̌�o��G��fOo��ܮ��j�sL�Љ�yW�L�-�9��
�h�l���Y�Tf�h�Y��v��R
-%�_o��e��;�
��b��3Q>��6\�N�<�n���#��_��nҷ��
��� B���N�7���I���
\x�h��2���z�h�D� F_�8N#��ƞ���f�Z�9R�VU	�XUx�*��ϊ�׉�k��MD=gE��zp�L�c%��L�5�9��G���b��?�����gh;B`�3v���cH&�a�1��	qN�x��I�h�w�N>��T�S݇�	{���_��{���'/}Z��
zb�"��vRL�(�C��p��0a�q�L]�4O�Cro�#ܦ`a��Oɕ�3��4����HP:�4����O�um���/j\����8E�3Mb���X�nk�ƿs��.;�)���.���PK
��=�LR��OWEB-INF/classes/hudson/plugins/rvmRubyMetrics/railsNotes/RailsNotesParser.class�W�sE�M2��L&$,$����E�
"K��2� d�Nv����2GHE���BQ�x ~��B���*��/��ҿD|=�		L,�ݪ��ݯ��{�����,�95�.c�eTc���e����.��-�GF�2���9)£P��+Bq>0	{9o��4N���~>�2�0$�d��B�y�/v�a�	��`�1��\� ����9m�qa���!><!�I	���i�f���� 6��L@I�f�6'����j�N+��TLջUS��ܢh'4K@cK‰[)�!�;��a5��N�o��٦����V[�fVC�8١�3�9%�@�%e�7�Ȁ��X$�
�ñ5����펝vl���l��q�I�OP��,G�-��K�"�ߔnݡ�}�ڠ�F���XT�t�;T�f�! ���Zb�~6ؐ���gyl�u�9�&���H@S��3��	��E|N	ų�:��Mf�Sρ�p�*���3(`F���n�l�X�R��b����̈́�j�L3'0��r�uղ7k��'W�Pz�:j<u��ެ�$0�g
�R�%S��Q�p6rgI�۟��,��
�vLv5�o�Po�S*w�3Ʋ0�][�K����𔂧qD�2���vs�ҭG.�U��
�u�b����V�Jt1[�1��9n��
��.�/�%��W���:A~�
�	o*xo+x�*8�����>P�!>S=��FG�㌧՞��hME��'jE㽵�^�|��T0�^	�(��|��%�V��e_*8��(~=Q3j���*��(�g|�����e<���}\�7q1R]ة�2����@+�k$������ҫ���:D�V�f��š�G�6OJR�F2�S���^;�6~	�����������j��A��)
w2������W�aV�j,��d��É0� ䷤Y��i{���>R�%T3B��Psu��"��-tZN��Py���3D�^�9R;���h7���HC��43�ԩ=;���8��'�O�pN�w���l�RR�)P��O6�]�Ì�8ߚ=�eS�<q�Ɲ,U��a�l���f�U;=l�}`y�Z�nϽy���&K�j�Et]�/Sn (no�ǯ�2V�<y��
�5��'B���z�5Г.gԌ@���<,���.��6�dp/����eX�;|q�ѳ��6����]#`�+�<˔��X���%�Cv���w����6��@j�����(�k����bP�" \(����&P�8Ω?�4,���G�|�W�J��(�8�2"��L1�AY�7���(���K�
�W�erY�)4�e�p�E�"cf��,��nz�А���V�
6?���V�q��(<*�W2�WX!������҉�4��g�,�w6� �E4�c.�3���-��o���MQ	��iV�,B�H1����3��F� D��S㣄�Y��k���Z��Q��$��H�!tP����ъ���I�1l@�z3!?����ŏ߱M�����|���L�D�����c)N�A:�ö\��\-�\�ĕ��h����3��;����Q�+m[}.���#)���@q���*;���U(E��	���W�ѫ��4���F��WIk�U�����f:G�;q��N�%������S7�:3��Bkn�?Dk�.�PK
��=��G�bWEB-INF/classes/hudson/plugins/rvmRubyMetrics/railsNotes/RailsNotesProjectAction/floatingBox.jellyE�1�0й9E����G���]�A������Ki��}[�\fp�\G�d�R}[�br�D��v�r�e��7��
vÙ������5w�1/�S=�1[jq���}���2�s�=�Вfۓ��Gĥ��h9�����Ju�yG�$��
@rG7�+Q���xPK
��=��Z��]WEB-INF/classes/hudson/plugins/rvmRubyMetrics/railsNotes/RailsNotesProjectAction/nodata.jellye��n� E�~!�V�D��v�?}�3����^��״���sgh&=9�]��HO�<����d�/�t�2�[7���c+�^!�qeY�k�6��Z��

Eb�ewd�g��$�L�9��:�@*m����/��7�F��e�D��S�;�:�J������j��yȧ����J���ZI޺����T��g���a�o�kBd`��� `�УkT��J��]ը�i]�PK
��=�]DVWEB-INF/classes/hudson/plugins/rvmRubyMetrics/railsNotes/RailsNotesProjectAction.class�SMo�@}�'1�M��|��!���ŕF�i�PSz��Ʊ܍�Z�+�_�	�?��;Nꄒ �Cv��̛73럿�����xR�NO��ͣ�����PM��~�2ꇾg��횭^�$���lK\0h��bXk��DÞ-�y�%��-�^p)�{
j�R�'��ᅦ��E��;[Iaѕ7��ͳ��VmYJ��C>;�e2l�j=�o-�q~�8���O�5���B]�z=*v��qI��|�x諎�ވ0p��Ç�����+n��s�.���6(�t�1U�d��<�UTg2���z�	}�K��\2�Il~�F׏�e��F��2�q��(��jy��x���|I����C�?֚���b��e�A
w��X�8r(���9:���7��d���#A�U�]���Q(�^¢ck�T��O}�U��a��M�aI��t��J%�eZLO�RR�4v���3HL�p���y��?�ix��)�qJ�U�ͳmfش?ش�-�v���s�7PK
��=ݟm4i�YWEB-INF/classes/hudson/plugins/rvmRubyMetrics/railsNotes/RailsNotesPublisher/config.jellyu�OO�0���SXRA�[�N q�IpN[w˖&��Uhߝ��`�C*���=5ۦ[Ժ�c��K���˴��bl:����^#MB5�+��9�s�hU$Zv�e1��d�M[9k&S=vkK�X����
S�Xc.�o��l�VLʬT�JR{V��
PP]�[_ �C��0^��I��ct���f�[oD���
j�
H��L�Z�z0�k�jUo�;h�<����O���ȅ=���G�W�X���]'�~}.n?��A�/ԓ�$̻ɒ1�����!��9��B�v�",�R�+��KU{��Ȯs�ٞ�9rő�^��γ��}���O�_�DrAsI=���gY2�ˋ�PK
��=��ݜ%�aWEB-INF/classes/hudson/plugins/rvmRubyMetrics/railsNotes/RailsNotesPublisher$DescriptorImpl.class�S]oA��"Ej)ֶ~m�@��h����T�FJ������2��ُ��6�?��O&>��Q�;˖���M�޹���w�����'��m��!9����-�$�mp��&�t��#�i}F`��}։<��3���ځKE�Jn�I1��\(0�J�@y� P8�}&[�*Ű�F}�v(���-Ͻ��3-��Kʅ��)�t��D��j���u�:��ӇL���\��G�ڂ�����AEp
:�Pq���Ppw2{�z��Z�}"`��l"`�F���u�8�z�xq��:*�}GiI]}"�su��jw�|�SIػ1��
f��HS�Y��#.�]��K�fS_��� �.�8�:�]3��_v�l�I�'�M�j��z®�z��]�,�&��?�'���Xz�S��\�-��)��B
3���2���y
��cx��=X��0�a\�H�>,%/1�^���:�g�һ+��Z�C��R�s��PF����L��|���V�\�t��`��é���b���1���8>�b�A�܃�?PK
��=9��R�RWEB-INF/classes/hudson/plugins/rvmRubyMetrics/railsNotes/RailsNotesPublisher.class�VkS�F=kl�y�64@��jc�CM۴;n�IZ�yԦP���h��,��*��~N��������N�J�
\�f���sϞ{�������N<Vq9�*:���%OT��Tŷ���x�`E��B����mM���^�l(���wIw+�Q��\���e�ҝ��]Wwԥ'�|qycs�ȰZ��v]���W5,Ws^֊^�ժ.�BCn��-tW+6�
�l��L�\*���!�����%�LnU��Y��3S[Ѽ��3�K_�je���e�f
v��[�1�8���=���^I7	UB*�J�(�<:|_߶�}.�Pѳ�Qӷ� -9˲�m��T�v�ھ��z���
^7uG[�/ڞ��'�p�
%���˞a��*җ���}+��=���=<a���uO�=A��k�F�5›Z�L��"%���������%1�nGO�[玫S.җʿ�L4����)(o��	�؊�T��T>�����f��ɢ{Uo�h��dR�,�v���Ņ�|��v�'�;�_�ņc��+�Q;�g;���ԩ׍(�z`�Ӟ�a�- �|��� �s��PX�>�0�l"w�]��BI��ܲ�eN"Z�_jI�Rt��3S1�V֑��WK��T�,�[g4�9�C�$Yr6�AP{���)��(a�B�ZUK�l%���$�?�a�����'yN�C�L�!�V��[�
���
�}7�<���_��u��,�wH�_��O]G�� {_}��+������:_~����+�I��:\|�o�z9�]����ma���n�/}�e)�'{!�[4ZA��������;D�

"�FE�~���a�F Fp��-�dEЏ�3�qL���N�8=�G��9Dtmv�����;3C�C(��t�BW�RC��a1����	��Z�SܣK���M=IL���DE�k��)��#��I�z0�Y�#d������}��_����[�����!�_7��}�i_�`:��/�޷�3_�,�5Y��E�h$1�?�x�܀����pDC��c�?Giz#9��#�:@�i��c$���<
�'|�@�zi���D�MX5
���O�
>�˃ꕪkC�PK
��=t��DDTWEB-INF/classes/hudson/plugins/rvmRubyMetrics/railsNotes/RailsNotesPublisher.staplerSOMQp,MW0�P02�21�2�TQ0204�J��+.)*M.�/�-*M�.)��K�)J�N
�/��]2��PK
��=Pͷ���XWEB-INF/classes/hudson/plugins/rvmRubyMetrics/railsStats/model/RailsStatsMetrics$1.class�S]kQ=ww�M��n[mc�Ru͇�K�A1�P�4Д����.�-7�e?����*�����ĹkH��S�ef�0sf8w��������֫��V�覂&n)���mwL�e�soE�{���AG��G"J�d:9ȇ�{a�� 2d<K�I��=�'f%��.C�/E$�Wz�u�`���a�+�p?���%eV����O�³��c���)�$�F�~<��e�I�8y�`
�<����.,�X5�N��8ш��80q��}�6,\��u
46�=�FK�=D������@��y��B ��^�6��(
���i�h�bzx����Nb(O��}��:�^��4׻�6i�?��8	D�eq t1zK4��l��V銙SS�"�ظJ���)�;�a}��Y}�WF�#���	��$X.�'j��:�QB���N��'xJ^��z�-���_�
��<z6�t��Ո�y��-ե��ڄ��oPK
��=ϸ3�aWEB-INF/classes/hudson/plugins/rvmRubyMetrics/railsStats/model/RailsStatsMetrics$COMPARATOR.class�SMo�@}�qb��R�|�Ph��[��*B$��	AIT�q��RW�]��
~��T	q�G!f��8��gfgf߬������}��aK�<5�a[�g:��bGGQGIG�!s`��<dHK��7�-�o��@�}>pȳ���9澭α3-O�ht����z��e0��+��Ã@P��:	G��ZgN8����'�p�-�o��m'�I.kB��{�S���k�Л�q��.&��%G(54o��ur,��a��:���r�;�:�S1��EOT����BLE�I��=v�[ο0Ci;V#"�K�?H��T��y�?ol5&�9����0V��t��DU}abë�o2���G�q
�2���R��XȎ?~�fԸt���-s�#��w=&���-Z��Q��i�d�NiFz�|��
7If"g�$�Y
�E�)���&8`�;��)RH+�:3�X�2�X�7g�bDe��N�]��B��܋�Q��ϗ+?���7�>\�����(���4�?�n>��Hob��A9YBZA�PK
��=#�\�=�VWEB-INF/classes/hudson/plugins/rvmRubyMetrics/railsStats/model/RailsStatsMetrics.class�VkSg~���&,�F�z�5@%���PF��`(��)�tIVX�l��
Jmk����N?`�	�N;~���7K��t��9{���<缗����@~#���cZ�y�FЅ�X�������aq��,ތ`o��#h�y6
~��o7�+X`��[2�fmE��E�$y���(�c�*8��Sp�uY�Y�K
�YߖqGƲHPӶm8)Kw]Õ�H*;>1292���МI_�$\�,�n�N���i�Igiq�<�<nx��'S7-W�t�M.�����.��lJ��ʌh'��G��d/�[`|6�`���8�ǧG2��#5�$pCK�U6\	���'�0��)	�2�m\+/�Δ>gш,��7%L'2��%=i�|R�@{~��I`�2żnM�ɐ>n��
�ۆI����]��рR�k�������y[��e
$x�����<A���=��F�c�^�����j-��D�Kl�(������$H�۾a�N�(yf�&e��N�p�4
�-����1vyqh�m�@��Xv��e�ܱͧ�AU��^�]�'ax��*��\T��YaL��,�`L��*>����[�bٴ�E?��S|��s��_���x������
C�HKѠ�*�oU|��e���G��J�JW��,ΰ8ˢ�$�m^	�7vڑx���;N��J�[E�غ��s���G�޿�{q��I�\(�]�k�M/�0���5�q�o|3�c�q�7��,4����N��u�v�W\?Jѭd�z�L�6��Ku�����t$�醇�B��J�!!��킄�
o���g��=�8}�1J��7F,"?� �\/��Vr�q�e���ӥK�Xbf���YD�
����մ����
2�����E_vyx�w�t��O�������ut?���!���@V'i��T U����w�dH̅ȟ���ߏ&1ڲ��54?B��6\ ������<�P���Q	�=W�_�����c�8����%�7Jc�1�q|6�V���(=������89�W�W�����;�,�	�m�E���c����7��?K���Op�*��C��V��V���hO��k�t�W���{DG-���0��7:k|��`�&�2XlO������?����g�j}��)#�(G4��C9ְw%#���6���~�6Ѿ#4r���Y��'�q���W�5d}���a��w��M�m����˞��I~����݇�b�x�	�pPG�q�Y��x6$��0���8.��0�Пd*8���r�tj�Pq-'Wp\�)$����Bm�d�1D=�m�W0)���D�h�娂��{�PK
��=\�+�ikWEB-INF/classes/hudson/plugins/rvmRubyMetrics/railsStats/model/RailsStatsResults$SortLabelsComparator.class�T[OA�f[Y�nK�U�#V)me�"P5i\%����m;�%�]���/���e<��@/$&�4;s�ߙ������9<� �|
n	iF��,�c^,��rG��(���x 㡌G�k;�kz��.CR�Էu�S��+0D*F��=���.w�����P+�cX���x���eX�6��k[��7�U���_�}�)�F�n�n��=Wm�un����U��
��a�������7��.Q0àfX��߬rgM��d��n��!�1,.�0Z!�Z��������e��N��]�SԛS�8ݯ��٦ɐ�<����cNe��W�r-�=�s<��2]f��9AO�Ox滀V����z-��l'P�'<T�xNp�#BN�h��nFR=�Έ$�Q0������ʖ�ܑQT�"ꉂE,)XF��.�UL��4����%[��(�c�!��MtN�۰�|g��X�.���3�`.�u��"0E���6�Gg�A}B��i� Nc�1�!Q��I$'��0�L���"�(�Ȗ"��!���=���l~�OA�9Z�{JJP�8i)J���% �.�'�
ɢ|�2D�V�d�v�*J��V`N~G�m�3B��8#�B���8�1��Pǃ�������'�&IJ.Q̍v�-����OD���#�
�<?��&��S�M#�9\�=J11��HPK
��=Qkʘ}zVWEB-INF/classes/hudson/plugins/rvmRubyMetrics/railsStats/model/RailsStatsResults.class�W[wU�&M2m2P�J�@�BӦ4r�,�
Ri4�R�6M�6�L���xC�x���WXK�ʒ�����wf�i�NkYW֜sf�>�|�~�߿���Cx�2�|�B��!༌W"�1!���0j�c/��x%A1eX2�!DpBƋ!�⤠O��N��2^ë2^c)^�iq�bxSgd�%�m	�ɜa��#Z���e'TC�r��G�5�;���fJ���e�S\U�SO����ԉ���dzLW���I8[�u��Q��x��D9�x~����L~,��q�Dv ?2��7�t�LZ�eƳ�Q-(\�D�=���iF��?�`R3m��M¢��{ӦE��2�\!ha�G��R�|6��"���ei�U�U-�
�IP�tNBpKZO[]*��%��� ,�ֵ�|vD3Ց�&��Rj�j�ŻK�[�i����[l@3��$�Иf���Q͠�%��";t�2-E�:�����u괟��j����aM�0�G�/ͅ<>�O�\�ԗ�urbڴm�;戆�9�5{�::��Z�9z�|H���J���$�o�E©;b�Wg�+��9K�H�)��Sb��i��"5���]@�-�ʁ��\W���&sSm����*d��*jiXN��Uih�DN7��^��km�D=G����=dy2�H���
\����]�jj�MZ�lj�٬u<-v��7��崈{|Iˊ��P2�7Rڮ�(���L��� �GyЌ�v��8m��+%,����0�I�D���ޯf5�(xge����+xG|�2>T��2-풡�c|"aA��$�o�l��	�>-Qk��4[�8>S�9��񥂯pQ��
���
�å����{\R�bhW�Zh��m��y�	��#�إN^���6��rv$Z�J!��'�L^\$wF[�J�O�eM�c�S���<�M�=4�M���"Ȣ���Jtμ����8^�D�C+���4n�z7�}�}*)p��O�%�a�T����-a/�]��Tq�R�~�e�`~�~)-RKi�=ڤ����ߟ&>�?�(�]��C�~Ὅ�^�v�{V����q
���+�������
�@�u��p����y-������hֹ")뱁���x�;��_99'\q��H��|����[]�u�e���^�_�9k����q�/]��W�*�W��/�E=�Jj^C=[�[ǹ��
]��B0�H	��\�� �%��<N)�XN��m5.�J�݊m���Uš�(ز��'��U�4�Tp^�#���)(�Z�Ma���}YH��;��(s
43�t�#�#V��&�^m��+�r(O���MZ�raur<�V�z
�|�
5W�ڟ79��=����ނ�?	7�9y��6��
,���
��C�P/a
H�_=�%K�*.$��t�����L;N
Fa�+��h�qh�}D'�)�uW[�;l���N��^BYI�ta�m��{-��]O�&�uvڑ*��Z
�;H��
���fj�1�g���;�f�����*�+�጗��<�\�7��O�\V��E�	��i<�n�*��l&-�{��w�1;�$<�	dy9�~O �yY^d?��d��yO +ʁzQ���(2�=���a�a�ޓbU)��ӄ�9/e��V�PK
��=W�H�ZWEB-INF/classes/hudson/plugins/rvmRubyMetrics/railsStats/RailsStatsBuildAction/index.jelly�TMo�0=��±"��R/�D����ͽ��5y	���ן)�V�ļ�7o��vvI/L�	�����c��TtDA�^0U�+v��G��1�D����ϧuH7C���s@�R�S�
�I/��w@�����i�K �ր'���k�7��җ�+L���;�� �K��w�*���u��A�vL]1�i�r�b=�8�MaD
G�
��-��ޕ�L���Sq�\2k׀��1�pE����4�8P����G���.G� ���$ok��q�h�`��+����c��Q�xݘ��]H��+���4=	�JA����a�Z�V,1N�i�J��T��2��䚵�+g>[׶���T��w�Cq��׌��8����Ujg[F7��s�'YME��07�Zwo;�9�,�þ�qe,���/6E[����H�`&��bI\���0��RS���oX[��g�rm۪�L�<���ew�}�)h��PS�q�f�жTMqaI�O�����O)Z��4�,x����s�n0���ij�\�#�\�P�6��&1�fg3#��$b�M,vv��*v�PK
��=J����-TWEB-INF/classes/hudson/plugins/rvmRubyMetrics/railsStats/RailsStatsBuildAction.class�V�WE�m�6$[�g%-�X��H�[-ņ	��Z�$KX�l��Y�)��{_�9�O�|�?�zg7����
>�̝;����ܹ����o�P
!���V��X�q'?�d��L2BD-����0��e�Ȇ��M1l�*�.|-c[�d|B��o����^�l���sK�|f�.Xe#Q��fX	s��n��*7�<-��[Yθ�(���X�3�]���@J34>#�E��\Ṝ�M����g75�%���M	3���إ�jn��N��L9��-fjb]c���Faξ�����sy��
�_~d����v!J���E�r��P�T,6C�Y�h0n�$��K�#>�U�~\
ѱ�N�\Ь�Ϊ+�D����g	��D���bҵ�i�L�Pb�eU7F��'��\���PT��U�o���d�!�ufY*���Zut�Yeđ"5�6BN5l.q�d��@�,���ת�W{�or(��L�I�H+i��˜�\�<��I��\CE��QoD꿟SM$�p"KW�dL�N�����6a�^-��w��m휃�P�l�y��&n��mcRQ0.㊄�#6d	9B8I!��Y�����{scD�b2

T��(*؅&cO��e�(+�ࡄ�e��[]'�rM)������#��ƾ�Gx,a�l}ZB�=�qm�5�_k����鍊���A�%#�&�F��v�����7.41H�i�T,�ʼn�,���Z����I����ʥ�]f������{�΢����Լ0+��b�MW#@�]��s�b��W��	V(H��fN�Vc�H�Kf��5\q��X3�}�lײH��/Y�JH��a�п�C�]��D�mxp�Vy��4�c㇐b�_��^\�����%�>�Џ!Z
��|p(��)(a��Q��g�u�h�D�=�QN�,d��g�<u�ɀ�pL� ��)	�ה'j���i�Uo]u�����PU&�U'W�Z�ij�ÿ}�@&��;�!oǟ!x����BO�"�#(�pA´?�?B��1)��^�k:0	�[,z�+���O�ғ��[/0����O�O�grAGi�A����(��X�w��7�0����x�›‡��>?�g�>!�a��)�)��H�GW<H�5��(��Sw�f���4]����7�Pi�GsQ]�?� ��Lj�
PK
��=H;i%�QOWEB-INF/classes/hudson/plugins/rvmRubyMetrics/railsStats/RailsStatsParser.class�WYpg��-i���I��a��Ʃ%˲ڦ���:nJ�Zv���k���X뮴��.�m����P07-9�i�r=2�0��'���A���^ϴM��w���}�_���ew�/
g$���p;2"$�p&&�gE,J�B���x�
:r"�m0P�ù L~c��E,K���X����CÇ��<Α?�G%|�|��`O�S��'��)�i>|����ϸ����?χ/�������K|���_�����cZ#�)�ac�	�1��٘��g�:��Ix�Ȩ��jj|_9��Y�00�u,#�(�΢���rn™_M1��2�U5�J۪m%&j�S�i1s@���W�EF
s1�!��c2�B�ckz"M���]plZ357}�Ds�Ro =�,G�-�0\��o�����蒺�&t5�X��1	�F���+n���KJ-�XPm��yJÝ��J�T��C�T;�e�T�|EP>�,�ͻE1t'�':f��&�
F����UuV�8GD����aC�Y��.X�0Bb��A��n��r�f�����jv��B�}�6kv��Ph��H�&U�Lj�^OQ��G<��t��r�2K3
!FZ�x�-��6[�n����Wm�du�~#�zc݆[)�35?d��*I�p�������)m8f�=�q�un�$����;qXij2����8�{�w��IA2#��ɸ���S����#l�jeӌr�7d|��,|[�N������9��f�D\��=</���\L�f��4#��&������ԩ�����	Re�F��9����,�e���������~.�2^��2~�_	H�21:>����?:�N2�n��{��*�D�<�O7"^��k���Z��l>��	��u\�q?J"^������"�2��-~�+�3�G2~�We��R�����QͲe��?��,��[.QM��_"{��m��)YE��>nt��x�ϨعI`rӀjq�j
�2�M����]��N`��
����nW$�y�[O��dUk���n��0�|��4���m�Z77	���HW8��]:l���
����P
���@jYVu�������
`S�"��-̑�VEn����e6t{����lH�M���5�
n��o/�g�"����6���i�c;�B�p���j��9��3̃z��"Q��?U:)r
��i8���Ȉ'�]���hd�N.���փ�2��6`Õ�����ۢ��Mh�Ƥ8
�{�iK{�����G��,�Շg8@_'w���!�BJ�]�K�,���u/Ң�1��q7x�vp��L����{	���Po���"Z_؄��E�U� ��t���Q���o�6®l�7�*!�m 8���:���W�-�S|%�T���WО(���8��K�I�B���/wTW��;	�:v%k�Y�x��{�T��}�cb��
t'��љ��:%�s=JH	tJw�u	{�`u���V�>/	k�ѧ[��*��5d[�!zJ�᷇��"�'%E*��S$_�q�V~w�M���:�v�dWm���%�L�B߃{���>tc?�d�ø���A��6�ELD�8}>�><�~<G�B�k�#迓����P��=d�#����nj���]������z��a�}"#^%s�0�^'j��ݚ���n�D���qIF���VtK�F؅�9��7Jp�$���9B��8N��ƿ��
`���'�2�4Q-�O���K�-�7��{����<�}h��b%��W��@���>���f)!ڂ�k׮�����K��w��I(�������WMw��A�t��az�>��3P�!W@�<�AZ��b��c��z7Ig�n4=L?j+!�a�8#�M���K�Y�+!.�����-Q�&�]��y��r��yW���H�I�u���ɤ��w��Vh��>��PK
��=�Nt�bWEB-INF/classes/hudson/plugins/rvmRubyMetrics/railsStats/RailsStatsProjectAction/floatingBox.jellyE��� D��+?�����{���]��a�_[��ۼ��f������ܪ�4CLNH\)�]ѥj����C��U��1���es�_y�j��cZ*KC�N|��y�@:mK����q��4ۉT�"nͧg<F��{�%�kUoI�#���D��N�PK
��=�Zſt)]WEB-INF/classes/hudson/plugins/rvmRubyMetrics/railsStats/RailsStatsProjectAction/nodata.jelly�Sˎ�0��+��Z��pr�=��bl%�d�t����^��mv��:Y3CrF��Ku!�����e[�)S���;*�#S�	���!��X8�c|�I��k�u���K�{�yC�)�i���Z[l�ܦ���:7�ԅ(.߆S�F�C+N��ZS���
�胩��m�2N�
���3��5h9�t�V0bG�B��#q�$/�_�\
��/T���=�
9x���xT�a`l�jg���y?���k�`��7m2�o}�)_�{O8\-��`1��{�~AK�A{�2u���6ᇡK+M��=�@3���Gf�����l���+���?�n֋3��9&5wc�.�5�����C&4�)�C�#]]��D�>�ٌ���t��{��PK
��=Y��VWEB-INF/classes/hudson/plugins/rvmRubyMetrics/railsStats/RailsStatsProjectAction.class�SMo�@�u����M�P(��Uj��ŕF��S(�i{��ڱҍ6��^Wʿ�~?
1�qR'����of޼�Y�������X��xfC͆�
;�&�l�ﵯ�n�� ��=�)�/?����`���y�.km���9�8"�v�S~IS�4�K�yc��X���zp�z����+e<�H*�lbfU�|ɢ����eؘ�2��z>�YH��q�2�����\]�FC-wX/�2(gw��u��j/�oYs:<�L�����=����r;w!�(�����N\Ee*S���o����\�O��`��r��"�N�
?x��F��2痪rl(���1�D�DG�s�+��Xk�O�w}5,��~��gQ���x������x�
�W����G�E�Z��hm��Y�,��2��|�_}�
���c���O����/�b��J�Pq��
��EO��-dK�d�"3�lfd��Ys�m3�f��fflF��cx�ϭ�PK
��=<�zl�YWEB-INF/classes/hudson/plugins/rvmRubyMetrics/railsStats/RailsStatsPublisher/config.jellyu�OO�0���SXRA����Z'��ra���ٲ���c�w'��T�˳�{�|SnИ����Tb,�����9u=˝AJB��-*m�M%
�����,f���̓��[�l2���ubq��\�h�`�+���}=��Iە�}Cz���Jо��U`J$����2B�'���ˮ��6�na/M����8ق"ׁ������@���Fa���a�
x-��Co�>̕��<QD���Vva\�d�>�ߚ@���|�6m��q�ż��X��.ƶ*e���vq�Wt1�7Gۈ�j†
?\��*x�x���B�gx�<dy&>�ü
<�x=�{��'�GQ|�9��R�y6/��y1�PK
��=��&�aWEB-INF/classes/hudson/plugins/rvmRubyMetrics/railsStats/RailsStatsPublisher$DescriptorImpl.class�S]OA���n-�@������Y1��`b B(�o��I;u�#3�$�O>蓉����v)Pjx��d�{�9{����?~�&���I�Z�O-xf�s�&��&���;r�a��m�ž��)uV*�У�C%7봘�}�����$�t(�H(���*Ű���]N$��#���2-��Kʅjk��s2N�cWp�gr�z��L��}&���Q��[zNA���Fɠ��2����Qq%�v�Hpo4{�v���ڨ���{:�0�O`��K�x3	n���hΎ����>��y���jwۼPKغ1��
f��HS�Y9b.�m͢K�&c_���0�9�4�
3��_v��XO�'�M��k��Jʶ=[��-YJM��<O���~X:�S��\9�-(�)��B3�����y��,bx��M���4�a��H`�S�WM/[�~��Ii�
5;�V�Ps��wS�PE�����L��}I��	sq�M�&��5ƪ����r����({���ʉ�#p��PK
��=�@Q�RWEB-INF/classes/hudson/plugins/rvmRubyMetrics/railsStats/RailsStatsPublisher.class�VmWE~&$YX�KQ��J�E	�e�Z-$�
�(^L��I��lv��l��C~n�8�9���;��(D
|���}�3Ͻs���߿��?w⩊[�)XTс��<SDz���M7V�U*
]�ǚJú�
��+�T�C��V�.lg�V7+��;y����2�K�J�����F�a������M�jX�漬��5]8F���0ݒ��Պ��W6
w_w&N�f�g�Y��d��5�[U�DdV5����6C4o��}��׽ZYw�x٤���]��6w�7�b� '���MBU�Ё
y�[�(�?�wl瀖K��0\�,a��m�5HKβlb5l��
�S��}�;�5W�;�|���<���U(P��]�s/W����o[�(�s�%��_��	��lx��	�뼖n8^#������+bQ2���=�0�N�1_��v�t�u�:�"}����D�8�뙂�xy�@Q��pHU<�ӫ�Zl]q
�N�W�F⍵�L&�ʒmWɨZ\x�7o�V}ry��U]l:��"��(y�aKO�y��R�����B����\�@K���#�&Rp���(��^o��,{	X�4�U�R�H�S�������Z�=��/2n��T�d�Jr�nC��:�*�O(a�\�^VK��l'���&�?R�\E���?%�>x�y����0d����y#C}�-J���v��5����w������*���O��ݹ��*� 7��P}�!�}.��&��w������F9�]����mc���n�/}�e*�,N�!|�n�jQ���R�3��7�����:1B#0iu�gb�����"�����}<��Vqz&�ѱ{����!b�c�wg��GPb3������v��_�b4���{�#�b�$^�'p6�$1��|=I|L�Y��|����-�i�1��`�x��h�5����>�g��
��q�:��;}���Mqq�x�3�N�s<���C��4��f��C�h%1�ߑxݼ����8�!��П#�4��Z�K��,��	�XH҉���|�@�1z��@�M�5
�i�d}گ����]�PK
��=t��DDTWEB-INF/classes/hudson/plugins/rvmRubyMetrics/railsStats/RailsStatsPublisher.staplerSOMQp,MW0�P02�21�2�TQ0204�J��+.)*M.�/�-*M�.)��K�)J�N
�/��]2��PK
��=�I*�8!GWEB-INF/classes/hudson/plugins/rvmRubyMetrics/rcov/model/Messages.class�S�n�@=�8�qR�BM6'-�B�P�
� %�(�C�8��hbW^"�WQ�(��Q�k'��}��̝{��3�����Ȑp��<��X�aU�n�pSF�r��w�mO���P6<��;=����,S8o���x�E��EnK�ݤv�Nm;�>dHk�}i�kq�9�q������)(S4�N����� )�m'`�4�Q+�\�HD�����֢��=��E���.5���!/�(M�"�rS���<�|�(t<��ft̞�ӵ����­i2��T��]��$ӷ��%N�����&�z�wZ�3Ӛ$���i���%j�D�'N<晟S��m(�Q ��o3�L ;?N#MA	e��ЉQ������
�eЦ}��_y~��k��;�R�6����~C��D�(�a�Ԝ�U���d���h�I䓆��R��ed3��crR��5�$�'kR��(�-`�_R]���;����H�t�ސ���F�2o�^L��Qt	H���ĻB^�@�o�n׫��mL:AnHR�@�H�qm8��d�����{������:K�R���PK
��=��89LWEB-INF/classes/hudson/plugins/rvmRubyMetrics/rcov/model/Messages.propertiesJ�/J-.�)��HM�)�pI-N.�,(��ϳ
J*qjQbz��B�A�B�a�F�Q�&PK
��=+��
MWEB-INF/classes/hudson/plugins/rvmRubyMetrics/rcov/model/MetricTarget$1.class��M
�@�_��V�z�\�"��N�Zgd�-x5�C�7�MH�G^^�����Q��\�^FF[]�B��u9=�Z�+����yyrY�>aq��ସ�*/l����=gT��i#~'3����/�AB�#���إg�J�/�d��
|��	��<[�p�qŬ�%�7PK
��=3qa���[WEB-INF/classes/hudson/plugins/rvmRubyMetrics/rcov/model/MetricTarget$TargetConverter.class�S�n�@=�ı1�&��.P�SJ�.PU�b�@�U�cw�r<�!�W�Ă���(aQEl��=sϙ������O�xaA��jyha�<1�e�)C�(���C��24��L0���X�Ϧ�P'܋鎥ϣS��¯�f:	�>�*�PƹP�P��8j�$�f<����(�8qU>��y�D�B�\_��n��
��t�_9���܍x��M�9�w.�t�[���/f�|g�Ϡ�<��j�x��p�X��h����p���u,3�QX�3�W�l�������s����ڋ}aؖ*p����r:�$�	gi%��`Ţ�T��L+��ҿ�v�J��P"�QN]9˒�ˏ�V�,^�T!�H��&eD?��� yy.Yzu�w�A�B
Wim��lZ�*��F�>;����Ys�+������*���X/�M���v��]k���ؿڨ�
긃�%�^kd�����I�Y��?PK
��=�n�|��KWEB-INF/classes/hudson/plugins/rvmRubyMetrics/rcov/model/MetricTarget.class��[OA�S�n)K�Z-��Ei�eATQD%)`�����]�Β�4�S�1|�(b4�?���t��%�˜9gf~����0����F4a$�Qr�+�1���垆�$���}
Shx�}Q��ۦ�q��ʚ閸?�*w}�2�+�w�"�x�lx�0��d	�p���`}gI��Zt�F���Q�x�Z���_�ah�o�UӰMQ2��Kܥ��@�H���u��y~e���������~k����S�����%,�Ad.�K���g���Ģ��-����:w�j��坢iLגzh��e�z1u��)��j |���g��o��#���;n��r�^��
*���]��Ϝ@lP�<�
����C������e& I��a�;�Qot��x��z8���6�!#��|�n����i���G%\GY�h��H�4ft<Ƭ�vt��K
�e���':���䥈-�5YY��E2M].�1*�?�Z�/�v�U	黬Jm�=C*�X�'3�H���F����C����d���eJɴ��8����B�I�@2F2���
�!�>@r�+>"���{��F�ϥi����n��E(4J�FBv����:��7������1�v2���aFq+��ه~Ze�I�6���ȧ� ��أ��C��υ�S�8v�f)T��J�4��-uD�S����g����ҴM;�6T����gCڀ*&���;����H�*�njf"�wWԄD���$�Մ$�PK
��=p�j�ELMWEB-INF/classes/hudson/plugins/rvmRubyMetrics/rcov/model/MetricTarget.staplerSOMQp,MW0�P02�21�2�TQ0204�J��+.)*M.�/��M-)�L��HM�)ɨ�)�C��K�rR�PK
��=,��*�
QWEB-INF/classes/hudson/plugins/rvmRubyMetrics/rcov/model/RcovAbstractResult.class�T�R�V]E�l��\Jc ��4ih���	�[-�4�U��-*[T�=������δ�'���:�[�–��C_�ek���:g��ϛ�܆���)��cc}�V���j��'
��4�O��+��)���x�e��2�`֞�Q��p��!ǎ8�sf~��<��񕌯%(���U5kƶO��z���{�U-e%N�#>:�4LW/�T�v�zhU-oM�`f�HB,G_%$���^)��^�M���}���`�+[T��v�^�9U�Ԯ��jMs��z�ՎI��NC�Pb[ۣ�z�湺�홵���T��BO��g�LWB:��a.|�N�.\x#�nX:Ӌb��.�>�����m�k�nKh������I�hM�ZO(T��LD��E#��f�U��&��ê�a�3gM�(Z�w�anY|哽7x�����*��"���;�bF�����Ì��U�(H�%@���S�1SJ*ʰxu�b3d�?̊
��iVE�Uz�w��*lTTT��*N����{y�	�ќtQ�׹[81
%{�R����{,ᚨ̈́}��%M?Ս��N�␸֡g��j�U{R9�^�i�]Ϣte�yj놹n�V�����D��%,^`����1/��T����-2���g��ާ_��3�|��\=���v���|By�
�i�c1pO�j�;ҟ�yޟ����i\��F3u).-���{��!?(c�F���q�f	,�;9���@��F��~<���)�;bQ�u��k�`�����KW��q&�g� ��|��M��K#�B#���P�<+4rKld(j�
q��12���\;��,����ϐ/���Ɔǔ&.��61��[Q��2B�=�Q���]�G9��:qn��8x�'�����-���Q�]��b�����Y��q>�
٠��u����j�$���5��M�7��j�vh�
�}����%G��-M-��D���h����a�}�M] ,'��#��ž
�=�Q��PK
��=tXtQ��SWEB-INF/classes/hudson/plugins/rvmRubyMetrics/rcov/model/RcovFileDetail/index.jelly�T=o�0��_�2�DVA֒!Kҡhѱ�ųE�"�J+���d�I[��w���,O�	�пVHS�v8,�Zi�	4vB���=؄38p9����D�A�o��ŰM�gF�ItH�A�v�t�^����KC�k���/`5�
��hp6)E��Y�jc3R..F�l�?��e����� �:����V���G�:z�6�AG%�m0	#���h)�y�Ugw|�C21n:��w��X��hk��{�Է��S��5?+m�]�՗��XJu�%\�+_EI��g������T�
$� �+�Ϟ��Պ]��(h���G��=2���'5I����
�2�4-�C�4�^ح�g�ȿt?�X_=^�\?�&��Ek�G>�.���/�p<i�5�iX�e<������3�|�La�>o�e��B�kEÅ��^�U���۫�ҏ�]ݔ�<~����w1\�ir�_�ʻ<G�<��eF��?�c|����X=3!�}�̒�W��PK
��=%�|i�vMWEB-INF/classes/hudson/plugins/rvmRubyMetrics/rcov/model/RcovFileDetail.class�T�n�@=��IH�t�-i�w1e+mJY!��H	T ��$C��ؑ��—� ��H ������tEyy���ι���?�~���$:0�@
��P��>|���qhO$b��cN�7����B�#ᮄy	�$,0t���T}�[�f/��3��Ӱ�p6U��Q�-���-�j��R7�\W�m�R+�cWӫy�DI���Z�i]��e��,n��ð��6t���b�ԋnyw�;�V!�b�<E�h:/z��dI34g��e�UrmG�m2DV腡kU3��[/s�Z��һjV�{*���q�4���
�Q5��8ͻ�hr�nU���*��Ɲҹ�gs�qz���`<�k��-��DX6 ���tSA�����֩Mi��VwTEW��R"�F�d�t�
�T���
|
�XL��1�0x��+@�G�g,�0-'�ƴ3)�$�~
ːSx�a���/�8�Fy�W�IC�Z�&��S�Ck��OO{�M��S
nTf��r�QA��v�o�S�����;�O�	���@��B#�F��?�"tS�I���i$G�6L�.����0�]�!�<���<���W2�1Jg/Q�3��HP�N���%�a�O��	I
� ��R� �I\&]$0J��D7��<�~:��j��B��F�=��xT��a/)?\4H�w�lב
$	�%�	Cr�\ �x��ثCH��$��$��YƉ�#G�Sj�/PK
��=��`��MWEB-INF/classes/hudson/plugins/rvmRubyMetrics/rcov/model/RcovFileResult.class���N�P���\��N���
�*���
U�"U�P�E��;搸r�ʗH}+�@���x��3�Fc��ۙ��ۿn�㓁*��`��G6:6ul	�}{!Z��Ҷ<۟Y�8t�ـ��<0� 	�-8����w�@��}J-i�9r}y�,�2<���8�wj�.�Y���H��h��E�o���GV�\���#I�J�`i-h�g�)<t=9�Q��Ĥ�d|��W��E�zt���?~gf�]]ƽiԠ��3���HFXyH��[L��iBG�D������<K�uš�ĩ[��U��4&�Hc(�
�u&۠�"/�Wv~C\���d�iM�f��[��Xy$��v����U�3�5��ٽ�v��Pզ��NڕM���ŝB�R�U���i���H=���� �B��� �<H�4kO����PK
��=�����IWEB-INF/classes/hudson/plugins/rvmRubyMetrics/rcov/model/RcovResult.class�Vm[�V�O)
-Q�BN�nm#:�K�\�V�
�	&)��?��>�u۵�خk�>�'��l{NC�u
|yrr�s�yO���?L���J�$��F��L/>E���b^½z��"Ϣ�!#�#�e!�P��8(�UI�G1�ౄ�%�2t�k:��
uKU���+YS�y��L#�-j5Cu�gx�Qi*WoVm�P6�fM3l��j���y�XZ�^+��0�\W
��'������&�Ȕfh�4CW2��Β"C_N3�R�Q�VI-�ϙU_Q-M���a���񓇳�gg�j��0䓞k�jԔ"�2j�ԑ�bi��c\fh����-�1-:�-�."��t����{F�9�L�.���/�=v�=��L-2�8���/�Z�|�8F	>I�V�dO%�%�NPl*�4��*�y�p%բ�v&Ւ;FtB��g�~x</�U��4((�:Z���g�]��M��GG�7����epG�E�︥伕�;�ŊfӪp/I}��zU�&��0��������"wd����'2������5�d|����-������u5�%h26pK�S�e�h�0�0Q��)�3!n㎌I|$��a����&C�P�fʶc����NmD�����z�h1�Ww��ꪽĿu�Y��f��$[�g��AD�p]p�A�����h�?k���X3L�gU��`��d&�.j�S�Z�^;l�2�,-�frk�啹�̽9�G�"!���z�ܢXԸ�����X4����)���P��iz1[R��xk�ܶ�2�9��_;k�v�C��f�ͽ���c1D�/���Hϳ��9�Oa�sI���it�
�O�K����t����$�_ !�(.�J���=�.�Xߓf7=o�|�g���Ͱ4���6.�Bb�=w���]DGw�Ft8��Ad�߿�~(�"��p�(�0Ft
NQ�&|H4��Of�H�$�����Ү��%���0NOa�Bona�>q��n���w��\�A�S�&��#����{�EJxZ�i?#��9��:�n��^Tg}Y�:����g�"z	{�K�d�y�,M?񾏘�	�.Nl#����H��k�ƕ�D����rqi��/n��{�7���|�yJ�ЊS���$N1�+�1�[0�f<���՟�PK
��=�g��>�FWEB-INF/classes/hudson/plugins/rvmRubyMetrics/rcov/model/Targets.class�T�S�h~^H��VA���O)��R/R������X�	�4���ꄙ�s7�|���9�:#���w��}��}7���?�0��d��0�{
�)�I�8���@#˜��U��b��,j�Qd�/%V�xW��G-��`������d����Z�V4ޔ*��Z�qY��.�<7��-�
�~��6~{fu|�Ij����ަ��k�߲:AA�X��T��\���rU����tM'���L�Hr����Z�a�a�5��Љ!W�
,g��f��;���W	�m�G�J^�t�o3E�#�f�b�Tݼ�ڝ��V�u���D�n�f'�	IʰA!���d&;[�s���7��gi�g�
���_�akU/�ֲ��%��:~�a=����^�e<ӑAV�*r
*:�#' ����X8}��G��lZ>��QEM�:r:�x��+���N଎I���?����_���xo5;��}�%�� �9�Jqj�����v<���Kf@Ԛom9f�*:���c�mƽ�Oa#�ҙ���ND������I{wS���+='�S�A�3�m�o��8�MHN���)!�8��H�%��h�=}��;i��ٓm��E���NGO@����ϐ9`�@�UZ����zd�1��b��(Sӓ���pS�;�#�tv�8��T���TJj*��z5>A��űiI��x�Ʀi��R�'�E�
�P#�t-fLR�8u�T�@�q^I�L��T�?����JH�Pq+*�a�R��>A�H��vqj�H9-Gʙ�?I����n��8S݁��w1��e�`�v����v$�PK
��=F��(��NWEB-INF/classes/hudson/plugins/rvmRubyMetrics/rcov/RcovBuildAction/index.jelly�U[k�0}N~�*
}J�
�bl�(c/�!c�C�e[A��$�
%�}�,ŗ8�J��;��H
���0��%�2�F�.��:�T�*�ޑz{J2ʏxA��1����[9wѤ�➔9kV���DR���59��]�j6�D	�H�p.al��,hs�����B��CR�Y�\*���P���5)T7��Aղz�D �qN"(iJj�	[�yA�N���KL����nh�U|�W������ u%T��c�Ҷ̀"�U��U#WD6L���Ƙ��́Is���7��"�_���w
B�B��l�hT*2I/���0l&�qR�*NGFmc���.ԓ�P�?�?qIB�4f�6�)l])�Ӻ�7�_
T�ނ��~�n �踧x?dz�l��s����q���/̄����A�䠝�_e*�����Kk��ζ��f.#�1M�{a�
�$��'�;(���0��i�y��%��~��{�8��zɦ��*>"��`Ý�wpJf�6�Bꙷ��w��;,"�Q�os�H)G��G��'�6bOo!� Yg��a��`bW\R-wҸ�K˛V�eIZ�{j���]��:M��Ėv����w{E�C�}����h��3/�[�J��0�0=� |X,�K�N�!:}*��}���`��x�PK
��=��3�HWEB-INF/classes/hudson/plugins/rvmRubyMetrics/rcov/RcovBuildAction.class�X�_����.���E� J�)L�� H�]����&i��Fgg��,���e�mkӦ��ۚ6B��/��I����33����~�s���s��{�o��ލ�ъ�R$��f8p7#�i���\Q�����#�hóq�?�Dž�8���>ç�8/�������>���<���2|Q��$�_��+b��q��ע�z��Fߊ�S"���#�2�n�݋Q|?�������;y�uܗ��g����2���$���p~lf@wm#�i:7���2��&9��urW�'t١"uF�֒y�0�)Ñ��c��ܼ�+�_�ܵv�>�g�����eX�{DA�ia_�{�qm-��f�sC!������p���K�g�t��6f�S�ʥ5�f2�aw� �b^{�v�]#g1�H�iK��\-25�-�L-X�_E�+��^\
5O�N ����Hz��5ӝT���y��°>��%�"Ӛ�g�J?��OJ�6胂c������]��ܜ͵XְN��JI��
��n�7�H*�^
�V�N��5�)S�Բ4\E8<�L͚H�Ђ5A�8�N٦/#��~h	�u^�2&Zz�f�tN�r���t�����Y���̳e�s
�Y�5�� K���3��4sM�Ǘ��ɳ�I'VO:�6e�6׼�T^�}]]ƙ�Y��Y����=-q��
�N�Uֆ?X�}��b�4��^��U�o-A1��w�k
Q�V�Ss���&IUٽ�^V/_�kdjc����ܐe�x�)���[�N=��8:��u�f=���"���27W4�y�+�nŽxl��"y�/�>�*
w��@�ݘ�s�@�����%YՊ¿_L�8��h�~I�ŋ*~����������);��J�����*~!��2�_��5�F���*>�a�o[�T��k�ଂ��|�B�
��(�T���*^�<�H��(~���������!�P�g��iݗ�Ww5�Tq���_�x�S�[Q���j퇧�u���͹�YO�����7�o�Җ4]*Xy�d�_��ehTе��Bc.�-��U_�6��'��A�+�BY��*o�bMjΠ~�[����[�dyZ��R��QP�Lf���Ҭ���RNz�t��nz`�g��VB�g�4Ώ5��va��6�|Kз��́(�;V-�ԫ;iۘ��Ԇ<��pf��ݤ)/��3l)��wCz����R�6[o;.&���54.��_�@���R�}�*XYK)Ŗe��Æ��Ui�^Q�����ZQ	BW��%ݽ-��{�ض�D�/��v�?��#w�ˣ`c��q�.Z��gH'�<�5(H�mM�R0�e2
����^�ZO.;�����?����¬t��>m����}z�/�ꅭ{������TJ;$U)
?��ێR�p��}�<�g�ϊD��D�5�$ڮ!�2y!tx������z'��|��������Q�.�[(�\�Qb;�.�5�0�H%�M(��y�!��տim���L�2�x��+l����x��&7=NԆg����%B�g�y��tD�#u/A��ty��{��j�Q6Z'⭳(�C�en?�v�s��.α���+
���Q4�8��q{~3NR*���r��#�ݏ��r㯏�0��L��rl�8C�~����}�9Dn
m|
T�ʭK�m�XIϬ�/�"��+UU��E��T#��J�Cʑ@�D^�巸e��4Q��m�����[P[8��\BiE���,���#,́��]�P3~������W�/"�R�MRW]�M��`��ez��tb:�fB=�3��n-�k#<AţN�*�(9�u��{���a<��璔�-��g�H�xTm��Y�`"΢N�l���<v��ݵ�9�uUY����/a�3x������#�};j1�Gi�e� ����n��\U<�	|��1j�:�1F�_�k���G����<��y4��ү9�l!�u��W��6����=�M2�&�-o�\]�>�'�i����@up�M���V�&�'o����=A1���W�� ��s�.�(�{d�dr��d|�H&�����!�	T��7���PK
��=;ޢͽ>VWEB-INF/classes/hudson/plugins/rvmRubyMetrics/rcov/RcovParser$RcovFilenameFilter.class�R�N1=NB7��B�\
�%\)�gPU5)� xs6&m��ݍ�?�P�R$�>
u�D\�C�V;�xΜ9����%�%�y���<�㭃�&��{2�%j�̓��f��j���/V���g������B5nPr_M*����Bo�zd��G;\K�w�L(���U���2�����RBW#�$�0_k�Y#�UpeM��@�[�Y�����!�D�\'B�<�4�y�Ôa�+_Ɓ-���]�|C���PR��y[q�CCn�-��}�����`��4f�2|yn�[���"�n��
���ϛ��6GG�(�Q��T�U��'&J���$�LϪt����O6G{ٗ䭒��ի��U>�!wj1>�^��$�S��W�
w���ΰ2��˹F��.V~#���ʎ�3KU�n�\b��]*S��Fl��l)�6ޡ�_PK
��=5����CWEB-INF/classes/hudson/plugins/rvmRubyMetrics/rcov/RcovParser.class�Wi`\U�n23o���%mڦtI�I&Ӕ�M�BH[��1	�)U�&����L�y��\QQA�("EA�	%
�Zq�
�}����2�&���s�ng�ι�=��Gp�j2у{��D�1��5p�	?��dx�0�2<`���=(��!+ð�I�=b`������
<j�1��Q�x�ǂ�x�L,�'L��)�ħL��iO���*�g�9�7�ո�e�� �$�|Y_1�Uk� ��7L|ߒ�ߖ����2<$CV�a��ߓ�����
�}�Q)~��e�������f�\�Z�/����U	��oL�U����{a��ğ�e$�����2������i�_��P�ٛ<�3��A����R�Z	;����vZ������}EskSW�{�Z/���+�G�u�h����I��
e��Dډ&���x�V4�1g��̐{=��a
�{|��>ޙ�K���v�;z0n�do4�7������91�R�:��K'uC�L,��K����ͦ�\Ҝ:��#�J�)�d��IG�vD��i�+����
;ƫx6�iB\��ә�C~�C1���q��rbt���(���oIe�̎���E!�$�h�3yTaQk2�_7�ƵE�:'ڟ����9i��d<3���^>��f}��)-La�9�py+�/-�J��)��
�}Z����{%�1�h�|���~��Ԃ<0m
M�Q���0�ó+p�K����܃t]S��M*!ummר�`oƉ���5����l�mO��Đ�{��X��‚���]��S�Ȗ�CP0��Ʃ�t����鶏9;S��nBm
S=`V*<EN�’���<�;c�������B�����n��y����.JT(��]�L��"W�&�,(�'�YBӚP�n;�X<-G)��=��wGW�闏/u�y
�$�c<V��P�w,b:�L<��ql�� �Tc	�:D3g�.s��oc
�#)4�Q�w@c�6�H�+_ٱ��ZH,\��r�[���0���
�p~�bAQ�*R�^�[ʧ��
(�PAK�(����zK�*�Re2L�a:\�WXj���0�@9R��)��nٓ;Y�4�&I�ut��W��*y4��*g�TK�Or��ڞ���	����Փ�슦���`�#앷_g�0�P����Zj��+,+�+n��P?����;n2K��FӉU<Kf}��T�
u����
�*ʬ��X�&2>-�	����Ŗ�RKΛ�DZj�ZF��vs�Zn�j��V	nBj���<o�-���x9���ވ�Uk��Zm�:1w�$��tS6�Y�.Ja�x����p�LL5Xj����U��|bwh���ڠ6Zj��l�ڃw�&}�hU��7j�Uim]�Fzն��P#kɶ��puc�̪W�
��R����]��P[-�����BrzV�*����+�힕k��ava~�ig�(h�;/I�j�٥]=YWW����������I��$�6SG+��/�����LѶ�����Y���<�.U�M{X��K*ͧ��$�(d�e������6c��9y�NE���{7�v�h_��.4�ι��5����`_#V�˫���gӖ	����Mq$���g�ɛ��:M�P����~,�7!��;I_:v
=�
mZ�R��+68$��[�9�${��$7�ãn;5w��'*�7H��uZNRGwJ����Ϥ&&żY�ɔtm�m��P�̜1~�m���^��P�|v�(�� �w�&��Ӣ[���/O��Gn'�~/>C�M,��υ�@,�Ǟ�M�$!��E		:�uv�����8I��U���M9af�Mr�S�LӧU�����	�i�>F´�p�G������Ң"�w�[�u�:Mu�We�D�]�j�U��I�h�뵺��ߟJf��U-\�%؇
�q���*�"�������6��?P�z@�9��Ի���
�r6ǽ�>؀��}'��8�3����UV3���+��w�e���P���2\������f<�2V������{�h��	gadl��dQR��eaG_����z�?�>P[S�FY�d�w��ep�3dn��F��y݉y<�UPH�0ʳ�u��N<�t�m#��)�S;���i�^��0۳�"����u(�Tb-C����&4b3va�Q�4�­���/��#��h�9��/FI���b0֠)��� �d(��;GpŔv�p5�u=Jq
^��|c��7�慧y�'�#^�n�$���`^�*{���,�)_X�h��Q���bI{�L:~��(������X�7V��*����j
ڼ����M��G[Y����/�l����'E�X��[��yw�I�!c#�xr����'��pD[�Y�V�>Q�8"b��q�q!r~��V���-_��,6��,6�A~���!h��=m����z�{j�dј���1���b�.�l/��2��!�u-����1�db�#.�h�)���^E������^4x�
��x���nƫ�>�����ʝA��V{n	�rK���5z�ڛ�ZFɷ�W�<?2�ڏ۴/�!�/�k��{�R�sB�X���4[�7w��l���~�x�<��j�u�%@���I4)��,w���(�"~�1��#h���q;���/.��ų�-/KuIq�0�2�μ�K�mf�\�|����S������b�.ś9���뀶��U�z�[�9���\z��e�j�y��`����,�$w"���H��,�oED�K�t�4�}��0�BO����v���ȷe%-����QΌXΜXO\4	MD�Ōy;=߫�|�g�q�FA#ᅪ3�{GΞ�]?E��M�SN��q�˽1�ܑ��	�Q�l��a�ƅ*�s����X⚵P������\��yg����_�]D���;B=�a+�����h�V���A��u���պ���e��+n&y��:~\zؔ#>�Rm�]��=B/uߚ����o�e���׺���w�����	���qoW�!��V�t]��u�$�b���]�#O��Z�	V	��{73y?�PK
��=�_3��	VWEB-INF/classes/hudson/plugins/rvmRubyMetrics/rcov/RcovProjectAction/floatingBox.jellyE�A� E����'�n��@1#��^[��d��fV3 |_�'5��{�1D&�4�^b��'0���
�n����I0^疩��<��k�jB\*�c�.|��:�dܖ>�(�1I�6��_��'�M��g�99BhEq~-DmAȎ5��߱PK
��=�Zſt)QWEB-INF/classes/hudson/plugins/rvmRubyMetrics/rcov/RcovProjectAction/nodata.jelly�Sˎ�0��+��Z��pr�=��bl%�d�t����^��mv��:Y3CrF��Ku!�����e[�)S���;*�#S�	���!��X8�c|�I��k�u���K�{�yC�)�i���Z[l�ܦ���:7�ԅ(.߆S�F�C+N��ZS���
�胩��m�2N�
���3��5h9�t�V0bG�B��#q�$/�_�\
��/T���=�
9x���xT�a`l�jg���y?���k�`��7m2�o}�)_�{O8\-��`1��{�~AK�A{�2u���6ᇡK+M��=�@3���Gf�����l���+���?�n֋3��9&5wc�.�5�����C&4�)�C�#]]��D�>�ٌ���t��{��PK
��=�7�6��JWEB-INF/classes/hudson/plugins/rvmRubyMetrics/rcov/RcovProjectAction.class�S�n�@=�8q�WR»4E��T�!4
�"$�P��t�n�X�T�m��H�+X!���(�ǩ���x1s��{Ϲ���?<�%<*c���6
4
l1��"I����=O�qX���ց'�;ɱ/\'��=c��Ű��{�lW�r�'��
�q)�;��\�/'���z"�-9���裛H���	��	�ҁ��0�g0�1��1�4�ƴ�(����F��S�M��ϫ����*ڭ�
���$�$�=�Y���&�D�|t�����۽�Cn�<��x�mR�g�c��(Tx��]���@J�g�yU�dgC�cR������^�J�}/��W��TiVa�̰���ҍBI����_sW�F^�d����Mܢ�I}:��	*�B�Fw����Y0�43�BY&�j��P�R�R�2V�iuʷv髑�N��u�nS��^�͔JM�z)Vʠ�L�:v�B�S��g����Y��k�鸋{9ٛ�L�C�ek��+lzΦ��ǃ�~�PK
��=��ũ�C	MWEB-INF/classes/hudson/plugins/rvmRubyMetrics/rcov/RcovPublisher/config.jelly�V]o�0}N~�euM+m��T]
�t��Rm?��
856�/mP��>���$�ک��H������k�&�BH�\���.��vF��� +�ޑ��V\�EH}�c_�ZUH��_΍�;�R�d��+��1�O�Z�D]�( �w�z J���\C�Jה�`�K�J�T�`���s��`�ƁfG��ĖA�`�6D������~���5�=qiY�	�[J��;	���¤���(5O2��=��5�3v�*��Y�����2�85�\��x�\�M���o��?�n	i�"#F'���I+��~n}^���,�|W�����2��kg�����8�V���f����
�����	�:&���#���w�t>G����i�'a2gU���[=�Hg��C��'q����T>���Y,�3�]��zح��Y|gIn��6��#�Qd��=���NO�N/�4ri�J6�e����1�i
����I�s=�~g�R?ҡ���G�y4
�
����ӧ㏬�
����.m�6¥��mW?iܜ�3�	%�9��,�dB#T&;R��=	��`�ʓC���W}x=�y�B+�T|�w�#���>E�c>��J>��x�ws�4�b��Kq�E��\5��Ξ��m��1��6���`8�0M����[�F1�����Ӥ��~�DӿPK
��=�iո�HWEB-INF/classes/hudson/plugins/rvmRubyMetrics/rcov/RcovPublisher$1.class��An�0E�h D"�,���^���	c%�\�8Wc�8b���dF3�'}��?�7�I���\�R��Q��^�n+�C��g[v%a��Ҹ�m�Q��L	�M<g���Z� |���Յ^KF�����B��V�S��!�_S�Zl�V�3��Us�`��j�
�!F|�x�=�I9C=��'PK
��=�sB�>OWWEB-INF/classes/hudson/plugins/rvmRubyMetrics/rcov/RcovPublisher$DescriptorImpl$1.class�T]oA=�ܶ�Z�k�@�,T�mj��d-MK0�b�e�i�Y��%���Dk4����w�<��"���왹��sg~���@/�H�n
)�jXK���S�#���G!�X�
9�9�/�lIC�aa�{�C�U���a�RrUs,��C��]ϕ��	zBz�
����+aӧ펌Cj��#�>W�I�-��R�;�����m�D��r�ESH�:\���CH�tm�i[J��c0�eCmV�l��$�DOZ~��{�<�F���1�JY'���idd�1Π��z���!�ԑ(����ĿC)r]���zB�(��vu����
6�KX�S�P�`�(�2n�x�:6Q��9m�$JC��Ռ��\X�������Xh5[U�C�ٮV_�6�߹1	m�R�̱d�hH���b�F���G�k�F�g�ɩ�¤�D�Aa��V�˰�;7��s��ʿg��5w��R1M:'��.�$]@t�����i,Q���
1�+���`�S�
?���w\b�sߠ���'���2�$����b
C*�O�J��U����'p#���[Qw"T�*"���ID�_PK
��=F�
i
UWEB-INF/classes/hudson/plugins/rvmRubyMetrics/rcov/RcovPublisher$DescriptorImpl.class�W[S�F��6�1
�%�WJIjC@$M�6�KBp�b�&��b���H2
���/}����ԗ>���4�L�Oy���c�!�x�Z��s�����������NÖ0��s��0�BWڑ��$撸��|��$�w`���’��RXFQB)�B�"4��7%ܒ���N�{.Cwa]�T���JAw�q���^1U��p����B���Z�b��n���Y[����s��5�j֦R�V������E�=2���w�!�˯0$�H�����|�^+s���
����+���y(LxU��vNsWst۳���m0�s�ɝ)Cu]N�O�o�K����U��F$��D�dYF�j9ނZ�ݳ�|�C5+J���
iv���چ�襄�#�N瞚�x~o8�d驦F�g����g@�0a�N�kj��qM:���{���V��I�6t-ȟl�!�~����EX�ʥ-�z��3���D���L����#��ɲ�9��-9�:�F�P��Jp�0��sQع��T�
���7�Bb���?.��uN�,��S�5e]�_+..,�}�A2(����O�/���ԦUOe8�8tQf�h�t�t%|�p�ٜ*pcp��"T�U�Θx�f���S�
W�\׍բ��
Ф���TѪ;��"��I�"�cO�\���Z�,Z�t8�Oe��UKa	
��q��m*h2N┌a�bhj�>���,C�ړ"�sx�%TdT�S���]�y=iT�:6d��8�7.�;���]��p�E��Y��(_�6�[������^$`��Ԉʺ���:Ԅ<�P�=������Ӣ��>���2�\�Y�`Q{b4e���!l�++ʃM@�U^M�U��ͪը(e�����J�yCL��8�BA�j�~��E˸dw��d�NӪ:?�c�]+�6��L�YA�x�1��0�L\I/�YzI�����8�b�C	*/��E��Ҍ*�C���
������H���_|����I/�@
t)����!��o�W0���C��Z<}�^q�m6��#�-L�f�/Z����%L�i����C�o#�)1����������p�W��YC�n���چ~C[3��
��B�Di����!�X�g�;�4�E�b�X��E�.$oD��/*�!����&�8L�L��#��~����?�I�t���q!1җ�Fz�^D��7�K��%��(.���
�#b#8��|B#x�@�	���.�']"�H�H2N�rݓD����Y����Om#��ݪO�?P�(H�R�pɧ��f�w1鏗�*�����~�G����t��PK
��=��X��YWEB-INF/classes/hudson/plugins/rvmRubyMetrics/rcov/RcovPublisher$RcovFilenameFilter.class�S�n�@=��q0�
��*�p
�[��P��H��C-���%S9�2���/�/`�$|��c[�����;��9g�=�����-<pac�E�M�q���V�:Xch<�Jf�j~w���O��a~ �x�OB���0�J{�D<��Z��*ֳ�L�l7J�/d,����ގRB�c���0ۃq>L�H�4���n~x)2-#JI"0:o�0��X�ճ�=�G�8�V����@&���,�j쑤���h���^�NC�q�i�:Crp�O������M���fp��\GfZQ�z|�aZ����I5G�l;��G�:C�?x��c���@Ddv�'��f����T�s�;#�h��)���I7g��^�M�������xH�KY@�>7�o�����EZE�#<Z��Kh�<��hW�mB�(:۵�������/���nvWp�8w��,*7q��|JѪ�a��)ǂ6n�fA�U�oc�b�v6�1G��(��
PK
��=(|���FWEB-INF/classes/hudson/plugins/rvmRubyMetrics/rcov/RcovPublisher.class�X�_��HZ�ll�c;���� Ǎ�()gM���M�Hϰ�jW^��w���ݦu��m҃����4����>����v!�#���}ov��̛��<�8���oQ�Ԡ�%�XF5^"6/�q/�i�r��+k�*�Z��bs���w���Jx�8�z�����Z�	oo��*ho����x��x���d�Ļe���2��2އ����`��a|D�Ge��L�e<����'$|RF#>%�J��0yF�g$|V�E0(����n]�fy��>�4��4�j����æ�MZZ�6��tFg�l՚�6���ϨSj4gkz4�e�CͰ6a�v���e��㓹T�4�=7�٨5�N��gn嶥%iKڣi3��Kq�:H���;ܝ�L0tV"H�2�׵�$���:A횡��®��jLD�I�1ke�u�%��r�qn���:Q��fR�GUK{��'5B�uݖ	�,�1-�G���e�0�9���|T�j���0L[�5� ���iMDϚ���Y��jF�V�G��.3g���ɶrIr�In�6�4C<�h�x�8��I�+���⻸�3���Rf�ID�S��oc�õkIe�@�-�t�מ�e�J52�jF�O/�h��ay���ȨVV�V,�9 ��x6��Kq��,�9��p��2�P�r�N���^��3���lX#&푈s�z��<�d��K.3�� αu'I�iU�=/F�꩔���p��
C�������O顺7�FT���|��|r��Q�H��e��I�Ӌ��Up��b�e��)e\�����wM/�7�m�õ�-2�5�X��Í��-ˈO��g��m
���9^Nݸ>!�*Z.������=�um��%.2����R���/<�.üD|�=�{]�:,̔�͜��{ݺ �E�� �)]�f�?�D!�a7�M�#�� �9	�S0�G%,(�<ch^W�T�8� ?����/�+�8�_�ų���*�t	_W�
|S��"O�1�·|ߕ�=���?�;��TQ�c�D�O�?W��R¯����[���%�A��'��H�	�
�I��� � O5������u�.��
iW}��?+��v�����A�蟂��o���"6��j�Ƣ�J	���H��Os�b8�^	Mk9n��"�Jse��멊.a�oPj[���S��Gu�a��h�`�Ɗ�T�6���^0b���$�vt���,V���nw�@��Ȅ3
vq��\^Ѵ�RK�/zU6�0�R�ܹ�j}�ۄ)3��Va�ٺ��Y_g�D����UΉ�0Mw
�[�3��o	�R!�� R��]�U�h<U�Οq��-W���.UQ�7	����&,6�2PQS��/<���B����S�j�K��&�bĄ���
F4}�ES�r*�ä��Ӷ��H��p6���3�f,r�}�q��m%L�.O8��eDa�a��z�;���vQ�R^G0�q���@����tS���r��~;bȚ�e$J����u_��.).$qs�kGѽ��`Sm�j:VT��ΐJ;��^2nPv5��uz�kd�ʺE	��nA
ڦ+�a�S�٣؃DT������!$FZ�-�v�=�v}' G�"MWPu����M���0|h�S�L��.7��N�Y� F{h�g/�o.}x.�%�l������|m�HSs�w�<yH'��^F̓�W�.@�}��6�i
�򸪺5�Mm�lk
"��n[�$b�I��Z���P�yW_��t����%�Վ-�u~��J �>܀K+��E�$����I�6�-�f�5���9G?9&V��-�ǭ�C�0H0���!<�\� $0L�$�#8	�tF�d�IZ���
c���)�O���H�D��}��|��y�`����P�*��v�B��<����I,���uy�>���;p�8rh
T����].`������w��#L,�ه�{�l!"�'(�U\?�� �p�0� 4z	�!�"K8L����d�AB�v�A>��wB���M��F�Y	,E*NcI�ۏR���{��^���}�ǚ��Xs�t�(Kk
�j(D��~)��n�Z���)��N���
N9
\!~O�+$M4�2�2�]���Tu�
f��:{g�������.�*(�
�fhEC����3UܧrK/Y�+�4[�I2l7ˊ�ͣ�\���
Rh������dj~�KN	X!bw�#v�n���8L��.H����W�����PK
��=��)�64HWEB-INF/classes/hudson/plugins/rvmRubyMetrics/rcov/RcovPublisher.staplerSOMQp,MW0�P02�21�2�TQ0204�J��+.)*M.�/�-J-�/*q�,�PK
��=���&�YWEB-INF/classes/hudson/plugins/rvmRubyMetrics/saikuro/model/SaikuroFileDetail/index.jelly�T=o� ��_AQ�N�j����@�%&�`ncU��4N�x��ݻ�w��J��2(���'���A��<��p����%D��LoQy���~��t���ء`�3_^�dT�IjG���9�w�Vv�x~r��"T�K��b>�	u.2�=#���]��E�hC�o���$ɠ�G����`���{준�kP�4.�HU�n����)J�_Y�$���>�����h��
P�x�`a4��5C}\܁��P�DN�C�>���hS�s�M|���af�����"��*w��J�$�Y퐉d55��EV��"F9�-�e;�p�i�ܤ�.�W�n��e�<gE�m�[��gz�V���Un�֎��b�w�Gn�#�6C�i�rبi�E ��ZmK%,W%P�l�PK
��=֌�҆%SWEB-INF/classes/hudson/plugins/rvmRubyMetrics/saikuro/model/SaikuroFileDetail.class��mOA�ۧk��j���XE�'>+�A��xH�!�ɶ]����~*MM�~(���U��������fgf�~����<��q	�9�qO-U
Sy�0�����<f0��9
����5<`H;m�2���MϱͶ���\�|�7�ׁ����l��\�P��hK�q�X>ë�o�
Z�Lw���օ�ʆgz\���j��FZb+(Ԣ��������3�͐Z�C�⚴�FЮ�-�[d)�9
nmsW*=6���]��U�siQ�����n�z���F����-�oFO`�:�����>G��x��'��x���X�`���-e���}nZ�n�5��-��ל�mK=�i�
�Q�Cu�0�0tV��Q�	Wtׯ|p���X�O1��&^^h�WN��Y�
j��&���{T��c��K~��J��f�ᝎ������6-�u�5t�ӌV,�yф��e�-��R:.�ZR��L���NC 9E�2��m��=ړ��c0c�	c��/dJb����)��X �0Y*Q�c�(��T�FI�cK�.н�I70_�$M����H|T�LhSE�t�*��$[�*f=��Y��? �ya"^%ou6��w�H�2G��Y���;K��8�x'�PK
��=�\
��SWEB-INF/classes/hudson/plugins/rvmRubyMetrics/saikuro/model/SaikuroFileResult.class���OQ�g�kaݥ��(����E�a��0�}[���K�����x�D���у�qf����z��7�3�>3����/X�Mn�3<"Y"yL�d�d���`U��:��`��-���s➹���Az�ƚ�f��i`�X��;�F=h����k�����z"F��ڌk��;6�hS�t�z�m��c씧���Uc�[����Gn�/����a��;��m�ԏ^�;�Yk?���2��s���8����������>��4f�E[݉�+U��&��5R��D3���M��_�,����O=��セ����\�.2Ţ-~���G~y����o���I����8�3ڗ�k�[��0#&�`�0D�')�Il�X:���l�דiP�m��1T��5X�#��!g�4��چ)�?�)��S�FHl^؂�EamaK�-�F㣖�s�jh���A������`n����[h5�
�׊�B�Tl)�'�(���e�/|�T�j#����t(w�D:��t�$-��� w� i��5�}@�Ȕ$#��)A�� dk&���Ȍ$+�L*Af� Ydkf��Ȝ$'��)A�Ar2Hk�}@��D�A� 5�.�,b��� U%Ȁ���W�� �X���$@��'@f�i~�E�~���t�$�I�8W{8g/9&Y��PK
��=��ćH�
OWEB-INF/classes/hudson/plugins/rvmRubyMetrics/saikuro/model/SaikuroResult.class�U[WU�N2dB.	!5�������ڪ-�B��h�Jo��C:�����O�ϼ�Z�������?F�g2�/�++3������w���o�	3�	��X�!��A$�p��x��x|*�qQb������.��uY���ѓ���p)�њx|)c]����s�!U�SԼ�hz~��u^q4Әa,iUCu\�3l:�w�m�4�[�;o�V���w,�b�mU{�Zf�fns=_j��*�]ݙ�#�Q�tT}Ѭ���2$X�jT�%
dT�-2��3��L�3H��65�/��2��Բ��f���몥��o��]�*�y�t�T�*wD��L�Sg��!�9^C��Ɏvn��iњ�k�z�xeD����72S��`������ �	N@4;����f_��7�=5�*��ۍ~?̜1�� ��z��l��-���;�:
<l��N?)S�X���
�X��#"wfA&^�B.���Z� !�u����7q�a�݃�R���(Hᜌ�lbK��
���
����D����#��˨(�W�����pW�$�+��}�
4a��3:jbd0�}�+�a�M�Jy��F
�	[����t�D��D�������s[�LÛt��_I��#=�+
2�\U�Uô��j�S$D(a�zϪ�!V�r�4C鑦�}��κ���'��ʎ�]Tzt_�l�0 �� �$O\��}-C�#��n1o��?ɀƃd#���"���0�}	���͗�
�go�[�[ ����h�4�	�mz3\�U?֏�9@��R�H'`X�q��\����'����T�`������#D����O-�I�@!��(�\qܡ�D
�	�x�(-Sx*�����h�ʥ��ve�/D�E
y��i&����#�1�Q����
�M��F�'˴+��w0v��^�"�|��E�μ�B�t�W7it�6Q�"��	�B��yJ��.�x�_�a�SOڸ�n�#B~�Ha}D��q-���ۦx:�L���N!`��
ד�@�x6[�hc�#v�C;l�6�{����]燝��K���°x#q)|��ނou�j<�y=�PK
��=ƀ���TWEB-INF/classes/hudson/plugins/rvmRubyMetrics/saikuro/SaikuroBuildAction/index.jelly�S�n�0]�|�cE�
�V����d�~�_�S��m&������t)j��{����XA��1��Xao�T�#�MB����,�Z>�|Qa"������=J'�Mt�3�rLAmD[����F�,�ds�GM�ix��+�M�4�}�R!�ǣFk��-��6����T��o�M��F���=~r�ˏ���vPa�Lt��yaD�T\��c�y�uh���Q�{V)��2%��
�6�X�Щ�I���Y����Ag!.�VcW�CZ5��z�>83}�<?Og�z�]o%�{�l�$.�WEz�AݬCw�(ۀU[�b,J=�>vO���Kb��Ν���k��K���9�{�f�+w��R�$��tH�e�=H����%xgwe�O���DU�[.�K�����t�<��,����2Y]R�+h�N���?����ݽ�.%�u��H$~F��X�V�u8��V���Z;����x��Ԩ|Ȳx�Q�]W_��7������X��PK
��=�
J��NWEB-INF/classes/hudson/plugins/rvmRubyMetrics/saikuro/SaikuroBuildAction.class�V[WU�N.$�������J57�U)A,Q4@%@+v��d&�6?�_|𕮥a-Y������̄)_�쳯��g�}�Ͽ�
�=<�`���'!,D�ǧ!,��1!�2X
c��W8�q_��Ak���?\�I_Ep�al��uOB�lڪe2�3%�`�XQ����_^�s�%�2��)���g�X��*f�ݪc�f�V4Śa؊����9�2����V��eb�7s$`��Q4y�.�dcMʩ����yIݐ��=f�*)����z���yK�5�+���ÍVY1��_��1���N$fȶ3�5ɲ
R�nU=G���V��yɒ����v3�{�-EO�yT)'�}n�W4��3.[XԨFs�d�2�;u��\I2�u�F��s&1�f����Q<m!���J���JZQ�R%�b����ǰݲ
�C�/}U��J�A�5q�EqO/���,��TQe�dκ*?�e�z��Y�5SN�|��v�<���Ž)g�4.s����vZl���*ڞ3[�#I�!lx0ܽP�ݼ��YQ��T&þX�i���n��߬���G�ν���궑����"c��(�����wW��[��śK�m���!< ��R��[�:���T��U�GA����v�!M�(c!���Şet�e��3/[����+t��`ؐ+�A����[��O��	�Z�M|<�c��ߴ�����5~(s�g2k.j$�?ѱĒ�μ�K��l�p�?���$��5�p�C��!�+�m��<|m۷�&�9}��2�M5,�b�xbgob|��S�
򋕝s4�I4m�q�[lz�C��{�ͼ\z��|��z���7��v�����s����x��7h���O�D�,�������-�v;�~��K�I�aW���C�\ ���|x�h����Qw����.b^�i���#�7�$�R v��f�gt"��L����72Z����k��JC�R>�l´�&�Q�#�=��&(H�$q��"B�(i�x`/�0q� �:p�3~�Q�9� �<�D������#�t����Mz(PC�T��7��P�}���QPIA餂�;�k�r�3�}�
y�Hҍ�?q\�	L��9�L9�L �iʑ�#�p���ʵ�����w8�q'�{N~�1��MLN��ojJ/�g*z�A��w�x��8�����!Ik�dA|FG7�/PK
��=������IWEB-INF/classes/hudson/plugins/rvmRubyMetrics/saikuro/SaikuroParser.class�W�{�~?2�&���D%.��l2(� 4�Hjb���jq�;$#�3qf�Z[z�Xz�I[z�V���FMk�����z�7��e�Շ$Of��9�y��o���.���O�(n�^�*N�hBQ�Ό�Y�p��$?N��ձ%~x�yɜ��TBm�T�5�ѱgu�ü�Ϋ���/����n�3xV�U<����/���:.�+�����؉�k���o����;���y�}��^�%���4��A��;?��OT�T���8���?i��L�7�:�=0<[.��g���횇ˎ[v���`����r�&nv<{�\���Ikڥ��_��V�p?T�Y'ػdu�-�8^hgJ���;
�Bh��s���D�����	��Gk̊f6��*��	4��HͱM��ׄ�1��V|�vXv#���r8J��s{.r|/T�s��e'C�\9���*�ӗp�o�2���u�k��q[��`Ɯ�Jn<bV�'Os~@���.���М��<�؈��8f��f�*̼�T��pBI���q�(�̾� �(:ύ%q)�j
�r��(ͱ:XCr|�?+p���Zp}	d�-�u��[�#u:�)`8
hg4�֍G�"����K^ҙ��A�>*�^u,�8���>�A���"��!���[���^�%�¯
L�S~��~���£~�?l�#=��ij���������y~���f�X�>��E�k2@S�pfF����R'��\Q�G�K^�e����i]8�#��v��E��V��"�~�+�3^Q񪁫x�J`��!p���Rk~�A�`������uo�"pk�X��-'����UP񖁷�H�>�L�_����M��w�u
W6D�{����y�<��:n�l�]�VԔ��v|E�n\{��5ٔ�J�혌��î�e�Ґ��2�W�˞l풚BX-�-\L��GH��F<&�-;Ԡ��%E����ή��0�:�W�L�R�c�rq{�Py�n�t��sQ`�A�e���V4bE�R���">�����9Ohə9���&�Ҝk��!�lE>'�Ώ���/E0*��-�xb�ѩ�Im���څhȋ|�5q���+���$�AOG�$�X���"�)[W�mk�H�T�\�`S��m,����V�Q"!���>K^VⒾi��k�!�g�V����=��P]��d�T?�����|�s�yl�O�~�O
�{�y����h�,@��o`�k�݀���$��Җ.�����q�Ks-8�Cd�[t��N:�8Bo6?�Z@knMS�B� u��Yn�C�9^X5܊������4�Pb�?4���<�u$��@�`�h��}��I�Z.a�ҟjO��et�s�J{�c�l��/�����#�h�Jߘ_@������!��؁]�Ѝ4�:�':���$�}�=�z/엁�;b�uCĜFk>���V{0��-��8�p�X�I�T,���1�*t��+���S�s��g���7-����G��`�h]D�T�s�\��[��m�n��˴����&��I��N�[���*��8Ax��R�i|�v/!�6}�Ĉ+$E3�Eɸ����{�hO��x��������6U��=�ܯ�9-w�w��t�s�'M��+��}r�Y����~��S�&�M�<���R��
�p3%���C�'=qZ5"��T�E��I�1)5c��)�|�H���'�/P��S�L�AR�I��,��]�t��sD��K�O��6<�'h_Y3aQK��5�\����T�PK
��=�N��\WEB-INF/classes/hudson/plugins/rvmRubyMetrics/saikuro/SaikuroProjectAction/floatingBox.jellyU�1�0Egr�(���Y��MJ�W���ۃh�7���,����6����Z�]M��T��+MlpT�P��|��<�JC�k�fVB��5��C�XK�P�4WF������1�>}{E/���>z�vL�����0�r��WɁ���f�3Jr+݉F��t�
PK
��=�B�0�$WWEB-INF/classes/hudson/plugins/rvmRubyMetrics/saikuro/SaikuroProjectAction/nodata.jelly�S�n�0��+c�Z��pr�a;��bl%�dHtR�迗��Y��:Y�=���\_�1��<�O��X�kՆH�&��$82ŝ�;n��_=î1�s��8�~VZ6��l
~:o�9ġ8嘚�5�&�����?I�k���f�s>�G�v��6-�U�B9�df*�k+�'��oy�N�~{qR�1\���F��X$giDO\��]<W:���p���_n�΂EA�:Ɔ�6�=���r�Dl��w�ނD�v��a��<;���5ACI�ޓvW�"e	F�pw�g���W.R��j�*�P1����3��<4�c�����PQ]-�JI]��͘��-n�e�O�샨�1Dy���űZ��[C&T����a�?qP��KZ��ŝ�����
PK
��=�Ã��PWEB-INF/classes/hudson/plugins/rvmRubyMetrics/saikuro/SaikuroProjectAction.class�S�n�P=75qb�WR�Q�"�6HX�PkJ�PP�v��ڱ�[ۺ�+�`�Ă�c��r�*<�Ef3gf䟿���OT񨆍����ѱ�P�D �Cg���00G���};N$w��2<w�do�A;��r_�a:�]y�m��f?t�ʥ��
Ԓ33X��O=Ħ������H��f���T�栰�߾��0�cУ`ؘ/��=�bM��@�u��7��JV��m͕cu�YR} ��'�$O�o8�ȶ���[G>��m���7}x�4q�w"�"�E����Ǵ��TeR�g]i��������&�K���A�J�}'�+�_���Y�t�hp��)�(�tq]���?�4��ߞ�w���[��e?
,���l�l����W�`п��u�2p��v��s�*��LL+S���X�b-�+X#�尼�+�,�Ҭ|�lV͡żQ��F+SHF�p���Y�տ"�p��"�Z�f��%6�
���*j�x�ۇ�PK
��=�3HC�sSWEB-INF/classes/hudson/plugins/rvmRubyMetrics/saikuro/SaikuroPublisher/config.jellyu�Mn�0��p
+����
z�1��$�1#ШwoI�j���nid>�X��v��m� h2�ZhT�1J\�'�~�M��h؞aWSCy��Y�w�/�)�)�j�+s�njѫ��������K�-��#�Q���QhS
�7�l����4����PWUj�x�#��:e������򞔷�t
?�m���C'PݫtM>�P�PK
��=�W�ݷNWEB-INF/classes/hudson/plugins/rvmRubyMetrics/saikuro/SaikuroPublisher$1.class����1E�<������[Xl�^,���5�Fc"#�k~�%/bg�\�.g����I����.�R-�Q�A.�!x�	��\+?�ˋ$��4����Թv�]¬;vV�L��e�/�m(���uɂ�(�M �V�*?7�Y1!{=F�J���*τ�w�l�?xO#
15ъ��߸;�i��+e�PK
��=�~��:m[WEB-INF/classes/hudson/plugins/rvmRubyMetrics/saikuro/SaikuroPublisher$DescriptorImpl.class�T�SI�&ɱ1D�Q�N�<���ǩ�AJ���,�f�1��3���O>苖>X�|ԕ�?��,�a����oz�{�?~p�.�p���.�.�� Y��P�uX��00#}if�Ca>X����r�u�Z�G�j3p��ƕ�י�`:R3-�*�@-uC����B�{\kA���N�����-}m������~$����5���
�V*W"Ǔ�#�^��p[�� �Z�@�eޥFj�������"F�M�!B.Hz|;ŕ��CO�i�#�]QI���sk#pV�C��g�[�e������r�.Գ�mw͊
6�k��v�%�>7�"���9�!�w��,��p�%��Z3Pm{3��hS�d=��(�|*^FB�F���/썘������N�X��6�Q�J�d����/�]�3��Z.��W��|m�ós����`9q�h�ܫ+��*����zS�#魷�w��S����V)W<��L���t�a���W�2J�M��i3�X�S"�[A�� ���Lgq�a��B���jd�.���������2�[t1�a:x���;�__�.��^�[��?�ߏ���J���I���'����V7�#
(N{��[�s8J�I`0DZ9š�*I���8.��}�j�M/| 1=��8 ���<0t'	��E�8�\�u�؉|�D���,2�N�4��Ɩ_H�5�ϐF��?"�<��ե����/X�k�Vc)��U�,�%�
��w�'�@���9��B��b��59u��~�{�ȭ������^rB�g�c2�S8F�JZ���t�	�8�PK
��=��a��GbWEB-INF/classes/hudson/plugins/rvmRubyMetrics/saikuro/SaikuroPublisher$SaikuroFilenameFilter.class�SKo�@�։�`B
�UJ[�)��! �%�RZ�z���*ٲY?��?q�~?
1k[}@N����o�y���'�
�wac�E
�u�r���V�:��P{!�L_1T��.C�
�|_j��M��@��ՏB�vy,�^��X&.?eq�F*��D�LE����Z�=œDl�?ΆI��}���N��`�>��D�0��/��e���XīS黔;C��2�x�=~�}��-4���u;�¡����B��i
���]0��f�|�k�j>dx>;�;��84���vC�M�
�q��)�P~�B��Ӊrp�k�u�eo�=�(ڧ�{�t��τ)&C&�9�*��(=���x��d���'6��C[T�e�K�K�O�>�ﰾ���y:k��t6
.�	�.�U:�&t���U��ꗿ���K�t7�K���;X@��ZR>#i�����1��k������71O�E7˘#�+$Ѭ�PK
��=�o�.��LWEB-INF/classes/hudson/plugins/rvmRubyMetrics/saikuro/SaikuroPublisher.class�Wk[W~IX����H�z׆����* m��� /m7�1�lvӽP���~�ڧ�<O@T�9��@"�@���̼�Μ93���ǟ��g1܊�9	y!̊�m���itG����.�I�/&d�@�}(FIPe�FA�;Q��PF�BfA�&�nIx$aQ��e�0���U��6C�8���VuLk�R%��yU[t-�sC�pz:�b��'�����t��Zv�-٦���nY3씵Tɹ�'7�ciE;e��k�-蚽��S�ֆ�G4CsF�n<�H]RS�j�Sy�1��s�Y�������J�[�jA���Y���s���y�v4������ū��k�0�%�X�5���4[#�i�0��L��&��UN-����S��Vun��UG3]��!!�r��>IUn=4�
C6^�[!g�T�@bj�s5�4\�˪�Q$�=��f;��u��.C� ��Be��@�=/���K@�:5���ej���a����-�/l�S��������|?���-�P����GċW��%��Ƽ}R����5�H���<�ȫ^�I�H .ѼV6Tǵa�Uy�Υ�2wf,�/:��X	Ć���k�KU_��Hk�-�`\n�Óڌ�.rk�1���%�^��H�^]�"��-��4J����P��Q|�HQ�a(.���7]�(�_��u�AQ�ǔ�8����ʛ'�MGqLA+�@I�(p�$�������O�\��R�W��j�N�@�F���N�
~��tC�Gk}���L�=��W��.��!�Z�S��Io/�kt�ҕ\�t����V^���O@3S���V��w�sg��.�ˬi��S�{��l�v�V�1��s^���@��U|K]t�B�����{6x#��xps+T��!�a0h��Nҳ�2ȫ�����]�M�d�n���Iw-Pq��7����A�3��ԲWd�EN���&���L%R�O�F���Ղ�n�w�U[��_({k�uMO������*�j����:]� e���sTk��;@���D��Q;����p�fW��FO9��H����4k�)�� �8�(�4�z}i���7��@��9��z�+�A�|���<[Ax(�H��/YF�2�;�et�@�DBOW!�Ӽs`�P$I$c�e�
�[F�P�*v�'c�+��HjOL�{�p'���<�g�(ȰL�>I+���y"�!Z�D�R�+9�Xݕ��ޤ/�6ot�tC���[�@�H�6����\�er{�B5�aH!%���z�i�;xi/�c���xpӄ.,EW�3�\��gug�=��uq���F1Ag��+�h��N#j1��A�	�g����{�>F8��1nt�	#K;#`D���r`H$�ML�'=�@�*z�Wp�WD�{��1J"���Ȼ������с��y�PK
��=��)�64NWEB-INF/classes/hudson/plugins/rvmRubyMetrics/saikuro/SaikuroPublisher.staplerSOMQp,MW0�P02�21�2�TQ0204�J��+.)*M.�/�-J-�/*q�,�PK
��=�}E���DWEB-INF/classes/hudson/plugins/rvmRubyMetrics/tags/floatingBox.jellyM�M�� ��9��m�GI���܀����MU��%iH��э�h���C�v�Z�*&�7��Hr�jCW]��>=�n�3f�
��i��~d�1�%��6&_5W����J�k��^_��:��,�O/����D�5���O�B���:�*3��e�L�}Vr"W�}�K�^�(����(��9j����-�W��,�IN.>�N,f�f��/��
PK
��=z�/^#�CWEB-INF/classes/hudson/plugins/rvmRubyMetrics/tags/tableGraph.jellyu��n�0���)�jRn���7�e��ILd�*q��Ļ/�$��z���_�;j�_��Tȅվk��J
�$�j`	}6t�5�+��5��V����E����d�����.������c�gB�4����Ǵ=�#{��d0�Y��[ղ�A]s�0NUw&l	k	#(�L'��ڏ�uq����,_U-�RW�kD̋nx` �~�f^�~n%�HV3���,�#z��7���?'����N�-�"����1�=�C�yQ�B��N�?�8O|\���e˼}y�2s70��L�z�PK
��=9WEB-INF/classes/hudson/plugins/rvmRubyMetrics/tags/taglibPK
��=P	�/�9WEB-INF/classes/hudson/plugins/rvmRubyMetrics/Utils.class�VmWU~.	ٰY�"�j�[ �ZE$mնTѴ Z���6{���`�)�����9��ǹ�/rs�;;��33����?��1vu�aZ�(>�я%�H`E
t�0�C�>R�K%���5kx�l�j�ӑ�3u�F÷:��]�+%Cx�ᅆ��۵�G�ln�!�DT9C�d��E�^�lV���e:����X
�m��Ni�Q��[�F�v��ܫ/5*��y m�/����u�Ǘ�'d����T���ڒ�̞8yf;|����s�,�"�O���)�M�d�w�<6tL�VX��n��&�������gZ}�B8�rҵ���qD��W�a�"UHr�-Z� 1�[³�O�.]}�Ž���a���?���XIXTi�x+�$Um���Y�v��6DE�o�S�/����BG������x�@y?`�2�V�b�a�Z���-�qE��
�:�1�#֕�0��4l�	?S�vP�"�B��t��a�KN�8�n����3��l�n5sBRFr����(�������i������y�Z@6��W�hz�m�&,ۥ��tp������4S1җ�
C�%Q���h6׮�"9(7�ʡ�y�%��.)[�þ���@�T#ً��3�:��A���!�R��+m0{~f�n�C��$���ҷ�xY0���Br�4T�JU{���{�����g�N�#�0�[f`:sR
�[���&� $8�h3�ݲ_�cٮ��Uܢ/��_L
.��t*��h�8��6=x�d,T�x���2�
ܤ���Y��7ɮ�����T>��A�A�#t�i��1bH��	����	��"G��n�vQL�>JVSa�|+(�"�q���&"��t����=��G��B�7ѧn�&M��#�O�ڬ��
)u<Br}2��P����i������:��$�F�"Ճ&މ�8���=l�k+�i�(��0L��B�"�Q�����Z'_����Ezą��e��L������K�|}D�b*�6s�͜l3'���c����'�O9dTU��PK
��=i����WEB-INF/classes/index.jelly%�A�@B����ij^�0.p��̒�{W�V:U�Mi�6�sN�m-1e����
���q���e�`���"�EVé��Ń�RTZ�*5'�¹�p+�I5qw;���1и���Y�̿$|f(o�U�t���PK
��=J�@.&C5WEB-INF/classes/META-INF/annotations/hudson.Extension���J1ƧZ�/*��S�Aja[�nO���M�?�ٵ�����7��M�"��5�a&L���7���5��3�sk�L(+Y��BkC�pܕ�P,Om귰-|ib�	��{��
	���Ԓ\����E;��B5B7��	j	4*.K����l
b����٤{���e!�g�Ri9z�N�a�B��!�,�l�H
?AGм�f��z0�ICĽE�h�V&�/��'G���H�̍��q2������}����c���#�IS��P~��2�o����¯�r/��A�rS�4�uD�PK
��=.WEB-INF/classes/META-INF/exposed.stapler-beansPK
��=���V�	beWEB-INF/lib/htmlparser-1.6.jar��c�(A�.Z8e�U�l۶m۶m۶m۶m[����LO�]/VFf�_��_숵%'	���������?�����?a��a����a@�	��VT��)������ln��M��(CG�~�l��o����4ˏ�]��fk�pw����?Za�@�GP�FO�̢:�C��8�ϓ��g�I�;2����["�8�6�1�ӲC�h�+G�Ͻ
�#Cq�V����i�@����<�(��Ub� �R�������h&��g��d*Ǝ�gH���ϟ��;���'�e���i�`J������?fN�Vv�����9�`F�Qjݿ�.!�;������ɘ��J��1[��UI�'��4;ӈa<�	��>	\0�?|^� ��Q{:��T��R���pu���G��u�E�F���M��x3�$��\ʏ_�kwj��ZM�U�m����u�l�)O���\@�\D훘d�X�X�Xc��^�J#�Q���@47�y`Dh��I��J��%��&a׍<j�[�G�m�KH�m�[
خI���W��!.W�a"W�#�W*�W�)��'U��=U$^��A���X4k�	X����9W*����k�v).�M�����z%��_Z�f���sg�	<��s"N;~qd�t��HΆ���z`��+n��Ê�"r�<�1�cO��3q8(�W��x�KUYS�JI�2�S/�d��g���g��j����ٳ���˛Vj�|��^-q�w�`�I��iy��B�U�P�0ԘY�(�q�D�4P�qP�<��2접kܢ����(H
@I0i���E
%�,KX�B�2�b��!�&f:�9<".�oL�ʗ����>�M�+e�����Cڰ_ Yx��&�K���d@�5_??kC�Rb�=.(��q��$e��n�r�$f�֠H�\P����6
 �b��w�a���v�NQ^�W������D@�T����t�iZ�ƫl��T��c���%�.����=o��j�H����+hѨ5}�፥-så-[� Au=�i��H������~���<�>�;��G��p����$�N����=B�V��=������9��[yD��5/L�Um�u��}X�
���W��h����ry�
�B�Ai�mI�5>�,b��SSJ��Ug�d�g���{k�MƸ��`˶�Ŕ��4����%P���u3wa�}�Y	��h~*���A���=u��gvy`����iV���2݊��mq�E`�2hL֌C�"������-�S���z�.��)����|2��H2�֩A�P��<Cܚ�E��j"�=|��/HZe��hDD�p�`�}~��ŻX�_N֜�+�K�8E�-�rNQ�$#�G����l��Hv��wL�Z~�����)��qY���T��+��V�2
D7�Qc^�;Uf�0��P�U�pa�h������g��h
`��
�-�=�"E�P����8z,#�k�E��
oQ�)q�m����I�"�aYa[��U�,��²��2��3�������q��;t���YZW�n)�֯Bק�5�w�#��g�D�tF�Es�E����	9��ר[S�k[���k��滻��#��m/�Z$a
`�D�\��f�5ȅ
��>�|���r�o��:�M=�46��[m�W��zh���L@!��L�E/
;j׌î#��o@�^>	�$�	�	��	�M�t�Wb4��B՚q[��rRpB��b7t��+!FǗ�D?�}
	��9�b*3��B��רD�
AFg�J��_ib>
��7W�q͉x�6��L�d�K3�;(�������E�uS5��c�ٓ��e��Ԁ�Ɉ�Y�J�*��� -��+��.����E2��
����C��K�V�]4>Gj�^�D�b��l[��6���C�C��&~|E}l���,���5O�/��(���R+!NZ�^.zG&��f��C�6�ۄh���bz�\�se��&r�E�ĵy�k7�lo����ގmU�����G!���װ���毠�_'�O�;�LV��+��ڎkg�t9Y_M3�
�����?�D�`,����a�N�T��?F&0�g0���GaW������C#-�W;���޴B;d!H����mrN��kW�G�E?<�3)�f�@��s����l�	Zl#�N]�:�³�
XcƸ�H^	�_�?���&�R>�Up��كJ�����G@��L����D�+��n�	�rO~�cgw��������Ѧ�C�7ٍE�Mf��?s�g�ϋ�t��K��L��7=)*��C��%��sT��K�V���Z
HWmƍ����d���1���{b�O�_>i{�M�c+�hy��4e�e̗#<��� �7^����,͟k�B�t�r$��њ��<b6v]1u+]��,8���wqk�Uo<���V�?�j�lB��\a���3k�<5�<9$�t�I/���x;E�>�*�2�D�l/Y��6��\��i���s&�D�F@��9{aྣJo����'�X�[Z���)�DJ?�.���~pm�	�~�Dy��L�_��:�Y�H:�i�t�L�
�0N����������2�ٷ�8"�.pܜ��~}>�n�\B�H�!��Y��D�FJ~�tM�J�G�^�dm���GE@��~�E>5��Ε��\�Z]��_���»).@�_7��]3[�ze�
�����J�Z�P=����њ�mm�2X�$�m'��\Ǧ�ެyހ��G��_3g\oN_ss{�1x����r�7�T�#�8��[�	��ޛO�٠٤<��4M��ߗ�F�Q~F2���F�c���w�*ж\y�2*�􄰵&il!�/"U,��+t:��.�+��J���H��{W~Π?�v$�3��<w�݅�Czf�mh��>!��dl>>�x�[Ş/���韥
`�,�vd5�G�Ə =jɥ^(+ȩ�Hߋ1
L&[��2b��t�;�;ʼn�i$�4HTЂ(���"b,o3ܔ�";�k&u9�[����*�[l%e͹yS�o=^�M���#�-8���aoX$�~���g�0@�}�<�����'to:�~i	Si���$�I�W8&�*��j�3̦�Ԙ�.efȢyӑ\�}�T���^����|:Pzt�W�R|®)v@���\�ko+�J��\�o��E�rj��u��������4-�&>D�-uKX��@��=@Q�U|v�4�9��:��6}���o���/��HD{�+���~�g��7t�up��m%�[�Ç�Zh[Zv��v7�M?5���k���؄�a�"��d���g_��S��&H��x=&~a���	�
hr��J��X%T�>��䆎P��Yv�wS2w���3�w%ٖ&���5�7ه��r�jj��R�S7j�XF��z����o�MbϬ���+�<]YI}12=]�x|��"�j�T6�\9�f*��J��S��D?�?w����k!}g���5Hڻʎ�W��|�r�3���p{O���w�_�2�r2v�]����|�!?�
AA��}����vg�֚���`�'{�\Igv��$�=^�?�ξ}���-|dsg�@�DZ*A�N�V���9���w-�A��kA��&��*Vh�G�۪����)�#e.
�ED��3#�w�g���
���F���%�m�A�[�
��W������C���<��_������)�N�hb��q��]��~8*�8j(�u��(+pIBs��Ϋ���O��0��ȩ%�(h�S�
�u��|�E��b|Mҙ{9��..͜	շ�S[��ܱ?\7�'���u��{�����u_8���o���_��o}����xx��������o�S^rC��S��Cw�^��?��������W�����?x��\X�~�Z߲�x`��K|���8��F3�����uO��D�p��,B�ޙ#��i`��$[���]�+��&ޥQ+�^�*
.����&�x�Q�L��JA��Ȑ���Ϭܳ�"��i�~S3T��n�^�﮳����- �@�K�W���Ypo��jb�r��[+c��j�����h���<����F]�X��懖��m�C{t6ʸ���p�O[A(��xX��~Z$J�i�޾��9��n/�F�׀`l)ߌ��61Z"@7/��ɶj�����*	���hA�?��줌�j..���V���tiv�#�\7Q���S	�i�_��I�Ȋ$N9�dJ(͹�Q�.Ƕ��ӄ����n�P)ujk}y��=�����zu�߇�p�C=Z���
�S]�R�D���!"�����djb�Rz�!M]�8-�t��^��!ؠ6�刌�r�KE-��PV�.��}�֋qΌ�?�*���p�|�L���b�I��e��?�;��ܬ
�,�R�fb%B�?ˮhC�r-
��2i
�T�f�)% ��"�P_sCj�B��x���A5��]��-X���،s�z��'9�
�
����qf�

�=U~�G�U:,Ev"
�_������G�L�w��,���[
ǟ:�?l?wz(�c}���b�W`;��o1��6��~mt3[Jd��5{٬}��n��7Nj���Yy��l/H��FE��IN"rt9�$��|���J�U6'H��|d~�)��K��4�V��<t�G�^tٔH���R�2�M@�4�����/��	�p��2��������v*��c��m��$r�"&t��9����JQ�FP��R:�c\w�b�l��Yx/��)K*�%��m�ӄ��in�"ݹ�DxtlI����<+{�`w5d(�i|�E?�U���U)�c���n_��~`�q�������'L�6p�b�Nu={�<dҘ���=Cn�V��<�%*�8?R�0?�S�R�JM�rOf�x��;&(��El���:<_>�F�[E�9s�l
��U`~^l��PVd61\rmi�_-qV�D��a�����O�Mn����n����IՅ�d�M)��j���?��4���F������<��ԁ�I�ֿ�,�?U!7��)��q��;�F���T�i�n+o6�|o����X���O�8g�zk�l�7�uO$�*�a{f!�_��"T�&�
Y��?0�x�f��H���eԜl�Tb뢴:"��D\��?�`B�v����M-�%�-W豔
�'|���@.�t�܂�Z��Ib��܏l��	|��L����#dž�L$$Ҧ�-�V3�-׆��@�D�&T�c��:��)��u�fS�����L�RH��^�a��]+��IC��O:��aM[�.�dzsPEl/�X���0 р�Omh�A>�\�x	���2o@�C�y��n6�`~�ٿ�"�ZB�Hl��v�2�v�@xyqgq>E�4�:����Z2<g���z����N�ߑ
UsK�}F*�z�ױl�^)�G�݉t�x����v4����#��tm��Y��z%���4�_���,�	�o�kn�a(9*�@D�xߩ]�Q_��G���8�T̷jńvM�@}�M�-`�]s�d_¢ӟz�����$m}eZ4���.,��=���+II�� T� �
��l��	ʬ�(;�Y���{ELE�镍�RVFo$���j3ˍ�e���EDIpS�ez
�u��yƄ)�9��d�BJ[�
͖�G�
Z�oN}N�0S_��i�L�jw��gȵz��ӬI�H���2�W��unTN�5)���$]�E��I�T��7���X�?�x�[D����!k�{%���wN�~�V�(�61���V�>�d�(i��&�E��Nq��Gu�{4�w��-�'~B�_Uu��C��(���9�A��Q3T�T��%ǐc�IM�4AVK)9��4.h���'b��$���C���f-��2?H��xʯ�v�C�ҽ��Y
�Dɯ��Z��Q�(-\f\���#�c/DYs54�Q��8E�[k�s���E�&k����6�$�&�Vf�@�p(�I3��dИm��J��D�,}�����ќ<}��ꇂ\=,�Sb���<�]o��ѥ�U;�j���R�X�'���<Rt�6���Ht�x�ާ��x���{%�����+Ry��M��(:����LڦS�q�J���P��A���i�
u�����n]҉1�p�Z��T���0�����-����A{]^�D��OrbẄ$7|�M��������U yC�|v�
pŸ�ă#k�uE^;YSVNEUU�I��a��U��/2�}o�����%ˁc�
U�׷�f3Ye����F��o��v�K���4m<�J��RRtO!vāxxņ/�=�SwH�%p&=�"�@����!N�llKmے�u���o����Kx4�iuv,��I���[�6�d�w�,���M�=���}�s>j�と-�8���~t��B��#�P�	#2�e��4�
��5�:G�R�Ap���?Uo�
I�v�t!W5�|��+�n��Q��0E��CC�Yb=����<�
!~F1��W���F/fdUz�	@�-!$����
���b��-S�y�d�rDE�5iҝ��§(Δ�a-L��耙|+YrՃ�7ɱܟ鈾��#t�mpA���"�XQ.�+E$�‘M6��9P���HR�0e�J�m��q8����Aa�"Yϋ�a�a��w2J!=��z���[��~��{�AO�1�@O5�D��z�^�!�Q�9s�\`D���n\�6�?��I�d�D����sL�A-�E�AB;���|�⳩�_X3P}!e
b�����+D�M&�=�<���~����~�}T�e��ۇ>�7�_�@��0��N���ǽZ[��V_pR%G������m\9bw����6]l-��A_�x����>�qh�ǯ�B	�A-�z��!��(W�0��D��d�S5鞈�����?U!Y~S��41Au5�nx3�j/"w�n�v��}�;X�k�1\D��&�f�R�����J;��g��L�I�L�F���6XHNz�āl�L��I'j9�@�zEa\e�D�Cޙ]W)�p�f烀[�p��N���Le�=�|B��R�<�zW��(o�,t���ƈ1,�N���9�4n{�LڼR�`"��{��5
�ޱ�:lZ2Hʙ�̊#[o[T�"�L�6�׸��n�]=Nu�"����0b��mo�h�[�m�v7V�Z፱Z�0�#��_�Մ�V�-��B�bY���ҡpŅ��5��G���{U��{��H;c6�{h�f�����<˲g�I�G�#)�dGd��݉��=��|�
S��9"�;F�f���������d�{���#��YuW'�;�j�gF�1��>�\3����-3��	sx�^"uW��Y{��;f5�E�\�2�/_�c5$�T�*�Rxg�2�#�g�ܓ9������eb6��g)mQ�2� /[�8�Gi��B��|wzKt��f�5Q���'���\�@_�
OT�%Y)<_U/D'��(�ɓ��W�&;g���t��v�ܩ�]�ʷ�&�V>%���� �'��q-����7D�{-�ldn���l�t�f��j��~'����u����e��;��B�+D���v��;��+`}�ܛ�u�\e��}�n}i��4���T�a�O�m�f��,Ӎ�󁚅D9Iқ��Ԡ�w墲^]7��y-?7���C+��Pl���P�y�M�����M�vp��{e�>̇w��i'��{���bg��>e'��y�-�g��LL�<���U��;з������p����+_JukR�xEZ�Not�1`�!��	=�g����*���]��#�y���;�+��c��s
	�w"d����n�5���B8�P��솃���������տe��U�����r���;]mb�H?C`���� ����d^��b	juh�\�b�d������
C.�F�瓴��R#Ө�(@����j����&����ʞ�R�;������}닻���9����y�j��cv�Ux&	�cE`j����ˬ�F;
�5~�t|Y�	��۫i{�	�S������KO�6{6ٻR���;�H����Q���Ǭc�->\%���^�XV�J�]�dC�Ok��ҟ%�Ή��3�wG�m���!�d�4��4�
��!��K��	���U�
_k���z��L6�c[��
��!��^�z��[��J��!w
]z��e$N�`��r)�2#�ԉ��m
Byu��dy$�2&�.i����-%1��4�0�H�����2�"�P,h�a��R�Ϣ�$vU�G�t[B�
c|Bzo��D��t��ռG�"<j���8Ehu�1D�Ȋv�����+�ٝ/5CSG�Q_R����+��[?��z�2=�tϤ�f�nq�TY8٣6��=�O�m�Y"ϖM��UR��/��nC�hk�X��T1vΑ��u�"_sl)���m���`<���n���u'���1"6c0������^��r��w-�ىJ�e�����TU��_?pdp�I\' 2&Y=���Y���9�^,��hflkbd��d�����ӭ`i�z�#`��E���D{s��S�X0�8��M��3f��NtD�C��'Z�C&+nDڕgщ��b�3*��=%�f-��<�%]u\���;�_"5{��Mj�>ͬ'@$T��y���M��J���f;_�[���ʗ��1ٮ]t�v��
ʉ3�ѥ�UX�eȥcv��(Ķ���)3pѦ�V;�lWF�NόM�f��*
4���u��!�� :d\��DƼW�\�E5�=�0(˷6���*e�R�m#3��#��
�ҵ�	�'_��]��!�����'� =Z�n�6ˣҨ7��)	��Yq������o�]�vy'Nm�]h�m^u��	��0m��o�P��,P��xX
S8�8TpY��GNP��N9@�7����������)Nb���)N����6�Uy�[��m�[��B�,��/�ߎ���Y���5.̨ Q��>��``H�0
kZ�h�������h[	�f�sr+i�Q��N�IF�2��)˶A��W�p٨�G��6ct���
�G��	G�kn���Ӯ�WU��#kW�:����XO���'�Q4��ۦ�����r�rù>i���B����Z+z��K|��|\�W��^]��x�~�쉓�sbH�渊�r�Lz��^��	��z�v�W_@_u[%��kTv�h�y|��p�MG����;�]��Z��̑9��F��L�QsU�QuBSw|��!��#ȎZH���֊z�KR�#-�$���'�*��Be�4�m�z�r��ۯ؇Cn$�m�\}ӛ?Ib��ֹI�Vݦ�}xƧV���W��U�H�9�Ъ�o4�.'|��~��!�0�зo���q��Y�/�^b�v�}2�?��0�9[``��s��=/e [M��x��I�X7m2�ux�	ͮ&�>�]Ψ�N���dZ�-�ɱ0ݭcC��7�g�US}��ó��{�ƞn���-h�}��KCD��'lhE7��F�._�ȝwu���H<�%�F�z�+�eP�
�I�+�HX{HUÞ�^���.7�>;�V]�<�)%�pjD�o:�y]T�5IU�5	&�᭗߾vU�s�D8G��7ᑖ��*|�l���Q��֬���^s2c�,C���� U"�"f�������l?����YT�y;�B&��i@R~�t��|�0-��l�hf����P-�<u��v_o T\�|[%�%��By#�1[;1��{�*������[*~^c׌�OR�c�O�S�;G�83�����Rw�핅��#k�Q��n���4���;��@*}�B�3��#��^�[Z�Ub���hn�d�"Ugw���ia��E��7�l�~X����ܫע�3���=ڍ[�e��͖6ݶ&����2� ��r�z��:�d����#������Y��t�2��a�+�sq���Eq�D�ķ���jG�a�Cƀ?)�:�7��;�3w�Y�|%H��~4��ԟ����d8�}"��za�]x���"�"������铎H�=��<q͓P��7覃Z���&0/�U���l)�~�dq&w)�	#�t*�D�y��&z�#F���w)
/���������д����O���;d8����R��h�t0YB��� �+��=�}M�����@J�ٻ=�F;*���� SO:����KV7;�}v\�T�D0OVO;(�\�VD�G=�}?�YB�J00�VO;��w�-q70Z"�=��H���;8�r0Z®�@Ux��V���@U�
���w���A]b�c╱�d�5�}D�h}����ᠬh,�Mc����6]��0�!$X�Ӄ6���b4ބi7��=��DWG��&	��D����Q��j/�	���ݙT��B�EOI�w��l�<O��ƈNF��Z��4�?G�û($���ܠŗ�S��q�Rh�O4fKلJ�<���$�Q��#����/�L���E�r˄�,��ȋ�u��2XN>)��X�rq�)���2D��'�w
�N���ArT�g���b<Ϸ���4�r��Xs�Oni^�#�	t��_��?T���r!F�9
�	g��5O��G���1
U2�kOSK�Q��s�󱾠�"0��&ČR��;�)nq�������dŻEi�,
�
4w�������D�h������;�"������M�	��4�9�x���J��.��-���O�]L��K��O���_���̉����n��āaG����E�
!K���p_��L��+A�;R��;R�.~t3�ɝ�]oƆ�=�fd�v ��a8��ՆO�S���<Ti��‰Qdz�'j)`L�l�d�|�����#���(�%R�~S�Y��.������x����J�{<��W�.�3����F���'<��zeb�KR���
ԙ	Y�y�96��Α,"6�d�%.�S�
;#26�d�̌'���T�ުdT0�N�c6�3}�.�~��'�sX
���Y�/�OI+�j���l��H:5�!�WT��OA��p� /�>��������������!?��J����`l��`����8j��{�tW%5E(���
��"<�b��Y�E�+3�N�@Xh@�a|��O�ΞA�`<���xc
� ��=�i?�<yz�����	pT��|@Ϲ�L��@2U0��NQ���}7yd�\�җ6��n�1Kj�7�W^��7P� n� T�M�zМ���*v���x���S�7�g�:^S�=d7-q�@�8�o���y���7>>s}|WFK��=��	��j��[aԮT��6�Kn����7����.�>�-�Ҟ�]�>9�G�
�Ul��ڣL��+a�/���l8����M�1J;û?���b�
C��cI�(͢".�����
o�15�J����'�-ݾ�֎�	FU�6��8"��ϔ��H��GdRJ��Ԍ�L^uT1����[�iA~Jb
�R�i�+�9�B�~3{��~��c�7b��ԝi��Lyp)�̾��Z�V�_v�9J���_�s�,m��s-��*�6q�.MͿ�qK�K|U<�p%pMe4�l�l�R�>�Ȑ�6�	
?�9�/��e��>�T�-&d����U8�i�Y���t����-�$]e�fʼn`�&Ќt�o��,cS��,��M8f�L��R��8�\�֔�ݟ�\k�:{���Q�9,?f=���[p�L��3m��m�^M��6�i}���_]-�	A1�����*�d�����|�]�5��q�q�q�}yZJ�[�@E��έj���r��K(��r��0H���r����Z(8Rj��R������*p��J��
*8X"���JlPH��C�8.-j�g�c��gF�"���31���c���`��&~�����8�k�C��!!��x ���"��.�o�ND��6�MJ�!s+ZZx��V�
[�+ٕ����GH�	r"�&DQS��k��$���n�a��̴��Μ�~��Q�P՛�K���'�Z�ZB�o�ܻ$篁�l���� ���Q�X:�Xl]�Щ�ro
H�څ*�{�)c��j7[,�K3#����Fж��s"|r��&4�bJc.@��ˢ$.��;T�3r䫽�N`_I��p��G�\6 K�t���Y�9/��,�[Z������@����Ng��ռ���~���:����q�S�x�L$�# P'&��慃8�5�0H^q����ht��*���w�u2>g�O�T� =D���7Q;�E��͞��me5��9�4��ȐU��Q����I�>
������^oB/ʄ1�>D����Ek��k�h����w-����^ȧξ�ͩ)��T��Q��~������������P]\��Q������F�DZ�8]@7ҙ\0[�78�K�;�g��7H��~^��,�_߶�>��n�f��4���a��%>�v��$,�~��:,���yQ
���N^�va�=C�1~Wbk�i��?G4�W�5������)�Q���6|۪k��B��@>���Z|TW�$6�����eL�e�+�zp���|��y��C"�}��m�8��-��G�}}�N�ʢu��
�K0�h��Eo ����9Yg��>���x<�@�Ϥ
��
�.�B}w��k�~(桁�sYW����{w��0��ܧK3k�B) :��GT��	kqL�M�:8=f��۬0�7f�LLv�,
���M�����E���S��I&�-�ѹ<u�ѹ=�!x����өI�6������r�Kl0�!��m����e
Vyk�7��Jt�`��tk��汁�����t�ߠ�Y����9;<h���J��==��u&��b�-��!���`E	Wi�!g�W�k�Q�DZe<�$�/d�5�X�#��P�7����p�&�lifa)�绉]N��W�Z{U%�$������j�1�;
_>�
��ƈ��4�1�ڰ)<4�^�F	k�.�CyT/�g�^]@�.�xn����ψ�/1�OQ�#N�d�`I��E�q�w#j�'/��J�\�v׳a�O)P���4�i�m9��t��B� �Q��*���;��	Z7$Rn��*����Y/�.�ӌ��_� �ъ���jhF�E i��� ��E�܌�m0�ȩ���cE���3�����|�R!
i,T����`��1�D*d�hxj�H+�	�$5�p��a'G�k�̴�
��i��>)�f�ʚ��B
8I��|�ܢs3�c�3Q�b��$rbDSE(
�_�r�c��&0қ>ȡ3G�3���(�,�=���ČQ��e�D5u�ɑ�4�m
�^g�?$J����H��P�>e�YSt���WI�ж�b}�W�˧��L�:���T��	X+�֜��%FR�}�b��y��$͖(s�u%u�䮚?�}G���J��N{	�(���s6���"xs�L19�g�9�V0�g�b���I#�[��OM#�VfN��ot��N)��9Km���x���܂����i#���R-$-OUUl'���2v
�ȯ^Q�L4ݕ������&�ptRjt}��Bs#�=1����%3���݃f��
�z')�W�<=:�XGXƒ퉨&F}A�:�����B�HЗ�̺��Ʒ���#�c+Բ�#���&��u٧‡��x���^�#��ܘ�9�y�h�<<��^���U����ŵw���cw�J���c�Ţ�HŅ#�oM�c�tI}��Ay9o��n�Z&�ǁ2��'�Ko(<)!��EZ��)�/G	�;����]��7����-�D���yc*|�Z����}�h��ih�� *
 ی�[�(;��%B�$�u�اI,�&�)�{o�5�C���nZ!��y
w"E�01P�1Kc͊Hp���s-���W=l�E�����b�o��0�
�<*b�Nϲ�WK�F��1!�|��g.�Q�Y|Q��?2xE��Y���s�-G*X\e3H�G�MHTh��	�
����e��]3���NDUa|፫��RAA'Q?�����Dgp%X�C�<碢����X�lcۼ$%�̊h�X���'`�O�(�A���$ʳFtϑ��U�pHJ��^3�X!2�m�A�P�h��.ng�_Uv��^�� �ށ��/�!�/�9���!bj׸(){�	}�G(Ԃ��k�N�
Ԓa����y��RAJ*M�ؓk������a̋����|��Ǿ������g����!K��-��[�!~
��![E
c%fK<��`�����Q)YSf�z~T��2�H���J�p_���s ��I�)O��&�W���&B)�M�
����m�U����Ɔ�G2��ap�fxoE���+1k�G�"KSx�4b�魌�,�q�}�a�����̞Hǻ�ir�[d�ʘ�+)���Y
L�<h\ի/2����-�FS��Z	��3�
?x��K �Ht-E5,�P�{kJ�h��m(H+��k��<�G����vbOq)SF��2�,=R}M��h�Uڻu#J�ut4ΦH�����O �4�-�"�v��a=<#b�B����~AKuy2�ߛ��`I�@6�s�Z^Y�(a��F�V�	EGgXW"H=G���K9�8c�r��ɹ�q�]����)^v�!Kz�3��yN� M���-�6�n�"�Zk�f�s8ev���;��#��8����U�!+�P�;x3چ�
�<���uG��K:�>X�����>xJ��j�����m5=�H���q�H�9UIE1P��3���Ɋՙ���;��@g���|TZ͔�2O���X�OS,R�g�!�i��<gb1|���Y���H_��lR)@��*�Q�zf�)݃��fo���do�2a�`C=�I�.
G�}�y������4`~�x������F^�/��#]�JP������8S
�S�g�1G��F)<.H϶ 4�4)!�\\�qߴZ�3�Szy.���
h�3O=!��&
�+��4��F%�pe�t�z��B�V�]g�cD��B�&�h�`&��:����@K����Tw`]Q�ąJ]�V)`S��K"����w7�=�^�K�`�8PfQ���{�
���$ΐ2�Sv����k�;v!T�{�j�	����U�&�_�s�>	�S�%F�هLp��u��w3���`/��I��
)�ʩ���ʖqU�q`���b��O*Eg�bӟ��������hö}x�����b�!���NߎS�0�|Ҁ�8N�9':C��^O�-':+�LYo���.[�`@�1o}�£�~J+�:��e'���J9l�*���>٨����/W7��g*��A6(3G�*����g��x���5�����q�ĵQ U�_[��qR�Q�8�j*���"o`��c���d�*ֽ�,Q��IM��i�/��`���J���̝���r���ܦ�(<w8g,qtS�v�J�f��l�~��V�Q�j���hE�O�r�����R'�eU�h���]�"�����J�����_~C�<�Y6U�C�_��s�pVl��P�[���kc^����D�դߏ10II�]W�TaTj&qJu�[��S�z��u8.�P���[6�M~*�;��6���p���K��?���D�N������{~	����i��bx��;�(k�EK+�qY)�'��1)g�%K_n`=�"�s���"E�9 ���9	��SD�T/�}���DNʼn��`�7�(��K+c_՗/�kqߙW�R$�)�n(��
�@���}�VK�!\
�T����a"���r-�c��;��lТ�fUڸ��(�BO���ⲙ�F��GBݮ��hKn
�ꁙ�����h�ݼ�������)�� �~�.�=,ZDJ>F�_(�5�2-T���[��r�1U��@ASL�p�7�4����%"�A�&��=��D��@�%,�����(��s<y�ٕ�s���������#�k�����{���3�� P�O���3U�e{��3���z�_s*su���5F�~{���h�3,|	bc�z��5�{�%�3ʻ��(�;�z_����:9������8�+��V�=�
*�~�V����8{� ߞf�w۶m۶m�{���_��m۶m۶��"��3g.�EUĺXQ��VVV���T]�W��厫`����ܛ9�,�j�w�.��鞡�g~+���/�/�d��_��q��w��z^��_X����2�+�O墈��yѪ���P�SZKC�e�I=@���=��bY�ZܲH/�I2(�P��A��¹��
F�$�:O"�@��@��,o��%�D	.NT�9a�fa>�Lz5������ڰ~{��`|iyw>�Ā�wZ�Z����ݴ�[Μ�,����鿢I�3���с���p����_A��O�ҰtW=B��$uc�Ą$'��gL4�E$�@5F�4	#U)zdn�7w:��^Zn֮-�hZi]jG*����Z�Y���YعZ0h�i{af�"��N���:�9����yއ2��[9��YڿդM`�y*��<���u��Ǐ���;���������o�G�:E0qI�5j�9P��[��3��+B�/q�a�%k��mD�y�U(~>n`�`������<����1�뤜0nr�����p���1X�m'8	�\r	)a�,ۣxl鰻�D��nl0�+���Lj��%�jj^��Ο��[��?�JKblˢ<@n��=M�5�y����28��}�3u�n.qS<uW_���Ɵ��ܝ��K�т���v�-K�y�hV�J�27�%��M>��!h��&k|�G�ğ��1�d����*[a�!w���f��`7'ZoH�Voi<�y��	e�Mؑ��Ƙ�sb�:o_�j'^�Z*���䫽gK�
�k	h�&�aa3�[a�\
[�a�����u��I���}�N���Y��Z�My�JgJ�����A�E�y�4�c�b7�2]_2�an§m�j@�lv����5�ٴ4���J_��i�c�c�2���1�$^��V���V�<c������?�
S~}Z<�R&w���Z뛲X�iN�/�ca��X�<Rr�~|Q1U!��DS����<?����g<;E}l�D�d�zR��\T��RفK@Ea[;��1�����r_!)��C��LC>��[�i�y�Q��3�T<֧5��.~�(u��ޛ�)S�T����R1���pk�C9e�	2Dm<��lx�L4ϋ'p��֡mi��~t��ƅMV��z���/�b�CU�����,��y�H@Л��JJP�������qw��Ƹ�V�d���}
|(w@f����Up�JpϏ����q{֩}
����M�Kd����(p�5�Qc���֯�+!���vOyj⮎��i՗�N�f�H�$�w�D�Y�����%p��‚�[��T3����dݰ�hE�*P�ZV����K��W1�|���ܹ��gz��?g���7�񜂧\��,��Y�g��Ɣ�D7f�,��z�"���o�v�#V������˅���f{����%a�"vl8EZ����h"�Ey��sU���75x�@��`ę�u��µ�j���,G�|�l^L�:z:�e�Cm���Y>Q�,�!K��P�`&�^��9]�t��d6.��e͇��A��{?]Q+�L#l�`�(L.8f4�C��di�F|�����P��2�KQ�ǣ�Q�4��$���2Ƚ,T�$�
s�f���nh�n��{�dzq�k��̏�_f��U�f���1l�5�%��"��&�s�7�T:ˤ����p��#���-�����9����}��
�D�;���<F�[�*��ۜ;�x4ۦ��6�e���D�J�s�i�'�#ۡzi��PB)��5���VA�+������QP/C����%��A��N>��9�]$�f*�գM���̎��#/~ɇ�.�׎(bQ�ƛ��'�N��5�[��˨\LG-�'��1r\��o��<�Wbs��/�jRs���ͅ	�x'iH]w���.V����k�&E1K��a���#j�@@�3`%67�����c���=�kF@;'{�D�$����LaVCa֗�}\�o��F��[���5C��{xq�V�{�47ڈ�缼MH�+Iwr&P3�����9��؂z'�<��e\�)E�tœr*Կj�
{߶^��X����;��!~�㙨̀���y�y0��+6���vv�Ї��l|�M��@*`K�,j�75i�Zm��>����
.�r�'�yH�*Q�)m���[&��n��G�Y|$���}t9���gp���V�y�辶@��+�D#*n���O��ϐɗ������T+�^��X.{ �H]�my�$v���i�1������$P�`��cB�l4�x���ٵ�G���7��V��N�L����4&c��|T"�F�'�m���Pz<^E�6gFU��%�W5 �E*�2l�nn4�͡%�K��x�	�ܔߒt"BU�!sq8�	��sT����lW��og��/|�G^6����l�Hݻ�}lʃlº$�iY�X�p�]q��(+�aE�M�����+��Q��B��M�ϓa�߸�5�4;{��J<D�V�W��1̄����'�7ΉuR�1
��Җ*��*.�}+u�|y��>ղzQ[���CtU2�khO+��F�s;紖VOpQ��L��BO�>���@�>-$;jzEU�^��>��c��al(ʲӼ��<$_Hs<�,����;v�2�8Ϊ�FS����]=��:w��7�Z~G.�bFGٔk�&�q�
�9?�Q�
B�����<)�ZC!�T�v��i���M�U��m�q�x�2�t��HO��7��X��ܤ`M�R�M�Q��s.�Go�J61M���5�Gx�d�8�;����P��L4N/ؓ��NcM9��h�˫h��ʳ���5	���|������$Ǽ����DO�ȥͪm��?y*]*�uPU����v����6Z;?��f�^̹�!�3E�_9���r���v��E�V��QC�FGf�JA�,��ʷEn�x2���̓d�զ�SL&k#�I�[�
@2�yz=̐�y�ʼny����e�n�� o����֝����R��3��
������U1NI�C�m�M]+�@	6��!��P�U��^c�	�H4�
���ר���^m���CL���We1!1%�Fo�����|ڿ�r+(�u���M�%6�ŹW�:��B��]���{��@�c�#�=�����in��F�v�0Z��x����6�Dm�z�%{j#]������&ݮ�FC���6�h�
Z���&Z�2�d���`�L��Ә俪Ȧ!	t����,9=7���3�z�Z���Ձ�eتt��L�j�λ,�������6�f�L�i4�hW�E�q�q�Z�T���_�I�;���W�]�~�O���U�d���;��6:��hj}m>�ߊ#��Jߪ,:fK�.�cǥ�S$�y�N�n�:���]
0y�bI�̈�;
7}3�w9	hK��݈"]EFw����ڼ���,1*�,�p��Swe1�P8��f�VZ^�9��Yz�ΙN�]<���k���n�a:44��Vi���2����!'ܮwhpK�,�R,w,y*fm���iG4Y7Ȭ[��(؝m�=V?}����@W��e�3�Ү�64f�߾�K�g�l�E��0�X���8m� 
fΥ��>�Ë��Z#�	vx��V���iU�q�,��ԇh=��tvr�	dj�y��3Y��8֭�֐]�|~i3�=��|�u�_=��I;�sH��6�4@����|�D�w�3�'p�z�rc��t�G���@rx��,W�P�	 �a�Oʈ�}�}F�~����4��z��G��޺�(�}+V��4�:R1k�>'��-:��*C��bW���ř2�Vއ�C�;����q�>璏��0����W�u��y6y4�:/�[��G'R�x���T��~��0�ȹY-�kO��.�[4�`_�jM8��L�^<���\�X4�P�t��>�ӡ���GGH���({ ����K�'ag��	ߖ��^�%�Iɬ��5��cΞ�����h�_d7��! z)E�D��/I
̤��蓗@��O��8�ߒF�9���;�~��]�JZ`@@���4���]�:N��hy��%����0rA�e�;b0�!Jh�}�ص��oW��4R��}��jţ�?�o�j�e	�Ok9Os_�R�M_&M`YC�Jz�k>2��Z�^�zZ��bJ�	�g;=��@Q��͕~if�(�bIG�!�I-��dM9�sG2���qa"S��LF��L�]ah�;�P��!2��Qw�akfz���nPKq��,UF͇IOVk������)f�k&���S��BPu�;�P�"fB����L�*��˅�U��l��j_�V��/���R
d�!#Xٸr1em��L���T
P]�[y
�˵\�Ǯ��k��M�f���A�7�qs��Y�e�iRF=��)qk'#j3aDȖ(#2�x�S��,g�%h6��N�do~�%OkE�2єL��:"��]�&$�Jr˫�)c��}x��ඦ�6�꩔W�Č=#�.���ș�%`6*�v�R��dN�������#"���Z-/�=S�ɩK����M'xj�:a�ګ�m�מ:D��u�ӱBFyqIm4K��2iMk��'S6ܰ[J
l��T���֭��b`�."}��{�����2���G%cx��$?e���OU�m��{��Gp��uT[�.�^��a���o��n�)[�}t�t:;jV� ��
�d�j	� �(���R���]҃y�w`�Pa�n�/G�Yej@�v�����
��5w����쪀�0�:��5憎Keά;��g=6�2m���Y`�����|�]���g�K_A PC)�[�\̈́_}�*\2��=���q�i|�l��j�j)�J&]�Xuo�}�ވ(����|A)@�/94ɂYA���NO����6���6�!`��G�(X\�.�Wy�-��S��!(2`����:�a8�U��%N��Ad�<v� P���|
u����K���;�����f�El��	��	�3�;Z�|XT�^��T����.�M����J:O��)�,�K��l⶟^9�F��"��r�C�>���"��P��W`Z���P8�B���PqIW
���G(sk_}jvzB+$
�{=�f�����Fʼ1)?�8M����
i��k�L�h���@�#��Q���I�[i?�t,E���Z�UE���~q{燔�!�<����*����<^$�x{�U`�$;"T#]z�%41�1oٽ�)�UB?�R�aG:�/��y��!>�5��V�r�;߄-j`���@�<�����6Vr^�8�Ė6�M�!�ځ|����{�^�D�_&�s>�As���C����N�<�"��@��w\Zk���f��>xC�J�D�$�����e��W5�S������+ֽ���wu	v�RA"���߽�d
KgUs,����"-�DaPI�DX��YJ��U�0R��;3G)p3��M��&���de�
:z[�0�%A���*�ĶMڕW\�|_?O�O7��!Dyh��o�/�;�7]5_'( �[W �^����~$-|��|1���@�t�V�Z)#ޜ�r����P��Oc@~9й�#�{6����R���zރ��L���h�l�t����	;%�X�8=$nb;/&oݴ3ow \�y�_�Q���ӯw���ɡN�Qh��w@���H�HZӣ���
��	hfnW��M<�U��[�[�%y���|\��͓���r��Ǫ̶gR��g0�M�O���y��E��a3�^�v3��4Ն�lh��K�WP�@PnڻUl�@
'{)B�������]"}C�kOc���'q!�7"�}�f�ř+�V�,�����_��Qxz=�J�8Y03,�ux�+d�Ь��[E��t���{9VȢ��K�z�2���� e/+��)�`�p��Z����la�l]g��֩��Y�߄�6q�S�j*ZVW��614��0�*����d<Q$ZG�4��N���0.����1Sn�!�2����~[-�޽D���[�6X�&�D�'_�Nk;�;�l�L9���%�&�:l��k���2^O�<�Ɠ�*�uB��\�[�Ch��i��)T<~[O(\�' ��>�`��jd�����EQ�Sʼn�l&��leS�nܸ'�8]��,{�r���L�5��z��J�/rȮ�l7�Ԕ�d�N�[ md[��I�'�PM�,{G�c�w������"Ngq4��	��82�BЇ>F3@=�Yy�`aϝ��`� ԏs�#f�ꛋ�Ǿ?o1�4��U�X����/_̐^�Br����;,��꜋m�7����dӰ��m�}C�R4m���C^���ٍPx鼭V�6�>qE�M�p��%7��t���tj����P�Ʊ�� �i���*�� 2bP��j,_�|�\>���d)��jH�zĵi�,�A4(�yI�^�k!
kh��H�ǫd��R��A��|�����U�Cg���(�I����#�������A�t+~�U�4mk���(�Φ��q�ծ�����NQQ�:�k
�2��2��>��J�Gǔ{�"=���ʛց��re�F��D�v��	tP'��������eS�MX�y|nƗx̟���df�3j��R6���g�kYh*?Y�S����9p(�tF��ә4��L����8�؉R���~�v��F��/�#/��o	��YE=�O�3�a�ces�י�F���9�28�TP�=ء��	($�*����_�h	���L���[F����	)�+8��RewgT�
�t�
����G�f�\y���Ô;ܠ�n�7�|�a������Dbh�Sx���sS����sx�l��qP���x�u�o���9ք�_��z)JE��W:��W��&nUb�+P�S��~l����!�-$cDi��HCQY��Q�L�3�~v��e�-k���$�vW��=n2��]�utK?�@'
du�qi{�[�u���z�H�.��p�m5���Oh��a���g1���r^cM�#�"��-��ܔ>���ᦜp.�D��F��(R�=T<�|�tD�gĢP(�WP���\�aW�k1�#i�B���l��t�R
6w2F���@��X���Ȏ+ ;���#��3oPSF�����ص<u�]iFWf��̈́Rݫ�;T��Y�׭+�
l�|1�|~�1�lJۆ��&�p8J��*5�&�wV�Ȓ��To�ʃ.���g:�M?��R�������A��܈V�B-f��%�Pe1�Dݬ�2�8��8�4ER��Iu�O�,S�1MG�-�f���$�&�Zܯ�F#�4�I=��ˡR��t��a�U����]�s�y(W/{X$�[��W�2�^d=Wܥ�+ؐ�*w�{r.L�/H�*��-y��ڐ���'��n��ϸ�IMÞ��"���?q.��=pNu�C6)g��x9ȴz�A�`��y��)�zc�N�o�mC'q�(
���cXՎ!��}'J��i{b\��}��OVi�6��y�L�>��n��#�`���c����ڗ�H����S���9?,�\�j��$��7�Wm	ᔨ�f��qbQ��w��l��h�H��U:U���s�����~��~���uKP��l�O�A�h�S����A�L���м�<�Y��5�<x���
�;�o�'|Lc�ip5��7��Yv�bO�C�� ����M��/a��
���i�}���}ϩ�W�vu=6��6t����*i�`
�#���},K�%��Z؆Vt��RQ蔆�\�w����Z
��£j���V�&[	Ui��������l����a1���(,){lW��Ӈ�����#������@l�X����9'd<���b+I�4��9M
�#86�AY�3k����p��ޔ1
ĉ��r���hig�n�5a�u%\�O��;�
��h�|Gg$;<c�?#�tFˬ��I�blJ��d.*]W:h�!��I�%�W=8t<~c�4�Br:d�I�P�%�	���%)Sβ���W��sK�Լwgq�8�g��x�v=?���ժZ�hH3�q[��M�K����Apo/� ���� �P�Z#�PQ��bz�1�-�ޓt\c�w!�դ��x����[=ďbq��-����Kq�n�5~����u�a���3��7���L}[�V��"����5ӟ��-Z�w�_��Kt������q[C,���t|�p����c0�����K��'�`��K���q�C�~���+���J����	���=N�H�\Λ3��{?~S�L��n�L�M�P�x�4���������d�3���c:���P��go�*"�Dn�̄��V;��_�H��qY�yU9������fr[�ܼŹ�|J�zy�م�����Ϡj��.ccc��՜A�����6��>��j�ݩ"�L��c�٩tU:�;�.8Y��_�t���['��U�-��VY`b//0;oZ�ٔͬq$D.�,�Bx�u
��~�Y���I�h%Aq�23��	Pu
��KqgŖ.��0=�v���u�J��.�\�ע�h,j�$��h*�NLѝ{��d��$ݪ�-��(ߵqjNe���Q��X��~v�D�–7��m_B��S���+%��oO9���7_~��a1��J���H�j5-�4���S:�߲.�j�����ఄ�@8�^i���O������j��1�_�]�1�N�G��F?�����]��M��w�fw=����'t]�}՞�e6�M����M�x�]`�q�oׄ���:�¨�/AZ��nn=��3jB�6}�a��F)5�1d߫*R�g4av"�T�h�7c\�պe��C�+UA]�C/�����ҝ9�Ns�H�=�6����r�8��"ld��j�)I�G�F�k��’��>�a$3e���,&��/'�,|r�	���_�rȋ�,�x��1�)1`^d�"뚕����j�jN�L����x#9�^w��Y�4H��E�RX������dI�XQ���L%��nl�@>�
	�w蠮H�9M�\��=�ާ��™B��)X.$*{�r�m��;��V��ɿ5�hD�ߟg˺RƌB�V����
ޅ�6��\>�ʢ�TfV�&<Ŵ��f\�iR�f�%���K��	R�
����B~=0"�Id凝�tgn�B��6�	��V��׵u�P�w�����%���a��\MQa�_�<ʅ�_�S!!Q�-�E��?t����I
>��T\�
��Ҋm��

D�MFC�AD�M�����3Az�%f���:*�l5l<6�=�d�� ��1��T�"�EN��t��3g#5��n��.uG
Sm�r�0��n	dVL	Y^�)K~�tT�u��bE�l�%h��w����1�D�wu/A�Eƨ��v��e�Cn��%�&'�͖��x�&���#��adS1[��(Mf���g��D��U����<����s���Hڷ���"[&R��N����vU��u�|Wi�	S~���c�77����q�z5���g�e$�q�g�d���TA�ƒ��K]��D��v�ɛ�~n,Z_u��턁ފ+�!4��2���]Rn�M���Yv�H����þL2d�����u���J�J��D�Y��+��$Vs@��#�*Q����ql�ǧ�4�65�Z7Z~����7�O���$���h���؆�	��46��4���$ʙm:)�Y�v��;)����n�ŵ�Ǽ�V��w�����IE�\�����+~4wp�?�����Y+^�o�P�,��Z��9��X�TVu�(���Ҩ�U����7�>��#�3�f�س�3G���Z�g"_	��q��!�8��m�j>��!��`�*�3��(�k��nQ��	���*ȷ�"�UJ1��H(��J7��0�w{[v�Z�Rw��^��>���?�%@����;��E!g{Wo�D���\p�jgkds|�2��M];���DB�	�G���:{���-�)�>P�G�M!M:L��z
$c+(�F=p�ݤ{��e���J���z��~B�d/���Vk
ٹ	*G�R�)O�j�H<aW+v�S\��(��DW�MPpmT����B•TlG,	W��03��q�h~�G�N����%�;�(�˳a�ˆ�p��P(��@�N�K&��ay��Q�J���]�X̐Hg������ȠĽ�%u8��4O��XP����'�sz&+�	taɴTu�QG/F�IFi@����V�
?�N�n�"�q�fI����
�Lewņ�e�-U�m�o.a��5��x�v��D�z�z�њ����tq�����Eh������.?�m�I��
�rލx1'��#�9��
zr�:_P�(�;��=�xL+:���UAP�p�&��r<���}�\5��A��.h�jͥt�q�[V8��V��j�n�E��vO��w�9�ОOܧ=�bO��;�߭�#��}
=C����4QPn��?R�Q�_=Lg����R��]^�H���m��vE��1��$n�2�L���"Դg#~B��f0�l�[�����(o(�<��+�v+�<�T"$<�m:���C*����v�
�E�q}�$}������:�{=�;¼�U��K�!�q�i�+oa��`���/�L�y��}ʤ}E�LQ�(Ih���n	�ϋ�~�4|c.�6����1C���>Nl��К�g^2�1~iH��,z:`O�24�#�1�W�
6zb>�FsZ�H�?`fO���dՂr<�-�~1�\�Ԭ��<�
�x��UW�W>��*O2Umc@��ɧF^L����Q�r�fq�%+��t]�p��1p���b���4��]��r�i���Ӟ�
ӬJ~��{��6R��4]
��Ү,P��+J��|�8S+�%���Ž�P��l��s��c��\�c�W)R�H�[0І�x��z%�3�iN	�4��p*�[�X0�21���(o&
R���k#}&q��!��k3*�Q��d/n�9q��	4q�Q�Ϻ���@v���3�x�h�x�x‘2$�.�2�����%�iE3l����,Is�]*�֔�)PboYƩw}5e9v��-�E|.�D��^�!��ӯo����yA��q��E�&�q���հ�)��)Xo�[�i���g�E!�	#U�V�s���Z�Tg�-��ӭ�3��~�#���@t�Q�Z���ADa�.�5|CX���n�-�V��(�P�P���ց'*�X����V��5��Y%+|�R+�z'�"j�v��$�q���ͭ���)���a^�L�>L�+�d�.��R�ҠB�[��d�7��X��3��������*�m��LFkv�#J!)*�qۯ(�v<8g�[q����6CI���3�`8T���l�O�hsd���"���_��!�O�'#��5,�H����.N@I�	t����Ȟ���gzMj~�u=q�X��'sƌ��Ĥ/R�(��/��EK�X��^�i��b�h	~�
n�n�놣����q4�����O�9��]��?�1Ϲ�I�5��Nj���8.����r�P�	w���'�V���b�#1u�ɳ����=��K�+T���*nɼ��Ǟe��i�wvX�y�_|�O�����ez�_�G��������(l�?ҿ��Sb�Eפ;0��cQ�������l�PސGQB�37[��R���Ք������lTE��ϪʜD$� ����~���ׂ�`W��<}���p9�iz��ky�㒠��5,?��Eԁ<��wNP�?D6���:��v�e�a�
"9e��֫c:����E��V���@�Sй�n};�?���b��|U����ð�m
.��L�Ž����׾�c���8��F��ղ�
Yo�ev�@�ܱ�N�w�9Ҋ�
���E�/�N�7�\m累�!LO��\X�S{��\5�4�5d�u2���+��A7�3ʳ��f�G9!ħ�֘��`�	Q�2`R yx.�%�}����0�����G}k�^u���7n7�m�S삎�0�l4b�+��u�$=�4K�<��	kH��Id�zԲ{̫d��b��U{IV
����$�$,�Z���8�Be�P�_�?E���1��t� ��j�_g���I�IF���;7(|0��O��$��H}������#�'���ƒ�Ƃ�����������0�f�ǥǔ	�?��P.�R`��D,3@_`Ɵ6"4�mS�^��;ŗF�z��wш��ڨ���Ӽ�.a�g���kc-�=xazh1�F����3J�A�p|?��l�	�;�y�*E���yX�kvE��TLmL�U��s���1����a9o0tx�i��J ���"
�g�‘	��K��@�…��})d=''7O���*� ����L:��P�›���u�]��\�2Z�9� 置�]M����L����LI��s†ҁ�����՗��duj˧���0��	����Z޻����!|��(�>ٿ�Ӎ���?&���
�w?[�������?Zs���d%T>7p`�
�S�&���*�t�B9���Eg�|3L}�QFV� ��ox��b��>����hOs+Q��í���ć鮗�?�~�jc:�@�i�C~a�5`���>Ojc����BE/��i�ء�؍���H�eى���\"�gb]���]#��E)�
!s��j�%�tIdai��N�J�u�s`�m�
E\�id�Ӽ��U��YESq��8�y��T�䜮f\�^�p�����8@�WG�T���+3���kpG�����X�0[:��5n\���`tq�jg�������0�#���t��V�6{��Z�u�`�� �~N��yj-��^s��X

/q��q�.!A�VQ�E���i�����l���q86�����9�a�`�@�v�aVK��J�~�D"vdy��8�|�?�j��-2���.)�_��X�؁�r) gU@ϰ��|��a�o�Xhv��d�A�EX"B������'�f��KQ�5$~A���4���ʓ��Z���9@ᒢ��0�VZ�f{kkQ4��5�OA�!�������g��G����zߤI}�!�So���wl�!D��v�lE����>�r����F���¢"��F�r�nR�"�3���$;�/V����"��-�l��{B��ܞ����9�O�a.=AC�t��ɴ��)ُ���5@����D('yhU�����MD�H��l���˽�����'|W�{o��w��|���!������7�d�Ź�v�]����s�.d]��KhB9/�u��]LjnE����y���䮸Y.�M{��,��vP�c
X��������v���U��CM�n��r���۽��Ir�D�L=�J���ŽB��_ 0F�[rx�fyډ���� rD��Ϛ����6����~�P,N�p�;�hu�
֭v�!��Tf�ȸ����v
���0���ͦ$l�$�M+S�c�m�y�5�
�|�n�=�P�M�SJ�D���0	6��|�-��,
=��ۣ�f8����w��~�h��{�g8����EO��c��D�����%
��,����N�9<��B���#n�#p�*�j�(ǻ��
��J2��g�<���q�N�wd�%)A���0�d]��o�p�
�f�K�����2���=�S2OK�G�G�Gr�e���X�P�	NdN����E�4̗����G��ͱ_@@� �?��4t�36u�g�ߵ�_��P��]�毠Q�t�V#|F�P���Vn{Q\heR�^
>:S-��_GA��~r���Y�%�N&��'u�^��z�x��ŸB�T�S��`���ii�5���4�S7�Uw�b�X�U�8<IV�S���|�B};�SkvTV8	Sm������U?�1n�M(�E�	�r��X����j�+f���ۇ�93)�x�e�=�8n6�;l�^L���\a��GŃO�X�u��L�$S��C߈���`jz�R�4���s��]�F傉�]�]����$��ʁ���'����B�#L�Ʉ$RQaf+���pס�b��r�(��nj�'�6%��a���άr��]��g���-i��+��h���9ť�Y=�I��n��m�X2Y�ˬ�%���9X��^��ϗ����Vl�y���1�*_�ïV��j���l�d��2ܧ=c,�j�ڳm[��c�A��?��wQ�2u���d���^r8�j�E�j��H*H�*���������駤߉8�0���7�s�<���6'�m���:+��1�?8��ʎ^z` *=�j�0�v^�ݿV/$����T^��|���fQ���y �ꊇfȈ������.����\�r�)sil����)���G��LJ<�Zm˶Vw�C��b+�*
R>^iS"���}{]���S��k�#��\��v mSi�i��u�V5�bh����$R�.A#*�5]��j�

^�������L����F�ޣҍo.��u����p7`،�W�>��
$���{0J��%b<YB0�A�X�"ǝ.�=�"�2U�����/��C.�fa3GJҼ�������Wf#���?i����:P$:�s����jzy/,��l����Ͳ
E��H$��
��S.*�^�l@��,���!��:8q��L���T
u�UD\�
���{K��0��,v�ϒ�h�����GW&� yq��:�~�;��ڏ��5�߃V��u��û9: ǻY���*��VŻ9l�b������ �ksc�v
]_+ח���FUkԁ�F�9��zx���X;H��
�r���e�9#���5�n"j�>L��_1n&A�V#��=��d�����]���w`��h8L�a7,�~���~.�el�ý?�Bk���:���%8�@�>�%�� ����%��_�4���0׍�ܦl��;-�;y�bq��M��{������T˳�0���;J?"lK��Iےu�����S�L�N�2`�8b��JA.ȿS	6�D��^�A�Iձ�p��������;����W_�vѣ|.��
�:�js	?;����~xKQg���r�O-y	��w65ܧPA�]P_�qQ����:���
��<����T�8�1vs&�]�������՗nV_[����S�<��^�w�ס��|a�+����c��F$�լ�����lɛ�e�|�qd���V���F���|�}��������*�Tᛷ�����4(t�e�T+ae�y��Ql�*�+oA�<҄�4�*��p�������&p�G$Qj�J؋��\X��6�A�|/��q�)�7-�61+q�Ւ:
3�7f��h�*Q�����I)��|[��	��T	)��e���J<����o2Y91�j�=�
h<���|t�)w���צ�|��|4lmU�e}�;b���Rw�5,OP���<6w掝���������g$x=�`����Ai�fk7k�ɤHͣ�s��2��{o��s�kDō��	}�ഽ���Fj�[^��}����_��n��z��%�j�qv�v��y��;�a|�|��!6ڃ���*C9��FN��@}u�X	v`R����P�4�m�GGoR8F�]u1��x��ϫ��_D"Z8s��
�{��J.I���d^�TvYV�{�u�OU����W�oר��v�.��_��?n�U:��ވ��7��N��\�������9@�~zC���Լ�T�#��.�zf�M;�4,nX4l�4g,��b �R���q0v������G��j[����{�K�D^9�3z��ӧ�L�Wd��y�m��)!�(�𖱍ˬc��Z�����C�_+g��M)��t����
�T����m�P-�C�ģQRYxԝ-�<��K�5ز�ч)5F��ֹA�L���������q�[E�ɧfa��5����KN.QΔ�_���}рUIJ-�����8pI&�2)?0M����ߕ��JA�Ԇ7�+���$�
%�K��nsI���Q���kC!��$�cw�IJ��!��NG���au������Yj�vb>�q��v�)׹MjT�7}�	C{c8�Z��=f��{6S��"1��޴��+B�C�� ��zN���̨;b�ߓ��L�-߃�^�j�i'<������8'��������u��v�T�+&SŜ�gw��I�����3k�����۶��m���mv̎m۶����:��g��U��s�XUs�9Ɯ�k�X������]�
���I��x(�����癤���s�˔�̆�GtW�6;V��w��D28 �xXy�S =���"�
���ܪ,�I+�8�@��F�#�,&���U��P��M��$�J(�P��n�$N�2��6ɐnA;��H�
�x��l����7�pݯ	�k��*s/�p��(�\�������U�2��R��ʎ�Q��@�+<y�>c@����*���$�M�h��ܨ�Z�wߗ�=�l�I���N����L*�Qq��MP�?F)[C�3T��7ȭG�w��G�r��˝Y�4Օ����M-��cB�����l�+��"�0y3e�������]��''L��"�����"5��4F��oE�SG���j΋�}�5A�����Lu���"�a�բ;NX��%=T�Ȫ<EJ��X+cUf��Bw|�揄���46npc�y.��e�h,[x:��ԕ~�;)�hw�����W�`��!ɘ�Ti2���V;�P�c����=wM�Ɓ��bV��x�L���n����d{cn 
�K�F�6rh�E��!_�KW"������τ+���Z�>Ɣt�'��ni�,n�+<J��
~�)d���$��X����[�7ndY�O�S��CU׽8%S�/n �'��-��	u����oH�m�"�a9=&�%�.�R�B��������*VB�Ȉ�tQ�/�N��=����g�E���j͸�#O����ظA�M�*c>A�gUlo��QR7DN(�#!(R�њY�Q��RN<|��N�Ì'mt�ur�dj�%��u��Ȓ%F���霐9)��#?ٵ�L��_yf�X�.ig���u�PpEU?sJ*��nH ҳR���q�d~�[+Y̖?��fa&aÂ�X�,�`�̤���rāU���x+a�~�g��J�Z��k�qu�N��גx��Mf�#HY��[+�9�V*rT4ut�3<���{��1ظcj�u� yc$�.v*�Wk���@!)�5el���]��z�'��3]�s�JS;�N^��'`�Ǣ|m��=����	��ȅ�ڼ+�t�?YM+
���l�Q+�Uz�%�yM��bm
���
�䩯���墚}[���~RS�@�˖�-,�%)]l2���Tcr$��<<�=jĬ]�)�ۃڴ��U����aew�ܝ��mS�H)�'U�)���^M�F�i�>���H@��{�M3n^�[:_F�miN"�}�v#�EX�>SvN�Ev)����o*��D	���{�a��*�_����\�!�c��TЕ1��\�P(�����H�Q�Ih�!�Y���4�mM~!��)�Aj+�1��L�7A�b��PO��ڡ'
;'<��x\��l�,|ܯ�8� �ɢ��$��#5�1dž8b��5$M��`��a��d��9��%�����'���X!�͉�'�+����y�'^hk�FqlW��
軉�Li�-���cl�-��ߌ�$����L����vn6>VE���$�U	�h7��j�O����6ڙ�[�J���U��HxwsG��&~<:?��l7qb:K��*Uin��D(�YRϪ8qN��E�Q�5{��ݠ/->����O�x˜�6������.��a��NM���I�TI{�*�a���e#���T^�Y[Q$�I�\I��ZXM�p�,�[F��f�/-�)�e�MCa���>�W�
pC��ߋ�͘��3��J[�8?4��} ׫ƫ�)&OՆ����ÌmL.J	᣽��z֗�r��w$G<�/D-��t�f�]��4���
&�X	$����m�R<���)�w{��K�	狇2�YEZ�@��3~���wk��A�@b.p>�g��(����� ����I�_�P%��ER��	g���B�AiG8�F����L�xx���7���L���_�>̇X^})P}���(�����c=���FSN���5�����Pƴ7���!�I��h�I=4���XǙ���Cd
G�W��ʁzQ��c1���В�`Ѵ�� B�	q{2��|��N�G���Sl���.C}c���1�)�1��]���
�[<��7��)�A�41�{�
'E8������@��-(��Dh��
D1K+�� cTw\��0>����O�o脭h�乒����b��@V�g�ʴ$�yL0��P�Ι��
fCb��E(*D��~�z��}�,:C�D�y��y���v���|A�E�U0��,�I�U�d�J��E)�H6��T��W�eL��(�hF�P���+�wb��W�Ea��,�
�.k�cִmM�2�dԪ��h[����Ɛ^l���>٬���/���'���B���ƒ��i�Х[��V��h�ٸ�V�~%��䘉;�ײ�QmzB^G�+�hڶ_ayšqc�E��c��f�
��|�s)� ~��V�ب-7�n�E�vEa`��Ī�n~���`��ѥ���c���AW�A''X�W����l������5z��[y��R��Sq�e���V�Vv�Nj� ��a���|�n@�rޡ���MY���%J�9P.��j�W����&`9�!Q��z��m�X�c�J�O"�;MU��؀�K�9j���d�j*7)jC��|��z�M�f�����'��l���I&F���
Dc@�"_u���c��^�"B����M�`ޔ䎩���\��	�����§cdsvEƒ�;oW;@?��&�5Ϛ�̧$��8������V�=S���^�J�WS}m�;�.Cl,�Y��r�BoJ�w��=��Uz,�N`�r {�Z���k��A�t.�T_����7�2~4m�C����yG^AI(ǂn���qek�|�\Xf�L�����ʺ_t	�<��P��'�|�-�6�f;g�*r�x�]g�9�á��5Ykҵ�;Y��|P�3<�{��k�Bد4�t�'7�}3�u���{�=1��ScH��0�iOV��g���&U����j�)w�)��{DZZ=�ј��[���8�
���!�����"cT'�fV��o��"�0$0`Fh�p��A�$�("�FK(@���蚧L�V��F3�����Fg�q��|��(�\~�\
�:�\���S�@�lm���vtH̢ʨ�Խ�F܄٧��u#�&겲W�/�J���S�M(�,�V/+���՚���O-���դ�)o��
��en,#�I��!��Y����;Ψp�Y�ӕ�o�����cX�0�$��ؼ�Cn� N���Tg]E�
�QI}�Q<Z�;�t��:4Ƞ�_�!��=Z�	)4��uT�Q�"����bU��Rnh*;t>W�� � ��h��
�҄��Z0��R@bMlx�.*u�8d�ǒ�ٓn���WP�e-%�B�]g�x�h�`=�/��`Z����(�Y(�H�8���gm�0q�#td
�%|��<.��S���eb:�����=j���S"��w�ֶoo���49�����v�����I����Q�5�a8�o�^*�]��Id!!80����a�<$�e�6�����0��Ỹ$�kK��fq�IF�h7�
0sMf��A����g���}��̓��#��W'��Z'1o���
2q�ZB�\�}Z
��w� �"v=�R���џ+!_��
�E��wG�ڎ���MC�}�љ��f����c����q	�	��FѺ�7}���**��/Q�j��8�}�x]��Yѕ��#O̩���dm�]�-}�.�=?���\�p����r?"�T�3s�v�A�a��>�~�Q"�[�[��Ź�7/�@�͍�C�VƶV���wy��Ӛ��yw��0�pRQ�<���Ȩ!�NF�b|�v2�n{�B�r�á�p��:�_�]�۳ߩ�Z�����t��z�z}�_�!�D�E�/�~��I)9q�+G˰�rR�z�[�"ٿ1�
$��Oɮ�s6Y�A�1��%N���o���f�UsNNɀڍ�k�Z�^{�	g��D�phDe�dp�qjd�;�l3ߥf�a���;C�/�6�S5�rS
2�?�
JC��ky���/��p�]�0��Q�b'�`����W�����a��dnZ�B�g�9o�!�`�oUi*jrd��2R\�/fq�FciN`���dN䟣!:�1!�[��hI�=�:�2�E���n�7"�񚳔p����F��Ζ0���	<��%�7'��7O���|5��Gћr�w�}�m���q�_iir'�j"V����&W�;a�n��Z�x$�(>�3	�(�3�6��B�h��%��.��BS�M����oqp3���8�b�������C{nX��1
+"yU�%W�d[���f~����=�%C;v֌�,��q�j��b2G��<��wJOW�R�
�&�~�t.N�B�{��f$��D[�I+��Ɖ�Ӊ�
��� /5�rO��g�Kk\F�9���0i7�n�K�y{^t��U
	g
���S/QY�~{����L�\
��R06��kbd�Yc���e�����ʡ���^u�)=��H�6��b*��=߅��P����ΨN�.>��iI<�����OQ���h�3�d\$�܌l�������Bg�L�3��m.Pΐ��՜�5Qd���Z����e�xe�ȷZQ1�B�w�"��R�X'g�\~{0=_}a
�_Pr��I�[�N	g-�2R���u�Knk�)��!]�������F8:ו���C��z�g�y,���#
u߅��Kƻ����2]}��p�����귡H��]	=uz� �F8�bV�-Zl}A�}R���/3�0\}W��f[��_o�v廖�g�<}oZ��J6��Y����Z��J�NX>弘1|Fol�.�X�!�!wM,W�p6��A�u>nyT�oF������}����5���cˁ�f���St��ߤ����<���T��33��pt5��L�|�~^�rM	��OPQ�L4�����f��PTl���{sT��(LVi���m�B�G�$gfJ��'�O�O��I=��G\ �u	�>���62���q2��$,^��Y���L-��,���2�v^=����UZ�X<�^P����4Օ�›o�v���Yrq�7Zl����wn��I�8��"%K�Z.��<uM}��hS�Ͷ,��/�[K��ȳSX�p�'�I�_a�s`�6{&��͖t�O�i��6J翳�h��Z�K�n-1���O<�U��J�����#�ݩ�E�:S�@��a�0�W`'?x�Cx�7��؏����Z�.�X\`$e�nXp��K���L�J��@���6�Ihf�uԄ�9!D�z���)���3��*!��@�0��z=��9S|�Pn`�@�);�$�u���|v�"l�g�Mh��W�R�p�%Da9�Jx�~Lܒ�: t��֯�v �/k���g��i�o*�p���ט�]�sE��706�˷2؝Bh����nˁ����m@&C����x\�X�r|t�&oX"�d��`��1Xf��)v)�lʬ�Z��5]4�5f�D�g�����%�H�\_�X�9��0��{�¹Zw����}i&:���*&����v��+�&NA?�:}w�P8>ղ�(�a��U��ߝ�R&���b��H�L��N���l��B�U=cr\�ev�`��k.I���Q;fL
����@�=j6�f�'8�3i��S��!�셫=��"[���3�N�	`�H5�Gzި�%��A�\��-5Yf5�C�E���ARǽg�,������f!����O���@���O2�T_h*^�?p�H�ͱ>�l�+�J2lqpBh��[��Ҭp���W�4��25j�����R�%���N�� ?9�h˃��.W��}�zƴ�=�����+Q��d���$����t��y{�)��Vc��U�|"ן�F�X*��)	�
���{��:H�eAC��.�A?�DIftC�;�\��R7lYa�TRCj1�?Qt�g����X�#�W���[�@��	�0�����嚋�����P���@ڋ��
-�
��%wd%nb+Z�>�=?��S�s��6�`{�~	���("� r��[�I�x��"�,b��.�� `˿Q>�	tP�i�SGA�9��8�Z��h=%9q�;!)���b{RZ���]W��H���dGW+8�y���hr�q=���#�wz�ڶ����Ҫ����ኽ��ھ�+xSYr�씝z�Ü�zw��M��b���"'d@+�*�]q���	%�d(=�$�#"�Ht�9q�@�t\�T�+}4n�Ve��[ƫz�
7��N��i�Ɂ��t�!=��x��w���3��K�Y�J�;���[Y�n�
U�X����[X���÷�Q���v�B,��֚��Y�kd��{GH5L:^u�[�
0lA�{0?�T.B-J���x����}є�#o�B�Ҷoƺ�&#T����[�-g��.u�>���&���L�{N��o�K���/\��|/�[�#4<�:��˩ˑ��������ճj����V��	�]˜ft�E������G#m�{n~�E��/����w�	J�ŢWZ�t2g��=|�$vZ׈xSU�z���X��������GtW��MQ��f�	#�����!�~�g�9��~zY�
��y�Ϻ����D�h�lpo����z�]��8�[�I���jyFޮq���*cQ�_�	(��@���V��M�Dy
�!ׁ���S��L�r1�?f��m�� ��K�aK��d�e�
��t= ��(��&����I�=��OHA��I���'�\�k�
a;���z}��+��!���׌�ؿ �x'��Q����ԭfz�q�YZl�fȎ]���ec�Fut�N��yF+���귅/�L����o��a��k�v4��'�Ǔ�.��o�|?x~�ЭP��ۘ��O��P�����ί���.�`Dwzr���F�5�Q*�"�7>B��RH50
�;J8R��K�"�r����l�"�d�bk�I?��3+��7��*�s��h��c���-W�e6�_~EcH�PY�N�3#`�Ks�@=��|O�XÝi6!��R~W�
����οI�W�bʫ��z�cS�tm�[�ɋIDY�����73C���Xñ8H~�j�n=��A�Em���t�C��Y��e3�;I�(x�3�!�B�i�L�V8��f�S6����<�Y�D}!�Vp�[e��F5��+H�A�#G ��+P*�ʗ����3�Z�&L��+�&痌5z����]	�k�)OΙC�� �� n�Ж(�M��}����n�:[��9��;a]ld�(���ܚ^o�g}Q�f�̑s�C8&�C�!�V��%�l��&��hJ�l��NS�yD�W/��	�I�/B<A#Jd��j=��*yg�,��G�W�4�f�k�����&ۓ�tj_�0�6�@B�a����vN--}�$��r:�z�•��b%���$��:?q>b�qi�|�,*.1z�C���6˰̶Q�U���=��.����)�GM1�E��w|}��cA)�|N vw_�[$ȘLJc
��9_)W#dd/"��
�LQY
U��0E�ǿ�Fܕi�ɿv&��^�Qp�G�-4ANqCe�ˆ���X�"�d/u;3>\FZ%-f
��d��Ȼ�,?E��zW�����}������Ϝ����m��ИFg��$-��`$u�_��&���1��pP=���}Z�>�gQ䖮�C���嬫Me��:�u���v����4�b��4�z��ݾ��e���O�+�0���R�r�F]_�0ۜk�'mR�Q���L��ֱ�7��l��<��u���)��S��{^����0O�!�n�7����9�H��:��s����~l]Ow�_��v���)1��<��.��^W��;�Z�?��^Pã��i����^�pSb`��$���3��d~�}/�M��d����ph�����~�t|�.�1�ޗ*��P�igt�|wАx.+a!\�eIM�{bK�)JtHO�҄���`
�O�`y������U>����x �\nu�˥���*��/�1o�?or5�j+Q{,�[Q
�q
�� �Q�y���b�D��f���o����a��\#��~�i~��6U~���$?��Í�0,L�Wf�}�i�X0��!�cW��+R-Z ��'Z�{Ǽu5ۭ���m�)l5lA�,�v��r�b��ߪ�^�_5�^m75��ʤ�Uv[��:@�e�\���Ċ;d]؏�p�I�1�T�_{���G�*إ�K�%��Y˼rK�!58ի5��)�X�~��:��(̭[�����oq)���n�4e9P�Q�,�]u8�gY����~��=P�9�kOhU���|�zy�J���(S���J��i����ʒAtq6f�q$�)�<���97A�2�e/X��!AR��ۆ?̯h��̆�I��
�V�pIM�Oy�ѭG5�hꨪ�b

�;h,"��ƐD44�{W����Eqg7����Av/��~��%	�Mu]x��J;%.%6R�?�TL/0/��[��xbr̾�e�Y�Y2�#�!.��UL�69��	�����MFo�k��S��ŷ��	e.5�|�����J{��1�؃e��M��*�˨�.�4L
 ����!g�u�����ߋ2��$#6��?G�e�C�lT���Hk�If��ڙ�u��(�r*:��2$��0*5r�!�Y[�k�ߡ���pRx�	��3xy�b|8�&�g��f|���f��Ƃ�?�z�eE&i��T,L���+b�X�d����X�G=�E���[i�͌�E:��1!���:W#El��O�w�NV��'ݶ#�����d�e[�6K%�rUg/��b	�JKŚ_�Q�q��#�*n��6��v���sY�sk�E��\�m)#�?��F.VK8Ĭ�Q�ݞ��xM�E�I#�����Z̙@�^��{̮��{.���-n���n�w����4�0�&��N�7h7^�:O��RL1���-Vdw��δ�Yo`�Ek=$˹�~ؑΓ�kڃ��mZ�^� �,�д���&1�1�5lzSmR�2�<���$Χ/g��2�tVv��ٴ/u-q�&_Hi��3q�)���U�䧪�~׌�7)���b��Ӈ;��f�ޤG�azٖy�+���d��Z
�BN��ç�r�����lBgU���ɢv��i��1������j�F��8�<�#���=�v8-j�
��:%r�/!FrQ��7Ι$%p��ˆ��7ϲ�u�+/,;@��vd��RZ���]�I��d�]�f�΅�3$UG���&S͙�h7'�9A���]K��=S�K_�pRݲ����T��n��DQ��1��j==o`��u�H�M|ғ����o�c���f}�g!��\q�j{y����bj����+�-j��c8���cV�y�E�A|ʷ�0LґtR���D��GV)G{*v��BW��UU{ɒ ��̺�������M]�޾���2�����i�h��K�֛��|��	��=��-�[�� !���J�3��(B��`�f�lh�Nk�M?�o���xJ�3�?ފ��
:�hH����EK~t�K�wp�����V_�Ÿ��ƪ��H*`"_���͊x��V�����ax��}��U�ܖѽ#~�`���𣡹%�����arCJU�N�9�l�ԃs\����ΎQ���((�}���BJ�(#/1|G��PB���%��]R����+�4�T.�e��50�q��_��C�A����J�H��?������r@���矤��[����KZ4�����������;���u)�_��<�9��	��.y��
���<��������j��d��0Xy(d�Y%������GB���L�˴G�}��A�#�5�M�|�Yr�x�Ҫ�2u�cr/�vE�d�Y�{pK�Ho��2��-a�������>�yE��LCvf�7��N3,Zs�.�;��f�BC�G�B#�@�
^�v����f��z�̲%�.[�_ &
t��,��W�WS�������\����6N
��<��l���c�?�&;�:�#�,�*�qK�����.�rҨ�q��I+b��b���iE��Nj:Y0Q���Gn���^z��`p��O��G��z�c�[f�16�5���d���?ִ���#���n0�G��Fݧ`��4��6��ԋI�X��*~4:�z�--V��� d�	�:�9�#hG%	�V8^���X��Ia��O���~8HL
�_�v��z��U��6���O�HY��Vn�
�`H��؝��M��H��5:=i��5�����h����[��LUW,'ط/"�G�R���C�
VG
j$�!��qw��?B������Lt9~�z���8��H�I��}X�����A9A:%�:.L��,/t����#�G�&*����4�]	Hv1��r}�5��Q�B��!uR|k�9�7,`sIl~�2kmKbO��C�
r�7Hْ�7�>.V�d�|N�,���^�H��!ʙ�HC'�%qw+�h�}^��tKd|w��C�u�0`�S���ilT���=�2`2�g��)�@HND^��mZ���UK���?PF�3w;����m41q<`���z"ͮk	����13E�+��ĩ=u��gI�Rw�����o<�7wd�� !*���v���Wÿ���n��+�<����w�6�5E�xan�HzG��o��P�/(=�c��}O3�[|Sw��s�0w��Y%�Q6���8Xܫ�K��;��ה���4�`�ُu���#��ζ0}'����n�V�t�+�C!�k'껑����?G���1�_c�2��YWX���E3+-�Y�|ie��� ����ŔC�N9/P�V��]�>�Pn6��c0	���ׯ�생��/�ڐ%c��n$"�������k�	5y�2��������,O*���b�G%��*C��|�Ěka�b������3��vz�rj:d���_iϻ!��:�4��R���F�.ж���Q���q����̧��|CRUS(Y�U�D�Tz��P~�P�����0.b����T�w�/Ѳq�yp��v�	;D6����'�RaR:�U,��>ֈ��s��,^%&���ƀ�)�&�+��� q�Q��:������s��VOA�ѡ�쮵���hގ0d�k�*s�����jw	0N�Xۦ�]R*U��6@��]`��0]�ȴdL/EV�y��;����m�f�03����'z�n'�-V)�h	��	ϊd/9�!7����g���mUz�%)0�Ƿ�W����A�1�;�v���*���w}o�GwރO��&ej��-]^��)
U�F�{���噁N����y_��$"�y��Ddz�><;A�z�<���&܄�n����V���Ro1����[�+��T��'�}5���4�Jy�:m��
C��Q������`$�f kQ��8��e��0�׭:Ӝ�`�̍آҁ&��r-�C�jFxO����J5�7�Dh�X���������1R�i�hݑ�~ť�S����)���v�Us	����hH���r��ut�xQ������b�����W�j�S��;V[<��!DڞkWX8������М2�[�9Eݰ���٬����q	U��;q���É�Ğ/V��v�s��&������'.���b���n����Y����vC�\� �<���b�84o`8�w��_��"�C��u�)$	�
�Wq�2d��퓸�Ϯ���X;Hey}fuz�=��7:Y9�)I4�<w*Y*΋N�������s�M�xx?�v�Z������+߿��e�)���KS���rbi5y."�+��R Q|�HsD�p�VS�9/5�W�:u���?m�
�&mmm׵9��?U"���HF{�:�]KLL��9��%�v�n.D�f�YTLj���ib�ܓ�-�V�B:3g�	o��O�]ᧇ�����!
�f~h��.P�)���R4az�VM����d���v��0Wԟ�W�`��!l���?���=��J�|@�+����b��f&�V��F�F�?5��z��-�l>'v����g���ʜ�`�cШ4�牮w7�[�$aP���02�YVuPk+a���9A�l9�8�IY,��[|�ic�YH,��{�פx�ϓ�B�P5*���d�Y�[+c��E�Z�<6^OX�KO\���{t�}[[/P�eE�",ߓ�+��%
��^Ir����F�:,��+��}���핂���^�==Z��WXCW�\�z�86K��9;�t�;�b7�€-V�|L׍Ɲ@�;���v�7�j��y{b�Ͻ��h7��k�qɜ��3��湃�7�7�ěcs�Cߞp��F�>w�<�W0�o@����ܽ�ܞz�u�&wY��R�fh=��u����}.džݨQ�y�v�װ
�}��������(�(�q���f<s�����
���|o X�����1��D�CÕ�s�f�Y�w���f�z#���╋�#��.��y����@�ր�����C�{��3
��'p��+�c�^C�|N)�.-����O��.�ʞ���S�ts
H��n͓٫� ��J/Ϗ�C/��6�,��̈�'�'���4����$��>�6�2#�8H-��΢�n�΢�~�΢�>beD	�΢��Im�iW �^��B5nk����<wy� ���M8-p,��������rȩ��v��<�(�]�
��B �q-q	������'�Rg����
�Qo����B���l?��$Gg>U#�RI��}E[߲��n˗N&Vً����DG� ���<J�^��QB�u��/osY8� ����1X^q��	�셼�;�i�4
��/0�J�ӊ���ÂX�I�!���\�Q#P��D�r~С�^���)g8l�Yۆ�.�m�
�,2k�f<�
��D�a|Ӎ�Sf"������X���kf�K�1]�\���=J���u��·a%S����N��"�m�E`H�WA�÷1@2�� ��BwM<D��A�."J�ܵ$[Qo�F���
�)�>A@pGW7�X���}��-�3�<#���1vpV�B��o�4�Y�a
�6�gh�����2��]�/���ٍ��A"�ai��楡��}�G���!M��h��ë^�%J3D�H
�A]H����&d܊����a�r�eoT�	e�5�W)�l��lH�����E�B���4�m�™iJ*Dȴ9�µ�M��xTi;��]Q�V^�r���C�db"�BU̠��k�#��ф؞֐���"k��i�(e�g�a)�`ܛ�V���j�(����\A1���|x����悷q��-*|�e�:̍����M�s��;�D�hN�D����M�"#�?����=��ux@�5��1H�z��HEW�
XO����JB������E�3�tŃ	W��

����J&x�ϰ/��Z�c�*{g��*���A��QB��i-/�F�a;Z�_S��Mݒ��*m���%E�0:�s��.���r�(�����uvO
��!�#L�M9�F(r~>6���p?%�Id��$�eo�Es�$�8P�Xy���2�m�+���� ���Ʉ{g.��(3&;�
��p͍iW��8]��EY�Ry)�ըD��c_�l�q��&�QI)�����yd���F�u��ҫ�:��:y	0��-z~�"�g��ᇁ�UT}��66����xQ��}#�j�Uȋ��gvAȬep�7�W1R`�ӥ��~�S�]����|,7���	�0|�.gw)"=&LHa�"��A����}��]ڣ��
3��}J��p�8��Ay!��!z���ЛM��Sh�[��ONa��$�ʻ:�G���8���VF�㌰;%2v�3*`���$	)�͕�b7�3�G��M�&'�ܶ
�6�t�`��gכ�\�nu$U��
�y0E��2?�M?���k�~���s�N.�G"%@�^"&��T�Ʋ��E~�@�R+\¸N�~N�A�	s�ָ��|���8�]�̪�]��;�'?Mڔ���?�jA��ܴ�Q=�͕4bi�5��<�������'���i�('��-���QB�\�z�(���␖q�r�>Q�h��ۜ0��y�-���w[|��5�B�̐����՟(;05��6�_�V��f[�
�1�pabFqB�{���Ƿ^o��T�w��.{��	u�b`z����9�=�Ԣ�(I�!34��{����z�v|>78��n|��:�l�:@~�Ȅ+*fN���LZǞm&���$�
��T�beԣq0c��d7�̆@�_���-��>����=�Z��B��{�����4`�+� �m�eꟕ��x��E��#Bw�����66-��Ϻ&.����quB�x����ø�G��j����e��22b���;;AJ\��W36����&>Ɓ)�X�K�R��<�WFU���b�C{\��7�D�U�W".ܜ�[�GP�OCN!�4�)01�W�0Ve8К����GJ
�E&��ɱjs��E
�K�GDW-��v#^
��t�gɬ�9l`A.�@���f]i>�y™ҏziEj[�hD���;��`��~��`��f��������E4�"�湖�cSi���k�~���n�dd���:!�#��$��R�$b���CH����p�zw�g������r��B�?SU�~;X��t��䅑:���NO�[`%���!	a�'^h�Y5��jq(bV�<�0Ol��)�FOfZ=��i0F��k�.?iT0_}S0�<)K�綡�����}�	�س8,Υ �s�"�
V���œ��uQ�F����	�!� ��a/��-���A�JS�tfXF&�|�#���N�t'6�56j�5��8��6kQ+>ދ���%�����A�����[R�U���K����Z�@	nC������(;]s�0�!c5VhƘ�=Jo�k�B�H�~jk{�����S��+Y�jJ������^�ezz��u�G�a
���R��[O#�P����a=m�Ry�#�c��/��Ȩ��i/�!k F�#+W`��'8��Ïp���ɷ9(S-!}�XP�%}n��Ĉ�ECT8������đ������浾�yu�����?����h)�N�X�=��#�4q��<\B��Aa`��΋y�W�KA��N�8?cx-�[���Bz��,
�Wux'���8�{U~�����KW�4Z��+d�.$� �=�!u��&*��0t�x��ɼr�P5u�XR��L�At��*�p�>�Ԁ��5�x�|�Rs7#'|^Dj9���1�0r�(���M���Zl��\8����Bb'�&���+
Zc
ǫW%-=F�;�9IçCl�I	%F��be��(÷�v�G7�Q�/��kE�Y��y$k�������%��Yig�ڄ�1J��u�/c�K��p�kH�.˝jXa\5��/�H�|��X��E�(y�]���5,cE���ꮧ���7��˛� zM5�4&r����k�+�p!�C��ͤ6&�L��>LՇ-!�&�@�p:?��������q�^��u���6�Yc�_�A�k���O�׫:�M}y��
�P��xri8	�&d��	�6�����=CLתcY�`���l�^���K&�jr���G�oV��M��T�=�%��&�ƴ��5����]��9�
�r�FX�+0P\9��u6��pP�\?'j����3om�&c�F�eٸR�?����$�`�R��`|˶ 4򯄼�m牪��S�����s����=rB���-�xu}bꛨ���$��3��w�<�a�qm�G?x���S��I�"��
cSOi�3
;�,�3�oп	�S�*��F/T�ѡ?,�Q�>Ѡ�p<����\!x
�\�@���@�2���l�!q���bמ�P:�'��Y�sy`����e����^�e��H��$7���@�`�r��ջ�-P���'��f�T�ֆ�6�ԗ��&A8ODK+G쉱�qG��gzR�t&�e����eϰhOݣy�w�;Xrʄ��p1�!Ӎ�(=8,
��8�aMQ��
����gd���w�O��|(4��Iܐ��Q×�U�A�x��R�ìE�:DrS�z_�OԃQ!U�D��_�?��c�.@�%ض��m۶m۶m۶m��m?m��޾����N|�3Q����dE��SqNr����Ơ�#��'9���ʙ��,+���Ab˓�� �� +z�������r\09�A|:Ch4�߈���)�J���/��/B�]?14�D��1dz���6J�C�Bјk��-h��aK����\[f������? NTBm�'�O�A�/n������ot�ڕx�_�:��.Zb	n"�`R&��#�j{����Su�zw��=4]=���|&z۾$ o�{��8�ݑo�~���E���ӻP:��Ǒug�8z�Y�$CN�2��c�d^��\#.���d~���$��>n�hS~�_ޭ���G�ˏ*�Ğ<)�������c��D�Q�=d�'��0��cAd�'Hn� ȡ�c�?�qMÈ~t�p|O�ȇ�RO�`�O37��	ѡ�(�%#�c+Šk�=�^�Ib��C+g��5U�DX�1�U��
��*S�S�R�.{�7�d+n��$i
6�����o��n.�Ã�ι>1��ԟ��������&AD�!�GyaHtT�4���{��'�`jUI��e��%r�{E�tBI5MW�$�-��
�m��^��f⣰��!&���ؔ+�i���o+G�Z�O���ly�Э4gj$2RLj)���j$x��g�dp���HC>ߵ��2.�����QC�M���'��.�D3
/Eg�dO���/Z�꭮��8_&���U�ZrX��b\G��;�g˾������3ʲ�[��t��sO����4+�}��W��u���F�]c�$Eqcή	�4G�R-7�>���7�O��*W��@�"yٜ@���I�%G��S>�H��}�w���չZ$g���?�ů�v�WU�I�aq����ĉm^��q_��d�aX����%N��
��B7-Ju��gN\��@g���	����gg��N���o�U��_����&�/�Y�
ZtF����rD!�L����;�s7Wcg���mp%?7�ɂ5�����������ŀ>�J����3��KśH�
</��qB��ex��e�,����
Q7�}}Zת���u��w��|�[ͯ��.�Y9Չ{�p
D5����������>\N���*���H�ܫ�KDn��ᦱ΀�+i�V
�-�O5���U�դ�&̇(�1+�)g��ӌ���tLyE���U`!M9��1�Q݊
�Ì�.b��C�$�i2G�J�1鎐Z��Q��ŀ�V#�-P����R��Q���X�L�S�-XR1��($���������#
����9��M��;��{�a$�	�,!FP��O�8�5��G\?����Ж�������[D{���+��Ţh��6�0�D���� �7�S*��'.�G�;$}
ޢ%�،����K��l�yV����w�.O!ޢ��mE���C��e��%�m �E�'淰졔(�/3�Db�
�
n4�h�H�!�gŬ@2�;Q�Hq��Jʍ��-}2��� :;x���U;�G�Q�p���b�̣����OoH}�g~BhS�In0$�.hV�:
܈B9#:�8�4��p� �}��7���K�	I.��Wj9���S��XV*�L�fZ�V���T����d�^����Itj��uz��7�w��n9A�?	��53,/H�3�*2�k�Ԅ�&���X�8����x#�w��Drp'�G��-h<�u�B��I7��=��1��k�o�W�L3Kc�>�������Bn�^Im��1j�:��U?�Cm�q�b�=K�Ql�#�.omp����3w({���4��Ȱ��xN��h���u��]�c���&yH��1��XO���^��k\M�_qO�e"j������_�
�iF���c�;�oR�it�l('�"�!��d3�M�B(�bV���m���B�Io�Md1�C�Ol*�
��M���	J�	�bڣ����K�G��	zHC��ots���|��&��*�ͥ�,��6�
Q��)[
�r�K�g&Bʰ�(�eI��W,c���!^GPU"Pʤ8gVw�J��%r�T�wyd(%Ä;&2'eJmM��]�P�-�vͺV��O��HRN��<D��C��)4�f;}�}�̹��������
dbOek���kA����0�6]�{݃Bꚰy���S�=�]�\����T)����,���c��7g�Y�)������.@Z��SC2фW�w��Dr�&dΪ~��sFR1�o��r�ǒ
�f�}bϧCo�/]�h�h��!#Ao�e[�����{j_s<�'
(�cz��Ч�P7�}�y�X!�Q���}�Y��EdK�.vQN�f�hTc\�_B�خ�2���=gRʔ�oסąp�V�/���_���kB����p{�J���М_����P.�>��[z�#m������2"���CU-XbJ�j3*��u$K��+�HgḥX��Z���o��L�\���슥l��2$�elB��5i:�g�0�����z��_l�+:�~�;.L����|��vDin�ى��>�W��u)�o�;j
�F����II��$X�^�ie�^6��\p��~��ֱOҸ�"��)�$Cj���>�׉ܝ���y��*I.�)��eH��+�'3��m�O��y�!ȲM_S�(�5e�ȐX\�ҕ��1Ra��C�����<S���R1�D�i
s[��<˦�i0���l���Z�8�ӥ�۞aukl�07���[��<l��2A�8՝�b.P�.�0�Ͽ�!6�NX�i�(��'L�C��x�����6��S�@=$b�@2�0�(��u�-��rЀ���d̒��dŒ�{�i?�h�84F`��Wn<l<��ȡېHg&�j�c�g*Ԛ�ai�5�<�'���9�W���#5Ci�(fߟ�A�y��6��z��i
�����W�0r���)xgS�I����\l,�0���t�ZC��N��C^l�7�,u��@���N�ds�,�a!�l�tNgL&fg�`z��w��T�
�f�qU�x�t�0��
�荒���o%���:��ygi���z���B��@�e ��>�ʫ	F��+IG�c~�k�iiW����m��qr�QT���J�H��j�R!j��yF�秨S����/��1�FvLx4�-���q֧�&�o��N����N�V��+�Ǫ����b~�a iT����9O�m��c/&�\�E
�I�*�4i�J}P�(�xZ�BF�����
Y�2���>�{t�l��׹�HX���)�ls��uK���iR��vAɬ���sV�z1;k"pӁ���q��jz��{�}T9w_�˙ ����
n�=RfH��-�����:�%���R��V.�-6\���E/��Wu;�Z���q��� T�q\G����]|>vsM��6Lum��Ǜ�?�R]��\�e\x-������_�Iq�':�{�Lc�G_�>�O2�)��{���T�%M+_՞�������tLy�5ܚ=�D���o��"�'uּ�tSc���~�!�΢|Hng����[3�Oa)�k/}Q�W���Ɓ9%��oX��v�ᩲ���re9��:���8u��	��9�l�fs�dEdʷ�����.����~v�-�*P�A���"!5t�<�m�(ā%�-J떭��+lN�����)����QɤO���b�k�fy/�g�)Hƭk�gߡ����Uy/
��v�¾�p���ȴ�/ ET~�w��OY��!�L�Ԡ�Ou}��O�a����Np��
{�+}c�G��>�>%�sQu��l�/���;�TJ���k뗬�o��2�ȕk4��
і�x�@���
���P�@
zU-�_����H�u�[�� t�j�a�z��Ή���%���w�1;�ZuVc
����}�I����L�i��H�c/�X��N5Y�������us<��FÈ�k���(�_7.��d��]��o���N#�מ�%��Po��|-rw�����]u&]�BM���5I�4[&B��ы����/�z���_V�o:6��j��;%2X�*���++�aJ�7vY�i�Z]�0�����a@�g�2μ0�v�e��?�G����ZK�
J~|��_�Ȯ�D�k?Vت��p�v�3�b��3!vّ&}�JrؒU���)I$���U���e�E�v��ئy�4h�?RMt@��,c.Ȭ�t:h�@���e��HsYmj��3�'���V����(�@�k��A$�_\�U��jց�_��un��q~}��9�x~���uo�2n��V:~���o����	ӡ�[�)�#g�#��}��d7ld�;%�n�����_z�}v7
�Rv7�S�7VN��=Q�ynL�/.�k�J��#-O�݈�5���w?�[���沸V�Жc:�C9����l0d����V��-|�?!�/�������ЊX(- ����ƎϬ�����1��$�~y�j}yw(K�G���[�Ʃ3�\//nA�Nʑ$���d��/1�R��W�6�H9G���}H��O�V�kr�=ЈὩ<o?����V2��;DW������05f��f��n���I�˴�3��mg�X�A�T�����&�`����C^(-��̇>�~�e?��Ze;ZQR!�c!��l,��RF���3p�֡U�]�Q���ԁ�/Q[�<����e֜m���M�� ��Ɛv&U�Ρ�C&���n}'nk�I��6��Q@��ߓ����mD����$��ߋ��>C/9I?/Џ&$?�|H-`J�޴�cܤ�6�R����4Eio��Qo�xZ@�#X��Փ)������v�8��I�;cj�~��;��{�ۤȿpIW�'oA9�9Q�g��sI��+`8��������=�X� �;���MC\j��ra��]:���Fc|9�B�M�d/
T��:�n�_,4�����R(_��]����\�T^�0����.�c�Q����Il�//9�V2OKVv�����tubKe=���Q[���P�1�8��j��Вq�jci�e�qY�9�V���.��1Pѣ4|h��܌�Z�9�|�9�`�{2_�{��PpѸ�x��#�#������+S�!�;�X�����2��z�����H��Ξ�Y�z�AȌ�N���&Y�Y��ڔ���b C"8W�[�_�US۠}v��-=�xiY���h�S���U�����T����{��ڡG�\O����v8��w�+՘�������5����R��#`��j�=wtZAY}ɋ���+��J)��#%���N/H�A�1ߙ�=�w�<��`�5\�[2z+����t"�b��ç.���<��e��%��˕1<6,3������A����қ��#?)x[��g
s|�h��y���I���Y���A��V�I��
�~����3Nŋ���{U�#e�z���7sV�(��a��*�иkdK��SF�E�eK�� �hJ���F��$o}���ǩ���['�Ӑ��n�U�Ã�ӑX�,�Ј����w��H���ݠ��*���P�SLX1YB���<��iht�^m+[�h3�xEZk|��"$:.����x�2�,�Kt�x�0$z��?�'����(�?�?Ҙ����'���Rh����A%�چI�*�Њ]�
�)���qo����A�R��6�]5������J�g��`Mt�,K��fE��*�b��6<^�qN��»C&�,�FaAk�6�n��	FUg/�؏���b��ھ͌&_���"���$O�q�1��;)H^g.ڕ`�pal�μ�R�%�$��'B����)�}��vU�5m�Nc��/4b�rNX�8�RS��X'���f�F���n����n�֌�n���nU:
{:W��Y�s��3��Ny ��$���UΰB�2��:�G�A>�,QB .��b��r��ژ墴�=�[m,	���~�+�����P:��Y��G����H��$o��6w�)op�i�4m���25C�ɠq���/��{�q�v���q�M5y��>�mYNa�g�i�!A�>ߋҨ/s�D�@s�'�%+bK[���ˉg��`��cf΢e��O�����d"�T_~�ZX�$+Y/d�H˨j<O�/���C?[)�T�����@S]qq���=y��|�VZ�ssܪ-炣� .}��>R�*%@ˏ��B�i��u��mg[Q����72�V�uīfH/V{�Хx�%
�/O�[�y 	
�0�M}��h�
mZ��R��x�L�jJ{�
�+}4�D8�32t���8�n�9���%��ƚ�d{z\�Rb�`�2?���[�ּ(U09Ҍs~�{J�B_O(��av�җ�v-�>ڱٕ�}�~�h�����.I��*���nNT�XC��SWޛ�W(M�ͯ���	/��|�5{�)�ߪPZ\�z�P=�&G1Ɉ�C;NR=���r~ꞰÈ����x�|�$(�@w�U$mK���YGӱN��|�w�����;�!˕^���w%�F 6��oJ�bc�(��������1��$��')����y(OkH,���Y3R~p�w{O=I�/w��p��a��kX�r���X��m�F�1�G�FEU*���y��M��Ǒi�%�pG
���aoј�1����1&.pQs�$�#�ޘ�6�J�A�@5�ğ��&S� L��(o�XNE=V�B5�H;W.�����޴j;($�,���}!�� mab�?���m<l�c��M�2%��l����.����p�����<�8��`�b�Q��"X[e
���e�X<�<1[�*�E-[b�_��SO������ދ�����ߛ����8&Qo�(�K䑰1�H�i"u	
؍�j�@�>	�*I�o�_��L�f"Ό:��S�����B����uzB�n�G�?��o�b0<�Ɍ�7�e�IZq�[����[���*w��^�k�3k�[Mw&�U�f�MR�X�!�u�/�ɶ�Ր�;-�<���!�B׵W�֨��bw�ճ���Mw����ǩu�!���~�v��9[�M.2���Qh\�ꍮ�\C�?�[[-ή~KR0�s�SNa~W�
�T��ADŽZO����Ej{�l<��$&����	���٧դA:`\�T�}�uA��8kN71���?�n�Y���qL����h=n�Ol��ΩI�d�,M2γtn��W�7b|�р�����&6�\�ƩJ2�[��ԔTj��g��65�����=&�<���cuw�]��	~Z�����*�#��*m��u�Gf6��t�����%r/|/u�D>0�9����{�z=H��&��H8%y����D��o�爈���l�5f�ov����-���R
&���;Z��
��%{�FX�o>-du�Y�b��ЍvS�p�#u��L�j뗷�	�M�8�7��.e�%�^}vq��|�*��Iu�*~����Y0����b������U[��_���v,�)��=>��ɔ튁B uo%MH�:��i�uz�$na
2L�>Ђ�/{��Y���b%���p\���{&�P݊CoRފV��3�E]ȋ��y��,JP�=(��]�i�&>��QC@�b �o�� >���l�<�Nգ{��e3ؗ�~JN(O��g��~ �'��lV<B��1����(mH�ӏ����"L���T�� �1��j����8kG˲9�d�;Z0J����D6�Y�
�+o
��i��_�����`�}f>��������"^a^Y�1x\���Q`�MU��=!�K�T9������ab���1A?�+��T�)A�(�v)�z�O������G}�d�943'T�Eu9�rG/#jaCݿ5����07�n.�IB%����RA�z(,�9S�=��:'���0a��Tl��[�!d-On��7eż���7��m:����_Qz��^=�HxZR���3���e0��am���-Nb�4��ӥI�I|�[s�r�9�?y���xnMQ@��~���qB`�!���?񿲺�,��'p�0;���1W7����j��o�#��7���i�@R"~3��+b��Q�N���i+�fo�fS'4��[�Qg�'�
��6���R�Ŷxd���`�E`�K������Df�1iS��h`(=����X|dWj�Ҭ�Nf��i��Ả�6����?ޅ~�I��/3�`���\�\͸�8�q�������Zì�\��֠y��\�?ѿ����BSgٳ7�����@'ny�v�U��sXߘ��a6 *�k��0�z����fK�Ȼ��9�'�W�|�`�:�1T��`�~e~�$�j�5�;��\�l�>��:qSm�z��Vb��J�M~��1+��F4+��
������+��:�
3�e��r���Q'w���&5��e�Е�NS�{���p0�D��@���>;U�nGk�<'@�F�r�c��X��+ �4u�=��B.Z�6��5�{�Qu�	�	�&KT����?���唑�r�J�-�Bk7^�aM_5$"�����#�!���U��ZQ#>i�
t��S�z�?��+�eW��,ݿ!��y-eJ��pf{
Z4��$7.FAow�ω�����<sP�	��}JG�g��c=+t�q�>p��pDaPK��{��ñ�|�*$���<�i�•�/�ƒJ�����!]�o0|�i�."��G���ϊKl&�VH�ɔK�+�M0]�S��������P�an���uN�.lt��y����e�zE��
�Ek#�"]J�ǫXP�}Ӳ)�h�feI���;�������Q,���L����A���^��{f�$$��'m'Q� [�VĮq�Kw#���K��H[�zl��K�ʧ�ZefX����þ#��F��|����(��ğ�����ȴ�Pd�B��^F���z���"w�T�XU�l���{��EJ�UX�}�L/���3_=`m����+���H����1т�������VGСx"b?m���wʥ�/��)F�cz#� ��R��Q�%�/���\�uH  )��Y^�/d�=���]-LԜ<\��!-Xo}-������I2<;{;ܫ�Ĵ���q:��xs�4�ŗ�4�'��y�N1��`x{p���-�j�֭�0���t�^��
�Q��
wb��A.��rT�/������"���͢D��Z�W�Z���r�`��S?�c�є�#i�@9�B��;�����)�/mOx��(8���Y�r¡��$�8�0�D���'��_N����K ��fP	>�������E�h�t��)���g#������ke\��bR��
��C�'4�OJ�7׿�)��%A��$��ܡ�����&A�����c�@����OD���>�/�߁��7�^�Bo�D?kQD���}Of�GT�?rJ���w�>k�|~P��ф�m�l������r�ng�1�8�0�r�9S��!h�d��L.aɨ���{�?<�-�����9�9U�����0 ����37(�fF}C"RZ%;�Q����#���'�83�N=��ՠv�nj|g��V
pd�!I���/�I
���|�6sX��n��2���������܎�X���A��s��踝�	Iͤ�ﻄ7)gi��nHg��f�?}��1֌1�U�I����]i�=�V3v�?
�3_
�
��>9.��甘���q9�$l��Ey��ěv��5yi^�p�b���f�*��43�����~�$�=A��f��T��
>S����t%��u�c
[�0}�&I�>?_��D�w�?(]4aI+�L>���9��|��s8IQ8��0�Z�n���s^���q���S�ݎ����|�,(�U�/4s�x�`p��5|/V�x
��!�z�%)M�KY�D��$&��%!F�M)��ԦF�3a;�El2)�i��X-(��-0A�r�����$=�OA:M�@�p��E����\KO���� �R�ݐ]p�t;��"�A��@o��!��� ��nn/,��ʼ�'�A>��W@#ٱ �hp�qm�����@&����郥>��6�9�ԚE=��ʦa~�z�+rmBP\:��l����c�!kt>�vw֢
�'T��]�#�O������q�Gv	���VŹJ�:�@�:�����U�jg�\%�������L�ΐv���%�s�<X�(&�c�l�c2
�ʂ�D�XL���\�NI� �,%9�N�����hMY�jT����}04u�(>J�#���a��aE�� �E��	�
��bRE��ȉ����<�jEB>FCm5����D�w�����Y��dbB��T����y�8h-�N�@�Qr�ܩ� �W���8'Cd�\D�:�rN"@+���)b�'�1ަ�D��EiT a�˿&[�^������×)�}eDi2s�����k�peV3���'_<��<�¡J���t��~�sZ����dTW���Vvf�2�Y�G���\ǃ�`�4�f�КƲ�+���D^�k�ś�@Α�T�Z��x3){�t���;��.��Ie±i<׿n�����H7^ѰQ<�֮�-f�Q��Nk���|�VM��F��4�}����_m.t�'��αh����ۻ8�e�>u�8�SnΒ4`oZn�Cg������?��A�J��-;�w��G�>l^F�d�Ɩ㤟`�`�����O&�(7_��c�����M4��b:*�!�.�_4���ɪ����?�W��c&���,���4��_J������`��0ʌ�z�2�	�=ѵ�7��j����s������]�~�	x
K���=r�z�p�pp�|J1I��I���>�)w�M���p��Los����D]�yPT��
�H����1O3}�^�+�wӭ�!B��	�.�V$��Ar�\�QS�sv�!LR=�F�M@����#�Δ�`p�H�>��]s=�1��I�ϝ��j��b�^(��L��8<0�_���q8������_�! �Ѿ�3#�Pz�%�m�6
>x+zẚ;2C��Q!>+XiN�)�na��r5��ïc��~�̉��s6�Ř���"F�<���U"���yf�b#5V���vI:�'Me�t�<	O��V\�1>�tLe%B[�1����V���Y�=5<	��oF�n��ۍ� �f&`���ZF�hxMg��}k��Ѝe"�N1��'�t$`���C�7P�����_��ۍ����jT+>�F��7��M�E�_�0n7r�'��Is�����0<"�Œ�d�K5���0F�$L��A�3��k��nP׷(m���ǂ�#HD�c���#�F|Ҽ���3��jG�6Z�6Zcs��գљ�GUS�Q=�|թ��G���.N<�U7�un�&�˜F�ty���8xPe\c �T�?�7�f�wl�7�̜R,��ѹ��!�\���Tt�\�� ۞SnD�/$
���/f�;O@a�||�|����Z��;���W3)N�D�(��L��u}�vu�/���⼌F]34V����8�x���a[`]��cN��c�ʼnx��΀X��]����r����� ]q"{$����D��B��!P�1&lhs�N�N|�I��Qu�������l��6��M}�_��.`D�<V!h$;���-���s�O�J���e����F�=�б�E���E\���yW��be��<��1�^���6�F�ٚ���\s�
X6�8e�ù%yQ��Ŭ��O�`x'���̶�	��\���N���,[���y�oi���т����<kd�|q�Z'UGnE#	���O^*�/w�~��#[�7�_���^�3L+4�؂b��c�˴��.��F����8�f	$\m-i��������*o:��ˤ�
������R����F�b@�|4�G@����hw!��<Xb
���%�wt?Y�G2�	Mx��I����e}�~�&e��v����-Z:�Œ�-{�TSN*��u(�:�&Zv5�\g��h�s2�|��[9p.|I���԰?�h���J�ɀ͹����ïS��
Xx��`����׾�Nd|�eJ���0��VE"W��ɖ�;C�1e�
˺�޳+j炛�u�(L1�c@�Tk���/U����:�UȝA�����˭�#�C���"��s�J˿�LSGʕC�l��:j�P08�v��_0`%�_IR��+�Rx\o(���VϏ�V`ťCv��D3V �
xҘ�gP�gHx���H�W�I��" ݴ���Kk��J�+�Bԥ�c{��^y�?�^D�e�%���?��U���Sh?bo�k�ۨ��|GG@��K	QT��m3`��̲��#���B����op�ۆ�=
�+1o��~�~'�!�)	��gh�����
p�i����b�9@�U����a�hw��i[��Lf>�WB�W;� �	��ze�Y�u��4@e<��ż��w���:�Հj��0^��/����r�r�s����͓ԞQ��l����ܖlju>9��y��9R��J�9��Wsc�b͵��3Kû��YrX;�ˢ�M��-��n.��,�9�Y��˵��-WPc�s����)P�fcm��܅��C���*陛6�J� U�
�0+C�)���NW��<X�p��|2N?핬�ٻ!*9��ﱨ�'��#��oǶ���K�7�=O�(������5�Q��sA�;c��5r��sC{.��Y!b��xc/Zk�*�ٿ���]����%�?M��.%���ΐ^���;�mЅ�W__��;��Lc���1F�d	_�����+f��$O�L�����o�ì�t�u���n``,�j�눖SQ�e�З���qn�r�p2���p�����!���Յ٘��.���1��Z���}x�9�����X л(/�y���:�(y�y<�9�(�����gq*��𓆫��D��b�da�V���P�H{����Oď��s>dd!�)Gݞ�qFql8��a.�ׄT�����{�����(7r��S�3�A��y�)��!㫏1��0���	�׆�*�Z�fV^���eF^Z���U;����{��\BX�i3~��35�	�n˜M��I"�ԑ�	+_.�1a��5�d��p1�����@OÐ��_�}�g�&��%:���;����O����Z�ߕ��A�Q���@��f�g�%̇c�w��Y��"��l�Rހy-��l<����V0��-`$65ǭ*3_E�uIT��%,�$���
1�G�x'�c$rRY�P����_G8J�o���e��̏�.�z��-��+�
�@&�N�^影�֮6_�[wY�@��^;��!;���%�-�k�94_��	��iU5�AL�N������|��o�z6^(5�P�eg����J��P<w�#�2'�"��k\�����-.D�ڈ�i|w7���j6G*p5��[/t��-	RJ�r3�FJ2�&{X��ꙥ�&n�'9+�����W�C�e{�d�ǐS�'oG�{���O*�Ay�b�W�hJ؜l��%�g�����M�{�2�4�H�2���_��-���ɻ���*��'&�h��
�s��]h*�Y"���Q��e�"���^��L�����B�a���&�\��,T,X�El��e'�&$��#>I���X�D�?C$)m�_��>�qWQ�b�/n��Η-߷�S�	��ѕ�G�7��eKZ����t�P8(E)�Ѣ�G�avh����<�޲����nK���d�aj�%�8�y3�o&�Ր�5"����je�8F\�
0u*	X�9���1縯\�`6���j
�)�iz�"��J�
�ܢ�k�v��r�ӘF����6X����k�X���'�i��LfʼYs�J��N��__i}�7P�}K���;y��C���P�;�.1üZp�q���R��W��`�GX`���WQ����Ø/엣nh���d�&�c�ɱ	���C��z|���)SM�a��CcS�ӊk��T�1�����k*�.h3!�ˋ�#��1�'�F�I�V�Z�3��I��(b��)�/�κ},	��Y�_����S�欍*��z����O��jk�D�S*�e��N}�#e��>��w#Ne�g�F�!�"掱
�!
����#�����P�MI�D�o��5�qV�K��H?��5���k�T�>�0G6[wR�=�Ū�Q��M;7�ڄ��t;b�9�j��%�i���L|���
���te�����.�G�W�R%�!�&S�c�f�a_�?�O�-����J��Q�ǻJX`e����m�~�lx7܂N�ua�{C�6���'�B�}D���uԶ��$PJ�vo��c��6�`�H���27��Y����U׬�DZA� ;!b�0?ꅆ�`�0���﷡�iY�T��oK�^a."LX�
��ޠӞ(���I�V�啑��L�@��4�I+F��	�n�e%iF}�D�� ��3�U����3���"�	���d"�K��^�9u�;ִ
��ziq��֩Q�9��ј��˥��z�'S�xY��LIx��O
���*��}�Mw��n����I������1s�݆u5k)�ў�t�%Ԫ�T�G�M�G/�Y�Vx=﹐$A���6&��f���
K��I3���
;���	'�$���D���2�L����� 2�RE�p~=�ġ���sO��g�G�"�F�[D��5[o�%��/O!~���Ԫ�4�!؍�e/Ow
�SS4,�1�_�=@A�t9��6�@�%����]Sq�D��_k�McލC��E^:q���B��ºF�	d�ou�+�<j��؎�t��?Kң�W�&�����`М���e1!�3)q���A;��/8��BV�R*Oǭ�zd�V~��7qӅ�]��~Ɲ��nqgZ �ta8���%,p2*��R\} �x������"҃��\�P��5�˓�ˡ�)X�o��Gd�:�t���g��Z\�E����!�3���[|9�,�"�`��3 C��CTn���e��M�Ï,��2_Jo!�ȥ�ށ����'/7���@z�h�#aJGj��+��g������x0�B���*��m�L~�
����&aлҤd�w�RSh�M�&���TXBɁB��
�^d�7b8�X,�K
���`A�*�,����;7U�!�1'o6�Mi'&L�eL��R��� qC*TFHhҷ_z���5A�R�HW�S2�I9��[��ms�“��z�
U��:%Y1�>G�*��RS�w�9������،ۅ}���4�ޯ�����&���T
ځ�O(�"�;��e��N�α=�4����͵O��0�F��	7@V��J-�S�Zޢ��3��C�:h2Q�}�q�G~w�[B���U�(\Yڢ(	\ϑ5�{�y���-\F2�'ʛ�x�r�DDF=;� �J�J#���!�����m�~��P9�N�
�jK�Lz8b�;�{�Y�7��v��0�>�1��k�a昄6�а�3��e}�n^牭7��j}��6��1�7�RX�ȃ1���#d!�ᑮ�	��8�3��Uꘒ~X��P�+��r��q�v�(�~�Co_��Tq�G=��=�P�3�!rTsKR�3'�Z��$�[:�^�5r�࡙�&)���#�:�^�cҪz�v֏��/�<��z�p'�㋚MD�XQV���OD�0a��%3�=;�U5� �8����\�4�%U�.�s��-�AC	��X5Y�X��n&�g����G~,�T�)}8���k�a5��2H��[���L��݁"<l�_��8—Tr�C�A�I���%���]ʚ ��K�W�n�ۥtߒX�p���W�?|np��*_�2���'��a���hH<�m#ߟO�
�ax�Tro�9H�ɧ܂H�)+zT�v�8uʧ�a���1�
����.n�!_]3�y�`��	�;5�-���b_N��
at�t!ۚ{ފE�d�aKOi�
�g�A^�pZ��:8$��o�L�24v�Hdj�ߤ�7)�����:���^����/��
փː�	V�>|Iuk<�����n^�9�{NX���h3��\!�	8F��<�s��:�s&D��;C� �Or�P
B�=:xc �=xCF`?	xc"�>�s�K�FK=2�S��|�O�_|�S�/��ٶ��m۶m۶m۶w��m۶ݽ�wrOr�Lf�K��*Yɪ�cp��u���18����o�D���,[OKey!�w&z0/�W?��{���Q�t��ك%���}PJ�M�B�~�b奆�gbB@�z�bs����CgJb��CE�&�8�����ȣy��bQTF���b�Y,]��1�XY$�"�����c�(�"��f��G^2�S֣TD�D}f�u����y�7�L��|:8Ux�t�1"9��h1&��wmZ�\;�ơs2u��m,*u�b鳱�ԏp,�<'�٠�iY>��8_�X'�h]2���,s��Xݎ�U�:�g���„$���|����Z�<�.F��=D���R��Ƽ�v͊4XMS���7ڴ�~u�?]
�#Z`
Nj����B:Cp��[_�Di���<��b��f(z%d�H0�7�A���c�\u�!��^z6r-�=L��SN�1:
�v|�$��Evm��9��ط23[��O�>[m䊎���W��k�s>G�i��L����x�"D�;H"�@"y^ �C�y�o���?A�摽�:�!���c�I�x�1(�Ca(*� �QbMjH�~��x��W�9��V����v*��rj6m5e7&q&�ĀПR�Č���&���a�������(<)|A��k�?�{�;�7��-�9%h���Ϸ^���RQ��Ӝ�B!�|A_~���:,��L@�%Rk7�em�[{����t���4��z�Cw߇v1����P1nP��,�\32N@x!�����Q��#ڵ<%_��<]W����H�2ŝ���5Pp�#ڜ���U��&���ŜB����-k4��P��2����j#�#����%��>���w���G�q`4�I8`�@$�*Q(�+�˔K/�m�~�
�5(�kD1h?�o����8�=��R����|ˉ ��.)���N32z:�$~�˳{ْ@g`�9f%Ś�S��R���蛕��C��Í�269�3A��<h�P���
����Y��s�3;�%'Q0�*
9Ģr�b:ǩ�2b(�?���1J#�Z2*;t�������
�/��:�y)�l �m6p�h��B�л�\��/-�	��if�?�Ta[��&R`��;���)K̤l�c0�O`�[+��Y����r/}��X��߫�bp���%v��nw�Y�jO����3�<Q�U��9�[y"��д���Ĕ����U�|0�X#�/��-�J`�ht
�"��a���i�P� �^BI����Bi�N��F�N��AÊt9��6�Ih���#��D�eu����XBoI�N��C�4�}�,̊w��
wex�����$�y�{�K��8��[x٧����i���z���J��0.aP~d���=�b�8e0y	��]��\��dF�a�fg􉅪�E�Ҕ�4�I�j��*�<`�풏$��|nX@�؆�	[��@�_��;�'�X�W�1��#nZ���f�Hb'�����s�jه�WMJ�P{�ϙ�K�M�:��ldj�5���&)�
[V���SkT3���I�>�=d�m�����5s5dI�{;���衊�G�/#�m{Ŗ���,��i��.��P���������X �
��"֫�BiUp�>�˒U�����?��ڔ+&�S�P5�n�3�us�K!�"˦����{hH���:��%\X�1�d�W��	��3lyPȴ�EP�h|�a��Z�h�x�e��U�X�M=�	�U����(�D��|%�7#����X����$_n|ÿ��5��I�Ĩc�O�46���l4=$�e11�I���'cʞOq���ΌHsbɫ?�ͅ�6��#?&s֣��6	�#&?�sl�M�@υ~��䔑�8��Nlq`���'�^�� �b��	k/��ϋ� ��S4��™ȟS��#\�X�S��,K2��XD=���9m<-��ԫ.�F���|��q�_�2�8Mҵ(�co%*�H� �d�h7�-�b���Tn��R ݭ����{#ڡ<�!�"�(�ġw^$�H̖�33���}�ގ*<EJ���S� �-���>tiK�5�+ɛPRp����#�պ@S"�=0�?���9=���CD�#c4��+pw<K)֕�|��	����m�!��
 ����/n�$��(���k\0w��\��M#�Ewq3Rf��1ī�#�O�k�cti�Oqg
��o�M�
Dm��g�C����()���>�ţf������B�Z���#�о�YD[
A�Ο���62����a���wh������ץm�
�5��5�+����оG��Ā��\��0�G>N�>D�c�}���c�ʤ1��o0�	��l]����7�2���7��������b�P�����^a�M�jd�fCD'��x*�Y҂E����]j0�5���e��z�aݜ�^b|�r����QCz�KB��N����OŎ����8���;"�pѺJq�6>���ţ�l�5)F�8w��g\��g`"��!.�X�ŸX��3�
NLE��/5�${��b���$��Uw���p�(
�=�q��K� �0�v�&�&S���hb�q(�ç~�}������,{M��˷��� �3�'Sk���M�Q����Ir����S�������q�&��=��A���c,0�b[X� θ�`�P�4���>�O�~�@"Z�t��?���jgw�.a?�_�rM)����w5�:E�cbS:�!`���a��*A�1�6W�(�,�U��p�����������U�5��k�G�gm�[2��"�?P.c�U���o��n,�^^��kP�kDܤ�<�,�j��!�hh1�2�4=�ulR5�ŘG[	^�h�$3Tx�,z��Tȡ5���l��A�.����:ͱ�:Ѝ�ҺCaeA
��P�m �:IY)Sy��>^v���W��R8����ɃI^=���9��n@�R�VY�H�
�^�D�
t�:�A'�R���
W��~̠�灼���۱�ף��i%v���ޫ�@��A��@��^�ʿ�ݤf�D�]�U��%3R#m�r��!2�ҊI��d����%8�A/���q���R}�٥�S����b��K]�n/���?����C�� ��H̕�C��(�\�2��{��U�_�nc���C4�����&v>�Yq#�,�ns�����i��Yֳ�|+�q�Eќ���9�hy�'�M��)�]�k�LC�u��"|d��\���˿*�����W��)ef��$�:wl�YI�;}��N$K��;)�e�ibKHe�L��2!:�������L�	4
��.B��w˲��2����	�
_#rf\=W��]��{�3����9��X� gt�W��rL
W�"�c��%��۽`FsR��x�AOU��ǔN��lf�|]�g9Ό��bag>:FxQ3��<�;�82�S����p��<�G(f�y
�c�����%`���[
Q��E�wk�frv��u!:��-����&��F����`���<��&=�.H�*{^��q��:\\�l"K�*sz���ZxL���Hg��j4�݂Ƒ*��;yt��d�q�C4CZd�]�����F�}"Ʋև#��1����y�δӇ���)��>uS��E����y�z%ԡ��3�dS���/��<gHy�3M�s��.
8�	���cI�'�۾�z���T�`��@���,z�p�����9���u*�IV�J�M<  0  �������o��_���t�,9,hP()�kb�`�8tr)-0-�Dh,)��R����r�rk���v\w5u[[kk��N������Zg�s�.�k�g�U��i��-��v#��羟� (�ٮ�eV䊯eP��ͻH%E
��� �'S.��e��N�t��g9wtX=�-�eG��;I� ���{*&	-1#��e|�Zy^�N�x�~�o��]1�sB�bɞ��R$\{�YT�2���\�d�NY6��<��s��*Aʇϵ����%�щ0�߬LAC�{N��<�`�Hf�H�h�GS2G�K7߀��K�����Z职AOd
Fkm��[�[Ȝ�b�5���\��r���@�aG� � .Œ�h�E*���:�� n�8��o[�c�Q���1u��<�K�5W�%�=C�=_jB�g�8r	��lB��U�'�0����+��\L!�}[T��܂�����}Pd!��%��x��[�����e���a��Gj��W#݀�‡�o��
Z��X�!��c�pr�Fx*A�D �@��
[�も��h1���lQ���m��������?�`-����g�t/��'��p���F��B���> )k�K���>sh��¯q���9�-�;,�ԴVS��(�J�ng��)j��}[�L�OOM|��)mBh�I���Ja	�$։���|KS����SW��ɦ6Vn	>X��V!Oey�쨤BKf]���Z�7O�­aKIG�����_�v�7�he�:�kj�p�;�ɡ�tMJ�c했���8�U8_#�C�?ӔšV!��	�.����:���ۉ`��H�&2��H0':L,y�m�VH�"ss%J����
�Nڄ�&���С��ټAKC	�+hW[Q�G{��WE�O�{�������^g�:�˨����Ր�)%ֹ.��O��Nm�����K[����"ZUN�>�nb�q�/=5U���;��c���RLE�1z¥|T�)��!�7oރ�>%}rU�쉅����o��1�X���L�����RxW�����,��/�Ϥ�w�&��U���D�u}u�V}���07)��I�9W�f��f���N�
>IӮ�b�r�` ���]�V����l��Y<9i����;������E1VhJ�Q�?�Ov DI]��
�`��z
�rm���	���C�nmi�`7��L����_��1_ڷ��{��Dݑf�ѓ�Hd_G�usJ�B��C�fIaP�D[[-��,��ċF�
O�X��4��L�\�ƈs�d��ݰ�Rths�H�9���kp�;�K>.�5,E �a�Lx+��4���q1�P/�ˬ�f�������?�l,���T7��ttW�Рā�h���^�K��n�LN4�"���-��.l�zD�ȇ?�S�>dx�	�F�Kge�ۆE����!�g��W�^]�6���'����tGs�{{{����!�a�aT���a|���M�0Z������C�L����D&�b�`�v�4�W�e��)&�b�o�_�G��Mз�y\>�����bQ��\���%YZ4�)�eٱ:�V��^P֥Dl�_ h��mr{I�
���jdd��BO�(ʧ���:Q�$���c�ɷ^/k�p����CS7{n=r��� �A�6����/Ж!�Ry*�׃T�v�Kc%gZ�cFb���N�|b��Λ�Y�ӆ�1���ҳ6�zv��9�j�a����3Ҽj�G��h�ц9�hq�����_��=�G��ob/����9�W�`C���$���A���Z?�	�V�(�:'����T�9j�wf�˾;�:y��,�?[���c��	�L$e`x“�C�WV��a�/�:�q�τ�r�B�$�t������ɖp�ѽZ�GR��y�+�����>�'���##�Q_o�
Q��^���qJ�	���6i��16��OտX�X���R$\>X�O�>�86**�e�݌D)��$X��#�G�H[eP͟C�D��Ţ�C�vx6���BE�G�6@h���#�Ԏ�z��}d���8H��qn|��@��)�z�*̬6������'�%<p/�?Z��ZpIp�ItF���.tsq+�e�o�E
��G2p�v�^�)�B���b�}$�d �k%�B�=�����}��6��v��fK~%dNq�D�*�O�Bmt7g�b���W��^)h�R��d�<&�{�
^µdgF˔����B�j��C!�X���޴FJ"/����~���4�
B��df�M�L3�i���q\J�-<i,��Y�nڻ��ؙ*�o�Y**[�ά$�:�EZֱ�ƕ&��GM�~�~J�^|��%s�����)��;��RG�/^�]�e	&�Q1��x�q�<*�6��̫`�<�B���.]�`�|	���]C�S�-N�|��o�~��V�z�We0��v��D'��1Yt��C��R�t�g�LFG����$Ut+��	
�F���\#���_V`����X�M���'�>8���k���egm�د��hs�I��
.3����KF�d�ѮTl.$���N�f�����x��L%ve0��4�n���v��֥�z���;��[�(<e�0�>.��m�ݝ
,���B�h�{����mDbJ�Y���<:t}�8���o1H	L��lq�X�Ε����f�SׯjM�!�U<
kd�:�
�T��c���V:w7\ϕ6!fI��H��~5�+�y���?}V��p�c3D�;J�_Iz��I�b�F���|�g����v�=��m	g�$�E�q1q#$6ѧ����Tx�v�,�t/�#�Shi�\�p�ښ�a���Y'2��w<��[�#����"��.*{!0�����;�\��2�X���<ڵ��yK���j�l��h���m�b��öH�Ӑ5قV��p�DwNGt'S\_g4�xme��PN?ղj�� �.���
������ד�I��J�����3F��Lءbxy#Mx��i�8z#�Kf�>K��;��5���]�]��#c|���-�~�E~S�bq��'\�I���S�w~�5%|c$���e�љ����a��C-C��Ҟ�Ky���f�RS_5��L��4G�u��o%p�%���ň�U(��6(&���#��ERy�~_�>��OA����ۿ?�������"��2�f�x/����J̰X"GaJ�<I
��������<:�F;ќ��h(��h�G�� Dܢ��*�eh*e���;&�D����w|w��{����A�C��N��N��N���8ߋ�G�Bo5l��_n������*�f�H)��
_�-�7lM3��@�(���ӑ���+�k�����H>Ftٗ'l�����mٛ��@Ug�*�C�1S�z�U�
3-�b�L&�O�ڵ�B��l�7�	��` c3d��Qz�9J�ЍH���N��|i�0���?����_	���߭C����~��(���������	�_������rE�*ke�@��_��e��`*%��	G�B�\��LӪ����F���A�,x��I�8O��1�ݘg���ђ�(Q�R�Ž�`p¼'�P��Yު,4s�9��B����	�:�m�h�h���v�2�k�Yzjc[���J�i~�����.]�g�,o���*+�1�{���J�������B06}*���Q�j�� �ҭ�p�ƵR�O7�m}�Q��Y�o܅/��S_�#��S"ݚ֞�6ke����0�;�Kqع��`t��Q泡E6<�QoC���8߻ͤ�;|Â��a����
^��`e9P[;F\{��z�}3�Ŋ�ޗ�N�N,���h3h�Q�z��vME3�+�n5N�m�B+��r������A�;��Y�|��4��`��"?��w��g��^�,��#���գ,לV�z���s/�௭܆?b�l�N�q��]��BDZ�����jĒX1bͧ�Z�ʷ�x����*.�SUF+o���F��xF`�gM�a�
�l4��4p�@Q��r�+8�bZ����ތ�/J�<���Zq|����/(���cra�e��fO{���H,��� �&�Z�B#��zz�����m'�-]`�GH�*��a�v�;���i�U��H�R!X���#��n�K�<��xW9f�	�+uɼ��~��>�&&.����y��33d�m��/�
�����ǝ_�=Z�rඛ_|�_[��������#���5z#^>�:��Ζ|0�4tq,��|�L�`�1G��
���O�E���g^����1b���wH�ӌ��5�RBc��`�5]��o��y\�g�\h�Ġ�#��ON�oL��ޛ�5ٶI�wJSc��
�)�ݷ �FTBT����ZQҏ�0��Pn��{���*�"*�$]�
�b�*$,2����(.�8��9�<ϣ���h��ٚ��O�4�~�؜�6p}�ϖ�o�i�/j���{��!����:?e�B��]ijzh��oƨҞqϢ��8b)L�$8N��g�jbDw��ǿ�^��M?<����.bj���p�Z�3G]��؞gH�#��^Vr���ғ_�����1�����g��.�|��GPL��9t��o%%�yx����Ap4���^xz3�g�$�7���!�KպS�p5�7�L�v4�L�f�/��4mEeY���T�ٮ�91[���	\�}���X�T�jhmz]m~�MVS�0���1b;b�	N
�Q�֋I�a3m.k��BvXD��\�0�����6�;�����":�vu�� �V���
��$v�Z;X7˙I�Y�j��T��pՐ�T)-^�ęH]�ܧ��qǙ�ra�xx��i�f��7�ַf��&���H�m��Z�a�s��GIK��C���lۓ�Tu�ѪrUyS��G��m�+�Ŷ�<��S��h��<Y!�QC��rRR6"���H��w��X�+,��F"�R�ҁcBm��7�H��I��U���s5�<�V�]s��o��7�27������z�6��m�"�����\�T�[��Nd�5�m-P��|�E
<�7fNmh�Ҷ]%g�l�Te�ư�?|����wQC���V�D�z�__��
8e��m*Qh��:�dw��vU;�t󡞼pG��O=�6I�=�n`s�"����2_;#��Zy��M�b��jB�j0�RM�_+�1��*6�j�=��r�D6𻔰�%��e�ϰ��y9F��(B�}S�_
�}�aڲWU�*o
�E|��/֜Q�{�1�\�z����v�b����e�ۛ/�e�Q���e���Wnw+�W#�#�|������͂��W̞�t����o�/�;kBg�/�˿!��	�*}��eW-�oʽ��Wnl�-Rs�./J-
�r�Ϻ=r�ts%��͝~�
'C��R�Z��k�G\=��\|�6��n]5f��y�K�s}C
�')�8����:���e��!��$�+��>�	�������;D��h������DZ���,���ֲ���e���$�h�,�Ή��C6?�e��
��_Ťm�2�=��y�:�,c伱�m�zsc
�ZM��?-�rg�Ͷ�.�*���4,G$w�l%m[F(�j*��uUd]e|Ƀ^`�!b�#��̖\G˶&IV�MKwrp�0�B�s����Z���K�N��E�p�x��(rE'D�
&ۨ�zs�@V�2�خ�o�t��0�F�[�,�iH�f���N0z%����Ŕ�rk��N[	�?�~1X��R��{��䛻7����x���f'��63n5R���X�?p��B��#o�}�Mߌ�ή��j�H�)G��d쨉^&T����.d��I�QT�$Pt�4����R�A?J�s�b�A\�'��r=@��;�� ��tv�AXV �E�I�>��`0�o!a���}�����)�yw�v����/��B8�b"ߝsq><���qM����T2�`+7�7t���2��D�������b�H��3��c+���؟(,t��h
����vHҟ��od��ͤ�ء`o��Gh6��Z���f{^�ă��F��E�����%7d��0�RE��r��i������ϱɪ���#��(3��������ƨ�����Y����� �K�l��ӕ�5;z�ΐ�K�b��u���RC��U�-�__�GZ�V���hZ�r>��v�n����a`�Ԡ�!Q�_.7�z���Tu?"��K��Ф�z_a5Nzud�9������`墂�
o�CgR�i����G����9�w��J��S
��m.W�����B���X�3�YFaqv�e�r�^6p�R$�	�$�J�H���̜��t��%�R�L��9q�}ˣ�0&̓Io�k�q�X��n��4TR)mz���3�2d4��J��@��0IY9����Ѣ��g%���+Jz�CK-S9��H#%���^u��h�dØn���6*͊Ua��'�ώma���^�Md��8�^��c·����e��F�>�ӌC6:,]���V�l��>��k4���[5�T�S���ʬ�����u�`��lI�9� t�q.�,߰.$�<�9�	p��lg���J2Sp�-yEĉ]炨ɏy�Ƭax���:kiӢ���b–�)��^4���D�8G��0G;�Pcc�f:��F�U�2�˝�N�5�;�P��j'; 0�8h�9�)O�\�kg��f�3����Ef�c�����M�/{������MM��\�u�G��g��*j�OG	9`�*a�u�̯6���j�<4�H�[�i^u�������g��)�#��;����F{)�Ë�;Ub!�8��FE*��GLmo��JQ��Nʑ��
"����N��%%�9�eɲ�8��R�l߯��~��IcmN�GS�+z��m�E
Q.Xñ�j�c�9
Ɍm��DˑZf.b��t�n��y�U�'�9˧ɋ��g�;�@���G�#}:���l��Jz!Ku�Vk���X�����Fe,�gsy@<0,v8	U�h����l�
5^;�,'�E�u��d	!�\���;R��>��p��b6x^�%,���ggn�O��R�&��!�R±��෍�+�_��Ac{$���w<�nʅ�?�8&��oruu�2vs�o�1O�GQ�����]oÔ�&:2�%���(rɟ�@i��b��zpuM=�m�����/�dv�ҕ�(d��6)ƥx?Ys�%�͉����,�M�-����%������J:��/��;�Y�ُ�����"��aw�H
�4��b�b�b���|�ʘ��>��M0�s�b�8��=��8��DQh�܌x���j�?uz�cj�^���>�0�f��O�Ν�?�~��04�g�����M�aLj�8j
`m�_"¦�!�j �Cy��5$�+�M{HX�ne����i �M�@�B��%�mގc7��Ē�@d�o�{�~�5\��gD�FH��P`=b�^C�|D��p�l	/�ź���V
��"I����;��b%�œm�ik��/I�rl�C��*��l�>Σ�\̩�y�Y�
\ �0��E�?�窕�8�/(����mU���M�9�Q�$l�HhE��+;X���R�j+|��'�i�Bh@��d��t�dO��|O X�:`8\�7��)FғLƆ��F���:�jQ2���YJ4��Ȓd���h�*;)�+/�x@'#�v��P$iw��L�Ƥ-0S�Ó_�as�r�פz���q�!`�`�K���B�
%F��ӵ��z([�Ġەh��	"I��4���'5
T\)G�cI�!#R,�W�BU�J{���׸XQ����c��4��5��a�T�U�4�+����c�v��4}���<m���[�&�17��
��
��\�;C��)5X���0yWE�3��!���WgX��!7�w�>�=��0ؽ�vp�n	�#<�ڽ�{B:�F$3'<�G�5�諿b�*'V�m��ۄ��/	��<�6���&쨭�?`�[+���eŦ��������4���*��v)����f��]i�*�|�;R�E=BA'Z���QI��[���9���lO��H�h���.7V}�Y�NJѡV{v�eu��茅.=�2g�i{�/ze}l��H��f�ڗ~@�\�z���P`��
��9��W�� �& 悲�b��Co�v�
����I�����1��Q��!��D ��e�¢	�]H������A�� M��pHM�A��Mj
t	�l�2�q�̦5�9���Ҽf���&�O �q�Xq�)(��/������%�c��IVE���l��6�t�&�n� X@'����x�VyU��c}�X�;��m����[$C�,���ut�N����2*��.�.�!i��r��8�e�W0/X��3�}zC��2�EMc�xQ�x��?s�r�I��S�4��Hgm}ZC�R6�7M��yI[�ݯ��$\g
��|:qg�K͸U�'�n+�e&UL����Wg���Co�y)p�r�7%�')�+蟤m�<�(�R`?�Fك���՚'�(3�聍)�p�
#��i0eto��%���13��k��?�0�@��Ϥ�JC�?�I�
f�P�+�%��Z�5��K�;��-�D�ܒV��ԅ#�T������a�9�����P���Y�0�9�=�Պ��$���b��]�M!?ݓ�QfÍVQ�<�����}B��}]lxp-5�	B�ə���D���&��'5��0=�hȕ�z�P�@���/n�ՐN�0c�A!;���s�ɴ�h<!��⋈�W��k�?ڽ�X����PO�G��/n�#%sO���m7��iMi����\�y�����1�0=3���՘�R;{�
6�M&OYU�I#}�������l�r�qrU.h�^p��l ���#z��u ����0��ü����+��['8
��p�OP�HLB��()�Q;�$��,�*'[N3��/AR��Hjk
�"3b_��J���bD�xy����R�u�������մ���Ek!ň'IJ���i��@W���0ړg�a<)�6�����4P��6���m���$�{)�KR	���J�
�o��Mq&^��@��S˚�/���¹Bu�1 N�81�(��Ψ�F��6G\���L�=���?dp�����[�Ijf�b\c�*cd�N
z��[�e;v���l%ڸ�8>.%]�r�ҸGGJ��9�ȶܢ�/CȮb��D�^1�<u�K&��=r����<{�Z����BJ|I��O�'�,P�̋��;�f�G��eX�$|?ֲK���H푫
Q�s��Ӆ�4��ūg�3��I4�
<l$?�3寸ů:ů<ů_V�e=��i�Yr7��?�g��Ms#�w#��K�&�Z�)���)Z&�*i��~O'i�ή]�wP�
,�.��-�*���;zB�!�c
�]S���C�j{\��)�����A������4�ڸ)�Ԥ�h]��rj(AkV��5(���է���S��]�#������H���-F�s��Fv��GL.p��Ѡ=���(��p,�.y�޾,�S��wݮ�蓴j�j�`��D��w޲-보�ufL���>\�00����E����[������G���[�@6J�$`؁n�x_/�0Vڍh�"���uڍ�h����0����#��o/�IY�o"������:���
(��^�}ʽ|��w�?2Hi���}2�?�ڀd��ꠀ��P�?	�GgJٛ�y�7�C}�u
���ƣ�	n���z���G1���� 8.E�:����~����UNi��3���tG(�[Ō�V�:cP��e˅�צ������3��ko2S��"�������7?��磯�b̵`O�mۈ�)8��ip+���a�;y�$�t�N��o�v�����tA�@!V"���oޱ��3!�C�5��ѩ���﵏\!����v��ww�=�n`_�B"#���2Y��3Z�$�u��9t::9��[�D(s���"�(6�lveo���k#;uL��㙍�ܴ4��ʜ�X�x��u��9,�a�u=�:eA�Ɋ	��Ȥ�1�
��j9��R+҂E�l��n�JM����Z�xbE����o
N��jS�'rl=W�I[��?�5:�HvulE�ѣ�(O��P�٩����n�-����%����+B�b�-�T�0�F�xV��o+�O�ί���C�j���$��)*�C�N$-�|�SgTL�e�"<�G�n����c���O%Y�%����Op`q9��k��#�bN_X������笍Y�1��͔Z���ؚ�Y�r|;��h�Ƌ�2�������Y�Y�SUZX��gL���l�둵�Q���z=�6�m/����G����P�	���7�-P�V`6&h[�=V���H����DF�!@�Zd<Ħ��M!%��p�H���#�\���L)��[�Cʰ�p/�2�lJ�31 C��^�=u�B.씂���5��D����N��D��-�U~`�s���\O��9��>�����S�;5HVq��������G.8�a�8�a����6��.���
��:&=�S��]TxV��SL�R�ʦQ�D+�v_Ϧ��OdYLs"Iܒ�=9��i@���bS^��p�a�f���o�A�o�1�)Ei���ռ�eV�p�u��(�S�`�:�A	�u��D��ݞ��?E�Rл-������.ޕ��:r'<ҍa5��w�85��O�������.�`��#Z;�(�|Ox�a�7�϶��1��XC�^�Kߠ���"�x���""�#9���"�7g+���t!2e�?��b�����jr���'_�y���ٟ/W{�2׎�c�3���T4�����A�3��,�5/�)��#a���j�Q�J�/$xl�z��&�@Kͫ��;����Ǡ֯Qx��z龥U,��fG����q�["JLx��q�CW�
^tӾx���v�Brkna���x�C�[���̡�CXz�(Q9�	תWTIw"��	\��������-�"��o���“k��ҹ_�?�+�$�5�S�T����y�.�f���u�U��+}����ς8Τ�dP�Ց�����2^��������1��h�m�Rk���k��k�"B>j}72N#Rf0Q�Ӿ�CKX���;I���W��G\�G�#O^�?�{�*�����!Q�=�l�z��6e�v�
&��Ш|�k�3n��ݎ��N[��'tFNDz94}��-׬�ΰw��Nu" �!@�3�;����vl�CelSНT�֡�E�XB��f�Q?TA���� c�Lm�&5ǡ�z	��+��p��U=�7L�}n��!8�ťH��s<R�eS�p�n���nƠ�1-���П��	�<�ڻ���?��8��f��ū��ܘ��BM���:�.�8����w�t<�<��#�"�,�B��C���f�?���ZMȍUǾ߳��'0�RTL�k�'$��mkٹ�č�:�Y6��z��8�n,I�Z8��j>q#�����:8�
���+�����k^s�~������0��"+3�g�~���Q��E��%h�f��m]�jT�bJ�r�t`(6r�^�!�?��P�J#�|4	F�Q'U�LO�̑���dN �T�(ٜƭ!
��i��Jݷ��z��
*��L�~α�#�
�'
jR>y�K4l#pm�Z��.����D�۔��Q,�]|��W�k��NG�۸�+�dPǦő�+5���*��5.�:Ͼ�m����Jbί��鍷@��x[���Ƽ���!���N�B�Q�����z��<|��5.A��-�I{���i�K�	���)�#eN�	V�ə�2�f�
�=0�S��%�@�Uy���B�V^J�<C�b��%����K�P��b��р�_���헼e�$�n118SD�bŕ�(����z$��)Z�J]Y�;���A*�ϣ]�tP�!|�_�VZm+Zz}�˒��.�O|��L-S/���y��"�K2V3b���dFd�L����H՟H�ʀx��}kA�Q�zR�G�|L��hx\���k�L��ec,6[w��	t�.@�+���r�'ޚ4�UDo�i�쨳��Bߓ�^HN�_�rx�2��b ����L�!��o�E�>p�>�3�:]��J��1����Ӑ�A�k�������h?fOŸ�r�߆�XM*��\T�w��]���|F��l!��F
UF�U�e�O[���C��5�	�x�:8ԙo�f<C�c�ur��uy�	�J�����_r	�����%k1�<�磠�T��y5�6�.�����T3�G���S�~}�ہO��j�[��YeO���!���nc={Y|������
��Q1q̋�V��XIP�%spӕ�?�2u'�����ۂfK.��&���Gv��7۬���w���}�E۶m۶ݻm��m�6v۶m��mw��3s3���9��d%o֛�+U��jՓzN�¶H9E��S�:��R�
��[L���9�n����A�<5��)��*���15k�����˥
�d.�[�?�k!X�Bx6���T `0����Ἴ�64j�1!���q��!2�&�"H��5b#s�5H0~�w����rn���s=/Ӟ>'�'���C�F��#h�̙��\����#���P�"HIF�����#L�#ڕ���L9�<`�F�"��P���ҕ#��|����c�'�ܛ���瓰#[�4�4N8^����w��L����m��̼�p��0��k��?���05Ee��nu:�3'4��sp�=0w��^wh$c�hơJ'1ɘ_k�.�w�80r{���Գ�M`�\��e��{z�y��ә����2*q"��:.0�q�˹�*Mv�W���siO~Y�71\ty6�<ξ�~f_���q�L��3K�b,��-V��*0�"�f�P�M����)��d^�'$ g�'���-�=��<N�C�q�C�cb�ٷ��ASL�d��9�ep�¥q:���-h�ι3��A���gR�
ݚ�=�Y;#�����5�b�h��d�;�	�%(�"��LH7��
��9��Fk��c7������E�ÓG���q�,�
��p�xb��e�<��eJ��"?��V���k�53�#;�)��De�|�S��޹��F�}�\n��L��CX�.5�D�9㑌3,�:������_�n:V�Eݚ��pN�ڤ�ݮ��f��R05�@ϩ&��]U�[/Z�6=:3>�8�+��	�}���-y�q3���
������ʨ��\��
��y[2�ː��vi�J9D��{��-SZi���8|���$�YR�"���jj�t-�r|bd5qȜ��nt��T%��]Q��]��P2g�|D�[)匒�i=##s����U�6��*�јƮ�I)$�x�	$��/����Fb7}[kl\8k�3q��?&i��d^��*'	�]���VvA���08;�RZ�N�ަ=2��V
{�6+'���-���l
e�>Лd�P�%�q�.�7�s�����5��a�9�[ȳ������t(k���S���~;ɭ�k��S荓� �9j�,��G֐t�ؽ
6�O��Sc��b_I�^M���A�Wt�/�[c��TԾO�X�����w�����;��ؾ}��*�Q�� EG�}�OțCY����c^����D��1+P%�ײ� �
�O��~6�"�+b�`gG_��>~PET�|�D���e�N�쎮
VK�"�����������FgN0\g>�N����@g y1•I�ױ���r�!W[��_v�o�����|�����
�(��c�ְ|��O?x��o��;��ȕd6n�8��LI�J��))�d�ō�k3��;	RЫ
�EL�P/�p��Qu�xoU�w5g�M����j�V�w��6x5�It�Ut%zs��A|�P%�։�d�?>XU��C�q7��x�'�3n,������u�*=k��5V�,�
.U�U���p��>�s�e�"D������$1�'~��b����l%��u1�__
�2;>����F	���["?d/TS�$:OP��9�y�*�/�'ay����[�+�[��3����@@rH@@�����3�׊&T]�Ae]O�~�ˈwO��&(6���J�AU�8��Ņ�ѡ�D~��2]�}��}!/�1i�6��uZ�5��%�۵4�mc�����%�9��1i1N�$wu��gu��Z��N?� �V|>�N|>�I��6�&`2nF!�5�D�)��a�81�Q�H��.�&B%��-B�uᴺJZ��GL�HS�\�MY���}�ݲF�:�����j�&�Y�ݣ�7�����]��6����9t`m�($#�ٔ���n�in���ER�2�!�	��~�Sq]gj�LJ��U�6]5��H�2����H�@�V��ec�f���Ը������l��
�S��͵|�R�_/v�(N�H�]bכ�U��j&C}Yc0�ڙ�%�˩�eup�U�u}����K�mm���
�{I���t!u�x�OAk�~k%���x
Ȯ�6�M�M��	k�ߎm��D��)s�\#�H�W�e�*��ɡV�@'�}��6&z��H��T@BA�2;��K&��Chg~�d{��GVӓ���Js��R :;�ڃ��R��Q�4�4�[PMn}�ɽS�TM*�e$�"�C�d<7�W�0�)+C�<�H2V	��Q���T�cw�s`\T#֜�̓��)U�FQ��Z�E��������f�K��ߘA���L��`y^��:5��N�
��Q��!���Ѫ�����n�tl��]����H��0#�`֝��s-n�!$~���e���}��vj�#Y��^���M�<�t3�VF��9�TT;R&�
@��R��~Ξ�բn1�i�q��\)�8\@�a�?F8R��5�䑇�.,^�=� �W �BA0�A�7�Q��y���_��qX���
@_P�b13u���:�;��t��=�'�(J8I�-��n9$p��-��	��C`�A�z4�]�K@8[�%��C��j�<q	U�G�k?0t��8���~|�b�H_`��%���Є���|=:@�:?*h��'�gkU=&�'�t�eyCs[,����@��j�Ew�����?�vE�yC�DLH���30������}�/�c
�.�ɮ�n����1B��m�+��.��M#���яd9��m;�Gz�U�X��U���oS�4�6J�$�4{P��b��/=+��
��m��g[��b�E���{{o�0�֛���G��=P����n��,�o�s��oņ�<�}C��w��?�,����1&�O�;i���������7������a���M�ݻ	�z"0�{F��^��8����۠?*�DTs��<�}f~C@_J:A�U_�%�=cӶF/~yt	�8P<
$���MP�F��Ŏ�#�}�
���q�`��1�L@���=	#6��b��u�xd'���Y��>��"�`W������zʻ��V���T�K��O����^K�[4�
�C�����u1�"�u��>ok�K�ݽ�E�]�ff�i����g�7��x�?��YH�A2��j#Iɏ��D沿z-��Tc��.J�XU��눫%��_�Wϒ�q��朳��Ȧ����]iLƨ�5qoe�r�к�m�Ե��^9�۱ku(�W���.{�BO�pX�Y�F�?�q�+%�0���.�>��CV���0	�
c��,���<���;�9E�Lz.��������<�"��!�G���C۠_�!Z6j3$v������qd��S�p#�ּ��h,���n�?�x���7M��Z�y1��2����Q�>K��ט倥xj1��l�W{��8?�����[a��5×�A�!��]��®웣�K��)�D��{U�s�+gP�QK)�)��d.*���G�<�
���x�����c��A6'�����O��e�<
Q��\�����׋��8��4��s��]]�[he5
�Z-vEc��JT�V-)��_xr��q�������P��j������v���&P�F(g�O�
���-��D�������E៷����I��a}��ی�AKGu�@o�W$����BY���&[����󖢔32WY'��LH@���B����MhL��w*���ώ��(�4}������2�y��l6$ܙ-Mc���PuVcG_�./�t�֊���[��P�ɶ��u��a�K����Jz@M�R��s�h����U�m�c�%k��7�谝�A���T՛c��–����a��m�~�%�-X�R��nc��Ľ�Fi��}8��ǟ@V�NwC�������t��V3�F璪#u�g��
O���:�\C
�j�p
���O��sN"\�̤��s>��
���ڡ��Կ4���]�c��+�r�{U�1}�\��΃vs�iSY-�}v�MJ��j9���ԗYq�O��H�j����wz�4���l�d�t����"Y�?��QB�����^qO�Iϩ�ޫUEA����(���4��[u[,����}ޞ�A�d7�ƄJU5-0ߪ�6��?�����̀GaP5{m��0)�����j-��XlM�����zy�i�=gx	~Y���r����'v�B���|��3��vzn;a�4��X;F��C�x��=�3:0�7����L�k�P70J�x)�#>"��V=�h�?�id��Z٭g�q���W��d�s5���p�7f�Zw�O�:�H:��� d�6a�8�E]����A�3��i�z!�h"�z0��9��#w�Ag�"��!�<Z"�D$B��Zt�4N�O�ځ�,_����`;���h���G��pj�j=��ѯ[�>K�ӲON�V�g1�:�>.��}7b�ޝ	�1��]j�n�[=V�\k�=�ѝmN�{?r��`����+���҇��0�8�J���������-��`w��e��8˱���9�#���_�>]` A�ߐ���)¨U��UҌʦ�"k(�CP)}<P���by93�~�,�ʆv]���~��P-8��.���J�9���λ~�,D�&����x�
�'����mK�+(ջ����36�s�)@���5NA�H�>Xv�B:�K��i
$�Q��'w"P[yS]��+�w�S��\��?��!5��L�?�I\�"�D�xr�#�^�҇;�F�1�D
sd����p��t��UgHJD����W‹�Ub����]XӞ��'E��Ł;�9
)+uA5�جܣg#`{v8�x�'����lIl�M��m�Ɗ���7�%&��A&�Qf"��E̅h��HDK�Y��6ʵ+r3(���6.�L���qJψ3L�a˱3'ա�/	��a���Ir�*P���jƞO6ƺ��+���*0XoE8JSyEY��OpD�@Lvz����/�ۊf3pǶK�x��0��c��e	��G�:�s����x�!���1b2�-a��ju�8v*r�m��N�V�8̒\8җ1LZ=��[%�wxſ��%z�OM�I�N���829�b6N�|t{��ϭ)08O��.��(���	�4���y�n��H�<�}��}��v�	o��ã��Y��D�)D��»�º����G��!���O��O>c�r/\k}Q?ۥ3Q��1~�wE���������VS��	���T��=�7u�q�{���rx  �	���FN�
U��l���k��%����m�Aצ	
��E��VK��2�V�S3�N�3���ueF��B��PQ�j���0��0�ؒ���Ȓ�..X���yE�`y/����C�';7_;7�y/^��')��8�CRFd11a�>�qހu��+�돡vPwG
,�hc��j���t�_��q�L�I�TQ���J$	�"��l�R�ߡj�#_+D���H�bGE<H�i_�Ƨ�L�E<�+w�y�Pha3��"�,�\K�sh��n�4;њ�,�a�.R����-�T5���g�����G�K�i�o�r�IMc�����}���rk������S��4.[V,Ǣ��]b��-��8�	�y�'2�|}B�a���#��+��_�ڃrYmWV&R�z?&)�&c�h����4Ź;Db�:30�>�iF+!3���vm����	8�L�7i�v�c�èy�VD�*[S�Dn����l�T�3]�@�u�5d�%oO�MC�c���X�i��"NJӈ:�S)��I��/{�/v���|���Mdύ�u'7� 6&�?���-A_�6����!��L :��n��\�,��X��\���͏f���N�n�x�3�!
.����_���SěŠ��ǣǴ�z����6-�J���ZU�d_Y��vSK�d�B�
F~�*���� q<`/<F�-���n
p�{�4�75G�Q��{5,Leᤍ�R�0�C�0y��/���-;�Ƚ�/��E�+�&�����L����1�EBh�g�PPڲ���\�e�>�gϳ��(춭,����ͼ��gb\��d4�D��=�Ho�l�G�%.�#�qjF��I����E����篽��Xr��Z�őճ���2�&���I��ť]8�*C�َSj~F����[�0�t[Q��9i_���7�mk���)Wp����СBԛÊ	߀��_������w�[�$m��s��N�u�� W��7��6~�n̰U�Y��wItI��_���-G�MM᪞����VB��g����(fKP�g��~��SMχB,6Huaѵx�5��-L!3O"]^�ھB��@[ q�,� ~=+y�&lG�#�C�w�3͕\��{ʔ6@�P��Yg��)Y������$رʐ�[��&�l���Ѥ�fM2�ɞ���z����V���]N���2���msco��7�r�^cߊ7w�[ T�S1oY+Frؼ�^|���("[�E�F?7�5[V�w�	��s9�^��l�B�gj�V����@�ۃ�͔�OA<�����oV��b��<�nr��9��0�_fd��Y�-<��S�t�yٛ�~Q�V�;��}{�{��N���C�sy7�6�mG^Zdn��9���;v�wi%%�m|�b���}������)�p�qk��qo[P_x��)m�2A�4��AW*��1%
��4��\F;��E^�D��,#�1�y���K�_��u��3�
�L��(���z���	vZ]pd�b�&��k�=�S0�i�$���W�圍lP�U�z8g���A���sG�<�Vq�kӗ�zb�+;K[���E��E���d��A�ӯx��?���Orb���p�
�'߂ק
�)�lP�)H��[�u���[%�)�~�ZyN�]��x���Ǔҕ���1S-�sj�W�Ⱥ)����uT�)���*�؊��c�\��X~���&FSG��0�Y毾�WE<�/z����P���\�N�<�,�y���:�7:������H��S�%�O�HCD�?!�����h�ֿ����e�̙ �'�!�"��J�$&6J�M��6d�΀.��Csߴҩ���
�LSFA�h��Yi�������[W�2e�r��m�!��:ӱ�»ۛs{.��M��r7%�l�nA������j�|Te�a:���V�t�D/G���J�(��)�z��L0v/06V{�x4�L$[`�����K7]��Qy)���0��Erb=n��7�֥�CY�F_fLs5�1���M<��;ɢXOs<�d�{�X@(�B���$�	3��9�e�C*�D@���9Ъ�m@*̆����Ƚ��CR�Xj
�*����(��M�FtiN��^H{���&��Hs�*���o@��[��}��m�GW���$a�x 4D�{G,�}�О[0/�5�G�@\��az�.�n�֡n�1��{l�����v�}@�:X���y@�'6���U���rT��9m��ZCl��9�%rgV�����֚#��E���ڶ�T�E�{��N�^|���^) wI
u�:�B���3�B���9��X��%g!�5�X�}ۣ�`W���z�!~��,��ଦ�1sr���q��m�Y�↺*��M����.v<=�����K9��`W�g0�Bd����@��
J<lN�V��ǃ:;���r5�eU�_������C�Q�t!�I8J�֌r7�@�"�D�I�i����G��^lX2��&u�X��$���0P����9�="�B\���N�c���>ِ�̐����jq�^yu���<沸�l~�Z#6�2_[�G;�w��<��r�Ċ��"{�sFbb�^B,��^-,�ޑ�xɍ]4�0�-lZ��Ք�'���t�P�^�t��n��XՍ/�x�������a�r�,2Lggǂ�On@�sv�h��Z�V�2/���<u��WH�l���6�5�a��&=���w�Td��?���%qC#]��U���*e^��e�>;��Y��L�*Ǟ=���H2IA�v�v�
NmO7�b��e�<G*+�V:f���Hɶod��^��K]\�ɠc͕�}�78B8����rqE��-�u{��z���lvŷ�qʳ�a,M���*��{_]I,�uc�?�NK@�8�*���s�;i@{����E�?���E<�8A+�u?�3?����z)��.1�vE���W�R��a�e���iX�̔���Lu��$ޤny֊Q��J3���
˱Y|�5�21W�R�!n#�@��⻡S�������zv������ޝ?�
����1�#brg��M�>Ȱ��.=ҫN�ۦ�ɏ���/�^��Goɽ�����|=���g��
��>�=��ί��w3�#Gs���ʇ�'���zd�qy�:���b� �\�o�f?���7��D��9&ŌO�ޥ�/����#�
"�/|���s~���3rBB�7}�{�o�^�t�8�c�䛦���Gߩ��7�dB0z/Y)A��o�+�2���Ox?,��\p�D�|���:�B)�\!�<>@�
�Q2��U�8-)���-���œnʁ���L�n�?ZI�S��e�8�`\*�/잻C*��k���Zu���Ԕ|g�����a2��4a��o��=��oBA�{��j��
S!�`���%�J��Ԃ�j?��I�,
���W��L9�Dx��J3RS�V�M��5UX��e���Nv����R�T�=F��R�ۨ���7���Ք�i���f�8�i���6����],�l���Όώ�M��ٖ�E_����{���X!�T�b[a_�R`E*5�I+�O�����W8�g�K��C���7n�V��]�|��v}�Y�@��ˬ�tt]�ް_y)�53��|�A�@�i����+;g%&/��%p�A����/[���)"Y�~W�U��VxJ���h!�,�
#R���ZP�A���ň��2��M���*�zDaMV�_���*�^33�+<�Z�b�b``{8��j������+�Z̝�z���ȂKat�4ߞ��)����З~b�m�C�Ϫ(�����c�*3{�xڒ����
�O�x��Uc���-RK�.m�s��й�Y'��Ε��r�<~϶��ps�_�Ttm���ޖ!�l��j
���-n'2��1�t�C�c�d�OVy=����à�]6�]W<�X��}z�"�X�$-ww6��.K��ώ�5Ύ�3%w?۹�qb=y�Մp
)A"�!�\p�Ƚ�Tn0�m��lh�:M��6�#p��*�29d;\RV	��"m��{�.䀥�Sy����3X�
ƍb}`Z�ܧr���#�\�#z�ń�hB�]�I�	瀘`�&��O5ϸ_���<B�#��ֳ@���i�Rq�Gc^�o�
h8��fA�ؽ���MIv�,ax6d��A���T�|�SY�`���g���3!�m�I���4ۚ�� ��_�,B~E�S���f4��[��M����BO�S��<�`�0D�U{8ڨv�=�%�9;e��<c�e�1K�!m�	ˆKT^!���5lr�pe�O��qo�4Πf��Fra��\�F��B�)nw]�:�S�K44��������3UpBdG|b�>&nj]^��;Xa�v���(Y�i���?~���{�
�o�`�j_T��Io�W��w�iv�q���q�]R�
5L�`߅�yMC�8
��Р�CAٌz���Ʊ�?��.V1�`�BD
���ڃ�A����i.˪���)�.2㞲�G�"2W��A�}�7>�gOz4��
uK����P*�콫�ʤ_!-Q�bZ�J������$��1�v@�w��j��
�~
$�٤n�P1�R���8}�r}����+Dla$,^H(��x�]`�#*6[����l)��A���)#����8�$ �>�B�[1 lPVx�'�`��rC��0�p��L�+��|�B	�I�Y!���x@�:?uh�	��@%���b��p�@��.��A��@jD}�ꡏF@A�Bؔ���VkDiy?����G
��^���M*�|䬼q�����J1�2m����\��Ѽ�E�q?���NP�^"<|�ln��{D��|�YJv��&��5��y�y"��Gy�?yΝ����+1W��+�+��4�ʧ=�|J"�W�`0���aM��Y
(�M��<?Z4������Ϧufe�Ȳ|�IIP%
�*�Tq����P�"��4P95>��爡ի!;���Ao��zt�L�ʑ:�b�1���fa�A�O�na�5_o{�y\/jAr("��n��?�aޟ�K�-#|	$O
۹m�g8��8U��~�����X�!04"Kʑ�g�Gӏ?v?�@�-�sɳ;�a��9�ma�T®`�5�}��x�;Y`���z1u
.X1�Okw�+,lB�2�Qbk��/u�U}�r�x.uN�.�է��y	/�"�Zo�3���>���g]���2<���-<C���e�	�J*n	�����{�J�Fa�<��EnrM�M7�	���$V�}�[s��<ѵ�W��s*��P�o�t<�$J�ǿU�.���QH��������
�j0�_��n��'��}�b�6.}��u�|�M�I늭�(
K6�i �DY@�t\Ro4)�0?�hd5NV��0:�;璟=�M��^�XP��z�*�����WIP9����}����?I�a$��/|�����hQw&>y�?�	�x]�2w��LR�p^(�~5z��9�ټ3���F�)>1
���/Z|��(O)�ݰ7��8xux�>�`���	�{-Y���.Z~43��ܐ���y��/�G,-���V9����c�D:�%������"��vYA䋠�HT�-�iG�]\	�dnQ� �F�tb�)�+KT���7Y�W\�KΔ���P�gF����
)M0�-Z��]�f�H�jZ!ˬ�)W�/�b�F�J��,&<�U-M�|wZ_���,m��MH��%(j�a������܄W�P"w��uM���b��r�o��Y����T��P&�#1�,�y�K/j8�eA��¢N��΅ʷ�z�z�`<��X	��QK�om�0m�u+�X
Y�Lm	��*�|+��c�:�y5�M �e�sex���w����jH�L��+���6<���Nj�1�t��c�6;x6�"�_�5S� ˛EX_��}r��ӝ�pK5�Gq),�z�f�Q�;�,Z'56\�O�
��[�V.݌�r7�+�wG�ڊ`�4�z�=Q֏%��]�[
�bK2��^�i�	e�-ܷ��
M�8��R��"�-)0����lz-�|+2Sj���P�U��Z-*Y����!ҫ�Tۥ��
�E��YU�.}Q��)�A?� IJ�mP79ű��wĴ^f�����v�^�*#��6����m>�vbZc������g�)�;M�w��p�f]��7�){�X�[	*U��ev�x���jm\2�Υ��I�7%�>��R15��
�g=Ѻ����D܊�n��.�I\nr䟸��/
����hA;��5�N��	�/�T���=��H@�L4��<��%ڮ������R�]	�*���&�0�/x���OSV�EHW��rJ���Y���I�T��(�K]���z��׏_!�[�2yv�j���;	���g�d?<���	Zb�K��i�,e��Cb�}��&�a�c�W�oʪTL�.|{���9A����f��<K�}�~��8ݍɟ��Ϩa�U"r̩����⢖aU�Ů�#1*��P�h�+W˥}�[+W-��������� ��<�vJ��i�/l��,�	#V,��y�~���`�x?�?���i~e�(��,C>J>ix|%�
���G|a�&���3X�-@��2M~���ˉ����w]N�o1�ND@>B�1�_60�e�1j}S���x��f͍HN���A{=�9Ӛ��g�<`��
����cW�3�k�[k��Xa�7_e�Ձ�hi9��ȡ�	�J�HC࠲.����/Q�}�`�*Xג�i��_̞_vǘrU5M��~�~��v�=��K�2�dq,td�
�E���>��y�?��Q�A9S�q�*PV���k_||Kl�G��m<;�/U{���
�!���wp����z�Ff;"�t9[�ev? 
�WA�PПb���o}�ĻE�ܺ��s(�9p��+�v�g�ܺ
�ƻ��ܺ8D�����%��^6��s���ً�ދ�ݫ»���-û-�}E�"�;�/���Cl����.�jF`0P�e�d������b���r\��,|�R�<��P@TJ'(��Z�QZ�`b���s'r�Ȩ�T���T,���*��l�3ޒ��+%�.��oIG�:@ܟ�׍>���Y�7�j�"���<��p��倦�����hj!G�B&��2!RH6HBD\4d�8[,�C�*��8��[|ˑ��jE�:IX��������~�&��Y��Si�*��B4*�����k��k�Cq��`ԥ�bKe�B/�����GL�q	�{�j���z�^���}ش�6�$��&q�.�K�^d��c�H�/d	��옭ĨˇW��8�:N
;�-�!��c�����א(�:�c-�^hRj�(B��Y��&ަ�˜
�lJjӯ6���J����K��Mhg�Ҷ�f
�G��$f����j�,��1Z9K��'~{>���R�"�#��R&eC���L��X��)�	��5���:�x��o�<_��9ſMH��v���Sn��;
�i(�q8�C��M�G����d%w.
�K�-��c���mQ���>�a��|��Ǣ���eߍ�&����g���(l�i0Ǚ!Dsl��&�8'0��F�bqZm��+�JV5��SY�M���m�#"CO�~n�S����P���)�Ry'*���m'b�YӴ��M>�
(U]�
K�<�W�B��a����,<T�L<t�P-�P�\.���j����~�h}����NR�.7`~��&���`�ܱ�&�i���TZU/;
�C8���P�<檤���+����z�z(I&wߑ��ԛ��� \x��1�F.w�D�.��;���yt�QUʛ������EdEڕ����Ql�����ح�7�l��k'�U}T��)�;�:�O�V�<�w���-�2��T$lу�ٔ�۞������o.��F��Ǡ��.t�_�P �z}D�R�У�6�`�<�� ��3�/=��S9�d!a27Y%����_KLL�Virx�o����#�%6��~��C�B�Xa	�,;��8]c��j����WZ7R�&���*"��6�I,;����m�v(ɂ��]��^�
y�gGOW�	�纴
�Y+a�iq7���O�J4+"6wA 't?I�1��a��l���aBv�q)pU$��).:fhS�	������p�dZ!H�ek$g�h�g��$��!�iӏ�Pc��[���	k@�[��N�v�S�F�J,��Lk�_ԑ#�aY���ٷ8������Ҏ-��"�4�B�k�M�r x�=�Κ3�1��e��@ ~�!P�	���H�n�(D�Pj�@�N���lcHaG�����ԏ�_i-	t����Q��J1���dž��Sb S�BV�+�@*	�����i9HI4�H���@a��cS@X��3�D�B�(���ԡ]qzs{�T�(��);y$���un��thL7�DAPc\/.��O,��Ls��E�dc�9_w�#oMI݈�}����Щ�]����T
�c�o��2��;��,�@���'wrŰ_���Ls@�}8��	�s��S:T�0x��?�V�*����o�ʫ����cV�c��2Tȿ*c��h�J���x!�VHz�c�9�:���E�.��yE1;�q������u�������|�<2e�����BQ��Gh[v3{�ikԮg���sM&�J�u���d����#�;a�{f�zǘa���8pCw��q�=�~�}�������k�,tS���)kp�:���?�����I�����a��`cib�bio������)p3���������_4S{'2���R�WF�ZݗSB�
�8��#�CEC��v�3�kﺤ%�E�6<Kb�\S�4��6ٟ\u�}���9���Z���L��7η2\�%^J�]Ƅ��2�O8�@"�M�=�1'-x�9BR���p�Н��&R�"�`:���(�
Br�yZ^�<�8tF����&r�.:�F���X��^U�Ew;lb�/�=�7�X�U�b���2��t4�����;�+�A�j�m$i?8ڔύq_���2�
��m7��f�d�*��'oY�W�ٵ��~#:F��D���Γ4�h��+��~"<��e5��4��n8;�����Fl��;�'3��$�h-;e7͇+!�$:�N2ϓQ���W�S3������;�?ܦn�����g�h4�A��&��hD[g��:hxT
|a��1D��q=�7�O���eϒ㹋�G�v>`�Y���]r#�k"I���{n�y���c�����cu�@\+�Qf4"�H٘��Q٨Y�'�����Du ��Ҥ���`�3�($(�iT7!�Qz�8���	]�TWm>��x]�xUN�t$ƾ���TWi�NE"�HcvY�ӎ��c�6�|۱��W��e{��ZRo��2�J�F>Ӎ�A���;��$�1�9
a9����9�|r��:�B�’Ē�,��$�%S�&lj>�jJ[�$���e��^5 �&��o�NY��.�6rh�o���D��2��<S�l>�0�Q�N��D4�1�$����:�bXؕQT����Ԉ�$=�i]�>�x0�Ky�M7��\Tu�E�bP��9Dpa�^�����`|m�^��T#���x~�:����Bg�7��xH��L�Ғ�MQ����%iN5o�M�RRD��@�h
�ן���n46#d v�˭!��'Pqd.����C�BQGX=��$��3~��v6��
m<��#�	���<V_�l����I�Ds�&[Av���(���#9☍DY����!�Dc�ϑ�L�Q}����;���7�_J�+�~�j�,��/��!9��!9�E�3�A#�Ns}@�MX�
�7�*7r�>T�;2�1�p>��2&;�s�wqj�����W���l�������!#�s�)]��^d*�j9m&���BޓQ�yꩦ�@��VI���|��v����ĕ�Dk��S�E�s}�� ]5���iۗ]�D{��k���6R�@J�X�l3SS�F�'c��4kR�u�UX�Y��}؁�AAE�\:��4��e�I�a��t{{
�}v���O�I�+������E�4z
	����=O���;�C
Fe��Ҝv���im��
P�g�3����^�x�Er�H��Lcي�U��a�1����zF��OpK	��Q�%)��ߺbK��`	�
n����@�dY���31��{c��wm
xАX�l��o�����6I����
�%i
�PY�B���&A�%�L��zl�W`7���q�>��V��4��M�
�)�97����kp�UJ��K�MB���ӄ�p�X7���.b��9��_�"�Ż�dx��\c�>�}ڕ���P��gX_CDn{d
nQX8Z0'A& �1����QG��Č���S�w��o�9������%����RG�e'L�������rN��UZh_�"��x����pu"$����G��,B,I� �X�(�ʫ "}o�IT"�j(�>��R�b�Cu�{�Q19P���}r����u�?��5]��( X���[���U�V�t�9��:����M�lD��RN3U#�O�%ʲ�"�hߣ/-:�/�"��"W1�!L	Qgg�O��_U�b�$�g���ӡ�f���>x��/��8n���x��Ք
��"/�j�e�sn_��0�P�0��\���@B�
�`�')h5��kXz�����28���I�0M�vt���Ǒ'R��]��m i�z�ő���3	��T�2[�����8����-h��f"��PX0%N��c�~s���*�m��N#%l�NK6j���B�a��d
Cϊ�pެp�/"'�$�,*5�/�ϖ��tlnE�60�N��T��v�G(�k���=	Ll�PC��@��6G�jɏ(��P�DK1f$�̴˴���@����3�q$��WoB���A�?�}Sp.\�uNp��Ķm۶m�v�Ķm۶m۶N�wP5���s��v��k���^�@@���h�:ؘ�W(Ul��T�}od��w0�B�Յʂ%��E�J��)�P���	ډ6l�S7��أ�LՇ���V01ϼ����:r��	��1v~n�f}n9��x����!�1W8`S AvY"f0Ə8gٖ�t0�g��y�͞�a�e��,�RNf2�l��G�:�КtV{R0����0�!Zj��q5�[�oq���"�e:�&��dX�A���}ΡZ�]�8�G
�$}"w����`'�
���v�%3-@����\�s�����ӗ�d
���}bzc�9�c���DZ��r!�Tr#� �`��::φ��9��X'��XI�g���q�T�%0��\�ʮ�$���[�����;�X���8��������>jr(j#�=�Pզي,`���>��ػ�-�\~Lu4r:y��r��ܠ����j�S�G�t׾��'C_�H>�Z���3�|y�Rhd�~�1�*ݗT�wRS��f�j�en�	+]���{��oB~�����n����f��@�FA��4w1�iǃn�CӍ>xF��%����҉U���Ã����F���IKQW^iW��SQ����&��@x�o�ghK�A�
+���B@6s�u1��8٬�>�
iz>HtK���eNFRS��n�NK���E!��ި�uJ�q`��g볗��i�_V
v�=}>�JTz�7p��Wk�Y�
�ï�H��z�4��TzQݢ>[A�=���1AK�+e�yk�� Z��9�i�Bl��
�4���Z��B��
$�Ҧ�� ^��.X�^7�.o���-�S0:1���zH�20�E�{�
���{���~1�ID�����~���h�����}��"�����7@��w��(�*%T@�O?�n���U�mG}$rvAc��V��b�����8�;��Ą'�YS��c߿���'�?����6f�����yx����l}`C��q���̕����eΠ�ӗ���K�*kS�����
�����'�M>v�ls9|>]gg�v���A5���4�������їR.�w�|��,p���g8�c��
 ��a�
X��&(�p0&��`���[�?�����x�(�M�#T�0b�뫾]�F�D9
Ǖ�Q�Ҏ����0���W3�z;���Ԟ�Ӡ�4a�~<�"LW�k�G�cLw��H
Đ���q;~g�>�R���r�س�ހ�"U�R��W�.�����h��K����,jLO,�?dXU��M)�t�K�u�� �5{�1�E5#ȣ.[{i#2X����\�nF����
�'�'����� ���abر��O~�}s<��c�^�{��7Q�?��tFLf���ud�z��A\HsE�r��<�ɭ?A:��"�L��ǰ4f&�v����c`��Ix*s;:޴N����3k�\��Q���j�4Mqj
�D��FFF��ƩcDƫj�}F��k�_��]��g�rD5��}/����:���i�/v��ԏ�bf�����Cz�0j�U��j�J�����.�h�i����q �F\O�~�/	��U�G�a��o���p|]n�s"�|�dtƚ���'o�.\�!m	k���6f��r�\[Py�~�Re�
Hm��F�b;cN��7��
�!aN>��V0|���y�r^�dTß�ΓUɡ��
hU���uR�����A�,{�Uק���uLÝqψ�!�~�+{����@��Y������t����}g$��z�i
�@,��@#�[�iD-���������lM��|�����\~/��>�?��|�l���Ӧ�&n�r�z���|`�1[Jh�� Qx[��,;'Ю�x�`Dۦ�q
�=c];J9�Z>e���L�{x��S��T�2ٯ������-灗*��}5lE�TtX�ƅ
��uڣ�����Dk�Il�q�=��PU��S1(SLSE����f�Q���갟�gwv2�ʑ���'zx�j�������l�uU4i9b]�?#�Zg�G�$X&jzP�ip$��1��U��X!W�u��%�R7��+7�5bw�v��F�q�F��q~�j�lr�
B��]��	<����"�zϟ�o�k �Ǡ
��RG]�{��В{'��$k
�=��	L�{��V���l��0(2rï�m�����S��D<p�@����2x�-"�X���&`�j�by��*����Бڈd���5��8_���3��c|J�!�K9t����(� ϪS3V�ս�<_�\��1��v�J��K�'0x��2l(,�lF�R�e�e���TR�Df�a������t��b��9����bmJ)^�V�ry�Q�]�7M��]�H����m<��������Zزu2~��]}�m���	��|��U�+������5B���C�j:-}�U?��7�7�<��MP���y���H���؎If(�IL5#oO~��i���m������f��r�1
�%o�TJj	�V�T4����Hܼ��$Q������P;�6��(�i�UAox��T�&�3��Oe�;��;ďwR�w��{��Y�D�Q��h���$����c�P�~�>��t�h�����1mX���A��yK���
�x,�DJ��ˢ�_�േѐu2Td����&4��a|�}e��W0�k��F��耀���i�?ws���b��'�#q��J6=no���8
�8�l�؃$1��	��VE��E�F��Ж���r4Z���r��y�PgN��j���qG���u�����f=u���wπ0�x��N�f�#}��S��qɽ,5�tNV�`P�q�B�� �[��Q�x�Ouܾ���.nU�v�#:ʣ}ƊGyH��9;����{��X�:���v�QΘur�ȣ<m6�')_�
��ʸ�E������aNz�|�>�}q!����ܻ$4���6f��I��g�l�{�v��Qc�Q��>w�ҹg
bQo�]p���@?3����͸M�T�oI�쁔��ߔ�����Wܿpzs*��j�[�t�K��Ќ7Mx��M�
���G����|%�R���Σ�h���L��	.��a!�[��j�M[�mx�9Q��T����w8_r+��/"���3|���۶=be=�B=r�<���'����#�T��/޽�f�g��}�>��s���#��D��'�_L�x�s&_�|�rPOI0��C�C���f��d�⾼TsN�3��]����I�{�j!@s�h'�趾*2��.��� �ӟ�w���&��g4ٻ/s8��cw10��:l?�'ߌ]d��`۟����.��x�����O��~�?s���x�(ˢ[~J:8yLY���3Z"0�����fQ�r*,bl�kn�ܚ��~o��3�r=̈́��V,=��~�B��â����7�X��6šM�tB�?��v#D�)�Բ��9q����k��I?�wJ���0��p
9*�k�o�0���aUv&��Y�����	�Ik߈��M�����z��i�nbs�up1�l�X.e[���ƬR!��OPǂq��T�� c�B!VS�VB�u�t9%<��và!����"��cJ��A㏌�֔�a����L��v�ɥ5�nTGb��TNJ=~�T@4���h0�믩�/cI�x��H���/mU��[S)�8F� ���j�j9��Am�Yk~I�3�g���$�A�ָ_��ImFj_�fC����*Ν����sz�5�]�-X�g�����8��[:��prP#�E�J@�^�{���G�9����T�,X����G�����I+Wi�D��Y!�lR����oT_��ꛡך���cտ���Ư^-J�5¦}Yu� ��Dֶ��0��ӫS�egI�ٛĹb�&��}5�W0�aĩ�0肧���H;胉3�E�[���S���]
E��ۊ��,`AnMZv�M��

<�HW�
F=gWAHv
n���6��t�?o���L�M�'�t�@�q� ;�pS&m��i� ˟��	��D::��G`\'����p� &'n�O�M!St�ɻ�5s��Ҫ�Pu@��z��)d9�.�/ ��
T]��N�)�h�0�������#��d�U	߂�@\�)E9k��_���u�`n/aD�4pS�	#�M�P��Qo�7h�%�3R��9d^�g�GD�� ���/1T��ؗ��
�J6�4�`x�P	3����CElnj�7c�f
L
���?	��󏜞_#�mx�~!�I�e���/�$�Z�ֱI�7�1II���B?<��� RC��=#,,\�/6��!G�����2�)Л�뙕C&�	,8�H�����G��	�a9����;=�0g�Rџ�~"X�K�H;�q�t�4�]y����3Ҽ��� �A��[W�A�un9������z��Q��CLov���ok?�E�@�`^XO_�0��HZ�:-=W���-���sB�s�{�2��i�L���G����4����[ۚ\��-�+�@�!��sQ�C�A��Q�[��"u�/sI@@���6Vףּ�n�Ձ0����â�R�'��/J1��Ā�Q�Τn榩Y�o;��"ҁic_�@$�`x��X�Ф�f�"K̥+C�$��&?�(���J���#��ސaZv~A.�<�	q(6�ժR,3�i�H4����K�����'\Se.��l�i�L�dKy�V�7����a��J
�3ˤ���h����(�O��i١аP͚�nW�BJ
l( �	�`��E h'O�`��!`�8mR�c~/�Kܙ!�bĠ�pA�T��f�)�=7è��2'ز�{h_�65̅�p����&0����Il�ѕ�Z!ФN��W4�T��Jƈ��nhVShR���PRZGf��3+P��3Gw�6ü����F������eso[[pT)�DpJ�OS���$�b&�D�ˠDVR)&�y3��;bc^�w�`�M^����S�Qmco /�T�_(w܆�U+�C4�YTQ�HQ<�i�
�c�
�eD���૞wrS�ay������e.w��Cl=�D8�T1ŝ��L�2Xk9���a�TZ����+LUT�t�4LT�B�P4�dO�B�%�lgJ�o_����U;NE\�P���R����L�Kl9_��.&7�K�N~�7=u�뉄��*�
ղ���M��g����ܗ�)�X�^چk	hLtfdT�H�jbm[�T��.�՝��TY�IO��D:��UDgYI�Y�.7DMva���Z7ar�C�Ύ�U���d��aRq��'�j�;Oҷ��!
[�5�m$\�9D�XRW!r`�~qa
�l�tX1�'��^~�%T�G�g�7N	��σ��o�W�mTu��+�FY��ߵ<bI��7G��H��7�06|C0>ڃ��8[�m�Y$��A蜠��k��:A��FT����ػ��)
L�S
�J���Xf��DKT��1c"�O�ֱA��XF�-Ma0��:��O�BgP#��,�'�8��<��Ҭ��c��1���w,���-�3�x^J	)��q�sqZ��	G%�I�Yd{��|{�����4H*�cw��������;o�
$��e [	���cl�`u�l��M�P
�h�ĉ�?�P�@̯��M¢M�v���Ȩ#���#7v��R�5�kTD�h"��2�GR�ˎ��̈́SL�z�4ǫ����,T�+	�G�
2i�40��ɛ�]�ld��:eE��3�����0��n��,[�O���z�m[��TSĎ���1#��M�����Z5�G�?Kց�����5x�5�L3q�E��k�� �s�b€6��20$��5a����"�����'��90�j���*+��Rb�V�r�rV-c�O���\�a��z�@G��,|"rZ�LOU,|�����O,��ͦ�]ib�����u��4"<�?G�hs��H����x�s�����(qt����y�RJ�b����:Ca�=�B��������Į��}�!̕�{c#2ܝ��G!�W���;2n�s�ܢ�Q�bP�M�}�(*~�y�W�?�����:R��8�\�%8��J4>��Lg��i7�X; [mK��Q�:�w~�(�n>ay�;��۝�@�O��`W�"q�}�*j�d�b��	*����I�V�r�H(�*��8-b�Hd�j]�F��=���N��/�0>˰3��>�a�/���O`�꫔}��	�Rȴ�g�p����<�����~�����`�&H���
�����+/��	/4VJ��.��*H
�<F����#C���v�L���
$��O��z^�Q�%��P,AٟT��iQ��u��G�l*�Q��J��32�����~^۽Kk�����<aٰ6Û�~yU�W[��^��<u�p�[���`:Cx+�-�����;دv7&2�����y�с�R82skɎ�Q�b!ƒD��#Y��)!�8p��>*?<�P��3GJ��|Ұ��i0������o��g��T�-�ލ�kJ����T�̍\q��uI�Qn���zĊ4�V@o}�����S�o�
�(X��9���\��@�c���(j^j-Z
,�2��i�
i���M:ϓ�o�"'k�,"�5�w
N�ct�)h��N�$ ١qb�P���O��֓�oR��E=(X-O��4;��旽u&+-���j��<hxF�S�Ԉ�Ά�@ :+Z�9�$׃x
�g�2y-C	ȽX�'��C����踌���H_=�*�Es6�v�#����K[����M���ه�bE��2��L?y��&�Е�K�4��<U��\ ����}J�fZ���n4v��Ɉ:ċv�V�)T��Vl�.G�-:qH�ў(��!��]��Z�7�ԧu��������1v�D�'�퍐=�W�����@���ʓr��C�=ɱ���:cҠ26a�Cr�|l�ҥ6�h��F0��i���j�`7�z���Y�%��_jaA����>�M)�r���+��������'V�rD�zJ���&��)�Z�녒��|���6E�W�!�D���g0�v�s$TB��Ma�ina�,�y�f��>1���U�*��檓}/�ĥ9]��@ϖ��
�Oq�	�W��	�F�8�Dw���`.�P���8wӢ�� �y7��v"5�;���eIj.n��6Uv�������hd-։�k�1��Ʉ�˜Ӹi��7�ºmI�7t�C5s�ۢ�t;�������a�cOj�>�HwS���/�8܁/���7Ϝܼ�7����O�/_�G�4�=�s >��;��c���S��1޾�7��>�S���o��؈�p&�?�|,Zb�6�iA�͑��(s�k(~p�."���a�J�=���2���b���:U�����gm���3�f܀�$�[P�Fts:gˉW��b,�Mݼ�pH�[�R�Ed2���K��r��8Uc$zQ�B���UЧ	a�
�!����7�8w���@R��l���,�*��	�*Ln���XۉӓL8��7<IN��ݫ.g廮$��Qq�?D�bz�z�����	.�d�Wޚ���#K��Y���ɣ7�:�
���|'��W���m���	�I�zG��2��f#e�|��r�dt�jW7w06�7��q�q�sxs�@6������1��m��I�b+.��/5��g1ŏNgÏk��Fa(u����
�
��֯X�*qP�[S�C������V��T���K!ᶂ]��|֧l�~^#��g��j�v��'�e8ʄ<�N}0�Z
<� 4�m�qi��2�V��egj:�t��.x��7�����ܽ%3�L�R�/��1�b�/6�}ߴ�_�����m3J�j�"l�l�50ј�x���(u�]ܪ�{iߖ�;�C����LJ�,1ZK�p��%cf��=�2'�,!~%�,�K)X��*?`�|��s~Q�!����ɥ1J�y����a�"��Uː�*�*ɖ�˪����6(�{[J�7h��A��0rB)��L3�o���r���)��\+�^��;��}*3��
��يW�{��ڤ$�t@�$��E�{�X[3M	[��N`O�����@�!���1�BO�(��o�����I��x�J�!hm�Wچ^�,��*˯MI���+52.
�4u
ݧ{f�|�*��M��
���g�����8n����E�����8[��6,g���];
U�
]B�ni�%*f�n��e+�&��
x�y;�b�̔r�3�g-���jK��ʝB��&�SZU<��߽��ãu]u�)Z	h��		�px����*�{�Y���u�Bժw2�;:;X(��%�΍�����/v�1��T[�z8A`�[m`_�Kt�E�F[�!��7�xE "r��}�vX].	����}�C�t7�)���L���J�x��c_�ҷ:^��'<��!78e�su[V(�&��@��!k"Wۇ2������<M���3߰�ԮxgW�n��/�RA<�Ƈw����R���� 6;��!�c��i'���J�Y����X���d�"�4�d�X�t��q6�;T��Z��G7@;�2�_����X�s�H�6�?�Y�wJ�4!�k���N�F�]��L�m�R���i������5��/���ZbU�)�T5�=�LHt,��u��+��Jc��h���ykn�x�=����@F��P�pπwT�Am��v��4r-û���o+��`+�]g��^4K]
z�Tr��,��u����x�/|ԙ��)��W	^2��a�q)�!|Y�}#?�O�
j�3�w�ѿu+ ���@���m�n�?��ϑ^�$�m��t�FoR&i�0�/G�7�	��Sر(��
Ȯ�&Fwb���ʽ-c�֮���}�|����-��6�_�*�{�q��>�:�>�~���i��A�X�w�m
g�nޒ��i���Aj����H\��>Ib�;�>k�1�p��Z�'��=k
� ���KГ�L�����m�%��e�6��r�w7���z�?�Vv͜�Tp	��x>�����b�O�5\*bCn�x	��Ag�J�$�K�i���J��dLĞ�+�_!��O SHH�7��=�uʌ��}S4P�St� �S�V,Il�*:i:�Z��U�Ws_���:ͨq��1�y���F�	�.�p溃0������.0�l�3��)f���_�rD�����h,4�{S��{<�='�R���g�x���#�}����I�w�Wq5z�(�6���[����L[q��~O?v�Ӻ��J���Φ���-"���0�Q�%8$�����UN�.e72`�<e5��b�̤ڜ�X=��K)�t�v�����1�M�!i���~���Q!�X�o��7��(f�j�X��jxu	�bk~heq�P&-$�s��)i��oS�
!�~G-)YRt
�Ĺ����I�l?b�G#AI���U���p��XH62�,��yJ��#X�+�]�������aYt��F�g�E�eoDk�@��S)4	[�=����]���"�[Ylm�R���3�q-:r������c��#�$�Tr�p�)-y�a���*�~֍�=���U�R�
��|�K�P�4�`�TVR}�~U���<���n�a5���#�7!'�E�n]���_no��.�S�=�
�,٤+��46"�P'r��^0����|<�f|�?��i"Y��@@���G5+��8&�y�c���l_�2��.�~H�A�H0J��jX�3�g$�5f5Qfog_�6r5N͐RP��BPn�Z��X��Ӹ(�5�AA�Y� �����_���t6��h��ly��f9;o�v=ݖʂ�G��υȺF���������e�l�Rڢ8d��F����F���	{+�
o,� ۧ�G2�0ޠ:Ă���z�H�>�A��^#ԭI���߼��>����
Qb�u�s/m�.�uea#گ����%ea �޽���:>��>���9 ��d��&����!Ŀ�wM��=�&�&��S�9h_���
c�:��o9ЀǼ�
s"�y�5�!��P�����z	v���2�W�4�9�e�=��t�g
��E�؈�h�SQ��K弩�3^ײ�D�S�K�LU��[�����h�͜�c�-W���:�P�	 �g�ҐH3�x�m�{V&:x�L���hI�L�}rxU�0�j�@_���诫seV5רIB1�#��Xԇ�b���g���͒�f6��)t���C���+�b([���b�e����U<�Łn��$ڴ�b�yyOԜ��f�9?����!�'�o!M�D�_t�������P��߂U�;�h����Ly2����ٓ�,��)��~�e��T�	�����3@��nD����d��3C5��`�+T�(�\����$�@K�V�_��@�W�G��HhM���/�#+o�..X�N��*,�	1ۨڰK��9�8LO�A#rZT,�Ztgc����V
l��]��d�
o�nCp���	6�q:����Hi���Kl����mj����IndH�W����/�e7f��5�ء�/skҜ=_�7�Zn�[�/���y����y+
���H^�����@���w����Q{rr��N4�Oȴ4r,oN��� ��≻�r�|���|C �q��mf�&�yB��;v���e�t�0g�ժ��s�����������#�J�zljuN�,14�-�(��0H�9�N��)�BZX@��%��-	��+�Tb-
�;����D��K�N�ܪ��У�h;匡:��`m9e\�[Q�!@�'����ZqRaW�Xi���Ʋa��L�e-�;[^S��[�E)���U(���:O���A/�� 9�O�/�m���\��L�����2�@kmh��8N]Q��%VYJKQ���G%�yP�f�
��]��2�9cbE�)�A��MA�:Sn�&�����M�#;�t��șIɉ��b��3�H����Mg�l��_M�p$nHj�QGQSt4�/�yCJ�%N�"G�d���t�&��
�4㇨Lڪ���3
 ��J1I��,�x��P�2ƖM�X���\���N�|iJL�V�h�	i���#%"�?�L����
r
���f�l)D�}���D�
,D_�ƌ����:��m�-F̉8���a�o=��
z�[�媑�gbhYR��<���MZ���N9m�aRR�q!-d��*��z�4)�g��	x�އOL�ϓbի�N
��r�����z2ۨ�L�NR�pJeq=�<�V�a�dy��B5�
�?�.8��6ig�꒑z�����/�Z��H�=ԏ�Q �K*>�@�qH�v��q5�`!��|Cސt�B�p��J�vܖ��!#E�����|t��&o�1�B�Ѕ�L8;�pх?J�r�Q#�f��ZR<:��\MΏ�F�[Sz���Y����`@5#��>�S�s���)aq+\�VxT*|�J9y���YN��0��/�.��.a�09w�=/E�+�tc�M{����FfE0�_��<;#H3m
���Mh��ϋ-�su��D�������\ր�^_L����d��a>/i\�H�=15g��Q}g��(E1~$��S��4V�FS�-�A^��d���}�d�����r�
�YR./�T���ΡT����1��›��8�Zt}dcEr���R
"KMѳ�*i��>?��~�؁.��AS�T��W�
L+{6�0��0����&����	�s\�kھ�
]%��!	���=-�~��^�tZ��)&=YVJ�:W�<��g��yxv|���s.�o��-廚��o2��X�Qt�B��|{�C��'�
!\��"�U��p�͝��.�����#��b���)�A|[�zO�ۏ�=<�*�[*v��)�+0;��d-��"��.��	�i�B>]��}9�
S[�����Ӣ���[�N6���gC�К�����p'E�M�E���u�Ί�W���� {�q,�?#��7a�x�\�1� �8<�5-௴�� �匥��X��U.fja�l�h�bam�υ����)��������������?�I�!������3�y�A���iĠ
�J�������8H���I��@��)-+�+���ϢK�,�O
�����6n�7-+�n^7�)�|�Ҥ��}�D�����]��[�]ϡ��@�v��T_����o6�on|�?w�|�z߻��}?�o��_p�lw�|��d{�B�z��C�H�9o^
֡�DD>�>�$�P@�k!c#�@����(L�2ub����sZ� ��f~�EGu
e9m�9�P�����25���S�4�q��i<H���w��x�x�܅��m�;����FcoԑC/4�S�Ϧ}..��<I�}%�H�b�F>+�� ��9OK��>�z1c�k��v1g<FɷB�yݠ��Y��8�b�z�]K�Ԅ�p1�j���Y�vD��:�[�U�a<�ŻN˹M4���Ѩ՚�H3�ꎈ�˧a2n�F{M�U�׽`v,��}O۽U=��W�8��5�@A���"«�X��[����ni�R|=�|�8߸�2Vs�$^}n�J|����Μ|e�n^V�Pg�yIv�U��-I\30%<4/�n,vPo,dFl���L�!��2�ߙy�3ęO�ظ��s�j��KEn*4?�/,�ۘYc�,;U�G�)I�"Ǿ"�Q�q��N�R勺v�"	�����e�G�_�PI�lZm̈76��4O���ʛ�W��i���� H\l���M�=IT�ɰ<�)����1�۬��o|:�;�˻j/y�� V4A�QD�d�V�����4��ҕ�ƥō�k�^Ye̎�N���҆%��J�%T��a���OP��DX̀�|�v�SʑI���_��Mw^�xy8^�2���K�\��s�ߍpLL*�63�����!��%ݖy
����:7S"DWG���,��vn ]44�I��X_4
fc�tK#���/��K��k|bQZR�7{�8�]�����I��R�i�&l�ә��Y��z&��ޯp��-�x��),"@��C�*q���)�w��C,t��f���o"W?&�@V���gv��k�HԠ`�;͒}^�e6	0����A]Nj"r�,��T�44к�n� 1�N&�����q꾌��|��{r=��ޑc*�f�B��9za^ג/g�-���KcVZ�P�R��eڞ�:�i�Hu�7�{=q��$��}"�ښ.8g���Q`��[�O���g�����Lj��ˉ�N��F��Z��4k�H���X�����%�{�a����l�����$n=n�7[գ�λ`
-{VCU�$�u�k�Т�}sV�O���>-ٓK����	1i	�sugWN"[�{0n�0Iɗ���P�u��t!�2I�#�����(��u���P����r;�-|�w(x�D
��L1n��%á)�	*��7�Z� +��E��|c|T���
�<���(=��rA��߄��p��B���$��
s?*B�M��	�@k��-���I��2_��Q���`�Iu��GH%ފ�&�J���2�B7�Ǵ�I^G�J7���}I�{�B�V�w���88���88��P�7�A�����ĉ���9&4�lU�i��yyh���v���u8y�R:�$]�C6�1U�l��E�\����a`����@Iy%�G�R.�!�[*-�Q�7'��k�����@%�8��)�bv���ܢ�Y���
~����gS�x�5�t�(L_�_�xl5q.�PE����@�k�n�vG�(Xw 4��������csPض>�vN������ꀮ<d��y��P�6_Ry¡`t��?B�!�U�ϸ�[���-����OʟY�YͯW���l>��0�,�Oe��y�,�M��n7r}�p^$(ڐ<c�r�@_ymߚTF��m~���v�C|>]�5��hu;�xq��=�d7�
��Ba������:v‰��4�˜�M����}.����I����(�?�m]�=��>��c���|~�sB�ʿ.F��,X�-@V�%����u�K�M��"�6�i���J��Qpy+>����x<Km�ZC�c�d�#��B�
m�
�ծ�PƋ=�z0��9cq��@L)��09�hQ�ŀ�[M�T��(DA-�G;��l���7����>�:�J1�睦s�-	$�/&u�Q��4�-$^���8>�?�����2.y�m�B��*����uz�a���[8����;:8�:��LF5��6[p�h����N�-\ײ4��y�;����#X���4��jv�
�p�����Iʆ#2�M�z�]p/�����6'���3����\�S�U4d��'���%�Ns�)�/3<�
}uL�t0c�*�#[;�VI
�T��V��Z�Yz�ȾX�6R,ͱRu�"���
#��F۲Wow�D��P�~1O.+PU y2�J�%A�glI�u��w���y�/�g<`��,�t����:9AS���P�����`-F�ow��Yŕ��l��*��7� �Ud"�0fR&����Y&gMB(ͅ�N�N��\k`K@ �UYa�f}�0��_�+��e��7C��00�-VL⎽��*:/Ѧӯ�	 ������M��Z�+�d��J}���;�,��0�G���F�c�RW�
o�*V��Qh_�Đyt�>Ӆ���n*����� �3��PI�_�ޝʴb�n��O6v�q3�qݧ�0c��.R�!j��G�2��nj=DfGy'�Q���!�����]��ց�f/�p �5��v3ƒ�b�����	��jh2a1��\A�r��c!�7C�9���,�i��`�L5���+
�8��~�*�r��r���3~[�е�ﲃB�ޣ[�"G4�S�bG͈{l�"b�Cq}ʄ��h�"{�C��J��=_�k�
{;����@\{�w��a�7kQ���d֩�S�V� p{�ܫ�*����Z��'��Q��5�φ���c.�4�I��t��V�h��R|���"B%N#Ψ'Xp��I�7t����1 _�៵G&���zN��w�P��[
'���l9�qSd�8����$N<�!�[��1tZY����|���\JA���<�&LA���-"1�n9a�C=Q�=ͮ@T��a_��/��&6σaL�=�x���oh���izG�v�9!;��ǧ�Q���9��C�A~n�"�٤��f ��j)e�)e̶�4��*2�˔�D���U�D�PӸ��m
���(t�éb�,,���0�T0��TK2ӋR�1��b�+5�DC��* �H97��l\tq�Л�(�}�e��G<�E��8`�t�Q�GS:4q�;�~�^/E��P��ӡ�(�5(�*��*�K�^S&��ߙ$@:"��F��bذ+m��9GI�Q��3I�3�?I*<��EZ�$�V�L ���x�u�Q�Ӽ�r�+/�]lo�V��c�K��Ӟrj�1"*'�a̺�)��84M(�hi���ʀR)�#m#�h��NԔ�T��)cU�y�^��p`Ű�q��w+q	�/b���P1�d�SU���F����9��
���ޣ�"R;�M�p�se6�>�2Ƚ���W��-��Y�r+�w��,����qd3i]B�v��QS�{��5zT�ye�������.牱J�T4��`��`���H�}K����;�P۳�.��*[t?��i�
&��O�N#�T  ����,9�1Y'=���x����(�Q<K�	��]s�&J���q�@b�4g�,���*)��0���3񦟛��̭g�6K�����Ka'�)�t�5�~�->���c�1���Y�y@<��3E�T<iRv�X�[��@����*�Mގ���B	���g�x�;��v�ތ��
Y�#���|E#a޵�q�b��㙢`0;��0$�o�ԇ�t�\��+�a��@Œ��@�TN�� 0��r�v�����R�%��Zŷni��(�]NvC�,[8�=%��~2���6�m�]��Vi*��Zhن^���3]�{ћ`QKW�c�,4Vh?�jqk�m����ѧ�F'w(��j���6�����`���0F��6ONw���mr���>����emb�Z�i1E>�O�r-w��j��w��81� ] Y�m۶m[۶m۶m۶m��y�Ok��,�ETDVnrY����j�["��M$���,9���sy&<ګ%�bT��Q���l������J�H��I8"�B	��w{&����]ٜy�}�p��e!�#d�f�ٙ}<0��"��E��8X���@�ޢ�	�+{��5/���XI5`�j���=�z���p>s�~���(����
qy%xPWw	h�/�ۑ��^C���͎+����=,�[��V�����^���� ��i�H�P��X���|A�p+���GV�5�~|�_l9�_q�v~��_͚�4��1j^oh�?~��ſh�7o��w�y�?#��!(�n"�uQxe�
�=~��|e�E���Q�gr�n��w%��7��?����Pu
��kF�	��XH3BJ�LmC�&�G�bj�ՂBH�&\����0����Py�o�:�uM]�^m���������99f����V��|�{������
D�@����(,�He�C�҈>r�p�;p��"Bx�y�r=�D�q�j�?"�XԴ�T�"�r/�@��h�/t奡�*�Ԭ���̔~(�d�q55�@�s��<�(Ft�eX�9g�e���b�}��(W�e;�2���б��Ts��t�q��U1<:�1�R��,�.j�L�2j�,�6�x�1@-�(�,ijB�E�TC�4�M�#s9�)��S�Tk��FNq~4��;5��5H�%��-�К�E���/�sB��4R��-���)3Y+u�>�w��D�S-T��b	_߲
�	-�r��ܲ��#�D�.��B�M^�u��h[T�=K�R���y�t�ܚ�zy�ͽ�sǼP��*����)��ľ@�-��8�J-�P]�0���ꞇ��a�PA
�2p���w.��D��\E�vE�k�lz�:ב�Vo"7*2S��K�=г�N��9��e��H=��=��oJΠ�7}��N-�$��t��cv�#w�#�NN�������+;����p~S���}�
S�g�2���UӠ�|�F�	�R|�a��4~�ɒ�^�H��3oєp����U�۰�p�`m�hK�^�^�L��dL}LƜ�r�1���c��2j��
�G���N�;�胬c7@�Q4����k�!����2�[��u��5�F�L���KPv��k=�:]�s�*�HƼ.xyW��`�[|
+���d�%��:@��H�[rJ�v�E!MO����a�I�!�8&+�e���T,�D$�5��b
���,��0�~�4C�TJ��& ��z0;i
�2@x�r�2�\�QJ�����Bv&#/��znvf�tf[��Ҕ�~"b�7M<���B�tdXc�8g̡0�6GVc�6�� P*Ę�L+��r;�	R�:GgЋ�4;{9��� ��O]����N�c5'���JE�Η�.'Fxm�X���J���k��ٜ�]���1��0�J��	b�MY��3��3��S��u�����Sg�vSi-�h�l3�����+2'��V�J��%�$���՚ӓ����Lt,o�d��Ϝ&Ŗ��ry�4V����LK2�����=�p䑈Փq�S��9_�
���`��5R�),bt�2���V%F2���A�b��2j�T�͠���W2+Jr*��J
�|9�R�3j� ��d��/Lk�!-����֓��|Q���@f��[���CJ�$��+e9�ɸ�7�P/�6���bj.j�٫����4홻���z�����qچ4��

}J>C����!Z�TN���+����r�.�_�iʂwnO�e��$�J;z*cz�������9�\�K	��pۭ�%���JN��
NC�o�MG�}0A��0�������8r����.'*b?Y�
�LZ��X�U�+���=��<%�u�zѡ���O���b�}��|����a�_Z·���+y�)ث�G�5誅�ͬ����u�]��Ah�:�D��1>���HcD�o2윻�#ŀKk�u���k;������]�Jr��	(����gg&E��.���(^J�HtNyoQ{
9�вz���Ȉ�I�`Nms�_���]�R��%��&����!2T�H�l�Mg��pZsc%L	.��St���6�
�ּ��*�̓H_t�vV�st���O���Ɣ��ޘ�f8���}�]HO�Ə�y؀)k�g�&�Lj O�ZO5�-�cT[��G�
������M�qHq��&�8H�O�i5����fKHG��PR�
K{��FC�ȑ
���頑&����Yٶ�Jt%X�[	�����Ɔ���ǁm�7R��$�n2��\iX .�XD�An��Z<�9U�(j�Z��8��ʂN2z��"C�x�HNָAd#��8����c�E{E��j�uB�����j%F�� WO��J��;j7�1`Z�� ��R�/�B�����X�XB��{� *��a΂:�+���rBBN�n��;������ۤ�����t���ӄ��4,�l�`�s��i��,߇�����r)#sZ�w�Mm��gDk_�!�Z��L����:�J<j^��H	��:�'�0��
x�~�W�U���֒(ݸ�	�n�^�6M���R���a_�f?4�&$���(yrc%�]K�!˒�qâ�H��Q���2��񾇪�_^~�n/��YP��ޒ�HPh55b�LMF�5	��k8�#	4UȒ�[��tN]�;��<NS3`�[� �<A쫲�9��12T�����,A����h{�e!>1�h�4�'Djzq�H�n�%
~:I�����~���&ۄ�o�ћ�α�`:�4M/�%bX��'[�*��Y
)������BМ��QDEш�zɵC�)Z��1�#hj�d����[�Q��ꛪ%$�k�|�𝛑���ƣ�y����ٱTr-qe�458Hj��+Ӱg�{Xi]R�P���������4g���lvP���� M��`@)��%���<���y<`�B�V��TeG�j��<��.��+X>�+%��%���a�kyd���
�T�R��9Bm��Q^�	�Ԟ"�ܚ�[7���&)��L�����Q��!�����l^�n�j�T=��h��1S��Z>c�m�p-�t�=�"�t",��K�fl�a�N;��m�Ϫx����ޱ��I�ۣu#���2�ì��T��YX~�*	��txiz�FӢ8�����N�z���97Y�M�ll_���h���kN���A�Z7�^D"�+n�RT�5
�/��9kZ%eb߀��T0�ڡ�Yͻ�[�|svP�Е�������bt�� ��ȶ�j���Ϛz�bv��u����t��!'8O��\�6�c�-��(P0Y������U���#*|�E�8��-�|I85����g�M�M
Ί	+��a��#ݬ�٫��Ű�1q�l[�}��S7�M��3�O�p
a!���P�-�A�����)���2>'x��'�m�J��X"���+�>��f���;�����'e�G�����<�G����d�J��|q���w[��Z�vD���~+�x��51n���
Wx�8^|�Q�����w
		�9\��9x�_��B܏�6}KÀ����h�"���!�[��Qi+�1���FMeW$X�e���Z�Q�)�d�j,ュe�Mi�����'l��1��,G�%t�@Ge���E�;5������
d?#"��H"E�М%%�e���4�t���jQ!����lE�g!�Н��Xo��5ڥQ��dlZ?�;
�'+�e�=�=��C��Ns���H�F�ݷ>r���>v�r��Y�r�<l�7��'�d�I>Oz��hn��U�,O�9e��UX�F���E)�*��O�[ƇNe�)v���p�O����9�:��3M����
��3������[����Z�U$�UvLy;s��p��X$Zm�1��L��+[��MN�-3�]XKlw�'��Hr>� ��'��vbH�TFM]�:�<�m���I������WR�~*���%�*���ә/"ٟ�d���Y���E�p_B
���J�Iͧ�'
��AX�A���ő���8#H{�\FZZڑ�5.�P�~M�`
Q$�:Y��z�b1�j~�jgȲ�#�������)R_��E�!����wN*��H�y�`ۂ'{��"�bt`m��g\��J��v4��[��e\���X�#f��kg�0U�06�"�5��Ԟu[e�y��_����]��f��C�DA�UK�����o{��j$F��BN�e�|�;�f�>"D'Y2��ġ:f|�	E�l��s�vv�LS�Y���uS+��9O�nϐ�i���>�q3!�S� e8Y���/N6�kUA�=ҍ?�h5��
��Up'�&���?2%��B�@(�����<�<�5\ˎ�\p���~�"��2����"_��9�fH�V�}�G�S}���p/�t�T{Y=3f
.�J'�4���՚?~㽆��&���;��'ԏE;b5o���z7^I�.�����������9֫�@Y]��O���T����jٸ�DZ)k�ª��&�b�=7���ߞ�%|
e�5�c�qC�������Qc۴�3%ӱ�T٠fh�Ǔ�U	�-��8;�����6�oƙ�s�:O~����E�Ʉ���o} &>yd��0[#��G�x�D#�LKg&1:|=�r�V�OO��_5_��;�o��#��O��
0HWtQ_=�i�O��__xw2���g�r���x�ͧ���__�ɿI�m�����=�:x\-�_[����ܢ�]�	��+M�K@��5�?�cϢI08��:�\,;%lEҲ+l{GS�=~��_��Ir�t2}���K���eZ��q�-�ͿEM}{�o6S^Z7�d�S�m ���D�֠�����֡m$Y��p�m�i���֤m��������mK�ز��x��2�Qʔ*��c�G\zPr�?|1~s�M��d�-�I'%<;Bo����a�9�V���!Ugg�a����=
��zӾ�e��b��2�*/�ueiVg��7&V)�ڈ��*��7�~1T�Ӻ��H�4��ʰ��Ñ�葊j^�>���?�E$!�
�h&x��p��~h�0v�ʞM�ߣ`+���ˑVb���_�;�/���:��r[����&��GN�w����T�����䉘�){��G0pW�48&;�؆YjQ-����B��$ө�d����i�G���`[6�o'�aV�@P�2�kb�2���Q�N!mUnei'ha��A�-��ьi�%1È�+�8Ip@�A3����N�S�Y$��*�V>P&�R��I�č�c�D3�7T)�No!�>u*g�>��La0� c4��j˅k�N�mM>�G��@�6W��N�#�k�vK�!	�(�S2��JS[?Xc�]A>�Ho����������ud�V�Eǔ�
N=�3]�k]�[F�S�T�A �'#u ;Ū�豽�ҊS��xMgվz̸(�����,�ST�֪�ޮ�;��ni���rO���sg30i�����p:�T��1��*}���9şޮ�>���(9a������'P0���1Kw���X�/U���_mY'��D�o�3���XT�a-bI���}�	1v`��́�Y�H�z���ll����tmy{f����h�Y�|)6��I��؊����>�rN&w��[>F[;�����
�wE���:+��H+��ؚ\�#@������ϳe���Ո��1�Y�t�\u��z[�ȥ��ԿUT_y�Z�W]N���EP�־*r<���~���ơ5H{�����Ȅt|�v��rC�U�VP�GI?��t1�E�Q_{�R}5���S�c_�P<iC�p��[(�EXph35��2�H��q̈́�v`:i�^���:w{�:�q)��M��38��Ƣ��4��[�Og1a+j�-+[�H0K�IB��wK��З@se��r���C�Uo���[?k�i�fG�$�\����~%C��mO�1�K�E��'9�	^������xw���^�n��U��"2��0X	��x�YIH�����i�-:r�4,Wխ�=�+o>�Z�����\jϼ���%�H&��s��ʖ\���`Vi�{q��Gk�w%��-�Hq����~r|�DNU"�Dc5y2-"
IG��-�#n^9ؾ(*�á�} ����IEk�Iʝ'���@S� -r8�L�Җ�s�
eNSB��6e��?�5eY	�x�����X-���XsBp������J،�@.I�|��r�WJP:��:ؔ98�Bq
���ApWԭH(:�3ms��?`$���ף��[k����0��F�W���|�`��[
��s_t� %��㫯qZ��O�A-w�R����\�M_W���t�Q9g:��acLl�J: `'��*�t@�~7�N鷩�}�?����8C�1�<�.�і:OɓN�^�����#0R/���Ƹ��S΁�;Ø��r��Q&U,c�\ޱ�0���
�Д8��uhx��t�NӾ~B�x�(��`�{��5�ɿ�d;�9h�qVh�(1:�:א����^w�zм!boǪ�K��d��e�
����(WZŠ���%������XT�����2�ݩGA��E�U,M�{m	W��Q��/a]F�͠G�e(���/S��0T��>4���!VD��^���(�nM�H��W9~*�ec�239��Y��(�G�$&m�
ŷ�n��$%T��g ��,%lH�X�'3e���(�C�R���S�O� �Ì%�Cɇxi��/^ųk/v�|L�VV�6��wx%�3��d�vߞV���kOW.��y��V�_�*�VJ����QU�A�Āj�'�VI_�T)Qs��Kr��T�(�S�!�A�s(��_u��L8q��"z�
�Pj_���3���\1�TN�V��h�o��^!v�]*�xyh3�P��n���#Բ/��ʆ��F?MXh�ٟ�z�B����[�j�M��V�/O�Ց��A�dͅ��;�޶�LX�3�����u���V�i�*��x���g]1e�ӂ2�-�5lŝv��t ��_n�&m%�FM�w<[�Y���~2�������D��F�]��թ'�L�kk"Ao�������1VI#!�W_{c����m(�7��� �>Ї�Q�H	&�( �
N+�)Vw�k�J{V�?��d��5J�V��b�W̜V��!Q����!-�I�2g������vUa�	<6Ӈ��'1f�s�c \��P��S��-�+/��P��I1��m��?��&��cՅSó�ݎ����h!��#l�b���kZ�(��������U���I����6�ٻ*�Z����k�]�yPA(Ԗ�ي_��$\��0��xL�FE��uP�)P�O���bO0��b�񎿨���G�O�3H�eK�]��O'�H�j���
i6GX�������*_�S��Wsmī-����SjS#hؚ��>s�D�Qm��2/��[Q��VƯ	��ݣ(�G�bB�J!�+�v��_:�;�E��l'�J�;b�pt����S�Ѣ��e���1���R9��~Wz�A�%�a8��ߺu�_ބ;�a\��g�Ej3� ��e
�W	���PWQ�Ap�]���yQ8�):F���2z�|n$3� \���3�n�H�4�%����lu��xr�U�k����v�Y�i.�⡨�
�E��E�����bܺQ��K[
j�S��Y���2Bs�ݿ���RR�n��B���(7d�iV�љ��.]�4���Z�<[4���Z��s��aS���I[��#��>W�<�Z�,���T�i��/s�b$�8]d�S��dg�u�+
ȡ�!A]z��2�XK�QXR��;��Q��!���2M
J����ޤ�A�t
�4�F>V�,��x�NLā�U��7�]���ݝضOTrʚ��CA��NK���	e�;̝�ԓ��,��ܲ��Ţ�ċ(�='��O�>���Kk]�{�{zY�<o҅Ҳ�3����v׶"�|Wc�sk����w�{�X�%�r�3)��6g�j��U��ݜ�C ���"m����o���~��ݣ�oW��ac��U�e[/��S]�����6�v\�;*ŗ0��(��݉��V��ɗҘ�Gr�h�'ɫ;3���;�V�twV�gBIp�t�w�m��o�Т=s�&���)����{S"�!�ɷ��ʜE��=��W�}�X��
���{��	�
e{��>���,�~��#G��Vz�oH���w�e���V	S�wN�I������>r�KL�~!󂆸qW��Jf��P�lj~V�Y��j��B�>�XA�Z"It��V&��k�o����P���}
9����Z�r@��%�+�b�~<~{|���"xI�&)����3w��SOGY��2	S���
G7w&��i�}���}ǻ������L\l'�}yɊ�-%A�x��;�c��~��B�����!��?����@��4o�׈`k�ķ���C|�֥���Ԭ<HJ��F�*��@�b03κ>��yE)��%��cᱏ�2�!bŖ�Z$��"n��+i:e�
�
�8wmCF�HR	���U�� +L{�Y`��8'��S'y�S�<�%n@���h�ǣ�K��Clǎ��$^4n9��D��uy��d�K͸��rg-�IM8z����՘t�@�q�����`(+k�㭍b1ջehVE��ګ+�БԎ`y�-*���8��R�t��ӽI�cq�x��x�7�
��tYCTS
�H,��;�-6њ�Cr�K�B�z�=-�<�7�w��	N�����>W_>h2:�f8$��թH�"C�)շigVӳ��n0p�EGm�vn5���tQ�G�:μiN��ܞG9�`���}G�,��k����Q0Y��N�7V-��1�ku��D��VŲZ� ��݅X�=�i_2�P_�g�I_�Z5-}D�L�T���[��xÚ������9c6���_t�O@tZ^�H���{�jPK>�b+w�gr�[X�Kc�S��/Ft�Au3���,,p��7rg��ޢT�E�Ł&�5A��`��uב��F�g���G!b�Fe��rj_��B��\�x�F��;8���Nh�Ľ)=�ߚH�$��1L�V�nԧ����u!ňuC��D�(w�u���5O�������j쮛�7e�/��VI:�9a�$�RN'z�yi��{��;���Gv؆TI��V�.�ڠH����P�!O�.X�^���*|xD���-�3����B�XϹ1�F��|��G^����:8\�Sɶ<�*��(���[ѥ+�ٛқ�|
W\���&����(�����\Wd��zRu�ZfO�:���G�6����.���T��pm���{�s7��e<P��ZD���zp�ct��zA�Z.|v�cL�7/W�sW��*���A]r�@���
��.��*%�X闝��K���ƾ�9E?�2�е �l�'�o�$����}�G3/����L�*��'X�}�m�G�t��Y$����"I]rZ�&D�'��MA�ciDž�DZyC�A+Zw�I1��M�-mn��-�f�u�=��=C�Z�rv�h�ѡ��@�#��@ڳ�
��=���_�u[��_�ylIt��.�� �w��ד��u8��	滾n�x�rR��S�#���7ܑ�ڬ�Ub��c�W��G��pNpκ")�9S�\��-�	���7N�A��Ա
�3L�%�v<\7�|�(;-�&k>P}6A<���{�#E��n��߷���A�J x>��Wπs�=�Qߚԯ�l�*"�;��(u�8~���i8�w��l��*�mnͮ��o�J���űlw6êS�����]G�(xs۔��?�5zm�i�tWd˚����y
|Q��RF�.籷�z�-#oQ(��q틟�VG��[O�4(~�(�e�d03񺰹�A�,
��V��;�$�w�"jFQ��d���nf= 6Ž7f"qU�U~�*��9�=앒�/�,�Y4�]o�wÙ��:�K���9�
�J�G�G�L`|�����?��/qv�.DPȄR,W�<��K�'v�m�yMq���5�
5���;� �'j�>86��
����'蹯Z��ł���D�RqT6V�<��\?#t����0��-�ҿAg�>�ް?!?)?s�c����B�s��c�!��\~��z�Z�˒5/���k).E��6�U.���ʊ�*�15���.�@����<H��@���rK��z���M�d��6�~��9��[���Ü5�͏[
�dx�݆@?�u�ss1#Bi��t�#�ŻC]�ΐ�g�V�E��l�1�g�I-d�2����]��g�3�'	���\nn�e}+�ر���5������z��RG7iL�Qmq'*���:�#�bǜG�9��9�$U������j�j�'�����65���.��|V�K����'�ثG�lL~'zZ��B̈�7�5��!*��k�
u���̅�&�����B�5�S�
�u.i���H��DPR��fd��S%S�r�F�B�d��N?�[�N�bC�ɮ1}�-�^��ٯQwM7	Z�~Z�~l�º
�՚�Z|��%A�� �߶�cw�$e�����������ﮉ��9��2ue'�k|�D�fX�u(�7a<p�+v��t�T�ؑ�^ѠXQK�h'�v�X#�{G{<%F�%e5f	A���x.[:�MU����>������UL[a.J��'�2jg���]Hʇ��!jMO�0���V�:����+p� ���%u:n�\�B�%-'.���zI[^ؗ G{��ޱ��g�ȑ0��H��S0wj�[F۞�T��	S�/����(�'�104f�r&P�L�:�Q�J����א�Z��&<�<��-���'�y��g:B}��#y�}��C��y���M�s���&j[6���Fw$���6[�x�f
��0Mf��[U��y��Mq[�8݉��-�[{��;����[�7��!}S��[��9s�f6���&�\Кc���Ϧ_"����0_:��M���Õ-c�)�w��M|���?n��
�O�[�Iu��-i_p�ѿ�u��%����O���)�sf7#�X?d���'
,�)k������O-@��6G-����Gf�b�QF�j�Fvʼna��6��`��"�nt�Nx;TٛK�1s����H֭�c�[2'|^�[�ȝͫc�p�`;�ֱ�[�G^
�i��
p^C̩�[c�\=��Y3��yC�I�6ݩ���F3�����="E�)�M/�-�1�����3��ވ=�[����4Ŗ�w��L�v�Ӑ�/vq�p_*��ċg#_��K�'4��� ��GeK�2>��݈s�Z�a�g���/�/\�p�N�-L"0��B4���\�n>�o x^(�7�?��0��v��޸�� ��н��S���q�������r��Y�I>jx��2��8rǎvx�!74�>����a�E���*��e{��b%� ��q��s928z`�J�abA����_�qw��`��vs`�Ve:�2Wo�AXY_v*�U�*[�#G�)�j��=J���$�BN֋����#�_U����o�,"�n�3��Z�x���J�|�x�(�P?���Y��@�8;��[�o�?�L�FA��~C���²�������0t�$���ErAzX�9�XE����t���_9�!����F���I�Y9v+=�CJz�"1g.V�`����I)xp��w��]��l�=H���>݇�s}���!��B��>

�/)��v�z�C�%w"�,fЉ
:�,���������67��ypH����&�r�,�o~!�C�\8��=�{���o�Eކ�M��Mb�]�(l!��H�I��j���8'��"��?�
�bB
c�A�� ��|T��B,\b��'&Dd�cK'�%��s�d����|f��RȄ��W�T�=r��<Я(C�P"�
��3U$��8Rfsx/����\^�=K;b���#h`Z!��F�@�ǎ��識3�zѴ�U�B�����CXzW�2���<�$��#!\�8­)�$��b�?�T^��1�1@����W��j����jF�4�m5�Z8��i��Q-���˃e�c�r}[�I�4�=7H����g$֜�r`���=&I����cP��c_;��ϕS�E^n��,��s�v�}�����&���F��:��m�
�Ҹ �$�2�u(L��@/s���L�E����\�����aF�����H�Ȫw��-�Ri(X��Dy��gJ�P�ڢi��G����j�2�ub��4ع(A�T"\�ee�L�^����8��0�=� ����7�UY�d?�j���;^�U4]�O/h����I��JW<�B&�J�l4�`B4���K�������A�8c
6�	�'����&�ؗ���Ԋ�h�+�!�"_�8���U�)�j)�øA�!t��."j6��$:��<�sx�>��O~���O����\��������7���
�IR�_^h]0ÿ��D����4U����=��nX6�g�F����4ü|����o�s�U���g��>����Хe��Ps{���+��>����[�_��q~�)��8‹��i~��3'����]ʶ�3ӑ��@��wr$q{����	k�/�oX*�w�<������Ud���R�^N|ߜ[Ŷo-�G�����U��W\غ�T��Km���yJ>��>�_-��{���²Uݻ�B��-��uJ�gC��E����ŕR+�󑛎�f^#0�~+�C�a��?��	IG�_,�'���U���_�ً��/��#�_��䀑�/Y��� ��V�ߐ�/��w���/\.L���!��#k�C�#������PhD(D>��?������4��l���O{��|���H��@���L���#�m�O�h���0��#�n�0'�a�h��1:d��e�R�<"�Co�s'� �k�Ak�gޡ���\��I�%{�Μ�'/o���gN�C0*���ua��#G8S�=,�<�6� �342� ���s�* C���	�Ξ�G3�={�e.hD�Y6%Rb<b(ύC��xUTUDi��W�`F���hNwĘ}i7�>`о��H֞;9�	�����լx���
��Vd34��V�lK��R�/eAΆ���@�_w"I��g�� ��(8�p6a�xd��$� �c�:-seK��i��}��(i�@��0�ep��Q��Ӝ��	�-y�09PEMap1@��C'1z�>&]���&�8�h�$j�i�DV�?-N6ƝsKs5���_��m�_�k��&^�&��̭0mI5�x�����{���lH��1�i��\I�v�;�-y�-i�6I�e�w�k�;��<��poB��H��a���|m����C����K�D��j��E�%�/K03o��i��v��\�(3��䁢a](	N��{>�I���#��9z�h`6t,�E:}l�I6�u�W��9�|,�����
�{�B�6"��X����̉]�ڽ��v���D��e�,��$I4�rG���}�~�� 6MD?�1���P��}��*/�$AѼ�&�y�R^��ոN|8'�T��N�1�)��FطW�+�.�跦�lcd���1-��>[�\x��p���`=�����M�z��8�U(��c�]	�
�"X���KN�aa4+�b�b't�HHG���BO��!J����O,���F>`�Ȋ]�*�
W©�H.��BT/���SW1�ә��S�}]4���c>��-�w�Ɋ 4�
�A��n�ŬB0/2�� p2���U�,Q&��r��J��ej�l�(��&�n��hUܔ�9d�
"}p�/��1F'��Q�B�/���!�G�(�B�^�QB�:O�Ȏ%�/d�g�M��c�MRG��%,�=0[av��4a�����t��ɓ��;�2d���5{b�ٳ�-M��Z��M��c��L�wQ�.���`����[]NJ=ߠ�χ�W	�AuɴxQ �5צ�R[������V��c��S�
��R��R��P�e�S��4��s�����D�/�(��ް��J����!���Q1z�I��)�QS,c<f��!G̐!�o]88̐����a�@�m�u4���6��ɐ��w��Ǐ�=+�[c��V?8�sb����m#��8�3Q,��=���槸�(�S� �3���$8�D?^�t���O\9������8��UR�V���B-�J��YbD2���$���2�Q�� ���
 ���+� !ۘ��X�h�f�h��L�
a0���S؍��B�:gr�i��|p��.�$ܘ�Ij��?�����]H��1�ZZ������Z�������p�A����ќn����QL:cq8����P�a�����x@�UWĊ_��
���J+ԅ w�^�hk��Kr�,|�]Q��qp�h���ѡ����#g�RKOB�����4֫����	����,��ms���X���4���lĦ�ûo�ؖ�θ�勥��B�&���փ&F|9g��`[���'�vBZ6S�a"��*�A^͠�v���yJ���Od��2x��(����<��2DIz�`����t�tB���G�d��nM#)#Qwr5�йz��S�0/�yצ�����+�QU�%CI�Ժ]��Q��|�q,mzS��N1�uؗ�io�3��M׼x]@��J��-�YI��r�š̨�Zn]�]!�!o���Cw��E�֘�����||yP��٥f�Dd��5sqÄ�?Z_����+���7�����'�Ժ�!K/���C%/f�Ԍ!�.��Sv�T�A�.|3[��S�F5}��i�C�.�ԍ��=(��Æ]�?Ż�Cgy�z2<F0���z	�>���t���FƬ�{��П
���d2��;
���\4�}�1Ihc�;��L N2c�l"�]$�1�w��?�Z]�뇊�s��6��!o۷��+�F#�B����݇��t��]��dF	0�`����w��/��W'���^Ԩqїj��ڪ�����f,�ڼ�f�+�Te�C��#p�Ъ{��X���z��LR"���M]��K��T�����P	@h{B�R�Q���Le=kP��ؘ�8$����A<�`p��{��A\���W�5�WN�w��M�y��Gv��&Y�`w�6Lia�D=��L#��?@���
����Y�-�H`_�N[��8\�"�I��l͆�W��NS�0XQV���P	�jP�#ح���0��t�5��.o������L�U�w��=2o:���MT�_�7̯:1���|^��޾��z�~{ܿ�t���;@�4���
�&N��w��Ĭ��`��KX���$���E}g�sJ=���ɋ�h��?UoH�m�\���౓`��`ϪL��q�@��`�*�����L"L
f`.�K�.]'�
�i��-����h`�����b�v�fʶ����?j͜m�E��ZG��
}�!�����MےJ�)m�=
��̧WD��Z �z_�,�d���I;*��R>�s���z��kǡ<m��a!���V�a�u�9�ܕ�j�
�ҫ1�;2��(ׂ�ߘ�CPw6��~��G���'�n�>LB���U�q(�ȇ�G(/K�[#�̆pq�:��;ā-�u͕���'�#0Z�����;�zV�!3�3Ą�H�e�)a8r�B�CC�`^���W"��L���J�CB��2��W�W�0RU�/:�q�)��<���L�߬%Z�߁x�/
�
����s�ed/!��"���a�*�-���'p
-%����b}�"j�/�B��"x�G8���L\:��$����>��b�&����Rw����$i,���,�:q=��ݒ�6p�f�ٕy���}r�^;y�T�5�I$�K���ន�D��>=�PU�+��PT|��o�{�A��k
r�
q�
�s���?�B
�*d��#�[���Z�)Ri���R��1���v9S�g����p�W�n�O�1��zb�O��b����vNA�0ۚ.۶m]�m۶m۶�le�v�]]�ϙ91gb�f�����\�����2�}���oVs�z�_.�=܇k ���#H����syA_�d�$�3��r�Z�:�FoMp�9o�4�ա)y���y�p�8�\����s��1_b�W�@�C$"l�B����~�}�S�cI��]�8Q���O�����!�ѯCN]I�n:��7��y�fwW��F�]��e�_l6#�[��n�('��D��(�p"�1ǒ*�>9;��ި�.��Wߢ��R��s{K���5� ��.O%��v�v�P�q�$-�nG���Ť&��|������XW�8����j�S��6�Q6_d��/��X����k/����|C�Փ́:>��O��ڰ�G�]�?jO�m��y�A����ƛd?�w����m`��s�ތ�Az������
M?g�pr��s;Ƅ����Gd_Bgu�)e��-���w�M��wL�$������F�}��m$Mz�z���^xaw��R
�Di��p.�F�0.��׶MKZ)��Kʷm��I�(ίS�O�� ���1��@}P,�b/�Oi�iA�����NT[�fineÍ�f�{W���B�РO��_�X1��ς��$�I�U�Z�mpZ�$�$�L8X�cw��iʋ�����yq�3��T�+~�Ś`��Nђ�2�	]Pc��_E��E��E�QE���_]_��r�g�\�-�����Px1�L����q�A%C�b�?1e9^��?P�n@?�U�֝ߌ�똒M�I�?Bo���?��O
FE��#�� B��n�o������&^p�0���:��*
��2egG�Q�����	��k{7���X�0G���N��
܅�<��q�� ��/�!JM._ҕ�H��q��A$QiA�<.8�#��ǖ+;����[��z񸐯�ѝY��D3�P�.p�>P؞�v"�?�ߵ��&c�:��]�r6���7�i��f��)g��5�Y{�P�C���P+Z�	z����w�x��D�9�����7R�����4g㉳ă�fu�����g�b9�F�m����|h����6��5��՛LĤ�1:�\ӎFN�>����
�R�f���ɯ(�.
��������ju/��<a�r�rI
ګ��4�}Ք�W���`r��j�x�G����^*q%F�M�+��X�}���졘��G]�4�����6�]�x��x�y9�΃��6دnj-0�͈aw�u�j���M�Kl�㝮���)y�y��n-f�
=C�"��wnaA��%C��>��H�K|���S�s4L��G0����e��K|��+�uZ�sk������>�y���7J6�op��%[�謹#|�%G�E�������5C�-i0p4�t�L!5#Oz�ceW�|��f�A�B}��M`g���)���(�ֹ��q*�-�Ô�d�ֹ`;��*Yfì�*G��q1���5t���A��p��m�ؙ�Nඬ��6q׎5M�7�g����D'x>+]�9��@ܝ��[^�w$�x���6Lv�0&����m�#�H��'k-�����$�4>$*��6[�˖6W��_#A�i�~fuQ^�% T�c:��p)�H�����-�G�b#��\c�Q3��є�;���#=��@�	��
_��'�������u��;���&�G�:⠇�IJ=�,+��
���=���1��I���o���뮁�@��i�خ�� L������SsUT�D��%��c�(�┗N$(�>.�ݟ4�M?�˓��
���VK��� �o��L����܉z��-L��H4|x��H�T�p��t�����aC|��9ڲ7��Q��i;�E�¸qb�Jyk�!�0(<f8Q8��X.�g+�~Pe�������7>��F26�e��P`��:��+q*U9p��/V���hLU1�E)rmn47��̹(;�`�Wp�Ԃ�yω>���Spg��kX!x����@��N�}\��bK栱`_6psA��2�nN�I�6l�k�`X|��`�p@��to�G	:��r�
|��'����V���A,���o8VZǷ@\��d���´��\��I]�5]�l�c�z�9j�3`@C`�0�Qr�~������_Q���L�˂-_قm����E6�_$��}!�u��Js,_qNe�d��<��+�m>0�L�l�a��䡗c��r6��iZ�l�jN��ěu'�<gC`��u=�h�S���mߊ������}�]���Ŭ�E���w~��gN���4A�Q/h�}��B�U�RL<�>����l���0��ijY��������S�ֵ�7��
�^��JX�.�G�e�L��xA��z��37���P�k��~�_�􉆮���7����;��ػ�!l@�fƈ�|�)��3��g,���{|��	<�1���g\zX+�#��}����(�.+e<��M��֌Y����a��0\�qrx�1[B��;L{�FK׃#�u�_2�}d����0#?o~Ao�H�H{Oq�{�a�B������L�#�y�ai��^��Ӭ-O̞f��E"lmZT5�
[�3�e���jT=�A�x6|��/g��5��MM�"�Vȴ/��-�,����’�vY�I
�-Ц�bÆ���Έ*e��9��ݿ��<�h�ѯ�N�`�4-��I���+�g�g�û��>G	i��J��"!CD�����l�t�㯙���|�@2o�2�da������e]��g��R��/p=>�O��2IpP��r��Z�k	�O2#�q&NΛ��*Gt���]X�K�qV?ٹm��N��l]��KUr�ӥ��wAi�y~��(!\pE�����ȟ��;�����"�f��W� Y##�.���;g)f�'bm�Q�\�L�oq#aI?a�`��a��`�0h%HPыo�%ؙ�Ewoj�/׸ٌ�͗��W��r�)$�W1�����=���{ױ�B�����)��s6�7�֨���sޅ�����;��֛!�k.*k�|��փ���g�\��m�ب:�T�ɠN�	�x(bq������w
��W�YdvB9�r0[���={i�ʱ5g&� �?�Q��y��ӗ��[4 �!|�[_L�}���BP޹	-z�S$���@qJK@�u��5ePBoΞ�K�����\��#���0�#���ͦ1��(�H�|k&��1u��1Q%*�Î����ͤI�&�~m|��>V�
�uy׌�Ա��s�	����פ�ѩ"OA.��/kŞ+M����w#�����O��\�\��.p��#dF&�2�a����. %H�b��.q��g;�o�f�kt;�������[?�X�DԉCzmӸ��Eq=���xS�����>`��^�����'�l?��i}S�03t�A�t��L��qd�)�j4��͜�Ǚ�*�,ư�Ff��X� Q8*j�q�(�l�-3$�i"�/�3����) �E8  �C�L�XUg333[[e3�����Y����
��N�^�)�8l��D<����w��j��:(N�de�����R`X�2��I*�
Ψ��P%͍أ8�:*B�0||��nJ�XUuq�TѭP��)�!���?~�͘.ȝ��X�8���+)Y�9+BeT��Mvj
�>�̐�	Tn��B!��x>Q�6*���Q�����ǟ�S4��2�D���$�>�B?��Nc;��J��x_��q�)�<��f��kE���}���|�)<:'�˟�f}8�b��,l)���}������η��8���k��Eڨ;����n��5�_:� �j���T4�ă-�?����튕Q@��jʳ���-�b��d��%��DJě���13u�_Rl|}�JZa��a��vqle����Q����t:%���1��G�AQ��4%�
4�Z�:	�Ǫ�3��^U5����y��I�Շ
q���c��$ ��c�j��\Nn��b�ȧ��a��&����S�W�r�a��P��m�7B<���óɩ
��	�h���,ޢ��M
�@���h>V9d�s>%�r�_5t5%m����;Y
߻2ܖr~��閇��b�y�V^�Z�v鮭;R�]sBa��������_[�S��ș>k�V��*+4zv����l��㟰��Ȋ��>J��������P"�7�e�M��QO��a���ܥC�	[f��="ư��$?�k��Q}d��6�K�O�K$�ݏ��'�ϵƚ.�*�[��@&�^Ǖ�۩ x�'����
\J��#GE|W_i&[��~��a���u9�
Z��RӨ�i����v��2�۸�a�5���O���u�Vsk�M{�R�ևeK5�]`8�7k"�Ǧ:/�}����ʲ�&s�X�j�o�Z[̓�p{���trv�ž�����^���vx�[���`��t�j�Yx]�V���zA*��h�'f���+eEk��#Y}��K�T�����<\U�.Mܔ[�L�^{��g�¡l��D��v�@ezԅ’e���w ��R��7݉����ך�ū�[Ʈ;B��u���QS�H7{[-%�Щ�VU:I�c9��ѥ���BW����#c�	ci�?���|˞�j���5K������T�rV�ˡ?ŧ8hJ�b���*�;��1��7��V4��=��a���)�
��f��!�i��han��k�-phʥ�\8��H�<���C���_B����&�c%�8��qs� nS'�.�	ʧj�H+��0G��&���_����0����.����+�Z������8<X�>�߳`�3�_�)5��{%��Lf.���Dc��F�k/��M[�.���uJ��A�R��VH�8��W����]"T�ߟa�~�긋�,$Xu�4�jʹgݶ%���4u�z#Ϙ�Dۂn���Ѡ��_MX ��t$`ϵe�$��Ƥ�4�)����c�Ǝ��5��5�̺)4:�3�fX��]�@@V8��_��0'�{ge��p�,�xE����o�:
~����#�Q*��y9����ibD]o���]ȅs�WJ�ԿH���	^0��j'7!ɒK�k����[�.g������`�,Hk�H��+��W���?|P�PX�B;�Z�	��{�[;��Š�F�]�� "�6\yw���E�ԗV�>�L�rBL�>S��X��Zs�+]4Ƒ�fʆ-����"��Ax�?Ȕ����A�72�L�l�����_���Y�����{a[��E \��"ۛQz�K���	��Gج�W����#���BDNjJ�d��Iٕ��m?�h�A��%��zY�FfBյ�	�g�y�y.
?�3? ����B��X\�B ���G,��3
�I��|���Lf�R�����9w�K\Đ�qYl����.�L'L�E��lw���K��Z��䍺S
Pl�l3��y��j|
�}�ˏ Aۑgs���bO��x���mz�XH%�����Ƌc��R�v��A3�m6qj�tC�Nt��9��[΄~��9�/u���&3/��N�� SU��t�J�if�>���8`����ݕ(4折4�6^��tzN�]�
�i���d������j�F޻0�X1;E��&��Y)�f��kq{�`!�5��֊��Y�
h��Gt�l����uǕ�B�4qg�Ow%֓�a\��:Z�C���g�J�y}MC��M��4��n�bJ��~��r�V��#�F��_�1m��'����ʕ���(-���-��!�n����VA�����U���,G�+�:�v+@6���lI�t0�Z{�Z-���&z̐��bj���t����0d<9`	!3+p�s�Q^Z}�x��x�~�_� �1���۴��j�x4�;9�hu��Cq\pƨp�9��%aw%S9/Ƭ�ൖ������:��.]z'��x�}H��W���-��y��e^��'ݲ\�')����a�0�Ԙ?����6e�8<e9ބQ��Fڊ;�K�^Sп��O�C�wp?@�h�y&�
�~�$��3��EYg,�P%q��s_\�����η�Le��%�VYsRx��t�a�i���>��1A�yB()ǁ�g&ǁx������!�q��j�:�*F�(N&oj��k/b�y�Gb������0P�Ո����/�ҩ�GB�f���yo����}��@��k�\ܷ�<M�_�����#��1o���O�0x�e�0w�|�(�@�4�e$�
�GC��g�� ���1Z&Թ�I���ǷF��Y9����ys����=�`w�������l����'�]}E��`_��5Ln�m�틬�ië��j఺��Fş�c��?�|	S���4o��7�lj�wr�j!Z���'e�a4�X��QI��T�E�j�ʪ�^k�l~A�U�)OBo�GF[���������H���?@O���
C�&��,K�J(NF19�L��-(�^J�䕍��l�c:O�I+%��tb��O�'�5wM��E�2m%�Md��O;��Wδ3K�7�&��})�0��X{��^��^�'���w�o>�8l�w|ޝ�� !S��ft��٧T�_.}����b�9%�
��M�Iz��H=ʓ;��,,��U�mD��vڅ���`o�o��o��4Yi�OŠ�p�$��t~$�~�g��Z�������	}��tˉ�6h�;��}��K��/��o��Wu5M<+n����	GVS��t�?� ����6$,\
����g$��*y�
5�z�/��O63<[�}����n�Z�.]ta�g��y�_pz>�&]mT��f����q�&��e�%=2�7̅���{�/Ć��=L�7r�N�1
����o�w�o�JT�T,@��.坉�}�_�M�Ewh:D����~��e6a���/�Z ��x*n���-k����a������b����ff��bA6(�6/�Km�Rm��6Gs��Ff���*�m�S�Hn�<nH��e~�'`W@���}��tѰ�����(����m���e�a�_D�Ծ�.=NL��d����&�(q�*7��"�zK�G�G�]A�%H=B�88J~ F�����V踗�FH��j�,t�>g����9rq���#�`�<3X��-H�4HVq~���>�!��ߛw
�ZMHq~ve��x/��p��p���*
)V���6l.]�ۆ˓l�/�j7)6�՜d�b?�V
 $�7�l��HA�]�h^��LJ�dɕE�zqdIgR.\��
ֽR/�'��X�(*5d�7K��y\�~�O��Œ${�b��[_
�Ӄ�OI �TX�����%�i�G01�<^�5ly���uV���~�|���yty�A��`q9C�A:'K��<��<��/�Љǃ�#$i�VO@j?^�ȜD��q���Eu�+���qnϣ�T��5��x�����We"���Z�W�ԆKu�/JLYگ-7^��}��
��Q�¯�
�h*-1Td��8�d����㟢[��s8*��� �����.�x�������l��n��V)X�1,����̝Cc.�xSUO&�hV)�]��^\�,�l��lքL�KpU�PP��
N�l��q�,̵�RP��}s[�F�x[�� w[�s�v@��Ăl�WA�d"�j��Π��,6WH3�}��n?HM���EI��t9$z}I�d�&L-կ��9��et��!��{9н�v�{�KX���S�]Aڰ�/��^>��������8Nf�c�~p�(�Aq�z�������u/"�'� �|h����g��>��&���x_ ��5����ha�Ñ��A%3Ҩ
���l��O���z&���*�����{0;��j�U�}�C�I���0����X�oe�r��Z�ox��E��,�"�/:���!��m��
�Ji�)Y�'�S���}
����i�I������K2��zo��i y�>�??��Esc^L'���|�`���+��lY���ȁ��!a�Y�O%CM�ԍ��Q�Sg
����ԉ�R�~άMd�/�;���}��c����A	z��7)q��n�+ v� O|lh"��'mpw�I�v���Q����*������qB���T�,o��f_:�Un���y��Kw�p���
4�'h���TO
�$�������EAxM�7��7ݶ�F��{1T��.,���e8��R4�����&����l@m)�R�@֭)Pa��$��M�T�����X
FM]�+|a�CZ˂�%osBK�*��y�O���S�J�
�0�*�C?Z��z�'_�Z�dSWjE���u\%�eɹĮ��˦�-�ҟ�9T��՗�O�v���l�".� B�Ĵ�^!gK�QZ�ol�+�
$�r�!c!��#,���ύ>^�������U�	Uw�����dА��u۝��e�_a�gdh���S�LZގ���zɡ���s� �=�Iԟx?{�N�:�GS\�:\�>��0@�8�X�W&�i[-�q�������b��Dt+�v����L�̸�L�'2�C�bK�I��Gj��Պ��:p���c_߉�nsk�ūk�M����4���]K�A{fW��/,�ޠ�j�*�jc�6����Q*�V8?��^�r4�z���~�L'K�����מ�I�!�n�òM�m}�Hw��[<��bCs�G��\.6�E���o�d�wE��}����Hy��UH��o
^uŴqk�w�TV-�T��6I�p�j����T0T�n7L
y���
4 ��$�Mz�B_������܅/�+{)V�$j�$/���Q�ǣ'i��8R��8��[�{Z3]0��Z�r�c��*�x�OS�l��r!�S�a��u^���~h��`�jn�l�S_-�u�����v�}�?����_"�WZ�<诐�t�G2"�[�+��'�8uW|�Fr�a�`��)�Y�v���x:�X���0t2��٪���T_�~`Z�4^\��$�}��ru/s8�b�;�n���pF-�9�'�V��H�op�3�ENj�<Ѧ67����Uݪ��r�_.�u~��Y�����t����t���Ј �N�؞T��'͑��4zf�87�@���Q���݃L�\eK�쪬b(J:$:���
�V2+�j犽�Tx�G���Wh�S!i��Q_�{ԗ���cЩ�i���Y���� ��cܸ�Q3NT���@	<���B�E6E7d��u)R�������\�Fjfk������_[��O�@@�p@@
��S��lme��\�����?��v���~f�ۺA�10�����̐��Z#�[�֕��ݻxw�oR76@�c�PK"92%���#BE�|��?e�z2�},ܻ�`�2�϶�_���_?g��.��쁬z�h���1�ڻ�.��6 ���׈ÿ�Y=�2	�F�"�%��C$�C���"�ň�Q�<�`�cB-�!s|\ņ'���
Y�$q�^�|ޗ�1Ж�V^p<x;0so�nFJ����N�p��[�q��
��O�Rrs��7�w�;�q	9�ZN����e%�%�ó�B����t�f�;o���yіO2��3]��d��c݈6��¼�d]�=%��%V����wRd�cKwu4:���`��6�ꭶ�*8d�E�
a�B����T��ڽ|P]l..{l�"w�n��<�w��6�#u}���b��n�;A��54{7����e�[=VO9�"Y��'޶�9w:4a�5��
/�Jg�y�+n�Ls1_�y����K����}���J4��Κ
�l��M^��*�{Q=ɮ�K�K�Zg��炢����8�3��uD���-}SH�{\
k�����N��ÊNX���U�����%4�h�\��%�� v4��N���²0� ���e����z�S4��54����Fa�]ќ`94�C[4��rB�>�tS�ͿO�,��M5���r1˙/f�E53^�M!��-j��7��x��@ח��:�e`J��T6�ݜK�(��U��~�����l>�AS���k������q�A�W4y¥_�!]qT�ji��]��";��^n�L,3e��jC}�Bz&�w�.R��V��m�>�~x̭�"����d'(���=U�;���X��a�0[�8[ؓc�S�~i��N��qgo����‡PY�z3ػs3̃H$�p�km�~k�ML�@vr!�6�K��z�ͥ?t�-C�"�������r���2!�&�����l�*4�@�*���`*w[X�e	]F
'ݴ����7.����:E�ER��Y돃U�l	v$x�ҏO�~:L+6�$c	1ơ�-�?�?����r���DjU�\��c5��S���}Ej��,&q�AY�l4�^���qc��m�"�}ª��xCr3F���`>J	��/I3B�/@1ܢ��Α8�|F$�R�Gd��˜�qA-���oy��Ln95�P%�P����F��~�J=���f/3�\�X�}��IBs�`��ҏP�xB�JQ���rp,���%��|�v>1��
�~͋����=/�k��8�����A�A7v�D�<C��;/��|�u�f@��1�|H
����6f�t#�������.��‘r~������K��,Vk1.d�@�E�L.sl26��2��^'���!��/-u_��@�
%C$�U�>�|�r����`��=�nR]�)<Ӗ�!l-՝�A��`\W�p��(����I����U�����:T�mt�V�3x�k!����-y��{�3���3�ưİ
BA]����{��]^�����7�n��O�2W��>sB�2z�.(���$��0��6>m1���<{�%����(‘D,T�X�H�Dx�d�Hq�7)�#�}��g���6x_���Y��γ�����#F �;{$xO�H��{����PH���s�b�^�?�󍂑�\T�~C���pPN����p0g%�=�#��cf��NʀD�=��œk��r`�Yc�ť:̖�&_i֏��c���p�>��1��7�8[ߑ�3q��Rl'E		om�g�"4�U�r�R��n8����4�($�p�L��Ǎ��:�&��)��?����'�m:�k�����X�[:�4b;9�I~o}��\`�rkSv���Q�JB������i������ WfAm:�0k[	L��~�`N=<T{�^�E��*��)�
�H*��K�g���XTݳ�t9ygkb�[V��D;:��tpv5�A��f�Pxz�5�f�.4K��{7g�k�zX�2��9d��Xn�O��軗2y++���Zf���zWcx-Cއn~øiR��f�!hڧ���%��R!��.���ޮ��K1�.�?ED�+0�!p���楰Z��,0lp��Ƣ�h���
����O�ƪ����L��F4X��G¹��‘� �HgI�)Jy�;�^}:RSŘG~8a������'�7��蝳iK�bЗq�/QZ�\���Qme��0����G}��{k2 ���ŤzJ��_�v�ܷ�E3:���ĶK`x�7Z���f8�/6��`��s��h_}�Ң�3��;�m֑��O�ʢ˵L��x6øP1���WWM@�b :a�|ń����d���w�$Ur;�YƑ#,�gѶ���$����A�.�}��N�;�Ӑ}W�9l�B�j1�-�j[�ZxH�0��iL7���甞;7�w~���]�ߍ3n-�_��>�s��A���1o�ȱ�T7Į*{�lhE��7�:�3(~�Dͤ�`�{�4Dg��s�5��hS�E��P�LM��GC����e޶q���J�G�~U��lE��i�qŪ���E_&�g9�\C���t��H/	�۟T��� �r�0�v/�f���wFi���,_��2O�" 4�UE>TЬ�6�^	������/�&��A��3�R�17n��tv��ie���'��-~����9��I���iv�1�ЦR+�	���1t&6<���=,�LE-a#�5�%�1��W�8��T׉4	wI��h�l�P�-��6Q�e6-�~��\/�A*���hA�M���q��S��
��3��m�:��v�+tU�	��(��fSv�,�����7
�
�#\�W.X��� �֗��~���ܯ�t�ob����J���7
�	�i��pZ��P�i<
>��ģ��4��y��\���^���3���bc\��#Nu~u�]u6K��o��N�3�ȼ5Q�f����$�3H�qn��I�n뒶�k�r��O��<�^&��RZv��	��/���
�x�k������h� @@�^%��
ٛ�G\�?V���ڷ<���]Q�20xJ��q=��sSK�q�N�\�g
5����Ğ��(,�P���X��>��f�C�;���yr*[�oW��鍳?�{�Kk�|������}�wY�B�h�����z���N
�Ep\��+H��
�+�R������4D2|	��T���`���੩���K���Kp���R0j<�0�(�vd�����'���ʞ\���ңӕ�Y�,�:�NS�G�<�r���9�zL ��hPXX�!�o��sŝ�M��Um`��_Vr/� K<�.T��~��nd%޶�ehV�XI�J#NN�U_�(M���9��,7e�*b
+�"�UF�FK��s��.�T�e]+b+Ф�����k�DaS~�i�d�!@��X�śb=���q1��o�:H����[�c} uA�R>Ա���J��P�P+M���D�1��T��,�YbM�L�ԝqc���Tu�8�ᐖ��["ˠ�X{+��(�G-�LU
K#��V���:lH(z�٬KKӊ����-�P9�/�aby�S�'�˔��8�*��
���@�$��@l��S�4���P�������r�-�W!�9���@�9��_סe�^�ӿ��Fh�k~��Zse�=��Pe��������r��w�lp5Q%�����j�b���Y��2x�'�O�N�0�a�+UFsg�H��H��Am?�a����f�:�W��\���9���rD��US�4Y,�r�?�^��q^r۴>���G�f����
���.��i���D)�%/��C���9�ңo�I��p�튇n}�6��\:�)�c:g��eHF�_��4�_��a�Щ��oj��{A�YZ�S�;M�b��@��6�l��|�esn��o�9��e�0t��kO��|j}1�*a/̊
]�P-=H]5T��g‚$2m��)T�w�Ɠ�s�e��	���5ie��n`K]
���;{8����H8y6h��$p`L�$ :X���,��V�֥�]24���e�@�4g���M`��3n�����JC��͌���xmy�xbka�uc��f��ְ�@k�N�3-;'b�7/E�>c�~��S�{�B�7��=�q͖�=��8a�	�}�e:�u�ޅ&[�g&��i���vc-�Җ�V�F
�LQC��c��V9���R��|��못��3�5�4"�3U�{��)��[8.�ܚ"n}�L7���O]u3!�4}���=��_����_�:��w�|�t���Z�y��y)Il�ʍ��y�C7:��#���j�[B��%����-<�}��w�T���̸�?-�\f�&�B�s��X�!	N �hw6��c���Q}��s^�?G���w�n���7��{H�}߰��,t�m��7��!Nc�>�'	�}�&������(PS�zZJ�[w��||gU1�6���x���m����|�o���\�0�^�]���pg\Wy�����增��N�w~?�ōV,0�?�!����F��E����������
XO�5�o��nm=b2� O(-�fob&�CM�1e""�{k7rz���И2����GKk��zu^
s!
'���m���29B�%�����o���Vmj�~���γ��w���?6=4��CB��wHю}`�w�a�P����Α51҉s2<��s԰
`N�bo���
��C��a5]_�(CʾJ}��
�w6<�����V�����ov���6�–���w��F��T��W��c�T���s�o�D��j2�ߓC�끏ľ�K
2�n�q6���{��o�?H#����j�Ӄ�O(^'�H	�o
�o�����o�H�{|=�����ݏ/�o\AE����0��!�2��H��7�s�~r`�h�&:h�څ-R+Jj�i����R�$�I�6��խ�$U����
��n�K�^�K�tw�(�ٖ���C;r�QQ�ޣA���L��QnV�#؇�-���]���:�6t2�hoCq�`�zQ�����o��)�+~�"���E��|\�},
7�r�izD��ō'��!+x��&��CH:�"�;��[��?����%A���FF�%�Q�ib�W����({�
*�q����d����T��`�߄�?o�BI���N����Q��xd��u3���T�[�RS�s-h�2p U1U^O��re�0�/v�i�c�׃�M����ְ�F|�T���yj�4�V�~R+t�96.���%�3�=H�ID��`��+w/��ſۈ�h��D��OS:h W�GC�i1ؖID����8��T�z�￱��������u�W�<Ѩm��O�E.F�������$��f�db���@�|�F�*�d����v=3��	oܓC��+˫W�Y��.8�2Q�[q����	�&����.���~�oj㽼<�$�I`'�h��cO�kEy1*v/���E�0k�礓�{v��ߨ0Y�?dOu8c�K��HY
��Pc�/��+M'�%E�Y���(T�Rf-3Y뜴\3!�A���L@�	��W������z�xℨ*�C�G��2Q����[�,�-fI�[�5il�F&�k�{�o��z'�T���=!w�d�B�ʧғն:���d
$��.��H���J�����ږ���4�5ƥe�7�)k�q�����m�2��O��L��;��
����Qԧp���\/����ȕe��=S�t��u��F#鯠1	F���
�U+՚�UƉ�"�C�Z��pM���dgI��q�:��t8&��m��b�m��;��r�K9�'8dڶ�k��ڠO�-��*�8�a(Qt6�D"���m��?Ṉ7䷭�V&�]���V��;S�|y��h]��u�U%!�{�E1�or�Q�]��5�i9a�@���XK��vm�p��!r���
�]�j?!�3x�|�%L'T�l��N�L�r�w���AJCY�mjY	G̩��OM9��[�k��x�(KP׮���z�V}hZ~&ּ�/Y�XN �w��U�[ǖI�8�-*����ˤ�;�h�5��L(��S:�ZP��F��A�9����ք���wE���Į0h̚
����[-H*<rw�f�H���C�����UO/-�<5���2��G翵�n�n����n���]+>n]���٬-j5N���ix95q	�t�m��Q��&�[݄�Q_ӟ��U�4�X���I(�E���P��B�e���koq�T8`o��q�9���~u��a��9*�s��D�]Dq�ͮ?�����;�vB`�����Ʒ��(�����{�ƈ�
��>�J���!��pw��cF�M�h23d�~ �š_"�¯J�T�37������R҅�^��+G H��#��O�5G�ss
s�בN��8�1�@p�_�2rDr���(��g,f�b�r��H��b�n����ة�
p��1�1j�C�1���0	��sJ�d�}p4n!�2��nT��(Ռ�����O�?(�f�5�'�kc�J�CNRNq���l���Iz$y��{ ���^��xs���̴�c(��`�E"����R������1�U$�J�@I�̾�c̒Q��X$�T�TGPIO6
gěC
D
��� ���='4����[���mڬ��1���^;jl��k(mW����.v�06юw�2
���6s��f�3��v��:���:��]͕����Fp8�K���RWA��C�JA�F�"X���3oTs��;o��b5>�\�glv>��h>+�>L�c�(�+-��%dq9t�:H���]50��d�	��$rO��Ј�z�����=E�(��$1�Ԙ��$�Ԑ����w�ҭI�h�m�m��m۶m۶m۶�7m��Wպ����S���5c�xV����ʄz_��s�Ӝ�Y`���x�"���5"���%
ư�x}e��t�Зf��%��f���ug�>Z�,6�A�C��+��=��Ip��M1���)gb�s<@;�Dm~\m�;�:g:C��U��b���B�^de�wy	�A0*�Y���I ֓&ԙ�Di��F3�_�!jKZ�+��&uǺ|p�W��En⎑�H�b[x:�U4�#3��0����~9z�
k{�Sj3�2��.aZQ����o��R#ڊ�&{` բRQ�w�F+���q�����u�I�
٘�U�'�a�fRƞ�%�/=�
�t�f��� 3�H�|�� ?F8��R�Ņ����k=��N���W��{��7{�O�4�;���t���}J��0~꨻D����e&y��6�ӞiǑv8�W%�z:c�K`|�VĦ�@N�H���Yq����y�����! �GC��#�8����?l��FT��8�7=�c��(ȉ+J�}|�7�Mi8�8��'��'�ݥ�m����nu�N�����.lm�k��wfR��]�;V�SڲΙn�^^nY�آ]��2��!9��rgZ�êh�OU2�G�.��Q���X&M���mG�6"]K���q:M��j���9Q�qr�bÊA��鼃I?����*'�aV�����F0�o`��K
�"y��v�",g���=r9���o�I��(fwPs(|��wW�#��Vb����]a>;���Hz�Urru��;�h;��I�RԹtm�}#z�C��Tm�{3�L_�d3�P��ڔ!,`�D��)�8*I<���%6�"8l�g)P���w������Pm��d�J2˹�s����$�&�|	!���sK�@M����r^kV��Rh;�+%^-oZ�v1uZOoi�$HW����C�j�Z����0��1L�2r3oܵ)����N�/w)�*��az,�*��\VM�W���.���դ勥勎�0�9��Lv�n92�(>�3�7���3�|�3p  3  �Qτ���_���M����t�#c���E��S�)��P"Jl		������ԍ�WY�muat7Z�_�K�A�gŊ	��S��p�P�Oo#�G�ۜc���"�����Ӷ>�۟�gj �Pg}�@iT�t�! S�zg�"����Bm�\�ܰ���uE�#��!e���y�n��Bw]:$����^D�R�m���D=��3w�1#Go�1��J����}��W��]��o���\§��l.{,z��Sv�\��XK��*��N)7�٩��(!��g�j�U�Kw����Ӯ�t�������$�sy{�zh�\3L�~���TIv#o��=H�9S�8�B����ZQ'��U�5�<��S�<">�,���s\��R��v�코us:���X�����Fm�=��H ��A�O��MVK77-;`�4a�^�P/�$�+j�@{|M�7A��A��	���M�r`O�|��؁���zݑ&nr�e�NšhY[m+>�CЉ�j!���t�>(�A�%$�Q���R�ً���~��!#��M�8�s�X�_�wP����)%�"��A`���r0:U*V����<�qFF�
�hi�?)�dgl),�3�
�-�FaR�)	_e�~I�G�~ɭ<M�q5��r�"�p��Q3;Jq�mÕ16���$$+WAy43gg�@~8V;V���c�ix�@�҄��%@��wj?��=��
�u���7���r��	.��V���쫿O�H6��Ndy�xR�r6�_��z'��|G��l�Z�	�G�b>�n�j�͕����_�9��n�/�=��ie����"�#����Ʃ[:�����]�T��P��t�xw���R�
�#vN�.2@O��#{���'�7A�J�����ȧ��2�Y��Q���P�E�)�)�(�n/��z*]��Y�a�$[��%�Ɂ�A�cl5&A�A�Wa���#UU$�`;�'���!
��OD��+k=ɜI�Jy�����C�t�H�N�A�j��z3'�c�'���lC�q4��&y'ߥu[&��X�<�|=a���}��:x�&'q����2��ڎ^F������ȤY����_��H+��7��̆�DNQ��
Rm^7@`�&ib����UoXe�'�'�S�N��=?��`�����#��=�5�r�g�/J.a��z���-��'�ƫ�u�~*�r�s�JX�u�KF�(�p��0�.��>"�7��e��u^-֊��:[���X�ny�3
�}���
E�c��/J�B@�P;�v,7d
��~��03��������U�B�{��k�J��/�M�?a�K���|A] �"�Ro���m|_�.2���"��0w����oa�Y�G�o^�0:>oPn	��e��
;��7ճu4���[>#�mu~��>���"���bAv�a�y:����5�B z�:�u)�S�����r�ݩN��I�EɈ/j�;d� ��L��|�+`͖��3S��aO�u^�^?{���T�/����Yܡ���J;-�t�Z���StI��m��������G+�[ݠ�b
�Z�m����i���0wְ����w����|�>�1�#��a6��ܟ;t~
�c��̇>�q�h~�u�f��~�}��˞�EFW��)��j�?�*:�յP��cR���x&�㘵2yj_���K�~��j���LXW�j9��4�
�����Q������K��n3ň���ӭ��*��N����kn�Ϡ�g�j'ͲR�"��J�f環�I��\բ��9����R����:�CV������&���n8�X���E
<(9�H���թ�6��P#
p�(�(��(͌̍2��R芩�
dm�ͽ³;?(uf������<��N�LI6�@�z�S=����s~�]�!�)#e�E�#
��l0��ASc�Qk��>6(0�jOAӳ��\P�c�%��� wRF��i1�1�s����U�t�$S���5��.�%c��=����c�/�E�ypF��L�S {��X�^79�YHF#g��V����S�m��:�0�]�Q#��p
&5t��tؑ�q=�w}\��q=�010&�C��@��4U����ӵa�l��6ֿ⡺�aڕ7r˵�n}��`�_� �w�-Z�۝�ߊ�|z�ox4��m�ٺ�`hWck�߫�P!\f�~�G��uZk�75��*r�����ȿ�@9g�nEnˢD#�Rz��d���X1�ʥ�=޿Kk@8�@��C��7�3�,���U?�o�N$Ѱ�Y����Wv�	��gdh*���Jr�1ٍ_��Ȫ1,ҽ�D�W�7b�Mn�`��f�Qn�?Q�c-�45�3Efm��f�0%3J]g�)�j�m��w�1-�$�%�r~X��_���
I�����˟�h+E��5���1ܘ`q�a�\K��+R�L����v�땗��p?�s�]>u�a�����|?�ݿ; p��p<a0���rN!=�Zhu�.8�V����KG�r+�F�3VA8B������`���c^-��/��8�H�g�͓p�c�'#f�^o�4�wL��`u����ٵ��0���	���lwBݣ�8� �L�r�Γ�~V���Z��X�5i���|���& �C�?G��l�fe%���1xu��g�����ӣ�T�e��I�e�YS	�3��	�hX��fX��Ɛ���f���b��E���I�tɺ�}�����z+�4�M��0�oZ��B�1�������-H�h��`�[�쀤f#��G՞;!�[٭�?��4�s�����]���@T?A�{	1!��i
�Jv��u�{aj����#�+2�-��t����j�05�4�^�6�*�b���av��9l�';��6��
֣4�_���~���+�s#!�f���4�k�&!}��;�b�
�`$g�u��攮Y�z-Ϊ��q��nE�� ���4��q�ZI�>a��o�_���$����%r��j�W]mQ���V�G�n��T	�
�+Qh�=��%�<Y}�)�6
���[�&��%�B�<�W�a�����5��ĄiY�tt�_�eZF���:�F�O��0E�1z�{o�*������7�����
�	���n�iߨƑ6���H_��
�˃�Ȱ	�^��M�j��D�ID=�.m�Kݱr0�B��]Sz�k����S��.d�2o�L1�?\]Q5{C]� 4�8=�*6_4��]u=0/�!��`���@��2p!!5D�[�{�J���uˮ�W�s��K�7��uZe��S�=���z��ւ�/��{^�8��~�M���(ƾ��7Ωs�7�kwȪ�{���:{��Q��I��G�o�w^�7��p7�)�C�O(���{����J"�p�K�X��Eڪ�:���NU
�f�X5��_<3�rLZ��C����J���1��_[�ƭ+�-$��|������P����'S�H^}.Ci7{�A%r�~��:�;���V�X���듊~�y�%�����Y�J0 �NX  ���J���f���,6��6���H`�8t���`�麿�#'Ir�A:2�)ڽ;�VJ�H)�D���!��i�k�%�����X���ewo�c��^�j�ߺ�G	�Y���a7�����p����Pt����rԤ���]m�]�v����ܠ7�v�?AH��Du�r昡����;����A�?���X��1�8�|<0c��P�^TqU��Q�z$Fxt��f�ܟ�;s.#3!)r��Z��IT�9ƻ�H�tR�4��q04�4��F,&��,p	x��W�,ɯ0[�l$J�hE�&o�iIs!��T�#:�?���PA�
�~�7�g��C��4JT���h�G���x1�]�����=u�����>�*T��U,?`+�
�w�JKmZeY&0-�U]���r2�0ј}��9Kx�34�;�A�*����m�Y_�zni،n�K
�2*&��߸(�i��8�S�)'��d�U��&�
6����dRRdρ�֒�,��
�[��!5�&�2�#ʽ�+���ZUl��؟��8
"�S���U/ӯj��]�)3���Y����p�@_�����]��?�T̈́8�.l�����G�GU��W,����E�B�As�Q�pX�ZA�䋇B�p�Uj.Ƙ�v~������|)�	��HT����W����y�wh����m�u���s)��n�f`����Q�
�	���.���9q�憮Qc��f�UOs��������{�0`�s.Uwe�d���w�$�Ss��p6>Ԗ�[Q˶ʌ69�|�D���oV=�(`�)��KdOځ}/�+`_�J�
�Oy�,����)z7�f0P�)Ă1���KBT:-3�^6��0y�yj��
tP��;z{����$�~
$9�q����l	�P\/�T7��S]�IW˔ʪR�m�"]��
*�eZ���4�}�!��Q�766�P��Ph6�yN�::>��s�z0�n[��-���o��_��
x���SG�~K
����]���i���#5*������.�u�u��odi�+�T}V�h�q{��݄�q�F���g#f�ۉ&����x�HS�}��H�X�6;�B�w�.��=4���bz��_�x�����b������au4��l������{�[��B��?����1�f#���g��A����|�IvN`Z�)�CN�+ОT��P��Z�kSS�u�2�׫O�>�gl�*6}�pYx*�&!�g'op\w�c�vH���(}�9?��ä��Z}C!h��>�U��� <�aoXy�jQQF�Mqս�(��i��4
�5�ꆼم6����b�Wٿ�{�e]E)���@�.=O�T�����W��o���hdN|�~�	�������#�g�\�T�A}!��%kgl"�@��u�e���Cv.Ѵ�bJ?�b�a�^lxV�j������ٹ�T<#��xd|=�NG���Y��B9�F6_Z��y旿6r\���$��"��F�3�q�v�������Pd;L ���u��o'��7&�N0�[�� �M!u%�iP:�K�7[��'^�������!�7�^�5W/Ֆ́�6���=��C_,��7sp�8#�c��Th�QqXЛ+b�ɻ8b��:�^�>�A�d.��?�E��-7���gl	�i�Wz�!�p�Ձ�p�֤�9�L��H���Bn�*Iw����w����1�3�f��ai���j��g+%5��=�I)���z�/L����aU���
!#I�&8�:9�������oNlK܊֑�iA�L�4�ѩTnBұ�k$l����#�[�kMnk�V�be:e80�U�0��b�C���x[��%7�n�"��;)F}g��K+m"�5�&|��TI+�mbe9��R0��i���s�i.z�qTC��R#�!��i6Σ�Dby����7�=N���&%��HHV��S"1�TbF9�X�:�XYu<�ل'���l6���Ҥ,z9:�?Sl"F(Ԛ�����:���e���|G�P1Y�B�iKL���3<y:d,k4�%&���Y�*�����]J����  �`�#�:�J�^���$5(��7�4^&ץ�Ty���ؗˬ8
9>���-n�Յ�$���H����dž�t}b�q���h)�E]�-����o�8�]D��d��,�z�|�6��a�qwF �M4��%�
K	�Z?lƎ'�+���98Q����s�ow����cp����~���=)ȩ‚���&f��;��y��>���>OQ���J}��/�;Z���~$�'���2�3o#qb�)�s���|�{T�K$9�k<k��>W�fD%�@5�e���*J������1#ˑ�p"�h
94�&����NX��dbq,nH��Od����w��6����;�_?[N�֟:�*�����d\jz��LC�9Ƙ�51۪8\�CֶLJ��6�-c�b�/ީ�0x����L+�����6�Uǚ6��F����+�H�g�W�s�u(��܅6Ce�U�������PL�`���L4����آ�HK�{�q���������
��R<BO,וy,P�.�"��F��^J���Q:���~ˮ�H[%���M��#C�/���N�Uq5�� �ГS�`��{o~�,f�o�B�a���7[g|:��3��[v�Th��:��s�#�}�u�~�33$�Z_���ͤy��W���~�3�ӛ����ac�og�w��Y�z0��v(��/�#Wg}P��K{DL@�P1iECx��z@N.�Wv�	��Jke��Z���B�M]z��'���A���g{������]�*JXԁ1��F��]��d�؝au�� -��M��̨�٢������u���/�sEN�{#K� �����Wк��pf�i+\p���Ƿ�5�����3�;1c�~�������1��8��(�?,vAԣ �R�ұ���"������aQ�q5�w��n
��q��8�	���E�g��
�����M�������y�Y'ǭ,YG���>�0�S,�
~�1:�oќ� n�3��*��tl"�N/@���U[$��ڕr�t�n���L��?���*���~j�����[��^ޑ1�pzc��{�,a��J��5I��|�2-D]`�"z�:��2����1�h�<��{l�Gп�~9�}��è��;�8lz���.�'ޑ�JU�ޡe�(7;�%�NCN���?o
��B�/��b�nU^l1D$:@��]4S1��XB�%!�1]�T�!����-bI:�И���Kog�򥦸KzMP�
�u�&�0WY��.�������0�[(��bR.zm�d޶�����������0�c�A��^���(ᘠ��^	�֣�ÄZDn�D�j�P��F��CSI5J��u1n4�؋�9���}��R��U��Ŷ�-��"�2�۝s�u�u��p���\�-8�(�	��tƉ5�	��GSo�<��u��=�Bq`�-�j;���v�_��,��޺�������+AC��HHH��/D3�p؝��[��١3���f�C
5�7���Z�
-Cu�K[�+�W%5�D��JZ�.ע�`q��a�^6X�����F��9�t��~��=lOP���&k)�<Nj��v;Wc$������G�.�]=�vL��|�p�+�LY2j�?h���#�Ul+j��	�N������%��%��5K�ߦ��%*�q��җS��0������ߌ���%������� �dk2���B�Y���7�Q6���z��o�vt��yN��º�eՌyKE&�/I�ƧK�d$��d��.$g+K��������!H2U�t�/��u�Mu��f+P�x�k���o�F�����q��2�b~��H�phU��r��l����?��*1Y���JM�GPm���:��G�ś��10��G�y(�?�'���v�/�(�<%��*���\g��0b��+� Q�Z����B�N�\g
ƛS��M(T7Ȓ{pCJR� :W�u؈��h�Ϋ�D�e�1�gd�[hm��m�:���Spa���jW7�T�2��-��hM�\�0�OSK�`{���
�)15=qٟ����p���@��Ӆw�[�>�t�E�cĐ����j���gS�CҖ�B�Sl2�8�Ee;����N��e�J3����-�~:��P�;���L���[�Y�`lr�S�γ�R�f��RPť8�ҫ��[I�^�UnxfH֟5V=׬2�WLb��ne�
:��B�W)�b*qNԉ�e�n��G��w��pC�����g�a�D���-L��R��>dZ͌F��+
�f#��
>a�ا�9�������D6�]B\�0���CX���p �j
^�r/�,���؂��ur��c�߽7qn��G�$�l�'<`I�p�5hގX�R���t�;��7�[_����2QQ<��U��o����	x�O]S!l蠉39�� r�~	�>U9M�p��
��S��[6&4LB���ǹ#�2�f�k8+�0�Ɵ|"���R$/�f�M��[�>A�^��^���;��[��[4�}�d-~���v�~��9w�>y�����v>D�J����gJ��6��i��!�����T�X`�S›�'ʍ�Y����}w2�s[��wyA_���WR����3F�;8���r��5��ԔU0lNNb#S��ڄ
�)4�y�@b�U&ᅅ�ak3�/��05��y���2�в���Ԩ�<#8kHS��yN�z�43�ǤP�E�����}��u��|Z�aBT#0�ˍ�D�ׁ"�G��A�P��%�=9pԃ�P=W����qM�P�����q�X���9zH�)X��R������c��c.�KՇ��� ��P�����>VD��|�#��)l���I
̅Z�D���
S��p�T���6M�3�+$���
�����me�h�^kK��(��PY(_��Ӫ�8��X=�z��&5�׋J��;B#\��`�����mN��ᬢb�������A��.ƞ��B�k���wY.Z���g����e+b���I(�o2�
�B:�J�}%�qa<K�)R���(�
��z��@K�O�\���2�o���-%���[��<n�F�M� lB�c��`�J�ԼH�h���L�|�
I#��t�Y�����Ç�I�Η���I�PQ�ʒ����Pu��%�>���k�2�����WҰ%DL�T3�V�\�Kq���������p���Z�\|�b@��#N�������A��v;���c��T�`�7ijd�����V����8�+�t��@�n�c�͸���8f����%��NUv�����1�涉8�;����E)<[��D���)�
�bQ<-����0�kg諷�]c`�=�fC��dz�/`֛��!Uw'�T��T�nt�ў�Ҳ۔�D�lU+rYۥ�x]��~3;V��y�
�+���:pn��ȇ,b�R̫Ad_�;']PW^�H\*>��G��5E�.��`�Ƞ^��ϩPl���Q>z�
�@ה�@7#%;�ڄv���W�lX��	�h��׿�f�|`�-�rS�r��J�)�k���;K��5���(�fB|�Sm�p�q�D���bb���)�����I~�LcL�2G�ۿ���S�$8u���hZ򯢙��,�#���t֬eg�0~C��)]�bjAr�T}lѦ�j��.C̥�f�; ��
jG�*q��S��~�U�������m�b�̺����n��by����q���r��v��/aS���PHZ���)��'@K�:�3��kT[�b���p�h�,�U�����k�j�P&P#O�-�bҰ�R�(I�ZZ�=��r\}}��4]A˧�V�kK0��4m��yQ[Ĥ̖�S����j�o�����~�B3����3\�H�(
��|�{m�����41�)W��}ʼ�h�R���<�?���ϑ���X®���ܟ5���.Z{k�7۰���6J��y
�� ,če���\j�)s��;��&����z�����=��q�M�m���=����HՍ�·��tגf7l�M�
�-q3D��/�A���%�R�
��۸�9Y�k�T@�Ɉ=�e�4�vl���vʄ,�Z 5,ᕂ�pfh�uy9f�t�-��K_;�^,���)�i�}�?��~��gɇ���F������zxg�`���,�������m�*�ĄOi�jHXt	r�*
��3�pL&щ�$���D����Ie<B��@@A�O҂x���b��D}"��[s�����m�lڴ�p ׁ�cs�hc�As]�G�+y���������MΚ��Ѧk�&;x|��VH�[�?�����j�DW�p�!�K8Wy�<�M�{\�z�ե�q�V�~�6,�1�z�&��tM�e}���z}�O���i}����:��ނ���k�l���ރ���%��%�G�O���J����!�I���‡̇C�p":Sċ���$�ھL5s������
���i���/m�v>�|u�P���@B�
�f'Sf8l�yT�
�2H��Bu��b|_Κ�)���4��T�uc�*�tk)U�0SX��ƴ�lP�Z��U�LQQEj���+?D���]�"}IZss ܗr�خ���~#c�Kji:���1a���A8���AgljPf`.��F!���K]mZ�"-%���ؘ���3,���-�h
tJÈ)N�R0����0��S�&m%�6MFk�g�W<�a��*!�~=�P�@�OaJ�O�,1Ą>��b�����B��ME�i"f���_ylv�D!+����8,�a���[��Thz�����H40U�`�Gx)��f<h6c�%��=�y��gW���X�,88�c��*��
i��6@WLI�"LL�LE�,P��4R�g‹��y�%ɫAe���N�jrW���$dS8���m����tJ[r�5��]�����܈a�!g)\P-#������$`U]�h.x��T�H���<��,�P������nE��Sſ?W�6�;Z�9�%�y&K��0�7�c�\6�ӵ��CN�k"=$-�HiJ/�IJ�\��ób,��}"�a�!���V�}#��8�p�riU��V�W���v�.H@���h�u.��pot�v���Pntm���w�����p���T-2�����}�j���h
�h��Q�/�?r}S�jhcz�<�O|��9�O��̺�o�ɠ8�XҚ��;�C� �&pN��ٜt�T�f�#P�E�X�	�4
��=�Ņ�G$h��
R��=���ɒM�QF���meE��'Ik6���!�������}�uೣ^.�3�{� ?���a�~Xom4�AA��^J��U�EKS�ؖR�,ٟ�/pc�u�۳Z�t.#LԔ�QT��	��U�p���>1�X�)]��Sɜ�����Q��*��6�v<��
��:����'��
3I�w�YK��,]j=�/�������2��ؔ�!��iXA�ފg�޿CK��"�ZY��&$2��B��+&6�Ӆ�>x�jG��}i����`1�v�Q�J(�=�f�FH
��p�VgꚈFH�_�Z�6\0���abV
��������8)C��G�ut�V��Xj>v՘0w���:Y2N��r�+��f�55�����NИ�a#7��.O���sֵp�4�R"ނ�2_dx�
�
�\+u�.t�o�*�l���s��:��i�X��g�����RH�WX�޴��I�Ҽ=�0��U��Ki,���f��,9��1?&i0%dW�2�	-�Kq��mpNo�8�p��I��4��JO�g"
8�惠�lF�
�o���A��6��/�|�ߪ��gs\���“�9�0�����by�#R����c�~�ژ���#�>G�6��[K���!S�~ʎv������qގ�萰�8�
8��-T�ŝ���b>0�P�p.�,�>6j
|�eYW�_U~al����ei�
�[4m��@�Jyd��s�������wD�wY�Kt�T�����+�A.�#"T@8��F�T�;�p��rq����}��S*�u���f���Tn�����2��V��ׅ�u;2�i�<4p-����e�S�U�X
���<�K>���u>�u��s;��h�wݻP�W��o0�g2_(!�l��龄w"�r�;4��8Ot�q���]����ڰ�pY{N�ro�f�<v�/gؽ��x#c��e��:�p�t���`/�Aiy}�s�j���=��Czh[����j��_׈f����\x��z0�u�7J�U�׺ԉdz!��6�O���
�+�R�ӎ�0���/ϧ���%����;-�=.߭�Xո$�!��X�q�?Ɇq��(��ds<���[ܸyê:���P���)����!��CE�P]�~qݪtU���������j\�|�*A�LiO���W\9��2�՗�׻�e�RC �c�ӔRaͰt��s�ۉ#u��X�"��B&���(���\L�F�-A!*n�����jEL�ަ�T!r;�T棿�K���+��~D��r��$�ϗ��Y2C�t�d^֜:�ʦ|Mՠ��Y��u�'
����V��A�֠�Kn"k�2�bɎ�Ҷ�+��
IA���r���QG9���4d���|�}�2�r�q`�̄��b~�0�$���u�G|��H(e��/��"�����/��Ϸ2̀-�H�~b'&W��l���"����:�T�J�\��{�����XJ����y~ g�T�����S���?F��9�����^ٚ6�"�#;"B��e�((��1�� ��_3o�ں�X���omn*u�����R����լl�z�(oiV�6��em��6F�����~��z�y�|��~�Fu���@���a��jϔY�~.FykO��B�z*�_b>P�Ԟ.���^�|�u�Q�z2³3��zw�Թ�SV�a��F���^�ج���Q��DM��ݺ�9��C��UՅ�wL��R���=8n��V�=�e�R�����M���S���俿@C�pW!��W�Ǽ�k�$w�KL+S�9�B�k�?�vǧ���o,OC��w8Rឲ�gtwYtj���!5��K3�
�]��vK��M�S�n0%m1*ëj�.7�n���ު�ȌܸpY�3��Ak����c�G�Bg˾�c*+��Ծ`*|Xj�J8���StyZO����z(��]�{�?6Z��5˾)/8�g%*m��?��$��C�);֚�Tĺ�e1��,�~��J��>񃗿u��t���������i"J�0F�ż-y��X����Gu��˹A��Q�̬E
s'
kUB���#���O<w&�NI׉��9��\����
�����U��0TD�޺���W����z��6L�=\Mq��^?�Ĕ�!1�7�A�e�?�M���;�\ݪ�;���E��3WB.�/������IV����a�^أ*�ɈP&�"H�@��y:;S��BUA4҅wܠy:�ĘGg���	;Ɨؐ�.���Q��M1�=�`�1�㐬(��:��A�$O��,+(y�D
w"�!f���ǻY�z ��i�Q��Z�V���ZR�0=��~"%1L�Q�C���]���j	�r0�3
'�^�y<�r����}Ӯ��K���b[�Rj���7�%0��Fl�c��'R��L��
g�,~\#,cc�5;^�Z:z�<:jM��ͽ������o����G����HȊ�PxW_�[�$z�ǤrgX��B=d%�����HeR^E	Mwh�-�LY!��L��Lt�(S�-�%������VD#�\�#vm`��7���Xw�e�lmx0`1���傐x���I0*��8f�Z�I(�ͽ�ʨ�|�X��+ݑ.,iYIGu�"풢��7�+�>�l�|��Q�p~��&%��l��ҍ
=dm�6(��d\��.�V�����*���&q*�jY	Wn�n����5��:�v�"��͢Pq~5B<MӶ>i��3���l^�
ʢ���i���N[��DZNf��]�����3I���ނ�l���[�������)b�Y�@�4����=��sf�1�u��)��H�V85K����+$O��;a�	c�^�k0,�V�.�����,J�d��fO���x�r�D��B����9�3��M��G\ZZ��C��h<p���,I�2b��傁ʮ��~
y����ش��	�;|�S=7,�N%x52�6����\��)�aJ��{�T��<��#�%[���Y����3�iČ%i���Bdک}B�;J�z���V�f�ta��-����b�Sj�O,��|�:LȘ'��)!��fd����`�s��xtJA��+��{"M�p�T�ϼ���25�8d�+�6�	�|a�sϞ�N{�6���o�����njx>۵��$9,�,NB�
�PN)i�d�!g��b��s�&
���W�vH�SC.]s�� {���	�����,^���9�@\M���"0��Mh�NXw�u`׋j���;d��ev=�$]9��kA�P�.����Is�_�+��Q���Q	8�˻w�%]?P���-��Cj����j�~'�	8Յ�s<�G/w���������t�J���߶XB�����j��/M�t��(S��)����=�M�=�Sx���vD�8��~�)����o�tSf�+Y�{i�y,`�@KV�9��)����(:jA
�h=��_�i�o��F�$I=��@�S\�q����v�-?�%>
�^ۨ����af=A�I/�.^��cӀ�^^�G�n	�z� �9�&������2�"~l8E�0]H�f�VZ��)�~�2cLt�����`	.�5mKw�Y��������|l~�l���1�>x���Je��z��įj�ڭ�x9����ãi.���ژ���-��I/��+	-<��a�Y�`fk��LH�,zq��wY2;b�٣�y�X�;V2ƦY�!���$���.�!|\�;<7j�g�g<�6��N���FJ��mUwﱭ4�!ę��DQs-���N�r���C�/�8�!���w���O�#V�1�le�1��%���(Q�ҺG�x��L4�8�%�<O�������@��D�����v��p��_�zF��x��^�k��j����Ro�O����c�:Ec(�s��9��j=�c녘
��¢����8&��v\�ȗ��[�ֲ��c��`c�.�G��}�S\&"#��#QS��b����A�:�%��;k�	U�=?TӴ.]�;JY<��	�̲[~��ɞg��Ӊݙ�)��lT��cq�'J�+ŋ����L���>0�G�ͿЇ����
1E����.D(O��w�bM�Ϛ,�|dC���d�W:$���8�Ҙ�g�'��AGʇ�2�d[����
�z�r���^���_�ڔ*�ӣ���~�R4�$*�|
GY�P�9\j�o�Khi?R�@��쥛���0�����l|��X풺n�+�4�/��;��+C�hXp"9bi�y$�Q*�qq)O���N"���;kS��v�T9�h-~����NёpדV�x-��)�VnI�4`��]صl{QJ�]�`�z3�g(� /�`M�d�ӤE���4�?��c�fM�-Z]���m�vU���l�]��e��m۶���~g߳�~�����~�1c�9׈92#gf3����Y�Wɺ�o/�b�1��)2�%>w_�.����Hi?ūCZH�'�E+'�4��m�X�XU�y�iL������d��겖i�/*���3��bx��  �(���N���P�+m���jo�j�ߝ�d�,���lg�-�0�����p�%!
ҔC�8���I����p�jyTQޛ���R���}zb���n���`^��_��c��9H�7�;[+���~I~Y�R
����S-�D�c�.�����:;9���2z�Gr��������v�#��q�ռF+z��Z�u{��yDܷĕ��*>�k\�N��c�j
��9��1�ފ���
0.����o��CG�[O.��(C~Iv��;�w�V��.�,��<^�!�6��fO���F����*0�֫��fC��K�#���x�'�`[o��~?���\yښ\�@2������q��Bo�ثH#.j��]d�|���eO�<�Wۿ�ZPd/V���� b,��DGL�þl(Z5�jz#�jI�:A�ų��Y
���Z���<��HCL���m�[*��:������(�Q�	�EV��O�@��1ȀnO��z�i*H���p�
���8��e���N
e��oy�w#�kJ���#���L`�#i�2O�ǎy8|��أ=]������1fb�+����A#U4�^�6��sUV�]9�[0���G@�/��n�FB�����N���O�QP���1.�LI<���C���3䰯� �T���L*ing1]}*�B��˨��Ė�v:�Wš�l���U� `6} 1y�J�1�U�m��Mj��9�x��'�jA��C;`{��<bA���4动_���H	�_-7|�=s�َ�8cZ�(ݣ_�٣��Xx�	5���C�Y���*Y3���K[�k�:ĕ��L�
N�D��m�ղ�y��:#-f�C�^�!�`9�P5��@r4�����?�g�E�d��h^ȖoU>��Wn��1=�\�~��F��Bn
-�B
��[V�Nc:a�7�8��!k�Dp�<�F=pz���Z[����$(>
���+9JT�Ƅ��#X���"�`r|��W�U���B\h��=^˧��b�Z�����ޝ�t49����M��� ��CN);�0j�Ԑm������5�0X�X�%�5c�ʿ��oo���V_��SWd:��77˶�~���x�q6A����v���>q
�6�ָ^�t�똅Lv�ј�?Qm	��pSwq��x$�hb94h�(���ia0p
�r�
��V�~�z[��e�|*r~�cd ���}���E��+����v^��{�0S݋z�J��^|}���[J|0�yc2m�=��D�^�^F�tǗ��Qޖ�ʑ��?A6��d�b����j�O{�����z���{{~y�W��''���o�^���IJl�'{_Qķg��t�@$�F�W���5���G׾`��bpJ3���$�t��_'"-�C�����W[�5���C�����i�gQ˙>�QJQ(��i���%�uu,�W�)-��djVq��!�ܘK��)�{�Gߪ��1��$x��Y�����-��L��2�쯺�K͓B�xx/�fE^�Z��o�����Q�e���e�*�=�f�]v9����M��6@�*7�8��ޭ�[���|}���u!�-{d�~�A����j�"ۏ|�`k��tb@�‡��5.&�"ɸ�뉥3�o+�ZlR�iA�$��Hג���iűxE^�_��6�����k��i6��~p�㸩��"�Ғ���Uq��۹7W]�Z"�$�G9%f�Oa�N��2v'���W���:k��Y�1�Z�1c?��2�C�˺k������{R̰��t�j,��]G�U-���h���w�Q�|�'��no���z�r+<��w^xS�qn�͢���V�rwk`ĠM	$Pea��6:��30|�=1b��+���5�;?�p����\DM&�N3e4&5��9Q�x"7��V��(KnKD��A���MP��P�'�CS�Ca5LP�y�;���%����y2-yJL���BrP�C�;�H�ɉ���@Ʊ��}��3:$9G&&η2m�ћ�wA��
%�NI�Έ�݃��K�q�`/���Eo�&�sd?��(�������]�8=���N������`���L�Q۰G7����6c�.֡��ttѡk2@4��.�chkӗ�m8��q��Iw	�Y,bx��Y�X��yD��0����?�a>��.��vH%MM�����O߸w���}d�v䏭�B�"H�9$��=� ��Ɋq�A/9z�
|pdF��17R�>)�`�-�#"�<J�Eݷ��k�e��	Ѣ��Pbq>t�3Z�gZ��Š���8����vd�/��ZV��
��i��.�U�g�x3b��:�:
�s5�g����6T2��̅���%G����_������Z�t��U-i'2b��3�%�'�F���R�	��|fh��F�P�Z$Cڴ⭗��G.�"�Ǘ���'s�XZ�i�ˉgNB�ȉ��_��4q����Sg��Xl�:�v���i06�&׍fy"�k'�Y��U�?w�^)�R
����!�̰�BII����h�>瀍�ғG�����$gD�h�ƊK;�-:&��4�wlQ����# ven
O��8&�b=>��r=�^�3�D���0�P��W�B�GW�P)�7��۪��`p쵼~����iͤ�i8H����׺)@]��M=������qZ�#�T�Fe/��N;�3h�]`��6�oDlᨁ�\�H%O�'�iٕJf6U���ڿCD�yv�aJ{n�;W�b-�k�o��8����.�g��ݫyw�6-!�G����}1H80v�_��=%GI,9$�=����t��ޥ�q���H�\�]iO���3+���K,��|��@�2��q�޲����~�3��:m��k��6]��{eޙ��n�*{n~MD�(N��˶oc�XfW�[�$�`���75���Z�2�J����0�M��H���2'�I^�``?l',�6�7ɞA;ԧ>�_�R%����#�\�靵>TNdkJ{�񱒱|m�?Ե_�:��C,=W��]F7й
��t�Q����|h���|�
j�cE��޳GA
�E`t"�s�c�:]�d~�]
��_��O�܀������i��K��_�r0���S�� ��(�{�|���3|x"X$݂%�+�,�d�ȃm�l.NB��B�����J�_�q'�:�f]�-@�%C)Q̛����AX������?�w�,�������G:���n�+>��_��@������e��=;`�7\"�(49Gm@���%`�D�)�e֜c,�d�8E���]��J��C�UG�q@Ƒޘ�ӟ�"�cL�l�v_حO�h�k.�v��r�D8x-�X��5q(���|ب����zq�#e�1J���G���؝A� 8}�+J���0����w�Uc�?#�L�K���T���A���+���AA@���i��%LMM����7A��DF�o��K2Jk	/0��+x��Y -����Lw
��0�)8b���!�Kh��j�I�``z��x�yf����]�a�l���x�"s�ꐀ��DXJ`�Vz)�3�yk�qN���y���j=X���ۦ�M�i����թ�xj���M��zI<��c��g]h���N�d�I�����S�j��;nB6�u؟�Ă}��jiG����pޢXe�ҥ���D&�c�Vځ�&=�O��2��=J����v����|墳�"���+:��k�V�}g%��7�hn�^�ep/K���Et�Y��U�������"T�{S�{*��'-a��a��~�Dk�B�~���Ј(�'��bq�tf_A�c��H<����Zs%���r�*�e������b)�9�U��z�z�6��:<�/��J����TA0މ��G��1��)Ia$.꟢S.{�����,�&�x�0�⹊�C�qX�~h�1{�˙Ў*�]���B+�1�ʉ��Jz�k�<D"���A�Ռ6�F1c��Z��P����e�֑��PI�^�o�t睈��z!.��N���8��d�VȜ�Vw���U���T��F�(ԯr��oCƏ9D�dU?GP�6i�%%���Gȝ��"���6&FP������Sn�	�=��r\���Zp��>��썁.�N�;�7����33��e29���+/$[��	ˤЕA�v�Ԥ�7��}��B�B�*��5K/$�4��xLO������j��r�U���D9���^K$
�*`���u ��#�PS@T���
�}:bs� R�l�zu-��K��q��6<�ֵ�L��Ľ}�[��[�q��~R^CM,|t�m>e�*�{�m��V�q�w���� �6V��˺6��BJ@F��E(��=���i�&��k���t��!��Y{��K���z�����j_��H0h��n��ak�ҭbi��꾅a�6��az�I��<v	D�	�I�a����H���h%&��:�S�X�G��\��YM81��}��$^��BS�T����*��i[�����6K�n��	٠!k	���{eބ��|�_[��bV�
&�H�;�J�#p�r�U�9�l�hY�M%yJ�B�zt	����L)�}�D���@���=G� {^r�krR]�tN�)��+<������iU�y��Q��ҋ՗�R�b�Qj�eT�yy"�ݨƷ$7o�g,�����S���2�*0�����=My9eS��^��Ҵ4T]���N�d�D�	F�理V��L��6(�[wH��=9��I�ZO���nE��
�YOf)'�Ȑ�0�>T��aa{�];��)g&+�$y�u��<�6�5s86�
ʤ�{,��{�5<���f�5=��}*f^ێ6����'-Lx#�;܏2��H,K�A��A��
��t��'!�7��x��g*�����{oP,ˑn���{費z�WAn�v��G햟R�#��;7�p7��3\�@���#(�3��i��650�ʃ冋SP������x�(���F>s�xi@���+l�)g����`�e�	���C.�'7L�-��W-��c1�Ӕ߻W�<w���a߷'�o��'�?ġ�Zh��kmWp�~�Z%�giU�Z���y#j���n�����}�Y�����-s�T��F�l~���i�~��L�"
�5�qfx�Dز'�̙I�5��!$!$�!��Oi��"4lp�Ъ�;��t��KZUߘ۾~�] �h>�q�"�2�_%��ߒ6�Ħp5j^7�-�ԉ�B�������eg\�k*E�ѐ��*d�Rõ�v��u��H���gױ�ßfKN�An^&Qm-�Bky
;�(��y������G39z�ֺ�@�����Z���97�P���6#��5'�e>|�x1��/���9��0��'�e��h�#���d��a���۬C�t�A1��T�Z�WhBi�c�@�2"sK�����Q�Bpq�J�lB�
qrh8c�{��$�1���ɌS�fM9'�ǘ*�Bq�h��<��w��nD�B�G��N�y�Z�4�lp��
��k��H�U�S��[���V�
��8��IS���AU�І��Eah��UB��VJ TK�Zw�$�b(-ĉ�h��X^:�h6�(FU5vUҶ����2�g�Y�-��~[��M�6�{�k���D�U
���.y]�ɌT�z�~��D�2ݲlH���UD��N_��l5�VM7�r�S9B�b��7B(}�
�***��f��zbSk2������)��tf5l�2��. �(�DgE���79'-0o���'V�v���y���f��'�8t=���m�T݅���O-Y��ީS��T�Ӊ��d���{9�t��"���7�s�o\w�0,����5};�D�Q�����J0ր(,R9MM�w�8kR��i�(s|�\"C<&#���v�H��[7�:�@,��E�Y_NQ#$)���,
�6j�qB �����b�,�����O��K���.�ڏY.`����i�9�Hx
����K�/|��M������Mb`�!"9�Mb©��2bDQ�4&���ި�9�ꃃ�d�ꋝ�Ee�a[��!�8�u+"M��hdaœ+��e��*U�5����D]mZ���L26?���*2���>��k�#^$Q16EKc�ے���b�����N��(w��k��X���v#��p����<�3-��'v�.b���R4��-B��kuV@N�P�����=CN�����n'�2MҤ4
<)���"L�Y �����a�)Flp���B���)'q��%�0
��B_��}-�sw{jeuN"v�j-EG
��9Z�.y�p�<�9��,��Y
N����r2�9B?���v��&����>
��
���Ls+:�S�ƫ�̂�9΋^���/o��Z��N�
����1|��Y/UUEI˻��G,�����l����ʃ��l�n0�_���'"J�/`��n.�AW>]�o�̪�G��=�>e��b����+[���b5'�I����Ym],�|�^mml�hkN���C�*��]��?K�Ộhp�{rr��ڣUi����!�F�1�D
w�{D���C���5�h��*Ǣ]m�X	pT膙�$eꗹE
�yS��$��sݤ��I������M�K���1Z9b��s�d��v��#�:��¹�c=�<��ܪd*݋ݹ$t-���ؓ��,k���C���[�۳ݨ���[��m��i}>&i�ޤ�s�D%�g����$���ӃA���anE�M�@w�O=����ȭ��Rf�(^��&$wc�g#v0�-Š_�5`^	�P$!��=�,���YJ��?�Z��!���pmM^H��	ς�m����Mfg�&���.,��=�f_q���o!}{��E��9�'��7vɣd�`��!�4��&�֑r�v��}$H|����{���3O�#�]��x)���=�/u:�[�אB�ˌ���v)I�w��ƀ;��V�����mDo+��&N@�KHl)X@]4L?$��F)ѩ"�w5ԉ��DPd,�L�7b�������eRCAEu =��v�4��a��r}6/��&�H�>��?u��� �5�V�-5bGf
7��`��K�KM~"ِ�u4�dw���8�L�,΄s)�K(ق�f��8@�v;�wD�  +�P�F�L3���%ǐq���J����‚�K�\\������;ss�E飑6��2"q3����(l5=ŏ=��'��H8�I��|�@
�4j�b�����g�I��0�N:�Ӿ�gBpjF�S�k�r��R�I[�tNօ�7_M��~@�(A�h�ˮ�zEL�Ylf��`�	
�#��-�����}ڃ)jdq�7���ĜEJy�~	0Sn��ȇ���nrP��G�)�¸%��m��67��Y	���6�aG9�:�5��ua�C<Ax�#��Iɮ�O��aL����+���p'�+�%��
����|��{��BY�����B)D��E76qd��5m��>�ѽ݂w�#�a�WQҋz��x�n��oݠ(S�qSv+S��d��1Z�ªO����*)�a�����~�����`
�Q�ќќ
��Mf/i(>w�öF�Ѫn��{]�������,���}�;�>8��� ��"�!_M�����!7�̲��H��9r��(Z��!���T��uJu̬�
�k�g�L����F�
�:/=L�)�H�F~��g�A|��u9�,�kT%����1�ر!<|�w�m���{s���=�S��ɒ/d�
�y��{�"��b^/E��鮟M�b{ě�%�{��><舥��WXU'�٩y���ET۱�t�9�;C��_�]�V�<yS��=t���<0sR� <��S_���0�'>BT�1����#EZ�3gC���Qht(j�Ģ|D^��Z�n㥃���Bhq�CԞ$�m�xE�G-��0��|�#��2}J|�3gn�Y��D��]�zM
�e��|Ոcu��Z�9,������-	��Fb���T���C�����h  ������������*�\�?^��N+ְv�U����u>qD[oR�ژ�T��(�E%��]HĒ!#�-蟚�g�5���|�Q�B����	=E�Cs���	s�!f��R.��`��z�>ݕ,�lkp�������
%�j��܃?�tty��tI\�
ȣ:�HH�#��3j��"��N���!��=YflL�V���Q�V�H���,��4��X�_��FV��W�B�j��pW�5z,wiƔ���4d�7��2�j�\�F.��_29�����ԫ��'O�%��dv8�jy9F� lR�MSq�ꕺ��9%����&0ty/�־�~��-\�ff��T!�0g�wЂ�.��z93A�-�L�XC�n)�eom�TP�f�|q_{k��ۺ�]�(�}c{���ֽ{�+͛�zz�kF�!աzz��6QN���t�D���W��6^�kjd���G�S
w}�1	�%����7�q9��x^��F��mG��^!r��f|m<~�&�;R��p�Ua��s�+�4'�U�X,h�yvu��*v)ن��7.�%	-g�a��aw|��|���>����h͖,@�K2�:���g�~�l�dj�H4/G���Q��lО�wſ�T��-dԡ�
[��=��� �>��Ѹ4���>��f�L�dK�#����{����u�k�~YU�p���R��E���7���r�>6�\yt��K���1ഌ�ָ0�Ce
_��eanǔ�^j3���)�&�i��	�W��~�G�O��o�B����'w�
2υ5Ex;�F��S�������?�F���G�h�3���#/��Ǫ�
���\2��n�10�]���G����:-(���)�}��1lq��a�AJ����M���C�y���3���z�k�Sr}�c_] ��aK� `L�P
�#�d�_��Bc<�Վ�xĘ0�����s'�G2�;��g��d��i,�.OF��	 �2]��OetJ�M6�W��X�=�64�z+5�8Z�U[9,TZS�,3�k�L{V閸vzEZn���\���4un(ѐ{
R�J�u���(R��4��4���=~�df<Z�o���"s��o.8�6���$�.��>bG�46,Z�~�鹁X��师����'6M��A��[�֎�����(c�o54�gV`̟,�މ�ϧ@)n�~5�e�ٱ���M�I�d������F�WDE�*�y�
︳�K0�۸���ja���^�p6of93�ek='�n29 ��Fk��Т� �X�ź9��t�͎q���[���u�d��t�d�U�s0��;��C����67l溱qB� |2U���$����F���Î��;k�r���� z�ַ�_h��$� ��5���o����;c����}Օm%�TVa�D�V#�ġ��-�ޅP����r��w�J��
UfaI�����]�&(�4ڰ4�҄��N�b&�%+!e�Q�͙>��$��If@l����A���٩��)mZM��&'����{${P���[,�9X������)�
Jo�i�~�$�&H%�D�8K0QJװ?7G�Y�"��T#c!^[A[ZG�G�����t@��3dŇg�O��UZ�H���d���.i�������x^�6�	@���u���F%Y	:🬒���2\�ͤqƯ�#<&1�'�H�#�4��4S�IӀ�~��	��w�S�r���^Iצ����8؀����,VI���3:j����.�֞��VӞ˼/�!)M�SZ�����!-���[z.�
�铋#��]���J�}�X�Կz�o�,��j���;ŽՊR̀�n�d��O�'�����E�W�O\���~��/��T�p��	>�=��}:>�D�û����!7>RJ��ʮg=cx�]A+!cԗ�8_��n�w�}�����_��!�!��rK٨�Zm��5CwH�������87VQw9n|����-�o��������-�Pf�EV ť6h�@Q��h���"�Bʔ�wAJ�q�.!���q����\!�Y�*<���<�}�["���X-$��<J�"e5ei��Wl.�R�oB���g̯Uɤ�<�19��ݩ"��*�Po_��抢TQ���tU��M�u��,y�l�܃ѕ��?R�~�b[Lǰ9;��i#,���8�c�e}:&�����U���i��ej����D�<#AR�<y(�;_�:��!ɟ,0�R0F�z�z]6ԟ�b(��z�'&�샹��8s�;6��`.H١z�[:�=-Te���а8/µ��-P��ҶjzJ!d����v�1l��u;�br�O�v��&���x��i�
�*�r�U@+��R��ۖ�ۖ<f�!\EU�Q�w�E �'Ý2��EJ�0R���S?h�YȸN�i������:ޱi�{,iHѻ��.�F�T$|��z^�9� �p��� �H����4qGЂ̓�A���GÄ��.�,2�}�z���?�6c/k!�$�89�t�񃚑���_M��tUj� �[$���/B��!����?����%���(.e�����}�_������i��)��'ɑ9�9��+i�0�$�q�*�;٩�3�Y�X?X������HA�H�"	`B=6Jgf�x7�(�2C56E-EG�@?Ϩ�09!KO��B�ZW���� ����"�����a�O_
/,�_HEƌ_.�s*�l.��&��0�
��������dΒ��@�of�E�h���A���BD��G���G�8�ױtm�X�C�?��o��*�!�	!��R�"��r�β�B�֭˫-�\���$�� ���mg�w�O^��DP������@�q�Q�{�'S�U1�L<�vP�+������I���(%Ï�hjf�CO=�犥�
�gw^U�����oe���S�F����k�Z���Ρ�5�s_���q!wP<�﫦mo�G\�=1zQJ��A@��*���؝,\�L��s_(%�[Q��ud�͝���2*� 	8�=YI�(�Y0Yf�|CT�67bdҢ�N�5y}}u9�H,�xDu���}���a�\�-�|izw	k�#�,��m����w�˛�_����M-��g��Q"�r�@4�K�/��s��9��vB�?�Z��s�����VV#��s�85휪!����~0�z�u�Ή�n�y��bĽ�u�o��wZ�ʺY4�\�~@��=׷to��_�H=K�6�	�	�AS�e�@�X�>�!�5?: �dY��<oO��-pQn�+8��D77|��s��E7#�꼓��KiE�ŵ|�!�㟔!G��
+�m
y��JM
���Q��IT�`��qm���z�MD���z���JJ~A?��̪R	L���^1���E�Q_ť'���DC��K6̃���&����H�=H�.�	$�^�ؤ�~R=S��L�����X0! �\�B��E�הQ�dVtb�"΀5�U%�ĉM��	1adD�Io�aU��NGndg�~�@��V�w�]��!d=0I0ש��=�2:�6	2�.��%�d��Gz3@�@���	�I`�ݱSz$�ˠ�Z�J��	�!G;�*�&���������O�ZLcc�8����;�+LQ�|��q�X�9HU�6HY/>�[��f(J`2�VM���uL[bjl"Ƥ�cٛ�S]Y2‘A< �+��K4͖ݱ�my�hHs��A{��x`sbtn��;k'�ד0���^B����mㄫ{
�£�b��w�i���xe��\6
�Z��,8i�\��01�������^Tc�)+
�!���	h�a
���1V���gD$&�h����^��b�J�}us��ih:�m�(e��\���9q�#��b�m�Irr�>���^�Ce���/�|���4�op�?��g��WD�ّ�L�?h^�%ef��c
���1
���fO�&c���#ͨ �
K5?��s�S��NF���y�
�gB���?�j�<��+���Ո#�w�zʛ���,ܟ67��\���R�H�����q􀻉�q�D��A��l|�ܿ�? �;d�Mq�@Iw~��Yޓ]J�+�`�u����o���oR�uQ���,���:$�E2)S�󔞅�,�W��p����u�S@ճbG�~�
U-V[S7��Xŝz��d+��8=�L��U}�m+lj��a����^�f���u���}��/p��]4/��i�˳%����%��+�;i�HG�>w��z(�y"����8so��SH^�P�a�m¿�	��>��&�]�A�>S�a�>��z!U��b��!��Y�Qխ�~>э�{*�|)uKvw�9�H�]'����Z6���V6����^�ʐ�����k�>�Žg*�i=�_4鑶� ڏ�`��e�~;ۉ�{i� �ۤ�����S�<7�������5f�n��R�p�\�&}��_f֩�#��t�?C�,M���ޗ�2�N���e'6=��<C����/8ʱc�����Z6lY�*�m�l���iD��%fI	跎���j���T���7��֖����bI��(��\�E�;N��O(Jƞ��P?�2�+\>��n��/dWe�#8���&Cb�8t�AY��d|���p�k�\<�2�j_d��Tr۪��o�Br�<Ӳä��Wy!δ1�4y��:��Qpx9)5r6�n��h���q�� ��v��0��~u�c�q<�`���5p|�2'�b��3�	��!�ݚ��x�2A��ݓiQ����Iy/}u���<qV���+��޸�X;������d��e��&��&��4����A7��@�=�+� �栞4��)8��3�`[����o9B������^�9zS�rA�G�ޮ�|���u��1�3����	���K��t�ul���eaD��~��l�U�!`Y�%��K�%�W�O�?��H`Ї�ʳ=H��+�wr�x�*�C�d0�]�����GX�3�l�֊�� 5����ݖ���t�V�x{�R���d)i'��:�C#j����U���3�
wgV������tG�K��m\sǫ��+���k�:KwuW�΂�-�-���vg�/���;Zp�/č�w,��(���vw��.��_���.�o]� ����v4Pn��m)�Or>00&h���Q��S[v�?�p�O��2*y�3a��/�ѽ��[�8!�.=���2죳{|Z<&��L�n�t�����D��OX���_��l`��<iD?8���\y�Uk�+~�y^�3��ޖ���}�{y'�����+
�4�Z���	jWi*.e��˨1V�wͭ�!%��\v��
���pBZM��������+u85�x�.e��Sr���S��CK7~����yu} q�&L�A�ى.�c�ư2����AmRF��w�cU�l
��е�R�w|�U�R�+��D�(]�[pq,�9�r����rT���%���nB����`"|����l��B̪��lx�DU�9r�>�*�e"������{�r)�t�p�5�M
!��]6��BZ��#��BF
CR��e(�V���{�CQ�9�e�9Ŕ�BQ�R
�4��k�o�8�)c�Z+�)
�E�yP)�*�<Is�b��tԒ�<�kb��9�JP��9�e�9Y�*Z�ZE�K�}<��)�
�y�%Q���EP�j�$e���s�3e��߼���z^M"G�<Es\�VJb�e�8�S%�<���zM��*�e�)E�T�bc�VE�cɕ���ze`�oEn��|B�"���
��K�<e<Ra���@נ��u�"R/	=J|��"�%�3n���NQ��q)�2Q0�i�Ҵ|X��$�ixV��Yr`�2
zh{p>�L��>VT#$?��3F4,$X���N����O��ŲB����Ӂ��1:���`�B���w��2�h�`E]����aD�g�T�����mL��j0�(��&6j�%hQ�~�&6bx|�PXQa`�4Vf�qp�p�~
V��Vx���F�#
�?�<
gb��O�Wcr��Zg�	ίcr��⡁�����C-r�\�*�Т���qL���U��i�NfT}��&�L�������\Աp0C�`E���b�C�r�_���+Lt�P����!���_}��3�Q�����i�����WLgR%�
�'�����"W,fB��Ui,:�)8Q��Yb�?�Y�`� ���[-�x(���[�,6�BNT2$�h!�#
��ɔ�Wh�^!�~@*i,�P��| <>Z��?��R-j���?H��2-û‰B��	��A��$�G�p<@:?IG�f��R\��g
�+�/D�	q��.�t����ߥ���=N�a(�g|C��Q+l*W��u�c�m�1c�L�xE��$B2X����A��{�d�@32�O�R�����_:f��4�E6.G&���
=�n�m�x_��z@=6�8ڄ��å���*������\�{�����<����栄������ �b��
�~n�
�P�Av,ӽo�N�-�כJ*K�]!@@`����1�[�hj��[S���!2*TῊ���i�E��B���lJ��J.��"w^^C��bO��	�i�:ߏ;~��"��{�Ȝ����n�u7��L���:)5��ӠY���.��HQz�h���h���)�4����Ä���oU��P��R0rR����v�S
5�Lt!g�,L��'����4b��#�h�:�ϱ�|:r�X�yc��<�y�ݨ#�P!����u���=<n�����g�\^#P\TO�
����a�
�K�j�T ��X�ml��|S&\��A�|��Qgs3��V����#;���ݛ�4 ���k��U��]ZBc�Y^v�גq5�:�U�A�O��yya���T���v��`�Ha��R#�DE��	i�S=Q�q��{po��@q�s��N#�MW�jlw�>�,óDg��h��Y�(�y�
��|)iz
�+c�~�q��m�Ełv#Vi�?=�
k@:��C6k�7u�T'�k���CNy�)�Mn79pGPG��17T��|O-k���L�ԍ�3���3"	g�g���f�? 5��T�h	{�4���+�	�O8���-���-�i`1i���-w	�����Bw���w�X�1q���"Xr���}���?�rF����7}(颚4.B�����s���h�q���������rH��4�U���:�6H����F<(EfU��
#�E:ʧg���M�{�`�hb�7�\+�+��4���Ve��W�3��r.M$F㕇[��+�=�O<����E��a%d��MJ�7�k��U�xR���d�},��`��"g���c��:�b9��lcF��p�FXP=ɕ0�G�"[y+Z�t%�].��e�kD���_������s�Ԓ�P���zt�/���C��8uu��Y��{�$L�������k��:�Ӕ����veq��K���e��L%"�"]������I/%SO�g7B�>�m�Z�
 q��K����eh���2��3��p��p�9W��UN�Z2H�
P���K�j�4Ķ�Υߤ�7����wq�x�	khE�:g��w��.a����Ը85�� �_�C�av!q�樘B�I,�)=����<�)$�0�W��n�S���Q�tq�����{e8�}$�mK�gj��@W�d�Il�����u��/VM�(o+�g��OH�ؗ�0��$�Iw�P�#�����U�mn.x���L<LXLG���Z��|�!��I�+N}ݞ����\��O{�m)�i��h�_ݴv�@[�����$q/"n8�k��	�e򎅒��țє`����$�q�^ώ|"�ou��䌿�t�Ʊ���0�/�"��x,o�/�Gٽ�!�������A@�A@h�'�v�1�/佣��������xMV:Ī�%�P����|I*_>�B1D��Zв!��n�=7�}���Ix�1��A��ٶpV�m۶]i;�M۶mۨ�m۶mۮo�9'�>�o���s�X�"��|�S�K��w�I}Vz���[�>����_�{n�[�j
8�]�[cI0%lJ��Cl$�In��٪� �
��.(]��讅�c[|�:ޅ�"8��#��ݨ*4��乛�V���qtQ dV$�{�:�3�=������8��2�TќG>И�ԫ{߼�(K�;-��\�$�Bl6��#�]�h�\1ϥ�Q����2_uF��d��TxHUvR.���ېO�xg�xr\��	ބ���X:S����3�?})AE�z��e��q8z�,Wh�]xٿ*W�Ċ�ΰtDsD�6}��6�8
�k�V6�Up�pZ�1���
�b�-�P���1W�	}M�iX���3�i���/�D�WC��R��p0�œ@:�p�Y�������l�.���Q��W�#떯��Ҳ��K�n�1�/X,�T��as{���$+���/o��D:�՝�=
C
�Qn]i��~tm�O��v��IO�[�v���[��X����#9$0�t@wΎF��F�V8:G6��Y���tA�[a��W��c�E��(XL[�#��C��8�8�"sy�$3j�z'�o��T����f�.���	O���A��u�d��O�,��sWj&�4�P�#�>{��R"3�s�E{���P`��wE��*��sS�k�D4`\-V������މQ��,�H�o�19� �B�V�Ȋ]��V�Hz�t�q�4A�;���b����dt�R�}l�э�\j\��n��K�$���{��}PQ����zD�R������*��ۏu#��_ʯ�3�M���=d.vDU�y������$yl�#�%�W��{�F����)�����x�R�p:�C��H�����,�� 3�Ǡ0q�!ܓ\#[�$��<Rx�^�#b#D%���]�hԯ1J���'nA9�v��	��BD��|'y�(�q��˂������|dg=��v�[<��w;�a�喝�P����4���ť��G*>5o�_�O�`$o�����g���"*XQF���m�B���V�A�#T�N\R��5��ڪr�vM�N�K����Ǘ�!�%�۶W������>�.�K�ݭ�M�~Wd{dH$��^CD�ڪ�3���ѯ�z^��uԯ0�%H�E�2�;�9�dD��wbޘjጱ�A����j�b��52����)��k��u�Q���3�c6�L�P�|�{����Q'�bߏ<7/�q�Ǻ1{���<���?�{��h���ZVɵ���O�G�T�s��<�3��L�AÆ�/2��H=�okDO��!�-�_Aɘ�
��q��Ѻ�&�XA�A�?��
@c�#Ϡb9�=/ȏ)�V�Q�?Zp
��[��™��~���m�	���5�h�a��\��
{�Rk�̫\g��g�64�m���n�c[��N���9�)�C�?�v�7u��������¿�Q�mC��!`gge��?��rR�t�GK��	Ӎ�4B-\X\2���x�� ��_��	�Fz)��U�Ζ���h�K�q��MȌKWd��U��y�fg�+��v�Dw�����l�f�k��6���� ���:,��x�r|�������m���w���:&+��|���1_:��?pW��=Խ$FREn�p�#.���"b2�6i4����8H㪬^2���3�X���6��;�#��J�:4�:�8�v-�Rv���Kw2ꅇ̕{|��vj���b,^�Gn�F�|4G���R�nN݄G\��yqwR�|(�b�9�J�|�b��>�Gtx�ɝy��K����ag,�d�p�/%(��K�5�Lk�p��UZ���v����`�e��|�8�x*����*+����j)QX5���M��j��%�*�1�!���ï�|ø�ه�������0���΍j����YD*����9U�4�O��1Ε��6`�&R�xQ$V�E�樁c�Bs9I��s���V��|��a	)z�\с�:�y�xI"U�PL/,�;��Dm�%NM�4h!o�QfM�9>w����7��H��<�����͚�
v|q�Y�;�:�����L��M���Ϗa�F�6gv��&��Υݤ������;	/#F��D�Ux�4ĀF^�P?� �&���Co�$�K<<Œ�A~tJ�SӪ�%p�tD1ٜ�`$�Y��fd�~���=S�*���w����4\ȡ������L��Άq��G3O��
��UDMw�Yi};�5�B(�4�K���Ϗ
�v�,[�G�f��m��m�W��3A�w��O�S]SsU�Zo�v����c���Ao��-�+�E�4���k JF�?�	�Y��67�i����F�p�w?��_�j<íig>���L���9�<㭪�-���m����{Z��-ضQcá����P��+w�}��ۧa�������6ۭ��Do�~0�t����y���ƕ^n�2��c��1z�s�@�����u��Rļch��0�H�Ŕ4�h���"���4�[S*?���2��RDQ�9iK�!�{��ѽ�T�p�q��^?�dF#­Ÿ�^,�A�ˈ�r����3~x���rq����ְ�o6+Ŵ�jk���F]�H�A��a�:I_�Md�=������z[	K�7�a�����Me�щ���B�M���x�#zY���.�į�dk��[��Q|��1
|����B�Gi2��Ƃ!Y�߫[V�N�8�H�P7Z���H�ecw��Na�D<m��&���d��
��KA�wU������5k��j�Յ�=�(Zo*o����&n���U�j��M#�Q�J�1�~m�?tև���ATk�8��H�MY�)׀�����Dl��\�k�=�3/Trj��S�}E���%Nz���Z���/��-�t����NI�l]�����X\;�a
�n=���D�w���Ia���js��v�ۍ��j|ȋVeP�Mܱ$��L�qL1q���� �~����}�T�k��ڒ��R�j�JiƮo��5لr�A���N��Rt�p���"�k�"������sߦ��,YQ\������)8w̛��յv����ӧ#.�fڃ���t��9%y5ƃ-��%֑�O�rweP6��>\=\�`� /Þ�/�a��3���mqQ�k��=�o����tqGʓ�lq#6U���{r��\q<�����{].�1%�ɍf�t�I��5��}=�@�3kLs��>)�
g�Fp�o�h��7ُ=O��Wz�)��(��*Qn+NOH�=(n�v
i}��bnr�BSI���	������5LW�X{�v�a��v��|.EMG�s�`)��*G(Qzt
�:.�TU4a�h'���(��P��~\���&�ޏ��N��^��R�@�(i�69<f���>rxJ��%��G���P�Chsy�?3�Ш>�7�$Hۢ�FJ��$L��B2ӻ�X�1te�܋ipD���?�Kϕ�R將�:��<�X������� y$��b�1b��byZ��,=�L�0����'i�3�:���a����$�lj7ឈ������`���[(�W�~�/Ҟ(�;6%��D�}X�؛}P�S:2:7��E�Lu��-Ik����2L<���;��
��y�d��7F/|R��a�iz�<0�i:�][���r�qt��!��2e@wl��B��Α�gH͍�™���C��h=��c���eV}���g�D,ȟ2�#O���u��5u^{��6���i���{��V�GI�	�dC�����g�!(K�t�h��3��i���x
�YҒsa���s�4<j	�wu�sL,�r�����F׷���E�D)�l��蹍����XӢ���jn�>���<��@N��Ȱ�">�$|˰
Xa�
.D�E"����h�DC	���rOe��2*y)����+�k�	�|�.�3SL��-�{�����񝼒Z���&�r�*��9�J�ri�E�jS��Rق2��J�|.[�S������A��Y���m���P�t��]Ik���<�+��#�Gm��
��!:&Gb	��
�oސkɓLBMu�:C��we�������g��L��#�6ndm<���e]�>$�p�%��$t�\������EBm�	$�ok����w4w06����`��y��k��b��<����f<�+�2X� N��(-������kqw3��gAԉ�yZù��˶c�M�Öϟ�7j?N�x�nlSy�܊���Y��LuP��)V�c��(l(��V��@�Mx�����c�ӌlm��H�2���1-�XՋ4�u;�
�
��u�3�Ŋ��w��PE�]��V���}5Gx��O�u�!�J��:C(�
(L�6/+B*��$��ә��B(�[����濌AagW���Zy�Ω���l�g���z��Z�%n�V�\��r�� �\`��sA[ّ�@������BC�OXL#��=Fku�;�H�;��(��(��ʼ T����r}�T���5����ofې��X#��&��ߧ�6A1R]=K���	I���,������3p��5��Ah�!l��h���V��g�R�y=:Y>1,_�0�X�E���6�$`�`9��C�_�"ԴP����Y�?؄�ȁ���T}&qhZM$k���$]ȳ���%Ȉ�|Úw�W�țI`J�B��b�S����&>7
�cg�	��a J�G,x�C:�i���6;���w٘M����6���d��e�'�䊑�Z矠p}ϔ�%�S5�4#�!]05�ۉHG)Ck�@�䪾��2gZ���8?�5���ߔ�{��-�N<�W�o�o��7�m����[�! ���s]y���
�1��<�DW�&+�k4tkj�4�⍻|Ԅ$�H;��4�#�r�7199f�����r���\��
�N�i�B[���Tg�����u�a���I\S��	��8WѺ��C=^1��ܰL�!	{�������;j���T��I�����ŝ�S�\Y1V�_�FYdS��	l�g��p�Y1&D�D�5��J鮆�3�N���(�a��޳�d����:rMQ��1R3�R�6G�Q��	�sHٝK��w���-׍WH�o�p��cK����/��d�C�C��X��ԏV��H�Mx�M$�di)͒%���o�b;�t�z�Bxn?��e�ia��R2�W��1T)���LR6���]�{V��-a��
>���OYO�R���p��h�g�ն��M��[���SV�����k�=-�S�
q����΀��!�����o'�7�����
��Px���9@��Y��A������<�c̀�$��!�G�_�����~���1��q���z�s��k�(�Ы�(hұ��lm���@}*j�����~�����of�(���mf�O$�b;�
%��aI���9���~̄|������f!���q�&Z_��&|�K�H*y�{vH_�x��Aq�EƔB+e�2�J4;��5�lWB��G��1�8�%��c+u �x�X�5�tVa�1�j`��"nw���hw��;tR�\�E��!ǵ
=�~E����"�N$N5�k4����_!�m�)]��%�J�m�X�}xx�IZ�aV�{�O7�%�ƨ�
]�{�zK��W�m���E�_�؍ ��5Bt�[T��#��N��wB�Z�A�Y�[��wO*�y�h���$����[N�챿�;��+�����š�_�/[G�Yl�hk��v�Q����W	ޙ[	��-�8�#�|�Kv*	iSLhýdy���R�``�a��`L�k��H�*q;���<�Z2
�yܴ�6I2!�w���41�Rr!����	y����3Z#r�8��'.�U�־/��N+n8G�Ҟ��:Q�N3���^�Ml�(��錻f��R�:��
�ý�R��?E�Tz����3?Hډ�6�8.
F�S�-�j}{�'x^�-���O�’,�����BS;F~�ٗB�Jy�J+���$��Eky�$f�=xXAv�@�Zс
yc�<𮤳���J���Ċ/2>��߻2׿�m��[V*kͽR�M�jf�������!�d���=h<(�#3=>��݁y��"�z���P�wk��[
�Mk��&S��D��(�d�.�d�m %J@��)��K��SBn9m.���j���L"�������"Y��CP�j��O	�Fy$2����q����X�F��'�/[�ל�f"ox�z��X0�y�3­Y�GkntA���$�Y�;����ĵG2�����c�G({5GC�F�
x=TR��4D݀(*Ί~)���zOu /!<���z/� �л�Nڀ�;\�O��Л�kX�l�m~��P�ۖ�[b�׺�N
z��H�N�>���f_�	��]\B71�oe�o����[���`���K�o�����W�OK�?d�:0;į�%Zo5���!���VC�7�A�%�.�/ԓf2��쏇��w��c,�������Ik�碆��lIN��~l���Rx!Y@�s�2Q�N��v�f_�����La��6y�v����e;s�&���λ#oxe��`z��w�=��Z���qV�`e{�/]��j��ו�l�#ӝ��;��l�8}�w[4Q�K�
&�D��xa{�T�H��!��ip.gb8~�+~���~�B&�)��T��r���…�B�ƉF-M�l�+'�#�C��$��v�0�(v���/�k�5J
GQ���_�L��o�X�`���umq�N�w��J�Vv�<�]m'�؞�&���*��&��^�䯗0�3m�9��8��v��-}�)Ms�I�΄\�錗�Ŗ�g)m"�'�G�s�;r���ș7wg��ro��Ej�������΅ßkg��������t��I��}W�0 �x�n� ��I�R���n���"g�1C�ƃr�3��a%=ܰF-_V��w]�j~p��=|v9c�Ԟؑ��Ar����,$�y��9M�M魬>o��v�₻L�m�a^�?��t�t���n�t����N"%�(�An�m�](�89�iPol�Y� �!�o%�������vr���(�ٰp6q�I��� �P�>v4l�"�ԮBaD���=�-z	�=Y�e��QN�K~�U㊌Zi�8��b��R;��˻:V�|�*�^ Y�4�"]�y�n�D����\�4�\I�K����(>Z��b���>�oE�����hNU�I���D�0-:ĸ�7Ca�m:�:��[�D$�@��K����a�d������I��տ���g��mLƷ�=�^,���ێ�Z�*�o�RD��Z��00�p�rI��$�L�5�m
������b]��S�4�"�
���δfU��.CҔQe����"T��`�I�mY�f�(l�V8��ն�%f�؀\��LSY�jN������u���o+���K:e��Y��.r�4kd��D��aë�b�Xy��e�6�]h֠�*D۰/�+���Q�\��(Wc�ĝ��2a�	R�4Yd�����Z���|�"ƾMLo��lp�1��5M�����h�%=n���/&Ўr<�L�:��=���I�E�i.b��[.�N�u
�X�������xwZ^��@�r��(�j�)̜s����MK������^�\d�I$�uQ�A�a�s�_ƒ7��>�_���.����7�}�,��j6��*\M��p�� �B����7�o/9�wh���'���䋑td$J\������YYcV��HO�D�`7��z.�H��x��Y���\���}�`�Z�#�*k�[-���+��_�^dl`9�����n��z*��:n�(J��Pyo�([�i��d�N��J`#�s�{�9��jm��ڇrsSE2t�F�œC�֜��j�t5�l�������{Ԑ8��#h�h�fsR��z�WͷB�
�;1��?�N�^�%[@<�"�55�9�N�j!��-,�j�������U�����5�h�-C��K�"ⰹjͨ��P����נ��}��g�A�
Ì���0���뱆i�.�S��u�q$C�
���m�u�P�ә@�}Z�T�s����_��seqY[�9�!^�yzx{�~�,�qH��5HT2�U�@(�`��Ӻ*��0��#�����hs��(�#�+P=0^�l�b��r�!	ՇN�<�`��+�b�Oʦ��$�%���B��.�2,��`�S���@0���Pea�4�t�#�p���+����L7�WAF[��L�?�x	Tξ�c�>�UݍU��/B���GM���.)'q�ib�=�I�+��J��Pۿ��Fx��S�;�����Ӈ�.c4NS�}�����s�/�0+;��1(�É�XZl�f�	��|�B�]R̲
�8Ąg
����i_�iW��
�fK��gs�)s�O薮5�V�`��������Hc
4�@�q�}*�y��/��a�����X^I��05�cOu��1|�}a���)n�`�w+�<�e�0�^��.`ZU1�v���W6*Qk�麧5p�?�f�?����!BOߔT���H����$�����c�'Q�����Af���D��
yG�,Ԡ�[��f�;��u���7?6Ÿư.8lp'^�|/A�5��SG��t�.C��cD��z�I[1�c$)bX��ei� \�qX�Ũ�Q��).�]�e�<���
���o%o��d3�qA%f��#3;�E,�r�r��E+iU��_*y1��T�����쎀nZ�$eK�fdM���1������Hz<�t�a���#N�s�.=��uaU��K)\;L�	ZCUK��*_iL��,�����hJd�J-,`Z��dz�࢕Y��?%1i�Ty:/��l�2�oM~��b�4�L]��ĎP��	��B��Ӹz|����F�%��KdMQ�Ϋ��[�����<�x� �
�\3k�J�v�{Y��c=�+M)�2P��d��~L	N����r2�_.2Mp/e u���za�aO3&�MDZ�m�h#{�.�Oc�?�ԝ�0I��~P�l��>'>�t�;����]�g��V��j;���	>��Qxq���*��_�?��#@�"�Ώ|�|�� :�� ��{�Ζ�k�WTq�zv�xtt��nҠt�}��S[&�0�9����%@��٦K�BJ�a�5�E"t�ea����w�_yC*�;�	��|v����5�얂�cM����Nl}{�_�
r��zd�
����v�F܉�k�֦:j�ƴ�g[����l����o����y�I^���1'O���D6wu�@T�f<�7
7&6���5%�����]�V�}�}|��
c+��(�.���)��/�m��T��	�i׾�~�v̔pֆi�N���\�";,��P ��
,E�	�H��+5{&���B�F�I}����wƁ�0:n��c�zya�z����U>�O򰢅�
�RM#=���WS�&��;��d�([XgR.1�'��W.�D�:Y��SZ�Ϻ��x�TAP�J�����q�]`	u/��۱8]�>�JY&�+9�L�^ӫ]s���ᢣ}v�����M�����Jv�=�mڳ�joy�⾂�@��I�J�h1�	'2I6LW�G�fT���M�,�\�UZ�{�y�h��5�:*��z�5l�/
����R����
�B����fnO.�ܩ��zMj�9n���)S�݋���P�	�WON�#u�@�ʜ	�߿A�'&|��NnȠS%e�`j-`=�\��Tf�T�R42��f�E=�\1c���aG.�d�[Z��_ӹ��t~�	�{1Yw���q�4Ÿ��d�����\G��"}`���2:���y��hb���G���_v��뇈8��GD!Rb��69�X��1GnxI������el�6JL��սY��l�YN���W��Y��t�T�{����}��{��EC��y�5��٬y��Æza�T���8�h�i�b����֒?���i���a�/kh�5�Xյ�mH�]��e6^���K������RV�z�s�)-��-s]�z��bw{N�Bzu��ba��0��8w�ɝUSv�<��������뻡i�s��^$ѩ �qU�6���$����;�?�m-����&�6��)�O�'XaL���7,,GD���O<�h�T7y��(�89�(�L���S�6i�G�O
�'q;�p�RU����ŏ�	l?V��8Jh�D*ic�*}сʐ6�cf5��k{n#��̕}Y��[�4���-�mt6�ܲǘG�Ɖ8U����
4��lg�5m-�E�4)XDq�����:�wk-�jG�Y�(��<�&���G^��*�

76�����B����������F�1�dS뫦�J���_λ��!�gG���Ӷz���2�Ş�
�cWȳ��0����0�6��dn!�<@��3�A�Qn	��X��'�w0H �S�Y7�F��6Ϗ�p�A��g��A�Ԝ�L���	ܫ!���]�����w�Wj7fu��8q�3�Dt�Eq�A��F��E�����ߣ`��<�@@t�O��M�U��[�G�-^8�����E�0K
neBBbŪ��"Lo���g�"��M=
��w�5�%؞�a�0�u����;���1��c�M��cm�ԟl��Lk��j��L�u8Ъ����u�ӆ��r/�<��15+�]|�#v4"�|�7]�)$����:Ć@��='«�P0�����D�yV~$��1�&��0y���^��5�>��2�ȟF�iD0��|���F��J�������xe{�y�!�NւrB���[{r�v��7�-SӢ�f�W����]��6<���w�R��
�T٩�r�b���T��H�Ђ�ش�sς�
�e#	����ӎ�:4�����{�f�j6+�O��A�m�j���A��.`ӇԵ-B�g�K���(U�#�|�Z�c��(�gp'hVm���9�?�韞	2�3�ڬ��l�[�J�:ܸ���.�
��:�P��fҽ�w�H���
��e�c�&h�Q>�}����L�X��]��r�sڥ��{0=�
�Bi��,�J3���B}�`E(j�MޫG(��V�b���P��K����� �9(3�6r^�k�d�~�w�HBK��gM�,m(���-�"���<R��=�Yg�ن��(.3�c��R���t���^[�u�����ů�\k\��bDC�S���Q�S�ѯ�"g��߁����Fi�#d����ݞ/F��s�%g�T����L�J>&g�"�
������~8C0�O>8�%���@�a��.��?@>�>~�a>5��q��`����Xb�e��~��W�5��)�'Ly-O|"�))E�
C�a� v>��h�;�����(
��wa[C'w��ފ��4��]4W�Xä���^QFЏ�2� !&���gTi�s#'�1!E�&�mV�1�}�m><g�������+�C��<�',��'�TD��BRK�#�a���b�	�*�\H�$��Ktŭ��2����}a�.4ES���1�4���`x�y�t�ŕqT;�Z��Y�l�H�psnp6x�	+(̄�Y�ʶŖٶq��
�tѻ�t���[�nv+5Р�Z$t��a�>V�M�:�G`��R�����U�۲�%�w,9X�W6zPA)]��W��ʦ�R7���y��[�O�+#o�:�a� �I�B��,cl�2&�1��B�as8���%��(�R����`�8��.��|�Tn���
.꘹z�T��LY�&4Q{�]l�f��Y�Y��W�/{�ļN���[<:��V�7�PY����F��Gc��-�uXSy��&�gd�3��"�Zh�a��JAr=��?�v�0'C�
�j�`�.�r ����HqA՟��vkN�SI):�+t+u;�F*I?>�SL�9BaZt.ge�~Y8|�k#�!uI5Ja����!= 1�{	��å�������>"+�etA��zO��J��/���{�h�?��Em�����"����N��m0���Y�#�df`F!����1�����kID���/�X�4K��H�~ ���`��h�g5�o�l�|�K�db��c�v��ly^�u�����Q�#-�8�&8��q، ~j��[0x��S�]#8	��]u�;���C}0��C@�z�&��gݕ�!
)1�R�S
P%`��B����oP����c�C��CK��p[����-���y6��%GӍ?+�ɯxkʯp�:3�Aw��jFDI��9w��Q����X;)ͷE�g?;�NCk�;_/��g�tJ���a�֖?_O.NǥW��#��)��TV�yNV�VR��7k�v�lN��{i2��YS�}oj�6BRM%���R9Ǎ�V�@F�1O �==/��`����-jIn��~nN�P1ug��ɍ�=/Sš�"�S�9��dp}�Q}�k� =���_:VϏ�T��J���w6̢R.�wÃ���+H.��^̴F�u�U�“Z��]Q�"�ҐvV��]q�<��}QAE��	�&�\��aBG����j�s"z��1.W���Mk
��/n�?9S�Z%]�F{�z����"*9��D��8�1���Ꝯ�Ѫ;��<]�f
��JSx
�P�um���ʄ�$�C�2���r/����Su;
Ց�}�~�qlpVK2�TO�:�N���S;������^�e�4.
]� ���:9 �Y�|�g�Uх�x��Sl�n�z��X�J��@�灴�K����#K5G04�&2��}J�-R�I2�߫�ą�zG�s`aD���T������Y��5��YSA�W��6`o<�o�9.�1��Q�4�cZ�b��?
ii��Z�Z�yY�!
�<��]��_���j�g�
.�"��{}P�>��_7�A�Q�[��_��c��և� ?B*���u�#H]�#��Q�S�%�a��y0���G߈��7V�zA\��fa[�ɨR��f���{�F]�M����l�0�\z�k?�
t�Iq���uߞ�R2�}/(�H��m��6����K���y�R�(��0o��c�,�T'X����=��K#�QڳE�?�2\2���
np�`Gu�>،K�I@�h��@��
�wڜR
q���y>�+m$��E�n�r�1;�(����pM��!O�$�p#��Y�v%߈�R����^����OW�(}�?[�qL��6�A�M?��^T�4w�ebw.�wN��+î��x���*5��3�F�����nX� �Wg6Vp2_mQ�곹?��h�)�i���
m��']��ǠD{����T��R�<cKl6�Z���Ʊ.Ρy������,�X���ѻ� ��yuh�Pޠ�~�F�~V.�V�d��$��М�ǥ"Y�^8�����TuZ@��O_���fR�,�ڳE�v6QV��y*RK���w(��}�\Pti�\F�A��^��0	���4��3��8~楬>��I���L|���T��O��{j�����I�r��^|Jn"�Z��}���ވ�S�� �3�m��j�^Y9�p{���Yuy���"���qA��N��D���=�zEb�cj�C]^��$���bn+��viɉq2d�.J�s�g拈���Nϣ�	%��sxI�!����Ҏi�wz����M>Y�-aB�ݓ��
���T��U��Uj�>�xNN�)�N�e��^�z��at�bt��[�O�)g�=X�-�֣�؀����?�B�l.�X�|ʹ�92c U�Tc�]2;�*�;/�aJ�K���V�Y#�,m�͸#=O��)ې�V����A~H�1�\Q�t���(������|�n�
iW��<�f`�_.r�~ʼn�n~l�}�QV���e�����BsV���J{f���YS���!�g�ou����9�w������p{��p{�S��噍N�
Z�%�;[�~o���?���Hƍ��/�4�?�B�:�[+���
l^�*Ut[��A8iC�z/�C��+����DCz��X����k*PP�C���^jH����("w�^�Ŧ$R�$sҶr/g�[���T�j�m@�	p��ÌÊ P
���>$��0	�P�7�����I�T�AN���?�=jc\�m�
�06Q�n@�| �n��A�)���9\�;Jv���m��g+�i���UhNI5ڄ�Y���<B�ݲ����
!C�K�h�P�)f���S�[���Ben`�QF�%I�O�&"�Zׅ<]��)8]��z(���r��rQH��#e�<>�v<��'�d��!�F��&Tb�ư+����g���B�U,�)���
m��j+�h��ꂣ�/���4�is��S�
�iZi�<ק�Wa��LV�ܨ��0%٢���<����s����yil�[�c*���ֺ���X���!J�#�L��U]]Z����
|��ihFL�5;��l�^ėk��aE����mP3KH��%`;��gkC��9
�Ӱ���+�p�Eh9���C���`U~x`瘵F&�{R
����O�H��d��1�o�@�`塓Q�R�C�$���pb�f�t�s�d�7^M��gR�>���`�t8'�Xa��k�����5�����+3�!���p��O����i���4�u>"�w�(p������4�1��m��h&n���'izť''�+�V_��)��RQ��(ϼ���x8_��)n#��kQ��%|���@1P(����7�8�%�kjf��J���G?�����m��8��q���qX����<^��Gq�s�Wr����Y����ʭ6��=�;sR��iL9+H"k���s[�!V�쩥�l��)��د�ֲ=�b[^����0�Jm�;1��+��x `�0�8�sLv��__"lTW�V��i�y�RA��\�߈#�4��;^���2_1���B�1I�>�,8w@�����̢�𲁺��7��_��O���9�?�ՆS�O=�x�%�j8Ğ&=�J�zL�,�i���䓀�f��9�dyܹ�*$�L7�EJu[T$��+����N 4?
��ìA���g���p��sKA�Z�m,B�>�^�w���.V��}ퟶ럆K�R	I�GG���iރ�F�������,�)�_���m����Ut���`bW\���s" �p�s�s�1�d�����F�����P`������}'V�gw=!��Ϙ�3
�.n�Ɨ� y"-�����D{���U_��Q���-ZB(�Ћ�Qջl�
1��j��a>L����*���C���Pt��,�
�������0kOI�h�w%�}�"�c�aG���3qsF�m\�P‚y��M�h��	M��G@�o�ɃU���/�@t\���tӸ�J�w�0��}��{��H~%�tp
���H(G5��x�0B���$+�_�P3 VRn1���F�*e��`B��\�E�S�H���l�R?BI	�;�L�~,�
p�p�W�,�Fn�����o������
�_���K��U�28����`7����o�&S��b�-��!QZ��)���z�W�uM��ӗ�f�Z�>wg(p/j��2
����� �b��{�J���6��2�]�橥�l��:I�Ȼ�q��7�@�X��9���%O�'�\�q�S���0�IIh �g�»E���ǜ���p��Qm@����9�w|#�j�UC��mu���<��kJ!��J�sd-T9��Ư|��
�aҹ��	�d�+�_��HF�%n%Bkk~�#A)["$�fJ�-V�r�) w��yd�39��G7��[Fq�n���6E�Y��d��4��`c}B}����E��wm��u��4�O;M�v�>2�cQ6q��JQ��p�/���x���<�H�1�t���3���u����@�U���?���F�[�������Ԭ�^k(�^"-�#^��s7����K�@*,�:��"���#�L37�)[�Pې?����}�Q�&���Xm��3i~t?�!6����(NPBD�<��,?#���
�*��m��i�):+�
���Sf��2R��K{������sb���f��(H�y�z,�z5��g�����JAԶw�{/�vZ_�~�z_ͺ5�8��k��#��E�-�e۶m۶m۶�l۶m�{���}���{ω��Q?fE��̑#�F��^b����5N�[�m��GhӨ��VQpÙ�P�uיH�W?��p+C�K��$�3���C�*��	��l��
b�<��V��Y��8O<;�	V��((�`
�iNc#���專V��
6<�4�ݹ��n�e�H|70��
�z�h_cgH�e�b���f��BK�����	�	��>�|Wy��

�K�Ig#< �S.���0	�­yN�^�ԃs�fְ���k�3nx=�WB�dD��C?|���N�%R���NW��xL���b~E�����[BvX%��P����۝D)����9E"��#�4z ��a���U��‹���;�D�� @�?wG��X�v�5����o��c#���r�T�* �Dh���V-Q�t*�,�B����s����W�
��/Bh����cv6{]����.�
�Ke�� 0P���q�O>B3�#ǡ�K6�
���;��0���ߎ����onb���h~3�{T��'m����]ɩ�7�Q�q��}A�3/�4����{�\�,7Ґ����aA9UT���h� �4�5st�]
���̎����l�5Cl�o����U4o��+�j�+J�w)Z����)��K��Aᓻ�4S�1[U'\q$&@��'L�\��4�5��Ć�"�[��y�ѝ*�&p���/
�S�'
f0憦��L���P/��F�m�����@����I���+�8D;5�����t�02s�`��UV��=�/��Jo��0ul3�����W��G�8��%T+n�~1���O^�_��D�wc�F����\lÍ�Ȉ{���_Tr�g��e�I])l�R0�4�'�m��\1@�� �8]Ewҗ�?��P��d�~�����o����#	Sr�(a
Jh[ �(�����2��Æ
�v$b�3�J���]�
�1孃G�ifmg����?�A��P��ƍ�GZ�:�pQa�6�2E`V�/s��Nz�_��f9�{#�1�ͬ%zv��Sh�؝�M��*����yP$sQO<�"����Ng=06
0�ə�Sȁ�p�>Z̬O��̸̯Ͼ
�⮥��!�s`0(��)��Σ���(����QU���M�8g�{9�B��)Na�H�-�J�!���VHT#��e�B�ܓ��MmH����q�+ni�orb�*hD�Ϸr�z�.֮ z�K�.�On\A�~�w�+BE��|@�3��54�oLU�����,y�X��R��ed��^%P�a����S��r���+�5�*\T@�:���D�G&]�GW��y��
��O��Ky��c^���G�S��w�~��[!Z6n�`��ׅ͛A6�S��:����H:�.�X]��kx�.�
��^��	=��_wA �"u�Ц�4����|r�t4}Ќ0w��:������gD0`�x1�L���J_�I�2�i�F	F���n�0����jcH�ΰ�5��Y>-d�TC�
4�e�=��OVT�ra�5��_B>�Q<)*Ŀ��t�U\�W�K�X��ڕ�DT�&���ا�\��S�-7�A��:?|2�FHZ�M����/�^=d��
H��*�1|��Wi%'c,�Xm�\Qb���eB����Ѳj3aB�H6�а��x^��O[[I�c�_Գ)Z��3����2�
Npў�2e�ˈc�.�2���Lx@
1��	o��d��4E�2�Q7�4�,06��Q�όYsU�)r�I���J��2&�"�-|�,�Y*�Z�^dKR
��@�#oy��V��#����L�T:'G�zȜܫ1h��L~D��\�̳E��A{d���vjR}��G|ij��x�(�T����Τ�dfO��׺��Qv9�6g��֕�N1��	+��T����|
L��۴�.�#�h(AT���t�f�(ac���f�95M�Aɒ�\�[�Q��̮Mn?Ʊ�M)��tǙ��mD�m��ed�X@FJ�x�{C��4��zY�d0VXYq6e��K�hp>���FLפ�A��ք��^1�Y��U��A%AH7�<|y��i��D���_� ��Ӡ��b�l�.���%k���Տ:�x�������c�Hyᆢ�Q
�ɗ#��>=l
������d��mk����J�r.p�ªq'�l�ʼn<
il�#D-L�c�ܴ����z���z�%��j����}��N	�QZ�"BX�rFX�蚍sG53�!njk�'�%�[!+��0fW�+���}~��麀^�?2M�G(c��_T2�pz�)�ي�3p�[��u�I7�s�ޗ��%Pe�����y��c�P�K�L,œ�!�2�2m�A%����̭�=�s�)�_J/A$�V�b���JM@�#*�<�(r
�)1�.ˡFh⣶7��My�X����-%�e��E$���F��5 *����?[
��,c9�SMɇ�{B�5r�v���q3N`yA6G`e�!�b�D`��X�g�}>B�tq��Y���D��
@9f�8Ơs=SL�)���!�3��K��k�!jG�kR�j �`��ŸA��kB�^�6���t��
jo�݃��n�W0��4��D4�E#�p^@&#{�N�C�"I�b�w;���XG:i�k#qG>KopE:TF���Z��QS��8�al���QŒ.���W^�MB����a�+Dޖ�*��&��M
C*���������+ة�)�Dt�M<�g6d܍u��y50~*Ѵ8F�h��4t�r��R��R)z7HF�z�����u-�7������������!�-�d���V?5D���H��
!D�R�B��j+Al��T�7u!���V4,���=4����jf�����c���V_`�<����,�(��ً�6� ������=���ݟ\#ճP���p̐bC��4��e��\j.|�*zL�v�t��X�+V˚��OU�IC��n��q�2�j�5��s��e}f���L�H�ĒL��A�rs�G��vz�8V����W��h���b�Ou�\����L�A7��,^��#���TO���U�$�6*%6?
������:��y�Y7)��8A�`N�.ꎟ�U�O۸������~tt�k
e�#�rv���e
7����(T娢�Q���Є���_�
JVb]��d?�&$X߀?G��`f���7���s�s�u{{~@õA��1�	�
����<�	��Ƃ٥1���*:�H�N��1�Mh��s���a7Y1a���7Ϥ]w��ϹSf�>���3�> �؁ˆ��~��;�>	w+E�A�٪!�~慔�Z.�Un!p�Q�[��2<!k�ߎ�w�9��Qc�K�J���yȇ��������#�W��G����E`_F�' ��;L�B"S�6��bS�9�>������DfBy�n2�=[�_PU�]P�9h��?g�/�*T��\Vݹ����c���2����Ʋ���DzC-�dž�����z2�-�����+o4���H�Xj]J��ˡV�k�l�q��UĞ%�zQ��.�� ���o��1���`����#fan~kDm<y��t� RN����*;�l�����(��E=�����ײ>�%���#~n��Ŀ^	_�J�>���cռKb�wq]�LS��5w�3�1KG4��c�PXeX�B6o���Яb��	5��hbg���%x�B����w	g��O�����W�(���Õҙf+̛�Ϩ��'U�&�#�����a���<���<d�Lm���*�Z��W�:�,�R�K?ݜ-ٶM��	YCll�д��%��4����ü.�'��x$�E�8��w�[������-��	-)��cs�zU�/ȯ=0L�V�W��b`eQ��X7S�7;y}�I��{ŭ"^swÈꪽ�T��l��6 �@�YC�'ʅ��>U,1���}��]�TL4��_<�0w:���@+ �`n��E�5�!4�[�93M'%��ND'Ʊ�T�>C�J�I־���$��y8�E������`�O��\?[�v���ɋJlu{��I��o��
�L4r�T��i�'3� ��F|`=���fb?gL���oB��?6��"c�v��el}��7��]�g�;$*��'
U��h�����^F��f���04���պA�
)��(�G�ƹ�~��T�Y���[�W��`�v?=ߤMgZ�k�j�0g�@�R�)q�"J�gW��UedNX�9)[��55~�15;�~"w�ܗ�b~;"��'�7d�_��]��^2�v�Mc탣��gϤ�{Cfq�x��r�j�f3�VK�
v��1�Վj~g�$���\)��@TTh1��(��ŗ�\T�4JJ��}�Cy.#'G����p��5��&���\���F�M՘�o�؍�]�}I����9}�4}{�<�W�^���� �g��௷/<��_���`�^�A3|���:ϐ�"$���*<�Qn�d��5RH���d���˵�;JȽ�vR��W���[HqRa'X>�{��!�$<�#�w�!�Mw��zÌ��9�^�CBP!�I���1!�$�C�I���%P��@�\�ύ��t&5<ɨ�[�g��[1�I�Mm�ؐ��I��<	�L�H�4��ё�^h�ʛ�x���,-f.�+`��KӅ0)W�S!Uv�+9�r#F���͑M�4T�z_ΛN[xs$�g�*M�k��7�و��<$�8̕�aj*�1�Z)��7Q����/M\|�=��
��ILAE
�1����!�Ė0�-�2U!=[}D�I�N����Wh-����y�Mx���)$o�8uuv��[E��P�@�8
Z/^Іy)Q�t�H͑'Cg;,��dJY�g�Q��*m�viY�U4n����M]d
��[pҏm�����ޟ�˰��օl�N���I|�Ol�����1A�H�%юm-0�1h���Ha>��Q*�0Y3P�wT���j�2	ɠ	�;"?����;4wq/�qy��7�,0�y��e������idB"'����o�����UY�ķ�ى�	n�����oX�X�no>���og}���"&m��q��u��Z_�����k��~i��o�gˤ�c=�YNՋ0�Ii^�o��'�}���´oO��ܿ8�
'���x ���v�#��*�����RĄK��h�Q��&}}�$�>LlL<~�����-2�^`�w@��$�d�o�N��Ҩ�e�N�^k������j
����c��^����L��8
<�&-'���	�Lf��0}�%X&
oBNWY���Eܬ��A(��
�q:��U�#ˌf�"�\�2���mZIH�Z��v�ӁQ�2�Ԭ�s�jO)fm���=[�ҕ�=���\�ع
H���?��:	���M���{�4*ɪ��Vl�����
�S6aݖ��Iŝ)#���ꉁ�J:ޣC�?�!gy	�5<��'��kYU�e85�<gӬ6��<$�q�7RZ��TH��lb����	�>0<2�1�BU� /�4k����Y�Dڿl��&Z�_�ȵ�+j,���{��5CR�R;����3�i�!�}|�lNZ�D��5w ��BJ�0p�E�*1u��B��]��.h����0�E�j|@�d��B�<�����(80�����t#L{^~o�'��uy���t|���
��+��S6]�u�c��g(��yd4���k"�E9�2r�ť������8�ڇ2	yG�u�gìW��pkv!:k�*ͼq2�O^��YS�u�����#)�[Hƣ��_w���#�J9�)乃HjX�)[��(�4��n
H�Fo�JHɶ��Y\
M�sQ�)�H�'d�7H�\�7�����Vo6Q�h��Gљ?�k�Se���W;�.�V";Ӣ�[��]�e[�i��V�3���P�|��2�1�I���y5&h^}�D�Ju@��\��~JhW:ZK�ѡ>���z ��Z7_U��X��rDo����g����M:�/����
̊;Un��X/4��"ߚw�;�{��Ʊ�1gMp�/��Ú����mO��u
“3PO��k��XH� ־$X\�ZH�
�]��@��P�+\�Fɖ�x�Pw!�u؋9G]�0������n0k����tN0�an�Y����r	�Ԅ~?A��p� i�ۓ�J=�Y�B}�H�2�&H����Z#Z�:��"�]��o]&�"z�����S��¡�.
}�a�(��@�_��uu���cX����9JO��c��#z{ݦ�`@�A���ۧ������ugA�$s�Q��]v��I�PUʞ�B�H1��)5�Gb�T��tG*/e��pGo��xǶzk�s-�s
���ˬ��۝���-�����?��#m&�;�k9�?3YS�*|U���TPtH�PX!gCKe-
�[���rB�� ��t5o�hWKW��"3܁20���SN�3�=��q5*Q���6��Y�97��9}��� ��ғ7�>���dž�A�bG��~`�E�

rW@IĆ�2��6j����K�qB��fz!����Y佖�remʩ�l5lm#���.=�� k~QM�A�;(3��,շ6��zƔD�)[��f#|�m0}�a�G��ƽ��#<���}jeK���[S�ɻ�y)�!a.$ZN��3t���HbȗY�i�J@�QZ�u#�K��r��}>f9LH�M�:Q/�����U�=�$�����t�K��Pʎ���c.r�r�Dg�d3Uy�;�k�{��FI�U�K�r�̏�(>*ym���Oj�bK�;��/��u%\�!ę*wTS�z��{$��풊O �8�G�F�BQ�T���� -�K���H�|L70�7�Q|Dק��S�H��6v���#��=%_� "��*K�!�x]v�Ԉ���;9����j�zNv��\�/�Eߵ��/=���u��	���G��QcHl‰�2Ay������9d� ����i�2TŒ���>�ZU�P/X��ۓۄdk��v[�6=����CJN�-l�j��
U��(��XYů�Jos�8�fKV
�'{kD��Cd;��K�9sOo@g�N�6�%�;"6����0��ڕ�E=��y�I�l>@��I��=j��5Jr|�Tբ���b��C��N~|0x�C��ȅ���$���'9O"M)��˘��K��n$�pJ���Z<�L��!A�c�.^��g5������U/��LOc��l0@��#�l���B‘>QXĄ�
����u�D:"�\�J�C%���܋It MpX���灄����ʭ,%��>-�qh�f�K��p\`��n�3���`Jb���K�h�,:���g�25`�e*�5;�3�-�©�
���(�z�E~���P��*�����卬L��mc��	�}�F� ����1�Ab~4A��P�\���hdx6ԮG^^����0Jtk��FK��T�mͦ�vK�������W�1�����?��o��x���W	ٳ���A�y�C��2y7�H���H#J�?L<6��8���ynO'�M8&����u1��`�&�a��>����M������x��j�è�G4 �Y!��%�7��|[}q_�C6H߃����<��
Uy7�@6�+3kO�Ne���5�3
���C;̽�_=����[3���
~���
�A�ٰ��?]0���1&�ə|&�͙��~h��M����o�P�*��`⒌	��T0u���d65Uʊ�חzwJ��T�zc��ы`,i"�Y+lU���pc�aE#�lp�k�Y.!���iٺ�G��*h�ܫ�k�(a�>l�q��N�ljlAs��*��Zi�((h���f������db�"��X�@°[?^-/��U*[���sur�]�M��5dV�if6q���օQ�r��B\�g�ZQ`����""ƬJ'���"j��]}2a\bI����F[�C��s��m�)��RŶ%�8`��O!�SR]K����`#�V�]y�c�[���g��e�^mt-OM�Mg݊�+�X
$�a�,EllǢ�7.j]i�)�!��5,�F��Y.�D�	ِ���7�P+x	i��,����+i�χN䋑^�[	�V!�����h�;$����c�b;s�m_�\s��=��иO�O�7�jeh_G��y�&P���6kg�h-��/���).!R���W�����ئۈXޚ��:N�1�]����V4e��HKM��Qv݈��$�1�RՑ��s�(ٹ\����[�j�e��-�ެ��}xN�mO��PD�B�?�t��-폅�\(2������*=�x��p������TT*�xZ�U�VR.�i�,Ghk(�"Ud2�
Jv`��t��U���m��.l.��ccY[���[T�+�.�R�xx�%m9)�nQʪ�ĦB]� }QV��u�Z6x%7$2]�Մ���1���	�l��j~X��$l$6��A����$�3��<���<7�H�,�g��ӾiW+˴�۠6ș�0�I�./i�˕�rÌ0�	��������XX��t�"�;g��{��� i=�sgB�-����ǭ5+e�Th�(w�L+�1ړ���
i��;��Qj6����ch95��pYV�jl�iV�œ҃j��Y�VDn�h���¢Y��ذ�aP���g���="#������b�$ZN��'5�U�8��]@��0}����K�(�dQ��*"L�h����J8��4:��Ik�Ū�V�L/^���-�V|�f{3t�JB��F5,ʹ��j��U��t�cl�������SS.Gg����r"	��)�p�8Db{��/c�tGr訢v��B-s�_�n`%�7�r�w�eY��+�D�5�
v�-��ml���kE�-�&!�dY�}�Ϧ4\�"�����5�[-���ėԜ�MvQ�A��O��:�H�|y���YT�@�ʻ��R�-q�����'@ϧ?̒P�^8�T�0Vw�z�F0��޻
�|K�K�P�'KRĔ;23y�BKZS�D���+:|�eC٬x��iJ�[��� �,��
���a�}����Ϻd6	;gCn�k�5��ʥO�E�9�6_��^��S���Yg;��(�3����g|��a(�n2�O�������@/�V���x/���@p,�v�q��b�ta���ӎQɋ��ӷ�!c�N�w7�c�pX����>�tq�it�&�ɓ�͔��#���q&�Y�8#iB����&�wG�T��ez���W�"\LqQ2@:�,&����+N�%[��uL�F4�WZi�:o /ѹ�0!�>E0��4�G��G*�'S�#TʣQ�+�U.���%V�#Uz�\��Xq�^.�Z�G��'Q�#S�*�k��U�S)�%�%UH����N��
bhy$m}PJ�m�/=�D��͘��ďyn�l�DjK|��˶�Ծ=�m�M�lcFF��8L�i���PR��H<��*G�lF��i����i�]/Vec�9O9�G�/.ص)�%¦�Y����¶�J�LI�Lq=�8_۶`�P�bqY�8o׼`�T �ZK��X��cS�C$�E&�%d��k˂r�iԼ�f�⼗M�ց6���HIxscG����m����\�y�L��{�
�#Ӷ�����R����E��Q��U����&�ԡ&��A���Lc���G��9n�u]Ԭ��7�Y��3~ I��0]39c$_/p�s��c#�_�CVԋ� ��6����){���Qys{�b��̅�;I_����PG�[u��j��-�
��` �\(�v���X@���z�&�z��z�UC�fCгv���zp�}��P�;��/�X�AD��H�1�;<�!�v�%X_ݼhfZ߇\���J�A��ַ}��d9��(�_
�2���˲�'lѵ�p��Fi��*�g��lWa]�v��֔�/C�$�
�X��J��[4}>�{�}]���HS}+�ЙcG�X9IǼ�`�d�ߘj��4����٤��I e,��i�)�TH�%�٦�r�HeT�ԑ�nAʼ)C�^�c�4"��N��N(S�n�j�#�-nr���ry)��SS��>����`���l8n(Ζ�����A
�w�x�D{��Q�)1u{��̊w��4�
u𸠕-J�bT�`Û��o��b_�N\�[Շ����CPȈ�2- 7`C9 ��i�h�#�)M�CT9`7ﻭpDqr���c��:@��qDx8v��J`聍�;y����Ky���;�Ĩ+�����
^.D���hz0���jĴu�R��ꝛ�$���N�����L;������kҲ��-_P�_��~�
���!�ܲ���2>�5���/��.Ctn}6���R��$}�K��4'z� ����X��_P���X�eɗԀ�Ӈ'^1����$���3��R��ɞ˩�;w�̳��T%�����S-a�Q��Fu��S)G,E|��� �xc��	`�C��=�M���d��[P iݎ�*�.�H�_$Q!� @M�rQ7?�Uf�e9�����*&���-+f=������ݻC���
�Ϧ7�8�(s�
N�7���gz1�2�8\Oc������X�7>��<��9gb3�Aw
#;���		
h�\�����v�[Yg�zA
TlV��lߠ�x9vzV����
�x��QiR�Ih ¬=*��a�N��'���T�UT�E��[v��^1�l���]�aq�6V��w[�h;֬��!~v��-?��8�X�8�'�D&�i�Rq�q���w�y4ч�f��;��W�P�w2ѵ⺩�R���S(Ze�+�\ƀ����������9�RZ��Yt}��=\D$�� �/�+���=lF���Kn0�W���(5�sT"R��5���
m�Nt��j�Ϻ�^�����)kJ�:}�I�!2�}�V	��UiNj+3�¿VE��&�%Ӷʘ+,�p^��q㖋����r+t��;z��r���eIא�g�M�������uz��=���r�D3�[F]��,]��)'M�\Y�'�1���8��^}B��Dg�uх������R�;�J�m1�+J6�p�φE�6?^7�&N�ҵ>܂�k��߾��Wn��~$�V�_;U��m4������:Y/B�$8���M�"DΏ�n��]�G��	��E
����b��䓃V��VI$^6A�C�y�qR�#��n%��_�{yj��W�D�
u!�^5L%��2���<H���N����SݠH�en~+k�����-����aj� @�?o�U0t24w2t��/�t�� J�I�	B0�X�C8�)Pva3��	!�|e����Fᧂn���I%�~�;M�?r����#�i���K������n��z���5��{�0� �����Z
D��~4Ъ VA�;�z:OAA���~T�����ŀ���+lߓ�����ʒm9�<���U9�O�kկMC�ʶ�S��Z��f�J���*-�-]X��K0�IK��XZ���7K7��+���`-��%���?V	ׯM��cp?ڻW�lR�9���'�X`�r��S�J�X�Ƕo��Z�K�����.[ ����:�����:�	<�E�E�ŴU6]t]�#��f
F�6�t*W��	��,j��'irX�T��mƜl;�Z5f�{��ŏjGycAcEa�"O�u=�	���u�M����Nm'!P7������J�FB�2�ԣ�ě�&�;���K��l[߮qw�c�=Ve�b���@���� bx��u5����'�A��s�� G�K�/h�h��&�/X3���̇�=/�ٽKԼ����۾y\[�mr[������}�7}����CW�b��Gt�V?Y�?R�x1�>����c���&�M��Y���d(�sI�U0:i�%_�p�J��&Y�T�&_�xFiu[��⨣�3_���:�jn��I��z�7�;4
V����}4�پ�5>���'@���(�L�N�Ʀ�Ζv�v�.N���uR��K�Dk�N�/
�HE?!r������}���@2���8��[��������]Ґ$���D5�����0������d‹ޏ�`S�:҄�S� �Q�z��,�t�Yc��v��N���g~d|��6l�ݾ*x[m�.nV$��3c��c��.�CJ��f�T�u�yN�9x���\�𞵖��*��_��/����aA�f�Z�tO�C����[<��*�K�F�T�7o�e�k���$U$!�C{�X[A�G$-��
�C�wϒ�yzWv�.f�-��p�5�۶�g��p�}� �u����K�6��g������eC�`I�Ð�MO'�T�'�@%�y��j�^M\�W��u��b�>��8�]���wN��8�i�ژ &P����V�H��7L�H�H=�=�`91�"��R a��rc�CFP�M�At/,�xm��a��������+��ߠ{A�����TÏ�t'��K���-�̚�4)�÷�3�7�5~Hb	���M���
?~�%��nb���5�0�0����aW���Y���e��2���S�>�%	���̏�υ�M&錬��g�M6���*?�(�NYH�$TH[o%a�4�Vt�x˅q66�~��-�>wt�1�P���;���Nq��KR��Ä�t���k����ro��W�q�ޒ?��b-���)&�I�a��8���D�釈���bL���	�N�YM9�<[�3�H�ɬ�pt����/����c'A!�N3��x7���� >`ş�p�P�Ȥb�ɒ�U����.<E��Z~ҡZ�@T�]����R����_b��/�\�͆٪(.��p",�4�"��S��W�����g-Jn��&5��-O']�ѐ�M�0���P�ٖ�k�N�[K.�3XL"�,�>_z�h�T��x1۱�D�����"�n8��l�&&6>�j�JA�Hyh)�SQ���6�v��Ϩ�+�^3">9�\��A�u�NU)��7lF�ܦ���K\��\	�YQ�"y.U
3<�Q:3Wa.��
���/3]�j�N��F}-�m�P���N�iq�=R3�2T)�.�T�+k��T��c/d2�HJ6�k�7�l3���Z����'<�P�w��?5����!8�!92�9*c�;L���x��g�v�I�#�VF���4���=�	".UT��V�>���&�l�2R`�_���N��b���_���6�Y�8X(Hd���t4�#�T�s+���+�@a�F���9���)i��^.��"L#�>�<����R[e}�n�O=buk�/D�S@	-]�6�TJt%�H�sb����y�b?����,�B��U���;^�.�uɰ����:#+H�?�H����0:[x�Nj��7�D��)�A���ފ�*��B2BA[9f՛Ȃ*>�!���)_�H���%ӡ�B���'K잨3h.6�� \aM1��|��r�������K+�wn�E�^�j���<�g3��V�l���
���o�^�q��e�V���o+�����3[��(�	�BԷ��Op��3^�`�:[�t8崴ž_N�9.r���S/uG�s����7��k~����e�+��i��u8ڟ�rx��kɷu��yA��H�t��:�C:�	0*�bB���٭�>��%��(�<�q-���B>銘iz����5䵆��rs8�f��UcJ�M#�F�1��F���4�A��𖱠��²�8錉{K(;�6���nE�)Cj4�9hJ���$\h�y�OE��+�㣢�+Q��s���rF�E��.��!�~ �f��DŽ�*�#������
�6[Gj
VD�4��ĺ
j`�l���j�6�p�
�V�n+u��ç4�s�AV�3�\�w�.����-
�d��r�e2�a�G�t�~��$�vZ$SܬDW���M}�f�ag+�/(ѳ���ʒ��!�l�U�Iyf$:���?�^K��Mm���PU[g$u?54���|��#�j
�%�,�X���
�*�q�-@����R�r}ߌ�8ܭ���m���p�Y��n�S��<��/�}(���QX}�v<av��!��C�4�R	�S�PO�{��ؤ0{�?r�Ƣ�c�q�\�k
������|A�����4:�V,��O]�����
�,����V��r�W��n���K1����N�veX�2Vj���UL���-L��Y��+�#h�p��k	Rdj�Һ�,�#����ܷ�[�[ش�Id��ZVi�O{�`3�9�#��#�)����x
�1,�m4�X[g(`ݰ�_�yk���"O��&۳���T���)8���a��j��dw��7X���%�@%}jK���/q�ry)�n]۠��b�j�!"���W�} G�nת�E��9ثyX�[�>�组�X(��,4~�{֚���a���d�.�@;���� �_!�WPqL��Nc�􆁃�
��ƿ
[��Qr�l�"֡L�ʓ�P�uHתC�VJ[��Ƶ�w�
�Y�v��uu��/P1��ݶ���A�X"����E^�ְ	�GI���s6�CV��}�vG��P�V�k�j:�%{���^����sp�e6��c��n�u�E:�Ԋ�-s�e�ؕ�uZ/��i��H��8QF�6�-�D�EJq.��{����h�g�2�-H�o�TJl���#�D�`�����O���Q��ґϳ�ޢ�ކc��^KC/���+�&Db�=�'��0x���7�r9w:��;�;�}��4�y&R��
�1QaSΥ�y�P6�o�X�BN��C��h��c�����+z���w�ߕC�F�K�'��n/�|ɛ |�)�5���p�d� ����hR$T��^R��>�%j���׎��gΐ�J�n��0��׬�c�Aݢ�.�e��L��9�9�!��>�E�؊��-z/�f��|�hPA���V�s����j<A��p$rF�����=vf���[�����/DO�u�����	o��7��Gp��mwj���lF�A�{����s{��uS���ث��x�I���BxQ��$'T�L�3��ugs�����d�՘���
��͍�M�.M�L��_J$F@�d \Q.�r��>����^�� C�e�;3A#�����bC$�(�(ɴ+���=k�^
�yf��Oh�S ���
yIQV��$�<.?�Kw	my�^��RYN7��"+'��B�jz��!Jul�XS�?�ג�O�n�5��?���]<m��M[e$E?:��E�()33+�җ�'2#�*߀��WP�m043w�R����́�����Rgwu��a-�)�o���\�>@8�(W�^qpz�"B��6��@�`���5��cxV���/��vx��0b<�N?2X�fy�q�I�$9�“W�f���9�WM��D%X΃9�n���w�L���ƪ�k�Ru��dr��jIC�~���|�h�6�EpՆuX�tE��3�x��e��sf=�	j)�$
cu��1t��������Y�~ƺ-���V6���ʁK�*�W�����Jm,t.���
����[e��T�rŸ#�椆���茔H�Y��pf���T�ءɽ�9�c�AH���E���u���i�N�v�G#f�n��f�?{:F���5f]�Vi�&�*5H����G�C|�� �_���3���p�}+�d���u��/��J��r#.�"G������n�+�0o�׏��b��)z�qd�(�`���d�Z��҈I@�8C�|Am��z��2���U�����1���%���>�ެ_nt�`�O��`����_W4�ulFG>�tA>��{�<z��Hm�$��áBNJn������Ѕ�&�Ɔخ��[�a����/a�ܥ�}�>{��� �f	N�H�F|�dsDH��E%�,T#R�d!�5_ŊD�<r�k4Ј�R�7�8�}CUR�f����Gl����)7�^�bhdc*lo�jk��[�8��Hd/��NKKB��	=
*��(U�@ʓF��4j�S��tQ����(�c�Q4��O�f0{������51U��q���uQ�I�-��<�,��UxT��Ȧ�?ȏ��GV}�]\�#{�}i�vΆ��9/�nl�y���9���3OYJpaq3Bg?�}?ˢ�D���ی�_�
�t�X��D����MLj�W��p�-��%�j���رfd�c�\����ƶm�NǶ���Ķ�۶�tl۶�vl'�;���;3��߽��q>U��S�^���^+��*-�B�2��aW):eʂ9K-���)˩W�~�ְ�
��I[,z=c���+uW̐���[,���֏3����?R}�h^خ�=t6D���
ͩ���0͊7T�(p5�~�j	PCl��hp�{X�dt; R~�7�a����wyk)x]@MWj�����Օ�e2�"�z0���֫�]�o�Z���)E/�$CS$�DcQ���
��f0d�n�=����|�H�����8*�6[������ma�/J��o��<��(݌$�@�p�9�
u�pu�d���A���V'���~p44��4G�2���5^g���ϗ�;��lte��{�!��
��hzh��%��!�xnI'EBڟ�/�~�S���%�T}���y�";ra���:>M�/!I|��m8f,Ǎ6� ���v�0u�1�V�d��ۡ]{��O�4[�w��L��0l���\|5[^x�_%(�N5��›ҏX��UD��f:�Ǝ����}�	�I�0}^?�F�R��f���-�~čA�j�dF���}�B��e���?��?k	[�q�v�I�肉��4!���[�Yo�λ�&�КdP�֩P�P�!DbGC�#�@��W@K��`1��U��!w8�<�fG��o�R�b J3݊��2�n=Q�b@����Ĝ�@_��8sRVA��J\�
”�lH#��^��� �H�p�i�d��;�~r��_��m@7��"}�.{�ao}�JX��D�Y�������)Q�w�D�4Ϝ�]1�2mR��0<ANK~�ZAʭ�[INjS��'�dgڬm	×=k^#>����c�xL6F�^G�O?K�n��%�x6>��<��_���?^�����sCvB�����"Q�����GN�
�ૂ!��&ڰ��5�h	�:z=�Џ�&�B��A$e�����7�<��H$��l�3������`xĎ��|��;���&�����N���߿�6�b�t�vb�Q�c�ԠeG��hO�=��-}c��)}��L��{;
��
�� �N�^#�Nz槆��zDG<?�ߏk�Qp/I�f&˕�x��9=�G�E�tiGY�����J������E0V�4�|�o
+#�p
�q��m&�߻4��0���e\�I^o)��0����
�ƹz���W,��UY�7��W�%��B�����	�۰'���=���`d]�iJ���k�5���Z�T�|R/�y͡tI���$>�a�9@�㮝�2��	m[w~0M��x�����J渝�M��F�#%��qR�
��cW��?��tf��i��!J�NK�U��i��~�B����XI��G=r�/�Çt_�`���}�E�N���*�i{I�j�Yw�
Y�	F]0���5b�a��i�� ���g>��,��kLC��TZ�D��DDB�om=p���cz7Dq%*�����P��j:2َɈ;KG�d�};�����&N򖳌d2�AN��Z��[w�A�VR� CT��#�$[[Y|�}L4T�K��"L�9
��͎�}�ԇ�+��}}���֙i��#��4W�y����E�11�������"���d?�q�F;f�3cZ���I�3E��:��E�%$A�<@wL��
\�W'�E}�k�xșՊ~��,N���s����1"nWZ��2:~c�1��p��˶�I�8�!�ۆ��	:k���I;G_>���]�������q~�6v�ݲt�g%��v H�1�u�ﲝ�XM��b�ŦB�-�3G�n�^�R$�I�J�*8�cA�fb?����P�g@���;�go	���e�Ƌr�3�A�%��z�m���]�͌-��k�˴0F5H5G�� 7��X�D}�IeZOM����1�K�x�s<���E����o���uN��s�mms�����&vƓ��GT�m�i�٦£�j�w8���xj�ܰ�ֹ��6dIAieEa�ʒ�8���y�[���Sc�w=��v���E~R�`��P�(֯+�#���0Nj��
M����'`O�:��&�s]�!�%��f�@��>(]���ma(����N��6�g2��^�(��х���X���^ΤdL�Ŗ�(�e
�/���L���q�����(�!&礡vM�t\펖���?�d����!<d�O�]<�8�T��e?��^�ڽvv,ݣ`4�?�J
N3"h�I]H���Xe�: �^зб��[����Ί�����,@��p�㸼o�2}��z_h�XQ��~Ӽ7��@��0S�E��p����A(zR0�W�A����r[�E�D���_�p�u�q��y��z�z2��?� �l�k�B�i��@�h

�Ҍ�����M��O����m�h�E���]O�;���_�o�j ����Y����h�<���в�����*��b�B�hY���� �a�aQ0b������A����A�<#"X�-�2<��Y�i�3��k_Tbi���n���ԗKrTⷛp��כ�	�>�"jt��u���g�w-��OˍE��.��y�tqu4
Q���+�Y=9���X�b͈^���"kY#���v�c����ϋɤT]/�w�A��>�"�7q ��gR''�I`Q��W���F��f��ت�7�v�6��>1�3!�Ϯ�N�v<Uݖ��5����J|?.����%�@�1;._v5�d��ZHT��G@�o&=��45S�J,��� m��آ:i�*�%�|!S�E������ܺ���J�ko�4
�-�B�j~�\��q��X6$�<��*�IJ2ra�c�k�#��Rc�g`yv�l�nK����	p(1X;B[?�j�?������]����X�a{0ɣ��_1�w%�N���a�1��B�� Y���X�rl�Ø�]'�s3c�&��_x�%}�.�a�F"g[N��hb�v5���|�_��^�x
O��8Q�Ɋ
�L��S����y�T�g�A�	k&V�|�ȺSхF[�����*ǟQ��VCWp2�:L(��L`���нS�
����0YJp5���Ðb�Fʾ��.c��P�ᘏc؃�v�c�N��,��a�]H[p�h,��{m��N�*��G��`:������*()���S��9Ep���|��H���ů˪����Q���ͬ�G��ʖ��[{�w!��[�H����ll!�1���/��dui��~��!&g�ꖛ0U�..�U!�s{t���E%M�K�O����t=&Z��r��0]�&xaA�ꛮ�o	h�����;����;']
�v��'�&�F�fUW��R&�衹r� ԋ�<.Y�ʮ�kN���m��ɷ�j<Cu�6��"�v` G�1��B��Q�AgQ�� �b�R�X�G�q$�Z��gI�U���y�v�D�o`�=�{������3�b�9š�d�!��8�yGoD����[uA~ :^=g�l	�Q��
����X�d����L(v��}a��uAc����1��.C����:�R��S��@Y�a�
]Q���v�i?��)���%
�48��UF�W\��A	cRA"(g�k��Ipi���(g�0��^ڞ��j��^�w�ʉ���\wd+�H�J�������k�_��o��v��T���@��o���`��Ӥ�=�S<m*�+7"��8ww��������W�D�[��{��`��oZ��]HE7A�u���1�7I���!b1s7�9�<.X�X8>`
V��G�~`��#g��n����{>�G��{����x�9��{���hzIc+�ŵ��l� o�t���==�ExYVR^�2��J�#�]G]A�oM{��SRQ��x�7��ﲎ7����?�jC�-M��1�a�Ӷ8�"�#B��=�

D��Jw�J����vΈ_�k�68�f�����u3�%n,4��z(j�1���_|#I+�s���z̙N�;@�P��U�K���K�f7"�Mx"�ja�6�E�3�Q��U�
M�M�cʒ2#::��cӊ�Swq���b�N�Yg��"D��*r)���V��>�e�Q�Dl3b�?��
~VD9�ȸ	�fo�2�8�]��"��\�
��c�mZ�+N�S&�FgB���age/��'A���X����9�єF��b)Dr`�ư\CD�3R�P�	]����Q>����	���T��Aح�*f�A������Ayl�q�Ƨ�Rm43��G��#W��V��-Q7b���Y���{��`�E�h{go�B`|�x�l���f�js��Q��鏟��q$�ݶ�H$�4�뜲%P�����Y�v�7v�x�kK���I�kr�
�H9,]�UV��^��p�MQ���.�
�Y.|ܮq�o��!��2({�\��tU#nLx��wCٶ��t��o���ˎ�N�+o���g��\:'�I��_��l鈨J���D僲�]���p&#�~x�
47�N�����W�;��ܨ��e��f�;�	�T�A�!�t�l�R���o��6&aG��EN'��!�K�Sȁv.��s�a���Ǔ����F����&����v;.�3O�[�d=߶�{ڇ�5vCPF��F�[s�b�,�`9��t��n:5�7R�d������J'XQ;����d�����,j���o���}�t�{�3�>7�</(�]ƨr>�$=:�BR��qE�&Ep��r�I���s�⭸s+I���ʠ����J�6_g�ޜB��Z/�D�<5)��-���؇+
�4ƒ��b��7n���c�R��B����ssH$6ɋ����p``vP^��F>V�9kX��Z�,/7�/�p�ҎrB�N��k�,��V9ڈ֯_�:�����o^1�5��DD�PZJ�V�~e�&B��ý�}W��©�#ms��6G��K&�O�=��:./,�n��R���(��E��`��Qtu���Ֆ��76�-�a�ʗ}�zD�_��0���Jx��~~� ��0�+o��k��8�/��m��	]�%M"�+�T���h>�ZK00� �R�Õb&�rV�oU'@dg�c�ߍ~�jؠP@�6<�Jt�~��}��u~��{���CDD��Pu�ӆ�d�`F4:I����K�"=d�T��s��$Ű݀��#Q:�FFolGY}:7�߂�I��'�8:#��
�8�]U���6��5L���H3�kE����5Tn�õ#iSN���f��d5b[ne���4���k����G�g�i����iJ�]&]�y�h��+��i��QP�A�`�����(���8�F[c4��ʬ�ԣ�������n��סn���x��)xE,�}:�4�lL��͖�s\�w��s��YU�
��֑$���d]��K���j+��t�����xkr
1���2W�����?�����W�sV\���萺�5|:w��K���2#0n�@T�38�3ma;��S��u2L9>�ѳ�ڪ+�4�#���*�Fg4��Ǹ�ֻ�KŔ�FLg�*{�"�4DF�Y6��x�t�.�R�Cg`�Zſi�*L�W��tJ�X�X�j%P��H7(�a���V9|�|��F�7��0qt���5���T��ۡ0��(SӲ�ͬ-z���x�Ѻx?C�ʂo:|&�7�Ŵ���Ѿ�6h�^�a�Nö�T��%	���g���dkoޔc�9�rی![}��G�����	[�T�����EK�"i/�6$��x��9r��Y�t��z���"�*��8��vz��M@3�m�E��P���`%>k�-�%�[�����/J��J��_���!?3��VjA.�-�7�?�@��WA�8y���S`L���J4@D���C\M��4���>_�h����b	n�kN$�3�u�i��V�77a( r@T�I
`���W�c�5��8�n�Rj�P�����)&)�#�E[�����˷��.N�o`��pm�k'����ۊ�^𩖗h[[�
1H�8bX�n�Lh��&}���B�A!�x�n�@�����AH�oD���n19�ȸ��?��[�qR�w����!5�YrxF>�HԹ����D�tn/'K����姱4�WA���6�Z��[{N��*�({�{g*��ρʏ�U ��onE=!���x<��������3��%�bw�����W�(P��d��������v�av
I�G@}~<�i|���K�X�R/��ƭn��G��ǐ_B��ީ>���_� �en�ǿ�<Q�k'����r����W����������I`pؙ��D��O��7=��Kˌy'��2��b�f&�EpGi�T�!�:LSZ�	y��� h�S��٤|v�r�d��ъ-�id�T�G�ES���q�(þ��@M�a6B
���3��	��h;�	FB����.�E�n����Ә��NDw�*��l�
�s3pP�Y>w�]�<坖�zƕG]Ϳ��Mq�G��,z���E�5<*��-+k�}%]@�����B�?D�jF�pg~���F#���5U�'�� �!����3TI�نSm����|�L�8�<��]�q�
��ӎh�%�Ჶ��
�Mɟ<��d��4w�p�����?<���X(� �=d��!��s���$�ԣL�!�`sF��&�Cb��@"�� 2G��U���K�F�D$�]#����\��O�ix�+��;����T/u+u�E���H^����Pc�W_������W�j莪F|XI�ہ���U[�{���)偺[b���IGp�Ϊ�9����
+���בID��\E��Ĵ>4iڹ��Ҥ�M�q���cϻ��o� Tj�|I
��фH�,^ӑ`��^P�5T��X�iCd����ׇ>B�O��.^�d|]�8�9����5�T�M�P��7VI�'�h�����l]���AeR�t&vR�fo���8	�&|Pҷ}0q��$��tr�B�f�_��0:$����V{��.�K�y�C1�25n�5���d1y��rs,�3���}C���^��ɤ���:R<�|�O���q�x
�si�1����3��ߪ�����?]̨u��?�'KO�d�Ƀ��M����/�ģ��%�0�{}0
;q%��x��?KG��E`��0[�$z��݊�����ң@��s���Kx��c���
�'{�������xɡ�&
%L�.i�V��F�iҦ"&z�;r!>�\F+��q���p�e[��{�U���ӊ=H;���	��.�dn2U.�'�ɼ���pq[��٬��/r0(���Ο|]
m���4�nɆ�ggY��'�>u:�u�I^cg�=� ���B<�-(�m�d�2���x{����j�~Zh}�s}����f*�}D"q�J�a��hR�`�̲�]T�oO8^U6��{�#�R��^1��'�)�J�F�Z�&�LS��R�%Ga�"�U��Q)�[Ȓy��{��e�v�X���#�r�m|ZA@n���[jp���q�R��<`�/X���9ܓK�46�Eٳ��'MH0�+�Kߺ�~�.X��͵��a �"!bp
ӫm���5�(�W,��'W���5���r�]�gaÎ��_bb�r�(.zE�E�Max�{���wŃX��4'�C�@A0]*����'�r[�A�)���t�D����.��ƍ�V��\X���s�vg��
�����%�u�W��!za�1�q����ՙ��j�K-�en6Ёl
�Mq���gn�&�y��˫��n��,&WA�D�U*��v�d-��(8�?2p�6G���1�F["V�R��Iz�Y�����@X_�U�1%T�$ߢ1�-cD}��`Uj�.Q�Y(H$H�e|�w��K�-�+��ۘ��U�̌\m\���H0562���mK=�
q�O�fr	����j�2���b1,w)��c@_�چL&6ԚN�,`�\���@�.(�.t�ev�[I�]!�t
�9�]&��%���K�����U�9H�^L-�p_(���M���5]��e�|�H%N]��=v�c��e���Q��ޒf�L��]����l����[�u�����O)<��!UO�b
ɣ���lҨ��u�'���Z���1��c7K��?�{Cy@å���t�VׅmNA�QA�b��+�|���惞��=��D7�|�s��_���g�w����bJ|�`CV�K6A�N�KFzĕ����>=�i�B���Ϛ��1��P�3V�P�q��䷚��C>4�(�p�T�����fo���"�6�7�$.����Ƒ‚�M�H$�_M��1\�Ham,�=�8ltQX�i+[*����զ�+��ش�:L)������^�̩���iB��x�,�A$~qU~^�	4-��E���I<��6}��
�	.g�K��t?��u��o�Q���Wܔ�j{��b<^�fSپ!��s�%p��Y=�[�b�c@���b��n��B=�2�B0y���Dpn����5������9�5��r
��*g�w��h�I��;��X!�O;�<�o$ߋ>�A_lo�x%��@t�)��?`."��j�+�X�0Ƚ�P��]ؖ�,:���b�&����C�E1\��e\8��:)L���Ձ�[Ő@'�!
�A|#D�i� �˺�ڜ��Gk�GHA&[
����R�5gWY?��`���
s1%�H�إA֥T�O�2�<�M��Ϲ�`w�r���|w�UHF/A��Pgtl�U�����������P=b�B�Ei>u�Bh�J�?���/^$X���/`e�8;��
$u�%a��˨1�!�@AA@�����3����B��9�?t�d�:��N-Q�|�2txcЊԢ&�t� ��-��A�:��w,t4p�^)RCcP(������Ö�T�*�0��bl#�~"�NU�6V�/�.ld2��������^Ҵ�b�{��C5Ƣ.�Ȅt?+6��`
�/	�eN�4�L�����ڦF�z���Y�9?-��"1{��	*i��A�fǧ$iN��٭nj��jVK��65�'�ϧ���M���uOS��3\.�����@C�I�
4jn�9��{8�$t.��-���芷�[z�lH��X>�ZKe�����
FvF�<����CN!_
Y<n�^y��1
^ҪA� ��Lp]���e��ܗT[��K렆�ephȽb�f-T�2p]���oS��ߎ���b#�!ɖ��5]��T�Uć$�$�1�YlnvT�5	�X.BF�)E_��C>�����4fp#��N�ĺ5wLj����X֒�=�Κ��F�H�-����\ge����K�T����e+.d�=�?��
�u˷�L���'�2���Ĉ\߷���L�ܴ(`�ba,�ȵP� �իp�G~~�.W*��Q������fl�ð�lm����16�7��	�=�Y��$ֆ3B=��j�6��bϞU=�	Xۼ�ߌ��vΤ!h���%^�_q'��1En�}ƣ����#��Q�0$��ZN*�9`6��I}|��:W]6�����:����֫��G�	�)Z��D��#4"�Ո[�Je�}�wl�- �� ���ֺ��@�%3�;��{:���K���_�JI1��M�_ٞ�Pvʝ��P��Pm\��_�h���7��ΐ�_���������?�%kZ��k�)֏�j��̆YD�&�H�yGZ蕓�
ӁJ\ƌ�h��Vb?��&�Х�_��YR��.b+|���dfͨ�o�g���ߞ�z�@w)��P��QRX���Q�%�  ��[Rݖ�<��[�,���N�;	���
ZC$0W46�ك@��v
x{�9w�z��
Cgcm��F+Y��i` &,M�j!��*5Iu\Ƌ3��B�d��sPO�sD�h�l��4^�Tul�D���%7��m<�&!�db.�R��n�F�;�GQ������^���\���,.��=cA�0�X�#�����'�R��ܩzP��aGUS��ϣ���I4�{ݳkL�L�(����k%&?�p;0��k�R��b��3^p�
��d��٫�,�x�ivwu�מ����Y �>��64�O���>��!��)�73��cq�ÆW}���=bL�e
�:�*Y�Ҵ0>���R{2;Sƭ����gG�Oy�L�E�&�<�D+e�,^�/"@�C]E�&
�9�m��IѲ�EoB
��9W#�����c]�{"�^jv@@N�������w)�.#K�?.G��f��z�x�h�"7���w�6$>hN�m��#L�q�����-]�q.���cK���Q�����?�۷Μ		SI<�%�紧er��%��J�f�Ŵ�Z,��(��T����ؖ����}�*��n�1sӡGe�*��|��IdA��_r	�ݴxkh�U�%��H�֜�	��CV�|����=�T�:3�[���,�����Z�%�z�[��{�Is��vu�����}x����c�f�Qb�(�g��D��K+���A<q�R���k��|*�@{L�/��OYZb4�r�[
b1j�<h�W�pTU���\���{J-��=�+��c�6���ȩ�ækUA���_;3Ԋ[t���ٙL���լ�ks����;�`,��5�;ܱ�����>�%��S�%�DP242���^���-� ��vD��	x��\Gk�{!���9�+Fξ(
��"�2���:�����ʽ@�J��'C�/c�ֈ|��Ъh�=-Z�F����<U�DghB��[�X�x$��0i{���L�}��,Q��w�����q�r�B7��Q5��	'y?Ɓa���[N���qd%�4nK״��8#��b��෎�BS_:Y&\���g0�B�$
űӉL·~@Y�D��^����b�w��b �9t���;LE{S�?��8L���~a���ah�58.��7�e���=`4+}�ƭ-��Ob�K]i��6g�I��O�iy�yyb'���(�n)�D��!�
!�L��ڃ̨�la�g�T���5�0"�Y/5 �QK��˃�u+,��X^o\��٤N�����„ч��;����EH���+�������4T���`]��s�����H@������tv�`���8��.��Y��~Ѯ]�� L��zl.:@&���J�7r�u�i풫�B!�U��ް�cV<`N�.��[g9Z�;��a��i�i���x�E�6T������pTb=*�l0���A������b�S�9��P5���?��C�8c��Wp�"/��NjѬV��f��%V�9���dYp�ZØ�Sr�1w�p��j"��<am��m6@Ja�rZ����C�$�����7���h���T�x�:g�RU��v,��%�Lm��'q1b���{#%Q��m�FI���	Od#a ���d~Ua��*�ALѢXeӟk.��?1C�������z�w
�v�Gݴ"cmœW��ʃ�iv
>=u��1����03����J���\��Ћ ��f?�6_�zz��9�L5��/��5�/�N�fH�F��F�ѹ ^h9B`Mx�*;��|k�-��
��EX��
.��;���dܣ�ꇘ�Uc����o�1���z��v$�=�'S�|rr��x�2z�V��ES)gBn.��o��g����;��t3����ӻ�#u��ū<���y�/���e�kG�񚸠\gu��<�q߼&u�t�P�{Cb��:�	�wN�<w�`A@�0��Z��q�J�-�1V0�5-I�~I��{�Tà�Ih��F�V��� T�cY	L��3��g�9jn�S��F��b��ȧC�S�H����>��H��|���p���Z��6*{�~���n{z8i!��'��H.i������1HB^j��f�Xf'��M�R�l�,K���
��/9�9��x�}�W}OZ����<�)ҩ�{���t�`t�x�b��}��
8��G����\��X^poo9�V�g�FAb���~�U\Z
*�i�A7�^T����kH�Po�!Y}W�*��^o�ӢЛ�Ό��1;rdi���k?<^�-����l���3�|sqb
l��l����out�aC
���e%<�Q��Z��N]ۈ��
(����n�*k[D!y�RM���_I�Fov�{)��F]���f%����?h���AQ%߼BI�&Ci�X�0iYB���|1e
���@�#]�z��V���I����K������!��u�d��cu����*
�S/)MѠf3I��������2T�?~��J�&Ws��-����~��[=����4��l�b��t�jү}UR1�C���4�uB`��O�!$��!5}��m�e�u���uYY��f�l��xp١R��:��>AM����qm�ev��Ճe��	P��9���RZy��a�4�B���.xyo��1�Uؓ'�,�4�2�)�9�p����R���8km�x�Y��'әK$�q;�J��W	IN&a�^��!D����X'L��5�G5[ZZ���z���?�,�k'���E������2�6�y_�U��I+�a�9�|l����l��<Zn�WP��U~S�L��xu�@4j�ٚz�y1��0�'�
�,:��,9�6�얅�{��=焘�$7�8�1#6x"�#"�K(�C���Ǔl�;ȅ�SIrvFsm��Y !�U��J�wv?�٘7VF*T�b˚+�,_�]�T��unMm/��Z5�iJ(l1E�:�U�/�(�#��l
>SUj�3^�J��{���XeG�����8�k'k�.;Rm�#CZ�!�TY�
�U�ʇ��?�~��E���v:�!ĮځM6B�J��d�&pe\
�]���^��j�3n��7
��l^��'>��>�������S�Q��04b�b�m�=!�Ķ�y��X�����獽�Ld���t~��/���7���x<cw�"�Ҫ�-#���w��)��Ղ?�8��D�5�۬vت�qX9le�Q�~���(xX�co�8���%�$�E�A~9Rv�G�����T�s�^E���<qa��
�/+~�����+RY��L�B�k.$�~`"�"��t�!rB��D�[�cNH�Y�KbtBG�O�ub@D��(Q��'��lq{D*�2�C�V�#eW�₃�3���%����8�%�1�|����\��xk��Fs���֗�Q��
�Lr�ώ��60�7�+�ߙ��Y��݅8% ���L]��D#�PD'�'q�����U]��8<G
�W�o��`���
��w���=�?Y�qjε��YG���H<�L���.0/��CJVn�V�mX#�I�:֗�V�^7�U��mbh��AR�P>\��…/5֑����̱�lҪK��1tvf*��i��ӆCޫ�X�Кзu�Ip�ƽ.�'�2n8�M��.�#��~�2�S�%�k[��NH]�����-x�&�SV���9a'<+=Q�h<q��5Ix�?<�XFK�lWv?�~�� y��֑H�y�!!~��WF��4=	@N�z�o�a�s��x�<v�g��7�����XY���Pz/�W���"�w܇q4Nf�J)�6e
�KO�ԙ�:�����[bx���~b1���iyc;M��Kͺ��w�*�R����5`J'��
3���T@\\��K��ڳ��o�I
�Ur����zb%���"��J,A�w|�7$@Ŗd�S%��L�Da�����qA�/��h���}9�!���U���
#��+�«�ʔ��t���$��2\���DmP��O�o��j�_�^E�5���U7�5;;�D��Bb2`7,�ePS/F4Fk����a��PXC#(n����e+��L�#$,xc����	ʟ�͖�!<�_��fq]������ ^,Lϗ��|��uE���^�g~��R�U��'y�*G�d��	>��Y��ͮR@�*-��qlS����k]zr��8�F��CFUǑ��=ӆ�Ô��ƞ�0��3�j�r���n�����F+���/��ћ���/��n(}���H�]5�[�ݳ2{Xo��v
S���%��I]�NZ �������#�Js�	*u��@��~��~�Af����ѡ=����͹;��
�V���(mO��%�ot��S]?x���x�=~|����vл
gĊu/B�W���;�_<�;�R��_b/Wj��Y�Kb:\��<nu��h
i���[*���������F��6�7L\>q����*�;ZF6��Q���m�0?�����ݶx��Kd:�
~��)!���5xZ\��U�y4������������e���6�F?cSu�����K�:�h5D��&����P�����y��{���9���4�N����U�w�Z��Fr�A�"_�G��+��XgT@�ad�I��ڇ�t���ֈ�4�	h�Kn�{
��?���Te�EAO�7��
u�kT�
�W��g�`a�]�d�L��:G?�
r��1���y�5�x�����!��T�!sx0!2��këP�cr�hM�/���}!��C���7��!��]W<@N����dQB�m[h��/џ�����6"o TȝW����~�Z6s�U�Ql�p��P|�RkU\J��/���#���T<�i
��t�赬ˏ��#<ՙuKX-q�;�k+�Q.tJ%��[*d.�4B>��d��)�GJ0�$�@
ՎݧY�\Z]9�(�'�N&{c2�tY
X��h�T��F���;j����e2rӿG�W��8l��J�d:�fn	���������_���Lc�~AQ;��0o���y��b���g�<d�[�ʙ���ԏY�Ӡ���P��L���t,kk+(V<���5S�E��=+E�:`�C�6������3Nf^�\�4N��h�B��@�TF����� A���h�1_��ŧO�-�BS=��Xl>���S)ůT��+�Ѐ�=yGzz��0Ev,�-
쵍����s	"Fq�$qϵ��TQ��`	KA8�Ap��)Ѹ<+8�/Fg�c}T��u�j�F֓B�\z2���>q�ШI��ȏ�6�{�|=�թ,��̤%ذ��z��15�����5n�ܰ5���P�"b���(����tsYSO\pz�4�L1�ϵ�*YI_(a�/8f�!�6�גn��Ea�;��̛�=j8e�T���x���W�
w���rq�,�z�k�w��udI�$�2�Y۷��DO�Tm܍=4�Vq[&�Ԥ,X�&��?�k�۫�]{:�ѩ.��?�Л��n�8�𻚨�/|�QX�a�Np��	k+���~�}K����������x���k]��[�F�OP��
Y�\�GiZ0H���:�����E��H�@1�@Uvl��]�5�<1�:���›���Z�e�gs��Gh,ϴ�B�W;�o��.���
���C-͒W�-OS����+������m��NV�~� ��}�(�=w�x�ŧ����i�l��o�6O��0�*{��]���QLI��֫��
�K^�e?����N���I-��o��;5�'J���2�D,F�g8�����{u�2T��4�f�N<�}VT:U��E��'��5��=�3���Lk�׮����e�d#kz�͐ff@����oQ�X���&�j|�J��j�_V�`�VoIhI�t:��*�>�K��`��"6�,�0���x�������$e�#�v�1�d�r4�Ul���,��ո�-��b�:��Ⱦ-���mG`̣]n��*�u��e;k��d���u�C�	�5��LOY�G!����_V�ю����+&bRB����Q�:�8��H�N,�g��$v>������9�F�m>4�-7�}����G]f���K%#��(9���9@��~mA
`:_���8��L];�
~ᨗtS��Y���F-$��������p庹����HM_3�L!\Uj�[q��,}�E���Q�~$��C�'2-��Sh���U{'b�eG�vL��>r$���{��`���T]0�r��RЈ/\�Nʂ��/x�8�#��7=��Z
8ė8�#��{��?C^3��b�_��b����/x2��cvJ|b�%\9�����戍=�}��32rOf7/�*�3h~o��|��-�zO7�^�-5�cu�R�Gp�d���#D����1�W��Aѳ���6sX�����^!�0���-����Lt�+(�+�/��ρ��(=G'�(����+�`H��Z$AD�n��QQ
�	�2�6Z��5K�2*Q����4�s����w�t︴|<�x����%�ʩ������	��A�Y�׎��?�X0�[��6�o)I��_t�P\A�!@��.�� ���,�h�,����ww�eqwY�Y����{55��f^��7o����V����4X�vi*��/E�#IX�Wf�h1�@RL��ּr�l�2/Hй`򭸞����ْcBo9�&��D�#�nt�ġW���kja�˳�IDP�ő�I��Nw+��QN�\�̃j�Z�Z�8k��hr���9WA�[�|�M�<Y$��o�<5<�h��'��$�j�vu��ũ���(�ѝe�Z�w�4~�͟�k�M*���W�k���')k�p)Ԡg�G�D�\�Yz[�㏧8�#�gx.+�H������;�Μ��?���ݩ��,��P�o-��b#J��v�/H�t��l��Ë�?�!;H��ڰ�B�K 	Y�ѪUߺƩ����7�7��%��h�� ���k�FR��� ��~�!��Y%	��uŝѻJ�"Ce�-{h_�4��aaN�wSGٽ�]1��.8��-�G�&�8Eƞ��'�[w�o��w8õ��<�'���GH�S=e���"G@���+�o�k�#��"͏@zy0�謅���痘���jQ�[1�r
��0!H-�����f�`�M���Dܕ�Mxx�`hk~�]�jC�4=T��P�z�-hkm=�(��_�;����(1"�F&~����3kj?����*aBk���nzY��oz���y�����/�9�-_?��N��;�9$&�_^F��xm2��y���C�\� P���܄Vc#q�-s��͜v?Z���R��dU˙���.(��u��rM��I&�3���␚�y&B�m�wJu�uw��U��E������N{�?�����[xi�o�cK�b�V�k��
���X#5AC�Z�*�c�&�V���f����
t�x�z�"m:����d��Z���dU#�:�[⋹Pֲ�0Ž����-��F���K�vtZuO��6��9�c���#.�	^�\y�K�#GvȢZ[c
A��d�%��=�Q4��$��l��eMu���G7Ea~��B"��fg3G&�C�+�j%y�)_����A�[jZ扡���i���\*��Ld��zӞ;o���{���ˇXK�4k�[���%;.�
���Yɓd�#�5��I�I���qW�_|T̛��h�ǿ�[0�\JM]`P��ě�Yh�y��T�5�c������	��ke{=�AX3񧝤e�d%Y�8�4�>M!z�ٜT��e
lp,���?�撚`ݐB�[�������u��cjq�i^�Ok��P����m2~��ލh���b���C]�2|���Z�9o:UZ~a��-�d�l��!�~qZ��(Z�5^
U�+��O:tr*�%DW>c�Q�\`�#��.-��0m�)e�]�)��bҤ�n��"鶟l~�RRY^%c���p���y<?��~��Ma�J=�V�7z�z��
��la��{S�~�Px 0�X%�t+MwEz�%�ŧN�]C��|e�{�؄LÐ*�0Ve����܀$lQMtNF��A�JYsR�j�H=*��D�:U�� ��*��VB*J��L��B*MӂGb���!)�����Y��w%C�b��+9�G"�"�x���C|��wr�^+#ڪr�J����}Ƶ��H�X�������e��AS��Ze�F�v�u}�us��\
V�\')�	%��~W����1�	X
�Bui���+���1\��ߥ��O���Qj�����t/n��-ę�y��N,�$���,<��m�X���i��y��_��yY�و�>}����S�h�i�<C���m�lT∲RU�KT��}&yS���X J�`u��u����F��)13mb��o����ۄb�\ڥY�}�i�5N����x-II��>�E��~��\�`�:��&������?��r�^�z�ѷ��{���m\�{i��-������@��L�K�W��Y�ϴ�;P� MUU�gl�;�.�pN�Og��wq��q��_��P˿\�3Fh<�5mJ���Dci�n�tR��KOMp�ﶊP�ry����k�@cE����eJ}�K���j.���lh����C�4�bw��$��C��4S�w����Vk���hE�ZS�D�D��p�wR�nT�|'��!�|�}_��aC5V�
q��J������k���ޗ���ӂ�����d���iz:6�����cD���-�fr[p&���g�oa*�b�w�"G�.�#�k�`��Q��~��kd��F~6�n%��@~�
�IV�2lE5���U��'~�]@��HZ0��>�L�����[o�-�9�>$m'���z~�6�@F얖�`�Cͷ�Wj@Џ'�%�����?��8ț�c�[�xeK���rS�)@�����e�`{�P�M�^�0~��)G���1�)�WhksLI�T���oұ���y�
;��GUP�g�"-���DOaD�. �#�^��A�����ӈYC�O�r��k�A�;	����n)>,i��C�zՂPT�v�K�;ܝ�¦^�A17��ޞ+U��S���:>�V�΄�A��Ϻ�W��!�ʖ8/����<_�}�gF~��_(�9�e[�)fQ�a��>���+S�,�L�0-�mFo��A���&�P{U�I[��+G_�ŐҤ�Fn�m
��(�$��M�7
���g�HFd=�<Q�����FRڳ��i�d'P�avv�>�	�FxL��5�N
f�[� ����	e��r���U��I�hӁtH��,>�F+��~R�$tI54�PW
�wPWg5���O]�@Q>M�xuV"<��.�46)Z��L��~��zK=�.�=��ze�FU���+��4cYc��7�>Ĩ�bQ����;��5���>������1�"�E?�}�%]ȗU��\�^�gU�����î�+��%	t�O.������P=�e�g����c鑶�`��x[Ҡ�dG� �@'
ZMu!�bi��2�v%lܶ;�Y�w���gkF�É�o���	?�V��V�ش�|�8X�r���nF��q�⭕�I��#��3��V�m��m�Ns�,��06�|�t�Į�0��'��1t�
���n5�ך�B�Ղ�a1��h_H�)��N���w�B/)¸��%2���3
,�$�tM���¶�>%c�B�
u]�qr(��j�~%q��E�+Z���;��)���8�3�`�(	���`��C�&wɳ��n�0ͩ/:��}+ǹ�Ʊ�#���zj<'(8S�yC��]�@*���;$���XI���@��xu��@�Q��A>�$qd�?��
��ϸ�m%b�!���2�-�+�����l����Q1ͥ����?
�hw��WS��U�u#���^9o1��R��͹TX>y�!�T���X
����`5
	���-��I���x�F�X!�S6r+���(8��S���6L�[��K�S�:O���?�b_����|�#�
}r��<dh~BC���0����z�s4���q�66XQ�%)��@���}�����)��?ybY��4�����9]]����届�]dp�S�\f����\~�:w��XD�
S�Ւ,�[Y���2d\׉�Z��c����A��2�ܵ<�t���t�_)�-��^�..�>�H,"p��$��,������Ŕ������+���W�[hlϲ��3PP���l)����ݲ�Eꆺ��
�l�e�7(�i�[j���Ad�zE�ECʇ bo����(�f���
R#�����~�d0�pK��Nۅ��P�z��P�MӤ��_+�l�Y9nW�XQ��:K�"��Em�D

`@����~��!���y�ЎT�i%�ze����1���cT���{�����j��8Q��+8�^u'A񅵝z��0I]I�[i�e�Kڪ��W�ʏ�ڱɣW:�e�$��C3J�_����+�D�-A������W7�y�qJ3�3B�j�UUjo�������4a�t@e>����3��������I?�ӻ���25h����8!�@���L�'�%z��;|��n��0
�Zx�TZ�ea��+פ[cM�Z�yZ��[�,��}I��HӪw����=I�kgb��'�[�%cD�M�HĨ�8�?(z↻2ўY��Q(�r����bF�F��OO"���Bw�Bw�BwXBw�����?`p��e��_��w
���o��셿W������"�t�`�c�	n}�ن&c5����&V��,g�m�ʤ��;�W4	5]k1�|>wQ9FhJª�ǭ�����+�t��ޱ[��>��;��iݢ	�գ*�H�%�QAs�7J)�F�sf�~�T��L��[�'Bx̴�]�l�$B�~��bIf�~�Y{�@�2W{!֐��[l�*�Y�waG��)Αh��8=�5�b��Ǎ<U8����4)��v�0��=j��Q�?E��5~���kOKC��<�~=Hs��ō��!w2�[nrNX#򲥠�~(��X�7i����6��t!eP�é]�=�bi9n9����AiInI\Ho��Y]�� �DJ�v9�8���e�i� ;��_=���f,~:lz���ޝX�j��I�H�P��|c�E�AI���\���d��J��,�5saB�kI����{��d"���Y5���x�$��?�A;"FHg`"�dr^��R+Q��~S/���Q
��?#:�հ$F��2s���
{L��o�t33��R�RHu����Whp�u�NI80�ː��n�9�?©��_
Ü���T�VY�'��>����1�Nx۽��
�0�,�|�Ӻ�2��$d�5X*��7��N{�9��8L)�'��U��2S_C�ױ�RԳGv;�V�v.
F��$�W5o�j'�3�����`=��'�O�W�ӻU¬A�r�t�~���6@P#j_������e#�ܿ�ڶΛD��:Uʗ���5ݖ��:�T���ȱm��E��^�SG|_�����s�6����9ۉ7��ɬ��BP�IEi����]�����|���"������Y�
���IM�*�3<_�&����7���'�vl�\֦•=
r�ʃ�z���#��ioA�(r���H6K3�>B�8��5C�:pZ�� �f���Ȣ�wk�مʉ�׌[6�M=~uV��7�Vܳ�����ػM��p;8ü�3/ӾGC�PJǩZ�K^<�X����gCt�h]?{�U��3}v��Q9h�k󇩩:R�k�7���[7R2n[��[L��J�����m��
���l�i&�ٯW�Ϊ*�Dt7Bow��ؓa��N��E��J
����KHs|�W��F�!�Q��O��+�~�dW�ǿ��Qi�`$�� mL���㷴�ɬ�e<�Zs�zc�IMl<���0u�>��{[�鬌o����(p�M~�!���!�R���4k�Oh�bv��]��L�M��@��o�='�/R��O��@�>��G}�Iс�����ad��
�	��t8�)��u?cX�G��>Z�M����^�.ߦ�\��ő|���Y.%o����Yo�cc�n��tH����W�f��MiE��cx<����9ljGw=��٥�4����ެ2�D�׷�SSh�lu$���{�ML�$7���ۘ�ɷ�X4P��*E(#xW���(��v�G�����4��'7�����Bt�Mt-B
��(F�T��܌r���'�MG�
y]���z����kGz~@;9��XW�$�_#��>��_K`���l8vѨ���ӈ)JO���Պ�n��I�n$��Ȱ'm՚)��	$Q��V�5�$q�W/�Z�\�Ww9�/vM�5�V�ӟP��*�������)��L
XK�o�u�2�E����s7�oڪ����?7�q/�LY�uy1c|�:3��.���xֳ��@`�$�J7���T�d�j6�e�Q9�P䝀��;7a_"q�6=�6�+mf�Y���P�'��הW�Xd�U	���F�x#���/} A�GGI߫
<\gĦ�8m
V���[J�ܰ�X�ݜw�c2��bj�5����r�����ҟ�Oh�M2O�*�B����e��U�߫P�%��;���n�(������k��#���ƻ��
��W�ǻ���A�W��Y���~��og�_>e9 Y�be��^9l�;l�㫱2����2�߄Up����Vl���2�T����"CJ�'���){��}E�����c�KZ3�U��4��j����S]R[���\Iɦ`�?z��*!MAY��#�EXbI
"{��t�FV�V�%��z�j�$����D4iM�nn��l�Th�����Y�B��å�l1W�
Cx�W">��%���+�#BgF5���c<5Jy���C���,S��g{�C@�.&#�V�d�)���D�w�j��~P, c�M�OZ�b
����\j�N	�w�ZO�
G�'Hg.ZT뼅�΃��}�P�PD�Y6b��}f�^�k ��j�&�1:�:x A���}�,@Y�[�>N꾿��H��EF)n�ϫ�FqqxC�I�*� tT�M:�Ʊ��Q�=�c�/+A�"��w��".��*�u�E�nl#η�U`�U��ȇwd�yj�xf��O�p*X�L*���z�9B�ф���ȏ�A���f���I�#���ҌQA�
O8,��:����u�u�\��nS��1<��8<u��i�H�u�u�ݷKT�k�d�s�E��/�&�������6�r�O4}'^�	>��uj�5w"�\6�K6���2��R�j�lۮ;$�4�dȃ��k��}�c5��/�-op���\	��?��֐A#���t�|#���	qj��N��g<�	L�
��BN����Ӿ������'��f)��ꌺ�M�����e&�ʬ���{�J�i5�1�ψsAt�,n���Zz�B�V[)[�K{�)K,n݄��sFv����s*��&[˾z�N�ZS�%\�?�te3�x�4�*�c��$����RG�-S�w��g��9���A��FU�I��af�&>G���ǩ�u�,��>�R.؁�ԛ��9od;2��_s�@�mSw�y%���Ͷլj�����*��TCU`���EP�`���(h\d{`�B��:ԉC:��TU�{O�[����h73�f��$ņtz[�)���	W2#[��cC��ra��=�9"}�(�V 97bfH$�[���Y�>�k�S*����h*r�4��o���V�S��k"3B�x7�<�`�bP�\hD2]�7jUfR�@��D�J15���#�ۋ�؎���x���QX��S��n�|��5����3�Ka>J��h[e�WN���׃⛣G�db�w��{��q�xFY7ub�+�t�ŕ{+�qO�7܎�������#��?����9���y��I���{���H��:���_�D������t��lB5�BIeu��S,��{˼e��G&��O�gh��Ft?�,Z�vS���S�΂�?�=�ZFg`��w���2:�{�ܟp��X���_���˵����$�߼ɝ�����Y��`ي(�P���@Kj�:���ʭ�j���`�_�Bz�~	�ӕ�օ��\�$41_x�IJ�}���5%8��2.�#R|�`��7+ձ?�K0ل�4S��A�ݩ��Ai�������w5]wC�wW�^���tQ��>�I�l��}��A]a8�s��@B�uDY������X�5R��&��yr��aYٵCމ�ݙ�ͧ����a¦����'@���9�WnG��u86���i��N��#�y%p����,b��R��r�z7�L"��N��@_�/�责!�����~ά��d{̼�3�p���1�ăi9pǼ#����c{R�����H1�f5�6Cp�~w��P-(]����J:3��Ι�x���N<j&x.53��U�O/��׆a�wj�X�;����;�`"����LpN�M#}�w؆�s^��ɷw� IM&Bat1�t��^
Ph���S{Q�T$�3��5B�e�d>�S]��~Ep�-�Ŵ��
�[]��Z�Tg���D��R�+F��!h`ZӋ�#HbYUܒ�!���S��A���S���OpVV-���h
�o��i�n�4U4tJ.@�,��
[�8�u*\B{S��	�Ձ�z���2�\�zЉ�D5M+zA�8��^:���Xtbf0S��NW)Wa���^Aȡ��m������ZzK
}�]���٠�%�w]�ɠ��4�$�}��
��'�ʿ��d�]h���E
��	�r/�@�̢�[B�Z���+B��I1s��=:�0�w}���`��5�B��lPva:&��F��Unݠ;��M'X/� �к�jbiW�B5��Kme��8i6�o��o�ES��8i�z�֫.A8,~r[}��j�ŽC�h U?���l����}�d'������Oz��U��u�o��5�h��h^�L����j7V�N���}�"�?Ê��$��ˠ�q�&�5�48]g�U�ΦK
}G��&X[� 4�'omv�X�ހFof�^��ٕZ���u�NS�ң��?�~�Wz�K�[�r��B��vE��aӾ}���<nD��m��h�^���S>����G�x\
����|Q����:��P�'�W=�n{����~D`l����FYi������4֬�p��b�r��0��D�!ɔY)�R>��o�d�=�8VR����ų�ơ%0�ѡ"p�m�k�1Ie�
�H6IF��2�7��ֽ��*o�q��LWo@�_#�b��j>�n�ĩ�M��[�&B#קtĞ�'9H����=�8)�!��D3�q�3<5V!���m�s{|£e22����c�oM<�JQ�`wz�x�G�G��4����+4q#���?Z�$�=�4Z�j����:����۳�~�V�=6g��kN��m�I����D�ۘ�(k8V�͟��9��͒|\d�J'-Հ,־=�_�Yי�P���J�"�l��؈*���M�b��(��	{�����w��Zf��:��R�Q*_�v��	��l�"T�����+&l1*�2���ˏ�Ʈ_��YN�W���ʽ
����}�����17e�/�<6^�?�m��"|.�j��I|O�\c���|�}߀Ӆ��to�Д���,�y�1�(��6ۑ(b�S��*�f|��lo6�nb�))J`���3��������{�_H��n��Ώ�/v{M!�I4ع��^B$��L��3�MƝ)���_����o���y�$��F��(�Œ���b��Z�����ԯ�î�\[��+��E�MǼ��ԡWA��1`�(\_|.G�5��BZ�"H��jvo�3u�3x�K�:nm�
ǚz��[��[���w��9��2�IF�O�	lj��92����B��G�k�T��6��-����x�#���ӗ<����i><ܸ�:.�ǫ١<�OBj�!��f���Mܟ!+K'S�)L�������/���Y���w|Vg��6ʂ�~�+U*�G�h��t$.q��j.sd(8V��kZ"���$�i�*y}qV���j�}�?W2x4K�'�]J�9v��R�U��~��X]��Cˌ���쪂H�\��GV\j�j�]�Z�Zq�_:��Z�p�j���
@��	w{�-��+k��H�A��n�z㾍��D/�}��_�,Ѝ��OW��a-��1`d�K^�`��>"�*���,Ξĵ��Ψ^�$�O6���X�D3�K~����G~�rƔD)�Ba��*�2ݧGwoP�-|u��q�&4΍��~z2��8LMS��6Ȟfi���>s�aj����x֣`n�wCk�`E���!��azd�|<ۧ�BaGn����u��\
�6�ڈBӿ?m�Ѽ�r�BQ��ﰉr.�_�H���y#�f���:o�{�֭��S6Gly����:�I��=�?p4��v�������d@
F��m�6�:�q���iǤF�Y+�or��_S�_��f��p��z�����ݷc)�Aa�9n[�DpЦ�`-Α4��-�g��\4��̨ˌ6�I�3������Tο�S���)����i�>�[٬��6��iQ˩!�U��B&���"b�y����ҙp�'�U�"SFqt��s���t����o��h�3��y��-���BH���x�7-d��n�Z�Kÿ�)�'��/p��Am}m��q�%�>#�D��hn������U$(�XMM3VD���0
�W�Kg���N;e��y�]:Y�9�M/�`{��;a�;8�p��sST�-TI	�]t��
�]�ki4��}1/�8o"3.{���\���'վ�����k8�q��r+�}�@c�u��ݶcr;䀘�p��,�5cx��K[q�<H��Uvt9�8I��7��j��9ڳ��&9:�s��q;��Os���׳m��ή��j,�pgg�$71����9j��"�+
ϏH��ŷ��))��s;={��C��5=^W�����O��H�n�[14�?8ڀ_n�������ox���/Z�@[6��#�Q
�r$��pP�eΈؗ�Up����i̘C�nI&���!�%g>Z/]c����w�����Q�4�a9Z���s
��E����BҀĻã��C���F�_�6����Nrq��|jhT�ܪ�,�)���{C=yd?S$,	x��62�w�X	�r?/E<2���	eJ�P����3eƱH�w��21�Is���K�%0��yf"W*|��F�*��܉)4�B�^�!�����B����jR��(�ٰ��=���f��$E�(|�56�yK��m./�C��TKnm��Y"Fq��@v_�'	���>�B/3�z7I���·�(B�@d �g`�f�86#D
Jm	��`Dg�f_�AB2�Ց����H��a.��̔^����(���5�,�-i%��F�…Y��>�����=&'�oc�a�<%�لM~!���<`pa����E��}���2B����6��l$�#B���x�o��s��$\�GP��C�|sƾP��9v��y��6}��7���|�X|"��]�M]ǘ�!5��j[-�o�a�Z���LPβ�=��]ZEK[�b�a]$#;����~�%�Wk³�.
�e�,�h[\W�]��&ŕ9#ȕfLİ�yE ����V~�;K�1��r����RT}@2@ը���%�|ߎK����G��$�rX�!�`�{?�'�oN�M��G8X-O!�6�׀�	Z"B�{b��?.(����œ��um���)�m��sN?�G�y�)'��u!�$9o�/�p��t˹�>�����n9_�x���wۍ ���i����e�1�͛�|�C�CA����	�f�<X��
�U����"������" .�&*@��ـ��a;3spA����~��'�O1�$�_:�R��F��V�������tL�:q����pe�^�n��_{n�"�qq�p�7���g����R�4��G�7����;XQy�G�a�&��7��?����g	^�a�]%���8ۏ\w'8(�LR�J�*GpO7ް�U�c>6d��jU�O�_�d�$𖘘��R\:O�5��5r+Z�8��/�C+}]D�߽U��
�ٍZPZ/�65��o��JC<&��>��[�%Ĥ�0��>ݰ岫��7��b��K��%M�r�'?���bb\�1>��<{���� =fD��YO0��w|�3oM���]�Y�S|ԛe�{����_���7�b�WLU��d6'�p��kҾ`2�T��]wK���q��oxP�k���u'�âS�"Pw�0#�vM����Ra��~wy���FBDH��'�C��-8{S���ۀ��@S!��a�[�&�t�9[�}���Z2{���:� ѷ8�u5j�	a��o>��[�g�� �\�TQ�P:8m�;�x`�G�wl��NKq�U���5�c�ZWA>�h܃z�v�W9��De� ۻ4��	�;,Q��BB����1�W�]P}�u�s�Q�h���;ud�s����n�{@}�f5
�;�B��f��;����rM���p=I�%z�e�i�8��6x[ذm�P^�jP�PJ�?x�s\0���ܞɽj�^�c�@j���8D��A�4du`�F�2K���38�+f���*~�(�QO��O![�T�
�,�!No��V�'��ΣԸӿ���U�LT�/xi��{���(5�<�C��-U�G�\��6_���#:�dϏʕ��1��i�S:\A؄	��NM��3%N��8���ɤ1�q�>8d����nU�~5�
�?F禟�sw�y���ۖK�w����D"�Ȋ��7*8�kz~En匣81=WeI��Z1I{�{ �'��qXv��)��:�j�%��#y���R�YY�BlR�K�������βZ��H��Z�u�F�T�nv����0��ʲ�o��C,�т�S��}�`���Y�x�{�	��k��2���z��?\�>�b�����z}WO-����N�ֿ�D�-FO݃�&^��Gq�w���s���!k���t�|�z)�Wl���������Oc�XX6�K�"�	�c?��q�{����E8쭩�-�Q��$����@�®�u��y��s� �"Y4P���F��{�S�҇
�R�SVϑ�U�e��j�>6JY\ܗ�f�Z'����'B�3��S��;L�T�g.3^S�$�p��KX[��ؐ�v$kf0d�?��_AT��]%�Q�(}���I�)��ȉ�&�~n�Xs����d�`߸��f��q�U�9�[���(е�{�)�G�u�Q��g�n�^�qAY�3m�B���p��W<�!��lp��1��n��.�iF�A�'��'�ƻ'�Wh��o�xt[Q�	7v�ѫ���Oл�b�`�vN�Kd+��iMԏ��P��^�$��A���n�qn��h�\���
��o��Z�X	��Y��|�0���(�j�\�N!т�x�{���B\)�^��=n�pǃ�5L�5��}f�Q%fK
=2���6m���bY�mXs����f W����3@�=B�g�Q�c�ٛ��r����xJ�m� �̷ny�3΂���l�;��
��?3�,�X}��So�N(���	��&b�s����Kx͞gI��=�d~b����^��3�0?@9�
#i�1Ԃ�cˇZ��W��u.���\V�����)Bn2��U�(긏

�����ٷ9ئ����M�!�ő�G�
#%���8x/O�(�
��hG�$~$k�`'���t�b�0oܿ
�Ͼ�iߌt�}Cȷ�����*�Lu
L)�8�B�ʭ́ա�$,�sd��$�Ӽ|�5��%�kf���|"�H&�]B�l��`N`k�fa[�̩�Yd��̩�uۛ���:x�<��F&sj����s$�穜������`�`�����a��30qp��)�x��t�,=[
��F�Z~�by�2CLj�y+\����uDcJ}�#P��&]�@`r�Uk�6֝>���E�@)�E΀/�Q�և�0.�",��/j�ǓQ5I�B�بƛ�����y���T��0\0/YVms�,��}=�j�F��Z�S
SC�٨ƀ-�����}DѦ��}Dі~���l��pn2���x
Y��h@fT����I�s�Ή����>�QM�Ī�
�CȌ����Zd��@�m
�v[xXu�"i�W\�o�H�ʯ5ԋ-��~�l�Ȳ���n
���n��m�aH$�[R8~Q��lY�X���X���4������R�-��2R��-�k�N��}�	��PN�JS��PN���{u,c]�w�P>?G��`��9�bО��n0�l?�WMV����y[��\��}8D�#�,X���Ip=��z�1�9���{��c�g�xA�������3w�*"jȽ0��Q�a[W����/$��_l���}ƴ�^�>#�Noh_��6�x�D�_Kw�>q��'%�RX��%�����/����s6	��{�WU7��)�^`�Eڧa���U�� �����o8���o����22/�|~�ʫ�`z��D����a��"��Դ�y�zi��:��_UҙwS0�_�uBa��0�,o�Żg�Px�ܭSOO���2�N:{pݖ��ߏ�OjB�9��Ѷ�Ɋ���z�x���I�f���v�ъ��zN�p�T���@�?a�]��1�_������
&�~�Λ4�����&/%�#‰���ǭ`��Ԟ�n)@]��̀���X1c��UO|o�^��֏��l�7�I2���bpp�l[��9�`�$��)@)bl�p�T�qRK��R{�Ps��<(����ז �~��@�??�=�a
�7L8���q��x�S�u���S�]������^J"8\�o���"8���S�5�
w�x��3��07���z^8�c���sVZ�n��_��@:�96��cJ����q���?��W�w�����VL�g�_�X��a�m�Pz���w2�gl㑧ܫ����*=�°�NZW!�]���)��aO��2s[/5����x^�y��T<^�2.�P�F̣�,�h�|l�T�$�;����
�0�3�=��-��aC���ԄE{,������[GC�������<k�X��Cj ���.�}a�*j�J%L�:�6���:Ď?�o����4��Q�c�S�H-b�QSuK-b����L�fß�R4�Ӆ^Om��	A���|�y�^o�3v����	+p�vQ�x�&��~��Y�&AB��x�}\<;�jF���%{��\O�g�:�J�կ[���Ҋ���-���K��y@1����ɓ�R"���与Q�u�l�ȇ����F=S��x�"�8�*-C�c��Ġ��7w�y���<t|V�Ò���[�~��,~���\�D/��j�\m<�:V��ͣEI�3�5�=^(x
$f��ρ��]�,o�A{�Є��u��D��^��e���^��A���^���y�ӞtՍ
S"IW�y%����R�1긷Q�J� i�+N�I�l�htҒ1��1�g]�Z�r��lv^i�K����pW����^?F�G�.��e_����Q�&���Ϲ��%0����a&�!�1Ƙ���
��KR��#F�`�[�a!����������2���N��m6X��8�D�-%�[Y����x~�@x�H�d�Ϡ�w���!Ey�@��M�|���M����M�E�fd߷�&��=�)�~H�ȟ�;{Tk�/�G1^~�m�;�{C��JLtD�6�k�src�F)v-HQȘ�wP�ү������-@�C�W�NJv�5�*
�'��״e���e��@:aw�UD�Ol��^����һ9�����j���2�.�����o4���ja�ji�En��Q�PQT<Q<=Q�ePnw�W���4eP԰��k����ow��/���WV�A��|����l�ȡ�z�K�͛%�Q�A=�ǭR���H?Ч
=<H�?~�c�9�������D�à��g�!Bb��03AB�����#4(���h��+N!��ES�r�k�l�Z��h+�H߼�߇G4��|�^:f����P�ES/|I��&�<���������R%}JOw?�c0屹�����н����@�E�U�����S��x��UW�j !P ��J5�#bB��<&�������Y�<}���_�9�"�brð�&{y�7r����{98a�wf
n���B4C��DѾ�j����I��.��K9�XA�c5TZ�|�bW��ȭU_����u���!�k%�"��Am�qO,"3kp�)��ﷅ��M��J��O��o�k��:��mۦ�T>j+,��
||���aE!7�'���F0f�S"���1��L�&��d�˷l;K��9e�o��=����+P���|_����Xoml	]�h���x��Ƕ�w�tG	��#���2�ٙ�MBq�z�1�f :��3�+�nO��/JWБ��h���s��fT�ꞟ�R���
�Q}��~
��z�f*AH��5�����S�8���c��k�To�L̶.���ti�"��S���{���;���|�V��������r���ñef&���+��{��cﭔ(;"�-$�E	�ȈP���(3���'�^y���������{~�x��{{<�3��^��)M}�J�F#K��c�N{�@����U���6+e7�0x�հ���^Y��~*�p��5�@��l�B�,�q��N:~�!dȈ`,��9bk2JcT�q��М��q�s�t�1�̤;?k�xW�h2�t��cRS-���X��o�J
OD���VR1�m���%MP��G�Q����w�czt�=.;�o�~��ٹ��B��˭9�5�d��@~�����C�#ж�@?�X��Ї	axvɶ撗�^W�%�Dn�UQ�_����@��\{�m<k���x���Bĉ�{�*Rx���E}��ȿ�����s4scI������/m���o�0,�d�R��<Z��xj�{�[��Z��9	M*8OS+���Dy�x�So�����`��֐����.�C���ɰ�|��:SY�f�Ƶlw���g�H��D%�g�m�{J����i8/�<����[$�3y�n���X���-~�=�@b��Zߥ��������E޺���>���G�pf��R��f�ݿ��\��e�j7G���V��eP�g�XFܱ�EՅ��s����b(��.�L����C�:lë���0���B?�]�^����^&s�%ǚ�`Nk�W�܌niS�:�68_��W��oX��7(��6�P/:OuE��� ��dG���c2U���Fr�|TD���$�o��Z��K���#lC�^Y��s*��-�e����0騖}%���7��E.��n(��ؑu��sF�5n?��
ׁ�(<����lͮ��e�-��T�*l
�Z!n:K_�_�^�rn������I�X�N�
��O f��e.|�B��|�9��`��s��\ԓ3ٳ��w‹LV�坄ޥq5����f]/�S |'A[��X��O6�?8�v���i�ih]�c|d�ң|Xn��?.���:x��������5M�[�W)ͩ	1��?Ҵ~�/��ac#��~�ވ���ò����]೵�Z�x<)�1�<jC񈇍�b�_L�Y�E����4rK��.�����2Ra�
3�t�yn=��Z��X�G<�`fq�WE��P�
/־�_�~��8ŷڞ���ԧ�ћ-瘫V�e�(+��8��P+�Y9�բ|ע{&5��c�	��
�:�cM��
W#vh��Z�K2��!�r�VYR�e?k_�Ľ���OP��!�'Q�=�M���m��=F���-|�#I] >���R��CXM�ve#�}m�U ����)������1<5.�&����z?h��?�
�C��b7�g
R�1�����&J�Ǐ��5�J�Q�Hr�
�hy��(Y��kx�T��!1V�Cͼ�K[�fR��ը'�pi7:&�Ȅ�,�m�SgZ[+B#�R��&�s3ž��ɕ�?QUt���L��;7���u!�j>��ߗ��i��=����E��'W������MS�`a
�5K�m���Zxͯ�r��/F{����`�
Y���]�THt�����5�O�c?��x+Ť_��Z�<�9u�ktGS�R4�K���V���g	4�n��l"/�2d���Ζ���u%�09MM���x�۠��u�M#��)�Umu�`��vʹ�BO�߻��>�oY�&��{�g���z�O}a�x]���NUd�t�7aZfbZF�;_�b)�x=�3�:pg�>�\tqѺ1瓏�yt���w��Zi����쵖�6zi6>L��ӏV�Ͽ��o?6U�u�1m��=ʧ�d�Y\������+�~��X?F��w�cf�(�	ͧʣp�r�>kU3�g��Wy��X��U�qa	,���Z{�ɽ��a~c�-�K����a��14JDž�1�NO�V��G#�%�u$1�F;�"��q:EL�v6������dJ�䯌�&�)F߸�r�x릩�)�8�O�y�5RG����N�!L�J�����F �vLD�0�NgT$˽4_=��������l�|�"�^�!�ۙ��{D\�uِ��Z�h�ɿ[*¬������-^���'B�>'b5�-����`�_���UsL�y~�0×W���<�<P����c?�Ƴ�+����>u�H��#-�]��[c�<x�࠮I�霝#�>V�/��݊*�V*Ry��Y�N]�Ѻ:��[)Y��lr�Z�@��.�ɭ�"_s�0��sZ1�B�Q�����^�n�^����Ȑ�b@ �p�n��-%�g�0�?���V�L�\�@���,�3c��
4tv6b_��N^<)�u��T�{ϸ�R���v�k��X�`k���`���"yqAҏ��N�4Kb\��ņ�p)��{!�ҦTSil�d����[z�:,��"���
Uģ ��D=�y�?��+C�5)/1L�?�T��k��=�u�-�ʷL���Ny�❮�5����>�ۊU�2�
�O�84ݕ��H�d�u*㱓�x.��=p,�����Zy��'pC�̮�6ի�g�U�o�ߪ�&��`�쐦�_q<z¤G��
qk{v/�+�p�Eә�F͂�:_�&�c
_����G���f��ztj5/���7i5m��k����|�Neg�B��j���"R�e}��T�ͨ48�$ܵꉽ��5��lѵ`2�<�G�f~3�-5J���vZt�V�Dy��@��<�0ͦ.��K+��ʣd�bLs(���J�':mҊ�-�J��b�����9���}�mlv��\�C��8�-J��o��>1��%�׌���>�۫��F|ۥ��#i���ۺ&���W�W�*eJb����b}��y�GM����>�����<��󮭪w!&�R�2w�\��߉\���\�[R�f:"��Ljm��>k��L����%���J��	~
����ҹK����e�^a)Q��<�J8y*�b�In5����)�	t���W,qd"Wͭ��Q�*�c=��W`a�![��������t������m_��!���j��P�B���r�S~��`=�.�(b����p�\p~��Q����6�5q��Φ�[W��ՠ��fQ�c�X��v��3�q�����D����b���=���(�>�*sL�<�j���r���6����6�
���SjL-aĂ@x���N
�������s�!��!���d��8��z�M���x�gH#ٔu��W^`�WT}�1��� pL�"���ƺ��x-�r�sc��v���::��J_BOn)�R=���-�!G!J��=����Z&43%���uf�SW�Q>�Co�J�ҩ�w��3
��$�
N�7���/S����y�2_�E.z���s�Z/Ԏ�l��*gn�4=ۻX=�7�a�i�֤���t��ۙ#�m�f�?ol�b�:fz�;X����{��ϓŪFq���q�U��d��g?�s�q�?�͇���m�K/?�'q{�4���&Sz
^=3oH+��q�b���F�ϵ��(4�K��1���L\�2-�x���v�Ӥ���J�Q'$�ʯŞ߉�N��3���}��^6���!?���>��z�~��dž��W�2�o��M��Ƿt�j�8kĩ^4T�/m�8+�q���s�g�)j]��]J�DE�!%7�SҏI'��r�����h|?q����%H�54�ո�p�xe�:rX��]J�W�s6(�RK3�j�6j��D�����X���-�,�\.�&�$qc;������٦��h�[�Pz-z�R�}�x^�d0�E
�.�eHٙ.��O��}�˴r
S�|`2�|�x��M\,�rl�}��G�fG/C7�F��k!.�VL���u?�:�)}�#�<��Y{ �+���q�+����	]n�2�Ou(�����
�y;=I�.P ��<��:��%������8���=�8D��}�<�1�;L�io��C-��_X�tQ���❹���	�q���"�'��ݰ'䏥��tһ�\m���%�[
b�`1�D��;�n�,L�#���yߴt&�
3��Y��&>�|o��a�z*��t��O].@��J�S\��K<<��Q?�����m���r�ɖT��\
_�r�����Z��_N��b�3_Ee{��C�{��y�<?���Ï\�q<�X]���p=d�fú3��k��t������˛.WyGQ|Ɩȶr��%!!��3O���n$�WBP����w!k�#nB����:��:�@̼l�ی��:�Y+'��
%���r�l��Z?�Z���tI�o�L�I�&�<�c�D\ag��t-��;�Q����&a"�>g��Z<�.�ѥq�ߦ������s#�X�g/�E���딙��*H��0NE���P��
�~�g���J�S=��O�|�!>�+!_Ѿ!3�V�>�Y-��B��Z���j�I6�ۏЩ�;Ɯ���Y!��C"��Sz(3闉,������^�(~�Z#�$O�Ô��ꖺ���X|X>6}o}��CK��;���}�5�@ \'1!�C�Up��7���3��w�\R��w��֐�6�'gH�䉭��T�֯D�;
�$1��]na~h��Ί�*u�^�W�VQ�z��<"A?����󵍜V�!1����w;x���ۯ0�yQ|*ohe?ɚ�*qt��/�}*����jaÙ�Le����W	s�)r�V��x
_(���^�U�Aw.�<q���v�{5焰�2�
�+�I�
j�����VH@���q�
ފ�0�`Q�ҥ4���-��U'�z��h�^]Շbm��AQe5��ؼG"0�KS���c�3[���v����KRu��yH3\�����cDC�J��"��F�oǎq�V=C�s�&?�䲒�a9f�߽EA۹��u3?mW��8V���Ǽ5U����{��T.��vo߈	|^�yF|�h�߬CxC���׫��0�X��i���
c�אq��c���z�/�$nSv˺ݹ"U�i7A�C\ƀP�<���[H/�m)c���#�*���Z8NѺ<�k����h��ĉ9�n�/��F�&��G/)~�?*�W��p���#9s9B/9���wS���/��s���k�`�^}g2��7��[<�f�v>��ީ��T&��ֻz���isG�q��xk�BC�٪���goU42K��I �콅�eBc�4��x��c�A�B�b�:ޞ@#�e����U>�痉�R��%˅hh�)��7kw'�ƣߦ�O�ÐCk6�<&�r�Y"GPӎ��7(�U�˜Y߮��o��S�H?
���7��*�9��pF\Z#��nr!:�,}q%����@�ϵ�G���S}�#7tL���$��U&k�lB/hu��Ҵ9�)g�Xiz��ܛ�
.�K/��2,_�RZ�a)Z��{H{b.X�KW7�D�q�W�
X5�A~��H��й���S%�,.�\���-K/���{�f��-�e�_��ӧe)p�C�'𤻤t!�����M�BPob !ף�mIo	��Bxr����/\m]��u{07���>\��;�qN�������0�%���[B�Bg��$n{��^x5tB���:���g ��0s�\���ַi%�J�E9a���-�}�#�Ģ�K����
�$�t��0�H�96�w:��v������5�߻���O���|����*��g5lLևf�V��~`�3�jP5)hft~k�⩳qw/���8O<��DV�e��*{�~T���A\�5����1	4o��R2�
��J��I�I2Aq��ԫH
�
zQD{�J�"��&x'͸Ma|�hj
��YY����/c�.��ʏvw��M�_6O����O2M�"|d��s�dz1�䨶h~�hI���ǜ�q��
Q�x��,�_cTJ�w�SF�}{�F��d���b��^�CR�w�.����aq��Y��N�T���\0�"�W��$(�7��c�:}
�s9��t.�Ada	��Ym1*��:�#1�CP ����yxL������1�4Qʭ���+��7�gy㐧|�[�����9�B���������'��N�J��������5(uaHGd���א.�d�v��~o�!uc���Z4�B.�%����-�_@q�˟��P�y⬙-b$�Rr6�N�����"�����rS��&E�����O���2�YHӡ'+�qNS=�H7�-ck����)��,����k7���z����f7}�D�BS�ݭ���<f}�SԊ��8�O=�iG�(>��E:�~�އ2�<�����CG���l�/{�;
e�]̸k�3���U�:�N�w>��9�g���%K�^�'�ɤ��%"\O޽�`s��?����_���q��-�U?:�I
���}X}�:ڮ^�9���<y��>������vy'���a�mi�N��^�(�o�\*5a����C-�Ǐ�L$�\�d�(��&{�1�[�iq���R�)�p���a7�x8㶹�@�Y?k����anMp������W����-lvCʶm�I��Y��|��O}t���,z��q�|�G�j��^,��v���SL���E�ڭS軮��~a}H`W�]�1�'ٵy�^������3"˃���n�O���I��/���<"�d��i��|�'����+�
%�*c��3��1����GlI�1[N˷lOH���yI��E��$QPh���k�O�<����N�N=mr^ݼ�����$!�,ǧ.��-h�d��-�[6COm��s��MU�ԓo���^62��%�x��j�1G�j�VM��ԙ�^S>i��m�;���/StO7n��s8���iVOQ%�n1�ބ����8'�hWBe��Z$\�4�v�7Rɦ��>���h�6~����f���(�v���m�N	e�[���p�}�|�r���%yN�sL�����%��Ux��#�[�d�c����gw,���
3˝�#�4�^g^�o˂q}��0nxM��:�ާ��8嶊�]%��V2)g�e��N3�D��]e��aӁ�۳�����2]`�/�0�aC��-���	��>0ߜ�&�%o�qp�>��q/b,�ɗ���$���x7�KǷ���{{4�.3x+4�_#�(+�yǩ�BL,CY��ɧ߻N�X��l��ϡ��L������r�Ǡt�i>a*��W�mijr�Mc��ғ<�����6~�ͱ�AMU�i1�ߜnd?��,=��ݏ㱼��+��������Y�	�6�/R�$4nR����JeJ�7���t�ˬ��GYY{�����?�R�Y��X�a��]"�4���1AP���k2�o��^OL&)M{Yx��J�%��#���)NW�>oc�x[`�
��4�Qm�I8W73�u��G'g�bA��k�a��Tq����-b%ǂ�e��n�S�kpg��%��9�xf�N��D������.����M�㮎'z���V�F?{�¥��jwS��HC7�{1
�A�l�:
W���P�z�QBu#���'��>և��ᵽmC�B�7Ô�6��4��H�׬�z&�O���ˤ#b/�)
]j�+||���D'N�ST-���U�:��q�U��t��F��9w�,��ؾt�՛�槖��%\��KV��8O�O��Vs�h�tNڶ5�J��w!�+�dv�j��]D�Kq)렔�w9��V%��~��A���N��H��*��1�6+A�qb�^ՍfKH�m��|_H��~w�>:�-�y�x����/l��r�,y:�l�8X*⓻l��
���r%s<�!$>���:s䩨-����ElW|d�l�36�.��_��qc���H��|�Ƹ��n`�QK�h����H�3c
�H��פ[\��%�	��N���v�hQ�¤~E�_���_𣼧��g3��S.;im~Ӓe��޸˵�B'P$_i��e�3L���_�>X����{� ��tVs�q�
80D�\th��/�1����>C|N�A��A� ���
s7/���Kի�,FÜ��R���+E�3}��+E�n��#q�m�_t������z<5��KЎ?�G�K��́�֏rF��.�˹J	�]�6t' Ț���8[Z�d����g���N�:��1ix�`�y��.7���B���u�0|����o�
<�2�8��e��?�\+�l���$�}1�3�'u�n��n1�
�y�\���ɤ�-=�����o�zN�OB/͇5l���{��ty�&�]�v��}LP]�����>��>yR��vG��w�<e?
��˭ŗ��|k��H�v>��gT�<Ûԁ�뫓����2mؠ	UY�`���Qx
7����v���OJ�B��6k*�H��V��}��nq���6�\�� .�
+O�hU�����Z}e�y�2%�	y�1K"�U>+|�m�͆Ư%�F���UпX�k���Z�i��l���2�̰�U���̧ hr�*���OB���Jh�o�
��w=V��>S����%�� �|t[�3���m��oWz|�/.u�mn�O&��H=sͩd朧UȔJNl�G1�d�s�%u��F͉���Q����aH�V�s$�F(,j��&̸��ʉ-C�WTVF.�~�_����Mx\5�����u��Ͽ��ir���RY��~�Xc'v�_3���<anv]
[�t�U�i���$}�g�ό�����
��󁯃�<�6�{d��1��!����"���j��g܊fB��c�Oʮ�A��C�>��<�ʒ�S�ʱ�RI���k)�d�<�kv��Τ���N6�"Y�W��s���ϗ��foȱ��,�Pv4^�Y[�r��������G��}�����J��M�춻7�S
�$9H����D+pQ�#�*~f �����G�=S���A/���w�|])���ޓ6��Oڎ�Vp��������6��L.ޮ�@�
���}�)ksp�:m�`�ͻ�L�ܒ�r��mutt\[[������wpp�����P��М?��Ӱ"hg�0]���Lo~���5���[w�#����66����_?Zr���|����I�U,n+��?}�{o�Qxo$�9�t�F������=Hӓ�\��W]�����ag�l���vP�ʳ���s�O�
k�
o�T}��v���x���\t0'3#O��r�_/���QP�yt
�@��k���\�k�ii�����c"_wv���4��x�����6���>>�a[K[���HCCsdz��e��Q_4#��XHKi�%!~<���i�G��{?P{q>3�f��_M��@Hb�j��i��Q�d����NGJϒ��N���X����(^�]�Y����p�6)Ҧ�CAV��_�j|��m��_��g��y�A�ӧ�N�d���\��d�d�g�}G��q��.�CnJ�^c5p�^U�y%�1���	�["�S���|BDc4��$	z~)���l����lI����u
�M�}�Uqu��±�P蟾m�`��T2S�⌱c�`�R_'�'�:��b�*���ll̪���ˆ{-v=$m�1�l����?�w��iY�r:��!�����wc�=�,�p�8��EL4�dE����\���Z��6 <�ȯ�iP�cc+`��t5h56t0���m	a%�d��k���==�ϯ�S�*^8����
��g�x��Or�:�Rp�*h�+�ξ��6^"-v�N�‰���"���Ǚn�?�Z����}nQ�Hwnp�j�Y��������r��A3w�swwv��!�a��m���
���qp���i���넋iF@��:��0+7����5����z�SsC��P%���G�$0|Uv^69�2�˲��m�Oǥ9�A�yzC[<��֘����]���B�hyj�b��j���%�Z�/�����{R��ɶwv��Z�U��FRp1��K�'~�E���Զ|S>����6N�&φ�Ǟ��H��͆�`�<��{�� &�����0�z]����o���
T
gO���G#a�f-I�N�w2�s���v#Kݍ����D�W��|�ْ��Q޴�տ��,��=����T�/���
��
߯����:���Ƕ
���ҦA��b$xj���u���8M&��qi���B�������I��%���x��#�e�?��7<�
�C�ٝ�;FK�5Fc����L69�2^y�,�z=�ؘs�]n�<���榹��ñ|�/��,�
�Q��9�9��h��^8���]A	z�A����X~F����ض:�f~����M�7��9/D�)^����w���[��-NO�o��[�Fj�IM��y�V��ܘ�9�f��"�V��%w�86��gV�������kde
8�b` ��c�m�3���u��#[�L���l�m�[�'�"�z�]�6˟c3��>��5�	��E��T��<v���Q�c��Wg�rgg�sJ4y	Y�-du<�7a"�T(��@t���u���*[�K]L
�A��8��݁�������t���RORI�7�IA���K��\V7�gL\k�Jf�肴�m.0S�/V���:8�����C�%��2�p��o�6@��R��2�6
?�������{��5�,��q4�P4�rB��B;l�,|=���i�+U7����D���J�/7���K���LN�����.��jXw���n+��ܷ�@��K����/���%���������7�]�ԓ���2&yP�'o��e�]a���/�S�ob�}	��pQN����5�+u��[��ڧ�//��x��ub��4?߾�4�(}rBjm�e|i�7F���� �6�N��Q�l ��G����ݰ�|�ܛ`�Պ1WY����f{���Z�mf�!w�����1�G�Dv����(��a�Ot�4a�pWo�&Poc��0A��������b���C���^~o��|����ᔁK�Q�(�	�a��D��c�����ϧ�����Pt�k��N�#��?�/���Dl^�?&����vd�_(:..n�B<���xB%.�ʂ�RqS<q�.��ٵ$ߔ�u�]"S�'L˝3����vzd�nsM�|���N�����J)�ZWhi�G	L�
uP��p`�)'�U���4ȼt!�QnTοr.��}i����<���I�Y!����O�M�2Z�,�~Wc
O
��PS����F����h:�_di] ,�T���n�{�V�����k �9�^R�tI�N۸�a�Ċ0B�
���ka���m���
{GmXw|��*���V��O��
Y��-6�V=�'���mPomjc횅wi|��ݧ��T聡�X�M��|��h��5
����b[m�Ǘ%�m!/�y�x�UZ��Cw���3ě`)N�՚���iM-�h�t]9��:��!�4�����.�N�t�C����K\�W��=\��{9���ba�g��G?R�TEߖ9�Qh�4�UV�,��ؒp�^�.Q4Dټs��[��ɦ�?C

�cw�������wĐy���&�+å�����k��K[��4��ĝ�����������i5�_{��X�����z���8
R�h�o��_F\��n��#�@�);���?v�5�YA�v���
���ﱾ�`!R�A�3�A/(��V7��>�R�����3�R#�6�;��>Z0!r�n��!\-�:�?��uO@ ��`p������ �
J�|(�I�[~$�x������� �C�ExoK��m��VQ��Y��tB�0N]�� s��{ ��@��EN�q56
h!Χ���I����7�p�b���8��=��ܤ��F`���Qߞ&��(g�?�¬Xx�w�7b �Nc��\�;�A"�о�5s��N����=��,
�n�"�ȑ��s=~@'�힁�!��P �t�Tw�QCO�jIaA �P0�!PD���^������G�g
Q@�2��aZ0�E�ޔ�Bܝ?�!F"�HT�8�ܝ��"2+����&8�QC���Hm�����6�/�}LIo�LY//�3�O�r�hGHx��q��:s�oO���?� c����4!LJ#���k���7�O����`���I\1�~��ĺ�P"b��j
�~z�D�GbW�#&Z@����%�����l襏�DS�^�ݓ�s�IBΟg�$��X�޽Q���B�Gr���A��
��p �}pH�a�_����?%Ql1F�
�������#%���*wI�k�*�0�8R4��D�s@����C�$�D+{�{����*C¨��p���IA�E$�_wLH�ڏlr	6�������f����66�G��+�(R�
>/@J��4���N�y���
��G^���0��j>J�ơ)����
���@�!�Q"���4�6�o�����%��{k�$���?��*Pb�o	�r�E���ԁ	5�!J�!��|p����!fz�G�������ůF�8�)
N[�(�n��@���j0W`?��\����jТG���-��u����~��rib���*�����ƒ&m�Ѐq��^�N �)(�a6����}����3���E �nA�Ȧ�d�*��>�^�<�&,U,1���:�Q�]�}������xZ��o��8�h�����;
�*�O�`�{6��8x�N���s}2���v/f��@	�9���Du�X)�+��pQ:sU��x����80�}-���xX��Zdw���WxBG�g7#�I�M�7s�*1x���dX�:,������ׁr�A	j��N�KB����qԧ:mxxK8����3߬%
���j$Mݝ4)�Fv 2�C
أ@"��<���\��v?����Q�,2�dOAD_�^=DrR
Χ�v�}m��o��{�gO�������j��]�թ�n�@�v~$�O�Z�?�\D+�:�`�0`��>ߣ�:�pY����'��Qu��9��y��<�Hϡ~���ū끬����}"_�;�
����<k���L|�q���'Oq>�R��a��{�<K���!���C�#Jq�e-L�q�����*��#T�d�]1"��u���K��L�7�(�,�.,N���{��1ppr@e�J<�R���G��%`��n�[�@ },���AG��F��#�4R�q��')���J:��B.}�t;���d|n�@kz�,QhH���;;k�]�IQȭ�
��*�
M:���s�3�|�D���AX`�?��c��\U/$g����Dž��@gX������
!�����
0�Bw��0�!E���Y��(�G�95��p��=��$��p}��7�̡
��>s�s�zF
�3�C�9:��`'_�1�4�������>fv>���/)���g��ja=Jbp���e�=-�
~O�_���%�y@o@�}̙����2�B��S@��@wo�b�{*�;�<T��Ђ����1�
<��P��djpn��m��R���p�
 �!��?~C�����V�Y��R���0�d_�
ٿ�*~\�*x�y>��=��ѿ!����C�Kq�<�l��ӽƭߐ�����=�_�!�j��`��M���3��'�m���R�r�]+��
l�nb��*^�!*��6V0k$��3�>R�>&�,��Rb�tٍ��
�?t��DR����6�SA����* ��� ���졬_��hΑ�~�vO��C(�n.�n^�v���"7�mu�q	E
|fFۄ��%q��ˉ�pą>ViFM=T���o�!�T��e��Ð���rpk7�K����n>@<����>T�S#�lR��+�?U�y{�;�~�s����{
�eoGPsQ�����+�|8@���\�UG�yrhVg�o(2@��{����R���[
Eóȁ�� t���9������Σ@����}�j��H1�	h�
�U����¹.�'������h�6U��ԝl����2��Mȵ|��\�в
~yH�rp[WĤ�\S��S-�G��>�%���z�_��ʢ60'@�CpP�|����ZULp)�@�Y{��v����Z`�������<]P���%7aRp�cf�qb�s�0�r}�k����b.�!H�*�F��>�:�z9��
%N�Ez�л�.�ӣ�K8��P���H��}������;�?F��p�%>�y,��Y�OT������t;��%���!���q/{ �3�XB1�#�s?J�5���2�]X�nN�4U��e�.�R�O7p�`p��:F��Rm�0�v�C�a�85�7%.;|������Ox��q��1Q��[����a���J(���hK�y���U���=��Tأd@"?;���+[��(��n�p//`�)�zy{�X��@�8`Ə?��8�����C	�!{\x��5@�y�%0�o�C
i~�2AtGv�"���.⁓?x�Ě�`!�(u��w�4�����y��WȺ9���P��%79�v����$�V�Qm{��^�>��懜Gwv:��uA�<�Cx(��~����oL�qG���{�<�ȓBš��oU�-���'
��7R�n�~���� ���u��N��ޟX� ��E�������;�-u�t�
�w�b�y�\��0��6��	wEv�A��X~	���H���\�@��o},���x��`�l`
�q���#��g���X*h��Fo�a����Ș��v��8#
���	�W����(�W �e���H<����xq����d=�:�lf�:�E�f��"g"�Z��"gX	��"�X�������5 �m� �(|�V��G���+�p"rOʩ&��L?<D�=�fj����	��)L�������}"E
���!ф����D��J��s�H�v�aX�C����Y`�tF�RS�F��Er������ڳR��'�gȑ:@`��(��Ͽc�� �J1𒁲	9Y����;x���-w�Ad�1�?^s������=�V��{�%87��8��|:~s��n��h8;�7���6��?L�\8��?����=�h��� vw�o"{k���j&�w���	~E��x5��#�J�K��aM�QcQ�����'�P�Q[����ۨ�(�F���{�蘨�+Ԃ��i�	��F-eu�_�
��}{cE�T�oOQd5�����/�~�"�~����@w������o{�m��н2p`&������`=��<��"�̿}(��ې�@�SB�U
,
\�lOZ����g!3�0p��=a��^r��dq��kY{���5����{qT����ړF��e�Y�,\IkO�2ٿ�W]-�4pE�=i��Zڟ���{�!��ҿv�՞i�jQ홦y��L
��'���E#�"�\�iO���FPѧ�iړ_E�����l+.���@�����K`
�%��4��}
�L+�f��	���!��%������HX2��О��ߗ�,.�'\���K�ٓ�M������T��F�ۀ=�8�CT��PK
��=�V��$K$nWEB-INF/lib/jregex-1.2_01.jar|��.�֭۶m��۶m۶W۶m��W۶m���|��{�ω��*
Q��1Ǔ�#2f*ʀ��A��������
$'�*D/%/�3
�(	��W �O���h��_e9!y)q1U9�G��IYz�yxz����fe�%ֽcgi9:)�y�*0h�K�!\,jK���7s
�cL
��Z��K��{g��(�Nm�>#�4D��j�?������'��������������������*?�9�1��<Q��L��L��X�yrf���?7U�إ�#c}9�Ic}��<����N�FK�HEۇ�a���w�sk�R^T�}Q�v~nB�D����~�����-H��_������ے�b�Tc2)7
�����B�?>#85�Q�H�AQ\�6%��rWb����Z���dF{
��K$ve
�uuGr�#�$_@�
���#4�*�� �g������G��\]�\��T
E�Sl�t�����d0�utd6,�Za�`�$�(�:�5MG��56;8;{�l�M0�
2�mݖHu
�+�%�
���y��_�����e��O^��t
Œ�w�����;�턾_3�
�(��`/���Uǘ�A�!�"��b��&�:��M9H��A�l�"��y�)A��a�Q����{��F,�f'��NC����C$��c���Bc��SМG��y��ў��I��VZ��G1���o03�έ({/�Vs<�WP�.�D�$}E˫��-eo�����5�l(��g0)��3c�.\+���:\+�cg�i�\x�6
mSh.рQP�zy+9]�HQ�{;�(?���B}��8��~{����8���3�	a�x\�&�dd�w���z�(ĥ�*�ǭ�V��">v�v��Fn��X��Hw�B|�GR�x�2?ڥ��(��������ͼ\�8��*��Q7	��6?r��g��a�d�lâU�X�H&���>$N,�NG���}��5�����8�\� (�:=�j�o)�8�Q�}�i���:I��Qq�#W7w7vl	�7S�hް����� ��(?�Ѵ<�˶�Z��F?��<�ˣ�0��M�j���-�6˵(;y@��&[��#��!8���� �v�+ɵ��?��Z���
<n�Ҡ���$No�9<�]TS/y�N����7o�/:ĉ�_��R��L1���X|΢�V�{j���w<;	�b��wv��u`;Ks���;��ht���N�W|��6���W���X��"�\4��씐X�F�'o	�5��]dn�۬p&�gm-���Ο(�z↩�2�:��R�O�=���q���'D҃���)F7&8[(�Yp$����aJU�8���(���w}�i�g�AJ�]�]����@�������?%p�=tlv#�R����Y|%�hҖ c	dL#r#PR�‘�&�5L���\�[�)�9v{�>(�A�`�R�`v�
z'iA�%�%�W��	ӝ�����'Ff(UH���&���xa^�8'e^�lvر�V����V�A��{�;�5��&����)�*�ʕ4oԺ���5����X��,یx��#āmuʘ.�F^iu�'��
m�򆶘��mFt[��&{b��D*h���瓞�6;o����
�t{.1Pa��DS��7zjqҏY�XlOn��
� =G�Ҡ�??(��6�B�$�8=C���ޒ��`��Y��f�����x<�ty��JX�Ry�#,2�ɬ�\f=b��n��m�]B_�x|P4PTP4�Yb %Q���9�RA{�H���rG:v�ױB�V~p�1�F�,,ű�$�M�J�?8"��aF#�c�d�K�詻/����7Wbڞи�x��=���ܯ%GC�����`|Y�2mB�X,�J��i%��]pUӏTcH ee�9|��q�1�F���R�Oh��0�)��E�gM���
�o!o%X,j���T���r�y�y����3�-�I�Ju�/�I�u/�r
�!_R5ۇ؋?��2�-2f��p+�K�@6���O�m<�\� �\kA	�F��L>�H7�����\�P�/T
j��)Ѿ}*V�[q���y�/X`YH4N� W��׵��(���G;��i���<y��D��M��h�8��J����Hj��I/��9�G�������#|	�Fie�vx���
,~�24E�08e��5��m��*<,$��( GxP�,��w'�C��"W�Ƃ�No%�Ҳ��e� |��+��L��a��򎠸D_�����3��>u��`�R���C�1�W�)�@�0߲o'op��t�!��>B�l��7rљ��gn�����pMN������/�0t��y�:�N���yL�������/�ֽp��䘿�BQ� ��އѦiWW^B-�(����+�������a{ͻ@�v+��"�?���?���^mki?HY?���E��Բn�fbAY%Ck���!
��~xU�	k}�u ?�d���uj�
&�t�x8d%�j��N���0
�ڜ����2~�l�m����4��|b
�r�F�V��j#~a֞b,�L3��-Ps�/��WnJ(�\�
�nF��oM���b6��.S��ѩ�H�P�y��|�G���Z�"��U�h�܈���T���Ss�r�|�h&
,�"\��%}��Fy���/�/�Y�Su�4f�w�P�{���Ŏ�
��\�6w3ר��\���H�/<h��=��K�ܡ���;*�2� �Ҕ��B!�`�R<� ����	��s�O���U�L't}?��P��{�B��v�I�P�ٜY�봕	a#�u{�p�7��.%纁��7*3NZb����q�L��ҫ��+Vr����'���-]"4�&�st(���lLl�m�r�ulU���>�x_gd�[\��A#7yUh�!3Ң�a@�ZPd�r�@��T�d��~eU)�H~1Q[���W�B�Q��W|�E������#D�K�|�t�h��u�m}շ�v9Y���	�lyo̯�S�o�.j�<29��i�G�Ci}i�l'��2��ƴYH�����b�vE��Xj#h%���rN>hc9[Y�2�u	��P�����%n���LaQnzzF��V�J�l�}�k-����vT/���SC�����C�<U�Yˬ&j?�Ϲhȇk`ab椷p(o�'k����D֤1W�y�`b}�٢-��}+� ʃ�����6P�;��;N���՞���~�8����󚫳2<9��ќ����\�3Ur%�Lw�*x�㕷�s"<�U�wRP��f������ w�l
��/eP�*Q�H[C�4\�t���5
c�����aW[��i�j�R�|8�EB���κjFb)�=�ݔ���
���C)��-l��6��27��@U�>ӡ�H�Q��\�*�D��*|ͩ�lD
$(-�#BԾ�[G���_ۧ����^���N��3���"T�tM��;p��}���t�ޖ��z�N-BwB�+����0�B��3���5��Ɣ�pj9�Jc����Z`�o+��Q4à �����4��(��F���o��	�M܋#��J������*J�už+��8�N]���uӧʗ�%����_�r.��ȧ�¸'���ͽ�Ӹ-���8�J���ÿ�nT�_��=VK(%��������6�$Q�/�?}�6����Ftm��qn��g��m.}_pm�K�⼷�E����F�2yz"����J�:F!�e����>qm�1�.J(4(�᎗)0�D�c���@��#d��	��TkSq�z&����ts$��9��?�q̯)�d�Ur��*y�M0b7�y�Ur��	%vd�Zgtg?��,S�����",b�B�f����Gqx!�	�����q�Ŷ�í�K���ѷ��y"!���������~�b���J��Dn��~G����,�t��| �.H���}��i$.n{�� (����^6�y'��3�7�'��U��\T3o=�_e] �k��Y�~W��TU�<\7�](sn+�����s���~�240061��H��ZD���=���̽v��N�����}O��
��F�i'.��ר�:1��cN��7�������~�9��Rxטk.��Һ��b��RJ?���(2���\pmL7pJ���,2�.��7�"螙�;�*��/h��3D�k��3��
?Z+,R=��xh��=�kl4��o{ �S�!�@��E"}���
��]),�$�uHؗ���@YBS�B�twz���8��j���wn|��DB�n�W)PY)���X����V�%�8����xO�x�!�"L�F0��(��tF�)*Ql�`�
�/�%�I�2����]<�%�ƘiI��τCG�\�����Q�^��`M0�R�~Tb�3�Vp5�(��p]��2䎘R�B��̊��J�@��J�IH�.����~����-������&�=�1�3z6וyJ$�
s�3O#�}���&�Լsvު��)h�aZ�5i�>?�哈��*�(�h�h�}ƛ[���7��F��u��2  }�6����F�&���ܔ�d�~VF���Wh	l~�}ԑx
�*�.v�HvA����ׂ�z?��֫�`Y�?�9�gzz�ġfS�
	�${XGX,FD��
;-��3�|#�3�	�����L%9�&&��T�ߟ�I���j#��DC�4�8\'��w���R�		��zݎ�P�'͌C*���	Z� Ao�l��.��59�HB��~�#�ωM�����ю"��*w��K�:X*kN;#�fm۸���Z�T��Z*�p���X�Jy촜�&�?��+X���3�|%�f�a��E�d���c> �ys1�g,gӴ
K����x����_��\�<	([@?@H�j�[�A�7�/�X��ɚjMUfpe$nP�%�3���[�$���'��T%\�Q�H�p;x�C�$#��_[��R�L�E;(�)��?ʊX9���9��K�+\��*���}�ɚI(DW��,�0�,�"�&��8V�Co:fJ1~ٵS����������Z�~T��my���MC���w���{���LY�����#?U
5

5�继?���0h��7�7���[�Z�g��l�.��|��jx3\�[�o�x�Jp��E�x�.jxӿ�i���-�U��<��i���)�2f��}n�Qb4�\Z��4i�UƙQ�4�\j����\z��43����Z4��43�`�
����8�6j5*����\���
���٪9���� ;��e”m���\�鎍K��{,�Δu��Һ�{*j9`.׈q
^%�j\y��(;�v����KN�aytP�:�Bwf�/�n�#���U�y*Lf�ݚCc>�ߺON��ѱ��Ƭ�L���gP����n��>�1-x���g�ů�;��a=1�<�Q�����#�ҫ<3��Y�1��>���>�):Ňm:�Ն�v��h���iv*�=x�)8m��3�cm�����u�zb�|���u=!w*��x�~Gy0�أߪ�@lWL��G���(j�V�	B�`ޜQ�QP�O��G������r�;!�/nD�=�WB���u�]o]��,-�����i�uc ��`�_|�?���Y#�
=��:�@� hYjK�r�
�@��Ƹ��ʣ����_�W �ݱ�.���4
:N��m`/�C�X	`ZB7c�;j��z�<eb�4��%����ا�*�M�%�P3��4$P9QF7�pEɽ���@ڴ1V�5��#>�8���ҼQ�
R1�G��p��+L�e�P���p�AZ���T~Jȡڴ��ňL��=�q�zH���(�b��;uC&�H;��%�3-�<{O�p=�-��q�i��ӋD��#"qp3Ъ��CE�Xm����o�2��(����OZ�,�e���tW�uN�w	J�z}�`
K%H!��%6lx��"��k�GE�yniY��#�אU�㰥r>����%�Ec�{ �T�6FFՍ��v7͟�@J�Hd��FF�̓�kZ�=�aQ[�"�$��1I���0�����Uޒ;�'�)���f&�O���$I�AX=k��I3��it�L�@���*4�-,��F�8!�|I�l�J{����̞G24�l4�(h'��gy���u���k&�A��V8d-!
&��~Ȗ�e�{$���!;�#n������?����q{>�$�Z��8Y;����WU�TxMLUi������j�zo\�fs��c�#���!�2o�D�,��a@��(��q���ߙ],�'q��T�y1x�Q�X�k^����=X�ܲ>4��4b��k�đsbҽ����E��)�A„��{�d��;�?�&ѹw�܄b[&�j�������84�b~�-��W*D����8�t�u��6�xy	�#��7^=+I���9���j�,�,,��2
���Yj�%,3����f�$PQMj���=�m��;H�9J-5E�i��r�c'ٚs#��Jq!M
�[SEM�C
A���ĥ/��������u�r,F2���,Ǚ�ɋ�p)�[G*W�
�7�0�E6AN�D�]�hr͉(\quU��������F�tY��k����p���[X��V��͐���2�9-������r�5��E��JV�m�A�o�z�L�{sI�e�K��B	��V�Y�%!�5�VѺ�1���O
Jr����7m�%,!2��!=$�y]v�Fq��n��$�H5�F�~O�C�Z��ܚpao��!�H.��'7T̓�LHT(7����������t�紙�ji2����j�}Q�ʥ�
����g(�j�\�8�;�izZz��@_-�g�~
}�3��_
+�M� }:`�������D\�� ��54!��y�FQa_ZQN��L��O�o�R���5�>�37/��X�3�l0&��O5S���3�]’��lz4/=��x)>	�4��L%%̪��o8K�j�ʊ��Y�U4�4��l�,$ފ�3Cl�rq��I�I�	�OCE˅/i����-֑괡��1�:26\c�n�
F	JR2�Pʚl�r�i/kh	$�5n���@l�>�IO��#��2~�x7��.�]��\&��4}s�����R�}O��l�*�3�㓁���i�$�!"ttg�*�8�8�[?=��~�/�(�H*�*�V�A%��3i��,��s���n�~|Uf*�2)�pD�r��d�*�4�v	�v6�K>�v�)j��)\�6Ԭے���U�*��f�r������<���,VfeU�y����.l��Rb�6�5�Ŝ	CE��㸛�����m<��$(jҾ�UΕ����+�+]R���=%��R�S�c׉�t�����y;��&d&e�_C�m�����A������Cj�B+W��-�W�����_)��1�7���e.r���	Q�]��I��1*����+�^X�e�KI1fu�TUӔPf�'��٫��X��n]6�:O	*aXFg=��N�i�>_�,SK/aT�t+��=������O���!���	��Ֆ �.�I��ev�yv��/#A@�`ˮ+�t*�k�ׅg_Ȕ�)�$�[�
��I}"�g�RǹX��&M�:��`4i�hb��#�5��>v�1�p�b]�̼(-�;_	
c,�Ѷ�ȧǽ0%fY�#��"���b��!jT�e��hRZi��R�l� *kd��\
��h����|�#<�z�_��!��U폇�ob7o��V~*ɐyA��#���I�	�<��	$eC&g�H��g䮍���C!�^ȿ1�NB2�)�P�㜿�?��b*u���>��35��VG����q��B�?��_���L��@����������W��L��N����_�=G�
���?�����_9.)��&�ki�<;���"�hСpP��^�9��{�o;����M��u��������Qg�>w2�1N���V�s�^G��c�8����#
��s����N�\�����s�X͜���S�lĬ��y�~���\�j���Rl�v}�w�'|�I�w8�UK
�n��'�_�S�^Z��&|d��ZK�4�h�Tq�}$)����zn�R�B6q=������y=��#�}N�3j$�'̵c��tѡ0�V�^D*2��x�;����|���I���)���f�5�c�[0���p��)}@�c���m��mvm��/	�j�2_
KQ�3�Դ�k��62>
�� ��|�L�32O�a�C������:Y�(���$�Br�7厞!*��>�C����V�@��$oa���ڋ;�HqM�+Qɳ_Tk����
��s]i�<(,�Hf�v�������f�&�/����_���ưZ�T^�����0�<�f��lw���"����Cw[�����9)}�x��m�D�`�3g��ƌ>�[jf� �_]Y���,�=`}�6:%\,I%�VB�?�U���wP��s��>��8%TGL�j$u�ܞ3�]�Y�Q��N 9�{�K�V56@Z�i�ʻP�Km�I�I}46������X�+��f
^����7�D���ߞ
��e���=?3�2�gx�Ĕ�*�A�l1|������P���y��=o
m�ݽ\飚�4�o�݇M�J��I\?�.[R~��@��s=��H>en���`��Jf����c�Ԙ^�F6���h�-�ÿN�]�zK�\E���{*w��ߜ"�P���Kp,i)�z��
�X�瞿�$?�0'?��g�P��XaۅD͇R��Ta�e��/5jN	���pZ�(I�� �?T�xo�=�6ޙX�G[~���k�R^���ɻȇ�T�	�@�:���	��3��w��*�#����sT8�.�Q�BIq
qb�(ȿ�4���)M4:֘	�`�h���&��ц�+��t<���r��f
��w�<���3�N�F������<�ۗ���:3=�d��Ҳl�aQ�[���.x��߇y���7�q2�����0�G�
?X"ǿ|w�D�O���y�~�-��ڟ��̘��`	]��"|9��nO��]v��k���Zf�emP��[���ٻ��̑7֩��ux1՗ ��~��Aq,�lC�0.P��B����=�����;Mh�`�SA���gG��D�pG���>�T�aGL]asgj�O����d�B�? ;���azê�J�0u�
i���L�u���9
A�"�@��u�9��;2SNg���X����|F�;ҩ'��8�}�Y���5O�z`Ӹ[�a_�wf�1�q�M�<�<��n99��I��\k���g��u��#c�.��f�ɓ©�$�*�y[��٢�YC95RK�YC��Nz1��[p�:U��-�..juf�jF�X��N�d7�Ӄũ��-tue6򑀠D��+�Sh�Bk	z�2���A8;�ũ%_]��e:;2���e�k�:�9q'����)�/VB�L5��y玪e�ΪEq�T�R‹��.h�!�̫�8<V�����)�HX��}Ua�Z�]��=�2~����+	БN��0�`R���m��܀iP/�a~M)�����z�P��*µ�WZ�_�t�ʇ�
����ma��~�(EG���wɚO����k�����C��-�{����S�&\|"�@���J�m�Td�@i�{.���'B����>�������p��ϞZ���%��p2Ŵ����Ae�
���KԴ'�_��Mٮ�(�0O�G߹ٟz��+�)�~�"�4�s$�q�2(}Kc���;�X~�H�'�Vߧ/U>0�z���"x�]�,|%�����B�1�ð���p���q:�^�<��,d#
?�y�8‰�3���/��ՖlgSvM�;�bW�x�}��z5�J!��O)�G��&�����r�4Z��(&R��
�=.S�jF�Qv�'7�w��^���+�F�O��<��n�d�
db�Z����u�^�	~��q����~D�_�_)4�LS�"��Nk�D���{�;V��Q���@����m*L�B��}�pN��/0���)J����Y-��v.U�ol��8k�Vh�C�Kr�����C���qb�~�#�/S�'�2M^gq�y�1Kx��u�#�+]�X�GZ7��jyYN]�*%F3F���HtR��	�<�:�5�%y�H�?+)�	5.2nF�9E����$
��5=�F�
JP�S��!�C ���F������lI�a�I{�����j6ְ�`����K��r�K>����8�-s��=�N�qg��ӭ{�0⋜�}X�u���Կ��t?�S��*�u9�M��O��� �R7�2����_��B��g�x�����/P�-�
"O�����#�]O�;<ڑ�nՐ[}��wu#�F����@gC��}�'�0���T��#�V�@p���!�g�@�q��#>!�KX<��k3��#YwU4R~4ѭ��a�����V!/�A�p��Y��N��m2ƕ�#<~ ���I��B��2rOCi�:O�!=<`���ܗS���'ʯ�g?ݪV޺�p�5��"��OT�����Ƅ�҂n�u�
9p{��:Q)�H��ޔlNf�cN�*Ej�?!:�Sb�c˓��u�l�L��J�&��wDo*���Ι6��ގdO�ǖNb���T4{��7��;�sg�������n#�kLS#ź�j���m�[G&���ګ��K�l��7�&��������d��̴.�2B_��OI�����
�4'g#ꙉ
�w��m�W�\�:�K�$�E!�ܘ!![�O�w^�z���+��mѭ�
�n�֠��#�
��+ԏE�@�-R��/ֲ�ef��p����[������rhgq�5/}�@���wV�*R���rek�ooX��iҹ���ŋ�1鯂J]�ZU�x��PiԄkܓ�g/lv?��80��JǺ�@
gBC}�)NYyG|'�_�q��~����x�-�F5e�,4�����O$
cԩ;�����v�>����L�*�b7�G&r��g������;�*��S�{�:Ap4M��2�)B�m�B?��~LȈSķ|cB�X��g�9F�wQ�_�'�0'�5��
��;)Z|Z=C�)��VZ�t����� ��ʨ�a�g����Af�3B���LMw����ͳ^�|���'����3�Y��M_�굳.X6_���5���;`Ӑ�[5�X�O*�B�K� K���lȏ!�VV:�cbɽNz�?�`ƐG6�|('>�Bez���b�r�@������=#�b2�f�.Aܓ�Y~ǣe��[�������D:��/@�)W�2��5SspA֍��sAtW�vG�d�Kѓ��2K��+L����+R��~õet��p����u�ۉ=@ȉ�mr��C�	�8��
f�X9�ωF���b,;.�!D��+.��G��d;X4&�'ͺ�*<�=P�ղ����T�t���ǿ��U��n��y��%ظ��)��@����W��T�ݿpi?]տ�n���Rםy�.-��k)���?u�s�bJ�@�������
��1b!��)�R��!����wB�8�!�6?r��Ė#т�Жܸ�V�B��bMծ��Ͻ��E�$�6=���V���_��G<e��rXu�h�y�t�S�8�O"�R@Ju3[,�����h�0�f��}�
��O��Oڢ�,MK*�����!��O������r��o�ƭ�Ɓ}4Z���J�?\Ӊ�����&��ta�h�#�Ү\]���
`x�Q�[gB!�s��$-�U�o��Q� E��}3���g.YN�lYN�5|�V�^�r�ps�����ɓ_q�C#�P�ɇ<��=#��,٥x�I�:�Ib���c��m��v�m�0o.Ln{H��ZOB���2C\b9����H�<8�T����Tn��)��k2�SQ�rj��� ���4�cv���!�ڙ�����[56|ۘyi��_ܵ��b��LZa��6�\
��\!��B[jɼ����:p����t�P7�::F?��@�(�C|Qa��R7�0����^�~��[�����_�,�@��S��s���ߪ�����S��Sf�T���ip8��n��6����ҙv��]S<p���$h��G�)���H� D�'U��'��GCJ�!&JP$@���F�$��TȐ�a�0��`�pSȳ�x5E�ٞ�<��
R=`�Q��0�����
_M�(���
�K|�z*qi��Gc��M@+/��߲����;���uO;�mih�l:r�;���e����3�:�dL���TS�a���'��ܡґ��Yg>F�)�D�t!�d��{(I�;A0�ԃ�L:=���L=��C�
��P�C%x��|��E�-�|,��H��m�w����D��2����"�&j���Žӄ�_�Z���v�I�[�9E�Nf�j����dEPt���G�P��-��de���ހC�8c��2�/y����J��(���i���x~Sm��]���q87��h��!n�=�tHu�~�BU,�k���'j�!���3��׀�6����E5|�I�J��_��8
z��-8�0�C�;Bc�Q`*X��*͑S`�����H5���$����iQ2Y��U�;���r!����	v�Ǧ�Jx%^P0:Tt�
����r�̈́�'�Oc��oI�bҠ.bu'����]nn#ɶW�+T�r,G�h�V�.G�i��&X��Y��z&�9">���?+_��.�_v.�vqI�u����ATük倎Y#c2M�c@M��D��Sj��80g4L���9�H_��o���1���;���v3`2�Ȅ�p^G�OGAdNEq��Q&�(���mT�Ƞ:`�O���Ƕ^m�y�H��/��I�s�C�	�ػ!vA0�<{H3:��;�f海-��W�@@�<�-i�?��M�\��l�<���5Ъ�〫����<��E-���Y:��p�NNNޮ_qA��_{�h�볪WL���플EV��(F�`-V�x%�p�Y�f�!�ٝ�䶘y�ƻ5��	C�9�_Rt6��e_N8O5��8䤕��E�(��f�@܃u(&Mb>�C�{��	��x�b$L|�-V;����]o���.��9[��Cd�UI��vH&��Ck{�J����1կ2�QkV�Y�UO�G#�^�v��nfy��q�E���Rm�.WRuQ/�ƅ�-&%Ĥ�9�,�Tݫqo�+��J�_�o��K�(1��=�!�#4�SO�8W�`F���$��Qk/�Om�Q�����~l�2i�Xp_���2�e;���p��Q���ޙ\B��*�$��,���W^�7yt���n��ԥ?��Y��!埶���~u�LC^
�A[c��7X
��sE]�s�ֹ�s{�a�[�S��e�r���n�[����c��lbpI�x��D+z?1�Ke�*3�����B'�H��*\0`�/�[k2Q�-u��a���X6/8�iXBH�õ�G�N���`g8�"�?�w��):/'MCBm�A�Ƒ-�3\�e�2p(��.&ؼ&�1��m�I>�
J�5��na����S���Q��!��2���T�#'�7��7i�=��R�"�9�̃�r*98]�H��9}���w8��ɤ)†��0����%��I)ҡu��)�`x2��R�3�fm�Emso^�Z��4�vw�|AD�����_�_`"O�qsS]b0�����3��N2�$����M���y����ך�2����"0�U�e�Y{-b�ƨ��ƕ� �r���'� I�7���693
�-L���%�<��*~f��p��=���Q`�9����~���o(�𿗩=(ׁ���������?�[����ߝ�OYGU�oQ��n]�M	v�MG�>���l)�������4�.�g�#�;��� �Jʗ�ю$�����x�AE0��}�#�u7����-ő6�"	̂-gّZVZ�|�'���QR[ &D�]w�1���>�2�hCsc��S�ԝ�`�x	?��s���zl��hdש*UI�t:'���20v���;�Û��;�1XC��7�>ɾz�v��}�$�=W璅�w^�,�իgǞ��d�!���>���0��;}I՗�����k�/�
�S�?�'��lt&��tȉ��)1|v��fj�΃C�y4=?�E^�̥�CU�$��7���P��U�!"�sՙ���M�cm[q2����s��C6@/���h7�k��Vd�ĥ�@8M�yOk��I�
���>�\M�Ȼ0%[�F ˚|����Zh��hͶJ��xF�.r�ue8�s!Ș�Ol�`��R����+ECn�=
�)�;G��a�}̐��G,�S��+���~�#�{{s{�Cx�ud�w�o�v̄9@��8@�L�'L�Z����PH�_bB.-��'\�W�EH�X.H�9Ht�"�oz�7f��[1߳�c�%
q�nP$�u$*���
����rp7���gm�@�`�B���2F�{g:tD����J��Q��'B�op��$�Iq�_��1�c�pfd��Hkdz���-}�����3R@��S谎�[���7��h�L١]���\���ǽ�@������-�ND^�Gy{���w@��.;;,�i�:֣R}ϵ����+�|���%��=���n?c+�ۃƗ��$����I]P�`��H3�8�!aP��DsI�2������@��1�vV뀣S؞�ac,V�/cz���}H����3�J�;[�K���8���S���f�7��4Q�6�.�E�J50�>�6�\DI�I
]���.p��)��m�!��W����N�j�H(�%‚�B+�(���Xn����Gu飸�}��f��}�SW~1����m<��}��*�A�2^U��qq�I��RzL|)�´zq����8>a؄n�n�Z��#�B���	���=��������z�|`~�_~zA���������$�%�(,	���mng0��¾k��g6E_��E�߾��.��\�K�����XE��V0��c�.�v�z���2s� @ @%9�}>|_>f/(t��C���	9�N�#����ā4:(�c�Nv�l$#T
V.����;�8����d�Yn|����e��ŗ�X���cBSH���ߊ6%o���Z]�
һ���\?R�(EC�f��k[�ݪP7�>��VA�X[zA��z���G�QG�'Š!}���j�˥��m��]�sG�?�>*y$I0�B�Ւ�x�N�I2�xZ��-t�e�zI��V��v���ߙ��:���SLp-�x���.�>7�L�ܨO���
�&��5Q%�Ϳ0pw!3��*H6V�z�}����>�9}���I�9D�g ��F'��|�Z������*�A*z�c���?o�Y�j���<�\�M�c�5��փ�����wAG����r��C��ΖҨ����LE/����[.���?ȧRK³���-9��o]�_)R"Fd���J�����fZEvH�e���>BDAn�[Ï���V��b2��!{ï”���9�:��Rܱ�	�^s៮�_�dsmX�H�=6!���N9	�f����#����?��Wp�cm�����㿙�KГB۝_�w�ioBl���ş���,�.@*�&;S��H�5s��W�#A{�P��&9����N}}���F� �eh�'�i'%�װr`e��G��o�hz>oݗ
�hva2Յ�k��w��C�]��n[<`
S�Nw�>�N��^R~{/��,���`(7`���_i�1�$�7�R1&h�59�1��t݇�Gx��Y�(�
����hV�*0 9�Ic�{�cA��ߞ��
�J��ӛ�֘����Mvk�ɨ�zz�+,0�~a�|���
oD�LR�*:�t	�"Y�H��f���'��#a��ZV+�^!1�bl���\�)����7e*���_�̽f�*��7A�G){S3G�N������� _��hYe쬺J4,&{�\큸"�p�؜�5��+1YQ~)�8���t)�T��M0�����!,��\c�H��<�#��bC�a�If�3ڰ�����L*6L�8c԰?AD!�b��4�e��m�˶m۶m۶m�e۶�޲���w�s�X��OdΌg��4ҙ��D,J��0��8��/�]3x@ڨ�[
+dSU}FŪ��tXljg���J�
��2�c�P�U����2t�e�=ž��C`�$=	�"	�k��vJЋ��"�K�
�<��N<�XnP�U���8���v@˚kC��]�}�٧ɮ��x�������Bw|��t
��q�Zf|��o=�us�����xc�O�]��6M�kİY�d[k^}ȝ�+�.�!4����ZG�MݻFT�y�>�~w$r҈���ܷL{��z�1Cxh
*���h�s�4[LF3����!��/9g�]E��Ժ��)�?!�)�U���1q�|z�y�k��|������mע��Zߛق�c����'*��z��Z�ĢE��‘�xP
75��\ü�]J���:p3���>����m�h„J���
�NŇ�rˁ�䳓��e����8��5�@/Ӯ�tK�AD���1*�љ������V`�Я�����ׇ5'�=.�
�?���G�j�t1u2t����>TeZG���_���Ð��5�`�ߔ�0�%rS�0�D�T�'�4����r��O+ޥl�UJKUU!!�l�Jr��K�?Ay^�UU6�!sn�~�f;ٻSq_7���ׯ{��_s}�` z!�1sh"hC��T�J���ц�b>b�*��u��(;J��|:�A!(�O(e�\�_��i�즔=�W>ĩR�X8wE�'�L���"&�}�46�'-��F~��#^q�=�Jbv�f�H�֞(m�V�Z��fT
��#�T��� =+
��= ��P9�i�]M�U�K�p�wT���ie`\��E&\�{�IF)�GЍ��cXk�˵�VN�)�RZ�1̕&����-(N��c	a�ht#I$?��	��C0�a��I�s�����(�y1���F��dOKN��Gi��m\e�)B��X�����	��SYjM�*c
����t��e��IW����X�`�+��[�*e�]S�5����x����Y�+t3�Xr_��9B��t�^:"W�g*Wj�_�94��(�3��h�y��I|X���'�N#c[�6�{���u�B�x�U�� �4��(vK�9� [^`��=����~�ݪ/��n|�n�Y���^!��t���I0�o$�X>��N��i�	!� �Ɋ�S$���~U�7T��L��
{�u��"X�	�XS|�J�N�s�0y�/�6_�ګ���W흊Q��f���*[��'�a��~�k��R��n�(ph��k�{B���
@�W
�G�������@go����W�x9o�)�~2rS��{h.����W��kݻ��]��)*�_z!T�S�T�kE��ܝ��B?�bwrf�#K3�Ɋ�It�y�]����L�qj<���l<�s�r���^Ve7(�>'amQ�	(AX�T�m����r�����j���uAQ;'�*uڸ�1�H�ev��w�OU�g��`I�E�o3��#ɤع�'2�+_��B�n�״����u���Y��1�a"V�m >��~7�\�]V�YR�b���kc)Օ����q����ߝ`K��,���S���2OU/*��zò�]ֱ�止k���n��ʰ��i�!��n�E�-���:����<@(�7�;�7�vHxR.4��O`_�N�����doBU��˰�ⳉ�����coomhaj��#Y�q)AԚ#��!��y����hB� �(�d�d�L@�|��N�W���yiU��뗪��^{�[c$J�_�Vs%��'T����U1�9��O��t8M��
<³Y-�ƹD3'�X�8r�V�9-�Wf� �
��znX��Z)���k�/h�
���F�3�af0��Ɓ
v�A�%03��Z��%���8g"5ۦ���k�_K���?V
R��ϰO˩<��;�tin(�U��i��\��*xt��Vŷ�d�O�wPV
����C z;D�"p�=p�$=H�bf�:�d�ν3]�.�P�J>�xhd:��{x��x,~�~����BQ�$��
S��3�
��
�������;�c���	��*#S��w|�,m����]7���il���f�xF��ԕ�����J!���sUm2a23j�./@�h��B!�`��*�����5όdN�!\�5�./�K��ө��{J�=)t�f̠\"���
r���O��$��)�%�#��<sV
G��:ͻC���Y�?�]���-�,�{j�v�F��d���B����ݎ�$�j�6��y0��*�ͻUa���~��E�6��*����PkY�$�V��|mz�Uҟ�]T���}NV�Mh�c�JZ-o
	�����D�S�S5�N�d�t��eu�4c�]_���bP��A�m��9�.&Xo�gp:���c蘼`Gay�A�9�P���]�h�K����8�m���s��)�SUT�6
��ٷ-�����a�V���,�TG�4M��Dg�!^����v�xe'?�9G�_x��Qz�����=��ZsE�����&�.uߑÝ|��r�q��6�:�*�;�f�V������e�~�s�{y��⅁a�̕X�7�^��@i[7�oHl��P~�/P?��8�®�h��Y�A�@�m�"h�J_S�фo��Tj���>�%���Q�V1Sv�">�G�tcƽm}Û�s������1��=4�CTߘ�x~�@��'\��	z����'z�����2�0LR�c�?�ۍ��Z���Y�d����/��Aw��J|�_�u�+#E��v�#¬}�Y�^h��v�O�����f�qOh��wO\h�)�7���1o�1����|#G?���7����9^�q�K�8��A���������P��=u��Wrc��ܪ�5�6��GB5j�wѸnj"?
!����q���䅗���w������?��n�����������h���5t1�0u���*?YV~I�nW�[�\��HQ<�r"`$f�ʀ$L�T'��R�-�pS���aX%Qy�m�rGr�����|����<s�y�}m���w�=s�I���(�Y�D��i��i[`2З�d2.���r��(Q�g%ǃ'���i��e������ٍ1���'-1���!U�<���l�j)�D�w�Poo|2D�lϬ�G|�|@����̨����g&h�V�*S�f�$`N����.��Z��$�BN�Du$S�f1�"���#j}��d]ӕƥ`W�]�qh���(�L��P�[�Rz�~*�ٵ��,
il�U�7����������/�jlP��\�F/�;r�*m
t:j��j)$N��?f��˶�{�R+O�`3��y��7[��[=���-���r�\\��U�.��MBoZ�]t�͠:�s$](1��G�Gh�ˇ��m��T��n(_<p���267(2p�X��}/�Tu�z�h��D_��6x�rZ��d�;���!�0����Q�A��ؤ�D�|IO�s��W$��P ��n�}$��9�!��0�_�o��=_?rn�;�;�셺�s�PB�pF�c��/�����JF2���h��.k` ��8�A����%k�7�����f����Z���lD/�_%5�����B,P�	C&���k�EA�F>Q�R`��(��a
������ٲ��/?�~\�y��7)�7��A���0T�Ty���p2M�5�'Sk:QXV����&�T�EKw�����ӓ Iɕ䛾�n�?�)����
ٹ#��s2`�.M��8�ƚ\�R�
Sr���S��pؒ��]	#|�b�,U�e�1��)���9���H[���uDd�E�f�$m��sǡ+��L�)��|)3�5�,�R�*X������KM�L�s2��'|�)H,18(˕�\U���f�r�bSj�̝s�b]������ׅȵ��Qΐ1�'f��pqǟ�&�b(�	��9
d�DS���i��;I�-��ru�P���K��.9���"YS��K����g=6eKd|��
,ծ�HMʮ�-UEKt�*���ε������q[�T6Ŧ,�6eK����uK�ǡ�YG|\7%Eqs{�S���ŭ���c�W�-ֶ��O
n>w�̦|���R0���9ܵM����9b�R1���y�9d&oi]��[�C"����h�9	/�R|$!Ȱ<�%$RxDޤ��#\5E}4j�89jª�
��/��1
e6��R�J���y�\!z���d�a��,/U���2ñ8\W���6
��>O[1�9&O-Ew�بŪ|���|-�H�n4T	m���0ʨ�B�S�|��X�N,�2B�.�N�潌�bT#&~F��\St����|����8�~�Vhش-�)$��T�gR�xm	����1!��l]�Q16-� f�Ȇ���stU���r���x���7�|Q�(X7KUVx���h�	#5n&
:*j�<����U���cg#gGG�;�%9�Ǯ�PQމ�����j*Z�D]5s`��4L5Q�t:�����Q�dE]f��A����qd���6�P���r�KvHB5E$��½��t��|U�h�D�p��V��xaZk�*ȽeM�g
�����g됩.���T���qij��f��pz�8���fR�8�X8J�h����1�>�`�LIg/7��[��f�(��˰���e��Y�墊��"�L���Q$h�xQW�@U3����#)��f������7��"
Q�h��vy55UTq�x5�ޖ����q�I��yI�T�9c4(ږ)5�&&;?�ap8i�!��΃P��*����K1m]H0�f�t}�a	���g��A�z�FX*��QR�������h���E�j�,�]D�,�'��"lL3ծf~��ml�����$�l�W%�F!l���r��i9iѮ������+CR�^2Q���SM�����Iږ�O
E��剒���"8Xv��h0T���JZ&ֲ'�~�[��UE�����Mb��Zy��-�4}�5�/D�Z*<����,b-lg}.��g���M��Nr�Uq���U�G:����*��	����nEN�&�E�{��:��v�zd@����Zm�����'u��r<0�a����`0��G���Ņ7����æɉ?�)j"Ru�B�4��_^��-��X4`�K�tŜ��Y��y��W���"��2��ώ|��:
���/��K������_Z�+1��0��ߝ�`p��n���WH��K����K����5�W�S[�2���
%� {�WX>�=̓O6C�$2���|�"JN�]�r���AX���>�@E�ʍ;�k��5�6~��N���%��U�<�R�E�Q.�1-#`E%��>	p�����|(n�T��gB`(���>L�����a�&����'�Ì���58\�$��-z��&��ԥo��P�i�\�\%�)�q3��"��q��R��󖊴��`W�Xy �,%}τ��Fh,(�JC��-�]HR�r�:,�!�,5ỉ�����7*^�(q�g�y��f��ȳ��f�@H����RZƀ�A�Z����=,i0�Gz�	@ �a�y�����_��)����ψ��+�ˬ�A�Y����b��r��d��b-?ť$N�������`ϊ:U�D���Q�@����**e��Зg�d(ME�	Vt��v��vP4���0tr���(6|�q@�t[c1�Ί��>C�v�(ͮ.^����U����2;��?e�u��h������wP�[X&�mΜ0�I y^׮�_Y֙���@3'�m�Bz�y~?~�aЅ�򝔉-��O�O�E�V�fdb��R\Xe%qY��U:UbwEG"�i�����9&�5>�۠\�s�妠�Z
�%nᖕ�k�hl(EUM�K��g;�x��@�I�R�Ck�G��8W��bñ%�}�LuC���}�t���JLqEU����(�L��H+ao&�5���t�wء�/�&���hik�s�Vwə���y�[����RZ<��B�O�XN�R����" B�Kgt������C3%������mMMUEHBS�f�������?ʒ&���K���QC�r�/�إ�Q�Z\GC���&ꮐ�E�rj��i9�c� i@�igfT���M�R3pX��~��\��=�h�M1���aA[���k$k�Mv��6yw��w
��&�EDс��"��<G�ΐ����M����
)�,
�t���XJ�a�jL�F��T�)��Y���^TN#[#�z�S��]̕!�M���D8��@��7D�}@g����/�ʍd�n�Ӈ�f�$9BZ�˫�-�&���Zcv����1f���[��#P���;��wI.��)&�&'8��wL.AÃ����WL~ͧh�wR�a��q�ƛ�f��>\ʭ,��B@�Pڕfg���j`R7��@��+��}6R��l#N��)�-�$(�������0�؀�ufjۨ&�
^(�-�Q��^�&�MNhgک���Z������8S+׭�8�ᜂMbh��5hr��`�գ�΀t�@8�$|&�TK���qB�'A�&���Hx�@��j?�F?��VL��2�7�w;2[?���ި�]nG���7�B�X-�Ӌ��\�;(����y� 7mB\h��	�T���G��\!<��N%<��w:@�s� �i�gbfn+�[��T9�m�*��N�=H�D��=��0G^$'��Y^ �
�D�u����8f=9�F���njZ�^1�����x���R�\� �}`nV�⡭��G�6W��nC�2sZ��u_���(O젒D���:�+�g�3�����ǔ�mN>��/�/��?��`B����
�u˗K0���N0��Jf�#/��.�M"ǔHc��&�R6�Ʌ�Z��{�@��a�8I�/0h���YC�`9̀��%˙��5R��10�5eO�EPN�y���ە�p��)
V��։�S����{�kgf)�L̃�:���7
��$B=����Nr��ML����q�ڶ�D�ޠ��8��w�*Ҿ+p�k�\
�IS]��_A�48�܈�H�p�����K���A�^E�.����� }��ѡ��K��%���z��^ؠz��f�R�]T�Z�
*��#;����3N+�O�(A�JY���K��r��>LԧP���4ς��}�r!i5T=�. �8��BP��nL9ca}@l�a
�I�������6�e��٠.5,*�����~���q�D+�сYT�i����������esa�q��9�RGBZǎ9T�ـ<�}U�*deQ�	�;1�WN�(��������^�PmF���v��~tA�>j����
ρ=\�d�D+�U.@�FǮ�� �B�g�=|��>y��X����qX�_�ѿؐ/vW��`�@�
����,�>Y���<�ڣ6��[w�Z@�]�_�Vz�PO�;;��N<�Gy;\�tp�f�7"�jM)<�\�"B�ex���u�v�ž�ʮ�c�w\'#��l����+鄯R�lR.����p�V5������
7����&h��B������ݒ{��ݙ��79{�?��WBJ�
���k�h6�aE��c$-#�_����r�*ۚ( �)̒$p|R�
�����Α���w��_ ��0��Қ:_�:�2��,Zz�^��Y9T0�Rd�8�6�G�`�RP
� �(|��)��V�%!�mﴵ���w
a�u�bPr`�B�(�7�'O�m��C�'�,�1L�okGի15��U�f��J���5��e���$%�$9�mm��T" CZ=�R��@Z��t�I�DdB��p�l�'F�h�Bf�Ƅ�J,�-��9ŷ��p/N��1�;���A�ླa血���
i�����A�,q�L	Vτ�H�Em�PF#�r<v�)E��63��;`?n��
�O&|�(|�$���qֻ��-1x��RV"�U�y�g)l���
��@�f�Q��v	�e]H5�0w��I��['��䄶@9��f'��T%�,)N��TMW��,�<�����C��枀4dn�O6}Z�&�P���]�����qe���b�	����6|bh��m��6'��d8���&��UM_�Z��ziEH�OFq%8_����1�ZQ#�oIeI�MZ�O�!���Ð��t/k)���}�c~.��g¯�;خL�H�m7(ë_�H��76��cz�3�[������m5�,|�ز�DB���}
�6[lْ�!2!i�eơ��R �(����j�9�v9{�Q�=�0�c����~��C�`:t'�:�i�YB�����p�|�m�cۡ/:%x-_���g;o#���Z(�K�Sb�!���=~�[�W�����ol�3����e�|`��>�#�p���m@�a��e"�≟���kJyǏ���p����7�+���m�^h'�)
��rH�M�v�mj zk	3��Q5,���Q���/v���t��Խ������jh���9���U
�y��q���:�!T�|��
8�PG��&
 ���`~L�@JnC+ڿ`3��&r
F��s�5(�sv�|<_�J 	�mtVҀ�6!�ZC���jAȹzG̗Q['�v�v_�����[S_�/��%�?���+��-�_���y�G��[r<~����tXB�����=~Y&ˑ'�b�4�N��eV��i�4/q�MfsJo��egh��u�I��t�>�G,���'��Ϫ0
��iY.��Ml�%0�J��l����z�A~:��#�j{���\�&�zI�A�
N{�ϡ;п����؀�����V�]�0�5�(2]@ֶi�R�f>ҡ9�ѻ�����XL˸罞��C�G�ڪ�n�qOF�ڸv���W�����y'z�T5��h�Y�"�ƹʶy?�d�5�U
�^��ltJH����q�}T���8��6��y��7����X^)#���ꈓ�U`�(��zx���w2��uj蹓��_k-� o_1*0�|���JXG�v��(��RHZ�B�Ke��Q*�m����� �<����cj���3�JG�_v��Lr��
?�A"0-E�9�R���lq��;�/P`?�Q�\���~S���byZa�Q*yC���\.3�Q��0�tn�>u��x=�g�>�2��? �lޮ!��~�
��~���9l��{֎�b�\���g�u��� �~ݳ��(��@�AtaٹNq���m8�_�N�y /��a�Ofa�՞	i"Bd��#�v�`�c@�B��ߤn�o��qi�*j��]��
�,o�+.S1��(�a�W�a�E�n�z�̲���j�ݝ����
����g�J��п�v0�al�����:�ǯBL*�����}+��w��;p*�rRV��AN�@`Hl}�]w*ʹ�C����Pc_�V�5>���׫Fsw`-��i��-�9Zˇ7�h+J�eJ��k������(7-��a^϶_X)W���:] �m��C��=-���͆����9yq� ϋDoA�&;岈d���
�N\��(��kj���s�º�^��Q�a��J��l�Q/��"OY�սd���g&���Qسt_�{�՟0��yⱝ:A-�q���i��כ��ϙ�,[{F؞[UB,�ҐE�M������ud�O�Ã�2��5r�
�~����+�¸��9#/�\�v�yȸF:�Q��j�;�*7�������`:!����������s��22�7UcQ�i�pq$��b�#�k��t:iF)�<H�O�$�>��_�V\����#5%
�6ruȳ�(;��7k�'6Rur��3�;riuάLo�%7��O{��{=������&�Rgle�-ű%//�aHzX)cPK��ZW��ux��%�F�𦠼`x�
(�[w��V��`�=�V��J^��)��zy�,�"f�p�<�/zݫ�[�*��eTr� R#�����qٿk	���5��I����bi^Ь��a�M��0$�>&���.���Wd�~�,f��j�s����@��W[J�$:�nY
�W�vl��H���R�^�'n)�3�}��wL{�Mߏ@�6
���~�6���k��Oj��h�<�ń�I�"�͹�Lb�Rk�gZ��X���	B�K:l�_@yK���#�j�����	o�^VH��F�?���+Q��+}w|iP�n����P�N�0�f��e�i�3��E<n:f�kÁ�g���.۴C�J�.F�[
�ضY-0w�x �2��ʏ����|�r12�n����j]��������y��<��f�haܬ.��f�X�~Q~���7�����k�ex$�laK�9/1+PN����&u���?��8+���7Ȩ�g������I��'�čj�<m����(C��N$1K/8ʠ�|�
;2���b�2����'�i��;�|�o}S�Țt�s]�^wu��N��#�B��wDʟ��bb!�rL��t뇻?��!t�e�=�8es�=��%g�O�_��
�yX�a�)��9H�����V^�=�LJ�0:n��\�چ(�ib��#��“hs�j���N�Dֹĕ��!�M�j77��m��<)4+��+fk�5hwn'�@��\��z�۹�t��:���6-�y�<\l6��פG�`K�
9�-�;��K��G'��X���b���!�>�4�4�K�F07��Z`8k�/-(�eȅ���s��XVbX�DT:�v��:I�^�c��n̠�9�,�SN=�O䉇Bi6�I�B�>�yYz��K��.�zYz��I�V�W����v�|7<�B}��9�m�3O}]����ګ�.�~e���+��j?�9�s�{:�Zй��v�����R����bi�{���V_m��e��ׄ�S����f_�J%=��F��rz*�9����i�{�S���&Y_�ҞJ����K�]E����嗔ե�T�e�T��������zU�^Eէ�s�^���x�4/�iU��
�j��J��5yEuq+�b�sYUrk!�?K�Y�v�[�Z0�r֕��2O��¾��=Ů
���Z�OҴ�_b8%����p�%nQ'�a�~�)+Zܲҫb�W����nelJ�C�W.��e�Z�jE��E�6W\�qn�je�u�slV��Z��Mj��e���ժ�7���BWԶ�Ϲm*����W:;b�	�t��>
m1��i��>Mnh�u���-�o<W^z��}�V��>�nԻE�#�V�or�h����V֯�Zߙm��H�~�W{�Z�+!w�v�v@�6��Ŧ�������̜[�ƠQ`������Е�c�s�F/]�R�|�v��Qp�>O	/I�B
D����́��]�s�F�Bm7��FvS�s�M}7-s��)�UnA7���N:I+��
�䇌X�i�3�f�/�U�q�F�=�UD�ڇ^ݲ_NK�=��g�s�Vٗ���w¬���z���g������1^�x�V��y��//���{t/�%���w�-��M@�}_f�)�n���jW��M�������{lW��M��Q�;�GZO���-��܎�L~�Q�#���d<��/����K��[�$NL�;������dS�'Άs��)�e~��3fL���GŻ/�F�
Žr�$���Y�����M;�_���s��s>?dƝz$��M:&`p�(�����蝿f�:��rsֻd}ژ��]�2���^N`p7�"�B�T6#�z�rF��=1���h~�S�iN�s���D���T���\�Ϥ~B�z��6��_u��n��;�ٻ�
�;�ػ�s �j��?h���m�ܥ�̾Q�"�u>��l���_��J�j��S�Y���W�W��N�N޸=�k����~�Z��[�d
ܸ��A�~���f���?����7�_�?ߥ�P���|�w�Kg��l���=������m����d�ku�����=&���E�.�ƽ{��g�|,���K����w!c��Í>f��},�gc��y��M,�O?G��ͩxl�����'�1���ڐ?�5��%r�]�\�8({򀇚�!Z!D��G,}������L�6�_;�v�k���mm�mϢZ��?�h�/��yDL[��;�D\�E�<���2.n���ڣf^��{��z�s�z���Q��;E^��W�Z":�Q���#���E�>P��R1�z�N?T��*����y����1/.�(��FM����*�^bєyPFY�Qיtf^'���4h�y�"K�:S�:�'v�μ�"��{�h�yޢ��r*^�ͼ�QT�|�kI��4O]�3w>T3O>�3>�t��Tt�Ak�äz�'Oѓ]D�ڻ;�)�͢��}�Yw�n��c:�����[G��v�3H�]��7Ď�/>��:5�zt+������\7^����k�m:6O����!���颕���ɏ��͏ŽُԵ�/=��o��o�s��G,��P��U)��I�N_�a|}����z�%v
�"��X��D�w��rŻ�z��EuJ�W�Hs_�a���]�����]��*�d�i�t��v�}o��3o��co��+oI��nJ��$�W>$��d���ջ�]Z��vT�W������f�������a��q�@�s~�ϣ|2�;�h���a����o��l�����	��)߮J/�)t?薯�R�?|g����GM�~Jl��	7_��:�jx�g~R�n(7!\։�R�@~��"&e�7i4OA=��	l�6h��ä�%�	��Р��K,M�D
�>�c�o�ur1��EY#�N<F�qR������E�P���(�Kg.����j>@�0%*l�Ԓ	���ko�����Y,��D�����O�|�).3m�ê�';��S��OI���2f����m�	�`J��PN����F�;F1��lP)H31��!Hp_��a)�,�Nb��,�CL��X��y� �h{���N(F鐓A+L#��^ �JC��(@������
��Jb7����~�
�5F|�*��>$ds	�N�P���U��0.L�=�8�U*�Y�޿�+I�2*���Q:����
	ِ�ֆ>vH�|�ĘE�<N�8�,���\)[jm�H��kq��Ӱz��2��B�#�\�a�|"��5���B�0Ƒ�'��I'-]�z��ٺxKh]�BV��9����=����#U�I�V���i
{��mh�{���{N'4�վR'Z��AY'�-Z��n���h'�.����m	������.���y;sڣn��Q�I�5�7BRwa�Aŏ���6�G�}�djm[C�M��x�����i��w�C�~���aWY��y��҄86?\�#�� �7�#��<'~ؔ�!<c����7�d��7&��X��a���_��
r=p�ǂ��{�o|� k�"~!Ͼ|��oX�c��~�Z�����x����Ji!�������_#^��P����E@=�Ve�O �(mL��YJ4�~e
�Ҳ�vN��T&��a�m�S��7�I�=EK"�`�'VS�w�;;lj��+�L߽& ��6�"�eiuNq�r�BKC=,9����B�˂JW(ߴD�%�����d���^��\�A�8١o�
k5b�M��[��%k}�j�c��oVY�3�]8��`�����^����66y|+��㵕ʶ��w�D%��L.x�2���� �����_(Oi��`��+� g�J��p�˛� ^7�ޏ3�;`y˝D�(=����^�̏:i���ۏy5�;8�[��m�2���~�HQ�މrS�3���[�e
�V��p�74�όx�CAl(������r���w�}7��k��@f7#���I�&�"1e=щs��^e�ϊ��q��=�D��j%��i'G�z�@훈M&�2�lV��?��g���,��A�|K.����\�|)r����%��*�g�+��'��T�1+�a���.��}y���Cҟ��"o<����++b\�(F99��2W��$��y9x���5�O%Z3r���w�O��۽ \
���p��lVI�;�!�]lM?Y�`d
b�:�T��X��>��)6�)��3�:���5r���=d�v8��+N�/.��~ݽ���Cᐙ�D��C�v.�����G�e�������;���<����m<t�a ��^U��/LT��w��G���W�3*Ճg���H�>���Wv�7������iU�c��z�—!+�
U����j���5͙�?����*.ݮgB%�����T�w�m/�b��=+�F�\��3�7�bK�v:c(�:
O@82{%M��Ԩ��N�)]���	���5�Er�Y�Z�+*��4�˸�󦪙����YKI�킋�ݾ�z�t=kM��c]
��Ɨqȱ@�Ԋ����B̑'���x��H�g�N��o�f�긗�s�%��tV��J�ή6����o�
#b���b�BK��c�Ġo�%uk�p�5�+[�Z�؅�'��N��`I��t����������B8G�@��[�:?�Rp�����'�ģ��I�j<]�^��s?�����n3Z��~�2�+J��l�|jLi�#�ѹL#VI�yV�
�)�FUΤ76�,�Hq��O��H1ⅎ�e���r2���T.L�Q�|�I�xt\��~���8�N|o��S�Q���e���q��P�WeR�b�`Z=���9�t��)�e_�
��Rw�}��)X�(DŽLf��O��F��w�ï�,쭋#�$�V�I�=6�ȑ(%+�!��L�(�FZ��S?�1����|=\�jA�|�ULU����'�L穜���\��!���j�+�N l���i��CNy�֨�b��`]->�>�[�\C -<ľ2>�<�r�r��@;Ȼ��ݼ�_��lE�M������2YS[%S�JѸ�9�Bg�$�e�bWV��sY<!� BDa�^)(o���k���*�̩#�K
�~�\�d�痛�6D�B��HQ�i`�����iA��<Z�pA��P��,�dƒAqD6��5o��1��~�0<�-�ኢ�.&�I����P:щ+�L�3��Nyg����>�!�B�UQp�/8*�q�&
��猥��o�y�g�y�d)����7�?Fst�==�[��D�b��O,��<�q�
�{�v�@�9
��y���W\��}��~Of��8v��
HJ��j@����`����ŽC����i�4����k��wp�����}U��tew�ʘ�"'!5�Mi��9���³y"��%[)�@J�1��l��FfL� T��1
��[��QE�A�$N���sP��:���V+V��o�wK8��:��R�wm�7cfBK��7V��e"�P�p\e���͂S`��� �D4�T�Y�E�F�D]�n��m�Zj
ж�`s�6��|@��~��G�i�S9��L��4CV���$G�L���F���nآ�R�{���ҡ5�Z�i6�T'n2f��L�J�+w9'۶�B�̞٢�q^�T'9]����x_�
�;_t¥�1�f�rI��O�?FN�∺�����`��B-��ƨ.]�x�E+��Q8\怜z�W�������~��(�8<
�E��6�&�\h��5������d�D��Y��Ӭ�p0����8Ɩ1���؞w�"���,t<<���+`�F9��Ne#�
�<�;�Ki�,?a�Ö�9`'sƴȚ�L`X�HDb�UƯ��E�d���A�V���+���;J�����}��mg�	�w�;��d5�يF �0`�l�!��f�@�dR�>4���U;�0~��|VS���O��@����l�_m�n=�ּ�]�*4r�k���SJ6��27�@k��n<ْ��'9�A���ɡ��vS����t�s���Y/��##��C���E1y��40F�3��0�0��3��;���s�!�7Ly��-�gr�Q��RA����ܛ�(��?Ýg��E�w�F4�����[*��y��[�Ht��hn=����"�v��x�M�t��XN��F���E�D1���,�ťWG�U�T���6����֡�~:���khOމp���S�Y}��|�Ħp�>����]�aH&�d��>C����m�����:�7�C���L�TD�0,�V"JD�’̴Ԅ��,��I�zxw�����7��&ۦc�vұm�VǶm۶�c۶���ۻg�=3�����_U���Ҫ��x4���<kX
gVB��Sh��Z>��*�Z�>Ӡ�1?�2���0
��h��|�|s{�:���y�����'3V��E$��g/�?*J�(��S��|�)%�NH���yEN(I�=U�
`��b`>�J���$��x�ט@ާ��Nu�0��D���^����)[�OI���x.�ֽ�x{�lw�d��H��z��A�_�|�X���x���tU��bV�su+.-~�w�P�	Y!��I� ��;MD`9Z�T�\�1�����d1��eK�&�1g�K�-�����s�Hu�K#�;�&;��)�wҠX̃�,V�Ή��
ksN�z))���bG��Ū@M|��@@d&�h�pyS��Q�eMĚ��6Qb ��~b���u�R%�rGHO��B�L|E�ɮ͑�ɨ�a�V�>���t s��Ų�j�-u7����W���W��̣��H���d��7H�W�urB���2����5Evb\�A��y V�n�z��7���Ӳ�iXZ*�^�b喇���:q���1���:���(jFX$�_�֒�W�1�hY�Bav:��õ{R�C���J�C*��0�[�LP�G�cu�9i��''�|-���?��AL0:&��\�&�w�OfG���يQ̣?
�~x&�=�^N���qT���-�[E�y[U�w�+���o0�/f���{�|����K�e���Zۊ��	����%��������~�q0o�H�p���z5��?��ETi�?@�vvizdv�}K�ļ2뎲��G.|T}n
�+uú���d�>s�$�6�C��h�y�e��h,$�Lb.���̉Z-�bQ@��dOJ?d�Q5V6��Pq�\�~��F�5�.�A��`

{�Ftl��w*�W>SL�o�Eըf:�B����H��F��%*i� $+��cO�zj�Z����}�ر+3sk���1lT}��>�j�6�4��o�B��O�
��,A$3����`EE���u��lc����"ݶ��&��)�}5�%C�2��]g�{�l��D4�K�†I���(�Y'�.�Wޅ�sdO�{As�EJ�U�EL����B�_�0Ʃ��&�6ac��$��)nN�&�p]NiB���l���p#O��0�~���8�1�n�%�<Xբ��q7l��3Дp�ʂR�m�z�vg��2(���䶹ȶW.�C�sf�v��M�݃]�2�%�9,��+�
g�^a�.d���:��#��DMTZ�"~+��Q�8&��O�č`�AR��|XM��0D�^I��U�
�ב�k�w�|A�^�x��[�1��ʹm��P�m=�
(�c����G0�޹���c�S�DN���Jǒ�����`��әO�/�2��X���Nu��w��wD
��u���tQ��E��׌5`�p��Žv��k�/Xno.J{x�üe1�$�<�i�}��p��"H�	y�ȯ97:#�����áYg@��y�(kC�`K���:�W��%^�<�S�_��S�#��v"Wb�hz�7�kE�LK�Z������[7��h�04�<?I�֣��$ߑ�w�ݬ�y�P���{�r�,��T��-6�~���^#y-�ۈ�3�X�W��ޱչ��U���q&�9��]3叀8�܎���\i�t����ŲwFj��)���΍�a�ٽm��oO����tWKbŠR 0��ι�"��c�s�"a1�:ύ�ٷ_�s�PC)���Nh>s�3|�#����t���EVh��x�(����p�5Ҷ��~q`O��J�Z�|�Q��T4����#�|e
��W	��&*X�$.kH��@��-�w�G&�V�~������i�m��"��."��Q���~�+�SxI�d�
4Ǡ�}�:��h$�ᆊ=�����}�Q RF^����s�P�+�/`7�)�+A|i����ަ\*%TZ%%���e��4���s�CB�����j������2����p�=B\Ԛ�M���ӯ?��"V�
8��߅D�#�Pt�v�sv50��ko�?YI�>>�I%�&�j���(�F09`~��<fh�}���VD-W8�b�6&������
�t��;r��}=8�Կ�;8n(ᐗ	���4"�8A_��@��Z��=�4�T���3�h9e@AH{�5#DBX��da]��Z���Lߕ�eVQ$��l��	y
���wf���$����=>�j�l��|,3q��8�^���ht_|����7�n��-���������9l�y@�A�A��AY�AeD@�w����~Nd*���U�/�/@~�.�g����O���O�suV�9�҈��cS(Ac`��c�r��*Dd: FD(F``��; ��=|$�+$H�cء��,L
|��c�C�şI�3����tl1��G��m-��o��4�2��ga&H~\����(���ٓ��W(�
QZ���JGWC����;�	��Ϩ�-��x�����m�.3װa|�.��\m-�����h_5�c�f�q�wU�W�k�o�i9H%e�H!��6����C�/�_��L	��܁�d-�i� ��k��Q�����$��ʘ1�����>����T���������˝8���);���.E3�$�o73"%�UOyw>
g��#��vG��A��yS,���f9d�g����KN�3e��>��,�����P,��!�ڇ�a���B8u�B�jL&�&#��H%��}A�,)����S�õ�Vī�l�`��QN���D�+4������c��]ӳ6�����I�=�ȟ���z����
4�m�| 7@Q)����R��'���œ�K�5Ϧ{$:H��`x�7�Ӊ�)��&S�w���/7w㪦jB�|�%`�Ġz;R���t��	��F���c��{��n8h���w��'CHoeYV�I�ʗ�}Ѷ�~���k���D�/�e8��u*GЂX�;OڗV��4n}ΝS�iҺ���O��O�	���G>o�n��oI`S+�/[�ݿ�CGe&�.[5?�9�Rd����b���!��q$IEb��fT����9�S[�Q��m7`�*��K�X����h���&��7(ۜz���?t�[=s�Fs]�pX1z���3���bT��L3��]�WЇ�k�b��#��.W�e�+��dN��ë��eg��8ʞVD�>�-�k��#�8Y�E�k�t
���*Kp�Thm��CCT,Dx@J�c@��n�遞���.0�S�@`�Z$-a��2�A'Oa�N�
p��G�݂���Ր�9�s���w���\��V�Q��E�͉��ħ��A���$�&X���1�ZB`�~�;��یxK�=���{�p�(�YE�zr*���X;ª��3yu�q0��+�j��
�w�����Y�Y���q�����
�Χ�yr������h��7��AQ����$6z�T�ƿ�C��
���s]j���h]�s�u��ؠ����;����,��0�S��2�.��{�l%n6plixGQh��5*�����#V"]��~�Y{�VA;-�!u�@�s.ɽ�$��	�s���9D��5�l>���O�շk!;S��Cg���u�<�1+g�N2���UO�jǕH͸8R�����`�p��݉~�!l*�T�s�49�oK�|�yl�c�X�XE�ց��a��t�liǺA}����
�&s��o�ey��Tz΅����隣�&w���i��?W�=�^*xu��qk��nL���z� �Mv��7G���Y|͢�r�R���k��O!c�������-#z�e�8WR��e���(��2Ȩ��D�7;td��4�y�S9����)�s���v]�[�$(:ڛY��O�e���i�f�_�A
U(B|��]��)�x��f��6`�K��ͫ��(>�q�$c����C�{��$��o�
���ٙ�vĶF�B��vZҺ�HZ�����(�L��Q|Lt&��g���b5�
��F˨����Ѧ*�Ѷ��ݛ1���S"�8����4?i�ĦnZ;ț� �H{�y�Ut��ظ�V~���j:b��
v��J�}zf$�M�x�؛ۼu�>$��N]����$L,�*�I�&f�˷:�C��b�����Z	F��6\���W*7��c�����i?{2�����~�2L�zQ6��*-2�p�
Z�4B�
�Br��T��KD�.�|s�Db�9iO��v����ݮ��x��o. _Z	,�	��.��csX�Ԋ9wUn��
�i��z�pp�C`�Hӆt��3C|�'=��pρ�WOx����.ٸ$Vr{���5�O�わ�`H�8/�=�<:�B0n���lx&����<�Fh3�ƚ�IHM>�Q�<Gp]%�;� �'_��>Z?�Η8��贡�){�.2�AL����]z�ws�%*� �����8"��?+5����-��u[8���3R9WEE��f��$�
G5�����B�`֏��`2O1��Cb��R�h���v����畴r���I�����a���罒�����4�����/���-a:H�0,9㏄y
��N��}ШH�oa�iB�b�җ!�^s�b�*I��<��ǂ�D�,�X�~b��dPh�dAW(��		ќ�o�B�?�+�^C*���g$�w�@��u;"}g�k���՛�П$�� W�-�{�. |��NƮ愽����y�q�K>r�������G{M(�̝�c�i��-T|��X���ü����.eţ�^h�N��Ly��i���=z,�/��#�}����(gU��|X����+osӊ"M0#���f����q<IG�)�H"5)��!e3�*0h�^�V�VR9��{7��u�츔�}i ��F"1k�T�?�v*79��*I\pDc�c#�H��A�;��ll�T�v.�oW���r�N'z����G}w�f��ʤ��7e	�_Vy�4�A��q�u��`L]�֔37��4�V�FW�X���)`Gؠ��iɻ��p��dG>�EQz��	b��`�$�k3��:a�ߔG��	��|�=7�մ2��&���!(��Hj���>�;�����
S%iw����֏A��ao�����w0[CpPʡ�ɺ�&&�i+U��lGΠ%��)zO,%�J�j�LM��)��9���2{ग़�8���ِ̋ulO
�Ʈ��5�p��A;8�X�忚�w���T��+|�e��Q]!�3%��`"� F'gKp�݇��f霑�/�9�oR�*v(�A3���N'If#6yK�i15�Fe�5$��`c�Eu���ݱw
�*��+���ul�S��7�7A��$�S��}h1�R�T6|���t�h����9sP�|�Caɐ�(�Nm
E3�����n� u����-9�%�+R8�� �{�A�o����KfŨ[�����o܆�y��+�ʹ�Goң��F�v����^�,�K?_�s���j�4���u*)8�����X��D��K����G<�Y%i@���-�!�\�{��.�îl=5�z�_���p!�@:l�:#TZ��]�Qre�Ľ����$��6<���2�X�ݦ�aCi�Ȉ���euՊ33�����r�gS��I�W��|鏉IK1�����L.��3h��R'���q�WԌ
J҇KN��I3K����"z�h��"��>��S�;D�1��>c]�@�j=lV[XVz�{4��;�e wډ�ʰ�_��`�W���A�lT�w��|~\��:İ����D�Ϲ|��P̘����)�uO�����MC�g|ȷ�/�����!϶�̶X�pDg��T!�udM's��
w;�$$��L��ȏ+�[�7�/B–=�w�I�`�~�1'z�b��5���:�{\N�į�;����O��P#k~�[���\��^4�}�ӡ������ȿ춖�7r��0���i���-�2¶���|J�`��*,8�r4}�%r���x��9�H<EV_f,x"|�|`!�|�)�G�~��/˩I��	�x��")R�L�sj�"�x��%g�š����VצW�����2�x�n-ҥ�4l*l�H�z�3�X�(,�1N���1XV��/q�}��LG���d2��B�ёئ����L$d16�`H畳@���Qg΋�~\'���a6�
�vCW�`2�����
M�Z��z>�,���:IGt zt����9-<Hk
��>eB+�0!VVQB�sU�siΰ�]�*	��[���^�<��5�y��	]��^THl��:8����p�|��
�'��|���0�}�f�JQ���Z�ι�<�8^���-�ʵzJ�"�Qb\��0��D
t���S|c6���C��g���	��C�T?C͂��V�񵹊Hn�7H��N�&Yc��3�Z�YOʈ�Ƒ�B�U�\,4�ؿ�g"1ۏ:��'M3��p*jD_
��:ΩI|e�ð�n��?�5�)u�+ �m�ȡ�����IA⼓K��ԃ�2��1��U��~��{��;�i�lс��Vj>��5�gX���<�Q�(_ho�1ȑ�w/��WϭW�1�j^�b����w�Q*Z��hs��y��ܫ��/kS��t6۹�р�9�
��`c��s�_��t�Zm�V��$�n	�Uw��fJ�7�v2����hnnoF��X�=�З��H�MFl�?-�i��D%[q���-2ӫ�vs����]aa�Q,^�;�mTJ��k�gx��o_����s��M�B6j1��I�Aѥ�1sJT��x�eX4��j,¦�DY��W+�S<N�G�+	���W�L�1���r欗��niڰ��~��n�`�W�NY�
��f�'�~G��۝�ٔ8Zv"���Y�t���=g�I���"��^�?�v?�.y��Ѿ�ģK�=�A�<M���-�*�-��-�,IҒ|�E�"�����{݇�z���h�
�#���k��#�h
~�
F�ezCQS�:��#�7I�������$ݵ�p�B$M%�#8��&6�Z~�[6�L�W�~T����N��k��zPޠ[c+7	B�H爪u��^�����0�����0����Q�|½�K+�N�����G�LII�iaKm��d�
}^	�����\�)�����m2@���7�nJ��4O�����ix�.`�m������)p(�M�Y���<茌��Db�QO�S�����h����z�C�Hub6Y�@�,���]>�$���ǯ\~����ؤ��}|Y�1]�H�b��ɻ]�����Ɔ�j�q�L��!�[#bb
 
����C�TҬ�'MK�{����n>��Ƣ�x���e���p�
���I�ٮ���L����E+�؈���j�K�G���t��7��V�{&�Xf��F2[�E�Đ��5e
㻨��W��y�T���5��F��[�ָ�s�v��������\��@�~U�x[]g�l� �YKӋM�}���d�m�G#�����rz��!T��[0gwC�r��j]��3f3�+�������������K�'n�vG�Hv�w*ū���I�nɺ7���e���K�O<�{���"�CX�O������~��Kl)���P5��O%Mw&E� s�Dy��n�¶�7�+Y�[��y�K��h�l�%�;Nuq��S�p_a[[��7���0,�r���9�q��h��Xw.@�
h��\lN]�!]�3:�}:$�m:�:�v=�b]�G>H��^�:�NS><T]V� ���}g�`���n<����g����PY�Kcg��]�c��� ��<��=T�!j�9�7tP�KQ�
T]=���(�$�H�C����Aë:&o���ۆ!7F�݃]�%+v�,�a%�0�I0{�� �޲�5	�t(��<�C�}Z�~��?�Tv��}�+�� �n�X�H.�X�6���������ߤ�{��]A�\����7]��������x�&��y�_��U|�k�S
��<�b����cz/8�L{s���AU������p��@���s�isE�"���xN{�T|��M�	m�;��1P����J"�L�(o�#mMZQ/Y��9��*U7���H|�.`Q��
��W�c~�;�p��(�X�8�#�Q���駃�Ik�A$����e�J�^��WM�W2�o������VC�y���4y��{�j	�U��FP#�s-J'G(�\�Мo�-�Y��O�Pe�i�E �d���8Ҟ��Ǡ<d�e�Aye?h�����(�G�IӰ�$�_!qI<�������
�hq*��H#����3�A4��-�0�&�|>Q�FeUk�p� ��l���@��47�x��ჰc�ۅ�H�#v����O�MZ�?!!d����o}������l-��{
��º�<�
�� 	���@�_c�t�+�d\�aR��I�_f+(F��f�"�{�W���Tr1�����v�솷󫘜�s���=>Q�hQ�a�i�D��rr��f�lG`Ȫ<���_0��z\:z_�S>����*�<���I>5��]�Rr_��ͣ�tk]o�_��>,��d6pc�������y�'Ik�3 ��4�4D��Ff�ʶ��`�F`��c�<؝U���ნ�9+/E�	�c��o(��F�����:լ�N	�sW�,gL��%�H��=��8�a
�l`�r�}s5��[e)q����̕'�H�Y��|0-�������v�t�􊓈Ud�ǶI�lO���I��Cم�"��N���$��ۛ��;8��K,x�8b]�����P��1�)��;��W�d���w��)v���_�07�dcm�M/��)���g��@���͜�'M#r��0:��O�]M$��=!��SDu����M=q��İn�i�D��v�1W��=L����㭄+���_19?���V8�F�Ea�`41/����u�1/-\s{ghq�_�	1 +���$�E������Ѕ�Z��tv�EI(!6<HrE�z�n_�_�h�K�I�#����r�;9�wP҆z���t���K=���$Ms����7y�d�Q
�����C
du�P���V"kR�-�E>c�?#F�d��Cd�w���Ř6��q�k�C8H�-�-�k�=�1d.*y��="�
��~m�՚�<w���tp)5Kr��
�%��~�B-�u([�k 0?@�Ѹ���g��׸������%������L�Z4�LY%+�x$����r���uij�Ұ��~��N��0�<BaBY�I��eT����ʄ(�rI�̙͝r,���0�QŻ��G􅏙El��\�$�F�%$�Jq�'
�����?��G��o�(�-r��9YY�����_=W9xI�n�ޤ4��CA�HH��o
4j
�f60��aC'}EP_"Q4Q��o����5۲��zxX��r�D8���wɆT��Z�t��8�m�4K�k��'��2�b	Rr`���;IM�T�2r<6A]��	����6��:�)�v!LM��Y����[����#_��ݪP]͊��rR����$Y[�7%���*��@��8��r6~Ԭw�9��ZepI�h_2��`�؀�N��%�M|�U��,�,���^(�)���
�(٘/6+]�3�|
(���4Y� �����3>�J�*~2���K�N��ݴh q�D�;�GIP��Zt!���oc�Xشf���o��N;���b�4/�����U�l��\��
"?|�_B�y�/u�D�%7$s�����Xz�����i�&`o��k���
�sA$�x��g����SZVV���ۛ쀝o�
��zh^���e�*�߄ ���E�J��
�){N����CCݲg
���'!qt��˻?�ϱ+p
�2�ӄ�
2<�1N
�GS�ǻ�z���`�C��6����W-��!{��p,�Jt���e�����3M�N��E!3�(h=F"�
5�Ѷ0lKzez0�˽�h̼�;%Q��/�ͷ���L$�4�ee���H���F�rnRÀ��3w.�"�����Zƚ{~�r����/�`m�/���B�l�Uc7�+.c
F�C0�+�P��� ��u�e�o�^�������Q��� Y9�*�:zG&��"����v���ᰫ��=I���/��X3�!s�&��8�ؕc��=:�Arq�Cr?�U�&\|�'8
��0�sQ�AvK�'
J#|p�'��M�����س��Gx�{�s�.벵��7�����/`R�7s4�n�b'��T4m�o�o�a&�
�f%1	Dn.�G�4���3��@Zvߤ��v�7�AH���qt�������ز�(��u�B�@]���hZ��\�����$�*2�	e�EC��v	ԋc(+eݸ�q���#�`��ni�ԵtX��u��u$\��lr�@��(`�{�'�VMW����5S��;���t�~X�4��fƥ�.0�U/S"�^9��
�k(�w��XNK! �
/d�[��6�q`)F[
�B���d-��)p��#�n�����r�����~+7�����S.��O���j����g�@���M:�=��&d����+�~��v
�^Z�Y0�215uq�}�Ż�iJZ�(p���iL�~x�]?k��&��1�����EIAJ����T���8�9�Vt�<|/�nYx�΢���)IZ�f�Ze�l'��C87���UqwU)���A0����U�"ݦ��-��َ����(�Kd�W�7[�\���;D�����,68�[v��d�i��L5MEle��`mtt�
V:������@b�o��~�P��ML����#�3�3���<몛��#�)��{Σy͢U���&�^���T�f,y{����j������V~S
Hk���EՆ��4r���=�ŭ�Ͷ���5x�ߦ3�j_6�	�*g�L=P
��5�Rޘ~�0>,$�N31�יC�A.��t?�ߞ�p_��t�CVl�lN0x�n�B8r�T�
��Ös1��eHD$�i�=_d$tP�@l��)k��t͗E���GA����j�qP�Ar2$�
�C�2�(�\ѿݻQ6!��yIÀ�;}��!H�Z�֘
�Ԍ�^ε�X�	�=�2g1r��-!u�
����y��B�#�,#GY��8j�����,ӊ[�k�T:�b���yl�R�;E��N���hewzE:I%�fִ~T��3���d�/7�]��2�K� �Q*
����kB�Ҭ��?�x��FA����әkl|�Z8�T���d	�����h�P�K׻8Ӧ��[Bh�X2m��e�;ݞ�T�!|�>��iIc�нN�@R�Z�`DhW�w���
�R�:L�ָ>V�6&/������F�Ő!}���l~&����-�C
�w法{ #9%j{L��jL���u(��ƒN����CXS{�(6���v���׈7���P�Z|���:T�j@��r�,���P졂4U�>\�c̹�@��{,u�� 9��#@fA��J{&��֢�ҁJ�@���Ӏ�����>),� ��85{��#z�Ӵ-M-/I\3l�~�.N���;W=���z�����i-�ۤ霨B5B��/|��Nl�($�ɽ���G�
/Q924���I+ǧ��5�["�ey���Xjg��6~��G��0��<�o�3�Y�wQ�<�)m�K�Z�?��6��-���s� <�(m����q����Zz"�׎��S�����pC<Q)��єW���1!��s7(&g
.!+�%��N|yO���u�/ �$�$ݠ1�"���=�1��\ݛrRd���f�J��E�Ffh�@�#�sC1��bP8q@���p���+�h�BrD_u���o�c�3(��4�g�F�)����]�uf<Ud
6�O%��0B\�T�)6|�6Z�0B2��v|�Z�Q��L����`C9����{����	a�������6,�k�b��*�s2sOfמ/��Q2	�7uW���vCh�$7O�6.�p(O�LN7(��`�P�X���\�/�v��Ў/�vx!"t�D�$�IH�$�BB�p9]Y���R��F��v��i�<���ݭ�no��N:�M�d�/�E�����6a�'
)�34M	���G�E���i�#��([��u;�`����`N�J����x+��2K}��{7VW��t�����y�4PNB͏����s�%��|ti�[�r��x�er��SO��f�J�5mآ1���&�"�N)�JiX������q�n�Jj�FUʼh��j���M�������^��NkP�Q�����m��9'm��|~�4r�M�bqN�	ݕ�`��M�{f�!;@�d�IB���Bk/;U�P�vE�4H��:�m�5�Oc4�k'z�?M�9����[�S�����=E�h���O,�V�q�
��������)�dဤ��\�ʢ�67�o%�Wk
)����=A%5I��p�8�mU��#jYäc��ŗcj-�C����#ÊC��b�c���+��}j;�
�vO]�i$�Ԙ��@+�]Wt�<�ᐰTh*�>�����fD�|���Ȉ�a-z�tuU��=e����>�8�8�>m����SrSLmۉ�VL<Js�����4��\�i4iM�(M�Q��s.�����s5���{сP�Z�im:���A-
��kp{�u�5��`P�u���'Q�o9LZˎ~�]��%��C��,ê��ŌVČ��������1y�v"��J�
���F4�*KSe����n����&m�����"�x0*�
<�V�����ck�XT������U4�Ԫ��L�-��şp�OeY����;c���l�(��bv8&�u�0F��t�c�d��N���������C��`!E�a��,f�Ĝ���a�VB>0�O�f��ڙ/�6!^��Aڹ�)���bLJT�Պ��V"t`�m����
��{�`�w�:�l`$�I)�1j,lX�T�!��[hJ��,Y�Q,z���SjU���cC��X�����#5�/�X��`�c�M�T5�-�j�3�G-�(DP"���H�1e�F\À:2�1e�d�+���P;�Ì�
��\�FD<G��;���+x\ ��Q͘z�:�p}��:�v��lW����?�5��Z�Zt���AT�{���K��!^V�=Ʌ���Qvj�Wꇹk����ア	���C��k^�P:��5��Z�N�}�FM����i~�#(TJh��"�p�pɂ^$Ճ�,7�j�c�kDF�6$��e�yim��UV���|�U|�����r��U�`�-�a\�Y�͚мm�Mu�\�&��B�\?�1Ѵ�H��י��Ҹ��d<��k����*t#�(������z������5e�eHN1��`�P�7�ӽ<�����|���5�w��=`��YJ�7*�N��Y�����Ϟ�ٕ�+gw0<䤫0.�*OiBO�G�$k���&zW���Nx���бI3���~.�1w�XM��O���X�8?Ï�>>�c W���}���H��O��G
�P�/k-�N��|B�ފ��gKV��S�~�Q�4p]�bm	cm��vL������ݐzN�~�ʲ����4���Ig�=���3>1g<�PyBam��m�<�_Uy���{�)��*�0�_Q�d4'N��&�t���_�TV?�@���&���
L����O���`2xm�D.�7��T��\_�>�BG\�(���(�DG�<�AF��Μ�(@,�[F_���GA���(�X$W�\�\�����&��R�Ϥ1yy�q�����*������?ϐ;ɍ���W5��熚����D�0�sW��P�������~���bx�r�1�U_�(�0�g�����^���������FB|���q䪨x�^���K�q�0�
�0u���m�]���n�B�Fώx����$%�(���%�P�Ŵ=��f���k�pT���K,�.y-z�����q��
^�nL¾��W߁^�!I��:,l�A� �B
�%����x�����S�!�"��>�d�J8=��@�*	b���c�V~��>�<���7�wy$J�*�
�`g�v0�Z*ķ�F"�c�?C���l�4�S�̿A�_�;��$h:1G@�Oa�$�ts?�T��Ԏ7��,Po4)
�'�ak�
�d�83���6^��.�0l�~Tz� ��Tnp#2��7J9���
�Bj��.�B?��sYrS�LH����"����kx��%�k,?��W<qJ{6l
�/�*�Nc$:�f?��^�a����-��9�:��hw\�[Oi��-Y��n�i��	���
F�tr��7�����Rc�'UX�h��i���a�|ԅ�eR%SE	���"ȶ#���~$|'�z�d���N�
oU�B�7��Y�(��nC����Ձ����	��F!��s���3�������)���Z��$E,#��/ID{p(�ܤX��@�9Z9I��� }�%�i>�z�����ȔY�4ZƵh�S�2�Y���h�׾���^��z>MEƆ/�z���;��;��ϗH�P~��PWL[�BՃP<Q��]5ɜ�~�#�\׀=�I���"ol8|rq�Lx�S4�8��˜�L���0���@����o��<�J*�,i�e��s϶<i��mѬ5����~��e���k�)�d���U�dVG�9p��	Mvީ��L�%p�Iٗ�wKHZE��^��eZ��nU0�E���[�_��D�qrm�Ʒo-ib��D�Ǥ���~�e�A��D���$h�c��)�$
�7]��b����[��(�	r�9.���
>}�w�%�CXv]��ǐ*8�b�������G�
��[dC�Xp�V�
�8[��a����T��.�"�H�Pq��h.���#R�ڍ�$����͇:94~'�D���'���y��AL�E_ѫ�����f��Է}S�����5e�F:w�;8��RnWF�WnG��y��
 A�/�L��������Q-͋M\���8���Ζ%njѿ�+chu�y\��{Tڇ #b��,�6
��C�fWۗC�D!`dY��rnYی����yBo�6���
���\!���Cp�_�-�䷵��D��G�Y%揃���U���=�4�	�C�C�c~sM��2?ew��[��
���!x� 3G�&|l���WĪ;���I�`�f�Sn�S~Z����lVp&Rz&M�*�[�S��V��<9�JP�A�BA�!��z`E�"�e��z�E��+NC7*L�+nI��\�N�8(�e���5hf��<�0���+~i�O�LH,,��s֚icu���d�Y̐�����2&WIk�ٖ;Y~G�Wh�Wl�{�g,�0�WH�{f$�A�G�,�z�e:�m;o�'Y�+�����`=W�)�[e��g�K��j�Ha�w
�|�����[>�D�u�_��'�w`�1{���9uY���‰ނ���`��9�|���z��ԛ�Â<��ұ>����;v=��)��5C�w^�_��q<�썬
��X�MJ���z[��77������:G<~���T�Sq���"Z��D��CF�
��1(��mpB��6d��~7&]�dX�m�F����'�g1�V��[��c�Gi|�H�8�;x*�w��[J嶆�	���q)B$3�B���.lI0��
	�ݭ�zK=�5���*�t���6܋cKO�J�@�[a�K^3�(������m�B��P3(-�i�n���#*W���4K�:�0�nŏ�`���X)4����&J8����•�'d�NF�~�+�z�	�J�[U���p#����G7�y'��l���O�A����Kp�o�L�����z2Π�Π�"�y����JQ���נ/wao.�"UM�\8L�LC�<���H���L޾\�X��(X	���]=�(,�O��/��=���S\�l��2:Z
�g�ܑ
*t��8
}�O�� 8����{�nn�ES2����HE`�J��י�O��	TPP֐��ī��3�|t �	�Ɇ~���rB�Ȕ���T��7�!Á��	������LT��<�.�}?}r>e��&Ҝ�&Z�`?f
��#|��kVt��Mb���J���?������xh��qKw�>FBmX�p����8��p_�Ҷ�H�~�h<�Gt���h\�c{Du^�ڴ�u��h�<�x�����ǔ?������\����p��d}��ɖ�&�Ok�rJ�y_�A�wfu�o-3�Dx��o�}�]?1�A�D|�|��]���
�z/��Р��r�\1��A<��}5q����k�h"����1H���-۶m۶m�Ƴ˶m�U�l�.۶��U�=�9�ow��/�fDFd�[�r�1g�XcL�sB��#<O�����%}%�C̔;��-�xI��`ʅ���[��W���s���;�J�[9{����C�\J�9u�J�[{Ϊ���
�\)u�ܗ�6N�_nyqEp��n"7@4!��饏v�/�ނ"���<���R͔����D8�r�H��5�v����޸d]�ʋ+�KxX�@�Z@Z��"����lUS�#������CX���nP�h��DSb!�. |Z���9Cy@�U��)Gq�Q_�2뜱<��X��f��$-U,;g�r;�H�:J�ar5Q��l�fN/�3�n~a3�K���g���<���n�����ҧ�n�Jig�ʙٕ7����cA���s@(*�i����8�eɣ:O��)�I�aѣ��_���K�a�#��_�L��;O����O��+f���;+����'���-�����9�q��g�Fب��a���*�;b��:���Yh84<Q�ܣLY**pyp;�����hT -��~lࠃ710–����ťT�;F�@d��#,��\hvM�O�΀3\N1��%zZ�\.$�&�v;�oi!�)JE*F�=1=���d�����\���aio���7F�������~�vYeciao���.,ҕ�8��
ƙ�A�
��L�8�[IPJ"}*�	�9��\5'x�B�"��h�بʒYewP�����bk�o�Q��BdWwf� �Aڕv�zOJ82I_D>Zu��z���ɧ�%BE���U�ƕ����G6o�׹��� �W�%��P��!�@��op�`�j��?GF�M`E�8�:��h0�)�㌅@Z�!��n�rbBL��0�����2	%O��Z)�._�2�0�M��ޞa���=Ut�R��o8�0p��5PT"�&"�����f5�L$c�E�oP�̽����%�t2��@0��5+�M�lA�od��q
g���y�3�n䶥!�[��E��v��R�:'(��De'ir4vW�]�8[�T���blA�72P�c9~�TE�D3w�G��c���
����زp8����XP=O�b�O��aJ[
KgC�a�z�}W�Y]-{�VRw�d&�Mg�;���G�s�'Ȏ+�8P�PF��7FF n�]�H�/:�G�Kl����l7[_m�39�p�N3��1RRN��9m(�f3�>�l���|�ʾ��"o���#�����i�7�����������A�{9�`�N*fb�P}���ItVaUU��JM٤��X�����Z�5��Wb���W]Uk����Z6'���Mq������U2�e��x�_����F8��s.n���ns����e���oe,��*���Q�2��PB��������z}0-��{9����_G�C�/��T��j��K�5���1ޮ4$q�m%����J���c��	���:7���d�o:�v�?/��
+z�kzy�����w7RcO}���SO��y?t�0��o)�u�.�����r���]�:Neq�κ<Z�FD�/���s,93tIR���d)�s�p���e[Lg���]��jZ
]�i�E.0�\�t�^��)�U�1����<1��*��V��B�C��Ƽ�F�3%��
��(6r��T���c
�"L��9�d>��xu]\n#�
^��ƺ�^������Qe�u�+N� �m;t�t%wx�Uwn[��e���7zԮ̈���1�L�x��v�>tz[y���3�{�����o<�;Ӝ
�~��g{��o�T�]�c␮No֦�ۃ����OV���O��6�����I9����‹�7yv/@1�R��2�#AhȒ�U�Յ��(�5<�EV��I�"Ģ�%���@��C[6������fd ��O��5��n�h�������H!�~|�) >��q�
ա7^p�@7��U%���z}]��������q�%[qR�~9d1�p'����&�p9��w%sm�U���� G����Z����Ǜ��_��&g�J8��2q�Mj4��n��<�~˓�P5M��?W�tu�b�u�C����f(N��j����c��7�?��/[��E
�)΀��5�7��n4	'9�)x-�gwAT =�Y#���{�w��6 @]���"�^S@l9�삽�Ƭ�B/Sy��Yw�>��䑦.�f��VW/ۢYJ��μ��>�,���Et=�����[�Х?�I|`&��Ǭ��á"��q�-��j:�I=�D�m�z0Йi�jB\�7�X�aY�x��L���ݗ�~q��8{��#?{{���~�Bʞ���t�ʯ�H�kMt���j*�k�#�Ԋ�V��/3����z8�Xj��c�*U�y�r�zj�}{���f����k�C[��z�e~��f8���e�"B����Ɲ[����%��=��
�:�{��d��g�1ƺ9�`�����Ⱥ��-NWV���'@����g{��H��?YXEXT��x��*c���N��;&��}��D�1�:'#���x����;��O�����*�#Ž�1�Fr���p��&�0��*��(ǡ���qc�͞I�̣��gy�lô�\�����bl
Պ�Ftp$�ֈ�|fXUi1�G�7��U�����
VL��A�ex����/�onҦL<D�fX�����G��t/��3\a8T�\o��eR�vW\څ}#���N�$2��ks���f,=b<��T�%6@An�=4vʩ٨�H����-�/7|�J�#]�.��(�	G(\�6<���	�#�]�
�+�����#'_P|�4��p��d��[�!q0+�2����:@������ */��
���r��¡�R�d�%�����<���S�Q�[�4��y
;��F��{�B6��y8��}��mmg�"��{�w�L��Z�.��A���@���'���Lu="=�6���:ic7Z}3�9�erG!�a�����6�#yIx��(}`��T����m��%D��F���9��Q�Uvm��k��j:xa�I�5����8;�e/fu�-����5aHD��.�n��Rbu��6^�(�:�`���Mr�pC.�DQ�5���Ͼ�ůkd�.��i��������"���<kS:�$�Z\v��f�d�FI�#�ɖ�{��)��M��!C_�z	a���-&���y���]��$B�)����P�U�:6�@ou�-�B�4J�{���-�o�O�ۿ
����	'���?�`O4����֡h00�oE��YH�e�[6[r1�fjS����L��������D�T�����U�|�%O��X����[;���FFv��S������+�����msQ@+	�=�t!�et�S�6��Ƚ���Ȝ��'��T.ϥEQ�a�Dq�Ę�T��'3�N�q��]J��܆��	)C�T>���;�F������cn�l2�V��H�Ыjb$=�Ф���Й^qD�@��&?�� ��w/��!�-?�������}k{����?qw���!?M�g�~pg"1�F�
-0���H+�
����q�k����

�P�vN�!=��v
��3��kF���\�h�9QN��[�l�[���b!�{P/m��~`CYn�
��:���D;	�n�s���@n�%#�4#�������@��
�'�����B�W��"ܟ�h�g��<�s"<�����\�3	��s�D����J_ߋ�RlHF�3	.'t��ݹ���grxa6�;q��1�Ir�Bh�YA�ں��n�
�8e�To�ٕ���8��]�P6����n����a�zjT{�K�A��`ۣΨF;"�������26�ޯ��3m�ct'�:�`j�V����al��5�Ȯ#�(T�oߚ�{���[�l`ު�[���dz�c��tԔ��
�l.!�T��|�c/�!׈ovZ�֚��faq�t����%�{IP`�Y� ����4F���jLh6�<�ǩ�a^��ư5���9bE�%�
d�����;�Rpm�o�ą���R�D��l��D9ܪ��W�������1L��,
1�
�q�`��P�XB�[�`UĦy
�҂��_}vEv��l�c�2�p�P��,�'�
o�sq���;G�z�)�^�Ǹz�y<���[�Z�y�����O?ي�E�ً��v�9?��KD�9�?2��0ht�8�w��P�F4Q�F�؃ߩ,iB˃��i
I?OZp>�}��Y/���ޯ��
z' �͚N�/

��<���s\��'�A����@����]�s;��˜7z-����kC��	�pTF�^�е?l�UHiS����	Z`�>���P����Q�dL�+j)1Vi�7��L��(�A��r���è��~Hc(M!t�k����.eY�ȫ��aÜ���v,9�r�-1�n֬`��NӲ�M�yZ�%��P0j�;��;~���f?q�p�Z�å��W��?%�cK��jv<W��E[�j�dШ2�z,����\x2BTz��qm�T�_�p��ń�C	�;[�LÔ<�
��X; �+@��.�Od1��?�k����)�޵��>rp)�
f��4s���KXh9Xh�͖{zq��Ȃm��Cm8��UDm�ܟx�N�[H���?�T9P���/-x���.�hm"=�E��Jc��y0�G���K
�J�E�kqo�b~.|i�I�Ή��~>I�/[�fϐY�@��6r�a�$�3E�k��(����1�'3���l}��)'�Y�����yY��t1��L~�r���+ɍ�1�xفa��Q��Ji�sp�]�-gEm.�r��b�r-|�/|�d'&�#(�;�ķ2Dh^#fפ_j��L�^���W��n�p���ҷq�f��02�??J
&{����"�A�?]h�v}��{d��X8
�4}�+N�u]���͝}a�C#��X#L���c�(����bG�&�u_�F^8�г����c<M`iP�5W�E���M��-9�ƒ���&��9�rJy��@�zցW�{�֍1�0��wR����Rr�%����D���kH~츓�fC�
9��o�Wh��S��M�ov\z����Q9�#
��&�*
���q1dZ��5�e�	�Hx�������5�{�l��
����#�Cvm����ZR��'�^Ԭ�|�c'S&mB+M4��3)�Z��˓�v�[�3I��o|�)�M��mZ~�i����mr�#3�Q�<����f~�W{٩9t����B�$Ԑ���OO���Y���ݠh�9��X���5I(�9�Y�]/S��9�"�g����L�E=��ր<�),/�|q�w��CW��
|�R�)O��%']�����]��tO�?�,���35	�=�v;o�/��k8Pe�ӀҲc�����׉��T�Pg�)���,'�����HW�71gg#��_�����X�+�PON:Y�G5���M�h~��]��z�:�~�M�S�Rs�L��+
ӻSzR�:Ugǥ�.it��+{fJz��3��+{��7���ͬ�J��*�
��������'Gd�(�+�Y�����$�a��ڽb1��N\�C�)N�~���{_��ɗ /�pNq�T�-��|�9Qw]���H��̕�P�0���:9Sz�����g"'űg�9%�6~?v��"��Ԝ$9�l�/���3�߃���x��r� �&���@��R�%��y����,��#^83�{*�z#��W
k1v�7A�W1����۰�
{�m�f/C�v��W�e�n���Xo�n���5��)���k`m��fk�W�1���WԀ����+���<c�f,м1�p&���z�/�ܞQS�Ƶ�+ο<�W�y�;��ֺ�}��M�|F(�>f^	v�9m�þ�5�;�^�y���ڗ�5Hh*��j�ץC���d�h�#A@I~7��c���g�K3�T<Ӵ6������#�Ym62&�de�$7�l=j~ɤ�z�4h�6�Ja�
��[:oR�������c���qx��7����x�C�h\��S�"����܂5�A�4L� 
�0�Rr��-�(����|pp�E�'pbD�����xt�J���3Z�_�]jD1��CS�VF�x���u7τJ�l�`����|����z�H>���0�w$���2
���8�����:9��(�����|�E{�C[��h�k�K���!�	�zа(��zS�0�ܩ�LSHdh)n�1{'� ��`w#+'��6�3��(��$
�2F-�f���Q āl�g��*�5���[�h�=��=�ہ�(�_^��W��v�:�u��
H�YɆ����'��z���V�=s@g��tk�h�L�dSz��K�"���y�G���A��AT�><�'��x}ç������>�F򳳧!|�$<���a��X��0��֢�xiHjp�cW#	j�C�V��6A/���%q�c��X,�H�.��[�ՍMi�/VV�^�p0��M|65H��mg�N��2ޙM/]��A\�#�^b�;'�<,�p�L��w�|�u/�[b�l�c�\� �}�Խ���!�^�ѻ�8U1��~���]���;<6o}�n��$�`ey�V�v�0����h�Q�&I꿅h�Eh�Q�T#�T#�)�)�)H)w��$��
���t�4���<j���e��_��O�S��o�C	�#2*q֐�a�%�QPeC��+��+��+°�OX�Ph�OZ�پ0�oØ�6���
d�����0��|+�v.�)*
_;_0J#ru�]�A�>�R&-&.q'*$�QX�R���زH��-%b�@���@�y`��8��/�{����HM#��Z�4��[�!ކ�m��er�y�"�$"��N�P�"����3�b1D,Z�B)�H�(�~8�n�A��/�$��>rmk^�2�k,^
�6fr�$8ai�$c�	�qtR��D*i���a��B�P�	��#��,�Q����q�Q�Ĩ+<�un��۶��锕U�XU��v�d�p�M�,�b��2��s�d��|;)ǖ�Q;�,wc�?�T�P��$o�i#�����%����;p�X)���d�)uO�x�!
��K�Y��<v�b����y�K$��o�p�qD�(��e��r���a����(,�3�/�/�B�Pⅱf��D�	�-�u��q���/����#���+�A��
��ﲴ�n�F��@#� �Ч�#�ҭM�]�`uF�kF�d�vڱ�צƿ��Jc6��3|�����p�Gb���Y"�+�2����)�A��a��'�Fk�B��R�ʧ+6���P��ST���G�J%�_�ckʐ��l��+�W�F)�%qB��f2�?ڹV�L��Ǣ4p�’Iq\���e�2�q�Hd���]�	�3��8"ȴ�T���$���e,kj�����ʜ��Sw�89.1@��@�裍��-���L�z��Π���8�`��8\�5����N���+�N]k@/���ΐ-����C�^�[��s�C��v��#�ga�XP����?�
b�L�(�
�+�W�Çv^A��Z�^I��������yƖ���&�x����^������v=^��ѫ�=�m��#:�]W���;��#�W	�P�O�y+���&;���~�R�#����Va�S����S�q`J�����St�ԲP%%�_ʻ�qck���f��ns��s%��s��ۋ�)���:x����X�)I�>��6��V�{k�d<+�?���f޵�牆������?'Z���B��+���y���{����������Lr�'z��^E�(�2��]B�����ꇎ��?~�1�d��/ռpUj��xQ�83F>?������W���5��r���(��̵�[��`��Yl7����m��j�{�3�]_�w�����I�`�"#[�&z�BM�����B��N��-��>����&��uG��˂�k�<t�9f�Eҹyj�@��=^�f�ęr��s8�1:ᚻƯ��Sh'1w�@�$�=�2���5���0]ma���Ŷ�9s�r��яAp0���TtR�`S��gB�U�{W?i�*$�j�/�f6B$��FT�3������zP >#����KJ�Sc&�C���
�	��i�Pv���G�2b�8�7b�
�g�8��>��_>��c��?�\#�A���e��W�SPy`XH.������f�g-	�4���'��M�T�%:&���g�&�z%Μ�~a�J���kʏH
�̣��K������zJ���^|�L%E�-�2	P���>o�K0�ţM�t>�&cH1i�!rH)�luIjWW@�Z��m_?(�Ü��8�� ��>@�&G����A��] �M2X��X�eH�v����M�v��Ot)��\}��]�����	7���ۍ����9�x���M/�9%���!�C�2�?1v|��Ee��9�n�P�!�M�I˟�~��XNK*���hx���H~�h��ˉ����}�(2���O�d'TI�-���速���&|�ßY��h�a�|Zd�''�8�	�J�����p�_}�fU���'�
� -�XF��8+A����RS���I���GoMj{1e�n���]0�Ɔ�Xa�Fq8��C%�sœh�Go �4�!�"=�`��vU� �7�Dơ�v�z�t���������B&�eBrr�,����B�r�n���J��n=��+�	$�'�?�8*`'l�����+��'����H3�3��Bi��N1񺰧r��2�����]��"ct7�h&��k�=���e�Ta�)�e��G���6z��b�6��s*�]Ĺ1��g���J��.��$V�mB�n��E��c�5�y�p��g
n���
ٌ��M�,��_�B��i?��k�(�U܃rǑ�|�o���ؼ�r�c����%�g���ف��}��
���~�u��[��d��U���+����o0��}�}��m��my���Ŷhe�V}/���������^�����+2��<V%o��ER%z(#��I�a��F%u�"��Eq{�d�������;e�I�8���u]�;��'�?�Q���]����ۻ�A������{m���>m���x���c���O ;�$�
�Ѝ�{����j��+�������_�o����ݑ�`yB׳H~�~��O`i?���wD���1���x˼'���d���k�|w�#��:��ݖ*�0�մ���1�%�F�{�%K�e�@�|������Qu>V�9}�|�תj_��ƿ��B���Iz��u�L��A�(ۑ�s5䉮
|�M:|�k1�a���/�v�:J@�U��.:��9���򑷞n�q�͝��v��hGE��|�)�V�/0���̛�_���l�mDZ�5��(Xѝ/!wfk�t )x���ݺ����$��=�_Q��-G\zC��?�P\�z��U'�0p���������N�m�y�ץ����]/}��h�Lԧ�7�=��K�ݦ�7G��]#}�lS��K�o<=F�[dr?��)��b�O�!s~�{l"X��:�!�U�䶀��arʷ:�O��h93^I�+��љ&2�J�+S�8Y�S@���b�Zq�D��"�d9۰�V
���AW=`�0� u�Pi�Sy9�P��sI�;�'����՘=¿�1	�|]�]�M�T<�G<��A��\A�D3�J(F�t�ڦ�K?5�Ji��d�Df��JM��"�v�B��AuD�]�N9y��]�Jyqd�&���"�s��>0�^@�]�F䀑]�S-��dʬU�C�r��B.���x�JA�ݥD�j��٬�*]U-�N3�%�&IݦQ�"mݦ�[+��^m�ݦ�[:��V�t��&�N����=p�Xc�|)�!�S���!ͱR�8���-T����!�����fdy�FA���B�Xs��ͽ�
W-N�8���&�S�Zw�̽:�j�rݦ��Jc�.kI½�ST��F-�¢�#�S���F#{��K�^��R�&z#��|��"�G�����e)��U�+���:������x��`p�L/~=�S٣��_�[�7�,`㣒]��RV����&�_M�9k]��a��Q�Sb�To�Y���l����7�Gt�~g�@����%~�cC����o�և���j�(�Y�]�w)iA���!oX�#�Вg��P��}�Q��K��]��]��b����Nş�o� ���!W���mtOxٓ��b4���\�;	�B�D��ʳ{��n���\�;�t8�k�x��AW������H����
[�[,z�mo�*<��
�������P&��w#���X q�qEğ�8mi��>��4$����v��(E�{���E��mB[6T���m�S�)
��I����i�gh]��]E6���������_��8c,� ���KO*5s/��4�����%�j��)_4	x�i&	�X+KEE$Y�!J�F:eAJfF}��*V�m��C��������q�4���<�B�$����4�ȅ�q��q��YAjZ������H`�m�@Sc#���,x*P7�3����Q���f��Ϫ{�����Ps17�v�p�/���.�!%�0��4�'�;�4� �4�`����%�d���AH�#!��wJP�)�߀7���Y�A�������q�� uR7Ֆ
gP���OW���"�}�����6��B�'c�,��Mx��g�V�0=�^h{�����k� `x��Xv����["6�9�P�r��3!��S�v����f�,�M���7��1ߗȣ��b捞�5�tN!a�pn�:V��S>���s��&.\IgJZ����;��4�G2_��A}������	���wǥ�'W{ukSG3sQGW7c���s_:W@U��Q���ݘ4��PzA`IS9BS��6'
6���r�z��b�f��fs��J��v��q+[4��I	����'EN�K�mJvc���6����Iw��FB"�l�f�sƠv��$��eoIz��v¦IB[@Vi�a��X#�(�B�������]����	|��	��Z�ň��[�s$����<�R���M����9���֚{��G��ڲ�k�����v3�㌔[��3�/'K��1�¦:��i����M=�@�!�	Ͼ�]Q���A�Wq�n�5b�N0���L��J��9t�z��y؄�_E�eokl�Dt,���M\��?���]��v���^gby��nǚ�d���.s�X���ݷ�"��N!�sJ�Uq��Ɗ����x���T�>v��x���V�QX������t�<݇���oy mb�U?��s?ƽ�~��at��
Tf�=Sn_��o��
��)�C�)���)�CS��{��ꯥ.�{��f��^]�W�c�?��~�8:�|�>���-�܎;j�_gM��W�F���/�&~�/@#���imgfj�b�_�[bj���Ȅ��C��� �&�]ng���2�@�P�d�/F����p��9P�g�Q}��:
��/J���j�s����}����i~ڠ2BcC���쎘�W�}�M�PץeIu+C>�&B
R��'hhgL���Ã�5�L�?q�ļP"��.��(8oB���؎�ˋ>���׿A��$�TRR�vm%u�m��^oã��/�=��Y�z&�ЕP���`wam�UMO��<sw��iŴ��co�0pKK��x"M�F�ً��~Ӌ�0<�Ts������>S�5����5��{����4�!�ɨE�.hAKq1�k�T������J��W�P�2�1%�p���G��5'��ZX��)c�OȽ^�/�pcCxM2��]�T��}��Ԩ?����xU���P�T��}K���1Z���`��]�U��om��_Ӱ��~��3)�V���� WMXuS�;�\�
$&���=����^^�*�I
�Lș��X0�E��{������ye��"��8y��|y�������D�H����_�n�����( �{�����x͎��8�Q�����B�:�Ӄ� ?��5��j��v��8HG��T��=�4f�ö *���^����.���hYUD��ur��7��:f=������
k9!ə��:�j��Q���}�Gj}�6���Pt�b=�s�7�:;5h(5�p<ض֩Ӹ�I�}�ɖid�-1��Yu�
ۚ'r�M�夬�Z�<E�ZF<*Ձ{��Y�8�>����J3���2{sd�h7c�y\����5SSMyLS7`;�K"�6�;��a†�v��3���$7Ԙ��+�Rɭ��e���W��"%��dpЋ�Ȍ��8[��@b���`Z� @+�n+���n�
�Ky��z��'Jn�N�Z��N�_,>�T���+C�?dz�m&:���@�Ȯ�i���=G%K�9��~�5�P$ϩ�
shN]X�Tm��"	xñq�[�n��G��`��S^.T���p/�ʄj��k����>K�ԒT3:��*�}��n����n���ؔom������ A��q��떴����`��e�{ռ��<;�
[en�� �m�+g'���� �ff����À� �+*,?
gD)�ߔ�u�a��}`Vvd@�����O�Ntc[�@�BE…�2;�H���'��AA��z�9X%�v���4w3A�t��8�؃uB=�f�SV��&��(��w��/�~���0�-9? ^:��+���£<�	Xa�'|%H�bv��Kf�t�&-�u�t�MFP��H��x'�-9�0�
����s$��'f���6q.ŵ�%*��c�(�y:j��z�t�L~��H�o�۪������J�Y�+Q	��5b@�y2+��,�+�[8���"떭�
�q��򉿼�E��Ö�=������>��)�;����7�N�L�I�na�?H��u�H�����<��fm�h��(��-amg��y$T�ZU�1�S[@L�|�����9Z<���>�É7��\�/�<�1��p�kT�"��7.�[~כ	��w�@6*��BD�dp��{�����po�Y��6zy�P㪶jqY@�GmL5Ke�r�'F5�_O����z�'{eɯ&�OM�sTQ�ud8S��a�ߋH癩�h�i�Zu5Gis0�w�[�/��T'U굺�궭O� �J����x&�Iw��%�xD�_����	��F���'~h|taZ��H�)�}/j^@4�j2g���pC��ףuV:�Ȣn�E��J�qs[�
��E1�Ɲg�~v�'���<ö�,tG�!��p;���Ӡn_�5��P���=_/�8!� �ID�@I@��[6D��ck�	�_`��;�4������	ۚ����&~�9���pZ�C@��#� �P��$�.Մ�J�s��е�y�ڢ871d�J�C|����&D��'�@�[�D��#&��wJ����Tb�sY��Y�
����&B
�
*J�SY4�;3�L3�A��L�x�LB�����t+{藯��lF�\lJ�1,sL{b[�pF(ب������c,�2~����1�;�z�.�Ɍ?
���-�y���;vO	��&G�Ѳ��?
���Q~�)��Vˏ�E��u�p�u��-����y��<F�D�3�qȠ�IsY���m�w�.L}RW���ܮM�6фȭ�)�my�H �]KQ�U�:���>젧[���>Ba$F���"C�RPԷ��K����R忳���՝o?^rŲ�a���}��4���3X�v�G��@�͜6n�e�����X����8�Æ<Rl'�R��X��ș��=��FJ~Pح�j)b�eKN
����]!��L��ێ�ۢ���
V�#�U�5!���ts��/���~�OP�L��L�.e#wg�Cq��bkQ������%��"Rp�˒9@̙����$�w6g���sXy�sѺ��p�S����!)C����a`@�<,{��a�iqg����B���bʦef�` �&&��7�G�ƚ����8��T
Xv�f�L
��.�c�|�J����-$�"�O��Wc���G���1iU�T_��{A�7��X�dk��v��yww#E�>�u���X.�Ϻ���[�+_��7Oò��#{�7V�/xh�)J��Sk�?`_����TD�_���Ǚ�\j��}F�ceb�ae�R�'s�+�ҁq4ya�E�\?��T���`,
�R��A������@�\*�:��"��RWK+�l�(^��2@�� �Aژ���02��<Lw鋹�[�pA�w�*���},3��K�V�ژTm��f�#��5,�ф�mטx9�;/�A��$�;�����HA�#g��o�Y�5�=����
�?�����������M�V3Yj��s��VH��5p��@p&���M��
l���(ޏ�4������Q��4Wbiy��zʻ{s���'Ah@}7p+��U*I��
�
J$Ye.Z�f0�*�Y�N��&�8�&���`�kX	{VKc��*��ׇ���i�O���gL�4�CX�%\ta[�i��D�b��ߔ[��Y4��a5ܳ��#	���_I,ZÓ�P{\��'n��.ap�NX����z�{ �li
N����,�u�G��Kȇ��A<�&<�#�g�:⪀������4L%4u�Vb�Q-UX�1c4yF)�=`k3�,�i1�4�L3�"j#`�߰�sD�2�p�4e�u&Z�����F@�
Y�GU:�]�[������R��=�C4�XJ���a��E+{�܀�����z�����.���„��T��)��r6Kb��F�>��$�L�,rە`b���V�B�^��g6taH���y
��ZLb�Z'8sM��8k��u�}F�D_�f\��8�T��
<	��
I�"U%�D���|��E��}
+HoIV]F:T��+١��S"-�N���"�V���h
���!풩�g|�0M��Pʅ)��[��G�C�����:z����1h�/f��q®�
u*�f�4��v�à��^$6�3+a�[n� +4���$�"�� �g1�oɞ�L��ѯ��y�ޥ��b܂0�������l��_~���o��At��uȔ
�1t.��PEdDT�J$Tw�.K��&n����-MI�8#�^�c<ˈ֔����2y_�\Ov��z�D����P\)(�W���{�A�)��q�X�����Ai)�����`KID]�5���
��;����jZͣ@��m%-�/�i�H���
x�����{��se|����0�;�:��QP}��Z$W�k/"�F�����;�L9����/���)���%o�A�u�Y�M��l�!�tT}K���M��gc]l�9–;�Ij�7yz5�.3�`UCYu�5�k¿��D\
�n��Sj��N��Z�'RC�fb��*^�<1����#[��%CZ�=�}���|�n*_/�.��x�{>�X0�uK9��pl�>ۅE3��$UL͚^5�l�$*��a�^�|�!\
C�RR�FHl�4tA��}%e9=�W�3����y������'o�ީ�	\+`��4>��(Ս�o�jB�J�-T��E�L(=I�5�|�.�Qb̊&y�|�uEG_���C�5���2�!�i]+�j���Y��@��i���/�c��BO��������[������G2��PZ����J]0�BH9ωVj
-��OW���^���E���I�m1��w����0�X�xy��=zb�u�m�qB�:R7h�3�n�Q�D�M
U�i��8V��!�ADZ&`�Mg�r3Y��3���-I���B�䃤��h�ꕞ��7��,�V~��Y�|�9s~庎���g߂�HP�E0�jx4��g�$��^�>J}��a����y�������ڟ�����о��Ah��x�!������쁰s"\��Sʰ�fu>[�����R�Q��1S<o5�T�A�Np��}����}�{��Lf�d(	"��i|A�^���ämL��à��C�~&%>F
�ɶ��Tk6��<x
������ѧ�4en`� ��mtH�m5\ט�]���u�
Qy�$q��x�=����4ìp�w�Z��I���[H���<��ݥ
�H	�x5�]���p�E�!�hXx�cPz����x�TI��رmj��`��?�aq~V�/�4|��ZTH:&�ܽ�+ �;Q&X}��<"��u��V{�����2��lY����-8w'����www������G�}N��ӷ�{Ƿ�X�g׳תz���s���r�3�	[�a7�
�ʄ ��k}�O�8m����8�G�!tZ�=��SG�fC�X�V�P�E���Eevn[��x�)����6�m����T�h�3B���V�	��k��dd�
SD��9A&�H֛=M�g���6�� 9��G�$�1�e�U�2$
qr�XfU�Q9M2|�h�Ty���/�s,%�E`�3�J��Q�����r?�Pa�?Q:K)�&��}��JO�h�W�I�x����?x�5��[4�3�̝4m�,r~=�WA��Ț#�3�w��Ui�1l{�_w�9@{3p�er��2��a|rj}���Q,����%»p���dL�2�̤t��%S�ܭ�ύ`p�
� 7*E>�:;�倇��=b��`����WGp�����C�/�,����ݤ�pp�` |^�?�!��"+�4	�lW�ww88(/��DF���Z�:��/����{�2��iY~(�`3X&�0,c�q�rSg��	:Cu��#u�C��-,†3�O���c� 5GM$�+�\-�?��5��o�T�Gl�\8j�n������4���뉕-�ysJ�<��m�P���n<I�;l.�Iw�p<�
�����$F�qS;�8��رs.�lb��a3?}��;��j�0�?P%��h�Y6@o���V�$8V�R"#�:��uˏ~�!�GR�?�1㚼�#%B��j:ң�`��4���dn/Ct(�4�����Tt1^~�CRl�5~��ׅ�2�+�TAX��UJ�"ݫ_A��
�=�q�c�G��&1s5�Y6��(�?R�Sk���pB�i�r��$�QQ߅�/���,f~� s�d���@
ɄgpA�w;�����Ҟ�����R�K'��Ɠ��S:���q���$0�*� ��!��ֺ����b�aOטm���eY�5�C�o5�7�D!�	���ƾOY}]ut
�T2�P�-4�'5�����c"Q09�:�a]v���B�K欠r��L/�>�$�-l��f��0�/\p�[�\	�ʰ��=�����*�b!C��� ӊG��Pl}$&4�����@�ժ^��ҏѶ��:[�20<U�Q�0�¸�X�@��fRR6�_g�_�?=ƫ���Ie����/:�o�(kL_娔[����@�fj�Ԩ��J���	�+B�!=�4�dI�LS����m����9ݙ�+y�*��f�>�Gca���W�>"͸YgJF�j��a_psy�xH^<���
�0إEZ@drI�x�l<f�����%�ã˽̋uh�<��C��s#٦v%�������*x�w�+�{�L���l�>�[}�{��/��X��9���W
���0:��Z�;��9x�Lť����S�@9i������i��lM)E:�B�O\�
v\%_XO�DE�zָ�Y�Qً����B��G�i�A.D��08���f?�jCo��-�W�.�v)�\Es��0�Xw�?�ԑ�
����!a��sw:�9OLn��I�l+y=�>���|[�m�Z�@'�m��3�ݚE�>A��V��|C����o}̈́n�h��^m�7	p-D��i�,K��1d��u�^Yy�r��u�;��e��[a]��L�H`�"�|�t.7��q��>cnה�ͼ~�	w�ۦ�OXϱ
A���F���V��0�A�D��nqW<�$}�j��pB�C��V�G��%ұxM��
"���j���U�2?�bL�.j�bl�>��?��V{Z�<1Et@
�~,x�S��Y-�2Z�{E�v��
_W?�0��
uນ>�\�ӟs�#����!��;��2���\�e�Y$�j�Fm;��]d�$
�lׯ�^B�l�g�\��;a�Ua��y��g:z��(H�cC)VE��k-9d-�ڀT���b�U=3q
��G�g��J�ı%���r�E���YY���A�E~HmfFlLL5A<)e�>�I,Ҳ<����1�VF�5#���PL|L��.�a�)}?���Wsq�H��}մ&���U����Qkd�	K� S%�{�O��_q3i+���pҷz�S���ʛN�Ӵ�`d�5)�2�r�T��Z$C��
gs[�&>I:�*u-H���(C�?Lτ�#�e޺����PNA����l�փ��d��Tț�u ��e�¹�/��$�Ml�D��HO4?�ں���9W�+�
�a�j�������Mַ�{3��$�4�<pi�唕
&Rx<*��K�!a+�!�j]\%B�<)��̛�iR�j�-�nɺe���-�y{E,\�ty���
)��
���K/�b�4��c3~��x��Y:�l;�fx��oՙL{�'��;��3`������"��:i��S�l��ݒ�Y���?p���J�]�!�3�+�Ÿ��Bd�%��j�6^�⵺��n2��3E�:fQ\��!W!�~;P�y�T䝔� �GbJ�98�G���TNK�}<�Y�77�53��i�!Í�!�Kp��]�:<��V7�{ܐ��Y���	�`s�c��T�����s��o�/)2⮓*k����/�U��	̌�^Ⴝ�G�Fb�s���ʓN�Ԅ���B�F"gų���J'B��g�(�`e7���
P�)�v��=��K®& R�9�N���F����A�8�#5�L���j&�������8ڡ[�3���YnK������%�*�2�m�%�*cު��go]_�&2#����c��|�u'� m!�
�
��+ʀPJ�Ŏ�37�ly�߰���!�,��Pk�P��Y@�,YF�֚���g�/�%Y\�OCy�p*�G�?E.�����=�LI�!�j[W���q��׶bi��p`�}Ż2��y�[���-1]G+DtNM�Ygc:Ow��v��f�Khb��s5�bI�M�Qΰ:*�1�P�R��?��d�1p�`�z�k���x$���ޯp����ux��l<��_�E�	�"GI|{��s��1��0�Z��na�"�H0gw�Ț��9���.y�ʂ�]��j&�KZIIU��`���w?�:��^d5��|:�T>.+�aפy�MDkzy	QJ��������C�&�"A=�8A1+G%�a��,	�[��?EM5�<�Bh]`	ہ�u`�F�����A�h��S�~��KÀO7��&�����<�l"���D?gz�����K�ZD$��>��$Z|5
(����K)I���
�3�D�da$�FJ�W��Mu��.=�+����x
�]�A7���pdB��
�%�^�쎊eh�R��ZK��0�Ρ�II귽���c#�.��**�tyVX����%4�I��%�h>[]MF�c���/��7Iě��zy{zGHּ���*��/ʠ�Q�(��"��
�!���h��WDS�"X�/-��C����S܀ϙ��y��Bc��t�.Ӯ��ɮb�0���$�?|
�Tm�2jC._?����*�U�hP"�q�m�������(���]c�*��O�a�*_���Z�.�E��판��g�>��)Tm�������,�����.Qy�H�k&P�٬���m[��N�A���H"�w\�+~3�?ʏ�O���b�r��sK^�;�:!G@��i���j�K*�x.T���:T��5L�c#l|!�y̐��A
<᳥�L�Fk�ɢ����g2���s]��O��w��e��cI�oB����p�.�	�/�a�tΔ4b�M�|1�
0?�������O�U/��^~� ��4����L6,�l&	H|EA@d��9��^/�d��v4_}�ݬ�7(Fj�'��c#�E	� �h7�r��u������%�OB��_/�{	Pa���WM-_����h9Ҍ`w�7��H��d�<�\l��d�!E�� ��1I�5�Z<��fMq�a<AN�(2��4��qE�d*-F*h黴��GU��U��J5��gcF�7�z�Vԝ�H���m@Dě��I[�P�BS*Z�J',v�(׭|�7�W�E�]����ڬ̝����D����� �Gj;|�=
�K�GgF@^ɍxι�)���
P�3��A�lW*�A��;rR��}����6>����"#6=���JW肁�9|,���f	m�0�����-:�C�
h��*��N�U-b0Lu�s��֪���q�h.� ���*���WX�>mP��X�:Ppg7��I.\��=zH?a�%�m2�0�n���y
�٣�ѯ���2��������w�j&e�P�,r�:���k�FiV����c���!xĮ��*�	?��s�(����Gߠ���SO�AV�(���_T����&\%0ˣ@�r�������C5RC�[�fbؖu���V�)�1[71�^�oNV�*��[d�#>�X~��j|n|��2gvY�fm+�ۯ��}��"��#�?���&@�G6�W?�TX���Z��R�pM��B(���@{d9�g�Bc�����0I�
=2���R�B���b���Z&�n��'K�
�<�0��:���rH�G+46�Y$���Ռ/���d�c!7_C��Z(5��p��h<$�K�%�}z�~H;bt9]���%�mEB�Bʑ�̦_�^��ԕ���N�3>ҵ)��
hbqw��?+ZMr�9}�eD�q|����7𫴯.!y�T�(f�+or����E@��	w�-(����A��ѭ�=ˀ�š����٧�9e�E�vLj���D�UM2굼�9a��V~�4�{�����Tr�3�/i�w@J~��(�*ŝ�!6�n�u7�ΰ�#�`���ftu��em�0�]�M7��`f&q3�x��F�2��G�����`��&���ĺ��UrN�`>���W��vw|w�.W�ֱD�W_?I|�[����8�\<�S�%*��S�~�]X�P�~��	^��f��~�s���o*�����]�	�Wp�D~b�P��b�)�@���b�#�g=��z8�M.��.C7��>P����u8��a���;p_�툵Z�dK�ҫ�a�B#����Ԑ$r����(&�x�������c�Hg�i/J��픭_L�]��(;��~��7�6A��e��qY�@ra	�����!bv��+ђo/�c48�j���@]�*}4.��b�
�^a�U	"�Y�x�I�%��>ɖ��(B���B7���C���ݑn�3gNB=�:�����ݟz��OQ��p���?I�9X�;�QT�mL���U[�.���DB@��h�c�MԦQ`bR���9N�iO)��� �-=�0R �v?k1���:�p�t����23�'(
ʡ�]?vZܱn!?WE�(
��t������ϰsl�'��K���;���5ul��^���_�⒤�4�T�Cb<P,�g���ӪrMG�@[-N+c2F ��-3־��a��{�y��8�ܵ햌�*����w�F�Tn�@�5u2hѼ���W���FK�Eխ�CDl�
����*� V�'��@�
.
�M�U�/z�%�5;7
w��o��[�'��ϰM��}�5Ye���`5����B��Ƅt�Y㳩
��I�
����w��S��C����5���}��0ňG��$U�ELG���4U�����J8���Е
�$yL��h>f~��@45b�->,R:�vh���3���E��G[nR�qh)�؆�6'G�����Ъ�yZ�iq�`vꦕ�Y��Mq^���^��]�VH�E	�8��?(e�r��	��]1�E+�F6Jd�X�Y=��K��$��lI���aI�(�T8mrQ�0��CA�,8�HyI�m�_�R�)�m����*ҟ�*��pY�aI]f`�Vn�\�3�������1���D7e3*f�Y��x�@ۆON��cW�&�Z:��z������F�%\.쪁�S�I�~�x,�b�r�rђ7����LM�����P��|�e���қz�^?��?��M� ���Մ�$	�ݔ������PE�'H�l�t�@W\Ud`��n�{"�'-�‡�IHF� !���@��I�ض�_
OI�U�Ym���m�ě�nE�����|*�B���βK��
�Ӯ������[�~y�xU�m;둁/�,�߁��TFn=�Y|[Y��R�_��gEr<X�s��$@x�~���v�=�n�j�@�޲Y=*v{�(��z��0��BB�K��-<"�u��IΜ6~d�����E�FR�+����.	ބփlg0�`mN��DR%��%?F��A�Q����%��e3[r�(�G}ł�ݣu(���&��n�cG��z>t
�W��Di��WG\sO����=�]v�'�vc��O��@]>M�5��P��m�=m�<&�/P����t�J4N,E�'�6��l)��
w�O�c=DE'�K`]O��C5~m+��O|����ih��
-������F%	�.�*�l�
7a"2��+���h�gT8�[��$1�QBci��B<�&��	��=l��^uH�����VH�ʤ���!�!'���%�a���˸�Y����E_�nٓ�q�0,hq��HN�=i�$�Yp{
��MK3�H����3g���d�Ҋ�of�h�e�\���\���a�ӆDު�D�Cܑ�ɋ����y0�S�������C��(���-�cO}(e���{�1��{9(�&E��F9�D����$oO��]�QV 57���ٹ��ͷa���j�h�t���,}��*��b.7"�p����a��ʙ��1ML:��)�b��F�*ƨ�W�x�T?�j��)�^m��a�l����Z��	9b�	�Zm*��'ED�;�A!H��WՑ��3�uW��W
?�R~�+zQ�S��4�v�꫶`
O�&�iS�j��HoiV",�����rL��4;`���\��~��qĿ�x�7�?q�oi��C_OT��m�@��%O�,���<��_	���4}���
��Zڣ�1�5�r���~|��9Ҡ�����Uλ�������f_TT�J�-~��P�甄�R��e[��a'3�qP������0c�]�;�Z�k�"�-���/�Yl��]G���:���
�c0ĥ�{�7h��_s���NY$�Zw̺��ݷ�P�:Z�"W��/��Uj8��X�ZE��)ʬ�/�k��a�O>)%	6���J�A���4�	X�Dk�h�l.����:��
��Ǭ�C2\�c����W�#�Z�����s[S=�"*:�೜���l�����]vKU1Ύm";n��F8��|���?�J�[(�ǵ���>7�(3��2�3�x��k^��K"G��s;�G���c�7�*h
<�v���Z��AQ0���j��q(a��KO��<�Ϫ�#kqgj0W0��=y��눚äi��_��2�I�uC�D��\%h]�a<��<7r=��5ɰO�
l�}�P:�f�;a����	g���
�M
������e����w��A*"u)��#m)�-ퟫLB|]0��@O���*H8�[%��c >�;d_�P���I�����������=C�ײA�G	���.�QF5��d�|:d�Ё0'$����b5r�ĸ��H2�w�sHۏ�͘�4���?59~��0������%��m1v@�y꒯�ENpG�.�6�
����X��Ԏ�p���	&PbYz�ɽsG�Ӑ���y��ڬ��of��,��0߯HS8G������(��X~z��b�E���竕m��(�t}ErfK�V{�'�y�X�x#����$V��7�p�{�%3bH���d
'l,��k�2���Ť�[J]>�0�=!�չ�jh�
`�
���MOqp�˃l�j%j��]P�[4OV3H'�F��ːO(�}E�+�J.�͢�	�>ؙ�z<1��.�z��@5��`)�Qu'��Vx�Vi���M�Z2����4�(Pڑ��U��Q��>Z�T�~��}��qo�����u�V�n�˕�Y��3>n�X��~��R�m��i��Xrh1��=��V�EG��_�?�����y�B�|���"d�z(�ʻ��)5��G�D,F͂�p�slp���h	N=��D+�G��=����KaL�gd���@����Ʉ��I�G��쩥7���(��5��s8�_k�
�V���|H��+9��G ׯXt�],�}���86��(] l�1dێB�"E+3A4GR/f�j�)  ����A���4W���(+a�����t�>��&��.�?(N!Ȍ��/�cH�9Ec�� h�|5��z⸔��;�`;"����؄�?�5����S�evlnչ��ۘJ���,R�c��+ف��!D�����Rsl���$#7\��K]> � ��� �$;DqLbX=�Av2C)���*���l�zgi%�x�@�K��y@%\�v4%#M$�"uS �<c��8�j1v����Td��HP�Ak�8V���ְ�N+���-����lL�#�P2�0��C�F�+k��E�s����B��q�5u�L'����h:�T�?�o�Yk%�e�wT�R�LJ���R�a~I̔l�~<�u�vD��V�h�����S��`����=�Mˁlp�89̵	�&*��a��;�R�2����̺uQ�Б��V�m�=����/�1*�"-Ag�ڌ��p�Z]h��^����]XH{�����KV�p'�Vj����k~�}+��c�:��ތ��,n��E��S������]��K�Uq$�f�>$�a/㧾nez_lG�ZŃ�a�`Nf�@��K8���A��Pc�k��-�-γp�j�Zz�	.���6�#Ť<�\�9���?].'5�݅����F�.�{�V��U�C}�H_�	A13��e�DA��E)��]h�ݴr_�%!cPJ�hMd+��<��D���bD��:ǽV�q8ou���y�W$.I�{�s���0�ҙ~��uih����:���B�ߣsfl��	Cu�
�#k���ɕ�͏
��P��Ⱦ�
�c�I��#g7�K��:��ۋ�!�]�1���f�*�ȓ��]�&�3���J�v]l�%��t��n�%��m��
牽��uNu�nK�1��Z����W�Y����	����N�=鎊[��3U2�[Z�F�}EآR{����6�6�����(�y�}|oݘʳR�NsB�\�7�}�ϲ����r��<��b���|��;��!0�����V�h�U������>}/R���@g�4_�NXn�q�HY�_��]mǺ�x�S�^�����<�YOSfچ���,vO�7�M��c>z	�S�g�]!���3ηN!��0C?T���aʌ����h���f"4L�i7�(��'��OD�]b\����r����@��_���^QE�{��_'mM��m$�[�A���R�8w��h6ָ,�F+�mK�敎�V�*�Ĥ���M��1�9%��!6/5���)��mܘ1M�Q��~ũ�F�1�6�3;=�I�U�͗��W��r=���n�- ��y��֖J���3k�>k��&d
}�[t�����m��$Q+��M��rZ�
U
�y�GA��d�����5L���<�;�e�12�Ϧ��9�?;���u�|UN�׷�@��AH���_hH����.�M�����jMY�7���P�'���	Wf��-"ԧԜXY��
����98h��Q��趺�l��*�m�W�T����L�����'���H�F�c�>�p�l%D�87�)}���X�9;vd�kE��ć]q�KQ>A.�x�P�̇��HKXD9��,Xt&.:Ȭz����[��N��iij��D�8��{�)!f�@»���X�	�aËB����q~Et��Z�(f�q��y�4�RE8B��(v���b$(j걍��39H�
¡d��	[ˑ�{����%���A��j,�Ҋo��]fm�B9��r-����V��?*����W޴vX�ġ#�i�Mg����[�kq�,l�k[��V����VϷ�ߡ�F�ZŃ�LtH��i�*A�k�%�O$��ߩ��=�b拣]q���� 4h�nՒ�C���W{��$Y���*���6ِ���7�Q���=n�;
f�|25��G3���1w�byy@�9^�\7��}�xR�o=���3�R���:�Z�m��h�jF�E�����xy�v���d�х�밽r���Q����Kw)���r;e]sxL��sO�O���'���.��/ϙ[��52.�x���E�j|�ą�n6��ͧ��lM(��Xz�#߲$�*j*K���*���W��}�4���!,��5�Ӄ�f
��HhW���h-US����n5\���$Wm����'��M.ŒR��MI;��F�ɐ�8�V��L�X�D��2�q
�PءC/��Ԅ���U��	a����CPMX_����V�ar��Q�	���э��=�h�&��c���$�`�X�� ���[b�D�5cBY���7p}�i��2�`��߂ج���0,C8yGO������5�ߓ�|�ԗ⾪�BJLa�aV@S��YZя6tSx��� �������zJn'`�4�	�|&�l܉�Z���&��<��}��^C�(i/��p�_$�G:G0���\�v��p�W����g�*�a���)��K�<gGnn���i��1��a	'[�.j���2�\B������b���4T�z��1�-k$���ee��:*�=&�8e�����~t3W�Wd	�X�ɏ�f[�aQ��~���Kh�`G�9��Ɣ��~2� ��k)h�BVP�	=8��#��2Tk��U-�]�"���k86x�Ω�$�թ'·�u��`�!��c7;���0	+X.xNm>���H��������muϠ�g��T�W���) �ۏ��U�p�ӵ�v�N�1���l~�ИM�V�<Sђ�y�>����g�Z���;fj��Lj#��~-��/r�N���GW��a��A-��c�`�dt���dԏ�
�4MΆ�
T�]�.���ŝ��R�+z�<��$NT����+e;��'6�(:��*�S�S�Wȣ���Cw6�(?�_��N�}��C�P��#��PV�
�~�DC�܊u[D!���5��L~��a9�:	~>��
���6 V�r�gfB�ޢ��|)Y��VIqa�aq�I��C������(���R3�-f�E�ђ`楔�Nv�D\�jN������$�b1�1I�iJ�ք��a��`�ĴB�CD`i{l�\��#.��^,\��YϮv��~����AM�,����o�hj�T�x�/ZpX���&�޿�󵸁HA�?&a�F&N�z��I~���{�*��l��2Y�L�U<��
j��Tކ"��cib�e��w�]�M�p$�nQ�Al+�����&�痡d����bLC[�Hf�#g0hU��~�1�����݁`p��;hn�e�\L�F��������k��#(�ʹD�����J��x������&��({�������씶ϵ��A���򡙟�Ho,֯F���51G`՜��EW�::Mah��>U��+f��a�8i���E,౭���0&-�pb���c��Դ�u��O����WƝל���Fċ�z�k��(q��!~�{��g�åw1��hhʪ�E���Kg��:�^�6��jlTQD}�=c����U�ά�T
\ڧ����T�^���f�?��<I4�E::UQp���v���ƃ�V�f*.z��/��� ��mO��}�r;[O�K�!L�o�+�{W�mL|�+y��d�}	�k��N)��ЧM�
�>EGUn<�|�l�qb��;!}�<g�T&�<U�B�_�m�az��S���d�����s405�6��x)h����5-"h�A5���*"#��w*JIu#��ܳ΋sV�3qZܘ��Jy^���G�8��?�O�p�?�x�A��5��i�����:sk�Wֺ�r���o��1�
�M�s:�}����j�:;�Â�\�#G1��K�޴�&4�P�uݼ�1&�Ċ�,Kp�����T�4,{<�O�����̕�ȇnXJ2ۮb{>�K�%�;^�9�ط�C�+o �>��/���q�hb_�9
�6�b.
��ngq�F?k�3����l��a����
�9,	Z))�d�����V��XHA��1��+�VD�84�o��E���<Z�3�6ze�+;}>����~ ;L���;� �j����I��2��Y��pX�N#�H�j|X�~�G��*d�x��=V��a���z��yC��!h�㨁bgl��'E�I�j�2��-�9�d�H2�*��֓	E����V�]UD2(b���(��@�� ~��o�b�&��4�#��&�J�k]��;q�贠�c� T�G�TQ�!�R0Ru��j�-GN��uӚC�~��uNde>Z;�t�j��0���p�lG�%�˼:�(���<���
���TuZ�P�Ԅ߿�8�WPu�:�G?�ơ�Ѥ-�Vbq�^\���sv��z���[�f��΋P+hf��ΰ#�Q8hy���Y�,�{?�o-�aG2�κ��	#	k�SO�R��W���$�Q���17�>��zϕ��"��*�8\��e�C���}�GLƌ�o�_���_	���xQ��4�\����}� �#[Ek�y,�oc�SǠQ[C[� F%C�KMbdR_�~�CJ7��RSAĬ�C�M�N�K֘�!��P��ƭ���wѐEO7
��
��`}�64}�ov���dK�0�a"Mԓ��O���͹yN�Q
�'�Y�S�6��n�}<�2���v�B�ܸ��D�s�)�9�h��LDL���SYS0	��2��_qCm�ˆ�>@��*%�q����g�������Y�te-��e£��O�H#��T�nڡ�b�p9�R�.
�`@��A��w�1���50�����{�(�Θ'-0�d����T��=����3��U���6{���*֠�e
�H�a�Ư��/��Ih�%>.�Ъ���{y�������͖gh[&�6<��yd|�$�d���u���d���-��LO׋M��Ӿ��?��K�QN�̧	��I�2��OWAh
�j*ہ��ވ�kS>�5}.��h��L�[����N'�2��^cJ"�7JF�����9HB��	�tH�w&��3Q6F.�Ex�D:!{�e�dz0f��	H��鴌&���P��F߈�hS����[��?؎IcNZH�` $�����a�aK<C�⌛@�S��(����&0��;ŏ�������_���h!%$A���_�i{��ğ9�~Œ�r� 7h�ɉ�i;!Ș�̴;E����"��T��*bqC�sm�k��+��F3�
%�,}"��*��Oc���Q'
<
	K}�����p�(m���{E��
�`�wF����J�A��#[�6��D��/�H�c'3y&3�Wp��=oW�V��j�_�Z�(�������iq��s����[��EuTnH�U����'c�Cg�;"�nT���BP��$��k��V��؈2)�?y���g�Z��{���4:)�~�8z��ľ�ʗ�� ���r1�30��b	->���+ 7+��i&J�ޫ�1��R���V�PO/U��zl���
1�R�"{R���dm��!��!��
!E�|�����[����%�W^J3+�ie���MV��T3j���j���ƭ��S��z���<	�/�G�V^�/�w]}h��@L �Ig��H��nڻq`š8�	7
֥��,�����_m��Q���G���~�j��a�̏�?f]Wif��nѰ0oM�z�/K���[+�nd�<bl"��e���ۍO��N�K�)�7s,�a�3����#��֡�87Ȃ��#`����n��]��nh̟s�r�z�sV��S�嬞m�8�CPb�K��+�̓�$ˉ��Iɉ��^'y�7ɡ`���`B"4�\�����=OJ���,<��ٚ���м;.<a"�S��-����c��Aͮ=�����o���U?x)��DD��8�n͂���sa��%y<W����4�Cl�o������$��<���"���ą�#1XMu��6_DK@��Й��hf�Tch�V��%�N{���(�O����1z��!��(2̨s�:E]��0)v�?žH�e�dŶ�l�&]�M�j�в�	������]�f
RO���ь���}]P�&���"'@��b��>���۴�PR�g�,�?M+�}�'�����w�_��‡½C�\�QZ�R�W�U�P�8�H	J?¼0,Y�K��ԔK�Y���$��q�PT���b`v�7�F�7����Hg�[�TF�B_{��
fz��%!o�kCY���c�y
ǔ}�e���%��dH0�}�K�A޿
Ѯ�]?_���=]����}��	q�sݻ�n �',X0�6~�P���$�.�����ۼy��	��tW�t�6=��AK�j�
jl��r#��^�C�솆!�6l'�w6��`hf�ߵ�Kc�2Lq��k����3 �-Y��6RM�7�)�-4|E���례ͥ����r�>G^
މ}	Ho*G0?1��t(�C�
)��]���	g�.�|�����rld��f
?=��:�{B��1C�i�9�U�S��YN8\���
�[݃ĕ0�T7�<t�:Fs�W�_�s���8��q��߬�3~ON�d���}C�����_LQy�Ь��s/�ɟ��FW��lGjS��_)t�hHX.����o�w0ݍ<X�{;{['
���%�����U��1`�����WR��ʋ"�(t 
��F���[�'2;
��fLh������u�&����N�~a�D���v�Je�f�"�@�(��D��bq!>��'��BnB�X�r����`}��tUZ�f_�;����2%=�����b���OC$�8��ST������H�R��W�����u��~�J�=���T7_7<�@3�lB���'����W"�~� �٘��et��渐�P|�O*�(�F7�^f��c��
�%��jD ���y
���J7��;�+�r<�GT�>�ٍ�߅�V���r/�S������Hu�6O�:~K���i�=D��_{5�R77���?�'�g�
��﷡���K3#k#:GW�HEi�v��o��y�ƶ���z�CqIy;/E��$`�Oi���"�ky�d�w,�gG_W��Bכ�n����
"����Y:�[��S��m�]��G�9�O���yxg�c�`rpD���s>.�{p2�&�N�|pv'9�i�4�6yf���_7�����4g��~u���.=�����m�W�͑�>%͝�*�g:����SxƂ��+���a����BI,�tK?4��(Gu�2�ַ@#SK�g�)��J��M‹o��g*�uD>�	�DgZDw`�3���w�F4M�yBsNR4j�5�VB(P�I�exw��o�8�0����q��2G��^M�F�)j|(ˠGؽ�62M	w�(��
U Ҕ��[�a��'��>���0>�)�����"wQ �*�}��<�Zm=4¤�[���Ę9��y���>fr�j�V�<���6�¡':t�7�d�R�0	q}�= ����i����}'�0%�������iע1���.��8V�"���u���ia]
�(��4�L&q%�2y;���ٌP�)?;9��{�̥,c�bTP�r��`�8�߈ȡT�vK?��@���?�)r�nuwٲ��'gȡ��P`7�����}�a���!`�k1a����R�܎L�⭠���H��#X'�����#GdL5QXNM;�
F�N�|hh:��l�K�%d)Fd�=�<a���Z� `_�B��*C�G��o��+�e�6F��/��X��fE�%=	'n[h>I
I�Z(��3Ǝ�v;C��W����gV�g��_.�D�)�`{�kF��)�h�~w4H�?_�Š���D>����(G���~�(�OQi�O�"�
�t�"���3�߉.�x�XB�#��X��Y��&�?q~��'9���XA@��!�8f�F�෤R�

��'�V�?,m,�[���1����?�_ �y{=kӿX��=�P����;ʿM���<��t%_	��n�{����qU1�dcmh�hfc�g)�jk��H�Flp������'�h�#��Y�����#ϻ�1�o� �q�r�I��}��IO�����"�����
!��	2}�"$�n�E�����{'ۿ�צ^2!}�����?�b�ˋ[����v�(pK�w����OP���Q��X�J����8�?`��p�_��?]{@���~�7��������#D�}�a�.��~��	!S�=S#���"v�@�/��W��I�	C���oy��u�	��-�I2����7ȯ��)�_DT�Iې
 L�ꨒ�+��#�rk��~��k�Lck
�8�n��-��h�DC-�4�����J�JŖ\u�㽧��j�>�Z�7*>!���C��H--����B��]�̸�{�,w��c;�93w�3��b=��x0��_ד!=Iz��8��aN��<��3Jy����T���Xw����~��-�*	��b�A����Zlz��բ!��a��=Z�\YnvPWlnf��(���	
��ݚ�`���Y�gU��Wf�,2��cw�[�p+�~�e�q٥i�
4�>Oh�r�k�(J6i���4�X�e}����N9ř��#y���$�6-���e]�iy�=��'���?U�w=ں�i��{��i>�p48����#�ja��%c���1��B��Og�8w�x�p<�xH�≴��цr2_�a��
4̥K��|FǗ�@*-��c͘��q>}�du�x�o�ER{��Ş�	F�O/�{���̪��� 1�<$M�KJ�%�aQ���]F��!cC~�*�q��lhjŻ��?�{�u��.�N�PkX��
��dѬM?H �-�o���xfa�k^���&5�=��>���Y�Wv9^%!:ؗQ9�qq����j\W��Ĉ�=N�i"oІ8��րyU ����RY�r�CF�Y��j�)C-���˦W�{HI}��$^r�xLݔ�U�>����XX��6���E��[��t��&��h�/#�Jfi�y�M���E9m�Ҳ7��Kꑞ0n��MRz'�!
o���Yт~�0v��H�������e_%��n��J�__jR��(��	f��P���3�=��:����9�K�)�U�?�T,��Vm�4�����ت9�"LH����6f���$�Q�=��J��ITW*�#҄��
3��pMAMx[G҄x��(v~k�rTJC�{����dI!��JB�@��A
�<y(��7��:*�b$)�ȲD)V��H�nE�0rhgR�q�����n�I�
�jsA6��rOx�:9��KG�%
F܏]T\�ҡ
���릠��P�C|O� h���0T�;�Y}��0@�e‹�NQ2S�2��g̬�d3�ET�_ߥ*�����
"��WR5!&�Y=1)MHTl`|nwě����`0&���H�&���V���xZ�#O�ɶC��(�uj���x	2���h�[
c�J�N�̓i<������X��*<��N�B����(<�i��dEc�J�M����+$?��gJr��PK
��=META-INF/maven/PK
��=(META-INF/maven/org.jvnet.hudson.plugins/PK
��=7META-INF/maven/org.jvnet.hudson.plugins/rvmRubyMetrics/PK
x�=
Ҭ
>META-INF/maven/org.jvnet.hudson.plugins/rvmRubyMetrics/pom.xml�VQo�0~&��;�դ�,��=lR٪u���\��ĉl'���9N�m5M*Ew>�ݝ���z��3�>]m�.�f���
C�L��%�E!
���b�xo������9��|x��9�q�4��-��Q>�h^�7�M�Y4�Y}�
W!ګ�*��(/��fR���qaOFƮ$�	m$RYT�$��L�M��B�2�R��������P
kaGem�o�n�#\��P���#ћ!\9��F�;0<�K4�e����K�%�j�B�[��xSr��^8{������_�H���n��\�,nk�r���-r�Ti]`���Oh����lӮhަ�B��3h�\����N��#��V��(��E�;b,ފ1�҂�sb"ܤ%p��a$V
O��<YQ�AHa��M�����}�հ����Y�]�;vT����q&�D9F@���hA����Ż�?����툪{G	+�H���3ժ=�پ,1hj���p9�����π�d����&[6��Wwr����h@p��f�bҡ5�ŵr�M3�C�'4
&��\�H�����ts�
�g��|��1��g]}��/�ʝ8xYm�5�1Ɵ��$[s�ξ�nP�yZIr9�ɺ��%�X@@Az�x�ކe���eƈz%��L�fS{[��}���u�#�ϔ��3�Yc��Lu�?�E纳�Gb8�'Z'8�6����`��^3a�/�3���gGRXD�>�{~����z���W�a;��(��� .��3�PK
��=�G��}�EMETA-INF/maven/org.jvnet.hudson.plugins/rvmRubyMetrics/pom.properties
ʻ
�0�=_q��!)��:T�:��5F4)7������tB��.�Y5��y�Z�M��#Lj�ZH�
Rt�w�����u���R���t�,���������iJ�*�g���%�?PK
��=	�AMETA-INF/PK
��=@����'META-INF/MANIFEST.MFPK
��=�Akcss/PK
��=�A�images/PK
��=
�A�images/24x24/PK
��=�A�js/PK
��=�A�WEB-INF/PK
��=�A$WEB-INF/classes/PK
��=�ARWEB-INF/classes/hudson/PK
��=�A�WEB-INF/classes/hudson/plugins/PK
��=.�A�WEB-INF/classes/hudson/plugins/rvmRubyMetrics/PK
��=3�AWEB-INF/classes/hudson/plugins/rvmRubyMetrics/flog/PK
��=C�AaWEB-INF/classes/hudson/plugins/rvmRubyMetrics/flog/FlogBuildAction/PK
��=E�A�WEB-INF/classes/hudson/plugins/rvmRubyMetrics/flog/FlogProjectAction/PK
��=A�A%WEB-INF/classes/hudson/plugins/rvmRubyMetrics/flog/FlogPublisher/PK
��=9�A�WEB-INF/classes/hudson/plugins/rvmRubyMetrics/flog/model/PK
��=9�A�WEB-INF/classes/hudson/plugins/rvmRubyMetrics/railsNotes/PK
��=?�A2WEB-INF/classes/hudson/plugins/rvmRubyMetrics/railsNotes/model/PK
��=O�A�WEB-INF/classes/hudson/plugins/rvmRubyMetrics/railsNotes/RailsNotesBuildAction/PK
��=Q�A�WEB-INF/classes/hudson/plugins/rvmRubyMetrics/railsNotes/RailsNotesProjectAction/PK
��=M�AkWEB-INF/classes/hudson/plugins/rvmRubyMetrics/railsNotes/RailsNotesPublisher/PK
��=9�A�WEB-INF/classes/hudson/plugins/rvmRubyMetrics/railsStats/PK
��=?�A-WEB-INF/classes/hudson/plugins/rvmRubyMetrics/railsStats/model/PK
��=O�A�WEB-INF/classes/hudson/plugins/rvmRubyMetrics/railsStats/RailsStatsBuildAction/PK
��=Q�A�WEB-INF/classes/hudson/plugins/rvmRubyMetrics/railsStats/RailsStatsProjectAction/PK
��=M�AfWEB-INF/classes/hudson/plugins/rvmRubyMetrics/railsStats/RailsStatsPublisher/PK
��=3�A�WEB-INF/classes/hudson/plugins/rvmRubyMetrics/rcov/PK
��=9�A"	WEB-INF/classes/hudson/plugins/rvmRubyMetrics/rcov/model/PK
��=H�Ay	WEB-INF/classes/hudson/plugins/rvmRubyMetrics/rcov/model/RcovFileDetail/PK
��=C�A�	WEB-INF/classes/hudson/plugins/rvmRubyMetrics/rcov/RcovBuildAction/PK
��=E�A@
WEB-INF/classes/hudson/plugins/rvmRubyMetrics/rcov/RcovProjectAction/PK
��=A�A�
WEB-INF/classes/hudson/plugins/rvmRubyMetrics/rcov/RcovPublisher/PK
��=6�AWEB-INF/classes/hudson/plugins/rvmRubyMetrics/saikuro/PK
��=<�AVWEB-INF/classes/hudson/plugins/rvmRubyMetrics/saikuro/model/PK
��=N�A�WEB-INF/classes/hudson/plugins/rvmRubyMetrics/saikuro/model/SaikuroFileDetail/PK
��=I�AWEB-INF/classes/hudson/plugins/rvmRubyMetrics/saikuro/SaikuroBuildAction/PK
��=K�A�WEB-INF/classes/hudson/plugins/rvmRubyMetrics/saikuro/SaikuroProjectAction/PK
��=G�A�WEB-INF/classes/hudson/plugins/rvmRubyMetrics/saikuro/SaikuroPublisher/PK
��=3�AQ
WEB-INF/classes/hudson/plugins/rvmRubyMetrics/tags/PK
��=�A�
WEB-INF/classes/META-INF/PK
��=%�A�
WEB-INF/classes/META-INF/annotations/PK
��=�AWEB-INF/lib/PK
��=���q�t
��Fcss/style.cssPK
��=ϱ �����images/24x24/tab.pngPK
��=D�JhQ;��js/flog.accordion.jsPK
��="�\u���railsNotesHelp.htmlPK
��=4e*�^u��.railsStatsHelp.htmlPK
��=���"��N���WEB-INF/classes/hudson/plugins/rvmRubyMetrics/AbstractRailsTaskPublisher.classPK
��=C��
�R���WEB-INF/classes/hudson/plugins/rvmRubyMetrics/AbstractRubyMetricsBuildAction.classPK
��=�G�w��
T��Q)WEB-INF/classes/hudson/plugins/rvmRubyMetrics/AbstractRubyMetricsProjectAction.classPK
��=��3~bP��N/WEB-INF/classes/hudson/plugins/rvmRubyMetrics/AbstractRubyMetricsPublisher.classPK
��=+s�Q�N��:2WEB-INF/classes/hudson/plugins/rvmRubyMetrics/flog/FlogBuildAction/index.jellyPK
��=A.iN3�H���4WEB-INF/classes/hudson/plugins/rvmRubyMetrics/flog/FlogBuildAction.classPK
��=�$�	�E���:WEB-INF/classes/hudson/plugins/rvmRubyMetrics/flog/FlogExecutor.classPK
��=����C���CWEB-INF/classes/hudson/plugins/rvmRubyMetrics/flog/FlogParser.classPK
��=.6 �V��IKWEB-INF/classes/hudson/plugins/rvmRubyMetrics/flog/FlogProjectAction/floatingBox.jellyPK
��=�Zſt)Q��ULWEB-INF/classes/hudson/plugins/rvmRubyMetrics/flog/FlogProjectAction/nodata.jellyPK
��=�����J��INWEB-INF/classes/hudson/plugins/rvmRubyMetrics/flog/FlogProjectAction.classPK
��={0τ��M���PWEB-INF/classes/hudson/plugins/rvmRubyMetrics/flog/FlogPublisher/config.jellyPK
��=(��Y��U���QWEB-INF/classes/hudson/plugins/rvmRubyMetrics/flog/FlogPublisher$DescriptorImpl.classPK
��=��=خ4F��ZTWEB-INF/classes/hudson/plugins/rvmRubyMetrics/flog/FlogPublisher.classPK
��=�iU78H��l]WEB-INF/classes/hudson/plugins/rvmRubyMetrics/flog/FlogPublisher.staplerPK
��=�R�;��O��	^WEB-INF/classes/hudson/plugins/rvmRubyMetrics/flog/model/FlogBuildResults.classPK
��=CoKE�N��aaWEB-INF/classes/hudson/plugins/rvmRubyMetrics/flog/model/FlogFileResults.classPK
��=t��P��eWEB-INF/classes/hudson/plugins/rvmRubyMetrics/flog/model/FlogMethodResults.classPK
��=&�����	>��hWEB-INF/classes/hudson/plugins/rvmRubyMetrics/HtmlParser.classPK
��=�+��6�A��'mWEB-INF/classes/hudson/plugins/rvmRubyMetrics/HtmlPublisher.classPK
��=!���a���rWEB-INF/classes/hudson/plugins/rvmRubyMetrics/railsNotes/model/RailsNotesMetrics$COMPARATOR.classPK
��=�^�\SVV��WuWEB-INF/classes/hudson/plugins/rvmRubyMetrics/railsNotes/model/RailsNotesMetrics.classPK
��=�.Q'�ck��yWEB-INF/classes/hudson/plugins/rvmRubyMetrics/railsNotes/model/RailsNotesResults$SortLabelsComparator.classPK
��="��m;V��j|WEB-INF/classes/hudson/plugins/rvmRubyMetrics/railsNotes/model/RailsNotesResults.classPK
��= 6��fZ��K�WEB-INF/classes/hudson/plugins/rvmRubyMetrics/railsNotes/RailsNotesBuildAction/index.jellyPK
��=���[��T��݆WEB-INF/classes/hudson/plugins/rvmRubyMetrics/railsNotes/RailsNotesBuildAction.classPK
��=�LR��O���WEB-INF/classes/hudson/plugins/rvmRubyMetrics/railsNotes/RailsNotesParser.classPK
��=��G�b���WEB-INF/classes/hudson/plugins/rvmRubyMetrics/railsNotes/RailsNotesProjectAction/floatingBox.jellyPK
��=��Z��]��-�WEB-INF/classes/hudson/plugins/rvmRubyMetrics/railsNotes/RailsNotesProjectAction/nodata.jellyPK
��=�]DV����WEB-INF/classes/hudson/plugins/rvmRubyMetrics/railsNotes/RailsNotesProjectAction.classPK
��=ݟm4i�Y���WEB-INF/classes/hudson/plugins/rvmRubyMetrics/railsNotes/RailsNotesPublisher/config.jellyPK
��=��ݜ%�a���WEB-INF/classes/hudson/plugins/rvmRubyMetrics/railsNotes/RailsNotesPublisher$DescriptorImpl.classPK
��=9��R�R����WEB-INF/classes/hudson/plugins/rvmRubyMetrics/railsNotes/RailsNotesPublisher.classPK
��=t��DDT��U�WEB-INF/classes/hudson/plugins/rvmRubyMetrics/railsNotes/RailsNotesPublisher.staplerPK
��=Pͷ���X���WEB-INF/classes/hudson/plugins/rvmRubyMetrics/railsStats/model/RailsStatsMetrics$1.classPK
��=ϸ3�a��h�WEB-INF/classes/hudson/plugins/rvmRubyMetrics/railsStats/model/RailsStatsMetrics$COMPARATOR.classPK
��=#�\�=�V���WEB-INF/classes/hudson/plugins/rvmRubyMetrics/railsStats/model/RailsStatsMetrics.classPK
��=\�+�ik����WEB-INF/classes/hudson/plugins/rvmRubyMetrics/railsStats/model/RailsStatsResults$SortLabelsComparator.classPK
��=Qkʘ}zV���WEB-INF/classes/hudson/plugins/rvmRubyMetrics/railsStats/model/RailsStatsResults.classPK
��=W�H�Z���WEB-INF/classes/hudson/plugins/rvmRubyMetrics/railsStats/RailsStatsBuildAction/index.jellyPK
��=J����-T����WEB-INF/classes/hudson/plugins/rvmRubyMetrics/railsStats/RailsStatsBuildAction.classPK
��=H;i%�QO��þWEB-INF/classes/hudson/plugins/rvmRubyMetrics/railsStats/RailsStatsParser.classPK
��=�Nt�b����WEB-INF/classes/hudson/plugins/rvmRubyMetrics/railsStats/RailsStatsProjectAction/floatingBox.jellyPK
��=�Zſt)]����WEB-INF/classes/hudson/plugins/rvmRubyMetrics/railsStats/RailsStatsProjectAction/nodata.jellyPK
��=Y��V����WEB-INF/classes/hudson/plugins/rvmRubyMetrics/railsStats/RailsStatsProjectAction.classPK
��=<�zl�Y��o�WEB-INF/classes/hudson/plugins/rvmRubyMetrics/railsStats/RailsStatsPublisher/config.jellyPK
��=��&�a��R�WEB-INF/classes/hudson/plugins/rvmRubyMetrics/railsStats/RailsStatsPublisher$DescriptorImpl.classPK
��=�@Q�R����WEB-INF/classes/hudson/plugins/rvmRubyMetrics/railsStats/RailsStatsPublisher.classPK
��=t��DDT����WEB-INF/classes/hudson/plugins/rvmRubyMetrics/railsStats/RailsStatsPublisher.staplerPK
��=�I*�8!G��n�WEB-INF/classes/hudson/plugins/rvmRubyMetrics/rcov/model/Messages.classPK
��=��89L���WEB-INF/classes/hudson/plugins/rvmRubyMetrics/rcov/model/Messages.propertiesPK
��=+��
M����WEB-INF/classes/hudson/plugins/rvmRubyMetrics/rcov/model/MetricTarget$1.classPK
��=3qa���[����WEB-INF/classes/hudson/plugins/rvmRubyMetrics/rcov/model/MetricTarget$TargetConverter.classPK
��=�n�|��K��>�WEB-INF/classes/hudson/plugins/rvmRubyMetrics/rcov/model/MetricTarget.classPK
��=p�j�ELM����WEB-INF/classes/hudson/plugins/rvmRubyMetrics/rcov/model/MetricTarget.staplerPK
��=,��*�
Q��J�WEB-INF/classes/hudson/plugins/rvmRubyMetrics/rcov/model/RcovAbstractResult.classPK
��=tXtQ��S����WEB-INF/classes/hudson/plugins/rvmRubyMetrics/rcov/model/RcovFileDetail/index.jellyPK
��=%�|i�vM��"�WEB-INF/classes/hudson/plugins/rvmRubyMetrics/rcov/model/RcovFileDetail.classPK
��=��`��M��_�WEB-INF/classes/hudson/plugins/rvmRubyMetrics/rcov/model/RcovFileResult.classPK
��=�����I��y�WEB-INF/classes/hudson/plugins/rvmRubyMetrics/rcov/model/RcovResult.classPK
��=�g��>�F��`�WEB-INF/classes/hudson/plugins/rvmRubyMetrics/rcov/model/Targets.classPK
��=F��(��N���WEB-INF/classes/hudson/plugins/rvmRubyMetrics/rcov/RcovBuildAction/index.jellyPK
��=��3�H��	�WEB-INF/classes/hudson/plugins/rvmRubyMetrics/rcov/RcovBuildAction.classPK
��=;ޢͽ>V���WEB-INF/classes/hudson/plugins/rvmRubyMetrics/rcov/RcovParser$RcovFilenameFilter.classPK
��=5����C���WEB-INF/classes/hudson/plugins/rvmRubyMetrics/rcov/RcovParser.classPK
��=�_3��	V��/WEB-INF/classes/hudson/plugins/rvmRubyMetrics/rcov/RcovProjectAction/floatingBox.jellyPK
��=�Zſt)Q��AWEB-INF/classes/hudson/plugins/rvmRubyMetrics/rcov/RcovProjectAction/nodata.jellyPK
��=�7�6��J��5WEB-INF/classes/hudson/plugins/rvmRubyMetrics/rcov/RcovProjectAction.classPK
��=��ũ�C	M���WEB-INF/classes/hudson/plugins/rvmRubyMetrics/rcov/RcovPublisher/config.jellyPK
��=�iո�H���WEB-INF/classes/hudson/plugins/rvmRubyMetrics/rcov/RcovPublisher$1.classPK
��=�sB�>OW���WEB-INF/classes/hudson/plugins/rvmRubyMetrics/rcov/RcovPublisher$DescriptorImpl$1.classPK
��=F�
i
U��|WEB-INF/classes/hudson/plugins/rvmRubyMetrics/rcov/RcovPublisher$DescriptorImpl.classPK
��=��X��Y���!WEB-INF/classes/hudson/plugins/rvmRubyMetrics/rcov/RcovPublisher$RcovFilenameFilter.classPK
��=(|���F��[$WEB-INF/classes/hudson/plugins/rvmRubyMetrics/rcov/RcovPublisher.classPK
��=��)�64H���-WEB-INF/classes/hudson/plugins/rvmRubyMetrics/rcov/RcovPublisher.staplerPK
��=���&�Y��:.WEB-INF/classes/hudson/plugins/rvmRubyMetrics/saikuro/model/SaikuroFileDetail/index.jellyPK
��=֌�҆%S��K0WEB-INF/classes/hudson/plugins/rvmRubyMetrics/saikuro/model/SaikuroFileDetail.classPK
��=�\
��S��B3WEB-INF/classes/hudson/plugins/rvmRubyMetrics/saikuro/model/SaikuroFileResult.classPK
��=��ćH�
O��t6WEB-INF/classes/hudson/plugins/rvmRubyMetrics/saikuro/model/SaikuroResult.classPK
��=ƀ���T��);WEB-INF/classes/hudson/plugins/rvmRubyMetrics/saikuro/SaikuroBuildAction/index.jellyPK
��=�
J��N���=WEB-INF/classes/hudson/plugins/rvmRubyMetrics/saikuro/SaikuroBuildAction.classPK
��=������I���BWEB-INF/classes/hudson/plugins/rvmRubyMetrics/saikuro/SaikuroParser.classPK
��=�N��\�� JWEB-INF/classes/hudson/plugins/rvmRubyMetrics/saikuro/SaikuroProjectAction/floatingBox.jellyPK
��=�B�0�$W��:KWEB-INF/classes/hudson/plugins/rvmRubyMetrics/saikuro/SaikuroProjectAction/nodata.jellyPK
��=���P��/MWEB-INF/classes/hudson/plugins/rvmRubyMetrics/saikuro/SaikuroProjectAction.classPK
��=�3HC�sS���OWEB-INF/classes/hudson/plugins/rvmRubyMetrics/saikuro/SaikuroPublisher/config.jellyPK
��=�W�ݷN���PWEB-INF/classes/hudson/plugins/rvmRubyMetrics/saikuro/SaikuroPublisher$1.classPK
��=�~��:m[���QWEB-INF/classes/hudson/plugins/rvmRubyMetrics/saikuro/SaikuroPublisher$DescriptorImpl.classPK
��=��a��Gb���UWEB-INF/classes/hudson/plugins/rvmRubyMetrics/saikuro/SaikuroPublisher$SaikuroFilenameFilter.classPK
��=�o�.��L��XWEB-INF/classes/hudson/plugins/rvmRubyMetrics/saikuro/SaikuroPublisher.classPK
��=��)�64N��%^WEB-INF/classes/hudson/plugins/rvmRubyMetrics/saikuro/SaikuroPublisher.staplerPK
��=�}E���D���^WEB-INF/classes/hudson/plugins/rvmRubyMetrics/tags/floatingBox.jellyPK
��=z�/^#�C���_WEB-INF/classes/hudson/plugins/rvmRubyMetrics/tags/tableGraph.jellyPK
��=9���aWEB-INF/classes/hudson/plugins/rvmRubyMetrics/tags/taglibPK
��=P	�/�9���aWEB-INF/classes/hudson/plugins/rvmRubyMetrics/Utils.classPK
��=i������afWEB-INF/classes/index.jellyPK
��=J�@.&C5��gWEB-INF/classes/META-INF/annotations/hudson.ExtensionPK
��=.���hWEB-INF/classes/META-INF/exposed.stapler-beansPK
��=���V�	be���hWEB-INF/lib/htmlparser-1.6.jarPK
��=�V��$K$n���rWEB-INF/lib/jregex-1.2_01.jarPK
��=�A��META-INF/maven/PK
��=(�A,�META-INF/maven/org.jvnet.hudson.plugins/PK
��=7�Ar�META-INF/maven/org.jvnet.hudson.plugins/rvmRubyMetrics/PK
x�=
Ҭ
>��ǾMETA-INF/maven/org.jvnet.hudson.plugins/rvmRubyMetrics/pom.xmlPK
��=�G��}�E��*�META-INF/maven/org.jvnet.hudson.plugins/rvmRubyMetrics/pom.propertiesPK���C
�src/rvm/contrib/hudson/rvmRake-1.0-SNAPSHOT-20100819.hpi000066400000023211147511530550015652 0ustar00PK
n�=	META-INF/PK
m�=�"�META-INF/MANIFEST.MF}��N�0E���^����"h�KRA�TM��d��&��LB�{�hE��s5g�L"����|��,����>S���7%���J�=H��/�����D�`(Y6�ā�
�AΟ�Co���o�%Gӻ�ZV �o��<%��+���t���'����u�IW/;JRe=�6?[S�ت�kkXϻӚB6�Ԩ�v�t���Ư(y��`
щ (��y�f�
��@
~�s7h(uc�u���� ��a�p!nf|�U�rlv9>��P�
PK
n�=WEB-INF/PK
n�=WEB-INF/classes/PK
n�=WEB-INF/classes/hudson/PK
n�=WEB-INF/classes/hudson/plugins/PK
n�='WEB-INF/classes/hudson/plugins/rvmRake/PK
n�=,WEB-INF/classes/hudson/plugins/rvmRake/Rake/PK
n�=WEB-INF/classes/META-INF/PK
n�=%WEB-INF/classes/META-INF/annotations/PK
n�=?ߧl��	help.html%�An�0�}�X=��+���r�]%��#���a	A���������q�W����D���2^m�鄟�gI�͆g��OH#vi�3�=F��z���,����R����_ε�>��6j�d]�x��2�;���\դ�A���hh=�Y�ݘ�ݹ�PK
n�="T���8WEB-INF/classes/hudson/plugins/rvmRake/Rake/config.jelly�TM��0={� 
م�}�-$KKO�%Yڳl�%�d$9�)��;��jcH����7�f����a�(�9��ie,����<o��Z�C���BɲP�7�g0>���3zL��nml�^BN�e�z�����
�l��;,�����R�t����Fϙ�5`�"
��R��[���U���r�ܧ�|�/P*����C�Dt!Q.����!�ʶz�΅�$�R�wʃ���9�t��./�!�I�ǽ/�4oHA �����w�>��������;�"�1+�љl4�!u8�荻�;3�-V��a���螒=�`���Zo���P��oF��	�P��]q}�q$UK�g�G�~��C�ܯ���|���8��E("&I����}��؟�wV�N������+ol�?1'�W�0�:�ɲ�j���U�[z�(�K�/c���-�"ᚬ��J�C�1�~YK��g2^
h��_A���]��g�MG�ʈ7B�-�@�ZK[��Tk��g*\�1'���:~4�"��/PK
n�=��d���3WEB-INF/classes/hudson/plugins/rvmRake/Rake$1.class}�M
�0��h5��^�
=�(�AO���?�D���s�<����y���ޟ�@���1D��j�6��ZIBx7�m� ��Ε��.O��L�0'����F���Z[�w�½mR�Qk�VZB�i\	]�s�ȼ#,�@��C��\
0q7��y�6r�)�}PK
n�=ܸiz�@WEB-INF/classes/hudson/plugins/rvmRake/Rake$RakeDescriptor.class�T[OQ�N[�R
�&W���m�,x��\"�@���t�څ�n��&j�/�ID��(�v���&=�3��7sff����?�b*��P�!��֐�%�� �I�}<d��͙d���k�i3+")��n!-�U���Ҕ23\_�&u�p��P��7Ō�3�VtL�!<ošֹm���n�6
���9ͰUk� CTy�N]N83�]��"/P��X<�����s#��8�f�Wk�7��p#C�ױ�i��M3o�DM�.,B���r��$S�pT{]ݐ�\YZ\Jo����_T"��[b���*)��U��gh?/!Chv'#��f��Gt����4��W��:���ۛ�C�ľ�y�*cCo���&�b�\�a�Y�rw\��=+��_���M[}�jzVX�Iُӵ2�|�I;,�Fu]���'a$%�w��67ETڣ�2I4���(�.�-D���n<�qL(��)�1tx��<
a8��0��ΐ���2��sq��s<}s�-�]`�;�w_�x�vy9J�\i`��Y�����O��W�o-sZ3�r�&Ng:�!=}}�7I���S�ݫ'm�4ZD���Ÿ8@`�t"t��O�;(xO�� �e<������q
��>S՗
Eu���H��J&�] �LH|E��7(~���$ͧM��h�S:K��p�"��9@���9���I�ϧ�k����^}�^}Jb`�5'���K�ԥ�W����u5�d�^]c$}$��`�gR���*��M~?��1�K2�f��d��D��%#�ԊZ<F�PK
n�=Zh�R�-1WEB-INF/classes/hudson/plugins/rvmRake/Rake.class�W�{W~'{����@��@Mq��&B-�
�B54@L��@���ɐ��:;˥U[���K�[AE�V�R-���b�VQ�~E����\6���g����]�����}�2�����v�� ��bx@���bx�ޫ�!<��}x���TQ�
>��QuxL%��2>��#��8���~B����
>��SBͧe|F�*|V�Nœ���S8-ξ �/��Kb8#�/�����)_����f|C�:+l>#�*Z�-ߖqNƳ A�,���蹜����_�0v��cf]ۑ���������/��w<���VG6�3�\�slRt��y�h'e�����1�1	��G�czGF��:�{�P��63�`&�k��2iu�X��ټ����&�/�#��J�p�ʹLw��ñ��ߨ�-C�]v������/?9j8���@]�k��̐�b]���&��Y�[�|�?o��1d�L��,��]Ӷ(ﵝ��	{<��@�ճ��إ��N;o����:�T�����WϹ;�f�D�J��ٽ�2�I��t������ҝ�2�|f���̹ӣ�e7C2*X$�^�
C��T�Eɔl,P4�9��G�c���b_�ՙ�7�[��g�Ǒ<u�����s�v&%�c��){rR�譠�8��tЯ��mJ=�LA�Ąj(2�vG��)#+���S6�dYW6�wMBu���C�yo��{��#=X,%�����	�(�>��Ȋ��}2[��E|�-�.JfN�w$D�1Kw���'��a��Z�kUBA��n��
|T-�fZVMiU�Z
�%�*fn�ԩ1����;���4��x�y��m�L��Q��:`�T�vD(k5܁��۰Y��bH�a�����d|W�s8/�y
�)
LKh�F���Ԩ�Z��M.�E
�q���J��xI�%|O�˸��'��!b��C^*�Ș�i�[�D��k�~���@q�W4��e\��S�\ƫ~�_j�~��7�������?j����̧Pd�Y�_�W֑@�d�0Ryq�tD�����i�;��៸��V�U���l�ןB��E$�T�S�-�����ld��uu����ϺFz�zV�~91L��r�l�̸��s�b�|��5��6T�,���N9���
�����Y��Q#��SƎLF–�z�}��u뀧�b�*v�ݶ3�7$}�������m>*Z����Y/c���Hl��ٽ=�s����oی�� �y6�l��cg�x�A{°��2[ɳq?�@�H�Ww\��[��9s��w�/5�f��3v�+_ˎH�n���֤׵ו��O�a�y	�y��W�^�p8���e�
�B��@�8�����`�m���K\��O�9V��9=T­1ߏ��@U��y7���g3ݎ#��ߒ(����v�"�Y��-R��N�,+c���آ�Ʉu����?y2������7�^���步9Y���r�_�lG���3�e��Ӑ�S���M!OL!���GCS��S�ϓ�
wr\���&D�d	�,#�(m5�-D��o/j�Nt%�J%�Vy�@�(�=�Q}ȣ�0v�S����������
�ZP��h��H2ԖGCWP
%
P�?7�}��Z��[C_��
Ե�����f07q���܄=���܄^�%�0���~b���b�察|��E�U[yR�?���P=2
-���`}M���&C�ֶ�4j�a�V^F�E�'�|y��i�4(OaeTn�lJ��`T-`��#��C���,���A4Q~$P�00"�
X1L"TdU����*�ɧ�`�Ja�N�&en��`��<�嗰jD��i�D��(ծ��a����V:���&N�r��y�Ҡ��<�`�\R�*����c����*~���贫�,)h��D�`�n��nRw1��04ws�C���g���4��,�~Cx���U܋�p�ZK*�jq����"�O0yw2��a©h��!J�L�F���
S{5Q��k�A�G-
�yH���XNR�T�˩B��*i�>��
)����n$k1U. C<���*iQ[���� �#�x�4��J��Y$g�y��&y���n��K(%L�VQ��$YW)<1G84#<�+��}�-_�P�p�W�V
���]>��
�}�_��J�-��H��n����E�$��uHr\B�4��h9���c���L_��4� ��7�?�“��PK
n�=�,g\e3WEB-INF/classes/hudson/plugins/rvmRake/Rake.staplerSOMQp,MW0�P02�21�22VQ0204�J��+.)*M.�/�-*M�.)��K�)J�Nu��I�)I,�.s}2�\2����l�*��(��PK
n�="�c�0�1WEB-INF/classes/hudson/plugins/rvmRake/Util.class�T[S�F=���q����������IhHI
%���̴�d"썭D���D!y�KBg��^�ôS~@�L�A�omH��D���9�����Ylƌ��a�㲲W8>�qՀ��k�cN->㸡�:tS���8��ͱ�cIǗɛ�����-m)(	���답��-�ζG+oˑ�Z�N-��u�T���o׼��u[�T7�'�.t�yC������ɩ�cgDZ=�/ۅP�~y~��.VW�m6F�"T�KA�J�ˁ܌��Z�7��؆���8]z�by
�K"�-ˤg��-�im���:��L��c{K�(�,�eWe�K�gF�8�wL,ら���w�5�?x~�f8�6�b�z%!	&�9S	�B�=y���5
�6������m*9Չ�'���
+9
��&vE����*P����3;UI{��L�ۏE1d�/���ݵ��TI�$N�퀤x9I:]���oƴWAuSslȠ&d�GN�&|J|.�)Q�0�/K�5�QE�u
e�
�{u4>�}���T�i��V6Y�7:�`�hҁs4&��~�B�B��#E��B|���?��!:H�K[Z���˴�����V�!��-��z�}yLԋ���q��,�H5�3��qL�+jd�x����[�&��BV�����B6iY��n
���o8�M�3�˅	������qb�81�Ph7L��Rpc�F�JK���I�'�h*��dS��]��⸄i�uPj�ǩ٠uّ85�L�n
�C˜(1��&g��8ܺGϩ��*e�wr�PK
n�=��]o~�WEB-INF/classes/index.jelly�;�0Dk|�u����
Ҡ(��0�mn�L3o�F��Т{y�2�L��R���l�~N���p��~b�
%���L��Q�GS-�6E1y����9��&�������L���3UF�B��PK
n�=�f���5WEB-INF/classes/META-INF/annotations/hudson.ExtensionM��NA�E�5��&�a�HLR�j��nr,�?w�NB�������,�SL~���}~�Y��3�b�
�@g7Bj�DA����T�i2�i�@{
��[fp1W�3jb��")Uh��`/M5� Ѥg�c�
>���y����ps��,U:�Dct����E]k�Su%M��9�H�Ő<��a��:y�w
���G�82.�?�����4ʒ��=�����ÿ����۱��PK
n�=.WEB-INF/classes/META-INF/exposed.stapler-beansPK
n�=META-INF/maven/PK
n�=(META-INF/maven/org.jvnet.hudson.plugins/PK
n�=0META-INF/maven/org.jvnet.hudson.plugins/rvmRake/PK
��=��f�7META-INF/maven/org.jvnet.hudson.plugins/rvmRake/pom.xml�TM��0��+�=����K�Qm[	�h�V�!�c��Ďl'���c;���"f�͛��VF�
�Щ,��r�w��R�F(�*�k������'79?YyF�G|�
�OI2#�V�
$�l*�uLqYV�mp.5gNj��b�O��6w�d���n�	B�ԙ(�����J�|T1#���ȍ���Y
���Q��}�Y�pU�94OI��xf��1���\Ӵ�f�v����W�t�'�\�)��A�zT�t���z���Vr`�G��+�;�+E�B��C���Q�=zz^![W�6�#%�jS���s��/��lj�4�˙��N��H�ٖ���V
.�o�s�
���b�Q�#���hD�+a�G��?�Ǹb���%�&�f�h�Gfi��m9+�NF����p(�|ݟ��I�Ii���H����ɠ�x'�8ր�oh�޸��!q�D��=�F�Բ����L���6>��6��6b'����.�N�a���Fv�V�
F1���K2����,�����IN'�PK
n�=]�جy{>META-INF/maven/org.jvnet.hudson.plugins/rvmRake/pom.properties
ʻ
�0�=_q��!��R��I|`
����񑔛��v<p�=$���'S1�f\�rJ��u��0����U��c�$+}�p��X��"9��3�b��83��dy9T�7�F�PK
n�=	�AMETA-INF/PK
m�=�"���'META-INF/MANIFEST.MFPK
n�=�A_WEB-INF/PK
n�=�A�WEB-INF/classes/PK
n�=�A�WEB-INF/classes/hudson/PK
n�=�A�WEB-INF/classes/hudson/plugins/PK
n�='�A%WEB-INF/classes/hudson/plugins/rvmRake/PK
n�=,�AjWEB-INF/classes/hudson/plugins/rvmRake/Rake/PK
n�=�A�WEB-INF/classes/META-INF/PK
n�=%�A�WEB-INF/classes/META-INF/annotations/PK
n�=?ߧl��	��.help.htmlPK
n�="T���8���WEB-INF/classes/hudson/plugins/rvmRake/Rake/config.jellyPK
n�=��d���3��iWEB-INF/classes/hudson/plugins/rvmRake/Rake$1.classPK
n�=ܸiz�@��[WEB-INF/classes/hudson/plugins/rvmRake/Rake$RakeDescriptor.classPK
n�=Zh�R�-1���
WEB-INF/classes/hudson/plugins/rvmRake/Rake.classPK
n�=�,g\e3���WEB-INF/classes/hudson/plugins/rvmRake/Rake.staplerPK
n�="�c�0�1���WEB-INF/classes/hudson/plugins/rvmRake/Util.classPK
n�=��]o~���WEB-INF/classes/index.jellyPK
n�=�f���5���WEB-INF/classes/META-INF/annotations/hudson.ExtensionPK
n�=.��WEB-INF/classes/META-INF/exposed.stapler-beansPK
n�=�AOMETA-INF/maven/PK
n�=(�A|META-INF/maven/org.jvnet.hudson.plugins/PK
n�=0�A�META-INF/maven/org.jvnet.hudson.plugins/rvmRake/PK
��=��f�7��META-INF/maven/org.jvnet.hudson.plugins/rvmRake/pom.xmlPK
n�=]�جy{>���META-INF/maven/org.jvnet.hudson.plugins/rvmRake/pom.propertiesPKVsrc/rvm/contrib/hudson/rvmRuby-1.0-SNAPSHOT-20100819.hpi000066400000016034147511530550015716 0ustar00PK
m�=	META-INF/PK
l�=�k
4�META-INF/MANIFEST.MF}��N�0E���^���"ޥ� R��t�����m9��=y��B��3w&͵�-Нp�2��(1J\!U'�^���[r0zp"Q�ő���$�;�1ZxU��[`&P���s���{t�����t�7��5�?b���Z4BCC�UP�_���*Yg��-F�4~�_��Nl���h2�4_)Mf_
$��R�yk��+��\͉������>(Lò�.&G=�5M�����u��FØE1������fN�_�+�f���(��oPK
l�=WEB-INF/PK
l�=WEB-INF/classes/PK
l�=WEB-INF/classes/hudson/PK
l�=WEB-INF/classes/hudson/plugins/PK
l�='WEB-INF/classes/hudson/plugins/rvmRuby/PK
l�=,WEB-INF/classes/hudson/plugins/rvmRuby/Ruby/PK
l�=WEB-INF/classes/META-INF/PK
l�=%WEB-INF/classes/META-INF/annotations/PK
l�=�(���	help.htmleQAn�0��DO����mpb�њX�l��^_�����"����;M��z>KHpV��S���zWƜ��:O�I���o�E�=��@�*?���C�ۆw��#Z��`}*�"zN�u��+�2<�	�.�Vs4�Oƫ�@��'�a�3�m�n?� 1����0�okd�\�[W�k*o|DV�8t������[����ĞԨ���{.O{���ՖC���%�:5��)��I7PK
l�=��h�8WEB-INF/classes/hudson/plugins/rvmRuby/Ruby/config.jellymRAn�0��"� ��9��ܓ���Z���EwI˕j#��K�����g93��>�N�CZ+3�M23�tA���,D��-Y.��2%��d<�^�X�Zg����"�3j�x��4���ru�T�ݯg���*.��q/�b��dd�Ă�|�	�Qq(`%D?��[��G���{���4j8bV�P���A�Ɖ9��7-���,h�yO��\����d^�u<A@�ݏ��ӛ��yu!W*��7圿��^�~���q}�dO_Y:![�n^%F��{z+)�J*:��E9�V���jG�.)D�`�Nb��B�/n�8���%�%6
���7�{�ո�r���PK
l�=L�>��3WEB-INF/classes/hudson/plugins/rvmRuby/Ruby$1.class}�M
�0��h5��^�
=�(�AO���?�D����\x%&�w�o����"f`!�����V�^��m� ��Ε��.O��L�0'����F���Z[�7�½mR�Qk�VZB�i\	]�s�ȼ#,�@��C��\
0q7��y�6r�)�}PK
l�=���@WEB-INF/classes/hudson/plugins/rvmRuby/Ruby$DescriptorImpl.class�T�RA=��	I;�D�����((�"����q�d`2fA�+y�*���(��31�!,�Cw������_�����rd$̄�lrsȆ�4���<��d^�K	�:U]�����.C`����U�N������&V0ʊ�����ʀ]U-�{yn�M�n�F��1D7t��+�bY��3���g�\ל��[�y\�vJ��X�:�":���[���)�N�`��ШZ�!�I]׸)�}�9ܲs�۲�/�0�[�[�^�s���m�:����q���M~Đ�6Ch�0ky�V���Dm�p;�ZuM9�Tj�z_2U8P�YS�
���^���:��k����S_���^/Kb:�w2'�,Cx����j薄	t	��䍃��#�o�a�,�]���ɶ�G�v�� ��?\4�̽vt
�Yѵ(�p�a���d�hh�Y›(����u[��1���c�p�{)œǪW�ۻ]u�a���JS���5-�2���c��k:���Ѭ9)��y��I�]�����h��5���T�*U۲w��a�mĢ�*BO��:�i�Q!�I�'�؉P������C��	V !��t�zv����4�FA�i�ߗL,p�`&�A+���	����`qϡ&NCv�1�Q7�k��]�c�V�¥����q�lu�tյg��'+�JZ����Μ#��|��Y�D�	��B&� �$�va�������Y[�Ϡ	$�'t�GҵO!����}���z)|Bx��0Iս��PK
l�=|����A1WEB-INF/classes/hudson/plugins/rvmRuby/Ruby.class�U]W�F�kK�%�I�$�$�ې4�)ic�q�bQZ7O��5Je�J2�?��"��iO�������J��%y����ܹswv�Ͽ�
`����8R�T�g�x$��`]��8Y�
>W�XA%�/�X�*x��jcx�`K,m�x�e�d�2vd|��b��)[��r�ar��M���N��o1ĝ^�'�sL�͠U_F�2�v1X+���^�U�w�jKս^����}��6m��tj�P��yp������1L�_���2H�n�3LUM�?�u��1T�M��5S����T��E$(���v:��bX�v4�d�gZ�r(�0�I���4-�mx{���Q
ł�.���hs�ܵ=n{D�J:3
!IN"f�\�k3L�Rm�l&��v�q�3�f>��!a���&e�Ͷmx=����������~�	a�SZ#�ͷ���Y��.�aEwn�!�AYmZa/E�!�w{N�ը2�WDT��nR��wF��T,39L��(���hz{y�
&wU�`�z��&M�~���]_#��؏���oP�^
�(��b��o[�o�/� �ΝLحj.g��4�ݸPH�iCJډF㝮G:�=�r���V�oz�ѻ�~��b�^��lHBJ��&Ԡ9Nkt2�,͓����j6w�HV�C:��n�8�(���w	Bx��T���/:
B��!�3�Dd"@]:K�sD�z3p�&BP�%�2�Ȅ�
��BR�c����&��oP�zL���늖���X����� �#��S�g. ��KXB>�W�YD��a��>�8�0�����69��������>!o�7#�z�)1iS�H���})�3�@�<�}
T���Lz����S�WPs}�K�l�w(ÇuI<���`@�T_��?g�*����2UK�@.�4�M
Q�}�'A]� �E�%��ln��hF�a��K��L$�Α��9��#|L`
�^
��ˆƟ�\g'��+�#_��)�?�5����0
$�y���PK
l�=�����WEB-INF/classes/index.jellye�A
� �}O1d������Lu`bŒFz�j��|�|x|��9_^���24b�UQt$8I�R)���֚��|n�s4�D;��ޝ�C�HIK%^A��Q�
���P�c��$��ʹ��	A
1�&�[�0lsq���PK
l�=�"J�5WEB-INF/classes/META-INF/annotations/hudson.ExtensionM��JA�'El��  HL!\�ܥJ7�
�
����3��|	_���:�$�SL1����}��Q�pk��[�Vή��N����1���(�dv�9��Nd�m]��LaϨ��H�\�i�4M��L���O�W��N�-�H��r��,U>�DCt����y��5©�H�ou��"-��qP�˧���48�~�b�8�����Y|&Y6�ڡG���꟰�w�8�[7�[�5PK
l�=.WEB-INF/classes/META-INF/exposed.stapler-beansPK
m�=META-INF/maven/PK
m�=(META-INF/maven/org.jvnet.hudson.plugins/PK
m�=0META-INF/maven/org.jvnet.hudson.plugins/rvmRuby/PK
w�=Z�o#��7META-INF/maven/org.jvnet.hudson.plugins/rvmRuby/pom.xml��Mo�0��|
+��M�&�Nۡ��5j�h��5�۲
$�~Ɔ���E����y�+-��`WW�|��֪���L@�-��@��%��	Lf������v��9I��r�v�5��0��\����BRb�H�9��w/�Kw&�ep�eΪ
���3���H6E46,�Ph٨�y����²ɍPUM�htb����։���D:��!��ο`�U��R�S�n��uu��-q���T�'���$_�}[��O�
R���,`�;7�%x�,��QJj�	#�
a���aK
gl^!�5Z7�Je��H���9C�q,�J!ܱ�+rr�h��?�l��Ά�2rsֲJ*��_Lp����/��<��9L"l��Dt\�9�ar�x���e[��.�9��
X���t��Tg�kx��~���h����n����>h^��{����(�ת�Cۑ;��O�EPK
l�=�ty{>META-INF/maven/org.jvnet.hudson.plugins/rvmRuby/pom.properties
ʻ
�0�=_q��!��С�:��:��#������x�4GH&��y���X3m�y%�vߩ&=�R���|��b���]�n#s�r�}$�?5`��bS|��Cb���g��ߣ�+�PK
m�=	�AMETA-INF/PK
l�=�k
4���'META-INF/MANIFEST.MFPK
l�=�A_WEB-INF/PK
l�=�A�WEB-INF/classes/PK
l�=�A�WEB-INF/classes/hudson/PK
l�=�A�WEB-INF/classes/hudson/plugins/PK
l�='�A%WEB-INF/classes/hudson/plugins/rvmRuby/PK
l�=,�AjWEB-INF/classes/hudson/plugins/rvmRuby/Ruby/PK
l�=�A�WEB-INF/classes/META-INF/PK
l�=%�A�WEB-INF/classes/META-INF/annotations/PK
l�=�(���	��.help.htmlPK
l�=��h�8��FWEB-INF/classes/hudson/plugins/rvmRuby/Ruby/config.jellyPK
l�=L�>��3��WEB-INF/classes/hudson/plugins/rvmRuby/Ruby$1.classPK
l�=���@���WEB-INF/classes/hudson/plugins/rvmRuby/Ruby$DescriptorImpl.classPK
l�=|����A1��`
WEB-INF/classes/hudson/plugins/rvmRuby/Ruby.classPK
l�=��������WEB-INF/classes/index.jellyPK
l�=�"J�5��hWEB-INF/classes/META-INF/annotations/hudson.ExtensionPK
l�=.���WEB-INF/classes/META-INF/exposed.stapler-beansPK
m�=�A�META-INF/maven/PK
m�=(�AMETA-INF/maven/org.jvnet.hudson.plugins/PK
m�=0�A`META-INF/maven/org.jvnet.hudson.plugins/rvmRuby/PK
w�=Z�o#��7���META-INF/maven/org.jvnet.hudson.plugins/rvmRuby/pom.xmlPK
l�=�ty{>���META-INF/maven/org.jvnet.hudson.plugins/rvmRuby/pom.propertiesPK]�src/rvm/contrib/hudson/README.md000066400000001055147511530550012367 0ustar00# RVM Hudson Plugins

These plugins are forks of the ruby, rake and rubyMetrics plugins
for Hudson. They're designed to make it dead simple to get started
with RVM and to let you simply specify a rvm ruby string.

For more current updates, see:

* [https://github.com/Sutto/hudson-rvmRuby-plugin](https://github.com/Sutto/hudson-rvmRuby-plugin)
* [https://github.com/Sutto/hudson-rvmRake-plugin](https://github.com/Sutto/hudson-rvmRake-plugin)
* [https://github.com/Sutto/hudson-rvmRubyMetrics-plugin](https://github.com/Sutto/hudson-rvmRubyMetrics-plugin)
src/rvm/contrib/unicorn_init.sh000066400000010074147511530550012645 0ustar00#!/usr/bin/env bash
### BEGIN INIT INFO
# Provides: unicorn
# Required-Start: $all
# Required-Stop: $network $local_fs $syslog
# Default-Start: 2 3 4 5
# Default-Stop: 0 1 6
# Short-Description: Start the unicorns at boot
# Description: Enable at boot time.
### END INIT INFO

# This is /etc/init.d/unicorn init.d script for single or multiple unicorn installations.
# Expects at least one .conf file in /etc/unicorn/
#
## A sample /etc/unicorn/my_app.conf
##
## RAILS_ENV=production
## RAILS_ROOT=/var/apps/www/my_app/current
## UNICORN="/usr/local/rvm/wrappers/my_app/unicorn_rails"
#
# This configures a unicorn master for your app at /var/apps/www/my_app/current running in
# production mode. It will read config/unicorn.rb for further set up.
#
## To get the UNICORN script run:
##
## rvm alias create my_app 2.0.0
## rvm wrapper 2.0.0 --no-links unicorn_rails
#
# This way it will allow changing the alias when new ruby is used without changing anything else.
#
# You should ensure different ports or sockets are set in each config/unicorn.rb if
# you are running more than one master concurrently.
#
# If you call this script without any config parameters, it will attempt to run the
# init command for all your unicorn configurations listed in /etc/unicorn/*.conf
#
# /etc/init.d/unicorn start # starts all unicorns
#
# If you specify a particular config, it will only operate on that one
#
# /etc/init.d/unicorn start my_app

__sig()
{
  typeset __pid
  [[ -s "$2" ]]       &&
  __pid="$(cat "$2")" &&
  [[ -n "${__pid}" ]] &&
  kill -$1 "${__pid}" >/dev/null 2>&1 ||
  return $?
}

sig()
{
  __sig "$1" "$PID" || return $?
}

oldsig()
{
  __sig "$1" "$OLD_PID" || return $?
}

run()
{
  echo -n "$1 - "
  shift
  if
    "$@"
  then
    echo "OK"
  else
    typeset result=$?
    echo "Failed!" >&2
    return $result
  fi
}

prefix_command_with_su_fix_quoting()
{
  typeset -a __temp
  __temp=()
  while
    (( $# ))
  do
    __temp+=( "'$1'" )
    shift
  done
  CMD=( su - "${__owner}" -c "cd '$RAILS_ROOT' && ${__temp[*]}" )
}

setup ()
{
  echo "$RAILS_ROOT: "
  cd $RAILS_ROOT || return $?

  export PID=$RAILS_ROOT/tmp/pids/unicorn.pid
  export OLD_PID="$PID.oldbin"
  export RAILS_ENV=${RAILS_ENV-development}

  CMD=( "$UNICORN" -E "${RAILS_ENV}" -c "${RAILS_ROOT}/config/unicorn.rb" -D )

  typeset __owner="$(stat -c "%U" "${RAILS_ROOT}")"
  if
    [[ "${USER:=$(whoami)}" == "${__owner}" ]]
  then
    true # it's all fine we run as owner of the app
  elif
    (( UID == 0 ))
  then
    prefix_command_with_su_fix_quoting "${CMD[@]}"
  else
    echo "ERROR: running not as owner(${__owner}) of '$RAILS_ROOT' and not as root($USER), prefix with 'sudo' and try again!"
    return 2
  fi
}

cmd_start()
{
  if sig 0
  then echo "Already started"
  else run "Starting" "${CMD[@]}" || return $?
  fi
}

wait_pid_kill()
{
  typeset __count=$1
  while
    (( __count > 0 )) &&
    sig 0
  do
    : $(( __count-- ))
    sleep 1s
  done
  sig 0 || return $?
}

cmd_stop()
{
  run "Stopping" sig QUIT
  if
    wait_pid_kill 5
  then
    run "Force stop" sig TERM
    if wait_pid_kill 3
    then return 1
    fi
  fi
}

cmd_restart()
{
  cmd_stop && cmd_start || return $?
}

cmd_reload()
{
  run "Reloading" sig USR2 &&
  wait_pid_kill 5 &&
  oldsig QUIT ||
  oldsig TERM ||
  cmd_restart ||
  return $?
}

cmd_rotate()
{
  run "Rotate" sig USR1  ||
  cmd_start ||
  return $?
}

cmd()
{
  setup || return $?
  case "$1" in
    start|stop|restart|reload|rotate)
      cmd_$1 || return $?
      ;;
    upgrade)
      cmd_reload || return $?
      ;;
    *)
      echo "Usage: $0 <start|stop|restart|reload|upgrade|rotate>" >&2
      return 1
      ;;
  esac
}

# either run the start/stop/reload/etc command for every config under /etc/unicorn
# or just do it for a specific one
# $1 contains the start/stop/etc command
# $2 if it exists, should be the specific config we want to act on
start_stop ()
{
  if
    [[ -n "$2" ]]
  then
    . "/etc/unicorn/$2.conf" || return $?
    cmd "$1" || return $?
  else
    for CONFIG in /etc/unicorn/*.conf
    do
      . "$CONFIG" || return $?
      cmd "$1" || return $?
    done
   fi
}

start_stop "$@"
src/rvm/contrib/gemset_snapshot000077500000001044147511530550012737 0ustar00#!/usr/bin/env bash

printf "\nBeginning snapshot of the current environment gem list into snapshot.gems\n"

file_name="snapshot.gems"

gems=($(gem list | sed 's#[\(|\)]##g' | sed 's#, #,#g' | \tr ' ' ';'))

for gem in "${gems[@]}" ; do

  name="${gem%%;*}"

  versions=${gem#*;}
  versions=(${versions/,/ })

  for version in "${versions[@]}" ; do

    echo "$name -v$version" >> "$file_name"

  done ; unset version versions

done ; unset file_name

printf "\nCompleted snapshot of the current environment gem list into snapshot.gems\n"

exit $?
src/rvm/LICENSE000066400000001203147511530550007150 0ustar00Copyright (c) 2009-2011 Wayne E. Seguin
Copyright (c) 2011-2020 Michal Papis
Copyright (c) 2016-2020 Piotr Kuczynski

Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at

    http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.

src/rvm/gem-owners.sh000066400000000625147511530550010571 0ustar00REPOS=(
  bundler-unload
  executable-hooks
  gem-empty
  gem-wrappers
  rubygems-bundler
  rvm
  rvm-capistrano
  rvm-with
  rvm1-capistrano3
  rvm2
  rvm2-shell
  rvm2-ui
  tf
  pluginator
)

\typeset repo owner
\typeset -a params
params=()

if
  [[ $# -gt 0 ]]
then
  for owner in "$@"
  do
    params+=( --add "$owner" )
  done
fi

for repo in "${REPOS[@]}"
do
  gem owner "$repo" "${params[@]}"
done
src/rvm/README.md000066400000016472147511530550007440 0ustar00Stable
[![Build](https://travis-ci.org/rvm/rvm.svg?branch=stable)](https://travis-ci.org/rvm/rvm/branches)
[![OpenCollective](https://opencollective.com/rvm/backers/badge.svg)](#backers)
[![OpenCollective](https://opencollective.com/rvm/sponsors/badge.svg)](#sponsors)
&nbsp;&nbsp;&nbsp;&nbsp;
Master
[![Build](https://travis-ci.org/rvm/rvm.svg?branch=master)](https://travis-ci.org/rvm/rvm/branches)

# What's RVM

RVM is the acronym of Ruby enVironment Manager. It manages Ruby application environments and enables switching between them.

Homepage and more info at [https://rvm.io](https://rvm.io)

## Table of Contents

- [Installing RVM](#installing-rvm)
  - [Ubuntu](#ubuntu)
  - [Any other operating system](#any-other-operating-system)
  - [Additional installation options](#additional-installation-options)
- [Upgrading RVM](#upgrading-rvm)
- [Basic RVM usage](#basic-rvm-usage)
  - [Installing ruby](#installing-ruby)
  - [Switching between ruby versions](#switching-between-ruby-versions)
  - [Other RVM commands](#other-rvm-commands)
- [Reporting issues](#reporting-issues)
  - [Check documentation](#check-documentation)
  - [Try again with latest RVM](#try-again-with-latest-rvm)
  - [File an issue](#file-an-issue)
- [Contributing](#contributing)
- [License](#license)

## Installing RVM

### Ubuntu

RVM have dedicated Ubuntu package, so please follow instructions posted here: https://github.com/rvm/ubuntu_rvm

If you need a different (newer) version of RVM, after installing base version of RVM check the [Upgrading](#upgrading) section below.

### Any other operating system

Make sure you have following required packages installed:

* `curl`
* `gpg2`

And then run:

`\curl -sSL https://get.rvm.io | bash -s stable`

### Additional installation options

Additional installation options and details about the installation process are described here: https://rvm.io/rvm/install

## Upgrading RVM

You can upgrade RVM any time by running:

`rvm get VERSION`

Where `VERSION` should be replaced by one of the following values:

* `stable`              - latest stable RVM (good for servers)
* `master`              - latest RVM (might not be stable)
* `branch /path/branch` - branched version of RVM (for testing new features or bug fixes)

Additional upgrading options are described here: https://rvm.io/rvm/upgrading

## Basic RVM usage

Basic RVM usage scenarios include installing and switching between different ruby versions.

### Installing ruby

To install ruby you have to call `rvm install INTERPRETER[-VERSION] OPTIONS`

When no version specified, RVM will install latest stable version or selected interpreter. If you omit to specify interpreter, RVM will assume
that you wanted to install MRI ruby. Following examples would have exactly the same effect:

```
rvm install ruby-2.3.1
rvm install ruby-2.3
rvm install 2.3.1
rvm install 2.3
```

Passing additional `--default` option makes selected ruby your default.

We currently supported following ruby interpreters:

* `ruby`       - MRI ruby (The Gold Standard)
* `ironruby`   - a .NET ruby
* `jruby`      - Java implementation of the ruby
* `macruby`    - implementation of ruby 1.9 directly on top of macOS core technologies
* `maglev`     - 64-bit implementation on top of VMware's GemStone
* `mruby`      - lightweight ruby
* `opal`       - ruby to JavaScript compiler
* `rbx`        - Rubinius - a next generation virtual machine VM for ruby
* `topaz`      - high performance ruby, written in RPython
* `truffleruby` - high performance ruby using GraalVM

Historical interpreters which you can still install with RVM, but are not anymore developed and supported by their authors:

* `ree`        - Ruby Enterprise Edition - MRI Ruby with several custom patches for performance, stability, and memory

### Switching between ruby versions

To switch between ruby versions you should call

`rvm use INTERPRETER[-VERSION]`

Same rules and options apply as for `install` command with two special _interpreters_.

* `default`    - [default](https://rvm.io/rubies/default/) ruby (or the system ruby if a default hasn't been set)
* `system`     - system ruby (state before RVM was installed)

Additionally you might want list your preferred ruby version in `.ruby-version` file stored in your project folder. This would cause automatic switch to selected ruby whenever you enter the folder.

### Other RVM commands

RVM comes bundled with many different tools for managing your ruby environment. More detailed information about every commands listed below can be read after executing `rvm help COMMAND` or browsing documentation on RVM homepage [https://rvm.io](https://rvm.io).

## Reporting issues

Here at RVM we get a high amount of bug reports, and often they are connected
with specific environment settings which might be hard for us to replicate.
That's why we would kindly ask you to follow the steps below so we can maximize
our time helping you and minimize the time requesting more information.

### Check documentation

We know, you hear this over and over and be rest assured we are working hard to improve the
usability of https://rvm.io but we must always ask that you first please check the documentation
if you are requesting a feature or if you are not sure if you did it right.

### Try again with latest RVM

We try to release a new RVM as soon as we feel that we achieved certain stability. This might take
a while and it could be the case that your issue has been already resolved in our development branch.
Please get the latest RVM and try again:

`rvm get master`

### File an issue

If the documentation is not clear, an error message is not clear or you are stuck with the problem,
please do file a bug.

When in doubt as to whether your issue might relate to another, simply file a new bug, and
we will mark it as duplicate if it needs to be.  It's always better to file a new ticket and
let us sort it out than to accidentally add noise to another ticket.

For filing issues, we have prepared a template for you to use. Please try to fill all sections as best as you can.
Always make sure to split up each command and its output into its own fenced code block.
If the output is long, please put it in a separate [gist](https://gist.github.com).
Otherwise it's hard for us to process all the information and respond quickly.

Note that if there is a lot of `debug` or `trace` output you can redirect it to a file with the `>`
character like `rvm [command] > output.txt`.

## Contributing

You are very warmly welcome to help. Please follow our [contribution guidelines](CONTRIBUTING.md)

Any and all contributions offered in any form, past present or future are understood to be in complete agreement and acceptance with our [Apache License](LICENSE) v2.0.

### Backers

[Become a backer](https://opencollective.com/rvm#backer) and support us with a small monthly donation to help us continue our activities. Thank you if you already one! 🙏

[![Backers](https://opencollective.com/rvm/backers.svg?width=890)](https://opencollective.com/rvm)

### Sponsors

Support this project by becoming a [sponsor](https://opencollective.com/rvm#sponsor). Your logo will show up here with a link to your website.

[![Sponsors](https://opencollective.com/rvm/sponsors.svg?width=890)](https://opencollective.com/rvm)

## License

Copyright (C) Michal Papis (2011-2020), Piotr Kuczynski (2016-2020), Wayne E. Seguin (2009-2011)

Licensed under the [Apache License](LICENSE), Version 2.0
contrib/ps1_functions000066400000010231147511530550010727 0ustar00#!/usr/bin/env bash

#
# Opt-in for custom prompt through by setting:
#     rvm_ps1=1
# in either /etc/rvmrc or $HOME/.rvmrc
#
# Then in order to set your prompt you simply do the following for example
#
# Examples:
#
#   ps1_set --prompt ∫
#
#   or
#
#   ps1_set --prompt ∴
#
# This will yield a prompt like the following, for example,
#
# 00:00:50 wayneeseguin@GeniusAir:~/projects/db0/rvm/rvm  (git:master:156d0b4)  ruby-1.8.7-p334@rvm
# ∴
#
ps1_titlebar()
{
  case $TERM in
    (xterm*|rxvt*)
      printf "%s" "\033]0;\\u@\\h: \W\\007"
      ;;
  esac
}

ps1_identity()
{
  if (( $UID == 0 )) ; then
    printf "%s" "\[\033[31m\]\\u\[\033[0m\]@\[\033[36m\]\\h\[\033[35m\]:\w\[\033[0m\] "
  else
    printf "%s" "\[\033[32m\]\\u\[\033[0m\]@\[\033[36m\]\\h\[\033[35m\]:\w\[\033[0m\] "
  fi
}

ps1_git()
{
  local branch="" sha1="" line="" attr="" color=0

  shopt -s extglob # Important, for our nice matchers :)

  command -v git >/dev/null 2>&1 || {
    printf " \033[1;37m\033[41m[git not found]\033[m "
    return 0
  }

  branch=$(git symbolic-ref -q HEAD 2>/dev/null) || return 0 # Not in git repo.
  branch=${branch##refs/heads/}

  # Now we display the branch.
  sha1=$(git rev-parse --short --quiet HEAD)

  case "${branch:-"(no branch)"}" in
   production|prod) attr="1;37m\033[" ; color=41 ;; # red
   master|deploy)   color=31                     ;; # red
   stage|staging)   color=33                     ;; # yellow
   dev|develop|development) color=34             ;; # blue
   next)            color=36                     ;; # gray
   *)
     if [[ -n "${branch}" ]] ; then # Feature Branch :)
       color=32 # green
     else
       color=0 # reset
     fi
     ;;
  esac

  [[ $color -gt 0 ]] &&
    printf "\[\033[${attr}${color}m\](git:${branch}$(ps1_git_status):$sha1)\[\033[0m\] "
}

ps1_git_status()
{
  local git_status="$(git status 2>/dev/null)"

  [[ "${git_status}" = *deleted* ]]                    && printf "%s" "-"
  [[ "${git_status}" = *Untracked[[:space:]]files:* ]] && printf "%s" "+"
  [[ "${git_status}" = *modified:* ]]                  && printf "%s" "*"
}

ps1_rvm()
{
  command -v rvm-prompt >/dev/null 2>&1 && printf "%s" " $(rvm-prompt) "
}

ps1_update()
{
  local prompt_char='$' separator="\n" notime=0

  (( $UID == 0 )) && prompt_char='#'

  while [[ $# -gt 0 ]] ; do
    local token="$1" ; shift

    case "$token" in
      --trace)
        export PS4="+ \${BASH_SOURCE##\${rvm_path:-}} : \${FUNCNAME[0]:+\${FUNCNAME[0]}()}  \${LINENO} > "
        set -o xtrace
        ;;
      --prompt)
        prompt_char="$1"
        shift
        ;;
      --noseparator)
        separator=""
        ;;
      --separator)
        separator="$1"
        shift
        ;;
      --notime)
        notime=1
        ;;
      *)
        true # Ignore everything else.
        ;;
    esac
  done

  if (( notime > 0 )) ; then
    PS1="$(ps1_titlebar)$(ps1_identity)$(ps1_git)$(ps1_rvm)${separator}${prompt_char} "
  else
    PS1="$(ps1_titlebar)\D{%H:%M:%S} $(ps1_identity)$(ps1_git)$(ps1_rvm)${separator}${prompt_char} "
  fi
}

ps2_set()
{
  PS2="  \[\033[0;40m\]\[\033[0;33m\]> \[\033[1;37m\]\[\033[1m\]"
}

ps4_set()
{
  export PS4="+ \${BASH_SOURCE##\${rvm_path:-}} : \${FUNCNAME[0]:+\${FUNCNAME[0]}()}  \${LINENO} > "
}

# WARNING:  This clobbers your PROMPT_COMMAND so if you need to write your own, call
#           ps1_update within your PROMPT_COMMAND with the same arguments you pass
#           to ps1_set
#
# The PROMPT_COMMAND is used to help the prompt work if the separator is not a new line.
# In the event that the separator is not a new line, the prompt line may become distorted if
# you add or delete a certian number of characters, making the string wider than the
# $COLUMNS + len(your_input_line).
#
# This orginally was done with callbacks within the PS1 to add in things like the git
# commit, but this results in the PS1 being of an unknown width which results in the prompt
# being distorted if you add or remove a certain number of characters. To work around this
# it now uses the PROMPT_COMMAND callback to re-set the PS1 with a known width of chracters
# each time a new command is entered. See PROMPT_COMMAND for more details.
#
ps1_set()
{
  PROMPT_COMMAND="ps1_update $@"
}
contrib/gemset_snapshot000077500000001044147511530550011344 0ustar00#!/usr/bin/env bash

printf "\nBeginning snapshot of the current environment gem list into snapshot.gems\n"

file_name="snapshot.gems"

gems=($(gem list | sed 's#[\(|\)]##g' | sed 's#, #,#g' | \tr ' ' ';'))

for gem in "${gems[@]}" ; do

  name="${gem%%;*}"

  versions=${gem#*;}
  versions=(${versions/,/ })

  for version in "${versions[@]}" ; do

    echo "$name -v$version" >> "$file_name"

  done ; unset version versions

done ; unset file_name

printf "\nCompleted snapshot of the current environment gem list into snapshot.gems\n"

exit $?
contrib/hudson/rvmRake-1.0-SNAPSHOT-20100819.hpi000066400000023211147511530550014257 0ustar00PK
n�=	META-INF/PK
m�=�"�META-INF/MANIFEST.MF}��N�0E���^����"h�KRA�TM��d��&��LB�{�hE��s5g�L"����|��,����>S���7%���J�=H��/�����D�`(Y6�ā�
�AΟ�Co���o�%Gӻ�ZV �o��<%��+���t���'����u�IW/;JRe=�6?[S�ت�kkXϻӚB6�Ԩ�v�t���Ư(y��`
щ (��y�f�
��@
~�s7h(uc�u���� ��a�p!nf|�U�rlv9>��P�
PK
n�=WEB-INF/PK
n�=WEB-INF/classes/PK
n�=WEB-INF/classes/hudson/PK
n�=WEB-INF/classes/hudson/plugins/PK
n�='WEB-INF/classes/hudson/plugins/rvmRake/PK
n�=,WEB-INF/classes/hudson/plugins/rvmRake/Rake/PK
n�=WEB-INF/classes/META-INF/PK
n�=%WEB-INF/classes/META-INF/annotations/PK
n�=?ߧl��	help.html%�An�0�}�X=��+���r�]%��#���a	A���������q�W����D���2^m�鄟�gI�͆g��OH#vi�3�=F��z���,����R����_ε�>��6j�d]�x��2�;���\դ�A���hh=�Y�ݘ�ݹ�PK
n�="T���8WEB-INF/classes/hudson/plugins/rvmRake/Rake/config.jelly�TM��0={� 
م�}�-$KKO�%Yڳl�%�d$9�)��;��jcH����7�f����a�(�9��ie,����<o��Z�C���BɲP�7�g0>���3zL��nml�^BN�e�z�����
�l��;,�����R�t����Fϙ�5`�"
��R��[���U���r�ܧ�|�/P*����C�Dt!Q.����!�ʶz�΅�$�R�wʃ���9�t��./�!�I�ǽ/�4oHA �����w�>��������;�"�1+�љl4�!u8�荻�;3�-V��a���螒=�`���Zo���P��oF��	�P��]q}�q$UK�g�G�~��C�ܯ���|���8��E("&I����}��؟�wV�N������+ol�?1'�W�0�:�ɲ�j���U�[z�(�K�/c���-�"ᚬ��J�C�1�~YK��g2^
h��_A���]��g�MG�ʈ7B�-�@�ZK[��Tk��g*\�1'���:~4�"��/PK
n�=��d���3WEB-INF/classes/hudson/plugins/rvmRake/Rake$1.class}�M
�0��h5��^�
=�(�AO���?�D���s�<����y���ޟ�@���1D��j�6��ZIBx7�m� ��Ε��.O��L�0'����F���Z[�w�½mR�Qk�VZB�i\	]�s�ȼ#,�@��C��\
0q7��y�6r�)�}PK
n�=ܸiz�@WEB-INF/classes/hudson/plugins/rvmRake/Rake$RakeDescriptor.class�T[OQ�N[�R
�&W���m�,x��\"�@���t�څ�n��&j�/�ID��(�v���&=�3��7sff����?�b*��P�!��֐�%�� �I�}<d��͙d���k�i3+")��n!-�U���Ҕ23\_�&u�p��P��7Ō�3�VtL�!<ošֹm���n�6
���9ͰUk� CTy�N]N83�]��"/P��X<�����s#��8�f�Wk�7��p#C�ױ�i��M3o�DM�.,B���r��$S�pT{]ݐ�\YZ\Jo����_T"��[b���*)��U��gh?/!Chv'#��f��Gt����4��W��:���ۛ�C�ľ�y�*cCo���&�b�\�a�Y�rw\��=+��_���M[}�jzVX�Iُӵ2�|�I;,�Fu]���'a$%�w��67ETڣ�2I4���(�.�-D���n<�qL(��)�1tx��<
a8��0��ΐ���2��sq��s<}s�-�]`�;�w_�x�vy9J�\i`��Y�����O��W�o-sZ3�r�&Ng:�!=}}�7I���S�ݫ'm�4ZD���Ÿ8@`�t"t��O�;(xO�� �e<������q
��>S՗
Eu���H��J&�] �LH|E��7(~���$ͧM��h�S:K��p�"��9@���9���I�ϧ�k����^}�^}Jb`�5'���K�ԥ�W����u5�d�^]c$}$��`�gR���*��M~?��1�K2�f��d��D��%#�ԊZ<F�PK
n�=Zh�R�-1WEB-INF/classes/hudson/plugins/rvmRake/Rake.class�W�{W~'{����@��@Mq��&B-�
�B54@L��@���ɐ��:;˥U[���K�[AE�V�R-���b�VQ�~E����\6���g����]�����}�2�����v�� ��bx@���bx�ޫ�!<��}x���TQ�
>��QuxL%��2>��#��8���~B����
>��SBͧe|F�*|V�Nœ���S8-ξ �/��Kb8#�/�����)_����f|C�:+l>#�*Z�-ߖqNƳ A�,���蹜����_�0v��cf]ۑ���������/��w<���VG6�3�\�slRt��y�h'e�����1�1	��G�czGF��:�{�P��63�`&�k��2iu�X��ټ����&�/�#��J�p�ʹLw��ñ��ߨ�-C�]v������/?9j8���@]�k��̐�b]���&��Y�[�|�?o��1d�L��,��]Ӷ(ﵝ��	{<��@�ճ��إ��N;o����:�T�����WϹ;�f�D�J��ٽ�2�I��t������ҝ�2�|f���̹ӣ�e7C2*X$�^�
C��T�Eɔl,P4�9��G�c���b_�ՙ�7�[��g�Ǒ<u�����s�v&%�c��){rR�譠�8��tЯ��mJ=�LA�Ąj(2�vG��)#+���S6�dYW6�wMBu���C�yo��{��#=X,%�����	�(�>��Ȋ��}2[��E|�-�.JfN�w$D�1Kw���'��a��Z�kUBA��n��
|T-�fZVMiU�Z
�%�*fn�ԩ1����;���4��x�y��m�L��Q��:`�T�vD(k5܁��۰Y��bH�a�����d|W�s8/�y
�)
LKh�F���Ԩ�Z��M.�E
�q���J��xI�%|O�˸��'��!b��C^*�Ș�i�[�D��k�~���@q�W4��e\��S�\ƫ~�_j�~��7�������?j����̧Pd�Y�_�W֑@�d�0Ryq�tD�����i�;��៸��V�U���l�ןB��E$�T�S�-�����ld��uu����ϺFz�zV�~91L��r�l�̸��s�b�|��5��6T�,���N9���
�����Y��Q#��SƎLF–�z�}��u뀧�b�*v�ݶ3�7$}�������m>*Z����Y/c���Hl��ٽ=�s����oی�� �y6�l��cg�x�A{°��2[ɳq?�@�H�Ww\��[��9s��w�/5�f��3v�+_ˎH�n���֤׵ו��O�a�y	�y��W�^�p8���e�
�B��@�8�����`�m���K\��O�9V��9=T­1ߏ��@U��y7���g3ݎ#��ߒ(����v�"�Y��-R��N�,+c���آ�Ʉu����?y2������7�^���步9Y���r�_�lG���3�e��Ӑ�S���M!OL!���GCS��S�ϓ�
wr\���&D�d	�,#�(m5�-D��o/j�Nt%�J%�Vy�@�(�=�Q}ȣ�0v�S����������
�ZP��h��H2ԖGCWP
%
P�?7�}��Z��[C_��
Ե�����f07q���܄=���܄^�%�0���~b���b�察|��E�U[yR�?���P=2
-���`}M���&C�ֶ�4j�a�V^F�E�'�|y��i�4(OaeTn�lJ��`T-`��#��C���,���A4Q~$P�00"�
X1L"TdU����*�ɧ�`�Ja�N�&en��`��<�嗰jD��i�D��(ծ��a����V:���&N�r��y�Ҡ��<�`�\R�*����c����*~���贫�,)h��D�`�n��nRw1��04ws�C���g���4��,�~Cx���U܋�p�ZK*�jq����"�O0yw2��a©h��!J�L�F���
S{5Q��k�A�G-
�yH���XNR�T�˩B��*i�>��
)����n$k1U. C<���*iQ[���� �#�x�4��J��Y$g�y��&y���n��K(%L�VQ��$YW)<1G84#<�+��}�-_�P�p�W�V
���]>��
�}�_��J�-��H��n����E�$��uHr\B�4��h9���c���L_��4� ��7�?�“��PK
n�=�,g\e3WEB-INF/classes/hudson/plugins/rvmRake/Rake.staplerSOMQp,MW0�P02�21�22VQ0204�J��+.)*M.�/�-*M�.)��K�)J�Nu��I�)I,�.s}2�\2����l�*��(��PK
n�="�c�0�1WEB-INF/classes/hudson/plugins/rvmRake/Util.class�T[S�F=���q����������IhHI
%���̴�d"썭D���D!y�KBg��^�ôS~@�L�A�omH��D���9�����Ylƌ��a�㲲W8>�qՀ��k�cN->㸡�:tS���8��ͱ�cIǗɛ�����-m)(	���답��-�ζG+oˑ�Z�N-��u�T���o׼��u[�T7�'�.t�yC������ɩ�cgDZ=�/ۅP�~y~��.VW�m6F�"T�KA�J�ˁ܌��Z�7��؆���8]z�by
�K"�-ˤg��-�im���:��L��c{K�(�,�eWe�K�gF�8�wL,ら���w�5�?x~�f8�6�b�z%!	&�9S	�B�=y���5
�6������m*9Չ�'���
+9
��&vE����*P����3;UI{��L�ۏE1d�/���ݵ��TI�$N�퀤x9I:]���oƴWAuSslȠ&d�GN�&|J|.�)Q�0�/K�5�QE�u
e�
�{u4>�}���T�i��V6Y�7:�`�hҁs4&��~�B�B��#E��B|���?��!:H�K[Z���˴�����V�!��-��z�}yLԋ���q��,�H5�3��qL�+jd�x����[�&��BV�����B6iY��n
���o8�M�3�˅	������qb�81�Ph7L��Rpc�F�JK���I�'�h*��dS��]��⸄i�uPj�ǩ٠uّ85�L�n
�C˜(1��&g��8ܺGϩ��*e�wr�PK
n�=��]o~�WEB-INF/classes/index.jelly�;�0Dk|�u����
Ҡ(��0�mn�L3o�F��Т{y�2�L��R���l�~N���p��~b�
%���L��Q�GS-�6E1y����9��&�������L���3UF�B��PK
n�=�f���5WEB-INF/classes/META-INF/annotations/hudson.ExtensionM��NA�E�5��&�a�HLR�j��nr,�?w�NB�������,�SL~���}~�Y��3�b�
�@g7Bj�DA����T�i2�i�@{
��[fp1W�3jb��")Uh��`/M5� Ѥg�c�
>���y����ps��,U:�Dct����E]k�Su%M��9�H�Ő<��a��:y�w
���G�82.�?�����4ʒ��=�����ÿ����۱��PK
n�=.WEB-INF/classes/META-INF/exposed.stapler-beansPK
n�=META-INF/maven/PK
n�=(META-INF/maven/org.jvnet.hudson.plugins/PK
n�=0META-INF/maven/org.jvnet.hudson.plugins/rvmRake/PK
��=��f�7META-INF/maven/org.jvnet.hudson.plugins/rvmRake/pom.xml�TM��0��+�=����K�Qm[	�h�V�!�c��Ďl'���c;���"f�͛��VF�
�Щ,��r�w��R�F(�*�k������'79?YyF�G|�
�OI2#�V�
$�l*�uLqYV�mp.5gNj��b�O��6w�d���n�	B�ԙ(�����J�|T1#���ȍ���Y
���Q��}�Y�pU�94OI��xf��1���\Ӵ�f�v����W�t�'�\�)��A�zT�t���z���Vr`�G��+�;�+E�B��C���Q�=zz^![W�6�#%�jS���s��/��lj�4�˙��N��H�ٖ���V
.�o�s�
���b�Q�#���hD�+a�G��?�Ǹb���%�&�f�h�Gfi��m9+�NF����p(�|ݟ��I�Ii���H����ɠ�x'�8ր�oh�޸��!q�D��=�F�Բ����L���6>��6��6b'����.�N�a���Fv�V�
F1���K2����,�����IN'�PK
n�=]�جy{>META-INF/maven/org.jvnet.hudson.plugins/rvmRake/pom.properties
ʻ
�0�=_q��!��R��I|`
����񑔛��v<p�=$���'S1�f\�rJ��u��0����U��c�$+}�p��X��"9��3�b��83��dy9T�7�F�PK
n�=	�AMETA-INF/PK
m�=�"���'META-INF/MANIFEST.MFPK
n�=�A_WEB-INF/PK
n�=�A�WEB-INF/classes/PK
n�=�A�WEB-INF/classes/hudson/PK
n�=�A�WEB-INF/classes/hudson/plugins/PK
n�='�A%WEB-INF/classes/hudson/plugins/rvmRake/PK
n�=,�AjWEB-INF/classes/hudson/plugins/rvmRake/Rake/PK
n�=�A�WEB-INF/classes/META-INF/PK
n�=%�A�WEB-INF/classes/META-INF/annotations/PK
n�=?ߧl��	��.help.htmlPK
n�="T���8���WEB-INF/classes/hudson/plugins/rvmRake/Rake/config.jellyPK
n�=��d���3��iWEB-INF/classes/hudson/plugins/rvmRake/Rake$1.classPK
n�=ܸiz�@��[WEB-INF/classes/hudson/plugins/rvmRake/Rake$RakeDescriptor.classPK
n�=Zh�R�-1���
WEB-INF/classes/hudson/plugins/rvmRake/Rake.classPK
n�=�,g\e3���WEB-INF/classes/hudson/plugins/rvmRake/Rake.staplerPK
n�="�c�0�1���WEB-INF/classes/hudson/plugins/rvmRake/Util.classPK
n�=��]o~���WEB-INF/classes/index.jellyPK
n�=�f���5���WEB-INF/classes/META-INF/annotations/hudson.ExtensionPK
n�=.��WEB-INF/classes/META-INF/exposed.stapler-beansPK
n�=�AOMETA-INF/maven/PK
n�=(�A|META-INF/maven/org.jvnet.hudson.plugins/PK
n�=0�A�META-INF/maven/org.jvnet.hudson.plugins/rvmRake/PK
��=��f�7��META-INF/maven/org.jvnet.hudson.plugins/rvmRake/pom.xmlPK
n�=]�جy{>���META-INF/maven/org.jvnet.hudson.plugins/rvmRake/pom.propertiesPKVcontrib/hudson/rvmRuby-1.0-SNAPSHOT-20100819.hpi000066400000016034147511530550014323 0ustar00PK
m�=	META-INF/PK
l�=�k
4�META-INF/MANIFEST.MF}��N�0E���^���"ޥ� R��t�����m9��=y��B��3w&͵�-Нp�2��(1J\!U'�^���[r0zp"Q�ő���$�;�1ZxU��[`&P���s���{t�����t�7��5�?b���Z4BCC�UP�_���*Yg��-F�4~�_��Nl���h2�4_)Mf_
$��R�yk��+��\͉������>(Lò�.&G=�5M�����u��FØE1������fN�_�+�f���(��oPK
l�=WEB-INF/PK
l�=WEB-INF/classes/PK
l�=WEB-INF/classes/hudson/PK
l�=WEB-INF/classes/hudson/plugins/PK
l�='WEB-INF/classes/hudson/plugins/rvmRuby/PK
l�=,WEB-INF/classes/hudson/plugins/rvmRuby/Ruby/PK
l�=WEB-INF/classes/META-INF/PK
l�=%WEB-INF/classes/META-INF/annotations/PK
l�=�(���	help.htmleQAn�0��DO����mpb�њX�l��^_�����"����;M��z>KHpV��S���zWƜ��:O�I���o�E�=��@�*?���C�ۆw��#Z��`}*�"zN�u��+�2<�	�.�Vs4�Oƫ�@��'�a�3�m�n?� 1����0�okd�\�[W�k*o|DV�8t������[����ĞԨ���{.O{���ՖC���%�:5��)��I7PK
l�=��h�8WEB-INF/classes/hudson/plugins/rvmRuby/Ruby/config.jellymRAn�0��"� ��9��ܓ���Z���EwI˕j#��K�����g93��>�N�CZ+3�M23�tA���,D��-Y.��2%��d<�^�X�Zg����"�3j�x��4���ru�T�ݯg���*.��q/�b��dd�Ă�|�	�Qq(`%D?��[��G���{���4j8bV�P���A�Ɖ9��7-���,h�yO��\����d^�u<A@�ݏ��ӛ��yu!W*��7圿��^�~���q}�dO_Y:![�n^%F��{z+)�J*:��E9�V���jG�.)D�`�Nb��B�/n�8���%�%6
���7�{�ո�r���PK
l�=L�>��3WEB-INF/classes/hudson/plugins/rvmRuby/Ruby$1.class}�M
�0��h5��^�
=�(�AO���?�D����\x%&�w�o����"f`!�����V�^��m� ��Ε��.O��L�0'����F���Z[�7�½mR�Qk�VZB�i\	]�s�ȼ#,�@��C��\
0q7��y�6r�)�}PK
l�=���@WEB-INF/classes/hudson/plugins/rvmRuby/Ruby$DescriptorImpl.class�T�RA=��	I;�D�����((�"����q�d`2fA�+y�*���(��31�!,�Cw������_�����rd$̄�lrsȆ�4���<��d^�K	�:U]�����.C`����U�N������&V0ʊ�����ʀ]U-�{yn�M�n�F��1D7t��+�bY��3���g�\ל��[�y\�vJ��X�:�":���[���)�N�`��ШZ�!�I]׸)�}�9ܲs�۲�/�0�[�[�^�s���m�:����q���M~Đ�6Ch�0ky�V���Dm�p;�ZuM9�Tj�z_2U8P�YS�
���^���:��k����S_���^/Kb:�w2'�,Cx����j薄	t	��䍃��#�o�a�,�]���ɶ�G�v�� ��?\4�̽vt
�Yѵ(�p�a���d�hh�Y›(����u[��1���c�p�{)œǪW�ۻ]u�a���JS���5-�2���c��k:���Ѭ9)��y��I�]�����h��5���T�*U۲w��a�mĢ�*BO��:�i�Q!�I�'�؉P������C��	V !��t�zv����4�FA�i�ߗL,p�`&�A+���	����`qϡ&NCv�1�Q7�k��]�c�V�¥����q�lu�tյg��'+�JZ����Μ#��|��Y�D�	��B&� �$�va�������Y[�Ϡ	$�'t�GҵO!����}���z)|Bx��0Iս��PK
l�=|����A1WEB-INF/classes/hudson/plugins/rvmRuby/Ruby.class�U]W�F�kK�%�I�$�$�ې4�)ic�q�bQZ7O��5Je�J2�?��"��iO�������J��%y����ܹswv�Ͽ�
`����8R�T�g�x$��`]��8Y�
>W�XA%�/�X�*x��jcx�`K,m�x�e�d�2vd|��b��)[��r�ar��M���N��o1ĝ^�'�sL�͠U_F�2�v1X+���^�U�w�jKս^����}��6m��tj�P��yp������1L�_���2H�n�3LUM�?�u��1T�M��5S����T��E$(���v:��bX�v4�d�gZ�r(�0�I���4-�mx{���Q
ł�.���hs�ܵ=n{D�J:3
!IN"f�\�k3L�Rm�l&��v�q�3�f>��!a���&e�Ͷmx=����������~�	a�SZ#�ͷ���Y��.�aEwn�!�AYmZa/E�!�w{N�ը2�WDT��nR��wF��T,39L��(���hz{y�
&wU�`�z��&M�~���]_#��؏���oP�^
�(��b��o[�o�/� �ΝLحj.g��4�ݸPH�iCJډF㝮G:�=�r���V�oz�ѻ�~��b�^��lHBJ��&Ԡ9Nkt2�,͓����j6w�HV�C:��n�8�(���w	Bx��T���/:
B��!�3�Dd"@]:K�sD�z3p�&BP�%�2�Ȅ�
��BR�c����&��oP�zL���늖���X����� �#��S�g. ��KXB>�W�YD��a��>�8�0�����69��������>!o�7#�z�)1iS�H���})�3�@�<�}
T���Lz����S�WPs}�K�l�w(ÇuI<���`@�T_��?g�*����2UK�@.�4�M
Q�}�'A]� �E�%��ln��hF�a��K��L$�Α��9��#|L`
�^
��ˆƟ�\g'��+�#_��)�?�5����0
$�y���PK
l�=�����WEB-INF/classes/index.jellye�A
� �}O1d������Lu`bŒFz�j��|�|x|��9_^���24b�UQt$8I�R)���֚��|n�s4�D;��ޝ�C�HIK%^A��Q�
���P�c��$��ʹ��	A
1�&�[�0lsq���PK
l�=�"J�5WEB-INF/classes/META-INF/annotations/hudson.ExtensionM��JA�'El��  HL!\�ܥJ7�
�
����3��|	_���:�$�SL1����}��Q�pk��[�Vή��N����1���(�dv�9��Nd�m]��LaϨ��H�\�i�4M��L���O�W��N�-�H��r��,U>�DCt����y��5©�H�ou��"-��qP�˧���48�~�b�8�����Y|&Y6�ڡG���꟰�w�8�[7�[�5PK
l�=.WEB-INF/classes/META-INF/exposed.stapler-beansPK
m�=META-INF/maven/PK
m�=(META-INF/maven/org.jvnet.hudson.plugins/PK
m�=0META-INF/maven/org.jvnet.hudson.plugins/rvmRuby/PK
w�=Z�o#��7META-INF/maven/org.jvnet.hudson.plugins/rvmRuby/pom.xml��Mo�0��|
+��M�&�Nۡ��5j�h��5�۲
$�~Ɔ���E����y�+-��`WW�|��֪���L@�-��@��%��	Lf������v��9I��r�v�5��0��\����BRb�H�9��w/�Kw&�ep�eΪ
���3���H6E46,�Ph٨�y����²ɍPUM�htb����։���D:��!��ο`�U��R�S�n��uu��-q���T�'���$_�}[��O�
R���,`�;7�%x�,��QJj�	#�
a���aK
gl^!�5Z7�Je��H���9C�q,�J!ܱ�+rr�h��?�l��Ά�2rsֲJ*��_Lp����/��<��9L"l��Dt\�9�ar�x���e[��.�9��
X���t��Tg�kx��~���h����n����>h^��{����(�ת�Cۑ;��O�EPK
l�=�ty{>META-INF/maven/org.jvnet.hudson.plugins/rvmRuby/pom.properties
ʻ
�0�=_q��!��С�:��:��#������x�4GH&��y���X3m�y%�vߩ&=�R���|��b���]�n#s�r�}$�?5`��bS|��Cb���g��ߣ�+�PK
m�=	�AMETA-INF/PK
l�=�k
4���'META-INF/MANIFEST.MFPK
l�=�A_WEB-INF/PK
l�=�A�WEB-INF/classes/PK
l�=�A�WEB-INF/classes/hudson/PK
l�=�A�WEB-INF/classes/hudson/plugins/PK
l�='�A%WEB-INF/classes/hudson/plugins/rvmRuby/PK
l�=,�AjWEB-INF/classes/hudson/plugins/rvmRuby/Ruby/PK
l�=�A�WEB-INF/classes/META-INF/PK
l�=%�A�WEB-INF/classes/META-INF/annotations/PK
l�=�(���	��.help.htmlPK
l�=��h�8��FWEB-INF/classes/hudson/plugins/rvmRuby/Ruby/config.jellyPK
l�=L�>��3��WEB-INF/classes/hudson/plugins/rvmRuby/Ruby$1.classPK
l�=���@���WEB-INF/classes/hudson/plugins/rvmRuby/Ruby$DescriptorImpl.classPK
l�=|����A1��`
WEB-INF/classes/hudson/plugins/rvmRuby/Ruby.classPK
l�=��������WEB-INF/classes/index.jellyPK
l�=�"J�5��hWEB-INF/classes/META-INF/annotations/hudson.ExtensionPK
l�=.���WEB-INF/classes/META-INF/exposed.stapler-beansPK
m�=�A�META-INF/maven/PK
m�=(�AMETA-INF/maven/org.jvnet.hudson.plugins/PK
m�=0�A`META-INF/maven/org.jvnet.hudson.plugins/rvmRuby/PK
w�=Z�o#��7���META-INF/maven/org.jvnet.hudson.plugins/rvmRuby/pom.xmlPK
l�=�ty{>���META-INF/maven/org.jvnet.hudson.plugins/rvmRuby/pom.propertiesPK]�contrib/hudson/README.md000066400000001055147511530550010774 0ustar00# RVM Hudson Plugins

These plugins are forks of the ruby, rake and rubyMetrics plugins
for Hudson. They're designed to make it dead simple to get started
with RVM and to let you simply specify a rvm ruby string.

For more current updates, see:

* [https://github.com/Sutto/hudson-rvmRuby-plugin](https://github.com/Sutto/hudson-rvmRuby-plugin)
* [https://github.com/Sutto/hudson-rvmRake-plugin](https://github.com/Sutto/hudson-rvmRake-plugin)
* [https://github.com/Sutto/hudson-rvmRubyMetrics-plugin](https://github.com/Sutto/hudson-rvmRubyMetrics-plugin)
contrib/hudson/rvmRubyMetrics-1.0-SNAPSHOT-20100819.hpi000066400001603355147511530550015663 0ustar00PK
��=	META-INF/PK
��=@��META-INF/MANIFEST.MF�P�N�0�[�?��*h}K� R"R�"7Y����{��@+�8�4;;�3���,�70V5Z��(�LV���T�u�}-(�5 r>�	�2+�ŲM�ܩ
G�:�f�1���^��Pr�EЃ6_�3]��ֻШ�R�P�ԠQ�@Z)��g���2J��󊒴l�����Ⱒ��T�����Ba��^��~:��K����T���+T�:����֨���S?���A�`&&>VtN�b/~t~ξU����X��烱��Sr�47%�PK
��=css/PK
��=images/PK
��=
images/24x24/PK
��=js/PK
��=WEB-INF/PK
��=WEB-INF/classes/PK
��=WEB-INF/classes/hudson/PK
��=WEB-INF/classes/hudson/plugins/PK
��=.WEB-INF/classes/hudson/plugins/rvmRubyMetrics/PK
��=3WEB-INF/classes/hudson/plugins/rvmRubyMetrics/flog/PK
��=CWEB-INF/classes/hudson/plugins/rvmRubyMetrics/flog/FlogBuildAction/PK
��=EWEB-INF/classes/hudson/plugins/rvmRubyMetrics/flog/FlogProjectAction/PK
��=AWEB-INF/classes/hudson/plugins/rvmRubyMetrics/flog/FlogPublisher/PK
��=9WEB-INF/classes/hudson/plugins/rvmRubyMetrics/flog/model/PK
��=9WEB-INF/classes/hudson/plugins/rvmRubyMetrics/railsNotes/PK
��=?WEB-INF/classes/hudson/plugins/rvmRubyMetrics/railsNotes/model/PK
��=OWEB-INF/classes/hudson/plugins/rvmRubyMetrics/railsNotes/RailsNotesBuildAction/PK
��=QWEB-INF/classes/hudson/plugins/rvmRubyMetrics/railsNotes/RailsNotesProjectAction/PK
��=MWEB-INF/classes/hudson/plugins/rvmRubyMetrics/railsNotes/RailsNotesPublisher/PK
��=9WEB-INF/classes/hudson/plugins/rvmRubyMetrics/railsStats/PK
��=?WEB-INF/classes/hudson/plugins/rvmRubyMetrics/railsStats/model/PK
��=OWEB-INF/classes/hudson/plugins/rvmRubyMetrics/railsStats/RailsStatsBuildAction/PK
��=QWEB-INF/classes/hudson/plugins/rvmRubyMetrics/railsStats/RailsStatsProjectAction/PK
��=MWEB-INF/classes/hudson/plugins/rvmRubyMetrics/railsStats/RailsStatsPublisher/PK
��=3WEB-INF/classes/hudson/plugins/rvmRubyMetrics/rcov/PK
��=9WEB-INF/classes/hudson/plugins/rvmRubyMetrics/rcov/model/PK
��=HWEB-INF/classes/hudson/plugins/rvmRubyMetrics/rcov/model/RcovFileDetail/PK
��=CWEB-INF/classes/hudson/plugins/rvmRubyMetrics/rcov/RcovBuildAction/PK
��=EWEB-INF/classes/hudson/plugins/rvmRubyMetrics/rcov/RcovProjectAction/PK
��=AWEB-INF/classes/hudson/plugins/rvmRubyMetrics/rcov/RcovPublisher/PK
��=6WEB-INF/classes/hudson/plugins/rvmRubyMetrics/saikuro/PK
��=<WEB-INF/classes/hudson/plugins/rvmRubyMetrics/saikuro/model/PK
��=NWEB-INF/classes/hudson/plugins/rvmRubyMetrics/saikuro/model/SaikuroFileDetail/PK
��=IWEB-INF/classes/hudson/plugins/rvmRubyMetrics/saikuro/SaikuroBuildAction/PK
��=KWEB-INF/classes/hudson/plugins/rvmRubyMetrics/saikuro/SaikuroProjectAction/PK
��=GWEB-INF/classes/hudson/plugins/rvmRubyMetrics/saikuro/SaikuroPublisher/PK
��=3WEB-INF/classes/hudson/plugins/rvmRubyMetrics/tags/PK
��=WEB-INF/classes/META-INF/PK
��=%WEB-INF/classes/META-INF/annotations/PK
��=WEB-INF/lib/PK
��=���q�t
css/style.css�WQ��6~n~���I�	r�lv�٧�Ԫ}�T��������ٴ�~c;@��[6��7��3�'MͪU�dӄ
�P]�A2Y����D�����m�x��3
�:�JŴ�ՎT��	c4MX�ϕ<V<Le)�n���nj=�Tz�_	gM�,��5����Fp���q.�|G�jc_�PY)O;RΡ2��sk��y�™�^���$K����h�	HQ�Q�:梩Kvޑ���~�=�Ƞ����2Pj�ӣEy�S5�jkQ�eu�R�⳴�a"�Tx��^��`���f�Ћ��E��&Rkyؑ-�T#K�q
sS�x�����(2v%R@�*�+R@�Z����I�A
��a��Kk��S���ۢ�$��?����3�b�2�݌�ը�V� �x�hm�r
�kAZ~���H�֯���G�YPi�Dy��"	h��Y"J����^Y��~'?ᴅf	�VD����*�-4_���W�|(>����hmS���UK�J4��"	��� h�x�jP)�5W�.�@c����rK�e��n=�����0��lv�)����mi/�U^�J3J�NW�!��H_~}����PPK�͒z�ie�R!X�%�ܕ���ׅq�	��.�?~��{�B�e�{����=�yp���Ҽ�J�J�����A͸�f=G�S�e)��g�{M�d5�ds8�.E���[����t	�f��)(��I3Bzo�݌��8�\sBl����oDd��,�a��N�<���z%q�W�ZA@� �KzIt�k��oB7��@�EA ���!�J�w�����gyTw���"�:,�/O���lGؕ�jm��W֫��w}Sb�N�k�	���C�⹗$����A�m��R#^�����p�m�|t]�[�C[Ž��T��1.Ϯ�ڡN�϶��c���<ڃ��`a�i��Ɂ'�� �>V?}*�[H	�8���}=Z�[)l�m:B�& n���0-����v^�놜��v`��G)s�R�9�צX�����1o���)5�}��̙��s=����!aO�WBb'���'�Fn[�o��]*!գ�0�)��0�⎞��8�q4�A�h�L}Z�G�ڵ��_��#oܯ��ȚO���=�d��ɉ&|`����i�PK
��=ϱ ��images/24x24/tab.png���PNG


IHDRH-�bKGD�������tIME��op�IDAT(����KTa���|�:sgq&
$7A."$ZHA��
m[Y1 �hc��6����� �
�*܄B�/��,*qP��̝�w�w�4ဆB��{�9���ȿ�C������c��Oݺ^\*L�o�vqw���������/��pvW>-?z^�0y 8����
�Yb#���[��n�߿�N�y�;V5&�끇U	�.M�a;*�����D2'##3��1�
���4>�L[X1���1���|�R�7c%9�mP��PB���ؚ���RУ�D�o������j��Uesk5w�BCBe��u:��Tq�r��l�]ۚ[x�>�?��� 
���W��d�ξ[���įy��aǍ�4�`�k��>�4�-�<��*�Gj<�~9H��XS��IEND�B`�
PK
��=D�JhQ;js/flog.accordion.js�R�N�0���D
~*
�@B������cG���B}wΎRT����K/:��zG��V+�
�pl�H��E6��RkF��
	[W�r�Ē)]�����E(�V�[��Z�Y��Ii���*'�
����@���ՠq3nF�|BA�<�'h??��z�f�Br�)J�h�BWd��2i��d
�y*�ڱ��TO��4��N"4+�5-�U�F�#��B���Xy���r����ُ���Hطª_��,�w'of�軃�pf}�|vq/�x�%�ë�0��'b��Z�\�z�;�m`\��:92�(��V�]Ō
o�5�?\��PK
��="�\urailsNotesHelp.html�
�0C�;Sx���1�E+P����������� Ԓ��8 �ai�� к��<��,}Jg��UF��P�&�<�&��ǟ��QM�v��oZp>PK
��=4e*�^urailsStatsHelp.html�A�0C�}O�pv]N�j"��8 nO�Z���6"eJ�r���_��
�ׅ-����I��aG��m�NB
ɝ��2o�ddm�{��\�����PK
��=���"��NWEB-INF/classes/hudson/plugins/rvmRubyMetrics/AbstractRailsTaskPublisher.class�V�WU��d�	�����
�V�Ѷ�4`���F�T�V'��Lf�,Pܷ.n�����	G9�G��<~���C{|�{���~w���������8��&<���&��ɸFo��x���|}'��!��{2�0rȇI��&c2�F������������0�x_�FFe8a���y\rFƬ����Nk]�)��Xf�lxE�tR�Li�8)�d�^nnԵu����QgԔ����*�$�9�M˞��%�&dWu��C���g��lU�	%>FX�yْ�M�W�i�
5gh�+�c���s�(�S�Ðn�1�p�I��9����U7��l���3�����l���'�(�\lS�ͺ# ��uG˻\w͓+��eUwj0>����
���浲�[&�6��SV�$�w�6�\��I�.1dj�%ʑQ�ꂧ��5^F��<��^Xet��L�q���8j��r��pp;|��Q���h�gWѷ��f�[�/c��T�$�Tϡ�iwi�\ݨ&���=���Z�m�j�fe_}G̕׺"�MC��Y��82�d|@�Ջ��z6!d�K��x�t�I>��6E-�$��
�oM���q����y�w"���ߠ~��
��P�s�Q�zl3i��G
��1+��R_�岂��9͒�eN�t}���C����B���J��8E�g���ծTLwb����،j腘�ݏ�Cϫ\=V�m���=�б�֋�h��{�O��c
����5�����=݇j:H�j����e����2����OP&j�:�R�:�g�'�Rp
��v�ݡ�:m���]5]Ͷ���jUZ��n��^�@���V�����N(�@˦�J�Qw.�W�ܠ*��p��7�[
&s��o��2l<C�,޻�l�R+j&��52��TmH�*�5�DW3�Zk/�4Iee��;�hN5�abs�u45ɑ�U,�}���IeΒ���nm@�O?��§�E{j�u,>&uӿ�Q���Ƨ���k\�>�h
�L��,����$K`��"|��E�}����'����1Z�����'q���I`@;�#�4c?Z%C�H'�
���Gb�]bbǝ�w�O��8Qu*E+�
p����K@+�Uh��
�����(����*ߧ��ց�
�'+=B2i� ��#��.��&#���IFv��,�
ɿ0�_�'	��j�Y�#J��$���N�4Dj��E4�H�|bC�E�x��OKZJD�{~����t *��{��%�F�E���*�Gk�@"��9���D��*�$>eH�:Ve+8��.�J�qx<XB,$)9�
V��D4@~��#���8�A�v-T�V����i�L��)/a�N�p����"#�l/qz�_-�8K�L�����<.����<9��.�2��R�]!n�Ԫ�1^��UQ{^��ȈjK��z���
��PK
��=C��
�RWEB-INF/classes/hudson/plugins/rvmRubyMetrics/AbstractRubyMetricsBuildAction.class�X|W�?[�Y�ىlj��)�r���v�:��(Ubc+nJ�Yz�/�u��)�ٲ
Z
�P(�6�Ĵr�@	�-eS�ޔUV��{w�aIvſ�������;=������7y��+}p�Un�x
^+�n�[%�΋��z	o�7��v�Q�����Z܉�ܷ���|D�m>���w��]>��n/ރ���>�������ć��b8!�'}��I|D�
�}b��0�����^܏3>|�b���
��(���)	��a>��f<��CxX�g=W4����"<"P?'��K��]����b$�ԅ/��+5�j
��5	_gpk�R\gX��
-���<�5L]���2j2���R)���a�,�]��[	�ӥ�Ts+Ê�lt[�\=t�0/������(ף�h� �-�$�]{�2�T�ak�j:�I�)#��̌��M]�y6E0�cw�T�	�<���t������B7$�9�󃪖1��I�WZ��T��FvtE;�����h��t�b*C��@�zyAЌ�&C��;%|���vE*yĂG�Q�d��)����b��p��"��J(���!�0�蜆�3���^Z��ĬSđ�v�Jz�!�hz"4���q2L%��:ѵ�A~}�f��8FZK�r`�ίgX;��H3��qr �B������䩸�ӑ��p����	�d���\1�e�[��u�Cq2e(F�	M?B4�0��I�2˶ݍ	z�]}��H[��o2�̙	C�Nx�a�p��XΘRH̖��"x�<A��'V�g�f��"�yT�	ݕNjf%d��:@aظ6��)!i�+
��W��hy�VU�a���_��p\�2��Y��"�u��CcJ�:��
��~;�=��9w��N����`A����U+��6�u��DU�}�y�;��4�.+�>�i͊�yt!�R}j��Q&(����@��=�m"ȸߒ�;e|�aX2��d|ߓ�}?�e�?�����뙤X	?��s��aQ�M��'�2Í2~�_��Bꄒ�Fh�+�$7���TB�op������{�A��'#�'��2��_d� ��8 ������)�_2���HxR�S���Y���Kfn摘$�教���tV'�z��<����(����R�.��Cc�~�Njߌ0��2[Ț%�Hf��_bKdv[*�el��V�a%
x^,�Ul5�E��K!kYFU��m���Ȱ�8'���e�$�^fX��N�CF

�I�H�0%cS��Zd���H($%��2kgeb�d�Y賅-g����C�~����� ��Vg�w�;`Z�^�XLT-��W
*EQ�����mN�a0#:
�x�N����: ��P}����^��3���j�Ĵ�`�9��2����V4%��]�Fm�G�\HV�ӵC����܅�N\=Z���E$.��N[%�=P����΅!L�Q��C��Pg�AWu
�-�G%��vz��$�2A=Hs�ʥ�ż���������~��
]�J�sk���i���*��tm��������u;-݁�_K7[�C��XE9��U�2;Hk�{����ʕ��J�d�Y|��r���5V�'Ҝ�����9A���I�}����k\2�#NK�.PN�RS��r��'�M��;vF����XDc�9QcMV��v�lEt��M���D�SM"4?2���7�mJl<�k�T|��NS����ȊF���l�J
�����hoeː�	ԟ1�`�4�
�yۡ�q7�UC�?���d��$�@y�ӡ@���^�S�/�+˛jA�mV4���Cd�{��t��٩O�V)ʄa����tuJZ!B�"�!��Vt��%���{�l��
E|s�Z��z��
AP��h�M>Q��
�	�uV�n�D�/�
��^<����R`��vS�KR~�,��?g)�����K�]�g�g#X7WW���a%���gH��<�T�\����)Up�0����EA$��#�Q��E3�@���-o/��[�`�]��E/��}��$>Ih��.�_�D�ֻ	r5�U�Ǹ�)�ֶ�Pu�v��Cc=�:�_O�6��v�66�,�G<�� �e�mȮ<�!ZE���v͂慭��*ҖE�Y�"m��N��=	�Qx�=�X[kR5g��|��cO=�����э �Ўl������	��V��x�%�J���$��BG|7a]5M|R�j�K|�����:<�Q��h�N� VϠvd
r�i�1dQ�8��,�FCN
��h���<�ո��m�VҴ)��45OaQ{����?��j���A�wb-��!���ݸ�p)�y���o�Ò%�(�Z.�"�8Qk''r�'k$ꢳ1��W�Hf��
g,�6	��U}
K��gq^�����,��Oby+����'���b��ͲX�w��X+`�XF����ɢ�����Q���n�[��,B��6����l���Y\�9���3�h�	���0�K��h?���0Ҹ���*
������נ����<v1Y�2�G/Y���0Lv���' �1�Ø�K�­�p;t�
Ӳ�5�U�=N�I˲��F�$��]t'M�m����0���h<$��<D�D|8��o��8�����RP�c[�د��c���}��n$᪭W���T�Yt���eYl
6��,��d�m��f"�����#2�D�<�=�r�P^�e�FԔ���U�µ�;�W7����"٫r���R�jйZ�Jo�\t�*�e�n/�zK�U$�_��XɊ�on#��PK
��=�G�w��
TWEB-INF/classes/hudson/plugins/rvmRubyMetrics/AbstractRubyMetricsProjectAction.class�VYs�T�;Q�M�w	�IljK�qqӤܤ$i�청:jɕ�Ж����\�3Ly)3�����+�򖦙Ƀu�s���v�׿���Y|�0C8��N\s}M<��Šx[�ĥ.\��2�#��N\���V'��;a���d�F/�2Ȋ�9�ɸ*ּx���㚌�2
2�%�E˼�e	�k��m�u3��Ɍ�XjֹX�OH��yCuJ�&atK��ht�:�uCwf$�D���,!8�-	�i��K��ZU3Jz�fV-\V-]|{ ���f���B)�v��X_.en]�K�ھ�:�g3�utӠ����U�;Ğ^]M�(ݚ�+�p^��$��=)G���%�����i,�mQ]'�~��n��j��+���SQ�⊦ZٵKVAB?ϖ�B��f���x_�YWȣ{[�U�r�<o��5	�Hڴ����]���mG-4���uY�Q�l'���]4
[s����v0��]d&��L���jE�ږa�RFN�)�+#"R)O��t�p��f��..��K�r����WR]�	)��̎A2�7�WQ��Ic�m��U{d�U�m��jHh��Z`�L�N��L�g�Ttk�q���1b8��^1KVV��rxRO

Fa*8��9�'�UEW0����xNA
�p�fNuT7X`�5���F�N`r2��AI<6�~}��2n*����?>	
>�G2>V�	>Up'�g�w]�㶂/𥌯|�oXt;��c&��62�s���Ԓߔ^�:09�*C��6Z��ikFnY��m���:	t�Z,RS��f
-"/��&��L�v�B��1+"��Vü�j��y���|,�D���[?C-*���6s�-$S�K���c�	�j~"���V���>�~�6t�d/�΂�&�y<du�2�)	=-��m����t��v$�ٌ	��O�0$<�_��Y���?�
#�}��~���6���}H����8��n�@��a�5X��3��[}�a/����Äg7�/�k{�'���Mv�½�)���k��I��8Χ�}Ƀ
��A��@-�T��*X��2��p���c0(���S|��B�O���폠�e<VFGs�A&��s
�����y���L��F��*�_��i�^���HA�S�,/N��ݱ��_j�]Db�r]�J�&�����	.e�q�j��2��vf8Ĥ�3�gH^x�X�=��=��<ngXf��@��S���{��W����2z��#L���#��G�]��݁2b�B��c���W������Qt�y��>:7L�"t-F'&)?C���G������.�ü�l��jZ��y_�V�/S���+�?<B�FB'�	h"���}�`��[h͒V��Β�;GZ�,�Y�|-ŧuʧ�l����N����6�ثH��PK
��=��3~bPWEB-INF/classes/hudson/plugins/rvmRubyMetrics/AbstractRubyMetricsPublisher.class�T[S�P�BKi�*�ږK�_h�P�a&8�
���1M���0��Ay���?�qO
��v��=�o����?}���iaa9\O�n�p�Ӹ�|
u,�Xb,O�k������op�QKx�UԬ��]s)������فP�$���B2����!}�l��#<i�JT;��a ��\��0����NTs���A�X���e�Ο�4��4k#n��[���G�{��6]�s�*�{N��a��@��h�܄������R�N,ƅ��
�NTZ��@�X\��TU8�F�_��!���+�c$��i�~P��S�\�pB��lVC�J��_��GA�o
5O��>WT})�u,X���A��⑎��੎gVA�}�;z��4T|��"�ޤ��;��'i�X4�;�XH�q�I}e�������t����e;JW��ܐ�6׷���Kʳ�J�[��;�,�
�TS����\�U�[���e�`���εt�Q�~0�Oz��$����}!�=�`
��i��(Y
�1F(����f����a���GЎ1�}�+)���$MdctR��vZB��}Y�]�8�*o��;uڂBM�7�y��Y�%s�$shG�|n�̙1��&õ5�PK
��=+s�Q�NWEB-INF/classes/hudson/plugins/rvmRubyMetrics/flog/FlogBuildAction/index.jelly}TM��0=7�µr]�������%j�&`j0�
�w0�C'<3o�{�2,Aʞ�*Y����;���@'����X�Hг#��E��˘2)>��j-ݑ��vrmfT=�����t5�tWڏ�7X-R�#�5��Em��g��&�\$ñ:I���1c{	�!r��a�
E��6"��,l�>k�J�CL�Ƞ�5�駄-`V\�/Λ,ң�[�&UN44Jۈ�yw���8f��h�j�L+-�����B�	$����4׼)(��-b��9QR�����
6T�������i���ޯbPI�-ѪΓ?�rI�p9ˆMF�(kG�v��s�m&�ف�N>O�ǠU��!cO�t�����b�L+�|����)C�j�xZ��k	c�)N*3�b&s�C}���׀�㲅�!�\��G=�ː��I�ڸ&^�-T����s���K�

܈��\�
(y�hr�u=V��V�>����n)"��Ac���;�82�l�f�M�lK5��a��&E�]��4�#l7�]5�M�Ec���tN���㣕�g�Jٿ����f-
^c�������e�v4��t�غU�4�PK
��=A.iN3�HWEB-INF/classes/hudson/plugins/rvmRubyMetrics/flog/FlogBuildAction.class�V�SW�mذ��4�R�h
!��Z��!��M���b��&����nz��b��L?���W۱�)3?��T�sw�"j'37��{��s��?��]�װ��Ѓq�5�񡊏$���\ҐEN�$����ǟH�L��\Q1�a���L�N,�媊�5�p�_��})���%E!��
�@��YnUA*����mT,�d�UC,�g��J���,T�E�)e��-c����ig唂��6�
��v�t��
Vp}���18� ��3=Y��^9�����ӛu
̚g”t�q�LJ��V���K\ӱ)��ͅ�}��Q���J�@��D��v͚%��� ���p��_��%�1�����@|�a�sM�x�\�`�<����lk�?�l}�&�2�V9!�|�Xf�	w�vG[)˞a>�
��j�	�֡\ks<��ɖ�a1�d�v)�2��Z\o��@'�gH���Ȯ�gQ2n.
΍�T��:��a./9be����s2������Cv#RM��-���ڂqMݘ�7 z��-;ЬV,�2����12����9a2ڬ�7坊=sMOHmX�q�o^B)VR�� ����8��
S�M�RAt԰ۮ8.��Gp*:��-���\�o�l'_~��pu�����j�c�u�
��cYf�1j��x�,3K�}W��:���:��=��?⮎�p�����8�)"R0�>��xj�5�Oq�}�<
�庫e-�{�FS����;��b��H�Q��2�<>�({p��	�s�0+��MG�&N�)W���~��Pvs�-�!<-���x� ^��Z���=�»��p|�i2/������5a�&=�f��=��ʹ2�5%�*wg]f�(6�??�Z�||�o��v�ђq(�;�H�إ�D.�=uR��lK!�r	dz��F|��l��B�Q�v}L����[M�U*\�&%�un�i����1G_!rѮ����0Q�����*�D��~#2�#�v�G{�So/4��(Q�8��ۀ��!D&�N:a��z�s	�
�>�$"8�u�kDE�b
�UD��\�	F�б�|��U��C���}��^�x
��]2�KF��������a��Q
��2�'�?B�e
I�� �������<NQB!P=�(�8��(�FBgx=�3d�,�-�O0Ih��j��;s�G���b�L~YŮ��W������������|�2�>�+J`�\�N�������}���NPv�ɂ��X�ȠY��}�A��<���Q7HםR��וýo>��jR
����P�����!d�u�������PK
��=�$�	�EWEB-INF/classes/hudson/plugins/rvmRubyMetrics/flog/FlogExecutor.class�X�W�N���dr�B�

G`��@!�k9%H�p4�5�6��uf6Qk+x[Ϫ�Z�(�
Z��b�@k��������}�G��!~��{��]����[^���6�
����F�(�W4����	2�
b8�`��>���~*�|@���1�H��xB�~X�Qp��
�>.�?!F���)˄�I|Z����h>+�ω���/*X%l<%�/E�e_��2�*����0���7�ᛢ���s2�-!�ʹL�!	�X�!	��vƐ��oZ�����Gs�i��z���<��LW���BƵ�d>WȚ��t&Ƈ
����c��䱜�M�a�{�H<���3}��鹜���%VQӯ����V&v[��V���9cP��z;��q��IX�\�Г��(x��7�9�>NC���s��M�Lyϴ-�EreKZ���`X�c[�E-���P�vN�y=mLSPuN�l�s5;:�:gZ�ޅ�[
R��v�>��K���4�:���[$m�M:�;ق��[Y����^^�7]oG��e|���M�ɋ1��2��$;_��s���8k����s��5�OB��A}E�a9�3'�a,����Fgt��i���F��C��qZB�L���p9u�ܖ�d��|��3�n��ą��m)U�2��q���YK�
-��?0�F�T;���K����H�p)�zj��y4�,|�fɐFqdm��5kxCS�<��{�`g��hN�t�5\AG��:y��<�ش�����F�5j&��5(�v�I�"m�~2�B*6�A����0'cF.��:FY�5�V*���^�#�T|d|W�pQ�U<�HX:�H9#t�3څ��v/�<��3��Z�vc��k7-�n��1,N�x;��Z�MO�%\��#?Ƌ*�`��	�2������xB�ȸ��:Tq97�S	����g2^V�s�B�/�+��-����+��{̊`����U�R]]ɮ�Ψ�߫��HN̢	�8�k"Y͟%,w
�I����i�^f��@�5�E�_qG���w	�^�3(10z�g��SS}�g8N!��iTXT�o`�l�n�x�w� sg�ʘU?��Y�F�_�cU�q�.�<��'*˔����Wh��Y1^묖� ��v��a��DM���cq!zv�~�j��I�����h-�|��<��/Ж�Z���p��M]�D��7�HD��a5��3j��RJq�ܙιS�Ǡc��=���j�Elw��"�JO%�k������I�g�����������Y����®��_�[b����)�O�<�^�z|�6-���'��Lfʇ�^r�_��R��h�1d�m�s�;f<�F��^��rmO�ձ��S���Y���/9���>�.\ٴ2�����w�n�|�������ն�Iܝl7�+�^b��2u��6�O����Zڀ7b+{	oB�,����wtu_B�H�-0\D�;�("�
j�[��<��?_M;=	���!�6�%X����o�!�X��bw���7sN��(;!Fo�þ�l����؅gwc{�X����v��+����)Y�o�D=��h��kr�~SJт�RD�mtNjP��A�]�R�����f����¦��"�.�tEB���E��!�j�͞�@OS�)�xG55ڴ)լQbq�TKW�Ӓᑠ�"�J�vi����im�Ѩ��a)����4Ek�����k�8|�I�����Գ��
,�C���V���"�q���X��N�Y��~�8�ՋH�2��E���_��kL��2;KPߊ�h�D�/��Q�y���ۙ��l�	u3d��ɑ��шq����D�'0��zs��'�w�%���|���/Q/UM��>��d�#��?���C8�4�3�G1B�)��4s�3��9]�w�]�N��=\��#��g���7�2f��T�xCw�I�Z��D�ڋX����AD��ҥj�4�^m����K��ޒ�jD|$%T�hC5�
���s�zT���L�/�r�P�{�
��߫�����q�{�fO0�����sX���6��q-,τH�Ƨ|_F�`�Dȣf潃���o��8:���(̼��3`�.�3d�.�3(N���x7㘟��ey��[�*u	���q���h[��u�o 6r�#���T�N���*�U�"�P��"Sq����}����V����R�?|
�#�� 5$��]�qz6�ī��
�_H(�8�����/��Q�~{iWվš��+~�	�,_��MV“��Kh�PK
��=����CWEB-INF/classes/hudson/plugins/rvmRubyMetrics/flog/FlogParser.class�W[w���iƣ!�ь
��.8��؅8NLhl��j0n��X�+i�hDp��u�{I/��Jҵ춬�c����_�;#Y60]����9{��g_���=�������5Ü�����(�U\װ����@<[
5�ȉ�|'[ëX�P@QEI��*�&v�**B���ѰW�QQSqC̮�ZW�)hh�.pSFq+*>Ұ��������
�|S��$�rj�ky�;c�[�&�]!e�-ϳ�간h��N��)UK�Y	�D�e	򘓷%�(U틍ʢ�o-���prV����skQ������D���;�l��(����{�2�X\��=���g��N!;�a�r���5!IXML,[7�l٪��Ԯ�'���1��ըӤ}�S�+�[
S
���(�Ve��i\Wh��0^*�3v�Q��B]�#�)��C��6U%d�)(	���/�Y"N��I�s-(�lW�)]��Q�.U��z+��Z��ڞ�Y��j~�&�S�հ�B����ff�E"�[��ٜ���S�j�U����R��\�vw�{���͗�|~|g�VP)�;��yk�敺hU�Ԯ���
`�ټM�<̈́b5����Js�I��Oɯ�$��7�����x�)��WrD���m_�m�d�'��k$Wnum�i�9[@I�m��qPG
i�ֱ����i�U�|W��ǘ5�8ϼ��p��u|	��H�_ǻ����~,�t���#t|ฎ$�����1�i��������:~.�~I�/�6���k�L�ꞎ_��:~��*������8����G{;��|=�X��Y�ϧ�8����㵁d��O���v*���{��h檕�ȼ�J�3�|l��<�n�L��t�S�ˤ���3�S��9�e6�D ��_�p,���� ���ܣ�hB���[V��^%�
�Ө�&�[�$��s�i"�nڜj4��9��Y�&�wg
cE˝�o4�j��)�bjIB<(U�H:��z�x�B`5�5	���3�����U���Q�8�}��K����e�DS#����M00��8̏�c���@���zD#�@M�c�OY��prҧ���q7�����t�A��:�.B��d*���
��?f!�[8��jY�8��k�)�VO7�J3���{��1yዙϡf~��t?�E�f�IC
nB1Ôd_�<�:g���&:MER�<vg2q�u���|8�����h\���GM=�2C߄���_�*��
e;�!?�����1�~�B�2��"?]�����
��y�����y��N�a���L�
Q�I�~g)E�&�s�WE�m�n�Ѻ�HN2&+�&����(%��\�[�u���-��m�C���iU�:�D=z?C4�}���uz:��v�C8ֵ���d�ʣۥ�m��'�k�=��jw�WS�տ��y�3tg�ʔ
�w�&�r,F��c�`����G���I�ؾ{8� 9OS�Tkio��m�&����I:u��	�	�w����H���uB��	�P�eL��� d��ȑ�3\hÿ���K"��\򳖹�k���`�	�A��c=���;�����1�F��P$4�ĕx�.��2h��*��A��l��ʆ�7�u��'s?�We
�H���&�������;�`���g�0��9�/�g����_f*�7�2Lޞ�Y!O��Y)�g����`X>h�4MV.���z��~�k4W.qE��v�9�S���^���D�_���|��S��l����b\���+�PK
��=.6 �VWEB-INF/classes/hudson/plugins/rvmRubyMetrics/flog/FlogProjectAction/floatingBox.jellyE�1� E�r����u�
H��@�Jnߪ�֛�_��U����vO!�u��*�4T����j#��X_�qᗧ�܄��XD���\��,9�V2���|c^srs��3��B���2��#+�a����V����{�{ǎIp�hG�c�}oPK
��=�Zſt)QWEB-INF/classes/hudson/plugins/rvmRubyMetrics/flog/FlogProjectAction/nodata.jelly�Sˎ�0��+��Z��pr�=��bl%�d�t����^��mv��:Y3CrF��Ku!�����e[�)S���;*�#S�	���!��X8�c|�I��k�u���K�{�yC�)�i���Z[l�ܦ���:7�ԅ(.߆S�F�C+N��ZS���
�胩��m�2N�
���3��5h9�t�V0bG�B��#q�$/�_�\
��/T���=�
9x���xT�a`l�jg���y?���k�`��7m2�o}�)_�{O8\-��`1��{�~AK�A{�2u���6ᇡK+M��=�@3���Gf�����l���+���?�n֋3��9&5wc�.�5�����C&4�)�C�#]]��D�>�ٌ���t��{��PK
��=�����JWEB-INF/classes/hudson/plugins/rvmRubyMetrics/flog/FlogProjectAction.class�SMo�@}k�8qCZ��KS��	�8�(P�*!��H���1�V���J�WpB��G!f'rR������ff�_���,�p��F���4�2��P�P$]��v�$�Qh���{N�H�&dt����1��O)�՞��t�x�;!�^���K��s�HND��|�;
R_��-φSg��K�pc�K��-�Ӟ��(�e0G�acyi�y��hZ��K�w��:� ��K&[K��ۊT�?�I*���f'�X������;�S~�퀇����_#��>>�C2Y������'�E�O2�p��~^��w�!v�1�i�l�¬~�J�;j��sS}�<�0Qfxz�k)�̰��M�"I��H�.s���-\��I=��	*�F��~���tX�ZZ�SVhל�P��L��VIim.wm��S�A{
��x�8,�{E��*о��JV˜��|�6�(}��������(V/�����ح���b��iyǷq'�w�PK
��={0τ��MWEB-INF/classes/hudson/plugins/rvmRubyMetrics/flog/FlogPublisher/config.jellyUPKn�0]3���.�a��U��L15	r�Z��
L��YD����7X'v�+s�E�M��hP;3�It'�aO�Oϕə����58ߝ�DK�;M}B{/����}�Ne%e����lв
:l�a0�ah�f%�*#���0yG���I:�+��gd�t�]�C��|�ٶx�KdYLW\��+8;�>��Ҽ<F�,/�z�&����@^��de�꤆e��__~PK
��=(��Y��UWEB-INF/classes/hudson/plugins/rvmRubyMetrics/flog/FlogPublisher$DescriptorImpl.class�SKo�@�6N�6���%P�A�Ѐ��S��Ъ�R�*�����lY?������NH��(��q�&=Tff���7���~��j(�"�Tq��������fp6�G�x(V�2i�	��{�<�~�suĵ�΅�lG�0,�
�k��Xb��G��;�#(��ҡ�#7Qi #���m����o��*�=����	�p�C���DI�y}��O��x�y�N��:�bX�dh�0N�C<�O�>��
i��y�j��C�v�	mi ���T��\.G��.��J�(>>�a>T�Ҁ�ԫ;��|1�T���lGs�k̩�q�}�'�k�Y�Ӭ[�0��V���"�������?/��u��mBo١��}X6�*�\Ҍ�£`��(a�d%w���$5\%M��ʊ_ө�Ք��g����$ZTf�5�R�q��y��Z���d5q������4J��}:G�)��&6r}������+�PK
��=��=خ4FWEB-INF/classes/hudson/plugins/rvmRubyMetrics/flog/FlogPublisher.class�W�C��:I�m�We;�<ڀ0R�:i,�[�qC����I}Hgq��So�t{6i���i�$Ŵi��6�{�/m?�;IH ����~�{����?`?�C3Q������[��b�m2�C31���w��#xO���m��>��!q�aq�q�Q�a3>.�?фO�S2>C32>�v�4�Q|�	��cMx��/�bv�	_�e|E�|U0|M��ch�7�i�J.�V���o���uG5'k�ײ��
���45���:��HXk��m-�s]�[�'�i5m�f>=�ں��)��j�ҍg��Ǝ������?���L/��Nڞ���gNh$�:��O�g�7tgB����K��.����6�.��6&!t��i��6�M�k��:nh�.VV5�T[��fȝ�i��U[FS�Þ��Sژ���m�����eR`�߲��ք�]�Ҏ��NU]�������'�����������rA��[����ֲ�S�����@5�x���,��������D���jt~g�	��bKŽ�J�%�6,�!�K2���H�����ދZ��j��iݶ�)�t�]YB�9M�:$�>l����ժ�<�ڐ�N�(lXs<�uD��8{�n�O��+>�Ε��RX�S�,��1$$\�U}�>���F�L���e<ՕL&�P�պ�F��Y
�P=��i9�����<�sM��"c��Z�rߕq�p��ySu=�F
-��U��̉���ym��uv0=f�"\$dV'N0-Hkd|�3{�qs��{�m�5�{��U�}�f�A��i�N�?P>Y��{)B����Kv��U���$��R.�u�+������(	;� a���=��>ՍlY�k-TG	{[+���\p�Tq��������b��	���.��F|�+k�
�VQ�c#�gg� �ZjJhJą�{0��^��I|O��b؟���=خ��� �b��Pȸ��)<��\SPĬ�{F4m�Iڄ�$X�媆��R�^��V9���MOu�ާ���q]�<~��_�#5 ���e��TJƏ<�C
~���?U0�7��X��/������2�W�K�JBǪ^�M'��_+x���[���e�A��'�_���y\�U5/Nw��Hz�?��b�\靫s\��ow�U
�"��[l=%ܹZ	�˳�ӽj��y��}&K���sW�o������
��w'���c��u	w�k����n���D����:=a�|2���L<['���JiY�߸�T�h�uG@�W���'{I�P�D�hB�U��;��v�^R�3�A��`G�;�[���o-7�����U��}U�~��ʠ#c�_1�&U�q?Q�4��㳚k�����U��mI_|fE�D���o�����Z�]+������-�88�ozhm���L~;6��qC�xnu֐�4�ԅ��!���Z���-�3�]t�h���?t%;����q��a��1����F���H��]U�ʾ��}]Gt�v$�3���z�6l��B������p��ǝc,�8�d��"eǎ�,�d�54$�Ϡ�ylCk�@L�.��%��XD��dh@�/<��m��D�c��Ζ@(��a��	cXU8s|
G	���W���(ql��T�=�H% (��pGi;���I�9���YD3���"b��"�2�xh_�1.ByJ���em�.w�a=#���
���>9Z�ؘ���qy�2�yl>���bK&�ӭ��^ր���>�����m%I4�����)�q'?���(�?ǕA��m�W2ыc�
M�������#
�2�	r3�	�-8�A��ǩ�~C��ml�F��sX�0FΓg
��!�?M�3>�
8���A�c�Ć���#ܟ�G��n��v�;2�}s�M�v�{���9�.�1�YB�sؕ	w��s�-{�l�����Wd��芇���"����Е
��}��{.,��=Ǜ䉒�q���9���A">��0ñ���'R����d�I�r�S��n &���Y�;�4���S������z5Ȧ�R6E��z�}m
B��*;���LC��'+a.v,�%�ؔ���J�z
�ũrU��J�Ns7e�K��B��ɷ<L�����M���x�xɫ~J.�x�$�b/b��N40R4�'�Qd��PK
��=�iU78HWEB-INF/classes/hudson/plugins/rvmRubyMetrics/flog/FlogPublisher.staplerSOMQp,MW0�P02�21�2�TQ0204�J��+.)*M.�/�-Jr�,J13S��PK
��=�R�;��OWEB-INF/classes/hudson/plugins/rvmRubyMetrics/flog/model/FlogBuildResults.class��YOQ��n�J�A��(�eQP�XE��Ã�i;C�Kf!�KM ����P�sg�۴>H�eιg�Y��s����2�"�rO"�r���
��F���X�J����[��F�6f͔4V`I�.)2C�D��}ٰ4�`�9��%�2UMܕ�9��T%��i��R���x`�jU��Ze�V뚥�UC��+�V�bW��%C<�j�X��eM,�[h���WpS��f����1��i'�I��o�JQ���F��N�$iG����*��Gxm�Z�9à"��&��@E(��d�E��H:��7v�b�g�D�3�7�
���)�_��cR��5�^�&�����R�K�֛}7�߄�`XW�t�7�P����A��Kr��c�+�%>��Q��Lڼ�H�)10�����1�y�ᕀ,
X�"����os�+��%�a���I�u��k�W�l�F2�!J�.\L��4Do��2�@��`["�[��� ����)��F6�m�e`���_�����O#�aL�'8�qw�2�Cʭ%���K>�
�Бh%���&�&?�$��&��x��}�S�ƌ[�Y���y���8�Nؕ�\ N%�9����H���y��sϩPU�u~�B>��.\b��0���m�	�b,�$�G��CL:EZC��F�n�B�QH�n�m[@4{LW3S�B�{��dg:�m��ڂb]�_0��g���`�.���x��?PK
��=CoKE�NWEB-INF/classes/hudson/plugins/rvmRubyMetrics/flog/model/FlogFileResults.class�T[S�P�Ni�R.��J�"�!E�(Z.��o��%L�t���)�GfDDg��Q�{�Ж��eϞ����������	l�hä��"B�lB+�x�G�{��T3�`��473�<0+Bœ�g�"��[f��V�CKAs��ܦ��ah���RruC�莛fh����l:�V�y&�W�9���R^7�>(l�vW5�ֳ���J��i��L�j5Yz���3�����	�Pͼ�E�f>]�w���Ж�Mm�T���muנHG�ʪƎj�|��N����B�uC;+��BJ�5w��x	�^����Ekw�;��\��yE�g���=~Ś8Y���U��WA�Q;��R}1�m�H3�Z�YuaS-�'k��n�~n�O�!!�#)0�N�-�dg5>]5#2ε�Ѓ�Ԉ���rq%t�K���E,IhGLBb�%��K	+x%�52V�F�z��JXG/��e����2��Z���|�$��bQ�-�t_����Ш5�}����~M��T(��+�Î�Q�6+d�%<uE�Ofh�j2���F��ĸ��Ÿ洆x7@0��@~z�QĤ�Z��'`ɟ�;A�1���wD�M�y�p�e���#B�a4#��5��c�:�k�
b�^y!��y�
�H�+�_�Q/�%�@�_a�b71�l��Y��}�I�QD/�M�q)�*�
d�Uf�xY����h �b�"�RS�h�mE���D���\���&��[��2G<E�'r�ߋ4
�S4��Rj�Z*t�^��� �*��2��T����@��ȫ��~�Q~���\�,�&�^�|�;5�PK
��=t��PWEB-INF/classes/hudson/plugins/rvmRubyMetrics/flog/model/FlogMethodResults.class�SkOA=���v��
��
�YQ��/&
���`�8m���v��	�J	>�?�xgwY�%��e�Ι{�=����??~XE-�,$,f�B��Rɠ�%-��y+P$���ʐ0y_e(��c��Ԕ�k�VcH:˦KVg�Y��e7U�3\����suC���O�t��'j֮�n��_A����Q��uSww����M���B�n��~[�?���du�q�m]�C0�t����e*��t�Q��~�k��D�q�C�Ҕ>B�Fp�ꆣ�̢���aC
�ʈ%���Qtn�P,5�/^�J�G>\��Q��A�����L���Z�iiĚ�!c/Ɏˆ���QSyd���J�^�GN�:6$l�x�-��ۿC�r�F�H��#74�2ඣ���>�
}��17<�q�0Sƈgc�|����7�V�j�He��_
�Q�QT��v��
?�@��IL�Z"�3U�i����U"���3$�KgHV��!u��/�Kk	IZ�D�&r�cx@���8 �4f?B��S��>e��
��]���/Q��|B9H	���=ģ��=�1Q%�&N��K�G����3���HZ��
O�.��\zB��ȣf�Q^H]"O�|G:������ɒ�+V�~�Ȋ|d�3�z�/PK
��=&�����	>WEB-INF/classes/hudson/plugins/rvmRubyMetrics/HtmlParser.class�V[{E~'�d�%��9��������hZj��T��6]����	-���/����<^z�����4�z�ٙ�~�����o����N`��Hǒ�.,�X6�DI�=+Ҹo@��j)+�'J�S��Z>7Џ/t��/
|��40��C���KǺ��@O)?]�]-�o�.��g��̇f�1�ZnY��[�8<㹁4]�b:M+�
�C�[m�4lE(u����˫�Ri�E�J �{���kє��y�����Sڱi��/p��Ѭ���{U��M7m�Zlq)��a���)З}��Ȋ�6CB(ڮ�Ь�Y~�\s,�W1�ӷչE���>s�p�5�
r��Rs�Ѽ�<T��YwM?��5K*��Ȟ���hJf�2�S#q�L�JB`(VE l
m3#���-C���f��"���L�DU��x[`���n�Vu)�PFs�cv�b5�͢�`��d��X� ���r�J��i�6���{���:[�y+Y[2/�]��nJ��)�*�T!6�i��8�r�0�UkK@�
���Q�ʬ$�Wq.Y
ϗ�&�~h+�ɑf-ȕ��R`�e��W,՜lɽ.���`npQ`0��1Wj[%���1��fC-_g�#�@���Cp�b�`SIl�g�e�����n;��3�s!�!�T�0}�������e��D
�k��k�
�$eT����EQ*
EGJw۳ p..��~�TWV�0{S�AE=����y��<*jZMm1��l����̳8qs�,H/:�r
,��S�/
t[�U�\��V8Ч���4V)�#�[��9�[p%���o�ǨBz�.���;�0��x�?�WyJ���u�Os��|��s��|�8I�kxY~��`��Os�I�k��@�����/��8����7�^��e����4.!�;e��.�N�6���S��*�@��E�<����.��.��t�Ԇ�m*O&�@fb8���O��5���O� N���󑿀>�p��'�-r����6�)�����z
o�J_(}���eR��;;J�$Ӕ��J
�]Z�B�ǯ
�w=�w~|lGƟ���e����t����T�Pz�^X�4����<5�9��:�[��HI~'�Nn��I�ˁImbX��`yC;8�Ǻ0�uQ�)��A�10�c�etg�F��mÙ�,�-��mܡv��,���ec}H��i(b�R{PB_w�PK
��=�+��6�AWEB-INF/classes/hudson/plugins/rvmRubyMetrics/HtmlPublisher.class�V[wU�N�v�a*�Pza�iz���Dii�����h��$9M�Nf���Իx�<�����e-}��/r���$MҴ�җs��ٗ�|�2��_�>p
��8����L1+coȸ��}xoI�Ȑ0ǂ��,�%o#G.�ea�"�+q�#�]�
GW�ɵ8ދ�}�� �C|�&!/���p�m9�E�a��\�6�����t�st�t����n��y�����،U��3���J�;�Z����*h����st�ʺ�0�)�E�2Ӷ�t�M;����Z���/yc���[��TJ��n�:�m��M�5�G^B�i�f9|Is\
ϓ��Bm�/�]��
޴�ų���z�$a<�J��7�
�ݫ�7���Е�G�
�7"�;4��3���"��d�

C�gYF�L_�cJ�嬻�V �@-��ZҼ��f��uNP��)X��J��4����7'uˮ%V���R��d+��,p��-ӕ@9�dj��Wb��/9�TL3��ݻ.vq?������c��s����LM1)T���)����$��@�u	�
T$�
,��D�D)�$uSs�Ou�B���o���nۤJ1n�4{�Zu��P�bD�>6�D#x„�GJ���
6qS�>��O��)	�(��)�%_�K�ӑ�Z�^�,g��i��͢�¯W檭yD���0t���pK��
���4jn�~Q׈�&?c�b�0L�]�o�Y���m��M��Nj�.`8�T,Y�� �Vfffs9��L*��݋��*������]�nc���N��(�7|͠n�OfZ��3�{�a3V�$��|�j^�r��V�F�m.�0�lӜ;��2�ҳ�#b��kb�O���暾T=�p�*��Z��69
Q���C��p��-O�]+�.(�P�� w�
�Qw�%w�mҜ�e�]o�t�7k?㤹��,���.��d�j>�k�n0,��d+��bF|�;�|�Y;N?*G跈`�yGR�d���4����H�	Z��C'�5P��x&p�,Fv���{-��ǐ�(:�1�E�q:{t�cUĪ躍��_�������%����ܷ��*�*zbw�u����됿ީ��.��p}}?�����85v���O��G.B�ôU!�<
�.&�����ߑ����V��m��]�Sg����z���j�~M���l�R�)6ea����عC��H�I�޲!7oBJa,���1ALi��v�s�3F�7)�ibv�����E�"�z>���Iz%��)�
�w��^�y�DzWi�������OP�P�5Q��v4ND��p���z ]�PK
��=!���aWEB-INF/classes/hudson/plugins/rvmRubyMetrics/railsNotes/model/RailsNotesMetrics$COMPARATOR.class�SMO�@}�8q�(��
�|C�A�i�J	�B���&Y#�Fk�����^��JU�QUgPҞ҃gfgf߬������}��`C�s)lа�Ķ����Q�Q�QbHخ2$
�S�d��Ŧ��p���{y��^�;�\��;����3�v�]�S�;f�u��;��Zͳp�{�u�C�-y9ꄽO-H�OGn;���Qi��\;┭�*��F\R�υ����#����f~,��a��<��r�;�ڽs�������=ՙ���Г2'���A��r���c�#Ry�Ƀ���'^(�⭭�du&gW�6q&����n �B�(���/M��bx=�L� �p�g�!7�(���(eHEЖ!�5��%
�m�x���t��1�dl��f@��f'Hg$�t�H3��+��dh�K29�X$iN��=�L�_~�$���C�P#q��2+s��/S��#�ɭQY�a���,-W�*�*G����O�*�O�og����8�g�,��O��ϰ�u,�6('MHK�PK
��=�^�\SVVWEB-INF/classes/hudson/plugins/rvmRubyMetrics/railsNotes/model/RailsNotesMetrics.class�U[S�F�˖�e��I�&���ƥ	IS���F�6�R�¨�Ybta���Bf�L;<�Guzv�zL��3{|.�Ξ=+}���?����e�P�
?���O|y�"���?�X��5�x���k�򔣋
f�\W0��/2~�QbPze+_��*�Vr�+؆�>�Tן�O���}�u��vز?�����ˊxV�Tò�M70�l��7�l�k�Br���"��o�K���W�k����Ca�*(G���̕$�
�b.[����L�n��d���C#]>0���m8�l��N+��
�4��Y�2��mr_'�~�r�`�aꂒJ����ug�f�#=�Ks�x����?ٓ���i����2��7=���HYi����˷c�(՚zMs�⍘ꋹ�I5\�ㆆg�`X�,���(k�i
�й�u삶h�7eli�
U5
ul��k��0×YL3����e+�����:ԥ�t��,��P'�{D\��EC|�F|Đ���Cze~_w2;�0��l��4[	�/[~�0���/1�"<,�Ǻ����o��Wp2}A�����&�)�M�$g"9�����H`�n�v�$���8C�4��D$��i
��ekr��)�g�8`�`�V��y|-�4�vR������!�WIrx�=)ddx�Xq�Tͷ�jt��\x��q�G �;i�[�,�R"����;�=W'C�G�F[M�B=%�����͎�T��*U�#�%��΅?���v�R�wz�a��HB�X\(㉿I��`��#�`��?�x�
���t�$SG��N[~�=!��AsB�S�PK
��=�.Q'�ckWEB-INF/classes/hudson/plugins/rvmRubyMetrics/railsNotes/model/RailsNotesResults$SortLabelsComparator.class�T[OA�f[��ݖr�xG�R���mE�jҸBBド�2�%�]����[b|�G�l+��	1�Μ�w�3s�����Y<�"�B
n	iZ��fccN,��rG�����x 㡌GS�q�eHi[�����a���zE�h�hX��;�!��.�tS�j�s�Q�����i���%m��pmK�6��a����\�k{/9����.�wզ��Mu�а�]��\�V2,Ûgx�==]�����e3h�ŗ�f�;kz�$ːf�us]w���aq9����xZP�����ݳ�bY�)���rB�>��3��PU�u�4ҝG��{����J\_���b�cz-Sɞ���	�\�Jm�׽b�% ڝ�$j���R�N�	�uT�1V�}�Ο�"��N� CV0���$��*��ܑQR���D�,�L��
�qM�S�������(��C(+���j�am�ݕ��}�$z�V����M�`�ZOU����5[��@��i+A5�ӣƐ�D͢&���'O�`*%�Gr�l#%[�����h��r�!�
�}��hM�aD)(Iac��)�Bp��@�L��+$��-� YZɯ���M�H���V�9��7�O�⌄ψ�(_ �� Z�"����[ч�'�w=�O C��Z$̍v���D.��}�u��'�����@�$Q�օ���<.�#L�q�PK
��="��m;VWEB-INF/classes/hudson/plugins/rvmRubyMetrics/railsNotes/model/RailsNotesResults.class�W[wW�F�4�4�؉�8��C�Ė��44Vp��	1�j'N݆6cibM"��h��ʭ��
��{��rk��1^��?���
�o�ɒ-��B���e�}��;��[����.��V}(���Њ��Gğu��C!'���؇OI�&P�'�\�P�1G��z.�x^��\��i�|F&�#/$�9|^�/��	|	/�xQǗ���Kb�eY���W��W�y5������ůo�xM�75�(�ވ9m�C��9�5����v�*��U֠�Z�k�8�6r՜73�.fF͹���	{�1��kix�q��?-��Lf����Z�B%_.9��be�v�w~v�2�0��qM�X+yV93[�[��xM�d�v<k�r���ceFf��4l�;y�.{��^#j���*�\��о~��'l�5���Nj�O��v�����7���l.�����2�a�`ӷG�{ƭr���H|���Zf�riqwOo]pC�b��yv�����ԩU������~O�-�ƴa
!��P��c�h:a]��B�j�c�+No����|���<S��ȃ��ӄ뛆D�7��b�1s�øY;\Õ�ϓ�$�y[��ր��v�I�=K%I�i�s��o/���sZ^�h5yE�����d��J,�ru���zU���Z幒S慼�����RM�ހϯ�����V^ٹ ��z֘t[˫*�&/O�M|�Tqs�[�AǺ�yX6�&�Wc;k���ad4�X]8��T	G�]��ùf�e�E�br�Ç��[���
|�5�=�t�a�M�|�7�{޵,�[���"N�0�����c
[��O�S9⤁�ᦎ��~i�WX4�k���7��}i���"��췆D�[i~g�x���S2�	�m,��d`±��8ƌ�����L��^���2�ܿ�t��l�S,�*Y�����$Ƽ��i
[�p-Wr<��5$���-�pϰ���>n�j�׋h`F�|�Y���c��M�Ŋ?��E�>��SW��K���1�yO"�aGM�A���5kA��ƲDQ��(�=����������ӼN�ZL�u|���;�j���~����D� �u��C���q�TS��?�αN��=�����%h�����ra#FoCG`ێ0[��l�V�vd�D��	|���A��1�.�(��
b4�:��_F"���1��;�r,��w{���H_g���/���{�컥���(S]�"�Ϗ�p�&�?Α�1�Ct���'T���b��c8M+{q?�p$adwc��1����A(���5��h�>b�$O�Q�f����5��L��o�n��
�w��w�����&���M��'�G�N};�Z��s�e�Wf�}I`�#��`�XZ�Ӂ`��_��~���a$��e=D������,#�b�,�F���DJ0��V��a�r��W�ɘ�a�6(�\$��F44et�<������}�� �A��S��,dR�i��x���|#k��Uc��2���ѩa{4���kf��h>�˸O��� �(�����W�ͮ��*��]�wcUGI�s�u�g�zR�|qR�-���ހ��p0�j;��S�:��򔜡���wAA�l%	\5J/bR%�*྾��=Q#�E�����v���tM���K�?"�з����>@'0*���u����4vE���o�C�;����H]"I���&���wW8+(��ҟ�|�Sx��@ZE+��D���_�'G�3�;����Y��D�rMK���I�4rABԄ���{����JX�Kw�Z���
6R[."�껍���W�y�yNY��jo&�r3?\���K�
1�C1���S��PK
��= 6��fZWEB-INF/classes/hudson/plugins/rvmRubyMetrics/railsNotes/RailsNotesBuildAction/index.jelly�T�n�0<K_��j�z$=�X��-ѥH�%B�/��,��wvfwgM��VW�^F.tum`�V*
�MF�!�*'��w����7qvF�,�X��ŴI�vZ�,�$�"՘1�����&n{&4R�x���5���k�C��W���A��cFʖ�rH��Ӄ��Z���M�D�mGs�^�9�gA�
���ut"��C�i,�'	_%e�W��!�!�I���a\P�(:Iej�H��M�k�.�)�x��3�V���܀O
���T)j6�@����"��3����OO�e��jC���#�߃r�����G7�!�@I�E�vX᜺����j�W���u2��i}�9�w��.M��iL��5*n52�q
o7�ƛT�Kf7(̝%s0g�-������ǎb.:���u�9+�z�C�lg�ش�	�T�Z&q�s�"�!�����7X�j�߯f�J[-�E���yy;Z���f��zq�'Q�f�ܳ%C:/��ݭ�w��7���N���kty3� \z����/PK
��=���[��TWEB-INF/classes/hudson/plugins/rvmRubyMetrics/railsNotes/RailsNotesBuildAction.class�W�SU�m^�-��)XbA
���HxYlJ�ԛd	K7����ߝ��:Sa�3N?���%빻!$4�Z���s�=�w��ܻ����n��˜o�U,��wD,��W�EZD�o-��|+�:�,V�X�:�l��&�|+b���D|@7�s��$�%�?�`DC6+�e
�I�T
����j��hf��+e+��%�2�<M���ݒ�xI/�j<[[�:	���)֔=�s�S9�2Xޚ�(j!qqU#<��)�#�hr�R���˩�J�y�n0C�����Q�����}�ն:��]#'��cM6�rQ@_��K"-䒱�ɶ�*E�Y���V���/'���leO�a.:r��N�s�YV�A��ș��e{,�2�_%(��pt����Ņ��Ve�G��T,E�7��Țe�8�ҢFI�U�i��O��Ֆ]b�a���\�0U��h��tRe9Y�m���5��֗v����a��N�p3nB费f��n����-��n0�v�fN$�<OU�D]F5K.��ﷰ3�j�K88�v�7��[-k�<��%y9�������#//(��_k�Jnr���p
��)M���=3�e"!�S�	�|w8^^DA��mE��F��E�HP�+�%�e	�@'��I
J0�V�i$t	_��hf%T0&a�%�N��Ś��`]�$[Ýtܺ�������(��yj}�O���􇮓VZ�!z��Z��F���%U�YZJ4��<~���Vk`�떡WW�y��̌�o��G��fOo��ܮ��j�sL�Љ�yW�L�-�9��
�h�l���Y�Tf�h�Y��v��R
-%�_o��e��;�
��b��3Q>��6\�N�<�n���#��_��nҷ��
��� B���N�7���I���
\x�h��2���z�h�D� F_�8N#��ƞ���f�Z�9R�VU	�XUx�*��ϊ�׉�k��MD=gE��zp�L�c%��L�5�9��G���b��?�����gh;B`�3v���cH&�a�1��	qN�x��I�h�w�N>��T�S݇�	{���_��{���'/}Z��
zb�"��vRL�(�C��p��0a�q�L]�4O�Cro�#ܦ`a��Oɕ�3��4����HP:�4����O�um���/j\����8E�3Mb���X�nk�ƿs��.;�)���.���PK
��=�LR��OWEB-INF/classes/hudson/plugins/rvmRubyMetrics/railsNotes/RailsNotesParser.class�W�sE�M2��L&$,$����E�
"K��2� d�Nv����2GHE���BQ�x ~��B���*��/��ҿD|=�		L,�ݪ��ݯ��{�����,�95�.c�eTc���e����.��-�GF�2���9)£P��+Bq>0	{9o��4N���~>�2�0$�d��B�y�/v�a�	��`�1��\� ����9m�qa���!><!�I	���i�f���� 6��L@I�f�6'����j�N+��TLջUS��ܢh'4K@cK‰[)�!�;��a5��N�o��٦����V[�fVC�8١�3�9%�@�%e�7�Ȁ��X$�
�ñ5����펝vl���l��q�I�OP��,G�-��K�"�ߔnݡ�}�ڠ�F���XT�t�;T�f�! ���Zb�~6ؐ���gyl�u�9�&���H@S��3��	��E|N	ų�:��Mf�Sρ�p�*���3(`F���n�l�X�R��b����̈́�j�L3'0��r�uղ7k��'W�Pz�:j<u��ެ�$0�g
�R�%S��Q�p6rgI�۟��,��
�vLv5�o�Po�S*w�3Ʋ0�][�K����𔂧qD�2���vs�ҭG.�U��
�u�b����V�Jt1[�1��9n��
��.�/�%��W���:A~�
�	o*xo+x�*8�����>P�!>S=��FG�㌧՞��hME��'jE㽵�^�|��T0�^	�(��|��%�V��e_*8��(~=Q3j���*��(�g|�����e<���}\�7q1R]ة�2����@+�k$������ҫ���:D�V�f��š�G�6OJR�F2�S���^;�6~	�����������j��A��)
w2������W�aV�j,��d��É0� ䷤Y��i{���>R�%T3B��Psu��"��-tZN��Py���3D�^�9R;���h7���HC��43�ԩ=;���8��'�O�pN�w���l�RR�)P��O6�]�Ì�8ߚ=�eS�<q�Ɲ,U��a�l���f�U;=l�}`y�Z�nϽy���&K�j�Et]�/Sn (no�ǯ�2V�<y��
�5��'B���z�5Г.gԌ@���<,���.��6�dp/����eX�;|q�ѳ��6����]#`�+�<˔��X���%�Cv���w����6��@j�����(�k����bP�" \(����&P�8Ω?�4,���G�|�W�J��(�8�2"��L1�AY�7���(���K�
�W�erY�)4�e�p�E�"cf��,��nz�А���V�
6?���V�q��(<*�W2�WX!������҉�4��g�,�w6� �E4�c.�3���-��o���MQ	��iV�,B�H1����3��F� D��S㣄�Y��k���Z��Q��$��H�!tP����ъ���I�1l@�z3!?����ŏ߱M�����|���L�D�����c)N�A:�ö\��\-�\�ĕ��h����3��;����Q�+m[}.���#)���@q���*;���U(E��	���W�ѫ��4���F��WIk�U�����f:G�;q��N�%������S7�:3��Bkn�?Dk�.�PK
��=��G�bWEB-INF/classes/hudson/plugins/rvmRubyMetrics/railsNotes/RailsNotesProjectAction/floatingBox.jellyE�1�0й9E����G���]�A������Ki��}[�\fp�\G�d�R}[�br�D��v�r�e��7��
vÙ������5w�1/�S=�1[jq���}���2�s�=�Вfۓ��Gĥ��h9�����Ju�yG�$��
@rG7�+Q���xPK
��=��Z��]WEB-INF/classes/hudson/plugins/rvmRubyMetrics/railsNotes/RailsNotesProjectAction/nodata.jellye��n� E�~!�V�D��v�?}�3����^��״���sgh&=9�]��HO�<����d�/�t�2�[7���c+�^!�qeY�k�6��Z��

Eb�ewd�g��$�L�9��:�@*m����/��7�F��e�D��S�;�:�J������j��yȧ����J���ZI޺����T��g���a�o�kBd`��� `�УkT��J��]ը�i]�PK
��=�]DVWEB-INF/classes/hudson/plugins/rvmRubyMetrics/railsNotes/RailsNotesProjectAction.class�SMo�@}�'1�M��|��!���ŕF�i�PSz��Ʊ܍�Z�+�_�	�?��;Nꄒ �Cv��̛73럿�����xR�NO��ͣ�����PM��~�2ꇾg��횭^�$���lK\0h��bXk��DÞ-�y�%��-�^p)�{
j�R�'��ᅦ��E��;[Iaѕ7��ͳ��VmYJ��C>;�e2l�j=�o-�q~�8���O�5���B]�z=*v��qI��|�x諎�ވ0p��Ç�����+n��s�.���6(�t�1U�d��<�UTg2���z�	}�K��\2�Il~�F׏�e��F��2�q��(��jy��x���|I����C�?֚���b��e�A
w��X�8r(���9:���7��d���#A�U�]���Q(�^¢ck�T��O}�U��a��M�aI��t��J%�eZLO�RR�4v���3HL�p���y��?�ix��)�qJ�U�ͳmfش?ش�-�v���s�7PK
��=ݟm4i�YWEB-INF/classes/hudson/plugins/rvmRubyMetrics/railsNotes/RailsNotesPublisher/config.jellyu�OO�0���SXRA�[�N q�IpN[w˖&��Uhߝ��`�C*���=5ۦ[Ժ�c��K���˴��bl:����^#MB5�+��9�s�hU$Zv�e1��d�M[9k&S=vkK�X����
S�Xc.�o��l�VLʬT�JR{V��
PP]�[_ �C��0^��I��ct���f�[oD���
j�
H��L�Z�z0�k�jUo�;h�<����O���ȅ=���G�W�X���]'�~}.n?��A�/ԓ�$̻ɒ1�����!��9��B�v�",�R�+��KU{��Ȯs�ٞ�9rő�^��γ��}���O�_�DrAsI=���gY2�ˋ�PK
��=��ݜ%�aWEB-INF/classes/hudson/plugins/rvmRubyMetrics/railsNotes/RailsNotesPublisher$DescriptorImpl.class�S]oA��"Ej)ֶ~m�@��h����T�FJ������2��ُ��6�?��O&>��Q�;˖���M�޹���w�����'��m��!9����-�$�mp��&�t��#�i}F`��}։<��3���ځKE�Jn�I1��\(0�J�@y� P8�}&[�*Ű�F}�v(���-Ͻ��3-��Kʅ��)�t��D��j���u�:��ӇL���\��G�ڂ�����AEp
:�Pq���Ppw2{�z��Z�}"`��l"`�F���u�8�z�xq��:*�}GiI]}"�su��jw�|�SIػ1��
f��HS�Y��#.�]��K�fS_��� �.�8�:�]3��_v�l�I�'�M�j��z®�z��]�,�&��?�'���Xz�S��\�-��)��B
3���2���y
��cx��=X��0�a\�H�>,%/1�^���:�g�һ+��Z�C��R�s��PF����L��|���V�\�t��`��é���b���1���8>�b�A�܃�?PK
��=9��R�RWEB-INF/classes/hudson/plugins/rvmRubyMetrics/railsNotes/RailsNotesPublisher.class�VkS�F=kl�y�64@��jc�CM۴;n�IZ�yԦP���h��,��*��~N��������N�J�
\�f���sϞ{�������N<Vq9�*:���%OT��Tŷ���x�`E��B����mM���^�l(���wIw+�Q��\���e�ҝ��]Wwԥ'�|qycs�ȰZ��v]���W5,Ws^֊^�ժ.�BCn��-tW+6�
�l��L�\*���!�����%�LnU��Y��3S[Ѽ��3�K_�je���e�f
v��[�1�8���=���^I7	UB*�J�(�<:|_߶�}.�Pѳ�Qӷ� -9˲�m��T�v�ھ��z���
^7uG[�/ڞ��'�p�
%���˞a��*җ���}+��=���=<a���uO�=A��k�F�5›Z�L��"%���������%1�nGO�[玫S.җʿ�L4����)(o��	�؊�T��T>�����f��ɢ{Uo�h��dR�,�v���Ņ�|��v�'�;�_�ņc��+�Q;�g;���ԩ׍(�z`�Ӟ�a�- �|��� �s��PX�>�0�l"w�]��BI��ܲ�eN"Z�_jI�Rt��3S1�V֑��WK��T�,�[g4�9�C�$Yr6�AP{���)��(a�B�ZUK�l%���$�?�a�����'yN�C�L�!�V��[�
���
�}7�<���_��u��,�wH�_��O]G�� {_}��+������:_~����+�I��:\|�o�z9�]����ma���n�/}�e)�'{!�[4ZA��������;D�

"�FE�~���a�F Fp��-�dEЏ�3�qL���N�8=�G��9Dtmv�����;3C�C(��t�BW�RC��a1����	��Z�SܣK���M=IL���DE�k��)��#��I�z0�Y�#d������}��_����[�����!�_7��}�i_�`:��/�޷�3_�,�5Y��E�h$1�?�x�܀����pDC��c�?Giz#9��#�:@�i��c$���<
�'|�@�zi���D�MX5
���O�
>�˃ꕪkC�PK
��=t��DDTWEB-INF/classes/hudson/plugins/rvmRubyMetrics/railsNotes/RailsNotesPublisher.staplerSOMQp,MW0�P02�21�2�TQ0204�J��+.)*M.�/�-*M�.)��K�)J�N
�/��]2��PK
��=Pͷ���XWEB-INF/classes/hudson/plugins/rvmRubyMetrics/railsStats/model/RailsStatsMetrics$1.class�S]kQ=ww�M��n[mc�Ru͇�K�A1�P�4Д����.�-7�e?����*�����ĹkH��S�ef�0sf8w��������֫��V�覂&n)���mwL�e�soE�{���AG��G"J�d:9ȇ�{a�� 2d<K�I��=�'f%��.C�/E$�Wz�u�`���a�+�p?���%eV����O�³��c���)�$�F�~<��e�I�8y�`
�<����.,�X5�N��8ш��80q��}�6,\��u
46�=�FK�=D������@��y��B ��^�6��(
���i�h�bzx����Nb(O��}��:�^��4׻�6i�?��8	D�eq t1zK4��l��V銙SS�"�ظJ���)�;�a}��Y}�WF�#���	��$X.�'j��:�QB���N��'xJ^��z�-���_�
��<z6�t��Ո�y��-ե��ڄ��oPK
��=ϸ3�aWEB-INF/classes/hudson/plugins/rvmRubyMetrics/railsStats/model/RailsStatsMetrics$COMPARATOR.class�SMo�@}�qb��R�|�Ph��[��*B$��	AIT�q��RW�]��
~��T	q�G!f��8��gfgf߬������}��aK�<5�a[�g:��bGGQGIG�!s`��<dHK��7�-�o��@�}>pȳ���9澭α3-O�ht����z��e0��+��Ã@P��:	G��ZgN8����'�p�-�o��m'�I.kB��{�S���k�Л�q��.&��%G(54o��ur,��a��:���r�;�:�S1��EOT����BLE�I��=v�[ο0Ci;V#"�K�?H��T��y�?ol5&�9����0V��t��DU}abë�o2���G�q
�2���R��XȎ?~�fԸt���-s�#��w=&���-Z��Q��i�d�NiFz�|��
7If"g�$�Y
�E�)���&8`�;��)RH+�:3�X�2�X�7g�bDe��N�]��B��܋�Q��ϗ+?���7�>\�����(���4�?�n>��Hob��A9YBZA�PK
��=#�\�=�VWEB-INF/classes/hudson/plugins/rvmRubyMetrics/railsStats/model/RailsStatsMetrics.class�VkSg~���&,�F�z�5@%���PF��`(��)�tIVX�l��
Jmk����N?`�	�N;~���7K��t��9{���<缗����@~#���cZ�y�FЅ�X�������aq��,ތ`o��#h�y6
~��o7�+X`��[2�fmE��E�$y���(�c�*8��Sp�uY�Y�K
�YߖqGƲHPӶm8)Kw]Õ�H*;>1292���МI_�$\�,�n�N���i�Igiq�<�<nx��'S7-W�t�M.�����.��lJ��ʌh'��G��d/�[`|6�`���8�ǧG2��#5�$pCK�U6\	���'�0��)	�2�m\+/�Δ>gш,��7%L'2��%=i�|R�@{~��I`�2żnM�ɐ>n��
�ۆI����]��рR�k�������y[��e
$x�����<A���=��F�c�^�����j-��D�Kl�(������$H�۾a�N�(yf�&e��N�p�4
�-����1vyqh�m�@��Xv��e�ܱͧ�AU��^�]�'ax��*��\T��YaL��,�`L��*>����[�bٴ�E?��S|��s��_���x������
C�HKѠ�*�oU|��e���G��J�JW��,ΰ8ˢ�$�m^	�7vڑx���;N��J�[E�غ��s���G�޿�{q��I�\(�]�k�M/�0���5�q�o|3�c�q�7��,4����N��u�v�W\?Jѭd�z�L�6��Ku�����t$�醇�B��J�!!��킄�
o���g��=�8}�1J��7F,"?� �\/��Vr�q�e���ӥK�Xbf���YD�
����մ����
2�����E_vyx�w�t��O�������ut?���!���@V'i��T U����w�dH̅ȟ���ߏ&1ڲ��54?B��6\ ������<�P���Q	�=W�_�����c�8����%�7Jc�1�q|6�V���(=������89�W�W�����;�,�	�m�E���c����7��?K���Op�*��C��V��V���hO��k�t�W���{DG-���0��7:k|��`�&�2XlO������?����g�j}��)#�(G4��C9ְw%#���6���~�6Ѿ#4r���Y��'�q���W�5d}���a��w��M�m����˞��I~����݇�b�x�	�pPG�q�Y��x6$��0���8.��0�Пd*8���r�tj�Pq-'Wp\�)$����Bm�d�1D=�m�W0)���D�h�娂��{�PK
��=\�+�ikWEB-INF/classes/hudson/plugins/rvmRubyMetrics/railsStats/model/RailsStatsResults$SortLabelsComparator.class�T[OA�f[Y�nK�U�#V)me�"P5i\%����m;�%�]���/���e<��@/$&�4;s�ߙ������9<� �|
n	iF��,�c^,��rG��(���x 㡌G�k;�kz��.CR�Էu�S��+0D*F��=���.w�����P+�cX���x���eX�6��k[��7�U���_�}�)�F�n�n��=Wm�un����U��
��a�������7��.Q0àfX��߬rgM��d��n��!�1,.�0Z!�Z��������e��N��]�SԛS�8ݯ��٦ɐ�<����cNe��W�r-�=�s<��2]f��9AO�Ox滀V����z-��l'P�'<T�xNp�#BN�h��nFR=�Έ$�Q0������ʖ�ܑQT�"ꉂE,)XF��.�UL��4����%[��(�c�!��MtN�۰�|g��X�.���3�`.�u��"0E���6�Gg�A}B��i� Nc�1�!Q��I$'��0�L���"�(�Ȗ"��!���=���l~�OA�9Z�{JJP�8i)J���% �.�'�
ɢ|�2D�V�d�v�*J��V`N~G�m�3B��8#�B���8�1��Pǃ�������'�&IJ.Q̍v�-����OD���#�
�<?��&��S�M#�9\�=J11��HPK
��=Qkʘ}zVWEB-INF/classes/hudson/plugins/rvmRubyMetrics/railsStats/model/RailsStatsResults.class�W[wU�&M2m2P�J�@�BӦ4r�,�
Ri4�R�6M�6�L���xC�x���WXK�ʒ�����wf�i�NkYW֜sf�>�|�~�߿���Cx�2�|�B��!༌W"�1!���0j�c/��x%A1eX2�!DpBƋ!�⤠O��N��2^ë2^c)^�iq�bxSgd�%�m	�ɜa��#Z���e'TC�r��G�5�;���fJ���e�S\U�SO����ԉ���dzLW���I8[�u��Q��x��D9�x~����L~,��q�Dv ?2��7�t�LZ�eƳ�Q-(\�D�=���iF��?�`R3m��M¢��{ӦE��2�\!ha�G��R�|6��"���ei�U�U-�
�IP�tNBpKZO[]*��%��� ,�ֵ�|vD3Ց�&��Rj�j�ŻK�[�i����[l@3��$�Иf���Q͠�%��";t�2-E�:�����u괟��j����aM�0�G�/ͅ<>�O�\�ԗ�urbڴm�;戆�9�5{�::��Z�9z�|H���J���$�o�E©;b�Wg�+��9K�H�)��Sb��i��"5���]@�-�ʁ��\W���&sSm����*d��*jiXN��Uih�DN7��^��km�D=G����=dy2�H���
\����]�jj�MZ�lj�٬u<-v��7��崈{|Iˊ��P2�7Rڮ�(���L��� �GyЌ�v��8m��+%,����0�I�D���ޯf5�(xge����+xG|�2>T��2-풡�c|"aA��$�o�l��	�>-Qk��4[�8>S�9��񥂯pQ��
���
�å����{\R�bhW�Zh��m��y�	��#�إN^���6��rv$Z�J!��'�L^\$wF[�J�O�eM�c�S���<�M�=4�M���"Ȣ���Jtμ����8^�D�C+���4n�z7�}�}*)p��O�%�a�T����-a/�]��Tq�R�~�e�`~�~)-RKi�=ڤ����ߟ&>�?�(�]��C�~Ὅ�^�v�{V����q
���+�������
�@�u��p����y-������hֹ")뱁���x�;��_99'\q��H��|����[]�u�e���^�_�9k����q�/]��W�*�W��/�E=�Jj^C=[�[ǹ��
]��B0�H	��\�� �%��<N)�XN��m5.�J�݊m���Uš�(ز��'��U�4�Tp^�#���)(�Z�Ma���}YH��;��(s
43�t�#�#V��&�^m��+�r(O���MZ�raur<�V�z
�|�
5W�ڟ79��=����ނ�?	7�9y��6��
,���
��C�P/a
H�_=�%K�*.$��t�����L;N
Fa�+��h�qh�}D'�)�uW[�;l���N��^BYI�ta�m��{-��]O�&�uvڑ*��Z
�;H��
���fj�1�g���;�f�����*�+�጗��<�\�7��O�\V��E�	��i<�n�*��l&-�{��w�1;�$<�	dy9�~O �yY^d?��d��yO +ʁzQ���(2�=���a�a�ޓbU)��ӄ�9/e��V�PK
��=W�H�ZWEB-INF/classes/hudson/plugins/rvmRubyMetrics/railsStats/RailsStatsBuildAction/index.jelly�TMo�0=��±"��R/�D����ͽ��5y	���ן)�V�ļ�7o��vvI/L�	�����c��TtDA�^0U�+v��G��1�D����ϧuH7C���s@�R�S�
�I/��w@�����i�K �ր'���k�7��җ�+L���;�� �K��w�*���u��A�vL]1�i�r�b=�8�MaD
G�
��-��ޕ�L���Sq�\2k׀��1�pE����4�8P����G���.G� ���$ok��q�h�`��+����c��Q�xݘ��]H��+���4=	�JA����a�Z�V,1N�i�J��T��2��䚵�+g>[׶���T��w�Cq��׌��8����Ujg[F7��s�'YME��07�Zwo;�9�,�þ�qe,���/6E[����H�`&��bI\���0��RS���oX[��g�rm۪�L�<���ew�}�)h��PS�q�f�жTMqaI�O�����O)Z��4�,x����s�n0���ij�\�#�\�P�6��&1�fg3#��$b�M,vv��*v�PK
��=J����-TWEB-INF/classes/hudson/plugins/rvmRubyMetrics/railsStats/RailsStatsBuildAction.class�V�WE�m�6$[�g%-�X��H�[-ņ	��Z�$KX�l��Y�)��{_�9�O�|�?�zg7����
>�̝;����ܹ����o�P
!���V��X�q'?�d��L2BD-����0��e�Ȇ��M1l�*�.|-c[�d|B��o����^�l���sK�|f�.Xe#Q��fX	s��n��*7�<-��[Yθ�(���X�3�]���@J34>#�E��\Ṝ�M����g75�%���M	3���إ�jn��N��L9��-fjb]c���Faξ�����sy��
�_~d����v!J���E�r��P�T,6C�Y�h0n�$��K�#>�U�~\
ѱ�N�\Ь�Ϊ+�D����g	��D���bҵ�i�L�Pb�eU7F��'��\���PT��U�o���d�!�ufY*���Zut�Yeđ"5�6BN5l.q�d��@�,���ת�W{�or(��L�I�H+i��˜�\�<��I��\CE��QoD꿟SM$�p"KW�dL�N�����6a�^-��w��m휃�P�l�y��&n��mcRQ0.㊄�#6d	9B8I!��Y�����{scD�b2

T��(*؅&cO��e�(+�ࡄ�e��[]'�rM)������#��ƾ�Gx,a�l}ZB�=�qm�5�_k����鍊���A�%#�&�F��v�����7.41H�i�T,�ʼn�,���Z����I����ʥ�]f������{�΢����Լ0+��b�MW#@�]��s�b��W��	V(H��fN�Vc�H�Kf��5\q��X3�}�lײH��/Y�JH��a�п�C�]��D�mxp�Vy��4�c㇐b�_��^\�����%�>�Џ!Z
��|p(��)(a��Q��g�u�h�D�=�QN�,d��g�<u�ɀ�pL� ��)	�ה'j���i�Uo]u�����PU&�U'W�Z�ij�ÿ}�@&��;�!oǟ!x����BO�"�#(�pA´?�?B��1)��^�k:0	�[,z�+���O�ғ��[/0����O�O�grAGi�A����(��X�w��7�0����x�›‡��>?�g�>!�a��)�)��H�GW<H�5��(��Sw�f���4]����7�Pi�GsQ]�?� ��Lj�
PK
��=H;i%�QOWEB-INF/classes/hudson/plugins/rvmRubyMetrics/railsStats/RailsStatsParser.class�WYpg��-i���I��a��Ʃ%˲ڦ���:nJ�Zv���k���X뮴��.�m����P07-9�i�r=2�0��'���A���^ϴM��w���}�_���ew�/
g$���p;2"$�p&&�gE,J�B���x�
:r"�m0P�ù L~c��E,K���X����CÇ��<Α?�G%|�|��`O�S��'��)�i>|����ϸ����?χ/�������K|���_�����cZ#�)�ac�	�1��٘��g�:��Ix�Ȩ��jj|_9��Y�00�u,#�(�΢���rn™_M1��2�U5�J۪m%&j�S�i1s@���W�EF
s1�!��c2�B�ckz"M���]plZ357}�Ds�Ro =�,G�-�0\��o�����蒺�&t5�X��1	�F���+n���KJ-�XPm��yJÝ��J�T��C�T;�e�T�|EP>�,�ͻE1t'�':f��&�
F����UuV�8GD����aC�Y��.X�0Bb��A��n��r�f�����jv��B�}�6kv��Ph��H�&U�Lj�^OQ��G<��t��r�2K3
!FZ�x�-��6[�n����Wm�du�~#�zc݆[)�35?d��*I�p�������)m8f�=�q�un�$����;qXij2����8�{�w��IA2#��ɸ���S����#l�jeӌr�7d|��,|[�N������9��f�D\��=</���\L�f��4#��&������ԩ�����	Re�F��9����,�e���������~.�2^��2~�_	H�21:>����?:�N2�n��{��*�D�<�O7"^��k���Z��l>��	��u\�q?J"^������"�2��-~�+�3�G2~�We��R�����QͲe��?��,��[.QM��_"{��m��)YE��>nt��x�ϨعI`rӀjq�j
�2�M����]��N`��
����nW$�y�[O��dUk���n��0�|��4���m�Z77	���HW8��]:l���
����P
���@jYVu�������
`S�"��-̑�VEn����e6t{����lH�M���5�
n��o/�g�"����6���i�c;�B�p���j��9��3̃z��"Q��?U:)r
��i8���Ȉ'�]���hd�N.���փ�2��6`Õ�����ۢ��Mh�Ƥ8
�{�iK{�����G��,�Շg8@_'w���!�BJ�]�K�,���u/Ң�1��q7x�vp��L����{	���Po���"Z_؄��E�U� ��t���Q���o�6®l�7�*!�m 8���:���W�-�S|%�T���WО(���8��K�I�B���/wTW��;	�:v%k�Y�x��{�T��}�cb��
t'��љ��:%�s=JH	tJw�u	{�`u���V�>/	k�ѧ[��*��5d[�!zJ�᷇��"�'%E*��S$_�q�V~w�M���:�v�dWm���%�L�B߃{���>tc?�d�ø���A��6�ELD�8}>�><�~<G�B�k�#迓����P��=d�#����nj���]������z��a�}"#^%s�0�^'j��ݚ���n�D���qIF���VtK�F؅�9��7Jp�$���9B��8N��ƿ��
`���'�2�4Q-�O���K�-�7��{����<�}h��b%��W��@���>���f)!ڂ�k׮�����K��w��I(�������WMw��A�t��az�>��3P�!W@�<�AZ��b��c��z7Ig�n4=L?j+!�a�8#�M���K�Y�+!.�����-Q�&�]��y��r��yW���H�I�u���ɤ��w��Vh��>��PK
��=�Nt�bWEB-INF/classes/hudson/plugins/rvmRubyMetrics/railsStats/RailsStatsProjectAction/floatingBox.jellyE��� D��+?�����{���]��a�_[��ۼ��f������ܪ�4CLNH\)�]ѥj����C��U��1���es�_y�j��cZ*KC�N|��y�@:mK����q��4ۉT�"nͧg<F��{�%�kUoI�#���D��N�PK
��=�Zſt)]WEB-INF/classes/hudson/plugins/rvmRubyMetrics/railsStats/RailsStatsProjectAction/nodata.jelly�Sˎ�0��+��Z��pr�=��bl%�d�t����^��mv��:Y3CrF��Ku!�����e[�)S���;*�#S�	���!��X8�c|�I��k�u���K�{�yC�)�i���Z[l�ܦ���:7�ԅ(.߆S�F�C+N��ZS���
�胩��m�2N�
���3��5h9�t�V0bG�B��#q�$/�_�\
��/T���=�
9x���xT�a`l�jg���y?���k�`��7m2�o}�)_�{O8\-��`1��{�~AK�A{�2u���6ᇡK+M��=�@3���Gf�����l���+���?�n֋3��9&5wc�.�5�����C&4�)�C�#]]��D�>�ٌ���t��{��PK
��=Y��VWEB-INF/classes/hudson/plugins/rvmRubyMetrics/railsStats/RailsStatsProjectAction.class�SMo�@�u����M�P(��Uj��ŕF��S(�i{��ڱҍ6��^Wʿ�~?
1�qR'����of޼�Y�������X��xfC͆�
;�&�l�ﵯ�n�� ��=�)�/?����`���y�.km���9�8"�v�S~IS�4�K�yc��X���zp�z����+e<�H*�lbfU�|ɢ����eؘ�2��z>�YH��q�2�����\]�FC-wX/�2(gw��u��j/�oYs:<�L�����=����r;w!�(�����N\Ee*S���o����\�O��`��r��"�N�
?x��F��2痪rl(���1�D�DG�s�+��Xk�O�w}5,��~��gQ���x������x�
�W����G�E�Z��hm��Y�,��2��|�_}�
���c���O����/�b��J�Pq��
��EO��-dK�d�"3�lfd��Ys�m3�f��fflF��cx�ϭ�PK
��=<�zl�YWEB-INF/classes/hudson/plugins/rvmRubyMetrics/railsStats/RailsStatsPublisher/config.jellyu�OO�0���SXRA����Z'��ra���ٲ���c�w'��T�˳�{�|SnИ����Tb,�����9u=˝AJB��-*m�M%
�����,f���̓��[�l2���ubq��\�h�`�+���}=��Iە�}Cz���Jо��U`J$����2B�'���ˮ��6�na/M����8ق"ׁ������@���Fa���a�
x-��Co�>̕��<QD���Vva\�d�>�ߚ@���|�6m��q�ż��X��.ƶ*e���vq�Wt1�7Gۈ�j†
?\��*x�x���B�gx�<dy&>�ü
<�x=�{��'�GQ|�9��R�y6/��y1�PK
��=��&�aWEB-INF/classes/hudson/plugins/rvmRubyMetrics/railsStats/RailsStatsPublisher$DescriptorImpl.class�S]OA���n-�@������Y1��`b B(�o��I;u�#3�$�O>蓉����v)Pjx��d�{�9{����?~�&���I�Z�O-xf�s�&��&���;r�a��m�ž��)uV*�У�C%7봘�}�����$�t(�H(���*Ű���]N$��#���2-��Kʅjk��s2N�cWp�gr�z��L��}&���Q��[zNA���Fɠ��2����Qq%�v�Hpo4{�v���ڨ���{:�0�O`��K�x3	n���hΎ����>��y���jwۼPKغ1��
f��HS�Y9b.�m͢K�&c_���0�9�4�
3��_v��XO�'�M��k��Jʶ=[��-YJM��<O���~X:�S��\9�-(�)��B3�����y��,bx��M���4�a��H`�S�WM/[�~��Ii�
5;�V�Ps��wS�PE�����L��}I��	sq�M�&��5ƪ����r����({���ʉ�#p��PK
��=�@Q�RWEB-INF/classes/hudson/plugins/rvmRubyMetrics/railsStats/RailsStatsPublisher.class�VmWE~&$YX�KQ��J�E	�e�Z-$�
�(^L��I��lv��l��C~n�8�9���;��(D
|���}�3Ͻs���߿��?w⩊[�)XTс��<SDz���M7V�U*
]�ǚJú�
��+�T�C��V�.lg�V7+��;y����2�K�J�����F�a������M�jX�漬��5]8F���0ݒ��Պ��W6
w_w&N�f�g�Y��d��5�[U�DdV5����6C4o��}��׽ZYw�x٤���]��6w�7�b� '���MBU�Ё
y�[�(�?�wl瀖K��0\�,a��m�5HKβlb5l��
�S��}�;�5W�;�|���<���U(P��]�s/W����o[�(�s�%��_��	��lx��	�뼖n8^#������+bQ2���=�0�N�1_��v�t�u�:�"}����D�8�뙂�xy�@Q��pHU<�ӫ�Zl]q
�N�W�F⍵�L&�ʒmWɨZ\x�7o�V}ry��U]l:��"��(y�aKO�y��R�����B����\�@K���#�&Rp���(��^o��,{	X�4�U�R�H�S�������Z�=��/2n��T�d�Jr�nC��:�*�O(a�\�^VK��l'���&�?R�\E���?%�>x�y����0d����y#C}�-J���v��5����w������*���O��ݹ��*� 7��P}�!�}.��&��w������F9�]����mc���n�/}�e*�,N�!|�n�jQ���R�3��7�����:1B#0iu�gb�����"�����}<��Vqz&�ѱ{����!b�c�wg��GPb3������v��_�b4���{�#�b�$^�'p6�$1��|=I|L�Y��|����-�i�1��`�x��h�5����>�g��
��q�:��;}���Mqq�x�3�N�s<���C��4��f��C�h%1�ߑxݼ����8�!��П#�4��Z�K��,��	�XH҉���|�@�1z��@�M�5
�i�d}گ����]�PK
��=t��DDTWEB-INF/classes/hudson/plugins/rvmRubyMetrics/railsStats/RailsStatsPublisher.staplerSOMQp,MW0�P02�21�2�TQ0204�J��+.)*M.�/�-*M�.)��K�)J�N
�/��]2��PK
��=�I*�8!GWEB-INF/classes/hudson/plugins/rvmRubyMetrics/rcov/model/Messages.class�S�n�@=�8�qR�BM6'-�B�P�
� %�(�C�8��hbW^"�WQ�(��Q�k'��}��̝{��3�����Ȑp��<��X�aU�n�pSF�r��w�mO���P6<��;=����,S8o���x�E��EnK�ݤv�Nm;�>dHk�}i�kq�9�q������)(S4�N����� )�m'`�4�Q+�\�HD�����֢��=��E���.5���!/�(M�"�rS���<�|�(t<��ft̞�ӵ����­i2��T��]��$ӷ��%N�����&�z�wZ�3Ӛ$���i���%j�D�'N<晟S��m(�Q ��o3�L ;?N#MA	e��ЉQ������
�eЦ}��_y~��k��;�R�6����~C��D�(�a�Ԝ�U���d���h�I䓆��R��ed3��crR��5�$�'kR��(�-`�_R]���;����H�t�ސ���F�2o�^L��Qt	H���ĻB^�@�o�n׫��mL:AnHR�@�H�qm8��d�����{������:K�R���PK
��=��89LWEB-INF/classes/hudson/plugins/rvmRubyMetrics/rcov/model/Messages.propertiesJ�/J-.�)��HM�)�pI-N.�,(��ϳ
J*qjQbz��B�A�B�a�F�Q�&PK
��=+��
MWEB-INF/classes/hudson/plugins/rvmRubyMetrics/rcov/model/MetricTarget$1.class��M
�@�_��V�z�\�"��N�Zgd�-x5�C�7�MH�G^^�����Q��\�^FF[]�B��u9=�Z�+����yyrY�>aq��ସ�*/l����=gT��i#~'3����/�AB�#���إg�J�/�d��
|��	��<[�p�qŬ�%�7PK
��=3qa���[WEB-INF/classes/hudson/plugins/rvmRubyMetrics/rcov/model/MetricTarget$TargetConverter.class�S�n�@=�ı1�&��.P�SJ�.PU�b�@�U�cw�r<�!�W�Ă���(aQEl��=sϙ������O�xaA��jyha�<1�e�)C�(���C��24��L0���X�Ϧ�P'܋鎥ϣS��¯�f:	�>�*�PƹP�P��8j�$�f<����(�8qU>��y�D�B�\_��n��
��t�_9���܍x��M�9�w.�t�[���/f�|g�Ϡ�<��j�x��p�X��h����p���u,3�QX�3�W�l�������s����ڋ}aؖ*p����r:�$�	gi%��`Ţ�T��L+��ҿ�v�J��P"�QN]9˒�ˏ�V�,^�T!�H��&eD?��� yy.Yzu�w�A�B
Wim��lZ�*��F�>;����Ys�+������*���X/�M���v��]k���ؿڨ�
긃�%�^kd�����I�Y��?PK
��=�n�|��KWEB-INF/classes/hudson/plugins/rvmRubyMetrics/rcov/model/MetricTarget.class��[OA�S�n)K�Z-��Ei�eATQD%)`�����]�Β�4�S�1|�(b4�?���t��%�˜9gf~����0����F4a$�Qr�+�1���垆�$���}
Shx�}Q��ۦ�q��ʚ閸?�*w}�2�+�w�"�x�lx�0��d	�p���`}gI��Zt�F���Q�x�Z���_�ah�o�UӰMQ2��Kܥ��@�H���u��y~e���������~k����S�����%,�Ad.�K���g���Ģ��-����:w�j��坢iLגzh��e�z1u��)��j |���g��o��#���;n��r�^��
*���]��Ϝ@lP�<�
����C������e& I��a�;�Qot��x��z8���6�!#��|�n����i���G%\GY�h��H�4ft<Ƭ�vt��K
�e���':���䥈-�5YY��E2M].�1*�?�Z�/�v�U	黬Jm�=C*�X�'3�H���F����C����d���eJɴ��8����B�I�@2F2���
�!�>@r�+>"���{��F�ϥi����n��E(4J�FBv����:��7������1�v2���aFq+��ه~Ze�I�6���ȧ� ��أ��C��υ�S�8v�f)T��J�4��-uD�S����g����ҴM;�6T����gCڀ*&���;����H�*�njf"�wWԄD���$�Մ$�PK
��=p�j�ELMWEB-INF/classes/hudson/plugins/rvmRubyMetrics/rcov/model/MetricTarget.staplerSOMQp,MW0�P02�21�2�TQ0204�J��+.)*M.�/��M-)�L��HM�)ɨ�)�C��K�rR�PK
��=,��*�
QWEB-INF/classes/hudson/plugins/rvmRubyMetrics/rcov/model/RcovAbstractResult.class�T�R�V]E�l��\Jc ��4ih���	�[-�4�U��-*[T�=������δ�'���:�[�–��C_�ek���:g��ϛ�܆���)��cc}�V���j��'
��4�O��+��)���x�e��2�`֞�Q��p��!ǎ8�sf~��<��񕌯%(���U5kƶO��z���{�U-e%N�#>:�4LW/�T�v�zhU-oM�`f�HB,G_%$���^)��^�M���}���`�+[T��v�^�9U�Ԯ��jMs��z�ՎI��NC�Pb[ۣ�z�湺�홵���T��BO��g�LWB:��a.|�N�.\x#�nX:Ӌb��.�>�����m�k�nKh������I�hM�ZO(T��LD��E#��f�U��&��ê�a�3gM�(Z�w�anY|哽7x�����*��"���;�bF�����Ì��U�(H�%@���S�1SJ*ʰxu�b3d�?̊
��iVE�Uz�w��*lTTT��*N����{y�	�ќtQ�׹[81
%{�R����{,ᚨ̈́}��%M?Ս��N�␸֡g��j�U{R9�^�i�]Ϣte�yj놹n�V�����D��%,^`����1/��T����-2���g��ާ_��3�|��\=���v���|By�
�i�c1pO�j�;ҟ�yޟ����i\��F3u).-���{��!?(c�F���q�f	,�;9���@��F��~<���)�;bQ�u��k�`�����KW��q&�g� ��|��M��K#�B#���P�<+4rKld(j�
q��12���\;��,����ϐ/���Ɔǔ&.��61��[Q��2B�=�Q���]�G9��:qn��8x�'�����-���Q�]��b�����Y��q>�
٠��u����j�$���5��M�7��j�vh�
�}����%G��-M-��D���h����a�}�M] ,'��#��ž
�=�Q��PK
��=tXtQ��SWEB-INF/classes/hudson/plugins/rvmRubyMetrics/rcov/model/RcovFileDetail/index.jelly�T=o�0��_�2�DVA֒!Kҡhѱ�ųE�"�J+���d�I[��w���,O�	�пVHS�v8,�Zi�	4vB���=؄38p9����D�A�o��ŰM�gF�ItH�A�v�t�^����KC�k���/`5�
��hp6)E��Y�jc3R..F�l�?��e����� �:����V���G�:z�6�AG%�m0	#���h)�y�Ugw|�C21n:��w��X��hk��{�Է��S��5?+m�]�՗��XJu�%\�+_EI��g������T�
$� �+�Ϟ��Պ]��(h���G��=2���'5I����
�2�4-�C�4�^ح�g�ȿt?�X_=^�\?�&��Ek�G>�.���/�p<i�5�iX�e<������3�|�La�>o�e��B�kEÅ��^�U���۫�ҏ�]ݔ�<~����w1\�ir�_�ʻ<G�<��eF��?�c|����X=3!�}�̒�W��PK
��=%�|i�vMWEB-INF/classes/hudson/plugins/rvmRubyMetrics/rcov/model/RcovFileDetail.class�T�n�@=��IH�t�-i�w1e+mJY!��H	T ��$C��ؑ��—� ��H ������tEyy���ι���?�~���$:0�@
��P��>|���qhO$b��cN�7����B�#ᮄy	�$,0t���T}�[�f/��3��Ӱ�p6U��Q�-���-�j��R7�\W�m�R+�cWӫy�DI���Z�i]��e��,n��ð��6t���b�ԋnyw�;�V!�b�<E�h:/z��dI34g��e�UrmG�m2DV腡kU3��[/s�Z��һjV�{*���q�4���
�Q5��8ͻ�hr�nU���*��Ɲҹ�gs�qz���`<�k��-��DX6 ���tSA�����֩Mi��VwTEW��R"�F�d�t�
�T���
|
�XL��1�0x��+@�G�g,�0-'�ƴ3)�$�~
ːSx�a���/�8�Fy�W�IC�Z�&��S�Ck��OO{�M��S
nTf��r�QA��v�o�S�����;�O�	���@��B#�F��?�"tS�I���i$G�6L�.����0�]�!�<���<���W2�1Jg/Q�3��HP�N���%�a�O��	I
� ��R� �I\&]$0J��D7��<�~:��j��B��F�=��xT��a/)?\4H�w�lב
$	�%�	Cr�\ �x��ثCH��$��$��YƉ�#G�Sj�/PK
��=��`��MWEB-INF/classes/hudson/plugins/rvmRubyMetrics/rcov/model/RcovFileResult.class���N�P���\��N���
�*���
U�"U�P�E��;搸r�ʗH}+�@���x��3�Fc��ۙ��ۿn�㓁*��`��G6:6ul	�}{!Z��Ҷ<۟Y�8t�ـ��<0� 	�-8����w�@��}J-i�9r}y�,�2<���8�wj�.�Y���H��h��E�o���GV�\���#I�J�`i-h�g�)<t=9�Q��Ĥ�d|��W��E�zt���?~gf�]]ƽiԠ��3���HFXyH��[L��iBG�D������<K�uš�ĩ[��U��4&�Hc(�
�u&۠�"/�Wv~C\���d�iM�f��[��Xy$��v����U�3�5��ٽ�v��Pզ��NڕM���ŝB�R�U���i���H=���� �B��� �<H�4kO����PK
��=�����IWEB-INF/classes/hudson/plugins/rvmRubyMetrics/rcov/model/RcovResult.class�Vm[�V�O)
-Q�BN�nm#:�K�\�V�
�	&)��?��>�u۵�خk�>�'��l{NC�u
|yrr�s�yO���?L���J�$��F��L/>E���b^½z��"Ϣ�!#�#�e!�P��8(�UI�G1�ౄ�%�2t�k:��
uKU���+YS�y��L#�-j5Cu�gx�Qi*WoVm�P6�fM3l��j���y�XZ�^+��0�\W
��'������&�Ȕfh�4CW2��Β"C_N3�R�Q�VI-�ϙU_Q-M���a���񓇳�gg�j��0䓞k�jԔ"�2j�ԑ�bi��c\fh����-�1-:�-�."��t����{F�9�L�.���/�=v�=��L-2�8���/�Z�|�8F	>I�V�dO%�%�NPl*�4��*�y�p%բ�v&Ւ;FtB��g�~x</�U��4((�:Z���g�]��M��GG�7����epG�E�︥伕�;�ŊfӪp/I}��zU�&��0��������"wd����'2������5�d|����-������u5�%h26pK�S�e�h�0�0Q��)�3!n㎌I|$��a����&C�P�fʶc����NmD�����z�h1�Ww��ꪽĿu�Y��f��$[�g��AD�p]p�A�����h�?k���X3L�gU��`��d&�.j�S�Z�^;l�2�,-�frk�啹�̽9�G�"!���z�ܢXԸ�����X4����)���P��iz1[R��xk�ܶ�2�9��_;k�v�C��f�ͽ���c1D�/���Hϳ��9�Oa�sI���it�
�O�K����t����$�_ !�(.�J���=�.�Xߓf7=o�|�g���Ͱ4���6.�Bb�=w���]DGw�Ft8��Ad�߿�~(�"��p�(�0Ft
NQ�&|H4��Of�H�$�����Ү��%���0NOa�Bona�>q��n���w��\�A�S�&��#����{�EJxZ�i?#��9��:�n��^Tg}Y�:����g�"z	{�K�d�y�,M?񾏘�	�.Nl#����H��k�ƕ�D����rqi��/n��{�7���|�yJ�ЊS���$N1�+�1�[0�f<���՟�PK
��=�g��>�FWEB-INF/classes/hudson/plugins/rvmRubyMetrics/rcov/model/Targets.class�T�S�h~^H��VA���O)��R/R������X�	�4���ꄙ�s7�|���9�:#���w��}��}7���?�0��d��0�{
�)�I�8���@#˜��U��b��,j�Qd�/%V�xW��G-��`������d����Z�V4ޔ*��Z�qY��.�<7��-�
�~��6~{fu|�Ij����ަ��k�߲:AA�X��T��\���rU����tM'���L�Hr����Z�a�a�5��Љ!W�
,g��f��;���W	�m�G�J^�t�o3E�#�f�b�Tݼ�ڝ��V�u���D�n�f'�	IʰA!���d&;[�s���7��gi�g�
���_�akU/�ֲ��%��:~�a=����^�e<ӑAV�*r
*:�#' ����X8}��G��lZ>��QEM�:r:�x��+���N଎I���?����_���xo5;��}�%�� �9�Jqj�����v<���Kf@Ԛom9f�*:���c�mƽ�Oa#�ҙ���ND������I{wS���+='�S�A�3�m�o��8�MHN���)!�8��H�%��h�=}��;i��ٓm��E���NGO@����ϐ9`�@�UZ����zd�1��b��(Sӓ���pS�;�#�tv�8��T���TJj*��z5>A��űiI��x�Ʀi��R�'�E�
�P#�t-fLR�8u�T�@�q^I�L��T�?����JH�Pq+*�a�R��>A�H��vqj�H9-Gʙ�?I����n��8S݁��w1��e�`�v����v$�PK
��=F��(��NWEB-INF/classes/hudson/plugins/rvmRubyMetrics/rcov/RcovBuildAction/index.jelly�U[k�0}N~�*
}J�
�bl�(c/�!c�C�e[A��$�
%�}�,ŗ8�J��;��H
���0��%�2�F�.��:�T�*�ޑz{J2ʏxA��1����[9wѤ�➔9kV���DR���59��]�j6�D	�H�p.al��,hs�����B��CR�Y�\*���P���5)T7��Aղz�D �qN"(iJj�	[�yA�N���KL����nh�U|�W������ u%T��c�Ҷ̀"�U��U#WD6L���Ƙ��́Is���7��"�_���w
B�B��l�hT*2I/���0l&�qR�*NGFmc���.ԓ�P�?�?qIB�4f�6�)l])�Ӻ�7�_
T�ނ��~�n �踧x?dz�l��s����q���/̄����A�䠝�_e*�����Kk��ζ��f.#�1M�{a�
�$��'�;(���0��i�y��%��~��{�8��zɦ��*>"��`Ý�wpJf�6�Bꙷ��w��;,"�Q�os�H)G��G��'�6bOo!� Yg��a��`bW\R-wҸ�K˛V�eIZ�{j���]��:M��Ėv����w{E�C�}����h��3/�[�J��0�0=� |X,�K�N�!:}*��}���`��x�PK
��=��3�HWEB-INF/classes/hudson/plugins/rvmRubyMetrics/rcov/RcovBuildAction.class�X�_����.���E� J�)L�� H�]����&i��Fgg��,���e�mkӦ��ۚ6B��/��I����33����~�s���s��{�o��ލ�ъ�R$��f8p7#�i���\Q�����#�hóq�?�Dž�8���>ç�8/�������>���<���2|Q��$�_��+b��q��ע�z��Fߊ�S"���#�2�n�݋Q|?�������;y�uܗ��g����2���$���p~lf@wm#�i:7���2��&9��urW�'t١"uF�֒y�0�)Ñ��c��ܼ�+�_�ܵv�>�g�����eX�{DA�ia_�{�qm-��f�sC!������p���K�g�t��6f�S�ʥ5�f2�aw� �b^{�v�]#g1�H�iK��\-25�-�L-X�_E�+��^\
5O�N ����Hz��5ӝT���y��°>��%�"Ӛ�g�J?��OJ�6胂c������]��ܜ͵XְN��JI��
��n�7�H*�^
�V�N��5�)S�Բ4\E8<�L͚H�Ђ5A�8�N٦/#��~h	�u^�2&Zz�f�tN�r���t�����Y���̳e�s
�Y�5�� K���3��4sM�Ǘ��ɳ�I'VO:�6e�6׼�T^�}]]ƙ�Y��Y����=-q��
�N�Uֆ?X�}��b�4��^��U�o-A1��w�k
Q�V�Ss���&IUٽ�^V/_�kdjc����ܐe�x�)���[�N=��8:��u�f=���"���27W4�y�+�nŽxl��"y�/�>�*
w��@�ݘ�s�@�����%YՊ¿_L�8��h�~I�ŋ*~����������);��J�����*~!��2�_��5�F���*>�a�o[�T��k�ଂ��|�B�
��(�T���*^�<�H��(~���������!�P�g��iݗ�Ww5�Tq���_�x�S�[Q���j퇧�u���͹�YO�����7�o�Җ4]*Xy�d�_��ehTе��Bc.�-��U_�6��'��A�+�BY��*o�bMjΠ~�[����[�dyZ��R��QP�Lf���Ҭ���RNz�t��nz`�g��VB�g�4Ώ5��va��6�|Kз��́(�;V-�ԫ;iۘ��Ԇ<��pf��ݤ)/��3l)��wCz����R�6[o;.&���54.��_�@���R�}�*XYK)Ŗe��Æ��Ui�^Q�����ZQ	BW��%ݽ-��{�ض�D�/��v�?��#w�ˣ`c��q�.Z��gH'�<�5(H�mM�R0�e2
����^�ZO.;�����?����¬t��>m����}z�/�ꅭ{������TJ;$U)
?��ێR�p��}�<�g�ϊD��D�5�$ڮ!�2y!tx������z'��|��������Q�.�[(�\�Qb;�.�5�0�H%�M(��y�!��տim���L�2�x��+l����x��&7=NԆg����%B�g�y��tD�#u/A��ty��{��j�Q6Z'⭳(�C�en?�v�s��.α���+
���Q4�8��q{~3NR*���r��#�ݏ��r㯏�0��L��rl�8C�~����}�9Dn
m|
T�ʭK�m�XIϬ�/�"��+UU��E��T#��J�Cʑ@�D^�巸e��4Q��m�����[P[8��\BiE���,���#,́��]�P3~������W�/"�R�MRW]�M��`��ez��tb:�fB=�3��n-�k#<AţN�*�(9�u��{���a<��璔�-��g�H�xTm��Y�`"΢N�l���<v��ݵ�9�uUY����/a�3x������#�};j1�Gi�e� ����n��\U<�	|��1j�:�1F�_�k���G����<��y4��ү9�l!�u��W��6����=�M2�&�-o�\]�>�'�i����@up�M���V�&�'o����=A1���W�� ��s�.�(�{d�dr��d|�H&�����!�	T��7���PK
��=;ޢͽ>VWEB-INF/classes/hudson/plugins/rvmRubyMetrics/rcov/RcovParser$RcovFilenameFilter.class�R�N1=NB7��B�\
�%\)�gPU5)� xs6&m��ݍ�?�P�R$�>
u�D\�C�V;�xΜ9����%�%�y���<�㭃�&��{2�%j�̓��f��j���/V���g������B5nPr_M*����Bo�zd��G;\K�w�L(���U���2�����RBW#�$�0_k�Y#�UpeM��@�[�Y�����!�D�\'B�<�4�y�Ôa�+_Ɓ-���]�|C���PR��y[q�CCn�-��}�����`��4f�2|yn�[���"�n��
���ϛ��6GG�(�Q��T�U��'&J���$�LϪt����O6G{ٗ䭒��ի��U>�!wj1>�^��$�S��W�
w���ΰ2��˹F��.V~#���ʎ�3KU�n�\b��]*S��Fl��l)�6ޡ�_PK
��=5����CWEB-INF/classes/hudson/plugins/rvmRubyMetrics/rcov/RcovParser.class�Wi`\U�n23o���%mڦtI�I&Ӕ�M�BH[��1	�)U�&����L�y��\QQA�("EA�	%
�Zq�
�}����2�&���s�ng�ι�=��Gp�j2у{��D�1��5p�	?��dx�0�2<`���=(��!+ð�I�=b`������
<j�1��Q�x�ǂ�x�L,�'L��)�ħL��iO���*�g�9�7�ո�e�� �$�|Y_1�Uk� ��7L|ߒ�ߖ����2<$CV�a��ߓ�����
�}�Q)~��e�������f�\�Z�/����U	��oL�U����{a��ğ�e$�����2������i�_��P�ٛ<�3��A����R�Z	;����vZ������}EskSW�{�Z/���+�G�u�h����I��
e��Dډ&���x�V4�1g��̐{=��a
�{|��>ޙ�K���v�;z0n�do4�7������91�R�:��K'uC�L,��K����ͦ�\Ҝ:��#�J�)�d��IG�vD��i�+����
;ƫx6�iB\��ә�C~�C1���q��rbt���(���oIe�̎���E!�$�h�3yTaQk2�_7�ƵE�:'ڟ����9i��d<3���^>��f}��)-La�9�py+�/-�J��)��
�}Z����{%�1�h�|���~��Ԃ<0m
M�Q���0�ó+p�K����܃t]S��M*!ummר�`oƉ���5����l�mO��Đ�{��X��‚���]��S�Ȗ�CP0��Ʃ�t����鶏9;S��nBm
S=`V*<EN�’���<�;c�������B�����n��y����.JT(��]�L��"W�&�,(�'�YBӚP�n;�X<-G)��=��wGW�闏/u�y
�$�c<V��P�w,b:�L<��ql�� �Tc	�:D3g�.s��oc
�#)4�Q�w@c�6�H�+_ٱ��ZH,\��r�[���0���
�p~�bAQ�*R�^�[ʧ��
(�PAK�(����zK�*�Re2L�a:\�WXj���0�@9R��)��nٓ;Y�4�&I�ut��W��*y4��*g�TK�Or��ڞ���	����Փ�슦���`�#앷_g�0�P����Zj��+,+�+n��P?����;n2K��FӉU<Kf}��T�
u����
�*ʬ��X�&2>-�	����Ŗ�RKΛ�DZj�ZF��vs�Zn�j��V	nBj���<o�-���x9���ވ�Uk��Zm�:1w�$��tS6�Y�.Ja�x����p�LL5Xj����U��|bwh���ڠ6Zj��l�ڃw�&}�hU��7j�Uim]�Fzն��P#kɶ��puc�̪W�
��R����]��P[-�����BrzV�*����+�힕k��ava~�ig�(h�;/I�j�٥]=YWW����������I��$�6SG+��/�����LѶ�����Y���<�.U�M{X��K*ͧ��$�(d�e������6c��9y�NE���{7�v�h_��.4�ι��5����`_#V�˫���gӖ	����Mq$���g�ɛ��:M�P����~,�7!��;I_:v
=�
mZ�R��+68$��[�9�${��$7�ãn;5w��'*�7H��uZNRGwJ����Ϥ&&żY�ɔtm�m��P�̜1~�m���^��P�|v�(�� �w�&��Ӣ[���/O��Gn'�~/>C�M,��υ�@,�Ǟ�M�$!��E		:�uv�����8I��U���M9af�Mr�S�LӧU�����	�i�>F´�p�G������Ң"�w�[�u�:Mu�We�D�]�j�U��I�h�뵺��ߟJf��U-\�%؇
�q���*�"�������6��?P�z@�9��Ի���
�r6ǽ�>؀��}'��8�3����UV3���+��w�e���P���2\������f<�2V������{�h��	gadl��dQR��eaG_����z�?�>P[S�FY�d�w��ep�3dn��F��y݉y<�UPH�0ʳ�u��N<�t�m#��)�S;���i�^��0۳�"����u(�Tb-C����&4b3va�Q�4�­���/��#��h�9��/FI���b0֠)��� �d(��;GpŔv�p5�u=Jq
^��|c��7�慧y�'�#^�n�$���`^�*{���,�)_X�h��Q���bI{�L:~��(������X�7V��*����j
ڼ����M��G[Y����/�l����'E�X��[��yw�I�!c#�xr����'��pD[�Y�V�>Q�8"b��q�q!r~��V���-_��,6��,6�A~���!h��=m����z�{j�dј���1���b�.�l/��2��!�u-����1�db�#.�h�)���^E������^4x�
��x���nƫ�>�����ʝA��V{n	�rK���5z�ڛ�ZFɷ�W�<?2�ڏ۴/�!�/�k��{�R�sB�X���4[�7w��l���~�x�<��j�u�%@���I4)��,w���(�"~�1��#h���q;���/.��ų�-/KuIq�0�2�μ�K�mf�\�|����S������b�.ś9���뀶��U�z�[�9���\z��e�j�y��`����,�$w"���H��,�oED�K�t�4�}��0�BO����v���ȷe%-����QΌXΜXO\4	MD�Ōy;=߫�|�g�q�FA#ᅪ3�{GΞ�]?E��M�SN��q�˽1�ܑ��	�Q�l��a�ƅ*�s����X⚵P������\��yg����_�]D���;B=�a+�����h�V���A��u���պ���e��+n&y��:~\zؔ#>�Rm�]��=B/uߚ����o�e���׺���w�����	���qoW�!��V�t]��u�$�b���]�#O��Z�	V	��{73y?�PK
��=�_3��	VWEB-INF/classes/hudson/plugins/rvmRubyMetrics/rcov/RcovProjectAction/floatingBox.jellyE�A� E����'�n��@1#��^[��d��fV3 |_�'5��{�1D&�4�^b��'0���
�n����I0^疩��<��k�jB\*�c�.|��:�dܖ>�(�1I�6��_��'�M��g�99BhEq~-DmAȎ5��߱PK
��=�Zſt)QWEB-INF/classes/hudson/plugins/rvmRubyMetrics/rcov/RcovProjectAction/nodata.jelly�Sˎ�0��+��Z��pr�=��bl%�d�t����^��mv��:Y3CrF��Ku!�����e[�)S���;*�#S�	���!��X8�c|�I��k�u���K�{�yC�)�i���Z[l�ܦ���:7�ԅ(.߆S�F�C+N��ZS���
�胩��m�2N�
���3��5h9�t�V0bG�B��#q�$/�_�\
��/T���=�
9x���xT�a`l�jg���y?���k�`��7m2�o}�)_�{O8\-��`1��{�~AK�A{�2u���6ᇡK+M��=�@3���Gf�����l���+���?�n֋3��9&5wc�.�5�����C&4�)�C�#]]��D�>�ٌ���t��{��PK
��=�7�6��JWEB-INF/classes/hudson/plugins/rvmRubyMetrics/rcov/RcovProjectAction.class�S�n�@=�8q�WR»4E��T�!4
�"$�P��t�n�X�T�m��H�+X!���(�ǩ���x1s��{Ϲ���?<�%<*c���6
4
l1��"I����=O�qX���ց'�;ɱ/\'��=c��Ű��{�lW�r�'��
�q)�;��\�/'���z"�-9���裛H���	��	�ҁ��0�g0�1��1�4�ƴ�(����F��S�M��ϫ����*ڭ�
���$�$�=�Y���&�D�|t�����۽�Cn�<��x�mR�g�c��(Tx��]���@J�g�yU�dgC�cR������^�J�}/��W��TiVa�̰���ҍBI����_sW�F^�d����Mܢ�I}:��	*�B�Fw����Y0�43�BY&�j��P�R�R�2V�iuʷv髑�N��u�nS��^�͔JM�z)Vʠ�L�:v�B�S��g����Y��k�鸋{9ٛ�L�C�ek��+lzΦ��ǃ�~�PK
��=��ũ�C	MWEB-INF/classes/hudson/plugins/rvmRubyMetrics/rcov/RcovPublisher/config.jelly�V]o�0}N~�euM+m��T]
�t��Rm?��
856�/mP��>���$�ک��H������k�&�BH�\���.��vF��� +�ޑ��V\�EH}�c_�ZUH��_΍�;�R�d��+��1�O�Z�D]�( �w�z J���\C�Jה�`�K�J�T�`���s��`�ƁfG��ĖA�`�6D������~���5�=qiY�	�[J��;	���¤���(5O2��=��5�3v�*��Y�����2�85�\��x�\�M���o��?�n	i�"#F'���I+��~n}^���,�|W�����2��kg�����8�V���f����
�����	�:&���#���w�t>G����i�'a2gU���[=�Hg��C��'q����T>���Y,�3�]��zح��Y|gIn��6��#�Qd��=���NO�N/�4ri�J6�e����1�i
����I�s=�~g�R?ҡ���G�y4
�
����ӧ㏬�
����.m�6¥��mW?iܜ�3�	%�9��,�dB#T&;R��=	��`�ʓC���W}x=�y�B+�T|�w�#���>E�c>��J>��x�ws�4�b��Kq�E��\5��Ξ��m��1��6���`8�0M����[�F1�����Ӥ��~�DӿPK
��=�iո�HWEB-INF/classes/hudson/plugins/rvmRubyMetrics/rcov/RcovPublisher$1.class��An�0E�h D"�,���^���	c%�\�8Wc�8b���dF3�'}��?�7�I���\�R��Q��^�n+�C��g[v%a��Ҹ�m�Q��L	�M<g���Z� |���Յ^KF�����B��V�S��!�_S�Zl�V�3��Us�`��j�
�!F|�x�=�I9C=��'PK
��=�sB�>OWWEB-INF/classes/hudson/plugins/rvmRubyMetrics/rcov/RcovPublisher$DescriptorImpl$1.class�T]oA=�ܶ�Z�k�@�,T�mj��d-MK0�b�e�i�Y��%���Dk4����w�<��"���왹��sg~���@/�H�n
)�jXK���S�#���G!�X�
9�9�/�lIC�aa�{�C�U���a�RrUs,��C��]ϕ��	zBz�
����+aӧ펌Cj��#�>W�I�-��R�;�����m�D��r�ESH�:\���CH�tm�i[J��c0�eCmV�l��$�DOZ~��{�<�F���1�JY'���idd�1Π��z���!�ԑ(����ĿC)r]���zB�(��vu����
6�KX�S�P�`�(�2n�x�:6Q��9m�$JC��Ռ��\X�������Xh5[U�C�ٮV_�6�߹1	m�R�̱d�hH���b�F���G�k�F�g�ɩ�¤�D�Aa��V�˰�;7��s��ʿg��5w��R1M:'��.�$]@t�����i,Q���
1�+���`�S�
?���w\b�sߠ���'���2�$����b
C*�O�J��U����'p#���[Qw"T�*"���ID�_PK
��=F�
i
UWEB-INF/classes/hudson/plugins/rvmRubyMetrics/rcov/RcovPublisher$DescriptorImpl.class�W[S�F��6�1
�%�WJIjC@$M�6�KBp�b�&��b���H2
���/}����ԗ>���4�L�Oy���c�!�x�Z��s�����������NÖ0��s��0�BWڑ��$撸��|��$�w`���’��RXFQB)�B�"4��7%ܒ���N�{.Cwa]�T���JAw�q���^1U��p����B���Z�b��n���Y[����s��5�j֦R�V������E�=2���w�!�˯0$�H�����|�^+s���
����+���y(LxU��vNsWst۳���m0�s�ɝ)Cu]N�O�o�K����U��F$��D�dYF�j9ނZ�ݳ�|�C5+J���
iv���چ�襄�#�N瞚�x~o8�d驦F�g����g@�0a�N�kj��qM:���{���V��I�6t-ȟl�!�~����EX�ʥ-�z��3���D���L����#��ɲ�9��-9�:�F�P��Jp�0��sQع��T�
���7�Bb���?.��uN�,��S�5e]�_+..,�}�A2(����O�/���ԦUOe8�8tQf�h�t�t%|�p�ٜ*pcp��"T�U�Θx�f���S�
W�\׍բ��
Ф���TѪ;��"��I�"�cO�\���Z�,Z�t8�Oe��UKa	
��q��m*h2N┌a�bhj�>���,C�ړ"�sx�%TdT�S���]�y=iT�:6d��8�7.�;���]��p�E��Y��(_�6�[������^$`��Ԉʺ���:Ԅ<�P�=������Ӣ��>���2�\�Y�`Q{b4e���!l�++ʃM@�U^M�U��ͪը(e�����J�yCL��8�BA�j�~��E˸dw��d�NӪ:?�c�]+�6��L�YA�x�1��0�L\I/�YzI�����8�b�C	*/��E��Ҍ*�C���
������H���_|����I/�@
t)����!��o�W0���C��Z<}�^q�m6��#�-L�f�/Z����%L�i����C�o#�)1����������p�W��YC�n���چ~C[3��
��B�Di����!�X�g�;�4�E�b�X��E�.$oD��/*�!����&�8L�L��#��~����?�I�t���q!1җ�Fz�^D��7�K��%��(.���
�#b#8��|B#x�@�	���.�']"�H�H2N�rݓD����Y����Om#��ݪO�?P�(H�R�pɧ��f�w1鏗�*�����~�G����t��PK
��=��X��YWEB-INF/classes/hudson/plugins/rvmRubyMetrics/rcov/RcovPublisher$RcovFilenameFilter.class�S�n�@=��q0�
��*�p
�[��P��H��C-���%S9�2���/�/`�$|��c[�����;��9g�=�����-<pac�E�M�q���V�:Xch<�Jf�j~w���O��a~ �x�OB���0�J{�D<��Z��*ֳ�L�l7J�/d,����ގRB�c���0ۃq>L�H�4���n~x)2-#JI"0:o�0��X�ճ�=�G�8�V����@&���,�j쑤���h���^�NC�q�i�:Crp�O������M���fp��\GfZQ�z|�aZ����I5G�l;��G�:C�?x��c���@Ddv�'��f����T�s�;#�h��)���I7g��^�M�������xH�KY@�>7�o�����EZE�#<Z��Kh�<��hW�mB�(:۵�������/���nvWp�8w��,*7q��|JѪ�a��)ǂ6n�fA�U�oc�b�v6�1G��(��
PK
��=(|���FWEB-INF/classes/hudson/plugins/rvmRubyMetrics/rcov/RcovPublisher.class�X�_��HZ�ll�c;���� Ǎ�()gM���M�Hϰ�jW^��w���ݦu��m҃����4����>����v!�#���}ov��̛��<�8���oQ�Ԡ�%�XF5^"6/�q/�i�r��+k�*�Z��bs���w���Jx�8�z�����Z�	oo��*ho����x��x���d�Ļe���2��2އ����`��a|D�Ge��L�e<����'$|RF#>%�J��0yF�g$|V�E0(����n]�fy��>�4��4�j����æ�MZZ�6��tFg�l՚�6���ϨSj4gkz4�e�CͰ6a�v���e��㓹T�4�=7�٨5�N��gn嶥%iKڣi3��Kq�:H���;ܝ�L0tV"H�2�׵�$���:A횡��®��jLD�I�1ke�u�%��r�qn���:Q��fR�GUK{��'5B�uݖ	�,�1-�G���e�0�9���|T�j���0L[�5� ���iMDϚ���Y��jF�V�G��.3g���ɶrIr�In�6�4C<�h�x�8��I�+���⻸�3���Rf�ID�S��oc�õkIe�@�-�t�מ�e�J52�jF�O/�h��ay���ȨVV�V,�9 ��x6��Kq��,�9��p��2�P�r�N���^��3���lX#&푈s�z��<�d��K.3�� αu'I�iU�=/F�꩔���p��
C�������O顺7�FT���|��|r��Q�H��e��I�Ӌ��Up��b�e��)e\�����wM/�7�m�õ�-2�5�X��Í��-ˈO��g��m
���9^Nݸ>!�*Z.������=�um��%.2����R���/<�.üD|�=�{]�:,̔�͜��{ݺ �E�� �)]�f�?�D!�a7�M�#�� �9	�S0�G%,(�<ch^W�T�8� ?����/�+�8�_�ų���*�t	_W�
|S��"O�1�·|ߕ�=���?�;��TQ�c�D�O�?W��R¯����[���%�A��'��H�	�
�I��� � O5������u�.��
iW}��?+��v�����A�蟂��o���"6��j�Ƣ�J	���H��Os�b8�^	Mk9n��"�Jse��멊.a�oPj[���S��Gu�a��h�`�Ɗ�T�6���^0b���$�vt���,V���nw�@��Ȅ3
vq��\^Ѵ�RK�/zU6�0�R�ܹ�j}�ۄ)3��Va�ٺ��Y_g�D����UΉ�0Mw
�[�3��o	�R!�� R��]�U�h<U�Οq��-W���.UQ�7	����&,6�2PQS��/<���B����S�j�K��&�bĄ���
F4}�ES�r*�ä��Ӷ��H��p6���3�f,r�}�q��m%L�.O8��eDa�a��z�;���vQ�R^G0�q���@����tS���r��~;bȚ�e$J����u_��.).$qs�kGѽ��`Sm�j:VT��ΐJ;��^2nPv5��uz�kd�ʺE	��nA
ڦ+�a�S�٣؃DT������!$FZ�-�v�=�v}' G�"MWPu����M���0|h�S�L��.7��N�Y� F{h�g/�o.}x.�%�l������|m�HSs�w�<yH'��^F̓�W�.@�}��6�i
�򸪺5�Mm�lk
"��n[�$b�I��Z���P�yW_��t����%�Վ-�u~��J �>܀K+��E�$����I�6�-�f�5���9G?9&V��-�ǭ�C�0H0���!<�\� $0L�$�#8	�tF�d�IZ���
c���)�O���H�D��}��|��y�`����P�*��v�B��<����I,���uy�>���;p�8rh
T����].`������w��#L,�ه�{�l!"�'(�U\?�� �p�0� 4z	�!�"K8L����d�AB�v�A>��wB���M��F�Y	,E*NcI�ۏR���{��^���}�ǚ��Xs�t�(Kk
�j(D��~)��n�Z���)��N���
N9
\!~O�+$M4�2�2�]���Tu�
f��:{g�������.�*(�
�fhEC����3UܧrK/Y�+�4[�I2l7ˊ�ͣ�\���
Rh������dj~�KN	X!bw�#v�n���8L��.H����W�����PK
��=��)�64HWEB-INF/classes/hudson/plugins/rvmRubyMetrics/rcov/RcovPublisher.staplerSOMQp,MW0�P02�21�2�TQ0204�J��+.)*M.�/�-J-�/*q�,�PK
��=���&�YWEB-INF/classes/hudson/plugins/rvmRubyMetrics/saikuro/model/SaikuroFileDetail/index.jelly�T=o� ��_AQ�N�j����@�%&�`ncU��4N�x��ݻ�w��J��2(���'���A��<��p����%D��LoQy���~��t���ء`�3_^�dT�IjG���9�w�Vv�x~r��"T�K��b>�	u.2�=#���]��E�hC�o���$ɠ�G����`���{준�kP�4.�HU�n����)J�_Y�$���>�����h��
P�x�`a4��5C}\܁��P�DN�C�>���hS�s�M|���af�����"��*w��J�$�Y퐉d55��EV��"F9�-�e;�p�i�ܤ�.�W�n��e�<gE�m�[��gz�V���Un�֎��b�w�Gn�#�6C�i�rبi�E ��ZmK%,W%P�l�PK
��=֌�҆%SWEB-INF/classes/hudson/plugins/rvmRubyMetrics/saikuro/model/SaikuroFileDetail.class��mOA�ۧk��j���XE�'>+�A��xH�!�ɶ]����~*MM�~(���U��������fgf�~����<��q	�9�qO-U
Sy�0�����<f0��9
����5<`H;m�2���MϱͶ���\�|�7�ׁ����l��\�P��hK�q�X>ë�o�
Z�Lw���օ�ʆgz\���j��FZb+(Ԣ��������3�͐Z�C�⚴�FЮ�-�[d)�9
nmsW*=6���]��U�siQ�����n�z���F����-�oFO`�:�����>G��x��'��x���X�`���-e���}nZ�n�5��-��ל�mK=�i�
�Q�Cu�0�0tV��Q�	Wtׯ|p���X�O1��&^^h�WN��Y�
j��&���{T��c��K~��J��f�ᝎ������6-�u�5t�ӌV,�yф��e�-��R:.�ZR��L���NC 9E�2��m��=ړ��c0c�	c��/dJb����)��X �0Y*Q�c�(��T�FI�cK�.н�I70_�$M����H|T�LhSE�t�*��$[�*f=��Y��? �ya"^%ou6��w�H�2G��Y���;K��8�x'�PK
��=�\
��SWEB-INF/classes/hudson/plugins/rvmRubyMetrics/saikuro/model/SaikuroFileResult.class���OQ�g�kaݥ��(����E�a��0�}[���K�����x�D���у�qf����z��7�3�>3����/X�Mn�3<"Y"yL�d�d���`U��:��`��-���s➹���Az�ƚ�f��i`�X��;�F=h����k�����z"F��ڌk��;6�hS�t�z�m��c씧���Uc�[����Gn�/����a��;��m�ԏ^�;�Yk?���2��s���8����������>��4f�E[݉�+U��&��5R��D3���M��_�,����O=��セ����\�.2Ţ-~���G~y����o���I����8�3ڗ�k�[��0#&�`�0D�')�Il�X:���l�דiP�m��1T��5X�#��!g�4��چ)�?�)��S�FHl^؂�EamaK�-�F㣖�s�jh���A������`n����[h5�
�׊�B�Tl)�'�(���e�/|�T�j#����t(w�D:��t�$-��� w� i��5�}@�Ȕ$#��)A�� dk&���Ȍ$+�L*Af� Ydkf��Ȝ$'��)A�Ar2Hk�}@��D�A� 5�.�,b��� U%Ȁ���W�� �X���$@��'@f�i~�E�~���t�$�I�8W{8g/9&Y��PK
��=��ćH�
OWEB-INF/classes/hudson/plugins/rvmRubyMetrics/saikuro/model/SaikuroResult.class�U[WU�N2dB.	!5�������ڪ-�B��h�Jo��C:�����O�ϼ�Z�������?F�g2�/�++3������w���o�	3�	��X�!��A$�p��x��x|*�qQb������.��uY���ѓ���p)�њx|)c]����s�!U�SԼ�hz~��u^q4Әa,iUCu\�3l:�w�m�4�[�;o�V���w,�b�mU{�Zf�fns=_j��*�]ݙ�#�Q�tT}Ѭ���2$X�jT�%
dT�-2��3��L�3H��65�/��2��Բ��f���몥��o��]�*�y�t�T�*wD��L�Sg��!�9^C��Ɏvn��iњ�k�z�xeD����72S��`������ �	N@4;����f_��7�=5�*��ۍ~?̜1�� ��z��l��-���;�:
<l��N?)S�X���
�X��#"wfA&^�B.���Z� !�u����7q�a�݃�R���(Hᜌ�lbK��
���
����D����#��˨(�W�����pW�$�+��}�
4a��3:jbd0�}�+�a�M�Jy��F
�	[����t�D��D�������s[�LÛt��_I��#=�+
2�\U�Uô��j�S$D(a�zϪ�!V�r�4C鑦�}��κ���'��ʎ�]Tzt_�l�0 �� �$O\��}-C�#��n1o��?ɀƃd#���"���0�}	���͗�
�go�[�[ ����h�4�	�mz3\�U?֏�9@��R�H'`X�q��\����'����T�`������#D����O-�I�@!��(�\qܡ�D
�	�x�(-Sx*�����h�ʥ��ve�/D�E
y��i&����#�1�Q����
�M��F�'˴+��w0v��^�"�|��E�μ�B�t�W7it�6Q�"��	�B��yJ��.�x�_�a�SOڸ�n�#B~�Ha}D��q-���ۦx:�L���N!`��
ד�@�x6[�hc�#v�C;l�6�{����]燝��K���°x#q)|��ނou�j<�y=�PK
��=ƀ���TWEB-INF/classes/hudson/plugins/rvmRubyMetrics/saikuro/SaikuroBuildAction/index.jelly�S�n�0]�|�cE�
�V����d�~�_�S��m&������t)j��{����XA��1��Xao�T�#�MB����,�Z>�|Qa"������=J'�Mt�3�rLAmD[����F�,�ds�GM�ix��+�M�4�}�R!�ǣFk��-��6����T��o�M��F���=~r�ˏ���vPa�Lt��yaD�T\��c�y�uh���Q�{V)��2%��
�6�X�Щ�I���Y����Ag!.�VcW�CZ5��z�>83}�<?Og�z�]o%�{�l�$.�WEz�AݬCw�(ۀU[�b,J=�>vO���Kb��Ν���k��K���9�{�f�+w��R�$��tH�e�=H����%xgwe�O���DU�[.�K�����t�<��,����2Y]R�+h�N���?����ݽ�.%�u��H$~F��X�V�u8��V���Z;����x��Ԩ|Ȳx�Q�]W_��7������X��PK
��=�
J��NWEB-INF/classes/hudson/plugins/rvmRubyMetrics/saikuro/SaikuroBuildAction.class�V[WU�N.$�������J57�U)A,Q4@%@+v��d&�6?�_|𕮥a-Y������̄)_�쳯��g�}�Ͽ�
�=<�`���'!,D�ǧ!,��1!�2X
c��W8�q_��Ak���?\�I_Ep�al��uOB�lڪe2�3%�`�XQ����_^�s�%�2��)���g�X��*f�ݪc�f�V4Śa؊����9�2����V��eb�7s$`��Q4y�.�dcMʩ����yIݐ��=f�*)����z���yK�5�+���ÍVY1��_��1���N$fȶ3�5ɲ
R�nU=G���V��yɒ����v3�{�-EO�yT)'�}n�W4��3.[XԨFs�d�2�;u��\I2�u�F��s&1�f����Q<m!���J���JZQ�R%�b����ǰݲ
�C�/}U��J�A�5q�EqO/���,��TQe�dκ*?�e�z��Y�5SN�|��v�<���Ž)g�4.s����vZl���*ڞ3[�#I�!lx0ܽP�ݼ��YQ��T&þX�i���n��߬���G�ν���궑����"c��(�����wW��[��śK�m���!< ��R��[�:���T��U�GA����v�!M�(c!���Şet�e��3/[����+t��`ؐ+�A����[��O��	�Z�M|<�c��ߴ�����5~(s�g2k.j$�?ѱĒ�μ�K��l�p�?���$��5�p�C��!�+�m��<|m۷�&�9}��2�M5,�b�xbgob|��S�
򋕝s4�I4m�q�[lz�C��{�ͼ\z��|��z���7��v�����s����x��7h���O�D�,�������-�v;�~��K�I�aW���C�\ ���|x�h����Qw����.b^�i���#�7�$�R v��f�gt"��L����72Z����k��JC�R>�l´�&�Q�#�=��&(H�$q��"B�(i�x`/�0q� �:p�3~�Q�9� �<�D������#�t����Mz(PC�T��7��P�}���QPIA餂�;�k�r�3�}�
y�Hҍ�?q\�	L��9�L9�L �iʑ�#�p���ʵ�����w8�q'�{N~�1��MLN��ojJ/�g*z�A��w�x��8�����!Ik�dA|FG7�/PK
��=������IWEB-INF/classes/hudson/plugins/rvmRubyMetrics/saikuro/SaikuroParser.class�W�{�~?2�&���D%.��l2(� 4�Hjb���jq�;$#�3qf�Z[z�Xz�I[z�V���FMk�����z�7��e�Շ$Of��9�y��o���.���O�(n�^�*N�hBQ�Ό�Y�p��$?N��ձ%~x�yɜ��TBm�T�5�ѱgu�ü�Ϋ���/����n�3xV�U<����/���:.�+�����؉�k���o����;���y�}��^�%���4��A��;?��OT�T���8���?i��L�7�:�=0<[.��g���횇ˎ[v���`����r�&nv<{�\���Ikڥ��_��V�p?T�Y'ػdu�-�8^hgJ���;
�Bh��s���D�����	��Gk̊f6��*��	4��HͱM��ׄ�1��V|�vXv#���r8J��s{.r|/T�s��e'C�\9���*�ӗp�o�2���u�k��q[��`Ɯ�Jn<bV�'Os~@���.���М��<�؈��8f��f�*̼�T��pBI���q�(�̾� �(:ύ%q)�j
�r��(ͱ:XCr|�?+p���Zp}	d�-�u��[�#u:�)`8
hg4�֍G�"����K^ҙ��A�>*�^u,�8���>�A���"��!���[���^�%�¯
L�S~��~���£~�?l�#=��ij���������y~���f�X�>��E�k2@S�pfF����R'��\Q�G�K^�e����i]8�#��v��E��V��"�~�+�3^Q񪁫x�J`��!p���Rk~�A�`������uo�"pk�X��-'����UP񖁷�H�>�L�_����M��w�u
W6D�{����y�<��:n�l�]�VԔ��v|E�n\{��5ٔ�J�혌��î�e�Ґ��2�W�˞l풚BX-�-\L��GH��F<&�-;Ԡ��%E����ή��0�:�W�L�R�c�rq{�Py�n�t��sQ`�A�e���V4bE�R���">�����9Ohə9���&�Ҝk��!�lE>'�Ώ���/E0*��-�xb�ѩ�Im���څhȋ|�5q���+���$�AOG�$�X���"�)[W�mk�H�T�\�`S��m,����V�Q"!���>K^VⒾi��k�!�g�V����=��P]��d�T?�����|�s�yl�O�~�O
�{�y����h�,@��o`�k�݀���$��Җ.�����q�Ks-8�Cd�[t��N:�8Bo6?�Z@knMS�B� u��Yn�C�9^X5܊������4�Pb�?4���<�u$��@�`�h��}��I�Z.a�ҟjO��et�s�J{�c�l��/�����#�h�Jߘ_@������!��؁]�Ѝ4�:�':���$�}�=�z/엁�;b�uCĜFk>���V{0��-��8�p�X�I�T,���1�*t��+���S�s��g���7-����G��`�h]D�T�s�\��[��m�n��˴����&��I��N�[���*��8Ax��R�i|�v/!�6}�Ĉ+$E3�Eɸ����{�hO��x��������6U��=�ܯ�9-w�w��t�s�'M��+��}r�Y����~��S�&�M�<���R��
�p3%���C�'=qZ5"��T�E��I�1)5c��)�|�H���'�/P��S�L�AR�I��,��]�t��sD��K�O��6<�'h_Y3aQK��5�\����T�PK
��=�N��\WEB-INF/classes/hudson/plugins/rvmRubyMetrics/saikuro/SaikuroProjectAction/floatingBox.jellyU�1�0Egr�(���Y��MJ�W���ۃh�7���,����6����Z�]M��T��+MlpT�P��|��<�JC�k�fVB��5��C�XK�P�4WF������1�>}{E/���>z�vL�����0�r��WɁ���f�3Jr+݉F��t�
PK
��=�B�0�$WWEB-INF/classes/hudson/plugins/rvmRubyMetrics/saikuro/SaikuroProjectAction/nodata.jelly�S�n�0��+c�Z��pr�a;��bl%�dHtR�迗��Y��:Y�=���\_�1��<�O��X�kՆH�&��$82ŝ�;n��_=î1�s��8�~VZ6��l
~:o�9ġ8嘚�5�&�����?I�k���f�s>�G�v��6-�U�B9�df*�k+�'��oy�N�~{qR�1\���F��X$giDO\��]<W:���p���_n�΂EA�:Ɔ�6�=���r�Dl��w�ނD�v��a��<;���5ACI�ޓvW�"e	F�pw�g���W.R��j�*�P1����3��<4�c�����PQ]-�JI]��͘��-n�e�O�샨�1Dy���űZ��[C&T����a�?qP��KZ��ŝ�����
PK
��=�Ã��PWEB-INF/classes/hudson/plugins/rvmRubyMetrics/saikuro/SaikuroProjectAction.class�S�n�P=75qb�WR�Q�"�6HX�PkJ�PP�v��ڱ�[ۺ�+�`�Ă�c��r�*<�Ef3gf䟿���OT񨆍����ѱ�P�D �Cg���00G���};N$w��2<w�do�A;��r_�a:�]y�m��f?t�ʥ��
Ԓ33X��O=Ħ������H��f���T�栰�߾��0�cУ`ؘ/��=�bM��@�u��7��JV��m͕cu�YR} ��'�$O�o8�ȶ���[G>��m���7}x�4q�w"�"�E����Ǵ��TeR�g]i��������&�K���A�J�}'�+�_���Y�t�hp��)�(�tq]���?�4��ߞ�w���[��e?
,���l�l����W�`п��u�2p��v��s�*��LL+S���X�b-�+X#�尼�+�,�Ҭ|�lV͡żQ��F+SHF�p���Y�տ"�p��"�Z�f��%6�
���*j�x�ۇ�PK
��=�3HC�sSWEB-INF/classes/hudson/plugins/rvmRubyMetrics/saikuro/SaikuroPublisher/config.jellyu�Mn�0��p
+����
z�1��$�1#ШwoI�j���nid>�X��v��m� h2�ZhT�1J\�'�~�M��h؞aWSCy��Y�w�/�)�)�j�+s�njѫ��������K�-��#�Q���QhS
�7�l����4����PWUj�x�#��:e������򞔷�t
?�m���C'PݫtM>�P�PK
��=�W�ݷNWEB-INF/classes/hudson/plugins/rvmRubyMetrics/saikuro/SaikuroPublisher$1.class����1E�<������[Xl�^,���5�Fc"#�k~�%/bg�\�.g����I����.�R-�Q�A.�!x�	��\+?�ˋ$��4����Թv�]¬;vV�L��e�/�m(���uɂ�(�M �V�*?7�Y1!{=F�J���*τ�w�l�?xO#
15ъ��߸;�i��+e�PK
��=�~��:m[WEB-INF/classes/hudson/plugins/rvmRubyMetrics/saikuro/SaikuroPublisher$DescriptorImpl.class�T�SI�&ɱ1D�Q�N�<���ǩ�AJ���,�f�1��3���O>苖>X�|ԕ�?��,�a����oz�{�?~p�.�p���.�.�� Y��P�uX��00#}if�Ca>X����r�u�Z�G�j3p��ƕ�י�`:R3-�*�@-uC����B�{\kA���N�����-}m������~$����5���
�V*W"Ǔ�#�^��p[�� �Z�@�eޥFj�������"F�M�!B.Hz|;ŕ��CO�i�#�]QI���sk#pV�C��g�[�e������r�.Գ�mw͊
6�k��v�%�>7�"���9�!�w��,��p�%��Z3Pm{3��hS�d=��(�|*^FB�F���/썘������N�X��6�Q�J�d����/�]�3��Z.��W��|m�ós����`9q�h�ܫ+��*����zS�#魷�w��S����V)W<��L���t�a���W�2J�M��i3�X�S"�[A�� ���Lgq�a��B���jd�.���������2�[t1�a:x���;�__�.��^�[��?�ߏ���J���I���'����V7�#
(N{��[�s8J�I`0DZ9š�*I���8.��}�j�M/| 1=��8 ���<0t'	��E�8�\�u�؉|�D���,2�N�4��Ɩ_H�5�ϐF��?"�<��ե����/X�k�Vc)��U�,�%�
��w�'�@���9��B��b��59u��~�{�ȭ������^rB�g�c2�S8F�JZ���t�	�8�PK
��=��a��GbWEB-INF/classes/hudson/plugins/rvmRubyMetrics/saikuro/SaikuroPublisher$SaikuroFilenameFilter.class�SKo�@�։�`B
�UJ[�)��! �%�RZ�z���*ٲY?��?q�~?
1k[}@N����o�y���'�
�wac�E
�u�r���V�:��P{!�L_1T��.C�
�|_j��M��@��ՏB�vy,�^��X&.?eq�F*��D�LE����Z�=œDl�?ΆI��}���N��`�>��D�0��/��e���XīS黔;C��2�x�=~�}��-4���u;�¡����B��i
���]0��f�|�k�j>dx>;�;��84���vC�M�
�q��)�P~�B��Ӊrp�k�u�eo�=�(ڧ�{�t��τ)&C&�9�*��(=���x��d���'6��C[T�e�K�K�O�>�ﰾ���y:k��t6
.�	�.�U:�&t���U��ꗿ���K�t7�K���;X@��ZR>#i�����1��k������71O�E7˘#�+$Ѭ�PK
��=�o�.��LWEB-INF/classes/hudson/plugins/rvmRubyMetrics/saikuro/SaikuroPublisher.class�Wk[W~IX����H�z׆����* m��� /m7�1�lvӽP���~�ڧ�<O@T�9��@"�@���̼�Μ93���ǟ��g1܊�9	y!̊�m���itG����.�I�/&d�@�}(FIPe�FA�;Q��PF�BfA�&�nIx$aQ��e�0���U��6C�8���VuLk�R%��yU[t-�sC�pz:�b��'�����t��Zv�-٦���nY3씵Tɹ�'7�ciE;e��k�-蚽��S�ֆ�G4CsF�n<�H]RS�j�Sy�1��s�Y�������J�[�jA���Y���s���y�v4������ū��k�0�%�X�5���4[#�i�0��L��&��UN-����S��Vun��UG3]��!!�r��>IUn=4�
C6^�[!g�T�@bj�s5�4\�˪�Q$�=��f;��u��.C� ��Be��@�=/���K@�:5���ej���a����-�/l�S��������|?���-�P����GċW��%��Ƽ}R����5�H���<�ȫ^�I�H .ѼV6Tǵa�Uy�Υ�2wf,�/:��X	Ć���k�KU_��Hk�-�`\n�Óڌ�.rk�1���%�^��H�^]�"��-��4J����P��Q|�HQ�a(.���7]�(�_��u�AQ�ǔ�8����ʛ'�MGqLA+�@I�(p�$�������O�\��R�W��j�N�@�F���N�
~��tC�Gk}���L�=��W��.��!�Z�S��Io/�kt�ҕ\�t����V^���O@3S���V��w�sg��.�ˬi��S�{��l�v�V�1��s^���@��U|K]t�B�����{6x#��xps+T��!�a0h��Nҳ�2ȫ�����]�M�d�n���Iw-Pq��7����A�3��ԲWd�EN���&���L%R�O�F���Ղ�n�w�U[��_({k�uMO������*�j����:]� e���sTk��;@���D��Q;����p�fW��FO9��H����4k�)�� �8�(�4�z}i���7��@��9��z�+�A�|���<[Ax(�H��/YF�2�;�et�@�DBOW!�Ӽs`�P$I$c�e�
�[F�P�*v�'c�+��HjOL�{�p'���<�g�(ȰL�>I+���y"�!Z�D�R�+9�Xݕ��ޤ/�6ot�tC���[�@�H�6����\�er{�B5�aH!%���z�i�;xi/�c���xpӄ.,EW�3�\��gug�=��uq���F1Ag��+�h��N#j1��A�	�g����{�>F8��1nt�	#K;#`D���r`H$�ML�'=�@�*z�Wp�WD�{��1J"���Ȼ������с��y�PK
��=��)�64NWEB-INF/classes/hudson/plugins/rvmRubyMetrics/saikuro/SaikuroPublisher.staplerSOMQp,MW0�P02�21�2�TQ0204�J��+.)*M.�/�-J-�/*q�,�PK
��=�}E���DWEB-INF/classes/hudson/plugins/rvmRubyMetrics/tags/floatingBox.jellyM�M�� ��9��m�GI���܀����MU��%iH��э�h���C�v�Z�*&�7��Hr�jCW]��>=�n�3f�
��i��~d�1�%��6&_5W����J�k��^_��:��,�O/����D�5���O�B���:�*3��e�L�}Vr"W�}�K�^�(����(��9j����-�W��,�IN.>�N,f�f��/��
PK
��=z�/^#�CWEB-INF/classes/hudson/plugins/rvmRubyMetrics/tags/tableGraph.jellyu��n�0���)�jRn���7�e��ILd�*q��Ļ/�$��z���_�;j�_��Tȅվk��J
�$�j`	}6t�5�+��5��V����E����d�����.������c�gB�4����Ǵ=�#{��d0�Y��[ղ�A]s�0NUw&l	k	#(�L'��ڏ�uq����,_U-�RW�kD̋nx` �~�f^�~n%�HV3���,�#z��7���?'����N�-�"����1�=�C�yQ�B��N�?�8O|\���e˼}y�2s70��L�z�PK
��=9WEB-INF/classes/hudson/plugins/rvmRubyMetrics/tags/taglibPK
��=P	�/�9WEB-INF/classes/hudson/plugins/rvmRubyMetrics/Utils.class�VmWU~.	ٰY�"�j�[ �ZE$mնTѴ Z���6{���`�)�����9��ǹ�/rs�;;��33����?��1vu�aZ�(>�я%�H`E
t�0�C�>R�K%���5kx�l�j�ӑ�3u�F÷:��]�+%Cx�ᅆ��۵�G�ln�!�DT9C�d��E�^�lV���e:����X
�m��Ni�Q��[�F�v��ܫ/5*��y m�/����u�Ǘ�'d����T���ڒ�̞8yf;|����s�,�"�O���)�M�d�w�<6tL�VX��n��&�������gZ}�B8�rҵ���qD��W�a�"UHr�-Z� 1�[³�O�.]}�Ž���a���?���XIXTi�x+�$Um���Y�v��6DE�o�S�/����BG������x�@y?`�2�V�b�a�Z���-�qE��
�:�1�#֕�0��4l�	?S�vP�"�B��t��a�KN�8�n����3��l�n5sBRFr����(�������i������y�Z@6��W�hz�m�&,ۥ��tp������4S1җ�
C�%Q���h6׮�"9(7�ʡ�y�%��.)[�þ���@�T#ً��3�:��A���!�R��+m0{~f�n�C��$���ҷ�xY0���Br�4T�JU{���{�����g�N�#�0�[f`:sR
�[���&� $8�h3�ݲ_�cٮ��Uܢ/��_L
.��t*��h�8��6=x�d,T�x���2�
ܤ���Y��7ɮ�����T>��A�A�#t�i��1bH��	����	��"G��n�vQL�>JVSa�|+(�"�q���&"��t����=��G��B�7ѧn�&M��#�O�ڬ��
)u<Br}2��P����i������:��$�F�"Ճ&މ�8���=l�k+�i�(��0L��B�"�Q�����Z'_����Ezą��e��L������K�|}D�b*�6s�͜l3'���c����'�O9dTU��PK
��=i����WEB-INF/classes/index.jelly%�A�@B����ij^�0.p��̒�{W�V:U�Mi�6�sN�m-1e����
���q���e�`���"�EVé��Ń�RTZ�*5'�¹�p+�I5qw;���1и���Y�̿$|f(o�U�t���PK
��=J�@.&C5WEB-INF/classes/META-INF/annotations/hudson.Extension���J1ƧZ�/*��S�Aja[�nO���M�?�ٵ�����7��M�"��5�a&L���7���5��3�sk�L(+Y��BkC�pܕ�P,Om귰-|ib�	��{��
	���Ԓ\����E;��B5B7��	j	4*.K����l
b����٤{���e!�g�Ri9z�N�a�B��!�,�l�H
?AGм�f��z0�ICĽE�h�V&�/��'G���H�̍��q2������}����c���#�IS��P~��2�o����¯�r/��A�rS�4�uD�PK
��=.WEB-INF/classes/META-INF/exposed.stapler-beansPK
��=���V�	beWEB-INF/lib/htmlparser-1.6.jar��c�(A�.Z8e�U�l۶m۶m۶m۶m[����LO�]/VFf�_��_숵%'	���������?�����?a��a����a@�	��VT��)������ln��M��(CG�~�l��o����4ˏ�]��fk�pw����?Za�@�GP�FO�̢:�C��8�ϓ��g�I�;2����["�8�6�1�ӲC�h�+G�Ͻ
�#Cq�V����i�@����<�(��Ub� �R�������h&��g��d*Ǝ�gH���ϟ��;���'�e���i�`J������?fN�Vv�����9�`F�Qjݿ�.!�;������ɘ��J��1[��UI�'��4;ӈa<�	��>	\0�?|^� ��Q{:��T��R���pu���G��u�E�F���M��x3�$��\ʏ_�kwj��ZM�U�m����u�l�)O���\@�\D훘d�X�X�Xc��^�J#�Q���@47�y`Dh��I��J��%��&a׍<j�[�G�m�KH�m�[
خI���W��!.W�a"W�#�W*�W�)��'U��=U$^��A���X4k�	X����9W*����k�v).�M�����z%��_Z�f���sg�	<��s"N;~qd�t��HΆ���z`��+n��Ê�"r�<�1�cO��3q8(�W��x�KUYS�JI�2�S/�d��g���g��j����ٳ���˛Vj�|��^-q�w�`�I��iy��B�U�P�0ԘY�(�q�D�4P�qP�<��2접kܢ����(H
@I0i���E
%�,KX�B�2�b��!�&f:�9<".�oL�ʗ����>�M�+e�����Cڰ_ Yx��&�K���d@�5_??kC�Rb�=.(��q��$e��n�r�$f�֠H�\P����6
 �b��w�a���v�NQ^�W������D@�T����t�iZ�ƫl��T��c���%�.����=o��j�H����+hѨ5}�፥-så-[� Au=�i��H������~���<�>�;��G��p����$�N����=B�V��=������9��[yD��5/L�Um�u��}X�
���W��h����ry�
�B�Ai�mI�5>�,b��SSJ��Ug�d�g���{k�MƸ��`˶�Ŕ��4����%P���u3wa�}�Y	��h~*���A���=u��gvy`����iV���2݊��mq�E`�2hL֌C�"������-�S���z�.��)����|2��H2�֩A�P��<Cܚ�E��j"�=|��/HZe��hDD�p�`�}~��ŻX�_N֜�+�K�8E�-�rNQ�$#�G����l��Hv��wL�Z~�����)��qY���T��+��V�2
D7�Qc^�;Uf�0��P�U�pa�h������g��h
`��
�-�=�"E�P����8z,#�k�E��
oQ�)q�m����I�"�aYa[��U�,��²��2��3�������q��;t���YZW�n)�֯Bק�5�w�#��g�D�tF�Es�E����	9��ר[S�k[���k��滻��#��m/�Z$a
`�D�\��f�5ȅ
��>�|���r�o��:�M=�46��[m�W��zh���L@!��L�E/
;j׌î#��o@�^>	�$�	�	��	�M�t�Wb4��B՚q[��rRpB��b7t��+!FǗ�D?�}
	��9�b*3��B��רD�
AFg�J��_ib>
��7W�q͉x�6��L�d�K3�;(�������E�uS5��c�ٓ��e��Ԁ�Ɉ�Y�J�*��� -��+��.����E2��
����C��K�V�]4>Gj�^�D�b��l[��6���C�C��&~|E}l���,���5O�/��(���R+!NZ�^.zG&��f��C�6�ۄh���bz�\�se��&r�E�ĵy�k7�lo����ގmU�����G!���װ���毠�_'�O�;�LV��+��ڎkg�t9Y_M3�
�����?�D�`,����a�N�T��?F&0�g0���GaW������C#-�W;���޴B;d!H����mrN��kW�G�E?<�3)�f�@��s����l�	Zl#�N]�:�³�
XcƸ�H^	�_�?���&�R>�Up��كJ�����G@��L����D�+��n�	�rO~�cgw��������Ѧ�C�7ٍE�Mf��?s�g�ϋ�t��K��L��7=)*��C��%��sT��K�V���Z
HWmƍ����d���1���{b�O�_>i{�M�c+�hy��4e�e̗#<��� �7^����,͟k�B�t�r$��њ��<b6v]1u+]��,8���wqk�Uo<���V�?�j�lB��\a���3k�<5�<9$�t�I/���x;E�>�*�2�D�l/Y��6��\��i���s&�D�F@��9{aྣJo����'�X�[Z���)�DJ?�.���~pm�	�~�Dy��L�_��:�Y�H:�i�t�L�
�0N����������2�ٷ�8"�.pܜ��~}>�n�\B�H�!��Y��D�FJ~�tM�J�G�^�dm���GE@��~�E>5��Ε��\�Z]��_���»).@�_7��]3[�ze�
�����J�Z�P=����њ�mm�2X�$�m'��\Ǧ�ެyހ��G��_3g\oN_ss{�1x����r�7�T�#�8��[�	��ޛO�٠٤<��4M��ߗ�F�Q~F2���F�c���w�*ж\y�2*�􄰵&il!�/"U,��+t:��.�+��J���H��{W~Π?�v$�3��<w�݅�Czf�mh��>!��dl>>�x�[Ş/���韥
`�,�vd5�G�Ə =jɥ^(+ȩ�Hߋ1
L&[��2b��t�;�;ʼn�i$�4HTЂ(���"b,o3ܔ�";�k&u9�[����*�[l%e͹yS�o=^�M���#�-8���aoX$�~���g�0@�}�<�����'to:�~i	Si���$�I�W8&�*��j�3̦�Ԙ�.efȢyӑ\�}�T���^����|:Pzt�W�R|®)v@���\�ko+�J��\�o��E�rj��u��������4-�&>D�-uKX��@��=@Q�U|v�4�9��:��6}���o���/��HD{�+���~�g��7t�up��m%�[�Ç�Zh[Zv��v7�M?5���k���؄�a�"��d���g_��S��&H��x=&~a���	�
hr��J��X%T�>��䆎P��Yv�wS2w���3�w%ٖ&���5�7ه��r�jj��R�S7j�XF��z����o�MbϬ���+�<]YI}12=]�x|��"�j�T6�\9�f*��J��S��D?�?w����k!}g���5Hڻʎ�W��|�r�3���p{O���w�_�2�r2v�]����|�!?�
AA��}����vg�֚���`�'{�\Igv��$�=^�?�ξ}���-|dsg�@�DZ*A�N�V���9���w-�A��kA��&��*Vh�G�۪����)�#e.
�ED��3#�w�g���
���F���%�m�A�[�
��W������C���<��_������)�N�hb��q��]��~8*�8j(�u��(+pIBs��Ϋ���O��0��ȩ%�(h�S�
�u��|�E��b|Mҙ{9��..͜	շ�S[��ܱ?\7�'���u��{�����u_8���o���_��o}����xx��������o�S^rC��S��Cw�^��?��������W�����?x��\X�~�Z߲�x`��K|���8��F3�����uO��D�p��,B�ޙ#��i`��$[���]�+��&ޥQ+�^�*
.����&�x�Q�L��JA��Ȑ���Ϭܳ�"��i�~S3T��n�^�﮳����- �@�K�W���Ypo��jb�r��[+c��j�����h���<����F]�X��懖��m�C{t6ʸ���p�O[A(��xX��~Z$J�i�޾��9��n/�F�׀`l)ߌ��61Z"@7/��ɶj�����*	���hA�?��줌�j..���V���tiv�#�\7Q���S	�i�_��I�Ȋ$N9�dJ(͹�Q�.Ƕ��ӄ����n�P)ujk}y��=�����zu�߇�p�C=Z���
�S]�R�D���!"�����djb�Rz�!M]�8-�t��^��!ؠ6�刌�r�KE-��PV�.��}�֋qΌ�?�*���p�|�L���b�I��e��?�;��ܬ
�,�R�fb%B�?ˮhC�r-
��2i
�T�f�)% ��"�P_sCj�B��x���A5��]��-X���،s�z��'9�
�
����qf�

�=U~�G�U:,Ev"
�_������G�L�w��,���[
ǟ:�?l?wz(�c}���b�W`;��o1��6��~mt3[Jd��5{٬}��n��7Nj���Yy��l/H��FE��IN"rt9�$��|���J�U6'H��|d~�)��K��4�V��<t�G�^tٔH���R�2�M@�4�����/��	�p��2��������v*��c��m��$r�"&t��9����JQ�FP��R:�c\w�b�l��Yx/��)K*�%��m�ӄ��in�"ݹ�DxtlI����<+{�`w5d(�i|�E?�U���U)�c���n_��~`�q�������'L�6p�b�Nu={�<dҘ���=Cn�V��<�%*�8?R�0?�S�R�JM�rOf�x��;&(��El���:<_>�F�[E�9s�l
��U`~^l��PVd61\rmi�_-qV�D��a�����O�Mn����n����IՅ�d�M)��j���?��4���F������<��ԁ�I�ֿ�,�?U!7��)��q��;�F���T�i�n+o6�|o����X���O�8g�zk�l�7�uO$�*�a{f!�_��"T�&�
Y��?0�x�f��H���eԜl�Tb뢴:"��D\��?�`B�v����M-�%�-W豔
�'|���@.�t�܂�Z��Ib��܏l��	|��L����#dž�L$$Ҧ�-�V3�-׆��@�D�&T�c��:��)��u�fS�����L�RH��^�a��]+��IC��O:��aM[�.�dzsPEl/�X���0 р�Omh�A>�\�x	���2o@�C�y��n6�`~�ٿ�"�ZB�Hl��v�2�v�@xyqgq>E�4�:����Z2<g���z����N�ߑ
UsK�}F*�z�ױl�^)�G�݉t�x����v4����#��tm��Y��z%���4�_���,�	�o�kn�a(9*�@D�xߩ]�Q_��G���8�T̷jńvM�@}�M�-`�]s�d_¢ӟz�����$m}eZ4���.,��=���+II�� T� �
��l��	ʬ�(;�Y���{ELE�镍�RVFo$���j3ˍ�e���EDIpS�ez
�u��yƄ)�9��d�BJ[�
͖�G�
Z�oN}N�0S_��i�L�jw��gȵz��ӬI�H���2�W��unTN�5)���$]�E��I�T��7���X�?�x�[D����!k�{%���wN�~�V�(�61���V�>�d�(i��&�E��Nq��Gu�{4�w��-�'~B�_Uu��C��(���9�A��Q3T�T��%ǐc�IM�4AVK)9��4.h���'b��$���C���f-��2?H��xʯ�v�C�ҽ��Y
�Dɯ��Z��Q�(-\f\���#�c/DYs54�Q��8E�[k�s���E�&k����6�$�&�Vf�@�p(�I3��dИm��J��D�,}�����ќ<}��ꇂ\=,�Sb���<�]o��ѥ�U;�j���R�X�'���<Rt�6���Ht�x�ާ��x���{%�����+Ry��M��(:����LڦS�q�J���P��A���i�
u�����n]҉1�p�Z��T���0�����-����A{]^�D��OrbẄ$7|�M��������U yC�|v�
pŸ�ă#k�uE^;YSVNEUU�I��a��U��/2�}o�����%ˁc�
U�׷�f3Ye����F��o��v�K���4m<�J��RRtO!vāxxņ/�=�SwH�%p&=�"�@����!N�llKmے�u���o����Kx4�iuv,��I���[�6�d�w�,���M�=���}�s>j�と-�8���~t��B��#�P�	#2�e��4�
��5�:G�R�Ap���?Uo�
I�v�t!W5�|��+�n��Q��0E��CC�Yb=����<�
!~F1��W���F/fdUz�	@�-!$����
���b��-S�y�d�rDE�5iҝ��§(Δ�a-L��耙|+YrՃ�7ɱܟ鈾��#t�mpA���"�XQ.�+E$�‘M6��9P���HR�0e�J�m��q8����Aa�"Yϋ�a�a��w2J!=��z���[��~��{�AO�1�@O5�D��z�^�!�Q�9s�\`D���n\�6�?��I�d�D����sL�A-�E�AB;���|�⳩�_X3P}!e
b�����+D�M&�=�<���~����~�}T�e��ۇ>�7�_�@��0��N���ǽZ[��V_pR%G������m\9bw����6]l-��A_�x����>�qh�ǯ�B	�A-�z��!��(W�0��D��d�S5鞈�����?U!Y~S��41Au5�nx3�j/"w�n�v��}�;X�k�1\D��&�f�R�����J;��g��L�I�L�F���6XHNz�āl�L��I'j9�@�zEa\e�D�Cޙ]W)�p�f烀[�p��N���Le�=�|B��R�<�zW��(o�,t���ƈ1,�N���9�4n{�LڼR�`"��{��5
�ޱ�:lZ2Hʙ�̊#[o[T�"�L�6�׸��n�]=Nu�"����0b��mo�h�[�m�v7V�Z፱Z�0�#��_�Մ�V�-��B�bY���ҡpŅ��5��G���{U��{��H;c6�{h�f�����<˲g�I�G�#)�dGd��݉��=��|�
S��9"�;F�f���������d�{���#��YuW'�;�j�gF�1��>�\3����-3��	sx�^"uW��Y{��;f5�E�\�2�/_�c5$�T�*�Rxg�2�#�g�ܓ9������eb6��g)mQ�2� /[�8�Gi��B��|wzKt��f�5Q���'���\�@_�
OT�%Y)<_U/D'��(�ɓ��W�&;g���t��v�ܩ�]�ʷ�&�V>%���� �'��q-����7D�{-�ldn���l�t�f��j��~'����u����e��;��B�+D���v��;��+`}�ܛ�u�\e��}�n}i��4���T�a�O�m�f��,Ӎ�󁚅D9Iқ��Ԡ�w墲^]7��y-?7���C+��Pl���P�y�M�����M�vp��{e�>̇w��i'��{���bg��>e'��y�-�g��LL�<���U��;з������p����+_JukR�xEZ�Not�1`�!��	=�g����*���]��#�y���;�+��c��s
	�w"d����n�5���B8�P��솃���������տe��U�����r���;]mb�H?C`���� ����d^��b	juh�\�b�d������
C.�F�瓴��R#Ө�(@����j����&����ʞ�R�;������}닻���9����y�j��cv�Ux&	�cE`j����ˬ�F;
�5~�t|Y�	��۫i{�	�S������KO�6{6ٻR���;�H����Q���Ǭc�->\%���^�XV�J�]�dC�Ok��ҟ%�Ή��3�wG�m���!�d�4��4�
��!��K��	���U�
_k���z��L6�c[��
��!��^�z��[��J��!w
]z��e$N�`��r)�2#�ԉ��m
Byu��dy$�2&�.i����-%1��4�0�H�����2�"�P,h�a��R�Ϣ�$vU�G�t[B�
c|Bzo��D��t��ռG�"<j���8Ehu�1D�Ȋv�����+�ٝ/5CSG�Q_R����+��[?��z�2=�tϤ�f�nq�TY8٣6��=�O�m�Y"ϖM��UR��/��nC�hk�X��T1vΑ��u�"_sl)���m���`<���n���u'���1"6c0������^��r��w-�ىJ�e�����TU��_?pdp�I\' 2&Y=���Y���9�^,��hflkbd��d�����ӭ`i�z�#`��E���D{s��S�X0�8��M��3f��NtD�C��'Z�C&+nDڕgщ��b�3*��=%�f-��<�%]u\���;�_"5{��Mj�>ͬ'@$T��y���M��J���f;_�[���ʗ��1ٮ]t�v��
ʉ3�ѥ�UX�eȥcv��(Ķ���)3pѦ�V;�lWF�NόM�f��*
4���u��!�� :d\��DƼW�\�E5�=�0(˷6���*e�R�m#3��#��
�ҵ�	�'_��]��!�����'� =Z�n�6ˣҨ7��)	��Yq������o�]�vy'Nm�]h�m^u��	��0m��o�P��,P��xX
S8�8TpY��GNP��N9@�7����������)Nb���)N����6�Uy�[��m�[��B�,��/�ߎ���Y���5.̨ Q��>��``H�0
kZ�h�������h[	�f�sr+i�Q��N�IF�2��)˶A��W�p٨�G��6ct���
�G��	G�kn���Ӯ�WU��#kW�:����XO���'�Q4��ۦ�����r�rù>i���B����Z+z��K|��|\�W��^]��x�~�쉓�sbH�渊�r�Lz��^��	��z�v�W_@_u[%��kTv�h�y|��p�MG����;�]��Z��̑9��F��L�QsU�QuBSw|��!��#ȎZH���֊z�KR�#-�$���'�*��Be�4�m�z�r��ۯ؇Cn$�m�\}ӛ?Ib��ֹI�Vݦ�}xƧV���W��U�H�9�Ъ�o4�.'|��~��!�0�зo���q��Y�/�^b�v�}2�?��0�9[``��s��=/e [M��x��I�X7m2�ux�	ͮ&�>�]Ψ�N���dZ�-�ɱ0ݭcC��7�g�US}��ó��{�ƞn���-h�}��KCD��'lhE7��F�._�ȝwu���H<�%�F�z�+�eP�
�I�+�HX{HUÞ�^���.7�>;�V]�<�)%�pjD�o:�y]T�5IU�5	&�᭗߾vU�s�D8G��7ᑖ��*|�l���Q��֬���^s2c�,C���� U"�"f�������l?����YT�y;�B&��i@R~�t��|�0-��l�hf����P-�<u��v_o T\�|[%�%��By#�1[;1��{�*������[*~^c׌�OR�c�O�S�;G�83�����Rw�핅��#k�Q��n���4���;��@*}�B�3��#��^�[Z�Ub���hn�d�"Ugw���ia��E��7�l�~X����ܫע�3���=ڍ[�e��͖6ݶ&����2� ��r�z��:�d����#������Y��t�2��a�+�sq���Eq�D�ķ���jG�a�Cƀ?)�:�7��;�3w�Y�|%H��~4��ԟ����d8�}"��za�]x���"�"������铎H�=��<q͓P��7覃Z���&0/�U���l)�~�dq&w)�	#�t*�D�y��&z�#F���w)
/���������д����O���;d8����R��h�t0YB��� �+��=�}M�����@J�ٻ=�F;*���� SO:����KV7;�}v\�T�D0OVO;(�\�VD�G=�}?�YB�J00�VO;��w�-q70Z"�=��H���;8�r0Z®�@Ux��V���@U�
���w���A]b�c╱�d�5�}D�h}����ᠬh,�Mc����6]��0�!$X�Ӄ6���b4ބi7��=��DWG��&	��D����Q��j/�	���ݙT��B�EOI�w��l�<O��ƈNF��Z��4�?G�û($���ܠŗ�S��q�Rh�O4fKلJ�<���$�Q��#����/�L���E�r˄�,��ȋ�u��2XN>)��X�rq�)���2D��'�w
�N���ArT�g���b<Ϸ���4�r��Xs�Oni^�#�	t��_��?T���r!F�9
�	g��5O��G���1
U2�kOSK�Q��s�󱾠�"0��&ČR��;�)nq�������dŻEi�,
�
4w�������D�h������;�"������M�	��4�9�x���J��.��-���O�]L��K��O���_���̉����n��āaG����E�
!K���p_��L��+A�;R��;R�.~t3�ɝ�]oƆ�=�fd�v ��a8��ՆO�S���<Ti��‰Qdz�'j)`L�l�d�|�����#���(�%R�~S�Y��.������x����J�{<��W�.�3����F���'<��zeb�KR���
ԙ	Y�y�96��Α,"6�d�%.�S�
;#26�d�̌'���T�ުdT0�N�c6�3}�.�~��'�sX
���Y�/�OI+�j���l��H:5�!�WT��OA��p� /�>��������������!?��J����`l��`����8j��{�tW%5E(���
��"<�b��Y�E�+3�N�@Xh@�a|��O�ΞA�`<���xc
� ��=�i?�<yz�����	pT��|@Ϲ�L��@2U0��NQ���}7yd�\�җ6��n�1Kj�7�W^��7P� n� T�M�zМ���*v���x���S�7�g�:^S�=d7-q�@�8�o���y���7>>s}|WFK��=��	��j��[aԮT��6�Kn����7����.�>�-�Ҟ�]�>9�G�
�Ul��ڣL��+a�/���l8����M�1J;û?���b�
C��cI�(͢".�����
o�15�J����'�-ݾ�֎�	FU�6��8"��ϔ��H��GdRJ��Ԍ�L^uT1����[�iA~Jb
�R�i�+�9�B�~3{��~��c�7b��ԝi��Lyp)�̾��Z�V�_v�9J���_�s�,m��s-��*�6q�.MͿ�qK�K|U<�p%pMe4�l�l�R�>�Ȑ�6�	
?�9�/��e��>�T�-&d����U8�i�Y���t����-�$]e�fʼn`�&Ќt�o��,cS��,��M8f�L��R��8�\�֔�ݟ�\k�:{���Q�9,?f=���[p�L��3m��m�^M��6�i}���_]-�	A1�����*�d�����|�]�5��q�q�q�}yZJ�[�@E��έj���r��K(��r��0H���r����Z(8Rj��R������*p��J��
*8X"���JlPH��C�8.-j�g�c��gF�"���31���c���`��&~�����8�k�C��!!��x ���"��.�o�ND��6�MJ�!s+ZZx��V�
[�+ٕ����GH�	r"�&DQS��k��$���n�a��̴��Μ�~��Q�P՛�K���'�Z�ZB�o�ܻ$篁�l���� ���Q�X:�Xl]�Щ�ro
H�څ*�{�)c��j7[,�K3#����Fж��s"|r��&4�bJc.@��ˢ$.��;T�3r䫽�N`_I��p��G�\6 K�t���Y�9/��,�[Z������@����Ng��ռ���~���:����q�S�x�L$�# P'&��慃8�5�0H^q����ht��*���w�u2>g�O�T� =D���7Q;�E��͞��me5��9�4��ȐU��Q����I�>
������^oB/ʄ1�>D����Ek��k�h����w-����^ȧξ�ͩ)��T��Q��~������������P]\��Q������F�DZ�8]@7ҙ\0[�78�K�;�g��7H��~^��,�_߶�>��n�f��4���a��%>�v��$,�~��:,���yQ
���N^�va�=C�1~Wbk�i��?G4�W�5������)�Q���6|۪k��B��@>���Z|TW�$6�����eL�e�+�zp���|��y��C"�}��m�8��-��G�}}�N�ʢu��
�K0�h��Eo ����9Yg��>���x<�@�Ϥ
��
�.�B}w��k�~(桁�sYW����{w��0��ܧK3k�B) :��GT��	kqL�M�:8=f��۬0�7f�LLv�,
���M�����E���S��I&�-�ѹ<u�ѹ=�!x����өI�6������r�Kl0�!��m����e
Vyk�7��Jt�`��tk��汁�����t�ߠ�Y����9;<h���J��==��u&��b�-��!���`E	Wi�!g�W�k�Q�DZe<�$�/d�5�X�#��P�7����p�&�lifa)�绉]N��W�Z{U%�$������j�1�;
_>�
��ƈ��4�1�ڰ)<4�^�F	k�.�CyT/�g�^]@�.�xn����ψ�/1�OQ�#N�d�`I��E�q�w#j�'/��J�\�v׳a�O)P���4�i�m9��t��B� �Q��*���;��	Z7$Rn��*����Y/�.�ӌ��_� �ъ���jhF�E i��� ��E�܌�m0�ȩ���cE���3�����|�R!
i,T����`��1�D*d�hxj�H+�	�$5�p��a'G�k�̴�
��i��>)�f�ʚ��B
8I��|�ܢs3�c�3Q�b��$rbDSE(
�_�r�c��&0қ>ȡ3G�3���(�,�=���ČQ��e�D5u�ɑ�4�m
�^g�?$J����H��P�>e�YSt���WI�ж�b}�W�˧��L�:���T��	X+�֜��%FR�}�b��y��$͖(s�u%u�䮚?�}G���J��N{	�(���s6���"xs�L19�g�9�V0�g�b���I#�[��OM#�VfN��ot��N)��9Km���x���܂����i#���R-$-OUUl'���2v
�ȯ^Q�L4ݕ������&�ptRjt}��Bs#�=1����%3���݃f��
�z')�W�<=:�XGXƒ퉨&F}A�:�����B�HЗ�̺��Ʒ���#�c+Բ�#���&��u٧‡��x���^�#��ܘ�9�y�h�<<��^���U����ŵw���cw�J���c�Ţ�HŅ#�oM�c�tI}��Ay9o��n�Z&�ǁ2��'�Ko(<)!��EZ��)�/G	�;����]��7����-�D���yc*|�Z����}�h��ih�� *
 ی�[�(;��%B�$�u�اI,�&�)�{o�5�C���nZ!��y
w"E�01P�1Kc͊Hp���s-���W=l�E�����b�o��0�
�<*b�Nϲ�WK�F��1!�|��g.�Q�Y|Q��?2xE��Y���s�-G*X\e3H�G�MHTh��	�
����e��]3���NDUa|፫��RAA'Q?�����Dgp%X�C�<碢����X�lcۼ$%�̊h�X���'`�O�(�A���$ʳFtϑ��U�pHJ��^3�X!2�m�A�P�h��.ng�_Uv��^�� �ށ��/�!�/�9���!bj׸(){�	}�G(Ԃ��k�N�
Ԓa����y��RAJ*M�ؓk������a̋����|��Ǿ������g����!K��-��[�!~
��![E
c%fK<��`�����Q)YSf�z~T��2�H���J�p_���s ��I�)O��&�W���&B)�M�
����m�U����Ɔ�G2��ap�fxoE���+1k�G�"KSx�4b�魌�,�q�}�a�����̞Hǻ�ir�[d�ʘ�+)���Y
L�<h\ի/2����-�FS��Z	��3�
?x��K �Ht-E5,�P�{kJ�h��m(H+��k��<�G����vbOq)SF��2�,=R}M��h�Uڻu#J�ut4ΦH�����O �4�-�"�v��a=<#b�B����~AKuy2�ߛ��`I�@6�s�Z^Y�(a��F�V�	EGgXW"H=G���K9�8c�r��ɹ�q�]����)^v�!Kz�3��yN� M���-�6�n�"�Zk�f�s8ev���;��#��8����U�!+�P�;x3چ�
�<���uG��K:�>X�����>xJ��j�����m5=�H���q�H�9UIE1P��3���Ɋՙ���;��@g���|TZ͔�2O���X�OS,R�g�!�i��<gb1|���Y���H_��lR)@��*�Q�zf�)݃��fo���do�2a�`C=�I�.
G�}�y������4`~�x������F^�/��#]�JP������8S
�S�g�1G��F)<.H϶ 4�4)!�\\�qߴZ�3�Szy.���
h�3O=!��&
�+��4��F%�pe�t�z��B�V�]g�cD��B�&�h�`&��:����@K����Tw`]Q�ąJ]�V)`S��K"����w7�=�^�K�`�8PfQ���{�
���$ΐ2�Sv����k�;v!T�{�j�	����U�&�_�s�>	�S�%F�هLp��u��w3���`/��I��
)�ʩ���ʖqU�q`���b��O*Eg�bӟ��������hö}x�����b�!���NߎS�0�|Ҁ�8N�9':C��^O�-':+�LYo���.[�`@�1o}�£�~J+�:��e'���J9l�*���>٨����/W7��g*��A6(3G�*����g��x���5�����q�ĵQ U�_[��qR�Q�8�j*���"o`��c���d�*ֽ�,Q��IM��i�/��`���J���̝���r���ܦ�(<w8g,qtS�v�J�f��l�~��V�Q�j���hE�O�r�����R'�eU�h���]�"�����J�����_~C�<�Y6U�C�_��s�pVl��P�[���kc^����D�դߏ10II�]W�TaTj&qJu�[��S�z��u8.�P���[6�M~*�;��6���p���K��?���D�N������{~	����i��bx��;�(k�EK+�qY)�'��1)g�%K_n`=�"�s���"E�9 ���9	��SD�T/�}���DNʼn��`�7�(��K+c_՗/�kqߙW�R$�)�n(��
�@���}�VK�!\
�T����a"���r-�c��;��lТ�fUڸ��(�BO���ⲙ�F��GBݮ��hKn
�ꁙ�����h�ݼ�������)�� �~�.�=,ZDJ>F�_(�5�2-T���[��r�1U��@ASL�p�7�4����%"�A�&��=��D��@�%,�����(��s<y�ٕ�s���������#�k�����{���3�� P�O���3U�e{��3���z�_s*su���5F�~{���h�3,|	bc�z��5�{�%�3ʻ��(�;�z_����:9������8�+��V�=�
*�~�V����8{� ߞf�w۶m۶m�{���_��m۶m۶��"��3g.�EUĺXQ��VVV���T]�W��厫`����ܛ9�,�j�w�.��鞡�g~+���/�/�d��_��q��w��z^��_X����2�+�O墈��yѪ���P�SZKC�e�I=@���=��bY�ZܲH/�I2(�P��A��¹��
F�$�:O"�@��@��,o��%�D	.NT�9a�fa>�Lz5������ڰ~{��`|iyw>�Ā�wZ�Z����ݴ�[Μ�,����鿢I�3���с���p����_A��O�ҰtW=B��$uc�Ą$'��gL4�E$�@5F�4	#U)zdn�7w:��^Zn֮-�hZi]jG*����Z�Y���YعZ0h�i{af�"��N���:�9����yއ2��[9��YڿդM`�y*��<���u��Ǐ���;���������o�G�:E0qI�5j�9P��[��3��+B�/q�a�%k��mD�y�U(~>n`�`������<����1�뤜0nr�����p���1X�m'8	�\r	)a�,ۣxl鰻�D��nl0�+���Lj��%�jj^��Ο��[��?�JKblˢ<@n��=M�5�y����28��}�3u�n.qS<uW_���Ɵ��ܝ��K�т���v�-K�y�hV�J�27�%��M>��!h��&k|�G�ğ��1�d����*[a�!w���f��`7'ZoH�Voi<�y��	e�Mؑ��Ƙ�sb�:o_�j'^�Z*���䫽gK�
�k	h�&�aa3�[a�\
[�a�����u��I���}�N���Y��Z�My�JgJ�����A�E�y�4�c�b7�2]_2�an§m�j@�lv����5�ٴ4���J_��i�c�c�2���1�$^��V���V�<c������?�
S~}Z<�R&w���Z뛲X�iN�/�ca��X�<Rr�~|Q1U!��DS����<?����g<;E}l�D�d�zR��\T��RفK@Ea[;��1�����r_!)��C��LC>��[�i�y�Q��3�T<֧5��.~�(u��ޛ�)S�T����R1���pk�C9e�	2Dm<��lx�L4ϋ'p��֡mi��~t��ƅMV��z���/�b�CU�����,��y�H@Л��JJP�������qw��Ƹ�V�d���}
|(w@f����Up�JpϏ����q{֩}
����M�Kd����(p�5�Qc���֯�+!���vOyj⮎��i՗�N�f�H�$�w�D�Y�����%p��‚�[��T3����dݰ�hE�*P�ZV����K��W1�|���ܹ��gz��?g���7�񜂧\��,��Y�g��Ɣ�D7f�,��z�"���o�v�#V������˅���f{����%a�"vl8EZ����h"�Ey��sU���75x�@��`ę�u��µ�j���,G�|�l^L�:z:�e�Cm���Y>Q�,�!K��P�`&�^��9]�t��d6.��e͇��A��{?]Q+�L#l�`�(L.8f4�C��di�F|�����P��2�KQ�ǣ�Q�4��$���2Ƚ,T�$�
s�f���nh�n��{�dzq�k��̏�_f��U�f���1l�5�%��"��&�s�7�T:ˤ����p��#���-�����9����}��
�D�;���<F�[�*��ۜ;�x4ۦ��6�e���D�J�s�i�'�#ۡzi��PB)��5���VA�+������QP/C����%��A��N>��9�]$�f*�գM���̎��#/~ɇ�.�׎(bQ�ƛ��'�N��5�[��˨\LG-�'��1r\��o��<�Wbs��/�jRs���ͅ	�x'iH]w���.V����k�&E1K��a���#j�@@�3`%67�����c���=�kF@;'{�D�$����LaVCa֗�}\�o��F��[���5C��{xq�V�{�47ڈ�缼MH�+Iwr&P3�����9��؂z'�<��e\�)E�tœr*Կj�
{߶^��X����;��!~�㙨̀���y�y0��+6���vv�Ї��l|�M��@*`K�,j�75i�Zm��>����
.�r�'�yH�*Q�)m���[&��n��G�Y|$���}t9���gp���V�y�辶@��+�D#*n���O��ϐɗ������T+�^��X.{ �H]�my�$v���i�1������$P�`��cB�l4�x���ٵ�G���7��V��N�L����4&c��|T"�F�'�m���Pz<^E�6gFU��%�W5 �E*�2l�nn4�͡%�K��x�	�ܔߒt"BU�!sq8�	��sT����lW��og��/|�G^6����l�Hݻ�}lʃlº$�iY�X�p�]q��(+�aE�M�����+��Q��B��M�ϓa�߸�5�4;{��J<D�V�W��1̄����'�7ΉuR�1
��Җ*��*.�}+u�|y��>ղzQ[���CtU2�khO+��F�s;紖VOpQ��L��BO�>���@�>-$;jzEU�^��>��c��al(ʲӼ��<$_Hs<�,����;v�2�8Ϊ�FS����]=��:w��7�Z~G.�bFGٔk�&�q�
�9?�Q�
B�����<)�ZC!�T�v��i���M�U��m�q�x�2�t��HO��7��X��ܤ`M�R�M�Q��s.�Go�J61M���5�Gx�d�8�;����P��L4N/ؓ��NcM9��h�˫h��ʳ���5	���|������$Ǽ����DO�ȥͪm��?y*]*�uPU����v����6Z;?��f�^̹�!�3E�_9���r���v��E�V��QC�FGf�JA�,��ʷEn�x2���̓d�զ�SL&k#�I�[�
@2�yz=̐�y�ʼny����e�n�� o����֝����R��3��
������U1NI�C�m�M]+�@	6��!��P�U��^c�	�H4�
���ר���^m���CL���We1!1%�Fo�����|ڿ�r+(�u���M�%6�ŹW�:��B��]���{��@�c�#�=�����in��F�v�0Z��x����6�Dm�z�%{j#]������&ݮ�FC���6�h�
Z���&Z�2�d���`�L��Ә俪Ȧ!	t����,9=7���3�z�Z���Ձ�eتt��L�j�λ,�������6�f�L�i4�hW�E�q�q�Z�T���_�I�;���W�]�~�O���U�d���;��6:��hj}m>�ߊ#��Jߪ,:fK�.�cǥ�S$�y�N�n�:���]
0y�bI�̈�;
7}3�w9	hK��݈"]EFw����ڼ���,1*�,�p��Swe1�P8��f�VZ^�9��Yz�ΙN�]<���k���n�a:44��Vi���2����!'ܮwhpK�,�R,w,y*fm���iG4Y7Ȭ[��(؝m�=V?}����@W��e�3�Ү�64f�߾�K�g�l�E��0�X���8m� 
fΥ��>�Ë��Z#�	vx��V���iU�q�,��ԇh=��tvr�	dj�y��3Y��8֭�֐]�|~i3�=��|�u�_=��I;�sH��6�4@����|�D�w�3�'p�z�rc��t�G���@rx��,W�P�	 �a�Oʈ�}�}F�~����4��z��G��޺�(�}+V��4�:R1k�>'��-:��*C��bW���ř2�Vއ�C�;����q�>璏��0����W�u��y6y4�:/�[��G'R�x���T��~��0�ȹY-�kO��.�[4�`_�jM8��L�^<���\�X4�P�t��>�ӡ���GGH���({ ����K�'ag��	ߖ��^�%�Iɬ��5��cΞ�����h�_d7��! z)E�D��/I
̤��蓗@��O��8�ߒF�9���;�~��]�JZ`@@���4���]�:N��hy��%����0rA�e�;b0�!Jh�}�ص��oW��4R��}��jţ�?�o�j�e	�Ok9Os_�R�M_&M`YC�Jz�k>2��Z�^�zZ��bJ�	�g;=��@Q��͕~if�(�bIG�!�I-��dM9�sG2���qa"S��LF��L�]ah�;�P��!2��Qw�akfz���nPKq��,UF͇IOVk������)f�k&���S��BPu�;�P�"fB����L�*��˅�U��l��j_�V��/���R
d�!#Xٸr1em��L���T
P]�[y
�˵\�Ǯ��k��M�f���A�7�qs��Y�e�iRF=��)qk'#j3aDȖ(#2�x�S��,g�%h6��N�do~�%OkE�2єL��:"��]�&$�Jr˫�)c��}x��ඦ�6�꩔W�Č=#�.���ș�%`6*�v�R��dN�������#"���Z-/�=S�ɩK����M'xj�:a�ګ�m�מ:D��u�ӱBFyqIm4K��2iMk��'S6ܰ[J
l��T���֭��b`�."}��{�����2���G%cx��$?e���OU�m��{��Gp��uT[�.�^��a���o��n�)[�}t�t:;jV� ��
�d�j	� �(���R���]҃y�w`�Pa�n�/G�Yej@�v�����
��5w����쪀�0�:��5憎Keά;��g=6�2m���Y`�����|�]���g�K_A PC)�[�\̈́_}�*\2��=���q�i|�l��j�j)�J&]�Xuo�}�ވ(����|A)@�/94ɂYA���NO����6���6�!`��G�(X\�.�Wy�-��S��!(2`����:�a8�U��%N��Ad�<v� P���|
u����K���;�����f�El��	��	�3�;Z�|XT�^��T����.�M����J:O��)�,�K��l⶟^9�F��"��r�C�>���"��P��W`Z���P8�B���PqIW
���G(sk_}jvzB+$
�{=�f�����Fʼ1)?�8M����
i��k�L�h���@�#��Q���I�[i?�t,E���Z�UE���~q{燔�!�<����*����<^$�x{�U`�$;"T#]z�%41�1oٽ�)�UB?�R�aG:�/��y��!>�5��V�r�;߄-j`���@�<�����6Vr^�8�Ė6�M�!�ځ|����{�^�D�_&�s>�As���C����N�<�"��@��w\Zk���f��>xC�J�D�$�����e��W5�S������+ֽ���wu	v�RA"���߽�d
KgUs,����"-�DaPI�DX��YJ��U�0R��;3G)p3��M��&���de�
:z[�0�%A���*�ĶMڕW\�|_?O�O7��!Dyh��o�/�;�7]5_'( �[W �^����~$-|��|1���@�t�V�Z)#ޜ�r����P��Oc@~9й�#�{6����R���zރ��L���h�l�t����	;%�X�8=$nb;/&oݴ3ow \�y�_�Q���ӯw���ɡN�Qh��w@���H�HZӣ���
��	hfnW��M<�U��[�[�%y���|\��͓���r��Ǫ̶gR��g0�M�O���y��E��a3�^�v3��4Ն�lh��K�WP�@PnڻUl�@
'{)B�������]"}C�kOc���'q!�7"�}�f�ř+�V�,�����_��Qxz=�J�8Y03,�ux�+d�Ь��[E��t���{9VȢ��K�z�2���� e/+��)�`�p��Z����la�l]g��֩��Y�߄�6q�S�j*ZVW��614��0�*����d<Q$ZG�4��N���0.����1Sn�!�2����~[-�޽D���[�6X�&�D�'_�Nk;�;�l�L9���%�&�:l��k���2^O�<�Ɠ�*�uB��\�[�Ch��i��)T<~[O(\�' ��>�`��jd�����EQ�Sʼn�l&��leS�nܸ'�8]��,{�r���L�5��z��J�/rȮ�l7�Ԕ�d�N�[ md[��I�'�PM�,{G�c�w������"Ngq4��	��82�BЇ>F3@=�Yy�`aϝ��`� ԏs�#f�ꛋ�Ǿ?o1�4��U�X����/_̐^�Br����;,��꜋m�7����dӰ��m�}C�R4m���C^���ٍPx鼭V�6�>qE�M�p��%7��t���tj����P�Ʊ�� �i���*�� 2bP��j,_�|�\>���d)��jH�zĵi�,�A4(�yI�^�k!
kh��H�ǫd��R��A��|�����U�Cg���(�I����#�������A�t+~�U�4mk���(�Φ��q�ծ�����NQQ�:�k
�2��2��>��J�Gǔ{�"=���ʛց��re�F��D�v��	tP'��������eS�MX�y|nƗx̟���df�3j��R6���g�kYh*?Y�S����9p(�tF��ә4��L����8�؉R���~�v��F��/�#/��o	��YE=�O�3�a�ces�י�F���9�28�TP�=ء��	($�*����_�h	���L���[F����	)�+8��RewgT�
�t�
����G�f�\y���Ô;ܠ�n�7�|�a������Dbh�Sx���sS����sx�l��qP���x�u�o���9ք�_��z)JE��W:��W��&nUb�+P�S��~l����!�-$cDi��HCQY��Q�L�3�~v��e�-k���$�vW��=n2��]�utK?�@'
du�qi{�[�u���z�H�.��p�m5���Oh��a���g1���r^cM�#�"��-��ܔ>���ᦜp.�D��F��(R�=T<�|�tD�gĢP(�WP���\�aW�k1�#i�B���l��t�R
6w2F���@��X���Ȏ+ ;���#��3oPSF�����ص<u�]iFWf��̈́Rݫ�;T��Y�׭+�
l�|1�|~�1�lJۆ��&�p8J��*5�&�wV�Ȓ��To�ʃ.���g:�M?��R�������A��܈V�B-f��%�Pe1�Dݬ�2�8��8�4ER��Iu�O�,S�1MG�-�f���$�&�Zܯ�F#�4�I=��ˡR��t��a�U����]�s�y(W/{X$�[��W�2�^d=Wܥ�+ؐ�*w�{r.L�/H�*��-y��ڐ���'��n��ϸ�IMÞ��"���?q.��=pNu�C6)g��x9ȴz�A�`��y��)�zc�N�o�mC'q�(
���cXՎ!��}'J��i{b\��}��OVi�6��y�L�>��n��#�`���c����ڗ�H����S���9?,�\�j��$��7�Wm	ᔨ�f��qbQ��w��l��h�H��U:U���s�����~��~���uKP��l�O�A�h�S����A�L���м�<�Y��5�<x���
�;�o�'|Lc�ip5��7��Yv�bO�C�� ����M��/a��
���i�}���}ϩ�W�vu=6��6t����*i�`
�#���},K�%��Z؆Vt��RQ蔆�\�w����Z
��£j���V�&[	Ui��������l����a1���(,){lW��Ӈ�����#������@l�X����9'd<���b+I�4��9M
�#86�AY�3k����p��ޔ1
ĉ��r���hig�n�5a�u%\�O��;�
��h�|Gg$;<c�?#�tFˬ��I�blJ��d.*]W:h�!��I�%�W=8t<~c�4�Br:d�I�P�%�	���%)Sβ���W��sK�Լwgq�8�g��x�v=?���ժZ�hH3�q[��M�K����Apo/� ���� �P�Z#�PQ��bz�1�-�ޓt\c�w!�դ��x����[=ďbq��-����Kq�n�5~����u�a���3��7���L}[�V��"����5ӟ��-Z�w�_��Kt������q[C,���t|�p����c0�����K��'�`��K���q�C�~���+���J����	���=N�H�\Λ3��{?~S�L��n�L�M�P�x�4���������d�3���c:���P��go�*"�Dn�̄��V;��_�H��qY�yU9������fr[�ܼŹ�|J�zy�م�����Ϡj��.ccc��՜A�����6��>��j�ݩ"�L��c�٩tU:�;�.8Y��_�t���['��U�-��VY`b//0;oZ�ٔͬq$D.�,�Bx�u
��~�Y���I�h%Aq�23��	Pu
��KqgŖ.��0=�v���u�J��.�\�ע�h,j�$��h*�NLѝ{��d��$ݪ�-��(ߵqjNe���Q��X��~v�D�–7��m_B��S���+%��oO9���7_~��a1��J���H�j5-�4���S:�߲.�j�����ఄ�@8�^i���O������j��1�_�]�1�N�G��F?�����]��M��w�fw=����'t]�}՞�e6�M����M�x�]`�q�oׄ���:�¨�/AZ��nn=��3jB�6}�a��F)5�1d߫*R�g4av"�T�h�7c\�պe��C�+UA]�C/�����ҝ9�Ns�H�=�6����r�8��"ld��j�)I�G�F�k��’��>�a$3e���,&��/'�,|r�	���_�rȋ�,�x��1�)1`^d�"뚕����j�jN�L����x#9�^w��Y�4H��E�RX������dI�XQ���L%��nl�@>�
	�w蠮H�9M�\��=�ާ��™B��)X.$*{�r�m��;��V��ɿ5�hD�ߟg˺RƌB�V����
ޅ�6��\>�ʢ�TfV�&<Ŵ��f\�iR�f�%���K��	R�
����B~=0"�Id凝�tgn�B��6�	��V��׵u�P�w�����%���a��\MQa�_�<ʅ�_�S!!Q�-�E��?t����I
>��T\�
��Ҋm��

D�MFC�AD�M�����3Az�%f���:*�l5l<6�=�d�� ��1��T�"�EN��t��3g#5��n��.uG
Sm�r�0��n	dVL	Y^�)K~�tT�u��bE�l�%h��w����1�D�wu/A�Eƨ��v��e�Cn��%�&'�͖��x�&���#��adS1[��(Mf���g��D��U����<����s���Hڷ���"[&R��N����vU��u�|Wi�	S~���c�77����q�z5���g�e$�q�g�d���TA�ƒ��K]��D��v�ɛ�~n,Z_u��턁ފ+�!4��2���]Rn�M���Yv�H����þL2d�����u���J�J��D�Y��+��$Vs@��#�*Q����ql�ǧ�4�65�Z7Z~����7�O���$���h���؆�	��46��4���$ʙm:)�Y�v��;)����n�ŵ�Ǽ�V��w�����IE�\�����+~4wp�?�����Y+^�o�P�,��Z��9��X�TVu�(���Ҩ�U����7�>��#�3�f�س�3G���Z�g"_	��q��!�8��m�j>��!��`�*�3��(�k��nQ��	���*ȷ�"�UJ1��H(��J7��0�w{[v�Z�Rw��^��>���?�%@����;��E!g{Wo�D���\p�jgkds|�2��M];���DB�	�G���:{���-�)�>P�G�M!M:L��z
$c+(�F=p�ݤ{��e���J���z��~B�d/���Vk
ٹ	*G�R�)O�j�H<aW+v�S\��(��DW�MPpmT����B•TlG,	W��03��q�h~�G�N����%�;�(�˳a�ˆ�p��P(��@�N�K&��ay��Q�J���]�X̐Hg������ȠĽ�%u8��4O��XP����'�sz&+�	taɴTu�QG/F�IFi@����V�
?�N�n�"�q�fI����
�Lewņ�e�-U�m�o.a��5��x�v��D�z�z�њ����tq�����Eh������.?�m�I��
�rލx1'��#�9��
zr�:_P�(�;��=�xL+:���UAP�p�&��r<���}�\5��A��.h�jͥt�q�[V8��V��j�n�E��vO��w�9�ОOܧ=�bO��;�߭�#��}
=C����4QPn��?R�Q�_=Lg����R��]^�H���m��vE��1��$n�2�L���"Դg#~B��f0�l�[�����(o(�<��+�v+�<�T"$<�m:���C*����v�
�E�q}�$}������:�{=�;¼�U��K�!�q�i�+oa��`���/�L�y��}ʤ}E�LQ�(Ih���n	�ϋ�~�4|c.�6����1C���>Nl��К�g^2�1~iH��,z:`O�24�#�1�W�
6zb>�FsZ�H�?`fO���dՂr<�-�~1�\�Ԭ��<�
�x��UW�W>��*O2Umc@��ɧF^L����Q�r�fq�%+��t]�p��1p���b���4��]��r�i���Ӟ�
ӬJ~��{��6R��4]
��Ү,P��+J��|�8S+�%���Ž�P��l��s��c��\�c�W)R�H�[0І�x��z%�3�iN	�4��p*�[�X0�21���(o&
R���k#}&q��!��k3*�Q��d/n�9q��	4q�Q�Ϻ���@v���3�x�h�x�x‘2$�.�2�����%�iE3l����,Is�]*�֔�)PboYƩw}5e9v��-�E|.�D��^�!��ӯo����yA��q��E�&�q���հ�)��)Xo�[�i���g�E!�	#U�V�s���Z�Tg�-��ӭ�3��~�#���@t�Q�Z���ADa�.�5|CX���n�-�V��(�P�P���ց'*�X����V��5��Y%+|�R+�z'�"j�v��$�q���ͭ���)���a^�L�>L�+�d�.��R�ҠB�[��d�7��X��3��������*�m��LFkv�#J!)*�qۯ(�v<8g�[q����6CI���3�`8T���l�O�hsd���"���_��!�O�'#��5,�H����.N@I�	t����Ȟ���gzMj~�u=q�X��'sƌ��Ĥ/R�(��/��EK�X��^�i��b�h	~�
n�n�놣����q4�����O�9��]��?�1Ϲ�I�5��Nj���8.����r�P�	w���'�V���b�#1u�ɳ����=��K�+T���*nɼ��Ǟe��i�wvX�y�_|�O�����ez�_�G��������(l�?ҿ��Sb�Eפ;0��cQ�������l�PސGQB�37[��R���Ք������lTE��ϪʜD$� ����~���ׂ�`W��<}���p9�iz��ky�㒠��5,?��Eԁ<��wNP�?D6���:��v�e�a�
"9e��֫c:����E��V���@�Sй�n};�?���b��|U����ð�m
.��L�Ž����׾�c���8��F��ղ�
Yo�ev�@�ܱ�N�w�9Ҋ�
���E�/�N�7�\m累�!LO��\X�S{��\5�4�5d�u2���+��A7�3ʳ��f�G9!ħ�֘��`�	Q�2`R yx.�%�}����0�����G}k�^u���7n7�m�S삎�0�l4b�+��u�$=�4K�<��	kH��Id�zԲ{̫d��b��U{IV
����$�$,�Z���8�Be�P�_�?E���1��t� ��j�_g���I�IF���;7(|0��O��$��H}������#�'���ƒ�Ƃ�����������0�f�ǥǔ	�?��P.�R`��D,3@_`Ɵ6"4�mS�^��;ŗF�z��wш��ڨ���Ӽ�.a�g���kc-�=xazh1�F����3J�A�p|?��l�	�;�y�*E���yX�kvE��TLmL�U��s���1����a9o0tx�i��J ���"
�g�‘	��K��@�…��})d=''7O���*� ����L:��P�›���u�]��\�2Z�9� 置�]M����L����LI��s†ҁ�����՗��duj˧���0��	����Z޻����!|��(�>ٿ�Ӎ���?&���
�w?[�������?Zs���d%T>7p`�
�S�&���*�t�B9���Eg�|3L}�QFV� ��ox��b��>����hOs+Q��í���ć鮗�?�~�jc:�@�i�C~a�5`���>Ojc����BE/��i�ء�؍���H�eى���\"�gb]���]#��E)�
!s��j�%�tIdai��N�J�u�s`�m�
E\�id�Ӽ��U��YESq��8�y��T�䜮f\�^�p�����8@�WG�T���+3���kpG�����X�0[:��5n\���`tq�jg�������0�#���t��V�6{��Z�u�`�� �~N��yj-��^s��X

/q��q�.!A�VQ�E���i�����l���q86�����9�a�`�@�v�aVK��J�~�D"vdy��8�|�?�j��-2���.)�_��X�؁�r) gU@ϰ��|��a�o�Xhv��d�A�EX"B������'�f��KQ�5$~A���4���ʓ��Z���9@ᒢ��0�VZ�f{kkQ4��5�OA�!�������g��G����zߤI}�!�So���wl�!D��v�lE����>�r����F���¢"��F�r�nR�"�3���$;�/V����"��-�l��{B��ܞ����9�O�a.=AC�t��ɴ��)ُ���5@����D('yhU�����MD�H��l���˽�����'|W�{o��w��|���!������7�d�Ź�v�]����s�.d]��KhB9/�u��]LjnE����y���䮸Y.�M{��,��vP�c
X��������v���U��CM�n��r���۽��Ir�D�L=�J���ŽB��_ 0F�[rx�fyډ���� rD��Ϛ����6����~�P,N�p�;�hu�
֭v�!��Tf�ȸ����v
���0���ͦ$l�$�M+S�c�m�y�5�
�|�n�=�P�M�SJ�D���0	6��|�-��,
=��ۣ�f8����w��~�h��{�g8����EO��c��D�����%
��,����N�9<��B���#n�#p�*�j�(ǻ��
��J2��g�<���q�N�wd�%)A���0�d]��o�p�
�f�K�����2���=�S2OK�G�G�Gr�e���X�P�	NdN����E�4̗����G��ͱ_@@� �?��4t�36u�g�ߵ�_��P��]�毠Q�t�V#|F�P���Vn{Q\heR�^
>:S-��_GA��~r���Y�%�N&��'u�^��z�x��ŸB�T�S��`���ii�5���4�S7�Uw�b�X�U�8<IV�S���|�B};�SkvTV8	Sm������U?�1n�M(�E�	�r��X����j�+f���ۇ�93)�x�e�=�8n6�;l�^L���\a��GŃO�X�u��L�$S��C߈���`jz�R�4���s��]�F傉�]�]����$��ʁ���'����B�#L�Ʉ$RQaf+���pס�b��r�(��nj�'�6%��a���άr��]��g���-i��+��h���9ť�Y=�I��n��m�X2Y�ˬ�%���9X��^��ϗ����Vl�y���1�*_�ïV��j���l�d��2ܧ=c,�j�ڳm[��c�A��?��wQ�2u���d���^r8�j�E�j��H*H�*���������駤߉8�0���7�s�<���6'�m���:+��1�?8��ʎ^z` *=�j�0�v^�ݿV/$����T^��|���fQ���y �ꊇfȈ������.����\�r�)sil����)���G��LJ<�Zm˶Vw�C��b+�*
R>^iS"���}{]���S��k�#��\��v mSi�i��u�V5�bh����$R�.A#*�5]��j�

^�������L����F�ޣҍo.��u����p7`،�W�>��
$���{0J��%b<YB0�A�X�"ǝ.�=�"�2U�����/��C.�fa3GJҼ�������Wf#���?i����:P$:�s����jzy/,��l����Ͳ
E��H$��
��S.*�^�l@��,���!��:8q��L���T
u�UD\�
���{K��0��,v�ϒ�h�����GW&� yq��:�~�;��ڏ��5�߃V��u��û9: ǻY���*��VŻ9l�b������ �ksc�v
]_+ח���FUkԁ�F�9��zx���X;H��
�r���e�9#���5�n"j�>L��_1n&A�V#��=��d�����]���w`��h8L�a7,�~���~.�el�ý?�Bk���:���%8�@�>�%�� ����%��_�4���0׍�ܦl��;-�;y�bq��M��{������T˳�0���;J?"lK��Iےu�����S�L�N�2`�8b��JA.ȿS	6�D��^�A�Iձ�p��������;����W_�vѣ|.��
�:�js	?;����~xKQg���r�O-y	��w65ܧPA�]P_�qQ����:���
��<����T�8�1vs&�]�������՗nV_[����S�<��^�w�ס��|a�+����c��F$�լ�����lɛ�e�|�qd���V���F���|�}��������*�Tᛷ�����4(t�e�T+ae�y��Ql�*�+oA�<҄�4�*��p�������&p�G$Qj�J؋��\X��6�A�|/��q�)�7-�61+q�Ւ:
3�7f��h�*Q�����I)��|[��	��T	)��e���J<����o2Y91�j�=�
h<���|t�)w���צ�|��|4lmU�e}�;b���Rw�5,OP���<6w掝���������g$x=�`����Ai�fk7k�ɤHͣ�s��2��{o��s�kDō��	}�ഽ���Fj�[^��}����_��n��z��%�j�qv�v��y��;�a|�|��!6ڃ���*C9��FN��@}u�X	v`R����P�4�m�GGoR8F�]u1��x��ϫ��_D"Z8s��
�{��J.I���d^�TvYV�{�u�OU����W�oר��v�.��_��?n�U:��ވ��7��N��\�������9@�~zC���Լ�T�#��.�zf�M;�4,nX4l�4g,��b �R���q0v������G��j[����{�K�D^9�3z��ӧ�L�Wd��y�m��)!�(�𖱍ˬc��Z�����C�_+g��M)��t����
�T����m�P-�C�ģQRYxԝ-�<��K�5ز�ч)5F��ֹA�L���������q�[E�ɧfa��5����KN.QΔ�_���}рUIJ-�����8pI&�2)?0M����ߕ��JA�Ԇ7�+���$�
%�K��nsI���Q���kC!��$�cw�IJ��!��NG���au������Yj�vb>�q��v�)׹MjT�7}�	C{c8�Z��=f��{6S��"1��޴��+B�C�� ��zN���̨;b�ߓ��L�-߃�^�j�i'<������8'��������u��v�T�+&SŜ�gw��I�����3k�����۶��m���mv̎m۶����:��g��U��s�XUs�9Ɯ�k�X������]�
���I��x(�����癤���s�˔�̆�GtW�6;V��w��D28 �xXy�S =���"�
���ܪ,�I+�8�@��F�#�,&���U��P��M��$�J(�P��n�$N�2��6ɐnA;��H�
�x��l����7�pݯ	�k��*s/�p��(�\�������U�2��R��ʎ�Q��@�+<y�>c@����*���$�M�h��ܨ�Z�wߗ�=�l�I���N����L*�Qq��MP�?F)[C�3T��7ȭG�w��G�r��˝Y�4Օ����M-��cB�����l�+��"�0y3e�������]��''L��"�����"5��4F��oE�SG���j΋�}�5A�����Lu���"�a�բ;NX��%=T�Ȫ<EJ��X+cUf��Bw|�揄���46npc�y.��e�h,[x:��ԕ~�;)�hw�����W�`��!ɘ�Ti2���V;�P�c����=wM�Ɓ��bV��x�L���n����d{cn 
�K�F�6rh�E��!_�KW"������τ+���Z�>Ɣt�'��ni�,n�+<J��
~�)d���$��X����[�7ndY�O�S��CU׽8%S�/n �'��-��	u����oH�m�"�a9=&�%�.�R�B��������*VB�Ȉ�tQ�/�N��=����g�E���j͸�#O����ظA�M�*c>A�gUlo��QR7DN(�#!(R�њY�Q��RN<|��N�Ì'mt�ur�dj�%��u��Ȓ%F���霐9)��#?ٵ�L��_yf�X�.ig���u�PpEU?sJ*��nH ҳR���q�d~�[+Y̖?��fa&aÂ�X�,�`�̤���rāU���x+a�~�g��J�Z��k�qu�N��גx��Mf�#HY��[+�9�V*rT4ut�3<���{��1ظcj�u� yc$�.v*�Wk���@!)�5el���]��z�'��3]�s�JS;�N^��'`�Ǣ|m��=����	��ȅ�ڼ+�t�?YM+
���l�Q+�Uz�%�yM��bm
���
�䩯���墚}[���~RS�@�˖�-,�%)]l2���Tcr$��<<�=jĬ]�)�ۃڴ��U����aew�ܝ��mS�H)�'U�)���^M�F�i�>���H@��{�M3n^�[:_F�miN"�}�v#�EX�>SvN�Ev)����o*��D	���{�a��*�_����\�!�c��TЕ1��\�P(�����H�Q�Ih�!�Y���4�mM~!��)�Aj+�1��L�7A�b��PO��ڡ'
;'<��x\��l�,|ܯ�8� �ɢ��$��#5�1dž8b��5$M��`��a��d��9��%�����'���X!�͉�'�+����y�'^hk�FqlW��
軉�Li�-���cl�-��ߌ�$����L����vn6>VE���$�U	�h7��j�O����6ڙ�[�J���U��HxwsG��&~<:?��l7qb:K��*Uin��D(�YRϪ8qN��E�Q�5{��ݠ/->����O�x˜�6������.��a��NM���I�TI{�*�a���e#���T^�Y[Q$�I�\I��ZXM�p�,�[F��f�/-�)�e�MCa���>�W�
pC��ߋ�͘��3��J[�8?4��} ׫ƫ�)&OՆ����ÌmL.J	᣽��z֗�r��w$G<�/D-��t�f�]��4���
&�X	$����m�R<���)�w{��K�	狇2�YEZ�@��3~���wk��A�@b.p>�g��(����� ����I�_�P%��ER��	g���B�AiG8�F����L�xx���7���L���_�>̇X^})P}���(�����c=���FSN���5�����Pƴ7���!�I��h�I=4���XǙ���Cd
G�W��ʁzQ��c1���В�`Ѵ�� B�	q{2��|��N�G���Sl���.C}c���1�)�1��]���
�[<��7��)�A�41�{�
'E8������@��-(��Dh��
D1K+�� cTw\��0>����O�o脭h�乒����b��@V�g�ʴ$�yL0��P�Ι��
fCb��E(*D��~�z��}�,:C�D�y��y���v���|A�E�U0��,�I�U�d�J��E)�H6��T��W�eL��(�hF�P���+�wb��W�Ea��,�
�.k�cִmM�2�dԪ��h[����Ɛ^l���>٬���/���'���B���ƒ��i�Х[��V��h�ٸ�V�~%��䘉;�ײ�QmzB^G�+�hڶ_ayšqc�E��c��f�
��|�s)� ~��V�ب-7�n�E�vEa`��Ī�n~���`��ѥ���c���AW�A''X�W����l������5z��[y��R��Sq�e���V�Vv�Nj� ��a���|�n@�rޡ���MY���%J�9P.��j�W����&`9�!Q��z��m�X�c�J�O"�;MU��؀�K�9j���d�j*7)jC��|��z�M�f�����'��l���I&F���
Dc@�"_u���c��^�"B����M�`ޔ䎩���\��	�����§cdsvEƒ�;oW;@?��&�5Ϛ�̧$��8������V�=S���^�J�WS}m�;�.Cl,�Y��r�BoJ�w��=��Uz,�N`�r {�Z���k��A�t.�T_����7�2~4m�C����yG^AI(ǂn���qek�|�\Xf�L�����ʺ_t	�<��P��'�|�-�6�f;g�*r�x�]g�9�á��5Ykҵ�;Y��|P�3<�{��k�Bد4�t�'7�}3�u���{�=1��ScH��0�iOV��g���&U����j�)w�)��{DZZ=�ј��[���8�
���!�����"cT'�fV��o��"�0$0`Fh�p��A�$�("�FK(@���蚧L�V��F3�����Fg�q��|��(�\~�\
�:�\���S�@�lm���vtH̢ʨ�Խ�F܄٧��u#�&겲W�/�J���S�M(�,�V/+���՚���O-���դ�)o��
��en,#�I��!��Y����;Ψp�Y�ӕ�o�����cX�0�$��ؼ�Cn� N���Tg]E�
�QI}�Q<Z�;�t��:4Ƞ�_�!��=Z�	)4��uT�Q�"����bU��Rnh*;t>W�� � ��h��
�҄��Z0��R@bMlx�.*u�8d�ǒ�ٓn���WP�e-%�B�]g�x�h�`=�/��`Z����(�Y(�H�8���gm�0q�#td
�%|��<.��S���eb:�����=j���S"��w�ֶoo���49�����v�����I����Q�5�a8�o�^*�]��Id!!80����a�<$�e�6�����0��Ỹ$�kK��fq�IF�h7�
0sMf��A����g���}��̓��#��W'��Z'1o���
2q�ZB�\�}Z
��w� �"v=�R���џ+!_��
�E��wG�ڎ���MC�}�љ��f����c����q	�	��FѺ�7}���**��/Q�j��8�}�x]��Yѕ��#O̩���dm�]�-}�.�=?���\�p����r?"�T�3s�v�A�a��>�~�Q"�[�[��Ź�7/�@�͍�C�VƶV���wy��Ӛ��yw��0�pRQ�<���Ȩ!�NF�b|�v2�n{�B�r�á�p��:�_�]�۳ߩ�Z�����t��z�z}�_�!�D�E�/�~��I)9q�+G˰�rR�z�[�"ٿ1�
$��Oɮ�s6Y�A�1��%N���o���f�UsNNɀڍ�k�Z�^{�	g��D�phDe�dp�qjd�;�l3ߥf�a���;C�/�6�S5�rS
2�?�
JC��ky���/��p�]�0��Q�b'�`����W�����a��dnZ�B�g�9o�!�`�oUi*jrd��2R\�/fq�FciN`���dN䟣!:�1!�[��hI�=�:�2�E���n�7"�񚳔p����F��Ζ0���	<��%�7'��7O���|5��Gћr�w�}�m���q�_iir'�j"V����&W�;a�n��Z�x$�(>�3	�(�3�6��B�h��%��.��BS�M����oqp3���8�b�������C{nX��1
+"yU�%W�d[���f~����=�%C;v֌�,��q�j��b2G��<��wJOW�R�
�&�~�t.N�B�{��f$��D[�I+��Ɖ�Ӊ�
��� /5�rO��g�Kk\F�9���0i7�n�K�y{^t��U
	g
���S/QY�~{����L�\
��R06��kbd�Yc���e�����ʡ���^u�)=��H�6��b*��=߅��P����ΨN�.>��iI<�����OQ���h�3�d\$�܌l�������Bg�L�3��m.Pΐ��՜�5Qd���Z����e�xe�ȷZQ1�B�w�"��R�X'g�\~{0=_}a
�_Pr��I�[�N	g-�2R���u�Knk�)��!]�������F8:ו���C��z�g�y,���#
u߅��Kƻ����2]}��p�����귡H��]	=uz� �F8�bV�-Zl}A�}R���/3�0\}W��f[��_o�v廖�g�<}oZ��J6��Y����Z��J�NX>弘1|Fol�.�X�!�!wM,W�p6��A�u>nyT�oF������}����5���cˁ�f���St��ߤ����<���T��33��pt5��L�|�~^�rM	��OPQ�L4�����f��PTl���{sT��(LVi���m�B�G�$gfJ��'�O�O��I=��G\ �u	�>���62���q2��$,^��Y���L-��,���2�v^=����UZ�X<�^P����4Օ�›o�v���Yrq�7Zl����wn��I�8��"%K�Z.��<uM}��hS�Ͷ,��/�[K��ȳSX�p�'�I�_a�s`�6{&��͖t�O�i��6J翳�h��Z�K�n-1���O<�U��J�����#�ݩ�E�:S�@��a�0�W`'?x�Cx�7��؏����Z�.�X\`$e�nXp��K���L�J��@���6�Ihf�uԄ�9!D�z���)���3��*!��@�0��z=��9S|�Pn`�@�);�$�u���|v�"l�g�Mh��W�R�p�%Da9�Jx�~Lܒ�: t��֯�v �/k���g��i�o*�p���ט�]�sE��706�˷2؝Bh����nˁ����m@&C����x\�X�r|t�&oX"�d��`��1Xf��)v)�lʬ�Z��5]4�5f�D�g�����%�H�\_�X�9��0��{�¹Zw����}i&:���*&����v��+�&NA?�:}w�P8>ղ�(�a��U��ߝ�R&���b��H�L��N���l��B�U=cr\�ev�`��k.I���Q;fL
����@�=j6�f�'8�3i��S��!�셫=��"[���3�N�	`�H5�Gzި�%��A�\��-5Yf5�C�E���ARǽg�,������f!����O���@���O2�T_h*^�?p�H�ͱ>�l�+�J2lqpBh��[��Ҭp���W�4��25j�����R�%���N�� ?9�h˃��.W��}�zƴ�=�����+Q��d���$����t��y{�)��Vc��U�|"ן�F�X*��)	�
���{��:H�eAC��.�A?�DIftC�;�\��R7lYa�TRCj1�?Qt�g����X�#�W���[�@��	�0�����嚋�����P���@ڋ��
-�
��%wd%nb+Z�>�=?��S�s��6�`{�~	���("� r��[�I�x��"�,b��.�� `˿Q>�	tP�i�SGA�9��8�Z��h=%9q�;!)���b{RZ���]W��H���dGW+8�y���hr�q=���#�wz�ڶ����Ҫ����ኽ��ھ�+xSYr�씝z�Ü�zw��M��b���"'d@+�*�]q���	%�d(=�$�#"�Ht�9q�@�t\�T�+}4n�Ve��[ƫz�
7��N��i�Ɂ��t�!=��x��w���3��K�Y�J�;���[Y�n�
U�X����[X���÷�Q���v�B,��֚��Y�kd��{GH5L:^u�[�
0lA�{0?�T.B-J���x����}є�#o�B�Ҷoƺ�&#T����[�-g��.u�>���&���L�{N��o�K���/\��|/�[�#4<�:��˩ˑ��������ճj����V��	�]˜ft�E������G#m�{n~�E��/����w�	J�ŢWZ�t2g��=|�$vZ׈xSU�z���X��������GtW��MQ��f�	#�����!�~�g�9��~zY�
��y�Ϻ����D�h�lpo����z�]��8�[�I���jyFޮq���*cQ�_�	(��@���V��M�Dy
�!ׁ���S��L�r1�?f��m�� ��K�aK��d�e�
��t= ��(��&����I�=��OHA��I���'�\�k�
a;���z}��+��!���׌�ؿ �x'��Q����ԭfz�q�YZl�fȎ]���ec�Fut�N��yF+���귅/�L����o��a��k�v4��'�Ǔ�.��o�|?x~�ЭP��ۘ��O��P�����ί���.�`Dwzr���F�5�Q*�"�7>B��RH50
�;J8R��K�"�r����l�"�d�bk�I?��3+��7��*�s��h��c���-W�e6�_~EcH�PY�N�3#`�Ks�@=��|O�XÝi6!��R~W�
����οI�W�bʫ��z�cS�tm�[�ɋIDY�����73C���Xñ8H~�j�n=��A�Em���t�C��Y��e3�;I�(x�3�!�B�i�L�V8��f�S6����<�Y�D}!�Vp�[e��F5��+H�A�#G ��+P*�ʗ����3�Z�&L��+�&痌5z����]	�k�)OΙC�� �� n�Ж(�M��}����n�:[��9��;a]ld�(���ܚ^o�g}Q�f�̑s�C8&�C�!�V��%�l��&��hJ�l��NS�yD�W/��	�I�/B<A#Jd��j=��*yg�,��G�W�4�f�k�����&ۓ�tj_�0�6�@B�a����vN--}�$��r:�z�•��b%���$��:?q>b�qi�|�,*.1z�C���6˰̶Q�U���=��.����)�GM1�E��w|}��cA)�|N vw_�[$ȘLJc
��9_)W#dd/"��
�LQY
U��0E�ǿ�Fܕi�ɿv&��^�Qp�G�-4ANqCe�ˆ���X�"�d/u;3>\FZ%-f
��d��Ȼ�,?E��zW�����}������Ϝ����m��ИFg��$-��`$u�_��&���1��pP=���}Z�>�gQ䖮�C���嬫Me��:�u���v����4�b��4�z��ݾ��e���O�+�0���R�r�F]_�0ۜk�'mR�Q���L��ֱ�7��l��<��u���)��S��{^����0O�!�n�7����9�H��:��s����~l]Ow�_��v���)1��<��.��^W��;�Z�?��^Pã��i����^�pSb`��$���3��d~�}/�M��d����ph�����~�t|�.�1�ޗ*��P�igt�|wАx.+a!\�eIM�{bK�)JtHO�҄���`
�O�`y������U>����x �\nu�˥���*��/�1o�?or5�j+Q{,�[Q
�q
�� �Q�y���b�D��f���o����a��\#��~�i~��6U~���$?��Í�0,L�Wf�}�i�X0��!�cW��+R-Z ��'Z�{Ǽu5ۭ���m�)l5lA�,�v��r�b��ߪ�^�_5�^m75��ʤ�Uv[��:@�e�\���Ċ;d]؏�p�I�1�T�_{���G�*إ�K�%��Y˼rK�!58ի5��)�X�~��:��(̭[�����oq)���n�4e9P�Q�,�]u8�gY����~��=P�9�kOhU���|�zy�J���(S���J��i����ʒAtq6f�q$�)�<���97A�2�e/X��!AR��ۆ?̯h��̆�I��
�V�pIM�Oy�ѭG5�hꨪ�b

�;h,"��ƐD44�{W����Eqg7����Av/��~��%	�Mu]x��J;%.%6R�?�TL/0/��[��xbr̾�e�Y�Y2�#�!.��UL�69��	�����MFo�k��S��ŷ��	e.5�|�����J{��1�؃e��M��*�˨�.�4L
 ����!g�u�����ߋ2��$#6��?G�e�C�lT���Hk�If��ڙ�u��(�r*:��2$��0*5r�!�Y[�k�ߡ���pRx�	��3xy�b|8�&�g��f|���f��Ƃ�?�z�eE&i��T,L���+b�X�d����X�G=�E���[i�͌�E:��1!���:W#El��O�w�NV��'ݶ#�����d�e[�6K%�rUg/��b	�JKŚ_�Q�q��#�*n��6��v���sY�sk�E��\�m)#�?��F.VK8Ĭ�Q�ݞ��xM�E�I#�����Z̙@�^��{̮��{.���-n���n�w����4�0�&��N�7h7^�:O��RL1���-Vdw��δ�Yo`�Ek=$˹�~ؑΓ�kڃ��mZ�^� �,�д���&1�1�5lzSmR�2�<���$Χ/g��2�tVv��ٴ/u-q�&_Hi��3q�)���U�䧪�~׌�7)���b��Ӈ;��f�ޤG�azٖy�+���d��Z
�BN��ç�r�����lBgU���ɢv��i��1������j�F��8�<�#���=�v8-j�
��:%r�/!FrQ��7Ι$%p��ˆ��7ϲ�u�+/,;@��vd��RZ���]�I��d�]�f�΅�3$UG���&S͙�h7'�9A���]K��=S�K_�pRݲ����T��n��DQ��1��j==o`��u�H�M|ғ����o�c���f}�g!��\q�j{y����bj����+�-j��c8���cV�y�E�A|ʷ�0LґtR���D��GV)G{*v��BW��UU{ɒ ��̺�������M]�޾���2�����i�h��K�֛��|��	��=��-�[�� !���J�3��(B��`�f�lh�Nk�M?�o���xJ�3�?ފ��
:�hH����EK~t�K�wp�����V_�Ÿ��ƪ��H*`"_���͊x��V�����ax��}��U�ܖѽ#~�`���𣡹%�����arCJU�N�9�l�ԃs\����ΎQ���((�}���BJ�(#/1|G��PB���%��]R����+�4�T.�e��50�q��_��C�A����J�H��?������r@���矤��[����KZ4�����������;���u)�_��<�9��	��.y��
���<��������j��d��0Xy(d�Y%������GB���L�˴G�}��A�#�5�M�|�Yr�x�Ҫ�2u�cr/�vE�d�Y�{pK�Ho��2��-a�������>�yE��LCvf�7��N3,Zs�.�;��f�BC�G�B#�@�
^�v����f��z�̲%�.[�_ &
t��,��W�WS�������\����6N
��<��l���c�?�&;�:�#�,�*�qK�����.�rҨ�q��I+b��b���iE��Nj:Y0Q���Gn���^z��`p��O��G��z�c�[f�16�5���d���?ִ���#���n0�G��Fݧ`��4��6��ԋI�X��*~4:�z�--V��� d�	�:�9�#hG%	�V8^���X��Ia��O���~8HL
�_�v��z��U��6���O�HY��Vn�
�`H��؝��M��H��5:=i��5�����h����[��LUW,'ط/"�G�R���C�
VG
j$�!��qw��?B������Lt9~�z���8��H�I��}X�����A9A:%�:.L��,/t����#�G�&*����4�]	Hv1��r}�5��Q�B��!uR|k�9�7,`sIl~�2kmKbO��C�
r�7Hْ�7�>.V�d�|N�,���^�H��!ʙ�HC'�%qw+�h�}^��tKd|w��C�u�0`�S���ilT���=�2`2�g��)�@HND^��mZ���UK���?PF�3w;����m41q<`���z"ͮk	����13E�+��ĩ=u��gI�Rw�����o<�7wd�� !*���v���Wÿ���n��+�<����w�6�5E�xan�HzG��o��P�/(=�c��}O3�[|Sw��s�0w��Y%�Q6���8Xܫ�K��;��ה���4�`�ُu���#��ζ0}'����n�V�t�+�C!�k'껑����?G���1�_c�2��YWX���E3+-�Y�|ie��� ����ŔC�N9/P�V��]�>�Pn6��c0	���ׯ�생��/�ڐ%c��n$"�������k�	5y�2��������,O*���b�G%��*C��|�Ěka�b������3��vz�rj:d���_iϻ!��:�4��R���F�.ж���Q���q����̧��|CRUS(Y�U�D�Tz��P~�P�����0.b����T�w�/Ѳq�yp��v�	;D6����'�RaR:�U,��>ֈ��s��,^%&���ƀ�)�&�+��� q�Q��:������s��VOA�ѡ�쮵���hގ0d�k�*s�����jw	0N�Xۦ�]R*U��6@��]`��0]�ȴdL/EV�y��;����m�f�03����'z�n'�-V)�h	��	ϊd/9�!7����g���mUz�%)0�Ƿ�W����A�1�;�v���*���w}o�GwރO��&ej��-]^��)
U�F�{���噁N����y_��$"�y��Ddz�><;A�z�<���&܄�n����V���Ro1����[�+��T��'�}5���4�Jy�:m��
C��Q������`$�f kQ��8��e��0�׭:Ӝ�`�̍آҁ&��r-�C�jFxO����J5�7�Dh�X���������1R�i�hݑ�~ť�S����)���v�Us	����hH���r��ut�xQ������b�����W�j�S��;V[<��!DڞkWX8������М2�[�9Eݰ���٬����q	U��;q���É�Ğ/V��v�s��&������'.���b���n����Y����vC�\� �<���b�84o`8�w��_��"�C��u�)$	�
�Wq�2d��퓸�Ϯ���X;Hey}fuz�=��7:Y9�)I4�<w*Y*΋N�������s�M�xx?�v�Z������+߿��e�)���KS���rbi5y."�+��R Q|�HsD�p�VS�9/5�W�:u���?m�
�&mmm׵9��?U"���HF{�:�]KLL��9��%�v�n.D�f�YTLj���ib�ܓ�-�V�B:3g�	o��O�]ᧇ�����!
�f~h��.P�)���R4az�VM����d���v��0Wԟ�W�`��!l���?���=��J�|@�+����b��f&�V��F�F�?5��z��-�l>'v����g���ʜ�`�cШ4�牮w7�[�$aP���02�YVuPk+a���9A�l9�8�IY,��[|�ic�YH,��{�פx�ϓ�B�P5*���d�Y�[+c��E�Z�<6^OX�KO\���{t�}[[/P�eE�",ߓ�+��%
��^Ir����F�:,��+��}���핂���^�==Z��WXCW�\�z�86K��9;�t�;�b7�€-V�|L׍Ɲ@�;���v�7�j��y{b�Ͻ��h7��k�qɜ��3��湃�7�7�ěcs�Cߞp��F�>w�<�W0�o@����ܽ�ܞz�u�&wY��R�fh=��u����}.džݨQ�y�v�װ
�}��������(�(�q���f<s�����
���|o X�����1��D�CÕ�s�f�Y�w���f�z#���╋�#��.��y����@�ր�����C�{��3
��'p��+�c�^C�|N)�.-����O��.�ʞ���S�ts
H��n͓٫� ��J/Ϗ�C/��6�,��̈�'�'���4����$��>�6�2#�8H-��΢�n�΢�~�΢�>beD	�΢��Im�iW �^��B5nk����<wy� ���M8-p,��������rȩ��v��<�(�]�
��B �q-q	������'�Rg����
�Qo����B���l?��$Gg>U#�RI��}E[߲��n˗N&Vً����DG� ���<J�^��QB�u��/osY8� ����1X^q��	�셼�;�i�4
��/0�J�ӊ���ÂX�I�!���\�Q#P��D�r~С�^���)g8l�Yۆ�.�m�
�,2k�f<�
��D�a|Ӎ�Sf"������X���kf�K�1]�\���=J���u��·a%S����N��"�m�E`H�WA�÷1@2�� ��BwM<D��A�."J�ܵ$[Qo�F���
�)�>A@pGW7�X���}��-�3�<#���1vpV�B��o�4�Y�a
�6�gh�����2��]�/���ٍ��A"�ai��楡��}�G���!M��h��ë^�%J3D�H
�A]H����&d܊����a�r�eoT�	e�5�W)�l��lH�����E�B���4�m�™iJ*Dȴ9�µ�M��xTi;��]Q�V^�r���C�db"�BU̠��k�#��ф؞֐���"k��i�(e�g�a)�`ܛ�V���j�(����\A1���|x����悷q��-*|�e�:̍����M�s��;�D�hN�D����M�"#�?����=��ux@�5��1H�z��HEW�
XO����JB������E�3�tŃ	W��

����J&x�ϰ/��Z�c�*{g��*���A��QB��i-/�F�a;Z�_S��Mݒ��*m���%E�0:�s��.���r�(�����uvO
��!�#L�M9�F(r~>6���p?%�Id��$�eo�Es�$�8P�Xy���2�m�+���� ���Ʉ{g.��(3&;�
��p͍iW��8]��EY�Ry)�ըD��c_�l�q��&�QI)�����yd���F�u��ҫ�:��:y	0��-z~�"�g��ᇁ�UT}��66����xQ��}#�j�Uȋ��gvAȬep�7�W1R`�ӥ��~�S�]����|,7���	�0|�.gw)"=&LHa�"��A����}��]ڣ��
3��}J��p�8��Ay!��!z���ЛM��Sh�[��ONa��$�ʻ:�G���8���VF�㌰;%2v�3*`���$	)�͕�b7�3�G��M�&'�ܶ
�6�t�`��gכ�\�nu$U��
�y0E��2?�M?���k�~���s�N.�G"%@�^"&��T�Ʋ��E~�@�R+\¸N�~N�A�	s�ָ��|���8�]�̪�]��;�'?Mڔ���?�jA��ܴ�Q=�͕4bi�5��<�������'���i�('��-���QB�\�z�(���␖q�r�>Q�h��ۜ0��y�-���w[|��5�B�̐����՟(;05��6�_�V��f[�
�1�pabFqB�{���Ƿ^o��T�w��.{��	u�b`z����9�=�Ԣ�(I�!34��{����z�v|>78��n|��:�l�:@~�Ȅ+*fN���LZǞm&���$�
��T�beԣq0c��d7�̆@�_���-��>����=�Z��B��{�����4`�+� �m�eꟕ��x��E��#Bw�����66-��Ϻ&.����quB�x����ø�G��j����e��22b���;;AJ\��W36����&>Ɓ)�X�K�R��<�WFU���b�C{\��7�D�U�W".ܜ�[�GP�OCN!�4�)01�W�0Ve8К����GJ
�E&��ɱjs��E
�K�GDW-��v#^
��t�gɬ�9l`A.�@���f]i>�y™ҏziEj[�hD���;��`��~��`��f��������E4�"�湖�cSi���k�~���n�dd���:!�#��$��R�$b���CH����p�zw�g������r��B�?SU�~;X��t��䅑:���NO�[`%���!	a�'^h�Y5��jq(bV�<�0Ol��)�FOfZ=��i0F��k�.?iT0_}S0�<)K�綡�����}�	�س8,Υ �s�"�
V���œ��uQ�F����	�!� ��a/��-���A�JS�tfXF&�|�#���N�t'6�56j�5��8��6kQ+>ދ���%�����A�����[R�U���K����Z�@	nC������(;]s�0�!c5VhƘ�=Jo�k�B�H�~jk{�����S��+Y�jJ������^�ezz��u�G�a
���R��[O#�P����a=m�Ry�#�c��/��Ȩ��i/�!k F�#+W`��'8��Ïp���ɷ9(S-!}�XP�%}n��Ĉ�ECT8������đ������浾�yu�����?����h)�N�X�=��#�4q��<\B��Aa`��΋y�W�KA��N�8?cx-�[���Bz��,
�Wux'���8�{U~�����KW�4Z��+d�.$� �=�!u��&*��0t�x��ɼr�P5u�XR��L�At��*�p�>�Ԁ��5�x�|�Rs7#'|^Dj9���1�0r�(���M���Zl��\8����Bb'�&���+
Zc
ǫW%-=F�;�9IçCl�I	%F��be��(÷�v�G7�Q�/��kE�Y��y$k�������%��Yig�ڄ�1J��u�/c�K��p�kH�.˝jXa\5��/�H�|��X��E�(y�]���5,cE���ꮧ���7��˛� zM5�4&r����k�+�p!�C��ͤ6&�L��>LՇ-!�&�@�p:?��������q�^��u���6�Yc�_�A�k���O�׫:�M}y��
�P��xri8	�&d��	�6�����=CLתcY�`���l�^���K&�jr���G�oV��M��T�=�%��&�ƴ��5����]��9�
�r�FX�+0P\9��u6��pP�\?'j����3om�&c�F�eٸR�?����$�`�R��`|˶ 4򯄼�m牪��S�����s����=rB���-�xu}bꛨ���$��3��w�<�a�qm�G?x���S��I�"��
cSOi�3
;�,�3�oп	�S�*��F/T�ѡ?,�Q�>Ѡ�p<����\!x
�\�@���@�2���l�!q���bמ�P:�'��Y�sy`����e����^�e��H��$7���@�`�r��ջ�-P���'��f�T�ֆ�6�ԗ��&A8ODK+G쉱�qG��gzR�t&�e����eϰhOݣy�w�;Xrʄ��p1�!Ӎ�(=8,
��8�aMQ��
����gd���w�O��|(4��Iܐ��Q×�U�A�x��R�ìE�:DrS�z_�OԃQ!U�D��_�?��c�.@�%ض��m۶m۶m۶m��m?m��޾����N|�3Q����dE��SqNr����Ơ�#��'9���ʙ��,+���Ab˓�� �� +z�������r\09�A|:Ch4�߈���)�J���/��/B�]?14�D��1dz���6J�C�Bјk��-h��aK����\[f������? NTBm�'�O�A�/n������ot�ڕx�_�:��.Zb	n"�`R&��#�j{����Su�zw��=4]=���|&z۾$ o�{��8�ݑo�~���E���ӻP:��Ǒug�8z�Y�$CN�2��c�d^��\#.���d~���$��>n�hS~�_ޭ���G�ˏ*�Ğ<)�������c��D�Q�=d�'��0��cAd�'Hn� ȡ�c�?�qMÈ~t�p|O�ȇ�RO�`�O37��	ѡ�(�%#�c+Šk�=�^�Ib��C+g��5U�DX�1�U��
��*S�S�R�.{�7�d+n��$i
6�����o��n.�Ã�ι>1��ԟ��������&AD�!�GyaHtT�4���{��'�`jUI��e��%r�{E�tBI5MW�$�-��
�m��^��f⣰��!&���ؔ+�i���o+G�Z�O���ly�Э4gj$2RLj)���j$x��g�dp���HC>ߵ��2.�����QC�M���'��.�D3
/Eg�dO���/Z�꭮��8_&���U�ZrX��b\G��;�g˾������3ʲ�[��t��sO����4+�}��W��u���F�]c�$Eqcή	�4G�R-7�>���7�O��*W��@�"yٜ@���I�%G��S>�H��}�w���չZ$g���?�ů�v�WU�I�aq����ĉm^��q_��d�aX����%N��
��B7-Ju��gN\��@g���	����gg��N���o�U��_����&�/�Y�
ZtF����rD!�L����;�s7Wcg���mp%?7�ɂ5�����������ŀ>�J����3��KśH�
</��qB��ex��e�,����
Q7�}}Zת���u��w��|�[ͯ��.�Y9Չ{�p
D5����������>\N���*���H�ܫ�KDn��ᦱ΀�+i�V
�-�O5���U�դ�&̇(�1+�)g��ӌ���tLyE���U`!M9��1�Q݊
�Ì�.b��C�$�i2G�J�1鎐Z��Q��ŀ�V#�-P����R��Q���X�L�S�-XR1��($���������#
����9��M��;��{�a$�	�,!FP��O�8�5��G\?����Ж�������[D{���+��Ţh��6�0�D���� �7�S*��'.�G�;$}
ޢ%�،����K��l�yV����w�.O!ޢ��mE���C��e��%�m �E�'淰졔(�/3�Db�
�
n4�h�H�!�gŬ@2�;Q�Hq��Jʍ��-}2��� :;x���U;�G�Q�p���b�̣����OoH}�g~BhS�In0$�.hV�:
܈B9#:�8�4��p� �}��7���K�	I.��Wj9���S��XV*�L�fZ�V���T����d�^����Itj��uz��7�w��n9A�?	��53,/H�3�*2�k�Ԅ�&���X�8����x#�w��Drp'�G��-h<�u�B��I7��=��1��k�o�W�L3Kc�>�������Bn�^Im��1j�:��U?�Cm�q�b�=K�Ql�#�.omp����3w({���4��Ȱ��xN��h���u��]�c���&yH��1��XO���^��k\M�_qO�e"j������_�
�iF���c�;�oR�it�l('�"�!��d3�M�B(�bV���m���B�Io�Md1�C�Ol*�
��M���	J�	�bڣ����K�G��	zHC��ots���|��&��*�ͥ�,��6�
Q��)[
�r�K�g&Bʰ�(�eI��W,c���!^GPU"Pʤ8gVw�J��%r�T�wyd(%Ä;&2'eJmM��]�P�-�vͺV��O��HRN��<D��C��)4�f;}�}�̹��������
dbOek���kA����0�6]�{݃Bꚰy���S�=�]�\����T)����,���c��7g�Y�)������.@Z��SC2фW�w��Dr�&dΪ~��sFR1�o��r�ǒ
�f�}bϧCo�/]�h�h��!#Ao�e[�����{j_s<�'
(�cz��Ч�P7�}�y�X!�Q���}�Y��EdK�.vQN�f�hTc\�_B�خ�2���=gRʔ�oסąp�V�/���_���kB����p{�J���М_����P.�>��[z�#m������2"���CU-XbJ�j3*��u$K��+�HgḥX��Z���o��L�\���슥l��2$�elB��5i:�g�0�����z��_l�+:�~�;.L����|��vDin�ى��>�W��u)�o�;j
�F����II��$X�^�ie�^6��\p��~��ֱOҸ�"��)�$Cj���>�׉ܝ���y��*I.�)��eH��+�'3��m�O��y�!ȲM_S�(�5e�ȐX\�ҕ��1Ra��C�����<S���R1�D�i
s[��<˦�i0���l���Z�8�ӥ�۞aukl�07���[��<l��2A�8՝�b.P�.�0�Ͽ�!6�NX�i�(��'L�C��x�����6��S�@=$b�@2�0�(��u�-��rЀ���d̒��dŒ�{�i?�h�84F`��Wn<l<��ȡېHg&�j�c�g*Ԛ�ai�5�<�'���9�W���#5Ci�(fߟ�A�y��6��z��i
�����W�0r���)xgS�I����\l,�0���t�ZC��N��C^l�7�,u��@���N�ds�,�a!�l�tNgL&fg�`z��w��T�
�f�qU�x�t�0��
�荒���o%���:��ygi���z���B��@�e ��>�ʫ	F��+IG�c~�k�iiW����m��qr�QT���J�H��j�R!j��yF�秨S����/��1�FvLx4�-���q֧�&�o��N����N�V��+�Ǫ����b~�a iT����9O�m��c/&�\�E
�I�*�4i�J}P�(�xZ�BF�����
Y�2���>�{t�l��׹�HX���)�ls��uK���iR��vAɬ���sV�z1;k"pӁ���q��jz��{�}T9w_�˙ ����
n�=RfH��-�����:�%���R��V.�-6\���E/��Wu;�Z���q��� T�q\G����]|>vsM��6Lum��Ǜ�?�R]��\�e\x-������_�Iq�':�{�Lc�G_�>�O2�)��{���T�%M+_՞�������tLy�5ܚ=�D���o��"�'uּ�tSc���~�!�΢|Hng����[3�Oa)�k/}Q�W���Ɓ9%��oX��v�ᩲ���re9��:���8u��	��9�l�fs�dEdʷ�����.����~v�-�*P�A���"!5t�<�m�(ā%�-J떭��+lN�����)����QɤO���b�k�fy/�g�)Hƭk�gߡ����Uy/
��v�¾�p���ȴ�/ ET~�w��OY��!�L�Ԡ�Ou}��O�a����Np��
{�+}c�G��>�>%�sQu��l�/���;�TJ���k뗬�o��2�ȕk4��
і�x�@���
���P�@
zU-�_����H�u�[�� t�j�a�z��Ή���%���w�1;�ZuVc
����}�I����L�i��H�c/�X��N5Y�������us<��FÈ�k���(�_7.��d��]��o���N#�מ�%��Po��|-rw�����]u&]�BM���5I�4[&B��ы����/�z���_V�o:6��j��;%2X�*���++�aJ�7vY�i�Z]�0�����a@�g�2μ0�v�e��?�G����ZK�
J~|��_�Ȯ�D�k?Vت��p�v�3�b��3!vّ&}�JrؒU���)I$���U���e�E�v��ئy�4h�?RMt@��,c.Ȭ�t:h�@���e��HsYmj��3�'���V����(�@�k��A$�_\�U��jց�_��un��q~}��9�x~���uo�2n��V:~���o����	ӡ�[�)�#g�#��}��d7ld�;%�n�����_z�}v7
�Rv7�S�7VN��=Q�ynL�/.�k�J��#-O�݈�5���w?�[���沸V�Жc:�C9����l0d����V��-|�?!�/�������ЊX(- ����ƎϬ�����1��$�~y�j}yw(K�G���[�Ʃ3�\//nA�Nʑ$���d��/1�R��W�6�H9G���}H��O�V�kr�=ЈὩ<o?����V2��;DW������05f��f��n���I�˴�3��mg�X�A�T�����&�`����C^(-��̇>�~�e?��Ze;ZQR!�c!��l,��RF���3p�֡U�]�Q���ԁ�/Q[�<����e֜m���M�� ��Ɛv&U�Ρ�C&���n}'nk�I��6��Q@��ߓ����mD����$��ߋ��>C/9I?/Џ&$?�|H-`J�޴�cܤ�6�R����4Eio��Qo�xZ@�#X��Փ)������v�8��I�;cj�~��;��{�ۤȿpIW�'oA9�9Q�g��sI��+`8��������=�X� �;���MC\j��ra��]:���Fc|9�B�M�d/
T��:�n�_,4�����R(_��]����\�T^�0����.�c�Q����Il�//9�V2OKVv�����tubKe=���Q[���P�1�8��j��Вq�jci�e�qY�9�V���.��1Pѣ4|h��܌�Z�9�|�9�`�{2_�{��PpѸ�x��#�#������+S�!�;�X�����2��z�����H��Ξ�Y�z�AȌ�N���&Y�Y��ڔ���b C"8W�[�_�US۠}v��-=�xiY���h�S���U�����T����{��ڡG�\O����v8��w�+՘�������5����R��#`��j�=wtZAY}ɋ���+��J)��#%���N/H�A�1ߙ�=�w�<��`�5\�[2z+����t"�b��ç.���<��e��%��˕1<6,3������A����қ��#?)x[��g
s|�h��y���I���Y���A��V�I��
�~����3Nŋ���{U�#e�z���7sV�(��a��*�иkdK��SF�E�eK�� �hJ���F��$o}���ǩ���['�Ӑ��n�U�Ã�ӑX�,�Ј����w��H���ݠ��*���P�SLX1YB���<��iht�^m+[�h3�xEZk|��"$:.����x�2�,�Kt�x�0$z��?�'����(�?�?Ҙ����'���Rh����A%�چI�*�Њ]�
�)���qo����A�R��6�]5������J�g��`Mt�,K��fE��*�b��6<^�qN��»C&�,�FaAk�6�n��	FUg/�؏���b��ھ͌&_���"���$O�q�1��;)H^g.ڕ`�pal�μ�R�%�$��'B����)�}��vU�5m�Nc��/4b�rNX�8�RS��X'���f�F���n����n�֌�n���nU:
{:W��Y�s��3��Ny ��$���UΰB�2��:�G�A>�,QB .��b��r��ژ墴�=�[m,	���~�+�����P:��Y��G����H��$o��6w�)op�i�4m���25C�ɠq���/��{�q�v���q�M5y��>�mYNa�g�i�!A�>ߋҨ/s�D�@s�'�%+bK[���ˉg��`��cf΢e��O�����d"�T_~�ZX�$+Y/d�H˨j<O�/���C?[)�T�����@S]qq���=y��|�VZ�ssܪ-炣� .}��>R�*%@ˏ��B�i��u��mg[Q����72�V�uīfH/V{�Хx�%
�/O�[�y 	
�0�M}��h�
mZ��R��x�L�jJ{�
�+}4�D8�32t���8�n�9���%��ƚ�d{z\�Rb�`�2?���[�ּ(U09Ҍs~�{J�B_O(��av�җ�v-�>ڱٕ�}�~�h�����.I��*���nNT�XC��SWޛ�W(M�ͯ���	/��|�5{�)�ߪPZ\�z�P=�&G1Ɉ�C;NR=���r~ꞰÈ����x�|�$(�@w�U$mK���YGӱN��|�w�����;�!˕^���w%�F 6��oJ�bc�(��������1��$��')����y(OkH,���Y3R~p�w{O=I�/w��p��a��kX�r���X��m�F�1�G�FEU*���y��M��Ǒi�%�pG
���aoј�1����1&.pQs�$�#�ޘ�6�J�A�@5�ğ��&S� L��(o�XNE=V�B5�H;W.�����޴j;($�,���}!�� mab�?���m<l�c��M�2%��l����.����p�����<�8��`�b�Q��"X[e
���e�X<�<1[�*�E-[b�_��SO������ދ�����ߛ����8&Qo�(�K䑰1�H�i"u	
؍�j�@�>	�*I�o�_��L�f"Ό:��S�����B����uzB�n�G�?��o�b0<�Ɍ�7�e�IZq�[����[���*w��^�k�3k�[Mw&�U�f�MR�X�!�u�/�ɶ�Ր�;-�<���!�B׵W�֨��bw�ճ���Mw����ǩu�!���~�v��9[�M.2���Qh\�ꍮ�\C�?�[[-ή~KR0�s�SNa~W�
�T��ADŽZO����Ej{�l<��$&����	���٧դA:`\�T�}�uA��8kN71���?�n�Y���qL����h=n�Ol��ΩI�d�,M2γtn��W�7b|�р�����&6�\�ƩJ2�[��ԔTj��g��65�����=&�<���cuw�]��	~Z�����*�#��*m��u�Gf6��t�����%r/|/u�D>0�9����{�z=H��&��H8%y����D��o�爈���l�5f�ov����-���R
&���;Z��
��%{�FX�o>-du�Y�b��ЍvS�p�#u��L�j뗷�	�M�8�7��.e�%�^}vq��|�*��Iu�*~����Y0����b������U[��_���v,�)��=>��ɔ튁B uo%MH�:��i�uz�$na
2L�>Ђ�/{��Y���b%���p\���{&�P݊CoRފV��3�E]ȋ��y��,JP�=(��]�i�&>��QC@�b �o�� >���l�<�Nգ{��e3ؗ�~JN(O��g��~ �'��lV<B��1����(mH�ӏ����"L���T�� �1��j����8kG˲9�d�;Z0J����D6�Y�
�+o
��i��_�����`�}f>��������"^a^Y�1x\���Q`�MU��=!�K�T9������ab���1A?�+��T�)A�(�v)�z�O������G}�d�943'T�Eu9�rG/#jaCݿ5����07�n.�IB%����RA�z(,�9S�=��:'���0a��Tl��[�!d-On��7eż���7��m:����_Qz��^=�HxZR���3���e0��am���-Nb�4��ӥI�I|�[s�r�9�?y���xnMQ@��~���qB`�!���?񿲺�,��'p�0;���1W7����j��o�#��7���i�@R"~3��+b��Q�N���i+�fo�fS'4��[�Qg�'�
��6���R�Ŷxd���`�E`�K������Df�1iS��h`(=����X|dWj�Ҭ�Nf��i��Ả�6����?ޅ~�I��/3�`���\�\͸�8�q�������Zì�\��֠y��\�?ѿ����BSgٳ7�����@'ny�v�U��sXߘ��a6 *�k��0�z����fK�Ȼ��9�'�W�|�`�:�1T��`�~e~�$�j�5�;��\�l�>��:qSm�z��Vb��J�M~��1+��F4+��
������+��:�
3�e��r���Q'w���&5��e�Е�NS�{���p0�D��@���>;U�nGk�<'@�F�r�c��X��+ �4u�=��B.Z�6��5�{�Qu�	�	�&KT����?���唑�r�J�-�Bk7^�aM_5$"�����#�!���U��ZQ#>i�
t��S�z�?��+�eW��,ݿ!��y-eJ��pf{
Z4��$7.FAow�ω�����<sP�	��}JG�g��c=+t�q�>p��pDaPK��{��ñ�|�*$���<�i�•�/�ƒJ�����!]�o0|�i�."��G���ϊKl&�VH�ɔK�+�M0]�S��������P�an���uN�.lt��y����e�zE��
�Ek#�"]J�ǫXP�}Ӳ)�h�feI���;�������Q,���L����A���^��{f�$$��'m'Q� [�VĮq�Kw#���K��H[�zl��K�ʧ�ZefX����þ#��F��|����(��ğ�����ȴ�Pd�B��^F���z���"w�T�XU�l���{��EJ�UX�}�L/���3_=`m����+���H����1т�������VGСx"b?m���wʥ�/��)F�cz#� ��R��Q�%�/���\�uH  )��Y^�/d�=���]-LԜ<\��!-Xo}-������I2<;{;ܫ�Ĵ���q:��xs�4�ŗ�4�'��y�N1��`x{p���-�j�֭�0���t�^��
�Q��
wb��A.��rT�/������"���͢D��Z�W�Z���r�`��S?�c�є�#i�@9�B��;�����)�/mOx��(8���Y�r¡��$�8�0�D���'��_N����K ��fP	>�������E�h�t��)���g#������ke\��bR��
��C�'4�OJ�7׿�)��%A��$��ܡ�����&A�����c�@����OD���>�/�߁��7�^�Bo�D?kQD���}Of�GT�?rJ���w�>k�|~P��ф�m�l������r�ng�1�8�0�r�9S��!h�d��L.aɨ���{�?<�-�����9�9U�����0 ����37(�fF}C"RZ%;�Q����#���'�83�N=��ՠv�nj|g��V
pd�!I���/�I
���|�6sX��n��2���������܎�X���A��s��踝�	Iͤ�ﻄ7)gi��nHg��f�?}��1֌1�U�I����]i�=�V3v�?
�3_
�
��>9.��甘���q9�$l��Ey��ěv��5yi^�p�b���f�*��43�����~�$�=A��f��T��
>S����t%��u�c
[�0}�&I�>?_��D�w�?(]4aI+�L>���9��|��s8IQ8��0�Z�n���s^���q���S�ݎ����|�,(�U�/4s�x�`p��5|/V�x
��!�z�%)M�KY�D��$&��%!F�M)��ԦF�3a;�El2)�i��X-(��-0A�r�����$=�OA:M�@�p��E����\KO���� �R�ݐ]p�t;��"�A��@o��!��� ��nn/,��ʼ�'�A>��W@#ٱ �hp�qm�����@&����郥>��6�9�ԚE=��ʦa~�z�+rmBP\:��l����c�!kt>�vw֢
�'T��]�#�O������q�Gv	���VŹJ�:�@�:�����U�jg�\%�������L�ΐv���%�s�<X�(&�c�l�c2
�ʂ�D�XL���\�NI� �,%9�N�����hMY�jT����}04u�(>J�#���a��aE�� �E��	�
��bRE��ȉ����<�jEB>FCm5����D�w�����Y��dbB��T����y�8h-�N�@�Qr�ܩ� �W���8'Cd�\D�:�rN"@+���)b�'�1ަ�D��EiT a�˿&[�^������×)�}eDi2s�����k�peV3���'_<��<�¡J���t��~�sZ����dTW���Vvf�2�Y�G���\ǃ�`�4�f�КƲ�+���D^�k�ś�@Α�T�Z��x3){�t���;��.��Ie±i<׿n�����H7^ѰQ<�֮�-f�Q��Nk���|�VM��F��4�}����_m.t�'��αh����ۻ8�e�>u�8�SnΒ4`oZn�Cg������?��A�J��-;�w��G�>l^F�d�Ɩ㤟`�`�����O&�(7_��c�����M4��b:*�!�.�_4���ɪ����?�W��c&���,���4��_J������`��0ʌ�z�2�	�=ѵ�7��j����s������]�~�	x
K���=r�z�p�pp�|J1I��I���>�)w�M���p��Los����D]�yPT��
�H����1O3}�^�+�wӭ�!B��	�.�V$��Ar�\�QS�sv�!LR=�F�M@����#�Δ�`p�H�>��]s=�1��I�ϝ��j��b�^(��L��8<0�_���q8������_�! �Ѿ�3#�Pz�%�m�6
>x+zẚ;2C��Q!>+XiN�)�na��r5��ïc��~�̉��s6�Ř���"F�<���U"���yf�b#5V���vI:�'Me�t�<	O��V\�1>�tLe%B[�1����V���Y�=5<	��oF�n��ۍ� �f&`���ZF�hxMg��}k��Ѝe"�N1��'�t$`���C�7P�����_��ۍ����jT+>�F��7��M�E�_�0n7r�'��Is�����0<"�Œ�d�K5���0F�$L��A�3��k��nP׷(m���ǂ�#HD�c���#�F|Ҽ���3��jG�6Z�6Zcs��գљ�GUS�Q=�|թ��G���.N<�U7�un�&�˜F�ty���8xPe\c �T�?�7�f�wl�7�̜R,��ѹ��!�\���Tt�\�� ۞SnD�/$
���/f�;O@a�||�|����Z��;���W3)N�D�(��L��u}�vu�/���⼌F]34V����8�x���a[`]��cN��c�ʼnx��΀X��]����r����� ]q"{$����D��B��!P�1&lhs�N�N|�I��Qu�������l��6��M}�_��.`D�<V!h$;���-���s�O�J���e����F�=�б�E���E\���yW��be��<��1�^���6�F�ٚ���\s�
X6�8e�ù%yQ��Ŭ��O�`x'���̶�	��\���N���,[���y�oi���т����<kd�|q�Z'UGnE#	���O^*�/w�~��#[�7�_���^�3L+4�؂b��c�˴��.��F����8�f	$\m-i��������*o:��ˤ�
������R����F�b@�|4�G@����hw!��<Xb
���%�wt?Y�G2�	Mx��I����e}�~�&e��v����-Z:�Œ�-{�TSN*��u(�:�&Zv5�\g��h�s2�|��[9p.|I���԰?�h���J�ɀ͹����ïS��
Xx��`����׾�Nd|�eJ���0��VE"W��ɖ�;C�1e�
˺�޳+j炛�u�(L1�c@�Tk���/U����:�UȝA�����˭�#�C���"��s�J˿�LSGʕC�l��:j�P08�v��_0`%�_IR��+�Rx\o(���VϏ�V`ťCv��D3V �
xҘ�gP�gHx���H�W�I��" ݴ���Kk��J�+�Bԥ�c{��^y�?�^D�e�%���?��U���Sh?bo�k�ۨ��|GG@��K	QT��m3`��̲��#���B����op�ۆ�=
�+1o��~�~'�!�)	��gh�����
p�i����b�9@�U����a�hw��i[��Lf>�WB�W;� �	��ze�Y�u��4@e<��ż��w���:�Հj��0^��/����r�r�s����͓ԞQ��l����ܖlju>9��y��9R��J�9��Wsc�b͵��3Kû��YrX;�ˢ�M��-��n.��,�9�Y��˵��-WPc�s����)P�fcm��܅��C���*陛6�J� U�
�0+C�)���NW��<X�p��|2N?핬�ٻ!*9��ﱨ�'��#��oǶ���K�7�=O�(������5�Q��sA�;c��5r��sC{.��Y!b��xc/Zk�*�ٿ���]����%�?M��.%���ΐ^���;�mЅ�W__��;��Lc���1F�d	_�����+f��$O�L�����o�ì�t�u���n``,�j�눖SQ�e�З���qn�r�p2���p�����!���Յ٘��.���1��Z���}x�9�����X л(/�y���:�(y�y<�9�(�����gq*��𓆫��D��b�da�V���P�H{����Oď��s>dd!�)Gݞ�qFql8��a.�ׄT�����{�����(7r��S�3�A��y�)��!㫏1��0���	�׆�*�Z�fV^���eF^Z���U;����{��\BX�i3~��35�	�n˜M��I"�ԑ�	+_.�1a��5�d��p1�����@OÐ��_�}�g�&��%:���;����O����Z�ߕ��A�Q���@��f�g�%̇c�w��Y��"��l�Rހy-��l<����V0��-`$65ǭ*3_E�uIT��%,�$���
1�G�x'�c$rRY�P����_G8J�o���e��̏�.�z��-��+�
�@&�N�^影�֮6_�[wY�@��^;��!;���%�-�k�94_��	��iU5�AL�N������|��o�z6^(5�P�eg����J��P<w�#�2'�"��k\�����-.D�ڈ�i|w7���j6G*p5��[/t��-	RJ�r3�FJ2�&{X��ꙥ�&n�'9+�����W�C�e{�d�ǐS�'oG�{���O*�Ay�b�W�hJ؜l��%�g�����M�{�2�4�H�2���_��-���ɻ���*��'&�h��
�s��]h*�Y"���Q��e�"���^��L�����B�a���&�\��,T,X�El��e'�&$��#>I���X�D�?C$)m�_��>�qWQ�b�/n��Η-߷�S�	��ѕ�G�7��eKZ����t�P8(E)�Ѣ�G�avh����<�޲����nK���d�aj�%�8�y3�o&�Ր�5"����je�8F\�
0u*	X�9���1縯\�`6���j
�)�iz�"��J�
�ܢ�k�v��r�ӘF����6X����k�X���'�i��LfʼYs�J��N��__i}�7P�}K���;y��C���P�;�.1üZp�q���R��W��`�GX`���WQ����Ø/엣nh���d�&�c�ɱ	���C��z|���)SM�a��CcS�ӊk��T�1�����k*�.h3!�ˋ�#��1�'�F�I�V�Z�3��I��(b��)�/�κ},	��Y�_����S�欍*��z����O��jk�D�S*�e��N}�#e��>��w#Ne�g�F�!�"掱
�!
����#�����P�MI�D�o��5�qV�K��H?��5���k�T�>�0G6[wR�=�Ū�Q��M;7�ڄ��t;b�9�j��%�i���L|���
���te�����.�G�W�R%�!�&S�c�f�a_�?�O�-����J��Q�ǻJX`e����m�~�lx7܂N�ua�{C�6���'�B�}D���uԶ��$PJ�vo��c��6�`�H���27��Y����U׬�DZA� ;!b�0?ꅆ�`�0���﷡�iY�T��oK�^a."LX�
��ޠӞ(���I�V�啑��L�@��4�I+F��	�n�e%iF}�D�� ��3�U����3���"�	���d"�K��^�9u�;ִ
��ziq��֩Q�9��ј��˥��z�'S�xY��LIx��O
���*��}�Mw��n����I������1s�݆u5k)�ў�t�%Ԫ�T�G�M�G/�Y�Vx=﹐$A���6&��f���
K��I3���
;���	'�$���D���2�L����� 2�RE�p~=�ġ���sO��g�G�"�F�[D��5[o�%��/O!~���Ԫ�4�!؍�e/Ow
�SS4,�1�_�=@A�t9��6�@�%����]Sq�D��_k�McލC��E^:q���B��ºF�	d�ou�+�<j��؎�t��?Kң�W�&�����`М���e1!�3)q���A;��/8��BV�R*Oǭ�zd�V~��7qӅ�]��~Ɲ��nqgZ �ta8���%,p2*��R\} �x������"҃��\�P��5�˓�ˡ�)X�o��Gd�:�t���g��Z\�E����!�3���[|9�,�"�`��3 C��CTn���e��M�Ï,��2_Jo!�ȥ�ށ����'/7���@z�h�#aJGj��+��g������x0�B���*��m�L~�
����&aлҤd�w�RSh�M�&���TXBɁB��
�^d�7b8�X,�K
���`A�*�,����;7U�!�1'o6�Mi'&L�eL��R��� qC*TFHhҷ_z���5A�R�HW�S2�I9��[��ms�“��z�
U��:%Y1�>G�*��RS�w�9������،ۅ}���4�ޯ�����&���T
ځ�O(�"�;��e��N�α=�4����͵O��0�F��	7@V��J-�S�Zޢ��3��C�:h2Q�}�q�G~w�[B���U�(\Yڢ(	\ϑ5�{�y���-\F2�'ʛ�x�r�DDF=;� �J�J#���!�����m�~��P9�N�
�jK�Lz8b�;�{�Y�7��v��0�>�1��k�a昄6�а�3��e}�n^牭7��j}��6��1�7�RX�ȃ1���#d!�ᑮ�	��8�3��Uꘒ~X��P�+��r��q�v�(�~�Co_��Tq�G=��=�P�3�!rTsKR�3'�Z��$�[:�^�5r�࡙�&)���#�:�^�cҪz�v֏��/�<��z�p'�㋚MD�XQV���OD�0a��%3�=;�U5� �8����\�4�%U�.�s��-�AC	��X5Y�X��n&�g����G~,�T�)}8���k�a5��2H��[���L��݁"<l�_��8—Tr�C�A�I���%���]ʚ ��K�W�n�ۥtߒX�p���W�?|np��*_�2���'��a���hH<�m#ߟO�
�ax�Tro�9H�ɧ܂H�)+zT�v�8uʧ�a���1�
����.n�!_]3�y�`��	�;5�-���b_N��
at�t!ۚ{ފE�d�aKOi�
�g�A^�pZ��:8$��o�L�24v�Hdj�ߤ�7)�����:���^����/��
փː�	V�>|Iuk<�����n^�9�{NX���h3��\!�	8F��<�s��:�s&D��;C� �Or�P
B�=:xc �=xCF`?	xc"�>�s�K�FK=2�S��|�O�_|�S�/��ٶ��m۶m۶m۶w��m۶ݽ�wrOr�Lf�K��*Yɪ�cp��u���18����o�D���,[OKey!�w&z0/�W?��{���Q�t��ك%���}PJ�M�B�~�b奆�gbB@�z�bs����CgJb��CE�&�8�����ȣy��bQTF���b�Y,]��1�XY$�"�����c�(�"��f��G^2�S֣TD�D}f�u����y�7�L��|:8Ux�t�1"9��h1&��wmZ�\;�ơs2u��m,*u�b鳱�ԏp,�<'�٠�iY>��8_�X'�h]2���,s��Xݎ�U�:�g���„$���|����Z�<�.F��=D���R��Ƽ�v͊4XMS���7ڴ�~u�?]
�#Z`
Nj����B:Cp��[_�Di���<��b��f(z%d�H0�7�A���c�\u�!��^z6r-�=L��SN�1:
�v|�$��Evm��9��ط23[��O�>[m䊎���W��k�s>G�i��L����x�"D�;H"�@"y^ �C�y�o���?A�摽�:�!���c�I�x�1(�Ca(*� �QbMjH�~��x��W�9��V����v*��rj6m5e7&q&�ĀПR�Č���&���a�������(<)|A��k�?�{�;�7��-�9%h���Ϸ^���RQ��Ӝ�B!�|A_~���:,��L@�%Rk7�em�[{����t���4��z�Cw߇v1����P1nP��,�\32N@x!�����Q��#ڵ<%_��<]W����H�2ŝ���5Pp�#ڜ���U��&���ŜB����-k4��P��2����j#�#����%��>���w���G�q`4�I8`�@$�*Q(�+�˔K/�m�~�
�5(�kD1h?�o����8�=��R����|ˉ ��.)���N32z:�$~�˳{ْ@g`�9f%Ś�S��R���蛕��C��Í�269�3A��<h�P���
����Y��s�3;�%'Q0�*
9Ģr�b:ǩ�2b(�?���1J#�Z2*;t�������
�/��:�y)�l �m6p�h��B�л�\��/-�	��if�?�Ta[��&R`��;���)K̤l�c0�O`�[+��Y����r/}��X��߫�bp���%v��nw�Y�jO����3�<Q�U��9�[y"��д���Ĕ����U�|0�X#�/��-�J`�ht
�"��a���i�P� �^BI����Bi�N��F�N��AÊt9��6�Ih���#��D�eu����XBoI�N��C�4�}�,̊w��
wex�����$�y�{�K��8��[x٧����i���z���J��0.aP~d���=�b�8e0y	��]��\��dF�a�fg􉅪�E�Ҕ�4�I�j��*�<`�풏$��|nX@�؆�	[��@�_��;�'�X�W�1��#nZ���f�Hb'�����s�jه�WMJ�P{�ϙ�K�M�:��ldj�5���&)�
[V���SkT3���I�>�=d�m�����5s5dI�{;���衊�G�/#�m{Ŗ���,��i��.��P���������X �
��"֫�BiUp�>�˒U�����?��ڔ+&�S�P5�n�3�us�K!�"˦����{hH���:��%\X�1�d�W��	��3lyPȴ�EP�h|�a��Z�h�x�e��U�X�M=�	�U����(�D��|%�7#����X����$_n|ÿ��5��I�Ĩc�O�46���l4=$�e11�I���'cʞOq���ΌHsbɫ?�ͅ�6��#?&s֣��6	�#&?�sl�M�@υ~��䔑�8��Nlq`���'�^�� �b��	k/��ϋ� ��S4��™ȟS��#\�X�S��,K2��XD=���9m<-��ԫ.�F���|��q�_�2�8Mҵ(�co%*�H� �d�h7�-�b���Tn��R ݭ����{#ڡ<�!�"�(�ġw^$�H̖�33���}�ގ*<EJ���S� �-���>tiK�5�+ɛPRp����#�պ@S"�=0�?���9=���CD�#c4��+pw<K)֕�|��	����m�!��
 ����/n�$��(���k\0w��\��M#�Ewq3Rf��1ī�#�O�k�cti�Oqg
��o�M�
Dm��g�C����()���>�ţf������B�Z���#�о�YD[
A�Ο���62����a���wh������ץm�
�5��5�+����оG��Ā��\��0�G>N�>D�c�}���c�ʤ1��o0�	��l]����7�2���7��������b�P�����^a�M�jd�fCD'��x*�Y҂E����]j0�5���e��z�aݜ�^b|�r����QCz�KB��N����OŎ����8���;"�pѺJq�6>���ţ�l�5)F�8w��g\��g`"��!.�X�ŸX��3�
NLE��/5�${��b���$��Uw���p�(
�=�q��K� �0�v�&�&S���hb�q(�ç~�}������,{M��˷��� �3�'Sk���M�Q����Ir����S�������q�&��=��A���c,0�b[X� θ�`�P�4���>�O�~�@"Z�t��?���jgw�.a?�_�rM)����w5�:E�cbS:�!`���a��*A�1�6W�(�,�U��p�����������U�5��k�G�gm�[2��"�?P.c�U���o��n,�^^��kP�kDܤ�<�,�j��!�hh1�2�4=�ulR5�ŘG[	^�h�$3Tx�,z��Tȡ5���l��A�.����:ͱ�:Ѝ�ҺCaeA
��P�m �:IY)Sy��>^v���W��R8����ɃI^=���9��n@�R�VY�H�
�^�D�
t�:�A'�R���
W��~̠�灼���۱�ף��i%v���ޫ�@��A��@��^�ʿ�ݤf�D�]�U��%3R#m�r��!2�ҊI��d����%8�A/���q���R}�٥�S����b��K]�n/���?����C�� ��H̕�C��(�\�2��{��U�_�nc���C4�����&v>�Yq#�,�ns�����i��Yֳ�|+�q�Eќ���9�hy�'�M��)�]�k�LC�u��"|d��\���˿*�����W��)ef��$�:wl�YI�;}��N$K��;)�e�ibKHe�L��2!:�������L�	4
��.B��w˲��2����	�
_#rf\=W��]��{�3����9��X� gt�W��rL
W�"�c��%��۽`FsR��x�AOU��ǔN��lf�|]�g9Ό��bag>:FxQ3��<�;�82�S����p��<�G(f�y
�c�����%`���[
Q��E�wk�frv��u!:��-����&��F����`���<��&=�.H�*{^��q��:\\�l"K�*sz���ZxL���Hg��j4�݂Ƒ*��;yt��d�q�C4CZd�]�����F�}"Ʋև#��1����y�δӇ���)��>uS��E����y�z%ԡ��3�dS���/��<gHy�3M�s��.
8�	���cI�'�۾�z���T�`��@���,z�p�����9���u*�IV�J�M<  0  �������o��_���t�,9,hP()�kb�`�8tr)-0-�Dh,)��R����r�rk���v\w5u[[kk��N������Zg�s�.�k�g�U��i��-��v#��羟� (�ٮ�eV䊯eP��ͻH%E
��� �'S.��e��N�t��g9wtX=�-�eG��;I� ���{*&	-1#��e|�Zy^�N�x�~�o��]1�sB�bɞ��R$\{�YT�2���\�d�NY6��<��s��*Aʇϵ����%�щ0�߬LAC�{N��<�`�Hf�H�h�GS2G�K7߀��K�����Z职AOd
Fkm��[�[Ȝ�b�5���\��r���@�aG� � .Œ�h�E*���:�� n�8��o[�c�Q���1u��<�K�5W�%�=C�=_jB�g�8r	��lB��U�'�0����+��\L!�}[T��܂�����}Pd!��%��x��[�����e���a��Gj��W#݀�‡�o��
Z��X�!��c�pr�Fx*A�D �@��
[�も��h1���lQ���m��������?�`-����g�t/��'��p���F��B���> )k�K���>sh��¯q���9�-�;,�ԴVS��(�J�ng��)j��}[�L�OOM|��)mBh�I���Ja	�$։���|KS����SW��ɦ6Vn	>X��V!Oey�쨤BKf]���Z�7O�­aKIG�����_�v�7�he�:�kj�p�;�ɡ�tMJ�c했���8�U8_#�C�?ӔšV!��	�.����:���ۉ`��H�&2��H0':L,y�m�VH�"ss%J����
�Nڄ�&���С��ټAKC	�+hW[Q�G{��WE�O�{�������^g�:�˨����Ր�)%ֹ.��O��Nm�����K[����"ZUN�>�nb�q�/=5U���;��c���RLE�1z¥|T�)��!�7oރ�>%}rU�쉅����o��1�X���L�����RxW�����,��/�Ϥ�w�&��U���D�u}u�V}���07)��I�9W�f��f���N�
>IӮ�b�r�` ���]�V����l��Y<9i����;������E1VhJ�Q�?�Ov DI]��
�`��z
�rm���	���C�nmi�`7��L����_��1_ڷ��{��Dݑf�ѓ�Hd_G�usJ�B��C�fIaP�D[[-��,��ċF�
O�X��4��L�\�ƈs�d��ݰ�Rths�H�9���kp�;�K>.�5,E �a�Lx+��4���q1�P/�ˬ�f�������?�l,���T7��ttW�Рā�h���^�K��n�LN4�"���-��.l�zD�ȇ?�S�>dx�	�F�Kge�ۆE����!�g��W�^]�6���'����tGs�{{{����!�a�aT���a|���M�0Z������C�L����D&�b�`�v�4�W�e��)&�b�o�_�G��Mз�y\>�����bQ��\���%YZ4�)�eٱ:�V��^P֥Dl�_ h��mr{I�
���jdd��BO�(ʧ���:Q�$���c�ɷ^/k�p����CS7{n=r��� �A�6����/Ж!�Ry*�׃T�v�Kc%gZ�cFb���N�|b��Λ�Y�ӆ�1���ҳ6�zv��9�j�a����3Ҽj�G��h�ц9�hq�����_��=�G��ob/����9�W�`C���$���A���Z?�	�V�(�:'����T�9j�wf�˾;�:y��,�?[���c��	�L$e`x“�C�WV��a�/�:�q�τ�r�B�$�t������ɖp�ѽZ�GR��y�+�����>�'���##�Q_o�
Q��^���qJ�	���6i��16��OտX�X���R$\>X�O�>�86**�e�݌D)��$X��#�G�H[eP͟C�D��Ţ�C�vx6���BE�G�6@h���#�Ԏ�z��}d���8H��qn|��@��)�z�*̬6������'�%<p/�?Z��ZpIp�ItF���.tsq+�e�o�E
��G2p�v�^�)�B���b�}$�d �k%�B�=�����}��6��v��fK~%dNq�D�*�O�Bmt7g�b���W��^)h�R��d�<&�{�
^µdgF˔����B�j��C!�X���޴FJ"/����~���4�
B��df�M�L3�i���q\J�-<i,��Y�nڻ��ؙ*�o�Y**[�ά$�:�EZֱ�ƕ&��GM�~�~J�^|��%s�����)��;��RG�/^�]�e	&�Q1��x�q�<*�6��̫`�<�B���.]�`�|	���]C�S�-N�|��o�~��V�z�We0��v��D'��1Yt��C��R�t�g�LFG����$Ut+��	
�F���\#���_V`����X�M���'�>8���k���egm�د��hs�I��
.3����KF�d�ѮTl.$���N�f�����x��L%ve0��4�n���v��֥�z���;��[�(<e�0�>.��m�ݝ
,���B�h�{����mDbJ�Y���<:t}�8���o1H	L��lq�X�Ε����f�SׯjM�!�U<
kd�:�
�T��c���V:w7\ϕ6!fI��H��~5�+�y���?}V��p�c3D�;J�_Iz��I�b�F���|�g����v�=��m	g�$�E�q1q#$6ѧ����Tx�v�,�t/�#�Shi�\�p�ښ�a���Y'2��w<��[�#����"��.*{!0�����;�\��2�X���<ڵ��yK���j�l��h���m�b��öH�Ӑ5قV��p�DwNGt'S\_g4�xme��PN?ղj�� �.���
������ד�I��J�����3F��Lءbxy#Mx��i�8z#�Kf�>K��;��5���]�]��#c|���-�~�E~S�bq��'\�I���S�w~�5%|c$���e�љ����a��C-C��Ҟ�Ky���f�RS_5��L��4G�u��o%p�%���ň�U(��6(&���#��ERy�~_�>��OA����ۿ?�������"��2�f�x/����J̰X"GaJ�<I
��������<:�F;ќ��h(��h�G�� Dܢ��*�eh*e���;&�D����w|w��{����A�C��N��N��N���8ߋ�G�Bo5l��_n������*�f�H)��
_�-�7lM3��@�(���ӑ���+�k�����H>Ftٗ'l�����mٛ��@Ug�*�C�1S�z�U�
3-�b�L&�O�ڵ�B��l�7�	��` c3d��Qz�9J�ЍH���N��|i�0���?����_	���߭C����~��(���������	�_������rE�*ke�@��_��e��`*%��	G�B�\��LӪ����F���A�,x��I�8O��1�ݘg���ђ�(Q�R�Ž�`p¼'�P��Yު,4s�9��B����	�:�m�h�h���v�2�k�Yzjc[���J�i~�����.]�g�,o���*+�1�{���J�������B06}*���Q�j�� �ҭ�p�ƵR�O7�m}�Q��Y�o܅/��S_�#��S"ݚ֞�6ke����0�;�Kqع��`t��Q泡E6<�QoC���8߻ͤ�;|Â��a����
^��`e9P[;F\{��z�}3�Ŋ�ޗ�N�N,���h3h�Q�z��vME3�+�n5N�m�B+��r������A�;��Y�|��4��`��"?��w��g��^�,��#���գ,לV�z���s/�௭܆?b�l�N�q��]��BDZ�����jĒX1bͧ�Z�ʷ�x����*.�SUF+o���F��xF`�gM�a�
�l4��4p�@Q��r�+8�bZ����ތ�/J�<���Zq|����/(���cra�e��fO{���H,��� �&�Z�B#��zz�����m'�-]`�GH�*��a�v�;���i�U��H�R!X���#��n�K�<��xW9f�	�+uɼ��~��>�&&.����y��33d�m��/�
�����ǝ_�=Z�rඛ_|�_[��������#���5z#^>�:��Ζ|0�4tq,��|�L�`�1G��
���O�E���g^����1b���wH�ӌ��5�RBc��`�5]��o��y\�g�\h�Ġ�#��ON�oL��ޛ�5ٶI�wJSc��
�)�ݷ �FTBT����ZQҏ�0��Pn��{���*�"*�$]�
�b�*$,2����(.�8��9�<ϣ���h��ٚ��O�4�~�؜�6p}�ϖ�o�i�/j���{��!����:?e�B��]ijzh��oƨҞqϢ��8b)L�$8N��g�jbDw��ǿ�^��M?<����.bj���p�Z�3G]��؞gH�#��^Vr���ғ_�����1�����g��.�|��GPL��9t��o%%�yx����Ap4���^xz3�g�$�7���!�KպS�p5�7�L�v4�L�f�/��4mEeY���T�ٮ�91[���	\�}���X�T�jhmz]m~�MVS�0���1b;b�	N
�Q�֋I�a3m.k��BvXD��\�0�����6�;�����":�vu�� �V���
��$v�Z;X7˙I�Y�j��T��pՐ�T)-^�ęH]�ܧ��qǙ�ra�xx��i�f��7�ַf��&���H�m��Z�a�s��GIK��C���lۓ�Tu�ѪrUyS��G��m�+�Ŷ�<��S��h��<Y!�QC��rRR6"���H��w��X�+,��F"�R�ҁcBm��7�H��I��U���s5�<�V�]s��o��7�27������z�6��m�"�����\�T�[��Nd�5�m-P��|�E
<�7fNmh�Ҷ]%g�l�Te�ư�?|����wQC���V�D�z�__��
8e��m*Qh��:�dw��vU;�t󡞼pG��O=�6I�=�n`s�"����2_;#��Zy��M�b��jB�j0�RM�_+�1��*6�j�=��r�D6𻔰�%��e�ϰ��y9F��(B�}S�_
�}�aڲWU�*o
�E|��/֜Q�{�1�\�z����v�b����e�ۛ/�e�Q���e���Wnw+�W#�#�|������͂��W̞�t����o�/�;kBg�/�˿!��	�*}��eW-�oʽ��Wnl�-Rs�./J-
�r�Ϻ=r�ts%��͝~�
'C��R�Z��k�G\=��\|�6��n]5f��y�K�s}C
�')�8����:���e��!��$�+��>�	�������;D��h������DZ���,���ֲ���e���$�h�,�Ή��C6?�e��
��_Ťm�2�=��y�:�,c伱�m�zsc
�ZM��?-�rg�Ͷ�.�*���4,G$w�l%m[F(�j*��uUd]e|Ƀ^`�!b�#��̖\G˶&IV�MKwrp�0�B�s����Z���K�N��E�p�x��(rE'D�
&ۨ�zs�@V�2�خ�o�t��0�F�[�,�iH�f���N0z%����Ŕ�rk��N[	�?�~1X��R��{��䛻7����x���f'��63n5R���X�?p��B��#o�}�Mߌ�ή��j�H�)G��d쨉^&T����.d��I�QT�$Pt�4����R�A?J�s�b�A\�'��r=@��;�� ��tv�AXV �E�I�>��`0�o!a���}�����)�yw�v����/��B8�b"ߝsq><���qM����T2�`+7�7t���2��D�������b�H��3��c+���؟(,t��h
����vHҟ��od��ͤ�ء`o��Gh6��Z���f{^�ă��F��E�����%7d��0�RE��r��i������ϱɪ���#��(3��������ƨ�����Y����� �K�l��ӕ�5;z�ΐ�K�b��u���RC��U�-�__�GZ�V���hZ�r>��v�n����a`�Ԡ�!Q�_.7�z���Tu?"��K��Ф�z_a5Nzud�9������`墂�
o�CgR�i����G����9�w��J��S
��m.W�����B���X�3�YFaqv�e�r�^6p�R$�	�$�J�H���̜��t��%�R�L��9q�}ˣ�0&̓Io�k�q�X��n��4TR)mz���3�2d4��J��@��0IY9����Ѣ��g%���+Jz�CK-S9��H#%���^u��h�dØn���6*͊Ua��'�ώma���^�Md��8�^��c·����e��F�>�ӌC6:,]���V�l��>��k4���[5�T�S���ʬ�����u�`��lI�9� t�q.�,߰.$�<�9�	p��lg���J2Sp�-yEĉ]炨ɏy�Ƭax���:kiӢ���b–�)��^4���D�8G��0G;�Pcc�f:��F�U�2�˝�N�5�;�P��j'; 0�8h�9�)O�\�kg��f�3����Ef�c�����M�/{������MM��\�u�G��g��*j�OG	9`�*a�u�̯6���j�<4�H�[�i^u�������g��)�#��;����F{)�Ë�;Ub!�8��FE*��GLmo��JQ��Nʑ��
"����N��%%�9�eɲ�8��R�l߯��~��IcmN�GS�+z��m�E
Q.Xñ�j�c�9
Ɍm��DˑZf.b��t�n��y�U�'�9˧ɋ��g�;�@���G�#}:���l��Jz!Ku�Vk���X�����Fe,�gsy@<0,v8	U�h����l�
5^;�,'�E�u��d	!�\���;R��>��p��b6x^�%,���ggn�O��R�&��!�R±��෍�+�_��Ac{$���w<�nʅ�?�8&��oruu�2vs�o�1O�GQ�����]oÔ�&:2�%���(rɟ�@i��b��zpuM=�m�����/�dv�ҕ�(d��6)ƥx?Ys�%�͉����,�M�-����%������J:��/��;�Y�ُ�����"��aw�H
�4��b�b�b���|�ʘ��>��M0�s�b�8��=��8��DQh�܌x���j�?uz�cj�^���>�0�f��O�Ν�?�~��04�g�����M�aLj�8j
`m�_"¦�!�j �Cy��5$�+�M{HX�ne����i �M�@�B��%�mގc7��Ē�@d�o�{�~�5\��gD�FH��P`=b�^C�|D��p�l	/�ź���V
��"I����;��b%�œm�ik��/I�rl�C��*��l�>Σ�\̩�y�Y�
\ �0��E�?�窕�8�/(����mU���M�9�Q�$l�HhE��+;X���R�j+|��'�i�Bh@��d��t�dO��|O X�:`8\�7��)FғLƆ��F���:�jQ2���YJ4��Ȓd���h�*;)�+/�x@'#�v��P$iw��L�Ƥ-0S�Ó_�as�r�פz���q�!`�`�K���B�
%F��ӵ��z([�Ġەh��	"I��4���'5
T\)G�cI�!#R,�W�BU�J{���׸XQ����c��4��5��a�T�U�4�+����c�v��4}���<m���[�&�17��
��
��\�;C��)5X���0yWE�3��!���WgX��!7�w�>�=��0ؽ�vp�n	�#<�ڽ�{B:�F$3'<�G�5�諿b�*'V�m��ۄ��/	��<�6���&쨭�?`�[+���eŦ��������4���*��v)����f��]i�*�|�;R�E=BA'Z���QI��[���9���lO��H�h���.7V}�Y�NJѡV{v�eu��茅.=�2g�i{�/ze}l��H��f�ڗ~@�\�z���P`��
��9��W�� �& 悲�b��Co�v�
����I�����1��Q��!��D ��e�¢	�]H������A�� M��pHM�A��Mj
t	�l�2�q�̦5�9���Ҽf���&�O �q�Xq�)(��/������%�c��IVE���l��6�t�&�n� X@'����x�VyU��c}�X�;��m����[$C�,���ut�N����2*��.�.�!i��r��8�e�W0/X��3�}zC��2�EMc�xQ�x��?s�r�I��S�4��Hgm}ZC�R6�7M��yI[�ݯ��$\g
��|:qg�K͸U�'�n+�e&UL����Wg���Co�y)p�r�7%�')�+蟤m�<�(�R`?�Fك���՚'�(3�聍)�p�
#��i0eto��%���13��k��?�0�@��Ϥ�JC�?�I�
f�P�+�%��Z�5��K�;��-�D�ܒV��ԅ#�T������a�9�����P���Y�0�9�=�Պ��$���b��]�M!?ݓ�QfÍVQ�<�����}B��}]lxp-5�	B�ə���D���&��'5��0=�hȕ�z�P�@���/n�ՐN�0c�A!;���s�ɴ�h<!��⋈�W��k�?ڽ�X����PO�G��/n�#%sO���m7��iMi����\�y�����1�0=3���՘�R;{�
6�M&OYU�I#}�������l�r�qrU.h�^p��l ���#z��u ����0��ü����+��['8
��p�OP�HLB��()�Q;�$��,�*'[N3��/AR��Hjk
�"3b_��J���bD�xy����R�u�������մ���Ek!ň'IJ���i��@W���0ړg�a<)�6�����4P��6���m���$�{)�KR	���J�
�o��Mq&^��@��S˚�/���¹Bu�1 N�81�(��Ψ�F��6G\���L�=���?dp�����[�Ijf�b\c�*cd�N
z��[�e;v���l%ڸ�8>.%]�r�ҸGGJ��9�ȶܢ�/CȮb��D�^1�<u�K&��=r����<{�Z����BJ|I��O�'�,P�̋��;�f�G��eX�$|?ֲK���H푫
Q�s��Ӆ�4��ūg�3��I4�
<l$?�3寸ů:ů<ů_V�e=��i�Yr7��?�g��Ms#�w#��K�&�Z�)���)Z&�*i��~O'i�ή]�wP�
,�.��-�*���;zB�!�c
�]S���C�j{\��)�����A������4�ڸ)�Ԥ�h]��rj(AkV��5(���է���S��]�#������H���-F�s��Fv��GL.p��Ѡ=���(��p,�.y�޾,�S��wݮ�蓴j�j�`��D��w޲-보�ufL���>\�00����E����[������G���[�@6J�$`؁n�x_/�0Vڍh�"���uڍ�h����0����#��o/�IY�o"������:���
(��^�}ʽ|��w�?2Hi���}2�?�ڀd��ꠀ��P�?	�GgJٛ�y�7�C}�u
���ƣ�	n���z���G1���� 8.E�:����~����UNi��3���tG(�[Ō�V�:cP��e˅�צ������3��ko2S��"�������7?��磯�b̵`O�mۈ�)8��ip+���a�;y�$�t�N��o�v�����tA�@!V"���oޱ��3!�C�5��ѩ���﵏\!����v��ww�=�n`_�B"#���2Y��3Z�$�u��9t::9��[�D(s���"�(6�lveo���k#;uL��㙍�ܴ4��ʜ�X�x��u��9,�a�u=�:eA�Ɋ	��Ȥ�1�
��j9��R+҂E�l��n�JM����Z�xbE����o
N��jS�'rl=W�I[��?�5:�HvulE�ѣ�(O��P�٩����n�-����%����+B�b�-�T�0�F�xV��o+�O�ί���C�j���$��)*�C�N$-�|�SgTL�e�"<�G�n����c���O%Y�%����Op`q9��k��#�bN_X������笍Y�1��͔Z���ؚ�Y�r|;��h�Ƌ�2�������Y�Y�SUZX��gL���l�둵�Q���z=�6�m/����G����P�	���7�-P�V`6&h[�=V���H����DF�!@�Zd<Ħ��M!%��p�H���#�\���L)��[�Cʰ�p/�2�lJ�31 C��^�=u�B.씂���5��D����N��D��-�U~`�s���\O��9��>�����S�;5HVq��������G.8�a�8�a����6��.���
��:&=�S��]TxV��SL�R�ʦQ�D+�v_Ϧ��OdYLs"Iܒ�=9��i@���bS^��p�a�f���o�A�o�1�)Ei���ռ�eV�p�u��(�S�`�:�A	�u��D��ݞ��?E�Rл-������.ޕ��:r'<ҍa5��w�85��O�������.�`��#Z;�(�|Ox�a�7�϶��1��XC�^�Kߠ���"�x���""�#9���"�7g+���t!2e�?��b�����jr���'_�y���ٟ/W{�2׎�c�3���T4�����A�3��,�5/�)��#a���j�Q�J�/$xl�z��&�@Kͫ��;����Ǡ֯Qx��z龥U,��fG����q�["JLx��q�CW�
^tӾx���v�Brkna���x�C�[���̡�CXz�(Q9�	תWTIw"��	\��������-�"��o���“k��ҹ_�?�+�$�5�S�T����y�.�f���u�U��+}����ς8Τ�dP�Ց�����2^��������1��h�m�Rk���k��k�"B>j}72N#Rf0Q�Ӿ�CKX���;I���W��G\�G�#O^�?�{�*�����!Q�=�l�z��6e�v�
&��Ш|�k�3n��ݎ��N[��'tFNDz94}��-׬�ΰw��Nu" �!@�3�;����vl�CelSНT�֡�E�XB��f�Q?TA���� c�Lm�&5ǡ�z	��+��p��U=�7L�}n��!8�ťH��s<R�eS�p�n���nƠ�1-���П��	�<�ڻ���?��8��f��ū��ܘ��BM���:�.�8����w�t<�<��#�"�,�B��C���f�?���ZMȍUǾ߳��'0�RTL�k�'$��mkٹ�č�:�Y6��z��8�n,I�Z8��j>q#�����:8�
���+�����k^s�~������0��"+3�g�~���Q��E��%h�f��m]�jT�bJ�r�t`(6r�^�!�?��P�J#�|4	F�Q'U�LO�̑���dN �T�(ٜƭ!
��i��Jݷ��z��
*��L�~α�#�
�'
jR>y�K4l#pm�Z��.����D�۔��Q,�]|��W�k��NG�۸�+�dPǦő�+5���*��5.�:Ͼ�m����Jbί��鍷@��x[���Ƽ���!���N�B�Q�����z��<|��5.A��-�I{���i�K�	���)�#eN�	V�ə�2�f�
�=0�S��%�@�Uy���B�V^J�<C�b��%����K�P��b��р�_���헼e�$�n118SD�bŕ�(����z$��)Z�J]Y�;���A*�ϣ]�tP�!|�_�VZm+Zz}�˒��.�O|��L-S/���y��"�K2V3b���dFd�L����H՟H�ʀx��}kA�Q�zR�G�|L��hx\���k�L��ec,6[w��	t�.@�+���r�'ޚ4�UDo�i�쨳��Bߓ�^HN�_�rx�2��b ����L�!��o�E�>p�>�3�:]��J��1����Ӑ�A�k�������h?fOŸ�r�߆�XM*��\T�w��]���|F��l!��F
UF�U�e�O[���C��5�	�x�:8ԙo�f<C�c�ur��uy�	�J�����_r	�����%k1�<�磠�T��y5�6�.�����T3�G���S�~}�ہO��j�[��YeO���!���nc={Y|������
��Q1q̋�V��XIP�%spӕ�?�2u'�����ۂfK.��&���Gv��7۬���w���}�E۶m۶ݻm��m�6v۶m��mw��3s3���9��d%o֛�+U��jՓzN�¶H9E��S�:��R�
��[L���9�n����A�<5��)��*���15k�����˥
�d.�[�?�k!X�Bx6���T `0����Ἴ�64j�1!���q��!2�&�"H��5b#s�5H0~�w����rn���s=/Ӟ>'�'���C�F��#h�̙��\����#���P�"HIF�����#L�#ڕ���L9�<`�F�"��P���ҕ#��|����c�'�ܛ���瓰#[�4�4N8^����w��L����m��̼�p��0��k��?���05Ee��nu:�3'4��sp�=0w��^wh$c�hơJ'1ɘ_k�.�w�80r{���Գ�M`�\��e��{z�y��ә����2*q"��:.0�q�˹�*Mv�W���siO~Y�71\ty6�<ξ�~f_���q�L��3K�b,��-V��*0�"�f�P�M����)��d^�'$ g�'���-�=��<N�C�q�C�cb�ٷ��ASL�d��9�ep�¥q:���-h�ι3��A���gR�
ݚ�=�Y;#�����5�b�h��d�;�	�%(�"��LH7��
��9��Fk��c7������E�ÓG���q�,�
��p�xb��e�<��eJ��"?��V���k�53�#;�)��De�|�S��޹��F�}�\n��L��CX�.5�D�9㑌3,�:������_�n:V�Eݚ��pN�ڤ�ݮ��f��R05�@ϩ&��]U�[/Z�6=:3>�8�+��	�}���-y�q3���
������ʨ��\��
��y[2�ː��vi�J9D��{��-SZi���8|���$�YR�"���jj�t-�r|bd5qȜ��nt��T%��]Q��]��P2g�|D�[)匒�i=##s����U�6��*�јƮ�I)$�x�	$��/����Fb7}[kl\8k�3q��?&i��d^��*'	�]���VvA���08;�RZ�N�ަ=2��V
{�6+'���-���l
e�>Лd�P�%�q�.�7�s�����5��a�9�[ȳ������t(k���S���~;ɭ�k��S荓� �9j�,��G֐t�ؽ
6�O��Sc��b_I�^M���A�Wt�/�[c��TԾO�X�����w�����;��ؾ}��*�Q�� EG�}�OțCY����c^����D��1+P%�ײ� �
�O��~6�"�+b�`gG_��>~PET�|�D���e�N�쎮
VK�"�����������FgN0\g>�N����@g y1•I�ױ���r�!W[��_v�o�����|�����
�(��c�ְ|��O?x��o��;��ȕd6n�8��LI�J��))�d�ō�k3��;	RЫ
�EL�P/�p��Qu�xoU�w5g�M����j�V�w��6x5�It�Ut%zs��A|�P%�։�d�?>XU��C�q7��x�'�3n,������u�*=k��5V�,�
.U�U���p��>�s�e�"D������$1�'~��b����l%��u1�__
�2;>����F	���["?d/TS�$:OP��9�y�*�/�'ay����[�+�[��3����@@rH@@�����3�׊&T]�Ae]O�~�ˈwO��&(6���J�AU�8��Ņ�ѡ�D~��2]�}��}!/�1i�6��uZ�5��%�۵4�mc�����%�9��1i1N�$wu��gu��Z��N?� �V|>�N|>�I��6�&`2nF!�5�D�)��a�81�Q�H��.�&B%��-B�uᴺJZ��GL�HS�\�MY���}�ݲF�:�����j�&�Y�ݣ�7�����]��6����9t`m�($#�ٔ���n�in���ER�2�!�	��~�Sq]gj�LJ��U�6]5��H�2����H�@�V��ec�f���Ը������l��
�S��͵|�R�_/v�(N�H�]bכ�U��j&C}Yc0�ڙ�%�˩�eup�U�u}����K�mm���
�{I���t!u�x�OAk�~k%���x
Ȯ�6�M�M��	k�ߎm��D��)s�\#�H�W�e�*��ɡV�@'�}��6&z��H��T@BA�2;��K&��Chg~�d{��GVӓ���Js��R :;�ڃ��R��Q�4�4�[PMn}�ɽS�TM*�e$�"�C�d<7�W�0�)+C�<�H2V	��Q���T�cw�s`\T#֜�̓��)U�FQ��Z�E��������f�K��ߘA���L��`y^��:5��N�
��Q��!���Ѫ�����n�tl��]����H��0#�`֝��s-n�!$~���e���}��vj�#Y��^���M�<�t3�VF��9�TT;R&�
@��R��~Ξ�բn1�i�q��\)�8\@�a�?F8R��5�䑇�.,^�=� �W �BA0�A�7�Q��y���_��qX���
@_P�b13u���:�;��t��=�'�(J8I�-��n9$p��-��	��C`�A�z4�]�K@8[�%��C��j�<q	U�G�k?0t��8���~|�b�H_`��%���Є���|=:@�:?*h��'�gkU=&�'�t�eyCs[,����@��j�Ew�����?�vE�yC�DLH���30������}�/�c
�.�ɮ�n����1B��m�+��.��M#���яd9��m;�Gz�U�X��U���oS�4�6J�$�4{P��b��/=+��
��m��g[��b�E���{{o�0�֛���G��=P����n��,�o�s��oņ�<�}C��w��?�,����1&�O�;i���������7������a���M�ݻ	�z"0�{F��^��8����۠?*�DTs��<�}f~C@_J:A�U_�%�=cӶF/~yt	�8P<
$���MP�F��Ŏ�#�}�
���q�`��1�L@���=	#6��b��u�xd'���Y��>��"�`W������zʻ��V���T�K��O����^K�[4�
�C�����u1�"�u��>ok�K�ݽ�E�]�ff�i����g�7��x�?��YH�A2��j#Iɏ��D沿z-��Tc��.J�XU��눫%��_�Wϒ�q��朳��Ȧ����]iLƨ�5qoe�r�к�m�Ե��^9�۱ku(�W���.{�BO�pX�Y�F�?�q�+%�0���.�>��CV���0	�
c��,���<���;�9E�Lz.��������<�"��!�G���C۠_�!Z6j3$v������qd��S�p#�ּ��h,���n�?�x���7M��Z�y1��2����Q�>K��ט倥xj1��l�W{��8?�����[a��5×�A�!��]��®웣�K��)�D��{U�s�+gP�QK)�)��d.*���G�<�
���x�����c��A6'�����O��e�<
Q��\�����׋��8��4��s��]]�[he5
�Z-vEc��JT�V-)��_xr��q�������P��j������v���&P�F(g�O�
���-��D�������E៷����I��a}��ی�AKGu�@o�W$����BY���&[����󖢔32WY'��LH@���B����MhL��w*���ώ��(�4}������2�y��l6$ܙ-Mc���PuVcG_�./�t�֊���[��P�ɶ��u��a�K����Jz@M�R��s�h����U�m�c�%k��7�谝�A���T՛c��–����a��m�~�%�-X�R��nc��Ľ�Fi��}8��ǟ@V�NwC�������t��V3�F璪#u�g��
O���:�\C
�j�p
���O��sN"\�̤��s>��
���ڡ��Կ4���]�c��+�r�{U�1}�\��΃vs�iSY-�}v�MJ��j9���ԗYq�O��H�j����wz�4���l�d�t����"Y�?��QB�����^qO�Iϩ�ޫUEA����(���4��[u[,����}ޞ�A�d7�ƄJU5-0ߪ�6��?�����̀GaP5{m��0)�����j-��XlM�����zy�i�=gx	~Y���r����'v�B���|��3��vzn;a�4��X;F��C�x��=�3:0�7����L�k�P70J�x)�#>"��V=�h�?�id��Z٭g�q���W��d�s5���p�7f�Zw�O�:�H:��� d�6a�8�E]����A�3��i�z!�h"�z0��9��#w�Ag�"��!�<Z"�D$B��Zt�4N�O�ځ�,_����`;���h���G��pj�j=��ѯ[�>K�ӲON�V�g1�:�>.��}7b�ޝ	�1��]j�n�[=V�\k�=�ѝmN�{?r��`����+���҇��0�8�J���������-��`w��e��8˱���9�#���_�>]` A�ߐ���)¨U��UҌʦ�"k(�CP)}<P���by93�~�,�ʆv]���~��P-8��.���J�9���λ~�,D�&����x�
�'����mK�+(ջ����36�s�)@���5NA�H�>Xv�B:�K��i
$�Q��'w"P[yS]��+�w�S��\��?��!5��L�?�I\�"�D�xr�#�^�҇;�F�1�D
sd����p��t��UgHJD����W‹�Ub����]XӞ��'E��Ł;�9
)+uA5�جܣg#`{v8�x�'����lIl�M��m�Ɗ���7�%&��A&�Qf"��E̅h��HDK�Y��6ʵ+r3(���6.�L���qJψ3L�a˱3'ա�/	��a���Ir�*P���jƞO6ƺ��+���*0XoE8JSyEY��OpD�@Lvz����/�ۊf3pǶK�x��0��c��e	��G�:�s����x�!���1b2�-a��ju�8v*r�m��N�V�8̒\8җ1LZ=��[%�wxſ��%z�OM�I�N���829�b6N�|t{��ϭ)08O��.��(���	�4���y�n��H�<�}��}��v�	o��ã��Y��D�)D��»�º����G��!���O��O>c�r/\k}Q?ۥ3Q��1~�wE���������VS��	���T��=�7u�q�{���rx  �	���FN�
U��l���k��%����m�Aצ	
��E��VK��2�V�S3�N�3���ueF��B��PQ�j���0��0�ؒ���Ȓ�..X���yE�`y/����C�';7_;7�y/^��')��8�CRFd11a�>�qހu��+�돡vPwG
,�hc��j���t�_��q�L�I�TQ���J$	�"��l�R�ߡj�#_+D���H�bGE<H�i_�Ƨ�L�E<�+w�y�Pha3��"�,�\K�sh��n�4;њ�,�a�.R����-�T5���g�����G�K�i�o�r�IMc�����}���rk������S��4.[V,Ǣ��]b��-��8�	�y�'2�|}B�a���#��+��_�ڃrYmWV&R�z?&)�&c�h����4Ź;Db�:30�>�iF+!3���vm����	8�L�7i�v�c�èy�VD�*[S�Dn����l�T�3]�@�u�5d�%oO�MC�c���X�i��"NJӈ:�S)��I��/{�/v���|���Mdύ�u'7� 6&�?���-A_�6����!��L :��n��\�,��X��\���͏f���N�n�x�3�!
.����_���SěŠ��ǣǴ�z����6-�J���ZU�d_Y��vSK�d�B�
F~�*���� q<`/<F�-���n
p�{�4�75G�Q��{5,Leᤍ�R�0�C�0y��/���-;�Ƚ�/��E�+�&�����L����1�EBh�g�PPڲ���\�e�>�gϳ��(춭,����ͼ��gb\��d4�D��=�Ho�l�G�%.�#�qjF��I����E����篽��Xr��Z�őճ���2�&���I��ť]8�*C�َSj~F����[�0�t[Q��9i_���7�mk���)Wp����СBԛÊ	߀��_������w�[�$m��s��N�u�� W��7��6~�n̰U�Y��wItI��_���-G�MM᪞����VB��g����(fKP�g��~��SMχB,6Huaѵx�5��-L!3O"]^�ھB��@[ q�,� ~=+y�&lG�#�C�w�3͕\��{ʔ6@�P��Yg��)Y������$رʐ�[��&�l���Ѥ�fM2�ɞ���z����V���]N���2���msco��7�r�^cߊ7w�[ T�S1oY+Frؼ�^|���("[�E�F?7�5[V�w�	��s9�^��l�B�gj�V����@�ۃ�͔�OA<�����oV��b��<�nr��9��0�_fd��Y�-<��S�t�yٛ�~Q�V�;��}{�{��N���C�sy7�6�mG^Zdn��9���;v�wi%%�m|�b���}������)�p�qk��qo[P_x��)m�2A�4��AW*��1%
��4��\F;��E^�D��,#�1�y���K�_��u��3�
�L��(���z���	vZ]pd�b�&��k�=�S0�i�$���W�圍lP�U�z8g���A���sG�<�Vq�kӗ�zb�+;K[���E��E���d��A�ӯx��?���Orb���p�
�'߂ק
�)�lP�)H��[�u���[%�)�~�ZyN�]��x���Ǔҕ���1S-�sj�W�Ⱥ)����uT�)���*�؊��c�\��X~���&FSG��0�Y毾�WE<�/z����P���\�N�<�,�y���:�7:������H��S�%�O�HCD�?!�����h�ֿ����e�̙ �'�!�"��J�$&6J�M��6d�΀.��Csߴҩ���
�LSFA�h��Yi�������[W�2e�r��m�!��:ӱ�»ۛs{.��M��r7%�l�nA������j�|Te�a:���V�t�D/G���J�(��)�z��L0v/06V{�x4�L$[`�����K7]��Qy)���0��Erb=n��7�֥�CY�F_fLs5�1���M<��;ɢXOs<�d�{�X@(�B���$�	3��9�e�C*�D@���9Ъ�m@*̆����Ƚ��CR�Xj
�*����(��M�FtiN��^H{���&��Hs�*���o@��[��}��m�GW���$a�x 4D�{G,�}�О[0/�5�G�@\��az�.�n�֡n�1��{l�����v�}@�:X���y@�'6���U���rT��9m��ZCl��9�%rgV�����֚#��E���ڶ�T�E�{��N�^|���^) wI
u�:�B���3�B���9��X��%g!�5�X�}ۣ�`W���z�!~��,��ଦ�1sr���q��m�Y�↺*��M����.v<=�����K9��`W�g0�Bd����@��
J<lN�V��ǃ:;���r5�eU�_������C�Q�t!�I8J�֌r7�@�"�D�I�i����G��^lX2��&u�X��$���0P����9�="�B\���N�c���>ِ�̐����jq�^yu���<沸�l~�Z#6�2_[�G;�w��<��r�Ċ��"{�sFbb�^B,��^-,�ޑ�xɍ]4�0�-lZ��Ք�'���t�P�^�t��n��XՍ/�x�������a�r�,2Lggǂ�On@�sv�h��Z�V�2/���<u��WH�l���6�5�a��&=���w�Td��?���%qC#]��U���*e^��e�>;��Y��L�*Ǟ=���H2IA�v�v�
NmO7�b��e�<G*+�V:f���Hɶod��^��K]\�ɠc͕�}�78B8����rqE��-�u{��z���lvŷ�qʳ�a,M���*��{_]I,�uc�?�NK@�8�*���s�;i@{����E�?���E<�8A+�u?�3?����z)��.1�vE���W�R��a�e���iX�̔���Lu��$ޤny֊Q��J3���
˱Y|�5�21W�R�!n#�@��⻡S�������zv������ޝ?�
����1�#brg��M�>Ȱ��.=ҫN�ۦ�ɏ���/�^��Goɽ�����|=���g��
��>�=��ί��w3�#Gs���ʇ�'���zd�qy�:���b� �\�o�f?���7��D��9&ŌO�ޥ�/����#�
"�/|���s~���3rBB�7}�{�o�^�t�8�c�䛦���Gߩ��7�dB0z/Y)A��o�+�2���Ox?,��\p�D�|���:�B)�\!�<>@�
�Q2��U�8-)���-���œnʁ���L�n�?ZI�S��e�8�`\*�/잻C*��k���Zu���Ԕ|g�����a2��4a��o��=��oBA�{��j��
S!�`���%�J��Ԃ�j?��I�,
���W��L9�Dx��J3RS�V�M��5UX��e���Nv����R�T�=F��R�ۨ���7���Ք�i���f�8�i���6����],�l���Όώ�M��ٖ�E_����{���X!�T�b[a_�R`E*5�I+�O�����W8�g�K��C���7n�V��]�|��v}�Y�@��ˬ�tt]�ް_y)�53��|�A�@�i����+;g%&/��%p�A����/[���)"Y�~W�U��VxJ���h!�,�
#R���ZP�A���ň��2��M���*�zDaMV�_���*�^33�+<�Z�b�b``{8��j������+�Z̝�z���ȂKat�4ߞ��)����З~b�m�C�Ϫ(�����c�*3{�xڒ����
�O�x��Uc���-RK�.m�s��й�Y'��Ε��r�<~϶��ps�_�Ttm���ޖ!�l��j
���-n'2��1�t�C�c�d�OVy=����à�]6�]W<�X��}z�"�X�$-ww6��.K��ώ�5Ύ�3%w?۹�qb=y�Մp
)A"�!�\p�Ƚ�Tn0�m��lh�:M��6�#p��*�29d;\RV	��"m��{�.䀥�Sy����3X�
ƍb}`Z�ܧr���#�\�#z�ń�hB�]�I�	瀘`�&��O5ϸ_���<B�#��ֳ@���i�Rq�Gc^�o�
h8��fA�ؽ���MIv�,ax6d��A���T�|�SY�`���g���3!�m�I���4ۚ�� ��_�,B~E�S���f4��[��M����BO�S��<�`�0D�U{8ڨv�=�%�9;e��<c�e�1K�!m�	ˆKT^!���5lr�pe�O��qo�4Πf��Fra��\�F��B�)nw]�:�S�K44��������3UpBdG|b�>&nj]^��;Xa�v���(Y�i���?~���{�
�o�`�j_T��Io�W��w�iv�q���q�]R�
5L�`߅�yMC�8
��Р�CAٌz���Ʊ�?��.V1�`�BD
���ڃ�A����i.˪���)�.2㞲�G�"2W��A�}�7>�gOz4��
uK����P*�콫�ʤ_!-Q�bZ�J������$��1�v@�w��j��
�~
$�٤n�P1�R���8}�r}����+Dla$,^H(��x�]`�#*6[����l)��A���)#����8�$ �>�B�[1 lPVx�'�`��rC��0�p��L�+��|�B	�I�Y!���x@�:?uh�	��@%���b��p�@��.��A��@jD}�ꡏF@A�Bؔ���VkDiy?����G
��^���M*�|䬼q�����J1�2m����\��Ѽ�E�q?���NP�^"<|�ln��{D��|�YJv��&��5��y�y"��Gy�?yΝ����+1W��+�+��4�ʧ=�|J"�W�`0���aM��Y
(�M��<?Z4������Ϧufe�Ȳ|�IIP%
�*�Tq����P�"��4P95>��爡ի!;���Ao��zt�L�ʑ:�b�1���fa�A�O�na�5_o{�y\/jAr("��n��?�aޟ�K�-#|	$O
۹m�g8��8U��~�����X�!04"Kʑ�g�Gӏ?v?�@�-�sɳ;�a��9�ma�T®`�5�}��x�;Y`���z1u
.X1�Okw�+,lB�2�Qbk��/u�U}�r�x.uN�.�է��y	/�"�Zo�3���>���g]���2<���-<C���e�	�J*n	�����{�J�Fa�<��EnrM�M7�	���$V�}�[s��<ѵ�W��s*��P�o�t<�$J�ǿU�.���QH��������
�j0�_��n��'��}�b�6.}��u�|�M�I늭�(
K6�i �DY@�t\Ro4)�0?�hd5NV��0:�;璟=�M��^�XP��z�*�����WIP9����}����?I�a$��/|�����hQw&>y�?�	�x]�2w��LR�p^(�~5z��9�ټ3���F�)>1
���/Z|��(O)�ݰ7��8xux�>�`���	�{-Y���.Z~43��ܐ���y��/�G,-���V9����c�D:�%������"��vYA䋠�HT�-�iG�]\	�dnQ� �F�tb�)�+KT���7Y�W\�KΔ���P�gF����
)M0�-Z��]�f�H�jZ!ˬ�)W�/�b�F�J��,&<�U-M�|wZ_���,m��MH��%(j�a������܄W�P"w��uM���b��r�o��Y����T��P&�#1�,�y�K/j8�eA��¢N��΅ʷ�z�z�`<��X	��QK�om�0m�u+�X
Y�Lm	��*�|+��c�:�y5�M �e�sex���w����jH�L��+���6<���Nj�1�t��c�6;x6�"�_�5S� ˛EX_��}r��ӝ�pK5�Gq),�z�f�Q�;�,Z'56\�O�
��[�V.݌�r7�+�wG�ڊ`�4�z�=Q֏%��]�[
�bK2��^�i�	e�-ܷ��
M�8��R��"�-)0����lz-�|+2Sj���P�U��Z-*Y����!ҫ�Tۥ��
�E��YU�.}Q��)�A?� IJ�mP79ű��wĴ^f�����v�^�*#��6����m>�vbZc������g�)�;M�w��p�f]��7�){�X�[	*U��ev�x���jm\2�Υ��I�7%�>��R15��
�g=Ѻ����D܊�n��.�I\nr䟸��/
����hA;��5�N��	�/�T���=��H@�L4��<��%ڮ������R�]	�*���&�0�/x���OSV�EHW��rJ���Y���I�T��(�K]���z��׏_!�[�2yv�j���;	���g�d?<���	Zb�K��i�,e��Cb�}��&�a�c�W�oʪTL�.|{���9A����f��<K�}�~��8ݍɟ��Ϩa�U"r̩����⢖aU�Ů�#1*��P�h�+W˥}�[+W-��������� ��<�vJ��i�/l��,�	#V,��y�~���`�x?�?���i~e�(��,C>J>ix|%�
���G|a�&���3X�-@��2M~���ˉ����w]N�o1�ND@>B�1�_60�e�1j}S���x��f͍HN���A{=�9Ӛ��g�<`��
����cW�3�k�[k��Xa�7_e�Ձ�hi9��ȡ�	�J�HC࠲.����/Q�}�`�*Xג�i��_̞_vǘrU5M��~�~��v�=��K�2�dq,td�
�E���>��y�?��Q�A9S�q�*PV���k_||Kl�G��m<;�/U{���
�!���wp����z�Ff;"�t9[�ev? 
�WA�PПb���o}�ĻE�ܺ��s(�9p��+�v�g�ܺ
�ƻ��ܺ8D�����%��^6��s���ً�ދ�ݫ»���-û-�}E�"�;�/���Cl����.�jF`0P�e�d������b���r\��,|�R�<��P@TJ'(��Z�QZ�`b���s'r�Ȩ�T���T,���*��l�3ޒ��+%�.��oIG�:@ܟ�׍>���Y�7�j�"���<��p��倦�����hj!G�B&��2!RH6HBD\4d�8[,�C�*��8��[|ˑ��jE�:IX��������~�&��Y��Si�*��B4*�����k��k�Cq��`ԥ�bKe�B/�����GL�q	�{�j���z�^���}ش�6�$��&q�.�K�^d��c�H�/d	��옭ĨˇW��8�:N
;�-�!��c�����א(�:�c-�^hRj�(B��Y��&ަ�˜
�lJjӯ6���J����K��Mhg�Ҷ�f
�G��$f����j�,��1Z9K��'~{>���R�"�#��R&eC���L��X��)�	��5���:�x��o�<_��9ſMH��v���Sn��;
�i(�q8�C��M�G����d%w.
�K�-��c���mQ���>�a��|��Ǣ���eߍ�&����g���(l�i0Ǚ!Dsl��&�8'0��F�bqZm��+�JV5��SY�M���m�#"CO�~n�S����P���)�Ry'*���m'b�YӴ��M>�
(U]�
K�<�W�B��a����,<T�L<t�P-�P�\.���j����~�h}����NR�.7`~��&���`�ܱ�&�i���TZU/;
�C8���P�<檤���+����z�z(I&wߑ��ԛ��� \x��1�F.w�D�.��;���yt�QUʛ������EdEڕ����Ql�����ح�7�l��k'�U}T��)�;�:�O�V�<�w���-�2��T$lу�ٔ�۞������o.��F��Ǡ��.t�_�P �z}D�R�У�6�`�<�� ��3�/=��S9�d!a27Y%����_KLL�Virx�o����#�%6��~��C�B�Xa	�,;��8]c��j����WZ7R�&���*"��6�I,;����m�v(ɂ��]��^�
y�gGOW�	�纴
�Y+a�iq7���O�J4+"6wA 't?I�1��a��l���aBv�q)pU$��).:fhS�	������p�dZ!H�ek$g�h�g��$��!�iӏ�Pc��[���	k@�[��N�v�S�F�J,��Lk�_ԑ#�aY���ٷ8������Ҏ-��"�4�B�k�M�r x�=�Κ3�1��e��@ ~�!P�	���H�n�(D�Pj�@�N���lcHaG�����ԏ�_i-	t����Q��J1���dž��Sb S�BV�+�@*	�����i9HI4�H���@a��cS@X��3�D�B�(���ԡ]qzs{�T�(��);y$���un��thL7�DAPc\/.��O,��Ls��E�dc�9_w�#oMI݈�}����Щ�]����T
�c�o��2��;��,�@���'wrŰ_���Ls@�}8��	�s��S:T�0x��?�V�*����o�ʫ����cV�c��2Tȿ*c��h�J���x!�VHz�c�9�:���E�.��yE1;�q������u�������|�<2e�����BQ��Gh[v3{�ikԮg���sM&�J�u���d����#�;a�{f�zǘa���8pCw��q�=�~�}�������k�,tS���)kp�:���?�����I�����a��`cib�bio������)p3���������_4S{'2���R�WF�ZݗSB�
�8��#�CEC��v�3�kﺤ%�E�6<Kb�\S�4��6ٟ\u�}���9���Z���L��7η2\�%^J�]Ƅ��2�O8�@"�M�=�1'-x�9BR���p�Н��&R�"�`:���(�
Br�yZ^�<�8tF����&r�.:�F���X��^U�Ew;lb�/�=�7�X�U�b���2��t4�����;�+�A�j�m$i?8ڔύq_���2�
��m7��f�d�*��'oY�W�ٵ��~#:F��D���Γ4�h��+��~"<��e5��4��n8;�����Fl��;�'3��$�h-;e7͇+!�$:�N2ϓQ���W�S3������;�?ܦn�����g�h4�A��&��hD[g��:hxT
|a��1D��q=�7�O���eϒ㹋�G�v>`�Y���]r#�k"I���{n�y���c�����cu�@\+�Qf4"�H٘��Q٨Y�'�����Du ��Ҥ���`�3�($(�iT7!�Qz�8���	]�TWm>��x]�xUN�t$ƾ���TWi�NE"�HcvY�ӎ��c�6�|۱��W��e{��ZRo��2�J�F>Ӎ�A���;��$�1�9
a9����9�|r��:�B�’Ē�,��$�%S�&lj>�jJ[�$���e��^5 �&��o�NY��.�6rh�o���D��2��<S�l>�0�Q�N��D4�1�$����:�bXؕQT����Ԉ�$=�i]�>�x0�Ky�M7��\Tu�E�bP��9Dpa�^�����`|m�^��T#���x~�:����Bg�7��xH��L�Ғ�MQ����%iN5o�M�RRD��@�h
�ן���n46#d v�˭!��'Pqd.����C�BQGX=��$��3~��v6��
m<��#�	���<V_�l����I�Ds�&[Av���(���#9☍DY����!�Dc�ϑ�L�Q}����;���7�_J�+�~�j�,��/��!9��!9�E�3�A#�Ns}@�MX�
�7�*7r�>T�;2�1�p>��2&;�s�wqj�����W���l�������!#�s�)]��^d*�j9m&���BޓQ�yꩦ�@��VI���|��v����ĕ�Dk��S�E�s}�� ]5���iۗ]�D{��k���6R�@J�X�l3SS�F�'c��4kR�u�UX�Y��}؁�AAE�\:��4��e�I�a��t{{
�}v���O�I�+������E�4z
	����=O���;�C
Fe��Ҝv���im��
P�g�3����^�x�Er�H��Lcي�U��a�1����zF��OpK	��Q�%)��ߺbK��`	�
n����@�dY���31��{c��wm
xАX�l��o�����6I����
�%i
�PY�B���&A�%�L��zl�W`7���q�>��V��4��M�
�)�97����kp�UJ��K�MB���ӄ�p�X7���.b��9��_�"�Ż�dx��\c�>�}ڕ���P��gX_CDn{d
nQX8Z0'A& �1����QG��Č���S�w��o�9������%����RG�e'L�������rN��UZh_�"��x����pu"$����G��,B,I� �X�(�ʫ "}o�IT"�j(�>��R�b�Cu�{�Q19P���}r����u�?��5]��( X���[���U�V�t�9��:����M�lD��RN3U#�O�%ʲ�"�hߣ/-:�/�"��"W1�!L	Qgg�O��_U�b�$�g���ӡ�f���>x��/��8n���x��Ք
��"/�j�e�sn_��0�P�0��\���@B�
�`�')h5��kXz�����28���I�0M�vt���Ǒ'R��]��m i�z�ő���3	��T�2[�����8����-h��f"��PX0%N��c�~s���*�m��N#%l�NK6j���B�a��d
Cϊ�pެp�/"'�$�,*5�/�ϖ��tlnE�60�N��T��v�G(�k���=	Ll�PC��@��6G�jɏ(��P�DK1f$�̴˴���@����3�q$��WoB���A�?�}Sp.\�uNp��Ķm۶m�v�Ķm۶m۶N�wP5���s��v��k���^�@@���h�:ؘ�W(Ul��T�}od��w0�B�Յʂ%��E�J��)�P���	ډ6l�S7��أ�LՇ���V01ϼ����:r��	��1v~n�f}n9��x����!�1W8`S AvY"f0Ə8gٖ�t0�g��y�͞�a�e��,�RNf2�l��G�:�КtV{R0����0�!Zj��q5�[�oq���"�e:�&��dX�A���}ΡZ�]�8�G
�$}"w����`'�
���v�%3-@����\�s�����ӗ�d
���}bzc�9�c���DZ��r!�Tr#� �`��::φ��9��X'��XI�g���q�T�%0��\�ʮ�$���[�����;�X���8��������>jr(j#�=�Pզي,`���>��ػ�-�\~Lu4r:y��r��ܠ����j�S�G�t׾��'C_�H>�Z���3�|y�Rhd�~�1�*ݗT�wRS��f�j�en�	+]���{��oB~�����n����f��@�FA��4w1�iǃn�CӍ>xF��%����҉U���Ã����F���IKQW^iW��SQ����&��@x�o�ghK�A�
+���B@6s�u1��8٬�>�
iz>HtK���eNFRS��n�NK���E!��ި�uJ�q`��g볗��i�_V
v�=}>�JTz�7p��Wk�Y�
�ï�H��z�4��TzQݢ>[A�=���1AK�+e�yk�� Z��9�i�Bl��
�4���Z��B��
$�Ҧ�� ^��.X�^7�.o���-�S0:1���zH�20�E�{�
���{���~1�ID�����~���h�����}��"�����7@��w��(�*%T@�O?�n���U�mG}$rvAc��V��b�����8�;��Ą'�YS��c߿���'�?����6f�����yx����l}`C��q���̕����eΠ�ӗ���K�*kS�����
�����'�M>v�ls9|>]gg�v���A5���4�������їR.�w�|��,p���g8�c��
 ��a�
X��&(�p0&��`���[�?�����x�(�M�#T�0b�뫾]�F�D9
Ǖ�Q�Ҏ����0���W3�z;���Ԟ�Ӡ�4a�~<�"LW�k�G�cLw��H
Đ���q;~g�>�R���r�س�ހ�"U�R��W�.�����h��K����,jLO,�?dXU��M)�t�K�u�� �5{�1�E5#ȣ.[{i#2X����\�nF����
�'�'����� ���abر��O~�}s<��c�^�{��7Q�?��tFLf���ud�z��A\HsE�r��<�ɭ?A:��"�L��ǰ4f&�v����c`��Ix*s;:޴N����3k�\��Q���j�4Mqj
�D��FFF��ƩcDƫj�}F��k�_��]��g�rD5��}/����:���i�/v��ԏ�bf�����Cz�0j�U��j�J�����.�h�i����q �F\O�~�/	��U�G�a��o���p|]n�s"�|�dtƚ���'o�.\�!m	k���6f��r�\[Py�~�Re�
Hm��F�b;cN��7��
�!aN>��V0|���y�r^�dTß�ΓUɡ��
hU���uR�����A�,{�Uק���uLÝqψ�!�~�+{����@��Y������t����}g$��z�i
�@,��@#�[�iD-���������lM��|�����\~/��>�?��|�l���Ӧ�&n�r�z���|`�1[Jh�� Qx[��,;'Ю�x�`Dۦ�q
�=c];J9�Z>e���L�{x��S��T�2ٯ������-灗*��}5lE�TtX�ƅ
��uڣ�����Dk�Il�q�=��PU��S1(SLSE����f�Q���갟�gwv2�ʑ���'zx�j�������l�uU4i9b]�?#�Zg�G�$X&jzP�ip$��1��U��X!W�u��%�R7��+7�5bw�v��F�q�F��q~�j�lr�
B��]��	<����"�zϟ�o�k �Ǡ
��RG]�{��В{'��$k
�=��	L�{��V���l��0(2rï�m�����S��D<p�@����2x�-"�X���&`�j�by��*����Бڈd���5��8_���3��c|J�!�K9t����(� ϪS3V�ս�<_�\��1��v�J��K�'0x��2l(,�lF�R�e�e���TR�Df�a������t��b��9����bmJ)^�V�ry�Q�]�7M��]�H����m<��������Zزu2~��]}�m���	��|��U�+������5B���C�j:-}�U?��7�7�<��MP���y���H���؎If(�IL5#oO~��i���m������f��r�1
�%o�TJj	�V�T4����Hܼ��$Q������P;�6��(�i�UAox��T�&�3��Oe�;��;ďwR�w��{��Y�D�Q��h���$����c�P�~�>��t�h�����1mX���A��yK���
�x,�DJ��ˢ�_�േѐu2Td����&4��a|�}e��W0�k��F��耀���i�?ws���b��'�#q��J6=no���8
�8�l�؃$1��	��VE��E�F��Ж���r4Z���r��y�PgN��j���qG���u�����f=u���wπ0�x��N�f�#}��S��qɽ,5�tNV�`P�q�B�� �[��Q�x�Ouܾ���.nU�v�#:ʣ}ƊGyH��9;����{��X�:���v�QΘur�ȣ<m6�')_�
��ʸ�E������aNz�|�>�}q!����ܻ$4���6f��I��g�l�{�v��Qc�Q��>w�ҹg
bQo�]p���@?3����͸M�T�oI�쁔��ߔ�����Wܿpzs*��j�[�t�K��Ќ7Mx��M�
���G����|%�R���Σ�h���L��	.��a!�[��j�M[�mx�9Q��T����w8_r+��/"���3|���۶=be=�B=r�<���'����#�T��/޽�f�g��}�>��s���#��D��'�_L�x�s&_�|�rPOI0��C�C���f��d�⾼TsN�3��]����I�{�j!@s�h'�趾*2��.��� �ӟ�w���&��g4ٻ/s8��cw10��:l?�'ߌ]d��`۟����.��x�����O��~�?s���x�(ˢ[~J:8yLY���3Z"0�����fQ�r*,bl�kn�ܚ��~o��3�r=̈́��V,=��~�B��â����7�X��6šM�tB�?��v#D�)�Բ��9q����k��I?�wJ���0��p
9*�k�o�0���aUv&��Y�����	�Ik߈��M�����z��i�nbs�up1�l�X.e[���ƬR!��OPǂq��T�� c�B!VS�VB�u�t9%<��và!����"��cJ��A㏌�֔�a����L��v�ɥ5�nTGb��TNJ=~�T@4���h0�믩�/cI�x��H���/mU��[S)�8F� ���j�j9��Am�Yk~I�3�g���$�A�ָ_��ImFj_�fC����*Ν����sz�5�]�-X�g�����8��[:��prP#�E�J@�^�{���G�9����T�,X����G�����I+Wi�D��Y!�lR����oT_��ꛡך���cտ���Ư^-J�5¦}Yu� ��Dֶ��0��ӫS�egI�ٛĹb�&��}5�W0�aĩ�0肧���H;胉3�E�[���S���]
E��ۊ��,`AnMZv�M��

<�HW�
F=gWAHv
n���6��t�?o���L�M�'�t�@�q� ;�pS&m��i� ˟��	��D::��G`\'����p� &'n�O�M!St�ɻ�5s��Ҫ�Pu@��z��)d9�.�/ ��
T]��N�)�h�0�������#��d�U	߂�@\�)E9k��_���u�`n/aD�4pS�	#�M�P��Qo�7h�%�3R��9d^�g�GD�� ���/1T��ؗ��
�J6�4�`x�P	3����CElnj�7c�f
L
���?	��󏜞_#�mx�~!�I�e���/�$�Z�ֱI�7�1II���B?<��� RC��=#,,\�/6��!G�����2�)Л�뙕C&�	,8�H�����G��	�a9����;=�0g�Rџ�~"X�K�H;�q�t�4�]y����3Ҽ��� �A��[W�A�un9������z��Q��CLov���ok?�E�@�`^XO_�0��HZ�:-=W���-���sB�s�{�2��i�L���G����4����[ۚ\��-�+�@�!��sQ�C�A��Q�[��"u�/sI@@���6Vףּ�n�Ձ0����â�R�'��/J1��Ā�Q�Τn榩Y�o;��"ҁic_�@$�`x��X�Ф�f�"K̥+C�$��&?�(���J���#��ސaZv~A.�<�	q(6�ժR,3�i�H4����K�����'\Se.��l�i�L�dKy�V�7����a��J
�3ˤ���h����(�O��i١аP͚�nW�BJ
l( �	�`��E h'O�`��!`�8mR�c~/�Kܙ!�bĠ�pA�T��f�)�=7è��2'ز�{h_�65̅�p����&0����Il�ѕ�Z!ФN��W4�T��Jƈ��nhVShR���PRZGf��3+P��3Gw�6ü����F������eso[[pT)�DpJ�OS���$�b&�D�ˠDVR)&�y3��;bc^�w�`�M^����S�Qmco /�T�_(w܆�U+�C4�YTQ�HQ<�i�
�c�
�eD���૞wrS�ay������e.w��Cl=�D8�T1ŝ��L�2Xk9���a�TZ����+LUT�t�4LT�B�P4�dO�B�%�lgJ�o_����U;NE\�P���R����L�Kl9_��.&7�K�N~�7=u�뉄��*�
ղ���M��g����ܗ�)�X�^چk	hLtfdT�H�jbm[�T��.�՝��TY�IO��D:��UDgYI�Y�.7DMva���Z7ar�C�Ύ�U���d��aRq��'�j�;Oҷ��!
[�5�m$\�9D�XRW!r`�~qa
�l�tX1�'��^~�%T�G�g�7N	��σ��o�W�mTu��+�FY��ߵ<bI��7G��H��7�06|C0>ڃ��8[�m�Y$��A蜠��k��:A��FT����ػ��)
L�S
�J���Xf��DKT��1c"�O�ֱA��XF�-Ma0��:��O�BgP#��,�'�8��<��Ҭ��c��1���w,���-�3�x^J	)��q�sqZ��	G%�I�Yd{��|{�����4H*�cw��������;o�
$��e [	���cl�`u�l��M�P
�h�ĉ�?�P�@̯��M¢M�v���Ȩ#���#7v��R�5�kTD�h"��2�GR�ˎ��̈́SL�z�4ǫ����,T�+	�G�
2i�40��ɛ�]�ld��:eE��3�����0��n��,[�O���z�m[��TSĎ���1#��M�����Z5�G�?Kց�����5x�5�L3q�E��k�� �s�b€6��20$��5a����"�����'��90�j���*+��Rb�V�r�rV-c�O���\�a��z�@G��,|"rZ�LOU,|�����O,��ͦ�]ib�����u��4"<�?G�hs��H����x�s�����(qt����y�RJ�b����:Ca�=�B��������Į��}�!̕�{c#2ܝ��G!�W���;2n�s�ܢ�Q�bP�M�}�(*~�y�W�?�����:R��8�\�%8��J4>��Lg��i7�X; [mK��Q�:�w~�(�n>ay�;��۝�@�O��`W�"q�}�*j�d�b��	*����I�V�r�H(�*��8-b�Hd�j]�F��=���N��/�0>˰3��>�a�/���O`�꫔}��	�Rȴ�g�p����<�����~�����`�&H���
�����+/��	/4VJ��.��*H
�<F����#C���v�L���
$��O��z^�Q�%��P,AٟT��iQ��u��G�l*�Q��J��32�����~^۽Kk�����<aٰ6Û�~yU�W[��^��<u�p�[���`:Cx+�-�����;دv7&2�����y�с�R82skɎ�Q�b!ƒD��#Y��)!�8p��>*?<�P��3GJ��|Ұ��i0������o��g��T�-�ލ�kJ����T�̍\q��uI�Qn���zĊ4�V@o}�����S�o�
�(X��9���\��@�c���(j^j-Z
,�2��i�
i���M:ϓ�o�"'k�,"�5�w
N�ct�)h��N�$ ١qb�P���O��֓�oR��E=(X-O��4;��旽u&+-���j��<hxF�S�Ԉ�Ά�@ :+Z�9�$׃x
�g�2y-C	ȽX�'��C����踌���H_=�*�Es6�v�#����K[����M���ه�bE��2��L?y��&�Е�K�4��<U��\ ����}J�fZ���n4v��Ɉ:ċv�V�)T��Vl�.G�-:qH�ў(��!��]��Z�7�ԧu��������1v�D�'�퍐=�W�����@���ʓr��C�=ɱ���:cҠ26a�Cr�|l�ҥ6�h��F0��i���j�`7�z���Y�%��_jaA����>�M)�r���+��������'V�rD�zJ���&��)�Z�녒��|���6E�W�!�D���g0�v�s$TB��Ma�ina�,�y�f��>1���U�*��檓}/�ĥ9]��@ϖ��
�Oq�	�W��	�F�8�Dw���`.�P���8wӢ�� �y7��v"5�;���eIj.n��6Uv�������hd-։�k�1��Ʉ�˜Ӹi��7�ºmI�7t�C5s�ۢ�t;�������a�cOj�>�HwS���/�8܁/���7Ϝܼ�7����O�/_�G�4�=�s >��;��c���S��1޾�7��>�S���o��؈�p&�?�|,Zb�6�iA�͑��(s�k(~p�."���a�J�=���2���b���:U�����gm���3�f܀�$�[P�Fts:gˉW��b,�Mݼ�pH�[�R�Ed2���K��r��8Uc$zQ�B���UЧ	a�
�!����7�8w���@R��l���,�*��	�*Ln���XۉӓL8��7<IN��ݫ.g廮$��Qq�?D�bz�z�����	.�d�Wޚ���#K��Y���ɣ7�:�
���|'��W���m���	�I�zG��2��f#e�|��r�dt�jW7w06�7��q�q�sxs�@6������1��m��I�b+.��/5��g1ŏNgÏk��Fa(u����
�
��֯X�*qP�[S�C������V��T���K!ᶂ]��|֧l�~^#��g��j�v��'�e8ʄ<�N}0�Z
<� 4�m�qi��2�V��egj:�t��.x��7�����ܽ%3�L�R�/��1�b�/6�}ߴ�_�����m3J�j�"l�l�50ј�x���(u�]ܪ�{iߖ�;�C����LJ�,1ZK�p��%cf��=�2'�,!~%�,�K)X��*?`�|��s~Q�!����ɥ1J�y����a�"��Uː�*�*ɖ�˪����6(�{[J�7h��A��0rB)��L3�o���r���)��\+�^��;��}*3��
��يW�{��ڤ$�t@�$��E�{�X[3M	[��N`O�����@�!���1�BO�(��o�����I��x�J�!hm�Wچ^�,��*˯MI���+52.
�4u
ݧ{f�|�*��M��
���g�����8n����E�����8[��6,g���];
U�
]B�ni�%*f�n��e+�&��
x�y;�b�̔r�3�g-���jK��ʝB��&�SZU<��߽��ãu]u�)Z	h��		�px����*�{�Y���u�Bժw2�;:;X(��%�΍�����/v�1��T[�z8A`�[m`_�Kt�E�F[�!��7�xE "r��}�vX].	����}�C�t7�)���L���J�x��c_�ҷ:^��'<��!78e�su[V(�&��@��!k"Wۇ2������<M���3߰�ԮxgW�n��/�RA<�Ƈw����R���� 6;��!�c��i'���J�Y����X���d�"�4�d�X�t��q6�;T��Z��G7@;�2�_����X�s�H�6�?�Y�wJ�4!�k���N�F�]��L�m�R���i������5��/���ZbU�)�T5�=�LHt,��u��+��Jc��h���ykn�x�=����@F��P�pπwT�Am��v��4r-û���o+��`+�]g��^4K]
z�Tr��,��u����x�/|ԙ��)��W	^2��a�q)�!|Y�}#?�O�
j�3�w�ѿu+ ���@���m�n�?��ϑ^�$�m��t�FoR&i�0�/G�7�	��Sر(��
Ȯ�&Fwb���ʽ-c�֮���}�|����-��6�_�*�{�q��>�:�>�~���i��A�X�w�m
g�nޒ��i���Aj����H\��>Ib�;�>k�1�p��Z�'��=k
� ���KГ�L�����m�%��e�6��r�w7���z�?�Vv͜�Tp	��x>�����b�O�5\*bCn�x	��Ag�J�$�K�i���J��dLĞ�+�_!��O SHH�7��=�uʌ��}S4P�St� �S�V,Il�*:i:�Z��U�Ws_���:ͨq��1�y���F�	�.�p溃0������.0�l�3��)f���_�rD�����h,4�{S��{<�='�R���g�x���#�}����I�w�Wq5z�(�6���[����L[q��~O?v�Ӻ��J���Φ���-"���0�Q�%8$�����UN�.e72`�<e5��b�̤ڜ�X=��K)�t�v�����1�M�!i���~���Q!�X�o��7��(f�j�X��jxu	�bk~heq�P&-$�s��)i��oS�
!�~G-)YRt
�Ĺ����I�l?b�G#AI���U���p��XH62�,��yJ��#X�+�]�������aYt��F�g�E�eoDk�@��S)4	[�=����]���"�[Ylm�R���3�q-:r������c��#�$�Tr�p�)-y�a���*�~֍�=���U�R�
��|�K�P�4�`�TVR}�~U���<���n�a5���#�7!'�E�n]���_no��.�S�=�
�,٤+��46"�P'r��^0����|<�f|�?��i"Y��@@���G5+��8&�y�c���l_�2��.�~H�A�H0J��jX�3�g$�5f5Qfog_�6r5N͐RP��BPn�Z��X��Ӹ(�5�AA�Y� �����_���t6��h��ly��f9;o�v=ݖʂ�G��υȺF���������e�l�Rڢ8d��F����F���	{+�
o,� ۧ�G2�0ޠ:Ă���z�H�>�A��^#ԭI���߼��>����
Qb�u�s/m�.�uea#گ����%ea �޽���:>��>���9 ��d��&����!Ŀ�wM��=�&�&��S�9h_���
c�:��o9ЀǼ�
s"�y�5�!��P�����z	v���2�W�4�9�e�=��t�g
��E�؈�h�SQ��K弩�3^ײ�D�S�K�LU��[�����h�͜�c�-W���:�P�	 �g�ҐH3�x�m�{V&:x�L���hI�L�}rxU�0�j�@_���诫seV5רIB1�#��Xԇ�b���g���͒�f6��)t���C���+�b([���b�e����U<�Łn��$ڴ�b�yyOԜ��f�9?����!�'�o!M�D�_t�������P��߂U�;�h����Ly2����ٓ�,��)��~�e��T�	�����3@��nD����d��3C5��`�+T�(�\����$�@K�V�_��@�W�G��HhM���/�#+o�..X�N��*,�	1ۨڰK��9�8LO�A#rZT,�Ztgc����V
l��]��d�
o�nCp���	6�q:����Hi���Kl����mj����IndH�W����/�e7f��5�ء�/skҜ=_�7�Zn�[�/���y����y+
���H^�����@���w����Q{rr��N4�Oȴ4r,oN��� ��≻�r�|���|C �q��mf�&�yB��;v���e�t�0g�ժ��s�����������#�J�zljuN�,14�-�(��0H�9�N��)�BZX@��%��-	��+�Tb-
�;����D��K�N�ܪ��У�h;匡:��`m9e\�[Q�!@�'����ZqRaW�Xi���Ʋa��L�e-�;[^S��[�E)���U(���:O���A/�� 9�O�/�m���\��L�����2�@kmh��8N]Q��%VYJKQ���G%�yP�f�
��]��2�9cbE�)�A��MA�:Sn�&�����M�#;�t��șIɉ��b��3�H����Mg�l��_M�p$nHj�QGQSt4�/�yCJ�%N�"G�d���t�&��
�4㇨Lڪ���3
 ��J1I��,�x��P�2ƖM�X���\���N�|iJL�V�h�	i���#%"�?�L����
r
���f�l)D�}���D�
,D_�ƌ����:��m�-F̉8���a�o=��
z�[�媑�gbhYR��<���MZ���N9m�aRR�q!-d��*��z�4)�g��	x�އOL�ϓbի�N
��r�����z2ۨ�L�NR�pJeq=�<�V�a�dy��B5�
�?�.8��6ig�꒑z�����/�Z��H�=ԏ�Q �K*>�@�qH�v��q5�`!��|Cސt�B�p��J�vܖ��!#E�����|t��&o�1�B�Ѕ�L8;�pх?J�r�Q#�f��ZR<:��\MΏ�F�[Sz���Y����`@5#��>�S�s���)aq+\�VxT*|�J9y���YN��0��/�.��.a�09w�=/E�+�tc�M{����FfE0�_��<;#H3m
���Mh��ϋ-�su��D�������\ր�^_L����d��a>/i\�H�=15g��Q}g��(E1~$��S��4V�FS�-�A^��d���}�d�����r�
�YR./�T���ΡT����1��›��8�Zt}dcEr���R
"KMѳ�*i��>?��~�؁.��AS�T��W�
L+{6�0��0����&����	�s\�kھ�
]%��!	���=-�~��^�tZ��)&=YVJ�:W�<��g��yxv|���s.�o��-廚��o2��X�Qt�B��|{�C��'�
!\��"�U��p�͝��.�����#��b���)�A|[�zO�ۏ�=<�*�[*v��)�+0;��d-��"��.��	�i�B>]��}9�
S[�����Ӣ���[�N6���gC�К�����p'E�M�E���u�Ί�W���� {�q,�?#��7a�x�\�1� �8<�5-௴�� �匥��X��U.fja�l�h�bam�υ����)��������������?�I�!������3�y�A���iĠ
�J�������8H���I��@��)-+�+���ϢK�,�O
�����6n�7-+�n^7�)�|�Ҥ��}�D�����]��[�]ϡ��@�v��T_����o6�on|�?w�|�z߻��}?�o��_p�lw�|��d{�B�z��C�H�9o^
֡�DD>�>�$�P@�k!c#�@����(L�2ub����sZ� ��f~�EGu
e9m�9�P�����25���S�4�q��i<H���w��x�x�܅��m�;����FcoԑC/4�S�Ϧ}..��<I�}%�H�b�F>+�� ��9OK��>�z1c�k��v1g<FɷB�yݠ��Y��8�b�z�]K�Ԅ�p1�j���Y�vD��:�[�U�a<�ŻN˹M4���Ѩ՚�H3�ꎈ�˧a2n�F{M�U�׽`v,��}O۽U=��W�8��5�@A���"«�X��[����ni�R|=�|�8߸�2Vs�$^}n�J|����Μ|e�n^V�Pg�yIv�U��-I\30%<4/�n,vPo,dFl���L�!��2�ߙy�3ęO�ظ��s�j��KEn*4?�/,�ۘYc�,;U�G�)I�"Ǿ"�Q�q��N�R勺v�"	�����e�G�_�PI�lZm̈76��4O���ʛ�W��i���� H\l���M�=IT�ɰ<�)����1�۬��o|:�;�˻j/y�� V4A�QD�d�V�����4��ҕ�ƥō�k�^Ye̎�N���҆%��J�%T��a���OP��DX̀�|�v�SʑI���_��Mw^�xy8^�2���K�\��s�ߍpLL*�63�����!��%ݖy
����:7S"DWG���,��vn ]44�I��X_4
fc�tK#���/��K��k|bQZR�7{�8�]�����I��R�i�&l�ә��Y��z&��ޯp��-�x��),"@��C�*q���)�w��C,t��f���o"W?&�@V���gv��k�HԠ`�;͒}^�e6	0����A]Nj"r�,��T�44к�n� 1�N&�����q꾌��|��{r=��ޑc*�f�B��9za^ג/g�-���KcVZ�P�R��eڞ�:�i�Hu�7�{=q��$��}"�ښ.8g���Q`��[�O���g�����Lj��ˉ�N��F��Z��4k�H���X�����%�{�a����l�����$n=n�7[գ�λ`
-{VCU�$�u�k�Т�}sV�O���>-ٓK����	1i	�sugWN"[�{0n�0Iɗ���P�u��t!�2I�#�����(��u���P����r;�-|�w(x�D
��L1n��%á)�	*��7�Z� +��E��|c|T���
�<���(=��rA��߄��p��B���$��
s?*B�M��	�@k��-���I��2_��Q���`�Iu��GH%ފ�&�J���2�B7�Ǵ�I^G�J7���}I�{�B�V�w���88���88��P�7�A�����ĉ���9&4�lU�i��yyh���v���u8y�R:�$]�C6�1U�l��E�\����a`����@Iy%�G�R.�!�[*-�Q�7'��k�����@%�8��)�bv���ܢ�Y���
~����gS�x�5�t�(L_�_�xl5q.�PE����@�k�n�vG�(Xw 4��������csPض>�vN������ꀮ<d��y��P�6_Ry¡`t��?B�!�U�ϸ�[���-����OʟY�YͯW���l>��0�,�Oe��y�,�M��n7r}�p^$(ڐ<c�r�@_ymߚTF��m~���v�C|>]�5��hu;�xq��=�d7�
��Ba������:v‰��4�˜�M����}.����I����(�?�m]�=��>��c���|~�sB�ʿ.F��,X�-@V�%����u�K�M��"�6�i���J��Qpy+>����x<Km�ZC�c�d�#��B�
m�
�ծ�PƋ=�z0��9cq��@L)��09�hQ�ŀ�[M�T��(DA-�G;��l���7����>�:�J1�睦s�-	$�/&u�Q��4�-$^���8>�?�����2.y�m�B��*����uz�a���[8����;:8�:��LF5��6[p�h����N�-\ײ4��y�;����#X���4��jv�
�p�����Iʆ#2�M�z�]p/�����6'���3����\�S�U4d��'���%�Ns�)�/3<�
}uL�t0c�*�#[;�VI
�T��V��Z�Yz�ȾX�6R,ͱRu�"���
#��F۲Wow�D��P�~1O.+PU y2�J�%A�glI�u��w���y�/�g<`��,�t����:9AS���P�����`-F�ow��Yŕ��l��*��7� �Ud"�0fR&����Y&gMB(ͅ�N�N��\k`K@ �UYa�f}�0��_�+��e��7C��00�-VL⎽��*:/Ѧӯ�	 ������M��Z�+�d��J}���;�,��0�G���F�c�RW�
o�*V��Qh_�Đyt�>Ӆ���n*����� �3��PI�_�ޝʴb�n��O6v�q3�qݧ�0c��.R�!j��G�2��nj=DfGy'�Q���!�����]��ց�f/�p �5��v3ƒ�b�����	��jh2a1��\A�r��c!�7C�9���,�i��`�L5���+
�8��~�*�r��r���3~[�е�ﲃB�ޣ[�"G4�S�bG͈{l�"b�Cq}ʄ��h�"{�C��J��=_�k�
{;����@\{�w��a�7kQ���d֩�S�V� p{�ܫ�*����Z��'��Q��5�φ���c.�4�I��t��V�h��R|���"B%N#Ψ'Xp��I�7t����1 _�៵G&���zN��w�P��[
'���l9�qSd�8����$N<�!�[��1tZY����|���\JA���<�&LA���-"1�n9a�C=Q�=ͮ@T��a_��/��&6σaL�=�x���oh���izG�v�9!;��ǧ�Q���9��C�A~n�"�٤��f ��j)e�)e̶�4��*2�˔�D���U�D�PӸ��m
���(t�éb�,,���0�T0��TK2ӋR�1��b�+5�DC��* �H97��l\tq�Л�(�}�e��G<�E��8`�t�Q�GS:4q�;�~�^/E��P��ӡ�(�5(�*��*�K�^S&��ߙ$@:"��F��bذ+m��9GI�Q��3I�3�?I*<��EZ�$�V�L ���x�u�Q�Ӽ�r�+/�]lo�V��c�K��Ӟrj�1"*'�a̺�)��84M(�hi���ʀR)�#m#�h��NԔ�T��)cU�y�^��p`Ű�q��w+q	�/b���P1�d�SU���F����9��
���ޣ�"R;�M�p�se6�>�2Ƚ���W��-��Y�r+�w��,����qd3i]B�v��QS�{��5zT�ye�������.牱J�T4��`��`���H�}K����;�P۳�.��*[t?��i�
&��O�N#�T  ����,9�1Y'=���x����(�Q<K�	��]s�&J���q�@b�4g�,���*)��0���3񦟛��̭g�6K�����Ka'�)�t�5�~�->���c�1���Y�y@<��3E�T<iRv�X�[��@����*�Mގ���B	���g�x�;��v�ތ��
Y�#���|E#a޵�q�b��㙢`0;��0$�o�ԇ�t�\��+�a��@Œ��@�TN�� 0��r�v�����R�%��Zŷni��(�]NvC�,[8�=%��~2���6�m�]��Vi*��Zhن^���3]�{ћ`QKW�c�,4Vh?�jqk�m����ѧ�F'w(��j���6�����`���0F��6ONw���mr���>����emb�Z�i1E>�O�r-w��j��w��81� ] Y�m۶m[۶m۶m۶m��y�Ok��,�ETDVnrY����j�["��M$���,9���sy&<ګ%�bT��Q���l������J�H��I8"�B	��w{&����]ٜy�}�p��e!�#d�f�ٙ}<0��"��E��8X���@�ޢ�	�+{��5/���XI5`�j���=�z���p>s�~���(����
qy%xPWw	h�/�ۑ��^C���͎+����=,�[��V�����^���� ��i�H�P��X���|A�p+���GV�5�~|�_l9�_q�v~��_͚�4��1j^oh�?~��ſh�7o��w�y�?#��!(�n"�uQxe�
�=~��|e�E���Q�gr�n��w%��7��?����Pu
��kF�	��XH3BJ�LmC�&�G�bj�ՂBH�&\����0����Py�o�:�uM]�^m���������99f����V��|�{������
D�@����(,�He�C�҈>r�p�;p��"Bx�y�r=�D�q�j�?"�XԴ�T�"�r/�@��h�/t奡�*�Ԭ���̔~(�d�q55�@�s��<�(Ft�eX�9g�e���b�}��(W�e;�2���б��Ts��t�q��U1<:�1�R��,�.j�L�2j�,�6�x�1@-�(�,ijB�E�TC�4�M�#s9�)��S�Tk��FNq~4��;5��5H�%��-�К�E���/�sB��4R��-���)3Y+u�>�w��D�S-T��b	_߲
�	-�r��ܲ��#�D�.��B�M^�u��h[T�=K�R���y�t�ܚ�zy�ͽ�sǼP��*����)��ľ@�-��8�J-�P]�0���ꞇ��a�PA
�2p���w.��D��\E�vE�k�lz�:ב�Vo"7*2S��K�=г�N��9��e��H=��=��oJΠ�7}��N-�$��t��cv�#w�#�NN�������+;����p~S���}�
S�g�2���UӠ�|�F�	�R|�a��4~�ɒ�^�H��3oєp����U�۰�p�`m�hK�^�^�L��dL}LƜ�r�1���c��2j��
�G���N�;�胬c7@�Q4����k�!����2�[��u��5�F�L���KPv��k=�:]�s�*�HƼ.xyW��`�[|
+���d�%��:@��H�[rJ�v�E!MO����a�I�!�8&+�e���T,�D$�5��b
���,��0�~�4C�TJ��& ��z0;i
�2@x�r�2�\�QJ�����Bv&#/��znvf�tf[��Ҕ�~"b�7M<���B�tdXc�8g̡0�6GVc�6�� P*Ę�L+��r;�	R�:GgЋ�4;{9��� ��O]����N�c5'���JE�Η�.'Fxm�X���J���k��ٜ�]���1��0�J��	b�MY��3��3��S��u�����Sg�vSi-�h�l3�����+2'��V�J��%�$���՚ӓ����Lt,o�d��Ϝ&Ŗ��ry�4V����LK2�����=�p䑈Փq�S��9_�
���`��5R�),bt�2���V%F2���A�b��2j�T�͠���W2+Jr*��J
�|9�R�3j� ��d��/Lk�!-����֓��|Q���@f��[���CJ�$��+e9�ɸ�7�P/�6���bj.j�٫����4홻���z�����qچ4��

}J>C����!Z�TN���+����r�.�_�iʂwnO�e��$�J;z*cz�������9�\�K	��pۭ�%���JN��
NC�o�MG�}0A��0�������8r����.'*b?Y�
�LZ��X�U�+���=��<%�u�zѡ���O���b�}��|����a�_Z·���+y�)ث�G�5誅�ͬ����u�]��Ah�:�D��1>���HcD�o2윻�#ŀKk�u���k;������]�Jr��	(����gg&E��.���(^J�HtNyoQ{
9�вz���Ȉ�I�`Nms�_���]�R��%��&����!2T�H�l�Mg��pZsc%L	.��St���6�
�ּ��*�̓H_t�vV�st���O���Ɣ��ޘ�f8���}�]HO�Ə�y؀)k�g�&�Lj O�ZO5�-�cT[��G�
������M�qHq��&�8H�O�i5����fKHG��PR�
K{��FC�ȑ
���頑&����Yٶ�Jt%X�[	�����Ɔ���ǁm�7R��$�n2��\iX .�XD�An��Z<�9U�(j�Z��8��ʂN2z��"C�x�HNָAd#��8����c�E{E��j�uB�����j%F�� WO��J��;j7�1`Z�� ��R�/�B�����X�XB��{� *��a΂:�+���rBBN�n��;������ۤ�����t���ӄ��4,�l�`�s��i��,߇�����r)#sZ�w�Mm��gDk_�!�Z��L����:�J<j^��H	��:�'�0��
x�~�W�U���֒(ݸ�	�n�^�6M���R���a_�f?4�&$���(yrc%�]K�!˒�qâ�H��Q���2��񾇪�_^~�n/��YP��ޒ�HPh55b�LMF�5	��k8�#	4UȒ�[��tN]�;��<NS3`�[� �<A쫲�9��12T�����,A����h{�e!>1�h�4�'Djzq�H�n�%
~:I�����~���&ۄ�o�ћ�α�`:�4M/�%bX��'[�*��Y
)������BМ��QDEш�zɵC�)Z��1�#hj�d����[�Q��ꛪ%$�k�|�𝛑���ƣ�y����ٱTr-qe�458Hj��+Ӱg�{Xi]R�P���������4g���lvP���� M��`@)��%���<���y<`�B�V��TeG�j��<��.��+X>�+%��%���a�kyd���
�T�R��9Bm��Q^�	�Ԟ"�ܚ�[7���&)��L�����Q��!�����l^�n�j�T=��h��1S��Z>c�m�p-�t�=�"�t",��K�fl�a�N;��m�Ϫx����ޱ��I�ۣu#���2�ì��T��YX~�*	��txiz�FӢ8�����N�z���97Y�M�ll_���h���kN���A�Z7�^D"�+n�RT�5
�/��9kZ%eb߀��T0�ڡ�Yͻ�[�|svP�Е�������bt�� ��ȶ�j���Ϛz�bv��u����t��!'8O��\�6�c�-��(P0Y������U���#*|�E�8��-�|I85����g�M�M
Ί	+��a��#ݬ�٫��Ű�1q�l[�}��S7�M��3�O�p
a!���P�-�A�����)���2>'x��'�m�J��X"���+�>��f���;�����'e�G�����<�G����d�J��|q���w[��Z�vD���~+�x��51n���
Wx�8^|�Q�����w
		�9\��9x�_��B܏�6}KÀ����h�"���!�[��Qi+�1���FMeW$X�e���Z�Q�)�d�j,ュe�Mi�����'l��1��,G�%t�@Ge���E�;5������
d?#"��H"E�М%%�e���4�t���jQ!����lE�g!�Н��Xo��5ڥQ��dlZ?�;
�'+�e�=�=��C��Ns���H�F�ݷ>r���>v�r��Y�r�<l�7��'�d�I>Oz��hn��U�,O�9e��UX�F���E)�*��O�[ƇNe�)v���p�O����9�:��3M����
��3������[����Z�U$�UvLy;s��p��X$Zm�1��L��+[��MN�-3�]XKlw�'��Hr>� ��'��vbH�TFM]�:�<�m���I������WR�~*���%�*���ә/"ٟ�d���Y���E�p_B
���J�Iͧ�'
��AX�A���ő���8#H{�\FZZڑ�5.�P�~M�`
Q$�:Y��z�b1�j~�jgȲ�#�������)R_��E�!����wN*��H�y�`ۂ'{��"�bt`m��g\��J��v4��[��e\���X�#f��kg�0U�06�"�5��Ԟu[e�y��_����]��f��C�DA�UK�����o{��j$F��BN�e�|�;�f�>"D'Y2��ġ:f|�	E�l��s�vv�LS�Y���uS+��9O�nϐ�i���>�q3!�S� e8Y���/N6�kUA�=ҍ?�h5��
��Up'�&���?2%��B�@(�����<�<�5\ˎ�\p���~�"��2����"_��9�fH�V�}�G�S}���p/�t�T{Y=3f
.�J'�4���՚?~㽆��&���;��'ԏE;b5o���z7^I�.�����������9֫�@Y]��O���T����jٸ�DZ)k�ª��&�b�=7���ߞ�%|
e�5�c�qC�������Qc۴�3%ӱ�T٠fh�Ǔ�U	�-��8;�����6�oƙ�s�:O~����E�Ʉ���o} &>yd��0[#��G�x�D#�LKg&1:|=�r�V�OO��_5_��;�o��#��O��
0HWtQ_=�i�O��__xw2���g�r���x�ͧ���__�ɿI�m�����=�:x\-�_[����ܢ�]�	��+M�K@��5�?�cϢI08��:�\,;%lEҲ+l{GS�=~��_��Ir�t2}���K���eZ��q�-�ͿEM}{�o6S^Z7�d�S�m ���D�֠�����֡m$Y��p�m�i���֤m��������mK�ز��x��2�Qʔ*��c�G\zPr�?|1~s�M��d�-�I'%<;Bo����a�9�V���!Ugg�a����=
��zӾ�e��b��2�*/�ueiVg��7&V)�ڈ��*��7�~1T�Ӻ��H�4��ʰ��Ñ�葊j^�>���?�E$!�
�h&x��p��~h�0v�ʞM�ߣ`+���ˑVb���_�;�/���:��r[����&��GN�w����T�����䉘�){��G0pW�48&;�؆YjQ-����B��$ө�d����i�G���`[6�o'�aV�@P�2�kb�2���Q�N!mUnei'ha��A�-��ьi�%1È�+�8Ip@�A3����N�S�Y$��*�V>P&�R��I�č�c�D3�7T)�No!�>u*g�>��La0� c4��j˅k�N�mM>�G��@�6W��N�#�k�vK�!	�(�S2��JS[?Xc�]A>�Ho����������ud�V�Eǔ�
N=�3]�k]�[F�S�T�A �'#u ;Ū�豽�ҊS��xMgվz̸(�����,�ST�֪�ޮ�;��ni���rO���sg30i�����p:�T��1��*}���9şޮ�>���(9a������'P0���1Kw���X�/U���_mY'��D�o�3���XT�a-bI���}�	1v`��́�Y�H�z���ll����tmy{f����h�Y�|)6��I��؊����>�rN&w��[>F[;�����
�wE���:+��H+��ؚ\�#@������ϳe���Ո��1�Y�t�\u��z[�ȥ��ԿUT_y�Z�W]N���EP�־*r<���~���ơ5H{�����Ȅt|�v��rC�U�VP�GI?��t1�E�Q_{�R}5���S�c_�P<iC�p��[(�EXph35��2�H��q̈́�v`:i�^���:w{�:�q)��M��38��Ƣ��4��[�Og1a+j�-+[�H0K�IB��wK��З@se��r���C�Uo���[?k�i�fG�$�\����~%C��mO�1�K�E��'9�	^������xw���^�n��U��"2��0X	��x�YIH�����i�-:r�4,Wխ�=�+o>�Z�����\jϼ���%�H&��s��ʖ\���`Vi�{q��Gk�w%��-�Hq����~r|�DNU"�Dc5y2-"
IG��-�#n^9ؾ(*�á�} ����IEk�Iʝ'���@S� -r8�L�Җ�s�
eNSB��6e��?�5eY	�x�����X-���XsBp������J،�@.I�|��r�WJP:��:ؔ98�Bq
���ApWԭH(:�3ms��?`$���ף��[k����0��F�W���|�`��[
��s_t� %��㫯qZ��O�A-w�R����\�M_W���t�Q9g:��acLl�J: `'��*�t@�~7�N鷩�}�?����8C�1�<�.�і:OɓN�^�����#0R/���Ƹ��S΁�;Ø��r��Q&U,c�\ޱ�0���
�Д8��uhx��t�NӾ~B�x�(��`�{��5�ɿ�d;�9h�qVh�(1:�:א����^w�zм!boǪ�K��d��e�
����(WZŠ���%������XT�����2�ݩGA��E�U,M�{m	W��Q��/a]F�͠G�e(���/S��0T��>4���!VD��^���(�nM�H��W9~*�ec�239��Y��(�G�$&m�
ŷ�n��$%T��g ��,%lH�X�'3e���(�C�R���S�O� �Ì%�Cɇxi��/^ųk/v�|L�VV�6��wx%�3��d�vߞV���kOW.��y��V�_�*�VJ����QU�A�Āj�'�VI_�T)Qs��Kr��T�(�S�!�A�s(��_u��L8q��"z�
�Pj_���3���\1�TN�V��h�o��^!v�]*�xyh3�P��n���#Բ/��ʆ��F?MXh�ٟ�z�B����[�j�M��V�/O�Ց��A�dͅ��;�޶�LX�3�����u���V�i�*��x���g]1e�ӂ2�-�5lŝv��t ��_n�&m%�FM�w<[�Y���~2�������D��F�]��թ'�L�kk"Ao�������1VI#!�W_{c����m(�7��� �>Ї�Q�H	&�( �
N+�)Vw�k�J{V�?��d��5J�V��b�W̜V��!Q����!-�I�2g������vUa�	<6Ӈ��'1f�s�c \��P��S��-�+/��P��I1��m��?��&��cՅSó�ݎ����h!��#l�b���kZ�(��������U���I����6�ٻ*�Z����k�]�yPA(Ԗ�ي_��$\��0��xL�FE��uP�)P�O���bO0��b�񎿨���G�O�3H�eK�]��O'�H�j���
i6GX�������*_�S��Wsmī-����SjS#hؚ��>s�D�Qm��2/��[Q��VƯ	��ݣ(�G�bB�J!�+�v��_:�;�E��l'�J�;b�pt����S�Ѣ��e���1���R9��~Wz�A�%�a8��ߺu�_ބ;�a\��g�Ej3� ��e
�W	���PWQ�Ap�]���yQ8�):F���2z�|n$3� \���3�n�H�4�%����lu��xr�U�k����v�Y�i.�⡨�
�E��E�����bܺQ��K[
j�S��Y���2Bs�ݿ���RR�n��B���(7d�iV�љ��.]�4���Z�<[4���Z��s��aS���I[��#��>W�<�Z�,���T�i��/s�b$�8]d�S��dg�u�+
ȡ�!A]z��2�XK�QXR��;��Q��!���2M
J����ޤ�A�t
�4�F>V�,��x�NLā�U��7�]���ݝضOTrʚ��CA��NK���	e�;̝�ԓ��,��ܲ��Ţ�ċ(�='��O�>���Kk]�{�{zY�<o҅Ҳ�3����v׶"�|Wc�sk����w�{�X�%�r�3)��6g�j��U��ݜ�C ���"m����o���~��ݣ�oW��ac��U�e[/��S]�����6�v\�;*ŗ0��(��݉��V��ɗҘ�Gr�h�'ɫ;3���;�V�twV�gBIp�t�w�m��o�Т=s�&���)����{S"�!�ɷ��ʜE��=��W�}�X��
���{��	�
e{��>���,�~��#G��Vz�oH���w�e���V	S�wN�I������>r�KL�~!󂆸qW��Jf��P�lj~V�Y��j��B�>�XA�Z"It��V&��k�o����P���}
9����Z�r@��%�+�b�~<~{|���"xI�&)����3w��SOGY��2	S���
G7w&��i�}���}ǻ������L\l'�}yɊ�-%A�x��;�c��~��B�����!��?����@��4o�׈`k�ķ���C|�֥���Ԭ<HJ��F�*��@�b03κ>��yE)��%��cᱏ�2�!bŖ�Z$��"n��+i:e�
�
�8wmCF�HR	���U�� +L{�Y`��8'��S'y�S�<�%n@���h�ǣ�K��Clǎ��$^4n9��D��uy��d�K͸��rg-�IM8z����՘t�@�q�����`(+k�㭍b1ջehVE��ګ+�БԎ`y�-*���8��R�t��ӽI�cq�x��x�7�
��tYCTS
�H,��;�-6њ�Cr�K�B�z�=-�<�7�w��	N�����>W_>h2:�f8$��թH�"C�)շigVӳ��n0p�EGm�vn5���tQ�G�:μiN��ܞG9�`���}G�,��k����Q0Y��N�7V-��1�ku��D��VŲZ� ��݅X�=�i_2�P_�g�I_�Z5-}D�L�T���[��xÚ������9c6���_t�O@tZ^�H���{�jPK>�b+w�gr�[X�Kc�S��/Ft�Au3���,,p��7rg��ޢT�E�Ł&�5A��`��uב��F�g���G!b�Fe��rj_��B��\�x�F��;8���Nh�Ľ)=�ߚH�$��1L�V�nԧ����u!ňuC��D�(w�u���5O�������j쮛�7e�/��VI:�9a�$�RN'z�yi��{��;���Gv؆TI��V�.�ڠH����P�!O�.X�^���*|xD���-�3����B�XϹ1�F��|��G^����:8\�Sɶ<�*��(���[ѥ+�ٛқ�|
W\���&����(�����\Wd��zRu�ZfO�:���G�6����.���T��pm���{�s7��e<P��ZD���zp�ct��zA�Z.|v�cL�7/W�sW��*���A]r�@���
��.��*%�X闝��K���ƾ�9E?�2�е �l�'�o�$����}�G3/����L�*��'X�}�m�G�t��Y$����"I]rZ�&D�'��MA�ciDž�DZyC�A+Zw�I1��M�-mn��-�f�u�=��=C�Z�rv�h�ѡ��@�#��@ڳ�
��=���_�u[��_�ylIt��.�� �w��ד��u8��	滾n�x�rR��S�#���7ܑ�ڬ�Ub��c�W��G��pNpκ")�9S�\��-�	���7N�A��Ա
�3L�%�v<\7�|�(;-�&k>P}6A<���{�#E��n��߷���A�J x>��Wπs�=�Qߚԯ�l�*"�;��(u�8~���i8�w��l��*�mnͮ��o�J���űlw6êS�����]G�(xs۔��?�5zm�i�tWd˚����y
|Q��RF�.籷�z�-#oQ(��q틟�VG��[O�4(~�(�e�d03񺰹�A�,
��V��;�$�w�"jFQ��d���nf= 6Ž7f"qU�U~�*��9�=앒�/�,�Y4�]o�wÙ��:�K���9�
�J�G�G�L`|�����?��/qv�.DPȄR,W�<��K�'v�m�yMq���5�
5���;� �'j�>86��
����'蹯Z��ł���D�RqT6V�<��\?#t����0��-�ҿAg�>�ް?!?)?s�c����B�s��c�!��\~��z�Z�˒5/���k).E��6�U.���ʊ�*�15���.�@����<H��@���rK��z���M�d��6�~��9��[���Ü5�͏[
�dx�݆@?�u�ss1#Bi��t�#�ŻC]�ΐ�g�V�E��l�1�g�I-d�2����]��g�3�'	���\nn�e}+�ر���5������z��RG7iL�Qmq'*���:�#�bǜG�9��9�$U������j�j�'�����65���.��|V�K����'�ثG�lL~'zZ��B̈�7�5��!*��k�
u���̅�&�����B�5�S�
�u.i���H��DPR��fd��S%S�r�F�B�d��N?�[�N�bC�ɮ1}�-�^��ٯQwM7	Z�~Z�~l�º
�՚�Z|��%A�� �߶�cw�$e�����������ﮉ��9��2ue'�k|�D�fX�u(�7a<p�+v��t�T�ؑ�^ѠXQK�h'�v�X#�{G{<%F�%e5f	A���x.[:�MU����>������UL[a.J��'�2jg���]Hʇ��!jMO�0���V�:����+p� ���%u:n�\�B�%-'.���zI[^ؗ G{��ޱ��g�ȑ0��H��S0wj�[F۞�T��	S�/����(�'�104f�r&P�L�:�Q�J����א�Z��&<�<��-���'�y��g:B}��#y�}��C��y���M�s���&j[6���Fw$���6[�x�f
��0Mf��[U��y��Mq[�8݉��-�[{��;����[�7��!}S��[��9s�f6���&�\Кc���Ϧ_"����0_:��M���Õ-c�)�w��M|���?n��
�O�[�Iu��-i_p�ѿ�u��%����O���)�sf7#�X?d���'
,�)k������O-@��6G-����Gf�b�QF�j�Fvʼna��6��`��"�nt�Nx;TٛK�1s����H֭�c�[2'|^�[�ȝͫc�p�`;�ֱ�[�G^
�i��
p^C̩�[c�\=��Y3��yC�I�6ݩ���F3�����="E�)�M/�-�1�����3��ވ=�[����4Ŗ�w��L�v�Ӑ�/vq�p_*��ċg#_��K�'4��� ��GeK�2>��݈s�Z�a�g���/�/\�p�N�-L"0��B4���\�n>�o x^(�7�?��0��v��޸�� ��н��S���q�������r��Y�I>jx��2��8rǎvx�!74�>����a�E���*��e{��b%� ��q��s928z`�J�abA����_�qw��`��vs`�Ve:�2Wo�AXY_v*�U�*[�#G�)�j��=J���$�BN֋����#�_U����o�,"�n�3��Z�x���J�|�x�(�P?���Y��@�8;��[�o�?�L�FA��~C���²�������0t�$���ErAzX�9�XE����t���_9�!����F���I�Y9v+=�CJz�"1g.V�`����I)xp��w��]��l�=H���>݇�s}���!��B��>

�/)��v�z�C�%w"�,fЉ
:�,���������67��ypH����&�r�,�o~!�C�\8��=�{���o�Eކ�M��Mb�]�(l!��H�I��j���8'��"��?�
�bB
c�A�� ��|T��B,\b��'&Dd�cK'�%��s�d����|f��RȄ��W�T�=r��<Я(C�P"�
��3U$��8Rfsx/����\^�=K;b���#h`Z!��F�@�ǎ��識3�zѴ�U�B�����CXzW�2���<�$��#!\�8­)�$��b�?�T^��1�1@����W��j����jF�4�m5�Z8��i��Q-���˃e�c�r}[�I�4�=7H����g$֜�r`���=&I����cP��c_;��ϕS�E^n��,��s�v�}�����&���F��:��m�
�Ҹ �$�2�u(L��@/s���L�E����\�����aF�����H�Ȫw��-�Ri(X��Dy��gJ�P�ڢi��G����j�2�ub��4ع(A�T"\�ee�L�^����8��0�=� ����7�UY�d?�j���;^�U4]�O/h����I��JW<�B&�J�l4�`B4���K�������A�8c
6�	�'����&�ؗ���Ԋ�h�+�!�"_�8���U�)�j)�øA�!t��."j6��$:��<�sx�>��O~���O����\��������7���
�IR�_^h]0ÿ��D����4U����=��nX6�g�F����4ü|����o�s�U���g��>����Хe��Ps{���+��>����[�_��q~�)��8‹��i~��3'����]ʶ�3ӑ��@��wr$q{����	k�/�oX*�w�<������Ud���R�^N|ߜ[Ŷo-�G�����U��W\غ�T��Km���yJ>��>�_-��{���²Uݻ�B��-��uJ�gC��E����ŕR+�󑛎�f^#0�~+�C�a��?��	IG�_,�'���U���_�ً��/��#�_��䀑�/Y��� ��V�ߐ�/��w���/\.L���!��#k�C�#������PhD(D>��?������4��l���O{��|���H��@���L���#�m�O�h���0��#�n�0'�a�h��1:d��e�R�<"�Co�s'� �k�Ak�gޡ���\��I�%{�Μ�'/o���gN�C0*���ua��#G8S�=,�<�6� �342� ���s�* C���	�Ξ�G3�={�e.hD�Y6%Rb<b(ύC��xUTUDi��W�`F���hNwĘ}i7�>`о��H֞;9�	�����լx���
��Vd34��V�lK��R�/eAΆ���@�_w"I��g�� ��(8�p6a�xd��$� �c�:-seK��i��}��(i�@��0�ep��Q��Ӝ��	�-y�09PEMap1@��C'1z�>&]���&�8�h�$j�i�DV�?-N6ƝsKs5���_��m�_�k��&^�&��̭0mI5�x�����{���lH��1�i��\I�v�;�-y�-i�6I�e�w�k�;��<��poB��H��a���|m����C����K�D��j��E�%�/K03o��i��v��\�(3��䁢a](	N��{>�I���#��9z�h`6t,�E:}l�I6�u�W��9�|,�����
�{�B�6"��X����̉]�ڽ��v���D��e�,��$I4�rG���}�~�� 6MD?�1���P��}��*/�$AѼ�&�y�R^��ոN|8'�T��N�1�)��FطW�+�.�跦�lcd���1-��>[�\x��p���`=�����M�z��8�U(��c�]	�
�"X���KN�aa4+�b�b't�HHG���BO��!J����O,���F>`�Ȋ]�*�
W©�H.��BT/���SW1�ә��S�}]4���c>��-�w�Ɋ 4�
�A��n�ŬB0/2�� p2���U�,Q&��r��J��ej�l�(��&�n��hUܔ�9d�
"}p�/��1F'��Q�B�/���!�G�(�B�^�QB�:O�Ȏ%�/d�g�M��c�MRG��%,�=0[av��4a�����t��ɓ��;�2d���5{b�ٳ�-M��Z��M��c��L�wQ�.���`����[]NJ=ߠ�χ�W	�AuɴxQ �5צ�R[������V��c��S�
��R��R��P�e�S��4��s�����D�/�(��ް��J����!���Q1z�I��)�QS,c<f��!G̐!�o]88̐����a�@�m�u4���6��ɐ��w��Ǐ�=+�[c��V?8�sb����m#��8�3Q,��=���槸�(�S� �3���$8�D?^�t���O\9������8��UR�V���B-�J��YbD2���$���2�Q�� ���
 ���+� !ۘ��X�h�f�h��L�
a0���S؍��B�:gr�i��|p��.�$ܘ�Ij��?�����]H��1�ZZ������Z�������p�A����ќn����QL:cq8����P�a�����x@�UWĊ_��
���J+ԅ w�^�hk��Kr�,|�]Q��qp�h���ѡ����#g�RKOB�����4֫����	����,��ms���X���4���lĦ�ûo�ؖ�θ�勥��B�&���փ&F|9g��`[���'�vBZ6S�a"��*�A^͠�v���yJ���Od��2x��(����<��2DIz�`����t�tB���G�d��nM#)#Qwr5�йz��S�0/�yצ�����+�QU�%CI�Ժ]��Q��|�q,mzS��N1�uؗ�io�3��M׼x]@��J��-�YI��r�š̨�Zn]�]!�!o���Cw��E�֘�����||yP��٥f�Dd��5sqÄ�?Z_����+���7�����'�Ժ�!K/���C%/f�Ԍ!�.��Sv�T�A�.|3[��S�F5}��i�C�.�ԍ��=(��Æ]�?Ż�Cgy�z2<F0���z	�>���t���FƬ�{��П
���d2��;
���\4�}�1Ihc�;��L N2c�l"�]$�1�w��?�Z]�뇊�s��6��!o۷��+�F#�B����݇��t��]��dF	0�`����w��/��W'���^Ԩqїj��ڪ�����f,�ڼ�f�+�Te�C��#p�Ъ{��X���z��LR"���M]��K��T�����P	@h{B�R�Q���Le=kP��ؘ�8$����A<�`p��{��A\���W�5�WN�w��M�y��Gv��&Y�`w�6Lia�D=��L#��?@���
����Y�-�H`_�N[��8\�"�I��l͆�W��NS�0XQV���P	�jP�#ح���0��t�5��.o������L�U�w��=2o:���MT�_�7̯:1���|^��޾��z�~{ܿ�t���;@�4���
�&N��w��Ĭ��`��KX���$���E}g�sJ=���ɋ�h��?UoH�m�\���౓`��`ϪL��q�@��`�*�����L"L
f`.�K�.]'�
�i��-����h`�����b�v�fʶ����?j͜m�E��ZG��
}�!�����MےJ�)m�=
��̧WD��Z �z_�,�d���I;*��R>�s���z��kǡ<m��a!���V�a�u�9�ܕ�j�
�ҫ1�;2��(ׂ�ߘ�CPw6��~��G���'�n�>LB���U�q(�ȇ�G(/K�[#�̆pq�:��;ā-�u͕���'�#0Z�����;�zV�!3�3Ą�H�e�)a8r�B�CC�`^���W"��L���J�CB��2��W�W�0RU�/:�q�)��<���L�߬%Z�߁x�/
�
����s�ed/!��"���a�*�-���'p
-%����b}�"j�/�B��"x�G8���L\:��$����>��b�&����Rw����$i,���,�:q=��ݒ�6p�f�ٕy���}r�^;y�T�5�I$�K���ន�D��>=�PU�+��PT|��o�{�A��k
r�
q�
�s���?�B
�*d��#�[���Z�)Ri���R��1���v9S�g����p�W�n�O�1��zb�O��b����vNA�0ۚ.۶m]�m۶m۶�le�v�]]�ϙ91gb�f�����\�����2�}���oVs�z�_.�=܇k ���#H����syA_�d�$�3��r�Z�:�FoMp�9o�4�ա)y���y�p�8�\����s��1_b�W�@�C$"l�B����~�}�S�cI��]�8Q���O�����!�ѯCN]I�n:��7��y�fwW��F�]��e�_l6#�[��n�('��D��(�p"�1ǒ*�>9;��ި�.��Wߢ��R��s{K���5� ��.O%��v�v�P�q�$-�nG���Ť&��|������XW�8����j�S��6�Q6_d��/��X����k/����|C�Փ́:>��O��ڰ�G�]�?jO�m��y�A����ƛd?�w����m`��s�ތ�Az������
M?g�pr��s;Ƅ����Gd_Bgu�)e��-���w�M��wL�$������F�}��m$Mz�z���^xaw��R
�Di��p.�F�0.��׶MKZ)��Kʷm��I�(ίS�O�� ���1��@}P,�b/�Oi�iA�����NT[�fineÍ�f�{W���B�РO��_�X1��ς��$�I�U�Z�mpZ�$�$�L8X�cw��iʋ�����yq�3��T�+~�Ś`��Nђ�2�	]Pc��_E��E��E�QE���_]_��r�g�\�-�����Px1�L����q�A%C�b�?1e9^��?P�n@?�U�֝ߌ�똒M�I�?Bo���?��O
FE��#�� B��n�o������&^p�0���:��*
��2egG�Q�����	��k{7���X�0G���N��
܅�<��q�� ��/�!JM._ҕ�H��q��A$QiA�<.8�#��ǖ+;����[��z񸐯�ѝY��D3�P�.p�>P؞�v"�?�ߵ��&c�:��]�r6���7�i��f��)g��5�Y{�P�C���P+Z�	z����w�x��D�9�����7R�����4g㉳ă�fu�����g�b9�F�m����|h����6��5��՛LĤ�1:�\ӎFN�>����
�R�f���ɯ(�.
��������ju/��<a�r�rI
ګ��4�}Ք�W���`r��j�x�G����^*q%F�M�+��X�}���졘��G]�4�����6�]�x��x�y9�΃��6دnj-0�͈aw�u�j���M�Kl�㝮���)y�y��n-f�
=C�"��wnaA��%C��>��H�K|���S�s4L��G0����e��K|��+�uZ�sk������>�y���7J6�op��%[�謹#|�%G�E�������5C�-i0p4�t�L!5#Oz�ceW�|��f�A�B}��M`g���)���(�ֹ��q*�-�Ô�d�ֹ`;��*Yfì�*G��q1���5t���A��p��m�ؙ�Nඬ��6q׎5M�7�g����D'x>+]�9��@ܝ��[^�w$�x���6Lv�0&����m�#�H��'k-�����$�4>$*��6[�˖6W��_#A�i�~fuQ^�% T�c:��p)�H�����-�G�b#��\c�Q3��є�;���#=��@�	��
_��'�������u��;���&�G�:⠇�IJ=�,+��
���=���1��I���o���뮁�@��i�خ�� L������SsUT�D��%��c�(�┗N$(�>.�ݟ4�M?�˓��
���VK��� �o��L����܉z��-L��H4|x��H�T�p��t�����aC|��9ڲ7��Q��i;�E�¸qb�Jyk�!�0(<f8Q8��X.�g+�~Pe�������7>��F26�e��P`��:��+q*U9p��/V���hLU1�E)rmn47��̹(;�`�Wp�Ԃ�yω>���Spg��kX!x����@��N�}\��bK栱`_6psA��2�nN�I�6l�k�`X|��`�p@��to�G	:��r�
|��'����V���A,���o8VZǷ@\��d���´��\��I]�5]�l�c�z�9j�3`@C`�0�Qr�~������_Q���L�˂-_قm����E6�_$��}!�u��Js,_qNe�d��<��+�m>0�L�l�a��䡗c��r6��iZ�l�jN��ěu'�<gC`��u=�h�S���mߊ������}�]���Ŭ�E���w~��gN���4A�Q/h�}��B�U�RL<�>����l���0��ijY��������S�ֵ�7��
�^��JX�.�G�e�L��xA��z��37���P�k��~�_�􉆮���7����;��ػ�!l@�fƈ�|�)��3��g,���{|��	<�1���g\zX+�#��}����(�.+e<��M��֌Y����a��0\�qrx�1[B��;L{�FK׃#�u�_2�}d����0#?o~Ao�H�H{Oq�{�a�B������L�#�y�ai��^��Ӭ-O̞f��E"lmZT5�
[�3�e���jT=�A�x6|��/g��5��MM�"�Vȴ/��-�,����’�vY�I
�-Ц�bÆ���Έ*e��9��ݿ��<�h�ѯ�N�`�4-��I���+�g�g�û��>G	i��J��"!CD�����l�t�㯙���|�@2o�2�da������e]��g��R��/p=>�O��2IpP��r��Z�k	�O2#�q&NΛ��*Gt���]X�K�qV?ٹm��N��l]��KUr�ӥ��wAi�y~��(!\pE�����ȟ��;�����"�f��W� Y##�.���;g)f�'bm�Q�\�L�oq#aI?a�`��a��`�0h%HPыo�%ؙ�Ewoj�/׸ٌ�͗��W��r�)$�W1�����=���{ױ�B�����)��s6�7�֨���sޅ�����;��֛!�k.*k�|��փ���g�\��m�ب:�T�ɠN�	�x(bq������w
��W�YdvB9�r0[���={i�ʱ5g&� �?�Q��y��ӗ��[4 �!|�[_L�}���BP޹	-z�S$���@qJK@�u��5ePBoΞ�K�����\��#���0�#���ͦ1��(�H�|k&��1u��1Q%*�Î����ͤI�&�~m|��>V�
�uy׌�Ա��s�	����פ�ѩ"OA.��/kŞ+M����w#�����O��\�\��.p��#dF&�2�a����. %H�b��.q��g;�o�f�kt;�������[?�X�DԉCzmӸ��Eq=���xS�����>`��^�����'�l?��i}S�03t�A�t��L��qd�)�j4��͜�Ǚ�*�,ư�Ff��X� Q8*j�q�(�l�-3$�i"�/�3����) �E8  �C�L�XUg333[[e3�����Y����
��N�^�)�8l��D<����w��j��:(N�de�����R`X�2��I*�
Ψ��P%͍أ8�:*B�0||��nJ�XUuq�TѭP��)�!���?~�͘.ȝ��X�8���+)Y�9+BeT��Mvj
�>�̐�	Tn��B!��x>Q�6*���Q�����ǟ�S4��2�D���$�>�B?��Nc;��J��x_��q�)�<��f��kE���}���|�)<:'�˟�f}8�b��,l)���}������η��8���k��Eڨ;����n��5�_:� �j���T4�ă-�?����튕Q@��jʳ���-�b��d��%��DJě���13u�_Rl|}�JZa��a��vqle����Q����t:%���1��G�AQ��4%�
4�Z�:	�Ǫ�3��^U5����y��I�Շ
q���c��$ ��c�j��\Nn��b�ȧ��a��&����S�W�r�a��P��m�7B<���óɩ
��	�h���,ޢ��M
�@���h>V9d�s>%�r�_5t5%m����;Y
߻2ܖr~��閇��b�y�V^�Z�v鮭;R�]sBa��������_[�S��ș>k�V��*+4zv����l��㟰��Ȋ��>J��������P"�7�e�M��QO��a���ܥC�	[f��="ư��$?�k��Q}d��6�K�O�K$�ݏ��'�ϵƚ.�*�[��@&�^Ǖ�۩ x�'����
\J��#GE|W_i&[��~��a���u9�
Z��RӨ�i����v��2�۸�a�5���O���u�Vsk�M{�R�ևeK5�]`8�7k"�Ǧ:/�}����ʲ�&s�X�j�o�Z[̓�p{���trv�ž�����^���vx�[���`��t�j�Yx]�V���zA*��h�'f���+eEk��#Y}��K�T�����<\U�.Mܔ[�L�^{��g�¡l��D��v�@ezԅ’e���w ��R��7݉����ך�ū�[Ʈ;B��u���QS�H7{[-%�Щ�VU:I�c9��ѥ���BW����#c�	ci�?���|˞�j���5K������T�rV�ˡ?ŧ8hJ�b���*�;��1��7��V4��=��a���)�
��f��!�i��han��k�-phʥ�\8��H�<���C���_B����&�c%�8��qs� nS'�.�	ʧj�H+��0G��&���_����0����.����+�Z������8<X�>�߳`�3�_�)5��{%��Lf.���Dc��F�k/��M[�.���uJ��A�R��VH�8��W����]"T�ߟa�~�긋�,$Xu�4�jʹgݶ%���4u�z#Ϙ�Dۂn���Ѡ��_MX ��t$`ϵe�$��Ƥ�4�)����c�Ǝ��5��5�̺)4:�3�fX��]�@@V8��_��0'�{ge��p�,�xE����o�:
~����#�Q*��y9����ibD]o���]ȅs�WJ�ԿH���	^0��j'7!ɒK�k����[�.g������`�,Hk�H��+��W���?|P�PX�B;�Z�	��{�[;��Š�F�]�� "�6\yw���E�ԗV�>�L�rBL�>S��X��Zs�+]4Ƒ�fʆ-����"��Ax�?Ȕ����A�72�L�l�����_���Y�����{a[��E \��"ۛQz�K���	��Gج�W����#���BDNjJ�d��Iٕ��m?�h�A��%��zY�FfBյ�	�g�y�y.
?�3? ����B��X\�B ���G,��3
�I��|���Lf�R�����9w�K\Đ�qYl����.�L'L�E��lw���K��Z��䍺S
Pl�l3��y��j|
�}�ˏ Aۑgs���bO��x���mz�XH%�����Ƌc��R�v��A3�m6qj�tC�Nt��9��[΄~��9�/u���&3/��N�� SU��t�J�if�>���8`����ݕ(4折4�6^��tzN�]�
�i���d������j�F޻0�X1;E��&��Y)�f��kq{�`!�5��֊��Y�
h��Gt�l����uǕ�B�4qg�Ow%֓�a\��:Z�C���g�J�y}MC��M��4��n�bJ��~��r�V��#�F��_�1m��'����ʕ���(-���-��!�n����VA�����U���,G�+�:�v+@6���lI�t0�Z{�Z-���&z̐��bj���t����0d<9`	!3+p�s�Q^Z}�x��x�~�_� �1���۴��j�x4�;9�hu��Cq\pƨp�9��%aw%S9/Ƭ�ൖ������:��.]z'��x�}H��W���-��y��e^��'ݲ\�')����a�0�Ԙ?����6e�8<e9ބQ��Fڊ;�K�^Sп��O�C�wp?@�h�y&�
�~�$��3��EYg,�P%q��s_\�����η�Le��%�VYsRx��t�a�i���>��1A�yB()ǁ�g&ǁx������!�q��j�:�*F�(N&oj��k/b�y�Gb������0P�Ո����/�ҩ�GB�f���yo����}��@��k�\ܷ�<M�_�����#��1o���O�0x�e�0w�|�(�@�4�e$�
�GC��g�� ���1Z&Թ�I���ǷF��Y9����ys����=�`w�������l����'�]}E��`_��5Ln�m�틬�ië��j఺��Fş�c��?�|	S���4o��7�lj�wr�j!Z���'e�a4�X��QI��T�E�j�ʪ�^k�l~A�U�)OBo�GF[���������H���?@O���
C�&��,K�J(NF19�L��-(�^J�䕍��l�c:O�I+%��tb��O�'�5wM��E�2m%�Md��O;��Wδ3K�7�&��})�0��X{��^��^�'���w�o>�8l�w|ޝ�� !S��ft��٧T�_.}����b�9%�
��M�Iz��H=ʓ;��,,��U�mD��vڅ���`o�o��o��4Yi�OŠ�p�$��t~$�~�g��Z�������	}��tˉ�6h�;��}��K��/��o��Wu5M<+n����	GVS��t�?� ����6$,\
����g$��*y�
5�z�/��O63<[�}����n�Z�.]ta�g��y�_pz>�&]mT��f����q�&��e�%=2�7̅���{�/Ć��=L�7r�N�1
����o�w�o�JT�T,@��.坉�}�_�M�Ewh:D����~��e6a���/�Z ��x*n���-k����a������b����ff��bA6(�6/�Km�Rm��6Gs��Ff���*�m�S�Hn�<nH��e~�'`W@���}��tѰ�����(����m���e�a�_D�Ծ�.=NL��d����&�(q�*7��"�zK�G�G�]A�%H=B�88J~ F�����V踗�FH��j�,t�>g����9rq���#�`�<3X��-H�4HVq~���>�!��ߛw
�ZMHq~ve��x/��p��p���*
)V���6l.]�ۆ˓l�/�j7)6�՜d�b?�V
 $�7�l��HA�]�h^��LJ�dɕE�zqdIgR.\��
ֽR/�'��X�(*5d�7K��y\�~�O��Œ${�b��[_
�Ӄ�OI �TX�����%�i�G01�<^�5ly���uV���~�|���yty�A��`q9C�A:'K��<��<��/�Љǃ�#$i�VO@j?^�ȜD��q���Eu�+���qnϣ�T��5��x�����We"���Z�W�ԆKu�/JLYگ-7^��}��
��Q�¯�
�h*-1Td��8�d����㟢[��s8*��� �����.�x�������l��n��V)X�1,����̝Cc.�xSUO&�hV)�]��^\�,�l��lքL�KpU�PP��
N�l��q�,̵�RP��}s[�F�x[�� w[�s�v@��Ăl�WA�d"�j��Π��,6WH3�}��n?HM���EI��t9$z}I�d�&L-կ��9��et��!��{9н�v�{�KX���S�]Aڰ�/��^>��������8Nf�c�~p�(�Aq�z�������u/"�'� �|h����g��>��&���x_ ��5����ha�Ñ��A%3Ҩ
���l��O���z&���*�����{0;��j�U�}�C�I���0����X�oe�r��Z�ox��E��,�"�/:���!��m��
�Ji�)Y�'�S���}
����i�I������K2��zo��i y�>�??��Esc^L'���|�`���+��lY���ȁ��!a�Y�O%CM�ԍ��Q�Sg
����ԉ�R�~άMd�/�;���}��c����A	z��7)q��n�+ v� O|lh"��'mpw�I�v���Q����*������qB���T�,o��f_:�Un���y��Kw�p���
4�'h���TO
�$�������EAxM�7��7ݶ�F��{1T��.,���e8��R4�����&����l@m)�R�@֭)Pa��$��M�T�����X
FM]�+|a�CZ˂�%osBK�*��y�O���S�J�
�0�*�C?Z��z�'_�Z�dSWjE���u\%�eɹĮ��˦�-�ҟ�9T��՗�O�v���l�".� B�Ĵ�^!gK�QZ�ol�+�
$�r�!c!��#,���ύ>^�������U�	Uw�����dА��u۝��e�_a�gdh���S�LZގ���zɡ���s� �=�Iԟx?{�N�:�GS\�:\�>��0@�8�X�W&�i[-�q�������b��Dt+�v����L�̸�L�'2�C�bK�I��Gj��Պ��:p���c_߉�nsk�ūk�M����4���]K�A{fW��/,�ޠ�j�*�jc�6����Q*�V8?��^�r4�z���~�L'K�����מ�I�!�n�òM�m}�Hw��[<��bCs�G��\.6�E���o�d�wE��}����Hy��UH��o
^uŴqk�w�TV-�T��6I�p�j����T0T�n7L
y���
4 ��$�Mz�B_������܅/�+{)V�$j�$/���Q�ǣ'i��8R��8��[�{Z3]0��Z�r�c��*�x�OS�l��r!�S�a��u^���~h��`�jn�l�S_-�u�����v�}�?����_"�WZ�<诐�t�G2"�[�+��'�8uW|�Fr�a�`��)�Y�v���x:�X���0t2��٪���T_�~`Z�4^\��$�}��ru/s8�b�;�n���pF-�9�'�V��H�op�3�ENj�<Ѧ67����Uݪ��r�_.�u~��Y�����t����t���Ј �N�؞T��'͑��4zf�87�@���Q���݃L�\eK�쪬b(J:$:���
�V2+�j犽�Tx�G���Wh�S!i��Q_�{ԗ���cЩ�i���Y���� ��cܸ�Q3NT���@	<���B�E6E7d��u)R�������\�Fjfk������_[��O�@@�p@@
��S��lme��\�����?��v���~f�ۺA�10�����̐��Z#�[�֕��ݻxw�oR76@�c�PK"92%���#BE�|��?e�z2�},ܻ�`�2�϶�_���_?g��.��쁬z�h���1�ڻ�.��6 ���׈ÿ�Y=�2	�F�"�%��C$�C���"�ň�Q�<�`�cB-�!s|\ņ'���
Y�$q�^�|ޗ�1Ж�V^p<x;0so�nFJ����N�p��[�q��
��O�Rrs��7�w�;�q	9�ZN����e%�%�ó�B����t�f�;o���yіO2��3]��d��c݈6��¼�d]�=%��%V����wRd�cKwu4:���`��6�ꭶ�*8d�E�
a�B����T��ڽ|P]l..{l�"w�n��<�w��6�#u}���b��n�;A��54{7����e�[=VO9�"Y��'޶�9w:4a�5��
/�Jg�y�+n�Ls1_�y����K����}���J4��Κ
�l��M^��*�{Q=ɮ�K�K�Zg��炢����8�3��uD���-}SH�{\
k�����N��ÊNX���U�����%4�h�\��%�� v4��N���²0� ���e����z�S4��54����Fa�]ќ`94�C[4��rB�>�tS�ͿO�,��M5���r1˙/f�E53^�M!��-j��7��x��@ח��:�e`J��T6�ݜK�(��U��~�����l>�AS���k������q�A�W4y¥_�!]qT�ji��]��";��^n�L,3e��jC}�Bz&�w�.R��V��m�>�~x̭�"����d'(���=U�;���X��a�0[�8[ؓc�S�~i��N��qgo����‡PY�z3ػs3̃H$�p�km�~k�ML�@vr!�6�K��z�ͥ?t�-C�"�������r���2!�&�����l�*4�@�*���`*w[X�e	]F
'ݴ����7.����:E�ER��Y돃U�l	v$x�ҏO�~:L+6�$c	1ơ�-�?�?����r���DjU�\��c5��S���}Ej��,&q�AY�l4�^���qc��m�"�}ª��xCr3F���`>J	��/I3B�/@1ܢ��Α8�|F$�R�Gd��˜�qA-���oy��Ln95�P%�P����F��~�J=���f/3�\�X�}��IBs�`��ҏP�xB�JQ���rp,���%��|�v>1��
�~͋����=/�k��8�����A�A7v�D�<C��;/��|�u�f@��1�|H
����6f�t#�������.��‘r~������K��,Vk1.d�@�E�L.sl26��2��^'���!��/-u_��@�
%C$�U�>�|�r����`��=�nR]�)<Ӗ�!l-՝�A��`\W�p��(����I����U�����:T�mt�V�3x�k!����-y��{�3���3�ưİ
BA]����{��]^�����7�n��O�2W��>sB�2z�.(���$��0��6>m1���<{�%����(‘D,T�X�H�Dx�d�Hq�7)�#�}��g���6x_���Y��γ�����#F �;{$xO�H��{����PH���s�b�^�?�󍂑�\T�~C���pPN����p0g%�=�#��cf��NʀD�=��œk��r`�Yc�ť:̖�&_i֏��c���p�>��1��7�8[ߑ�3q��Rl'E		om�g�"4�U�r�R��n8����4�($�p�L��Ǎ��:�&��)��?����'�m:�k�����X�[:�4b;9�I~o}��\`�rkSv���Q�JB������i������ WfAm:�0k[	L��~�`N=<T{�^�E��*��)�
�H*��K�g���XTݳ�t9ygkb�[V��D;:��tpv5�A��f�Pxz�5�f�.4K��{7g�k�zX�2��9d��Xn�O��軗2y++���Zf���zWcx-Cއn~øiR��f�!hڧ���%��R!��.���ޮ��K1�.�?ED�+0�!p���楰Z��,0lp��Ƣ�h���
����O�ƪ����L��F4X��G¹��‘� �HgI�)Jy�;�^}:RSŘG~8a������'�7��蝳iK�bЗq�/QZ�\���Qme��0����G}��{k2 ���ŤzJ��_�v�ܷ�E3:���ĶK`x�7Z���f8�/6��`��s��h_}�Ң�3��;�m֑��O�ʢ˵L��x6øP1���WWM@�b :a�|ń����d���w�$Ur;�YƑ#,�gѶ���$����A�.�}��N�;�Ӑ}W�9l�B�j1�-�j[�ZxH�0��iL7���甞;7�w~���]�ߍ3n-�_��>�s��A���1o�ȱ�T7Į*{�lhE��7�:�3(~�Dͤ�`�{�4Dg��s�5��hS�E��P�LM��GC����e޶q���J�G�~U��lE��i�qŪ���E_&�g9�\C���t��H/	�۟T��� �r�0�v/�f���wFi���,_��2O�" 4�UE>TЬ�6�^	������/�&��A��3�R�17n��tv��ie���'��-~����9��I���iv�1�ЦR+�	���1t&6<���=,�LE-a#�5�%�1��W�8��T׉4	wI��h�l�P�-��6Q�e6-�~��\/�A*���hA�M���q��S��
��3��m�:��v�+tU�	��(��fSv�,�����7
�
�#\�W.X��� �֗��~���ܯ�t�ob����J���7
�	�i��pZ��P�i<
>��ģ��4��y��\���^���3���bc\��#Nu~u�]u6K��o��N�3�ȼ5Q�f����$�3H�qn��I�n뒶�k�r��O��<�^&��RZv��	��/���
�x�k������h� @@�^%��
ٛ�G\�?V���ڷ<���]Q�20xJ��q=��sSK�q�N�\�g
5����Ğ��(,�P���X��>��f�C�;���yr*[�oW��鍳?�{�Kk�|������}�wY�B�h�����z���N
�Ep\��+H��
�+�R������4D2|	��T���`���੩���K���Kp���R0j<�0�(�vd�����'���ʞ\���ңӕ�Y�,�:�NS�G�<�r���9�zL ��hPXX�!�o��sŝ�M��Um`��_Vr/� K<�.T��~��nd%޶�ehV�XI�J#NN�U_�(M���9��,7e�*b
+�"�UF�FK��s��.�T�e]+b+Ф�����k�DaS~�i�d�!@��X�śb=���q1��o�:H����[�c} uA�R>Ա���J��P�P+M���D�1��T��,�YbM�L�ԝqc���Tu�8�ᐖ��["ˠ�X{+��(�G-�LU
K#��V���:lH(z�٬KKӊ����-�P9�/�aby�S�'�˔��8�*��
���@�$��@l��S�4���P�������r�-�W!�9���@�9��_סe�^�ӿ��Fh�k~��Zse�=��Pe��������r��w�lp5Q%�����j�b���Y��2x�'�O�N�0�a�+UFsg�H��H��Am?�a����f�:�W��\���9���rD��US�4Y,�r�?�^��q^r۴>���G�f����
���.��i���D)�%/��C���9�ңo�I��p�튇n}�6��\:�)�c:g��eHF�_��4�_��a�Щ��oj��{A�YZ�S�;M�b��@��6�l��|�esn��o�9��e�0t��kO��|j}1�*a/̊
]�P-=H]5T��g‚$2m��)T�w�Ɠ�s�e��	���5ie��n`K]
���;{8����H8y6h��$p`L�$ :X���,��V�֥�]24���e�@�4g���M`��3n�����JC��͌���xmy�xbka�uc��f��ְ�@k�N�3-;'b�7/E�>c�~��S�{�B�7��=�q͖�=��8a�	�}�e:�u�ޅ&[�g&��i���vc-�Җ�V�F
�LQC��c��V9���R��|��못��3�5�4"�3U�{��)��[8.�ܚ"n}�L7���O]u3!�4}���=��_����_�:��w�|�t���Z�y��y)Il�ʍ��y�C7:��#���j�[B��%����-<�}��w�T���̸�?-�\f�&�B�s��X�!	N �hw6��c���Q}��s^�?G���w�n���7��{H�}߰��,t�m��7��!Nc�>�'	�}�&������(PS�zZJ�[w��||gU1�6���x���m����|�o���\�0�^�]���pg\Wy�����增��N�w~?�ōV,0�?�!����F��E����������
XO�5�o��nm=b2� O(-�fob&�CM�1e""�{k7rz���И2����GKk��zu^
s!
'���m���29B�%�����o���Vmj�~���γ��w���?6=4��CB��wHю}`�w�a�P����Α51҉s2<��s԰
`N�bo���
��C��a5]_�(CʾJ}��
�w6<�����V�����ov���6�–���w��F��T��W��c�T���s�o�D��j2�ߓC�끏ľ�K
2�n�q6���{��o�?H#����j�Ӄ�O(^'�H	�o
�o�����o�H�{|=�����ݏ/�o\AE����0��!�2��H��7�s�~r`�h�&:h�څ-R+Jj�i����R�$�I�6��խ�$U����
��n�K�^�K�tw�(�ٖ���C;r�QQ�ޣA���L��QnV�#؇�-���]���:�6t2�hoCq�`�zQ�����o��)�+~�"���E��|\�},
7�r�izD��ō'��!+x��&��CH:�"�;��[��?����%A���FF�%�Q�ib�W����({�
*�q����d����T��`�߄�?o�BI���N����Q��xd��u3���T�[�RS�s-h�2p U1U^O��re�0�/v�i�c�׃�M����ְ�F|�T���yj�4�V�~R+t�96.���%�3�=H�ID��`��+w/��ſۈ�h��D��OS:h W�GC�i1ؖID����8��T�z�￱��������u�W�<Ѩm��O�E.F�������$��f�db���@�|�F�*�d����v=3��	oܓC��+˫W�Y��.8�2Q�[q����	�&����.���~�oj㽼<�$�I`'�h��cO�kEy1*v/���E�0k�礓�{v��ߨ0Y�?dOu8c�K��HY
��Pc�/��+M'�%E�Y���(T�Rf-3Y뜴\3!�A���L@�	��W������z�xℨ*�C�G��2Q����[�,�-fI�[�5il�F&�k�{�o��z'�T���=!w�d�B�ʧғն:���d
$��.��H���J�����ږ���4�5ƥe�7�)k�q�����m�2��O��L��;��
����Qԧp���\/����ȕe��=S�t��u��F#鯠1	F���
�U+՚�UƉ�"�C�Z��pM���dgI��q�:��t8&��m��b�m��;��r�K9�'8dڶ�k��ڠO�-��*�8�a(Qt6�D"���m��?Ṉ7䷭�V&�]���V��;S�|y��h]��u�U%!�{�E1�or�Q�]��5�i9a�@���XK��vm�p��!r���
�]�j?!�3x�|�%L'T�l��N�L�r�w���AJCY�mjY	G̩��OM9��[�k��x�(KP׮���z�V}hZ~&ּ�/Y�XN �w��U�[ǖI�8�-*����ˤ�;�h�5��L(��S:�ZP��F��A�9����ք���wE���Į0h̚
����[-H*<rw�f�H���C�����UO/-�<5���2��G翵�n�n����n���]+>n]���٬-j5N���ix95q	�t�m��Q��&�[݄�Q_ӟ��U�4�X���I(�E���P��B�e���koq�T8`o��q�9���~u��a��9*�s��D�]Dq�ͮ?�����;�vB`�����Ʒ��(�����{�ƈ�
��>�J���!��pw��cF�M�h23d�~ �š_"�¯J�T�37������R҅�^��+G H��#��O�5G�ss
s�בN��8�1�@p�_�2rDr���(��g,f�b�r��H��b�n����ة�
p��1�1j�C�1���0	��sJ�d�}p4n!�2��nT��(Ռ�����O�?(�f�5�'�kc�J�CNRNq���l���Iz$y��{ ���^��xs���̴�c(��`�E"����R������1�U$�J�@I�̾�c̒Q��X$�T�TGPIO6
gěC
D
��� ���='4����[���mڬ��1���^;jl��k(mW����.v�06юw�2
���6s��f�3��v��:���:��]͕����Fp8�K���RWA��C�JA�F�"X���3oTs��;o��b5>�\�glv>��h>+�>L�c�(�+-��%dq9t�:H���]50��d�	��$rO��Ј�z�����=E�(��$1�Ԙ��$�Ԑ����w�ҭI�h�m�m��m۶m۶m۶�7m��Wպ����S���5c�xV����ʄz_��s�Ӝ�Y`���x�"���5"���%
ư�x}e��t�Зf��%��f���ug�>Z�,6�A�C��+��=��Ip��M1���)gb�s<@;�Dm~\m�;�:g:C��U��b���B�^de�wy	�A0*�Y���I ֓&ԙ�Di��F3�_�!jKZ�+��&uǺ|p�W��En⎑�H�b[x:�U4�#3��0����~9z�
k{�Sj3�2��.aZQ����o��R#ڊ�&{` բRQ�w�F+���q�����u�I�
٘�U�'�a�fRƞ�%�/=�
�t�f��� 3�H�|�� ?F8��R�Ņ����k=��N���W��{��7{�O�4�;���t���}J��0~꨻D����e&y��6�ӞiǑv8�W%�z:c�K`|�VĦ�@N�H���Yq����y�����! �GC��#�8����?l��FT��8�7=�c��(ȉ+J�}|�7�Mi8�8��'��'�ݥ�m����nu�N�����.lm�k��wfR��]�;V�SڲΙn�^^nY�آ]��2��!9��rgZ�êh�OU2�G�.��Q���X&M���mG�6"]K���q:M��j���9Q�qr�bÊA��鼃I?����*'�aV�����F0�o`��K
�"y��v�",g���=r9���o�I��(fwPs(|��wW�#��Vb����]a>;���Hz�Urru��;�h;��I�RԹtm�}#z�C��Tm�{3�L_�d3�P��ڔ!,`�D��)�8*I<���%6�"8l�g)P���w������Pm��d�J2˹�s����$�&�|	!���sK�@M����r^kV��Rh;�+%^-oZ�v1uZOoi�$HW����C�j�Z����0��1L�2r3oܵ)����N�/w)�*��az,�*��\VM�W���.���դ勥勎�0�9��Lv�n92�(>�3�7���3�|�3p  3  �Qτ���_���M����t�#c���E��S�)��P"Jl		������ԍ�WY�muat7Z�_�K�A�gŊ	��S��p�P�Oo#�G�ۜc���"�����Ӷ>�۟�gj �Pg}�@iT�t�! S�zg�"����Bm�\�ܰ���uE�#��!e���y�n��Bw]:$����^D�R�m���D=��3w�1#Go�1��J����}��W��]��o���\§��l.{,z��Sv�\��XK��*��N)7�٩��(!��g�j�U�Kw����Ӯ�t�������$�sy{�zh�\3L�~���TIv#o��=H�9S�8�B����ZQ'��U�5�<��S�<">�,���s\��R��v�코us:���X�����Fm�=��H ��A�O��MVK77-;`�4a�^�P/�$�+j�@{|M�7A��A��	���M�r`O�|��؁���zݑ&nr�e�NšhY[m+>�CЉ�j!���t�>(�A�%$�Q���R�ً���~��!#��M�8�s�X�_�wP����)%�"��A`���r0:U*V����<�qFF�
�hi�?)�dgl),�3�
�-�FaR�)	_e�~I�G�~ɭ<M�q5��r�"�p��Q3;Jq�mÕ16���$$+WAy43gg�@~8V;V���c�ix�@�҄��%@��wj?��=��
�u���7���r��	.��V���쫿O�H6��Ndy�xR�r6�_��z'��|G��l�Z�	�G�b>�n�j�͕����_�9��n�/�=��ie����"�#����Ʃ[:�����]�T��P��t�xw���R�
�#vN�.2@O��#{���'�7A�J�����ȧ��2�Y��Q���P�E�)�)�(�n/��z*]��Y�a�$[��%�Ɂ�A�cl5&A�A�Wa���#UU$�`;�'���!
��OD��+k=ɜI�Jy�����C�t�H�N�A�j��z3'�c�'���lC�q4��&y'ߥu[&��X�<�|=a���}��:x�&'q����2��ڎ^F������ȤY����_��H+��7��̆�DNQ��
Rm^7@`�&ib����UoXe�'�'�S�N��=?��`�����#��=�5�r�g�/J.a��z���-��'�ƫ�u�~*�r�s�JX�u�KF�(�p��0�.��>"�7��e��u^-֊��:[���X�ny�3
�}���
E�c��/J�B@�P;�v,7d
��~��03��������U�B�{��k�J��/�M�?a�K���|A] �"�Ro���m|_�.2���"��0w����oa�Y�G�o^�0:>oPn	��e��
;��7ճu4���[>#�mu~��>���"���bAv�a�y:����5�B z�:�u)�S�����r�ݩN��I�EɈ/j�;d� ��L��|�+`͖��3S��aO�u^�^?{���T�/����Yܡ���J;-�t�Z���StI��m��������G+�[ݠ�b
�Z�m����i���0wְ����w����|�>�1�#��a6��ܟ;t~
�c��̇>�q�h~�u�f��~�}��˞�EFW��)��j�?�*:�յP��cR���x&�㘵2yj_���K�~��j���LXW�j9��4�
�����Q������K��n3ň���ӭ��*��N����kn�Ϡ�g�j'ͲR�"��J�f環�I��\բ��9����R����:�CV������&���n8�X���E
<(9�H���թ�6��P#
p�(�(��(͌̍2��R芩�
dm�ͽ³;?(uf������<��N�LI6�@�z�S=����s~�]�!�)#e�E�#
��l0��ASc�Qk��>6(0�jOAӳ��\P�c�%��� wRF��i1�1�s����U�t�$S���5��.�%c��=����c�/�E�ypF��L�S {��X�^79�YHF#g��V����S�m��:�0�]�Q#��p
&5t��tؑ�q=�w}\��q=�010&�C��@��4U����ӵa�l��6ֿ⡺�aڕ7r˵�n}��`�_� �w�-Z�۝�ߊ�|z�ox4��m�ٺ�`hWck�߫�P!\f�~�G��uZk�75��*r�����ȿ�@9g�nEnˢD#�Rz��d���X1�ʥ�=޿Kk@8�@��C��7�3�,���U?�o�N$Ѱ�Y����Wv�	��gdh*���Jr�1ٍ_��Ȫ1,ҽ�D�W�7b�Mn�`��f�Qn�?Q�c-�45�3Efm��f�0%3J]g�)�j�m��w�1-�$�%�r~X��_���
I�����˟�h+E��5���1ܘ`q�a�\K��+R�L����v�땗��p?�s�]>u�a�����|?�ݿ; p��p<a0���rN!=�Zhu�.8�V����KG�r+�F�3VA8B������`���c^-��/��8�H�g�͓p�c�'#f�^o�4�wL��`u����ٵ��0���	���lwBݣ�8� �L�r�Γ�~V���Z��X�5i���|���& �C�?G��l�fe%���1xu��g�����ӣ�T�e��I�e�YS	�3��	�hX��fX��Ɛ���f���b��E���I�tɺ�}�����z+�4�M��0�oZ��B�1�������-H�h��`�[�쀤f#��G՞;!�[٭�?��4�s�����]���@T?A�{	1!��i
�Jv��u�{aj����#�+2�-��t����j�05�4�^�6�*�b���av��9l�';��6��
֣4�_���~���+�s#!�f���4�k�&!}��;�b�
�`$g�u��攮Y�z-Ϊ��q��nE�� ���4��q�ZI�>a��o�_���$����%r��j�W]mQ���V�G�n��T	�
�+Qh�=��%�<Y}�)�6
���[�&��%�B�<�W�a�����5��ĄiY�tt�_�eZF���:�F�O��0E�1z�{o�*������7�����
�	���n�iߨƑ6���H_��
�˃�Ȱ	�^��M�j��D�ID=�.m�Kݱr0�B��]Sz�k����S��.d�2o�L1�?\]Q5{C]� 4�8=�*6_4��]u=0/�!��`���@��2p!!5D�[�{�J���uˮ�W�s��K�7��uZe��S�=���z��ւ�/��{^�8��~�M���(ƾ��7Ωs�7�kwȪ�{���:{��Q��I��G�o�w^�7��p7�)�C�O(���{����J"�p�K�X��Eڪ�:���NU
�f�X5��_<3�rLZ��C����J���1��_[�ƭ+�-$��|������P����'S�H^}.Ci7{�A%r�~��:�;���V�X���듊~�y�%�����Y�J0 �NX  ���J���f���,6��6���H`�8t���`�麿�#'Ir�A:2�)ڽ;�VJ�H)�D���!��i�k�%�����X���ewo�c��^�j�ߺ�G	�Y���a7�����p����Pt����rԤ���]m�]�v����ܠ7�v�?AH��Du�r昡����;����A�?���X��1�8�|<0c��P�^TqU��Q�z$Fxt��f�ܟ�;s.#3!)r��Z��IT�9ƻ�H�tR�4��q04�4��F,&��,p	x��W�,ɯ0[�l$J�hE�&o�iIs!��T�#:�?���PA�
�~�7�g��C��4JT���h�G���x1�]�����=u�����>�*T��U,?`+�
�w�JKmZeY&0-�U]���r2�0ј}��9Kx�34�;�A�*����m�Y_�zni،n�K
�2*&��߸(�i��8�S�)'��d�U��&�
6����dRRdρ�֒�,��
�[��!5�&�2�#ʽ�+���ZUl��؟��8
"�S���U/ӯj��]�)3���Y����p�@_�����]��?�T̈́8�.l�����G�GU��W,����E�B�As�Q�pX�ZA�䋇B�p�Uj.Ƙ�v~������|)�	��HT����W����y�wh����m�u���s)��n�f`����Q�
�	���.���9q�憮Qc��f�UOs��������{�0`�s.Uwe�d���w�$�Ss��p6>Ԗ�[Q˶ʌ69�|�D���oV=�(`�)��KdOځ}/�+`_�J�
�Oy�,����)z7�f0P�)Ă1���KBT:-3�^6��0y�yj��
tP��;z{����$�~
$9�q����l	�P\/�T7��S]�IW˔ʪR�m�"]��
*�eZ���4�}�!��Q�766�P��Ph6�yN�::>��s�z0�n[��-���o��_��
x���SG�~K
����]���i���#5*������.�u�u��odi�+�T}V�h�q{��݄�q�F���g#f�ۉ&����x�HS�}��H�X�6;�B�w�.��=4���bz��_�x�����b������au4��l������{�[��B��?����1�f#���g��A����|�IvN`Z�)�CN�+ОT��P��Z�kSS�u�2�׫O�>�gl�*6}�pYx*�&!�g'op\w�c�vH���(}�9?��ä��Z}C!h��>�U��� <�aoXy�jQQF�Mqս�(��i��4
�5�ꆼم6����b�Wٿ�{�e]E)���@�.=O�T�����W��o���hdN|�~�	�������#�g�\�T�A}!��%kgl"�@��u�e���Cv.Ѵ�bJ?�b�a�^lxV�j������ٹ�T<#��xd|=�NG���Y��B9�F6_Z��y旿6r\���$��"��F�3�q�v�������Pd;L ���u��o'��7&�N0�[�� �M!u%�iP:�K�7[��'^�������!�7�^�5W/Ֆ́�6���=��C_,��7sp�8#�c��Th�QqXЛ+b�ɻ8b��:�^�>�A�d.��?�E��-7���gl	�i�Wz�!�p�Ձ�p�֤�9�L��H���Bn�*Iw����w����1�3�f��ai���j��g+%5��=�I)���z�/L����aU���
!#I�&8�:9�������oNlK܊֑�iA�L�4�ѩTnBұ�k$l����#�[�kMnk�V�be:e80�U�0��b�C���x[��%7�n�"��;)F}g��K+m"�5�&|��TI+�mbe9��R0��i���s�i.z�qTC��R#�!��i6Σ�Dby����7�=N���&%��HHV��S"1�TbF9�X�:�XYu<�ل'���l6���Ҥ,z9:�?Sl"F(Ԛ�����:���e���|G�P1Y�B�iKL���3<y:d,k4�%&���Y�*�����]J����  �`�#�:�J�^���$5(��7�4^&ץ�Ty���ؗˬ8
9>���-n�Յ�$���H����dž�t}b�q���h)�E]�-����o�8�]D��d��,�z�|�6��a�qwF �M4��%�
K	�Z?lƎ'�+���98Q����s�ow����cp����~���=)ȩ‚���&f��;��y��>���>OQ���J}��/�;Z���~$�'���2�3o#qb�)�s���|�{T�K$9�k<k��>W�fD%�@5�e���*J������1#ˑ�p"�h
94�&����NX��dbq,nH��Od����w��6����;�_?[N�֟:�*�����d\jz��LC�9Ƙ�51۪8\�CֶLJ��6�-c�b�/ީ�0x����L+�����6�Uǚ6��F����+�H�g�W�s�u(��܅6Ce�U�������PL�`���L4����آ�HK�{�q���������
��R<BO,וy,P�.�"��F��^J���Q:���~ˮ�H[%���M��#C�/���N�Uq5�� �ГS�`��{o~�,f�o�B�a���7[g|:��3��[v�Th��:��s�#�}�u�~�33$�Z_���ͤy��W���~�3�ӛ����ac�og�w��Y�z0��v(��/�#Wg}P��K{DL@�P1iECx��z@N.�Wv�	��Jke��Z���B�M]z��'���A���g{������]�*JXԁ1��F��]��d�؝au�� -��M��̨�٢������u���/�sEN�{#K� �����Wк��pf�i+\p���Ƿ�5�����3�;1c�~�������1��8��(�?,vAԣ �R�ұ���"������aQ�q5�w��n
��q��8�	���E�g��
�����M�������y�Y'ǭ,YG���>�0�S,�
~�1:�oќ� n�3��*��tl"�N/@���U[$��ڕr�t�n���L��?���*���~j�����[��^ޑ1�pzc��{�,a��J��5I��|�2-D]`�"z�:��2����1�h�<��{l�Gп�~9�}��è��;�8lz���.�'ޑ�JU�ޡe�(7;�%�NCN���?o
��B�/��b�nU^l1D$:@��]4S1��XB�%!�1]�T�!����-bI:�И���Kog�򥦸KzMP�
�u�&�0WY��.�������0�[(��bR.zm�d޶�����������0�c�A��^���(ᘠ��^	�֣�ÄZDn�D�j�P��F��CSI5J��u1n4�؋�9���}��R��U��Ŷ�-��"�2�۝s�u�u��p���\�-8�(�	��tƉ5�	��GSo�<��u��=�Bq`�-�j;���v�_��,��޺�������+AC��HHH��/D3�p؝��[��١3���f�C
5�7���Z�
-Cu�K[�+�W%5�D��JZ�.ע�`q��a�^6X�����F��9�t��~��=lOP���&k)�<Nj��v;Wc$������G�.�]=�vL��|�p�+�LY2j�?h���#�Ul+j��	�N������%��%��5K�ߦ��%*�q��җS��0������ߌ���%������� �dk2���B�Y���7�Q6���z��o�vt��yN��º�eՌyKE&�/I�ƧK�d$��d��.$g+K��������!H2U�t�/��u�Mu��f+P�x�k���o�F�����q��2�b~��H�phU��r��l����?��*1Y���JM�GPm���:��G�ś��10��G�y(�?�'���v�/�(�<%��*���\g��0b��+� Q�Z����B�N�\g
ƛS��M(T7Ȓ{pCJR� :W�u؈��h�Ϋ�D�e�1�gd�[hm��m�:���Spa���jW7�T�2��-��hM�\�0�OSK�`{���
�)15=qٟ����p���@��Ӆw�[�>�t�E�cĐ����j���gS�CҖ�B�Sl2�8�Ee;����N��e�J3����-�~:��P�;���L���[�Y�`lr�S�γ�R�f��RPť8�ҫ��[I�^�UnxfH֟5V=׬2�WLb��ne�
:��B�W)�b*qNԉ�e�n��G��w��pC�����g�a�D���-L��R��>dZ͌F��+
�f#��
>a�ا�9�������D6�]B\�0���CX���p �j
^�r/�,���؂��ur��c�߽7qn��G�$�l�'<`I�p�5hގX�R���t�;��7�[_����2QQ<��U��o����	x�O]S!l蠉39�� r�~	�>U9M�p��
��S��[6&4LB���ǹ#�2�f�k8+�0�Ɵ|"���R$/�f�M��[�>A�^��^���;��[��[4�}�d-~���v�~��9w�>y�����v>D�J����gJ��6��i��!�����T�X`�S›�'ʍ�Y����}w2�s[��wyA_���WR����3F�;8���r��5��ԔU0lNNb#S��ڄ
�)4�y�@b�U&ᅅ�ak3�/��05��y���2�в���Ԩ�<#8kHS��yN�z�43�ǤP�E�����}��u��|Z�aBT#0�ˍ�D�ׁ"�G��A�P��%�=9pԃ�P=W����qM�P�����q�X���9zH�)X��R������c��c.�KՇ��� ��P�����>VD��|�#��)l���I
̅Z�D���
S��p�T���6M�3�+$���
�����me�h�^kK��(��PY(_��Ӫ�8��X=�z��&5�׋J��;B#\��`�����mN��ᬢb�������A��.ƞ��B�k���wY.Z���g����e+b���I(�o2�
�B:�J�}%�qa<K�)R���(�
��z��@K�O�\���2�o���-%���[��<n�F�M� lB�c��`�J�ԼH�h���L�|�
I#��t�Y�����Ç�I�Η���I�PQ�ʒ����Pu��%�>���k�2�����WҰ%DL�T3�V�\�Kq���������p���Z�\|�b@��#N�������A��v;���c��T�`�7ijd�����V����8�+�t��@�n�c�͸���8f����%��NUv�����1�涉8�;����E)<[��D���)�
�bQ<-����0�kg諷�]c`�=�fC��dz�/`֛��!Uw'�T��T�nt�ў�Ҳ۔�D�lU+rYۥ�x]��~3;V��y�
�+���:pn��ȇ,b�R̫Ad_�;']PW^�H\*>��G��5E�.��`�Ƞ^��ϩPl���Q>z�
�@ה�@7#%;�ڄv���W�lX��	�h��׿�f�|`�-�rS�r��J�)�k���;K��5���(�fB|�Sm�p�q�D���bb���)�����I~�LcL�2G�ۿ���S�$8u���hZ򯢙��,�#���t֬eg�0~C��)]�bjAr�T}lѦ�j��.C̥�f�; ��
jG�*q��S��~�U�������m�b�̺����n��by����q���r��v��/aS���PHZ���)��'@K�:�3��kT[�b���p�h�,�U�����k�j�P&P#O�-�bҰ�R�(I�ZZ�=��r\}}��4]A˧�V�kK0��4m��yQ[Ĥ̖�S����j�o�����~�B3����3\�H�(
��|�{m�����41�)W��}ʼ�h�R���<�?���ϑ���X®���ܟ5���.Z{k�7۰���6J��y
�� ,če���\j�)s��;��&����z�����=��q�M�m���=����HՍ�·��tגf7l�M�
�-q3D��/�A���%�R�
��۸�9Y�k�T@�Ɉ=�e�4�vl���vʄ,�Z 5,ᕂ�pfh�uy9f�t�-��K_;�^,���)�i�}�?��~��gɇ���F������zxg�`���,�������m�*�ĄOi�jHXt	r�*
��3�pL&щ�$���D����Ie<B��@@A�O҂x���b��D}"��[s�����m�lڴ�p ׁ�cs�hc�As]�G�+y���������MΚ��Ѧk�&;x|��VH�[�?�����j�DW�p�!�K8Wy�<�M�{\�z�ե�q�V�~�6,�1�z�&��tM�e}���z}�O���i}����:��ނ���k�l���ރ���%��%�G�O���J����!�I���‡̇C�p":Sċ���$�ھL5s������
���i���/m�v>�|u�P���@B�
�f'Sf8l�yT�
�2H��Bu��b|_Κ�)���4��T�uc�*�tk)U�0SX��ƴ�lP�Z��U�LQQEj���+?D���]�"}IZss ܗr�خ���~#c�Kji:���1a���A8���AgljPf`.��F!���K]mZ�"-%���ؘ���3,���-�h
tJÈ)N�R0����0��S�&m%�6MFk�g�W<�a��*!�~=�P�@�OaJ�O�,1Ą>��b�����B��ME�i"f���_ylv�D!+����8,�a���[��Thz�����H40U�`�Gx)��f<h6c�%��=�y��gW���X�,88�c��*��
i��6@WLI�"LL�LE�,P��4R�g‹��y�%ɫAe���N�jrW���$dS8���m����tJ[r�5��]�����܈a�!g)\P-#������$`U]�h.x��T�H���<��,�P������nE��Sſ?W�6�;Z�9�%�y&K��0�7�c�\6�ӵ��CN�k"=$-�HiJ/�IJ�\��ób,��}"�a�!���V�}#��8�p�riU��V�W���v�.H@���h�u.��pot�v���Pntm���w�����p���T-2�����}�j���h
�h��Q�/�?r}S�jhcz�<�O|��9�O��̺�o�ɠ8�XҚ��;�C� �&pN��ٜt�T�f�#P�E�X�	�4
��=�Ņ�G$h��
R��=���ɒM�QF���meE��'Ik6���!�������}�uೣ^.�3�{� ?���a�~Xom4�AA��^J��U�EKS�ؖR�,ٟ�/pc�u�۳Z�t.#LԔ�QT��	��U�p���>1�X�)]��Sɜ�����Q��*��6�v<��
��:����'��
3I�w�YK��,]j=�/�������2��ؔ�!��iXA�ފg�޿CK��"�ZY��&$2��B��+&6�Ӆ�>x�jG��}i����`1�v�Q�J(�=�f�FH
��p�VgꚈFH�_�Z�6\0���abV
��������8)C��G�ut�V��Xj>v՘0w���:Y2N��r�+��f�55�����NИ�a#7��.O���sֵp�4�R"ނ�2_dx�
�
�\+u�.t�o�*�l���s��:��i�X��g�����RH�WX�޴��I�Ҽ=�0��U��Ki,���f��,9��1?&i0%dW�2�	-�Kq��mpNo�8�p��I��4��JO�g"
8�惠�lF�
�o���A��6��/�|�ߪ��gs\���“�9�0�����by�#R����c�~�ژ���#�>G�6��[K���!S�~ʎv������qގ�萰�8�
8��-T�ŝ���b>0�P�p.�,�>6j
|�eYW�_U~al����ei�
�[4m��@�Jyd��s�������wD�wY�Kt�T�����+�A.�#"T@8��F�T�;�p��rq����}��S*�u���f���Tn�����2��V��ׅ�u;2�i�<4p-����e�S�U�X
���<�K>���u>�u��s;��h�wݻP�W��o0�g2_(!�l��龄w"�r�;4��8Ot�q���]����ڰ�pY{N�ro�f�<v�/gؽ��x#c��e��:�p�t���`/�Aiy}�s�j���=��Czh[����j��_׈f����\x��z0�u�7J�U�׺ԉdz!��6�O���
�+�R�ӎ�0���/ϧ���%����;-�=.߭�Xո$�!��X�q�?Ɇq��(��ds<���[ܸyê:���P���)����!��CE�P]�~qݪtU���������j\�|�*A�LiO���W\9��2�՗�׻�e�RC �c�ӔRaͰt��s�ۉ#u��X�"��B&���(���\L�F�-A!*n�����jEL�ަ�T!r;�T棿�K���+��~D��r��$�ϗ��Y2C�t�d^֜:�ʦ|Mՠ��Y��u�'
����V��A�֠�Kn"k�2�bɎ�Ҷ�+��
IA���r���QG9���4d���|�}�2�r�q`�̄��b~�0�$���u�G|��H(e��/��"�����/��Ϸ2̀-�H�~b'&W��l���"����:�T�J�\��{�����XJ����y~ g�T�����S���?F��9�����^ٚ6�"�#;"B��e�((��1�� ��_3o�ں�X���omn*u�����R����լl�z�(oiV�6��em��6F�����~��z�y�|��~�Fu���@���a��jϔY�~.FykO��B�z*�_b>P�Ԟ.���^�|�u�Q�z2³3��zw�Թ�SV�a��F���^�ج���Q��DM��ݺ�9��C��UՅ�wL��R���=8n��V�=�e�R�����M���S���俿@C�pW!��W�Ǽ�k�$w�KL+S�9�B�k�?�vǧ���o,OC��w8Rឲ�gtwYtj���!5��K3�
�]��vK��M�S�n0%m1*ëj�.7�n���ު�ȌܸpY�3��Ak����c�G�Bg˾�c*+��Ծ`*|Xj�J8���StyZO����z(��]�{�?6Z��5˾)/8�g%*m��?��$��C�);֚�Tĺ�e1��,�~��J��>񃗿u��t���������i"J�0F�ż-y��X����Gu��˹A��Q�̬E
s'
kUB���#���O<w&�NI׉��9��\����
�����U��0TD�޺���W����z��6L�=\Mq��^?�Ĕ�!1�7�A�e�?�M���;�\ݪ�;���E��3WB.�/������IV����a�^أ*�ɈP&�"H�@��y:;S��BUA4҅wܠy:�ĘGg���	;Ɨؐ�.���Q��M1�=�`�1�㐬(��:��A�$O��,+(y�D
w"�!f���ǻY�z ��i�Q��Z�V���ZR�0=��~"%1L�Q�C���]���j	�r0�3
'�^�y<�r����}Ӯ��K���b[�Rj���7�%0��Fl�c��'R��L��
g�,~\#,cc�5;^�Z:z�<:jM��ͽ������o����G����HȊ�PxW_�[�$z�ǤrgX��B=d%�����HeR^E	Mwh�-�LY!��L��Lt�(S�-�%������VD#�\�#vm`��7���Xw�e�lmx0`1���傐x���I0*��8f�Z�I(�ͽ�ʨ�|�X��+ݑ.,iYIGu�"풢��7�+�>�l�|��Q�p~��&%��l��ҍ
=dm�6(��d\��.�V�����*���&q*�jY	Wn�n����5��:�v�"��͢Pq~5B<MӶ>i��3���l^�
ʢ���i���N[��DZNf��]�����3I���ނ�l���[�������)b�Y�@�4����=��sf�1�u��)��H�V85K����+$O��;a�	c�^�k0,�V�.�����,J�d��fO���x�r�D��B����9�3��M��G\ZZ��C��h<p���,I�2b��傁ʮ��~
y����ش��	�;|�S=7,�N%x52�6����\��)�aJ��{�T��<��#�%[���Y����3�iČ%i���Bdک}B�;J�z���V�f�ta��-����b�Sj�O,��|�:LȘ'��)!��fd����`�s��xtJA��+��{"M�p�T�ϼ���25�8d�+�6�	�|a�sϞ�N{�6���o�����njx>۵��$9,�,NB�
�PN)i�d�!g��b��s�&
���W�vH�SC.]s�� {���	�����,^���9�@\M���"0��Mh�NXw�u`׋j���;d��ev=�$]9��kA�P�.����Is�_�+��Q���Q	8�˻w�%]?P���-��Cj����j�~'�	8Յ�s<�G/w���������t�J���߶XB�����j��/M�t��(S��)����=�M�=�Sx���vD�8��~�)����o�tSf�+Y�{i�y,`�@KV�9��)����(:jA
�h=��_�i�o��F�$I=��@�S\�q����v�-?�%>
�^ۨ����af=A�I/�.^��cӀ�^^�G�n	�z� �9�&������2�"~l8E�0]H�f�VZ��)�~�2cLt�����`	.�5mKw�Y��������|l~�l���1�>x���Je��z��įj�ڭ�x9����ãi.���ژ���-��I/��+	-<��a�Y�`fk��LH�,zq��wY2;b�٣�y�X�;V2ƦY�!���$���.�!|\�;<7j�g�g<�6��N���FJ��mUwﱭ4�!ę��DQs-���N�r���C�/�8�!���w���O�#V�1�le�1��%���(Q�ҺG�x��L4�8�%�<O�������@��D�����v��p��_�zF��x��^�k��j����Ro�O����c�:Ec(�s��9��j=�c녘
��¢����8&��v\�ȗ��[�ֲ��c��`c�.�G��}�S\&"#��#QS��b����A�:�%��;k�	U�=?TӴ.]�;JY<��	�̲[~��ɞg��Ӊݙ�)��lT��cq�'J�+ŋ����L���>0�G�ͿЇ����
1E����.D(O��w�bM�Ϛ,�|dC���d�W:$���8�Ҙ�g�'��AGʇ�2�d[����
�z�r���^���_�ڔ*�ӣ���~�R4�$*�|
GY�P�9\j�o�Khi?R�@��쥛���0�����l|��X풺n�+�4�/��;��+C�hXp"9bi�y$�Q*�qq)O���N"���;kS��v�T9�h-~����NёpדV�x-��)�VnI�4`��]صl{QJ�]�`�z3�g(� /�`M�d�ӤE���4�?��c�fM�-Z]���m�vU���l�]��e��m۶���~g߳�~�����~�1c�9׈92#gf3����Y�Wɺ�o/�b�1��)2�%>w_�.����Hi?ūCZH�'�E+'�4��m�X�XU�y�iL������d��겖i�/*���3��bx��  �(���N���P�+m���jo�j�ߝ�d�,���lg�-�0�����p�%!
ҔC�8���I����p�jyTQޛ���R���}zb���n���`^��_��c��9H�7�;[+���~I~Y�R
����S-�D�c�.�����:;9���2z�Gr��������v�#��q�ռF+z��Z�u{��yDܷĕ��*>�k\�N��c�j
��9��1�ފ���
0.����o��CG�[O.��(C~Iv��;�w�V��.�,��<^�!�6��fO���F����*0�֫��fC��K�#���x�'�`[o��~?���\yښ\�@2������q��Bo�ثH#.j��]d�|���eO�<�Wۿ�ZPd/V���� b,��DGL�þl(Z5�jz#�jI�:A�ų��Y
���Z���<��HCL���m�[*��:������(�Q�	�EV��O�@��1ȀnO��z�i*H���p�
���8��e���N
e��oy�w#�kJ���#���L`�#i�2O�ǎy8|��أ=]������1fb�+����A#U4�^�6��sUV�]9�[0���G@�/��n�FB�����N���O�QP���1.�LI<���C���3䰯� �T���L*ing1]}*�B��˨��Ė�v:�Wš�l���U� `6} 1y�J�1�U�m��Mj��9�x��'�jA��C;`{��<bA���4动_���H	�_-7|�=s�َ�8cZ�(ݣ_�٣��Xx�	5���C�Y���*Y3���K[�k�:ĕ��L�
N�D��m�ղ�y��:#-f�C�^�!�`9�P5��@r4�����?�g�E�d��h^ȖoU>��Wn��1=�\�~��F��Bn
-�B
��[V�Nc:a�7�8��!k�Dp�<�F=pz���Z[����$(>
���+9JT�Ƅ��#X���"�`r|��W�U���B\h��=^˧��b�Z�����ޝ�t49����M��� ��CN);�0j�Ԑm������5�0X�X�%�5c�ʿ��oo���V_��SWd:��77˶�~���x�q6A����v���>q
�6�ָ^�t�똅Lv�ј�?Qm	��pSwq��x$�hb94h�(���ia0p
�r�
��V�~�z[��e�|*r~�cd ���}���E��+����v^��{�0S݋z�J��^|}���[J|0�yc2m�=��D�^�^F�tǗ��Qޖ�ʑ��?A6��d�b����j�O{�����z���{{~y�W��''���o�^���IJl�'{_Qķg��t�@$�F�W���5���G׾`��bpJ3���$�t��_'"-�C�����W[�5���C�����i�gQ˙>�QJQ(��i���%�uu,�W�)-��djVq��!�ܘK��)�{�Gߪ��1��$x��Y�����-��L��2�쯺�K͓B�xx/�fE^�Z��o�����Q�e���e�*�=�f�]v9����M��6@�*7�8��ޭ�[���|}���u!�-{d�~�A����j�"ۏ|�`k��tb@�‡��5.&�"ɸ�뉥3�o+�ZlR�iA�$��Hג���iűxE^�_��6�����k��i6��~p�㸩��"�Ғ���Uq��۹7W]�Z"�$�G9%f�Oa�N��2v'���W���:k��Y�1�Z�1c?��2�C�˺k������{R̰��t�j,��]G�U-���h���w�Q�|�'��no���z�r+<��w^xS�qn�͢���V�rwk`ĠM	$Pea��6:��30|�=1b��+���5�;?�p����\DM&�N3e4&5��9Q�x"7��V��(KnKD��A���MP��P�'�CS�Ca5LP�y�;���%����y2-yJL���BrP�C�;�H�ɉ���@Ʊ��}��3:$9G&&η2m�ћ�wA��
%�NI�Έ�݃��K�q�`/���Eo�&�sd?��(�������]�8=���N������`���L�Q۰G7����6c�.֡��ttѡk2@4��.�chkӗ�m8��q��Iw	�Y,bx��Y�X��yD��0����?�a>��.��vH%MM�����O߸w���}d�v䏭�B�"H�9$��=� ��Ɋq�A/9z�
|pdF��17R�>)�`�-�#"�<J�Eݷ��k�e��	Ѣ��Pbq>t�3Z�gZ��Š���8����vd�/��ZV��
��i��.�U�g�x3b��:�:
�s5�g����6T2��̅���%G����_������Z�t��U-i'2b��3�%�'�F���R�	��|fh��F�P�Z$Cڴ⭗��G.�"�Ǘ���'s�XZ�i�ˉgNB�ȉ��_��4q����Sg��Xl�:�v���i06�&׍fy"�k'�Y��U�?w�^)�R
����!�̰�BII����h�>瀍�ғG�����$gD�h�ƊK;�-:&��4�wlQ����# ven
O��8&�b=>��r=�^�3�D���0�P��W�B�GW�P)�7��۪��`p쵼~����iͤ�i8H����׺)@]��M=������qZ�#�T�Fe/��N;�3h�]`��6�oDlᨁ�\�H%O�'�iٕJf6U���ڿCD�yv�aJ{n�;W�b-�k�o��8����.�g��ݫyw�6-!�G����}1H80v�_��=%GI,9$�=����t��ޥ�q���H�\�]iO���3+���K,��|��@�2��q�޲����~�3��:m��k��6]��{eޙ��n�*{n~MD�(N��˶oc�XfW�[�$�`���75���Z�2�J����0�M��H���2'�I^�``?l',�6�7ɞA;ԧ>�_�R%����#�\�靵>TNdkJ{�񱒱|m�?Ե_�:��C,=W��]F7й
��t�Q����|h���|�
j�cE��޳GA
�E`t"�s�c�:]�d~�]
��_��O�܀������i��K��_�r0���S�� ��(�{�|���3|x"X$݂%�+�,�d�ȃm�l.NB��B�����J�_�q'�:�f]�-@�%C)Q̛����AX������?�w�,�������G:���n�+>��_��@������e��=;`�7\"�(49Gm@���%`�D�)�e֜c,�d�8E���]��J��C�UG�q@Ƒޘ�ӟ�"�cL�l�v_حO�h�k.�v��r�D8x-�X��5q(���|ب����zq�#e�1J���G���؝A� 8}�+J���0����w�Uc�?#�L�K���T���A���+���AA@���i��%LMM����7A��DF�o��K2Jk	/0��+x��Y -����Lw
��0�)8b���!�Kh��j�I�``z��x�yf����]�a�l���x�"s�ꐀ��DXJ`�Vz)�3�yk�qN���y���j=X���ۦ�M�i����թ�xj���M��zI<��c��g]h���N�d�I�����S�j��;nB6�u؟�Ă}��jiG����pޢXe�ҥ���D&�c�Vځ�&=�O��2��=J����v����|墳�"���+:��k�V�}g%��7�hn�^�ep/K���Et�Y��U�������"T�{S�{*��'-a��a��~�Dk�B�~���Ј(�'��bq�tf_A�c��H<����Zs%���r�*�e������b)�9�U��z�z�6��:<�/��J����TA0މ��G��1��)Ia$.꟢S.{�����,�&�x�0�⹊�C�qX�~h�1{�˙Ў*�]���B+�1�ʉ��Jz�k�<D"���A�Ռ6�F1c��Z��P����e�֑��PI�^�o�t睈��z!.��N���8��d�VȜ�Vw���U���T��F�(ԯr��oCƏ9D�dU?GP�6i�%%���Gȝ��"���6&FP������Sn�	�=��r\���Zp��>��썁.�N�;�7����33��e29���+/$[��	ˤЕA�v�Ԥ�7��}��B�B�*��5K/$�4��xLO������j��r�U���D9���^K$
�*`���u ��#�PS@T���
�}:bs� R�l�zu-��K��q��6<�ֵ�L��Ľ}�[��[�q��~R^CM,|t�m>e�*�{�m��V�q�w���� �6V��˺6��BJ@F��E(��=���i�&��k���t��!��Y{��K���z�����j_��H0h��n��ak�ҭbi��꾅a�6��az�I��<v	D�	�I�a����H���h%&��:�S�X�G��\��YM81��}��$^��BS�T����*��i[�����6K�n��	٠!k	���{eބ��|�_[��bV�
&�H�;�J�#p�r�U�9�l�hY�M%yJ�B�zt	����L)�}�D���@���=G� {^r�krR]�tN�)��+<������iU�y��Q��ҋ՗�R�b�Qj�eT�yy"�ݨƷ$7o�g,�����S���2�*0�����=My9eS��^��Ҵ4T]���N�d�D�	F�理V��L��6(�[wH��=9��I�ZO���nE��
�YOf)'�Ȑ�0�>T��aa{�];��)g&+�$y�u��<�6�5s86�
ʤ�{,��{�5<���f�5=��}*f^ێ6����'-Lx#�;܏2��H,K�A��A��
��t��'!�7��x��g*�����{oP,ˑn���{費z�WAn�v��G햟R�#��;7�p7��3\�@���#(�3��i��650�ʃ冋SP������x�(���F>s�xi@���+l�)g����`�e�	���C.�'7L�-��W-��c1�Ӕ߻W�<w���a߷'�o��'�?ġ�Zh��kmWp�~�Z%�giU�Z���y#j���n�����}�Y�����-s�T��F�l~���i�~��L�"
�5�qfx�Dز'�̙I�5��!$!$�!��Oi��"4lp�Ъ�;��t��KZUߘ۾~�] �h>�q�"�2�_%��ߒ6�Ħp5j^7�-�ԉ�B�������eg\�k*E�ѐ��*d�Rõ�v��u��H���gױ�ßfKN�An^&Qm-�Bky
;�(��y������G39z�ֺ�@�����Z���97�P���6#��5'�e>|�x1��/���9��0��'�e��h�#���d��a���۬C�t�A1��T�Z�WhBi�c�@�2"sK�����Q�Bpq�J�lB�
qrh8c�{��$�1���ɌS�fM9'�ǘ*�Bq�h��<��w��nD�B�G��N�y�Z�4�lp��
��k��H�U�S��[���V�
��8��IS���AU�І��Eah��UB��VJ TK�Zw�$�b(-ĉ�h��X^:�h6�(FU5vUҶ����2�g�Y�-��~[��M�6�{�k���D�U
���.y]�ɌT�z�~��D�2ݲlH���UD��N_��l5�VM7�r�S9B�b��7B(}�
�***��f��zbSk2������)��tf5l�2��. �(�DgE���79'-0o���'V�v���y���f��'�8t=���m�T݅���O-Y��ީS��T�Ӊ��d���{9�t��"���7�s�o\w�0,����5};�D�Q�����J0ր(,R9MM�w�8kR��i�(s|�\"C<&#���v�H��[7�:�@,��E�Y_NQ#$)���,
�6j�qB �����b�,�����O��K���.�ڏY.`����i�9�Hx
����K�/|��M������Mb`�!"9�Mb©��2bDQ�4&���ި�9�ꃃ�d�ꋝ�Ee�a[��!�8�u+"M��hdaœ+��e��*U�5����D]mZ���L26?���*2���>��k�#^$Q16EKc�ے���b�����N��(w��k��X���v#��p����<�3-��'v�.b���R4��-B��kuV@N�P�����=CN�����n'�2MҤ4
<)���"L�Y �����a�)Flp���B���)'q��%�0
��B_��}-�sw{jeuN"v�j-EG
��9Z�.y�p�<�9��,��Y
N����r2�9B?���v��&����>
��
���Ls+:�S�ƫ�̂�9΋^���/o��Z��N�
����1|��Y/UUEI˻��G,�����l����ʃ��l�n0�_���'"J�/`��n.�AW>]�o�̪�G��=�>e��b����+[���b5'�I����Ym],�|�^mml�hkN���C�*��]��?K�Ộhp�{rr��ڣUi����!�F�1�D
w�{D���C���5�h��*Ǣ]m�X	pT膙�$eꗹE
�yS��$��sݤ��I������M�K���1Z9b��s�d��v��#�:��¹�c=�<��ܪd*݋ݹ$t-���ؓ��,k���C���[�۳ݨ���[��m��i}>&i�ޤ�s�D%�g����$���ӃA���anE�M�@w�O=����ȭ��Rf�(^��&$wc�g#v0�-Š_�5`^	�P$!��=�,���YJ��?�Z��!���pmM^H��	ς�m����Mfg�&���.,��=�f_q���o!}{��E��9�'��7vɣd�`��!�4��&�֑r�v��}$H|����{���3O�#�]��x)���=�/u:�[�אB�ˌ���v)I�w��ƀ;��V�����mDo+��&N@�KHl)X@]4L?$��F)ѩ"�w5ԉ��DPd,�L�7b�������eRCAEu =��v�4��a��r}6/��&�H�>��?u��� �5�V�-5bGf
7��`��K�KM~"ِ�u4�dw���8�L�,΄s)�K(ق�f��8@�v;�wD�  +�P�F�L3���%ǐq���J����‚�K�\\������;ss�E飑6��2"q3����(l5=ŏ=��'��H8�I��|�@
�4j�b�����g�I��0�N:�Ӿ�gBpjF�S�k�r��R�I[�tNօ�7_M��~@�(A�h�ˮ�zEL�Ylf��`�	
�#��-�����}ڃ)jdq�7���ĜEJy�~	0Sn��ȇ���nrP��G�)�¸%��m��67��Y	���6�aG9�:�5��ua�C<Ax�#��Iɮ�O��aL����+���p'�+�%��
����|��{��BY�����B)D��E76qd��5m��>�ѽ݂w�#�a�WQҋz��x�n��oݠ(S�qSv+S��d��1Z�ªO����*)�a�����~�����`
�Q�ќќ
��Mf/i(>w�öF�Ѫn��{]�������,���}�;�>8��� ��"�!_M�����!7�̲��H��9r��(Z��!���T��uJu̬�
�k�g�L����F�
�:/=L�)�H�F~��g�A|��u9�,�kT%����1�ر!<|�w�m���{s���=�S��ɒ/d�
�y��{�"��b^/E��鮟M�b{ě�%�{��><舥��WXU'�٩y���ET۱�t�9�;C��_�]�V�<yS��=t���<0sR� <��S_���0�'>BT�1����#EZ�3gC���Qht(j�Ģ|D^��Z�n㥃���Bhq�CԞ$�m�xE�G-��0��|�#��2}J|�3gn�Y��D��]�zM
�e��|Ոcu��Z�9,������-	��Fb���T���C�����h  ������������*�\�?^��N+ְv�U����u>qD[oR�ژ�T��(�E%��]HĒ!#�-蟚�g�5���|�Q�B����	=E�Cs���	s�!f��R.��`��z�>ݕ,�lkp�������
%�j��܃?�tty��tI\�
ȣ:�HH�#��3j��"��N���!��=YflL�V���Q�V�H���,��4��X�_��FV��W�B�j��pW�5z,wiƔ���4d�7��2�j�\�F.��_29�����ԫ��'O�%��dv8�jy9F� lR�MSq�ꕺ��9%����&0ty/�־�~��-\�ff��T!�0g�wЂ�.��z93A�-�L�XC�n)�eom�TP�f�|q_{k��ۺ�]�(�}c{���ֽ{�+͛�zz�kF�!աzz��6QN���t�D���W��6^�kjd���G�S
w}�1	�%����7�q9��x^��F��mG��^!r��f|m<~�&�;R��p�Ua��s�+�4'�U�X,h�yvu��*v)ن��7.�%	-g�a��aw|��|���>����h͖,@�K2�:���g�~�l�dj�H4/G���Q��lО�wſ�T��-dԡ�
[��=��� �>��Ѹ4���>��f�L�dK�#����{����u�k�~YU�p���R��E���7���r�>6�\yt��K���1ഌ�ָ0�Ce
_��eanǔ�^j3���)�&�i��	�W��~�G�O��o�B����'w�
2υ5Ex;�F��S�������?�F���G�h�3���#/��Ǫ�
���\2��n�10�]���G����:-(���)�}��1lq��a�AJ����M���C�y���3���z�k�Sr}�c_] ��aK� `L�P
�#�d�_��Bc<�Վ�xĘ0�����s'�G2�;��g��d��i,�.OF��	 �2]��OetJ�M6�W��X�=�64�z+5�8Z�U[9,TZS�,3�k�L{V閸vzEZn���\���4un(ѐ{
R�J�u���(R��4��4���=~�df<Z�o���"s��o.8�6���$�.��>bG�46,Z�~�鹁X��师����'6M��A��[�֎�����(c�o54�gV`̟,�މ�ϧ@)n�~5�e�ٱ���M�I�d������F�WDE�*�y�
︳�K0�۸���ja���^�p6of93�ek='�n29 ��Fk��Т� �X�ź9��t�͎q���[���u�d��t�d�U�s0��;��C����67l溱qB� |2U���$����F���Î��;k�r���� z�ַ�_h��$� ��5���o����;c����}Օm%�TVa�D�V#�ġ��-�ޅP����r��w�J��
UfaI�����]�&(�4ڰ4�҄��N�b&�%+!e�Q�͙>��$��If@l����A���٩��)mZM��&'����{${P���[,�9X������)�
Jo�i�~�$�&H%�D�8K0QJװ?7G�Y�"��T#c!^[A[ZG�G�����t@��3dŇg�O��UZ�H���d���.i�������x^�6�	@���u���F%Y	:🬒���2\�ͤqƯ�#<&1�'�H�#�4��4S�IӀ�~��	��w�S�r���^Iצ����8؀����,VI���3:j����.�֞��VӞ˼/�!)M�SZ�����!-���[z.�
�铋#��]���J�}�X�Կz�o�,��j���;ŽՊR̀�n�d��O�'�����E�W�O\���~��/��T�p��	>�=��}:>�D�û����!7>RJ��ʮg=cx�]A+!cԗ�8_��n�w�}�����_��!�!��rK٨�Zm��5CwH�������87VQw9n|����-�o��������-�Pf�EV ť6h�@Q��h���"�Bʔ�wAJ�q�.!���q����\!�Y�*<���<�}�["���X-$��<J�"e5ei��Wl.�R�oB���g̯Uɤ�<�19��ݩ"��*�Po_��抢TQ���tU��M�u��,y�l�܃ѕ��?R�~�b[Lǰ9;��i#,���8�c�e}:&�����U���i��ej����D�<#AR�<y(�;_�:��!ɟ,0�R0F�z�z]6ԟ�b(��z�'&�샹��8s�;6��`.H١z�[:�=-Te���а8/µ��-P��ҶjzJ!d����v�1l��u;�br�O�v��&���x��i�
�*�r�U@+��R��ۖ�ۖ<f�!\EU�Q�w�E �'Ý2��EJ�0R���S?h�YȸN�i������:ޱi�{,iHѻ��.�F�T$|��z^�9� �p��� �H����4qGЂ̓�A���GÄ��.�,2�}�z���?�6c/k!�$�89�t�񃚑���_M��tUj� �[$���/B��!����?����%���(.e�����}�_������i��)��'ɑ9�9��+i�0�$�q�*�;٩�3�Y�X?X������HA�H�"	`B=6Jgf�x7�(�2C56E-EG�@?Ϩ�09!KO��B�ZW���� ����"�����a�O_
/,�_HEƌ_.�s*�l.��&��0�
��������dΒ��@�of�E�h���A���BD��G���G�8�ױtm�X�C�?��o��*�!�	!��R�"��r�β�B�֭˫-�\���$�� ���mg�w�O^��DP������@�q�Q�{�'S�U1�L<�vP�+������I���(%Ï�hjf�CO=�犥�
�gw^U�����oe���S�F����k�Z���Ρ�5�s_���q!wP<�﫦mo�G\�=1zQJ��A@��*���؝,\�L��s_(%�[Q��ud�͝���2*� 	8�=YI�(�Y0Yf�|CT�67bdҢ�N�5y}}u9�H,�xDu���}���a�\�-�|izw	k�#�,��m����w�˛�_����M-��g��Q"�r�@4�K�/��s��9��vB�?�Z��s�����VV#��s�85휪!����~0�z�u�Ή�n�y��bĽ�u�o��wZ�ʺY4�\�~@��=׷to��_�H=K�6�	�	�AS�e�@�X�>�!�5?: �dY��<oO��-pQn�+8��D77|��s��E7#�꼓��KiE�ŵ|�!�㟔!G��
+�m
y��JM
���Q��IT�`��qm���z�MD���z���JJ~A?��̪R	L���^1���E�Q_ť'���DC��K6̃���&����H�=H�.�	$�^�ؤ�~R=S��L�����X0! �\�B��E�הQ�dVtb�"΀5�U%�ĉM��	1adD�Io�aU��NGndg�~�@��V�w�]��!d=0I0ש��=�2:�6	2�.��%�d��Gz3@�@���	�I`�ݱSz$�ˠ�Z�J��	�!G;�*�&���������O�ZLcc�8����;�+LQ�|��q�X�9HU�6HY/>�[��f(J`2�VM���uL[bjl"Ƥ�cٛ�S]Y2‘A< �+��K4͖ݱ�my�hHs��A{��x`sbtn��;k'�ד0���^B����mㄫ{
�£�b��w�i���xe��\6
�Z��,8i�\��01�������^Tc�)+
�!���	h�a
���1V���gD$&�h����^��b�J�}us��ih:�m�(e��\���9q�#��b�m�Irr�>���^�Ce���/�|���4�op�?��g��WD�ّ�L�?h^�%ef��c
���1
���fO�&c���#ͨ �
K5?��s�S��NF���y�
�gB���?�j�<��+���Ո#�w�zʛ���,ܟ67��\���R�H�����q􀻉�q�D��A��l|�ܿ�? �;d�Mq�@Iw~��Yޓ]J�+�`�u����o���oR�uQ���,���:$�E2)S�󔞅�,�W��p����u�S@ճbG�~�
U-V[S7��Xŝz��d+��8=�L��U}�m+lj��a����^�f���u���}��/p��]4/��i�˳%����%��+�;i�HG�>w��z(�y"����8so��SH^�P�a�m¿�	��>��&�]�A�>S�a�>��z!U��b��!��Y�Qխ�~>э�{*�|)uKvw�9�H�]'����Z6���V6����^�ʐ�����k�>�Žg*�i=�_4鑶� ڏ�`��e�~;ۉ�{i� �ۤ�����S�<7�������5f�n��R�p�\�&}��_f֩�#��t�?C�,M���ޗ�2�N���e'6=��<C����/8ʱc�����Z6lY�*�m�l���iD��%fI	跎���j���T���7��֖����bI��(��\�E�;N��O(Jƞ��P?�2�+\>��n��/dWe�#8���&Cb�8t�AY��d|���p�k�\<�2�j_d��Tr۪��o�Br�<Ӳä��Wy!δ1�4y��:��Qpx9)5r6�n��h���q�� ��v��0��~u�c�q<�`���5p|�2'�b��3�	��!�ݚ��x�2A��ݓiQ����Iy/}u���<qV���+��޸�X;������d��e��&��&��4����A7��@�=�+� �栞4��)8��3�`[����o9B������^�9zS�rA�G�ޮ�|���u��1�3����	���K��t�ul���eaD��~��l�U�!`Y�%��K�%�W�O�?��H`Ї�ʳ=H��+�wr�x�*�C�d0�]�����GX�3�l�֊�� 5����ݖ���t�V�x{�R���d)i'��:�C#j����U���3�
wgV������tG�K��m\sǫ��+���k�:KwuW�΂�-�-���vg�/���;Zp�/č�w,��(���vw��.��_���.�o]� ����v4Pn��m)�Or>00&h���Q��S[v�?�p�O��2*y�3a��/�ѽ��[�8!�.=���2죳{|Z<&��L�n�t�����D��OX���_��l`��<iD?8���\y�Uk�+~�y^�3��ޖ���}�{y'�����+
�4�Z���	jWi*.e��˨1V�wͭ�!%��\v��
���pBZM��������+u85�x�.e��Sr���S��CK7~����yu} q�&L�A�ى.�c�ư2����AmRF��w�cU�l
��е�R�w|�U�R�+��D�(]�[pq,�9�r����rT���%���nB����`"|����l��B̪��lx�DU�9r�>�*�e"������{�r)�t�p�5�M
!��]6��BZ��#��BF
CR��e(�V���{�CQ�9�e�9Ŕ�BQ�R
�4��k�o�8�)c�Z+�)
�E�yP)�*�<Is�b��tԒ�<�kb��9�JP��9�e�9Y�*Z�ZE�K�}<��)�
�y�%Q���EP�j�$e���s�3e��߼���z^M"G�<Es\�VJb�e�8�S%�<���zM��*�e�)E�T�bc�VE�cɕ���ze`�oEn��|B�"���
��K�<e<Ra���@נ��u�"R/	=J|��"�%�3n���NQ��q)�2Q0�i�Ҵ|X��$�ixV��Yr`�2
zh{p>�L��>VT#$?��3F4,$X���N����O��ŲB����Ӂ��1:���`�B���w��2�h�`E]����aD�g�T�����mL��j0�(��&6j�%hQ�~�&6bx|�PXQa`�4Vf�qp�p�~
V��Vx���F�#
�?�<
gb��O�Wcr��Zg�	ίcr��⡁�����C-r�\�*�Т���qL���U��i�NfT}��&�L�������\Աp0C�`E���b�C�r�_���+Lt�P����!���_}��3�Q�����i�����WLgR%�
�'�����"W,fB��Ui,:�)8Q��Yb�?�Y�`� ���[-�x(���[�,6�BNT2$�h!�#
��ɔ�Wh�^!�~@*i,�P��| <>Z��?��R-j���?H��2-û‰B��	��A��$�G�p<@:?IG�f��R\��g
�+�/D�	q��.�t����ߥ���=N�a(�g|C��Q+l*W��u�c�m�1c�L�xE��$B2X����A��{�d�@32�O�R�����_:f��4�E6.G&���
=�n�m�x_��z@=6�8ڄ��å���*������\�{�����<����栄������ �b��
�~n�
�P�Av,ӽo�N�-�כJ*K�]!@@`����1�[�hj��[S���!2*TῊ���i�E��B���lJ��J.��"w^^C��bO��	�i�:ߏ;~��"��{�Ȝ����n�u7��L���:)5��ӠY���.��HQz�h���h���)�4����Ä���oU��P��R0rR����v�S
5�Lt!g�,L��'����4b��#�h�:�ϱ�|:r�X�yc��<�y�ݨ#�P!����u���=<n�����g�\^#P\TO�
����a�
�K�j�T ��X�ml��|S&\��A�|��Qgs3��V����#;���ݛ�4 ���k��U��]ZBc�Y^v�גq5�:�U�A�O��yya���T���v��`�Ha��R#�DE��	i�S=Q�q��{po��@q�s��N#�MW�jlw�>�,óDg��h��Y�(�y�
��|)iz
�+c�~�q��m�Ełv#Vi�?=�
k@:��C6k�7u�T'�k���CNy�)�Mn79pGPG��17T��|O-k���L�ԍ�3���3"	g�g���f�? 5��T�h	{�4���+�	�O8���-���-�i`1i���-w	�����Bw���w�X�1q���"Xr���}���?�rF����7}(颚4.B�����s���h�q���������rH��4�U���:�6H����F<(EfU��
#�E:ʧg���M�{�`�hb�7�\+�+��4���Ve��W�3��r.M$F㕇[��+�=�O<����E��a%d��MJ�7�k��U�xR���d�},��`��"g���c��:�b9��lcF��p�FXP=ɕ0�G�"[y+Z�t%�].��e�kD���_������s�Ԓ�P���zt�/���C��8uu��Y��{�$L�������k��:�Ӕ����veq��K���e��L%"�"]������I/%SO�g7B�>�m�Z�
 q��K����eh���2��3��p��p�9W��UN�Z2H�
P���K�j�4Ķ�Υߤ�7����wq�x�	khE�:g��w��.a����Ը85�� �_�C�av!q�樘B�I,�)=����<�)$�0�W��n�S���Q�tq�����{e8�}$�mK�gj��@W�d�Il�����u��/VM�(o+�g��OH�ؗ�0��$�Iw�P�#�����U�mn.x���L<LXLG���Z��|�!��I�+N}ݞ����\��O{�m)�i��h�_ݴv�@[�����$q/"n8�k��	�e򎅒��țє`����$�q�^ώ|"�ou��䌿�t�Ʊ���0�/�"��x,o�/�Gٽ�!�������A@�A@h�'�v�1�/佣��������xMV:Ī�%�P����|I*_>�B1D��Zв!��n�=7�}���Ix�1��A��ٶpV�m۶]i;�M۶mۨ�m۶mۮo�9'�>�o���s�X�"��|�S�K��w�I}Vz���[�>����_�{n�[�j
8�]�[cI0%lJ��Cl$�In��٪� �
��.(]��讅�c[|�:ޅ�"8��#��ݨ*4��乛�V���qtQ dV$�{�:�3�=������8��2�TќG>И�ԫ{߼�(K�;-��\�$�Bl6��#�]�h�\1ϥ�Q����2_uF��d��TxHUvR.���ېO�xg�xr\��	ބ���X:S����3�?})AE�z��e��q8z�,Wh�]xٿ*W�Ċ�ΰtDsD�6}��6�8
�k�V6�Up�pZ�1���
�b�-�P���1W�	}M�iX���3�i���/�D�WC��R��p0�œ@:�p�Y�������l�.���Q��W�#떯��Ҳ��K�n�1�/X,�T��as{���$+���/o��D:�՝�=
C
�Qn]i��~tm�O��v��IO�[�v���[��X����#9$0�t@wΎF��F�V8:G6��Y���tA�[a��W��c�E��(XL[�#��C��8�8�"sy�$3j�z'�o��T����f�.���	O���A��u�d��O�,��sWj&�4�P�#�>{��R"3�s�E{���P`��wE��*��sS�k�D4`\-V������މQ��,�H�o�19� �B�V�Ȋ]��V�Hz�t�q�4A�;���b����dt�R�}l�э�\j\��n��K�$���{��}PQ����zD�R������*��ۏu#��_ʯ�3�M���=d.vDU�y������$yl�#�%�W��{�F����)�����x�R�p:�C��H�����,�� 3�Ǡ0q�!ܓ\#[�$��<Rx�^�#b#D%���]�hԯ1J���'nA9�v��	��BD��|'y�(�q��˂������|dg=��v�[<��w;�a�喝�P����4���ť��G*>5o�_�O�`$o�����g���"*XQF���m�B���V�A�#T�N\R��5��ڪr�vM�N�K����Ǘ�!�%�۶W������>�.�K�ݭ�M�~Wd{dH$��^CD�ڪ�3���ѯ�z^��uԯ0�%H�E�2�;�9�dD��wbޘjጱ�A����j�b��52����)��k��u�Q���3�c6�L�P�|�{����Q'�bߏ<7/�q�Ǻ1{���<���?�{��h���ZVɵ���O�G�T�s��<�3��L�AÆ�/2��H=�okDO��!�-�_Aɘ�
��q��Ѻ�&�XA�A�?��
@c�#Ϡb9�=/ȏ)�V�Q�?Zp
��[��™��~���m�	���5�h�a��\��
{�Rk�̫\g��g�64�m���n�c[��N���9�)�C�?�v�7u��������¿�Q�mC��!`gge��?��rR�t�GK��	Ӎ�4B-\X\2���x�� ��_��	�Fz)��U�Ζ���h�K�q��MȌKWd��U��y�fg�+��v�Dw�����l�f�k��6���� ���:,��x�r|�������m���w���:&+��|���1_:��?pW��=Խ$FREn�p�#.���"b2�6i4����8H㪬^2���3�X���6��;�#��J�:4�:�8�v-�Rv���Kw2ꅇ̕{|��vj���b,^�Gn�F�|4G���R�nN݄G\��yqwR�|(�b�9�J�|�b��>�Gtx�ɝy��K����ag,�d�p�/%(��K�5�Lk�p��UZ���v����`�e��|�8�x*����*+����j)QX5���M��j��%�*�1�!���ï�|ø�ه�������0���΍j����YD*����9U�4�O��1Ε��6`�&R�xQ$V�E�樁c�Bs9I��s���V��|��a	)z�\с�:�y�xI"U�PL/,�;��Dm�%NM�4h!o�QfM�9>w����7��H��<�����͚�
v|q�Y�;�:�����L��M���Ϗa�F�6gv��&��Υݤ������;	/#F��D�Ux�4ĀF^�P?� �&���Co�$�K<<Œ�A~tJ�SӪ�%p�tD1ٜ�`$�Y��fd�~���=S�*���w����4\ȡ������L��Άq��G3O��
��UDMw�Yi};�5�B(�4�K���Ϗ
�v�,[�G�f��m��m�W��3A�w��O�S]SsU�Zo�v����c���Ao��-�+�E�4���k JF�?�	�Y��67�i����F�p�w?��_�j<íig>���L���9�<㭪�-���m����{Z��-ضQcá����P��+w�}��ۧa�������6ۭ��Do�~0�t����y���ƕ^n�2��c��1z�s�@�����u��Rļch��0�H�Ŕ4�h���"���4�[S*?���2��RDQ�9iK�!�{��ѽ�T�p�q��^?�dF#­Ÿ�^,�A�ˈ�r����3~x���rq����ְ�o6+Ŵ�jk���F]�H�A��a�:I_�Md�=������z[	K�7�a�����Me�щ���B�M���x�#zY���.�į�dk��[��Q|��1
|����B�Gi2��Ƃ!Y�߫[V�N�8�H�P7Z���H�ecw��Na�D<m��&���d��
��KA�wU������5k��j�Յ�=�(Zo*o����&n���U�j��M#�Q�J�1�~m�?tև���ATk�8��H�MY�)׀�����Dl��\�k�=�3/Trj��S�}E���%Nz���Z���/��-�t����NI�l]�����X\;�a
�n=���D�w���Ia���js��v�ۍ��j|ȋVeP�Mܱ$��L�qL1q���� �~����}�T�k��ڒ��R�j�JiƮo��5لr�A���N��Rt�p���"�k�"������sߦ��,YQ\������)8w̛��յv����ӧ#.�fڃ���t��9%y5ƃ-��%֑�O�rweP6��>\=\�`� /Þ�/�a��3���mqQ�k��=�o����tqGʓ�lq#6U���{r��\q<�����{].�1%�ɍf�t�I��5��}=�@�3kLs��>)�
g�Fp�o�h��7ُ=O��Wz�)��(��*Qn+NOH�=(n�v
i}��bnr�BSI���	������5LW�X{�v�a��v��|.EMG�s�`)��*G(Qzt
�:.�TU4a�h'���(��P��~\���&�ޏ��N��^��R�@�(i�69<f���>rxJ��%��G���P�Chsy�?3�Ш>�7�$Hۢ�FJ��$L��B2ӻ�X�1te�܋ipD���?�Kϕ�R將�:��<�X������� y$��b�1b��byZ��,=�L�0����'i�3�:���a����$�lj7ឈ������`���[(�W�~�/Ҟ(�;6%��D�}X�؛}P�S:2:7��E�Lu��-Ik����2L<���;��
��y�d��7F/|R��a�iz�<0�i:�][���r�qt��!��2e@wl��B��Α�gH͍�™���C��h=��c���eV}���g�D,ȟ2�#O���u��5u^{��6���i���{��V�GI�	�dC�����g�!(K�t�h��3��i���x
�YҒsa���s�4<j	�wu�sL,�r�����F׷���E�D)�l��蹍����XӢ���jn�>���<��@N��Ȱ�">�$|˰
Xa�
.D�E"����h�DC	���rOe��2*y)����+�k�	�|�.�3SL��-�{�����񝼒Z���&�r�*��9�J�ri�E�jS��Rق2��J�|.[�S������A��Y���m���P�t��]Ik���<�+��#�Gm��
��!:&Gb	��
�oސkɓLBMu�:C��we�������g��L��#�6ndm<���e]�>$�p�%��$t�\������EBm�	$�ok����w4w06����`��y��k��b��<����f<�+�2X� N��(-������kqw3��gAԉ�yZù��˶c�M�Öϟ�7j?N�x�nlSy�܊���Y��LuP��)V�c��(l(��V��@�Mx�����c�ӌlm��H�2���1-�XՋ4�u;�
�
��u�3�Ŋ��w��PE�]��V���}5Gx��O�u�!�J��:C(�
(L�6/+B*��$��ә��B(�[����濌AagW���Zy�Ω���l�g���z��Z�%n�V�\��r�� �\`��sA[ّ�@������BC�OXL#��=Fku�;�H�;��(��(��ʼ T����r}�T���5����ofې��X#��&��ߧ�6A1R]=K���	I���,������3p��5��Ah�!l��h���V��g�R�y=:Y>1,_�0�X�E���6�$`�`9��C�_�"ԴP����Y�?؄�ȁ���T}&qhZM$k���$]ȳ���%Ȉ�|Úw�W�țI`J�B��b�S����&>7
�cg�	��a J�G,x�C:�i���6;���w٘M����6���d��e�'�䊑�Z矠p}ϔ�%�S5�4#�!]05�ۉHG)Ck�@�䪾��2gZ���8?�5���ߔ�{��-�N<�W�o�o��7�m����[�! ���s]y���
�1��<�DW�&+�k4tkj�4�⍻|Ԅ$�H;��4�#�r�7199f�����r���\��
�N�i�B[���Tg�����u�a���I\S��	��8WѺ��C=^1��ܰL�!	{�������;j���T��I�����ŝ�S�\Y1V�_�FYdS��	l�g��p�Y1&D�D�5��J鮆�3�N���(�a��޳�d����:rMQ��1R3�R�6G�Q��	�sHٝK��w���-׍WH�o�p��cK����/��d�C�C��X��ԏV��H�Mx�M$�di)͒%���o�b;�t�z�Bxn?��e�ia��R2�W��1T)���LR6���]�{V��-a��
>���OYO�R���p��h�g�ն��M��[���SV�����k�=-�S�
q����΀��!�����o'�7�����
��Px���9@��Y��A������<�c̀�$��!�G�_�����~���1��q���z�s��k�(�Ы�(hұ��lm���@}*j�����~�����of�(���mf�O$�b;�
%��aI���9���~̄|������f!���q�&Z_��&|�K�H*y�{vH_�x��Aq�EƔB+e�2�J4;��5�lWB��G��1�8�%��c+u �x�X�5�tVa�1�j`��"nw���hw��;tR�\�E��!ǵ
=�~E����"�N$N5�k4����_!�m�)]��%�J�m�X�}xx�IZ�aV�{�O7�%�ƨ�
]�{�zK��W�m���E�_�؍ ��5Bt�[T��#��N��wB�Z�A�Y�[��wO*�y�h���$����[N�챿�;��+�����š�_�/[G�Yl�hk��v�Q����W	ޙ[	��-�8�#�|�Kv*	iSLhýdy���R�``�a��`L�k��H�*q;���<�Z2
�yܴ�6I2!�w���41�Rr!����	y����3Z#r�8��'.�U�־/��N+n8G�Ҟ��:Q�N3���^�Ml�(��錻f��R�:��
�ý�R��?E�Tz����3?Hډ�6�8.
F�S�-�j}{�'x^�-���O�’,�����BS;F~�ٗB�Jy�J+���$��Eky�$f�=xXAv�@�Zс
yc�<𮤳���J���Ċ/2>��߻2׿�m��[V*kͽR�M�jf�������!�d���=h<(�#3=>��݁y��"�z���P�wk��[
�Mk��&S��D��(�d�.�d�m %J@��)��K��SBn9m.���j���L"�������"Y��CP�j��O	�Fy$2����q����X�F��'�/[�ל�f"ox�z��X0�y�3­Y�GkntA���$�Y�;����ĵG2�����c�G({5GC�F�
x=TR��4D݀(*Ί~)���zOu /!<���z/� �л�Nڀ�;\�O��Л�kX�l�m~��P�ۖ�[b�׺�N
z��H�N�>���f_�	��]\B71�oe�o����[���`���K�o�����W�OK�?d�:0;į�%Zo5���!���VC�7�A�%�.�/ԓf2��쏇��w��c,�������Ik�碆��lIN��~l���Rx!Y@�s�2Q�N��v�f_�����La��6y�v����e;s�&���λ#oxe��`z��w�=��Z���qV�`e{�/]��j��ו�l�#ӝ��;��l�8}�w[4Q�K�
&�D��xa{�T�H��!��ip.gb8~�+~���~�B&�)��T��r���…�B�ƉF-M�l�+'�#�C��$��v�0�(v���/�k�5J
GQ���_�L��o�X�`���umq�N�w��J�Vv�<�]m'�؞�&���*��&��^�䯗0�3m�9��8��v��-}�)Ms�I�΄\�錗�Ŗ�g)m"�'�G�s�;r���ș7wg��ro��Ej�������΅ßkg��������t��I��}W�0 �x�n� ��I�R���n���"g�1C�ƃr�3��a%=ܰF-_V��w]�j~p��=|v9c�Ԟؑ��Ar����,$�y��9M�M魬>o��v�₻L�m�a^�?��t�t���n�t����N"%�(�An�m�](�89�iPol�Y� �!�o%�������vr���(�ٰp6q�I��� �P�>v4l�"�ԮBaD���=�-z	�=Y�e��QN�K~�U㊌Zi�8��b��R;��˻:V�|�*�^ Y�4�"]�y�n�D����\�4�\I�K����(>Z��b���>�oE�����hNU�I���D�0-:ĸ�7Ca�m:�:��[�D$�@��K����a�d������I��տ���g��mLƷ�=�^,���ێ�Z�*�o�RD��Z��00�p�rI��$�L�5�m
������b]��S�4�"�
���δfU��.CҔQe����"T��`�I�mY�f�(l�V8��ն�%f�؀\��LSY�jN������u���o+���K:e��Y��.r�4kd��D��aë�b�Xy��e�6�]h֠�*D۰/�+���Q�\��(Wc�ĝ��2a�	R�4Yd�����Z���|�"ƾMLo��lp�1��5M�����h�%=n���/&Ўr<�L�:��=���I�E�i.b��[.�N�u
�X�������xwZ^��@�r��(�j�)̜s����MK������^�\d�I$�uQ�A�a�s�_ƒ7��>�_���.����7�}�,��j6��*\M��p�� �B����7�o/9�wh���'���䋑td$J\������YYcV��HO�D�`7��z.�H��x��Y���\���}�`�Z�#�*k�[-���+��_�^dl`9�����n��z*��:n�(J��Pyo�([�i��d�N��J`#�s�{�9��jm��ڇrsSE2t�F�œC�֜��j�t5�l�������{Ԑ8��#h�h�fsR��z�WͷB�
�;1��?�N�^�%[@<�"�55�9�N�j!��-,�j�������U�����5�h�-C��K�"ⰹjͨ��P����נ��}��g�A�
Ì���0���뱆i�.�S��u�q$C�
���m�u�P�ә@�}Z�T�s����_��seqY[�9�!^�yzx{�~�,�qH��5HT2�U�@(�`��Ӻ*��0��#�����hs��(�#�+P=0^�l�b��r�!	ՇN�<�`��+�b�Oʦ��$�%���B��.�2,��`�S���@0���Pea�4�t�#�p���+����L7�WAF[��L�?�x	Tξ�c�>�UݍU��/B���GM���.)'q�ib�=�I�+��J��Pۿ��Fx��S�;�����Ӈ�.c4NS�}�����s�/�0+;��1(�É�XZl�f�	��|�B�]R̲
�8Ąg
����i_�iW��
�fK��gs�)s�O薮5�V�`��������Hc
4�@�q�}*�y��/��a�����X^I��05�cOu��1|�}a���)n�`�w+�<�e�0�^��.`ZU1�v���W6*Qk�麧5p�?�f�?����!BOߔT���H����$�����c�'Q�����Af���D��
yG�,Ԡ�[��f�;��u���7?6Ÿư.8lp'^�|/A�5��SG��t�.C��cD��z�I[1�c$)bX��ei� \�qX�Ũ�Q��).�]�e�<���
���o%o��d3�qA%f��#3;�E,�r�r��E+iU��_*y1��T�����쎀nZ�$eK�fdM���1������Hz<�t�a���#N�s�.=��uaU��K)\;L�	ZCUK��*_iL��,�����hJd�J-,`Z��dz�࢕Y��?%1i�Ty:/��l�2�oM~��b�4�L]��ĎP��	��B��Ӹz|����F�%��KdMQ�Ϋ��[�����<�x� �
�\3k�J�v�{Y��c=�+M)�2P��d��~L	N����r2�_.2Mp/e u���za�aO3&�MDZ�m�h#{�.�Oc�?�ԝ�0I��~P�l��>'>�t�;����]�g��V��j;���	>��Qxq���*��_�?��#@�"�Ώ|�|�� :�� ��{�Ζ�k�WTq�zv�xtt��nҠt�}��S[&�0�9����%@��٦K�BJ�a�5�E"t�ea����w�_yC*�;�	��|v����5�얂�cM����Nl}{�_�
r��zd�
����v�F܉�k�֦:j�ƴ�g[����l����o����y�I^���1'O���D6wu�@T�f<�7
7&6���5%�����]�V�}�}|��
c+��(�.���)��/�m��T��	�i׾�~�v̔pֆi�N���\�";,��P ��
,E�	�H��+5{&���B�F�I}����wƁ�0:n��c�zya�z����U>�O򰢅�
�RM#=���WS�&��;��d�([XgR.1�'��W.�D�:Y��SZ�Ϻ��x�TAP�J�����q�]`	u/��۱8]�>�JY&�+9�L�^ӫ]s���ᢣ}v�����M�����Jv�=�mڳ�joy�⾂�@��I�J�h1�	'2I6LW�G�fT���M�,�\�UZ�{�y�h��5�:*��z�5l�/
����R����
�B����fnO.�ܩ��zMj�9n���)S�݋���P�	�WON�#u�@�ʜ	�߿A�'&|��NnȠS%e�`j-`=�\��Tf�T�R42��f�E=�\1c���aG.�d�[Z��_ӹ��t~�	�{1Yw���q�4Ÿ��d�����\G��"}`���2:���y��hb���G���_v��뇈8��GD!Rb��69�X��1GnxI������el�6JL��սY��l�YN���W��Y��t�T�{����}��{��EC��y�5��٬y��Æza�T���8�h�i�b����֒?���i���a�/kh�5�Xյ�mH�]��e6^���K������RV�z�s�)-��-s]�z��bw{N�Bzu��ba��0��8w�ɝUSv�<��������뻡i�s��^$ѩ �qU�6���$����;�?�m-����&�6��)�O�'XaL���7,,GD���O<�h�T7y��(�89�(�L���S�6i�G�O
�'q;�p�RU����ŏ�	l?V��8Jh�D*ic�*}сʐ6�cf5��k{n#��̕}Y��[�4���-�mt6�ܲǘG�Ɖ8U����
4��lg�5m-�E�4)XDq�����:�wk-�jG�Y�(��<�&���G^��*�

76�����B����������F�1�dS뫦�J���_λ��!�gG���Ӷz���2�Ş�
�cWȳ��0����0�6��dn!�<@��3�A�Qn	��X��'�w0H �S�Y7�F��6Ϗ�p�A��g��A�Ԝ�L���	ܫ!���]�����w�Wj7fu��8q�3�Dt�Eq�A��F��E�����ߣ`��<�@@t�O��M�U��[�G�-^8�����E�0K
neBBbŪ��"Lo���g�"��M=
��w�5�%؞�a�0�u����;���1��c�M��cm�ԟl��Lk��j��L�u8Ъ����u�ӆ��r/�<��15+�]|�#v4"�|�7]�)$����:Ć@��='«�P0�����D�yV~$��1�&��0y���^��5�>��2�ȟF�iD0��|���F��J�������xe{�y�!�NւrB���[{r�v��7�-SӢ�f�W����]��6<���w�R��
�T٩�r�b���T��H�Ђ�ش�sς�
�e#	����ӎ�:4�����{�f�j6+�O��A�m�j���A��.`ӇԵ-B�g�K���(U�#�|�Z�c��(�gp'hVm���9�?�韞	2�3�ڬ��l�[�J�:ܸ���.�
��:�P��fҽ�w�H���
��e�c�&h�Q>�}����L�X��]��r�sڥ��{0=�
�Bi��,�J3���B}�`E(j�MޫG(��V�b���P��K����� �9(3�6r^�k�d�~�w�HBK��gM�,m(���-�"���<R��=�Yg�ن��(.3�c��R���t���^[�u�����ů�\k\��bDC�S���Q�S�ѯ�"g��߁����Fi�#d����ݞ/F��s�%g�T����L�J>&g�"�
������~8C0�O>8�%���@�a��.��?@>�>~�a>5��q��`����Xb�e��~��W�5��)�'Ly-O|"�))E�
C�a� v>��h�;�����(
��wa[C'w��ފ��4��]4W�Xä���^QFЏ�2� !&���gTi�s#'�1!E�&�mV�1�}�m><g�������+�C��<�',��'�TD��BRK�#�a���b�	�*�\H�$��Ktŭ��2����}a�.4ES���1�4���`x�y�t�ŕqT;�Z��Y�l�H�psnp6x�	+(̄�Y�ʶŖٶq��
�tѻ�t���[�nv+5Р�Z$t��a�>V�M�:�G`��R�����U�۲�%�w,9X�W6zPA)]��W��ʦ�R7���y��[�O�+#o�:�a� �I�B��,cl�2&�1��B�as8���%��(�R����`�8��.��|�Tn���
.꘹z�T��LY�&4Q{�]l�f��Y�Y��W�/{�ļN���[<:��V�7�PY����F��Gc��-�uXSy��&�gd�3��"�Zh�a��JAr=��?�v�0'C�
�j�`�.�r ����HqA՟��vkN�SI):�+t+u;�F*I?>�SL�9BaZt.ge�~Y8|�k#�!uI5Ja����!= 1�{	��å�������>"+�etA��zO��J��/���{�h�?��Em�����"����N��m0���Y�#�df`F!����1�����kID���/�X�4K��H�~ ���`��h�g5�o�l�|�K�db��c�v��ly^�u�����Q�#-�8�&8��q، ~j��[0x��S�]#8	��]u�;���C}0��C@�z�&��gݕ�!
)1�R�S
P%`��B����oP����c�C��CK��p[����-���y6��%GӍ?+�ɯxkʯp�:3�Aw��jFDI��9w��Q����X;)ͷE�g?;�NCk�;_/��g�tJ���a�֖?_O.NǥW��#��)��TV�yNV�VR��7k�v�lN��{i2��YS�}oj�6BRM%���R9Ǎ�V�@F�1O �==/��`����-jIn��~nN�P1ug��ɍ�=/Sš�"�S�9��dp}�Q}�k� =���_:VϏ�T��J���w6̢R.�wÃ���+H.��^̴F�u�U�“Z��]Q�"�ҐvV��]q�<��}QAE��	�&�\��aBG����j�s"z��1.W���Mk
��/n�?9S�Z%]�F{�z����"*9��D��8�1���Ꝯ�Ѫ;��<]�f
��JSx
�P�um���ʄ�$�C�2���r/����Su;
Ց�}�~�qlpVK2�TO�:�N���S;������^�e�4.
]� ���:9 �Y�|�g�Uх�x��Sl�n�z��X�J��@�灴�K����#K5G04�&2��}J�-R�I2�߫�ą�zG�s`aD���T������Y��5��YSA�W��6`o<�o�9.�1��Q�4�cZ�b��?
ii��Z�Z�yY�!
�<��]��_���j�g�
.�"��{}P�>��_7�A�Q�[��_��c��և� ?B*���u�#H]�#��Q�S�%�a��y0���G߈��7V�zA\��fa[�ɨR��f���{�F]�M����l�0�\z�k?�
t�Iq���uߞ�R2�}/(�H��m��6����K���y�R�(��0o��c�,�T'X����=��K#�QڳE�?�2\2���
np�`Gu�>،K�I@�h��@��
�wڜR
q���y>�+m$��E�n�r�1;�(����pM��!O�$�p#��Y�v%߈�R����^����OW�(}�?[�qL��6�A�M?��^T�4w�ebw.�wN��+î��x���*5��3�F�����nX� �Wg6Vp2_mQ�곹?��h�)�i���
m��']��ǠD{����T��R�<cKl6�Z���Ʊ.Ρy������,�X���ѻ� ��yuh�Pޠ�~�F�~V.�V�d��$��М�ǥ"Y�^8�����TuZ@��O_���fR�,�ڳE�v6QV��y*RK���w(��}�\Pti�\F�A��^��0	���4��3��8~楬>��I���L|���T��O��{j�����I�r��^|Jn"�Z��}���ވ�S�� �3�m��j�^Y9�p{���Yuy���"���qA��N��D���=�zEb�cj�C]^��$���bn+��viɉq2d�.J�s�g拈���Nϣ�	%��sxI�!����Ҏi�wz����M>Y�-aB�ݓ��
���T��U��Uj�>�xNN�)�N�e��^�z��at�bt��[�O�)g�=X�-�֣�؀����?�B�l.�X�|ʹ�92c U�Tc�]2;�*�;/�aJ�K���V�Y#�,m�͸#=O��)ې�V����A~H�1�\Q�t���(������|�n�
iW��<�f`�_.r�~ʼn�n~l�}�QV���e�����BsV���J{f���YS���!�g�ou����9�w������p{��p{�S��噍N�
Z�%�;[�~o���?���Hƍ��/�4�?�B�:�[+���
l^�*Ut[��A8iC�z/�C��+����DCz��X����k*PP�C���^jH����("w�^�Ŧ$R�$sҶr/g�[���T�j�m@�	p��ÌÊ P
���>$��0	�P�7�����I�T�AN���?�=jc\�m�
�06Q�n@�| �n��A�)���9\�;Jv���m��g+�i���UhNI5ڄ�Y���<B�ݲ����
!C�K�h�P�)f���S�[���Ben`�QF�%I�O�&"�Zׅ<]��)8]��z(���r��rQH��#e�<>�v<��'�d��!�F��&Tb�ư+����g���B�U,�)���
m��j+�h��ꂣ�/���4�is��S�
�iZi�<ק�Wa��LV�ܨ��0%٢���<����s����yil�[�c*���ֺ���X���!J�#�L��U]]Z����
|��ihFL�5;��l�^ėk��aE����mP3KH��%`;��gkC��9
�Ӱ���+�p�Eh9���C���`U~x`瘵F&�{R
����O�H��d��1�o�@�`塓Q�R�C�$���pb�f�t�s�d�7^M��gR�>���`�t8'�Xa��k�����5�����+3�!���p��O����i���4�u>"�w�(p������4�1��m��h&n���'izť''�+�V_��)��RQ��(ϼ���x8_��)n#��kQ��%|���@1P(����7�8�%�kjf��J���G?�����m��8��q���qX����<^��Gq�s�Wr����Y����ʭ6��=�;sR��iL9+H"k���s[�!V�쩥�l��)��د�ֲ=�b[^����0�Jm�;1��+��x `�0�8�sLv��__"lTW�V��i�y�RA��\�߈#�4��;^���2_1���B�1I�>�,8w@�����̢�𲁺��7��_��O���9�?�ՆS�O=�x�%�j8Ğ&=�J�zL�,�i���䓀�f��9�dyܹ�*$�L7�EJu[T$��+����N 4?
��ìA���g���p��sKA�Z�m,B�>�^�w���.V��}ퟶ럆K�R	I�GG���iރ�F�������,�)�_���m����Ut���`bW\���s" �p�s�s�1�d�����F�����P`������}'V�gw=!��Ϙ�3
�.n�Ɨ� y"-�����D{���U_��Q���-ZB(�Ћ�Qջl�
1��j��a>L����*���C���Pt��,�
�������0kOI�h�w%�}�"�c�aG���3qsF�m\�P‚y��M�h��	M��G@�o�ɃU���/�@t\���tӸ�J�w�0��}��{��H~%�tp
���H(G5��x�0B���$+�_�P3 VRn1���F�*e��`B��\�E�S�H���l�R?BI	�;�L�~,�
p�p�W�,�Fn�����o������
�_���K��U�28����`7����o�&S��b�-��!QZ��)���z�W�uM��ӗ�f�Z�>wg(p/j��2
����� �b��{�J���6��2�]�橥�l��:I�Ȼ�q��7�@�X��9���%O�'�\�q�S���0�IIh �g�»E���ǜ���p��Qm@����9�w|#�j�UC��mu���<��kJ!��J�sd-T9��Ư|��
�aҹ��	�d�+�_��HF�%n%Bkk~�#A)["$�fJ�-V�r�) w��yd�39��G7��[Fq�n���6E�Y��d��4��`c}B}����E��wm��u��4�O;M�v�>2�cQ6q��JQ��p�/���x���<�H�1�t���3���u����@�U���?���F�[�������Ԭ�^k(�^"-�#^��s7����K�@*,�:��"���#�L37�)[�Pې?����}�Q�&���Xm��3i~t?�!6����(NPBD�<��,?#���
�*��m��i�):+�
���Sf��2R��K{������sb���f��(H�y�z,�z5��g�����JAԶw�{/�vZ_�~�z_ͺ5�8��k��#��E�-�e۶m۶m۶�l۶m�{���}���{ω��Q?fE��̑#�F��^b����5N�[�m��GhӨ��VQpÙ�P�uיH�W?��p+C�K��$�3���C�*��	��l��
b�<��V��Y��8O<;�	V��((�`
�iNc#���專V��
6<�4�ݹ��n�e�H|70��
�z�h_cgH�e�b���f��BK�����	�	��>�|Wy��

�K�Ig#< �S.���0	�­yN�^�ԃs�fְ���k�3nx=�WB�dD��C?|���N�%R���NW��xL���b~E�����[BvX%��P����۝D)����9E"��#�4z ��a���U��‹���;�D�� @�?wG��X�v�5����o��c#���r�T�* �Dh���V-Q�t*�,�B����s����W�
��/Bh����cv6{]����.�
�Ke�� 0P���q�O>B3�#ǡ�K6�
���;��0���ߎ����onb���h~3�{T��'m����]ɩ�7�Q�q��}A�3/�4����{�\�,7Ґ����aA9UT���h� �4�5st�]
���̎����l�5Cl�o����U4o��+�j�+J�w)Z����)��K��Aᓻ�4S�1[U'\q$&@��'L�\��4�5��Ć�"�[��y�ѝ*�&p���/
�S�'
f0憦��L���P/��F�m�����@����I���+�8D;5�����t�02s�`��UV��=�/��Jo��0ul3�����W��G�8��%T+n�~1���O^�_��D�wc�F����\lÍ�Ȉ{���_Tr�g��e�I])l�R0�4�'�m��\1@�� �8]Ewҗ�?��P��d�~�����o����#	Sr�(a
Jh[ �(�����2��Æ
�v$b�3�J���]�
�1孃G�ifmg����?�A��P��ƍ�GZ�:�pQa�6�2E`V�/s��Nz�_��f9�{#�1�ͬ%zv��Sh�؝�M��*����yP$sQO<�"����Ng=06
0�ə�Sȁ�p�>Z̬O��̸̯Ͼ
�⮥��!�s`0(��)��Σ���(����QU���M�8g�{9�B��)Na�H�-�J�!���VHT#��e�B�ܓ��MmH����q�+ni�orb�*hD�Ϸr�z�.֮ z�K�.�On\A�~�w�+BE��|@�3��54�oLU�����,y�X��R��ed��^%P�a����S��r���+�5�*\T@�:���D�G&]�GW��y��
��O��Ky��c^���G�S��w�~��[!Z6n�`��ׅ͛A6�S��:����H:�.�X]��kx�.�
��^��	=��_wA �"u�Ц�4����|r�t4}Ќ0w��:������gD0`�x1�L���J_�I�2�i�F	F���n�0����jcH�ΰ�5��Y>-d�TC�
4�e�=��OVT�ra�5��_B>�Q<)*Ŀ��t�U\�W�K�X��ڕ�DT�&���ا�\��S�-7�A��:?|2�FHZ�M����/�^=d��
H��*�1|��Wi%'c,�Xm�\Qb���eB����Ѳj3aB�H6�а��x^��O[[I�c�_Գ)Z��3����2�
Npў�2e�ˈc�.�2���Lx@
1��	o��d��4E�2�Q7�4�,06��Q�όYsU�)r�I���J��2&�"�-|�,�Y*�Z�^dKR
��@�#oy��V��#����L�T:'G�zȜܫ1h��L~D��\�̳E��A{d���vjR}��G|ij��x�(�T����Τ�dfO��׺��Qv9�6g��֕�N1��	+��T����|
L��۴�.�#�h(AT���t�f�(ac���f�95M�Aɒ�\�[�Q��̮Mn?Ʊ�M)��tǙ��mD�m��ed�X@FJ�x�{C��4��zY�d0VXYq6e��K�hp>���FLפ�A��ք��^1�Y��U��A%AH7�<|y��i��D���_� ��Ӡ��b�l�.���%k���Տ:�x�������c�Hyᆢ�Q
�ɗ#��>=l
������d��mk����J�r.p�ªq'�l�ʼn<
il�#D-L�c�ܴ����z���z�%��j����}��N	�QZ�"BX�rFX�蚍sG53�!njk�'�%�[!+��0fW�+���}~��麀^�?2M�G(c��_T2�pz�)�ي�3p�[��u�I7�s�ޗ��%Pe�����y��c�P�K�L,œ�!�2�2m�A%����̭�=�s�)�_J/A$�V�b���JM@�#*�<�(r
�)1�.ˡFh⣶7��My�X����-%�e��E$���F��5 *����?[
��,c9�SMɇ�{B�5r�v���q3N`yA6G`e�!�b�D`��X�g�}>B�tq��Y���D��
@9f�8Ơs=SL�)���!�3��K��k�!jG�kR�j �`��ŸA��kB�^�6���t��
jo�݃��n�W0��4��D4�E#�p^@&#{�N�C�"I�b�w;���XG:i�k#qG>KopE:TF���Z��QS��8�al���QŒ.���W^�MB����a�+Dޖ�*��&��M
C*���������+ة�)�Dt�M<�g6d܍u��y50~*Ѵ8F�h��4t�r��R��R)z7HF�z�����u-�7������������!�-�d���V?5D���H��
!D�R�B��j+Al��T�7u!���V4,���=4����jf�����c���V_`�<����,�(��ً�6� ������=���ݟ\#ճP���p̐bC��4��e��\j.|�*zL�v�t��X�+V˚��OU�IC��n��q�2�j�5��s��e}f���L�H�ĒL��A�rs�G��vz�8V����W��h���b�Ou�\����L�A7��,^��#���TO���U�$�6*%6?
������:��y�Y7)��8A�`N�.ꎟ�U�O۸������~tt�k
e�#�rv���e
7����(T娢�Q���Є���_�
JVb]��d?�&$X߀?G��`f���7���s�s�u{{~@õA��1�	�
����<�	��Ƃ٥1���*:�H�N��1�Mh��s���a7Y1a���7Ϥ]w��ϹSf�>���3�> �؁ˆ��~��;�>	w+E�A�٪!�~慔�Z.�Un!p�Q�[��2<!k�ߎ�w�9��Qc�K�J���yȇ��������#�W��G����E`_F�' ��;L�B"S�6��bS�9�>������DfBy�n2�=[�_PU�]P�9h��?g�/�*T��\Vݹ����c���2����Ʋ���DzC-�dž�����z2�-�����+o4���H�Xj]J��ˡV�k�l�q��UĞ%�zQ��.�� ���o��1���`����#fan~kDm<y��t� RN����*;�l�����(��E=�����ײ>�%���#~n��Ŀ^	_�J�>���cռKb�wq]�LS��5w�3�1KG4��c�PXeX�B6o���Яb��	5��hbg���%x�B����w	g��O�����W�(���Õҙf+̛�Ϩ��'U�&�#�����a���<���<d�Lm���*�Z��W�:�,�R�K?ݜ-ٶM��	YCll�д��%��4����ü.�'��x$�E�8��w�[������-��	-)��cs�zU�/ȯ=0L�V�W��b`eQ��X7S�7;y}�I��{ŭ"^swÈꪽ�T��l��6 �@�YC�'ʅ��>U,1���}��]�TL4��_<�0w:���@+ �`n��E�5�!4�[�93M'%��ND'Ʊ�T�>C�J�I־���$��y8�E������`�O��\?[�v���ɋJlu{��I��o��
�L4r�T��i�'3� ��F|`=���fb?gL���oB��?6��"c�v��el}��7��]�g�;$*��'
U��h�����^F��f���04���պA�
)��(�G�ƹ�~��T�Y���[�W��`�v?=ߤMgZ�k�j�0g�@�R�)q�"J�gW��UedNX�9)[��55~�15;�~"w�ܗ�b~;"��'�7d�_��]��^2�v�Mc탣��gϤ�{Cfq�x��r�j�f3�VK�
v��1�Վj~g�$���\)��@TTh1��(��ŗ�\T�4JJ��}�Cy.#'G����p��5��&���\���F�M՘�o�؍�]�}I����9}�4}{�<�W�^���� �g��௷/<��_���`�^�A3|���:ϐ�"$���*<�Qn�d��5RH���d���˵�;JȽ�vR��W���[HqRa'X>�{��!�$<�#�w�!�Mw��zÌ��9�^�CBP!�I���1!�$�C�I���%P��@�\�ύ��t&5<ɨ�[�g��[1�I�Mm�ؐ��I��<	�L�H�4��ё�^h�ʛ�x���,-f.�+`��KӅ0)W�S!Uv�+9�r#F���͑M�4T�z_ΛN[xs$�g�*M�k��7�و��<$�8̕�aj*�1�Z)��7Q����/M\|�=��
��ILAE
�1����!�Ė0�-�2U!=[}D�I�N����Wh-����y�Mx���)$o�8uuv��[E��P�@�8
Z/^Іy)Q�t�H͑'Cg;,��dJY�g�Q��*m�viY�U4n����M]d
��[pҏm�����ޟ�˰��օl�N���I|�Ol�����1A�H�%юm-0�1h���Ha>��Q*�0Y3P�wT���j�2	ɠ	�;"?����;4wq/�qy��7�,0�y��e������idB"'����o�����UY�ķ�ى�	n�����oX�X�no>���og}���"&m��q��u��Z_�����k��~i��o�gˤ�c=�YNՋ0�Ii^�o��'�}���´oO��ܿ8�
'���x ���v�#��*�����RĄK��h�Q��&}}�$�>LlL<~�����-2�^`�w@��$�d�o�N��Ҩ�e�N�^k������j
����c��^����L��8
<�&-'���	�Lf��0}�%X&
oBNWY���Eܬ��A(��
�q:��U�#ˌf�"�\�2���mZIH�Z��v�ӁQ�2�Ԭ�s�jO)fm���=[�ҕ�=���\�ع
H���?��:	���M���{�4*ɪ��Vl�����
�S6aݖ��Iŝ)#���ꉁ�J:ޣC�?�!gy	�5<��'��kYU�e85�<gӬ6��<$�q�7RZ��TH��lb����	�>0<2�1�BU� /�4k����Y�Dڿl��&Z�_�ȵ�+j,���{��5CR�R;����3�i�!�}|�lNZ�D��5w ��BJ�0p�E�*1u��B��]��.h����0�E�j|@�d��B�<�����(80�����t#L{^~o�'��uy���t|���
��+��S6]�u�c��g(��yd4���k"�E9�2r�ť������8�ڇ2	yG�u�gìW��pkv!:k�*ͼq2�O^��YS�u�����#)�[Hƣ��_w���#�J9�)乃HjX�)[��(�4��n
H�Fo�JHɶ��Y\
M�sQ�)�H�'d�7H�\�7�����Vo6Q�h��Gљ?�k�Se���W;�.�V";Ӣ�[��]�e[�i��V�3���P�|��2�1�I���y5&h^}�D�Ju@��\��~JhW:ZK�ѡ>���z ��Z7_U��X��rDo����g����M:�/����
̊;Un��X/4��"ߚw�;�{��Ʊ�1gMp�/��Ú����mO��u
“3PO��k��XH� ־$X\�ZH�
�]��@��P�+\�Fɖ�x�Pw!�u؋9G]�0������n0k����tN0�an�Y����r	�Ԅ~?A��p� i�ۓ�J=�Y�B}�H�2�&H����Z#Z�:��"�]��o]&�"z�����S��¡�.
}�a�(��@�_��uu���cX����9JO��c��#z{ݦ�`@�A���ۧ������ugA�$s�Q��]v��I�PUʞ�B�H1��)5�Gb�T��tG*/e��pGo��xǶzk�s-�s
���ˬ��۝���-�����?��#m&�;�k9�?3YS�*|U���TPtH�PX!gCKe-
�[���rB�� ��t5o�hWKW��"3܁20���SN�3�=��q5*Q���6��Y�97��9}��� ��ғ7�>���dž�A�bG��~`�E�

rW@IĆ�2��6j����K�qB��fz!����Y佖�remʩ�l5lm#���.=�� k~QM�A�;(3��,շ6��zƔD�)[��f#|�m0}�a�G��ƽ��#<���}jeK���[S�ɻ�y)�!a.$ZN��3t���HbȗY�i�J@�QZ�u#�K��r��}>f9LH�M�:Q/�����U�=�$�����t�K��Pʎ���c.r�r�Dg�d3Uy�;�k�{��FI�U�K�r�̏�(>*ym���Oj�bK�;��/��u%\�!ę*wTS�z��{$��풊O �8�G�F�BQ�T���� -�K���H�|L70�7�Q|Dק��S�H��6v���#��=%_� "��*K�!�x]v�Ԉ���;9����j�zNv��\�/�Eߵ��/=���u��	���G��QcHl‰�2Ay������9d� ����i�2TŒ���>�ZU�P/X��ۓۄdk��v[�6=����CJN�-l�j��
U��(��XYů�Jos�8�fKV
�'{kD��Cd;��K�9sOo@g�N�6�%�;"6����0��ڕ�E=��y�I�l>@��I��=j��5Jr|�Tբ���b��C��N~|0x�C��ȅ���$���'9O"M)��˘��K��n$�pJ���Z<�L��!A�c�.^��g5������U/��LOc��l0@��#�l���B‘>QXĄ�
����u�D:"�\�J�C%���܋It MpX���灄����ʭ,%��>-�qh�f�K��p\`��n�3���`Jb���K�h�,:���g�25`�e*�5;�3�-�©�
���(�z�E~���P��*�����卬L��mc��	�}�F� ����1�Ab~4A��P�\���hdx6ԮG^^����0Jtk��FK��T�mͦ�vK�������W�1�����?��o��x���W	ٳ���A�y�C��2y7�H���H#J�?L<6��8���ynO'�M8&����u1��`�&�a��>����M������x��j�è�G4 �Y!��%�7��|[}q_�C6H߃����<��
Uy7�@6�+3kO�Ne���5�3
���C;̽�_=����[3���
~���
�A�ٰ��?]0���1&�ə|&�͙��~h��M����o�P�*��`⒌	��T0u���d65Uʊ�חzwJ��T�zc��ы`,i"�Y+lU���pc�aE#�lp�k�Y.!���iٺ�G��*h�ܫ�k�(a�>l�q��N�ljlAs��*��Zi�((h���f������db�"��X�@°[?^-/��U*[���sur�]�M��5dV�if6q���օQ�r��B\�g�ZQ`����""ƬJ'���"j��]}2a\bI����F[�C��s��m�)��RŶ%�8`��O!�SR]K����`#�V�]y�c�[���g��e�^mt-OM�Mg݊�+�X
$�a�,EllǢ�7.j]i�)�!��5,�F��Y.�D�	ِ���7�P+x	i��,����+i�χN䋑^�[	�V!�����h�;$����c�b;s�m_�\s��=��иO�O�7�jeh_G��y�&P���6kg�h-��/���).!R���W�����ئۈXޚ��:N�1�]����V4e��HKM��Qv݈��$�1�RՑ��s�(ٹ\����[�j�e��-�ެ��}xN�mO��PD�B�?�t��-폅�\(2������*=�x��p������TT*�xZ�U�VR.�i�,Ghk(�"Ud2�
Jv`��t��U���m��.l.��ccY[���[T�+�.�R�xx�%m9)�nQʪ�ĦB]� }QV��u�Z6x%7$2]�Մ���1���	�l��j~X��$l$6��A����$�3��<���<7�H�,�g��ӾiW+˴�۠6ș�0�I�./i�˕�rÌ0�	��������XX��t�"�;g��{��� i=�sgB�-����ǭ5+e�Th�(w�L+�1ړ���
i��;��Qj6����ch95��pYV�jl�iV�œ҃j��Y�VDn�h���¢Y��ذ�aP���g���="#������b�$ZN��'5�U�8��]@��0}����K�(�dQ��*"L�h����J8��4:��Ik�Ū�V�L/^���-�V|�f{3t�JB��F5,ʹ��j��U��t�cl�������SS.Gg����r"	��)�p�8Db{��/c�tGr訢v��B-s�_�n`%�7�r�w�eY��+�D�5�
v�-��ml���kE�-�&!�dY�}�Ϧ4\�"�����5�[-���ėԜ�MvQ�A��O��:�H�|y���YT�@�ʻ��R�-q�����'@ϧ?̒P�^8�T�0Vw�z�F0��޻
�|K�K�P�'KRĔ;23y�BKZS�D���+:|�eC٬x��iJ�[��� �,��
���a�}����Ϻd6	;gCn�k�5��ʥO�E�9�6_��^��S���Yg;��(�3����g|��a(�n2�O�������@/�V���x/���@p,�v�q��b�ta���ӎQɋ��ӷ�!c�N�w7�c�pX����>�tq�it�&�ɓ�͔��#���q&�Y�8#iB����&�wG�T��ez���W�"\LqQ2@:�,&����+N�%[��uL�F4�WZi�:o /ѹ�0!�>E0��4�G��G*�'S�#TʣQ�+�U.���%V�#Uz�\��Xq�^.�Z�G��'Q�#S�*�k��U�S)�%�%UH����N��
bhy$m}PJ�m�/=�D��͘��ďyn�l�DjK|��˶�Ծ=�m�M�lcFF��8L�i���PR��H<��*G�lF��i����i�]/Vec�9O9�G�/.ص)�%¦�Y����¶�J�LI�Lq=�8_۶`�P�bqY�8o׼`�T �ZK��X��cS�C$�E&�%d��k˂r�iԼ�f�⼗M�ց6���HIxscG����m����\�y�L��{�
�#Ӷ�����R����E��Q��U����&�ԡ&��A���Lc���G��9n�u]Ԭ��7�Y��3~ I��0]39c$_/p�s��c#�_�CVԋ� ��6����){���Qys{�b��̅�;I_����PG�[u��j��-�
��` �\(�v���X@���z�&�z��z�UC�fCгv���zp�}��P�;��/�X�AD��H�1�;<�!�v�%X_ݼhfZ߇\���J�A��ַ}��d9��(�_
�2���˲�'lѵ�p��Fi��*�g��lWa]�v��֔�/C�$�
�X��J��[4}>�{�}]���HS}+�ЙcG�X9IǼ�`�d�ߘj��4����٤��I e,��i�)�TH�%�٦�r�HeT�ԑ�nAʼ)C�^�c�4"��N��N(S�n�j�#�-nr���ry)��SS��>����`���l8n(Ζ�����A
�w�x�D{��Q�)1u{��̊w��4�
u𸠕-J�bT�`Û��o��b_�N\�[Շ����CPȈ�2- 7`C9 ��i�h�#�)M�CT9`7ﻭpDqr���c��:@��qDx8v��J`聍�;y����Ky���;�Ĩ+�����
^.D���hz0���jĴu�R��ꝛ�$���N�����L;������kҲ��-_P�_��~�
���!�ܲ���2>�5���/��.Ctn}6���R��$}�K��4'z� ����X��_P���X�eɗԀ�Ӈ'^1����$���3��R��ɞ˩�;w�̳��T%�����S-a�Q��Fu��S)G,E|��� �xc��	`�C��=�M���d��[P iݎ�*�.�H�_$Q!� @M�rQ7?�Uf�e9�����*&���-+f=������ݻC���
�Ϧ7�8�(s�
N�7���gz1�2�8\Oc������X�7>��<��9gb3�Aw
#;���		
h�\�����v�[Yg�zA
TlV��lߠ�x9vzV����
�x��QiR�Ih ¬=*��a�N��'���T�UT�E��[v��^1�l���]�aq�6V��w[�h;֬��!~v��-?��8�X�8�'�D&�i�Rq�q���w�y4ч�f��;��W�P�w2ѵ⺩�R���S(Ze�+�\ƀ����������9�RZ��Yt}��=\D$�� �/�+���=lF���Kn0�W���(5�sT"R��5���
m�Nt��j�Ϻ�^�����)kJ�:}�I�!2�}�V	��UiNj+3�¿VE��&�%Ӷʘ+,�p^��q㖋����r+t��;z��r���eIא�g�M�������uz��=���r�D3�[F]��,]��)'M�\Y�'�1���8��^}B��Dg�uх������R�;�J�m1�+J6�p�φE�6?^7�&N�ҵ>܂�k��߾��Wn��~$�V�_;U��m4������:Y/B�$8���M�"DΏ�n��]�G��	��E
����b��䓃V��VI$^6A�C�y�qR�#��n%��_�{yj��W�D�
u!�^5L%��2���<H���N����SݠH�en~+k�����-����aj� @�?o�U0t24w2t��/�t�� J�I�	B0�X�C8�)Pva3��	!�|e����Fᧂn���I%�~�;M�?r����#�i���K������n��z���5��{�0� �����Z
D��~4Ъ VA�;�z:OAA���~T�����ŀ���+lߓ�����ʒm9�<���U9�O�kկMC�ʶ�S��Z��f�J���*-�-]X��K0�IK��XZ���7K7��+���`-��%���?V	ׯM��cp?ڻW�lR�9���'�X`�r��S�J�X�Ƕo��Z�K�����.[ ����:�����:�	<�E�E�ŴU6]t]�#��f
F�6�t*W��	��,j��'irX�T��mƜl;�Z5f�{��ŏjGycAcEa�"O�u=�	���u�M����Nm'!P7������J�FB�2�ԣ�ě�&�;���K��l[߮qw�c�=Ve�b���@���� bx��u5����'�A��s�� G�K�/h�h��&�/X3���̇�=/�ٽKԼ����۾y\[�mr[������}�7}����CW�b��Gt�V?Y�?R�x1�>����c���&�M��Y���d(�sI�U0:i�%_�p�J��&Y�T�&_�xFiu[��⨣�3_���:�jn��I��z�7�;4
V����}4�پ�5>���'@���(�L�N�Ʀ�Ζv�v�.N���uR��K�Dk�N�/
�HE?!r������}���@2���8��[��������]Ґ$���D5�����0������d‹ޏ�`S�:҄�S� �Q�z��,�t�Yc��v��N���g~d|��6l�ݾ*x[m�.nV$��3c��c��.�CJ��f�T�u�yN�9x���\�𞵖��*��_��/����aA�f�Z�tO�C����[<��*�K�F�T�7o�e�k���$U$!�C{�X[A�G$-��
�C�wϒ�yzWv�.f�-��p�5�۶�g��p�}� �u����K�6��g������eC�`I�Ð�MO'�T�'�@%�y��j�^M\�W��u��b�>��8�]���wN��8�i�ژ &P����V�H��7L�H�H=�=�`91�"��R a��rc�CFP�M�At/,�xm��a��������+��ߠ{A�����TÏ�t'��K���-�̚�4)�÷�3�7�5~Hb	���M���
?~�%��nb���5�0�0����aW���Y���e��2���S�>�%	���̏�υ�M&錬��g�M6���*?�(�NYH�$TH[o%a�4�Vt�x˅q66�~��-�>wt�1�P���;���Nq��KR��Ä�t���k����ro��W�q�ޒ?��b-���)&�I�a��8���D�釈���bL���	�N�YM9�<[�3�H�ɬ�pt����/����c'A!�N3��x7���� >`ş�p�P�Ȥb�ɒ�U����.<E��Z~ҡZ�@T�]����R����_b��/�\�͆٪(.��p",�4�"��S��W�����g-Jn��&5��-O']�ѐ�M�0���P�ٖ�k�N�[K.�3XL"�,�>_z�h�T��x1۱�D�����"�n8��l�&&6>�j�JA�Hyh)�SQ���6�v��Ϩ�+�^3">9�\��A�u�NU)��7lF�ܦ���K\��\	�YQ�"y.U
3<�Q:3Wa.��
���/3]�j�N��F}-�m�P���N�iq�=R3�2T)�.�T�+k��T��c/d2�HJ6�k�7�l3���Z����'<�P�w��?5����!8�!92�9*c�;L���x��g�v�I�#�VF���4���=�	".UT��V�>���&�l�2R`�_���N��b���_���6�Y�8X(Hd���t4�#�T�s+���+�@a�F���9���)i��^.��"L#�>�<����R[e}�n�O=buk�/D�S@	-]�6�TJt%�H�sb����y�b?����,�B��U���;^�.�uɰ����:#+H�?�H����0:[x�Nj��7�D��)�A���ފ�*��B2BA[9f՛Ȃ*>�!���)_�H���%ӡ�B���'K잨3h.6�� \aM1��|��r�������K+�wn�E�^�j���<�g3��V�l���
���o�^�q��e�V���o+�����3[��(�	�BԷ��Op��3^�`�:[�t8崴ž_N�9.r���S/uG�s����7��k~����e�+��i��u8ڟ�rx��kɷu��yA��H�t��:�C:�	0*�bB���٭�>��%��(�<�q-���B>銘iz����5䵆��rs8�f��UcJ�M#�F�1��F���4�A��𖱠��²�8錉{K(;�6���nE�)Cj4�9hJ���$\h�y�OE��+�㣢�+Q��s���rF�E��.��!�~ �f��DŽ�*�#������
�6[Gj
VD�4��ĺ
j`�l���j�6�p�
�V�n+u��ç4�s�AV�3�\�w�.����-
�d��r�e2�a�G�t�~��$�vZ$SܬDW���M}�f�ag+�/(ѳ���ʒ��!�l�U�Iyf$:���?�^K��Mm���PU[g$u?54���|��#�j
�%�,�X���
�*�q�-@����R�r}ߌ�8ܭ���m���p�Y��n�S��<��/�}(���QX}�v<av��!��C�4�R	�S�PO�{��ؤ0{�?r�Ƣ�c�q�\�k
������|A�����4:�V,��O]�����
�,����V��r�W��n���K1����N�veX�2Vj���UL���-L��Y��+�#h�p��k	Rdj�Һ�,�#����ܷ�[�[ش�Id��ZVi�O{�`3�9�#��#�)����x
�1,�m4�X[g(`ݰ�_�yk���"O��&۳���T���)8���a��j��dw��7X���%�@%}jK���/q�ry)�n]۠��b�j�!"���W�} G�nת�E��9ثyX�[�>�组�X(��,4~�{֚���a���d�.�@;���� �_!�WPqL��Nc�􆁃�
��ƿ
[��Qr�l�"֡L�ʓ�P�uHתC�VJ[��Ƶ�w�
�Y�v��uu��/P1��ݶ���A�X"����E^�ְ	�GI���s6�CV��}�vG��P�V�k�j:�%{���^����sp�e6��c��n�u�E:�Ԋ�-s�e�ؕ�uZ/��i��H��8QF�6�-�D�EJq.��{����h�g�2�-H�o�TJl���#�D�`�����O���Q��ґϳ�ޢ�ކc��^KC/���+�&Db�=�'��0x���7�r9w:��;�;�}��4�y&R��
�1QaSΥ�y�P6�o�X�BN��C��h��c�����+z���w�ߕC�F�K�'��n/�|ɛ |�)�5���p�d� ����hR$T��^R��>�%j���׎��gΐ�J�n��0��׬�c�Aݢ�.�e��L��9�9�!��>�E�؊��-z/�f��|�hPA���V�s����j<A��p$rF�����=vf���[�����/DO�u�����	o��7��Gp��mwj���lF�A�{����s{��uS���ث��x�I���BxQ��$'T�L�3��ugs�����d�՘���
��͍�M�.M�L��_J$F@�d \Q.�r��>����^�� C�e�;3A#�����bC$�(�(ɴ+���=k�^
�yf��Oh�S ���
yIQV��$�<.?�Kw	my�^��RYN7��"+'��B�jz��!Jul�XS�?�ג�O�n�5��?���]<m��M[e$E?:��E�()33+�җ�'2#�*߀��WP�m043w�R����́�����Rgwu��a-�)�o���\�>@8�(W�^qpz�"B��6��@�`���5��cxV���/��vx��0b<�N?2X�fy�q�I�$9�“W�f���9�WM��D%X΃9�n���w�L���ƪ�k�Ru��dr��jIC�~���|�h�6�EpՆuX�tE��3�x��e��sf=�	j)�$
cu��1t��������Y�~ƺ-���V6���ʁK�*�W�����Jm,t.���
����[e��T�rŸ#�椆���茔H�Y��pf���T�ءɽ�9�c�AH���E���u���i�N�v�G#f�n��f�?{:F���5f]�Vi�&�*5H����G�C|�� �_���3���p�}+�d���u��/��J��r#.�"G������n�+�0o�׏��b��)z�qd�(�`���d�Z��҈I@�8C�|Am��z��2���U�����1���%���>�ެ_nt�`�O��`����_W4�ulFG>�tA>��{�<z��Hm�$��áBNJn������Ѕ�&�Ɔخ��[�a����/a�ܥ�}�>{��� �f	N�H�F|�dsDH��E%�,T#R�d!�5_ŊD�<r�k4Ј�R�7�8�}CUR�f����Gl����)7�^�bhdc*lo�jk��[�8��Hd/��NKKB��	=
*��(U�@ʓF��4j�S��tQ����(�c�Q4��O�f0{������51U��q���uQ�I�-��<�,��UxT��Ȧ�?ȏ��GV}�]\�#{�}i�vΆ��9/�nl�y���9���3OYJpaq3Bg?�}?ˢ�D���ی�_�
�t�X��D����MLj�W��p�-��%�j���رfd�c�\����ƶm�NǶ���Ķ�۶�tl۶�vl'�;���;3��߽��q>U��S�^���^+��*-�B�2��aW):eʂ9K-���)˩W�~�ְ�
��I[,z=c���+uW̐���[,���֏3����?R}�h^خ�=t6D���
ͩ���0͊7T�(p5�~�j	PCl��hp�{X�dt; R~�7�a����wyk)x]@MWj�����Օ�e2�"�z0���֫�]�o�Z���)E/�$CS$�DcQ���
��f0d�n�=����|�H�����8*�6[������ma�/J��o��<��(݌$�@�p�9�
u�pu�d���A���V'���~p44��4G�2���5^g���ϗ�;��lte��{�!��
��hzh��%��!�xnI'EBڟ�/�~�S���%�T}���y�";ra���:>M�/!I|��m8f,Ǎ6� ���v�0u�1�V�d��ۡ]{��O�4[�w��L��0l���\|5[^x�_%(�N5��›ҏX��UD��f:�Ǝ����}�	�I�0}^?�F�R��f���-�~čA�j�dF���}�B��e���?��?k	[�q�v�I�肉��4!���[�Yo�λ�&�КdP�֩P�P�!DbGC�#�@��W@K��`1��U��!w8�<�fG��o�R�b J3݊��2�n=Q�b@����Ĝ�@_��8sRVA��J\�
”�lH#��^��� �H�p�i�d��;�~r��_��m@7��"}�.{�ao}�JX��D�Y�������)Q�w�D�4Ϝ�]1�2mR��0<ANK~�ZAʭ�[INjS��'�dgڬm	×=k^#>����c�xL6F�^G�O?K�n��%�x6>��<��_���?^�����sCvB�����"Q�����GN�
�ૂ!��&ڰ��5�h	�:z=�Џ�&�B��A$e�����7�<��H$��l�3������`xĎ��|��;���&�����N���߿�6�b�t�vb�Q�c�ԠeG��hO�=��-}c��)}��L��{;
��
�� �N�^#�Nz槆��zDG<?�ߏk�Qp/I�f&˕�x��9=�G�E�tiGY�����J������E0V�4�|�o
+#�p
�q��m&�߻4��0���e\�I^o)��0����
�ƹz���W,��UY�7��W�%��B�����	�۰'���=���`d]�iJ���k�5���Z�T�|R/�y͡tI���$>�a�9@�㮝�2��	m[w~0M��x�����J渝�M��F�#%��qR�
��cW��?��tf��i��!J�NK�U��i��~�B����XI��G=r�/�Çt_�`���}�E�N���*�i{I�j�Yw�
Y�	F]0���5b�a��i�� ���g>��,��kLC��TZ�D��DDB�om=p���cz7Dq%*�����P��j:2َɈ;KG�d�};�����&N򖳌d2�AN��Z��[w�A�VR� CT��#�$[[Y|�}L4T�K��"L�9
��͎�}�ԇ�+��}}���֙i��#��4W�y����E�11�������"���d?�q�F;f�3cZ���I�3E��:��E�%$A�<@wL��
\�W'�E}�k�xșՊ~��,N���s����1"nWZ��2:~c�1��p��˶�I�8�!�ۆ��	:k���I;G_>���]�������q~�6v�ݲt�g%��v H�1�u�ﲝ�XM��b�ŦB�-�3G�n�^�R$�I�J�*8�cA�fb?����P�g@���;�go	���e�Ƌr�3�A�%��z�m���]�͌-��k�˴0F5H5G�� 7��X�D}�IeZOM����1�K�x�s<���E����o���uN��s�mms�����&vƓ��GT�m�i�٦£�j�w8���xj�ܰ�ֹ��6dIAieEa�ʒ�8���y�[���Sc�w=��v���E~R�`��P�(֯+�#���0Nj��
M����'`O�:��&�s]�!�%��f�@��>(]���ma(����N��6�g2��^�(��х���X���^ΤdL�Ŗ�(�e
�/���L���q�����(�!&礡vM�t\펖���?�d����!<d�O�]<�8�T��e?��^�ڽvv,ݣ`4�?�J
N3"h�I]H���Xe�: �^зб��[����Ί�����,@��p�㸼o�2}��z_h�XQ��~Ӽ7��@��0S�E��p����A(zR0�W�A����r[�E�D���_�p�u�q��y��z�z2��?� �l�k�B�i��@�h

�Ҍ�����M��O����m�h�E���]O�;���_�o�j ����Y����h�<���в�����*��b�B�hY���� �a�aQ0b������A����A�<#"X�-�2<��Y�i�3��k_Tbi���n���ԗKrTⷛp��כ�	�>�"jt��u���g�w-��OˍE��.��y�tqu4
Q���+�Y=9���X�b͈^���"kY#���v�c����ϋɤT]/�w�A��>�"�7q ��gR''�I`Q��W���F��f��ت�7�v�6��>1�3!�Ϯ�N�v<Uݖ��5����J|?.����%�@�1;._v5�d��ZHT��G@�o&=��45S�J,��� m��آ:i�*�%�|!S�E������ܺ���J�ko�4
�-�B�j~�\��q��X6$�<��*�IJ2ra�c�k�#��Rc�g`yv�l�nK����	p(1X;B[?�j�?������]����X�a{0ɣ��_1�w%�N���a�1��B�� Y���X�rl�Ø�]'�s3c�&��_x�%}�.�a�F"g[N��hb�v5���|�_��^�x
O��8Q�Ɋ
�L��S����y�T�g�A�	k&V�|�ȺSхF[�����*ǟQ��VCWp2�:L(��L`���нS�
����0YJp5���Ðb�Fʾ��.c��P�ᘏc؃�v�c�N��,��a�]H[p�h,��{m��N�*��G��`:������*()���S��9Ep���|��H���ů˪����Q���ͬ�G��ʖ��[{�w!��[�H����ll!�1���/��dui��~��!&g�ꖛ0U�..�U!�s{t���E%M�K�O����t=&Z��r��0]�&xaA�ꛮ�o	h�����;����;']
�v��'�&�F�fUW��R&�衹r� ԋ�<.Y�ʮ�kN���m��ɷ�j<Cu�6��"�v` G�1��B��Q�AgQ�� �b�R�X�G�q$�Z��gI�U���y�v�D�o`�=�{������3�b�9š�d�!��8�yGoD����[uA~ :^=g�l	�Q��
����X�d����L(v��}a��uAc����1��.C����:�R��S��@Y�a�
]Q���v�i?��)���%
�48��UF�W\��A	cRA"(g�k��Ipi���(g�0��^ڞ��j��^�w�ʉ���\wd+�H�J�������k�_��o��v��T���@��o���`��Ӥ�=�S<m*�+7"��8ww��������W�D�[��{��`��oZ��]HE7A�u���1�7I���!b1s7�9�<.X�X8>`
V��G�~`��#g��n����{>�G��{����x�9��{���hzIc+�ŵ��l� o�t���==�ExYVR^�2��J�#�]G]A�oM{��SRQ��x�7��ﲎ7����?�jC�-M��1�a�Ӷ8�"�#B��=�

D��Jw�J����vΈ_�k�68�f�����u3�%n,4��z(j�1���_|#I+�s���z̙N�;@�P��U�K���K�f7"�Mx"�ja�6�E�3�Q��U�
M�M�cʒ2#::��cӊ�Swq���b�N�Yg��"D��*r)���V��>�e�Q�Dl3b�?��
~VD9�ȸ	�fo�2�8�]��"��\�
��c�mZ�+N�S&�FgB���age/��'A���X����9�єF��b)Dr`�ư\CD�3R�P�	]����Q>����	���T��Aح�*f�A������Ayl�q�Ƨ�Rm43��G��#W��V��-Q7b���Y���{��`�E�h{go�B`|�x�l���f�js��Q��鏟��q$�ݶ�H$�4�뜲%P�����Y�v�7v�x�kK���I�kr�
�H9,]�UV��^��p�MQ���.�
�Y.|ܮq�o��!��2({�\��tU#nLx��wCٶ��t��o���ˎ�N�+o���g��\:'�I��_��l鈨J���D僲�]���p&#�~x�
47�N�����W�;��ܨ��e��f�;�	�T�A�!�t�l�R���o��6&aG��EN'��!�K�Sȁv.��s�a���Ǔ����F����&����v;.�3O�[�d=߶�{ڇ�5vCPF��F�[s�b�,�`9��t��n:5�7R�d������J'XQ;����d�����,j���o���}�t�{�3�>7�</(�]ƨr>�$=:�BR��qE�&Ep��r�I���s�⭸s+I���ʠ����J�6_g�ޜB��Z/�D�<5)��-���؇+
�4ƒ��b��7n���c�R��B����ssH$6ɋ����p``vP^��F>V�9kX��Z�,/7�/�p�ҎrB�N��k�,��V9ڈ֯_�:�����o^1�5��DD�PZJ�V�~e�&B��ý�}W��©�#ms��6G��K&�O�=��:./,�n��R���(��E��`��Qtu���Ֆ��76�-�a�ʗ}�zD�_��0���Jx��~~� ��0�+o��k��8�/��m��	]�%M"�+�T���h>�ZK00� �R�Õb&�rV�oU'@dg�c�ߍ~�jؠP@�6<�Jt�~��}��u~��{���CDD��Pu�ӆ�d�`F4:I����K�"=d�T��s��$Ű݀��#Q:�FFolGY}:7�߂�I��'�8:#��
�8�]U���6��5L���H3�kE����5Tn�õ#iSN���f��d5b[ne���4���k����G�g�i����iJ�]&]�y�h��+��i��QP�A�`�����(���8�F[c4��ʬ�ԣ�������n��סn���x��)xE,�}:�4�lL��͖�s\�w��s��YU�
��֑$���d]��K���j+��t�����xkr
1���2W�����?�����W�sV\���萺�5|:w��K���2#0n�@T�38�3ma;��S��u2L9>�ѳ�ڪ+�4�#���*�Fg4��Ǹ�ֻ�KŔ�FLg�*{�"�4DF�Y6��x�t�.�R�Cg`�Zſi�*L�W��tJ�X�X�j%P��H7(�a���V9|�|��F�7��0qt���5���T��ۡ0��(SӲ�ͬ-z���x�Ѻx?C�ʂo:|&�7�Ŵ���Ѿ�6h�^�a�Nö�T��%	���g���dkoޔc�9�rی![}��G�����	[�T�����EK�"i/�6$��x��9r��Y�t��z���"�*��8��vz��M@3�m�E��P���`%>k�-�%�[�����/J��J��_���!?3��VjA.�-�7�?�@��WA�8y���S`L���J4@D���C\M��4���>_�h����b	n�kN$�3�u�i��V�77a( r@T�I
`���W�c�5��8�n�Rj�P�����)&)�#�E[�����˷��.N�o`��pm�k'����ۊ�^𩖗h[[�
1H�8bX�n�Lh��&}���B�A!�x�n�@�����AH�oD���n19�ȸ��?��[�qR�w����!5�YrxF>�HԹ����D�tn/'K����姱4�WA���6�Z��[{N��*�({�{g*��ρʏ�U ��onE=!���x<��������3��%�bw�����W�(P��d��������v�av
I�G@}~<�i|���K�X�R/��ƭn��G��ǐ_B��ީ>���_� �en�ǿ�<Q�k'����r����W����������I`pؙ��D��O��7=��Kˌy'��2��b�f&�EpGi�T�!�:LSZ�	y��� h�S��٤|v�r�d��ъ-�id�T�G�ES���q�(þ��@M�a6B
���3��	��h;�	FB����.�E�n����Ә��NDw�*��l�
�s3pP�Y>w�]�<坖�zƕG]Ϳ��Mq�G��,z���E�5<*��-+k�}%]@�����B�?D�jF�pg~���F#���5U�'�� �!����3TI�نSm����|�L�8�<��]�q�
��ӎh�%�Ჶ��
�Mɟ<��d��4w�p�����?<���X(� �=d��!��s���$�ԣL�!�`sF��&�Cb��@"�� 2G��U���K�F�D$�]#����\��O�ix�+��;����T/u+u�E���H^����Pc�W_������W�j莪F|XI�ہ���U[�{���)偺[b���IGp�Ϊ�9����
+���בID��\E��Ĵ>4iڹ��Ҥ�M�q���cϻ��o� Tj�|I
��фH�,^ӑ`��^P�5T��X�iCd����ׇ>B�O��.^�d|]�8�9����5�T�M�P��7VI�'�h�����l]���AeR�t&vR�fo���8	�&|Pҷ}0q��$��tr�B�f�_��0:$����V{��.�K�y�C1�25n�5���d1y��rs,�3���}C���^��ɤ���:R<�|�O���q�x
�si�1����3��ߪ�����?]̨u��?�'KO�d�Ƀ��M����/�ģ��%�0�{}0
;q%��x��?KG��E`��0[�$z��݊�����ң@��s���Kx��c���
�'{�������xɡ�&
%L�.i�V��F�iҦ"&z�;r!>�\F+��q���p�e[��{�U���ӊ=H;���	��.�dn2U.�'�ɼ���pq[��٬��/r0(���Ο|]
m���4�nɆ�ggY��'�>u:�u�I^cg�=� ���B<�-(�m�d�2���x{����j�~Zh}�s}����f*�}D"q�J�a��hR�`�̲�]T�oO8^U6��{�#�R��^1��'�)�J�F�Z�&�LS��R�%Ga�"�U��Q)�[Ȓy��{��e�v�X���#�r�m|ZA@n���[jp���q�R��<`�/X���9ܓK�46�Eٳ��'MH0�+�Kߺ�~�.X��͵��a �"!bp
ӫm���5�(�W,��'W���5���r�]�gaÎ��_bb�r�(.zE�E�Max�{���wŃX��4'�C�@A0]*����'�r[�A�)���t�D����.��ƍ�V��\X���s�vg��
�����%�u�W��!za�1�q����ՙ��j�K-�en6Ёl
�Mq���gn�&�y��˫��n��,&WA�D�U*��v�d-��(8�?2p�6G���1�F["V�R��Iz�Y�����@X_�U�1%T�$ߢ1�-cD}��`Uj�.Q�Y(H$H�e|�w��K�-�+��ۘ��U�̌\m\���H0562���mK=�
q�O�fr	����j�2���b1,w)��c@_�چL&6ԚN�,`�\���@�.(�.t�ev�[I�]!�t
�9�]&��%���K�����U�9H�^L-�p_(���M���5]��e�|�H%N]��=v�c��e���Q��ޒf�L��]����l����[�u�����O)<��!UO�b
ɣ���lҨ��u�'���Z���1��c7K��?�{Cy@å���t�VׅmNA�QA�b��+�|���惞��=��D7�|�s��_���g�w����bJ|�`CV�K6A�N�KFzĕ����>=�i�B���Ϛ��1��P�3V�P�q��䷚��C>4�(�p�T�����fo���"�6�7�$.����Ƒ‚�M�H$�_M��1\�Ham,�=�8ltQX�i+[*����զ�+��ش�:L)������^�̩���iB��x�,�A$~qU~^�	4-��E���I<��6}��
�	.g�K��t?��u��o�Q���Wܔ�j{��b<^�fSپ!��s�%p��Y=�[�b�c@���b��n��B=�2�B0y���Dpn����5������9�5��r
��*g�w��h�I��;��X!�O;�<�o$ߋ>�A_lo�x%��@t�)��?`."��j�+�X�0Ƚ�P��]ؖ�,:���b�&����C�E1\��e\8��:)L���Ձ�[Ő@'�!
�A|#D�i� �˺�ڜ��Gk�GHA&[
����R�5gWY?��`���
s1%�H�إA֥T�O�2�<�M��Ϲ�`w�r���|w�UHF/A��Pgtl�U�����������P=b�B�Ei>u�Bh�J�?���/^$X���/`e�8;��
$u�%a��˨1�!�@AA@�����3����B��9�?t�d�:��N-Q�|�2txcЊԢ&�t� ��-��A�:��w,t4p�^)RCcP(������Ö�T�*�0��bl#�~"�NU�6V�/�.ld2��������^Ҵ�b�{��C5Ƣ.�Ȅt?+6��`
�/	�eN�4�L�����ڦF�z���Y�9?-��"1{��	*i��A�fǧ$iN��٭nj��jVK��65�'�ϧ���M���uOS��3\.�����@C�I�
4jn�9��{8�$t.��-���芷�[z�lH��X>�ZKe�����
FvF�<����CN!_
Y<n�^y��1
^ҪA� ��Lp]���e��ܗT[��K렆�ephȽb�f-T�2p]���oS��ߎ���b#�!ɖ��5]��T�Uć$�$�1�YlnvT�5	�X.BF�)E_��C>�����4fp#��N�ĺ5wLj����X֒�=�Κ��F�H�-����\ge����K�T����e+.d�=�?��
�u˷�L���'�2���Ĉ\߷���L�ܴ(`�ba,�ȵP� �իp�G~~�.W*��Q������fl�ð�lm����16�7��	�=�Y��$ֆ3B=��j�6��bϞU=�	Xۼ�ߌ��vΤ!h���%^�_q'��1En�}ƣ����#��Q�0$��ZN*�9`6��I}|��:W]6�����:����֫��G�	�)Z��D��#4"�Ո[�Je�}�wl�- �� ���ֺ��@�%3�;��{:���K���_�JI1��M�_ٞ�Pvʝ��P��Pm\��_�h���7��ΐ�_���������?�%kZ��k�)֏�j��̆YD�&�H�yGZ蕓�
ӁJ\ƌ�h��Vb?��&�Х�_��YR��.b+|���dfͨ�o�g���ߞ�z�@w)��P��QRX���Q�%�  ��[Rݖ�<��[�,���N�;	���
ZC$0W46�ك@��v
x{�9w�z��
Cgcm��F+Y��i` &,M�j!��*5Iu\Ƌ3��B�d��sPO�sD�h�l��4^�Tul�D���%7��m<�&!�db.�R��n�F�;�GQ������^���\���,.��=cA�0�X�#�����'�R��ܩzP��aGUS��ϣ���I4�{ݳkL�L�(����k%&?�p;0��k�R��b��3^p�
��d��٫�,�x�ivwu�מ����Y �>��64�O���>��!��)�73��cq�ÆW}���=bL�e
�:�*Y�Ҵ0>���R{2;Sƭ����gG�Oy�L�E�&�<�D+e�,^�/"@�C]E�&
�9�m��IѲ�EoB
��9W#�����c]�{"�^jv@@N�������w)�.#K�?.G��f��z�x�h�"7���w�6$>hN�m��#L�q�����-]�q.���cK���Q�����?�۷Μ		SI<�%�紧er��%��J�f�Ŵ�Z,��(��T����ؖ����}�*��n�1sӡGe�*��|��IdA��_r	�ݴxkh�U�%��H�֜�	��CV�|����=�T�:3�[���,�����Z�%�z�[��{�Is��vu�����}x����c�f�Qb�(�g��D��K+���A<q�R���k��|*�@{L�/��OYZb4�r�[
b1j�<h�W�pTU���\���{J-��=�+��c�6���ȩ�ækUA���_;3Ԋ[t���ٙL���լ�ks����;�`,��5�;ܱ�����>�%��S�%�DP242���^���-� ��vD��	x��\Gk�{!���9�+Fξ(
��"�2���:�����ʽ@�J��'C�/c�ֈ|��Ъh�=-Z�F����<U�DghB��[�X�x$��0i{���L�}��,Q��w�����q�r�B7��Q5��	'y?Ɓa���[N���qd%�4nK״��8#��b��෎�BS_:Y&\���g0�B�$
űӉL·~@Y�D��^����b�w��b �9t���;LE{S�?��8L���~a���ah�58.��7�e���=`4+}�ƭ-��Ob�K]i��6g�I��O�iy�yyb'���(�n)�D��!�
!�L��ڃ̨�la�g�T���5�0"�Y/5 �QK��˃�u+,��X^o\��٤N�����„ч��;����EH���+�������4T���`]��s�����H@������tv�`���8��.��Y��~Ѯ]�� L��zl.:@&���J�7r�u�i풫�B!�U��ް�cV<`N�.��[g9Z�;��a��i�i���x�E�6T������pTb=*�l0���A������b�S�9��P5���?��C�8c��Wp�"/��NjѬV��f��%V�9���dYp�ZØ�Sr�1w�p��j"��<am��m6@Ja�rZ����C�$�����7���h���T�x�:g�RU��v,��%�Lm��'q1b���{#%Q��m�FI���	Od#a ���d~Ua��*�ALѢXeӟk.��?1C�������z�w
�v�Gݴ"cmœW��ʃ�iv
>=u��1����03����J���\��Ћ ��f?�6_�zz��9�L5��/��5�/�N�fH�F��F�ѹ ^h9B`Mx�*;��|k�-��
��EX��
.��;���dܣ�ꇘ�Uc����o�1���z��v$�=�'S�|rr��x�2z�V��ES)gBn.��o��g����;��t3����ӻ�#u��ū<���y�/���e�kG�񚸠\gu��<�q߼&u�t�P�{Cb��:�	�wN�<w�`A@�0��Z��q�J�-�1V0�5-I�~I��{�Tà�Ih��F�V��� T�cY	L��3��g�9jn�S��F��b��ȧC�S�H����>��H��|���p���Z��6*{�~���n{z8i!��'��H.i������1HB^j��f�Xf'��M�R�l�,K���
��/9�9��x�}�W}OZ����<�)ҩ�{���t�`t�x�b��}��
8��G����\��X^poo9�V�g�FAb���~�U\Z
*�i�A7�^T����kH�Po�!Y}W�*��^o�ӢЛ�Ό��1;rdi���k?<^�-����l���3�|sqb
l��l����out�aC
���e%<�Q��Z��N]ۈ��
(����n�*k[D!y�RM���_I�Fov�{)��F]���f%����?h���AQ%߼BI�&Ci�X�0iYB���|1e
���@�#]�z��V���I����K������!��u�d��cu����*
�S/)MѠf3I��������2T�?~��J�&Ws��-����~��[=����4��l�b��t�jү}UR1�C���4�uB`��O�!$��!5}��m�e�u���uYY��f�l��xp١R��:��>AM����qm�ev��Ճe��	P��9���RZy��a�4�B���.xyo��1�Uؓ'�,�4�2�)�9�p����R���8km�x�Y��'әK$�q;�J��W	IN&a�^��!D����X'L��5�G5[ZZ���z���?�,�k'���E������2�6�y_�U��I+�a�9�|l����l��<Zn�WP��U~S�L��xu�@4j�ٚz�y1��0�'�
�,:��,9�6�얅�{��=焘�$7�8�1#6x"�#"�K(�C���Ǔl�;ȅ�SIrvFsm��Y !�U��J�wv?�٘7VF*T�b˚+�,_�]�T��unMm/��Z5�iJ(l1E�:�U�/�(�#��l
>SUj�3^�J��{���XeG�����8�k'k�.;Rm�#CZ�!�TY�
�U�ʇ��?�~��E���v:�!ĮځM6B�J��d�&pe\
�]���^��j�3n��7
��l^��'>��>�������S�Q��04b�b�m�=!�Ķ�y��X�����獽�Ld���t~��/���7���x<cw�"�Ҫ�-#���w��)��Ղ?�8��D�5�۬vت�qX9le�Q�~���(xX�co�8���%�$�E�A~9Rv�G�����T�s�^E���<qa��
�/+~�����+RY��L�B�k.$�~`"�"��t�!rB��D�[�cNH�Y�KbtBG�O�ub@D��(Q��'��lq{D*�2�C�V�#eW�₃�3���%����8�%�1�|����\��xk��Fs���֗�Q��
�Lr�ώ��60�7�+�ߙ��Y��݅8% ���L]��D#�PD'�'q�����U]��8<G
�W�o��`���
��w���=�?Y�qjε��YG���H<�L���.0/��CJVn�V�mX#�I�:֗�V�^7�U��mbh��AR�P>\��…/5֑����̱�lҪK��1tvf*��i��ӆCޫ�X�Кзu�Ip�ƽ.�'�2n8�M��.�#��~�2�S�%�k[��NH]�����-x�&�SV���9a'<+=Q�h<q��5Ix�?<�XFK�lWv?�~�� y��֑H�y�!!~��WF��4=	@N�z�o�a�s��x�<v�g��7�����XY���Pz/�W���"�w܇q4Nf�J)�6e
�KO�ԙ�:�����[bx���~b1���iyc;M��Kͺ��w�*�R����5`J'��
3���T@\\��K��ڳ��o�I
�Ur����zb%���"��J,A�w|�7$@Ŗd�S%��L�Da�����qA�/��h���}9�!���U���
#��+�«�ʔ��t���$��2\���DmP��O�o��j�_�^E�5���U7�5;;�D��Bb2`7,�ePS/F4Fk����a��PXC#(n����e+��L�#$,xc����	ʟ�͖�!<�_��fq]������ ^,Lϗ��|��uE���^�g~��R�U��'y�*G�d��	>��Y��ͮR@�*-��qlS����k]zr��8�F��CFUǑ��=ӆ�Ô��ƞ�0��3�j�r���n�����F+���/��ћ���/��n(}���H�]5�[�ݳ2{Xo��v
S���%��I]�NZ �������#�Js�	*u��@��~��~�Af����ѡ=����͹;��
�V���(mO��%�ot��S]?x���x�=~|����vл
gĊu/B�W���;�_<�;�R��_b/Wj��Y�Kb:\��<nu��h
i���[*���������F��6�7L\>q����*�;ZF6��Q���m�0?�����ݶx��Kd:�
~��)!���5xZ\��U�y4������������e���6�F?cSu�����K�:�h5D��&����P�����y��{���9���4�N����U�w�Z��Fr�A�"_�G��+��XgT@�ad�I��ڇ�t���ֈ�4�	h�Kn�{
��?���Te�EAO�7��
u�kT�
�W��g�`a�]�d�L��:G?�
r��1���y�5�x�����!��T�!sx0!2��këP�cr�hM�/���}!��C���7��!��]W<@N����dQB�m[h��/џ�����6"o TȝW����~�Z6s�U�Ql�p��P|�RkU\J��/���#���T<�i
��t�赬ˏ��#<ՙuKX-q�;�k+�Q.tJ%��[*d.�4B>��d��)�GJ0�$�@
ՎݧY�\Z]9�(�'�N&{c2�tY
X��h�T��F���;j����e2rӿG�W��8l��J�d:�fn	���������_���Lc�~AQ;��0o���y��b���g�<d�[�ʙ���ԏY�Ӡ���P��L���t,kk+(V<���5S�E��=+E�:`�C�6������3Nf^�\�4N��h�B��@�TF����� A���h�1_��ŧO�-�BS=��Xl>���S)ůT��+�Ѐ�=yGzz��0Ev,�-
쵍����s	"Fq�$qϵ��TQ��`	KA8�Ap��)Ѹ<+8�/Fg�c}T��u�j�F֓B�\z2���>q�ШI��ȏ�6�{�|=�թ,��̤%ذ��z��15�����5n�ܰ5���P�"b���(����tsYSO\pz�4�L1�ϵ�*YI_(a�/8f�!�6�גn��Ea�;��̛�=j8e�T���x���W�
w���rq�,�z�k�w��udI�$�2�Y۷��DO�Tm܍=4�Vq[&�Ԥ,X�&��?�k�۫�]{:�ѩ.��?�Л��n�8�𻚨�/|�QX�a�Np��	k+���~�}K����������x���k]��[�F�OP��
Y�\�GiZ0H���:�����E��H�@1�@Uvl��]�5�<1�:���›���Z�e�gs��Gh,ϴ�B�W;�o��.���
���C-͒W�-OS����+������m��NV�~� ��}�(�=w�x�ŧ����i�l��o�6O��0�*{��]���QLI��֫��
�K^�e?����N���I-��o��;5�'J���2�D,F�g8�����{u�2T��4�f�N<�}VT:U��E��'��5��=�3���Lk�׮����e�d#kz�͐ff@����oQ�X���&�j|�J��j�_V�`�VoIhI�t:��*�>�K��`��"6�,�0���x�������$e�#�v�1�d�r4�Ul���,��ո�-��b�:��Ⱦ-���mG`̣]n��*�u��e;k��d���u�C�	�5��LOY�G!����_V�ю����+&bRB����Q�:�8��H�N,�g��$v>������9�F�m>4�-7�}����G]f���K%#��(9���9@��~mA
`:_���8��L];�
~ᨗtS��Y���F-$��������p庹����HM_3�L!\Uj�[q��,}�E���Q�~$��C�'2-��Sh���U{'b�eG�vL��>r$���{��`���T]0�r��RЈ/\�Nʂ��/x�8�#��7=��Z
8ė8�#��{��?C^3��b�_��b����/x2��cvJ|b�%\9�����戍=�}��32rOf7/�*�3h~o��|��-�zO7�^�-5�cu�R�Gp�d���#D����1�W��Aѳ���6sX�����^!�0���-����Lt�+(�+�/��ρ��(=G'�(����+�`H��Z$AD�n��QQ
�	�2�6Z��5K�2*Q����4�s����w�t︴|<�x����%�ʩ������	��A�Y�׎��?�X0�[��6�o)I��_t�P\A�!@��.�� ���,�h�,����ww�eqwY�Y����{55��f^��7o����V����4X�vi*��/E�#IX�Wf�h1�@RL��ּr�l�2/Hй`򭸞����ْcBo9�&��D�#�nt�ġW���kja�˳�IDP�ő�I��Nw+��QN�\�̃j�Z�Z�8k��hr���9WA�[�|�M�<Y$��o�<5<�h��'��$�j�vu��ũ���(�ѝe�Z�w�4~�͟�k�M*���W�k���')k�p)Ԡg�G�D�\�Yz[�㏧8�#�gx.+�H������;�Μ��?���ݩ��,��P�o-��b#J��v�/H�t��l��Ë�?�!;H��ڰ�B�K 	Y�ѪUߺƩ����7�7��%��h�� ���k�FR��� ��~�!��Y%	��uŝѻJ�"Ce�-{h_�4��aaN�wSGٽ�]1��.8��-�G�&�8Eƞ��'�[w�o��w8õ��<�'���GH�S=e���"G@���+�o�k�#��"͏@zy0�謅���痘���jQ�[1�r
��0!H-�����f�`�M���Dܕ�Mxx�`hk~�]�jC�4=T��P�z�-hkm=�(��_�;����(1"�F&~����3kj?����*aBk���nzY��oz���y�����/�9�-_?��N��;�9$&�_^F��xm2��y���C�\� P���܄Vc#q�-s��͜v?Z���R��dU˙���.(��u��rM��I&�3���␚�y&B�m�wJu�uw��U��E������N{�?�����[xi�o�cK�b�V�k��
���X#5AC�Z�*�c�&�V���f����
t�x�z�"m:����d��Z���dU#�:�[⋹Pֲ�0Ž����-��F���K�vtZuO��6��9�c���#.�	^�\y�K�#GvȢZ[c
A��d�%��=�Q4��$��l��eMu���G7Ea~��B"��fg3G&�C�+�j%y�)_����A�[jZ扡���i���\*��Ld��zӞ;o���{���ˇXK�4k�[���%;.�
���Yɓd�#�5��I�I���qW�_|T̛��h�ǿ�[0�\JM]`P��ě�Yh�y��T�5�c������	��ke{=�AX3񧝤e�d%Y�8�4�>M!z�ٜT��e
lp,���?�撚`ݐB�[�������u��cjq�i^�Ok��P����m2~��ލh���b���C]�2|���Z�9o:UZ~a��-�d�l��!�~qZ��(Z�5^
U�+��O:tr*�%DW>c�Q�\`�#��.-��0m�)e�]�)��bҤ�n��"鶟l~�RRY^%c���p���y<?��~��Ma�J=�V�7z�z��
��la��{S�~�Px 0�X%�t+MwEz�%�ŧN�]C��|e�{�؄LÐ*�0Ve����܀$lQMtNF��A�JYsR�j�H=*��D�:U�� ��*��VB*J��L��B*MӂGb���!)�����Y��w%C�b��+9�G"�"�x���C|��wr�^+#ڪr�J����}Ƶ��H�X�������e��AS��Ze�F�v�u}�us��\
V�\')�	%��~W����1�	X
�Bui���+���1\��ߥ��O���Qj�����t/n��-ę�y��N,�$���,<��m�X���i��y��_��yY�و�>}����S�h�i�<C���m�lT∲RU�KT��}&yS���X J�`u��u����F��)13mb��o����ۄb�\ڥY�}�i�5N����x-II��>�E��~��\�`�:��&������?��r�^�z�ѷ��{���m\�{i��-������@��L�K�W��Y�ϴ�;P� MUU�gl�;�.�pN�Og��wq��q��_��P˿\�3Fh<�5mJ���Dci�n�tR��KOMp�ﶊP�ry����k�@cE����eJ}�K���j.���lh����C�4�bw��$��C��4S�w����Vk���hE�ZS�D�D��p�wR�nT�|'��!�|�}_��aC5V�
q��J������k���ޗ���ӂ�����d���iz:6�����cD���-�fr[p&���g�oa*�b�w�"G�.�#�k�`��Q��~��kd��F~6�n%��@~�
�IV�2lE5���U��'~�]@��HZ0��>�L�����[o�-�9�>$m'���z~�6�@F얖�`�Cͷ�Wj@Џ'�%�����?��8ț�c�[�xeK���rS�)@�����e�`{�P�M�^�0~��)G���1�)�WhksLI�T���oұ���y�
;��GUP�g�"-���DOaD�. �#�^��A�����ӈYC�O�r��k�A�;	����n)>,i��C�zՂPT�v�K�;ܝ�¦^�A17��ޞ+U��S���:>�V�΄�A��Ϻ�W��!�ʖ8/����<_�}�gF~��_(�9�e[�)fQ�a��>���+S�,�L�0-�mFo��A���&�P{U�I[��+G_�ŐҤ�Fn�m
��(�$��M�7
���g�HFd=�<Q�����FRڳ��i�d'P�avv�>�	�FxL��5�N
f�[� ����	e��r���U��I�hӁtH��,>�F+��~R�$tI54�PW
�wPWg5���O]�@Q>M�xuV"<��.�46)Z��L��~��zK=�.�=��ze�FU���+��4cYc��7�>Ĩ�bQ����;��5���>������1�"�E?�}�%]ȗU��\�^�gU�����î�+��%	t�O.������P=�e�g����c鑶�`��x[Ҡ�dG� �@'
ZMu!�bi��2�v%lܶ;�Y�w���gkF�É�o���	?�V��V�ش�|�8X�r���nF��q�⭕�I��#��3��V�m��m�Ns�,��06�|�t�Į�0��'��1t�
���n5�ך�B�Ղ�a1��h_H�)��N���w�B/)¸��%2���3
,�$�tM���¶�>%c�B�
u]�qr(��j�~%q��E�+Z���;��)���8�3�`�(	���`��C�&wɳ��n�0ͩ/:��}+ǹ�Ʊ�#���zj<'(8S�yC��]�@*���;$���XI���@��xu��@�Q��A>�$qd�?��
��ϸ�m%b�!���2�-�+�����l����Q1ͥ����?
�hw��WS��U�u#���^9o1��R��͹TX>y�!�T���X
����`5
	���-��I���x�F�X!�S6r+���(8��S���6L�[��K�S�:O���?�b_����|�#�
}r��<dh~BC���0����z�s4���q�66XQ�%)��@���}�����)��?ybY��4�����9]]����届�]dp�S�\f����\~�:w��XD�
S�Ւ,�[Y���2d\׉�Z��c����A��2�ܵ<�t���t�_)�-��^�..�>�H,"p��$��,������Ŕ������+���W�[hlϲ��3PP���l)����ݲ�Eꆺ��
�l�e�7(�i�[j���Ad�zE�ECʇ bo����(�f���
R#�����~�d0�pK��Nۅ��P�z��P�MӤ��_+�l�Y9nW�XQ��:K�"��Em�D

`@����~��!���y�ЎT�i%�ze����1���cT���{�����j��8Q��+8�^u'A񅵝z��0I]I�[i�e�Kڪ��W�ʏ�ڱɣW:�e�$��C3J�_����+�D�-A������W7�y�qJ3�3B�j�UUjo�������4a�t@e>����3��������I?�ӻ���25h����8!�@���L�'�%z��;|��n��0
�Zx�TZ�ea��+פ[cM�Z�yZ��[�,��}I��HӪw����=I�kgb��'�[�%cD�M�HĨ�8�?(z↻2ўY��Q(�r����bF�F��OO"���Bw�Bw�BwXBw�����?`p��e��_��w
���o��셿W������"�t�`�c�	n}�ن&c5����&V��,g�m�ʤ��;�W4	5]k1�|>wQ9FhJª�ǭ�����+�t��ޱ[��>��;��iݢ	�գ*�H�%�QAs�7J)�F�sf�~�T��L��[�'Bx̴�]�l�$B�~��bIf�~�Y{�@�2W{!֐��[l�*�Y�waG��)Αh��8=�5�b��Ǎ<U8����4)��v�0��=j��Q�?E��5~���kOKC��<�~=Hs��ō��!w2�[nrNX#򲥠�~(��X�7i����6��t!eP�é]�=�bi9n9����AiInI\Ho��Y]�� �DJ�v9�8���e�i� ;��_=���f,~:lz���ޝX�j��I�H�P��|c�E�AI���\���d��J��,�5saB�kI����{��d"���Y5���x�$��?�A;"FHg`"�dr^��R+Q��~S/���Q
��?#:�հ$F��2s���
{L��o�t33��R�RHu����Whp�u�NI80�ː��n�9�?©��_
Ü���T�VY�'��>����1�Nx۽��
�0�,�|�Ӻ�2��$d�5X*��7��N{�9��8L)�'��U��2S_C�ױ�RԳGv;�V�v.
F��$�W5o�j'�3�����`=��'�O�W�ӻU¬A�r�t�~���6@P#j_������e#�ܿ�ڶΛD��:Uʗ���5ݖ��:�T���ȱm��E��^�SG|_�����s�6����9ۉ7��ɬ��BP�IEi����]�����|���"������Y�
���IM�*�3<_�&����7���'�vl�\֦•=
r�ʃ�z���#��ioA�(r���H6K3�>B�8��5C�:pZ�� �f���Ȣ�wk�مʉ�׌[6�M=~uV��7�Vܳ�����ػM��p;8ü�3/ӾGC�PJǩZ�K^<�X����gCt�h]?{�U��3}v��Q9h�k󇩩:R�k�7���[7R2n[��[L��J�����m��
���l�i&�ٯW�Ϊ*�Dt7Bow��ؓa��N��E��J
����KHs|�W��F�!�Q��O��+�~�dW�ǿ��Qi�`$�� mL���㷴�ɬ�e<�Zs�zc�IMl<���0u�>��{[�鬌o����(p�M~�!���!�R���4k�Oh�bv��]��L�M��@��o�='�/R��O��@�>��G}�Iс�����ad��
�	��t8�)��u?cX�G��>Z�M����^�.ߦ�\��ő|���Y.%o����Yo�cc�n��tH����W�f��MiE��cx<����9ljGw=��٥�4����ެ2�D�׷�SSh�lu$���{�ML�$7���ۘ�ɷ�X4P��*E(#xW���(��v�G�����4��'7�����Bt�Mt-B
��(F�T��܌r���'�MG�
y]���z����kGz~@;9��XW�$�_#��>��_K`���l8vѨ���ӈ)JO���Պ�n��I�n$��Ȱ'm՚)��	$Q��V�5�$q�W/�Z�\�Ww9�/vM�5�V�ӟP��*�������)��L
XK�o�u�2�E����s7�oڪ����?7�q/�LY�uy1c|�:3��.���xֳ��@`�$�J7���T�d�j6�e�Q9�P䝀��;7a_"q�6=�6�+mf�Y���P�'��הW�Xd�U	���F�x#���/} A�GGI߫
<\gĦ�8m
V���[J�ܰ�X�ݜw�c2��bj�5����r�����ҟ�Oh�M2O�*�B����e��U�߫P�%��;���n�(������k��#���ƻ��
��W�ǻ���A�W��Y���~��og�_>e9 Y�be��^9l�;l�㫱2����2�߄Up����Vl���2�T����"CJ�'���){��}E�����c�KZ3�U��4��j����S]R[���\Iɦ`�?z��*!MAY��#�EXbI
"{��t�FV�V�%��z�j�$����D4iM�nn��l�Th�����Y�B��å�l1W�
Cx�W">��%���+�#BgF5���c<5Jy���C���,S��g{�C@�.&#�V�d�)���D�w�j��~P, c�M�OZ�b
����\j�N	�w�ZO�
G�'Hg.ZT뼅�΃��}�P�PD�Y6b��}f�^�k ��j�&�1:�:x A���}�,@Y�[�>N꾿��H��EF)n�ϫ�FqqxC�I�*� tT�M:�Ʊ��Q�=�c�/+A�"��w��".��*�u�E�nl#η�U`�U��ȇwd�yj�xf��O�p*X�L*���z�9B�ф���ȏ�A���f���I�#���ҌQA�
O8,��:����u�u�\��nS��1<��8<u��i�H�u�u�ݷKT�k�d�s�E��/�&�������6�r�O4}'^�	>��uj�5w"�\6�K6���2��R�j�lۮ;$�4�dȃ��k��}�c5��/�-op���\	��?��֐A#���t�|#���	qj��N��g<�	L�
��BN����Ӿ������'��f)��ꌺ�M�����e&�ʬ���{�J�i5�1�ψsAt�,n���Zz�B�V[)[�K{�)K,n݄��sFv����s*��&[˾z�N�ZS�%\�?�te3�x�4�*�c��$����RG�-S�w��g��9���A��FU�I��af�&>G���ǩ�u�,��>�R.؁�ԛ��9od;2��_s�@�mSw�y%���Ͷլj�����*��TCU`���EP�`���(h\d{`�B��:ԉC:��TU�{O�[����h73�f��$ņtz[�)���	W2#[��cC��ra��=�9"}�(�V 97bfH$�[���Y�>�k�S*����h*r�4��o���V�S��k"3B�x7�<�`�bP�\hD2]�7jUfR�@��D�J15���#�ۋ�؎���x���QX��S��n�|��5����3�Ka>J��h[e�WN���׃⛣G�db�w��{��q�xFY7ub�+�t�ŕ{+�qO�7܎�������#��?����9���y��I���{���H��:���_�D������t��lB5�BIeu��S,��{˼e��G&��O�gh��Ft?�,Z�vS���S�΂�?�=�ZFg`��w���2:�{�ܟp��X���_���˵����$�߼ɝ�����Y��`ي(�P���@Kj�:���ʭ�j���`�_�Bz�~	�ӕ�օ��\�$41_x�IJ�}���5%8��2.�#R|�`��7+ձ?�K0ل�4S��A�ݩ��Ai�������w5]wC�wW�^���tQ��>�I�l��}��A]a8�s��@B�uDY������X�5R��&��yr��aYٵCމ�ݙ�ͧ����a¦����'@���9�WnG��u86���i��N��#�y%p����,b��R��r�z7�L"��N��@_�/�责!�����~ά��d{̼�3�p���1�ăi9pǼ#����c{R�����H1�f5�6Cp�~w��P-(]����J:3��Ι�x���N<j&x.53��U�O/��׆a�wj�X�;����;�`"����LpN�M#}�w؆�s^��ɷw� IM&Bat1�t��^
Ph���S{Q�T$�3��5B�e�d>�S]��~Ep�-�Ŵ��
�[]��Z�Tg���D��R�+F��!h`ZӋ�#HbYUܒ�!���S��A���S���OpVV-���h
�o��i�n�4U4tJ.@�,��
[�8�u*\B{S��	�Ձ�z���2�\�zЉ�D5M+zA�8��^:���Xtbf0S��NW)Wa���^Aȡ��m������ZzK
}�]���٠�%�w]�ɠ��4�$�}��
��'�ʿ��d�]h���E
��	�r/�@�̢�[B�Z���+B��I1s��=:�0�w}���`��5�B��lPva:&��F��Unݠ;��M'X/� �к�jbiW�B5��Kme��8i6�o��o�ES��8i�z�֫.A8,~r[}��j�ŽC�h U?���l����}�d'������Oz��U��u�o��5�h��h^�L����j7V�N���}�"�?Ê��$��ˠ�q�&�5�48]g�U�ΦK
}G��&X[� 4�'omv�X�ހFof�^��ٕZ���u�NS�ң��?�~�Wz�K�[�r��B��vE��aӾ}���<nD��m��h�^���S>����G�x\
����|Q����:��P�'�W=�n{����~D`l����FYi������4֬�p��b�r��0��D�!ɔY)�R>��o�d�=�8VR����ų�ơ%0�ѡ"p�m�k�1Ie�
�H6IF��2�7��ֽ��*o�q��LWo@�_#�b��j>�n�ĩ�M��[�&B#קtĞ�'9H����=�8)�!��D3�q�3<5V!���m�s{|£e22����c�oM<�JQ�`wz�x�G�G��4����+4q#���?Z�$�=�4Z�j����:����۳�~�V�=6g��kN��m�I����D�ۘ�(k8V�͟��9��͒|\d�J'-Հ,־=�_�Yי�P���J�"�l��؈*���M�b��(��	{�����w��Zf��:��R�Q*_�v��	��l�"T�����+&l1*�2���ˏ�Ʈ_��YN�W���ʽ
����}�����17e�/�<6^�?�m��"|.�j��I|O�\c���|�}߀Ӆ��to�Д���,�y�1�(��6ۑ(b�S��*�f|��lo6�nb�))J`���3��������{�_H��n��Ώ�/v{M!�I4ع��^B$��L��3�MƝ)���_����o���y�$��F��(�Œ���b��Z�����ԯ�î�\[��+��E�MǼ��ԡWA��1`�(\_|.G�5��BZ�"H��jvo�3u�3x�K�:nm�
ǚz��[��[���w��9��2�IF�O�	lj��92����B��G�k�T��6��-����x�#���ӗ<����i><ܸ�:.�ǫ١<�OBj�!��f���Mܟ!+K'S�)L�������/���Y���w|Vg��6ʂ�~�+U*�G�h��t$.q��j.sd(8V��kZ"���$�i�*y}qV���j�}�?W2x4K�'�]J�9v��R�U��~��X]��Cˌ���쪂H�\��GV\j�j�]�Z�Zq�_:��Z�p�j���
@��	w{�-��+k��H�A��n�z㾍��D/�}��_�,Ѝ��OW��a-��1`d�K^�`��>"�*���,Ξĵ��Ψ^�$�O6���X�D3�K~����G~�rƔD)�Ba��*�2ݧGwoP�-|u��q�&4΍��~z2��8LMS��6Ȟfi���>s�aj����x֣`n�wCk�`E���!��azd�|<ۧ�BaGn����u��\
�6�ڈBӿ?m�Ѽ�r�BQ��ﰉr.�_�H���y#�f���:o�{�֭��S6Gly����:�I��=�?p4��v�������d@
F��m�6�:�q���iǤF�Y+�or��_S�_��f��p��z�����ݷc)�Aa�9n[�DpЦ�`-Α4��-�g��\4��̨ˌ6�I�3������Tο�S���)����i�>�[٬��6��iQ˩!�U��B&���"b�y����ҙp�'�U�"SFqt��s���t����o��h�3��y��-���BH���x�7-d��n�Z�Kÿ�)�'��/p��Am}m��q�%�>#�D��hn������U$(�XMM3VD���0
�W�Kg���N;e��y�]:Y�9�M/�`{��;a�;8�p��sST�-TI	�]t��
�]�ki4��}1/�8o"3.{���\���'վ�����k8�q��r+�}�@c�u��ݶcr;䀘�p��,�5cx��K[q�<H��Uvt9�8I��7��j��9ڳ��&9:�s��q;��Os���׳m��ή��j,�pgg�$71����9j��"�+
ϏH��ŷ��))��s;={��C��5=^W�����O��H�n�[14�?8ڀ_n�������ox���/Z�@[6��#�Q
�r$��pP�eΈؗ�Up����i̘C�nI&���!�%g>Z/]c����w�����Q�4�a9Z���s
��E����BҀĻã��C���F�_�6����Nrq��|jhT�ܪ�,�)���{C=yd?S$,	x��62�w�X	�r?/E<2���	eJ�P����3eƱH�w��21�Is���K�%0��yf"W*|��F�*��܉)4�B�^�!�����B����jR��(�ٰ��=���f��$E�(|�56�yK��m./�C��TKnm��Y"Fq��@v_�'	���>�B/3�z7I���·�(B�@d �g`�f�86#D
Jm	��`Dg�f_�AB2�Ց����H��a.��̔^����(���5�,�-i%��F�…Y��>�����=&'�oc�a�<%�لM~!���<`pa����E��}���2B����6��l$�#B���x�o��s��$\�GP��C�|sƾP��9v��y��6}��7���|�X|"��]�M]ǘ�!5��j[-�o�a�Z���LPβ�=��]ZEK[�b�a]$#;����~�%�Wk³�.
�e�,�h[\W�]��&ŕ9#ȕfLİ�yE ����V~�;K�1��r����RT}@2@ը���%�|ߎK����G��$�rX�!�`�{?�'�oN�M��G8X-O!�6�׀�	Z"B�{b��?.(����œ��um���)�m��sN?�G�y�)'��u!�$9o�/�p��t˹�>�����n9_�x���wۍ ���i����e�1�͛�|�C�CA����	�f�<X��
�U����"������" .�&*@��ـ��a;3spA����~��'�O1�$�_:�R��F��V�������tL�:q����pe�^�n��_{n�"�qq�p�7���g����R�4��G�7����;XQy�G�a�&��7��?����g	^�a�]%���8ۏ\w'8(�LR�J�*GpO7ް�U�c>6d��jU�O�_�d�$𖘘��R\:O�5��5r+Z�8��/�C+}]D�߽U��
�ٍZPZ/�65��o��JC<&��>��[�%Ĥ�0��>ݰ岫��7��b��K��%M�r�'?���bb\�1>��<{���� =fD��YO0��w|�3oM���]�Y�S|ԛe�{����_���7�b�WLU��d6'�p��kҾ`2�T��]wK���q��oxP�k���u'�âS�"Pw�0#�vM����Ra��~wy���FBDH��'�C��-8{S���ۀ��@S!��a�[�&�t�9[�}���Z2{���:� ѷ8�u5j�	a��o>��[�g�� �\�TQ�P:8m�;�x`�G�wl��NKq�U���5�c�ZWA>�h܃z�v�W9��De� ۻ4��	�;,Q��BB����1�W�]P}�u�s�Q�h���;ud�s����n�{@}�f5
�;�B��f��;����rM���p=I�%z�e�i�8��6x[ذm�P^�jP�PJ�?x�s\0���ܞɽj�^�c�@j���8D��A�4du`�F�2K���38�+f���*~�(�QO��O![�T�
�,�!No��V�'��ΣԸӿ���U�LT�/xi��{���(5�<�C��-U�G�\��6_���#:�dϏʕ��1��i�S:\A؄	��NM��3%N��8���ɤ1�q�>8d����nU�~5�
�?F禟�sw�y���ۖK�w����D"�Ȋ��7*8�kz~En匣81=WeI��Z1I{�{ �'��qXv��)��:�j�%��#y���R�YY�BlR�K�������βZ��H��Z�u�F�T�nv����0��ʲ�o��C,�т�S��}�`���Y�x�{�	��k��2���z��?\�>�b�����z}WO-����N�ֿ�D�-FO݃�&^��Gq�w���s���!k���t�|�z)�Wl���������Oc�XX6�K�"�	�c?��q�{����E8쭩�-�Q��$����@�®�u��y��s� �"Y4P���F��{�S�҇
�R�SVϑ�U�e��j�>6JY\ܗ�f�Z'����'B�3��S��;L�T�g.3^S�$�p��KX[��ؐ�v$kf0d�?��_AT��]%�Q�(}���I�)��ȉ�&�~n�Xs����d�`߸��f��q�U�9�[���(е�{�)�G�u�Q��g�n�^�qAY�3m�B���p��W<�!��lp��1��n��.�iF�A�'��'�ƻ'�Wh��o�xt[Q�	7v�ѫ���Oл�b�`�vN�Kd+��iMԏ��P��^�$��A���n�qn��h�\���
��o��Z�X	��Y��|�0���(�j�\�N!т�x�{���B\)�^��=n�pǃ�5L�5��}f�Q%fK
=2���6m���bY�mXs����f W����3@�=B�g�Q�c�ٛ��r����xJ�m� �̷ny�3΂���l�;��
��?3�,�X}��So�N(���	��&b�s����Kx͞gI��=�d~b����^��3�0?@9�
#i�1Ԃ�cˇZ��W��u.���\V�����)Bn2��U�(긏

�����ٷ9ئ����M�!�ő�G�
#%���8x/O�(�
��hG�$~$k�`'���t�b�0oܿ
�Ͼ�iߌt�}Cȷ�����*�Lu
L)�8�B�ʭ́ա�$,�sd��$�Ӽ|�5��%�kf���|"�H&�]B�l��`N`k�fa[�̩�Yd��̩�uۛ���:x�<��F&sj����s$�穜������`�`�����a��30qp��)�x��t�,=[
��F�Z~�by�2CLj�y+\����uDcJ}�#P��&]�@`r�Uk�6֝>���E�@)�E΀/�Q�և�0.�",��/j�ǓQ5I�B�بƛ�����y���T��0\0/YVms�,��}=�j�F��Z�S
SC�٨ƀ-�����}DѦ��}Dі~���l��pn2���x
Y��h@fT����I�s�Ή����>�QM�Ī�
�CȌ����Zd��@�m
�v[xXu�"i�W\�o�H�ʯ5ԋ-��~�l�Ȳ���n
���n��m�aH$�[R8~Q��lY�X���X���4������R�-��2R��-�k�N��}�	��PN�JS��PN���{u,c]�w�P>?G��`��9�bО��n0�l?�WMV����y[��\��}8D�#�,X���Ip=��z�1�9���{��c�g�xA�������3w�*"jȽ0��Q�a[W����/$��_l���}ƴ�^�>#�Noh_��6�x�D�_Kw�>q��'%�RX��%�����/����s6	��{�WU7��)�^`�Eڧa���U�� �����o8���o����22/�|~�ʫ�`z��D����a��"��Դ�y�zi��:��_UҙwS0�_�uBa��0�,o�Żg�Px�ܭSOO���2�N:{pݖ��ߏ�OjB�9��Ѷ�Ɋ���z�x���I�f���v�ъ��zN�p�T���@�?a�]��1�_������
&�~�Λ4�����&/%�#‰���ǭ`��Ԟ�n)@]��̀���X1c��UO|o�^��֏��l�7�I2���bpp�l[��9�`�$��)@)bl�p�T�qRK��R{�Ps��<(����ז �~��@�??�=�a
�7L8���q��x�S�u���S�]������^J"8\�o���"8���S�5�
w�x��3��07���z^8�c���sVZ�n��_��@:�96��cJ����q���?��W�w�����VL�g�_�X��a�m�Pz���w2�gl㑧ܫ����*=�°�NZW!�]���)��aO��2s[/5����x^�y��T<^�2.�P�F̣�,�h�|l�T�$�;����
�0�3�=��-��aC���ԄE{,������[GC�������<k�X��Cj ���.�}a�*j�J%L�:�6���:Ď?�o����4��Q�c�S�H-b�QSuK-b����L�fß�R4�Ӆ^Om��	A���|�y�^o�3v����	+p�vQ�x�&��~��Y�&AB��x�}\<;�jF���%{��\O�g�:�J�կ[���Ҋ���-���K��y@1����ɓ�R"���与Q�u�l�ȇ����F=S��x�"�8�*-C�c��Ġ��7w�y���<t|V�Ò���[�~��,~���\�D/��j�\m<�:V��ͣEI�3�5�=^(x
$f��ρ��]�,o�A{�Є��u��D��^��e���^��A���^���y�ӞtՍ
S"IW�y%����R�1긷Q�J� i�+N�I�l�htҒ1��1�g]�Z�r��lv^i�K����pW����^?F�G�.��e_����Q�&���Ϲ��%0����a&�!�1Ƙ���
��KR��#F�`�[�a!����������2���N��m6X��8�D�-%�[Y����x~�@x�H�d�Ϡ�w���!Ey�@��M�|���M����M�E�fd߷�&��=�)�~H�ȟ�;{Tk�/�G1^~�m�;�{C��JLtD�6�k�src�F)v-HQȘ�wP�ү������-@�C�W�NJv�5�*
�'��״e���e��@:aw�UD�Ol��^����һ9�����j���2�.�����o4���ja�ji�En��Q�PQT<Q<=Q�ePnw�W���4eP԰��k����ow��/���WV�A��|����l�ȡ�z�K�͛%�Q�A=�ǭR���H?Ч
=<H�?~�c�9�������D�à��g�!Bb��03AB�����#4(���h��+N!��ES�r�k�l�Z��h+�H߼�߇G4��|�^:f����P�ES/|I��&�<���������R%}JOw?�c0屹�����н����@�E�U�����S��x��UW�j !P ��J5�#bB��<&�������Y�<}���_�9�"�brð�&{y�7r����{98a�wf
n���B4C��DѾ�j����I��.��K9�XA�c5TZ�|�bW��ȭU_����u���!�k%�"��Am�qO,"3kp�)��ﷅ��M��J��O��o�k��:��mۦ�T>j+,��
||���aE!7�'���F0f�S"���1��L�&��d�˷l;K��9e�o��=����+P���|_����Xoml	]�h���x��Ƕ�w�tG	��#���2�ٙ�MBq�z�1�f :��3�+�nO��/JWБ��h���s��fT�ꞟ�R���
�Q}��~
��z�f*AH��5�����S�8���c��k�To�L̶.���ti�"��S���{���;���|�V��������r���ñef&���+��{��cﭔ(;"�-$�E	�ȈP���(3���'�^y���������{~�x��{{<�3��^��)M}�J�F#K��c�N{�@����U���6+e7�0x�հ���^Y��~*�p��5�@��l�B�,�q��N:~�!dȈ`,��9bk2JcT�q��М��q�s�t�1�̤;?k�xW�h2�t��cRS-���X��o�J
OD���VR1�m���%MP��G�Q����w�czt�=.;�o�~��ٹ��B��˭9�5�d��@~�����C�#ж�@?�X��Ї	axvɶ撗�^W�%�Dn�UQ�_����@��\{�m<k���x���Bĉ�{�*Rx���E}��ȿ�����s4scI������/m���o�0,�d�R��<Z��xj�{�[��Z��9	M*8OS+���Dy�x�So�����`��֐����.�C���ɰ�|��:SY�f�Ƶlw���g�H��D%�g�m�{J����i8/�<����[$�3y�n���X���-~�=�@b��Zߥ��������E޺���>���G�pf��R��f�ݿ��\��e�j7G���V��eP�g�XFܱ�EՅ��s����b(��.�L����C�:lë���0���B?�]�^����^&s�%ǚ�`Nk�W�܌niS�:�68_��W��oX��7(��6�P/:OuE��� ��dG���c2U���Fr�|TD���$�o��Z��K���#lC�^Y��s*��-�e����0騖}%���7��E.��n(��ؑu��sF�5n?��
ׁ�(<����lͮ��e�-��T�*l
�Z!n:K_�_�^�rn������I�X�N�
��O f��e.|�B��|�9��`��s��\ԓ3ٳ��w‹LV�坄ޥq5����f]/�S |'A[��X��O6�?8�v���i�ih]�c|d�ң|Xn��?.���:x��������5M�[�W)ͩ	1��?Ҵ~�/��ac#��~�ވ���ò����]೵�Z�x<)�1�<jC񈇍�b�_L�Y�E����4rK��.�����2Ra�
3�t�yn=��Z��X�G<�`fq�WE��P�
/־�_�~��8ŷڞ���ԧ�ћ-瘫V�e�(+��8��P+�Y9�բ|ע{&5��c�	��
�:�cM��
W#vh��Z�K2��!�r�VYR�e?k_�Ľ���OP��!�'Q�=�M���m��=F���-|�#I] >���R��CXM�ve#�}m�U ����)������1<5.�&����z?h��?�
�C��b7�g
R�1�����&J�Ǐ��5�J�Q�Hr�
�hy��(Y��kx�T��!1V�Cͼ�K[�fR��ը'�pi7:&�Ȅ�,�m�SgZ[+B#�R��&�s3ž��ɕ�?QUt���L��;7���u!�j>��ߗ��i��=����E��'W������MS�`a
�5K�m���Zxͯ�r��/F{����`�
Y���]�THt�����5�O�c?��x+Ť_��Z�<�9u�ktGS�R4�K���V���g	4�n��l"/�2d���Ζ���u%�09MM���x�۠��u�M#��)�Umu�`��vʹ�BO�߻��>�oY�&��{�g���z�O}a�x]���NUd�t�7aZfbZF�;_�b)�x=�3�:pg�>�\tqѺ1瓏�yt���w��Zi����쵖�6zi6>L��ӏV�Ͽ��o?6U�u�1m��=ʧ�d�Y\������+�~��X?F��w�cf�(�	ͧʣp�r�>kU3�g��Wy��X��U�qa	,���Z{�ɽ��a~c�-�K����a��14JDž�1�NO�V��G#�%�u$1�F;�"��q:EL�v6������dJ�䯌�&�)F߸�r�x릩�)�8�O�y�5RG����N�!L�J�����F �vLD�0�NgT$˽4_=��������l�|�"�^�!�ۙ��{D\�uِ��Z�h�ɿ[*¬������-^���'B�>'b5�-����`�_���UsL�y~�0×W���<�<P����c?�Ƴ�+����>u�H��#-�]��[c�<x�࠮I�霝#�>V�/��݊*�V*Ry��Y�N]�Ѻ:��[)Y��lr�Z�@��.�ɭ�"_s�0��sZ1�B�Q�����^�n�^����Ȑ�b@ �p�n��-%�g�0�?���V�L�\�@���,�3c��
4tv6b_��N^<)�u��T�{ϸ�R���v�k��X�`k���`���"yqAҏ��N�4Kb\��ņ�p)��{!�ҦTSil�d����[z�:,��"���
Uģ ��D=�y�?��+C�5)/1L�?�T��k��=�u�-�ʷL���Ny�❮�5����>�ۊU�2�
�O�84ݕ��H�d�u*㱓�x.��=p,�����Zy��'pC�̮�6ի�g�U�o�ߪ�&��`�쐦�_q<z¤G��
qk{v/�+�p�Eә�F͂�:_�&�c
_����G���f��ztj5/���7i5m��k����|�Neg�B��j���"R�e}��T�ͨ48�$ܵꉽ��5��lѵ`2�<�G�f~3�-5J���vZt�V�Dy��@��<�0ͦ.��K+��ʣd�bLs(���J�':mҊ�-�J��b�����9���}�mlv��\�C��8�-J��o��>1��%�׌���>�۫��F|ۥ��#i���ۺ&���W�W�*eJb����b}��y�GM����>�����<��󮭪w!&�R�2w�\��߉\���\�[R�f:"��Ljm��>k��L����%���J��	~
����ҹK����e�^a)Q��<�J8y*�b�In5����)�	t���W,qd"Wͭ��Q�*�c=��W`a�![��������t������m_��!���j��P�B���r�S~��`=�.�(b����p�\p~��Q����6�5q��Φ�[W��ՠ��fQ�c�X��v��3�q�����D����b���=���(�>�*sL�<�j���r���6����6�
���SjL-aĂ@x���N
�������s�!��!���d��8��z�M���x�gH#ٔu��W^`�WT}�1��� pL�"���ƺ��x-�r�sc��v���::��J_BOn)�R=���-�!G!J��=����Z&43%���uf�SW�Q>�Co�J�ҩ�w��3
��$�
N�7���/S����y�2_�E.z���s�Z/Ԏ�l��*gn�4=ۻX=�7�a�i�֤���t��ۙ#�m�f�?ol�b�:fz�;X����{��ϓŪFq���q�U��d��g?�s�q�?�͇���m�K/?�'q{�4���&Sz
^=3oH+��q�b���F�ϵ��(4�K��1���L\�2-�x���v�Ӥ���J�Q'$�ʯŞ߉�N��3���}��^6���!?���>��z�~��dž��W�2�o��M��Ƿt�j�8kĩ^4T�/m�8+�q���s�g�)j]��]J�DE�!%7�SҏI'��r�����h|?q����%H�54�ո�p�xe�:rX��]J�W�s6(�RK3�j�6j��D�����X���-�,�\.�&�$qc;������٦��h�[�Pz-z�R�}�x^�d0�E
�.�eHٙ.��O��}�˴r
S�|`2�|�x��M\,�rl�}��G�fG/C7�F��k!.�VL���u?�:�)}�#�<��Y{ �+���q�+����	]n�2�Ou(�����
�y;=I�.P ��<��:��%������8���=�8D��}�<�1�;L�io��C-��_X�tQ���❹���	�q���"�'��ݰ'䏥��tһ�\m���%�[
b�`1�D��;�n�,L�#���yߴt&�
3��Y��&>�|o��a�z*��t��O].@��J�S\��K<<��Q?�����m���r�ɖT��\
_�r�����Z��_N��b�3_Ee{��C�{��y�<?���Ï\�q<�X]���p=d�fú3��k��t������˛.WyGQ|Ɩȶr��%!!��3O���n$�WBP����w!k�#nB����:��:�@̼l�ی��:�Y+'��
%���r�l��Z?�Z���tI�o�L�I�&�<�c�D\ag��t-��;�Q����&a"�>g��Z<�.�ѥq�ߦ������s#�X�g/�E���딙��*H��0NE���P��
�~�g���J�S=��O�|�!>�+!_Ѿ!3�V�>�Y-��B��Z���j�I6�ۏЩ�;Ɯ���Y!��C"��Sz(3闉,������^�(~�Z#�$O�Ô��ꖺ���X|X>6}o}��CK��;���}�5�@ \'1!�C�Up��7���3��w�\R��w��֐�6�'gH�䉭��T�֯D�;
�$1��]na~h��Ί�*u�^�W�VQ�z��<"A?����󵍜V�!1����w;x���ۯ0�yQ|*ohe?ɚ�*qt��/�}*����jaÙ�Le����W	s�)r�V��x
_(���^�U�Aw.�<q���v�{5焰�2�
�+�I�
j�����VH@���q�
ފ�0�`Q�ҥ4���-��U'�z��h�^]Շbm��AQe5��ؼG"0�KS���c�3[���v����KRu��yH3\�����cDC�J��"��F�oǎq�V=C�s�&?�䲒�a9f�߽EA۹��u3?mW��8V���Ǽ5U����{��T.��vo߈	|^�yF|�h�߬CxC���׫��0�X��i���
c�אq��c���z�/�$nSv˺ݹ"U�i7A�C\ƀP�<���[H/�m)c���#�*���Z8NѺ<�k����h��ĉ9�n�/��F�&��G/)~�?*�W��p���#9s9B/9���wS���/��s���k�`�^}g2��7��[<�f�v>��ީ��T&��ֻz���isG�q��xk�BC�٪���goU42K��I �콅�eBc�4��x��c�A�B�b�:ޞ@#�e����U>�痉�R��%˅hh�)��7kw'�ƣߦ�O�ÐCk6�<&�r�Y"GPӎ��7(�U�˜Y߮��o��S�H?
���7��*�9��pF\Z#��nr!:�,}q%����@�ϵ�G���S}�#7tL���$��U&k�lB/hu��Ҵ9�)g�Xiz��ܛ�
.�K/��2,_�RZ�a)Z��{H{b.X�KW7�D�q�W�
X5�A~��H��й���S%�,.�\���-K/���{�f��-�e�_��ӧe)p�C�'𤻤t!�����M�BPob !ף�mIo	��Bxr����/\m]��u{07���>\��;�qN�������0�%���[B�Bg��$n{��^x5tB���:���g ��0s�\���ַi%�J�E9a���-�}�#�Ģ�K����
�$�t��0�H�96�w:��v������5�߻���O���|����*��g5lLևf�V��~`�3�jP5)hft~k�⩳qw/���8O<��DV�e��*{�~T���A\�5����1	4o��R2�
��J��I�I2Aq��ԫH
�
zQD{�J�"��&x'͸Ma|�hj
��YY����/c�.��ʏvw��M�_6O����O2M�"|d��s�dz1�䨶h~�hI���ǜ�q��
Q�x��,�_cTJ�w�SF�}{�F��d���b��^�CR�w�.����aq��Y��N�T���\0�"�W��$(�7��c�:}
�s9��t.�Ada	��Ym1*��:�#1�CP ����yxL������1�4Qʭ���+��7�gy㐧|�[�����9�B���������'��N�J��������5(uaHGd���א.�d�v��~o�!uc���Z4�B.�%����-�_@q�˟��P�y⬙-b$�Rr6�N�����"�����rS��&E�����O���2�YHӡ'+�qNS=�H7�-ck����)��,����k7���z����f7}�D�BS�ݭ���<f}�SԊ��8�O=�iG�(>��E:�~�އ2�<�����CG���l�/{�;
e�]̸k�3���U�:�N�w>��9�g���%K�^�'�ɤ��%"\O޽�`s��?����_���q��-�U?:�I
���}X}�:ڮ^�9���<y��>������vy'���a�mi�N��^�(�o�\*5a����C-�Ǐ�L$�\�d�(��&{�1�[�iq���R�)�p���a7�x8㶹�@�Y?k����anMp������W����-lvCʶm�I��Y��|��O}t���,z��q�|�G�j��^,��v���SL���E�ڭS軮��~a}H`W�]�1�'ٵy�^������3"˃���n�O���I��/���<"�d��i��|�'����+�
%�*c��3��1����GlI�1[N˷lOH���yI��E��$QPh���k�O�<����N�N=mr^ݼ�����$!�,ǧ.��-h�d��-�[6COm��s��MU�ԓo���^62��%�x��j�1G�j�VM��ԙ�^S>i��m�;���/StO7n��s8���iVOQ%�n1�ބ����8'�hWBe��Z$\�4�v�7Rɦ��>���h�6~����f���(�v���m�N	e�[���p�}�|�r���%yN�sL�����%��Ux��#�[�d�c����gw,���
3˝�#�4�^g^�o˂q}��0nxM��:�ާ��8嶊�]%��V2)g�e��N3�D��]e��aӁ�۳�����2]`�/�0�aC��-���	��>0ߜ�&�%o�qp�>��q/b,�ɗ���$���x7�KǷ���{{4�.3x+4�_#�(+�yǩ�BL,CY��ɧ߻N�X��l��ϡ��L������r�Ǡt�i>a*��W�mijr�Mc��ғ<�����6~�ͱ�AMU�i1�ߜnd?��,=��ݏ㱼��+��������Y�	�6�/R�$4nR����JeJ�7���t�ˬ��GYY{�����?�R�Y��X�a��]"�4���1AP���k2�o��^OL&)M{Yx��J�%��#���)NW�>oc�x[`�
��4�Qm�I8W73�u��G'g�bA��k�a��Tq����-b%ǂ�e��n�S�kpg��%��9�xf�N��D������.����M�㮎'z���V�F?{�¥��jwS��HC7�{1
�A�l�:
W���P�z�QBu#���'��>և��ᵽmC�B�7Ô�6��4��H�׬�z&�O���ˤ#b/�)
]j�+||���D'N�ST-���U�:��q�U��t��F��9w�,��ؾt�՛�槖��%\��KV��8O�O��Vs�h�tNڶ5�J��w!�+�dv�j��]D�Kq)렔�w9��V%��~��A���N��H��*��1�6+A�qb�^ՍfKH�m��|_H��~w�>:�-�y�x����/l��r�,y:�l�8X*⓻l��
���r%s<�!$>���:s䩨-����ElW|d�l�36�.��_��qc���H��|�Ƹ��n`�QK�h����H�3c
�H��פ[\��%�	��N���v�hQ�¤~E�_���_𣼧��g3��S.;im~Ӓe��޸˵�B'P$_i��e�3L���_�>X����{� ��tVs�q�
80D�\th��/�1����>C|N�A��A� ���
s7/���Kի�,FÜ��R���+E�3}��+E�n��#q�m�_t������z<5��KЎ?�G�K��́�֏rF��.�˹J	�]�6t' Ț���8[Z�d����g���N�:��1ix�`�y��.7���B���u�0|����o�
<�2�8��e��?�\+�l���$�}1�3�'u�n��n1�
�y�\���ɤ�-=�����o�zN�OB/͇5l���{��ty�&�]�v��}LP]�����>��>yR��vG��w�<e?
��˭ŗ��|k��H�v>��gT�<Ûԁ�뫓����2mؠ	UY�`���Qx
7����v���OJ�B��6k*�H��V��}��nq���6�\�� .�
+O�hU�����Z}e�y�2%�	y�1K"�U>+|�m�͆Ư%�F���UпX�k���Z�i��l���2�̰�U���̧ hr�*���OB���Jh�o�
��w=V��>S����%�� �|t[�3���m��oWz|�/.u�mn�O&��H=sͩd朧UȔJNl�G1�d�s�%u��F͉���Q����aH�V�s$�F(,j��&̸��ʉ-C�WTVF.�~�_����Mx\5�����u��Ͽ��ir���RY��~�Xc'v�_3���<anv]
[�t�U�i���$}�g�ό�����
��󁯃�<�6�{d��1��!����"���j��g܊fB��c�Oʮ�A��C�>��<�ʒ�S�ʱ�RI���k)�d�<�kv��Τ���N6�"Y�W��s���ϗ��foȱ��,�Pv4^�Y[�r��������G��}�����J��M�춻7�S
�$9H����D+pQ�#�*~f �����G�=S���A/���w�|])���ޓ6��Oڎ�Vp��������6��L.ޮ�@�
���}�)ksp�:m�`�ͻ�L�ܒ�r��mutt\[[������wpp�����P��М?��Ӱ"hg�0]���Lo~���5���[w�#����66����_?Zr���|����I�U,n+��?}�{o�Qxo$�9�t�F������=Hӓ�\��W]�����ag�l���vP�ʳ���s�O�
k�
o�T}��v���x���\t0'3#O��r�_/���QP�yt
�@��k���\�k�ii�����c"_wv���4��x�����6���>>�a[K[���HCCsdz��e��Q_4#��XHKi�%!~<���i�G��{?P{q>3�f��_M��@Hb�j��i��Q�d����NGJϒ��N���X����(^�]�Y����p�6)Ҧ�CAV��_�j|��m��_��g��y�A�ӧ�N�d���\��d�d�g�}G��q��.�CnJ�^c5p�^U�y%�1���	�["�S���|BDc4��$	z~)���l����lI����u
�M�}�Uqu��±�P蟾m�`��T2S�⌱c�`�R_'�'�:��b�*���ll̪���ˆ{-v=$m�1�l����?�w��iY�r:��!�����wc�=�,�p�8��EL4�dE����\���Z��6 <�ȯ�iP�cc+`��t5h56t0���m	a%�d��k���==�ϯ�S�*^8����
��g�x��Or�:�Rp�*h�+�ξ��6^"-v�N�‰���"���Ǚn�?�Z����}nQ�Hwnp�j�Y��������r��A3w�swwv��!�a��m���
���qp���i���넋iF@��:��0+7����5����z�SsC��P%���G�$0|Uv^69�2�˲��m�Oǥ9�A�yzC[<��֘����]���B�hyj�b��j���%�Z�/�����{R��ɶwv��Z�U��FRp1��K�'~�E���Զ|S>����6N�&φ�Ǟ��H��͆�`�<��{�� &�����0�z]����o���
T
gO���G#a�f-I�N�w2�s���v#Kݍ����D�W��|�ْ��Q޴�տ��,��=����T�/���
��
߯����:���Ƕ
���ҦA��b$xj���u���8M&��qi���B�������I��%���x��#�e�?��7<�
�C�ٝ�;FK�5Fc����L69�2^y�,�z=�ؘs�]n�<���榹��ñ|�/��,�
�Q��9�9��h��^8���]A	z�A����X~F����ض:�f~����M�7��9/D�)^����w���[��-NO�o��[�Fj�IM��y�V��ܘ�9�f��"�V��%w�86��gV�������kde
8�b` ��c�m�3���u��#[�L���l�m�[�'�"�z�]�6˟c3��>��5�	��E��T��<v���Q�c��Wg�rgg�sJ4y	Y�-du<�7a"�T(��@t���u���*[�K]L
�A��8��݁�������t���RORI�7�IA���K��\V7�gL\k�Jf�肴�m.0S�/V���:8�����C�%��2�p��o�6@��R��2�6
?�������{��5�,��q4�P4�rB��B;l�,|=���i�+U7����D���J�/7���K���LN�����.��jXw���n+��ܷ�@��K����/���%���������7�]�ԓ���2&yP�'o��e�]a���/�S�ob�}	��pQN����5�+u��[��ڧ�//��x��ub��4?߾�4�(}rBjm�e|i�7F���� �6�N��Q�l ��G����ݰ�|�ܛ`�Պ1WY����f{���Z�mf�!w�����1�G�Dv����(��a�Ot�4a�pWo�&Poc��0A��������b���C���^~o��|����ᔁK�Q�(�	�a��D��c�����ϧ�����Pt�k��N�#��?�/���Dl^�?&����vd�_(:..n�B<���xB%.�ʂ�RqS<q�.��ٵ$ߔ�u�]"S�'L˝3����vzd�nsM�|���N�����J)�ZWhi�G	L�
uP��p`�)'�U���4ȼt!�QnTοr.��}i����<���I�Y!����O�M�2Z�,�~Wc
O
��PS����F����h:�_di] ,�T���n�{�V�����k �9�^R�tI�N۸�a�Ċ0B�
���ka���m���
{GmXw|��*���V��O��
Y��-6�V=�'���mPomjc횅wi|��ݧ��T聡�X�M��|��h��5
����b[m�Ǘ%�m!/�y�x�UZ��Cw���3ě`)N�՚���iM-�h�t]9��:��!�4�����.�N�t�C����K\�W��=\��{9���ba�g��G?R�TEߖ9�Qh�4�UV�,��ؒp�^�.Q4Dټs��[��ɦ�?C

�cw�������wĐy���&�+å�����k��K[��4��ĝ�����������i5�_{��X�����z���8
R�h�o��_F\��n��#�@�);���?v�5�YA�v���
���ﱾ�`!R�A�3�A/(��V7��>�R�����3�R#�6�;��>Z0!r�n��!\-�:�?��uO@ ��`p������ �
J�|(�I�[~$�x������� �C�ExoK��m��VQ��Y��tB�0N]�� s��{ ��@��EN�q56
h!Χ���I����7�p�b���8��=��ܤ��F`���Qߞ&��(g�?�¬Xx�w�7b �Nc��\�;�A"�о�5s��N����=��,
�n�"�ȑ��s=~@'�힁�!��P �t�Tw�QCO�jIaA �P0�!PD���^������G�g
Q@�2��aZ0�E�ޔ�Bܝ?�!F"�HT�8�ܝ��"2+����&8�QC���Hm�����6�/�}LIo�LY//�3�O�r�hGHx��q��:s�oO���?� c����4!LJ#���k���7�O����`���I\1�~��ĺ�P"b��j
�~z�D�GbW�#&Z@����%�����l襏�DS�^�ݓ�s�IBΟg�$��X�޽Q���B�Gr���A��
��p �}pH�a�_����?%Ql1F�
�������#%���*wI�k�*�0�8R4��D�s@����C�$�D+{�{����*C¨��p���IA�E$�_wLH�ڏlr	6�������f����66�G��+�(R�
>/@J��4���N�y���
��G^���0��j>J�ơ)����
���@�!�Q"���4�6�o�����%��{k�$���?��*Pb�o	�r�E���ԁ	5�!J�!��|p����!fz�G�������ůF�8�)
N[�(�n��@���j0W`?��\����jТG���-��u����~��rib���*�����ƒ&m�Ѐq��^�N �)(�a6����}����3���E �nA�Ȧ�d�*��>�^�<�&,U,1���:�Q�]�}������xZ��o��8�h�����;
�*�O�`�{6��8x�N���s}2���v/f��@	�9���Du�X)�+��pQ:sU��x����80�}-���xX��Zdw���WxBG�g7#�I�M�7s�*1x���dX�:,������ׁr�A	j��N�KB����qԧ:mxxK8����3߬%
���j$Mݝ4)�Fv 2�C
أ@"��<���\��v?����Q�,2�dOAD_�^=DrR
Χ�v�}m��o��{�gO�������j��]�թ�n�@�v~$�O�Z�?�\D+�:�`�0`��>ߣ�:�pY����'��Qu��9��y��<�Hϡ~���ū끬����}"_�;�
����<k���L|�q���'Oq>�R��a��{�<K���!���C�#Jq�e-L�q�����*��#T�d�]1"��u���K��L�7�(�,�.,N���{��1ppr@e�J<�R���G��%`��n�[�@ },���AG��F��#�4R�q��')���J:��B.}�t;���d|n�@kz�,QhH���;;k�]�IQȭ�
��*�
M:���s�3�|�D���AX`�?��c��\U/$g����Dž��@gX������
!�����
0�Bw��0�!E���Y��(�G�95��p��=��$��p}��7�̡
��>s�s�zF
�3�C�9:��`'_�1�4�������>fv>���/)���g��ja=Jbp���e�=-�
~O�_���%�y@o@�}̙����2�B��S@��@wo�b�{*�;�<T��Ђ����1�
<��P��djpn��m��R���p�
 �!��?~C�����V�Y��R���0�d_�
ٿ�*~\�*x�y>��=��ѿ!����C�Kq�<�l��ӽƭߐ�����=�_�!�j��`��M���3��'�m���R�r�]+��
l�nb��*^�!*��6V0k$��3�>R�>&�,��Rb�tٍ��
�?t��DR����6�SA����* ��� ���졬_��hΑ�~�vO��C(�n.�n^�v���"7�mu�q	E
|fFۄ��%q��ˉ�pą>ViFM=T���o�!�T��e��Ð���rpk7�K����n>@<����>T�S#�lR��+�?U�y{�;�~�s����{
�eoGPsQ�����+�|8@���\�UG�yrhVg�o(2@��{����R���[
Eóȁ�� t���9������Σ@����}�j��H1�	h�
�U����¹.�'������h�6U��ԝl����2��Mȵ|��\�в
~yH�rp[WĤ�\S��S-�G��>�%���z�_��ʢ60'@�CpP�|����ZULp)�@�Y{��v����Z`�������<]P���%7aRp�cf�qb�s�0�r}�k����b.�!H�*�F��>�:�z9��
%N�Ez�л�.�ӣ�K8��P���H��}������;�?F��p�%>�y,��Y�OT������t;��%���!���q/{ �3�XB1�#�s?J�5���2�]X�nN�4U��e�.�R�O7p�`p��:F��Rm�0�v�C�a�85�7%.;|������Ox��q��1Q��[����a���J(���hK�y���U���=��Tأd@"?;���+[��(��n�p//`�)�zy{�X��@�8`Ə?��8�����C	�!{\x��5@�y�%0�o�C
i~�2AtGv�"���.⁓?x�Ě�`!�(u��w�4�����y��WȺ9���P��%79�v����$�V�Qm{��^�>��懜Gwv:��uA�<�Cx(��~����oL�qG���{�<�ȓBš��oU�-���'
��7R�n�~���� ���u��N��ޟX� ��E�������;�-u�t�
�w�b�y�\��0��6��	wEv�A��X~	���H���\�@��o},���x��`�l`
�q���#��g���X*h��Fo�a����Ș��v��8#
���	�W����(�W �e���H<����xq����d=�:�lf�:�E�f��"g"�Z��"gX	��"�X�������5 �m� �(|�V��G���+�p"rOʩ&��L?<D�=�fj����	��)L�������}"E
���!ф����D��J��s�H�v�aX�C����Y`�tF�RS�F��Er������ڳR��'�gȑ:@`��(��Ͽc�� �J1𒁲	9Y����;x���-w�Ad�1�?^s������=�V��{�%87��8��|:~s��n��h8;�7���6��?L�\8��?����=�h��� vw�o"{k���j&�w���	~E��x5��#�J�K��aM�QcQ�����'�P�Q[����ۨ�(�F���{�蘨�+Ԃ��i�	��F-eu�_�
��}{cE�T�oOQd5�����/�~�"�~����@w������o{�m��н2p`&������`=��<��"�̿}(��ې�@�SB�U
,
\�lOZ����g!3�0p��=a��^r��dq��kY{���5����{qT����ړF��e�Y�,\IkO�2ٿ�W]-�4pE�=i��Zڟ���{�!��ҿv�՞i�jQ홦y��L
��'���E#�"�\�iO���FPѧ�iړ_E�����l+.���@�����K`
�%��4��}
�L+�f��	���!��%������HX2��О��ߗ�,.�'\���K�ٓ�M������T��F�ۀ=�8�CT��PK
��=�V��$K$nWEB-INF/lib/jregex-1.2_01.jar|��.�֭۶m��۶m۶W۶m��W۶m���|��{�ω��*
Q��1Ǔ�#2f*ʀ��A��������
$'�*D/%/�3
�(	��W �O���h��_e9!y)q1U9�G��IYz�yxz����fe�%ֽcgi9:)�y�*0h�K�!\,jK���7s
�cL
��Z��K��{g��(�Nm�>#�4D��j�?������'��������������������*?�9�1��<Q��L��L��X�yrf���?7U�إ�#c}9�Ic}��<����N�FK�HEۇ�a���w�sk�R^T�}Q�v~nB�D����~�����-H��_������ے�b�Tc2)7
�����B�?>#85�Q�H�AQ\�6%��rWb����Z���dF{
��K$ve
�uuGr�#�$_@�
���#4�*�� �g������G��\]�\��T
E�Sl�t�����d0�utd6,�Za�`�$�(�:�5MG��56;8;{�l�M0�
2�mݖHu
�+�%�
���y��_�����e��O^��t
Œ�w�����;�턾_3�
�(��`/���Uǘ�A�!�"��b��&�:��M9H��A�l�"��y�)A��a�Q����{��F,�f'��NC����C$��c���Bc��SМG��y��ў��I��VZ��G1���o03�έ({/�Vs<�WP�.�D�$}E˫��-eo�����5�l(��g0)��3c�.\+���:\+�cg�i�\x�6
mSh.рQP�zy+9]�HQ�{;�(?���B}��8��~{����8���3�	a�x\�&�dd�w���z�(ĥ�*�ǭ�V��">v�v��Fn��X��Hw�B|�GR�x�2?ڥ��(��������ͼ\�8��*��Q7	��6?r��g��a�d�lâU�X�H&���>$N,�NG���}��5�����8�\� (�:=�j�o)�8�Q�}�i���:I��Qq�#W7w7vl	�7S�hް����� ��(?�Ѵ<�˶�Z��F?��<�ˣ�0��M�j���-�6˵(;y@��&[��#��!8���� �v�+ɵ��?��Z���
<n�Ҡ���$No�9<�]TS/y�N����7o�/:ĉ�_��R��L1���X|΢�V�{j���w<;	�b��wv��u`;Ks���;��ht���N�W|��6���W���X��"�\4��씐X�F�'o	�5��]dn�۬p&�gm-���Ο(�z↩�2�:��R�O�=���q���'D҃���)F7&8[(�Yp$����aJU�8���(���w}�i�g�AJ�]�]����@�������?%p�=tlv#�R����Y|%�hҖ c	dL#r#PR�‘�&�5L���\�[�)�9v{�>(�A�`�R�`v�
z'iA�%�%�W��	ӝ�����'Ff(UH���&���xa^�8'e^�lvر�V����V�A��{�;�5��&����)�*�ʕ4oԺ���5����X��,یx��#āmuʘ.�F^iu�'��
m�򆶘��mFt[��&{b��D*h���瓞�6;o����
�t{.1Pa��DS��7zjqҏY�XlOn��
� =G�Ҡ�??(��6�B�$�8=C���ޒ��`��Y��f�����x<�ty��JX�Ry�#,2�ɬ�\f=b��n��m�]B_�x|P4PTP4�Yb %Q���9�RA{�H���rG:v�ױB�V~p�1�F�,,ű�$�M�J�?8"��aF#�c�d�K�詻/����7Wbڞи�x��=���ܯ%GC�����`|Y�2mB�X,�J��i%��]pUӏTcH ee�9|��q�1�F���R�Oh��0�)��E�gM���
�o!o%X,j���T���r�y�y����3�-�I�Ju�/�I�u/�r
�!_R5ۇ؋?��2�-2f��p+�K�@6���O�m<�\� �\kA	�F��L>�H7�����\�P�/T
j��)Ѿ}*V�[q���y�/X`YH4N� W��׵��(���G;��i���<y��D��M��h�8��J����Hj��I/��9�G�������#|	�Fie�vx���
,~�24E�08e��5��m��*<,$��( GxP�,��w'�C��"W�Ƃ�No%�Ҳ��e� |��+��L��a��򎠸D_�����3��>u��`�R���C�1�W�)�@�0߲o'op��t�!��>B�l��7rљ��gn�����pMN������/�0t��y�:�N���yL�������/�ֽp��䘿�BQ� ��އѦiWW^B-�(����+�������a{ͻ@�v+��"�?���?���^mki?HY?���E��Բn�fbAY%Ck���!
��~xU�	k}�u ?�d���uj�
&�t�x8d%�j��N���0
�ڜ����2~�l�m����4��|b
�r�F�V��j#~a֞b,�L3��-Ps�/��WnJ(�\�
�nF��oM���b6��.S��ѩ�H�P�y��|�G���Z�"��U�h�܈���T���Ss�r�|�h&
,�"\��%}��Fy���/�/�Y�Su�4f�w�P�{���Ŏ�
��\�6w3ר��\���H�/<h��=��K�ܡ���;*�2� �Ҕ��B!�`�R<� ����	��s�O���U�L't}?��P��{�B��v�I�P�ٜY�봕	a#�u{�p�7��.%纁��7*3NZb����q�L��ҫ��+Vr����'���-]"4�&�st(���lLl�m�r�ulU���>�x_gd�[\��A#7yUh�!3Ң�a@�ZPd�r�@��T�d��~eU)�H~1Q[���W�B�Q��W|�E������#D�K�|�t�h��u�m}շ�v9Y���	�lyo̯�S�o�.j�<29��i�G�Ci}i�l'��2��ƴYH�����b�vE��Xj#h%���rN>hc9[Y�2�u	��P�����%n���LaQnzzF��V�J�l�}�k-����vT/���SC�����C�<U�Yˬ&j?�Ϲhȇk`ab椷p(o�'k����D֤1W�y�`b}�٢-��}+� ʃ�����6P�;��;N���՞���~�8����󚫳2<9��ќ����\�3Ur%�Lw�*x�㕷�s"<�U�wRP��f������ w�l
��/eP�*Q�H[C�4\�t���5
c�����aW[��i�j�R�|8�EB���κjFb)�=�ݔ���
���C)��-l��6��27��@U�>ӡ�H�Q��\�*�D��*|ͩ�lD
$(-�#BԾ�[G���_ۧ����^���N��3���"T�tM��;p��}���t�ޖ��z�N-BwB�+����0�B��3���5��Ɣ�pj9�Jc����Z`�o+��Q4à �����4��(��F���o��	�M܋#��J������*J�už+��8�N]���uӧʗ�%����_�r.��ȧ�¸'���ͽ�Ӹ-���8�J���ÿ�nT�_��=VK(%��������6�$Q�/�?}�6����Ftm��qn��g��m.}_pm�K�⼷�E����F�2yz"����J�:F!�e����>qm�1�.J(4(�᎗)0�D�c���@��#d��	��TkSq�z&����ts$��9��?�q̯)�d�Ur��*y�M0b7�y�Ur��	%vd�Zgtg?��,S�����",b�B�f����Gqx!�	�����q�Ŷ�í�K���ѷ��y"!���������~�b���J��Dn��~G����,�t��| �.H���}��i$.n{�� (����^6�y'��3�7�'��U��\T3o=�_e] �k��Y�~W��TU�<\7�](sn+�����s���~�240061��H��ZD���=���̽v��N�����}O��
��F�i'.��ר�:1��cN��7�������~�9��Rxטk.��Һ��b��RJ?���(2���\pmL7pJ���,2�.��7�"螙�;�*��/h��3D�k��3��
?Z+,R=��xh��=�kl4��o{ �S�!�@��E"}���
��]),�$�uHؗ���@YBS�B�twz���8��j���wn|��DB�n�W)PY)���X����V�%�8����xO�x�!�"L�F0��(��tF�)*Ql�`�
�/�%�I�2����]<�%�ƘiI��τCG�\�����Q�^��`M0�R�~Tb�3�Vp5�(��p]��2䎘R�B��̊��J�@��J�IH�.����~����-������&�=�1�3z6וyJ$�
s�3O#�}���&�Լsvު��)h�aZ�5i�>?�哈��*�(�h�h�}ƛ[���7��F��u��2  }�6����F�&���ܔ�d�~VF���Wh	l~�}ԑx
�*�.v�HvA����ׂ�z?��֫�`Y�?�9�gzz�ġfS�
	�${XGX,FD��
;-��3�|#�3�	�����L%9�&&��T�ߟ�I���j#��DC�4�8\'��w���R�		��zݎ�P�'͌C*���	Z� Ao�l��.��59�HB��~�#�ωM�����ю"��*w��K�:X*kN;#�fm۸���Z�T��Z*�p���X�Jy촜�&�?��+X���3�|%�f�a��E�d���c> �ys1�g,gӴ
K����x����_��\�<	([@?@H�j�[�A�7�/�X��ɚjMUfpe$nP�%�3���[�$���'��T%\�Q�H�p;x�C�$#��_[��R�L�E;(�)��?ʊX9���9��K�+\��*���}�ɚI(DW��,�0�,�"�&��8V�Co:fJ1~ٵS����������Z�~T��my���MC���w���{���LY�����#?U
5

5�继?���0h��7�7���[�Z�g��l�.��|��jx3\�[�o�x�Jp��E�x�.jxӿ�i���-�U��<��i���)�2f��}n�Qb4�\Z��4i�UƙQ�4�\j����\z��43����Z4��43�`�
����8�6j5*����\���
���٪9���� ;��e”m���\�鎍K��{,�Δu��Һ�{*j9`.׈q
^%�j\y��(;�v����KN�aytP�:�Bwf�/�n�#���U�y*Lf�ݚCc>�ߺON��ѱ��Ƭ�L���gP����n��>�1-x���g�ů�;��a=1�<�Q�����#�ҫ<3��Y�1��>���>�):Ňm:�Ն�v��h���iv*�=x�)8m��3�cm�����u�zb�|���u=!w*��x�~Gy0�أߪ�@lWL��G���(j�V�	B�`ޜQ�QP�O��G������r�;!�/nD�=�WB���u�]o]��,-�����i�uc ��`�_|�?���Y#�
=��:�@� hYjK�r�
�@��Ƹ��ʣ����_�W �ݱ�.���4
:N��m`/�C�X	`ZB7c�;j��z�<eb�4��%����ا�*�M�%�P3��4$P9QF7�pEɽ���@ڴ1V�5��#>�8���ҼQ�
R1�G��p��+L�e�P���p�AZ���T~Jȡڴ��ňL��=�q�zH���(�b��;uC&�H;��%�3-�<{O�p=�-��q�i��ӋD��#"qp3Ъ��CE�Xm����o�2��(����OZ�,�e���tW�uN�w	J�z}�`
K%H!��%6lx��"��k�GE�yniY��#�אU�㰥r>����%�Ec�{ �T�6FFՍ��v7͟�@J�Hd��FF�̓�kZ�=�aQ[�"�$��1I���0�����Uޒ;�'�)���f&�O���$I�AX=k��I3��it�L�@���*4�-,��F�8!�|I�l�J{����̞G24�l4�(h'��gy���u���k&�A��V8d-!
&��~Ȗ�e�{$���!;�#n������?����q{>�$�Z��8Y;����WU�TxMLUi������j�zo\�fs��c�#���!�2o�D�,��a@��(��q���ߙ],�'q��T�y1x�Q�X�k^����=X�ܲ>4��4b��k�đsbҽ����E��)�A„��{�d��;�?�&ѹw�܄b[&�j�������84�b~�-��W*D����8�t�u��6�xy	�#��7^=+I���9���j�,�,,��2
���Yj�%,3����f�$PQMj���=�m��;H�9J-5E�i��r�c'ٚs#��Jq!M
�[SEM�C
A���ĥ/��������u�r,F2���,Ǚ�ɋ�p)�[G*W�
�7�0�E6AN�D�]�hr͉(\quU��������F�tY��k����p���[X��V��͐���2�9-������r�5��E��JV�m�A�o�z�L�{sI�e�K��B	��V�Y�%!�5�VѺ�1���O
Jr����7m�%,!2��!=$�y]v�Fq��n��$�H5�F�~O�C�Z��ܚpao��!�H.��'7T̓�LHT(7����������t�紙�ji2����j�}Q�ʥ�
����g(�j�\�8�;�izZz��@_-�g�~
}�3��_
+�M� }:`�������D\�� ��54!��y�FQa_ZQN��L��O�o�R���5�>�37/��X�3�l0&��O5S���3�]’��lz4/=��x)>	�4��L%%̪��o8K�j�ʊ��Y�U4�4��l�,$ފ�3Cl�rq��I�I�	�OCE˅/i����-֑괡��1�:26\c�n�
F	JR2�Pʚl�r�i/kh	$�5n���@l�>�IO��#��2~�x7��.�]��\&��4}s�����R�}O��l�*�3�㓁���i�$�!"ttg�*�8�8�[?=��~�/�(�H*�*�V�A%��3i��,��s���n�~|Uf*�2)�pD�r��d�*�4�v	�v6�K>�v�)j��)\�6Ԭے���U�*��f�r������<���,VfeU�y����.l��Rb�6�5�Ŝ	CE��㸛�����m<��$(jҾ�UΕ����+�+]R���=%��R�S�c׉�t�����y;��&d&e�_C�m�����A������Cj�B+W��-�W�����_)��1�7���e.r���	Q�]��I��1*����+�^X�e�KI1fu�TUӔPf�'��٫��X��n]6�:O	*aXFg=��N�i�>_�,SK/aT�t+��=������O���!���	��Ֆ �.�I��ev�yv��/#A@�`ˮ+�t*�k�ׅg_Ȕ�)�$�[�
��I}"�g�RǹX��&M�:��`4i�hb��#�5��>v�1�p�b]�̼(-�;_	
c,�Ѷ�ȧǽ0%fY�#��"���b��!jT�e��hRZi��R�l� *kd��\
��h����|�#<�z�_��!��U폇�ob7o��V~*ɐyA��#���I�	�<��	$eC&g�H��g䮍���C!�^ȿ1�NB2�)�P�㜿�?��b*u���>��35��VG����q��B�?��_���L��@����������W��L��N����_�=G�
���?�����_9.)��&�ki�<;���"�hСpP��^�9��{�o;����M��u��������Qg�>w2�1N���V�s�^G��c�8����#
��s����N�\�����s�X͜���S�lĬ��y�~���\�j���Rl�v}�w�'|�I�w8�UK
�n��'�_�S�^Z��&|d��ZK�4�h�Tq�}$)����zn�R�B6q=������y=��#�}N�3j$�'̵c��tѡ0�V�^D*2��x�;����|���I���)���f�5�c�[0���p��)}@�c���m��mvm��/	�j�2_
KQ�3�Դ�k��62>
�� ��|�L�32O�a�C������:Y�(���$�Br�7厞!*��>�C����V�@��$oa���ڋ;�HqM�+Qɳ_Tk����
��s]i�<(,�Hf�v�������f�&�/����_���ưZ�T^�����0�<�f��lw���"����Cw[�����9)}�x��m�D�`�3g��ƌ>�[jf� �_]Y���,�=`}�6:%\,I%�VB�?�U���wP��s��>��8%TGL�j$u�ܞ3�]�Y�Q��N 9�{�K�V56@Z�i�ʻP�Km�I�I}46������X�+��f
^����7�D���ߞ
��e���=?3�2�gx�Ĕ�*�A�l1|������P���y��=o
m�ݽ\飚�4�o�݇M�J��I\?�.[R~��@��s=��H>en���`��Jf����c�Ԙ^�F6���h�-�ÿN�]�zK�\E���{*w��ߜ"�P���Kp,i)�z��
�X�瞿�$?�0'?��g�P��XaۅD͇R��Ta�e��/5jN	���pZ�(I�� �?T�xo�=�6ޙX�G[~���k�R^���ɻȇ�T�	�@�:���	��3��w��*�#����sT8�.�Q�BIq
qb�(ȿ�4���)M4:֘	�`�h���&��ц�+��t<���r��f
��w�<���3�N�F������<�ۗ���:3=�d��Ҳl�aQ�[���.x��߇y���7�q2�����0�G�
?X"ǿ|w�D�O���y�~�-��ڟ��̘��`	]��"|9��nO��]v��k���Zf�emP��[���ٻ��̑7֩��ux1՗ ��~��Aq,�lC�0.P��B����=�����;Mh�`�SA���gG��D�pG���>�T�aGL]asgj�O����d�B�? ;���azê�J�0u�
i���L�u���9
A�"�@��u�9��;2SNg���X����|F�;ҩ'��8�}�Y���5O�z`Ӹ[�a_�wf�1�q�M�<�<��n99��I��\k���g��u��#c�.��f�ɓ©�$�*�y[��٢�YC95RK�YC��Nz1��[p�:U��-�..juf�jF�X��N�d7�Ӄũ��-tue6򑀠D��+�Sh�Bk	z�2���A8;�ũ%_]��e:;2���e�k�:�9q'����)�/VB�L5��y玪e�ΪEq�T�R‹��.h�!�̫�8<V�����)�HX��}Ua�Z�]��=�2~����+	БN��0�`R���m��܀iP/�a~M)�����z�P��*µ�WZ�_�t�ʇ�
����ma��~�(EG���wɚO����k�����C��-�{����S�&\|"�@���J�m�Td�@i�{.���'B����>�������p��ϞZ���%��p2Ŵ����Ae�
���KԴ'�_��Mٮ�(�0O�G߹ٟz��+�)�~�"�4�s$�q�2(}Kc���;�X~�H�'�Vߧ/U>0�z���"x�]�,|%�����B�1�ð���p���q:�^�<��,d#
?�y�8‰�3���/��ՖlgSvM�;�bW�x�}��z5�J!��O)�G��&�����r�4Z��(&R��
�=.S�jF�Qv�'7�w��^���+�F�O��<��n�d�
db�Z����u�^�	~��q����~D�_�_)4�LS�"��Nk�D���{�;V��Q���@����m*L�B��}�pN��/0���)J����Y-��v.U�ol��8k�Vh�C�Kr�����C���qb�~�#�/S�'�2M^gq�y�1Kx��u�#�+]�X�GZ7��jyYN]�*%F3F���HtR��	�<�:�5�%y�H�?+)�	5.2nF�9E����$
��5=�F�
JP�S��!�C ���F������lI�a�I{�����j6ְ�`����K��r�K>����8�-s��=�N�qg��ӭ{�0⋜�}X�u���Կ��t?�S��*�u9�M��O��� �R7�2����_��B��g�x�����/P�-�
"O�����#�]O�;<ڑ�nՐ[}��wu#�F����@gC��}�'�0���T��#�V�@p���!�g�@�q��#>!�KX<��k3��#YwU4R~4ѭ��a�����V!/�A�p��Y��N��m2ƕ�#<~ ���I��B��2rOCi�:O�!=<`���ܗS���'ʯ�g?ݪV޺�p�5��"��OT�����Ƅ�҂n�u�
9p{��:Q)�H��ޔlNf�cN�*Ej�?!:�Sb�c˓��u�l�L��J�&��wDo*���Ι6��ގdO�ǖNb���T4{��7��;�sg�������n#�kLS#ź�j���m�[G&���ګ��K�l��7�&��������d��̴.�2B_��OI�����
�4'g#ꙉ
�w��m�W�\�:�K�$�E!�ܘ!![�O�w^�z���+��mѭ�
�n�֠��#�
��+ԏE�@�-R��/ֲ�ef��p����[������rhgq�5/}�@���wV�*R���rek�ooX��iҹ���ŋ�1鯂J]�ZU�x��PiԄkܓ�g/lv?��80��JǺ�@
gBC}�)NYyG|'�_�q��~����x�-�F5e�,4�����O$
cԩ;�����v�>����L�*�b7�G&r��g������;�*��S�{�:Ap4M��2�)B�m�B?��~LȈSķ|cB�X��g�9F�wQ�_�'�0'�5��
��;)Z|Z=C�)��VZ�t����� ��ʨ�a�g����Af�3B���LMw����ͳ^�|���'����3�Y��M_�굳.X6_���5���;`Ӑ�[5�X�O*�B�K� K���lȏ!�VV:�cbɽNz�?�`ƐG6�|('>�Bez���b�r�@������=#�b2�f�.Aܓ�Y~ǣe��[�������D:��/@�)W�2��5SspA֍��sAtW�vG�d�Kѓ��2K��+L����+R��~õet��p����u�ۉ=@ȉ�mr��C�	�8��
f�X9�ωF���b,;.�!D��+.��G��d;X4&�'ͺ�*<�=P�ղ����T�t���ǿ��U��n��y��%ظ��)��@����W��T�ݿpi?]տ�n���Rםy�.-��k)���?u�s�bJ�@�������
��1b!��)�R��!����wB�8�!�6?r��Ė#т�Жܸ�V�B��bMծ��Ͻ��E�$�6=���V���_��G<e��rXu�h�y�t�S�8�O"�R@Ju3[,�����h�0�f��}�
��O��Oڢ�,MK*�����!��O������r��o�ƭ�Ɓ}4Z���J�?\Ӊ�����&��ta�h�#�Ү\]���
`x�Q�[gB!�s��$-�U�o��Q� E��}3���g.YN�lYN�5|�V�^�r�ps�����ɓ_q�C#�P�ɇ<��=#��,٥x�I�:�Ib���c��m��v�m�0o.Ln{H��ZOB���2C\b9����H�<8�T����Tn��)��k2�SQ�rj��� ���4�cv���!�ڙ�����[56|ۘyi��_ܵ��b��LZa��6�\
��\!��B[jɼ����:p����t�P7�::F?��@�(�C|Qa��R7�0����^�~��[�����_�,�@��S��s���ߪ�����S��Sf�T���ip8��n��6����ҙv��]S<p���$h��G�)���H� D�'U��'��GCJ�!&JP$@���F�$��TȐ�a�0��`�pSȳ�x5E�ٞ�<��
R=`�Q��0�����
_M�(���
�K|�z*qi��Gc��M@+/��߲����;���uO;�mih�l:r�;���e����3�:�dL���TS�a���'��ܡґ��Yg>F�)�D�t!�d��{(I�;A0�ԃ�L:=���L=��C�
��P�C%x��|��E�-�|,��H��m�w����D��2����"�&j���Žӄ�_�Z���v�I�[�9E�Nf�j����dEPt���G�P��-��de���ހC�8c��2�/y����J��(���i���x~Sm��]���q87��h��!n�=�tHu�~�BU,�k���'j�!���3��׀�6����E5|�I�J��_��8
z��-8�0�C�;Bc�Q`*X��*͑S`�����H5���$����iQ2Y��U�;���r!����	v�Ǧ�Jx%^P0:Tt�
����r�̈́�'�Oc��oI�bҠ.bu'����]nn#ɶW�+T�r,G�h�V�.G�i��&X��Y��z&�9">���?+_��.�_v.�vqI�u����ATük倎Y#c2M�c@M��D��Sj��80g4L���9�H_��o���1���;���v3`2�Ȅ�p^G�OGAdNEq��Q&�(���mT�Ƞ:`�O���Ƕ^m�y�H��/��I�s�C�	�ػ!vA0�<{H3:��;�f海-��W�@@�<�-i�?��M�\��l�<���5Ъ�〫����<��E-���Y:��p�NNNޮ_qA��_{�h�볪WL���플EV��(F�`-V�x%�p�Y�f�!�ٝ�䶘y�ƻ5��	C�9�_Rt6��e_N8O5��8䤕��E�(��f�@܃u(&Mb>�C�{��	��x�b$L|�-V;����]o���.��9[��Cd�UI��vH&��Ck{�J����1կ2�QkV�Y�UO�G#�^�v��nfy��q�E���Rm�.WRuQ/�ƅ�-&%Ĥ�9�,�Tݫqo�+��J�_�o��K�(1��=�!�#4�SO�8W�`F���$��Qk/�Om�Q�����~l�2i�Xp_���2�e;���p��Q���ޙ\B��*�$��,���W^�7yt���n��ԥ?��Y��!埶���~u�LC^
�A[c��7X
��sE]�s�ֹ�s{�a�[�S��e�r���n�[����c��lbpI�x��D+z?1�Ke�*3�����B'�H��*\0`�/�[k2Q�-u��a���X6/8�iXBH�õ�G�N���`g8�"�?�w��):/'MCBm�A�Ƒ-�3\�e�2p(��.&ؼ&�1��m�I>�
J�5��na����S���Q��!��2���T�#'�7��7i�=��R�"�9�̃�r*98]�H��9}���w8��ɤ)†��0����%��I)ҡu��)�`x2��R�3�fm�Emso^�Z��4�vw�|AD�����_�_`"O�qsS]b0�����3��N2�$����M���y����ך�2����"0�U�e�Y{-b�ƨ��ƕ� �r���'� I�7���693
�-L���%�<��*~f��p��=���Q`�9����~���o(�𿗩=(ׁ���������?�[����ߝ�OYGU�oQ��n]�M	v�MG�>���l)�������4�.�g�#�;��� �Jʗ�ю$�����x�AE0��}�#�u7����-ő6�"	̂-gّZVZ�|�'���QR[ &D�]w�1���>�2�hCsc��S�ԝ�`�x	?��s���zl��hdש*UI�t:'���20v���;�Û��;�1XC��7�>ɾz�v��}�$�=W璅�w^�,�իgǞ��d�!���>���0��;}I՗�����k�/�
�S�?�'��lt&��tȉ��)1|v��fj�΃C�y4=?�E^�̥�CU�$��7���P��U�!"�sՙ���M�cm[q2����s��C6@/���h7�k��Vd�ĥ�@8M�yOk��I�
���>�\M�Ȼ0%[�F ˚|����Zh��hͶJ��xF�.r�ue8�s!Ș�Ol�`��R����+ECn�=
�)�;G��a�}̐��G,�S��+���~�#�{{s{�Cx�ud�w�o�v̄9@��8@�L�'L�Z����PH�_bB.-��'\�W�EH�X.H�9Ht�"�oz�7f��[1߳�c�%
q�nP$�u$*���
����rp7���gm�@�`�B���2F�{g:tD����J��Q��'B�op��$�Iq�_��1�c�pfd��Hkdz���-}�����3R@��S谎�[���7��h�L١]���\���ǽ�@������-�ND^�Gy{���w@��.;;,�i�:֣R}ϵ����+�|���%��=���n?c+�ۃƗ��$����I]P�`��H3�8�!aP��DsI�2������@��1�vV뀣S؞�ac,V�/cz���}H����3�J�;[�K���8���S���f�7��4Q�6�.�E�J50�>�6�\DI�I
]���.p��)��m�!��W����N�j�H(�%‚�B+�(���Xn����Gu飸�}��f��}�SW~1����m<��}��*�A�2^U��qq�I��RzL|)�´zq����8>a؄n�n�Z��#�B���	���=��������z�|`~�_~zA���������$�%�(,	���mng0��¾k��g6E_��E�߾��.��\�K�����XE��V0��c�.�v�z���2s� @ @%9�}>|_>f/(t��C���	9�N�#����ā4:(�c�Nv�l$#T
V.����;�8����d�Yn|����e��ŗ�X���cBSH���ߊ6%o���Z]�
һ���\?R�(EC�f��k[�ݪP7�>��VA�X[zA��z���G�QG�'Š!}���j�˥��m��]�sG�?�>*y$I0�B�Ւ�x�N�I2�xZ��-t�e�zI��V��v���ߙ��:���SLp-�x���.�>7�L�ܨO���
�&��5Q%�Ϳ0pw!3��*H6V�z�}����>�9}���I�9D�g ��F'��|�Z������*�A*z�c���?o�Y�j���<�\�M�c�5��փ�����wAG����r��C��ΖҨ����LE/����[.���?ȧRK³���-9��o]�_)R"Fd���J�����fZEvH�e���>BDAn�[Ï���V��b2��!{ï”���9�:��Rܱ�	�^s៮�_�dsmX�H�=6!���N9	�f����#����?��Wp�cm�����㿙�KГB۝_�w�ioBl���ş���,�.@*�&;S��H�5s��W�#A{�P��&9����N}}���F� �eh�'�i'%�װr`e��G��o�hz>oݗ
�hva2Յ�k��w��C�]��n[<`
S�Nw�>�N��^R~{/��,���`(7`���_i�1�$�7�R1&h�59�1��t݇�Gx��Y�(�
����hV�*0 9�Ic�{�cA��ߞ��
�J��ӛ�֘����Mvk�ɨ�zz�+,0�~a�|���
oD�LR�*:�t	�"Y�H��f���'��#a��ZV+�^!1�bl���\�)����7e*���_�̽f�*��7A�G){S3G�N������� _��hYe쬺J4,&{�\큸"�p�؜�5��+1YQ~)�8���t)�T��M0�����!,��\c�H��<�#��bC�a�If�3ڰ�����L*6L�8c԰?AD!�b��4�e��m�˶m۶m۶m�e۶�޲���w�s�X��OdΌg��4ҙ��D,J��0��8��/�]3x@ڨ�[
+dSU}FŪ��tXljg���J�
��2�c�P�U����2t�e�=ž��C`�$=	�"	�k��vJЋ��"�K�
�<��N<�XnP�U���8���v@˚kC��]�}�٧ɮ��x�������Bw|��t
��q�Zf|��o=�us�����xc�O�]��6M�kİY�d[k^}ȝ�+�.�!4����ZG�MݻFT�y�>�~w$r҈���ܷL{��z�1Cxh
*���h�s�4[LF3����!��/9g�]E��Ժ��)�?!�)�U���1q�|z�y�k��|������mע��Zߛق�c����'*��z��Z�ĢE��‘�xP
75��\ü�]J���:p3���>����m�h„J���
�NŇ�rˁ�䳓��e����8��5�@/Ӯ�tK�AD���1*�љ������V`�Я�����ׇ5'�=.�
�?���G�j�t1u2t����>TeZG���_���Ð��5�`�ߔ�0�%rS�0�D�T�'�4����r��O+ޥl�UJKUU!!�l�Jr��K�?Ay^�UU6�!sn�~�f;ٻSq_7���ׯ{��_s}�` z!�1sh"hC��T�J���ц�b>b�*��u��(;J��|:�A!(�O(e�\�_��i�즔=�W>ĩR�X8wE�'�L���"&�}�46�'-��F~��#^q�=�Jbv�f�H�֞(m�V�Z��fT
��#�T��� =+
��= ��P9�i�]M�U�K�p�wT���ie`\��E&\�{�IF)�GЍ��cXk�˵�VN�)�RZ�1̕&����-(N��c	a�ht#I$?��	��C0�a��I�s�����(�y1���F��dOKN��Gi��m\e�)B��X�����	��SYjM�*c
����t��e��IW����X�`�+��[�*e�]S�5����x����Y�+t3�Xr_��9B��t�^:"W�g*Wj�_�94��(�3��h�y��I|X���'�N#c[�6�{���u�B�x�U�� �4��(vK�9� [^`��=����~�ݪ/��n|�n�Y���^!��t���I0�o$�X>��N��i�	!� �Ɋ�S$���~U�7T��L��
{�u��"X�	�XS|�J�N�s�0y�/�6_�ګ���W흊Q��f���*[��'�a��~�k��R��n�(ph��k�{B���
@�W
�G�������@go����W�x9o�)�~2rS��{h.����W��kݻ��]��)*�_z!T�S�T�kE��ܝ��B?�bwrf�#K3�Ɋ�It�y�]����L�qj<���l<�s�r���^Ve7(�>'amQ�	(AX�T�m����r�����j���uAQ;'�*uڸ�1�H�ev��w�OU�g��`I�E�o3��#ɤع�'2�+_��B�n�״����u���Y��1�a"V�m >��~7�\�]V�YR�b���kc)Օ����q����ߝ`K��,���S���2OU/*��zò�]ֱ�止k���n��ʰ��i�!��n�E�-���:����<@(�7�;�7�vHxR.4��O`_�N�����doBU��˰�ⳉ�����coomhaj��#Y�q)AԚ#��!��y����hB� �(�d�d�L@�|��N�W���yiU��뗪��^{�[c$J�_�Vs%��'T����U1�9��O��t8M��
<³Y-�ƹD3'�X�8r�V�9-�Wf� �
��znX��Z)���k�/h�
���F�3�af0��Ɓ
v�A�%03��Z��%���8g"5ۦ���k�_K���?V
R��ϰO˩<��;�tin(�U��i��\��*xt��Vŷ�d�O�wPV
����C z;D�"p�=p�$=H�bf�:�d�ν3]�.�P�J>�xhd:��{x��x,~�~����BQ�$��
S��3�
��
�������;�c���	��*#S��w|�,m����]7���il���f�xF��ԕ�����J!���sUm2a23j�./@�h��B!�`��*�����5όdN�!\�5�./�K��ө��{J�=)t�f̠\"���
r���O��$��)�%�#��<sV
G��:ͻC���Y�?�]���-�,�{j�v�F��d���B����ݎ�$�j�6��y0��*�ͻUa���~��E�6��*����PkY�$�V��|mz�Uҟ�]T���}NV�Mh�c�JZ-o
	�����D�S�S5�N�d�t��eu�4c�]_���bP��A�m��9�.&Xo�gp:���c蘼`Gay�A�9�P���]�h�K����8�m���s��)�SUT�6
��ٷ-�����a�V���,�TG�4M��Dg�!^����v�xe'?�9G�_x��Qz�����=��ZsE�����&�.uߑÝ|��r�q��6�:�*�;�f�V������e�~�s�{y��⅁a�̕X�7�^��@i[7�oHl��P~�/P?��8�®�h��Y�A�@�m�"h�J_S�фo��Tj���>�%���Q�V1Sv�">�G�tcƽm}Û�s������1��=4�CTߘ�x~�@��'\��	z����'z�����2�0LR�c�?�ۍ��Z���Y�d����/��Aw��J|�_�u�+#E��v�#¬}�Y�^h��v�O�����f�qOh��wO\h�)�7���1o�1����|#G?���7����9^�q�K�8��A���������P��=u��Wrc��ܪ�5�6��GB5j�wѸnj"?
!����q���䅗���w������?��n�����������h���5t1�0u���*?YV~I�nW�[�\��HQ<�r"`$f�ʀ$L�T'��R�-�pS���aX%Qy�m�rGr�����|����<s�y�}m���w�=s�I���(�Y�D��i��i[`2З�d2.���r��(Q�g%ǃ'���i��e������ٍ1���'-1���!U�<���l�j)�D�w�Poo|2D�lϬ�G|�|@����̨����g&h�V�*S�f�$`N����.��Z��$�BN�Du$S�f1�"���#j}��d]ӕƥ`W�]�qh���(�L��P�[�Rz�~*�ٵ��,
il�U�7����������/�jlP��\�F/�;r�*m
t:j��j)$N��?f��˶�{�R+O�`3��y��7[��[=���-���r�\\��U�.��MBoZ�]t�͠:�s$](1��G�Gh�ˇ��m��T��n(_<p���267(2p�X��}/�Tu�z�h��D_��6x�rZ��d�;���!�0����Q�A��ؤ�D�|IO�s��W$��P ��n�}$��9�!��0�_�o��=_?rn�;�;�셺�s�PB�pF�c��/�����JF2���h��.k` ��8�A����%k�7�����f����Z���lD/�_%5�����B,P�	C&���k�EA�F>Q�R`��(��a
������ٲ��/?�~\�y��7)�7��A���0T�Ty���p2M�5�'Sk:QXV����&�T�EKw�����ӓ Iɕ䛾�n�?�)����
ٹ#��s2`�.M��8�ƚ\�R�
Sr���S��pؒ��]	#|�b�,U�e�1��)���9���H[���uDd�E�f�$m��sǡ+��L�)��|)3�5�,�R�*X������KM�L�s2��'|�)H,18(˕�\U���f�r�bSj�̝s�b]������ׅȵ��Qΐ1�'f��pqǟ�&�b(�	��9
d�DS���i��;I�-��ru�P���K��.9���"YS��K����g=6eKd|��
,ծ�HMʮ�-UEKt�*���ε������q[�T6Ŧ,�6eK����uK�ǡ�YG|\7%Eqs{�S���ŭ���c�W�-ֶ��O
n>w�̦|���R0���9ܵM����9b�R1���y�9d&oi]��[�C"����h�9	/�R|$!Ȱ<�%$RxDޤ��#\5E}4j�89jª�
��/��1
e6��R�J���y�\!z���d�a��,/U���2ñ8\W���6
��>O[1�9&O-Ew�بŪ|���|-�H�n4T	m���0ʨ�B�S�|��X�N,�2B�.�N�潌�bT#&~F��\St����|����8�~�Vhش-�)$��T�gR�xm	����1!��l]�Q16-� f�Ȇ���stU���r���x���7�|Q�(X7KUVx���h�	#5n&
:*j�<����U���cg#gGG�;�%9�Ǯ�PQމ�����j*Z�D]5s`��4L5Q�t:�����Q�dE]f��A����qd���6�P���r�KvHB5E$��½��t��|U�h�D�p��V��xaZk�*ȽeM�g
�����g됩.���T���qij��f��pz�8���fR�8�X8J�h����1�>�`�LIg/7��[��f�(��˰���e��Y�墊��"�L���Q$h�xQW�@U3����#)��f������7��"
Q�h��vy55UTq�x5�ޖ����q�I��yI�T�9c4(ږ)5�&&;?�ap8i�!��΃P��*����K1m]H0�f�t}�a	���g��A�z�FX*��QR�������h���E�j�,�]D�,�'��"lL3ծf~��ml�����$�l�W%�F!l���r��i9iѮ������+CR�^2Q���SM�����Iږ�O
E��剒���"8Xv��h0T���JZ&ֲ'�~�[��UE�����Mb��Zy��-�4}�5�/D�Z*<����,b-lg}.��g���M��Nr�Uq���U�G:����*��	����nEN�&�E�{��:��v�zd@����Zm�����'u��r<0�a����`0��G���Ņ7����æɉ?�)j"Ru�B�4��_^��-��X4`�K�tŜ��Y��y��W���"��2��ώ|��:
���/��K������_Z�+1��0��ߝ�`p��n���WH��K����K����5�W�S[�2���
%� {�WX>�=̓O6C�$2���|�"JN�]�r���AX���>�@E�ʍ;�k��5�6~��N���%��U�<�R�E�Q.�1-#`E%��>	p�����|(n�T��gB`(���>L�����a�&����'�Ì���58\�$��-z��&��ԥo��P�i�\�\%�)�q3��"��q��R��󖊴��`W�Xy �,%}τ��Fh,(�JC��-�]HR�r�:,�!�,5ỉ�����7*^�(q�g�y��f��ȳ��f�@H����RZƀ�A�Z����=,i0�Gz�	@ �a�y�����_��)����ψ��+�ˬ�A�Y����b��r��d��b-?ť$N�������`ϊ:U�D���Q�@����**e��Зg�d(ME�	Vt��v��vP4���0tr���(6|�q@�t[c1�Ί��>C�v�(ͮ.^����U����2;��?e�u��h������wP�[X&�mΜ0�I y^׮�_Y֙���@3'�m�Bz�y~?~�aЅ�򝔉-��O�O�E�V�fdb��R\Xe%qY��U:UbwEG"�i�����9&�5>�۠\�s�妠�Z
�%nᖕ�k�hl(EUM�K��g;�x��@�I�R�Ck�G��8W��bñ%�}�LuC���}�t���JLqEU����(�L��H+ao&�5���t�wء�/�&���hik�s�Vwə���y�[����RZ<��B�O�XN�R����" B�Kgt������C3%������mMMUEHBS�f�������?ʒ&���K���QC�r�/�إ�Q�Z\GC���&ꮐ�E�rj��i9�c� i@�igfT���M�R3pX��~��\��=�h�M1���aA[���k$k�Mv��6yw��w
��&�EDс��"��<G�ΐ����M����
)�,
�t���XJ�a�jL�F��T�)��Y���^TN#[#�z�S��]̕!�M���D8��@��7D�}@g����/�ʍd�n�Ӈ�f�$9BZ�˫�-�&���Zcv����1f���[��#P���;��wI.��)&�&'8��wL.AÃ����WL~ͧh�wR�a��q�ƛ�f��>\ʭ,��B@�Pڕfg���j`R7��@��+��}6R��l#N��)�-�$(�������0�؀�ufjۨ&�
^(�-�Q��^�&�MNhgک���Z������8S+׭�8�ᜂMbh��5hr��`�գ�΀t�@8�$|&�TK���qB�'A�&���Hx�@��j?�F?��VL��2�7�w;2[?���ި�]nG���7�B�X-�Ӌ��\�;(����y� 7mB\h��	�T���G��\!<��N%<��w:@�s� �i�gbfn+�[��T9�m�*��N�=H�D��=��0G^$'��Y^ �
�D�u����8f=9�F���njZ�^1�����x���R�\� �}`nV�⡭��G�6W��nC�2sZ��u_���(O젒D���:�+�g�3�����ǔ�mN>��/�/��?��`B����
�u˗K0���N0��Jf�#/��.�M"ǔHc��&�R6�Ʌ�Z��{�@��a�8I�/0h���YC�`9̀��%˙��5R��10�5eO�EPN�y���ە�p��)
V��։�S����{�kgf)�L̃�:���7
��$B=����Nr��ML����q�ڶ�D�ޠ��8��w�*Ҿ+p�k�\
�IS]��_A�48�܈�H�p�����K���A�^E�.����� }��ѡ��K��%���z��^ؠz��f�R�]T�Z�
*��#;����3N+�O�(A�JY���K��r��>LԧP���4ς��}�r!i5T=�. �8��BP��nL9ca}@l�a
�I�������6�e��٠.5,*�����~���q�D+�сYT�i����������esa�q��9�RGBZǎ9T�ـ<�}U�*deQ�	�;1�WN�(��������^�PmF���v��~tA�>j����
ρ=\�d�D+�U.@�FǮ�� �B�g�=|��>y��X����qX�_�ѿؐ/vW��`�@�
����,�>Y���<�ڣ6��[w�Z@�]�_�Vz�PO�;;��N<�Gy;\�tp�f�7"�jM)<�\�"B�ex���u�v�ž�ʮ�c�w\'#��l����+鄯R�lR.����p�V5������
7����&h��B������ݒ{��ݙ��79{�?��WBJ�
���k�h6�aE��c$-#�_����r�*ۚ( �)̒$p|R�
�����Α���w��_ ��0��Қ:_�:�2��,Zz�^��Y9T0�Rd�8�6�G�`�RP
� �(|��)��V�%!�mﴵ���w
a�u�bPr`�B�(�7�'O�m��C�'�,�1L�okGի15��U�f��J���5��e���$%�$9�mm��T" CZ=�R��@Z��t�I�DdB��p�l�'F�h�Bf�Ƅ�J,�-��9ŷ��p/N��1�;���A�ླa血���
i�����A�,q�L	Vτ�H�Em�PF#�r<v�)E��63��;`?n��
�O&|�(|�$���qֻ��-1x��RV"�U�y�g)l���
��@�f�Q��v	�e]H5�0w��I��['��䄶@9��f'��T%�,)N��TMW��,�<�����C��枀4dn�O6}Z�&�P���]�����qe���b�	����6|bh��m��6'��d8���&��UM_�Z��ziEH�OFq%8_����1�ZQ#�oIeI�MZ�O�!���Ð��t/k)���}�c~.��g¯�;خL�H�m7(ë_�H��76��cz�3�[������m5�,|�ز�DB���}
�6[lْ�!2!i�eơ��R �(����j�9�v9{�Q�=�0�c����~��C�`:t'�:�i�YB�����p�|�m�cۡ/:%x-_���g;o#���Z(�K�Sb�!���=~�[�W�����ol�3����e�|`��>�#�p���m@�a��e"�≟���kJyǏ���p����7�+���m�^h'�)
��rH�M�v�mj zk	3��Q5,���Q���/v���t��Խ������jh���9���U
�y��q���:�!T�|��
8�PG��&
 ���`~L�@JnC+ڿ`3��&r
F��s�5(�sv�|<_�J 	�mtVҀ�6!�ZC���jAȹzG̗Q['�v�v_�����[S_�/��%�?���+��-�_���y�G��[r<~����tXB�����=~Y&ˑ'�b�4�N��eV��i�4/q�MfsJo��egh��u�I��t�>�G,���'��Ϫ0
��iY.��Ml�%0�J��l����z�A~:��#�j{���\�&�zI�A�
N{�ϡ;п����؀�����V�]�0�5�(2]@ֶi�R�f>ҡ9�ѻ�����XL˸罞��C�G�ڪ�n�qOF�ڸv���W�����y'z�T5��h�Y�"�ƹʶy?�d�5�U
�^��ltJH����q�}T���8��6��y��7����X^)#���ꈓ�U`�(��zx���w2��uj蹓��_k-� o_1*0�|���JXG�v��(��RHZ�B�Ke��Q*�m����� �<����cj���3�JG�_v��Lr��
?�A"0-E�9�R���lq��;�/P`?�Q�\���~S���byZa�Q*yC���\.3�Q��0�tn�>u��x=�g�>�2��? �lޮ!��~�
��~���9l��{֎�b�\���g�u��� �~ݳ��(��@�AtaٹNq���m8�_�N�y /��a�Ofa�՞	i"Bd��#�v�`�c@�B��ߤn�o��qi�*j��]��
�,o�+.S1��(�a�W�a�E�n�z�̲���j�ݝ����
����g�J��п�v0�al�����:�ǯBL*�����}+��w��;p*�rRV��AN�@`Hl}�]w*ʹ�C����Pc_�V�5>���׫Fsw`-��i��-�9Zˇ7�h+J�eJ��k������(7-��a^϶_X)W���:] �m��C��=-���͆����9yq� ϋDoA�&;岈d���
�N\��(��kj���s�º�^��Q�a��J��l�Q/��"OY�սd���g&���Qسt_�{�՟0��yⱝ:A-�q���i��כ��ϙ�,[{F؞[UB,�ҐE�M������ud�O�Ã�2��5r�
�~����+�¸��9#/�\�v�yȸF:�Q��j�;�*7�������`:!����������s��22�7UcQ�i�pq$��b�#�k��t:iF)�<H�O�$�>��_�V\����#5%
�6ruȳ�(;��7k�'6Rur��3�;riuάLo�%7��O{��{=������&�Rgle�-ű%//�aHzX)cPK��ZW��ux��%�F�𦠼`x�
(�[w��V��`�=�V��J^��)��zy�,�"f�p�<�/zݫ�[�*��eTr� R#�����qٿk	���5��I����bi^Ь��a�M��0$�>&���.���Wd�~�,f��j�s����@��W[J�$:�nY
�W�vl��H���R�^�'n)�3�}��wL{�Mߏ@�6
���~�6���k��Oj��h�<�ń�I�"�͹�Lb�Rk�gZ��X���	B�K:l�_@yK���#�j�����	o�^VH��F�?���+Q��+}w|iP�n����P�N�0�f��e�i�3��E<n:f�kÁ�g���.۴C�J�.F�[
�ضY-0w�x �2��ʏ����|�r12�n����j]��������y��<��f�haܬ.��f�X�~Q~���7�����k�ex$�laK�9/1+PN����&u���?��8+���7Ȩ�g������I��'�čj�<m����(C��N$1K/8ʠ�|�
;2���b�2����'�i��;�|�o}S�Țt�s]�^wu��N��#�B��wDʟ��bb!�rL��t뇻?��!t�e�=�8es�=��%g�O�_��
�yX�a�)��9H�����V^�=�LJ�0:n��\�چ(�ib��#��“hs�j���N�Dֹĕ��!�M�j77��m��<)4+��+fk�5hwn'�@��\��z�۹�t��:���6-�y�<\l6��פG�`K�
9�-�;��K��G'��X���b���!�>�4�4�K�F07��Z`8k�/-(�eȅ���s��XVbX�DT:�v��:I�^�c��n̠�9�,�SN=�O䉇Bi6�I�B�>�yYz��K��.�zYz��I�V�W����v�|7<�B}��9�m�3O}]����ګ�.�~e���+��j?�9�s�{:�Zй��v�����R����bi�{���V_m��e��ׄ�S����f_�J%=��F��rz*�9����i�{�S���&Y_�ҞJ����K�]E����嗔ե�T�e�T��������zU�^Eէ�s�^���x�4/�iU��
�j��J��5yEuq+�b�sYUrk!�?K�Y�v�[�Z0�r֕��2O��¾��=Ů
���Z�OҴ�_b8%����p�%nQ'�a�~�)+Zܲҫb�W����nelJ�C�W.��e�Z�jE��E�6W\�qn�je�u�slV��Z��Mj��e���ժ�7���BWԶ�Ϲm*����W:;b�	�t��>
m1��i��>Mnh�u���-�o<W^z��}�V��>�nԻE�#�V�or�h����V֯�Zߙm��H�~�W{�Z�+!w�v�v@�6��Ŧ�������̜[�ƠQ`������Е�c�s�F/]�R�|�v��Qp�>O	/I�B
D����́��]�s�F�Bm7��FvS�s�M}7-s��)�UnA7���N:I+��
�䇌X�i�3�f�/�U�q�F�=�UD�ڇ^ݲ_NK�=��g�s�Vٗ���w¬���z���g������1^�x�V��y��//���{t/�%���w�-��M@�}_f�)�n���jW��M�������{lW��M��Q�;�GZO���-��܎�L~�Q�#���d<��/����K��[�$NL�;������dS�'Άs��)�e~��3fL���GŻ/�F�
Žr�$���Y�����M;�_���s��s>?dƝz$��M:&`p�(�����蝿f�:��rsֻd}ژ��]�2���^N`p7�"�B�T6#�z�rF��=1���h~�S�iN�s���D���T���\�Ϥ~B�z��6��_u��n��;�ٻ�
�;�ػ�s �j��?h���m�ܥ�̾Q�"�u>��l���_��J�j��S�Y���W�W��N�N޸=�k����~�Z��[�d
ܸ��A�~���f���?����7�_�?ߥ�P���|�w�Kg��l���=������m����d�ku�����=&���E�.�ƽ{��g�|,���K����w!c��Í>f��},�gc��y��M,�O?G��ͩxl�����'�1���ڐ?�5��%r�]�\�8({򀇚�!Z!D��G,}������L�6�_;�v�k���mm�mϢZ��?�h�/��yDL[��;�D\�E�<���2.n���ڣf^��{��z�s�z���Q��;E^��W�Z":�Q���#���E�>P��R1�z�N?T��*����y����1/.�(��FM����*�^bєyPFY�Qיtf^'���4h�y�"K�:S�:�'v�μ�"��{�h�yޢ��r*^�ͼ�QT�|�kI��4O]�3w>T3O>�3>�t��Tt�Ak�äz�'Oѓ]D�ڻ;�)�͢��}�Yw�n��c:�����[G��v�3H�]��7Ď�/>��:5�zt+������\7^����k�m:6O����!���颕���ɏ��͏ŽُԵ�/=��o��o�s��G,��P��U)��I�N_�a|}����z�%v
�"��X��D�w��rŻ�z��EuJ�W�Hs_�a���]�����]��*�d�i�t��v�}o��3o��co��+oI��nJ��$�W>$��d���ջ�]Z��vT�W������f�������a��q�@�s~�ϣ|2�;�h���a����o��l�����	��)߮J/�)t?薯�R�?|g����GM�~Jl��	7_��:�jx�g~R�n(7!\։�R�@~��"&e�7i4OA=��	l�6h��ä�%�	��Р��K,M�D
�>�c�o�ur1��EY#�N<F�qR������E�P���(�Kg.����j>@�0%*l�Ԓ	���ko�����Y,��D�����O�|�).3m�ê�';��S��OI���2f����m�	�`J��PN����F�;F1��lP)H31��!Hp_��a)�,�Nb��,�CL��X��y� �h{���N(F鐓A+L#��^ �JC��(@������
��Jb7����~�
�5F|�*��>$ds	�N�P���U��0.L�=�8�U*�Y�޿�+I�2*���Q:����
	ِ�ֆ>vH�|�ĘE�<N�8�,���\)[jm�H��kq��Ӱz��2��B�#�\�a�|"��5���B�0Ƒ�'��I'-]�z��ٺxKh]�BV��9����=����#U�I�V���i
{��mh�{���{N'4�վR'Z��AY'�-Z��n���h'�.����m	������.���y;sڣn��Q�I�5�7BRwa�Aŏ���6�G�}�djm[C�M��x�����i��w�C�~���aWY��y��҄86?\�#�� �7�#��<'~ؔ�!<c����7�d��7&��X��a���_��
r=p�ǂ��{�o|� k�"~!Ͼ|��oX�c��~�Z�����x����Ji!�������_#^��P����E@=�Ve�O �(mL��YJ4�~e
�Ҳ�vN��T&��a�m�S��7�I�=EK"�`�'VS�w�;;lj��+�L߽& ��6�"�eiuNq�r�BKC=,9����B�˂JW(ߴD�%�����d���^��\�A�8١o�
k5b�M��[��%k}�j�c��oVY�3�]8��`�����^����66y|+��㵕ʶ��w�D%��L.x�2���� �����_(Oi��`��+� g�J��p�˛� ^7�ޏ3�;`y˝D�(=����^�̏:i���ۏy5�;8�[��m�2���~�HQ�މrS�3���[�e
�V��p�74�όx�CAl(������r���w�}7��k��@f7#���I�&�"1e=щs��^e�ϊ��q��=�D��j%��i'G�z�@훈M&�2�lV��?��g���,��A�|K.����\�|)r����%��*�g�+��'��T�1+�a���.��}y���Cҟ��"o<����++b\�(F99��2W��$��y9x���5�O%Z3r���w�O��۽ \
���p��lVI�;�!�]lM?Y�`d
b�:�T��X��>��)6�)��3�:���5r���=d�v8��+N�/.��~ݽ���Cᐙ�D��C�v.�����G�e�������;���<����m<t�a ��^U��/LT��w��G���W�3*Ճg���H�>���Wv�7������iU�c��z�—!+�
U����j���5͙�?����*.ݮgB%�����T�w�m/�b��=+�F�\��3�7�bK�v:c(�:
O@82{%M��Ԩ��N�)]���	���5�Er�Y�Z�+*��4�˸�󦪙����YKI�킋�ݾ�z�t=kM��c]
��Ɨqȱ@�Ԋ����B̑'���x��H�g�N��o�f�긗�s�%��tV��J�ή6����o�
#b���b�BK��c�Ġo�%uk�p�5�+[�Z�؅�'��N��`I��t����������B8G�@��[�:?�Rp�����'�ģ��I�j<]�^��s?�����n3Z��~�2�+J��l�|jLi�#�ѹL#VI�yV�
�)�FUΤ76�,�Hq��O��H1ⅎ�e���r2���T.L�Q�|�I�xt\��~���8�N|o��S�Q���e���q��P�WeR�b�`Z=���9�t��)�e_�
��Rw�}��)X�(DŽLf��O��F��w�ï�,쭋#�$�V�I�=6�ȑ(%+�!��L�(�FZ��S?�1����|=\�jA�|�ULU����'�L穜���\��!���j�+�N l���i��CNy�֨�b��`]->�>�[�\C -<ľ2>�<�r�r��@;Ȼ��ݼ�_��lE�M������2YS[%S�JѸ�9�Bg�$�e�bWV��sY<!� BDa�^)(o���k���*�̩#�K
�~�\�d�痛�6D�B��HQ�i`�����iA��<Z�pA��P��,�dƒAqD6��5o��1��~�0<�-�ኢ�.&�I����P:щ+�L�3��Nyg����>�!�B�UQp�/8*�q�&
��猥��o�y�g�y�d)����7�?Fst�==�[��D�b��O,��<�q�
�{�v�@�9
��y���W\��}��~Of��8v��
HJ��j@����`����ŽC����i�4����k��wp�����}U��tew�ʘ�"'!5�Mi��9���³y"��%[)�@J�1��l��FfL� T��1
��[��QE�A�$N���sP��:���V+V��o�wK8��:��R�wm�7cfBK��7V��e"�P�p\e���͂S`��� �D4�T�Y�E�F�D]�n��m�Zj
ж�`s�6��|@��~��G�i�S9��L��4CV���$G�L���F���nآ�R�{���ҡ5�Z�i6�T'n2f��L�J�+w9'۶�B�̞٢�q^�T'9]����x_�
�;_t¥�1�f�rI��O�?FN�∺�����`��B-��ƨ.]�x�E+��Q8\怜z�W�������~��(�8<
�E��6�&�\h��5������d�D��Y��Ӭ�p0����8Ɩ1���؞w�"���,t<<���+`�F9��Ne#�
�<�;�Ki�,?a�Ö�9`'sƴȚ�L`X�HDb�UƯ��E�d���A�V���+���;J�����}��mg�	�w�;��d5�يF �0`�l�!��f�@�dR�>4���U;�0~��|VS���O��@����l�_m�n=�ּ�]�*4r�k���SJ6��27�@k��n<ْ��'9�A���ɡ��vS����t�s���Y/��##��C���E1y��40F�3��0�0��3��;���s�!�7Ly��-�gr�Q��RA����ܛ�(��?Ýg��E�w�F4�����[*��y��[�Ht��hn=����"�v��x�M�t��XN��F���E�D1���,�ťWG�U�T���6����֡�~:���khOމp���S�Y}��|�Ħp�>����]�aH&�d��>C����m�����:�7�C���L�TD�0,�V"JD�’̴Ԅ��,��I�zxw�����7��&ۦc�vұm�VǶm۶�c۶���ۻg�=3�����_U���Ҫ��x4���<kX
gVB��Sh��Z>��*�Z�>Ӡ�1?�2���0
��h��|�|s{�:���y�����'3V��E$��g/�?*J�(��S��|�)%�NH���yEN(I�=U�
`��b`>�J���$��x�ט@ާ��Nu�0��D���^����)[�OI���x.�ֽ�x{�lw�d��H��z��A�_�|�X���x���tU��bV�su+.-~�w�P�	Y!��I� ��;MD`9Z�T�\�1�����d1��eK�&�1g�K�-�����s�Hu�K#�;�&;��)�wҠX̃�,V�Ή��
ksN�z))���bG��Ū@M|��@@d&�h�pyS��Q�eMĚ��6Qb ��~b���u�R%�rGHO��B�L|E�ɮ͑�ɨ�a�V�>���t s��Ų�j�-u7����W���W��̣��H���d��7H�W�urB���2����5Evb\�A��y V�n�z��7���Ӳ�iXZ*�^�b喇���:q���1���:���(jFX$�_�֒�W�1�hY�Bav:��õ{R�C���J�C*��0�[�LP�G�cu�9i��''�|-���?��AL0:&��\�&�w�OfG���يQ̣?
�~x&�=�^N���qT���-�[E�y[U�w�+���o0�/f���{�|����K�e���Zۊ��	����%��������~�q0o�H�p���z5��?��ETi�?@�vvizdv�}K�ļ2뎲��G.|T}n
�+uú���d�>s�$�6�C��h�y�e��h,$�Lb.���̉Z-�bQ@��dOJ?d�Q5V6��Pq�\�~��F�5�.�A��`

{�Ftl��w*�W>SL�o�Eըf:�B����H��F��%*i� $+��cO�zj�Z����}�ر+3sk���1lT}��>�j�6�4��o�B��O�
��,A$3����`EE���u��lc����"ݶ��&��)�}5�%C�2��]g�{�l��D4�K�†I���(�Y'�.�Wޅ�sdO�{As�EJ�U�EL����B�_�0Ʃ��&�6ac��$��)nN�&�p]NiB���l���p#O��0�~���8�1�n�%�<Xբ��q7l��3Дp�ʂR�m�z�vg��2(���䶹ȶW.�C�sf�v��M�݃]�2�%�9,��+�
g�^a�.d���:��#��DMTZ�"~+��Q�8&��O�č`�AR��|XM��0D�^I��U�
�ב�k�w�|A�^�x��[�1��ʹm��P�m=�
(�c����G0�޹���c�S�DN���Jǒ�����`��әO�/�2��X���Nu��w��wD
��u���tQ��E��׌5`�p��Žv��k�/Xno.J{x�üe1�$�<�i�}��p��"H�	y�ȯ97:#�����áYg@��y�(kC�`K���:�W��%^�<�S�_��S�#��v"Wb�hz�7�kE�LK�Z������[7��h�04�<?I�֣��$ߑ�w�ݬ�y�P���{�r�,��T��-6�~���^#y-�ۈ�3�X�W��ޱչ��U���q&�9��]3叀8�܎���\i�t����ŲwFj��)���΍�a�ٽm��oO����tWKbŠR 0��ι�"��c�s�"a1�:ύ�ٷ_�s�PC)���Nh>s�3|�#����t���EVh��x�(����p�5Ҷ��~q`O��J�Z�|�Q��T4����#�|e
��W	��&*X�$.kH��@��-�w�G&�V�~������i�m��"��."��Q���~�+�SxI�d�
4Ǡ�}�:��h$�ᆊ=�����}�Q RF^����s�P�+�/`7�)�+A|i����ަ\*%TZ%%���e��4���s�CB�����j������2����p�=B\Ԛ�M���ӯ?��"V�
8��߅D�#�Pt�v�sv50��ko�?YI�>>�I%�&�j���(�F09`~��<fh�}���VD-W8�b�6&������
�t��;r��}=8�Կ�;8n(ᐗ	���4"�8A_��@��Z��=�4�T���3�h9e@AH{�5#DBX��da]��Z���Lߕ�eVQ$��l��	y
���wf���$����=>�j�l��|,3q��8�^���ht_|����7�n��-���������9l�y@�A�A��AY�AeD@�w����~Nd*���U�/�/@~�.�g����O���O�suV�9�҈��cS(Ac`��c�r��*Dd: FD(F``��; ��=|$�+$H�cء��,L
|��c�C�şI�3����tl1��G��m-��o��4�2��ga&H~\����(���ٓ��W(�
QZ���JGWC����;�	��Ϩ�-��x�����m�.3װa|�.��\m-�����h_5�c�f�q�wU�W�k�o�i9H%e�H!��6����C�/�_��L	��܁�d-�i� ��k��Q�����$��ʘ1�����>����T���������˝8���);���.E3�$�o73"%�UOyw>
g��#��vG��A��yS,���f9d�g����KN�3e��>��,�����P,��!�ڇ�a���B8u�B�jL&�&#��H%��}A�,)����S�õ�Vī�l�`��QN���D�+4������c��]ӳ6�����I�=�ȟ���z����
4�m�| 7@Q)����R��'���œ�K�5Ϧ{$:H��`x�7�Ӊ�)��&S�w���/7w㪦jB�|�%`�Ġz;R���t��	��F���c��{��n8h���w��'CHoeYV�I�ʗ�}Ѷ�~���k���D�/�e8��u*GЂX�;OڗV��4n}ΝS�iҺ���O��O�	���G>o�n��oI`S+�/[�ݿ�CGe&�.[5?�9�Rd����b���!��q$IEb��fT����9�S[�Q��m7`�*��K�X����h���&��7(ۜz���?t�[=s�Fs]�pX1z���3���bT��L3��]�WЇ�k�b��#��.W�e�+��dN��ë��eg��8ʞVD�>�-�k��#�8Y�E�k�t
���*Kp�Thm��CCT,Dx@J�c@��n�遞���.0�S�@`�Z$-a��2�A'Oa�N�
p��G�݂���Ր�9�s���w���\��V�Q��E�͉��ħ��A���$�&X���1�ZB`�~�;��یxK�=���{�p�(�YE�zr*���X;ª��3yu�q0��+�j��
�w�����Y�Y���q�����
�Χ�yr������h��7��AQ����$6z�T�ƿ�C��
���s]j���h]�s�u��ؠ����;����,��0�S��2�.��{�l%n6plixGQh��5*�����#V"]��~�Y{�VA;-�!u�@�s.ɽ�$��	�s���9D��5�l>���O�շk!;S��Cg���u�<�1+g�N2���UO�jǕH͸8R�����`�p��݉~�!l*�T�s�49�oK�|�yl�c�X�XE�ց��a��t�liǺA}����
�&s��o�ey��Tz΅����隣�&w���i��?W�=�^*xu��qk��nL���z� �Mv��7G���Y|͢�r�R���k��O!c�������-#z�e�8WR��e���(��2Ȩ��D�7;td��4�y�S9����)�s���v]�[�$(:ڛY��O�e���i�f�_�A
U(B|��]��)�x��f��6`�K��ͫ��(>�q�$c����C�{��$��o�
���ٙ�vĶF�B��vZҺ�HZ�����(�L��Q|Lt&��g���b5�
��F˨����Ѧ*�Ѷ��ݛ1���S"�8����4?i�ĦnZ;ț� �H{�y�Ut��ظ�V~���j:b��
v��J�}zf$�M�x�؛ۼu�>$��N]����$L,�*�I�&f�˷:�C��b�����Z	F��6\���W*7��c�����i?{2�����~�2L�zQ6��*-2�p�
Z�4B�
�Br��T��KD�.�|s�Db�9iO��v����ݮ��x��o. _Z	,�	��.��csX�Ԋ9wUn��
�i��z�pp�C`�Hӆt��3C|�'=��pρ�WOx����.ٸ$Vr{���5�O�わ�`H�8/�=�<:�B0n���lx&����<�Fh3�ƚ�IHM>�Q�<Gp]%�;� �'_��>Z?�Η8��贡�){�.2�AL����]z�ws�%*� �����8"��?+5����-��u[8���3R9WEE��f��$�
G5�����B�`֏��`2O1��Cb��R�h���v����畴r���I�����a���罒�����4�����/���-a:H�0,9㏄y
��N��}ШH�oa�iB�b�җ!�^s�b�*I��<��ǂ�D�,�X�~b��dPh�dAW(��		ќ�o�B�?�+�^C*���g$�w�@��u;"}g�k���՛�П$�� W�-�{�. |��NƮ愽����y�q�K>r�������G{M(�̝�c�i��-T|��X���ü����.eţ�^h�N��Ly��i���=z,�/��#�}����(gU��|X����+osӊ"M0#���f����q<IG�)�H"5)��!e3�*0h�^�V�VR9��{7��u�츔�}i ��F"1k�T�?�v*79��*I\pDc�c#�H��A�;��ll�T�v.�oW���r�N'z����G}w�f��ʤ��7e	�_Vy�4�A��q�u��`L]�֔37��4�V�FW�X���)`Gؠ��iɻ��p��dG>�EQz��	b��`�$�k3��:a�ߔG��	��|�=7�մ2��&���!(��Hj���>�;�����
S%iw����֏A��ao�����w0[CpPʡ�ɺ�&&�i+U��lGΠ%��)zO,%�J�j�LM��)��9���2{ग़�8���ِ̋ulO
�Ʈ��5�p��A;8�X�忚�w���T��+|�e��Q]!�3%��`"� F'gKp�݇��f霑�/�9�oR�*v(�A3���N'If#6yK�i15�Fe�5$��`c�Eu���ݱw
�*��+���ul�S��7�7A��$�S��}h1�R�T6|���t�h����9sP�|�Caɐ�(�Nm
E3�����n� u����-9�%�+R8�� �{�A�o����KfŨ[�����o܆�y��+�ʹ�Goң��F�v����^�,�K?_�s���j�4���u*)8�����X��D��K����G<�Y%i@���-�!�\�{��.�îl=5�z�_���p!�@:l�:#TZ��]�Qre�Ľ����$��6<���2�X�ݦ�aCi�Ȉ���euՊ33�����r�gS��I�W��|鏉IK1�����L.��3h��R'���q�WԌ
J҇KN��I3K����"z�h��"��>��S�;D�1��>c]�@�j=lV[XVz�{4��;�e wډ�ʰ�_��`�W���A�lT�w��|~\��:İ����D�Ϲ|��P̘����)�uO�����MC�g|ȷ�/�����!϶�̶X�pDg��T!�udM's��
w;�$$��L��ȏ+�[�7�/B–=�w�I�`�~�1'z�b��5���:�{\N�į�;����O��P#k~�[���\��^4�}�ӡ������ȿ춖�7r��0���i���-�2¶���|J�`��*,8�r4}�%r���x��9�H<EV_f,x"|�|`!�|�)�G�~��/˩I��	�x��")R�L�sj�"�x��%g�š����VצW�����2�x�n-ҥ�4l*l�H�z�3�X�(,�1N���1XV��/q�}��LG���d2��B�ёئ����L$d16�`H畳@���Qg΋�~\'���a6�
�vCW�`2�����
M�Z��z>�,���:IGt zt����9-<Hk
��>eB+�0!VVQB�sU�siΰ�]�*	��[���^�<��5�y��	]��^THl��:8����p�|��
�'��|���0�}�f�JQ���Z�ι�<�8^���-�ʵzJ�"�Qb\��0��D
t���S|c6���C��g���	��C�T?C͂��V�񵹊Hn�7H��N�&Yc��3�Z�YOʈ�Ƒ�B�U�\,4�ؿ�g"1ۏ:��'M3��p*jD_
��:ΩI|e�ð�n��?�5�)u�+ �m�ȡ�����IA⼓K��ԃ�2��1��U��~��{��;�i�lс��Vj>��5�gX���<�Q�(_ho�1ȑ�w/��WϭW�1�j^�b����w�Q*Z��hs��y��ܫ��/kS��t6۹�р�9�
��`c��s�_��t�Zm�V��$�n	�Uw��fJ�7�v2����hnnoF��X�=�З��H�MFl�?-�i��D%[q���-2ӫ�vs����]aa�Q,^�;�mTJ��k�gx��o_����s��M�B6j1��I�Aѥ�1sJT��x�eX4��j,¦�DY��W+�S<N�G�+	���W�L�1���r欗��niڰ��~��n�`�W�NY�
��f�'�~G��۝�ٔ8Zv"���Y�t���=g�I���"��^�?�v?�.y��Ѿ�ģK�=�A�<M���-�*�-��-�,IҒ|�E�"�����{݇�z���h�
�#���k��#�h
~�
F�ezCQS�:��#�7I�������$ݵ�p�B$M%�#8��&6�Z~�[6�L�W�~T����N��k��zPޠ[c+7	B�H爪u��^�����0�����0����Q�|½�K+�N�����G�LII�iaKm��d�
}^	�����\�)�����m2@���7�nJ��4O�����ix�.`�m������)p(�M�Y���<茌��Db�QO�S�����h����z�C�Hub6Y�@�,���]>�$���ǯ\~����ؤ��}|Y�1]�H�b��ɻ]�����Ɔ�j�q�L��!�[#bb
 
����C�TҬ�'MK�{����n>��Ƣ�x���e���p�
���I�ٮ���L����E+�؈���j�K�G���t��7��V�{&�Xf��F2[�E�Đ��5e
㻨��W��y�T���5��F��[�ָ�s�v��������\��@�~U�x[]g�l� �YKӋM�}���d�m�G#�����rz��!T��[0gwC�r��j]��3f3�+�������������K�'n�vG�Hv�w*ū���I�nɺ7���e���K�O<�{���"�CX�O������~��Kl)���P5��O%Mw&E� s�Dy��n�¶�7�+Y�[��y�K��h�l�%�;Nuq��S�p_a[[��7���0,�r���9�q��h��Xw.@�
h��\lN]�!]�3:�}:$�m:�:�v=�b]�G>H��^�:�NS><T]V� ���}g�`���n<����g����PY�Kcg��]�c��� ��<��=T�!j�9�7tP�KQ�
T]=���(�$�H�C����Aë:&o���ۆ!7F�݃]�%+v�,�a%�0�I0{�� �޲�5	�t(��<�C�}Z�~��?�Tv��}�+�� �n�X�H.�X�6���������ߤ�{��]A�\����7]��������x�&��y�_��U|�k�S
��<�b����cz/8�L{s���AU������p��@���s�isE�"���xN{�T|��M�	m�;��1P����J"�L�(o�#mMZQ/Y��9��*U7���H|�.`Q��
��W�c~�;�p��(�X�8�#�Q���駃�Ik�A$����e�J�^��WM�W2�o������VC�y���4y��{�j	�U��FP#�s-J'G(�\�Мo�-�Y��O�Pe�i�E �d���8Ҟ��Ǡ<d�e�Aye?h�����(�G�IӰ�$�_!qI<�������
�hq*��H#����3�A4��-�0�&�|>Q�FeUk�p� ��l���@��47�x��ჰc�ۅ�H�#v����O�MZ�?!!d����o}������l-��{
��º�<�
�� 	���@�_c�t�+�d\�aR��I�_f+(F��f�"�{�W���Tr1�����v�솷󫘜�s���=>Q�hQ�a�i�D��rr��f�lG`Ȫ<���_0��z\:z_�S>����*�<���I>5��]�Rr_��ͣ�tk]o�_��>,��d6pc�������y�'Ik�3 ��4�4D��Ff�ʶ��`�F`��c�<؝U���ნ�9+/E�	�c��o(��F�����:լ�N	�sW�,gL��%�H��=��8�a
�l`�r�}s5��[e)q����̕'�H�Y��|0-�������v�t�􊓈Ud�ǶI�lO���I��Cم�"��N���$��ۛ��;8��K,x�8b]�����P��1�)��;��W�d���w��)v���_�07�dcm�M/��)���g��@���͜�'M#r��0:��O�]M$��=!��SDu����M=q��İn�i�D��v�1W��=L����㭄+���_19?���V8�F�Ea�`41/����u�1/-\s{ghq�_�	1 +���$�E������Ѕ�Z��tv�EI(!6<HrE�z�n_�_�h�K�I�#����r�;9�wP҆z���t���K=���$Ms����7y�d�Q
�����C
du�P���V"kR�-�E>c�?#F�d��Cd�w���Ř6��q�k�C8H�-�-�k�=�1d.*y��="�
��~m�՚�<w���tp)5Kr��
�%��~�B-�u([�k 0?@�Ѹ���g��׸������%������L�Z4�LY%+�x$����r���uij�Ұ��~��N��0�<BaBY�I��eT����ʄ(�rI�̙͝r,���0�QŻ��G􅏙El��\�$�F�%$�Jq�'
�����?��G��o�(�-r��9YY�����_=W9xI�n�ޤ4��CA�HH��o
4j
�f60��aC'}EP_"Q4Q��o����5۲��zxX��r�D8���wɆT��Z�t��8�m�4K�k��'��2�b	Rr`���;IM�T�2r<6A]��	����6��:�)�v!LM��Y����[����#_��ݪP]͊��rR����$Y[�7%���*��@��8��r6~Ԭw�9��ZepI�h_2��`�؀�N��%�M|�U��,�,���^(�)���
�(٘/6+]�3�|
(���4Y� �����3>�J�*~2���K�N��ݴh q�D�;�GIP��Zt!���oc�Xشf���o��N;���b�4/�����U�l��\��
"?|�_B�y�/u�D�%7$s�����Xz�����i�&`o��k���
�sA$�x��g����SZVV���ۛ쀝o�
��zh^���e�*�߄ ���E�J��
�){N����CCݲg
���'!qt��˻?�ϱ+p
�2�ӄ�
2<�1N
�GS�ǻ�z���`�C��6����W-��!{��p,�Jt���e�����3M�N��E!3�(h=F"�
5�Ѷ0lKzez0�˽�h̼�;%Q��/�ͷ���L$�4�ee���H���F�rnRÀ��3w.�"�����Zƚ{~�r����/�`m�/���B�l�Uc7�+.c
F�C0�+�P��� ��u�e�o�^�������Q��� Y9�*�:zG&��"����v���ᰫ��=I���/��X3�!s�&��8�ؕc��=:�Arq�Cr?�U�&\|�'8
��0�sQ�AvK�'
J#|p�'��M�����س��Gx�{�s�.벵��7�����/`R�7s4�n�b'��T4m�o�o�a&�
�f%1	Dn.�G�4���3��@Zvߤ��v�7�AH���qt�������ز�(��u�B�@]���hZ��\�����$�*2�	e�EC��v	ԋc(+eݸ�q���#�`��ni�ԵtX��u��u$\��lr�@��(`�{�'�VMW����5S��;���t�~X�4��fƥ�.0�U/S"�^9��
�k(�w��XNK! �
/d�[��6�q`)F[
�B���d-��)p��#�n�����r�����~+7�����S.��O���j����g�@���M:�=��&d����+�~��v
�^Z�Y0�215uq�}�Ż�iJZ�(p���iL�~x�]?k��&��1�����EIAJ����T���8�9�Vt�<|/�nYx�΢���)IZ�f�Ze�l'��C87���UqwU)���A0����U�"ݦ��-��َ����(�Kd�W�7[�\���;D�����,68�[v��d�i��L5MEle��`mtt�
V:������@b�o��~�P��ML����#�3�3���<몛��#�)��{Σy͢U���&�^���T�f,y{����j������V~S
Hk���EՆ��4r���=�ŭ�Ͷ���5x�ߦ3�j_6�	�*g�L=P
��5�Rޘ~�0>,$�N31�יC�A.��t?�ߞ�p_��t�CVl�lN0x�n�B8r�T�
��Ös1��eHD$�i�=_d$tP�@l��)k��t͗E���GA����j�qP�Ar2$�
�C�2�(�\ѿݻQ6!��yIÀ�;}��!H�Z�֘
�Ԍ�^ε�X�	�=�2g1r��-!u�
����y��B�#�,#GY��8j�����,ӊ[�k�T:�b���yl�R�;E��N���hewzE:I%�fִ~T��3���d�/7�]��2�K� �Q*
����kB�Ҭ��?�x��FA����әkl|�Z8�T���d	�����h�P�K׻8Ӧ��[Bh�X2m��e�;ݞ�T�!|�>��iIc�нN�@R�Z�`DhW�w���
�R�:L�ָ>V�6&/������F�Ő!}���l~&����-�C
�w法{ #9%j{L��jL���u(��ƒN����CXS{�(6���v���׈7���P�Z|���:T�j@��r�,���P졂4U�>\�c̹�@��{,u�� 9��#@fA��J{&��֢�ҁJ�@���Ӏ�����>),� ��85{��#z�Ӵ-M-/I\3l�~�.N���;W=���z�����i-�ۤ霨B5B��/|��Nl�($�ɽ���G�
/Q924���I+ǧ��5�["�ey���Xjg��6~��G��0��<�o�3�Y�wQ�<�)m�K�Z�?��6��-���s� <�(m����q����Zz"�׎��S�����pC<Q)��єW���1!��s7(&g
.!+�%��N|yO���u�/ �$�$ݠ1�"���=�1��\ݛrRd���f�J��E�Ffh�@�#�sC1��bP8q@���p���+�h�BrD_u���o�c�3(��4�g�F�)����]�uf<Ud
6�O%��0B\�T�)6|�6Z�0B2��v|�Z�Q��L����`C9����{����	a�������6,�k�b��*�s2sOfמ/��Q2	�7uW���vCh�$7O�6.�p(O�LN7(��`�P�X���\�/�v��Ў/�vx!"t�D�$�IH�$�BB�p9]Y���R��F��v��i�<���ݭ�no��N:�M�d�/�E�����6a�'
)�34M	���G�E���i�#��([��u;�`����`N�J����x+��2K}��{7VW��t�����y�4PNB͏����s�%��|ti�[�r��x�er��SO��f�J�5mآ1���&�"�N)�JiX������q�n�Jj�FUʼh��j���M�������^��NkP�Q�����m��9'm��|~�4r�M�bqN�	ݕ�`��M�{f�!;@�d�IB���Bk/;U�P�vE�4H��:�m�5�Oc4�k'z�?M�9����[�S�����=E�h���O,�V�q�
��������)�dဤ��\�ʢ�67�o%�Wk
)����=A%5I��p�8�mU��#jYäc��ŗcj-�C����#ÊC��b�c���+��}j;�
�vO]�i$�Ԙ��@+�]Wt�<�ᐰTh*�>�����fD�|���Ȉ�a-z�tuU��=e����>�8�8�>m����SrSLmۉ�VL<Js�����4��\�i4iM�(M�Q��s.�����s5���{сP�Z�im:���A-
��kp{�u�5��`P�u���'Q�o9LZˎ~�]��%��C��,ê��ŌVČ��������1y�v"��J�
���F4�*KSe����n����&m�����"�x0*�
<�V�����ck�XT������U4�Ԫ��L�-��şp�OeY����;c���l�(��bv8&�u�0F��t�c�d��N���������C��`!E�a��,f�Ĝ���a�VB>0�O�f��ڙ/�6!^��Aڹ�)���bLJT�Պ��V"t`�m����
��{�`�w�:�l`$�I)�1j,lX�T�!��[hJ��,Y�Q,z���SjU���cC��X�����#5�/�X��`�c�M�T5�-�j�3�G-�(DP"���H�1e�F\À:2�1e�d�+���P;�Ì�
��\�FD<G��;���+x\ ��Q͘z�:�p}��:�v��lW����?�5��Z�Zt���AT�{���K��!^V�=Ʌ���Qvj�Wꇹk����ア	���C��k^�P:��5��Z�N�}�FM����i~�#(TJh��"�p�pɂ^$Ճ�,7�j�c�kDF�6$��e�yim��UV���|�U|�����r��U�`�-�a\�Y�͚мm�Mu�\�&��B�\?�1Ѵ�H��י��Ҹ��d<��k����*t#�(������z������5e�eHN1��`�P�7�ӽ<�����|���5�w��=`��YJ�7*�N��Y�����Ϟ�ٕ�+gw0<䤫0.�*OiBO�G�$k���&zW���Nx���бI3���~.�1w�XM��O���X�8?Ï�>>�c W���}���H��O��G
�P�/k-�N��|B�ފ��gKV��S�~�Q�4p]�bm	cm��vL������ݐzN�~�ʲ����4���Ig�=���3>1g<�PyBam��m�<�_Uy���{�)��*�0�_Q�d4'N��&�t���_�TV?�@���&���
L����O���`2xm�D.�7��T��\_�>�BG\�(���(�DG�<�AF��Μ�(@,�[F_���GA���(�X$W�\�\�����&��R�Ϥ1yy�q�����*������?ϐ;ɍ���W5��熚����D�0�sW��P�������~���bx�r�1�U_�(�0�g�����^���������FB|���q䪨x�^���K�q�0�
�0u���m�]���n�B�Fώx����$%�(���%�P�Ŵ=��f���k�pT���K,�.y-z�����q��
^�nL¾��W߁^�!I��:,l�A� �B
�%����x�����S�!�"��>�d�J8=��@�*	b���c�V~��>�<���7�wy$J�*�
�`g�v0�Z*ķ�F"�c�?C���l�4�S�̿A�_�;��$h:1G@�Oa�$�ts?�T��Ԏ7��,Po4)
�'�ak�
�d�83���6^��.�0l�~Tz� ��Tnp#2��7J9���
�Bj��.�B?��sYrS�LH����"����kx��%�k,?��W<qJ{6l
�/�*�Nc$:�f?��^�a����-��9�:��hw\�[Oi��-Y��n�i��	���
F�tr��7�����Rc�'UX�h��i���a�|ԅ�eR%SE	���"ȶ#���~$|'�z�d���N�
oU�B�7��Y�(��nC����Ձ����	��F!��s���3�������)���Z��$E,#��/ID{p(�ܤX��@�9Z9I��� }�%�i>�z�����ȔY�4ZƵh�S�2�Y���h�׾���^��z>MEƆ/�z���;��;��ϗH�P~��PWL[�BՃP<Q��]5ɜ�~�#�\׀=�I���"ol8|rq�Lx�S4�8��˜�L���0���@����o��<�J*�,i�e��s϶<i��mѬ5����~��e���k�)�d���U�dVG�9p��	Mvީ��L�%p�Iٗ�wKHZE��^��eZ��nU0�E���[�_��D�qrm�Ʒo-ib��D�Ǥ���~�e�A��D���$h�c��)�$
�7]��b����[��(�	r�9.���
>}�w�%�CXv]��ǐ*8�b�������G�
��[dC�Xp�V�
�8[��a����T��.�"�H�Pq��h.���#R�ڍ�$����͇:94~'�D���'���y��AL�E_ѫ�����f��Է}S�����5e�F:w�;8��RnWF�WnG��y��
 A�/�L��������Q-͋M\���8���Ζ%njѿ�+chu�y\��{Tڇ #b��,�6
��C�fWۗC�D!`dY��rnYی����yBo�6���
���\!���Cp�_�-�䷵��D��G�Y%揃���U���=�4�	�C�C�c~sM��2?ew��[��
���!x� 3G�&|l���WĪ;���I�`�f�Sn�S~Z����lVp&Rz&M�*�[�S��V��<9�JP�A�BA�!��z`E�"�e��z�E��+NC7*L�+nI��\�N�8(�e���5hf��<�0���+~i�O�LH,,��s֚icu���d�Y̐�����2&WIk�ٖ;Y~G�Wh�Wl�{�g,�0�WH�{f$�A�G�,�z�e:�m;o�'Y�+�����`=W�)�[e��g�K��j�Ha�w
�|�����[>�D�u�_��'�w`�1{���9uY���‰ނ���`��9�|���z��ԛ�Â<��ұ>����;v=��)��5C�w^�_��q<�썬
��X�MJ���z[��77������:G<~���T�Sq���"Z��D��CF�
��1(��mpB��6d��~7&]�dX�m�F����'�g1�V��[��c�Gi|�H�8�;x*�w��[J嶆�	���q)B$3�B���.lI0��
	�ݭ�zK=�5���*�t���6܋cKO�J�@�[a�K^3�(������m�B��P3(-�i�n���#*W���4K�:�0�nŏ�`���X)4����&J8����•�'d�NF�~�+�z�	�J�[U���p#����G7�y'��l���O�A����Kp�o�L�����z2Π�Π�"�y����JQ���נ/wao.�"UM�\8L�LC�<���H���L޾\�X��(X	���]=�(,�O��/��=���S\�l��2:Z
�g�ܑ
*t��8
}�O�� 8����{�nn�ES2����HE`�J��י�O��	TPP֐��ī��3�|t �	�Ɇ~���rB�Ȕ���T��7�!Á��	������LT��<�.�}?}r>e��&Ҝ�&Z�`?f
��#|��kVt��Mb���J���?������xh��qKw�>FBmX�p����8��p_�Ҷ�H�~�h<�Gt���h\�c{Du^�ڴ�u��h�<�x�����ǔ?������\����p��d}��ɖ�&�Ok�rJ�y_�A�wfu�o-3�Dx��o�}�]?1�A�D|�|��]���
�z/��Р��r�\1��A<��}5q����k�h"����1H���-۶m۶m�Ƴ˶m�U�l�.۶��U�=�9�ow��/�fDFd�[�r�1g�XcL�sB��#<O�����%}%�C̔;��-�xI��`ʅ���[��W���s���;�J�[9{����C�\J�9u�J�[{Ϊ���
�\)u�ܗ�6N�_nyqEp��n"7@4!��饏v�/�ނ"���<���R͔����D8�r�H��5�v����޸d]�ʋ+�KxX�@�Z@Z��"����lUS�#������CX���nP�h��DSb!�. |Z���9Cy@�U��)Gq�Q_�2뜱<��X��f��$-U,;g�r;�H�:J�ar5Q��l�fN/�3�n~a3�K���g���<���n�����ҧ�n�Jig�ʙٕ7����cA���s@(*�i����8�eɣ:O��)�I�aѣ��_���K�a�#��_�L��;O����O��+f���;+����'���-�����9�q��g�Fب��a���*�;b��:���Yh84<Q�ܣLY**pyp;�����hT -��~lࠃ710–����ťT�;F�@d��#,��\hvM�O�΀3\N1��%zZ�\.$�&�v;�oi!�)JE*F�=1=���d�����\���aio���7F�������~�vYeciao���.,ҕ�8��
ƙ�A�
��L�8�[IPJ"}*�	�9��\5'x�B�"��h�بʒYewP�����bk�o�Q��BdWwf� �Aڕv�zOJ82I_D>Zu��z���ɧ�%BE���U�ƕ����G6o�׹��� �W�%��P��!�@��op�`�j��?GF�M`E�8�:��h0�)�㌅@Z�!��n�rbBL��0�����2	%O��Z)�._�2�0�M��ޞa���=Ut�R��o8�0p��5PT"�&"�����f5�L$c�E�oP�̽����%�t2��@0��5+�M�lA�od��q
g���y�3�n䶥!�[��E��v��R�:'(��De'ir4vW�]�8[�T���blA�72P�c9~�TE�D3w�G��c���
����زp8����XP=O�b�O��aJ[
KgC�a�z�}W�Y]-{�VRw�d&�Mg�;���G�s�'Ȏ+�8P�PF��7FF n�]�H�/:�G�Kl����l7[_m�39�p�N3��1RRN��9m(�f3�>�l���|�ʾ��"o���#�����i�7�����������A�{9�`�N*fb�P}���ItVaUU��JM٤��X�����Z�5��Wb���W]Uk����Z6'���Mq������U2�e��x�_����F8��s.n���ns����e���oe,��*���Q�2��PB��������z}0-��{9����_G�C�/��T��j��K�5���1ޮ4$q�m%����J���c��	���:7���d�o:�v�?/��
+z�kzy�����w7RcO}���SO��y?t�0��o)�u�.�����r���]�:Neq�κ<Z�FD�/���s,93tIR���d)�s�p���e[Lg���]��jZ
]�i�E.0�\�t�^��)�U�1����<1��*��V��B�C��Ƽ�F�3%��
��(6r��T���c
�"L��9�d>��xu]\n#�
^��ƺ�^������Qe�u�+N� �m;t�t%wx�Uwn[��e���7zԮ̈���1�L�x��v�>tz[y���3�{�����o<�;Ӝ
�~��g{��o�T�]�c␮No֦�ۃ����OV���O��6�����I9����‹�7yv/@1�R��2�#AhȒ�U�Յ��(�5<�EV��I�"Ģ�%���@��C[6������fd ��O��5��n�h�������H!�~|�) >��q�
ա7^p�@7��U%���z}]��������q�%[qR�~9d1�p'����&�p9��w%sm�U���� G����Z����Ǜ��_��&g�J8��2q�Mj4��n��<�~˓�P5M��?W�tu�b�u�C����f(N��j����c��7�?��/[��E
�)΀��5�7��n4	'9�)x-�gwAT =�Y#���{�w��6 @]���"�^S@l9�삽�Ƭ�B/Sy��Yw�>��䑦.�f��VW/ۢYJ��μ��>�,���Et=�����[�Х?�I|`&��Ǭ��á"��q�-��j:�I=�D�m�z0Йi�jB\�7�X�aY�x��L���ݗ�~q��8{��#?{{���~�Bʞ���t�ʯ�H�kMt���j*�k�#�Ԋ�V��/3����z8�Xj��c�*U�y�r�zj�}{���f����k�C[��z�e~��f8���e�"B����Ɲ[����%��=��
�:�{��d��g�1ƺ9�`�����Ⱥ��-NWV���'@����g{��H��?YXEXT��x��*c���N��;&��}��D�1�:'#���x����;��O�����*�#Ž�1�Fr���p��&�0��*��(ǡ���qc�͞I�̣��gy�lô�\�����bl
Պ�Ftp$�ֈ�|fXUi1�G�7��U�����
VL��A�ex����/�onҦL<D�fX�����G��t/��3\a8T�\o��eR�vW\څ}#���N�$2��ks���f,=b<��T�%6@An�=4vʩ٨�H����-�/7|�J�#]�.��(�	G(\�6<���	�#�]�
�+�����#'_P|�4��p��d��[�!q0+�2����:@������ */��
���r��¡�R�d�%�����<���S�Q�[�4��y
;��F��{�B6��y8��}��mmg�"��{�w�L��Z�.��A���@���'���Lu="=�6���:ic7Z}3�9�erG!�a�����6�#yIx��(}`��T����m��%D��F���9��Q�Uvm��k��j:xa�I�5����8;�e/fu�-����5aHD��.�n��Rbu��6^�(�:�`���Mr�pC.�DQ�5���Ͼ�ůkd�.��i��������"���<kS:�$�Z\v��f�d�FI�#�ɖ�{��)��M��!C_�z	a���-&���y���]��$B�)����P�U�:6�@ou�-�B�4J�{���-�o�O�ۿ
����	'���?�`O4����֡h00�oE��YH�e�[6[r1�fjS����L��������D�T�����U�|�%O��X����[;���FFv��S������+�����msQ@+	�=�t!�et�S�6��Ƚ���Ȝ��'��T.ϥEQ�a�Dq�Ę�T��'3�N�q��]J��܆��	)C�T>���;�F������cn�l2�V��H�Ыjb$=�Ф���Й^qD�@��&?�� ��w/��!�-?�������}k{����?qw���!?M�g�~pg"1�F�
-0���H+�
����q�k����

�P�vN�!=��v
��3��kF���\�h�9QN��[�l�[���b!�{P/m��~`CYn�
��:���D;	�n�s���@n�%#�4#�������@��
�'�����B�W��"ܟ�h�g��<�s"<�����\�3	��s�D����J_ߋ�RlHF�3	.'t��ݹ���grxa6�;q��1�Ir�Bh�YA�ں��n�
�8e�To�ٕ���8��]�P6����n����a�zjT{�K�A��`ۣΨF;"�������26�ޯ��3m�ct'�:�`j�V����al��5�Ȯ#�(T�oߚ�{���[�l`ު�[���dz�c��tԔ��
�l.!�T��|�c/�!׈ovZ�֚��faq�t����%�{IP`�Y� ����4F���jLh6�<�ǩ�a^��ư5���9bE�%�
d�����;�Rpm�o�ą���R�D��l��D9ܪ��W�������1L��,
1�
�q�`��P�XB�[�`UĦy
�҂��_}vEv��l�c�2�p�P��,�'�
o�sq���;G�z�)�^�Ǹz�y<���[�Z�y�����O?ي�E�ً��v�9?��KD�9�?2��0ht�8�w��P�F4Q�F�؃ߩ,iB˃��i
I?OZp>�}��Y/���ޯ��
z' �͚N�/

��<���s\��'�A����@����]�s;��˜7z-����kC��	�pTF�^�е?l�UHiS����	Z`�>���P����Q�dL�+j)1Vi�7��L��(�A��r���è��~Hc(M!t�k����.eY�ȫ��aÜ���v,9�r�-1�n֬`��NӲ�M�yZ�%��P0j�;��;~���f?q�p�Z�å��W��?%�cK��jv<W��E[�j�dШ2�z,����\x2BTz��qm�T�_�p��ń�C	�;[�LÔ<�
��X; �+@��.�Od1��?�k����)�޵��>rp)�
f��4s���KXh9Xh�͖{zq��Ȃm��Cm8��UDm�ܟx�N�[H���?�T9P���/-x���.�hm"=�E��Jc��y0�G���K
�J�E�kqo�b~.|i�I�Ή��~>I�/[�fϐY�@��6r�a�$�3E�k��(����1�'3���l}��)'�Y�����yY��t1��L~�r���+ɍ�1�xفa��Q��Ji�sp�]�-gEm.�r��b�r-|�/|�d'&�#(�;�ķ2Dh^#fפ_j��L�^���W��n�p���ҷq�f��02�??J
&{����"�A�?]h�v}��{d��X8
�4}�+N�u]���͝}a�C#��X#L���c�(����bG�&�u_�F^8�г����c<M`iP�5W�E���M��-9�ƒ���&��9�rJy��@�zցW�{�֍1�0��wR����Rr�%����D���kH~츓�fC�
9��o�Wh��S��M�ov\z����Q9�#
��&�*
���q1dZ��5�e�	�Hx�������5�{�l��
����#�Cvm����ZR��'�^Ԭ�|�c'S&mB+M4��3)�Z��˓�v�[�3I��o|�)�M��mZ~�i����mr�#3�Q�<����f~�W{٩9t����B�$Ԑ���OO���Y���ݠh�9��X���5I(�9�Y�]/S��9�"�g����L�E=��ր<�),/�|q�w��CW��
|�R�)O��%']�����]��tO�?�,���35	�=�v;o�/��k8Pe�ӀҲc�����׉��T�Pg�)���,'�����HW�71gg#��_�����X�+�PON:Y�G5���M�h~��]��z�:�~�M�S�Rs�L��+
ӻSzR�:Ugǥ�.it��+{fJz��3��+{��7���ͬ�J��*�
��������'Gd�(�+�Y�����$�a��ڽb1��N\�C�)N�~���{_��ɗ /�pNq�T�-��|�9Qw]���H��̕�P�0���:9Sz�����g"'űg�9%�6~?v��"��Ԝ$9�l�/���3�߃���x��r� �&���@��R�%��y����,��#^83�{*�z#��W
k1v�7A�W1����۰�
{�m�f/C�v��W�e�n���Xo�n���5��)���k`m��fk�W�1���WԀ����+���<c�f,м1�p&���z�/�ܞQS�Ƶ�+ο<�W�y�;��ֺ�}��M�|F(�>f^	v�9m�þ�5�;�^�y���ڗ�5Hh*��j�ץC���d�h�#A@I~7��c���g�K3�T<Ӵ6������#�Ym62&�de�$7�l=j~ɤ�z�4h�6�Ja�
��[:oR�������c���qx��7����x�C�h\��S�"����܂5�A�4L� 
�0�Rr��-�(����|pp�E�'pbD�����xt�J���3Z�_�]jD1��CS�VF�x���u7τJ�l�`����|����z�H>���0�w$���2
���8�����:9��(�����|�E{�C[��h�k�K���!�	�zа(��zS�0�ܩ�LSHdh)n�1{'� ��`w#+'��6�3��(��$
�2F-�f���Q āl�g��*�5���[�h�=��=�ہ�(�_^��W��v�:�u��
H�YɆ����'��z���V�=s@g��tk�h�L�dSz��K�"���y�G���A��AT�><�'��x}ç������>�F򳳧!|�$<���a��X��0��֢�xiHjp�cW#	j�C�V��6A/���%q�c��X,�H�.��[�ՍMi�/VV�^�p0��M|65H��mg�N��2ޙM/]��A\�#�^b�;'�<,�p�L��w�|�u/�[b�l�c�\� �}�Խ���!�^�ѻ�8U1��~���]���;<6o}�n��$�`ey�V�v�0����h�Q�&I꿅h�Eh�Q�T#�T#�)�)�)H)w��$��
���t�4���<j���e��_��O�S��o�C	�#2*q֐�a�%�QPeC��+��+��+°�OX�Ph�OZ�پ0�oØ�6���
d�����0��|+�v.�)*
_;_0J#ru�]�A�>�R&-&.q'*$�QX�R���زH��-%b�@���@�y`��8��/�{����HM#��Z�4��[�!ކ�m��er�y�"�$"��N�P�"����3�b1D,Z�B)�H�(�~8�n�A��/�$��>rmk^�2�k,^
�6fr�$8ai�$c�	�qtR��D*i���a��B�P�	��#��,�Q����q�Q�Ĩ+<�un��۶��锕U�XU��v�d�p�M�,�b��2��s�d��|;)ǖ�Q;�,wc�?�T�P��$o�i#�����%����;p�X)���d�)uO�x�!
��K�Y��<v�b����y�K$��o�p�qD�(��e��r���a����(,�3�/�/�B�Pⅱf��D�	�-�u��q���/����#���+�A��
��ﲴ�n�F��@#� �Ч�#�ҭM�]�`uF�kF�d�vڱ�צƿ��Jc6��3|�����p�Gb���Y"�+�2����)�A��a��'�Fk�B��R�ʧ+6���P��ST���G�J%�_�ckʐ��l��+�W�F)�%qB��f2�?ڹV�L��Ǣ4p�’Iq\���e�2�q�Hd���]�	�3��8"ȴ�T���$���e,kj�����ʜ��Sw�89.1@��@�裍��-���L�z��Π���8�`��8\�5����N���+�N]k@/���ΐ-����C�^�[��s�C��v��#�ga�XP����?�
b�L�(�
�+�W�Çv^A��Z�^I��������yƖ���&�x����^������v=^��ѫ�=�m��#:�]W���;��#�W	�P�O�y+���&;���~�R�#����Va�S����S�q`J�����St�ԲP%%�_ʻ�qck���f��ns��s%��s��ۋ�)���:x����X�)I�>��6��V�{k�d<+�?���f޵�牆������?'Z���B��+���y���{����������Lr�'z��^E�(�2��]B�����ꇎ��?~�1�d��/ռpUj��xQ�83F>?������W���5��r���(��̵�[��`��Yl7����m��j�{�3�]_�w�����I�`�"#[�&z�BM�����B��N��-��>����&��uG��˂�k�<t�9f�Eҹyj�@��=^�f�ęr��s8�1:ᚻƯ��Sh'1w�@�$�=�2���5���0]ma���Ŷ�9s�r��яAp0���TtR�`S��gB�U�{W?i�*$�j�/�f6B$��FT�3������zP >#����KJ�Sc&�C���
�	��i�Pv���G�2b�8�7b�
�g�8��>��_>��c��?�\#�A���e��W�SPy`XH.������f�g-	�4���'��M�T�%:&���g�&�z%Μ�~a�J���kʏH
�̣��K������zJ���^|�L%E�-�2	P���>o�K0�ţM�t>�&cH1i�!rH)�luIjWW@�Z��m_?(�Ü��8�� ��>@�&G����A��] �M2X��X�eH�v����M�v��Ot)��\}��]�����	7���ۍ����9�x���M/�9%���!�C�2�?1v|��Ee��9�n�P�!�M�I˟�~��XNK*���hx���H~�h��ˉ����}�(2���O�d'TI�-���速���&|�ßY��h�a�|Zd�''�8�	�J�����p�_}�fU���'�
� -�XF��8+A����RS���I���GoMj{1e�n���]0�Ɔ�Xa�Fq8��C%�sœh�Go �4�!�"=�`��vU� �7�Dơ�v�z�t���������B&�eBrr�,����B�r�n���J��n=��+�	$�'�?�8*`'l�����+��'����H3�3��Bi��N1񺰧r��2�����]��"ct7�h&��k�=���e�Ta�)�e��G���6z��b�6��s*�]Ĺ1��g���J��.��$V�mB�n��E��c�5�y�p��g
n���
ٌ��M�,��_�B��i?��k�(�U܃rǑ�|�o���ؼ�r�c����%�g���ف��}��
���~�u��[��d��U���+����o0��}�}��m��my���Ŷhe�V}/���������^�����+2��<V%o��ER%z(#��I�a��F%u�"��Eq{�d�������;e�I�8���u]�;��'�?�Q���]����ۻ�A������{m���>m���x���c���O ;�$�
�Ѝ�{����j��+�������_�o����ݑ�`yB׳H~�~��O`i?���wD���1���x˼'���d���k�|w�#��:��ݖ*�0�մ���1�%�F�{�%K�e�@�|������Qu>V�9}�|�תj_��ƿ��B���Iz��u�L��A�(ۑ�s5䉮
|�M:|�k1�a���/�v�:J@�U��.:��9���򑷞n�q�͝��v��hGE��|�)�V�/0���̛�_���l�mDZ�5��(Xѝ/!wfk�t )x���ݺ����$��=�_Q��-G\zC��?�P\�z��U'�0p���������N�m�y�ץ����]/}��h�Lԧ�7�=��K�ݦ�7G��]#}�lS��K�o<=F�[dr?��)��b�O�!s~�{l"X��:�!�U�䶀��arʷ:�O��h93^I�+��љ&2�J�+S�8Y�S@���b�Zq�D��"�d9۰�V
���AW=`�0� u�Pi�Sy9�P��sI�;�'����՘=¿�1	�|]�]�M�T<�G<��A��\A�D3�J(F�t�ڦ�K?5�Ji��d�Df��JM��"�v�B��AuD�]�N9y��]�Jyqd�&���"�s��>0�^@�]�F䀑]�S-��dʬU�C�r��B.���x�JA�ݥD�j��٬�*]U-�N3�%�&IݦQ�"mݦ�[+��^m�ݦ�[:��V�t��&�N����=p�Xc�|)�!�S���!ͱR�8���-T����!�����fdy�FA���B�Xs��ͽ�
W-N�8���&�S�Zw�̽:�j�rݦ��Jc�.kI½�ST��F-�¢�#�S���F#{��K�^��R�&z#��|��"�G�����e)��U�+���:������x��`p�L/~=�S٣��_�[�7�,`㣒]��RV����&�_M�9k]��a��Q�Sb�To�Y���l����7�Gt�~g�@����%~�cC����o�և���j�(�Y�]�w)iA���!oX�#�Вg��P��}�Q��K��]��]��b����Nş�o� ���!W���mtOxٓ��b4���\�;	�B�D��ʳ{��n���\�;�t8�k�x��AW������H����
[�[,z�mo�*<��
�������P&��w#���X q�qEğ�8mi��>��4$����v��(E�{���E��mB[6T���m�S�)
��I����i�gh]��]E6���������_��8c,� ���KO*5s/��4�����%�j��)_4	x�i&	�X+KEE$Y�!J�F:eAJfF}��*V�m��C��������q�4���<�B�$����4�ȅ�q��q��YAjZ������H`�m�@Sc#���,x*P7�3����Q���f��Ϫ{�����Ps17�v�p�/���.�!%�0��4�'�;�4� �4�`����%�d���AH�#!��wJP�)�߀7���Y�A�������q�� uR7Ֆ
gP���OW���"�}�����6��B�'c�,��Mx��g�V�0=�^h{�����k� `x��Xv����["6�9�P�r��3!��S�v����f�,�M���7��1ߗȣ��b捞�5�tN!a�pn�:V��S>���s��&.\IgJZ����;��4�G2_��A}������	���wǥ�'W{ukSG3sQGW7c���s_:W@U��Q���ݘ4��PzA`IS9BS��6'
6���r�z��b�f��fs��J��v��q+[4��I	����'EN�K�mJvc���6����Iw��FB"�l�f�sƠv��$��eoIz��v¦IB[@Vi�a��X#�(�B�������]����	|��	��Z�ň��[�s$����<�R���M����9���֚{��G��ڲ�k�����v3�㌔[��3�/'K��1�¦:��i����M=�@�!�	Ͼ�]Q���A�Wq�n�5b�N0���L��J��9t�z��y؄�_E�eokl�Dt,���M\��?���]��v���^gby��nǚ�d���.s�X���ݷ�"��N!�sJ�Uq��Ɗ����x���T�>v��x���V�QX������t�<݇���oy mb�U?��s?ƽ�~��at��
Tf�=Sn_��o��
��)�C�)���)�CS��{��ꯥ.�{��f��^]�W�c�?��~�8:�|�>���-�܎;j�_gM��W�F���/�&~�/@#���imgfj�b�_�[bj���Ȅ��C��� �&�]ng���2�@�P�d�/F����p��9P�g�Q}��:
��/J���j�s����}����i~ڠ2BcC���쎘�W�}�M�PץeIu+C>�&B
R��'hhgL���Ã�5�L�?q�ļP"��.��(8oB���؎�ˋ>���׿A��$�TRR�vm%u�m��^oã��/�=��Y�z&�ЕP���`wam�UMO��<sw��iŴ��co�0pKK��x"M�F�ً��~Ӌ�0<�Ts������>S�5����5��{����4�!�ɨE�.hAKq1�k�T������J��W�P�2�1%�p���G��5'��ZX��)c�OȽ^�/�pcCxM2��]�T��}��Ԩ?����xU���P�T��}K���1Z���`��]�U��om��_Ӱ��~��3)�V���� WMXuS�;�\�
$&���=����^^�*�I
�Lș��X0�E��{������ye��"��8y��|y�������D�H����_�n�����( �{�����x͎��8�Q�����B�:�Ӄ� ?��5��j��v��8HG��T��=�4f�ö *���^����.���hYUD��ur��7��:f=������
k9!ə��:�j��Q���}�Gj}�6���Pt�b=�s�7�:;5h(5�p<ض֩Ӹ�I�}�ɖid�-1��Yu�
ۚ'r�M�夬�Z�<E�ZF<*Ձ{��Y�8�>����J3���2{sd�h7c�y\����5SSMyLS7`;�K"�6�;��a†�v��3���$7Ԙ��+�Rɭ��e���W��"%��dpЋ�Ȍ��8[��@b���`Z� @+�n+���n�
�Ky��z��'Jn�N�Z��N�_,>�T���+C�?dz�m&:���@�Ȯ�i���=G%K�9��~�5�P$ϩ�
shN]X�Tm��"	xñq�[�n��G��`��S^.T���p/�ʄj��k����>K�ԒT3:��*�}��n����n���ؔom������ A��q��떴����`��e�{ռ��<;�
[en�� �m�+g'���� �ff����À� �+*,?
gD)�ߔ�u�a��}`Vvd@�����O�Ntc[�@�BE…�2;�H���'��AA��z�9X%�v���4w3A�t��8�؃uB=�f�SV��&��(��w��/�~���0�-9? ^:��+���£<�	Xa�'|%H�bv��Kf�t�&-�u�t�MFP��H��x'�-9�0�
����s$��'f���6q.ŵ�%*��c�(�y:j��z�t�L~��H�o�۪������J�Y�+Q	��5b@�y2+��,�+�[8���"떭�
�q��򉿼�E��Ö�=������>��)�;����7�N�L�I�na�?H��u�H�����<��fm�h��(��-amg��y$T�ZU�1�S[@L�|�����9Z<���>�É7��\�/�<�1��p�kT�"��7.�[~כ	��w�@6*��BD�dp��{�����po�Y��6zy�P㪶jqY@�GmL5Ke�r�'F5�_O����z�'{eɯ&�OM�sTQ�ud8S��a�ߋH癩�h�i�Zu5Gis0�w�[�/��T'U굺�궭O� �J����x&�Iw��%�xD�_����	��F���'~h|taZ��H�)�}/j^@4�j2g���pC��ףuV:�Ȣn�E��J�qs[�
��E1�Ɲg�~v�'���<ö�,tG�!��p;���Ӡn_�5��P���=_/�8!� �ID�@I@��[6D��ck�	�_`��;�4������	ۚ����&~�9���pZ�C@��#� �P��$�.Մ�J�s��е�y�ڢ871d�J�C|����&D��'�@�[�D��#&��wJ����Tb�sY��Y�
����&B
�
*J�SY4�;3�L3�A��L�x�LB�����t+{藯��lF�\lJ�1,sL{b[�pF(ب������c,�2~����1�;�z�.�Ɍ?
���-�y���;vO	��&G�Ѳ��?
���Q~�)��Vˏ�E��u�p�u��-����y��<F�D�3�qȠ�IsY���m�w�.L}RW���ܮM�6фȭ�)�my�H �]KQ�U�:���>젧[���>Ba$F���"C�RPԷ��K����R忳���՝o?^rŲ�a���}��4���3X�v�G��@�͜6n�e�����X����8�Æ<Rl'�R��X��ș��=��FJ~Pح�j)b�eKN
����]!��L��ێ�ۢ���
V�#�U�5!���ts��/���~�OP�L��L�.e#wg�Cq��bkQ������%��"Rp�˒9@̙����$�w6g���sXy�sѺ��p�S����!)C����a`@�<,{��a�iqg����B���bʦef�` �&&��7�G�ƚ����8��T
Xv�f�L
��.�c�|�J����-$�"�O��Wc���G���1iU�T_��{A�7��X�dk��v��yww#E�>�u���X.�Ϻ���[�+_��7Oò��#{�7V�/xh�)J��Sk�?`_����TD�_���Ǚ�\j��}F�ceb�ae�R�'s�+�ҁq4ya�E�\?��T���`,
�R��A������@�\*�:��"��RWK+�l�(^��2@�� �Aژ���02��<Lw鋹�[�pA�w�*���},3��K�V�ژTm��f�#��5,�ф�mטx9�;/�A��$�;�����HA�#g��o�Y�5�=����
�?�����������M�V3Yj��s��VH��5p��@p&���M��
l���(ޏ�4������Q��4Wbiy��zʻ{s���'Ah@}7p+��U*I��
�
J$Ye.Z�f0�*�Y�N��&�8�&���`�kX	{VKc��*��ׇ���i�O���gL�4�CX�%\ta[�i��D�b��ߔ[��Y4��a5ܳ��#	���_I,ZÓ�P{\��'n��.ap�NX����z�{ �li
N����,�u�G��Kȇ��A<�&<�#�g�:⪀������4L%4u�Vb�Q-UX�1c4yF)�=`k3�,�i1�4�L3�"j#`�߰�sD�2�p�4e�u&Z�����F@�
Y�GU:�]�[������R��=�C4�XJ���a��E+{�܀�����z�����.���„��T��)��r6Kb��F�>��$�L�,rە`b���V�B�^��g6taH���y
��ZLb�Z'8sM��8k��u�}F�D_�f\��8�T��
<	��
I�"U%�D���|��E��}
+HoIV]F:T��+١��S"-�N���"�V���h
���!풩�g|�0M��Pʅ)��[��G�C�����:z����1h�/f��q®�
u*�f�4��v�à��^$6�3+a�[n� +4���$�"�� �g1�oɞ�L��ѯ��y�ޥ��b܂0�������l��_~���o��At��uȔ
�1t.��PEdDT�J$Tw�.K��&n����-MI�8#�^�c<ˈ֔����2y_�\Ov��z�D����P\)(�W���{�A�)��q�X�����Ai)�����`KID]�5���
��;����jZͣ@��m%-�/�i�H���
x�����{��se|����0�;�:��QP}��Z$W�k/"�F�����;�L9����/���)���%o�A�u�Y�M��l�!�tT}K���M��gc]l�9–;�Ij�7yz5�.3�`UCYu�5�k¿��D\
�n��Sj��N��Z�'RC�fb��*^�<1����#[��%CZ�=�}���|�n*_/�.��x�{>�X0�uK9��pl�>ۅE3��$UL͚^5�l�$*��a�^�|�!\
C�RR�FHl�4tA��}%e9=�W�3����y������'o�ީ�	\+`��4>��(Ս�o�jB�J�-T��E�L(=I�5�|�.�Qb̊&y�|�uEG_���C�5���2�!�i]+�j���Y��@��i���/�c��BO��������[������G2��PZ����J]0�BH9ωVj
-��OW���^���E���I�m1��w����0�X�xy��=zb�u�m�qB�:R7h�3�n�Q�D�M
U�i��8V��!�ADZ&`�Mg�r3Y��3���-I���B�䃤��h�ꕞ��7��,�V~��Y�|�9s~庎���g߂�HP�E0�jx4��g�$��^�>J}��a����y�������ڟ�����о��Ah��x�!������쁰s"\��Sʰ�fu>[�����R�Q��1S<o5�T�A�Np��}����}�{��Lf�d(	"��i|A�^���ämL��à��C�~&%>F
�ɶ��Tk6��<x
������ѧ�4en`� ��mtH�m5\ט�]���u�
Qy�$q��x�=����4ìp�w�Z��I���[H���<��ݥ
�H	�x5�]���p�E�!�hXx�cPz����x�TI��رmj��`��?�aq~V�/�4|��ZTH:&�ܽ�+ �;Q&X}��<"��u��V{�����2��lY����-8w'����www������G�}N��ӷ�{Ƿ�X�g׳תz���s���r�3�	[�a7�
�ʄ ��k}�O�8m����8�G�!tZ�=��SG�fC�X�V�P�E���Eevn[��x�)����6�m����T�h�3B���V�	��k��dd�
SD��9A&�H֛=M�g���6�� 9��G�$�1�e�U�2$
qr�XfU�Q9M2|�h�Ty���/�s,%�E`�3�J��Q�����r?�Pa�?Q:K)�&��}��JO�h�W�I�x����?x�5��[4�3�̝4m�,r~=�WA��Ț#�3�w��Ui�1l{�_w�9@{3p�er��2��a|rj}���Q,����%»p���dL�2�̤t��%S�ܭ�ύ`p�
� 7*E>�:;�倇��=b��`����WGp�����C�/�,����ݤ�pp�` |^�?�!��"+�4	�lW�ww88(/��DF���Z�:��/����{�2��iY~(�`3X&�0,c�q�rSg��	:Cu��#u�C��-,†3�O���c� 5GM$�+�\-�?��5��o�T�Gl�\8j�n������4���뉕-�ysJ�<��m�P���n<I�;l.�Iw�p<�
�����$F�qS;�8��رs.�lb��a3?}��;��j�0�?P%��h�Y6@o���V�$8V�R"#�:��uˏ~�!�GR�?�1㚼�#%B��j:ң�`��4���dn/Ct(�4�����Tt1^~�CRl�5~��ׅ�2�+�TAX��UJ�"ݫ_A��
�=�q�c�G��&1s5�Y6��(�?R�Sk���pB�i�r��$�QQ߅�/���,f~� s�d���@
ɄgpA�w;�����Ҟ�����R�K'��Ɠ��S:���q���$0�*� ��!��ֺ����b�aOטm���eY�5�C�o5�7�D!�	���ƾOY}]ut
�T2�P�-4�'5�����c"Q09�:�a]v���B�K欠r��L/�>�$�-l��f��0�/\p�[�\	�ʰ��=�����*�b!C��� ӊG��Pl}$&4�����@�ժ^��ҏѶ��:[�20<U�Q�0�¸�X�@��fRR6�_g�_�?=ƫ���Ie����/:�o�(kL_娔[����@�fj�Ԩ��J���	�+B�!=�4�dI�LS����m����9ݙ�+y�*��f�>�Gca���W�>"͸YgJF�j��a_psy�xH^<���
�0إEZ@drI�x�l<f�����%�ã˽̋uh�<��C��s#٦v%�������*x�w�+�{�L���l�>�[}�{��/��X��9���W
���0:��Z�;��9x�Lť����S�@9i������i��lM)E:�B�O\�
v\%_XO�DE�zָ�Y�Qً����B��G�i�A.D��08���f?�jCo��-�W�.�v)�\Es��0�Xw�?�ԑ�
����!a��sw:�9OLn��I�l+y=�>���|[�m�Z�@'�m��3�ݚE�>A��V��|C����o}̈́n�h��^m�7	p-D��i�,K��1d��u�^Yy�r��u�;��e��[a]��L�H`�"�|�t.7��q��>cnה�ͼ~�	w�ۦ�OXϱ
A���F���V��0�A�D��nqW<�$}�j��pB�C��V�G��%ұxM��
"���j���U�2?�bL�.j�bl�>��?��V{Z�<1Et@
�~,x�S��Y-�2Z�{E�v��
_W?�0��
uນ>�\�ӟs�#����!��;��2���\�e�Y$�j�Fm;��]d�$
�lׯ�^B�l�g�\��;a�Ua��y��g:z��(H�cC)VE��k-9d-�ڀT���b�U=3q
��G�g��J�ı%���r�E���YY���A�E~HmfFlLL5A<)e�>�I,Ҳ<����1�VF�5#���PL|L��.�a�)}?���Wsq�H��}մ&���U����Qkd�	K� S%�{�O��_q3i+���pҷz�S���ʛN�Ӵ�`d�5)�2�r�T��Z$C��
gs[�&>I:�*u-H���(C�?Lτ�#�e޺����PNA����l�փ��d��Tț�u ��e�¹�/��$�Ml�D��HO4?�ں���9W�+�
�a�j�������Mַ�{3��$�4�<pi�唕
&Rx<*��K�!a+�!�j]\%B�<)��̛�iR�j�-�nɺe���-�y{E,\�ty���
)��
���K/�b�4��c3~��x��Y:�l;�fx��oՙL{�'��;��3`������"��:i��S�l��ݒ�Y���?p���J�]�!�3�+�Ÿ��Bd�%��j�6^�⵺��n2��3E�:fQ\��!W!�~;P�y�T䝔� �GbJ�98�G���TNK�}<�Y�77�53��i�!Í�!�Kp��]�:<��V7�{ܐ��Y���	�`s�c��T�����s��o�/)2⮓*k����/�U��	̌�^Ⴝ�G�Fb�s���ʓN�Ԅ���B�F"gų���J'B��g�(�`e7���
P�)�v��=��K®& R�9�N���F����A�8�#5�L���j&�������8ڡ[�3���YnK������%�*�2�m�%�*cު��go]_�&2#����c��|�u'� m!�
�
��+ʀPJ�Ŏ�37�ly�߰���!�,��Pk�P��Y@�,YF�֚���g�/�%Y\�OCy�p*�G�?E.�����=�LI�!�j[W���q��׶bi��p`�}Ż2��y�[���-1]G+DtNM�Ygc:Ow��v��f�Khb��s5�bI�M�Qΰ:*�1�P�R��?��d�1p�`�z�k���x$���ޯp����ux��l<��_�E�	�"GI|{��s��1��0�Z��na�"�H0gw�Ț��9���.y�ʂ�]��j&�KZIIU��`���w?�:��^d5��|:�T>.+�aפy�MDkzy	QJ��������C�&�"A=�8A1+G%�a��,	�[��?EM5�<�Bh]`	ہ�u`�F�����A�h��S�~��KÀO7��&�����<�l"���D?gz�����K�ZD$��>��$Z|5
(����K)I���
�3�D�da$�FJ�W��Mu��.=�+����x
�]�A7���pdB��
�%�^�쎊eh�R��ZK��0�Ρ�II귽���c#�.��**�tyVX����%4�I��%�h>[]MF�c���/��7Iě��zy{zGHּ���*��/ʠ�Q�(��"��
�!���h��WDS�"X�/-��C����S܀ϙ��y��Bc��t�.Ӯ��ɮb�0���$�?|
�Tm�2jC._?����*�U�hP"�q�m�������(���]c�*��O�a�*_���Z�.�E��판��g�>��)Tm�������,�����.Qy�H�k&P�٬���m[��N�A���H"�w\�+~3�?ʏ�O���b�r��sK^�;�:!G@��i���j�K*�x.T���:T��5L�c#l|!�y̐��A
<᳥�L�Fk�ɢ����g2���s]��O��w��e��cI�oB����p�.�	�/�a�tΔ4b�M�|1�
0?�������O�U/��^~� ��4����L6,�l&	H|EA@d��9��^/�d��v4_}�ݬ�7(Fj�'��c#�E	� �h7�r��u������%�OB��_/�{	Pa���WM-_����h9Ҍ`w�7��H��d�<�\l��d�!E�� ��1I�5�Z<��fMq�a<AN�(2��4��qE�d*-F*h黴��GU��U��J5��gcF�7�z�Vԝ�H���m@Dě��I[�P�BS*Z�J',v�(׭|�7�W�E�]����ڬ̝����D����� �Gj;|�=
�K�GgF@^ɍxι�)���
P�3��A�lW*�A��;rR��}����6>����"#6=���JW肁�9|,���f	m�0�����-:�C�
h��*��N�U-b0Lu�s��֪���q�h.� ���*���WX�>mP��X�:Ppg7��I.\��=zH?a�%�m2�0�n���y
�٣�ѯ���2��������w�j&e�P�,r�:���k�FiV����c���!xĮ��*�	?��s�(����Gߠ���SO�AV�(���_T����&\%0ˣ@�r�������C5RC�[�fbؖu���V�)�1[71�^�oNV�*��[d�#>�X~��j|n|��2gvY�fm+�ۯ��}��"��#�?���&@�G6�W?�TX���Z��R�pM��B(���@{d9�g�Bc�����0I�
=2���R�B���b���Z&�n��'K�
�<�0��:���rH�G+46�Y$���Ռ/���d�c!7_C��Z(5��p��h<$�K�%�}z�~H;bt9]���%�mEB�Bʑ�̦_�^��ԕ���N�3>ҵ)��
hbqw��?+ZMr�9}�eD�q|����7𫴯.!y�T�(f�+or����E@��	w�-(����A��ѭ�=ˀ�š����٧�9e�E�vLj���D�UM2굼�9a��V~�4�{�����Tr�3�/i�w@J~��(�*ŝ�!6�n�u7�ΰ�#�`���ftu��em�0�]�M7��`f&q3�x��F�2��G�����`��&���ĺ��UrN�`>���W��vw|w�.W�ֱD�W_?I|�[����8�\<�S�%*��S�~�]X�P�~��	^��f��~�s���o*�����]�	�Wp�D~b�P��b�)�@���b�#�g=��z8�M.��.C7��>P����u8��a���;p_�툵Z�dK�ҫ�a�B#����Ԑ$r����(&�x�������c�Hg�i/J��픭_L�]��(;��~��7�6A��e��qY�@ra	�����!bv��+ђo/�c48�j���@]�*}4.��b�
�^a�U	"�Y�x�I�%��>ɖ��(B���B7���C���ݑn�3gNB=�:�����ݟz��OQ��p���?I�9X�;�QT�mL���U[�.���DB@��h�c�MԦQ`bR���9N�iO)��� �-=�0R �v?k1���:�p�t����23�'(
ʡ�]?vZܱn!?WE�(
��t������ϰsl�'��K���;���5ul��^���_�⒤�4�T�Cb<P,�g���ӪrMG�@[-N+c2F ��-3־��a��{�y��8�ܵ햌�*����w�F�Tn�@�5u2hѼ���W���FK�Eխ�CDl�
����*� V�'��@�
.
�M�U�/z�%�5;7
w��o��[�'��ϰM��}�5Ye���`5����B��Ƅt�Y㳩
��I�
����w��S��C����5���}��0ňG��$U�ELG���4U�����J8���Е
�$yL��h>f~��@45b�->,R:�vh���3���E��G[nR�qh)�؆�6'G�����Ъ�yZ�iq�`vꦕ�Y��Mq^���^��]�VH�E	�8��?(e�r��	��]1�E+�F6Jd�X�Y=��K��$��lI���aI�(�T8mrQ�0��CA�,8�HyI�m�_�R�)�m����*ҟ�*��pY�aI]f`�Vn�\�3�������1���D7e3*f�Y��x�@ۆON��cW�&�Z:��z������F�%\.쪁�S�I�~�x,�b�r�rђ7����LM�����P��|�e���қz�^?��?��M� ���Մ�$	�ݔ������PE�'H�l�t�@W\Ud`��n�{"�'-�‡�IHF� !���@��I�ض�_
OI�U�Ym���m�ě�nE�����|*�B���βK��
�Ӯ������[�~y�xU�m;둁/�,�߁��TFn=�Y|[Y��R�_��gEr<X�s��$@x�~���v�=�n�j�@�޲Y=*v{�(��z��0��BB�K��-<"�u��IΜ6~d�����E�FR�+����.	ބփlg0�`mN��DR%��%?F��A�Q����%��e3[r�(�G}ł�ݣu(���&��n�cG��z>t
�W��Di��WG\sO����=�]v�'�vc��O��@]>M�5��P��m�=m�<&�/P����t�J4N,E�'�6��l)��
w�O�c=DE'�K`]O��C5~m+��O|����ih��
-������F%	�.�*�l�
7a"2��+���h�gT8�[��$1�QBci��B<�&��	��=l��^uH�����VH�ʤ���!�!'���%�a���˸�Y����E_�nٓ�q�0,hq��HN�=i�$�Yp{
��MK3�H����3g���d�Ҋ�of�h�e�\���\���a�ӆDު�D�Cܑ�ɋ����y0�S�������C��(���-�cO}(e���{�1��{9(�&E��F9�D����$oO��]�QV 57���ٹ��ͷa���j�h�t���,}��*��b.7"�p����a��ʙ��1ML:��)�b��F�*ƨ�W�x�T?�j��)�^m��a�l����Z��	9b�	�Zm*��'ED�;�A!H��WՑ��3�uW��W
?�R~�+zQ�S��4�v�꫶`
O�&�iS�j��HoiV",�����rL��4;`���\��~��qĿ�x�7�?q�oi��C_OT��m�@��%O�,���<��_	���4}���
��Zڣ�1�5�r���~|��9Ҡ�����Uλ�������f_TT�J�-~��P�甄�R��e[��a'3�qP������0c�]�;�Z�k�"�-���/�Yl��]G���:���
�c0ĥ�{�7h��_s���NY$�Zw̺��ݷ�P�:Z�"W��/��Uj8��X�ZE��)ʬ�/�k��a�O>)%	6���J�A���4�	X�Dk�h�l.����:��
��Ǭ�C2\�c����W�#�Z�����s[S=�"*:�೜���l�����]vKU1Ύm";n��F8��|���?�J�[(�ǵ���>7�(3��2�3�x��k^��K"G��s;�G���c�7�*h
<�v���Z��AQ0���j��q(a��KO��<�Ϫ�#kqgj0W0��=y��눚äi��_��2�I�uC�D��\%h]�a<��<7r=��5ɰO�
l�}�P:�f�;a����	g���
�M
������e����w��A*"u)��#m)�-ퟫLB|]0��@O���*H8�[%��c >�;d_�P���I�����������=C�ײA�G	���.�QF5��d�|:d�Ё0'$����b5r�ĸ��H2�w�sHۏ�͘�4���?59~��0������%��m1v@�y꒯�ENpG�.�6�
����X��Ԏ�p���	&PbYz�ɽsG�Ӑ���y��ڬ��of��,��0߯HS8G������(��X~z��b�E���竕m��(�t}ErfK�V{�'�y�X�x#����$V��7�p�{�%3bH���d
'l,��k�2���Ť�[J]>�0�=!�չ�jh�
`�
���MOqp�˃l�j%j��]P�[4OV3H'�F��ːO(�}E�+�J.�͢�	�>ؙ�z<1��.�z��@5��`)�Qu'��Vx�Vi���M�Z2����4�(Pڑ��U��Q��>Z�T�~��}��qo�����u�V�n�˕�Y��3>n�X��~��R�m��i��Xrh1��=��V�EG��_�?�����y�B�|���"d�z(�ʻ��)5��G�D,F͂�p�slp���h	N=��D+�G��=����KaL�gd���@����Ʉ��I�G��쩥7���(��5��s8�_k�
�V���|H��+9��G ׯXt�],�}���86��(] l�1dێB�"E+3A4GR/f�j�)  ����A���4W���(+a�����t�>��&��.�?(N!Ȍ��/�cH�9Ec�� h�|5��z⸔��;�`;"����؄�?�5����S�evlnչ��ۘJ���,R�c��+ف��!D�����Rsl���$#7\��K]> � ��� �$;DqLbX=�Av2C)���*���l�zgi%�x�@�K��y@%\�v4%#M$�"uS �<c��8�j1v����Td��HP�Ak�8V���ְ�N+���-����lL�#�P2�0��C�F�+k��E�s����B��q�5u�L'����h:�T�?�o�Yk%�e�wT�R�LJ���R�a~I̔l�~<�u�vD��V�h�����S��`����=�Mˁlp�89̵	�&*��a��;�R�2����̺uQ�Б��V�m�=����/�1*�"-Ag�ڌ��p�Z]h��^����]XH{�����KV�p'�Vj����k~�}+��c�:��ތ��,n��E��S������]��K�Uq$�f�>$�a/㧾nez_lG�ZŃ�a�`Nf�@��K8���A��Pc�k��-�-γp�j�Zz�	.���6�#Ť<�\�9���?].'5�݅����F�.�{�V��U�C}�H_�	A13��e�DA��E)��]h�ݴr_�%!cPJ�hMd+��<��D���bD��:ǽV�q8ou���y�W$.I�{�s���0�ҙ~��uih����:���B�ߣsfl��	Cu�
�#k���ɕ�͏
��P��Ⱦ�
�c�I��#g7�K��:��ۋ�!�]�1���f�*�ȓ��]�&�3���J�v]l�%��t��n�%��m��
牽��uNu�nK�1��Z����W�Y����	����N�=鎊[��3U2�[Z�F�}EآR{����6�6�����(�y�}|oݘʳR�NsB�\�7�}�ϲ����r��<��b���|��;��!0�����V�h�U������>}/R���@g�4_�NXn�q�HY�_��]mǺ�x�S�^�����<�YOSfچ���,vO�7�M��c>z	�S�g�]!���3ηN!��0C?T���aʌ����h���f"4L�i7�(��'��OD�]b\����r����@��_���^QE�{��_'mM��m$�[�A���R�8w��h6ָ,�F+�mK�敎�V�*�Ĥ���M��1�9%��!6/5���)��mܘ1M�Q��~ũ�F�1�6�3;=�I�U�͗��W��r=���n�- ��y��֖J���3k�>k��&d
}�[t�����m��$Q+��M��rZ�
U
�y�GA��d�����5L���<�;�e�12�Ϧ��9�?;���u�|UN�׷�@��AH���_hH����.�M�����jMY�7���P�'���	Wf��-"ԧԜXY��
����98h��Q��趺�l��*�m�W�T����L�����'���H�F�c�>�p�l%D�87�)}���X�9;vd�kE��ć]q�KQ>A.�x�P�̇��HKXD9��,Xt&.:Ȭz����[��N��iij��D�8��{�)!f�@»���X�	�aËB����q~Et��Z�(f�q��y�4�RE8B��(v���b$(j걍��39H�
¡d��	[ˑ�{����%���A��j,�Ҋo��]fm�B9��r-����V��?*����W޴vX�ġ#�i�Mg����[�kq�,l�k[��V����VϷ�ߡ�F�ZŃ�LtH��i�*A�k�%�O$��ߩ��=�b拣]q���� 4h�nՒ�C���W{��$Y���*���6ِ���7�Q���=n�;
f�|25��G3���1w�byy@�9^�\7��}�xR�o=���3�R���:�Z�m��h�jF�E�����xy�v���d�х�밽r���Q����Kw)���r;e]sxL��sO�O���'���.��/ϙ[��52.�x���E�j|�ą�n6��ͧ��lM(��Xz�#߲$�*j*K���*���W��}�4���!,��5�Ӄ�f
��HhW���h-US����n5\���$Wm����'��M.ŒR��MI;��F�ɐ�8�V��L�X�D��2�q
�PءC/��Ԅ���U��	a����CPMX_����V�ar��Q�	���э��=�h�&��c���$�`�X�� ���[b�D�5cBY���7p}�i��2�`��߂ج���0,C8yGO������5�ߓ�|�ԗ⾪�BJLa�aV@S��YZя6tSx��� �������zJn'`�4�	�|&�l܉�Z���&��<��}��^C�(i/��p�_$�G:G0���\�v��p�W����g�*�a���)��K�<gGnn���i��1��a	'[�.j���2�\B������b���4T�z��1�-k$���ee��:*�=&�8e�����~t3W�Wd	�X�ɏ�f[�aQ��~���Kh�`G�9��Ɣ��~2� ��k)h�BVP�	=8��#��2Tk��U-�]�"���k86x�Ω�$�թ'·�u��`�!��c7;���0	+X.xNm>���H��������muϠ�g��T�W���) �ۏ��U�p�ӵ�v�N�1���l~�ИM�V�<Sђ�y�>����g�Z���;fj��Lj#��~-��/r�N���GW��a��A-��c�`�dt���dԏ�
�4MΆ�
T�]�.���ŝ��R�+z�<��$NT����+e;��'6�(:��*�S�S�Wȣ���Cw6�(?�_��N�}��C�P��#��PV�
�~�DC�܊u[D!���5��L~��a9�:	~>��
���6 V�r�gfB�ޢ��|)Y��VIqa�aq�I��C������(���R3�-f�E�ђ`楔�Nv�D\�jN������$�b1�1I�iJ�ք��a��`�ĴB�CD`i{l�\��#.��^,\��YϮv��~����AM�,����o�hj�T�x�/ZpX���&�޿�󵸁HA�?&a�F&N�z��I~���{�*��l��2Y�L�U<��
j��Tކ"��cib�e��w�]�M�p$�nQ�Al+�����&�痡d����bLC[�Hf�#g0hU��~�1�����݁`p��;hn�e�\L�F��������k��#(�ʹD�����J��x������&��({�������씶ϵ��A���򡙟�Ho,֯F���51G`՜��EW�::Mah��>U��+f��a�8i���E,౭���0&-�pb���c��Դ�u��O����WƝל���Fċ�z�k��(q��!~�{��g�åw1��hhʪ�E���Kg��:�^�6��jlTQD}�=c����U�ά�T
\ڧ����T�^���f�?��<I4�E::UQp���v���ƃ�V�f*.z��/��� ��mO��}�r;[O�K�!L�o�+�{W�mL|�+y��d�}	�k��N)��ЧM�
�>EGUn<�|�l�qb��;!}�<g�T&�<U�B�_�m�az��S���d�����s405�6��x)h����5-"h�A5���*"#��w*JIu#��ܳ΋sV�3qZܘ��Jy^���G�8��?�O�p�?�x�A��5��i�����:sk�Wֺ�r���o��1�
�M�s:�}����j�:;�Â�\�#G1��K�޴�&4�P�uݼ�1&�Ċ�,Kp�����T�4,{<�O�����̕�ȇnXJ2ۮb{>�K�%�;^�9�ط�C�+o �>��/���q�hb_�9
�6�b.
��ngq�F?k�3����l��a����
�9,	Z))�d�����V��XHA��1��+�VD�84�o��E���<Z�3�6ze�+;}>����~ ;L���;� �j����I��2��Y��pX�N#�H�j|X�~�G��*d�x��=V��a���z��yC��!h�㨁bgl��'E�I�j�2��-�9�d�H2�*��֓	E����V�]UD2(b���(��@�� ~��o�b�&��4�#��&�J�k]��;q�贠�c� T�G�TQ�!�R0Ru��j�-GN��uӚC�~��uNde>Z;�t�j��0���p�lG�%�˼:�(���<���
���TuZ�P�Ԅ߿�8�WPu�:�G?�ơ�Ѥ-�Vbq�^\���sv��z���[�f��΋P+hf��ΰ#�Q8hy���Y�,�{?�o-�aG2�κ��	#	k�SO�R��W���$�Q���17�>��zϕ��"��*�8\��e�C���}�GLƌ�o�_���_	���xQ��4�\����}� �#[Ek�y,�oc�SǠQ[C[� F%C�KMbdR_�~�CJ7��RSAĬ�C�M�N�K֘�!��P��ƭ���wѐEO7
��
��`}�64}�ov���dK�0�a"Mԓ��O���͹yN�Q
�'�Y�S�6��n�}<�2���v�B�ܸ��D�s�)�9�h��LDL���SYS0	��2��_qCm�ˆ�>@��*%�q����g�������Y�te-��e£��O�H#��T�nڡ�b�p9�R�.
�`@��A��w�1���50�����{�(�Θ'-0�d����T��=����3��U���6{���*֠�e
�H�a�Ư��/��Ih�%>.�Ъ���{y�������͖gh[&�6<��yd|�$�d���u���d���-��LO׋M��Ӿ��?��K�QN�̧	��I�2��OWAh
�j*ہ��ވ�kS>�5}.��h��L�[����N'�2��^cJ"�7JF�����9HB��	�tH�w&��3Q6F.�Ex�D:!{�e�dz0f��	H��鴌&���P��F߈�hS����[��?؎IcNZH�` $�����a�aK<C�⌛@�S��(����&0��;ŏ�������_���h!%$A���_�i{��ğ9�~Œ�r� 7h�ɉ�i;!Ș�̴;E����"��T��*bqC�sm�k��+��F3�
%�,}"��*��Oc���Q'
<
	K}�����p�(m���{E��
�`�wF����J�A��#[�6��D��/�H�c'3y&3�Wp��=oW�V��j�_�Z�(�������iq��s����[��EuTnH�U����'c�Cg�;"�nT���BP��$��k��V��؈2)�?y���g�Z��{���4:)�~�8z��ľ�ʗ�� ���r1�30��b	->���+ 7+��i&J�ޫ�1��R���V�PO/U��zl���
1�R�"{R���dm��!��!��
!E�|�����[����%�W^J3+�ie���MV��T3j���j���ƭ��S��z���<	�/�G�V^�/�w]}h��@L �Ig��H��nڻq`š8�	7
֥��,�����_m��Q���G���~�j��a�̏�?f]Wif��nѰ0oM�z�/K���[+�nd�<bl"��e���ۍO��N�K�)�7s,�a�3����#��֡�87Ȃ��#`����n��]��nh̟s�r�z�sV��S�嬞m�8�CPb�K��+�̓�$ˉ��Iɉ��^'y�7ɡ`���`B"4�\�����=OJ���,<��ٚ���м;.<a"�S��-����c��Aͮ=�����o���U?x)��DD��8�n͂���sa��%y<W����4�Cl�o������$��<���"���ą�#1XMu��6_DK@��Й��hf�Tch�V��%�N{���(�O����1z��!��(2̨s�:E]��0)v�?žH�e�dŶ�l�&]�M�j�в�	������]�f
RO���ь���}]P�&���"'@��b��>���۴�PR�g�,�?M+�}�'�����w�_��‡½C�\�QZ�R�W�U�P�8�H	J?¼0,Y�K��ԔK�Y���$��q�PT���b`v�7�F�7����Hg�[�TF�B_{��
fz��%!o�kCY���c�y
ǔ}�e���%��dH0�}�K�A޿
Ѯ�]?_���=]����}��	q�sݻ�n �',X0�6~�P���$�.�����ۼy��	��tW�t�6=��AK�j�
jl��r#��^�C�솆!�6l'�w6��`hf�ߵ�Kc�2Lq��k����3 �-Y��6RM�7�)�-4|E���례ͥ����r�>G^
މ}	Ho*G0?1��t(�C�
)��]���	g�.�|�����rld��f
?=��:�{B��1C�i�9�U�S��YN8\���
�[݃ĕ0�T7�<t�:Fs�W�_�s���8��q��߬�3~ON�d���}C�����_LQy�Ь��s/�ɟ��FW��lGjS��_)t�hHX.����o�w0ݍ<X�{;{['
���%�����U��1`�����WR��ʋ"�(t 
��F���[�'2;
��fLh������u�&����N�~a�D���v�Je�f�"�@�(��D��bq!>��'��BnB�X�r����`}��tUZ�f_�;����2%=�����b���OC$�8��ST������H�R��W�����u��~�J�=���T7_7<�@3�lB���'����W"�~� �٘��et��渐�P|�O*�(�F7�^f��c��
�%��jD ���y
���J7��;�+�r<�GT�>�ٍ�߅�V���r/�S������Hu�6O�:~K���i�=D��_{5�R77���?�'�g�
��﷡���K3#k#:GW�HEi�v��o��y�ƶ���z�CqIy;/E��$`�Oi���"�ky�d�w,�gG_W��Bכ�n����
"����Y:�[��S��m�]��G�9�O���yxg�c�`rpD���s>.�{p2�&�N�|pv'9�i�4�6yf���_7�����4g��~u���.=�����m�W�͑�>%͝�*�g:����SxƂ��+���a����BI,�tK?4��(Gu�2�ַ@#SK�g�)��J��M‹o��g*�uD>�	�DgZDw`�3���w�F4M�yBsNR4j�5�VB(P�I�exw��o�8�0����q��2G��^M�F�)j|(ˠGؽ�62M	w�(��
U Ҕ��[�a��'��>���0>�)�����"wQ �*�}��<�Zm=4¤�[���Ę9��y���>fr�j�V�<���6�¡':t�7�d�R�0	q}�= ����i����}'�0%�������iע1���.��8V�"���u���ia]
�(��4�L&q%�2y;���ٌP�)?;9��{�̥,c�bTP�r��`�8�߈ȡT�vK?��@���?�)r�nuwٲ��'gȡ��P`7�����}�a���!`�k1a����R�܎L�⭠���H��#X'�����#GdL5QXNM;�
F�N�|hh:��l�K�%d)Fd�=�<a���Z� `_�B��*C�G��o��+�e�6F��/��X��fE�%=	'n[h>I
I�Z(��3Ǝ�v;C��W����gV�g��_.�D�)�`{�kF��)�h�~w4H�?_�Š���D>����(G���~�(�OQi�O�"�
�t�"���3�߉.�x�XB�#��X��Y��&�?q~��'9���XA@��!�8f�F�෤R�

��'�V�?,m,�[���1����?�_ �y{=kӿX��=�P����;ʿM���<��t%_	��n�{����qU1�dcmh�hfc�g)�jk��H�Flp������'�h�#��Y�����#ϻ�1�o� �q�r�I��}��IO�����"�����
!��	2}�"$�n�E�����{'ۿ�צ^2!}�����?�b�ˋ[����v�(pK�w����OP���Q��X�J����8�?`��p�_��?]{@���~�7��������#D�}�a�.��~��	!S�=S#���"v�@�/��W��I�	C���oy��u�	��-�I2����7ȯ��)�_DT�Iې
 L�ꨒ�+��#�rk��~��k�Lck
�8�n��-��h�DC-�4�����J�JŖ\u�㽧��j�>�Z�7*>!���C��H--����B��]�̸�{�,w��c;�93w�3��b=��x0��_ד!=Iz��8��aN��<��3Jy����T���Xw����~��-�*	��b�A����Zlz��բ!��a��=Z�\YnvPWlnf��(���	
��ݚ�`���Y�gU��Wf�,2��cw�[�p+�~�e�q٥i�
4�>Oh�r�k�(J6i���4�X�e}����N9ř��#y���$�6-���e]�iy�=��'���?U�w=ں�i��{��i>�p48����#�ja��%c���1��B��Og�8w�x�p<�xH�≴��цr2_�a��
4̥K��|FǗ�@*-��c͘��q>}�du�x�o�ER{��Ş�	F�O/�{���̪��� 1�<$M�KJ�%�aQ���]F��!cC~�*�q��lhjŻ��?�{�u��.�N�PkX��
��dѬM?H �-�o���xfa�k^���&5�=��>���Y�Wv9^%!:ؗQ9�qq����j\W��Ĉ�=N�i"oІ8��րyU ����RY�r�CF�Y��j�)C-���˦W�{HI}��$^r�xLݔ�U�>����XX��6���E��[��t��&��h�/#�Jfi�y�M���E9m�Ҳ7��Kꑞ0n��MRz'�!
o���Yт~�0v��H�������e_%��n��J�__jR��(��	f��P���3�=��:����9�K�)�U�?�T,��Vm�4�����ت9�"LH����6f���$�Q�=��J��ITW*�#҄��
3��pMAMx[G҄x��(v~k�rTJC�{����dI!��JB�@��A
�<y(��7��:*�b$)�ȲD)V��H�nE�0rhgR�q�����n�I�
�jsA6��rOx�:9��KG�%
F܏]T\�ҡ
���릠��P�C|O� h���0T�;�Y}��0@�e‹�NQ2S�2��g̬�d3�ET�_ߥ*�����
"��WR5!&�Y=1)MHTl`|nwě����`0&���H�&���V���xZ�#O�ɶC��(�uj���x	2���h�[
c�J�N�̓i<������X��*<��N�B����(<�i��dEc�J�M����+$?��gJr��PK
��=META-INF/maven/PK
��=(META-INF/maven/org.jvnet.hudson.plugins/PK
��=7META-INF/maven/org.jvnet.hudson.plugins/rvmRubyMetrics/PK
x�=
Ҭ
>META-INF/maven/org.jvnet.hudson.plugins/rvmRubyMetrics/pom.xml�VQo�0~&��;�դ�,��=lR٪u���\��ĉl'���9N�m5M*Ew>�ݝ���z��3�>]m�.�f���
C�L��%�E!
���b�xo������9��|x��9�q�4��-��Q>�h^�7�M�Y4�Y}�
W!ګ�*��(/��fR���qaOFƮ$�	m$RYT�$��L�M��B�2�R��������P
kaGem�o�n�#\��P���#ћ!\9��F�;0<�K4�e����K�%�j�B�[��xSr��^8{������_�H���n��\�,nk�r���-r�Ti]`���Oh����lӮhަ�B��3h�\����N��#��V��(��E�;b,ފ1�҂�sb"ܤ%p��a$V
O��<YQ�AHa��M�����}�հ����Y�]�;vT����q&�D9F@���hA����Ż�?����툪{G	+�H���3ժ=�پ,1hj���p9�����π�d����&[6��Wwr����h@p��f�bҡ5�ŵr�M3�C�'4
&��\�H�����ts�
�g��|��1��g]}��/�ʝ8xYm�5�1Ɵ��$[s�ξ�nP�yZIr9�ɺ��%�X@@Az�x�ކe���eƈz%��L�fS{[��}���u�#�ϔ��3�Yc��Lu�?�E纳�Gb8�'Z'8�6����`��^3a�/�3���gGRXD�>�{~����z���W�a;��(��� .��3�PK
��=�G��}�EMETA-INF/maven/org.jvnet.hudson.plugins/rvmRubyMetrics/pom.properties
ʻ
�0�=_q��!)��:T�:��5F4)7������tB��.�Y5��y�Z�M��#Lj�ZH�
Rt�w�����u���R���t�,���������iJ�*�g���%�?PK
��=	�AMETA-INF/PK
��=@����'META-INF/MANIFEST.MFPK
��=�Akcss/PK
��=�A�images/PK
��=
�A�images/24x24/PK
��=�A�js/PK
��=�A�WEB-INF/PK
��=�A$WEB-INF/classes/PK
��=�ARWEB-INF/classes/hudson/PK
��=�A�WEB-INF/classes/hudson/plugins/PK
��=.�A�WEB-INF/classes/hudson/plugins/rvmRubyMetrics/PK
��=3�AWEB-INF/classes/hudson/plugins/rvmRubyMetrics/flog/PK
��=C�AaWEB-INF/classes/hudson/plugins/rvmRubyMetrics/flog/FlogBuildAction/PK
��=E�A�WEB-INF/classes/hudson/plugins/rvmRubyMetrics/flog/FlogProjectAction/PK
��=A�A%WEB-INF/classes/hudson/plugins/rvmRubyMetrics/flog/FlogPublisher/PK
��=9�A�WEB-INF/classes/hudson/plugins/rvmRubyMetrics/flog/model/PK
��=9�A�WEB-INF/classes/hudson/plugins/rvmRubyMetrics/railsNotes/PK
��=?�A2WEB-INF/classes/hudson/plugins/rvmRubyMetrics/railsNotes/model/PK
��=O�A�WEB-INF/classes/hudson/plugins/rvmRubyMetrics/railsNotes/RailsNotesBuildAction/PK
��=Q�A�WEB-INF/classes/hudson/plugins/rvmRubyMetrics/railsNotes/RailsNotesProjectAction/PK
��=M�AkWEB-INF/classes/hudson/plugins/rvmRubyMetrics/railsNotes/RailsNotesPublisher/PK
��=9�A�WEB-INF/classes/hudson/plugins/rvmRubyMetrics/railsStats/PK
��=?�A-WEB-INF/classes/hudson/plugins/rvmRubyMetrics/railsStats/model/PK
��=O�A�WEB-INF/classes/hudson/plugins/rvmRubyMetrics/railsStats/RailsStatsBuildAction/PK
��=Q�A�WEB-INF/classes/hudson/plugins/rvmRubyMetrics/railsStats/RailsStatsProjectAction/PK
��=M�AfWEB-INF/classes/hudson/plugins/rvmRubyMetrics/railsStats/RailsStatsPublisher/PK
��=3�A�WEB-INF/classes/hudson/plugins/rvmRubyMetrics/rcov/PK
��=9�A"	WEB-INF/classes/hudson/plugins/rvmRubyMetrics/rcov/model/PK
��=H�Ay	WEB-INF/classes/hudson/plugins/rvmRubyMetrics/rcov/model/RcovFileDetail/PK
��=C�A�	WEB-INF/classes/hudson/plugins/rvmRubyMetrics/rcov/RcovBuildAction/PK
��=E�A@
WEB-INF/classes/hudson/plugins/rvmRubyMetrics/rcov/RcovProjectAction/PK
��=A�A�
WEB-INF/classes/hudson/plugins/rvmRubyMetrics/rcov/RcovPublisher/PK
��=6�AWEB-INF/classes/hudson/plugins/rvmRubyMetrics/saikuro/PK
��=<�AVWEB-INF/classes/hudson/plugins/rvmRubyMetrics/saikuro/model/PK
��=N�A�WEB-INF/classes/hudson/plugins/rvmRubyMetrics/saikuro/model/SaikuroFileDetail/PK
��=I�AWEB-INF/classes/hudson/plugins/rvmRubyMetrics/saikuro/SaikuroBuildAction/PK
��=K�A�WEB-INF/classes/hudson/plugins/rvmRubyMetrics/saikuro/SaikuroProjectAction/PK
��=G�A�WEB-INF/classes/hudson/plugins/rvmRubyMetrics/saikuro/SaikuroPublisher/PK
��=3�AQ
WEB-INF/classes/hudson/plugins/rvmRubyMetrics/tags/PK
��=�A�
WEB-INF/classes/META-INF/PK
��=%�A�
WEB-INF/classes/META-INF/annotations/PK
��=�AWEB-INF/lib/PK
��=���q�t
��Fcss/style.cssPK
��=ϱ �����images/24x24/tab.pngPK
��=D�JhQ;��js/flog.accordion.jsPK
��="�\u���railsNotesHelp.htmlPK
��=4e*�^u��.railsStatsHelp.htmlPK
��=���"��N���WEB-INF/classes/hudson/plugins/rvmRubyMetrics/AbstractRailsTaskPublisher.classPK
��=C��
�R���WEB-INF/classes/hudson/plugins/rvmRubyMetrics/AbstractRubyMetricsBuildAction.classPK
��=�G�w��
T��Q)WEB-INF/classes/hudson/plugins/rvmRubyMetrics/AbstractRubyMetricsProjectAction.classPK
��=��3~bP��N/WEB-INF/classes/hudson/plugins/rvmRubyMetrics/AbstractRubyMetricsPublisher.classPK
��=+s�Q�N��:2WEB-INF/classes/hudson/plugins/rvmRubyMetrics/flog/FlogBuildAction/index.jellyPK
��=A.iN3�H���4WEB-INF/classes/hudson/plugins/rvmRubyMetrics/flog/FlogBuildAction.classPK
��=�$�	�E���:WEB-INF/classes/hudson/plugins/rvmRubyMetrics/flog/FlogExecutor.classPK
��=����C���CWEB-INF/classes/hudson/plugins/rvmRubyMetrics/flog/FlogParser.classPK
��=.6 �V��IKWEB-INF/classes/hudson/plugins/rvmRubyMetrics/flog/FlogProjectAction/floatingBox.jellyPK
��=�Zſt)Q��ULWEB-INF/classes/hudson/plugins/rvmRubyMetrics/flog/FlogProjectAction/nodata.jellyPK
��=�����J��INWEB-INF/classes/hudson/plugins/rvmRubyMetrics/flog/FlogProjectAction.classPK
��={0τ��M���PWEB-INF/classes/hudson/plugins/rvmRubyMetrics/flog/FlogPublisher/config.jellyPK
��=(��Y��U���QWEB-INF/classes/hudson/plugins/rvmRubyMetrics/flog/FlogPublisher$DescriptorImpl.classPK
��=��=خ4F��ZTWEB-INF/classes/hudson/plugins/rvmRubyMetrics/flog/FlogPublisher.classPK
��=�iU78H��l]WEB-INF/classes/hudson/plugins/rvmRubyMetrics/flog/FlogPublisher.staplerPK
��=�R�;��O��	^WEB-INF/classes/hudson/plugins/rvmRubyMetrics/flog/model/FlogBuildResults.classPK
��=CoKE�N��aaWEB-INF/classes/hudson/plugins/rvmRubyMetrics/flog/model/FlogFileResults.classPK
��=t��P��eWEB-INF/classes/hudson/plugins/rvmRubyMetrics/flog/model/FlogMethodResults.classPK
��=&�����	>��hWEB-INF/classes/hudson/plugins/rvmRubyMetrics/HtmlParser.classPK
��=�+��6�A��'mWEB-INF/classes/hudson/plugins/rvmRubyMetrics/HtmlPublisher.classPK
��=!���a���rWEB-INF/classes/hudson/plugins/rvmRubyMetrics/railsNotes/model/RailsNotesMetrics$COMPARATOR.classPK
��=�^�\SVV��WuWEB-INF/classes/hudson/plugins/rvmRubyMetrics/railsNotes/model/RailsNotesMetrics.classPK
��=�.Q'�ck��yWEB-INF/classes/hudson/plugins/rvmRubyMetrics/railsNotes/model/RailsNotesResults$SortLabelsComparator.classPK
��="��m;V��j|WEB-INF/classes/hudson/plugins/rvmRubyMetrics/railsNotes/model/RailsNotesResults.classPK
��= 6��fZ��K�WEB-INF/classes/hudson/plugins/rvmRubyMetrics/railsNotes/RailsNotesBuildAction/index.jellyPK
��=���[��T��݆WEB-INF/classes/hudson/plugins/rvmRubyMetrics/railsNotes/RailsNotesBuildAction.classPK
��=�LR��O���WEB-INF/classes/hudson/plugins/rvmRubyMetrics/railsNotes/RailsNotesParser.classPK
��=��G�b���WEB-INF/classes/hudson/plugins/rvmRubyMetrics/railsNotes/RailsNotesProjectAction/floatingBox.jellyPK
��=��Z��]��-�WEB-INF/classes/hudson/plugins/rvmRubyMetrics/railsNotes/RailsNotesProjectAction/nodata.jellyPK
��=�]DV����WEB-INF/classes/hudson/plugins/rvmRubyMetrics/railsNotes/RailsNotesProjectAction.classPK
��=ݟm4i�Y���WEB-INF/classes/hudson/plugins/rvmRubyMetrics/railsNotes/RailsNotesPublisher/config.jellyPK
��=��ݜ%�a���WEB-INF/classes/hudson/plugins/rvmRubyMetrics/railsNotes/RailsNotesPublisher$DescriptorImpl.classPK
��=9��R�R����WEB-INF/classes/hudson/plugins/rvmRubyMetrics/railsNotes/RailsNotesPublisher.classPK
��=t��DDT��U�WEB-INF/classes/hudson/plugins/rvmRubyMetrics/railsNotes/RailsNotesPublisher.staplerPK
��=Pͷ���X���WEB-INF/classes/hudson/plugins/rvmRubyMetrics/railsStats/model/RailsStatsMetrics$1.classPK
��=ϸ3�a��h�WEB-INF/classes/hudson/plugins/rvmRubyMetrics/railsStats/model/RailsStatsMetrics$COMPARATOR.classPK
��=#�\�=�V���WEB-INF/classes/hudson/plugins/rvmRubyMetrics/railsStats/model/RailsStatsMetrics.classPK
��=\�+�ik����WEB-INF/classes/hudson/plugins/rvmRubyMetrics/railsStats/model/RailsStatsResults$SortLabelsComparator.classPK
��=Qkʘ}zV���WEB-INF/classes/hudson/plugins/rvmRubyMetrics/railsStats/model/RailsStatsResults.classPK
��=W�H�Z���WEB-INF/classes/hudson/plugins/rvmRubyMetrics/railsStats/RailsStatsBuildAction/index.jellyPK
��=J����-T����WEB-INF/classes/hudson/plugins/rvmRubyMetrics/railsStats/RailsStatsBuildAction.classPK
��=H;i%�QO��þWEB-INF/classes/hudson/plugins/rvmRubyMetrics/railsStats/RailsStatsParser.classPK
��=�Nt�b����WEB-INF/classes/hudson/plugins/rvmRubyMetrics/railsStats/RailsStatsProjectAction/floatingBox.jellyPK
��=�Zſt)]����WEB-INF/classes/hudson/plugins/rvmRubyMetrics/railsStats/RailsStatsProjectAction/nodata.jellyPK
��=Y��V����WEB-INF/classes/hudson/plugins/rvmRubyMetrics/railsStats/RailsStatsProjectAction.classPK
��=<�zl�Y��o�WEB-INF/classes/hudson/plugins/rvmRubyMetrics/railsStats/RailsStatsPublisher/config.jellyPK
��=��&�a��R�WEB-INF/classes/hudson/plugins/rvmRubyMetrics/railsStats/RailsStatsPublisher$DescriptorImpl.classPK
��=�@Q�R����WEB-INF/classes/hudson/plugins/rvmRubyMetrics/railsStats/RailsStatsPublisher.classPK
��=t��DDT����WEB-INF/classes/hudson/plugins/rvmRubyMetrics/railsStats/RailsStatsPublisher.staplerPK
��=�I*�8!G��n�WEB-INF/classes/hudson/plugins/rvmRubyMetrics/rcov/model/Messages.classPK
��=��89L���WEB-INF/classes/hudson/plugins/rvmRubyMetrics/rcov/model/Messages.propertiesPK
��=+��
M����WEB-INF/classes/hudson/plugins/rvmRubyMetrics/rcov/model/MetricTarget$1.classPK
��=3qa���[����WEB-INF/classes/hudson/plugins/rvmRubyMetrics/rcov/model/MetricTarget$TargetConverter.classPK
��=�n�|��K��>�WEB-INF/classes/hudson/plugins/rvmRubyMetrics/rcov/model/MetricTarget.classPK
��=p�j�ELM����WEB-INF/classes/hudson/plugins/rvmRubyMetrics/rcov/model/MetricTarget.staplerPK
��=,��*�
Q��J�WEB-INF/classes/hudson/plugins/rvmRubyMetrics/rcov/model/RcovAbstractResult.classPK
��=tXtQ��S����WEB-INF/classes/hudson/plugins/rvmRubyMetrics/rcov/model/RcovFileDetail/index.jellyPK
��=%�|i�vM��"�WEB-INF/classes/hudson/plugins/rvmRubyMetrics/rcov/model/RcovFileDetail.classPK
��=��`��M��_�WEB-INF/classes/hudson/plugins/rvmRubyMetrics/rcov/model/RcovFileResult.classPK
��=�����I��y�WEB-INF/classes/hudson/plugins/rvmRubyMetrics/rcov/model/RcovResult.classPK
��=�g��>�F��`�WEB-INF/classes/hudson/plugins/rvmRubyMetrics/rcov/model/Targets.classPK
��=F��(��N���WEB-INF/classes/hudson/plugins/rvmRubyMetrics/rcov/RcovBuildAction/index.jellyPK
��=��3�H��	�WEB-INF/classes/hudson/plugins/rvmRubyMetrics/rcov/RcovBuildAction.classPK
��=;ޢͽ>V���WEB-INF/classes/hudson/plugins/rvmRubyMetrics/rcov/RcovParser$RcovFilenameFilter.classPK
��=5����C���WEB-INF/classes/hudson/plugins/rvmRubyMetrics/rcov/RcovParser.classPK
��=�_3��	V��/WEB-INF/classes/hudson/plugins/rvmRubyMetrics/rcov/RcovProjectAction/floatingBox.jellyPK
��=�Zſt)Q��AWEB-INF/classes/hudson/plugins/rvmRubyMetrics/rcov/RcovProjectAction/nodata.jellyPK
��=�7�6��J��5WEB-INF/classes/hudson/plugins/rvmRubyMetrics/rcov/RcovProjectAction.classPK
��=��ũ�C	M���WEB-INF/classes/hudson/plugins/rvmRubyMetrics/rcov/RcovPublisher/config.jellyPK
��=�iո�H���WEB-INF/classes/hudson/plugins/rvmRubyMetrics/rcov/RcovPublisher$1.classPK
��=�sB�>OW���WEB-INF/classes/hudson/plugins/rvmRubyMetrics/rcov/RcovPublisher$DescriptorImpl$1.classPK
��=F�
i
U��|WEB-INF/classes/hudson/plugins/rvmRubyMetrics/rcov/RcovPublisher$DescriptorImpl.classPK
��=��X��Y���!WEB-INF/classes/hudson/plugins/rvmRubyMetrics/rcov/RcovPublisher$RcovFilenameFilter.classPK
��=(|���F��[$WEB-INF/classes/hudson/plugins/rvmRubyMetrics/rcov/RcovPublisher.classPK
��=��)�64H���-WEB-INF/classes/hudson/plugins/rvmRubyMetrics/rcov/RcovPublisher.staplerPK
��=���&�Y��:.WEB-INF/classes/hudson/plugins/rvmRubyMetrics/saikuro/model/SaikuroFileDetail/index.jellyPK
��=֌�҆%S��K0WEB-INF/classes/hudson/plugins/rvmRubyMetrics/saikuro/model/SaikuroFileDetail.classPK
��=�\
��S��B3WEB-INF/classes/hudson/plugins/rvmRubyMetrics/saikuro/model/SaikuroFileResult.classPK
��=��ćH�
O��t6WEB-INF/classes/hudson/plugins/rvmRubyMetrics/saikuro/model/SaikuroResult.classPK
��=ƀ���T��);WEB-INF/classes/hudson/plugins/rvmRubyMetrics/saikuro/SaikuroBuildAction/index.jellyPK
��=�
J��N���=WEB-INF/classes/hudson/plugins/rvmRubyMetrics/saikuro/SaikuroBuildAction.classPK
��=������I���BWEB-INF/classes/hudson/plugins/rvmRubyMetrics/saikuro/SaikuroParser.classPK
��=�N��\�� JWEB-INF/classes/hudson/plugins/rvmRubyMetrics/saikuro/SaikuroProjectAction/floatingBox.jellyPK
��=�B�0�$W��:KWEB-INF/classes/hudson/plugins/rvmRubyMetrics/saikuro/SaikuroProjectAction/nodata.jellyPK
��=���P��/MWEB-INF/classes/hudson/plugins/rvmRubyMetrics/saikuro/SaikuroProjectAction.classPK
��=�3HC�sS���OWEB-INF/classes/hudson/plugins/rvmRubyMetrics/saikuro/SaikuroPublisher/config.jellyPK
��=�W�ݷN���PWEB-INF/classes/hudson/plugins/rvmRubyMetrics/saikuro/SaikuroPublisher$1.classPK
��=�~��:m[���QWEB-INF/classes/hudson/plugins/rvmRubyMetrics/saikuro/SaikuroPublisher$DescriptorImpl.classPK
��=��a��Gb���UWEB-INF/classes/hudson/plugins/rvmRubyMetrics/saikuro/SaikuroPublisher$SaikuroFilenameFilter.classPK
��=�o�.��L��XWEB-INF/classes/hudson/plugins/rvmRubyMetrics/saikuro/SaikuroPublisher.classPK
��=��)�64N��%^WEB-INF/classes/hudson/plugins/rvmRubyMetrics/saikuro/SaikuroPublisher.staplerPK
��=�}E���D���^WEB-INF/classes/hudson/plugins/rvmRubyMetrics/tags/floatingBox.jellyPK
��=z�/^#�C���_WEB-INF/classes/hudson/plugins/rvmRubyMetrics/tags/tableGraph.jellyPK
��=9���aWEB-INF/classes/hudson/plugins/rvmRubyMetrics/tags/taglibPK
��=P	�/�9���aWEB-INF/classes/hudson/plugins/rvmRubyMetrics/Utils.classPK
��=i������afWEB-INF/classes/index.jellyPK
��=J�@.&C5��gWEB-INF/classes/META-INF/annotations/hudson.ExtensionPK
��=.���hWEB-INF/classes/META-INF/exposed.stapler-beansPK
��=���V�	be���hWEB-INF/lib/htmlparser-1.6.jarPK
��=�V��$K$n���rWEB-INF/lib/jregex-1.2_01.jarPK
��=�A��META-INF/maven/PK
��=(�A,�META-INF/maven/org.jvnet.hudson.plugins/PK
��=7�Ar�META-INF/maven/org.jvnet.hudson.plugins/rvmRubyMetrics/PK
x�=
Ҭ
>��ǾMETA-INF/maven/org.jvnet.hudson.plugins/rvmRubyMetrics/pom.xmlPK
��=�G��}�E��*�META-INF/maven/org.jvnet.hudson.plugins/rvmRubyMetrics/pom.propertiesPK���C
�contrib/unicorn_init.sh000066400000010074147511530550011252 0ustar00#!/usr/bin/env bash
### BEGIN INIT INFO
# Provides: unicorn
# Required-Start: $all
# Required-Stop: $network $local_fs $syslog
# Default-Start: 2 3 4 5
# Default-Stop: 0 1 6
# Short-Description: Start the unicorns at boot
# Description: Enable at boot time.
### END INIT INFO

# This is /etc/init.d/unicorn init.d script for single or multiple unicorn installations.
# Expects at least one .conf file in /etc/unicorn/
#
## A sample /etc/unicorn/my_app.conf
##
## RAILS_ENV=production
## RAILS_ROOT=/var/apps/www/my_app/current
## UNICORN="/usr/local/rvm/wrappers/my_app/unicorn_rails"
#
# This configures a unicorn master for your app at /var/apps/www/my_app/current running in
# production mode. It will read config/unicorn.rb for further set up.
#
## To get the UNICORN script run:
##
## rvm alias create my_app 2.0.0
## rvm wrapper 2.0.0 --no-links unicorn_rails
#
# This way it will allow changing the alias when new ruby is used without changing anything else.
#
# You should ensure different ports or sockets are set in each config/unicorn.rb if
# you are running more than one master concurrently.
#
# If you call this script without any config parameters, it will attempt to run the
# init command for all your unicorn configurations listed in /etc/unicorn/*.conf
#
# /etc/init.d/unicorn start # starts all unicorns
#
# If you specify a particular config, it will only operate on that one
#
# /etc/init.d/unicorn start my_app

__sig()
{
  typeset __pid
  [[ -s "$2" ]]       &&
  __pid="$(cat "$2")" &&
  [[ -n "${__pid}" ]] &&
  kill -$1 "${__pid}" >/dev/null 2>&1 ||
  return $?
}

sig()
{
  __sig "$1" "$PID" || return $?
}

oldsig()
{
  __sig "$1" "$OLD_PID" || return $?
}

run()
{
  echo -n "$1 - "
  shift
  if
    "$@"
  then
    echo "OK"
  else
    typeset result=$?
    echo "Failed!" >&2
    return $result
  fi
}

prefix_command_with_su_fix_quoting()
{
  typeset -a __temp
  __temp=()
  while
    (( $# ))
  do
    __temp+=( "'$1'" )
    shift
  done
  CMD=( su - "${__owner}" -c "cd '$RAILS_ROOT' && ${__temp[*]}" )
}

setup ()
{
  echo "$RAILS_ROOT: "
  cd $RAILS_ROOT || return $?

  export PID=$RAILS_ROOT/tmp/pids/unicorn.pid
  export OLD_PID="$PID.oldbin"
  export RAILS_ENV=${RAILS_ENV-development}

  CMD=( "$UNICORN" -E "${RAILS_ENV}" -c "${RAILS_ROOT}/config/unicorn.rb" -D )

  typeset __owner="$(stat -c "%U" "${RAILS_ROOT}")"
  if
    [[ "${USER:=$(whoami)}" == "${__owner}" ]]
  then
    true # it's all fine we run as owner of the app
  elif
    (( UID == 0 ))
  then
    prefix_command_with_su_fix_quoting "${CMD[@]}"
  else
    echo "ERROR: running not as owner(${__owner}) of '$RAILS_ROOT' and not as root($USER), prefix with 'sudo' and try again!"
    return 2
  fi
}

cmd_start()
{
  if sig 0
  then echo "Already started"
  else run "Starting" "${CMD[@]}" || return $?
  fi
}

wait_pid_kill()
{
  typeset __count=$1
  while
    (( __count > 0 )) &&
    sig 0
  do
    : $(( __count-- ))
    sleep 1s
  done
  sig 0 || return $?
}

cmd_stop()
{
  run "Stopping" sig QUIT
  if
    wait_pid_kill 5
  then
    run "Force stop" sig TERM
    if wait_pid_kill 3
    then return 1
    fi
  fi
}

cmd_restart()
{
  cmd_stop && cmd_start || return $?
}

cmd_reload()
{
  run "Reloading" sig USR2 &&
  wait_pid_kill 5 &&
  oldsig QUIT ||
  oldsig TERM ||
  cmd_restart ||
  return $?
}

cmd_rotate()
{
  run "Rotate" sig USR1  ||
  cmd_start ||
  return $?
}

cmd()
{
  setup || return $?
  case "$1" in
    start|stop|restart|reload|rotate)
      cmd_$1 || return $?
      ;;
    upgrade)
      cmd_reload || return $?
      ;;
    *)
      echo "Usage: $0 <start|stop|restart|reload|upgrade|rotate>" >&2
      return 1
      ;;
  esac
}

# either run the start/stop/reload/etc command for every config under /etc/unicorn
# or just do it for a specific one
# $1 contains the start/stop/etc command
# $2 if it exists, should be the specific config we want to act on
start_stop ()
{
  if
    [[ -n "$2" ]]
  then
    . "/etc/unicorn/$2.conf" || return $?
    cmd "$1" || return $?
  else
    for CONFIG in /etc/unicorn/*.conf
    do
      . "$CONFIG" || return $?
      cmd "$1" || return $?
    done
   fi
}

start_stop "$@"
bin/rvm-auto-ruby000077500000003407147511530550010007 0ustar00#!/usr/bin/env bash

export HOME="${HOME%%+(\/)}" # Remove trailing slashes if they exist on HOME

if (( ${rvm_ignore_rvmrc:=0} == 0 ))
then
  for rvmrc in /etc/rvmrc "$HOME/.rvmrc"
  do
    if [[ -f "$rvmrc" ]]
    then
      if GREP_OPTIONS="" \grep '^\s*rvm .*$' "$rvmrc" >/dev/null 2>&1
      then
        printf "%b" "\nError: $rvmrc is for rvm settings only.\nrvm CLI may NOT be called from within $rvmrc. \nSkipping the loading of $rvmrc"
        return 1
      else
        source "$rvmrc"
      fi
    fi
  done
fi

# duplication marker jdgkjnfnkjdngjkfnd4fd
export rvm_path
if [[ -z "${rvm_path:-}" ]]
then
  if [[ -d "${0%/bin/rvm-auto-ruby}" ]]
  then rvm_path="$( \cd "${0%/bin/rvm-auto-ruby}">/dev/null; pwd )"
  elif (( UID == 0 )) && [[ -d "/usr/local/rvm" ]]
  then rvm_path="/usr/local/rvm"
  elif [[ -d "${HOME}/.rvm" ]]
  then rvm_path="${HOME}/.rvm"
  elif [[ -d "/usr/local/rvm" ]]
  then rvm_path="/usr/local/rvm"
  else echo "Can't find rvm install!" 1>&2 ; exit 1
  fi
fi

true ${rvm_scripts_path:="$rvm_path/scripts"}
true ${rvm_environments_path:="$rvm_path/environments"}

if   [[ -n "$rvm_path" && -s "$rvm_scripts_path/rvm" ]]
then source "$rvm_scripts_path/rvm" > /dev/null 2>&1
elif [[ -s "$HOME/.rvm/scripts/rvm" ]]
then source "$HOME/.rvm/scripts/rvm" > /dev/null 2>&1
elif [[ -s "/usr/local/rvm/scripts/rvm" ]]
then source "/usr/local/rvm/scripts/rvm" > /dev/null 2>&1
else
  echo "Unable to detect rvm, please manually set the rvm_path env variable." >&2
  exit 1
fi
typeset -f rvm >/dev/null 2>&1 || {
  echo "RVM not loaded, aborting." >&2
  exit 1
}

case $0 in
  (*rvm-shebang-ruby)
    rvm_promptless=1 rvm rvmrc load "$(dirname "$(which "$1")")" > /dev/null 2>&1
    ;;
  (*)
    rvm_promptless=1 rvm rvmrc load > /dev/null 2>&1
    ;;
esac

exec ruby "$@"
bin/rvm-smile000077500000001210147511530550007157 0ustar00#!/usr/bin/env bash

printf "%b" "
|                                                          ..::''''::..
|                                                .:::.   .;''        \`\`;.
|        ....                                    :::::  ::    ::  ::    ::
|      ,;' .;:                ::  ..:            \`:::' ::     ::  ::     ::
|      ::.      ..:,:;.,:;.    .   ::   .::::.    \`:'  :: .:' ::  :: \`:. ::
|       '''::,   ::  ::  ::  \`::   ::  ;:   .::    :   ::  :          :  ::
|     ,:';  ::;  ::  ::  ::   ::   ::  ::,::''.    .    :: \`:.      .:' ::
|     \`:,,,,;;' ,;; ,;;, ;;, ,;;, ,;;, \`:,,,,:'   :;:    \`;..\`\`::::''..;'

"
bin/rvm-exec000077500000004013147511530550006776 0ustar00#!/usr/bin/env bash

export HOME="${HOME%%+(\/)}" # Remove trailing slashes if they exist on HOME

if (( ${rvm_ignore_rvmrc:=0} == 0 ))
then
  for rvmrc in /etc/rvmrc "$HOME/.rvmrc"
  do
    if [[ -f "$rvmrc" ]]
    then
      if GREP_OPTIONS="" \grep '^\s*rvm .*$' "$rvmrc" >/dev/null 2>&1
      then
        printf "%b" "\n  Error:
    $rvmrc is for rvm settings only.
    rvm CLI may NOT be called from within $rvmrc.
    Skipping the loading of $rvmrc
"
        exit 1
      else
        source "$rvmrc"
      fi
    fi
  done
fi

# duplication marker jdgkjnfnkjdngjkfnd4fd
export rvm_path
if [[ -z "${rvm_path:-}" ]]
then
  if [[ -d "${0%/bin/rvm-exec}" ]]
  then rvm_path="$( \cd "${0%/bin/rvm-exec}">/dev/null; pwd )"
  elif (( UID == 0 )) && [[ -d "/usr/local/rvm" ]]
  then rvm_path="/usr/local/rvm"
  elif [[ -d "${HOME}/.rvm" ]]
  then rvm_path="${HOME}/.rvm"
  elif [[ -d "/usr/local/rvm" ]]
  then rvm_path="/usr/local/rvm"
  else echo "Can't find rvm install!" 1>&2 ; exit 1
  fi
fi

true ${rvm_scripts_path:="$rvm_path/scripts"}

__rvm_shell_lookup_script() {
  local relative_scripts_dir
  relative_scripts_dir="$(dirname -- "$(dirname -- "$0")")/scripts"
  for directory in "$rvm_scripts_path" "$HOME/.rvm/scripts" "/usr/local/rvm/scripts" "$relative_scripts_dir"; do
    if [[ -d "$directory" && -s "$directory/rvm" ]]; then
      echo "$directory/rvm"
      return
    fi
  done
}

if [[ -n "$1" && ! -f "$1" && -n "$(echo "$1" | GREP_OPTIONS="" \grep -v '^-')" ]]; then
  rvm_shell_ruby_string="$1"
  shift
fi

rvm_shell_rvm_path="$(__rvm_shell_lookup_script)"
if
  [[ -n "$rvm_shell_rvm_path" ]]
then
  source "$rvm_shell_rvm_path"
  typeset -f rvm >/dev/null 2>&1 || {
    echo "RVM not loaded, aborting." >&2
    exit 1
  }
  # Setup as expected.
  if
    [[ -n "$rvm_shell_ruby_string" ]]
  then
      rvm "$rvm_shell_ruby_string"
      if
        [[ "$?" -gt 0 ]]
      then
        echo "Error: RVM was unable to use '$rvm_shell_ruby_string'" 1>&2
        exit 1
      fi
  else
    rvm rvmrc load >/dev/null 2>&1
  fi
fi

exec "$@"
bin/rvmsudo000077500000005104147511530550006751 0ustar00#!/usr/bin/env bash

sudo_args=()

etc_sudoers_warning()
{
  printf "%b" "Warning: $1, falling back to call via \`/usr/bin/env\`, this breaks rules from \`/etc/sudoers\`. Run:

    export rvmsudo_secure_path=1

to avoid the warning, put it in shell initialization file to make it persistent.
" >&2
  case "${2:-}" in
    (cant_read)
      printf "%b" "
In case there is no \`secure_path\` in \`/etc/sudoers\`. Run:

    export rvmsudo_secure_path=0

to avoid the warning, put it in shell initialization file to make it persistent.
" >&2
      ;;
  esac
}

while
  (( $# ))
do
  case "$1" in
  (--trace)
    export PS4="+ \${BASH_SOURCE##\${rvm_path:-}} : \${FUNCNAME[0]:+\${FUNCNAME[0]}()}  \${LINENO} > "
    set -o xtrace
    ;;
  (--verbose)
    set -o verbose
    ;;
  (-*)
    sudo_args+=("$1")
    case "$1" in
    (-g|-u|-p|-r|-t|-U|-C)
      shift
      sudo_args+=("${1:-}")
      ;;
    esac
    ;;
  (*)
    break
    ;;
  esac
  (( $# == 0 )) || shift
done

if
  (( $# ))
then
  if
    [[ -n "${rvmsudo_secure_path}" ]]
  then
    if
      [[ "${rvmsudo_secure_path:-0}" == 1 ]]
    then
      sudo_args+=( "/usr/bin/env" )
    fi
  else
    if
      [[ -f "/etc/sudoers" ]]
    then
      if
        [[ ! -r "/etc/sudoers" ]]
      then
        sudo_args+=( "/usr/bin/env" )
        etc_sudoers_warning 'can not check `/etc/sudoers` for `secure_path`' cant_read
      elif
        \grep -E '^[[:space:]]*Defaults[[:space:]]+secure_path=' "/etc/sudoers" >/dev/null
      then
        sudo_args+=( "/usr/bin/env" )
        etc_sudoers_warning '`secure_path` found in `/etc/sudoers`' found_secure_path
      fi
    fi
  fi
  eval command sudo \"\${sudo_args[@]}\" $(
    /usr/bin/env |
      awk -F= 'BEGIN{v=0;}/^[a-zA-Z_][a-zA-Z0-9_]*=/{v=1;}v==1&&$2~/^['\''\$]/{v=2;} v==1&&$2~/^\(\) \{/{v=0;} v==1&&$2~/^\(/{v=3;}v==2&&/'\''$/&&!/'\'\''$/{v=1;}v==3&&/\)$/{v=1;}v{print;}v==1{v=0;}' |
      GREP_OPTIONS="" \grep -E '^rvm|^gemset|^http_|^PATH|^IRBRC|RUBY|GEM' |
      sed 's/=\(.*\)$/="\1"/'
  ) \"\$@\" ||
  {
    result=$?
    case $result in
      (126)
        printf "%b" "\nTarget user does not have access to the given command, try finding problem below:\n\n"
        p="$rvm_path"
        dirs=()
        while
          [[ "$p" != "" ]]
        do
          dirs+=( "$p" )
          p="${p%/*}"
        done
        \command \ls -ld "${dirs[@]}"
        printf "%b" "\nIf you could not find the issue check permissions of all involved users and directories.\n\n"
        ;;
    esac
    exit $result
  }
else
  printf "%b" "Usage:\n  $0 [--trace] [--verbose] [sudo-options] command [command-options]\n"
fi
bin/rvm000077500000002776147511530550006072 0ustar00#!/usr/bin/env bash

if (( ${rvm_ignore_rvmrc:=0} == 0 ))
then
  declare rvmrc

  rvm_rvmrc_files=("/etc/rvmrc" "$HOME/.rvmrc")
  if [[ -n "${rvm_prefix:-}" ]] && ! [[ "$HOME/.rvmrc" -ef "${rvm_prefix}/.rvmrc" ]]
     then rvm_rvmrc_files+=( "${rvm_prefix}/.rvmrc" )
  fi

  for rvmrc in "${rvm_rvmrc_files[@]}"
  do
    if [[ -f "$rvmrc" ]]
    then
      if GREP_OPTIONS="" \grep '^\s*rvm .*$' "$rvmrc" >/dev/null 2>&1
      then
        printf "%b" "
  Error:
    $rvmrc is for rvm settings only.
    rvm CLI may NOT be called from within $rvmrc.
    Skipping the loading of $rvmrc
"
        exit 1
      else
        source "$rvmrc"
      fi
    fi
  done
  unset rvm_rvmrc_files
  unset rvmrc
fi

# duplication marker jdgkjnfnkjdngjkfnd4fd
export rvm_path
if [[ -z "${rvm_path:-}" ]]
then
  if [[ -d "${0%/bin/rvm}" ]]
  then rvm_path="$( \cd "${0%/bin/rvm}">/dev/null; pwd )"
  elif (( UID == 0 )) && [[ -d "/usr/local/rvm" ]]
  then rvm_path="/usr/local/rvm"
  elif [[ -d "${HOME}/.rvm" ]]
  then rvm_path="${HOME}/.rvm"
  elif [[ -d "/usr/local/rvm" ]]
  then rvm_path="/usr/local/rvm"
  else echo "Can't find rvm install!" 1>&2 ; exit 1
  fi
fi

# allow disabling check temporary
: rvm_is_not_a_shell_function:${rvm_is_not_a_shell_function:=1}
export rvm_is_not_a_shell_function

# if to prevent fork-bomb
if source "${rvm_scripts_path:="$rvm_path/scripts"}/rvm"
then
  typeset -f rvm >/dev/null 2>&1 || {
    echo "RVM not loaded, aborting." >&2
    exit 1
  }
  rvm "$@"
else
  echo "Error sourcing RVM!"  1>&2
  exit 1
fi
bin/rvm-prompt000077500000010003147511530550007367 0ustar00#!/usr/bin/env bash

add()
{
  token=${1:-""}
  eval "${token}_flag=1"
  shift
  if
    [[ -n "$format" ]]
  then
    [[ ${previous_is_format_var:-0} == 1 ]] && eval "${token}_prefix_flag=1"
    format="${format}\$${token}"
  else
    format="\$${token}"
  fi
  previous_is_format_var=1
}

add_raw_token()
{
  previous_is_format_var=0
  token=${1:-""}
  format="${format:-""}${token}"
}

rvm_gemset_separator="${rvm_gemset_separator:-"@"}"
if
  [[ "${GEM_HOME:-}" == *rvm* && "$ruby_string" != "$rvm_path/bin/ruby" ]]
then
  unset format
  while
    (( $# ))
  do
    case "$1" in
      i|interpreter)   add "interpreter"  ;;
      v|version)       add "version"      ;;
      p|patchlevel)    add "patchlevel"   ;;
      r|revision)      add "revision"     ;;
      a|architecture)  add "architecture" ;;
      g|gemset)        add "gemset"       ;;
      u|unicode)       add "unicode"      ;;
      s|system)                           ;; #skip when in ruby
      -d|--no-default) no_default=1       ;;
      *)               add_raw_token "$1" ;;
    esac
    shift
  done

  if
    [[ -z "${format:-""}" && -z "$no_default" ]]
  then
    for default in interpreter version patchlevel gemset
    do
      add "$default"
    done
  fi
  gemset=""
  ruby_string="${GEM_HOME:-""}"
  ruby_string="${ruby_string##*/}"
  case "${GEM_HOME:-""}" in
    (*${rvm_gemset_separator:-"@"}*)
      if (( ${gemset_flag:-0} ))
      then gemset="${rvm_gemset_separator:-"@"}${ruby_string##*${rvm_gemset_separator:-"@"}}"
      fi
      ruby_string="${ruby_string%%${rvm_gemset_separator:-"@"}*}"
      ;;
  esac
  if
    [[ -n "$no_default" && -n "${format:-""}" ]]
  then
    # Do not display anything if no default flag was provided
    #   and we are using the default ruby
    # Only people who explicitly ask for this will have the
    #   slight performance penalty associated.
    [[ "$(rvm tools identifier)" != "$(rvm alias show default)"  ]] || exit 0
  fi
  strings=(${ruby_string//-/ })
  if
    (( ${interpreter_flag:-0} )) || [[ -n "$unicode_flag" ]]
  then
    interpreter=${strings[0]}
    (( ${interpreter_prefix_flag:-0} )) && interpreter="-${interpreter}"
  fi
  if
    (( ${version_flag:-0} )) || [[ -n "$unicode_flag" ]]
  then
    version=${strings[1]}
    (( ${version_prefix_flag:-0} )) && version="-${version}"
  fi
  if
    (( ${#strings[@]} > 2 ))
  then
    if
      (( ${patchlevel_flag:-0} ))
    then
      patchlevel=${strings[2]}
      (( ${patchlevel_prefix_flag:-0} )) && patchlevel="-${patchlevel}"
    fi
  fi
  if
    (( ${architecture_flag:-0} ))
  then
    architecture="$(echo "$(ruby -v)" | sed 's/^.*\[//' | sed 's/\].*$//')"
    (( ${architecture_prefix_flag:-0} )) && architecture="-${architecture}"
  fi
  if
    (( ${unicode_flag:-0} ))
  then
    case "$interpreter" in
      (jruby)    unicode="☯" ;;
      (rbx)      unicode="❖" ;;
      (ree)      unicode="✈" ;;
      (macruby)  unicode="⌘" ;;
      (maglev)   unicode="㎖" ;;
      (ironruby) unicode="♭" ;;
      (system)   unicode="★" ;;
      (topaz)    unicode="🐍" ;; # TODO: what is this? can we use something more fonts support?
      (truffleruby) unicode="🚀" ;;
      (opal)     unicode="⬢" ;;
      (ruby)
        case ${version:-""} in
          (1.8.6)  unicode="➇❻" ;;
          (1.8.7)  unicode="➇❼" ;;
          (1.8*)   unicode="➇"  ;;
          (1.9.1)  unicode="➈❶" ;;
          (1.9.2)  unicode="➈❷" ;;
          (1.9.3)  unicode="➈❸" ;;
          (2.0.0)  unicode="➋" ;;
          (2.1.*)  unicode="➋➀" ;;
          (2.2.*)  unicode="➋➁" ;;
          (2.3.*)  unicode="➋➂" ;;
          (2.4.*)  unicode="➋➃" ;;
          (*)      unicode="⦿"  ;;
        esac ;;
      (*) unicode="⦿" ;;
    esac
    if
      echo "$ruby_string" | GREP_OPTIONS="" \grep '-head' >/dev/null 2>&1
    then
      unicode="${unicode}⚡"
    fi
    (( ${unicode_prefix_flag:-0} )) && unicode="-${unicode}"
  fi
  eval "echo \"$format\""
else
  while
    (( $# ))
  do
    case "$1" in
      s|system) echo "system" ;;
    esac
    shift
  done
fi
bin/rvm-shell000077500000004260147511530550007165 0ustar00#!/usr/bin/env bash

export HOME="${HOME%%+(\/)}" # Remove trailing slashes if they exist on HOME

if
  (( ${rvm_ignore_rvmrc:=0} == 0 ))
then
  for rvmrc in /etc/rvmrc "$HOME/.rvmrc"
  do
    if [[ -f "$rvmrc" ]]
    then
      if GREP_OPTIONS="" \grep '^\s*rvm .*$' "$rvmrc" >/dev/null 2>&1
      then
        printf "%b" "\nError: $rvmrc is for rvm settings only.\nrvm CLI may NOT be called from within $rvmrc. \nSkipping the loading of $rvmrc"
        return 1
      else
        source "$rvmrc"
      fi
    fi
  done
fi

# duplication marker jdgkjnfnkjdngjkfnd4fd
export rvm_path
if
  [[ -z "${rvm_path:-}" ]]
then
  if [[ -d "${0%/bin/rvm-shell}" ]]
  then rvm_path="$( \cd "${0%/bin/rvm-shell}">/dev/null; pwd )"
  elif (( UID == 0 )) && [[ -d "/usr/local/rvm" ]]
  then rvm_path="/usr/local/rvm"
  elif [[ -d "${HOME}/.rvm" ]]
  then rvm_path="${HOME}/.rvm"
  elif [[ -d "/usr/local/rvm" ]]
  then rvm_path="/usr/local/rvm"
  else echo "Can't find rvm install!" 1>&2 ; exit 1
  fi
fi
rvm_path="${rvm_path%%*(/)}" # remove trailing slashes

case $0 in
  (*-rvm-env) selected_shell=${0%-rvm-env} ;;
  (*)         selected_shell=bash          ;;
esac
selected_shell="$(basename "${selected_shell}")"

if
  [[ -n "$1" && ! -f "$1" && -n "$(echo "$1" | GREP_OPTIONS="" \grep -v '^-')" ]]
then
  rvm_shell_ruby_string="$1"
  shift
elif
  [[ "$1" == "--path" ]] && [[ -d "$2" || "$2" == "/"* ]]
then
  if
    [[ -d "$2" ]]
  then
    cd $2
  else
    rvm_shell_ruby_string="default"
  fi
  shift 2
fi

true ${rvm_scripts_path:="$rvm_path/scripts"}
export rvm_scripts_path
if
  [[ -n "$rvm_path" && -f "$rvm_scripts_path/rvm" ]]
then
  source "$rvm_scripts_path/rvm"
  typeset -f rvm >/dev/null 2>&1 || {
    echo "RVM not loaded, aborting." >&2
    exit 1
  }
  # Setup as expected.
  if
    [[ -n "$rvm_shell_ruby_string" ]]
  then
    unset GEM_HOME # disable GEM_HOME mismatch check when using ruby
    __rvm_conditionally_do_with_env __rvm_use "$rvm_shell_ruby_string" ||
    {
      __status=$?
      echo "Error: RVM was unable to use '$rvm_shell_ruby_string'" 1>&2
      exit ${__status}
    }
  else
    __rvm_conditionally_do_with_env __rvm_rvmrc_tools load . >/dev/null 2>&1
  fi
fi

exec ${selected_shell} "$@"
archives/rvm-1.29.12.tgz.asc000066400000001501147511530550011264 0ustar00-----BEGIN PGP SIGNATURE-----

iQIzBAABCAAdFiEEfSuvHPN7E+IGnWlWEFvQ5zlJm9sFAmAB4v4ACgkQEFvQ5zlJ
m9vNFxAApKncwxBTRqeQrSHrB0LmVXRaxnO9ZQXUHshCCbOkLvuXbctRX3a0fc67
7Buj0StUjntkzNwV4yVxpD7kpyD2/yuOqxokaSzKCdDAZx1uH0VEfoqnkx04L/hD
h4hFFWCXAPX817nr0hE6OZ80mKr38YsgSY67B1NU857Mm3kE8+V4vnd992rhAsvs
5DKnYOOV68tKHJQpKBMWdKxIcnwGe0OBAlZ0dXt5MT6UapS1z9D/iWZRMXeUFgtq
Sjb6YWP8l+0+rfVgN5Zgmuc25Qgi0aheNN1iFSZxObMMNLvHij78c1RYG27dyyeR
bXXQfI6eM2Upg6x2zLmDJnPqOXaXS5gbjAlEUzQEV6NcHjz1gl8VYPMZF4VxX/SP
QRloKJRPSNGLpznG8vuoEGXlc2GPHE6P6BPoF/elcCjaW87xcJg+V67B4R+48Ls3
gS8zOmcQbNMd9Y5uiqTyEgYDqDPwi9MxasL3AW+FP/xuKQVczBz1VXp1YBIrsBBa
v5Mv32sIRK9P3GPKuiI/4/rGvKXYczRRHqztrJhh9Qa3lioXd6CE3URQIQWEVK2z
fjIRN/Z0vrEkI+kRYvf0tm0KB1KtLhHPqmASpbCsQHvY8iaYVr0q/SCTZI/rYXOx
jolgsSUVr2PjnHU9ws9ZBu74EqmJErld+YcO095Lm3VBUIxt+ss=
=DJIF
-----END PGP SIGNATURE-----
archives/rvm-1.29.12.tgz000066400005117326147511530550010541 0ustar00��=�v۶�}�W`���H�(�DJ�8k���I�[�$g�8�"A�/���4�510�2�2_2{�Dɲ���圚Y5E��}o���;��l�Ń1��w����8���^��6�-Gw-�
���ߍ>�X.]%+�@�YVl�w����\]��Y�д�u���7
��N߰C�v��k�t�[�g�V�5�a�h|�1�]�w峤mhf_3��炁��ݫ�~�ȿi�N�~�կ?����� *����0�M�+�}%�-��
������p�'��I�}�{9��nY��^��� q���8ly��܋�`48GeSϧ�E^�F�2��0J��H�o%�`T����.o1/�>�]��8ii������6T���]xI�nI�۵M����ؿ�kI�G4a��u��ު�[�a���@�gk��w"�'���?*�����?�ٺy�}�k�#�J:(h2���jIpC���隫�w-����?�S��h<~��ū�{�_�4�4�rJB����WG8G�iL=FɌ�QxA.�2'�<�4!�������dV�Wo�i䯔@P�N���x�)�
�s�Ȱ,H��cNE�
*B��E�*��di1�
�-т$+h׍g�=��TC�8�`:0����{@��GC@1Ŕ�t:B4?K:
����i���6������{���b��5�Q��G4�iU��bs�0�-�U#��縠SF��/��Z��S��`FU[6�~F>��,ʳ8|xLדs+�	M�1
x���eJ������/�1R9��QF9�@��#��Ǽ<HbhDӴ1��w��9���>�t>E������:���'��e�J�Ӟ_�^���KA�(��2@~!R�/(�
mA���B�BVSd��?I<�gM>��K%�9���_�i��1D��l��.i��2$��9�y��%@���J��c��z�l6�|�A�4C��/ИP/K��<��ʘ7�8~�h4.�H.�� B�x �E��P̼d	��qsj�����S �W�o`)y@[��j�HԄ3Jì�dTZ�ި�.c�u�>�p(P�y�:���|DQc�}0�����tW�����/qI#�C�Ɯ�;`b۠�)O�8�yc����yq�}��Om�-;��	H��fp ���L�Ta���Tj���%l��q��NޏF^��,��‹b)p�ړVT#��KG4x�K/�0*����Z����;�6��ٔ���k�~Vm�[
�9ױ��9�s@W)m짐�`�OQ�����O`uG9 �6�$��YJ~+�L)ύɚrƋ�����[ۍ�0�?�CN��e�O�O_�����?��t"�,C?�-5$�׃����1��֡3I��t=�z�x��Cm?��L�n퉍��a�x$s8�F�!# v}5�_���2a�u�?�X��L�u�;���#��#��?�l���fL�C0n������3��x��}�T��0�"��Qr2W'���5KS�ژ�s^���R��o�u򯻗��������K�5:��`�Fg:5:E2mh�������E����
�����z�?��$�b1薢��u��ێ�\��.��"W6������u��Giy�
�Q�ߞ�Y@���`%:�<�� K��޴��B��1��;���h8J���C�fH�^��yB���J�3β	�xaA�A�(��>I;��&mJ�1:���ŀ�N@~$�����t0��� �X��x�?��7��P�O��l��3��(qg#��
�t��c���}�p�\6ý���C�I�~G�&x��)>�I^/ڦf�v;,?~��6+�Ꝅzr�0�m}��S�vڿ��"��cCz��j�Ż4�9�޼>j��I�3�@�9%�0��[�Lj&D�"$��~��k�flW���Ny0ց��4w�?qO�@fv��쒇�{N= O��w��Y�T����G�S� ���H��2��:���I�.SF��'��眬�{����WƂ�c��a�֑HH�
�I�1���bMq9Ō�LN��������_�}|<xq<x���p���-�_d�?>���@��mLa"u*"��=/���_7�Y�|�E{�;�Ѓ?-R=���i��g験z	
8?�4 SЂ
���V����5�fƔ7_m�ɣs�8��j3��Uzd�#:�ZJ,��^�D��|uf���u�|�4��V�\��(O�Q�R:J��Ȕ�\�_�K���^�,����d���L�,�؄-^0-m�s��x)�����o�}��vm��3\�2����=��<�-���{Gƣ#��7�CSw�N��zw�@?t������_�\�۔���$��� 	%�
�y���kA�W�����7y�"��f�bY�bV�Y�ue�Z���2�
�z	�Cl��\T=&�2
�MU Ԧi��#�Ѧe���ߪ*�e����$��O�'j(��
ݴ��7�!y��9�(&fu%p	��Iq�����UD�&г��/�F �5#�L�i�e��p����)dz#SbP�b��Q�%�>�yş��Q��_\�o{���}k�G��L/�(��/��2e�����L&O�����f^��χ��ll�]8��谲0�v�K�I��x����s��R��t�u�<u'37><L�9��%����g#�?>~�Q���/���}��tϟO�_&��&��h��n5KV�>e�6���{�w���zv�I��z�_���cn�F�߰L��_�t�;��\��H���و�Y�Hn��������S�3-4F�<����/���腓#�
+k�����S/��;CӴy�0.�szFBʭ4�� �w&3pwq��2xj��eYn8,M�tr��^W7���Q,;X��_��&��J$�J��<(�->�b�$���{YJ�h���,	�R�i�2�Qt>(_�~�Y�Mq�X�z%my�3%W	�[��QC���b�����?�B�@�������،R/�2߀Y,JЇ�O`M�ɹc�'!꡶l]"�el+���Ѭz�b��*&F.��w������f�s�N3�6F5o���0m�a�ћ}r@}��i�o$M�\���H���|E�c��r���eZNKW��W�D�l�~\q�HYڛ���2Nd�h�(�ѳU@��fCp�(�>Rrj�N	�{����GҒM� �X��ǎ�bk[ƒQ�d3�AԋExy* �
j
k������b�v���1V��T~g�kT��42�㢋�L"E��`h=T�ty)������6�OiսT
B�f#:G
<̳	����D�ޅ~�7�
�_t���'�?e����߸@��P�g^��䠻J��mJ+����%[��<��4a�'�P���X@����ZM#�,�T�|v�~_avP�����z=%a�A+n��0�YDϤ��){�����W2֚��}�74(���b�o,*9D��\C�$t04"մ
��@�hhJUoT��V"��[7�:?}����Zw����7�Ԃ���`�4*V�ڶ���
�QI����9�!�U��X��ZUCWA�`�&?okW��mxy�	u�T�^s�_�,m�c�w�?����O��h�[�Q��|,��h]1"�F#Z�<��q��2���R�^�Y'J�f�|TdY�I"}�R�����bu�Q��nĨ�fgr>}�n��ۓ�i�j����Y��uNw�n��\ݩfX�%����bma��Г�l	ٶ@�T(�%2��v]~6{[d��(2m5dK8��i^����N7��N�o�����-V�q����ȂX��'�8���D�EѴxq̑#~��A�������L�����g�}E��r�!�@��x��<�+��"��mݱЂ���s����^�S��KJ�c�pr��֛6��֬7�͆�%ϼ��x��?_k�׮5���d�cr����#7F	�[]%u����k�'�U
�pm�A�u��ڶ"��+�-zJ�4�ue����6罒ش4C����*ii�t�_װ�ė�Yd[sDW	�n��q�I�I�o��?b	�g+�@`-���e#��<���Ô�Uv���nO�HܮJwPKfp��]r�Ye~����$G�[54��=%"��E�j�E�a�PH�W�o�Q�j5e�_��q��t]��{�2�+���xG�P�)̋-[�,j@��Ho�HW�!峯��PK�ї��X��4��I�$%��R�Z��-ɸJ�g���/��l�li��rȖ
ѡ�\
[$�{��h��6��Jf�T���j�'�&�b�ϑ�S�����s�������G��z���#�H�g	ُ�a�O���*�|�N�%��G�Y��ӱ�,$)�d~�O���!�(����v%w_���Pdr����D(/��������Z�Z�1�*R��ǣ>p;}�p��1���!�U�T�9�������:_u$86�0��L�Q?g��7���E�!,�PTA�	���ݕ�ɈG��\Z��)s�`H�
���o4x7@�y�?� �qĸ����kmI��c��j�Ǔ�?���i%m��:?%Ë�#$|݂���$�h����e�D�e%��8r�e�L��--Լ�;��v��%��u�[?�3���q��PBJ���V�^U�
�<U�#�kƒi�2�H�HE'@�j�KM�%+���[욢g��xC��LJUǂ��;����=(�{v߹�I�3"�$�ͫ�xF�؛	}"Σ��q>6<�'O�.�-'P��k�1�&�n|£�Dg�[���s�ҝ���j5k+����/��
]���8���8�Oo����q�<!��JM�+{Y�S2Z�߱5Q��K�l�])	|��\��_�1�t:�6*Y\J.&/�^L���L
��ۃVdy��Nc�w�'���^�ej��{��ro��N�Z��$K��uM�U��z�t�f\Ζ1 �|R�����JzU��E���e����5q|�%-	�h�{Z�W��p+���@�?���rU,�(屜��|L}��`]�t���Ed�J��a�6R��l��ZBHdΗ","���~.Dp�=�e�RA�%nR4
%]k\+@����G~��)�'Wⷯ��}��� �z6β)���_���X�q���LbKɟ��71:.9
���Ң�\ފe�����w�l*�f@�%ֻb�7�V�V��zh4r��|�N��Ot�E-A%3k̑Uy��s�8G��>
��x�N��\�M Is�w�m�L(9S%v��+�L~�a�;,�TLT	�1u�����X7A�np�ũ�˜¿�CV�C)��Q\������.��F�
���N}�]
.:�2F�n�P
J�4�ʹ�m�TA��@�r%��"�`��(h�r?y��H����M��	e	8L�lHy�O�����1�8�K��2�]���y�Q@�LY�l���}ʕ�V=�f(>D�n����3�(.��`�#o�Qq��y�,
�s�g���k�+i?�Ww67��@�g�͚�����j��lJ]$UL�`�Z���J[��j!�`�!Ht&@��xcl�c&��cf�3�����=v������o9���D�LU���-t��y���w��kO�_��$�^�̆I�>D�#a3�3#hB$v��E�o�,�\����q���W�A.Q����m�k|t2������Hw�	�M"t�
���R�O҉�͑��f�JV&^K5+N
Z��}�κ��i4�	Ԫ�q���ƳK#�OK�A�o	x��8W����@.�ː7B�-aC�aY[��e9[��ey[��)f�ʭ�V!)�J���N���6UA[1H\��*�#�w����~%<���[	�F^���U:(�j����Ġ+ᯐkS�t��W*ꯒ�еN�:�k���TB�]���*:��R�K
<$�]Jx�J��U��R�N&�<���Ac��Bw�vo��<��S��C8�}iP[���J�̅�+n�?�"M��_(�C@0#b��Q<��*���d��2<(�ţq��j׻<a�;�@$#$<S�F��e��	����w�Q�8�<L��Ҵ���d������9U(oJ���͙
� �U�1�ffnĩ���g�p�0&�}"��Bxf��8	��*��c����� u&�IZ��4>W�:�\�N�K�V��H��H�65�ʯdK�[JfS'��y�t~��J"�%;,4�[�"9���=�_��m��;
���P����y�JDX~��m�٬��q@�Z�l�΍Hr#Q��9�@�>;�_��b䣊�/�e��ҬA�3�GhS����+p�2$��)�ߴr�=�#�o
e��?�js[���_�E�TM�w�旉
膣��u��/	��
������&^�HTJ�zά�ֶ��ci���+��^����C�p�ᒅI<Ï��J{ȫ��<�#p�l��W����T�K�D��v.�t������P����|��~�U�ex��J1#x˂GϮ�KlW�4~��]!F��#�0����/å��;n�m�Xpͬ���ۛ`l�{�{�҃�+���K5�p̢���iD�1s�����>ԣ�qI��Ǵ���b�$n����c�dlF�(A�x����:��#�s0q���|CV9���Vq=%$V8��)n�31�H�*f�����>�[�����j��C�Bj2?��Nʰ��7, M\A@�@f�p;�C�S
S��y���
�-��hz)a���u�Kq��Sl�r�y�q�������}�rtW7V���x���J�� ;&A�:�(p`G����?F�r��+�v�-��.����!�̴I)��Q�+�o�G
�W�Hӣ �|g'�**^��wԅ*�C0��ː�z��ח(H��ڙ���ݏ�DO�j�(b����cIɴ�)%�~����qn�ߩ˛v�e�M��M畡Y�eP�+���	,����і��������N��c�����n�T��U�S�n%M
�Uʧy����H��(BR�Ts%MVȵ
�k]�U�J���f�K�C�a���ƿf���<���|��T�<,(����n�R��e!�6�[�b�_ SL(9Ӻ��h����J3�3��A*��s�� ��ɫ�<�:9M]�$w3Gs�$�Q+q"��M�\0���؊V���JV.�27��"joL�5`����4��+y�qݶb��yT-ni���`�<�tX�J�:��\?��s�U�{�%�Ӝ�fB�Bz8��b�:^�V�p;��R��v@��}�f��^�W�\h" JzbE��ȥ���5Ui����dι[I�ri%�b!+�������%q���Žƫ$!�Xma���u$�l%���nJ�����[�!�RZ��fm�U�r��np�$Op%#�%�glU���x����U�OiW$E1^%"r�rb�*�/yM����t�UbyV�$��?����;�Z��ºh�R�Ec��-�ou�'�j`��j��ӱ���l��ٳ�~�Bl�غ�ۧ�Tb��q��P���~p칈���7+��7�m(�ƒ���UIXg�u����яt��8�UI-�b����d6�&R�{�����X7h'�-`�~��[��Cex�)�IM'�q�*�w��H�ǽ�RlX�͜�UI�r��cdɸ��c�h�OB%<"����*8��!�d��+6TzR��
�z�G��2گّ�Q��V�5;:r
���g�~�4,@>�V{�S_S'�J��ʹ��-�̇��	W�y�w�]I8o�7	b�JRe���B>��w���=@��!���X�Є!
���$>E��YԉJ���kS� t��Tp��Ͱ}]+��]N�j,5�2_c��L�k��엂�Q�fp�
�0gZُ��`���[�r� �&�.֚���(�
c3
s-L�r�7�S	x;����d4eo���D�l����a���,����.��J
펷��/в�$�n�t�OLn�55�f%7��K�,L�X�ˎ��Y H��M%�Psés	~>xd�P�<x?�1�CF�P���� �$��WM>�6E�j��ԄJ����W<��lϣQ�>�ƈ�|�`De��=�t��B��S��G��q��ac��֬���8�2���v�Qo(F���zJŦQ�5�ݹ�
�b>f��R=WJ�V�a	Hi�@Zf3E�D�I���R]b�[�9�ȟ���\��"�	��������|������Ii2��@lJ��j��e�8�`�3ѓ&�
`q�g.&p�]D�"Ϻ���U��+'�R��c���>jz�]�Oޥ���DM/HO��ޕߏo�/(��i�3$�G�{k@o

SX���?C�c���紫�m`>�{�1��^'��Ӡ���+Yf!\�UU�'���I��N8p��;H�|�-�q�%.B�Z؛R�b�x�н��B�F��LD�c���4>�,��]I'�v�2� �N��L���*?��"ĮU�j�\aC�N���-��B��p��@Y]h��&#y)m���ξ���V�mg���E�|ITW	Sl+
Fy���n8
���_�=<����~�ĐQ�x�>��5�6�k�*̡񐴪��1�f&oJ|��aG�a���8T$��p��Bέ���
�GCI�qc.��
a���S�����]��|lat+]�N�$�T��wX��唉��b��&w�M�՗S���*g���]1KȆ�A0�(�t5@��a��~�����0fm�0"fX�S�Zp�)v��eUI��^0��Tb�;���v.�y(#.0\���cZX��[JR҇ĻH`�Ր7�}� @��*��
^&���lJ�p9�mv�3b7���[���S�`�+�0�}KvH����\E����*�G�}g����Q}�N��Դ����S���tVY�0���۞�&e�ǒo���]I
r�
������dA_+�!�,(�~N%���K&���v*I>�N)Y�1�Ű+���R��i0|�Cm�!B��g��)\�F%i�!8s�H[XTX�|�֜T��Gs����,��σ���+7(��;÷7��*V�c(x
3���U�^���L�e�,�<m���������W�s�wM~r}�e��C��\��~�ŖRg�7:ުBR�*���XٕS���HFM��rJS���|��ŝ�/I��=��G�[ؿY^�u�\��)� �e��s�88�/$ʙ*+c$Cd�S�l�/c�-z��{��t���g��[�M2~��Qi@Ria���HuP�f)���t���#�� �3�h��6���f5+�D���O8��$sP0�dXvi��+_�6�J��|"�lrX�����W�I,�
p? �76O����"=�G�j'�xF/3���H�*v*�N`�V�`��Kۅ�m"���-h!�	��-QGJW1��t֣�<b��4�v���7�F�
S*��(w
Π�mZL�@WxJZbZ�:�將�՜�n
��Yty'a�P�󂈰t1FB9��'��e׬гeOr��y�@+SwO�H�P�|�na�������尪����5��!�'�S?sB����iA~TXK����
"E"	���9V=��rK�9�@��l=�b�E��j�y����ÿ�k�ĉ�� �`���7.c�*t]2��tƨ}�q�
�"��u��eJ�x)�=���+����3��*�Ma�T�,l@�tO����:e���+�]̗�>)�� p�����k�Gi/Gfz
{Q8�nޠ9���t�` gg|2�
3����R�YC��-֧"��d���^ֶ�S�S���,��8h�]��Lq�Ā�qP��bV0��DYNŨ?���)����XJ�3��)��pR	)��N%�&�r1�C��6zxj����{
E�޿˼�������j�i�TD�*�Ynk����N>�.�Q�F��hz��$�53�fp䃉�•��f�.�c���!/[�(�f�f�b,G�X*Vx?�f�6�^@Ŷ��o��Qu������� �$B�J�t":\���\Rcx�x�.S�(^�R��f%}�&�{��^
S>���Bpb��H檫p�v)g�,"Y�|�<W��b��-��@��O���UIˡ镓�A��:�C���ϥ	*�}��[�X"�- �Hɩ�97�N�ہ`��KÞ@�@K7B���9T'"�ws�1w��p��t�^�h���]�o�1�eh`6e�pI�a�|g(߭�}���G��N,.���'u
wL���%;"[@RȿՉ���v��E��87xUL���h4!��%=��@M0E�x�^=
m?z|p�|����O�^��+�̅; hlp6��d��[��Fۡ"`"���N�"��p��=��Ĭ� �Q��@����D��|R�pH��1�G��Sү�(��a$�_U�b�?J���6�9�/��_�jΒ�<��C�t�3�$�PM(�|�\��m���P�0J*��B��6Z����K��ZҌd
�̵~��h�,�p��ёD_{멁TW?J�l�
��y\�|
{�����$���f'O�Ma���ں��Q��e�֯�
kbcV�{��/���Vu�NP,�^w~�j4�A���TP�*��P!���L7��x�&▮�h2��JZ��^W�7t����`DBi��PB<ErjI��KӬ�4��v�j�#��5Y����{�h^z��T��RyV2�{��?��I[�>"�\�D��~5�в��@�`.
3�r�P�@?���jTj�#Z��TW�!M��"�}Kp:*Iߚ$}�Bm��C�y�m��URp�%����6��I�R�0�����/���+�#}�g�驄{[�6�JѰn�ɮ�,
���S�A���c.QN�AjV���hU�H���� �,Ȣ��
z��p�s��Ҙ�YQ��_gf�䈗��DroT$+Y/��:��]���n�Sm�D
����B�%��+s�y@�B���`�G$vXL�
i��Ehi�cm	�c>��]�ی�J�,ڙGCT�M�ۉ�������i��O6��AU�L���o��$^�C��8����y���4хhK4�dh�ֹA(� ��/�uM�������6���xFo��^�Kr�Ul�a=�b�<�X��:�s=�>W��y�dI�Hۡ�!Q����؎�`�­��	#D��}��#��`N�"��#(T	qٓ��4�6�s���܀��"�@�|L3
� >L�(�(�v1�M����k*�
lݽ����9���c˯8�:�����
�B�"�"$}��((&N��r�el)�#��J�˦�\�(��@Do�VP�^"}��*�����Y�B�y�	(�w
�VBv�ȕG����$`�E���z�v��n<\���ӹ)ah�V\��k�p�34�Ѕu\k5U܎���po�����܆�EH�c���P����d��"#BYV*�![\�70B���9]��
튜B��>Ѯkg�N� "�Vh���^S=O��m���9?�؊�t��P���*w�Pn&�1�S����=j枖6~�v�|!�>�ӑ�Z�`(Q�T�.u��y�s��}e�ut�
G	�(��:�¶��;H[���{�ÖD�v�9�9j�p�ED��O#Ap.I�`Di?���{4��Y���9У(�z��\u�?fĪ6��T����JD@�+=}ϘF�7])$��f�3M�\X�(%.�)1���J4��$��޹�հ�6s�1��we�P�X�l�0��t�4b	�S-�;�c3�2�N��ĉ�DS]\⴫xk�\:���',C��"��Ò�ƩBs�2�������J/2R�q��?���f�CyA;d�b���a�B�IT�J	�i�zQGMf��4:X�j���	t�]��\˴�tp�5�DaCP9��ߒK�D3���x�C�<����3���)�2�y���!'�Hţ�E�ޙS�;���1�T�5U/;mV��
��̣�����@�q��ހ�����
j"�H������UCm�lg���!��VH�K��'6q�'_ل��ˁ��5@���#��ÿS
�I���16��y@�E��I
#d0-x#��կ(i�'�,J��؄���Ws�=:����V�c.�j��Xt1�\�3me"��E��B%�3��۔6����ާ�U񰄹4�N����~'����',
����p�&�q`��r�	U����	�_�S��k:�j��ەU��taG�\#fH��@�_���gHZO�m��N5�>̧�ɼ-��C���~�!����F�;韙�5����`��S�ï#<���
��x"_RVJ s%Mʩ<E��W�ñY9�!�v���;���(<���o��6�'�6�Wqo2��#Yۊ�!��,��mS�(ئ�Qb�J���f⢫�l+sc�3@�	"F���
��
cҕ�Ƭ%@%~�5�Z�*�n�u�RWKVW��s�`���U���\�R�c]'�h~<�\��j�w��X>�$��L|wr~f�_N|�$�ݮ7W)�=�F�/X���Β3i���l�?H,X���0W��vS��������,�٠�>pB͓B(txS�Wp�8���
�i�U�d��;"3�pZU�>b�Lm5\�t��Ld�<q`Ec��.��Y(o�����]�Ε=*(O�P�+Ҏ��Q��T�u�Y+W�~i�d%�70���9�R���TT��fNPS�6�*��-]�R�p��;�I�1$Z��eh�U�=;��XD�i�{CG��D�L�{7���؂m�;
�n�}1*ĶN2]�Q�Z�?*��U �.6�$��Edj��|���ބgf�|�D�o�VOr򏛎�j�����	�
�*�.��#����\z�!e��<��d5���.M�3�����H���۶�]��T�`>�ѕ��G1�/b-�4���j��1�����?�j���'�Z=/P~E&��Lt�]�+X#���� �i�r�hKx{������C1_�d`�,*�bbۥ����v�4슖��x+[�_=����g���4��2)Y�(����t�c�C�&וڪxE��w�ꠘf�d*�������
���";vV�$�$�1�A�P�V�{��\z:���U!�n���\	�h�/] o�7�ɑ�Z�9�#(!zJ�Z��p��0���#�{$2�,>@7��K��9���H�djk/��RQ}%���+4��Q�M���:B-į���/��{�ᶢ����~<fx4��H_�
T�I�\��P�B�(D�����]d2�G�82��8l��E����v��H�\��QΨQ<��0����t]��Ґ<���et�/	��d�Vu[TZM���v��V�Fm�����m��F���@�SN��c��Ԋ+����%d�bYIuq+���x�T�o�\�U*uKb���T���),	3+ǿ!�F�$u�u�� ��'׻�)���~��,�ZGY�ŰT��85|vh�$�
��ZU�p�)��~>
�4"�7�{Hx\�8���Y�x�[?^��di
zq���=�)���A��F����!���M˂�l�x��
�8��`�`��b�7�{�"ya��~���
׍�Q���X-�[Q�u���Gw�=�{�a}�B�e�OP�R�X-۴Zf@#5q�8v����w����d-"�������{/?Õ�dm4��.��_��l���B�y��[��۲[�d=��[.H��$�����{qp�D~�qG�e�01_L�DN�j?`:�YNrị̌pK�M�z�T�i�D�5	20�W}��qDpC�tn�
���������^���{����n=y����G�h��akzx�߈���E:�A;y�k�CR��aL=ȍ�""o��W�Q���J����+Q0��(�(�#�
uuЦ�����z�>r3�[Zu��O�邺�$�(D�wH�=�}j:҃X�@'E�n#��f��jI͚�z�׈E4 2~$�K*�1|���$�ނ�Q�p�"S5f-cN5���Xn6zS�IrϢhVx⸄R)�`�s$��pU����u��ց�ϻ샤8�4�Xhf@9�%׵'0�PΠX!�d"{�R�+���Ŀ���f�ٺ6��pgH��Z�S���R�}�$���V>�׎*8y���h�8��hya�
�;�	�-'���a�5}@~X��uOt
�l��k�c?�E9AQ�h� +�
v,�X�g�"\�LFS-t��m�T
�3��ޔ�.4*�Ԥ'��Bĉ:pհ���T����
�*8rR��埄�l
k&<3i��)���F�y���Y����cY�HQL����I�(+P���s�,� >��
Ym ��"]��I���>٬�����Mڄ <�.*>�Lش�*Wr�)�B���F�EA(���xP�=��Mw\�
&ø.��D�5���rO�]����Ԥ�6˜M�Ʌ/0N�BI�5'1���d5�i���A���؏g�mȝH�+8[$�P�� �I�5I�@�)�!�*���
���$􅅂�?��1�/pyq�0(_|I��-m[T����}`���ǘS���g�T���Y���=�M��i������:��0!5�(����Vn���].e���
l	"�U=X��I�&��M����Rz�N@���n��q�"��-zKF�c��BG�����L�g��<eC�h�'j�N�"�, R�!1]���.�%��<���
w�u�R��Mpt�ԗ=���f)��,+UI3I1�h��O=���������3>�������?������P��x�a)Q�t1�zY���]�,���	�:q}$z��:U;�_���vt]ǃ��?�-����v����3��'��l�k��`~��{ڟ��M8n�4���
2�0i�����|2�� �D�qH��k��Bf�|�6IWOL������jH���&�D[@>&��'ia�WV`��uu�vcj{�4ﵴv����x�|���CA"~����t�?��������,������
~����V���aB�LBP	�r`/ :�C$�GD	��.�&x �,�*=\$SF\�K��VgX޺���¥[�HP���@���UAU���<Pk|'+���.��V��B�F0�4�2� 7Q���u�YJ�#46�(�a�&Q����]�"��'އ���,B�!dӱ��a�Ҥ"M�r�#�ԁ�N���"�1���������+���#��/��gDѼI����xc3����J�_E�.�[L3����\( �╲��։����4�f�q8p���D���$�dMEA�â�ќ.j�ُ�Q_��b�(e\��y[}޾�^=�4�`4�1�i�\
�Q�{���mcC�cln�y�s�]�Ĺ<;;F3�<�}۸�e��K���Խ*^];��#Ük4�m�j�x�Z-6�(f��@��z�2s6X����A�F���!j��jL��=����;d�1C��[�&�?CG��V[Ԫ�9�V{�Z
^q;������+�w(�vX�i�z6���f
{هs}ۢǯ��O��O����|�|�<M���������$���;��?`5��d�(
�����4X�!��F�O�nl��2>|*x��o�2�j]��/�m)+x��NOG�y�{N�����穹����nm��=\�X��^_ÿ��FNj���u#oٌ����j��r�D�)�`(4������P
v�غ�9���;��1���Nm0��~b������k���%����Av�A7�A�
�1
�?y�`2�"AҽO���s�
���*B}�B��0�x>G�|��A"��a�ʨ�uB^�i��ܠ27{���D�+uJk�`y����p��\Wr�
�a2��_��h
�rø}�c-�k�!N�%=|6�@�ţ8��?Υ��ڷ�}
���Uf�1,���{_�7&y����߇��~��]��rEo��m]����0?�d�-����w�ΦV��8*��=L�����p����9���5�|_�x��0�^qk�Ǻ]*��w�E�ZV������?����'G���F���g	�oz������H���KY�J"�_�.F�mg�^3"�K���4T��E#�
ȫN"\	�60˵P���IɌR=G�0�ܮ12`��"��$�=�<R'd1~�"B~�(�A:o����}�߄��,�A���Xȼq3���z���(�նH�Y��eY�*3a`o��[���,�ρ�-�W�|U��f�)9g���L�'��O0�4�g�
���M�Y:W��<����\"�.@%�%��p�
�rk'^r<bd;7�1U��Pim^��Z�;
7���e�#!��r�%ӂ����O�X���@O(�����ηX�,��$)$�A��W��n0�bguZ�A4����T�C��RI��(4�ȿ����ԕ�A��n��s`y*b^��'��3�ԁ�V�F�$�a�6�&�s;��w��YF@�A�E�S��&'4��j�2��Q`޿olB���M$�Y�= ��"ek/e���4@�-ڢHG�9���̥-`�5�8�@��|t�Apt"A�	��lJ��n�hO�SU�ܡ�&j��d<{����n��・����XpP��q��a&��Z���B��6*0�g�h!�$'V�.�Rc1�����{� M#	r�:_
ĉai2�$�2H����n�l�i8'�H�P���
3g6�]�s,n\g�Z��F�%Ʊ�@"�7��a9DzJ�!�gG�G�l�b�B��jBɁ�8�<A!����T�l􉩁sX�)
&��Z�no"�:��
$H���HqkrV��
�9���	f��`H�ÿ
o]��<��{v���۸�����績���
~������M�n6;��i��1��:`��V�gY��nOG���H.g�9ӋQ<O���w�S��j�'�~4ŋ�X�t��΂>�_��WB
�Б��&>�m~E��$�dO̩`�������"�m<B�n&�U�	%�
���� ��\F0g��]��%�ǜ+��Ƅ��j/�hz��f1�ҌL���8.��D\�hv	W
��b����RV��M��R�Z��x��x|�fܻ{�`�����G�_?��߿����ށ�|��}�����ϟ��� ��oш8����!p;��\��2e󣾁�T�
�<�;�(!;@��6���4���#�7���BM>q���w[��oy��o�; ����V��2�k�G�:[Oχ���;�v�yC�玀d�6��l�O���EE��JWt��.T�	��
������t��������^:�j���S�Q���X�G�R���i0_O�#t}I�����ˉ2�����ħ��pR7���sʙ��CԖ�H�ګєeT�9����Q<�fR����qwn��$>#��׌C��1jX��Z�4�g,@�1�4�V ��W��)R�N/������%L�r�K�>���e鐭����R��I�
���s�"�&���β�/�;�r�R�q��ț6-��w�RD�XA������`i}r�㸇eS���!�yN3����<c�5�Hc؏PF�1%�
r&2��$Q�.	C��5d&ٟ�K���H���PK	�>��yri�7���M�F����3�)w�����ާC�J����[5�)Y��� �Ar���5�n@*���9U�YL���Db��y����<�L�sc]0��ʿz�%D�cCXri���w���݋`R�n�+r~i�2΂€�i�E�Y}��O�a8�'��ݩ ��)trL�O���I6eѼ��� B�B��$���C+�g @'�Alʍ3��*����&�pa�����r/ـP2'�ٰ�d?	�B��2���|4�p������P����jo�0�R�ƨ�2A�z(�"���g���ڰx��AL�����T
�z������Ԧ�T��Uũ܄(B�cRQ��f��jۋ�0,��
�=�2g����#����͝�o�ESi�
�V+$)@� ũR��#��,A��T�`�8v����9W,����5y�n�����߃�L�C^�_�w"��Z�^&�Ь����(��(�PA�Tʈ��+FeT=0Y�Gk#�=�j�yՒ0�֟�?�׍j�
c�TX�4@�NU:N0�}���ύp�ԭ��\�r6�A�����0
������H�,�fJ.]"�h�I��c�<I���.ȝ$��'���@�����@�I�Æ��,a¥R�w�[>���2�� r"us+�"Q`��,b��1�:�]����-�$�2}D&�Q�t����v&�p���Z�u�X����S���0��Q�U�2F�s�}�g�FX�H��ǰ>d���[��̗�I6fo�2��1�
�(��
aV"��N�T�N�K�(!�FdQa�-�������r~JaQO��C4�e���ac�Z��7+�e[Ǹ8�U���~ҥ�3J�p!M8�0	Z���l���Ѝ��s��E��+���v_FN��M6�*G�횫m�[���9��zxɐ�\� i�&o����to�hQ9TP@BZ�e�A]534
��'R �b33S�B�HtW_�.��)xB�x$^��V��
�)@�d��&��1J·��
�H�9
�,Ϡ^t��� ���p�c\���
�W?I �N�T�CR"���‰r#�j9a�.���I��''��|!�W)�Qh�2�-��(�ōƂ��i����I%�Ђ6��Neˮ�y�sD�+1m�4�"���S���7/{"�>^fR0�A<o������@��p*>�����ӻ����#r4�4c>���M�=���!�FF�."�UU{���X�)�x0gf��bmJ�Tch ��z$��^B2�a=��Yg0ā�VC)+�S.N/�c�U�F���$��M���3�_��<g&G���h2z�p1	C�)��`.�R��D���*�=k,�Y	�L(�~���4
pP�U�6�@;mӔ�^�����9Ad�}ba�j��
�mX��ڲzIdLP�0�='ΐB�XqX�=��� �
?P�(^Ȳ�
C$�H�kӜ#�)Z�/����ɂ��e�o"��9l��Gca�����Q�>�0�V��OxW�y��5���i�z�Z�jv!bF�j��R�	V(��E�Д�ez���t�2� �蔠��x�r|b ,-�Vq>��:�L�,y�����"4Fl�&�A3��tK�d)�"��]���6K<�l�F6�lչ%-nE���P/A��^�W&A–�i�^YH�e"���Ͻ��l+B'=�n�36��Q�
�L2NJ���Է~�4�F��1"1Y�E=u44Ĉ�0n�~#
�=��ZX0�@����!����"��?��!'=>������4�rD)`3S�_��
��-����S�_JI[k��GB�T��Y]n�,D1jBm��Oi$h
��w��0�pG�0)�
>�t�^��pm
@[qV�c�vѮD6���W
�Qd.N�z�k�qL�	ـ��G*�ĀaA�D1�\
xw��~��I��������9}m|#j����O�¶2�92��]�@�LƗ��]�%�^\BxL�t���덂�Ļ�±�pC����	+!ЃX
N���q;����t0c'��rz�*D
�#�
���5F�2�|�:������M�=�1����Z���5	���$���M���C��7����8��)��c̨\�`_њ�|DF��)c�j������?����F��yU�Ɂ.F�t��in�TlS0B���<D��%ދ�R#�.60����Ʃ�6��O8x��c�� �1���!�z+�N3 ;WY�K�@n���P����516���VQ��>��cA�?
-��RM���8����Dm!'��+�ߧn�&�����o9����߭�5i�荦
�C�*!�1�dL�58��[�+�p݋���"���꧂MP�/���2����`�:t��k��v�����;F�O��GP�8�r�^n�y��f�v��G�%+i���{��h]���I����r���f}1C��vp������2�q�|2�Fܹ����B���zC:JO׷�.��v^�р��o���5J���ƭ��p��B�3��`�Tg���@����0����5+�Q�@n:���Q,��Fq1�.Yw�'|�
fQ.X#����ͽ�������4��u��	�H�1<��}ރA�^(Y1��E�����9R�ۜ��
>�3. *�Q��U������
�
��g#�3���0��`��o����j��
������҆�_(�{�|�l`��uh"�W�H���4��kL������z_�es*fT�T<+��J���I~h�cB��IzRҨo7�ܦZ��y!�1k33C�ˀA��l��@�sV>�φ���WO��舲�ˎ�a��}y��pG�~Y{]GݳhU.n�t��y#�_]y<��"f��t4�ȱm���Q<D�<��of��'GM6�]�g~	����k:��,��fcvn"���MY|p�d"��tɤ���rf��k�g˚m�r�Y��m�	nt�qL�ǔ�c�t�%qo �wSZ��p^6�x^3���2�BnV�Aĵ(<?������?�"�O��
��{�%�O������|�F��G"�/���V�[}�����vܿ��)����q�I��@
~�6x�[��-�k���� \�S���y���>��m�p��V�_��д?������!�#(�E'+���"E������p�%]爨}e@��K��d�l�5�y�AIk@�<z�t����q�/Y�'�`�V:����wy���f4��R�^�f��u��a�,�Ű+����0�]��/�q��D�RDt�����ދ�P��Y[3��I43֑����Y
N��E�0sr��)���m��O�H2�	���&0
�����C�m�0z��K��f3��@�Ď"Om�g��H��Y��H�YW�q�a,��8�0�z:4��uK	�Y�2A�7����t0={N�o����G>���A�cz��$�B�,!fi�^��+��ja� ʍ�R�l%�2�h76���{���r5�\�E�H^��K+�u���Y᭽��z�B�_�>�\&7D�r0���Ç߭�7_��W���E$��h��Ht.TK"�]$��mjz�v��t	%�J��N���c]�k�"{Fc4��"�gf/��p���KM1k#�-�����4ć�+����7F�;Rd~� |W��·�����A�����k�v��CI�a�?8궰6������0�����td?����m.��Z�g��o�+���yA!a�����qc�*�MH���=И�	�
�%��@�/�8l"w�fxC��u�O����=�~ԭkO��s�+W���5��_�:͠�G\�z��W��W�<YDF��Kϭ�/ѿB9��N��|њ�HћW����$�7F�X�	Mu� �������<��7p]ޒF���TŴ���|����T(���E�h�lX��_
���y�ja��gmS���#�4�@3[fBp`m6G��Ŏ�DR�8��(!�������7s��<YX�t{[��U5�#�
�X%�����5�W���87����?�i-���g��7�}�>��ϋ��W��|�?����u���8$�c1�66	_� d�1:�T�p�#C�$yG��M�(�5��W`�����ٰž��ask�00�]ֱ��
��V����*I.�W:@��j:iV8b�+KL�Zc67�1~��
Q/$}X��s�b�f�K��!�#�.�`=5�7��M;g+��U�'�r�G}��g�����'�b�f2��]��S֒dӤF���`+ϬncIT��a�u�,"{h,�meG�P�?���7��&yx%�����Elx�R���m�o�W��K��������i����:�I#�?y���g��ӵq=�g��/���g��o�+���0�ؤ@1�,���~om�kkx�F�rK�DĖ�X�dـ�x�����Q�6�)��8[��]1Uh	��A�k��e�槫��2��~#�|��tk�we�x]0�$��R1-+�7�f��=J�zpň��D󮰤�c~_����v��b�����.b�2L��wp�k����h\Y��#m,^�n«装�Q��RXX��M���kZښ��c����2��,r� �?�'�1�o��Yښ�9����UM�e�Z����F��"�6Ef=m-�<����B�QfN]�2/>,�#4��
P��~~*�տ��2n�g����Q�?PX��e��xޱ�=�Sl%��yQEf�(;�D��O9���f�S�N�?��f'4�i.F�t����3L���y[V/���h.t�C9"H;.������[w�E�BY���ugU���|0�
A�M��8���UY��uy�
|�����_;U�Ъ�5�tl~w�w�-�~L�]8Jg���/��	�k�]BᑑNBO&#�EiW&���,�|!��3r�x>_�(��@�e8�Gs��=��@.�Z�4R���J,�vkM��K�q"S@�
�����@�zɦ��1��E	�_�c`�b�1]ה��'���-V�a6���l	hsiGI�aX�\"��sq9��p��������[�nc�,�^ɚ�+�]�z�ř�%E��Zzge������⹼��d�x}e|c�|f�Y��?e� ����Y.���5�@�ǐ���JY�~���:����XQ$23�7�%�f��i�O�;�G��z�r��~�6�l��h�|4�6�|��ѷF�(��� 
_� ��t�jv��_�څ���ފ�2����\�(Z��?�+=�𕸩�o�u>�=�����\+�{�Vǿ�������s��h�����5B,���o\��n|�~K�Q.(��d�L~�1�.8�U-d~
7�F�����73���/�9U"d���|�%��!������/����Z�*[k)�S��N~����1W�	(�|]�����\W�n/e��ʲ9K�c1�Pi���y���B����b9�]��?_��d�/���%��b�;K'���3�8���l��Rxx��;�x��&�z/�k�jYA������W ���Z̬ɘ���KR�xM�r~$��<�v.OJ����2�����)��_�i�l��������q�ߊ���&w7������l}���[�~�����]�x��4�|��(�Y��F��W���!�rR~��T|�M�����	;�,����UH!7mQ?��[�K�l�f�׫5X�&�'ҟ�UW���	N�EB�5Ӕ*0�f�m�!#��b��ڝ�aP�S�7�ۂ]ۮ�u:�z�q��_�}4�_����i=���O��?�I��VT*f��Rb	�@�l�eI�Q:��l�H��K+^4�X��i�-��]��hp!�/�hu�>����w����ܖ̘O�cDy��l�ٓW���6�z��'���
*IK���_�W��O>����^���5���ů��;�`��_�������z�����u����L;>9>�J���*um���K�$��j�^.G�Г�O��uQ�V�V�������U��WQ���y��uJ��:�?H�k�4�[Zc�vC$}%���e6mZ׶�׿�ׯ�e�@C�f���?<ꤨ�������m�ߖ�G��<��|u\E�h�V��Z���.���q�����d���g���J�?�n���&�c�~S0*�E@1ޕ�vO������֖1P�H�g*D�(�㯷w|��J�$
�RD�8!��?��㓺�OqA�dd
�4��$TF*��'6��xD�D
��--^{�M]
ƣw�꠰P��h�H�#�xK�y�&�
�dSC*��鼋���2{>��01"8�4��i]>>�N���6����_��sU�Iy��F� ��0M����w�Ł����q|�������_���ݺu��]�E)^>�}v���Q������+�<y�l��sT�Nm�v����rMu�r%�8��D��O(i������"���6��s�}0����+�_�ז�C�Ы�M}j5�\θ��C�,2��K�P��+�)6�-��Z�qߗ�%�,%Te�Ғ"(�\�J�Ef�>f�����l
U�搛���rf�blB��f��L�c{s�h9�������H��I=��~�䜬
$(n��i�x�3�tt�M.Է_��s��8����~�׋����O<��``x�)ŏ�{�?転���I�e",o��V=D���5���]G��ypqf�v��{{?{����|w���Z<4�N����|���:�ٱ�����q�x}���k�bueh��7�7��
�3�����q�����'zV�8�xS%���{������`C�n����O�z��O&���O/�>�����w?쿼�Ӈ�{O�ʄ����F����vl�5�q�&������DI��B��1���4�(���Q�r�rQ��(1`p�0R��`@)�p�[h8:��rɷ(��qw��a]o�xz<�d3�)��������iEhPjƚ����t�e-�o�n��L�Ui��*���85�1	�6��t�Dd���D�z�iE�����;�w���7�{
��,‘�R�T������:^R�}
 ���K����F뷛Ƒ��_㓸�Ϧ)☾VgW�R_�/�H�I�
���m�@�����~���[�V��'���~��V�^��r����_9�
Do��qܫ	�)J���w�r��l4$v4f�6�}�����ރ�/�
*�`g#�I.P��{��'��d�!�D|8� ���g]�bgͩ�u�[+!x(��Gd�_��s��q�b\�|<IZ[����'�ݻO����0Ԝ�����ڲ���޲��L!�1��Bw,i��\)_�y2�%x��()a� ]��AA�	���_����5E������\��ڒ+�R�����*UW�.�P
6S�&���U�6�����jh.���;k_D���|�F��������\5 A�\2C�$��	�N4�~���l��
�����K?)��ŵ�,��,4���N�����{����
쉦ڱv�-���A��&�/f��_5��D��}2�v�x�:e_�0�,�,�m
Ρ��9"�	/�k����#]�e� j�r70�'�E�l�v}�ȩӜ����|��TB�<խ�j���Z����c�QhR��U��	�G���H�@���E�~�
��E���n6u��hz��~F.��<L.I!-��k<|�R�m3��2�3�$���E���)jmf��CE*p6좡',Ψi�<�����u\�49
�z?H.F��(����x�`|�i��݆�r�&4(P/Yxj�Q??�q��;\�4������D!�IWv��g���9�\-�L���^�j��_��+'W/�@y��
˵+�V�k5w�o�;�҉���4���/[�R᥆0 3�%����;���3�B��%�N9����x�v~���wF��JE����� ���r�^��o���me���Ǹ��j����0��c����g��P�i�6�fh�P݈ji���Z��.�r�'�a�.��Js�j��P)׀xn,p�z9�NA}��a��G��hau�!�tr�h]umU��G��+�I�t�iGNh��^�m��!�x֡�Oz��V���.8Wp���fF�R�f|1�c�8�܅QW���^_�n�u���/��B�b؀.��W&��Ո�'B�dԽq�}GCx]�=�$�|td���r�6�O߰h��T[����������`���I$�p%�Q�L�H$B%C����z��9�Q,���]��N��1x�},���o��_�M>�].]���|i��./})ˋ����}í?�h��*���\�:-
�I/	���5���01"Х�ϑJ��u�x�d��#�_^QDx�hc�<ol��&�q��_�>\��o5_�J�(��P�i�-�!��V�\5�]����K<�Y��G�}��(�Á�ߕ]�[�[�PX�~���Q��w��g�d���Ҽ���0��p��U�*�X}W4s�x]2�����;]x����W��Ԉ��a�ˇ<��n�P��Wy���/�>��x���h��56���j��BP�8�3ﶌl�p��݈�)�����O�����/���c�F[�ۗ}�qh$�T�f*���A��(��\u4`|R�� ��U�Y<G=�`�k�c	m1�n��KO	EB�0Rȧ�
	ו.�)@��~��n<	&i�>l�h�"�v.�ip>U�Z��A�`�:�A\2���RC���kw�
[`�'�N�L,.>���w$�/�&���m���Ȓ�Y�d�R�lN|������]q����ȶ���F��[�6t�=��7�7��ٛi����m�	"�k��q���@��ӽ�`N�@�9�WL���{>��Wy�f:�q[���Œ�Ja9��Q1�|�]�Z�"��Kz���Β�kכ@���^Y������ҲD}w�mKf�0�����+�*�J���0 ��Q�rtDビg��Z��:'0��%b�"x����!5ֱ�z]nn�.!��Y��e$x����;�
ϣ��
������&k��ֆ4�9	ޚI�*��46�`.6-瘏&�6�����QN�`[�J[����ӄD��.�0B`�|7��r���43<�\�a9w�q�ďl�UN�(�Z�5���FI/���p���mm�����yy�������A�a�)�z�2��/+�뜀!��SR޽}k�d5�����#�hy�Hy�J\�p�&�sv�Y�F>_���D� B|J�4@���9
O����,";;���q�.@��2|�ʜ%b4��լ�7��#��nm�ͪ7emkk�6t-d�rUI��t%2�ed���6��]FpR�+�}Y�
=��"�u��Y��Z�L"�,R�������zc�HH��d�Q���|���Z%B��U�ބ��������+|U�3�zu��ڟ �A����J�|���)����*�v&�Y�|\r���Z�?�_ޞ��B�A�u�+�͂:U���:"�9���>����2o�mLn�$NQf�Gn]Ŀ
I���ƭ�;J�\Nܹ��(��|;������Ojj��b�;k�<��P�J6�(4T�GQ�жBCn�1H8�oq2vL$�������i�2ׇ]���۝g$��+�SZ�VT�8w�W+8���h�#�c��n
��k�z��w@DJ����G{�F�'~\�꛼�0�m�����t��ﹱ}�Ò��uL³�����Y�	_�����v�Њ��n�ۮR��{���a��T3௻��_o˛RT!KO"
�VܨDe��E�^|
.���l�S�*��V�_L�c�dm�3_Dʓ `�&�͝M\�?YQ�Oh�,�LB�
��|(����R��&k^���_���k�&V8U��k��_%0�����]Lgh�ܛf�6�$|׺G~T��3LJە�HTܒ��-ݚ+v!�m�akO;PT	���d���~�E���-s������+�4ǍFW,�M�XJo���7��0�?o�@v��!�$��D�C��wQ�`�>�"c�X�'Ұ��3�q���	�
y��>��i�>���������E���%u���	d����ٻ���LN+Nh&�R;�`逕����J�A�(5�ˠ�L�.9:��*��F� b��:�X�N�w��y	��m��e��3XƳ7����)��O{��?���,���2A�Ep�q�׷، �2�K�WIO���+w;�>��)kc0z�c�t�n����G	���Q;��5b�l�M���,$�S���:Nn�_��J@����V�8-��K|��yJ������/7C�z��k--=�U�^{!�a��f*��hb�ѐ��3 �D`�$��n��z�P2���?���	�f�i���,h��>Б�=��7��h��c/��DR��z��
u��:(���P)��S�j�a�U@'1ͥ[E�7d��s3��h �8�eRAr	��
6_�ƃ�t�	k7|3
�oN�^�f8���pp6s*���0�m�)��'����t�m&#gC۰5��RUVz�Z�+�$n�/�a�����^e���o�S����ZMCmI?��዇h�5L�ɶ�;�Z_<F�I����ZZ�v	,�4La���� <�cop:���&Q.�~����ז���f.��ĕ�tڼ8:�4B{���zN�R�o�ݒ=�a�t4���\T#ƅ�<:�ㇵlX�������a�6���<�d�L�q]
q��/�?�<���������LA/`�P
Er0��g3���8�ӳ4��֧�Y6��;�T�mv��V�ߵ[���w�Vӱ,��t��k�����c����>�v8�{��g7��}��Vӻw���r:n�s�Z
��p6R1�{�w���Ʌ8���F=��	6�53;[��]NӳѯiJ��<X$���d���hxS���I4�\�
=B��أ�emM�`^�3�GF�hL]B�-�	��F�L?��_8#�t�2R�2/�P
�c#z8HDL�T����,�-9�V�k��R���A��3c;١D�[5���ƃ���ɴU�*��8�eX#�K
%�R����`�@�3�d%�L�U���>��0��|�Y[^;f�_,�$6Ȋ������!�'L�b�	{��Ǔ�p��<W��f5rO�!C;���(����%���W;�RԌ�5.홢n��Z}8��Ŭ۟ v���%�LFI�[����_o���^ݡ����.��X�F+�~"2�����x��Q��W�vL?$G�$�#$p�����yɔ�h�V.M[ҷ|�np�V��Yb2aU�y���f���p�;ήt�+N�-�ܠO�Y�B�y�=�R�P�^���f��F�$�߰�d
#Yv��/����2^ɈDjy�0[��®p��2C�X��~���%�+HԳ/y�.�=�E�	Y2?����ƒ*ޤ5wy#�9�y�.9h�W��>���
E^�W��h>��0�7�7�:!|xIg��鴦�.��m�r�,݋�K���Za��2�ŝ���
u��k�W�u2�T7On���X%��λ���jC�T�λ�B��jO�XWv��C)uvΆ�7�i88��7 ��ᴖw"�<��(��d��㤼g��M�eR�3>�w>�Gܺ�0ݫ;���]�[�uX�=��J� I��
P��+YѢ7�������)RӦ.�,7$�F_���0
�F&�( /@�8��pJL;}�9�G$瓋�,�rV
7�8�R]�-����\DcYՅ!�ӕ�\RxI��{�i�n����f���TkJFd���L����f�+���\��5m^r��p��Hv�Uv�qT��-���|d}Օ�����
vX:\��-�e���f�ɂj��3��^jќ�Kv��,����LRj�)
L���Y~�K��4
�N�!�Z�[��·��…ƊҬ�Z��=���,�iD7�r���¬}L��%���t�0{7�Y��[�u�pgi���ǣCɾ���`�_6��)l𥢊�˿J@9ˏ�˳�A�i��~�Q�낱X�Ɲ��/�fR]+?g���XR���L�?g��
����6!+&��H~��c�	ƋZګ�-�8��s���*��Y-w���K������Y�Bu�?H�\R'a��Aw� 8jh�Œ����L�L�ˎ�&��)U!c; snAU?w� Nq�ǂ��n4?X��
G�p<�;w>jG�EŢr��ب:5�v��C�2^�MB��|�›`���jC ����w�nJ̘����;wV~D���C��ҳ A�榾��(�!�ץ��mC��vۣ���W��ƪm��*B���ՔT�_�J�u��K��5%5��ki��AX�������v8�a������e��-Q>k�رy
7�/^�c���	}���r�}��:X�
ʱ���G�:��W�-��b�reݕ����!�'�0��r��D?�]�H��Y+oɱV+�km���K��\[�Z*"�Bv�,��~K�ϛ��O���1�S\�����l⃮eъw���_��mBC�43Ύ�T�qv�Y
�(k�]j����\�%N��G~���d^S��ǵ"�D�ɺ�^�0Y���;B^�F]j��
��4���`6�4�P
w���
@5N�		t�zss�&�b��͍��Pk�8�(�c3L�����s=:3IY�(�T���,O�ny��Ǹ�$>^[�]D�-D��Y�|�
V�1��a��S�y����$���ԔR��.9cĉKOa*��M�^�ؙ�
a�ϳ,d��ш�h'9f;dָڪ1���
�>�U�9A�S�B�Os/����@Q�8�F��N�k��V��Q+����.7�]P[y�#��(�2G�,'�,�/��l��.�&�)�z�!�b�yfm�?/����Po$���g�</&Qw�TYwB~��ћ�-Rc3���;���p��TK���$����@)�{����L�����8��b($Bp���$����E񱶿D�e��ZN�"��u��E
g�$�������=�/������̖Y�}���lMf\�ܛb��9�?�O���H��{�:]GG��U]��?��7�|���S'�+/Xd�M8�^IΕ����G� �M&�n�'���� �f���������d+W[5<ռ�QA^�x��r�)�G��	�l�a��
��8d	�HtE�#$>a�r'�Lcl����@$���V�/�����	n��e�x��/B%�DФ�A`0�LjdU�E���iA�$ֲU_�7.T�A/�獖�b)�mtG��pQn�w��$���ƮƢN�4R��&�s����/�0������jhT�;�Ch������%��H)�E�5�ӣ�<Rd(��ȯ����(� o(�U�YhQN��(+�`�����/��I34�Zî�g�5��B�5���߹�$]��s�5K���}�(�n'�����
WlP�����	�dyv��I�̪�L<���e��4CȜ5��+����W��ѐ��ޓ��{KH2�W5��A��0�G**�K�(�Ao�$�v!�����T٨G�aA^X���)�c��L��e���J���\�P��4�0c٭��R~ɍ��(K��Z�@BR�c]��*(��$�M�M���v��w�QF����0'�$���]�rq��7��-�n���Ԕ"T�"`��e�eJ���X(R$b�/��3�ܔuE�JYVøERc��
�d��5"�na�QG�n���ᆝG��|��W�T���H�_N�-�1ס�^�
MUt��� ��
"5H@I�-l�O��Ȉ����I�����&���.F�0� �_F��^�i����ͷ^�.����rt�p�A��;%��7�yY����ita|=K�7������4�J/���,��~�3��yg؅�E
��g]׃,�
ߗ���/�j���_!^��H+�;���$'�?��1��|�]��kZ��v�r���?�?U���?|v�����j�?>~w���{�w�F{{�����Z{_>~8�a��ރ�?z���M:郻�3�����(�k����˷w�{5[���
��?x�����W��;�?�_~�p����wz������?��yO�_$�Y{<���n�&�h����/�~�;gͽ��GO����n��q�ǰ���Βgw�t�I�Ư�=���/~�!|o_�\�M�~9�c��OO�?]~~����Ͻ���{��>�y����ÇO��^=[���/���r��Ӌ�7���wѻ��?�^�Ϟ�Z���up��1y�c����ov������7�/����_�ތ;�>��}�<�������ݛ�g�5O_��G?����'ӟf�<8�Ow�<��ݯ�k��S�G��O�����LJo�����a��?_u&����W/�i���tѴ~z<�{�`����r��d:M�����Y������Ϟ����=ܿ~0����Y���σ�/��΃Fr<^@�E�{Ϧ�����û_�v&�oZ�w�G�8}�Ã�7O��<�zq64�����i���g~��Y��b1x���ދ?^����S0�$����q�,�����}��O�/g�t���n���避[�:?�;|�������(�����Fnǿ����ɓ��F�d��=�����lq�����/Λ�w�kor�=����gO��>���;��?�4����͋�f���a3Hn��v��F�a���#��>�����5�����?9��s�����d���'n�nz{9���x����w�xM�$�$RLRn��6b���	�Q2��N�vB�z
YN8��e�PB���IpM��{���_��K�,���w ���S�*�<��e'���r�Qj�G���h"��(�cp�`\O�q}��a�Fsă�ă�N?D4�V
�mĸ�h2�_*��7;VN��z�3����֛�!	����`���F���;5�2D��MSn:�EdRu��͍[�e�/��]ݍa��V���k��cK�TYQ��vmoԃ�1�믿�D'+Y�r�_ҩ�|��G\/TdB�����|VN�$�m�L5�b�{�0��f��Es�y�v���٢G
�|��x�S�U�xi��!��
�߰�S��t�ƦdF,�v2����Z�W�h���+�J��kr���x�T�eL��^LA��Kc4�YmO��h��y4ӄb�1�-�Ԧ0�R��q�|5�o����QU�LS'��U��j����מ�YH�� ��0J���7��y�%�w�ޒ�j��d�k�S(�r?󍉜Wv:Y�k��
��EX������M�tv����0Da��ދ�'�!�Ec�;r�~7�MT�!A�'�SM9�ox
,@Ϧ��3]XT<u�H�{]V�r��S�዇�{?��5�U�����Gu����=�c���7����a�����_:��~M�Z����^Ku/�V���S��?��^x�v=�rY�v�ե�]ҍݙ9-��L�|G�"c�85�LT��C�D�Z��k����e���ʷ�K�mr�ދ�1F���zQ?X�Bz>J�K����ˆ��M��q�Hͺ�]��q�^~��c��n*��K�0Qڷ�ҭڊ����[�I�u��E�d��o���j+�Ѫw��<OT��x��o�+��q,��V��&d��QHbw1E�<�]d\��M�e6]�i��-�uKΔ�V?�Fu��t�@Q2w����u�d��
��{{H�DQ�^���Nӷ�����A��F!:���QH�#<_Ye+��ʠ]���/h� ɜN�g����[Y�VfFh纚��B�8E�6�m~5�˪)���q�4}(��_kf�&�Ä~�>�V�:��gʤ}�u�l�[&����Ω��M���!�Fa�kBEӹ����`16�������J�r4-�LIzo���y�M��,W}��?�MG|��Jw���ri˲|��.)mٶ�>/������v�g�V���ώV�]��j��͠z�
�r[����]<
.xi��\��/
 �%��4���k떸Kj���^��j��
Ľ�m����)�K��,��̊&��%;u�.|'����.h��›�.�3��<or�����f�Jh���0Y�H�u�o�M��8jh9����Q3ӬK~�Ӡ/�'�S&����E:��G�5Uh����˲rof���yFZ��VBtL��
!ʭ(��BaUP�+m1|v�4z|��G�'�y�s��P!m�)��h4Hx�^�sd�І�D�$�wdz���<N�X�<
<	��\��8	�����: ��Ԝ��95%�6�y;|���g�$ڑ!s=wl�ey�`�G�Dz;�������/�!��cuZv+��u�%3��2U4��B�g�;���ڪ)�����s3�þ�n��������"@��*�eG?�k�?�~�_���l
��S�q���������7�)�^KGts�&���Dj����:2F�&M@v1i�����!�[
�p��z�
i����H�W��i@�ji���ڻ]xw��zv��������:���j��&��F�gQ��;��f�9���-;1L�1��m~T䷡�P�pj
Oc��>B��v�%_;4-�%%��\Y�JP�V���&r��kz�k�g�.�|Y����?C[d�TAي��iבɘ�k��|�k1��xtj`�Q�O�	�� �D2��s�iZ��6Ҙ�ۚD(�gK{��g'{����1b�|�d��"v���Kc/N���}D��t�$��#I$SQ���V�1n�D!<����:������h�LRS(���8�(�O"�=	���)�ٙ���/�|9�7���&0U�.�Q���P�h�a���3�������u�~�6n���Q��}�i���]��y��%"o�U�0�◿�@>�~�o�G����op�-�wZ���~>���O��Ji/ȓx#p��:��li϶��֞;
k���u�W�^F/��zYKo�қ���<�g-��@�՞=���5(�|��õ�õ�:��N>��˙es��|)7?��V��U�4��]xw�w�Y/����ڳ�=g�������k}��z9����՞=�9W��?��j�g ��h�>�.��D;����UUKE�����8ڳ�={ڳ�=��g����\�z˖޴��m�[z떟{ɍ��s����Yz�,�v3����܋^��w�ֻk�ݵ��ڲC?���r�]HJ��LI��G{�rov��ɽ��7O{�ruZ�:�\�V�N+W�U��Ͻ�ro��['�z�3��X��X��X�Y�Y�.Yz���ع9�ss`���́��?|�r��[��v�K�kV�Uo����w�&H#��UL�^4
�Z^��3��v1�)&����Bs�=[ӥYƀ�:ͤ��j�V���;3��nS��3�`��q��0u98���eߔD�����lS�qS�c�rmJrM]�MSe�'�W
�i<]�diO�x�U�-��'G=���SO�zj���z�'KV�F\�Iv�Si��f�'G=���SO�zj�'�So5�%l���W>x�-��*숇���-kn˚۲涬�-kn˚۲涬�-k�Ț;�掬�#k�Ț;�掬�#k�Ț;�fد��RO�zrԓ��<��'nA��\GW���x�X-W��+Vʭ��m�#�Q�-Y�%�d���Ւ�Z�^KVlɚm��c��qj��^�UL�����$���jv�Im�آe���BRN�SL��V1�-v����f1�/v�p���Z�T�2���
k)�ΧXKy��<N1�*�a�/���g�,�˽K=O1���')��ʽ;~'���R��R3Ttqf��w�ڻ��{'����m�J�3{���x��^��o�i�kY�wU���-��ɽۮ�{wZ~Ὕ{w��l�71g�ܛ��v���ɿ;V;�n�;ڻc*:KKC�[ϒ/`�^����޵�G��ʿ�v���/��;�|�����ο��y�Wx���w1zB
�K��45i�5�UΡx�:^�ݖ}�����B��v�ݓ[N��5Q��ܻ�:�w���*���VɜX%sb��D�.K�J>j���������[٣ֳ�քj�.�]�a;�a��ՠ�j���������[�c;{�hM�朒;%v�Z-���������챕=��%]qK���9z�6�n�[���juhE�����챕=j��hM�漒Ax��yu-��jg�N��f�^��g���Qu�/�_2�~�T���y��g���Z&-�V��=z٣�|�����n�J���w���f+�f��e�h�@['m�8AS�$*6\�ꔦz��~ij�4�]��)M��;H}ir�@���_�\>B�0���l?��d-�B�^H��s1?b)q)�Y.�u�)��K#��Kݵ�K}�q�O��o~b���<�r=��i���_0Cs-�T�MR�7{��0��q�>�������@C�n3l7��?I��f�ku�-Y&���iE���t'�����^��j���hr0���i���[�$���f��
�c����w|�ڀl�����v�m�#/(V�d4]�5��T�Ez��-'���@9 �"ǃ$׳��q��>?0Gm֗Ux-��~���-���Շ�-;��VEdz���t�Qhu�^'
,߃Nح���!���V�XE�H �����m�z����Q(�	=���u&�4����n�`F`~�~�(h9�be��N��,LD�����C��q�!,y��Ni7~��>
�����m�m�mϏ�׶��
U�ucІ�j6{n�����y�
����vG��l�K%-׶`K
�N��z�N��i��^Ԅ]]����XvN���v����o�
}����nXp8�fǁ#e�β=�5h�]'蹝�j�(]�
�$�V��r���w�A�Z��s��VY7��� ���xa�s#�
����Pm���(�F��p�|���i:Q���w���le�hz�P�M�^a?�y���ޠ��be��m;�?xa`5{� `F-�G����-
��c���a:��R�v��=�+VQ֍�ߊZ~���Z����7������7�v9�p���������Zp�]�o�Z}w�o��U�u#�Z�V�5C�
��v��m8'�綡Z��Ny7�~Ԇ��J}?8A�o�{�7�\a�*ʺ��"��C�n�A�!��@B7@ً^�o�u#�\�w�������G=���iu:^���nt~��� �#ˎ��:V�߂�>�MM0�v�1M��p3 �dͭvvG�Ǧ`�acp�&�I���"xo4�-�g�I�Њ����i4Iv�#a��a7��^;���\:p+p��jnn�ܱ���
{���E�-/j��
w/��U����e��
�m�:��^`�Q�շ��ؾ ��Ҳ��v�o{�V�
�a0���N5��R�;a�"�h@�r��&��۴��^���Y͕�J5�b�aK�C�����qa���~x>A4�Z�@c+�T-Z�E۵:M�C�k��+�[M�\pY�v�P��E[��DQ�����zp	��Y�6���f�Q-��}���8���O�X�k���EW�{�pӍ"��
ܞ�t����@�Oբ�Z�Z�]�}��A�U��51����}���Z�U�V��T��H9?��p�;�H���8�O�b+�9�.�^g•
� Kn��{�˧j��Z�~ԉ,@VM����m8�A�0�O�b'kя���\0�6`%m����0��?ȀN+�0��>������,�B �~�i��40�|sFp��`�l��"�iu��[�':���V���}˖,7��'5I��9|��z�1��3�LEF脏��*]i!�����*r��G�#Z�HK��/��I�#��5��S"�"��C�Q��{��|h�8���,HC�:4�ST^�Ӛ�"�p�ZA��g��.�Z�)ċ�#�Ź$�jF+xY��3�j{
�9S$��$+i7��LR�����c�z�LX+��I%��Yk��$Zj�}Nj�t��ڄL֒6��GȀ�箾���(��)�m6����&nk0w�J�����I;G���4o�;�P��z�@�ES�e�O{����A��Pv���=��N��UO��O��~
�b���F;g�(�sl�����Ð�C�!�́2E�d��>��7\��^�Ǿ���a	3�*iN�F�Ɔ�-ڵ>�9zd�\�HVk�&(].=Uj�G'�)�+;��D8������
���p�c?d<�Ȏ�tGN�	s˳zM!���	�߳���=���Q� �`r�1%�Y��Ҝb��~��Ր��νpky"��Aǂ��(��p��~�t\�d4�n�ܐ�ңyU�S�y�
����p����+�o��!���t��
�y���U���A�A�lNaX8�-3op��=v�Y�(ȑ�[�@�y��w��\:\�A�v�W��W��ĖRl!��4~�{����c-��dB� B�v�w��_����L�{5ɜd�ķ�K"op�[Y�li6Q�;pOݖ�4�מŽ�7�N�K��%�\��ֻ&s
��\��Q��+�*�}QR��r�`����
�7���p��ke�4,��^���wEmz�yO�D/����S�u��  ko�U����3nm@2BӴP��*(�њ$y��鏍�$���0�������
��%���&�4�L�
�$�n���G��WO����pZ�h�{\�Z����E�Ȝ^�I୶�@+}sn����f�(�c�SLDƦ�"鮢|�{e��EL�j���a�M�
�n��:|�jκ�'��!��v��gq/�u���h�8v���j]t�G���ӺT��<��g�
���<�v��
��2J�ޤ���E��
/~�g�gq�����%�J��X�D)�%�gq/�`"KZ+�р�L	�a���\�Q~>}��m
\\�R��j�U`����n��
��}BCRt�m��k�MB��9��~����⍕� W"���R�j�+F\���=�7��
	͓����!2��\��[�0ڼ{�1�58yWD7�Ü�Q�:]��Sw�&sT�=1��=�ƃu����:Lc�\e­@ڱ�R@I�P�g�w��'�3�_����5P2�����nn�M�K�����_����]���e!��e��E(̴N��Wp*W}�>�õ`����P�PDȽ�_;�16�
IU
Sܹ��Z�����}-���]SYM�X|�Cn[l�mxu�kfy��N�\�m0�X�çN��9z'O�4�&��\��ς��
4�c-V*Sg�}�5J.�@��9�	��A�B��P"95��D��oK�GX9

qSo���C <��2�~\aϘ�T5�R�0V��ҺӶ��a�h^�!�'�mdp鼭�>����D>�r�|�Ֆb�gl���F,�i�u}���ؑ2#���]�B6�n�������a�_��_G�5��-Y��������,J�5�ɱ�4j�M�s�	�k���(
y����o8%���T�ߖ����Wo��+�`)+�cN�/�V�	��Ȑ����6`
n�g��(Pӷ��(>����2$Ǥ��A_z�GL�D:ͯU�'س��3
7�H��֔Y���9z��n�'X��T��k���ɮ,�X�ӡ@�b��|��#�b��!*z*�;�c�j}|��k,8�G�ۨxuT"D��*��Q�n���z���#o	?:c�F��T��OF2H�zZd���n�.�Ɖ������G������Q�'C�@''�]g��^)�8���B��h�p���=�>���_�P���B<W$��,��S۵%[��տ��E�r4��!e�A"�����U����"^h��P������I�xɏ�ҟ��Ǯ�'J�+��&��2R�!�-gwLYK���U��ӄb�a3!��!ʿ�Zdl]��EU�&���Z�a�~=}�{����ij��i���4E>��
�'��3@�E`��t�s��9hw$�_{3���=|��V��Ż���S��Ɏ)ʓ���w�g'��5�޾J,7�7��'�`	�ld�2�C�J���cp��|�$�nY�#�!��7e�8H�b�H��X��N3�}Sy�	{*oYc��	J�37w��dx�w��߰�P��`�g�]׌�ٽ�(��w]�|Vޔl6h�%��@Y��2'Ok���r�'�Sy�9��œ�ͫ3�>+OJw�Ο�����O����9W��-�N:l�iM_���=%0T �[w�4 �(�/(��2o����=%pm�r�<���Yl!�Gr�N7��߰��2�DxPT�mQ�ڣH[��<�'�)��:"wf���P)�B"7#EC� >i��h�AJ�v�x?Rql�)��4����f	0���B����W�s�3��J�{�>Ҋs�u��C�r
�2f�P��|q:JS����������9ɞv*�䙸��%nw;Y�D�Q�rZ�;�}�)�>�h��_/ϾA<w
�0qL.ef���L5U������2�eAݮ��B��$�]V�[�B��U�80��$��U��g�B,���|̃�|�Ŗ��/2��=[���B<W�k�P?!���3P��F=���C�znB~P�y?�9U�91{����w<�ܔҮ�hZ�Ge�?g��1?��a,����lxT��r�����~
�{"nv��+'�\�b���ͅ�׫8o/��`�b!+q#��P��)���c_Ѕ�F�a%�$�#-z��L���h�� S_����]� Q,�By�G���hM����yjrg�������ہxBs7�w��
�_�}r�_���k�o/�[c�j6c�����`w��#��F��%Y��Ez&���P=x����W��]͞�t1��;K_6�����8���k��G���侓��U@��4-����1e��04y2�1�G��N��ao��4�ʨȋWk
;�gq�6?T<~��#���XD�-�'�	�̯�C�E<���Jm��k������+�17����~o�N�)���J��lЂ�h�i�Pv�~�9J� �Kev�8�����H>�x��n��%�
��\�0�>��:5
E�})^-^o_�F3��!�����ԥ̙�h�X����-�;?��&_U��4�d�f������J}譞;|I��Kt��?	�+��8�����k�B..�)*���M���j%��<SQc�����v�D75�+�1�%xG�N,k��C�K�Š����f�zE<Z�ۨ,f+YJ-�����9��0�[��\%X��lj��'��F!F�\O-7y���q:�3M��X
�!_��ow��^�y���Ag��MAAۤk렡��}y�xqN��=�>�D7�P��Q�+�:��6�)���f�<���׾�E</(�I�n��R�5��J-ZsY|ȧ�IP�ʴAr[��U���+�Xw��p��Qਐ��ں��N��!��\�U�C��\:v��	�M�jj_��{�x��v����5�e&�m;��w�_��b�)�2J���[�}�u��*��jx����@�zc2Ƞ���M1��x�\���k���EflP戀�}����X�kqd��7�I�:��(&u�v�7��xl�̍�JI�d�-�J4���Ӻ�"��\i��5�y��h��#�se��y��"^4���57�*y�F�5斚VLG�A<��Z�k[�Z���<N��јw� _�Hq��%��	QU8�V���a^�V��J���d)4U�R��=&g{��P��$!V�V��LHG�bi68W����چ{����[s�t&�к;cyE<Τ[h)���W����(��q����+����Cd�;�=�ux�����6�x��> X��L�yLZ+�k^xȻF���Z���8�c���TH~/�FLΞB��c�(�&�V�
��3�nߐ���"�95ReY4$�� ?*�(+2%��Mh����X�����ؕ�.?�M7�+���r��5��M(�W=�Lw�+��Mn����T�����;��M��x�]�/9�Sd�|-�"q�-��M�}E<O�-m�:�9�t�W�kJ��:o:�Wċ�V��@�c$dt^�t��y�
^/�cdA�	��/�ZS7���9o�쳼"^�'�e�]�W�1^��>�+��k����X|�7dOj��zl(��_�"^�.zckq���M@8�#��Rz,_�'��4����ᒵ�B��vwg���������1���i�67CF�K�T���ǵs�;�����y���\2���`��h
�
��r[qYJg)eLƦ�B���,��<��5�~͹�ݠ$�ŜN"��C3�°�3�7�GTf+��霾�s�����A�'�&��P��^/�#u5����Ŧє&æ�/�|�x�\�}���ڕ�Zr��Ojm��9�D���g���D��թ�\dB.��\6�L���� �ꨓڱ�R��H�kܼxE�	sm&,K�Jc!OZ��m�
�3�O�;�7�ŁW,ZА.X:NzX�P(�u_R��u��#*����s����d��f��Z�teAJ��񲡝�)��d�����(��x��.fJF
��ջ����ۥY���|�
	Ycjm�-���P\�u\�N^�K���gɥ�n���<|E���̷@s3�&K8��{�-PJ���t�K�d�;X��r�.6>C��́��v�Vn��`�C'VH+��*��C�c�uX5H��9|:�2�Dn~8�Bfbt]�>�5L�М�#sҰ�j�j���������Z7��G�#.��i�kE�����/�[�Z��wd�7��Ɔ�́�x�7��Vyzȼ^��.�'���\�W�gн��
�
��fe�"��|Y������o�_z�J��1��yB�9%�TD'�;
���=^j$�n�	u�>�cT
&I{NWC�7ا�a7��������<t
���K௰[��h`|n�]f�	�qo�  ���v{A��ݼ$�0٩�3��D���!��i?����2k�Y(�����}�ڜ���7ا���y4�|!�,yC._���W��K"��
p�<�X�tk�S����4����X�IE�B���i��t���G�WU�7�=0�P�Tnv�kέ�Zt�Q�Y�|��	����KL_4��T�V�� 7T������ϛ���V�k1D+�G;�������n�����&ӎx���
2�꾈��g�1�4�{���_ޡ���@[���<8��#~2�\m���-t_0�֒��m!!(�_�2M�;�x���oԯ�I
_MP{㡩�Y����H�Oſ�n�4��	b�E;�X�̒-L��x�I���,��C�4�����z���v�Iw��|s�Wwlj��5��r��r����BR�Z���&�ma������r��ЭŖ�s���uV���1; ��.���}�=T�z���Ji��ek%��f�{��S�O�i��gA�u�����.���\X ��(X�Y�m2�Ț��^vv�����
���
R���!�jhd���Mk->c�+<��,+�XI�
$���X	��#�^�L��hsD���u����,�YJ�A3���x��3�%���Ϡ{S��
zFh���oڂ�z�>�޶|�GN[�q�Q9�q":)~u�&�o��_i�7��4V	��T�-��v��6G�B	��j�T��o
��ϟhW���cy�Q"�04���,
�roo����c/��җ��k�~�/~��.�@�Z�k8�œ�9Z��%�B���~9g`�'��z�@w�Q�=�3�u����~���T�XЛp&g�r��S�Ã���^'�L�r�S�a-�P��,��]�sn:��v?�� m.,�P9��!�7�'z��{�C�'~�6X�m�F‹�Ga����n�M��Î�4�T�o�_L]"���x�|��lG��`s���O���.ȑ4#
]��&3m�4V�|_���%ù��R��hdM�
�<-_�,��>�ڈ�VHl:i���T�*����j_OUzL��ʎE����q%���4�ſ��xkފ���'��v:�K���ro�7؝ac� $b��\H�4W�ќ5в�7_�`w�mx�m%r"`ִ$��aZ:��n�w^2ۂj�)�|Ë�)�~ϑ���QغW�U��s�RAE��$��/���3m�$��*?5��ʦ'���A���V~������r�"DT�Y��O��o?��l�@㰖�-T䄙�0dE��Bܺ�>h�CR�*8)+
,[��o���[!N����.��fO�z�k�P|x2��R�hD�x�{g�,�G�軳��:���J�u�R�ǃ���#�?-l6�v�@sp����}�l��q�ܥ�\�,�p�!<�n��R!/�]�����5���R�n�T�-��a�d�����6{r�ϫN�h�"�ӿ�����	��,�#�����2g�\~�
�ɭ�Y�ѥ��^�A1E�i:�I���
�)Η��d�i5�P�e�ge�M1�v��C���:[c���ʪ��r�����u�]ӈ?eS�eB�Q8r�랠�*�2���r��n1��!q�)���F,��F��<Dx~��5��t�"�D�VGB�C\P1B�,���VVC8�{ԍQ�!�:fFb�M�`�z�'��P@�cC��Hd����i�E�c��6e��@�(��``;�v�7O��3�qo3U���O�ۓ�T��>�~E��G�AH���R��5�lηp(��ݪ�����VgmTG�>�>6��r(��}?�.ޙM�K�C�
1ikܦ�_���q;#�_n.F<^Y��� �t��랡.�Z�>�ZF'��s�q��:B��gx�ӓD��iky��M@�3�H�w�HKݪw�6���^��)6ߠ�eCƏ��-��kp'��#��)�tr������P$$�����UeL�>����7�TDlefl��9�Ep���/��|D܈,�]��/	B~���厕��`�c+g+��ț�qqI��B�d�������?|�q��bi��SяR��.�v�X��y(5-�L�4�,��%��P�ػg�>�G��4!��c�x��Ҽܽ�q��	kE�W�@1(����:�X���-r�u돱���)�5B��O-�'W�<�4$^�q>	�O�����=�=�4��z�q�>�>!�	��ڻgb���s���ڢ+�@�>i��cϸ�9�W�Λ�ES�����/}�-��?a$��4źҹh���7��[�[�T2M���2���"���鲳�Ľ{ƹٽΪ#%YӐj)֙j��Qߺg*D�!��!ӅI�pJ�w�,�u�T]��w(�C�y�H(��Y�Ǟq럛���-Wv�eG�j#��º�o�qk�}hp0��ם@T��/)�JW{�Lt��#c�hp�w�+J��k�d������s�Z|<g���f�oz��r�V�+6$��
��F�Kt��׼Y��{�f%��TB��⦓5�	R/wz}D�\����%�+�iu�P�j���ˆ��{�2߲@ta{[2nn�E��X4����e$���f��<���z�r�V���n�8�j�z3��"n�Dyf_5�7��I�2A�v���1n�ѳ��xW0<g��J�S!Gj�[���5T�� x�H
.·h�Qr/��N!n�"���
���i���ȁ	+�!r�*�"n&0�g: �!��G�
���-�f�|E�O�w�Q�)P���U��ם�?"n�#���Q��rA����
�:�N!��:�*�w^�QV	�x7��x7m��[a�,��Uy���ru�c�m�{(�'��JX�F�d��eKQ����]�����z~6oxf/%��_�$�"n^W�_��Gr�5@��R�7�֡���:�u�@�--zjxp��%	��
:��"
��tb��"�d͙r9��0g™�)d(��Y�0�vJ����Wܯ��+���;t��4ĶG�f=���(����2�
�jv��@g��Gt��?a.�:���橬I�M�TWM������J�a}��"IML[�>�
�hHy
q�u��|ԉ�]%.Cp[�c���G�����N��)��(�Wě�DG\����i��[�T��YX��5��ՠu8���tᏈ[�nj�#=E:QwH��V�3�ٍ�>���k��Q��<��l�h1P-�����W���)$$$�h�Բ���WM�"���V2h
<�–OS9T���'[w(#?Y�{s��u�P��as���(���W��z'�b����0�YCUUcM�y��w�񃮫�8u0%�W),��x�X��{y�����"�,zd���P���!?��D�t3���ܕ��skA]%��i����z��Q�@�|S����
o�1m���"��M>�r�v�>�iŞ���(cy�e�s/v�v���<�e:��rq�52�H�n&y�5.��iDZ�@_�F(�4�d��ϐ?Q�#N�>�
�
�R�W\��7/��@���-byM��Z|Z{����5{�(eE��A@��JK/Q��|�7s����ь)�����x���c�r�.�K(�
�r]���GB́�t���k�U�/���c���#��6�2�L��s^��˃>C�D<��v��λߖ�����Bͺ��(o ��鬧)�d��tzt������L�r�sS�˥��Ճ=�As&�m[+?��[��Iq��,��	�`%�>ܗ��?C�������N�^)��|�j;�w������(��]�/`о���
�f3CGA$�8����{�+�id�T\ߵ���N�^���U�� �~r{>EN-O�� >y3�X%�;����o ���
->7@�U�E��H!�y8�rY;�&(/��]K�,w�[��y�S	3?,�Pb��H�%xbNs���a�K���Âu�9t�.��k4�w#y8
�܆GH�4^'2IH����E8
�X�}�|��qR���h�HY�2us�Ԋ�5_��*݉�e�q䈙���=}�u���9tt�њ�d�Z�r�e�]��Pq!c��)�6%�XH�����? ?Ⱦ�"V���+6)�C���[Ζ�L@��/������j>��B��*�&l��@���[�k�� �x
�� %��J�����o��&O����f�Ŋ��iw%���1�2vC_)��9�5b��~U��m������a�R-Lsb^Wiw��{�݋i��� �b'1��̜���Q�ݺǗ�w��F�Ͼ�&�ഒ�e?��o��d{m }�9�}́��8�����ONPyx�����EŠ��z������J$J��;Ǣ�[�
���r��'ܽ{��(Y��+Č06^E 	a�݅l�-en[�TP�'M^j_�1l^e�q�Z����v�;���<E]����������T��Օ����b�2?��`��L�W��M,.�E���V��-�<�oY}b��n�t#JԦ��US��
U����I���7�Td����2�r��=�4�G��j��E^B&��a�~�y�=����qq3���_���r:a�&�PC����k{o��~�v���6�[�yx��1$��뤨|T�:X胗���T�.ha��+�w����́��'��_���U���r8�!(���^.�N��Ns��D�
�U��z���e���R�_q���2 Q���.Wֽ�a4Dh]��+�'؃ŅMV@��(���x��{q�t�r�����0���_ԑ�kw9f��!��jR�]��t�v���2�����r���|�������C��Jw_�)?	�>��DP�b��5�D������m
I��K��p�9
��KXv���c�����c�zo4��F��蔅��3t�;_0'��T�h@Q�G���-���_��!�z����
��0-�]9�xH���i�q�����E����M�j]���Wv�;�W�t�W�d{�nQG�b�&�s���%�8�Ũ���e
C��YZ��eg�k���fQ��@���997g�<�eWc�� ��
65B��}�R_l6�����w9�%Ư��BT��b��x*VP!1�f�9��V�����0T!��;�)i��H~yI�Aڧ��.�=��c\Yu4Ǐ��J_������q��;�h���V	B�Vg�j��
w>H�]�ҽ�a�Q�9�O0x�����
9$��m�GU�#�2b!�<8�h�k�=�]M=���$�Rw'��,߲��?�S��?�%X���yK�G�#�܍M��s��G�(�ױ�U��
����9B�~��� �]�}Ğ�%wrZ�Z�X_m.�0���3�lW���^W3|�[>���0݇��k؇}s�[���0�sD�4J�<*����fdz:iIԢ! LJ�>�JP�];�p�r\e���I�&�#g�u�ű�̺O�R�o�m��$Q�qM�ȕ����A������'G$A�]l�3d�H��S�:^�c�I5-Q�6/.�`������.qy
�3v���q���d�F�m
!6L��_���畨8W��4��hj�MҚ�z�.������k�\�š�ICk�dճ��,O�����{�t݂��N…��cL�qy��#��ݤ@��j?e���k��Iu}'�3�Tp�b����EWo� C�Nd9�N�4|�o���5C=�9�V��вs�#�\xNЦ�������T��z��=}��6��R��Q
�L=؂����3�D���"%��� W�����?8����o7Hp�|�R@�B�- ����}�Ŭ
��V��I��:Z�X����}�=�ރ���P���k�2�sK����#�\~/	;%���Wg���K6'�f����=��Kd�M+�ٹV� �^=��rs�3�T	�S#��� o�Z�7�\�yĞ�AU+_�t���ʀB�I[�l��*8Ǟ$.TO/5;�̈$1����EH��-ÞK�8r�+�I�t[<�Z��8����=��{MƳ�d-wq@4)�$���l���{Պ�P�Nw�ͭ��p�Ȃ#C�
;�4�.���k z���Q�@x3��%�{���ZO�<����	��j؞�Z�jc[1+G��.�JP��|ڹ��e�<����	8_�D5�P�qyݹ��S�ȡ�U/�jݸ:�����<zt�}�"�1*�<�GN�j֮�5q���
{
Z�s���P��݀˙��]&i���MJ�	g	��XP��ꉭ�<�w;I;F8n����W��Ǟ��_�B����,��+�T���
��Ӯ��$t;�'�]{����H�xv��bY���������H8��6Z�n!�nQY�8�:�]Koagڡ�ϔ�{��Ό��M�HG�ٸ< y;_^�lL��[<kv�#H����T��;�3]�¦�R}���|ooa?Å
8M<T#b��%~��-����Ok��J{�n�����:B4X]�����na��L�M�-~ao:�ԓ�cy��=�䭜A��aHV��kO�K�Ȳ��ag��$�n���)���QO�����B�C�+�ѝ�� ���zi��\!~2G�lJ��^�B��N�)�J/]�9ɑ����@�
"�p���ǣ���̷?�BAvH��iHi�i�N-�ŃS��8���j�tf��H���`����.���π+�6=E�Q[r�C�c5yy,�q*"4�^-,�.��4�%5��j�e�u�8\����3���o��:���Y�q�uP���-;W$�^GՎ ��&s�8��\�)Ղ�F�T�η��ͭ �?�c�J`��Z�3y8�l�H�M���xn���=z<��C�{�Ѕ��n>�h-������C�����n>t7���w�;ǐ=|��1d:"��Cw%{��q7:"��Cw>,{�Н�>tD�͇������x�>�8��=���C�!����H�>t
��]���C�������>t7����
���Cw3?{��q7�2�Ç�����q7����Ç�ƨ��#�n>tD�LJ�������꼐�E��gɖb4մX{1����,o^�D�ƴ�\��8c��5-��L�-��:�j�D�(E��b%�/���q97_!N�B�iF@�j�yXcA��71*
y�?�*�H�r��l
Q����j��}
q�ݧ֒v�Z%�޹�g�˳`��S�׉ߠ�\�jBֵ�\MNzf_{�i#wo�����E��ѝ˒
8�z����
�u�xN�7a��Qԫe���u,7�^!~���kA=w��D�0�t�������{�`��<R�N��(÷.`"	Z�g���r��إ���nݨ.f:��<�k��љ�0�vt�>Q�Y�[jL�1��+��z���d�k�z�$m�5�8F�i�A�#���B�K�i�6�P�겵��{k�)�B..S�+�y�~s`Rx�
���6�^����+�i���
��z�e��$�o!N�NR��KN�GOn���$˃���S��f��7�[��T�˂�Up��:E�B�g�� ً7�8_�k�TY��$�9�|<\kt?�����{CC
�qz)�̻�.�U��ȕq�E�D���V�:���"��{9��Q�j�����ֈK��A-2�EU
�3�#�tϒ�e�s�8m�O�u�"�P�%��\ʃu��_�¼D��u0�/T�;���zSr�вG�%�gh�t������8>�X�RP[�w�lگsG��E��_�=�mݽ$楋.�F)Q(��|O5I>�h��c}.�
qZ^�YM���G����+v�x��r�x�r1KE�ѵm&S�i�ч�$�@�OI6L�P��w{��w��w{��
ww��w��
ww��
ww������}���}���}���}���}���}���}���}��_�>��]�>��]�>���`O�~�#����H��^�8�Ŝ�v��8_��#��G���Α.p�s��������t�ƽ�rR��}��s�������!�s����M������̀n�fG�������!?C���lj�y1N}�}A%J�d�8����Y���O���z�Qp)�]^G|
f!$���r�Np3q)�F����M���޻��M�����!����BvIw� �$^CJi8����K���O��;�}iHU����vXgƒ�Ǘ�!O���?����Oq�۟����۹�)�p����w;���8�r;�>Bn��G�����c!�s�#�v�}��α��&x�����ۙ�r;<BN�
� QF���X�z���\�5���g���������]
a�,S��Ϋ��+9J�Y}M|2b���!��7)�AҲ�ZPP@	"S��@V��=�FY7���1^���jz
�_���j�~�v(�/O���sS3<>�~QoK��{����ތXG!��Ɖ�y��H��q|�U��ɳA�cɖ���m ��β�S��E�ད������G4�U�((��h�<�@�W�;G}AK��U�ʎ��a���xZ�[���|	\�h/����5�i��c���gLh�șcf�p��j7����y��M,��;�Ҩ-5q�/��$mm�Y���n�|1�@�=t�_��Q�nr� �5���Z�`��Y^~��˥v��oR�.�ڻ|��ݽ�O���pqb7�l7�bG�����x�֋��ȸd�4�@�	*�w��
/�k��U���ܺ�7N�JӤ�ep�_�'ecB�-�\ma��J�6��2���j6J#Dh�g.е%�]��0��{R�N@��j��p��p�ޢ_��������h\�>��|
.����/�y��XcO�V�G����ٌȑV$7�g7Ř3~[�tӳ^Z�>%��]^�y�9M@XO�>��ШQgh�5cu�k(���Yښ�S��H�=�hqj���6��v嗘_��"�эp9��xW� �y�<�s^�[� jKrx�����,/ϳ|��5щ>��ȟ|��!�k���}`��o��/
%��}�X:r�i�l��g'�U�'�Y��R�C��&�<;|�؜�����'�5�"Z�K�F,���}/.�AO:Em�+�W�N ��U�V��-Fw=)
��ٌ�S���������%�	z�*��S�qRb��]| ��W��<BOj�$
�pRg���/�)̒j��Xr=�ލ؆_W��p�.um��y��Z�y����Qz&�\�P�6Ru�g�T�=U�!Cc��H���6�l��I�gj	Ef{B�4x윑5A�[DE�[�ݒup����j	&W�B^4�+�̈́��g�RW�+�޺+Ef[����c|�j�hQ��*��	2|�\=�Lqo?��^|9��X�d�˔8��|B�Z�<�/Fmu�S�S'��q`u����г�lLtKT�*ޒ�] ZAs~z�0����
�̪�GM�����.�G�IňN�� S9��B0�*H�-"Ƚ=��H�th+Z�!��!�:"k�c٠�����Y��,WrU9%�0I���>%����Y�V���A�AIJ<u�lͪ�R�CX���߿N�y�x�p��H�Y�C�@)�}�Wԣ�3oh�x��0Ty�҅m֯�J��z��R0��^ݹ��W(��uj�ѐOE�\I,�E�;B�}Բbu����<Qe˱�����������ET�oi�Mմ��էƂT�k�V��OR�U���4�c�h+��8J�2Z]�~5"��>5�G}1�=�S&N|G��Ջ���4Y�;'j��Q�v�{�3�zɷЇ��	s�Z�#�W�3oGHLPV�C�ك�o�!�aZ��PM`��>8]��@��`��H�"�pakY��UI�c]�Z��c���~�UȘ'��X���u����ka�
��@�!(���P��h���|ԯ��K�l�2�,�}n���Yy��)/�q��$c�8'��z2�9��U���P��Y�37uk�[��s�Th�r�Qש�,�7�8�'�o�Ē����V�3A��
`H�E؎�"׌��z9���H��l:�KUG|����}�N��k��{hP�F�s�K�
�y���>S�먭%���}q�<�(���͑�&����Cˬv�Z�hB��Y����f�3-PR�<�y�^�&��tQ���!B��"B0-i:��IǸ��`�f��V�3%��
�19�Q�]&ˬ#q�O���8?=W{���P��d��44���*�}
|��G��d������m�e�Ey	�ŭ�g2`S^9�4h-5���!b���&�~�
��[3\��f�1ejx+~2�m�{��D@Lm�u�T8S��*Ǔ����#
�'��&��g��"�1�Z���L@�C=T^&�H�jK59���_0on��c=��q�:�]�q�q��zNL.u
�y���
��"D��o1/0�l�b���D0߶2�bj��)e�wu��t;�!<L���L�=��It�ٞ�?�'C��²6������>��O`m����Z�=�fl�\`Wk�?�O���	���q�������\�5��O��^����l�H�t7��c����sj��
�(pL;����d����7�1䩱���,��x��\����)�i��U��Q�uC�E��ڟt�០�k�N�Ე�@O�M���O�2!@�F��#:�®�q�:�o���N�"�+�l�[�Ț&&��6�[��$�?<f���Q ��̽ʊYj�H�}�0��S䄫�z|c��\�%.�H��r|xQħ��$�>�����9��m��%��rL��y ڄ�!LR.�|�h3�{N��䫧�4
J� �K{|xQ� Xsu�1X�A*c�+��$�e����¨�"C�.lB/6�YsK�u��'�'./v
˞j/�2�Ӷ4�����*��T��Ҵ��U�ݲp��뾷���^�5>�Uˠf�l#v���7~���^ͨ�\L��Q�	?�X��G��ȫ����	�̳Nݐ���9�n_o��轋񝈑	�*�@�#v��ٽ5ۍ�i�5��)�1!��@d��{C�߉z����S�y�o5Ɍ���h1w�o4�gG�)(8�=�f�Ḳ�{����ܢb�u/�z���NC��Qf��4���Vs��Nã�b-��c����Ͽ�9x���'�����]O�U���o��E��9P,1�0Y��.�s�Z���ϭ
�s�����ϳt�
��j��3�D����5H����=�l��b!Xټ\l��'�i�k��k���Esi�ք4�Sf忨��4�&�XڎZH��*�O�q�1ȟ[l��GҎ���V��YYmV#_z'�L�%��)|���xd�R�J-��Tn����1�y�Y$��7)�Bڍ.�ܸ@17�E�w�OW5DЉ����J����|P�G7ܲ�m�(S�)�m��y��ʸ���ԡ��
�1Eh��������e�,!ߓ�5h��p�z�K���U ��R������0�|����0�Z��z�a-'j�"�4]z��}��mYm�i�PB�V_�j�܉zd�J�
�$�!�I�ȩ�2�6�{m��%Ψ���)��b�嘣��.��� ��H����<�RR���=�x6���=O�h�C\�2g��ϣՈz����+��O�$(�"��%�A�D�rg�974��ufxb&J˕j�E	A��o�O[FM�A��y�!'�1���Ԙa7��sS�$`�)�c�k$$��`�Mo���p�1j��ꚳV8Ej�O�_�P����!@]f��1NeI��"܉�ss�.��5�]m�O}lJ�|�s�b�*��c��8�I�>3�������R
�N��;��X�P��f�g�"���MR#)K�H'�E���;�����`����w�U�A�r�[��CJE�m���+2�
<�9X%��a�s�"��X���M��.-��d������
|���h]]=Z�&18�_���xƈ��B%Ɛ&�l�;�d��^�}��3F��P��N4skw�`g3E����g���F;R�l�$�;�j�S�zG�g��j�,3�37\��� �m�+]�o�ϡ�Q�Q:�T6�R����4b>!��m����1E�YJ���^�6m�rs����Ix�> ����y�e/��J0������|Aɐ��p���Cr/H���$�k����
qL��{�%��Y�Z�4����桭^f�#k�ez��x4�Y��|�!�4�;#�$|�V�ñ1�T���i����:M�Ω
���c(��F_<�T7ܫR���o���hբ����_�Ԥ�>r��)�u�摶�}�Q��oE=Xh�]�C��*���1&��I_����x2j���
u�4p��	T�{(�;Q�WPɈ����)ty�687N#��}=-����%�9h����+�B�\�_>����^����*u�>�~�׋�>h��-\��>r� =�:����9'��������AaJc�j#[���'_��(WE@lЎ�����hW��;�}d�ݣ'���m�H1�x�!6^o��jGʈ)�
��Fu�}���D��M���g���0�e�4D� D�F��_��Y�=F�n�q�ˌL��`�W��k�'�Q&�M:H|,޲�a��J2_�ăb��TAa�c��fט����d�/h�@��7_x��G��8�h2���k�tX�D�����F*]�G�
�9�{�����aS�XܕU\chڔ�R/���\-B-z�E���C�K�O6���6�:��� ��v�+z����s�_����H���̝yh��!< �kq^`��Y�;�
+��ʎ]�2a�����XzA�sPf��t%1ë��ٕX�t�2=�v: �J���F�QlL�~*�'��;@�Q�4���pЀp�t��~�9�gL�*�e�o�Y�$���ӡa�Yj5�źb�O��׵��'������wQ�`�F̈��u��U����	�k��
6����G��fSVk�wC��N�ˣ�ok��xʜ8�*_���o��#���A)�n��N�2���|R���(�R�������d�a_ֆ2=��S��x0��)z�7D�^�-�A�t�O������\��.Q������A?M��1;Ki剟)A�$���������T��
_�Ǝ����u�>ފ.ט��~"]��Q��*�Y�
_�[�p�T.����>h�D]X�ea��%'瘌S� b����_@��ZJi���f�D�.�Jr��%���與E�,�$�sD��8'�\
����><����(�o�Zp�G|}8�KԳ�Nj�a���F��ۀM��2/��D=~O��;Ր���~*��뙞�o +���֣Z�wB�'*�r��[��i�*���!��K�$���S�����c)����̹v�;B����qy�;��i��d%�����a�R��$-4�m��i-�E.�I�>��T�[K��׍�ה�j÷*#7ˠ`�5ՑA�v���הmC��ʕ��bEmΎso1.�Nԟ�\s+u��
���hǰ%���/+���3Kj�rZ{�O{y"j8x)r���-�q�n#�=[�~�G���I�tծ��~q���(7��Z�{Z3�i���}�t��y��G�Z�� |�%Dp��pْ�����!!F�i
p;^���hD	ԫ����>�p�#�Re�(L�^����G�՝��~�U�>�ծ���cf���2Ѓ;Q��M`%^��{����8��Z���/Q�U�ˈ�B�^��h�j`Ӝv���D�I	p����QKcJ�˄^e���_�GNdI2�Q*=)<�jFZϗ%�K�c`g�\�#�x����;���hL���Q|��U�˼:�G��7iK.���gj�K��N+����mh�`�w�����i��TI���*4����y��aY����x��TD��=�4k��Z����k>��L�j����2�f�����_�Ћ�^5^�l&��\��s�|+��`a�i4#��=�=�ܠAx�/�&�D�q�Ib�C�)&�χX�n;�\�6X�D=������:���1�M5f)�����}�z�N[�j�%���U��a���kp������5�#�j�-^Rd2�4�&�^���D�9�����v��>4z�b��Ռ�Kԣ�Rƞ��	\d��o���nq�5;�F"���$����l8��~y�k/��&�z�Uvk����r����Y���|�=v9�<6S_�-��f�c��rf;q��0F��<d�?U=�7�$#.J�\)R*���v��a����ǁ�Js(�y���W��Y�����Q�UO鬽�)RK@V�i�\7�Q�U�eը�Ã1�e�V~k��\�gΎ�[�(�6Z��0b5�3@�0��2/Q�1\���o�3B�uEgV9����/لl!1$���%�%��1F�jN�/_�~Cb�m.�&�X�$CC���X�4^o�<��-�/[9�ֱ�d�^���g��^*�}X�D
	�V��d0��A���}X��?(�Rڨ��Z���[��z��c����?1����+����b\��Q����V�^f�T"GC��깖R�}X����Y�F�sq8�{��k֮�Q�(�(ϙ�ȍ.���"�� ˂�?<���~s�l�fcu^:���րv�>=}��(�8)_cZl�쬮�P�0�F_���[���!ֿ���V�ރ	�:@�[a��[#j��#��H���d�����(�
Ķ	��g����F�si����?`�a}SANS
���!�$R��2@�u��u�mVc�{��k"��YX�z��]��7�Ê��y�Ά�S��r��{D���A��2<D}^a����b�v9:�~C����W��V*�������r���舺iI���h�����T+8Ezy��/��[m��h��F�ȹʹ����#�7$�*Pxr�%���\��.Q�Kxޓ"�z-6�J��9v��O�>�/	17�M�n�0�#�?k���>�o.�Ľ)?�y.m)��8I+#<L���e^�(^de��\�B[����(Ѥ�������&���5#8��T��7Ui��^���`��门�%|��h�rZP��G*w;�֔�/Q�U4��Cɇ�8犀<;�zY��ox�GZ+������̓:u�~�H��0���k�l��Ѣ"�Aj��^�p8�n''���P�Q�́����S9��U�[������{�n��2i��j���Ϋw�M�{���M%��@ړА��rJl�̠�k�k��_�UٶD��)�V�%����vF��o=@�u4��ix�L\���CtΒ;�^Aw@�-@��+�6�%��R��{[�7nH�Yu�FU�;y(�XSq��qi�D�Qr�[�vQ?i3��t�dN�֪�K���9@�Oɽ�O��8
7碋8ǖ v�z9�u�N9-����#u�ށgM�#ݲ�#�7fAYBv��K'�����_�#�vM�V
s9/��_Rf���6��]�܏���[�J
m��I�K�W>�h�D�۲�SKPxj/��ca�t���΀G�o���u2L�N���b�p���+�#��ט����>NKbv����y�4�sJ�#φ��c��K�P_~^��#��Y2��}kHvt��I?�@u��m�8G����j�M�8>����Tz�k�y��3�.BP�t_�HHu��
���v�����5�ť�䲢��E��I������;��Gʑ���Ejd�C��2�#�6��*�p�.�pЙ%��*�(
F�u��O&�%RjM��3�����K�m�mo�m��s�i�{º��.�#�Vr��u��ӱV_��쑗6�^/?9�~Cb��R�`6�=�V��W4��Q�Y���t���4��>azt^��Q��c�҉ �*���+��XB
\��0��(�W��4hW�]���Z�\���|�_�	`��{��{���aY3-�舁����a�ܡ/�(��5�}sx4�^�[J�2�%w�����|�-FN�{�8H��6򈺅�K�
 h6��%���8ۜ��9�^ra�n�f
b��yG�b�y�A}D݆Q�J]�ݘl��Lj���@�|��-P�\��BF�G�q6.I*�-�Gԭi�y&F�k������>a��q}uD�J���ӑA�At蒆R"��u'�u/��:]�R.PΌ�e��A��Wy���;�h�P�
�c��"��.��%�Vr��A%kV���Q3�!����u_�u�9^ 1��܂d�g�6��i�#޷�Q�^��ۡm���Wcd&�F'�a��K�H�ئ_�h�;�8���N�\��n�S��&$��KL�Y~
pD0�r�����dH���v��@`�JX�C�׷�G����#����,�W���:�.@}��ۖ_��F�L�����z���g}�[p�Voz��
*=u[n�-o<��K�EW2p`�"�B�+7-ń���k/�����2K-cʲ�/uv_�=�n��Φ@<����C���I�����G�mmDlj
�lh9�<[��zt�㶬uD�K�H����!J�q�{	���>H�h�TPb�o ǺT���i/�k�nO�d�
Փ3�����'2��2����gO4!�����[���dx������H}��~������%�P�pl���A4�������%�F�����*�;38�8��1z藨[�N�ee����%��b��ze�u�,�.i�J��9
-��S�@P>��?��[jx�Q�?���$�KB�·'g/�#� 
q�e�t��9WJw#Uox�/Q7�MuTF�!+����B%}n��G�]up񜋌O�hf��AM��T��%w�����@t��>��:��b����^rO)����[k""b�b�׋�A�����n�����i~�X!d�)����Qr�=�]!�8�h��c;jN>܋�s�}��"8�޳5�{�ص��D���⽇�z���#�J�9cO7������[�[揨��a;E
�t��E{!���6s܇��v}+�t��	��O�S�g��g�U!l ����b�~H˛_������ ;m �j�
�nq��ӫ��u�%��ף)�b	M�P�M
��%�ʼn����4���1�`Y�w��/��M5�a7�i�����m��pԲ���u�	+/K��ض�#a>��X��A����T$��+��A3��*+��
���뀺YT�m�v��
߯c��ď|����k�O���r*MA-x
�m�kۤ#�v{�(�j̡;��2�y���Gzm�uD�#��E�%+=�,�p:
�Z�uA���:24H��\�a����.�v,:��c���`���>_�:�B�i���+��^�9'CDLx���7dX�h�����j�� ,}�e$q�w��˚�]�`Q�a���q*�2x*>���h����^��,�q����iv�H�ݘ�^�PQ��BI[XֆM��T�^�9|YP��I爺y��� ���z�Ш��5_� ���َ��(���Z��}�H�HwA[͖�<�{�?�l���>��M�r�
l�r��&G��r�+���,�i��Ո��<z@�ɄtQW�nA��)gI 2�ft���Y�wW{�!�b��1.��T���U�/Q����G?�>s�䚑Ʀ��u'�u�!�1b.��7�ć$D�Q�d��Q�Ғ�2�[÷� �bT�[מ�Խ<�H�#.?]aSN)��V�^�U�a�1��LC��I ����Z
�v����[�#��[�EkI�(ݦ�K��
>F����ff��(�W)�����>���G��
l���\.��\Y9�`I¸67?�nY�g� ��#�DP�Ć�~��>�7Jĕmv.Z��+RS�ŧ��Ҹ�z:�nQ���N���z%�6۵��u�ͱ�0zK�b�&m:��ړ��,Q����ܔҳ!��r�
L�$ ^�����Vǘ�e�bP�@:��
�l��uyp�B#�_��Y���O������pH{��p��٨�*�$���Lw�[:C��yg��c8/��T������{�tO�hd���SAD6Z��kۚ#�+���ʑf{�X7�����^�~C"mQ����-��]�Z�¯|K&��ߐh.䈓9������d���]�$Q�!1���,�A��|C97m���EVGԭ��0�,Kp�S�щϙ�J����
����A&��e0U*�{�jՒA�2�_�~C"�C��4����J���OAh�u���JC�&^�x��Yf�q'K&���y�$�cW��wJR?k<�i��fǔ����=���>d��c�B��y�a�G7E�������4�W�y���ȫ�eA������]ݘZ��U}�l�\�(�z{���ZRc>�0M���y%3�\b�xڇ���*�-��.����fxxh��<|גQ�F��)#�Lۿ�
�}��?�{3�K�,5ǹ���@Ȏ:D5�/��%�7$N�Ʀ�	�.^��еk,o�)�7$�5��E�}���i.�PE/���
��
]F$��j�g!>�kW�#�6\�l]�8-��j����<�����%�2���Z�\����
Y�m}]�I8�nQ³|-��Fc�L����t���8�73W����uc��ƌ"Q;wa$/�06����T���"BS�xZ/�7?�M{3�ԦFåU=-�uBf�)��∺�
�:��p������|"��%��FO4$�W.H��(g�[k��%N=�������A�Skq�wܮ��Qb���aHLԯ���o\�v�;w�]O`�f��J��V��B��n���\t��⽙��%`��Jpt�C��:�h������u%p��[UNB����Y����u�.67�bF7��^K�mx/��̜�:��Jh�%
��D�5�O��?�z�uĚ@���ZE�� 4��#�f����n@�у���i��ڠ��K�m�c��XJś7$X���\��2���̲�Oy�44X�
ے��X�%�f�]�Q����!��r?�Z=��2���̠.�L�à�iF�tOO_�×�u�<V+˅���΍��
k�j5\�DQ�f��B�����4i�2V��F�a�ۛ�}�����qG=��ru<^�C���?,;B7�|�ƃIp�Dxr�ffݴ@�Yy
�|�;w�O�'������WD�-}"Td�68���:��{33‚��?���lIqE��H�~XL�	�O�dY�z�]�[�un�Gj@tǍ:��{gƣ��VjQ}�
�;�Q���8��g�'N�)W3m��M���k+���]�R�qy�9�cɶ�16�ǧ����:wrJunqx����t�:_5�p��Z�ou�:���Ʈ=u=��$.+��BʏZ_�0ܵ�I��t1���F�,��
����\��a����j�{����!�������D�����Z�׋�K?j=��WRo�0��͚օ);'L��7�i�8íܼ��;xh�`[]���O;��T]�p���wU��j+F7��eֻ����}�zcR	)��{6æ�V��8e$
�eWϤ=�H
�l�u�|���8.�Eѭz*��A$T������Ԟ���%6���.<G���0��W���<���T�Z$��D׀z��׳�Z�Q���'u*0��
��F����trJW[U�Lc�mSMِ�cݺ]�Q��n��\�ۍ�����йZ��a��r��F��M�H��}Mu��>j=J߂�4��BŠ��(�[�\l�S}S둲�����.�h8-~����ښ��^��E4YL�#�բ�(�X@�������R4�NJ��=�+>�K��J�c��-�ۚ1��Md}�8�|S���c���ضl(Ç�"�9��6|r�lS��;M�a�j{O Dl�(�Z�z(��z�d|���^��f_��#���8��2�Lk�<st���W�����%��9�����;��a��V�_<9'���$(A=&�(X;�t�]�&4=9� �y?:pb��*���x�̯��YSV�68��b3a~h0
��ۏ�?i�
N9^�����،y�Vi�ߛٙ�?��ǚu�\#���@6k �
�7_�>k=Դ⮧I%�7�����EC�n���Z���vh�\�P�ZP�����]�{=�Y��B�k�vՈ���N&Ԛ�F�}�[N	 �>W|`��hi,%��Z�^�8�Pա���^�UՍ�ǻ�G���*9+m�Q5�6�Kǭ���9�[��z$x5H�
�4��8���2 �Q7/�?k=.廫ů�t��w��{2�1#͇�U~qJM�}�o�5�e�
t
K-��7oc~�K���5�*m��]�1`�����Ժ7����1<Nу�L�>����{�6>����R���H`d��%�n#��Z���ɐ�Ԣ��I�i�S���"�Z�ԍ^����5��F@�Qe`�v��z�Ħ����r��2��I��.���p�.eMVm>��s+g7������&=}�zV�㋂���o��@sg��t�V��֗K�m�hȝ�����S����K|+�[D��_`^����ު�̸���Y���
t���AaG��iG�^��_���%�:��,����e���a��ǻOj�r^U��aCfO�T�=�4�J�7�(>k=;L��b����6��N��i��K��Z�k���	{T�=��jq�>J�����?k=��}��K���� (K��C��魁��ٶ��U�,:�ѽ�Ղ��n��g��Kj8�B4�ya���b��Ƒ��(1�Lҍ�_(xj�kM�����K��Z�k6�	����Mm֭D�cB�������g��N���F��T�}G���C��5��;��ԍe���f�6	�8�_����Z/
���%��D��ZB��8���g��+�v^6�ډ4�V��)(�n���H�X3Vӣ�F�{�,z���|�z��u6���c�RQ�����<�7��Z�����&D?+�g�����80Mw��z4�J}�Ak����h�8��Z��K�a��i����(�6QτRU/��o=�tUP�N�c���cW8�pw��N�L�>ܣ��oav߃/5{��ox�Œ0t��'�- ��]v:N��]�>9���i!U�h�鉦���1~3ԝ�rԨ��3X�&�m����L�|��Y�p�6cq������f~����d|$�*�I/�Ce=P���$�Ű~�O6�[�ކ4�!��� _M^�
�E7q�O�k`�w��C�2�}�UI�m}u�O�Qf�᝵���T��:��/���}R����8�*�p8e�ؚ�/�����ivQɜҬ��b�qk6��_$:��ɖ��V���jB����5@���z�G��>�cI	�zu��:M��{�/���}2��Zۀ�Pf�1nA��,��Z/����
�f�X��OئR�/�$�=f�l����]�q��8����|��Y�Z��[��i��_�N�����c�^�]=��'�;�;4<�u�lW���I©^z{�uG*^�u���s�&�xkໆF�y�������X[���>Y��G�J�*
[WQ�5�����˜s�x�6f�X��P3m������9=+����Ԡ������5}�$k��oz(�Lخ�{"`0V����N�mh�w�����>���?�8NEi��C�j��������or�zo߮��[��%�{��il.�"e~�m���`˪��c�D<�=��Ը�*�O��5|���\'��P[L3f���=?���M��{�J�M��-/jTLx����߰�K���K,�i�O�V��=���Ũ�ת��h򗬋Q��}�s?� �U�R�=���
*+8�~��?���P~�7�tB��;s��?�
f�Y9��v����7�Ʌ�y�K?�j0�7���)hlT&
�d�#��LǦ�$�嘘/�f�e�c���u�s��K�f
�k����8u���8R.�纤�?cVX*:��X��,h�_/rO�6������h�	r*�C�Tj����:�eC$Ɓk~֮��jt�N��'��Ÿ��i���g֭���=
��4�\Q6�L,�6\�l���Ԅ0�+h?�=�T��JB�P��!�4�ʟ�.�|���܋�ڈ%�4r����͔w��or�/o�:���옘�����hXH(,W����/_eC�|ƥU�N3���F�-X����O�]Osk�	\�o<�JvLb�����S/L۩l��C�a�CP�u8X?����%����/-RK�6�:z)���o��0������Qл`��r�{�N�Bu1�uĶNS������Ӳ5�	��V�	~�# 8�U�=_�/r��?�JW_x�1( @n�࢔9w�{��ᚓWzm~?�B�
�
�^��'N`�����'m�M�ڄ��/rϳRAo��(�Ŭc�Ӟ8����\���II@IwIR�(v�2S��v��O[����A��0�$������^��`F���B�@��^�'��^ڧ�L,�K[�lGUj>g�[��}��c�M{\�5�Tߌ	%����
>���\rd9�Ҳ��iG4�2�y|n~%|*�EI�E�Ҳ�kֈ;�i�$��=xD	,#('�9�����ς��Yk�B��Loc�ɝ���*!����
V���T�0:�Wѩi�'[�O�+�n�0[�'���ˣ�}��-y�ٖ~CsM
��L���Y�=*W�zlI� j Q1FS8�Sj_]V�������p����U��%���(�U��T���f�6FC����Z��W�WRS�^��Uӕ�Qq%�r讂OW����`h]�;l��u'���..s'|@t,�+�
ĝO�*�4�0TM�����7�@̈́|��	qO�owÈn��N�O�S��O���x�#�Nt6.>Pla���k���~w�R��������T��[j��>��X�U�ǭ�����J���Z��9�"i_��8�5�b�%Ʋ+L�_3f���I�5`�	JD���͡b��՟;��ZtB0t�F�K���a{��=�x�<0��|�'�b�Q�}o�5y_`��B��5k�$P�=�P����"y�P�y\V%mfyT�2�1$ޛ�Eҽ$s��W��RZ^9���'�Hk[q��#��}�����E��E�X[�����o�G��_���e�<�S�n���e	>�d,�/�v�<�B�|����լ����3����֙�_KOj~�	�
j������#��fS����>���6�)��d=l(;Z�Hq�����>]W�F�s\�`�8e���t�~�0b��uC�aE&�,_e��G2cٚ�½��?i}3�������DL%�P�Ը~�=���aaK��~~��3_ECbG�a��E�!$o����aIƎ���u�|�j�����:꺊��k��0K�ӽ���h���ӷ���G�x��G�[��W�fә?���
���{
]�5ʢ�a‚�/�Ǯ�GGP���1�VV�$,p�<6�/�0p�ph���-��`ƒ�|��"y�i���-�>�/�b���2��ޮq�/�u`m�l���I<����+�yHrN7�0����bR֤����u٭���'�Z�'_�˙8�U�0b�-��I`��1��S'�⯻rX€pX�Y��l��'̓
a	�Α/��WaA5��$M͵#%�����
W���z��S���/!Kh��UB�W�;��JcՌd�cלU�hv^�+��*z��cH��	v�iωQm1�.&�0��>�4��wZU\��+s�v��y��P�E��.��ط;��=��"!�<�b\E�VY���Y�������j�C"��p����ٗf�<��Y����2������_W�{��t�}�~��e�F׽ٿ��'��^���%x<�ЊƕO��k'?i�
n�M$=DZ1msL��C���al[����
$�
�d<�"j�����5k
�]�$b��"*�R�]��8!�,m�H��^�ú����_��=Υ<0� ~�M}��f�Fz��Q>� �J=-č/=E��VsM�H
�84�jS�������.�Ғ��I���t�S���
�2��E�v������"�*�����B�����7����Y�x�]8nMc"r7@~}	���=�3k����
'3�ZM궮��Ƀ0�h�����:�P��Ƹ�ְ�C��
Tl�wS����luͨR8zI�����+�bz�⮳+��8�'@������܋(s4��5J����Y���{�Eп�P�3YE���gQö��tO`�U0�
����iȎ(=�:Ş����|Ry��oHj;��gK�$W�&V�|:%�;���"-��Zt�C
�lV�����~ܶG�m��f#���ck����U�Р�Xs$`�}��gc2��·Q���`1�Ø��gCrԕ(/s�.ocbk��i���G��w�C(�e��J��vf���<82�?��+O*N�P׽Ԓh=<��ڃ�J?�^�v3Q�.pp���3�a
��@6'��Eė/5)��<<����؃K
��&�Ţ�h�l"t�g�ֿ���U�:���b�UJjb5�zA {��@����aUh�J@,_p�z<<c~���X�YI�e"�#��j$�j�{�ᱷS�P� �&8�᭍�@�1�6�����+.��[�j4����֬-e�'�п�u����������S	QGsp�2��et�_�����ǟ'?[��_�S���tC��D�����?��_���H�֬>�z�4� y�_���>���6�1	���P"�Y5b��Oo眓?�²�W�7xsX�n>�����_G���W����gV9D�0��?X:p[�=��Ŀ�}���?�u���nm���kb���@��Z��Ѿ=�{�	fU���T={�t�ol}|��=W�B���
�uBw�/Q�����?�7�B�~	\�T��:E��si�>2�:�m�A����?��?����9c
��(�DpP��z$�ؠ8�N��`�ݼ�~{>�_�����n1���l��ʻ߷��~}ە�ֽL�)�k�@�IZ��w��}@��'l��K��ú�5ȻE��;Fˇ��߷��2�ȁ0I+*[�������������oy;��,u
_帘��K�3������3c�.����fե˅�1)`���=�N���		+�I�~����zWH��÷�	�oG&l]�jUF$�[�&�};�x��E|+��qm�"�h���?oM�H��s}
*���&���$~���Ql���~=&���E��j�W�Op�<�����V���[��|��[�@R�]Mâm���=�eW5��:�]X���Н�����3�0�Q�m��R0��~��7���s�5�|�>��7x)�eS�%�>��=�T�&@p����څ�j���?<����j|���(��� S����soUx>�t����/ZMjxH���JN*�
F �c�XE���U!g�����?`�I���A�|`@KI���J��hԥ��j��sK��{?��[�!Ч�
����Ae����3$���oIՠ���N��e��3x�#��@��=���I����q�Q#H)ۤ�#}=>�X�ķ5�6Y1t&U��i`�������I+�_�$$�RJ�L~�܃�~���[�Y-�(��݇yL�V:Ok�
���
g
��q��s���l/Z$�qnӢnpl)�{3���o`*�+�‰K�����?�fШ����?�����-����{h��.�&%yCTU�����z^���c*1��[W�Ă���ή�-�g�?���!Ƈ�V���OJ�OD���[�[G?�)�z��uKǯ��F���L��	~$R�utbV�����>��߭}���k2!����k/��[׋��>x�*����S��G(����%��H
tyC�R��Ӭ�7έ�l��Hi8}�oP��hF�ݖ�yK�\1y�=�x�<tM]�*[=��
�l�6���\ɟ>x��լO�gD��ĩ�M)���sL�A⠜���U���h��ק
[��w�,��ԁ��l֤���9�f
��U����C�10�J>P�h��0H7
�*�m�6�c|��s��
A����6�e�\�Ԩ>��A��!��d^V��"��`�^���C�^��1H,Q(���j���ci�o��Ã�C����SNlFL~b��l?|��P}�q�FI9�(u��bӀ�8 Q���xQ�9�p�VZ��۪����z|.�4'�/�0^X�p���P��>P?�!墈�⮕�U�ء��q3����P-:\����ll�o�郂�!�x���a�i�T�5��?����>>w�� u��E7���A�1�T�rVr�`��L��Zt�x�>m�4Y%(�'KY_�0d0#��w��q�w�Y�k�(CX1�V`6�G_z<W~��$�DT��w5댽����>(ΛqG�H�ip�Z���/�گ��-u0d_�Wt�
��:.j���郲C/�V\f5�������cה��y��I3��Opi�=K�0��'�WO�!�O=�W�	��u/�������֟>(�f���,4dc-Sch���˙��{�mucI|�aC:Q��Ѓ��������Z�㈥	���@�6��P�ZA�]�r��k۫�m����#��/��o���|=&���Q��=�E�
(�t�� 
?L��Jv�j��O<R�:d�l�@�٤Ե^�L��>6�����Y�/G��f�i����'.⒕Á���i�F�����a.G4LE�68HW;f��X�`O���%
�0�oBt�s*r�1��܃o�s=n��]�b��^ؿ�6�K��D}Y��f Ft��j��T_=�6t{���Ύ^�ԇ!��g,~Խyhr��
�o�555a�Xǟ>���L
��K�y��jT�v���s����T\�Sx��J���H4ٜ>(��`��)��g��N	h� �R�w�����mᨃ��bC���X!�O<���H�a��>�)7�e\�P��s}:�x��0'��?`��q���]NT�#֠q|�_��V���O�`�c��x�+��{��E��{���4�0����V�(9յ%��=�u�-�	/�TA���-%eס�F��A��]Q(duMEm�ڊ�����z{���ߔ8�9�S���l�.���YM���1�<�Ao!$[�RГ���C,7�wO��o�����t��q�	�P��U�x���Q����� ����_���ly�#XD�h �j���f�ї���r�5��Vh�3s��*?SY�s��fR٢exAl�u��*q�x��o^�݃
JfW�Vj������I��Fx�8Z-P	�n./���婹6��a��~�Ѝ���p���xH�����D]Գ��`��֮�;Ɯ>(/��ߚ��Qr¢@7Љ�~��LR�j�6h���:4n�
�9����G�OU�WDf��@	"@��=�M`�^
�c�1Ӱ��{��4{9yL�n����`�]W�*n����1��S�=O�N�8�&����fQ��v��q���Nh�*�K|R5w��u��	�������w5�)���Gf2��Ƒ*���>�HI
wf�{�݁�%�zR��=�}�M_BO���
9�ز��nT|难װ�q��N��O��8��0���o
��X���ϥ�K~8��b�Ҕ���cj��~/�H�)g�xU��j�bț�]���f��p�4�p�l�pOWz�YV
u=������3�]�D��t��Y�s���A%��eeeעi�(Qz?�-N���{���(/euN	4GWlt�Z�ڶ��#��X^L���G��^���{��
wX.i�j��ٓ�:�f�+�}��2}4���
�����c-y]���ϕ�M�Gb7���c��F^���1���e����X7�<i��:�����s1<Y��&�K*�=ޭ�E}�� �c�x��5e����� ���i��Gc��=4/��O��u�� 
±R��o��A��
���ݦ��{�J�������C�u�4U�=�O 
Q�yW�̿��^��M>�(D\;I���ز8��'����72҂����g���ͨ�j�6��c�3߻��~�=�m~#��L=0�Kw��<6���9Ũ�\�j:h3��^L�*t"��~_���Uj����;�t%���sc���w<��'S]�0Pc���ǵ�Xa��t��D%�y<8JESz�{F��&�{�LJA
f��a���q��	up�-��݃�A�)KqF)�8�n#�r[,G2���<XF?�@�Qw��l���� �U��?N|�3C�w~���"b�
��!5�����v�*Is-��1���U���'e��v܌�\;6\Q�iяw��g�X)������_&ֽ���UJ��G�Ha�)}*o|uU��Ão
����,]Y8�	��U�]z�?<�p,ȧ�ըSmH)6TW�}�^>�4�Z�Tj�biMף��)	t�������!9b����^:<��&�2Gގ���s���7p�6`�x܁���=\�UD�q�֠�����<�n�;ߒ�>�tz7��jDs�٧��>�q��C�S"*��Ԟ��k�1�w��~\�j�H���7 cN(/���ܛ�ŐĨ���؈��ہ���1"��3��P�!ν��25�&.�V��g��+Յ���w�td*C�
,�?,�a�f��蚕޷,
2�Q�9����,k�;�רDS�1��r�r���u��lr��xEь+u�����o�<̄���N�PCs��h�F�=�f�-��Y#d,�y\p�[a�6���<�0,T8�o^�v
IV���5F <����&�xkՅL�:��E'-��gh�����
��p=F�#Ad���[��Á��BT!�ɷ�����Ǟ�û=6H�ʾs|+� [���D�_ȝUN�n"!��4�)��=�����rӤ[��g�Dc�:.z[z|�Ѩ�
!c��@Q�4��;�q�|���~K�{�5�ao�D9�vX5�y�班��^٣|GV��$j�|m
1
3�o�<�D���L&�o���Ж@��o�1)fҲ\�)̠���P~k,�]B��XT�����M-rQ�M�~�����������K�
]�۷�n�GP"&3�^��c�V=+�@��ߞ�N/;��C׌6vu�:�0��y�no��/qh„na�Ω7wU&
d;�=�0�,8e��Տ��z��w{�W�vUBF|,�Q9\B���`�_mџ�{N�Rw���v=����Y�������i^9/�mAiZ.���M5�\�wGA�T1�lU�b��31G��@�P��,��Lj���3��ͨP�B�%�tE	@�KYo��/4J;ن��­Qq��[ϰ��3<�j�M����L&��d;v&޽=󐲢f~Bn٣fw<�R�#�J�ߞyS��nugm�/�б���zw��ț�̌�=�wH��uh�������QE��4�Le�V�ԽjP���-�iSRS��u��'_��*
|�����ᇣ��:&ii$����<ܑ௑���ᷭ�c$%�d�N�T*0G|dv$�LJ=�Q�| &P�ڐ�Am�9����[�K�*	�k;���&�����g[�u�	L����+��j8�홇��5`hIJ���AR��;~�?|͇��Q�I'�������f;?��̛
O���hU�\��?�zu8��3qf���N2��
�+}�n�iC��J���aF>�o�N��7��ƚ��QM��g�מ��>|��PU�K��.j���U��z{�1��++���KC跠Hx.�aO<�5"a{456��!tY֛֝"�3[�"�C�H�rj8ʶY� T���y�4v���j였�k��J�Ԥ�����ҷ�V��p�
w
����c�ů��W�ڝ��iQG9
`�����jZ�.C#�O`N��)n�Ҷ}��7�*�jж��
�q����ߞy8w��R %��bb@%v+�3�d��=󦱅�p��L��)"W����̛�ne<��yb�|�D8�N�C���c~�N2�i" ���:�CD��̛ƪ�/��lU���WC��|؛�Mg���D�a����W�`i3��J���<��c�jQ�W��J�[@5�Ezc����v�0M�s�Ŀ]�^J#�ַ`^�A�!8�O����*σuT������R%�U�����O�l�{ �^��|`���UUW��Fz���(B'��G��mJ�]Q�j�h�2ͷg�cQ�#]ǣW�3sM�5cZ���ӭd4�,���e:�!6;��ã��^9:;��t�24:<�]��3'8:�}�{�:o��(������7�G�7E���\�Oc�R��~�ԷiV�	5�������)H�����w��t��#�0�_@
UW8?UE�O~8;�x:M!T�L�f��wr�~��J���`(OC93H��ɪ	P��Ͻ��:�w|CNn�Z	�f+P�͇��b�a��j���M��)U��������ی�9
�j��2n��{l��ظx�)[�։�*��K=��m?�w�M��(�RTN��8<Dݿ���x��{�%�VU��r	��Ԁ/W+Y�}8�v���(���-^o�������TZ^"���U��L��
�b9��*�\������{v�Sk|�/bl^^��El*!\&���l�31���r�tO�$
�.Pr+���gb~ͭQD���͝x��5�4?�V�Q?UW���X�;\�j���>�6�z���LK]zbh�Kj�WS_��Ĕ��j}ρ>�P7MH�v�����'b��o-
���P~�e}��
��`��*�-5��\r�3`�U��q���Ov�-�j�ļ���:�X�N�M�f5������?jUX˥v�����+m�?YT5�M�t���y�js��sk�w������tac��5`��OC0����>���h1��d���Z�]�T^�$�S1��Ћϫ�V���[���S)<�W&qb=��v�~�Xr�t�h^/R�|PQ��=��[��P�:� ����ʕJ��p�4���.|
�n�!W�-�Z�v��_�Hyk,��	:��s���&�ew�%��c|*���x(l�y�&z�\78�� �~�J8��ֽЮŊuF���ڹ��Ep��H�Kq�+�jC�J��5�<9W�d�1�s�M_LuoW�˨ud��h��Қ7����1�����}o`��N���;�����(��7	��*�~y&��j<:'�d4wU�=jbʺ��Ͼ?��?�Yˢ������b�:	ؾ����l
p�S�J�X�i(��k�G���� ̄��r%�Zu��{�/n�5��3�3U���j/�RGGѼUg�~"��|{7�Û.)���֬5��*�����3��3j{W��$ <��9�<�w���?�g�k�M��2����ҲҬ<��=���g�񌺴
S²��:>��REE*Y]_�=��}5�FU꺫��鵠�v�+�ޞ��3y�n��0C
^;>�9��4}��˷����4��*�vu���wk��m:*�Ygwte�N��/D���C�a�lO�8sY�6�w�织�Z
n_�[N|?ZMw%��0C��?�w�/6��6�1`�e(�ӵA]���}�l�*���0K��^�GC�g�k�x^�A�{0�mZ�n��3ߴ��T����-�j!�.M������?�M{�*�}Z]�ir)�	n/j�`
��
���t^�G$P�ϲ.��þ��w33*۴����
uj]8:R�|����牻�@���Ho�ׁY )}e��?��w�ݙ?�|{�P8p��R����g�/��h�É$����&��U^4|�=>�?#���➽�K��]O|
|��6��3�uDŽ��q�J)�-3�Ve��/[}����yL�u�no�<l�A�T�_�}�xU#�0���b��.������}��X�xBd�j4kt��+L�M{�L����f�GX+��k�C�<�>D��x����F�S;�@4'����k���YJmS�-��q0�R�G���-��g�o��j����5N+g26�S��l�q��s�����՜���|gUuh��P�F�������3��Mm*s�����v��8gC:�4�[��n��kP�+���a����Q}�g��/]�Oҽ�P{�|�0T�gߟ�%rCH�Z�o�5��0�͎�K	��|�k�Y�0R#�*��ޠ�ê�"���|[������Jv�\6�NX��i9��/Q�(���'�f�^���,�����[�N�!y`�jJW2:�S��U���H��Kʭ\�����y��?�~�o�|˯.B����"P%Z����)�֣�9���jޯ�����o�����Լq�o��{�X�#�Nݳ`3?|���ѳʛ:����B��V?���}�r�,���'<A�GH�_Х�.��]i��l5�蚧��9~x蛝�>�j5gM�O�:�Y��C� �&$wtRcw?�^5�[ܫoZ���j:���G
)ᆬ�.�����s�F=��x��fqk�e���f'��F�d�#@�i؎*�ΗЎX�V�|�t��N�Z6�mM�"fj���x�G�uGS�o�
�Sq,����Ē{۳�Y�hg|��"Oi�u���L������|���\5�c��G����k��*$0 &ȣz�����={�?��7M 槌��8�B��5�~����o�M����xC�`
�)d��h�g��AQ�Kɡ���l5΁N����Þ~�A�-5��-A�G2��G�~x�;�!���ah���0�ր�龊��C�TA���:ʛ��9��.�i���w��X)�}�;M���U`?��J�i�
�xt޴�4 �T�_�־?�<S"�������"���£w~�
�`h3m0��"�[Y��I��s�3����2З�R�%~�l)�	���o���>�f��X�	�.U5؍�r��;�j����cN�2k�`�pD��?�� LL���'���bc�Y5#v����7�`'��
�;�D��X�i9�����A�3�
罦�<�%ˆ+��ϔ��b�t�P*A�`��E�����8�]c+�b|�Y})Em?|���ZN]������&���������@Yuh�7I�	\!�{H����]����
���S���Ȅs�m�デMu[1D��I�@Sؿw>(|�|J����}�{���_�1��|�O�4�=���t�,�^�j7[�}[Q���������LsS:�2���7�8�~�Ug�BMY׭Ow:�����fʄ�,J�b�+W�\��a�?>��.�Ѩ6�uTBz0=�8j�����~9��Y��M�sذ��N(��s�_Y�ӀF�F�13��_��y��,����'���Ī�! ������ѻ��;����2:�x��o��:���dA咡&<~3��47&lg��VWlk�x;����o��+DM��7��6�=�X��̨Gx��w�@<�����4�B����p����|?�����W�l��P�VZS>�{�L�9��n�卉CIKE��dF�~�����?_qt
Fi�q$۝��U>��i}�'0���܎�:��j�;�?��@%㊶�DU��cv����iM]z�ڲj_ͷSw��ZT���?�;�~��A�P%M�R�3V���_�V���;S�N�����iAB�������-0�LN��`^e��fA�`�Ϥ�h�����J��({&�������?���:Η�/������w�/��_/# �`�}�^Ej����H�K��{I�l B�/K��`�Z�>��4>�T�?{'��c�!(w$��մ1Wݵ�K:y'�
���S��c8��U���iN%ųw�U���إn�U��m����~&���,���6�0�&�V���TR:{��u�S ��4�J�5�H��/bݹ��w��E��6��B�SC�w~*)�����«�[���>��	��D��;a@j�5K��2����SI����b�,�Ҋ\|����Uk�H:{'�M��������FE&�W]��J�g������ģc��m�J{"����Ǎ���m'�4Dx��ΚSg��j ��_q,���Й��'�δ\��㡨[�C�cWn0�\@����i�sUU઩YUi���
[��Nߪ�a��Eڮ�q����,��ǹ�S�Y�S����c�:�䥷��[�zNh^Ka���P�{p�X�F���:u��HZK�>%FB# ,�h�&�������+W��a��P��8Sy�6��\T8w�sJ�k5�
1Eۻ5]�:B~���T��D/5�Q�����"��8Q��O]��H}&�-0A �S��U�Q��3Qg�J��+�F��$[t����ֹ�S����f�wMX��e�@U���D��U�����}E��VSBdt�G�~�:�)�S�&�4pt�;��	��о�Ĝ�bMO�M�2)j�U�"m�:��ՏbN�N5��[F�5���`�)Ǜw*��m�:����C�^��LF��iD��{�m���6^@�o�ͳb��A7*�=s�68��Cs\�,�a9^�}�{R�(��Sj�G�ߖ�iZ�QvPMM��b��@�3w#���*;]s���
~�οM��ZT%W+��
bwW
���N��o1v�("rj���]J��!�'bο�
��\+�XMl�(��D��]�Ru�6��|p�l��'8�
tǝ�$��e�1^��Y �]��ZV������FuveoM	����v.Pl5�?��绥�h����LM�vc�h�|��[�֢$�IZׅ���@	�هo����6���EQ߭CJP�8ֹ��7Z��;Q.�J��aq��<��9�K�t;�Q_!�]�8:��]�71g~�d��
-o	~�N@Q�A>���zg��d����ƹ�
�CA�
㙘��1�-��$�^J��~k6�)�(��S�B�T���2d5/�L�����P�jj�竨�_��(�?�y�w�(������bK��w?�f�31g�,�2����F�F젛�K�����Į0gg���0���dM
J)P=陘3��k��҇cT��k~� :f���_4z�b��I-Ջ����I��ۨe�Z �����6ΐ��yۣ����|Һ�o�>�6r��K��X[���`��g"%�/��p�����}�÷Y"�����e��/��?�����7��2�S
�_�Ϗ�_���
s��X��M��27��o��?��������ٟ�����;���~�������_��9�������������o��o��?�h����ז�s���?�߻����b������������Ѓ��O�����o������ǟ��?����]��C��_������_���?�?�������-�?_��M������������������}��Ļm/�m{�nۋw�^���ݶﶽx��Żm/ݭ��n�Nw+v�[��݊��V�t�b��&߭6�^�9�]���p�N��>���ؕ�e�������_�T�U�x"��Oy"��gy"��y"���y"������
f����u`�D�X�u��D�X�u��D�X�u�D�X�u |*�:~"�K��:4~"�K��:L~"�K��:d>{8?�%
vD���J�}�����>T7Ϡ����e?Li�]�� ��e�&CV�����<�_������=�L������T����ԗ��3�u�2�Tj���0�V�_��i�^�㌗��~��ԇ�07J
_�Wsen��0t�N��V/�n��]o���e`�T�ͺi_��O��7�]ݔt/l�L�e�s*�2�9�z�K�
KN�^�%�R�’s�Waɩ���\�ՠ��@�ʼ N�^�R/�S��C���ˡ�\��P���ˡ���[��
�����5�rd�(�f��w|������f=|���[�ٕkѧo�a�_�>x�?|���b�l*�_y>x��~�T�Ͷ����S�7���יO�l{�_a>����S�7+���Oެد_R>x�b�~1�D��W�Oެ6�_C~��_^\�G��/���|x�R>
�h)^���/���/���/¯ž�T.ï�o������m�2��(�fۻ�>
��.ï^�_ެؗ��G�7+�e��Q�͊}~�(�2��(�f��~ݒ��]r��}x�^��^���/��G�m�6�Q����Q����Q�E`w��7��e`�Q�Ͷw�}x��]v�l{���G�7��e`�������2��(�fž�>
�Y�/�^vެ6��]��������?��nʵ�D�˙6'2/g�<��z>ȯ2o�5�L��f�I}=��S�/�}*���O�����������S��>�y��ޚ��]j�C��_�m߫��B�jՙ���N�=�&�m�?L�ɼ�=?�|9���kT>�y���^z"�.Gr"�V����\��5$��|9���דJ?��rJ���J����+����Dܭ��zf꩸��R����_��O�^��R/��s���W��s������I�!��Z/����~�q*���5|��z�Ϥ�n�B�L�
���*�'Ro
?
��k�~x�n�~�B�yS.��%�\�U#���t*���8�z�u�K��:~�z�u|x��?
�y�/[��/[�G�7k�{�r�@��_/�{*�f=�w����JO�
_OVz*�ox��ܗ��T�ͦ�z��S�7ǔד��+�ͦ�z��S�7����JO�l{�'+=x����T�Ͷ�z����'+=x�b����T�͊�z��S�7+���JO����T��j�z�ҩ�;����������(�
~x�?
�h�^���/��/��/�ž�T.��o�����m�2��(�fۻ�>
��.�^vެؗ��G�7+�e`�Q�͊}�(�2��(�f����;k�Fv'�Nj��D�E;<�x�O$^���M�D�� s"�b�9�x�i��Fs�H��/ü�w��e�w"�n3��N$�m�������މĻ5�2�;�x��_F|'���˘��ˠ�D���s�� �ܷ������)���}9'�\��D�Ož�i����|���\��o{.���s��m٩ػ��r2�3���"�"�~������b_O��
�W��\��y~�boS�S��U�T��͟�}9/�S��'&~.����gb�vWҚ�K|�<�x�����L��	��%^�g���={��ݏh��?{���j��^6����D�Ec� �1�H��G�k��~��(���(�}����ۿ����?���`�q�O��������BS��š�-��
��/�>
v_�������Sѯw�m�/w?�mѷ�޹��+�mѷh��*��_�Χ�_?A�m�/ ���~S��	�
��0�s�/��碿L�/�����B~S��!�)�����2G�Mѯ���2�L��$�K��/�:��\�W����3��s�ϥ^�-��p�?���Ԟ����>��C�Τ^W��R�P�3�/k�?�������@>��z��D���L��D�S�/[�'RSx�
>���|*�e�t.�B�}&�f-�c�	�y����8Oެ;��d��o�������ݭ����}�{n�&��˱�I7���xs��Ϥ^�=O�^�O�^���2c�
�YK/Ǟ��<x��_�=�l�c�}���
�Y/Ǟ�/���)C�J�{nN�T���ss�gR/Ǟ'R/��'R/�}iXOެ��c�}9XOެ�c�G�7���s_��S�7�����Q��z��6��n|�T������3��×m����m����m����m������3�/�?U�M�էo���KV�
��^/X}*�f�{�\����m�b�'_�U}*�f�~�R������:էoV�׫T�|�H�������S��T�~G��i�9Ux"��¹���
O�^=Xx&���¹��G��^���^$u�^>]8�x��^>_8�x��_>a8�x�
]>c8�x�>^>e8�x�>^>g8�xUOs��ǣs�����Ii������s�L�x�D�Ug�D�U�"��o{=�}�x�\s7fM>�x�1]s%��G�������O�k��Fs=�ߞ{"�n3�?�����]6��J���\�er*�:9{�<{Շ����@�����@~{*|�x��^�
%޽�ס�G�w��u��Q��x=f~�x�>^��%ޭ��G����������0R�r�����&�s����
�/7�
�/w�
�/��.��B�ߐ�2)�
�/��.����ߒ�5��z�����?��z��r_/x�\�����}�`��ܗ��r_��!�e2�T��@����ס�'"o��ס�S����OD޲=���^�t"�&�t"�&�t&��t&��t&��t"�&�t&��t&��t"�&�t*���&�tr�s��;�{|:�|�:�|�����7%��n=��M�@��N?�_�&@u���B���o�Uw���"��4r�z&�:�z&�:�z*�2�z*�2�z*�2�� ������\�u};�{]۞Ƚ�kO�^ִ'r/�ٹ���������\�u�L����u��ܯ�:��s�����`�\�u��D�e�~.�:L"�2H� �:D?y�W��ODޮ�ס��ׁ���[��K`�3�7��/��O%����?�|\���Χ��L_r�L�M��KN%?H��|ɩ�3�7��/9�|&�&H�%g�O%�K�>;<z��
I�}�w"�&4q�1߉��{�|*�K��T�1�
�=�]�#��/pU����T�����|��_`R����T����}f>�v�z��O�~����w�S�_`�����D��=h>��z/�O�~��ޓ�S�_������D��i>z]���"���;N|��"���N|��"���N|�%�q��D�
'>O$�p�s.����g��J��8K��K�s�w�%�K��,�\�gIww�M�7�R�ݟ�7%�pJuc'�O�~�׽���ƖR�
�j��r6�Ƚ��Ƚ���^E��^u�O�^vc?Ƚ-X�˽*��^�r���'r/�s��C�������É�ۿ��p"�v]�),|	z&����%��{�Ηp��oq�_>H��=�{SX��L�M��K8�S���/�@O%����@�B�������@�B��W=�|��}�q�3�w��W7�H�C���ğ
�����b�Sɗ��������
�T�e>�|=V�
���{��N�^5�S�W�����J�O�������T�U6x��_`R�3O�~���ޅ�S�_`�����T�ة�
;u_a��+��}���/�S�v��N�Wة�
;�_a��+�������S�vz=I�T�(��$�S�_��ד�O�~��_O?��=I�T����O�^O?�vz=I�T���$�S�_`�ד�O�~��^O?z=I�T�(��$�S�_��ד�O�~��_O?z=I�T�����L�
�e���� ��S�/9l�q(�B�~�����i�H�~\}*������S�W����T�U8z�y�
��\N�~��_e��&u�W�
�;�~\}*���q���/����էB��N�W�
�;��D���S�_`�׏�O�~��^?�>�vz���T������׏�O�~��_?�>�����T�(����S�_��׏�O�~A���D���S�_`�׏�O�~��^?�>�vz���T������׏�O�~��_?�>�����T�(�����׏�O�~�J]?�� �����e��$�x���էB����/Y�u(tr�~�ǜ�������;N�~�Y�q�p"�j��_q�}*�*:z�LO�^5�S��ˉ���ߧB�j��Ы�*����C=zա�
�;�~�}*����?��%^�����/���矧B�`������%8zu��B�d�W��T�U�?zU�O�^uҧB�:�S�W��Ы`�\�������S�_`��ԩ�/���`�T���u0u*���:�:�vzC.�����T���u�*���:�<�vz=��T���\��ױ��/P�/���s	N�~��_�%8��=��T�(��r	N�^�%8�vz=��T���\�S�_`��s	N�~��^�%8z=��T�(��\�S�_���s	N�~��_�%8z=��T���\�Bo�%�o���S�_�W?�Ы�z*�
�j��B�����T��`u*�*�<W�/0���T���uPy*���:�<�vzT�
�;�*O�^��B�@����S�_���A��/P���D�uPy*�T�:�� �NP��\{���7��qυ^��s��\�E{=z�^υ^V�B/�s�A����|�}.�����/������B��N/_{��;�|�}.���������B��N/_{��;�|�}.�����/�����gB/�P���|By.����	��/P��'��B�@�/�P��� u���L���s�_`��O(υ~��^>�<�vz���\�����3��O(υ~��_>�<�����\�(���3��O(υ~�J]>��(�8��U��?��������]��u��ӿ���֢u7���?)����_�5!���l��d���sR�7�����?�~����??�s���\�'���_�����_��\�%��������_��ʇ-����q֥V��L��5��F�k�mu�y%�i��.��W0���w�����9�ڼs��9���l�M	�u��,;��\��Ñ�٩�ƿ��^���_�����1��{7>�\B�>��3����_;����ų��Z\u����j���WGjƬl��v�6W����o��abZs�]V5|��k���3�m��öj��|�ܧ�i���Y�ϽL��I��mW����y�a��b�F�7=^z]<���b��#��rO5z��.����uä\v���>��ٗ�lݘa6�۸�e�`ڰ����/�`��.-�.��'�bJͻL�fq��R����ns���%�{���Z=�]g])�8��;&_�>#_��|,M�ѥ�x��|��f�f[["ޤ��J���K_���X{
�q��i�ׅ�P�dvNm����Lп�y�Q��Y	;��O?c�ǖgh˩�G�~��l�+.��ȡ�B�y��˧�<^g��$F?��ÔY�QX��H5�C���yW��d��9�Uǻw����1�"-M�f�4к4lm��b�����j���\���бi�����,�޷�3�X(�ޭ�ҋcJ�f:����B�?���gs��s�쑆��Ե#n7�0�}t�ֵ�
F�x�>����Pz+�m�7y��,f$3��
��۞a��5���dW>Ǜ��Ŗ����vj�X�Yӡ�֣9��6z>N"N�
S�D��\���·�9�if�8��r_y�	��
~��R=���:y���n���g�Ѻ:��A�_�ù��[ã�>큪�5����E!*�����ʘ[:�R޼�
f�?�k0Ú��ޔnf=��f��m�5�c�х��H���{t�b��W�
��� ��"�x��@8#�ia5�+4U�1��r�3O����8yC�.���P�n�!o��?���gLi���Ā�_���5�'��6��-L|�O�nF��֦,
�+i3L^�0y��h@��T��K���]4�/���O��;�`�>#A�O<B1uŹ�ٵ��v��Xs�i΄�Ȟ��;�F>e��WS�c���W��d;��b:9V�J;����^��6�B����5�_��3���j�@1F�	�����ǰX���:�5�Ȣ����h�x�-/9��(
���H����Tk��e��x&����w,�T{(.ɱ^6���C����[Eע�k�s�RJS������2y�Mm�D�������ǻn��
^�Z䴺Go���H~|���Ⱥ�%(!��G�0x!�]	�jisT�{C���B\B�A18��o�:`	��	�������7��mV�2�;�[�a=��!f����6�'��|��K�ٔU1��w���KO���]���U&�;�+����j�d>t�H��ϴ�r��Y&j���+n>6�"����!&!��5?2j����J�|%��:/�e�/B��m1m�JT����rּAd0x��s���AY�D���O���9nL�C(D�9	��Č|��������<����S2�r��F�}kCj�`�@|L�Gm���e�
t��~|ųψo��A�t�.֥�#�����č�D��k�>���MY\T;�k��T<�ҏ���e6]H��z	�|��q8�
tk�>�c=��uH�ʗcˉq[A��X�>�7�3��;M�6&ޯc/8���MASt(��x�f�~4�ٮ
4�`�4�,h��_��3�_�h���NdG|
��@�l���(ǿ_m�Ӽh)�����G�w����Q�J�6�!;���
b)�r��v߽cr��[��G�[�����X�z�5L��b*8�h6w�YC�B��B�L��*��#�h�!�w�c0g%~��0 �õ�3���W<���nL	��€ɭy�~܏j�-�>�?��q�`@~����D��b�X�6��9��+W�k�_[x����^�_O��o���ۿ��o��5������_������}����������ϫ�c�.�.���k������_��|Bs���
�3�`iG�V��k�((Cpx>0`�}�g"�;T_�^V�yX�����n:"]��:��	J��߸�t���򸒊f4y��	xh�R4
����~[����F<Z��nG��,����S�#�OŤ
(f��3��8��*��d�3���J���w��?��?��~�?�����O���I�{�S�n"��@E`sv��8[]Ag@*�A��PY�]�1�e�"N�򯚴O�N ��a�op}�������?��G݈{n�	���m��ͼ]���J�䀏��q3ߝ�m.�
p��� �Y8`�3y������p>���'��/��p�/�h�X���;D޲l���,��
��~��MAH�,K��}�`MdY����7r@\����������Hp�:�Z�}[�@X�=�a�배�<K`K0�b�p����fI`0΍9�0||~_{��Gbj�
��M1�m�X95�Ѕ�#�z׊~=�#������S��~����
	�.��
p�~A�bDŽA�y�,�3�ux*&�-�T�|��^&�G��#�>
8rߵ"��"yT�D�LIw�#h'j���@ h���:�7T�<�U���v�G�`
)�B׈�2�z\#*�^��
�N���޵�_��l��A�]M���}����c�۰�[u@�@(�4u2J�.-��Gπ73�?���u����l��ePf\����ѯsd���=,���
��|i�ljnސ�b���b	v3��;$�
K�c�}���!�c!�
���_��#�f��NΗ=_l���Zѯ���ױx�\t.��ɸm��V�� �:7����	f��p<,�i�g�d:ح�U&"B�#��)��&���Hu�j�T�kE���e�p45���j
|�@�ى��N#�r.
f�a񶕀:: +�R��C�:��,Z?���`J �	Ƒ������nG&,ݵ��"�c&��,q�-��C��j�W���׆�)��Nۂ�i6��: ��lI0�B�[��!$�x䀒%��Ӗ����u���5c�ث�������;�g�>d`��u3�L'�{-8Hf�UW�j ��'��d�Cp��-�u��sD<X�]����t�?�����xn�`T�:�>��Jt�9`.ڹ ��L��v���3������]��P�e���Fhzeti��lZ��6��Y�C��Cׁa����i!%�nxWd!��6zY�d's	��5 �|yy���K0��d`lp���,)@�m�^
U����]a�]�]+z�A�og�j��������z8�8�o��/�U���#,���x�H��⛉�:C�8?�w���x=�9j�"åY�[z��ܵ����)7oE��0�@���i�M$�a�4���v�^��Ov���3\�OH�4�����
����'An��q�y�sBG��]+z�A��u:�4X
z���j�{�1!\�J�L��8'-���cѾ�Y�(��R�PaxG	�r�J�h�2+C��L��u�p��~ȏ�c���������Ps�.�
z?Z7D|IX��ݡ��͞`|�P�T�:�٪-��t�B������p�:v�ntN��&g�����	?�X����P6�uú:?����\�>�R]7�2PP=�(vA8����Jxn��&��ǖśA�\�Y٥jJ�&`���G�@i�4@5�W1`�R)u�k�n��2F7���L�׵/�X�ϰ�P��Cv�!$�YJ�Cg����li��@�Xd��ݶGo0(�Èhђ��t�!��m�k�"`�t��N���S�����]����,	�Z`���#�3@p��n���J�g�[��׽� '�:+�S��t
�G�8ȋ�5k]0����nЬ��p����{"�:��_�M!�R�f�+Ă�t�"�D�2��1��y�V���zM<��+� �'��Q�Onp�I ��'b����J�ID)��E��,�o�R�n��^�$���{?d���9�k�[Z,�B۰T�
�tp:��z������`H��L�AM
�`چn[��Q�dc�KI	h]e`�U�<�>��Z���!����F�0DØu	�yK��f}����B��6�h��-��
�Y���^���k�_�:9��M�~��㭇<�?���cO��3����:��o,\�?v���&�t�����Ǻ�k-��W#��9u�9s�k�De��	��^08��ډ_�A���Eرa5�_�����������J���dT1P(x$�f<���l3%�	�)yxno�؋��b25�������.'ݵ��˫C �B|�����[]�R_\�x���bx{���Vǫm#��Y���s�o
*$����
�+8r�8*ܩ��Z�[�Eg1�]����)Yg����S�T^\�m�PX�#!^�y�w\���6$�����'�J�T{�	�3�_eئӯjum�A�&��wi:خy�k��&��	8!�աkX�W��_����tt�����\���zV�b�}� (��R_�,[��&��x�G�3��[,�Zе#D���nI��a_Xs�T�+
�W,���a�0Wr6�������L�=��[x^]�z���=�	G���V�Ā����	��k���E��1�Yn������qIg�	A�A'�!��5���D �n�A!
6OgW��A�T?�v~���d��I�0��n�s�fV�!��*�Rڅ�O���p�`�����U�Ba���s�(���l�`���\��x��z��~�փ��E���wEz	�B+��郲M��L���1��<&��9�m�w��+e�x�.BY�im�q�B��V6�R�[��u.<@s��+8��*�B`q�m����JLшcm��H���*KH�8;�z�K�u��ZcwskiCݗ ���k_�//�|\�����Kt�R%��a���p{+e�cńf��w;�`c��!A�y>q���pXоG#-]e�#�u��RÎs����J������b%�=V�^P��f��2=����ڢ�o(�ԄI�;��8@����*(w��Eܰ�^�ϝ�$�@��oZ��zs�xh{]�1�.>�m��!�ĵ���W l,Ѳ�P���uX�k�����������M0��Ss�S��.�f�56����w]o�xh��P��#gO@��+T�Ww�ɪ�.�[�)���o��tҚ'Hgҏ3�XjEa��鲚�aY��0)V�"{]�D$Iuܻ�7��JE���[��np�
���+����yM�=�o
�O�.�{v�,�a��?�1ݕ���p8�hw�J�i�&c_>�}��7���s�D$.2/0o`���#*���ږ�\J(xL)F�W%�Z&(0Vu@ݳ�<Q�t���=�Vtԧ8{��f��y�|�8X<�b��E$���uwݪ�0b��8�����nKj!�&��*BB+ծʦZ<gea�e��[��i�kZ7��[�2����Æ�P.�p:�h��u���#n{ԝW$w�jm��p5m����lB�M��
8F|K)�����7;�
���u���4
AVȁ`uhN�����4kJP�텱&Z��!b���p��V7�1xW�_	�	:����g�*!�:�b�۱���{�v�F�A�@2��B��&�:L��D��Q�S�]w�����|؉��H�t��\1��Ř��}���'o�g��~BQq�({��W꫄�Y\~+���h��GA���m��XH��`.9�	�iOBwr:�/�1�:�����WPA�o�v���c��
[��I�ϳ/�/���/��.��捷�� <�׍����
e���NT���3��vL����V��.��L��!�M��uW<���0��rIlz����f�d]o@
��M�Ѣ]V©5��n��*Qb�fk��	�g��l�	L�D�����=SJ�Dt��R0��
x9 p�M��l9+ʉ��
|�����S�w�x��vAY�����M�V�4�yd{yaT�jw.�&�AC��aC��c8���v���m�>�N�Ki�,|�{���]�]*��I�9@&��n�'�F�UP�Ge�c:*9p�v,�hcs}�롸ag�3��S'�(6��1�P��m����E]��*)��zR~U��޹8C t&v�-���nr����tA��Ť4��C���D,���-4ipzU�� {�Y��壺(�T�2��5R�9��~�
Ha]��L������V�b��j\��5�0�2�M8�g��
��▊{�7�4
�
)�n��t�U-�Q����|+�x��ð]""㥶ѹ�lj��cTl�TI(8xNC7�~橄T�?+AS�fˠoJ$��@]s*;��Ԁ����?P��y��ɺހ��7r���l�	e��]`ܸ���=~h
�Y�=�U���Y���q4�lP�0*���ʺ�^��^Wlwz���}R~�ހ0
�J��&��z!���Kǭl 98J��BaU۔A�C܆S4�uN�z�46�x�EB�2xL�PEY�1xP�q����dI��̒/�0�9�ϭQ��Q哋.��vW���6���T0uށoĴT\�����e��TE�-�t8�#ߕ���{p������!x��$��(��B��Q$^p����S�o�ts%]5�i�못nk
��������*�����4p
ይ|�l�ɺ���.x��K��M!fzP���ꐗ��]q_9���ڝ2\E)?�u(Dyw!���tB���v�l���a�*(�$D�ܻ�@��z�d]7x�V�����l�-�낼/�ʼnÆ1
�W��?�@��0g��
�!�)A�!Q���T���+�q�n�jU�'��U+.����{��ru�ӱ�u+��e�؝"H
��N:)�	�&�[m���GT�#�O8��L��'��鰭;4�����7��ؼ��b��!�~���mo7a���W��QI�/�m�lT�t4�GY�	�T�fO��N9E�
0X4y����i��
X9���G�_+K�O�Zt]�����2N͂�W���ە���%H��R�6�ɪ��
�
�O��CꕺfT(�w�G��-��*~����:3��jԱ���X4qܪ��7{�(�
g��t�C$�c+���Zt�)�3Vf#��Ϋ���@��~�bVOe���I���5�b��@©�_�{������o���{�G���K�#�-��p��B<��
��{v�¦�����r�N�uI��Wt	�Y�;J/ڄ�� ]�(��0�es�J��w]�|CMb�ɝ<
ח`}�s���
�NuԒ���밳�x�*[Wy�m�����̺5���Κ�4*g�j���Ϩiv����/ZH������]�ә�dE�)NF}Gb4 }e��t���EU�y@Ӽ꯶�����GA�jk����"�a��c����?��O}�Ax<��#�Y[�۫�E��q�S��ħ],�
�]W=(���Q'�'Vp�sjCYA�uD�5Z��x����f@cZ�����1�j��s~sq�<P�S��K�U�����O��:��?����JLTUO+u�,WG���?�J0\TXq"@̚�VTej���jv?�>��D�����H~�U�
�	t��}0<�������x�W����j�U�	��xX�X�H���8�Ζ�Z��M����G�s(����޿�������Vu��U�;k3������$��#{���������Gr�4�-�QJ�.�3�V�>���Ӡ��W�<f�{��X�wTn��=%�,X`��
�5��c[��F8*x�֤F��^3��Y����e�G��v������]E������}�_������	��5*!m�ꤢ�;󨭘�^_#!��2�TX�z6u���_*�JmIt�?��DЂ�5Y���b�������Ͽ����H��؄ʗ���m�o�fX�5�$�����*�l�uۨ���:8���R٤�[�B���s��V(x,���Q�J�p�?��ٲ]S5�Cy���P���C%���*��7���Yg	�Hh�Z�
n���*��]~µ.8NT�
�CPH%7�3�X`��(@ '��-���n�삎��4��akW�k�G�	��O�G�p��!cF=	�6>�P�) ��#�&8�)U[^y(x�o��x�i�P�2%��<�g���z��)8�ᅐ�Nb��N��U�y��K�n�eLɵ�����1���*)����0j�7�@�Kt�����D=��
�3�Q4��*ܹ�o���ҕ��x7@���>��Yq�;� l�Y��yA(k%��5���`��eB
`��n$�&6�G!é ��R�{��}㲐�P����:M�M���Gd��ξx˺�7m��pd�T�nhP���C?1G5%�T�_P'��D���H7�]]W'��Te�~���e=�eg�X8wc�5Bx1hf����Ѩ_��gC��c{ܣ.٣á��RU�f�%�
�(c'�X��(+�ŕ�a��Eі��u~���x)1�T^�#z�m�r�l��ч�.��TsUA(n���cLJNxEUQ�!��U!���jn�ބk7�UW�Y��1��}���>�~�*�|�>L��d�)�W83u�_���tg�r�GG�u�l-[jtCY5���Ր������S����Z�޻��pWUX���O��Ҫ����xE�ia!�e��]�Vu(Fu�ƀ���%T����Ѿ�C��Ϊ���&�w���V�s�?{5����Ip�g�B@U{��v����w*Ϩe�:B,���^G�V*��el��_��.����;A�QILhkP�p*��y�m}@���W���1:�Q�d�J��ꢲ؟�kR��q{׭Z
�2��A���	�Qv82}�Qy0t6�cU�5tA�(mR��[��E�fY��l�?׭vC��`aUI}u�%�l!q��+�\�M���&�������‡6��:��<t{��b���dž�b+i�Z?{�ٲ�c�c�+�=cn�t_wy%��{e=����iG����ĦT�Uw��N$����5�'���*�T�r�\e'ѳj��_�����ϖ��ۙ= \��@dU�.��
{ry@�XK��-Z�;��v�ZW����`X'{��=L�ÃV9l��8V���oT�;C���Bn\Vxp|�\�|��s�j棫�����Υ>��W�)bT���x����0<�zQv'���52�F���S	�:���'��~����e��eeT$�����ȥ�s3�5�L ��֥�3�Rx�q�@�j��Ʈ�L"��Bp%"6]2O�.�q�=��w|�b�q���V���ܩ�0���D��W�ZQ�Ǚ�)bH�uo��Q�n9Ւ����NiS�	��.��CE3�]꣦�56k�X�ޘs�4&�.�4��y"�eY�
��+�Q�[�qVay8�t�D��Ԁ>�ƞ��3�]��A��n����wE�dS��p�j�UT܆��vVyu"(t���=C��D�N�G�����յ;��ZV�K9ו�
jJ���udZ�NIꄴ��A
�`%:�V����w�nn�7�M����
0�q:�WG���咳��S����͢P��x��,K
��l,ff�As�/�j�!�딒�}�:y!^���\IR<�_��wB[j���Ax�0��w�G>�Rz����=�ϛ ښT��E}C�	nW�+3ꔩ{Z�ʀ�TnE�y��bQ���b�r�SԵn�To�UVA���TK/���-d��L�?�)CSK����:A#�*��w��c3�N����Q�����"�'��� l�Ԭxk:�FF=�0bpu��N���|�zS���u��L��v����CW�5��),zbz~+?v�ɝ�=�V`��.Ծ�[帪������U�s(�W��V����=z���6��{]t���&�����M?�Q@���"����4�TP)��X$�BrY�<����h�Hi�CM>�ZIӝ���Z��P���p!������T��h���	���l�����L�.ZM.�,v�#N�
u��u��3���..Mт�?�Y�Ҩ?]�}E鷮�`Oj�0a��Iwr:�S7Z� ��br�S�%e,^�Z�Xģ�jՅ��T��m0���".�we��M�R�vN�_����tY���I��ՋҨ�_Ui�|�����/$�7�&1�;o|�o�;j?u��34���Cmr��A�Ń�'Ba�.��Y}�p��崐�f��k�ϖ��zD�3���X�α'��D�j�bS��G��ZQ��u��uiS���VѵQ=h~ɂ�8Q��եN�8�G�E
��ћ�7߹��sh�i�bT�	�^1V�9�X�6((W:�9z֠,|n Atj�z{#b�EN�oTq�^Z�,65�-���h@��I�a�+b���z8�U/�l�*�t�c�[X�q��~uhX�~����Z^���A��O��XR�r�=�^wB��T�g͝t��o�+M��L���l�Z�x��r #�Y8}ؐ�plWW�ӷ�WP
yE=G��C��
���i
!xk�V����)��K�¨�z5�_�go�>]��ż�.���n
U .�`�f�V%{�#jC��n����j`t �?�-���נ�#�P�]�C��wT5JV�wn:�A#:>��J�qY�'�2�>s��y\�b	��0�L�V��i_a���Pm	u౭�L�U��MO\(�2�߹rË[%"�����zŒ����t�>�l�Ժ�R�@B�&f�.em�[JI "�ΦdʙNM���ZB���Գ
o�xw���K@8�r/Y�U�{�#�V1�e}���m9d)�܅��MvYA��h5kf��]�XսJ-8�?p��j�z��wj���2��K�4Rtu�S&w-fr�O6����Eؓ�8�H^T��.H�:'��iCB,�|�`�@nRS+�=5-O�A����B�����l.]C,�����t��e�w\��ٲO6��%:k4wt+��n���jrfZ�k�����[1�&�l�j�F��XM�Bn]���IGU�bU�����Qk��~69�e�;tI9�~�0�S�#�(���0��<��jCST9�v�����PU���e��}+e�rZ0��~��:�u����&�O��lY�G�n{������[�M�Tdo���4�y����ь
�BQ�#��UsuQ��.e��>abJ����
�~o󀦓`�:	��{��p�V�E*P�:a��Ⱥ��:-]���^� Mm��eMV��K�ۆ��}),�Wx67+;�M`��Rϡ��В�G�+z�/N��0�Z�ƭ>�^��pj:Yu�W�YR�Vu��栎�먼�js�
r<!�73�M[�u
UY�G�J)�j�aq��qӊ�P{��9��ըꞦ[6h
ߵ�*÷z$n�J�C=���el�j�'5�H"|�7Q���j���	�P9�X?.�-��Y�1�i�ͥ��
<�7�Z��А���ik�u�qC���y
��ݨA�:�Z'w�VRcd�#�V����u��bC.+~�x��qEo�WՐ��nu����ԢIT��#�j�KV5��JZ/Y�utID�gc��X50+�g�i�ͮz���O}b�D���C�0Z�
J2��f��*74s�6p,����]u��8�.V�g�8M�I�m��o=6p��%���S`Edd�!��wi� ��1�2�R��W��#��+z(���u
\[J]TW[�>�*΂-Y����fJ�lou/h�C�ɪ(*��oU�A�Sb�a�x��ca��Ϣ��\xv��M{�;�&����`FQ; �;6l���'�4��#.�7�lB�Y\$({�r�YyM�W�hXQ�m>�,�FTy���`>�_?_p�dE����V�n�vS���9��Y4�0_�s��,��fp$uS�$uy宋��OT>�(��P�����te�b�
����4t�x��=vARP=���q�{:���LgK�]Rt*��j�Z�9���<���܊=��:���MɌe��%u�S��*��8Uи:-D��M����#U�����_�'j��d
F�j�A�sw�4����歀.l�R��R	)�D���@P�F����|����
E�h�ڤLz�|����\J�2���Unp�RƎ��>����"�����}N
�l��h\&
�T7L��䔻nt��Ces�
�"��z�u׊���@D���fXN4u`�3�w��%�T�BS��3J�MEwJ*��]�:�г�蕍�@�Z4�v�t�4���TK�]��ْ��+z��NS1|��4˧̛Z=��h������3�Y3��:�‰C]�m6��;���`!���T��qEߍ�)�@���Q�o�ue�V�͚-�[HC�Yը���ʒ��H�^F��-(@�d�؎��_��ƒA�%��Jd�h��}��T3�	m�<
���M���QUr!<�Ô櫖/�@R�Ru��Y�U"��b��k:�*�&�5w"������,J�/p�SU��H3�#YO���U�s�=�#pd���m^S{H�5�`gGW��6��(��{��qE�u�=�*�A7�'��%5��o�|�J�˺#R.�jƗ���F��j�[*񭪾�j�]��N��]Y���e`L��Q����D�\��1v;�7Qy�*ئ��!�F)b�ۓ��j׺���m9��"�h�c)��P�5`�Ag!i�J+�,34��Z��Ǘ
�P��ƺ��ҡ~��T��F�MY�^���roU��3*G��!O����dT�K4��i�ӂ*	Y�ދ���9��^5|D�
�`Yxq�H/�au���W�U�c���ML��7�Gl�8JrF#�Z�C�\���V}+@:6V�5��-S�yu�1�@����	Ꙩk�]���6�5�����;;4����^�[r�4)��ſJ7���E��V���l>�����)��6��]4064gy�����?��4���쨙oK�}dX�:<G�ں2̒.��0V�oE��1�U7�V]���x
M��D���G��Иp�Uo�
��3�!�����M�G����,}TS0Ƭ��=>FI�Bܩ��]+z�P��	�z���
H�k�	
H�����4������!�@Y	G�⩙)�=�v�,��3����yM��i�Ѡf���+ϙj�^x��V����C(�C�6��띗&hT�����l{�V5[�b���q��UW=%=T��bwT͗����hqK�xah���ȡw����]�0�V�jA��U&�:B����XO�We��RU��:�R��sC��rU+�ϏѺ��%uK�;v���i}'0�(\u��=6z�BSw�?��F��`M}V"�f�Ԡ�*V�7�O�U��e$���Y���m�xT'��Uz��&@�#J}�4��.�ؙȤ����� �?�`s?<��Õ��S�x힝Q����P舦�t���8������
��@r��P�o���|���7A�ǞD��R��U�"�`!0�=�Le�<D�ȟ/�5T��q��EZ�;���P9��U�C1�xSK`�Q�<�qjN��&��؍hC�s�kU�m���4a|4u��J+Ĥ4X'Mr)�@�:>��K����S���q���#�VP����m��1�Sn��}��ҷ�E>�]�׬^�כGPl��:��=�I9�K���n�B�4�`���j�]���ZP��;�ĩ#���5���Lӽ��X�����w`gtu>]PZ�xh5�q�5Z�&���KpU�*u_����%9�`d�z���b�ͪv��޻V�aU~�c(e���r5�dh$i�P*x9��D��k��GBlԡkJ��j���Y-W�l,���^�,4R��lׅ���D���]t��̹�ˀuNk��u������̄��P~a�Ӏ_k�$5��Zd/����Kh>�-k���]�mVj�m������D����W��BԶ�X�S{e���GF�IU^]	
4˫?@7���K�%�_�枕�_��9�Ԝl�>ܔ���i���JSG��d��v������ʂ���g巪����2���D\׬
�[q��QO0\@h`a���u����uPX�&��=����f9��ᇦ:�ۢYv�_RC�V�Jx�-���[\\Pթ��TO�at)x�q��CR6"�f*Jy��*�βj]���]���m
v�Y�m0�V� ��8��n,��6��R���]Ws�A*�TtI�
����ze�^�v(4�x��(���7��(r9�a} 8����N���M���ht���9;m%��)|��Vq�njE�4�D�b�[{�\�&�R�ʜ�H�}+W+I3��B�I��]OW�u��ҜQ�j	�Z[p�-Q���Pt��Bn&^���b��M9���F�.��Q��X��k�'ʪ#Z�ੳx�|��j��]+z`�K�X��Љ�F�)�5�1��V��%�#_�	���:Դ�T�jT��dv�!1��.�����oa��	-b[J=�X��t׊�	{�{E9*A�5	#*���o�nЁ�KmѦ\�d#�����)�˫HUi��]��w5�C��س;��D�5���|�6;z�D���3v��h���:V#�C�,��gzB�/f[���p:ƆVyg�����r�S��V ��4��C)X�"f���7̠1���U�3R�G���
�~���[�
Pj��<rv&��*TK~-�H�{VM�T�;S@8ҁ�)����
�.%VT�Z�j9�����:��1�k����>�����ɫ>@��Zc����.6�YN[y�G)u�(PԲ�#���U�zU)�V�yn����	�&�\�+W�UcU�I[8�D4B�w��R����Q�
F�:r ����ꄦ�E���\7*z�ʆ�g�
~Ӟ�Qy@=�����ȜBT5�]+z�`u����M1g}D��) M#f�u�$8]%��6\1�vjN�;�2>���ƪC5/A��&�=���!4b������E~�qEo��	6���3���l����R����	���FGFM{+%���qɩ=��i�η5| ��ӭn�Z/���d�̚
���"��Q~�`fu&��ĩB����c� ���TW�!}�\Oy�50>��P[uR��ș����E��͙-�$���&{��_ݤv��S}�bǬ��Y�f[��hSoJW�PA�\Z�A�4�k��և����n׽zX���hl����d���ԫ6�sF1�fo}\�����6����נ�7���h��Ԫ*��HW�&p���4�f3��� Z�QU���67n�3��k�A�1$55��ܵ���LY�a�/j0��::��`襞�j�|̦�]}Q"TMݦc����$�pMV}>a�(E
?7�Srt�D$Xl����z53��`PQM~v.5R�죞a����*%�:�JH����hY]UG�|����)
 �\5�@�R@F���L��x�@?Dg�Z���D+����U�s6d�5�Wt�W%#�Xke+�4ڴ�"�y�)��L=9�~�&
(��S��ێ�S!÷"�mՓ�&��x9����D�J��ƭؘ{V?J�<���1u���������[�	9�*0�=�t����ض��r�qL��j�:_
j�sۊ�nu5���c�}Z���7:�Ÿ�Q؋�Pw��=���}�Tvj�hI�tcPsq�7hDS���ᬆ�]כ�/g_��qE0��
�b�:?���U��!~2�$�
���眃>�U0�1J�am�4иեNa.@���X��)B�U���U8���͌��衱ٚ��lZ:G-�i�4L~���m���y����'��>†5�[�N�g��k�����"�1��U�00�r]ȍ����1�+z���QWL�����I��I��u��S����Pc�طA���(����G�*�%/ؕ��4rze5z�ej8�լ�5��#ȏ+z��,��=�	iS�2c։�
�u��>9*�Y�IT��T����s�k�x\�k�Q�I�[c �ZiFY�S7��Ue'j��M$6������6@���\��4yJjP�WMXZi&N��е1$LՇ�f�Q�}*] vpz�'Dg�E
vWɒ��i�W=&��e˫�[W�0A7D�l�"��~�[!!\��&�٘%�q�z�)����:y��	�Df���Q-�ccة(�CR�11
DpDb�N�J7���ˉ�^����:�h�T�!k�Ug��f�� �z;�?�\�aQ� �ut\����[���3``�j���\�.t��KF'6�y���b_%ʣO�|�(����p}y����78c3�<At� l
�BG.BDzLP�KV���Ʀ�d5K1�W��r��z.ܵ���f���e��p@v���n��@ l�U.Q�-G����Lu��w������tx�ŵU_Ua�6z�U߮�"�u��T�p�Jˍ�pϊ/'V�m~�h��
���k�L)�J���K��\���?�U n�9%�0Z�5<$ihlt��4t�������u���Ҧ�M���r��̗���e�h�~�˟�����!���u�������0[�h���[�ͱ��F3x������T���i�n��ܵ��N�/U�o�=�x�-i[I���z(o�jX����&�"F�é�oQߢ{(%�lQ׆��Iz2%���~�AÓ�
p�=!q��FХ�ռ��,ZH�
ʋ����8�(��L�
����j� IS?F�Bo4�v�|L�݃
�5�{���]��P��Y�tK=�1�M���U|����;t4��Q5�^�n�.@��V�5�;J�p38���0~�^��)Q�n���u�Z\�qEE�&+�k�P�:M���@8���\\v����"�	:�)9ew�]ls��[�
��'�:����{>�cd�p����ط���]�
����}EL{�
:( �`�-ˋ��IQ�	�UFw:W�ΆBfMwQ��z��nD�����jo6�,��g�W�P�kJq��������Mvs��]��Vm��8��t*���]j^.|m�
�Ԇ^�s�V�C665;�+�@��N�j�U�qE�7�E-fH�x�T�-�5���Q7K,���D}G�:%�:kPڷU)��e]%Eu_������c���%��ښ��Qyou@}�Z�Cǃ��o��;�f���C�US1��N��èuO���SO)���hP���qu���C�\�#%�XU�5��@/6t�-�����
A�&3T7�n���(�N^��Qu� �L��T�{�0 �Ve�Q˚�1�Z�v�sm!��D�YӨ3g��ߢn�1�kE�N4�PGl@5&�Q����0���*p���AE0n���	��1��[xH��T�V�	�7��ȣ�I�@D�`mv�EZ�qE�.���h��%P�ky|}����*/j[o�S�ֆz^����ZsgM��B��x��Wg��<ld�PLL�MQ�>ۮ�;#�EZ�qE�.�g|�=��A�������qu�w!/8��S]kS���!����0��ĝ�����
���=KV���ک�Ʀ���1�T�ZS�N"��-�r�kަsm��"�Wv_�}���@u~gMd蚧�kG:7�Gɿ�Ec��b�5!oWV��a�7E��]�>�jQȏKz�w�(��Jw�xd�E
����ѭ�*�"&=�V��
��U�6�B�zͨ���H��ٙ="�	�bRJb3�k����� 5ܫQNS��jJL��AԀ
�<��vu�e)C���j_��3	�G	0a���P�iN=��1�x��k����W]���f?��atf3&�]U�/���
yP����15���Y��;H[��(d�elW��d���WbdX��Խ�6��?=����]���d���ꥦu�W�԰�{�^��H����V�i:o �.5nQu��߹��$/ObS�z1�ɣ0��zbdC7�]+z�Ƣ�2�W{SJ�J������an�E+{�Xߚ\����ZD�z�^1,Ł=�
J�|@�
7�ʙ�V���a�&jf�M�6������Y"Ѱh�T����#D�u�_�+�'���3��.c=��1�;0hk�6`c�(f��Q�Q�gd<��s�Z�"��/^sc��]5���%�+{s�4�\M��h(�/�4u�͡�C��Uc�ptM��%g�T����X�]�
W��Gr?]�C+��
�ͫa��E�4c���q�:<t
��ժ���k�FD%C=�� ��t�L��9CÓ������j%��=�'��M��[�1�k��I`I`��م�P��Uj.���tԄ4[���֒]H�d�-2XN
l�(���ֻ�b�P櫉i?��ݠ��Ls��#�*a!O��*版�S�m�����j?�����3=����/��:Nũ]�KQ(�0�q%�Z�|��~~v��=����WK�)����=U�ʸ	=�����z����t��qYj؟zU��.
{�K�
VW�q�8U�$\%��� J�ھ��2bU�*Q�3�u�TM��5�$���98�-�:�i��з���:Rv`4u��<h�I閎�Ԭ�z5Iҡlq�?@BUd�x�x���S����L�W��l�jT���V,Cc��+uu�G�z��j]��4�!X�(�A����
ol�ҦḄ���S�>��-Ž=�����F���T~����*-]F���y�sj4U}-�zLi����&R���Z�d&*��IZ\*��.辘}�qE
чJ�`�h�yuP<�$R�HH��jT:�b��pϨ��~b���(i
��XM5.JaU�LH{�.I�5�9)�)�.����h��Kj�t�z����W����G8
���[k�e�!�]R�A(�/�6id*G��9+Mu�O�L	�Tn4MC�A�謿)�+
|u�8�=��(�qZ�?�U�BVY&�Q?zۚzmo⍺����HU9�pT�z<���
l��1J��QK�:c�@��|qۊ޼7�oF�4�1�"�y�ٺu�5�"ٸ��F�4D�/�

�zA���*b��	X���T��J����Jk�mW;Faf��S�=g�71���{�B�����E`�F�a�Y
��fO�tȍ�Ł�[5Z=.�4�����B�����0'�nTu���E�)�j�J
N�8�{��ɽ�Zpt���4m\����&s`|8�̩��%^���hv`�*-PMw֕�F�m�ʑ/�0��
3�%�z�/����}gX�K7������&?m�

2J���^�n�/R;j<�����8x�	j-]�tC��\:R��)����BQ�t��u�:�ڰ\Փ��w��l������X��Xj��DgU��NU����K����'��b��Ig"l�Հz[M аph`U�`��mV5�S�Ì9�]��O��^���OדE�4��������O8
:�:
�}�=�\�E�o�{J
u;�VXN�l@h��e�V�
q����! ��_�xT���$��eݠ~'���@�l!ԙhx�j��s�whªKY%$])��k��Pc<5PQ♈�Rc���X�x",x`�(�ڐ)_\<18�-��'���_�3.J�j���e�7�2
�Н��R�1X73���Zt]9i�`S;�.��Н'��e'�{��U�TC@��.ۚ�	��/�O�ϖ�8���'<�k-���8
�kZ����՜U�A֦FbD%�XMPt�
�j����V<���GG���;�RVcLX"�ڒ�ٓ�ϖ�8�B�L�.fH����_@��@�<�BD�q(�D	�[�K�bٺ�ռ��C'�īj�m,!
��ت_��xҬ�?	���s�f\@�Tf�f�Jo
���)���_���b�W��C��}��4��Wްl�a�&.��=f�`�q�Z�Qї6@�MT~�̝�z���O�� ��陰%�!�V�S��c��ss����&$t
��f��18㼐+�.9��[��p�G�3
�X�8́�sY�;�3����Z�^! ��B��&�KQ�1rT�9�j�U���3X^}7�Y3*���Ք��[�`[�+LIzj��Հ`����B	�rbvh��&	�
�{��x�JHv(#G��ު.w�&%��a��Ա
$Ҍ���G}�Q-�i1lfS�\k&�E��5J[�Y6��FU�9J�V�M �F��Щ���%��Mt9#�u���ڭ �`(�L�I��8?�h
�^VU�����5N2l���Y�~��Sf������5�D��S��UVєG�B��0�wu���DeըvLPbE1�H-U�nս�=+�$�G,�EAv���
�+?]Z�٢�`�����~��4Y��R+��vT����uW��2�h"��l6ip���-Ve���Ϭ����8�R{��v�(�D��Y�-�:m_�|Y�Uy�2td���g��p#�V:��A(�,�)�`�U+%O9��G
��A��j=����h���0�y�e�t�DkR�=Z�t����h�˿�A+CR�U]p���XZDW�,���GTϚ-���b��z��Y�T�PsԚvU��$�[s�T:�6,4�
�4�z��� (�_��U=:���oLj�k4Ϛ%L|.%෇Zz�55�鶚�U<���F\������CɴӉm��p���թ�/ބ�2�(��Řu��wNpL��l�t��U�b*"(��oXQ(S�$D5�j���wP��[,�������T	��HV�j^�c������5i.TU=�oX���]M�b������������v���4m�`0+��ҧ���T6��X��O)�Ci�M�
���?="�Ђ���5=�
"Q�ʆ�l�<v"�Tu�^jd�!��G���Ŋ{,���Q���D)I���4ئ��B|8���Z��⦩~�4����R$z���O�.JT���04�)</��1�#כ��B1"�é;.<Ll�j��Ӂ���Ԣh/�xT{Z��8 TY�`c���S��{�lj�+!�cESMw�`�Z�-���.۠c�l24"��%�&�[�ux;���(�(hG
l_sk���5!�n�1��u��_�Kg�z�V�d�&(�f+L}-�:��{8����7�[pfY��Y��g�k��P�����e���J�h�bS����>�����E������t~�s�Y�+����iXgԩP(v���LnVT'Q��V��!�N �~i �eiN3Ȥ�%da��
8���[/B��E=�ߚ
�ఀo_�	�K�q��m�^�,�um��yU�W�o��]�7Hw��LQm�1�mt5R4�4e�Z�v`]���g������gJ��#��Ћ�м�b�"U4Ӂ�W�p�A��FBh��F�`2�dui���.�X*<SU���ס{Z�i��E��Z`)�^4V���nq�®@A���뺦u��C}�!�hk��͛��_���U����]ǭ63jYU�Y9}V�We���`S'q��ٓ���daX#u����x��5��h�H�65�պ��dݧ��A�jz�9+iV��EV�׶����uC+�h+Ľ�i?,�qX������V�
�Qƺ�����e�����CKU�53E���������G�֨
��L�خ���DD�gW9H��;��x��
6UKQ+�h�r��x5C�e󆺶�� dz,��kZ�2W��Dyr�!�1�n痭Un�&	���P橜�lQѣ��c���6��dQ�����%�	����0�zꐐ��f	|�K=C{�ȁGS�pim]ŭ�5�Tm�]��`%z���� �ˋ>�WO�O�8��;u�^`��3b���޿74TW< D���ď�"��9ߙ�X��>�P�K9��骪)��\=
P�?��h��l�q�Y�j=��O @K'MÅ�2',I�,T�P�݅�՞����o�p�U���v��tI��ˎ��8a�"v�Yo���`i�g{�$���컂�~=Z�h�X�ע{
�=�~���+�ޱ]��we@�q���7��T
¯"�5&ˀ�4�I6��P��[6�>\lf �e�6��/*w�8�S7���1��V�G^%n^�3�Ct���I:���*�+A15��[�!��f�5hZM��*����ϧ`>Y�C��p50��1V����=���V��Tgҏ�YsŖ�Q�M��e�k<VP�m�Vx}���j,D��E��+�X�EQo���r�Y�C�o���Ǚզ4�TԠ�����Q��k���pj(�5(ǔ�eD�Ƚ�euij5�BPnm�oMiQ��P��dU�7,]�Jn����i�X�w�mE�/ً��Zc�B!n�/{v�j���n82uiN�8{k�(Lb�
�4��ly��
��D
s��VvP��޳���l�c�
�����v��j�w��\z���t��>��/+��f9^F�493�Q�F�yv�`��Α��O����U�M�\�͖uN���)�[�VS�
:X��<�ѥ�Kj�
��쉳Kq�B|<AɄR5�[�3�}ϟ����
%�YMeM��P�ȫ�{^�������L,�(�tN]�A�w{�R���������[5�:D6E�옃�6�DW_�,j�Ω2kB_����xϫ�Ҫ�
s�U��<�uX0�>5����ld3�􃅀@!V�,|�dB�����<����[���1h�D�$��b�e�7�+ꞷ��so���ı��Z����q|���=��N������v��լɠֻ�
Cx�J��O� &�8h�+�*��
�J�v�l^�L�qsț(�x���:P@I�rR���4	��`���5Ro�9��;��I�n�z����j;$yze�������;���8w��N%|w�7�1j=��}�K��P��7��	���?Y&━�u������셞��e�U�J�!Xv�����8|����M�,V���d�t�ߧ�z8��j�A��Bbj6��`o��"Z���_퓚1M�����@�= 9��2�D��b*iv�E{���X�T���	O�_%���5 ��O-ϖ�pėW�՗�k���bC���^S^�Z�.�#���q��8"���9�V)�FgpA%�j��E㳭�X��+#ڣ���Q���7��lY��|"k���1��&.��X�@�[y��l9�*�31�"�o�_��+M��7m���+��IWBB�S�|�ۗ@�E33
�hW50��e<�M]�@@wN����`�����hK
��{�
Z���F�����!����:�%�tf$(�mLrm�b�C�p����~�\s��J�W�=�zC�ɪU�f���p��������Y�W���H��[&�8J1�����7���Q�:
��
���	�US��n�r��7REMR5��Y�rV�ž�x���2&&��Н�JsqyI��T��&��@�h�v�k���i��`J�����9����-��R�ʰ�vH�ؒ\5��w�	����넰����܃����
Mg���ú�����5M�3aF�O'�}d
l�X��?[��	&JW�3��XP�`;�aD���Vΰ�6AH��P�dY*��[�X�&h6�2�1k�h��=#�#�I���@fTO�;e�\��e=�af[G��t�J*�7���X��'VҤ��*T���>HA
~.��L�8�>�e4�|,Jpd�������0�h���0�u�z1��tY���ꩤ�٨�$��»�UB�|$v�����un������pŨ�Y^���I�ZE�rT�1���BQė���q��Dxr���F�$~t�tSm��r[�����>����sO��WA�s:
�7�Ci��=[l4	޵4k��a�"�����W�� “�L5J.�{L@V�)P�/;��1�={�P�ѫ�Q�P�Y8��5��PM祫QQ��A�ڰ���{�!�%�H�5���u���U�
w.��,Ө���+m>n�;�䢷ҍ�f���+\�x�v�{*ܽڴߎ��@@G8��ŷhl��N�-br�bqG%�E��J,6�zϲO3�x�ׅ�ʺ��C�V���5]s�5o�S
Rа��i�a.H6<��Bu&��	���#��S��ڈjRЅϦ��6�F=�g���yO`��)���: UV�5@P
�4lg�$�U�k��kL3j�u��^
�]���M�2#̕�����N�t���C���U��4�^���S��X�C
P4�k�B�Ȭ��˾�ۡ3(b��.�>Q;'&
Su�pq&4L�1LK��ս����=�(
��*�ŭid��t�~�U���F�h�ӫMrY��q+A�Tٖ�]2��[�YM�?�k�7n��RT��v�F�i��K79��SMt`��T�`d5���f[
��[Y�Ѳr�Q٠��*a
꨼�-�gL"0���R�g+ۧ�����Y��%5S�h{���|
�~E����Գ��*��Z��ڠF�B��r���cb,��!�GW���m�F�FW�k|Mа͡�L���F�Rj�%���}\�Cv*�����ëy����_��UP�{I�ίNҚg��Mv��5���%�u�V�\M�U}�Po���V�f�*�j�j-��MT�-�A'�DXGV�1H\e�[�9΍�.Go	*J��B��:P�U�v����
���ިi�x�d��F�uUܻZǾ�:Η��0�aYFU'#U�{��д6%��ݮ.6�B���to^
�á�z�ُ����&(���Sµ�w�j�RM�j�b�4��������
*M5�'�{T�aӀ#�8[ym�4ہKs�b�Isas_��Id!��A=�
�9�&������J�l�&d�fs���O���c�V�7[�"��nF�y�Ch
���#����xS����m�{���Z�r��(�m�F(9G�
.�/�?5�K�ĕ��"�8]ֻy�����6��4�+J:��q~V�*�z���!��!�טT�}4`ī(=��ch��:4�uBzս�1t58¡fc���?�}�	�/��*�f
�uн���@O)k����%:ť��;�c��͵H(��
WQ�k�ɫ!`�p@�U�ɉ������)VƦAY�Y�#��u^�fL�L����x{t��E�2����^�%��F��A�p�(j{��)��' ��!���e��ҁ�������ZUk�yl�ŷ�G}`Ly٣�Ԣ�#���R��h`*&A�Ǯ����~E�尙��k�CC� �\�K��EtuB��0�_]�JX�j��/�|\�8�h��5�	u���:AP��F"
4�x}d�~��������A�4����ԥ	CFW��S�'@F���;�6m��ޱOW�F��qH�jTr�n(�FeU�֔))�Zc�V�񒺖�FJ�e�w��Z�T�T��bm�p������τR��Ms����;��z��O�x7��#8y� ո����tVM�ă\�U��ޮ�BXի���C��b��a��B�����S*�-��Ӎ힮����;��q�}�<%��:��G
�'��Q����'�i���1��&��yZ���D��?jJ3�NJ'�s��
�+@X��t|\Qz��:�l�x5���T��î	�Ȗ}3W����v�\J�K۫�[Zc%��S����C�G���I�{x2�V���漄�ΦMx:�P�6૩,;>�u�K�2� ��Ĭ�;l8�<���MU
BP���kl�`�6�Hk����=�BX��i�n|a����x���ꆱ�.qC�X�E�ڛ��H�1�����]⺻���xV�ʀx|��fx���V��xw�qE�Q�W���9uujҌb0��Zgx1���`��[{c�jM�24��5�>:1(��X]��6��D�c���*
18��*��&�Z��qEo��
��1����X�C�3���Z�Ǡ�[�u�Q(	�$8�IꢊəV5(F(O%��L�:�x�pL�uV����z��{Vޡ��炐�mu�������V����j�Y
����:�u�p5����#�.����YI��EY�9+����~�%u�������g���@f�JX�$�q�lя��NM٢)5�)(j��e�x/���߭z�V
��ʼD�_���R	������-1Z�]TJ��_�o��;��g@8����d��[|תF)��!���=~��!U������31W��CW��.����6�ߩ27��� ,��Z���ݵ�7;�G��\�	����H�[�kp�5�ϩ.t�պ���8�_]D���}b-ʩW_y5�0��cM��v��-���\Y����VO�T��KP�4�u(m�T�z8,�'��e���+�:�Fjxe��<�
�o�;���&e�Gt?'�M������vh_�/�O~֝�6?��v{��	���f�Z$���p��e���	5��Yf74��u��^}��r���Ec�=�I�[�
5����d?]��S�c�ϯӂ��\���x���ಔ���۠��Gئd�S&8�*���Z�x��eU�A�fO�C���S�<���s���s矮�-i_|���<L�(�5��S4����V��XH���]
�Rct[�&�
�
�f�W��U���h��T3t�@�5��i�?}֝=���8�ƶ�B�8���Ww*%��cМȾ�P�>�#���J���������T%�U���q�k,��Y��5�z�|h���Sڟ��-��u�&���f�{욊�2XBŸN9Q�&�w�K��[��S�Z! �aTC4�&�k��p�1�TY�A�V�$���^�X��Z�iwv����x|s�0�d�<�р;%����Z�����̹ǣ�0�4!P�b�Q�|5��khn����:��«O�ZN�׈€79����Dm��6�%��Nݵ�
0^�_xk]rj$"j����V�(��V�hW���i�KR�sk���(��(�g���bΛ`�cwv�0X��Jǂ���6Q{������"�4�=-�ޔ"�9H��ւ5y�̱����[�5�aUsm5J��v�=�	�@�(�sC����+�W���
`���)�6����D�t#�t
�
9F�ܥߣ�h�nhS<P�٬�'ǿjV�a�7�������5��^�ӫ�U�� y��YͿv6u4/���z'�ut@8�g���*`��na��O�^�ب��h��u�L��W�|֝}�5-?����U��58B�9ԛi�8@e�R,�{*6��ArV��j����S�@�^�]�2�]uUP��H��ʷi�"��x��2`R��>h
MG�Fq K]mi�e	;W�󡎾���Bo�n���#�jx���"o����^U��(�@�o
����1�!�P��Q��@�YG'�a�":�����5�
qS��XԏD���[K>�w������5�7��ׁ�jʩ
*7�kESqm��|?�|�U{/enm
��Ԛ�5S��9�F�m�F��u�Xtu��=U�[�H�^�4x�֍��5�"��ɳM8��u�-�7���<T>z�[]T���4"�y�1f�Ue���	ZG��x8��00��F����C�#vh^J�6���;���L먑�;�^jּ��Z �V���Af��ؖ�n����U��k��a��p���3 ���S�k��$�=��oPʹ2Z�Z�[���В���U��V=Ɏ30��U�M|_:QSNx'��8
�α*��wE���`瘬S�v�V
\�ʪ�Sp��h�H��0`�W�?�ήZu���Tfk���,j
�M.��BG��"�k� ���
]��&����꺙h�r�'�����#����gF�7�]>vg�t�R������H\p�����y=���C';��=�j�
��D5��*j��]
��1�žB� �H�V�����Z�Ep��R�t��؝����l��=�q
��3��7�t�)6�Ar��ڢmQ��ST�if�WBv���չ�j5:R���NԨ�jB���	)���f�?=����;C:�
�%e�e��aGj
f-��!����@u��Ț45��)�V��'3j|�GP���$4���N�aB��R>�>���Z�C�մ���o���Q���/^�\��Q���vF�3��:�걿u{�Vl���U�\4�8��J�D
��zT�f�
 �Ħ���cwvu��
�$(y�1)Ѱ���׹���K�v����0wLJ�)�:Eə�4w���T/�t�9�C�o'���H0���00��|�cwv�;��l}T5���N-u.S�Toʮ	��E��R[
&䍻f��a�J�o�3�O3�~G��HA����E�E^ERxq�r׊��؍�ё�����$JS�u/ug��=.@�)j��"�19/Le�V��ʠ�*O�A��zj��:�g�r����)n٣'�ٻQSX�또��w��!�!�J
��#�N7��m��hA�w-5Y�����A�����-`S�cA��VA�'k8DW�]D���e�X����k³n
d�8	|Im'�0��>:���1E����T�d5�8r���\�R�z�N�n�V6�7č(�����Б�4��@0�Z�
Hl�:vj���h{��+}��D������@�(�fԦk67�G+��^���GC���zp�W+U?��͠��ϡ>.�mm��cQ��J��@��Ny�(R�$5|������Ur�])�uB=MP�:~�*Ҋ�
�;U=�tNa���ٯv��78��L���xW��!�:z�5�LS��*��8�����=��k��je�ީ���54y�ٯ��OF֪�z&���%��ߵ��"}�� �h�1�h���HtE��0?�ٰ�f�r�)�]u������T��>��T��V�|��M+�c��͊�^5��=��E�m7ꚗ��T��Q����^K���s�n����ʷ���Ů�je	 �ꚠN{^mU�*o��
��V�gp���ϼF�]+z�C�HCHL�6���Ԟ<�l]ꚭ6�k�y�cwj�����l5�ch`���He�1�ke��l���pr�R3���Rqӄ�ڋ��W�Xb�2�^��F��"���ص�Ý]��n;xπL8��D�&d�������ȆSQ{�L����{54�U�PVG��u#�kES5�%�0ê�!LA��4�E3��~�nN�_)lN}
K��u,���R�������:�6�@⫂��$0O�@��ET��^-����{�	��"C6�PtیVr�A�Q�n��7F�n�Tϫ�l�u����~F#�&F%h��35\GCQM5�^���p1'���I�}
�-gRzf_3�Y�e�t���{ܵ������|J8_�0��euЅ!X͋0���l�c�8I}�� ���W]�u�65�9�W������{�	.P�ġ�=�
�"X�jg�A�jd�=H�QBh���崚�Z�O�^�jAnTZ�5�8-����[nly�hZ���OW��K��kMy*u�+A�	�OIY��c�K�Bx������4��w�	�C󢈱�\(�
5ݯW(��/U�i�r	���M��x�Ub�R��6j46�g�]�~��:��X���q����{o�}�ڬd˪�V-�� �A�i5X���fZ�8�8Hݓ�U�M��Iڵ�BN���p�	['*�gL%��rm����+��[j�]\�i
{���id�n4�3�n���=;�G�.�!R���
an
̚�<Q�����k�Њ�bPj"�S���_4,(L��>C�9����%�\�� �@B P�a!�3�i���tG���=ܻx�%�r��)_�	���TO�=([]F���&��qH����:�l�؀�/>�h4�Kͷ������ۡ�/�C᏶��MP��ޥ�lw� =�/!�ע��c] EͦQStL�০6`��r����Q�Α��Y�����Z��֥��7�)��QM�c�h6��=�ֱ:%����'����{PS�u�|kB�qq�_P���tJ�וzWs�P*��6w��$�S�E<��Qب�����Pֲ�
��]��IpXB���]m�4T�ou5�j��xk���3����]�NC��b&�z�M�@z#��F����%Kr��|�a��p�w"!)�!9�?ky�H�:�����]��Ɍˆ;`�j0SU�1�Gax�f.�@��z�x�w)C�"�o�6tݲ�e���8*�8�U���e�SR��2�MW>,���(�`�j���B���?L�m���JdV<+���޻\*���qb���i]ǩ�q7���d$v��j���'��������v�B;�GV%�Y
���N=���-�SFT�kE6<�$q����
��~U���=�n;��y�'<���1=q�tf�7H��a�EJ�^+*�;d�AKŭ��S��%NpU�k��_�襳��3N��q�T�9�5�%�r���qץ �����n�e^�TOH���W���I.��s�	N���xvoJ�X޵���ҽ.�?�9��urp�� �(�
�
��W=�:�ؒ㱜�#��K�S�]�g.m�I��N�����\{Z]R$�m��#��5ʭ��:�ؚ�I�=�# wk�H�z�~e�\�1=����<xQS��s\*޶�܇�@���?���PK��IS�m����(�E�FZw�y0W�\�18g��l���zؓp�L����3�_�)�#C*���08�)�^��?
�����՛��\�������!�^�^�9�z�Ӂc�򄫚ny��#��k�GQ9����VP�]/���
�Ϊ��.k(��	�"V�M���e;�{M������w��3�ij�S.�q�"Noa��و��O��+���켵j�鉰w^��aL�c�[�������fw�4�=�m����E�M6�ν*a\A�T/؋n$`8�n��$�m��@�����":���ꅠ]���Z �����7�/����{m�`�r���?T�&��t�6U�j����HTހ�F������Y��=\eB��~+��O�k���^�*V��\��𛋗�WY��].���Z QU�KO\k^�~���Sƒz�Z�4<���Ĥl��}78������Id��`���_Ĭ�,���4���������Kae�#�P���O�^��y��S-�λ~pjxqD���Xg���'�d��^JM�Cӌ�����>Y�"R�� j��M���x脨�M-k�H��S*�	?����xQy�I��7���dRټn���<G��^���o�����E�ɒ> �P���.Rpf�V~"�k�Ӎ���A:�m��`�g20���w��
M3ܚ+��S$`[�HB�ak_����s|��n?Y�&���O��5�K�
��nt������@�-$U�3g7�N���~�Qo@�'��L@�i�[�.�*5�e�`_���dI��>Ɂ����F����S?���7��]��~|��k��=,j<��r.�
J���c��.����
��!~�	d�_�+�dI/��|�����v9U©���B2��J0�'Ȗ���^������*�x��%/ϰ ��#�^f�CH<p��_��1;��%}Ql�v}�@4�sB��.���8�r����{75�9�Nbu/4��u$�uwV�5�����F�H�U���̑}�Yz����h7"lS4w�f�"�k��K��ClD��jӋ'=�O�2cX
ֻo)ΚS�$~"�/��8G�����6^��I��}��:�u=;'���m�U���V���ײY�i���n�d�������SYCGg�=+�o6���������}�j_lT#9�֞��\Zs���
��؈2Kurg�M�LE>�C�� b�V׋��"��:���و���@���yD��~�Z�\�
y�w0���F:+���<!��J��!�!A�m�7<I���,�|zE���,��/rM�J�q���Y�w�u)��.�6wW�|���%����x:;u���/�I+l���J��i؉�E�Ө!�54x�vC"y��9�S�
7��	�0}�7�^Y)([*���3	�u���°�R��{kf}:�̂jCӻ�<Kb�-�E�좛�#�{��c�M���j���9f�*d���#��C 	)�wŇ�k���OT�^Q>� O��Ծx�P�)�s�e���l0��1_��1�;t��8�o�1��MVR�g��NA%n'K�|�j7�'Kz����ـD�`LR�cDy*]śX�Uo�?T���5!�+k�Wgװ��#{��םP
�Gҥ���êC�X��y˩��Y���mK�@Ds��F�L�%�rk]��T�Ї��c���V�>?ݝ�P��w��&=x��p�ɘp��6aB֡
i�zFp���/��O�����?�3=�i����J��]���18�m_oj
ë�j(�l��\�y�ѩ���ؑ�
�*�/��kݐ��7>Yҋa��ة.��Uj+���G�߶ц%���I� xȐ`���Օ�m����L����Zfd�[yI6�Z0�"о�����k����DT�]1�c=m%lBۗX�]��;���;�_�f�O[�D`�&�z�~
�E��<T��d!T�����֊p�������z�rE#
��<Tz7�g����ȑ"�j�M�m�&�?��q+o|i��~M�����)v:�~8���y�p�В>�Zr���%����R��Tn��t)���)�;�j��$����gQm\��T��u�AQ��@x��[��0j��TM�Is�y���t�]�] �:��1����H�{�Ӛ\��k_+��"����(�*�q(4U��u=3���	�bۂO;�F��U�S�!O�•F�t�u�o�%}��L�A]!E�^D�ݎ�H2.V׮��B:��de���W'��T�P�nt&N~�^�L:Q��w$�,P,|���r�QU�m��A�� I��6�('�g�}�

�Ț��&�
G�@���((���Ǎ4��q��G���Tᐊ�B�_�ס�)��i[��[ҋ8�36�p�@`�۴^j�p|kO���O�\ӹ��I[d-���{'v��
8_�ܮ�h���nN��[5�td2�D���Uc�O��j��
-���źa��&��ٯ�BWν��k����CaO�!"�`���j_e+O̞O绚�k�q�<0΀Fp��I_���iI�w2*�K�S!�<�@Z�M���v���3�;B�p?m�Vl2=�Ü-�F<��@�+h���fa�ѣ�G���-�'Kz�;�n���јa9�x�Q�m=I���Ncڭ(�\Щ�
���.L��:O�#O�����o%4��rO��éAgҁ��o[�K�>�%E��\�"Ɲ]SC����#�_|?�#��%%:Vtt�B��&D�6�4��o'j�U̵��}T+�u�����Wg�cI���s_S�`�,x	$O��]}�Kz�ۃ��Ʋs��6^� W�fPΡ�O ��:A��$��l����� E���B<��o�^�����?�����+���[}���}*5ݼ贐� ��ֶ�<xqZ	��Y�	>|��U���[e��0 y:s�E�J���]����^l���6��)z\�>��C�
�0[*:�=��}�
��[f��,�E�p�s�:3qDzzz�A�im�<��o������'$���T��ۤ��5i�p?Tzй\W>G�o��5����,5wbv�;G��4������Z��3�l�%N���z��	�ڤ��Abih:�_ʇ�c���+0��ܩn,祺T��#{�K]�=�?�ic�l#�]��|�_��к�?�4_]ק�����/'�x�Ulؒ#�7a~_�眧!]'�7�Ѵ��i	��0�R�m�EʡB�0���	,��@[���g�<���a���z9_IAi8�r��e��ME:�#|�ț�t�����A���8�L�b�3>�o���2�IM�֎�Q<�&���	+��
�?}�^|�,N�ToM�F���ޗ�X�`�eۚ�y>�=�Lb#���o��ԫ
�\��.vYW����CIWLqK~��^�m���u}7�ո�i�4��Hb�X��u�����j�VG(S7�A/CQu�hv�+^��I��߿�S�0�r�_D�	N����O�ο������W��#螄���n�H2�
O}/O!�^v��uN�R����-Z�Mr^O=�?[��Ԋzb�CAD�P��p��{��zu  ْ���.�+/���vV�z��M��f^��0�.�Χf��g8�C����\�7�����fb͑c�=�ѐ��.yӺ^��	��f���T�Ԕ�u8?Xi�Z'*���!��f]��F��P�$�h�Ok��t��/�o��c ��~̋>zψ���_=Z�O���&P�tƾV8�=�I)�'�{E/Tt��K�ǖ���N�6���m�L�!x����-M�hK��a�0�ܻ6�o]�K(ld>��� �[a̭V�� $2o��]�ؓe��`]J*�Zj��/�x��t6&��������7}�^|#��w}5%��W�K�� ܧ.�5Y��-��	G�7�����>uu!������5�UY��8e�;�Hy���T��e]Mo}_�3��J�Ip|S ����e���$�l�!�=�q�{յ�҈�)�z��/�geִ͉�k7�|��{ʼ����J�_+��~]/3�P�7Z�U����?�����q��N@Wn��B�g�w5��ڡ-�'�V���ܥ�{�����v��=���-�$u����3:
�-g$B��F3�:�w����w�1h#�A��0���0���ֽ'�\�mJz�9��5P9�I���EHB�k�߮��9�������K�O�׈ẵd�/0�{!7'?n[̜����oX�o�}:�u�������)(�r��[s,�R?����߮����:�ch�x��~��mO�kOg�����2��>)�\b"�;�h��5�ng*�i�Z����G��3�Lj$D��{��g�@՜O�T
�k���6`P,�A�4�F�u��U�z!�Ca`��+��;�F��<����y��
��+8<o���ȤJ��X�]׫-��%�*���E�X�� �\y�q.��8�X��EE8c�Żղ�%�b��Z��ʆ-E��ex�aQQCHqL;�3��0��2��z���|��<uG�����f{�(J��ZrC�/�V����8����V[�k�WO۳��nW���U0�b9b�^��{�?����v��g�\Ι����ڠ]�pf���U�q�Q�-���Ro�'�G���d��M+����Qi�X�˗�m8����BPo[�K�*Ϗ&�)L;�M]X�!�fBq�֮���*k�Y�d�(�J�
�9oǵ��뮼y�Ω�#,Ò[e��(�O+�w�W�#�U���SiN�n��zN��0�=y��x{2�=L][�J�
fw�����}��܀%@�s�|7�[*�3�C�s����3E�]��jp�	K:sF�:���������0���KU�wIN��B4���h�J��<jG�ۂ9�Y�[������%�TkW�����{�@��E��1�~1�?!���p��
�n�v��=��s��\�I`��5�3��iX<��e�*
1����V>�sI�~G0E� �Ӵ��#:�H���+���5�~���DŽ�t���sT��4��¾@��lo�.�F_�qVOCf�;{N���IQo[ҫ���>B�Pb��e�A�l>�H�ݖ-��N��[[�g`%��@�*��tx�M�F��x5��d-�	�a��^��/��S�	)4F�8��^m��u�����]\�R�Y��TS�90�
���W'z��Pt��#TXϤ�c)��lq�.\��Ci�/�_���ٜ��8߰��,����R�f�Փ��0b��N���sFсI%�*���(_H�4[�,H�έ[q�;�Z���Z(�׿n�|]��?`ͥ��T�mF�Д���w��^��赾փ�b]����8M��n{�OU�N
�1��ຜ;N�z�i���Ro��Z���z�'��z�H��]`�1������u,��w%�]K7��Sw`���/o^��չ<�3�SD%��d�Pq�,6�M��y�^�_��O�%Zo���Hõx�n��Lļ󰲙��u�[��b 
��Ҍ�{�=\%(�k���^�&.۝���~ZW�����l��Q���4�VvS���~sc*��[�|S�^N^��J��rv�5�em�xafc^�=;Wa�������%�����������wugv�;��ne��N�`) ߤY���ȱ����,k�r��<׳�4���d�����x����ʇ|�*~��XQ@C�hQܲ�H�@��i���Ҧ���z��m�c�iDx)Y�ֆ�֔N�g�<���ԫ:~���"��J9i|IH<����%�Š�.6�N�m��CN#�����Bhj��sWV�HU��ˠ�p$�(H��gU�O���%/��N`%X����c|޶���C�&>��$9�Kr�6{_�ϣh��g�C�-�F`��e_��Bj"Z�����r�t~;)�ؽ�^���a1�둖�������c��x��l��e&2Sz�]��<�`O�i]2�q>�͇DX�U^�T�Qu���C6�;&I=\Y�o���t����M�뱷��I8�/�+8[K�9�*̡��[�@<D�q<8K�χ�V�^�)�)�r���q�j�f��.����mmF�^P7gw��_���u��n��u����-����0��,�
Nn�&1�#��/r�U�S�ebc �r&	��1(9I�[1-�
���9�ڑ��7-�~��p�k~ĠC]�{%��X�I�"n��vA�i������y�u���f���9��!
��ia8A���KvN2���Eʀ�η3�o[��ʐ)��H!�g���|��L~��
�Pv�Op�g�gSE(6�<1F4r���j}����ӬIx��(��������\�-��ςE�/W��F�i�ţ:���$�ڒM��&��1U���œ���=8w�b�I�o�ҟ����V4�T��H�0R���5���ȱ��H����<I�3����s��s�J@�)�^�]��"��]t��w���jh?�)Vg��]��0�=����*�LgK�t�-����r�xo��r$-�r%����H�{�zj�[�[Iiu��p�N�:���J�?Ⱥ]i��D� ����N^�zY�6C�e��@��k�/Fᙽwi�c|^��r8�	ot���B��ԏ�V����Yn��&c�{��s��e���3:��t���2��R�[����$�Z��&���22�$��F)��]v��4?z���=k0�P�>z�zz�k

*Y�#<�Jj��ى�R5�$��52t�(_W��I4Ai��4��pD�+x�l�N��^�hPx<�w�i�W���Nt�t��ކ줧
�e��ZD��FI�
\�l���$DN8û�I�-��*e��W=g8���Q��JXz	�bb}���|�|���P�hc1U��#��2j�b-�_w�'U���]vMj�&;��
���|�n`s~aX��le����\l�%�<�N�A�Y�i:��<@M���t�Gv(�8�*$VB��x���5�G�re�����}m�K$i�nC6O�~<�>�V��ˤ��v�W��3DzP��4����՗��Seh��}p�ƜL9rx
e~�h�q�LM�S�_���ym/�Kp���p�J�]Ơ� �i
��ݔ�\:�:H6,���� ?�}�aw���[�a��6����v��C��]�y��8�o����>p1�1ũ���-���\��Ĵ÷a���xd�=�j�YC6m��<;1M��*i�֢J�އ"7�e�������Mv�|m��'�:S%|;�"?C\�a��s�E�{u �fE��CC�����PE��W'b~�r]��P��b�/u�ث;�"O�lg�ˤ����g)ʍI�`;��OͨoPDdw^Z�s
�"���cP��r��j���tc�Y��yB��y�q	��s�ð��\�\��o"I�#&aw��[��C�����H���VU��5�1�'�p��xN"�I�g(YTJ��tW�*q8��=��]
3��R�
���[�tm�}�]W���,�����$'Ec@�`�Q�z=
�g<����ީ

r��02�Oy����6+�M��t�j&�Ƀ����nn^�K�!����zؐ�ʡ��H����<",�t�_J�
}2`�j��Č��u��wَP�C�x%�<���$��E�~��Fy��^���͛�uf�o�|0m�8,�?�;�^l���U�a#6�H�2jWlݪ�8�v�Bj3
tuqA�v�4�\v4M��.`�qm����\:a�*��H��`W�Ii�Y��r�ˆ M%��;��U� !�&"^S�V�����޹�G@v'�F=�[͌Ź����} .o��F��h��?���fwy|�ԊVU��=��2�Q�^ۡi����Gv?.�æ�g��\�N@S���VN*�}˟�z�gA�Pvs��k!z��^��^��e�������WȪ������K�b���^�^�C�M�.��l^�e[��Y �ߗ~�n�幞���2-�P-kO���ۤ
'�̥��7P��]I��?�r鶝�s�W��n�3�y�BX�toɊfJ�e��n]���1��Ў�⏙�h�

�׮D�u)x���6��^����x���'YZ�.B,�fA`K��[��o_#��?����nJ��Z��k{m���-�j�v�}.��"�>��J���/*���$�h���=8�H7iu��E���.��2Bnl�e?����땿iD���?]�k�(;,��
No��Hqx�#Rl\�XO��l����뤡���$2��k�U�&���cB�<�M����s���Od���ܟ����9�ӳ[��J�=s8���x7��R~�X�u�!��B2$�(�����5��Su��ISe"ha�!<b�����������4ty���*��cJ���"h��1��e(A]�=�,�u��U���}��=u���k�sI=�і–"Lϕg�M�7���7��������מ���%�e������[q0�״GL3gu�,;��N�DH�!��5�iʫ'	|��;��ʤ�}m/WP����y&��97�-6-��jӠ9T����J�6�ߺ�J�m��c�B��;�ȳؽ�꒴�t�j�UAݎ+�qm�-��|��zT1�\�m�քmlD��FI��zC�@d��	�AXxs����R[��wp���=nD�HrBi!>��c��[��q��0�E�Y�H����mQ���9U�E\���lT�@)MZ}m� G�
�?:�!����x8�m�
;�8Ǽ��.냊j�I>ҍY�.Bx|hG��<��f���^*:Yg3Em�س C2_�W�CI=@VᰉKo�.������=�ӷxlh1�ߙ�^�@x=��D�3vR�b��znR�
%
��6r��ܖ��p˙[R�75����'�
��o>�9J_���x�� r
o��z�V<Ǫ��P��@bѫ�^7hoG[��i�m}�W��pBz��j/��o휇UfR�r㇗WlɊ���n6���;S�\��.й|��V͹�gT��JJ}���
&���U�'_�"��Խ�7i4�1�|����,̓��E����b� ���z�Ȁ�=���粿ܱ�2�jA�8��0~�+�TN'"�zO孶3̅�~9�=B�Gfr�%YPf[�&��w��կ3|�П?�V{�f每BP�'�]���#u�GV��Z�V����Z��H�FuE����w���B��Bܚ�!^٣~ρdDEO߶��@��|<XeǙc�좰P���l�H����AR�Q���F\���ɀpؠ�5�p=&��9p��Cb���{�|�c��������4��v�,5��<�I�mO�rf
nɁT�H01+k@�M� C�0Q(l_X�*1q<F3K�����{�mz)��F�_?��5�?Zx,�����j���Y��|�y�Q
Z�gW�c�=���!GRDA��e����8�}�#��M��j@6�O#8�D��u�{�^�(�p�Z5������͙������r5֞�%�Ȋ>M�nε����?����X�[��&�Y�,�PQ�����e��{�D߮j�IO��b�=d���t��Hr�m�Вr(X�o[��@d$�D4�dw�:�<ým<t�I�fߺ��@Mt�'a�s��.�Kh�"��'V�6���R�Ë�#AM+�u$N<�#a_϶j/�x�H2�ف���ay��������Ob^�3j؆ͮ/u{�p�;y��+䰓#�K�՛>��7�&L\�/gPkhG�&�W'�r�e�S&2]/�����X�<�����z��R�ZOm#n���u�Ӓ��i�m��n��tD� ?z��N���p8_7�x��Z1�;�W0�S���=�����]��>�vͿ/�fY��k���C�S��'a@��>�z�R�S<�TV2VU�������YK*eN��R�����?8tч�K���><{�I�}��e���9���	�LF������K��I�bh��_@(�8[���f��\��pwU=�������i�1������V�>u[�ȷ.�U�b،c��5���,P�!X��-�ۙk馸�	^~AYą�z��;��p��;y7q/B�Ji
�/=[D!��f�U�ka��-�藵�;�g�>.��Fogpީ���i�Ӱ� ���و���L:Kp�9�_֮�2�E�9R���oNp�^:y�3�/�H-�g��U�n�2;��b
[��nE���4��Kpj�C� �ҟgK���=�lG��2�z��^V5�1V�BUG޺���v�ߏ@�6�v@��fgݏ�8]kam��eks
��C��E>c��LP��!B���#}�"��mK�MĩX9�1���z�A�\�=��@�m���^��.zh���6���X�@R�d�����ʖm%�Z��G�dD2�~�T������L5�����39g�ƠH�&�P2C��k\�iv�~~��R�F��0�eK���@��3觎i���z��a#� ��@�Zy���,x�B�t�j��by|�Gr�/|G�g����:���P�FM����*�_P���]�h�i@�˩�˥��M��������S��U]�
m��
b���Wl�ڱXZu�*?z)���t+�\6]U^[Y~�v���������
6��G����������ˣ�<�-
'(NJ�1�)����D��,���	�y���!�ƣ�
`ݶ�8�.$ɩ���.�;�,��$)u���]o�Պ^��ژ�v:X��vC�3����c���
�m����J�gJ��{�G�UJ�]Tyͦ���=�Q���1;�Z�+�|��p�L�������<��Y�g?]�i��y��];�>d�x�������T�}�ٚj�����$�8�J��6`����R|�'��`p�fr�^��*�m��0j�i�]�emZn��)��H~s�~̓�r-D�Yu��¶r!j��.�v.���d���c�
�GlXb���.)��솠{��b�m+X��h[���
���R�N��1�}_�%����vp$tȦ�bG8�K 9U�{Sdx��|�|U��Z�>�m�<zp~1��е�y{���TfT�z�E�N��/m�,6>�R�����;W�-��`ʹ����Պ^nBZ�ny
p��st�q��Y#_M>��E�[���6Fy�a͙���kǒ����J“���<�ݕ
QcȢCr�__�jE/� ��?�����@�'��I0gP͞�6��k�N���Y���4�5u�䋈���QCD�����麲S�;���NJ>Uh����ϗ����.��#>_ַ�G�bY߽�鲾=���_,��#~���=�?���#~^�w�G����^��yE߽��{=��}�z��+���\��G����^��yE߽��{=���߳�Gu��Y���8���G�B����#�(��=��.��#~���^��Ų�{=�w��߳�[�oY�����G�N�{�#~^�w�G�N�{�#~^�w�G����^������G��f�{�#~^�w�G����[����������`
�JK/��A�J 30�:�fR����s���6H�.�J�h�����Wk�pW�S%�G�xll�6��E�(p�5��Պ^��@������jB9T��ZT45�4���S�ь]�5�ɢ��1EM+��C�;�T�J��]
4K9-����`�� o�k��_��_�����u)��I�W�3�݌m�x�=�<��G|�Ӗ)�觳�0����-o��[�1)�@��|ݕx#d8.��7������jE��H��Ua8�� \|P��<	F%h�b|$��呈/-uH����Gw#�y.~�ȑo���s�[�֫����7��ƿ�	��^q��'��ܩXU�LhM�a
�w�*V�$��%ߪY���v�vx�3�n��<ɯ�׼��u�~$ޤ�Z:��V�2Ϡ�C޵�jJ���a�'[J�⫖�� 
���4��M������b��o��I��h�e��tr/2s�eE]�ц
6(�u<�����m+z)��[A	\*6��ږ��`�'sS�|p���r���'�3�̳�F@���\�T�R��9V� |�U���j@k��k�~���:�H�c�#+S|�Fp�D����<c�f������l|!xi�,Z�*W�I�{�I9�N�7�vg�`ƒXb��.5h�XR���W+�(��ㆳ���W�8�J�]]�%M���H�T��dA^2�"���b��U��u���QTa�T�<�;�M���/��6a��>�
��"ʶNx��kAN��K~Ǟ���J��)��T/�A�������@��9�E���ɷsn��]�c�/p��φ�2Æ���n����@��5Z��[����>��? ����<ԥ����<�V�Z��޼u7���$���h��֥��&8�6��Œ���+�vZBWȡD���+�"�k`�[oe�ic��+@6a^�5�X:x_͐�_��x'��e�q�n��^�Ei��C�k���Љ:��c\��YQ�l��#N�aX*��$��}��%g�]9 �TW�s�"h5���A�!!QQ�s(p�Ü�/c~���:k���7�N�o�CNQS�᮫���f^:M���~���Γ��T��GHB-��8U5\;i�X띤ޥC�Ry�A�^�J&���Pv܏ǺCɻYJ��p/~�Z8�Vh/#.�$����W�g�"���Z�I�>%$�
5@*8�ox׊^�[�zB��%0��h�G����_J����I�|H�)Y�:�|E�[c�0�����r�F�����$p�^jZ�dc�;�� �+�M����Ij�<��Wfy�.B�MJy\�a�5��&��7L��;�
W���9�Ԩ��6ֻw�0��ћ6�x��0nr:���o�-2|� ��A���3[Cn�
���XႦ�����[�ޠKp�.�zcࠥ=%�6�A��	�)�V��B�:a_o"H�yu2D����-��&z�?@J��D[G�{f���FIh�:�)��*Ë�iA��%�[9i��u5+��
*�
�.e�}���+Yл����VW��\�LU��΃�կvh��g=)�h���R"��:.ÚQÔ�Q;ȳ�ػ_��q9�^/�
�=�ީ����;�gfg���eQ�OO.ma�sU�g
2�1�x ��t$�ځ����36cY�݈����Jo�D��N@��9��H)Ǜ���a׽N���E�%��#���MA��Y���dX�
��!�@}[��ct�#�lE������ʰ\�8����,ȋ�[i�7ź�%Î�!&�M����M��,k�<�S<��a��S�Ho�K�V�[ϛء�H=YI����J���Gd�r�U����2��	��/� J���0�?{'|���C���V�<�B��v�E*�Y�ǩ�����4�����밌_߄������2p��7!��%�z?R9�pK`�,Mgɧ��UlG /y�"hvoB�Ѷ�:d��?b�~A�F�ȭ�q/S�gN�s����6R�ֻ��aw��T:S%��"=<��2��Y��5�1O�@�2��	�o�͕P�:a#j4{���4Խ�I�S)h]��������W+�Ȱ~�S�Ѧ$�7�l<�CSB����"���l���8���ͮ$p��o��t�
�d�{+]��Ŷ�}@~mHa��g|�~Sd���ΐ0���K��5�,s�`?��t�
��
��G+�YM�s��^"�����we�c̳�
�E&3�w�ñ�l���Qd�ǀ6俾Z�Պ^4pI$G�=1�g��r,�TGLS5���H�q�,�γ?.W�H�����C
��`�v&���x"����H�|G$:Z԰W��w����`�ekR�f�J�(���\2v��x�`��3����q�_Z����vVPn�?Um�M�;"�p�RaT�K#|�[J��G/�_�������T{T=L�㡴�x��5� ��'{���}.�7]l�b����B�MBA���ɟ擋t�=�����\��$������I��[:�F�_���w�~����
��u}�^�_��7�~����
��u}�v�_���������ɒ�{G�'K��-��,��~�����ɒ�{W�'K��m��,��������ɒ�{g�'K��,����%}���_�F���^ߴF��o_�����7�Q|���5�_����(~��o_��ź>����w�Oy+��~��
����"[Ӡr�j�l�8��f>qxPb�#�̠��♄��IY�3/����ۀ����j��g��o_{�yI߾���}��w�Iߴ���}��wPߴ���}���%}����Kj/A�邪���o?ż��O�)�p���}�::@��]�a�YOB̃h~�p�hB���p
_!~&������(�:�_�u�rI�Ö��C�G��n��p�[�I��r%V���?	�4�i+O�T�4�g��R�� ��I�3���q!��y[��fOt�6���ڗf�XM��<wh�^��g^!E@�IĘ|p�񛍣�8o
��y�1B&	6�&kn�D�-}�G�������f/<F���uS�/��_��;o�oZ��yI߾���U��"���
�i�gi=�4��E����mn��88F0,����N���@��H\���tNX�_
���\i!<�>Q�(q曣�.�g5����A�����ĉ��~�0�Z��|�#W���;�}~���6;�y7��#���L������������O�_�6����m����O�_�6��u}���/��k�����5̟���k�?/���0^ҷ�a���o_�yI߾���}
��%}��.�@%��%}�J��K��������+I?/�%���˕�'�5�����]{�{j���5"pz�5�yj�����^�z"߀3x �Z���HNe������E��"tq�_.��������p���5��ǚ����#��]�`H
��frдS��$Mb'R~�t	��^���"�܀!^
��&13�I"\m��
�"�
��pm�v"�oO���s������+\1���J����q���>׋��!ڐ»�<���qH�;�{�C���kd���X4�D��H�G��3�N�[���=B#��{�zo�;N�a��]�42�����>e��p+�R�C�h�i�<v� ��k��j��"���p�6�֤`i_�K�ޭ�����B�x��R����!�.�!�b�`�a�ή����HZT��
�r!�l��"��T徰LbE��ü{��[�wa�E�R��$�~YS�.�K�A��lK�`Ϟ����Dz��r��4�!C��W���.N�^�����R�
9�\�o���?ޘYf�Ҟ�%ʫ���uT�*8��>�pU�J�j�'�
`ftf��r�c�%(�	�WE��g3?�W{X��д}]M��Dn�����lŒM��Fi7P*�O�@>d�̪��fR�x�z%��H�P�
*ˊU�)W+��^|�.	tU����+EY��9*��\������v(�3
�pq����#�`�MJ �&q��x�Ww��ZZ|�U>*=T?�x�=�q;o/Vf)���[��y{B������kg,fp.��0�wV�񖠓vɟy�����˂���ĕ�B}�i!��w���ߪ�62<�L�!$!�d�<��s<	��1���օ��B �N;
�} ����V`"�5k�<t�H�݉����@I��G,G2)��u*�t��
�#�<N��{!���K�$H�ߢ�?-�E��:Ȫ���ʯl0�
�����ਣ�!IK��27��:T��e��<vΝ��`�,Z6�Ru���8�˞�	�i���X��UV��b�>���*�B_��@C��s@�Z^DH[8w�������p��Q��2���2/��ѪQ,�JV�"��?j����IЌB��#
Q�a���b>G4��Sh��x��'%̕��v���<�tor���=ᕨ��*��
>�aԣB(�jV����e�^^�
�b��h���×���b�ٚ-���7O1;�ʋ8`1�-3���oI2_�&TȐ�
�=Y��6|ZUT{S�X������Z{Jj����}��]���0��O�V��j"�
W�`Y�{�G�IE�9�W>b��G^�F�~s�'r�NRo�&�m��1���qƺ�q������h��!����ݤ���n$�(2]$�����P�]���⮳xa<8�7,v�iu��:���x�׊7�_��-��u����jɆ��Ƭ;���+�(	���zn�6�k����S&z�`���MsÜ�9���f���F�����S������5��*~B4���":^d1/�S�	0T~�s�����N�n8�"><�H��F%�o�:��AS�]N[d�`�@��Bބ�?�_I��C{ײl䈨�YIX���/x/'�C�"�$HF9����'E�Uu��&�#I��d��o&��1�
8�z�]�˅q\
�Z�R�S��V�o���oUΈҽ��7�[J��<o�(g���#�•��~�K�n��Z״R�>�'hl������zSWܗX3&�[�rH��[��@5�^�ۯ��$�
X�ȼv�@���HD?Ra���A��8s�o�&�q��ʻ�	�����6K)mչ���I�3�8-�> �	*�}�
��ÿ�a0~냱/���*�Yٝ�B� �w���U9�x�����NP�B�2��$����@�E�rY������FP��+��*!�ЮwY��r�q����VN�"A��"�$c�m�7kz��`��i�i,a֨o'���	䲹���N�^�%��W'�r�.@H�P$��gVk�؃p�qۤ=��A�h@<��x�>�S$8L�.��@�Xk!�@�2y���(B����u�KI�>����;���}?n���
�@E�M@��0�RIh��	�=N�_k��rM��&0�l]�Ƕso�W%s��X�?�BN�~WW�0�ɠ;�1TJ��B�Pl�k�4ϠF�yFx�}�hg��R�!�����yS���&��;��8�kl��x�YU�k}��Z�<HZT8�ޗ!�Ŭ������Cێ���Z	q�eP	�
=�<�d�}����Z���~�,}�&ꎶ��6C�`?�R�*혮9L��ru���C��q/���4��L����r�m�d�Z�S��b
���׾Z�k<M��M��
x��OEC����/G����/�X�q��6X��=�HUQ�Ȼ;Ϧ��;��f����ma�*�Go����k
;$�4m`A��.�_9��8���=y�.��<R�"�3e�o$�`VK�k&�[���
)\����m�ڿ�-��6�	n%"�̞V+�$��zD�� N�n�x�%�\�KĤ��@�G+[��'���cDB#W�iw���#te�T���w/�M0Ȭ��f`u�����=a32X^N��{�nj錥��t�Q��� 
;�Ȇ��T��Q���������
p���ok/�샓rU���,V{���=
� �f�5i��P~6������,A�l�i��H��!�^�R�g���oG�E�ToTs��nW;�?�WQ����ֲ	���`�3��F��cT��ul�O; 
d����z}�}���6���,���I�5�D�J�e�ۺU�����K{�f�ޞ����ߋ��m�ڼo5�� ]yUyɞ;}b5�������+��bO>&��P���}��h�c�k8P����=]\�K=�hH�X}���@!��G��3`$Q��߶Jկ�WϿ^^6mh�����/�^:�ܯm��B�aE�U����--`����V�[�Ў�)��HN�?p�D>�f@aB�e9Yb+`vK���	��IJ���{�c�g毛�w����9�r�P�ნH�W��O����ƲG�E(�
~��j��EB������u��N�g rs�p'�x9�>�ݙ��c�����ț2� �Ck�	������^JS}m初I��<�j�����W%�S"�	-���$}��S�ʭ��������M��v��/�,���u$�3�0�mg�6[F�{p��U;�l)w�_��JA�� �aҚW-�3؟�G���:��w�V��}����䩩E6���ǜX��yZ�ke{�l�F�c���]�4��p��v�s�!�(8p�E�za%b�}+���>�ې���@D�ږMNr���`I~��᰽yi��m�Ѭ�j	W΅BG$][j$)�+²	�^:����X��]��n��oj.���ǻ<�=͹�ɷg��#��4Y|�W�O��Z�f���$2��j�e���i[,2�u`�	���f%��DQ�~�����u��N8e��y6�	h�f{��V$���G���o���Պ�#j2�n+\^lp,��Љ���¡�	��[�5�S���}���
kU�ޫ��SK!e!�S�i�\��;ON�����o��]����s��s8C��[�u�IJ]m5����]��}h�5�^�uB�����{C�,�=	ƣw�t��-Z%�F&�����Oj�`���(��u�*=�-|Z&���M��1N��0Z�8e��IN'm3�J�i��9���K��<�mZŃG9/��2�������R�~.� [���N�Z*ذ�<���[m�v� p`�[��‰��>�f���0y/u���)6�[��J�5'�+��W�{��������'G�R�|���y����7����+H@���4�5���ˡ�pm�]�褬'F;��K־�jOc�]ɾt<�W�c�Jɏ�E��
�מ����Zw�?�q�m�͘jE����I��q�%9	x4��
}���u*��lqW9�s�y�7f�o��u��<�_s�;F>]�'K
0u�hw��>����Y��l38�j���'4�l`'��b��L(')��r!Ԁں��r�,́	�޹��j���Z����j#�G��׮�Y�df����}jP�W�X��D��� iH�<n�0 3��������܋�F�>߈<^�݇�g�Q>�a�)�ݾ;�8M�W�Bp8Rq�M�$6g8R\dk�Gq:ʷCHV,H�A	��jm;G.���w����U�V�I�%�cu�$���s��U����o`�v
L��0���.Q3���(�N��+��
޷�s�$,p�ږ���}e�ּ�̦���EY���8W��NyRjp+j�׏�34��m��B��y)��Jb#T�
81��.up�]�]j�e����u����)�I���5���ס�M�3����r~\)�p,����A����*��r�X�������@LO�Sa֡�D����{���ךwpt�Ҹ���/ ��T"��V�'�~	4�X�Ͻ���(���$�ȣٙWH�5���M��5�&���9x�D��j�ۯ��Z�f����u�t!���J0촷�W��������e����+�����p�� "������r���йwu��ּ�q��P���b�p8���J����d�x=�8vOu�<uyiA�����7���4���$�y�R	�_��\�k�v�[W����n$&(�C��L��ґJ��;��
Ϟ�?��v�Nt�ך�7ٻ� j�G9���w�69L��H�(���~����70�	�'?5� ��m h�
¦=U}pH6�9P��xQ&O'�vZe(8�9lM֡;P�>Iq^O��~aӹ�"�R�ږ���~��X&[k��t�Ui�g��҄�
#�e��u��l�f��8::B���sO���r̕sә�Gqn��tr+^N*�@��M��IK����+��[ľN{���b�	'��s�:��e���q�hBg�I��v���u�^ulc�[��	p�c�v��b�@ӷ.�5�;���l�nK��#�+�U��ASI�}+��+��\ӪS�@�;�W�/��70��������#_r@X������U���^��
ZT��X�d���ѷ%RuM��B���p�SsA���3K�20D{v�3�q[��
�@�N�:�kt�;�9�n��.�%��
�l<��E��7���t�lKPR�Aq�f��I����D����7ۑ��^���쟊^pd`4!�=p"g���ޅ��ܝ�Z~��M(9��_��&륜��f�1m'���� k{�^;G�)a�S'��+������|��l$�z9�ʡ��8^�{��Uv9���oI�9�=�ߝ��g���lL0]��F�A��)hf56ᣢ�O�w�@Ku�J̀�	���r��[�z����~�Fr�3a��ku��/Ӵ,�P��B��#�͡nN���*C���%�����y���T�i'V�]��z<�c�j��{��L�yrЫ3򨋣P ���~=�ajAf�~��p�	[��`�ʖ��Lj������j6��NI6��KB����o��rs��8ē��%�R&�]���I�$��^���(�v(�d�#��ەt�����$�&���N�S��\l�A����0�x��^mBz{�P�82����Z�#�4�Txa��G��׌D~�>�
bt�c����рy^�P��U�n����K'MGO~M�-~�D���}�[�UB����R�GA��ZI��'(+@ �ÁMv�!Ah L��Ǵ��Vuh1m��YG��e�2���\ح��W��/��q?�e�&C�����&A�9?f�J��ut{�.``��'�2����:�e_J���ͱ�~>]At��A�z�� ����/�f
��F>��sT{��O��Jl�x/ۆ���2	�Z�/��U	��=�U��A㇍s>-��J��TJQM��v�ũ�~�^�4��l��p�8�=�
B��v��
��FZҩ�i8�ٙ�	29�	T��y!q��N����ڰ�L����޼� Z?�;�zƤ�v��w�/�B�2䖩�IO�&9����Z���ƣ�Cl�k��֨��8m�?�}�rCzn�c,�'o��W%,]e���
g�5��xkH��[�z�وi@��I��ю�4�8R���M�b"�SU��	/#rZH^� x.�=�5�DJ���
��)L�[)�gO"��L�x�W�	{���9�1��ۋ!���3IyvR[�g��V��mG�R��{=p�ò�W�7��!�(��Ï�}�C�(���N@�5��_�~���^�2W�4���S��܉cu�o�s��4J'��/��L	�bB!ܭ�?�#�8�ݼ�{����+;Z4��0tW��	w|&ZY��Y��c�A���2��$gu�� ��**+6y��A����lRĸ��5�J�@K[\@�%���y��v<mEo�.���wa/ט�&B@J=�ǚ��y���8��G����		N���qz�Ҙ�9�R�Jץ�q�q�"
t�@�e��|�R��&�����%&�����<�i[K�����*��N
�m[�O/� ln]6|�P2_<���z��,@tw���{�5�<C.��(5|��ɚ^�uj�IŮ�[��Gb��4�)���CNx{ݷq{#�9z���jrV��+�5NHI�i�2��Yd>":0�p�ݷ���=�W�o�^����M�b!��'��>�����Tb^n9:��yL��d�|�8*%:w <I�^�)q<�|��J���x����,��ny�{��Y�چ�z[�_�Y���fU�o[J���
Fxfoy�;���5�8�.ޢ�YY}b��:��igzQKq]i���T��a�܃�Kځ�׫�$��+�e���4�݀
D�ӊM�
��FT*v����3��H����X�;��Y8q]%��厩���zuI�9�B]��#?z�EI�vس
y�ދ�ˑ��R�c!c��]��˶�Dt�>B޽���AlIծ�`n���8���H=oK��������Ζ���U�"f?L�F;/���!��(>\�"�����a��y�֤=��ڧu���gOv����?1�3R���Qw/�����0Ǒ@���To�7R��
��E-�`j/�(�������/�˝!_�'�s
�4�/O��K{�`�sc�9ɨ);9�h��v{��8�'~��@-T�TE*:�i��
���N�(a���C��5�x�K�X�E،�"hO=�]����9Ϫ��%�{�G��> $�93��/�R'���{ �A�9s����R��
a���!�`G�g��ٕ���Ue	 s��w��\ګ�TܷUBx�#��g��r�P�.��6�>�C�K>�q��ؒ�,^���B�Ҟf�:�g�n"
��Iѧ�*����\�	���g�}��pO䚠<�1���iOɅ���T]�$q�xuBx��w��4����UZ�Q�^����H!t>%QXx�_��?\\��k4k��J��U�Ig��Z.J7l`�LF/d	v���hh1@,��5\�0���G�"Xp���~�yǫ��M�eS�yi���[��R��WM��oum��Y�%�j+e�_���W������"fEb�;C�f�Ì~;y{Sl�|�J��3�8�����u�:.�+d8C;d�zM=ԓ%3]$�V8g3��ǯO���'��iiq[	�w"�i;���E]����Jv��RT3Ai�K^�Գ{��,X��L�����u�-قP�+Qa�mIO�\��hɧ��V B$��D,>>6!k�v-�V�~߻��k᷅���}(���/d�i������+/�Z�s
Rc;�,>��E��G���U��-e��0�-9�]������F��&ZHh���4��rv�8����֊B(I�+�{�1�=�Va'��c�L�vi8��;{�|w�ឧ50�Ւ�[vH�ډ�ǿ�7�m��E��^�g�M�]�H�먊�����_#�.A&6����	v��1�l#��
�/
w�6T�/
0��)�����^DT+Ɗýya��j:O>-A�+�`�݉�1�6�Z��_�'|�O8������q�F���"�]J*�Ӥ&���eW����k�u0���Z�Z�kX	&(%��sN���Hب��iJ����cw*v����SY��91ȁ"Bz���?JBw 0u6%��u��H�#�V�U��&Z����(CӼJ���oy���YKYH�>p鲛`^N�L�n��[@ȉcy��S9�:$�co¤ٿM]�*O�LN�y��!l�'�%�we������D9���V�fScA��j�CU�PS�{�ħ{XK^X�R����lu��V%���W�����m���Gꏔ/"�D�
���c�dVϫHt�>%q�_�Ӛ�1�@���7����!��9o:��#�Mp�{AmK���6��I�􂫀�YÈ���8~���Mg&�"�Z�K)P<�����M���x�J�����x�5���t/E��FΏ_"_�~8���i����Z�GE�K��_m��@GY��[k�[:��Uk��#���A���
B��^�62#�y�c�p�������7&���
m�p�G�Q`_�=|k!ˌo-��칣�qSpI��v�2�l����:n��W�����R�&�f�	" ��^��o����VB�	�96�O�9�W'z�1ЫR����F�?�����SQܣ-m��X_6�j�lw�:�t�"^$���/��~��w:�ay�3�
�"��K���@�t� �!=Z	��ڜ�"�g�87�T�e�����v|����m�2�tѩ� u�1пV�l��謺��0H%�p��%�6۞C�℞��1st��@zM
m"(�츖zt�j�~�mygd�4/�jv�jd2t���U��E�d�@*�Nz��I��	�����6�k�~�c�ߦk�F��܄�3{O	�x�
;+��l��Eݐ��g��t�-����sU��0����AN�P�BI,�b�@�3x���
�?Oe���J!+�D"s��I�~���$��E
[/{�����q��`8��H�'�俺F��U}�+UF��$-E���p*�06!�j�?�V��'l�{-ٛ�����O:�mu��MV(NO��y��]:e�{<Ҳ�S��\Ջ̛"l7���7oq*,�����c"���
����^��mt�с
�,��"�K�EN���{�rբ�e�;�l�o+v���Ȟk�˱�#V����y7{���,'��ǽ��j��}�R���&�q[�������Ԋ�b@C�$�� ]��]�}]�Km2�[)��b�h�[��c��~�G����
:1Ut&�^���Y3����(4����R�.��75�Ԁ:*�
QY�鴩��Uc94�X�������MUG5�=�<�������Qgxn�m�MK����	�VZ��Q�h}���U��47�}�!ve�v��4tX�-aF�ob�1/�L�&A���tlW݂��8��S��8�`8b_|繶C��'��� "W��*٭�+n�=	�|��O�BB��� í/�k��~�H#�z��B$�9Ph�A�|BH�Gv��bMv��Ѯz�x����q;�Н���z=���]�^T�o�V=���/F�ؐc��nG;���Q�󓣲��N̪:n��ȇJ�lO{���%�`��_�_{؜��ktU�تZ'�Y�
��߉��壌]I�ѓެ,+�V�Y#s�	m�I�.�x�}�ݢ��~�(Y4xY��aQ�J-�@�l���-��F��r��]9��?��Z*$�^��x@v�Q�oDi�%��*Ǵx=T��]t�<��s����XV�Z:���V����.9�B`Ǥ�t%��b&���/;�|���z�n��U����dd(kw{
�W~��jn�=�Dp&'"��'zu�8���>:&�rV��9���l��
����/$O��m{�^��n�x�3Es)��%��,ՒS�<�s:ߦ݈��t>yȅ}����~��Ml��M	�$���жK��M��w#c�\�W��01���[�����Ox��C�we=��'(WU�~�Iˑ����E5�e��*��Og��m��sv���Ǭ��my�Lz^��e��ʟ���0�h��QW���E�<�L�&}0�>��Z�-���
�Z��!@�4g����Қ/�չ$~ټ��U}@&�*=
�"s��(|(�BGΉ~��_�]+��A��M���ƻ�t��ym�QO�샸m�&�����w1A�خ����db{�*p[��٨ܕT��摼uj�C��
�C��6"q��� %tY��
���$���K
$��[eR���s��������o��%?�E/������c�C�����qZs*��W+��l�f0$,S�]"�l�x���mvyu�	����;W���F�L�}�@��#C��#��vqP‘d'+�4"�చ.ɻ�]t���P;⭙��*�V=�55�Ҏn�g�߹��Zd�|��=�=C�Xo��k�zbp��dj��A��ױ��(A�z(��]a\R��uC�����IW��~_��$�����Rx�Η,M��6���d'�Wv玡��cإ���O���9AV[a
���
O�$�f����O�0H�Y��f	��z�E���/�hg+66��M�p|	���.��)^�s	^�;U
�������fUw��{[{�N�=y`R"�n�Kuj!8�m���#�-۠q�(Y���{�j�~��?[����Al�y9�
��nNF㑇�p�p��F��ओm��ރ��L��_����@E
࠾�tv�da���2���kQ+(:}�qV�Jk��kq���!�T��~)�tYcN�����`��{)c�m��y[��}��I�T
b���U���L�[6A#
�+�:	�W�J�@��@���}m��{�o�s�D�p<�o���<]�#� �����࿼�`�_V�tU��K�^2�͋�ṁ��ae�U`,���p�U�GqVtT��ġ��rl>(�÷�${Xy��?#�"D���Hآci���U}d��.�
����U�<ը%>�Z/�Y/��g!���D�/
d������T�%}��Z? �$2r@�LQlU�(6�OǓ-�e�����D�����֗������c�Ltp�m?�y������_�{!=�!$: :���q�z���v�J�u���m����K�������Dvv˙�jDk�ߡ�ge�@�)v�3�?DX88g��ws��/��r�¤�y��5���ӫ��䇽z�N6�Ƒ��k��&����Jh�4c�g�P��I���^�R,!��`��4�������מA���xv�KaS�������c�P�CW���b������}=��Y_�_Hظ�T��*�8o;o
m���B"���h�]�+z^�)�x)���^P�R搵J��|L�‘�bG��w���6�Z�����v1e_[������R�?F�ˡ��
�]�uQњe@W�Ǥn��d�	�nM/����x�K�Ŭ�Z�סƟ��Va��9�~�^	g�}��z�ocZ�z]@���Q}�{9J�ԘiW-eT�8�h��Q4�W�Q[��C����a�r@� )�^�K�2O�ߙ?�7�t��V�̠\�ޅz_�ܧns����5��f�[�Ua�D~��e.o����Vwc�n�i��$��d��z�B_�n?�Y����r��9$[�y�Wqx�#�$j
� Q��O�яC�+��0Sq���a�8�jf�?/є�����j��K����m�W>��)�ˊ�����ؑ�B�������4x�֠�;8Ez�S�#p�����N8T�&4���(u��䤶�^�_�s���^r�bD�X��@�>��J%��n"��,ƭs���^�c���G��EVP�<ɺN���h��(��W�����;S�޽!_۔��{��z�4,#y1B�еd�t�m�zG���C��}�U�}��K��ɦ�y�b|�w�QƠIk�U,.�1u�x��^�7�=qJ����L��u�����JΨ�4��1�Ę��۴7�aT604��1��ᐸ���m���J�<�y�[Pe��I���}�5B��Hpg-������V>�p	�W��O���% ��.�R���&/v��HJ�MM�;���ӻj��z}*�6ЁƵzx[�}��^�reQJ������ �*{�+��^�-@���V^8��S�h�&�gi—�.�h��>v���q;WS=\!�.�����q}�Q��8���I�-�Y����D@<�}���X	X]��Vu�1e[g�F*��y|�.7/�˽I�a��5�����A$Ύ�7/��U]I�IP�H�J��Xk���t$��c��O�������_��Z|zQƵ#[6��S�fv3�P�<��[x
�0s�ކE>�฼<�=����3��>t�d�1�գ#
��a���De<�c��c<u�i��tv�Y�AY^3�*�W��X�&Id��3x��^;���S�g���j����s��_�ѫ�D�޳p�X�At��C��T����RZ��u����$<�Fھj%g���/n.?_�?d8�\Gn��ik@ϲ�$�״�Tsz�45�e�o�J��nu�M��6c�������Û%�O�EY��P��Y�d�Ʃ�i��"�4��\XN�5��7p�Z�T�Xk�B���|�Nl7e�`�C�ୌ��R+̗�+!i�AfT@��3)D��j��8�������S%o��4���w��s��8:�j���V6�<;�A���]�w;�\��p��{%`hK��u7MsH\E���;�gg?�M����2���r�X�Ks�x�Ƹ+Y�i;K]�`YN�v�o�E���'O���SY�B�Sԓ��l�Yשbs�I	�v�Zː�6y�oi����p��a'�I%b��Ftj���8
�Ы�}�7,[�M��,�.Nb��,̾��_Cχ����0WV�Z˵��e��S�a�2 ����OV��jdf�H�_f�&7���$(���ֱ�(yg�4텂rת
Z�=2wtn�;4ǻ�/"*��!}�ē���s�c�q����%��90D	��h�x��dW���d�_����R�i��WT�|@h��v�E4S��b�mu�X*a^�O[@O[�cE�޹��V�ƛYWQ���p�||�xId�ž�4Tҳ�
v��DJ����gf]]���Q�#�zt�/�=*���/o�xѶ�-4���R�?[�@
9XG���I����f*��p�Y�xE8�sѲ ��bz�^�@��+I=�4u�n��z̧n�&�
se�u���_-[�?�r���A&U���6o�V�<�G�jy��2+:�E�>g��5�SCC��̓�@�G�݋�P�f/k�����	/wiq�`�����wa/��p�-��V��
�d
��e���� �.ˎf���VO`��t��oȴ6�<�l�b[W����B�A ���{��{��"|�L���d�<\>5
v��$
cZ?�	?
�Zy�e�L�`�D����m�����[A�A!�
�?��6��n��[�Zp�U�T�aj���7	BL>�Z�H�S��T���n}���ű�V_?8���}9�Gƒ(_���GU۷���ٲu���X�Z�cy��Y��r^M�����v��HW�h��	�z8$�^����^���FG��,DT��N[�9�x�u)]Ԉ�~5$�ba/��cY�(ÈI��"��z���\��UK�]���s��k��v���������B��d]���&N��Rl�t�e硇�{�}��ߙ90�Ғ�*G���cgߡ�3WMJ&�P���g��w�:فxMҗ��Lϣ{IC ɧvT��E��S��lY���1��HE")��x\e�Չ�U��H�7�0nE��Ճwj�yxh��⓷��+�I|�Ŷ�YI�
 �]�ܤ�gN�
-��*W�|a��Y���$V�����n�Y�T�
l�e�!d^}JrY����s��p�������1l5LJ<�2��}RD�y�/�I}��W��g��[���U�;B�Gp�c�c7�~B�2H��TqXG��^�j
�J�K1e��1�
R,
�?
�<N}1�
%_W:���^h�1�:R㼠z*�w��4���M@����nR�2;�����G����y*ҳ.�Vz�7bk�6���`����(!�59�Q}�/[�}���f���nQo�o��Ff��{�~*��B�tròhM#VQ��,`�����rڛ��h��SqL)����G���9*�ޅ�P�}�U��?�?�Y�P��<1�I>Ajj��ߦ�Mgz:�.��e�j�@莓wCXmPp����G�>���Y,�Y˧y|��৅���b�]�;�[{׮�ɼ�%�q~�@���N����D<摃Ƅ�Ǚf�3+T2.���iD��Nd�h��y��~|yj�5��e])�͑��T����:o���iYq!���nR��΄L5�����OQՈ��	��o/r�l�#(�yB�Ԧ&<?�}kz�\��h���G��c��{�\��k�E�=�C�S�x�4S��E����)��Z^4i=��h
��R��ɚ^�+�]�F�G;B#K��9kP�+�w���r�Y�d��1�n�7�y/=-��
�Q��6|�!���䟪�-�%�%����/[�|���dAV��l���0)��b,B�ɡ�ᄢle��"[���Y)�f]�o��/ҟ�(L�4�>�O6+J2�U-�`(!������S`��Vc��ߋמ��R�	y�u��>F8GP���LA�XȆS�p�AZ?�Lp�S�~&���xx]�����U����_-�
��c�(v�	q�;N�m�Q"��}��p�&{]c�����M�ut6�a��׵�2���p�m0���8�sNI_���3�^�K ;��P���tM:�*��8%q*Ԯ��A+G�J5&��m��j<��K�ϥ�XRx�\��S�7��y:����)�ai��:�~+���ޱ	�磯�&��5f��󾜢�8� $bi��d_�0��x����V����� `,�@����o^�k-�ҥ�d�S�i#sĊ�K�R�w���1���U��E��S׭�S�\��<�n
�T���@��l�]m�ʄ[���%��_����>(�9H�:Ol��,��/j��L��+yDm{������3_�x���9���}Q�)�`D����cQ�ZD! ��h�/���U���A�A@�-np�PZ�V���_%��p�TE�H*��`���@��1����f�k։��@kP�ġUfP��������)@���p��@�H�:u�n�d;m]���DW���O/j�R�ؙ6,
�E�x\�l��@K-:2�g����]��d�'�W���1jc�=D�Btkuܩ��
Yd+^jj�L@He������G�O�`��1����IKЍ���G���6�!7�]雗��NH���d!b�R��,��z��єmJB�ʖ��ܧ���LJ�%�����2V(|^-������H�j���IzZ�yi��SI�8�Xda,��<�
'��F����t���8��ۘd�ҡ��Օ�����)'Ǧh�e��Sg��ަ3���ܾ�F����|��ǺB��2@ �Q^V+�E�%��"�V���J��/2�*�v�������++Xy��Go��5{{��J%�
2���/��R�����O�C
����h֪��*R=4�UzX�}�8�%����;������í�Om�o����<9�u�#�U�S��	��q��<�����e�uz�O8n��ۺ"��f�p·���Ժ�ER'<3���=��h�x����0�#��Z��=�/��!�{߬� S�	\�~��f��F��l$��/����T�e�$>vqn��18�9h������:�YW�9���z~����)�L4�W4�םn��'�"��bY�4��O饷���si�ы��J��1'f�V���v@;���rv��M�<��#����l��Л�)��1�=	�w�j2���:
��&�h�ٮ����RG����.3*��t�����Uz�3�麦���v웜@P!�&�f��lQ��^�;.�����@����ʗC��	�Q�"�l�q��NE��ή��Q磽lQ�`�-��3#Ea�`5�]#$�����5�S���%޹���G9��в
~R��fW���u
�N	'��(�b���8u�/�I�1����h�TR���]���T��J�o���������!�4D�u&�3�h��/�i��xG���hy
��۝{���r�":t�k��`��H��<�[f�����g�۰�]�q�D�9K$k#���5����^
n���GN4����y�n�ު�ZȜa��ٹg��mU�k�Ip͉b��h�K{&�9U�����,[�a>]��(�����ٱNb
��iǡ5K�*�C
��>��zC�j@;�(���Ug��}Y�駥}:�`�8�֎�tN�����ڸ'��o&,=�¹�?�5�<�v39�d�lbC��]?���ei*́����y�_�p��=��Qу��}}J��|Ы����܂�SZ��ǻ><9jk�.<V�"T�6�;+�d>�Hެy�p���
e����N�yv�K{G�@*���k?P�I��!.�s+e4
Ғ"7�lk}j=1U�Mr3a�?��sU�o�l��&}���ڳOH�9y�����-o���]�ז�N�v+�=)�$d+U��l+��
Dz�)��À�{�T���ݛY�k�x���v����P�^���3�zHe}|��ۖ��Lye-Hs��M6�m��`�7h�Zg͠��Md;��)A#�C���	�K.�$r�MUd!�/��M��XU--�sv��m��Df��V}��N';K��$���<d��u���78�p�\�XyY���O�f-:�M��h�4�K!��}���:_\��?Q��i��(DJ`w"$;�l��w~�$�0lIe��W���0j�;��),�8)����j��Nt��
k��Ho5z����6���(�Y�X�����ˆ�����G�M���©r�ʓĕ�O q+j1�6�|��E���{�I�g,�_�N�nW�� ���^����I"+��v-�������;��	�Vu�}���`��G䡀y�����Y�+�
5���=:���V��bƬ�$P}��4y\��_
�Z�?ل���|OTkR8Yy�J����	�ѩSU����ɁG��M7��Dp��`>צI��SŸ�b��,N&M���[�^�K"���U��Ih���@�[ ʝwV>l��xC�/��[��x$Ba����c���k�k��UQH�$�CW;��y��rX�}K{e�wPv�s����6�
�5�a�MPNw\ףGp*�`a���T��l�&g'�̓ӧcI~��d�w̕�u��|\���	�l��˒����%xD5�5�(N����Z2i`F?�S���,mIj$#��:�Z6�Ӯ�|�YR��W�(�U���Hjlt�=���R�;W�:Z�:kd��*��<�u�M���*G��0�s��2�1��|�4��Zג ՜��p��w���h�j�մ#)Y���U��u�{'��Hݕm��$}eR�mK<!buX�v�V�!��sk�6���E��7h>�a�U��$�a+��#s����o�E�ug�!)�[(h[%[E�\�sH����|��-�&o};ts��Ǭ�ю�Y�a[[~�z�%O��j��t��1��<�JV>]��"ND��ÿ�����%��#�u,5V�{��
���P?�	-9;���^�Sg%W���Ӭ���-�ܗ
�>]ՋO󨕀����ݡ���]孇�cV�x�̇E��4<����:qgt�,�f.�Y�
},w�
�D!�����Τ_��"�5E�!`���w�F�*t����(s:���M��6n�ދ/�8��a����ծ�g�JԒϽg�ŎTyd�I�*��tUY8{�q�����'UG�&���H��]z�뱦VD���f=&�jqO��c�K˰nd�.�7�c�n��Đ��_�|�tUm+I�9i���b�g�͇��׶K왗M�ƙ�nѻ��;�����J��j��<D'q�w�g��;ͬrܹ�h@ek�:�6�z�^�MG9(��d��H��r�$���j��j�h}�{<
@	\�3��v�I���H�]��V�F�X2��������o����7��t�CM��H�J��58�i_<�}���I�
�[L,NE�Y3G:HJ��ATz��UH�O[���
TT�����חu->]�˕�>�/���zX��(� w�����a%�	������t�#6���C��N��x���"\>X���$��[�^މ$��	�OW��b�/���:,�f��y���Zn�'`�7��a
�an��
G�X�������4�8���F��B�
�T�,�C|x���K���E����
��k@���0[M��H�Av�;� O�"뀞l�����!�p�nJ�;7�|�d�@)[��1������ ,x��`z�L6��d�SL7�����Q;T{c�F썸�W���$�4UG3�q:��M
18��6������y4�s2�YN��5��I�w��2���!a�N�>�J!�&�6�[=�LVcI�Ol��I,�0�}�?	�!�d�[t����h��$w�?�u��,�ۆ_�|���> ��'�A���QdO����l�J���#��=8q�$�a�z���<�����4EP��_^�;���P�k��ٽOW����R������^P��bg�T^x���p{6�c
�*G�ٌn�!'��Mg
�Q��1�@
M���f�0�����w��2�#B���J��]�)p��(��/�+�y�y�U��Q�2���+�xt�����r&/��S�B�XJ�&�m��2����o�2�
q8
�|Ρ}�ꇐ��q����e��z��k�O׹��Ք�	͸���8L�w�ES+
���L<�t����q���[c�d��\)$��.�F��O
��L3om��.��֯�\6P#'/�W�<���q���p(sW���+-.��n���~}��e�WK3�||})ֺu�>.�gw�t)��K
�0�g��]�!�=q�:T/]$M��
܏�h���Ԧ&}Y�R
+�my�C}c̯=�l\������U
[A�;
,]u>�>C����7oKqo?�WZ��Ǹ�t �{
e�f�
�	��byP���e��OW�ң��H���Y>ZW�<������{mv�s�lp;�XS�r���f�y�NH�k�d� �|yNS�4VOO�ċ���9�OW��nU
�e�����1�:m�E|���^lV��0��4�|����Y��O쿽b 8$P�b�R�@"�̡�mo��2��8Bڤ����|�����'���5���H�0ŤR"hCh��ɋ`2No��"�]��rP��>:Zڕ`*��{>޺_���p[�#g��@����n/605�Ku�����Q���:�w������Fy-GN�ot��
'�>��q��5J#����_���2ٽ���*�P�'��5���[[�D��(�:2�::�ź���CI�P��=5=	�z�V8���(M��DT�կv�}�������.h��{��N�a�o'�Z�YH ƚ&Ѽ�I�<���uѻ���5�5��y�t��e�Ǖ�8Bxk�xQ�J
O�~�ײ�Ծ	@o[����Y�Ц�hS����D?F��(Eʊ�e'�ʼx�����k�����Fu_��dU�f��:bgۍg[����/�?��h	v)A��0:�y9�[�|�^^���$���]$��h��f��w�z�ͻ����7�W�JUo�2{��k�exB�f ��	U�u���!LR)��sN�׺O�ϼ*y14����"H�q*I��ɚ��~�T��U�dar�CѼ��ĆW��V~�z7+9���El��t)n�f��T�\9��镤N�F'�8�G�K�iX��D�l�JV�MS�7"�W����%H�)#)kL%t��U$�u�$r�e8w1'�GI���&kw1����?
�J��D�'��F�aCQ�$�K���;�W��Q��հ��`�)�#km�{N;/��Ź>�0���Y#��H�v�E�/�L`�z���3E�+
UF�'i�����<ވ�_�*7\�V�)�+/��3mB8�_K�I|��Ve��X����-.�.֣x���Ru���H�.c�;���c���{:�:V��\�.v�IN
\}�I`{�x�_��#
=]��k�uO%��Q=|�Xt8��V�>VoN~3�EU�a�׹ƀv�-��S���|�^F�r���g	K����ws�y��t��g������#g����M\pD��p�3{�����m`t5Q���Ϯ�[�ì�)T�{�ob��z�$��ɰ[A�����>�i#̲qs�Gj�p�b@�A�a�;��D�575_u$�pi��	t|#�x5����q�v�G�	8>��
,�,��4�$���7���<�o�l�1o$��e'�{NE;�K�<�f�E�)S�/�_���<����LD�{>����N*�����[W��N{�Va<m2��zG�c���+����#l#Ed]�z~.�9=�~u߳���_�*5KQ
��F�#�wW��
G�
/��V������@��gk��&쥲M�[7�-o����@21t�)���#J6��߹��ב�^U�7�%�|L]$Ϙ�od�@pW�[���L:�8�%B(��_%�����n���͹��i,���Q�-��m����U���ү��&�8�]Tj�;_��f��
��%�b��@���
T5�YR��Վ��s�ݵ��MЦs�*�P��,Ǽ�U�4�*g����E�(�F �#��ٺ��?�yռ3�����V���?&<ϥq�s^6�7��zyv�k��T�]�q�/����T���G$��k�V�^�L��t�[���.�"8N��^f{�����E�cgp�\��Zض=Y0+Z�a������)}�^��#��^����W���[��RX�P�`r@��n��LAU#oH���I�וG
��ݴ�f���yԔ����+ͩ�/K5~�����d+~]��,INQSՇ��`��3����cqBʷkʬ����%h�W�O��ӂ�G5�!4���u��i�eC�OW��t!3��lg�Þ�Ӗ��pz��·z8t���;��/������b'��*�@~�� X��
�o@�
ٕ�×ŭ>]Ջ��q$��
�V��;��s3Nu�4���!��BP�ɟ������+�����8 yߏe$`^j�p��{7�h^<�7��W��#6�Lɜj�;N��U=N�}�t��%��l\��XG���	l��nP�T僶[�J�|���zjke��t����rV%����џ��#�X�T<�(qv0��W'�x���m�Ԫ8�dW&�;O�n��U��nd0`�[��ގ���Vg�rk��N���o��f�>����Ζ�!O��*�H@��'����3p����D��d�A�3�s����~i5J\�.��f��B��bဍAB�����w���Y�f4�U�*�����M�\by�<C��k7�,!���*�6�]ʧA
�!��ڈ:��<]�%p��26�*��V>��f��8rn��)�{�Yg����R*)?��@�#�`G��}��V��l��[��V�P���.O����,��Ū��\�U��3�f��N#�E�q�Z�Z���~��w9�!��e�zw�o�F��(�耑Ŷ���ĞDr�n*<O�ǡ��r��A�LPo�C#m|5��/Oz���~�T�V�ξ������.Iřr8�sp���ɋ��Z�.W�+ar6;���y�n1�T��d7��1_�ìR�d�Oh^�w����pdΑ>�)(�S~8A��pm���/����f�Dn�������W���.3êZ��`�z��w��e��G���;+����B�V�d��5e*��e�f�^ű��������X&��L]�:����m�Y�~,��Ui��w��#�+p)�ֺ��[��KkM6�u�N-5�A���b��q���&��?�ZcQ/
�ö7
�%!a�VYy�1��F�>J�Z�Y;�U��=�}���>^�5��NU,5%�s:g����Q�g�Ԥ��+��t�������β5+uNséu��iF"�f�,���o�#��_�?�E�i��َO�-~�
��5�]C���P���p�%���
��A�_�sL�4�c'i0��V��\�ܫ���-�=Z�:��x1gڐ~�9
�ycY������9\����A�9J���Ҩ�P�I�19Q�T7{�9�_R���]���`���R���D�#�P��t�휣
��,-�ԇOė�°B4l���8֨�@	�B?V*�����e<!��C��GV]{�4��׏�O�zm���v"(�F�JJ�������zt� +ո#��q*�^m_k�ք(�%s`%�kv,������'RDr��m'쟍�+=���A!~HS��|���K
s��"%�ReK:�[���[�;��%�Y�h�\����
�y�RB�Q3m8�W������z��]��� �t��xa<�i�1�]�u8LD1ٙ�a�Z�,|�愆��pEo+G������\%��K7�TuN�r_�c�,�u�0���6U�g��ہ����ԙv֫��7'��J�JN`''�|eK���k�
� B�Ǟ�M���q p��|6��U�����ۑ�tں�v'22D�<�u���TmK�ЧT��m]�S��V���b�\��`��M�˱cP���:-l�&�sU/5]�����"��nՂ��=��%d�b�B���(�Vu��ϋ/;�#�"w���	�҉/;�H/���ל��V���l��U�X]��O�u[��-Y���B@W�fQN�@��e���$���a�J�l �>��Vw���\�F��?�s���\.�2���X��U������U�ep8U{eyK	a��9��GTE�(�׫._��L�z���>�i��"�)V{?^
ˈH�`�@pW����/_�}��W$
���׺��t�T�>A�cu@l�2<��P�I"�/)����u�Q���&�H2SMvDza.P��^жs=�-�#��WS�z��O�ԋ��{ʻ�}ͣ&��	g'$\�AF�Q�3��9�9T'��Wvk���ee��S�	�)U�-�~��Z��@��ݫ�=����>j�Di��Z��IƁs
R�ڗ�
$_u~Nk"��3����4u-��7o�`v�"]<�:�IST�F�rB�D���Hx��q�r{ɧ�z��2'h鰒2�E��h�q��srt�G����_��>�-G��I(���j�8�`e?�vu���,!~�N���}��ձ�OW�q
^�����-]d�ms�֝`O�m@I��w��U�}{}pݼoU%�\���7�[i���L��k�l �s�&��F��k�NL�o��}_�SɪY��[J�%
$�,rp��͚bW2��yA�*rU��r #�a����e�0��˕j��]��x�	�o<X��}]�DѮ�e�{P-���k���ʴ�
�g���'L�
UݘY������k?WN�I(�9��Y�Q6_{~�r��U�����(��{�C��[���fS�T/x����J���#�+�����
��ni��evX�7v�#ŀ�юvė��d�u,�;W���_SirR2z�Q��)nd`�I�`=j�Ժٝ�v��x�]x����V�[ �U
`�[~��eY�᧫�d�*������Ecq�%�y�}ӁDB��g�ѹśeإ֞kD���1pIA.��R<��X�
�l���(�Ԋ�'v��,c|yT�О�u�F��fu��ۄdm�/�����O���6^��K+Wx�a�YЇjW^�)�W�'lO�J�}|Y9��U��ϳ�Sv?���
:X��"�U����}���j�T�����VZU��E�H�s����o�+�r��	���V��	�/O���Ȕ�ޯ��X;�|��\���Z�p�y��E�,D{L#��E��
�vxGͮ>��)���]my��-wTd��}����<V���*�p�9D$�)p�yj.$�"��U{?�'�uҮ�%:Oj��^ϓ1��#l�ќ�a��l�0�~'dzy���N�=4;�d���j�vY�]��k��ue*���=�I|u�<꾳��m>�Oye^|E���f�²�aaID��F|kd�L�oҥ�l����5 ���j/^/���3�����*�}�
��5�r�u��>N��.��ᑬª�Ե"x-t©��Y�2��EE�3�H�v�S����0n�$�h�V;�aG�
��2��V�%��5�W�& �ש6r���H�Ջ?�nDșcZ#|Y��e��<zr;�H=���`�z�b�A&a��4�������
ڨq��p@��A�a%ak�*�H�5�/:�#�kI^{檶�;����#�*���Gb7�V��U�gL�I��s]*kU;j���Lfo�����hh��pI/��ט<��5�^�h	���7��בG0�U���hd�[�:x����n�㞾Y^�����#D$�?:^c��U���N�#{8S����'�wSw��z_6i�tU���!��� =쁝�2g�BA�u���d.���|�\̭��:<�J}��v,$��,BB\�@�G,K�Np�l�\��<��s�}�Z��P�K�T
p��ک�@J�a�$�H�K����ۘ��7[pN(���;ЦC�I�,���-��s8��	�^G�3Z3��/}6ǘ�B�������k�驷�	��s��FSl-U�*���<��0��K��q��~���3�uU�m�e����>�r�
S��l�u��[+Sr�g_�Хc.k��v�Z�s>}�=�P�wN�`���9
�|f~�=���3I�u�q)q�pn���bh�i������!%�[�y*���#*�Qd�R�"���p���e˒��9v+�\�z������W��>]�d
�^�٘���6����Kj�oK�9�㹠?�O�b{��}�a�tYEV� �s��.��y����	���c	���u䱭�1�ϧ���n��#:�q塕ߴ$��\=4?�8��J��4l�Ľ�ue�d+�eL��k���%�����������k^��闳t��I�$�q��(�pʏ���7�vU�ҡ����ww�[���$�^���}Dv�M���G*�����OW����ޜx,G�>S'��C���0\/(尉n�A�d�D}p-!�b�+o[�?����;�0��j4��a�n2�է�A��wR�ב�lGS;WQ}/^��^���2�r��`iP�/- ���C�A�GO����2��ǐy�Cr(�����P�C���z�����z���Xy
����"�l�-���Wzm_�x�U��>��T�L�3B'ݣt���{������I�\���`�r�ځ�7��בG�B��v��u�4�>��z�]�<80��/��=!e��W)�
:t]Q�c;����.��Z��jv=�.5�X��k3sx<�;����#(�nTH�r�>�;��i0��uG*E�	2<�Pde��r)z=;�`��|���i��U�{�w�Z�!��p>◭d>]Ջ���Y�^u���t���lit5�f�W��R�B׾O`*�~�-�	��7�Y5'J:�:��U=U���[�F{.�ԛ�]|�|cA�u�qN���u�lT��;i��7#����843c�s1���aG�V�\ґ4*с[m�fӊ2B
\�	t\�W��gYu���/������@�ש	d|:��r�2�4i�%�U ̇ݶ�Р�񕜽u�"�-Pu�z����_����ɿ^6�Z�W!���?����Y��pQ��5"�tZ"Blk�jů�[}�k����J�f�1��6:L�������[�����N�6��Z�����^�oY��Z5��(�3!{ú��=�Rqޮ<���kUW=l28مd[`U���S���i��@^�L���\��p	��1)��[W�2�hS�q�<Z��gI|r��:4��3�z���4�gUI���+���Vs��^]K��G�^�N6�t3�3Y-��[�u�ћO���y'�sC���s��F�J�$��G��V� �\q���τ@x�V:��>�!���nU�e��/�����:��A*���*��2�#�r���+
�籟6�|W�g}�3U�ȇ����ǭ��Z5�;\Q� oNxP�ҍps�(����u�V���p�I�>v&�5�d��cᰭ�hY�l�b�cbc
����ϕ/%��M<,4�~��-��f�*�nP!	rp����2�huI
��%�kp+'���e�ߺï��]i��厝�mj�ڏ
F'\%�j$��q�p�U;
;��=M�却�u��H�"�]'�בM6�P��XD���f!�1�����4�U�,�Z�=$�������-�r+QAq�N�#
�wJP��ζ��<�g|ۋD-Al:Ȫb��rf�P������Þ�Ѝ]��U�J�xN�IyOQb���x�-���E��;�1������o���y<yԲ9���q9���GX׋�eρnWP�L.�P�{b'hF�O�*]G�1ў���g�b<�$���U`�d_�Թ�}�zy�O6OCy0K���<(�8I�40��]ѹ���T% �
@��:��s��Ո�CES�҈@�u+�:��E��X?_�~#|y�N�i�.&���)ah^��Ϧ�Ơ�S�E�OB�e��T2m�P��W�no�oP
��w��Xǖ}�
�H�?@�o�¯#��1�&c�d��r�Tْ�a��ܺ��-���������|�b�N8�^�Ѯ�H<�~�a�c�l���j�9����+�1Z��<�r؞�0Ĭ��G��ar#D[��?�r��-lIM2kx$i�����S⍲�+��>��Lp�D��A�A�xj}����U}da"z	��lrMU���#"z�9��tx<���������(}V+�S��o���@�gV�o�ʬq]DPU�=pp�;��?�u��ί�I���q�����@�Pxb����6�z�k�;��7oá���NL�s�>˜�����E5�H��k���N��sU�Q��'�mX79�ت1g��}�GB�F����Z�jM��غO��;��Vr����J��o�֗E�=́�v뻁���x�^GOU���'pMrD���p酵=%�}7��re��c=�苗��hIq岋N��ڤg��A)	w���q�G�)P��o,Ǽ�<���\
|ِE$�?0ꍔ��*��s$buo{��.p�.gI�֊~�|@�#��S`}[w�z�uo��=l����v�L{�߹�>��J��p@3]y��4Gq�L�h�� ���ߕ �[�A��_gcD��{ؾ��6�*	I���PO��m��X}؏|��5�#��$u)�y���U�KI��+0
}'��G:�2�j;:G�'j��Υiq���D�G�:Z��\�s�{I�w}���׃�G��L9j���N�f��G
�
��;��Z�R������v��|ȋL�n�ቼ�ǚ:��ŮV�s���#C���:u���G�Z�'SY������R��x�	 ņA�[U<K����$ܰ�E���s�h��<�S6m��Aɏz��֐�|Fi���oG�;A�'2JtL���B�v�.e~J8L-`%�:1U"X��N\��B��M���G��S�G^U]�i�t�w�8��>��_���dU/)����@����,���yw�yx�`�����0��L�h'ᅍDEQ��5l��W{��+��6re� �v,_/�}�����.�
^�6=����
8:,0
�e��3���nV��`�2m�4^�s�a3�VE��L{�!����WI^)�sU/�u�
VX��r�R��������S�O_���)~�8or����Aǧj�c�v�,��P�ߞ?^*��lV�J�L�g�]�����x��u����@�q�bt�N���\ef�F2�^�¶g2�Z���M��ǟ7��2f��"�ܖ�S4����:)Nn�������OV�-@gq˗D��'t�G�y����{�'k��R��k�t���N��T�tp~n���ՏN�9N�˼N����.�:���NN>Y�K��5�X�� Ö{�u�� a�<�[�'Q��M�T"�6נ�?��W�I��Ap=����,t�)b9�`$��e��OV��	�W\-9�8A6κp�[��\/�+��Z�#��1M*�u�<�6y����z݆��^[vL��C���,Y�¦��;W�2<�Ȓs�}C���T��\�\�s"�X��~C��ޱ
UfÕx�C#�h*֦v]��f��,�R�b�9�~}Yx��U�\(���&5��ۖbe�����%@��aN��������K��k�<Ua9JQ�=�<����e�m���*0c/���5>>]�G)c>����XA+6�0�; ��3/�>�煺����_���]��v�����g�b�E0�S�����Ьb)�y�C��_�˪���\Mo�x��BT��rp�M��Ļg��=���k�K3�v/���[��+�K\�L��?��@JMf{���c1��Tc靫�/��%����8Cj�0ǽu%缗I<���
/�����d�e���'��(ʫz�?wYp�]�ﰬ��0k+ܝ��3�Qs��z�^8���9���1Y�lv�j�a�U���/	4U��9��e��[����mW����r*GP�ī�Cc��l��b�OW�_�U"�j���(rP�$���Y�o'�Ã�V��:�#'�ڰ�9v��h��㼕����`r�N���<u��^H�\�˽>��'7�Sh�@�lv
�aO��و�����>�eѭr	 ˚U��^�e�%`�$�����h�%_�FVfk�q�c���Z_��ٌ^5��7
jK�c5x�=�Xm�5b�m�)�y,+\�	��Oo1��n"�6%�i9�����4�>zNmY �w��Ń��w�y���$���vo����/��DoV�@��ŝt����aF��+�|z�T����I϶�����OW�b[Y�u�Hҟ]ң����IO�rMf�;���v��)B=V����U(�Ҡ|�dUf�v�~���ǹ2�2A>�O`��/��~��)�mU��'J�D
sby�,��"�G����bMJ�pD�G~��}K��T:��a]�lM{�u���x׻�坫z�2>��7��!��U{�
�‰1�mq�,de;�3P���ǒTx/3�q����29l�w��"�0_�.ً���!?]���Ī��1�#ڜ��Q��|��`��p�)�c�q���!5�L6=t �t���
�I��+m��^��Ut��"=j����OW���
ʏk
^�h�94YGR�C�o۰r,��ʙ�W/����V���=�o�Y��(�):\��I$�m�����)vf�F����Uɀ�q��ފ�� �U����Gގ]:�s�����ݲm����kw�V(9!�G'�@K�`
{Ӧ���~W���sU/E&�5A[p4��C�-8��]����ɒ1��JL�8��\�˫�@���k['PdXE�z��æ�v��st89�ܭ=�	���J�?Y�+^����އ�n�l%M���}w�|�F��k{�ţC��%RQ��__e]>���1���H�-�v���9�9)�	��Y��[�
1ܪ���Щ�O����%�ë)A|(��P�1Β:��tC�DL���&��e'����/}R��t+Y+���%_�|�	IJ����r�3~���@K0A3����������pc8�mm��Ǥ��|ڞ����L�0t���~H]ϴw��#_m`g
�h�慩��)��P��?�����0U���k;8}�$���C1+�(�f|��f�]}<|�<����7���:B-��9*��v1׎�N�0��H�=>���`�'K���t��E~��A5q���rY^_3�@�Ygǹy�@��W{�>Y��ҳ�r�Ի=�̊���y��[$/ݗ`�J�d�EF�Ԣ-w[���IJ����vj�T\�V���_���>��x�^�9N'�Awn]����� n�����L�H�r)��T��2M�)��6AD�W/�a҉�!k�)�.͎��f��`�t|'�z_:�S�ݚ^P���n��>��h���R��C��i՜��m.v��z֏��b6����yߣ�]��t���M�38�}qU�b�0a��;����������^Y�7j�9aFE$tW�2+&1�(�Հ�$��ƈ�9��Y��y�s�1+sֻ~�r��>3��>�}�;LP����{�����t-��������ߎu���CPyu'B�e��P��r)�#TF��W!ZI�1%A@f��}լW���TM+�3qneƌ�i�0
���k�5~+�Ŗ�%,*�|�KАKU��"��hOi��+,�.QݔZO�@#��]!��a6��Ο����iBة�6���D�z!n.C�2΅��s�մ�b��d��UX�/��E�T}D�+A[?�á|��@���T���dL�ӕ�Z7��S5e�PKO0(��(�Qb�Z���2��Z-Eƶ��D	J��+4�B�����h�E�-�pl�=��p�kCf���n��Q*�>��Y��k���Ӕ6X������E�C��~Q��H�$��B�y�r	����/
rLk���E��G�@�8dJ-+����v�4�>��tI⨜�������Wy$��8Q~,�rZ!Y��F�Y���
���|��aR��VAA��1W�~��dUdr2��τ�*�J���N��D
�U���Z.�a�K�+c��-%$�1qlΙ��Љ1m̩�
��(���*��\lk=�J�R��0f��C��@xQ��֘�\<BE��*�o�X#�6G��шb}EF�!�c��2��FJC�6�Zd��%a!X�+I
z
��M��b�E�2����c�*�ϲb�O�6da�ui�k�Ga�
�z<�<��/����)>���B8�tq�
��5֑����""B�kS	��1�v�dB.�hd�mԚO�p�qz�9S�N+H;_l1��h_	��㷆n�xT,R�	K	Lp �_�Д��g�p�����+3��'�$�q��Л��P�DK[57��D�2��L�1+��g%D�uY�12�A]:�2$��~�t�">̡s�2ES-ȊFZ%%!�J{S�sw�Enh��o�\�7K���o��j<h�@�ѼN]�hG�[�~
V˨x+4"�X�Ნ
� �$T�8��I]��7���S�7�Dꩴ��ުHI�@4��x�/��l� �xОi�x��#�_1.��L��D��K��^!~�eL�&-��Q0"3I�BP�ҨWK�D\��e\FZ�E]r�e��HI,R�������A����R�WN+�6�Fk4��Rq+�m_��{���
fCK1ڕ����'�o3�7s�14a]bPBQF�F6��)�k��Y-1n� SE�����iTp���FD~N�K�tQ�!F�ٺ���$oW%�-E�H��_Rj�q+�\SH�,�<.�1E��#��BJޭ��4�ںF�I�׉k��e�S
]ce���%���E�D!O�W��"3e��P�J/���F�S�KG�jG�
nt��\��*���3�0�m�}�pЮ��q��	Ph!��0����F��D@/��aJ���Wa��%V�%��Hh��8N;1���&V̡0{��Z��A{�O�P�`k��������w��O��d�~!�"�@���MR�a�����z��s5/���X�'Z��T��W�U!�fTħuC6����TM��TڵT��/@�oA:�2:2�����PRcB�t-?��D�9qTY�6���5+����)*��T��[8.�@	_Dq1*C%��|�&�D�)H�N۷B&��q���w�<��R�
q�,�0�=\ ������y��[E���Ac��[��������Tp�8���S5A&O�H�^���8i	����ħ�4��"L�2�*��R�x�O-M��y�n�%G<��/��������h��)~e4�#�bM%�GP��e��c+�ۙ��#?�6QL8Q���!�˒"���I
���!�6(��ĹA"�j�Q흤9�8�q^LQL��Xt	X�I���6�n��j��Лnh:� ���SX��/)<c�����*�jH����	�.L�6�/=/��W�)1b�����+�t#g�Жq���C�*H�Y�Bl��9�5a�������d�8A^�6ƜZ�רG���ɲ~����_�=d%��{lL� mUW!s�c��� τ�E�[1\4�
ES���Z�դ�/�z��tNH A��p;
Q$�m"��\�
k�S�=�nm��պ���1և}BC K�̴��}�����f�24�1��y�2P�.K
$6��cm��\�6���ﬢ��`�L��l)B�D�M���2��*}8E�TqTf&YQ�h1�g�->Udr>�+��H�D�D�1�A�}��T�̭OQ*�"ZSi��vV*����(2V�	f%eg^H���ՠ8/��ѓ�׹P�h�To��S5@&�ÌF���2��j[�A|��bo�Qq`7�;j?�,w�aN�4ARϙz8iqf��z>WC�@P�uZ�T¶�I-�Q�lE �(��+k��Ro�)
%�ҬEâ���*w
���w-K=5�-&��*��4�D��}������;�h�JH#�b��!r՞^�cȚ�~���2)�+�&�$
MX��^m٦�#�pٔ�`eZzB�>��fĕ���]�vY�콼�܍�\�8���(<B�,piݰ��س�A��S5A�L#=_!F���;��tpDF�AE{�U��07���Ԁ����X\Px��jT�NAE!#RN}G�<U�{Q#<��G���r�mO�x�H��r����at�SF�<#p�m-�'�sZ�"Q(L�ǡ�X�=��I��;��Η�)1�VP
�1���A�Hذ�E�KתOՔ���pX֏��d4{$���ʘ�rh�5�޳M�xb�=E:*1r嶈����@��CO)O Q���<�L�\���)�P�q���Z|����BIU�#��0���M�0Q�V����H2�_b�p���pm�v��"85�ڢ�b\�&"zO��

?sVJ�6�1�L{�5Ϥ��X�r!��f��hB�fm\kC��'�^(�RR\�<W[+�:�w)H\9���LxX�Qdԣ�=A��6cU��Z��ߧ��Q�>UCŅ���Uo)?�e�9�PĮD�G,%B�<Ļ"�x�v�T��m��G�)e&�[�4�N�	#&i�J�n��0�.�H(^Ա5��A�'�ц:o��f�UK+�+�*<��0�1��=lk;X��"mW���# :+�hh;Dt&F�8M�-�<Q0�H(�F� �|ۊآQ,1�Muz���(nD\�h�T~N��А�h�(U���Ĥ��9,��B�U!���๮��yh��KA}�«Q�A�V�[�Vā�b������3���e�h�vB�/�
���'9���xk'��;�˶8)`�n
_x+J3C�*1�
������ٮ
�.ңZ�|��}k>U�˃IҐࡗ���c�w(4�,�����P����W��*4�LE�*�Fݲ����0X��	)����G�^i:�"��4#˝^+b�F�D���2���XR�7f|�<Үf&�\���B���Ճ���I@a'�rH�U�F�uE@�ʌ�]�˄S��{��>ieh�V�W3�%jt���̊�j�iA�dXLR��⯎�2�Z��R�š&X�7HE�*�p�!�)���5`}mXX��W��K��f�[���jK�D)�
�B2WWu%�Y��R�i�MmP�N$E����,�l�JVsn��)st�V�؍����Y1'f㣰��,�w��T
������(���h�$��xY@j��Y�
�GeOALӆm2�7Ym���e��oX�?��4���1yn�t\r;��6�_��3*䭸����,Fѱp���g2�b �2dJl�.���S8�mi<�o���@f�Y����a^�:��i�՗�N����Y5G�>��bnKĠ1(�2� S*R��ص�a�YUz�P�P�,��i��'
�[��w:٣��k%k��� �"D7kݴ
�U��
�β�Y�O���Lq�
�BkMR4�gx�s��
����OV�眱4�S��EDi���C�NLhP��cF��y��Om��J�w��꘨���
V�X�N)b�p�2�Y0�l�AŤ%�1O�����D�`�Wx���GVYs�Ta#��
a��2��,�;m��KV_bg�U�ŧj�LHT*d��"�}_95BN_aO�;A_ID���u�����!��+3#B��q��b��������<>�a�mY��_��\��TM�)DSU�3�,�`g�&S�{R�y(�y�_ji�v��
�M�}"�����Ђ���Yq��u����}&.��S�#�U�3A&�tZ��Q,ф��Z�u�W��|d�}�b
vյ6;�f��\�p�(ɹBi=䊵����z�xZ�4hSE�1LE$ͭBҿy���<lK��JP.-�ЯE���4�j
S9�[U�����/�$�!E�
�pIJ�P@���2�O4g!NҜ�ټD+F?�B��Z�4/k���x�"U�k��Z�.��e���D���Ry)�c�DV�"�a*����nb�2�i�@��CqU��RݛEq�IMe�XZ"26˒Z->USv�b�$��F��`WP׆Bi�P�K�f�A��EF�`�SPMQ�R/Bn,�+Q;˸d��J��Q���ΟGyֿƭ�T
��ZH��n�A�	��YH	����0���3T"������;Qt��*'��빔ޢ��4��\�d�c~P*x8Ķ}���F�IDC�5���3#G!�`Z���ARdV�.���ҁE��Ҋ� ��E��6Z�o��;c_�;�
WA�ܾ轸ZD��zJU���������ܚO��*R�&�g��C纅��T$^X��P��T�bf&f��'�jT4�*0T̡a�������C}@�1=G��T�|��[|��,��N^U����*W<-:d�@��r
$�����Ր'~(�+��Z�ؑbM"���͸�W�'cqiIf�hQb�^f+�F��B0@!*wA(�+�r�'���M_S$��,��+A��2�A{�R�|�X�gQ�?���8��4��C/.�
Q�̄�ih
�p�}FZ|*�1i�T�G�
}-w�2/�rE�Q���r�6S&��(^j�>R�r�]}�xb�J���)��V��V���)W��_�3%a}�Ua+b�F�Dx-�.v1N0�Jc��Q���Sq�R,/�A�J��쉑�/���^Y�*��P,F��(�����-��Q,���բş�%��2K���r*6���/"/6"}��GiU��vq`��1w�V�X8�D�uh��C����ENĶ��G�;;T��βr���4N�O]m�T�B�!)n�.T�+��+S�֕ckcrq���'�
L_u��<~݇���{	�Beq-?u���N.�J��Y�N->U�\q�S��'���7�>R����4-P{?B<�$���"m�(���S8�|�)=�&(�L$�A:˪�����R�](>�Z�4bj����
��S5@'��S���D/�Qt��{�U�.��8z�����6���A�L�.NR��)�vH�7L�w��PLԂp\��"�1���Z|��f��lZ+?���
��IM��H1\��P-S���2��2,+��K�
F<0#��5&X�P�B��8���i)��7��j�~�O���1�$��0�Q��s.}L^(	3���?+���f�W��V��x��
�|^��Ϣ���P�"�U�S�t%-�|�Kp[|��i����S���kR2��<SV�.
�}	��b�t�T�{v�ة{!B1�л�k�4���f�Ǩ�+^��46(��~*	�[u���<:JA�tQT��x�%`�\U9����b�K�|��A+A��/�A>�ʈ����y�ְo�E
��|R���
Q��|�U�4�D"���kP��A�Zaq�떳��p���,g79ur�_9Aya�W� �8#�2���%&
����4��*ʤYXy�z���S5`	�]�

�wXQ��ۏ(\�����/J�B�'[Gi`��[�
W=�|K������R�Pk�f��b��+k��ڝ�af�p�5�[|��b՚!��"��Ӥ�_}Q
���^E�=D9�����
���+a�I;�ʌ��v�ڽ-��(�)|AZT��r['����s��[��MࢲBIR%����IP�O�H�ñ��	�#/g�\�Si�$���e%�� �ȿ��/Ы0�q���t�#c�̪�"9Z���0k��j�����T�z��_�\4� ��lѨ$!�ڌ��<��ޡ��@�
dU�tɭ�_�?�*s�h���&�m1�4j����m�p�x�C�v��zXh;�X�F�IP���v����I�51@$��DC�^ϟ�X���S�҅j����!��q��x�(a+&��;a��➔�#(-�TNk+�
�}t��@�6��X,�bj1�UJS�"�*|�P����UnN3?�r��IdtM��%RwԃW�E��
l�L������_�<KCm����q%"�/��ʀ��T,w��q�%�[�pI�ؾ
W
�i�J����L�Ū,H�B��zM��TM�	횔�"q�a`�I��|'a0Z��RTt�@�6�򇙥c���dA�+Y�8U a1Y�ŧq�q�"q���Ћ�
����|�&�$t�L�Y��CdRP�ġM�VdÄ��ৰq��XԽ��d/
�_�ެJ.�\����Ԣ��u�z�����v�5wz�V]�
�Ih�#��L��"Q*�!���L�ټ�%�~�Y�P��\d�g(m[ŗP�@?GK��Hۈf�XK�BA3���y��eY>�m->UCK4Z�E��6�2��N7�� �p��v8�*P�L�\�V;Ka�DS���A�l�8�V�b��!>h���Vj�F�I(J���|.��S5A&�BaS���)�5��R�ɍ2gA�A�G�c.��N�Kj/L�9'0OEV�u��N�a���%�r�"D�J
v>�⭸��|��8�B��*Qv�*=j&�nDŽ��')����"�EL��H��������W��k�Om��r�@<[�+�eje�p�"c�W�LY
p�'���M��#�SS.Jr���k#��DŽ�N뾑�D����u�����C(�6��U�/j�g��&���K����S5ب$‚UD�p+�[�u�������J��dh�_�o��~*kE�[l�Q�K#�/��!&��6�*+;�o5ra��M��ϲ�`�OՔ�QƉ�!�Bx]ĺ̠�L?�B4�n���fC[�Z��,6�P-aU�`�8Jm��E� B<�K��1Zr�~V3�'�->US��1l�"�rO��ǿ@{[�E����	4�XDHc�v�q�ɾ�
���8mH!=A0�0��L��V�sX��[�D�5��)+E�8�#���I�p%���#NX�*��P�ӶO��x%E���S����J�~g(���"���H;/��T�8=d����S�
sEAz�j��m�Ȓ�l�ʵ�3�1�W��B�Y���X֊k3�͈`�@#�s��)N"A�sR�G9 _4."ī*̲�fO5ӝO.p l�1:��'�W��	��HV�"W�u���	�=�`�	/��V{QP(ȈP�o3�mA��:GA?��k5К{�!͡i+F��;
����_�"K-f�I
�fe�x]�W�B�WH��P2UFs��$(���S��Tj��Kۏ��⥢u)�Dv6�~>�և->U������~���)�)?�1W��*kk �_qELY�IE/m�D�&�Ɗ3-�L[.�KR�����hE�_Ǡ�D�.m:���[
�ɝ�"���D�"N_�(��'�o�T	��B���8I(�HG�-&/ZfiD�VY�-}ӧ��iΝ]�4C��e��E�Jb�1���b�=��Z�M�Iq�|���Tq0�
Q
$M5�*�?���f�����*@-�:u���\)�x�E��xˆVҾzh��8.��ԛ+�ehէj�+�Ӥ�8�-����a�g5q��:��'��EQ����݅�dk���q�b#��!Ɯa!�҉�rp	���K":��lV�S�O�p���'b!j�%��B�M|�����S�$S�yTh�c��3�o)�qu�|�)��l�/2c1�0��KEh0b�i*�"��Y-�i�����0wBm�Q�K!z�
*�HQ�z�b;N�zt7W�Xx;��m����;�W��R��sB�>�:.�WF�E��Ut�z)�^"��G�(��"D�8w��q����f|.}#��M��H�[����-��Ҥ
����Q�p��1�2a�'��S5�f
�|�m�
�;J!_��"\'bO�A�
#�4��Kr<y8����*��,A�
�x:�"m9N>h�-�£I�I���$�d�c�O��רTN)C�k�>�pT
'�)8�����+��1��
k0DC�T�R�SL)��@�pq�)U�їyq��=^���F����H�O�4�+��1�D2�\�#��S�V�R�x��ծ������%�	�~�4�R�^M�	p�E�R23���6��mnEY�����z���S5h����&�َ��Z�ײr�BF­�	i�P�Q�
2�@����ӫY��������R��8=����+��|LŐ�uc`C��ґ�T���)��:�<8�2C�
�����/�q)��p�(/n)�BY(V�T�5�k�.�����5��M��?�F�sy����$7t�D��kcy� VZDz�:���x�V��F��g��R�2M�L�S�o�j-{6E�E��ү���5�9���͈I���qK�ը��,r�Gd�EXbrد�(\(����
�/�QB�M��)lj�q����"�YY�Ҏ�{R�s�n�.v8�U:��5�6��E���&Ex�R���Z}��Z�aiD)����v*��l],�U�/+��R);RZ͕��u{>����Y]���
��PtD��ָkńef��Q�sE�%�G�.?��֊)�x����5�|��R8�1�(�
�g�>�"H^���I�y��.�@<W9$)��W��œ����	2	�V\�%�ҩ�GE�B!����fbVh�L��A�eO�$SHD� ����3S�
}}_�@ANY�_)&����e�������j(����y�QW��	
_����]qSj#k-�6(澠:&XB�TAn���2%&7m=�F�`eq��)R��Ԋ"!QI�9/2�Hk>Ud�U����u���j�l��P�T�@����R�HH���OхU0
�%��J�����,Ņ������MF�>�j0Xr�[�4�
��0�RPZ�%J�����챲D�����P����b� �qM�P_*����;-b���<"�[w`hV�0��?*�
aR���|�&Ȥ%'^XJ�I)􉺁��!UP�ФR��
��b�69OL�ӚL�dN:|����l1��~~��m5#��%����P����\0U+��FM�����?ʼ��OR�s��$;0]*2���h7.Am�w�a�S�id�i�ږ�ܡ�P+F�R_�hQ'�H�����z�L��@۰ジki�KMq�T8/)��ņ��p(��̖��ʾ�bH���b�C�8t%�;�4z�)n�bρ�g)�!�(Sq�`sR�֬�u�In���b�^�pa�0N��)(p��ظ e�͍�t�\���V�@H����qӢ���*�xi�Ǣ2ډeU�8��:�ӹ�7��Zg�jN[�5��W�
>0�IQ��r7]{��mN8@L�]hT�8-)<�(q�6�5eS$�c$?Z`�L���M���}a\z��s��;��U�K��#�����D��<����C���F�S��<C_/�D�r7(|Db,l��n%$mM_�$�bf�&}����l���p�(V�ʤDN�,�"���4Aq�m%qW���"����jC��2qZt%����˔P�B�<�L��*B���U�VTE"l
 ���]`)+L��ךO��,g�pNp;�3�D�nxx����U1��hΥb8%5�D�u%Z���++�;��vb����� Ԯ��H���2S+X,&k���]�x^	j�&���pul
��2����n3E��s�X�^�]R�H�F@/�X�hZ�P��[Q��V�Z�zu�I��HJfU��姊�GD��0MK.�4�:/Qʓ��E�W*8����H�y�O^U�?���v������\����1���^�>�a+��9�V<l�t��	�٨�"�h��p�S��3|��,�h�֨�yw�!6�i]*N�	A��Ej���IU��&�a>�=#-?Ud��T��M-{.�b1�4F��j���qd�Yr����\��U�9ZP�wW9-V`��'t+�,|�{)��X��j&g����j�L>�\\'�S��?\	(�*�j�#����R��_׭���b��E��ԕg
���&��H|�>!Nk�,�{����,+j��T��=��&�n%Ŕ�SG��ƒ�AT�@�؍�F@߭OO�g�/�`�'
�²
�"
����e�*�eO���9�B[�G@�ERU%����S5���٢�x��R����cS��F>���|�+
4�k��X,$)������~��B�FD����-���>cןD'9%z�8d٪s�P&�0�ʰt�f�!�~���OQ!�*��$���1����,Fw�(�_�sH{$�&J�zNN`��� �\����N4�5��)�o˜í�>����q�|�pƇ�0Rz�0�3�b|�狸�mX��@,����6���g�޷)�)]eA��^�'`W��՚OՔ���H���u��|�i�3
թ��B�"��"-�]��Jqs����cl ���\(D���r=�d^�U��>9�@u����=[1�7���Ef�A*0	UVAr�)��Zj�Ę�ƨky%��3y��g8:(vj� ��Ɍ�_;��!=AQ,b%t�Y�{��P]	ϩ��U+�ƙ4ݔ��B��
IV���h&Xe ����VW�	�(c�D	+�+�}��B%6�!���G��6A�D���,�Up}������Uc��]TZ�X��bR�KQ"O++TAF�^t��(�Q4�&w"""�O�}���ʆ!sQj��J�(���KXK�C&H�Vd"��=%�Łb6D��mi��-�B�L��PN �,)�{bУ�����-�)7(QyB�i㠭��lV�z9�NfUL��j:��K2D��%	�JY��O�t9�#�Ǖ
��J�(CM3�����`.�����P���0J��+"F�âk���W���fU�O�p�`��YLIG�*M��2�5.6�Z�W;?��8j�kO�$�K+~�Ѿi�Z��XZ�h)I҈:O��
^Ʈ��\?B�ҠX��Oo�{�V�v]	�_I$$�wN��VR��u�p�^p��tK�1
w���V1���M�{��!7��lƙ�i1�j�nz����=���5)�L�=A]Y���hKڊa�8J��t�S�]��k�(h�Q�/�1BǥO��E�F�aey�KV�{�M��|�ͣ��6�ب�nͧj�L�y!<��E�=Lߵ�a�&�)D5EJ2�U0��A
3J�Σ(]ĢzI&p!�+�z=������ܴp�I��-hœ���my��2Aq��3�QAmU+H���k�EbP�%��u��J�c:x��y8Uh�	�y��|�9���
��A�� GIF�����׊�����a偏Y�FO�쬈����2!���z>O�`��o��bD)���r⌁�o-$�D�)�����Y�e�%�5o�{�11N�-NhA�Q�K4E�Ъ*WĮla�I�n9���R�4I8�
~Wfs��)J@��Ŝ:<#|6��hy#ʢ�ڊ����'���L>���^*�uS�4���w�b$����\�Pf�#�-jK�i�f̺Oʜ�%}W�r��o�d$��U.@e1�[�����G�O
ӐT��Q�!V���fɅTL�`rŅH1A�P�KD1|�$S��g��M�P����������bn�x^dy��UdR�N�L,��Ʌ��!�o��S��բ�
��1%S�2��R�~b!
,�Q��RZ�� L�q��0�j	���Ɣ*��d!�z����f��Ii��Yjʊ�V�P�J�J�/4�(]�LχA�W���w �D؅X�/hʑ��x3E���}�{E��$�=e�HkQ誾a�Z��U-5Y��Ni�~���7-Iu��—R�J��.)*�j������Ǡ�<%Pe(Z2��<�=�@��U�R�y��h�|���cPG�c��L
K��\�Y$�Cu~��*t9uxI��W?��s ��Jك�H���8���!�#�MЂL9Ůf�8��j�>�J"nnh�
P&�4J�"9�X .R��
O���'�yZ��
X+[���$+$���箥tZj>绾S^�я
)�Rmͧj�>(�8F�Lw�ę�"�P}qlwQB�#v�e�~�>�B�R��	&X�����"(V�e�	
z��5l,A�(�I+�.Ļ�[6��Ta�A�;��z6�'�
!=_���]h���0?��.�DZ,�"^N���J�|�v�!��eԩ�,>t�>�&~d@,�Ġ(3��=-?US�	�
��w[_?ۖ��%--9͐�wf9�,�,w2����E*��	��Y���Bn�b�d�G����~��N��JJ
D��܊1���'�H9Fy5
E�89��,C��Z�)F�G����ӊB ��v
5?�gQk11ǔ'��'m+�`SY�S濸@ʼ��6"*��[�Τ��£����y4 �yk3����
k'�M�u�4�‰)g4��p<�fO(ʰ�����4reE�
IA��6^�&Y�:%�B�qVU!Z~���.,���"���H��Ey��n%0�f@X;�`7�H=cw��cj�*|�2�,
>��KJ+j�ŁCF��.�~�)%�U��?>U���`�@����	wq1��%pIUP�.6��7T��[�(��w������h���-T%اWY%=� J�`�Ds�<��[4�l��^��4�����u}䕲�J�ptQ�췈�s�͝��-�<t��p?2�᭙b�i�S�e6��W*_�aʁY���	�#�ٸ����0�ӧd�����0AI�M��9B<�	���
����4���c�4)0'U���H�W�FL3��0wb��������@o�h6.��|�8�f�.���ڍ$��B����9w�����9a�=8�G�B
B�EX�+�W8�	f���b`S�&�RJ�=�ٸ��X��{6@�2G�<�>��	EV�flуK�TA�Qt�����8{�"���Š����,@�$�r�)`O�X�Q�5W���J�/�@�Ta k��'i��P5K��,;r��5�E��߅"��o8�����JoB}hm�"O3�iс��@�M/0�\�Sy�l\������pM=�;LV+�t�Β�@
���m)ʩM��
`dL���d��׻���JݐEVJZꔉ끳B��R�C�%p&��c��ϛ�+�}\6�=/3���ۜ�)8Pڧ�Ӡ�Ԃ(#�j��SF�}�'�����>��E���
�龅��Tq���9F
SAw���& e�f�J~
��)Ǒx����#G]J�Y�x� �CU��x��!f����,�����8&�Qe��pNAM~�\~ZC���*����Pq�q���K9/�A�*�{�
 /�j�1e�i��Ai�)�fЊ�a��k�F/�����6�R�eS�h�L�	�›Q�ը��ߘ�ٸ�����p�V`�`TB�0,UsJN�{�/��+?�1\��g�O%5���ѕe��?����&ͥ���3g�"��V�Y��6_~S��=�_;R��8F���R�K�4.uf�%T\ZrC*p����R�cZ�X"�����X�P�y81f�~J=��ѻU�J�9���6#�gH�T����[c<��������̸�ĉK<5Di�(ae�Fi=�^�q���^��·-<_P�����C�B�O
�G�G|F�ϱM3NĂ�4")Q��?ֺ�.M*�-h���\�ԽzAU��.VF��!�#�u2��{W�����S��'�P�R3��lFl��i�pm�L!�RԮ��PppY�]�a3)l��<��za��ϛꇊ0iv���a�����/��~��E	��
����^�X��b(vS*��}a�/����B��j����Q^k�k���Ja����ԒJLc���EEɆ����2ҾZQH�׺��	�8��Lh�P�u��
g��
��6>���;_N�
��ǝ+��(Q�+��#h��f
Yy�R������e�'*�1Q���a�<�q�D�&���L����
7"c�t��(G�/b�H�.�hWt^����i��"2ڑ�D����U���i�mL�^�օZ�A�CDF�r��+�/��M�؂�\-8�u��QI�.3�#5nm-7y�r/X�i��{T
f)�
)0Q�F@"BhDY4(�ɋ�B�M����f!,�d#X#�B�o��q��r�Y�XY�E��qm-�b�i=�]el�¨��t@���5��E\��1�FEOo�u��q
�x��K��D�W� �=_��|�&�s
�5K�8F�i�F�|C9�V�K�rH��C}�эK�w��y*4	Y�|�m�"�z�����ы���be��>��e�yѰ�+�8�l���?�j�>
GJF�%���^SO�ԡ�q6�b?��K
M�ٙ���ؗ��Ϟ�{z�ք��Y$���b�Rah�hQ)�C�%��!TH��s��R�X����k{���e�Q>�.W��|5�6،]��q���8���SD�b�q�p�̓1�o4C�E���@�4��d�0�pr��\,�J�@[�D��Sd$��˭��B�P�Ǵdf ��B�r7���[����X����EX�>��Tk1��j�ڵb���չ�2�^�\����D�]X ��fz-H��'~�|`M�:�����n.d�})Ơ��
�^��E.A�0EGD�(�o�Qj����&��%�ĕ~T���!&�`c0��= KE�F�0��9�63Ғb�<�iۅ�fX)���!6T��b�����>��3L�O8I13�)z��k�GW��Z�Q9��J���2!W��6��fF�E�KhU�",_�M?X:�¾'��JT?K�'�Fa���R�UØi4�~%�B�T��s�$�^U���+�r��Z�<����Yj��>��
�r&F�Y��+�\�<A�KH��@P����1p%7(�h	u�":"rn��9F�\��UI����քұ՞�Q�V���R_J�4hyx3v��~��B��,5��l�<��rS_X��R��E�Q.P�sY]��G��&�U%�"9��`�DX��2-()(��3��A��ʑ�Q�max�gt�/�� (�ӕf82>{���R�
3Q�"��85�W�IL�|�2'������@A!.YF9�=�<'��X�?�nh62�id&IJ������U�/0��@�d=:�j�.k����(�g�5#�l)/�4chL����pgN�s�-�0���4'4
(H��F4�L��e㡥�&7bW�j�"r�7�Q�)���'!��Pf0��b!�2�P[�˨�e��.@�-��'�}�qh����M� R�lda��h��M�DI���p�i�k���!e&FE�X�OtY��8��B��BQ�@�i�C�8S&��	�kٱ$�E�*���,jYR�\%�ۉ�r�WT�ejUZ?�`J�y��mB��'�
Ӥ�ą|���_e�HYXX[\�"�8��M_�x]��c��L#�w��^Yꭦ
ш���e��|�a�$�MZDM&haW�GE��%aP>\�'nE��_��Lڢ�a=E�/�Ѻ�4(a
}u ��L��5�P��(����ni���g����O�x��g�!_D�=b<�{�ah��J)��^�o�i�t�F�U�z����vQ$�:�A���wf�L����W釋*�;.�1�
Сȹ�V ��ޑEO��"���2�qKJ̄J��+�D#:��+M�u0�2tED_��zZ���VR��5�M!4���4^A-�_��G�)�N�·p��bWGg��cm��֘�PX(A���]��� <�q8Rދ
f5	]�Fx^/O�*rI�|�5�M�;ѵ2N���/¶�P$AC�Q��#��+�@��c덥V�U��(��\t٫��qá��B�;�/$����̃Oʕ���ao��k��<�jU�\�)J�r�2�舘w���Op9=l-��Ĝh�%�����9#���^�J�d�F����k���b�V�F7��L3�,��蒚�~*�{�^U��E)ܥIC	��}Z��5��d��랐���U*��&E�R<IX�j��$���}�wIe��%��LѦӨ��覠xű@$*Etrh�*k��,�g'3C�w@e?��[�񅢷�UG��H<�:�
q��~�s�NHQ�Hl��,m�N��"�B�K�w�Pڑ�膰�J�Sdr΄��b
D/,�q2CQ��`Z�i��'�'�Q�,񯎸�K���*�˰>��7�mxg���;�>W��ر�`O
g���+P7��L�b��ϲT�TF+2�0O0}!�x�2:�(�Sj�,���6g�;�3+���Gچ$��7��=b���z�2�0�>�q䈨���\y����X�qŒ���[��������
y��-bǂu��)dCm��4�!$��e]�b��K^�L[G�7$E*lQL,h�@>�P���Jp��!�4��a�F#*j#���P�ɱ��cd܅ˬ�P��FH��L�r���@��h�����a�Q#��<���Z%���H�.X��"dE#Mf��+4U(�_e/��J�P��_y��|h
y�q-��G����\��qT�%70`�֒�>�-j"���VV���wY���VT�ЮOj�9�`�E��ZC"�Ɛ,���iLm��ʊ�
���0�@z?�h��T*S1�jh&���	hj�{�Ÿ[Vj���\]3f��[#-��CkDi�"�X�)���'��jAd��}�Qpj�,H�b��aMﴬp�V��pm<U�Q|�������	��;ݧ�H��CkH���
.vqԎ
�Zv����H�4I�aI�y$�R��i�⢅�iU*�iRP�Q=�j��A��J&��)���hfU���rAX ����v �5�5��.Z"{&�Xw�E'EI/2c%wq�	>b��y�/P�X�(D��'Bl�h��
�-A�xf�i��� L4 ��;�t�x!����`�^D�mY�/�H2�ډ:$(�)�*�ǜpt����Q�@J�st�i�9��D
rZ]����#k�j�D���7�n0�WHݹ*#��R�_p���|�…�TŷBŠ=9�����	��5���z��'��VA�L�����uc�f#kjt{�:�P�����F�ڲ^"���?1)��@1m���u6��&u	Ed�T��V�VE�s͍墆�;�f��⚍�!��D/@��X	��LO+��O���8�r)�C	nDHD�eT��Jj�3up; �ȵD@�D����R�jؑ����YYPP����ld
!MiُHxK����2W��FrꌭW�n�(��Q�9u�T�1�+}�%��S KK�y;}[��%T��H�=?i���b9E�ۯ%*|�fS�0Omuz|�2�@�����/�+�pB�
Y�����N@}�h�R�6�8����7�/��]��菠[Y6YC�-5��ՍV��w)J41����蝻�>A�u�pb��R�'���4Wh��YY�WD�vYH���xyJ)V$��|6B�����$�dr���"
5c��1�ZLr�'�rQa��d����i¼Z�\@�RN��=�xe�4E�9����0���Ɯ��!�R��8Sf+O��x�
��	�'>[X�7s��
�9�X�>�<8���Q��*Ă��T�.��X�n�$�(��U�Z�#m�7PwR%�@(L`�����ɉ_���!�Q17g�\Jٌ�Eh��!�	Sj�W�ٗ9C�<WJ�d	���n��BM�Z�H`W��oiPwRjmhw��l��|�-�a|#�4R$\R�&��WA�n}|�q9�+d�k��Ba`*jP��H����Ū)���΀��"�<4�'�"���l�tEEl)��)q�' �/SgbsN��0=]����|Wj�ڕ
�
h���v�ސ��i1������g#�.���mlE!�RXJ�M�\�^M�Ū�ῢPEC@�i�aE�=��4��&(�k�r�/��]xӏ+���A��@�,$�8���V	rUb
��
���H≂�TQ�^j�Ю�D�;a9%��t����������X�2"��YW�`a�lO4��,�;��!wR֍끦A��z�W�֏L,D�F�6Ń$�o�в�bΧ�K��í�EG#*6u�ԉ�T"�J^��B@��)HI�{L�h��H�ִ���(2/�0"/b�nP�#�^B�h)ɡ�I��X��+��k�E�Q��k]*�r���"!
��q2�m�	�0�+r�M--
�z����qd��as��|\��'���a'�d�:@`ma�Ը�_� +�oT�$�<�Hq�����VY�^n߮3���Z���<+� qF	|}������8g
��K�ևaJ>
)}�W��AC�RD�KDJ{Efb�K�h	&�H��F����M��s7"kbØ|��9$3D欒x]7�)��^����ΣFm����H�.%�*��wO�5ݏ�ʴ���FeZW���i�jc�5֌�0�+2к�Ԉl
���`�����K�Ke��l<��`������B��D-ֺl�r��(%\.A�%�9Ȼ^r��ؤa\�h��������<i���F�2Xc�S"m8��k��ކ_]i7$hK(�'��m�PMS���ȨPĊ��Tj�$��M�2��,R����4;(�RZS*=�!�ks��gIn�Y�LW���;r����|�����$9B�Z9�4Q P)��S�x# 0iMUDXW5W�4�ָ�Z�!<S#��=�HT��W���ą���ԇ,ւ�
����3>��>a/�
D��(ሱZ�)3u�$]=���9�?��t�����?\� #�S&��<)c=���8j��&��
��g^�z�x�=���
4��Cs�*]G�TAh��UV�HTV|�Ґ��B.n>�^�Q$�؏�G����0����N�*��`$J?�r��
�GT��yN�r�%����Τ,�!i�TB��q�H�pO�?'�}q�T�ՙb���̌;�0���1e7Q���D=upCK���+\�U$Ě���_��f�(� ic" ��^�~}�
�qE�{Q���3��(��R���oe��p�-B6r���?B�Nc�*�a�B��8�YX�~a`��^�k"��4��Je�**�B�/ǻ�V3�Ԑ�9:՞���
���pPeBr��\|s�gm �S������2@�n�T�U��B�p!�\������HӢ���R&�gf��!O��JZيv�Y�o�	!�Q�[-7xG��N�������.��!B���@�;)� �@��ϵ!�%1�%�֗�<-AX����xb'|ӔJFQ�F�}a
㚽�PO���e�$ZpԴW%�/J��h�F�ї��(��5ZC.��z8}���"��͡h�hXØ�m�YfNQ�5>w6�A����R2G�n��r�g�$�n`�&*C�ϊ<q}�ir�
��)ŬL_Q���Y�&“ϸ�1�tܔ�}��/�1u�(�(iSG�޹��>ܴ���8���s�i�R⮨�E̎��ٮ)i��^xAZ<���9��-NiYØf�'m*�UE�"��J{"�4$�j�8�E͇^g � ½�YWTW���h��jF�Ui3�nΰ�[Z�a,% �N��zL�O]�38y#H�B+���.͡ȯ6!�DBW�CU��uuQ>�t��zCH���2���d�v�Bij�>�G<u|�L5�^㰚�)p�B��Z!WV1�b@��2������-��d���|[џ�S���"+���N)Ħ@7�
=��R��>V��=Y
�7�*��UY�g
S$v�k��wHP��_�
Q+\��fy�hARJ	�L��a �J��Y�թG!���[��sd^�aO<hy�e~T&I蔆l�lX�!zf"�ADhO+�"���IOa"�bOm�4�cž�)�q���=W�<*�V7�bO	KXP�jk�O�v�Oڦ�6B���g��siŽH$@G$.r�g�c<2�zde��5�=Rԯ,u����O�7�(�h�1ID�	jbJ�X��Ӹ1�2ܶ�!��m4���^'��Nf�t�CWʬP܌�0� >���4�KDb�+N�$��r�"ܮ=YW����*�T�,�Ȼ���AI}T]���M��Y�@�)?�5����tN�3�*v%U_p%NHu���Wz!�7hP��)����#$/$\��WU12�a��w�rE{Q�/E�*GEI��~Ӹ��{-�7�$���/T
�-.Z����B�h=��Uq��w���b�+r~zCa�/�>%G �(�?����T�"�\���q�dq���U�8IP@򑧱uS[B�R($��!@����jä���(*�]��跇�n%�X<��#%��uŶ=���u�-�9>ލ�I��0ȼ��f�i�+�1�t)vہ�sZB,:b��:��+#��R������4��G����W��V`(���>*+�G�P�ʬq`��ZT�������TV��/%}}N�:P��.��}>VT,]���'�_�A�@����w����s����'����/�q\�_ �j0NB)Y3b8"BF`�V{��[�5�%cc�gE%-��9�_��'@k#�j�
�-N*ε��ނ�t���|��?��}�vl^���%z=�u-QX��d#�Crڌ��n���PY[�cW�/�(J�ų�;”H�y
r+'*�nbR�#����o]gW�x���~\�Ad�Q*�N7�)�.'4@=�Kw���Hi1Ñ)�vT��C0�%'DD�T�Yz&m^�7�0!‚�-*�a
fW�n6����f��2)g֚� WP=�>R��<�Sp�F��MI�=��-�M��a�����-kk&�L�7���]�X�B�b��3��� �p�J��JnF�L 5PqՒ�,���H۱R���[T����(�h7�qPYF�v���&J�ls�I]*^r��)�Ʃ���7��'h<��~J�R��{%Ѓ3_αw>�/>ӡ����*�d�����
��W�s'؀2��]K��U��f[�x�u-'��~���j���R
abN�J}�����&�rZr ͢�X1����ۨV�>��]�,�
���9s����F���'��(-p��p��y%3��I�҅���*��P|B����g���ƚnµD�E��=��k����C��N4�Jd�8:�&)=����	����$���̃\SĹ\����4����&�v(�9����}���MxTn8#poqx�i��*�f(Ҹָ��*�|6�@��(ca�<�&)$am\���4�P|T4��u�&Nd��y�O��Mh�T�F�Q�(�C<`�6�_%�4q�I�U�P�V���-�t6���
��AU�Uث�tE
fi]6.衸�X%*cĚ��E<Lk_�K{(QVf��1cw��SH)�a��,wQ�F���ђD�iZA�� ��w��<���z��5EV�z<=����V�q�P��(�BQW.�Q�q�.�*��EL�*��O[AF��?)�҉_�zJJ��w]�#=���_�K�6M�ZK�fPq+�0�ӗ»J(pk�+�6����J�5i��pQ��P{�)��*����)�>L�$)��O��B�:�w�URɝa8�lS�t}�$���H�N�:��m��Żi��3�8����Bp���g8�I���PɤI�$P��8�p������w��5��q?O�o�߻�D���Z�[���ZZ���ܤ��MbS�%`����؏�A,��zh��k{L/�`�Yt�o��1���+M�@� �V�+3
�nV�L
�i�BB�OiC9��pc:�i��rmВ<%��!�t�����[�>����;�v���¾Sj�4�8&ȇ+��̚��Ěg�
h��Ox�F��C�"R�崑(g�)��U	��=�_$�p��x�D�f[+�GҨ���k�ԓᑖ{���R+$�
�W���Y���׮��zi�(5ŗ�ޜ+<
 �p]U8I��Uh���1,-N�֠5G��.)�һ[��N��G�l������~�U��N���b*�u#����0��r�X%�L���R#���i���A���
Q�;lE]�$�p4�T/()��&�"��.�@�/��7$��]��.���Q���aB�~�]��yS��ħT<F�V�L8�W�kSS�P�Ω[J"U�{�zB�k�Fտ���N"��1�E�b�"�����u�P��!�$�������H*�b��b�>�`m@M{�X~�4�W���&r� QJ:!vHȄ�l�q�>���z*C�@���Q'
�X|D_&��9��'���fg�:dh�=���=�y�m�4��r�e<��S�"�#,Zo�ngJRE�J?�"�(��TwTS�M
�4_+��4��i�@��.��
�^b��(��%��]\w��Ԩ�{�9xFV&���A�'�P7ƀ�%�"�`�H9�N��;��H@V@���*�	�D/�e�hK��X��:p��N���A��iLM�.�a��"�7[QMOA9b�)jIf���񙍒2H0EQd�~7��PB�]��@��s��/�)cGY*�e�G�cB�Ŧ��dAsȭ�7�r\&�pu=��CY0P�!�SI�;,�!o\ǡ��EeQ&�k�:���_ފ6m�_ZkZql�DP;6���YӘ%�s��c�7bΰ�3��
Z�+|9S:���s4b�ȱ�􆇖�+���&�ʄu���Z,ZOhA����fWH�ۃ�eZ��7ܖ�p�����^mn_f��	�ց6a�b���u�\����R:�(m{�&r�{��_ju���"ơ\�%h�(��~��P$�����cE*�����1}�q����i��&�ūqA�S
-p_k+ѻ,���-9&�]�y��U�r}9���l�	R�@+֨qpÊ�C/⃢h���OR��h*B��,Z �ai?�ڼ�'�U�,P��=�($�xZ<Z0B �)�Gg��kDq��K�P�]�W
�1&z��(p�#]Hx�)WS=��,@��e��
i�3�����3��oBX�確���N��)XL�
4�>"��;-�z¦158�U&���#����"� ��/ꪐ�#� Av��J4�j	
�HΥ
 1ͦ?�3�����oN�&�F/'P>��3͕p��K�iLMk�Iʝbn0I#�`b"$�}��Y�pT�S���[$Ys�����sb��)$c8�����??��"pe"2"dž�F��^~�o׶"�y,P^*�TR�q�*�	���)b;�h>A�����Ƕ�.�7wj��u��%4x��(A���➰�4z�15��5EK�v�z�rD%����Dh�=�xp�Z�9�9bcڙ%��9�J��9h:�$���0UZ��C�B��Z\�/4cL
p!�N���	�X�D��3y�1}��(>{�q��3���ƨE�G�-\Rx
�rE��P�P�>U���Fڝ�$�S\ %#��H�F	='��viK���`�Bᑮ�����?TB� �E]����p�KZNസ��@�Vܵ1�����au+hW�1-�G�L�2�W
Gy-Ke�;Hq�y"W��Hn�)���p
>��D>D������gTyǮB��B��kS\�2�{�з�	
X/�Z��+�F�
([��X/���(g$�"(��! ��s�Pȃ\���G��F�$k�`c\E��l�4�&�`D�9�В�&5&�}���9Ӯ���
eJB5�i0�>�T��,�����g�M[�:e��C��B�_�&#4�}/m�/
pA?��ZԚ]� �����X��^�ǔ��
V�@�O�;�|V��DN]K�EaR�^����q[� ���6�͊#e��;)9'3�B�\Ц)�����k�+�D+R�;�i�K�1`s$����vB�����½��~tH���\B���A@פ�|N1ܹ��"ͩ����B�@E�{��2:���c:�֫E�R�"�ni�'E�Ѡ�� �U.R�
3��q!�@idCO5�TH�j��T

�5]BR8m\SxH�IQ�*^�A��2���Q�ے����p�DC�����ܒG���i,ĜP�P��)ih+G��#�`��k�ڵ�i��I�4&�%#wO�$�%dT�@@���Aߍkg�
��je��X>��Ԣ�B������B����;ō7����U��:��\�.
v4���!]���N $&��՟�/�W\@��G�Lñ���
<~��~!�E�bO���YXD�8B���
:��t���T�icWh�4���:�[����#�r� �ZX(���qR���6em�̂��3�ѥ�1�+x� CG?��W��ӗ�ʕ�
M	��a�����7����������"�PJINh1w>�.%⦡禛#'4�:������d�|J�DFi���I����"�W�q���r@)/�>�Zᰂ�z<��{јv?S8�(2�#n5���^��1����g7T���8n^�on3�v8m@��&��hsɉgB�[�<�lVx8¹�wuJ�0��4�H4a� $�`r�[A�~
�Cz�mZZ���U��Jd��2�#5�ʎ�H;Ѩ�15���wZS���v��s�^E"�
 6[h��@��#\k�ঌ`�d8I@D���e�9m|�>N��$8b,)(�42���,&��4�R��4U����ZH�	�S�'�>m�I��R)U�#�z�Zg)�(�UEA�<Q�<P����)�iҤcZ��cs7#f�-e���覘`�wg;P�A�{Z ���J�W���r�>%f�X��B>�f�'|�&�5�i��.�Bޗ�e�G-�A����J�,}�V�t'�z�z��&uё�Ԡ0qġ�V@�)@���~�����}�j�0���R$Y��P�k
]1��q]���DC3TΌ��T��T�UY&!��^\ѝm�mYa�Y\3�Yx���"�j=�E�O'A�'�V�Z������kd�y���
8�i�k�F&��
o��������Ov^�%��p�e�Ơ�>�0,~,�S��P���^
�4�Q���R|�0��19��EO��	�d�B@��N���F�*�̔�c��3�I�C�:ҷ�`DmҲ��J֣�4����S
�j�+e�EUØN��f���1ҧVH�.7������&T�
�b(���S+R���-=����ai�Qya?��b����TzXF�����Q��4���Ճ�D.��c*�R*�+Dk(����bL⵸Xo��XSS�i��ZfT$��6x�#KPV�qЬ�{���(Ն\;q��iLM�҂
�>/�@���Dž0n������NR�����qI(���K���]\�.ˡ(C�Q@
n���8c�=%-�δ�+�kX�a#FVˆj�1�~������h��`�D���)ϙ��c%i�4�Z�.F�8��R�/˨v���5af�1�O�
U�E�.iSS�V�	���j!�`E}ZmVd�bI��mme�L:Nj!�s�rA��v��3X�B\����Am��":��kxx�+� ��5��)E���'^pW3�E�P�q��V���J	!P�ΝG�Շþ�(�5�l��� b�")�U��&b+�|~'r��@�R4rP)(	����y���Ƥ℈C'U*ʇi}�Z�%6x�6�Rݧ���\FQ�K4u��&�O6ːI̔w �L��"j:BpMcj� (e�M�#���i)�d��
zz=d�����ؠ.&�{��#�#���+��p�DN�'Ü���5)�&�XmSs���c1�.�c�}�H�=^��f�h�x[d�\��>�IVa�&�a?��D;\�'�}�/9B�s��B��M�CS�8iS�A;�A@�r��%��J�Ȅ�kn�E�8�����E5AB��!�/����0��+AZ.)�,�LH�_�ܢs���e"�hF0�Z<h/�*Z�� "4�ǫ0���cۀKH<8tܢ����D�.s�sA�-:��-G8%�9l���"�B������!K�>NR5n����i�䮟�}C�"���O�8P�rQ�9�",uP4U,�s�
�B�
%E�����WıR.��f`4����YtjdIø��W�1j��̹*�023�O�A���g���Īň� 7n���/
��N!�fA���ڦ�Ł��!�
j&��
je��Ge��15�'��ɑV�U4�
E�Z&i��i�V�P�U��{	���߸�"�Dz�֘�Cz~�d�\�Ӧ�Dj
JI���0t�iLM�f�u_������8�.�ށ𕣣2����_9�V(?�G�paT��h�2��𾩰N����:�h`�4`SA6��Ԁ<+�#���V$p:گ,G0t�"7P�d��"�O�Lk+��OF1H@:.�)�nT���hSY�������[J���•Mcjp�.�_��B�DE./q��u��	�z-9�6�@�2������2�A�������ʁV��Z�񬇛Bnӂ”�
-�o�����>�p%ʄl���ǩˍ�m�%����S�MJm����W�����G4,��RA�8�Pҩ�u�$x����xO�4
�q��H��AfiӘ
��>AF%�/wY:����5���UC��4������JԤ!�/U8�W�B�%GI/U,-h���`����
���~�6��)#'%��_�����WZ���.O�h���U�@�ޕYr�YJ�4����5E�'��pA"��yg�x�UDbc�b�lCPo��^PW'F���f�ک��vA�����E��g�hlGs�G��C��p�����=���J���
�@eiU־�rѢ�̆�	^�M(!n)ѐW�E3�t��\�Sq��<����Z��W*!�e|TT$��-L�S�F%/d�4�O�q�9e�q�GQ��bB	��Z\S�
��(�9%��"SNeE.��u��5��e4<ē\J�t�
5��H ��<��'�*�]�S���/x\�0�i�9ű��sȀ�r���B�A��.�dcz
�p<2��-6Ym�j!
A�kZ��B�n"�9�����W��_L�޺I1@����V�O���DN�8�������y�᪨���/҄� �)2�ɐZU�`�j�`��l�FqC-�*0Q��N��F4ʲ>�-eכ�
�&�R��<��5}\
�u�4�pqԷ9��Ibn����e
Z~�Q�mi��t�P�SM����I`�h���Q�iR�*J^	x�Yø��UF�)a�dz�H�R4�	���K��5���+�W�H:���}��
=Mod���La�Q�$\�qE�p.Rt�2�o��15��+��'����pfX�*��G�-����j.pD�)}*���_R+�o�*9!���݀4���^_��zD�"�<�j¥������'��z��ޓE=EH�����T�DL�����*��4�Y�R�Me�G��6DŽ�3�P1#M���D�4j����T(�iLM���v�"� 8��d���[Ŗ�ܧ�(-E�<���A]�#���OLs4� ��1B�>O!'�*qB-��C���a�7�y�)SE��-'�Yh�����ִn�0ȫ(��Q}%w-z�5v\;����	Ѿq2�s�)Z.F�<u���^F��@�kStЦ�r��X
5mZTZ}�'�¥��lj"͠�5q�0�Q
��A�0�i=�T�3AM^�m v��^^�&��Htν�3
k�	:ЎH^��c=�b�R�	UgR��)2�cGu�f�9O����l1���o����ҷrk�V��$|��-�+�(�W�}LI���A���(�Ԭ˲��"�k7՘�_,�*�yj0l��%�ǨH>�&��Ԗ��h2RRQ����M�	tc�}�T�����ΰ�B�*�(��(ӣ<�"'zy�����T�bq��S��7{���֞�%s���^�����%�F����h&i)%F�����:��pAr�Vl����TŻ�Kmaዺ�
W7%]e}���L� KD�|�w(c=$w"�'$g:z񍃛��
��u�^+Ɖ;W�ى�	�78��/�rԶ�?���$�pK6bNCG�/�����XL�S�?@���"����F�(� {���ؙ�Ր��K0-��)j��(
(��h��'�f	�U
�ڊ@���^z_���y�q�-�h�sWN�Ew
���i��� �
�t�x�﫡��p4r�PJ䭵��񚢞���"N8JB����j�Q�0��kuC�#�k-kL{c4��J�uL
�����jS��G����2T��Ut�%�T(<��5�Q��+d����t%p�f����q�D6_4�T@�=.��j�m������̆�4wTCY��@S9Zh%C9��v?�LL�$�<��V�ªQPL��Ntڤ���k��k5D��
M�V�V�4���KP�s������!����ҡJ�d
U)�.@�v�65���"�"b�������*[��� �R�!w>ʷ-�QE�^�H8Gv�bL%,�i��ؚp�K�3U�b/Ѥ�h9�)g�)�Δ�����tl)E9uT,���'ed|��|YdB��P�*j;��z�xt�3��Q˯�i�C�Db�$�ZE��lP6���o��i���J����d�J���$��u�X�)�xZu�)#�ˑ�F�'X4�!9���te��Zv�f�ұ���3�B&j�ȓT�rk���1r���B����n[�ޜ�-�"�@5bJ`J#v7ڊ�e��w?7h�t��W�	I���y�H���6\U��\��ՍxJ��
���)�D�w��zU���^4�f+�+����Hߍi�����; ��ܝ�٠L=(%C\Z�T�Z{���R!��ňN��,
2o�ح-�^A$�D1��E���z��#Q<Z�d4�pgX�s*�-N<S�!Z6TP�nY-���lm�W�h��跁Š˥צ�����C����W�Uk{��{t�/,X�#��C�D$ �Qk�L�Q<���oM�A�����cD���z����y|Hc��b%e^��j��g��|eUF%���[��ظJB��~S�fU�0�46�eF8MFe=���h-4��:���}�T7R\�	�ۘ�:�*�l���r��T!:[��m����zy���*�B�`�5P�3�a���z���4}�S�$�$�XL�R�q�N�X��
����ʠ���gz	N4g�c���)�\��vN�DP!f�����B��M��<����"�a9�.Ú�C4��G_0!"�;MEJl�Z��*��Z�.�0�KqF��4��	�+A*��g̲B��W|3�W*���4}�-���PEd���^$(�8��f�L��S�����
7AJ3G�qN�|�RP׉#��;ͽ�S���TTy��"�f��5n�TYX_���B�F�
����t^F����jK��l�^T�Jφ�k�(�
��&������v�VBF�<I#��
7�zL�b��CT�<�Oa�J��/t+��H�F��$G�ho*ωj��y)��iơ�aX_4�nH}�z[�^J�C�9�l�l��zL9�8
�����MB�R����2�G=����"���'�HDR����'��׹+(�1���I��c�!��V<L�+��v����rf�)���^*���D)g���$�4%�މzҰ���B/��Cl�P��X���Qm.������m���H�
�r������݉�$��9h־��<%�*��(*�Gi 0<CVQ@n"a=$k5W��I�����pSN�2�8y�0�vd���ك�(��qRK��Va}�
�_P;�l=��3���҄%�&�@i�,�46�����DY+&E�T	�i�`}!<-h`���ó1����;�v��
�4���B��7b9I�4{O��@"v-l(\�t&-8�Ed���� @L��'ܠu�HY܈�葅�@+;=a�{1 ��3�yq�:��B?x� P�1�:K2�iӠ~�QM��PgJ�Bj>���稀�(�V�D�,.��8������x&'4�!�O3�x � j�/㾹�=O<R@?Bj��zuƘ�'�~�%���1j�~�j�
�ÅV���v�n*�
ĀE�i�V���k�k�آ4z%��!e��q�u4���H��ؙ�d~�9�x�ѧ�P�RBU@��R���Hv�Y�0�|!�8+�y_#9'`#��8s��
*�;h�!0+�th��A
�)O�yLӓ�`hm�Q�{\.�� �g��N�Ja��~��)��Z䲓�>�3we���8��[	��Wr��
��P�ro��G^k�1MO.��]�����E�D�@�8��.���j,~Y�Xe���s�Ȉ
bTSX�rM]aUV>H�զ֫-99�,�e\��	!D3�izrQ��UB"4�]���N[:��b�|��z�6,��6�+08'@��I���V-Tm]�2�
��M���k������c��\|�����1�q�����\܂���#�鸥¾�"E�iw}B��<��'����Ģ�H|�b3����)WZ֐c�V�C��m3b�Ȫ��P����G��5T�3TQ#tM�"�b;(*�Ze-O�6�D�� �G���L�s�%�Z⮞�ST��b�9�L�!���J=h-#xO�Ɵ�tPV>�H}������Mv���<sg�`��u�P��#I�5�*U$�C��P�8�E�#�8{����)�4��gE�ո�F$�G��Nsk��Fg_73pͭ�h���5$��=B��4�a��´���)g3�q��
lb�۲���VD�Rz�i��ǡğ���w�Os�^$�Z%���U�@$mB#…
s��Q`�P[F�CME���]��Ri6��A�Ȍ�O�x�G٣�d���@
�
Zi��;������x���vSI��O'�x��υ}9�Y.���1J�6��޹�b�+�t��ڑ
�3C��O7o!l.�I�U�ğ���wឃD�I\��B�A�	q,d�+��,[mY<��\��C����8�W0P�+�|YWox�^(�%1�mo��Q@ג&IB���H��)Je�,Wz'�Ze�Rl�ȳ2�£��t"�%%7xXk�\�jX�X:w=–80hZR��ZV�v��WrR�)sTq t�z	�p���#��w��N
^�z[z�
V)v�U�?����O�T.IQI��)��M��<Q�����"p�,{Um���WB����v&�
)%ۘXV��R��ő&-��L�3+"xA&��%��.�-����s�"D�i��P�ʹ��S2^��BSM5͒Yʩ�}u�vy���&����OZz���PPE�Zm�d�am��Բ3Q���K�+x�%�?( ��Q:�0�V�ڂ.AG����X�
�6A�Jéy�
L�w���H��iQ��xZD�
�@�B����TJ�{��`�Φ��])ѯ-4q߉�h��S
����*1W֟q&���ע㈕G%�a%2Җ�)���	�Dž;d�-K?zq�r�EF��YG�e�u!%�9�G^G�[�S�؍*�O-ZTUZ�0a�ܜ�N�W��őږ�)�%�9bK�	�7�iH ܥB�4���*��l��$�G���6��SH�3H�'\/�!BՐOd�2V�G�b�Z��Զ��h�k�%���)I��'NsQ��9E��`Ujq@���
ȣ��0��U-O��A�l^�)oE�0`�mQ�H��H}��$<B29� ��`p���ԄJF�z'��-�N��7Ks��ܫ2��
��J�m-�ꜰǂP~�)��@�˵P5Ԗ�T���-t��+X�>�QN�AKL1�L��X�N�ְ~6'�Q�9�Я�u^S'�M�պ�؂u�-V>V�ˆ�M��G�՟�U���Z�X��28��[�1�/Fe�R1��>����m��L�Ĉ�r�̧է�>0�qպI��.9�����I(;�MJ�s�d�-�U��|�4(��h���2p��c�o]��j�*���7mx�:?� ���W���n��e�H�&G
�"�+AYV�K�E/ڤR�-�E�O��r� "��+�)�!���Z[Z"m>�B�Ӏ�B2�JK1i����E�M�E�,�3hT���E����d
cK�V1-�.i�gCm�jf�(�D�.DD���.Jq_��E��D2�q%퇂"�z��2N����c�R����z)�n�B��C't�(�2O5?B�%&-�E��;�����{dm�oqIg�j�����G��BS�~6��(��G^=�h%U����I(W`S.�Au�>*<-�?joU�P��>�+jb�9}�6D�[)N�Uܾ����Dʰ
qr%��<���#f�7EٙV}�9���b2�f"���G��z����s���V������L�{�'G�O(=%u�B�(D�{�R'�פ�7�����]�Qp����h���
�@TG+��`-o�G�9՟���J]9�����yAxEmV�LF)2��1�z=%uRJ�R��i���B��@q"�[�见�z���L@3B�D)ѕI�xp�Cm�R��pHm��m( j!��VE�P<�>2���6ǣ�9�KjM����|̣��Hs�ET{
*V�E�������h6t+�?jo5AX��|T7�1������%JWe�2*H;�|�V)b�����fB�T��)zX�|.X�Q<ճ%��ʥƠk-�ޟ$�I{V�%~Oy8���%k�X�G(��R#�/��$
9���S�P��&�z�~%0��^)�=�E_�L�,ΕJ��^��?jo5
��*�w�~x�\OͅN{��!f����^]4�����z�� dPwiD�Ę�b�iӼ�p6�b/�N�	%k��Г(�y��kK�J�O�ZA/B��Z4��
��� I}�V7��0+��Do@���pG���7�W!��L�̌:gP�5�B�U���?ҫOP�-Ö���۴>��>RVܷ��9j�)�M1��w\M��,�~e%���r8Wѐ���D���O���R��:�����*�-�C�BUa@WzP%���b�w��J�򺎪P��Dd�|;]6��\���o)�6A�9��PIT@P5\<�j_��D�m�N��K4E���]{�{������a�G�$Z��7��#h#ƴ"芃�@(%tqr��z��#Њ���ea��z2�Oo� I<�`/��c�8��Z|<d.�D��TZ�Q�a�-�M-i�i��S����놠݈��C�V����yF`�Bܧ(P٤Y�,���Q��w�X��ȠD�J�ՋצT�8��~�~��0[x��皕�U�	�&�$��@
���J�ҕ�JX�o(�-��L��y��ij˘&j��eEB��D��W�'\f�H�\�sa;�?8�S�G�@;G�AԺ�87��ƨLD��Pȑ��	���E�����K��P��MP
��#Ā4AZ?��Io��GHJU�j,Z`m~Y�Gav�j��}�]�H��7�o}�)�u�kh�p��c��M-oP��ŷ
��VR����9l>L��ڤ��F�:c���M��o��JT4�~��*zv���%b�t�$9�"�J,^��%E����]���mzx�`S!FqlZ���k~1}�-�MEh?
6눐`��5^t���=�(��0��<Ei%L�WM�3�J9A�D���;�'�����k�~�F�Esa�A��W�oa�-�N�_j�G#L�bM ���%;0H��%pM�.A�)����i�	H`��`�p
�	���چIB��u����[��偶�F��"�mA�Bþ��(��U��ѱZ�٭�bZ:���l�v��S���]d~�(�QT"�̵C���Ч��c�nZ~�
�U�ł�8Y
�6�}X��p��.a�R�4���R�O�#����>�a9��<b�vD����ÿG��8bc��ԡĨ5�!a���&.�I�|GiZR��V_��Q?K�:�c�}�	��`��}�U�vA�
�%������S&ϭ%�z����v����_��k����Z����(Yb��{Iݮ�Ý�X	ʮ�[�P:	K�;�)�TJ�uی�-�R��$a��D>r��^��ƚ5QQ(��a���#�����K�����F�ܦǧ��&k�[�-�X�f��R��x���K����л���ZX�����)Y�
�՞��&
�'!���cI��ź@@sEվƖ"z����^V&48��ksa��j�q-�ݣ(�FH�\+?$=��>!�h6���Ը����m)�WJ
I�e��|��S�q���;�͵�|��1U3xzsr$~Nۑ ��鯲��'�r��I��s`��J��iHyĨ��my�'�'�@��`Q�)SPXq$�%).��Q�#p#Эh�`�X���`�%J�NX;,֧�耓��Dܐ�qQ=�Y����w;E_��D!j,��Vw,��4�BW�4u%�0�qS��_"w>)�ǕX)"���%]a�!���j�yF�5�`z1*	��~3�i�?�Db�T���Q*�`~&��m+�Gy}QH#��V?A����*�?�@��`U�Q�
V\bɸ\Qb��؝���q-
����a*���� ��G\)��bD��>4�/�$�B�(���S� �-�U�P�E&lT	q��f��(�WЙ���eE����ئ��
IF��<�/q0��̱���C����XR��[��yɐ#,��{S�E��z���sbULGJ!��P^ϐ]���a�;Q�N�%�깋
\,#��7�'�M�8D텀i�UJ*j����N�j<	�b��5���iy��l�>��
�!�UQ+��]�4m>�?����Um��(IЏ�XJHKM��9J�xV���:�ah�xғЊ���R�hE�x��������\��(��օE��H��zEK�l�mj����8|��A-��+Q-
��~�0bA��P�LGHD�g��'�ӫ��>D8�e��à����Gі2_EOLS���0�$�+yQ�k�c8�]�S�D��#����IA|Xj�y-W�5���x!�u���v���z�-h�+�Y��B��[f��tI�ݎ��	%��
t�)���.9A�2������d�2J�T�L]hDQ?z�>��J-ܜ�j�\s�����mPp���g�f��[~
�w��b��{1dp5�_��Cf���j?�󰕋��W�����q���l�ڄ^4[�j#��_#�k��G2d�_}����_1���d�n�������O�_q�����?��K����
�n���n�!��a�
0µ�
1 ���!EW��f��ݾ���n�\6}A��*���;7b䀦�d�
P���Y1b���3~�g�]9`غ�p�ȁ#����ji�����
:е����a������Ư͇�~d>r�m�2lD{c�צM�ǝ���������]���a�͇�?���-�o0_9|�]��۷����~�0mq�fK7��z��~�iӳt�G1�
�z�Q�G��mz<bؐ�[e�G��#���G�d#���>b�P%�bo7�k�at�Vǡ�
���׌��~�5������_-�?�#n��gC�����~���{��b�����*+w9|X�|���n�텻��i3t؀�#��v���7`�`�﫡�������}1r�0E�ÆĿk�8@�C�>d�wtc=�:�C�6�����O��0�_�Ǻ�V�4�#j/�~���ݵ�A����*��[����_���?�uİ���W_c
��!��aܾê�}7�����n_iӦ}��?������|p�P�w����u�?_���7�a�U��߻w���5�~�o����kf�y�ۻ���=?�}�}W���:�_o=��7R��2��;G����n�63����l��C@m#�Zc��F�_u�����j)��Y2������_1��m���[m�mP��3���{Q���x����Vi�]���o^�x�m�T�W�١�������0G��{��Ʉ�.�e{�����V�7������O��^�6ju}F��7X�I�f߬�F��H[�q?e6&D)��~D�?C���~Ԑ�ӿzT��C]1��>k�5\�AߩLد[�6��2�)�Zf"�]��Zm�tn߷��C��ս{?���y�bȠ�ۏ1b�o���>t;.�?�n����_��z
�яh���G4���03��������7�f�ͷޡ�Q��R�v�?t���3�:����~���5B�����k�-�k��<a�u�f~�o�Mvذk�ޛv����m��l�;�0���v���D�m�an��ݶ����}���&ߞ��»�qԸ#;�s�E�����p���c&�6�^}��79j�W�G�>���_]���0a�.cG�~�z��6��G$�7��9��t�͏<���sw��K\���=;��v�a/.x�
N>��C�>w�W��fs={����i֐�&�3[Ǔ���s�؏#.������gG��s��ko��[��x��۟��G��oO��؍����=���~�൝F}}�m�>�}��&�:����_��`��yfxҿ�2#��t��#_�����l?v��%n�����v�e�}�z�-u�6_,��w>�o�M6����i��b`6|��_�t_��f��oZ�Ͽ�d�߼���Ϳ�����.������L��5��o�Wߖ
<dD6���Mۀ�X���^�߽��n����Ġ�O�p����<�)�mݥǯ��Ws�y��s=6��:N�l�ˏ~/��
�~���f���+�y���N/Ϸ��K\t��G����}Хy�-�z����&����;`�3����t��8��ϻ�=��{�?����{L�������x�O��.��O���}��g}<f��/9}�[�|����m;e�7_?��o�p���?�����6a��fK��ɘ~i�m/7p�v��W�E�=���o��Q��u�-�r�w~�Ɓ',��rU{�?�����]�^�����;w&7T�>��eot�z�8{�c\�n��I�3d�W]䝻���G=�{�F�ܰ�ɹ��֛������^�<h�}�o�;w�c^yu�;�j���Y��m7}�-�]�n���DŽ37}��ף=�C�=�����7�rDž?�]���,~Бݷ�|�-׽3���Xy�e�]0�ٯY��G'0z�Q7���v����#���Z{�
#�~vE��K�����y�Cwvb�p���?m�S/>���&���cz��7��}D���5O]���_�<2�~�	�OX;�献}n�4[��iK|>�S�~�o����v�k�!g^��6ߝ:d�Mǿ<��ۜ~�n�-��'��[���͞9��h{�kמ���:��w7�x��z>5�v��|�	+\�����g������i�lG��ԚC�����=;�}�7f����ս�z�_�{�<_]��-'w/ny�7�~�᭱W���O�o�s�g���y�e�����}���|x�1��%w��g�]��fO,��1�FS�NZr�[v�r�-:v����د�-�/��O�~2�g��:$����Ow��l3��_(�P�{Z�����߭����ߪͽ�"G��?���'�ϵ�5�{D�I�l���/\����N<z�[��s�Yo�k��˭x��:��6s�a��GN��̣w���&����|��9����m���u������n�/���]��k��~���A��1�����_�g�����}1����X�˯�zs�㧍�~�]�x�$�|nԔx�
_�q����įMp�2s�6����6������ŰCG6��'��w�ŷ]��}_ڮ�{��tʘ��e����k��6��ȳ��ʊ�5u���q�j{�}\�_��v㕎�N��޺g�uo�|"^U߾��g��v|��E�Y���m�[�ʶ�^����_��������^x�u�+V|��g��z{ﶇ
�l�a�'9n��]���y�t��;g�6��vC���6w?�<p�u�}F�:n�u���w��Z�/�b��7_q�}����}�F}��½ۭw����?��}��g�m�������W������v�����S�����?}�{�m�}�޿�[���|����5u��G���^?��;v�y�]�r������o~܅�u^���_��Yo-ԯ���W����Wsb����7��m�,p���/��ӯ�5���_sƫ���q�w����;�+f�1�{�?~���v=<�b秇ͳ߮Ǎ_i�5�^���8���[�=�ӽ��Gz�|Ғ��l.:��e{����7m7��nK_r�ɫg�v�f��'�����W����	�w:�۵]7>��s�>�:���5��G�Β���`�~��W�+OM>y�ߘ�����_��s��c�=�X���xi��]~���]�9����<z���ݲ[v�Ngi�u�.�
�nn�Z�~k�}�_W^w�~7���N��ׯZ}Щ�.���V���t�=��R�/ܷ�kw��Wz��)n�e����{^|�}<����g��d�#_}��w/��⫝�v��W�Zr�����7�N��t�g�>q�b[����n?�Z[�2�mC��pۇv�3���3{�]o�|���?���~�h��o��-�=���~�+^���]��e;�y���=\���nŪ�z�bG�c��n9c�%?�|�][����O����V�zn��)/l|­WY�����Φ�4�ۥ�)�=(��U8�϶�o�l�\b�eY���_~d�S78��
��j�Ym��G-��F�E������d�GN~���~�����[��w�M&��]�K_~*��϶�|�&���+~8���w�����g����9����n���ɟ\���CO��1��sL��N�ߠ��c�z=��v����׹���{��o.��J;l{��mֻ��m������cֻ��U��"�鬗�螇x[{��o����M�|P�O���Ӿ�c�i��w���������UFw�1c�}{�����?�iLuP��Zs�z��3��.�w]�3����������Sn=�Ӯ�d��}�������S.���|�ه˽�F�'���_�Y|�J��]�>p��Fsᨻ����i�#���O���;.�l�[\ḱ�n������=W{y�?5F����N���;N8��V;��9���'/4�'n���G�w�Q��qŹsv����;�ݙߌ=���۽�#~�b�����?�ӳ��^i{�;�]�Ώ��㠛�r����z]�W���ى�����s�?q��9��
&?�2�}�ҥ���{�!���k}���O>�P�[vz�ֵ��Fo��-NX����'G|������g�}�F��N����o��ًot�'=L翭z��q�ٳ��ś<r��.ۄ+6�����NX����7�=>?���Ͼ!���bg<�NYg��G�xڍ��߿�j��밻��]�a��2e���O�?�k�?��A+n��b�{m��i��W'3n�͞�����Xe�.yv���r����j��~q�Ջ��o�r�~�̗����ߺt���s~;�	�\�.x��l�N��M���ot����T��oՍ�y��r�/z�ǥ������eB6��Sw�z����F�z���is�;t}�ڥ�Vv�t�6/v��s5��箜�?�k�_��+_��a��G�|��+{]y��s�;y�=?8w�G�ݸ��K/�v��_�n�曏Ɏk7q̅��Z��}����Zp�i��Ƃs�ڲ����#+��G�r�1[-���M�}�3�|e��޿�}���&]�֏�;��]t�J+���c�Χ<|����{��ן��w��x�	o�ϵ;�?�u���i���W-{�a{�ݒ�Lx+�n��7�v�_]��N�n��oS���}{L��S6x�<��n�>O���	7�����·Ο4��>w�xı����7�㓻�=�ɪg�p�u���ϧ�}�����F�<�eO<���6=��s�!֟��w
�`��'u���:�����n�w�����Do;��eo\�;/Z�v���mWXe���?xb�M�=���9x�￞c��z�����N}}bpK���pӗK���JO=��A�u�嚋�;z��ŧ�^\������w.��Eç���?=���?���G�߿��*�=���x�u�i�>r�>-��/mp��Wξ�~�^�z�����m;��w�{�����Սw�>������ǃ?>�×^��ś�g/�֏g-����
���ꨇ�a�'wvh��eS��=���u�ߤ?�r�Q��vƞӮt�1Wm��_]��8���G�;�;�㤓�`�'^6j���绻_����Ro��i�'R¾�w��ҝ���v��I�O��Y�u�����E�ϱ�#G����&�?�\tѯ��_z��������'\jw��]�^�n���ْ�z��7y���=��	�_1断V^d�^+�;i���Y���{h�{�?���nl�߰]~�ǫ�����)翾�*�v-�H׍�?b�!�z����W��+v��g������u�l;�_<ק޾�,��
����Ͻi�=>���]���{�_w���3�n�c�mVX�c�mn�o�䈃����]�{�o�=�{f���y��7�5��}.�׎\wҫ���?�w��ɯy���-�_�޵�4����yd�sv�;j�'ֿ�3�Y�,�u���>tσ����9�X���/L�?����>s���<��{W4���^Z~�1a��3���cn1��=w����VY��O~���a�\�.��q��˶��U�y��:?�<m���C�����y��Ku��˧ܲ��[d��>a57x�{N8k���;�6^��s����tz��O<5;�{^��]��Z�/6��Lu�3�3z�u����]�;���M:��y�ҟ���)���:���/{g�I�9�C�/{y�v��w~�
��џ5y��ͷ�;��sZx�]^?d���}�O�-{ώ����cvYx�Ο���>w�4���m��Ϝ�Yv�/~}�-��w�vC����=~�{�n�ֆ�o�u��Fm~�a�����]��)�>v�F���耹zg��m���?���U��w�־�:�4����;��{�m��*�<u�s»�b�&�j�i�nz|�Q/��ܗ��X��-;u�T�m'^��r������*�|���W,1�ࣺ���6����K�,�P�6+}���w[��/nm�ּ������cw]�������[z�k���W�s��V}퓑��u���	O��@�م�_����N�=��p�pl��sO8'�~���=�e>�e�Aєe���U�s�9��6|D6t���B[o���.[��ݴ�gn2�Dc�̷�B�z���b�kv[��V��~C��[�o�m�G���5�x�����=�L�6���i������.xA�EniwE�k�\�U�0�x�q:c���8b�����n����=����IG��t�M�L���Kz�߼�v<��%ny��'���0a�3ιy���ߨ��-��iK�w��l�k�_77dВ����+N��ǩ��n��?�㢇�<p�v?�rg��*;�n�)]�}�?��eN�{�k��]�{g҅�ܱֈ��`���%���IO\E��3�>2��F/��+?�:Ϡ5:�?��;>>��+n��-�'n��+-��N�f��zw�z���;ܵ�?>:lȋw\��#�~�Cr���mĝ�������}�[G.9��+*�=t��u��mn;d�!?��m�>;]=(��;L�rÛ����^;~ⷻ��6y��__}�	'���٩��6�l���]�]�0�î^�{��B���[��i�S��q;�k���ߦo����
�������^{ݽ�-����a���U�c�Y��W��������C�.>���Dm?q�ŗ�n����}��W?��G\Ӷyy�%F���&�?fl�m;震x'X{Ǟ^���.���WO��/����������7?��s�<sն�o�z�%�/kW��Z�=��?}��o�i�7���_�Z9i��zOX�-���ۺM^c�/��oy�ѓ�nr��6��9pd�޽�|�GO�s��th�x���Z�λ��9lx�ڸɇ���}9��U6���JootЭ/�u��|��Z�n�ږ}w��ܻy屛��Ӝ?|;�}^\��yn�z��yXv��z=w�\'�f�K����[]�<�<��>��[sѽ���[�O��jW��Q�'/qùn���/��b\���C�Ӷ�p���ǎZz���~��ˋ�k�|�'R��m�/5w����Z|u���m�������g��|�}���K|���#���^�<t������S��^�,;x�O{<vN'�����G��n[z�'��o��Wvv�vm�s��&�6���4�o��߀�����ߒ'����"�}ИEG��ß/�����㓼v-6x��zC��􉷞��Q��i��y�����K-;���^zz�Q�|��!�m:���W-�\��?��bS6۾��&���޻����SW�m�}��W��u�e�;n�lۍ��f!�����H|���:��xwz(��#�`j��:���sl����nr���E�_�څ�g�oޫ�vg-�קWL�g�.�����7zk����s'��e�w�ؾ�!�����ܷ󴧂��c��r�����|�
���c�p�Lۣ����mVX��[
�wjwo�W>ir�5v�?��=�o=��K��[���z��QG���C�?�b��|�b�7�9��Mv�g�#��q�E�z�^�����Ήc�_�Zk�#�-x�7ol6:5�nY�۟?�����So}~�uo���-�y��?N��_�^��+?�1�k�4|��NŻ��ks�2ܕ��������/�����hP����;�N��!�u�k�nD��f����Oi~K1�l]�غ���`�\�d>m�A�4���:�o�;�\��uo����^����p�o�e�;W��8��O��u��U�}�"�N?o��'�-���}6��ͧO]���ݸ�5c��M;=��o���Ӿ~g�ko͵z��]�Q��t�fݱभ{�U���؂��1��?F��g���L4�[ԯ�^_��O��7ϊ�{���iO~f��nz��N�u�?ϛg�-�9h��UN���<|�5W}�s�s��y�{�:�ܝ'��9n���c���y��.z�W�.��MT���٧^�Ӹ��⮗�q�K�}���;����h�a{>��y����k?;�kn��"�lt�Jz<9�mo[��v_��N��?]�������L}e���w?��S�Ax�cgO���%�[b�_>�̩�N�Ӧ�C�8g��m����m�Y�ث���kf�n���K�<4)�ǯo��q�<��\M���GlV
xpٳ�5��ܦ�>>�顝�8h����s�5��Rμc��G��n�Q�\�����p�¡o
�ȿ&���?��Ϣw���[^Y��MW�����죟�Zi���相B��B��˜���&��O�7m�v�����3�{z�}_Y�ϴk.i���9S�4�<1�a���Q��}����g���nmw;饫G�w����:l�P7����ͽ��=���\x����ݔ�z�pОmν��>?��q�~�����<����?ϻ���uծ�-=�y��8n�U��f?���w���bʪK�y��0t��.��O�`?{���o~yy��b��?�+��;ܝ|��7�n���s,1��+O���lS7�m��n������u�a�����_��f��{��x���ߵ�L�u��-���w/=�w���wϸ���Yi��������V���:������v��C���?���ef��Z��VO�7�M��_}���M����]rX�9��[�զo�v�Y�mm�S�ߩ5�����
[��
����B��Ok~r��Ӟi3��?�9n���%F��Io�[�~��K��m���qy��/��/Qz�j���>��>�����׈*�~�����v��3��]���- �?��N3}�A��@����L�z����-cҦ���r��P��Xs��C[��l�����Y��?+h��Yq������P���l�7�?�o�g�	����/�jbσ���ρ���^0��?�9��|��t�+�o7���=s��K;Ⱦ��/뎺颍��z��`�՞���E�>u��	f�i����u�Wm��_|�;���a�m�y�����%V}b��]���.��j�<�ï{c��q����~䊯��Gr��/F�ݽ~��s/�n�c���ͯ����e/w޹�c/v���p�C��q�5�~���ʹ_�=�تڣͪ/�ݩ�����5��׮O;�u�\?����������f��+D����N9{���6�o_�Ⓩ�����C{|���ՙ�|��.��z�[��Ϳ��?���U���������o�*��Ň����|��I�f�g�o���O>��N�/��~7~�f��n[�?��ْo��uW��c�44���=��'v�����=��uj��~���s���k�ޖ�����Wn�2מw�N�s��߮���o����S_2e���Zqݣ�b�c:���{������=��I��r�{�b�:��s���k�_¬s��v�gxx��^���������A�^�����G�y�\��g��]��u�R}wzq��CZ`�>/�#.�楯~���i���{��=w�Bw�s}�q��m��<��Yϟ����~����/�����g2�{���W��;�`���t��6�A�m8�Uo�;�]r�W,����g<��iǝ��.W_r�&�������oly婧��Qo��g�7ߟ��b_.�����f�‹[-a��Flx����e������ݾ��t���r��vb鿽�]���K���`������p��/�`�<#���ׯ���_/�M�n˷���e��Q~��mW,�g�?����:�]���iώ�?�
�vU�IGov�2��������p�4_��E�����ym��<֞�n�������Q[?5��_�z��c^����KF����~ҿ�z��q��u�ȕwZv��z9��s�>g�I�?tȣ�\��}_n=�;���Z+��0x����|���F�o�ܢ�Z_�1�&��>w���{m��nkl���{�<w�|��M�>x�g�;���q���~��Œ�l;��I�rƫ�y�z?�zp��4���J3��x��7��u���ڤ�V�r�C����8�C�g�EW�m�]O�wa�S��O�����ۧ�f&�絙<���,���j����3���4t�ﵙ/o���K�{�Q�\����l|�YG�s���8��b���p��}��bc�=��Ն߭9�����N���G��e��=�{��oϻ������_�:��a�-W}��E8߰v�=-l��yGM[�ȥ�-w�w��m��R;�v��~z�n=�|�wھ>����=�'V��SV��=:f�Ug�?y�G�mǮ�5�[�<x��7�p��q2��qk��w>����7�[�]_<g��7���}�����-��Z��֯�]�w�Eg��`��<k�b��+��s�'����[ɾv���}�����t��Ҙ��^:���_y���X�w�=q��}N;������I�=����=�>�F_s�ƃ�������ʾ��^����1���%w��6����_��Z/~���)o}��{��e���}�|�%�Ϭ~F��}��O�k�G�=���G��	G<�\�<8�lJ��K�v�
��d�c�=��?�?��w
����;��楝����mCOʾ=������q�Θvƴ#�����kϛvC�夡c\����No�z�J���MZ�e.�b��^�����������{�^�iߍw��O_m�}�R�>y��|w�vѸ��u��?��GѢO��};|�y�Wo�o�	�rO���[:o���߭5e�E�.���=Ǯ~�K�ns��w-�ݓS>��石O��O�qĘ�=�•�^4Ϧ�n�݀�~���3{uz➫��ᚷ�Մ�_zk��o�s�'/�}��=��ُ���&W��n�κp�׾/.�3��K_���V���ԁ#���~t���|�-v9���ϛ|�*�}t�AW.r���l�쵋��k�6e��O�z��S^�c�Ew����/��w��O^0�
�NY}�g�=s��+O���)|�W��z�m��7Gz=���i+ͼ�:���9��p��.�����]�����ꦋܹ�[�4��'�<l�KV�n�WO?<z���|<W��.��7�m����\����v�j��������[���^~��ɯ�:|�}�~����s?��Yޗn����w�U/�z���y0�y\��v���
;��}ڥ�y����k�b��{n�e�c�/��{��b�-z`�yn�_}m���?vf6��۷z�oo�}�C������_��'.�q�v�n���d_�ok����w�flj�Mܫ��߹�cS_y��^��2e�{����;j�&�������{=���{��z�ո���\����e�Zz�۶��h��_z�w�����m�j��^�dߵF���m�S�
O)/�˄a�tz�{���v�k�^���۶y����t�s��ػ�p���m�d_2v�Bٲ���cYƒm�,ٲo���%YFe/T�0�-�'k��E��<=�j�y����z�\��u�s��{>���s��j�R�@��ª��!��&۹7WW��������}�nO����^Н×���
�7��iE����C�Rxŧ��Y�þ(jfH��!{pK���Z&���Q���!���t����������X��/j^'���'W��N�u3�_r?պ��K$$���E�׺n�uѳ���]���W$��ƈ/y�J@�1�){�Hԫ+ԉ��0P�	�b0��Y9��t���8l�hK2I��=*;~�a�� �r[�����So��$��$�8_���{���$~Q�f�<�$X�P�S].��H״w|��r�C\~��q�@e��L�o_���"QmD�TrW�t����� ��̾�:%�P�d�1�H���(���y	�Gqʁ�M\|�<G���ˁ׈,>dS�O_�P�z���=�����6�xf�6w
��2��J�=a��r�qF팜T��m�%8$�T�X�5�x�O����3&��G��E �B�XaE��ϽB�l���"�}���d�N���t,`�Wg�*�}0ק]�r�iS�κs=�t�Y�djԲ�B�\��^�A�0ʹ|��U{,�_!\�A�5��g����{��RŲC	o���8�l�O-Bj)�A��A�ivou3�L���ڰ��ҳևK��g7�]LLƽL)=M/�6��	�5Oz�H/Z�2���xV��SK�R��	9n��i��G����S�`f^q��]I�����w�KqS,8�4?ZP��n���+����j�����+!����p�‰�ց����*�j�Ld�ڴ��G���,��8�ǟ���~!�%�(�|gT������%��>6|���NPŖ%�t�^���
����EY��lD_��h#�M�/��=Bw����u�.��0mu���G�}֪���ۇ=�g�C�wh��W�nD�0q���uk���Ѵ�=��`\=��o͆�+�>�f�^%�Q�~=��i����&��/W9`��^]��
�U�ءӞyA"�9��)�a�Pl|��@��n�g�	�
��К��}Y�z\a���ip��7M�a��TJ��X����r�o��Y��Ŏm�	��N@G٭;�/>�{�I�z�����ٽ;a�o�72Fv�m=ʛ�H֬�F�h�����D�rmJ��0�^#H8}�BC*�)�k�[kEy��
�>0�ׯ�N����%�W�I�磋)��[�<�@�\M�,�l9�[�'q���O�En"�c7🟍Ι��������+�K܏6��s�L��8O�o��%i���R=�Lt\Q��8o%Ȧ';�s���=��ZDc$��1�Pm��h�p�,�^�BAb�����Y�n`8]���t��?���|N���t*G4Mp�(��1��̔r��\�������	,у%�<zykʵT���H ����5Ԅ5V�P�K�GMfU�Fy�j����o�*k_��g�)��5�О�d�Ag�.�*ϝǦ���P#G��N2'>���A�S\��� �a�*��B(R����Z#9C]��xYǺ�ޣ���dS���u���<rD��$d��z��t
WCwn�����çc��7�
׽Z
�Eɿ[
�nK�.�T
���gO����=j�cHX�X�3#�3�r�!�plO�Cn�9Ԝ�����1��U��YO�S�]�M�}8�E��P���ޟ����C~������G�`_d�$U~m�Z
0I����,�D�-��`��F��R�I���CK&�od��L"��-_��ݓ��;��ߑ�h)�$n���R�ID�ֶ�`�ض���ٻ�΂�m����R����+/[�vI�I�AgC?~n����R��a=/݂�C��<��pȆ�7��1�R[)�R�ǔXm��̐o[�ǔhm
���[ISⵅj���[������t%yL��I����J�4�XX9�o��k�������l�6�������������m�|
�Y�?l���$́��nh����т��$6��� ��.e58pN�3��z��}�#b��O�(*���]=�'bX�F�W��%m&K�)�pÇ��L���Yj�����gl�ƾB�>����FW���M�@Ώۂ��>��2^骠m�n/�J�:R�Fd��֬f
M
��|�~�>�xmx�cb�0}�S'06��ܪd�ˤ��WbtN���7:�%�GtR$��Q̅�]���kK'.ߔ�-4�䤔�s�l4?���K�|��J�M
B��L����i�h;c��Jٺ�ah�zc��p�^,@ﱱ&c�:@����D��IP�CPx��I��X賏ٞ��k{{:��	�veO@}�D"�i�߫�6/d��oX�0�m�xj��[���_��
���	@�0;+ןR��s������6��{�w�YZA+�3��	s�6���g����{����=d;�"��D�G"�/*�s�����h꿂��{�G���O�?�0L=�f�����
�bi}��a��q��1<
V�7g���>�l�c$t���>�%���A���E���9�kx���g�6�'������Ed��v<*{�eg!���4;
$�_&�#�+�z��v�nW�a�v����;��9��p�e�)h�L�J��L�y�qq��Z�o\��k]�8N�������s(ԭ�'�cG��D���t� �<"���~ﺯ�	��*#��y�WB)�5Zrus-ۃ	 "�}��d
&)�k�>��8����N0�I���U�g��vF� 	,�5Δ�ƞ�;�n�����>B��UF�W�)�� ��{Z$�1�9n���Y	N���Jv�
4 ��'���4��x��h���q����I���q�
eF�J�e"���5����1��X�,I����-�W�Av����7��D����.䁋G���B؊u<�0�љ��=�8WH�v��"��	��|�wG�]�Ɖ�E���s
|t<�KЍ�X�CM~�6X��>��y�UrdI�'!_���[�_�]x�F�Q�J/�i�f��~�u���-�ٸӡz�,�%6Hg�b{YC_ܰ�6吮���v�&R�m��g�?�
eԾ:6մV@�
��Ǿ����#�N�SX�O�����Oش�p_��7�TtF𜍃v��9]�U��I6�4m<�͌G��o^D?��R�"�w��b���Q2�&�k�X�v�{��@���-���[]�U!�IbM}J+ sQ��ׇ&0��%H-��W���G0�Cw�b?2D%�t�8
��Áq��Ҿ�����/V�UJz�/ljnxYY��T���'�R�OuNR	��`ŝ�`�vQ#�R$��E���_7���((gtuޕ���Zbn��'*Br^0�����+��.r�;�n�,{��x�!/�j���h�u��eCY��,4�j^*�#��~��(}�̚�,�za.�_����ҕ̱&kO�}��D���ؤl���YGO3d�?�*��m�sh��K�D~��G�<Y��~��������H�M�8�H6�����0�I�(i�۠�[�(��x��n�N�=����y��o�'[`�M�|���6i��@h���ޠ�7f�:ۈ�ƀ�O>��eY�¡ѓ��3R&��ι�#ik��
�� !���(�=�WÄD.��DO�&�5��U�)q�Ԃ��?�Cw&o��!;B��������??�"F���r�U_��F��Å���aKL��<��3Ǫ����%�D%�/��8	��ڤ��v)u�>�O�R印�
vO�6$�^�� �g9����6�Z��Ŷ�]a�q���,����~PP\!�����58HS���~s$���x�'����tά̷Y$�3WSR�Z�|�Vem�o�~W
��x@l<�X�y,,@����W��V504�I�Śމ��OW���h�,[�K�`d �Rjcq+����̩D5�,7IhGy��i�^-���q�O5'��Ϻ���CMU_dB����/5<~'��b��sx>�"h|y�t��Y��0�ѻnN���
,�P����:�j��y7})>i/��c�,bkuI����p|#@Ԭc���f�AO?��z"����u	:�5z 'x����^+fg��L`ĺK2���#,u]�����ԡ��ޙ�\Q�C�%PI H�"�:�UB~09C$�-�U���~��]��*���������������2�.�	h���#�!)�t鲧~O�,$�����eZ�"�,���3��R�O&�Oo�Z��ϯ�*����|7~�ئdw2�[\9��햑��EM�|9�@�#Ea]�Fk#JN`���r?���l��e�۹D��6eρU�,B_,<�X�,�������[�|ܑQ`��}���ՎJ,O�{)
�R�<"�=mV�r]��xb+�TC"0HH�kĠ_���q��yE�N�KF��t�19*�1	�<�KH�����ʬ$2'w�:����ҭ[քѴs�m�L۶m۶m۶m۶5S�[U�����O��}Z�q1ƛ�EzD�L6"�H^����1df||]��&�%��h�fx}�F��M�F(�X��	�sJ�}��}�2��T�,4w��"o�D]�e��~0yj�yO��Qա0���Q��bk��m��鮈d�&+g��#�v&�^.�t+n$W����+dQ�c�XZ0��}\_�zZj99?��;Uڵ����l}�Y��� ���u�2�ѵ�׃����b�+S�2��G#8ϥ��?��'L%��<�T��YZ�v����Ďߡo���?ׁ83�}�D�-a
�9�,2�"wD���N��4��u./}��vb�a����a6����b��u�?,���H��޲�Hv�.�2��s ��6�k��71묄�c����P����4A�Q����w�8�2��ّy���FF�1�i�Z���������c�vP�V��2�o���o��?��J����ۥ�gO�ʺ*�2�϶Q�9�@q~1l�J�|K��u��H�R�
�8|�����V+�M[ײo�6�(Ǩ(�g!��+"����W��m�gϳ��km/`�_� {�<)w ��#�O�x���:R���7Y�&Aր'���X�x|�!c��{)�r����ԴP�b�)�*�	7�4cv}��iw-����N��jK�t��=5�
+7�m'�)� v�o#�M��f��1��-yӥ�����h��9�ɜ�C�mR#U�����NS��'+�MH^5�j ���y���	�XS�-�ZLÊ�G�d�vŎ�8d�`�*���Y���me�,�#��I���u䙛�����j��n-+Ž�"��g��N-��D��|ceWz����ؼ�ۓ�JM�}�i�<E�G�F�H�@��+�IZ#�=��x�ȋ�R��~��)��*5c��e��ң�v��)0��q;;.��8��=�iLS�V��M�;M��
:�a����sW�{��2ү���ԗ��S�c]oѩ���il��!���fDv�#���ˑ%�F���~nN��⼹���4����m�_|�����ʎ�ݣ]	�Gw�|vV������OsA<�Y1����B�3`�Q���*�7��qL't�\8ayc��d�,n쁍�	�I�G��fu�,�(I���,�EY��Mo��c�Vj��Yw����տ�D��x���B���~>����W���l�Zp��["�767w~}}1��|��a$�ʑZupV+\rF�ޓ��+��b��/�o�_pZ>�?oi�hO�t7T�X(kTf����~~�S�J��!G�=YR/�*�J[�����Ey8bW��v�	K�xzh;Q�h��-�UO��Ta�@eA�����d-�M	���,��t�aI��,nl��3�5o&�r�o����2�L��=�1)n<���ϕ���Y,>�%����aO?g`j^R���i�?�	s#��o��ZU��f�	R��yԋ�g0�H�z�G�^�;�oHޑq��Qd�~�����q�d�x�7�~s^��b6��@ �C ���>=�7�60�~�q��]:d�w��J��;�]����MU	�l�����܉E��VUE�[����CF�#��a^��@4>F[NJ�v%.�M�5�K�?FY�nѪ��C$�UE�>/���&����H�yH,��@0I8���HVRCB����O�؎>eu�'F�=I�0J���9R2嚨%(�o�Q��?�BI����ļ�b��*�T�mQ���)�nܘj�8��X�*s_�B̿}��QLjz��؏����\h�BT"|{��ͻ��(���Sd^�br�"	�� ���=�P�ui��%��f����i�rr���9 !h��gn�	l�k�*&t����=�t/��,�$}q�Z=fn`����H����u@��7������P��{a�b��i.�?��㌆/\Ql:$m�,r�d�+R��HL�{�ӥ8_lS�7@�j@ˑc%�V
59,����1V|�IRVY�{�t-�w����}�y����y8��X��y�Gcs����WF�A}��v�ա��A��$隉ܼ󀴽�Ge[>p钯�)���<��
o��j�h������¹��t����-����	|�sNj���~�r������懆7
r5h�N�B杆�)�%�
��m��L<��������녌�4l�ֆ>U�O��tG����{8h�}6(�6`ʣ���q���P��,dV�-N����݀8t)�.r����7��R���2TA�T
cr�%c���EJ;<}�тqg|G�bx�,K���L��Zr{��Dɑj0���I3C�ǩ�����-gj�|�p�,?���8E���qT)P�2Ƃ3]����/}*
w}ZZ;ÝU�>��uJ�r�;�-�)�?c��	I����#�1�"��=^<FD#�\)
�_��I�+���?ŬiթӀRpk�w��;�\T9���,�W`����/��P�h�|�Q� EDJN�z֖�uUR!xR�yyb>A}�YV�6S�ى�Fu�P��P<�˙�Gb��!sM4F�=.�I��|�	��w������$Ɩ�^�L��ZкSU&����@buGuI�Qy[�b|�]Tip �QY�C�1D��0��=�1�H(�4��U0}]��,�d�v4�G��wS��fH�-c�T:�`��۫�����L���T���[7H�J�i�IB(ኻR�v���	���$�o,��6�2
�b*��GU��13�mt����@��D;-4��Ƨ-��4�l��AC�8����Q�CT��	��*����==�Ğ>�+e\��V�E�]! �;_������jZ*�-^�#�� w'�Eo��[yR��?!MQ��@��3yZ��	��wꁹ���v������v�1���?!�R�>��/Ӌ� ��?��˥�>�Sq�}�u�.��D̢��٢�ϕFl�
�v'�ppS�=?�G���0���gs�t�������k�2�z'��)�u����F��0�Q*S�$MlN�ӈ1O��c�'�T�=N�׸ӧ��V�A��×�ig�
/|G#w���5�2HZ�L"�u
$�\p5)��ڧT��I`�t���X�6%	,�E���[G䏌�m��!�a�W_��`��5����>��Lj=Г*�Mi�Ll�����"�3Z�b�d���5ӘG�	b!]����������<��F�F�s�k��|���I)� �̪�R
�w��5��|X�$��qBպ��6��s�W���!�yo����3m!�OY��
5m��p\�3-|�\��0#����.�.G�S��Yl,�Dj�
ޖ��ј8
�&��M��$��+���	&����L�3����Uu�ʥ)%	t�@"�a��s��(��ZC��}�]9��IN���Hs��{Ay0�.�q���)�,+|�q���ѕd�<E�-XS��*�q���È�%f�	^��s1�g"��H�	��P���!���J"�B��N��������Kv���c�W��d+��L��bk�C�M4ٙt� ��H�k|����2����
�̲��_�Y�i�R:6eI(SQ�����+�
��ZŠ;�2]��oCF����a,B���ªL���"{���x2.r)�!Y/�9��}3���-DY��/�#��f����{)�b���-�%�Z�[��L�6k�ʖclA�mO�N'���r�^
�� �;,��ԇm�_��G�5�*N��$��{��VG���^�u�0��1P�r;h�fAҼ�O��PO�-�*Ș[6QB_t y��E:��	�y
zs.���
>ԭ��|� �u��C����h�%h�Djl��u�A�$�3�b��܃JEHZ�����vk���1_��aD����� @LA�ǿ��i�l��vv4�+���ü�v�y��~�
І��
�tB:�L+���Pԭ�|�9'�,�	�L�q��>���L����Q��rg���6ΰ���%��_�w��8	�~-�\H~Vo#��럖��ၜ�w��yVӴDU@e1�����7���@�JN��ƿ���
��ɬC̄�V9]t�'y��@$n���b��f���R���H��z=z]]���^�?E��4��x�W��s1�r�4_b0��e�
�>�D���n4�Z\��]nC�I��WYh��ff�՗�,��8HD�˿�X�[�p5��#HM��nٴ�hw�ڲ]L �� G�Ҡ
'a��$#s�"�$��(hdXPŮ�3)H���6�^c��T���|i2��	���Z�Ni�5pG��hk�&K��0hޝnP;t�lP�һlP��YC��ݼ/�M)_?y��XY�������IHc�>���ư�(�xW�ګ����aj3+�D[]]��l<3�o]�G]h�x��z��O�j[��lN�vaP?dl�S/ȭ��riK��'����*b�L듌����rڂ]l�biQ~H�i�l=� .�v"�N��i˹�{���4���&��-I�*�b8���ȉEcG@)�λD�W��1��X����0=����߰!ޯ�Vm��Q:Uw���3`�n˺�@�hto�toB��26E�8-tƝ���&��h�"������<�6Ќ�ʵ���4�@�^��u�pj1׮1,a����H�h��fC��!	Z�L����6okC����xU��k$(�,�����/��p��;n*!#s�_�I7�B��a��K���C�/�o��_5TsZ�'ͥT_}‡�i�1I�S0u�
��PM>����:;�~ͼϸ|���~��S���Gd�+�тq��ND�pӼ*���d܁ ���B��<�W!�A����|5���[�g�h�/o�\�r�
�?̈�d�b\!��*1Ɓ_�,βƼwf*E9��V�XiW[���>st�H!�w�<>7s
�,qt5!�j��&`���6ߞC��Ę�Pf��X4Q��R����k,�D4�l���r��Pӥ5�ўÖ�����L7eJwvZ�K��k�PFz���і#����¢B�ө� Ǝ����; �Ϭ+�2�>���&����*�)��8:�z�S��?�(�Xo�T���My�0��ۀq�TW+��,V~q��-f�<�hz��<�����Ae�|�vV�_�"�o��f��tD�k‚p�n�6"m���ڝ���H�o�V��ȧ""T��+�q��k�2������"ZRJ�U�� )�צb�C�j�U���
���P�=������.,����B4�n�je����Mk��,�q�fا�qu$UT�����e�P�D�)��J9���(�
c��G,���C���a��8+a�!��u°��O�,��90���s���x�2�P�o"���BB��2��A�*���l��"��"j�����G�"{E۪9qa���"��߱2��:�e�/%�&��q�sTP
^߱jdv�[�بO��Zg�opB�:�jP+(�@��U��~K�l
�.2P���v�X
��W��z�S�
���i��	�Pހ5�aEp\�!V<��|��1��|��!�O��{W�x��}�Yduj4�˘	� �r�1r�`l���A
��.NhqJNu!n^�������'���=S�	}㫄%���F}�	J�Ye��?���ϝ�b�8����0�0�Ƣ6?�p�	�]�Owq��2��:d�6Nn�Dִ�(��6�]CQ\���i��&>q�>S��=���z��&N�w�Rmz�1`�.��А��$/@��0�I I�-��:6/̘[ED�,��tw��3��iϽk�C
��D$v��_7.��[�	�-F��F���N�3|�~gF�bP[���O�[��tbm{s
����"�Wcڮ�	�P�S����v��=O��_�6�j&i]��o3�f<G�UB��r=p~�߈��R�_���j�D-n�3���	\!l��u���|�╧��;=�cn�L�r�I�:ш��R�	.ω��4����dv]Z�Yh@����V���)�\.P��q���]B�.
O{���T�j�M'�$4�$�`�p�j<R��|x���:O�&[��5ɼ7%�V�ƮU�u^��- _��`���oQ����V�T\����" 	b~L	�"٥k�!��Oʾ�S|̀-���H?���7���7a/����R�γiۻ��R�����;a���Ρ%{fSbݺ����L}�f�N
-d	�>���ek"/��Tu���H�P��q}��/wJ\�!��T�UF�=k�O�m>-�ĵu����U;N_w���&���u����>`�6�;�\��lI�hS����.����Ǫ��8EY�)S~���W����#d+���"p�HaC�z$8)
�EFI�l�w��Vᖒ2{�`�����O'��/8�OCb����}��~�2�n�;�@+$���%ݎQ�l[(ٚU^U%o`�"gj,5������p0܃��Q����S0���_o�.�ڻ<f%��Y����c��2�o5�L�"5��Nqo�Πș���2��ȍ'Dc.	ն�����֪�	ɉ��S͛5�f�e�M%����Y���N�n���əfl�?��>�Ͳ�lj'�~!�x���A���7����æ2��'c�/������꿣E���0�yGPQT 4DK����a
��.o�+�~�yJ[��$.��D6�V��.�)�*bG3Q�O/���t��"�ft���eѩ����z"ؿ�|�O�C����tl&=<[�@��vW�4PnG�5�����},�q�+=^� 7��I7�g#5�DN�zf]T9WH��o���e���F��kl���4F
޴�n��w�m4k%���Ŀv�e�Ig#��M�F!�(��aZ�:��4�4��F�x��S|�����uX?V8{��0���*��rM3GP*z,o�e��4�FCEk�n&�z��@�TY��Yb3l��9%�ڤf��,�bP���3�#�A���"={�y����9�����s3�������6�:,
�RguNxDV�ye��N���x�|�L"߄����@������2�D{�c�5�u�^���<�0CY?��ص=��	)4�d/���{
�.�^7��KhH�N
J�hR�g,�_�ޙW��~y�
��H�Z?y�<m�q�!�+m�:�4J-=�X�	{��[aY0�Z�P���f�p�<*��]�*�ɼ�Qx��6��O���Y3\��AV�&З��V�,/w��9��s��p�DVlx��,��†��X[N�2)�]���1X��+뽡��#&4�X:�u]�yC��p���.̙�N
Xk����
^~Zs���t̿S}�����L/�T����j����`	:�5���	Š�����Iۃ��m<#
�^����o�T7�)�p���}�6]��0	-Ș�^�<szo�?^�|�A���V��R;��QRY���#b���C~i-�	�������H!7b�k�3����V�I
�P�WD̲�UC��ulyS�b=D���	D@�F�P�Q��<B���V��5�P�N5����V����0.�1�j)�1G1:N
�AXd݆���rZw김R��~_�g`��O�g�Q_<I��FIi
[�t���0Hr�ưO���zRɪ�D�Z��(�u�2�}� ?��t�,1���;^���e:�$�=������X�3��&�!u���d�W��������z�V�!��R+�a�)0+��(F�J�l�	5�pH�QM��}���a�ȳ�|-KG���t}�N�)Dl�g�1
-[�៽�d��b���c5ر�8�6�P3�J��5�t�aK{��QI�}�M�.D
��4i�1HX���`�i�l���4\sU*�-��K��o�5�����U��@xl��<�Ҳb�8�jK��(O�:*
�E�����!mP���[
�NKu�5촍`��v8�(9{h@7'��m� ��t}>�윳�K���-�1Z�����
�Mn,RF���$K�U�W9{�[9{ypv�q�jbr�R�w�Aj�0)��x/F�,X�e�[�����F�;*�i��<�Eዿ�0J_
��2�.�y��=��!�/��PQ��E��IeF(T��}�j��\�i�i��ݖ�u@��4��3x�:k������v_{��X�IyjL�W�y.��맛��YH��)]M�M���Y1��n5�?j���l��]f���˸��V׊��h�y��o�$	� G˃D���*/2�]��>_��4�1��)���HI��mVͱ�꿞Du	 �k_�����A��-���Q&	=��1F5�|�z�)��1?�����l����pB�ǽxd;�@n����� 9�Z
	����+5�k=@�����y��(�%
��B,�{��\��n^�h3�H�4�܌����M����󻨕�j�d�&���x2�/��?�B�O,*�疑 ���i&_`�~%�4u��g2:��A�Aꐥ7	�X�G�r=�ޏ>�4�~��Q�ٝW��|�
�~k����������JB�^�Kfq�
�m�r�л�sLF��t< �M-v,�W=�׹� �,�!�Œ<��j�LR�j�`�-oe��lmeL��k��0j�ѧsTHr@
8�>���߲����ـ��H��n6a7cC�=h�[-�Y�G�%m��a@ 
VT/��7��%	�X���:+pf��	+��%���lE�J$�
�F�A�o�����?ލ�5�>�x;��;ڻ���;�:�ϙ�xP�]Q�"{�k��9QQ���P��z���w�Y)�>��^����}���|� ���P��
a��yiK�Dr��)@'�Ľ4�ߢ�x�2f�O���(�H��I��	���/2�Pb�f�e�?<C�|�!/�g��D92��tM7I�@���@�g����m�j�|���cω:f�_�.z��ݤtrc<�H��|��4W�e�d:���B��`��l�geK��7z.��qo��.�0y�\��g��ב��/֢U=��?���h"5]��qʽ�xp���w-�j��%�dc����]q���"~E��:v$K��Ha��6��;K"j�����!�j�C�4v��.�ȴ��XK)�9�X�:� qqN�s�j���j�*L=���B�K�,>2�qu7h[�HsVs�@��k���]��蜱iۊ�O{!#~�$J��G2t�1��s��9���G��ް[���c��8����
d��{O��uc�f"����1uJ=G7
	�l���X��J����@p~��J�2z-�
�dj���
�{���P�`�I�ϩ��T�|��E���G� Ҧą�6-Y�SP�&�aGю�aѿ��WG�5b2'bod�[��b�&��ɍ�	~�9�gZ]`&s�ʢ�/����>z���T��Y��#2�bA���B>��/�ULh���X�&@ɺϟ�S�GO�h(B[[���)����B�}����Ct���f�:�j'?���'�ƹ)�A䴀Ŵ�[�B����Բ�q��b��n�F3k��9�@-���u9���!-;L��rO��7I9�W��XS�19�&0;�Vr���dā�v��
���oʨ�r�)0LwO��;B��z���;L����9���������=^�<S�[��-&3U�ΞmI��8�KB�
�-�6l��c����SxX�^tx��rTg�����#˴6EQ�;Ŕ]��#�\IM��Vo�*�����u	�Ѵz"M��+[=HdQw�P�ܾ�6�;���r2i��c�Pլ�Q�A�*��;�e��K�XH:�v�О�å�u�"�U<��m�ʌ&ҫ:��c�n.%Bc�.!�ڮ�SZ�^(g��_L(�H��h��bd]A�v+}�]qj4ϰ4�g�$�"W��5b�0MB�$в���q
Q<ִ�d��6�
佬��^=��h�&�^7CӠ97��H6��D���k�������\�d"4XǡR��N!a���%����z�n�˄�R�ύN�5��������]:�ĺT�fZ��&Ƒ����%t�ZW�B�v����������X�l+�G�q���sFp��+ٖ��j�
?6*OH[�
�O���5W'gP]�m�<z-�:�r�$(�~͸@4x��>]i.���&�1�����:��;���',ת�6G��kr.����_V��n
�ׂL]
�<;��
#�\N���Š�)�m_��x��a�X:4�(J�d(}Y;�F����hW*��W���ԯm����n��9�	d ���U[\L��Ul��p�%�²�D�\%o`�0�$�Z�����BX'��b^}���ln�:_\�O���S��,l����b9��U"�qw{:�Ը=
C�'�����!�%L�o���V���őyL}V�^��f�]��c\9^8@]�-޲��a䒔ۍ�6�
�+o��q���LoY���tf�1����?D����l��$�Z�pD\"�v�G%�R��zXB'O��,}��}�;�n��N�LJ8��O� ��*S�(��6Ec�c���v���L�'���aQ�����V���R���+¤�1�FY�P�F��:RLH.�t��B��0�u�4�ʜ���NŒ��1��R�� K�q�E:��c��RQ���ݦh�܋�#lU�n����
�}��,�RDHA��ZBXk�=
5�l�X��H���ȶ޼�X��Iw`��mZ2;����TW���9�+��=�#�L���aZn?D�1�;��C���'�3dgලu��&VW�s�->�p6�ʝ҅L��1((e�r3a���!��}�4��'o܂W�
p�k�/���=�l>D/�7��J|���({֋�ʮ,�z]1�{��ƞ��$�b�g�]Os�垁���Z*�e�,j݅i_��Ĵ!I���Xp��}O`c��K�r���+0Y��銴��=�i>RH�4�@���߷�.#efu�hAo3���@e>d&d����|��)N�u'��|�R5l��g�w~Yw���H��^;r���sf�T��+�����0�/�{0+���d��DYk�ί���7�&*K�Xx���`�ڂ�oya�I�R�	JJ�ꊾ�:�,yyE{���:
�}
3�3Z4;E<{h*Jޅ��X��򷎻{X�V/�V�+�K�.C�+M��m�R���틺 ����bx
e�u�|�cȇ��V��r���艂�[��v�L;����!GK���⎠+���Z�e��-��*�F�E5��&�֤J��	��
�˖I�q5i)jM�j��
Ԇƥ�2�ָi�����"�H�A�dM(E�ڕ;�M�s-U��+pz�M&�n���(�"����0��Ve�
rH<���	hP�TuB����5Gr�v+�v
�9�xZ�ǂ3��u������C��y�'�qż�^����2h�Ga�]ͺ�Í��t�{�y��?��
�]Z�.�u�
�өU^>^�e*r9\���-�N�;̔Öj�?���ֻ�o���XV_�$�We�k��C�kؠ{k�ݦ(R��T�b�^Ϭu˭�ߌ����p�Q^-�Um�ѬW��84��X��ˉB�����ܞ��?(/"{���􌦱���v��
�:{Aޞ���v���]�!�P�;-�#�9y���Y��,^b6O�~�,;,}�\����x��}|F��c�)����J�ȉ��_��	ܥ|ˎ�=���^����ۇ7�,��U;�œ�����9[z����<t�r��o�p(���BY�1�y�avR��>֕#���e���=c�&u��ꔉ�9Y���xp�1m�+�_ى��hG]��2�?����U�c&[Ӥ���;�C�U�XvOZ�yM��f�F8b��e��\]�Qz��D��j
e(<��l�|e1���O�e`!.�M��#�y=�}�v ����y23�˴ux�',/H�1)]��}�;t]�i��ظTH�(|o�9I���}�}*���s��w�b���^�oD��Y��S;���o�_{�V��r��O'�c���OZ�O�&#�n�ؠ>�M��%u�,��[K��xY�j	���H��Ew����|\��:'>$�(�6�	q�_�6�IF��~��A�c���¸
��.h������g^�E�!�fZ�ЃgQ���<�Ȃ�A-��7_��������\�|��s�y�x
�}>]ap���o�|ڳ�g��3x��u�[��-a2Y�#8w�R0��P���>��������/�M6���b2���TK8���$�ZÚ[(�#��4��]�_��̕�9s�x<�����7��=8_�\v�W��;F0�"'
7����W/�F,�y�A-\�T'�{1b���L�&�`�]SHO�E|3�C��j˲�D���0ı��z<�'��80d���,�m���7H1j߂�9�K�!�!G\#�ұG�^��r�!��N��������Z���{��%	/ῴS�'�,#����C���ܖ�L��q���d1����3
%���`�1�U�P�l��#�Y��L��aþ�Kv>�$s�{R�F5���Ğ�#-nM��<��
��*�1
C��<�(�C�5��mL�5��|g;hd���yP� �ݽS��0m���S�5�yb�V��}������dV��>v��8W{=�Ɏ�Y�Յ>^�j�P읶j��1�j?X}���[D���!����*���/��}�w2�1��gZD8��� >��C��]LN��9�P��o�	��
����ݔ嚌�3Y�Ig�[��4f����)��5L�&���R�����5t�Փ%��Fj���4/CG��4�H,�K����XF��E"�L��]����5P�h��q8�B3@�y�/od��E��m�?Hn)��v��Y���;�O1D+N�l��t�RA�j�-�9��� nX�4�95���i�v�/�TgtI��t&8�.�4�l�P��/ࢌ R܁�=̙!�9Wc�m�U$	|eY�\�1.�9�.8K7l^^ޮ�i��U�Y����LN�����&�!H%S����X��
u�uX�Tk��(�U<���~�b�q┯�Bo :*P�@d�NL�����~p�
L��s�����V��T��ҥ�g�faZpZq��W���i�����^��f�8k�}K����)���E���ΐ�9��/����y���}̺�/I%W�����	��E�$� ���*'%�*���h�f%�)w�����p��	2K]{iW� ()s!�`3������5��zT��S��g֯޿��s�A������ �M{�O�RQ�v�7��e&���Fb��b�$t��\%Ap�ع��ÍJN��Ļ���Aܞ(�	��r��̟��W�k�^�O�;8�$��!���5�y�a��09b��[b�!y3�B�5O�,�R<#������zY�����A�3��0.@�g����4��91��;�
.(ݠz�ٿ`a�9#Ydg�!	��HӾ��F�eL/��o�n3�so�1�)����ĉҏ_["I�)Yyִ�t�w$N9���oB���Փ�<�������խ�3r�ړ�_�Kt����{$Ȩ�[�\^=G�#�%˘f�죃���@���Pn~ju?P�$��o�0��]�]I/o���oI�4UW'}M(��/3K����s�J���#��v�I��^ R���s�u�֤������b��U'7�,U��"nnM�j�R�X��	{y��N��)_N�9�3�%��2�U��u��J��Ֆ^�=����C�Bv~:�V��i0
n�>�jO��nGO�٠p�F�;$B�	��AV���	���f*�+��ԏ�S^~�b`�t�B�x���*+Qz�8{oǎDHgS#s�G�r���
�1��b�w"�ї���MO�Ⱥ>AcAc��^��D���K,���O���1&1���\��k��D�Z�֧��76!��$�<�{�w�x
���x5�7�t��,��
Zoq��4R�R�j��b�~��Y��٥����C�wT�7�[g���8�(�8�FW��o�<5Y��/Q���������1+J���~��$�����������+�U(�QD����X��5u�$�ʈa�~���o��(A���O�5^�|��Y���(��F|�$�Dm�رn��g�����aD7?������rtj��	n�]����:�L_S�

7(����""߹�]�'b�7�':�H����ޅ�,�ݚ���ŃZ^Z��e�Z/�� $�����;%�V���^(��p��f��
od6�^�D�;W��7��c��}��fSzץ��?0lS	�/Z�Vtl�|�F"���wO�W�{�/	t���qˋ�R�b�/��J���r�|̾»���2K�q�J���
eG%e~�0���`�.6��7���Z�v=�4��+�8e��B��@!���8�~��k�(�b@-i4�������ޓ>�d�ljb
%��*�.����1���K#�¼���f�ݓ0oN�)��l�#RV�ȃ<�ʶH���8������Y��`F�o��?쪯�X�(?ب��Y�Q��\1�~�
W���a�u�������b��om���N�ݙ��7���Ĩ�M��۞_t�|�\�b�Hu��7�;|v<w_�|k������1���J�_��!v��5���
�wpA���o�s]Ï;��d�Fo�>�!x���	�?��?�_�1�"��xi[��dyq��y�]����Z s
�ݰs�r����\�!1tS���4齤GV
͆ق�w�%h��T`>��l'�b��EY�,/AW>J�B@�g�Y>��9cN��,c�i&��4��-��X����lt��&��S�w\Z�c.D�^Ώļ�`c�`a�`��m��cOJ����f�l��`���ʘ�r�?�$����a�9�
4��lH���n/m"���.���8
M�#��^���IG[��qژЪ���(i�].��eϙ�+k�(�_(n�ݜ!�Xg�Tvt+�5�6<�C�j�-�T��L��)k7�>Lm! �����t��Z�-o���r�o��|I
�^iW쪍��-��r���I��\�������!��qh��c��}h 9s\$�N��J=O#ɘ
Q�,�Z��R�����=g�0e��2E1���.P�!��I�k�����\Q�]��w!�Dn���=�,����YcS$[�Cŋ�0��������8L}�|�@L��u��
�͋�޺$r-���n̽�,�Kz+w�ܑ"��W��&��b���؟w�ʝ�(�}�Lh؍֨�瀱�l�n{��̓)K��ܣ\3~ܽ�n�zT��B�c�N�El�B&CO#fi���h�X]�e��r�~��]cR�_

c/s��'��>zQ�I!�7��z/���z�|��k}�o�F�v�9�*i9%fr�
�+
_�������w9�J}ҒFI�S�*��B�.@	Ӿye�W�_Ue�A�	dfk+mC��W�e�S��|�!Q��i3~������Pp�'}��N����l@��ZntM�_�b`����An��b���zCKQn�*�S��zBb#�X�	��"$�X!\gqK�cyzFZ�9v�t<-�^���gl@�����9���\Ib$�;R�'���O�>���_��.�== ��1G�N�SB`�BlM�,&J��
�7�^�w������wDw�z�]�S��N����R��w����`_�<��Q����Pj��Bӊ�d�]�
o�1i�ۢ6�(ƛT2�e�Q��v�#��j+#ݕ�����>��u�2���j�泣Q�a������G�Ћ��u�D�[��*kT�\�h��.K����Y��������j�P����r�W}�K��xS$ž��׋�{W�-
���"���r����O��D��. ��r2�=�|�O�ac�e����re������0��P��%�-VQ���F�6UG�X[�$�<vv�%[3��*).ւ��T����J�3B�Rp=h-A�ŌF��
RS���2�ٟ�
>'�����m��D�廳����;��$m�Ӧ���omQ�Jb�����[�zV+��8�>̦0\�F�y8����lC�+� 0��Bc�ј#�"�f��ټ}w+DA˜�RS���$KjBo�G�Ff�K鸇n�?o��[
��fR~����B�)��9z��Bn��ş��[!w�(
�~M���'ف��s�w���pĎ��1�����f0�v1��
�cK4t[#\ҺN��5�����7O�"phD���'^ۻ�f2ƻ[�n��NH�N,Vߟa�%�O�NL g�Y��3f���MSؓ!�>����&�
[π��0�G~�Jw���ߥ�
^�AE3��t`�����a懹?-��,����9�wT��ID1��--#����;��zȏ��f��2��A���%��f��6��Ř���&=���}?±E����.0ถ�:4�F��9dU����jt�6uZ1sLx��{y?�U��=����N�A
���g4�(<��>
�k���k���w�~�>�,�L��7��X��!Vq����;.V=�˟9{hFef�>�hԃe��_�U�tޣ��
J�������@J0�J�օz�tf-)9�H��j|��W�"H�CƑ͸M�:�eX�ee��[*5��X�qm���
s��G�6�͏�ÀΠ�G��G�y��B�hp��!�JsT�����B���9�C񗬴���*}�=c#C=c��/yzFz�=��Y*Z
Ji�q�	�qj	P&���ݮ����1�&�ߡ��$��.R��������m�I�H�ȣ?�6M8��
�M��ryj�	#�� ����\�Q҄`_C?:�k�܈�i�f�؝�L������7Rc!���,!z�:P��,�O��=��ڠDP����D;<+��t3����i-����z��G��<���V�Gȝ���m�Mo�BbE��ޅ��u��q�
�eFq����,Շʽ�j�.� ��E�Zy��4u��Y��q���bu�IN�6�[�9Y�x��m���
\q�H��L5��hB�C3�Sf)e����u�F;�`af�/�����u�F(��H�b���W�l.�i!�QBL��l+��; �_���݆
�[,�:H3��:���%/V2��jv����PTa���٢劊C��$�s��JHxS���6�v�F(�����C@���ݻ`���@����4O��:�S匓$�]n��;GXf�ZM?�0vHt�jI�2�f��2��8��$�l����i�H(�aͱ�3���k�E�Խ�>|:�%��ӗ�#c��wg���&I8�Z��m��Λ��6#ٽ��~"� ��#�~ ��uKH�N�AWD���<�Q�([wG��c?�YK�—!����k�k�DpoLs�-�S�[G�s����횥�2��o�+��y�ˀ��x�C��DP�SXC�(Nd�&G��E^��f�Z�7���*�b�@�g���)��ur�F����.�4X7���W����َ��!���7l�$���b���e��\����_�U�?Bḏ �h� �$	�����5h�m�I�2��0>)�!DM��L�s��c<�RR��gs��o7�s>�?� �����>Ҭ�p���D�<����r�22�٘��Q���L�N0k�+��5M��U1%�_��JN�`V��f�*�+���b2M�6K.R�8{T�IU'8Rʑ�t�p�yɭR\�TYVWc��$�'�C�n,X�=R�
�:�;a
!�6䦻��Mx���]���F�R業��֖���W��DG&*Fb,.��@ord^3�{R����WQ$�Y\���p �uz�;���-]/ʸ����*�܅E�Vt��g��gfL*�b� ����s�u(x�0TXw�1�j��;�+��!#�Y�����|�,!P����T���h�1�4'��.�E�<�T�:ؓ8H�	S���J	���t�IBR���0"�ԋz�wJ���
.�f�T2^^v~h�<?�}U{�'�7�Ь9���GU��Gϕ���z4}�Hw4*�w��R]�|�?�R��p;�Ț��X0������΂
��
��4���������1�"?T��@�7����?�00��*� �^iwd��M$Ђ�ό@��
���s`��	0k9
kp��N�>�u��*�@5�;"O��@���LW?̀���j�@}9�H�O^�nC����&�2֨]�d?�M�l�h��Ѡ��^A��f�Z1�2V� aB1�{�tr@��Q�[i��aw7��]�9�K��
K�ҩZ��/��8J)�+���{':�Xer�O����1F�V�i�N��,�߫#����2���V���_��l��f+Z�cT���K>\TDT��<HQ),^_Ɗ�'�u�K�:8�"$/�?Z��L]��HF�Of�=gy^�nn��|Մi�Q��M�01����"Hh"��Q�䈻��&���u��op�
kз��R,/KT�8q&K$UL�ԁ�Oj�ٔG��B����O�'d[���j�,Vjvmbt�/B��7~��8+����N�TA�OJ߭\T��T�v�h6�ݵ��9��Ykg	��8!�v�>v�S.:-�_�,Z�^U
m�'	.$�"`	d���^�&N�tD�BO��\��`�;ٜ�Qñ�?��� J���bhEu�D���o�ÇHM>\�h����e��"ҍ�L�tn��+b�#��'�I�`�L��ʌp�[M�҄To��~;��|�]���7��1�D3����c�e{�_ظ����}G�LaW�J^�c��jU�',
Ō���ta���g��K�q�\z��r~�K�k1)��V�*���c�3WH�����8��/�uKZB�k4
%�:�����A�Î?�l��(����\��k<�9�=���%�N>0	�K�C��1�g�0��A��T��TrD����)9�JL#bJ���(=L�C`~q���L^GL�P��K�3&6��d<!�J���},��h����odΤ幉m I��s��� ��х��2(ZE�I݇l�h���	�#3"�%��8�L�+�^�u�U{�jd�&�
����z��[�c?���*��	�#~=��ͧ4��ն�-`LF�k�Ml4����B�5NH|��
l������ĕ"N.�Y�/�\,�SU�W� 3}X�`Y^��hGL�oY
>�,m�c�ZڣSS�?�pS�&3�6�Z43ٹ����
8���a��5�����ɝ�q!�f�''+��˅?%�=s�q,瓚����
�7���S����r2+=�'ǥ٬K5��)�;�;[�(�R�w��"�Xq�7j��j�}Ƶ�QrT�Q[�ۅ��Bp �x��2X6a��(8^�w
s+lᨻ�J�Al_�HR��l�I�L3^*هKmH葫�#XAa[3u��憏��^�7LK�)_�i�u��ؼ�8Sɉ8���T�M\聄L!���������:`��"Ho�ϱ`�c]oA`{�7�pj��S�k2ҡ
 jOߤ�Hl�S�P�(�ƚ���?;|џ*[J�F�X��u�*0QE��
gO�;�ZM��`FU<oB3�\�m\{�J��e5�M�Q4�b�f'�G_s��j��Iҳ4��r�d"H�k�G4�� �_� �xJOQ�j����-�ۆk3�)đ���I	'�޻�p�g��3��V
{�2���
j��X�#��BX�JXT�u�ߎ��c�'TIUe��Sq�_��;�s�=x���BCښ!k���3��|���ޱ�Z�������[1��I3F�U+&H�}����[�b�hZ���W�����/�m�h���%���]?W?8}p�[0������k�s���oɡWʇ#���������O�Q�^�%��c���e��礼��!���Uܞ�<�h��s���xfZ� .��U��z� VߒX�^��3��ߙ��
�=�K�O��8N�}iK!��ؔ��?�M�ۣ�d>Yz�e7�e�Jf�{�xC�R�� ~hP�2�+Y�(��+A�N<`m$tɽ����vG�@�$.����$`�G��5"�Fk�z\�x`�]}���DGr�&��;����b�6�<�u�™R�b�Yr92O85�1?���}�Fdl
c�/J'�ŭ
�6����� �v�W9�P�@_�2� ^;����bX��QO�l[o�D�S��z�Ք���(xʁ�
����N��`��!�wfP���wrUMW$e�o�L�}�b9}�fs��T!s�⌔�&��Mb������N�w�)`���=c\�a:���)b酦��TǗ���[���Q�^^;��q��s��!) 4*�_�cmA��nH��ccq�8�kh�m�/$�DX��1���)T�]D��UP������;����]����^ȡ�t�}qvm�;��g�Z��MM���N3�N�N)�Y6;�!3Gg(!kQ�G0L�h_9\�;{k�f#(��ÎN����«��-��N��\X�U��{��{%t�(��X�'���$�&m9���C�Ҥ�XBEu�{L8����f��P��莴g�v�j���o�n<��a�%f�ؚ�J�+s�л'��F`D_�F��_��3���	{1F�з`acM�Ej��t�%NK��:[T��ӄ�i,t5���78��a��P�am�K�2_�� �-���9O֐�l��*�?Q��P�m.�,&�F@��6�ȹ�k�Q5�����V�b�F���u����y��1�HpL�E
Z���a�PB��أ�N�C��'ί�=�y	�D�E�\-�'D�
A��8� �%��y�aUy�a�Y$�`��칬�\�&�g t��Z&D�64'*����j�؏�[�-[�@�K���K�M��'�ߣ���sGmZb>�����U=��vJ+��w��{���X���oe��	�_
�"�1�1x����֞�T���^9��zk�|��c_S�V��2��bbb���-�J���A���_	��t��dcؙ�+�H���5�gs&k�����	�ϤRN|��Ub�S��Xv֦�p(�hM�@o���S��R��8@dPmi0�*��{�ѣ�d�O�lVu�u��X�i�cOpq�.��F�F�*���B�6�u�F޵��5��BV��m�S4�%�aQ;�cz����6mh�Ѧ�e�
=��(�կ�{���t��-ut.>Jѳ�0�wQ�(#L�&�ҿ��R�\�'v���(J�"׷�Fj�D-��I3��>7D���)\j��鄗m�<Tq��;7}�U��JRz���B�D�a��SvyU{׻S^�O�m���w��~�}����Zq&-J+p9��L��
��BKZ���R�����32���o���ݡh�7��4瑶X`�#_hU���B�j������.��)��-�	��@��`+ �O���0�/m�����x�$��F1an�={:1�s�)<@�_�Ԛ*�ARJ�����3� �j���=��gyYDnY���|h�3�����]m�������sf��1�/Ŭ��Z)�Mb�?c��/Ă��r�
�J�
�TڊҲ���/�����wA���Pk��̋$ ��6I�A�FE,��{�|KRu�$�g��Mq��rMMLMv�v�>�|]��y_a��	�:SXa���Ġ�-�����/�����`3C
+�mcA��\G�-!5Lz�rO����*�ڸ��J�O�fBv�ԮV�l�1t���z֘n���q��|�q�ꖥA���G��Ŕ7���:H��z��yA�R��
nϯ|$BƂ�h��3�~��/��>M�rh�j��v���h�)��YNOO��Kd${�;�/[s��k1\&Rp�|�=���"�!�8��1r&5UMf�'\�Ĵ�� /,(���0p�͔�Ÿ�{�3�'`�&��%7��K&(d)!��m�NwK�čw�d@X2��0��`B&�dJ��� ƴ]LUWkd�&Ɉ��Fl.�7ȳ U��K��#�!�Kd\�H��L��J4�<^�.�^����GM�ZH	wH)�T��X� [D��/|jhZ����azD} [�9[�z�L��JN&-&9����A�o-E`�����QYSqS�u2%�f@<�tncn�RK1�0m�_d�5G�n�,]�I?�'	\�1A���T��å�Cj
k��Ӌv�}&����� @�zP�1
ܝ�,_EZ���{a(J�ߤ��C}�Q�[@@���CRa$�I��*��1�O�����1����3e���"�Z�m&o��j������sC��Z6�%Ns��d��J��`×4����6۵U�e�����m2a`��d�ޓj�����0���+%9�h�CG�T2qԑ:�fL;F˫T��պQ<h�7� �6/}LT�5{�U��Uj;�M}�&�UȾz�A2v���.ٵϰC�^��E@�D:X~�)��i�I36������Kr_��zb�[�9.X�%|�#�&O|������o7�a�u�d�a2�r����At�Ed��8����aH�隞Z'u}�&���9
l�\��/竀�7D6c+�7XeXg+�˴��Tu)&��[��c�����kΥ�p��S�n�F9�TOp!��-aA���h/ܡ8���AAct<]WF�6��+��ǨTfM�A:M�>�ܝk:�	Bxn�W��Ԏ��F۞=U;Fo���
��cҳg�j��`bSB���1�\�1�8<t�x�Lb�%��Vtv��4�Z!��s��7cK���8v�=l��j�w/�Of�&��3�1���]��hUq7�D
##�/5x�H���m��D-7�w�	�tQ�` .�P�j�u�g��-U2A�]�q<M�l���9�����g��J�3�t��ę`���8��zWt�@��(1�	5-���^��l���l��$�~�kص˛z�
bEQ��F��d�Cp{���(0�����X`*�<��_�����3"H�h��$�o`l�(hkm���{֛�4�&�6��l�Nq�t�RؘڱγXh@8�dL!��n@�GC��4�zŘ�����d��ɚt�ar�9���F�;�0F��\#s���P��u�Atd��v�
�0?JA��~�X�\�OL͟���}��e3��S�,��c�f'�VL�eG�J��Ҹ�V�t���];k�m֯����E�gKO:�ˢ��s�M\���~i�繺	��'�~F�LS�d�ׯ��c &����/�h.K�i��8�UgGmW���h}{����k7
������F�b�-�̎K�n��p��9��Mf��lѭ�oϩ��'	-��Q�CE�����{�Y-�y	���n�Z���sb���P�$��g�8$0�f�ҙ\���
�H|PAt���b0t��2ʔQ��xy�;�G�g�~ T�|)�ԛ*�{�E̕������9�JAr��̫, �V}���W�B�b�����y�\h�
Y��9�lM�?�A�̩�Y�G��H�
�d�(I6D¬��I43�Z�B��Ǝ_�r	��> �a�Nͤ�n�(��
��)��pS�~wH�QG>�L�k��&DoHW�����s��쳵�B�D͆AÓ����]��kd"�ŀ��j·��������&$iOE�����	� �y��9#�� ��
Gj���B,_�\��M��K$��j����A.��7��C.�f��/�aUMW,U�o����,��h�졔c�ff��H�f2��VCsi��)�����$ P�� ϶4��p��t�>�H��7� �\����=���Y�\���u��UߟwZ?�Clo�C���䚋6Tѡ\d�A02ē��PY�CR��i-�N�y<��4�7� ���{�x/�\":�;/����HH/H�37���óI�Sc���Uij�bw�������Z�37�Q6��,�0k�I��u�E���~t�Iʌ�啼Y��S�
V��,6&�YZ���H���Ks�b�� >��)����+�`]Z��v��	W�.�n��T{�N5\*w&�	��)7i�2��tn���OCc��5f�Z.�!Zϥ3"������Ź��J2��0���'�yY�q����������+�㩃��
F� �Z��V�O�j���s1���
�s{WY[m;�b��	w�q�Яέ�r�;��m̐�(�Б&}X�L�n��R�B3NL}�J�L��@*[�U���i���$nŤ�����Š��!t�t�H0�N�jǔ�6u.�����`�5w\ͥ���\p��IDq���QG4�S[����^G
�a3w᪾ؾ\�B�m	�L��x�}��œக����/����ښ���g��v��*��4'��J�qR:�i�%{���ю(w5V�7\�lUC.���>}#�+5m�㎓%H`ѻ����v�c�� �P���ЊCM���UX/�]�;�#�.�=�x/�Z�,ϝf����AB��;�Ϲ��;CXM̚�>�;E��"����\�7P�=U5�;ˮ�C6L�+o�u�����WMsӽW�J��
E�;p�k�
l#=l$0܁��!T�����?��R�E:�}��[�!N�1V���5��{�9;�E�#]	�氚X��v4�܉),���4'�v�u]~�ϼ�6H���fz"o^u�U�K�-���#�BB��y�B�U�6V%��2�.�e1��E�1����X,���F��[��ɳ�y2�_J�����d�4��q����*�,*�|�qoG��{�Ӝ������3��g�e0��6�x��1?��I��Q�JR���a��
��b��m��k^�Z
�\��%��Az%u��g�b��� ���2`^�\X��!��
`���Zs�΂�uE�\����5=���I�<�s�Y\�x�J���I�1�n�G
�7��0�,�t��u@��Pk���ې]��ӞoƎX��հ�!�xs������
�����`�X6\���"v�#��%k
S�e�� �
����� �k�-ndv$i���-Y�(�ӷ�7(W�FJ�#�8*�񞯪�oq���^�U5_���E�Q��_�5�>�!���k���<B01��_Q�D�?��"U�a�XB�]A*5��Q�0��!�i���A���a
���W0rD�����b��ΐ����s��{�Nkߩ�^���Z��7��,��
'1���R��1<��K�1-Mb��x&�dSnW�[ɳ���T�k~�|��S�D��hw��(��'9��b�al8g��{(�{��+���U��Ul���Yp�_+>s�?<?$e�'�5���A�"���b��3P 	����黪�'z�ɩ���w	�:Fq�.Z�\�#l�k
���3�����r��x�3\�"�`	�����`9���y��6�xn~)iwZ��*;yQ�B�ה�[F�o
a��Nl����2Qp�k�(�������G��z�KiIĢX?�uf~䥠.��
�ʔ?j�����P�p
�����;�C��7�2�gw���L|ZmW�ɒ�aȂ�R��W�ޟ��Z<����l
��_1��@��4i�I�-�ۏ��kQ�@��|�7�H3_,�G"��K�N
Z���b�j*�У�:��#B��l�Q�B	�T&-�L�TJI��40���o�"�E����9�$~��A�A�D��ư<��Fj�Iʬ���pz��ь��`&���Z�{�_�l(2��� ������|[*=,4i-
�؂���1fʿ�����D� ��nN�G���Lb��
�{GPD"�����.�J�)nlq$�� o9L�G��X����[ֲ�'�򈵥Da���ſ�p���rj��VVv�k�W0���h�e7���)�mZ��`�x�0N���~VG�cbpZ�E���	g��s�0�n���4Z��3s��ط}J�{([��L�sI6�l4Gz�u���y���ZΉ?M��[T�o��V��kMY��J���}����I�	Cklj����&�К4c���_��\�?-&
��yd�&}[�$��t�e��}�Q l��G12�-�|ݙPs�<�����^8�����w��o���=M�RK��Z+�&���B̀�b<\�M�
W�z)�R���&$�'|7�|�SQ��I���䲽���yH�nr����5�u���k��f` �vP����U�loXpKXC(Ė|o���3�Z%Pm���*�4��Ab쫐�o�ǰ[`��<�0= !AV�
c�4�[%����I��23��5*c��@�u�$n����i7q�1nM�1NtH�����$T�4E�EF���rr{{e", ��&�<�j3�������&D�K�z��Nj��
�����U����Vdm"��?�Ҭ 0M�uQ���$	i��א�[�)���Q׎U���Ȳ���e+�i90��d�#�U�C���q��=�k��uIȫ��j�*��ӆU�GEq//K_�����n��2����o�
D�3���'�dk�S�
��3#��&�1�[������9ԋ�K�RX��VR]RF1a2��C�e��l�ΚڡMjjlf�hJ:l��]�Ld�w�e�S��EPY$i0� n[��-P$��?]
�~r�4i,O��A3I�9�kӖ/ �.�����?�t-7$l����`��(��y���	1�0	� o�\�ut������W_E�C������APH2@p�!c��w��Jп����8A�����(ѓ��Œ\ʼ.
g���i��kf;mu4������Vߐ��c[x����<��$�h�xd�h�%���w�(O��kH0�mr�o���X��^�䫪���NEuٮ#���֙�b�o�d�Z�;bIUυ�#���H}�ls$��C�����J_�T�V2�5�U?�w�{E�V��!9յ�Z1���zj�Z��1�e��-�c�j�i䎶���'�����\b�к�5�U���/�6(���Yp(�u��jV���k�V �/�[�.Ctz?���d�^���|���>����Ey��}6�e5�ò�PZ��T<3��.Q�ِ�iQ��呣+S�<>� �����{��ԌK@o��%*��P��[����
�^���?F|�l�5J���@)Lq;�����ѱ�a虧e:�/����8��A �M阋��y� r�]�I,�~�}��v�잠�-�!�V��/��3��dx�=���w�ʛ?��br���	o]�9���s�5tZ�C�G��mL�_+�j�6��h�#��o}�\h_U{)��ȴ�HAg0?	�R���*�?VU��;"#�H3��K�S�M @�M��J�1��ʸd^�]]1��!#t�B��G��×	TV-PN.С�V-�
y�tBBJQ�lW�n���{�>g�?�B�Ps`����w+����݌�b��䋊 w3~�
r�R�}�Q	����Czr�F�0�\��1&�M,~��ѹ|�?@�7�=��3�j}�ㅴM\sX����>��r�C�������Ԣ��Uܠ��H��4�c%[���ȕ��OQ�Z�TV<|�*0#c��m(9�IQHP���ϒ<.Sj[��^�ZX^q��9a�"xʾ���ʄ�\�A������mh�/�B�8
va���;?��:&�Ū =ê�ǾX�\Vn{�Z��f�Z��ti7�p;?��o#�R�7�pFM)˩�KiӤ�?m�Pà��u-n�`��Ԫ�y�5����]��,B	S`�4�C����p��ț�I�"ج���e�{��Hlj
�
x��;�Z�BnjAK�Aj'�tP�E� }L�C��r�e��ꈜG��sU�N�31�Q�)ԊB"�"pU��������f�E�����e)�T�!9[EtJ�bl���dm�?�o��e�wI��B��U�u�.�~բ�7�w01Pi���/�o*�N���6�Ps����t$�qw
�w�w��>վP;}���nжTnු�1��Y}��rw���<�k"���Q��9f��M�d‡���:(^Q�J��:�#�^��2K��r�j��K�XK��#�d���B���K��j������`�=>��㍬��fϠ��V~�؎^�R���ڒ�u��j}�0*��S�\%�$>i8?\��UVBaF�1@�+]��(��2)���ֿ��(Ȣ��󺼓֕#6��+4Pu\_eт���(�f0��
娵H=3��3lb�W�$�D�I�bH��i������	MC&7Zν�}�I�UǏU�+��W�[pŭ��}�93�R9�-r�
{�'ٳ,P��L����ؓU��B3���1�,+“���`�#�nϑ��e�}�H6���}�~�U��I�2�U����7�Ɣ�l7�{	���E���v&��
>��m�h�<�J�{c6,�K;�'��N��G�\"�)�R�﷜0n�Sڔ9�<#;��3c�./<��ƺ�.��Ym"��<��$��r���$�OA�ŝ�Hx�輼fֽ���?5ɱ��Q- "䰃	���}���ʥ�ϔ#�0S�Ô��x
�~��xǘ"�fg$|ߑb��W_c��y$������zT7vPߧ`�2~h���"44��B��س�;����zLCS	�Bc��@JSA{�/$禄TeTU�!h��9L�=XOgN�7�pe=�f^1��g��N��)˳�
~���D�,7W٧hc�/xc��Y���)R�>,�QOhŴ�ۼ�*H\�p)�K�$׷��'t>�#<A|���w�n�$r.��p�n=�4r7�gx]�WZ �ԩP�LKA:�!��!?�`�VS�͡V�P��.��Q�#�5�� W��ʆ����7m��(�
�p�o{�רJ8���Oe4r\�3Ⱦ�N Մ�J��e��q�,�&Uq<�-��lNQ�(.���Z��ָ��E�N��UK�>!�l���Ŧ'�DK�zC0�o�z�"�9�_��0�s��I��
�~K7�m�~A`���`�ג����ޚ)Z0&v�Z�aF!
ޚ�BUC.@�sƷYp�lp��.���q�1i�o,�At�<%�����KHS�aE��+��<8�s	&��ߢC�oWpfC��G}{α�QĵͰ��Eي���Q���V�Ԭq��[�_b�����#Ǐq|�M0>��(���C��W��<:�wSFFɏN��jS�ގ�)�)ǐv�,��l5w��БB8]2:��9�U�&��ݠ!��+{c�p�lV����}(Xa�cW#�%��b�V�l��=�?�)�77n�bي�E������:8o%*q�_��,����J�f��`|%��4�w:@���+�>������=�o�n["��������Z*��/�H�n��k/�=�k?����M[�+���db�1�K'�x%/ 4�
'��#���)z�-��oEcoj�R�C����s�\%�g��LOe�1]���!�œ�)���>�M������I�l�|0^������Ψ�)#n]?����Ѣ7+=2P����̡�u�%)Zx��ѱ�8�P�!C����.������ןO�f�z��5�X��b�.� ȋ�i�h5m��ēkKSd�s��)��R~�#����%��E<���/1��2�z'���l04���w��ʦc�q�6�������i�A��9���HYɔ)<��#�{W2dS��_��'^d5�ȸ�^�����|n��=��
&�sᗗxl_���#�J�y�[˭Ay�q ?���c�/�����5R6��}��Z��<_"~�$�!톖y�}��C�!���jYo�����*�}��U��6	�Wc
)�<�2f���	&1�Y���d���xs7�P�u{���Fk��&���$�T�O��D���v�5��?Ha����S��Y�Az���+E5~�k�e|��q;M�����e���"��9Aʏ�w��ͥ�@��h���ɦ� +Μ��c"i�g��d�Z�x3eb
�c��s#�ciMKREK�h5���dXE�*5C���:��_*RU�Jg
�*+G�`��k�4u1���~����# �o:��������k��
�EmL@Y4����Jck��x�?DZ�[�)��r�Es��7̡�"��ݏ��G���֪5Dj��x���%��g"�-%�Ou�'0�d &,�Ws\U�	᥸�I&�^Wx��^ƕT����q�[���p������i|;�F-8����r�w�I�7Ug���\G���_��"�ko�A��%s����@Պڶ����c��+->�֙���ͪ��0E$2�6����c��X����dIy߀?�G�&SZ����_v�_�]g���|�tXC�@cq���Ҭ�Y��^��;5�ř�z���O{��s��3]@T%m�K
�Jج�3�j!���K�^��u�Ǘc�&�������Fys!/|M���^�c�i����ɠ�p���ٳ;Zq~��\�
�k�(Ъn}������
�/�c��y#gZ�2(g�������Q�M�
tj�M�w.��7���~�f?��Iy�-j.��M����n��鵧�#����0s
e�3*����~KD�G{z@r�^Q��a?�6���s�K�	��Dץ�
aM|͗,Sz�.v�c�f�#�M;�����/�(y;�W��Mq�oB��f�fG��ok�1�6�O�;��۔!�[��Z_}��֐�/5	&C�NG�7g���B'��S�F���B�c���HR>�TڄW8B�ʔV�R�8�^t�`yEy�A��e�8n�!;���0�-�V`��:f9��/��g)�3���7F�W��?��x,���܃X�g�YN	Jo6r�D�k�/��-�n�EP�/P.~��l`����}���J4��hE�uV:��x��$��޶���p��s�FRrƥ����*
�+
���`M���	G����X�����9B�"��ww���GkiԪ̄	7�\���Vu�X*&+��w7t���X{t��\�(Qe�Vu�Y��y_���.�I�ɠqR�b����¼ɹ��Ѣ���EO!h�yMF�$Y��QnF�W_~�dRԄ���dzB���}�0�^?2N4�r	���b8bϊ��	�g�T��<��%/�����m�Ƥ�5(7�$��
��O�1��b����R���}���q���,�y@��ӜIg�E��9��sB�����M��sӎ���í����,����2cy.��2��Q#��E�JR�;�k	��vx���a�FTvS�4�R�v!u��V�9��3���6��y-0TixP��'�bx�~uo��S�y�,s�H����%���O�7\��R�6u��C{�
��L�BꞖ�W�ɓ=��s��h�z�c����Ԫy�ӭA]_��g�ϞQ#���e5Nu-p�s�z�UV��U%[N��JC�C4M��9�ψ�X���<�{�(�Ab��5�%+�H��P����ۣZ���}e����N0Tj�5�ڡ�_n�����ʹc�gt�6�_V�O\�Btwo?e�E�N��<u�A1v�ީ�0�����_9u}">ӠC�:�o�18��R�mqg�<8δg1F�k{�����m�落s�)P�<��4�5�����j������`a	A��D��|���"�D��E��c�i�;��!�b�"쥂"?e
�yE��8���]���!p1	��Cק;��P�T�Շg�M�|�G�P�*��˒��BxO�L��8� jA.��T?�&2*_��I�����
�X�<ɿ���y"��e�>5ם��Lɢ���iE�gҍG�~`Q_B>1#f��s����I�ų��3���6� �h�#J�=k��oH\W���
�M����<�ϷЁ�,Tz^��,��d�Er�%��߃�N�uqB���o�;�WH?(�+`h)&�$W)$�d`g�&��#�����n=?��KP��V����/Z���*�g��.�%�<<��k��ʲ���a���th�$�3?C�\�\R�S���8
[�1_�7�o�,eX��[�P��X܁b�����	���i��)@���JeY�J�YI�
E]��5��Ԗ�#���I����)?��M��(�Ķ'�X譧~
D.>#���8v�O�		��=��q1�0q�*�G��^Sy�~9U�_.��Q��JG��1�l�@cj���U��+q�Ȏ���}��x�{���� N>�
-���b���$;�|��!;���w+�V�=�3,3�7ϔ�d2�P��4�W��] wh�.���V`�mr�Ė#s��_7�?���2��S(ޥ�7:)�̫�_��w|eS�BC��N�Ae��{E�V��*�銊�E����1H�f[׆��˶m��m۶�˶m۶m۶�Uo?{�g�����x�Uq�u���"�̑cd�q�J��'F.������9��|�Լ�TЄ�#:�%�'����쐚W�q,��GV�Jw����k�#�'C�C¬R�U��A�q��D;V�-�܂��R/�-�d���%�tcϿ�j���/X����v�XiI�9����]%U��D%�|b��v��*QZ��ހ?� ������[^����_�zÈ�ѹ�s�4BM8�0G�ED�D�DR�tۛ�E�%��N�X�Ʃבm�G�x�؎ԯ�m�uUN�2R�\��:�]�m�w�ѥWQ~��������=V7�fk�칛&ݴ�)�.��=�"=��n�_�]�q��T=c�6��a����$��X����&{�ɞ*�!N�x���V���_�>�QHF�e?�l�_R�D�5�۹
Yc��N��S�� Qb�W�3Xq��-��ƒ������!��샳�X��-��쥧���_^`�P�%�e��q�P�+R>�Bu$����x�ű����a�0�ʅ��/-�Z}+Dn��l/�0K�Lؽ��)
�U̘�}�hR�D�P9��u,	��>gl"�<�(e=c��C�j$�I���Q�4�v�V]f�Fx9�\��t2%ol�k �fHF7���/����uLa��<}��6��
|�j��|W�pț�L�,�!��Ŗ�Q���s"� y'\�P�����b0� ��k��X�%o orSVm��ۄ���~~O�����o���>{�`�8��r�`��zθ�:�H>�������0���@}�
�Zx&pY���d�>-K���j+B�ft��t�
�ڻ}Ԇi�RUw��D�a��J��X(����h����mrM�6�I�WmI�Mm;�Nd�HTv�Ɋ�\�E�?�*@�������!13a&CLs�Hs�*�zV:��ì]��̮�����5*�T��Z��qZ�2(1�����[���_�X�)i�Hq�!��'ˠ���[�p���*!�=���D��&x~hi]J9x;C��&%��T��lUL+�$)C�1��铧|��s1�a��k����%T� �E�ԦS���Y�6���N�6ĥ	7��1#"׼���f.�����*�W�"���.s�#�"	L�^����ν�9"р�.@��-27�Y8���:�^[�F&h�C���Hzg7;�c��1��wCF�����|J��jju���P�t��k*�^����!��I�SU�J
S��tj���6�a��)x�9D�}ө{EntM�*�������٦�鈰Q��6����8��KW�	����a��-&j��ocu^�u�(甮;�Z_iˬwh����M񰫙��$Ԋ�h���J�c�˶�d�~1��e�ڡb���I��mp
wnW����4<Iq��e��k�p
ܼ�8�v$�;
N�J?���ܺ������Z1I(�e��O�b�"�;��Eפm�HU��{0JnmC�/�8P�7~{Uj���}k\l���*XG�f(~?�\�qvsŽv�q̮�y���~k�vr��EB/�����Lj����4��|��c(:8���MB�V��{�����=�X�ti�!h�+S6�	�M|�T�M6:���[`�0�.��A2�Q��'�w�1��r2�<����c6��6�����*��FH���7��������h^����+��	��#��%D0���0Sd���G�v���5@``A�H����V��7��,�<UK��ΰ��N�ߚ3�}s��"rP�A2�%�u��b�ʐ���y�!��.B&���Y�c�BR�]�e�>fC���ϼ�*�m�'����R/V����!MK�Yp��b޹Swۛ�`G����]�a��me�D���2�\Y�"Z�F��h"��fg�
A(�
���f�'��[e��IUl5�ɑ�@c��a��
���K�T����q�L�K��<�?�aK�����\�쟧r��C娭[K�*u*�[^7�2�i��Xq�'*�6�v׈���-��C�v��ߡv�p� O�?�� �~��<0�A9d��Yp�T[�'��ȯ/4;->C),B-S�	R��qo�B�Ҹ���-�Rf�F�}+�r�J�2R]b�h��8K:e�Wʼ<*���%o.�N���V�Zs�.+R�z+:�h��C��>q��v��9G#Gןc����]ao"U�f��t�f]u���DOE3L����ސxq�tu�u	�m4�'=��������ͶY
S�P�Z4sƵw��m m�Y���fO�Ý�U�̠es��'-�z��\��q��N
83eI*�Nʥ�� m[I�/�6`:�����LX�{c*��M�.��=(*g�\��
$�Y����p�'ͦ��NZD1S�W�-6�F�ٓA~����4`�z͙���~�l�Ь�C]�&��c:!��`�[��I>/~��=�T<i���|��1"���x�ɰ�X,�u���$�K�K�5�V��Ko�\�vuD_ xqq�563r�<��ab��y�]��<�q�$��r�|�y
�bTe]io��'F��j6�]���c�#�l��#(�h`��g���g��8/��$b�4r�΍�H�{��2�w��k�\ X�@Q�$E�~b��)TBJb^�kp���o�����O�b,��Pr���q8�u�L����D���AcM���"�|�}"U2��$S��
�T0K���P����_�k��a����X�a����_�{.�EfqҨjp*K��<���w����j@�\���<�*���� �w:"T���`�+���c 
�ц�C���2������/����"H�2h��3hC�k����a�*@�v�[�7�f�=��]L�*
4��,3�s���ԧ(h*=�(Ȕ�v$N
�/���K�Tv䊱i�9�ߧ�=ֺ�}{�d�w�^�8�
��L��t��eX=�Be]p�T/3�o��F�%��L���n+�4��-ӕg�Z����ˋ��/�:b���7�y>��d)LjG �12+R�P�n�>Ñ�t�淕P���B�ȫ%~iţJ[j��tdY�� 98�7?�1/l�x��7+���ְ��x�;C_�I1�\Z��� �]"�t<f@�j�x��Z?v:k�.�5G�Dh��@�C�*�+��⩔�������d���`��y��>����v�^��^�)�R"ڀ�B����N���S�]�2�=Ɵ]bR����ZAh��y
����(\��<u�o攦JX�*���|����aa������鑠4��%��ݵ�ս �HEv�e�;�!�£h���&`qP�֒�y�������j�:�sMk�ÆO���Y�dV������z�`�\�(���_��GlV%9��TY�5�tb�?�g�涪��ѯ�\QM�:�w��(]qE�<} xo��/�rw<	�B���Rl�-���y��,ff�4*�xnػbn��m�b���_�YZ��)㏦o�R��m�\c�u㶟
�I8�R�&����RZ`�L�;
*��ˏtAR[��EX�Z�V-�H�� A�2,�kX
煛)Mj��`$/c�4I�i���q6�<����eaL�!�p�^k^�IM2qĥz��E�8��z�gZ���v��ޗFۺ��ޛ����@f-�k�a;��$<;�8�d�s�^� q��w;#a�����a<�G��젷��(sj/A
��o��:��B٢w���u�Q�}`�c��`@���/��;����t��x�ae'մ�=D*�D{C��z��B���i�<��}���g�P�o7D��K傢Yee��Q��O�\[�[�Ec�5~
M�c��.]<'J3=χ�a�K�<RU�j؊�fC�j3�*�sSi0��l�.���f^��P�V{����mO=JJ��v�KM�
����܇���'c�7�x�	`B��Qm��}�{2����5)u�,{='{��o���/��*�S�k٬H�k���
[~-��=�n���,���TW��k�+���E��z��':܁�O4DY�ݝ�X���Ұ�zŔ�_��v��^����N�*�1��!篕����jb�z�V���ԍ���d�I �P��a�b)Z`�Z�!�8E��`Z!��/����?L>P�J9C��#˷v)^(O�v#��
�5���Y7�2�e|@4���7�����N͸���(�Z,I��C<Z�]`B�9���
��c�e�ݾ�i��>CM6B���Q��B���� e�>��~�7���O~�?�Nkx
������O�����yP��Lu�-�"e�A�]��WKp�p� O�"�YX�0�y�����Խ�M�[�|8Б�j�5��,F+�٘�g�ZT�
�(�7�M���4@�|�)�9B�!�y�s38]�$�*\^��cZ�^��R�6(����
N�C�٠^ڒ$i\��'+n"@�\r�d�OgJ7^�D�I�K!��^�u��z��r�Ԣ?3������Lak���y���>��J���;R�+�`�X�A:/�C����j/��`�g��^9�9���@�n#B��*���4��}��<x�7�
��w�L���]�G�|�e�绬�L��k�kP�QƤ���4{�T<\a��=Hk���4����Xn���S�m�py���B_�8�dm�lW27�f��@v��!U�
��c�RwA��g�����:�3�z��eҨK<��%A��������X�W�,�AT՘]�0y��Z/��l�M���f����Bn�
�*�powo�;Ӥ(e�'r�,3��w|-C�^��tSO��5�v'u�aٚ��t��<T3�pQsK�g,�e�8	:}��	#�2�����s�2��?^�%���	@��c-��~�V�(o�`
!}Yu�i��S7�����j ��Q���,�gI�nX�m��}�g�{蜳#�<a�d{��򎺛��B�\Ldr>^
o���x<�(������Q�k�WM�#�M2�@ސc@����[�[�1B;	�����}����6Иx6�D�ǽ�̰	<���=���gY�T� ��i�L�jD(7{�g�
���`}\6N���E�Z��6ՒH�Y��Z͸�Q�C�����W(zWs�5cP*��5΄����7�H
�1-�j�0�ܺ&C:#K�}����\_���JXo����<j��*bN�۰�(��_�e�B��bT�S��E�
[�Ҕ�:���I���'�)�R��&4�l�}I�t��LE�Te�`��κ	x&��`RN��\c��Y�d��~���p�y9���<�����R�Mk}��~�������c���@,s4�4�%�ݢa�ŏ3�ⳆK��\l�dl{��q�.�QJ3ߡ��<�t�\�P��
M��(9d���l)�U[	�pCI�]�֯�_,z����?�]�r�.3�}e�,���H������c`4�a5�,���lb8�[j�1��p��P��h��#d+�$2��3F	Hhd�%;�[(FE=HZ���R�5@?�*s}�z���D\��,��˸{�0�v�Ku,�B�N#�j��2�	I�
�[v�#���VgXi��E7�|��C��F������:r��:�
iW�D��z<�aL�6V=-t�Q���I��8�JLsh�/�PY>iGR&M	7�^V6�M�@6}`ִC�;Te\�\�=���U{��~���F/����ݳr�MTvK�d
6��ѿ��yMM��̯�_=#N�	���W�n��Ķ%k�"'����K�0A�Fp�7����.�C���2��5��r
��Dz�l�L#�YN 5�¹6[�Q��r�,�n8��T�%U"U�CV����
�A҄���9�o3������
&�N�EH�e������_�KO^���c�A����A��HY��Akg.>�'’-]���̹̾�=6��Y�1ba�0��j�K�3k&�ULyxBd�kv_z_���
<~�^�-yy	\�(B��
$�h's�4z~��ˬ1���G�V����,뵬Y�����C</�	�Ϯ���?�CQN3�rP9�Y��p�gdE�����ڬ�M�`E/!n��x�n��!�"��Z|Cݹ&���.�[���ag�&̪u�oS�������[�=7C?]�A*iQt����u����Y���/�K���;#�Zh���d[N�[0�\l!*��x��`�h{�;+:ٝ�V<Io��!*���~�C0�ĝ���x��X^�bO(\�=O��]��_
YC��7�0Of<�A�ه�-�/Xټ��!/yhI/G�/u!��:�>=9I���	g���|�W��WS��M�
8���\FJ���=u�V�&��ҜP���N����Ru�����7��ˬ�I�����~�t��|��v����+3�gh�7�p'�
�ߏҲ�Tgdf���t�����i�æ�L��g��S:r�VA��ܭ��B���K(����29n\B�.BU�*=�
P�?seU|O�5L�P�3ިU��SH�'�jr�]�/�ޑ4��ø�ʟ�B8�%2�S�Iy�MD���\O`Ymh	�F���_���o���"�~�8��g���ys��k����r\�tfNt�D)��pH���H�Y�w��U��Q�!	F|a��h�r�L�k�܆��aC�eo�
w�� 
�|Ff^ô3
1�[�Ғ����;Dr+6� ��u'�)�_��v��]aգla�.�Yb|��ӣ->Ր+
�)q����F��o�����=*O�!$�𗨈�=��y�RÄ́[n.����M�!(c��l&t�n�Z�����ɫ�ۅ�����[py�}a���T���A��OX������А�to�=T�p�Pp�;z����
^�pi�q�{���bD�V�W�UV�[$��	��#K��pp�'�8;^q����{��}���j\�`ʃr�E�h��j��������:�� ޱ�O��
9�#�l\T8�C?�B��hr5��,kd�ț'�E�钕V1]�ys�Z`,s�*�i�ڱ^��:��i��e�м�;k��L�~
��C%�����[�WϭM��G �2uVV���Q6��-��]���5Y�ˡ��j�N��ٛC8���
��m��#�B��k0���F,��5���w1,E��"�י ���lhcM�	R+r��Y
���8���m��w+̋Vك'��;����x�8�����
n�FBH�P�7L
�i��ʱ��/K*�Y0u���F���Lˆ
� <��$<Zg�E�o��qL�~萺�|�����k5H�P��o9����_���ٱ�^9��F�H�����{����T�$�����(����B�9�%�5f��d��UY��v��@�A��c����((�V��̧>U�$Q,��R�ɂ"��g+x�h���jN�uSTY���p&�n�����Z
��\����5m��}����}y6�*��8��[\�Q�e�	�#A��	!A9�����-�x�E��;bƂ��Ј�w?�m~F��"x"%����:Q ҁoF��Q�vY�*�i�hp�4�U�*/_#ސ�������<���h��gx�ߒv�7�ǒ!+)x�������%��oq��'�Iw�]5����W/�a=�_@~��y�ӎV����)��ψ'=�/4Bmb�a�JmR��}�ʹ����G�0;1�ʴ,����+���p�C0y�ⶕD�?c������ؤc����opڠu���IK~1�Q��,�lK�Pw���z#���s
x�b7�?����d��8���3��bL���7o�\���8#q���
,FVu�X�_��"�2��w�8���~Ã���({����!��O��E?q�`�ȝU�dޚ�[����H3Djx��DbQ���'//��Z�ɳVX�[Ğ�ơ�Ot��n�#Q�3�V�σ��̛k��7eӤ���0<!3�x
+U�1��?��oy���v�^<8��CJ0ޞ̒�-�[�?�z?=��:������i�0�1�~�e�L��Ȣ��Z�����S/��J���8�u[F�:nh棨g�Ҟ��an~?8�$�����|��C�XO�p	��ylϷP��"LI������Wt��(��8��u����[-��F����'�(�)23�A*^�,!I��/�n�Y����Z�\$KS���X�"�7/}��<i�,V]���VG�����/P��c՛�u`Wc�ɠ6hN�
�TK�����9k��+�3�
�;�Zްܗ;ݯ87?�oV( ŧ=��l��
�b�
�PL��`X�nYO�)-{�I�ϾHÔF\���ϖ��Jў�y7>>�����VR�"��y��D�?��2�&k.�4�&���]Ti��L\>{��0��icl�8�
�KV\]6�?��eq7����s��࿐�%g�!J#j
Q(����l�-�k���67��د\dJ'@�/7}2'���[�����7
/
‰|�u���V��jQ%�-����
ja�;���\�?��{@�o��-�JCRO�O�|�	u�wS��<8�Y*��>��"�sDt/�蒼G���g����H�x�� �6Y��)��"8!��]jC�z�ş���Ɔ��j�IV��Ɵ��Ɩ�K��yӕ��W���ﰳ���E�����z*�IcZ�2�V�
GZ��\HO�n������=�<�gRa2k�6��Ƈ��JOٝ��3���ߨ)�����!��Fz��c��'�;�4�-JK˱����"�5MSAt'A(o?��{���}P�܇�V�g�����*颊C5��#�c1�w��Fv�W����Y��JE�E��ϲ��,�6��.l���_֫��ԛ�p��_�9�Hl���6�}�
@�PO��p�'z;���cb��2��G0���`GʝjA�P�Q{t��̇�#} ��zȌy_64/��U�,��k�e�.�����	��g4׮+w����m3���g.{���+�mї��?l'�_^���k����b�Ǚ��%k���`/�e)
hj��p�x(�d��m���8���~��ć�~�L��r&�5w��4���f�x������C�Q�#W�� C�j�����e�$�r�Ⱦ]/>���{�k���	X��r&?O����!eޫ
,�9�(ڑ�C�0��/���ٰ2�4�l��l��`��@s��D�h�E��6w���S/���
(��E�����|�Y�£9�9~O-a@�8r�v�U�y��6L�΁�k%��5 �pt?�eto� C$2]���:^Lq�����
�x�v}��j#�]�;Pe�%�V���1b�էi��̓�'�3Љ���K�doe��7��^Uf�/�щn�X"�Fj�����O.��u�oU��!F��dA�@}�޾�\Ǽ����P��F�H��V0��e���)D��I�j�zc�ߋ��C0s)�:�/�(�B�
%�^�I��z��%O<�;�-H���G3�*+�X����"���{A��$��M�G��{�Pr�c�ߊ���=��X@�&!RS퓐�I��5�T�&���%CЖ�+8[Al�t޿���%�m���6��0�9�Ӂ�!<S3S���;�7ow���앆i���*�v`%!q)�ׅU�J�*�T�)!S@h������A#w�P�(�`\�])c��X�*��#P&r�ŷW]1�HL���-	��U�\_�6.JU��VuT wޕ3k�	&m�m���-�M���@�踐H�&��@�é���e��P�4Tf��4��"�ds}
��?�ܩ����Z��맵{���
Ú���GZ�<'ů<��6�1F�;�by�$�O��@���`��,*1Ug��l�PѤ�s��9ìr�Vʹ���9�T�����D&;����@��X`��Kv�0M��s��5h�w�vޑdͦM�Qz860N�/��{Q��K�.�E��п����t��1H�U��>$���v�����C.��VT��p��D�R�:S�M�Qx/�1T�$q,�Je�D]�����B��ޭ����%�d'F�=�[���L���|)(@����7���s0͖���g�P��$��=�d	�6�#T�GLyJ_�wy
��a�MuQ]�u��y������G������r�8~R�� ��kvj+K�]#[���"]��`���j
��>�w��� �F�-b~$�V�ݴt�
x�S�G#�'�9g~1��b��&�������Q@�=?��|n����Sⱖ4��z���yѠU]�t������dE��0���2��`D1G%}���f=o�,���M~��X,kC�&r�-=?!
���	�~���$A���)���k���;I�l�G�����>���IP��,�>c�	Vԯ�*0� �~8}��� ��-x�L"�RRL[�G"z�hOn1O�0��Yϰ���@�9z?�	�$�c�T�=澟{�1O<�&�O�uIv'Am�^W�Rvvۮs��H>�@�\yϕS�L�0�q��}G���۱��>>?W�a������dF1u�b���K`�S��ǩ�΅Be���ѻ��}�ؓJa�3�3�Z�����I�N���	�oG������(�[�Q��
�W"��om`�CfRFz&F��J�U�H��l�v��M�R�,�Ե�ٲ��H��x�%dg�l����*��*r1d�zAo�B,Hb@��R�'2=�6�/ߋ��JFbl;}���UG���0�l�Q��[��]��dZ�eY���8����n��lZ��]w��q��%n6�å�8�yE-
�@̆-���^�K�>!������ߋ�n���HuW���(o4�
6탴m�/��s�E	�>>�0���~�?ħ]$�� �ǹ�W���<&s�J�-5v��*��o|<��i�4c(�U̼�J�!�o.�%�N|~�z�$�wqQ�d�O#
�}�3C��h"1y� ��:J�V(�B&K���߰a�����&��7
:�9*��^�UY��a4S������~eQ�ș"����<&�[`�H𼗬[�w!,H��aPy���A|PÔ|A��!�!b���|J>s:�����=Y�. *H���V��gA���h�c�V��y���6�ڒU�r������a?PBmp|��˳c�$�8���D�����b�Y��5�Ơ�|��yD��:�8��+��q&���q57��_��8m�ml��͌ ŧh!ũi&�g�E�&�GmŨ�iƨ�F'�롿�Sؙ�黗%�7�U�7�U
7�U�����R��5�~��]AI�ko��W�z�&F���2#� �~@�|�+��G����F%(AM�VG71,�veF���g�����Ϊ~���&���y���*�(���Ə]8���=��DY8��f���gWV�SђFAk	��uQ���m�X���lF�M�
�?�q�6����0��u�ФR���p��3�e�K���n�"�x�����h����m~gv����뇀����_��_B�@-}I.�-�l��x&��R�>"|ҏ<�g��{���7��?؝|�e�\2=9!ˣ)n������a�wW=���n�z��P\�5F;��d�����L�w�t����EY���`�Q��
U}}ս��a<�p��C����PO�l(�h�D�H7�\�S��d�}lvJ<�R�P���5u����6 ʀ�QA��tء@�^2�7"]�Z���w�]h>g4��*h�<MB�s����̓]A��{l*T'>sLk�J�m[�����T�rv�X� cN���:|o���@[��[I��}�xG�}��H$��11C#��z��C�P�AD�:����Lh��np.���%�����b���.Q.�ҮR�%��Eb$��X����F���4���Ώ	�bf���c�~I�<#|��y�t�
���L��=���s��1IQt�ڎ�J;-�1��\ۮe��x�ҍ�V���ſ��R�'��a{�-ڲ��Z�$��h=�y��I2���&�����_
k����a#Bf�F�|�pr���p�/-	�Z+Sq�L�
/�d�L����	���!Ā{��&���m�����Ct�Q��LzD�rh������YA�D)	c^�
8��# ^r`WS�E�vѻci�I-��!.^W�.���]X��QtM�9��Ӷ剋�^&b���eƒ�;Mr���P��M:[z��6iJ�5Rr(����C?�6E���'���ݼ�Zkjښj�n�>�-�Ҟ}Rc�_"��~&��dId�L�������Q�&��q�,��6f晡J.ǹ�F����;���>��y��A&��ߖ�Eټ%���sZ��؏i�BS�4Mj��Og�����چ��_�(��BL�0"��[�����rl{xrEHKpg�
M��f��',O�����90;�!��Pî4��f2v���rv<9I������2�*h&����?(��fVS�>b�Ңi���.BP�Mq�QG=m��:���W�&eD}�����|(�=EH��\3��xe$>�P�=�+r�hY��0C�:�8�%~&��J���7�<��C�'��B��˹C0�5!28&�a~���t�ˢ�P4���%�P1��P�y�# ��z�v�P��wͫ���F9 b�,I�~#�x{c+�Xg���A�0�Ӂ�
l�>��A� �7L�_@�N��
�(ճ{&� �s�0�8�Y��r�L�|(H6_|8����E�(��#�	��\�TG���BP���a��}4���T�o���S�I)j�1ɥѿ��%�5a���Tym��'���_�+�+��O>}G{=ǿ"[LW\�_WF��.��f�Ӡ� n��df��^�F��t��HM����}���6�E�y
��ϱ�1җ=.�3edQٹ�a����tz7�FP�vyʐ0��W�2f��y|0)D�
S����7E���N��M3t�.e��]����G��:{���ru$�&FT�e�>5)1[ 5�<U��7\zT)QCaJ�B�p3I�Ц"(~:wa��*Q�H�����S���|Th��\�j�HU�y��\��NPj(��:�jW�+].T%W�K9`&v��.F��A�aH���k�������^�6�]�n(�>��˼��$I��s�/�р!z@J?�h��6Z�ṙ��'�,�T״��ZUZ�[K��$]����큊��"I�ː!+FH
�!�
�V}3�mUzC Y��/�}��`4A��%S_u9�ҳV�<��du��.o�+�H�%��D���D��BF��H돈�V:!�A!����0D� N1V�ꔧ��h8�;v��]�`��,Ԭ���ҲKa����:@#��������5��(w�ܪ�F
A�&�1s���A��V2�ձ�B,ŻYW�.]����k��`^��!���h����0��hT�f~�j�����֕+X�JL��[�y?FO����s�{��!i����j�X������'B��w?k����Γ���,����;=��̜��\����Vv|LK��fN�0�9
uw�C:�G�>/�A��#�ϳ]�18:�' {��H�n�Po����S�ON}�����
��݇�1ܐL	�� ;�_P�&%x߫_<[n�rc%����͌�&pQ2�KX��@�U=�3`��^b�hr�=�S���L��~�!]
'��4���iȥ�c3���q������kՊ���r�Y?ܲ��v�>��ܥ���S��� ��i���G����]���ܴ`@��O8}�@�����2��KE�Ɔ��;��C4z!�#�u��'PKQo
����
c����zJi�Q�"%]^\~�eAr?�E�9�8�:��Nyw~W�
�j�6�44r�3���!vn�u:��C�^8`�QAe��8|��\��ڜ�z!�8qJ����d�Q18��I�k�k�h*�A���neQ�g6�pu�p&g���Ln�F6[��A��g��G������"�Q1G��S�>�Jml���_��۰����е���,�B��j��X��4�4��@���݋ F���ɍ'�xWoOC�ʿsD"8��Y2�D�C��	�
�Lɓ�B�L\<�O
 3�[s,�����"W�ZDz��,4��*��1�RZ}O��YL��Ww�&�Ĺ����7�O�*���A���B�2�������Mfz|��'����!�e��Y�ib�)��ፉ�C�6�)E{�2¤a����SU�[���&�%Ii��E��M��)m�-��s=��j�WQL�fϷ�t�u�!I�a�d���w!����V��W�é���ǹ�0�̈́.\�Sz�c3{�m���v.�۪<��^#`��6�>�Ց�YUn F�.�����ε�?+����l�w���/��V��紿��L��>;R��"��QZ��a���+���	���&�%��Ŵ���v�~@�E]:
�����>O�WMM�n{��q����ߓ�����|�3��$�O	5��`�o	\�o#ܭ
p&��s\ߘS��h2Ơ�BA[a�B���^�eQ�<������]�n6O�g-�T�I����2P�/w+G/�W?�3Ԋ;4���no믙`ql.Boҿ\�vs��LR�oԿ�B�6�u��3cd2I�5jR���bT>	̵Pb|iӠu8oU_�k7W.�x�y�A�kbj�̃ؐc��`�l_7��V*X^��h�ʜk�3qh@�s_�Y��J�����}AT�b��y13㈠�W����^�T*e����(��&O�/�b8�X	�ڥx~Z5
�	ѯ*�{�B?@�4H��!G�ńj����~������h�b<F� U�k;����N�-]�DL�X��d�HaM��hOF��R*�C�Zݸ�ݾK�/�չ�fJ!/�%?��H&�-��X�	?�0�	bo��²�����(��	M�S�ݦ�~
WctWg�
C ��	��,c榨��t]D,�~�V2��]?���<�-�(�T�,1M-":q����WA��!�no���2���C�.W��=Zr^M&�1X�H��X�L"�lb�wPp�M�W�ר�r����D@��qD�;}jC���"
8�o�<�A��տ�3пi��03v\z].�k_3�Ez$���'`B��@)Q�W�o��(��b,Yԋ2�Gb��kI�0�JM�z��#������Kg%���",�,N��	^���OsM\��j�l��V}��r�P���_����P�]�s�v{�S�5��{�eP1p�ga��5�����bMo��ܛfe��z�K=Qnь�?�&K���5�6�1�$�r�fO��(�6�Qy_�qw\���61ƹ���4[�Y;�fĜ��E�Wum֐��3��̌�M�酄EF�xu�̽(��x�Wz{G`"�5 ;�>t!Yϙ �Qq��,kZ6,7���3F��ո{�Vu#��s�EL�Sj`��ic��Z�r�^�],��	�^K��	���䏑�)P��B+H5�/��~��p����<�w�%�d!テ>Zx��!�?�Q|}��[�b��2�T&([i�+�uɐCS����cK[[rI�G!�iB�)c]^�B���/o����;�7�TY,�\�^[zH#�:Ax���O9\���|�7�H��]���]	�H��5�֧ �k�u����\��O����"�2����
�c#S��ة
�&�`p���hFGh�v�PJ�*�TSXv��$쇣6gpJC1q]�3�P�Q���ey4�b�\3GJ;<v�RUԦ<J����!2H��5��ŧ�|�$�N1	�04��M��H3����)�Q�7 N�"+��QKu���W������Ęo���gY��/$l2��.��3��4�4F3
}��^���\��!�ul�z���e���i\�¦��v��θ��f�dK�9N��W?�<e��T�4�!��"������He�N�(t���%^�[w&Y��Dv��_4i�v�ݯR��f"#+�P�)�Z0iժm��
�c�L��5���k�n)<�H�3�/���z�tWJ!�ǎ���L�)�h�Y{$p1��	 e��IF芻e^2�{_O�P�μ@l�b+1��`tb:B@'[K>��o�!�I���v0O�$p$�l<�dP�||x�+m%�����~�`�N��R�V�9���+�8r��H#ܤ��O��V�t�/0��m��4�ע��S�Q2�D)�L�fސ���I![=C��җ!��:���b�0��o���Ld�?0��}i#Ou�e��8>sM�)�%�����_6��̝^C�!���n��a���I���͹Q�f�x�3<���^���a!Rt�����MF/�A,�8��q�D�@�+j����Mt�S;Ѡ,~͌��C�.7�ͻ�v�1+�M��I���d
SW0X?�,��"�K_��������#[�6���v��7�4�B�m�;��#���w�6OQ&T�a��Q���D��yO��HsU��hĝp��t�2ze�6}��z'<v�Xַ��y.�OH��|83
$q8��K���m[B��f𼄈��+�'��1�ڊ&^(j)m�[p8�&����0-��n�TR���]�)h���h�-	��G�EN,��Q6}�s����>i���=ʰYA6��<7���f�F扤!�o(A��5���z>V���>�a.��h��;����Q�_	s]������/�yS8omQ���2e���h�dd��y$Z��±��$��x��֯��Խ�Oϟ��E�05���.ۛ^Y�^���ټ���#�7��= ��_�ٮ��~�g};R���m�E�2��3<��%VNvU9���.O�}M��.I1l��)�U/Tf�J�x�S��S�i��ـ�b�>�^���n�Da�0v�l3�??Z�*:<�(ڮ����Q-�S���,E�|�Wڙ:�߉t�"m��*�$
`
t�^�׮��\�;����Ae�l�<�Y�>�>n�\'�+��=�xVd�(4A�n��������q��	��\�v�Q_�&�h�jL�.6VÇ?��jH�	�q[���v�3Ś�bb�m�
�~��s�M�B��!}�n���xx��@��x�[s����|,��0�=G!)��̗_�*"�W˖H:�֌���0�=Ǚ��eP'B��NE�XFa,�
��n�~�NC�
3'pV�W1�0�__�({�����9&��;d�3W��❄�4+v�y
���_��VC��2@z�!�s����҂�]����!b.
;G=�{�ܤ)
�|7�V��6�
lSR���uX�;��`lѐp-�k�q��p�P^A�f~S��V��BC��ha�"2?��Bv�c�uO~�(�?vaV���<�?�&���)�Ƿ���D�+dpfc::#���7+�n(ŠÚS�ι�1��m�֚�]�Ž���ő�"-����%rĥ6���fsjS<x.��c�N[lO��A��wo`��]\t[֎��G/K��〇oK43����T��Zd,u�W,�)��zd�Ma��ƅ�ׂQ�n�󯣉g���?�Pa�\����6��?7B�HA�>SI�b��K�;��K|�I߲�̀v� Z��H�/)�����+�j0��]���T��7��	�x�aEx�ƿ�#_q��
~+��C�a,��o�������g���lA�^V��r�ܺ��eC+p^3�!B�V�9�;� x�h�-��e|����$hh�*�إ��%��ٗ&ů�m�2��fr@E����:�}A,�;i23q�	p�57>鼔=	�׾�=k�!%�0�6Ԝ��x_<'bŐ��&�I�9T%Ⱥ|%BAI�`�����XC)�
�Hb@���X���t���]� ��?,�M)�h�o��c�,I����}(��E���
�
i�se�xy���~w���[j�O̷%���@�(�n�=<�xw[�u������?[9D4���[����{�~\^�<����1��E��+aQ_�;մsbLC�D/�7]AԅY�M���Iv0��P[G�i�r���E�1�����ö2�s��}����+_�?���V�8��,�ٷ˥{���� E��ơL�\�5B$
3���E_�$O
��E�gġ.���&�<5$��\K��x�򁑘�^��yGW��'�:�7�듁$��͋d!?�	�¬�M�
�<F�D�/��+�N:�A<OU�
	P�p�y|/��J����Q��U���Z��$��0��>���2�L�9�9X�����7�rɀ4<�B�����M@a��	�؇�#��w+����F�4~��F��"����mF�?�o��-W��S�YSP6Ǎ�[�?g�J�n����lY	��г��4��&Fn"�p��	_L�p����xQ��C��nF�x�����hÏoSof�sy0���^���w!<����t��(����.���^ܱ_�����n/Ѻ' ^���7��<y�P�^|�J*9�材6��&L223���.O/l�-��XN�q�fN1��b��_�:ك�ԓ:��8	�/Ź-�œ�����mtTR���n4:����܃=o.�y�����yL�YQ_�Lb9�WF�6���"%CI�N�;���)��2�7c2������.�kCyL9k��7�^�I4#_hR33�SOKR�V�US�½hkB3�I�5�~Gu��Zf��T�)/uk]���I�'^&�OK5���f9�C0�+�y��\�ȘlT]��~_{K�X[��`��X��8S���9a� WHG_�c�b�:��L���c�ke;�^-�%��
��6�vҾe QwO1~�u����+�q�><Cl�TXܞ�3jt�hBVKb�Ã����dLJBfr�jN[E�o#��,�Q�btƲ�q\�}��NS��RٜYA禶���F�WZ
�΋���^�?�TQ�����TcC�G|��i!׫����C"��ڙ��L��lahn�6�qw�c4�N�]��Q!�]t��_�j��v�E�X���”�6�NYb=��j�xXE�VC[�SK�����z3��!�*���e��1��bX_��d�n�i�7���`8�w@r^K���Kh�9�c�xZX��1�7~?�C�N�s��m]�N3��p����b����N����/�]��A�#Ŏ�s
�~�zѪ�O2����=ؖҽ�0��[��@`����~E;�̽Q��w�P
���C����=��L����45���WĶ0�Xd���$&-
U7�/�C����F��3�m{�4;��{UJ:?;X�:H��p�)�!�V�)l���̧r��4��pk5��p�+
��~=���vJ�~��UT���K����>:�Z��~ǎ29�T�_39b��f��v��by(���i�ؙ�%��T��[(�4[O��}Z�i�5^��, �
b��$ώsp_XY����cѰ�!�y�cf�	������p$��A��&A>�d�>�Ա��jv�-�?vr<�.ίrv@��I]��ѰҔ/8D��}������f<_�0�Ǯ�F�q�D������L��JjP�����
��\{�]]���puk�8�7�����±
�����n������,���%sml�AQ��H���#p=J~�6��k�$e:Lp+A�9�h�
���
�����;��m�;���gHF@u�-���͆Y�果>g�3�1��(���9��~��b��bvk�d2C�+p�9%�e{T��k�	0+<7��B�	||n�1��I��V��`�-_e����/��G�#9uҽ�z�l�A#k��E��~H��ڬ��\J��m9�=���w;XoFiy�p؈��N�M,„�h��{����w��28Ɏd{�'6�I﵉�k�
vAk��PV���c�UVw�b�g����9e��J�HJ��B9iP��~���c�?Z�}�6�L3�E!nX��Cv���&i�j�U�h�	U$PA�#4�RM���i��2zu`D�e]��� ��c���BF�WA�Z�z�=(�ͻ4rߜv����4��e�O�}��.�� ��̗���%c�s*/�H8.���Bx�v�pI��nr[)��hu1�v�K0�'gy�;���й�˾ᤤ��v�~�V����nc��pËӜ>LĬ���`��zx_S���s�-���#�^xG��"c��"U��	�S�w��(7����j�lK�&������v�U�D)���W�j�&M�
 �	R�}�d�.l���N�[R)(e}0ʡP$%Ȥ6qU���|p�8	�*ex�S4Kd����c���$�=wCXC�_�!���O?���pn�Mv�QE������ZZ�}�Z����:�V(�.�I�-��ھɟ�	�@�	L~f"�ČF^�����B�fձ�9�{+[&O����t!�9.���:�����8H�C<�v�[�m�+b���+=̃��
��c�?�ܸ&Ѽ4m�V� ��$(�ux7;���Z�^G��6�������t/F�SSb��K��	}�R������t�M�_�0�ȏN��]�0T��H�4�G�F�گ��=�VAx�,\MR�i�"�;7����6J�!_@�T� O����wY��`7
�"k�.�_�=^-)�9'�c�L�X�nֈP�����A����	8,""{d�ru[��(JY!�$��7��D���e����2,"�8���q����J<�.��<����DQ
c/�*�.3H�S5o 7m��h�4�ބϠ��cQ1�JW>�%�P�#CZ

}–G�	��i,[��[:�w�$�wH�
�U0S������5������Z��س�|•���FZ=x!�RI��̨d��<����_.�p 81D�:��3����3C*I|��ñ���T�1���m�9ì�Tǰ �}-�5�m58�U�໡k7.|�/.�=���n�g�8|�(��^�Tn}݁�`���P.���Ѡ�r���}=�~/�pÒT=�����Œ�f�e@n��o*�)Mnٿg��#.�L��}u�u�y�����(!Z�4�u��Jz"nǍo'M^�\�3p	(�74mǯ>�����B�{�ȑ{G���fc���h.�/����(�_���H^�(����лE�D�0"z��ީf��ؾ�E�4������ZM�cDiF��K��ʔ�QG�\Ċ.�wV��8Y�_�r�PPYF�HW���\���s�5��D�
a49*�J��9�:��4�@o��7�T�����99ʳ���!�r����\��Ng
ynh��Ś6�������L~�#�T��I�V�'Ul�6��VG�dL��\Gm)a��:��aa��H��`&`�Y1e�n\:�P�+K���y�|j��w����]�2���c��YCT�����DLV=�~��	Q�i�����â��P�P)�Zv��>�YĖ!cJj�6�릱W��wrjI�~�34[7�	lZjT�14����(�$/������[�+όp�{��?.:+�<����Ê�zJ�����
G-��i)
|'+��l]����
�$�c��.�i +������[ս��>?���`��p����/Y��ա��ڈ�ӦhvN���+k~+n]eT
.!�쾸z��._N��ԨFă,�h?�_��=�X�1n/͈Q4�d��Z��e�*A$wTdC�j��i�H�֜��\�"��p���YE."*9��ѴN�n
D
\� �岉.T����\ikv�!�x����a��&�4�E	�6����L�r�.?�*Y�E�r)uVk�:�E�4}���4b�P@�Jj�� �m����(�Q�P5Ɗ?� �e�$���o�%)��$�8@5�UT̓�J���˧�FZ��s��3�G� �
;9&���R�1��R��M)J %����e=G�c���v.��\��c����^$6뀙�ҭ�"'����g�QRQ&PZ��}���6�CrZ�2H�E	χ*qI#x%�)�C;e��B@Q�U�&�0�P��ǖ��&��K M��	����wW:; �[�"�*�[��s�R'�ź"�G�l��C)Y���[�rл�":*�`��ӈ�ŻV�.���BVHbI�2��c�Ý�Cf+�7x께�<&�尨�ǯY�¬��졐xm�*�U���(��Yi
�/6-��Z�6͜�:dN��C7�?���i���jP7FF,��ۻ+�QuuS^_f%Z ?�9�yw��l��Np�ˆ���~��VSQɉJ����E���o+��!�fQ��읢ݹ�]�l��mj��>@/PK9X�Zâ�Uʖ�PM:���,~�&*'3��4*l.H�b1H�`w�z/|�`r�0��~�a
���v����Oqtu�O�ˋ�2L�/���O�����'L�G�Þ8�n[d�A󢼩�1�X�9�t8���� ��;�SJ(Y؈j��5F�ψ�=��g�X��9�]��I)YE7�����E\��w��HH;���&8Z-Z]]�Nd�{O[-��j��ʮx:��
��5���T.��i<����4��X�x����IQ�WM���A�5�/5@�?�/������9�&�<��z%Ů�k|�,e��'9_�42�t�ˬ�G����]$�;��3k.� �eXcީ�N�iU��B�Z�ǼB)3Gl����mau;[�8h@�X3�x%��`��뾅�� %�~��p��
��W'��6���B���0ă=�pg ϊO֭)�����"Pv��2�_��T���(#�d_Y��:�v��U죍�c���
Ȼ�!�� x��Rp=Cx��PC9���#=���9������<�
�7���j(�W.��F8�nj��-�����n��n\7J���tc�)N���\�����KNȳ8#Z��µ�����o	&v�r��Ȇ1��jqWzI���� ����*[��h��M�>�}>i����\��U��-� ����b�5gp��"
&8�
�2w:q��Ak�tzL������fj�X��~5G�jO�Qx���w�S���v����-�TM�y Irx�^�a��e���ޢ�*g
P�c��a�C�u��"U>Ha���P�?mƦ�Ŷ�
�K�#*P-���1���*v�o@�
�jV�B:�d+���V���#��F�_weWa�o��Y���\M��<�F�r�8D�����s�oZ?�
d����f7c8�2��F��Rr�?AshI��?�D����Hm�EH�f�G^]��-��1�q�����
Q}P�x�ql=T
����1��Wݩ�a
~k�]�'���c-pK]
i��X�"����ak-z�������"��#E~?�\�p�IÇ�%oղ2:���.��������)���e��҈yF�K^5Z,"����=�m?��Uj�e��g8|�-��`}!5-�����!]7C�TG�Ā��f�����B��y�ɲ~�`:��iV�OSжR�;d��{wS���X�Q�y�\r�n�B���A4����՚��`�D�c/әW���Ln�ܶ󷢭��f#bj����W��թUM&p)���7N���pO�{�ra>���H�[��,�-^D��6�u�u���N����;�=�
��D�ҡ@�a���^��	ս�Fٺ�ڊ�/��7�����-AX��M�N~��R=�G��H���e�0��,l���”�Ŷ����*Jk �'�ioM��B�2y�C-�vn~LZ�����I�׷�嶎�r���́�s�5;�8��6�CG��y'�+�`����B��M�>pe�cVF7މ���Gmѩ����	�_+F�O>J|�(	-"@֐��[w���'DC������4D���zM5Vf���ԙ!en��(��&)c�Ն�G.#����X���)����>N*��*ܱA2�פ7X���<[��6�H��$k��c	���Ù$-���Z7Yag�7�i�M-h�7�\ױ]�����FJ����E�?�ך'����k,���|@����7L�V��f7�"���$����
�	"���@��ȱ�B�J1�*�R�R�v���piR`�+����t+���5./ W?""1�A~�04�%}��Xpn�<�̻���ے/6i�h-�&��6����`���G��J��:i�4�U��'���-iGl�;A5;VF��I~����<x�8v�o|݊	]}O
}7S�P�'Y��ͮ�ޥp�T�t�i����ZeD�C�
Q"Q��� ��c�kA�WO�Є������W��
�D�+�
��h��2Eד�� �챉��&onJ`o�&��{�+}�)��^��*Eo�f�z95%�s��bhY:*��h���P�_�(Ry_b^)g�o���.�����j�t�L�
�j$(������C�}�!fNc����MANu�
P���	�R����c9��%���
!y&-��u�ju���-������FH+���SE�����/�p�:jp�����?}l�/�/��&��l��ؒ7r�����PԂ�p\������fcf����M���
 �\+-;
�Z~���݆�H���#I���nؤA,�u��\ģ>ي}zBRք9��5ЩQW-.Й��䬖�7�m8��,��h����Q��B< �+p	u��/�-��_N(�E��8R����I�r�Ӆ�5F��H�[ѭ`��[�}�8���G����Ȝ�mg�~��!�1��	�Q�
�WЈ�r�N�,Ɛ	�Ɲ�����IѺ�V�{�|���P�Ɯ���z��#U���f�7��憀P�t��B�2�畷����UDw�U����cR�-CW��I���[�rtv(�qk4p�3�k�oS2x9�(�s��˕#�H�K۲�2���O���3
�,Q��4���R�t���KE�Ԗm5��U��9����'5O1���B�"9�j�B��mi�Ni�f&{�6q�d�@��3�c3�'��-�9�o�1�&��s�QC3�">nL�i�=�O����� ���Qh���Y�
���Tx�62Np�����G6�v�1�	I8�ֹ��u߾����c/�x�rg���SN+z�\W~d��5�d����?6�8�F2}�uaK�
��h2��Me}Y-OѯN}�TU���I��]Gk�c
ӯ��~���/��~���H2[l����6��O�o�{b$�u���)� �U[U�v�P�o���Q���l*��lH�yUm�Œ��^���U��u@b~	18��
r��m֨���&��zM
s-9V�r�C؈���R\ &����x���ы����O!?�����_q�r��_�)��[�+�2�+9t�^c~��@�{�sp��i*�kx~������h�?[m���
�l����� o4%�w[��\F�keVdH-%A���d`����I|:='h�t����̕�J�~1q��z|��`�z��6^t����\Ub�V!�0=�U�I��=�����RL�WO/٣	A`[)�wFoS�^ɁjzG`�Tk:qhܝ�=�j�Ro��2*B��/���GeUl�znE����5u��*Hp��>HHA��C��"J@t��j�LC<`ۀ��@�J��2u�(ZPF�;'�c��I8	����L\�������İ�~*'��}c{
�n!�,�:tdj�I��^+�iߝ�����٩��j��KB�_{ZvA��,����5
��E�#��
j�H\ pw1��VS���3��(NՔYC�^�r�
WYg��h���jU�`��p�T4��EF8	��H$ȢUx��8p�t��`Xp�O�oO�y�&��u��a}{��$����X�^���)�&�H����i
F?|��\vn�wh�3��j�@�^�����.��H�9��ɤ��H���D%�G���2-�!8�J5~����a-�r?1]�)P��"�S�����a�Br��\͠������}��º0��K,=�:q������"�4���	~[�`��q�Z�Q�Ӈ\Z�ч;ط�d���$�K�b��資�0�|_�!��U��_O��#_�����It�})It�X*k���DGq-I�=Î��\t�/O����U���C1����Q�X�7�n�J�=h\�6ۊ1�\:킞�镪�l�Z�C���ԋ�1ì����4�����g��̗���[s���g_���r��\b�ƫ鈊D#s�s�=s�)����
 ��0(�����$]�2O��T��3ZӬ�F�F3������e�lRq$�rە������6[Մk�ٷ���7�[=w��)�ck& ̜��ւڐO
N	�����&\�m��OK��oL�pbv�M~���]�K�Y�o��Iq,���{�*/m���8R�d[V�x�E
�6�R�#�?U0>\M	�A��J��
��f�֝��Q�/q,>~�]����{=v��Yi�;TL�.?[bm��_߁9,ॹ_w�ޢJ�P�`6��ѡ���J���c ��Y�򗩣-<O;\(R�1b�dCq�3�2�xrw$���_͠�5��'PlP��Jq�0�U؄Vi�\�\��̄�)����V�-���^�E�8.�OPe s��>��X�L����V!c�$���h��oEa� �����o�h�����G%п�Mp��I�h����{�6����m�8�b�V2�̊N�=�	��}P�o�6O!t�Wm�L=�eR#1)�{�ב6�.�S7�B�X[k[�Bו�/ww����|^�*OcK
C�f�Z����>�Qj��e%(嘿ԏ%m,�F��1�ɲ�42�����v�7ɒ
�~l>�0�A���C��2�P�2�-�H-�C���*5����A�{IM1�05w1�Σ�_ŷl��'���1Bqs�u�5�!п_*s�E?��t<ÓOV�h�~@;���'㇅����\�c�L�c�syh�
�Z���#RK�Ӫ�e
�K���߮�<@��‘��N�oA='�.c������	<��Y�l�yh0n,C_��b�%D|�)�W�3����f�
�G�W�;
�!�D������X!�`���,��!��ك���;�;#vW��a��~.yE�@[�`��K�����wI=���&4ڇP��-�ٓ��5��)���(�)�A��(�4B�=�f��Gf��Z(R|P����f�L.�l(�h�|��h1�o��N��it�-E���G�<��Ԟ��rG����?��Շ�ߙ<�?e�����p�����A���R��B�i�¥��&�	P��m��+��34��ц���x��hnզr>O��\q��
؇��V�`V�{�Ԇ]m@;�2V���)W���4���Kv�L���7^�k��]��G� �ֱzZ�R}��%�x�!R6XX��V�<��AV�ݺ��$"2�Ыh���5��+95����]ҩ��b}�Y�H,���G/`��_��1�#s����ǶkӲ��#i�R�|� {�h@(��Ṷ3t��|���>c��8Mcu�Uw�.=�Ǚ`?1f$�}KΖ�^��^�/^׉�7�������?Ik��q����p�9	Mg��#�w���XM:�;���{s�rA�]ES%�~��^<��t��	�c
�r�w"�H��rE���X�/�q��7V����,͡M�	�vV�mds�񁡢`����-{�;~�'�c��1�kWڱ1��OwfI��[&�[����!/2���?�ǣ���ǟ��:���8�굖��u�h��}x�Ñ�d�&R��h�-Ru��5O�*ڕ`-.�ϛEN�[Vs�MM��iL��]��<�AM�Ψ���~^6�[X��解_\ol>�6�r9�������,��v`��f����=�7�}���P��a.����⮙lw��� �7C��6(P6��[�6�
��{خ�/����F��g�W���������������y
��]�K��"N�qD�/�y��#M��4й	��y*�	�Б�
ꭴ֚4vK��e*~c��4O��?B�/�ɒRWb��t6��\L�a�]�.Q0g2�pg�2�D��a�+q�ڃ�eT��ߪ�Ĕ��͚��Zœ(}0db}�THl&��o�8�X"�a�4�!Z�1Ϲ�y���.I�L ����xA�����eZ�*6�z_Uj���`��=��эS<1T�~Z/����ud�>��پ������G�I=)3��f�U=u�H}���]{�Ҝ��yA�<��F#�<^dl����tZ���䚹�r�H�"
�IA[�h���}��u&K%�W�i)��1[m�X;e�i��^{Kc\߈�q��`������M4$B����Y֏ �qǐ�	#?qf�s�0�"��{=���ee�e�v��FW��p	��;*T�)��ۼ�
�R{��c��m�$��KUB����v��x�}Ä	F��D��Z'R�K3�ynZ4�>�og�	@g�� ���Mٻgy{�2��m�%Š�-�Pў��Wrg�=1FY�b���G�J�+��Fը��F� A�K(=5.R ���V���i���u������!2�+&�V��刋��қ-<�W�4�`A�v��4�q�;!Z���04�kz��*���D�����.��*㠚H��HD��lë���"�:1>��]Ŀ�f͕�%l�Ëf�V��!�"{��10�V�U�a�����	��ݧ\`[ֹG��ȩ�x�p�Q���T腼%�٣��kF��N����E�����l�U��1��A���U�����F��莽���&���Ž%
JA��A���>k�:
��Óa����:xXp��9��6S�J�|�\CwN������q��׽g��Y��K��5�l��8��"�U��%z7)�Р�֡
%e��n]�Hp%�`4:p^F��j#k��1��%�4�73a���8֦��R\�M���vC4�ݱ���Jyt���%���^�H#���ܕ&:��lC��D���Eݽ��Fk���A�z9��^�j۷�65���y�C�JS�8�tR.U@c�[6���(�WOW)x��'Z��J3�\JUS�v���*�4Jr@ˬ�3(�aW�$T,���r
�u�\��WH���Yhh8�a
1�u�]$�M9G��L^IPB�~�S��a��7�/�6N۲>�3FSٟyE�
�ZK��Ȱ!�$	���E��Gq��mb9�ʣk��u�<`�����GGxwTh�o�����I�4"���k=p�ym�!��!�s������+�U��1�PV����܄��f@��uf�~prG�0�k�*Hı�^+��֛V�\�_�GT�ō��9����'�R_��r��Nw��!�9�!�R�uݽΙ�*)���4-P�ߐl��a���Q��F�0��1����r��$~�D�C��V6���i�%��0���M�4�L[x�Fe��N��%V��\3�׻��6�h)+_`K`��k�5"�
X�����X�7�
G��t���(L�'Yq<�^�
��@��sB1D`Q�+b{,�Ի�}�m;G�X"��$���0`�pÕC@ t�t�s��\ٚWyxDt�1D5��l��·�X�b�=��-����o2�؝�;��m���^�Þ}�n�p3�A���7@�M���U\U���bTٱ�Nn<G뻜�����Mq�˟j��ht�W���qG�s\vR&%��V�?=~>Z���u(!i�>�ڦН�1����H�I�}��7|��?t���Y�os�/�?�\���P���6��[�ƒo������n�����1�vת
���XG&afN&��M䗇l=���xE:'}���
	�!����-�KI$���0��p�U�Ӣ�a<���a[��W
x�F�JA6Qdl*$PQ\8Ȩ�Ql/A��vFYˤ�,�`�:�1�_�9���-oZ���u���gh�)!
�����L�f
V�&��O#Z������Җ���ۭ��!,����=����8�-��(�޷�;��}'I�]=��SՃ���������^��>��C���6�xp��:|r��0g��IS�3?L���Z(�^C1I'��^o�G�`?A�O�0�]����_Fg�C�q�"����&��-� �
ޮJ��ȹ�4O_y#L� 8N�̮��61�j�*΋��\,߰c��(;G�zۧ(6JL"t��$�;�0��q����i��	5�
d�^-��\���e�.�V�E~y\��Zȶ3�D��(]�Z�E��$?�Q#*��/���I��2=G����-vM��cZ�g�)�����,�#(�� P��Y�l����'�4�ժg�	�=�rN�+��K���5Q��eL�!3�}oHk��rS�0�u��m�Y�F�M�ʄu�Q��ИU��S��{����u�RT��~�K���0a��C�ٌ�J�ٝ^����1�
1�l��o���.E<�} �g������)��"���z���y����P-,)e_H��h	�m�h��x�cU+(�7����7�ŦR@Z�����ԇ��������c;�x�;j%h���ܧS.c��v袠w�#f.]QN\�]���K ���ɦy��V�g�d֏e߆4H��4��
X�^��6S4��,�@TU���*�a��'I��N�إ�� w�+�*�|��'au}J ��������0�	����\�����A�*�g�j
C�Jvhk+
n���S���]39_��S�L� �n�~��z�]a���/���s�h��J׷qR�㬟���s���ͥ�F~Ww^��֩�{+�w��=V`�ܗf�rC�HN	t=t�(H�yirQ��*�X�՞�����7����2��$h�ڦ�P*�U5j�����7�$���0��K@���aY�ueƩ��Q5�P��[0�,�UN�̎��3�+�ـ�.D��m�o4��򙠉�?+����؅��b�b���P#
���
��Fi
�C��}|��T�v��(�Ъ��
�2��Ŗ$|if:���X�ptz��^"�E=a��$M���b3(�6�4)��c�Ffx���`��m�X�K]�E�Df�N���b8%�~�����>��c�Y���н�e?�o���,]�e��M�-�6/Q��B>�P���^��Bc����4�.��$�.^�;\g�owf�&���޺��e��3��0V��>�P���n���E�F�&y`�jxP
8��|��1�[s՞q�J]��鰗�u݄9Ň�~9��j<�e�۠��*�m��vᏚi�7���N ��z�a����|��i���X�`��gp�P\�٢d���q��s�&b}K�Zr���9��ju����ι�f�[�y�PP�ܾ���������v�ʳ_���d�/��L��8A��,ߚ%�x�r!U����Aq�T1�'�ݞw���
{��	�@�0�G��s�*���P��fӜ �t�
��V���rh��Q��BEH���J'GJ�$f���Q�Z��a��o&{R�iu�H�x�ͬB�Նo2�4v�D���C�7�&,j���W#�g�'J�#���4�0cnZ��W�w��a���	��a������V�hIN�E�5p�d4M��lN�RS��H�R'�1��x[�@Dퟐ�粈g�^���#h$���?���h�˂���x$���_���xO
����	h$�����杖ϞAآ��Gط�.�d>�<d�*��y�<%����T��q�9��(;�'��?�Oͼ���~����Y�o�D1b?��T<�Lh�qI����53} X�w���\�_���<Z*�4T0��>���h�����0�V�ʨ�g�L}��l2�8R{[k�dN��;�����FA��
o�0���RR2_�O>}>�L}����	��>1����Gtk��
����I�o%����ޘ�B38�R2���SfK:���In�5��U䐎�����qn��=��m�4���Fe�$��h	�1��i��t�ަ��i����y���BU�l��q�n�el�c>�AѬ���J� 7��5[qy��z��@���f�xOa�8J�P���87%Y�(�ǂ��O���м�P75h\�wv^V�j���I���K���E�
�P�g��I�~;��@J9�h�32�ui��lZ��-������/��TV��R�������1�Lp�L����u��X3��})���#�y'2�s�����,�֩��w8�8 �,��y��T�� ���Uk �	\��H��ij�NՑ���g�p���X�|�:6����a��.�Dw3"��,�%��!�z�!���������[�{�K�V@Tj���mUz��(S���!���9�
�6�)}�*���ݢ����p�5�a�C��?�������?Z�74$����tĢ;	��(�nq5��!��^�������ܧˢ��ߙNc�����1����HqC�ǢB���u-����Z��j�d4�`7���k}��m��xG}��
	��	&���钼��~a�N&�}A���,k< �j�}�*H6-`�?�rg��U�]�>�X{Xk�gMt���m۶m۶m۶m۶m���33�f���s��Z�[��7���z����b绅]WxA#E�S������#-x-jRի�Y��.).&���<���@�Ï�;"�A�±��_�l�8A@p[%���膊N���4d1Q���b<N+t�%�^~bN2���O�C�-�[��Az�D$�g��2�ʕ��E牠�4�\�k�kU>ũR���	��E>�`y"D`m�]{�&��XwN?JQv�m�f�P�'SL�[(�	���<6l�č�<Y*��H_o��/�j"n%��Z7�Q3l��\B8�
DAN�.d�ϴ�������K��:7lB{r����[g�,d�Sw�7�h��G�*>�qw�@�3W��h�s�H���8i�E��=�l(<��r
�Y6i���ۧoMX�1�Fn���y�~�s�����'���@M�%Zɏ�LZ�9? �jZ���K^����cl}�[��M��q�A��ZH�<$�\$�
+��qTTz��-v�mS����;A	��w�P�r:�z�#�%�o�gX�ȶ\�Td
�u���!q2~�Oa����4��H����Ѝ��=�����̲o�����
yZq���S�=�;��,��I���`~XdS|�7CՇ|A
f��l�(6F�`_.^Y�(�=m[�^�D�"�sUat8?��*A\�?i8d�~(ʚcT��p<.�ϑ��}3�q�9����/�G��k��'&������
�DI�NbW���b-K��n��Ʒ_�OgB��4W���ة�_N7\�T�!�W?��
K�f�2?o�0������4��h��bD0>"��j�I*��l��*ic���0�A�n�7!Ke^c
n��)ڪ�	��uwg�ݓ{�jݿ���Xb�yV��I���k�^���#
QpqR��Ƃ3+Z�29?�y&>b�?�.	��}F$�P,�è�^w�5���lj�? �Q�SA��䠺'W���;���'�������b����H�FK��O�A�q�/"�� 
�#U�N�uC�1�Q,�gx1���u��3����e�B�6*���;�.2��
��uu�������3L1;�V�(L��+�M��T��3��"���"�����T��
�Xр���2���iN��'ʇΧ��ŷ㠃o�M�(ȓ֖�z�c�5�K�3OP�����F���CgE�V/�C��e����0V"1�7�UصQ��M@�RI�vOhh�L<uaD��l�F��p�W"'�����Vej�g��T[*q�0�`X�tX�g�r.�@Ot$��2������ϙ���L(�А�R n2������n�����VN����e�/����Mɡ�HQ�74���m5^�Q�gV���=r9�����&7=@`�q��?tѰ�_�-���a�Ě�&D�ƷrC���+���*�P�/�hP"�Q�2)j�)��٭Z9����G�h�OEͺ��&0Ċ�#끿
A+8uEW݄��Δ�ނ��k��B��Q�-�L��Z�T�E�PF���w9ŗ�!3�G����6��l��Ta���H��P�pE�T���G����p�V��Y+;	��Ԫ�#��a�����
�q�x}���C�8j�`IcAt�;_?�9�(4hu�g˻ݷ�C��|jw)�[�K�a�r��e��ZCx��={�0'�L�n��f`jk�9�8����Ȅr.�d��e���i�Q(���y�0ݥ�������5�z��2�ݷw��_SP��j�Z�,{�,�G��'���Å���
�W�K�S_�5,@p^/5���-Ӭ�pk\�5�e��@g�5��~�(E��%h����	��)Kj�&���Acy�����GK0J�'�j���O>��hx��L,�Ⱦh�@���M�6��~a��.���G�(���/��D���3�r�0ީ,��F�������*+bҔ��7�U��<��8���h�� �,8�!�#�8H�\8P��hػ�B^{�'��$�%`)�w)�h��w���������W�*{�4O�Y��	i)0��[	�@S
���m�
��~�3�ϻ��|q� #~/Q֧ɲ[�q�
0	��ɥ�/��?��?=���}x2�I�"ㅈi�֭�����,F,�8��MP��54=z�<z�5=�U*�.D��-?�B0�w�=fX��W�C�dMz.�o�g?�mn��i�:�d���l�t�(d���Kg�"Ա����xe�둉}ܶ��dz"J�@0��Ô������M���b�g*ߺBh����sl��T�Q��J�b"h��
�'9h�(��+"j���k-�BBl/�Pz��91z*��o�c[u��wOW`����8yOFe����gA2`�r��Φaxͳ�FYc9j��4iBzLS�
�3B'c4�\�^���>���H@l�\�<��2Z�-7���t�U��xѕ
�I��:��g�g�t�@M%����9!��BR;��N��p� �oE�-�"L��T�P�C0�ob��M�K���m~��� z���6Td9�I|�;��q�U�w�7&��b�ڤ�^L�;�
c@���wN�L	�����Ɋ���2PY'�u����X�	�J�ˊz�\za3Y}0�����DR:]�Ϯ/�?'���
Ż�!C㘍&�'�A����p�vB6]ϡ&���Ki�0���a�
a�N
5�ܵ�y��O��SD���̔	(t%Z�� �+�6ERg!�n�����8[Ǚ�-�e�ǟan������F���(T���w���ԁ"�O�$�O�.z�@!�O,/�U
!��P������6Pz���OR��	t��-:��է�?�%�b<���H5�#b��<i��(��$�Έ����*b;���6[a/Ȅ�uµpz���5A��:%����}��[��^�!��oǐ���2�^�[��3�m��%p4�Z_&5)����Ce ����z1��z�D��Z��}i�۽�v翪 ,BH?�o�����\-�6�V�ڣ*KI��.^�/6Z��s��Iǥ��iQ՟�5A��q��#��	�9V�	j���ZRߍ�b�� ��"\$uԜKyA#����oK�35�t��g�QR3
������r�]6MN=׎�z�����!��*L�>��ʏ�xj�������e���ӡ�c>2I��,W���yH�gb[*i��(j˩�a����Sĭ��7���"�����kc��)��F��dE�����V:�5U��-GŖ�F�*�@n��"+�.�T��	��x�%uT�z�̿�,��SM�U2���N�q�g�s����x/Q+��N�rܭ
e�|�d!��<��q�q�A?N�Ɵ���l�-�������J[Rh�ڰ��&�&�^%�����4��d8R�lYx��5�,m����/��m�1z�uԘ�"����ʫ�>˘���x�V��P繚��R/�*��jZ��{�k4h�Kr-d�g����%<+����:�h~{�+	#�2%v�t�>2��ڻ�����梙�9�I9>�V�ʼ�.��<h�R��
9
�ꝡ��D,y�C�U0<��b��؂��0�����G��)��{)�fc�:M�3KX��2E~rj�&�̴�F�:[�
�5w�l�'�Jǁ�6IV��7e�5g�o(b����S�̽B\h�/�X�7��@(��QQ��۲Ϧ�<7�dk��B�ڲ�^�Y�����j�ة]K\���J�+I��:)���o��|�K�In#��֯��o _��3_�RoH��5�	���������ə
�"��2�|#�rH+h��fǤ&�2���p�����c���k%[djY�BI�t���%㋘�B���%V/~�������Z��O�8z�:haS�2�1�f�5�=�|i�L՘���@3�
���^���#����t�gm��#%�pJi+T;�a��=��^�&	�6�:L��uf��1�5��X&U�����a�`o OaڸQ�D�i���\�ғ4:�9��Ct�q����AFD	(��p��\����"pO�V���3����f�#���f�����pUcm��aW����?Ŝ
�zSS�����y˝[��[E?{�U'�|�vd�"6J�>O��0�]�is~��ˍ5XC�V��磢�ґk��a{�>��v��Q�<L޺��4�+^`�x�
mrT�ȓ.��R��B=���+��hdB�lI�EZ�e��"s��i�C�U��
$ru�Fdj.$�u��t�ͥ
��t�kW�q[�h36 �߇�1R�2�1:���#dU;�� ���ޤ?7�ř��s��/(����zM`!�`�`���S�J�:oQK�%G_���_�Ŕh���5��*'�
D�,!��;�v�Mm�b\.;}X�I/�{x4\�Q��)H��ڏx���_��k/�+�Q�<�
Ӽ����/��0���Ϡ?����������fe�7XPU:�� (bS����#_)'����Q������By\����J~�8,Ppe�ܤ�3������B+ݗ�Dc�\�-����5�%��v����щ��=O{s��&�2p�fٞ&�s�
:���s4h�OY�ƙ�:��N��@.%0�3�!��r��t�a��ug���L
�*����U��p�Ho-�6.���K:	k�/��j���.TB%��z:�йS]��ˏ��Y�Ԗ�v���}\^�����i���7�ۉ�=f�+�7A�pl�p�h�犒1�B��6�yk�k�����
ɇ���}��@I(�t[wN�7A�����ȷɒ�쵱C��y��Po~ws�]��5�֍y�Re" /�?�[[5^a��>����:W0�ev����8�P��IIQ*�/O�%P?P����u�R6P].Ty�[�L�w��W�P*���ڽb�t��`��2⪙`Qc�d}���2�d�����-n3�_9�S�b��H�����}��o���q�6At��v��W�u=������	��\mA�;-PR�_�rm�Q�x���G]Χ��G���4̔:�%�aHz}n����r�U�[��s\Qi����,B(�m,�+�򊢺ߛ��%������@�F��!{X��s�3�љ�f��{��T�-������38�_?��^r�ZQߝ yr߬��o�+k�I�+��y���)K5j��	� ���P���+���o���k6�4�0��t��p">��3_���Y�������k�@�Ҙ��nb��t�7��	͛u�|?�3�[+D�%��d$�jSLs��R�K'��@��J�TY��>�5YM���x�.�}8�48ޓ�
/k�:=�'7�ȆDUd7�lй��9��,!$=�|Dk�n�������y�����3s��*���v��~H�����oe���@��G�K�%@��"�B
�vMR��׮j��dy�"Sx�^�|���y����^�;K?/m=:<Ozy}��Qh��@R#�hh&��k�农�|������M��?0�y�P��K�����4�cDS,��[G��V��8����)�3���c�>�=�,�B�e�j�wa�˨��+�o��}��jZ�S3�!�T(T	F;��tv@�4Ӗ��4��ҍw��D,�O@wZF�[�	Dz���hİ=�8���s�e;�/����K�?A-	�TZ��6OMѶ5A���V`s�?Nh��O���\�# Y�,1�\��7yX�	0?س�g\�P��7�v�S�5�=���׌`����½(tD2EQGVh��ӾnW�Ge�~gX��$���~S��#h����B�>4h���Uk������Qq[������*�*)�o)�P�=7_	ϫ[��]A�a���
�U��U���j���C2wU�$ڤ�3���W�B�	�4����Qn���M�c��C�B�-��i���f–}v�0`]k�:џ�s��=�/p.���G�t�G��h~���t���eI|<����G�"�������%�����\pd��E��AA��`��9Dg�I��~�����£��Bθ
�a�k����sB"�@��d��wX�J�)١bX��gz���I��d���N��%��@Z.�X�>��U�M�W1$ojU��%���9t�@#��K	�g�8h7h	gfw>Ǯ�y����i�Do��q(1-7d�Wdi�Ј�t���x�e�F��Kv�X���&����n�O7O�W����"��J���&��e	�>�p|�>b�r
�r������uTފ^�} 0^HzKMo>����u��믏�CR��[������P��ߘ;m�r���R��J]34�ͨ�z�Z�gK�����/�
Ը�SE�`T���@C���?�P��I	Oͭ-iq'
�Yu�΄�}{'G�|��=�@ŴaL��'Ӯ��'��
U*�w&q�
��2T�}s��y���.Q3
?��µ�8s�
������C~���k��u=�L{ZfX`���p�r�5�1%G&��
�H��]���'���@��]w�������uB�*2�
�_ �(���tZy�
"'$�g?�X�:'C��Ikq[�1j�k"e���T�7ސ̐̐M��j���Yp�l���pb��Ƀx�)P��%q
.z�S~�H���=���S���*ٖ�˩Ƈ��~٦��Ch��^w���G�mٖӹ=v�J/� ̊9�F�AI4_���O�m�i����:��5��߉�����p>��j
UabK�!Eq�x��eK�ix(�֬��UV.��r��;?	>��wM\��|�J�읙|E|�qW�S]�3Y쌝��ߣ�3���[����S����i��N�#�i�47�m�$�Fco|W�d"��r�W"�WȜ�@�wr"�&�$}6�nD��3��tm��ʛ',��l��)*�R�
����ʚNԏ%���v[q���[GSWN1�.���%�6�WI�J�����œƟh��#�g�}Պ�+!��L��"�6\�b�
�I����ߎ�Q�Н���[��������e����uh.(L0��eÕ%�Q�)t��!j3�X��L����t���R�W$
%�2�P-�c�-�*�6�#ʢ،څI����G<���6�LՐ�,:�����J|����LZ��5�HD���U&�Y3�m�4�Ex)h0��gs�|!ܴ�p��'�|�(�̅C������H�)�q�V�늈�-m�0ٳw(�^��YY��arwgY�!-�C����I;#]�
��7�(��	b�@-�}�X�N�x��|�
��h3�~�2�;��L�
��	�#<-�y�'T��P�gf�e����߾�%@"��=-��č�I�j���Ub�e��o�#l�D��y�h&��e��w��py`�Q1y�	}2���,V�J� ��)�!~�l$�Ѥ��򘮉LR?�?��R�ȸ�u|�dv�D��b��`j�d��~��Q��U�2,^dn��>D�[�d^!}�b�[E-���r���C�UN�hn�C��5�;�W�mi�,�f��.�A�{�U�u*R1Cpd�/Uj�\3M�oh&&��/�\�+&yB�EX͹Ī��W���9��.�*C{Ij;
�V��,y���'��9R*Ō���a��\=�,4�3 �U��_]o�h?K?��d�l��R��o��4U��1� �.5��	�4���_�J+<�� ��.�ڜG�\+kF����xZ�;cKˆ�ſ׌ S,Z�/=�ph�u�O�^$9*Y~�q�u��
��sF��l�%�����Ȳ�������2Y��Ă��
���2M{x�g�_�������{Q��`?y�E�qi�e��
�©�|2q�;u�=�
	Ȫ��.v9��#B'2�7����Y���p�%5��<�I������ܴ#�J��0
#��jD���,
�s'H��X��Qȡd�U�NC+�>��)�-c�u�qJ�l�ˇC�giOΟ�0v��`�C��&�CBƈ��7�tC5�m2l��w�X��V�g����1u6����w��]��7]AG�\5;�l�!�����π@�1}~|���|�a�{��q*� ��"D�B�\ۅv��#8�3A��wJ�q�j��*���J/A��s}�1�	���w��[;�r����!��yR��d�vo�����vFB��{�o��#�c�c�_�vX�����
o�=,"��աK+���]D�7~��G_��\�
��\�k�P��—W�9%Z�jc^�r���1����7_\�1��_"�,g!�eV}_Y���H�<����^������,��`N�_��M�]�I�`\{4���Vq P����I ���O�
!��g�8��Nܠ>Q=�������Y��2	5��
=��p����?*��Ϥ
�ojs�7�2uз3�A��~�:��c�
�΂�5�T�xq)�
����N�9"�5���]�N�N��3%_ܱ��˚k��8�D�3zh�,N+�7U��K�	W*Y!��ٽ�'F��0��s4��9p�!�O�1L�O���M�݄��Ft��s��
5��ڎ t2ʮ$V�Ȩ�d�R�)�y�7�U��w+OT��ԟ
���BS�8�6nzx�>�&�:�>6ėb*�)�T����1�#�k��_
�2]ԩ���'�@�G����?�27�l�^Z� ��Ɠ]��a��t��R����B������c`jen�/kY���/!	�?�be's��Qm�Y�ZS·b�Nc�`�"E/ZC��z�Ei�	Nci����uk[��� un���7i�h����6���q�����*��ѻ8G�k����Ǣ�����u��l�Q8�$�Y�gƱt+�ʵH[�bt~l�8���ڥ�%�t������(
oe���!��.�`�%\���`����d�QYҴ������:w_ƼS�9X�.Kd��;`�����s��z��
��}��~4���h/u�0�Z)5<g#�*��݄�k�%��q�j�`	I��d�<Iڷ��е���I�UE�$̦:����2���T�N�
��f���`�^(�R�O��@Y�a�Z����Is��]v�F��y����V?>��7�!_M\M	�|ō��H�:8�^��e�=�EH8�v�]�62��M@4���uit�m���Wo��aC�� Z�	Qc
+�̟�!�^8n�o+G&��J��B-���⬋\1���,B�H1P�~��F([�MM[�(���պ
�����C�>H�?YP4v���OҸyT2�Tfi�{�K����G���?	�fqa��]To���>�"�Bj�_�h0b���o3�՚;vX2�ˉ�s�-b��pr������{�&%h�Ȑa�g��8�ǥq��m�Jk:O�$�.���q���V���W7u��k�Ct�G&�Q	eO���kϘvߒE��N�ed�j�sM=G�
͛����&�k<"��f3���h]���v��Y�%]��4�Nsf��l ��,�n�FTJn�E�}���cAP��CY�kRW����x����g�C����'�[�q��� n�"a�!�'	Dϖl\�x$T��(�2	f�;��I띪��n۸�Q��Eêq0#X�Km�H���	�jeq6�R.���;s	8x3����e��W��7��?p<����,��c�=>�`p[YR�����I�dD�O��†_�i� �E�L�F�
>8A6.͗z9LZ��^������2�Xeql�βb$ݜ7<Y�A�"]�e7R���9���?Z!�?�H��0�7V���J��r�U��<Ԩ3MG�i:5���ڥ¡�-m����(bMMo\t����7(��>�+�M/);�`PXe��6o8pAAI�)����n��Ǝ2Q����3���~���uE�h���˄̶@y�)�p�?v]�����t��<3�o�.-����mll����߭*�������?-����p#��(�o������5'mdw�ۤ�yכ_��z�Xks�7ʘC�I�zn_�OY�`b�2"c-O��(�Cn,�춒���d��/Z먽`�
F ��<wO!!^˖�P����9�K�PYo�!, �(h$�@�&����b�n�L��ay�'�7��(��{@���	|��?Q}[��A���u]�d?y�u�uw�
��t�ޞ��.�N�-NE7l�3��̜z�5�>���������+�U��E0D�\��V9�n���_;(�3%9]���!��xc7;[Gc��IR��8�+��G��C���Oo�2i͜���ۅ/jz}���$2�
6�M�R����Yz����#%��M�"br�����{�LL
���������[�T����^�ū���_��s�[��p��x�
�
��T�Bs����]ley$���N&(���n�;f��	��1�4��]obyP`�z��Q�ͫ���$*�%"�2U�Q�#��66�؉�hz.����TߥI���RM?�� �oVK)::�
�@(h���
>xl��21�9ǕBV��l��w��^��'Ɍd'��5وb$f�T��|67����7�t��hu�RO�s<�w}��DfE��&f�7���WOdP�b�w�`�3mw|��o}<mdNbw�^�yAY��t�s1L���5�B�
���K�	��Dޓ�	z_)o@!2a�ι=�Y�o��L�Y$���#T�bԍq��zVk"Vw�����=>LCzY��z�|����*�\v��tK���SK�:3�([-P�[�pcR-D�pV>����	�u�]O�luQ�8�Abv���f�D5���E�Y4�:[R��zPr�F���C���F�W�V���F�"C��|���T9�[�H{�lzU�	�&BͿ��]�6 :�ز߅�&I�=�=qЃ������	H�3L������#����Q�SӾ�L�pĄ�^i���}]*�`D��W;���,lw-�=َ��[����b��x8C�"m�b	F�ix�~�i���s;���a�z�u���d��Ż���}�k�ގ�����O�@���%�R��e�����b�ܳ�\W�<�U^��VA@���$�8<��y��s��_�k*I��5�+��p���v(.@�([���Ԙ��Y\�[�dJ���)�dX�e��:]<u��U� I���#�tf]^^K�;�`n2�^�8��"���DL��<�6"�Ǖ<�q-�dԄ�zH�l��q�����"yT�lpՌ�󒷲D,�0!�o�НY`�_�qs�ؑJ��G���R���&�1\���nے0�}���tJ��2fo����bj�bjM�M<~g�<��1�ӧG��6�e���|� �WN��WQ�/��̷;�d���,n����X�Ώ�2��=Mw��NfZ$�e�
�V�|o���J�1�#�3���|�*0���+� ��H78���<	T3늊�-�P��F�iA������#m�g�(z�-��Iy�L�1ɰ��r���Ό�������gf>Yk��(5`3W�@�U禈.�z/���*1]��YE���z{�fR+Q���]i��oԀ�_�4Ai�qS�^?�ba+�r�[W�\�[[��wU�^�}��bƧO]fBB��v'�z��>u�-Ýj���2+Y��ؔ��l�G���X2�D����_!V �M�b.��h�R�>5�[���A�����JKה�SH*��B���:gm���& t7�P�r�ʏv��f5-�/i�kO�if��b��Q�p�W�M�՟���yP�X&��B�ʧ�ۧX���&�����#�kΜ)�Q��
4D�1��1�ܬ!7�ή
ڣ�=p:����Ԫk�Vِ���
��Be1À���b��n	��9�d�
;&�n�O�B��`�䯖i*�Zj.X͝tv�%e�Y��h�Cꁇ
�iU�c�<2�������Aچw(�=��{(���ab�oִPMM�0+�y����G=��Ƣ��i�5XC�]k�w�Ã�At���
ќ	�&]��t��j�tw�(��a����k'�?b��t�O�/2�: ċ��
	��>e@��w�,r�Z&tZ��_�tA�,\�܀���+�j��t�����M�ԩH�$<c'���6@zo�p��"3Hx���z"J�^���)ƒ_�xX����	E��u�?edMd�Ӭ0C�d�f��`y�d�ʭ6(�(�űN�P�A���fU�k�0�`�`�(�����UNv9UV�93�l�k�+b�%>��Ư��(�a�I�`,��f��@��6���Ǩj��qR2�C�p�P�;f�%뾕��S��N�58����£(>�a���j]Av�Im޶.�l 獔Jm�cM�{�F��i����4c'dU<NO�ao�P��"UKte�~�L�Ri�	]�)��N�(��j���s� !5��*gVR�N�'����`T������j�h$�0/W%#���._��n��_I����a���3G�@#f$���Hۺ�Ę�}9��A�(	`�ϵ����z�D�{;��Kg�(�ֽT�sg��-eǝ�(Ķ��ϑ!�)2�kl��fK|��|	�3�`
�z��I�>/��)V�ld�N���#\�T�e+79rz���>q*l��R�d�JAR��_1(U�裍�p���n��A�mO�C�P]s�7�*DC�m3��9&c�H�TB_$����w�IV��r�W��\�w�5'?"�,���s�J.mzgJ�9*���(,W{�e[���-�Y�|�)+��8-���9,F�.�.v�L�qڃ�Q7N�@��z�^�+Z�b(T�F��d�6?���G,��\�>��GvO���B	,۔��'�.M����W!	�:���%;k�k�g��!w8���W�F]���?S��b�S��N�R�k�d�:��j�b�gG��[{��h춲��A}��x�m0*����n�'��g�
E�H�\8I_H$���X7ݬ�
�e���07��$w^��k�kh�֤�t���
���j3�k�z�Cf��}��Ji$�q��Fdf&�g4[[�B3�!�[��?�Vk����T�����a��>�2b�j���::z�һm��w��:<��*�ư�/hA̜��d�6���q},3I������� �2 �G����#�`�&R̵ h�'3P<?�5��[�W�(Sm�]�R:q<��\Q�%K�e����{������A�E�2f�r���nOz�\Z�%~���Y��ib
����$�~@��C�Ջ�Zq1b��]���/��!��+�ۍ���"�Ĭ���b0�w���7'�dS� �i�!0���e�Jz%�<�D&qf_�ln-i�(Ӵ"6�nwW�E��Y�ny�'��_�f�E�}ԷU#
�i\5������^���]'u��8A�1�P4o�Y!B��SeC'A��(��(gD�*�XJ��16+p_���P�[��
)����p�PU��!w�kJ�j���E����Y�j��<��w���FCr���߻��e��%����v�T���\���Q�r��cZeϚ��a�^8�]��-,x�-��|����N�5-D�gujp��
�&}����0��p�Xqa��F�eN���}\j�o ��y5��?�7��Q$��r�&���
H��`���)����F���|~#״���芠Ȁ�:<6Θ�J��B�y�\ú�
�p�n�dQ�լ��j�&�V�Q���yd�%m=[���Ay���.�
E��}���YC�m����žlB�.��p��4�,������Q��j��m�t�,��93�����u������P�i�)��T���z��������2�]��u���
�����P��b��������WO��%n
�r@�í�;�����C�e�n�7.�A��*��T?yP��~��|�
C]�m�_yN��E�bv��,ڸYћ��A��A�mLy�%,T���H��j�<�|		�}:!����E��k����9����Z���P�#�����ۄ�����N.mf0�Th��
�
���F��fMV��BFi-.�}2S��q.��K�0<VN�If����
��Sx3��Sz!ݓ=���f:b�5RQ3�q��W��:���i��mϳ�?�'�Y����Y�}a��k��n�]��w};�뻛�!p#�X���gg�m������bᗠ��.B�gaO��9��jn�-n�;��-�ڷO��nC��Lܻ�|8x�;�ވ��w��=򡳬Z�б]( z���N:�#ܢ��I�
:�f����7�N�<e�N#4$
@Ib5n I�[�|�TW��[�X���y�l�V#R1��)��"*&���͗N�mMcT%6`^	5�<ߘ$Μ�K�����B_3���~'��ý& ��� �EB�z�4���0�4W���8����ZJ�Ih��5`>��'��Dh�_&"�]��&?YB��Z�q���Ě��N��?���
m��㪟�:9�n���+��x�EX~VK�`_}��o`�UQT�
M�ɦ��œ���2
��<�O֏"θ9\�n��x�X�����t�U�|<�hK^�b���OP�M������{w=���~���s�n�]� :,��S\����yEm�1�]���-|����3L#��}|i�26�?ԭN�:�h�ky,��aQ��%a�0�ԗ�r*�4�[�pU+��3QE�����v^��R��I5�=`���y��;c[U�z�*M��y'k�[��":P�-_d0�D�@S��1Yz''��!(��w�8@.�op+��gN,�n�VK��o^�r\���#e�|�Q6З`o�	����*���A%�B�w_7xc�rf�K4T�1���
�O�m��_��\�)\^+^W,�hC'��ZU=��[���B��"k'FM	#ԛSf�*܁X�4L����9��H��.u@��=+Z��F�aqh'���!���	�ce R��/#�*r���0�"�0��Y.�.�$��$�ʊ.�h�zi,�9�����uڂ�J��-\�����I@���1��"��}�h"D�l��=v����	�<�� �cC-W�g�U��u7��srI��ٗ2�Š�hs�kx��5!hD7\'+$0��2.Jϧ�0=Wf#�s�a�4�ԩ�ue�x�*߮���T�m܀�c��
�R�{�N�|gn�4.��4���}nA�P�y�6b� 86^�":�t�<�b	�yY�I��hN��Ka+�D�8.]�-�dMa�/v�+ȗe=���9#z-k�uݛ�nj{�s��O���غZ�i0$��8ܴ%�|؊�`���>�&i�m��?M���o�pL��pK"!?��P/�\��K��+�KT)�����SN��і8�Db��S͗l(mY��l_n��:���V��eA1��L�<,��Y��Ҝe��(~��=��L�gt�c�If ��0�g1;1x��ʱ0L�&Ġ�냌���ޔ.�8�N��0��xC���]rqS
R�A��s�U���6�z=g��ь8�m��i�'�<_o��ZuoBx�K^V=!t���H-�TRG�Qa�^
9�^��"Qĭ6,��@>�$O�un0Q|{������S�k��	��/�Ҧ���i����ԗ�,��I3�p����P���Û��6+���њp��Y�g���F|sG��@�Ab���]�/$����
Lt��ch�AuY�ss�7��^bz���`�29��HNF����ލ���+��-B����Zo���J'�����v����YAX7�c֪^Z�A�ݘ�Ԫ�rL�Sm�ii�O�Dq��'4�[�}&��:+
�{�Պ��6�4�j1�"=��.]D�����n�;P����Y���Nd�m����8FC��Ν��rL).������w����b��ϟ!2�P���Oa)�����[���}F���nc����a!q;�sc�~�I(�� �G�al�%�c	,�{��g�H�40[o�4:Eݍi�)�8פ#ӱf����*�B���;�Պ'g%�Ef�T�!$�g"�g�"�R��SD֕�
�J���>�37�]M��'�V|�UO�ԁ+W��OdX��/����P��52�1�~�n�w��sQ�)O�%�8��o�R�`]e�PA��c����n�`yF�A%����8C�.q�%&~Ir��
&h��R��R���9���}�(^�x������i����1u�?��yB�q�3��d�Z&Z�U��0��B��L���9l��)��p�W���q«$0�e_�0W,�D�$9*�&�|�Xvd[��F@si`�i~A?B{T�1i�/�Y\ޡ��Z�T)�Ձ�\�ڶK��8�ʜ�iUg
7j����9h\
N�,�˓bN�܀�vJ�~ܰg��N=�Z�(�co�qz�8�vƎ�6JS�C@�$���1��A��� ��w�>�m�����4Rv�J�?a����&��?~�=�ub��p�d�;��X���;K�cêCo����`����\f��
�]BY�:�p�+��++�v�� )���2yۆU��&O��B*�嬶��0��L�V���O��
�`�K��3��Ysa4Kd4*(8��������^�s�#*��mۑp���a�_��~���ZYIZo&t!:#6�6�~��"��I�1�D�;�PU׊��\iֳt���PUw�KOpw
y�9�Xt��Q���7�8%��u���AW@�a3`���3�@n�0�s��(L�ۅ'O�*�B���:�2wx�\Pۀ�D�ߝ�	#g�
6�p��q�����Qm�~�51R����ۢ�'�<{�x+�L�Ź)i3H��Vt�G7�u�Nb6_�rr?PJ6���O-Uw�z��E�����:^��{փ�@�Tam��p=�Cp��&O��M)Lu	�:/�R4�.Sr+��Ef<"Qcݺ�m�P¯?L�>	p���������� ��}����٬��]⓽�9�/L��'��.TQ呢S��ی ���x��'�8�9c�}�R�[�"�k� ���\;�R�(u�O��+|�/��t	�z��u�w�Xަ��(�o�iP��<C)�+M2�]Ƶyz��?�y
����lx�ʳ�Ê<��r��w:Mw}.31�<3ڭ��pﯢk�@,�w1�u8�e��n�Z8;twSĢmE��ï{�vSR����foւ0Z+��O��1��_�A�M�8 �|�d4��v�ֺ��.��(�]1��;3c�۸1V�X��v،��xq���̣�C�&I7U��
�>���l�7}����|����͸bAFT����z�j�'�`���W�!��e|-!����J^jwor臬�j���-S�w"e��=�%지z΅�S�
��Lf�B�4��Q9FO5-��]���d�'�ѥ��GPx������S��a�� 6���8�M�i��4J��*u�r���\o��
"�0Iב�Hg��im�l�ۄ�y�m��ª�]��JWJ7��{�T��D��&�o�^����o7�q�\�)�U�\��왗 �i�R�i�i	��y�R�5�`z�,�+zHH�h$jݲ����W�x��`�S$Ȥ���r8�� ۨ���y��n_�V��s�b�Td���
�gP�q�佘�����-M��Y�=T�3*�ӄ�R�*Q���V�ѐ�hUi��N�ʹ�ᲅ��4t+���.�h{�؀e�kԔ�Z~�!�Vӏ�QԼ�_ �O�������������
igp�V"��$*�_Y�%bur.]eZ!�����D��U�NS���5�*�/ܪ�r�)퓉�'�3�ޔ��$ҋi{����V�pO�t`+#���;�]�o��*�����ÔӦM���/�uh��k�J!���J��e ��,J=���6�V-c܅S�#o�	�����3�8T�������G��`l!vq̵̅����50��mV��uwj^֔�AA��e9�U�L�#��T���9��?�Ə<S�8�ɏ5�mw�(���yc`��<Ƥ���%�I�3?RR3\�1`-���s�����+�ǀv��'ޡ�(u%�-��܄5jePl�n�n^�QW!��L�{R"�C:(����QZ�K���snR&\�f;BB|�����Nی1�����}�^�V'V'vf��,��F(�74Ee�:,�nrj[c���
�U�B�%�E��`�}@X8�=i��e�c�T�VC
Ҕ�� ��&6
=�*B-�Ő�m4�X��Ֆ�l~�lM�l(�rO?}n<�y_Fv~f|�WE\B����X�.��+��@l
��Y���UMV݊pB2c#�|8y��C^�mVb�{�Al(��߯�J�Ʋx��w*�"�q~�=���~ɟ\�A/�V�|S�h���\��DH�k�	��Z�,��τo=1��YG���m05�1!$C־�G�J�@lC7O�)'C�Zބ�x��J�,j��B���/�x�#I�>�Bj{|4��4�E;�!�f%\
︳�@�pw>1r'Zf )�1?<���&�?�`�3Iw,�t���0B�-Ge�X�����00[�N���%z�	$Pi�%��a[�g^('ʩ�j�Kt���"r�M�̹�^�i,եn�q=��TPQ4E^[��4��2���&ơ�u*w��lрɠ����:�z!K�5w�l���:�l�tڼ�B�-�O���e�ZK���L�<j��u*���y��5j�צ���]U�M��3i��=�!Z����ceȥN��C(|�+�/u�z8�Ĩ�����ޥ�rp�.���]��)�:wsK�z��#���}چ������ӟ������j=�f$�B(��n�Oᐒs!OǺ�w5�U���4�;�hF��J'�O��YR�6AJT��d�p��D�	F�mX�!n�Oj�uX�i�
bmg�i��2�%]f�	�Gi��4��*R>"%��b����%�ҁkN]�͹�Q���h��m�V��C��_��[��jg�cņ.H���dC-1Ћ��v�%Ч*�h�YV�"��2�Q�E&�O�L-%h������x�FZ�ɝB#]��Z�����td��,��PƇ
�ք�Q�9��菐���/�I��K�eS�P��%)@
Ǥqx�E6],��e������11��G��A�.�2�K�f��:�_M(͋�t֏���)r��Tr��nj��`�ؔ���Ee��Ge�"Yk3��o�ΗN
��e��6�e3�.X��4ϭ�5#�r�F��iwc
sV�#�g�i���P��1x����pЖ� -�4���:#Pzv���4!|cMBQ�(��#fdN�E^����O��N�Πڭ����ų":��B^U��>A��Yڤ��,��*o]gZ��p��o���^�}����3՝m���6&��d:��9��W�c�	t�F�jPzl�gaKzu�zi�6u�h�'���`�\�'�";����El�9`n�Jy�����A��xԹ������:ci�nY*�c���{��K���vN�\kc��kLųG`��I�;*w�;#(�z�|����l��h��4��Dx�H*R'M�|"��"wRD~_1�Z%z:Dvl֮���
�mX?fbky/f�D����ǫl�`�z���¨lN��Vv�(����O��U��2��ѐz͎���/�Mε����G��?4�v�|�dx34�n~��u�k����:v�pC��iJVb�u��D��Z3�:�U@Lנ����iϔ��\���w�i�S7���mW
f�.�n(+z�m6�z�����FNBQ�]�zG�`K

�."�Z��	��E�,���e�:���cϋ�r���{�R��%C��S>��y�)���|}�Ӱ��p��h_s
 ��_�Y�ۂq���k+�1�+c�a�1C�l�W���(_9	�������l��ǧ�mR��y}b�Z��~����_�j���qDd0���{���S&�.&0�
��|.���m�Z�PW�u�� �~�1�S�����z�[���L�z*v�S��g&]p�u�l񔴺�4�k�3
�	w�59�;=g(�?#�?5)|tW�>d�
�d�q{9E�Of�V\ׯ��c�-��{+l2b�g�9�(�+�b3J���u�55J�
j���l>�	��M]��_�׏�c�X;��}�j��*W�&~��7�5_���Q�SX�[H�
�/J�|#j1~<f�9ƌ�[��J	�_��_�+�WfН�/�3(��Vƅ�S�Z�V�-D3��G�PyA�A"8�Y�.9�];��/����}��_�r��3����	+<���j[���J����@�c�N�p��`s�O'�?���jt�L���F('5�X���ٓ���C�9Q
��F� y<�<�>�����M�
m�KO�30ׄ����'��q�iĆ�P�s���a��D�.Ps�w���EYP	ƽ�-]�R�1�'q���(r��I��_N�e9�[�$�UX9�]�j�:��d�Ud9ɾ��T�2E�w�y��j%���i��vݢ�g��� �
����i��f�lu�����Sv�~�Q	ʹ�S�;�0銂�zu���k6cx�\��hť��-�l��WT��WeFU�&m��Ytʢ��MW�O�����R�j��d���}�(��*Z8E��#T��%��iA��z������:�-�/,+��:;fu��%;63&#
�Q�t�+�=�IF�񵵕�>�꧸u��c_�`6*�d"�'qȕW�O���%����BXx3��D{�'��pҶ'|��0�1KUvR1���Ġ�(�C~ҵ�։
�`��B���� ԋK
��
�&�غ��4f
��o�5������P���%kc�F��[�Yǫ�w{�/���a���,['ܶM�W���RVQrY~o�1���'���.(�d(
S�;�3���;;�'l��h�S���/,v�_&W�����Ƒ�#�A����0��k�2�������/�<,�<��|h�d���{��~��%ꢬl�m��lɖlٞ�E���ވ���!__}�a���[�H|ɻ�!;���@8J��~(N���h$N�n'Ʀ��%(,mۑ��#� p��k}����Y�3E���.%�6��py#@�tR@r=�a8�q�|�X��Q‡���+�Eb�t\�[��)��Ƀ��	7���G�4O.Ĺc��?4�=�`�/"���\?��	�
��G��K��~��E�X,m3�T,cF��4Y�{�9	X��v��H�2:f��.v*����d*�
Y���+h�}�gH��`!���ԫiOdo�;�)',B[�����8�o��U�n�e����n�h�yV�Vn�
Vg^�n0_{S��y�A~$0~�*���o��c�F�,0Zra=ϜT������o ۢ	�
6��(�df���r��&^�d7gr��j�p����!3�:ƸQ3�y���a<Z��!�aga���g�����b�d�_F�Yݍ���RYFm��%-�YwTu���Y�|���0mz񔶥�<�f��Q�z)\����@��~��w�X�M�9tQ�q��X}��c�j`�Bm����Xyx��TE$깳�!�F-V��4��j���KX�%mZ�o�Y�O��h�y����r.��xؿD�!��w6
��1�(�ghs��;���޳��7�%8a;yn
�!O�
�OȦ	h�[�ց� �l˱虯%�p#�Ћ�Iר�{Wb.!E�sX"��|�g���K�Ő��D1�$�gp��Z�t���K�ú_4Q�;�}$ sb3��)؋"|=c�|�:kY
����K륰��ȓ�z�P�4�U�t]�A$�G�t;㨬+S��v(�Y��h��{��%pk%��������n�B�J��y^��X�  y#���i�G��"x�ߔ��I�BQ�Q?��ن̋��K���6.�È��WM��p@H@碜
l�s��[��Х�L���k�+�F��W�ηsǵ,�8<1;Kg�٩xM����5�.�ʫ�C3��t��Ybͽ�/u��!���}���~�(���N�`��Z����A����������5$�4#�����g�1,�>f0.>v$��.���ĀB�rK��?5��,�'���b��)�>b$�& �(���`
��P�$��Ē���h�-�L��LA@AE@B�J@@c闀#��1�nI|6~��bn1��.7�~,��n_����{�	�^oh�l�d�~Yb�%��)540ܞOTF!5_)ד��aEQ�JP!H��}�'-�?���l"������{f�j|����0�3�$��H�4�4mK�:�Nk�QK�j�^�G1�N����8�լ��ʋPm!�N6�)�<a��
6,X�5ѩ�%	K���E�ZJ�1	�Z3I�~
$i�n7'�h��8��*�Od�t�k��ڏDS�X�$��1�v�k؁iwf�645�n�rsCk�r�z3�
}�dL��������|��+8�[1���#;�����	��HI��O�ٮ����t��a�w͜r;(�S�]��xL�e2����
+Y�9G���3�sZ��ጙ;P��+��s��A�b��f��ăx ���v�`Pulh'��y�Ue#Y~�Z���A���=a����R��'T�錕��L����+=���"�|罠���
���̬�O�ikŶ�#t=uݭ]����
iıi��.�k�iN��U!JV�r^��N��U�F���Re�����n�ܚ�l15�d�?���=Q=�deqPE�Ժ�}��}��9sѿG���Q5�0Ϻ��b�U�b~�{���=�&��Ϻ��`�ڬ�,{������*���RR�'b����;�1��2>������=uO_$8���Ŷ�b{��Ʈ}M���(p~���$I�m��)�i�w�y��_ʮn:w�ӽ	4����w5[�
��BS+���j��Cv��ᨮ�w8��:I�U*���2[��#>M�W)o��^jF{���ۤ,z����դLJ�%��oYf�42�-zZ��
�p���b��8I��|;���|;w0�\����b�xKcp�%r&�C��2�&>�ՌuvW��_Dw�T�I�	'�J��K'��z�����u���<�#�^�N�#vN$.�����cn��g��j�T�X����=aU�>|�*�qK�]�C!
c.�~�6Z#�~�e�E��3�*��i�A�Z�~�j+s}���pm��\�

Oe������s�cz�NH]�A��/5#a={(�L��u�\L�:��"�#_4���J�Y�A�:�|4n6���Rf��h�ke�6}e����{Cࠅ��c\	-^Hi�F%���10\V�/d���Z����̑���aa;'P���@�����)2wA9�& 4X�lv^�(2�>�i3i����t�R�#���TY�����'_����c��oE}[���+��k3�D�}c<Fkz+��W��kN���8�3�K�-Da�a�fQ*�C��yL�<az�O*Zey?�4��>�<������~"#�L�
Q<���q�����p�Q~�����@HQ��o��Ða�4	�B&�X>�h,#jv�!Y)UwdV�P�<t��1h��s�x|$ӭ5d���?/��\AÔX���7��:�����*�x/�\�w�*X�d���G[v���m�:��JV���@�7�Ao�{��t
��3���QM����R߫D�=��'DY���#KB�9��c�={���Q�
ݤ��Ap��8��c��4Ẋ�zۣ�S͉y� ��uzP��gp�V@}�ڨ9��[�5���2�ih��d�X-��|�.�v�KW-p��1I������wZ��#�7�g@O1#����v�	t��)y�j87G��(��@�ux��7�Gh(r^r�@��\*n�TGh�HkL�1a�!�R�?a5��I&I���z�@h�m�[���N>aM�VZ{����m���Nz}���Ο�]��f׾�.C�E4��AÎ��[��`�b[��'q��C~wv��(�
�Q,4ܧ���#I[p_2P.r��ga(
��P�ZQ�&θ����Y֧[��1@�n���ywC
�����3o?��s3��_<��x�QOu՚�d���1Da��k��T�$��q�𞶉��u3�60�m1���\	��;���6�%
�#��šK�{�'U1��Ƅ����
�m��� Ϲ(df�U%�DJs���ުMi��ս��Svx܄Oa0&�c����E)@Ԑ���F�E��Ŕ�p
�!�!qJr���c��_�r�d��a����+[�z��I�y�1j[Op.#�L���N

JKKն�7�����"̒��nH�2d�Ȳ�cK��&E�f���`��$�uk���3����p��+hlL��uq�]��t�sP��w�K�i�`h��أWq��
,V�ȠP�=q� �k`@Dɖj@�,�ce�^�.%�gn➹��-)�KPH���%Z��$�w��B�OE�6��{5}����܄Ï=���Do�K���PG7i>�������kHl"�5}�r�p�-O��hr�ᣄ����0+�6�.�m��߼> ��J.�>MҬ:x�H"@�-���~P�6j=�\��x>�,���o�g�c+�x�CI`�&�A ���dp~^uN��j��ݩ߱t_��;�,6�f�ި	�j49�vEI
�2��W���Lk���!(8�:RD1)J�
����׭	�[oHĉZ��*\.��Rb�%=ԚL�r�<��2$�iOtɷ�����@֞\Q�u��$��[�[:?�,Ly���Pb�ىi�D,�;��X�z�3��a^�����S�'i�Ǘ_�ٝ�m7k�ZOs����1ECW=ƗL�+J$I�BX�TM�@�[�6?[�u��}��ey�}�K;�|����@&���c����;����u˯�����C�I�#��K3�s�����p�r3>e�b1��F���g,�L��Dg�՟I�[��_���7�� �����qkfX�����I�	�XPve8qaz��������R΍�_>���}/%��5��[�YE*�x���E.Sz����W���1�b�9+r��>��\�*���
ۄ�s#[4�x�%=A�Bd�A���9��h�@�~�q���!�8`�Lz>�n���A��Dt��h7��$��ˊ��a@�)��V�7��m)!��m�cze#���B����m��d�S�p�Y�
�k�(ˍ�_K�@كyW�T��(B<dg�T�Q҅.���m:e(T>&0L�n��G�3�͑���'Y����䪧-��0,�}
�B����+I�Y2��ʚ�½��&�	���&�l"_�S�9�j�h&�aWѥ'�6���E��3�""�9yN��dRw�q	�qE1�X�	l=T�.�߹3���{�(K���^|i�/y�Dy\E�D��r�=��gz����,���b�Gk�gr�g��`��[�wGO�A/~[��n�b.��ׂ_.��);)����	5)��;���mK1�+
��_��w�@a�� %v.G��1i(h}��U6E��zb�VC0�*�4�)E�	?��E�^�8r����CP.�o�Ys������P�<�2֠�f 옽¬<�!ې6E��.�-�^�a�͉t,�J�4��}�4n��y��^mزDLX#�Tv8XأrZk�V�#�+�)����K�D�I��U�O٪J�<F�E����p��Ck|�^¥銱�YUt�6N6NaY@i��LnG.H�����;ׂ:�/���nP�c���Ug�ܒfXS1����se`�T�r�n,=��x��j7��������f�b�GH�3����Mh�~i(�~ά
���}���C��
���w!�J��f�ڔ?�c�>H��SC�yn0�ݜ�d��’�����)�8��䦓Ē�6z�X���ϛC����x�u��/�B#J��e�p�{B2��Cz����d��$)
u�Si�-�w�Uт��1�A��lȎ/�&���x���H��k��E�U�k�z�'�(��s��5���+(F�E1Q�h��&����9hHO�:خ��6ÖD��{t៾�4}Zta��ݵ>�}w;8I~]t�7�3F��M�!$�#|�K��?�@�4r�<��y��p�L�����ǯ(uc���Ŕ�QWELp�?E2|���x T�WFL�ٷ��A������޲�\�X�����pTF�f9���0q7�y
�	��X��'�(��WǨ|c��W�X������H��\�|��,����p<�a��H�a`���Q����M��8�	�5Lv�Y����z���yu�6�EY��rY�
TI��s����[~�����Y���cr���\�x�^��nn���9��;�Y錈�4+��Cj�_***5SةJ���7G�1�z��ϘW[��@TI;�?4 ��9��>��oP�%�yF�G�����g��7:���js (_�!�ղ�a81����?m�r1������Oo��|)O���1�1[
Hb(�W���d=�r������]�E"��8d	����
��
�lC΁�S�� hd�6Q�{M�y֥<��zz��77�0}<�����p��]yZ��.]5�^�5��N�����5g�����B��{�#go>~����~*�~�b�u���e��T��Ӊ�
w����PI��M�������E�� �A�=�l�X]9@qzu4lVj���4`͵-D)B�Zj4^�?j����5��z�=�M�	`_�d��8��7����wB�v5�����7z��Х���)�_��cc���Fc��>?sF�v�N��7#Mb~�?b�Ίbb|r�
�ً�c1[Բ�E�i����B1u�Rb	���7��[��wZ��W+������e�סbG5q���7����_e��8�b��oa�ۡb���&ѫ�Y��A�j9�B��_Rm�Y��un}��X�RN.>�I��8B^&�����+��
)�,hC�
��4��,��ñi��>d�wo��_d`���^Fft>���W�rVս��������.�̝��vġ�<r�5�Rɑ�=e`�%��D���z�7�	#��=�m��2�z��ۣ�D��wM�2)O�c%հKT�5�BisϿ�0ޓ^��O=I+�s48��}� ��נ��Z?��6���i	aVLҩ�ϸ�����WsA?���¹sI��Y��jZ}#C�P�}V�T"
y���Ex�)�)�pӀ��A[�!R�f��ǂ��ʥti絉9b�����SB���<����0�!p󸄾�H'�H%#iL���0!14�b���/ ����W)��ks׃�ef�Z��\m��~���!0��ü��<�2~���bM�-l��mfE�)��7�ՁЎQ��B�RF�º�$<���&gO2}gr$bu��.>�϶��8.�� ��&ڥ���|0L��J)�{
�O7�sK*�Nf�b�RnX
��$����e� 0�q"��5W@��[��l$����J��y㳏S��H��
xĔ�
lן[Z�r�rA��9ؒ�F��c�s1��L�J		��ܖ����'\{��ґ�m�Q#�#�;oHX/2W>�a�����+e�GX	��؜��={ϕrxoH��a��B�;I�E2��,y���>���CJ��mYw�����A���8��Gl�i���[����Kb�����G͞�7%Ʀ֛A��y3$�
9�a
����c�F0U���œ���5TS��^S��������R��A���ӨTđ�-!V�&��L����(�z�F�R����9�sh�7�U�O�?M�b�&��{T?�oF0+�^�訌P�v�ʌ�6��ķ<��7���4�bQ�B%�d�#���l|-hq_p��#I�/���,w�GҤ���ʮ=ⴾd�B��o<ꇝ�|�ɫ-Oي�-�Ah��w�N&E��f´&��`���Aī�fj,Xn���YR~e��Q~��
'�(�7�a��J)�h��c����Y��٥M�网�}�e��Tl��Iι�Q�I��=��I)�]�.r�<�u�#H'k��d��Q��)��#�#�
�p�<��W�w�ƈ��"(o?�y�o�H���L.�(��X���,�7�͒�"�e㰓�]��T�H��-��|@sP��x9��*4�>�O��W��y9Z��i`�P�M�"��	��@�#m��7���B��u�"����BZ���1���2(���̾t���M�dͷ��2�?Z�R���p�A��`Z�׶X=�\�;����G
�M��en��bڮ���Hw4*A�ck�$���C�_�`�;||/�z��,��Տ+���A��@�(��"|����B@�D)�(�ER�*���+�C�Zٶq��"S�9��mŶg�H�n��*[�g�L`��a�]]�b� �$r�Q9�H�C�_;k���\���Z;�³NYK��k���-:�#jѧk;�y���>C��eS~_��t�s�,����/p..�s��AV^U��Pw|z�-�T����o�׫<�	Cϵi�_.Ig�Ś)�ȭ��7pr5I�f�m2�EQ;@Խ�Z����ؗP[�`M�2�/T���o�K��e�Q�R�Vo���ƍ�f�|5E�E�*Qޅ����x⽊!k�[���$d�Ӈ�o��}a�M��
T"�Z�0�����~���7�~U�%�VD�4���TJ�W��2�v>ay�)ad��.�nZ�v��yp��!���(�<o�2�SL3X���0E�N��K��
C�l%�&8('�;ڳMA�]8*�-O#�X�.b�ښ��ze���t`T|[m�alw{[MZ
t=���������h�WO�Q��
J�Wt`�Q"��Wt�J�W�&�~�u0��3qz>�Ip	����Dž�O!��ΓN�΄;+l�C^.�P�f`�Q�@�yS�:�y�74��@-7x�k^<^:)3Y��R&��\8��q�6�����i����-���[�H��&�@�V��yY�y>4,|�ѷ"�hX�Z��"�s�Ϡ�j���tg8e���Ql���͝5��
>�Š����#J�e "��gY�Jre��w���
\�R�'7�9���EC?V)��6�<%`S�T91���m���)=^L��O�^j��y.b�V��t�B�t��ǹ#͕�m����j_s���m�Q*[2����\	l���Zbٷ��4{d�l�d�� f�D#� ,nA&3�.��1��Q���:bF��hW�}�4p��l�X1�t����;�6E����Tl�K'���&6�'/��M�ɥ�T�? ���.{YB�CCC����p���|����ɪ1�b�D��M�Cj|�t�Q�rI���%a����5$�/ì��Tܚ��p���7�G~��8��o1��KC��J�������c%cG�ߗ֎��fe4zq(�
�S�Iim�~>��[?��1�
$�6û��1�'ȍ��ղ|ī��TA���Ucz|z�|�쥓��	�2���+J�e��{�Tb���v������%��)�P?>d���T�'���Fs���D����r:��>�Ϥ�|�.!�!�'bO\B�������>��A�Ψ8��rH�L����� �d��D��
���Ŵ�ފ�|�9�"�/*vn�-��qF$�a�0
���e�x�
��d�e��N�W�����T�x�@�s�3�a��i�A`8�/�	(t�u��BΌ��>T��#��s��j���0λ���"3ok����M	��
*��a���}E���7�;�i����t��'�OSa�H�O(�qY���]�!�$�2�����E\376��+6��)b0����
]������LNU4t2ًf���=Rg�e����,����A��s01uE����V3T����nո��I�S%(P�Rc�S`�X����2����Ui�����e[?r��z��}�<O�1fa.��0����H��>ZW���!U�.AU�Y�A�����TFNOi�B��e�#�tD��+�ُP��.��q�=�8�8�CY\���60�G���T��i���1g�>z(�r^����t[�b�c�+�:K*t�`+#����s0|�w�m���sp���R��+��������N���8�fj�����)�
A���H���
J�R�ȡ@o�Z�Cz{�H���C!��c�ڱ�=�΀��� X	��Q�1b�s�{�Jw�'�}T5�-�ŝ邃>[�eM�T!���蟥����J�0֮N]�i)�RJ������h!͆Uz"�����������+��T�.柭��������ԑy�/���^K��~�꣘6O@ ����_��W}�w17|���Ec�����a�����y�?�5�ҊCN����%���GV�Vdz��&�̱��Ams&���h#�Ki�����n<�2%��i_pȔ�����,w��t�9�_cs����K`�ey�5�oڪ661)�~ywoZ�^��XTC,�Z"��:b�*�I�Hc詃
�6�Jx�X�0Ԏ�i|��{�i4�H\AA�#rr�N��GN'� �����c���G�/�Sgf�H��9�2��<|���*~�H�\�Hk�Eq�6�3TeȻ6�[�x����I�7�S)�L���«X~>�_.>d���Y�@])6��9�p����$d�C�I}Q��Mo)�[��Z�6��dӎ�?(�5��'T[oCt���1�NJ���XW�DA�Ӿ��u�,�l�*�I��\G8��~5�}y}B�
�?-aͲwD�;.R�52W��l"��$%�`�K!#d�v��W8�2M 6c���D�Y7���"��^e�O�*^� x՞!!:�p��|&7<>�v�(>�k)if�(OR]��&D�iY~DK���N��MQ�R��tQg$ӵ7�zt�OHP�AM{ȭ�7^�)�V��y$M�`Qȡ��Q�lݲ��!ԙ�\�X/ �c/n�$�`.m�=L�ȲU�)i���Y�y�R�c�CC��=�Y�
����ː�X�%Jl�V��L�k�|�w*���m��艘�,j��
欤	�H3��r��ֺl�ߺls_I�9������i������h��o��}@�4�Pf!н�UoJN?��VtW�؂o��xd���dA�k�Z��U��1]7�9�3�IH���L'v�CT�)7K*�5NC���^nu�w�W�v�2j�锤.?��� y�f��t��7R&���wS`�=X��ܭU��“y��v����m�w�NY<�ouõ?9_�v��u~��#x���c���A�g`|��n�25�F�T$U�=���|2�M�=��n�)}�x��~b��
~�q.��<��0��Ήa�]���a� MaO��&׿�V9�%�'���ط��^jJ��:ۋJ��ǡ��4��X��'0����M�T9��C�5V -�:�+"�SEa{�債 <�#̓r��z)�or�l���]�r�⪐q+�A�d�ذ��p�.�D�A��g�& ����"](��{l�U���ͱ~�,G�0q��^�A�K_�{S�v�k5�y������J4�?J.}��=OC���GѸց���)ʢ���t�2�<�ƈ8	��=.�����خw?�g+ �)�br����O.���3�!��L:�s�Q[蕝� ��up��\쳨8脰}���J���Om�{�M�z�B��	�钌9�$�;�
 ��T��qAÇ����ĹjiX�F����nJ,
F]@��}������2�*��_�R�tW}~�:�@��_�)���.��vO��4Uv�ڽj$�҇�R��R�^P.�S����(Jn�X�)]6F�bd���YL�N�_�;B�8�"������楋�+�&�Úـ/�n��m�J�ĉ�ŪͬK
@��������
��CD�U��E_�R���4���AN��u��5^��*�=*f���>מG���ps	���t�����#5���m`�����I\�v��M�hc�IKb���h늧��4�,���X��>�/�,o�T�
��]
$�*��X���Y�
�ffb�Z�)����������ý�d�K+lu:1#��!dr�b��Ta�ޔ._:S���D��D�qR�˅�1�i9$���7�X2PU�O�f�S�j��ԓ\ ���ԯ0^��[p�R�0�O�0�=�+�.�w�I�p����+�V�,�����_��Qxz=�J�8Y03,�ux�+d�Ь��[E��t���{9VȢ��K�z�2���� e/+��)�`�p��Z����la�l]g��֩��Y�߄�6q�S�j*ZVW��614��0�*����d<Q$ZG�4��N���0.����1Sn�!�2����~[-�޽D���[�6X�&�D�'_�Nk;�;�l�L9���%�&�:l��k���2^O�<�Ɠ�*�uB��\�[�Ch��i��)T<~[O(\�' ��>�`��jd�����EQ�Sʼn�l&��leS�nܸ'�8]��,{�r���L�5��z��J�/rȮ�l7�Ԕ�d�N�[ md[��I�'�PM�,{G�c�w������"Ngq4��	��82�BЇ>F3@=�Yy�`aϝ��`� ԏs�#f�ꛋ�Ǿ?o1�4��U�X����/_̐^�Br����;,��꜋m�7����dӰ��m�}C�R4m���C^���ٍPx鼭V�6�>qE�M�p��%7��t���tj����P�Ʊ�� �i���*�� 2bP��j,_�|�\>���d)��jH�zĵi�,�A4(�yI�^�k!
kh��H�ǫd��R��A��|�����U�Cg���(�I����#�������A�t+~�U�4mk���(�Φ��q�ծ�����NQQ�:�k
�2��2��>��J�Gǔ{�"=���ʛց��re�F��D�v��	tP'��������eS�MX�y|nƗx̟���df�3j��R6���g�kYh*?Y�S����9p(�tF��ә4��L����8�؉R���~�v��F��/�#/��o	��YE=�O�3�a�ces�י�F���9�28�TP�=ء��	($�*����_�h	���L���[F����	)�+8��RewgT�
�t�
����G�f�\y���Ô;ܠ�n�7�|�a������Dbh�Sx���sS����sx�l��qP���x�u�o���9ք�_��z)JE��W:��W��&nUb�+P�S��~l����!�-$cDi��HCQY��Q�L�3�~v��e�-k���$�vW��=n2��]�utK?�@'
du�qi{�[�u���z�H�.��p�m5���Oh��a���g1���r^cM�#�"��-��ܔ>���ᦜp.�D��F��(R�=T<�|�tD�gĢP(�WP���\�aW�k1�#i�B���l��t�R
6w2F���@��X���Ȏ+ ;���#��3oPSF�����ص<u�]iFWf��̈́Rݫ�;T��Y�׭+�
l�|1�|~�1�lJۆ��&�p8J��*5�&�wV�Ȓ��To�ʃ.���g:�M?��R�������A��܈V�B-f��%�Pe1�Dݬ�2�8��8�4ER��Iu�O�,S�1MG�-�f���$�&�Zܯ�F#�4�I=��ˡR��t��a�U����]�s�y(W/{X$�[��W�2�^d=Wܥ�+ؐ�*w�{r.L�/H�*��-y��ڐ���'��n��ϸ�IMÞ��"���?q.��=pNu�C6)g��x9ȴz�A�`��y��)�zc�N�o�mC'q�(
���cXՎ!��}'J��i{b\��}��OVi�6��y�L�>��n��#�`���c����ڗ�H����S���9?,�\�j��$��7�Wm	ᔨ�f��qbQ��w��l��h�H��U:U���s�����~��~���uKP��l�O�A�h�S����A�L���м�<�Y��5�<x���
�;�o�'|Lc�ip5��7��Yv�bO�C�� ����M��/a��
���i�}���}ϩ�W�vu=6��6t����*i�`
�#���},K�%��Z؆Vt��RQ蔆�\�w����Z
��£j���V�&[	Ui��������l����a1���(,){lW��Ӈ�����#������@l�X����9'd<���b+I�4��9M
�#86�AY�3k����p��ޔ1
ĉ��r���hig�n�5a�u%\�O��;�
��h�|Gg$;<c�?#�tFˬ��I�blJ��d.*]W:h�!��I�%�W=8t<~c�4�Br:d�I�P�%�	���%)Sβ���W��sK�Լwgq�8�g��x�v=?���ժZ�hH3�q[��M�K����Apo/� ���� �P�Z#�PQ��bz�1�-�ޓt\c�w!�դ��x����[=ďbq��-����Kq�n�5~����u�a���3��7���L}[�V��"����5ӟ��-Z�w�_��Kt������q[C,���t|�p����c0�����K��'�`��K���q�C�~���+���J����	���=N�H�\Λ3��{?~S�L��n�L�M�P�x�4���������d�3���c:���P��go�*"�Dn�̄��V;��_�H��qY�yU9������fr[�ܼŹ�|J�zy�م�����Ϡj��.ccc��՜A�����6��>��j�ݩ"�L��c�٩tU:�;�.8Y��_�t���['��U�-��VY`b//0;oZ�ٔͬq$D.�,�Bx�u
��~�Y���I�h%Aq�23��	Pu
��KqgŖ.��0=�v���u�J��.�\�ע�h,j�$��h*�NLѝ{��d��$ݪ�-��(ߵqjNe���Q��X��~v�D�–7��m_B��S���+%��oO9���7_~��a1��J���H�j5-�4���S:�߲.�j�����ఄ�@8�^i���O������j��1�_�]�1�N�G��F?�����]��M��w�fw=����'t]�}՞�e6�M����M�x�]`�q�oׄ���:�¨�/AZ��nn=��3jB�6}�a��F)5�1d߫*R�g4av"�T�h�7c\�պe��C�+UA]�C/�����ҝ9�Ns�H�=�6����r�8��"ld��j�)I�G�F�k��’��>�a$3e���,&��/'�,|r�	���_�rȋ�,�x��1�)1`^d�"뚕����j�jN�L����x#9�^w��Y�4H��E�RX������dI�XQ���L%��nl�@>�
	�w蠮H�9M�\��=�ާ��™B��)X.$*{�r�m��;��V��ɿ5�hD�ߟg˺RƌB�V����
ޅ�6��\>�ʢ�TfV�&<Ŵ��f\�iR�f�%���K��	R�
����B~=0"�Id凝�tgn�B��6�	��V��׵u�P�w�����%���a��\MQa�_�<ʅ�_�S!!Q�-�E��?t����I
>��T\�
��Ҋm��

D�MFC�AD�M�����3Az�%f���:*�l5l<6�=�d�� ��1��T�"�EN��t��3g#5��n��.uG
Sm�r�0��n	dVL	Y^�)K~�tT�u��bE�l�%h��w����1�D�wu/A�Eƨ��v��e�Cn��%�&'�͖��x�&���#��adS1[��(Mf���g��D��U����<����s���Hڷ���"[&R��N����vU��u�|Wi�	S~���c�77����q�z5���g�e$�q�g�d���TA�ƒ��K]��D��v�ɛ�~n,Z_u��턁ފ+�!4��2���]Rn�M���Yv�H����þL2d�����u���J�J��D�Y��+��$Vs@��#�*Q����ql�ǧ�4�65�Z7Z~����7�O���$���h���؆�	��46��4���$ʙm:)�Y�v��;)����n�ŵ�Ǽ�V��w�����IE�\�����+~4wp�?�����Y+^�o�P�,��Z��9��X�TVu�(���Ҩ�U����7�>��#�3�f�س�3G���Z�g"_	��q��!�8��m�j>��!��`�*�3��(�k��nQ��	���*ȷ�"�UJ1��H(��J7��0�w{[v�Z�Rw��^��>���?�%@����;��E!g{Wo�D���\p�jgkds|�2��M];���DB�	�G���:{���-�)�>P�G�M!M:L��z
$c+(�F=p�ݤ{��e���J���z��~B�d/���Vk
ٹ	*G�R�)O�j�H<aW+v�S\��(��DW�MPpmT����B•TlG,	W��03��q�h~�G�N����%�;�(�˳a�ˆ�p��P(��@�N�K&��ay��Q�J���]�X̐Hg������ȠĽ�%u8��4O��XP����'�sz&+�	taɴTu�QG/F�IFi@����V�
?�N�n�"�q�fI����
�Lewņ�e�-U�m�o.a��5��x�v��D�z�z�њ����tq�����Eh������.?�m�I��
�rލx1'��#�9��
zr�:_P�(�;��=�xL+:���UAP�p�&��r<���}�\5��A��.h�jͥt�q�[V8��V��j�n�E��vO��w�9�ОOܧ=�bO��;�߭�#��}
=C����4QPn��?R�Q�_=Lg����R��]^�H���m��vE��1��$n�2�L���"Դg#~B��f0�l�[�����(o(�<��+�v+�<�T"$<�m:���C*����v�
�E�q}�$}������:�{=�;¼�U��K�!�q�i�+oa��`���/�L�y��}ʤ}E�LQ�(Ih���n	�ϋ�~�4|c.�6����1C���>Nl��К�g^2�1~iH��,z:`O�24�#�1�W�
6zb>�FsZ�H�?`fO���dՂr<�-�~1�\�Ԭ��<�
�x��UW�W>��*O2Umc@��ɧF^L����Q�r�fq�%+��t]�p��1p���b���4��]��r�i���Ӟ�
ӬJ~��{��6R��4]
��Ү,P��+J��|�8S+�%���Ž�P��l��s��c��\�c�W)R�H�[0І�x��z%�3�iN	�4��p*�[�X0�21���(o&
R���k#}&q��!��k3*�Q��d/n�9q��	4q�Q�Ϻ���@v���3�x�h�x�x‘2$�.�2�����%�iE3l����,Is�]*�֔�)PboYƩw}5e9v��-�E|.�D��^�!��ӯo����yA��q��E�&�q���հ�)��)Xo�[�i���g�E!�	#U�V�s���Z�Tg�-��ӭ�3��~�#���@t�Q�Z���ADa�.�5|CX���n�-�V��(�P�P���ց'*�X����V��5��Y%+|�R+�z'�"j�v��$�q���ͭ���)���a^�L�>L�+�d�.��R�ҠB�[��d�7��X��3��������*�m��LFkv�#J!)*�qۯ(�v<8g�[q����6CI���3�`8T���l�O�hsd���"���_��!�O�'#��5,�H����.N@I�	t����Ȟ���gzMj~�u=q�X��'sƌ��Ĥ/R�(��/��EK�X��^�i��b�h	~�
n�n�놣����q4�����O�9��]��?�1Ϲ�I�5��Nj���8.����r�P�	w���'�V���b�#1u�ɳ����=��K�+T���*nɼ��Ǟe��i�wvX�y�_|�O�����ez�_�G��������(l�?ҿ��Sb�Eפ;0��cQ�������l�PސGQB�37[��R���Ք������lTE��ϪʜD$� ����~���ׂ�`W��<}���p9�iz��ky�㒠��5,?��Eԁ<��wNP�?D6���:��v�e�a�
"9e��֫c:����E��V���@�Sй�n};�?���b��|U����ð�m
.��L�Ž����׾�c���8��F��ղ�
Yo�ev�@�ܱ�N�w�9Ҋ�
���E�/�N�7�\m累�!LO��\X�S{��\5�4�5d�u2���+��A7�3ʳ��f�G9!ħ�֘��`�	Q�2`R yx.�%�}����0�����G}k�^u���7n7�m�S삎�0�l4b�+��u�$=�4K�<��	kH��Id�zԲ{̫d��b��U{IV
����$�$,�Z���8�Be�P�_�?E���1��t� ��j�_g���I�IF���;7(|0��O��$��H}������#�'���ƒ�Ƃ�����������0�f�ǥǔ	�?��P.�R`��D,3@_`Ɵ6"4�mS�^��;ŗF�z��wш��ڨ���Ӽ�.a�g���kc-�=xazh1�F����3J�A�p|?��l�	�;�y�*E���yX�kvE��TLmL�U��s���1����a9o0tx�i��J ���"
�g�‘	��K��@�…��})d=''7O���*� ����L:��P�›���u�]��\�2Z�9� 置�]M����L����LI��s†ҁ�����՗��duj˧���0��	����Z޻����!|��(�>ٿ�Ӎ���?&���
�w?[�������?Zs���d%T>7p`�
�S�&���*�t�B9���Eg�|3L}�QFV� ��ox��b��>����hOs+Q��í���ć鮗�?�~�jc:�@�i�C~a�5`���>Ojc����BE/��i�ء�؍���H�eى���\"�gb]���]#��E)�
!s��j�%�tIdai��N�J�u�s`�m�
E\�id�Ӽ��U��YESq��8�y��T�䜮f\�^�p�����8@�WG�T���+3���kpG�����X�0[:��5n\���`tq�jg�������0�#���t��V�6{��Z�u�`�� �~N��yj-��^s��X

/q��q�.!A�VQ�E���i�����l���q86�����9�a�`�@�v�aVK��J�~�D"vdy��8�|�?�j��-2���.)�_��X�؁�r) gU@ϰ��|��a�o�Xhv��d�A�EX"B������'�f��KQ�5$~A���4���ʓ��Z���9@ᒢ��0�VZ�f{kkQ4��5�OA�!�������g��G����zߤI}�!�So���wl�!D��v�lE����>�r����F���¢"��F�r�nR�"�3���$;�/V����"��-�l��{B��ܞ����9�O�a.=AC�t��ɴ��)ُ���5@����D('yhU�����MD�H��l���˽�����'|W�{o��w��|���!������7�d�Ź�v�]����s�.d]��KhB9/�u��]LjnE����y���䮸Y.�M{��,��vP�c
X��������v���U��CM�n��r���۽��Ir�D�L=�J���ŽB��_ 0F�[rx�fyډ���� rD��Ϛ����6����~�P,N�p�;�hu�
֭v�!��Tf�ȸ����v
���0���ͦ$l�$�M+S�c�m�y�5�
�|�n�=�P�M�SJ�D���0	6��|�-��,
=��ۣ�f8����w��~�h��{�g8����EO��c��D�����%
��,����N�9<��B���#n�#p�*�j�(ǻ��
��J2��g�<���q�N�wd�%)A���0�d]��o�p�
�f�K�����2���=�S2OK�G�G�Gr�e���X�P�	NdN����E�4̗����G��ͱ_@@� �?��4t�36u�g�ߵ�_��P��]�毠Q�t�V#|F�P���Vn{Q\heR�^
>:S-��_GA��~r���Y�%�N&��'u�^��z�x��ŸB�T�S��`���ii�5���4�S7�Uw�b�X�U�8<IV�S���|�B};�SkvTV8	Sm������U?�1n�M(�E�	�r��X����j�+f���ۇ�93)�x�e�=�8n6�;l�^L���\a��GŃO�X�u��L�$S��C߈���`jz�R�4���s��]�F傉�]�]����$��ʁ���'����B�#L�Ʉ$RQaf+���pס�b��r�(��nj�'�6%��a���άr��]��g���-i��+��h���9ť�Y=�I��n��m�X2Y�ˬ�%���9X��^��ϗ����Vl�y���1�*_�ïV��j���l�d��2ܧ=c,�j�ڳm[��c�A��?��wQ�2u���d���^r8�j�E�j��H*H�*���������駤߉8�0���7�s�<���6'�m���:+��1�?8��ʎ^z` *=�j�0�v^�ݿV/$����T^��|���fQ���y �ꊇfȈ������.����\�r�)sil����)���G��LJ<�Zm˶Vw�C��b+�*
R>^iS"���}{]���S��k�#��\��v mSi�i��u�V5�bh����$R�.A#*�5]��j�

^�������L����F�ޣҍo.��u����p7`،�W�>��
$���{0J��%b<YB0�A�X�"ǝ.�=�"�2U�����/��C.�fa3GJҼ�������Wf#���?i����:P$:�s����jzy/,��l����Ͳ
E��H$��
��S.*�^�l@��,���!��:8q��L���T
u�UD\�
���{K��0��,v�ϒ�h�����GW&� yq��:�~�;��ڏ��5�߃V��u��û9: ǻY���*��VŻ9l�b������ �ksc�v
]_+ח���FUkԁ�F�9��zx���X;H��
�r���e�9#���5�n"j�>L��_1n&A�V#��=��d�����]���w`��h8L�a7,�~���~.�el�ý?�Bk���:���%8�@�>�%�� ����%��_�4���0׍�ܦl��;-�;y�bq��M��{������T˳�0���;J?"lK��Iےu�����S�L�N�2`�8b��JA.ȿS	6�D��^�A�Iձ�p��������;����W_�vѣ|.��
�:�js	?;����~xKQg���r�O-y	��w65ܧPA�]P_�qQ����:���
��<����T�8�1vs&�]�������՗nV_[����S�<��^�w�ס��|a�+����c��F$�լ�����lɛ�e�|�qd���V���F���|�}��������*�Tᛷ�����4(t�e�T+ae�y��Ql�*�+oA�<҄�4�*��p�������&p�G$Qj�J؋��\X��6�A�|/��q�)�7-�61+q�Ւ:
3�7f��h�*Q�����I)��|[��	��T	)��e���J<����o2Y91�j�=�
h<���|t�)w���צ�|��|4lmU�e}�;b���Rw�5,OP���<6w掝���������g$x=�`����Ai�fk7k�ɤHͣ�s��2��{o��s�kDō��	}�ഽ���Fj�[^��}����_��n��z��%�j�qv�v��y��;�a|�|��!6ڃ���*C9��FN��@}u�X	v`R����P�4�m�GGoR8F�]u1��x��ϫ��_D"Z8s��
�{��J.I���d^�TvYV�{�u�OU����W�oר��v�.��_��?n�U:��ވ��7��N��\�������9@�~zC���Լ�T�#��.�zf�M;�4,nX4l�4g,��b �R���q0v������G��j[����{�K�D^9�3z��ӧ�L�Wd��y�m��)!�(�𖱍ˬc��Z�����C�_+g��M)��t����
�T����m�P-�C�ģQRYxԝ-�<��K�5ز�ч)5F��ֹA�L���������q�[E�ɧfa��5����KN.QΔ�_���}рUIJ-�����8pI&�2)?0M����ߕ��JA�Ԇ7�+���$�
%�K��nsI���Q���kC!��$�cw�IJ��!��NG���au������Yj�vb>�q��v�)׹MjT�7}�	C{c8�Z��=f��{6S��"1��޴��+B�C�� ��zN���̨;b�ߓ��L�-߃�^�j�i'<������8'��������u��v�T�+&SŜ�gw��I�����3k�����۶��m���mv̎m۶����:��g��U��s�XUs�9Ɯ�k�X������]�
���I��x(�����癤���s�˔�̆�GtW�6;V��w��D28 �xXy�S =���"�
���ܪ,�I+�8�@��F�#�,&���U��P��M��$�J(�P��n�$N�2��6ɐnA;��H�
�x��l����7�pݯ	�k��*s/�p��(�\�������U�2��R��ʎ�Q��@�+<y�>c@����*���$�M�h��ܨ�Z�wߗ�=�l�I���N����L*�Qq��MP�?F)[C�3T��7ȭG�w��G�r��˝Y�4Օ����M-��cB�����l�+��"�0y3e�������]��''L��"�����"5��4F��oE�SG���j΋�}�5A�����Lu���"�a�բ;NX��%=T�Ȫ<EJ��X+cUf��Bw|�揄���46npc�y.��e�h,[x:��ԕ~�;)�hw�����W�`��!ɘ�Ti2���V;�P�c����=wM�Ɓ��bV��x�L���n����d{cn 
�K�F�6rh�E��!_�KW"������τ+���Z�>Ɣt�'��ni�,n�+<J��
~�)d���$��X����[�7ndY�O�S��CU׽8%S�/n �'��-��	u����oH�m�"�a9=&�%�.�R�B��������*VB�Ȉ�tQ�/�N��=����g�E���j͸�#O����ظA�M�*c>A�gUlo��QR7DN(�#!(R�њY�Q��RN<|��N�Ì'mt�ur�dj�%��u��Ȓ%F���霐9)��#?ٵ�L��_yf�X�.ig���u�PpEU?sJ*��nH ҳR���q�d~�[+Y̖?��fa&aÂ�X�,�`�̤���rāU���x+a�~�g��J�Z��k�qu�N��גx��Mf�#HY��[+�9�V*rT4ut�3<���{��1ظcj�u� yc$�.v*�Wk���@!)�5el���]��z�'��3]�s�JS;�N^��'`�Ǣ|m��=����	��ȅ�ڼ+�t�?YM+
���l�Q+�Uz�%�yM��bm
���
�䩯���墚}[���~RS�@�˖�-,�%)]l2���Tcr$��<<�=jĬ]�)�ۃڴ��U����aew�ܝ��mS�H)�'U�)���^M�F�i�>���H@��{�M3n^�[:_F�miN"�}�v#�EX�>SvN�Ev)����o*��D	���{�a��*�_����\�!�c��TЕ1��\�P(�����H�Q�Ih�!�Y���4�mM~!��)�Aj+�1��L�7A�b��PO��ڡ'
;'<��x\��l�,|ܯ�8� �ɢ��$��#5�1dž8b��5$M��`��a��d��9��%�����'���X!�͉�'�+����y�'^hk�FqlW��
軉�Li�-���cl�-��ߌ�$����L����vn6>VE���$�U	�h7��j�O����6ڙ�[�J���U��HxwsG��&~<:?��l7qb:K��*Uin��D(�YRϪ8qN��E�Q�5{��ݠ/->����O�x˜�6������.��a��NM���I�TI{�*�a���e#���T^�Y[Q$�I�\I��ZXM�p�,�[F��f�/-�)�e�MCa���>�W�
pC��ߋ�͘��3��J[�8?4��} ׫ƫ�)&OՆ����ÌmL.J	᣽��z֗�r��w$G<�/D-��t�f�]��4���
&�X	$����m�R<���)�w{��K�	狇2�YEZ�@��3~���wk��A�@b.p>�g��(����� ����I�_�P%��ER��	g���B�AiG8�F����L�xx���7���L���_�>̇X^})P}���(�����c=���FSN���5�����Pƴ7���!�I��h�I=4���XǙ���Cd
G�W��ʁzQ��c1���В�`Ѵ�� B�	q{2��|��N�G���Sl���.C}c���1�)�1��]���
�[<��7��)�A�41�{�
'E8������@��-(��Dh��
D1K+�� cTw\��0>����O�o脭h�乒����b��@V�g�ʴ$�yL0��P�Ι��
fCb��E(*D��~�z��}�,:C�D�y��y���v���|A�E�U0��,�I�U�d�J��E)�H6��T��W�eL��(�hF�P���+�wb��W�Ea��,�
�.k�cִmM�2�dԪ��h[����Ɛ^l���>٬���/���'���B���ƒ��i�Х[��V��h�ٸ�V�~%��䘉;�ײ�QmzB^G�+�hڶ_ayšqc�E��c��f�
��|�s)� ~��V�ب-7�n�E�vEa`��Ī�n~���`��ѥ���c���AW�A''X�W����l������5z��[y��R��Sq�e���V�Vv�Nj� ��a���|�n@�rޡ���MY���%J�9P.��j�W����&`9�!Q��z��m�X�c�J�O"�;MU��؀�K�9j���d�j*7)jC��|��z�M�f�����'��l���I&F���
Dc@�"_u���c��^�"B����M�`ޔ䎩���\��	�����§cdsvEƒ�;oW;@?��&�5Ϛ�̧$��8������V�=S���^�J�WS}m�;�.Cl,�Y��r�BoJ�w��=��Uz,�N`�r {�Z���k��A�t.�T_����7�2~4m�C����yG^AI(ǂn���qek�|�\Xf�L�����ʺ_t	�<��P��'�|�-�6�f;g�*r�x�]g�9�á��5Ykҵ�;Y��|P�3<�{��k�Bد4�t�'7�}3�u���{�=1��ScH��0�iOV��g���&U����j�)w�)��{DZZ=�ј��[���8�
���!�����"cT'�fV��o��"�0$0`Fh�p��A�$�("�FK(@���蚧L�V��F3�����Fg�q��|��(�\~�\
�:�\���S�@�lm���vtH̢ʨ�Խ�F܄٧��u#�&겲W�/�J���S�M(�,�V/+���՚���O-���դ�)o��
��en,#�I��!��Y����;Ψp�Y�ӕ�o�����cX�0�$��ؼ�Cn� N���Tg]E�
�QI}�Q<Z�;�t��:4Ƞ�_�!��=Z�	)4��uT�Q�"����bU��Rnh*;t>W�� � ��h��
�҄��Z0��R@bMlx�.*u�8d�ǒ�ٓn���WP�e-%�B�]g�x�h�`=�/��`Z����(�Y(�H�8���gm�0q�#td
�%|��<.��S���eb:�����=j���S"��w�ֶoo���49�����v�����I����Q�5�a8�o�^*�]��Id!!80����a�<$�e�6�����0��Ỹ$�kK��fq�IF�h7�
0sMf��A����g���}��̓��#��W'��Z'1o���
2q�ZB�\�}Z
��w� �"v=�R���џ+!_��
�E��wG�ڎ���MC�}�љ��f����c����q	�	��FѺ�7}���**��/Q�j��8�}�x]��Yѕ��#O̩���dm�]�-}�.�=?���\�p����r?"�T�3s�v�A�a��>�~�Q"�[�[��Ź�7/�@�͍�C�VƶV���wy��Ӛ��yw��0�pRQ�<���Ȩ!�NF�b|�v2�n{�B�r�á�p��:�_�]�۳ߩ�Z�����t��z�z}�_�!�D�E�/�~��I)9q�+G˰�rR�z�[�"ٿ1�
$��Oɮ�s6Y�A�1��%N���o���f�UsNNɀڍ�k�Z�^{�	g��D�phDe�dp�qjd�;�l3ߥf�a���;C�/�6�S5�rS
2�?�
JC��ky���/��p�]�0��Q�b'�`����W�����a��dnZ�B�g�9o�!�`�oUi*jrd��2R\�/fq�FciN`���dN䟣!:�1!�[��hI�=�:�2�E���n�7"�񚳔p����F��Ζ0���	<��%�7'��7O���|5��Gћr�w�}�m���q�_iir'�j"V����&W�;a�n��Z�x$�(>�3	�(�3�6��B�h��%��.��BS�M����oqp3���8�b�������C{nX��1
+"yU�%W�d[���f~����=�%C;v֌�,��q�j��b2G��<��wJOW�R�
�&�~�t.N�B�{��f$��D[�I+��Ɖ�Ӊ�
��� /5�rO��g�Kk\F�9���0i7�n�K�y{^t��U
	g
���S/QY�~{����L�\
��R06��kbd�Yc���e�����ʡ���^u�)=��H�6��b*��=߅��P����ΨN�.>��iI<�����OQ���h�3�d\$�܌l�������Bg�L�3��m.Pΐ��՜�5Qd���Z����e�xe�ȷZQ1�B�w�"��R�X'g�\~{0=_}a
�_Pr��I�[�N	g-�2R���u�Knk�)��!]�������F8:ו���C��z�g�y,���#
u߅��Kƻ����2]}��p�����귡H��]	=uz� �F8�bV�-Zl}A�}R���/3�0\}W��f[��_o�v廖�g�<}oZ��J6��Y����Z��J�NX>弘1|Fol�.�X�!�!wM,W�p6��A�u>nyT�oF������}����5���cˁ�f���St��ߤ����<���T��33��pt5��L�|�~^�rM	��OPQ�L4�����f��PTl���{sT��(LVi���m�B�G�$gfJ��'�O�O��I=��G\ �u	�>���62���q2��$,^��Y���L-��,���2�v^=����UZ�X<�^P����4Օ�›o�v���Yrq�7Zl����wn��I�8��"%K�Z.��<uM}��hS�Ͷ,��/�[K��ȳSX�p�'�I�_a�s`�6{&��͖t�O�i��6J翳�h��Z�K�n-1���O<�U��J�����#�ݩ�E�:S�@��a�0�W`'?x�Cx�7��؏����Z�.�X\`$e�nXp��K���L�J��@���6�Ihf�uԄ�9!D�z���)���3��*!��@�0��z=��9S|�Pn`�@�);�$�u���|v�"l�g�Mh��W�R�p�%Da9�Jx�~Lܒ�: t��֯�v �/k���g��i�o*�p���ט�]�sE��706�˷2؝Bh����nˁ����m@&C����x\�X�r|t�&oX"�d��`��1Xf��)v)�lʬ�Z��5]4�5f�D�g�����%�H�\_�X�9��0��{�¹Zw����}i&:���*&����v��+�&NA?�:}w�P8>ղ�(�a��U��ߝ�R&���b��H�L��N���l��B�U=cr\�ev�`��k.I���Q;fL
����@�=j6�f�'8�3i��S��!�셫=��"[���3�N�	`�H5�Gzި�%��A�\��-5Yf5�C�E���ARǽg�,������f!����O���@���O2�T_h*^�?p�H�ͱ>�l�+�J2lqpBh��[��Ҭp���W�4��25j�����R�%���N�� ?9�h˃��.W��}�zƴ�=�����+Q��d���$����t��y{�)��Vc��U�|"ן�F�X*��)	�
���{��:H�eAC��.�A?�DIftC�;�\��R7lYa�TRCj1�?Qt�g����X�#�W���[�@��	�0�����嚋�����P���@ڋ��
-�
��%wd%nb+Z�>�=?��S�s��6�`{�~	���("� r��[�I�x��"�,b��.�� `˿Q>�	tP�i�SGA�9��8�Z��h=%9q�;!)���b{RZ���]W��H���dGW+8�y���hr�q=���#�wz�ڶ����Ҫ����ኽ��ھ�+xSYr�씝z�Ü�zw��M��b���"'d@+�*�]q���	%�d(=�$�#"�Ht�9q�@�t\�T�+}4n�Ve��[ƫz�
7��N��i�Ɂ��t�!=��x��w���3��K�Y�J�;���[Y�n�
U�X����[X���÷�Q���v�B,��֚��Y�kd��{GH5L:^u�[�
0lA�{0?�T.B-J���x����}є�#o�B�Ҷoƺ�&#T����[�-g��.u�>���&���L�{N��o�K���/\��|/�[�#4<�:��˩ˑ��������ճj����V��	�]˜ft�E������G#m�{n~�E��/����w�	J�ŢWZ�t2g��=|�$vZ׈xSU�z���X��������GtW��MQ��f�	#�����!�~�g�9��~zY�
��y�Ϻ����D�h�lpo����z�]��8�[�I���jyFޮq���*cQ�_�	(��@���V��M�Dy
�!ׁ���S��L�r1�?f��m�� ��K�aK��d�e�
��t= ��(��&����I�=��OHA��I���'�\�k�
a;���z}��+��!���׌�ؿ �x'��Q����ԭfz�q�YZl�fȎ]���ec�Fut�N��yF+���귅/�L����o��a��k�v4��'�Ǔ�.��o�|?x~�ЭP��ۘ��O��P�����ί���.�`Dwzr���F�5�Q*�"�7>B��RH50
�;J8R��K�"�r����l�"�d�bk�I?��3+��7��*�s��h��c���-W�e6�_~EcH�PY�N�3#`�Ks�@=��|O�XÝi6!��R~W�
����οI�W�bʫ��z�cS�tm�[�ɋIDY�����73C���Xñ8H~�j�n=��A�Em���t�C��Y��e3�;I�(x�3�!�B�i�L�V8��f�S6����<�Y�D}!�Vp�[e��F5��+H�A�#G ��+P*�ʗ����3�Z�&L��+�&痌5z����]	�k�)OΙC�� �� n�Ж(�M��}����n�:[��9��;a]ld�(���ܚ^o�g}Q�f�̑s�C8&�C�!�V��%�l��&��hJ�l��NS�yD�W/��	�I�/B<A#Jd��j=��*yg�,��G�W�4�f�k�����&ۓ�tj_�0�6�@B�a����vN--}�$��r:�z�•��b%���$��:?q>b�qi�|�,*.1z�C���6˰̶Q�U���=��.����)�GM1�E��w|}��cA)�|N vw_�[$ȘLJc
��9_)W#dd/"��
�LQY
U��0E�ǿ�Fܕi�ɿv&��^�Qp�G�-4ANqCe�ˆ���X�"�d/u;3>\FZ%-f
��d��Ȼ�,?E��zW�����}������Ϝ����m��ИFg��$-��`$u�_��&���1��pP=���}Z�>�gQ䖮�C���嬫Me��:�u���v����4�b��4�z��ݾ��e���O�+�0���R�r�F]_�0ۜk�'mR�Q���L��ֱ�7��l��<��u���)��S��{^����0O�!�n�7����9�H��:��s����~l]Ow�_��v���)1��<��.��^W��;�Z�?��^Pã��i����^�pSb`��$���3��d~�}/�M��d����ph�����~�t|�.�1�ޗ*��P�igt�|wАx.+a!\�eIM�{bK�)JtHO�҄���`
�O�`y������U>����x �\nu�˥���*��/�1o�?or5�j+Q{,�[Q
�q
�� �Q�y���b�D��f���o����a��\#��~�i~��6U~���$?��Í�0,L�Wf�}�i�X0��!�cW��+R-Z ��'Z�{Ǽu5ۭ���m�)l5lA�,�v��r�b��ߪ�^�_5�^m75��ʤ�Uv[��:@�e�\���Ċ;d]؏�p�I�1�T�_{���G�*إ�K�%��Y˼rK�!58ի5��)�X�~��:��(̭[�����oq)���n�4e9P�Q�,�]u8�gY����~��=P�9�kOhU���|�zy�J���(S���J��i����ʒAtq6f�q$�)�<���97A�2�e/X��!AR��ۆ?̯h��̆�I��
�V�pIM�Oy�ѭG5�hꨪ�b

�;h,"��ƐD44�{W����Eqg7����Av/��~��%	�Mu]x��J;%.%6R�?�TL/0/��[��xbr̾�e�Y�Y2�#�!.��UL�69��	�����MFo�k��S��ŷ��	e.5�|�����J{��1�؃e��M��*�˨�.�4L
 ����!g�u�����ߋ2��$#6��?G�e�C�lT���Hk�If��ڙ�u��(�r*:��2$��0*5r�!�Y[�k�ߡ���pRx�	��3xy�b|8�&�g��f|���f��Ƃ�?�z�eE&i��T,L���+b�X�d����X�G=�E���[i�͌�E:��1!���:W#El��O�w�NV��'ݶ#�����d�e[�6K%�rUg/��b	�JKŚ_�Q�q��#�*n��6��v���sY�sk�E��\�m)#�?��F.VK8Ĭ�Q�ݞ��xM�E�I#�����Z̙@�^��{̮��{.���-n���n�w����4�0�&��N�7h7^�:O��RL1���-Vdw��δ�Yo`�Ek=$˹�~ؑΓ�kڃ��mZ�^� �,�д���&1�1�5lzSmR�2�<���$Χ/g��2�tVv��ٴ/u-q�&_Hi��3q�)���U�䧪�~׌�7)���b��Ӈ;��f�ޤG�azٖy�+���d��Z
�BN��ç�r�����lBgU���ɢv��i��1������j�F��8�<�#���=�v8-j�
��:%r�/!FrQ��7Ι$%p��ˆ��7ϲ�u�+/,;@��vd��RZ���]�I��d�]�f�΅�3$UG���&S͙�h7'�9A���]K��=S�K_�pRݲ����T��n��DQ��1��j==o`��u�H�M|ғ����o�c���f}�g!��\q�j{y����bj����+�-j��c8���cV�y�E�A|ʷ�0LґtR���D��GV)G{*v��BW��UU{ɒ ��̺�������M]�޾���2�����i�h��K�֛��|��	��=��-�[�� !���J�3��(B��`�f�lh�Nk�M?�o���xJ�3�?ފ��
:�hH����EK~t�K�wp�����V_�Ÿ��ƪ��H*`"_���͊x��V�����ax��}��U�ܖѽ#~�`���𣡹%�����arCJU�N�9�l�ԃs\����ΎQ���((�}���BJ�(#/1|G��PB���%��]R����+�4�T.�e��50�q��_��C�A����J�H��?������r@���矤��[����KZ4�����������;���u)�_��<�9��	��.y��
���<��������j��d��0Xy(d�Y%������GB���L�˴G�}��A�#�5�M�|�Yr�x�Ҫ�2u�cr/�vE�d�Y�{pK�Ho��2��-a�������>�yE��LCvf�7��N3,Zs�.�;��f�BC�G�B#�@�
^�v����f��z�̲%�.[�_ &
t��,��W�WS�������\����6N
��<��l���c�?�&;�:�#�,�*�qK�����.�rҨ�q��I+b��b���iE��Nj:Y0Q���Gn���^z��`p��O��G��z�c�[f�16�5���d���?ִ���#���n0�G��Fݧ`��4��6��ԋI�X��*~4:�z�--V��� d�	�:�9�#hG%	�V8^���X��Ia��O���~8HL
�_�v��z��U��6���O�HY��Vn�
�`H��؝��M��H��5:=i��5�����h����[��LUW,'ط/"�G�R���C�
VG
j$�!��qw��?B������Lt9~�z���8��H�I��}X�����A9A:%�:.L��,/t����#�G�&*����4�]	Hv1��r}�5��Q�B��!uR|k�9�7,`sIl~�2kmKbO��C�
r�7Hْ�7�>.V�d�|N�,���^�H��!ʙ�HC'�%qw+�h�}^��tKd|w��C�u�0`�S���ilT���=�2`2�g��)�@HND^��mZ���UK���?PF�3w;����m41q<`���z"ͮk	����13E�+��ĩ=u��gI�Rw�����o<�7wd�� !*���v���Wÿ���n��+�<����w�6�5E�xan�HzG��o��P�/(=�c��}O3�[|Sw��s�0w��Y%�Q6���8Xܫ�K��;��ה���4�`�ُu���#��ζ0}'����n�V�t�+�C!�k'껑����?G���1�_c�2��YWX���E3+-�Y�|ie��� ����ŔC�N9/P�V��]�>�Pn6��c0	���ׯ�생��/�ڐ%c��n$"�������k�	5y�2��������,O*���b�G%��*C��|�Ěka�b������3��vz�rj:d���_iϻ!��:�4��R���F�.ж���Q���q����̧��|CRUS(Y�U�D�Tz��P~�P�����0.b����T�w�/Ѳq�yp��v�	;D6����'�RaR:�U,��>ֈ��s��,^%&���ƀ�)�&�+��� q�Q��:������s��VOA�ѡ�쮵���hގ0d�k�*s�����jw	0N�Xۦ�]R*U��6@��]`��0]�ȴdL/EV�y��;����m�f�03����'z�n'�-V)�h	��	ϊd/9�!7����g���mUz�%)0�Ƿ�W����A�1�;�v���*���w}o�GwރO��&ej��-]^��)
U�F�{���噁N����y_��$"�y��Ddz�><;A�z�<���&܄�n����V���Ro1����[�+��T��'�}5���4�Jy�:m��
C��Q������`$�f kQ��8��e��0�׭:Ӝ�`�̍آҁ&��r-�C�jFxO����J5�7�Dh�X���������1R�i�hݑ�~ť�S����)���v�Us	����hH���r��ut�xQ������b�����W�j�S��;V[<��!DڞkWX8������М2�[�9Eݰ���٬����q	U��;q���É�Ğ/V��v�s��&������'.���b���n����Y����vC�\� �<���b�84o`8�w��_��"�C��u�)$	�
�Wq�2d��퓸�Ϯ���X;Hey}fuz�=��7:Y9�)I4�<w*Y*΋N�������s�M�xx?�v�Z������+߿��e�)���KS���rbi5y."�+��R Q|�HsD�p�VS�9/5�W�:u���?m�
�&mmm׵9��?U"���HF{�:�]KLL��9��%�v�n.D�f�YTLj���ib�ܓ�-�V�B:3g�	o��O�]ᧇ�����!
�f~h��.P�)���R4az�VM����d���v��0Wԟ�W�`��!l���?���=��J�|@�+����b��f&�V��F�F�?5��z��-�l>'v����g���ʜ�`�cШ4�牮w7�[�$aP���02�YVuPk+a���9A�l9�8�IY,��[|�ic�YH,��{�פx�ϓ�B�P5*���d�Y�[+c��E�Z�<6^OX�KO\���{t�}[[/P�eE�",ߓ�+��%
��^Ir����F�:,��+��}���핂���^�==Z��WXCW�\�z�86K��9;�t�;�b7�€-V�|L׍Ɲ@�;���v�7�j��y{b�Ͻ��h7��k�qɜ��3��湃�7�7�ěcs�Cߞp��F�>w�<�W0�o@����ܽ�ܞz�u�&wY��R�fh=��u����}.džݨQ�y�v�װ
�}��������(�(�q���f<s�����
���|o X�����1��D�CÕ�s�f�Y�w���f�z#���╋�#��.��y����@�ր�����C�{��3
��'p��+�c�^C�|N)�.-����O��.�ʞ���S�ts
H��n͓٫� ��J/Ϗ�C/��6�,��̈�'�'���4����$��>�6�2#�8H-��΢�n�΢�~�΢�>beD	�΢��Im�iW �^��B5nk����<wy� ���M8-p,��������rȩ��v��<�(�]�
��B �q-q	������'�Rg����
�Qo����B���l?��$Gg>U#�RI��}E[߲��n˗N&Vً����DG� ���<J�^��QB�u��/osY8� ����1X^q��	�셼�;�i�4
��/0�J�ӊ���ÂX�I�!���\�Q#P��D�r~С�^���)g8l�Yۆ�.�m�
�,2k�f<�
��D�a|Ӎ�Sf"������X���kf�K�1]�\���=J���u��·a%S����N��"�m�E`H�WA�÷1@2�� ��BwM<D��A�."J�ܵ$[Qo�F���
�)�>A@pGW7�X���}��-�3�<#���1vpV�B��o�4�Y�a
�6�gh�����2��]�/���ٍ��A"�ai��楡��}�G���!M��h��ë^�%J3D�H
�A]H����&d܊����a�r�eoT�	e�5�W)�l��lH�����E�B���4�m�™iJ*Dȴ9�µ�M��xTi;��]Q�V^�r���C�db"�BU̠��k�#��ф؞֐���"k��i�(e�g�a)�`ܛ�V���j�(����\A1���|x����悷q��-*|�e�:̍����M�s��;�D�hN�D����M�"#�?����=��ux@�5��1H�z��HEW�
XO����JB������E�3�tŃ	W��

����J&x�ϰ/��Z�c�*{g��*���A��QB��i-/�F�a;Z�_S��Mݒ��*m���%E�0:�s��.���r�(�����uvO
��!�#L�M9�F(r~>6���p?%�Id��$�eo�Es�$�8P�Xy���2�m�+���� ���Ʉ{g.��(3&;�
��p͍iW��8]��EY�Ry)�ըD��c_�l�q��&�QI)�����yd���F�u��ҫ�:��:y	0��-z~�"�g��ᇁ�UT}��66����xQ��}#�j�Uȋ��gvAȬep�7�W1R`�ӥ��~�S�]����|,7���	�0|�.gw)"=&LHa�"��A����}��]ڣ��
3��}J��p�8��Ay!��!z���ЛM��Sh�[��ONa��$�ʻ:�G���8���VF�㌰;%2v�3*`���$	)�͕�b7�3�G��M�&'�ܶ
�6�t�`��gכ�\�nu$U��
�y0E��2?�M?���k�~���s�N.�G"%@�^"&��T�Ʋ��E~�@�R+\¸N�~N�A�	s�ָ��|���8�]�̪�]��;�'?Mڔ���?�jA��ܴ�Q=�͕4bi�5��<�������'���i�('��-���QB�\�z�(���␖q�r�>Q�h��ۜ0��y�-���w[|��5�B�̐����՟(;05��6�_�V��f[�
�1�pabFqB�{���Ƿ^o��T�w��.{��	u�b`z����9�=�Ԣ�(I�!34��{����z�v|>78��n|��:�l�:@~�Ȅ+*fN���LZǞm&���$�
��T�beԣq0c��d7�̆@�_���-��>����=�Z��B��{�����4`�+� �m�eꟕ��x��E��#Bw�����66-��Ϻ&.����quB�x����ø�G��j����e��22b���;;AJ\��W36����&>Ɓ)�X�K�R��<�WFU���b�C{\��7�D�U�W".ܜ�[�GP�OCN!�4�)01�W�0Ve8К����GJ
�E&��ɱjs��E
�K�GDW-��v#^
��t�gɬ�9l`A.�@���f]i>�y™ҏziEj[�hD���;��`��~��`��f��������E4�"�湖�cSi���k�~���n�dd���:!�#��$��R�$b���CH����p�zw�g������r��B�?SU�~;X��t��䅑:���NO�[`%���!	a�'^h�Y5��jq(bV�<�0Ol��)�FOfZ=��i0F��k�.?iT0_}S0�<)K�綡�����}�	�س8,Υ �s�"�
V���œ��uQ�F����	�!� ��a/��-���A�JS�tfXF&�|�#���N�t'6�56j�5��8��6kQ+>ދ���%�����A�����[R�U���K����Z�@	nC������(;]s�0�!c5VhƘ�=Jo�k�B�H�~jk{�����S��+Y�jJ������^�ezz��u�G�a
���R��[O#�P����a=m�Ry�#�c��/��Ȩ��i/�!k F�#+W`��'8��Ïp���ɷ9(S-!}�XP�%}n��Ĉ�ECT8������đ������浾�yu�����?����h)�N�X�=��#�4q��<\B��Aa`��΋y�W�KA��N�8?cx-�[���Bz��,
�Wux'���8�{U~�����KW�4Z��+d�.$� �=�!u��&*��0t�x��ɼr�P5u�XR��L�At��*�p�>�Ԁ��5�x�|�Rs7#'|^Dj9���1�0r�(���M���Zl��\8����Bb'�&���+
Zc
ǫW%-=F�;�9IçCl�I	%F��be��(÷�v�G7�Q�/��kE�Y��y$k�������%��Yig�ڄ�1J��u�/c�K��p�kH�.˝jXa\5��/�H�|��X��E�(y�]���5,cE���ꮧ���7��˛� zM5�4&r����k�+�p!�C��ͤ6&�L��>LՇ-!�&�@�p:?��������q�^��u���6�Yc�_�A�k���O�׫:�M}y��
�P��xri8	�&d��	�6�����=CLתcY�`���l�^���K&�jr���G�oV��M��T�=�%��&�ƴ��5����]��9�
�r�FX�+0P\9��u6��pP�\?'j����3om�&c�F�eٸR�?����$�`�R��`|˶ 4򯄼�m牪��S�����s����=rB���-�xu}bꛨ���$��3��w�<�a�qm�G?x���S��I�"��
cSOi�3
;�,�3�oп	�S�*��F/T�ѡ?,�Q�>Ѡ�p<����\!x
�\�@���@�2���l�!q���bמ�P:�'��Y�sy`����e����^�e��H��$7���@�`�r��ջ�-P���'��f�T�ֆ�6�ԗ��&A8ODK+G쉱�qG��gzR�t&�e����eϰhOݣy�w�;Xrʄ��p1�!Ӎ�(=8,
��8�aMQ��
����gd���w�O��|(4��Iܐ��Q×�U�A�x��R�ìE�:DrS�z_�OԃQ!U�D��_�?��c�.@�%ض��m۶m۶m۶m��m?m��޾����N|�3Q����dE��SqNr����Ơ�#��'9���ʙ��,+���Ab˓�� �� +z�������r\09�A|:Ch4�߈���)�J���/��/B�]?14�D��1dz���6J�C�Bјk��-h��aK����\[f������? NTBm�'�O�A�/n������ot�ڕx�_�:��.Zb	n"�`R&��#�j{����Su�zw��=4]=���|&z۾$ o�{��8�ݑo�~���E���ӻP:��Ǒug�8z�Y�$CN�2��c�d^��\#.���d~���$��>n�hS~�_ޭ���G�ˏ*�Ğ<)�������c��D�Q�=d�'��0��cAd�'Hn� ȡ�c�?�qMÈ~t�p|O�ȇ�RO�`�O37��	ѡ�(�%#�c+Šk�=�^�Ib��C+g��5U�DX�1�U��
��*S�S�R�.{�7�d+n��$i
6�����o��n.�Ã�ι>1��ԟ��������&AD�!�GyaHtT�4���{��'�`jUI��e��%r�{E�tBI5MW�$�-��
�m��^��f⣰��!&���ؔ+�i���o+G�Z�O���ly�Э4gj$2RLj)���j$x��g�dp���HC>ߵ��2.�����QC�M���'��.�D3
/Eg�dO���/Z�꭮��8_&���U�ZrX��b\G��;�g˾������3ʲ�[��t��sO����4+�}��W��u���F�]c�$Eqcή	�4G�R-7�>���7�O��*W��@�"yٜ@���I�%G��S>�H��}�w���չZ$g���?�ů�v�WU�I�aq����ĉm^��q_��d�aX����%N��
��B7-Ju��gN\��@g���	����gg��N���o�U��_����&�/�Y�
ZtF����rD!�L����;�s7Wcg���mp%?7�ɂ5�����������ŀ>�J����3��KśH�
</��qB��ex��e�,����
Q7�}}Zת���u��w��|�[ͯ��.�Y9Չ{�p
D5����������>\N���*���H�ܫ�KDn��ᦱ΀�+i�V
�-�O5���U�դ�&̇(�1+�)g��ӌ���tLyE���U`!M9��1�Q݊
�Ì�.b��C�$�i2G�J�1鎐Z��Q��ŀ�V#�-P����R��Q���X�L�S�-XR1��($���������#
����9��M��;��{�a$�	�,!FP��O�8�5��G\?����Ж�������[D{���+��Ţh��6�0�D���� �7�S*��'.�G�;$}
ޢ%�،����K��l�yV����w�.O!ޢ��mE���C��e��%�m �E�'淰졔(�/3�Db�
�
n4�h�H�!�gŬ@2�;Q�Hq��Jʍ��-}2��� :;x���U;�G�Q�p���b�̣����OoH}�g~BhS�In0$�.hV�:
܈B9#:�8�4��p� �}��7���K�	I.��Wj9���S��XV*�L�fZ�V���T����d�^����Itj��uz��7�w��n9A�?	��53,/H�3�*2�k�Ԅ�&���X�8����x#�w��Drp'�G��-h<�u�B��I7��=��1��k�o�W�L3Kc�>�������Bn�^Im��1j�:��U?�Cm�q�b�=K�Ql�#�.omp����3w({���4��Ȱ��xN��h���u��]�c���&yH��1��XO���^��k\M�_qO�e"j������_�
�iF���c�;�oR�it�l('�"�!��d3�M�B(�bV���m���B�Io�Md1�C�Ol*�
��M���	J�	�bڣ����K�G��	zHC��ots���|��&��*�ͥ�,��6�
Q��)[
�r�K�g&Bʰ�(�eI��W,c���!^GPU"Pʤ8gVw�J��%r�T�wyd(%Ä;&2'eJmM��]�P�-�vͺV��O��HRN��<D��C��)4�f;}�}�̹��������
dbOek���kA����0�6]�{݃Bꚰy���S�=�]�\����T)����,���c��7g�Y�)������.@Z��SC2фW�w��Dr�&dΪ~��sFR1�o��r�ǒ
�f�}bϧCo�/]�h�h��!#Ao�e[�����{j_s<�'
(�cz��Ч�P7�}�y�X!�Q���}�Y��EdK�.vQN�f�hTc\�_B�خ�2���=gRʔ�oסąp�V�/���_���kB����p{�J���М_����P.�>��[z�#m������2"���CU-XbJ�j3*��u$K��+�HgḥX��Z���o��L�\���슥l��2$�elB��5i:�g�0�����z��_l�+:�~�;.L����|��vDin�ى��>�W��u)�o�;j
�F����II��$X�^�ie�^6��\p��~��ֱOҸ�"��)�$Cj���>�׉ܝ���y��*I.�)��eH��+�'3��m�O��y�!ȲM_S�(�5e�ȐX\�ҕ��1Ra��C�����<S���R1�D�i
s[��<˦�i0���l���Z�8�ӥ�۞aukl�07���[��<l��2A�8՝�b.P�.�0�Ͽ�!6�NX�i�(��'L�C��x�����6��S�@=$b�@2�0�(��u�-��rЀ���d̒��dŒ�{�i?�h�84F`��Wn<l<��ȡېHg&�j�c�g*Ԛ�ai�5�<�'���9�W���#5Ci�(fߟ�A�y��6��z��i
�����W�0r���)xgS�I����\l,�0���t�ZC��N��C^l�7�,u��@���N�ds�,�a!�l�tNgL&fg�`z��w��T�
�f�qU�x�t�0��
�荒���o%���:��ygi���z���B��@�e ��>�ʫ	F��+IG�c~�k�iiW����m��qr�QT���J�H��j�R!j��yF�秨S����/��1�FvLx4�-���q֧�&�o��N����N�V��+�Ǫ����b~�a iT����9O�m��c/&�\�E
�I�*�4i�J}P�(�xZ�BF�����
Y�2���>�{t�l��׹�HX���)�ls��uK���iR��vAɬ���sV�z1;k"pӁ���q��jz��{�}T9w_�˙ ����
n�=RfH��-�����:�%���R��V.�-6\���E/��Wu;�Z���q��� T�q\G����]|>vsM��6Lum��Ǜ�?�R]��\�e\x-������_�Iq�':�{�Lc�G_�>�O2�)��{���T�%M+_՞�������tLy�5ܚ=�D���o��"�'uּ�tSc���~�!�΢|Hng����[3�Oa)�k/}Q�W���Ɓ9%��oX��v�ᩲ���re9��:���8u��	��9�l�fs�dEdʷ�����.����~v�-�*P�A���"!5t�<�m�(ā%�-J떭��+lN�����)����QɤO���b�k�fy/�g�)Hƭk�gߡ����Uy/
��v�¾�p���ȴ�/ ET~�w��OY��!�L�Ԡ�Ou}��O�a����Np��
{�+}c�G��>�>%�sQu��l�/���;�TJ���k뗬�o��2�ȕk4��
і�x�@���
���P�@
zU-�_����H�u�[�� t�j�a�z��Ή���%���w�1;�ZuVc
����}�I����L�i��H�c/�X��N5Y�������us<��FÈ�k���(�_7.��d��]��o���N#�מ�%��Po��|-rw�����]u&]�BM���5I�4[&B��ы����/�z���_V�o:6��j��;%2X�*���++�aJ�7vY�i�Z]�0�����a@�g�2μ0�v�e��?�G����ZK�
J~|��_�Ȯ�D�k?Vت��p�v�3�b��3!vّ&}�JrؒU���)I$���U���e�E�v��ئy�4h�?RMt@��,c.Ȭ�t:h�@���e��HsYmj��3�'���V����(�@�k��A$�_\�U��jց�_��un��q~}��9�x~���uo�2n��V:~���o����	ӡ�[�)�#g�#��}��d7ld�;%�n�����_z�}v7
�Rv7�S�7VN��=Q�ynL�/.�k�J��#-O�݈�5���w?�[���沸V�Жc:�C9����l0d����V��-|�?!�/�������ЊX(- ����ƎϬ�����1��$�~y�j}yw(K�G���[�Ʃ3�\//nA�Nʑ$���d��/1�R��W�6�H9G���}H��O�V�kr�=ЈὩ<o?����V2��;DW������05f��f��n���I�˴�3��mg�X�A�T�����&�`����C^(-��̇>�~�e?��Ze;ZQR!�c!��l,��RF���3p�֡U�]�Q���ԁ�/Q[�<����e֜m���M�� ��Ɛv&U�Ρ�C&���n}'nk�I��6��Q@��ߓ����mD����$��ߋ��>C/9I?/Џ&$?�|H-`J�޴�cܤ�6�R����4Eio��Qo�xZ@�#X��Փ)������v�8��I�;cj�~��;��{�ۤȿpIW�'oA9�9Q�g��sI��+`8��������=�X� �;���MC\j��ra��]:���Fc|9�B�M�d/
T��:�n�_,4�����R(_��]����\�T^�0����.�c�Q����Il�//9�V2OKVv�����tubKe=���Q[���P�1�8��j��Вq�jci�e�qY�9�V���.��1Pѣ4|h��܌�Z�9�|�9�`�{2_�{��PpѸ�x��#�#������+S�!�;�X�����2��z�����H��Ξ�Y�z�AȌ�N���&Y�Y��ڔ���b C"8W�[�_�US۠}v��-=�xiY���h�S���U�����T����{��ڡG�\O����v8��w�+՘�������5����R��#`��j�=wtZAY}ɋ���+��J)��#%���N/H�A�1ߙ�=�w�<��`�5\�[2z+����t"�b��ç.���<��e��%��˕1<6,3������A����қ��#?)x[��g
s|�h��y���I���Y���A��V�I��
�~����3Nŋ���$��{U�#e�z���7sV�(��a��*�иkdK��SF�E�eK�� �hJ���F��$o}���ǩ���['�Ӑ��n�U�Ã�ӑX�,�Ј����w��H���ݠ��*���P�SLX1YB���<��iht�^m+[�h3�xEZk|��"$:.����x�2�,�Kt�x�0$z��?�'����(�?�?Ҙ����'���Rh����A%�چI�*�Њ]�
�)���qo����A�R��6�]5������J�g��`Mt�,K��fE��*�b��6<^�qN��»C&�,�FaAk�6�n��	FUg/�؏���b��ھ͌&_���"���$O�q�1��;)H^g.ڕ`�pal�μ�R�%�$��'B����)�}��vU�5m�Nc��/4b�rNX�8�RS��X'���f�F���n����n�֌�n���nU:
{:W��Y�s��3��Ny ��$���UΰB�2��:�G�A>�,QB .��b��r��ژ墴�=�[m,	���~�+�����P:��Y��G����H��$o��6w�)op�i�4m���25C�ɠq���/��{�q�v���q�M5y��>�mYNa�g�i�!A�>ߋҨ/s�D�@s�'�%+bK[���ˉg��`��cf΢e��O�����d"�T_~�ZX�$+Y/d�H˨j<O�/���C?[)�T�����@S]qq���=y��|�VZ�ssܪ-炣� .}��>R�*%@ˏ��B�i��u��mg[Q����72�V�uīfH/V{�Хx�%
�/O�[�y 	
�0�M}��h�
mZ��R��x�L�jJ{�
�+}4�D8�32t���8�n�9���%��ƚ�d{z\�Rb�`�2?���[�ּ(U09Ҍs~�{J�B_O(��av�җ�v-�>ڱٕ�}�~�h�����.I��*���nNT�XC��SWޛ�W(M�ͯ���	/��|�5{�)�ߪPZ\�z�P=�&G1Ɉ�C;NR=���r~ꞰÈ����x�|�$(�@w�U$mK���YGӱN��|�w�����;�!˕^���w%�F 6��oJ�bc�(��������1��$��')����y(OkH,���Y3R~p�w{O=I�/w��p��a��kX�r���X��m�F�1�G�FEU*���y��M��Ǒi�%�pG
���aoј�1����1&.pQs�$�#�ޘ�6�J�A�@5�ğ��&S� L��(o�XNE=V�B5�H;W.�����޴j;($�,���}!�� mab�?���m<l�c��M�2%��l����.����p�����<�8��`�b�Q��"X[e
���e�X<�<1[�*�E-[b�_��SO������ދ�����ߛ����8&Qo�(�K䑰1�H�i"u	
؍�j�@�>	�*I�o�_��L�f"Ό:��S�����B����uzB�n�G�?��o�b0<�Ɍ�7�e�IZq�[����[���*w��^�k�3k�[Mw&�U�f�MR�X�!�u�/�ɶ�Ր�;-�<���!�B׵W�֨��bw�ճ���Mw����ǩu�!���~�v��9[�M.2���Qh\�ꍮ�\C�?�[[-ή~KR0�s�SNa~W�
�T��ADŽZO����Ej{�l<��$&����	���٧դA:`\�T�}�uA��8kN71���?�n�Y���qL����h=n�Ol��ΩI�d�,M2γtn��W�7b|�р�����&6�\�ƩJ2�[��ԔTj��g��65�����=&�<���cuw�]��	~Z�����*�#��*m��u�Gf6��t�����%r/|/u�D>0�9����{�z=H��&��H8%y����D��o�爈���l�5f�ov����-���R
&���;Z��
��%{�FX�o>-du�Y�b��ЍvS�p�#u��L�j뗷�	�M�8�7��.e�%�^}vq��|�*��Iu�*~����Y0����b������U[��_���v,�)��=>��ɔ튁B uo%MH�:��i�uz�$na
2L�>Ђ�/{��Y���b%���p\���{&�P݊CoRފV��3�E]ȋ��y��,JP�=(��]�i�&>��QC@�b �o�� >���l�<�Nգ{��e3ؗ�~JN(O��g��~ �'��lV<B��1����(mH�ӏ����"L���T�� �1��j����8kG˲9�d�;Z0J����D6�Y�
�+o
��i��_�����`�}f>��������"^a^Y�1x\���Q`�MU��=!�K�T9������ab���1A?�+��T�)A�(�v)�z�O������G}�d�943'T�Eu9�rG/#jaCݿ5����07�n.�IB%����RA�z(,�9S�=��:'���0a��Tl��[�!d-On��7eż���7��m:����_Qz��^=�HxZR���3���e0��am���-Nb�4��ӥI�I|�[s�r�9�?y���xnMQ@��~���qB`�!���?񿲺�,��'p�0;���1W7����j��o�#��7���i�@R"~3��+b��Q�N���i+�fo�fS'4��[�Qg�'�
��6���R�Ŷxd���`�E`�K������Df�1iS��h`(=����X|dWj�Ҭ�Nf��i��Ả�6����?ޅ~�I��/3�`���\�\͸�8�q�������Zì�\��֠y��\�?ѿ����BSgٳ7�����@'ny�v�U��sXߘ��a6 *�k��0�z����fK�Ȼ��9�'�W�|�`�:�1T��`�~e~�$�j�5�;��\�l�>��:qSm�z��Vb��J�M~��1+��F4+��
������+��:�
3�e��r���Q'w���&5��e�Е�NS�{���p0�D��@���>;U�nGk�<'@�F�r�c��X��+ �4u�=��B.Z�6��5�{�Qu�	�	�&KT����?���唑�r�J�-�Bk7^�aM_5$"�����#�!���U��ZQ#>i�
t��S�z�?��+�eW��,ݿ!��y-eJ��pf{
Z4��$7.FAow�ω�����<sP�	��}JG�g��c=+t�q�>p��pDaPK��{��ñ�|�*$���<�i�•�/�ƒJ�����!]�o0|�i�."��G���ϊKl&�VH�ɔK�+�M0]�S��������P�an���uN�.lt��y����e�zE��
�Ek#�"]J�ǫXP�}Ӳ)�h�feI���;�������Q,���L����A���^��{f�$$��'m'Q� [�VĮq�Kw#���K��H[�zl��K�ʧ�ZefX����þ#��F��|����(��ğ�����ȴ�Pd�B��^F���z���"w�T�XU�l���{��EJ�UX�}�L/���3_=`m����+���H����1т�������VGСx"b?m���wʥ�/��)F�cz#� ��R��Q�%�/���\�uH  )��Y^�/d�=���]-LԜ<\��!-Xo}-������I2<;{;ܫ�Ĵ���q:��xs�4�ŗ�4�'��y�N1��`x{p���-�j�֭�0���t�^��
�Q��
wb��A.��rT�/������"���͢D��Z�W�Z���r�`��S?�c�є�#i�@9�B��;�����)�/mOx��(8���Y�r¡��$�8�0�D���'��_N����K ��fP	>�������E�h�t��)���g#������ke\��bR��
��C�'4�OJ�7׿�)��%A��$��ܡ�����&A�����c�@����OD���>�/�߁��7�^�Bo�D?kQD���}Of�GT�?rJ���w�>k�|~P��ф�m�l������r�ng�1�8�0�r�9S��!h�d��L.aɨ���{�?<�-�����9�9U�����0 ����37(�fF}C"RZ%;�Q����#���'�83�N=��ՠv�nj|g��V
pd�!I���/�I
���|�6sX��n��2���������܎�X���A��s��踝�	Iͤ�ﻄ7)gi��nHg��f�?}��1֌1�U�I����]i�=�V3v�?
�3_
�
��>9.��甘���q9�$l��Ey��ěv��5yi^�p�b���f�*��43�����~�$�=A��f��T��
>S����t%��u�c
[�0}�&I�>?_��D�w�?(]4aI+�L>���9��|��s8IQ8��0�Z�n���s^���q���S�ݎ����|�,(�U�/4s�x�`p��5|/V�x
��!�z�%)M�KY�D��$&��%!F�M)��ԦF�3a;�El2)�i��X-(��-0A�r�����$=�OA:M�@�p��E����\KO���� �R�ݐ]p�t;��"�A��@o��!��� ��nn/,��ʼ�'�A>��W@#ٱ �hp�qm�����@&����郥>��6�9�ԚE=��ʦa~�z�+rmBP\:��l����c�!kt>�vw֢
�'T��]�#�O������q�Gv	���VŹJ�:�@�:�����U�jg�\%�������L�ΐv���%�s�<X�(&�c�l�c2
�ʂ�D�XL���\�NI� �,%9�N�����hMY�jT����}04u�(>J�#���a��aE�� �E��	�
��bRE��ȉ����<�jEB>FCm5����D�w�����Y��dbB��T����y�8h-�N�@�Qr�ܩ� �W���8'Cd�\D�:�rN"@+���)b�'�1ަ�D��EiT a�˿&[�^������×)�}eDi2s�����k�peV3���'_<��<�¡J���t��~�sZ����dTW���Vvf�2�Y�G���\ǃ�`�4�f�КƲ�+���D^�k�ś�@Α�T�Z��x3){�t���;��.��Ie±i<׿n�����H7^ѰQ<�֮�-f�Q��Nk���|�VM��F��4�}����_m.t�'��αh����ۻ8�e�>u�8�SnΒ4`oZn�Cg������?��A�J��-;�w��G�>l^F�d�Ɩ㤟`�`�����O&�(7_��c�����M4��b:*�!�.�_4���ɪ����?�W��c&���,���4��_J������`��0ʌ�z�2�	�=ѵ�7��j����s������]�~�	x
K���=r�z�p�pp�|J1I��I���>�)w�M���p��Los����D]�yPT��
�H����1O3}�^�+�wӭ�!B��	�.�V$��Ar�\�QS�sv�!LR=�F�M@����#�Δ�`p�H�>��]s=�1��I�ϝ��j��b�^(��L��8<0�_���q8������_�! �Ѿ�3#�Pz�%�m�6
>x+zẚ;2C��Q!>+XiN�)�na��r5��ïc��~�̉��s6�Ř���"F�<���U"���yf�b#5V���vI:�'Me�t�<	O��V\�1>�tLe%B[�1����V���Y�=5<	��oF�n��ۍ� �f&`���ZF�hxMg��}k��Ѝe"�N1��'�t$`���C�7P�����_��ۍ����jT+>�F��7��M�E�_�0n7r�'��Is�����0<"�Œ�d�K5���0F�$L��A�3��k��nP׷(m���ǂ�#HD�c���#�F|Ҽ���3��jG�6Z�6Zcs��գљ�GUS�Q=�|թ��G���.N<�U7�un�&�˜F�ty���8xPe\c �T�?�7�f�wl�7�̜R,��ѹ��!�\���Tt�\�� ۞SnD�/$
���/f�;O@a�||�|����Z��;���W3)N�D�(��L��u}�vu�/���⼌F]34V����8�x���a[`]��cN��c�ʼnx��΀X��]����r����� ]q"{$����D��B��!P�1&lhs�N�N|�I��Qu�������l��6��M}�_��.`D�<V!h$;���-���s�O�J���e����F�=�б�E���E\���yW��be��<��1�^���6�F�ٚ���\s�
X6�8e�ù%yQ��Ŭ��O�`x'���̶�	��\���N���,[���y�oi���т����<kd�|q�Z'UGnE#	���O^*�/w�~��#[�7�_���^�3L+4�؂b��c�˴��.��F����8�f	$\m-i��������*o:��ˤ�
������R����F�b@�|4�G@����hw!��<Xb
���%�wt?Y�G2�	Mx��I����e}�~�&e��v����-Z:�Œ�-{�TSN*��u(�:�&Zv5�\g��h�s2�|��[9p.|I���԰?�h���J�ɀ͹����ïS��
Xx��`����׾�Nd|�eJ���0��VE"W��ɖ�;C�1e�
˺�޳+j炛�u�(L1�c@�Tk���/U����:�UȝA�����˭�#�C���"��s�J˿�LSGʕC�l��:j�P08�v��_0`%�_IR��+�Rx\o(���VϏ�V`ťCv��D3V �
xҘ�gP�gHx���H�W�I��" ݴ���Kk��J�+�Bԥ�c{��^y�?�^D�e�%���?��U���Sh?bo�k�ۨ��|GG@��K	QT��m3`��̲��#���B����op�ۆ�=
�+1o��~�~'�!�)	��gh�����
p�i����b�9@�U����a�hw��i[��Lf>�WB�W;� �	��ze�Y�u��4@e<��ż��w���:�Հj��0^��/����r�r�s����͓ԞQ��l����ܖlju>9��y��9R��J�9��Wsc�b͵��3Kû��YrX;�ˢ�M��-��n.��,�9�Y��˵��-WPc�s����)P�fcm��܅��C���*陛6�J� U�
�0+C�)���NW��<X�p��|2N?핬�ٻ!*9��ﱨ�'��#��oǶ���K�7�=O�(������5�Q��sA�;c��5r��sC{.��Y!b��xc/Zk�*�ٿ���]����%�?M��.%���ΐ^���;�mЅ�W__��;��Lc���1F�d	_�����+f��$O�L�����o�ì�t�u���n``,�j�눖SQ�e�З���qn�r�p2���p�����!���Յ٘��.���1��Z���}x�9�����X л(/�y���:�(y�y<�9�(�����gq*��𓆫��D��b�da�V���P�H{����Oď��s>dd!�)Gݞ�qFql8��a.�ׄT�����{�����(7r��S�3�A��y�)��!㫏1��0���	�׆�*�Z�fV^���eF^Z���U;����{��\BX�i3~��35�	�n˜M��I"�ԑ�	+_.�1a��5�d��p1�����@OÐ��_�}�g�&��%:���;����O����Z�ߕ��A�Q���@��f�g�%̇c�w��Y��"��l�Rހy-��l<����V0��-`$65ǭ*3_E�uIT��%,�$���
1�G�x'�c$rRY�P����_G8J�o���e��̏�.�z��-��+�
�@&�N�^影�֮6_�[wY�@��^;��!;���%�-�k�94_��	��iU5�AL�N������|��o�z6^(5�P�eg����J��P<w�#�2'�"��k\�����-.D�ڈ�i|w7���j6G*p5��[/t��-	RJ�r3�FJ2�&{X��ꙥ�&n�'9+�����W�C�e{�d�ǐS�'oG�{���O*�Ay�b�W�hJ؜l��%�g�����M�{�2�4�H�2���_��-���ɻ���*��'&�h��
�s��]h*�Y"���Q��e�"���^��L�����B�a���&�\��,T,X�El��e'�&$��#>I���X�D�?C$)m�_��>�qWQ�b�/n��Η-߷�S�	��ѕ�G�7��eKZ����t�P8(E)�Ѣ�G�avh����<�޲����nK���d�aj�%�8�y3�o&�Ր�5"����je�8F\�
0u*	X�9���1縯\�`6���j
�)�iz�"��J�
�ܢ�k�v��r�ӘF����6X����k�X���'�i��LfʼYs�J��N��__i}�7P�}K���;y��C���P�;�.1üZp�q���R��W��`�GX`���WQ����Ø/엣nh���d�&�c�ɱ	���C��z|���)SM�a��CcS�ӊk��T�1�����k*�.h3!�ˋ�#��1�'�F�I�V�Z�3��I��(b��)�/�κ},	��Y�_����S�欍*��z����O��jk�D�S*�e��N}�#e��>��w#Ne�g�F�!�"掱
�!
����#�����P�MI�D�o��5�qV�K��H?��5���k�T�>�0G6[wR�=�Ū�Q��M;7�ڄ��t;b�9�j��%�i���L|���
���te�����.�G�W�R%�!�&S�c�f�a_�?�O�-����J��Q�ǻJX`e����m�~�lx7܂N�ua�{C�6���'�B�}D���uԶ��$PJ�vo��c��6�`�H���27��Y����U׬�DZA� ;!b�0?ꅆ�`�0���﷡�iY�T��oK�^a."LX�
��ޠӞ(���I�V�啑��L�@��4�I+F��	�n�e%iF}�D�� ��3�U����3���"�	���d"�K��^�9u�;ִ
��ziq��֩Q�9��ј��˥��z�'S�xY��LIx��O
���*��}�Mw��n����I������1s�݆u5k)�ў�t�%Ԫ�T�G�M�G/�Y�Vx=﹐$A���6&��f���
K��I3���
;���	'�$���D���2�L����� 2�RE�p~=�ġ���sO��g�G�"�F�[D��5[o�%��/O!~���Ԫ�4�!؍�e/Ow
�SS4,�1�_�=@A�t9��6�@�%����]Sq�D��_k�McލC��E^:q���B��ºF�	d�ou�+�<j��؎�t��?Kң�W�&�����`М���e1!�3)q���A;��/8��BV�R*Oǭ�zd�V~��7qӅ�]��~Ɲ��nqgZ �ta8���%,p2*��R\} �x������"҃��\�P��5�˓�ˡ�)X�o��Gd�:�t���g��Z\�E����!�3���[|9�,�"�`��3 C��CTn���e��M�Ï,��2_Jo!�ȥ�ށ����'/7���@z�h�#aJGj��+��g������x0�B���*��m�L~�
����&aлҤd�w�RSh�M�&���TXBɁB��
�^d�7b8�X,�K
���`A�*�,����;7U�!�1'o6�Mi'&L�eL��R��� qC*TFHhҷ_z���5A�R�HW�S2�I9��[��ms�“��z�
U��:%Y1�>G�*��RS�w�9������،ۅ}���4�ޯ�����&���T
ځ�O(�"�;��e��N�α=�4����͵O��0�F��	7@V��J-�S�Zޢ��3��C�:h2Q�}�q�G~w�[B���U�(\Yڢ(	\ϑ5�{�y���-\F2�'ʛ�x�r�DDF=;� �J�J#���!�����m�~��P9�N�
�jK�Lz8b�;�{�Y�7��v��0�>�1��k�a昄6�а�3��e}�n^牭7��j}��6��1�7�RX�ȃ1���#d!�ᑮ�	��8�3��Uꘒ~X��P�+��r��q�v�(�~�Co_��Tq�G=��=�P�3�!rTsKR�3'�Z��$�[:�^�5r�࡙�&)���#�:�^�cҪz�v֏��/�<��z�p'�㋚MD�XQV���OD�0a��%3�=;�U5� �8����\�4�%U�.�s��-�AC	��X5Y�X��n&�g����G~,�T�)}8���k�a5��2H��[���L��݁"<l�_��8—Tr�C�A�I���%���]ʚ ��K�W�n�ۥtߒX�p���W�?|np��*_�2���'��a���hH<�m#ߟO�
�ax�Tro�9H�ɧ܂H�)+zT�v�8uʧ�a���1�
����.n�!_]3�y�`��	�;5�-���b_N��
at�t!ۚ{ފE�d�aKOi�
�g�A^�pZ��:8$��o�L�24v�Hdj�ߤ�7)�����:���^����/��
փː�	V�>|Iuk<�����n^�9�{NX���h3��\!�	8F��<�s��:�s&D��;C� �Or�P
B�=:xc �=xCF`?	xc"�>�s�K�FK=2�S��|�O�_|�S�/��ٶ��m۶m۶m۶w��m۶ݽ�wrOr�Lf�K��*Yɪ�cp��u���18����o�D���,[OKey!�w&z0/�W?��{���Q�t��ك%���}PJ�M�B�~�b奆�gbB@�z�bs����CgJb��CE�&�8�����ȣy��bQTF���b�Y,]��1�XY$�"�����c�(�"��f��G^2�S֣TD�D}f�u����y�7�L��|:8Ux�t�1"9��h1&��wmZ�\;�ơs2u��m,*u�b鳱�ԏp,�<'�٠�iY>��8_�X'�h]2���,s��Xݎ�U�:�g���„$���|����Z�<�.F��=D���R��Ƽ�v͊4XMS���7ڴ�~u�?]
�#Z`
Nj����B:Cp��[_�Di���<��b��f(z%d�H0�7�A���c�\u�!��^z6r-�=L��SN�1:
�v|�$��Evm��9��ط23[��O�>[m䊎���W��k�s>G�i��L����x�"D�;H"�@"y^ �C�y�o���?A�摽�:�!���c�I�x�1(�Ca(*� �QbMjH�~��x��W�9��V����v*��rj6m5e7&q&�ĀПR�Č���&���a�������(<)|A��k�?�{�;�7��-�9%h���Ϸ^���RQ��Ӝ�B!�|A_~���:,��L@�%Rk7�em�[{����t���4��z�Cw߇v1����P1nP��,�\32N@x!�����Q��#ڵ<%_��<]W����H�2ŝ���5Pp�#ڜ���U��&���ŜB����-k4��P��2����j#�#����%��>���w���G�q`4�I8`�@$�*Q(�+�˔K/�m�~�
�5(�kD1h?�o����8�=��R����|ˉ ��.)���N32z:�$~�˳{ْ@g`�9f%Ś�S��R���蛕��C��Í�269�3A��<h�P���
����Y��s�3;�%'Q0�*
9Ģr�b:ǩ�2b(�?���1J#�Z2*;t�������
�/��:�y)�l �m6p�h��B�л�\��/-�	��if�?�Ta[��&R`��;���)K̤l�c0�O`�[+��Y����r/}��X��߫�bp���%v��nw�Y�jO����3�<Q�U��9�[y"��д���Ĕ����U�|0�X#�/��-�J`�ht
�"��a���i�P� �^BI����Bi�N��F�N��AÊt9��6�Ih���#��D�eu����XBoI�N��C�4�}�,̊w��
wex�����$�y�{�K��8��[x٧����i���z���J��0.aP~d���=�b�8e0y	��]��\��dF�a�fg􉅪�E�Ҕ�4�I�j��*�<`�풏$��|nX@�؆�	[��@�_��;�'�X�W�1��#nZ���f�Hb'�����s�jه�WMJ�P{�ϙ�K�M�:��ldj�5���&)�
[V���SkT3���I�>�=d�m�����5s5dI�{;���衊�G�/#�m{Ŗ���,��i��.��P���������X �
��"֫�BiUp�>�˒U�����?��ڔ+&�S�P5�n�3�us�K!�"˦����{hH���:��%\X�1�d�W��	��3lyPȴ�EP�h|�a��Z�h�x�e��U�X�M=�	�U����(�D��|%�7#����X����$_n|ÿ��5��I�Ĩc�O�46���l4=$�e11�I���'cʞOq���ΌHsbɫ?�ͅ�6��#?&s֣��6	�#&?�sl�M�@υ~��䔑�8��Nlq`���'�^�� �b��	k/��ϋ� ��S4��™ȟS��#\�X�S��,K2��XD=���9m<-��ԫ.�F���|��q�_�2�8Mҵ(�co%*�H� �d�h7�-�b���Tn��R ݭ����{#ڡ<�!�"�(�ġw^$�H̖�33���}�ގ*<EJ���S� �-���>tiK�5�+ɛPRp����#�պ@S"�=0�?���9=���CD�#c4��+pw<K)֕�|��	����m�!��
 ����/n�$��(���k\0w��\��M#�Ewq3Rf��1ī�#�O�k�cti�Oqg
��o�M�
Dm��g�C����()���>�ţf������B�Z���#�о�YD[
A�Ο���62����a���wh������ץm�
�5��5�+����оG��Ā��\��0�G>N�>D�c�}���c�ʤ1��o0�	��l]����7�2���7��������b�P�����^a�M�jd�fCD'��x*�Y҂E����]j0�5���e��z�aݜ�^b|�r����QCz�KB��N����OŎ����8���;"�pѺJq�6>���ţ�l�5)F�8w��g\��g`"��!.�X�ŸX��3�
NLE��/5�${��b���$��Uw���p�(
�=�q��K� �0�v�&�&S���hb�q(�ç~�}������,{M��˷��� �3�'Sk���M�Q����Ir����S�������q�&��=��A���c,0�b[X� θ�`�P�4���>�O�~�@"Z�t��?���jgw�.a?�_�rM)����w5�:E�cbS:�!`���a��*A�1�6W�(�,�U��p�����������U�5��k�G�gm�[2��"�?P.c�U���o��n,�^^��kP�kDܤ�<�,�j��!�hh1�2�4=�ulR5�ŘG[	^�h�$3Tx�,z��Tȡ5���l��A�.����:ͱ�:Ѝ�ҺCaeA
��P�m �:IY)Sy��>^v���W��R8����ɃI^=���9��n@�R�VY�H�
�^�D�
t�:�A'�R���
W��~̠�灼���۱�ף��i%v���ޫ�@��A��@��^�ʿ�ݤf�D�]�U��%3R#m�r��!2�ҊI��d����%8�A/���q���R}�٥�S����b��K]�n/���?����C�� ��H̕�C��(�\�2��{��U�_�nc���C4�����&v>�Yq#�,�ns�����i��Yֳ�|+�q�Eќ���9�hy�'�M��)�]�k�LC�u��"|d��\���˿*�����W��)ef��$�:wl�YI�;}��N$K��;)�e�ibKHe�L��2!:�������L�	4
��.B��w˲��2����	�
_#rf\=W��]��{�3����9��X� gt�W��rL
W�"�c��%��۽`FsR��x�AOU��ǔN��lf�|]�g9Ό��bag>:FxQ3��<�;�82�S����p��<�G(f�y
�c�����%`���[
Q��E�wk�frv��u!:��-����&��F����`���<��&=�.H�*{^��q��:\\�l"K�*sz���ZxL���Hg��j4�݂Ƒ*��;yt��d�q�C4CZd�]�����F�}"Ʋև#��1����y�δӇ���)��>uS��E����y�z%ԡ��3�dS���/��<gHy�3M�s��.
8�	���cI�'�۾�z���T�`��@���,z�p�����9���u*�IV�J�M<  0  �������o��_���t�,9,hP()�kb�`�8tr)-0-�Dh,)��R����r�rk���v\w5u[[kk��N������Zg�s�.�k�g�U��i��-��v#��羟� (�ٮ�eV䊯eP��ͻH%E
��� �'S.��e��N�t��g9wtX=�-�eG��;I� ���{*&	-1#��e|�Zy^�N�x�~�o��]1�sB�bɞ��R$\{�YT�2���\�d�NY6��<��s��*Aʇϵ����%�щ0�߬LAC�{N��<�`�Hf�H�h�GS2G�K7߀��K�����Z职AOd
Fkm��[�[Ȝ�b�5���\��r���@�aG� � .Œ�h�E*���:�� n�8��o[�c�Q���1u��<�K�5W�%�=C�=_jB�g�8r	��lB��U�'�0����+��\L!�}[T��܂�����}Pd!��%��x��[�����e���a��Gj��W#݀�‡�o��
Z��X�!��c�pr�Fx*A�D �@��
[�も��h1���lQ���m��������?�`-����g�t/��'��p���F��B���> )k�K���>sh��¯q���9�-�;,�ԴVS��(�J�ng��)j��}[�L�OOM|��)mBh�I���Ja	�$։���|KS����SW��ɦ6Vn	>X��V!Oey�쨤BKf]���Z�7O�­aKIG�����_�v�7�he�:�kj�p�;�ɡ�tMJ�c했���8�U8_#�C�?ӔšV!��	�.����:���ۉ`��H�&2��H0':L,y�m�VH�"ss%J����
�Nڄ�&���С��ټAKC	�+hW[Q�G{��WE�O�{�������^g�:�˨����Ր�)%ֹ.��O��Nm�����K[����"ZUN�>�nb�q�/=5U���;��c���RLE�1z¥|T�)��!�7oރ�>%}rU�쉅����o��1�X���L�����RxW�����,��/�Ϥ�w�&��U���D�u}u�V}���07)��I�9W�f��f���N�
>IӮ�b�r�` ���]�V����l��Y<9i����;������E1VhJ�Q�?�Ov DI]��
�`��z
�rm���	���C�nmi�`7��L����_��1_ڷ��{��Dݑf�ѓ�Hd_G�usJ�B��C�fIaP�D[[-��,��ċF�
O�X��4��L�\�ƈs�d��ݰ�Rths�H�9���kp�;�K>.�5,E �a�Lx+��4���q1�P/�ˬ�f�������?�l,���T7��ttW�Рā�h���^�K��n�LN4�"���-��.l�zD�ȇ?�S�>dx�	�F�Kge�ۆE����!�g��W�^]�6���'����tGs�{{{����!�a�aT���a|���M�0Z������C�L����D&�b�`�v�4�W�e��)&�b�o�_�G��Mз�y\>�����bQ��\���%YZ4�)�eٱ:�V��^P֥Dl�_ h��mr{I�
���jdd��BO�(ʧ���:Q�$���c�ɷ^/k�p����CS7{n=r��� �A�6����/Ж!�Ry*�׃T�v�Kc%gZ�cFb���N�|b��Λ�Y�ӆ�1���ҳ6�zv��9�j�a����3Ҽj�G��h�ц9�hq�����_��=�G��ob/����9�W�`C���$���A���Z?�	�V�(�:'����T�9j�wf�˾;�:y��,�?[���c��	�L$e`x“�C�WV��a�/�:�q�τ�r�B�$�t������ɖp�ѽZ�GR��y�+�����>�'���##�Q_o�
Q��^���qJ�	���6i��16��OտX�X���R$\>X�O�>�86**�e�݌D)��$X��#�G�H[eP͟C�D��Ţ�C�vx6���BE�G�6@h���#�Ԏ�z��}d���8H��qn|��@��)�z�*̬6������'�%<p/�?Z��ZpIp�ItF���.tsq+�e�o�E
��G2p�v�^�)�B���b�}$�d �k%�B�=�����}��6��v��fK~%dNq�D�*�O�Bmt7g�b���W��^)h�R��d�<&�{�
^µdgF˔����B�j��C!�X���޴FJ"/����~���4�
B��df�M�L3�i���q\J�-<i,��Y�nڻ��ؙ*�o�Y**[�ά$�:�EZֱ�ƕ&��GM�~�~J�^|��%s�����)��;��RG�/^�]�e	&�Q1��x�q�<*�6��̫`�<�B���.]�`�|	���]C�S�-N�|��o�~��V�z�We0��v��D'��1Yt��C��R�t�g�LFG����$Ut+��	
�F���\#���_V`����X�M���'�>8���k���egm�د��hs�I��
.3����KF�d�ѮTl.$���N�f�����x��L%ve0��4�n���v��֥�z���;��[�(<e�0�>.��m�ݝ
,���B�h�{����mDbJ�Y���<:t}�8���o1H	L��lq�X�Ε����f�SׯjM�!�U<
kd�:�
�T��c���V:w7\ϕ6!fI��H��~5�+�y���?}V��p�c3D�;J�_Iz��I�b�F���|�g����v�=��m	g�$�E�q1q#$6ѧ����Tx�v�,�t/�#�Shi�\�p�ښ�a���Y'2��w<��[�#����"��.*{!0�����;�\��2�X���<ڵ��yK���j�l��h���m�b��öH�Ӑ5قV��p�DwNGt'S\_g4�xme��PN?ղj�� �.���
������ד�I��J�����3F��Lءbxy#Mx��i�8z#�Kf�>K��;��5���]�]��#c|���-�~�E~S�bq��'\�I���S�w~�5%|c$���e�љ����a��C-C��Ҟ�Ky���f�RS_5��L��4G�u��o%p�%���ň�U(��6(&���#��ERy�~_�>��OA����ۿ?�������"��2�f�x/����J̰X"GaJ�<I
��������<:�F;ќ��h(��h�G�� Dܢ��*�eh*e���;&�D����w|w��{����A�C��N��N��N���8ߋ�G�Bo5l��_n������*�f�H)��
_�-�7lM3��@�(���ӑ���+�k�����H>Ftٗ'l�����mٛ��@Ug�*�C�1S�z�U�
3-�b�L&�O�ڵ�B��l�7�	��` c3d��Qz�9J�ЍH���N��|i�0���?����_	���߭C����~��(���������	�_������rE�*ke�@��_��e��`*%��	G�B�\��LӪ����F���A�,x��I�8O��1�ݘg���ђ�(Q�R�Ž�`p¼'�P��Yު,4s�9��B����	�:�m�h�h���v�2�k�Yzjc[���J�i~�����.]�g�,o���*+�1�{���J�������B06}*���Q�j�� �ҭ�p�ƵR�O7�m}�Q��Y�o܅/��S_�#��S"ݚ֞�6ke����0�;�Kqع��`t��Q泡E6<�QoC���8߻ͤ�;|Â��a����
^��`e9P[;F\{��z�}3�Ŋ�ޗ�N�N,���h3h�Q�z��vME3�+�n5N�m�B+��r������A�;��Y�|��4��`��"?��w��g��^�,��#���գ,לV�z���s/�௭܆?b�l�N�q��]��BDZ�����jĒX1bͧ�Z�ʷ�x����*.�SUF+o���F��xF`�gM�a�
�l4��4p�@Q��r�+8�bZ����ތ�/J�<���Zq|����/(���cra�e��fO{���H,��� �&�Z�B#��zz�����m'�-]`�GH�*��a�v�;���i�U��H�R!X���#��n�K�<��xW9f�	�+uɼ��~��>�&&.����y��33d�m��/�
�����ǝ_�=Z�rඛ_|�_[��������#���5z#^>�:��Ζ|0�4tq,��|�L�`�1G��
���O�E���g^����1b���wH�ӌ��5�RBc��`�5]��o��y\�g�\h�Ġ�#��ON�oL��ޛ�5ٶI�wJSc��
�)�ݷ �FTBT����ZQҏ�0��Pn��{���*�"*�$]�
�b�*$,2����(.�8��9�<ϣ���h��ٚ��O�4�~�؜�6p}�ϖ�o�i�/j���{��!����:?e�B��]ijzh��oƨҞqϢ��8b)L�$8N��g�jbDw��ǿ�^��M?<����.bj���p�Z�3G]��؞gH�#��^Vr���ғ_�����1�����g��.�|��GPL��9t��o%%�yx����Ap4���^xz3�g�$�7���!�KպS�p5�7�L�v4�L�f�/��4mEeY���T�ٮ�91[���	\�}���X�T�jhmz]m~�MVS�0���1b;b�	N
�Q�֋I�a3m.k��BvXD��\�0�����6�;�����":�vu�� �V���
��$v�Z;X7˙I�Y�j��T��pՐ�T)-^�ęH]�ܧ��qǙ�ra�xx��i�f��7�ַf��&���H�m��Z�a�s��GIK��C���lۓ�Tu�ѪrUyS��G��m�+�Ŷ�<��S��h��<Y!�QC��rRR6"���H��w��X�+,��F"�R�ҁcBm��7�H��I��U���s5�<�V�]s��o��7�27������z�6��m�"�����\�T�[��Nd�5�m-P��|�E
<�7fNmh�Ҷ]%g�l�Te�ư�?|����wQC���V�D�z�__��
8e��m*Qh��:�dw��vU;�t󡞼pG��O=�6I�=�n`s�"����2_;#��Zy��M�b��jB�j0�RM�_+�1��*6�j�=��r�D6𻔰�%��e�ϰ��y9F��(B�}S�_
�}�aڲWU�*o
�E|��/֜Q�{�1�\�z����v�b����e�ۛ/�e�Q���e���Wnw+�W#�#�|������͂��W̞�t����o�/�;kBg�/�˿!��	�*}��eW-�oʽ��Wnl�-Rs�./J-
�r�Ϻ=r�ts%��͝~�
'C��R�Z��k�G\=��\|�6��n]5f��y�K�s}C
�')�8����:���e��!��$�+��>�	�������;D��h������DZ���,���ֲ���e���$�h�,�Ή��C6?�e��
��_Ťm�2�=��y�:�,c伱�m�zsc
�ZM��?-�rg�Ͷ�.�*���4,G$w�l%m[F(�j*��uUd]e|Ƀ^`�!b�#��̖\G˶&IV�MKwrp�0�B�s����Z���K�N��E�p�x��(rE'D�
&ۨ�zs�@V�2�خ�o�t��0�F�[�,�iH�f���N0z%����Ŕ�rk��N[	�?�~1X��R��{��䛻7����x���f'��63n5R���X�?p��B��#o�}�Mߌ�ή��j�H�)G��d쨉^&T����.d��I�QT�$Pt�4����R�A?J�s�b�A\�'��r=@��;�� ��tv�AXV �E�I�>��`0�o!a���}�����)�yw�v����/��B8�b"ߝsq><���qM����T2�`+7�7t���2��D�������b�H��3��c+���؟(,t��h
����vHҟ��od��ͤ�ء`o��Gh6��Z���f{^�ă��F��E�����%7d��0�RE��r��i������ϱɪ���#��(3��������ƨ�����Y����� �K�l��ӕ�5;z�ΐ�K�b��u���RC��U�-�__�GZ�V���hZ�r>��v�n����a`�Ԡ�!Q�_.7�z���Tu?"��K��Ф�z_a5Nzud�9������`墂�
o�CgR�i����G����9�w��J��S
��m.W�����B���X�3�YFaqv�e�r�^6p�R$�	�$�J�H���̜��t��%�R�L��9q�}ˣ�0&̓Io�k�q�X��n��4TR)mz���3�2d4��J��@��0IY9����Ѣ��g%���+Jz�CK-S9��H#%���^u��h�dØn���6*͊Ua��'�ώma���^�Md��8�^��c·����e��F�>�ӌC6:,]���V�l��>��k4���[5�T�S���ʬ�����u�`��lI�9� t�q.�,߰.$�<�9�	p��lg���J2Sp�-yEĉ]炨ɏy�Ƭax���:kiӢ���b–�)��^4���D�8G��0G;�Pcc�f:��F�U�2�˝�N�5�;�P��j'; 0�8h�9�)O�\�kg��f�3����Ef�c�����M�/{������MM��\�u�G��g��*j�OG	9`�*a�u�̯6���j�<4�H�[�i^u�������g��)�#��;����F{)�Ë�;Ub!�8��FE*��GLmo��JQ��Nʑ��
"����N��%%�9�eɲ�8��R�l߯��~��IcmN�GS�+z��m�E
Q.Xñ�j�c�9
Ɍm��DˑZf.b��t�n��y�U�'�9˧ɋ��g�;�@���G�#}:���l��Jz!Ku�Vk���X�����Fe,�gsy@<0,v8	U�h����l�
5^;�,'�E�u��d	!�\���;R��>��p��b6x^�%,���ggn�O��R�&��!�R±��෍�+�_��Ac{$���w<�nʅ�?�8&��oruu�2vs�o�1O�GQ�����]oÔ�&:2�%���(rɟ�@i��b��zpuM=�m�����/�dv�ҕ�(d��6)ƥx?Ys�%�͉����,�M�-����%������J:��/��;�Y�ُ�����"��aw�H
�4��b�b�b���|�ʘ��>��M0�s�b�8��=��8��DQh�܌x���j�?uz�cj�^���>�0�f��O�Ν�?�~��04�g�����M�aLj�8j
`m�_"¦�!�j �Cy��5$�+�M{HX�ne����i �M�@�B��%�mގc7��Ē�@d�o�{�~�5\��gD�FH��P`=b�^C�|D��p�l	/�ź���V
��"I����;��b%�œm�ik��/I�rl�C��*��l�>Σ�\̩�y�Y�
\ �0��E�?�窕�8�/(����mU���M�9�Q�$l�HhE��+;X���R�j+|��'�i�Bh@��d��t�dO��|O X�:`8\�7��)FғLƆ��F���:�jQ2���YJ4��Ȓd���h�*;)�+/�x@'#�v��P$iw��L�Ƥ-0S�Ó_�as�r�פz���q�!`�`�K���B�
%F��ӵ��z([�Ġەh��	"I��4���'5
T\)G�cI�!#R,�W�BU�J{���׸XQ����c��4��5��a�T�U�4�+����c�v��4}���<m���[�&�17��
��
��\�;C��)5X���0yWE�3��!���WgX��!7�w�>�=��0ؽ�vp�n	�#<�ڽ�{B:�F$3'<�G�5�諿b�*'V�m��ۄ��/	��<�6���&쨭�?`�[+���eŦ��������4���*��v)����f��]i�*�|�;R�E=BA'Z���QI��[���9���lO��H�h���.7V}�Y�NJѡV{v�eu��茅.=�2g�i{�/ze}l��H��f�ڗ~@�\�z���P`��
��9��W�� �& 悲�b��Co�v�
����I�����1��Q��!��D ��e�¢	�]H������A�� M��pHM�A��Mj
t	�l�2�q�̦5�9���Ҽf���&�O �q�Xq�)(��/������%�c��IVE���l��6�t�&�n� X@'����x�VyU��c}�X�;��m����[$C�,���ut�N����2*��.�.�!i��r��8�e�W0/X��3�}zC��2�EMc�xQ�x��?s�r�I��S�4��Hgm}ZC�R6�7M��yI[�ݯ��$\g
��|:qg�K͸U�'�n+�e&UL����Wg���Co�y)p�r�7%�')�+蟤m�<�(�R`?�Fك���՚'�(3�聍)�p�
#��i0eto��%���13��k��?�0�@��Ϥ�JC�?�I�
f�P�+�%��Z�5��K�;��-�D�ܒV��ԅ#�T������a�9�����P���Y�0�9�=�Պ��$���b��]�M!?ݓ�QfÍVQ�<�����}B��}]lxp-5�	B�ə���D���&��'5��0=�hȕ�z�P�@���/n�ՐN�0c�A!;���s�ɴ�h<!��⋈�W��k�?ڽ�X����PO�G��/n�#%sO���m7��iMi����\�y�����1�0=3���՘�R;{�
6�M&OYU�I#}�������l�r�qrU.h�^p��l ���#z��u ����0��ü����+��['8
��p�OP�HLB��()�Q;�$��,�*'[N3��/AR��Hjk
�"3b_��J���bD�xy����R�u�������մ���Ek!ň'IJ���i��@W���0ړg�a<)�6�����4P��6���m���$�{)�KR	���J�
�o��Mq&^��@��S˚�/���¹Bu�1 N�81�(��Ψ�F��6G\���L�=���?dp�����[�Ijf�b\c�*cd�N
z��[�e;v���l%ڸ�8>.%]�r�ҸGGJ��9�ȶܢ�/CȮb��D�^1�<u�K&��=r����<{�Z����BJ|I��O�'�,P�̋��;�f�G��eX�$|?ֲK���H푫
Q�s��Ӆ�4��ūg�3��I4�
<l$?�3寸ů:ů<ů_V�e=��i�Yr7��?�g��Ms#�w#��K�&�Z�)���)Z&�*i��~O'i�ή]�wP�
,�.��-�*���;zB�!�c
�]S���C�j{\��)�����A������4�ڸ)�Ԥ�h]��rj(AkV��5(���է���S��]�#������H���-F�s��Fv��GL.p��Ѡ=���(��p,�.y�޾,�S��wݮ�蓴j�j�`��D��w޲-보�ufL���>\�00����E����[������G���[�@6J�$`؁n�x_/�0Vڍh�"���uڍ�h����0����#��o/�IY�o"������:���
(��^�}ʽ|��w�?2Hi���}2�?�ڀd��ꠀ��P�?	�GgJٛ�y�7�C}�u
���ƣ�	n���z���G1���� 8.E�:����~����UNi��3���tG(�[Ō�V�:cP��e˅�צ������3��ko2S��"�������7?��磯�b̵`O�mۈ�)8��ip+���a�;y�$�t�N��o�v�����tA�@!V"���oޱ��3!�C�5��ѩ���﵏\!����v��ww�=�n`_�B"#���2Y��3Z�$�u��9t::9��[�D(s���"�(6�lveo���k#;uL��㙍�ܴ4��ʜ�X�x��u��9,�a�u=�:eA�Ɋ	��Ȥ�1�
��j9��R+҂E�l��n�JM����Z�xbE����o
N��jS�'rl=W�I[��?�5:�HvulE�ѣ�(O��P�٩����n�-����%����+B�b�-�T�0�F�xV��o+�O�ί���C�j���$��)*�C�N$-�|�SgTL�e�"<�G�n����c���O%Y�%����Op`q9��k��#�bN_X������笍Y�1��͔Z���ؚ�Y�r|;��h�Ƌ�2�������Y�Y�SUZX��gL���l�둵�Q���z=�6�m/����G����P�	���7�-P�V`6&h[�=V���H����DF�!@�Zd<Ħ��M!%��p�H���#�\���L)��[�Cʰ�p/�2�lJ�31 C��^�=u�B.씂���5��D����N��D��-�U~`�s���\O��9��>�����S�;5HVq��������G.8�a�8�a����6��.���
��:&=�S��]TxV��SL�R�ʦQ�D+�v_Ϧ��OdYLs"Iܒ�=9��i@���bS^��p�a�f���o�A�o�1�)Ei���ռ�eV�p�u��(�S�`�:�A	�u��D��ݞ��?E�Rл-������.ޕ��:r'<ҍa5��w�85��O�������.�`��#Z;�(�|Ox�a�7�϶��1��XC�^�Kߠ���"�x���""�#9���"�7g+���t!2e�?��b�����jr���'_�y���ٟ/W{�2׎�c�3���T4�����A�3��,�5/�)��#a���j�Q�J�/$xl�z��&�@Kͫ��;����Ǡ֯Qx��z龥U,��fG����q�["JLx��q�CW�
^tӾx���v�Brkna���x�C�[���̡�CXz�(Q9�	תWTIw"��	\��������-�"��o���“k��ҹ_�?�+�$�5�S�T����y�.�f���u�U��+}����ς8Τ�dP�Ց�����2^��������1��h�m�Rk���k��k�"B>j}72N#Rf0Q�Ӿ�CKX���;I���W��G\�G�#O^�?�{�*�����!Q�=�l�z��6e�v�
&��Ш|�k�3n��ݎ��N[��'tFNDz94}��-׬�ΰw��Nu" �!@�3�;����vl�CelSНT�֡�E�XB��f�Q?TA���� c�Lm�&5ǡ�z	��+��p��U=�7L�}n��!8�ťH��s<R�eS�p�n���nƠ�1-���П��	�<�ڻ���?��8��f��ū��ܘ��BM���:�.�8����w�t<�<��#�"�,�B��C���f�?���ZMȍUǾ߳��'0�RTL�k�'$��mkٹ�č�:�Y6��z��8�n,I�Z8��j>q#�����:8�
���+�����k^s�~������0��"+3�g�~���Q��E��%h�f��m]�jT�bJ�r�t`(6r�^�!�?��P�J#�|4	F�Q'U�LO�̑���dN �T�(ٜƭ!
��i��Jݷ��z��
*��L�~α�#�
�'
jR>y�K4l#pm�Z��.����D�۔��Q,�]|��W�k��NG�۸�+�dPǦő�+5���*��5.�:Ͼ�m����Jbί��鍷@��x[���Ƽ���!���N�B�Q�����z��<|��5.A��-�I{���i�K�	���)�#eN�	V�ə�2�f�
�=0�S��%�@�Uy���B�V^J�<C�b��%����K�P��b��р�_���헼e�$�n118SD�bŕ�(����z$��)Z�J]Y�;���A*�ϣ]�tP�!|�_�VZm+Zz}�˒��.�O|��L-S/���y��"�K2V3b���dFd�L����H՟H�ʀx��}kA�Q�zR�G�|L��hx\���k�L��ec,6[w��	t�.@�+���r�'ޚ4�UDo�i�쨳��Bߓ�^HN�_�rx�2��b ����L�!��o�E�>p�>�3�:]��J��1����Ӑ�A�k�������h?fOŸ�r�߆�XM*��\T�w��]���|F��l!��F
UF�U�e�O[���C��5�	�x�:8ԙo�f<C�c�ur��uy�	�J�����_r	�����%k1�<�磠�T��y5�6�.�����T3�G���S�~}�ہO��j�[��YeO���!���nc={Y|������
��Q1q̋�V��XIP�%spӕ�?�2u'�����ۂfK.��&���Gv��7۬���w���}�E۶m۶ݻm��m�6v۶m��mw��3s3���9��d%o֛�+U��jՓzN�¶H9E��S�:��R�
��[L���9�n����A�<5��)��*���15k�����˥
�d.�[�?�k!X�Bx6���T `0����Ἴ�64j�1!���q��!2�&�"H��5b#s�5H0~�w����rn���s=/Ӟ>'�'���C�F��#h�̙��\����#���P�"HIF�����#L�#ڕ���L9�<`�F�"��P���ҕ#��|����c�'�ܛ���瓰#[�4�4N8^����w��L����m��̼�p��0��k��?���05Ee��nu:�3'4��sp�=0w��^wh$c�hơJ'1ɘ_k�.�w�80r{���Գ�M`�\��e��{z�y��ә����2*q"��:.0�q�˹�*Mv�W���siO~Y�71\ty6�<ξ�~f_���q�L��3K�b,��-V��*0�"�f�P�M����)��d^�'$ g�'���-�=��<N�C�q�C�cb�ٷ��ASL�d��9�ep�¥q:���-h�ι3��A���gR�
ݚ�=�Y;#�����5�b�h��d�;�	�%(�"��LH7��
��9��Fk��c7������E�ÓG���q�,�
��p�xb��e�<��eJ��"?��V���k�53�#;�)��De�|�S��޹��F�}�\n��L��CX�.5�D�9㑌3,�:������_�n:V�Eݚ��pN�ڤ�ݮ��f��R05�@ϩ&��]U�[/Z�6=:3>�8�+��	�}���-y�q3���
������ʨ��\��
��y[2�ː��vi�J9D��{��-SZi���8|���$�YR�"���jj�t-�r|bd5qȜ��nt��T%��]Q��]��P2g�|D�[)匒�i=##s����U�6��*�јƮ�I)$�x�	$��/����Fb7}[kl\8k�3q��?&i��d^��*'	�]���VvA���08;�RZ�N�ަ=2��V
{�6+'���-���l
e�>Лd�P�%�q�.�7�s�����5��a�9�[ȳ������t(k���S���~;ɭ�k��S荓� �9j�,��G֐t�ؽ
6�O��Sc��b_I�^M���A�Wt�/�[c��TԾO�X�����w�����;��ؾ}��*�Q�� EG�}�OțCY����c^����D��1+P%�ײ� �
�O��~6�"�+b�`gG_��>~PET�|�D���e�N�쎮
VK�"�����������FgN0\g>�N����@g y1•I�ױ���r�!W[��_v�o�����|�����
�(��c�ְ|��O?x��o��;��ȕd6n�8��LI�J��))�d�ō�k3��;	RЫ
�EL�P/�p��Qu�xoU�w5g�M����j�V�w��6x5�It�Ut%zs��A|�P%�։�d�?>XU��C�q7��x�'�3n,������u�*=k��5V�,�
.U�U���p��>�s�e�"D������$1�'~��b����l%��u1�__
�2;>����F	���["?d/TS�$:OP��9�y�*�/�'ay����[�+�[��3����@@rH@@�����3�׊&T]�Ae]O�~�ˈwO��&(6���J�AU�8��Ņ�ѡ�D~��2]�}��}!/�1i�6��uZ�5��%�۵4�mc�����%�9��1i1N�$wu��gu��Z��N?� �V|>�N|>�I��6�&`2nF!�5�D�)��a�81�Q�H��.�&B%��-B�uᴺJZ��GL�HS�\�MY���}�ݲF�:�����j�&�Y�ݣ�7�����]��6����9t`m�($#�ٔ���n�in���ER�2�!�	��~�Sq]gj�LJ��U�6]5��H�2����H�@�V��ec�f���Ը������l��
�S��͵|�R�_/v�(N�H�]bכ�U��j&C}Yc0�ڙ�%�˩�eup�U�u}����K�mm���
�{I���t!u�x�OAk�~k%���x
Ȯ�6�M�M��	k�ߎm��D��)s�\#�H�W�e�*��ɡV�@'�}��6&z��H��T@BA�2;��K&��Chg~�d{��GVӓ���Js��R :;�ڃ��R��Q�4�4�[PMn}�ɽS�TM*�e$�"�C�d<7�W�0�)+C�<�H2V	��Q���T�cw�s`\T#֜�̓��)U�FQ��Z�E��������f�K��ߘA���L��`y^��:5��N�
��Q��!���Ѫ�����n�tl��]����H��0#�`֝��s-n�!$~���e���}��vj�#Y��^���M�<�t3�VF��9�TT;R&�
@��R��~Ξ�բn1�i�q��\)�8\@�a�?F8R��5�䑇�.,^�=� �W �BA0�A�7�Q��y���_��qX���
@_P�b13u���:�;��t��=�'�(J8I�-��n9$p��-��	��C`�A�z4�]�K@8[�%��C��j�<q	U�G�k?0t��8���~|�b�H_`��%���Є���|=:@�:?*h��'�gkU=&�'�t�eyCs[,����@��j�Ew�����?�vE�yC�DLH���30������}�/�c
�.�ɮ�n����1B��m�+��.��M#���яd9��m;�Gz�U�X��U���oS�4�6J�$�4{P��b��/=+��
��m��g[��b�E���{{o�0�֛���G��=P����n��,�o�s��oņ�<�}C��w��?�,����1&�O�;i���������7������a���M�ݻ	�z"0�{F��^��8����۠?*�DTs��<�}f~C@_J:A�U_�%�=cӶF/~yt	�8P<
$���MP�F��Ŏ�#�}�
���q�`��1�L@���=	#6��b��u�xd'���Y��>��"�`W������zʻ��V���T�K��O����^K�[4�
�C�����u1�"�u��>ok�K�ݽ�E�]�ff�i����g�7��x�?��YH�A2��j#Iɏ��D沿z-��Tc��.J�XU��눫%��_�Wϒ�q��朳��Ȧ����]iLƨ�5qoe�r�к�m�Ե��^9�۱ku(�W���.{�BO�pX�Y�F�?�q�+%�0���.�>��CV���0	�
c��,���<���;�9E�Lz.��������<�"��!�G���C۠_�!Z6j3$v������qd��S�p#�ּ��h,���n�?�x���7M��Z�y1��2����Q�>K��ט倥xj1��l�W{��8?�����[a��5×�A�!��]��®웣�K��)�D��{U�s�+gP�QK)�)��d.*���G�<�
���x�����c��A6'�����O��e�<
Q��\�����׋��8��4��s��]]�[he5
�Z-vEc��JT�V-)��_xr��q�������P��j������v���&P�F(g�O�
���-��D�������E៷����I��a}��ی�AKGu�@o�W$����BY���&[����󖢔32WY'��LH@���B����MhL��w*���ώ��(�4}������2�y��l6$ܙ-Mc���PuVcG_�./�t�֊���[��P�ɶ��u��a�K����Jz@M�R��s�h����U�m�c�%k��7�谝�A���T՛c��–����a��m�~�%�-X�R��nc��Ľ�Fi��}8��ǟ@V�NwC�������t��V3�F璪#u�g��
O���:�\C
�j�p
���O��sN"\�̤��s>��
���ڡ��Կ4���]�c��+�r�{U�1}�\��΃vs�iSY-�}v�MJ��j9���ԗYq�O��H�j����wz�4���l�d�t����"Y�?��QB�����^qO�Iϩ�ޫUEA����(���4��[u[,����}ޞ�A�d7�ƄJU5-0ߪ�6��?�����̀GaP5{m��0)�����j-��XlM�����zy�i�=gx	~Y���r����'v�B���|��3��vzn;a�4��X;F��C�x��=�3:0�7����L�k�P70J�x)�#>"��V=�h�?�id��Z٭g�q���W��d�s5���p�7f�Zw�O�:�H:��� d�6a�8�E]����A�3��i�z!�h"�z0��9��#w�Ag�"��!�<Z"�D$B��Zt�4N�O�ځ�,_����`;���h���G��pj�j=��ѯ[�>K�ӲON�V�g1�:�>.��}7b�ޝ	�1��]j�n�[=V�\k�=�ѝmN�{?r��`����+���҇��0�8�J���������-��`w��e��8˱���9�#���_�>]` A�ߐ���)¨U��UҌʦ�"k(�CP)}<P���by93�~�,�ʆv]���~��P-8��.���J�9���λ~�,D�&����x�
�'����mK�+(ջ����36�s�)@���5NA�H�>Xv�B:�K��i
$�Q��'w"P[yS]��+�w�S��\��?��!5��L�?�I\�"�D�xr�#�^�҇;�F�1�D
sd����p��t��UgHJD����W‹�Ub����]XӞ��'E��Ł;�9
)+uA5�جܣg#`{v8�x�'����lIl�M��m�Ɗ���7�%&��A&�Qf"��E̅h��HDK�Y��6ʵ+r3(���6.�L���qJψ3L�a˱3'ա�/	��a���Ir�*P���jƞO6ƺ��+���*0XoE8JSyEY��OpD�@Lvz����/�ۊf3pǶK�x��0��c��e	��G�:�s����x�!���1b2�-a��ju�8v*r�m��N�V�8̒\8җ1LZ=��[%�wxſ��%z�OM�I�N���829�b6N�|t{��ϭ)08O��.��(���	�4���y�n��H�<�}��}��v�	o��ã��Y��D�)D��»�º����G��!���,��O��O>c�r/\k}Q?ۥ3Q��1~�wE���������VS��	���T��=�7u�q�{���rx  �	���FN�
U��l���k��%����m�Aצ	
��E��VK��2�V�S3�N�3���ueF��B��PQ�j���0��0�ؒ���Ȓ�..X���yE�`y/����C�';7_;7�y/^��')��8�CRFd11a�>�qހu��+�돡vPwG
,�hc��j���t�_��q�L�I�TQ���J$	�"��l�R�ߡj�#_+D���H�bGE<H�i_�Ƨ�L�E<�+w�y�Pha3��"�,�\K�sh��n�4;њ�,�a�.R����-�T5���g�����G�K�i�o�r�IMc�����}���rk������S��4.[V,Ǣ��]b��-��8�	�y�'2�|}B�a���#��+��_�ڃrYmWV&R�z?&)�&c�h����4Ź;Db�:30�>�iF+!3���vm����	8�L�7i�v�c�èy�VD�*[S�Dn����l�T�3]�@�u�5d�%oO�MC�c���X�i��"NJӈ:�S)��I��/{�/v���|���Mdύ�u'7� 6&�?���-A_�6����!��L :��n��\�,��X��\���͏f���N�n�x�3�!
.����_���SěŠ��ǣǴ�z����6-�J���ZU�d_Y��vSK�d�B�
F~�*���� q<`/<F�-���n
p�{�4�75G�Q��{5,Leᤍ�R�0�C�0y��/���-;�Ƚ�/��E�+�&�����L����1�EBh�g�PPڲ���\�e�>�gϳ��(춭,����ͼ��gb\��d4�D��=�Ho�l�G�%.�#�qjF��I����E����篽��Xr��Z�őճ���2�&���I��ť]8�*C�َSj~F����[�0�t[Q��9i_���7�mk���)Wp����СBԛÊ	߀��_������w�[�$m��s��N�u�� W��7��6~�n̰U�Y��wItI��_���-G�MM᪞����VB��g����(fKP�g��~��SMχB,6Huaѵx�5��-L!3O"]^�ھB��@[ q�,� ~=+y�&lG�#�C�w�3͕\��{ʔ6@�P��Yg��)Y������$رʐ�[��&�l���Ѥ�fM2�ɞ���z����V���]N���2���msco��7�r�^cߊ7w�[ T�S1oY+Frؼ�^|���("[�E�F?7�5[V�w�	��s9�^��l�B�gj�V����@�ۃ�͔�OA<�����oV��b��<�nr��9��0�_fd��Y�-<��S�t�yٛ�~Q�V�;��}{�{��N���C�sy7�6�mG^Zdn��9���;v�wi%%�m|�b���}������)�p�qk��qo[P_x��)m�2A�4��AW*��1%
��4��\F;��E^�D��,#�1�y���K�_��u��3�
�L��(���z���	vZ]pd�b�&��k�=�S0�i�$���W�圍lP�U�z8g���A���sG�<�Vq�kӗ�zb�+;K[���E��E���d��A�ӯx��?���Orb���p�
�'߂ק
�)�lP�)H��[�u���[%�)�~�ZyN�]��x���Ǔҕ���1S-�sj�W�Ⱥ)����uT�)���*�؊��c�\��X~���&FSG��0�Y毾�WE<�/z����P���\�N�<�,�y���:�7:������H��S�%�O�HCD�?!�����h�ֿ����e�̙ �'�!�"��J�$&6J�M��6d�΀.��Csߴҩ���
�LSFA�h��Yi�������[W�2e�r��m�!��:ӱ�»ۛs{.��M��r7%�l�nA������j�|Te�a:���V�t�D/G���J�(��)�z��L0v/06V{�x4�L$[`�����K7]��Qy)���0��Erb=n��7�֥�CY�F_fLs5�1���M<��;ɢXOs<�d�{�X@(�B���$�	3��9�e�C*�D@���9Ъ�m@*̆����Ƚ��CR�Xj
�*����(��M�FtiN��^H{���&��Hs�*���o@��[��}��m�GW���$a�x 4D�{G,�}�О[0/�5�G�@\��az�.�n�֡n�1��{l�����v�}@�:X���y@�'6���U���rT��9m��ZCl��9�%rgV�����֚#��E���ڶ�T�E�{��N�^|���^) wI
u�:�B���3�B���9��X��%g!�5�X�}ۣ�`W���z�!~��,��ଦ�1sr���q��m�Y�↺*��M����.v<=�����K9��`W�g0�Bd����@��
J<lN�V��ǃ:;���r5�eU�_������C�Q�t!�I8J�֌r7�@�"�D�I�i����G��^lX2��&u�X��$���0P����9�="�B\���N�c���>ِ�̐����jq�^yu���<沸�l~�Z#6�2_[�G;�w��<��r�Ċ��"{�sFbb�^B,��^-,�ޑ�xɍ]4�0�-lZ��Ք�'���t�P�^�t��n��XՍ/�x�������a�r�,2Lggǂ�On@�sv�h��Z�V�2/���<u��WH�l���6�5�a��&=���w�Td��?���%qC#]��U���*e^��e�>;��Y��L�*Ǟ=���H2IA�v�v�
NmO7�b��e�<G*+�V:f���Hɶod��^��K]\�ɠc͕�}�78B8����rqE��-�u{��z���lvŷ�qʳ�a,M���*��{_]I,�uc�?�NK@�8�*���s�;i@{����E�?���E<�8A+�u?�3?����z)��.1�vE���W�R��a�e���iX�̔���Lu��$ޤny֊Q��J3���
˱Y|�5�21W�R�!n#�@��⻡S�������zv������ޝ?�
����1�#brg��M�>Ȱ��.=ҫN�ۦ�ɏ���/�^��Goɽ�����|=���g��
��>�=��ί��w3�#Gs���ʇ�'���zd�qy�:���b� �\�o�f?���7��D��9&ŌO�ޥ�/����#�
"�/|���s~���3rBB�7}�{�o�^�t�8�c�䛦���Gߩ��7�dB0z/Y)A��o�+�2���Ox?,��\p�D�|���:�B)�\!�<>@�
�Q2��U�8-)���-���œnʁ���L�n�?ZI�S��e�8�`\*�/잻C*��k���Zu���Ԕ|g�����a2��4a��o��=��oBA�{��j��
S!�`���%�J��Ԃ�j?��I�,
���W��L9�Dx��J3RS�V�M��5UX��e���Nv����R�T�=F��R�ۨ���7���Ք�i���f�8�i���6����],�l���Όώ�M��ٖ�E_����{���X!�T�b[a_�R`E*5�I+�O�����W8�g�K��C���7n�V��]�|��v}�Y�@��ˬ�tt]�ް_y)�53��|�A�@�i����+;g%&/��%p�A����/[���)"Y�~W�U��VxJ���h!�,�
#R���ZP�A���ň��2��M���*�zDaMV�_���*�^33�+<�Z�b�b``{8��j������+�Z̝�z���ȂKat�4ߞ��)����З~b�m�C�Ϫ(�����c�*3{�xڒ����
�O�x��Uc���-RK�.m�s��й�Y'��Ε��r�<~϶��ps�_�Ttm���ޖ!�l��j
���-n'2��1�t�C�c�d�OVy=����à�]6�]W<�X��}z�"�X�$-ww6��.K��ώ�5Ύ�3%w?۹�qb=y�Մp
)A"�!�\p�Ƚ�Tn0�m��lh�:M��6�#p��*�29d;\RV	��"m��{�.䀥�Sy����3X�
ƍb}`Z�ܧr���#�\�#z�ń�hB�]�I�	瀘`�&��O5ϸ_���<B�#��ֳ@���i�Rq�Gc^�o�
h8��fA�ؽ���MIv�,ax6d��A���T�|�SY�`���g���3!�m�I���4ۚ�� ��_�,B~E�S���f4��[��M����BO�S��<�`�0D�U{8ڨv�=�%�9;e��<c�e�1K�!m�	ˆKT^!���5lr�pe�O��qo�4Πf��Fra��\�F��B�)nw]�:�S�K44��������3UpBdG|b�>&nj]^��;Xa�v���(Y�i���?~���{�
�o�`�j_T��Io�W��w�iv�q���q�]R�
5L�`߅�yMC�8
��Р�CAٌz���Ʊ�?��.V1�`�BD
���ڃ�A����i.˪���)�.2㞲�G�"2W��A�}�7>�gOz4��
uK����P*�콫�ʤ_!-Q�bZ�J������$��1�v@�w��j��
�~
$�٤n�P1�R���8}�r}����+Dla$,^H(��x�]`�#*6[����l)��A���)#����8�$ �>�B�[1 lPVx�'�`��rC��0�p��L�+��|�B	�I�Y!���x@�:?uh�	��@%���b��p�@��.��A��@jD}�ꡏF@A�Bؔ���VkDiy?����G
��^���M*�|䬼q�����J1�2m����\��Ѽ�E�q?���NP�^"<|�ln��{D��|�YJv��&��5��y�y"��Gy�?yΝ����+1W��+�+��4�ʧ=�|J"�W�`0���aM��Y
(�M��<?Z4������Ϧufe�Ȳ|�IIP%
�*�Tq����P�"��4P95>��爡ի!;���Ao��zt�L�ʑ:�b�1���fa�A�O�na�5_o{�y\/jAr("��n��?�aޟ�K�-#|	$O
۹m�g8��8U��~�����X�!04"Kʑ�g�Gӏ?v?�@�-�sɳ;�a��9�ma�T®`�5�}��x�;Y`���z1u
.X1�Okw�+,lB�2�Qbk��/u�U}�r�x.uN�.�է��y	/�"�Zo�3���>���g]���2<���-<C���e�	�J*n	�����{�J�Fa�<��EnrM�M7�	���$V�}�[s��<ѵ�W��s*��P�o�t<�$J�ǿU�.���QH��������
�j0�_��n��'��}�b�6.}��u�|�M�I늭�(
K6�i �DY@�t\Ro4)�0?�hd5NV��0:�;璟=�M��^�XP��z�*�����WIP9����}����?I�a$��/|�����hQw&>y�?�	�x]�2w��LR�p^(�~5z��9�ټ3���F�)>1
���/Z|��(O)�ݰ7��8xux�>�`���	�{-Y���.Z~43��ܐ���y��/�G,-���V9����c�D:�%������"��vYA䋠�HT�-�iG�]\	�dnQ� �F�tb�)�+KT���7Y�W\�KΔ���P�gF����
)M0�-Z��]�f�H�jZ!ˬ�)W�/�b�F�J��,&<�U-M�|wZ_���,m��MH��%(j�a������܄W�P"w��uM���b��r�o��Y����T��P&�#1�,�y�K/j8�eA��¢N��΅ʷ�z�z�`<��X	��QK�om�0m�u+�X
Y�Lm	��*�|+��c�:�y5�M �e�sex���w����jH�L��+���6<���Nj�1�t��c�6;x6�"�_�5S� ˛EX_��}r��ӝ�pK5�Gq),�z�f�Q�;�,Z'56\�O�
��[�V.݌�r7�+�wG�ڊ`�4�z�=Q֏%��]�[
�bK2��^�i�	e�-ܷ��
M�8��R��"�-)0����lz-�|+2Sj���P�U��Z-*Y����!ҫ�Tۥ��
�E��YU�.}Q��)�A?� IJ�mP79ű��wĴ^f�����v�^�*#��6����m>�vbZc������g�)�;M�w��p�f]��7�){�X�[	*U��ev�x���jm\2�Υ��I�7%�>��R15��
�g=Ѻ����D܊�n��.�I\nr䟸��/
����hA;��5�N��	�/�T���=��H@�L4��<��%ڮ������R�]	�*���&�0�/x���OSV�EHW��rJ���Y���I�T��(�K]���z��׏_!�[�2yv�j���;	���g�d?<���	Zb�K��i�,e��Cb�}��&�a�c�W�oʪTL�.|{���9A����f��<K�}�~��8ݍɟ��Ϩa�U"r̩����⢖aU�Ů�#1*��P�h�+W˥}�[+W-��������� ��<�vJ��i�/l��,�	#V,��y�~���`�x?�?���i~e�(��,C>J>ix|%�
���G|a�&���3X�-@��2M~���ˉ����w]N�o1�ND@>B�1�_60�e�1j}S���x��f͍HN���A{=�9Ӛ��g�<`��
����cW�3�k�[k��Xa�7_e�Ձ�hi9��ȡ�	�J�HC࠲.����/Q�}�`�*Xג�i��_̞_vǘrU5M��~�~��v�=��K�2�dq,td�
�E���>��y�?��Q�A9S�q�*PV���k_||Kl�G��m<;�/U{���
�!���wp����z�Ff;"�t9[�ev? 
�WA�PПb���o}�ĻE�ܺ��s(�9p��+�v�g�ܺ
�ƻ��ܺ8D�����%��^6��s���ً�ދ�ݫ»���-û-�}E�"�;�/���Cl����.�jF`0P�e�d������b���r\��,|�R�<��P@TJ'(��Z�QZ�`b���s'r�Ȩ�T���T,���*��l�3ޒ��+%�.��oIG�:@ܟ�׍>���Y�7�j�"���<��p��倦�����hj!G�B&��2!RH6HBD\4d�8[,�C�*��8��[|ˑ��jE�:IX��������~�&��Y��Si�*��B4*�����k��k�Cq��`ԥ�bKe�B/�����GL�q	�{�j���z�^���}ش�6�$��&q�.�K�^d��c�H�/d	��옭ĨˇW��8�:N
;�-�!��c�����א(�:�c-�^hRj�(B��Y��&ަ�˜
�lJjӯ6���J����K��Mhg�Ҷ�f
�G��$f����j�,��1Z9K��'~{>���R�"�#��R&eC���L��X��)�	��5���:�x��o�<_��9ſMH��v���Sn��;
�i(�q8�C��M�G����d%w.
�K�-��c���mQ���>�a��|��Ǣ���eߍ�&����g���(l�i0Ǚ!Dsl��&�8'0��F�bqZm��+�JV5��SY�M���m�#"CO�~n�S����P���)�Ry'*���m'b�YӴ��M>�
(U]�
K�<�W�B��a����,<T�L<t�P-�P�\.���j����~�h}����NR�.7`~��&���`�ܱ�&�i���TZU/;
�C8���P�<檤���+����z�z(I&wߑ��ԛ��� \x��1�F.w�D�.��;���yt�QUʛ������EdEڕ����Ql�����ح�7�l��k'�U}T��)�;�:�O�V�<�w���-�2��T$lу�ٔ�۞������o.��F��Ǡ��.t�_�P �z}D�R�У�6�`�<�� ��3�/=��S9�d!a27Y%����_KLL�Virx�o����#�%6��~��C�B�Xa	�,;��8]c��j����WZ7R�&���*"��6�I,;����m�v(ɂ��]��^�
y�gGOW�	�纴
�Y+a�iq7���O�J4+"6wA 't?I�1��a��l���aBv�q)pU$��).:fhS�	������p�dZ!H�ek$g�h�g��$��!�iӏ�Pc��[���	k@�[��N�v�S�F�J,��Lk�_ԑ#�aY���ٷ8������Ҏ-��"�4�B�k�M�r x�=�Κ3�1��e��@ ~�!P�	���H�n�(D�Pj�@�N���lcHaG�����ԏ�_i-	t����Q��J1���dž��Sb S�BV�+�@*	�����i9HI4�H���@a��cS@X��3�D�B�(���ԡ]qzs{�T�(��);y$���un��thL7�DAPc\/.��O,��Ls��E�dc�9_w�#oMI݈�}����Щ�]����T
�c�o��2��;��,�@���'wrŰ_���Ls@�}8��	�s��S:T�0x��?�V�*����o�ʫ����cV�c��2Tȿ*c��h�J���x!�VHz�c�9�:���E�.��yE1;�q������u�������|�<2e�����BQ��Gh[v3{�ikԮg���sM&�J�u���d����#�;a�{f�zǘa���8pCw��q�=�~�}�������k�,tS���)kp�:���?�����I�����a��`cib�bio������)p3���������_4S{'2���R�WF�ZݗSB�
�8��#�CEC��v�3�kﺤ%�E�6<Kb�\S�4��6ٟ\u�}���9���Z���L��7η2\�%^J�]Ƅ��2�O8�@"�M�=�1'-x�9BR���p�Н��&R�"�`:���(�
Br�yZ^�<�8tF����&r�.:�F���X��^U�Ew;lb�/�=�7�X�U�b���2��t4�����;�+�A�j�m$i?8ڔύq_���2�
��m7��f�d�*��'oY�W�ٵ��~#:F��D���Γ4�h��+��~"<��e5��4��n8;�����Fl��;�'3��$�h-;e7͇+!�$:�N2ϓQ���W�S3������;�?ܦn�����g�h4�A��&��hD[g��:hxT
|a��1D��q=�7�O���eϒ㹋�G�v>`�Y���]r#�k"I���{n�y���c�����cu�@\+�Qf4"�H٘��Q٨Y�'�����Du ��Ҥ���`�3�($(�iT7!�Qz�8���	]�TWm>��x]�xUN�t$ƾ���TWi�NE"�HcvY�ӎ��c�6�|۱��W��e{��ZRo��2�J�F>Ӎ�A���;��$�1�9
a9����9�|r��:�B�’Ē�,��$�%S�&lj>�jJ[�$���e��^5 �&��o�NY��.�6rh�o���D��2��<S�l>�0�Q�N��D4�1�$����:�bXؕQT����Ԉ�$=�i]�>�x0�Ky�M7��\Tu�E�bP��9Dpa�^�����`|m�^��T#���x~�:����Bg�7��xH��L�Ғ�MQ����%iN5o�M�RRD��@�h
�ן���n46#d v�˭!��'Pqd.����C�BQGX=��$��3~��v6��
m<��#�	���<V_�l����I�Ds�&[Av���(���#9☍DY����!�Dc�ϑ�L�Q}����;���7�_J�+�~�j�,��/��!9��!9�E�3�A#�Ns}@�MX�
�7�*7r�>T�;2�1�p>��2&;�s�wqj�����W���l�������!#�s�)]��^d*�j9m&���BޓQ�yꩦ�@��VI���|��v����ĕ�Dk��S�E�s}�� ]5���iۗ]�D{��k���6R�@J�X�l3SS�F�'c��4kR�u�UX�Y��}؁�AAE�\:��4��e�I�a��t{{
�}v���O�I�+������E�4z
	����=O���;�C
Fe��Ҝv���im��
P�g�3����^�x�Er�H��Lcي�U��a�1����zF��OpK	��Q�%)��ߺbK��`	�
n����@�dY���31��{c��wm
xАX�l��o�����6I����
�%i
�PY�B���&A�%�L��zl�W`7���q�>��V��4��M�
�)�97����kp�UJ��K�MB���ӄ�p�X7���.b��9��_�"�Ż�dx��\c�>�}ڕ���P��gX_CDn{d
nQX8Z0'A& �1����QG��Č���S�w��o�9������%����RG�e'L�������rN��UZh_�"��x����pu"$����G��,B,I� �X�(�ʫ "}o�IT"�j(�>��R�b�Cu�{�Q19P���}r����u�?��5]��( X���[���U�V�t�9��:����M�lD��RN3U#�O�%ʲ�"�hߣ/-:�/�"��"W1�!L	Qgg�O��_U�b�$�g���ӡ�f���>x��/��8n���x��Ք
��"/�j�e�sn_��0�P�0��\���@B�
�`�')h5��kXz�����28���I�0M�vt���Ǒ'R��]��m i�z�ő���3	��T�2[�����8����-h��f"��PX0%N��c�~s���*�m��N#%l�NK6j���B�a��d
Cϊ�pެp�/"'�$�,*5�/�ϖ��tlnE�60�N��T��v�G(�k���=	Ll�PC��@��6G�jɏ(��P�DK1f$�̴˴���@����3�q$��WoB���A�?�}Sp.\�uNp��Ķm۶m�v�Ķm۶m۶N�wP5���s��v��k���^�@@���h�:ؘ�W(Ul��T�}od��w0�B�Յʂ%��E�J��)�P���	ډ6l�S7��أ�LՇ���V01ϼ����:r��	��1v~n�f}n9��x����!�1W8`S AvY"f0Ə8gٖ�t0�g��y�͞�a�e��,�RNf2�l��G�:�КtV{R0����0�!Zj��q5�[�oq���"�e:�&��dX�A���}ΡZ�]�8�G
�$}"w����`'�
���v�%3-@����\�s�����ӗ�d
���}bzc�9�c���DZ��r!�Tr#� �`��::φ��9��X'��XI�g���q�T�%0��\�ʮ�$���[�����;�X���8��������>jr(j#�=�Pզي,`���>��ػ�-�\~Lu4r:y��r��ܠ����j�S�G�t׾��'C_�H>�Z���3�|y�Rhd�~�1�*ݗT�wRS��f�j�en�	+]���{��oB~�����n����f��@�FA��4w1�iǃn�CӍ>xF��%����҉U���Ã����F���IKQW^iW��SQ����&��@x�o�ghK�A�
+���B@6s�u1��8٬�>�
iz>HtK���eNFRS��n�NK���E!��ި�uJ�q`��g볗��i�_V
v�=}>�JTz�7p��Wk�Y�
�ï�H��z�4��TzQݢ>[A�=���1AK�+e�yk�� Z��9�i�Bl��
�4���Z��B��
$�Ҧ�� ^��.X�^7�.o���-�S0:1���zH�20�E�{�
���{���~1�ID�����~���h�����}��"�����7@��w��(�*%T@�O?�n���U�mG}$rvAc��V��b�����8�;��Ą'�YS��c߿���'�?����6f�����yx����l}`C��q���̕����eΠ�ӗ���K�*kS�����
�����'�M>v�ls9|>]gg�v���A5���4�������їR.�w�|��,p���g8�c��
 ��a�
X��&(�p0&��`���[�?�����x�(�M�#T�0b�뫾]�F�D9
Ǖ�Q�Ҏ����0���W3�z;���Ԟ�Ӡ�4a�~<�"LW�k�G�cLw��H
Đ���q;~g�>�R���r�س�ހ�"U�R��W�.�����h��K����,jLO,�?dXU��M)�t�K�u�� �5{�1�E5#ȣ.[{i#2X����\�nF����
�'�'����� ���abر��O~�}s<��c�^�{��7Q�?��tFLf���ud�z��A\HsE�r��<�ɭ?A:��"�L��ǰ4f&�v����c`��Ix*s;:޴N����3k�\��Q���j�4Mqj
�D��FFF��ƩcDƫj�}F��k�_��]��g�rD5��}/����:���i�/v��ԏ�bf�����Cz�0j�U��j�J�����.�h�i����q �F\O�~�/	��U�G�a��o���p|]n�s"�|�dtƚ���'o�.\�!m	k���6f��r�\[Py�~�Re�
Hm��F�b;cN��7��
�!aN>��V0|���y�r^�dTß�ΓUɡ��
hU���uR�����A�,{�Uק���uLÝqψ�!�~�+{����@��Y������t����}g$��z�i
�@,��@#�[�iD-���������lM��|�����\~/��>�?��|�l���Ӧ�&n�r�z���|`�1[Jh�� Qx[��,;'Ю�x�`Dۦ�q
�=c];J9�Z>e���L�{x��S��T�2ٯ������-灗*��}5lE�TtX�ƅ
��uڣ�����Dk�Il�q�=��PU��S1(SLSE����f�Q���갟�gwv2�ʑ���'zx�j�������l�uU4i9b]�?#�Zg�G�$X&jzP�ip$��1��U��X!W�u��%�R7��+7�5bw�v��F�q�F��q~�j�lr�
B��]��	<����"�zϟ�o�k �Ǡ
��RG]�{��В{'��$k
�=��	L�{��V���l��0(2rï�m�����S��D<p�@����2x�-"�X���&`�j�by��*����Бڈd���5��8_���3��c|J�!�K9t����(� ϪS3V�ս�<_�\��1��v�J��K�'0x��2l(,�lF�R�e�e���TR�Df�a������t��b��9����bmJ)^�V�ry�Q�]�7M��]�H����m<��������Zزu2~��]}�m���	��|��U�+������5B���C�j:-}�U?��7�7�<��MP���y���H���؎If(�IL5#oO~��i���m������f��r�1
�%o�TJj	�V�T4����Hܼ��$Q������P;�6��(�i�UAox��T�&�3��Oe�;��;ďwR�w��{��Y�D�Q��h���$����c�P�~�>��t�h�����1mX���A��yK���
�x,�DJ��ˢ�_�േѐu2Td����&4��a|�}e��W0�k��F��耀���i�?ws���b��'�#q��J6=no���8
�8�l�؃$1��	��VE��E�F��Ж���r4Z���r��y�PgN��j���qG���u�����f=u���wπ0�x��N�f�#}��S��qɽ,5�tNV�`P�q�B�� �[��Q�x�Ouܾ���.nU�v�#:ʣ}ƊGyH��9;����{��X�:���v�QΘur�ȣ<m6�')_�
��ʸ�E������aNz�|�>�}q!����ܻ$4���6f��I��g�l�{�v��Qc�Q��>w�ҹg
bQo�]p���@?3����͸M�T�oI�쁔��ߔ�����Wܿpzs*��j�[�t�K��Ќ7Mx��M�
���G����|%�R���Σ�h���L��	.��a!�[��j�M[�mx�9Q��T����w8_r+��/"���3|���۶=be=�B=r�<���'����#�T��/޽�f�g��}�>��s���#��D��'�_L�x�s&_�|�rPOI0��C�C���f��d�⾼TsN�3��]����I�{�j!@s�h'�趾*2��.��� �ӟ�w���&��g4ٻ/s8��cw10��:l?�'ߌ]d��`۟����.��x�����O��~�?s���x�(ˢ[~J:8yLY���3Z"0�����fQ�r*,bl�kn�ܚ��~o��3�r=̈́��V,=��~�B��â����7�X��6šM�tB�?��v#D�)�Բ��9q����k��I?�wJ���0��p
9*�k�o�0���aUv&��Y�����	�Ik߈��M�����z��i�nbs�up1�l�X.e[���ƬR!��OPǂq��T�� c�B!VS�VB�u�t9%<��và!����"��cJ��A㏌�֔�a����L��v�ɥ5�nTGb��TNJ=~�T@4���h0�믩�/cI�x��H���/mU��[S)�8F� ���j�j9��Am�Yk~I�3�g���$�A�ָ_��ImFj_�fC����*Ν����sz�5�]�-X�g�����8��[:��prP#�E�J@�^�{���G�9����T�,X����G�����I+Wi�D��Y!�lR����oT_��ꛡך���cտ���Ư^-J�5¦}Yu� ��Dֶ��0��ӫS�egI�ٛĹb�&��}5�W0�aĩ�0肧���H;胉3�E�[���S���]
E��ۊ��,`AnMZv�M��

<�HW�
F=gWAHv
n���6��t�?o���L�M�'�t�@�q� ;�pS&m��i� ˟��	��D::��G`\'����p� &'n�O�M!St�ɻ�5s��Ҫ�Pu@��z��)d9�.�/ ��
T]��N�)�h�0�������#��d�U	߂�@\�)E9k��_���u�`n/aD�4pS�	#�M�P��Qo�7h�%�3R��9d^�g�GD�� ���/1T��ؗ��
�J6�4�`x�P	3����CElnj�7c�f
L
���?	��󏜞_#�mx�~!�I�e���/�$�Z�ֱI�7�1II���B?<��� RC��=#,,\�/6��!G�����2�)Л�뙕C&�	,8�H�����G��	�a9����;=�0g�Rџ�~"X�K�H;�q�t�4�]y����3Ҽ��� �A��[W�A�un9������z��Q��CLov���ok?�E�@�`^XO_�0��HZ�:-=W���-���sB�s�{�2��i�L���G����4����[ۚ\��-�+�@�!��sQ�C�A��Q�[��"u�/sI@@���6Vףּ�n�Ձ0����â�R�'��/J1��Ā�Q�Τn榩Y�o;��"ҁic_�@$�`x��X�Ф�f�"K̥+C�$��&?�(���J���#��ސaZv~A.�<�	q(6�ժR,3�i�H4����K�����'\Se.��l�i�L�dKy�V�7����a��J
�3ˤ���h����(�O��i١аP͚�nW�BJ
l( �	�`��E h'O�`��!`�8mR�c~/�Kܙ!�bĠ�pA�T��f�)�=7è��2'ز�{h_�65̅�p����&0����Il�ѕ�Z!ФN��W4�T��Jƈ��nhVShR���PRZGf��3+P��3Gw�6ü����F������eso[[pT)�DpJ�OS���$�b&�D�ˠDVR)&�y3��;bc^�w�`�M^����S�Qmco /�T�_(w܆�U+�C4�YTQ�HQ<�i�
�c�
�eD���૞wrS�ay������e.w��Cl=�D8�T1ŝ��L�2Xk9���a�TZ����+LUT�t�4LT�B�P4�dO�B�%�lgJ�o_����U;NE\�P���R����L�Kl9_��.&7�K�N~�7=u�뉄��*�
ղ���M��g����ܗ�)�X�^چk	hLtfdT�H�jbm[�T��.�՝��TY�IO��D:��UDgYI�Y�.7DMva���Z7ar�C�Ύ�U���d��aRq��'�j�;Oҷ��!
[�5�m$\�9D�XRW!r`�~qa
�l�tX1�'��^~�%T�G�g�7N	��σ��o�W�mTu��+�FY��ߵ<bI��7G��H��7�06|C0>ڃ��8[�m�Y$��A蜠��k��:A��FT����ػ��)
L�S
�J���Xf��DKT��1c"�O�ֱA��XF�-Ma0��:��O�BgP#��,�'�8��<��Ҭ��c��1���w,���-�3�x^J	)��q�sqZ��	G%�I�Yd{��|{�����4H*�cw��������;o�
$��e [	���cl�`u�l��M�P
�h�ĉ�?�P�@̯��M¢M�v���Ȩ#���#7v��R�5�kTD�h"��2�GR�ˎ��̈́SL�z�4ǫ����,T�+	�G�
2i�40��ɛ�]�ld��:eE��3�����0��n��,[�O���z�m[��TSĎ���1#��M�����Z5�G�?Kց�����5x�5�L3q�E��k�� �s�b€6��20$��5a����"�����'��90�j���*+��Rb�V�r�rV-c�O���\�a��z�@G��,|"rZ�LOU,|�����O,��ͦ�]ib�����u��4"<�?G�hs��H����x�s�����(qt����y�RJ�b����:Ca�=�B��������Į��}�!̕�{c#2ܝ��G!�W���;2n�s�ܢ�Q�bP�M�}�(*~�y�W�?�����:R��8�\�%8��J4>��Lg��i7�X; [mK��Q�:�w~�(�n>ay�;��۝�@�O��`W�"q�}�*j�d�b��	*����I�V�r�H(�*��8-b�Hd�j]�F��=���N��/�0>˰3��>�a�/���O`�꫔}��	�Rȴ�g�p����<�����~�����`�&H���
�����+/��	/4VJ��.��*H
�<F����#C���v�L���
$��O��z^�Q�%��P,AٟT��iQ��u��G�l*�Q��J��32�����~^۽Kk�����<aٰ6Û�~yU�W[��^��<u�p�[���`:Cx+�-�����;دv7&2�����y�с�R82skɎ�Q�b!ƒD��#Y��)!�8p��>*?<�P��3GJ��|Ұ��i0������o��g��T�-�ލ�kJ����T�̍\q��uI�Qn���zĊ4�V@o}�����S�o�
�(X��9���\��@�c���(j^j-Z
,�2��i�
i���M:ϓ�o�"'k�,"�5�w
N�ct�)h��N�$ ١qb�P���O��֓�oR��E=(X-O��4;��旽u&+-���j��<hxF�S�Ԉ�Ά�@ :+Z�9�$׃x
�g�2y-C	ȽX�'��C����踌���H_=�*�Es6�v�#����K[����M���ه�bE��2��L?y��&�Е�K�4��<U��\ ����}J�fZ���n4v��Ɉ:ċv�V�)T��Vl�.G�-:qH�ў(��!��]��Z�7�ԧu��������1v�D�'�퍐=�W�����@���ʓr��C�=ɱ���:cҠ26a�Cr�|l�ҥ6�h��F0��i���j�`7�z���Y�%��_jaA����>�M)�r���+��������'V�rD�zJ���&��)�Z�녒��|���6E�W�!�D���g0�v�s$TB��Ma�ina�,�y�f��>1���U�*��檓}/�ĥ9]��@ϖ��
�Oq�	�W��	�F�8�Dw���`.�P���8wӢ�� �y7��v"5�;���eIj.n��6Uv�������hd-։�k�1��Ʉ�˜Ӹi��7�ºmI�7t�C5s�ۢ�t;�������a�cOj�>�HwS���/�8܁/���7Ϝܼ�7����O�/_�G�4�=�s >��;��c���S��1޾�7��>�S���o��؈�p&�?�|,Zb�6�iA�͑��(s�k(~p�."���a�J�=���2���b���:U�����gm���3�f܀�$�[P�Fts:gˉW��b,�Mݼ�pH�[�R�Ed2���K��r��8Uc$zQ�B���UЧ	a�
�!����7�8w���@R��l���,�*��	�*Ln���XۉӓL8��7<IN��ݫ.g廮$��Qq�?D�bz�z�����	.�d�Wޚ���#K��Y���ɣ7�:�
���|'��W���m���	�I�zG��2��f#e�|��r�dt�jW7w06�7��q�q�sxs�@6������1��m��I�b+.��/5��g1ŏNgÏk��Fa(u����
�
��֯X�*qP�[S�C������V��T���K!ᶂ]��|֧l�~^#��g��j�v��'�e8ʄ<�N}0�Z
<� 4�m�qi��2�V��egj:�t��.x��7�����ܽ%3�L�R�/��1�b�/6�}ߴ�_�����m3J�j�"l�l�50ј�x���(u�]ܪ�{iߖ�;�C����LJ�,1ZK�p��%cf��=�2'�,!~%�,�K)X��*?`�|��s~Q�!����ɥ1J�y����a�"��Uː�*�*ɖ�˪����6(�{[J�7h��A��0rB)��L3�o���r���)��\+�^��;��}*3��
��يW�{��ڤ$�t@�$��E�{�X[3M	[��N`O�����@�!���1�BO�(��o�����I��x�J�!hm�Wچ^�,��*˯MI���+52.
�4u
ݧ{f�|�*��M��
���g�����8n����E�����8[��6,g���];
U�
]B�ni�%*f�n��e+�&��
x�y;�b�̔r�3�g-���jK��ʝB��&�SZU<��߽��ãu]u�)Z	h��		�px����*�{�Y���u�Bժw2�;:;X(��%�΍�����/v�1��T[�z8A`�[m`_�Kt�E�F[�!��7�xE "r��}�vX].	����}�C�t7�)���L���J�x��c_�ҷ:^��'<��!78e�su[V(�&��@��!k"Wۇ2������<M���3߰�ԮxgW�n��/�RA<�Ƈw����R���� 6;��!�c��i'���J�Y����X���d�"�4�d�X�t��q6�;T��Z��G7@;�2�_����X�s�H�6�?�Y�wJ�4!�k���N�F�]��L�m�R���i������5��/���ZbU�)�T5�=�LHt,��u��+��Jc��h���ykn�x�=����@F��P�pπwT�Am��v��4r-û���o+��`+�]g��^4K]
z�Tr��,��u����x�/|ԙ��)��W	^2��a�q)�!|Y�}#?�O�
j�3�w�ѿu+ ���@���m�n�?��ϑ^�$�m��t�FoR&i�0�/G�7�	��Sر(��
Ȯ�&Fwb���ʽ-c�֮���}�|����-��6�_�*�{�q��>�:�>�~���i��A�X�w�m
g�nޒ��i���Aj����H\��>Ib�;�>k�1�p��Z�'��=k
� ���KГ�L�����m�%��e�6��r�w7���z�?�Vv͜�Tp	��x>�����b�O�5\*bCn�x	��Ag�J�$�K�i���J��dLĞ�+�_!��O SHH�7��=�uʌ��}S4P�St� �S�V,Il�*:i:�Z��U�Ws_���:ͨq��1�y���F�	�.�p溃0������.0�l�3��)f���_�rD�����h,4�{S��{<�='�R���g�x���#�}����I�w�Wq5z�(�6���[����L[q��~O?v�Ӻ��J���Φ���-"���0�Q�%8$�����UN�.e72`�<e5��b�̤ڜ�X=��K)�t�v�����1�M�!i���~���Q!�X�o��7��(f�j�X��jxu	�bk~heq�P&-$�s��)i��oS�
!�~G-)YRt
�Ĺ����I�l?b�G#AI���U���p��XH62�,��yJ��#X�+�]�������aYt��F�g�E�eoDk�@��S)4	[�=����]���"�[Ylm�R���3�q-:r������c��#�$�Tr�p�)-y�a���*�~֍�=���U�R�
��|�K�P�4�`�TVR}�~U���<���n�a5���#�7!'�E�n]���_no��.�S�=�
�,٤+��46"�P'r��^0����|<�f|�?��i"Y��@@���G5+��8&�y�c���l_�2��.�~H�A�H0J��jX�3�g$�5f5Qfog_�6r5N͐RP��BPn�Z��X��Ӹ(�5�AA�Y� �����_���t6��h��ly��f9;o�v=ݖʂ�G��υȺF���������e�l�Rڢ8d��F����F���	{+�
o,� ۧ�G2�0ޠ:Ă���z�H�>�A��^#ԭI���߼��>����
Qb�u�s/m�.�uea#گ����%ea �޽���:>��>���9 ��d��&����!Ŀ�wM��=�&�&��S�9h_���
c�:��o9ЀǼ�
s"�y�5�!��P�����z	v���2�W�4�9�e�=��t�g
��E�؈�h�SQ��K弩�3^ײ�D�S�K�LU��[�����h�͜�c�-W���:�P�	 �g�ҐH3�x�m�{V&:x�L���hI�L�}rxU�0�j�@_���诫seV5רIB1�#��Xԇ�b���g���͒�f6��)t���C���+�b([���b�e����U<�Łn��$ڴ�b�yyOԜ��f�9?����!�'�o!M�D�_t�������P��߂U�;�h����Ly2����ٓ�,��)��~�e��T�	�����3@��nD����d��3C5��`�+T�(�\����$�@K�V�_��@�W�G��HhM���/�#+o�..X�N��*,�	1ۨڰK��9�8LO�A#rZT,�Ztgc����V
l��]��d�
o�nCp���	6�q:����Hi���Kl����mj����IndH�W����/�e7f��5�ء�/skҜ=_�7�Zn�[�/���y����y+
���H^�����@���w����Q{rr��N4�Oȴ4r,oN��� ��≻�r�|���|C �q��mf�&�yB��;v���e�t�0g�ժ��s�����������#�J�zljuN�,14�-�(��0H�9�N��)�BZX@��%��-	��+�Tb-
�;����D��K�N�ܪ��У�h;匡:��`m9e\�[Q�!@�'����ZqRaW�Xi���Ʋa��L�e-�;[^S��[�E)���U(���:O���A/�� 9�O�/�m���\��L�����2�@kmh��8N]Q��%VYJKQ���G%�yP�f�
��]��2�9cbE�)�A��MA�:Sn�&�����M�#;�t��șIɉ��b��3�H����Mg�l��_M�p$nHj�QGQSt4�/�yCJ�%N�"G�d���t�&��
�4㇨Lڪ���3
 ��J1I��,�x��P�2ƖM�X���\���N�|iJL�V�h�	i���#%"�?�L����
r
���f�l)D�}���D�
,D_�ƌ����:��m�-F̉8���a�o=��
z�[�媑�gbhYR��<���MZ���N9m�aRR�q!-d��*��z�4)�g��	x�އOL�ϓbի�N
��r�����z2ۨ�L�NR�pJeq=�<�V�a�dy��B5�
�?�.8��6ig�꒑z�����/�Z��H�=ԏ�Q �K*>�@�qH�v��q5�`!��|Cސt�B�p��J�vܖ��!#E�����|t��&o�1�B�Ѕ�L8;�pх?J�r�Q#�f��ZR<:��\MΏ�F�[Sz���Y����`@5#��>�S�s���)aq+\�VxT*|�J9y���YN��0��/�.��.a�09w�=/E�+�tc�M{����FfE0�_��<;#H3m
���Mh��ϋ-�su��D�������\ր�^_L����d��a>/i\�H�=15g��Q}g��(E1~$��S��4V�FS�-�A^��d���}�d�����r�
�YR./�T���ΡT����1��›��8�Zt}dcEr���R
"KMѳ�*i��>?��~�؁.��AS�T��W�
L+{6�0��0����&����	�s\�kھ�
]%��!	���=-�~��^�tZ��)&=YVJ�:W�<��g��yxv|���s.�o��-廚��o2��X�Qt�B��|{�C��'�
!\��"�U��p�͝��.�����#��b���)�A|[�zO�ۏ�=<�*�[*v��)�+0;��d-��"��.��	�i�B>]��}9�
S[�����Ӣ���[�N6���gC�К�����p'E�M�E���u�Ί�W���� {�q,�?#��7a�x�\�1� �8<�5-௴�� �匥��X��U.fja�l�h�bam�υ����)��������������?�I�!������3�y�A���iĠ
�J�������8H���I��@��)-+�+���ϢK�,�O
�����6n�7-+�n^7�)�|�Ҥ��}�D�����]��[�]ϡ��@�v��T_����o6�on|�?w�|�z߻��}?�o��_p�lw�|��d{�B�z��C�H�9o^
֡�DD>�>�$�P@�k!c#�@����(L�2ub����sZ� ��f~�EGu
e9m�9�P�����25���S�4�q��i<H���w��x�x�܅��m�;����FcoԑC/4�S�Ϧ}..��<I�}%�H�b�F>+�� ��9OK��>�z1c�k��v1g<FɷB�yݠ��Y��8�b�z�]K�Ԅ�p1�j���Y�vD��:�[�U�a<�ŻN˹M4���Ѩ՚�H3�ꎈ�˧a2n�F{M�U�׽`v,��}O۽U=��W�8��5�@A���"«�X��[����ni�R|=�|�8߸�2Vs�$^}n�J|����Μ|e�n^V�Pg�yIv�U��-I\30%<4/�n,vPo,dFl���L�!��2�ߙy�3ęO�ظ��s�j��KEn*4?�/,�ۘYc�,;U�G�)I�"Ǿ"�Q�q��N�R勺v�"	�����e�G�_�PI�lZm̈76��4O���ʛ�W��i���� H\l���M�=IT�ɰ<�)����1�۬��o|:�;�˻j/y�� V4A�QD�d�V�����4��ҕ�ƥō�k�^Ye̎�N���҆%��J�%T��a���OP��DX̀�|�v�SʑI���_��Mw^�xy8^�2���K�\��s�ߍpLL*�63�����!��%ݖy
����:7S"DWG���,��vn ]44�I��X_4
fc�tK#���/��K��k|bQZR�7{�8�]�����I��R�i�&l�ә��Y��z&��ޯp��-�x��),"@��C�*q���)�w��C,t��f���o"W?&�@V���gv��k�HԠ`�;͒}^�e6	0����A]Nj"r�,��T�44к�n� 1�N&�����q꾌��|��{r=��ޑc*�f�B��9za^ג/g�-���KcVZ�P�R��eڞ�:�i�Hu�7�{=q��$��}"�ښ.8g���Q`��[�O���g�����Lj��ˉ�N��F��Z��4k�H���X�����%�{�a����l�����$n=n�7[գ�λ`
-{VCU�$�u�k�Т�}sV�O���>-ٓK����	1i	�sugWN"[�{0n�0Iɗ���P�u��t!�2I�#�����(��u���P����r;�-|�w(x�D
��L1n��%á)�	*��7�Z� +��E��|c|T���
�<���(=��rA��߄��p��B���$��
s?*B�M��	�@k��-���I��2_��Q���`�Iu��GH%ފ�&�J���2�B7�Ǵ�I^G�J7���}I�{�B�V�w���88���88��P�7�A�����ĉ���9&4�lU�i��yyh���v���u8y�R:�$]�C6�1U�l��E�\����a`����@Iy%�G�R.�!�[*-�Q�7'��k�����@%�8��)�bv���ܢ�Y���
~����gS�x�5�t�(L_�_�xl5q.�PE����@�k�n�vG�(Xw 4��������csPض>�vN������ꀮ<d��y��P�6_Ry¡`t��?B�!�U�ϸ�[���-����OʟY�YͯW���l>��0�,�Oe��y�,�M��n7r}�p^$(ڐ<c�r�@_ymߚTF��m~���v�C|>]�5��hu;�xq��=�d7�
��Ba������:v‰��4�˜�M����}.����I����(�?�m]�=��>��c���|~�sB�ʿ.F��,X�-@V�%����u�K�M��"�6�i���J��Qpy+>����x<Km�ZC�c�d�#��B�
m�
�ծ�PƋ=�z0��9cq��@L)��09�hQ�ŀ�[M�T��(DA-�G;��l���7����>�:�J1�睦s�-	$�/&u�Q��4�-$^���8>�?�����2.y�m�B��*����uz�a���[8����;:8�:��LF5��6[p�h����N�-\ײ4��y�;����#X���4��jv�
�p�����Iʆ#2�M�z�]p/�����6'���3����\�S�U4d��'���%�Ns�)�/3<�
}uL�t0c�*�#[;�VI
�T��V��Z�Yz�ȾX�6R,ͱRu�"���
#��F۲Wow�D��P�~1O.+PU y2�J�%A�glI�u��w���y�/�g<`��,�t����:9AS���P�����`-F�ow��Yŕ��l��*��7� �Ud"�0fR&����Y&gMB(ͅ�N�N��\k`K@ �UYa�f}�0��_�+��e��7C��00�-VL⎽��*:/Ѧӯ�	 ������M��Z�+�d��J}���;�,��0�G���F�c�RW�
o�*V��Qh_�Đyt�>Ӆ���n*����� �3��PI�_�ޝʴb�n��O6v�q3�qݧ�0c��.R�!j��G�2��nj=DfGy'�Q���!�����]��ց�f/�p �5��v3ƒ�b�����	��jh2a1��\A�r��c!�7C�9���,�i��`�L5���+
�8��~�*�r��r���3~[�е�ﲃB�ޣ[�"G4�S�bG͈{l�"b�Cq}ʄ��h�"{�C��J��=_�k�
{;����@\{�w��a�7kQ���d֩�S�V� p{�ܫ�*����Z��'��Q��5�φ���c.�4�I��t��V�h��R|���"B%N#Ψ'Xp��I�7t����1 _�៵G&���zN��w�P��[
'���l9�qSd�8����$N<�!�[��1tZY����|���\JA���<�&LA���-"1�n9a�C=Q�=ͮ@T��a_��/��&6σaL�=�x���oh���izG�v�9!;��ǧ�Q���9��C�A~n�"�٤��f ��j)e�)e̶�4��*2�˔�D���U�D�PӸ��m
���(t�éb�,,���0�T0��TK2ӋR�1��b�+5�DC��* �H97��l\tq�Л�(�}�e��G<�E��8`�t�Q�GS:4q�;�~�^/E��P��ӡ�(�5(�*��*�K�^S&��ߙ$@:"��F��bذ+m��9GI�Q��3I�3�?I*<��EZ�$�V�L ���x�u�Q�Ӽ�r�+/�]lo�V��c�K��Ӟrj�1"*'�a̺�)��84M(�hi���ʀR)�#m#�h��NԔ�T��)cU�y�^��p`Ű�q��w+q	�/b���P1�d�SU���F����9��
���ޣ�"R;�M�p�se6�>�2Ƚ���W��-��Y�r+�w��,����qd3i]B�v��QS�{��5zT�ye�������.牱J�T4��`��`���H�}K����;�P۳�.��*[t?��i�
&��O�N#�T  ����,9�1Y'=���x����(�Q<K�	��]s�&J���q�@b�4g�,���*)��0���3񦟛��̭g�6K�����Ka'�)�t�5�~�->���c�1���Y�y@<��3E�T<iRv�X�[��@����*�Mގ���B	���g�x�;��v�ތ��
Y�#���|E#a޵�q�b��㙢`0;��0$�o�ԇ�t�\��+�a��@Œ��@�TN�� 0��r�v�����R�%��Zŷni��(�]NvC�,[8�=%��~2���6�m�]��Vi*��Zhن^���3]�{ћ`QKW�c�,4Vh?�jqk�m����ѧ�F'w(��j���6�����`���0F��6ONw���mr���>����emb�Z�i1E>�O�r-w��j��w��81� ] Y�m۶m[۶m۶m۶m��y�Ok��,�ETDVnrY����j�["��M$���,9���sy&<ګ%�bT��Q���l������J�H��I8"�B	��w{&����]ٜy�}�p��e!�#d�f�ٙ}<0��"��E��8X���@�ޢ�	�+{��5/���XI5`�j���=�z���p>s�~���(����
qy%xPWw	h�/�ۑ��^C���͎+����=,�[��V�����^���� ��i�H�P��X���|A�p+���GV�5�~|�_l9�_q�v~��_͚�4��1j^oh�?~��ſh�7o��w�y�?#��!(�n"�uQxe�
�=~��|e�E���Q�gr�n��w%��7��?����Pu
��kF�	��XH3BJ�LmC�&�G�bj�ՂBH�&\����0����Py�o�:�uM]�^m���������99f����V��|�{������
D�@����(,�He�C�҈>r�p�;p��"Bx�y�r=�D�q�j�?"�XԴ�T�"�r/�@��h�/t奡�*�Ԭ���̔~(�d�q55�@�s��<�(Ft�eX�9g�e���b�}��(W�e;�2���б��Ts��t�q��U1<:�1�R��,�.j�L�2j�,�6�x�1@-�(�,ijB�E�TC�4�M�#s9�)��S�Tk��FNq~4��;5��5H�%��-�К�E���/�sB��4R��-���)3Y+u�>�w��D�S-T��b	_߲
�	-�r��ܲ��#�D�.��B�M^�u��h[T�=K�R���y�t�ܚ�zy�ͽ�sǼP��*����)��ľ@�-��8�J-�P]�0���ꞇ��a�PA
�2p���w.��D��\E�vE�k�lz�:ב�Vo"7*2S��K�=г�N��9��e��H=��=��oJΠ�7}��N-�$��t��cv�#w�#�NN�������+;����p~S���}�
S�g�2���UӠ�|�F�	�R|�a��4~�ɒ�^�H��3oєp����U�۰�p�`m�hK�^�^�L��dL}LƜ�r�1���c��2j��
�G���N�;�胬c7@�Q4����k�!����2�[��u��5�F�L���KPv��k=�:]�s�*�HƼ.xyW��`�[|
+���d�%��:@��H�[rJ�v�E!MO����a�I�!�8&+�e���T,�D$�5��b
���,��0�~�4C�TJ��& ��z0;i
�2@x�r�2�\�QJ�����Bv&#/��znvf�tf[��Ҕ�~"b�7M<���B�tdXc�8g̡0�6GVc�6�� P*Ę�L+��r;�	R�:GgЋ�4;{9��� ��O]����N�c5'���JE�Η�.'Fxm�X���J���k��ٜ�]���1��0�J��	b�MY��3��3��S��u�����Sg�vSi-�h�l3�����+2'��V�J��%�$���՚ӓ����Lt,o�d��Ϝ&Ŗ��ry�4V����LK2�����=�p䑈Փq�S��9_�
���`��5R�),bt�2���V%F2���A�b��2j�T�͠���W2+Jr*��J
�|9�R�3j� ��d��/Lk�!-����֓��|Q���@f��[���CJ�$��+e9�ɸ�7�P/�6���bj.j�٫����4홻���z�����qچ4��

}J>C����!Z�TN���+����r�.�_�iʂwnO�e��$�J;z*cz�������9�\�K	��pۭ�%���JN��
NC�o�MG�}0A��0�������8r����.'*b?Y�
�LZ��X�U�+���=��<%�u�zѡ���O���b�}��|����a�_Z·���+y�)ث�G�5誅�ͬ����u�]��Ah�:�D��1>���HcD�o2윻�#ŀKk�u���k;������]�Jr��	(����gg&E��.���(^J�HtNyoQ{
9�вz���Ȉ�I�`Nms�_���]�R��%��&����!2T�H�l�Mg��pZsc%L	.��St���6�
�ּ��*�̓H_t�vV�st���O���Ɣ��ޘ�f8���}�]HO�Ə�y؀)k�g�&�Lj O�ZO5�-�cT[��G�
������M�qHq��&�8H�O�i5����fKHG��PR�
K{��FC�ȑ
���頑&����Yٶ�Jt%X�[	�����Ɔ���ǁm�7R��$�n2��\iX .�XD�An��Z<�9U�(j�Z��8��ʂN2z��"C�x�HNָAd#��8����c�E{E��j�uB�����j%F�� WO��J��;j7�1`Z�� ��R�/�B�����X�XB��{� *��a΂:�+���rBBN�n��;������ۤ�����t���ӄ��4,�l�`�s��i��,߇�����r)#sZ�w�Mm��gDk_�!�Z��L����:�J<j^��H	��:�'�0��
x�~�W�U���֒(ݸ�	�n�^�6M���R���a_�f?4�&$���(yrc%�]K�!˒�qâ�H��Q���2��񾇪�_^~�n/��YP��ޒ�HPh55b�LMF�5	��k8�#	4UȒ�[��tN]�;��<NS3`�[� �<A쫲�9��12T�����,A����h{�e!>1�h�4�'Djzq�H�n�%
~:I�����~���&ۄ�o�ћ�α�`:�4M/�%bX��'[�*��Y
)������BМ��QDEш�zɵC�)Z��1�#hj�d����[�Q��ꛪ%$�k�|�𝛑���ƣ�y����ٱTr-qe�458Hj��+Ӱg�{Xi]R�P���������4g���lvP���� M��`@)��%���<���y<`�B�V��TeG�j��<��.��+X>�+%��%���a�kyd���
�T�R��9Bm��Q^�	�Ԟ"�ܚ�[7���&)��L�����Q��!�����l^�n�j�T=��h��1S��Z>c�m�p-�t�=�"�t",��K�fl�a�N;��m�Ϫx����ޱ��I�ۣu#���2�ì��T��YX~�*	��txiz�FӢ8�����N�z���97Y�M�ll_���h���kN���A�Z7�^D"�+n�RT�5
�/��9kZ%eb߀��T0�ڡ�Yͻ�[�|svP�Е�������bt�� ��ȶ�j���Ϛz�bv��u����t��!'8O��\�6�c�-��(P0Y������U���#*|�E�8��-�|I85����g�M�M
Ί	+��a��#ݬ�٫��Ű�1q�l[�}��S7�M��3�O�p
a!���P�-�A�����)���2>'x��'�m�J��X"���+�>��f���;�����'e�G�����<�G����d�J��|q���w[��Z�vD���~+�x��51n���
Wx�8^|�Q�����w
		�9\��9x�_��B܏�6}KÀ����h�"���!�[��Qi+�1���FMeW$X�e���Z�Q�)�d�j,ュe�Mi�����'l��1��,G�%t�@Ge���E�;5������
d?#"��H"E�М%%�e���4�t���jQ!����lE�g!�Н��Xo��5ڥQ��dlZ?�;
�'+�e�=�=��C��Ns���H�F�ݷ>r���>v�r��Y�r�<l�7��'�d�I>Oz��hn��U�,O�9e��UX�F���E)�*��O�[ƇNe�)v���p�O����9�:��3M����
��3������[����Z�U$�UvLy;s��p��X$Zm�1��L��+[��MN�-3�]XKlw�'��Hr>� ��'��vbH�TFM]�:�<�m���I������WR�~*���%�*���ә/"ٟ�d���Y���E�p_B
���J�Iͧ�'
��AX�A���ő���8#H{�\FZZڑ�5.�P�~M�`
Q$�:Y��z�b1�j~�jgȲ�#�������)R_��E�!����wN*��H�y�`ۂ'{��"�bt`m��g\��J��v4��[��e\���X�#f��kg�0U�06�"�5��Ԟu[e�y��_����]��f��C�DA�UK�����o{��j$F��BN�e�|�;�f�>"D'Y2��ġ:f|�	E�l��s�vv�LS�Y���uS+��9O�nϐ�i���>�q3!�S� e8Y���/N6�kUA�=ҍ?�h5��
��Up'�&���?2%��B�@(�����<�<�5\ˎ�\p���~�"��2����"_��9�fH�V�}�G�S}���p/�t�T{Y=3f
.�J'�4���՚?~㽆��&���;��'ԏE;b5o���z7^I�.�����������9֫�@Y]��O���T����jٸ�DZ)k�ª��&�b�=7���ߞ�%|
e�5�c�qC�������Qc۴�3%ӱ�T٠fh�Ǔ�U	�-��8;�����6�oƙ�s�:O~����E�Ʉ���o} &>yd��0[#��G�x�D#�LKg&1:|=�r�V�OO��_5_��;�o��#��O��
0HWtQ_=�i�O��__xw2���g�r���x�ͧ���__�ɿI�m�����=�:x\-�_[����ܢ�]�	��+M�K@��5�?�cϢI08��:�\,;%lEҲ+l{GS�=~��_��Ir�t2}���K���eZ��q�-�ͿEM}{�o6S^Z7�d�S�m ���D�֠�����֡m$Y��p�m���i���֤m��������mK�ز��x��2�Qʔ*��c�G\zPr�?|1~s�M��d�-�I'%<;Bo����a�9�V���!Ugg�a����=
��zӾ�e��b��2�*/�ueiVg��7&V)�ڈ��*��7�~1T�Ӻ��H�4��ʰ��Ñ�葊j^�>���?�E$!�
�h&x��p��~h�0v�ʞM�ߣ`+���ˑVb���_�;�/���:��r[����&��GN�w����T�����䉘�){��G0pW�48&;�؆YjQ-����B��$ө�d����i�G���`[6�o'�aV�@P�2�kb�2���Q�N!mUnei'ha��A�-��ьi�%1È�+�8Ip@�A3����N�S�Y$��*�V>P&�R��I�č�c�D3�7T)�No!�>u*g�>��La0� c4��j˅k�N�mM>�G��@�6W��N�#�k�vK�!	�(�S2��JS[?Xc�]A>�Ho����������ud�V�Eǔ�
N=�3]�k]�[F�S�T�A �'#u ;Ū�豽�ҊS��xMgվz̸(�����,�ST�֪�ޮ�;��ni���rO���sg30i�����p:�T��1��*}���9şޮ�>���(9a������'P0���1Kw���X�/U���_mY'��D�o�3���XT�a-bI���}�	1v`��́�Y�H�z���ll����tmy{f����h�Y�|)6��I��؊����>�rN&w��[>F[;�����
�wE���:+��H+��ؚ\�#@������ϳe���Ո��1�Y�t�\u��z[�ȥ��ԿUT_y�Z�W]N���EP�־*r<���~���ơ5H{�����Ȅt|�v��rC�U�VP�GI?��t1�E�Q_{�R}5���S�c_�P<iC�p��[(�EXph35��2�H��q̈́�v`:i�^���:w{�:�q)��M��38��Ƣ��4��[�Og1a+j�-+[�H0K�IB��wK��З@se��r���C�Uo���[?k�i�fG�$�\����~%C��mO�1�K�E��'9�	^������xw���^�n��U��"2��0X	��x�YIH�����i�-:r�4,Wխ�=�+o>�Z�����\jϼ���%�H&��s��ʖ\���`Vi�{q��Gk�w%��-�Hq����~r|�DNU"�Dc5y2-"
IG��-�#n^9ؾ(*�á�} ����IEk�Iʝ'���@S� -r8�L�Җ�s�
eNSB��6e��?�5eY	�x�����X-���XsBp������J،�@.I�|��r�WJP:��:ؔ98�Bq
���ApWԭH(:�3ms��?`$���ף��[k����0��F�W���|�`��[
��s_t� %��㫯qZ��O�A-w�R����\�M_W���t�Q9g:��acLl�J: `'��*�t@�~7�N鷩�}�?����8C�1�<�.�і:OɓN�^�����#0R/���Ƹ��S΁�;Ø��r��Q&U,c�\ޱ�0���
�Д8��uhx��t�NӾ~B�x�(��`�{��5�ɿ�d;�9h�qVh�(1:�:א����^w�zм!boǪ�K��d��e�
����(WZŠ���%������XT�����2�ݩGA��E�U,M�{m	W��Q��/a]F�͠G�e(���/S��0T��>4���!VD��^���(�nM�H��W9~*�ec�239��Y��(�G�$&m�
ŷ�n��$%T��g ��,%lH�X�'3e���(�C�R���S�O� �Ì%�Cɇxi��/^ųk/v�|L�VV�6��wx%�3��d�vߞV���kOW.��y��V�_�*�VJ����QU�A�Āj�'�VI_�T)Qs��Kr��T�(�S�!�A�s(��_u��L8q��"z�
�Pj_���3���\1�TN�V��h�o��^!v�]*�xyh3�P��n���#Բ/��ʆ��F?MXh�ٟ�z�B����[�j�M��V�/O�Ց��A�dͅ��;�޶�LX�3�����u���V�i�*��x���g]1e�ӂ2�-�5lŝv��t ��_n�&m%�FM�w<[�Y���~2�������D��F�]��թ'�L�kk"Ao�������1VI#!�W_{c����m(�7��� �>Ї�Q�H	&�( �
N+�)Vw�k�J{V�?��d��5J�V��b�W̜V��!Q����!-�I�2g������vUa�	<6Ӈ��'1f�s�c \��P��S��-�+/��P��I1��m��?��&��cՅSó�ݎ����h!��#l�b���kZ�(��������U���I����6�ٻ*�Z����k�]�yPA(Ԗ�ي_��$\��0��xL�FE��uP�)P�O���bO0��b�񎿨���G�O�3H�eK�]��O'�H�j���
i6GX�������*_�S��Wsmī-����SjS#hؚ��>s�D�Qm��2/��[Q��VƯ	��ݣ(�G�bB�J!�+�v��_:�;�E��l'�J�;b�pt����S�Ѣ��e���1���R9��~Wz�A�%�a8��ߺu�_ބ;�a\��g�Ej3� ��e
�W	���PWQ�Ap�]���yQ8�):F���2z�|n$3� \���3�n�H�4�%����lu��xr�U�k����v�Y�i.�⡨�
�E��E�����bܺQ��K[
j�S��Y���2Bs�ݿ���RR�n��B���(7d�iV�љ��.]�4���Z�<[4���Z��s��aS���I[��#��>W�<�Z�,���T�i��/s�b$�8]d�S��dg�u�+
ȡ�!A]z��2�XK�QXR��;��Q��!���2M
J����ޤ�A�t
�4�F>V�,��x�NLā�U��7�]���ݝضOTrʚ��CA��NK���	e�;̝�ԓ��,��ܲ��Ţ�ċ(�='��O�>���Kk]�{�{zY�<o҅Ҳ�3����v׶"�|Wc�sk����w�{�X�%�r�3)��6g�j��U��ݜ�C ���"m����o���~��ݣ�oW��ac��U�e[/��S]�����6�v\�;*ŗ0��(��݉��V��ɗҘ�Gr�h�'ɫ;3���;�V�twV�gBIp�t�w�m��o�Т=s�&���)����{S"�!�ɷ��ʜE��=��W�}�X��
���{��	�
e{��>���,�~��#G��Vz�oH���w�e���V	S�wN�I������>r�KL�~!󂆸qW��Jf��P�lj~V�Y��j��B�>�XA�Z"It��V&��k�o����P���}
9����Z�r@��%�+�b�~<~{|���"xI�&)����3w��SOGY��2	S���
G7w&��i�}���}ǻ������L\l'�}yɊ�-%A�x��;�c��~��B�����!��?����@��4o�׈`k�ķ���C|�֥���Ԭ<HJ��F�*��@�b03κ>��yE)��%��cᱏ�2�!bŖ�Z$��"n��+i:e�
�
�8wmCF�HR	���U�� +L{�Y`��8'��S'y�S�<�%n@���h�ǣ�K��Clǎ��$^4n9��D��uy��d�K͸��rg-�IM8z����՘t�@�q�����`(+k�㭍b1ջehVE��ګ+�БԎ`y�-*���8��R�t��ӽI�cq�x��x�7�
��tYCTS
�H,��;�-6њ�Cr�K�B�z�=-�<�7�w��	N�����>W_>h2:�f8$��թH�"C�)շigVӳ��n0p�EGm�vn5���tQ�G�:μiN��ܞG9�`���}G�,��k����Q0Y��N�7V-��1�ku��D��VŲZ� ��݅X�=�i_2�P_�g�I_�Z5-}D�L�T���[��xÚ������9c6���_t�O@tZ^�H���{�jPK>�b+w�gr�[X�Kc�S��/Ft�Au3���,,p��7rg��ޢT�E�Ł&�5A��`��uב��F�g���G!b�Fe��rj_��B��\�x�F��;8���Nh�Ľ)=�ߚH�$��1L�V�nԧ����u!ňuC��D�(w�u���5O�������j쮛�7e�/��VI:�9a�$�RN'z�yi��{��;���Gv؆TI��V�.�ڠH����P�!O�.X�^���*|xD���-�3����B�XϹ1�F��|��G^����:8\�Sɶ<�*��(���[ѥ+�ٛқ�|
W\���&����(�����\Wd��zRu�ZfO�:���G�6����.���T��pm���{�s7��e<P��ZD���zp�ct��zA�Z.|v�cL�7/W�sW��*���A]r�@���
��.��*%�X闝��K���ƾ�9E?�2�е �l�'�o�$����}�G3/����L�*��'X�}�m�G�t��Y$����"I]rZ�&D�'��MA�ciDž�DZyC�A+Zw�I1��M�-mn��-�f�u�=��=C�Z�rv�h�ѡ��@�#��@ڳ�
��=���_�u[��_�ylIt��.�� �w��ד��u8��	滾n�x�rR��S�#���7ܑ�ڬ�Ub��c�W��G��pNpκ")�9S�\��-�	���7N�A��Ա
�3L�%�v<\7�|�(;-�&k>P}6A<���{�#E��n��߷���A�J x>��Wπs�=�Qߚԯ�l�*"�;��(u�8~���i8�w��l��*�mnͮ��o�J���űlw6êS�����]G�(xs۔��?�5zm�i�tWd˚����y
|Q��RF�.籷�z�-#oQ(��q틟�VG��[O�4(~�(�e�d03񺰹�A�,
��V��;�$�w�"jFQ��d���nf= 6Ž7f"qU�U~�*��9�=앒�/�,�Y4�]o�wÙ��:�K���9�
�J�G�G�L`|�����?��/qv�.DPȄR,W�<��K�'v�m�yMq���5�
5���;� �'j�>86��
����'蹯Z��ł���D�RqT6V�<��\?#t����0��-�ҿAg�>�ް?!?)?s�c����B�s��c�!��\~��z�Z�˒5/���k).E��6�U.���ʊ�*�15���.�@����<H��@���rK��z���M�d��6�~��9��[���Ü5�͏[
�dx�݆@?�u�ss1#Bi��t�#�ŻC]�ΐ�g�V�E��l�1�g�I-d�2����]��g�3�'	���\nn�e}+�ر���5������z��RG7iL�Qmq'*���:�#�bǜG�9��9�$U������j�j�'�����65���.��|V�K����'�ثG�lL~'zZ��B̈�7�5��!*��k�
u���̅�&�����B�5�S�
�u.i���H��DPR��fd��S%S�r�F�B�d��N?�[�N�bC�ɮ1}�-�^��ٯQwM7	Z�~Z�~l�º
�՚�Z|��%A�� �߶�cw�$e�����������ﮉ��9��2ue'�k|�D�fX�u(�7a<p�+v��t�T�ؑ�^ѠXQK�h'�v�X#�{G{<%F�%e5f	A���x.[:�MU����>������UL[a.J��'�2jg���]Hʇ��!jMO�0���V�:����+p� ���%u:n�\�B�%-'.���zI[^ؗ G{��ޱ��g�ȑ0��H��S0wj�[F۞�T��	S�/����(�'�104f�r&P�L�:�Q�J����א�Z��&<�<��-���'�y��g:B}��#y�}��C��y���M�s���&j[6���Fw$���6[�x�f
��0Mf��[U��y��Mq[�8݉��-�[{��;����[�7��!}S��[��9s�f6���&�\Кc���Ϧ_"����0_:��M���Õ-c�)�w��M|���?n��
�O�[�Iu��-i_p�ѿ�u��%����O���)�sf7#�X?d���'
,�)k������O-@��6G-����Gf�b�QF�j�Fvʼna��6��`��"�nt�Nx;TٛK�1s����H֭�c�[2'|^�[�ȝͫc�p�`;�ֱ�[�G^
�i��
p^C̩�[c�\=��Y3��yC�I�6ݩ���F3�����="E�)�M/�-�1�����3��ވ=�[����4Ŗ�w��L�v�Ӑ�/vq�p_*��ċg#_��K�'4��� ��GeK�2>��݈s�Z�a�g���/�/\�p�N�-L"0��B4���\�n>�o x^(�7�?��0��v��޸�� ��н��S���q�������r��Y�I>jx��2��8rǎvx�!74�>����a�E���*��e{��b%� ��q��s928z`�J�abA����_�qw��`��vs`�Ve:�2Wo�AXY_v*�U�*[�#G�)�j��=J���$�BN֋����#�_U����o�,"�n�3��Z�x���J�|�x�(�P?���Y��@�8;��[�o�?�L�FA��~C���²�������0t�$���ErAzX�9�XE����t���_9�!����F���I�Y9v+=�CJz�"1g.V�`����I)xp��w��]��l�=H���>݇�s}���!��B��>

�/)��v�z�C�%w"�,fЉ
:�,���������67��ypH����&�r�,�o~!�C�\8��=�{���o�Eކ�M��Mb�]�(l!��H�I��j���8'��"��?�
�bB
c�A�� ��|T��B,\b��'&Dd�cK'�%��s�d����|f��RȄ��W�T�=r��<Я(C�P"�
��3U$��8Rfsx/����\^�=K;b���#h`Z!��F�@�ǎ��識3�zѴ�U�B�����CXzW�2���<�$��#!\�8­)�$��b�?�T^��1�1@����W��j����jF�4�m5�Z8��i��Q-���˃e�c�r}[�I�4�=7H����g$֜�r`���=&I����cP��c_;��ϕS�E^n��,��s�v�}�����&���F��:��m�
�Ҹ �$�2�u(L��@/s���L�E����\�����aF�����H�Ȫw��-�Ri(X��Dy��gJ�P�ڢi��G����j�2�ub��4ع(A�T"\�ee�L�^����8��0�=� ����7�UY�d?�j���;^�U4]�O/h����I��JW<�B&�J�l4�`B4���K�������A�8c
6�	�'����&�ؗ���Ԋ�h�+�!�"_�8���U�)�j)�øA�!t��."j6��$:��<�sx�>��O~���O����\��������7���
�IR�_^h]0ÿ��D����4U����=��nX6�g�F����4ü|����o�s�U���g��>����Хe��Ps{���+��>����[�_��q~�)��8‹��i~��3'����]ʶ�3ӑ��@��wr$q{����	k�/�oX*�w�<������Ud���R�^N|ߜ[Ŷo-�G�����U��W\غ�T��Km���yJ>��>�_-��{���²Uݻ�B��-��uJ�gC��E����ŕR+�󑛎�f^#0�~+�C�a��?��	IG�_,�'���U���_�ً��/��#�_��䀑�/Y��� ��V�ߐ�/��w���/\.L���!��#k�C�#������PhD(D>��?������4��l���O{��|���H��@���L���#�m�O�h���0��#�n�0'�a�h��1:d��e�R�<"�Co�s'� �k�Ak�gޡ���\��I�%{�Μ�'/o���gN�C0*���ua��#G8S�=,�<�6� �342� ���s�* C���	�Ξ�G3�={�e.hD�Y6%Rb<b(ύC��xUTUDi��W�`F���hNwĘ}i7�>`о��H֞;9�	�����լx���
��Vd34��V�lK��R�/eAΆ���@�_w"I��g�� ��(8�p6a�xd��$� �c�:-seK��i��}��(i�@��0�ep��Q��Ӝ��	�-y�09PEMap1@��C'1z�>&]���&�8�h�$j�i�DV�?-N6ƝsKs5���_��m�_�k��&^�&��̭0mI5�x�����{���lH��1�i��\I�v�;�-y�-i�6I�e�w�k�;��<��poB��H��a���|m����C����K�D��j��E�%�/K03o��i��v��\�(3��䁢a](	N��{>�I���#��9z�h`6t,�E:}l�I6�u�W��9�|,�����
�{�B�6"��X����̉]�ڽ��v���D��e�,��$I4�rG���}�~�� 6MD?�1���P��}��*/�$AѼ�&�y�R^��ոN|8'�T��N�1�)��FطW�+�.�跦�lcd���1-��>[�\x��p���`=�����M�z��8�U(��c�]	�
�"X���KN�aa4+�b�b't�HHG���BO��!J����O,���F>`�Ȋ]�*�
W©�H.��BT/���SW1�ә��S�}]4���c>��-�w�Ɋ 4�
�A��n�ŬB0/2�� p2���U�,Q&��r��J��ej�l�(��&�n��hUܔ�9d�
"}p�/��1F'��Q�B�/���!�G�(�B�^�QB�:O�Ȏ%�/d�g�M��c�MRG��%,�=0[av��4a�����t��ɓ��;�2d���5{b�ٳ�-M��Z��M��c��L�wQ�.���`����[]NJ=ߠ�χ�W	�AuɴxQ �5צ�R[������V��c��S�
��R��R��P�e�S��4��s�����D�/�(��ް��J����!���Q1z�I��)�QS,c<f��!G̐!�o]88̐����a�@�m�u4���6��ɐ��w��Ǐ�=+�[c��V?8�sb����m#��8�3Q,��=���槸�(�S� �3���$8�D?^�t���O\9������8��UR�V���B-�J��YbD2���$���2�Q�� ���
 ���+� !ۘ��X�h�f�h��L�
a0���S؍��B�:gr�i��|p��.�$ܘ�Ij��?�����]H��1�ZZ������Z�������p�A����ќn����QL:cq8����P�a�����x@�UWĊ_��
���J+ԅ w�^�hk��Kr�,|�]Q��qp�h���ѡ����#g�RKOB�����4֫����	����,��ms���X���4���lĦ�ûo�ؖ�θ�勥��B�&���փ&F|9g��`[���'�vBZ6S�a"��*�A^͠�v���yJ���Od��2x��(����<��2DIz�`����t�tB���G�d��nM#)#Qwr5�йz��S�0/�yצ�����+�QU�%CI�Ժ]��Q��|�q,mzS��N1�uؗ�io�3��M׼x]@��J��-�YI��r�š̨�Zn]�]!�!o���Cw��E�֘�����||yP��٥f�Dd��5sqÄ�?Z_����+���7�����'�Ժ�!K/���C%/f�Ԍ!�.��Sv�T�A�.|3[��S�F5}��i�C�.�ԍ��=(��Æ]�?Ż�Cgy�z2<F0���z	�>���t���FƬ�{��П
���d2��;
���\4�}�1Ihc�;��L N2c�l"�]$�1�w��?�Z]�뇊�s��6��!o۷��+�F#�B����݇��t��]��dF	0�`����w��/��W'���^Ԩqїj��ڪ�����f,�ڼ�f�+�Te�C��#p�Ъ{��X���z��LR"���M]��K��T�����P	@h{B�R�Q���Le=kP��ؘ�8$����A<�`p��{��A\���W�5�WN�w��M�y��Gv��&Y�`w�6Lia�D=��L#��?@���
����Y�-�H`_�N[��8\�"�I��l͆�W��NS�0XQV���P	�jP�#ح���0��t�5��.o������L�U�w��=2o:���MT�_�7̯:1���|^��޾��z�~{ܿ�t���;@�4���
�&N��w��Ĭ��`��KX���$���E}g�sJ=���ɋ�h��?UoH�m�\���౓`��`ϪL��q�@��`�*�����L"L
f`.�K�.]'�
�i��-����h`�����b�v�fʶ����?j͜m�E��ZG��
}�!�����MےJ�)m�=
��̧WD��Z �z_�,�d���I;*��R>�s���z��kǡ<m��a!���V�a�u�9�ܕ�j�
�ҫ1�;2��(ׂ�ߘ�CPw6��~��G���'�n�>LB���U�q(�ȇ�G(/K�[#�̆pq�:��;ā-�u͕���'�#0Z�����;�zV�!3�3Ą�H�e�)a8r�B�CC�`^���W"��L���J�CB��2��W�W�0RU�/:�q�)��<���L�߬%Z�߁x�/
�
����s�ed/!��"���a�*�-���'p
-%����b}�"j�/�B��"x�G8���L\:��$����>��b�&����Rw����$i,���,�:q=��ݒ�6p�f�ٕy���}r�^;y�T�5�I$�K���ន�D��>=�PU�+��PT|��o�{�A��k
r�
q�
�s���?�B
�*d��#�[���Z�)Ri���R��1���v9S�g����p�W�n�O�1��zb�O��b����vNA�0ۚ.۶m]�m۶m۶�le�v�]]�ϙ91gb�f�����\�����2�}���oVs�z�_.�=܇k ���#H����syA_�d�$�3��r�Z�:�FoMp�9o�4�ա)y���y�p�8�\����s��1_b�W�@�C$"l�B����~�}�S�cI��]�8Q���O�����!�ѯCN]I�n:��7��y�fwW��F�]��e�_l6#�[��n�('��D��(�p"�1ǒ*�>9;��ި�.��Wߢ��R��s{K���5� ��.O%��v�v�P�q�$-�nG���Ť&��|������XW�8����j�S��6�Q6_d��/��X����k/����|C�Փ́:>��O��ڰ�G�]�?jO�m��y�A����ƛd?�w����m`��s�ތ�Az������
M?g�pr��s;Ƅ����Gd_Bgu�)e��-���w�M��wL�$������F�}��m$Mz�z���^xaw��R
�Di��p.�F�0.��׶MKZ)��Kʷm��I�(ίS�O�� ���1��@}P,�b/�Oi�iA�����NT[�fineÍ�f�{W���B�РO��_�X1��ς��$�I�U�Z�mpZ�$�$�L8X�cw��iʋ�����yq�3��T�+~�Ś`��Nђ�2�	]Pc��_E��E��E�QE���_]_��r�g�\�-�����Px1�L����q�A%C�b�?1e9^��?P�n@?�U�֝ߌ�똒M�I�?Bo���?��O
FE��#�� B��n�o������&^p�0���:��*
��2egG�Q�����	��k{7���X�0G���N��
܅�<��q�� ��/�!JM._ҕ�H��q��A$QiA�<.8�#��ǖ+;����[��z񸐯�ѝY��D3�P�.p�>P؞�v"�?�ߵ��&c�:��]�r6���7�i��f��)g��5�Y{�P�C���P+Z�	z����w�x��D�9�����7R�����4g㉳ă�fu�����g�b9�F�m����|h����6��5��՛LĤ�1:�\ӎFN�>����
�R�f���ɯ(�.
��������ju/��<a�r�rI
ګ��4�}Ք�W���`r��j�x�G����^*q%F�M�+��X�}���졘��G]�4�����6�]�x��x�y9�΃��6دnj-0�͈aw�u�j���M�Kl�㝮���)y�y��n-f�
=C�"��wnaA��%C��>��H�K|���S�s4L��G0����e��K|��+�uZ�sk������>�y���7J6�op��%[�謹#|�%G�E�������5C�-i0p4�t�L!5#Oz�ceW�|��f�A�B}��M`g���)���(�ֹ��q*�-�Ô�d�ֹ`;��*Yfì�*G��q1���5t���A��p��m�ؙ�Nඬ��6q׎5M�7�g����D'x>+]�9��@ܝ��[^�w$�x���6Lv�0&����m�#�H��'k-�����$�4>$*��6[�˖6W��_#A�i�~fuQ^�% T�c:��p)�H�����-�G�b#��\c�Q3��є�;���#=��@�	��
_��'�������u��;���&�G�:⠇�IJ=�,+��
���=���1��I���o���뮁�@��i�خ�� L������SsUT�D��%��c�(�┗N$(�>.�ݟ4�M?�˓��
���VK��� �o��L����܉z��-L��H4|x��H�T�p��t�����aC|��9ڲ7��Q��i;�E�¸qb�Jyk�!�0(<f8Q8��X.�g+�~Pe�������7>��F26�e��P`��:��+q*U9p��/V���hLU1�E)rmn47��̹(;�`�Wp�Ԃ�yω>���Spg��kX!x����@��N�}\��bK栱`_6psA��2�nN�I�6l�k�`X|��`�p@��to�G	:��r�
|��'����V���A,���o8VZǷ@\��d���´��\��I]�5]�l�c�z�9j�3`@C`�0�Qr�~������_Q���L�˂-_قm����E6�_$��}!�u��Js,_qNe�d��<��+�m>0�L�l�a��䡗c��r6��iZ�l�jN��ěu'�<gC`��u=�h�S���mߊ������}�]���Ŭ�E���w~��gN���4A�Q/h�}��B�U�RL<�>����l���0��ijY��������S�ֵ�7��
�^��JX�.�G�e�L��xA��z��37���P�k��~�_�􉆮���7����;��ػ�!l@�fƈ�|�)��3��g,���{|��	<�1���g\zX+�#��}����(�.+e<��M��֌Y����a��0\�qrx�1[B��;L{�FK׃#�u�_2�}d����0#?o~Ao�H�H{Oq�{�a�B������L�#�y�ai��^��Ӭ-O̞f��E"lmZT5�
[�3�e���jT=�A�x6|��/g��5��MM�"�Vȴ/��-�,����’�vY�I
�-Ц�bÆ���Έ*e��9��ݿ��<�h�ѯ�N�`�4-��I���+�g�g�û��>G	i��J��"!CD�����l�t�㯙���|�@2o�2�da������e]��g��R��/p=>�O��2IpP��r��Z�k	�O2#�q&NΛ��*Gt���]X�K�qV?ٹm��N��l]��KUr�ӥ��wAi�y~��(!\pE�����ȟ��;�����"�f��W� Y##�.���;g)f�'bm�Q�\�L�oq#aI?a�`��a��`�0h%HPыo�%ؙ�Ewoj�/׸ٌ�͗��W��r�)$�W1�����=���{ױ�B�����)��s6�7�֨���sޅ�����;��֛!�k.*k�|��փ���g�\��m�ب:�T�ɠN�	�x(bq������w
��W�YdvB9�r0[���={i�ʱ5g&� �?�Q��y��ӗ��[4 �!|�[_L�}���BP޹	-z�S$���@qJK@�u��5ePBoΞ�K�����\��#���0�#���ͦ1��(�H�|k&��1u��1Q%*�Î����ͤI�&�~m|��>V�
�uy׌�Ա��s�	����פ�ѩ"OA.��/kŞ+M����w#�����O��\�\��.p��#dF&�2�a����. %H�b��.q��g;�o�f�kt;�������[?�X�DԉCzmӸ��Eq=���xS�����>`��^�����'�l?��i}S�03t�A�t��L��qd�)�j4��͜�Ǚ�*�,ư�Ff��X� Q8*j�q�(�l�-3$�i"�/�3����) �E8  �C�L�XUg333[[e3�����Y����
��N�^�)�8l��D<����w��j��:(N�de�����R`X�2��I*�
Ψ��P%͍أ8�:*B�0||��nJ�XUuq�TѭP��)�!���?~�͘.ȝ��X�8���+)Y�9+BeT��Mvj
�>�̐�	Tn��B!��x>Q�6*���Q�����ǟ�S4��2�D���$�>�B?��Nc;��J��x_��q�)�<��f��kE���}���|�)<:'�˟�f}8�b��,l)���}������η��8���k��Eڨ;����n��5�_:� �j���T4�ă-�?����튕Q@��jʳ���-�b��d��%��DJě���13u�_Rl|}�JZa��a��vqle����Q����t:%���1��G�AQ��4%�
4�Z�:	�Ǫ�3��^U5����y��I�Շ
q���c��$ ��c�j��\Nn��b�ȧ��a��&����S�W�r�a��P��m�7B<���óɩ
��	�h���,ޢ��M
�@���h>V9d�s>%�r�_5t5%m����;Y
߻2ܖr~��閇��b�y�V^�Z�v鮭;R�]sBa��������_[�S��ș>k�V��*+4zv����l��㟰��Ȋ��>J��������P"�7�e�M��QO��a���ܥC�	[f��="ư��$?�k��Q}d��6�K�O�K$�ݏ��'�ϵƚ.�*�[��@&�^Ǖ�۩ x�'����
\J��#GE|W_i&[��~��a���u9�
Z��RӨ�i����v��2�۸�a�5���O���u�Vsk�M{�R�ևeK5�]`8�7k"�Ǧ:/�}����ʲ�&s�X�j�o�Z[̓�p{���trv�ž�����^���vx�[���`��t�j�Yx]�V���zA*��h�'f���+eEk��#Y}��K�T�����<\U�.Mܔ[�L�^{��g�¡l��D��v�@ezԅ’e���w ��R��7݉����ך�ū�[Ʈ;B��u���QS�H7{[-%�Щ�VU:I�c9��ѥ���BW����#c�	ci�?���|˞�j���5K������T�rV�ˡ?ŧ8hJ�b���*�;��1��7��V4��=��a���)�
��f��!�i��han��k�-phʥ�\8��H�<���C���_B����&�c%�8��qs� nS'�.�	ʧj�H+��0G��&���_����0����.����+�Z������8<X�>�߳`�3�_�)5��{%��Lf.���Dc��F�k/��M[�.���uJ��A�R��VH�8��W����]"T�ߟa�~�긋�,$Xu�4�jʹgݶ%���4u�z#Ϙ�Dۂn���Ѡ��_MX ��t$`ϵe�$��Ƥ�4�)����c�Ǝ��5��5�̺)4:�3�fX��]�@@V8��_��0'�{ge��p�,�xE����o�:
~����#�Q*��y9����ibD]o���]ȅs�WJ�ԿH���	^0��j'7!ɒK�k����[�.g������`�,Hk�H��+��W���?|P�PX�B;�Z�	��{�[;��Š�F�]�� "�6\yw���E�ԗV�>�L�rBL�>S��X��Zs�+]4Ƒ�fʆ-����"��Ax�?Ȕ����A�72�L�l�����_���Y�����{a[��E \��"ۛQz�K���	��Gج�W����#���BDNjJ�d��Iٕ��m?�h�A��%��zY�FfBյ�	�g�y�y.
?�3? ����B��X\�B ���G,��3
�I��|���Lf�R�����9w�K\Đ�qYl����.�L'L�E��lw���K��Z��䍺S
Pl�l3��y��j|
�}�ˏ Aۑgs���bO��x���mz�XH%�����Ƌc��R�v��A3�m6qj�tC�Nt��9��[΄~��9�/u���&3/��N�� SU��t�J�if�>���8`����ݕ(4折4�6^��tzN�]�
�i���d������j�F޻0�X1;E��&��Y)�f��kq{�`!�5��֊��Y�
h��Gt�l����uǕ�B�4qg�Ow%֓�a\��:Z�C���g�J�y}MC��M��4��n�bJ��~��r�V��#�F��_�1m��'����ʕ���(-���-��!�n����VA�����U���,G�+�:�v+@6���lI�t0�Z{�Z-���&z̐��bj���t����0d<9`	!3+p�s�Q^Z}�x��x�~�_� �1���۴��j�x4�;9�hu��Cq\pƨp�9��%aw%S9/Ƭ�ൖ������:��.]z'��x�}H��W���-��y��e^��'ݲ\�')����a�0�Ԙ?����6e�8<e9ބQ��Fڊ;�K�^Sп��O�C�wp?@�h�y&�
�~�$��3��EYg,�P%q��s_\�����η�Le��%�VYsRx��t�a�i���>��1A�yB()ǁ�g&ǁx������!�q��j�:�*F�(N&oj��k/b�y�Gb������0P�Ո����/�ҩ�GB�f���yo����}��@��k�\ܷ�<M�_�����#��1o���O�0x�e�0w�|�(�@�4�e$�
�GC��g�� ���1Z&Թ�I���ǷF��Y9����ys����=�`w�������l����'�]}E��`_��5Ln�m�틬�ië��j఺��Fş�c��?�|	S���4o��7�lj�wr�j!Z���'e�a4�X��QI��T�E�j�ʪ�^k�l~A�U�)OBo�GF[���������H���?@O���
C�&��,K�J(NF19�L��-(�^J�䕍��l�c:O�I+%��tb��O�'�5wM��E�2m%�Md��O;��Wδ3K�7�&��})�0��X{��^��^�'���w�o>�8l�w|ޝ�� !S��ft��٧T�_.}����b�9%�
��M�Iz��H=ʓ;��,,��U�mD��vڅ���`o�o��o��4Yi�OŠ�p�$��t~$�~�g��Z�������	}��tˉ�6h�;��}��K��/��o��Wu5M<+n����	GVS��t�?� ����6$,\
����g$��*y�
5�z�/��O63<[�}����n�Z�.]ta�g��y�_pz>�&]mT��f����q�&��e�%=2�7̅���{�/Ć��=L�7r�N�1
����o�w�o�JT�T,@��.坉�}�_�M�Ewh:D����~��e6a���/�Z ��x*n���-k����a������b����ff��bA6(�6/�Km�Rm��6Gs��Ff���*�m�S�Hn�<nH��e~�'`W@���}��tѰ�����(����m���e�a�_D�Ծ�.=NL��d����&�(q�*7��"�zK�G�G�]A�%H=B�88J~ F�����V踗�FH��j�,t�>g����9rq���#�`�<3X��-H�4HVq~���>�!��ߛw
�ZMHq~ve��x/��p��p���*
)V���6l.]�ۆ˓l�/�j7)6�՜d�b?�V
 $�7�l��HA�]�h^��LJ�dɕE�zqdIgR.\��
ֽR/�'��X�(*5d�7K��y\�~�O��Œ${�b��[_
�Ӄ�OI �TX�����%�i�G01�<^�5ly���uV���~�|���yty�A��`q9C�A:'K��<��<��/�Љǃ�#$i�VO@j?^�ȜD��q���Eu�+���qnϣ�T��5��x�����We"���Z�W�ԆKu�/JLYگ-7^��}��
��Q�¯�
�h*-1Td��8�d����㟢[��s8*��� �����.�x�������l��n��V)X�1,����̝Cc.�xSUO&�hV)�]��^\�,�l��lքL�KpU�PP��
N�l��q�,̵�RP��}s[�F�x[�� w[�s�v@��Ăl�WA�d"�j��Π��,6WH3�}��n?HM���EI��t9$z}I�d�&L-կ��9��et��!��{9н�v�{�KX���S�]Aڰ�/��^>��������8Nf�c�~p�(�Aq�z�������u/"�'� �|h����g��>��&���x_ ��5����ha�Ñ��A%3Ҩ
���l��O���z&���*�����{0;��j�U�}�C�I���0����X�oe�r��Z�ox��E��,�"�/:���!��m��
�Ji�)Y�'�S���}
����i�I������K2��zo��i y�>�??��Esc^L'���|�`���+��lY���ȁ��!a�Y�O%CM�ԍ��Q�Sg
����ԉ�R�~άMd�/�;���}��c����A	z��7)q��n�+ v� O|lh"��'mpw�I�v���Q����*������qB���T�,o��f_:�Un���y��Kw�p���
4�'h���TO
�$�������EAxM�7��7ݶ�F��{1T��.,���e8��R4�����&����l@m)�R�@֭)Pa��$��M�T�����X
FM]�+|a�CZ˂�%osBK�*��y�O���S�J�
�0�*�C?Z��z�'_�Z�dSWjE���u\%�eɹĮ��˦�-�ҟ�9T��՗�O�v���l�".� B�Ĵ�^!gK�QZ�ol�+�
$�r�!c!��#,���ύ>^�������U�	Uw�����dА��u۝��e�_a�gdh���S�LZގ���zɡ���s� �=�Iԟx?{�N�:�GS\�:\�>��0@�8�X�W&�i[-�q�������b��Dt+�v����L�̸�L�'2�C�bK�I��Gj��Պ��:p���c_߉�nsk�ūk�M����4���]K�A{fW��/,�ޠ�j�*�jc�6����Q*�V8?��^�r4�z���~�L'K�����מ�I�!�n�òM�m}�Hw��[<��bCs�G��\.6�E���o�d�wE��}����Hy��UH��o
^uŴqk�w�TV-�T��6I�p�j����T0T�n7L
y���
4 ��$�Mz�B_������܅/�+{)V�$j�$/���Q�ǣ'i��8R��8��[�{Z3]0��Z�r�c��*�x�OS�l��r!�S�a��u^���~h��`�jn�l�S_-�u�����v�}�?����_"�WZ�<诐�t�G2"�[�+��'�8uW|�Fr�a�`��)�Y�v���x:�X���0t2��٪���T_�~`Z�4^\��$�}��ru/s8�b�;�n���pF-�9�'�V��H�op�3�ENj�<Ѧ67����Uݪ��r�_.�u~��Y�����t����t���Ј �N�؞T��'͑��4zf�87�@���Q���݃L�\eK�쪬b(J:$:���
�V2+�j犽�Tx�G���Wh�S!i��Q_�{ԗ���cЩ�i���Y���� ��cܸ�Q3NT���@	<���B�E6E7d��u)R�������\�Fjfk������_[��O�@@�p@@
��S��lme��\�����?��v���~f�ۺA�10�����̐��Z#�[�֕��ݻxw�oR76@�c�PK"92%���#BE�|��?e�z2�},ܻ�`�2�϶�_���_?g��.��쁬z�h���1�ڻ�.��6 ���׈ÿ�Y=�2	�F�"�%��C$�C���"�ň�Q�<�`�cB-�!s|\ņ'���
Y�$q�^�|ޗ�1Ж�V^p<x;0so�nFJ����N�p��[�q��
��O�Rrs��7�w�;�q	9�ZN����e%�%�ó�B����t�f�;o���yіO2��3]��d��c݈6��¼�d]�=%��%V����wRd�cKwu4:���`��6�ꭶ�*8d�E�
a�B����T��ڽ|P]l..{l�"w�n��<�w��6�#u}���b��n�;A��54{7����e�[=VO9�"Y��'޶�9w:4a�5��
/�Jg�y�+n�Ls1_�y����K����}���J4��Κ
�l��M^��*�{Q=ɮ�K�K�Zg��炢����8�3��uD���-}SH�{\
k�����N��ÊNX���U�����%4�h�\��%�� v4��N���²0� ���e����z�S4��54����Fa�]ќ`94�C[4��rB�>�tS�ͿO�,��M5���r1˙/f�E53^�M!��-j��7��x��@ח��:�e`J��T6�ݜK�(��U��~�����l>�AS���k������q�A�W4y¥_�!]qT�ji��]��";��^n�L,3e��jC}�Bz&�w�.R��V��m�>�~x̭�"����d'(���=U�;���X��a�0[�8[ؓc�S�~i��N��qgo����‡PY�z3ػs3̃H$�p�km�~k�ML�@vr!�6�K��z�ͥ?t�-C�"�������r���2!�&�����l�*4�@�*���`*w[X�e	]F
'ݴ����7.����:E�ER��Y돃U�l	v$x�ҏO�~:L+6�$c	1ơ�-�?�?����r���DjU�\��c5��S���}Ej��,&q�AY�l4�^���qc��m�"�}ª��xCr3F���`>J	��/I3B�/@1ܢ��Α8�|F$�R�Gd��˜�qA-���oy��Ln95�P%�P����F��~�J=���f/3�\�X�}��IBs�`��ҏP�xB�JQ���rp,���%��|�v>1��
�~͋����=/�k��8�����A�A7v�D�<C��;/��|�u�f@��1�|H
����6f�t#�������.��‘r~������K��,Vk1.d�@�E�L.sl26��2��^'���!��/-u_��@�
%C$�U�>�|�r����`��=�nR]�)<Ӗ�!l-՝�A��`\W�p��(����I����U�����:T�mt�V�3x�k!����-y��{�3���3�ưİ
BA]����{��]^�����7�n��O�2W��>sB�2z�.(���$��0��6>m1���<{�%����(‘D,T�X�H�Dx�d�Hq�7)�#�}��g���6x_���Y��γ�����#F �;{$xO�H��{����PH���s�b�^�?�󍂑�\T�~C���pPN����p0g%�=�#��cf��NʀD�=��œk��r`�Yc�ť:̖�&_i֏��c���p�>��1��7�8[ߑ�3q��Rl'E		om�g�"4�U�r�R��n8����4�($�p�L��Ǎ��:�&��)��?����'�m:�k�����X�[:�4b;9�I~o}��\`�rkSv���Q�JB������i������ WfAm:�0k[	L��~�`N=<T{�^�E��*��)�
�H*��K�g���XTݳ�t9ygkb�[V��D;:��tpv5�A��f�Pxz�5�f�.4K��{7g�k�zX�2��9d��Xn�O��軗2y++���Zf���zWcx-Cއn~øiR��f�!hڧ���%��R!��.���ޮ��K1�.�?ED�+0�!p���楰Z��,0lp��Ƣ�h���
����O�ƪ����L��F4X��G¹��‘� �HgI�)Jy�;�^}:RSŘG~8a������'�7��蝳iK�bЗq�/QZ�\���Qme��0����G}��{k2 ���ŤzJ��_�v�ܷ�E3:���ĶK`x�7Z���f8�/6��`��s��h_}�Ң�3��;�m֑��O�ʢ˵L��x6øP1���WWM@�b :a�|ń����d���w�$Ur;�YƑ#,�gѶ���$����A�.�}��N�;�Ӑ}W�9l�B�j1�-�j[�ZxH�0��iL7���甞;7�w~���]�ߍ3n-�_��>�s��A���1o�ȱ�T7Į*{�lhE��7�:�3(~�Dͤ�`�{�4Dg��s�5��hS�E��P�LM��GC����e޶q���J�G�~U��lE��i�qŪ���E_&�g9�\C���t��H/	�۟T��� �r�0�v/�f���wFi���,_��2O�" 4�UE>TЬ�6�^	������/�&��A��3�R�17n��tv��ie���'��-~����9��I���iv�1�ЦR+�	���1t&6<���=,�LE-a#�5�%�1��W�8��T׉4	wI��h�l�P�-��6Q�e6-�~��\/�A*���hA�M���q��S��
��3��m�:��v�+tU�	��(��fSv�,�����7
�
�#\�W.X��� �֗��~���ܯ�t�ob����J���7
�	�i��pZ��P�i<
>��ģ��4��y��\���^���3���bc\��#Nu~u�]u6K��o��N�3�ȼ5Q�f����$�3H�qn��I�n뒶�k�r��O��<�^&��RZv��	��/���
�x�k������h� @@�^%��
ٛ�G\�?V���ڷ<���]Q�20xJ��q=��sSK�q�N�\�g
5����Ğ��(,�P���X��>��f�C�;���yr*[�oW��鍳?�{�Kk�|������}�wY�B�h�����z���N
�Ep\��+H��
�+�R������4D2|	��T���`���੩���K���Kp���R0j<�0�(�vd�����'���ʞ\���ңӕ�Y�,�:�NS�G�<�r���9�zL ��hPXX�!�o��sŝ�M��Um`��_Vr/� K<�.T��~��nd%޶�ehV�XI�J#NN�U_�(M���9��,7e�*b
+�"�UF�FK��s��.�T�e]+b+Ф�����k�DaS~�i�d�!@��X�śb=���q1��o�:H����[�c} uA�R>Ա���J��P�P+M���D�1��T��,�YbM�L�ԝqc���Tu�8�ᐖ��["ˠ�X{+��(�G-�LU
K#��V���:lH(z�٬KKӊ����-�P9�/�aby�S�'�˔��8�*��
���@�$��@l��S�4���P�������r�-�W!�9���@�9��_סe�^�ӿ��Fh�k~��Zse�=��Pe��������r��w�lp5Q%�����j�b���Y��2x�'�O�N�0�a�+UFsg�H��H��Am?�a����f�:�W��\���9���rD��US�4Y,�r�?�^��q^r۴>���G�f����
���.��i���D)�%/��C���9�ңo�I��p�튇n}�6��\:�)�c:g��eHF�_��4�_��a�Щ��oj��{A�YZ�S�;M�b��@��6�l��|�esn��o�9��e�0t��kO��|j}1�*a/̊
]�P-=H]5T��g‚$2m��)T�w�Ɠ�s�e��	���5ie��n`K]
���;{8����H8y6h��$p`L�$ :X���,��V�֥�]24���e�@�4g���M`��3n�����JC��͌���xmy�xbka�uc��f��ְ�@k�N�3-;'b�7/E�>c�~��S�{�B�7��=�q͖�=��8a�	�}�e:�u�ޅ&[�g&��i���vc-�Җ�V�F
�LQC��c��V9���R��|��못��3�5�4"�3U�{��)��[8.�ܚ"n}�L7���O]u3!�4}���=��_����_�:��w�|�t���Z�y��y)Il�ʍ��y�C7:��#���j�[B��%����-<�}��w�T���̸�?-�\f�&�B�s��X�!	N �hw6��c���Q}��s^�?G���w�n���7��{H�}߰��,t�m��7��!Nc�>�'	�}�&������(PS�zZJ�[w��||gU1�6���x���m����|�o���\�0�^�]���pg\Wy�����增��N�w~?�ōV,0�?�!����F��E����������
XO�5�o��nm=b2� O(-�fob&�CM�1e""�{k7rz���И2����GKk��zu^
s!
'���m���29B�%�����o���Vmj�~���γ��w���?6=4��CB��wHю}`�w�a�P����Α51҉s2<��s԰
`N�bo���
��C��a5]_�(CʾJ}��
�w6<�����V�����ov���6�–���w��F��T��W��c�T���s�o�D��j2�ߓC�끏ľ�K
2�n�q6���{��o�?H#����j�Ӄ�O(^'�H	�o
�o�����o�H�{|=�����ݏ/�o\AE����0��!�2��H��7�s�~r`�h�&:h�څ-R+Jj�i����R�$�I�6��խ�$U����
��n�K�^�K�tw�(�ٖ���C;r�QQ�ޣA���L��QnV�#؇�-���]���:�6t2�hoCq�`�zQ�����o��)�+~�"���E��|\�},
7�r�izD��ō'��!+x��&��CH:�"�;��[��?����%A���FF�%�Q�ib�W����({�
*�q����d����T��`�߄�?o�BI���N����Q��xd��u3���T�[�RS�s-h�2p U1U^O��re�0�/v�i�c�׃�M����ְ�F|�T���yj�4�V�~R+t�96.���%�3�=H�ID��`��+w/��ſۈ�h��D��OS:h W�GC�i1ؖID����8��T�z�￱��������u�W�<Ѩm��O�E.F�������$��f�db���@�|�F�*�d����v=3��	oܓC��+˫W�Y��.8�2Q�[q����	�&����.���~�oj㽼<�$�I`'�h��cO�kEy1*v/���E�0k�礓�{v��ߨ0Y�?dOu8c�K��HY
��Pc�/��+M'�%E�Y���(T�Rf-3Y뜴\3!�A���L@�	��W������z�xℨ*�C�G��2Q����[�,�-fI�[�5il�F&�k�{�o��z'�T���=!w�d�B�ʧғն:���d
$��.��H���J�����ږ���4�5ƥe�7�)k�q�����m�2��O��L��;��
����Qԧp���\/����ȕe��=S�t��u��F#鯠1	F���
�U+՚�UƉ�"�C�Z��pM���dgI��q�:��t8&��m��b�m��;��r�K9�'8dڶ�k��ڠO�-��*�8�a(Qt6�D"���m��?Ṉ7䷭�V&�]���V��;S�|y��h]��u�U%!�{�E1�or�Q�]��5�i9a�@���XK��vm�p��!r���
�]�j?!�3x�|�%L'T�l��N�L�r�w���AJCY�mjY	G̩��OM9��[�k��x�(KP׮���z�V}hZ~&ּ�/Y�XN �w��U�[ǖI�8�-*����ˤ�;�h�5��L(��S:�ZP��F��A�9����ք���wE���Į0h̚
����[-H*<rw�f�H���C�����UO/-�<5���2��G翵�n�n����n���]+>n]���٬-j5N���ix95q	�t�m��Q��&�[݄�Q_ӟ��U�4�X���I(�E���P��B�e���koq�T8`o��q�9���~u��a��9*�s��D�]Dq�ͮ?�����;�vB`�����Ʒ��(�����{�ƈ�
��>�J���!��pw��cF�M�h23d�~ �š_"�¯J�T�37������R҅�^��+G H��#��O�5G�ss
s�בN��8�1�@p�_�2rDr���(��g,f�b�r��H��b�n����ة�
p��1�1j�C�1���0	��sJ�d�}p4n!�2��nT��(Ռ�����O�?(�f�5�'�kc�J�CNRNq���l���Iz$y��{ ���^��xs���̴�c(��`�E"����R������1�U$�J�@I�̾�c̒Q��X$�T�TGPIO6
gěC
D
��� ���='4����[���mڬ��1���^;jl��k(mW����.v�06юw�2
���6s��f�3��v��:���:��]͕����Fp8�K���RWA��C�JA�F�"X���3oTs��;o��b5>�\�glv>��h>+�>L�c�(�+-��%dq9t�:H���]50��d�	��$rO��Ј�z�����=E�(��$1�Ԙ��$�Ԑ����w�ҭI�h�m�m��m۶m۶m۶�7m��Wպ����S���5c�xV����ʄz_��s�Ӝ�Y`���x�"���5"���%
ư�x}e��t�Зf��%��f���ug�>Z�,6�A�C��+��=��Ip��M1���)gb�s<@;�Dm~\m�;�:g:C��U��b���B�^de�wy	�A0*�Y���I ֓&ԙ�Di��F3�_�!jKZ�+��&uǺ|p�W��En⎑�H�b[x:�U4�#3��0����~9z�
k{�Sj3�2��.aZQ����o��R#ڊ�&{` բRQ�w�F+���q�����u�I�
٘�U�'�a�fRƞ�%�/=�
�t�f��� 3�H�|�� ?F8��R�Ņ����k=��N���W��{��7{�O�4�;���t���}J��0~꨻D����e&y��6�ӞiǑv8�W%�z:c�K`|�VĦ�@N�H���Yq����y�����! �GC��#�8����?l��FT��8�7=�c��(ȉ+J�}|�7�Mi8�8��'��'�ݥ�m����nu�N�����.lm�k��wfR��]�;V�SڲΙn�^^nY�آ]��2��!9��rgZ�êh�OU2�G�.��Q���X&M���mG�6"]K���q:M��j���9Q�qr�bÊA��鼃I?����*'�aV�����F0�o`��K
�"y��v�",g���=r9���o�I��(fwPs(|��wW�#��Vb����]a>;���Hz�Urru��;�h;��I�RԹtm�}#z�C��Tm�{3�L_�d3�P��ڔ!,`�D��)�8*I<���%6�"8l�g)P���w������Pm��d�J2˹�s����$�&�|	!���sK�@M����r^kV��Rh;�+%^-oZ�v1uZOoi�$HW����C�j�Z����0��1L�2r3oܵ)����N�/w)�*��az,�*��\VM�W���.���դ勥勎�0�9��Lv�n92�(>�3�7���3�|�3p  3  �Qτ���_���M����t�#c���E��S�)��P"Jl		������ԍ�WY�muat7Z�_�K�A�gŊ	��S��p�P�Oo#�G�ۜc���"�����Ӷ>�۟�gj �Pg}�@iT�t�! S�zg�"����Bm�\�ܰ���uE�#��!e���y�n��Bw]:$����^D�R�m���D=��3w�1#Go�1��J����}��W��]��o���\§��l.{,z��Sv�\��XK��*��N)7�٩��(!��g�j�U�Kw����Ӯ�t�������$�sy{�zh�\3L�~���TIv#o��=H�9S�8�B����ZQ'��U�5�<��S�<">�,���s\��R��v�코us:���X�����Fm�=��H ��A�O��MVK77-;`�4a�^�P/�$�+j�@{|M�7A��A��	���M�r`O�|��؁���zݑ&nr�e�NšhY[m+>�CЉ�j!���t�>(�A�%$�Q���R�ً���~��!#��M�8�s�X�_�wP����)%�"��A`���r0:U*V����<�qFF�
�hi�?)�dgl),�3�
�-�FaR�)	_e�~I�G�~ɭ<M�q5��r�"�p��Q3;Jq�mÕ16���$$+WAy43gg�@~8V;V���c�ix�@�҄��%@��wj?��=��
�u���7���r��	.��V���쫿O�H6��Ndy�xR�r6�_��z'��|G��l�Z�	�G�b>�n�j�͕����_�9��n�/�=��ie����"�#����Ʃ[:�����]�T��P��t�xw���R�
�#vN�.2@O��#{���'�7A�J�����ȧ��2�Y��Q���P�E�)�)�(�n/��z*]��Y�a�$[��%�Ɂ�A�cl5&A�A�Wa���#UU$�`;�'���!
��OD��+k=ɜI�Jy�����C�t�H�N�A�j��z3'�c�'���lC�q4��&y'ߥu[&��X�<�|=a���}��:x�&'q����2��ڎ^F������ȤY����_��H+��7��̆�DNQ��
Rm^7@`�&ib����UoXe�'�'�S�N��=?��`�����#��=�5�r�g�/J.a��z���-��'�ƫ�u�~*�r�s�JX�u�KF�(�p��0�.��>"�7��e��u^-֊��:[���X�ny�3
�}���
E�c��/J�B@�P;�v,7d
��~��03��������U�B�{��k�J��/�M�?a�K���|A] �"�Ro���m|_�.2���"��0w����oa�Y�G�o^�0:>oPn	��e��
;��7ճu4���[>#�mu~��>���"���bAv�a�y:����5�B z�:�u)�S�����r�ݩN��I�EɈ/j�;d� ��L��|�+`͖��3S��aO�u^�^?{���T�/����Yܡ���J;-�t�Z���StI��m��������G+�[ݠ�b
�Z�m����i���0wְ����w����|�>�1�#��a6��ܟ;t~
�c��̇>�q�h~�u�f��~�}��˞�EFW��)��j�?�*:�յP��cR���x&�㘵2yj_���K�~��j���LXW�j9��4�
�����Q������K��n3ň���ӭ��*��N����kn�Ϡ�g�j'ͲR�"��J�f環�I��\բ��9����R����:�CV������&���n8�X���E
<(9�H���թ�6��P#
p�(�(��(͌̍2��R芩�
dm�ͽ³;?(uf������<��N�LI6�@�z�S=����s~�]�!�)#e�E�#
��l0��ASc�Qk��>6(0�jOAӳ��\P�c�%��� wRF��i1�1�s����U�t�$S���5��.�%c��=����c�/�E�ypF��L�S {��X�^79�YHF#g��V����S�m��:�0�]�Q#��p
&5t��tؑ�q=�w}\��q=�010&�C��@��4U����ӵa�l��6ֿ⡺�aڕ7r˵�n}��`�_� �w�-Z�۝�ߊ�|z�ox4��m�ٺ�`hWck�߫�P!\f�~�G��uZk�75��*r�����ȿ�@9g�nEnˢD#�Rz��d���X1�ʥ�=޿Kk@8�@��C��7�3�,���U?�o�N$Ѱ�Y����Wv�	��gdh*���Jr�1ٍ_��Ȫ1,ҽ�D�W�7b�Mn�`��f�Qn�?Q�c-�45�3Efm��f�0%3J]g�)�j�m��w�1-�$�%�r~X��_���
I�����˟�h+E��5���1ܘ`q�a�\K��+R�L����v�땗��p?�s�]>u�a�����|?�ݿ; p��p<a0���rN!=�Zhu�.8�V����KG�r+�F�3VA8B������`���c^-��/��8�H�g�͓p�c�'#f�^o�4�wL��`u����ٵ��0���	���lwBݣ�8� �L�r�Γ�~V���Z��X�5i���|���& �C�?G��l�fe%���1xu��g�����ӣ�T�e��I�e�YS	�3��	�hX��fX��Ɛ���f���b��E���I�tɺ�}�����z+�4�M��0�oZ��B�1�������-H�h��`�[�쀤f#��G՞;!�[٭�?��4�s�����]���@T?A�{	1!��i
�Jv��u�{aj����#�+2�-��t����j�05�4�^�6�*�b���av��9l�';��6��
֣4�_���~���+�s#!�f���4�k�&!}��;�b�
�`$g�u��攮Y�z-Ϊ��q��nE�� ���4��q�ZI�>a��o�_���$����%r��j�W]mQ���V�G�n��T	�
�+Qh�=��%�<Y}�)�6
���[�&��%�B�<�W�a�����5��ĄiY�tt�_�eZF���:�F�O��0E�1z�{o�*������7�����
�	���n�iߨƑ6���H_��
�˃�Ȱ	�^��M�j��D�ID=�.m�Kݱr0�B��]Sz�k����S��.d�2o�L1�?\]Q5{C]� 4�8=�*6_4��]u=0/�!��`���@��2p!!5D�[�{�J���uˮ�W�s��K�7��uZe��S�=���z��ւ�/��{^�8��~�M���(ƾ��7Ωs�7�kwȪ�{���:{��Q��I��G�o�w^�7��p7�)�C�O(���{����J"�p�K�X��Eڪ�:���NU
�f�X5��_<3�rLZ��C����J���1��_[�ƭ+�-$��|������P����'S�H^}.Ci7{�A%r�~��:�;���V�X���듊~�y�%�����Y�J0 �NX  ���J���f���,6��6���H`�8t���`�麿�#'Ir�A:2�)ڽ;�VJ�H)�D���!��i�k�%�����X���ewo�c��^�j�ߺ�G	�Y���a7�����p����Pt����rԤ���]m�]�v����ܠ7�v�?AH��Du�r昡������;����A�?���X��1�8�|<0c��P�^TqU��Q�z$Fxt��f�ܟ�;s.#3!)r��Z��IT�9ƻ�H�tR�4��q04�4��F,&��,p	x��W�,ɯ0[�l$J�hE�&o�iIs!��T�#:�?���PA�
�~�7�g��C��4JT���h�G���x1�]�����=u�����>�*T��U,?`+�
�w�JKmZeY&0-�U]���r2�0ј}��9Kx�34�;�A�*����m�Y_�zni،n�K
�2*&��߸(�i��8�S�)'��d�U��&�
6����dRRdρ�֒�,��
�[��!5�&�2�#ʽ�+���ZUl��؟��8
"�S���U/ӯj��]�)3���Y����p�@_�����]��?�T̈́8�.l�����G�GU��W,����E�B�As�Q�pX�ZA�䋇B�p�Uj.Ƙ�v~������|)�	��HT����W����y�wh����m�u���s)��n�f`����Q�
�	���.���9q�憮Qc��f�UOs��������{�0`�s.Uwe�d���w�$�Ss��p6>Ԗ�[Q˶ʌ69�|�D���oV=�(`�)��KdOځ}/�+`_�J�
�Oy�,����)z7�f0P�)Ă1���KBT:-3�^6��0y�yj��
tP��;z{����$�~
$9�q����l	�P\/�T7��S]�IW˔ʪR�m�"]��
*�eZ���4�}�!��Q�766�P��Ph6�yN�::>��s�z0�n[��-���o��_��
x���SG�~K
����]���i���#5*������.�u�u��odi�+�T}V�h�q{��݄�q�F���g#f�ۉ&����x�HS�}��H�X�6;�B�w�.��=4���bz��_�x�����b������au4��l������{�[��B��?����1�f#���g��A����|�IvN`Z�)�CN�+ОT��P��Z�kSS�u�2�׫O�>�gl�*6}�pYx*�&!�g'op\w�c�vH���(}�9?��ä��Z}C!h��>�U��� <�aoXy�jQQF�Mqս�(��i��4
�5�ꆼم6����b�Wٿ�{�e]E)���@�.=O�T�����W��o���hdN|�~�	�������#�g�\�T�A}!��%kgl"�@��u�e���Cv.Ѵ�bJ?�b�a�^lxV�j������ٹ�T<#��xd|=�NG���Y��B9�F6_Z��y旿6r\���$��"��F�3�q�v�������Pd;L ���u��o'��7&�N0�[�� �M!u%�iP:�K�7[��'^�������!�7�^�5W/Ֆ́�6���=��C_,��7sp�8#�c��Th�QqXЛ+b�ɻ8b��:�^�>�A�d.��?�E��-7���gl	�i�Wz�!�p�Ձ�p�֤�9�L��H���Bn�*Iw����w����1�3�f��ai���j��g+%5��=�I)���z�/L����aU���
!#I�&8�:9�������oNlK܊֑�iA�L�4�ѩTnBұ�k$l����#�[�kMnk�V�be:e80�U�0��b�C���x[��%7�n�"��;)F}g��K+m"�5�&|��TI+�mbe9��R0��i���s�i.z�qTC��R#�!��i6Σ�Dby����7�=N���&%��HHV��S"1�TbF9�X�:�XYu<�ل'���l6���Ҥ,z9:�?Sl"F(Ԛ�����:���e���|G�P1Y�B�iKL���3<y:d,k4�%&���Y�*�����]J����  �`�#�:�J�^���$5(��7�4^&ץ�Ty���ؗˬ8
9>���-n�Յ�$���H����dž�t}b�q���h)�E]�-����o�8�]D��d��,�z�|�6��a�qwF �M4��%�
K	�Z?lƎ'�+���98Q����s�ow����cp����~���=)ȩ‚���&f��;��y��>���>OQ���J}��/�;Z���~$�'���2�3o#qb�)�s���|�{T�K$9�k<k��>W�fD%�@5�e���*J������1#ˑ�p"�h
94�&����NX��dbq,nH��Od����w��6����;�_?[N�֟:�*�����d\jz��LC�9Ƙ�51۪8\�CֶLJ��6�-c�b�/ީ�0x����L+�����6�Uǚ6��F����+�H�g�W�s�u(��܅6Ce�U�������PL�`���L4����آ�HK�{�q���������
��R<BO,וy,P�.�"��F��^J���Q:���~ˮ�H[%���M��#C�/���N�Uq5�� �ГS�`��{o~�,f�o�B�a���7[g|:��3��[v�Th��:��s�#�}�u�~�33$�Z_���ͤy��W���~�3�ӛ����ac�og�w��Y�z0��v(��/�#Wg}P��K{DL@�P1iECx��z@N.�Wv�	��Jke��Z���B�M]z��'���A���g{������]�*JXԁ1��F��]��d�؝au�� -��M��̨�٢������u���/�sEN�{#K� �����Wк��pf�i+\p���Ƿ�5�����3�;1c�~�������1��8��(�?,vAԣ �R�ұ���"������aQ�q5�w��n
��q��8�	���E�g��
�����M�������y�Y'ǭ,YG���>�0�S,�
~�1:�oќ� n�3��*��tl"�N/@���U[$��ڕr�t�n���L��?���*���~j�����[��^ޑ1�pzc��{�,a��J��5I��|�2-D]`�"z�:��2����1�h�<��{l�Gп�~9�}��è��;�8lz���.�'ޑ�JU�ޡe�(7;�%�NCN���?o
��B�/��b�nU^l1D$:@��]4S1��XB�%!�1]�T�!����-bI:�И���Kog�򥦸KzMP�
�u�&�0WY��.�������0�[(��bR.zm�d޶�����������0�c�A��^���(ᘠ��^	�֣�ÄZDn�D�j�P��F��CSI5J��u1n4�؋�9���}��R��U��Ŷ�-��"�2�۝s�u�u��p���\�-8�(�	��tƉ5�	��GSo�<��u��=�Bq`�-�j;���v�_��,��޺�������+AC��HHH��/D3�p؝��[��١3���f�C
5�7���Z�
-Cu�K[�+�W%5�D��JZ�.ע�`q��a�^6X�����F��9�t��~��=lOP���&k)�<Nj��v;Wc$������G�.�]=�vL��|�p�+�LY2j�?h���#�Ul+j��	�N������%��%��5K�ߦ��%*�q��җS��0������ߌ���%������� �dk2���B�Y���7�Q6���z��o�vt��yN��º�eՌyKE&�/I�ƧK�d$��d��.$g+K��������!H2U�t�/��u�Mu��f+P�x�k���o�F�����q��2�b~��H�phU��r��l����?��*1Y���JM�GPm���:��G�ś��10��G�y(�?�'���v�/�(�<%��*���\g��0b��+� Q�Z����B�N�\g
ƛS��M(T7Ȓ{pCJR� :W�u؈��h�Ϋ�D�e�1�gd�[hm��m�:���Spa���jW7�T�2��-��hM�\�0�OSK�`{���
�)15=qٟ����p���@��Ӆw�[�>�t�E�cĐ����j���gS�CҖ�B�Sl2�8�Ee;����N��e�J3����-�~:��P�;���L���[�Y�`lr�S�γ�R�f��RPť8�ҫ��[I�^�UnxfH֟5V=׬2�WLb��ne�
:��B�W)�b*qNԉ�e�n��G��w��pC�����g�a�D���-L��R��>dZ͌F��+
�f#��
>a�ا�9�������D6�]B\�0���CX���p �j
^�r/�,���؂��ur��c�߽7qn��G�$�l�'<`I�p�5hގX�R���t�;��7�[_����2QQ<��U��o����	x�O]S!l蠉39�� r�~	�>U9M�p��
��S��[6&4LB���ǹ#�2�f�k8+�0�Ɵ|"���R$/�f�M��[�>A�^��^���;��[��[4�}�d-~���v�~��9w�>y�����v>D�J����gJ��6��i��!�����T�X`�S›�'ʍ�Y����}w2�s[��wyA_���WR����3F�;8���r��5��ԔU0lNNb#S��ڄ
�)4�y�@b�U&ᅅ�ak3�/��05��y���2�в���Ԩ�<#8kHS��yN�z�43�ǤP�E�����}��u��|Z�aBT#0�ˍ�D�ׁ"�G��A�P��%�=9pԃ�P=W����qM�P�����q�X���9zH�)X��R������c��c.�KՇ��� ��P�����>VD��|�#��)l���I
̅Z�D���
S��p�T���6M�3�+$���
�����me�h�^kK��(��PY(_��Ӫ�8��X=�z��&5�׋J��;B#\��`�����mN��ᬢb�������A��.ƞ��B�k���wY.Z���g����e+b���I(�o2�
�B:�J�}%�qa<K�)R���(�
��z��@K�O�\���2�o���-%���[��<n�F�M� lB�c��`�J�ԼH�h���L�|�
I#��t�Y�����Ç�I�Η���I�PQ�ʒ����Pu��%�>���k�2�����WҰ%DL�T3�V�\�Kq���������p���Z�\|�b@��#N�������A��v;���c��T�`�7ijd�����V����8�+�t��@�n�c�͸���8f����%��NUv�����1�涉8�;����E)<[��D���)�
�bQ<-����0�kg諷�]c`�=�fC��dz�/`֛��!Uw'�T��T�nt�ў�Ҳ۔�D�lU+rYۥ�x]��~3;V��y�
�+���:pn��ȇ,b�R̫Ad_�;']PW^�H\*>��G��5E�.��`�Ƞ^��ϩPl���Q>z�
�@ה�@7#%;�ڄv���W�lX��	�h��׿�f�|`�-�rS�r��J�)�k���;K��5���(�fB|�Sm�p�q�D���bb���)�����I~�LcL�2G�ۿ���S�$8u���hZ򯢙��,�#���t֬eg�0~C��)]�bjAr�T}lѦ�j��.C̥�f�; ��
jG�*q��S��~�U�������m�b�̺����n��by����q���r��v��/aS���PHZ���)��'@K�:�3��kT[�b���p�h�,�U�����k�j�P&P#O�-�bҰ�R�(I�ZZ�=��r\}}��4]A˧�V�kK0��4m��yQ[Ĥ̖�S����j�o�����~�B3����3\�H�(
��|�{m�����41�)W��}ʼ�h�R���<�?���ϑ���X®���ܟ5���.Z{k�7۰���6J��y
�� ,če���\j�)s��;��&����z�����=��q�M�m���=����HՍ�·��tגf7l�M�
�-q3D��/�A���%�R�
��۸�9Y�k�T@�Ɉ=�e�4�vl���vʄ,�Z 5,ᕂ�pfh�uy9f�t�-��K_;�^,���)�i�}�?��~��gɇ���F������zxg�`���,�������m�*�ĄOi�jHXt	r�*
��3�pL&щ�$���D����Ie<B��@@A�O҂x���b��D}"��[s�����m�lڴ�p ׁ�cs�hc�As]�G�+y���������MΚ��Ѧk�&;x|��VH�[�?�����j�DW�p�!�K8Wy�<�M�{\�z�ե�q�V�~�6,�1�z�&��tM�e}���z}�O���i}����:��ނ���k�l���ރ���%��%�G�O���J����!�I���‡̇C�p":Sċ���$�ھL5s������
���i���/m�v>�|u�P���@B�
�f'Sf8l�yT�
�2H��Bu��b|_Κ�)���4��T�uc�*�tk)U�0SX��ƴ�lP�Z��U�LQQEj���+?D���]�"}IZss ܗr�خ���~#c�Kji:���1a���A8���AgljPf`.��F!���K]mZ�"-%���ؘ���3,���-�h
tJÈ)N�R0����0��S�&m%�6MFk�g�W<�a��*!�~=�P�@�OaJ�O�,1Ą>��b�����B��ME�i"f���_ylv�D!+����8,�a���[��Thz�����H40U�`�Gx)��f<h6c�%��=�y��gW���X�,88�c��*��
i��6@WLI�"LL�LE�,P��4R�g‹��y�%ɫAe���N�jrW���$dS8���m����tJ[r�5��]�����܈a�!g)\P-#������$`U]�h.x��T�H���<��,�P������nE��Sſ?W�6�;Z�9�%�y&K��0�7�c�\6�ӵ��CN�k"=$-�HiJ/�IJ�\��ób,��}"�a�!���V�}#��8�p�riU��V�W���v�.H@���h�u.��pot�v���Pntm���w�����p���T-2�����}�j���h
�h��Q�/�?r}S�jhcz�<�O|��9�O��̺�o�ɠ8�XҚ��;�C� �&pN��ٜt�T�f�#P�E�X�	�4
��=�Ņ�G$h��
R��=���ɒM�QF���meE��'Ik6���!�������}�uೣ^.�3�{� ?���a�~Xom4�AA��^J��U�EKS�ؖR�,ٟ�/pc�u�۳Z�t.#LԔ�QT��	��U�p���>1�X�)]��Sɜ�����Q��*��6�v<��
��:����'��
3I�w�YK��,]j=�/�������2��ؔ�!��iXA�ފg�޿CK��"�ZY��&$2��B��+&6�Ӆ�>x�jG��}i����`1�v�Q�J(�=�f�FH
��p�VgꚈFH�_�Z�6\0���abV
��������8)C��G�ut�V��Xj>v՘0w���:Y2N��r�+��f�55�����NИ�a#7��.O���sֵp�4�R"ނ�2_dx�
�
�\+u�.t�o�*�l���s��:��i�X��g�����RH�WX�޴��I�Ҽ=�0��U��Ki,���f��,9��1?&i0%dW�2�	-�Kq��mpNo�8�p��I��4��JO�g"
8�惠�lF�
�o���A��6��/�|�ߪ��gs\���“�9�0�����by�#R����c�~�ژ���#�>G�6��[K���!S�~ʎv������qގ�萰�8�
8��-T�ŝ���b>0�P�p.�,�>6j
|�eYW�_U~al����ei�
�[4m��@�Jyd��s�������wD�wY�Kt�T�����+�A.�#"T@8��F�T�;�p��rq����}��S*�u���f���Tn�����2��V��ׅ�u;2�i�<4p-����e�S�U�X
���<�K>���u>�u��s;��h�wݻP�W��o0�g2_(!�l��龄w"�r�;4��8Ot�q���]����ڰ�pY{N�ro�f�<v�/gؽ��x#c��e��:�p�t���`/�Aiy}�s�j���=��Czh[����j��_׈f����\x��z0�u�7J�U�׺ԉdz!��6�O���
�+�R�ӎ�0���/ϧ���%����;-�=.߭�Xո$�!��X�q�?Ɇq��(��ds<���[ܸyê:���P���)����!��CE�P]�~qݪtU���������j\�|�*A�LiO���W\9��2�՗�׻�e�RC �c�ӔRaͰt��s�ۉ#u��X�"��B&���(���\L�F�-A!*n�����jEL�ަ�T!r;�T棿�K���+��~D��r��$�ϗ��Y2C�t�d^֜:�ʦ|Mՠ��Y��u�'
����V��A�֠�Kn"k�2�bɎ�Ҷ�+��
IA���r���QG9���4d���|�}�2�r�q`�̄��b~�0�$���u�G|��H(e��/��"�����/��Ϸ2̀-�H�~b'&W��l���"����:�T�J�\��{�����XJ����y~ g�T�����S���?F��9�����^ٚ6�"�#;"B��e�((��1�� ��_3o�ں�X���omn*u�����R����լl�z�(oiV�6��em��6F�����~��z�y�|��~�Fu���@���a��jϔY�~.FykO��B�z*�_b>P�Ԟ.���^�|�u�Q�z2³3��zw�Թ�SV�a��F���^�ج���Q��DM��ݺ�9��C��UՅ�wL��R���=8n��V�=�e�R�����M���S���俿@C�pW!��W�Ǽ�k�$w�KL+S�9�B�k�?�vǧ���o,OC��w8Rឲ�gtwYtj���!5��K3�
�]��vK��M�S�n0%m1*ëj�.7�n���ު�ȌܸpY�3��Ak����c�G�Bg˾�c*+��Ծ`*|Xj�J8���StyZO����z(��]�{�?6Z��5˾)/8�g%*m��?��$��C�);֚�Tĺ�e1��,�~��J��>񃗿u��t���������i"J�0F�ż-y��X����Gu��˹A��Q�̬E
s'
kUB���#���O<w&�NI׉��9��\����
�����U��0TD�޺���W����z��6L�=\Mq��^?�Ĕ�!1�7�A�e�?�M���;�\ݪ�;���E��3WB.�/������IV����a�^أ*�ɈP&�"H�@��y:;S��BUA4҅wܠy:�ĘGg���	;Ɨؐ�.���Q��M1�=�`�1�㐬(��:��A�$O��,+(y�D
w"�!f���ǻY�z ��i�Q��Z�V���ZR�0=��~"%1L�Q�C���]���j	�r0�3
'�^�y<�r����}Ӯ��K���b[�Rj���7�%0��Fl�c��'R��L��
g�,~\#,cc�5;^�Z:z�<:jM��ͽ������o����G����HȊ�PxW_�[�$z�ǤrgX��B=d%�����HeR^E	Mwh�-�LY!��L��Lt�(S�-�%������VD#�\�#vm`��7���Xw�e�lmx0`1���傐x���I0*��8f�Z�I(�ͽ�ʨ�|�X��+ݑ.,iYIGu�"풢��7�+�>�l�|��Q�p~��&%��l��ҍ
=dm�6(��d\��.�V�����*���&q*�jY	Wn�n����5��:�v�"��͢Pq~5B<MӶ>i��3���l^�
ʢ���i���N[��DZNf��]�����3I���ނ�l���[�������)b�Y�@�4����=��sf�1�u��)��H�V85K����+$O��;a�	c�^�k0,�V�.�����,J�d��fO���x�r�D��B����9�3��M��G\ZZ��C��h<p���,I�2b��傁ʮ��~
y����ش��	�;|�S=7,�N%x52�6����\��)�aJ��{�T��<��#�%[���Y����3�iČ%i���Bdک}B�;J�z���V�f�ta��-����b�Sj�O,��|�:LȘ'��)!��fd����`�s��xtJA��+��{"M�p�T�ϼ���25�8d�+�6�	�|a�sϞ�N{�6���o�����njx>۵��$9,�,NB�
�PN)i�d�!g��b��s�&
���W�vH�SC.]s�� {���	�����,^���9�@\M���"0��Mh�NXw�u`׋j���;d��ev=�$]9��kA�P�.����Is�_�+��Q���Q	8�˻w�%]?P���-��Cj����j�~'�	8Յ�s<�G/w���������t�J���߶XB�����j��/M�t��(S��)����=�M�=�Sx���vD�8��~�)����o�tSf�+Y�{i�y,`�@KV�9��)����(:jA
�h=��_�i�o��F�$I=��@�S\�q����v�-?�%>
�^ۨ����af=A�I/�.^��cӀ�^^�G�n	�z� �9�&������2�"~l8E�0]H�f�VZ��)�~�2cLt�����`	.�5mKw�Y��������|l~�l���1�>x���Je��z��įj�ڭ�x9����ãi.���ژ���-��I/��+	-<��a�Y�`fk��LH�,zq��wY2;b�٣�y�X�;V2ƦY�!���$���.�!|\�;<7j�g�g<�6��N���FJ��mUwﱭ4�!ę��DQs-���N�r���C�/�8�!���w���O�#V�1�le�1��%���(Q�ҺG�x��L4�8�%�<O�������@��D�����v��p��_�zF��x��^�k��j����Ro�O����c�:Ec(�s��9��j=�c녘
��¢����8&��v\�ȗ��[�ֲ��c��`c�.�G��}�S\&"#��#QS��b����A�:�%��;k�	U�=?TӴ.]�;JY<��	�̲[~��ɞg��Ӊݙ�)��lT��cq�'J�+ŋ����L���>0�G�ͿЇ����
1E����.D(O��w�bM�Ϛ,�|dC���d�W:$���8�Ҙ�g�'��AGʇ�2�d[����
�z�r���^���_�ڔ*�ӣ���~�R4�$*�|
GY�P�9\j�o�Khi?R�@��쥛���0�����l|��X풺n�+�4�/��;��+C�hXp"9bi�y$�Q*�qq)O���N"���;kS��v�T9�h-~����NёpדV�x-��)�VnI�4`��]صl{QJ�]�`�z3�g(� /�`M�d�ӤE���4�?��c�fM�-Z]���m�vU���l�]��e��m۶���~g߳�~�����~�1c�9׈92#gf3����Y�Wɺ�o/�b�1��)2�%>w_�.����Hi?ūCZH�'�E+'�4��m�X�XU�y�iL������d��겖i�/*���3��bx��  �(���N���P�+m���jo�j�ߝ�d�,���lg�-�0�����p�%!
ҔC�8���I����p�jyTQޛ���R���}zb���n���`^��_��c��9H�7�;[+���~I~Y�R
����S-�D�c�.�����:;9���2z�Gr��������v�#��q�ռF+z��Z�u{��yDܷĕ��*>�k\�N��c�j
��9��1�ފ���
0.����o��CG�[O.��(C~Iv��;�w�V��.�,��<^�!�6��fO���F����*0�֫��fC��K�#���x�'�`[o��~?���\yښ\�@2������q��Bo�ثH#.j��]d�|���eO�<�Wۿ�ZPd/V���� b,��DGL�þl(Z5�jz#�jI�:A�ų��Y
���Z���<��HCL���m�[*��:������(�Q�	�EV��O�@��1ȀnO��z�i*H���p�
���8��e���N
e��oy�w#�kJ���#���L`�#i�2O�ǎy8|��أ=]������1fb�+����A#U4�^�6��sUV�]9�[0���G@�/��n�FB�����N���O�QP���1.�LI<���C���3䰯� �T���L*ing1]}*�B��˨��Ė�v:�Wš�l���U� `6} 1y�J�1�U�m��Mj��9�x��'�jA��C;`{��<bA���4动_���H	�_-7|�=s�َ�8cZ�(ݣ_�٣��Xx�	5���C�Y���*Y3���K[�k�:ĕ��L�
N�D��m�ղ�y��:#-f�C�^�!�`9�P5��@r4�����?�g�E�d��h^ȖoU>��Wn��1=�\�~��F��Bn
-�B
��[V�Nc:a�7�8��!k�Dp�<�F=pz���Z[����$(>
���+9JT�Ƅ��#X���"�`r|��W�U���B\h��=^˧��b�Z�����ޝ�t49����M��� ��CN);�0j�Ԑm������5�0X�X�%�5c�ʿ��oo���V_��SWd:��77˶�~���x�q6A����v���>q
�6�ָ^�t�똅Lv�ј�?Qm	��pSwq��x$�hb94h�(���ia0p
�r�
��V�~�z[��e�|*r~�cd ���}���E��+����v^��{�0S݋z�J��^|}���[J|0�yc2m�=��D�^�^F�tǗ��Qޖ�ʑ��?A6��d�b����j�O{�����z���{{~y�W��''���o�^���IJl�'{_Qķg��t�@$�F�W���5���G׾`��bpJ3���$�t��_'"-�C�����W[�5���C�����i�gQ˙>�QJQ(��i���%�uu,�W�)-��djVq��!�ܘK��)�{�Gߪ��1��$x��Y�����-��L��2�쯺�K͓B�xx/�fE^�Z��o�����Q�e���e�*�=�f�]v9����M��6@�*7�8��ޭ�[���|}���u!�-{d�~�A����j�"ۏ|�`k��tb@�‡��5.&�"ɸ�뉥3�o+�ZlR�iA�$��Hג���iűxE^�_��6�����k��i6��~p�㸩��"�Ғ���Uq��۹7W]�Z"�$�G9%f�Oa�N��2v'���W���:k��Y�1�Z�1c?��2�C�˺k������{R̰��t�j,��]G�U-���h���w�Q�|�'��no���z�r+<��w^xS�qn�͢���V�rwk`ĠM	$Pea��6:��30|�=1b��+���5�;?�p����\DM&�N3e4&5��9Q�x"7��V��(KnKD��A���MP��P�'�CS�Ca5LP�y�;���%����y2-yJL���BrP�C�;�H�ɉ���@Ʊ��}��3:$9G&&η2m�ћ�wA��
%�NI�Έ�݃��K�q�`/���Eo�&�sd?��(�������]�8=���N������`���L�Q۰G7����6c�.֡��ttѡk2@4��.�chkӗ�m8��q��Iw	�Y,bx��Y�X��yD��0����?�a>��.��vH%MM�����O߸w���}d�v䏭�B�"H�9$��=� ��Ɋq�A/9z�
|pdF��17R�>)�`�-�#"�<J�Eݷ��k�e��	Ѣ��Pbq>t�3Z�gZ��Š���8����vd�/��ZV��
��i��.�U�g�x3b��:�:
�s5�g����6T2��̅���%G����_������Z�t��U-i'2b��3�%�'�F���R�	��|fh��F�P�Z$Cڴ⭗��G.�"�Ǘ���'s�XZ�i�ˉgNB�ȉ��_��4q����Sg��Xl�:�v���i06�&׍fy"�k'�Y��U�?w�^)�R
����!�̰�BII����h�>瀍�ғG�����$gD�h�ƊK;�-:&��4�wlQ����# ven
O��8&�b=>��r=�^�3�D���0�P��W�B�GW�P)�7��۪��`p쵼~����iͤ�i8H����׺)@]��M=������qZ�#�T�Fe/��N;�3h�]`��6�oDlᨁ�\�H%O�'�iٕJf6U���ڿCD�yv�aJ{n�;W�b-�k�o��8����.�g��ݫyw�6-!�G����}1H80v�_��=%GI,9$�=����t��ޥ�q���H�\�]iO���3+���K,��|��@�2��q�޲����~�3��:m��k��6]��{eޙ��n�*{n~MD�(N��˶oc�XfW�[�$�`���75���Z�2�J����0�M��H���2'�I^�``?l',�6�7ɞA;ԧ>�_�R%����#�\�靵>TNdkJ{�񱒱|m�?Ե_�:��C,=W��]F7й
��t�Q����|h���|�
j�cE��޳GA
�E`t"�s�c�:]�d~�]
��_��O�܀������i��K��_�r0���S�� ��(�{�|���3|x"X$݂%�+�,�d�ȃm�l.NB��B�����J�_�q'�:�f]�-@�%C)Q̛����AX������?�w�,�������G:���n�+>��_��@������e��=;`�7\"�(49Gm@���%`�D�)�e֜c,�d�8E���]��J��C�UG�q@Ƒޘ�ӟ�"�cL�l�v_حO�h�k.�v��r�D8x-�X��5q(���|ب����zq�#e�1J���G���؝A� 8}�+J���0����w�Uc�?#�L�K���T���A���+���AA@���i��%LMM����7A��DF�o��K2Jk	/0��+x��Y -����Lw
��0�)8b���!�Kh��j�I�``z��x�yf����]�a�l���x�"s�ꐀ��DXJ`�Vz)�3�yk�qN���y���j=X���ۦ�M�i����թ�xj���M��zI<��c��g]h���N�d�I�����S�j��;nB6�u؟�Ă}��jiG����pޢXe�ҥ���D&�c�Vځ�&=�O��2��=J����v����|墳�"���+:��k�V�}g%��7�hn�^�ep/K���Et�Y��U�������"T�{S�{*��'-a��a��~�Dk�B�~���Ј(�'��bq�tf_A�c��H<����Zs%���r�*�e������b)�9�U��z�z�6��:<�/��J����TA0މ��G��1��)Ia$.꟢S.{�����,�&�x�0�⹊�C�qX�~h�1{�˙Ў*�]���B+�1�ʉ��Jz�k�<D"���A�Ռ6�F1c��Z��P����e�֑��PI�^�o�t睈��z!.��N���8��d�VȜ�Vw���U���T��F�(ԯr��oCƏ9D�dU?GP�6i�%%���Gȝ��"���6&FP������Sn�	�=��r\���Zp��>��썁.�N�;�7����33��e29���+/$[��	ˤЕA�v�Ԥ�7��}��B�B�*��5K/$�4��xLO������j��r�U���D9���^K$
�*`���u ��#�PS@T���
�}:bs� R�l�zu-��K��q��6<�ֵ�L��Ľ}�[��[�q��~R^CM,|t�m>e�*�{�m��V�q�w���� �6V��˺6��BJ@F��E(��=���i�&��k���t��!��Y{��K���z�����j_��H0h��n��ak�ҭbi��꾅a�6��az�I��<v	D�	�I�a����H���h%&��:�S�X�G��\��YM81��}��$^��BS�T����*��i[�����6K�n��	٠!k	���{eބ��|�_[��bV�
&�H�;�J�#p�r�U�9�l�hY�M%yJ�B�zt	����L)�}�D���@���=G� {^r�krR]�tN�)��+<������iU�y��Q��ҋ՗�R�b�Qj�eT�yy"�ݨƷ$7o�g,�����S���2�*0�����=My9eS��^��Ҵ4T]���N�d�D�	F�理V��L��6(�[wH��=9��I�ZO���nE��
�YOf)'�Ȑ�0�>T��aa{�];��)g&+�$y�u��<�6�5s86�
ʤ�{,��{�5<���f�5=��}*f^ێ6����'-Lx#�;܏2��H,K�A��A��
��t��'!�7��x��g*�����{oP,ˑn���{費z�WAn�v��G햟R�#��;7�p7��3\�@���#(�3��i��650�ʃ冋SP������x�(���F>s�xi@���+l�)g����`�e�	���C.�'7L�-��W-��c1�Ӕ߻W�<w���a߷'�o��'�?ġ�Zh��kmWp�~�Z%�giU�Z���y#j���n�����}�Y�����-s�T��F�l~���i�~��L�"
�5�qfx�Dز'�̙I�5��!$!$�!��Oi��"4lp�Ъ�;��t��KZUߘ۾~�] �h>�q�"�2�_%��ߒ6�Ħp5j^7�-�ԉ�B�������eg\�k*E�ѐ��*d�Rõ�v��u��H���gױ�ßfKN�An^&Qm-�Bky
;�(��y������G39z�ֺ�@�����Z���97�P���6#��5'�e>|�x1��/���9��0��'�e��h�#���d��a���۬C�t�A1��T�Z�WhBi�c�@�2"sK�����Q�Bpq�J�lB�
qrh8c�{��$�1���ɌS�fM9'�ǘ*�Bq�h��<��w��nD�B�G��N�y�Z�4�lp��
��k��H�U�S��[���V�
��8��IS���AU�І��Eah��UB��VJ TK�Zw�$�b(-ĉ�h��X^:�h6�(FU5vUҶ����2�g�Y�-��~[��M�6�{�k���D�U
���.y]�ɌT�z�~��D�2ݲlH���UD��N_��l5�VM7�r�S9B�b��7B(}�
�***��f��zbSk2������)��tf5l�2��. �(�DgE���79'-0o���'V�v���y���f��'�8t=���m�T݅���O-Y��ީS��T�Ӊ��d���{9�t��"���7�s�o\w�0,����5};�D�Q�����J0ր(,R9MM�w�8kR��i�(s|�\"C<&#���v�H��[7�:�@,��E�Y_NQ#$)���,
�6j�qB �����b�,�����O��K���.�ڏY.`����i�9�Hx
����K�/|��M������Mb`�!"9�Mb©��2bDQ�4&���ި�9�ꃃ�d�ꋝ�Ee�a[��!�8�u+"M��hdaœ+��e��*U�5����D]mZ���L26?���*2���>��k�#^$Q16EKc�ے���b�����N��(w��k��X���v#��p����<�3-��'v�.b���R4��-B��kuV@N�P�����=CN�����n'�2MҤ4
<)���"L�Y �����a�)Flp���B���)'q��%�0
��B_��}-�sw{jeuN"v�j-EG
��9Z�.y�p�<�9��,��Y
N����r2�9B?���v��&����>
��
���Ls+:�S�ƫ�̂�9΋^���/o��Z��N�
����1|��Y/UUEI˻��G,�����l����ʃ��l�n0�_���'"J�/`��n.�AW>]�o�̪�G��=�>e��b����+[���b5'�I����Ym],�|�^mml�hkN���C�*��]��?K�Ộhp�{rr��ڣUi����!�F�1�D
w�{D���C���5�h��*Ǣ]m�X	pT膙�$eꗹE
�yS��$��sݤ��I������M�K���1Z9b��s�d��v��#�:��¹�c=�<��ܪd*݋ݹ$t-���ؓ��,k���C���[�۳ݨ���[��m��i}>&i�ޤ�s�D%�g����$���ӃA���anE�M�@w�O=����ȭ��Rf�(^��&$wc�g#v0�-Š_�5`^	�P$!��=�,���YJ��?�Z��!���pmM^H��	ς�m����Mfg�&���.,��=�f_q���o!}{��E��9�'��7vɣd�`��!�4��&�֑r�v��}$H|����{���3O�#�]��x)���=�/u:�[�אB�ˌ���v)I�w��ƀ;��V�����mDo+��&N@�KHl)X@]4L?$��F)ѩ"�w5ԉ��DPd,�L�7b�������eRCAEu =��v�4��a��r}6/��&�H�>��?u��� �5�V�-5bGf
7��`��K�KM~"ِ�u4�dw���8�L�,΄s)�K(ق�f��8@�v;�wD�  +�P�F�L3���%ǐq���J����‚�K�\\������;ss�E飑6��2"q3����(l5=ŏ=��'��H8�I��|�@
�4j�b�����g�I��0�N:�Ӿ�gBpjF�S�k�r��R�I[�tNօ�7_M��~@�(A�h�ˮ�zEL�Ylf��`�	
�#��-�����}ڃ)jdq�7���ĜEJy�~	0Sn��ȇ���nrP��G�)�¸%��m��67��Y	���6�aG9�:�5��ua�C<Ax�#��Iɮ�O��aL����+���p'�+�%��
����|��{��BY�����B)D��E76qd��5m��>�ѽ݂w�#�a�WQҋz��x�n��oݠ(S�qSv+S��d��1Z�ªO����*)�a�����~�����`
�Q�ќќ
��Mf/i(>w�öF�Ѫn��{]�������,���}�;�>8��� ��"�!_M�����!7�̲��H��9r��(Z��!���T��uJu̬�
�k�g�L����F�
�:/=L�)�H�F~��g�A|��u9�,�kT%����1�ر!<|�w�m���{s���=�S��ɒ/d�
�y��{�"��b^/E��鮟M�b{ě�%�{��><舥��WXU'�٩y���ET۱�t�9�;C��_�]�V�<yS��=t���<0sR� <��S_���0�'>BT�1����#EZ�3gC���Qht(j�Ģ|D^��Z�n㥃���Bhq�CԞ$�m�xE�G-��0��|�#��2}J|�3gn�Y��D��]�zM
�e��|Ոcu��Z�9,������-	��Fb���T���C�����h  ������������*�\�?^��N+ְv�U����u>qD[oR�ژ�T��(�E%��]HĒ!#�-蟚�g�5���|�Q�B����	=E�Cs���	s�!f��R.��`��z�>ݕ,�lkp�������
%�j��܃?�tty��tI\�
ȣ:�HH�#��3j��"��N���!��=YflL�V���Q�V�H���,��4��X�_��FV��W�B�j��pW�5z,wiƔ���4d�7��2�j�\�F.��_29�����ԫ��'O�%��dv8�jy9F� lR�MSq�ꕺ��9%����&0ty/�־�~��-\�ff��T!�0g�wЂ�.��z93A�-�L�XC�n)�eom�TP�f�|q_{k��ۺ�]�(�}c{���ֽ{�+͛�zz�kF�!աzz��6QN���t�D���W��6^�kjd���G�S
w}�1	�%����7�q9��x^��F��mG��^!r��f|m<~�&�;R��p�Ua��s�+�4'�U�X,h�yvu��*v)ن��7.�%	-g�a��aw|��|���>����h͖,@�K2�:���g�~�l�dj�H4/G���Q��lО�wſ�T��-dԡ�
[��=��� �>��Ѹ4���>��f�L�dK�#����{����u�k�~YU�p���R��E���7���r�>6�\yt��K���1ഌ�ָ0�Ce
_��eanǔ�^j3���)�&�i��	�W��~�G�O��o�B����'w�
2υ5Ex;�F��S�������?�F���G�h�3���#/��Ǫ�
���\2��n�10�]���G����:-(���)�}��1lq��a�AJ����M���C�y���3���z�k�Sr}�c_] ��aK� `L�P
�#�d�_��Bc<�Վ�xĘ0�����s'�G2�;��g��d��i,�.OF��	 �2]��OetJ�M6�W��X�=�64�z+5�8Z�U[9,TZS�,3�k�L{V閸vzEZn���\���4un(ѐ{
R�J�u���(R��4��4���=~�df<Z�o���"s��o.8�6���$�.��>bG�46,Z�~�鹁X��师����'6M��A��[�֎�����(c�o54�gV`̟,�މ�ϧ@)n�~5�e�ٱ���M�I�d������F�WDE�*�y�
︳�K0�۸���ja���^�p6of93�ek='�n29 ��Fk��Т� �X�ź9��t�͎q���[���u�d��t�d�U�s0��;��C����67l溱qB� |2U���$����F���Î��;k�r���� z�ַ�_h��$� ��5���o����;c����}Օm%�TVa�D�V#�ġ��-�ޅP����r��w�J��
UfaI�����]�&(�4ڰ4�҄��N�b&�%+!e�Q�͙>��$��If@l����A���٩��)mZM��&'����{${P���[,�9X������)�
Jo�i�~�$�&H%�D�8K0QJװ?7G�Y�"��T#c!^[A[ZG�G�����t@��3dŇg�O��UZ�H���d���.i�������x^�6�	@���u���F%Y	:🬒���2\�ͤqƯ�#<&1�'�H�#�4��4S�IӀ�~��	��w�S�r���^Iצ����8؀����,VI���3:j����.�֞��VӞ˼/�!)M�SZ�����!-���[z.�
�铋#��]���J�}�X�Կz�o�,��j���;ŽՊR̀�n�d��O�'�����E�W�O\���~��/��T�p��	>�=��}:>�D�û����!7>RJ��ʮg=cx�]A+!cԗ�8_��n�w�}�����_��!�!��rK٨�Zm��5CwH�������87VQw9n|����-�o��������-�Pf�EV ť6h�@Q��h���"�Bʔ�wAJ�q�.!���q����\!�Y�*<���<�}�["���X-$��<J�"e5ei��Wl.�R�oB���g̯Uɤ�<�19��ݩ"��*�Po_��抢TQ���tU��M�u��,y�l�܃ѕ��?R�~�b[Lǰ9;��i#,���8�c�e}:&�����U���i��ej����D�<#AR�<y(�;_�:��!ɟ,0�R0F�z�z]6ԟ�b(��z�'&�샹��8s�;6��`.H١z�[:�=-Te���а8/µ��-P��ҶjzJ!d����v�1l��u;�br�O�v��&���x��i�
�*�r�U@+��R��ۖ�ۖ<f�!\EU�Q�w�E �'Ý2��EJ�0R���S?h�YȸN�i������:ޱi�{,iHѻ��.�F�T$|��z^�9� �p��� �H����4qGЂ̓�A���GÄ��.�,2�}�z���?�6c/k!�$�89�t�񃚑���_M��tUj� �[$���/B��!����?����%���(.e�����}�_������i��)��'ɑ9�9��+i�0�$�q�*�;٩�3�Y�X?X������HA�H�"	`B=6Jgf�x7�(�2C56E-EG�@?Ϩ�09!KO��B�ZW���� ����"�����a�O_
/,�_HEƌ_.�s*�l.��&��0�
��������dΒ��@�of�E�h���A���BD��G���G�8�ױtm�X�C�?��o��*�!�	!��R�"��r�β�B�֭˫-�\���$�� ���mg�w�O^��DP������@�q�Q�{�'S�U1�L<�vP�+������I���(%Ï�hjf�CO=�犥�
�gw^U�����oe���S�F����k�Z���Ρ�5�s_���q!wP<�﫦mo�G\�=1zQJ��A@��*���؝,\�L��s_(%�[Q��ud�͝���2*� 	8�=YI�(�Y0Yf�|CT�67bdҢ�N�5y}}u9�H,�xDu���}���a�\�-�|izw	k�#�,��m����w�˛�_����M-��g��Q"�r�@4�K�/��s��9��vB�?�Z��s�����VV#��s�85휪!����~0�z�u�Ή�n�y��bĽ�u�o��wZ�ʺY4�\�~@��=׷to��_�H=K�6�	�	�AS�e�@�X�>�!�5?: �dY��<oO��-pQn�+8��D77|��s��E7#�꼓��KiE�ŵ|�!�㟔!G��
+�m
y��JM
���Q��IT�`��qm���z�MD���z���JJ~A?��̪R	L���^1���E�Q_ť'���DC��K6̃���&����H�=H�.�	$�^�ؤ�~R=S��L�����X0! �\�B��E�הQ�dVtb�"΀5�U%�ĉM��	1adD�Io�aU��NGndg�~�@��V�w�]��!d=0I0ש��=�2:�6	2�.��%�d��Gz3@�@���	�I`�ݱSz$�ˠ�Z�J��	�!G;�*�&���������O�ZLcc�8����;�+LQ�|��q�X�9HU�6HY/>�[��f(J`2�VM���uL[bjl"Ƥ�cٛ�S]Y2‘A< �+��K4͖ݱ�my�hHs��A{��x`sbtn��;k'�ד0���^B����mㄫ{
�£�b��w�i���xe��\6
�Z��,8i�\��01�������^Tc�)+
�!���	h�a
���1V���gD$&�h����^��b�J�}us��ih:�m�(e��\���9q�#��b�m�Irr�>���^�Ce���/�|���4�op�?��g��WD�ّ�L�?h^�%ef��c
���1
���fO�&c���#ͨ �
K5?��s�S��NF���y�
�gB���?�j�<��+���Ո#�w�zʛ���,ܟ67��\���R�H�����q􀻉�q�D��A��l|�ܿ�? �;d�Mq�@Iw~��Yޓ]J�+�`�u����o���oR�uQ���,���:$�E2)S�󔞅�,�W��p����u�S@ճbG�~�
U-V[S7��Xŝz��d+��8=�L��U}�m+lj��a����^�f���u���}��/p��]4/��i�˳%����%��+�;i�HG�>w��z(�y"����8so��SH^�P�a�m¿�	��>��&�]�A�>S�a�>��z!U��b��!��Y�Qխ�~>э�{*�|)uKvw�9�H�]'����Z6���V6����^�ʐ�����k�>�Žg*�i=�_4鑶� ڏ�`��e�~;ۉ�{i� �ۤ�����S�<7�������5f�n��R�p�\�&}��_f֩�#��t�?C�,M���ޗ�2�N���e'6=��<C����/8ʱc�����Z6lY�*�m�l���iD��%fI	跎���j���T���7��֖����bI��(��\�E�;N��O(Jƞ��P?�2�+\>��n��/dWe�#8���&Cb�8t�AY��d|���p�k�\<�2�j_d��Tr۪��o�Br�<Ӳä��Wy!δ1�4y��:��Qpx9)5r6�n��h���q�� ��v��0��~u�c�q<�`���5p|�2'�b��3�	��!�ݚ��x�2A��ݓiQ����Iy/}u���<qV���+��޸�X;������d��e��&��&��4����A7��@�=�+� �栞4��)8��3�`[����o9B������^�9zS�rA�G�ޮ�|���u��1�3����	���K��t�ul���eaD��~��l�U�!`Y�%��K�%�W�O�?��H`Ї�ʳ=H��+�wr�x�*�C�d0�]�����GX�3�l�֊�� 5����ݖ���t�V�x{�R���d)i'��:�C#j����U���3�
wgV������tG�K��m\sǫ��+���k�:KwuW�΂�-�-���vg�/���;Zp�/č�w,��(���vw��.��_���.�o]� ����v4Pn��m)�Or>00&h���Q��S[v�?�p�O��2*y�3a��/�ѽ��[�8!�.=���2죳{|Z<&��L�n�t�����D��OX���_��l`��<iD?8���\y�Uk�+~�y^�3��ޖ���}�{y'�����+
�4�Z���	jWi*.e��˨1V�wͭ�!%��\v��
���pBZM��������+u85�x�.e��Sr���S��CK7~����yu} q�&L�A�ى.�c�ư2����AmRF��w�cU�l
��е�R�w|�U�R�+��D�(]�[pq,�9�r����rT���%���nB����`"|����l��B̪��lx�DU�9r�>�*�e"������{�r)�t�p�5�M
!��]6��BZ��#��BF
CR��e(�V���{�CQ�9�e�9Ŕ�BQ�R
�4��k�o�8�)c�Z+�)
�E�yP)�*�<Is�b��tԒ�<�kb��9�JP��9�e�9Y�*Z�ZE�K�}<��)�
�y�%Q���EP�j�$e���s�3e��߼���z^M"G�<Es\�VJb�e�8�S%�<���zM��*�e�)E�T�bc�VE�cɕ���ze`�oEn��|B�"���
��K�<e<Ra���@נ��u�"R/	=J|��"�%�3n���NQ��q)�2Q0�i�Ҵ|X��$�ixV��Yr`�2
zh{p>�L��>VT#$?��3F4,$X���N����O��ŲB����Ӂ��1:���`�B���w��2�h�`E]����aD�g�T�����mL��j0�(��&6j�%hQ�~�&6bx|�PXQa`�4Vf�qp�p�~
V��Vx���F�#
�?�<
gb��O�Wcr��Zg�	ίcr��⡁�����C-r�\�*�Т���qL���U��i�NfT}��&�L�������\Աp0C�`E���b�C�r�_���+Lt�P����!���_}��3�Q�����i�����WLgR%�
�'�����"W,fB��Ui,:�)8Q��Yb�?�Y�`� ���[-�x(���[�,6�BNT2$�h!�#
��ɔ�Wh�^!�~@*i,�P��| <>Z��?��R-j���?H��2-û‰B��	��A��$�G�p<@:?IG�f��R\��g
�+�/D�	q��.�t����ߥ���=N�a(�g|C��Q+l*W��u�c�m�1c�L�xE��$B2X����A��{�d�@32�O�R�����_:f��4�E6.G&���
=�n�m�x_��z@=6�8ڄ��å���*������\�{�����<����栄������ �b��
�~n�
�P�Av,ӽo�N�-�כJ*K�]!@@`����1�[�hj��[S���!2*TῊ���i�E��B���lJ��J.��"w^^C��bO��	�i�:ߏ;~��"��{�Ȝ����n�u7��L���:)5��ӠY���.��HQz�h���h���)�4����Ä���oU��P��R0rR����v�S
5�Lt!g�,L��'����4b��#�h�:�ϱ�|:r�X�yc��<�y�ݨ#�P!����u���=<n�����g�\^#P\TO�
����a�
�K�j�T ��X�ml��|S&\��A�|��Qgs3��V����#;���ݛ�4 ���k��U��]ZBc�Y^v�גq5�:�U�A�O��yya���T���v��`�Ha��R#�DE��	i�S=Q�q��{po��@q�s��N#�MW�jlw�>�,óDg��h��Y�(�y�
��|)iz
�+c�~�q��m�Ełv#Vi�?=�
k@:��C6k�7u�T'�k���CNy�)�Mn79pGPG��17T��|O-k���L�ԍ�3���3"	g�g���f�? 5��T�h	{�4���+�	�O8���-���-�i`1i���-w	�����Bw���w�X�1q���"Xr���}���?�rF����7}(颚4.B�����s���h�q���������rH��4�U���:�6H����F<(EfU��
#�E:ʧg���M�{�`�hb�7�\+�+��4���Ve��W�3��r.M$F㕇[��+�=�O<����E��a%d��MJ�7�k��U�xR���d�},��`��"g���c��:�b9��lcF��p�FXP=ɕ0�G�"[y+Z�t%�].��e�kD���_������s�Ԓ�P���zt�/���C��8uu��Y��{�$L�������k��:�Ӕ����veq��K���e��L%"�"]������I/%SO�g7B�>�m�Z�
 q��K����eh���2��3��p��p�9W��UN�Z2H�
P���K�j�4Ķ�Υߤ�7����wq�x�	khE�:g��w��.a����Ը85�� �_�C�av!q�樘B�I,�)=����<�)$�0�W��n�S���Q�tq�����{e8�}$�mK�gj��@W�d�Il�����u��/VM�(o+�g��OH�ؗ�0��$�Iw�P�#�����U�mn.x���L<LXLG���Z��|�!��I�+N}ݞ����\��O{�m)�i��h�_ݴv�@[�����$q/"n8�k��	�e򎅒��țє`����$�q�^ώ|"�ou��䌿�t�Ʊ���0�/�"��x,o�/�Gٽ�!�������A@�A@h�'�v�1�/佣��������xMV:Ī�%�P����|I*_>�B1D��Zв!��n�=7�}���Ix�1��A��ٶpV�m۶]i;�M۶mۨ�m۶mۮo�9'�>�o���s�X�"��|�S�K��w�I}Vz���[�>����_�{n�[�j
8�]�[cI0%lJ��Cl$�In��٪� �
��.(]��讅�c[|�:ޅ�"8��#��ݨ*4��乛�V���qtQ dV$�{�:�3�=������8��2�TќG>И�ԫ{߼�(K�;-��\�$�Bl6��#�]�h�\1ϥ�Q����2_uF��d��TxHUvR.���ېO�xg�xr\��	ބ���X:S����3�?})AE�z��e��q8z�,Wh�]xٿ*W�Ċ�ΰtDsD�6}��6�8
�k�V6�Up�pZ�1���
�b�-�P���1W�	}M�iX���3�i���/�D�WC��R��p0�œ@:�p�Y�������l�.���Q��W�#떯��Ҳ��K�n�1�/X,�T��as{���$+���/o��D:�՝�=
C
�Qn]i��~tm�O��v��IO�[�v���[��X����#9$0�t@wΎF��F�V8:G6��Y���tA�[a��W��c�E��(XL[�#��C��8�8�"sy�$3j�z'�o��T����f�.���	O���A��u�d��O�,��sWj&�4�P�#�>{��R"3�s�E{���P`��wE��*��sS�k�D4`\-V������މQ��,�H�o�19� �B�V�Ȋ]��V�Hz�t�q�4A�;���b����dt�R�}l�э�\j\��n��K�$���{��}PQ����zD�R������*��ۏu#��_ʯ�3�M���=d.vDU�y������$yl�#�%�W��{�F����)�����x�R�p:�C��H�����,�� 3�Ǡ0q�!ܓ\#[�$��<Rx�^�#b#D%���]�hԯ1J���'nA9�v��	��BD��|'y�(�q��˂������|dg=��v�[<��w;�a�喝�P����4���ť��G*>5o�_�O�`$o�����g���"*XQF���m�B���V�A�#T�N\R��5��ڪr�vM�N�K����Ǘ�!�%�۶W������>�.�K�ݭ�M�~Wd{dH$��^CD�ڪ�3���ѯ�z^��uԯ0�%H�E�2�;�9�dD��wbޘjጱ�A����j�b��52����)��k��u�Q���3�c6�L�P�|�{����Q'�bߏ<7/�q�Ǻ1{���<���?�{��h���ZVɵ���O�G�T�s��<�3��L�AÆ�/2��H=�okDO��!�-�_Aɘ�
��q��Ѻ�&�XA�A�?��
@c�#Ϡb9�=/ȏ)�V�Q�?Zp
��[��™��~���m�	���5�h�a��\��
{�Rk�̫\g��g�64�m���n�c[��N���9�)�C�?�v�7u��������¿�Q�mC��!`gge��?��rR�t�GK��	Ӎ�4B-\X\2���x�� ��_��	�Fz)��U�Ζ���h�K�q��MȌKWd��U��y�fg�+��v�Dw�����l�f�k��6���� ���:,��x�r|�������m���w���:&+��|���1_:��?pW��=Խ$FREn�p�#.���"b2�6i4����8H㪬^2���3�X���6��;�#��J�:4�:�8�v-�Rv���Kw2ꅇ̕{|��vj���b,^�Gn�F�|4G���R�nN݄G\��yqwR�|(�b�9�J�|�b��>�Gtx�ɝy��K����ag,�d�p�/%(��K�5�Lk�p��UZ���v����`�e��|�8�x*����*+����j)QX5���M��j��%�*�1�!���ï�|ø�ه�������0���΍j����YD*����9U�4�O��1Ε��6`�&R�xQ$V�E�樁c�Bs9I��s���V��|��a	)z�\с�:�y�xI"U�PL/,�;��Dm�%NM�4h!o�QfM�9>w����7��H��<�����͚�
v|q�Y�;�:�����L��M���Ϗa�F�6gv��&��Υݤ������;	/#F��D�Ux�4ĀF^�P?� �&���Co�$�K<<Œ�A~tJ�SӪ�%p�tD1ٜ�`$�Y��fd�~���=S�*���w����4\ȡ������L��Άq��G3O��
��UDMw�Yi};�5�B(�4�K���Ϗ
�v�,[�G�f��m��m�W��3A�w��O�S]SsU�Zo�v����c���Ao��-�+�E�4���k JF�?�	�Y��67�i����F�p�w?��_�j<íig>���L���9�<㭪�-���m����{Z��-ضQcá����P��+w�}��ۧa�������6ۭ��Do�~0�t����y���ƕ^n�2��c��1z�s�@�����u��Rļch��0�H�Ŕ4�h���"���4�[S*?���2��RDQ�9iK�!�{��ѽ�T�p�q��^?�dF#­Ÿ�^,�A�ˈ�r����3~x���rq����ְ�o6+Ŵ�jk���F]�H�A��a�:I_�Md�=������z[	K�7�a�����Me�щ���B�M���x�#zY���.�į�dk��[��Q|��1
|����B�Gi2��Ƃ!Y�߫[V�N�8�H�P7Z���H�ecw��Na�D<m��&���d��
��KA�wU������5k��j�Յ�=�(Zo*o����&n���U�j��M#�Q�J�1�~m�?tև���ATk�8��H�MY�)׀�����Dl��\�k�=�3/Trj��S�}E���%Nz���Z���/��-�t����NI�l]�����X\;�a
�n=���D�w���Ia���js��v�ۍ��j|ȋVeP�Mܱ$��L�qL1q���� �~����}�T�k��ڒ��R�j�JiƮo��5لr�A���N��Rt�p���"�k�"������sߦ��,YQ\������)8w̛��յv����ӧ#.�fڃ���t��9%y5ƃ-��%֑�O�rweP6��>\=\�`� /Þ�/�a��3���mqQ�k��=�o����tqGʓ�lq#6U���{r��\q<�����{].�1%�ɍf�t�I��5��}=�@�3kLs��>)�
g�Fp�o�h��7ُ=O��Wz�)��(��*Qn+NOH�=(n�v
i}��bnr�BSI���	������5LW�X{�v�a��v��|.EMG�s�`)��*G(Qzt
�:.�TU4a�h'���(��P��~\���&�ޏ��N��^��R�@�(i�69<f���>rxJ��%��G���P�Chsy�?3�Ш>�7�$Hۢ�FJ��$L��B2ӻ�X�1te�܋ipD���?�Kϕ�R將�:��<�X������� y$��b�1b��byZ��,=�L�0����'i�3�:���a����$�lj7ឈ������`���[(�W�~�/Ҟ(�;6%��D�}X�؛}P�S:2:7��E�Lu��-Ik����2L<���;��
��y�d��7F/|R��a�iz�<0�i:�][���r�qt��!��2e@wl��B��Α�gH͍�™���C��h=��c���eV}���g�D,ȟ2�#O���u��5u^{��6���i���{��V�GI�	�dC�����g�!(K�t�h��3��i���x
�YҒsa���s�4<j	�wu�sL,�r�����F׷���E�D)�l��蹍����XӢ���jn�>���<��@N��Ȱ�">�$|˰
Xa�
.D�E"����h�DC	���rOe��2*y)����+�k�	�|�.�3SL��-�{�����񝼒Z���&�r�*��9�J�ri�E�jS��Rق2��J�|.[�S������A��Y���m���P�t��]Ik���<�+��#�Gm��
��!:&Gb	��
�oސkɓLBMu�:C��we�������g��L��#�6ndm<���e]�>$�p�%��$t�\������EBm�	$�ok����w4w06����`��y��k��b��<����f<�+�2X� N��(-������kqw3��gAԉ�yZù��˶c�M�Öϟ�7j?N�x�nlSy�܊���Y��LuP��)V�c��(l(��V��@�Mx�����c�ӌ��lm��H�2���1-�XՋ4�u;�
�
��u�3�Ŋ��w��PE�]��V���}5Gx��O�u�!�J��:C(�
(L�6/+B*��$��ә��B(�[����濌AagW���Zy�Ω���l�g���z��Z�%n�V�\��r�� �\`��sA[ّ�@������BC�OXL#��=Fku�;�H�;��(��(��ʼ T����r}�T���5����ofې��X#��&��ߧ�6A1R]=K���	I���,������3p��5��Ah�!l��h���V��g�R�y=:Y>1,_�0�X�E���6�$`�`9��C�_�"ԴP����Y�?؄�ȁ���T}&qhZM$k���$]ȳ���%Ȉ�|Úw�W�țI`J�B��b�S����&>7
�cg�	��a J�G,x�C:�i���6;���w٘M����6���d��e�'�䊑�Z矠p}ϔ�%�S5�4#�!]05�ۉHG)Ck�@�䪾��2gZ���8?�5���ߔ�{��-�N<�W�o�o��7�m����[�! ���s]y���
�1��<�DW�&+�k4tkj�4�⍻|Ԅ$�H;��4�#�r�7199f�����r���\��
�N�i�B[���Tg�����u�a���I\S��	��8WѺ��C=^1��ܰL�!	{�������;j���T��I�����ŝ�S�\Y1V�_�FYdS��	l�g��p�Y1&D�D�5��J鮆�3�N���(�a��޳�d����:rMQ��1R3�R�6G�Q��	�sHٝK��w���-׍WH�o�p��cK����/��d�C�C��X��ԏV��H�Mx�M$�di)͒%���o�b;�t�z�Bxn?��e�ia��R2�W��1T)���LR6���]�{V��-a��
>���OYO�R���p��h�g�ն��M��[���SV�����k�=-�S�
q����΀��!�����o'�7�����
��Px���9@��Y��A������<�c̀�$��!�G�_�����~���1��q���z�s��k�(�Ы�(hұ��lm���@}*j�����~�����of�(���mf�O$�b;�
%��aI���9���~̄|������f!���q�&Z_��&|�K�H*y�{vH_�x��Aq�EƔB+e�2�J4;��5�lWB��G��1�8�%��c+u �x�X�5�tVa�1�j`��"nw���hw��;tR�\�E��!ǵ
=�~E����"�N$N5�k4����_!�m�)]��%�J�m�X�}xx�IZ�aV�{�O7�%�ƨ�
]�{�zK��W�m���E�_�؍ ��5Bt�[T��#��N��wB�Z�A�Y�[��wO*�y�h���$����[N�챿�;��+�����š�_�/[G�Yl�hk��v�Q����W	ޙ[	��-�8�#�|�Kv*	iSLhýdy���R�``�a��`L�k��H�*q;���<�Z2
�yܴ�6I2!�w���41�Rr!����	y����3Z#r�8��'.�U�־/��N+n8G�Ҟ��:Q�N3���^�Ml�(��錻f��R�:��
�ý�R��?E�Tz����3?Hډ�6�8.
F�S�-�j}{�'x^�-���O�’,�����BS;F~�ٗB�Jy�J+���$��Eky�$f�=xXAv�@�Zс
yc�<𮤳���J���Ċ/2>��߻2׿�m��[V*kͽR�M�jf�������!�d���=h<(�#3=>��݁y��"�z���P�wk��[
�Mk��&S��D��(�d�.�d�m %J@��)��K��SBn9m.���j���L"�������"Y��CP�j��O	�Fy$2����q����X�F��'�/[�ל�f"ox�z��X0�y�3­Y�GkntA���$�Y�;����ĵG2�����c�G({5GC�F�
x=TR��4D݀(*Ί~)���zOu /!<���z/� �л�Nڀ�;\�O��Л�kX�l�m~��P�ۖ�[b�׺�N
z��H�N�>���f_�	��]\B71�oe�o����[���`���K�o�����W�OK�?d�:0;į�%Zo5���!���VC�7�A�%�.�/ԓf2��쏇��w��c,�������Ik�碆��lIN��~l���Rx!Y@�s�2Q�N��v�f_�����La��6y�v����e;s�&���λ#oxe��`z��w�=��Z���qV�`e{�/]��j��ו�l�#ӝ��;��l�8}�w[4Q�K�
&�D��xa{�T�H��!��ip.gb8~�+~���~�B&�)��T��r���…�B�ƉF-M�l�+'�#�C��$��v�0�(v���/�k�5J
GQ���_�L��o�X�`���umq�N�w��J�Vv�<�]m'�؞�&���*��&��^�䯗0�3m�9��8��v��-}�)Ms�I�΄\�錗�Ŗ�g)m"�'�G�s�;r���ș7wg��ro��Ej�������΅ßkg��������t��I��}W�0 �x�n� ��I�R���n���"g�1C�ƃr�3��a%=ܰF-_V��w]�j~p��=|v9c�Ԟؑ��Ar����,$�y��9M�M魬>o��v�₻L�m�a^�?��t�t���n�t����N"%�(�An�m�](�89�iPol�Y� �!�o%�������vr���(�ٰp6q�I��� �P�>v4l�"�ԮBaD���=�-z	�=Y�e��QN�K~�U㊌Zi�8��b��R;��˻:V�|�*�^ Y�4�"]�y�n�D����\�4�\I�K����(>Z��b���>�oE�����hNU�I���D�0-:ĸ�7Ca�m:�:��[�D$�@��K����a�d������I��տ���g��mLƷ�=�^,���ێ�Z�*�o�RD��Z��00�p�rI��$�L�5�m
������b]��S�4�"�
���δfU��.CҔQe����"T��`�I�mY�f�(l�V8��ն�%f�؀\��LSY�jN������u���o+���K:e��Y��.r�4kd��D��aë�b�Xy��e�6�]h֠�*D۰/�+���Q�\��(Wc�ĝ��2a�	R�4Yd�����Z���|�"ƾMLo��lp�1��5M�����h�%=n���/&Ўr<�L�:��=���I�E�i.b��[.�N�u
�X�������xwZ^��@�r��(�j�)̜s����MK������^�\d�I$�uQ�A�a�s�_ƒ7��>�_���.����7�}�,��j6��*\M��p�� �B����7�o/9�wh���'���䋑td$J\������YYcV��HO�D�`7��z.�H��x��Y���\���}�`�Z�#�*k�[-���+��_�^dl`9�����n��z*��:n�(J��Pyo�([�i��d�N��J`#�s�{�9��jm��ڇrsSE2t�F�œC�֜��j�t5�l�������{Ԑ8��#h�h�fsR��z�WͷB�
�;1��?�N�^�%[@<�"�55�9�N�j!��-,�j�������U�����5�h�-C��K�"ⰹjͨ��P����נ��}��g�A�
Ì���0���뱆i�.�S��u�q$C�
���m�u�P�ә@�}Z�T�s����_��seqY[�9�!^�yzx{�~�,�qH��5HT2�U�@(�`��Ӻ*��0��#�����hs��(�#�+P=0^�l�b��r�!	ՇN�<�`��+�b�Oʦ��$�%���B��.�2,��`�S���@0���Pea�4�t�#�p���+����L7�WAF[��L�?�x	Tξ�c�>�UݍU��/B���GM���.)'q�ib�=�I�+��J��Pۿ��Fx��S�;�����Ӈ�.c4NS�}�����s�/�0+;��1(�É�XZl�f�	��|�B�]R̲
�8Ąg
����i_�iW��
�fK��gs�)s�O薮5�V�`��������Hc
4�@�q�}*�y��/��a�����X^I��05�cOu��1|�}a���)n�`�w+�<�e�0�^��.`ZU1�v���W6*Qk�麧5p�?�f�?����!BOߔT���H����$�����c�'Q�����Af���D��
yG�,Ԡ�[��f�;��u���7?6Ÿư.8lp'^�|/A�5��SG��t�.C��cD��z�I[1�c$)bX��ei� \�qX�Ũ�Q��).�]�e�<���
���o%o��d3�qA%f��#3;�E,�r�r��E+iU��_*y1��T�����쎀nZ�$eK�fdM���1������Hz<�t�a���#N�s�.=��uaU��K)\;L�	ZCUK��*_iL��,�����hJd�J-,`Z��dz�࢕Y��?%1i�Ty:/��l�2�oM~��b�4�L]��ĎP��	��B��Ӹz|����F�%��KdMQ�Ϋ��[�����<�x� �
�\3k�J�v�{Y��c=�+M)�2P��d��~L	N����r2�_.2Mp/e u���za�aO3&�MDZ�m�h#{�.�Oc�?�ԝ�0I��~P�l��>'>�t�;����]�g��V��j;���	>��Qxq���*��_�?��#@�"�Ώ|�|�� :�� ��{�Ζ�k�WTq�zv�xtt��nҠt�}��S[&�0�9����%@��٦K�BJ�a�5�E"t�ea����w�_yC*�;�	��|v����5�얂�cM����Nl}{�_�
r��zd�
����v�F܉�k�֦:j�ƴ�g[����l����o����y�I^���1'O���D6wu�@T�f<�7
7&6���5%�����]�V�}�}|��
c+��(�.���)��/�m��T��	�i׾�~�v̔pֆi�N���\�";,��P ��
,E�	�H��+5{&���B�F�I}����wƁ�0:n��c�zya�z����U>�O򰢅�
�RM#=���WS�&��;��d�([XgR.1�'��W.�D�:Y��SZ�Ϻ��x�TAP�J�����q�]`	u/��۱8]�>�JY&�+9�L�^ӫ]s���ᢣ}v�����M�����Jv�=�mڳ�joy�⾂�@��I�J�h1�	'2I6LW�G�fT���M�,�\�UZ�{�y�h��5�:*��z�5l�/
����R����
�B����fnO.�ܩ��zMj�9n���)S�݋���P�	�WON�#u�@�ʜ	�߿A�'&|��NnȠS%e�`j-`=�\��Tf�T�R42��f�E=�\1c���aG.�d�[Z��_ӹ��t~�	�{1Yw���q�4Ÿ��d�����\G��"}`���2:���y��hb���G���_v��뇈8��GD!Rb��69�X��1GnxI������el�6JL��սY��l�YN���W��Y��t�T�{����}��{��EC��y�5��٬y��Æza�T���8�h�i�b����֒?���i���a�/kh�5�Xյ�mH�]��e6^���K������RV�z�s�)-��-s]�z��bw{N�Bzu��ba��0��8w�ɝUSv�<��������뻡i�s��^$ѩ �qU�6���$����;�?�m-����&�6��)�O�'XaL���7,,GD���O<�h�T7y��(�89�(�L���S�6i�G�O
�'q;�p�RU����ŏ�	l?V��8Jh�D*ic�*}сʐ6�cf5��k{n#��̕}Y��[�4���-�mt6�ܲǘG�Ɖ8U����
4��lg�5m-�E�4)XDq�����:�wk-�jG�Y�(��<�&���G^��*�

76�����B����������F�1�dS뫦�J���_λ��!�gG���Ӷz���2�Ş�
�cWȳ��0����0�6��dn!�<@��3�A�Qn	��X��'�w0H �S�Y7�F��6Ϗ�p�A��g��A�Ԝ�L���	ܫ!���]�����w�Wj7fu��8q�3�Dt�Eq�A��F��E�����ߣ`��<�@@t�O��M�U��[�G�-^8�����E�0K
neBBbŪ��"Lo���g�"��M=
��w�5�%؞�a�0�u����;���1��c�M��cm�ԟl��Lk��j��L�u8Ъ����u�ӆ��r/�<��15+�]|�#v4"�|�7]�)$����:Ć@��='«�P0�����D�yV~$��1�&��0y���^��5�>��2�ȟF�iD0��|���F��J�������xe{�y�!�NւrB���[{r�v��7�-SӢ�f�W����]��6<���w�R��
�T٩�r�b���T��H�Ђ�ش�sς�
�e#	����ӎ�:4�����{�f�j6+�O��A�m�j���A��.`ӇԵ-B�g�K���(U�#�|�Z�c��(�gp'hVm���9�?�韞	2�3�ڬ��l�[�J�:ܸ���.�
��:�P��fҽ�w�H���
��e�c�&h�Q>�}����L�X��]��r�sڥ��{0=�
�Bi��,�J3���B}�`E(j�MޫG(��V�b���P��K����� �9(3�6r^�k�d�~�w�HBK��gM�,m(���-�"���<R��=�Yg�ن��(.3�c��R���t���^[�u�����ů�\k\��bDC�S���Q�S�ѯ�"g��߁����Fi�#d����ݞ/F��s�%g�T����L�J>&g�"�
������~8C0�O>8�%���@�a��.��?@>�>~�a>5��q��`����Xb�e��~��W�5��)�'Ly-O|"�))E�
C�a� v>��h�;�����(
��wa[C'w��ފ��4��]4W�Xä���^QFЏ�2� !&���gTi�s#'�1!E�&�mV�1�}�m><g�������+�C��<�',��'�TD��BRK�#�a���b�	�*�\H�$��Ktŭ��2����}a�.4ES���1�4���`x�y�t�ŕqT;�Z��Y�l�H�psnp6x�	+(̄�Y�ʶŖٶq��
�tѻ�t���[�nv+5Р�Z$t��a�>V�M�:�G`��R�����U�۲�%�w,9X�W6zPA)]��W��ʦ�R7���y��[�O�+#o�:�a� �I�B��,cl�2&�1��B�as8���%��(�R����`�8��.��|�Tn���
.꘹z�T��LY�&4Q{�]l�f��Y�Y��W�/{�ļN���[<:��V�7�PY����F��Gc��-�uXSy��&�gd�3��"�Zh�a��JAr=��?�v�0'C�
�j�`�.�r ����HqA՟��vkN�SI):�+t+u;�F*I?>�SL�9BaZt.ge�~Y8|�k#�!uI5Ja����!= 1�{	��å�������>"+�etA��zO��J��/���{�h�?��Em�����"����N��m0���Y�#�df`F!����1�����kID���/�X�4K��H�~ ���`��h�g5�o�l�|�K�db��c�v��ly^�u�����Q�#-�8�&8��q، ~j��[0x��S�]#8	��]u�;���C}0��C@�z�&��gݕ�!
)1�R�S
P%`��B����oP����c�C��CK��p[����-���y6��%GӍ?+�ɯxkʯp�:3�Aw��jFDI��9w��Q����X;)ͷE�g?;�NCk�;_/��g�tJ���a�֖?_O.NǥW��#��)��TV�yNV�VR��7k�v�lN��{i2��YS�}oj�6BRM%���R9Ǎ�V�@F�1O �==/��`����-jIn��~nN�P1ug��ɍ�=/Sš�"�S�9��dp}�Q}�k� =���_:VϏ�T��J���w6̢R.�wÃ���+H.��^̴F�u�U�“Z��]Q�"�ҐvV��]q�<��}QAE��	�&�\��aBG����j�s"z��1.W���Mk
��/n�?9S�Z%]�F{�z����"*9��D��8�1���Ꝯ�Ѫ;��<]�f
��JSx
�P�um���ʄ�$�C�2���r/����Su;
Ց�}�~�qlpVK2�TO�:�N���S;������^�e�4.
]� ���:9 �Y�|�g�Uх�x��Sl�n�z��X�J��@�灴�K����#K5G04�&2��}J�-R�I2�߫�ą�zG�s`aD���T������Y��5��YSA�W��6`o<�o�9.�1��Q�4�cZ�b��?
ii��Z�Z�yY�!
�<��]��_���j�g�
.�"��{}P�>��_7�A�Q�[��_��c��և� ?B*���u�#H]�#��Q�S�%�a��y0���G߈��7V�zA\��fa[�ɨR��f���{�F]�M����l�0�\z�k?�
t�Iq���uߞ�R2�}/(�H��m��6����K���y�R�(��0o��c�,�T'X����=��K#�QڳE�?�2\2���
np�`Gu�>،K�I@�h��@��
�wڜR
q���y>�+m$��E�n�r�1;�(����pM��!O�$�p#��Y�v%߈�R����^����OW�(}�?[�qL��6�A�M?��^T�4w�ebw.�wN��+î��x���*5��3�F�����nX� �Wg6Vp2_mQ�곹?��h�)�i���
m��']��ǠD{����T��R�<cKl6�Z���Ʊ.Ρy������,�X���ѻ� ��yuh�Pޠ�~�F�~V.�V�d��$��М�ǥ"Y�^8�����TuZ@��O_���fR�,�ڳE�v6QV��y*RK���w(��}�\Pti�\F�A��^��0	���4��3��8~楬>��I���L|���T��O��{j�����I�r��^|Jn"�Z��}���ވ�S�� �3�m��j�^Y9�p{���Yuy���"���qA��N��D���=�zEb�cj�C]^��$���bn+��viɉq2d�.J�s�g拈���Nϣ�	%��sxI�!����Ҏi�wz����M>Y�-aB�ݓ��
���T��U��Uj�>�xNN�)�N�e��^�z��at�bt��[�O�)g�=X�-�֣�؀����?�B�l.�X�|ʹ�92c U�Tc�]2;�*�;/�aJ�K���V�Y#�,m�͸#=O��)ې�V����A~H�1�\Q�t���(������|�n�
iW��<�f`�_.r�~ʼn�n~l�}�QV���e�����BsV���J{f���YS���!�g�ou����9�w������p{��p{�S��噍N�
Z�%�;[�~o���?���Hƍ��/�4�?�B�:�[+���
l^�*Ut[��A8iC�z/�C��+����DCz��X����k*PP�C���^jH����("w�^�Ŧ$R�$sҶr/g�[���T�j�m@�	p��ÌÊ P
���>$��0	�P�7�����I�T�AN���?�=jc\�m�
�06Q�n@�| �n��A�)���9\�;Jv���m��g+�i���UhNI5ڄ�Y���<B�ݲ����
!C�K�h�P�)f���S�[���Ben`�QF�%I�O�&"�Zׅ<]��)8]��z(���r��rQH��#e�<>�v<��'�d��!�F��&Tb�ư+����g���B�U,�)���
m��j+�h��ꂣ�/���4�is��S�
�iZi�<ק�Wa��LV�ܨ��0%٢���<����s����yil�[�c*���ֺ���X���!J�#�L��U]]Z����
|��ihFL�5;��l�^ėk��aE����mP3KH��%`;��gkC��9
�Ӱ���+�p�Eh9���C���`U~x`瘵F&�{R
����O�H��d��1�o�@�`塓Q�R�C�$���pb�f�t�s�d�7^M��gR�>���`�t8'�Xa��k�����5�����+3�!���p��O����i���4�u>"�w�(p������4�1��m��h&n���'izť''�+�V_��)��RQ��(ϼ���x8_��)n#��kQ��%|���@1P(����7�8�%�kjf��J���G?�����m��8��q���qX����<^��Gq�s�Wr����Y����ʭ6��=�;sR��iL9+H"k���s[�!V�쩥�l��)��د�ֲ=�b[^����0�Jm�;1��+��x `�0�8�sLv��__"lTW�V��i�y�RA��\�߈#�4��;^���2_1���B�1I�>�,8w@�����̢�𲁺��7��_��O���9�?�ՆS�O=�x�%�j8Ğ&=�J�zL�,�i���䓀�f��9�dyܹ�*$�L7�EJu[T$��+����N 4?
��ìA���g���p��sKA�Z�m,B�>�^�w���.V��}ퟶ럆K�R	I�GG���iރ�F�������,�)�_���m����Ut���`bW\���s" �p�s�s�1�d�����F�����P`������}'V�gw=!��Ϙ�3
�.n�Ɨ� y"-�����D{���U_��Q���-ZB(�Ћ�Qջl�
1��j��a>L����*���C���Pt��,�
�������0kOI�h�w%�}�"�c�aG���3qsF�m\�P‚y��M�h��	M��G@�o�ɃU���/�@t\���tӸ�J�w�0��}��{��H~%�tp
���H(G5��x�0B���$+�_�P3 VRn1���F�*e��`B��\�E�S�H���l�R?BI	�;�L�~,�
p�p�W�,�Fn�����o������
�_���K��U�28����`7����o�&S��b�-��!QZ��)���z�W�uM��ӗ�f�Z�>wg(p/j��2
����� �b��{�J���6��2�]�橥�l��:I�Ȼ�q��7�@�X��9���%O�'�\�q�S���0�IIh �g�»E���ǜ���p��Qm@����9�w|#�j�UC��mu���<��kJ!��J�sd-T9��Ư|��
�aҹ��	�d�+�_��HF�%n%Bkk~�#A)["$�fJ�-V�r�) w��yd�39��G7��[Fq�n���6E�Y��d��4��`c}B}����E��wm��u��4�O;M�v�>2�cQ6q��JQ��p�/���x���<�H�1�t���3���u����@�U���?���F�[�������Ԭ�^k(�^"-�#^��s7����K�@*,�:��"���#�L37�)[�Pې?����}�Q�&���Xm��3i~t?�!6����(NPBD�<��,?#���
�*��m��i�):+�
���Sf��2R��K{������sb���f��(H�y�z,�z5��g�����JAԶw�{/�vZ_�~�z_ͺ5�8��k��#��E�-�e۶m۶m۶�l۶m�{���}���{ω��Q?fE��̑#�F��^b����5N�[�m��GhӨ��VQpÙ�P�uיH�W?��p+C�K��$�3���C�*��	��l��
b�<��V��Y��8O<;�	V��((�`
�iNc#���專V��
6<�4�ݹ��n�e�H|70��
�z�h_cgH�e�b���f��BK�����	�	��>�|Wy��

�K�Ig#< �S.���0	�­yN�^�ԃs�fְ���k�3nx=�WB�dD��C?|���N�%R���NW��xL���b~E�����[BvX%��P����۝D)����9E"��#�4z ��a���U��‹���;�D�� @�?wG��X�v�5����o��c#���r�T�* �Dh���V-Q�t*�,�B����s����W�
��/Bh����cv6{]����.�
�Ke�� 0P���q�O>B3�#ǡ�K6�
���;��0���ߎ����onb���h~3�{T��'m����]ɩ�7�Q�q��}A�3/�4����{�\�,7Ґ����aA9UT���h� �4�5st�]
���̎����l�5Cl�o����U4o��+�j�+J�w)Z����)��K��Aᓻ�4S�1[U'\q$&@��'L�\��4�5��Ć�"�[��y�ѝ*�&p���/
�S�'
f0憦��L���P/��F�m�����@����I���+�8D;5�����t�02s�`��UV��=�/��Jo��0ul3�����W��G�8��%T+n�~1���O^�_��D�wc�F����\lÍ�Ȉ{���_Tr�g��e�I])l�R0�4�'�m��\1@�� �8]Ewҗ�?��P��d�~�����o����#	Sr�(a
Jh[ �(�����2��Æ
�v$b�3�J���]�
�1孃G�ifmg����?�A��P��ƍ�GZ�:�pQa�6�2E`V�/s��Nz�_��f9�{#�1�ͬ%zv��Sh�؝�M��*����yP$sQO<�"����Ng=06
0�ə�Sȁ�p�>Z̬O��̸̯Ͼ
�⮥��!�s`0(��)��Σ���(����QU���M�8g�{9�B��)Na�H�-�J�!���VHT#��e�B�ܓ��MmH����q�+ni�orb�*hD�Ϸr�z�.֮ z�K�.�On\A�~�w�+BE��|@�3��54�oLU�����,y�X��R��ed��^%P�a����S��r���+�5�*\T@�:���D�G&]�GW��y��
��O��Ky��c^���G�S��w�~��[!Z6n�`��ׅ͛A6�S��:����H:�.�X]��kx�.�
��^��	=��_wA �"u�Ц�4����|r�t4}Ќ0w��:������gD0`�x1�L���J_�I�2�i�F	F���n�0����jcH�ΰ�5��Y>-d�TC�
4�e�=��OVT�ra�5��_B>�Q<)*Ŀ��t�U\�W�K�X��ڕ�DT�&���ا�\��S�-7�A��:?|2�FHZ�M����/�^=d��
H��*�1|��Wi%'c,�Xm�\Qb���eB����Ѳj3aB�H6�а��x^��O[[I�c�_Գ)Z��3����2�
Npў�2e�ˈc�.�2���Lx@
1��	o��d��4E�2�Q7�4�,06��Q�όYsU�)r�I���J��2&�"�-|�,�Y*�Z�^dKR
��@�#oy��V��#����L�T:'G�zȜܫ1h��L~D��\�̳E��A{d���vjR}��G|ij��x�(�T����Τ�dfO��׺��Qv9�6g��֕�N1��	+��T����|
L��۴�.�#�h(AT���t�f�(ac���f�95M�Aɒ�\�[�Q��̮Mn?Ʊ�M)��tǙ��mD�m��ed�X@FJ�x�{C��4��zY�d0VXYq6e��K�hp>���FLפ�A��ք��^1�Y��U��A%AH7�<|y��i��D���_� ��Ӡ��b�l�.���%k���Տ:�x�������c�Hyᆢ�Q
�ɗ#��>=l
������d��mk����J�r.p�ªq'�l�ʼn<
il�#D-L�c�ܴ����z���z�%��j����}��N	�QZ�"BX�rFX�蚍sG53�!njk�'�%�[!+��0fW�+���}~��麀^�?2M�G(c��_T2�pz�)�ي�3p�[��u�I7�s�ޗ��%Pe�����y��c�P�K�L,œ�!�2�2m�A%����̭�=�s�)�_J/A$�V�b���JM@�#*�<�(r
�)1�.ˡFh⣶7��My�X����-%�e��E$���F��5 *����?[
��,c9�SMɇ�{B�5r�v���q3N`yA6G`e�!�b�D`��X�g�}>B�tq��Y���D��
@9f�8Ơs=SL�)���!�3��K��k�!jG�kR�j �`��ŸA��kB�^�6���t��
jo�݃��n�W0��4��D4�E#�p^@&#{�N�C�"I�b�w;���XG:i�k#qG>KopE:TF���Z��QS��8�al���QŒ.���W^�MB����a�+Dޖ�*��&��M
C*���������+ة�)�Dt�M<�g6d܍u��y50~*Ѵ8F�h��4t�r��R��R)z7HF�z�����u-�7������������!�-�d���V?5D���H��
!D�R�B��j+Al��T�7u!���V4,���=4����jf�����c���V_`�<����,�(��ً�6� ������=���ݟ\#ճP���p̐bC��4��e��\j.|�*zL�v�t��X�+V˚��OU�IC��n��q�2�j�5��s��e}f���L�H�ĒL��A�rs�G��vz�8V����W��h���b�Ou�\����L�A7��,^��#���TO���U�$�6*%6?
������:��y�Y7)��8A�`N�.ꎟ�U�O۸������~tt�k
e�#�rv���e
7����(T娢�Q���Є���_�
JVb]��d?�&$X߀?G��`f���7���s�s�u{{~@õA��1�	�
����<�	��Ƃ٥1���*:�H�N��1�Mh��s���a7Y1a���7Ϥ]w��ϹSf�>���3�> �؁ˆ��~��;�>	w+E�A�٪!�~慔�Z.�Un!p�Q�[��2<!k�ߎ�w�9��Qc�K�J���yȇ��������#�W��G����E`_F�' ��;L�B"S�6��bS�9�>������DfBy�n2�=[�_PU�]P�9h��?g�/�*T��\Vݹ����c���2����Ʋ���DzC-�dž�����z2�-�����+o4���H�Xj]J��ˡV�k�l�q��UĞ%�zQ��.�� ���o��1���`����#fan~kDm<y��t� RN����*;�l�����(��E=�����ײ>�%���#~n��Ŀ^	_�J�>���cռKb�wq]�LS��5w�3�1KG4��c�PXeX�B6o���Яb��	5��hbg���%x�B����w	g��O�����W�(���Õҙf+̛�Ϩ��'U�&�#�����a���<���<d�Lm���*�Z��W�:�,�R�K?ݜ-ٶM��	YCll�д��%��4����ü.�'��x$�E�8��w�[������-��	-)��cs�zU�/ȯ=0L�V�W��b`eQ��X7S�7;y}�I��{ŭ"^swÈꪽ�T��l��6 �@�YC�'ʅ��>U,1���}��]�TL4��_<�0w:���@+ �`n��E�5�!4�[�93M'%��ND'Ʊ�T�>C�J�I־���$��y8�E������`�O��\?[�v���ɋJlu{��I��o��
�L4r�T��i�'3� ��F|`=���fb?gL���oB��?6��"c�v��el}��7��]�g�;$*��'
U��h�����^F��f���04���պA�
)��(�G�ƹ�~��T�Y���[�W��`�v?=ߤMgZ�k�j�0g�@�R�)q�"J�gW��UedNX�9)[��55~�15;�~"w�ܗ�b~;"��'�7d�_��]��^2�v�Mc탣��gϤ�{Cfq�x��r�j�f3�VK�
v��1�Վj~g�$���\)��@TTh1��(��ŗ�\T�4JJ��}�Cy.#'G����p��5��&���\���F�M՘�o�؍�]�}I����9}�4}{�<�W�^���� �g��௷/<��_���`�^�A3|���:ϐ�"$���*<�Qn�d��5RH���d���˵�;JȽ�vR��W���[HqRa'X>�{��!�$<�#�w�!�Mw��zÌ��9�^�CBP!�I���1!�$�C�I���%P��@�\�ύ��t&5<ɨ�[�g��[1�I�Mm�ؐ��I��<	�L�H�4��ё�^h�ʛ�x���,-f.�+`��KӅ0)W�S!Uv�+9�r#F���͑M�4T�z_ΛN[xs$�g�*M�k��7�و��<$�8̕�aj*�1�Z)��7Q����/M\|�=��
��ILAE
�1����!�Ė0�-�2U!=[}D�I�N����Wh-����y�Mx���)$o�8uuv��[E��P�@�8
Z/^Іy)Q�t�H͑'Cg;,��dJY�g�Q��*m�viY�U4n����M]d
��[pҏm�����ޟ�˰��օl�N���I|�Ol�����1A�H�%юm-0�1h���Ha>��Q*�0Y3P�wT���j�2	ɠ	�;"?����;4wq/�qy��7�,0�y��e������idB"'����o�����UY�ķ�ى�	n�����oX�X�no>���og}���"&m��q��u��Z_�����k��~i��o�gˤ�c=�YNՋ0�Ii^�o��'�}���´oO��ܿ8�
'���x ���v�#��*�����RĄK��h�Q��&}}�$�>LlL<~�����-2�^`�w@��$�d�o�N��Ҩ�e�N�^k������j
����c��^����L��8
<�&-'���	�Lf��0}�%X&
oBNWY���Eܬ��A(��
�q:��U�#ˌf�"�\�2���mZIH�Z��v�ӁQ�2�Ԭ�s�jO)fm���=[�ҕ�=���\�ع
H���?��:	���M���{�4*ɪ��Vl�����
�S6aݖ��Iŝ)#���ꉁ�J:ޣC�?�!gy	�5<��'��kYU�e85�<gӬ6��<$�q�7RZ��TH��lb����	�>0<2�1�BU� /�4k����Y�Dڿl��&Z�_�ȵ�+j,���{��5CR�R;����3�i�!�}|�lNZ�D��5w ��BJ�0p�E�*1u��B��]��.h����0�E�j|@�d��B�<�����(80�����t#L{^~o�'��uy���t|���
��+��S6]�u�c��g(��yd4���k"�E9�2r�ť������8�ڇ2	yG�u�gìW��pkv!:k�*ͼq2�O^��YS�u�����#)�[Hƣ��_w���#�J9�)乃HjX�)[��(�4��n
H�Fo�JHɶ��Y\
M�sQ�)�H�'d�7H�\�7�����Vo6Q�h��Gљ?�k�Se���W;�.�V";Ӣ�[��]�e[�i��V�3���P�|��2�1�I���y5&h^}�D�Ju@��\��~JhW:ZK�ѡ>���z ��Z7_U��X��rDo����g����M:�/����
̊;Un��X/4��"ߚw�;�{��Ʊ�1gMp�/��Ú����mO��u
“3PO��k��XH� ־$X\�ZH�
�]��@��P�+\�Fɖ�x�Pw!�u؋9G]�0������n0k����tN0�an�Y����r	�Ԅ~?A��p� i�ۓ�J=�Y�B}�H�2�&H����Z#Z�:��"�]��o]&�"z�����S��¡�.
}�a�(��@�_��uu���cX����9JO��c��#z{ݦ�`@�A���ۧ������ugA�$s�Q��]v��I�PUʞ�B�H1��)5�Gb�T��tG*/e��pGo��xǶzk�s-�s
���ˬ��۝���-�����?��#m&�;�k9�?3YS�*|U���TPtH�PX!gCKe-
�[���rB�� ��t5o�hWKW��"3܁20���SN�3�=��q5*Q���6��Y�97��9}��� ��ғ7�>���dž�A�bG��~`�E�

rW@IĆ�2��6j����K�qB��fz!����Y佖�remʩ�l5lm#���.=�� k~QM�A�;(3��,շ6��zƔD�)[��f#|�m0}�a�G��ƽ��#<���}jeK���[S�ɻ�y)�!a.$ZN��3t���HbȗY�i�J@�QZ�u#�K��r��}>f9LH�M�:Q/�����U�=�$�����t�K��Pʎ���c.r�r�Dg�d3Uy�;�k�{��FI�U�K�r�̏�(>*ym���Oj�bK�;��/��u%\�!ę*wTS�z��{$��풊O �8�G�F�BQ�T���� -�K���H�|L70�7�Q|Dק��S�H��6v���#��=%_� "��*K�!�x]v�Ԉ���;9����j�zNv��\�/�Eߵ��/=���u��	���G��QcHl‰�2Ay������9d� ����i�2TŒ���>�ZU�P/X��ۓۄdk��v[�6=����CJN�-l�j��
U��(��XYů�Jos�8�fKV
�'{kD��Cd;��K�9sOo@g�N�6�%�;"6����0��ڕ�E=��y�I�l>@��I��=j��5Jr|�Tբ���b��C��N~|0x�C��ȅ���$���'9O"M)��˘��K��n$�pJ���Z<�L��!A�c�.^��g5������U/��LOc��l0@��#�l���B‘>QXĄ�
����u�D:"�\�J�C%���܋It MpX���灄����ʭ,%��>-�qh�f�K��p\`��n�3���`Jb���K�h�,:���g�25`�e*�5;�3�-�©�
���(�z�E~���P��*�����卬L��mc��	�}�F� ����1�Ab~4A��P�\���hdx6ԮG^^����0Jtk��FK��T�mͦ�vK�������W�1�����?��o��x���W	ٳ���A�y�C��2y7�H���H#J�?L<6��8���ynO'�M8&����u1��`�&�a��>����M������x��j�è�G4 �Y!��%�7��|[}q_�C6H߃����<��
Uy7�@6�+3kO�Ne���5�3
���C;̽�_=����[3���
~���
�A�ٰ��?]0���1&�ə|&�͙��~h��M����o�P�*��`⒌	��T0u���d65Uʊ�חzwJ��T�zc��ы`,i"�Y+lU���pc�aE#�lp�k�Y.!���iٺ�G��*h�ܫ�k�(a�>l�q��N�ljlAs��*��Zi�((h���f������db�"��X�@°[?^-/��U*[���sur�]�M��5dV�if6q���օQ�r��B\�g�ZQ`����""ƬJ'���"j��]}2a\bI����F[�C��s��m�)��RŶ%�8`��O!�SR]K����`#�V�]y�c�[���g��e�^mt-OM�Mg݊�+�X
$�a�,EllǢ�7.j]i�)�!��5,�F��Y.�D�	ِ���7�P+x	i��,����+i�χN䋑^�[	�V!�����h�;$����c�b;s�m_�\s��=��иO�O�7�jeh_G��y�&P���6kg�h-��/���).!R���W�����ئۈXޚ��:N�1�]����V4e��HKM��Qv݈��$�1�RՑ��s�(ٹ\����[�j�e��-�ެ��}xN�mO��PD�B�?�t��-폅�\(2������*=�x��p������TT*�xZ�U�VR.�i�,Ghk(�"Ud2�
Jv`��t��U���m��.l.��ccY[���[T�+�.�R�xx�%m9)�nQʪ�ĦB]� }QV��u�Z6x%7$2]�Մ���1���	�l��j~X��$l$6��A����$�3��<���<7�H�,�g��ӾiW+˴�۠6ș�0�I�./i�˕�rÌ0�	��������XX��t�"�;g��{��� i=�sgB�-����ǭ5+e�Th�(w�L+�1ړ���
i��;��Qj6����ch95��pYV�jl�iV�œ҃j��Y�VDn�h���¢Y��ذ�aP���g���="#������b�$ZN��'5�U�8��]@��0}����K�(�dQ��*"L�h����J8��4:��Ik�Ū�V�L/^���-�V|�f{3t�JB��F5,ʹ��j��U��t�cl�������SS.Gg����r"	��)�p�8Db{��/c�tGr訢v��B-s�_�n`%�7�r�w�eY��+�D�5�
v�-��ml���kE�-�&!�dY�}�Ϧ4\�"�����5�[-���ėԜ�MvQ�A��O��:�H�|y���YT�@�ʻ��R�-q�����'@ϧ?̒P�^8�T�0Vw�z�F0��޻
�|K�K�P�'KRĔ;23y�BKZS�D���+:|�eC٬x��iJ�[��� �,��
���a�}����Ϻd6	;gCn�k�5��ʥO�E�9�6_��^��S���Yg;��(�3����g|��a(�n2�O�������@/�V���x/���@p,�v�q��b�ta���ӎQɋ��ӷ�!c�N�w7�c�pX����>�tq�it�&�ɓ�͔��#���q&�Y�8#iB����&�wG�T��ez���W�"\LqQ2@:�,&����+N�%[��uL�F4�WZi�:o /ѹ�0!�>E0��4�G��G*�'S�#TʣQ�+�U.���%V�#Uz�\��Xq�^.�Z�G��'Q�#S�*�k��U�S)�%�%UH����N��
bhy$m}PJ�m�/=�D��͘��ďyn�l�DjK|��˶�Ծ=�m�M�lcFF��8L�i���PR��H<��*G�lF��i����i�]/Vec�9O9�G�/.ص)�%¦�Y����¶�J�LI�Lq=�8_۶`�P�bqY�8o׼`�T �ZK��X��cS�C$�E&�%d��k˂r�iԼ�f�⼗M�ց6���HIxscG����m����\�y�L��{�
�#Ӷ�����R����E��Q��U����&�ԡ&��A���Lc���G��9n�u]Ԭ��7�Y��3~ I��0]39c$_/p�s��c#�_�CVԋ� ��6����){���Qys{�b��̅�;I_����PG�[u��j��-�
��` �\(�v���X@���z�&�z��z�UC�fCгv���zp�}��P�;��/�X�AD��H�1�;<�!�v�%X_ݼhfZ߇\���J�A��ַ}��d9��(�_
�2���˲�'lѵ�p��Fi��*�g��lWa]�v��֔�/C�$�
�X��J��[4}>�{�}]���HS}+�ЙcG�X9IǼ�`�d�ߘj��4����٤��I e,��i�)�TH�%�٦�r�HeT�ԑ�nAʼ)C�^�c�4"��N��N(S�n�j�#�-nr���ry)��SS��>����`���l8n(Ζ�����A
�w�x�D{��Q�)1u{��̊w��4�
u𸠕-J�bT�`Û��o��b_�N\�[Շ����CPȈ�2- 7`C9 ��i�h�#�)M�CT9`7ﻭpDqr���c��:@��qDx8v��J`聍�;y����Ky���;�Ĩ+�����
^.D���hz0���jĴu�R��ꝛ�$���N�����L;������kҲ��-_P�_��~�
���!�ܲ���2>�5���/��.Ctn}6���R��$}�K��4'z� ����X��_P���X�eɗԀ�Ӈ'^1����$���3��R��ɞ˩�;w�̳��T%�����S-a�Q��Fu��S)G,E|��� �xc��	`�C��=�M���d��[P iݎ�*�.�H�_$Q!� @M�rQ7?�Uf�e9�����*&���-+f=������ݻC���
�Ϧ7�8�(s�
N�7���gz1�2�8\Oc������X�7>��<��9gb3�Aw
#;���		
h�\�����v�[Yg�zA
TlV��lߠ�x9vzV����
�x��QiR�Ih ¬=*��a�N��'���T�UT�E��[v��^1�l���]�aq�6V��w[�h;֬��!~v��-?��8�X�8�'�D&�i�Rq�q���w�y4ч�f��;��W�P�w2ѵ⺩�R���S(Ze�+�\ƀ����������9�RZ��Yt}��=\D$�� �/�+���=lF���Kn0�W���(5�sT"R��5���
m�Nt��j�Ϻ�^�����)kJ�:}�I�!2�}�V	��UiNj+3�¿VE��&�%Ӷʘ+,�p^��q㖋����r+t��;z��r���eIא�g�M�������uz��=���r�D3�[F]��,]��)'M�\Y�'�1���8��^}B��Dg�uх������R�;�J�m1�+J6�p�φE�6?^7�&N�ҵ>܂�k��߾��Wn��~$�V�_;U��m4������:Y/B�$8���M�"DΏ�n��]�G��	��E
����b��䓃V��VI$^6A�C�y�qR�#��n%��_�{yj��W�D�
u!�^5L%��2���<H���N����SݠH�en~+k�����-����aj� @�?o�U0t24w2t��/�t�� J�I�	B0�X�C8�)Pva3��	!�|e����Fᧂn���I%�~�;M�?r����#�i���K������n��z���5��{�0� �����Z
D��~4Ъ VA�;�z:OAA���~T�����ŀ���+lߓ�����ʒm9�<���U9�O�kկMC�ʶ�S��Z��f�J���*-�-]X��K0�IK��XZ���7K7��+���`-��%���?V	ׯM��cp?ڻW�lR�9���'�X`�r��S�J�X�Ƕo��Z�K�����.[ ����:�����:�	<�E�E�ŴU6]t]�#��f
F�6�t*W��	��,j��'irX�T��mƜl;�Z5f�{��ŏjGycAcEa�"O�u=�	���u�M����Nm'!P7������J�FB�2�ԣ�ě�&�;���K��l[߮qw�c�=Ve�b���@���� bx��u5����'�A��s�� G�K�/h�h��&�/X3���̇�=/�ٽKԼ����۾y\[�mr[������}�7}����CW�b��Gt�V?Y�?R�x1�>����c���&�M��Y���d(�sI�U0:i�%_�p�J��&Y�T�&_�xFiu[��⨣�3_���:�jn��I��z�7�;4
V����}4�پ�5>���'@���(�L�N�Ʀ�Ζv�v�.N���uR��K�Dk�N�/
�HE?!r������}���@2���8��[��������]Ґ$���D5�����0������d‹ޏ�`S�:҄�S� �Q�z��,�t�Yc��v��N���g~d|��6l�ݾ*x[m�.nV$��3c��c��.�CJ��f�T�u�yN�9x���\�𞵖��*��_��/����aA�f�Z�tO�C����[<��*�K�F�T�7o�e�k���$U$!�C{�X[A�G$-��
�C�wϒ�yzWv�.f�-��p�5�۶�g��p�}� �u����K�6��g������eC�`I�Ð�MO'�T�'�@%�y��j�^M\�W��u��b�>��8�]���wN��8�i�ژ &P����V�H��7L�H�H=�=�`91�"��R a��rc�CFP�M�At/,�xm��a��������+��ߠ{A�����TÏ�t'��K���-�̚�4)�÷�3�7�5~Hb	���M���
?~�%��nb���5�0�0����aW���Y���e��2���S�>�%	���̏�υ�M&錬��g�M6���*?�(�NYH�$TH[o%a�4�Vt�x˅q66�~��-�>wt�1�P���;���Nq��KR��Ä�t���k����ro��W�q�ޒ?��b-���)&�I�a��8���D�釈���bL���	�N�YM9�<[�3�H�ɬ�pt����/����c'A!�N3��x7���� >`ş�p�P�Ȥb�ɒ�U����.<E��Z~ҡZ�@T�]����R����_b��/�\�͆٪(.��p",�4�"��S��W�����g-Jn��&5��-O']�ѐ�M�0���P�ٖ�k�N�[K.�3XL"�,�>_z�h�T��x1۱�D�����"�n8��l�&&6>�j�JA�Hyh)�SQ���6�v��Ϩ�+�^3">9�\��A�u�NU)��7lF�ܦ���K\��\	�YQ�"y.U
3<�Q:3Wa.��
���/3]�j�N��F}-�m�P���N�iq�=R3�2T)�.�T�+k��T��c/d2�HJ6�k�7�l3���Z����'<�P�w��?5����!8�!92�9*c�;L���x��g�v�I�#�VF���4���=�	".UT��V�>���&�l�2R`�_���N��b���_���6�Y�8X(Hd���t4�#�T�s+���+�@a�F���9���)i��^.��"L#�>�<����R[e}�n�O=buk�/D�S@	-]�6�TJt%�H�sb����y�b?����,�B��U���;^�.�uɰ����:#+H�?�H����0:[x�Nj��7�D��)�A���ފ�*��B2BA[9f՛Ȃ*>�!���)_�H���%ӡ�B���'K잨3h.6�� \aM1��|��r�������K+�wn�E�^�j���<�g3��V�l���
���o�^�q��e�V���o+�����3[��(�	�BԷ��Op��3^�`�:[�t8崴ž_N�9.r���S/uG�s����7��k~����e�+��i��u8ڟ�rx��kɷu��yA��H�t��:�C:�	0*�bB���٭�>��%��(�<�q-���B>銘iz����5䵆��rs8�f��UcJ�M#�F�1��F���4�A��𖱠��²�8錉{K(;�6���nE�)Cj4�9hJ���$\h�y�OE��+�㣢�+Q��s���rF�E��.��!�~ �f��DŽ�*�#������
�6[Gj
VD�4��ĺ
j`�l���j�6�p�
�V�n+u��ç4�s�AV�3�\�w�.����-
�d��r�e2�a�G�t�~��$�vZ$SܬDW���M}�f�ag+�/(ѳ���ʒ��!�l�U�Iyf$:���?�^K��Mm���PU[g$u?54���|��#�j
�%�,�X���
�*�q�-@����R�r}ߌ�8ܭ���m���p�Y��n�S��<��/�}(���QX}�v<av��!��C�4�R	�S�PO�{��ؤ0{�?r�Ƣ�c�q�\�k
������|A�����4:�V,��O]�����
�,����V��r�W��n���K1����N�veX�2Vj���UL���-L��Y��+�#h�p��k	Rdj�Һ�,�#����ܷ�[�[ش�Id��ZVi�O{�`3�9�#��#�)����x
�1,�m4�X[g(`ݰ�_�yk���"O��&۳���T���)8���a��j��dw��7X���%�@%}jK���/q�ry)�n]۠��b�j�!"���W�} G�nת�E��9ثyX�[�>�组�X(��,4~�{֚���a���d�.�@;���� �_!�WPqL��Nc�􆁃�
��ƿ
[��Qr�l�"֡L�ʓ�P�uHתC�VJ[��Ƶ�w�
�Y�v��uu��/P1��ݶ���A�X"����E^�ְ	�GI���s6�CV��}�vG��P�V�k�j:�%{���^����sp�e6��c��n�u�E:�Ԋ�-s�e�ؕ�uZ/��i��H��8QF�6�-�D�EJq.��{����h�g�2�-H�o�TJl���#�D�`�����O���Q��ґϳ�ޢ�ކc��^KC/���+�&Db�=�'��0x���7�r9w:��;�;�}��4�y&R��
�1QaSΥ�y�P6�o�X�BN��C��h��c�����+z���w�ߕC�F�K�'��n/�|ɛ |�)�5���p�d� ����hR$T��^R��>�%j���׎��gΐ�J�n��0��׬�c�Aݢ�.�e��L��9�9�!��>�E�؊��-z/�f��|�hPA���V�s����j<A��p$rF�����=vf���[�����/DO�u�����	o��7��Gp��mwj���lF�A�{����s{��uS���ث��x�I���BxQ��$'T�L�3��ugs�����d�՘���
��͍�M�.M�L��_J$F@�d \Q.�r��>����^�� C�e�;3A#�����bC$�(�(ɴ+���=k�^
�yf��Oh�S ���
yIQV��$�<.?�Kw	my�^��RYN7��"+'��B�jz��!Jul�XS�?�ג�O�n�5��?���]<m��M[e$E?:��E�()33+�җ�'2#�*߀��WP�m043w�R����́�����Rgwu��a-�)�o���\�>@8�(W�^qpz�"B��6��@�`���5��cxV���/��vx��0b<�N?2X�fy�q�I�$9�“W�f���9�WM��D%X΃9�n���w�L���ƪ�k�Ru��dr��jIC�~���|�h�6�EpՆuX�tE��3�x��e��sf=�	j)�$
cu��1t��������Y�~ƺ-���V6���ʁK�*�W�����Jm,t.���
����[e��T�rŸ#�椆���茔H�Y��pf���T�ءɽ�9�c�AH���E���u���i�N�v�G#f�n��f�?{:F���5f]�Vi�&�*5H����G�C|�� �_���3���p�}+�d���u��/��J��r#.�"G������n�+�0o�׏��b��)z�qd�(�`���d�Z��҈I@�8C�|Am��z��2���U�����1���%���>�ެ_nt�`�O��`����_W4�ulFG>�tA>��{�<z��Hm�$��áBNJn������Ѕ�&�Ɔخ��[�a����/a�ܥ�}�>{��� �f	N�H�F|�dsDH��E%�,T#R�d!�5_ŊD�<r�k4Ј�R�7�8�}CUR�f����Gl����)7�^�bhdc*lo�jk��[�8��Hd/��NKKB��	=
*��(U�@ʓF��4j�S��tQ����(�c�Q4��O�f0{������51U��q���uQ�I�-��<�,��UxT��Ȧ�?ȏ��GV}�]\�#{�}i�vΆ��9/�nl�y���9���3OYJpaq3Bg?�}?ˢ�D���ی�_�
�t�X��D����MLj�W��p�-��%�j���رfd�c�\����ƶm�NǶ���Ķ�۶�tl۶�vl'�;���;3��߽��q>U��S�^���^+��*-�B�2��aW):eʂ9K-���)˩W�~�ְ�
��I[,z=c���+uW̐���[,���֏3����?R}�h^خ�=t6D���
ͩ���0͊7T�(p5�~�j	PCl��hp�{X�dt; R~�7�a����wyk)x]@MWj�����Օ�e2�"�z0���֫�]�o�Z���)E/�$CS$�DcQ���
��f0d�n�=����|�H�����8*�6[������ma�/J��o��<��(݌$�@�p�9�
u�pu�d���A���V'���~p44��4G�2���5^g���ϗ�;��lte��{�!��
��hzh��%��!�xnI'EBڟ�/�~�S���%�T}���y�";ra���:>M�/!I|��m8f,Ǎ6� ���v�0u�1�V�d��ۡ]{��O�4[�w��L��0l���\|5[^x�_%(�N5��›ҏX��UD��f:�Ǝ����}�	�I�0}^?�F�R��f���-�~čA�j�dF���}�B��e���?��?k	[�q�v�I�肉��4!���[�Yo�λ�&�КdP�֩P�P�!DbGC�#�@��W@K��`1��U��!w8�<�fG��o�R�b J3݊��2�n=Q�b@����Ĝ�@_��8sRVA��J\�
”�lH#��^��� �H�p�i�d��;�~r��_��m@7��"}�.{�ao}�JX��D�Y�������)Q�w�D�4Ϝ�]1�2mR��0<ANK~�ZAʭ�[INjS��'�dgڬm	×=k^#>����c�xL6F�^G�O?K�n��%�x6>��<��_���?^�����sCvB�����"Q�����GN�
�ૂ!��&ڰ��5�h	�:z=�Џ�&�B��A$e�����7�<��H$��l�3������`xĎ��|��;���&�����N���߿�6�b�t�vb�Q�c�ԠeG��hO�=��-}c��)}��L��{;
��
�� �N�^#�Nz槆��zDG<?�ߏk�Qp/I�f&˕�x��9=�G�E�tiGY�����J������E0V�4�|�o
+#�p
�q��m&�߻4��0���e\�I^o)��0����
�ƹz���W,��UY�7��W�%��B�����	�۰'���=���`d]�iJ���k�5���Z�T�|R/�y͡tI���$>�a�9@�㮝�2��	m[w~0M��x�����J渝�M��F�#%��qR�
��cW��?��tf��i��!J�NK�U��i��~�B����XI��G=r�/�Çt_�`���}�E�N���*�i{I�j�Yw�
Y�	F]0���5b�a��i�� ���g>��,��kLC��TZ�D��DDB�om=p���cz7Dq%*�����P��j:2َɈ;KG�d�};�����&N򖳌d2�AN��Z��[w�A�VR� CT��#�$[[Y|�}L4T�K��"L�9
��͎�}�ԇ�+��}}���֙i��#��4W�y����E�11�������"���d?�q�F;f�3cZ���I�3E��:��E�%$A�<@wL��
\�W'�E}�k�xșՊ~��,N���s����1"nWZ��2:~c�1��p��˶�I�8�!�ۆ��	:k���I;G_>���]�������q~�6v�ݲt�g%��v H�1�u�ﲝ�XM��b�ŦB�-�3G�n�^�R$�I�J�*8�cA�fb?����P�g@���;�go	���e�Ƌr�3�A�%��z�m���]�͌-��k�˴0F5H5G�� 7��X�D}�IeZOM����1�K�x�s<���E����o���uN��s�mms�����&vƓ��GT�m�i�٦£�j�w8���xj�ܰ�ֹ��6dIAieEa�ʒ�8���y�[���Sc�w=��v���E~R�`��P�(֯+�#���0Nj��
M����'`O�:��&�s]�!�%��f�@��>(]���ma(����N��6�g2��^�(��х���X���^ΤdL�Ŗ�(�e
�/���L���q�����(�!&礡vM�t\펖���?�d����!<d�O�]<�8�T��e?��^�ڽvv,ݣ`4�?�J
N3"h�I]H���Xe�: �^зб��[����Ί�����,@��p�㸼o�2}��z_h�XQ��~Ӽ7��@��0S�E��p����A(zR0�W�A����r[�E�D���_�p�u�q��y��z�z2��?� �l�k�B�i��@�h

�Ҍ�����M��O����m�h�E���]O�;���_�o�j ����Y����h�<���в�����*��b�B�hY���� �a�aQ0b������A����A�<#"X�-�2<��Y�i�3��k_Tbi���n���ԗKrTⷛp��כ�	�>�"jt��u���g�w-��OˍE��.��y�tqu4
Q���+�Y=9���X�b͈^���"kY#���v�c����ϋɤT]/�w�A��>�"�7q ��gR''�I`Q��W���F��f��ت�7�v�6��>1�3!�Ϯ�N�v<Uݖ��5����J|?.����%�@�1;._v5�d��ZHT��G@�o&=��45S�J,��� m��آ:i�*�%�|!S�E������ܺ���J�ko�4
�-�B�j~�\��q��X6$�<��*�IJ2ra�c�k�#��Rc�g`yv�l�nK����	p(1X;B[?�j�?������]����X�a{0ɣ��_1�w%�N���a�1��B�� Y���X�rl�Ø�]'�s3c�&��_x�%}�.�a�F"g[N��hb�v5���|�_��^�x
O��8Q�Ɋ
�L��S����y�T�g�A�	k&V�|�ȺSхF[�����*ǟQ��VCWp2�:L(��L`���нS�
����0YJp5���Ðb�Fʾ��.c��P�ᘏc؃�v�c�N��,��a�]H[p�h,��{m��N�*��G��`:������*()���S��9Ep���|��H���ů˪����Q���ͬ�G��ʖ��[{�w!��[�H����ll!�1���/��dui��~��!&g�ꖛ0U�..�U!�s{t���E%M�K�O����t=&Z��r��0]�&xaA�ꛮ�o	h�����;����;']
�v��'�&�F�fUW��R&�衹r� ԋ�<.Y�ʮ�kN���m��ɷ�j<Cu�6��"�v` G�1��B��Q�AgQ�� �b�R�X�G�q$�Z��gI�U���y�v�D�o`�=�{������3�b�9š�d�!��8�yGoD����[uA~ :^=g�l	�Q��
����X�d����L(v��}a��uAc����1��.C����:�R��S��@Y�a�
]Q���v�i?��)���%
�48��UF�W\��A	cRA"(g�k��Ipi���(g�0��^ڞ��j��^�w�ʉ���\wd+�H�J�������k�_��o��v��T���@��o���`��Ӥ�=�S<m*�+7"��8ww��������W�D�[��{��`��oZ��]HE7A�u���1�7I���!b1s7�9�<.X�X8>`
V��G�~`��#g��n����{>�G��{����x�9��{���hzIc+�ŵ��l� o�t���==�ExYVR^�2��J�#�]G]A�oM{��SRQ��x�7��ﲎ7����?�jC�-M��1�a�Ӷ8�"�#B����=�

D��Jw�J����vΈ_�k�68�f�����u3�%n,4��z(j�1���_|#I+�s���z̙N�;@�P��U�K���K�f7"�Mx"�ja�6�E�3�Q��U�
M�M�cʒ2#::��cӊ�Swq���b�N�Yg��"D��*r)���V��>�e�Q�Dl3b�?��
~VD9�ȸ	�fo�2�8�]��"��\�
��c�mZ�+N�S&�FgB���age/��'A���X����9�єF��b)Dr`�ư\CD�3R�P�	]����Q>����	���T��Aح�*f�A������Ayl�q�Ƨ�Rm43��G��#W��V��-Q7b���Y���{��`�E�h{go�B`|�x�l���f�js��Q��鏟��q$�ݶ�H$�4�뜲%P�����Y�v�7v�x�kK���I�kr�
�H9,]�UV��^��p�MQ���.�
�Y.|ܮq�o��!��2({�\��tU#nLx��wCٶ��t��o���ˎ�N�+o���g��\:'�I��_��l鈨J���D僲�]���p&#�~x�
47�N�����W�;��ܨ��e��f�;�	�T�A�!�t�l�R���o��6&aG��EN'��!�K�Sȁv.��s�a���Ǔ����F����&����v;.�3O�[�d=߶�{ڇ�5vCPF��F�[s�b�,�`9��t��n:5�7R�d������J'XQ;����d�����,j���o���}�t�{�3�>7�</(�]ƨr>�$=:�BR��qE�&Ep��r�I���s�⭸s+I���ʠ����J�6_g�ޜB��Z/�D�<5)��-���؇+
�4ƒ��b��7n���c�R��B����ssH$6ɋ����p``vP^��F>V�9kX��Z�,/7�/�p�ҎrB�N��k�,��V9ڈ֯_�:�����o^1�5��DD�PZJ�V�~e�&B��ý�}W��©�#ms��6G��K&�O�=��:./,�n��R���(��E��`��Qtu���Ֆ��76�-�a�ʗ}�zD�_��0���Jx��~~� ��0�+o��k��8�/��m��	]�%M"�+�T���h>�ZK00� �R�Õb&�rV�oU'@dg�c�ߍ~�jؠP@�6<�Jt�~��}��u~��{���CDD��Pu�ӆ�d�`F4:I����K�"=d�T��s��$Ű݀��#Q:�FFolGY}:7�߂�I��'�8:#��
�8�]U���6��5L���H3�kE����5Tn�õ#iSN���f��d5b[ne���4���k����G�g�i����iJ�]&]�y�h��+��i��QP�A�`�����(���8�F[c4��ʬ�ԣ�������n��סn���x��)xE,�}:�4�lL��͖�s\�w��s��YU�
��֑$���d]��K���j+��t�����xkr
1���2W�����?�����W�sV\���萺�5|:w��K���2#0n�@T�38�3ma;��S��u2L9>�ѳ�ڪ+�4�#���*�Fg4��Ǹ�ֻ�KŔ�FLg�*{�"�4DF�Y6��x�t�.�R�Cg`�Zſi�*L�W��tJ�X�X�j%P��H7(�a���V9|�|��F�7��0qt���5���T��ۡ0��(SӲ�ͬ-z���x�Ѻx?C�ʂo:|&�7�Ŵ���Ѿ�6h�^�a�Nö�T��%	���g���dkoޔc�9�rی![}��G�����	[�T�����EK�"i/�6$��x��9r��Y�t��z���"�*��8��vz��M@3�m�E��P���`%>k�-�%�[�����/J��J��_���!?3��VjA.�-�7�?�@��WA�8y���S`L���J4@D���C\M��4���>_�h����b	n�kN$�3�u�i��V�77a( r@T�I
`���W�c�5��8�n�Rj�P�����)&)�#�E[�����˷��.N�o`��pm�k'����ۊ�^𩖗h[[�
1H�8bX�n�Lh��&}���B�A!�x�n�@�����AH�oD���n19�ȸ��?��[�qR�w����!5�YrxF>�HԹ����D�tn/'K����姱4�WA���6�Z��[{N��*�({�{g*��ρʏ�U ��onE=!���x<��������3��%�bw�����W�(P��d��������v�av
I�G@}~<�i|���K�X�R/��ƭn��G��ǐ_B��ީ>���_� �en�ǿ�<Q�k'����r����W����������I`pؙ��D��O��7=��Kˌy'��2��b�f&�EpGi�T�!�:LSZ�	y��� h�S��٤|v�r�d��ъ-�id�T�G�ES���q�(þ��@M�a6B
���3��	��h;�	FB����.�E�n����Ә��NDw�*��l�
�s3pP�Y>w�]�<坖�zƕG]Ϳ��Mq�G��,z���E�5<*��-+k�}%]@�����B�?D�jF�pg~���F#���5U�'�� �!����3TI�نSm����|�L�8�<��]�q�
��ӎh�%�Ჶ��
�Mɟ<��d��4w�p�����?<���X(� �=d��!��s���$�ԣL�!�`sF��&�Cb��@"�� 2G��U���K�F�D$�]#����\��O�ix�+��;����T/u+u�E���H^����Pc�W_������W�j莪F|XI�ہ���U[�{���)偺[b���IGp�Ϊ�9����
+���בID��\E��Ĵ>4iڹ��Ҥ�M�q���cϻ��o� Tj�|I
��фH�,^ӑ`��^P�5T��X�iCd����ׇ>B�O��.^�d|]�8�9����5�T�M�P��7VI�'�h�����l]���AeR�t&vR�fo���8	�&|Pҷ}0q��$��tr�B�f�_��0:$����V{��.�K�y�C1�25n�5���d1y��rs,�3���}C���^��ɤ���:R<�|�O���q�x
�si�1����3��ߪ�����?]̨u��?�'KO�d�Ƀ��M����/�ģ��%�0�{}0
;q%��x��?KG��E`��0[�$z��݊�����ң@��s���Kx��c���
�'{�������xɡ�&
%L�.i�V��F�iҦ"&z�;r!>�\F+��q���p�e[��{�U���ӊ=H;���	��.�dn2U.�'�ɼ���pq[��٬��/r0(���Ο|]
m���4�nɆ�ggY��'�>u:�u�I^cg�=� ���B<�-(�m�d�2���x{����j�~Zh}�s}����f*�}D"q�J�a��hR�`�̲�]T�oO8^U6��{�#�R��^1��'�)�J�F�Z�&�LS��R�%Ga�"�U��Q)�[Ȓy��{��e�v�X���#�r�m|ZA@n���[jp���q�R��<`�/X���9ܓK�46�Eٳ��'MH0�+�Kߺ�~�.X��͵��a �"!bp
ӫm���5�(�W,��'W���5���r�]�gaÎ��_bb�r�(.zE�E�Max�{���wŃX��4'�C�@A0]*����'�r[�A�)���t�D����.��ƍ�V��\X���s�vg��
�����%�u�W��!za�1�q����ՙ��j�K-�en6Ёl
�Mq���gn�&�y��˫��n��,&WA�D�U*��v�d-��(8�?2p�6G���1�F["V�R��Iz�Y�����@X_�U�1%T�$ߢ1�-cD}��`Uj�.Q�Y(H$H�e|�w��K�-�+��ۘ��U�̌\m\���H0562���mK=�
q�O�fr	����j�2���b1,w)��c@_�چL&6ԚN�,`�\���@�.(�.t�ev�[I�]!�t
�9�]&��%���K�����U�9H�^L-�p_(���M���5]��e�|�H%N]��=v�c��e���Q��ޒf�L��]����l����[�u�����O)<��!UO�b
ɣ���lҨ��u�'���Z���1��c7K��?�{Cy@å���t�VׅmNA�QA�b��+�|���惞��=��D7�|�s��_���g�w����bJ|�`CV�K6A�N�KFzĕ����>=�i�B���Ϛ��1��P�3V�P�q��䷚��C>4�(�p�T�����fo���"�6�7�$.����Ƒ‚�M�H$�_M��1\�Ham,�=�8ltQX�i+[*����զ�+��ش�:L)������^�̩���iB��x�,�A$~qU~^�	4-��E���I<��6}��
�	.g�K��t?��u��o�Q���Wܔ�j{��b<^�fSپ!��s�%p��Y=�[�b�c@���b��n��B=�2�B0y���Dpn����5������9�5��r
��*g�w��h�I��;��X!�O;�<�o$ߋ>�A_lo�x%��@t�)��?`."��j�+�X�0Ƚ�P��]ؖ�,:���b�&����C�E1\��e\8��:)L���Ձ�[Ő@'�!
�A|#D�i� �˺�ڜ��Gk�GHA&[
����R�5gWY?��`���
s1%�H�إA֥T�O�2�<�M��Ϲ�`w�r���|w�UHF/A��Pgtl�U�����������P=b�B�Ei>u�Bh�J�?���/^$X���/`e�8;��
$u�%a��˨1�!�@AA@�����3����B��9�?t�d�:��N-Q�|�2txcЊԢ&�t� ��-��A�:��w,t4p�^)RCcP(������Ö�T�*�0��bl#�~"�NU�6V�/�.ld2��������^Ҵ�b�{��C5Ƣ.�Ȅt?+6��`
�/	�eN�4�L�����ڦF�z���Y�9?-��"1{��	*i��A�fǧ$iN��٭nj��jVK��65�'�ϧ���M���uOS��3\.�����@C�I�
4jn�9��{8�$t.��-���芷�[z�lH��X>�ZKe�����
FvF�<����CN!_
Y<n�^y��1
^ҪA� ��Lp]���e��ܗT[��K렆�ephȽb�f-T�2p]���oS��ߎ���b#�!ɖ��5]��T�Uć$�$�1�YlnvT�5	�X.BF�)E_��C>�����4fp#��N�ĺ5wLj����X֒�=�Κ��F�H�-����\ge����K�T����e+.d�=�?��
�u˷�L���'�2���Ĉ\߷���L�ܴ(`�ba,�ȵP� �իp�G~~�.W*��Q������fl�ð�lm����16�7��	�=�Y��$ֆ3B=��j�6��bϞU=�	Xۼ�ߌ��vΤ!h���%^�_q'��1En�}ƣ����#��Q�0$��ZN*�9`6��I}|��:W]6�����:����֫��G�	�)Z��D��#4"�Ո[�Je�}�wl�- �� ���ֺ��@�%3�;��{:���K���_�JI1��M�_ٞ�Pvʝ��P��Pm\��_�h���7��ΐ�_���������?�%kZ��k�)֏�j��̆YD�&�H�yGZ蕓�
ӁJ\ƌ�h��Vb?��&�Х�_��YR��.b+|���dfͨ�o�g���ߞ�z�@w)��P��QRX���Q�%�  ��[Rݖ�<��[�,���N�;	���
ZC$0W46�ك@��v
x{�9w�z��
Cgcm��F+Y��i` &,M�j!��*5Iu\Ƌ3��B�d��sPO�sD�h�l��4^�Tul�D���%7��m<�&!�db.�R��n�F�;�GQ������^���\���,.��=cA�0�X�#�����'�R��ܩzP��aGUS��ϣ���I4�{ݳkL�L�(����k%&?�p;0��k�R��b��3^p�
��d��٫�,�x�ivwu�מ����Y �>��64�O���>��!��)�73��cq�ÆW}���=bL�e
�:�*Y�Ҵ0>���R{2;Sƭ����gG�Oy�L�E�&�<�D+e�,^�/"@�C]E�&
�9�m��IѲ�EoB
��9W#�����c]�{"�^jv@@N�������w)�.#K�?.G��f��z�x�h�"7���w�6$>hN�m��#L�q�����-]�q.���cK���Q�����?�۷Μ		SI<�%�紧er��%��J�f�Ŵ�Z,��(��T����ؖ����}�*��n�1sӡGe�*��|��IdA��_r	�ݴxkh�U�%��H�֜�	��CV�|����=�T�:3�[���,�����Z�%�z�[��{�Is��vu�����}x����c�f�Qb�(�g��D��K+���A<q�R���k��|*�@{L�/��OYZb4�r�[
b1j�<h�W�pTU���\���{J-��=�+��c�6���ȩ�ækUA���_;3Ԋ[t���ٙL���լ�ks����;�`,��5�;ܱ�����>�%��S�%�DP242���^���-� ��vD��	x��\Gk�{!���9�+Fξ(
��"�2���:�����ʽ@�J��'C�/c�ֈ|��Ъh�=-Z�F����<U�DghB��[�X�x$��0i{���L�}��,Q��w�����q�r�B7��Q5��	'y?Ɓa���[N���qd%�4nK״��8#��b��෎�BS_:Y&\���g0�B�$
űӉL·~@Y�D��^����b�w��b �9t���;LE{S�?��8L���~a���ah�58.��7�e���=`4+}�ƭ-��Ob�K]i��6g�I��O�iy�yyb'���(�n)�D��!�
!�L��ڃ̨�la�g�T���5�0"�Y/5 �QK��˃�u+,��X^o\��٤N�����„ч��;����EH���+�������4T���`]��s�����H@������tv�`���8��.��Y��~Ѯ]�� L��zl.:@&���J�7r�u�i풫�B!�U��ް�cV<`N�.��[g9Z�;��a��i�i���x�E�6T������pTb=*�l0���A������b�S�9��P5���?��C�8c��Wp�"/��NjѬV��f��%V�9���dYp�ZØ�Sr�1w�p��j"��<am��m6@Ja�rZ����C�$�����7���h���T�x�:g�RU��v,��%�Lm��'q1b���{#%Q��m�FI���	Od#a ���d~Ua��*�ALѢXeӟk.��?1C�������z�w
�v�Gݴ"cmœW��ʃ�iv
>=u��1����03����J���\��Ћ ��f?�6_�zz��9�L5��/��5�/�N�fH�F��F�ѹ ^h9B`Mx�*;��|k�-��
��EX��
.��;���dܣ�ꇘ�Uc����o�1���z��v$�=�'S�|rr��x�2z�V��ES)gBn.��o��g����;��t3����ӻ�#u��ū<���y�/���e�kG�񚸠\gu��<�q߼&u�t�P�{Cb��:�	�wN�<w�`A@�0��Z��q�J�-�1V0�5-I�~I��{�Tà�Ih��F�V��� T�cY	L��3��g�9jn�S��F��b��ȧC�S�H����>��H��|���p���Z��6*{�~���n{z8i!��'��H.i������1HB^j��f�Xf'��M�R�l�,K���
��/9�9��x�}�W}OZ����<�)ҩ�{���t�`t�x�b��}��
8��G����\��X^poo9�V�g�FAb���~�U\Z
*�i�A7�^T����kH�Po�!Y}W�*��^o�ӢЛ�Ό��1;rdi���k?<^�-����l���3�|sqb
l��l����out�aC
���e%<�Q��Z��N]ۈ��
(����n�*k[D!y�RM���_I�Fov�{)��F]���f%����?h���AQ%߼BI�&Ci�X�0iYB���|1e
���@�#]�z��V���I����K������!��u�d��cu����*
�S/)MѠf3I��������2T�?~��J�&Ws��-����~��[=����4��l�b��t�jү}UR1�C���4�uB`��O�!$��!5}��m�e�u���uYY��f�l��xp١R��:��>AM����qm�ev��Ճe��	P��9���RZy��a�4�B���.xyo��1�Uؓ'�,�4�2�)�9�p����R���8km�x�Y��'әK$�q;�J��W	IN&a�^��!D����X'L��5�G5[ZZ���z���?�,�k'���E������2�6�y_�U��I+�a�9�|l����l��<Zn�WP��U~S�L��xu�@4j�ٚz�y1��0�'�
�,:��,9�6�얅�{��=焘�$7�8�1#6x"�#"�K(�C���Ǔl�;ȅ�SIrvFsm��Y !�U��J�wv?�٘7VF*T�b˚+�,_�]�T��unMm/��Z5�iJ(l1E�:�U�/�(�#��l
>SUj�3^�J��{���XeG�����8�k'k�.;Rm�#CZ�!�TY�
�U�ʇ��?�~��E���v:�!ĮځM6B�J��d�&pe\
�]���^��j�3n��7
��l^��'>��>�������S�Q��04b�b�m�=!�Ķ�y��X�����獽�Ld���t~��/���7���x<cw�"�Ҫ�-#���w��)��Ղ?�8��D�5�۬vت�qX9le�Q�~���(xX�co�8���%�$�E�A~9Rv�G�����T�s�^E���<qa��
�/+~�����+RY��L�B�k.$�~`"�"��t�!rB��D�[�cNH�Y�KbtBG�O�ub@D��(Q��'��lq{D*�2�C�V�#eW�₃�3���%����8�%�1�|����\��xk��Fs���֗�Q��
�Lr�ώ��60�7�+�ߙ��Y��݅8% ���L]��D#�PD'�'q�����U]��8<G
�W�o��`���
��w���=�?Y�qjε��YG���H<�L���.0/��CJVn�V�mX#�I�:֗�V�^7�U��mbh��AR�P>\��…/5֑����̱�lҪK��1tvf*��i��ӆCޫ�X�Кзu�Ip�ƽ.�'�2n8�M��.�#��~�2�S�%�k[��NH]�����-x�&�SV���9a'<+=Q�h<q��5Ix�?<�XFK�lWv?�~�� y��֑H�y�!!~��WF��4=	@N�z�o�a�s��x�<v�g��7�����XY���Pz/�W���"�w܇q4Nf�J)�6e
�KO�ԙ�:�����[bx���~b1���iyc;M��Kͺ��w�*�R����5`J'��
3���T@\\��K��ڳ��o�I
�Ur����zb%���"��J,A�w|�7$@Ŗd�S%��L�Da�����qA�/��h���}9�!���U���
#��+�«�ʔ��t���$��2\���DmP��O�o��j�_�^E�5���U7�5;;�D��Bb2`7,�ePS/F4Fk����a��PXC#(n����e+��L�#$,xc����	ʟ�͖�!<�_��fq]������ ^,Lϗ��|��uE���^�g~��R�U��'y�*G�d��	>��Y��ͮR@�*-��qlS����k]zr��8�F��CFUǑ��=ӆ�Ô��ƞ�0��3�j�r���n�����F+���/��ћ���/��n(}���H�]5�[�ݳ2{Xo��v
S���%��I]�NZ �������#�Js�	*u��@��~��~�Af����ѡ=����͹;��
�V���(mO��%�ot��S]?x���x�=~|����vл
gĊu/B�W���;�_<�;�R��_b/Wj��Y�Kb:\��<nu��h
i���[*���������F��6�7L\>q����*�;ZF6��Q���m�0?�����ݶx��Kd:�
~��)!���5xZ\��U�y4������������e���6�F?cSu�����K�:�h5D��&����P�����y��{���9���4�N����U�w�Z��Fr�A�"_�G��+��XgT@�ad�I��ڇ�t���ֈ�4�	h�Kn�{
��?���Te�EAO�7��
u�kT�
�W��g�`a�]�d�L��:G?�
r��1���y�5�x�����!��T�!sx0!2��këP�cr�hM�/���}!��C���7��!��]W<@N����dQB�m[h��/џ�����6"o TȝW����~�Z6s�U�Ql�p��P|�RkU\J��/���#���T<�i
��t�赬ˏ��#<ՙuKX-q�;�k+�Q.tJ%��[*d.�4B>��d��)�GJ0�$�@
ՎݧY�\Z]9�(�'�N&{c2�tY
X��h�T��F���;j����e2rӿG�W��8l��J�d:�fn	���������_���Lc�~AQ;��0o���y��b���g�<d�[�ʙ���ԏY�Ӡ���P��L���t,kk+(V<���5S�E��=+E�:`�C�6������3Nf^�\�4N��h�B��@�TF����� A���h�1_��ŧO�-�BS=��Xl>���S)ůT��+�Ѐ�=yGzz��0Ev,�-
쵍����s	"Fq�$qϵ��TQ��`	KA8�Ap��)Ѹ<+8�/Fg�c}T��u�j�F֓B�\z2���>q�ШI��ȏ�6�{�|=�թ,��̤%ذ��z��15�����5n�ܰ5���P�"b���(����tsYSO\pz�4�L1�ϵ�*YI_(a�/8f�!�6�גn��Ea�;��̛�=j8e�T���x���W�
w���rq�,�z�k�w��udI�$�2�Y۷��DO�Tm܍=4�Vq[&�Ԥ,X�&��?�k�۫�]{:�ѩ.��?�Л��n�8�𻚨�/|�QX�a�Np��	k+���~�}K����������x���k]��[�F�OP��
Y�\�GiZ0H���:�����E��H�@1�@Uvl��]�5�<1�:���›���Z�e�gs��Gh,ϴ�B�W;�o��.���
���C-͒W�-OS����+������m��NV�~� ��}�(�=w�x�ŧ����i�l��o�6O��0�*{��]���QLI��֫��
�K^�e?����N���I-��o��;5�'J���2�D,F�g8�����{u�2T��4�f�N<�}VT:U��E��'��5��=�3���Lk�׮����e�d#kz�͐ff@����oQ�X���&�j|�J��j�_V�`�VoIhI�t:��*�>�K��`��"6�,�0���x�������$e�#�v�1�d�r4�Ul���,��ո�-��b�:��Ⱦ-���mG`̣]n��*�u��e;k��d���u�C�	�5��LOY�G!����_V�ю����+&bRB����Q�:�8��H�N,�g��$v>������9�F�m>4�-7�}����G]f���K%#��(9���9@��~mA
`:_���8��L];�
~ᨗtS��Y���F-$��������p庹����HM_3�L!\Uj�[q��,}�E���Q�~$��C�'2-��Sh���U{'b�eG�vL��>r$���{��`���T]0�r��RЈ/\�Nʂ��/x�8�#��7=��Z
8ė8�#��{��?C^3��b�_��b����/x2��cvJ|b�%\9�����戍=�}��32rOf7/�*�3h~o��|��-�zO7�^�-5�cu�R�Gp�d���#D����1�W��Aѳ���6sX�����^!�0���-����Lt�+(�+�/��ρ��(=G'�(����+�`H��Z$AD�n��QQ
�	�2�6Z��5K�2*Q����4�s����w�t︴|<�x����%�ʩ������	��A�Y�׎��?�X0�[��6�o)I��_t�P\A�!@��.�� ���,�h�,����ww�eqwY�Y����{55��f^��7o����V����4X�vi*��/E�#IX�Wf�h1�@RL��ּr�l�2/Hй`򭸞����ْcBo9�&��D�#�nt�ġW���kja�˳�IDP�ő�I��Nw+��QN�\�̃j�Z�Z�8k��hr���9WA�[�|�M�<Y$��o�<5<�h��'��$�j�vu��ũ���(�ѝe�Z�w�4~�͟�k�M*���W�k���')k�p)Ԡg�G�D�\�Yz[�㏧8�#�gx.+�H������;�Μ��?���ݩ��,��P�o-��b#J��v�/H�t��l��Ë�?�!;H��ڰ�B�K 	Y�ѪUߺƩ����7�7��%��h�� ���k�FR��� ��~�!��Y%	��uŝѻJ�"Ce�-{h_�4��aaN�wSGٽ�]1��.8��-�G�&�8Eƞ��'�[w�o��w8õ��<�'���GH�S=e���"G@���+�o�k�#��"͏@zy0�謅���痘���jQ�[1�r
��0!H-�����f�`�M���Dܕ�Mxx�`hk~�]�jC�4=T��P�z�-hkm=�(��_�;����(1"�F&~����3kj?����*aBk���nzY��oz���y�����/�9�-_?��N��;�9$&�_^F��xm2��y���C�\� P���܄Vc#q�-s��͜v?Z���R��dU˙���.(��u��rM��I&�3���␚�y&B�m�wJu�uw��U��E������N{�?�����[xi�o�cK�b�V�k��
���X#5AC�Z�*�c�&�V���f����
t�x�z�"m:����d��Z���dU#�:�[⋹Pֲ�0Ž����-��F���K�vtZuO��6��9�c���#.�	^�\y�K�#GvȢZ[c
A��d�%��=�Q4��$��l��eMu���G7Ea~��B"��fg3G&�C�+�j%y�)_����A�[jZ扡���i���\*��Ld��zӞ;o���{���ˇXK�4k�[���%;.�
���Yɓd�#�5��I�I���qW�_|T̛��h�ǿ�[0�\JM]`P��ě�Yh�y��T�5�c������	��ke{=�AX3񧝤e�d%Y�8�4�>M!z�ٜT��e
lp,���?�撚`ݐB�[�������u��cjq�i^�Ok��P����m2~��ލh���b���C]�2|���Z�9o:UZ~a��-�d�l��!�~qZ��(Z�5^
U�+��O:tr*�%DW>c�Q�\`�#��.-��0m�)e�]�)��bҤ�n��"鶟l~�RRY^%c���p���y<?��~��Ma�J=�V�7z�z��
��la��{S�~�Px 0�X%�t+MwEz�%�ŧN�]C��|e�{�؄LÐ*�0Ve����܀$lQMtNF��A�JYsR�j�H=*��D�:U�� ��*��VB*J��L��B*MӂGb���!)�����Y��w%C�b��+9�G"�"�x���C|��wr�^+#ڪr�J����}Ƶ��H�X�������e��AS��Ze�F�v�u}�us��\
V�\')�	%��~W����1�	X
�Bui���+���1\��ߥ��O���Qj�����t/n��-ę�y��N,�$���,<��m�X���i��y��_��yY�و�>}����S�h�i�<C���m�lT∲RU�KT��}&yS���X J�`u��u����F��)13mb��o����ۄb�\ڥY�}�i�5N����x-II��>�E��~��\�`�:��&������?��r�^�z�ѷ��{���m\�{i��-������@��L�K�W��Y�ϴ�;P� MUU�gl�;�.�pN�Og��wq��q��_��P˿\�3Fh<�5mJ���Dci�n�tR��KOMp�ﶊP�ry����k�@cE����eJ}�K���j.���lh����C�4�bw��$��C��4S�w����Vk���hE�ZS�D�D��p�wR�nT�|'��!�|�}_��aC5V�
q��J������k���ޗ���ӂ�����d���iz:6�����cD���-�fr[p&���g�oa*�b�w�"G�.�#�k�`��Q��~��kd��F~6�n%��@~�
�IV�2lE5���U��'~�]@��HZ0��>�L�����[o�-�9�>$m'���z~�6�@F얖�`�Cͷ�Wj@Џ'�%�����?��8ț�c�[�xeK���rS�)@�����e�`{�P�M�^�0~��)G���1�)�WhksLI�T���oұ���y�
;��GUP�g�"-���DOaD�. �#�^��A�����ӈYC�O�r��k�A�;	����n)>,i��C�zՂPT�v�K�;ܝ�¦^�A17��ޞ+U��S���:>�V�΄�A��Ϻ�W��!�ʖ8/����<_�}�gF~��_(�9�e[�)fQ�a��>���+S�,�L�0-�mFo��A���&�P{U�I[��+G_�ŐҤ�Fn�m
��(�$��M�7
���g�HFd=�<Q�����FRڳ��i�d'P�avv�>�	�FxL��5�N
f�[� ����	e��r���U��I�hӁtH��,>�F+��~R�$tI54�PW
�wPWg5���O]�@Q>M�xuV"<��.�46)Z��L��~��zK=�.�=��ze�FU���+��4cYc��7�>Ĩ�bQ����;��5���>������1�"�E?�}�%]ȗU��\�^�gU�����î�+��%	t�O.������P=�e�g����c鑶�`��x[Ҡ�dG� �@'
ZMu!�bi��2�v%lܶ;�Y�w���gkF�É�o���	?�V��V�ش�|�8X�r���nF��q�⭕�I��#��3��V�m��m�Ns�,��06�|�t�Į�0��'��1t�
���n5�ך�B�Ղ�a1��h_H�)��N���w�B/)¸��%2���3
,�$�tM���¶�>%c�B�
u]�qr(��j�~%q��E�+Z���;��)���8�3�`�(	���`��C�&wɳ��n�0ͩ/:��}+ǹ�Ʊ�#���zj<'(8S�yC��]�@*���;$���XI���@��xu��@�Q��A>�$qd�?��
��ϸ�m%b�!���2�-�+�����l����Q1ͥ����?
�hw��WS��U�u#���^9o1��R��͹TX>y�!�T���X
����`5
	���-��I���x�F�X!�S6r+���(8��S���6L�[��K�S�:O���?�b_����|�#�
}r��<dh~BC���0����z�s4���q�66XQ�%)��@���}�����)��?ybY��4�����9]]����届�]dp�S�\f����\~�:w��XD�
S�Ւ,�[Y���2d\׉�Z��c����A��2�ܵ<�t���t�_)�-��^�..�>�H,"p��$��,������Ŕ������+���W�[hlϲ��3PP���l)����ݲ�Eꆺ��
�l�e�7(�i�[j���Ad�zE�ECʇ bo����(�f���
R#�����~�d0�pK��Nۅ��P�z��P�MӤ��_+�l�Y9nW�XQ��:K�"��Em�D

`@����~��!���y�ЎT�i%�ze����1���cT���{�����j��8Q��+8�^u'A񅵝z��0I]I�[i�e�Kڪ��W�ʏ�ڱɣW:�e�$��C3J�_����+�D�-A������W7�y�qJ3�3B�j�UUjo�������4a�t@e>����3��������I?�ӻ���25h����8!�@���L�'�%z��;|��n��0
�Zx�TZ�ea��+פ[cM�Z�yZ��[�,��}I��HӪw����=I�kgb��'�[�%cD�M�HĨ�8�?(z↻2ўY��Q(�r����bF�F��OO"���Bw�Bw�BwXBw�����?`p��e��_��w
���o��셿W������"�t�`�c�	n}�ن&c5����&V��,g�m�ʤ��;�W4	5]k1�|>wQ9FhJª�ǭ�����+�t��ޱ[��>��;��iݢ	�գ*�H�%�QAs�7J)�F�sf�~�T��L��[�'Bx̴�]�l�$B�~��bIf�~�Y{�@�2W{!֐��[l�*�Y�waG��)Αh��8=�5�b��Ǎ<U8����4)��v�0��=j��Q�?E��5~���kOKC��<�~=Hs��ō��!w2�[nrNX#򲥠�~(��X�7i����6��t!eP�é]�=�bi9n9����AiInI\Ho��Y]�� �DJ�v9�8���e�i� ;��_=���f,~:lz���ޝX�j��I�H�P��|c�E�AI���\���d��J��,�5saB�kI����{��d"���Y5���x�$��?�A;"FHg`"�dr^��R+Q��~S/���Q
��?#:�հ$F��2s���
{L��o�t33��R�RHu����Whp�u�NI80�ː��n�9�?©��_
Ü���T�VY�'��>����1�Nx۽��
�0�,�|�Ӻ�2��$d�5X*��7��N{�9��8L)�'��U��2S_C�ױ�RԳGv;�V�v.
F��$�W5o�j'�3�����`=��'�O�W�ӻU¬A�r�t�~���6@P#j_������e#�ܿ�ڶΛD��:Uʗ���5ݖ��:�T���ȱm��E��^�SG|_�����s�6����9ۉ7��ɬ��BP�IEi����]�����|���"������Y�
���IM�*�3<_�&����7���'�vl�\֦•=
r�ʃ�z���#��ioA�(r���H6K3�>B�8��5C�:pZ�� �f���Ȣ�wk�مʉ�׌[6�M=~uV��7�Vܳ�����ػM��p;8ü�3/ӾGC�PJǩZ�K^<�X����gCt�h]?{�U��3}v��Q9h�k󇩩:R�k�7���[7R2n[��[L��J�����m��
���l�i&�ٯW�Ϊ*�Dt7Bow��ؓa��N��E��J
����KHs|�W��F�!�Q��O��+�~�dW�ǿ��Qi�`$�� mL���㷴�ɬ�e<�Zs�zc�IMl<���0u�>��{[�鬌o����(p�M~�!���!�R���4k�Oh�bv��]��L�M��@��o�='�/R��O��@�>��G}�Iс�����ad��
�	��t8�)��u?cX�G��>Z�M����^�.ߦ�\��ő|���Y.%o����Yo�cc�n��tH����W�f��MiE��cx<����9ljGw=��٥�4����ެ2�D�׷�SSh�lu$���{�ML�$7���ۘ�ɷ�X4P��*E(#xW���(��v�G�����4��'7�����Bt�Mt-B
��(F�T��܌r���'�MG�
y]���z����kGz~@;9��XW�$�_#��>��_K`���l8vѨ���ӈ)JO���Պ�n��I�n$��Ȱ'm՚)��	$Q��V�5�$q�W/�Z�\�Ww9�/vM�5�V�ӟP��*�������)��L
XK�o�u�2�E����s7�oڪ����?7�q/�LY�uy1c|�:3��.���xֳ��@`�$�J7���T�d�j6�e�Q9�P䝀��;7a_"q�6=�6�+mf�Y���P�'��הW�Xd�U	���F�x#���/} A�GGI߫
<\gĦ�8m
V���[J�ܰ�X�ݜw�c2��bj�5����r�����ҟ�Oh�M2O�*�B����e��U�߫P�%��;���n�(������k��#���ƻ��
��W�ǻ���A�W��Y���~��og�_>e9 Y�be��^9l�;l�㫱2����2�߄Up����Vl���2�T����"CJ�'���){��}E�����c�KZ3�U��4��j����S]R[���\Iɦ`�?z��*!MAY��#�EXbI
"{��t�FV�V�%��z�j�$����D4iM�nn��l�Th�����Y�B��å�l1W�
Cx�W">��%���+�#BgF5���c<5Jy���C���,S��g{�C@�.&#�V�d�)���D�w�j��~P, c�M�OZ�b
����\j�N	�w�ZO�
G�'Hg.ZT뼅�΃��}�P�PD�Y6b��}f�^�k ��j�&�1:�:x A���}�,@Y�[�>N꾿��H��EF)n�ϫ�FqqxC�I�*� tT�M:�Ʊ��Q�=�c�/+A�"��w��".��*�u�E�nl#η�U`�U��ȇwd�yj�xf��O�p*X�L*���z�9B�ф���ȏ�A���f���I�#���ҌQA�
O8,��:����u�u�\��nS��1<��8<u��i�H�u�u�ݷKT�k�d�s�E��/�&�������6�r�O4}'^�	>��uj�5w"�\6�K6���2��R�j�lۮ;$�4�dȃ��k��}�c5��/�-op���\	��?��֐A#���t�|#���	qj��N��g<�	L�
��BN����Ӿ������'��f)��ꌺ�M�����e&�ʬ���{�J�i5�1�ψsAt�,n���Zz�B�V[)[�K{�)K,n݄��sFv����s*��&[˾z�N�ZS�%\�?�te3�x�4�*�c��$����RG�-S�w��g��9���A��FU�I��af�&>G���ǩ�u�,��>�R.؁�ԛ��9od;2��_s�@�mSw�y%���Ͷլj�����*��TCU`���EP�`���(h\d{`�B��:ԉC:��TU�{O�[����h73�f��$ņtz[�)���	W2#[��cC��ra��=�9"}�(�V 97bfH$�[���Y�>�k�S*����h*r�4��o���V�S��k"3B�x7�<�`�bP�\hD2]�7jUfR�@��D�J15���#�ۋ�؎���x���QX��S��n�|��5����3�Ka>J��h[e�WN���׃⛣G�db�w��{��q�xFY7ub�+�t�ŕ{+�qO�7܎�������#��?����9���y��I���{���H��:���_�D������t��lB5�BIeu��S,��{˼e��G&��O�gh��Ft?�,Z�vS���S�΂�?�=�ZFg`��w���2:�{�ܟp��X���_���˵����$�߼ɝ�����Y��`ي(�P���@Kj�:���ʭ�j���`�_�Bz�~	�ӕ�օ��\�$41_x�IJ�}���5%8��2.�#R|�`��7+ձ?�K0ل�4S��A�ݩ��Ai�������w5]wC�wW�^���tQ��>�I�l��}��A]a8�s��@B�uDY������X�5R��&��yr��aYٵCމ�ݙ�ͧ����a¦����'@���9�WnG��u86���i��N��#�y%p����,b��R��r�z7�L"��N��@_�/�责!�����~ά��d{̼�3�p���1�ăi9pǼ#����c{R�����H1�f5�6Cp�~w��P-(]����J:3��Ι�x���N<j&x.53��U�O/��׆a�wj�X�;����;�`"����LpN�M#}�w؆�s^��ɷw� IM&Bat1�t��^
Ph���S{Q�T$�3��5B�e�d>�S]��~Ep�-�Ŵ��
�[]��Z�Tg���D��R�+F��!h`ZӋ�#HbYUܒ�!���S��A���S���OpVV-���h
�o��i�n�4U4tJ.@�,��
[�8�u*\B{S��	�Ձ�z���2�\�zЉ�D5M+zA�8��^:���Xtbf0S��NW)Wa���^Aȡ��m������ZzK
}�]���٠�%�w]�ɠ��4�$�}��
��'�ʿ��d�]h���E
��	�r/�@�̢�[B�Z���+B��I1s��=:�0�w}���`��5�B��lPva:&��F��Unݠ;��M'X/� �к�jbiW�B5��Kme��8i6�o��o�ES��8i�z�֫.A8,~r[}��j�ŽC�h U?���l����}�d'������Oz��U��u�o��5�h��h^�L����j7V�N���}�"�?Ê��$��ˠ�q�&�5�48]g�U�ΦK
}G��&X[� 4�'omv�X�ހFof�^��ٕZ���u�NS�ң��?�~�Wz�K�[�r��B��vE��aӾ}���<nD��m��h�^���S>����G�x\
����|Q����:��P�'�W=�n{����~D`l����FYi������4֬�p��b�r��0��D�!ɔY)�R>��o�d�=�8VR����ų�ơ%0�ѡ"p�m�k�1Ie�
�H6IF��2�7��ֽ��*o�q��LWo@�_#�b��j>�n�ĩ�M��[�&B#קtĞ�'9H����=�8)�!��D3�q�3<5V!���m�s{|£e22����c�oM<�JQ�`wz�x�G�G��4����+4q#���?Z�$�=�4Z�j����:����۳�~�V�=6g��kN��m�I����D�ۘ�(k8V�͟��9��͒|\d�J'-Հ,־=�_�Yי�P���J�"�l��؈*���M�b��(��	{�����w��Zf��:��R�Q*_�v��	��l�"T�����+&l1*�2���ˏ�Ʈ_��YN�W���ʽ
����}�����17e�/�<6^�?�m��"|.�j��I|O�\c���|�}߀Ӆ��to�Д���,�y�1�(��6ۑ(b�S��*�f|��lo6�nb�))J`���3��������{�_H��n��Ώ�/v{M!�I4ع��^B$��L��3�MƝ)���_����o���y�$��F��(�Œ���b��Z�����ԯ�î�\[��+��E�MǼ��ԡWA��1`�(\_|.G�5��BZ�"H��jvo�3u�3x�K�:nm�
ǚz��[��[���w��9��2�IF�O�	lj��92����B��G�k�T��6��-����x�#���ӗ<����i><ܸ�:.�ǫ١<�OBj�!��f���Mܟ!+K'S�)L�������/���Y���w|Vg��6ʂ�~�+U*�G�h��t$.q��j.sd(8V��kZ"���$�i�*y}qV���j�}�?W2x4K�'�]J�9v��R�U��~��X]��Cˌ���쪂H�\��GV\j�j�]�Z�Zq�_:��Z�p�j���
@��	w{�-��+k��H�A��n�z㾍��D/�}��_�,Ѝ��OW��a-��1`d�K^�`��>"�*���,Ξĵ��Ψ^�$�O6���X�D3�K~����G~�rƔD)�Ba��*�2ݧGwoP�-|u��q�&4΍��~z2��8LMS��6Ȟfi���>s�aj����x֣`n�wCk�`E���!��azd�|<ۧ�BaGn����u��\
�6�ڈBӿ?m�Ѽ�r�BQ��ﰉr.�_�H���y#�f���:o�{�֭��S6Gly����:�I��=�?p4��v�������d@
F��m�6�:�q���iǤF�Y+�or��_S�_��f��p��z�����ݷc)�Aa�9n[�DpЦ�`-Α4��-�g��\4��̨ˌ6�I�3������Tο�S���)����i�>�[٬��6��iQ˩!�U��B&���"b�y����ҙp�'�U�"SFqt��s���t����o��h�3��y��-���BH���x�7-d��n�Z�Kÿ�)�'��/p��Am}m��q�%�>#�D��hn������U$(�XMM3VD���0
�W�Kg���N;e��y�]:Y�9�M/�`{��;a�;8�p��sST�-TI	�]t��
�]�ki4��}1/�8o"3.{���\���'վ�����k8�q��r+�}�@c�u��ݶcr;䀘�p��,�5cx��K[q�<H��Uvt9�8I��7��j��9ڳ��&9:�s��q;��Os���׳m��ή��j,�pgg�$71����9j��"�+
ϏH��ŷ��))��s;={��C��5=^W�����O��H�n�[14�?8ڀ_n�������ox���/Z�@[6��#�Q
�r$��pP�eΈؗ�Up����i̘C�nI&���!�%g>Z/]c����w�����Q�4�a9Z���s
��E����BҀĻã��C���F�_�6����Nrq��|jhT�ܪ�,�)���{C=yd?S$,	x��62�w�X	�r?/E<2���	eJ�P����3eƱH�w��21�Is���K�%0��yf"W*|��F�*��܉)4�B�^�!�����B����jR��(�ٰ��=���f��$E�(|�56�yK��m./�C��TKnm��Y"Fq��@v_�'	���>�B/3�z7I���·�(B�@d �g`�f�86#D
Jm	��`Dg�f_�AB2�Ց����H��a.��̔^����(���5�,�-i%��F�…Y��>�����=&'�oc�a�<%�لM~!���<`pa����E��}���2B����6��l$�#B���x�o��s��$\�GP��C�|sƾP��9v��y��6}��7���|�X|"��]�M]ǘ�!5��j[-�o�a�Z���LPβ�=��]ZEK[�b�a]$#;����~�%�Wk³�.
�e�,�h[\W�]��&ŕ9#ȕfLİ�yE ����V~�;K�1��r����RT}@2@ը���%�|ߎK����G��$�rX�!�`�{?�'�oN�M��G8X-O!�6�׀�	Z"B�{b��?.(����œ��um���)�m��sN?�G�y�)'��u!�$9o�/�p��t˹�>�����n9_�x���wۍ ���i����e�1�͛�|�C�CA����	�f�<X��
�U����"������" .�&*@��ـ��a;3spA����~��'�O1�$�_:�R��F��V�������tL�:q����pe�^�n��_{n�"�qq�p�7���g����R�4��G�7����;XQy�G�a�&��7��?����g	^�a�]%���8ۏ\w'8(�LR�J�*GpO7ް�U�c>6d��jU�O�_�d�$𖘘��R\:O�5��5r+Z�8��/�C+}]D�߽U��
�ٍZPZ/�65��o��JC<&��>��[�%Ĥ�0��>ݰ岫��7��b��K��%M�r�'?���bb\�1>��<{���� =fD��YO0��w|�3oM���]�Y�S|ԛe�{����_���7�b�WLU��d6'�p��kҾ`2�T��]wK���q��oxP�k���u'�âS�"Pw�0#�vM����Ra��~wy���FBDH��'�C��-8{S���ۀ��@S!��a�[�&�t�9[�}���Z2{���:� ѷ8�u5j�	a��o>��[�g�� �\�TQ�P:8m�;�x`�G�wl��NKq�U���5�c�ZWA>�h܃z�v�W9��De� ۻ4��	�;,Q��BB����1�W�]P}�u�s�Q�h���;ud�s����n�{@}�f5
�;�B��f��;����rM���p=I�%z�e�i�8��6x[ذm�P^�jP�PJ�?x�s\0���ܞɽj�^�c�@j���8D��A�4du`�F�2K���38�+f���*~�(�QO��O![�T�
�,�!No��V�'��ΣԸӿ���U�LT�/xi��{���(5�<�C��-U�G�\��6_���#:�dϏʕ��1��i�S:\A؄	��NM��3%N��8���ɤ1�q�>8d����nU�~5�
�?F禟�sw�y���ۖK�w����D"�Ȋ��7*8�kz~En匣81=WeI��Z1I{�{ �'��qXv��)��:�j�%��#y���R�YY�BlR�K�������βZ��H��Z�u�F�T�nv����0��ʲ�o��C,�т�S��}�`���Y�x�{�	��k��2���z��?\�>�b�����z}WO-����N�ֿ�D�-FO݃�&^��Gq�w���s���!k���t�|�z)�Wl���������Oc�XX6�K�"�	�c?��q�{����E8쭩�-�Q��$����@�®�u��y��s� �"Y4P���F��{�S�҇
�R�SVϑ�U�e��j�>6JY\ܗ�f�Z'����'B�3��S��;L�T�g.3^S�$�p��KX[��ؐ�v$kf0d�?��_AT��]%�Q�(}���I�)��ȉ�&�~n�Xs����d�`߸��f��q�U�9�[���(е�{�)�G�u�Q��g�n�^�qAY�3m�B���p��W<�!��lp��1��n��.�iF�A�'��'�ƻ'�Wh��o�xt[Q�	7v�ѫ���Oл�b�`�vN�Kd+��iMԏ��P��^�$��A���n�qn��h�\���
��o��Z�X	��Y��|�0���(�j�\�N!т�x�{���B\)�^��=n�pǃ�5L�5��}f�Q%fK
=2���6m���bY�mXs����f W����3@�=B�g�Q�c�ٛ��r����xJ�m� �̷ny�3΂���l�;��
��?3�,�X}��So�N(���	��&b�s����Kx͞gI��=�d~b����^��3�0?@9�
#i�1Ԃ�cˇZ��W��u.���\V�����)Bn2��U�(긏

�����ٷ9ئ����M�!�ő�G�
#%���8x/O�(�
��hG�$~$k�`'���t�b�0oܿ
�Ͼ�iߌt�}Cȷ�����*�Lu
L)�8�B�ʭ́ա�$,�sd��$�Ӽ|�5��%�kf���|"�H&�]B�l��`N`k�fa[�̩�Yd��̩�uۛ���:x�<��F&sj����s$�穜������`�`�����a��30qp��)�x��t�,=[
��F�Z~�by�2CLj�y+\����uDcJ}�#P��&]�@`r�Uk�6֝>���E�@)�E΀/�Q�և�0.�",��/j�ǓQ5I�B�بƛ�����y���T��0\0/YVms�,��}=�j�F��Z�S
SC�٨ƀ-�����}DѦ��}Dі~���l��pn2���x
Y��h@fT����I�s�Ή����>�QM�Ī�
�CȌ����Zd��@�m
�v[xXu�"i�W\�o�H�ʯ5ԋ-��~�l�Ȳ���n
���n��m�aH$�[R8~Q��lY�X���X���4������R�-��2R��-�k�N��}�	��PN�JS��PN���{u,c]�w�P>?G��`��9�bО��n0�l?�WMV����y[��\��}8D�#�,X���Ip=��z�1�9���{��c�g�xA�������3w�*"jȽ0��Q�a[W����/$��_l���}ƴ�^�>#�Noh_��6�x�D�_Kw�>q��'%�RX��%�����/����s6	��{�WU7��)�^`�Eڧa���U�� �����o8���o����22/�|~�ʫ�`z��D����a��"��Դ�y�zi��:��_UҙwS0�_�uBa��0�,o�Żg�Px�ܭSOO���2�N:{pݖ��ߏ�OjB�9��Ѷ�Ɋ���z�x���I�f���v�ъ��zN�p�T���@�?a�]��1�_������
&�~�Λ4�����&/%�#‰���ǭ`��Ԟ�n)@]��̀���X1c��UO|o�^��֏��l�7�I2���bpp�l[��9�`�$��)@)bl�p�T�qRK��R{�Ps��<(����ז �~��@�??�=�a
�7L8���q��x�S�u���S�]������^J"8\�o���"8���S�5�
w�x��3��07���z^8�c���sVZ�n��_��@:�96��cJ����q���?��W�w�����VL�g�_�X��a�m�Pz���w2�gl㑧ܫ����*=�°�NZW!�]���)��aO��2s[/5����x^�y��T<^�2.�P�F̣�,�h�|l�T�$�;����
�0�3�=��-��aC���ԄE{,������[GC�������<k�X��Cj ���.�}a�*j�J%L�:�6���:Ď?�o����4��Q�c�S�H-b�QSuK-b����L�fß�R4�Ӆ^Om��	A���|�y�^o�3v����	+p�vQ�x�&��~��Y�&AB��x�}\<;�jF���%{��\O�g�:�J�կ[���Ҋ���-���K��y@1����ɓ�R"���与Q�u�l�ȇ����F=S��x�"�8�*-C�c��Ġ��7w�y���<t|V�Ò���[�~��,~���\�D/��j�\m<�:V��ͣEI�3�5�=^(x
$f��ρ��]�,o�A{�Є��u��D��^��e���^��A���^���y�ӞtՍ
S"IW�y%����R�1긷Q�J� i�+N�I�l�htҒ1��1�g]�Z�r��lv^i�K����pW����^?F�G�.��e_����Q�&���Ϲ��%0����a&�!�1Ƙ���
��KR��#F�`�[�a!����������2���N��m6X��8�D�-%�[Y����x~�@x�H�d�Ϡ�w���!Ey�@��M�|���M����M�E�fd߷�&��=�)�~H�ȟ�;{Tk�/�G1^~�m�;�{C��JLtD�6�k�src�F)v-HQȘ�wP�ү������-@�C�W�NJv�5�*
�'��״e���e��@:aw�UD�Ol��^����һ9�����j���2�.�����o4���ja�ji�En��Q�PQT<Q<=Q�ePnw�W���4eP԰��k����ow��/���WV�A��|����l�ȡ�z�K�͛%�Q�A=�ǭR���H?Ч
=<H�?~�c�9�������D�à��g�!Bb��03AB�����#4(���h��+N!��ES�r�k�l�Z��h+�H߼�߇G4��|�^:f����P�ES/|I��&�<���������R%}JOw?�c0屹�����н����@�E�U�����S��x��UW�j !P ��J5�#bB��<&�������Y�<}���_�9�"�brð�&{y�7r����{98a�wf
n���B4C��DѾ�j����I��.��K9�XA�c5TZ�|�bW��ȭU_����u���!�k%�"��Am�qO,"3kp�)��ﷅ��M��J��O��o�k��:��mۦ�T>j+,��
||���aE!7�'���F0f�S"���1��L�&��d�˷l;K��9e�o��=����+P���|_����Xoml	]�h���x��Ƕ�w�tG	��#���2�ٙ�MBq�z�1�f :��3�+�nO��/JWБ��h���s��fT�ꞟ�R���
�Q}��~
��z�f*AH��5�����S�8���c��k�To�L̶.���ti�"��S���{���;���|�V��������r���ñef&���+��{��cﭔ(;"�-$�E	�ȈP���(3���'�^y���������{~�x��{{<�3��^��)M}�J�F#K��c�N{�@����U���6+e7�0x�հ���^Y��~*�p��5�@��l�B�,�q��N:~�!dȈ`,��9bk2JcT�q��М��q�s�t�1�̤;?k�xW�h2�t��cRS-���X��o�J
OD���VR1�m���%MP��G�Q����w�czt�=.;�o�~��ٹ��B��˭9�5�d��@~�����C�#ж�@?�X��Ї	axvɶ撗�^W�%�Dn�UQ�_����@��\{�m<k���x���Bĉ�{�*Rx���E}��ȿ�����s4scI������/m���o�0,�d�R��<Z��xj�{�[��Z��9	M*8OS+���Dy�x�So�����`��֐����.�C���ɰ�|��:SY�f�Ƶlw���g�H��D%�g�m�{J����i8/�<����[$�3y�n���X���-~�=�@b��Zߥ��������E޺���>���G�pf��R��f�ݿ��\��e�j7G���V��eP�g�XFܱ�EՅ��s����b(��.�L����C�:lë���0���B?�]�^����^&s�%ǚ�`Nk�W�܌niS�:�68_��W��oX��7(��6�P/:OuE��� ��dG���c2U���Fr�|TD���$�o��Z��K���#lC�^Y��s*��-�e����0騖}%���7��E.��n(��ؑu��sF�5n?��
ׁ�(<����lͮ��e�-��T�*l
�Z!n:K_�_�^�rn������I�X�N�
��O f��e.|�B��|�9��`��s��\ԓ3ٳ��w‹LV�坄ޥq5����f]/�S |'A[��X��O6�?8�v���i�ih]�c|d�ң|Xn��?.���:x��������5M�[�W)ͩ	1��?Ҵ~�/��ac#��~�ވ���ò����]೵�Z�x<)�1�<jC񈇍�b�_L�Y�E����4rK��.�����2Ra�
3�t�yn=��Z��X�G<�`fq�WE��P�
/־�_�~��8ŷڞ���ԧ�ћ-瘫V�e�(+��8��P+�Y9�բ|ע{&5��c�	��
�:�cM��
W#vh��Z�K2��!�r�VYR�e?k_�Ľ���OP��!�'Q�=�M���m��=F���-|�#I] >���R��CXM�ve#�}m�U ����)������1<5.�&����z?h��?�
�C��b7�g
R�1�����&J�Ǐ��5�J�Q�Hr�
�hy��(Y��kx�T��!1V�Cͼ�K[�fR��ը'�pi7:&�Ȅ�,�m�SgZ[+B#�R��&�s3ž��ɕ�?QUt���L��;7���u!�j>��ߗ��i��=����E��'W������MS�`a
�5K�m���Zxͯ�r��/F{����`�
Y���]�THt�����5�O�c?��x+Ť_��Z�<�9u�ktGS�R4�K���V���g	4�n��l"/�2d���Ζ���u%�09MM���x�۠��u�M#��)�Umu�`��vʹ�BO�߻��>�oY�&��{�g���z�O}a�x]���NUd�t�7aZfbZF�;_�b)�x=�3�:pg�>�\tqѺ1瓏�yt���w��Zi����쵖�6zi6>L��ӏV�Ͽ��o?6U�u�1m��=ʧ�d�Y\������+�~��X?F��w�cf�(�	ͧʣp�r�>kU3�g��Wy��X��U�qa	,���Z{�ɽ��a~c�-�K����a��14JDž�1�NO�V��G#�%�u$1�F;�"��q:EL�v6������dJ�䯌�&�)F߸�r�x릩�)�8�O�y�5RG����N�!L�J�����F �vLD�0�NgT$˽4_=��������l�|�"�^�!�ۙ��{D\�uِ��Z�h�ɿ[*¬������-^���'B�>'b5�-����`�_���UsL�y~�0×W���<�<P����c?�Ƴ�+����>u�H��#-�]��[c�<x�࠮I�霝#�>V�/��݊*�V*Ry��Y�N]�Ѻ:��[)Y��lr�Z�@��.�ɭ�"_s�0��sZ1�B�Q�����^�n�^����Ȑ�b@ �p�n��-%�g�0�?���V�L�\�@���,�3c��
4tv6b_��N^<)�u��T�{ϸ�R���v�k��X�`k���`���"yqAҏ��N�4Kb\��ņ�p)��{!�ҦTSil�d����[z�:,��"���
Uģ ��D=�y�?��+C�5)/1L�?�T��k��=�u�-�ʷL���Ny�❮�5����>�ۊU�2�
�O�84ݕ��H�d�u*㱓�x.��=p,�����Zy��'pC�̮�6ի�g�U�o�ߪ�&��`�쐦�_q<z¤G��
qk{v/�+�p�Eә�F͂�:_�&�c
_����G���f��ztj5/���7i5m��k����|�Neg�B��j���"R�e}��T�ͨ48�$ܵꉽ��5��lѵ`2�<�G�f~3�-5J���vZt�V�Dy��@��<�0ͦ.��K+��ʣd�bLs(���J�':mҊ�-�J��b�����9���}�mlv��\�C��8�-J��o��>1��%�׌���>�۫��F|ۥ��#i���ۺ&���W�W�*eJb����b}��y�GM����>�����<��󮭪w!&�R�2w�\��߉\���\�[R�f:"��Ljm��>k��L����%���J��	~
����ҹK����e�^a)Q��<�J8y*�b�In5����)�	t���W,qd"Wͭ��Q�*�c=��W`a�![��������t������m_��!���j��P�B���r�S~��`=�.�(b����p�\p~��Q����6�5q��Φ�[W��ՠ��fQ�c�X��v��3�q�����D����b���=���(�>�*sL�<�j���r���6����6�
���SjL-aĂ@x���N
�������s�!��!���d��8��z�M���x�gH#ٔu��W^`�WT}�1��� pL�"���ƺ��x-�r�sc��v���::��J_BOn)�R=���-�!G!J��=����Z&43%���uf�SW�Q>�Co�J�ҩ�w��3
��$�
N�7���/S����y�2_�E.z���s�Z/Ԏ�l��*gn�4=ۻX=�7�a�i�֤���t��ۙ#�m�f�?ol�b�:fz�;X����{��ϓŪFq���q�U��d��g?�s�q�?�͇���m�K/?�'q{�4���&Sz
^=3%��oH+��q�b���F�ϵ��(4�K��1���L\�2-�x���v�Ӥ���J�Q'$�ʯŞ߉�N��3���}��^6���!?���>��z�~��dž��W�2�o��M��Ƿt�j�8kĩ^4T�/m�8+�q���s�g�)j]��]J�DE�!%7�SҏI'��r�����h|?q����%H�54�ո�p�xe�:rX��]J�W�s6(�RK3�j�6j��D�����X���-�,�\.�&�$qc;������٦��h�[�Pz-z�R�}�x^�d0�E
�.�eHٙ.��O��}�˴r
S�|`2�|�x��M\,�rl�}��G�fG/C7�F��k!.�VL���u?�:�)}�#�<��Y{ �+���q�+����	]n�2�Ou(�����
�y;=I�.P ��<��:��%������8���=�8D��}�<�1�;L�io��C-��_X�tQ���❹���	�q���"�'��ݰ'䏥��tһ�\m���%�[
b�`1�D��;�n�,L�#���yߴt&�
3��Y��&>�|o��a�z*��t��O].@��J�S\��K<<��Q?�����m���r�ɖT��\
_�r�����Z��_N��b�3_Ee{��C�{��y�<?���Ï\�q<�X]���p=d�fú3��k��t������˛.WyGQ|Ɩȶr��%!!��3O���n$�WBP����w!k�#nB����:��:�@̼l�ی��:�Y+'��
%���r�l��Z?�Z���tI�o�L�I�&�<�c�D\ag��t-��;�Q����&a"�>g��Z<�.�ѥq�ߦ������s#�X�g/�E���딙��*H��0NE���P��
�~�g���J�S=��O�|�!>�+!_Ѿ!3�V�>�Y-��B��Z���j�I6�ۏЩ�;Ɯ���Y!��C"��Sz(3闉,������^�(~�Z#�$O�Ô��ꖺ���X|X>6}o}��CK��;���}�5�@ \'1!�C�Up��7���3��w�\R��w��֐�6�'gH�䉭��T�֯D�;
�$1��]na~h��Ί�*u�^�W�VQ�z��<"A?����󵍜V�!1����w;x���ۯ0�yQ|*ohe?ɚ�*qt��/�}*����jaÙ�Le����W	s�)r�V��x
_(���^�U�Aw.�<q���v�{5焰�2�
�+�I�
j�����VH@���q�
ފ�0�`Q�ҥ4���-��U'�z��h�^]Շbm��AQe5��ؼG"0�KS���c�3[���v����KRu��yH3\�����cDC�J��"��F�oǎq�V=C�s�&?�䲒�a9f�߽EA۹��u3?mW��8V���Ǽ5U����{��T.��vo߈	|^�yF|�h�߬CxC���׫��0�X��i���
c�אq��c���z�/�$nSv˺ݹ"U�i7A�C\ƀP�<���[H/�m)c���#�*���Z8NѺ<�k����h��ĉ9�n�/��F�&��G/)~�?*�W��p���#9s9B/9���wS���/��s���k�`�^}g2��7��[<�f�v>��ީ��T&��ֻz���isG�q��xk�BC�٪���goU42K��I �콅�eBc�4��x��c�A�B�b�:ޞ@#�e����U>�痉�R��%˅hh�)��7kw'�ƣߦ�O�ÐCk6�<&�r�Y"GPӎ��7(�U�˜Y߮��o��S�H?
���7��*�9��pF\Z#��nr!:�,}q%����@�ϵ�G���S}�#7tL���$��U&k�lB/hu��Ҵ9�)g�Xiz��ܛ�
.�K/��2,_�RZ�a)Z��{H{b.X�KW7�D�q�W�
X5�A~��H��й���S%�,.�\���-K/���{�f��-�e�_��ӧe)p�C�'𤻤t!�����M�BPob !ף�mIo	��Bxr����/\m]��u{07���>\��;�qN�������0�%���[B�Bg��$n{��^x5tB���:���g ��0s�\���ַi%�J�E9a���-�}�#�Ģ�K����
�$�t��0�H�96�w:��v������5�߻���O���|����*��g5lLևf�V��~`�3�jP5)hft~k�⩳qw/���8O<��DV�e��*{�~T���A\�5����1	4o��R2�
��J��I�I2Aq��ԫH
�
zQD{�J�"��&x'͸Ma|�hj
��YY����/c�.��ʏvw��M�_6O����O2M�"|d��s�dz1�䨶h~�hI���ǜ�q��
Q�x��,�_cTJ�w�SF�}{�F��d���b��^�CR�w�.����aq��Y��N�T���\0�"�W��$(�7��c�:}
�s9��t.�Ada	��Ym1*��:�#1�CP ����yxL������1�4Qʭ���+��7�gy㐧|�[�����9�B���������'��N�J��������5(uaHGd���א.�d�v��~o�!uc���Z4�B.�%����-�_@q�˟��P�y⬙-b$�Rr6�N�����"�����rS��&E�����O���2�YHӡ'+�qNS=�H7�-ck����)��,����k7���z����f7}�D�BS�ݭ���<f}�SԊ��8�O=�iG�(>��E:�~�އ2�<�����CG���l�/{�;
e�]̸k�3���U�:�N�w>��9�g���%K�^�'�ɤ��%"\O޽�`s��?����_���q��-�U?:�I
���}X}�:ڮ^�9���<y��>������vy'���a�mi�N��^�(�o�\*5a����C-�Ǐ�L$�\�d�(��&{�1�[�iq���R�)�p���a7�x8㶹�@�Y?k����anMp������W����-lvCʶm�I��Y��|��O}t���,z��q�|�G�j��^,��v���SL���E�ڭS軮��~a}H`W�]�1�'ٵy�^������3"˃���n�O���I��/���<"�d��i��|�'����+�
%�*c��3��1����GlI�1[N˷lOH���yI��E��$QPh���k�O�<����N�N=mr^ݼ�����$!�,ǧ.��-h�d��-�[6COm��s��MU�ԓo���^62��%�x��j�1G�j�VM��ԙ�^S>i��m�;���/StO7n��s8���iVOQ%�n1�ބ����8'�hWBe��Z$\�4�v�7Rɦ��>���h�6~����f���(�v���m�N	e�[���p�}�|�r���%yN�sL�����%��Ux��#�[�d�c����gw,���
3˝�#�4�^g^�o˂q}��0nxM��:�ާ��8嶊�]%��V2)g�e��N3�D��]e��aӁ�۳�����2]`�/�0�aC��-���	��>0ߜ�&�%o�qp�>��q/b,�ɗ���$���x7�KǷ���{{4�.3x+4�_#�(+�yǩ�BL,CY��ɧ߻N�X��l��ϡ��L������r�Ǡt�i>a*��W�mijr�Mc��ғ<�����6~�ͱ�AMU�i1�ߜnd?��,=��ݏ㱼��+��������Y�	�6�/R�$4nR����JeJ�7���t�ˬ��GYY{�����?�R�Y��X�a��]"�4���1AP���k2�o��^OL&)M{Yx��J�%��#���)NW�>oc�x[`�
��4�Qm�I8W73�u��G'g�bA��k�a��Tq����-b%ǂ�e��n�S�kpg��%��9�xf�N��D������.����M�㮎'z���V�F?{�¥��jwS��HC7�{1
�A�l�:
W���P�z�QBu#���'��>և��ᵽmC�B�7Ô�6��4��H�׬�z&�O���ˤ#b/�)
]j�+||���D'N�ST-���U�:��q�U��t��F��9w�,��ؾt�՛�槖��%\��KV��8O�O��Vs�h�tNڶ5�J��w!�+�dv�j��]D�Kq)렔�w9��V%��~��A���N��H��*��1�6+A�qb�^ՍfKH�m��|_H��~w�>:�-�y�x����/l��r�,y:�l�8X*⓻l��
���r%s<�!$>���:s䩨-����ElW|d�l�36�.��_��qc���H��|�Ƹ��n`�QK�h����H�3c
�H��פ[\��%�	��N���v�hQ�¤~E�_���_𣼧��g3��S.;im~Ӓe��޸˵�B'P$_i��e�3L���_�>X����{� ��tVs�q�
80D�\th��/�1����>C|N�A��A� ���
s7/���Kի�,FÜ��R���+E�3}��+E�n��#q�m�_t������z<5��KЎ?�G�K��́�֏rF��.�˹J	�]�6t' Ț���8[Z�d����g���N�:��1ix�`�y��.7���B���u�0|����o�
<�2�8��e��?�\+�l���$�}1�3�'u�n��n1�
�y�\���ɤ�-=�����o�zN�OB/͇5l���{��ty�&�]�v��}LP]�����>��>yR��vG��w�<e?
��˭ŗ��|k��H�v>��gT�<Ûԁ�뫓����2mؠ	UY�`���Qx
7����v���OJ�B��6k*�H��V��}��nq���6�\�� .�
+O�hU�����Z}e�y�2%�	y�1K"�U>+|�m�͆Ư%�F���UпX�k���Z�i��l���2�̰�U���̧ hr�*���OB���Jh�o�
��w=V��>S����%�� �|t[�3���m��oWz|�/.u�mn�O&��H=sͩd朧UȔJNl�G1�d�s�%u��F͉���Q����aH�V�s$�F(,j��&̸��ʉ-C�WTVF.�~�_����Mx\5�����u��Ͽ��ir���RY��~�Xc'v�_3���<anv]
[�t�U�i���$}�g�ό�����
��󁯃�<�6�{d��1��!����"���j��g܊fB��c�Oʮ�A��C�>��<�ʒ�S�ʱ�RI���k)�d�<�kv��Τ���N6�"Y�W��s���ϗ��foȱ��,�Pv4^�Y[�r��������G��}�����J��M�춻7�S
�$9H����D+pQ�#�*~f �����G�=S���A/���w�|])���ޓ6��Oڎ�Vp��������6��L.ޮ�@�
���}�)ksp�:m�`�ͻ�L�ܒ�r��mutt\[[������wpp�����P��М?��Ӱ"hg�0]���Lo~���5���[w�#����66����_?Zr���|����I�U,n+��?}�{o�Qxo$�9�t�F������=Hӓ�\��W]�����ag�l���vP�ʳ���s�O�
k�
o�T}��v���x���\t0'3#O��r�_/���QP�yt
�@��k���\�k�ii�����c"_wv���4��x�����6���>>�a[K[���HCCsdz��e��Q_4#��XHKi�%!~<���i�G��{?P{q>3�f��_M��@Hb�j��i��Q�d����NGJϒ��N���X����(^�]�Y����p�6)Ҧ�CAV��_�j|��m��_��g��y�A�ӧ�N�d���\��d�d�g�}G��q��.�CnJ�^c5p�^U�y%�1���	�["�S���|BDc4��$	z~)���l����lI����u
�M�}�Uqu��±�P蟾m�`��T2S�⌱c�`�R_'�'�:��b�*���ll̪���ˆ{-v=$m�1�l����?�w��iY�r:��!�����wc�=�,�p�8��EL4�dE����\���Z��6 <�ȯ�iP�cc+`��t5h56t0���m	a%�d��k���==�ϯ�S�*^8����
��g�x��Or�:�Rp�*h�+�ξ��6^"-v�N�‰���"���Ǚn�?�Z����}nQ�Hwnp�j�Y��������r��A3w�swwv��!�a��m���
���qp���i���넋iF@��:��0+7����5����z�SsC��P%���G�$0|Uv^69�2�˲��m�Oǥ9�A�yzC[<��֘����]���B�hyj�b��j���%�Z�/�����{R��ɶwv��Z�U��FRp1��K�'~�E���Զ|S>����6N�&φ�Ǟ��H��͆�`�<��{�� &�����0�z]����o���
T
gO���G#a�f-I�N�w2�s���v#Kݍ����D�W��|�ْ��Q޴�տ��,��=����T�/���
��
߯����:���Ƕ
���ҦA��b$xj���u���8M&��qi���B�������I��%���x��#�e�?��7<�
�C�ٝ�;FK�5Fc����L69�2^y�,�z=�ؘs�]n�<���榹��ñ|�/��,�
�Q��9�9��h��^8���]A	z�A����X~F����ض:�f~����M�7��9/D�)^����w���[��-NO�o��[�Fj�IM��y�V��ܘ�9�f��"�V��%w�86��gV�������kde
8�b` ��c�m�3���u��#[�L���l�m�[�'�"�z�]�6˟c3��>��5�	��E��T��<v���Q�c��Wg�rgg�sJ4y	Y�-du<�7a"�T(��@t���u���*[�K]L
�A��8��݁�������t���RORI�7�IA���K��\V7�gL\k�Jf�肴�m.0S�/V���:8�����C�%��2�p��o�6@��R��2�6
?�������{��5�,��q4�P4�rB��B;l�,|=���i�+U7����D���J�/7���K���LN�����.��jXw���n+��ܷ�@��K����/���%���������7�]�ԓ���2&yP�'o��e�]a���/�S�ob�}	��pQN����5�+u��[��ڧ�//��x��ub��4?߾�4�(}rBjm�e|i�7F���� �6�N��Q�l ��G����ݰ�|�ܛ`�Պ1WY����f{���Z�mf�!w�����1�G�Dv����(��a�Ot�4a�pWo�&Poc��0A��������b���C���^~o��|����ᔁK�Q�(�	�a��D��c�����ϧ�����Pt�k��N�#��?�/���Dl^�?&����vd�_(:..n�B<���xB%.�ʂ�RqS<q�.��ٵ$ߔ�u�]"S�'L˝3����vzd�nsM�|���N�����J)�ZWhi�G	L�
uP��p`�)'�U���4ȼt!�QnTοr.��}i����<���I�Y!����O�M�2Z�,�~Wc
O
��PS����F����h:�_di] ,�T���n�{�V�����k �9�^R�tI�N۸�a�Ċ0B�
���ka���m���
{GmXw|��*���V��O��
Y��-6�V=�'���mPomjc횅wi|��ݧ��T聡�X�M��|��h��5
����b[m�Ǘ%�m!/�y�x�UZ��Cw���3ě`)N�՚���iM-�h�t]9��:��!�4�����.�N�t�C����K\�W��=\��{9���ba�g��G?R�TEߖ9�Qh�4�UV�,��ؒp�^�.Q4Dټs��[��ɦ�?C

�cw�������wĐy���&�+å�����k��K[��4��ĝ�����������i5�_{��X�����z���8
R�h�o��_F\��n��#�@�);���?v�5�YA�v���
���ﱾ�`!R�A�3�A/(��V7��>�R�����3�R#�6�;��>Z0!r�n��!\-�:�?��uO@ ��`p������ �
J�|(�I�[~$�x������� �C�ExoK��m��VQ��Y��tB�0N]�� s��{ ��@��EN�q56
h!Χ���I����7�p�b���8��=��ܤ��F`���Qߞ&��(g�?�¬Xx�w�7b �Nc��\�;�A"�о�5s��N����=��,
�n�"�ȑ��s=~@'�힁�!��P �t�Tw�QCO�jIaA �P0�!PD���^������G�g
Q@�2��aZ0�E�ޔ�Bܝ?�!F"�HT�8�ܝ��"2+����&8�QC���Hm�����6�/�}LIo�LY//�3�O�r�hGHx��q��:s�oO���?� c����4!LJ#���k���7�O����`���I\1�~��ĺ�P"b��j
�~z�D�GbW�#&Z@����%�����l襏�DS�^�ݓ�s�IBΟg�$��X�޽Q���B�Gr���A��
��p �}pH�a�_����?%Ql1F�
�������#%���*wI�k�*�0�8R4��D�s@����C�$�D+{�{����*C¨��p���IA�E$�_wLH�ڏlr	6�������f����66�G��+�(R�
>/@J��4���N�y���
��G^���0��j>J�ơ)����
���@�!�Q"���4�6�o�����%��{k�$���?��*Pb�o	�r�E���ԁ	5�!J�!��|p����!fz�G�������ůF�8�)
N[�(�n��@���j0W`?��\����jТG���-��u����~��rib���*�����ƒ&m�Ѐq��^�N �)(�a6����}����3���E �nA�Ȧ�d�*��>�^�<�&,U,1���:�Q�]�}������xZ��o��8�h�����;
�*�O�`�{6��8x�N���s}2���v/f��@	�9���Du�X)�+��pQ:sU��x����80�}-���xX��Zdw���WxBG�g7#�I�M�7s�*1x���dX�:,������ׁr�A	j��N�KB����qԧ:mxxK8����3߬%
���j$Mݝ4)�Fv 2�C
أ@"��<���\��v?����Q�,2�dOAD_�^=DrR
Χ�v�}m��o��{�gO�������j��]�թ�n�@�v~$�O�Z�?�\D+�:�`�0`��>ߣ�:�pY����'��Qu��9��y��<�Hϡ~���ū끬����}"_�;�
����<k���L|�q���'Oq>�R��a��{�<K���!���C�#Jq�e-L�q�����*��#T�d�]1"��u���K��L�7�(�,�.,N���{��1ppr@e�J<�R���G��%`��n�[�@ },���AG��F��#�4R�q��')���J:��B.}�t;���d|n�@kz�,QhH���;;k�]�IQȭ�
��*�
M:���s�3�|�D���AX`�?��c��\U/$g����Dž��@gX������
!�����
0�Bw��0�!E���Y��(�G�95��p��=��$��p}��7�̡
��>s�s�zF
�3�C�9:��`'_�1�4�������>fv>���/)���g��ja=Jbp���e�=-�
~O�_���%�y@o@�}̙����2�B��S@��@wo�b�{*�;�<T��Ђ����1�
<��P��djpn��m��R���p�
 �!��?~C�����V�Y��R���0�d_�
ٿ�*~\�*x�y>��=��ѿ!����C�Kq�<�l��ӽƭߐ�����=�_�!�j��`��M���3��'�m���R�r�]+��
l�nb��*^�!*��6V0k$��3�>R�>&�,��Rb�tٍ��
�?t��DR����6�SA����* ��� ���졬_��hΑ�~�vO��C(�n.�n^�v���"7�mu�q	E
|fFۄ��%q��ˉ�pą>ViFM=T���o�!�T��e��Ð���rpk7�K����n>@<����>T�S#�lR��+�?U�y{�;�~�s����{
�eoGPsQ�����+�|8@���\�UG�yrhVg�o(2@��{����R���[
Eóȁ�� t���9������Σ@����}�j��H1�	h�
�U����¹.�'������h�6U��ԝl����2��Mȵ|��\�в
~yH�rp[WĤ�\S��S-�G��>�%���z�_��ʢ60'@�CpP�|����ZULp)�@�Y{��v����Z`�������<]P���%7aRp�cf�qb�s�0�r}�k����b.�!H�*�F��>�:�z9��
%N�Ez�л�.�ӣ�K8��P���H��}������;�?F��p�%>�y,��Y�OT������t;��%���!���q/{ �3�XB1�#�s?J�5���2�]X�nN�4U��e�.�R�O7p�`p��:F��Rm�0�v�C�a�85�7%.;|������Ox��q��1Q��[����a���J(���hK�y���U���=��Tأd@"?;���+[��(��n�p//`�)�zy{�X��@�8`Ə?��8�����C	�!{\x��5@�y�%0�o�C
i~�2AtGv�"���.⁓?x�Ě�`!�(u��w�4�����y��WȺ9���P��%79�v����$�V�Qm{��^�>��懜Gwv:��uA�<�Cx(��~����oL�qG���{�<�ȓBš��oU�-���'
��7R�n�~���� ���u��N��ޟX� ��E�������;�-u�t�
�w�b�y�\��0��6��	wEv�A��X~	���H���\�@��o},���x��`�l`
�q���#��g���X*h��Fo�a����Ș��v��8#
���	�W����(�W �e���H<����xq����d=�:�lf�:�E�f��"g"�Z��"gX	��"�X�������5 �m� �(|�V��G���+�p"rOʩ&��L?<D�=�fj����	��)L�������}"E
���!ф����D��J��s�H�v�aX�C����Y`�tF�RS�F��Er������ڳR��'�gȑ:@`��(��Ͽc�� �J1𒁲	9Y����;x���-w�Ad�1�?^s������=�V��{�%87��8��|:~s��n��h8;�7���6��?L�\8��?����=�h��� vw�o"{k���j&�w���	~E��x5��#�J�K��aM�QcQ�����'�P�Q[����ۨ�(�F���{�蘨�+Ԃ��i�	��F-eu�_�
��}{cE�T�oOQd5�����/�~�"�~����@w������o{�m��н2p`&������`=��<��"�̿}(��ې�@�SB�U
,
\�lOZ����g!3�0p��=a��^r��dq��kY{���5����{qT����ړF��e�Y�,\IkO�2ٿ�W]-�4pE�=i��Zڟ���{�!��ҿv�՞i�jQ홦y��L
��'���E#�"�\�iO���FPѧ�iړ_E�����l+.���@�����K`
�%��4��}
�L+�f��	���!��%������HX2��О��ߗ�,.�'\���K�ٓ�M������T��F�ۀ=�8�CT��PK
��=�V��$K$nWEB-INF/lib/jregex-1.2_01.jar|��.�֭۶m��۶m۶W۶m��W۶m���|��{�ω��*
Q��1Ǔ�#2f*ʀ��A��������
$'�*D/%/�3
�(	��W �O���h��_e9!y)q1U9�G��IYz�yxz����fe�%ֽcgi9:)�y�*0h�K�!\,jK���7s
�cL
��Z��K��{g��(�Nm�>#�4D��j�?������'��������������������*?�9�1��<Q��L��L��X�yrf���?7U�إ�#c}9�Ic}��<����N�FK�HEۇ�a���w�sk�R^T�}Q�v~nB�D����~�����-H��_������ے�b�Tc2)7
�����B�?>#85�Q�H�AQ\�6%��rWb����Z���dF{
��K$ve
�uuGr�#�$_@�
���#4�*�� �g������G��\]�\��T
E�Sl�t�����d0�utd6,�Za�`�$�(�:�5MG��56;8;{�l�M0�
2�mݖHu
�+�%�
���y��_�����e��O^��t
Œ�w�����;�턾_3�
�(��`/���Uǘ�A�!�"��b��&�:��M9H��A�l�"��y�)A��a�Q����{��F,�f'��NC����C$��c���Bc��SМG��y��ў��I��VZ��G1���o03�έ({/�Vs<�WP�.�D�$}E˫��-eo�����5�l(��g0)��3c�.\+���:\+�cg�i�\x�6
mSh.рQP�zy+9]�HQ�{;�(?���B}��8��~{����8���3�	a�x\�&�dd�w���z�(ĥ�*�ǭ�V��">v�v��Fn��X��Hw�B|�GR�x�2?ڥ��(��������ͼ\�8��*��Q7	��6?r��g��a�d�lâU�X�H&���>$N,�NG���}��5�����8�\� (�:=�j�o)�8�Q�}�i���:I��Qq�#W7w7vl	�7S�hް����� ��(?�Ѵ<�˶�Z��F?��<�ˣ�0��M�j���-�6˵(;y@��&[��#��!8���� �v�+ɵ��?��Z���
<n�Ҡ���$No�9<�]TS/y�N����7o�/:ĉ�_��R��L1���X|΢�V�{j���w<;	�b��wv��u`;Ks���;��ht���N�W|��6���W���X��"�\4��씐X�F�'o	�5��]dn�۬p&�gm-���Ο(�z↩�2�:��R�O�=���q���'D҃���)F7&8[(�Yp$����aJU�8���(���w}�i�g�AJ�]�]����@�������?%p�=tlv#�R����Y|%�hҖ c	dL#r#PR�‘�&�5L���\�[�)�9v{�>(�A�`�R�`v�
z'iA�%�%�W��	ӝ�����'Ff(UH���&���xa^�8'e^�lvر�V����V�A��{�;�5��&����)�*�ʕ4oԺ���5����X��,یx��#āmuʘ.�F^iu�'��
m�򆶘��mFt[��&{b��D*h���瓞�6;o����
�t{.1Pa��DS��7zjqҏY�XlOn��
� =G�Ҡ�??(��6�B�$�8=C���ޒ��`��Y��f�����x<�ty��JX�Ry�#,2�ɬ�\f=b��n��m�]B_�x|P4PTP4�Yb %Q���9�RA{�H���rG:v�ױB�V~p�1�F�,,ű�$�M�J�?8"��aF#�c�d�K�詻/����7Wbڞи�x��=���ܯ%GC�����`|Y�2mB�X,�J��i%��]pUӏTcH ee�9|��q�1�F���R�Oh��0�)��E�gM���
�o!o%X,j���T���r�y�y����3�-�I�Ju�/�I�u/�r
�!_R5ۇ؋?��2�-2f��p+�K�@6���O�m<�\� �\kA	�F��L>�H7�����\�P�/T
j��)Ѿ}*V�[q���y�/X`YH4N� W��׵��(���G;��i���<y��D��M��h�8��J����Hj��I/��9�G�������#|	�Fie�vx���
,~�24E�08e��5��m��*<,$��( GxP�,��w'�C��"W�Ƃ�No%�Ҳ��e� |��+��L��a��򎠸D_�����3��>u��`�R���C�1�W�)�@�0߲o'op��t�!��>B�l��7rљ��gn�����pMN������/�0t��y�:�N���yL�������/�ֽp��䘿�BQ� ��އѦiWW^B-�(����+�������a{ͻ@�v+��"�?���?���^mki?HY?���E��Բn�fbAY%Ck���!
��~xU�	k}�u ?�d���uj�
&�t�x8d%�j��N���0
�ڜ����2~�l�m����4��|b
�r�F�V��j#~a֞b,�L3��-Ps�/��WnJ(�\�
�nF��oM���b6��.S��ѩ�H�P�y��|�G���Z�"��U�h�܈���T���Ss�r�|�h&
,�"\��%}��Fy���/�/�Y�Su�4f�w�P�{���Ŏ�
��\�6w3ר��\���H�/<h��=��K�ܡ���;*�2� �Ҕ��B!�`�R<� ����	��s�O���U�L't}?��P��{�B��v�I�P�ٜY�봕	a#�u{�p�7��.%纁��7*3NZb����q�L��ҫ��+Vr����'���-]"4�&�st(���lLl�m�r�ulU���>�x_gd�[\��A#7yUh�!3Ң�a@�ZPd�r�@��T�d��~eU)�H~1Q[���W�B�Q��W|�E������#D�K�|�t�h��u�m}շ�v9Y���	�lyo̯�S�o�.j�<29��i�G�Ci}i�l'��2��ƴYH�����b�vE��Xj#h%���rN>hc9[Y�2�u	��P�����%n���LaQnzzF��V�J�l�}�k-����vT/���SC�����C�<U�Yˬ&j?�Ϲhȇk`ab椷p(o�'k����D֤1W�y�`b}�٢-��}+� ʃ�����6P�;��;N���՞���~�8����󚫳2<9��ќ����\�3Ur%�Lw�*x�㕷�s"<�U�wRP��f������ w�l
��/eP�*Q�H[C�4\�t���5
c�����aW[��i�j�R�|8�EB���κjFb)�=�ݔ���
���C)��-l��6��27��@U�>ӡ�H�Q��\�*�D��*|ͩ�lD
$(-�#BԾ�[G���_ۧ����^���N��3���"T�tM��;p��}���t�ޖ��z�N-BwB�+����0�B��3���5��Ɣ�pj9�Jc����Z`�o+��Q4à �����4��(��F���o��	�M܋#��J������*J�už+��8�N]���uӧʗ�%����_�r.��ȧ�¸'���ͽ�Ӹ-���8�J���ÿ�nT�_��=VK(%��������6�$Q�/�?}�6����Ftm��qn��g��m.}_pm�K�⼷�E����F�2yz"����J�:F!�e����>qm�1�.J(4(�᎗)0�D�c���@��#d��	��TkSq�z&����ts$��9��?�q̯)�d�Ur��*y�M0b7�y�Ur��	%vd�Zgtg?��,S�����",b�B�f����Gqx!�	�����q�Ŷ�í�K���ѷ��y"!���������~�b���J��Dn��~G����,�t��| �.H���}��i$.n{�� (����^6�y'��3�7�'��U��\T3o=�_e] �k��Y�~W��TU�<\7�](sn+�����s���~�240061��H��ZD���=���̽v��N�����}O��
��F�i'.��ר�:1��cN��7�������~�9��Rxטk.��Һ��b��RJ?���(2���\pmL7pJ���,2�.��7�"螙�;�*��/h��3D�k��3��
?Z+,R=��xh��=�kl4��o{ �S�!�@��E"}���
��]),�$�uHؗ���@YBS�B�twz���8��j���wn|��DB�n�W)PY)���X����V�%�8����xO�x�!�"L�F0��(��tF�)*Ql�`�
�/�%�I�2����]<�%�ƘiI��τCG�\�����Q�^��`M0�R�~Tb�3�Vp5�(��p]��2䎘R�B��̊��J�@��J�IH�.����~����-������&�=�1�3z6וyJ$�
s�3O#�}���&�Լsvު��)h�aZ�5i�>?�哈��*�(�h�h�}ƛ[���7��F��u��2  }�6����F�&���ܔ�d�~VF���Wh	l~�}ԑx
�*�.v�HvA����ׂ�z?��֫�`Y�?�9�gzz�ġfS�
	�${XGX,FD��
;-��3�|#�3�	�����L%9�&&��T�ߟ�I���j#��DC�4�8\'��w���R�		��zݎ�P�'͌C*���	Z� Ao�l��.��59�HB��~�#�ωM�����ю"��*w��K�:X*kN;#�fm۸���Z�T��Z*�p���X�Jy촜�&�?��+X���3�|%�f�a��E�d���c> �ys1�g,gӴ
K����x����_��\�<	([@?@H�j�[�A�7�/�X��ɚjMUfpe$nP�%�3���[�$���'��T%\�Q�H�p;x�C�$#��_[��R�L�E;(�)��?ʊX9���9��K�+\��*���}�ɚI(DW��,�0�,�"�&��8V�Co:fJ1~ٵS����������Z�~T��my���MC���w���{���LY�����#?U
5

5�继?���0h��7�7���[�Z�g��l�.��|��jx3\�[�o�x�Jp��E�x�.jxӿ�i���-�U��<��i���)�2f��}n�Qb4�\Z��4i�UƙQ�4�\j����\z��43����Z4��43�`�
����8�6j5*����\���
���٪9���� ;��e”m���\�鎍K��{,�Δu��Һ�{*j9`.׈q
^%�j\y��(;�v����KN�aytP�:�Bwf�/�n�#���U�y*Lf�ݚCc>�ߺON��ѱ��Ƭ�L���gP����n��>�1-x���g�ů�;��a=1�<�Q�����#�ҫ<3��Y�1��>���>�):Ňm:�Ն�v��h���iv*�=x�)8m��3�cm�����u�zb�|���u=!w*��x�~Gy0�أߪ�@lWL��G���(j�V�	B�`ޜQ�QP�O��G������r�;!�/nD�=�WB���u�]o]��,-�����i�uc ��`�_|�?���Y#�
=��:�@� hYjK�r�
�@��Ƹ��ʣ����_�W �ݱ�.���4
:N��m`/�C�X	`ZB7c�;j��z�<eb�4��%����ا�*�M�%�P3��4$P9QF7�pEɽ���@ڴ1V�5��#>�8���ҼQ�
R1�G��p��+L�e�P���p�AZ���T~Jȡڴ��ňL��=�q�zH���(�b��;uC&�H;��%�3-�<{O�p=�-��q�i��ӋD��#"qp3Ъ��CE�Xm����o�2��(����OZ�,�e���tW�uN�w	J�z}�`
K%H!��%6lx��"��k�GE�yniY��#�אU�㰥r>����%�Ec�{ �T�6FFՍ��v7͟�@J�Hd��FF�̓�kZ�=�aQ[�"�$��1I���0�����Uޒ;�'�)���f&�O���$I�AX=k��I3��it�L�@���*4�-,��F�8!�|I�l�J{����̞G24�l4�(h'��gy���u���k&�A��V8d-!
&��~Ȗ�e�{$���!;�#n������?����q{>�$�Z��8Y;����WU�TxMLUi������j�zo\�fs��c�#���!�2o�D�,��a@��(��q���ߙ],�'q��T�y1x�Q�X�k^����=X�ܲ>4��4b��k�đsbҽ����E��)�A„��{�d��;�?�&ѹw�܄b[&�j�������84�b~�-��W*D����8�t�u��6�xy	�#��7^=+I���9���j�,�,,��2
���Yj�%,3����f�$PQMj���=�m��;H�9J-5E�i��r�c'ٚs#��Jq!M
�[SEM�C
A���ĥ/��������u�r,F2���,Ǚ�ɋ�p)�[G*W�
�7�0�E6AN�D�]�hr͉(\quU��������F�tY��k����p���[X��V��͐���2�9-������r�5��E��JV�m�A�o�z�L�{sI�e�K��B	��V�Y�%!�5�VѺ�1���O
Jr����7m�%,!2��!=$�y]v�Fq��n��$�H5�F�~O�C�Z��ܚpao��!�H.��'7T̓�LHT(7����������t�紙�ji2����j�}Q�ʥ�
����g(�j�\�8�;�izZz��@_-�g�~
}�3��_
+�M� }:`�������D\�� ��54!��y�FQa_ZQN��L��O�o�R���5�>�37/��X�3�l0&��O5S���3�]’��lz4/=��x)>	�4��L%%̪��o8K�j�ʊ��Y�U4�4��l�,$ފ�3Cl�rq��I�I�	�OCE˅/i����-֑괡��1�:26\c�n�
F	JR2�Pʚl�r�i/kh	$�5n���@l�>�IO��#��2~�x7��.�]��\&��4}s�����R�}O��l�*�3�㓁���i�$�!"ttg�*�8�8�[?=��~�/�(�H*�*�V�A%��3i��,��s���n�~|Uf*�2)�pD�r��d�*�4�v	�v6�K>�v�)j��)\�6Ԭے���U�*��f�r������<���,VfeU�y����.l��Rb�6�5�Ŝ	CE��㸛�����m<��$(jҾ�UΕ����+�+]R���=%��R�S�c׉�t�����y;��&d&e�_C�m�����A������Cj�B+W��-�W�����_)��1�7���e.r���	Q�]��I��1*����+�^X�e�KI1fu�TUӔPf�'��٫��X��n]6�:O	*aXFg=��N�i�>_�,SK/aT�t+��=������O���!���	��Ֆ �.�I��ev�yv��/#A@�`ˮ+�t*�k�ׅg_Ȕ�)�$�[�
��I}"�g�RǹX��&M�:��`4i�hb��#�5��>v�1�p�b]�̼(-�;_	
c,�Ѷ�ȧǽ0%fY�#��"���b��!jT�e��hRZi��R�l� *kd��\
��h����|�#<�z�_��!��U폇�ob7o��V~*ɐyA��#���I�	�<��	$eC&g�H��g䮍���C!�^ȿ1�NB2�)�P�㜿�?��b*u���>��35��VG����q��B�?��_���L��@����������W��L��N����_�=G�
���?�����_9.)��&�ki�<;���"�hСpP��^�9��{�o;����M��u��������Qg�>w2�1N���V�s�^G��c�8����#
��s����N�\�����s�X͜���S�lĬ��y�~���\�j���Rl�v}�w�'|�I�w8�UK
�n��'�_�S�^Z��&|d��ZK�4�h�Tq�}$)����zn�R�B6q=������y=��#�}N�3j$�'̵c��tѡ0�V�^D*2��x�;����|���I���)���f�5�c�[0���p��)}@�c���m��mvm��/	�j�2_
KQ�3�Դ�k��62>
�� ��|�L�32O�a�C������:Y�(���$�Br�7厞!*��>�C����V�@��$oa���ڋ;�HqM�+Qɳ_Tk����
��s]i�<(,�Hf�v�������f�&�/����_���ưZ�T^�����0�<�f��lw���"����Cw[�����9)}�x��m�D�`�3g��ƌ>�[jf� �_]Y���,�=`}�6:%\,I%�VB�?�U���wP��s��>��8%TGL�j$u�ܞ3�]�Y�Q��N 9�{�K�V56@Z�i�ʻP�Km�I�I}46������X�+��f
^����7�D���ߞ
��e���=?3�2�gx�Ĕ�*�A�l1|������P���y��=o
m�ݽ\飚�4�o�݇M�J��I\?�.[R~��@��s=��H>en���`��Jf����c�Ԙ^�F6���h�-�ÿN�]�zK�\E���{*w��ߜ"�P���Kp,i)�z��
�X�瞿�$?�0'?��g�P��XaۅD͇R��Ta�e��/5jN	���pZ�(I�� �?T�xo�=�6ޙX�G[~���k�R^���ɻȇ�T�	�@�:���	��3��w��*�#����sT8�.�Q�BIq
qb�(ȿ�4���)M4:֘	�`�h���&��ц�+��t<���r��f
��w�<���3�N�F������<�ۗ���:3=�d��Ҳl�aQ�[���.x��߇y���7�q2�����0�G�
?X"ǿ|w�D�O���y�~�-��ڟ��̘��`	]��"|9��nO��]v��k���Zf�emP��[���ٻ��̑7֩��ux1՗ ��~��Aq,�lC�0.P��B����=�����;Mh�`�SA���gG��D�pG���>�T�aGL]asgj�O����d�B�? ;���azê�J�0u�
i���L�u���9
A�"�@��u�9��;2SNg���X����|F�;ҩ'��8�}�Y���5O�z`Ӹ[�a_�wf�1�q�M�<�<��n99��I��\k���g��u��#c�.��f�ɓ©�$�*�y[��٢�YC95RK�YC��Nz1��[p�:U��-�..juf�jF�X��N�d7�Ӄũ��-tue6򑀠D��+�Sh�Bk	z�2���A8;�ũ%_]��e:;2���e�k�:�9q'����)�/VB�L5��y玪e�ΪEq�T�R‹��.h�!�̫�8<V�����)�HX��}Ua�Z�]��=�2~����+	БN��0�`R���m��܀iP/�a~M)�����z�P��*µ�WZ�_�t�ʇ�
����ma��~�(EG���wɚO����k�����C��-�{����S�&\|"�@���J�m�Td�@i�{.���'B����>�������p��ϞZ���%��p2Ŵ����Ae�
���KԴ'�_��Mٮ�(�0O�G߹ٟz��+�)�~�"�4�s$�q�2(}Kc���;�X~�H�'�Vߧ/U>0�z���"x�]�,|%�����B�1�ð���p���q:�^�<��,d#
?�y�8‰�3���/��ՖlgSvM�;�bW�x�}��z5�J!��O)�G��&�����r�4Z��(&R��
�=.S�jF�Qv�'7�w��^���+�F�O��<��n�d�
db�Z����u�^�	~��q����~D�_�_)4�LS�"��Nk�D���{�;V��Q���@����m*L�B��}�pN��/0���)J����Y-��v.U�ol��8k�Vh�C�Kr�����C���qb�~�#�/S�'�2M^gq�y�1Kx��u�#�+]�X�GZ7��jyYN]�*%F3F���HtR��	�<�:�5�%y�H�?+)�	5.2nF�9E����$
��5=�F�
JP�S��!�C ���F������lI�a�I{�����j6ְ�`����K��r�K>����8�-s��=�N�qg��ӭ{�0⋜�}X�u���Կ��t?�S��*�u9�M��O��� �R7�2����_��B��g�x�����/P�-�
"O�����#�]O�;<ڑ�nՐ[}��wu#�F����@gC��}�'�0���T��#�V�@p���!�g�@�q��#>!�KX<��k3��#YwU4R~4ѭ��a�����V!/�A�p��Y��N��m2ƕ�#<~ ���I��B��2rOCi�:O�!=<`���ܗS���'ʯ�g?ݪV޺�p�5��"��OT�����Ƅ�҂n�u�
9p{��:Q)�H��ޔlNf�cN�*Ej�?!:�Sb�c˓��u�l�L��J�&��wDo*���Ι6��ގdO�ǖNb���T4{��7��;�sg�������n#�kLS#ź�j���m�[G&���ګ��K�l��7�&��������d��̴.�2B_��OI�����
�4'g#ꙉ
�w��m�W�\�:�K�$�E!�ܘ!![�O�w^�z���+��mѭ�
�n�֠��#�
��+ԏE�@�-R��/ֲ�ef��p����[������rhgq�5/}�@���wV�*R���rek�ooX��iҹ���ŋ�1鯂J]�ZU�x��PiԄkܓ�g/lv?��80��JǺ�@
gBC}�)NYyG|'�_�q��~����x�-�F5e�,4�����O$
cԩ;�����v�>����L�*�b7�G&r��g������;�*��S�{�:Ap4M��2�)B�m�B?��~LȈSķ|cB�X��g�9F�wQ�_�'�0'�5��
��;)Z|Z=C�)��VZ�t����� ��ʨ�a�g����Af�3B���LMw����ͳ^�|���'����3�Y��M_�굳.X6_���5���;`Ӑ�[5�X�O*�B�K� K���lȏ!�VV:�cbɽNz�?�`ƐG6�|('>�Bez���b�r�@������=#�b2�f�.Aܓ�Y~ǣe��[�������D:��/@�)W�2��5SspA֍��sAtW�vG�d�Kѓ��2K��+L����+R��~õet��p����u�ۉ=@ȉ�mr��C�	�8��
f�X9�ωF���b,;.�!D��+.��G��d;X4&�'ͺ�*<�=P�ղ����T�t���ǿ��U��n��y��%ظ��)��@����W��T�ݿpi?]տ�n���Rםy�.-��k)���?u�s�bJ�@�������
��1b!��)�R��!����wB�8�!�6?r��Ė#т�Жܸ�V�B��bMծ��Ͻ��E�$�6=���V���_��G<e��rXu�h�y�t�S�8�O"�R@Ju3[,�����h�0�f��}�
��O��Oڢ�,MK*�����!��O������r��o�ƭ�Ɓ}4Z���J�?\Ӊ�����&��ta�h�#�Ү\]���
`x�Q�[gB!�s��$-�U�o��Q� E��}3���g.YN�lYN�5|�V�^�r�ps�����ɓ_q�C#�P�ɇ<��=#��,٥x�I�:�Ib���c��m��v�m�0o.Ln{H��ZOB���2C\b9����H�<8�T����Tn��)��k2�SQ�rj��� ���4�cv���!�ڙ�����[56|ۘyi��_ܵ��b��LZa��6�\
��\!��B[jɼ����:p����t�P7�::F?��@�(�C|Qa��R7�0����^�~��[�����_�,�@��S��s���ߪ�����S��Sf�T���ip8��n��6����ҙv��]S<p���$h��G�)���H� D�'U��'��GCJ�!&JP$@���F�$��TȐ�a�0��`�pSȳ�x5E�ٞ�<��
R=`�Q��0�����
_M�(���
�K|�z*qi��Gc��M@+/��߲����;���uO;�mih�l:r�;���e����3�:�dL���TS�a���'��ܡґ��Yg>F�)�D�t!�d��{(I�;A0�ԃ�L:=���L=��C�
��P�C%x��|��E�-�|,��H��m�w����D��2����"�&j���Žӄ�_�Z���v�I�[�9E�Nf�j����dEPt���G�P��-��de���ހC�8c��2�/y����J��(���i���x~Sm��]���q87��h��!n�=�tHu�~�BU,�k���'j�!���3��׀�6����E5|�I�J��_��8
z��-8�0�C�;Bc�Q`*X��*͑S`�����H5���$����iQ2Y��U�;���r!����	v�Ǧ�Jx%^P0:Tt�
����r�̈́�'�Oc��oI�bҠ.bu'����]nn#ɶW�+T�r,G�h�V�.G�i��&X��Y��z&�9">���?+_��.�_v.�vqI�u����ATük倎Y#c2M�c@M��D��Sj��80g4L���9�H_��o���1���;���v3`2�Ȅ�p^G�OGAdNEq��Q&�(���mT�Ƞ:`�O���Ƕ^m�y�H��/��I�s�C�	�ػ!vA0�<{H3:��;�f海-��W�@@�<�-i�?��M�\��l�<���5Ъ�〫����<��E-���Y:��p�NNNޮ_qA��_{�h�볪WL���플EV��(F�`-V�x%�p�Y�f�!�ٝ�䶘y�ƻ5��	C�9�_Rt6��e_N8O5��8䤕��E�(��f�@܃u(&Mb>�C�{��	��x�b$L|�-V;����]o���.��9[��Cd�UI��vH&��Ck{�J����1կ2�QkV�Y�UO�G#�^�v��nfy��q�E���Rm�.WRuQ/�ƅ�-&%Ĥ�9�,�Tݫqo�+��J�_�o��K�(1��=�!�#4�SO�8W�`F���$��Qk/�Om�Q�����~l�2i�Xp_���2�e;���p��Q���ޙ\B��*�$��,���W^�7yt���n��ԥ?��Y��!埶���~u�LC^
�A[c��7X
��sE]�s�ֹ�s{�a�[�S��e�r���n�[����c��lbpI�x��D+z?1�Ke�*3�����B'�H��*\0`�/�[k2Q�-u��a���X6/8�iXBH�õ�G�N���`g8�"�?�w��):/'MCBm�A�Ƒ-�3\�e�2p(��.&ؼ&�1��m�I>�
J�5��na����S���Q��!��2���T�#'�7��7i�=��R�"�9�̃�r*98]�H��9}���w8��ɤ)†��0����%��I)ҡu��)�`x2��R�3�fm�Emso^�Z��4�vw�|AD�����_�_`"O�qsS]b0�����3��N2�$����M���y����ך�2����"0�U�e�Y{-b�ƨ��ƕ� �r���'� I�7���693
�-L���%�<��*~f��p��=���Q`�9����~���o(�𿗩=(ׁ���������?�[����ߝ�OYGU�oQ��n]�M	v�MG�>���l)�������4�.�g�#�;��� �Jʗ�ю$�����x�AE0��}�#�u7����-ő6�"	̂-gّZVZ�|�'���QR[ &D�]w�1���>�2�hCsc��S�ԝ�`�x	?��s���zl��hdש*UI�t:'���20v���;�Û��;�1XC��7�>ɾz�v��}�$�=W璅�w^�,�իgǞ��d�!���>���0��;}I՗�����k�/�
�S�?�'��lt&��tȉ��)1|v��fj�΃C�y4=?�E^�̥�CU�$��7���P��U�!"�sՙ���M�cm[q2����s��C6@/���h7�k��Vd�ĥ�@8M�yOk��I�
���>�\M�Ȼ0%[�F ˚|����Zh��hͶJ��xF�.r�ue8�s!Ș�Ol�`��R����+ECn�=
�)�;G��a�}̐��G,�S��+���~�#�{{s{�Cx�ud�w�o�v̄9@��8@�L�'L�Z����PH�_bB.-��'\�W�EH�X.H�9Ht�"�oz�7f��[1߳�c�%
q�nP$�u$*���
����rp7���gm�@�`�B���2F�{g:tD����J��Q��'B�op��$�Iq�_��1�c�pfd��Hkdz���-}�����3R@��S谎�[���7��h�L١]���\���ǽ�@������-�ND^�Gy{���w@��.;;,�i�:֣R}ϵ����+�|���%��=���n?c+�ۃƗ��$����I]P�`��H3�8�!aP��DsI�2������@��1�vV뀣S؞�ac,V�/cz���}H����3�J�;[�K���8���S���f�7��4Q�6�.�E�J50�>�6�\DI�I
]���.p��)��m�!��W����N�j�H(�%‚�B+�(���Xn����Gu飸�}��f��}�SW~1����m<��}��*�A�2^U��qq�I��RzL|)�´zq����8>a؄n�n�Z��#�B���	���=��������z�|`~�_~zA���������$�%�(,	���mng0��¾k��g6E_��E�߾��.��\�K�����XE��V0��c�.�v�z���2s� @ @%9�}>|_>f/(t��C���	9�N�#����ā4:(�c�Nv�l$#T
V.����;�8����d�Yn|����e��ŗ�X���cBSH���ߊ6%o���Z]�
һ���\?R�(EC�f��k[�ݪP7�>��VA�X[zA��z���G�QG�'Š!}���j�˥��m��]�sG�?�>*y$I0�B�Ւ�x�N�I2�xZ��-t�e�zI��V��v���ߙ��:���SLp-�x���.�>7�L�ܨO���
�&��5Q%�Ϳ0pw!3��*H6V�z�}����>�9}���I�9D�g ��F'��|�Z������*�A*z�c���?o�Y�j���<�\�M�c�5��փ�����wAG����r��C��ΖҨ����LE/����[.���?ȧRK³���-9��o]�_)R"Fd���J�����fZEvH�e���>BDAn�[Ï���V��b2��!{ï”���9�:��Rܱ�	�^s៮�_�dsmX�H�=6!���N9	�f����#����?��Wp�cm�����㿙�KГB۝_�w�ioBl���ş���,�.@*�&;S��H�5s��W�#A{�P��&9����N}}���F� �eh�'�i'%�װr`e��G��o�hz>oݗ
�hva2Յ�k��w��C�]��n[<`
S�Nw�>�N��^R~{/��,���`(7`���_i�1�$�7�R1&h�59�1��t݇�Gx��Y�(�
����hV�*0 9�Ic�{�cA��ߞ��
�J��ӛ�֘����Mvk�ɨ�zz�+,0�~a�|���
oD�LR�*:�t	�"Y�H��f���'��#a��ZV+�^!1�bl���\�)����7e*���_�̽f�*��7A�G){S3G�N������� _��hYe쬺J4,&{�\큸"�p�؜�5��+1YQ~)�8���t)�T��M0�����!,��\c�H��<�#��bC�a�If�3ڰ�����L*6L�8c԰?AD!�b��4�e��m�˶m۶m۶m�e۶�޲���w�s�X��OdΌg��4ҙ��D,J��0��8��/�]3x@ڨ�[
+dSU}FŪ��tXljg���J�
��2�c�P�U����2t�e�=ž��C`�$=	�"	�k��vJЋ��"�K�
�<��N<�XnP�U���8���v@˚kC��]�}�٧ɮ��x�������Bw|��t
��q�Zf|��o=�us�����xc�O�]��6M�kİY�d[k^}ȝ�+�.�!4����ZG�MݻFT�y�>�~w$r҈���ܷL{��z�1Cxh
*���h�s�4[LF3����!��/9g�]E��Ժ��)�?!�)�U���1q�|z�y�k��|������mע��Zߛق�c����'*��z��Z�ĢE��‘�xP
75��\ü�]J���:p3���>����m�h„J���
�NŇ�rˁ�䳓��e����8��5�@/Ӯ�tK�AD���1*�љ������V`�Я�����ׇ5'�=.�
�?���G�j�t1u2t����>TeZG���_���Ð��5�`�ߔ�0�%rS�0�D�T�'�4����r��O+ޥl�UJKUU!!�l�Jr��K�?Ay^�UU6�!sn�~�f;ٻSq_7���ׯ{��_s}�` z!�1sh"hC��T�J���ц�b>b�*��u��(;J��|:�A!(�O(e�\�_��i�즔=�W>ĩR�X8wE�'�L���"&�}�46�'-��F~��#^q�=�Jbv�f�H�֞(m�V�Z��fT
��#�T��� =+
��= ��P9�i�]M�U�K�p�wT���ie`\��E&\�{�IF)�GЍ��cXk�˵�VN�)�RZ�1̕&����-(N��c	a�ht#I$?��	��C0�a��I�s�����(�y1���F��dOKN��Gi��m\e�)B��X�����	��SYjM�*c
����t��e��IW����X�`�+��[�*e�]S�5����x����Y�+t3�Xr_��9B��t�^:"W�g*Wj�_�94��(�3��h�y��I|X���'�N#c[�6�{���u�B�x�U�� �4��(vK�9� [^`��=����~�ݪ/��n|�n�Y���^!��t���I0�o$�X>��N��i�	!� �Ɋ�S$���~U�7T��L��
{�u��"X�	�XS|�J�N�s�0y�/�6_�ګ���W흊Q��f���*[��'�a��~�k��R��n�(ph��k�{B���
@�W
�G�������@go����W�x9o�)�~2rS��{h.����W��kݻ��]��)*�_z!T�S�T�kE��ܝ��B?�bwrf�#K3�Ɋ�It�y�]����L�qj<���l<�s�r���^Ve7(�>'amQ�	(AX�T�m����r�����j���uAQ;'�*uڸ�1�H�ev��w�OU�g��`I�E�o3��#ɤع�'2�+_��B�n�״����u���Y��1�a"V�m >��~7�\�]V�YR�b���kc)Օ����q����ߝ`K��,���S���2OU/*��zò�]ֱ�止k���n��ʰ��i�!��n�E�-���:����<@(�7�;�7�vHxR.4��O`_�N�����doBU��˰�ⳉ�����coomhaj��#Y�q)AԚ#��!��y����hB� �(�d�d�L@�|��N�W���yiU��뗪��^{�[c$J�_�Vs%��'T����U1�9��O��t8M��
<³Y-�ƹD3'�X�8r�V�9-�Wf� �
��znX��Z)���k�/h�
���F�3�af0��Ɓ
v�A�%03��Z��%���8g"5ۦ���k�_K���?V
R��ϰO˩<��;�tin(�U��i��\��*xt��Vŷ�d�O�wPV
����C z;D�"p�=p�$=H�bf�:�d�ν3]�.�P�J>�xhd:��{x��x,~�~����BQ�$��
S��3�
��
�������;�c���	��*#S��w|�,m����]7���il���f�xF��ԕ�����J!���sUm2a23j�./@�h��B!�`��*�����5όdN�!\�5�./�K��ө��{J�=)t�f̠\"���
r���O��$��)�%�#��<sV
G��:ͻC���Y�?�]���-�,�{j�v�F��d���B����ݎ�$�j�6��y0��*�ͻUa���~��E�6��*����PkY�$�V��|mz�Uҟ�]T���}NV�Mh�c�JZ-o
	�����D�S�S5�N�d�t��eu�4c�]_���bP��A�m��9�.&Xo�gp:���c蘼`Gay�A�9�P���]�h�K����8�m���s��)�SUT�6
��ٷ-�����a�V���,�TG�4M��Dg�!^����v�xe'?�9G�_x��Qz�����=��ZsE�����&�.uߑÝ|��r�q��6�:�*�;�f�V������e�~�s�{y��⅁a�̕X�7�^��@i[7�oHl��P~�/P?��8�®�h��Y�A�@�m�"h�J_S�фo��Tj���>�%���Q�V1Sv�">�G�tcƽm}Û�s������1��=4�CTߘ�x~�@��'\��	z����'z�����2�0LR�c�?�ۍ��Z���Y�d����/��Aw��J|�_�u�+#E��v�#¬}�Y�^h��v�O�����f�qOh��wO\h�)�7���1o�1����|#G?���7����9^�q�K�8��A���������P��=u��Wrc��ܪ�5�6��GB5j�wѸnj"?
!����q���䅗���w������?��n�����������h���5t1�0u���*?YV~I�nW�[�\��HQ<�r"`$f�ʀ$L�T'��R�-�pS���aX%Qy�m�rGr�����|����<s�y�}m���w�=s�I���(�Y�D��i��i[`2З�d2.���r��(Q�g%ǃ'���i��e������ٍ1���'-1���!U�<���l�j)�D�w�Poo|2D�lϬ�G|�|@����̨����g&h�V�*S�f�$`N����.��Z��$�BN�Du$S�f1�"���#j}��d]ӕƥ`W�]�qh���(�L��P�[�Rz�~*�ٵ��,
il�U�7����������/�jlP��\�F/�;r�*m
t:j��j)$N��?f��˶�{�R+O�`3��y��7[��[=���-���r�\\��U�.��MBoZ�]t�͠:�s$](1��G�Gh�ˇ��m��T��n(_<p���267(2p�X��}/�Tu�z�h��D_��6x�rZ��d�;���!�0����Q�A��ؤ�D�|IO�s��W$��P ��n�}$��9�!��0�_�o��=_?rn�;�;�셺�s�PB�pF�c��/�����JF2���h��.k` ��8�A������%k�7�����f����Z���lD/�_%5�����B,P�	C&���k�EA�F>Q�R`��(��a
������ٲ��/?�~\�y��7)�7��A���0T�Ty���p2M�5�'Sk:QXV����&�T�EKw�����ӓ Iɕ䛾�n�?�)����
ٹ#��s2`�.M��8�ƚ\�R�
Sr���S��pؒ��]	#|�b�,U�e�1��)���9���H[���uDd�E�f�$m��sǡ+��L�)��|)3�5�,�R�*X������KM�L�s2��'|�)H,18(˕�\U���f�r�bSj�̝s�b]������ׅȵ��Qΐ1�'f��pqǟ�&�b(�	��9
d�DS���i��;I�-��ru�P���K��.9���"YS��K����g=6eKd|��
,ծ�HMʮ�-UEKt�*���ε������q[�T6Ŧ,�6eK����uK�ǡ�YG|\7%Eqs{�S���ŭ���c�W�-ֶ��O
n>w�̦|���R0���9ܵM����9b�R1���y�9d&oi]��[�C"����h�9	/�R|$!Ȱ<�%$RxDޤ��#\5E}4j�89jª�
��/��1
e6��R�J���y�\!z���d�a��,/U���2ñ8\W���6
��>O[1�9&O-Ew�بŪ|���|-�H�n4T	m���0ʨ�B�S�|��X�N,�2B�.�N�潌�bT#&~F��\St����|����8�~�Vhش-�)$��T�gR�xm	����1!��l]�Q16-� f�Ȇ���stU���r���x���7�|Q�(X7KUVx���h�	#5n&
:*j�<����U���cg#gGG�;�%9�Ǯ�PQމ�����j*Z�D]5s`��4L5Q�t:�����Q�dE]f��A����qd���6�P���r�KvHB5E$��½��t��|U�h�D�p��V��xaZk�*ȽeM�g
�����g됩.���T���qij��f��pz�8���fR�8�X8J�h����1�>�`�LIg/7��[��f�(��˰���e��Y�墊��"�L���Q$h�xQW�@U3����#)��f������7��"
Q�h��vy55UTq�x5�ޖ����q�I��yI�T�9c4(ږ)5�&&;?�ap8i�!��΃P��*����K1m]H0�f�t}�a	���g��A�z�FX*��QR�������h���E�j�,�]D�,�'��"lL3ծf~��ml�����$�l�W%�F!l���r��i9iѮ������+CR�^2Q���SM�����Iږ�O
E��剒���"8Xv��h0T���JZ&ֲ'�~�[��UE�����Mb��Zy��-�4}�5�/D�Z*<����,b-lg}.��g���M��Nr�Uq���U�G:����*��	����nEN�&�E�{��:��v�zd@����Zm�����'u��r<0�a����`0��G���Ņ7����æɉ?�)j"Ru�B�4��_^��-��X4`�K�tŜ��Y��y��W���"��2��ώ|��:
���/��K������_Z�+1��0��ߝ�`p��n���WH��K����K����5�W�S[�2���
%� {�WX>�=̓O6C�$2���|�"JN�]�r���AX���>�@E�ʍ;�k��5�6~��N���%��U�<�R�E�Q.�1-#`E%��>	p�����|(n�T��gB`(���>L�����a�&����'�Ì���58\�$��-z��&��ԥo��P�i�\�\%�)�q3��"��q��R��󖊴��`W�Xy �,%}τ��Fh,(�JC��-�]HR�r�:,�!�,5ỉ�����7*^�(q�g�y��f��ȳ��f�@H����RZƀ�A�Z����=,i0�Gz�	@ �a�y�����_��)����ψ��+�ˬ�A�Y����b��r��d��b-?ť$N�������`ϊ:U�D���Q�@����**e��Зg�d(ME�	Vt��v��vP4���0tr���(6|�q@�t[c1�Ί��>C�v�(ͮ.^����U����2;��?e�u��h������wP�[X&�mΜ0�I y^׮�_Y֙���@3'�m�Bz�y~?~�aЅ�򝔉-��O�O�E�V�fdb��R\Xe%qY��U:UbwEG"�i�����9&�5>�۠\�s�妠�Z
�%nᖕ�k�hl(EUM�K��g;�x��@�I�R�Ck�G��8W��bñ%�}�LuC���}�t���JLqEU����(�L��H+ao&�5���t�wء�/�&���hik�s�Vwə���y�[����RZ<��B�O�XN�R����" B�Kgt������C3%������mMMUEHBS�f�������?ʒ&���K���QC�r�/�إ�Q�Z\GC���&ꮐ�E�rj��i9�c� i@�igfT���M�R3pX��~��\��=�h�M1���aA[���k$k�Mv��6yw��w
��&�EDс��"��<G�ΐ����M����
)�,
�t���XJ�a�jL�F��T�)��Y���^TN#[#�z�S��]̕!�M���D8��@��7D�}@g����/�ʍd�n�Ӈ�f�$9BZ�˫�-�&���Zcv����1f���[��#P���;��wI.��)&�&'8��wL.AÃ����WL~ͧh�wR�a��q�ƛ�f��>\ʭ,��B@�Pڕfg���j`R7��@��+��}6R��l#N��)�-�$(�������0�؀�ufjۨ&�
^(�-�Q��^�&�MNhgک���Z������8S+׭�8�ᜂMbh��5hr��`�գ�΀t�@8�$|&�TK���qB�'A�&���Hx�@��j?�F?��VL��2�7�w;2[?���ި�]nG���7�B�X-�Ӌ��\�;(����y� 7mB\h��	�T���G��\!<��N%<��w:@�s� �i�gbfn+�[��T9�m�*��N�=H�D��=��0G^$'��Y^ �
�D�u����8f=9�F���njZ�^1�����x���R�\� �}`nV�⡭��G�6W��nC�2sZ��u_���(O젒D���:�+�g�3�����ǔ�mN>��/�/��?��`B����
�u˗K0���N0��Jf�#/��.�M"ǔHc��&�R6�Ʌ�Z��{�@��a�8I�/0h���YC�`9̀��%˙��5R��10�5eO�EPN�y���ە�p��)
V��։�S����{�kgf)�L̃�:���7
��$B=����Nr��ML����q�ڶ�D�ޠ��8��w�*Ҿ+p�k�\
�IS]��_A�48�܈�H�p�����K���A�^E�.����� }��ѡ��K��%���z��^ؠz��f�R�]T�Z�
*��#;����3N+�O�(A�JY���K��r��>LԧP���4ς��}�r!i5T=�. �8��BP��nL9ca}@l�a
�I�������6�e��٠.5,*�����~���q�D+�сYT�i����������esa�q��9�RGBZǎ9T�ـ<�}U�*deQ�	�;1�WN�(��������^�PmF���v��~tA�>j����
ρ=\�d�D+�U.@�FǮ�� �B�g�=|��>y��X����qX�_�ѿؐ/vW��`�@�
����,�>Y���<�ڣ6��[w�Z@�]�_�Vz�PO�;;��N<�Gy;\�tp�f�7"�jM)<�\�"B�ex���u�v�ž�ʮ�c�w\'#��l����+鄯R�lR.����p�V5������
7����&h��B������ݒ{��ݙ��79{�?��WBJ�
���k�h6�aE��c$-#�_����r�*ۚ( �)̒$p|R�
�����Α���w��_ ��0��Қ:_�:�2��,Zz�^��Y9T0�Rd�8�6�G�`�RP
� �(|��)��V�%!�mﴵ���w
a�u�bPr`�B�(�7�'O�m��C�'�,�1L�okGի15��U�f��J���5��e���$%�$9�mm��T" CZ=�R��@Z��t�I�DdB��p�l�'F�h�Bf�Ƅ�J,�-��9ŷ��p/N��1�;���A�ླa血���
i�����A�,q�L	Vτ�H�Em�PF#�r<v�)E��63��;`?n��
�O&|�(|�$���qֻ��-1x��RV"�U�y�g)l���
��@�f�Q��v	�e]H5�0w��I��['��䄶@9��f'��T%�,)N��TMW��,�<�����C��枀4dn�O6}Z�&�P���]�����qe���b�	����6|bh��m��6'��d8���&��UM_�Z��ziEH�OFq%8_����1�ZQ#�oIeI�MZ�O�!���Ð��t/k)���}�c~.��g¯�;خL�H�m7(ë_�H��76��cz�3�[������m5�,|�ز�DB���}
�6[lْ�!2!i�eơ��R �(����j�9�v9{�Q�=�0�c����~��C�`:t'�:�i�YB�����p�|�m�cۡ/:%x-_���g;o#���Z(�K�Sb�!���=~�[�W�����ol�3����e�|`��>�#�p���m@�a��e"�≟���kJyǏ���p����7�+���m�^h'�)
��rH�M�v�mj zk	3��Q5,���Q���/v���t��Խ������jh���9���U
�y��q���:�!T�|��
8�PG��&
 ���`~L�@JnC+ڿ`3��&r
F��s�5(�sv�|<_�J 	�mtVҀ�6!�ZC���jAȹzG̗Q['�v�v_�����[S_�/��%�?���+��-�_���y�G��[r<~����tXB�����=~Y&ˑ'�b�4�N��eV��i�4/q�MfsJo��egh��u�I��t�>�G,���'��Ϫ0
��iY.��Ml�%0�J��l����z�A~:��#�j{���\�&�zI�A�
N{�ϡ;п����؀�����V�]�0�5�(2]@ֶi�R�f>ҡ9�ѻ�����XL˸罞��C�G�ڪ�n�qOF�ڸv���W�����y'z�T5��h�Y�"�ƹʶy?�d�5�U
�^��ltJH����q�}T���8��6��y��7����X^)#���ꈓ�U`�(��zx���w2��uj蹓��_k-� o_1*0�|���JXG�v��(��RHZ�B�Ke��Q*�m����� �<����cj���3�JG�_v��Lr��
?�A"0-E�9�R���lq��;�/P`?�Q�\���~S���byZa�Q*yC���\.3�Q��0�tn�>u��x=�g�>�2��? �lޮ!��~�
��~���9l��{֎�b�\���g�u��� �~ݳ��(��@�AtaٹNq���m8�_�N�y /��a�Ofa�՞	i"Bd��#�v�`�c@�B��ߤn�o��qi�*j��]��
�,o�+.S1��(�a�W�a�E�n�z�̲���j�ݝ����
����g�J��п�v0�al�����:�ǯBL*�����}+��w��;p*�rRV��AN�@`Hl}�]w*ʹ�C����Pc_�V�5>���׫Fsw`-��i��-�9Zˇ7�h+J�eJ��k������(7-��a^϶_X)W���:] �m��C��=-���͆����9yq� ϋDoA�&;岈d���
�N\��(��kj���s�º�^��Q�a��J��l�Q/��"OY�սd���g&���Qسt_�{�՟0��yⱝ:A-�q���i��כ��ϙ�,[{F؞[UB,�ҐE�M������ud�O�Ã�2��5r�
�~����+�¸��9#/�\�v�yȸF:�Q��j�;�*7�������`:!����������s��22�7UcQ�i�pq$��b�#�k��t:iF)�<H�O�$�>��_�V\����#5%
�6ruȳ�(;��7k�'6Rur��3�;riuάLo�%7��O{��{=������&�Rgle�-ű%//�aHzX)cPK��ZW��ux��%�F�𦠼`x�
(�[w��V��`�=�V��J^��)��zy�,�"f�p�<�/zݫ�[�*��eTr� R#�����qٿk	���5��I����bi^Ь��a�M��0$�>&���.���Wd�~�,f��j�s����@��W[J�$:�nY
�W�vl��H���R�^�'n)�3�}��wL{�Mߏ@�6
���~�6���k��Oj��h�<�ń�I�"�͹�Lb�Rk�gZ��X���	B�K:l�_@yK���#�j�����	o�^VH��F�?���+Q��+}w|iP�n����P�N�0�f��e�i�3��E<n:f�kÁ�g���.۴C�J�.F�[
�ضY-0w�x �2��ʏ����|�r12�n����j]��������y��<��f�haܬ.��f�X�~Q~���7�����k�ex$�laK�9/1+PN����&u���?��8+���7Ȩ�g������I��'�čj�<m����(C��N$1K/8ʠ�|�
;2���b�2����'�i��;�|�o}S�Țt�s]�^wu��N��#�B��wDʟ��bb!�rL��t뇻?��!t�e�=�8es�=��%g�O�_��
�yX�a�)��9H�����V^�=�LJ�0:n��\�چ(�ib��#��“hs�j���N�Dֹĕ��!�M�j77��m��<)4+��+fk�5hwn'�@��\��z�۹�t��:���6-�y�<\l6��פG�`K�
9�-�;��K��G'��X���b���!�>�4�4�K�F07��Z`8k�/-(�eȅ���s��XVbX�DT:�v��:I�^�c��n̠�9�,�SN=�O䉇Bi6�I�B�>�yYz��K��.�zYz��I�V�W����v�|7<�B}��9�m�3O}]����ګ�.�~e���+��j?�9�s�{:�Zй��v�����R����bi�{���V_m��e��ׄ�S����f_�J%=��F��rz*�9����i�{�S���&Y_�ҞJ����K�]E����嗔ե�T�e�T��������zU�^Eէ�s�^���x�4/�iU��
�j��J��5yEuq+�b�sYUrk!�?K�Y�v�[�Z0�r֕��2O��¾��=Ů
���Z�OҴ�_b8%����p�%nQ'�a�~�)+Zܲҫb�W����nelJ�C�W.��e�Z�jE��E�6W\�qn�je�u�slV��Z��Mj��e���ժ�7���BWԶ�Ϲm*����W:;b�	�t��>
m1��i��>Mnh�u���-�o<W^z��}�V��>�nԻE�#�V�or�h����V֯�Zߙm��H�~�W{�Z�+!w�v�v@�6��Ŧ�������̜[�ƠQ`������Е�c�s�F/]�R�|�v��Qp�>O	/I�B
D����́��]�s�F�Bm7��FvS�s�M}7-s��)�UnA7���N:I+��
�䇌X�i�3�f�/�U�q�F�=�UD�ڇ^ݲ_NK�=��g�s�Vٗ���w¬���z���g������1^�x�V��y��//���{t/�%���w�-��M@�}_f�)�n���jW��M�������{lW��M��Q�;�GZO���-��܎�L~�Q�#���d<��/����K��[�$NL�;������dS�'Άs��)�e~��3fL���GŻ/�F�
Žr�$���Y�����M;�_���s��s>?dƝz$��M:&`p�(�����蝿f�:��rsֻd}ژ��]�2���^N`p7�"�B�T6#�z�rF��=1���h~�S�iN�s���D���T���\�Ϥ~B�z��6��_u��n��;�ٻ�
�;�ػ�s �j��?h���m�ܥ�̾Q�"�u>��l���_��J�j��S�Y���W�W��N�N޸=�k����~�Z��[�d
ܸ��A�~���f���?����7�_�?ߥ�P���|�w�Kg��l���=������m����d�ku�����=&���E�.�ƽ{��g�|,���K����w!c��Í>f��},�gc��y��M,�O?G��ͩxl�����'�1���ڐ?�5��%r�]�\�8({򀇚�!Z!D��G,}������L�6�_;�v�k���mm�mϢZ��?�h�/��yDL[��;�D\�E�<���2.n���ڣf^��{��z�s�z���Q��;E^��W�Z":�Q���#���E�>P��R1�z�N?T��*����y����1/.�(��FM����*�^bєyPFY�Qיtf^'���4h�y�"K�:S�:�'v�μ�"��{�h�yޢ��r*^�ͼ�QT�|�kI��4O]�3w>T3O>�3>�t��Tt�Ak�äz�'Oѓ]D�ڻ;�)�͢��}�Yw�n��c:�����[G��v�3H�]��7Ď�/>��:5�zt+������\7^����k�m:6O����!���颕���ɏ��͏ŽُԵ�/=��o��o�s��G,��P��U)��I�N_�a|}����z�%v
�"��X��D�w��rŻ�z��EuJ�W�Hs_�a���]�����]��*�d�i�t��v�}o��3o��co��+oI��nJ��$�W>$��d���ջ�]Z��vT�W������f�������a��q�@�s~�ϣ|2�;�h���a����o��l�����	��)߮J/�)t?薯�R�?|g����GM�~Jl��	7_��:�jx�g~R�n(7!\։�R�@~��"&e�7i4OA=��	l�6h��ä�%�	��Р��K,M�D
�>�c�o�ur1��EY#�N<F�qR������E�P���(�Kg.����j>@�0%*l�Ԓ	���ko�����Y,��D�����O�|�).3m�ê�';��S��OI���2f����m�	�`J��PN����F�;F1��lP)H31��!Hp_��a)�,�Nb��,�CL��X��y� �h{���N(F鐓A+L#��^ �JC��(@������
��Jb7����~�
�5F|�*��>$ds	�N�P���U��0.L�=�8�U*�Y�޿�+I�2*���Q:����
	ِ�ֆ>vH�|�ĘE�<N�8�,���\)[jm�H��kq��Ӱz��2��B�#�\�a�|"��5���B�0Ƒ�'��I'-]�z��ٺxKh]�BV��9����=����#U�I�V���i
{��mh�{���{N'4�վR'Z��AY'�-Z��n���h'�.����m	������.���y;sڣn��Q�I�5�7BRwa�Aŏ���6�G�}�djm[C�M��x�����i��w�C�~���aWY��y��҄86?\�#�� �7�#��<'~ؔ�!<c����7�d��7&��X��a���_��
r=p�ǂ��{�o|� k�"~!Ͼ|��oX�c��~�Z�����x����Ji!�������_#^��P����E@=�Ve�O �(mL��YJ4�~e
�Ҳ�vN��T&��a�m�S��7�I�=EK"�`�'VS�w�;;lj��+�L߽& ��6�"�eiuNq�r�BKC=,9����B�˂JW(ߴD�%�����d���^��\�A�8١o�
k5b�M��[��%k}�j�c��oVY�3�]8��`�����^����66y|+��㵕ʶ��w�D%��L.x�2���� �����_(Oi��`��+� g�J��p�˛� ^7�ޏ3�;`y˝D�(=����^�̏:i���ۏy5�;8�[��m�2���~�HQ�މrS�3���[�e
�V��p�74�όx�CAl(������r���w�}7��k��@f7#���I�&�"1e=щs��^e�ϊ��q��=�D��j%��i'G�z�@훈M&�2�lV��?��g���,��A�|K.����\�|)r����%��*�g�+��'��T�1+�a���.��}y���Cҟ��"o<����++b\�(F99��2W��$��y9x���5�O%Z3r���w�O��۽ \
���p��lVI�;�!�]lM?Y�`d
b�:�T��X��>��)6�)��3�:���5r���=d�v8��+N�/.��~ݽ���Cᐙ�D��C�v.�����G�e�������;���<����m<t�a ��^U��/LT��w��G���W�3*Ճg���H�>���Wv�7������iU�c��z�—!+�
U����j���5͙�?����*.ݮgB%�����T�w�m/�b��=+�F�\��3�7�bK�v:c(�:
O@82{%M��Ԩ��N�)]���	���5�Er�Y�Z�+*��4�˸�󦪙����YKI�킋�ݾ�z�t=kM��c]
��Ɨqȱ@�Ԋ����B̑'���x��H�g�N��o�f�긗�s�%��tV��J�ή6����o�
#b���b�BK��c�Ġo�%uk�p�5�+[�Z�؅�'��N��`I��t����������B8G�@��[�:?�Rp�����'�ģ��I�j<]�^��s?�����n3Z��~�2�+J��l�|jLi�#�ѹL#VI�yV�
�)�FUΤ76�,�Hq��O��H1ⅎ�e���r2���T.L�Q�|�I�xt\��~���8�N|o��S�Q���e���q��P�WeR�b�`Z=���9�t��)�e_�
��Rw�}��)X�(DŽLf��O��F��w�ï�,쭋#�$�V�I�=6�ȑ(%+�!��L�(�FZ��S?�1����|=\�jA�|�ULU����'�L穜���\��!���j�+�N l���i��CNy�֨�b��`]->�>�[�\C -<ľ2>�<�r�r��@;Ȼ��ݼ�_��lE�M������2YS[%S�JѸ�9�Bg�$�e�bWV��sY<!� BDa�^)(o���k���*�̩#�K
�~�\�d�痛�6D�B��HQ�i`�����iA��<Z�pA��P��,�dƒAqD6��5o��1��~�0<�-�ኢ�.&�I����P:щ+�L�3��Nyg����>�!�B�UQp�/8*�q�&
��猥��o�y�g�y�d)����7�?Fst�==�[��D�b��O,��<�q�
�{�v�@�9
��y���W\��}��~Of��8v��
HJ��j@����`����ŽC����i�4����k��wp�����}U��tew�ʘ�"'!5�Mi��9���³y"��%[)�@J�1��l��FfL� T��1
��[��QE�A�$N���sP��:���V+V��o�wK8��:��R�wm�7cfBK��7V��e"�P�p\e���͂S`��� �D4�T�Y�E�F�D]�n��m�Zj
ж�`s�6��|@��~��G�i�S9��L��4CV���$G�L���F���nآ�R�{���ҡ5�Z�i6�T'n2f��L�J�+w9'۶�B�̞٢�q^�T'9]����x_�
�;_t¥�1�f�rI��O�?FN�∺�����`��B-��ƨ.]�x�E+��Q8\怜z�W�������~��(�8<
�E��6�&�\h��5������d�D��Y��Ӭ�p0����8Ɩ1���؞w�"���,t<<���+`�F9��Ne#�
�<�;�Ki�,?a�Ö�9`'sƴȚ�L`X�HDb�UƯ��E�d���A�V���+���;J�����}��mg�	�w�;��d5�يF �0`�l�!��f�@�dR�>4���U;�0~��|VS���O��@����l�_m�n=�ּ�]�*4r�k���SJ6��27�@k��n<ْ��'9�A���ɡ��vS����t�s���Y/��##��C���E1y��40F�3��0�0��3��;���s�!�7Ly��-�gr�Q��RA����ܛ�(��?Ýg��E�w�F4�����[*��y��[�Ht��hn=����"�v��x�M�t��XN��F���E�D1���,�ťWG�U�T���6����֡�~:���khOމp���S�Y}��|�Ħp�>����]�aH&�d��>C����m�����:�7�C���L�TD�0,�V"JD�’̴Ԅ��,��I�zxw�����7��&ۦc�vұm�VǶm۶�c۶���ۻg�=3�����_U���Ҫ��x4���<kX
gVB��Sh��Z>��*�Z�>Ӡ�1?�2���0
��h��|�|s{�:���y�����'3V��E$��g/�?*J�(��S��|�)%�NH���yEN(I�=U�
`��b`>�J���$��x�ט@ާ��Nu�0��D���^����)[�OI���x.�ֽ�x{�lw�d��H��z��A�_�|�X���x���tU��bV�su+.-~�w�P�	Y!��I� ��;MD`9Z�T�\�1�����d1��eK�&�1g�K�-�����s�Hu�K#�;�&;��)�wҠX̃�,V�Ή��
ksN�z))���bG��Ū@M|��@@d&�h�pyS��Q�eMĚ��6Qb ��~b���u�R%�rGHO��B�L|E�ɮ͑�ɨ�a�V�>���t s��Ų�j�-u7����W���W��̣��H���d��7H�W�urB���2����5Evb\�A��y V�n�z��7���Ӳ�iXZ*�^�b喇���:q���1���:���(jFX$�_�֒�W�1�hY�Bav:��õ{R�C���J�C*��0�[�LP�G�cu�9i��''�|-���?��AL0:&��\�&�w�OfG���يQ̣?
�~x&�=�^N���qT���-�[E�y[U�w�+���o0�/f���{�|����K�e���Zۊ��	����%��������~�q0o�H�p���z5��?��ETi�?@�vvizdv�}K�ļ2뎲��G.|T}n
�+uú���d�>s�$�6�C��h�y�e��h,$�Lb.���̉Z-�bQ@��dOJ?d�Q5V6��Pq�\�~��F�5�.�A��`

{�Ftl��w*�W>SL�o�Eըf:�B����H��F��%*i� $+��cO�zj�Z����}�ر+3sk���1lT}��>�j�6�4��o�B��O�
��,A$3����`EE���u��lc����"ݶ��&��)�}5�%C�2��]g�{�l��D4�K�†I���(�Y'�.�Wޅ�sdO�{As�EJ�U�EL����B�_�0Ʃ��&�6ac��$��)nN�&�p]NiB���l���p#O��0�~���8�1�n�%�<Xբ��q7l��3Дp�ʂR�m�z�vg��2(���䶹ȶW.�C�sf�v��M�݃]�2�%�9,��+�
g�^a�.d���:��#��DMTZ�"~+��Q�8&��O�č`�AR��|XM��0D�^I��U�
�ב�k�w�|A�^�x��[�1��ʹm��P�m=�
(�c����G0�޹���c�S�DN���Jǒ�����`��әO�/�2��X���Nu��w��wD
��u���tQ��E��׌5`�p��Žv��k�/Xno.J{x�üe1�$�<�i�}��p��"H�	y�ȯ97:#�����áYg@��y�(kC�`K���:�W��%^�<�S�_��S�#��v"Wb�hz�7�kE�LK�Z������[7��h�04�<?I�֣��$ߑ�w�ݬ�y�P���{�r�,��T��-6�~���^#y-�ۈ�3�X�W��ޱչ��U���q&�9��]3叀8�܎���\i�t����ŲwFj��)���΍�a�ٽm��oO����tWKbŠR 0��ι�"��c�s�"a1�:ύ�ٷ_�s�PC)���Nh>s�3|�#����t���EVh��x�(����p�5Ҷ��~q`O��J�Z�|�Q��T4����#�|e
��W	��&*X�$.kH��@��-�w�G&�V�~������i�m��"��."��Q���~�+�SxI�d�
4Ǡ�}�:��h$�ᆊ=�����}�Q RF^����s�P�+�/`7�)�+A|i����ަ\*%TZ%%���e��4���s�CB�����j������2����p�=B\Ԛ�M���ӯ?��"V�
8��߅D�#�Pt�v�sv50��ko�?YI�>>�I%�&�j���(�F09`~��<fh�}���VD-W8�b�6&������
�t��;r��}=8�Կ�;8n(ᐗ	���4"�8A_��@��Z��=�4�T���3�h9e@AH{�5#DBX��da]��Z���Lߕ�eVQ$��l��	y
���wf���$����=>�j�l��|,3q��8�^���ht_|����7�n��-���������9l�y@�A�A��AY�AeD@�w����~Nd*���U�/�/@~�.�g����O���O�suV�9�҈��cS(Ac`��c�r��*Dd: FD(F``��; ��=|$�+$H�cء��,L
|��c�C�şI�3����tl1��G��m-��o��4�2��ga&H~\����(���ٓ��W(�
QZ���JGWC����;�	��Ϩ�-��x�����m�.3װa|�.��\m-�����h_5�c�f�q�wU�W�k�o�i9H%e�H!��6����C�/�_��L	��܁�d-�i� ��k��Q�����$��ʘ1�����>����T���������˝8���);���.E3�$�o73"%�UOyw>
g��#��vG��A��yS,���f9d�g����KN�3e��>��,�����P,��!�ڇ�a���B8u�B�jL&�&#��H%��}A�,)����S�õ�Vī�l�`��QN���D�+4������c��]ӳ6�����I�=�ȟ���z����
4�m�| 7@Q)����R��'���œ�K�5Ϧ{$:H��`x�7�Ӊ�)��&S�w���/7w㪦jB�|�%`�Ġz;R���t��	��F���c��{��n8h���w��'CHoeYV�I�ʗ�}Ѷ�~���k���D�/�e8��u*GЂX�;OڗV��4n}ΝS�iҺ���O��O�	���G>o�n��oI`S+�/[�ݿ�CGe&�.[5?�9�Rd����b���!��q$IEb��fT����9�S[�Q��m7`�*��K�X����h���&��7(ۜz���?t�[=s�Fs]�pX1z���3���bT��L3��]�WЇ�k�b��#��.W�e�+��dN��ë��eg��8ʞVD�>�-�k��#�8Y�E�k�t
���*Kp�Thm��CCT,Dx@J�c@��n�遞���.0�S�@`�Z$-a��2�A'Oa�N�
p��G�݂���Ր�9�s���w���\��V�Q��E�͉��ħ��A���$�&X���1�ZB`�~�;��یxK�=���{�p�(�YE�zr*���X;ª��3yu�q0��+�j��
�w�����Y�Y���q�����
�Χ�yr������h��7��AQ����$6z�T�ƿ�C��
���s]j���h]�s�u��ؠ����;����,��0�S��2�.��{�l%n6plixGQh��5*�����#V"]��~�Y{�VA;-�!u�@�s.ɽ�$��	�s���9D��5�l>���O�շk!;S��Cg���u�<�1+g�N2���UO�jǕH͸8R�����`�p��݉~�!l*�T�s�49�oK�|�yl�c�X�XE�ց��a��t�liǺA}����
�&s��o�ey��Tz΅����隣�&w���i��?W�=�^*xu��qk��nL���z� �Mv��7G���Y|͢�r�R���k��O!c�������-#z�e�8WR��e���(��2Ȩ��D�7;td��4�y�S9����)�s���v]�[�$(:ڛY��O�e���i�f�_�A
U(B|��]��)�x��f��6`�K��ͫ��(>�q�$c����C�{��$��o�
���ٙ�vĶF�B��vZҺ�HZ�����(�L��Q|Lt&��g���b5�
��F˨����Ѧ*�Ѷ��ݛ1���S"�8����4?i�ĦnZ;ț� �H{�y�Ut��ظ�V~���j:b��
v��J�}zf$�M�x�؛ۼu�>$��N]����$L,�*�I�&f�˷:�C��b�����Z	F��6\���W*7��c�����i?{2�����~�2L�zQ6��*-2�p�
Z�4B�
�Br��T��KD�.�|s�Db�9iO��v����ݮ��x��o. _Z	,�	��.��csX�Ԋ9wUn��
�i��z�pp�C`�Hӆt��3C|�'=��pρ�WOx����.ٸ$Vr{���5�O�わ�`H�8/�=�<:�B0n���lx&����<�Fh3�ƚ�IHM>�Q�<Gp]%�;� �'_��>Z?�Η8��贡�){�.2�AL����]z�ws�%*� �����8"��?+5����-��u[8���3R9WEE��f��$�
G5�����B�`֏��`2O1��Cb��R�h���v����畴r���I�����a���罒�����4�����/���-a:H�0,9㏄y
��N��}ШH�oa�iB�b�җ!�^s�b�*I��<��ǂ�D�,�X�~b��dPh�dAW(��		ќ�o�B�?�+�^C*���g$�w�@��u;"}g�k���՛�П$�� W�-�{�. |��NƮ愽����y�q�K>r�������G{M(�̝�c�i��-T|��X���ü����.eţ�^h�N��Ly��i���=z,�/��#�}����(gU��|X����+osӊ"M0#���f����q<IG�)�H"5)��!e3�*0h�^�V�VR9��{7��u�츔�}i ��F"1k�T�?�v*79��*I\pDc�c#�H��A�;��ll�T�v.�oW���r�N'z����G}w�f��ʤ��7e	�_Vy�4�A��q�u��`L]�֔37��4�V�FW�X���)`Gؠ��iɻ��p��dG>�EQz��	b��`�$�k3��:a�ߔG��	��|�=7�մ2��&���!(��Hj���>�;�����
S%iw����֏A��ao�����w0[CpPʡ�ɺ�&&�i+U��lGΠ%��)zO,%�J�j�LM��)��9���2{ग़�8���ِ̋ulO
�Ʈ��5�p��A;8�X�忚�w���T��+|�e��Q]!�3%��`"� F'gKp�݇��f霑�/�9�oR�*v(�A3���N'If#6yK�i15�Fe�5$��`c�Eu���ݱw
�*��+���ul�S��7�7A��$�S��}h1�R�T6|���t�h����9sP�|�Caɐ�(�Nm
E3�����n� u����-9�%�+R8�� �{�A�o����KfŨ[�����o܆�y��+�ʹ�Goң��F�v����^�,�K?_�s���j�4���u*)8�����X��D��K����G<�Y%i@���-�!�\�{��.�îl=5�z�_���p!�@:l�:#TZ��]�Qre�Ľ����$��6<���2�X�ݦ�aCi�Ȉ���euՊ33�����r�gS��I�W��|鏉IK1�����L.��3h��R'���q�WԌ
J҇KN��I3K����"z�h��"��>��S�;D�1��>c]�@�j=lV[XVz�{4��;�e wډ�ʰ�_��`�W���A�lT�w��|~\��:İ����D�Ϲ|��P̘����)�uO�����MC�g|ȷ�/�����!϶�̶X�pDg��T!�udM's��
w;�$$��L��ȏ+�[�7�/B–=�w�I�`�~�1'z�b��5���:�{\N�į�;����O��P#k~�[���\��^4�}�ӡ������ȿ춖�7r��0���i���-�2¶���|J�`��*,8�r4}�%r���x��9�H<EV_f,x"|�|`!�|�)�G�~��/˩I��	�x��")R�L�sj�"�x��%g�š����VצW�����2�x�n-ҥ�4l*l�H�z�3�X�(,�1N���1XV��/q�}��LG���d2��B�ёئ����L$d16�`H畳@���Qg΋�~\'���a6�
�vCW�`2�����
M�Z��z>�,���:IGt zt����9-<Hk
��>eB+�0!VVQB�sU�siΰ�]�*	��[���^�<��5�y��	]��^THl��:8����p�|��
�'��|���0�}�f�JQ���Z�ι�<�8^���-�ʵzJ�"�Qb\��0��D
t���S|c6���C��g���	��C�T?C͂��V�񵹊Hn�7H��N�&Yc��3�Z�YOʈ�Ƒ�B�U�\,4�ؿ�g"1ۏ:��'M3��p*jD_
��:ΩI|e�ð�n��?�5�)u�+ �m�ȡ�����IA⼓K��ԃ�2��1��U��~��{��;�i�lс��Vj>��5�gX���<�Q�(_ho�1ȑ�w/��WϭW�1�j^�b����w�Q*Z��hs��y��ܫ��/kS��t6۹�р�9�
��`c��s�_��t�Zm�V��$�n	�Uw��fJ�7�v2����hnnoF��X�=�З��H�MFl�?-�i��D%[q���-2ӫ�vs����]aa�Q,^�;�mTJ��k�gx��o_����s��M�B6j1��I�Aѥ�1sJT��x�eX4��j,¦�DY��W+�S<N�G�+	���W�L�1���r欗��niڰ��~��n�`�W�NY�
��f�'�~G��۝�ٔ8Zv"���Y�t���=g�I���"��^�?�v?�.y��Ѿ�ģK�=�A�<M���-�*�-��-�,IҒ|�E�"�����{݇�z���h�
�#���k��#�h
~�
F�ezCQS�:��#�7I�������$ݵ�p�B$M%�#8��&6�Z~�[6�L�W�~T����N��k��zPޠ[c+7	B�H爪u��^�����0�����0����Q�|½�K+�N�����G�LII�iaKm��d�
}^	�����\�)�����m2@���7�nJ��4O�����ix�.`�m������)p(�M�Y���<茌��Db�QO�S�����h����z�C�Hub6Y�@�,���]>�$���ǯ\~����ؤ��}|Y�1]�H�b��ɻ]�����Ɔ�j�q�L��!�[#bb
 
����C�TҬ�'MK�{����n>��Ƣ�x���e���p�
���I�ٮ���L����E+�؈���j�K�G���t��7��V�{&�Xf��F2[�E�Đ��5e
㻨��W��y�T���5��F��[�ָ�s�v��������\��@�~U�x[]g�l� �YKӋM�}���d�m�G#�����rz��!T��[0gwC�r��j]��3f3�+�������������K�'n�vG�Hv�w*ū���I�nɺ7���e���K�O<�{���"�CX�O������~��Kl)���P5��O%Mw&E� s�Dy��n�¶�7�+Y�[��y�K��h�l�%�;Nuq��S�p_a[[��7���0,�r���9�q��h��Xw.@�
h��\lN]�!]�3:�}:$�m:�:�v=�b]�G>H��^�:�NS><T]V� ���}g�`���n<����g����PY�Kcg��]�c��� ��<��=T�!j�9�7tP�KQ�
T]=���(�$�H�C����Aë:&o���ۆ!7F�݃]�%+v�,�a%�0�I0{�� �޲�5	�t(��<�C�}Z�~��?�Tv��}�+�� �n�X�H.�X�6���������ߤ�{��]A�\����7]��������x�&��y�_��U|�k�S
��<�b����cz/8�L{s���AU������p��@���s�isE�"���xN{�T|��M�	m�;��1P����J"�L�(o�#mMZQ/Y��9��*U7���H|�.`Q��
��W�c~�;�p��(�X�8�#�Q���駃�Ik�A$����e�J�^��WM�W2�o������VC�y���4y��{�j	�U��FP#�s-J'G(�\�Мo�-�Y��O�Pe�i�E �d���8Ҟ��Ǡ<d�e�Aye?h�����(�G�IӰ�$�_!qI<�������
�hq*��H#����3�A4��-�0�&�|>Q�FeUk�p� ��l���@��47�x��ჰc�ۅ�H�#v����O�MZ�?!!d����o}������l-��{
��º�<�
�� 	���@�_c�t�+�d\�aR��I�_f+(F��f�"�{�W���Tr1�����v�솷󫘜�s���=>Q�hQ�a�i�D��rr��f�lG`Ȫ<���_0��z\:z_�S>����*�<���I>5��]�Rr_��ͣ�tk]o�_��>,��d6pc�������y�'Ik�3 ��4�4D��Ff�ʶ��`�F`��c�<؝U���ნ�9+/E�	�c��o(��F�����:լ�N	�sW�,gL��%�H��=��8�a
�l`�r�}s5��[e)q����̕'�H�Y��|0-�������v�t�􊓈Ud�ǶI�lO���I��Cم�"��N���$��ۛ��;8��K,x�8b]�����P��1�)��;��W�d���w��)v���_�07�dcm�M/��)���g��@���͜�'M#r��0:��O�]M$��=!��SDu����M=q��İn�i�D��v�1W��=L����㭄+���_19?���V8�F�Ea�`41/����u�1/-\s{ghq�_�	1 +���$�E������Ѕ�Z��tv�EI(!6<HrE�z�n_�_�h�K�I�#����r�;9�wP҆z���t���K=���$Ms����7y�d�Q
�����C
du�P���V"kR�-�E>c�?#F�d��Cd�w���Ř6��q�k�C8H�-�-�k�=�1d.*y��="�
��~m�՚�<w���tp)5Kr��
�%��~�B-�u([�k 0?@�Ѹ���g��׸������%������L�Z4�LY%+�x$����r���uij�Ұ��~��N��0�<BaBY�I��eT����ʄ(�rI�̙͝r,���0�QŻ��G􅏙El��\�$�F�%$�Jq�'
�����?��G��o�(�-r��9YY�����_=W9xI�n�ޤ4��CA�HH��o
4j
�f60��aC'}EP_"Q4Q��o����5۲��zxX��r�D8���wɆT��Z�t��8�m�4K�k��'��2�b	Rr`���;IM�T�2r<6A]��	����6��:�)�v!LM��Y����[����#_��ݪP]͊��rR����$Y[�7%���*��@��8��r6~Ԭw�9��ZepI�h_2��`�؀�N��%�M|�U��,�,���^(�)���
�(٘/6+]�3�|
(���4Y� �����3>�J�*~2���K�N��ݴh q�D�;�GIP��Zt!���oc�Xشf���o��N;���b�4/�����U�l��\��
"?|�_B�y�/u�D�%7$s�����Xz�����i�&`o��k���
�sA$�x��g����SZVV���ۛ쀝o�
��zh^���e�*�߄ ���E�J��
�){N����CCݲg
���'!qt��˻?�ϱ+p
�2�ӄ�
2<�1N
�GS�ǻ�z���`�C��6����W-��!{��p,�Jt���e�����3M�N��E!3�(h=F"�
5�Ѷ0lKzez0�˽�h̼�;%Q��/�ͷ���L$�4�ee���H���F�rnRÀ��3w.�"�����Zƚ{~�r����/�`m�/���B�l�Uc7�+.c
F�C0�+�P��� ��u�e�o�^�������Q��� Y9�*�:zG&��"����v���ᰫ��=I���/��X3�!s�&��8�ؕc��=:�Arq�Cr?�U�&\|�'8
��0�sQ�AvK�'
J#|p�'��M�����س��Gx�{�s�.벵��7�����/`R�7s4�n�b'��T4m�o�o�a&�
�f%1	Dn.�G�4���3��@Zvߤ��v�7�AH���qt�������ز�(��u�B�@]���hZ��\�����$�*2�	e�EC��v	ԋc(+eݸ�q���#�`��ni�ԵtX��u��u$\��lr�@��(`�{�'�VMW����5S��;���t�~X�4��fƥ�.0�U/S"�^9��
�k(�w��XNK! �
/d�[��6�q`)F[
�B���d-��)p��#�n�����r�����~+7�����S.��O���j����g�@���M:�=��&d����+�~��v
�^Z�Y0�215uq�}�Ż�iJZ�(p���iL�~x�]?k��&��1�����EIAJ����T���8�9�Vt�<|/�nYx�΢���)IZ�f�Ze�l'��C87���UqwU)���A0����U�"ݦ��-��َ����(�Kd�W�7[�\���;D�����,68�[v��d�i��L5MEle��`mtt�
V:������@b�o��~�P��ML����#�3�3���<몛��#�)��{Σy͢U���&�^���T�f,y{����j������V~S
Hk���EՆ��4r���=�ŭ�Ͷ���5x�ߦ3�j_6�	�*g�L=P
��5�Rޘ~�0>,$�N31�יC�A.��t?�ߞ�p_��t�CVl�lN0x�n�B8r�T�
��Ös1��eHD$�i�=_d$tP�@l��)k��t͗E���GA����j�qP�Ar2$�
�C�2�(�\ѿݻQ6!��yIÀ�;}��!H�Z�֘
�Ԍ�^ε�X�	�=�2g1r��-!u�
����y��B�#�,#GY��8j�����,ӊ[�k�T:�b���yl�R�;E��N���hewzE:I%�fִ~T��3���d�/7�]��2�K� �Q*
����kB�Ҭ��?�x��FA����әkl|�Z8�T���d	�����h�P�K׻8Ӧ��[Bh�X2m��e�;ݞ�T�!|�>��iIc�нN�@R�Z�`DhW�w���
�R�:L�ָ>V�6&/������F�Ő!}���l~&����-�C
�w法{ #9%j{L��jL���u(��ƒN����CXS{�(6���v���׈7���P�Z|���:T�j@��r�,���P졂4U�>\�c̹�@��{,u�� 9��#@fA��J{&��֢�ҁJ�@���Ӏ�����>),� ��85{��#z�Ӵ-M-/I\3l�~�.N���;W=���z�����i-�ۤ霨B5B��/|��Nl�($�ɽ���G�
/Q924���I+ǧ��5�["�ey���Xjg��6~��G��0��<�o�3�Y�wQ�<�)m�K�Z�?��6��-���s� <�(m����q����Zz"�׎��S�����pC<Q)��єW���1!��s7(&g
.!+�%��N|yO���u�/ �$�$ݠ1�"���=�1��\ݛrRd���f�J��E�Ffh�@�#�sC1��bP8q@���p���+�h�BrD_u���o�c�3(��4�g�F�)����]�uf<Ud
6�O%��0B\�T�)6|�6Z�0B2��v|�Z�Q��L����`C9����{����	a�������6,�k�b��*�s2sOfמ/��Q2	�7uW���vCh�$7O�6.�p(O�LN7(��`�P�X���\�/�v��Ў/�vx!"t�D�$�IH�$�BB�p9]Y���R��F��v��i�<���ݭ�no��N:�M�d�/�E�����6a�'
)�34M	���G�E���i�#��([��u;�`����`N�J����x+��2K}��{7VW��t�����y�4PNB͏����s�%��|ti�[�r��x�er��SO��f�J�5mآ1���&�"�N)�JiX������q�n�Jj�FUʼh��j���M�������^��NkP�Q�����m��9'm��|~�4r�M�bqN�	ݕ�`��M�{f�!;@�d�IB���Bk/;U�P�vE�4H��:�m�5�Oc4�k'z�?M�9����[�S�����=E�h���O,�V�q�
��������)�dဤ��\�ʢ�67�o%�Wk
)����=A%5I��p�8�mU��#jYäc��ŗcj-�C����#ÊC��b�c���+��}j;�
�vO]�i$�Ԙ��@+�]Wt�<�ᐰTh*�>�����fD�|���Ȉ�a-z�tuU��=e����>�8�8�>m����SrSLmۉ�VL<Js�����4��\�i4iM�(M�Q��s.�����s5���{сP�Z�im:���A-
��kp{�u�5��`P�u���'Q�o9LZˎ~�]��%��C��,ê��ŌVČ��������1y�v"��J�
���F4�*KSe����n����&m�����"�x0*�
<�V�����ck�XT������U4�Ԫ��L�-��şp�OeY����;c���l�(��bv8&�u�0F��t�c�d��N���������C��`!E�a��,f�Ĝ���a�VB>0�O�f��ڙ/�6!^��Aڹ�)���bLJT�Պ��V"t`�m����
��{�`�w�:�l`$�I)�1j,lX�T�!��[hJ��,Y�Q,z���SjU���cC��X�����#5�/�X��`�c�M�T5�-�j�3�G-�(DP"���H�1e�F\À:2�1e�d�+���P;�Ì�
��\�FD<G��;���+x\ ��Q͘z�:�p}��:�v��lW����?�5��Z�Zt���AT�{���K��!^V�=Ʌ���Qvj�Wꇹk����ア	���C��k^�P:��5��Z�N�}�FM����i~�#(TJh��"�p�pɂ^$Ճ�,7�j�c�kDF�6$��e�yim��UV���|�U|�����r��U�`�-�a\�Y�͚мm�Mu�\�&��B�\?�1Ѵ�H��י��Ҹ��d<��k����*t#�(������z������5e�eHN1��`�P�7�ӽ<�����|���5�w��=`��YJ�7*�N��Y�����Ϟ�ٕ�+gw0<䤫0.�*OiBO�G�$k���&zW���Nx���бI3���~.�1w�XM��O���X�8?Ï�>>�c W���}���H��O��G
�P�/k-�N��|B�ފ��gKV��S�~�Q�4p]�bm	cm��vL������ݐzN�~�ʲ����4���Ig�=���3>1g<�PyBam��m�<�_Uy���{�)��*�0�_Q�d4'N��&�t���_�TV?�@���&���
L����O���`2xm�D.�7��T��\_�>�BG\�(���(�DG�<�AF��Μ�(@,�[F_���GA���(�X$W�\�\�����&��R�Ϥ1yy�q�����*������?ϐ;ɍ���W5��熚����D�0�sW��P�������~���bx�r�1�U_�(�0�g�����^���������FB|���q䪨x�^���K�q�0�
�0u���m�]���n�B�Fώx����$%�(���%�P�Ŵ=��f���k�pT���K,�.y-z�����q��
^�nL¾��W߁^�!I��:,l�A� �B
�%����x�����S�!�"��>�d�J8=��@�*	b���c�V~��>�<���7�wy$J�*�
�`g�v0�Z*ķ�F"�c�?C���l�4�S�̿A�_�;��$h:1G@�Oa�$�ts?�T��Ԏ7��,Po4)
�'�ak�
�d�83���6^��.�0l�~Tz� ��Tnp#2��7J9���
�Bj��.�B?��sYrS�LH����"����kx��%�k,?��W<qJ{6l
�/�*�Nc$:�f?��^�a����-��9�:��hw\�[Oi��-Y��n�i��	���
F�tr��7�����Rc�'UX�h��i���a�|ԅ�eR%SE	���"ȶ#���~$|'�z�d���N�
oU�B�7��Y�(��nC����Ձ����	��F!��s���3�������)���Z��$E,#��/ID{p(�ܤX��@�9Z9I��� }�%�i>�z�����ȔY�4ZƵh�S�2�Y���h�׾���^��z>MEƆ/�z���;��;��ϗH�P~��PWL[�BՃP<Q��]5ɜ�~�#�\׀=�I���"ol8|rq�Lx�S4�8��˜�L���0���@����o��<�J*�,i�e��s϶<i��mѬ5����~��e���k�)�d���U�dVG�9p��	Mvީ��L�%p�Iٗ�wKHZE��^��eZ��nU0�E���[�_��D�qrm�Ʒo-ib��D�Ǥ���~�e�A��D���$h�c��)�$
�7]��b����[��(�	r�9.���
>}�w�%�CXv]��ǐ*8�b�������G�
��[dC�Xp�V�
�8[��a����T��.�"�H�Pq��h.���#R�ڍ�$����͇:94~'�D���'���y��AL�E_ѫ�����f��Է}S�����5e�F:w�;8��RnWF�WnG��y��
 A�/�L��������Q-͋M\���8���Ζ%njѿ�+chu�y\��{Tڇ #b��,�6
��C�fWۗC�D!`dY��rnYی����yBo�6���
���\!���Cp�_�-�䷵��D��G�Y%揃���U���=�4�	�C�C�c~sM��2?ew��[��
���!x� 3G�&|l���WĪ;���I�`�f�Sn�S~Z����lVp&Rz&M�*�[�S��V��<9�JP�A�BA�!��z`E�"�e��z�E��+NC7*L�+nI��\�N�8(�e���5hf��<�0���+~i�O�LH,,��s֚icu���d�Y̐�����2&WIk�ٖ;Y~G�Wh�Wl�{�g,�0�WH�{f$�A�G�,�z�e:�m;o�'Y�+�����`=W�)�[e��g�K��j�Ha�w
�|�����[>�D�u�_��'�w`�1{���9uY���‰ނ���`��9�|���z��ԛ�Â<��ұ>����;v=��)��5C�w^�_��q<�썬
��X�MJ���z[��77������:G<~���T�Sq���"Z��D��CF�
��1(��mpB��6d��~7&]�dX�m�F����'�g1�V��[��c�Gi|�H�8�;x*�w��[J嶆�	���q)B$3�B���.lI0��
	�ݭ�zK=�5���*�t���6܋cKO�J�@�[a�K^3�(������m�B��P3(-�i�n���#*W���4K�:�0�nŏ�`���X)4����&J8����•�'d�NF�~�+�z�	�J�[U���p#����G7�y'��l���O�A����Kp�o�L�����z2Π�Π�"�y����JQ���נ/wao.�"UM�\8L�LC�<���H���L޾\�X��(X	���]=�(,�O��/��=���S\�l��2:Z
�g�ܑ
*t��8
}�O�� 8����{�nn�ES2����HE`�J��י�O��	TPP֐��ī��3�|t �	�Ɇ~���rB�Ȕ���T��7�!Á��	������LT��<�.�}?}r>e��&Ҝ�&Z�`?f
��#|��kVt��Mb���J���?������xh��qKw�>FBmX�p����8��p_�Ҷ�H�~�h<�Gt���h\�c{Du^�ڴ�u��h�<�x�����ǔ?������\����p��d}��ɖ�&�Ok�rJ�y_�A�wfu�o-3�Dx��o�}�]?1�A�D|�|��]���
�z/��Р��r�\1��A<��}5q����k�h"����1H���-۶m۶m�Ƴ˶m�U�l�.۶��U�=�9�ow��/�fDFd�[�r�1g�XcL�sB��#<O�����%}%�C̔;��-�xI��`ʅ���[��W���s���;�J�[9{����C�\J�9u�J�[{Ϊ���
�\)u�ܗ�6N�_nyqEp��n"7@4!��饏v�/�ނ"���<���R͔����D8�r�H��5�v����޸d]�ʋ+�KxX�@�Z@Z��"����lUS�#������CX���nP�h��DSb!�. |Z���9Cy@�U��)Gq�Q_�2뜱<��X��f��$-U,;g�r;�H�:J�ar5Q��l�fN/�3�n~a3�K���g���<���n�����ҧ�n�Jig�ʙٕ7����cA���s@(*�i����8�eɣ:O��)�I�aѣ��_���K�a�#��_�L��;O����O��+f���;+����'���-�����9�q��g�Fب��a���*�;b��:���Yh84<Q�ܣLY**pyp;�����hT -��~lࠃ710–����ťT�;F�@d��#,��\hvM�O�΀3\N1��%zZ�\.$�&�v;�oi!�)JE*F�=1=���d�����\���aio���7F�������~�vYeciao���.,ҕ�8��
ƙ�A�
��L�8�[IPJ"}*�	�9��\5'x�B�"��h�بʒYewP�����bk�o�Q��BdWwf� �Aڕv�zOJ82I_D>Zu��z���ɧ�%BE���U�ƕ����G6o�׹��� �W�%��P��!�@��op�`�j��?GF�M`E�8�:��h0�)�㌅@Z�!��n�rbBL��0�����2	%O��Z)�._�2�0�M��ޞa���=Ut�R��o8�0p��5PT"�&"�����f5�L$c�E�oP�̽����%�t2��@0��5+�M�lA�od��q
g���y�3�n䶥!�[��E��v��R�:'(��De'ir4vW�]�8[�T���blA�72P�c9~�TE�D3w�G��c���
����زp8����XP=O�b�O��aJ[
KgC�a�z�}W�Y]-{�VRw�d&�Mg�;���G�s�'Ȏ+�8P�PF��7FF n�]�H�/:�G�Kl����l7[_m�39�p�N3��1RRN��9m(�f3�>�l���|�ʾ��"o���#�����i�7�����������A�{9�`�N*fb�P}���ItVaUU��JM٤��X�����Z�5��Wb���W]Uk����Z6'���Mq������U2�e��x�_����F8��s.n���ns����e���oe,��*���Q�2��PB��������z}0-��{9����_G�C�/��T��j��K�5���1ޮ4$q�m%����J���c��	���:7���d�o:�v�?/��
+z�kzy�����w7RcO}���SO��y?t�0��o)�u�.�����r���]�:Neq�κ<Z�FD�/���s,93tIR���d)�s�p���e[Lg���]��jZ
]�i�E.0�\�t�^��)�U�1����<1��*��V��B�C��Ƽ�F�3%��
��(6r��T���c
�"L��9�d>��xu]\n#�
^��ƺ�^������Qe�u�+N� �m;t�t%wx�Uwn[��e���7zԮ̈���1�L�x��v�>tz[y���3�{�����o<�;Ӝ
�~��g{��o�T�]�c␮No֦�ۃ����OV���O��6�����I9����‹�7yv/@1�R��2�#AhȒ�U�Յ��(�5<�EV��I�"Ģ�%���@��C[6������fd ��O��5��n�h�������H!�~|�) >��q�
ա7^p�@7��U%���z}]��������q�%[qR�~9d1�p'����&�p9��w%sm�U���� G����Z����Ǜ��_��&g�J8��2q�Mj4��n��<�~˓�P5M��?W�tu�b�u�C����f(N��j����c��7�?��/[��E
�)΀��5�7��n4	'9�)x-�gwAT =�Y#���{�w��6 @]���"�^S@l9�삽�Ƭ�B/Sy��Yw�>��䑦.�f��VW/ۢYJ��μ��>�,���Et=�����[�Х?�I|`&��Ǭ��á"��q�-��j:�I=�D�m�z0Йi�jB\�7�X�aY�x��L���ݗ�~q��8{��#?{{���~�Bʞ���t�ʯ�H�kMt���j*�k�#�Ԋ�V��/3����z8�Xj��c�*U�y�r�zj�}{���f����k�C[��z�e~��f8���e�"B����Ɲ[����%��=��
�:�{��d��g�1ƺ9�`�����Ⱥ��-NWV���'@����g{��H��?YXEXT��x��*c���N��;&��}��D�1�:'#���x����;��O�����*�#Ž�1�Fr���p��&�0��*��(ǡ���qc�͞I�̣��gy�lô�\�����bl
Պ�Ftp$�ֈ�|fXUi1�G�7��U�����
VL��A�ex����/�onҦL<D�fX�����G��t/��3\a8T�\o��eR�vW\څ}#���N�$2��ks���f,=b<��T�%6@An�=4vʩ٨�H����-�/7|�J�#]�.��(�	G(\�6<���	�#�]�
�+�����#'_P|�4��p��d��[�!q0+�2����:@������ */��
���r��¡�R�d�%�����<���S�Q�[�4��y
;��F��{�B6��y8��}��mmg�"��{�w�L��Z�.��A���@���'���Lu="=�6���:ic7Z}3�9�erG!�a�����6�#yIx��(}`��T����m��%D��F���9��Q�Uvm��k��j:xa�I�5����8;�e/fu�-����5aHD��.�n��Rbu��6^�(�:�`���Mr�pC.�DQ�5���Ͼ�ůkd�.٤�c�0@Ӧyl۶m۶m۶m۶�۶m�}�����N���T�ݩ�T%U�^�\�~]_C�*Z"�n���V��!���qK�7k2i�\!>h�H����:�MA	"ֿ�4L���%,©�}��-�!J��<n^�ShV�G�b��w}ƣ��e���;\�}̰�Đ���ͮ{��!��?0�gI/��Z-�``���M8֔X7M�f�vBdL4�R�������,�C:���V�̞y��NU�n!�O�)A��MK/��nʮs�V��/ț��nl����uV����}n�r!L4u)V�c���-οϙ�#O�S��+U,7�qL�R	�!��a����u�(��z9��;���FOS���z�>��L��_�1���aJQ����F���2"�=�/	꿛��s�(�&��$�[p�ǩO ���/�O�ȯ	����[B�wt���"�N2��s@3'b���f[B葠~����w,�~��NT�s�K �Ź)	�t���bƹiN�
^��Y����T���о����~���7"��S���O@�7ִ���::
�j��<�C�v�I
��&%�c�!F\
G>YO��	Hy�
$��)>��V?�'��?��4?�/��iq&��i���c�Llu.�i�n��ߋQ����e��#t:��<x�5w�0�a��v���d<�t��@������B���]�0�U�?�H�Z�8����P`���Y�{���3lC��R�F���<7�*���&B�/�7w��-~����ٶ�؅�����Wm�������k�gd��8�B��~/��;��@���`�*R�:��_s�1�S���rJrl�
a;�Ju�ϸ1=�6�Z����<�j�L����Ko{�/)������&�f%�PA(���9�XL.z���[���'C�そ���L�fN#Q�g�}(�����f�%�R���Є�F8�t��w��C��H����βb �QF��MXF�*��V�=��T�.
�T�UՑ2O؇Š�}_\07Q��#D�J��H�4���5�fX�gǶO�tn�^�[J�Pxh��^מ<�es��Z��/e��pQ����3On�[g�"3�	��L�i.���x��
�b,��b��{�4�B�S�G�P���Zh|ᾕ��U����W!���^��Hw�3Y��r0��PPm<)w#�:	��������ߺ����C� ^������]��`*`b�z���6;���y�[ȯ�Z��9|��)�
-X��'��&@`2/�V��j�k쇭S2o�
؂�' N-u�]�~����.��=��mt�������E;��9�Օn4��N��}v�5G�srKM5��Z�@���
Vw��+�~'ëf��m)Z=å�;�ѩ��8��-Vn<�	���qVˀ&�@Le^�4mi�:LB*^�ࡎ��*��)ɳ8�!�x����2��A<尫@��%���t��&���������]��
�
��)�|NДPf'�,��� H`��53i�^��/�A���'8€x��[�"����'�r����x����*�
���9Ϩ��t	�D�_������R�٩����ӓ�]�P�R��=�֎�IF~t>��۳��~|�g�H�fs	�i�lN��$)̢��幉��E��UyE�6�}	�乚_Y��o���q.�q�2~	N��}�i����	ߍ�q��
y� ��R��Ǻc�渢�t	NɏFQN�>O��>��&�d����FڙD�,�1��J􁭆��e��Է>7�v�׿�?����N����ȼ˓k�����u-��|�6��M��48`�Y|���\uˎngr��}
����c4�e����(�?�������E ��׋�q��7�|]c��X�+����V��F��r>�4�%��/�U�pn9Ia{�"n	`?�x��y����2�B0�=�¸+�����*9��b��d\��-!ķXK�]w$Ǚ	�C�p���؇�[�M+��ػ�x��4�*bpV#�V5�� R�6-�!�8b2�h=_�^#Ù�BFIxt��6Eܳ�zW�D�î�/�T��%
���V.|h)��'�a-�\�d�+��
Q˲\
3S�h��N%���j73KF� ��Q����j�%[5_]�g�:�3O*>g��Du�`����{c�mTr���@TM�,'��~�FA�˯���nkn&��Xts��>kD�W�!�J�S$s>�h���+$q5�c!^���,���̼���S�Я��9λ��	�W~��)US�w�����7�^�?���ȇ�є�N2�B>�~�q��їעYs(�&.,6a��,M�[��nWYR0��|���!�����Pfg�47'����@.�(|HN�آ�T���ҬgM\|����ÈK�Ż�[�j��z�*�
QnQr^��B��]�V��R:�R5�WzGg�r5D��m&�0���J
�¾�1=S�)U�M��U�]S]TڜJ.nrGQE]���:2IRc^V��kĈy� �*�L)�w�3�_5�5�D@��� 瘮�Hۖ�Sũ�Z� >����p�p3��ũ앇R}p�cND>�h^�I�����v4GTг�C�yfN�0��\�\ر����I�D�U"P7��C�[��Y�2F��:H�����M���E�\�e��t�.����1�����m�dF/���Q�>d:f۩a�7fׇx���G�X�gm`{�h�o}���8���������:J��c��bF3���@�Q�UL�������l���z���B��s������1B��G�"��L����Ӷ��o��;J�˳�cj3��U‚��
��T�/������XP@ҏ}��x���Q�9K�g��mm�"/?�8V�������t���ۆ��o���k��"��N�p�V��^�����
�I��qZp��ǿ�֮�m��l��C���.��Ш� �u�[T�_�?�0%�_��(Z�(
���^�r#T�>̟���'�f��f�T�X]L+ƛ�9a�x85��˷��zW���@�`��S����6�1� 	>� ��O�N\w���h&���������u.��k�����x�Q�ya�u�`p`�&�x�ƼXLt�NH�����/�f����re8	`J�0Fo���Swbj���2�n�c$��Z�e&1�9���eE��@��X��D���H�9�fޖX�֭�R�r}��I���/�1׈(	�Mĉ���h�b�����)^Lg�tk�~L��b�Ee@�@G�D�͉�1���	y�*�|<������˿UE��K|�b�����X�>Y$<�?!�з���O��E�ؖV+��ĐV/���j�l ��AC���U�5G4�Ct�k�u�+������jj�z=y�Q�>l�0_Q��r��L����3�;�:+�)zF���<4(�h�2��]>�����Fu�6�7:='žC˽��w��z��@������~q���;W;ܸ<l��v9�$Q���jIn�Q�����d@����Q����*��*�C����۔���c$��P�/?.{,�qW�{<V�9��ϓ�/��A�(U�����L�T��	@�ˤc��
����
�C
��u
���Z5}���8�li��P&�iah���>�Knt�
�T���HR�N��[�'0�'1|�0Jd�dt��T$	��J����Mu0���F(��9?��1�U��'�Am�m��˟AZ�,u-�
�лa��]�NY�D�$DH�r�
�D�8]�ů�!F�"4Z��B�h�~�vH�Hۘ%�$�w|N��z�Lu�@4z��lfN�	$���'$�U��.J�%"T�@��%�BM
U��)ĭ)H4�/�Ah)�W�c�#�#�<�)�vXY�[m��.RRU'5�UG�C�JL�FeC@i.��o��J���sL��}�)���*r�и�n����*D�e��Z/�V��<��n�,.r;�hP�ֆ��Rb���/{t�F��I�h�\� ���v�y�J#���L�:t;��RL���E8M�_�&�����R��2�?�_	E+�6��㿉d@^%�~��8������ g�^R	F�&�5����b�
���u�̗�w,������[�m��m6����fI�%�2�d�:,�U�k�S2�dNlP�
vO6��ljY�m�n)�L�S#��Ƕ*ԏ*��#e6�J����[O&����Rü�o�Qޓ�:
�D��1M�#lv���|�+bq���J�wԩ	�3�dZr��0i�Hԝ�<`��� oU����$�9�i6����*��~���ɿoBTv�����c�
�=/�]��A�����J�-@
���6h�Љb-\^�+�٧F��ӵ�G��M�E�y��	m���ѻԾoG�s��.��rl'.07��P(��ƃ5z�i�x����Rw��l<��Jԓ|�olN��\�KKL�"{�肁��?���K�lCk^q��k�^�����}�!��U�N�NK NP��Wؑ��n��"�n�l�Q�$~�*W3�QN�ɮP�Gr4�:8E����P�p�YnR %�+՟�F�t4���M�1�y�sF,Hr&���r��ފ�]�<�����{B��x����d�Vk�3᡾��\0�mM�?���i��"׊}C�zY�.o���>�-:)������ݓq��!�
�����e*�����ܺ�;Ak�g\7yأ_�qP��^�P���`��O�F��=�^\RE8ü�cEJnq�+9���͝n�Oծ�2�Ԅ�a��O:ٷM������a^C���s�>��3�""�~$�j�=�HI��	�C��M���)%;s\ř
�G-���q��4�]��'���W/��~$�)nƙc��� �{�>6[ق��G`�����)um�u�b�A��� ~�-��9��(q!^Ё! u[�_���@�;�\�*6h��:��I+��
}��2��빘J&�@cjx6q��K���r�2�1Y�pRM;l7�����[����-G7;��9�a�y;��1�}l'��>_C��t
�����k�8�i
�z������]�E��&�ͳ�4�9-d8K:��:�,N�l+��)�[V��ٟ�l"ί�a�Tgъ�d�8l�t�Q�tIpL�Ѫ�j�W��L�)��m2�BYB�=R�4��h�l��������e����������>�-�>?E�pN�5��1��G>�2�N�z��|]�\Y&�����5S�e�ʞ�\�c����%yʟdߑ݈�����׋[�E��Y��/#�����E���K����L���n>?
����yv�0
;�{��S�Y~�7r�T�WO(�I��~u�OS�?A衾YL�w�@���&�*H�����S��d�>xO��C�����}>Z&9���
��R��ѥ]	��8f���s��P}8�Kb����0��J�]o�$����e��M�a쀀�
�t���r�4���8���IǾ�чr,��1�	�XF	_��x'�
���T���Q�E�
��\2�F�&���o���L�����~i��j�b�"�F��*r� x�7�c` If�Q���8��m~N�f���0��*���Vއߢ$���?Q�,�J��ʝZ3�b��ށ�;u����]�[,�j
�w`xr�M�U�
�)M+�ėo��~ؼ���P�{p�ʶp��uAG:����ϥ��V��H�Vl���F'D���_XA7<��/�a�CN:�6b@��d�i�v���ۄ�,�s��{(*T����%� �T�T����D9���7}��'?o�����A]�o�]����4i����=��ES�ľ�34����4�v��z�?�6��Y`���פ������6��} <R3]���*�zQO�fHN`�d����B�´%O�:zG��T��-�!%s��J�rL��}��q�F�O�g*�}��t�}mu�	D�'
�z��v��ٞ!C��{4^�W�l�p��t������x��L��WZ!�>��PCG��n����áC����4]<��$FxB�5K�������X�D`���O��2����xN�b�4���t'^X�������qu4�Q�0����@7%�1�����x_�JC\��`��|�^_l�)���s�V�4�UY�>��]U�TKza�t�պ�!�{N���J�rf�9����ɖE����f��7�̸���zw����Q����嬍mzLlϳ�s̞�]~@qk��(�i��U�g��9��.��y������:�tN���KO�nf��B@遄�����7p��L�t�뿯���A+��%|��ǟ��s�U|�J���p2��ݐQ�v��-�k��9�V����ѯK��l�#�\���ț�*��S��.���K�{o���7.�h��+��m����G���o�$�A��W�mC�1���u�B؊�{�p6k�4��'�|�j�ɬ'�G}w��I��/5J�|ʡ��,��w`T���X.rp�Bt�l¹�p��[47�-��k��p�L��`���ə����,y�C�\�{���;ԏu��y�탤�;#��)�S~(X�#x+ŒvT+E!�䲾Y&͏��*eY9i�'b�Q,%[D��	 �;$��*��)����+��h�@S=B�y���'������,v��۬L�\ul2Y�:.�㴽/D��v�Q$$8�S*nUS�Q�D��J�!ǼJ:G&�S�XOd��S֤M�ާg{�SV�͕��v��K�,���1��P�a\�C�LX�\�G8Ө���tB��[�E�[�z�df�)&���%t��ܚ4�^�N+W�QӵBV��ݫ�9��UmU�S^��'e�Mg-9�[���(F�;T4Bܫ�	� F��_+���S��G�E�Q��qE4(^Q^W�hJ�Ԧ�G]�YϕS�8��1�ѕe��0(C��{��Q\<�����~�Dc�T���Ю������D6�/[�i���a��s�8�lT�b�Y���h�]x���>,���g>!0���vXJ�a,���yo�ؽ~��qj�A��	z�;�Ni)X��Dh�J�;�d�������[�x{#�tU�{qU�{}eT;4�"7�e�J���N='u��E�c#9�ۈ%��Hg��W(_��h��;��.��@�{؅���=cNP=?��4�N�7b�V�C�ƫ�����ovh����zV��'ם��B��1�Qt$m�����or��$�#dŭ��B��;��M���VH�M�&mնP�����$L���s�r��B7�AW�����."yy��K?*�Ø���,�OZ��ՙ�����c��t��k�R��cʒ"^�ZZT�D��PjS��TP�L�w��Jm��	�G87%'�e�x±��%��'Wh������%i<��0б�LS�J�5.a}d`d@ ƶFD٘�`��ƃJ�}�9��/G����,�{�������J���=ݭ��+�.�����/�%�<�������%�"�b���d�iUP"��p���]J!��x/����Q�@p���:��|�1�M�|%
�\�-�@^�%�Ѱo[^o�9�Ĝ���#�ڑ��Ƅ���1o���w6z���u�P��G~��[[r�6['g�����
3�2�[�@�|4M�lR�{`(�^�x��?��ؼ�m9B�|�a.����4e���<�(2:$Is)�K�v�~�+�q&��XA߿����� 0�&�_����ޮ�����Ί��������_�\��cX���MI+;,U'�
^���ʜ�B�]�l�Pl�#N9^�cF��f��f��CR�n����,�W_����[�re�׶RnƧ�lo�-=��� bBD�6of�cn��)$������^��nCe�B�j�!�U��`�8;�B_wX�� �u�M��pi]�>O+ؐ���ZWu�i����$����<OJX(k˲m�o�X����Yޝi�5��M��)�%�h�n̸�G1)ڵi�����u�Ce\?+��{7����}G��s}{�������Ov;�Frc2�uR����.�^9���!��U���6W�".4ex�:����1ߺ
}n��z�F��gv��2M�?���4PO�vگ�
��W��2TQǢ����<��T���z�=����Jq4rJ~sʲp]ryv�sG��=	�m�{T��z���z��+�\zaU�>y��w���a�(C��(?��)?���c��]֗�a�U�yg��U\��鮪�^��7��qp5�$�-��m�q[��~|���=G�#���!��������Yښ�Y]��#��jY�\4����
4-l�����605* 6��Ћe�\8D�q*D�w*����aqAŭ�K]��¯Z�:�<��u\D��X�m0	��\�e̪����N)���J�R��b�	Aa(u%��ZX�˼L>�������"�:Ύ�(�mnSp���O��LE�E���.o�ԫ()�ْ��f>��o.�з���j�x��̧*����ޤ�b�ʏ_�:��� �[��g���a18HKߎy�!��mD_M�-E3�̪8??Ž��g�|�)w��Mޱή{�MǦ�����LT��$�YJ;2>Y�?�,@����OH����/(43E2�N9������/i�k��Q�ˏ����?;��{���0���悫�u��.W���y�v�~)��A��J����A42j=^#`m��4���$��]�/5�^�
3S���G������j�*_p��A��-b�M�V�����M�Q%aJBeɌgf�li0����xG�-�Ny�v�?qx���x��ܠ����L��I��b�Ͼ��ݽ�ŗ���QDx�>ad�y�ą�`p�(6gT�.�s
/7�7���X���5�^ rH�gƨ�=�����
�P��F�U�t$�%���TY;uu�a�X�2��
�.�����$��l��:����Sl�����}`{*��NWp�4�}�t^dO��f��`�q�Yo[��Y�ؓ<�}�H�4ɤel���q����"w���>)�i�:�
��Z	�>�ϣ_�#�����<P�9쥂����ׂ�x�S'}�z�WYY�SF�݀{�_�h����f�p(��-���ca��}9#�T	n����%9�X=~��t"��a>�j<�~�C;2N��f�@��@�zǎ:-�Ů	�M�3�ޫ�\�nFnV��S�Q��/X�=}�Zx���kߖ�3.`L q�nԲy��W�Tz�3���5K�d����BNWc\Ŷ���c��1[��ncM�+͠ePY�N%!�ʁ~d2�*8��{xa�O�q9I���!���7{��cla�n��t=��v��aj 7�H01�q��*�	��?�Ӡo���4�~��鏇{	V���2m�&��ڜ<�
mk�l��l��jn8� 
����
�\�2c/���3���@��D �&|�]~Z��X�S�XHw(���;F��	����APp��+�S����|t�ŝY���g�#=�U�wˬ\Y�f�,{��;���~̯���!����@�맑��k	�p���R�0�܇T���-*B�,�e����u��GVL��K�*߃�����a6�wvߙ$g��,�}�͑n�y��*`и��ӓ�*����%X�%#_�ھc�* �ff�oR*I3�Zr>��H`ѓ�1��拺L�#"�(��*����1�&�1��'Wt㡳j8
����w�'�c����2���52��A.Y�^����_"d�u�B�jo����������8�>�����'�ʉ�*F�?�̠���L�Os�3j{'�&�Kt2��p$�W��5=J B
#JP�C��J!Q�5;ݜ��Z6d���Ï�Ȉ	�C�u�w�(v��ϸ���fM����QU����@�����i�S<9�k��|gnݪ����D="ي�쁳�"�	���a�^��]Iܰźe��+���3C�{��%}S�
��ek��e[�|A�TTn��Q��{`�?鹇Ȫ~�'^�dĸ���"������Vp��!�Q�/���K���fG��p}-�Z��W�x�݂(J�Ԗ��6J.��ԯ(>c�X�����ysW�p�a���;�o���R���mk�S�����>�)�=���H�����9mp6��c�J�}��e�+���϶�1H�����i2����h� 8a��{��X�W��[�A���^)8�焁��hO���"vF�g�Sa����{2�(�?�F��5��?b��-w)��ؿm�ig��WM�6�ܼ�2!�J(*�	eM�6n�of�WhA��[��:�u!$̔���/j���x<�+�Fg04o#�!1�����$�ڼhc�D&|\�П�F�
�a�m���~��C��'O�qn7yȮ`2��5d~`د�;E�pʬ��x�SѪ�U�W��ڟ�m�Dϯh�l�Z�C��Ihg͊T�d�+w�:<h\_%��8���:\������O�-[�#	�<]T4i�R�'�؜R��r�H>!C1���	"��*%��2铧���������މ�\0{~=�ѦGC��e��q��f�n��ؠ��39lvp��!����p{������a<J6�=J8ɯ���=��YObR~
�'V�F7��rP[������2�g[q�[E��w˰jĻ���	��}.Ι#�C~�
�djRe�L����{�Y+�ƾ^] a��&]�)9,N%q
Lgg�<�̹���\�>$9kxV@�9/t�|8�+�-`5eR
�"o�%a#�Ѐz�fX:�F,	�<W#�M���u���bG-���G�e���s��W��j�!<�e���!�� ]K%.�В�%�?�Cg4���M��1Z�v��g�x�	���/h���X�=��5�z�����;wM��РK��ꍹ���}�c�n*) ��dW��������O
Q���3�o�[T�����ك�c�=�+j
hj�eh���H��\H����i�&z�����`@���"�\�qu���,�C��[K��BI]����
�B���I�����f��C�IS�2���Et�m��` �{U�/
���Z�f���&��=q� +�(�BH��Z��7�$��Su�~I2w���!F�� �5�����fk2�O0�������lmYuDU�s��~�l�8���"h�s<p��D��C[��YS^�,�7����6�n�K@�ߨB�bF�����#���d����[c7����/����*��[6<l�	��)���Cՠ���
��%<�YXR����������4U�+�Z�B���|ls��L4ˋ��.0����v��B�ȲQV�^��"�S�&���!�vs�1$&|��$
.��p�7����]�2��C��BA�q�ׇ7���%�B���1�5��U�����x�qƦ 8� O1.�9�
�aU��u&Z�g��)8�k��ф"��F1"�1��e(�
�5�/M�%�	K�3(F���^�y��HӡC'��+��f	z�x��@(�&J��*׍n3����6����9�7o�08K��Tsy���?���v@D�I���PRF�<����P�����e^���Q�X9_g)ɔ���V�8�Q6 �¬�P�Lس9���D��'TW���Q�9����G��{��諯ؔ������"G�Jt,d`&�d6�*i#�H{$ڂ4|b��o6�/���$����J��FaW�24m�\���<�m�Zki�l�w�MR廹� �,`��d(e�q�v��x�phZ��4�W����E�Y4(<ְ�P]4�+���4K�1��u�pA\�	[3�኶�5K��A$�&B`A�9�D^�L�B}K��Su�ni���v�[I���+��ߟ�'>⓾_�_��͒����x
T�]s�����J������*.�]���)��d1h�^�1�T�jJTR}��������ӗ׏Hc��S��%E��Ww���`1eԘc�FLd�Դ�%�q�~�~�~�?i I�&ֶ$��X܏7\��T+-��b���N[R�E�3�g��E�w(�3������Φ>9�
O!p�s\18W�
��/Z$����D'�b�7��܁�2������)S�5I]��m����5�c�6����.*���]h����G�ƺ6g�Ci`��� Va�^��t��p�š�����C����":��_v�E�V�Qr�G�Z��J�
fF�Tz�<�ȥ)}���(�����Z)��ѾC�����>WvT����t	����|���Ҝ;�6�|[��̏��$��23Yz�co6!@$T/8ņ�z>˄:�‡`JJGb6�,.���������/����b
=��f&�����w+_�0 uP�
��'X�.1Q')VbW��Q��"��iU�Ee(x%;Y'}��f����<�+}"]E�Ӯ2„{X���*�Rk,�t�A�N��_��4���-�V>S�����7G��gF��wv�G��ř.�����M��H�2Ip�E�Y��b4<˫?�E��
N]��v}�K��2~AL�WTF�2tidzx���zAE�F�F8

�q)�[�0g�]*� �L�B�>��Xn_p�Uܣ>
�h�dɚ:1kve3w��`�J><�
%��X^��Տ�?�����M.�i&��s:��t�U����K(׋2��Yy��ޙ���="�I��m�C�F��{6�u�~�o�ݖ��&��a�e�aw#ZD�x�w"���\6;��)O6����i�uDž�*U�*�$3�+�سV�$6�9���>�N�~y��˘��P@��[� 
��U�%#��ʜMF	������M��N�X���z�"�ߝ���.�����$Tغ�Ilٲ�eܿ�~m�u��*z��8�$yT�"Tv���8T�wioK��ܜ�jK4�����VI@޽y���VĤ;@o���Xhx+xe|y�H־�7�Z���l�%�O��:�a���ww�ᄈ�����j�Hp�%l�nP4r+�i�n�����Μ�y����/�2U��hb�����r���wtww��������bA�b�M�/����.��y�kӸ7_k^��:��t^��:t�C`F,��3d_�@˘!Ⱥ��E>���-�^�X�'DtѺ}�m|SO3n��XT�DP�Eo��5u�Ӟ�������|Kf�-���W9�Xe�-lW[�lO���41ه��R��?�D�$ø�X�F�2�|��e;��"�,� �d�7SMb%�rt��0S�T�e�i�R�\�\���q�!5@�fޗH�RD(��:v�R0|��W䒦�"�����?�(VH�<��O�Xg�F�A�f9f���e�
�q��E{S��8��"~`�to,Q�\d���w_�D��fvH2u�=ej�1D�q�����k�V�9z�*<�"�v���3�yaj�.qIn#U~ܮ
��5px���$`����.>	/��5��=2���{PwHJO�>�������*��)�opp��4 ��;��_ �}&��d�ܰQ�sw�ࠠ�o���CZ�*�����*�Z��Xf�*�����3`� �K`�1NslFqR6GIh���vM.!v�A�;��
c^���nZ6�'`�%	�nӡ�_��g-]@���V���9����+}�MdI�L�-�t���Ax)��Th�ų�L綡۔t�t�Y�}I
. ��vV���Zot���1�^0dF����EEo��f�W ��xքa�ύ@P;&�P�S""~�:E*p���K \W*��`<��I '
.��Z,>6��g�	7��v�(fYߙz_>Wqa����VB�i`�kM[E|,`��~V�(NQ��$ک���C���-p�3��#Catf���f���x�W�U�.y�wڷLr<+#�WT����/�1�{"p�1�����1w�w��@/��z@_�x/��yT��&��[K��;;R����.vD+)m#a��Z"h[!��Y�����6�2�_˰��֝b�	��+�dϺƾ"B
��4�'���������I��N�Zߞ�65jL����Un��U�&%}ZS��Q�"�B�ϗE�@k��h6q���D���]�:���[П�9E�jA(��8O�%~Z^�`��KB�Rq�{+P�R��:���v�¥��������°2�1���%0�k���Ζ�o��?��;V]� iZӝA�Ui�Fa-�R��=X�t�&�gfU�\Qx^/�r�N-�A�{�Rf"� ��Y�|c<6˹��A�
C���b�˷��&nl�s����O4ӡi.%��4`��e������!��ϳ=y�
ǰ^*�%`� ����w�a�dֆ�u�|�;O�?\<Ջ4�j���s
T$��O�Q�F�Q�Z�O�_�^M]�*��g�����G�����9��4�՟����5�����̝����\.�8Zz�7=��<&�i���4cپd&K	-�+�%���A��!P%":��Ѣ�����}|]#>,�
b�"H'�s���Դ3e�x[Pe%l]�D[���G��F��#��~�p��ɿ����z�S��Bh8z���U�)/c��p-�mC����[裝o;��,@V
d���ܷ�%Z�'���V^�*���m�;b�j����h{��@+���j	tK#����h��亦���48�Ý�f����m�[�&%a�K�s�B�~�
Q��ȇal���5���^�U�#�1�+�W�*>��
��p%�(�yo爠΃�L�;�m�� t$<P��%�1J���/�	�K��2h5���:��j$3Kg5c�bs���	������(�"��G�����I{̤��-��������p�ߕ�צ���<B\��0EX��˽����sn��I�m�.f˝��ӥkRK�	f�V��'�a�b����S��m��j���f��U1D!n,L�&z�oM�iB������8lt�ʋ�����.~i>?'�1�H��8��%�6:
���y�z4;(�"�'ab&f##�*�Ci��&I����[���x�&6�JU�� �#�TC7b�I���7�����*q��҂�E��]�Z�����hm2)�E�LZ�'�6�u���l	A]�����8��[�:�-����o`R�J�4�4�Rv�E"���e��C�'�uJ�J+�xH�#���/3J<m����Ҕ� 'ؘ�^�eS�\Ui=��2�
\�JP�l:4ԹC��M�,kS.r��#!�����Հ��ͩVL=uTo�`��UV�#��>�
Ȝ4GR����`��t��
M���C՚+GhHO8`���C*��C9?��j��4c��@�h:�eZ�VM���-J������E����9.�N_c��2	�a���㱍��5bý`���Rn��)�O�[��s�l���:P�I0�e	��O����i'�U�4��at�Y*_7�0�9��h��9_�䁴���>�M/갵�r�
�)��Y4��LQ�<�P�0ȏ[�:��L�87e��O�H*���W�AEN�ܗgGs������Ѳ�p8v��TڡzHw��gpG�}�{;u���Osa$r��Ѹ�J����,p�s+j�}=%�a]2�uk�-V>}!�j`
�t̏�AP���Q�sn^�d���rH��P���hs�,j��P΋�Ŧ�)&;`������(o���P�N-�\�qJ���`k�`G1����e�Y���Gk	�f�v=s�Μ���{z_L�'i2�)S��&�u��n�趹�.�~q�g|��O�+�u:�-.�/�l�/�d��T�h�%3.�?H��'�A�^CK��=�*Ј���B%�i�&�@���'�jVvn�y}
��Ϋ���A�U�8��(���_q�/フ$�a���:j�����Z��%���=��h7�sP��g��q�ʣ?-��8����l���1���ӽ�Y�ûY���Q�.�3k���l��l�	c�B�Rr!��I�ÛA�׵��$|������n=�Cqy�:��G�
Od���h%d>����wܭs��7cA
<*Á�5v���ъ��{�xV�?���:Ϯɠݷ^+p2�@i-IIՒr���sw�~��}=�ɋt�|>:�
õ�)Yk/OdHE���e�캁��L�Ja�d�^"A�0AFxjq�Zdý;H�L�~QYV�5�x!d]8ȭ�;,W�2�4�5���I`����"����y��;�����w�?���~s�~֦ܿY��v-��H��GD-,V(�º�HiJ�~���f�z�nC�gd1��,u�iY�:@�H���a�q�I�A���Q��P�H��S��(S�K��0-�=�e����(I���Ȩ c���S*�O5�6��YR�o�ß"R�d>m]Y�l4㯋'��vɑl��~/Oo/q�՞�K���K�ɂO�1���r��X�O�!����Aue��n"�Fzڅ�.P�-���h�퀹̺�f�!���Q:������:h�u���$��>P�*�ELV�tH��-�U�Tu�i �
Dَ�7%�����#�k�����)T8���%T�)�Zt+�K�ge71	y��|W7�*��U{{�X��@4?U�t�����d
g5���	��(oqr��O`#�D��:�ԸX~�����#7FwN����z(e܅\����A�A�)V!�T�t*���T&p*Xe�F��m|�<��0��x�K�erĬ/'�j�+�̙���u��䓣0�܋NkL�.�%�셪�c����:!��C�]fSX�Je}�2�@�F�?7vV���T�G�����	��YR/�#�d��h:m� %|DL6��9!�&���M2��X�}�wj��)Ĭn�#[���D!�	-�7���]�&��[��I��х
������!#��ei�#3���-p8c�
����q�%��
M�x�tl��rM~E{[0C�>%3Y��x�K�~�d#
y�&)��fYFE��M��iŨ,.�[���U�AT�f�XQb�P1̍�؟��ՖsW$n��lDF���%�������
��i�Z(�j}РW�#ՓEWu�ko7k�s�"ϦDZ�k��1��}�?xa?������&b=f;�)��:�j�����mԩ:�0J����s}��/������Ƿ���x�>@��σ�9}hR�[�� l����v��i�&�_a-��K�Ѩ����Ui�d\˝KJW�&7�6w-����O��`�w�5�Z�lQ2K5n�Ѡ���́�ѯO$�t.Nx�$�
��HCm���r��_<a/7����ꢘ
�0:��S�{�G��L��h���'!�Ѭ�{�,Ղ#��a���f��<Fꎪ��Ѩ�!A��#���)"+�v�
�G�����Ԓ)F^&�U!���tH��&_�:�k�_��Y��o�߁͌��\/�V��*(���Ar�Z���՚!�RW�M`����5�*���}�|�����4�?�l���OW}K.�V�A����	���ݫ�G�h|<߂k
�*U:�	Qtf
x�p�
�|v�f'0HB�@�2����+�->�A�i��A؅_��K��F���1��r�V�M9I��S�����j��<���#�'U������C�jQ��&b8�UX�T`H����z��IpA�`r�ֆΒ�ي
uM&N���5�/�G���0�!-�Rօ�Z9�G
�Rk�:�cp�����8��̲�W���z��R�ŀR�;�Tm`�]�
ܭC�a�R�65}&7-�6�Nd��eo��p���.
��X-N��\'��2]���p��Ĩ��lxW՜�~�8m0G�[½�H�}��R�S��&������?�6d$�����ę�B1�ɲ_,��92Oy4��U3�M�gM��\>�u�^5��te��:�M��aUf�׶����c�����6�����K�lk�|݇��r<���)���P�g)���j(l���B�ߚ�
;�6����SeVn���>C6�;��e(A|mSF�a�6:"Ư3�}���8�����f/��S@(�
�s��(@4���p���h�j4�NX�2"~A.x]N q�>�� C\�H
H�Y�<�4��0ϴ���=�I���	эۡ���Xf�b��2Mo�p��q2���H��%4wKN�^H��_3f�X���>��
��e�{�L2j��/�3�V�$
�|��Č#}8�H�ˢ�{N�b�:ι�I��aF2����
�������=�W���sH�)旼���NUT���)=	TՎE��
KA(�X~1XĔ].S40R�w�)�n)O�AЉB���D���o͘��…������[��ĜIN5Y���例�hGȯ.�RL���>�y8���|�8��l�A��/
2rw�Ǎ���j�3��?��w�T�˒�r'lģ@sg^u��3�T�$+�/�M+Gm��$F�9I˼��d82�}�]�1��z�sLZ��^ �Р�e$����d������4)�$�*�R��)-bsY	[w��Fq�O��vM^�(0K�%;�
�H�F�����\�e_��A��0� ���êi|2g��X+Ԑ<�6�y�\	{p,��Y]���>2�|~!<vs�:3v�<�0!��K�z%
�$#�
��tɢ����� �1=�

{M�)r�j���o�ws(��j�C��G��u�f�W��\�;#+�m���hA��6�F.^X�w;_�5e��`�vY�:��,먗�ߥݪ�&�(
y͑���Oa:��^����!J�*�&e��1����p)ݿHR}g#Y��g(��C1���a����0�+,�L�q/�)9h;���t�Ek��r7�|C��_B���b(�kf�f���}�y;6�8��-�n�Le6����Q�-�&/W�l�~�2J6�ŕ���^��3*6O�Cw]8�<.��W��ASctS�T��ޔ�-#[2|�0���{��j�~���൬�>�Q.�@P�<��R@�9���U��t=� �xH�(�c����,���jb0��o��M��AN�<�Ђ()!F@�"��s?*y�ޖ�%(٬�i�5i[=�=n'���R�Cu-�q	6�$={;�T�^�v������9�z�e�}�H@s�r�"f�;��
��8���3
b.���6�\�@"�q9��q�
��m�]b��#���ۤɋE��]OQQ�1���O\,]�����hеl_r6�����4��YtPYi��e�s
:�r7d5�Ɯe�V.�CD�<�_��U0E� ,"�4oޔY�銢@�w4(j���"�p���2���X�1ˋ��@�,X�aL]\�Y>�!y�
{V�m���͸3K�%P@�On�u��X��˶��u��p�^������L�Q�Ft����z†���M~٘WD��^�@W>�^������@�'?����Ңl����
)s�D�2�n�
����ݐ��-���mƢ�\�cM;`��qXQ��2cP���l�	���+��&kE�U�i��4@M�u�ca������᧓���;!g�c[sa�v�UT�n#y������17PB碀�2��P��|WV�y�[��7b�ټa}�$~1�����"�4Xg`qY'�dϰh)Ld�j�_�Fx;�y":�udؓ�K��+m��(j]8q�b�g|�v�Xޗ�t�"�{�q����b�L�&Y�sN�1���^�	#\wEQ���}jv|�s��}�ݰ9<Ū�b��.��۷��ֈ��(�a
�yg?�4�m2s��_V�뵕rΨ�@�	�j�bW}ƣL����v�2[�6{�0Ѧ#4�Gk	���(2T˖�x�\T$�{[�P�rF}%�����U�!U��Y�/��K1Foi�e�m����J}�,�R��*oB��R���}�>xk�I&>��� ��Q'�����y����,��������;U�_L^��� A y�T>�&/$���\��%�������fQk�x���5
���g�ϧ��s��s�bkBu����am�
���L_E%B
&���E!�,%�K)��T�bȐ���Q!�������xY��;Ok�c��6#��W�&�GW����+�%�ژa��ʻ�ݢ�@����VN��P�}�k d��Y��K��H=���`NՊd�A�@_4��r�&�>�za��G����m0;A�Y� r��RcC�z���Іnkhk�k�v��_M�0�Μq��В��V@e��n���2�"�~sNR��MSS��.���*#�l�-��[	�Gp���@�T�6�ؿ�j�>�c
��$&�f���k=��$i"�g�_���#�;v�o*X����ޅ]��AE�����@tG
Öi�o�P����hbk Gs+u��n^����,��ˊp���1�eW�A��RݫCp��qv'�*։y�X�s�l�o�nPC����^H��.$�(�nY ��ܖ��/�@��g��[A*"W�3�lb[�#Z���jd!]��b���
h*	�mҞFc�n�������r�����!�5	��8����kM��␛���atߊb��)&y>\&���$�yI�F��Ni#�3Li���([�3'�,������~;�)Qs['�Q���n �]��I��Xr�@�tQl�P�#��5��qS]���d
F0�^e���?K	ݣK�-�0�5��@f8��o4��{���o��]OH���~^�[F�ѩ�gթ��`.��Nf��j޻�3�Y�ExěXu�gq$j5�`Q����(�F%��85&P�6�4�i�3L�MKo*X�1�R�|�I��I+��V�Pa�i�嘲��S�6�/V�V��
��,�j�h��b�EWS	��� ��
�=Rt�3E�5|�?^<��+t�^�C���������j���,��e��^X�( ��6K�T�����jT
���|�����][��Z�R�4�A���5α��>��lK�-��5�-���y��&E�C��c��? *7?<+��|�ΉL�A���(n�'�(Y����/E�i�f��?��m"�- �y��D�ċx~�^�
e~�M�A����ff'B@�Z%S��+K1��oVf(��Xgv�9��3aG���+|%~��9��	��5\fui�}W9�@��)@t1	�m�M���D�a�Yĕ�͢��(	�1^cYԋ�ᛂ)�
���Sr]��"����)��cv@��c�%�8E����	,B|Xs�;R������z������C��X��w���L�l�V:o����2�ʆ7h�����7�0�	E�#�
ƕ�m:�H��u�ށ.��t�:��qcH�Ee�`4x+ݘ�)&�2�3m���-I�<�:��z=Hu��XH�eI&P��]�	�x��8Z��2�b�
TL'%�8�~1�W�䨿j�h��&md҉��r"s�7�N��+�EG��c?
�z�oY]�Aeȿ��f,�@kT����5��H�ðL3�U���e��f�p���$�Sl�pxn\C�D�Q2Ԃ,BO�����r��1^y�eѧmPF9�@8�[!s�pP��g
�G�Q���;q~g��\S�����m�x����r�[���@��hͿ6c�..��t-2�_���j�u5$���^k�I��
;�תY���"o"�X���R�,Ws�~����T��5���(c`�~��@�T�f�K�SEt$�7��#A;2�?*�1�ҷ��
~�m1<4�3��H������]�;�R0�}�N}��n��m�u������;¿�c�"-�֩�<8ۀ�ׅ�#g���	�k,���{��Q{�W]�}j�z��?�dd�:�6-����|(յ�iq��&%4FV�z��E3�k���
I�/7��n�׫v��a�ڔ�٫NB'���=�<��p����p�
li�������qs*���W�lf}w)�Nl�2��<5w�p��o�o6̸[?$�؜�N���+dp+m�;M�2�1���,�jx<�;V��l��12R��M������%`ٮ���Զ��,��p�U�5�N��$�0O+j�=#F�I�8���(Nn��".J���Y�iA[�Rl�Wt�H��
z���m��<��������s���~'n�YiL�YhC'�}Էq�����)b���(!?�'+�;���h���eͪکŊ��)vm~66�	�/�RQj��y5�����]��+��f�~n��-��.�&�.D�k���[�� �kMye�Ͱ��d@7��vي~c>/�C�0s�0]B�ʪJ��v9dBįga~x ��0��ɘ���}��y�3"�K<�0L��[r��"�F:�����N�A{���#[7uz����3��趲u�$��W�5g[J��Il�4Sb�_��x�]��qj�8Ta#%�o	��@���8��q���l�Ь�M���_������5�A~��Ub�茇�l�X�ܼu����3�]��!�MpN�e���vS��%�Y��iRh�m?��@�O|�Od&��x�.�I	���$���O�d�����`U�`s�=g��L���q�nX�e�wx&�+L��PqQ�B���pb�q��s�c�ݹ~�����t�lJD�L�[Hd?f���Mɾž��
X�j��'}*��_��B��
��-�/�hh��B�ֶC?qrX$�*N\睷u�òI<�:���V�Uy	�����hj�$�@.O��C�z2���w��!��@a��Q�����fr�m-�4;��&��'H�P6ގ�,!�!�Y3N��BF�5^��^�5�
�v-�tbii61/Z��Y�HIh6#3�}��8<��y5h8-ԇ򄞐��'�2t��5Da�����Ų�$�!���C���YkDBau��;��	&15Th�<���3��5��xA��Y+���fE����o^�kf�!ę���Dۑ3x��ֶ�O�<���۩���qV9RH\my&�g��߹���e�Nc�e��٧�
q��6׾�Wx)��	9(�*�f9B%x�c�F�!OR�W9>�kt]��8�V��F�bb��T!\����x�A�Y��Bu3̶�����ެx543�f��
e�^���zR�}�.�����~o��)�ǩ����꡴k�[�\�<�4>���Ǖ��jm1m%v�"�_������:qnr�
Qt���~3��x�=�|�/�MYR���m���!|�,�O~��g
�<���$�nr�~.S;1���nͣ.�Ht���~$�؎��y�<��K��-A�~�x����ʊJ:n��j��F���(�%+���f⼀ni)x��sW�B=��	x˂VU9j�wގUg	x�D�yq��L�n4I)��+SV���J�{"!��]��H�Y#@$���i��Fa�P���|9�hdf^5a�prbt_XAVC?�m}X����&Hq2��u!�b���o�,��|~�d���V#~��/�M�(Cd��XH�����/��%^�S�Ab�^�z�q��!�0���|Yn�b�
k�^�O�r�a_�I�����(����2x����B<���G��)AP���
�Č����%�0d)�Y��vd��wBY�-����)��p&�%=�4�C�>Ɋ8�8CK.b�N�[��êzRzC��U�aj5�&e���&����]t^�e-�!�͑!8$�v;����A=��Pq��^�8�L�M�ʡWs5c-�5�:R�S�k���,�	�/Y*��r��8�z��	d���D���v��b�_�N��E��x:�|�X�o��"A��5�E���B$/G�;q���u��*�s��Qo���5�G�l%vI�J%9"�P{����Aa�1;w��1.$����-_�ȴ��"Vff����\h�y�
V�zK\%��V|^="�j�C�Rk�ۃ\�mu�K�݇�_�|��~�Z/��Bғ�>_n�Ȅ�ӫV��/��UǪ�q��m�
�Ӫ\s��؍�� m]�q��i��K0�4���r��+��l�(�J�n)]x]�h.RZ�R1�W7�s�kA.��Jb�(�)��(9�W�u=U���_�r��xqn�-��;�!�ޫ�.�\��W������qh��ZT�_2��p�v���ahf1kZ���ζ!g3���l\�*�ڝS�����nQf���!�4�������c�$����>�'@�D
EfT�s&-�Y�(��B��iiʦ����Ρ�\�`t�(�	8h���d�%���jHI����H�Х�����͉ND1]t�
��è�\����Njκ��1M`tp����՛ʂG3���F_�8Y�n�SkG ���?���\�׫�'���(V&`��"�μMf<���L�*��.�U7B��nQ˓��Q��׽��n��eÇɷ�␠
uB^�m�2.Y�Yz�Iv�w����v���U)�9���K����ڶ6�@<���n�+�Z�#���a������<�b�CT��N���K�Y�l�\�ߥ�a�I��/
�ʠ��� �딶���u���6�W����j	{��z�C��VFq����WQ�H.d.YC��)>Ռj�(�
`4�]ˊ�+LQ�����m2Z�L��<�0㢥�d״#����i��ܵ���=���3�b�Z<���2
���hB��GE�9�å�[�U뢳ӧ�映@�\ȁz�l�1V6�*�"���ƙ���Ћ�5c�*P:�����O*_z9Qf�� g��<�,Y�\\�x��+gnuY�c��jfTt^ї(�p�'K{��)N����#�2��i����۶2p>�Ԟ�&Ӿ�g��Q?xr�u?��s��|��v<C?>36U�F��܄�y<���0*d8�<��Bw���#�^C{�)]��&�s ɫ�,��l�i���5�}h���Dh��Y�������ܩ�$]�C��g��Պ���3J&�<����38�/��7���J��=��+X��,�S���1
�����W��
�g^�_��`�d睹��|�R�B�J�������t�A���⥷�Pv[��X0#r\qwzn��"G�:i`��+~�
��TNXh�y�7װQ۶ƦS��Á�4����`���q�V�WIϸ��~9������	���R�#�,��[�9���&���`�_��0����o�����<�d��|����r�@jQR��$}�Fu�=#$iH�1��/Sgbૉ�r���]��'f�he3�y��bQs��5%�p�6�rcbX�NJN?3%hΏ�9hD��H�Z�h����$DQ�dy$߾�u�o#{��x"	wLZ�U��|�mB��~K~[52uҶsv#�,I0}R֎�&C�w��몊0Q����Q�l
�v��W���w��5������]��K�X�~�q;&���G���� *bM��+�1`(�bֆYeӊ˥�/�.e	w����A˙��iqO�dX]�3�~�:Dڈ7#c��O�pES�#C4���oA��.��j�)�,��p$��+�rՋ�V/��&���9���E#9��&y�W�k���e��F+P[��!���6G)rX�{����i��ly�W��V�3��v]
CCZw)�Ü(�^��!U���n+f��0���E�Dxͥf%���S
r�tv��
C�XB�����_��.Ї\��P�gIӁx/��!X!��ű.��9M�7�P�W���-��I F*�)-nd��_�!�"Ͼ���,8R:-�#{$�!���J���0���1V�뾐 *�[
��k����f��؃�d"}�ZcH$���~._^�o��S.Ej���Cs@<��h�nʗ眩�>�mOhg��7Z����r���"f\[D�%쟲�2d�
SM�����sZ�P�
�@�i�cx�ЃylQ���y�f��)m«�P�yۧ����9��4��fa��I�g�R칁��`o���}��+C
\��w2E�l9-C
��C?LZߠ�c�oZx�=���]�kB�w|Ƚ?�j��)2�͟�֟��X�-�� �yE')���|��<H��g�<
J@b�X�L���6�
O����O"ɛIaҶ+tqy��6��m����Z�l��R_Bُ4Ȓ�\�t9$�Љ$J"�I���:��l��V`U�nD��2�'+�/]h�Eݶ̣v�G̀�;S�����
��XYia�3����9$F��D�;:Y��"�����)��w��Կf��[H�Ǔċ������g���f堎�,��C��8Ic9-����=�!�UCi��Øl�&��{���m2��+Pn����✅�+�*��pBR4����n��$K��:��|�8���,'�sv�1���Kn���np���9�6��m�N�f*#G�g�i�N�1�DX�1_�
�)��4y�ܰMEr((Hi@�D������l0�R
�(�4o0ыM�r�|w����;)�q��
b�?��c���@�c,rfO2�Ru�7���Cj��V���XZ�1���#� }����	��kx7��}���*vɪc������U��[�Dv*��}B
�p�g$I/�j#��	��L���8��+��	Z��޳��o�,\�xy~�^#�#}���}�X9N،����#F��|�'��0��=ӖdR�կ�(�@J��j�
��?�^6��/����J��uD�0Jx5&����i�
�P��y>mY�C�8��פ��z R��ז� +�奲j��I*�VE�
V�C#c�!ظ���^�3�<�G�s��( �jzo���u2c��_u�v�ݎ0��� 찫��ק4C��ks�]��� �_�o��?�~V1%����f��f��v
���^�����H��v�&<�F6DE@��G��b�?;�f�_(�؝iV�?NΎ���W?8�ǃ��
n��:c��uWF�,���a�����������Nj�l�8.B���c�À���#H�"�.�$'"Q2��=�'

�
����X�u*w/G�y�䥂3Kix@s/�6�.V�{��x�Z�Ϟi���r ��Rg�x�>�W��w��+T�=(3DD`қ�9�f�^�o�
���I=yԡKq��1BX�m�R��ώ�NH2B�y�v�N@g�:GB���5d1\�S��E����3��-���T�-&Ւ�H[��S�.(�䗱¢[��	���1)�Ц+��ӸDu_z(�N���$�LQ�MF��l��t�d������ S;p�!��t�̠��ϐV b.��|u*�>�Z��rꌺ���1�_�Z�F~̫i~�e��}���q�.G߷�ݏR�?[�‡z��bt������T�.08@r$ ��цzh4s�s��S��5����D_:b�*�T�B�}����߭����1��.P����h�5�j,$%�G���L��0���{b�y2M�o��D���6U��Mp�j��K�_?�d�W7	311�7���˱�y�;ߎ ��F��ͯL�x�-�d��a�7�l���i����Ex�#����Q^��j��f)̉8!H�X8�:,�����|Ν�|��,y���P�x�I��?'�:z�~����V��MI�����<���G��6��0`�4}�i��O\}7�RžJ��������A����O�0�Ҽ��̧$��3�s���$v���7��k�[?��Q�
�2�3LuL�	?HS�Cg�i�\c'x$��A�}�ǥ�K�@�Ls�9=�#����p�f��O^�դa�,�W8�d�eR_F�3l���Ǚ�s"�VL���F�J9�\�ҥ�BB���>nw �ܝa'֟G�ƛ�[���*����atD��<}����~tC])�o2��*�…
+�@,�-Y{��	��w�_Ƣ��7'q�u��2d�S����$S�~��mV���l��] �"�S�n�����蒼�_�N�O�ש<n���q�EU��L��;��{���u`�pd�(�/P^��	�#�DY��$�/�	E�Ri��N��s{���5�0��@ꎷ��:N�]��gD�q	�Fh���<f�L��l�/� z#����%��#a]�'I����Y����L�,%��,��t �J� <���c�Q�������݉gMHe�.o#vz/tP���Ӊ~]�cjx��I�>�M���X�cm�2�W��]ߛ�F���j������|�w�⮽06p\�����K\����e6�[�5�}L�'��X[a�W!*����'7�(R\-(�A���.v�Q��g8��5�;
ب���zP��Z��ZxQ�Q�E�g�&W�vu�rY��.^d�8�cY>�S�<*NnC���y�q����h�3�s��S?ٮ�.&���9���7���Y+�!r�>{��������k��4*/"|���҃�z�Lb+�L�4U�9�gtď��XPr55�G;J�aFB$|��$͟�44?K`+�8�kS�j;�1��t��&:eT�,�P�}G�9�e�� �d�������
3��"0h8�{��칧����U%밚&�€�ֻ��{ǂ=�7�	C[]a�#x��xo��l�X%���T��z�.�,��2E��*�bJ��aL$y�
_l�9_.��ʿ=�I"wE�4�
ߘ�`-[^���_횶�Ώ���U>3��k������W���Br.���;%�THG�P^����G�&��u_�&R�������q˵"Ƥ�5���^�"�ˁ�׃�!KC]�~��@ �f2G�M&O�
�uJ~n��m��R�5#x�s��{�s�����B��n��3��3��W�N�v��MW���}��H�
X�+�q�-�@�(��G��	?�i֌�e)%aJ��q2����-�5�'��`Ѝ��	��&2`��r��]�b=r!>\�{6!�9��`&�b&9�7<�豑��Z����B %-T�}⥡��H��Ge��l�bI�i���f�������v�X�|����Z�S�cq�nܨ����(o�9o�jy�-���t�"ϔ'_�O�b`!@��Ŕx�~�,���CQ�-��"|=q�� ��]�_�~��HG�򊖿�DCPQ.�D��̓o{��t(��B�ħ���ؘ�ؚ�߻dO��~��䨜呡 � �ȳ���fqpbq���%8J `����j�4�04�ڿg�(��U�}������޼�K���W���
g��ܓ�� �/�/0��<����.���)�vW��{��?����&ƶ�fƵ��V�oWb@6wwßqa��%��đ�ؿ����%�s�����ߎ�N����bI�O?�⼷�v�t��~�o�C2�����e��g���#xc�o�����1���}�����OEkccm`��5��]@ဃ#}��$�p�x��ߣ��9�q�-����68
�
p�����f��t������о�CP�Z�{���E�}?
�z_�� 	���A���y��{���Z����`>տ�$!��Ɵ�=_�\�!�6iw%�@��>���^�)���ET�$��dN�/+�����K���Pz��~���e����8~�Ki,nD�i+Y*�jS6���F�t\��z������٩�[��#%hi�##ޅj#u�;�gi�w����9��o3;s����x7�[3
<J��ג	y%��#8���y��;��<���*T��W5�S��0�Gi��� ����6kw�a2�l�~vW��O
?Jy�:u4���m��
�)��_�!a��v�^
�mi��,����0EU#�O�j�9PW���^8n�Z�ò��[�:-Y�QH�Yn��ݱ�k�a���l���qŒf6�{ƯΑt���'���f�Xz���6�g�d��.��nv}X�z�[��`;�p$����Y^�����\1���ț�q��z�9�\y`�KlF���,�91���ޝAa��L�J����K�����=�9
6���v��-4q���U��i/�k�k��O�N
���9< `L�!������;&M0TL�K��;$4���:s�뱱���j�x�nq
�G�/��`��Q��e�P#ˏ$A0M��
c�y�af8o��WPXD�z�[~�W�_���ƩGJȵ���Y���}m��>�0��+�kId?Ʊz���J��������]),��ti�M�'�F��^7U���-!	��uE���4�!��r�Z叏��PT���ހ�6
Xv���'���t��AV6m�CO�,efy
�9 ���'�i;��ľ�!}���`Wz�&��E�Ak�Ҿ���׈ʀ���'�\Ո�=wh�O�9�n7p-���o�TrD�ivq���_����<�ut���9/D�נ��_��O]�2�f���1���q��s�IFb����7.��fYq��gMj�PRE�
��x1$%�y$�AVP�C[|1�������z�IFJ��;$;x�D�0�JJ�C�wA6�Ǔ�'�}l���Ј�rx�I�R-!X��L�����Uiޱj�����]2	j��Y�
�=�I�����-AZm�Vl;^WE��-j�
�7(��� :P!^�G���y�A�{M�7��A �t(�6SN�	T9��`�|�����@T�Z��*3����hwD^���l[���RVB����}$;�vyɀ���\"�,�D
	!2=�C+�Xq~�
X���%��*�|��	`il��G���_�M.a&��'iljhbG'a���dD�^�h� g�2<�D�8^�\6*�����?�\�	�q�]A
���Z$^����c��*���rb�n�v����Wg{'s:+7;S:Wg{;:WsK;�
��'7[%W#OYS'K�)
�Q���X��+�����t�6�j���~d�@/��-+%�4�˼6JU�Y�a:�@�G"m���8�p�lYe�D���vr��*RF������tm[��1�J̀��a�Ce��I�D	��kN��=�{�n�o���9�}<��93YSiGѫ�PR,�"�d�4Y�4}���	7����ʖ(��~̔�:����H� mI�4UN�I���K�d�eS+�
�����f�6�+?�`��
�Mm/����N�u��`�7��1u�8�r�ֹx�Y�Ms�j��_&-�*�:^�Pv:�@����x����Ǜ�H�E��љ���Nt��C�u�V��5Ȯ˔�X=۶Y���-@(f�(�	�:}�;��!�~o�EVk������6�ٍb<]�q6"�.!u��6$Q��?Y��TL��@2�{.����x���]ihx=�����vS	�I>v$��X~ıl/~��>�
�������Δ�(�e^���]���a���o�v���^�Θ0y�kz
^%�f+V�vw���=�p(~�1�5Z,d�<mu��c�� g�%��Hk�	�vCGr�:3���yb�<�2��z�����д�e�c�O�"�v���k�S��Ԓt�Ἑ�J�"�n�����
3�}�?6��"�Y3S��^�o�-�����Dr�h"n�K	;e~�1N���qm�=�j�7��E'�"��g�-�z1(;�c6�Ƨ�b~i.6W����������Y�W�5��?�H��i�"��*f����-�?�vL<��?�����sp�w0ur�4u���b@���w,l&�-�/L�RE�*�ac�d�?��z��=Ot~�;�d��l��j�]�$��
ђ�RrtO��z�w팟V�Zq	��C���o�|zɮ}J���-Mo���7�kD�$m�W�B���L����F��?1���`��H���1��"QH�_1YA9I1Qe:Y��8�	��[�G��ٙ�G��7"�?��������oP���X<�X��(�Cw��Z��X�k-!��@]T�)�B�o��ε��Q]i��'$@XZ�^d%��H�l��N��N�$~��au$][�f��ȎH�����c�Ky��JXJ)��--a�P�sYhم/%�<ۥ@)Y���;3�f4�mi�~�m�tg�=����=w$��̨��)�$�;�4��f�����������D����=:9������:��fM��� �h1p����&y!�Q�ID�f|�x�nY�F#� �M�Kf���rA�3Mp{���KQ*L��ad��NI��޾b���S��s�2��C)`��S���'΀O]K;L������ݧr�tT�;�����K�M,N��:^�*
���*Y��9`�r��i� �YW]��U+�L��^���h+UA�Q����P/��Z��xME�
i�Ʒ�9%�l0�͜?]8��G��T��&��EcL���&��KD��ZST�v�����Q����L��K�����7��d�"�gϱ�U��»�SL�ll�ùd����N%  �œ-0���I��l�_;��!�Uf�yqs�n���VԔ@}��:t�3��a��~ξ��	��ʅ}	q�J������8�J�ٮsx�Hr��ۖÃkn���J��b�[N*+��r����Ը`%PO�_:ϖ��d��y	��_^w�I�}��
8p�t��9��2QY���SF���c��-/|�3h>��k�~�KEcg�e�{��a��a�/��l1�x�7�{~��u�,+�&:k�࠰���U����ֵ�:R��(���F!e�n��u0�KdgY�}��	l�����O��8;�A�+�E��m���*��Oz��_f'v�ʹ_��d%ߪ����V9x��&��M�Y�2xrqd��gu�����=��wA�C�f�x�(�r��7�nή�� D��ft:o/��g�������}!����"�8̏�O��ګ�y`�����?�)��J���'@���	�~���t��ի�е��¹[Jg��N��~<e<���F�!0�KT����Z�[�8���]a@�y�P�K��^�$U�5�/nj�U~u��ks\��(��H=n�^���9��Z"6\�I�g������<�8��86]�
�𢻖_�p���{Uv�/
���~�MO�
�-H���\r�5SԻ�[�:��{��t�ڳ��y����m�k�!g%�gǞ�k}=��D x��x8-� �ƹ�$Y�̅���H�'sy#����މ�`O�
g�N���4��/�p�A_�5�i����iܡ�_����)�8͇�$�س��2P�����˝)��O�a���C�D��ax�����`Ҽ��?>�h��2����O�l�C�s@CO�c��k�v���y��x=�I�q���E�9|�R(7��Ћ7,n�mu��~�Y6����yd��+�Ϸn����,;�����}e+����3�oq?O��}�߽	zq-���M��W�qT�Ĉ�{9<���!����ρ��b~��hVvϷ�۝gǞ���,D���{�� ӏ�=��v�0uAN̟u����0�9�l�͉�G~�f�����Ϯ���7'��{��|�KbC#��N�z���Gt攳@̿��N�Fh�͉���Nx�Uk1����)�Ϲ��ٳlc��O:ϊ��|�� �rb��s�O�����1��ig٘R��=�1��/�eg�1�s���|<cz����3`AN��}���ϗp��AO�r���׾~�GX���6�@��	�̓�V��O�ch�S���4d����G�j�� t��x�v/�ۀ	��NAko-�8ӷS:d�j��c�,�>?FFV��#�����vE���f��7N�Q����z.~����?K|z%}�Ē���g�=����`e}&��^w��<�	2�䝝����c�Vѻ~��s?z�W�!���6C��r���o���]{x~��z�D�B�{F���jH;�[+�_�c	����q��v�Ru=,���X��3?p�A��u�+�tL��+�iü�����q�K��BI���}3f���p݆r�\��{^W:k�5����/XO1�}V�<���	Z�rN1k�+p�eO1��w��|�4�?�ꅆ�lO1W.v�^�W<��w���̳��kN,wҬ���ۏY��V��_��/a�KY{�j�p>�mB}�P�y>&�͘��c��X���Sgž�[�}� ��g[�N���S�5U;����ޜs�w�l�c>�Cϥ��h}�U�n�:��'Y���?-�|Q�����N�Lg�����<{	�rkҶ��0�����c<=���:�(���x��_��pi����68�@!�S�=|Z��l����X,��ӵ�Y��r���9�gǁ���磞ZdM][["v������6�N��`��Ra��e|��=�.��=�}���P���#�}L�m}����I&���uZ~	-e����U*���κ���y��w;�@��������G
��O{ÞJ�?�:�|�l�lka��~��rȓ��IO�n������ig;���ـY���r�������~ѻՄ�Ĵ���&u@<Zs^%��=Ӻ��4T�ʅ�^�1{@$>S9�x1W$���0'v�{�;�
sx�0�*/�)H�xa�h�m�E7�S 
o���RX���J�SGr	�~�B�m���*�RH�>�ձt{BRh�PYo�rb��{��[/�7�,Lg��f��jm�~!�b�7�k�m�r��ʭ����[�Q�%�o�sL���t�n:�!�L�'p�~���?��p�i�s����TW���Ӡ����2'#�'��@Ǻ\���`U?\V��Ɯr$y�w�T�#�eyټ@�h
g����,�5	%N�,S���������������
>õ���Ue~�'}%�K�)K�Z��d����?�<�&��5a^���	sJ������t%T//�aI&��'`]�JԘ,%Gb$�"
U1UBw|�.�@w�І��W!q!5T�������:�j|��p�Ĩ��%9
�U	�����
<�L���J�N�'A���qG�sp�2bm�g%�Z��&#=�W'�ʥw�$9�{u�x���@R<��38�QjfdE6'+�h�?���q.%R�Б$/�YOE>�4�r�š���Qj�a?
����`�S �
V6D��z�<���U�D]]��
�8�W��*OŎ
B"�B�{K[o��צ
b���)oS�=�L]�Eu���(.����
��kcA2x��߿ʥ�ml�T�"��R`S:$?L�������45?�xH#
I�7#
 �@] >8pz��5ƭv+f4WB388�Փ _TPh~򵥒捹š���'��̉�X��E��w�)�s�*�{D$��_C��J�U@?�A
�J�*IV9Q��]�#��956���GF�x���;F���&J�j�$hd���s'�a�>a��V�٧�@|B�8I1:�.lj��2U��H�И@8}VnTA���aI�#^��dC[s+��Y� �A��	`�8T�	ɗEo����HA�I��R�q�8�$�+	�K1��:���@�72���)�����l�/MX��.,�uU��N��p�FM�ȶ?z����j�-^}�x�iGj6�3J����{���+{$D���W�5�.��Eς�Aހ9F)a���<���a!��B��d�Շ4����5\X�����$��tӆ�(*@�Zv�֌UˈR�
d,6����X�6gq7�,�Yo�QAۀ��KM����{.�{�=���i�ww�n�!X
5�x�nT2���3F�w3�~�r�K7�2�KgĖ��k"�Q*P�F�q6��K�����K�_�,Fit` �$�


���5�)-�O).E�a�F��\Y)U�eq�9_�9�*�.�J���2�=�'QN�&�k}B�'7-s/�<A��5(����q�y\k b�Y�+�a��Ȋ�VeF�!�`�����(a���?�V����a�
�/�W�����V�Uw_}�k9t�X�ܷ!������VY	m�3q*���	��;[:�;��C���D�g�`���m�]d5q��X#�팃�UfGk��ӷ�E�3�Pb� Ji�{�p���Tx�qqm3���tR�$�P;"J�s�)5�I#� �u(s5�m%�V��
�lMg��h�ٙ�GkY�'�j�O������Ge�œ�ؑlݱdCpIGpI�)��mj1��������;��z��V]�Vw��i��LN��,���JrVsog{� �r�$Ya̢�6�����{K��������(..n* +��c\�U�����`ۂ��htCI;$����[,�Q8�NIb�fL��(&���;�M���#�hƨ�`�u�:.ɣ8	f,2�<��y��t���E��_ĝ�N6hE6^��'E��;K�`/@�83.�m�ԀN�/�H�d��H�u��@꤬Z�h��UƏ�<��8�(u�tm����#ˉ@�*�t�I5��x|���$C>k��-��,W[\�0�E�X-��BQ"��
`+���P��CJN��A־_A�h�)r
�����sX'�Y�h��ڸlf�O�qi��ۋ�G�H��s2&�G�jc�?�ڢhl��N_�^�d��8�=��m����TĈ� �(
	����L�����F�1��ӷ�Y��4�ɕec�5h�ۅ��'/��_���,���O���1Y�Ͽ��Z�[h��K����UVV��m��;I{g��g]��nYg���p���&������[�Y��\����%աa����"H#з�s�1
���ԓ��H�O������k�O�6>H�H��t��ԓ0���ճMģF�.�k>6�6�Y���g�KfQ�,��$]����@�p�'�4+��K�7+Q&��L�ST�qˇOܻa�`�:��w���
�k�O��D�
�Nد��}s_��skS�Б���յ��f��k`�R3>>����$e:v��lo���lr1�`+ƪ��2t��`1��~�+��'�!fbЊ'LX,w(�B�9)�4yԴ�t>)�#�V��)�1
�|r�!
'eV�Ɛ�L�4IB�C�>Sc%/��+���CZ��4�H����t�h�.�)
�&�d��!��u�9,�`lG��H�Dz
FZ����@�d%��h�� �9X'�^BB��5��S&JL�1a��72JQ�d�Ăez��dx��X
�Y�&�̐-*�՗LHi��k�
fZ"�Kؘp�#LD�T���QU�N$��B��t����ę.:f(�fk��),Ѳ�S�n.@�θ�L*�w��^%{j
1?��3��G�'�d�!����$j�$j�7n0�k�VQ
)���.����H(��Zǫ��֕)ذ�뀛�`�}�K��.�Z��EV��@���JsE�\�
n�2�16	+������°�W�y�wmn
��u7�����q ^�u5���8m�$�7g\]�L;jC~Zz� ���Li�t����캸[��,�t���u0��R�!�v~Rƒ0�by9�-�2�6~h���'�T�
�O�<�+Z��MUĵ�X�"ZAØ3�O���
=�$JW
�w*úy#���e_��/�t��&�$. L2A����d����H��:�0���l��\Ͳ0�����Z�ւ�:�:Vhw�������g��3ӓ�-��8���n��!`��r\�B�c�U�
2b�؆���C��w���A���].����������P�w�H
�{�t���|1d�x҄IV��(�"Z�i��Q��X��޿#�7]�����/ō�:ȭPo�b52-���g/�I�t�� ��U�<�;T�����o(g-=o6�W��5�7�T:�L7�2&�'�2	Z
�u³)�b�HYN4�m��@$ػ��@A�`�/]��w]�'��1 ai�҈pUR�d���z܎�&	3�N)eqS����c��P-����B�n�F�\�wQu�(KM�R�=�#�VQ\r%��ʺ��BIX#o
8j���W����>B�)�l_�i$��V9!�Z�����HA��(����EZ�9g��ߧŊ���
�̲
�XE���6��o+S)n�����t=�#	$dM
\�8
�\�
ܬ���ZGo�u
�k�=�Z�d�B�g�$_Ѝ7�@7����'*`�7q�j���,O�L^Ľ+gn�6	�6ދm�r_������R1c멊�<�}<�8��&��6k�K�#�;�W�Z%aT���?����1�
{�<��,,R*t�?mB�-p\�0�^�4�L��*
�� [��i�a�$zFl;�Oi:'�!�
+��\�d��q!��ݓRJ!���R-�Z]�%Z�B�h�T"l2�T}��5�}q�e=�dzo��B4s=7c�������:Ծ����?A�_�2��'0��::�����m񶊨�O�����s���A�cb�osk{sM�g[{�}�;�iں���5 j>rZ``�&
�M�*�K[��X�C�^���)���* }#�	&��e��kD��
E�����X,VB)	*++Z���=�aF��_
}Y��5�ݼ��/�E)%
Iag�Cɛs�NX��̘��uXk8�,���3N��2��a/̎�E��֎�Y��4�d	]kQ��زKy8�%�a�5�[�Ѵ�S1{������v,�햙Nv�f���3�3�p�a{��F�[(im�G�4�E�[0w,�(���㸢���Ij=$+t'��4,b��JG&G�Q�cdp�gl�>@vQ:Ŋ�lY�Ȕ
���o1Bwݜ�����,ϊ��q�\��l3i�)}DĒX�Z���9�D_�9k��BTC�`�Ř�Џ��sU�巔��hz�:?�Sw
E���*���c�1ƫZK�^P�z\"�`n�9��q���-�1�EN[�/4��[���yMB�oC���;��g�����&0U�L�.H�x
] K<:�fׁ�-R��$�	5٧H0}iS�ø�$&e\F�p\)��g�R�)�?
I���E
�*����.b��<!�psC�Ӷ7i�A��4�!��ͼ6H���yn_-��VQ��kì>퇠��"g�8������Rm��7�ϛ����Av�K7�y��ET��%J�7���L��1�9
��-��ñsܚ]93���i��y,tߨ_itD�(=4��s,ol�d�u�6��VK���2q���p)z��;:DA�C霞�,X�p1�h��!��.N1�b
��n_n���q��m�C��O�˺]����}���RF~�?������Q�я��O��A���yT��l�n�B�F������m!�����!�2���4	�f��b-g�rwB������D�������W�_-i�R1+����M�����5C��@&�$��Tp�Ii�@M2�I�ނ栆�&��a}��5���S�9���\.�� Gˀ��p�tZ.�k@�7mB��a�ᒝa�8PMS��7��1�������>�\�w5C���Ol�$�ð�"R��U�d@��p��`���D<�X�5�nD�>R��Ir����Zqߘ���4�À�m.�+i��U#��C-�?٧F�g��)��4w�k�[{�uZ�O�s��|��P(�c��+��V�Q�7���j�I���l����b2t�Eݴ���D�E�=�X����E��9(�1C��=��,��<�2
@�{��hgU��ꎑ�9�v�����
C��������DQ��u�9��ɜ�S����j=��֨�gfd,�1��hgN��~��LB�}�z�;@��jZ#+����A��ޜF9'�h�e!"�9Q'���r���嘘-d�T�_Lf����;Z[��x0X���Cx��°�����^NxN�%,���	��'��K����Z���;ڙ/�E��!�y0��ћ��ja�͘��
��C���sYacL!��w�R.W���V~���򤧀�
vcp��u}=�k67D�1��F���&�L�HD0�6�2b���X�f��U�˩����Q���Ssyfv|S��R�V�K,�'�sG��
���bJXQ��6��E�[A��ϫ�ŶG�~=#wF��	S9���#����F�p#�49nx�%> kK �`�����H�r�"��lt����
�_#����$9NG���K�u��������iA���r�]!��6��*�I^Gc����X�Y0nsі�,z؈Й�5TLC�2��أ��YȴB�f��YH[k
�=�//1���t���z\�Y�+B�'�[���d�@�1HzN������F�ˀ̹2=('�I�1�ǧ�LŃ�+c��&K��N���X�F��8g���Pz�tG�4U���q�|�Zw5�[H��~�!�7�
`���%
�i�$e/�2RZֲ�)�Q^8���3g7R�9Cs�L��vw�A�HB3G��])���Ғ��*@*��R�ܭZ�JX�Q��fh��dsE��x}`9�B>"@3��	F�a�F�3-)�pv�k��եm�dpҴ9�:0�!c��	�ɕD6I;���
A9	�RK��	
��h�)p8#����!�z�ЇL[�n���@��ˆ�0��i!r��T��;�&�'X����U41:�?��Б,@N	c�+&�����n:n��F��菄� S��J0]���0�m$0��qM���?r�5�lveH�3١$�U.��DLmdV"(ZdjpVw��FiEJ��|�Ħo�r�E�2�E]�b4�&���s�@���t�vƦ�����Q���B �:f\�<.�§�� E)� 3v�h�0=	�	T2���x
X�H�5‡��_�6y��|�@��t�w��E��إ��=����:I��M;�Q&v^��M�bм(P2	�ĐL�Q@h�͂�IbD��	o�%���t�;o����$r�-1�^	�y�ƗV��c�7�Kƛg%��RW�.��ȕ�`��R!�v�I����.�YD}#�
�la�e����CE�4�7���`V,��˩���cŻiB�hk.�<l[�:���>�	��L�U�e8z�RV�I&���HKx(�irf�I0XiA��v�0�#�Gj�]�X �&�Đ�.�.���)C�ou�[%(�~��]�X��L�+�B���D���\�)N�'b��0�$Ơ$]��V�(�XXC�	}B!|��@VaEI��ҦR��p�?����F��Q����k�f�|��7ؖ�(Y�sP���R*J�%t�۠@1%;'iL
[I�x��E�b�9�*����L@)n��S�0WL��\Ahig�QӦ��Ax�*�t��$�ɬe�Uӯ�_	�������H��o��(�,[eΨKЄ�]U��
���^��E��F�蟄
��,��t�9��A-̓��"�b���g
��e<?��H��
ʥU� �F��uMΕU":�������*9��Ro��v�^��e� ��D y� �1Q����}t����2ӣT��
��D<�Q�J6�+��q��4�|��y�N�_�K�b�r��H��O /�s��t�б�@ ��e�Jz��Jt�` r�ee��M�9F?�H3eW. �+Y�R"�|P��@dU��rF���0������[���(9s*(<4G��J9��)z��Y����������2�?Ϙ�'s����>�O{k���T<^�dO��Q>Pf�|>p�-;|�WT��SxH9Mv�*����Uv**B�Ӊ��D>7`�˃'���%l�+b�k�a9���I�H�w��|�TR�H�e�X��W��r��j��	eE;��"��QF�mR�8�*b�zo��L���k���l�8��f!��x�䥸ZXW�_D�g�#��D�
�
����V�h�p�3@~�l�JR�z�.�9�A3��2M��2��n�e�;�dԣ�@E����$qu�]�70���q�!7W%8b�0Jt���~����vcj�]
�����99e���
R>u��O�ֲH`|����_z�����
�C�!�hiϡg�/�g"�@�N�v@�!9`W�uv�2�³M��_�m
���MXO@tP����+p�~wF�/�. z$�Z�8@P��hRh+�A_���(}5��/CV�ܷd����Q�

�痐��t��SS�A��*�pRr��XA��ca_�C<d-4��aAG�~{k�kF�Fo؝�Fs�dD���1Y7?0~���[:��F�� ������7���ȸFy��l@U�Ť�Ti"Թ�,*��T50V]:�_/@wl!�R�K-iq(���#yr��1�9�/�\T[�+��i�B<� U]���T*�a�f��xk�����ra��%�I7oQ��˵Q
�q����>��%:\K�y�`�&^�)�&�S%R�VQ��ŋ�{z�tj�Y���m�-�w�%P�p�2���[��� ���ڑ�ʦeT��lT��ݎ�<7D��=����Y#�uZOp��X";Yri]��޵�R:��-`���-�#��<v3X͡���?��{mY��7����U�
�QTytV�P�}�h��4�]Gt�b�!Ñ
4L�z�vr+
S\����P�:U�B��z��b
(�l��8��FC��t'��R�Rd�Z����Zz�=�VQ'���y����ŏ��j[L�8�O�z%b�E"�ࣜ�[�����?�K��ߜ��Q��1���2�;Z[���S�䅫��y͜��́���6��'���1#�������<o��hM)�A����&��)�)�5c�����|u�Ekw��/�?���
msw_�p���+��3~7�{��6�y��|{��ι���6�zd�޳��2/�~_�p}��W
_SЯ��n��vm�a�Q�_�ː��,���u����{=һx���K�f�Kn�w�K��G�7o=�K/m[s�y�?ھ����,Z9cV��k/{�����{�c��?fSb�9���]3�v���_������w<��Ͻ�j�}��}�΋�z��5�����~�f��y��+��?�����~��u��7v�c-�w���3{_o�fww�p�ƣ�?�d�g�7���y�I�s�����<q�Kg�r`�{7.=�?W�s/�tı�[B��<;���~��s^�{�Ϝ~�{ϑ�╫�]U<a��w��/��}��g�ۏ��Ɵ���h��ם���kz��/�;|�}k�8��x��������{��{�<;w�{��G�*������x�;w4|�k]R�{��?���^����#���+꞉��w��u܎���m�j��;�����w=2{x���������4�}��ݷ����?�;���?�~����g?�������6ubl�ͻO9�����Sgo:��w��h�]�X���#o�ŭ�����{O\�tٳ3�����o-��ڃ����֞�����y���?xhK��o��_y{妻¿��{���߻g����j\z��_����;��7�yٻk�3��\�K�9�i���+w=u�ON?�a�o����>�oo��ݳ�Q��I���� ����ϫ���m��*_�����s�y2s�;��V��/��=�™�z����w���n���+��[N�|���z��6�nr��IO�J�ʁ��7�/{�_i���m�Ll�v&�3�9��6&�mcb����̽���ݟ�}��w�{��ZW�������ZU^���ܔY���c�������ͷ����{�j���h?++/��h�-� '�j�"������w�ED��Z��S-]/��<^�٬�)�����Ѥ��^�/=f��U��͍
�@H3{ZA��З������Q�d�S�S����{@C��Y�:{ľ��>�:����C��
ov{C�F-�ͧ�?$��#<EC�]�B!�6��AGN��X¼-���˝��k�YX�4�}���5'�N��Myt	Vi�)%�ʠ^+�{/Fo��kҰ;�9����!�?��s+�A�H���@8y�^|W��U��,��Fq�����ˈ�2�"�$�����BSY7��T��`~�~}�|i�D?�6�����OL�\���Ϙ̄����&��O��|�P��t�.�س�Bl���!!����f�-*FFb����o��;�p�s�1��K�9�P02�df���p2��FQ?��3Ɂ��!�y�?q�a�dR��%��հ&[��N��S�LČ,
�l�i�ڟHd
^Yr���^(i8�Q��6
\ep:��3�u�TR����5��w�p�`o�ֵ@�0�Y�����
G$\�MC��ʧ;�1'+���b/�P��n&�J�Cx��ܬks���"����h�\D�	�� 8u������o6ޯ�<ϊ�u��͛!N(��f1jszRI(
]Эb������F��u��JD&i�Α�W4����^�M����=^�-@�Y�8���F��;i5Avz��|��ۖ��g�3A�
{d�9 6	Z@�V�h��^0�,� ӥ<;Z���>��סp}7�M��,����z~x7]�l������8=z��%���3�07C�G��f�u�±�zކ�f��;Aj�P�>Y�1�<�U'zu��Y>��N��c.�5���%*���@�-���}I�r�%b��� ���T�ì�C���+vf1����5:��|J��j�CI���(x����6�댘��La�`w�?T՛���v�(^��ڼ^%A��M!2���x��(�6[���I�F����t�*1&ь�����ᄑ���qs��N�ns�yd��R�VK@Aʺ�ag��+�'u��	�*C�`��YKG��ݶC��P֡\@�GL�ZM�H���=[	��Z{A�b
��`"C�x��!�,�(��tB��̃�(��b��T�Ԧrv�
�O���Nn�lFb���[eH��k@Ȫ3���W��o����K/��l��kj �Ղ��/�`�|';Z�o��[
�����M��$��~I�aG���+�n�^9%F;V���-v��
)T���o+�k�6\����f�]�e
o�7ؗ��fM��&�@�w�����7��\��J'�@'�6�j��@_������Ē�1 �o���K��u6�<�(L�:h_ۚ��^�0C���ݼ,_���I���Af�����r�!r��8�v��C(�����oR`����0���I};�"��>Q9$
���9����������@I��R�4�� ����
�6f�1�P�r	�h(�Q��*|�g�z��I�0�!�m\ve��VQ�X�Ec!�$�a��U�L
����-[��g�Mjp�mW��@Zc�Q��A�~�A�66���s�:6�I�o�8Qb�o]u�ZC��h�pQ��֖ԲW�u��~D�/^�85P`�`e�>��H�Ê�~b�C�#�0��)qM���D���SH&X06}��pQ�N��PD��@2"���Y�����h��e�&4T���'~�A~�|:�`����#optr
OXV`��*<�A�{7kUE�<P#t��>�)��<����V:�7$�RYp�<��O|�Y�@�\Q���w)��-�vvR�E�����nɗn|�����aW8_Hɪ?�����D����M|��P����iu%\Qct��V}D��HV�m��a,���Ԑ�N(��k��S��#����D��A��́|�z�E��2�A-5TkRk
�=8��%#m���j"v[�o��5�-�w�b��m0�9CC�e�u����tq�r"�\q�qf�����B�'�½0dE��D�A��
HS��%�j軃f�*���%���-�qb|c�^��{i���n^j<BT+aS�.q6Z��,aqN
FFL ,�P�2&��y��rn/õ��2g�%fU�\��),���1��i��_<S�SZ�:��Dq)B<��>�3����w�
���X�E#���^,��mΏ����WW�S����������Y�ӵ�3��F��Me�:8M��ty��<�J��I�Z_��sp�8�B&]4���6�Tk�
���)?����w���Mٜ��b)uUs&�O�r�����|g`σEvgS��{���~��iR�蛜;Z����fk���(��z�ֹ8�"���Fm�pn�i��L���ݖ�c_H��֍0���B���|�%�=�mx׋Z�5~/B�,���<�EO��+��q@=�9S>z���v�}�_'���&�=���q�"Zձ��xr�I:�3��__��i�$P�o�Be�����!Iw̓��x�A����Ym^00�5%	�6T:��V�������*+6��<os�lO^��<1}�a%��O�U�|�g��xq�R%|��"��<(��3�d*2R�e*D�ԗ�e)mTAI�*�`F"��^�$z����dzE3n+[���ɱ�Ւ�ݖE���w��0��Z}��i�!��}��,�&-b»���yDs��G0T~ k�O�3��:y}��g'�uZ�FO�k�J*��c+b6�ʠ�c[0s]<��=�95>�H ���?9�w
9yr�j�.�-R�_\8��J)ѫC4����l���j\K^�X��W4�OGmQuT�+=(%E!�¾��x� �8fvL�@�6�G/�|�d�Oċ�n~@��/4g��g��Ձv��O�ڑ����oDz�s@x�c�T�H�L�jnࢠ#C��cp��T]�>����kM�5�e%��906ⸯ-w�0������HG�C|�G�f�6P\�V�5�d	�G�ʈB4�Y���
Ui�V}�T�]KKnG���_�S�r�R��4S�����]H2w~�<��H1˓�Ԙ�Rg���V����8c'��Y�VBތ�G9�l�H^���|�jO��6�+��=GG
�L��kIp~C������e��~�6���n�D
f�)�oBs<�'Ed7���W��������*���R!�t?��I�r���P�A��{K]{S������ގ�.�|U↖�W��h�FQ�;S5�+P������jSfG���.�/b�,����7kwM� @I�J`r��qt��E4q��a�|���>��g�ݱnܹoLu�� 5*�]#��,PR���q�p�����U��V�]�<ɬ��u=3�ML]�JՀ�{kgƼ����!�A0��[`MI&��!L4����S:O�W%�ȧ�Vȱ�$ X&֪��G=!:��Wkِ��m?�'k]t.��2j��rY>�,�Fci��G��.��A�)�p�䍧���y����A`�+]��<:�|�8��h�7P*e|��ibdؕ2���A�U�2r@~���h`2L��XT��:v�%�ۀ�F|`{#����{�.�,���BzjK�	n^�4�����r��"���.2�ϟ��?�-$mEf6�߳=w}��_������J�_��̺8�7\�Y��Y�!������s��f���1#��[*��l0\�Iۀ�bL�@�r��#<���$��'ٗ׻��W6�*��+.Q:Y���X�<t� �7�;�RECZ�2�e���Ȏ��vW�T��&�\U���u��~��2�M�@��x�Q���byl_tkjd_���ꮡ�N��	�6���s��9��l�H�n`c���[�����?��aacb��ϟ�}�cí*%�RN�j��#��������A������ڲn��ФެW�8��ܧ��y�n��W/m��xĪi�l��h��
�<�q�cr]B.)9&D��z��
�f�ӒO!Әo��<vq���"�5р�J8��Le��F���IBi�g$"h\�~���^6	�"���^*x�`^\8���V��.��:;z��
r����
f��91�ZH�L��5Q��H��~�A8��ZZ<���W8�,Yt{��A:f֨��O��/�����T�������B�������?~&���g��_���?��������������?���~��o�5A@�������xN�V�EB&*����!���	��׀����AF�Ym��*�/���	׃6�x���Om�Lu�&T��1�j0�{�s[��eGi�N��w*��|{qGB�r�����/E�0X �߻:�u7%��i&z
��i�'Z�c-��K���~�h��'�JW~��|�Y���ݧ}g�^�>����>�^\`L�L
�G遢���8�Q͔u`��rآsB��ޗ5�%�m/�X�eO��r�o��[�p��s�t�-|�X*J����L��G^��7��x�-����cfu��§a����}weq.�H{P�G)��![�t ���6�kkS�@���#��$�*�0���2���VF9Z�D���8�"�_��c��+�K?�1~+*{��H&�����	���R=;�;�T�%GQ���P�K�`�O�C���=���@H�by;�Pg��(k�-]�����›�F��1��6tb�ֹ�}��P�4yͬQ�dk��s�d*�����m�������0�U5��H�k�Fk,�kΙ�Q�E�P`}�W�GG!A�H��w�{a�O�k ر@
a�/*�;_e7��A#:�he�MG�5x�]vM3���傖Oԙ��k�	a�������9p�:��^q��e��^��gf�:�(æXۂf{�
�C�j��&�8P﫩m�>[���	�s��%i���E�M��u���c��$ܒ7��L�߀���a��6�O����`�i�������$�e�����?�r�e�|+�뉈��ʟ�R�eG��ሚ��R'�L`7�F��Xzh�"3�(�_�]����T	L	x��A�e���}�쥞��~aa���������慵3�j�9[�^��fͽ���׀�k��胉��
3ʇD/��ٚ3�٫`��/�v�iE^Z�����om���)9v����|�T����������g���M#��b�G����3U�"u���p�cQQKo}�f]]g������vz]����F�u;F��rͣ�u�= �(C0�Hlm����6F�~�i'8@���PD��Q^аb(X��;z�⎽�ޤs�z@���i6ut��a߶k�yC��+HB�J�#O����3�+�`�Q��P;C�)�������,�V*�X��|
��,�OSY�k�
���u�EEK#x��-o�^�^Dx	�j���5��1�������f�����m.G5S�n�Q(
CܬEy�m�'?9�R��S�F��*�����=�LOjl��֭K�.4�ub����SF=��f;ß��`(o�]��'������vu0Zc΅�D/�؍��!����q�r���Ne�!���Չ�y�y��Ǟ�9��t�U8s}��+}@?��'��AF������@��b#ɒ��e���MaTl�@�/����!ƴ[��'��aAL�^|캅�	��؊$ȣYx┙&����r�q��q�q��
�����l*�%сl��0p��.�L9Q���zC	�~	Rm�B$�� -��t/�6���<
�����;!��F;��o���G�1��>�Y�{Ӻ6�z�%�@a�~��n:�)�d�8֖�~Ѳ����%�=o�$&��`��<�9�2���+H�Υu��w�D� ;�������o��;հ	I�k����4�E���"̢gXq��X8�D[Ř��3[�����]6�V���P_������e������OȀQ��T��؍p������*s�-1�}y4��=D�%4dT�<�뼆y�a�\�:<�n�~�D�|� ��'	!��o�>"�v�{=^0
�k�j@�/uQ5�v��s��.��T�XăhF�>�)������2`��M�/:=�|_��>��l�f�o0����[��b�He���E������N�H�5h�ۧ�
��}�|����wP8�ǃ��H����e.�٥k�OM)���,<f1x�1m	{1
�<Ͱ��6C���
��*��E!Lh�+)��a����n�K�K����1`��.p!�׶q��$OI\�CAx�����"p����<E�Cײ�yo�ɹ�P�8��׬~��
�'<.�u�"@|�7|i�U__1��k,J��K��Z3��#U�P�9_�t�ķ�D_)�
��o�f��~�)�j�Hb�ק��k�P�	�t�0Zq��*-�*��`�ȯ�ـl�\�!��:��A5@`��5)*ZTw�|k���ϲC�e%
BS�"��d��9z��s�T��b������v�vu���\���tz��v<�~�~yfv:Ͽ8����
��f&�,��"9$n�GwPғ�!��[��{�ZJ��S�!u����}(k%��c�Ȩ�gs�@�b9<�3{��n	P���l�?�'�B�.sp��"����u�d:8�=a�5�
��g�N�Ͷ��+�h�Xj�L��c��0Ah5
_!��PF�<�m/[vT�M�#ge�']~�
����>8'P�c�?"圱�%8�É���R�A�Y��R(w�
�xZГ�����kf�N���=���!�V����(*�i�p�󂅎�{1�u���Ϥ��H�bV���f�Vq�4�R�7"ou�G�y�����H�l=���W8z??�}��>�����c>*%x��݁_1{�F9�C�A��/_�]f�ң�p�����J��H��K222������*&�q��۲��I��M�������NwZnO�>(O��(`�'8
�J�b(
�N+�:��ݍv��8�����)@b�G{�.hx&B,!V NU�RT��l�#b��v���N帙>5:t�l&�-�ъe�.OrT(��#�|�<�5g@|Ĭ�f�了O	�?o5���"#(���
�Wc�����r�S�!pu#���ȏ2��-2�-KO){*�|����*�O}�^�����~\ӖF��rY��e���aZ�[�r~,]4j/b�4�:~�!$�"��'\L[I�;:�Hm�m
ޒ]^8���>�0jt�~D}��WA<�a�+�+��Z�W�=�ώLP0�[�y˶.^�77�BMp���vy�^і�e|�0k8͐�^�B������,�d�!�
a�����rQ���d�I0���y�c|a�E�Bb/vn�V��w��[�z��ϰ}1 "��F����[��k�)mM"�z��{�	��C����VEA_ۜ �<�=o��~���1�Q����
_�����754��M�W�!�W�
���e��Cl��
o/��$��|ֱ��X��z����=��xf�f��c�E7�xc�K(~<���:����Kp�P�Y}O������Xq�yz^C�}�<��u���܈(��#FL��'L��a%¼��~V��C�$P5��~t���Iή����1ʁ.��o#A��5Bp��Ǻ*1cIdDv�����B����481 0��_
��m>���ͻO'���h_�!�j��]\��_|=����/�97��6�gu��j�����b6��v-�쥽ǸHY&K���ͲQ�gܨn|�c�Rn�pF)X�V�*��u5����+{�;�������h�����GN�d�,՜���-}Fcw�؝�5����t��H+�({��&�ʑ�K_x�I�����p�Ɠ�%c���'_���^���:��Ejp��#�FB�d	
d�s���}I�����^�|���~@�X�-����(N^��{��F�^��t�G�`���:�ր���Q�&�/���P:;c3�O.o�K��һ���2��;tz�j��
.���
u�����E���0�F['@{������T�'�*tp>I=�.�K+>�m��K��*<v�n�D
��{�L�AQz�n�����U�Z6#:�nGb���9�̇�05˂C
qvY��jhr<� ����腟e���uM�mM@Y&M�7$�|Qo�����!AJ~�o�u����Cnnw8K����W
QE���D�5_���f@��&��{*��S�m�㭷�|�8��4H�.~�c�l�����E���k���g��m�v�ò�Mq�(����EfH�[���&j����F܈o�K����ESώ�8��@����h���XY����[R����jŐ(t0��\^�`~S'2�����*�eL�U�<d�:?n#完����k&G%səM]D`�����*]�|���|]�� �X�2P�S��x󋬜�s�H�l8�d	tGT�	��F%"�j=��(��ҳ�8b%��c�7oѥ��(s���sXc�9�{~7���%z�$���'�F���wdAvh䩉x?a;��o^�N���n���.=
OQ���H��b��9e��~�D�gk0m����X��������)<�W�g	����9i8v5�b�)C��[ �~�Jژ^9�\�Ż̤�gMP�����+s������^���0c���‡���c�D���`�w�Pi4%ٰ��`�h�R�R�j��/�BY���-^���Z����'��u�d�ݍA�"*�p����1�@4D�o��]_1�%�)��H�a�ӗ�D���z<
�N�H&�:�I�c��ۮ�H91@��*�ۅ���g�����������hW���8�Bn��a�7Es?l@�֞z��4Q=��{tL������SD�Ms�o�~;�^�P;s��#�E�yi+I�8_�WX;b)g�#�E(�W�g��7fswz$�1�C�#��-�=�:Y�����A�͞��� =k2���}��}z�|3p�3[��Ec(f�D����<�`PM��m�������8����gD_�	3�۰$��� ��1pE�H��֛#�v��,*�g4�iot|V�U��oi�<�W>�����[�}�S�✔�Lϟy�`?@ž�؇��:~��q�����EK����n� �U���G!�B^��RdV�lO��%�N	��~Q�R8%S0�)����)H!���a������s��I��s� ��f2h{|xI�W���uT-�P�~�1Ke<�v�9p���UM�.vJ�1��\�D�;U�Szdo�%B���/������@�y�-�8g�6�m��U�f�/�U{D��3�#�m�l�n���Ў5k 齥�&&�FX�?���ơ��<����q�{�/*�~�����+�k�捚����i�nڋD��_�"�~��Y�	��C�x�,VO��/oo3B�;Y�@�{�7�����@x�,}6	F1��a$�h1jvd����
>�U���-��Y������諠��^����9D}w<�>�� &ȑ,��u��a�eP?Ӫl����#H"__5�s낆*#?��(�5����⾋�'ؼܶ��IP�]"gy�tp����f�qGj�s&1Y���J����y}l��â�z�ͯA�c|k�O�Mf!�z�$�bD!� %
ꛉi6v��:by%�Ս/�l�T���U'<�Hղ�:���XbM&��'<ݰ�G�I��`����E��H��K
Π����O��}�1��>������d����kYZ}��zD��3��1[��rBbltr��QYޱR�'��!��v9�[�̙#��4�S0ANY�����r˲��fU�)4x�m�w�}��Y�$�y�f>��YI�8�n_���v8����:͌�$�[y��=�$�e�s�>������H�F�[-%�����_`r�3g�	6t2R��3߶y4Z�����+K����{t(p�.0��m+�� �
�]N�ӉI�2S?9��V�~6��H�:-��6u2�<�j�Q��a���|�t7���A�wܵ�ys���}�z��O/xm��6�}ّ��t��6]�CA�r��1�6����8Ä74P�.��O��=-�ݒ�牆q$H�^����	S��n 1�EK�ߡ���mVɿ5��茌F��͈�YT��{�Q�YT�U��pٶɜ���з�fD�/YB7��#]��Zv�܃��u�[�W
��Z
�/vqS@1�@;�v�c�p[��p�2:^���z�F�]kY��y1��2̕X�c�V
��o���A�x	@�)��''��ƲުN)�����_��C�d6�.
n��\�~ Ɲhi�l|/�j�GT6H����WN�R�W�dk4�+�f˃���Wk�}�KOb���&=��G.HV�:��BJ�4wU���*=�+y*&3a�σ:�5a��Q�Gt|��	���6�?$��("�֕zh�e�4;��X9?}C����|l���C�t����Ts��RQ3W�+���FA���-�3�SyM�}B)\	޻�'x�2-�.��9�(#?I�Un� ��Y�/��O=���yMݏ��Yʾͫ\Wc)h%]Kǡ��T"!P6,tY�=P_��Lwm4E�o�:�{�u����>��Q�IZ�!c�2V��M���+s�rjt�����Z����>�����Q@Ŋ�����tAJ�M}{��MW¯2= ��g^�>�1!�+���9�p`(�e�4��;��ɀ��F�j���G�
��_!�PQ=�f?�|~����y�G
�KZ׼����M���2�*1��|�kX�6��S��M�?%�K5�׏J?���lL�Va��׹A�Lo�v<=H�ﳉR��t!zn��"�l�����j���ׯ��/
�h����SȢ~���>��|��h���y���/�$(�x5U�(6��x�5�z��P����.��<�r�S���C�1A�`�<��ΒbP���.*6=�rR`=$�!�`���{�ۢ��z�ČtV��9
�[x�no��ۗ=�3���������~ݐ���fu��ԧ!|�{s`b$
\#�wc�&���'��Su��wSPW���|C��4��l�8��{*��㷧��]�*w��S��G�%�|	$�+����?����� �1��2C��x�^�wT�{sm};K��b�}T^��ģJ��j޷�Rٿa����t�����_a8gnQ�*2ݿJ�m��ϓ��MfG6`�)��牒��X/��I��h$:�AH��$��z^Ո=\O�c�XJ�B!��,��!�e4�D�P	��D_V�o�-�<M�0Y���߆�{tYN�?���1����>#�0'�d��������]�Q8O�s��Lj��s�
��z��w#^��������j��oL�.�~�W��.���^)�@b¯�N5}4
sE�S�ج���BHƿM�hS�􃢖�	�sv6PAJ23����2��1�
G�v,�㴋h��&|S��M��L*������6�|�/s�^\�m��V�[����^�����+xu��jO�����:����츽�6�,��Q�����(t�O�2�138&�ʼn����6�%w��{{���'h��&�)���i�2A�Y��8ŋ0��OC���K�Tj��Es��Ɋ�V�>���D���WM���L�S�ٯ��S�Vc2�ꣴ>|��=3�X�X�����s5�ю�g֯.O~>O~TvJJ�^�,�
�D��β�q༕�EȨ%`F��]P\D�M�3�Ow��;�uM���Yr��}�,�֒03#�.�"��
]Eo��ڑ����Cӓ.ۊ���Ӯ��p~ �|�v�R)��bY˺�ɏ�wޯ�+���ɜy��%|u���`�}L���M��a+|��
F~�p{G~r�7v�g"��4c��Z׈0U��s���hL�+���0����n�
W�I8���۠qYhe#�Y�i��R1;)�ˢ#���@��
u�sV�A��򪎼��f/
S-{���nN���
���+3�^mж���>�������6�NMQEUW�\�i�B+��!�8��	J<J��էu���7�h�}F��7/��I�%�]��O ��I)�و�6Nx�L�k���b�O�����������zlF��F�]�O�b�0�>������
N�S`>c?�(�wg߿}��.Xb���I��9e��l�a�Xw�l�z$O�Y�$(e�ȝ���$VMM��"�A�F���2�*G�p���-�0��ѨGp1��s�)N{C
����s�������xoCy���@;�M/����VѨ^4�+~�C���e�A��!��,<)G�\����3T�u�Q����@8]��׏
��u�S�B-��2hCj����!ez�l���Vi'>��\w��s5N�:OVa':6���
��J�yeX,B{e��6r�6��H`�=4�r�5�B
9�d�z��'��?�
�<E��9%���un=���:)B��54�3�j(L��=E�MjE&�{��ً>�����KD�|>~H_1��-GQ�����.M^�Ѳ�w������kU*��_�rY�
W�e�nA�+���1�:�(�]���)�����Ji���9jVruW��1��阼,�Y���������Q;�l������v"{�w<Z�� ���#�����E�-���VY�eK�v�U�s�S�j{�#/@1�N+ک��Ϧf���{��s�?@����̟�;9���殾�}m.�{���~�$�t�dC�4L��@�XD�e0-sևnUy�pf��\	��g˶$_��щZ���)ypmD7�5�i{���(@���&�u3�����q����舄0m���2��9�x�!�5Rad��k@4L�G~e�2o�g��-����Q�#�5��jB��@��1�xt�Dy���v�wWv�������/��UA,t�1uW��Gʋ�`t�Z0t��|���#�D��w�n�W�K}����8�h�M�?�mW�y�r�J�5����d�DMD⺪ @ɖD/���&U�-�W�K���	�!�J�Jzy�x���/E�j�{��WM��z���q]����Z�[�sm�����,u$
�>Z�T}(�>�!]S��|�߭��U҃S������l�����U�W�F�6�c�F\UE~<��A;5��i
j]�Sq:T��e&F^�E�j��r<MY����q���f�@�$A�N���Oz�|�R_���K(�2X�oQT7n�=���pDU�Hx�]�Ş�D�X:������+a|c�)f�Ƣ�L��v4U2>���2�q��Jd
��Mq�5�m�}��bg��a�[�3�d7�v�<h�tA=ۗ�I�ַpgX�p��?r�kp�N'����Iw�B������Y���%|v�<��<
�7uo\f[��{�=vMX�d�K��2|�㨠r'�Y’��K0�;Z�t
�o�B �U����{z�+&g>��_����d{t�G������	��x�zW��L׎A����p�t���
�j��T���}�+O둇�=1���G�؉�6=^��B5�6aе�AY�G��W4S���R��|e��7���?��1xo����i�_�����b��_,l����)�W�/�Z4��4O���M����5�n 1��,]�5dA���œ��U�G7�l���#;����Ѝu2����U����"��m���K>N;�����+1q�.�����AEO���2���E5�ͺ[��ϴeV��4��B�����[lb{����8���[F�!�H8�)!��6~�>l��y*��v=��0��%�q�SZ�_�\�=�R�C��$~QA�ROThH7��sn�%�$m�'kvp܍ò�m�Y�~>�F�+�/������?R��9�o^���X�s�#�_�_�,���v�������������
~����@O��\W._4}R���
�ǥ�4jt�$�����n�?J���+�f���m���$��[�|�$a�<�X�x�T��s��z��<]8���ȳݵ��t~��v>��(h��9e�:�r>)7�T��Vz���.��ܰ��q~q(g��X�ό�8��䯨�.�3��-�WT,�p���+
��/�%Q(�=�H.Rv��3�XV�����~�XI�x�_�=\X�I�h6/�vV��S���ΐ�sjB?i��$*s�%s�<}Ѕݥ��Ƙ'���=�l֘I��f��{:[�dv0jv�w"���
k�(�N���B+��5u�h�Ee{��`�5H5��1���A�W���ѥ�*�40��|F9����ݬ�_�ec��b�I���_�NR�L35����m֣Z ��YC�U��k�p5��F`{RD�V1M�E�Nҡ��~TP8ͤH4S�-�1ծ�봲���
���p_�6��I��;�0
�����*2��>��
3e�B�?���fG�sE�Ԝ�}FLw�D�LT�,P��M�tG�ʝ?�B7�<��T4	�rK�γj`ȶz�P�wVZ���s��25�;�;��t�*�H$���;�P^o�|��8�3�P}�,�^��P������>l,��wE�	{�Q�5���B>>=������W�?)�InOJ��wl~�2M�65��&����-��%��!˞LB����K�3������3�=�KN_
�7h�A:�K���>�{��
W����3��U�-aM�)����l��BI>���Y�@�qc�y�R�i��1�Ԉ}��YP�x����x.��w+�P��-���|
q���)s,�'O®�7F�W�S#��֮�-@f[ۃ�%���D�{eq����%0.+�x�<&R&7��R���n��"��-�X�����)��~f1f�+��R
���&YL��@3��b ��ô�01��_5�	�$6�>Q�/�3N��4�4�u�f3��7>J������qw/@�<Ⱦb*\S��2_��4Tn��j��&x�HB%H�ޮ�drU�D��Sj�ǜz'����A���46A�I�'r���r��F�[�E�w
��	Ս�uR�?w�T �4��W���[�T�dV>uuy;�W��w���C��X�v���lhi�né�'��z��b[�2Z��{�N~u/��(�s���/��{�G��O)��)A�;�t��N�]w��N���':b��M�?[��Ty�r��y>�mn-F��jk�i�W��`	��B!'k�1̊>R�%&s�*5N*��xG=Z���A
UL�u.85��h�wy��g��T�b,/
���$-B]'ujMQ
dH�[o�O�>��NQ<Z�yB��US�6��Cb�c���P_a��L1%LTT+/���"���y'n�ug���d���v��x?���cMRR��1�NW�;hto�׉D2'D�ȌX�����/��B:�݁�u�H@ETZ�rk4���7}'�п?�uA\���
�x�X��fU/��+s�����M���-�w��q�4�.?���������Q=m
�5]�CqF�E&���o姐!�B�G�0;��\W�j�/���j����ei0$�Z���F?�b�V"\��^�#�o��KL�6�˽'	��Vt��ff�1���;�\���oά�y׀�tW9�YAӅ�l�"�^��ת)��'(vD��©oN��5��@��F����g;�H�J.��`�j$�n�S\��y���:
�v��ӑ6/�X�c���Ɖj��$�y�.S��_/�D�4�XҒ�{�*l��3�1�m'��(�m�
��śWMo�m�@�T3��Q�h�=�>y�k#�tS�*�Qۀ�BM#w�~߀��j*R^�����sgs�R$��?���Z�8��A��qBÓ@��ُkL��췚��Y x��]U�m>�l͜�A"�5�
���b��ȓ��� }g�5����=Vq\���+:���6�l?E���+�K#��D�Wpk�9@'� ��G%=��˩.��`L
W�)*�pLJZ��U,C�x���ZU��ݒ����A$=S�L��pQr"�o�	�A�ٔ�3}k0���s���
��h���P�a�̊K�9�\ؓq�'�
��
t�&��U2_�f8D7w��i�_�Y��1����g����^a��Ņ�d_^s߇ہ�B]B�	�<<���
Ǽ�0�m�S�o��������~�[��f��R_?�eE9z��
�Z݈p��(����8���,h�'�7
����|r�|�e�RKpq1h�`��H�%H{]4(�'�Ť+ �9���B6�:ß��i�=���~:w�	�-��%�Y,zM��)J�_X5��h�<����F�,,�{!�F�$��(�=�Kq	��vI�
��>�{k������<�m��y&T���Qv�k掛G!J�l6A�/>�,0����H���@u
��Ȉ��̧`j���-<��i��(X��6n�)L�=�VK]
�6Es��1c���`Is�χX˳h(F��ʗ��I��S1k��>f�K���Iȣ�G��2-�91�K�e�T�B`��M�C@�!�w<'�D����l��Ÿ@8�!����0P�����Z�+���߳�tڊnE�]v�=	|ȣ�
���âYyr2-0�
�7�d���_�"aU7��w�,�����R���Q�~����쪭��N��+��
���p�]�l���|�Y<t3�g2:�wuҵ()��4_�	ۅ��p���p�=)�_���d��"��6��j�_V�jh��٨�0���w���]=�V-����)/b�G��Ee_<�
W��>|P�^���9}�]�(��}�L��<Ew�"��y��-��_�����7��4@�2�s7Ȍ�M��bK��!oư�Q�>3���{*�,��,ȒP��ZJ�U���:�q�5{��V�r��N�
ڬiM�c��dr#�v����f;�d�1�1����rĺ��H?�Xӏ	1����r��|h����$j1���A���f��#�&��Q��6$ڸ�B+J'�I�O~�?��V;6�rH��H��)Ng֯�u��^��e���y�a�E�و�K`�5�>=�O�#͚N���<E�Že�6n�t^��VՒ)x_�.ٔ�c�}YƼ�����B(D�k0�~|+x��qo��<Q^�&�d�I���7KҒ
6h�7A�S�����f�.��?��D��g"U� <�r���;/+�����l��������G0���\���R ��>��3��}�����!)��דl3T�_���(�A��>��<Ib���ć��ih�KI��}S�,�T�3n��=g�1}��I�� ��r?��a�`UGp(��ɞ�1;;��ei���]�����t���$M;�J>�C_צ���l��[��+7/G�{�a����c"��z�	�0h�������N�M��N�g�D'���l|��X� �es⦋���ɱ[��p%�"~I�do.��H��;:n\�$�j��)� ,�&\ܭ<N�>A�p��א������58�v� 
XRg'I�|��qQ���o�.�~�t�Н,��IB��1��~����p�@�A�Ca+��:���3p�1��D�@mLR5Q����}s5h��	���ĐP7��P�bD��lĎU�\<�8q3;qa�G~���gB�Gm���g�ϒ�ZN*
U�q�9dn���fx[.�1D֚Y�����b6���>�E�{��m�S5��yd���������KzAD<�󭘕�:�&����	��=���G[ٌ���YM�601���k�"c��j�!������Ua�y��%,o�\�3�mM�,���� ��[]�<`}��� ��-��vS/�_�̯T�ѓn˒�.��+�3��n�,2���7"+�F�"����5��|�Zx��mK�VGL'��G�(��<"�-^� ��K��#����QSױ9$m_)�Z;1�'��;a1/l�����6
\^���K���}�T_�mgo��|q
t:隮܇>�r���6�i��](i��Mrc�Ѵ+hQ�#-� ?9�����ia0��MEfP�T�a8y���m���C�Ǡ%�[K5̓��Ne��3+��s�N��&T8��K�� %
�ُZ��3��2�M�솿�xT��~�z� �u\].6����
/�Χe��9l�	�^�IrzGc��9��v�Rr��A�W��;���c�Q��e�Z���Z4�M���2���I[4O�!�`�hI��h��YE�Md���V��cv�j��+<��5v.ju��$�l*�."L�u!��**�pG��Ƶ��q=g��$�'y���`�a�L��os�eCq�"���1&vS�%�n�(䬫���{~=}�j�!2��?_lY�Xy�
ݶ�̂_�ye�KV@Ж�$�~߉̜��-��q���s#2��f�fix�����%��l��9�L�-H'�m��<{�_��t:�H�T�F�qI�_�2��/��io���e�b�
B�|D��">5IM���&h���Uv�y}�j5fN���@��q��W���,�gI�Y'H6!�/�r�8��a��"�(~8r�,�S��ς���ϣD���}���ᒩ�h����#��ǿ2��5�v#D�`CO�pd�
�C4�J-� d�L���0K�
�qe�o^�s�ۚ�ÿ����}sW#��h� WX��g��:$/���8F�{ ��+g$e#�XԎs�RΕ
�um�{���L��.����?�b��AȕUkL6�� �@��)Y����Z��蕢��p�}m��Um��PXW-E!NC�A
��z@{��n�k2�g5��qrF�d��$���M
$��Z�I�K��'�ZЖ`��<�WD]�%Wj���>�#	sL���ן��М!YAn�6��~׏Dq�r��Ցo`����%t�^4acv��}=DY�U$��E�IƑ��+���M�c��S>���5
JX�s�-v�%f��)&�v�E�.!�A ��)u&����D
\Xρ�+B��FOR��l(p�Ìٱ��[W��+w�����}��G�
�����]���,�4c#?8[�XpR�I�0?��>FI��	�?��4D`X�>;��i���0x�����Ƣ�����T!�q���VA%&g�smNy�S���r�v��L�����q��^�{�`s���o/p>-v1�I,�Kû��|ї7��~�Lt�����ӳ�Sc�AP�3��.�~i���w�PUE�0t���]�ތ��IЄ7�!�Vk]j��&�U?3-��r`1�F�LF�V!�4�+�XR؇ miJnI����6�%w>�-��FX�@]@�"'i��s`\j)��I��a��hr�u�0�@*J�Z�dA�<�b��\�*���!�[��{C1k�su�q
�)�&���i�O#S�)S�
eXɉI�l=�����B�H��<�������s��i��H�r�ԫ�u�û!�Ù��(����,��@
�wY˩ӏ��D6�@��g�6��dE��n�7���ʹ����_���a'�>�o��h}f��<��]�`ʔ�S�"�#9�&������8\�O?�ʀ����=����vS�� i�����.5gea�EG4�DZ��'�N�s�{篝߬]���}U����?��Ո:��E����)�+&%�6e�۞�˷���kt�GF�!k�p�����Uq����pV7��MD=�n"�y:�(ΫBf���q4�z��
0�^��oLO�5��g��D|�ub��Yw�.�5J�F�
�ow$fʖF�l�x
a^��)�_07�몟?��n��;㜳�k�`�!Q��w|g��'n��@���e�z�z5+�_/QwS�RD�g�;�hHK�k+[�qW�A�`��E��R}q���CJ��`��$�L���O@��兤��%ߩug����J��ea�;gv�i1�-I"/�0��\�Hs���7��hН~�a���^���0u�H�(�w;���GI��Uv}�K�����v�r�#P
��K�_�,�'g�D4h'S�GtY.�,|ʈk#�����Ɔ�2yD���!>�E�G�����R����!G�^�6e�
��\L��߉��5�1E<0�l��P1}4���r�
����Ek�܋�J��(ƙ�}��a!��6'�jܤ�6+l�O�M���d�E"�'|�S\��ǧ��M�ˇ��� �j�wV�C����P+���5�^�"��"h5Jr]]��(q�B��	!A�t�$_�L��O>��X��.GlT��k"UΥqG��t}��3��puA�����cmY��������X~i���P0�y|�:��GȏdN�ڃ���O�b�7��:n+�"��P۵�E�%���j��e"�(�����7�Ew_,/�{t��Ux�üF��_v���Mũө��f�Ż����}���
���%�5t,*mq�\��.^���hZِ��֕�����g�n瓵w9���:�P�w��+�@y�?�{*X���Gh;+�W�Q���@g�4Q�p�����O�M��o�>7��2kl{�`��'nD_�;�a0�B�$��T�.�8O��`�Jp�э�:�j�7�$����Uv��c�1��踬��7��۱��N�DٱɁ���yU��F�Vs���+D�C(RZEl��Wؚ0�1�SEn�M9��zp���0W�w��uMR�}��-�Rf34���Ņ"�)�.*�U}$�;}K>E����S"�#աc+���B��Ux����i�3ݚt,�-�Ĩu�d
�+�a�R*�-�QĮ��ׯ6^��kT2(T�m!���g��0�B+��+�:,0�i<o/M��)�d�q}�C��U/�z���Oe<9�W���cX�~@3�\�&8��ҬuU�㈇-q��"�x\�:�FU�̅������C`�ؼ=��]�O��[��~�=q3b8�ն���P�)j��<� ����Ct�kD�_��CS�[���\2�;�	�A���,�a0ւǂ�y���Tu���0k��5,S�Bj���)0�4Mk�o�D9ح
�'ё��:.-N$k��j_�.��7w�∾����bs�s�>�T����Є��x�|��ɩ3��bHU����CIHx�܃�W�r/���
�����4%�^^�E��l���^����vt�<�XSչ�[�����hѼl�����&��t����6��ɍP*,��1V�D���|�qΣ�H��A�mq?Ƕ�3&�b�+����'ו�m�ߪ+"z���z.�qsy:�Y���W�K���p:�����(�.�үLB���<�Ny�������v�%�Y�pak����d�8q�H�ȳ;�j�;�or�;'�W"�%�al	��/�ں���|y���S����6��]h��0qS&h1��9_�lV�[8$C=��Q���R���2U9�0�h$|�'�]9%T"����bľ�q��b^nL�B�Եi��� f:�����BWt�w52k3Xi����9�~(z�D�UmV�w��/|�k��9�8r\E3%�^΍+^N����^���bЌ���l�6LL!�gI,�^Q8Ou�r��
T��
`�aŚ�b�5p��r|$>T�m.��:�̮G�$b�v���ܸm�^.�]T�������V�G	Z"�Oh
����<���^'(�1�xm�|�)��٣wG��-M�s��G�ި#��zx�LD9=
DH���*٨h�;BW�}����Y����n����..�n�������>�$��=a���&��8�Ӗ�&r/�Ǩ�/ʌ�
_@�$՟;3U`_{�\�`%�I��A�E��9ހ�΄�[+=�,��|n�5E���J���}�a�!͛	ތ���0F�M�#+R��bn�LU�Z��vI�Z��l%�lK�ǎHӫq����4휫АI�{�ap��>(>nN���R�P��J�����5�H��2��U-��L��7L��1Z$*Aʽ6�ϼ\H�$4
Ey5�[�(�ց���V/��Á��)m�,��jx�8�~V��h��<qG���d��OO�bP�ՅK41��U�,��kBVIoo��a�E�جd�,I�'A7�&�Y_Ѵ�n
PŇ�n9�V�O�	"uB�v_;�3�Ѷ�mW���������
	�0˅�6��������'���Fc��f�?�Q���c6P�%@�T�)DjF�Z>v��
�'��3b����r.��՟���7�d�
�-?�7��*쭫Gs�&�����^�|�x��Y�O�WiJ\�X��JQ�4��f�Hq,�����,�KU�IH�5Y׀=J�f���Eg�uk\8�~V1���`�8��Θ<��p�y&�t�L��h��DA�•�_8i�W�����b
��X
he�%�����!	vy^�߉�N��x�zȰlj������=^���Wy�ڈ�$~R����k��I+��S��,|3}_�*�<D�GZO˧���%��|�{@�.���
g4|��a�e�1�:�h�BNR��[߾��`����֣X�kN����3��\ d���]}�J6ʗ`T�J��5�K���[v�@�G%P�0.i\�j�ԕU��vFD��k@�E�›.a8�_�/���5��[g�	�yj�K���)FBEk�mVt�+>m_�ԫfm���r%�N��	柩�G-J�(M��40�ghJBi�����v�X����2=aH�CG��1Gv��C���>���[�FMS{�ʘ��¯Tߵ�SmO��Y�s¸�Bl�l ��ڼ���Zy��E����B[��z(W8�z>W��b�j����e�}߶.gR@Kԁ�5!*w
SBl/I.�C
՚` 4ꒉuċ��)�lW�I\�;7N�����W���V*2�-��������SX~��I��;W��o�	{ߖq
%�_^,�*RĽ�ג�H��=F�
9s��Yӓ���o�b�n���eSs~*�"���q�
+��Z��
(OS{[�2j���C�F��7J�X��S�q�-I�r��<�V<�}W���6_t~�<n*��{=YB�W��!	���yQރ�|��M��ik*�z�A�Ḱy����=kl'�N�F��H��crǙ��\����=ڡFB#�LM
�ݜu��s�W��~.Z����bnd�^�����:�ʳ}*�(�9�"���nl�d<��P32�Ə���y��6�ek�>���@=����߳����ƚ�H�O���QH�c���:���z�(b�!�@3� �MR>~a�]EzP��&�hf���rZ��!�7�R���A'��fXͲ�� @��d�&�;c��zc�b��t�}�lt�X[�?�rq����uD��?)��{�
$����e��Z�D�#z����7���弁QO������Oe(r]诽�N��.��X��0��y�Z��[]�k[��ʚ�˭�j%�8�W���6��1�NNm�LR�}��)C�2�	x���$R�j8B���V�}B��N���`�¡�/~�"а�jyw֦֕�c�1M���Ö��u���Ľn��6�I�Yr�˩+�+k���}�<z
XR�;�3X:*��1ʔ��>S��oE�Ms�|�(�w���\�����`�Y�t��$'%�f���3e<ִ�b�0�W��TF�{]�$ ����.W�k��9���B�U���
,aj�2�w��1	�5�Z��3:9���5y�kd��N:x�ӑ�ϋ��IW����d�+�a����Y>�S�G]�hC�7��˪jF����X����E5q�^Xm�<]!��� ��s!���R!nN�G��7,>����5�����T�Xn!I۬B�X����=���M�Ąk�����U�M��Rߙ8T���k=Y����mh#����e�p�֔@�!�
�^|�/Ny� �{�tN=PP}���AY��H��;KS���|�W!���Ѡ��&x�^O�F�%�!��������6e8��鞏:�m�@aC.�؂�-�A�Z��i�x��̜�R���&
���,���fW���'
�$�M�b����%���t�M�M��DS"��J?W��Q�U�'�r���9d�]PV�	T��R��C
]Z��	�Z$�۱A[<�h�#�~6*,�
謕��2��K^K�(��Fp��ZpGl�����-��K�]t��t���u¦�Rh3��j���P��T�}
��%l�@�ɺs��+�08v��b?f��7�_Bj9�R	ʈ�U�Q;u
���(:@��G#�@;Sɶ��}0+L'��a�uS�j�ZxR�zN%h��)���&D,C7���,+P�ëP��(��gm��E�)
�l�$N���,�hNa�UA8S��)I��tRyu��E*�X2�ƭ�S禑��m0.�c��.rG�!Yl�I�p��H�!іD���K4�p$O��� d��ж����kp��
u_E
ߠ�"3E﮲bV���5��ʺ[�!��>ba5��|��E/���&U�9�D>05��m/�K x����䅌�Ī��]�6d��F��\�t��Ā>���8r�F��e�\��}B��	�$e�\d����S��b@Ai��<��RO��y����� �|&�����
�lS࣎EC�r<�.���W�萚��~7�N7+��Rk���ah4��2\]�Rz�!�9ȩ۷2[�Z�n?�MGR�Fr,��P�sָ�K�p�C�_�{���U ���gc�P|AZ�W��a�˩�����|�w�]�+�Z��9���O�kv�D�o�TO1���� �*>���ԛc,��ѿ��a�mP�;)	��y��m�}ޝ �"Y�WVh[\�s@hN�4�V�:([�;,��Ma�y�D)HH����
��Kϑm0l�S���i�}p8Y*���{��_}ߤ7��{lc�ޚv��nM���4Q��8�Xri`���"8��
p�I�|%�B�4��4���n��p��h�:(���\a-[�K�Vh��}\���]u�8�����B�i������3��bb�D�������	���m7��GvVh�[L�s����y[nra�
�8�%�QF׺�A$��J�ݚ��/�ـ#fJpw�I�Y#
���r��d�7���f����ۗ'�{�K��[�$̫��+e=���`�E�
x�/��P��ۋ �W�0�����<�–�d��u�i�U�T0�h���ɐ���7ʁ�<L�DpM�w���O<;�~��E=��$�ȣ�d
7O����l_ԣG5ҺffEKm)�8mF9.QKYX��2O����b��(M"K`�z�v�i�Z�]:�21���n���L�jH���V
��,M�������Ұ���z�&J�{@�Aʛ��f��xs?8�tr����O�idC�BC��٨~`����)ӧăWt\�y����4V�?t��⍁d�mz"�t��Si� ��;����.9���&…O��5�E?��Y�#it��~�#N�Tr0}�mPQ?s��BR���X�A=��2sGh�K����Oy�|�^��@%؆���%�z��*C[���KNNq"G�m
���'
�T��ZEdWu`\�q�����\r� �O����#���ׄ��0��� uKB�\;V)S*`��y���w���\F%F]5��A�7�+
W�������$������6:-�ڢ�j�v�E��v1�=��Rzg��N��w�	m��Le%&~��cF�8x|��έR�ۻ,�q��z����n�b�>��V~��n_C��}����wh
0��P��Ihi��S��[��袅��-$���ڱy�#ux}ۘ��+��;��TC�'��
�qeZ_Wُ5���>�<aj���\�y�t��v�c�!��+q1!Q�ͩ�հ?;�E���'ݜ�m�9Q�lpY�a���9�<:E%Bb�G͌kT�1]�I���8tx/��?�Y�̥�Uz|����B8}Tb��93�c<))%�#lh��sK�$���:�ݺ����<�d�p^��bi�9!.h�
���xt�|�V�k��ֽ�J�7�<�!t��Pj+e���t���؂@E
s�U~`�ޣF�]����`X�3-z�H��Ԕk
ܝc	��/Wh�'�[�:�/>"A9�m����K�.����(���U
���{v���z<�=9�@G�z�6�{K:�or�4g	��;}
�6"wS����Oa�t'�	�!���lyK��ˊߤſ��
�i��=�"�,�W�v��\h�n��h|Cx�$sh3i�l�"��Z|&8���c����mJPNyP��Zi�/z��!󫗶F_�O% ���d˕�Ĭ6Ÿ��J�j_�c��@ ,���!���f*�)
��6�B(�l������L\7�B"�܍�c�U����U��Q�loש�!��G��cA��V��.��B�f���,��uXn'�5�W����pg
�Lq���a`Uw�"ʩ�3U|���n.�-죏���n�vf�k,)�?��t�&^�Zk���6\�U��]hY1��Z}Jgl^��|�E�w9pdw�]����S�zT
�Uݩ/?�TD����M�^�˃�PX9[Mw+���0���y4��,o�c�YC�k�%mV�p��_��.}�i��Pua�1�d~}`��@Ӟ,��	����b(�a���e�y;c�G)*W�y]ӆ�_�pp�`�p�^'��+��\�W�4ܓM�(ù��D}����`��W�aϖ�Gf"Ř����ǁP����dd
37S�	ƍ�!���6f�+�����Rņ��F��y
V#HI��qT��"mu9`��{剉�3���t��?�
Љ8�&� }V�L��J~0E}���c:5��P�e�9򡱚>�0J�A�
�ዡ�s$�G��$�BI֝���N�6�>
ւI=uki�m�SR�}h��N��P�;�s1Cc8�^�b��C���UH��z���ֶ�ֵ�T�=�J`�G��-;��az���~� ��#9�+z�09'e��P"�U�']�+ ��Y�u�LD?i��ʇ�)�xE
��Si��I�8D��bW4�M[��B�:����h5��1��,����~*sP����D>c�|�����%)&���n�#I1e�:Eg��;�~sP�<�\)��	ֺ�3��Pq�2�)�A�1�>fJ��	#t
��\U��k�y����gT�]�=�W� �-Y�H�5�U�'o�4>��B����!�CI��81�F�~a����=����
��[m4b���΄!
!wL��mk-$��|�9)}{�C���$s�Ei[�9�-l��!T.�j�+0bk;
�Q���ŔI�g��Y����uy|�Ʒ���&}m/��v�+W=�cp��;���V�qU(7`�hp�8C��x��"���x��)<.��9H��1I؉R����rN��j5D	Ji�w����.��GT��2����]��zI"A��l��L�?{�k�T�ejq��1�,�!ll8܀�[茲��Z�!/\"�o<T�F);-�4/J�D���Y@Ԑ&J�XꆡdTj'��Ẅ���}pS?������G*V�в"A��� ����fN{�~s��;�Q���B~>�	�mԾ�]�Ƙ6��~���c���B�����R�K�;�~rU�d�//l�qw�%��{�+�6Υ�*�&�J��Ǘn��n9"�ʳ$d6������x��kZb��:`sq4tR��q�pi�� �n���������&[�X�L@��A+d��q������ ��܅�`����IaU%z�t�<d)+`��������W⦐j��iK2�������J�2����3E��5�o����r�Â,��5�����Ҕ�0��E����Z$Jm��q�9�����VL��ø�-r���	�[t�6�D�����1X����Gz�BP˚P���W�s���ʓ<u�ȑ/��5;c�lD2����/x�<bl�өc�heC�SfXw�6�et0�fƐ!����J�c��0^���DQ��E$$�����C��S���cRv�������?�K�)�~`�&	�^f�o�Y���W�:~:M���2��޾s�'���F�t�vФ�<�m�z(3�p�9J��t{p=�����ŪA���C=�G�Chh+���,6]z�6
+Qއ�ʡ>�FC�6��0L5ܕ�7����'B-1:�U�CGG�Q+�U�f� ss`X��W$K�h,�4�ٰ-C�*
&�Z��4"�j�����}�2�rz`���by_g�Wl$~X>Pu4��F��mO}��}��A�s.;�p��k�*�
��SH4�Օ�������P�X�˽|Ԋk���J�g4^���$���ח��>�G���3ƗǷ��tdf��o���m,�C�}��w�Ҙ.) ��0q�[�Ǭ�Yr�`&���A�>KOUQ���ƞ���:�4[�9��)���)/���*�W�O��\���
�!�	��.ſ��7s��K�n�n���/?}
�j�N
*xc�0���$U_����$��vhZrۧO���㌪�P����
�V�o����8�	?���b�;���s�xz���K����l���n�����qwU��a�Z��C�����6Y����Sj��4IĤ5x�Ȼ�w��a#��⎧춣�ͼ�Q��/�>�xJHTU\�#�n֪�;j���TJ:�3��PF]��ޡ�
�yS@ɪC�%�n�n:�+"�"�$/b�L�N��N��},X�dԹ�\Z�L`����5�R)����%O-��$������bG6d,��@G�����r����K8]YU��1>�)�n]�=|�,��I����r��~f(!�)D�/�KI�VIn3i�5���<��G�Sb�[��D��_ڸc8�Ep(���.t�f&�ϧ�2���V?A�u�a�i�IPdRk]�`��niÞOӕ`��η��	�I;���	{�r��ty?��h"-]0R9Z�[>&P;��L0(VY��#�T|$h��y�U���U<����Ğ��?�$���3̙��q�v�"{R��~R���=�"}^y� �a��Ъ���r]p#��<�=�4�i3��ns����3jt���v��4���P
�M@�#A{Dk���W,k! !1�M2x�h|��~��T4�:�|��~��BhF�j)�&`&/�:A1ߓH�mIr6�|'�I}4l�_z�ߋ.v԰=��"*\��O�O�5d��4��3��^�6A²�Gb�~�\��������O�J5qY��9�T\JK�d/�ji�6ò����w��A����L��6'5���6iL����ջ�_�C(�q�x~]��zNՐb��y����F`���4ĵ��J{���`���m�Ҡ��4�R�M��-��..Y�ѳ@������7k����=�~-X3�][�jI6���|�vZ�`D�c�듥y���S��9;Ɔ�NO����	�7���H����C�ߦ��[}�,���_��iX �z݁��Bt�0���I��2{+��m��&��x�[�٥��%
�5H�+��1��K���e����Q�d�Sd��f��k���oՁ��w�
�9�A/��b���%�ON������>.�h�ks`d,�>�7�I�ۍ�z7(���,�1����f���5��I��9�s���aR��qg�vT�,Ml�Q��}|�V�C����B/�F&j-�ݘ\
�i�OV��9�P��#�+D���Z�x
9_HWo�k�u��3��Wlra�b��V�v3��^����\�9�x�I�������T�d�t�@�Wc��^���k�Q-YhsM.�S�� ���/vՖ�+kT�iq۶��^��3��`��<�/��Z�
z�#�|��� >�k�i�����:/�MM���8Ե"�jk��;��������(�s�����=�@+�h����|N�N���z���	���y��f[��0���j�T	�|օǤid!���C�ê�j}��e�m񠼴��@��z2����L��9�\�;�
5�QS�oem̕Y��0�����&�wtZ��0�LU��Z7�P�!��T��=K�Tm��+��v?^�Ģq��-�j[��
n�Wߋ��-D`>��桩�퍿�vbu��f��}�w���=o�h@���韊?�?���0023���?X����O���1��5ˀ���I��_�
��N��^/A��9A�x"]��>�9�$�zf;�Z��j��>b(+�L�v�m
������e3qk6�zZFP�,��U�����"E
w?-�Rw��A_ı(
�|�̉͜�'d�����=�V&y�)S7^�I��6BZ�ר��ۄ�S�L���P��[�[��6ȼ��,4.���q�Nh�Gc��Lb�	M����L�:�$�ρ	S��Ɓ;j�|�-m�3]N!%ӑ����ҭ&i�HI_}0�L塩(�׺����S�V���m�@J��v �2͂�(�	���i�
����?���!�M�™j�ly��|ݷ�9sa�v�5�@(��w�.��ċJ�`�NI�$�<_���Qte�h���*�I叄�I�P1T-Tl�w;�����0�o��ٔG=��Ү��B�װ�Qė�i����6k��r�P	L}Pn���<9	�ϑ!�a�,��n�)�sa��<��N�dVȕc�b56�3�A/TT�(P��u:��Ѵ̣ke�/���8|?�>�sp㽎Ɓi��N����W��7�x���/Xv
ׂ�H�p_?�Uh8�uu�ǔS�^e�7(
��%�������iؾ1%����{8������NM�<�k/���::�����]A�W!��:����>1�E�r<#�F���	���)����J���_��/������������������yL���?VF����$� ��KCDd�lklm�@�lkmg`�3��������ڄ������gүbbc�����?���GgC��I�t��+��揿tF��N�vKp�p2��+��d�#��ot��&��p�������{kg3[';j�ON�&�&ND&�vD��₩��8�8��K����/"��Dd�DtfNDD::0N�&�?SM�� AdaKDB&@�3�W���F��������g��$DԿ�ؚ��Z���"�#��{�f����7	�o2?9�7�$d����*�志�I�O����<s���n�>���������dadfb�gw���_�_ITPDV������?���,,���0��e��H:Y8Y���98�:9�Y������8[;����Q��֘H������o)&.&�D�ׂ�u`�,��~Z5g';'#��&����Ζ����s�E��g[��&��00�.&?�4Կ��Z>h�~&9���9{'#s��X����Y89�2��i���0���?���%=���	��������/��DNV&�D�&F&�&�F&�ڂ��ٰ����9.v��'��>��������Ή������x���\�{;[3���4u���i��*kk�_��3��e�W��oy��h��a��X������%��A��6���Y����X��������O{x�����6��	����d�W�o�k�O��V&6�����{���V�d��������/��'෬���Ml�a�x�6p�52�i�Z�?��J�������	�����ʟ������3�w����������S6�h�g`a�O�?�_����K������I�/�����u��3��?h��:������������O����� �?���'���30�e����W|Dt.D<��L�� �+�wrp65�)��k��
�������?�H�����&� &6ƿ~��3���_����o��������e��Y����O��������?�����gfd�O�_����?���
CD��&��?�#����ޭ?�~=8��ε0q�����������D��&��&�00��f&�li���u�-ǟu�06qt���3�W�����#�9D6?%Cd�+�W�aB���`ak�+���������%��tkb��$�/҂D�i�l���??��,md�llb�������oB��a�b?�w4�61r�{�B������ѯ�&D��?�eB���Lg��������!�����+�����o>�vk����v~������������-Y�䴁�o�i��;6;���=�)�?������=��\~?�����DTL�t�LtL,�������Hۂ��������稘�th�d��$���~��i��~Q�u2q�w��ٞ�߼���
�����/����͈_��?G�@d�lk�N�DŽ2!2���5h���9?���ّ��'��a`D~��?J�o
�Z8����ƿ���k����V�������w����'��7iX;�Y���)DF�?g�߇�)�*�G��ϩ��_͎_�?��ζ10��s:s���W?k�;���ொ�n$�����꛸������|W��m�w4���&��R"G{#ӟ�~�߈��f�T�?���I�o�����8��i�lMda��S������a?~��W۶v����?��e�{�:�|v����Q"��횸��7���:�;�Y�R�����Wx��o�$FzNzfw���E1�#����R02&��b�e��A�Ξ���׀~��٠�]J���)?irQ�������k�_���w��7T�7�G����J������Z��L���g�_�i>#3+#+ѯ��,�,�?5ߍ�M��������M���9���M�o���F>QXE>��I!I����U��m���$��$���N�ivw��ݤ�	"��'���D��-* ">A���P��9�ޙ;;�IiÂ��}��̽��==V(�H�MBX7"tS	T��W���#�'����kk�@�_��^���V��yKg�G1�ʲ��:�"����+	�B��r�b��׮a���k�Qz)S�
�!�d(YUFvd���,�@�������p5����Z^ˁcЫ��bM�+'V����e��`=�`����{\SzY�������6H+��聴n���3o)����1�L�s��V�Դ�R^h������D
6Q�ʳ[iQ=�ӄ�##�����p�{���F�Q}����d�ѱ.
#�G�-��p�_T��v���{��ivb"�]i.#y�$��� ����d��L�9��h�B�?tX�<��ղI�ds�h�,lL��'$,`x����̬�cW�]��������T,��y�TM=3E���H�hL�ߒ��tB	)�qk��d8n1�S�1�$-�
��T�4䄪gp�C�D����e	1�8Š����� �,ؖj	�&��WS�u��7����N&f����*k91x��c�*��!3��ԌP��1+��[��5��ܡ=����@�܋<
�ji�@����Z�À���6��G�d��`�X
E���Ɠ���v�����I�X ��T3&Y3RUb�9b��;�].�Z����x�kI�Qତ�����r�a��d0�ΫpN�s�P�
�a��5���&u6�I͵7W��1'�8d1m0$�Ji�_�V@J//�T��
h�^Lx(dh'H�YM�Y��Vx
m;g�J7 #�ߌ�{8��Z����b���IÐa^��{L{���&�;�ؘ��'f���1����l��� <�/p�v@X�HaRE�L'����G.�B��xKX2��tc2�9��Y?�˜�z:eO'��_�
�ܒ�u8��x��v
ލ98nP��/&�
0�mB��"�	�+\2XXh�r���h�mC��P�]G�	c�4������6	8"����ю�AT����Bӌd]oH&�{H�X�Dh 	�4��wy�qeEDNN�l��/�v~�q�������A�1)��=��-	���M�m�x~|�}�f�]�W
A�z~{E��-��؝&��AwE� ���mM6{�Cb�����6����0��4�1%Ķ����H��Cp��ф�}J}��(pI������Ԙư6�Af� ���)J�UNc۔UFy��
�i�!J���S�R4-�n��Қ�q&��Z�0Ĭ	9G_&pE���$�M2*�_t0��~e5-#�&�M �/d�M4����>��=o�`O����XN�#����	��a�;�>����R	x� ����0K�sD*�ϲL�x���mƎ-wLz����`��Ëv��hѤ������T'�����p
[�>q����ǀ�h�Qi�u��(HDm7O����=�>/���2�<*��S8��'k���ڪ��J<٠�NB�|(;:	�fjL�`��G������
�.�
f�Q+�-�����fJ<���*ILTV1�ljȇhF.�g�-�k��)��t��6J��R�\�0�H�:([�16YN�ǎ�f@��qzp�D9s�C`^��C�G�*(c�����o���Je�HP���A���U�2R:�?e��P��8�@\ԥf1�.����.�RM��@����@��9�;��*���u
6�
�]�Q5x1�Y6Ƭ�|���뱗FFj"�����g�gf��D�T�*G��\�V15�MGZK��{�D�E�^��Nj��T	q0_W���1���U�T�U�{ ��R�%�|/�;C\6�HK
�c'{�4#�3���	D��Q��D1B����*�޾�w������A�����=����_�9鿶h�'�g��2�}ʣa�#���!�E�@^��a_�Ȁ���`�Y1?M�#�ba
T4,�
p,b2ߙ�2%0ķe5#1�ŌV�BY�߲_7�`�=�Δ(�n@L��Xn3���M���0a4���*�FX���A!
C1k'��Q��zN/�jF?A�/�r�Q��,j�}cL��zj!&�k�:F
�c�B�w��V�$; )��8H����(���`��e�Bc�$�DvgK�f�1iU�L�(&I�2�b���4 ��}�=�`��1g	�QZ��F�	����������E�e�_�R(�h���bA�ը9��&�DA�H/�,*�QE�K�4c�Qi�Q"�N��U͊2mX�E*��1u^������\ �pl��$~���ހ]ɇ�,��rJ��K	>枎����@'��_�0��ݻ:����G���h���쿫���d�V�q~��#��,P�(煏@���'7�Mj�ծRr���#�]Q����f��X5�w%�հ�p����/w7��K�xϿn����TL������U�%!�w�g��`TI�6R�*���h�,�lm��+
�� �N���c�d�^-Y��C�I0o��od�X!���"tb�&��@�u4���S2Ӡ��10K�z�FA��2q��0(�A?�?�B�
(��&�h*OQ��=#�$�)I�^2�(��4
���{�����={Ͽ1�ҟ����=�sSs��O���d�t�/���&{� ��A���`(���aiӡ�Udl�9�~M���g�e��‘��R��%HX�ِ�d��O�B)���
�W�*�=eT[dU����&t�4
c����P$#agLh�?�qE�\�j�h�j�!���a�߶�$����P8R#�'ēi9��܆��Zr�	�)�3B�'#V!QT� �,L�����\�I��H�;Zc�Y��$��p�bT "	���'�$PJȒ��)hvqvB`ߛp��L�5c�.��jl=�tBx�Q#� ڻf)�M_A@��s7���e-��QQU�}�ꘞ�3�a��~ P��
M͊XE�T�
f@
�@��Vy1 �8����Ҙq��u���cj������)�墲����O%SU��s��}��~i	�L��=%y	�\�̝I�L��:lrڳ}݄ϩ�����h��%�^{:録AӺ��(�N�9�䃌m\!C؈�=��ǙW��ӆ��`!��_�^ o��h����^��A
+0]�S%8;�5H@�9��L/Z��آE8��גp�+oj#�vI�
ž٦Aɕ�>�0,�.X��U�1t�^z�lJ�U�@��s��1=E]M�(I�	Oq[�傒�73�p5����
�lv!�$��.6�*F7��]�Pl��yɂ��t��q	����(�{�{l�m>�_j��?̩��XO��_kk5�s%�@-�l�t*W��2uD��M�
8�!�bK1���i�~)[�ZPv����G�ԥ߬���
«8 ߙ��o�KrD�������A��}��@`n�A d�B8Б)h&��L��J�����B!�^DpXL�@�ES��;y��p[�<��;w[="� Ǡ�T��Äx}+�4�j��yy$�Y:"�t��Q0�(�$v�C�όX�]X��+��#˶��c[��m��0ٟ��0n�wʂ����Q��
�����[��Ʀ���O��<ؠ�@p �ȅ}�[fJ�a3�\P�'֎��*����	uNbniv4����p �ݿ��$�0 
�Zr4&!v��<�T�䀛e��d6;��P�<Ʌw��m��1��f���:M�׷��g�H�y�s�M1���-
��a|s>���<i�I�e���^ɶ(�=��~$�Ҳ��A�s|n��Q�(�˃�x�I�;C�d�M6S�n\cڈ<WB��I����|�X��P,��['�,�"�<��d"&�yt+3G�>�(<G�p��\�$Q#=�W��+���)�4ɴ(��S�nJ6 �� Ņ�����Q���(d�ξM=Ž��rPH��������D�/����M���s��~�ߪ�_y��ߚG�x�DK�?G[�'���/�����j�A�^�߇B���{��ܜ����
�8xA[�e��܉�!H��Z6_��^��B<�_�8�R�eT�,}��DE���8�Mri�9Y�s�*��,Q���+�<�-��pa@�H�CQQV	]\, Kׅ��H�'=F�xOsi4|�1��M9�9ԙ`�#Wж��MU���3g��C_xa"@�h�%iU:L�D�s^ݧuB��%4����I�0�`o���R�̒� cE�σa\)Ti@qL�A�b2��Qq[�)�6h@u��xi(.d`�e�84w�F�иK�"
`6m���Y&�s�5	3��;�f�Z���a\ˣ5ʊʉ��Re�|�"�7��w��/�Sn���0�k��F۪�J<>��3a��5wC���U��_��eVAU
e�O��b�Y$v�Op�����^`H�A�8��������%����Ǽ�_��-�*�_����B ���!ؾ+��;(6�48�Y�Oh{xj��/|�4D(�Ϊ��2����K�MÎ�
��Bi��!(��
�e�B+�����ADFF�����XH���a�
��?�Z�S<��ep��|kc9�,�r��2:���Im�陳KN��j,c8PF ����I�K%c�!�i-f��4hQ�<垗�X��(�i�Xcz�Q�#"��v`�Z��U� XB�B�$�^�a��qP4�L��K�p<������V�>��iW*������e`�"���.Mw^d�F��ӭ����Z��w�܂h�34K�[�ZH��&B�D�z,o����ռnE|��px9�ˍ��OE��������V�J<�j�`'���`���c�R��߃��p8<\R�'�pU�?��pἬ��������������W�ǻ����=\�>�`_�3��G��f/���V��x8�Wl��X30�~L5����������+��qr8I	���<����tJ����]���<U��rUO��e��Y�P�'}�\ϥ���P���
#�؁)˂ ՖJ�x[Z�VO�~��E�{;�sla��{�gD���¥�J��.P��
81z,R��;���O�I�@uT[��!���zLNq'	���x3{�$�
��&�1�� q&ާV��JRϡO�i��D��f^��Xr/�Y7��m�v_]?���%�*�ƻ��뎎�~�p�98m;ڬg��A���wQ�H�02S5��P�vq'1����Q�9�z�:q���輲��/F���	_̡��P�B1�d��3����Q��?�����)"f6ZY���r����`�/f��)��
�b�]�����A���?���/�x�Cz��B�y�QPӡ��0�9��Sp�M
���Ir
t�y�a�D �ٷ�D�I~;����$4���A�ܒK�bŇ,�@
'H��k���l�~��Ξ��ޞN��~�� :ȟL�(|oDR��o��=E���U��i7H�pNv�g�$��{Y����y���"�̲K��H<$��v$_�
9�p/5W��D	l��p���p�E�$g��s�����QK	%I��)\�Ɍ9"��K��B�\���q;�V��R�ӊ�$�b����!d��1ƴ%Y�St�q��O���,@��<�,(r�i{-J�0'Yn���K	\ΙC��D|n���t2�	�ÃM��TNFsŭf�,�C�����!ER��]:��qлg��,�Ѯ+���	%?b�6=1�w0	�["Yʃ�>(�pϐ;]�dk{Ȳ2��f��Z$�,!X�9�*��,܃s�([�k�-�U�/�yJk��5bW�=��rRf>By,���+n��X95Ϩ,z2j��N�J7l�;.�����������2&�L�#����NT�;0��8U��u:�&0y�j��6Dnc�s��1�܄K�Ŀ�.��.1v�W"���"u�Ԗ_����4f^�H^E�2��W��Q�^0n�vh p�z�ŌA"����lj�[4!��^��(dq�r���� �Hgۯ��^� pE��Ŝ�r���!ߕ
�h8� M�I��H¹�}�̝�$�o��<���AJ'�x�T�� mjė��Pi�e��c�4�R���4Jq��T���m\�A@:�27;A%�n���W��
*�Iyh� �T=c�^�$Z�N$(��t����HиD�w	G!:/}�%㓇�cE��aC�Ly`�Y���ҹ��o���k	y�۫�%I��7�y��!�=?���<-="O��rp�x��ol��_я��wd�#��!�o��x�?[۪��+񸂓0|�Ii�V�]�jO��h<(~�O��_RZeJc��H��N���-���$�#i�H�Ұ��c��>p��I��E.�����A�G��a&{�h!)AtZ۞��a�c�rFA([��\q^��t�Ҍr���l���D���I���0�%�eظ0�D�
ǃss��Z�eCN�;�}�s)�D6B��Ȥ:���m�#%�j$j�}��$��V'c��=�ap��n&g�,pXݚ]��Y����1�r�Q�M0����S%���-!�jߝ���:ֽ���V��k��z��6����"�U��[ٷ�}��+�
a��fJ@��n�pj�%� ���93�p�����@�yf���qf�==3.8�f\`v�̸�4g�t�^ԙ��Ϯ۳3S��yf�	��3S�^����b���D��Qo����j��J<^���܁G���Y���GR�O�B<���"kL��Zók��GɎC;�f��ϓM<�r�������"
7��,�$ײC�cx�X}���ꔜjI��%�!�3XlD��f1�o�q�2�\�X���j6�A?����,�m&��#���U赋��m���n����\�Q��z�<H�d@
~;�}��"#��F�
*�\k��
�d	y4'�=��Q\�P��B��:a�!R�$譥g�U¬�v���8u9���������ؙL�I����p,����&s�<C��Vimf���Uؔj6����:�<�_��7�J:�{/h�I
P���٫�����7P�bNQ��I�Wƌ�[�ǚW�Xa	eZ����AK�'9�+�e�A��,���6@�m%�mS^}\�B��.e�O�co�c�R��� ��(h�^O��y�h�a�^���F!C3���š�&L\��������4H���g�C�*!ژ��\%(|������
��Q4�v�H�1�M
l0=�YM�V>���2�\f�a�6%�?��ѣ���Ξ�SV����rBHu�A;�l�}1� S��s�G�O��:!nS6=�
+a�h��eŏ$S��(�3>���^cu:Aj�K$���q<�x �(�#�&�I�bip��\tGQ����y8��~�>ӻƟ�y�lAE�kAЫ)�i�0@��P>aq�m��<��Nq%���F�Fvڎ��Oe�F�O-��ϰP�ଧ2jn��kV5X��U ���*�(�E�k�V�ZΡ.v�m�B//N4�OW&3��Q�ڦxxz�C�ݛz���+���`
��s�P$(�����)��of6��hX�[����KZ��4�U�Ҷǿh��%X�I��Fu�	lIfPZn\Y�Ҡ�Y�HF|N�xո�oQ�|���u�s=�?�!�`�2G����̲��Ӆt�ئ�k�%���]\^D�q�-��7ǃ5�1��ʶU��p�4v�ܒ#��c��65m�Ln���_Y5�����HF��3���������4SM�c��A��ޕ1ɫ-�H;#���vv7��r"����]�.il O;�&��x�E�x"q�ԑ��t\K���	/��B櫩��ү1��#0E(ڂ)�H�ف4
�9��`>��^�|M��}+&jbk<#���]��i�c`�����{Y8�N1	���T���m�VX��8��%Mm2J�0!	��$�Jq_�$����,F�f��e��ۢ��m3����.�a�Ae�
1��8�+���M8��N����k�;�/�	u/��.���)D�"�q��Y��7~�QVm� Z�*�
�4�[�Z*��n�����
�=�=������@.��l�_5�x�n z,d;��ȍ��÷QLnDh���o[���/���ɝ��Ff����&�&��-��Aېm�Q�!d�Y�4�]�|Z��7�JΫ�
RhhZ���0�3��3�^J��`�!�1cl����q�Ʊ����ڰ��5���9I��)��Y����W�]s	;(=�'c3��H�}dl	��mSZ����k�b,	�B�(
��:6�օ�J�e�b��)��-v!<���FDH��Â�ۖ�/�sIIv����n��`*7�lM�J6K�/�[�3��<��bLu
ݡ�'M��!�9
�`��l�,;T"R�L8���5�H��f�\	89)V�%�_�A����L��|���`��Ĕj�i���(C�U�t ���q9�������KV��RN�������	Q�X��8��o��&�A$��E`D�x,�3��JKCOPh7ĊaN�g�b��r}�Q�1��,��	u�J�^$p]����M�B��9$>\D���8$��o��:�D��S���1u���:�ߙ^(��V�P�"����xAE+��#���F9�mۧ怅edڊR{��H�(".q"�7
��I�>�d!�8H}`I��q�'��H�D��6_	)c�B�j�@0��n�#���-��;R���=��Y*����'�g[��_���ښ8GDΕN �R��A�,AT�A�¨�A�x��a;���I�7,�smA�����p"gW�E�����A�	B���Qk��}DP	�NsI�B#���/T�2l�o��zh�uS�5�c�n�4ca���s|R�d�T��r4�=Q�����m8nxQ#��kd�D҃@��,4�
�R`5¨6.2l���aЊ$��I���Z�g��c\=Gc�^�o<{e��ya��%5�*F�b̑6%4!9
�T����т�j�E8K����~�t'ȋ��e�m�����_Z[��_Z���x$�a�|K�|�@�s�Q�:�;p�;ə��Sn8�
iS�J��֡�[�u� Oj?��>r�1���`�2�ʮ���r��w�ٲ��f*�gp�Ոn��0��4��
�dN
��W�1׶\Z�>���&b��<֟㋚���;���FT4�[SK�7�C����O)q�~��7$���������������$2�Z�	�i'O��(�P����J�݂(P�d�tIMm�h��
D�$&D`��dS���*yFy%@s��K�m��`��@8�(���.��"F��ؕ7��ѣ��6��2�e��J�V��L�
Q�	�m��P�6٦����q�!�%�Q��� aP��
U����)�R�PN)�p`�c'��&�텐g�H��"�4��`4c�f��[cv���T�figsYמ���h�e�𪖔�"�]�2��
>����%��{�[���#��6�� 
j��t��4(ac'g[)�)�������
��Q4RL��H4nl��f�tQř2~�,跭��Ru��@�(s
m7J%2[� �Z�m�	͌d��e:��bN��M�:>�Y�n�Iܴ�*is��Zp�I��Bȕ���ZQ0�i��E�6h��������/.tF�
��fG���bV�y
/4`͛�Ӭp����(0��Q�j�<�i���e,aY_�y�G��FS��ƈ���!�$H��O�kH�=��� ���"���۝%.
 a�R�M,ub�;���5m��<����M�	�:y����E����+���'�o[�J�U�Y-���P��*U�� +C�u����U�R��U�K�>��~�x7���Q�R���2��	�5�Nq��US����9���B��8��-M����*���S��=���-:�+�!ǣ���)��!��4��2������-X��?���8_�RZ�`(DN�% y��醃����Ӝ���#2{�u��
"c=nG�ɤ�B|΂@B8Gr��R`c
����@��k��շ���'3Qo#H˸���ʌ���eӄ*�xBň�) rJ�����Cn�� ���.Q�F��F�ܔ�� K���L@�&�\'x�	�%J!I�n��v�5�?"E��(X��փ����Jȉ[���j�&Lv���%Sc�T`�
�`�&�v��D���L��TnH)%L�RT�vqBqC y�
�{?%{?Q/�!(�Oa+�����&�;(H��n���8��4�B"�=��4����N�F�}����m� ��t���\�B�,Dܵ�H�i
c^D�1�VY'���.E���	��%��xAM��al�ᒤ6�B�'"�Lk��.Ao���@����,M��)��k��M�h�T��6h���EB�'��� q*e���p� �D)�Xo���
E3�ir�fK5r��;������h�i����#$�8av�T�
���T]x"֡�,-&
g( �l�Ǎ��xBU0�Ɗ�2�PRB�率��I�_Y�G3Z�ݸ���Mddܧ�]��p>&�6&I
�	���f������&�`jȍ�L|̓/­)��X1	�#<�R�Ght�1A]��x���K@ �3�ɩ�c������(�_��G�\���c����R�T�)M��(rXI'��a�R��h~�`�0Ƌ��O��&�y�>��?>Z��m��?��%�5���ƞ�EH;nXB�ps��>:��5f�T�"��H���M-��>0A%�Nwq��Uv�mruF�!|��u#�AN�O`�	B��3,�c�,
]���
�Bp�e��� �k{6��L��R�����23�q�a-`e;|����!S��r���#)H@���w~�>r�_z��
V�4�g/r��������5������9M���h��A06��j��d`ET!��-������Ġ��WLvq��(�uL�L�3��m���Qty��F!�c&K����<8��d�
����������F�_�������Ĉ5ƾ�#y�m�)[����	�pT,�aJɋ-�W�?�(�5.�)�ݶgVR��b��F ����r�B�<R$�
J�*ȵFP�"��U~~p�nv�al;��hQ7J������i�N��x�'���#jv�O�	���Ni�$�t7L*k~�Zt����1��?F�

��.���B�T�pܨ����8+1�4���G|1�Ⱦ3����55�����htb(�
�A-ċL��(�N&o�
"�t���
���Eg ��ܣ1�;���qԔ2��F��x�
ͭ�D0G��!S1��]q�L���l`�5-��d�b�h��iyv*&P�Ψ!��[����7Z���.��ߎ�5�\����oi�U�J<;��;�۠�oX����;�(!���ۘ��nz(*��rO���s�a5�U0�oi�Ě��?�x$�~�A;��A !����K	BrB��aۜ�k�d'��ri�;ǃ*���W^C�m��@�U��5�#��!��H/�璔�vB}BK8���<*��$�D��;�ta�=�VؽW
��9��㩒�?�m�hU�_��u�1��k*�%�LVP�� �ؙ/�x�?��¹�kV��Ev�v�08�Z�f3�@&�`���k����P6��Md#r�?��w��tU������s��^R�!c7gD{�"Q�ٜ��M�N��Դbb�#
�0 %�nم&4�k�(_�K5�p���L敀��O����B��[`.��9�����R��P���6�+�X�HaR��yr[������3䡅���HW>m[��ZB��C�ٹ$ft��������X8n0.��w!TM�� �C�$C^v�Kj��ƋW���?>�~�?�����o��Gsk��W��?ϗZ9���������+�H��H�;�=<>a��Q����4盧�*�NC-
�d'k��
:�+]#�:��3�;��0Z��5"ŵ!��pr��xᵔ64��CHLs�W3A�уV� �`����FG�m�R	 �_4|�b����e���Z8&
r1�K��qՂ-�pEDtiC�	]�Xbxu�@w���:�%`��*r%�5�.^"' �
�b�q�?��]t$��݀
5�f
�:5��5�H#
��<�hn׆:S�1�u��!�h��)}��zH����KED 1�sbUĆ������FL\�WY�LI��b�����u5-^�~��A��@�hS�V4�n+Ÿr?:�?f|�J�x�b�P��.��1 ������ǹ`%�ˠ�ќ��wb�>��x���]Q�/���G�<���S����A�wL6#�b����dUAd
f�A�����>v�&D�@?Ov�C◅�&��ǰ2H�h{1
R�aep��/�H��-��.hz�"����s��9��xYӝ��yh�vRm�9��cRf�h�����$|�s���x�95�)!�G8�8TX�w։���c���ʳ
��2�@�ErB�Ҁ!���k�����rWP�<���k	�l�!F�%>��OO0�:��R!'�
"�l���*��A�N])`���V��vM��屺g�4yP��D�}\,��������Fu�9�QL`�P��A;�XpB����5V��D��7�I؁��TK�C�]AJ��	b�~�ٿ�����1#��L	��� 7�N*����k;��FC+�0rl�uX���T��5�L�y��h��um47 ��氢H�"��2S��Ԝ�S�Xp��0�73�:#l��޳"�r#���G����
��]��4�4���2��(��eֿ`T���k����U鿗���0��.������=��GO��ω��i�5�<�?�	S=�/�����2�Q8�$���2(�2_�X2;R(T��!�[�x�*b���9�VN�[cF%��[��������W%�+��@i��Nh3��0qZ�
FJqY���ֈd!�89�P9JPga�~�j�ґ�UK�_��X�s,,����V��ZMj�@�$4���3�YU�T��gdA8L���Vdjr��tV �Ng���'�.���A'�fԁ��X�H�\��y���4C���j���b�ԴW�=�����te�?����X�j�]�dz��VV�����B���q��� �f��I�=Y�a�0�9�ХiL�r9z�)��2hY<%k@6�%�P��)�m6������NF͊��a[��E,c�\���x����Vsi
�5ų��~>m�&��9S�j�y�U#d`P_P�i�R8��)�`��������ѻ45�Ӆ�%RN��o[�t�V!3���L@@lta���b){��[pmh���ͧ;
u�O�iN2���&A�,"��(��P�SQ3V��9�7�u[>-�^�e!1���XcZR͍�(��0wg8n�l�藭�3O1�͛�;P��ib������D��Õc��Θ�gb�Us�J#��[��+�lp�|},�����"�5���´��V�|^PD�Q&M�3b��	?�d�T�1��<1`����8'�8vA(d�gBzS�CFzt��7X���2�%��~�u�w�7§^�'��/?ص�&=��	��<w��E�	{[X����u�����dMꐌS/���G���7
֑1���u�<�S���r��9V���s=ho�J�~�
��x|MWwg<Tu����h�پo$��\:�
�dGP���oK�G����R�W⑐���.o�2>N$H�!d�<��!z�ȭeN'�=��5?��os������+�'kl��V�*�8���+;xD0843�`2���(��a��A
�	J#n$<=�m�Z/1�G�A�Z�lX}nPSҤm(�lA�_)F5�~�\�� Q�q%C�fZ��2A�Ke\���<� �h��)�$Z�ar9:a�QJ�`��'��D
ec"�]>�<\�����ѯ #�C�F0U�ڿC����;�:$I�(��c��=|�ajW��LBb&:DE�J���@bG5ڊE��)��h�~k$��
ǐ�ُ�[��a���5�z�?�[��*�H����0-�Z������e2c�r�����!zl �J�^d�f�w�K��SV��*�Ϥl��_�;�0�0�A�q�1�W�W�6@<����o���,��{��S䧭��9��!�񋳬c�-�ȑ1#��%�)�h�ǧ��t5ٰ��b���Sᗟ.���g���"����`��3���"\���T&u%��u�K���88��:��������Nu���(�t�_!#�0�V�h90�KqB��}��ړuaNb@%s\)�}��9��
��FK#T��t�΅��p���v�
�}��֑�1��	���_��İ_4�i-��%5�4�V;�G�ۣ�&1t]F��PWi�rQ-U,PR6{x����v�D��c
'� N
�
���?�ϜS�����~����8�h*��B`7C!�+�ļ���T-=e�������cZ%V��m+M2���H%��P���2��&=mi\�-gP-�&lƒ�MBRR�Hx%������;m�/�m�ew{ ,�A-�ݰb�]ౣ-1��O"X�����K��Ū�J<`��շk��2��p��Y؊(��oIy@0
��˕b�>��g�S�T$/�*/Y6'-dVF%��
M�w @��	�	��*�
����f��2<d�U�gb8p˯�9Fؽ���sAJE�1���9Z����S�l���M) ������w���l����2�(ځ�3W��(_����I��ʅ�r��Ea�	��C�����RU9fu�D?ZZ������d߆��!��}��*np��1�x(����k�p�,2r��٭
Y�m�*r5•�$��߶~�j����}�T�bv��B�,��O>N�乲:�"����B����t��O`7%�̧0��V-+���a�[��������_x��QK�t<Y���枷1��7��ik���#�=X�Ca�Y�R�[��19rl�[%	,A1i����q�>^0B}C`��Pu�|Z�Ck�����LMlc0U߆��u�kF��/�CwG�@|����;��+���Eɚ�L �zW�2�_��t�`�g´�#�(���*���/��2K_����O7���q%���]�Q�F�/�q:V�#o�'c3u%0j$t"�f�t
k4�Y����){@}d��D*�EHS�)!UJݫ�OK�R���>��Q�.2tbd�ޞN\M�"xk��&�8�qf�i�mؼ:��B��T,��%���f�5������8���'XD�E2Ǔ���Rh$	IC!�P7�N��7r����/�O)��lj�`0cO�=Hz�q8֪5:t��C)�F�[GfU�P�Y���^܌O�
�F�U+��q�T�ơ�aF[N��BP��J�E��l�x5�*�4ಃY��p-���'�n�f�����]_ox���
��3j��B>��o��6ߏ�`Fa��փ^����e-�ܷ��3���}�	-�6L-���;m�%���J�Ǣm������WK�c�y5�[�}�bTVD��D$��&I+�Q")5�����f⎿��!	%h(�1Rj�z�+��;��� ���1���V��c��y|�?�٩�,����3������F��F��]�}Wn��0��!�9d��s�Sy��[zA��2�
\79_��1d�INȅٛ/,�/�
ߴ���]��k�`�������z�I�a�1#�+��ܟ#��a3)�nN�o��[߮t�͗l$L�X=�ȝ	QT'�cT�%l]�D3��^�l����>wf�"��U�u�!������9�Xsk��;��U�o%��_����>�A��}P�����t����QQ������v����^�XSk
�+&��e(���FE�V(�9�?ձu��L˲#�.��zd{����GM���\�S]�l�\Y����if���4�D.��p�vm��lW�)#v��'e5��-mC���f��"w+1je�q��>[Ry�<��3�^T�)����ϖaӺȻ�@
�9�� !�뚡�𢡆��P4�T�/Uf�ֱ��l�Å9g�g�����q�m-LI�����9�!Kq�+���V��z0z��V�+��(l��I�ʹX}���)�%[�#ܔ�~��G�u"'�cso��E��`#.��8<P6�j��xP.��HVMEj]N�~��&Y�ݑ)-_(��3��s��Ȇ���"
k]��
�q�|�]�{mQ۴��$�����B@��\��9(��G�8w$�.��p8�#*���`]��]�mv�#�dԒ��@ք��	�"�ԡ�.�a;��?�=)w����sA��1�m��f�����o+sj� �~U\��P��+���f���� �j��
B��D��8v��&��B��2�j�����vQd��ز� t���B��,��sK��KQ�\ׯQ.��� ��~���3��p�'���cÆ��k�QY)��gR����Ye�������V%3���l�,0���6�6�z��M-�o�x�}�������2�+��r
W���v���m3m�u����?Z�bU����� 5p.�x�K�L��I�t�T��fN��+P�_�G����5�ob�7�۹j ~,�z7�3�0WG�k��s�SM�ŹǏ�+�<�0���u�9�6/��V��Z��e<��}7Ox�h��3�Ϫ�mb�ۀ�0���k�mk���ȳG�6H�C��E�����B��D? *�z*+��v���y��w�o�榪�����A���t�*s����o׭/W��r*[��_�3�/h�Y���is��X����������k��U:dP]�A�-�q)'�u(rY���EA�M��sޢ��<�#����pj��م��L��C�v�1�il�Ė�M8*!BO�D�5�"`h� qth�-
xp*;P���J��@��9P�1�O�A��jx��D�@a�rS$aɊ*��m�1j�d�X`���&4��R��\�B���p�	�y��\g���ΨV��DHAı9�E��)�8:>�#��ѡ�!�z�V≉���U����s%z�Ό��:���z׷��X�كV�<�qi]�PO7D�u�%&7��ܐ�U�W!�mɭ�B�U��UKK!��.g'j6%����E,}Oj�9����\�c�|�K7XU�����?����6��o{1��mQF���Ru���_^���|	��w�rV��_��t���L�os��^���֪�G%�Z0 ��x`=�i*!zݱ�+0U<��D���d)��I2J�]�����~TF�U�;��D$;֝�G�#s!I�����X��۱]CÌ��G
	r�Ŕ)@X�p)ud
6��y�q���[�r�< O"zq��p���s���
���~W���O��';�9c~��9���W�V�����H��.14B��35K���>Xeyѷ]�J����ٖtZK��o��3vb6(Zh;��A�T�!$#���������(���|l�+���g��+������S������u��5U׿�����6f��c�>�[Z���������3�2Z;��UG�0f��� �PU��ae�q�N�H%
c<l��sZ!�e"�YK�?�j#��'m��V�S��@�4
���c5�p��?e5�ڕƶH��F�KfYr�IY����~L4�|��S�s��-B,�37�ѭ1x�C���5N��0��n
B��P����:�Rx��kB��ʏi�t+΍���_&�{!�^M��&�����h#����T&���@�S�y������ʪ���������~e]g_��h���gK�����&����	��P���{7�w��ն򁡑����H�284ҵ��cm?�c���0�ջ��fv��?EѮ�
ݝ=lP��`��ۡ#��0��.���_�ׅЩ@�cT��'�52��V�dP�b<`�ҝ�<Aؾ���a�Z��1�9$
&'rWg�=Jys-J�˾0:,�X��8��6�D
��Bc��f#	������Ţ��-��VI�����u�D����b�6S��0��y+�G���^�Ʃ�'�v��Q
k�t4�%���ct4l����<S*&UJ!�X�>Ѐ��<��

WDS:7u�mX�=L>�:�����k�Og���F�θ�)2�%���>��"ە�}#X�s��
���H`?I�z0Ծx�7n�.OU��_��k\�[vJ��&��C�~�K$A�p�ԕ���$���F��=�R
$;����8r>�#�Q����YLV:b�="R�ԋ�=`�.W~-g?É�8M:�A�dqJ�F;��æs	�yJWWr1�(2S�8���@<9�0��?"b<�S��s.(c�7�S ����3��z�mO��aN =a5<����2S�P��$V��j��t�uX���ôa�TQ�t���gWr�.GɌ��0�:J\�얧3��Yiȝh�QP�E��j��㩽֩
T5�;B=�z�a�-����4@���J��_�<B�H,�\K�0kC�̮�%�z��=�0��o�-m'UN���/m����1���:���I����b�C,����,q��e��)j��TQ�X2�f��+5iXm�\*�ϓ3C3���sl��O��M#���ϔU�:	7&������)��i=�/�\�aO69�*��ċ"g���:"��MbxR�W1�DM���/���Ӓ��]\4*[�Q���w@��A��j��,�*BY>�7�f�|�%�T���N$���x`�@1̸�,����f�W��43��'H2}~���l̜.#4)	���G=RNl1�S��)w	��Ak��
��8m�<�7�
�0]f�rJhC��������ȕG.p%]�\I��S�`q�6rԑ�yF�%3���E��,��N�!�}�7v�Rz�Q�#J=%W�~j�q��.X��ӆ3[�9C�(�q(~*P�t�l�b�;�+�h�al/m ��3�)K�u4�$���pP�8e�1����j�b��%'b��JR:	�!	&���R
Q8?i�`s�R�aX
�"�^_�@sv���'k��hZKeT�b��z6�a�3�zv����b�M���%�g"������b"��3>E�e��[(���z�Kݮf���k�`#J���u"�^�is���8E>j����T�g��#ߛ��D�+�����9.�6Y�9OG��Hn;gD��xPü�ZX�"#�@M��Ft����,=l�����aHm�&�u�W��̛�i���s��0+���l� �z$�gm��rpځ6lW��<��ʅ=8�ru��\ XL3���+c�P/e�5+3aF��1uow1qp�����Ŏ�w>��Q>�2�DZ�9]��]� N�N��&CU��1֥���Y�`yTNZ/�2�ʘHf �O'� ��&3�ڻ9O3ū�
G�r�������!wnɉ,r�'�h1��UK
s+]�4��XQ�;��%�2
��\QSnX; O�*�T��b�١�X�X� �*�)(*�7�t�ta�9��ӄd�:��+�뜮1��n=�ܑ�@��
��]�#�Z����d��"^��ߍ:����@�\���L�G���� �����o/;�:�[�z��&��i3�1�hi4�O3��CZ�o}\X��gl��p�%RR���*��� �%��`�.n�’�_ɮ�4SsB�(<	0g|��ܸ�A�#1���l	XAp�����d���q�S7X��J�s�L�lI����
t����*w�|^M����m���vs능��kC��Қ��ѓA���̌o���{�y:=��K�*�>���n�!W'9g��P4�� ��6�����|
�/�XD!�*�-S�=0J!�X'7^��q�z�������ѷ�����X��/��nPvD�%�ۃ
�<�~��?��Ϩ���}F�6w��B[A�:�K<δ�N��&݄��9w�+2��eL�.
�h���Ya����zI��ʘ>:��锨@ɮ9i�����tn����M=��څ�Y�N>u��	b��>��vb�X/7�CApK���e�J�]�f��2��^R5ECd�S�1FBQ�B#�f��C����)0��E�U�2���7��Nj q�[�r�N1�膆Di)QƨCwg����w@���L���0��������r��ϥx��K.G؍�v�^C.���X��^޸T�# �48�\�%��t�Ԙj���6ACﺆ�p!�qNp_g�ƾU�\o��HeRK*<߰U����*�U��v�_K5W�)�m��R�jPb��G)��)V�&�_-�9,دiJwת���DI����/�B�yٞ�?��橍9�[�ڢ>����_*�}��Vϑ�{�}]�5kܳ�>�V�g�N�r�߸�O����Sغ��7���S���pW��w�˃����;~���;�m9����_����g���_:z�]h���[
ǽeq��7�OuG���+����'oXtĦΏ}�#k>�[�y���
D�n��ɏ.>��v���.>�O��=��ſ�����/
�7?�����\r����^vV�5g����N(��;����~���F���h����r�g�髿6�}���O\|��p���?>�+��y����>�U�o���������}�C�}�_/�X���7~m�Y]j�}[�|��Ͽ�}S����+o߼��]v�z�����k�x�O�=�'��M������s�9ڹ��w�=���u��+_SO�^����~5��cK��_��{o���'3�랻��O�Я�ٓ�{U�1����gt������uK{��l�7?���sϳ���y���;������z�{���[~p������s~3t��w
�4�R�];��l8�Ŀ�ۻ�@�7.�a�Ps��wDFߴf�ﻩ��������7;�mز�.y٩���Ѯ/�m��Y?��O���lLL��i��+�q��G�}���y��R{�G�ݻ-�~�W~�7���v�Y+߹6�վ���;��?�}�;N=a�Ԓ�
�>��7�=��'M.z�
O.��X����w��ɝ}��ˎ?�ë|������Ɠ�P p�_	���+�߲_�4ؖ��'��,���?_s�]��76�f�}�}�>|�g>�cܰ�}��{z��覷Lm}�c�_7p��kǛ/��A����_���[�>���8h�7x����y᳇vHt�/�/�S[�kw�[�=vˎof�����׼p�^�����_?t����>��s�;Z���;la���>v�
�_�B��|�|����gb��#���|�3����n��7?����`��V����|�����O�g�OO~d������,����u>yi��T�o�ص��о�>��'�����w>���<�_o��O��:v�~��u�[6~����ƣ�������0Rw�k�=��C��_x@�=C]��}�ޫ��?}�X���On����o���ٱ�[���Gn���G���w����o�~�G�����P����8�u�ー{��|��/>彇������
���~�����l�w~a�ן9��n����K~�7�ϑ��ևh��>v����O-1�S������?�O瑏�������_7�[�~�/�f�|����{������|oכ>�g���E������kC�����;=~�����>�c�/���^��'���#�4v�U7]Z�zC��_u�>48|��Nxɺ����g�>���O-���?	����{��{��AM;�=����<�):~��+�پ`|��?~��NJL���>=���6�>s�����;^}��|�ѭW
����J�������q�|���_T;c>�/<�uW<��͋�6.�;��w��~���o���這e�<���/�j�EW���ߝ����,�����/�<ӽ����yM��������z���ґ[�
�2{��{4���)v��3O.-��\��7��Ko�t�P쀿=rz�ۚN��g�����C_X���ˏ��Iw�_���~�_:|�׬_^�Ϸ��vWt�{�����㏿g�����r�ί~fꌡ�#��ꪮ�k������F/ض��F�����^�����0p�����㯽hzQ^���d��G'�\���[n=��,j:h�w?|�Mu�'޷�̡K>��w��'���|�;|�y�뿹�����t�
�1;�?���}?��
�-��!�~��']{�O���?��_�r���?z��������~����?�����'�㺋�M�|A������>����qo�����cV��+~�lz��%?�\�p~���������߯.�{{�@��<t�e3�.��M���µ�^u�t�#���󒉩������|��{O~m�ʓ�Ӄ�Kl���3�Q���#�>a��Z��}��o.�r�I���Ϫ'_�nz�/��~ӥ�����&�޼���
��5�����}�>�����_}�-?��}��=��M]��L�_;����2�smњ3����}~�m~���s��C_�+����򰽿��ŗ���^��=��O��k�Q}[ݏo]���9��s�|��o�m^P󕇻u��Kv��ڕ�����pߛ����9����7�����|�ޗ�o��_:��������v6~���gY��y�=��߻�3����WF��]g�j�����;:�]�
�Q��ʽ���������������z�<�K�<o�{n�褱�G��U�x쎵�5~@j��Ц#��~��]q���y���<��u'����g^�pп�X�z��F�������{��?���-o����o�|뷟<쉇�������Ş�z�Т��^8t�w~���s�ozs��q�S�k��ѫ7��#�;w��}l��s�V���^���~}�)����.:��u��|�o>�;߾ڬ���7�����tЍw�k�y����)�h>������}߻���x��B��}�-�oSN>��i���8��ы&�;����w\Wx�/��f�W?�ٝSG��pΝ?�6�k�w��E<�;�?���,���^:�+G_�Ϙ9k��O_}�i�-��;�{��w��qOoi��3O]xŭoxU��__��#�:����ܻ�}���;�׷�7^�ϻn?�������6���P㊵g���;�ç��r`��/v��?��{x���Z�w&�P{�ů�ױ�|L�3߾���3��Þ~�~GX��{Զş�͏�Yt�Y�;��w=���p۷?�n|��gV_���m��[���J}z���ߖ�x�#w��;��w������z��O���h&v»�WO�_{�#��t�7�x�?���o����]x�o��c~r�q������{v������3����}굿��Df8��/(����|LG×��=W?=�+�oZ����\����i�#g'�l��<��7}~ѹ?z�kn��EW�6����Z�<z��`�n�뼆5�N���\���-�����޺�ʖ�_���t�{�>���ŏ��s�߻;��ĭ�o���鯯������V�Ԍ�ǧ�H��}����_���?z���yEӻ�#�������>���u�z�	O�~�?��}�}���o��~����g��Q78y�S�[{�����'��ӟ;�…�=��3��T�!+�����?��g��{��g��K���?���m���=��ۏ���?�b�?/<����>m�.=�M7\���q��Y��<���vȩk-����yj�L�5�\9s�י�#��Z�Ϭ|�>?x��>z�k����hC�gi�>yӕ}�|Ȝ^���o�`�C����ѣ?��w=t��m�_�����V�*��R������-ͱj��J<��?�Ʒ�Z��fs��bm���Ѷ��w%�P(����,z
�/^�$���9F	5�[���c�	(�i
#m�n��t�zG|U�*t,��ƀP"���n��E�@H��߸aCo�@���wtzr;6�R�(@��ri}�xg=�;��{������;�������5W�T�)���p[��y����m��"�\����{t��[�_����*���2L-�7����'\��
h	�1*�T<��"��Q�(��+s4�;){hYD��B��5U`宅�"ⅸ�يX8����wl�_�;�,"������ ̊m��,���"����r��K��?��W6�R{��8�Q�V��������Zo���|ߘjji{���hG�f�����w� �X��K��P�sK������R�j�v�Jph*�)��oF�/�6rJ������J*�Sh�]ú삢��\ӱ�{ ���,}�:��ʈ
Y�{�K��5r�����0����;S�REM�6�t�i��V�Ra��F %E�KR'Xgzׯ�Z;XcMY�۴n�`�r^��g�'�8�������?��o���{T0���W2�	��!c��r7��,^3Y���)��]Y�(�&_��<[H
9��:W��tvl����"�`L�N	g�8���02$ON(��,4��1��p� 7$j[�7�IMS'4�l�XY�O	�
�Wb �N�Ma'թ0+X�F9:6d���+:>j(�(G���>���qE=5묙
���/�0��H1����gh,�5d���w`��@�r��Y��a���V��lۭL��g_Z���
���)Z��U�g��22��[�O�E�75��E��?�x���Q�z����aMe-�n���
Ɣ���8���X��nU^3�P:���6�����_X/
5(�B5�c�ù엨�
,,��Z���]�U�)ҍ�p*F�d�	��"�%|�ο��>�:����m�U�_%�r���c�vc�[�Z��J<��?�RKs�f�%G�8EzB�����1#�%Mm2��GFJۘ�6�������<k�K&c#Mm�h,٬�F��QѶ��ƚ��%)M�&�f-K��(=�)���J�Mill���h��+ˏ�8�&�����a̠�|U��%����0�ZG/W��ꅱb�p��ibE�":�sA%֪t�M�q������h������~Ԯ�����m\���`�;�bK�fyI�6M�6�,}I�;=s{4�$'�ؖ�$��k��R�m�N��μ1OY$n P����ݗ��.y/�9�1B� ��^
�d��ET2w*��!�ؕ����D�Ѹ�7C����؏0O�&�;�[�,U*H�L��S�Sp���W���d�c4���(��j:F�i��J��B����;
\���[�|�c7��v,@�8.~����L4�4��6����E9φz�6��zM;悞����7�M��y��G���f|�IA9q;#^5��ٗ�6r��3��>|��c]��m����]1�Fe%2fa1�G���؏,����JY�°�����ݰV�?�"�o���4�o�͆�s��eY����-��{V[���������b��������>�8A�{̘���o�#G0}��h͎<����>����.:��+h�����X��}��K�/����]a�ȏ��qG�#`�Q�ǭ\�/׃�0)���Y
躅�&hn��mj���ۭ�j�`�f%=�����s�ڷ�p˺�qB������������(ft�<p���G]?��8����|_���.���S��O麀�:��J�e~��U�E~Ϗ��=�ϟY��فo���P�C��I��!T��S%	jR�(�ǡ�nc]�xbE��a/�G-��_�_��
�
��\e���AX:��e����o�^��ØϞ�ԭ��]\c�A��P��}����e��jL�;���-%���F�a��%i6�lֆ:�/P4q���j�v����
���<������:2�5X����0N�0���"�yN�!��l�ߐ �ɳ_��=r7���^������������5Q�oY����A�B%�����٥�������>��D��Chbzso�Q�a�r���ɩ���@�4�)�2'��ym�`A[��L�%��->.�����ڊ��AX:�)X�W���a��umu�睄�_m#�T=�iE&�i��&����2ctL��3Y��7�u�
�I+r5<��G�z��qїQE�|��Wj%�2�I�� g<;�9s��9"�֙��,�n�M{�P�N)q!�3n��~��{r��������:��wN_�ok�b���vw���gQ��Љ�`eP�W�2J��Jyނ@˘��d�5F�]����ax5-X��	��e��}_?p�V��Q���PR���k蚏���>��+\bF���b@��3�&_˪kL>��N�k�x%��īr�Q�21sI�b��F���?�;��qaB���r����?,ku��.¼�G��?��'�o��a����",�ah�q�Z��������g��J���p�_�:,�aơV�������l
�͛yk�ȿh�5t��I�֭�u�K�j��Z#<4=3G;9;;����˓=��w��ókM�/��m緁�$��=y[(՗;o�1�[]�
��Գ�S��@��OM����j)���"���M �[5�CK��rˑ�.�ȋ��3�gX��|�;L�͚��YW
s�.��0�n�Ԛ
�縚��guݞ�U��k�FSk8]��.;�1t.��>�ꞧnK6ڞ)�^�'�[���ҍ�o��jK�'΁X�1��u�f��Dj�1���^�!��VA"n��ëNO��~ϖh���13;�9}s�_g��ÚF��J�tx|D	��Ǖ��+�G�˪Ĩ��}�J�9}'uȨ�� ��4)�U��	/�c��Q�ٵ3dG�?����%�w*-�; i�B�^�g=��0��=v�ϙ�e����^�x�5;t�	�&�:�?
��2�B���l��D��j�]Q�<�j����e�ىӕ��n0��#;	m'����%t뉲��ѕ7�(�a_�?J�:+DD�X���G�г�v$�W�9�ʁ�I�1�We���˜�v#gȹ#�ٚ�z�[-��nC�L�tàIY��,�P9��hA1��f�%`M5��
7`��`�a���
��$I���	��h'PZ�f�섕�̏X��U;;dϞ�*��Y�$\~��3�s��U��X��SW%���TH �[�c�_x�ډ���Wշ;�o��=}�H=(M��*ng�������*�r�Q�OE&� �v|��*9bb�D@��@��s:?%qh@�)EM�a�H��qxsP�k4�h.�S��#m����5j�^V����ް���}i��F~2����A�P�/Y��
�!�
?��Y@�&�<��@E
@isz��p��*��OW,H��`�J֞<y�U,�0����C�CU��.���0ޭ���qt���2�:V0����S
��-<�aA��[�����|%���Z_g��A�g�ȫ1ǗU�Q�j�9�xwL����|)�,���e��RLҶ�5<�TO��n�[2I/�M�KA�-4�LJf���u��G {��
���}�UU�{2��`���b���*���c���T��ѳ�S�x��5!|�p�i�ZU�Ԡ\��ZK4i���x���ĥ���)���/��U~<s<����<4btoS]��7 �����%*�H���5��t����հN�y���&sK�=�l"����<Z���$<��G�K����Ti�1G?���0�+a�"�&�b�}p�D�ԊH����8j�6���j�W�ݳ&� Pq&ue���n"��==�t��V�9o�gZ_�	���S���h5���̺�N8��G��ūȶ�@-����{b�8�1�����Ǟ��c���MM������c�F�s���ԝ��s�ĵ��g� ��(>�Qm�4z7�t�����C��q���8�(��h�xN���}�8'馶�6j�u�Cځ���0𪢟HR �A�-�{�gi�p��.͹��
fN|b0�˜�㱌�4��H�s�=�:�0)A�Kg�=�PO��7���
1I׋K�/g�"�&��Q<f+m���(a�-��9�����ճZ�.o}��Q��I��ؽ�)*��G��W���\��(�]��踗�AP�_I��6ȩiEx��O���Ӊ�*b�����}�@r�@ȁ˺[���e�y�K�;�9�#��B��]��X��I�0O�6U�(k:����_ +(������������ .�=K[���7t�b��^��ގ�Թ�T�"�r�Z,B�S��n��蠀��g���q�n犸���:�
�?�a��ز��G�C6��p��c'Z�T 2��������^�EJ����(�jkJU%z-&�9*aQ�t�AE�4A��5�ui��@�Nj��S�yb�H5@b�E���$Q�*�<5��뵴��)��ҖG!�
)@�3:�Uo�>�;6C��{d�:�8!��9��*�1��	�|G��/�K��@�읳c�>�?����{�_����T��N�E�ee�8G�!����͝C�@��@:]U�R7$^6Y�]^���	{
IEŻѱn�<BҜ*R:=;?=8~a�>?�^%���_F�[��u�C��R_�o���(-����XS�}�q�=��U�?����I/��+ߛeM���)�}8�a��/{�,����M��E��=y��G�e9K�
�X�a��\	|OmΎ�&m0��Wu�2�Y����`�'l��k&3/��g%߿G�롖�)OM��ز��cnߤ��#���[eƾ�����3Du�.��(gUh�.�U�X}Z�������$��|Ầ��g���R���X���� |�C/�6/�����kh���2l���U\����?rԣŭ�R�Ͷ�7[LV[�2�������*���M����L�5��7R���M�3N.�O�tn؋K�|p��]�{�{�Q.�㾽�|'y |���y.�O`����/HTF�s8�(g��g�-��-
lj���
Xz��9���V�_�"�n�W��u�՟jɠ:����	�m=�ۓ�ļՙ�w0o�#7�����\H=�Z���:wT=�q�i_\��.ƞ�C��:t�F�W��:��(�>
�?B]�!*�R��(Mྦྷr
�D5
�d��%g􎂂c��;����ϟ���	մu��a]��f��$�\l.�U�RZ-��F~V��� �l�M��(�K.C�+#�E\�>���5O7��P��D*U�>zc�8rw�c�EL�r'�M{eS�����΅_݈��w���?q|e�o���3�:z�]�;���2:p�3k�[Go�Jh�U�k$�9������P���4Zf�*Ȁ�Ѥ���h4.NX�����������tZza^x��à�2]��Z�n��Zp�W�7�t���y����-�u�wZ�N��r��.n ܢ�}�sxx�k�<9ye�=9�9?8�W��0bv�]#���vse^�`0��Ғ<U�uB=����Pg��)*+@��E��Z�/��P�
R�8Ƴ'g�������}��ǭ9I���~:���w<d��݇�<д�q��m��.�'װ�@��q𿾝0��3񆏺�P������鈨�%�j�s0�]�c��V�8��o��;Q�@�=d���a�Q)D5I�0Y�k�tշ*�WYdzPDz)"*D@��|W����������B�'ǕE���S�V�_�",<4�����������wn7��'.����?js�N��G3/��(,��Q��5��Z�k���*
o����������X	�+�q%0~�����*�аx����̕�׻+�+�+��ܰ����FKM�>,� �i��5+��w��kh~��VWo�~�0t�l-��l����5�qzͥ���=¿_��yԙ����f�C���Y�L�6��{�Å��աK�!�u�lYV�RY�`'�/rS���M�'o<����/�]H���<�Pyx�-���w��C�k$�8}Pܢ��}q��Auo^sW
 n'��	C)p�
��1P�}?]/�yec���DW��I0$-N�x*›��X߂�~2�I����{`F{=^�e�A!�w����G�1���8d��8�?�F�̉Y��y3�j-R�(��Ǘ��M7�v�P�<�n>�qj~���]rp^���1�d�B�Y0�l�� ��
K`,x#𗝢��X����U�k���
5T��s�́���~��E~�������u��+���C�Mn���\���I�� S��(HT5��4%af��c|z�z$s~ʏJ�R�nZ�-$�����k�����C��)վ�+�������^ĤZ�F[��ee��#j:��jz	��(��v<mi����wģ�k�@��H`������ӻ���Y��X�>k@�CsZ�ߑ��Zg5|��@�]��=��k�Ot���Q����!m�`���R-~=�U<�O�"H�"8	Q��6��Y0�N��U,�C�F>�*���f�Jquɬ�*��ah|ϬX�a�a�G�{�f��Y��1�{{;�;d�p�cQ-	O��2JM�҂0D];r�د��t<L��O>��1�	,�>���:	�W|��n1�z���/E�͑�"�V���
̮V�J���"-)9ߪ��H*\���[��}��.��!Ȼf�wL�[h_1�Z�*��4RFf�׵/\J�n83akN-�!�jAm����d7�(�#YS�y&����ʛ�H����OQkb�����3�0���3�C(���mIO����_fVU�-[�D`I]���UYY����������9*u�秭3��.LP��B��T$��j��ScO���8�߻����o�Yn��_��@�zDb졻�p̗y�<kO/�FϦi�j�V���@��+�6U�
W��x����4Tc��Ͳ�:Դ<�����R�PQ���F��7
ʥ>�w���K����i�P�Q��G�~>{y��͝��^yj89�'�c���XV���?�y;QƣZ�࿞c�D}�Ӟ�_�i�8N͍��B�y�;u;���;�����0�'�9�q	��/��j�n�ݥW��oq�ׅ��X]Á�pԮ�6�O��H�����Z��v2�}����"��&��kل��Up�i@�((
O���U;W�H��P�(���;��w[	w]�7�~t���㖨��=�W/�5#W�l����s�
��/v��	���Ņ-�����,�6Q"�J�~Os\X��(�-��+-��q��U:�����G�/��P���А��|��U��l2E����W�p�ˑd�~�P&�����B:�}����8�#�T�S�d�Q�ݗ`~����cP�]���Y20�\�G&�-�vj�s�mwi��&�	�W�Uj��=���MQ.SN��\v�f����<��� p�:�,�~7cy�@�H���`\�^������<:.W�t��ؠ�
��jk�F
�Q�	-�L�t�,`�NK�`�hu"�˜"Arx@B"㮮�!_�9����ް�k!/��n\u��5�$md��������OZrKO�#�݊E�a����fu�\"%�V׈E|ӛL��rR�����Q�K�Q����].žlK.J�*��
/�(�Z����&�)̓�\TyC!��M��.	=�W�zH�*=l*�òa�hH���&л��6S׺���褁�x���$�|���/��\U�*���J��Nl�n[�ᬈ-�%��-��d�Z)&/h����*�@jh� �p�P��G��~p8VB����z�(� &���Sw���E

E
���iɝ.�fC�����8��_&�!�P3m�chX:�P0�U�g��h0
S8�^'	�,��������!�#/b�䠃t��%D38�o":��,�d�*�����"K~���)�v�L6e�&?`�4~��(
�����q�
`S���F�@����/�viC
@Jh��,
�\zh�zݛ��*�����a�E�L��s��I�h_�>^�#�=J�����l)]Ӟ�����]5K���VjX���"$F�8��⌳�cAbk��`u��v�2��4>(%!��N���N[EVח��NP�0��2q�b���k��D�zQ鄥�n~��\Nz%m��a⌣�)U����� ���|tT矷v%����lv
�v�X����øŠ=����Fs���Di�u>O�gv|�k@��_���f��Vѕ��$��I(
H��z'�a�|~�'�͑%��VF��*Z���Kkܖ�y�XA��V|�[���e{�ý�d�<9��0�T�1K:Bcq�vG�а����t�	��Қ���k|3,���,?Ⱦ��v�ى�(Z���iWEV[�����]�萝�>�����>z'��BB�ݝ^�����7G@�Glf�Vuw3���zTݭ���'GLs���Q1���[�C�8Ϗ�8z��m�Gր��:��|j�B�n�5�"�gnC�����w�)��ν;:|M�kx��^�ƚJ��cM���4'��J�i�S*<�����;�‚���팠���E/W�mg�,�����Vh�N'V��Z��'��[���^�6�\Ǹ,�!��f�b�ސKo0�2x܄c�\�紏�00Ý�u�)�'�Â��?�T<�O,X���)��_��3�;|������&���(�YSX9�u��d�E�x��Zd�KP��Z_@cd;u�X���~�w�P�K�<U7�࿩u �4�?���|����\��s��M���u��2�x��dq~~�Զb����Vl��&�c��T�D�U
���XT�8{:����oHuS���d��ꊌ<uf[v%;�U4�b!los4ĉb�E,�
F^¶KQ\�b�^�ȋ��;�b�M���T�o���4m�J;+-���봳�B�R;�\�@���qs����
$Y?�A���TG�4E����Qg]�ZƓ�8<Ɏ��c����b�	Ŧ����
$��Ҋ���������?�c�D�8f]��~J�i�V����Ԭ�Xx	�H;�%�@�Y���>g�4��3�B:�c�F��Fܢ�H^{�/K��ݫ�k"0��,뙤t�����VF[	`:x+�<���휖�1�`����ؗ��嗬���=O�,2P�}x���W��.s
"&�
�
|<XV���)-rlUК0�\��*����F���BiC�H\j
��B����^�"6��,P�0{s�e�!JA����m��/�]�.&3��Q��c�H��R<e�d<�~�Q��:s,u���:f�I<�~>�ہ���h
���J*XʶZc`}�9b(.����Q���K�6WQXVU^�����S?�UO/�X�+�6_���+�T�Z{\!���� N"��K�SjVU�!�k'���쪶P�&��P��tj�W)�P��=AH�4�	�}����k����#�~�.��ȴ8�����c4<�����0�e��6>eĦ��O������P�_�?�n�?���l����˥�YPV�����klύt��;qm=�Af߶;�B��A�S�X󾑆�R�j&;�H�׷�֐뗩F���2t�����hq�ӻOt��*��	ԏ1y�xzF)��1�'&
F���c���?�Ӏ4������5L`�)x��KAG�3
����u����e�s��"�ʒ��TN����$}�v�F�Q�(K���nJBp��/���G
��	hJs�J�:�4�Y��:kR����:�7���\�~�h<��؈�ql��������?��1�}pDڇ̤���m��Ü͕��#����w��ɳ�ώ�?#�p�'M��c���^;3~@�7?x�Ȱ����?D���7J�q�i/d��̾�r�7�c[m�Y������S���c��/Z��?"YJk6k���#�cs
�~���˷/Z�����q��	�$���i��w'�m�����-�{	8lq815s8�~�Íeऌ��w�_8'��O7�رU���c'r� ���D�0"GSc�S?��n�,�Z`�Znv1	��H�pQ/���W�p����o�i��t�)�p������b�4#�/����$O��<�[t���x�|{D����%*2y�*hmD���4f'�4 ���
rk��Y6��͊����1��5�#���x@-���q�&�is��鮃q֡”	�lD��ը�{cl���خ�J�i܂e��״C5q0����dbM�g���jP*BK�KhG�^>~�jo�t���虜O��gq<�<���������\��%p����|�Uߏ>�S~a�u�f��&+��·B�7$�6T�϶��7rc+�!���?�Z��h��`��գ�[��5�����g���p,hs���~?X���Ͱ��i�ưQ�X���,�\�Ѐ��¢�{���2\d-�E�qQ�z���mđj١z�������y�����M��l�������.����V_o4����hv=;��:�|C_�O�.��hM��ܒv�p��hW��q2�"<�BV����J�/�`Ǵ7�2_��r���_�@�^�"%���@�b������%�C3����=����-`������_@g˨c�i�Y��v󜞗o����%룤
p(�zPwU�Z��ghx.��a�T�B�� �Kd�%��Zrs�ry�KSPN6��n��佦��}nLˀ��AM�E��c`|O�>?�>bR
��2�X0q�\g�� C҂Fy��1}�@�0ٻ��<�3~���F0��<�k�����~���C����<���q�е��B�2
��C5IP����:��غf��!�����g+�n␶�r׵��UT�y��-��v�Ə�SUQ˄�e�J�*�?�V��Ek7DW5�]難�*8����1Њ
G����V���e���M���"�s]#0�ضT=u��Id��ԭXWm�#�Fe���z�8����ŷ���d*�~_�R���h�9M�]��>lP�R�*������2T�sM}���I*R�M4[�Du��|>�
(�<�N��i
�ҩ{�>MO5�^�y�tO�,E�`?Q]mM�`CR�
����c�Q�_�Ϧ���c��F��խ#
��M _�ք|{�<Q�+�K�I�8ra�IG��a��̺0��ISi'�aW�x*&Je>���h0�g�IZ��w�F��+�����>�2������WG�9z�fY��_������'k����|�ʐWVZP{Y~�x�o'ZC݋�:����Q�wڭt/���x4�a�����vy&(}�*ş�W`���hU�+���Kc�V^��~��k��1޹/\�Ȭ!�_y��GL�}T���xb�A����ކ9�%��&���{�9��ê���,�	g�[����ٱ&&�q��`A�Nbx���6jS�vf�}�1��K �!�����F;n2xĄ�l���CQQ�B��
�S��S�9�
�$>���y�*>97;��n�h�0�)��
�6�UN�*�qV�dž����c��C��c���ٰ-��;48?�CC�!-ۢB��as���~d���ɩA�2(2�n���E$���o����
���z%���N/���[ɩ�w�wjd��� Jk�R��N
��ԩ!�"�z�l��mgN
Y�K��j�qj(W^�Ԑ�b���S��t�SC]���R�9C���u���|]a�;��7rj�;V� *95���Ԑ#�Ԑ^�3�)��MN
��̩���}��� ���^��Bz�zrm顾�"�_"=����憒A
P�0	T�pTG5�8�u3p|-�B@ώc'��`n��(�N�l�^S&���~�f'����sr��0��!˥���x&t�F�?^��U�a��#v�
+`9BE�4Z�GhE
�o�P�c�{6�d��
K�����z���M�q��v���
��/L��Jr:3߯T��t%ٸԭ�h<��Uui��]��՗
5��� �0U�ї�f_�>��iPًŔb|ݿ��������ʤ��
i�E��|9�,P�Hα�f8���Y3L��+�t��c��o='	�����m�$;��$z+E4�mѠ�aD�ޚ
z��h�#4{��`Q�$�u{�M�=~��"�Lfs8JZ��
��ʟ�Z���c��}G{��h���s��-E V���a��J/_�_�ʲ"���Bظ�ưq��uK��>�-���WM�*��i��6f\V̇��8�����c���y&T���C\�5'�B��oi���6����(sH+�{Xj ���^]��b6�D$�Q�R)����_&��Ay�1��Ķ,æ�$횺=���i���M[�8tX	�X>��H]�D����K�r��c�Hs�2ͳ]DZ���帪ű{Z`�n'�ߍ��>��6ayMm��i���K�9'�4��}����0���+���Ɓ�b��~�q1��(�p��������+8�f�x#��c�JA',gK]ߎkJ��w�T���Bj�Y���nW�W��xy1~+�z�X-���W)��*�_]��k��_Q@��Uo��Un��3���=c���M�"��$����o-�4���"�T��zZ���%fG�i5[��Ϳ����]Xq��v���.�E��4�E���~k<?�@���n.h�c�և]@��V�2jP��'��Z�,��̯ig�������:��g\&���͋�<�t
�����x#����xG20F��T58�'��
��d'X>ZM碱b�\�V�#��΅_��X�*ƺ��k���(A|2e7�-&�%�I]Ж�c��W^��["
�4��.a?�9p�ӪS~"+$�����fM"�8:���;v��ȗ-�A™Ú�Ʀ��팯F�/�?��d�6jޡ����^��C�*�%���h��PD��^����;���ȟ��A��Ǔ_J��
o�pz���AP�6W������o��3�`��xbF�ν�f���z9�b�R�T%G%S���ޓv�qd;_ǿ�yA2r��E�`,{�������MXm�%a��߽U��ի�$��Gb��k�u����V�[X�=�Y���|v��XA!pq_��t'Й��*��"y#}��Q2�.�Nۆ}_Ȭ��3���(J:�u����.y�"-��	#�A���O��+��H����v��$�������`�������ٖd��[a`���:~?L�QBϱBx�����hN�����8é�=�2�k��h���/���M8:D� �^>c.g*��BL�DZ/"�>���G��;A�;���
���Z�ּ�3c�>�,��*&6b�"��kG�a$�$i�����C�A�1��@¾�eq�h3d�伀0���#���>�����V�չ��$Y��i�'�ͼ�UYS[<���wg��/g��<w<I��w|z򊌼�뇦���$5R�r�e��b���f\�MI{��{�=���j������cJ���	N��$��i)q.��h�L�G��%y�V��uJ�\F"xASA��V�k����DZ-g�E���W���1��%�h���Q\N�4��0(�j�Õ�p~s
�����3H6W!嬍
���U��bV�`�i���J!|gm��8�[���m�
�M׶B�o����y}�u[[��!D�:dwPiU@��TC�_��M���exj�ܛ��j4���Ǹ+�J�쒲�p�M����s�?g���N}So"_��x���V���<�L�I�(0H*
�~3����}0���]S �j�z�B�����ږb�H�x����ue+^��c��"�D4��R��y�*�PEL��ֈ)NCI�cjV�_'L"�@�_&"6�W��!c��M$�k"!%�,\	uƱp=$�M$X��ע5W����o71�v#�d�fȊ�H��vų$ٍH}�$��b9�>�$�"�4b�#�e~���D�7�4����T�\��O��˪BL��$�.��w1c����ΎL��c�A~~{q�{�}yz�E���ߜ5���C�h�ߚ�A�6岊�/�ƨ���C������[��
1~q�/�0|~�Ɗ����x���Z%Oh)7�*�24^�=�lS��,�р�(��Rp���R���1ދg�0�W��#�i�F���Y�^��i7
�F����$���}�p�ו5���遃�
��
�Phb ���#>�7@�d�rF�)��a���q�$��Jj4��~y�uX��e\�R���=tE�EN����M��E�\�5�6!��5+�paE�)0ˡIɽxP��
ty��aA��C%�I�
2��}�7"�zG�����'��#|6�4L��L�$��t8ܝo�$Y�1I��&)_&��,e��|,�L�_�I��6��!o�K
,S�O��vUϲ�w��rH3|+t5˷dO}`.�F�z;�Qq:��Q+�ĕ��U}:U@fu�#�W$�7�Z����f�(C�ٰ=�_��#ח�9���LU�8��	
@�l�#�o�z�1[0*�f�'0M��^��W�B�@&(���#{Ćfr�n�Ȃ�5fӄ�ѰKI�Ww��M��Y�-�U?ÊV�YQ&�����Z�g7B1g8<�{�Ȥ�̬�����=�]'2�i�i��0�1u�xl�H\)��<�^� �["r_�$:[�>�yCI
-`�)�Vc�$�emXhjG�mP޸��L�#D�9�����t=�\��,8��/ن�A��2p�oD�a�j�2�%[�dg�ì���Φ�[mk3�ao/���wS!CN!�����)��^��X�e9��8�OQ?,*C�k����L���ߎ`"�l�B��.�bE��p�4�B���ϱ���3
x�"#8rN��:�eE1��R��13�U��ʳo��.�#0m��w�̨2&��A�Ι]��-�Q��I�|7���C�f����)<X@¿@H�L9�D<XL�]p1��O|��U(�M���4qno^�.!O`V@.m�7
�QseHVV�.dK�n���8C&I���e���r\+qf�朙"�qf��{�J�L��o��{]ά�mf^�����q�rhX�����[�fy�c�:�e^����C{�d���R;�R�>�W�f�j(Y
���P���@��x||zt�;��D!��7Tb�T��l̦G��G�^AS�	^����J�,����p+Fj��bd� ��!ԣX""	�����r2n̋���Н�CPV��Ѣn��ΧPG_���̆$�����/zR,s�
fvdc�Ժ�E����F.���kE���Òp���ku9%�%)p��gj��oC{��Pu�p�u���d���/#6`�y�U�ކUT
=�l�6T]_�����@Ӽ>�8�o:�ej��a_�5;�#nC؈���*u4h�*o�$�Үx,a��|��p.}
C�����hv
w̓��N&�T#i7[���cV�h�MCи�0��b�~6�q8���q��Vb�Y�n?H�'������bЋ\�:M����oΨBh]�ߪκ�*�L%)TCE6��nU�VF��FG�oշ�ϻ�"�Ž(�W�����<�F�DV��6%�?q�y�_qA�*�ɃSM�u�\�ĿQ��i��㇙�-�D/!ę2z4S�����E��e�݌�Xe6�R�YA��9mmh�~����듗ݣK|�box�lHxM�nRV�,N^���ƀ�Q$I�t[����
Q��{`��:Z���^�$`�	�7w0�cB���,@c�ő�Q�Ҋ<'C��b�Z
�geN���P���t���7@��;��Jzwb��V�0Ҹ�J���e��X���y��,��J�ݑO0�&介×]�ZB����0
b��k)
�C �;g���J�+�8��AL��@}��(>"<��@�T�?�$b��&��4��ntEţf�H�a[3�̄����0�!&«$��WZ�&���6��
���	�[2�8,e0���n�`�\�`XK�*H��0ބ�uF�i�V��Ʃ ��]�뛊�z�by��9Dt��l�3t-P�R=�cyPsrŎSi"��N��?�*i�n6��Ɣ"��b�]�1����WQ�y4l��S��˛�N�E���Q	7����
�Ro8
��Σ����u�-�!w*ڟ�� �2I*jI+K,�,��α!�����/Oʍ+�����x�X��w�v��M�(ߎ0�A�{R� f���P]:!��o���m�;�ӚB9;</��o
'%ҔTp��×�����!b-�[3��IX"E��Q��&��ɗ
��2�fL��b��ۡQ�b�Tt'�����C�����7��[�]���Ǐ�kCi�q�� }"���6�@�i��I�r�貭l_��ϔǮ)�F(�.oHֶhœ+$��QZ�ゅ ;V�*H[;�� H�o˖���%�:�q�,��MT�fN��-D��.���|���@��O����sV�������cv���l��s'�v>X��=�����m��uv�F@���
�
�}\|��d�h�K����v���"�����zm(��r��J�
�4�P�ʟ'�>M�]̌��5/�����(�cl5*��5�/z�SNG��J\v��Ou�X@*�"����y|��6FZ,A�YHë`bU�G���m�Hw2y;�o��&�LY���>8￴'r�Jۼ��1�C��.��~�ӊ�l��>�ً_80��$
z��U�*!a����!��kI�m�l���T���Oæ�4l

ͳ�P�0���dz
�?"R���z���?/��;F��c.6`hR��2���=�q$��m��f��k7Pf,(�Bط���>�e��>��%�rŻ�+>�h��&{�$yf���Zy����%�+��3��="��l~��p�5x�q0�hw�l�4��k(�0����N'�]plL��-��VL���>"I�]�v�|w�J��L'3�����.g]	Wy�����v�"��0�v��O�$���Ѭ��d�/����{� ��j���";W㝴&�f�6�¨�
��/��ݓ���>WݠއW�0A7欑����}�=}�=�|}�+i�/w��4����;!Zۑw����������g��"�_���u5F������{�d/
���6��+��0m�T��(FG0P�n�����Bċ �z�Ӟ��L�n�!Ǐ�^b4&�N�`�������	b�Н�^��]L� C(:��ń����}X����|��D�$�I\2��?��Βh20��l���

�jq�Da���މ�	��~�ÙAdJ��?\�F��f�oK��p��F���BVk��%_���B�ݣ����Y�d�
Y}2�$�L���"�H0��+l��fP_����=�Ѐ7~�|@UР���ݕ�o8��-,�m��׺/�_��I�{��f���VZXUX�
���'���h�m{��D:,[u\�=Zd/��f�,
�)6:"�{�8�F����}�i�P�I���y��:�m~�h�Yيuh�E�F7���RUr
�$��a���˴�U�KT�f���3@)*�r��zU�&��������٭��,�D������'�g�cS��Ah��m���w���������U�ؠ��Q�ƾ/WeZT���{D�"��=E�h�R�4��g��v*��m�G�z��� `��0��{>Nfs{Zz���I�P�H�Ɛ��q�4;Ԃ(��Tzǻem�ݢ>&�^�B��(_�ڎot�'�e�6���CI(-����`�_�RSo��me��fA�5�Ժpe�$����u�"XL�$�)�=i;(�2�Zp��^��6T�]�o��F0	�t����<^_E��Hۆ�����ު%c��חC;�$'�}G�vK�kk��\Wԑ[�g�U��)5����Gz�[(�5'���b���au���"�7�����T��G$�0&���3cW��p�q;B�U(���t8�7ڭ��~����a��H2�
B�:|qr�iHO�mr�D,+0cp�L�f��${���D��П!�(B& Ǝ�C���YPf��*6��4�����4f�NdA|L���{->��1�Å���ᄦ��ش����#C�e�MY�x,_D�=�B�-=�a�HLh�N�R������ܼ���a_4ڬ���`P�h�d[`A#��"�~�V�^���*Ƙ�a�(�E_��� �`w/[vK`98�u
��	}� ��"�]8!��ɧy�=��N�t{�6u����̍־�z�-���+�u"Գe
�Ik,ƌ�=6��h�I{���2�{T�{w9�.G�|!w����;����M򕏧S;�"�~��
ي��e��W�*��mY�ic�w�� (1j/�,X������1��>~�N&i�(�y��wx|��P�Nf��#�	42�5G~���Хy&н��Ԓ\��
�������N���/]>�nSKj�^,�6�-*�X��4u#Ͷ_�&��~�a��������e�x��`%:��B{�kf�E��V�'C8�[��:��J�	\��ЯZ��X�`�w6VV�/x�wL���#��w@?l��&"?z�`�;TX��O�0yF�ƒ,ې'�׍IB~T�X���Xij���'�����%K�
�T���UҺ٦,b���l]���K����
�^BV4↚����	C$���$O~�{�2��i�"8K�Ys
)檆��	{b�#�k�C�:��_�:=���6��"r�!P�2��1�.�"�O�M��3!`��J��6`�u��-�:<h�RDc���W������螣َO#�[}��X��궢����㛦�
���Y#$����t2�aڰ(�}�q�V�����V��wD!u~�w<-g!�G!ּ���	�$)�?T'XCre����j�	�����.��}YY�}۲�-1	�7�$5�=�`#&�%,�3�#��d��v��m�ڜ�y���/kI2=30���K��m[���]�5�m^5�y�o3/�����݌�*��H�ڞ2��v�mJC�Ѥu�?�,�VY���-ˢ��+:��L��x���*�M��6�O/�m�'�����&�y]�e���ԯ�lL��dq�`N�ܷ��i�U�h��_�?����m$�
��cf3~ �o�d��fm���ͬ�,	�Ŷ<���M���VU�dI���3�N������Wuuwu����ǟ?y�/h�nFWs}`�勈5�R���ح*�EsQ؇���!ܸ���22�K���B���ktS
��C���ů�B���|���?��f����Tx˛��WD�6�@TǛN��E����&��?��7��*��v��"�K��o�^�#��G�}�pS�W�°�w;6"��	�c)e�k�I�]�����PnB���� ��#�#ø8=R`˕���1T>&�?�r�1��ØB�F��k%�������<��J�zҳ�q�g5��ܻ������hl/�e�Ty�O�D��i{S����$s˽�:�Ѓ��k̻������S7kE}�ʕr���v>�/�I�-c�i�(��-���G뼠j�m�j��*G�������S�o05�3���n����<t_oZƐl�r���&��a�l���Dh��B�b�I��N{�>m�Z��<;r���=ċd������8�i��HUWH����|��1���M��</��ev�/�0WgI�K�b2�o`�lFw��=~�ܽh4�A�ho<1j<�r���4�2�O
���r-�{��J9KWz�7�m��g޳��a��x^e�����-f��Ÿ������h14��}�Z�^o�?97ֹ�?����c���c�A��r_zW�F�
{�$(�i�f/�'};3ǕT����=�2�*;•[�@�v��p����z,~�a�X��? �箍�\n?`�_*���CO�����$W�V�O��u��b�K���^d|�[
im�n�t��d�^���V�X����T��5J���U�c��;*��k0i4���y��=h\4�N���['͎vp�8?nj0A��L�Sw�����'nvzZ���	�Z�v�}��޶��$::jv���N�M,ġ2�Y��$8Ȭ�a��dIie�I��ju����\����V���/Uﴫ�6�{�;�(������=�?̰9���p����o���˕���Z(=�'x���B��/�����~���ϗ�i��=�Ŕ����8Z�*�~�GZ���xaK�қ��O:Ө�@��w���[��8�JC�����{��so�
N�����^�����h_F��^��yKt+�^)|��7�A3K�l����"�q�/⁳��ۋ�a���?4N��8��Z��\��z�O��aJ�7@�3D�ZU!q�*�|���;�鳩��JC%|܍��sf�Aj��B���3�a4M�~�����F��~~��p�l��?���M,�,ׁl"R���g��9<FǏRp��2��6�^�2��
�)c|��:�:�f����v��lZ�Դ�;x�� �}���k��5�"�1 ���g��Ҽ[oj��_G}����{�^��I^`v�F�HDO�7o!tE�ܷ�>�R�-���?Ԛ���&R~m���w�?,6";O���p��O���c��A����(G�Y�k����+s�?r�z�I�`����w��ن�V����]T��Rk�mh�JH|�"��;P$�-���`ȥ}(}��?!5�t����]C�w�^@y�w�_9��(v��]����zS��
&�0>���~�w�����Ҏ��ch��7���'���`��WT�R�?ų9�/�ʤ%H?��#_�A=~�h�]���a����%�"s�M�#ѣ�[���!V-x���?�7��	/D�k�E~��s�[���c�K�j�O�]>�O�P�f��D��n���Y6�q3`�h����[
\'�+���_U}�O����X�����ɕ=t��֕r]���R�+�6��/��E��W��T�j��2���F`��'���h��`}'VTi�����/�M���Q��
s,��7�pG�H��s��;ok��L� ku�yt2�A�l���6`��v���I0�ԪR�J�*5Q��	BՓH���3��%��//� �=J�<,ou��jx.	8C��ݾf5�kߵ4��1���nG}g�e#�
(�֡�hͪ���z�`�H�8�>b�+��=���\)���4,}��i��k�qz�CڿT|n��xִ��B�2s�=�����{�Z���^Y��jY)>�O����ft=4G�vr��D:x��=<��Q�0��)�fx�T`9Y�)&W�RWj��?��\�e�6�?A�9��HAp�¿�* ��2
K��*�,���t���I49ŷ��ܧ�7�]]��8�E&nZ�{z����@��jHn�E�=Ǹ��!ޤ�AȘ|$G�`!ٛ�#��X$�_����"�ͅ2��Q��Ԡ^�Dn}���)���s
�(o�jhG���j�?�Rh�K��c�~C��o�>|M�(.�"Rx�Z��I7�ؕ�Og�p_�h™jv:�IJn���1Q�j�C�=�E���	$�����=9kh�_4Ù���q�B��h���s(>�M�<G�;薴����T
�׺'
%�Z�x_�*cO�n���Ѱ�1@���)V����7�uRS�NjE��O��;M��B����O�$��[
�d����F�����\Ct�]�U��-��_hCK{�²b�
��=��)_i���N�Y4�&A�r�}gG��7�F縫i��1ne�/i�+�*�>�d��%[���>��y�����p�>wx�x�pA�u��!S��p��m!�Z���9m�0���9�᪰�'����J�Rq����s0_gR�c�O{D���1��"C8��]��?�1��׹��x��7�"|�^y?���/��#kd@N��z��U�3�Z��|���)|���ތL͘~ɲ�����a4f�����7Kℒл�i��%:ŧ"��9�+,R�|�R�SZ(-��Ş�v���m��������r�_�����R�%#�$A/H�pCe~"P�p�<li�jKkmg�(8����]S�5�J�1�ɂo��.�r�
ݝ�]Kx�"^`��:.�xx]Bp}��5��|��H��
2MY��~�c+�iH�JiIBJp��h��A�}���L�H�-�
c5���:o��t�#�@�����(\?	$ĸ]&J��a?m6�//JH�l�P�̆�v�i6zM@;c��AO��Ҙ�:Z�4F(��#�Q��uX�u�-&RT��Q6��N�C�x<�:�+p'N��k��#�;C=$&�I<�z1��Ujx_JΖ��1�+=ɲ��� ~�!��1���Ȭh����n�ę��]��,�6ib��dti���
��5c 9#�����0Oa�#��]�f�J,"�^���Kh��2?�\2͐>0�%�����2=���Y��P�����yG^���CA�H�vh]���;kjݿwD6b���߶��/������,��tX�<���<�`�ȳ�(Dt/��
>�?)��!�9n��p�����0)�+Fl���ۼ<l'f0�,#!�����v��)��CZ��݀�A7R4��
u��k���܅{(/4NO�6މ�ķ�`ҟ]qN5����g�a�X��S�"�1�<�/mfj��(3F���Jt�^؝�>�����+������4����7_]`Ӂ���a��<�:��% �,��&�2Ӿ��`9��!%��a	"���o�^6�Y@+	'6�Gqd� �����8�-�L�"��Ny������i�#(�ؚ"�i�YH�>�Z��1MK��#��cJ�{3��14��Y�D[�X��uzr�<�!�_��Ri.�nZ�+K��i]n$y_`ce�� �d�_�~e���t`����Q��0<��m�N�-�Â�?�WF�����N��KQ��ڒ���Ca�
:�H�ؙH����e���	h�t�s�t J�A"����_����G�-�$P�\J-fQHU�����`�<Q��/	��A��I�/��-���%�)�*	%��g[�.8�ڈ���Ϯө����(~�IJ/�TH�J��jAxaQ�rڤ��U�]i���ӄ�k�G�:(����y�
�X_BZ�,����\ͪ�8uA�
	t-�0�3�2s�>BU�k������N�K�8�jZ����37�|�e�6�E�,��h߯)�h?������0�SJ5�A�Z��iSh崙�i��Kՙ<�m6���5�
Y��/!{-�B7�f嬜�Ѳ��&P��� �"YCpk�����}H����$XU����}���.����!�pTh�Ho`�bAx�O�n�c��q�Ĝ:�Ǹo˱O�#<u���	y�Fl\-�Mn~fD<1�Mi�����a��5��� :��M��b�ڈ�����a���N�C�Tt�y"	
��l����J@�����A���d�Ɇ��T��~�b-���E�ꨔ`��aR�ĥM��%�9= "��[�g����dV�K�`$K
��k1�XR.%G��,SC!t/H��Uj�amN|TEr�y��?w{~��ף\_���x�[q�Y��	�����W����fA>��emi�W�҂��k���Oq=0�7�_���2d(�Z�l<c�PU�G�K�U)8��=9��K;#����;i�+�·t�I���5 �g� <nimk<E�8��N�ܐO#��/�b���f'�1�Y}^���[�胀O��"�F�吡†n�,OQX���q��y���H�c>k���"?��j���e����K��3��Gx}�W�J�d^�R�k�Y�W��\��PQJz�l����ޞ�+�{/oO]�Fev��xQ0*�b�^���=��K)di}���z�堋��m֝�ّ�gjGk�B�cf��e��ef�h��3ϊ{
.���|�7X�U����;�� �#Z�8JBW�x2���,ױ��>fg�5�� ��r6ת��ȿ��q'&=w��[ǃ�=�otS��*T͆��8���Nu;W���`|�L���:�]��x׊$���¯�H��Y:0�\m���pFsÞ,WiWwo��H��-3�2�ɍ�U0+z!m ���eY(�zR=�-9xf���$��6�N'��=����&���C��j�Z���x��b��|�?eƝ�'�b���}�-�/[�}�%O.x��褌ѓY" z֧S�	���Z�FP��͊��s3��ʻYB/��y��Y�U�P�j���K��N�E�d15o�W'�Mj��ʉ]]�n�~4���o�8;Is��D+��� �}jn���6]��vvvgG�nT�I��5ޱ]�F"��r �}��84��꣦�0��N��a�-�E5?�K�*?S�z
a��Kn�ܻy���y�8Q�����J�_@�����%
�d&���%BB@�����/}�0{j�ȇ�wP9姟~BC�}l[:���!�LU������-߻HU$Ч9�>8����>�_a�0;�᥀��B�&iބTY���g��k8C��Y�"r2��dc�2O%^�ơ/Q?���+�� iP^�T�d�|ޔ-�_1���A*���U:����﫷��9�U�s+�y�.g�2�Xq�u6�/Nlq	����/��6;��k&Q�Dx:���;�F?a}1��ϕ�����'��:�4$C')\}o6��kX=
}5�ˊ��bu��G’\D�ƹ��b��}�0ʥ���	/Y��\KK��[�U��ħst������2=��8?�p;�DH��%�;},@��>ਨ�*�e[\�����l�@���"J,Ο#q�%+����b���5%����g<�j�.]���lO7��G+��ū�6ȶi[%2t�b�C�D���1J���so�<B��`�($AA�	@�0dx��Z���\c�	ce�k-������eb�ѷ���c}�x^)��b����DR���8�&��zD�Mfu�Ȅ��\)$�opHTOz�7��[�fZ�I
$���>���͙X��j��	�����9�|������c�>�§P�N'�$���)�mvt	̝�L��m Cg턖����#ɖl'�N�s�MKbKGoGGґt^Dg���>U�㡌�4�4��1�~��2�+$A�uI�tM�C���b��Y/.��8{���t6�8�!�L�66
�^�%�`8���QZ=K䐕�D��pZ�ӈap!��((H�VM��9�A�.0��w�a���Y.BO��*+�qjs��NDN��䐪�J��dS ��U�6t�Y����XL\
�����N�K�*�i*)i)�taS̈́�r�(KW�H!+T'!��SIYȩ+}	₼���(m}J��Tv	XDKx?r2�Sq	�	j9�h���z�\6�w�����M��n�-{�B��-� ���e� �C��É�e1�-b,�E� �T����qڿlV9�^f�J�FS����.�X����NŗŬKU�R�̓m`ff�A,���;@��
e1\N�PA����8�˖��s���[�
�P�/���H���v�����Ѩ�������6�g%R%�*H����^���5�xh�N�b�>��K����%,�r@%UI�����j�a�HrH�/N���l���9�e�Rf۸i�=���l
��	W
��6(Ս��H��"
U����dZ���S��A����0�j�j]��USS�|	�q�=���T�ÙIOjE榦d��u�è�>Ȱ�I�oZ�*��F�l�,R([�bY<?	��IŌ���e�D?S[p���M���A�Z5w�AE�\;�x�*�'��R<����q+��T5�P��g����3/�(��{%F\Q�!�"��Ue�n�NU@��Vu�jVk߮�{?+�#w8��Ļ�V����L���nn����W�+��U�hx���
�+V����Fk�aiZ���ͽ��MR�m2��F��jk�l�
l���Z��SS�������������AL�t��e�Ћ�	 �~#��c��q���"�"+.Z���w�;��\�dU��*US��C�2�:�Ӌ�C,G�/�Z�D'	�A���=��{%ڲ~Hv]t�@��NQ���{�W��	�15^��
Q�8W xPH7�É4���l�0�G��W�^r���W�Co1ĴI��Bq�C��p4
����J�c?R�j�$����i+���
!��I���Q��s�ܗ�ݒ���
c��ٕ
�aZ�����M�3/�Y4�=�GdvD�Q���wc����y�>��lc�5�^��E����eki4ڤ���dlj!ɶ\����s��#���L���DQX����3Y�M��̽��A�Bv*�y��I5
��G�rX	"��ַ�~&�Y@�j�RzZ��
h�ӆ�`��C�XF��d��e���%4�o암�3ݒ���~)^�1Z������u
jUGZǠ�����΀�Uv~=��=q���0�d�|Z�*���}a����A���f3�C�<�[�G�� �h���  ��ؽP�d�Qܝ̂+�xFy��BD���1��x���U�N!y�H�f�L�q�����
�2�'���qI�3�E���{���i�,�ET�@���p��C/
ao�?6rx��C�$�G*�S�)�$�����H��Dy(�Z���"�_�)G�]�=b^F��9\3��ت���>�l"cG��"c�U���Yp�"��ם����=9<�wNΙej��u�Nc�߼(c7��^��(�3)� k�a�D�h8�8�T��(/�U�Ye�n��K�M3������9�8���y���L"�!SSmq�С�r�w��J`ʫ&�T��Y��٣��N3�;�������u7��*�{8�@�F����:��q�\M�Y�� �G�:ڂ���M�7T�&kS�]t������e�9
�tjY��{)�h�F�8�_�n�Y���CZ�	RŻD��o�mr��d��"�
Mk 
���H$d��|b%�Vc*l��䶴A�&@m��}��H�.YIK�h_(�Cה��̝�C
���L��ar�����ڧDD������C23�m��Pk	�s��t-���6�C�L�*M��V�ɳhؚ�Á/��@�.K���b�7<�L�&��+��e��t]�>���2#?�R���F9�&CǧP�W	1�H}n�P���QD����Bf%�˒��C��K聂��S��I�Z9���L��S��0�E�:�q+gG
�Z�f���*�ī��Dk��5�N�Fyl*�{
W�+m�+DV�Fk����ЕF'��R|A�%�����L�Ug:�����̺P0��>��i��X���}fj����<fꧡr�'�Qz�S��x*mω�(ڎ��c�[3!e�9�L��тiD��;D���zn3/
\�GD��n<�Q�
6��crQ��s&(/�e��*�֭�݇��w��n�L����S�
�i~�F���\���G	�mľn���^x�m��oZ.q����p��0a�cw2wG����H�g���"���x�.F�*���諾$�Ơ;?D��a:=i�8��]Ȅ�|�#T+KZ]U�Lb\Q�@EB�����:b�N3u�'=z���P����5�/�ĊT�V#_�ۉ���ksJ2�բ��Eִ���~vχ���LĘk�Sa7�S�\U��X��63� 6pbҢ6L��j�Ԥ�L�d\�9��R�Y�oV6
a	QT���)wC!k�|��B6��S$E��q�V^�	e���4��Թ(.$�w백"'C�|t�M%ϗ�6�y���N�U�m[C� Br��#��v�\�I��?��{A�8"6Ѥ��wi%$��4�s�(7+ͦ��$z}�t{�+�6��f$�鋿w����������]�Bts ǧG���T�����Z�|2P x�
r�y����T���Y��Zh5�����P�
����2u���Ta�:�zMiN�iL�F�[��-�v���2�7�Z�u!�k������Ӟ�f
(��ޏ�m�'y�����Q�Z�?�ώ�j_��F��o�fS�
qrz�c@�$1|6�4�M_9��|���{��w
�������~�9:v
oy������c4��͍��'�3/�Of�/v��N��LD��z��_�<��$|�?�F;e�Jc1(JryZ��F����1�>s���U(h�Fq@wލNĒ�H~���|��(�F�p�>p��8�gG��gNE޹��=�t�_���`Ø2s��^�>��c׻ƳF!nf-s��}�h�����G�J�ʁWn<�#�
������GQy��e�Df���pA9�X�����k�B5[[	4�E� Q��[�'T��N�]�����I��g�P��������졝E�aP�z�F(�"h�#�ِxn�i91T�z�qղF�5�R���{��L&���wK��Kq����^A$�2�gؠD�8�J`�s_V�U窬�0�p}��v�����������FN������1w�>y�R�B�IL|J8#�;�pdg*�x$��ې��<u�Ƌ�����7,U�O�tT��\��$R!)����(�-���d$���m�zp���y��6�\�J&�&�>M�OY�~�x�P�7w�;��)��V^<�Rt��˪Hz�6q?q$'��|(L��ldA�;+��D,H[�����M_H6eb6�B/�aK�˾����s�.��p�Y�aY�dH��JZ����p���W+���#}V�Ze����␪�l��6n��J��u�Y��[��lJ�/���J_Vv-$�.f�@���0!��O���!�4)Y#8Q_��/{��0�nۊI���輦����g�t	8<d���ě6Zܮ<����]��ʩ��~`IeO�\���(����q%ܗ(/�oa���f�V�~l�E�9�V����^V�}��s����>m������Je�h �!��t���t��v㌠v
�K-���*�a3�K߽+=-��������
ei�Ǭ8vʑNn�f��R���e�{0ó�MΧo�;�$�'m�J�{�	^�(Mdr<�O|"�N����JI��(tuv��p�����7)�<��T��؁uM��X^�a�Dѻ�2�G�J��R
�������cm2_m�5e���;9�O��g2��;�LW>��W�R%O]�>	%Pk�&�ݶ�:�R�x�9
f�����H	ي&	5n�;�X[f�:I+�s��J�F�ַ�[U�1�J
T�tвL�Z�sTD˒�����NIini�sC
N����bk>��H����WIrx�	�O������i���"���H�%%7���:|�'��(øxhf� �Z]�?�B�'���9
�Wz`�,-����쿛V��W��f��7��j4@����٬X&3wv�mk:@��dRYV����Q�5�V��n6wj
�9D�e��}ʢ%~�)���«+�'�	�9�q��%�xbI�Sq�=�-���p��7.�T��S�W�<�(����lNhʹ<��sw��E����^B�<�$kQf߿��H�����B>���1��b	h$�i��c����`ϣ�ﶳ��i������X2���dN"��V�Q(�j�(���椔�+���I��}4��:,����|�Ϫ��λ�����j���Y�Ok�Q���_�3��=N/��=Pz��n�A��Zmyu�޾�I�$K�#d"�Q�ı�?�6#ڏ0g|Cr�dj�@����
Lak������&�'x�>�`�kJ���JX�d���J<��/�c$�Î;LJoޖx%ʲny��а�.�P�P�6�#�V��
������<���"|N}�Ĉ�RH]Pg���~H�Bt�_M��>>K���/R�����B�O�����z�_�����E�KS��Of��	w�Pg@���2�9�?v���kxxFW��l�_�x�c�����2͸��Z�n�2lR�7���v��ا��qӷ��<˷�o�1�W�$���X�߱{p��4�20�����2��{�@A�#��ǛI<V7�ܪxr�]�I���^��s��|_5x�?	S�g���gj��WwPݲ���&��@�4�U8�濇��a���~&fٍm���jV��� �?�,�'a�]H��-
�5F���m��:����c�����:�nP���ų`@@����%��U��N6��5^�����nL��j�9HF6:�r )�`cLׁ�^27�!�U�׹��0H���rc�Q�#��E�ϵ�[~�+��N�u6�,��.6�[߽���v�`ݖ�F^��h�#�y��/t�	D�5�K��UL�0pI�?�h�s�sv��o�����M��!^��Y/�����Z5l|�)���L6I��e��t��X����Do��?�Λ?���z�"��n[�2��O5B��8���9�v&C��z*Li�L�d��v�bTgS��O�:d,�@7fEYs�x!�t>iw?tPR+��<�r����z,/�
iߞ�����~d�I!��F�E{zZr�(��
��c����^�����P2�@X�أ���<�k�ާ_i�����U2d�Q9�{l�t��)@�s
��x�E
lnW/%�4+W�\�/��孮o6,q���)�>C{.K�@��z�>�6l�v�X��_�ìf���y�*hTj��"a��
���f2���V�t�c�oaz
��g�th���
|ٰ��Vv��›0f������U��?���шQrn/#�E;
�$���mR5t�Tن\o1
�Hs͗LM��o��j4��ťz��$��f8��Y�:��f}�φ?~d�;���nq��p���%Q�h�U�ȢH�B)����(����9��7�PfO��b�,�8�PI3�_�PIBφA�e{U3���5^� _ۥ��[n%�C�@�<)��)Ec�g�Rן1/\?x���7�R�_~��Nf)�DO�S��ή�F�޳�5�Z5r����3��[��Z�d�]8���Te��.T�ZV�^�����&v��"��IP����9�����-��p~���C'�tp�*�O�X��k(����������}��_��{����N�9H�5�$K�4�5!�\�u(m%���3
�s�E�䗧e&@�hhd��~��=�\�i�2���fg?UȬ[z�\�N���M��ċͧ�Fn�m�g��y�M�ئ:Fz�BW�uAg(��jAz]W��{P��@��g}�韟��-���v+�[�w!c��@Я;g
q$�Vb�B�0A'�@��n�kf��%�_r:����#9����^1��

�v~&/����MI)
f�tIC�J>-��X�MY��,JC�Uݘl��������QX��XWf�PiG����/�gpWUT,-� r�W�^ ���p0F޿�ӳ�\A��Sr��Y��Ȕ�����[T5�h$*����f�����U8��?�D1�H �WTz�����o�p��2���eB�2�a(s�E*ѿx�i�|�U+q�>9¯W���G�н�Z��#��~��贰�i��K�sxz��y�9�`�~پ�SH�i�B��Q (��,G(_:x3�"��{�]x����a��{�>�Q�%{�$��\xD����5���n���Ґv��h㟁{��n�Y���+R����K��Z����Z�L���u���o#�5m�wk;l��~ϱ�
�>�h�|�Fe�~�6y�YA������^��R9`��H��!�p�r��"W��'9KM�E.[۪��`�Ց.(f!�{��pvDmg�&t��0nρ*�C�o%o��DETX�ў�b�/�ͧ>���p���"a��⤊�u��,�� $\����a�	AP3�$�Ԝ��J8���@�k
��ϜDB�
�������8isi��@%�`�!�JZ�RI���_ԸgPK%ݧo9ic�����%���d�t	�1�b]���8���>|NՒd��k��V����.Iy�
��X��j��֌�}[j��Da*7��;'t~��t\
ɔR7J3�Ç�*N4�
�2�i�>�+b�NnFn�j�L�M;�_v�.���)35>)�[� ��ă�tK�,p�{a�k�c�����P!�/���t%�����V9�	^�R�hiKB�XN=+���yyt0z�l�"��T�k ����w}������K�F�p�+�teH�s!���)1�H�*S.��V$�,S�I�����A\�'���I�g�6�V���P+IR�7�����
�/`�+�hP�k^�R����_��R��l�XV����W�h�ߨ���T��h }r�R
���
�զ��{nM�/N����8��M�N�BC�{�B�9A�z"�)��������p2��
��( {�K���>|�
��=o����/e#n0=H;�4�z��S6�'@-ON�q�,uB��)�cw�`�f:�0�¿����Q6p>��ї��W��+ϫ���1��g���jfN��6k��5>��φ�A&�~zM؛��ju�l]�-}�P>��	7gf�P�i�+���כ���߅����t�^����Ak�I����J~j��HY�ű4�5ĩ�:�w�0�	'nD��{좇���_�w{��PMa���v����[wT�`�ā�K�߇�o"x�ċ�4�|0~��� V�DR�X���:3*�s�I��<�S9�-�z���:ܲ��Jg���鵵�R�q�#a,�m�����Q������
M(\��#k�Y�:�-�pY"1q�A�C���[�J��O�T��dۑ�0��ջHܰ��0s8��sڜ�����?�`8�Ф�;�F�4�B�%��o�ҊS�Bh����Қ;���LWz��|gt�"��ߜcy�2M�U.�ڣ�:Fr<W�xD�O8�TM��Bv�PN�.�!�����K	���3v����T,c�B�k��3��h�y�s���K@�p3Xk�]�d6�}�����t����,��]���x����g��%s,L�j�>��S���x�c��ir�Q0s�]�/d��+�=��e���`8���T�Dj�i5�OB
Jk}H{��#G���2��e���bB�˱���$d�#���^�3I��	���dӀg� @n����TP��vj�~~
�n�>�X�&�
�?tr�X��)�!�
���1�1�"���!�ɍ���pG��N�$Ϲ%PR]�K���_��@��9r�I���]��~Ac>���m��B<�&Z]-+�A:�����oe����?(mr	�㟉"�WR�S�V��_Vfjq}���z�n���0(��߲�)�D|�s�B����ݠ�_~��`U�`4s��n����n���D?0s;~�~����S��w%��
�P~�b�@3�j���2
a�H�j�GdEME�OՌ��CDD���ԠȬ&ŇKtk��+f�򄽘�ѝ���H�����29g��亿�·�;-[>J�7���R�������tnY�@lR!�3�B��8���G�+��u��7tG�,(îa��.�^�Ν��Q�gt���tU�2�t�h�,�_��Na;�&���!S����(��X�)7KKpšaKy,B���Z��8�na��
'���9��Ӌ���^i*�,R���\'S�ڻ�ճ��1�N���K���Sq˖�ɂ�$!-����̡j����~��[�M(����A�e���]���/�41�j���%����a#$?�Y:z��yv:?��z1tc�r����|m�)+�52t�֬���(��NI�̸Ɉ��e����|Q	��Q@S|�#�/�K0�Ɛ�(�V�B>��ؑ�����@�/悉?h�(�#���&}�a�aq���~>�8�S�/ٛo��m�+�r�_F)b؋i)�v
_����Y�\o�ۜ�����B.�nd���0V�[ǡ/8�	����t&�9�&x���y���?��l�/������ij�������x8���+(��"���w;��Kx�c���p�{�\r?��n����1Ǡp~�\۔}1�P�8�!Ò$�#���d�[�(��k�7����\5p��X�j�8�O(4ARy*���t��I�V:�X$V7����&=�߂#�u�x ZF_��yO��N�H��K����y�M��pk��!�CE�y>�i�G2LT����cwv�\y����>�`�_�^Ϟ�[����)��Nψ��b�VV,�Y��mSIުPh]�n��[9;�4��4I-h2"<�'����49����!/�h���=:�NK!�����Ip&
U_��_�G��ϊ�?	�8�����?9�/0������������������?�	8M2�
X+E���nXͮ�,C���6=(�55�i)ſ����#�sr~��t���ZFy%�CR��} ��X6��R�&R'�?�"���8����O�3�ה�.�?�u�t	���~pk/o�ܫ�Ri���-NQ[�i��������Y1��	 ��]!��4�Fn�oԷ��_���������vÿt=���ؗ~s�]�fm�ռڶ�pMo��a�SfmK��If��e�zȞ���f�kUj;~�R�[�����e�e�.���l�����;vY߅]P��&	���m�ַwk�$�g�?'��]�����I�t�eq8FE��E̓��u֟O��`������]R��I���)���!ÚF�8xN�ȝ\U���`=�3m2u=�z�DU��
�V?��Ʈf6	G�r�Ǔ�w��%&�֝�� ���gw�~���0
�?�=�;%1)Waғp0�c��{�n&U��N�t���h�z�P�ۆ������8����(d?���?v�-�Y{���xyf%�,ܜ�;0ԂRo8�"g:nt��{���5��4���m,�H��"�n+�(6�s�x:�Ȥp`�P�:l�+��2�w�l6�}�^�-<��i(��A�N��ѱ��s�٪��}���\àI��#~5pBŠ��m�O6�����v���|
2S�I�&(��0w��,hl��,��^�l�,�d�.�Ӓ����o��m��%�ҖQf��G\V4.U��������le"���]��j����F=o�8���M��ntU��]E���H�v|#�?��IM��g�����I��X����:�
Y�ϯ�d��y�a?v�Mۑ�'�����9}Y�84d��̚�#o]��=5�Ϋʨ�*�9��L��+*�+~����7�6�=��ZW*�)i=�A=��%�Y@niq�cK�"
Я�9�=#?�k΂q��N���X?��VQ�a4��uP�Rd-\rK��PB�qt�uaD�6VP�Y��3��p�>�8v�ȹ6�B�pKn��2ro���[� �k�P�4�<38:�Ρ7�H'ie� �.T�b���V��ժo�`�_1H�
�kA�-�1��qaL���TK	�ߤ�o��j�v�aQ����	U7�J�Ha��9�8~�9c�� �k�=��Ԧj�<\��_w~/�X
[�zcH�01ξF8I\��g:�N��ő����C���`K.�D�\Vp��U������I/���h�M�[�k%�/���s`�b�Z�5�V�����L��/i��b$
�Ɍ��1�����J��#�I�R=:�%�!Z��0�(��ꐮ�
l�^�LRB��j�ٻF�^�ѭ��4��W$P�E$p�=]ĩP��(-ڕ��ʁ_E��+��XvP4RnQ�J���R��ceĵ���@��meJ�1½��8@䉺���oM�T�#W9-"џ��]����t���6��CU���68$�u��;��'C�$�D���?�v�֒NOѳ�;���,Ȼ�7�Nҙ)��9+}���C�i��*L��Ad�˔����*�ʕ��`b�5�}��T�zq�����U��	�aI�	hc�`:�X�����ճT��o}N�i�O#��M
�[r��S5�Ԭ1�> �����0H��,�'v�O��8�9N����z�rH%\�9�dS ��U�6t�Y����XL\
�����N�K�*�i�R�R��¦&�N��(KW�H!+4^E�����0�SW4��y�i��Q��.�������~�d.$��,��rr���Q7��6l�/]��+��e�p'݈[���U?ă��ÖM� "9�':���N���@d�����R�(�G���k�f�C�e��D�j4�`K���9,��X�D�/b֥��l)w��6033� �i� Mڊ˟$���_+�úlY۞_��nݫ��ġ�_@!
	Z���?;ډ
�Ps�h�
�~�mϸS�i��#�Q0��]����'Y<}ɟ�Nk	�PIU�A�K ��Z�a�HrH�/N���l���9�?�Rf۸i*zvu=�`�.b
I�$�]P7�F�R�"����Y�����J��ۓi���OEJ�;�0T�-�u�VMMi�%����3y�?*��L��'m0榦d��u�è�>Ȱ�Ic9��U�
.�8�$/X�0�H�e�$ V&3�z–9\�Lm����!�F�� D��;Р"d��]�a懓�g$5��[�B���SSC���T>c,č�yyFY��+1�Z$�A�8n��`�@�T��nU��f���j�����?�Pq#�}?�g��g����-˴�����hJ�TU`|�X����x����.3L�
��A5��z�s��ן{G/{�W}�˞����o�����
���K�¬3��% <�q���AD���;�?o�z������Q�u��k}v��#Þ�o-��b��)5��G�5���_;��|��Oe���'2P>?��3��*� �x�����_�����l�����+��U�hx�2�M�a7��e�֛��߯R�����?��FV>\
x�6����}�<���z}�����iSx����I����n�J�����"R�0�Z $Z���w�;��\���� +;�+`��H���Ȗq��^�b9tC��.K\(��9:�R�����1z?���Ln
�(/IE*dS�_F6Z]��!�����8D]���]�_(J<;�N.�P6qa��4,!�6�U	��4xx�=��{%:r����(��w
�;�J�A_�.�=S�Ew���~�O�.��d�p"}��%GVd�!�̜+o/����+ϡ�b:LI��B�Z�x�ho)��:G:�r��I�:�A:d�VO�P�
�f�"������k@#�!�_n2v4�*fWn4@�~i���\
o��y�̢y��)=�fM$���<b �(p�;��}q�f�i߉�R)^�02p��R-�F�NX^^��]O���v��A�)[f=g+{�6Y�,�z=� QV(�8��La��4so�ne����c^=@qR��j��V����-a���@�j�Rzۈ�
h�ӆ�8��`�f�U�vӞ�O�,��c�����l͗�K���R|~�P�>�kМv�u�d8J�p���H\e��Cn��i2��g^���ޛ6�q#	�U��2qH�0o�R�,Ѷ&���$�$/�lI�6)[�x��:p6��l'3�k��$��P(
�:l~��.��Y4[�:ȍ��
E�W�eJ���;�$ʭ��Cl^��6�x �B��P|4�Gׄ*x�0ml��X��4�]Mf#�2_z~`Ӵ)Ip���8��-@\��o���7F���E��ˌ[.�"z������tCTyO���<���DJ\�ɸgxR�U�^=GP����,�+|!i�j��.#+%K�X�he�QЂ���ZWxR:^�PxJ$p�jE�Ze�e
.|FP�@��⎰��JQ-�ͤT�2K�*h��h�:����_�O.���n��4��[o�G<�[p�"�3����2���+�ht�.��T����讂�_�Vm�sH��i[_�xR�Ev#���<:��^�4��Ff�6��[z7���H
��0�
���'K�d(Y�Vj5�`x�vZcgw��l�n~ӹ���\ܶDŽZR�SCH:�=��_�>�s|����AೳvP"��NOo���$�:��9��.	����!l>&�1�:	:��+e�[É���\�.�%�iw�E�\a�2��R=�L��oK��Vx���)�����e��]C.�N9�$Hg>�6���rq�o�@��#�f6�''�b��|Sۅ]��S�!!nLr�!J��'�<^y8@�	�
Q����,��3����=���Q�܊�(��l�]��]�V^l���2�`���<�
�D���r��_eh��o��p����F��u����fH���R�{�_ƛ���!T:�����R&�z	b0�5585�1Ο�l-6.����u��Nm�Ϙ�9��j�ڵ�ۜ�+�#�fA�*��֩���~�k���xU}Sh���P�z�Ħ��r!\9l0�,-18�r�%�e^k|95>#�t��
i�ٽJ��ݎ���hs�� �p�,C�#�H���N��gD��o��F];�MY�I\۵V`<��.A���/^t��\����?	Й��X�����>9���Ah����M�/����x�|l����ɍ�.�kd���y����it{�sP�"��U\����[������sp�=EO唝
���)�)O�0h>�-fQL����$��2�\�あ�6�H�����
�l�8�gĄ�<����L�L�������Pu��f�n�7����$dS��A�6�ws�A���]�,�"�Q�ی5+�yB��7G��;�zЃM�v�y�H(l���3�?^�ʹ�~�L�$i�
��eU��%kHb��1|(y\U�G�~@�,���w�
����ц���d+�ëw�Iij��f�:�>�ԓ�9�5�K/5TT���dk�6���I�g�
G���u6@�~Ot�Z�b���9��
Z�����K��|a��#�7�ʻ��%}��ww��\�hvJj��,g����억'���,��.L)�,��Ln���=�X�5Q�=JPG�\o$���l�蠐<�$�G�"n��pfb�
J����"k�
�Ug�:\�6j��x�QѰ��I��¨x��Tg�YA���2}���n����
�b��h��2�nH�&)q+]��t�n%��rj2S����t�"���W��uln˥
�@mU�U3'���0�-H"�s����l{*��|���w���cx���Ϧ|��+��"�O��>���Ѓ�]S��x��܆��GTĔ8Jyyz���m�v�gǧ�v;��.A��*A�"g���^YE�]d��l���>pzr�$7�z��"/��_8��^__;��vΡn���'iN�i™F	�-@���m<�K����)��=v|��˧����A��O���طg��^���������g/��N�N_9��v���Cs�(�R��#�6��!�y�rd1���xlv�r	6��\��UL*a�<�*���/ /-5LI�+u��"�ޡ¦o]dj�So���+�Ư�+h5�Ub+s���G	}�J.��䭷-=�\R�V��)g�PR�-+�N�_|��"����6����j�W֒���>q�.y�
2�)�b�gV��2�\��A}Tf����M��8�[����d�¤����kc)4΢ް;��}y&�V�g9��V�`��,2ha�a��5)bz��=� ����$�\~1~�`OC;3r�Ȣ輱��L)`Y4���t�T��U�#��E��"3���gG'��G���Z}	l�<�]0������3��`S�r����U���9��(�S��A�Y�%����TNO�sUQ�)Ӑ|�+c	�W)#.�^bjNZw0 ]ĺH����e&�j�&�cc����Af*�T<�=��
�P�w9�n�^(g�'o�"����#� K�8WR�^�R0k��)(O�.��Q�A9����W*x���$��&�X���h���HN婏�b�emR�$���F	P�B.���h62�_��1�W��(yQL����|�k�Kg�3��|�1c�Y.����AZSN��3�`6�����塺`�%t�-{�~�I�'��j�S���<a�a�ad�o��[�tI�jX�+
5F����cyo��[g�Q���hzq�%�E;.���fD���.8$�li��mX�fV�*1�F��=���l1˳^=;�ٖK�v{��~���w��^OT��b�X�ӊ�\\��Н��hڹ\\��+�3��c�a�RX��
�V�[׽�m9�^�}A� I�o�~�q�C�R	�봼�
��e��זrv���ń���z�5#�}�a��~�.�G���O՜?)��Q���	2�h&�53T���>P�b�ug�i!J��*�4�9�ܮ(�ylD�����嫋7N+�(�Bùu�ج����c�9�؊A�U�dR6����ێ,$
D_�� �p����)����olJ�L���"o3����|��b$�]�5���Cw�I0�#e��D��*S��&�)���PFɸ��zL���ZU���d�O�F*զ��d�d"��a4��9EY͐M�<�ob c2̮�.�.H�E�a� ���mE�A��8/���yzO��m��g=�/4ú4��Ѐ�5�q_l-FS�$����k]]~�hO��F����n/"�zEO��be6OqG����R�������t{7	6!�HG=��Ey_`k������o��g<��ya6Y\G����\iV}��J���'���pp�x�vtU�]�[g�Pj�%Qj��W*A�K�V�\��WD��S�����F�)��j��Qf��|���e�Bfش��Z���z�+�1��%>�bC�o�9��P�u2���|���,�S�L
��/�tϧ�13I�!.�wv�Ғ�
����{�l�^dT/��w�dM�b|7�c&{�ȿ`�ԛ`��.:�tcY��&��
�a�F�x1�He���d�K�'�EK*��I���o�g�7�(��hܷ!I�6$�]�Y���p�h$���g �߿z��[��zo?��V�r͏�Qn�k_����Y0�H���>�h ��v?�]�۽Z�ҼJ���X�
���r�A��!~�,��E�)�6����� 4��ʓU�.?6i6w�"[����y>��r�z�X#���� ���������H�^�_�z��N�Uy;��I8�O�Y�"���Acւ�>E_+�|�36\�
YG	�1�q*"�������.�����/���o)�o<�,m�jl6�����Z�?꟥�������G��`vY�+^ʻ�� W�F�W.���g�9�?��l?�f{v���s%��oG�b���UW
�4���;��6�2?�>!�=U�p2�ox�,�FHMF������d<�/6і�K
��ȷ��G�?�4�>/&o�\�X�7�a�˞�;�CP�bo2�u�bT�%��{J�g�5��{�(��S�}�,3�tb�V�-@�d6�?\��x�y���&�d��o6�5?�k�Y����S�\����r��]jm_nW��^�tUi�<9���lO?`
71ZO��!T:��lֻ��N��ՠ�j�|G�k;��i�	�u?��c
f�W=m��c�*]r�Ǥ�6�CY���s�*���̻��@0�@$�k�j�k�r�v@Fr&�*'?�O۷���)���� y��AU��e��/QF8e肖���H%Y�����xv�S���r�d����WV�2��j��J���T��iz��2Yۤ�����d���Z��t�y���E�b�yFcC9�7��So��>��Ym�/6d3�9�nu �|��En�9��[4�j��fp
n[�Z@�aJ�$�}rj���B��DnR��P_ʣU(�f�зWgG?�_���>�#�(�mȃ1���fq�.���8��]��t�JI��ղ��ɔ��tg׽����fյ��C�/����\�neau���F�Ɖd��;�K
5�`B!$6���D�0x��Ʊ���TȵN)c�.|^�=�4;��
�ưM|��ݰ�
.)Nji&z�
O��f$����
�.���^0�2����}��d�����bl�!*��s�F�^�8����;̘�Z�c����]��!n�[<DI�r��F����t^���0�q�e�,H��́�Fa#���|�⋻WQ�F�G=Q>Q+f�y��
��Vr�
��ʸ�N�ټ8Cw
X��“a4���/+!m�x�vy�Y�!8�?��{�?I
�pp~�)�+R��T�����'s�A�1AB�>].0+5�)�ȒY�.<�o�n�CtY�ʖ��z2�Ha+��\N�“�o�r�����S�}�cƣ;�5v���6E���J�B��
�����/Սdq���U\��Ψpʺ�����`��(9{��f�)d�p�g�
��4N%(��-H)Yn�Y��� �O��7ӝ��&�w:�Y�i��',�Yw@nf�8�z��%k.�x��[i��B�<�,f=�|���{gKd7��U��CW~V~���0��F9Wi���6�Š�Q�[����[�����+C5k���S�f�_c��:�F1읫��^&��+�(I_����g�?pU�7�N�u��U�*�Z����p�$��Jw�}F!"�[�'N�ᶲ#����R��34S|G�
�K�F��u �-
�_n5l�ħ�����(c	]g�g\�>T��퓋΋���3�%N��Uv1�?�<�_6�#�n<G���xcB�5hm�O�����uϻRJE1sl�,g%�.bZ�KӋx)Q�1"M*ﺳq�mn7��{����:��ݯ㝯�"�
�qȭ&�l5�z�h�"� �R�F�\=m�Ć�o�.��d_1M_����k���mwF��"w[��O��a`<ں��A�'ϣawt�������P�A]�/���aH~V?S	�s0������s�e {�X^���,]�}s�>>L,:�<魼
k.E�U�';Jn�
P�D7�jI,�_�k��);�9 �U2���c���\���J^Jp�.:�P�xQ��!���!����}?�9��|�9k_��Q8zx��%�T�li�xR���6gI�KF�y�2O�dg�z?��2�<��xɸ�磇�'T`a��K$[���X�e��iީ���aizLP����r�^F͂�l�
-�|��l�Ȫh���b�����?Zh�J���j��<h���k5=hI�7ڞO���&�,o@RT��`>�3�R��CT��M(�?l�J�j%5*�����`���3'D����o����f�~f��t���m�{�u�Qw��q��BI�Q/��i���"��M�R#+֡<lfMP�d�����R�*3��Z
O�Z��SNikP=i3�fG�xI�&?���p1�G�	k�]��ꐇ�)���܎.
F�
��㣃?ZD%]Bf���`Oݩ�&�Hc�U�$�n?s�y�n֝f-!@��:�L�F��Vj~�n���Т��}�.�"PB,"��hՈ@Z���3�OZ�3�o�w#\k��ҙ�f�Δ͊u��E�Xf�9UU��d�ǻb:��Bk�
xU�hW��A��Uԅ��y)�c�
�dB��w��D%���6��}���T?�1��-�l�7��;4/���c���E��	��j�%T��˶O��3[�}��f�����r��?�
J�%?��
�>dMe���s,��ax�B��P:x}�^���c�����h
��:o�|z��\�e���z\0�/5��*5HF�0�Z�-I&?Y�~7W+X#R���`cBŤ!晥�4i+zX`W�4Ӂ�\�;�'�}9%����po2)W�[I~�S	��е{~���Ry��g�'T�F<�����E�]���+�5F�w�����n��Ŝ���uF̟��� X��n�k�~���nu!�
W+K�����mw�{������5�0����C�d�����
24D���{k���xP����|��+���V����e��b�_N�g�JJ�P����h?��k3k�u�j��1$ʹe �R����~!1h4���}�Z�-�(ev�E���K�|�������`�>���*zC `pa����"��H,V���~䬾d�A�"�W�8x��)�:B�Mb���`���R\^�8:��s�]�N{ٹY�����N'K����*�c�U�A2�cZ�W��Z�����0\�)�@ZT�puY-�}InT8R���k����e* ������}�AS� ���
�U�A>�^Q��棩Qq��c�+����B��
�cP�D~$;�AաO��.�u���Pa�o��t�*��M�!w��X3��"@"�Ek͐�g$����3�iت,������͜����"�r�RE���E�Uٶ�$�Yg�O&uP��jk�#�j�	b#Ql����0w��خ�NH�Ҷ��n���K��v{��h���8��Z�m>J(٬�1��ߌ�qD"�R����|�D�Q���#ɽ�N��l��T�Il�x��Ot�Q�=�'�"L`L,y�qȎv��-A��ª=D�x��.~1�y(�F�1w�;'4"��1H�g��G�p:�������s~�^~��x=�:/�m��ζFM��1�˜E�R^�q!1��L��p0m�ސ�:��4�ڮ׀;e��`57��R�H�a�)�S�J���%^&�.44�^��j��o(�?mf6Μ�S�q�8�3��9��¬ԝ�O�WG�'�cI)�ct
sO`���:y8�[!FXU-��Ԑ3ȶz)���T0��X�xxz���w��<Gk&��.�(�Of��tJ������YW�����B���;��\��t�	Tӗ�
���� f�sm�B=�>hRe	���<�S�I�^i`��R�\򙹇� ����p����Cg�/יMy�͢`��j��s��o�Dd����sBz9��I���$��p��V#��X�{T��Y���d1&ޥ}nq�-��ڕ�v������%c��]�F3��◰H�KhW��K��'���(��ﺃy�j�@?ڗ�����"���RV�4Z<�z5_�[�X�ॖ5���H�:�G0�?G�Z�Z��p
?�4�c�gBIoa�L@PL�iɍ�ON/0�
F���r����%�E��e��.��׏
e;4��y��C<EDyHp���h�5��n�/ʠ�uŻɬ/.�^w����g/�/^�g��;ݞpl��u�s,a�_�qJ�'s�RB�C�9�3sjӖ5
<re�]Y[�<�9U�y7q�q�ϓ�=�~��?�]���vR�ї����|	��ONO ��NS��>T7������F�"�)�&).Y}������ʣI���8�	$��Ӵ�0ݽ�ti�/γ`��f���Q�N�R.�h�Q>���1-�^tg�C�Zy����K���'��O�\�DF���-����=sr�L'twG�Ӏlѓ�ZZe-����/Q�:��q/�D����\Yr��YQ$py�a�a�oƋ��{9���c#�w�w�7��ń�D|'���"��Q�h�%�LV��sH�eGg_���;i��MNu�j6q��V����!2��Z�NO��b"���
$F�o�C`�yJ&� �$�ۍN�&����{+Ĉ�gR��{�dX�ōܘ%K�lZ�pě�Bl��|��k_�5�4�y��_��I�@5x#9-�[C�Q{�u���F/H�V���cMqR�
3�+�L-�K"u��A�2n��R�5�vzP$sU�X��_48�Ņ'�WO*(�*>�ˋ���Q=���Ć,
�i%Yʬ��5����j�|����=p�b��BZ
@�"]��ټws�'Bwf�j�e�B��,��|5�A��w���L�2��
E�u��_������wx��v;���}�69s�f�>�x�iZ�1ҏ�#�O�������\i��=/F�A@U�i$�'F�fN��������'��O�Ym��pn�h�l�v�WtR�t���J�|��)�����+jм�s�0�Eً
;Dž��$7x77�k��H����[1��#*^a����PvK>Uԧcv4&:[/��U�-;��t��ӑ�j����hr;_���믣x�������C?����,w�ewv��l��� ��@������h茍6�5F��l���_3:���
e������)��@�Z̢�P��:D��Q^��V�T�w�X7�Ċ�s�t��~+��S�n3��$*�E�&p�����X��Ӯ�*�X
�stE��
ڜ�)���A�u��]�Ơ���,�	�@X�~�� ��n����ALk����P;k.����M�����u��"3=X<�]��4]�ʼ�Y��z���+�|��/MV[wf0�����!�\�3ڎ�^@(�sέ��B�8�Ϸ��;�Z1��J�V���d|�Ɛo�
,m��pn�,h�V"m	[VHں�t$���C�`R���@�s�@kcJqȤ���s��P� Ea��+�w�l��J�����"�p��*5�&T�m��'Z�@T�}r�yv�����(�����j7�i�������n�j�^�*k�g��S���*r�_��#8�%-a��� �*t��򆡂���]7a��Q��`(�i'n>��4����;t�c��C��ڃm4�|_)ޏ��˧���*���SG��:���k���
1p�g:yb:�w��\�p(��gY8����J{2*~�#����+h��X��ߗU�<n�)��X�T�Qy�f2ϳg��[pp�r���^�4k���� 4�V�B_���9q\��!ԫ�gcj�J�0OFv24%�lZ�)�~t>�x���u��}�@�>���*��)���S��j�Ub��Z�Q��
�Z��A��f�RJt�O_�Q��:T@�
�ݸ/�4�N(1�Zi9Lfj]�6WY;_D�^
\�ᜏ����E���"������6ZL���hmoáSPm'H�uC��H����J�W,����v��HÂ
��k0%��O2��q�Ê;�7�2o�r�+>M	��I�!q�Q�����<?;��sxt�>���V�<(���/�s\%�(��$g��Ĕ�	��Ttv�ɲΘ��-�\��C6�+
:���m�6�xV|�5�_���;�3��1?�~��G�e�󱸂�`�}�}��U�,�^�2��2+��9^�I>�
�" �v�?�QV�,��R��t~܇+zH�%��}O�8�VFn�Y�������ѻ��x^	؞�/��'zf~hCfʟ$���e�j����Z`L�����A�nj�h ���F��%����i����ӥ�������}!Q�n.^�Z_�eT�x��xցpS�	����v��VY��TAJX[	�����iU��R�sf	1Y��(d���o��]�bɜU�K��$�`2T+�Ҭ���cB�Z�V<�v99u^��/�T�\<�y��X��\}���r�\cu��6�x�0y��k��֤|���÷��>���b�L3Xn���Vi��hxm�b��:q��\R�`��s��e�.�,)l�tI)��8|��ϯ�M���x�Ww̫�'�G�t�̨a��7q�V=�6�H��e	'��s��r��!�)�������yy!�Bf-i��
	p/ϭ�QӍ=��)�Y�j�:i`�t��f@倨�jkyf�A�\��_.;�٬{�1����c���c�j:!�ut����� a��.Ҏ0��y�e�$�cI��HA�\G]�۶O�z}��1
�$C�+r<�.=ݗN�䪓��Z�W7�Q2�Wv$���٦CRF�d)T���;�v.�"�.�2ު��
�伳P2��T�'�	'����dп������f�X���^5�=��0Y�3Di�B�jgx�ߌ&R(�̾�1P�c�#��}v�'6��J��	�	��@�yR���/G���Pz#��ʕj�/��lr}B���W�A�b�f"��f�v3���W�I6	��)ҥ}+�c0x�����A'���}Q�ٛ��v�Q,F�~�T��E	s��b����>ȿ�ws���m���,۫�&���-(?dW\���=��N��~��q���®*ܮ���M>�>:��1ǺW_���^�����r�+1�"T&�ꟴ�ias�`+�&�śM���OMP�M�#���D����	E�����府�J�mi N �}q~�Bg�$(
� Yj��!;�]m�b�V�l<�Q�,��@�F�XTY�F2v�ϔV��NV�rJn���a_���@C�w��Y��ԁ_���R��nP�u�C��k��g������?�ۣ����sK$4PMw}�v)�m�S�~��Y��]�gmy~�rH?eCG'�N�ĿՃ	5Z��%Y$M�wp��Ȕu��]m6��(������GV�c/���^w�v������7~L�E�p���nT�4f�G�\`M������g�;p�y
��ܫҝ]S>��ў�Yx��&��V����lm(Yc� �f��:,G��0�\b�j$J�X�Z�(VQ|m�Y�x����v�����R��O_?;?��_ɘ�	�'<;:��Қ�a0�^�,��!d�<eJ,��c�Ǥ�7�)�ɶ�,s=B"d���ܻ�����,zj���1[�ޮ��
�ި�=��)�
�O��Hϑ3�B��iC���B���Xn�V��Ozn�����8���r���l��Z�S.�?�A0�[��Ssփ`n�5�QOz���i�\ۏ7��������gִ�iݖ��Y�=�u��@�)�2��̩�z�N
�``��Y�
��"n/����.�����+4�-�<����F���K��d!�BO:�8.v:r�,yy�>Ϧ#�ez�����uo��e<]
}{I�֒w��j�R�_��eu
���\_�r�^8n�ޒwW�J���9��Ǔuu	�ed�A��2���f5��ʕ�h5�e��A��Y"6���%}譮�_օ�կ�T��(h׽�Z�נ���������ץ��)ݵ��s��ã�`Ώ����
0��s~�ʳ�:s��3Gku�pEg���l9�z�]��-�x����֣���u�u��������lu��G]g�ˡ��R.-�R.���Lu=0�`�k�Y�b�[x���
E㩚�����s�����X�ȃ��E{)�lknB�
�!X���	U5�_3���G|Z�j=YR�
�e{p���%eϩ"w�nI��_���z���c�Pk�r��]�5{�̷��Y�t
��(��"���:;�9���`����+�Qٖ�QKq�q�C�m�m�(�cd�e��A�A�"i���p���W��:�����1P��s�f�(\�U��($i
���� ����M��1����ƌ�
\��y�MISkPxeq
��;�J�F����KǬp��'����'���ٝ�P�CM1�?��k((O|٠J�:õ��M�x3i�-��C��"ٔy =f)�<_l�\�VWv^V��]��L��hp�[Qqt}{�%U���/k*��Σkp'P����E�KV�"M^^��T��bu���Ye����Pw��idu���oSTe�$�:N]b�G�.��uv�\��-Q@�ɰO1�s��+Z|V�rv��@��>ꍔ�0�fq/�g��PǒsaH��6�
���gB��(4��e��B^�Eztyr�c�~����߀.�6dL٬U½�᫙�pN�>�37Kɂ��^ZMH���y"����AT��Aׂ4��|��u_������ޖ�UbcL΀�9��
��ϊH��}I��V�(�rU�\��*�CY�܇Z�tP�!�z>;�(�����1G
���/�(��6��T�M�߇�5��1z՟�+'�*�A�U��(�c�S7���%�#�'FR\��zj����q�T+@��&oC/��Tfwm��eu�k�nJ�/�7���J�X�<�v�r��1>.���ǣ��lP��FI�55���g�Z�՚�Q����F�Y-���f�����f��nee���d��ܪ����9V1r�\GǓkqi�+K�F#����bT�ի��kcJ�a���<+^�[>��ų�RT��\�)�w�-Q)�ZB<Eҳ�ܕ���~��(p2�~b�V̷-��hz;bAdq
���ϝNw|�j�.��:�t���K�x#!\J9V��K~��K)aW�h�^ݩW��۫�� ��%.%��h/����}��Ln����tC`h�X��y,�Q<�L��3�e��hw���.Q(X��i�R�r`�I�T��Gqo6��hs��7�t���x {Z��L��QQJS��1�ü0���R<���_\���;����YW��v�׫x�w#�!�`"8����8��3�LF XQ^���[)j�c��􋮉H��*Fo%9����e��/�QM���.S�����Z5LoK�2�,�B���������ŋ���g=$s28�^�Eq4���|h~��yϝ�I�śz!�;�/���b�-�6�G�AG-�_�&o���V�r.XT�@_��;�/���K�<�K��	dz�����̲��av�O=h1����d�5���F�X�v���j�'�����(SdK�Q��t��}����.���%��|��D�XzŻ��"	��褝y}��<}}t|qt�A/����Y��\��j� 綇�НL<���DH4�+��􊞊�WGp6��>&~�q%mR�ZJGB�A����!5�Ϳ����r�а��l]ֵ����ŋ�;y
- c�
� �a�<�{�����lЏt*4���Q�o���}.�6"4h�����:�/:1S`N��f���* c���d�.�IBX-�ޗv�)A"$k��W�da|���n'�8�>��ק�Ì7
;o�E`X�'�ו|��M���/�R�n�*����R�R)y�\������J�%r�!��@�f8śO�=h�
�f�o�EPN�k�U4ȫ�%���X��"b)���%�nON�N��>��Li��t��Ѹ3����Tl
v�zT�����u�*��PTO�Y/��K<�=��`L)*y�R�T��>(�����,��x����`P0P�nu�����9T1JwdžK%c�	����� ���볃v&��Hl���J
`�4�S��+k��&�؃���-�����J���h�0 �֢��K-�]&���2�u�� w��+�f̐?0����;����f�bɰKTg|���*�tq`<m�Y���~Z�����w8�iuG�c)c
f%�X����kޥ���S���N��&�.D���)�4/��)d��OM�C�B^ɗ���-�bݢ�l��qsfp	�P�#a�0��8�:��*�ו{xGqv'��ʞ�d%sݤ.���3I�e�Gl&w�ne�}8�l4^���5E~�*",:�Šп����r2�(�4!�F9��P���RD֒_2�z�¯�	oO`���	:L�)�>�a̚PY.pd�u�I�@�뚍&(h�jڛ��V��)Ip[��XD�,p�29�>���Q�&^0�vːs��
�R�<�o|ya�ɸ��YU���~u��DHXT����3��X1�vR�Cv	sp��v�5J��j`��V��)3�G�Lo�r�rr�>�R���<CU0�@��#HH`��s�W��f�����R���ٯ ��ʿ�:)�0O��F�|��<Й��#z���H�L)�˥z=_iXl�@ǿB4da%�TA�*Y�WGoV�ܛ�����X���L���	{��~�zS�����\qS�ޘF��D�}����N��k�
i75�&@޿�V��e��r���<�Ha�;|׽�;T���6����a��n�צ#:D�Ğg�2@.l:���J�E�Z�INoڮ�n��y��]}��%+Q8-�p��0{��։9��˴�1MR��
�w�Ԡ��z	�T�%A6*�"��H0�
�P'��+��9' ����[��z�|˪*�fޛ��а�'���ҹ�Mx��Fa��,�iSWw@x��ظD�~�dUt?��U�V1��<�m���jh	��u�4��Ǐ7����r���/�Z�����l�@�*�쿔��^	������t��h9i�>
�^s�^�t�	R%D��hS��!S�A��G�I1�r�̖u�'��n=)�B�>w�3����Fy�~��C��r��@�|��E*�}ɴ�yT�;�
�n�ڱ�ҁWV��5w�"qm��v
�}֣n�#��zm���IGV��n!�LX�͋��u�<��y�UQ�?@8!Ǥa��'�.-��ȶ���J���@Vp��d�����Y�i�0�+���Y�71�(�<>�^KYE�Y���"=�;����k�G�:�M0=z�i���󊰫R{C�9	��zK^0��(�|9͸Q����Ԥ���ĩ�X
~�����vD��Yq=��\��]�P6�G�4�W�*���VW' �&�ua@@��Pf{$�9|<G� �04�E)�V�C�q`��R�cw����vto������)23ht,��Kx���d,gJ쳝�P�bNF���,��򫕹bL.��Sحg�d��R��9�U��'�Iu��?�j穡��`�Q�
r�1�\���v.C�)�f�[� ɷ�Ԃ�"D�!}�DWk���t�	��A'���T�F�6Բ����C��UGJUgZQ����ZSn7�u&B��3�?T�#�L��w�",�G�}�g�Ga���s˜@Y:兗��N}�Ѕ>�kI�P�ؗg�!�-b	3Mk�+��%��X��$-��-g�+���	=�);h΋���
<0$T�f��A�8K�}�.��(t�|k�������L��*d�ת��(�E���:�η7��H
}V��a/�Q��
I��"F&n��ٍ@�-)�!�DW������)"���6��ʱ<�a�)�**+���P�EdA�����Q�\�f�|�T�4ܕR�S^��Wk��?�1��L�t���s̀(�|S'�|�0�i�
�3!Q���Z�9��YG'Ϗ��'�,���[U�%�m��Fݞu�*��f#�@�l7-�#�	���C���� �Z�l��!6)d�a�F��Rpbm@�®7�?X�l�r�L�m���e�!P.9��$Ÿ�]hדv׿��y�x�k�ƒTht�"�g�.:�.Sf��*�Je�Ĝ��7Wb*Z3����̃�J�!)����c�
� �˗�P!��5c�aW�Q��W(L�ӻ�{�`Q�~�Ju |���ۗ�IFZ�]��ү���O��A@��M��hǗ�8x�9ܿؗ���]h�i���˖v���T��@�*��*z��=��[�
F�����^�ㄹ:e��T��,��\�Q�C��z=78�a�\��@����lX�ꖨ�˂H����`�C�j�#� �4K*;��…r��oA�(�!B�|��C�����8?��o�n0�݈=�[��5[���M`։J�/uR�M�^l��B���AX��TH�����I��!|i��;�:k_�>;I�^`�گ=K����w��w�a����g�G��t�o��U���'N][�6����;hK��
.�f��/�`!U�YM�.��k 6��-�%V~���U��H
3O�Ӝ@�0�Q)�&
�{dS%im:��V^=�s�Neq2�zoo�cݣav�S���~�='\BD��cZȾ#7sgi��[VY�7H��6�ETZ�:F�.��{�z�.&�;9%w��^������eW�8&�]�4�*�…`a&v2s��$a.�L�vͬ{A��h�4nA9���K7�(����	�&����J0a�j~{�-]2�ݻ�{P`-�����Ln��:-:tb�cq��5_�z'WJ��ɂ�|��A�i`����	�-�ޕЧ�W�Rf��ttq7լ���\�?�rAqq�}���j����AP�q/{M�,��X���X
t�t0+� &����t64hE+���v.������̻��?��!AR4nCZ�E�۬s���%=��%g�u[πk���u���枙̠�M�,�`~M��U�5C[�k`<,�
�Q�iR���2
����B�Aņ\3r[��㻼(ۘ�pa�a!(Ё�-w�s��ǧ���Řѐ��'0�8i�t�UA��R%��
%��F�(Y�bw���&���I�Uh3���$�y�;k��vO�=�i8Y��Y{��T��:���T��Idm����̻0@�+p�<0mQ-ق�֞A͍	4�eB��i$y�����ܐ�/�l�l�g
O�n>G2L}�>^���6�-O'}ɀ��H��b��E�D�԰�[E	������M�g��`NSXm�Y�Ѹ�쟝��*��(��#sk��l*��Ү|{�5�k9�h,��r�U����R����2ӥ^����fR�mLqC�p��xѓ��j:v�K��h-*mהQ,�Q��J[�3�6�c&A��<��kRֿ�n!�~��4�k�wo��U�"�3��9�m&��r��XnfW�$�^^D��n��@E�ڂ��X��gK�g�����j��_h��Mi��4��'��}c�Y�	#)�1�(ny��w�yF�;��Ykɫ=s�ק�.R��%׸0h��L^7��2)E����u������L5
\��<�/��×Ghn�8�0=�A��p׫�T
tj[$�"d!�؇�L .�
50ǨWҵ��W{�=�0+su���.��������x�Z'B|�J�>k��Ī%��X��k���c֌A��53�G��,�e���;�Y��Y��p�%�Vr�%�g틳7�9�HIN�OMT�rž����yu�6t�A��e�\��K�v�l�T���I�t�f���#�:�t�K$��o3�Ϟ��ޫe�xO����R���!�V���Q���R��gz�ͳ�J����K�?�I��6@K���L3���*��ݥFd�t��,=Y���幤�d��nQJ@+��uD�gz��x�lk}
[G�C��X�~KN>B9*�p�P�y�J����N:9�"}����pz��˓���&�j��c�1)�ʼnVl�LZ��7A�tcB}$��l^�}Ä�}����#O��6ఢ[�q�ngZ����I�C`�a:��ȷГ��Cn�&�VS��Ƈ0��QxlF���C�Ϋ�!�cn��JX=
�0����"�uhjx�
�[��Ճ��4��X���8�w�(&�Z@pP��B�o6��0.�&�:�i���!̄��nF0�{fa��F���P�4j�a`>�1��݅�����,м�vt�a���zB9ȉ�P�ǽZ��F�x1��:)�ִ>cZ���z��x�q���x<�А�-P
aNj�	Q���H1J[�7=��8�wf/��c�g�PK�K� �}M��]6ӟ̽Y�,�u�<ȗ��d�M-+_�]�`
�k8N��H@y��OQ��^T�wW�Կϣ�l�+�N҄N�C(��A���L)_,z��hg�V:�!|CD֛%��f���)Ep�;Tuy)�c�;�����"2D�����n�V?T�t��%���\>d�=��à��4�G����8�2�~�U<�j�*\���x1��#��W���N�.�v�>�`Ɠ8
y�چ�N3e��;6�P�G�.({�WJA�}�n��03@�G�U�;�!�b�66I9���9Lv,����Ѡ���n�ޜ�x����P��-B�CC_��鳾�<�;ʍ�=1o��I>@���1�y���S9O�bTY}2���R�Jϗ�%�8�7e(�~����qGC�����_��@M�3��T�+d�l	jw���	�t2��r*���m���!*�䊻��A��YX����ׯXEF�8���k�(�XF
�����(L������˻,[xB�֍���w}a����&*C��-;+|^�+K�ێ��f?��Ӈ�X����Ao0�m�ΌN�@� 
��fj�gJ�$x����7ZZJ\(W�D%@�V�1����k��A��@�uM��iBC����Z�3��
ɱC�86�طb#Fp���B*ΖY��yq>�:KgWsbVL=קTT+��c��<�Xf�;��I�^~����ى8���~žG�!s�ˊ��:v%���J.m�Y��"�|�@�M���(�;�,���CvI�DeWH'�WZ�+?��8����&%��4ujj2T�
Q�ymj��lo��ɴǏ�Fx�D�R�RC�����º��0�s
�L�J�d1�~��m�ؒ����w�C��p����:�*psz����܈�/j��1d6��:��(c�'��v�35��3�L��Dη#|�Տd�	} ���P���)M@�ire{
��%�X�c_ۣ�:딮R��%d{�L#%@;�HHw�����DU�[M_a�(�Fa�����U�5�/���n|���8țe����7Te�
ѷ�]����P9h}ɗ6��ڐd��H�2NC�o�:�p*�:��m���bt)4XL_ȑX��1|L/�`�3~z,���C�ҝͺwA�JwF���1����`�&�RwƎSNY%3�hN��=�bX�
J$e�����թW���(�%O��AXQ/�jLaV�u�5`F�R8kj�3@B�p-�Bv	Y*r�,r�T���t�B�Ĉ|�|�/�v�1�nS�6ו��ե��C�t\+�5	�Z���t���P�a1�N�I��}E�>�\�-���V;t�q�~��e����5�e���zB��#��f�F
�3>�<?�<�v���C!���;���K��?)��M4�o�u�י:�zc蜞�w��Uv]����l&�
�!��K�����;>�X��$�U2�%��x~�
JŦ�I4�KmX���y�
M���n'Ũ{'AM��^�`���'�+���D+�)k�b���}��#�>���X'��OW��W����������s�"�E�;D������'|t���Fi����5f�1�)�T���<|S<N@qWn��"O!
l�GA[r����[�G��n Qfs��S�LNB��^��PH�W������V�Qu�p6���vV�����8�
&��6�F�ͼ��SJU�d�~"~�5%X,����&��H������m4���݄�w����s1›�D�<Ta�x;���mu͌����^w�iW �&F�_�!�M|0tK��pn�ЄzdK@������RRZ��y�0�
��)f�¯��$�s,����=>�}5������~���5�5e ��%�*��O.��G�����I�%<�<=����겛�\R]���ŐW��P�f��JZlDW��C�Aw�3�f��h�N�8:<ъ�dO�����-���󨷘
�w�%�cx�Hn	|�n�D�
3�gG?��~	;4kGn[OO�Փջ��r�eI��ͯ�_6�k��K[�n���߉�r
;��1+���1q��ʃn��Y%Dqz�I�ؑ[���4s�w�u�2�i���lۨc�P���k:9dCWj��[�cY�>7�K�&.Ԗ���V���s1���<���G�������'��g;�l�v�yX0��r�i^�.�����P�(+ U]�aT��0u��@4#xcX%=�I��U��p}�
��9\&�Ms��7M"`�XH����6�ARyM8�7Q�w��>��5s�)䛢�J���̋����38�<��`-iZ2Qt�M���׾���m���a��X�n�QoK�R��4r�U,��}D#�03�Y�F��8�J����y���1Ə@L��˞�{ͳ�aO��2ε�w��}D��/�J�WF-,ݢH>T�$�y�	��>
-/J��Gs%t�Ŧ��K-��@%gS��l��%hCCg�!���@c2�+�0©rUG���`�.$W�U�V�k��%��1�$c�V(D�8���v
�I�,���+�X-�:�.�TY��p,���+��}���ͫٔٶ�WQ=fVR�~}��	i��q��U��"�G�'f���œ�q���d�>������Bv,e%��*e93�
{�j0�
V=-LB����˫��T�R�`�t�3L�uAXu��
��}�>[s��f�EwȻA��|`rV���G�h��'	l�?��A?K�z�|R�/��U�yYBNƀ�����+�_����o(V쮳�`���JA$,vb�.���rNps���c$ssL׆<	�*�|פk� �r�L־���VCK;�ҝX�L�;�Ku���o	U�-�J�0+[����T>�O�sʚ3��g���͖F!J��&�����'{|¬g��I� ��N-�		�+n_�:x�>��#9��w�'
��B0Rc�:�Ҋ1ln�X"�[��²��He��].�o�H�
�@��5�*NH���a��K����=��@�Pij6j���E�'�Q�Y�1U�F�5��
�hpiT�V݊6�Y�m��*�hV�E��~�|c@2�k�J�*r��F3_�o����E�U<��~A2�!��˝O[Y���2�*����)^3��]xu,�$�$�)6>&�K"â��.������W��_nq=\���ҳq�V�F9~Q���:U�S)5<����U����O������]a��0
����E�0�Q�X�ƠZ�w��H�Yh|�;Xv��;PY�$��sFF���D_��u���ہ��zeuU�iNU��-*�n#˴,^���٤6�]OS
��]���������vd��bH�qU[I��N���.�^���
q۶�#��|�ӎ�4�'t9��g�۬�G��郄�)6�W�|��L��K1�4
�p��p�f�F�R�^&ZN��L�5�r��ȃ0�^�F���`����vsT#���T�Q�Di�,�i�~g���C46�
o��\M��ԃ��g�Jk�g,����#�F����@���5�nD~eB3�溱R5�S{����q�*�!�߫��� "�������`���+n���ZkK��5]-Ñ������ƪ5��jl'��Fbm�{�o��l��[�\M�G����X��*߸��Xs}��}LV��8����{��i�S��Ɔ��>��1Yy��:���iA�g�%�I���G��%�?v�=��2Vu�:�ʊ*��
K�R/�k/�Ь��F����~�!��z�C�Q5���]Wp�Q�'�d�'w��N�7�lYz��,�n�NB�����4�w�k��:��4/���i$o�j]���Ъ!�_3��Ѽ��4oGD���y=w�#���<��|�3�1@�ڙ�E��Y=h�R��ך"WmU�T-��D��	��O�l	4e��W�w-x�bGx5ĠC�l�();�C0LkPZ�C��~�f�T%]"T�����ڪ��\̏����̚��ʺ�
������t�ƮIFnU�#����ȏ���+�Z�H���(�	���ɐ��	�j9���G�(�l-����%�):��
��@O��	�A�XB��/#K�V!�_�',����}�&6t����'����n����񢶧�P0��
0@BN��oµQ�Y℈�B�Y���sN_/F�W6�W1�p�w�)W$W{�����4�:H�/;�-�[?.s�5#�:v�
f6tks�d,S[=ᄺMi�v�s� g����p�[�g	G�-�D�!o��Dż]��9Y/�zgc�^�[~�N�[(�ٞ{�^7�m:Wo>O�-�
��Ub<-a�L�)ap
8'n"cz,�[�ֶ�ʓ?�I�P^�XZE؅֡y������������
�@P��a)�m���>�;4+\�
���fHˣ�:W�	�kWL������p�]5�P��B�K�M�ÊO
y1�.�)݇Ӹ�V��z��V-_)�l�+��NN/���Ȩ��0�w��Wt�;N�iր!W��e88<���\�wGJ�GPk(v�hu�‵�}K�ِ���|�O�=�>;>zU�����H�=�'+�Z<��x�Z~�%7T�T�7T�ؗ;��4@�K6�5C'�AOX��a$뵹B�"���	!�������l��:Y�N�d�>��{�Z�7�"W+���W��8ؿHނB�5�/6o����d���!�c��T����t��嫌2S�U��iy�@.Z�#h��H=�Ӆz���������!��p�6�P��٥ع�8�?~0[$�-�{�4�8$9=pB*Q-��Sű�L�&ǵj�%���I�~2Z���P�-	�Z�m�2E��`�zG���1�=�u��D�\6QA��+��º�9���]G��2Ŗz9ug2q}֑"���'��
���L�� ��(P/���@M~k�{3�1Q���|��])>�"�+�|�`�l��F�w.9[#�{��Ӣ�N��{��Rc�3"S�[���zL�?�{a���B���
��+?��=��^�ݴ�s��&�{�ֈ����\�6������*��B�ݗ�5*�._��\���¼���jD��֫@�wk���;7F:@�Z�HFd���� #�D{�s�,�{�G�⦆,'�����8�W�1����c�a�b����K�����k��W�P9����'�{��8��-���#;�{�Z%p��Zl��D�����<X�t�!i�^��J����W�������y��񮵃-?�+�D�ou���Vya������Uǐ"��n��goϳ[U>��z����/�O��D��vE�����	ko���w���.����4��ԧ������_��m�(y��ע�TP��;-��/�%	:	�i�qĽ���uM�h5�<��K�|�|oE��a���6g��p�s�}Ϩ��@d����}�C��`�@]��x�'��¯�H�@%����9�"���;!
���L�7*�v��D\���(�����(����0�e�<�a��Wx����(�
?=>=	D����YA�V�\q��A��p�y�9��7+2����=�H�qQ$��p��:���l2
E�4�
���6m]���� g�#���gB�Ct!�r�#DI�k��Y �!KU���/�֙��#��l�Ѷ6,��3�=U���&L-o�t�NJ��h�K&�P�N���)Ӿ�	xaH�T�f(4=E+Wd���vI.�\ޕR#�-b	���
�� �^��9?�irKgʡw^VI��$ʑ�™9X�j%�1Kue�Y4$kާ��Ҽ8�մ@�q��wP`m��P�J�$��f1����.�nW�BRK���BM$���q2���ՋD�u��a�)|
Z~��=~E��'!���׻�ӄ���ױ^��y[n�2LF���O�_�Sʄ�S���KL��Ϛ�k�_��Yw��nZ�q(my�"]�s����#w/K9�4�v�󍵲
-3�N�7�RR�k�4�b����m�Z�@<��~�x
*���4�<I��{f
��5^�&�@~�,ô�a��rԏ��4hd�I����>K�W�,��'	�^&��9e�Z�A^���Pa[|�y	��p�V��߮ׄ�����eT�ib����4F6礔(�4�ٷ�\F�%���<F����fD]��LFK���(�/+s����$!n-�fD�>:��A�4rmZ?o>#��|��F���G%5B>Hh8����(M�4J;	��%���R)�F>�>*�&��7�nW�8�w��FZkl��p�r�Qa+T����.T�O!��-KK^~����#�RH����N��0�Z;���|B�$u��F)}#�)�g������a2�u8mR���+yRB��?ɾ���J ��'�6s��!��}�'�A�I��a��I��gccK�'�o�{qb1��,��EѳV*U�M�<��|#E�LLtH�@F��ZȠ3Ę�����|���ZT�t�ˊ����������e)K�Tݨ�uAxp�C) v�{��=����cF��t����2�K@���ߣ
}��)UR�uiS�+cn�.���k��
�v<�W�+�'�D6K:)�:f���K��-�ە&ZɡB{�l��8��^/{W�
sL�u�K#��h�co���=rxY�~����=�x��&��j�6l�(����ty.��i��y�T�"���{g�j�Rz�^��镢���u��Pɵ�$��3{�p���J9:,���yf�������b��{)��O��po&�nr0��$�L^��b���c3�-ek���5r�-�:��-��_�՟Z��^�+��
�,����BX�LSV;$���&[��S�����U���\;��}��bk���aܿl��<[E|��B��Nڇ6���Ǭg�K;f#�r��8&�خ̓B���X�^�1ؓ������z���a����H�.Il,�oǓwcJߦ����
DŽ�#���[n�)��Ra�V(� ��6ݐ��.�T�>�1X�<Nn�Nƃ�En�����������7����=Ĵ��x�=@_}�-QY�B[��.�����:ҕ���9�L$A�.$�z��/��a��_�H0%�Y�ц?(ĢJ����NNUb�� �Q������ ��Ga��5�ء�^C�Baϸu�F��n��|���td�60���L�����:��+���Xd"_�:����خ�2���͜a���tI`�������,O+K�\d��%����T 8R�2
4�ۨ#k���M�^�;���Pd��ҳ�t���ټ�T�q�,�<V�ǫ��2����/�o>�<�)�diEs���{
�r�V��K��4�.θ�L�DkN����H�V~��=a�Cm M��N��t�>�G[����,��FØ��#)�c��L6��d��A4�wJ��@��wO��]2N�	�/k�M�N�0yk0�6�a�-�
-�姴1X����ռ��Z�@��P����e�e�f�f�8n����4~Ea��^���=@��x/I�'[�
���~�!)�xs�>>��|z��nΡ��S+�kq�J�V�����F^�'�J���צX�5��*8�e���@���P(��(��j2	
Si�	�6�x!�f�W��������m�>GэZ� 4�j���lҰ����R6B�[��p�
���H7�7XX�\J��PXR�7�8�p�ܪcG��u$�?��"mJ����]+�p�GV?�(�7�1a�V�m��eٷZ��/W�s�*؍���7K*�~�ۘre��J^�=^YJ�C�w��z�-.������|�u����7࢚uv}��F������C��p`skjN��V�?^:�l"Χ�yT:G`]��0�k�'̈b8�ɴCL�i��l����JU/�u�q��'��-h�ɀ��^��̕�=��>�D�9��|��U�a|�ڪA�X\���ˇ�8�x���������L`%Y��~
������ꕌ"�K���.e�b�%�*yQ,����omn	!B��<'�$;�z$�B/au��%��M1��F0�{k;�$FCP��du�gr���>���_��<���-
Mr$es�i�k�#q�(~��	�Q��[�q�AAd�*OCq��̖�%���C�b�q�EI�J���S�
ߋX�1�h$4��ˁ�5��|Y��V�ۉ�-6�T��,���]v��M֘��v�K��D�3��;���LGG�V\��:K�\y�]��)�-��f�I[J���cA�;�t e*8g������h���Q������['X��W?n7oUD���ۜ��]�;�[rJ`q�a&�XҫW���fEc��w8|��D0��,��}�+��Q.a��5s�!���h�n݊�=���1��Q��&�	r���=��I'��3�/��S�� �0\`����⡾��%J��cnn�I�iI^O�@^�dž��P��a�d	j)�nI_	�h������9��߭��(�XRBU(�0��3��UErgc�ӊ�!x�w�.�R�j�6
�����
��D�[�V=�8�-�F�ӆ:́Vs8*d$�V��Q���*���P�.�LL*[Ie���r�;K\�J	n�
H&s'��[�U��r���?nܫ�Zt����T
9�%��
;Z���c��0�I�pB]EKα-T#��|��X,CG���L�!p�����t_�TL���d��)�k�I,_
�^g8��|�r�0
�T|��`�5G��z[��Q��L���ZWnX�";u,d���sE���)��Nv_P ���'��5�����r���]�MN����q��	Oe�N�����kL�F��V஫^N��ZC!,���/&�Vq{E\��㬨��(TTQcĐ�#B�$,5JXZ�t�NK�u�%mQ��'�h)�
�&���W��K]wF��|y%|V��P�7�b*N[����m��.��}0
����v!T�J�|O��B���;(�%���9×k�M�X�m������4�G���&��jZ�[6�&R�Y�#�v��������[��-1'�ʮlf���f
�wJ8�N`{s���cR��w�\�̋GأGܥGܧG�)E�j���f�n]�Q�����X������ֺg$�����J��m�3#�QZ�����W�
t��x������Ү���n��iM��U�������ȃ^�,��,(��m��%\���Hpc9�m���K~�AM���Z�o��v3��w��n?sEք��d�[�B�1�N��:x�l_������x?S�����$�>������4@�u�8X�C竴��!��}&�b�	��9R��F�&�7~�f�j�C)�
/����L�b�C��f�9�J�Rk�<���l2�j���R�zo���0f&�	�I1�m@��u[ںp,�-���n�e`����`�z��ah��W����)Xv@r0J�k�6�ž�y@3�����a��}�.6+U<[7���l�c1�EH��s�}i���r���	)9�|�n3��x4ۄ�Z�������H�,��Q�*����"�I�~�(�mm�y�E��/d�"ۅ�#�9�5[�0rۥVŒi��N�~�&P��p��Y�\Z�Q����Ǩ-����F�ͥCw4��Z���$x�v�U����[%�,��`|;y�J��Rk�lx��?8���V�)���*CY�XN4��PELR�@@��΃h-�krGi�1jg�1q"B�7��m�ýd9rܧya���V�i���'�x�.9�'�IY��$��Y�IΫ*S9"�qăF�+��L���Y���EV<5����(����®�F��9o������3}�`�2�$��"ׂ}�re#�.��D����M�	9_�{����<E�b����Ê�G�
����j��u �غ�8E
�K�e��~�:��Lfӛ�>�	u�Ѫ�+�Y>e��~ǧ���z�~R���
j�t���}�ޝ�
(��כ����.Z1�4X���i+)q��ljvk���=%$�'
�!c8���h~�_�\9��Pbl;������NVp�A=�n��9��&-,BU3���%C���ӶF��8�)]��D�m����nm�t�*W8�A�{�����[�l�,+h�U�⁡U�f�k���g���;+߁YO�Ч^�2w�lM�nh���*r�F��t0m�<��:����V�����ͯB�)筺���t��%��s��no��� ��].��h�o7�PZu�%+0�m���ő��88u�3]��HA(�	��(h�0C"WF%bbz�0��T�O�$(��l�;�k@j��i�x��ϲ޸���'�r����١,B�dE!{�~����bf��tT��u�,B�Di���.�˳Ѥ��Y)����|��J����k�l�n"Gޝ\Y�2_�Q?\�n�U�a8`H��)�LN,�V��/�鞳�?���b�ѳ�O�t�UC^]�:�g�d�s��j�,� �et�U�!g�Eȁ��df|�0�N0�{�cΗO�ώ:����o�!o!q��;�K��b�j�NG��'�GL(����
ݾ��
^q]�%4���{���i>;�Z,�y^p������Փޠ��A
�d1�AC�HC�v��t<��3�`�9�ݍ�8���!��^L�'�sq����}�x���{�s�J�g��&��!����ߜ#��o=��]��{�I!���b��7�'*P�<ݭ�o]�0U(ko��j_{��R\�C���Z�c���H�ԑ�r`�+�T�Lt���N!:9E�9P��B��>���t2[�����l�v�]m-ʢ"I�::��<;�)��4�J'��1�LN��B$(<���E�)�/��?����f^(i'��9!o#Ii�.�a+yz��\j�lx���!R�4�T�S�� �WM��gaS03����deӓŠ�%��>�_H3��L|Ő���׀@�?�@>��T=���>Ư����y�;I#]�r�-]FHs����	A�XJ��(��tJqQ�B�s,�GDX�2R��c�2�
�˥RY�����y��F�+r����16�MP�n�s(gY�Ȃ��OJ���%FؔMλr��N�����rV�[R^��j1c�+g��Db%	��x�Wx�a�*�������U>#��e�i��Kjޮ��5��N�\mr���e�3R�?Y�u���緝8ꉜ�l�D9*4�0U�����_�|�Vd �U<ۙN�o�'ne�ݣG�}�U8���m5k`��MA��9Y�j�L�X�f5D����"�J���e��3�̳Ble�� 9�ۧdL|_�e�,���9�r��fp5�焭�w8Cl���	�MeDc9��������g�@�:s�/uS��TC��{���!U��/�㬜*�ʕ^�H�k�8�ib�`���E]�_b����&E}���goC4�8�K�]dqD���g�?v���G�'��7�'
H6���ɻN0��[�r�KY����}��!�Z5�{��� �<S����/PҦN�B���/e�ɔ�&Iۮ���cPxۿP��K5�Wx<��NH���J����1��nB�Ix�uq��C�(�gnc� ���
Ք����L�5��K�2�W!k�q11��3Ix�cUzI�RկR�;�E��`���@�TA�9�f3_WzB	�{9�͙yĊ���γӳ�����23��\�!���M����VrZ��Qr�b9Z)�T��l6\�<a����K��>y��0��y��t5�{�phr��YT�=4�]�@Y}3l��i{vr��O���A�Y���j�����{��;�CZ�N��j���J���_j���f��2��dϒE
O�50��z��t1��2�^`d=�
��7T�Ƌ.p�ob�5��`��Ŀ/�A]����ά�6+`>�[W�ֈL�����&=�8��ѝ&9�-�hR.��p.���-�5���O]��yr�{���*�hE8#��;ëvc0���u�{Rp|6�gɮ&��22��M؋
OuqV�	�,ѡ����q�N��aP�l��7�{gvOٿ��V�iӨ׌	�2�����tM�BI�/��E@r,�u,2�{8J� bۤ��	��|`�s�,�'��E��$�������`�po[y{�Zګ��8��,��%�6Rө�f��T�ǫ�
�e��Ŏ��]���e
E9�cE2P"�	�5�̘ygo�%K��Į�AtD�#�,b�)�~�a���:Հ�7�%��[^�&YpPR��C�yеyD.8z���*i7Նs],1��ںdƖm �K����^�;�G�s�H��–r"ld����Yw��FQ@�+�����Q�<�f�+�(;j�wϏ�V�Qc�����/���J��j(��W^�������Ч<"d3ώ�����}&�rrx��9�K��9�$L'�<�!�P�Q6��U�I��:�_ͣY�s�`�>�3�3�vT"�瓙��Z�yI;�6B�99=:�x���|py:���V$�u���Ė��S��
�,�Y_��+�<�o�Y[�[�mV�}q
��zI���ad���Ֆ�)˽�̕����5�{���߿�U�b�!�;���$������1��z(z��ht��7̷WLit=�! �
*�I���	����*)��a"O���t�	+A;9�~�B�ŌQ�\`dj.R�-$Ӗ�,�F*��$�Z)_� �I��A~P�oԺWmI<`�)�?f���<k��|0�T�ķ����c�94�
v�K]}DJ������d�Qp5�4�X��Wx=�&*�UXT���%�om���)�O��<?��>Cu���W�j������.F2�	����{���u�Ua܏�AY~Tp`Uԃ�o�f��
6�j)����i����
��5��d4��-��F�FY�r�WDD4Lk�Ɋ־udܜ-�j�u���G+Z���();kJ2�s<��"6�ɻ�#�|^�YH���td1]����G^n��k�@��lĞ�����ԩ��Ȱ�� ����j΃��_�	��2���ޘ�Յ�o0�JM4��r/�<��[m��!�,�#�
-�3��1z�	�}�!���ÀyGJЭ�{
�'1!�U�Yy�*8�$�]ң[�jp����Dl��	Bi����t�Mt'8~�l�s�U#�gA|+d\~n��Ev��x�� G�β�&U�2Bڱ��1�Y�I`C]~�QT���?�ϲX�W�����g�����)&�`��{
nm��Σa�k�d���t&/Ve[&̼�>E�$⾗<�Z�L���V�襁�eiKC��H���n��G ��.
h�<q�a)���x#U����hr��B�#�>M��-������8��J�=�#���w��-���d����-G�F :*<�}�LJfn��R��7�M>R�P�a8���4�2�ՑC��ʾ
�tF��>_�x�c���{�1�B�����ɳ�7iy9|���V\J��.�����ʔ�T��aiz9�=��^K8�ŨҿfTBWe���ˍRՏ<��|�}-����h|d�"����.]e&ݎ� ���D���2ȷ���_=8Y��5�ލ�Ju��E�$͗*)���u.����SFȅON;���g�+��r�B*������1Og�	dA[k��*���Lʀ�`f��.U/0r�m@j$�L��ҶϩT��L(�a�7�3�ejfGY9�+	��-�G��eE�8���;�&0���1�2OY���մ��}V��g�a"�<�]�yt�E�&2�F���J�\^N�d2#w�{c*"��0�Ď���v����C�M
�#Si�����У���z�kϢO��&����xX����6�p�/�`��T��"��h7��'�b�����AU�<�z"s����:c��J�M�%�_WU)8Q���R�-9U�q_�5Jx�\)m�|��ʘ���yJى��/�U+th����`���cu�=��4?����eK�U1������sE���Z�36Ʉ�����2��\�&��M_����Mà�R��$7��Z�
C�\Y���m��U&�Q�Kv���񷁺S9W�N�)�2��#���I5�eHkI�*,=x�Z8��W��^i_]��[��7W��Y���nР��֚:��ҙ�?7��ߴ֌
ja��Z��0�D�E�*���ہ�@�,,��],!	�fЏ\�-IX$��I�d[ڵ^���f�E����uof�j��(���6�"U�}q�����-��%5:<��ͅe��5��W�=e[
�;WK�oTh`����,�u'
~ª�m���_@�|-���-Oh����A�m��2����+L6x稵�>s5�3VWu/XB�D������q�����!�s}V!�3xr2Y��Z"{&�w��#D���˅;
�/><���À��RY�����k}{��Jry��(,��"��������������a���A��GYŸ+M��V�0�Z��Z�Կ
J�a�eR�(>��Z��H�+41l
����؎��TD���^�an!�*���F��������D:���A�Lś���^�oW��S.
��_�m`�_v�j�q���<W�zn��:y����s�`~�v��1�`Gm�dֽ��+�3�V�<̈���@����B�,����h"��$�k�:3��*�dt���EW�*a�'�������Rd9H����4٩O:�~F��jCi���ZRN`K��/�3�@]|] ��8�Խ+)AI)���jb���h�G�OW�
՝����'�^�X����"�u3��V�̕�V��VM�bN���r+_�xʷ��d�ټ��D�`ByÍ#�=Hy���@��(�=���\;��)!�ÖJL�D��'�Q`̡Q{k��k*���I�r��Θh^��iNDbϽXdl�&.����ew6(Nf�Nm�E��c��{��5#w���$�P��d9�w���2��<;��s&Y���g�Cy����~�d��vzq�9K�C��(&&���,��L��;`�wvd� 0>��`
�.5��:�x��^	^����#t
��B��;�ݷ蕠�$�%`?���ˠ���R�Gp@�*j�*�����`M�O�Y|�6��R��6�+_��]e�_����ƽ��������u8ɑ&�%�2'�*WUj���憹��D���+�
�l:��I���y�g�N��ZB��ߙ�CuU�|�KE+�'dgV��m�q�B�;���&���EK|m��`���=��W���r�g�1��(y�v�U��no&w=F�%-ooWh߯�%{���'��ae��d -�:�
=�Ϭ�Y�9�w7���{/�6�H.�����^��
~�T�,$_�|_����h�m�w�{��"F�T�?�*���=�A,��JnDsF�#�ȑ�|�X_n�/E�3�S�g{9��0}�>�Jb�n����+m��@���s�I�{�I�\��C–G�x�Jʮ�8�4��t��~��(��bfr�d{��*GjLRk��AO�B�S��a���GN��
b`�W��ƚ�<��h��	[nX�	.C��cEX�}T��:��Z��2c1�iEC��	S_uN��} qբwZ2ņ�
cV)E��L*/{�N՟
W�OP0Eذ�)u��ʅr=�\v��UVef���n�4��»e�B�Q�W��
yU�לPnf���d��Q���ArsrH����|���|���i��z��n��a�
YB�f�����*ᡵ�^Q���3�*�)���&u\�2`ܽ�Ӥ�O�����Y$_<�u`tv3����NA(7�]�W��N�v6��훰�\�8�D^��1�7t������;����(oЯ 3��[nvin�ۥ��
����XmK�y�O���u�:¶��q��K�1�}??y}��<��^�P��E��u�����` ˽��U�Z���v+�J-�і�ڃB����r9U0^��>Q��&-ʽeяķ�F^�y�<�����L��7���＀�N
��B�;����gm
9.+{�Ita�;�	����jK�M��K*5N�s5��:���*<�^z:�������9V�0��ձ~��۲�V;��`��OύJ�]��(�aL���ġ�$Υ<����G��a�j��iE�|���
�/��a��2yvA{���U�%�41B�R}���D=r:���B\މ��t#r��%�q�K(pJ��!�M����y���)|�c�>�t^b����ˣ�z����k4ҹY�����N'k�"*%�* ܤ�.Q�\Z�*m9�<,�2d��b���ni�x��y���z_Vm�e9�'��+��h�?�ro�}?-F�+�Eb/&y���6F�$��*ɌԂ�MX0�^�%�����O`���K)�RD�����x~`�D�|X؋�ݩ�ݎ�����Е[�x��Lq�%g"\&}
�wT|~P$PUz�iz8�G��y����h��	'��Y���Ғ�U����:����]�&��E��j�w�;��;/D�����L�#��HR�B�Gll���ӄ���h��P��M�x>a�>>=y����dwݘ�K�G����z�]&@���<M�1��[fX�U"ݱ(IQp8��IV"�Է&��D������(�:���+�K�+9�䯯�B��N@nJ)��	r��V/���	2T�����,)�3�����R��T�x�P>��^�L�6��T���(N�׃ji��^�X9�qًO�&P�!�x���� I"��#"�?�9`��g
jmg�DN�~2�
b��^��G\�L�g�U4�$�bs2��*#�j^zAn�FT�8	���T�*�;��n
a����_G�����t��1����b*����(�J�'�E
*U.���V�tQ�@h���6�� ^�~_������,-'��͹�p��Ŏ�w�|3������<0��.NGϏ� � ���䳔`
2`ɧ��t2�/ƃ��^���dv��eP\C��j��X�[٩3H�pɊ�p�./1E������Z���>�1Of1��RzlM���Y�A�4B�k�VM�zb(Z���z������D�&h�M�<<;D2��g�� �O$��Ǎ�E�5���D�19+p�������)����E�L�e������_�A�������u5G��t��0�1�n�1g7yp��+��J�f���1�9j��+�FX
?o��!9㎬�(��{iU�F��3y���#��pgGG���AMd4\�oZ��Z�2f��h
`Q<Gv�K+�|!�ǜ�da�b���=f���v
�Ր��5�J��q�O�39�ד�:��]A1˹������,'G�� �!��$�F�&��d��>5T>5T�>W�<�� .�����&�l�cd���41�;u�7�90�G���@�@Ǟ6�4'6��[�����Bv���Ǫ
<���_O�q~M��Z��kU�kV�$\�8~��ڋ�b��*�\�|��-��!�]��eM��ߞ�z�C�Ds%�ò����ӝǏ߽{W�G��l{���߯��Ƿ���?��N�x3
�{J���H��-�0�/�.����u��X���M ��D�q�E1�=Ѩ׫%ćR,�e��ڏ�|�:X�ͪ��֦�O��%ct�i4S�ZzFJ�o��R��.k�I���+�?��&�#�6"$O'r\�����<o�N<%�Jh0�v=���8���#�
�;k
-�>(�y��g���	���j�Q_��;O__�t0�Fg���}~�����'�y�1�o��g��<��|�Tr�ODb/v����r1��m�1k_%��)��`*��B��y3��<>�S����G���4#�ü�eV�G6��ˋ���>1���V\��<[M��eʖ��-ҤQ�[Y*2�VO�_�n�/�u�J�i���x�t�ߜJbU$ɴΘ����"'ʫ;d�PO��YMᶭ��ؒ�zd���q������C?�Q�����y�򑷒�B3��ի�Y�}^t�y5+��1Q�vᄨ����&+���N�o�m�o�
f*B�\�G��Xs8�\�?6�"(��RʺQ�P.���$���n,Y�B��	�YIBeI
popn�/�{�}V���;�+;a��fQ��jF3�6�]	�2�<�^�65
�Q��ߏ������^�`^~y�-���q�Yџ��x����G':㰛'	�)綛���0 �AH���1ǔ�� �iJ䒥qUK�F��)m񋭭KL�F��V�R�j�!��r�$K�[�K�6b���P`o�f�r)𘉩�8���L�&�,�H)����mt���3�}�ӫ��䓍�jխ⿢�D�3�"�]7""5�6�)�-/H9��[�'��f��G�:%�$���o9��t�7'������7Œ�9
�)�ս|(!�qC�D�ɲ�Zʻ9�=s�l鹿��v�b@s$��[-�Ow�z*�ܲ|��;�a�7��x����W6�~3����pV�x)���nH��
M�`� 0|K�;0�[�\ښ捤��Z7�	���=M��h*�x�ݲ�^^�GS�X�H�U���P�T���ě��U�}X��*���V�y�4~�Y�o��my�/�{�n|��x�31]�7m]�E�i���BŢ���k�����IXMY�:N�J;���	��F�hx�۬�=L[�bٯ`�yW#����n�_I�"�\j4�2��翎��Q�WM�_��x�0�Yڳͺ�rZ.7�*�Q�;�2��+�tS��hv%�)"����G�ꆔ*��K����r+�r��^��
�L,h�R�~@mO�>�S�1��L_��Q�E���߬�+�k��	����x�2o�;�Q_XJ_?!��đ��B���2aݢ�{���Cy2�W��R*���_l�v��-�~�+�댉#x���H�ej4з���3o��4��É��]N>�ы�<(Ck��m�?H����A.G>	�σ_��ޮ��J�N����X�+�cO�>Q�Wx�Ux���n0�7�LRU��OQA*ŨA����<;&!S<z�e䦮
qRU��-ؔ-�ȪxP�s�˙�Ou��ܒ�^����
[o҃&�D���w���%��x(��D-i�G�Nw����Χ�/up3��@$9���΄��s’^�a\�d/�/^�ɨ�y�4�}g���r�[rN��	��]�1U1�rQ!�f(�/C��:*�#4AM[Li�&�(p�h(	&#��3����`wX��X]ĸ��t!�����+Å b�ɛ��;Q�v&�k�=��*��qCsnf�	�b��+�f�c^�s��KT|��R�0-�D���v�G*�d�
B0H~�L
�����my���{˸��r��O�~�-��G�Ĕ!�C�OK1e�:��y�M��[�R�4t��'6����O���8�^9��`��ą��bX0�;P���]2%�ҫb��̈́ǻ^�u��
N�/�S0(�W`9��淼A%%cܪ
�y���7��^cKF$Z�r�%��(=��X�U�;OPXaV�l�
ƹ����'pc�ʗ��&��A������(�=�_��F��H�:K|f�˦��&��:���n�c�Ì��{�1��,_�]R7F�u9T\F�{�Q�ۻ!��ۘ�����	Ǝ׾B��ݒs��t$��#%�M-M;}�^�]��,L���{7����?�b4�G��g#�y���iE�m����A/��E0�7A����=H2�Q��2�L.��Ђ�m9�.��P�x��O�Dqd�Q�c�Ao�J��gF)XGIE�:��s̴��Z�tb��6���r�U2�6�%6���i�t�B�!�R�5�P�R5��e;��рd�Cڞ%����:�}4�`�5�X���ߍ��9�C%ʥL��-���:
2NR
�5�c�:}���R�N��NGit�_ٳ���M}�Of#�3���>�2�wԺ�S�}k��;_�e�tF��&�:T�[!��%�Mوt�$gMY�T•� ��/�87�j͜����|�U˫�z�!��59��oS$vTK4[uP�n�@�K�J
�'�����u{'������1n��$Z>B��!���
~�Mu�
Z����ା����:]yz|z� ���&_�|��hq�k�K�D��񱏁��s�������Z�)�1�{"���"&��g4&DK)�U�/���'p�C�������
�� Z*ɷ'���&����{"���U�������
W�Gd���pT�/��.�hY��TA�5���`�B��J�|B��Z�4Va�H����w�Y-�`�*wg
��R����T����h��	u�Z����)��S��:U]�S1	�o	�T�Vu�ѝ���
$��D���O]�c4����A�_Z�E�n�ԇ��'�@9%�����M�z!E���-}.������×����۰�AY��)�:����^jpk�-���A��iw_Nji��[�[c�!HV��$sA��V�5����V��JEL�JP����/�"Y���*X`t�z�l�\��͒��B�"f�n�d)s����ɺ�ClpTI�Qɋ���F�\�������_
�Ɠq�2�
��PjT��S���o탋 ��?�j�u��@R�zv�	���J*���t�������v\%�������e,�{��ːHp
�[�2$�)�ʰ��YYL���j#�)\<���P�u��ʅ㪸�Ee�U�x�.�_��B�w��n�V.qU�Y�<Y79
gi�3��K��S+�֙	X{�����'d]��*�$�/�a��PQ�Հ�@�ю�b�Mr�'��l��Q76d&i���tF����x�ӻ���ƕ��K���Sn�|��b�{�>�u˙N?�V<;k��$h}O�5��䴐M�����|/3	gM��(J�.<����x�
6�8�"s�?���o�B/��6�|�,U����$`���Е����t�t���@vL'����j��@_nk�C�~�\Vq9+�JJ�DВZ��`��ۭ��>���X�|��d��WiKd8
4���nD~�7Yu#�֏�]�Hꄿ`,%����	E�DG�~�D�(Z���m>�&��-��j�?�ͣ�d*�.Ͽ.�>��N��%_�N��5?�E7��.�]�\�4����ޜ�@�9�A�����*��)X�.�!��hB����|�烜��SR�^:�1�b�]���-�Å$FM|L�e'�v��J�Y���pZ�����X��, �7xu�j�\s
Հ�3��t��
-x�q�C�b���k���Vk�cv/�
�G���w�9.nM��ز�����V�k���$��9�Ig9Y&��*䋀%"�DV3��سr
�
�w)��Є�l�HURk��r
vm��bn��f����0�+Pa�X�vVWQ$gtQ��+K��[�!���n�h<ώ!��Y���9���xtrx��9V��D����H[E�R�S�X4�K��Z�`1�ES댃[&��BoР�P��M��+��$<���6w�n.u��;T���hǒ��(ذU^�f%~��2���M��蝷���]˛ĠDy�)"M6�`ܟ�_�(Ms؂�d��?i�ؕ�� ;�=0�1:Ն~�.��=�+9�������`ܟ��p��� ����%��msh�ô��a�7�Gc��\T�⢮�Ő��/�~�dI��Y�^xd�K��@� S�4In�C��V���gH8�1��|W���] ��e��Y��m�"SFy7,a�X�D���g���?�$J
c����Y.`�+W$:Z��v�����Y�:�����SM�ʅ�;�
`.44'�+�RF�0-[Y���s��"�->?��eǨd8����a+���d�cԽT(BY�+�<�D���8�l�l<���0�
IG<��rFdW�)Ev|w3*�ݿfQ�n9&,�c�Za��OG5���bl�y���)�B�i��ҐfZ~%iQ�P�抓A�e+�rO0��j
�S߮�+&$Q�
}�
�q%��ȸ�����z�Hu��M���Y���i�8�˧}�z޾8���9} �Q��cW��hN�3T�ϋG�4����,��,�������G'G�Y�pv:��s�S��t�k�e���{nU�b����i��
����uKo�A�����ۂ���~dU	ј۫շ/nc&��];U��{��p�!Ն�W���M�Qc�̻A��
�0�F!��sF0Б	��`6_t����fwX�K�
��2����P_��v�h���䥠���Rԯ���SN�1��܍'�s�V�¹%�i�J�y�DD��J��l#[|���%�krzH�'0ĞPV��(�E�p+>��7�úc�Y7�0+�0�
J����y������AH�R�
+�O�#yl8���Ĥʫa�W��+l�`��&�'����6�n{��"T>��xPq����������<�a�U�~��*L�U��Xn4���vi5���c�09��n��C�(K4j	��]�}=��	����H�5[�Aۇ�5��UwR�Z��u۸X���J��u�ڧ����)?��/��V�(�.6^�_�����-�g/�Q�4��
��j�J��'�g���������:b�S�C{,u����Xd:r�8Mn�DK/l��j������)�X��2�8�<������Ð^�V����r+��kT�:�Cꞝ7m�_����@j�x0�F���J�&��&r�ͼ}�q���@��5�yO�B��*�ۊ�q�p�sH��&w���_���5��}@P^�~�gT}�~�w|�]w�a��xtp�{v��^8P�H�%��/��@$AC����K�H�IZ�&��⍸�_9y�e�^�nW��f��l�n�2]�����h�N:�,$�#^���]�ϛ3
�N1z2���+,���୭�#t�]��%�t�[x‘���[y���+֗�v����ݨ#P���H)e�HO�V��`yg�F���1'�t�#����h5���b����_E�|&*Ѽ&�0�6�>�VƳq~pp>����Ϳf�ʪz�by�hI��w7��X���κ;�
"��N?���W���ͦ��Q��_�)֛/�E��&	��վ����n���������~¤ml�
4y�\G�h&A)�{L�j�SUSkWU]��K*r�������2/�C]I�;���r����r�P�Y���D��M��C���y�:�R��	A�	���]�v�{�2Ρ*�����NT�$}-���
�a��T���Q\�v�n����5�!����Oq6���%��_c�f
4�;|�o�h�X7Rew]�}:pU��k�ٯ^5�b��-�/[w
rQZy�	�ԂD�9�,S�i:�L�0G�����������QW�*�~���xȑ���13o��p�2c�~���֥b���4�[|��.=��k �-h���
��&�r�fə�Y��>x��z�_�.˕�e�Rv����WZ�e� �O����]�"��� ����W��x��+�F�ҧ>h�ו�*�������?�2��'h?�'��/ΎN�c�<;�`{��؄��*�'��*#a�#u۸��>U���vc~[<$�1ӖX�����ѻ�;D��ĨIݶ!���	��`�=�����g�5��=wD��.��&�u�&�J�T�*���л�Ee/�-e��ϖ�nT ׊-
�ͪ2/F �hu$�?�Ly��	�{�ۖ��X�(-p1	�Y���xĿ�}$_du��Y�aTb�IH{�e Wz�6?Ϻ�tgn���N�1�)����j�ەZ�xՍJۍF��A*�&KK\���`�5��sLګ��Ϝ��WJ��	%�}e�M:�i�ӱ����]4S�9<�S�QK�/��t:���+x�
l"��&9�axF9G�$��-u2Qlo�Y����g�&/��ܙG�����ʶ��#)��նI'TIN�Aq$�0�|�:��ꪟb�D�w�Sz�U*���?t)Ke��)	�z�3fі�!�.S�����#n���c�{trq��K��d�HJ\r�@�i�kT�58�*f�d�@��+媘2�-��@b:��a?cH�$$)sb�w��B0.�\����+�ե\/\���J �#��Lծܣ6�q�ז��)x�/<�[�#���u��E��Kl��-�4�$Fa������N���K�v#/xm�y��8x�:����J[[[�?�0���$U23ۦ�+Tt,�_�Fw~Q�qR��LJQX�t�/���ݫ(o���e���;֙�t[D'�&h


r�i��8c�Th"؎�S�Y��}h��L@֬��Jtu*�[%14KM][�,���lR��ƽEAT�3�"5�%��-�X���Ɏ��̨��f/��utZ.M���G�z�Q�І=rG�Q�ũdw�O&r}΀}N������j��4�*~VKU <$+X�U���1�n�O�n��Ļ�߈���5[FS�䩔�p9Y����B�Ԃr�Z�:b��d�Bc�P6�0����1�5�s�F���,���+�#�1�2�9HD2�(2�D��S5Rי�%����XEX�MC�����\X���&�8+9�D���c�"<�2ԣ@����DЅ|���zJv��{k�&�rۊy��l�����C'�����k�Y�>��i�nB�RC��|r�7�IQyM�@B�|��H2S�a{�*r��������{���P�O��$˚�BrS���ra�Ե�+0]�a;�蒔���
�|��^b�`$�!�{�o�,��?璸`>Ũȝ�k��+(���Dv�l)���%X-�v�pi�
��1v6����Bb"�'rK@kى+8�!d,���J������p_H�>�No"�[fZ��ڱӑ]�M��B`_n�D
�@�����M�U��G�����-�濰��'�X:±#�b�%��켺;�|�h��l����(�^	�cD�:��S��їB�e�xKG�w!��5b���D��s)
3d'$:�f�Ykt�,�X��Մ�PN��(-��"��6Z+s��rj�Dk6�9
�ͷM���3K2�~�cO���Y+3��zV�U8�۔"���;seA�l��S��/�+��Y�og�)�g�rvgԍ�{y����.�g'��Gԛ
��5VyZ�� ��
�������R�
��P���wc��k1匽K3 ���X�M��V[\��Tdh�Á�t<%�jsڤb~������b�^pØ�Z���!Y�nL)�R4��d HfrO#ӌP�hLU��V8/�}�@e���]F���� �j0�A�=ᾀ6�;n�l��L�j�Tԏ��n�F{W����!Yp��r���Pu���2�w?�c]��D*�7h�Zte���kGvJ�E�Rڗ�ׅ��22�̍͂f�^���}+�+Z*�w�>e=�1#K;�,۲�;K����>-#�O�5��|2�BTg�)�V��Ur�������7?��r�x�X��9�L|��-���Β�6Y	+Df	�Qq�\F2el6�;��vO
�F��ߓ�s�&�#��T
N+��`��w�*�<J����I8�kQ��?y�Q.��AT����j�+�V�t:���;V%�	}��0�p��ؾCP8*g�&Ln]ב����A�����%��K�8��xz5�t�ѥ��_��:,*Y�m����Lw(�wTb��u@�"��b�ٺv�Fԋ]z����O͗}:y�3��������r^�6w���l3U	���Uy�r!�&�C��$�zsFc]J�{O=�4�r������,Э`��B��Ƀ�ߧ�>͖�I"e6J��Ou�`eH��0n	>-�s��4r21T�w���’�ǒG���6����0�(�92�.��RI�����bc��'NGx�w��~��:�3H�"52y�~�J�z"w:\�^��Gr�P��g�ڰي�������+�)��͉Ҽ�314g�c�y��j�-�g1�vy���tE@�%�CN~&ΑM�H'��uǰ)���)�[�~��qg`V��1�n��IwK'�tzN��R��tfs�p�F���Oٖ�~1�����t�+�8p�?��$�pI�I�)T�k���&�\g��o�}?-F�ŗ�������.�^�>�P�ty���02�;V	�!���;�@� ��$��6�sj��b4^�H�$7\Y���B�{�y�����e�̍>@�v:����e�#�%�dw8U/�4���0�(�<DOg����`�Aql���WP@_8�>�����YH�Kio���)
��Q�a�
�����r
tn�`#���[�H�}qt��-�X���h�p���"շ���ϳ�K��:����?�����s�I��~1qR֨b'r6Fx��
�����_�	{�����e�Տ��ɳ.L6�'�Jum��C9�_u���Lwv���/ƺ_�X
�pA�)��2�<�~t0�X��"�"������6�u�'��e�ʳ��2�BYy�9�;d4zˣΠg�r��ʆ��݌��b��얺����`E�M��!�!~Z��FH����,��	��_��/�
ݹ����W�I/��"�qG�./������"�v_��%����R��v,�G-P��������O	� �Zx�&�v,yb��,,"a���9�Zo4��b��ר_�\L�҄>����Y��oƪ]$�vm?���s�Wg?�f���y�A����'�����/θ�$����;���W����Ъ�=�mp����-�"����O��>;?:���~�Y�7���M���q{���9ܿh*M�ݹ�G�«�p�Ӆ�c�����m4�e�/^�G��W,�[\,�%��Y��M�w���
^�p�
�n�1[��9��pAW26��Y�N�����<��tum�E�r���~.W�
Ѩ��A���9����3��T��t��GS�ω=����K�(�i��f^�&��mړ��kUR�'+L׫��PVQ�{C7{���t&I�*c͋^�ֳl^l�䊯�J���g��_ǿn�=����|r�y��L��'�_�ݵ�͌�e%'�]dPHN�R��ǘt� ��}~pv�ꂦ^���M���5*��Ȃ8P�D� +�Y��/�F�ӣ���7�3}֣���Dx�`G7+q`q��0c��^N_�9;z����
�_� ��xѵ��%z�����J.,rbA���W����M�P@7�wF˳�����e��_���L�i�em��_aT��ܙ�Y�
�b�A�Y�(|�+�ZU��7�����l"^v��b4�ǪlRs�iHD��RU�sLE�K8Qf���~����j�[�67�hs��2ʃUl�a�5b�\�.66M����J��]��/�7-�`�V�Z(o�ے��-�ۍ���5�U�.�SReZ�j��5c�GT���ǂӋ��;=~e���D��Ny{�n��i���yzr�B��=�#Rǭ@�R��j��k��힩Se����\�rEa#H�H��e�����-JZ�6�h���e�x�W���T��`^*5Rf�C��,ٴoE��n����_Ŭ���{I<��Y��M|�i�[�2�}3duEЙ�2�@,0��~�x��U��K7|_����'ck_Ic@R�l��&�ds��d��Yy1�64c�'��Nu{�Z/�ԟ(��py!��hJ�B�!*��Zu�Tu@lKZ���'yj���N]�Lfb2�&H��r�ݡ�2�kO�����h0� xOE����{�&�B-H�R(PD�E��r���}~p`]c��d�z@�F4�����
I�|�����(.Rx��	�� ���ua)S����O������pp9���v���a������b�WѼk4�����B��W�������?{���??ˇ{wQ��� �U�{l�@�����{��'Y�a��1X�" �����,�܃�U=f��q0k��h9�&,x�x�{[�
�B?ͼ�����gu������]��O�0V�Dd�I��a���N�{(`ګ;=L4����_����j��h�=�� ��e9��v	=$Kە|�����?h�>���j�-�?�{-��P<\�]n��\`������1ה� ��M�߈滸�az�����_�
�BU/e�9�ݒ.�%���?4O���Kx)q~��/<@���Z�҈z��I��#���C���£�B8v��0��ep��&���4�Q�k�t���0����n��k"G��g��WQ��qdO�Aa�vb�}�'n�,X�L�D���I�t6����^;��8��ӓ�x���r��|���;�do3~�=�>�K�����7��ݽ�*�+�y"�:n��ǓNo+E8�}l 4��`��,W�(��j�Ԭ���J�\��G�s4�o d���d��ܪ�����I{GȽf3]�=��?>�G���F�}l��H�y��H�Ju����Z�+Y��
�J�$�d������G&����ٛ���m9�_Y��!�g��
R�%s�����*\�Wޞ����.d]`���U��e��n+ˇ�E�,��kEK�Q]
��v�U��z���[��yA�"�"���6��r�T�'��^�����gp�5.�k�f���k�V�߸�]U/K��^�Wm����F�R��l�<��rS�J;��̕�1��ķ��_/+�~���.T[�Z��߾*����
ە�U�h]��F��aw���</�ew&��%��N��S-����/0,Ž��bZ<��2��H=[���<狱x]�ʶ(KX�y�A��d��y;/�,��\�t&O�E���'��'�BaK�Q�'2Ȩ�^�����ٛ���Ne1�F�*������o�l��ql,^F��.e⟱��d�H�\�ժ,�Q�z2�\�Mb�ٓ��n��ժn�j�~1_�;p�5��:����d>A%����9�K��6*�۳Ȩ�5�Ye�L��`zCI���;�9�O�Q������^܄������<��lgw�f��PR�W�3�aI�ރ�ߎ�����ϧ;�˟E��{4��Ky"�ܱS�l���خn�u���-]���<|�r�7^�&��dY�/.[+��)�f��	�(��^j��,��4���r��A�,֒�������(�͋rK�GÈ�ܻ���b�6��׺�~�\,n�/��zͽ]
T��lJ��f�E�M��	�^�U�f�{�n�g'�1&�BS�6�������
�~�U'~[�`I{,��Y,�K/�9}�f8XZ��M��(��|�~��s�b���$�W(��=�8�C�Ւل�Hw"~�p3�Ko��,V>���/�ֵ'�u䗌��%s�;2��
Y&�P�[�E�t��Mc	H�*����;��Cp��ݡ���<�%J�[�J����ҝ�V�����X�ۿ�	��„�
����f%P�'G��pK��I�LY�
��!��a����?19���#�)ZY�HoB�J]�*�z�W+�����X�7i��/�Kۨ��t�Vܲ��:# �6���=!���-q`��'l���}ԣ�JO^�|�>?Dr��cO�%(>�g�;�9^%�����O�Cn�|!���(`>���D�9���_G�~y(���K����	�G�HίTظ�]5{��e��K�eN��r�W�a��Mʇ��e��h;�\���K�")1o����&��M�o�6��&e�
R�.`�]w�E�ڍNsԟ$���A΃fA1��_}p�[XTe��ae'Y����{�C7�9��=��>C�6��]�K�=ɪ��c�N������`���萧��Вǰ.��ׅ'�"�(<��Vvh;Ph6�5�T���V���\+CI\+{�;R�D���Q�kM�;��V��P�:�����ɭ�O�p�)P�}��2�h#g��)�6����ӿ��We<�gO()([L3�%�nГ>�A�k:���J:z2
��d2dkN��詠�N�V�F�wlGXS�����b��
m����c�)s�8��H�LP��&����Yv@��L
)ű�2�"�� y�s:�f��d���/�G�1��p����p��(������,�+�C�;RNU!�V��O��3Q6��t�Ўg�
X\�n/l���l:q�	�D��)Q%�!�Ҳ�i�PuF�diUȧ���"+�*�he�C����s������t�#P����- ��d��ȩ�JNa�a�Z.B��;��V��2�w����
�q�!�c��J�L�����F6��b�#����23v�Ex+��P=	Ϥ��<ćY7�h�J�v��*ҫ���	�S�|�@yD�'AH�\�uD�x̓�@�3'J����	����~9IX������L��r��/+�Z��]^AV�
�J��K#��G���@�oˆCDH�Ū�p����f�s��A���??)�g���#�Cc�'�R��|AQ�u%((9�����>9���13Џi�sg�c�V��!�>`����r�ܔ������o2��;�.�21^l�o���5菴�)ā/�]F-)0�����*�d�/!>*��רaV"��i81��,�H�$k��ܷ��},w=f�����6F`6�4y���!n�a��%VVe�hk�<�� �Z�F��D#}�Q�xg@�&;�xK����ׯDA�'����F��V�T5dұid�Hō��G�Z�W8b	@#��et��\Ȱ*I���f�T�~�Z�����?~_��z7�����6Xa�Uj�����\�~�����M��\Q
���/��F7j�m��l�<��.O���=�0+�J���!������_�_2�.��d����)�y ��_�S�_e��G��Rz�O�&��$��A����d��}%Գ�>�-}-�1�9�z�J�{.�?;xс��T����G/��N�C���>'^��g�|��ϊ�_��*Մ�O������?���D�����Yv�� ^)��'��؏t�5�c�L"$��<�Nĉh����M��b4�")䵝�/�(���y�b~iE3ұ��ߜw �f1r�"ղ�d�V����m���O_�@;�\�*	W�j�Б4,�#��^���*��ƷYѱ~�D����>19��S$brR�gr��&�9��]�gP+�^+��G��n����4p��{ף�)1��9�[^�\9w8�ޮ�{D�y纷kɜS�\�+�bԷ��N��>vJ0N����Ӫ���>GR�5eG�;t����
�—��]>�b8-�l�$�\�����N�+L�򬺂��-8=�0��>Ưp��*��C���\���X�mɳ�M��B��j�R"�e���z@텊��t!N.L��RϗK5m��þ�8��ǔB�8�ǎ��=T���/�;N���4l
C3k#6�!�";�Խ~�t#��$"��UEت�A��9;U8UȘI T�VIu�2a���t����0't9�tNx�י�%4�Ί�|oZ��/��P�������}��`�gbƃ������d��Eqq��d��4^�.��\	��f��w�Ӹqz��E�W��$f��W��(��[�y���,��X�`B��x]F��'6�D%��i4�6H]�N�l�6%	.�x����֗����f��;y�2�ˮE���5��⩕1/@��D��@�8H�&%��d܏�	<���*hҞ�#(��	IEŽ����w�Hd�����H,B�>0iPG�v�[>�+,+!.�o��D�i��&\?� �aqGXQo��T���U�Dy��u�9:98k�l�\�rɑ�n���f�Mۓv�>S�x8�+{+��<�F�&������ѵ00�<��sH��i[߱xR�Ev#����*���Ӌs���M���pK�&�IVFX�2��d	�,%�J�F�Nk���1�0d��t����*���)��x0HᱣCik�@�~�*����ˣ�Ϸ��rG wn�Z����ۀ;�c����������
ږ'A�7r���bk8��� ���4�By��y�e�r�n=[�[�z�Ƨ��^����2~$[�锃J�t�2���d##������1�!G:��^r��/�/�7��ؕ�8r�R%�a��%��|2p�㭈di��:��ܳ,�������~H��[�Q���+�-�D��M= S�����c������Y›Xx�I�x�#��s8�F
I��  �:�Y��
�w��ΆP�P��G�K9�t�%�������P�8��	�ظ�����1�;��<cv�t��Uj�~osf���\�
q�X��Z�V���F�]�3�U�M��ofC���Q��dʅp� ����`˭�@�y������SK4�Qf�*�3w;������Z������0"�B.:�ڟ�^��&u��6e�'qm�Z���λ�����E�����Y���yX!�u��9I����,0A��f�Lڔ�h:����W�Q�]ϯ����F��z�g���/ИF��?�)B�[�E�Z��h
_}�<�;�Sp��K�ԁ�ދ^�:�}�Y�vJ�7JJ(��:(�iӌ�o{i�~ږ�拃FL��σ_��+�T����J�����u��S7�x�F|o2;]� �,��W����u��eV�(`��mƚ�e��o���Ew���
���9�Pؔm2\��,yu�f��]3i���7���VX�$H�[8�%����>�B�h����v ��!�>��#�9�ЙlEwx�N�>)M�;|��X��|�z(�/j;*
���[*$�FR}�5E3LIɤ��������: m��'�T�H��nqT�DWШͽE�"j�`�3-a����
p�,�� \���d��D�TRle��e�G�4�e�I�r6Kv��SL�@N��q�W�X�5Q�=JPG��o$��l�蠐<�$�G�"n
�A��X�s�����ǿY���:k��ʷQi�5��E
�r�Я'���+ЅQ�"�)$a�
�������C.Ǧ�ְ�X�T`���,G�.����vC�5I�[��FP�u+15����BŴ���T�v�c�T���s�9�9���VZ����Sd`�ϧf�������.:'G��vG�M�`Rx�"�O��>���Ѓ�]S��x��܆��GTĔ8Jyyz���m�v�gǧ�v;��.A��*A�"g���^YE�]d��l���>pzr���z��"/��_8��^__;��v��G��f�ۓ��j��0�$l�<p���@�.�6<p�����3�7/���c���>=��bߞIz`{}r�~f7��?쟽ܷ�8=:8}��%N ֪�F�,�<O�����4������N��xlv�r�VGO�rU~���B��rBE��H���0%���-2��fx�
��u��uN��b<����Z��ՔW����u��%�*e���޶�rI�[�B���BII�T�X;�~�a��a�zP�qw��+kI}�SD�8P�<�\�D�‚3+HZd�>��G5a�`�@
�8 �,�f��p2faR�M�7�Ű���gQo���<��E+�ó���Q��R���IC3��Ic���xv,9���$�\~1~�T�΅�E�yc#�R��h�.� ~PM�VY��c���4_����W;k�%�M�hv�O
�iD��bS�r��ј˵REŸ$h��)
��=}a�l�hr�58f|��.�����\U�d�4$_��XB���UʈK������H�.�Y���G�l�Z�;{�~t���3�gO���3�%�]a������C@�#D�<(<�H���4�Jc�jv�f�2�I�E�8�"(G�"9[�R���#�`7��R&�����
	ݏ�T��(+V^ֆ���F	P�B.���h62�_��1�W��X���b�|��#\�]:�^�ц�K��~QG|]de
Қ�p*�	���^VO/��.���l٫`�C�H0ns�Vc�b�M�	k�
#��|M�آ�K��PÂ��ʊ�X�����F���2���������K��v\�
hI͈HU�pH����۰�̬�bV�����=��-fy֫gg�/�r��N`���/&��]RT��b�X�ӊ�\\��Н��hڹ\\��+�3��c�a�RX��
�V�[׽�m9���}A�:��]�N�d���6eg�1Viy5�u�bk��ז����ń���z�5#�}�a��~�.�G���O՜?)��Q���	2�h�is�0��W�%�!�uD#r��,�eJ�є�R�vu�[�����.�8���h��:�b:B�����{,?[1�ݰ
��,cC�f�tq~ۑ�D����Aвr�1E^Y��M)�I���]�m�{��/�[_�$@���{�N��I��H�Ҫ��E����)��f�#�(�[Z�I3"�A�j�Z�,�)�J�V)٫ͤ��a4��9b͐M�<�o�c2��.�.H�E�a� ƒܺ=���5(��
�#�:O�	Ѳ���g��fX��f��P�?�hj�$ܳ�pr����JS����|
���lz�`���S���f��T�j1F�d,h@5��M�D�MB�Q��Q����v�S�V�ʯ���u��?W����r#�Y�V���	��ylV�Q���r|��?��l�t�]U����}��$�VϒIF�{����DGɴ�.�u�I�sG��Hc쩔/;������Bi���d�ȵ�#�i��QR�_��O�
N�o�wL��^�ׁOi[-�k����H�Iú
�Y�uq�Íl�i�\��M�l��W/Nj�*`�>�p�}�N����u��!|<��SR�I�7�"я��vܭ���X��]wS_��3��^r���WWj�����u�������j~��1�_|~���3����׌X���$��?�ݡG���ְd�q�S|���J�;w�/�v���2��{
,�jƓ]�S���\/�!ȫ�C^�P�����t~_�s4S��L�\Υԋ.�My.k�W��������?�=���y����/.�!T~q9��r��� ����/.�_\ο��;j�/.�_\ο����ν]�W:�W+�����y
l3s����6>*^�3���О&]�.��l��#˷e=����ߤX�eۄ���������憫#��f��S������G8�5D�Y��A���������FZ�l�'�Y/"]�_nV�<��6c�qۜ����_œ�2l.�w��\jT�gs��%����_b
�o�)Ъ�S��Z����ʼn����$�ї��~a�z�~��9#��	a��'���z��g$�t�+�����	8�n�:K(�|��fX/Ք?�FH6�ܪ��}v�>D'�3�U�އr�g�v���[�b��D?~7!���[n�)�h�*:��+eM츽��_p|�"ʿ�M�����zM	f�,p/W�¿���'�Lsn�mz��`�j��/����S���{��6@�L˫�j~	�i����|[R˗p���
���??@�3��ˍ|���0�e2p��J�;i0�v���^�X^�E����2�Dz��+�[�Ϊ8�����1m���y4bk��I#����Xt���g!+3y0,�
�c��F�N�v*x�9�Z[�څ��Y�����÷��Bg���4�Mg0��K�`S�"6��u��(2�*$�HN���䝸���3̝inF�)�Y����Ύ��4'�=,�pδH�5�'@f��!iMl&.����*����v!�L�A��o�	�v���
��'8)�L��	2Ԑ�(��tǃXR�d�0��q?�
��Ib^����v��q~���o�ýl�������i���/�F��!�P�gh����u[�E��d�ڟ��OB۽�i0@E�#���P��3��<੼4{��Y��)k9��VBP�{��ع�=z���l)	��CB�������ż0�,�����G��Y��T�4�~��J����O���/������Uqv�Q)�Z�R�P.�RkG��R)�ԟȕ*�J��a�Z�r�_��N��S���f�ђ�\I���ش�/� l�v�B�ʎ'��`&��_��k��_������5�_'��h�P!/�b1U/�x�^�o�@M'�|:��-lPi���>
�.���Ag.��Ջ����7YS�ߍAiȾ��/�+�&�-���"�Xּ���7w�h2����b�Ő�:�5/mXԟ�VPa��@)H��~{É�إ$nC��mHV�N�
+>$����(�c��f���8]��*��{�)���o�/ך�/7����'����(�s�
D��8�H�G�'�|�Ⴡ=ދRs�ծ���^�Ti^�άQ�=�-%P�v����� ��(W���ޢr�n�h��ϺqG3�i�ߏ�?��&��WdK��Ŝ�DN[E��`�h����b�A��������^�_�z��N�Uy���Ң 2�."tE�y�+���U}P�J�N˵�T3��(�*d���SA5��W��Nw�,~�.�g�]�8�F�E�$��$<�� 8�AvH0���I��i�u[��͓�����ҷ�I`;��9��i���������.<Y�j2��'㳔�7�~�6`56�,�����V�{B퓴���8�_1���W�.K`H3��h�
;��X��u�/�������ÁN�Sk�g�|�K=WR���Z3�ޮ�~�[q�Ms|L��P�
20j�͚:!�=WFp2�oh�$��qw����d<�/6�k�K
���ɷ�G�U��{1y+劧b� v)�ɺ�~w�۽ɸם��`,�e�SZ�8�a�|�x�ۣ�T�!��)��'�����_P<��'.ƃ>�4{���j�7�'���F����_�q���d~��+���*Ay{��z�J?!�SQ���F�E�v�B+�Dl)2�z73� +H<'_�����Dv��DH^'�]�t4�)���s��}z�qnu�q$O���he�Ĺ��h�/wЍ�3�^��l�:�Y���ۗ÷2E����^�r���kG�y}v
v�'`�M1b�l5�kV�r�����P(RNy���@6��^���P.L�;>=}m��\E��+UDO�Ba��]uКō����q�5���2�?���|���w����9�
u�p�hc��s�_�s�ؐ�t��%ݹ���g�^�@�C�������466�Ppc�R�JD���;����W���I�FCmb���9G�^�������s@���4� �x�# ;�
2'v�n�zt�E�r���J`!`2��h��u�(俷yc�=�W��
����?��$��F�&�dO��;ϵj��Ye��D��������d5�K��nX:9D|�=�4;��
L��I�֬YS����4��'DX3�Rc��r�Ŀ�+1^03����}��d��������!*#�z�m�b/Z�I4ِ#�	J����'�8�&K�MN��*7�No�����A�%a�S�`g�� �*3ªw�
?J62�A�/�^E��D����Y��-F����kMɱ�4*���0��ě��8C�6X����O(j!�A����A���C����ݣ�IRH��`O!2@Q�:q�r���L�eN6�;&��'����U^7/����3��fQ�:�C߱�|�ד�D
[Q�m�r����e�:���;�����"ƌGw8o�1��fQQm��Aťd&o������/Սdq��j\��os�Q�u����CS>�mD��ChT1���[fd�p���
��@�@�[�R���[#�n;R���"80v�r�����f�r��K�=�w0�4e@���7�X��\�/!Fg�+����&~�lb��&�J%�
_��9�La]aJ���eԁ};��'�bf�(�-�QE��F�畡�5�B�)O3ٯ��w�7D1읫������j&J��y���Y�3���F��I��u"���N0Il`�
�Hr�x�tW�g"r���n+;��5�SD�a3y�f�����	�H���g���ɿM[m�l�`G?h�,�XB�Y��܇
|��}r����F@��
@v���E��4�#�n<GW��xcB��im˿fm�E>���w��2�b0���5�Y�J�]ĴvJӋx)Q�ф"M*ﺳq�=(6��{����*��ݯ❯�"�ݱpȭn��oK�T���Ԉ�ˣ���n�a���.��\'���g�Ǯ�m��ɷ��m�.��^`g:����pI˿�2��N�Ϯ�(P�gL���Z�����Zj����Q��0�^��rJTXs).ߟ�(��O�v('@A��P!����^+My~�RS����}E��%ދ,��Y.J��t�+�z��	�"+򲓧����~�ć�?��H>융/�~Q8z|��%��}�k���+zԠR�z�d�η��V�1�@�w��qWt9ǃ�1�T�����%�-�<�w�Ϋ��ӢS�=ݬÍ�r���1�q^�
3�JT���ߒ���8�+B��s�:�]�s���P��4Xm���hРFM I�F{I�az�����CJ�r��=u<Q�~H2F����?ۦ�5�Jt���ȿ��*��B��b������G�Lx�ӗ�RϮC·]�m��O�3w��
j5�*k5,	Q�3�?��4*
2@��Ny��
0vE:��J=�1�
�go-N�1�5���X�����(0�_P͇~T9���d-(�!�S<��Թ\�i�ڷ7Ϗ�>�tIj���;�Þ:S���F�P�����(�ͺӼ%h����hEsm}�G�)l�-%+�6)=��XJ�E���z�pVo98���;�Q��i7µ��g.��4i�+���q���"�P����Of��(�
��o*�u�8���k�v׫��s�b����$#��f@'I��Ҍۗ8��ߘ���A����oA�:��0�ݡy	�x��;l�	�M�ʏՐ,��j]�]z��ĝۢ�E�%5�oG�����M<��_�a<r߿���X$>���s�������ޜ�wk���X&��"�4��_����_=?�W.�ZR~=��È�r$#ZԕJ60����.U�
ƕ2։Ա�d(ؚP��F�i�Mv���Mg�up��ak��j0ȿ��W�z1,C��A����Q6�7j�/U������Ȃ���@��DQxhW��Mz���;`�Ssh���

�VMQt8;#fP�Øv[,�m7�i?]��Bbu!��W+K���]Г�^}Hİ�@���H�0����C�t�=�����
�7Ą�J�E��J�q@��j9,�!��
~[�2�?w�‹�.|9y��z()ob4��>C��ıP��t�B���',�5V@�̨;��8�Q���O����ۇ���B0oY��`ϩ�ϯ7܂�y��!�k;1�͸�Y(2y�REa�(X}�;��E �����<����$6�9&Ɏ�q������<h�tr���b�כo;�<ɧKGT(g��P��6�i�R��@k�Z����po�,�hQ!��M����elP�H�3��	��,��7,�P9�E�\���za��{*L&}��zE�P&�b�Qr����+����I�t��1(T"��;�AաO��.GEw���Pa�o��t�*��M�!w��X3��"@"Fk͐�gd+�y��3�iت,��{��	k�͜����"Qp��h��:v��1��&�0�P ���>��Aɶ�M�R����'��T��b<�N�܅�o`�6;!�K�����/�Z��~�6�Z#HZe?a�f]����f�#є�� �S%"��,�H�vJ�g���� ��Mb+.�|�K���.8w"a��s��@����Xl	b�E�1�%�T����3e���i�s�>�sB#2�_�\�~yt烟�NO:����N��c����VJ�lk�ѴNؖB.�Yt-�u:C�p���gy�	�sOsyQr��&p�̝,��F�'s�fΑ��=U��
NOY�ez�|C3�Z�����±%�͌�ƙ3q
4�m�j�!H�$	y�j�|�~}qtz�9��b:F�0�&;I��Ӈ3�b��U����I
9�l��2����@��s����'����.����h#���̢x>�i�	r.W-�I�d��[�
�)���b�Yw�/�J���T�f/=�!�g�� �uε����=�%����\NM��f����A�UI2��s�`F�wG����np���KV�\\�6�t���o�%C��i��mpFFv�	�m�Χ��j��Nl�oF[��0E��o���1���MSaB�����`A	�])-'�X&�l4�8y$~���v%x���*N��y��;�w�&�}��N�.r	��eJX��P�r�XMP#��2�����-S<����!��O`=��������~�i�.τ��,�R	�X*1\���^`(?(���F5a�uK��Da����_��U���vhX��d7�9��EQ�'�U�
���!9D�!��f]�n2�˨ׅ؍d���w��p�N�'\۴{�K��W�(A�����yQy�nNĂڴeM���FW�&�5�pލ@�e��Ƌ��D7�?�OgGm�����ku%_¯������T���
�a��G�Q��ys�c�I�KV��|�+�&��*�oB �>��݅��ŦK���<+�ьԭ�#;��)Z�em)��
�2/��Ew����wظ��4P��x�_�m�EA�To������3'��tB�w��@'���9U�@+���u~���S�;:hŖ��T�,�EĬ(������7��`޽Ę��:61�Gw|'y��A ��0�����GMxW���,(�0PX}:��!Ӥ��b1�r8,�79���dĝ޶�Td��L���vzb�U�}�n 1:�=�P�G}bUB|߬w�U���H�ݻX!F쿐�ܬ, �W,n��,Y�d��:D��e�[�E<�"�ڗ|
������$f��������=Nt�wH�`���`%n��?M�)�֖�œ�J6S��҅�G]�5�W���踐��Ǥ+�H�Z��+̿hr2�K�)�TP�/^w.��X�(�?sD��6G�(�d�d)�\��!2���ˍr�\N(
@m��\�H
;o��tqt�î��[P���y���4���q��9��JJ��b���W}e�}:��)d���x$����՘=��6$�+k/�~����i�4��]�N�tM�CF6�R&"��~[�w+}�:�G���"��ꮍ���/(P����;/�N��}b��X����W�����6lEEE�*B/�V��I*�!|��B�A�#��Ĩe/6�$Ar��@�7�k�H-������b4��H�}�y���C�-�TQ�~�IF��l�<8V$/����ƣNG�U�$�6G�ۡ�*(������o���nx&��.tC��U(��ewv��l�h�
���@������h茍��5F�O�l���_3:���%���b��)��@[̢�&9���&O��|�>�S-$0Cb�@��tBS����:���6�K�j�]Ď�窷�*�/��-�J^��5f0(0WWľ����ɜbK�[��A��lJX\��A0�������b�l�j��+ĴV�%T"j�-�b�2�)^GB�*M��13=X<6e��4]������aĆF��X����-�;3�����y��]�o/ R�8��HqH!l���[ɫ=�Z1�b�J��S��d<dc(�7ȸ���Y�����Yg���-+%m}Eb�=,��|�d1�GHi��3�tL)����;z`r��(LY�%��5�3������$o��;��r�J��ʠX�V\2�1�N����Y1H+�PVQ
q�G�(#�����mK�!0g����5�|I?����E~y7�ܤ^�+�
�4���/o*>���k�b�C�=��hN��N.�Cg08�5��B���j����s^H.l?��D><u�S���(��('+�(��6u�3�K1���L._82]ʓ.`q|��=�B�����������C�p��w��+Vvxf:/�5��jB�X݃��qk�
ʳX����sIZ����#�!V��2��7�/߸F��9x���W�3�ʲ=�ȩ�9ґ��!�P
1F���؊�A�һ�yI;��_⛅\���s�\5����mtG'p���q^��9�`d��}��r��k���%�ug�̂���@�>��Qg�J�\e$U*�x4�$�$���.�@yU�M"5��ء�7	�}��eA6��*�\�Ն�i��T�N=���Ww��D��l�"V�^����}�}-�Nuz�6����Щ��������~���ի�r{�_��k�D�7,H���+9ǒe.�%����;��TJ�-�̊��ä�Y��^��.��HME^����9<:k��W|#�G����ˋ��\
�(����䭗�)y1;��Tt�v�ٲΘ�Ҫ?�ɼ�C6�+
:�f�m�&�x^|��5�ߌm���	���C?=s�ۊ���%����`��4���Y����2/��"*U8��o�nV�<���3JД�ŁNm*N�˃�O�`��E-,�q�kpȜ�-���7S0�(xpTG�&��y%`{���j���
ɛ�Hr��W���
�k�1y.Dr�#�Q��Q�nmM�^5��T�ҧy��nO�.WLh�Z��0�$9{|��$����-���S�e'a:	�h�kbZ YW��U�9�+M��U�B�g��yZ�)���Y�SV=
F6:�;I�.~�d��u_��V@��y0��Ei����1�B�B+Q+P;H���B��BX��� �,̊���)��Z/�lɵ�'5�k���K{0a�qm�5�ך�Yo�0�f���U=�,&�4�5����9�om�k��9q���u�ԿƱq�ײX�j��z��T��8�ĕh�^b�W�&Q~u���$�ȸ��\	5��:N�x}*�u���,�$vi�h�u������0����BL��Z�%0�<�.FQL��L�1�,��M��J<���*���%�	��Ғ���h�tg��Ff���N�OE�i��ѕ6�ۋ��׻H;
iJ8P��%��%D2 �
ۧpe�`ۆ%���L�i�y"��1t�辤��*Wv8u9Y��B���+;��aXp�!)&���K$��e;�x!�"�.������
�伳"T�,�H�JN����I����9��[���v�[�W�tjSäD0��
yC@H��ף��&��a��+ˆ~l��ü��p��]߄-��`l����ݗG�/Q��ft�K��z6�>��v�?��v�f"��f�v3���H6	��)R�}#�c0	������A'������앃�U���ݨQ��u�E	s��х`
��7t�����=Y�p!؞g7�p�}o���!�*�G��h��y8�;D����S4���p��n|7��� 4��_}e�^]�ë~e{�����E�„R���6.�*�����o�v�}��|$��S����.�
�!����`Ba�q>��bX�Zn��DD��/Ώ^B��ے�(��d��N��v�E��Z�S���Y���bfGA�7ʴ����4���~���Lw�b�2�ӷ������8x�J�θ��̢~�����U?$�����[�;t�q�7=�w���Gpu>snI���n�]�|?࠿�9=AV-���Y[����?9�������Y��
�"�,���;�mzbʏ���nm6P�(������O�GV,c����*>��<Q?���X09�Y�=
y�#��&+h���JϚ(0���k�/��^v�v���y�JwvMu�@���*^��	n��K۽ r����9̣�5���
2i�����\(���y��*��M�/"�D}�:��~oh��ć������7/Ώ��w2't��/��%{���d8�Bd"�D�
�Q�2����1G�RM��y��d����"!r�Kz����ܼ�=5�rv���EoW
��T�W�Uؔ[E�#�X���"P!]
?�ksF�"��������[�o����N�x�s9uL�`�n��H�	�g���R������3p����zҋ�W�O��~��ԗ�Y�I>~fM���֦�Xd�*>�9���BO)��g�`N��S�8vj��D�*l@�]�p{q弾vAx�7�_��#l�����m6{��-��\��gy��Zz����v�#�Β���l<�]��@��j��`Y��K^���ЛK귖��հ�ؿ�ey���З�iX[�r�^8Vp�ޒwW�J���9���ɺ���2��� �hYK^�@	�JF��2�֠�x�,[݇��>�V��/����WK��D�l_M-�נ�������������ݵ��s��ã�`Ώ��
0��s~�ʋ�:s��3Gku�pEg���b9�z�g��-�x����֣���u�u��������lu��G]g��PZk	��P�p=0�`*끩�S[̪���;8yn(O�|�Owpk^�lL���D�0�/�Lٖ[sp ����fO����M��>y§E�ֳ%��Ph�K����E��l��%}�}z~�3�N���C-���E,HWw9��3�*
�2h���)�j���(`�d��s0���H[��zH�:�HGe[�G-���яm�����[��W�	�q5���cT���U���-�������`@=�kυ�	�pAg���@!I�P�䦧�N���u�gO1��̀n̈����(�'Дt1o�7�p*�ө��m4�L��P;EqL��~rI)x����	�t�����M�ņ��|��
��3\{�q-��������R(;�i+�M�G��c�B��@S�f��d�. 2�+L�<3��^P��]oE���=�T�Ϛ�^S�M��.^8�%+YF9��v��مx]��
�!��O�"-�^�$=���U�Ź�bu�=��Y����Y_w��idu�b�S��z�<\s ��q Ѳ�"���Zy��Ṑb?�a�B�R�W�b����S1���}�)�jf���#[��Z�2^�a�#2��N��<ю
u��خ���t�/[��%�q�|9�^�p�_�PR,��)��J��F|��Ω�'p\�84y���5��H�P9B��!T�F���﾿��(*<�L�c>��]+6��<ȟC�Wa_���)J�k8ku�/+*��:�TI$ʖ/�*��D������1�T��1�8���|O�A�(�y�޴����Y���cH�s|�䣅�#HHk=I�.9�f~��Et���H�����^mb;z�F��x����v'��ޤ^�����|�7��Օ�u����n�[�a��;�;R���4�nn7��'�8ޖ����o��S�W�$���Z�oaU~ǯJ(����Z�[����Y�ťlr6�̗�[�>9���؅숉�e���ޣ����=��u�JIc,�>5
l�f䮑{l�\i����U��W�%�-sHNFD������$O;퓋�_r��!���(҉���y�)����%Rb���c���\z{�>�<L!�o�S���Sr��e��n�ˇ�E�,��k��̮QY
��v���z���Y��'�D;)]
�o���������aT�����c8����ToC����k�n�
���Z�z�*t������'hɇg�*g�X
��/ϥ�w�����\���%�6�q��<����W�_e�WG��G'/������c ��?*���>�ט�W=�����ײәC�Ǫ䡿�3�;!���T����G���N�C���=�[�����ӏn�C�Q�\���]�a=�5�V��[��|��1����l =�����z���A��������K8�%��yN���'���
�~V��r4K�a ��N��S��z���Md�'a��D����IB_���Q�b�è'DK��N�T� 	�=��&��X�o.��߱���������۽�X��8�������C@g#�o��������z�sL�n�b)�w-8�M��&B����U]�V2�����������d�n�ؠW4�^7�CD"肞��<����`4������2���nf�1��������_�� 	�t��I$X�m��0���t�&ĭ.QO�'�c��`�wLvڍc��L����x" ��
�r͢�b��Am	0��c���=���	V�d�e��k���#�_FWp��A��v�Ō��Lހ}ϬJb>���,
�
c���H��
��Z���vj��Z�i��;����YWu����W��D�hK�W�,�'����厘u����d1�E�b���|���(�9��H�\z�c�F�"{�\_�'�%C�<E֯�w���!@"�e�!e%��DN_�/����n����K||(ŽН���L���%Ƚ�@ܖ*N�t����3��[�P֣�"ݟ$���Y��c�R6W�	���Z�dz'I�f.ry|^��+����`6���x1��'t�P�c�
��$D�;��>|cc�7�Q��^-ƃ*G��XD���Ǎp#��7����\��*i�̿>}��0�H�)Kh�3̂��4p �;d��X�'����Y#'p�VkhDH���6�t%[�_�2`�	�N�$�*ğ8!���Ie�*x�k�b�lH��mN����J�9��@Hw�e��̺�K�`�s���O7�4��JR0��'
�[�D��4��ao��*��@9VO�g�"�67����2]̮�\��Y�J����D�7�X�C�բ�"M��^O�0�>���%i ��=Y��5L�e��u12�Dn��RBRڃ�������x�;("P/�&c�8ˀӮZ@`7�!D2�Ruƞ��鄟���b#��4Io�^T�=��r��J�~�O��3gpC�����
=K_uf�0��|��xk"��ݔ�!J����l�!*��E.z?%�n2n�o�9 cr���~�9\�Z�E�YVX���c=�3�v��uZc��uȷݱ�Sva�h�y�i�)I��V���Q%��0<��Q�V�$���7�����\k[؈F���{����5�DNlH8��y2����Yy�v!��a�x����ɋ�_v}�{�Ss�{��i����{!~&1��E~+	67��	v�^D�O��;�s�<�{-��r�r�SU�z�0Qc��'���Ĥ�2h�1�����X����'VNëW���F95<c���,�P�dp7Q�\<�z�GԪ{GԹ쎯�u��>9�O�ߜ�3ƨ5��J��٬7S�T!�����|��U.c�&,�kΧ�y��!V�:�`�k����
k#�&Q�j����XIY��re�}��yR�Ie���{�Z<�r�e��a|�>�%����Y�zѬ�{u�`�h�]�{�A�]qk)��Ac�A=�T����_�p�PD��|i%�~Z�2��\����b��][s����}�q�Y}�jz�;�(m�\ꆶ�*,u��j��&f㝞*�"s(N��D%�ht�aR��2U�v���^�^�B�ε�'ǝinU�	Y��e�Aץp�n �K�6R�ZWN�c�qrz�[�	A�� ,e?�y%.���:��0Yٿze]�cS���wK`C]���tZ�tJBƿzP�K�㴕��Y�e=��h6�z4���{"���ۇ&Ep�
�ʵ���i9�H�S�=�;-v�\Ue5�U�����O���H�I,�|~q��5�}8h��_nhߌ�UƐ��ݝ\�i�4�66R����:��W.1��󟐟���'�&�pZ~���s����fp4�!��>��L�5e�e�ܬָ�Š��j?	&H�6��Wwi�0>���[azyC����A�^$��Exzl��|�2�v���[�Ti��L:�~N·����&#���!�_�����3V@�/�q�.��Ɗ�7Z&�V#Ȑ��k����:����Cv�Z��*:���]d�:
 ��4������BX/�
�J�T�Ű
9=�F
B�)��s�1���K<�S���"��W��V�e(�^
ƃ�����=�/���;�RG;�R�$�N����F6��:���w��srW�������O���0��{��v K�P������p�|�լK���ƺ�V�8٫g�Sf�e�l{������l	���B�`��0:{��٪��r���f�)�ۛIRfz1�T%ɳ�ʅZ	��b�+)`��ƕNDž�a�!zF�z���.�Q�&}���9wj�����jhc��WKp#�qp��k��c����2t���ޟ��{��"F�T�>�*� Կ�|�졖}�ؓbaF� ��̗yW�!�ʲ	��֡4��M�D���T�ś6
P���{�I��+0���*%�T�_�4B4_K��t*J���\����'�?+��ϸ���j���5�,�!o#X�j6��H��DXf�V��W��C�T���+�wp�~�9}�w
)�mJ�|�s)і��h9-��T}������baUE�UY	���O��~��Tf��4W��n=���\�؛2�,��h^Y�7ic-��g	�_>�@4�
D��j�Skf�B�P�Vʘ
�U��Mlb����g��y�C[l�.���$#��k��Z��wa����(A33��e��J4�z���;̳#eۼ��ī��O�$7�x{t"�63�^��'��F���/�3�[�^I��;���p��9l��3'�Ѳ<��e����#��-� �T����P�xMWV�N[Ϗ�.�㎔��媝����ř�D{z<sg{�|��H� �5�x?y�*Ix/�i��������j��T+��+>���_omO��Ln`�[�p�Rީ�S,zM7Qk��en�(m��Z��7�xD�)"�d)�i�F]hE�|2�	c&��9w��BK���!�o���xM�k���;��1
�`����J6"��A
���q됕@C��v?v�\��ཛྷ+V�Ǚ�?�&=��;����� Q�mn�-#t�1/�0��WDP�����ZX
A�ƿl�G	���{.G�����}���kL,��<�G���CڥO�Լ{
�#vFs����h*8�Cͮ�b�J���D^�+��"��O�Z�����+C'�/�V
��%�.K���* �"���k��ZŰ�Tf��\.?�ݞ��	T��pK�Q��lؕ(By�0��e8���Y{�\r:O��
�wɞ����
2E2�Y�}�˹K�|�6L�q�m�j��
P�kT��s9�����%`��!{����C�!`h�=�\_���VL+2{�԰K-��7����7䘰�N�'�'?��J�l�_:V��osN�m���������D�sDТSWP
��2�66��� �.(+d�&��0�Ԥ���Bu�-�H 
����ԙ�� ?�qй���mЗ
�ā�N��!�A��"5�@�g�`!�����*_�UA�k��f�^�%E_˂�)����G��V���ϒ&QqT�&�[E�'��
�}�6��d����7TS����
�t}T��]3�c��¨�c�QUI�=VHT�<H|��xְ��/��v�k�d��Vt�	��t�Γ����1
�Cc��Ҽ�2J�ۗ�tm�ι��i¶��I��	lA&VDg���|ۺW���4lm�Ƈ��r��ZQE�3HN����B�u��Q4"yA_M����E6��3O��|����$u_*_�m%�x��x<�4�1��L��H*[W�Q�]�~��s�O%��KT�ZFB���8��.��.������\�B�9���Nf�%)���͙�T�~a���3[@�	�]�&�X��k
��
�E��G(1�}qtq�}�ռ�p�̀�_��e@�Ѡ��vc��o�4mˏ�2�Q��=��}��y����n�G� �\��>�K9����*aqn򗔔p3��bǕ��X��M��4@�܁�w���IeKm#��r[W�<�T�K�
m��lbt�2�Ľ�[����0�v�W��`y��n'C�1��`3V�gM��_FJ«��a�J��.!>cO�go�U�blb���.�����*�¼�z���wյf�Ї �>Ž�����>�/��*U�V��ux�S����Z�Pm�T��y�cO��~�Ԩ���"�R�5�v�U(�q*���
���>,bz��[�d��t�4�m)��ih��H[�2�KN�lj��O��TZ��6�3f����/����� �S�(ho�l۪�;؈o==�F���k~v�'��c~����oi�ڽKbq��'i������{ɷ��R����+ut�俜$��|ז�Ha1�d����9)ttw�TjOO�3���ǝW�?�Q�<�ٻ_���e�x�WG~=��`�����y�Ա~�R$裾9o�}l�-J��vh?��AE�@���dY뢵��!�lYA��{�݌t!tN�����bWS����v7��w�F)����)7���\z�*;a�.W�T)���u�~?9=k_�9;!��u��i���ء��Ӥ��K�)K�닎R�Qr���V�*LM^J�c6_Kz��c+P��09�d������<&@jh���{ʽʯ�wΆ��Nr�sz�̸����֛q���o)uT֓j���kd'"�Q']��!�_$�`��r
DOzս�&�X��>N�A�f 
�iI��ޯ�@X��U�$O>��%�r:��C�Mq`��]8E]���F՗n��&ҍ�O�t��l�rC�	B
�Y�Ơ�y��2�-~ֱ
�k�V?+-�¤}�,�0E ��Ak���k��lc�����P����'Ìg��O�3��gm�������u��O5����_���* �HN.i�?�j*������T�'�H��Ŵ�^P�
�$��8{�HY�
�g�2�݉8��c4�Zqx̾>�`�(�!�?��9�xA�1��x}�;�� ��|7����q�z6y��fG�����\�Oލ�8�"�
p��� >}V	��l�hB���g��d
JU~7����&�w�8N.��0�(����vy�".!f��⛒���Sw s���D�Qw&턲8¤P�BͿ�(���D%~�3‚Jj��ј��G'�9�7�t]E�� �D.2�-y<�4MQ��7M��U�]����ѶU���@Q�j�/��
�2ŧ��d�h"b��x����}�����\9�!��5<_;�~9j
]���XΔ4�C����*��� ��H�_zv���
���bځ#�&�"�H�o#�
�*f/\��J�Sc�S�Ŭ2sÁ*��S���M]��-��/׭[ܕ�&��:�&٪C�5��5lMT�%�R���#���Q��R=�V��a���%�I��Zwe�j��1R�{Y�&gV�C��g*;"^��h2ݖK�«!~hP穵Xv�ME�%s)(@�������E�99��'��u�$�"��\�Mz���C���6X�<Vߌ���M��5���7]��v�:)��U)#U���Ē�OZ��8�fāb!-+��)����Z$ɷ�:���<	�{�����WG��~d�.%~?m�.w�}y�M��g�������n��e�eD�N�Aߑ��{>��9�a�9��`|M�����w���R���$�^CL��P2�	��G�aw0�[�hr?�u�Q��ڒ;��Ѥ�wAb�o�OO^b4�:��jL��h;�����	�?�G�)$>�����a
#t��Ro B�!�N���S����Ԙ��c0����+Ղu��`	-�)Z`�?XI�3m�:TK
����t)����`�R&'��ذhb�r$Ԃ�/a�g���W���v{^N���8�7I�7r�3-�*C���!u!g����%�V��T
���l���;��B���D���d��`׭���6m\)���M\x���Q��Q��<��Z\�k�e��u�0�ꙺf,�i*��T�i��ĽI~�[&7H��1�
ԠZ3�U��"E���u��UjE�%?���n.��WΕ1<0��U�Fu�Rx,����PH�5ƹ'.'��3Nx`�G|5�
�
��Gl�Е"�Ē��N�F�������)(W���/�$Mfw�U'�]�?\\���q%`
����w�ji8yW��Q'-������ܫq3�8���ckt$���8O�3E�Dp��:��c�Q�*g3xNЁ�Z��H�\l%
�)k3�����A���M�2���O�\�(̀̓��*c5<�%k�eU�ծi�-&�
kL��?8;�8:�?�I�&�54j[>���O��xj(��
�%ی=-����Cգ��@�}Nք�Fv�x�ʭ���zb��ƚ�:s��bf3�5����ƒ�`
�7�]۞{g�K;��ݬ�K�V}���V*���v���h��<٦J���L�3A�Ԥ)��Lod77�+��c��Y�O�cG�YY�������VUP����Z�k�Y7ކ�&OA��+�j��\��<��Yt-�E3��v}0,85�-�����<�$�����/_�F��I��k)w3�Ow�>}���v?Nf�h�7=��z:}z[���/�uZ�7��0��B}J�4+��>l�d�
��5�9'��&ܼjղ���|�Yݥ�q�zǹp�a��'S_f�3���"��g�ol��l�3C�Ƭ� �A%��J;�βޗB�ll�pO$��"Q(š)�E����@���=&�}��ʎG��B�|��41g�t���C�|���LV]2fٴ�c��;���Y�	Tp%m�<�g�z�(�����;�������ժ�
x&]5
&l1ݗ�8e4k�����a ��Mԝ��[ۗ�+B�0$K�r�~߶S\�`5��n�`��ĥ>�5k[�Ͽ/��m������ߪI�8�<���
Ky*����n����An�ב���yq�����B!��M�T\��
[�9�'��qZ��%wƴ0P�p�	*U�����ݢq��]�-Po@
ް�V����,�R��i��� 1�}ل�/4$���h	�Ҡ໕������^��=\b��G�z�ޟ�1�]���\ՖN�p]��B{%؎��M�4q%P3/w�X�U�z92�b�L�\Պ��Ya�/�T��l���_�0_0 ��{���t������0Ռ��Y�u�8�)�IMr�(�A���pl��zzy>�Љ�����Jm�ǻ�<���O����<j��A�&�c��'�[,��a4���Xk@Ql"6-L:<Qֲ!Dc���A��{��b�&(�����\dρO�l(���RWR?�AuC��W'�$ �wj�U��K ��J��Hy����{;mc��fӯ|7x�%\�5J����� �	׼�s@�wy՝p͌�����SW+"hRW�Q������%��Q8]B��W�?ɿ�?'�4W۩4�`�AW���B�[#MH�FW��q|�"����qV�<r�e7��KK��.�?�����m�,��¥���`K&�үŔ�Y��p���f��b�=��uX�(��Bn�ӽ ]���	�@�j�դ���́�:���7��VZ�>3݃o�=X�*���\�2�&R�Z�n��m�����.�H)�����'�[�	#QP�K��7�f#X%I��L��}^.�}�m;�����9'���÷`/�<�z�j'5�N�����L�;�v{׍�A�'���.��h�	��HQHi�tu���
ʾNӁ��)\��=�4%�"���
,L7�
�;(�n0���G{��ƕ�D�o&��\lrc�kƄ�ː�dS\�#pN�X&E+gߚ�z�p'��|Of}�o}?-F�Y.��N$B (C�9";���V���*AH�!��Pi^,SU�@��p��7Kk
�9�Mn��y}g�)*Y��ӛ
�^w��3�7=�NyϮ�C?�
U"�;��A�>�a9�
���e#{O����c¦������O:���p���R�7��7��ޛ@��o���#[>{����ޱa���N��Sk��G�B���JZ��ʍ��I���x�q#�>�-꣒_�R.����=���Xi���l��0�	+;ժ����ep,���}yfl���qEڌ �260G��9������c����|�����Ν��~����������r�|�;_fHk�L�w�����ʿ�?_�;o�?_�������_�3���� lT=�����������)��Z{��F5��DI�����	�B��G��]u�̕������18�A�lyO�%��<Tb���e�6uězyz��嶅�'>��`o�W��2e����M'��h�u��{�=�Q�ݗ��A�m��#��y$������2yN�c�Yd�X��Z�b�m2��ƫ�Կ��5�yչ$����6�Pj�+������,�DɌ&�ώN�)KŦ��Dr)B��-'q��b��5���(����JD��AONO�v6'�WO�,mHX]�.���K�������c:C�M��II˸��&� ؈d�f�&ٶ�߼���$����l-�Ǹ���a�b��c����ޱU�^j3L��;JU.��U��X��q��C�%�k�rE�D�JP�(�&9EZ�glY%6�����ǜN�Jfθ�Z�2u�[�F�UwL(=�V{��}�Ӧc�~cm<z���r�vf���6�驼xAf��xXV]���V
6�\Aw
s�����Iig��p&gQ�V��
�,����)k�YtM�
�b�m�3�Y��r���ͪq[c�\����������όoVCX����˝���"��g�<��t�����Le]�v|z��FC>����i�.����t��rG�9*a<3�KX���O��TAR�DV�"�n�/'�;c��SRpP҂�H$q�><���:2;��n���<��W�lK�ژ�"���}���I�����/����;�0h��4@(�?e�JU���b<X37�Tљ^Y�&T��c��E���r�����"D�%N\���n�a�%�����q~�-������WH��<Dž���]�D�԰����vmfWף�.�=~�1�a���!p�Eg��l����
I�������y�~s�5�k9�h��<R�ݰJM�_��$��z1m|��h&�ؘ~�g/����_j5;���{[���X���6�Q:kB��݉t߈�CxW,ׇn�=�Ϩ�P�={8��bh4镶k���}w�*6����V�Ujv�rz�E���&��.��Tے�>�J�=[��}}\��U�>�env��ֲ-�!i����C�ӑ�
H���ਗ਼\�}\V��W3���#��koЋ��).��,o�K�u:�k}�@fz��̌c�@��_>=�c�+c����7�j(iZ���n���B9M�7�fz���'o�2�9'q�ҵ�S��/����g}��{;T�e�e�u�)���C�����b&�Y/�y4���eق��$ά����C���R�*��܅Fvq���F�Z`>\�z�K�zt�>�?��gmC�i�U	wPVђ�LƊ����YK
�{�J�#��q_Blv;����D���/�N:���g/�!��f�' ;�&��������Co�
������o�ڹ�nj��2I�A�T��Q�wS���L��NC��Я{.r��V/m����3����?�ڕ�{�{I�*=3dh��`�_D�3<����U&5V�'�����T\�Ef&�:�N�ͫ��λ���?��IG.��|*
�I�t��r%�9�J�����$
z�'�@
���f�*(���3�\'�;�DW1s�6����2�1G��~B�w��)�T&<G��iFVE��E�9����y,{�c�֜%vC�̷|Nt�^"�-�[}̭����V3���ӛđ;
��YB��}����߽��;�z�11q&&�<�a&�7z�	 Y=��Gj��C7�qO�F(|�vm��>B�gC�Fv`ո�'wʨO�r@HR���$��?lB��\�e�"sγ�ȩC��1O��`�g�)Z"�����3�q	zE
000��0�ް����a��b,Y
I��E31��� %�A�X�ǽJ�v���G�B�Ւ��q�s�uYZ����8��v�
���{�V#��)��X����T�Si*KlUz@�q@�ASJWa9j�z��fk7��D��d�P
�et�={�})�}���Ā�kPT��I@E�N~1�������j8�>�F��0�6
"�'
C~����1��kS��Ө7��	r�C���ZU�0��
�Zo��8�w	Kç��K����R��EfN!��&�~��1�u'�W��D9,Z��Q8c��o�����|֍�p��&i�̟�:���*�I�R��޼�I��*n7�\Hf�H��j���t
����Cgg���?
��KA6q'+e �6�0����Qb!�J��0�W�Y8�(,��u��A���Xa��Y�H̄�~�R��5�[���ZԱ�Ue̹�9_F}��|ؤ|�Y�c1Wt��\�.v��6^L��h���q����-	W�Zyxف4G�_��7q����\�_���ߤbޠ_���lpM�.�D���'�WؐJ��=��Z�Ő��P��f�������y�:T����w�5N��J,#���ߝv^�����OV6��3ʫm]��?��w�|��]/ɡ24o_�;�:�(bd��p�ێ��3����p_���|x���T:�M�d��c���;�t*�u�@r5|���g�7,�.�+
��w+��%�,�M�I�'�P�š>�j]�Q1Gq�������r�	a��4\8��ot%TL!Tƒ-��v���hꬶ]��U�'�V(��҃/�0��N�f�n�ԡ�3��6Gv�$���_�/�)M����f��6�v�_����/�R(�H�yMG�oi�߃�HlJa��ff�����_҆,a�6��L	9��
���Ch����_6)9T��SS�����R�kS�j���{2�9,�Kd
#��H�("X׭VAZ&YWĞ���a�����T�K���������w�[�e��Fז����Rpsz�hv�؍�[j�B�g�8��v�����CWw���p-��f�K��ۑ��rM�V�>���g����&#�A�BhO�3�u67��(��%i%G�"�b�5g  /Ё�R����Y(��S��hqUc���a}�(L��*ӕ���^��Лn|s�'cT�P4h��n[O�6�+r��!��N[+�!��[���B=�N\k��c�J�Y�l���F�}1^�.�)
K���wr$���GB��0�|+j�X܊'ޯ9��٬{�P=VwF��ɴė��a�q�w�ZZNt97�~k3i��R��Q>�I�*�P�}=3�De
x>H!���!d8x�]Q����2<&�|a�|���:T9��K@��e-O�J͠YU�2Gn䜨>8�8���p�M�ڔ~8�Lʝ;s�]+VF���)đ�i�r����w�N^Ha�}E�>�\p�M�V��vqt�v�~��6�r�����+�ȶ(�G��K���K4��D[�ӓ�����MD易�t3�Q�\����wo^��"u��"y�+l*E��Y95 YO�N�Nr�y�8�rr�`f��[CV�>d[�B��D�ɉR��D�_��q���A����H���s���Vb�}��Ox؋�)����(zB�0��4�*L=��Ɠ�ѰZ���c�?m�ۅ�|��C�eY�)������]�QQꓮ�
�)�(h�cD2)V2��`�v�]W�ws����P�/��;�(@2=�9���<V'�i�ɶ:�A�Ӂ�n�7�d0�Ί��f�4G��d�Y��0��XWV�b�Tfӌ���俣1a�3�����^wֻ��u���	M�Q�Y��I�]+�Z�����w����s�.�)�����6 K�(��ZtF�B��^w��!&þ�*���K0���C�������볣�/�y߄&�
��
y�gU-���hU��|&,.��?r
�y~|t�(αĪZ�{�d$���!�?��)j���6 �L�P��ZU�.(R4z}�
)VRU�^XV��s;B�� <�:=|���]]v�V�ol�^E��naV/�,�����\�s���
���ǫZ��
�NZ躷aq�*�`�1��\E�/}.��N$��j?��o���b�Gc����wU��������7�`߀�`��-��z�zѼQl.mY���U��&�S�zY,�-2���
]�a�v�������'���W�&�d����x��ѩ�nҐv�F�v1͝�lN](�@)���0�6�6�}���>r����n�a�e�4J]0.�,|�^��OŞ�fr&`{�����z��ߜ�_��uo�h�$/Ċ�;>M��w��lG��7V7G$�]�9V>��zI�cX|���Oy�M��-ߎ�*�}����&eDh�g~�x8Y@80[HԄ���m#l���d�T^SR�M�{+ry���>�JZa����+��ӝ�p�EB#�b:�P��.{൹}E�,��|���W1�힋.!tSo������U,�ՒD#��0ɘ4ʴ�=T�ݵ@eϻm<1�1@
2nz��[���k��
{�{8��
��A�P䤾$�]��>*�y�E�f�%�B��ihEaP
�E4W�\l�[1��Ѣ�t�6e1�B��骳�o�f�6��K��Ʀ:�����p��O2J&�$dI�DvL7ɘ��s6�K�Py+�M��C-־.k�>?P���6;����lx�R�g9�Dܓ����ak�w>ٯfnFD@G���II��q�+�dq8ƅbq�5�O,�#��<:KNf �,Yj�;�����������5wݫ��3!�]����u�g�J�Y���*�U4�Գ����n�p�Z���\鷃�|����=�$O)�3��T�A�?"
��Y�J�Oנ�%{���2�/��l*��$yZ~�������k�\��c0Ğ6��G(4���-P9�L��u�����M5ˉ������;P�B
~AN��۷�p޲A-þ��~Գ����kQ{���C�-)�{5X\t�֊.�E����S�5͢�,������ǜ�3�NӬ�~�*��gW�2)Rv.�M"Ju�ڥ֠�#�fޣ1���
���pnU�LO1qi%d��.���V�4�*Y���k�b�FRЖ6,O���s2S�ƍ��5����_��_�n�P2O�r���72nܤ��G�6H�C~������;���e�pox�Ny{=U�"r֍U��r��5Q���Z�R�.�,Yn_�4��%�d��B�lxң,����\e�^5�k�����
���Tx�����uɌ8�i�}��+�ᯌ%����k�
'KkiÏ�-�|�:��S)3���������O�%�u�:ߕ�OKS?�O__tN��x9����`*f
|�������-�,g�-��dI�(猌��	�D%��%"�O�T��N��s�r�o]m��v�e�L�<�D���������*`h&9����;��q2$�8C.�$gx'�ō�
go�v
Pømۚ�卿�?>w�iY����ы�N�N�1Iʘ� �׋a-�m��*�)����BqB�aK�N���%�]��-�������严r��'l�,���������ۇ�,-mXL~���\M�ߕԃ�,�Jk�+,*Le\R����;��34�f؍ʯL���\7��tf�<���ݱٶ_$v���@���T�m�+k��}����&�j�-�i�t�G�"3+{#��7V��?Vc;��7Rk�{}C�ek��Z�j���7��7�U�q�%���V�{HHb��:����\�z�Ӽg,��
g�;|���{���:l
�gq��!|�����Kd�d|�{
����8�BP���Dj;N�"�v�bYI��~��?N0���S0�cg�h�%'�}zKGsw1O�����g����V���=5Z��?�9� �����{��u�C�v��Iގ8�#�5�
�۱��I�v���4o�4o�^��)n���s�$*�&ә{��3^9l����P)�<�Nj�َ�zzf�+M�Z'Hq)Av�b3�:He`�]@�X�H��`�^�4h���5c
�ߨˠ��G��VE�bɰ
�?k�Vr���dɵ^�=�Go����z��=c*�(.x`�Ʌ�tio����Vt��AvdH*	�	Ul9�����(��$������t:�
�a$������ nJ�^+���ŰJJ�%j1�������b4��Z�<ί��Y\�
j�Y	�����A\T�Z�Q�jJ��V��}~��9t��9Q6�Y�AI��F�P$�P.e���R�ǎ���4D��ŚQ���t}2�R��[:��kpB)g4����^��!a���Zi⏨\≲C%������3sL^-�.:��:���fj�yyݘ�Y�\��:CrX+tr��i	Sf���l�9�Si���`Y �RR)am
̡¤=�Ii�0�V���uh�h��Ż���$��0:�}	�Hv�^�Ň��}r��̣�ЬpM6�6��^`�!-�����'��]1+���2F�ѕ�p}��K^.i6�+N/�e�^C��?9dɣ�lku�m+k_/��^(+��f�a\��mY��}�N�0�5�B�Z�&X`ِO/ʞ�Dl�QJ���5�J;T�:���:��%�l��d!IzБ��?��8>z]�����m$��������-{���V�d��%�K�TطK5�3�c���C�K��5C*������^c�B����*!����š�����w�S'+�>'9Y��bf^�V��0�zP,�<:�b�`�"}a	���<�ج.�z�q�;���qQ�Sy�R;��=b7y�^e!�Ѯ�w�O˫PR�2A�E橛�5]�7�����!h͆ӕ�Q���.��������U)�h5�3,���1��P	bi5���_*8;.M+0;��LP��s����lI�גOgh��JC��bݏҞ [7R;ɫ�E7������s�=�h��W��:��)�TÙ�	ʳ�А���>9��0~�X�˶�{��GB9�r�V˰�7�Ű�q���H<�����e�ֈ���Y��ĽN�x6!Z#~<���B>��q��=�u���j����q�-]�B���6����PO��'��.>�ɼg���yI�x�B�Qn���~zX#Z��3���q)��H]1��n���_�ƬTk�1�w�Y�/�;��W#���^yB�[[B2
�s���w�u%d$�[
"aF(x=g��{x�*���Kʦ�>���@��z���a����=S
_�=�O_Co��@ʁ�W\{8�=Dg���<�8�	2�c���H<�#��t+��"������Uo���qa}EL��|�<,<_$��5L��Es��έn���U�`�raiwUıyH趛{���KXv-
�jc����LG�ׇ�u�'vE������y9Ι+��/]6�_Y�kŕ� �dh��E���%���Z4�	jugE�OJui�N�HĠq����m�96�z�w�!��������T-�ڋ
R���M�=�8�=h��J��5��1�b���ff���s�#�|�A�D���"1���}�C�����}]h�Ϗĥ?R����J%�Gi�j��T���3���MZ�eX٫����'GdU��
x���cj
b^u�~"�%��x��"��>��S,�����Q�|�t��q]�&#_�K���-�lӥk+r��Ub�-D��uc�Q1@y���c
/+ڀ7��J:����:SUpd
�-;�ӆEQz�Oդ�$&̦{k�
�~NA��'dG]\2Ym1s����L��O���?�c��B5C���)Z�"+����\�`�[��쎰��w���h�^�\3����f�g��w���f�I8#���N���J4cV��\3��Op�O㳥�e�e�����,�L��5��BM*~�w4��a4����p9*M�Y-�Gk5q���[~۫�He�QG8_Vﭑæ�5��_���sפdosGz�tV��?��G/�6�l�Z�oԊM�}�0'C�?��%���U#9IV����NKw-���r��7U/���rJ^��Q��d9iSiws�X+O�2���L9\ #Y��a��6C��UJ��	$���/CMI9��/NR�v��g��ׯ��9%rWd�X�e��甐_>4q�אܓ4'C$��Y:��`��9i��0Q|�Z�)�Դ-��k�
�c���G�l�d�\/6��$�"��j�:l�8Q�̚ J}2`����f�vf���>��7�Oi�8�2�O�:�!~���g�
սr�d�ee~���
�=P���~�Ѓ��p�מ���1�̧K����<(��VO���s�T?)h:�O�I֗�'M�K����R�$�����X��Ǻ\����=R�h���}7�OƱE�{P�\�k{+%���!-K~~����#Y�O;����2(e�v���>���ԽN��썈���ɁJ���1��I�|��^��R
�@������Kd[�y���~��
TJ_K��lk���?[����}�݋����f1�,J�� Y�Z	��:ɚ�y��t��f�u*>>�/V/�'�)���Ey�|t��z89���s5�r �e��+a�|wH��
�CEY}C؟�3�y$��u��]��^�m�{���$3g����<%�h�f�RL�>�F�Ɗ\#Y�}�����O��D�ש�Թq��Q��lY��,�JQ��9f��Z��z9�JV�?o�{_��w93O���[(�
��$eY�&SI�,u�K�4/}W��aD��c�����^s��*�RŊ�R���W���J,�";�T���J�Ap�I�A%�J��n6�_���<�T�`Iސe~*&?�����uy"�T�{���3��f��&���`F�����*F�i8�7��R��V�)/+X#��r^��K=l�gd��̲��_��,S˒XY��r�a	ÑU���ߺ)�V���RYg]�Z*c6�N0u_�A*���ee��/�o>�V�o��缣���Mpn~)~��S6:)�T�^�$�ڵ9����Ӌ5�|�	�v�0��N
�e��Y_����x�n�ڀ�j�gMP`�7aŎWRw
�ϒzc������\��t�.us�2�%�-�#�$s������#|!��k�b����,�L�@vPfRA�a�b��M�p'��� �V�$��e�7�+�o�����<;��;u������.�;k�vС'��L>�#�F蕐����bЫ�H�Ht�wb:��<G��G���*%���Q=�tB�"p#���R���'�k���l���Lu ��a���#w<�6j�1懲L�B����$o�|u:�;����oE��\ST�4��F97�͞Bد�ݸ��C���Nr���U�'/�;l?�M�?�uOO.:g�_�̓�,��.�"Q��6&�/і@��R�s�~
z��?��I�e��b���ȹ�*V@ϕ T1%g��'i��i��9�`
³D��~�+�������)q���Ot_��i�/1a>����GP�U�O�%���v���Or+��(s��H���ugo�l1й�E���g�!|��*�a��YG���%�x�����Ȭ��J+����d��$�tBt��#�8J����#�^tX"ñŇW��j���
�a7-ӇBza�=gKP�'�c�[�:�ƨC��z��aH�x��y\�e$�m�1��4���y�?�����zk{�5@)�nn7J�F��m�1	�o���̫G�R)��F9���\
�"v���r};PQ
�A�P(,�o�(;Ay�ZN�@	�{e�_�`��g�G�'b�|Trޞ����R8ܿh�M�Ze�Qa�r�Mk��"l62���%,�����2�D3�!��q���h�A��v����g"D�}g��Ar-�O~��[՛_�g؛���$�'�r&~�#ŗu��
�Q(����G�[8W�c@(��N���5%���󣳋︛e�;�F�*���ř�|�|��HT�ܘ��;�#]�X5��~,ʃkr�-����Ͽ�3�I&Unm��8�Q���)2�����{�j��!mW�׫c��V�i�oaU~�ԃF%���A�Z�[��H1�;�M�&���r��'�o�Y�]�@����uz;ӯ|ۥ~i���(Wv������v�	��S��.+z�,\,"q���$�;am�RGN/�s���d��MB�~F'1�l��b������;������3�r<�C�R����Ҝ݊�\(FH1�75!Z���8���ݾV���v"Fp���iw#Ɠqi0�>?Z)��4�s�ӛ�O��~u����nv�
o��q!J��/���l�ND�K{���g��h~*���Ha��#��%�q�}�c��=ȗr�!hw�#.n��X�����v$���/D�jU����lp}3��<>/I������f0��W�y�M��ՠ٬�P,},Օ���U4�%M`ƒ�:)0�[zƏ�?Hv��T%859Գ�WtrV�$)2t�`TR���u�$�"T�Z���{˪Z
zQ�@H�O�=���Uo�q��f}yl����@v�޺��1������EFP�_R�]&�V�Vl]���"�Y��RI��J�9�
���;�'��)�'�;�c�=�1Ať<��Fw�{M��]bȠ�b�	����5A� ��
BƼk�������	+A�ߖZ�ΫW�Z����E7�E��jm{�I*���Z��M���C�!9�gFb�3���1辩�oPKp	���1�x�优l&��
�����n�
M��r8Y��PY�\=�*�5��J�2�;������^�
Ч�C:����6��\���%�:�!�r�	m�yq_���A(9�?"��&�3*���9t�_�cұ�����>*Ϥ�nV�N���W���i��g��������Y��T߈����͋gH{�-�^^dQ�La����Y�=[��7vk��!�/o�u)T]��-�I��1��)f�)��ᕸ�M�Ţ?y7~ם����Ӣ�Z@J#�ё�t�n|j�ry��X-�AV������F�Y[�� @�I����?��64k!���� ��B�{��Yp[��=�R$����(})<��M�C�T��FB?�J���Qa�eޘ����CKz��Y����AN�`7�:�?�`.Q�!>��`]K�^�M�[��kcի
���fQom8s4C��
�������.���k��=��K��`g/��m	��[��@�HV�L��[�nƻLݎ~#|���m��s1Q2��]�ߑ[��|A�pr?�
"mC(��3�;��b잗�n��*�I�{R�&�58�ǒFv��'�ڸo����PԷ�*甩�Rk��YL��1B#��$���Rl~�v����S�f�k�J9��N����e�ڬ���:Z��=t2U��Td���d�u�Nf!YEo.DM-T������
�&�3Z�	ÿ�ڰ��a�\�׸6L^�{^f�_6���
S��+�
k�6�W_��_�Y������ja���s��|����_ޅ��!�ڪ}�	�`�l>���12G	4�|=���_�:P�u:v:W��B�Y6�m�����΁O�^��k��~�r���.|��D��+M�?�R�_iޗf��Y�}��\Y��g)��{h�/��l��`��Or�;�Az/��ٵrQU�8���z~��nt9��LP�M���CW�J�X�`J���L����I��K{W(3��d/Ъ��p�U7n���*'����1N�U��U�6Q�*W[��.�_ ���
P*Sz� &L��<ș<$ŠL'��Pp+�s�
L-AVX{��0��"6�z��,�|t���!��f�w$��M{�"lI����Mf����\y�<��M8h`*�#ݴ�a�7��\���˳ǻD��Ȟ�++�P�>N^�ߤ��l�`�y�ۧQ�g}���$�(�ëF��/M0#�;�h�,Ɨ�q?�s6R/1��S�[��M���6.<ݒc۲�d�l�}]
Αk�\S�'��M$����Fץ&���uL�pP�Qe��X�3�qrM�O�t�QTt�x� ��B�l��"\T�9�\{
� *I�G�;v�ŷ�WG�#r��r��>�8�0h{�R�?�^���(0T̮^j-ɉ�7�g*��4�3�F����M�*dN2��ڇL���hݻ*���0�?�AL�@/��� ���
�ڳH䯤
��_N�Q�0A�Ɛ&�S����ET$MG'�G?眚G��`:�=�I�������?��?x��5�R*��Ki k��fK@��&�̿o��O�Jс�&�2(Gm���#=�����˴b���9̞���I?��GN�҅oϼ��םtgf���/�]��]� 6�����3x��S��~�1d�"<�0[�NNYw.'C���"%�<^��<VΡ���=����"D���Η9��R�+7(�Z��|A�-�A���p��;��_�T�k��Z�A��CW柜aUe�2U�$gZ-�xȣH��z8�����1^��6m���~�;�T=*�ɳX�Y��/+f��w�h&a�f�?WM��L��M�WT����PV�lE�Am��҉Э[3�!���S��մԒ��ޛ1�+���Z��t
�8ڑ�4��Q
Nr.��l��3[���Y��Qd�e��>���H�ɂa�,��$����4�ճ�M;es E��d���G��C�x��nh��Qi��������
m9�7���7���ڬ���h�otC��o]yC[��c�#������^z�֫r����A�?����v��`.��m�u�+��轨�Q����nͫ�eO�rR�U�R���Cڵ-����+�$O�$K%��	���
Z��e���{?{5x/�1�p�Ơ�\t������z�ށ���T֕�Y)��ע�/q�L4��P`/�KQn|�������]s��N'3J���t�w�'���N�^c�ó�j�]��XK�<�F��^9�oŃ��&W��}�T��Ξw^t^��?;�?�~%/��܄�i����o3�p!�Y4��a�bW�^�`�Zm0��=`���횔�`��T��8��
�A����jp����5�J�h�	�8K��@@N�R��`~#��F�x0'CI�Әq��c⛉��|;����ċAoЏ�g��!1��$�w0s�h�M��z:�F��d
�@8��L�F������2�eK�W5�`�xI���h�Vz��e�0��0�2��U<��Sv���/�7p�_�8�a�c�ߚ5�l����Q�g��AQj|LOC�@��Yԗ���x.g�
�����E$G��o��+�r���혜(^{cq3�>K!1�����R&>�h��.�}�ީW9ۥ�J�{���7ͫ�^�r�l6k�W���4�
�o:�p묑ZJ�)�]��?�쟽�O���s��-��T��G�SX��K|��bO�E�.h2DŽ	�"G��H9����㋣�΋��W����Y��<�H
n{�����*|�	?�T�>�C�$~g�jTi�ȹ-~�"�����%A�s�\�jp�_����
�а��l]ֵ�����w9�2e�8�'�{����i�fr�i:1�q��1���	��
��+@��/tj��&�%��4���m]���x2��O�BX-�]�+���ҫ(�½�&������7'���)�rM.��UY(`X�'���KIP�	r���Na3 Ň�<Lx	@(��e�0O�8k~W����?�i�|�a3�(؏��ӳ48~�
PɅrl� H2F�5c��;<:�;��CK>؊��Hŀޑ<� ��A	�3aM�Ȅ!2��Ke"c�	�m�"���Ȼ�-�.�Iq��Ջʗ���n�r�/_�\����d4����}+FJ���v�6�(�`���v��QQ��U���ŲbE\IVwE1DjD�d�\n�qgj
�jj��N"Nr`�i�����%E]g�"_ꩧ���}%�l����E�S	�r��ye�VE9����f�Jε���mq��q�r�c����!�Coa6/��G̤�Wj`�V>�-��Р�V�m`�~�(~����j╯1dHA�KNv�Z��� ����0�ի�i��owM�D�e�+~�A��W�X]|�|��6ꎘlÈ��ͼKUg|���"�P�r��>����(��(�d�?�Ʒ��d��O%K�/�����s�����B�Z@\Hiw>���ݐ�g���A�p��VCג!�{��i��w��V�ۭfK�1���\o��Տ���E�8��gx%O��lMp����-����?Y��ՌM��a�~U�}�UAB+��s9����D��qf9�d_�B��E��\s�BVʰb
衂�;g�
��[1U��ĕM�gr�,������آXI�-�W5��Y0�\S�U&�䈭�	�}��$z���v����Ao���)�
Ϟ��m÷�&�nm�ףּ��/�vD��x`�c��� YԹ<�J���tXox�{"Bw���!�v��_=?�))�ž�C��E��r<Т�;Uvv���Qv�T�֓L{p=N��'����	��j�A��V����g]�Z_�{�[Y�i�y��V;VU���&9���ĵ�d)FN`��$�Q�ґ
���t�#�<*qĭL1���^�tO�tO�HE��H�n��0p��!/N!��#�-;�k:V��9ŭ&�*��bX�TU��5$+��K��,�5)�K�B��)�(6��kOf˳YW�J`&���|`�
,G#�l��o��}��ؚ
~Ar�.D����T�_���j[��^�9��s��2���ONOtHu5����,����ߊk]|���"���{Yl	�]3S����$�&Lj
��(f�q4�Uf����� ����������X��}����7'R���Ď*��$C`n� ������1˺�$7^��a�/�9�i�rH�B��Y�N%��]��r�Q-�f���wMc��'t1�-�y��sl�����+.����|��O���)a�޲�)z��b���H@�j�
�A<��;�Vă[pg�D8�L��{C�!����ܢ-�ZD�歜߆0�k����*��}v�P˪�|$��y��#E�3}���FRS�%MP�5ht�$�No����_	�r�y3���KKA3���l,c���wm��"w!]�P�S�%F쓤} �4�8;�o^��5���9[�9��L���Y��B�D��`g�EH $�IP=/p�J׃�qf���]y�«�ɬ!y�Ib�T�Y�����L����f��>'�E�n�$��Ӿ���,�Sj�!���b)�d�|�$.L6�����Z®�!���6���wW�Q=:N"5y��n� �{%Ey�e%4�D��fAӜ�Wl+��#�F�v]�Ar[#]r�	S\.7�}|	�%���r��޸v��PK���42�T2��2����P��
�J����x�a���?W#[Z'�G�tq�%.=�#3�I�3�	M�����_a6R�-.��	�^�q�F��	�ʍJ����A+�G,5"P���p�NIRL�V�)磿�R�U�HnE�]#$���*)���p�D�LM纲&�����Û����i�x*�ij�"�����U��//kk�$Y���O��
�w�b\�r�Ve%�'[-%�͊���:�X��֥�Qx�cB��K��.yۙ
�F���^]��\��#ڔ㐈��l��}��dP��+�&L���
LX�\,�2��#A����ٽ'6�C&��21D��LSzr��c6J���`����c֎�_�B�l��;	n�z�m}����R�h����EI���Uq+R���Vr$\P\���>��?�h�Tq�G5�5���o&q�z�i��E�<�Idu�/.�}�VT�.����n�ez8�s�nuA�����	{��z���̲$�&e�YtMĖ���l��h�r/�L���骾�q�ˆ%-�f��sK�}0>����'� V�L%�yذ
!!
دF���C����k���;��-��G����:%����"�
8�,v�e�Ʒ9�YYv	�q,[��%� �"���L��ˡT��'�JR���M��}x�;�� ��R�((�j�R�a�:��������Cf�:�/
0���[	ʍ#̠2���w7��,U��l)��OL����.ݼ�j��j ��5�t���ށ28��wwb+a2��B��
���Q
Rr�2��	��6���f��憸\>�+ �St�P��%�� ���H�,"qУj�s�3�fL����	ss�b�!v�4�� Rf��1G�"w<N4���4ib�p�
fj�me^������uoh}TZ��JިFN��k��+�uƻ�\՚A�Gu�ݷMUp1+R}��R�f��Ӂ����ZO�}\�a�(V�r���r�R�Rj�^ds�
+\���c��
]�1L�7Z���Qr��U5E�6ai����l�����]�$�I����,�r�,�A �f��~|G��3���=q��Gp���mz�z_���d�k�I�I3`I��24��P�m���S�N�bW�C�g�W�2�K�Kh(���+�4��5�G���W㓲�e�cP"��n���cMت��D%l6��:c���f*��[�_t�u3��X&�o�՞�?��!i��_�t�����^����0V��p�Nˢ��d+��0o���5|Y�2K��a6�������*��o1�n���tңJV�7Po��Փӓ���KI�\�D�a��$�΂���->��APR����C��6
�u�3�e"�B�X��U�q��w���˄�J<�4؊�Z�`�1�Ճ�;b���`L�txԢ��"��=�����XL�
9��e�o,g���,D[
��$GZo�[�Pס4�����FP>3�6d�QT�q�[�E�����d�@���Ճ^F��,W��5�R��.+_��JJ$j�-kԩί5��`z��	3h�������;���s3������)z?�z�Q�F���#�Ti���iyư����ƺ��)���=cXk��ҍ���T���k�?@L�]��sv}��!�!o^���J'[�4�<�Z����k����.��#�'cK��n/�tGף��g����r!����L�U�H�4+d@��W��E9B�jE�Zh4��w��m1��܇�x��{�blLa�ς�z�$�j�eK���Ed��=���%�������Xg�0TH[�$��A��{��D�z�=M��˯嵀�Ъ��<��8//��ɴ�*|�T�?���*�mK��
*��T)���莫>T�P��F�(���Ht�g�e��3��q�<���k
��<p�P518*9�sk$P������It��q<U{<�N�'�fݻ�
P׻3vgw8t�p��S[�؛z��8��CUo�%w�h���jf&I{jD��8Tj�
ftM)�g1�@��/�j?׼������Tz�|����>�Zc10+1ݯ�@�-#��bʨ^��[X�lV9Ǔ|�	�	���o�eA��!�G�Q��A��䠽���}��|,��j�����'"C%|473E7؝㣋O��A�C��U��"�f���&�q$->���n/�B0S��Z��Y�ج�C���G��i����(��kKCAM[b�[Lr2\ƖޤTx<5[��Q&�q�?|�;�?e�VQl�K#�<�f�Y�����~�i�<���m,s��EBv����`����=[�έ5(��}�G���	�Ib�
���=7���)���ľ���h�ި�u'��#?p��\9P;E_h.~�����	�y?��G��]�-���@���B�	�æ����_�](_��r{�
�r2�Po��O��..��ʣ�ሌ��� ����
���_��sy9���t�v����..�K���>�_��(�*m	n��:gz<R+M�p9���d��u����D<F���{"R�b�\KG�4�Y
({�x�.�ލ}>>m��*ޟJ��
��H��ƢLP���[&�c�X'�,l���}(^��Ϫ{MeE�-7���5�-��S���T�ņkM`c����';���W�a�~U�e>�q��, �������Ab.ݵa��л��qꢧ�?Q���^~# n�4�L�x�=H��g��ܵ���}�W�I(��^�"�Ѩ�{�*�:;�%r'E�}����Rp���.;p�y�0mK�{�*�-p���n�}��v�c�i&7�^C���������k���s�\I����>�C�)�Cr���oؤ޾a�`�h
N<�4�
��OXmV뼰 e	 UWȡ��}��o;��챒0��ha�<��cuS�2��)]Em�$4�C��߆[e��+�b���?��e�mC�Zǝ�(ԂFP,��vF62�Th�GV��j���Ћ65��Z��N��D(@�S�O���t>�@>�V�]�G�{K�r�ɡ
SңNx:�RE&CҦg�}7�N��e��1Δ�iqˤ�!4��ר�g2��e&�/=��=J�%�����T�œ�#��J�3,��t�^���5����b_�~m��WB�g�ՙ6���+�}�ء�8��c<�*�,���aJV6,k�†�M��T�p�R��T\Lc���0�0�Y��5�U��T�2�h؉njx��U��JwvʼJ.ě4g�����ZV���V6�c��GrK1�5hW�}@)����0E�m�ȃ0��`���·��&����_�a%T�V�̀��Ac4�[S3�����Xў1F���Ϙ�4��ϐ՚ڥ	��J�-#�ei�ǽ<1%�l�y�
�
۶�.~��m	���3פ�)&���uX�Z�	V‹�r�6K�'�H�^�i��
=��*y�8�7�Xs����Z�I�C�<<<� Fy�AzO�3(�-h��џu�(�d���Λ���&�;�F
i�:�v��B��tS�8Ֆ��{�6ĉ����@8�ؖk�PV��5%�-���h��Z�\VGi��+bx��`�:8�#u:�H�
昼���J�w9�~��6�Ņ�V���|�u�_�P@IT�#<G��Y���}�26��ֲv��ڹ��8�����x8(�(s�R0J�T�����V/�uo��C�?1�(�!��O]i�G$kYj��sk�<=�@[+<B,F�=n�~a��q�7�q0���.�fY‹P�^�)��LPO�%IUl��X�#a<��J
��B�n�4�tG<`T�E4V�.]�������ĢN�=���/h��.Yֺ!ęC�7�^�k�o}��U�=Է����A��O!J�W7*�8��k�@>2�6��7ϙ�*�P]gn+���(Ӻ>�n���e�Ƨ�?>F?�𽈗;c��5�J,�}������^@	��d�,���]v�����KW2!+�\뻂����P��G�uqC��yxtr��g.�uWddJ&�]�z��d-���+=p<[�J:�7ẬVo�M�ɵиa�"��'�'o~j�i_W���פP��n`�����m�:�4D-
��	�1�w�5b���v����&�ޭ5���t��.�(��l1����ox��3����������B�V��䮇���"�Xb�G=�Q�B� ����O}�.\9�y����Ϊ�rt�CIi�=����0p&:Ҟ֫o$#��*���Քue��$[����b��5�j�a�Z̍"�Ēh�m�2��p+���3K��CI˝�Ѽs���!-i,�2���@�b�G�����J2E�AK�KϨM�)��H7�%砭rA%�`tJU�
FUf�2}�C�o&����M.5]��n��kBK%�p>k5EN��~��m~%5L��R�L��}�Ze�S���w9fE���wK=
6�w9M�0{z�1,C��d�Q�ٱ�Q�[Ul�6F�auo�N�3�.� �BV�w3��/F���	*o�X��c�ٯ��MLR'�S�HE�0�~�nv5(�%�
�-��xN[����d:�d��|�ܮ�&|r�Z5���NiU�S��dj�o|���0P���[�Ɂ��vnF
OЗK)��S8���j���K�>Z"6���:2S��/35v�js	�+-��!D"�|PW�M��;L~?�����5.������.�,���H�x&qHIY ��G`���X����:V��U�>;-	����ov�}'�.gE�[Y�)#-�7� ���d�z�д�]��u���n����lԝ&K���]ڹhB� !�lY,��$��}���%�:�hT���j��]��ɩ��qڣ�m_��$
���B)�\]�i�A(]�B"#�\���n8�&ۍ���"(K�����B�D2���+��69K��U�<����*^�8�"������;[�c�8qx��	=�]�Yg���
l�4U����\�܈��n}���/��$��d�J�n����Cb�7�&�Im�AU�~�I�����؝�=-7���toj?!�Ar!���;�=�W9�p5��}�����k��5@�e���!�
R�!��e����d��g{�J��9f��ԯ���r��FX��=>c�V�&�^8��m^�p��7�u���(�4�Aڷ�3lU8��-T��T�^���~�,�&��Ѵ�i:�m�$*�)���@G3Y�~��Z�Z���J��ne�,��5P�(+��eQ*�t��h}����C�Y���w���
�XC�U+G�,��b0��U���^A��J���C�Γ�ɰ���j��kU��d�h�0(g�vЏ:W�D�L��t43#��v}\@#�
2�N>�Ō�η�WlӒ��4˸��e+K�U�;�D�)�&(�줠��]+��G��`�%%��E��^��b�g1CY+S�_/1����4�Z����O�Y��ұ!��}Q*[j\���F!FȾ�P�o�p
�ߧ7gd+Y�%b��ݥ��
�9F�NB�\^o)IN��;-�T�V��R-�Tp�x��Qˤiw��ǫ�̝ql2��7Ն�Q�GK�Q�9!K%�[����\��-����̥0�Mo��,"�FX,@���3&�{�fbW#*cTk꺲�	0���q/�~�1�׶ٲ��.�4�:��i+aq�,�utJ�����R�,S���\K�ׄa�R��d��-��}n�
�-���,aN�%p���T1��N���0sKϟ��I�(�^oRO֪�'��g1�"�D�"m���I֝>�بP^x�L�m}�i�(r�}���ܥ�e�*��̝(%�bO���S� ��7]�ժ5hOl#5��;���w�
vw����t}��x�7񲈍Գ����_r]�!��[�;�k@��%;d�Ёk0�����5�{h�������:A:�8+�-i�c"gQc�hX���0�ȑ�L����Q�LqW�7IMn� �x���������7��_�v��?�����;x���Q^�aز�<$�9F�b�As�)$b�U�!�AӸJ��Z�B/���gG���G��KH��G��_B�|ow0��D��{&Hi `��:4���ߐ.�B����=���IGԣ�c�]�w$�"0������R��$�̂'�AA�
�5�P�y��������lKdu1���ls�u%�˾�B}�|��b>E�<<�~u'dT�9�\�AH�G��>�
9���8e��������Sك��Y�
�[x��Ee%Ę��`N[K��'�ȱ��v:�=�h��H�(��\����K�Wc�ia��DJ��DQ8ɻ��$
�~�K��W�X�1h�F�H�q������¦�Y/�(n����Vh��ПA�o��W1��Gԛ�а��
�$λ`�+[��$F.'���Gr�8�:�2I^�y����=�kԞl���S���0��T�k���VeV���ʘ�����v���CK!�(��N.!�+g��m� 7�S����&�h��3ڼ׌��#�6y7�f�J,���US�+��bj���G?D�q4����&��I��2E.�ݺ5����@�No?�9�㺢�tNg�j�)@��⢵���uɉES�h3�u�4���R�1֛fr�Qd�hP�>���K͂ä́�H�)��9KN=�\}m�A8>1w�.�K[����Ė���|q
0+���/����eu�wXZ_�0 a��|ؒ�ZTd��B���0r�䚻e�H1�4ljT8H<��X͉��2Z�
�:�F�Xz��vP�*>Q?��X�
���I�*ڐ�{f��=���+ԻB�+�J�[σ}��2�.����M�q*�X���<�QZ��~��V<�y�p��3;�?�W	�$
K_`�ǔ���٩<.��.�NO��d��[��1V GM�RWwk�E��C}�v�=(=��Q�jh8۬��1?�ϠL^ >�ٝ�$���m�f��c4�&0Y��3���E#k�Ϫ�5�gr��,������]w������ V
6R��/�b�$�†�=p�ш5n�K�΢�b��~�?�{p5�#Ȣ��g^�dž��
ha��J�G)�E����;!��`9Q�x�P���g��/�! ��
����,'��?&r�vrV�&	�?Y\B�{�zg�=J��1����C�Tk�E+�V�pQ���˱a�al*�GFx��,�V�n�7lUiwߝ��;��NO.�?_ߪ�dA
l�>;<��ŔC��;�
�|#�e��k������Mc�g��u���Ɠ1d���Y�
Ƌ.$Xy��zԗx��''O��8��3#�Cx��x��imbNb��oC�?h�������^�î��Q4��
=��/��Ų�{��<	#x92�Q��*�4��P�rDLS�L^G��[N ��@��t1���b�����fu<�Fơ+v���H���
}Xi�Ӣ$_�j�܄�Yvds��ؾQ�̐��+:�E�}��D���I.(yWb%|������H���
���A?'�dx�r�:������m2���n��[�n�U,<�7�9�a+r&|>8W!���
 �3q�����P��5]�7N����嵴�:V2BNzP*�&�7��>�ߪ�=;KA���#��&��Ќ6��IWS�f��P�8M��:P���&��\��(�@��\z���pCV�͢({�N�_�W���A�[��A�l�BI����3������K�{�-�Ub^_�VZ�K/g⩆�i��+��w�����1R�(*�;�ZƂY��2�&�'��翼B3�}LE��cB��+Q*]�������@��{���F��-e�U�/w��^�>*�J\�Q�PPu(2-�5�+�b�JZ��FQԕkBE�~u~xz�)�ՓN�f1��ͷ��8��˃�+��;�G��.D9����Q�*��\!�@�[pD�\���GH�h�
�e�#b��*��AT-���^�z����O�#ҽ
�=Io�2\��A�@����^l(��*�iz(%�˻y�W��s�^As/�9��_���%!�a\�s=\�\FW���
��#�'��]�wؐW$~B��»��.%3�+�!>����>�aw0�Gq̹��u��"�g�����h��P��J3��t_ެCp�$�dUM��^�h�eG��XK��*�W��b�d���&�����{'�HY�(44�@-)Fq�b�_75q
�*8��>��\�|S#)�>y�||z�2�K��1l�Q�#M��Nu0q-KW���P�.�&��&���6\M��PnB��X�x�=��N�ߘ�,��26�|f%�H��ri�>���f��D����
�%�#L�U3o`�˒r	&MW��Z�ṩ��2����Q�f�I��"y�I�^�&#�dr�AW�9hwP[�׭��d�$:χ�r���,�j��{�j̲%#_?����^�O�Y:��b��.�[�bL�#�wV�>��SƓ�x�n͂D��zɕ@�B�9�+[>���Fr9�<
�Ӷ~��P4�	*�� I����L��Y	W0��?��L޾�D�a#�kbnӑ8��f�i�|"=?2l�Ѓ"�Ă<&Ȇ����t:��R8���Q4���P@ �ʼn$Z��Α)
�?g`�qɊ�p�/d��-h�].��������VMf�_��%��j��:[�����}~��,7��H�����P���S���`���L��,�?8$��CJd㔤m���@���C<V8�h<�b���Ⱥj�/�Kˁ�ǘ�sη
���ǒ��,{Z��*���6�Șf��
�i%�iH��a@]���<{��@�@�|:A�Q������V�OM҆�C;W�|۲����6)�KU�<h����Bi��^0����Y�+	-��7���R�,�+�ǥuNzT�}�X�#�"]
p$vͿ��������*/>(:j�ǜ��Ii�o �2c�w}T���*UɅ�z�ܽ��/t�e��;(	G�mθ68�M#0-�B��l�W
�w�[<��IR(���z�^<�U���r|$R"���Ӹ�"��P�D��G�~��=4hXi��^X����_�pU�g�N����#+���pݣ�[�]n'��?F����
�!)c�&���4�j��P�J��d����6]��0�5�T��u�Al ��/�9�=Iҳ�pK=J=~qj���ˣ�Y秣��ӟ�y8�5\��H7�#%;��%�&��hˠ;gI�rx����ך��Q��B�RZ{�	
r+��U��H�O��[y���_D�@�1��4v���,��,�U�ǹz���=Ku�(t���شx+�����ͪ�z	���$�J=����Ƣ��Z_Y�5�)m���t�U�\Rx��<Gt�
���p߀�./,�n0�O�%[	�*"�Pa��da`-�`�ʯ�t���^����̤�.s9������M����h_"Y(5	X�c��J��j���]��*�9�6�6*d�R+W9��Z�s�5ȱ�����rwC���e�-|b�[X�{6k���u�s~$%q�D﫨�D�I�xA�gs
�X�Ea)�U�?9 �n������ndߕ��tʂf�;*4����ޤ�VRT'T3�#�Isg�~������P<�����Gr(y�@]Ә��GA�=m<EТ�R1�	<�/���s��a����!����˃��k,Y�0�Oƶi�˃��ĕ�i�f`pc�lt�� ��=a�JA���m��]6\�		��o޳g�9&��1����kD��Zjf! ��w�X�E �/}���h�G4p�f�h��=G��uJ1r3�WSXqג��5����9���s,o��9��L�6�x�}#.�W�u����e���E��Y��[G]�n�O\���YV6�l�pI��$ZMfw��_䛾]Б�
��˨2���䮣2*B�p3g\4��s.���[[�J�|j^����#�X9CN�Gb�]kf�1��L?�F�Mt�[|���yR�E���Ѻ����ەr�ֻj�s�Ei��--�oH�<&jk�����[҇b8\"�e�}��?��Z�����&1C��M��v��������[�W���|�{:���EZ��h�0:ρ����L�"���?<�ݠ۫w����Z?+=w� �!~%��Q��"Q��l\�`!���q
01��eE-Y�(����u�ו�bL�I���k��N������%6��L-k@������<K�*��ڬ26>���-��X|-�0n���#4FC&�jACс�~&���p�i��\�w4��]n���
�]�v�WD[��͌��^9?V��Y��<`��X��F;aj�
Py���L[�OZ!1ej��]'�a��er<�F���3�hvðwU�޾�FA��J0]�������nSk�I�7�
�H|#���d��[������i�ӱ���h�.��ǿ�:�Ռ*��	u:���kx�@V����K��r0��d��hI��t���R�['��P�H�
���]F������y4��_�ۧ3K�Hh�tc̷]tq܋�M�8�Z���g>�����ܧ��d�Cq
���n${jέ��f����U?�	�����8�C8v���8(`��D�/�{�`�E��F�������9���;��V4���ަ	IBt�x-+z�hԫ��6��'�\��I����49S���^�@nJ�H�rI��Cd-E�
�W�
y����G�>ӆ�����ze�H���7K�OwE7����]z�;��?�<�5�	f@����G�|O�ƹ�n�?_���򼱹#6�f��x�g({
A�H�t!�&�C��WQ<-J@�!���{ם����L�C��nG#��,$�k�7�f���p��p�>�S�i��O)�Qz,��x��q��<���O�ƋAo %�٥䰾�̪�f#��۽���		�[����2�"�*��J�/�gg۳h2��9���ͅ�q8���)Ϧ�o�an���(��2��Qay������>��Ծ=�I.ӽ������=�b���h�l��X�%O���Ͳ;D�L��◹:nz�;c�W�r�oo_V*�~?�IS��g~� NaH�&c�!{~l�����f���nl�V|{�>n!�O[l���U*�Z�f��*U)����:�0l62���#(���L�J&�y�q�^��F7x_'^�z&�u��#y6͌���/��x���K{���1�W�'߉r&�Y����L���gGJ���E��������ʯ��el/��dD�Qs�"�N�w���
YY���צ��c�H�s����� ���<�ܻ�tO���&����vu�p$u�F��U+e�����
3o��iIT��}t����&iQ͜���^b��a�kK�:y�*�
�C`��O�^
��hCRh�$�"l�TZ;�p;PQ
`�.yɨ;�o��N�V)(��5Qw�N��Tmʪ�*�`���~B�:��^��/ޜ���ӟ�0GD�^�C��EY��Ӫ��x�'x��_���^�.R�~����w�w��A�����j>ӽR���`�ej#VK`R�z*��H�j��'0��]D�
h�������A�o_��������G��;�K�sՍ�#�at(�r��G��^�f�X3rj�$����~��6T�,檎;�v=k��F�d+Hp2��\3$��auX}%\}{����Ƚ��ؒ,8�%K��<���o΍‚7�'��e�0u�i��`��'4�[����̬�b-~
�$�@9��(z~~��@����ݔhD�?�����|Q@r����/��K�v�/E���
�)��LB���v0��+K���ã3�|�d6���R��_���˿,��"�fA�Vr���EV��B�d��;�ݔ䪺Ap�4�
��}�{�TߍEve�fm3�QwX߃|ƺ�|(���
�v�C���x�-Ȁ�I����b
_
`�)�Ʒ��dÄ�*��%�TѤP��+$�u�ڧ/������G|���G���
�[K&��R��_�A�x��
��>l�4��2PYF�n�ý/�v���^�r�
�-�%]
�K�`��
k.�=�-$R���x��-�k���^�f��O0���c�N�K�G�p�һ�|��ޑ�B���vs�@��VIZ8����|�n%x�(�w �Xo�Uw{�"���n'V`>������eτ@J��I���sе�A;ә�G.���XK��|��r�a �����$Q���қ����Ͽ�3����rk;,?e��6�(�N姸���Am�dY�W��B��7,����ª�.�F%���A�Q�[���,��N69�L��ʭz�ܿɇT�JL%��L��Ǔk�R�y����z����!�_	R
8�d�w@;��N��?�+�!)����+y�z]
Y-vy�i�^���s6��\|�P=#6H�-#B���C��(ا���פ����O���ф#Vq���Dh�YS��
�@G&�Y�%Ad����J��b4���w7�Q�/c�O�1:C��������C�ױx#���_�P&����Y�<Ԓ�?*\�,�rp�ʧ�,A6�>n��-�)F]���3��	EN&��ƌ0s������v4����)Q"���ҥ<��
��xJ&���MX�am�R�H�Ѱ�óE)y|o�&rr�pߐw!1����IdMP�LAq+.��s��p�������8�vg`�y�S���0�s�8Bow$��=z�b6���?MOi6^���C>B[_�
��V��O֓�v��u58;�"cpڽ��+Ol7���O�>֜�NJɅG�_`?�_���� NT
�}A0����x�f�z��d��{w�u�|>\.���Ł	��1��š�<x��õ�;�,֓�.2����6��+��g���6~�j�Q�T\c4�l8� �ՊNo�Q�G�H��&jg�)�H_��ҫD�yۦ�ts���,��-w��$��!cys��"��;���
���қ��}�1~>~=�q0Fi�/G�kԝ_^�,7A�#����ϮFn�E����etu5�����,#	㖱�͛Nw�r�c0�@�ct/������Ã5Bb�AF#G��I�U嬖GAB*�{0���+�H���ĨۛM2{aFkzsb{)��2MC��O��O�������>���d?c�{7��̲�}Ŋ�c�Q��ћ�F���[�"$G�~4��������1w�ٔ�w������Yz�� ˡKj�c36M�P{���N�˃mepdR{xL�6K�~�;FQ]�(���#`�fU�ޟ�=S�c� 6���EC�D��6	�*>���5�X)�i�)t��2��[��ƭ�[
�[���>JFE&�I��!�gz���FC��q�l-򔿴_�t˞G��vE]���sL$ϫ<��W8�xij�bw�C�ã�^e��sdl��X(v�>�Sr)�q<�깻��P���&�h&y9��8;>z�9:yqtrt��rv�"��؇]�&o�(%�}���(�M=e6}��+�}7���Dh�n�=���N�vp�o��j���Ԗ���HF=�Gk�@�+�0n�)Ƙ����P���
���
֞WG�GY:.ͺ�:(�ʧ��/�=| ���N ����g�gWX
j�͝Jë�b¼B���b��2��������S�o��0��s1�nT��/s�Ͽo�|�߱
��=�DB"IW~����
�Ӗ��1�X��%�i9��*���H��x�#����/%�/sgoN��"/�dz^0�?�r8��e&U��������<\���K��;��N���M��-�/���g;d�&��~y(7�\qO���r ��N��#�m޷��Ӱ��Ýj]��0�S�`(q��2�߁�IUB�	����[�2+��<>/I������f0��W�y�Mt��V��0E��j��R��z~�/�N.�/�~Ε��FV�v�_��LJB��`�����J&�+r7N�κ��V����U\,\{Xr�r7g�:O�~߲6y�t^���ւ�+����S)�����-��U�tɉ�6
��<\I*�]�a���U�)�,�(7ȅMG3T����^k0)��M�Ւ���:�z䐪L��l�ulǬ�� }�?66~c�����KnX�'��@�Y
-���ga��Ѱ�	��p����W�A��Z\�>���t�V�<�����h�Ti\���;��Ƕ�'����^	I,ɗo�t�/�(N�2���JТl������)a�P�fТ	_�)yMv��&l�ɷR�+�X�r���շ��ɘ��C�}X-'z/���{���� ܦ�c��9a
�l�֥(5'�:~~��c��H�M�`��E��o�p�l��J��jղ��N&�� g�a`��]+���V�����wm�v�%�'򣶪d�'	��s�<��T�*��c�H�T�v虌��< 
F��?���9'��հ{?��߆;*�JJ>�BC�,�<�f�s��U-��i
U��b��\�RXp�Y�ֺ?k��P�E���N�T�o�?�牵kOp'�\V�d~��*3R�r�VU�(���q������T)�)g3U��V�l�K�D�ǟ�]���O�y�ó��>�*D��8؈4y��~?���*3\NQ(���R��Q�){�H��w�M!�2���[���'��f�e�P����,U53�R�F
��;�b֑���x��9���VR��f$�*��*a":�$*��z��#O��"��9hw������J�La_(ȝ�zJ�}O��w�S�$��'�d�;��sq���;5�*��tJn�:�x֦�޲r�9IZȁzB8�~�&��=_s_Gi���ݷ���d�/m/�8P[=˓�6�XNkJ���۝��᜝�]�������}�#���}2Lj�C�S�N�;jTa�m"�B�R}���L=r:��;�$Ů��w�ע��S0�eЏ��Inq@%B�7=��P��#��<$�N���h�i�%`X�]B�Ԇ!<y
V_L,T��Q��`�Q4p�56���f-3�#������łҤd渨Z��NM�T�зV��YWL�\����ΎoeZH��^��N�v�Č��x�o�dn�ܷ�:Z��\��ۏ�ҥ����D���)RA���Y�����Jthk)��F�}�	��k�Ȓ�Ţ�Dy����Ǐ�sh-�e���eFӶo��@������b�S�h�y"���0?,޲S)�e�F%byl�G`a�[��؇�B[v�µ�6����,��P+�z�>kt���:V��Ui�n+�JDn6�V�=������:�|*�n��5�G��Q;���޺�6$I��N�S�2�'�}��
���Ԟ����z�i�����*�""��/�?(�ЍY>�(ڸ���D�Q��	���x���dG�,�ai�H��y3�՝yf��]Vr�'�{��M`^wA�I��ƽ-��
T��	2�k!�&f3�VSY�v	���{���\�8�O^^|G��A3���L���W5�-	���Z���S�7
d��t�7@Ќ�m-��Z��鷬[l�����3�7�#�}QP��njLv���Y�f5�˥�/uLi�Oz׉�;JM�$P�֊��V�$ë[;Ғh�{���%�LNY(�_"��1��i`*���:����_� ja.�KR�b�9�
���ᢋR�=�@��ӡ�e��{w��J@~�
��0q�8A�ǤV�M��)"�����] �ix��}$���M_����%�L�M�N�{	�{�Z�jñ_tNC�Xtl����z5
�D!_�W4���4f�ZsJjσ��:&����O���Ј��ߐI���Շ�6R�¸�y�g�0K�_�"�!��;��\Bē�+���.�|V3�=*XAA�C�|����6���`K�N���nVO��rt&8�kCu����i�
��.�!���de*��gf5V�m�q��p�B�R��'#x�b�����C3�Q�KG�(�K^�+
�h������Nm����P�T��-�7g5����M!����IםE���x����"�w9q]K�
�{�K�u���&�R���4��]��n��L�DO��t�W�9�Y�Ax�a4���X3�c�j_z��--U���S��\��-�a�j�P)ԃ&��π�~����鸞AY�T��`	�<l`:�5�ҵ`�;=��C|�+ɛp!lPf)��հ�ܡI�x�r+
`N!a4SX�Ӭ,��S�s��Z�Sfɥ�h�1��h	R��J�X.K����W	M*� kT�cu�F5�n1:��tL��ii�]M�3�J�n�o��<�
�,E���$c�=��h�����SΡx8���N/T����`�"&�Ů�Ǩ��!C�"hoWL��M�(�LiDF$K�Jرg\��R�+=��*=S	;7�Tv
�=�"��,ٍ��4�m㭻x"^�D�!66<e�~�
��6��Ӗ�r\�%%Psƴ���)Ӑ��A1�� �o��I��%2�~�ؿp��!��X��M�����$�M!=�]r�R
$R2����@�١\{��)�$/�>p:T0ƫ���׿��ӢUZ[^%8�e�g�r�!4�4��uS�+����Ǧ�<��RI�H���V�y��Q*�r�PRlE��{��V|�,���'bU�}�b��Q�u�3yg�'�`�݌B�$0�]'��݂bS��0d8,�!h�Aw'�"n򇾍 +	�N���J�Ӣ�aZ�T���v�G&�0��&�3ĵ㨷�*�)K8�8��2����b��t\����'bʐ�a�3C�s�T�Hm
��D��t�2"T>�y��'~��x˽���H��Cj]��ХK��^zU�������ٸ����JN��[�A�!p�<ˑ�]l�oy��JJ��U[��P��l���Ŗ�HT�31~\�E�Ua�Y9�?�E�H!�,���U���0���JXU�gw���d���٣��%��P�gN�	|m�Q��Ʋi�{�IiQ�`���M{7-�r��ST�ǽ.�SB�|�쒺7 ��ˡ�2��.�����j���
��LN�y���i_!��Ά��HaUG�<��k{���+ϴ�C�gͼ�C����h\�.d�OF*�E��iE�m����A/��"�/��_��3͎�w�Qnr���o�Wpd�K<Yͧ|�8��(�`�^�r-��^h��ã"hb�Ƀ�5��&E�)��\[~��]VI�[�J�ɣ�����B�h���.����/�щH����e{����[)���E��E��J��OCA�"�	�%���>:b(��>s�DCx�'�3g:Z��)�코4tfM�h��F�I*ov����H�t58���1�Z�ֵn��Z�K*�,���hG��I�
�R+e��T?#���\Q�)�0�`�(H�"βM��Ǭ��N��Ϛ嵉�,Љ��zw|��Jz�j�f
��6�ʎx�]NN�`
{𦽓~����������ʧ$���uvQƿz�\��V����.�/�op4NW�������u��gg���	\�
��/Tr�����g��;��/OµF�w��=G��u�G����Es������~j�?z�\o�?���f�^N�=9����*U2|}#??8}�&>�A��FbO��a��x-DT��b�K֊*��{��U��V���ZU9cY���Lb1�T�rO�q)d�H�9s����:�Sjյ:U^�SI�N�u��~�#�%�PazH�ICw���7� m/��۔ް��|�HU~iiު������[(�=Oyʩ�_y�����O:�]t�x�r�z�:=|s܆u����-����Og�٥�v��R`�
�8�v�u��F����,�V
n$-��ú��u)�@������*l�1�&AQ]�OT���*7��j�E����U;|3$�+�:ELU��R枨�l'��q)o��)���4�S5?����-�:|5�����2F(	�@�/��$9��+��[M�N9�nF[/�`aPѧM4Vt���W��wܣ4�{۝���m�5V��.c�1����Ig���t��P��6K`�DA�{�i�
��a�Z
��3����Zt�z�.�_���IΪt��nNV.JU�Y�<Y7=
g1��ڋ��S+�:y�Z��Z�~(b	ra���$��RڙC�>����'�]�Pv��"7E_ދNp������%u�/�
ipڠ:y0W,?u��`9�Wk�<9���Mn�B]?#1#H��B�8�tM��6��&g[	�ō���H�߿|��B�x=�D�	F���-��>��>�vZ�p0�Qv����!M0�(�rP/�Ё��F �ܨ7�~��j�E,#4����<mŒw<���;���l1���iM5
��[$�Q�X��	����*&�ʮ���WL5ә���*�^��b�����Q渐[��2��q����#�e4 =r��k�� ܃�X��IoՂ�zoi��ˋc8p�~yt��?���t�ȰR��Nk#4�㠄%�c�0��c�T�[7N1�O�*���4<�T؆!��/��(q�7���m����^���<�{��V�΢/ò�y��seaհ>=˒�NV�1���^�E��[���}��6��UZ�;���2�KY����p�jf�}�S}7�'�mZ[����
��s�zCe�Bу:׽���a$�Έ�C�q��8�#%��B|�L;�dz��V���vv4t�~����^���p�hv����z*�h�Rb�c�=�*���s�RA�=q�a𷓡���r��,Ȥ~�"�-a�
�R�t����Pج�Yr�(�KY��X�
lK���M\�{&�L��3�}{z�&�qvϺ>I��Հ�AI��[Ŕ	��ۘ
�9]����Pg/��YG3m�a�o1�
�z
�U��=�\��{Y�h����¬��tl#��p@!;8,���^���xì�Un�YdSK7պ���3'����[�ŋ�";S��D%;4B^9~;�!1`�b�0yپ8��-�ΨO�gW1��hN�sT�/�'���oc�|)&�3\m:��x�0_:P��s�s��p��a���{nU�4,	�j8V�1E�tD�Ӛu(�JX�Z�o�?y]Q?������U���z,��T�?h�EU>�	�I���4C�_�ė��:l�$�ܓF�b#���l����"��a!�/U*E�bO�������1�~ލ�}�J.Ja�[%QJ�qY���:N9)%����F?�K�����ĵ8���1��j�b����֔�%���i�'�=��E��o>��C��EA�
X��T�x�
I(ӆ�V@���� �
-��]-���B��B���Z��ᜈ?dҎ*��3�[�&���co%�ǚ��tY: Fq�� `JQ�>�����$��H�/hdA8+9[M"0���g����
��2u7����e�!�K�����O��#7�,�?�%$�tE����B#�RZ-X�+劅���F5��2�R��m�C]�D�J��T�������6�^~,@�Q)+,6^�_����y�~t��٫}<��,��Q�+��R�5�(��i����J����:w>'�l��a�����U� �qG��,�֒",�����ж���R��܁���h>w�)����AQl"5n� Nl�t/{"� ��P1���e�����-��;�d��f�R��:4����Z�"�	�m���ߔ��K���0��/��z�� �6�f),���P�feG(�v������%�=�p����dq
R'KAC�_��rkD��%�Ƚ��%f����9e2|e!g�*���3��Ϛ�d*�4��%|ә,�Ҁi
�"�Q�����R��A�?����n��	�r���|��wI��}�װ��p
>H9��w7�������u�C���;��M��bS�Ѩۋ�/�ܬR�����q�݋$�����+߇�#LE?Aj��bS2�����L�R�YPԎ���"�֮����S��c��ɛ�㍀Mná��������l�Հ����D�>8�
���{v��;>F+��3L?����6�T�MԪP�T�7=�	�W%��nkZJ�@�V��#-�
��'�^�n��5�5�!����dB���lr�-�W��u�;|S���4]�.��r�7�QRkM��-i���,�"ةI���	l�~���U�\��H��4"p��f���sq
R�gA��rkK]��Qj*��R����*�,��z��l<��I)=y�� ��n�a:PH�������D�*�Y�p�	7��N�}q`�ALQ+��B���[A��\������������6�86�dX����	Hn�US�ca��낒<��	� ���QN��H-w��b!r�YW���4Y���4��Q��iH���|�w��Tb��m$8껪\��<rm�#�`�[�����U��=j�.��W���Ay�1>&�4��4N�s��
s��%�����9ͭlct9��������}�^Tyj�`|��
R�Ɯ/O����"@�	z�HzS@)�I�BYW�B��ht�,*r�x?�Dg0z�I�~���0�V��Pܽ��l�|ɤc��U�'�b�
��54@�Uv���ix�	`;�NL�hZ��r�'�	���Y���Jtu�����@Kbh
][��F��lR��ƽEATcJ35DӖ��l�
��0�d��Jf��m�����`��ri
�<Z�K����%�<�\�דI�KR�\]3��Հ�0�
��H�?�Y�����I~@y������M�JG]M�ג�R����d1�wgws�JQk�����h$�-�1�e3���P�3����+� sD�y��dT�c2!0��T�#�"�Kl��Ĩ�L�YD�E�m��1�&�!h��h6V���*�%����[�0yl�hP��(�IvU"�B>Vb��ҍ:���$��&�@l�p�/e�A��Ϣ�Ӛ�8�ƙ��~�SN3t��[J'��C }���S ��Y$3�|��<�����Bvپ8xq���|o�t*�ګ��Rh��:�mJ�|'��\��Ե�+F]�a<���JR���+ӦC{�!��ԑ=RN�Y��%���c�ms'�� �*�`8��׉�4E�`�;9K�Z$Us�:��vu����dư�����Юb�
�CG�d��RmeF��&d9�R���ӛhz���1|�t�FשW;<�H!�/�l"�M�����M�U��G������-�����'������tړ-��#;s
����>�;'�i�V�z���H��-HQiW�_�u*�)C�PjK!�"z�5��Fੋ
8�g�61t�<4
�pw)3d'�Z��Sr�8�U�p�/VX75��T�V����D-v�����h5�l�(Ϧ9�a��i��㥞֗�سga%ϑo�bY�Ty�����ߙ+��F�X+�uR1��|4�T�������{ۛ
�sw%S'�=�r3�pf��ۉ.()J������/tv�`��<�R��)h_�����KK��\�/�R!/K�?{��ƭ$���U�
XɱIq���'�D�:�%�$gۿ.M�1��E��㹗���7����n4Yq2g�'���B(
�B��h��6��&P�#	�~���_�[l�h����(��8�QZ������=���Í�h�/K9}��Q��4<�����	�c;��?��ta���x�8[�1�5����ߖ�bA���Y��I��/J����	/�b�$ȉ2FNS+��g�@'PS�W����D�={���o'Fh���V��h<|dhfm���(�U	�64|'��6.Ћ�0�^�g�a��*ع���@�/��N�`+����F#_�S�nG
���O�u���'�MWU5���y�2��Zr��ȪcD՘��"��|8�QP�4d7���(:���Q�S�l�j�&�B�����)0���y5ߡ�	�,F����e�̈́9��8xF��w	˝�$w�?6��*J��?�i����b��u�汢Ѧ��X�O��N.����-@���"޾Vx'�c��ةW�y�d�
Q�H͡��+Y&�R��$�mY��ݻ(C��{��6Ӥ�g�ÄB�a�>��>��F/�<�F/K��Y"�^F'�ɸ��e��	�s��
�\�x��e
��Y���w#�vs�2�=���
�Qg�jL��4J�H��xF�	җA �y2�`�п>�b�_�*��"�b�]��Lرu�\���b�eEa}G���Sf4ao��Hi���^���`��-�Z�(�	(��Pa�x9j�d�(#���`�e!B��(7��EԦ�d���(Q�Ni����o��X�oD�K���&_p*�pe�̸3L�
13Lfn�a2�0�	3L�&3�2Lf���s�d2oL��/o�^�:��G(�.�
6��c/��]5W]�d{S�f�C�_�����
/̀,P��&b⸲���(�JLۇ�
T	q=��b��!X0�4d��!������!(���L�B��Ha��+GVƯ��p?��@����&a�<�$ҮB¸ӣ�Ȣް3�M��L����~dB
|&�0�Ҝ$/FRB��S���a<
�Ê1��P	a�#cu��-����1[ƭ9i�։�*sO����p	̘�Ii�.��W��_�C��=2�Bȸ���&ޙ,�Yhw����ar���%������el�Z�1�e�.Jj'�Wm�9 ��W�fw�*:���v��茎���^���&�f�� �*����OA��8�D�nė
���L*hFQl*)|qt���_�~k6����
�l��&�ѯ�w��D�16��Q�@���b�"f:��K4�
O�D.7<��冧_��
ύ��>r��
د"2�/��JV"f��~v�&�u�b=��~\�?����u��]���P���s����.��y[����5���^BE
f�P,lG�y�q�.9�Z��sd5��?Nτ��S�������ɯ"����Ϩ�	�_��\��L0�����~+��	�w1qx~�FxCٲ��!ӵ��!y�L&U�P:do�8G=;:�x��zG=,����V�_���W�ώD�8G�f���޺ᵽ��I�M��dJ�m�K��n�!�����.^�U��6����YA��6��Rأ}NT'o^Eٗ����]��}�'��Wܤfr��$	�9Fgr����[Ձ�Z-���E���R��WƯ�B���b��U��p�}u~f�����p8���}�s�K>���.a��ؼl�[�It���^�X��;�Z�P,
��\�Ō�iY�eH�U����l\���?����m��ɮ���lX�Jm��D�4�jc���>���mW��
����6k���Pbu���Oߜ`=t�""V
Y���Iu�~g4�*��7�K��v�C�)�������*�R:+|�C�w�N2n�V�9�⣉�͙F�P�������O�>�	�X��:8�=��qJ>בd�S�t�B1��G��	�iv�nܸ��H�b_��v�$�(���&ᩌw6��v[�'�_[�(Z���G�1zoժ��ُ1��&>f�\��"���hL�/�|�F����0~���h5QPD�Ь�h�	��>Eǀ'��ueY����Σr���y�-{��y�~|��TP$���Fwl��So
�X���Fk+�D��Ri+X˰�VI)y7�%<7	��c6�IHL1�G�jA�β#_$QW�,�4�3B\iҜ��·�p6;N��
�'K$>T�����ĉ�����,
��Y3K���DDŽ���9�����G%�	�a��|���U�#cf�[qh����A�R�_�0P8/.��V�	�^�Y��!&�5�m
��N�k8���������H��{'�oܵ
�ƺa��G��Hl f
��%S����ĐZH�8�'b�;�q]�����/���y<I�D���+U��-7�&�qtrQ��OʆK/ŁD�%�Bp��q���+E��^�v��I:F'�>$PQވI���tଘ�d�XыX[g>�`�P*y���9���?&��C���*�B��X�{�����/�K�Qo���A��^�_��G'g�W��؋X*�|$?]��!/v�}1Rv�,|���M����*NWI�-�+a�1���"�5�.�JoD/�T"�::��'������^�6�Hi�e�
�����X.L�}�QP��]M����p����6�+���+X �eV��w���
��+:Q�)T�E��g�:�DPS��^��p�s���j@���߆�e�V�ԍY���b�լؠd����`��v*���/�%>�g�У%+�˟J�Se�1�DI&Am<�Щ8Jk<|N��W2��i�V�����:�N;C�xq�n���
<d������x�aׂ��4�.:asq�ڎ1���Z�N�ܢ�������O ����� �b�!,>�RY��q]w(���9诿�>����
7�x��*��:��bC�Ngox)��.�G<�\f��3y��݀#�X�N�Hiqn�����(i��1C�Zs�UŒ^�袣���Ť%��}{�P�+�"G�l�Ń�T5�v��d��D�k�'m�̳Hk��QV�Մ5��m���j�9�ũi�@!��V�tK+��r1r��5��wH0�>E�XE�df�b4��c4�l���$͐y$��p���i��C�F�m�6^�M`��	=Nk����V�9�Nj%/���gI�#��a�.�cCy�c��1@��F*ڙ�!�*��(�+^D�r(��j�zѲ�τ�s�+w7ci�^��irG�g�8Ai���$]�8��k�̄�'P%�6(�h4�ŌBp���c��m6�Oo�&���
��0b��j�ӊ�.���{?�_̔�'2�
(��0|8{���~�C7S��Vk��u�!>�#�q��KP	tN�mD}�R�xx9���U�ޤ`�YNE�BG���z�1�5zX[���}�<�%5	z�ӽ$s�������Z��n8h���x���H #Zx��4�?JWe�$#�|?Q2x���T�!:��_������t�)��4G��Q�Mʸkw�K<��Xᴐ:~�Fg����L���-dc��@9w0Z@h{�f�D2{Q�ry$�� VmS1aU��XS(,�}DiN5�0R~Qg��(�F�R�@Vw�����\\6v�ԙ�.�/%�O��J���tVJu	�l/j��ަ�6io0d�0�����8e$x�ŷ,1�RĮAa�x�,0������!����
�B���\����Z)��9�5G#g0��w����˯�K�eFgM�_{�K�͡��nH{T�A`vq�O��LL)��R�Y��HVH�J��Y�Q�;��q69�\������
EJT�i�J4<�p����QZG�5Ƞ��d>ڋS(��p�TR����)xrt�ow��Z����p.I��� �2��BLN�j@�@8Ū�L��ǧ�f=�`	n@�����k�� �ܬ�X-9�=Ȍ���Z�������L�gG/�j��� �E�#I4a
#���h���n!�&��,��B�3���__=;=6�L�}v��ž9���D���ܬ���fԀ�V�0ӷ�����ښ#���.|��g=T�Ė{2��E��#&��(�|)bX#]�y�3�(>҈�4l8�u���7d�i��`�����b���x��&�jMK�}��(f,F�=\���zu����5w%-�Єjp!_4V��>�H�����'��MfF^���+d�F��!1�+*X��ŀ��X�����	#k��E�{�Ѩ1�cyof8�J/Q�㊢��
�q��5�}��!'�`��qLf�'Y*oI��d`Τˣ
��y]Rꔒ3��¤�x+F���c��~~�e|}~t�|�_�4�c��}��2�s"�Ac3f*)����nn��I-ϵ����?����)���JIX�sO�g��@%�ֶt펐���<�%U��Ѕ�s����T�� 1;��U7h�i��i�p�� ��y��j��S2�-�`Q&ö���L�Hdg���� j����x	7��(Qd��ys��k�c���֫.�_��W�)z���R�@�1�%����W�^�Vf1ˬ2/V()���F�c���M���o���M	e�&%�a�TZ,:����C��ew����$/���W���b����e��9�׮������m?��` ��
m�9�8P;
�D�)=��v�PM0�2erֺ�W�Ո8��v�py~b�GƎ�^��J���b����єj���-�ӌQ��BE��.Y
���'�S�|�m�4�:~��W�!�'�t�|�%/�D�M�C%�-�P�U��&�ӓ�X>��N�)S*c��VK�|1_��9���߅n�o��ߜuD,e�T`d�t���鵗�?Eل�J`zr�u�?ٿ8��ΗU:�m�u�—/���j�l��I�Hh���ܿ�رa�ݸI=�}#{����_8�+�Ӡ-��1Vs&�V-_"Q���r8ʛ�RsІ����eHly�A)oI��I�bH�5
u)S:E��@ �h��O\�<�哆�+�E`�7U��?a���(שՇ��f�Ķ�B>�1:�I-�=�u��͎���;Bv���i�X����t�"#�V��I��<��Y��$��o[�NB��@��/�V	�,u*����2�O�ʫ�Y�%���Fe>\1a��ݭZOW�h8/k|ƳU��".�>[�F�?V�֬?
�?V,�^���'s��ZQ�#(�3aR6�F��g��N|� SuUdK0�����g�hc��\��)�wos�p���B�P���V������c�>M���Ly�7E3鍼%��*Z�f>�)no��
��hRY�8��W�
im�/�P]D�O��{$���OA�}�6z�^ġ��I��u����*�Pj�(L�;�R�cF2�hO�Ï����f?~o�Z����7���w���/0_$Z��X�׍17g"6J���ʻB�C0��𯺘�����&�^k|ə�|�@�J	�p��2����g��F2Uk��j4�|�Tk5���0�Q�T�[d��i���Z�l( T9̽�ٱ_��~r�<=�Q
a`�_�_
��D��)�#x�??zq�|.���H3�"?���c f�QD�rp\�?�mPݱf�y��ϖN��?��h����V�����R�\����R�~����:�jj\w)�f	m�i)O�������&�۷Z��_TH!}�L�{��ku�;�=)���L�<�K���&A�Z�wg�EN%�>(�d�S�@ؔ�Ɲ���h�(�׉�o�Z�� ���
��産|i�c�;�]Pʩ0�Do K�2��tj������}8K��Y`
'�#��P�1	��:|H��;�݇	ËԪ�ɔ�<A��3_��'�]�?n�3/����5��f�h:���r90_��i,���&�F�?q~w5g��{�k��t�b�|M݊�tm�R'A���~���$��^����jޑ!,��&v]��`4�Þ��A펋@�z9���q�}A)"6�P1����zJ�+��U�%1��js¹[fO�\��.BD� �n�d.��7<�SF�)U�X����FFz��&���.��]�#���%I�'�XĒ��0TH����c�D��æ���`��yC�2�dİ4M(�x�b�d,���s��ؠ�E���{	*�Aw���T�k��h�ǫ�)1�B��Ht��>&���V�*�4��F�k��(��_^h�P=�8쐸]ء̝��܇�C�	�h1'�PMx��I1'���bH��cI?Gg�!�ל(C�_���X�!!?wj(Nӻ�5Ĝq'��l��M��h�9'ސ�p(N�;�8d���CKRwQ�!����C͒��)v�q�D��}m�%ɶ8�A8W졐r�%��>$\Z�ׇZ��������(:�� �K�o�H,���0�JCt�(D��J�C��9��?*�\�.��X!��4����,��$��xD��LH�8����#}uD�e�mW����6Q��̓���CX�Z��
ϗ��
�y��erb�U�0.j@�J���޲g�99L��q+`+E���[p����Fx�Y����'�C�?M���p���ŭ��p�>�}8��pH%��땷��b9\-XŦ﷎�G�a��za����|m��L�\|�XI�@�7�V�1l����y&fq�NY���~�u�iWB�g�'Qʫsmdn$鬓�T�D&�kN�A��+j��awҡ���1X !�JH�x&����/Lʊ�T��Tr޻
۴b�&wȦ��n����j%�W��!-�)g�j�)���M��[�nZ��í�W�.KUX�mV
ٔ��l�a����S6S���L��Q�BI]�0�.Jέ�

5͢�Ps�&H�B�KE��X�E���;d�0>	��L�j)�����_�o\�����?�f���5�cY���F�������"��YwK��Ɠm` y��*Y5r�B
�	�H�b���.�T�I�����)�h`�Z��9�6f��oL��'�r�T�^�<�J�%V����)�~��B_�B)i�5�}��q	�`M�^��(���ލ�q��%y��L�A_�q���~�qB@�`�`�g�I^;��B]l���ϙ�ˈo�/�	���5�S�q%r5rD� ��A�Gcp��L���&�t&o5���aV���C�a0�(��سބՍ�:�c�-0;��c�#���*/��j���8C��;q�p�J�ԛ�0)�P/�m(%��u-����a��C����RFD����ZW�Aw�|>�ӝ�٠�{7hj�[��n|�^���������4��xE���'i�}l����X2�X��k��߲�ȀU�.1V��n1�F�\D?$묄%�����P���\�xT�'NΚ�0��0��c%W�2{o>�
#�Cj?d���1v�ʟ�&�p6͍��K�y�0P�?z%���T,����O��
���67��2��K��j��F>_kl
��τ� >���A��3��=�>)����%�����ȵQ����	�~�G|?Ǘ��־�'��l�^��%��o�Q����hH� z��Y7 ��Ӵ����P���{+,��I���'�CK�EJ5,+|����i��~�8��8[*4�8Е��7s�
z��a'3���\��1�𥉋ۓ�6V��*�I��Vo��*8�&�lb2굪UT�bR�1��
Ejc����~���]��*��"�_(�b�P)���7��B���?:D��D���m/��tj�ь�f5˄!Yͧ��T|�C����Fx��w��4�����[Yt�MKS��3�/B���;g����7�g���t�Ig5���ڡ��ݙ���E�����̙��l�N�P�U�?~��W����Q���|����?N&���E?}��b%:���w/���'&�Q�1�ā����_�� �j��j>���N�_
E�E��N�
�����-�r��������_�<=��'g��.�ϯ�tv!�?	��x�V��7�C����yb9ޞ��~���@�³8���F������{@ K��!�����K�#--]})��Ϟ��>俜�R�}��߫
Q���^�����/���V٫UڝF�+7���v��ꔚ�R�Uj�j^�Ѭ����p ΃��j�Pء�0p����A�+��?4��v���ʕ���\����mou:��b�{�fa�<}pؘ;�1͊�x�20z;��N� 2H��3�;���{�l�>��cy�v�G���V�����|6σ�(n	pm�*�Y�쟽9�gů�����g���\�1��ǗOh��
a�M��Hz�z
"���ٯ�r�>0x#p���<�ڢy#����@\7�U�>��T���[�q�S���{�0츹�ɰ9�N��'��v#R���>k{9\���ѵ�j0��{}5������|��#��V�Zzo�"A7H���
c��͊B�Vwt�A]�~c|�k
�i���n�*}hMjX}�/���
�xa<�&���ɨ\)��	�=�'7���q5��v67�g���q0Jy�7Z:����C��U��0:�Bb�.���l�37�U������jzI�rA�&|r��@f��*.,��T)l7��1@`�;�	��h-�U��=��q�K��(�Dw�G��������\�A<�L��qS���r��ny��V�٨V����D�U���t������������|o�/��$5h�2:u����;
o�>���w�!�w��E@�"�8�1��&�L2��<E504���PS}䐺1�5�ѥ�,�ܨǬ�s2���
k��à9�L����FL><\O��[�р/���ځ��>�s@
0KȌ���'�Hu�#R��n:�9֝}���*���&-7ql�A�1%Q��De�Z�$$��7|l/�������"v_����L�5<IH����t��!+�L�A�䉁�5ٌ�lr��/�H7���4�����܏o�̟�W�Iu%'�vѫ�[�|�]��Z{�$�J��W�a�Ƚ�x%:~�8�<;d��̗�]N4ce��a�n��ˍ�	�m���	rl�ΏNO��7������=Q�$�<�a�vf�c5¶g��ֹW���%�&|=��qJr\��U�)E�ix3�c4P���!�zl�w��^?�s�JN'�N��B�U�Tl�Uᄭ�zM��jE�g诧'/���9�藐2�g�w|����J�N�R���%�‹���H�0Q������O��c�����<8��
Un�DTX�r��g�Z�kg��"�zp��.5��
f��T�����$�Gs���]POuӲGt����Ps���QY�,��sO�y��=�ǻ�eM��4�톘���awN���v�J�ka����(xբL�6����P$N��da$��Gd�b9���C���&3�7x�!����N>�A���t"MA]�=3g�C�$���+
��c4YGf�|r0%fcL�����\X�t8G��%�a�b��_��$���0�M�T$5�$�Ro�{�^Ƹ"�&��]�kn8�W�=��	L9q��J��7�?G�Q��H:M
�[�$�C�fo�@7ZY��G��,E���(��L|�SUC��E�i�+hj
���2�{�A�M���;ms΢�L�t2sU��BD�\��/C�)=Y˘��]ծ�qh�q�`+��Y����!s׸w���Ue�n݂��y*�$�.�N�Dvr�Єw3���K�V��N�թ�Y�ounTܦ0Y�E
��=��(�^��T���x�bH4��]��b�n'����2|]|��P���*��&l	��6�N�xK�K��v��a�[2� �v�$�pHB;m,��Y°9�/|+���ly�V;�/6ʭ򖷀9��	b@�{���?ۖ�ah��"w�1#@���l2�n��d�����#�u�m�������s��wSXY�)Ք��+�_d1���.�� 94�����7����M�w`-�6n���n�.n�c�EJ!��2����t�*����}q��x�bm�=e��?�:&0�T���Aa�緼�Nە�<���c�jW
�c�Jbd�qp=���I�x��`�}NdX����e/4�0���?�ʳ�O�?�i�t�'	�������-b\�/ئ�`Q��e��V"�"��0�q���Sq���aj��A�!�[r��k%SU��Ʀ��#�6J�2�(Y�*���c�E���ݲ[��
8�������y���Ϣ�ɧ\cܺ����,���x����o��W�?3����_rY�V��`���v���D�2��A�	E����2G���s�e?��?��S�_.�/����<���W�W�zut~��$�����(��rLJ�/��@\�k������ 3�5T6��h��<t��?;xIa~x �OU�<z�t���?|{I�`��ʥ�w���o�����2�mr�r�|�U`������_�0;��|�P��ˠ��f���z{_�����x
�.�b�be�XM˅"
�q8������4[�jl��e���~��W�~�����?0�$��_NfMyuo��v����/Nϲ�~�[�:'��j"��D+�Ak؆���K�Kf�1y�P`��i}�-��=�����&\�0?�&�K���B܂�?nt{�&�����?��Z���U��7�X�L�H��E�j�[ۍN>�,m��E[��2r�r�w/�}����|��p~�'����G����Û�&�5N�9yU W�?����S��B��8�w�RzUX���=�]/c�wa"J���?7 m�"!�/�u���Oߜ`=lm�Џ!S�?���3��ʙU�2YZ�`6�`�����xH��x�Q"�ɸ�\ş�`J;6Nov�]���o	�}���&��_{'�2,�#�Aqo�@�\�7)1DD�W�0N=���c�3.�Y9G.]q�Hb�O笑bG%	]��4x���rn;��j�����2A�B��)���z��/��L��Rʰ�P�Ŧ�jl�f�9�����
�L�SRg�㦯��4jt?�]�~*6�w��Ke�����a]�LB'���F�V��B/6�<�u3��D�/˜;:�5K����ocك�F���C�T�0�
#O4�����)�@Gux��T�ӑ�NI�f��xf;�A&��PF��1���]��F�s7�qD4t4�hS<�ٰ�[j��[��X�_S�r6���{a���l�K����2����ɯ}�>�+�g�-�={-!y6-"srg�}���k+g�^KN��栿�7�&X�s�h�lNsp�)�c�����kw�0�"����^KJ�f�KN�#���^��T���mQ&�5E.G�ZIi�c���,�kw�{9�-΁�I�ʀ�y^�P:�T
{Zi&y#G���M�?8-vH߻̊��WK�m�ݙ�ԏ�Ȟ7�8E�ڷː��p�*A�k��c��#�X�;��Qɱ��87��1X!5�&wBblN��d^l����i��{��%Z�^.���ř��s�O{q>�[}$���p�sg��Z�z�l�b�4�
���1�%Ho~넖�J�b���i�L�,-mr~�Z��ѝ�f?�	F'Ϡ
},�4c������iT��N��0�Aȹ�yXK���`,2��<%��&oocg�j����.�$Z��L��2������k��"�I�@ܗ��&N���5 ��O��0�{ [b
*�b�Rje��bY^��^P�c��	�&���l4���𖳕c�|/��\`���J��R�8ƈ쯲�9X��P#W��jQ�u���P�M�G����<JBN��|��j]dY}�!�c���پ�4�ư1r�R�/�hd���}�N�E�z�7ȉ��s�V^�	!�Y�^��^;̒3g1�_8��^�$
�p�,M�L�؆1���k�֧H��ĝ�@�˖Y �}YE$��e�ӂP�Ȣc��>f&�?(s���p6D�H�王x��X%n?2���aj���cj$q�#j���z�Q��2,����6����1�l
��N���eHF�q��4ꋅ��F:�Pu7�r	��X.�bdH�ˌM����4�4�cY	�HZ�p|��h�L�k$S(��}g�8��D\�UH�R� �Epޠ�����e�����b�(�������,���q���U
I���K��r$29{%�ħ�D��1�8���)iV���7�K"S�,E��KЅ�&#�.Ȥ���"Qh���������=I��ڇ*RD�D��
ǥY���d$T<C�NgAY�x��v���E��X�+Ȕޓ�-&�kG�j��Y�KC>�3v�,6�N0�~�����aEx�0e��d�|Z<��y�T�nM	)����`NJ�R�by�JY�"^�����tx
O-Io%����1��p�G�>p��Q��0>��z�����H��Jo�R(Ǖ3-d�9�d�I�	��b�8���9 V\��g�.
���� ��	�1��2�@���w&����m��l�
�7��v'%�Ē��̈:uPJaSol�f�j�32oo����S��x�l�8�&�Q�ῃv�
#5���(��)H����)�υrt�owTc��.<	A`z�.~����X�	q� !�Q������L��ǧ�f=�`��L�����/�
~`�쟝�j�C��P�Z�%�y���"->����EX~`�<;zaW���,�I�	k�
�,D���u>0!П�B��!�h�&=����g��f�����M��/�ͱ�&�7'���f����ӓ}�J�����W���X<̏L���C����T�*�Ƈ�zh���ZB�~6@�+�޼��8��z�uU��b��kU���NɎ,�2
ݣ�T�@���Vg<��Z����K��|��C_�$5�BX��!��8� yo|���@@Ր���m�R}o�"��W����6%<��F�E.ҋ��0��/�� ��RT���6�D<ʇ$mZ�����/��6�����UU�'$�[�B�d$l�Am^��c;�a ��:����^�D�
���E
"W~b�@�mN�^(s��%�{�Q�t��x���kk����$���;��%�ͅ�_����w	�djF�`�$,c�5)k�Wk��X��D�ُ�T���$���T�i¸`oK��5�r�KjIR4�5�Q��fc�mɾ<����]�'O
�Ӵ��dx��ɥ褠4�0J�b
CŤ`A�G�����R�
�lʳ�eH��ƿ�(����������=l��5�lُ������n�9%H��#�4V�@]&�9��#&���Ɓ�`���¢#'�����s
$=$�N��ai�O���yjy9`'sk�Df/^()���B�4�U�"E3��ὁ�ˈGz�ł�m�^�d�ﰥqgh��?$��9W��D.�jiCe��<�%�F���C���-�y�hۂ�ˍu}���>�Wt��~+���#������
ɜ��GB�%`�W^�D�I�p�Rg�j�G�T2�R�ZC�K���Z��Y���T0*7�~�.
;��]"���d#�x�ت�
��НI.���6�ݓ��t[s�^�4�noӱz��%Û,{-&��q�+�o��m�N��K��ȷ��g��Ô���єt���鵗�?E������W/��:��'������i!Gf�����f��ӗ��$��Z�]�P[4B�����,�������@�Rh�i7nR�$�ȑ�k�^8��Ӡ-����`��q8�Kg��\���L�j�)�y�Z+��_;��B6*9�O_/=@�GG�-m\sR1$�0
�&ebL��D~z��;e�WD�?
�^:���o]�:F��n��Q"��c��� VۢHم���&�4d�E��#0o2�^|�T�*<�+*2���/-��d�Z���_��S_�dI�M�cի�c�a�,nU)IC��UȖ��A��}L�3����1�l)׿
�q�~a-�G�=E:�E����O��o�5����0�D
\���n��Zآҹ.��'��`B��Ï���(r;��l0�˓"6���"�
iG�W�~�O�l�A�C�y�p\D\��k:�5o�[��1�U�I!e^0��f�1�A������Gq������1;�8F�Jf�vvLz$8~�2B��L
|#��b(��I?�.�Dx��1��.�����@����Y/@����R��5O�4(�'@��tߐ�p�FQ�K�R-[,ia�� ����.Z/�2.=��<k�iU|EM�ez$cƮ�lLf������
�(:|��.m�j��8|���z��-�F��e�Y�I��tE����g<[��ڏW�q��H#�W�w������
o��:���(N��b���R�Ah��6��Յ�Ժ!
��3����l@�Iؐ��+)��1*������>�;D+�� �񙒝[g>�˜f����1K��@�Xe���6$�
H��+�� �W���^����
>�T�����\.ߏ�7�,3��r��U���?��c����]w��?>�����)lU;�F��ڕJ�QlJ�r�7�N�߼���X���C�_3��])��ϸE+y���i.	��S�v*��У���7;�$Y4g�^[�4�;���d8ȕ��wWB��Ŷ�o�/,�l��h��Ҽ\�
iS}��K�B�Ӯ��rik�X��%*X���~q�>��?/Qs	d,﫣�ظ�$����=W��,gYf-�1���T���2��?��^b�˜*���_�r,���z�>��C�Z���$��S��x��.H*�p�e{T>|'�y�?̫ɐ�wE:�/�^c�[�v�Giӓ-�����Y�����7�j����3�w9�$*t����9��n��a���|�jF?�?/dS���T��Y�9��m4�����_Г!��ܽ�?���ے�>�����i��/�:��Y-��,X�e��WD�]������~���ĤI�&|'?nF�/䒷�*�[MX�R��U(%'K2��%/9Ws�s5�����SaǛZ???�.Js�z��
$��y�^7LC�L�4�U}"��l����{�_�끂�Vr9�:�V��)����y�E)����W؆A����R^䴢H�.O�)Q���~���Я�\���2�5�]ɤAHe*����,���ޞ��~���@��Cb����B�/jfiqOJK���Y�	��D���P4Z`q�4����?�3H�$���X��-���Z�N+��-�0�c�k���QpY�P�"��/O_���������1�s*����mѠX|�n��x�5�w �.~'�XI�-hc-���^�`j��~����ӿ�=�Fwv�?��>+��`��S?8=99���/�Î��G���)L����U�w�C��Af�R).E��J)��xn0=�J�|X��9I�I��Z�Ox₮W��O~|����w|���%\�<>���=>9���˽���g���g����������J��#o��'�?���e���^k���V�z��Ż����#�t��-#7W��j%�����3rQzu�ĿEڢ��_ċ���ݮiG>�?>����K�
BК�^ڔЊn�Gi��/�U�[���B������mO����A����"�P��I-���ŲZf��j���j�}	�69 
�}��i<�\r7�MI?nؑ���a�sF��H�	����D���CW�wL2��qqF�E�9|<��/�{�1ѡZ��s�j�&�;k_,ZDo���x���`O-����A�b�-SH9��S*��F���ox5P6��`�lHdp8s�������	iNe��m����d�!\rP�u.�e�V"x�"G�
���s"11��ɰ����*����Cy�V�bn
D����f�Z��m�
��0�E��]~^�+d�K{H�1M�A�|�{ �|}+6Zb��r1iH��0ɡ����]�ܮ�sU��h`qr�\�-:�1L1V�l}��ad#:�,woQ�xGSy}�M�k�ѼQy��lr�)Y�c�@h8����E��uz��7�i�ݥf,b߷�|���|+$���z���,K��WQB��2"�j��ٸ��`*���@��Q��J���x��Z��q/�lm ٳ�L��q�/L4�A_W�u2�v:u���,W�+'	��p�5�~�c����G'�q�X��@%o[rHuK&�]���c���8#�t�6p�ϗk-�T�/6<�S6�oѫ�AH��l�1�F�~ƃ��o6��6�^���Z��4_
/j�l�z��L�s�����3���˝J,c��qn1���[ձ�����ϥB���
>w�3l���V5�o�b�պ+���Դ�b7>��{T���j3�q��� (� (��AP\у���/�-�&�� ����I��H��������7�,3��O�_�+^�~���#\�w�<����yRq�X�?O�?O�?O�?O�_{�T��y�W�7<PʙM�p��?C�?C�?C�?C�?C�?C�?C�?C�?C��9CZ`���F8U�߆�?�G���Q��o�a{
h���t���6��7]� �N��tWF��טUf��G�`��%^�0>�J(��I#m�9��م����"�)�i���y��VB1~z�C���XݟM�5����g�����->��:F��伭J%7*o�o�
̗��l&b��j�z/���'~H��6�w�?G�b��;j�<h:�/U�̀�ҟF+��>0d:e��4�i��|��*���N�O�O�c*���ѣ������V!��Z"&W�Y��_�n��
�w��]�L�qp	/΂���(LZ�Q���\7z� ���̚��w��ml�����g��Q�%��ڸ,���3`���_�]��?�j8�b��񿣔l��M�/Y6&F���z��&��]���Nt`�8�8/�'���c�d�Uݧ��4��Rؾ.m^�@s�*��G�_)�|�vbk�V���4?�H`���o�qs�!n$�0��M�h����'��/3��15'fm槜ⱀ6, �V��He�#��;����ӥ���v0�v�7*%���e�4���`��vT���w/+��+�SJ�۝��Z�1�82z@A����(�T���I6�>�q&4&�n������ZiÇm<jg�+V����hR͗�^�
<�zR9�7�t��� ���Qhm�ln�@���ɨם���&&�yqzx��bX���uw8���t7�ō�cL�	Ю5�t�@�V�I���'c�Q4k\��NwCoA_�,��Y��/����"c���^����!�v���>�H�t��>4(��k4��
�?�t���O���U��ғS�8y��P��^/#�/15.]D��L�D��ԮUV&3��l��e�k� �ϊ�|����<�'>��q@��wP[�h0��fc��?��d�&ƣ�F�3F��I���FS���Æs<�P�>^u0�p���	ƪW���*ӫ
�����o���$g8�`:�zRҩf�L�]u;ӬI_|`L���o��fJ���9A���'���$&�u��>00.��� ���lH�NM�u��������୧(d��)D����.� ����tW�h2#��9r)�7�v
�I7H���dL͛�*�€,x��-)!H�&�6J�<���O�\n��Hm2?5gc=$#�m�}^f���'�~�$^�|���2�-�������~Y�W�����5`n�>s>l}�Zw��C�٬2dw��?�?2�������0~��`����*K��YVfn���Va(���Wd�T�ם\m���Zas�x��Wz<�ŸR��:�Ċ�k����1�E�n��S8��0��*�����(EF(��f���o}�z���J�h�Z���SX7��
6���D�j]��=�
n��{X��A�//[�9K���a�#f�Nnyn�s��)L��*�X�M���:C?�$U��h��'�����%�j�]@;�[�X�ħ
�咪:��Q֡�b+Bz ��m�R���
�Hi�}��Ǐ�f�~��U��ijP�%P��f1�L%$\���*-�+�:�OX�
wo�*��|=�;hH����h�6�-<~�K�?�����<
��F��Ċ�oE�y�;q0�+�w�$��	�Յ�G��NG;����7�w�i'?_n^M���q����w��e�+�,^vJX�T�p��w�
���NÙ+������z>�W۽��T���'i��EF����j`7��v��D���S4��e�*����
kz{xr�;�?��������?���K��.�X�����q+#+CL�a�F�$]���0`�$��^��>��a�I�<���c	���xi��93�Nۡix��OmG��b��j̼�����wԪ;؊2��ڌ.+=oI`֍���(q��F#ir'V��vFr'�F����[O�H����-���+ٳ�����cš�bq+��5������5G1-�؀����
�q��
�l���2	�x1<@z��_�{�=�p�n�@�|��p�E�p��N}�e�$�����ߤ5&3h˜�fs��i�B��u;r�
&�՗�B�
�`d.�+il��B��X�"2Q�{���B��.�NE��/'�2)+fv���0]:�z
!C����p��P&B�J�ӱ�k8�G�>����?Z�5�ۨ?E�:��WiIMX�����%��׉
A�iY-/n�
q,o��VݷG�'�����0Y��,0�ʂ��N/N�	�i�O��H���!,��p��]������N�/D�:�°��� ��0���\>�1�%�	�;��y��<GRt�a�N��8��C�������8���k����3Z�?�����Y5�O�3'Q"i�Gr�r��oJ�o��Ijż=�H���n.)�WP�%M�r�洛+��U�y�K4cj��T[M�#�q���>k��R,<ϸW�;t������K����S�4E�ϡs��
f�bh��?{c�*w�x�/�)�hj}��`o2��h�yp�w��9��~Z�K������c�~�7E|��֨��n# w&ߌ��	Edg�?���z����4�1v��п���~c#޿w6�X���.N���
|;�?1=6���`����ɋ���Q��S>��mdi&��/S�/�,���-��b�>����z���>��}�׻��gK��ϲ���룿�.�k�z���[|���k\N�F\��K���w��}�/�xu/gc#w�����Ukt��n�?��{���ﻓ��;���\к���׿����K�����:h>�l�}������7߽{�y�;�bcSl���=|y�ߏ�_>~���������p�SH��Z�ߺ!��[�����53	�_�w�N3�+�܌����ׅl|�*�vR]�����1	��K_�Q���u����)wLX�f������W�-�nW�m���K��<̟>E[.�,�v�U�Z�8։�+���+3Z�{��prF3-?\�<�>�U�"7������Ć���N��{�(��:�pv��P�u1�ޝE�S|����/��h��X%բUIp�L�����=�	:A�c
�k�/���`?0�t�U�o�Y��Ӝ�}�X��V*��xz����e30��
���J�U�A>_)6*mo۶,�F��K�~��k�������u�'�-q������("��p��>���������gw��u)��o���>S�0ؿJ��u0`}���No����v0Ȋ����u��#����~�Y�(�~/7�����g����gg�gX"+�s?x�q=�M�&��0�Zw8�,�Vm�R"t��4z0����U�5���v���[|"���h���*�S�X.�Z�|�S,V����մW�)�|q�<�A}�������g���r����O��z��e��i��S��/�����7������;�U�Ɓ	&�ciD���2���O�ON�N^X��pzV��Fp@�Wц�?Q7��U�z���=9/�:Z�|H&��`����8[6�7���AHAr�2^]�azr�z�`(t灐n҃t�w��Y�;���H�G�Z���H'2�.5��1�?
��I�F��
&
�\O:'�r�iBC��6<ȬX �5&�q#"'a�o�	#���\&b�w����O�T���,qU�E�Kr4�������oN�S���->t{�ѥ���N��廓׃����br3���շ�.N�2%��&`?6�bӠ�kw��3��;�+��5�\��ؕ��%z�ˢg��;���K��n �1=Fq����i�/
�D1�wv�8!�p��s��}��Ecn`hkz+�;�ƍ
�G#���wM���4h�>�j6��T8��)�1�K�AĂ�C?��U{��kn�%�$�h8�~�A��Y!ԗ4F���܇��!M�V�E�hpx7
�ݺ��{���i���bz���1��6��ǩ�${����v���w�[�V�c�'��؞��)2ł��
��~�[C�$���p��㒷��k�),�p�1?�L۸N>����#|HQ5*TC�j@H}�'���NJE��������M��NÏD��.�^��� |���FN�^���⿪��?>zq��``󭮵/)�4<�S/@E�C��?~qv�=�a��R��8�~-[,i0U>�τhQ,A��ʢ��ܠG�	x�ѓuf����Fjr�4i���-�NN�,\T�׸Φ~��.�?��<���L�0�Ө�z`����#��~0��o�S��v-�|�;����IN�Y7l�d�G'G>v�2bl���Og�o<�t�3�0R ,]��H���s�J`��i����H��3S����,���h�!�0�:ٵϩ�:�g�ʎ&��7�Rz!��j
�Ւ�沠�rD@�	�q�C��<L�'
�`�
�s~�G�D0���7�.��6�	��v�}~q����ѫ��/Y�ȠgV|~Y��Iw~|zq��
j���-kH���I�*�6E����������{�^�ݨ@l\.y����=�$<�������H*�HUȪ<c:MUZ��0�]P]3�Dv����?'¾���YY�e#��Ɇo�*��5�I�QF�%�3{�¨�&�k5��+b����eÌq<mgx8�s���$U�ӱ���V�YK��|}�.�����(�yfa�B%�[�Y%d�/H�-�y��5�:��F>�k�[��U'b3g]V|R9��f�/�zѧtqn;�7�%�˘�:���:ū(gu�}AdZ�9=98��j+�Wj4�Np˘a�¨R���C�W��e��d��S�~K�EF�1��."���ڃ�N]�=�)��xO�Գ1��������C��Z1�u����v�`�p��ao��/�x��)Ȁ(]h����JІ`ے� ��c�٘����7l��$D�V||B~z�R{W�ū�S?�4j@G�~�Ѻ
R&�.�7�7�h6��m�g��>��VܧB�	)r	�j(cQV��)�H�:�r�Z��+m��jm�JP���Ab�-��2�Cdd�"�$z�V1k_E�U���f�� ��2A�Y��#���1I*J�����Z���;:���\���H�j��R�=+�i�S�����mM�c̕�ԁ?���/�����S(�m��.�i��=��$C��c��F5gyO�f�嘟�2(*��L������l�`r鷀���^�ҹ����	Ų�|�E�G�(���(��6ґ�@;f�d�.e���g�?���K96��Y��5d��N����*�,�h1*�<Z
�\��Ɗ�\Q�����$����d ,���Q~��*�������')݈�jZrR]�UDW<N�]��tQɭ�ˆk�ln���;��ř��m�}V����j�pl�cZ���`��Z��yZI�.��0;e�ӂ��%5��#~՘�qOIE��L��W�|kC��dm�I��p�#K%�m��g�|ص�x�vh�_71�]�4�G�̊X�_�
G[+BcwǤ=�T�J�����`p�	�ߦ>��(����FJ���1�3y�=$F¬M�H7��e��.��M��d\f��;(�5�W�.�'>�A���uV�?��N�ڧ�c���J�����'�w�㉼��%]D+Yi.Y*��1��ئ1n])��˛��fcF)��|jc�U)��&�
����H���Vj�p|�5�~�*֞��2�B���X�SK�QJQhR~�DU8+t�z�@	E�u�
a3�9aBI�A@0�Jْ�ב���������E���_Oǩk��.5�*�/����u
E�
$��;�
V��Z�H]�����{�j�+�6���&���hC�i�g�?=A�J�>���
��~��[�g��`֧=Y��)���ZP�y�u����E��ޫ&�� ;��Jz�P� /<��gr�\��������q2�@��F9S��ÇI�ɒLBg�"8+B!�~ԙh�įHw]��z�
�Sk�W�ɟ���-�
�D[�?�?>�;D������8�>'1pWD�Bg�^3ij9�%�.Df�̘�����Ɋ��4�z�"?Ľ�єz��8
���r��`D;�[Q��Ы�݈tc1��ب��tU�l*���Љ�|9�^^��c�0�i'����x�Ǥ)��\�ؘ�1u$,�!�C��[��b��L�GF�1}�{�ic�������(*B�s+X�c^��!"���Z`���#�'
�YK�K�i[�rv���j,
���67�L����{����
����@�)�#�M�yV&�y�|�x���>�r )Ƈ-k���P��?�>��p��X�X�,�Fj��	QhzQ�f��gdV�`ϭ��]��L�5%.2�ȝ@(x���F���>>"nl�D��4�:�Txᮌz�ǜ}
.#��bSwM0Є�~NW��
��j�"-R0�����w_BV�RK�p�M.�2�)�N5'vK��=���-�Qkr^�x՘����d�7��6;��JwNj���۽$w܋�*c�Ɲ��p'�+,�ӱ�dtc�i��b�S�\��/n���U�իӟ�)�lf��^�9��-�Ѥ�"��.Vƶ5����9�3Q��Og�_�Ըo���LB.��K(�3�Q!�	[&��][��Z�ih�psj�m�����k߄��<͊�(���q��`���ͺ�Ƹ bw�Q0k��cB&��q4B;J��)%���#yNB(�߾��ތ1b�$xH߇��Ⲣ����.˵�=t"���ƈ��f�>����//����ٝ�1d�ŋ�1"�Q�\���n\�l�<���U�A*=�o10Fb�S�����R�uvW��3��f�`p�Z''����������~�]�-2Kæ�N;���S7�����k���
��F�9�i��u�<5����Xj\i�[[���N�����f�������|��ڠ��K�~�<����V(��#�P�R�h���%@������:����++��R(��I�rv.���㉈��Z3P
�y
��")��q�I�ri5��<���
O[t��\	�ދJb�(!��l��眍^����#�#1���_�`W��*��L�H��G>Zpŝ�rl�[����>¡a@ת�x�])d�Ū���t�&HI�a�7�<Nn��}/�m����Y�T�=��}��!�cNd�����n[��l]�(���-��Hx�
f.H�w���w��-��w;�"t
����`��A0"@YT-s��7U�8����@W����c�)�'~1��y�û�X°�\�x�ݽt�d��zAcR�'q�>���+)1�'�n+X�+��pz:��7�t~KvO��]�#Q���!�̶J��$�%�~8P#�����I�
��g�
��\(���LI+�R-5`
��!��;�}�8��L�8����#>b��Z*]������<�iw�E���3	����4�"�����1���2 �#-9Tm�cwB�7][�D�a�|{�ˊf��(��0@v\szOp�Q���P�ȯ��/ţ���zj8]XXB㇍[6��Q�M��EU*��qB1P��_�
X��^D��
��w>v[�[�P:�)�
[�"��"�i�~�|	i�h�T]��
-�g��E�?�7��Νz�����@f��F=�����*�;���SW!�Y!���߂/4k�	�ŰW����4{ �y�=�4³gcc�@
|��@��b��#G0eP٠_��eyҙ���N�(+��N4�Tg8Ҹ33�;�-|U;/�׏���o��i,G�3r��늉��ᅨ���7��ao6
$nF���]�w�ǝ�E�0��B>J\���K�C��tӉ�;W�y�-�M�5�0;��G�Ǝ~�d6
�)ƍHͣ���᧛;�S�\�W�7���d*���A��{t(0��d�1ړ1e4��U��?�jE�,�
��qei%��
0�B��q��ū��{m��B����?t�A7px;-P��?�	�ܣhW`��%����gE�uE63�k-R�z�H�k)6B�U��{���5�dW�k{�g��Ԋ��t�]���Q�I�
z�n�F����t���}�k��F4D��YXaWp�)c�М��.l�OE�9���Pc����t�"��l_8S��IO�l�$����t��gj�heґ�#�Ӭ��1��i�J���@�οh���L�妟��&I5H�|�.�wM8ؕ��\\�uh�����4�:uYx�b\�������#�&|=+����)�Y�:%�wÅL��1�@:�uyZ����n�V"f���'��te�pB�t;�W���uw<�-��.V%7c=J���ys��[��$kj�|���Əd�JV,�i�yƗ�F���w�.g
�7-ja���Ej�4m>V�(�h�c���H�;$]�>�9A���M
�+x"�y[E����is5�b��D
������i#}��C��0�0�<�FBe�딂m�Z`��Tc�m%ݕL��;Z�%�kα���(V�N�����u�BHD�w��}M+� StT��Z���:���'+
Fo��GN��!����=�y����eo؄Ƣ����:�d��93���C��?y2X���8G�i�|@�|���uOX�"�O>�]��
[]�lכ�K����,)d0Ed$���q��y}��yo��������;���}��}u�����l��%ѕ�6c���o�Y+U���Mo�]m�h�^�px�{�1�>XT��	�f8S�@%�;CL+���~�5N���E\�_�'���Y�c�Y`d��C.JIM�\W�*
Ś��*�PX��ů���+0�0
 g�qp�+6#[�Љ/As
��	�z���;�j�D��� �&��@%;�%%��қ4��X�<�B��N�9�(�Ֆ�]cI����d�(�X0�l��w7)�5��gE~�0^�{"n�I��fi��0,�~��h}�Y����	��+679r��r�R�����A��3N�}1���;���$�"3ee�&�N��R�I$볁F�$�@�VP��
M?�Jx���(��)�/���8@�;-R)�W.B�
Q�g�N4	X��XS}|�"�H��>�kEҒ� �*��G3�
]?�_�����7'a۳�D�����F������q?����9}�:Z��fk9���sH��d6dD}8��D���)n�8
�ϱ�­�\���E��A�^�\*��RmQ'�>�����lX/s���	M��"��P��@��G��E� �u�����@��>O���8�ۃ���^�E��ݣ�iv�X�&��kk�pS��r�9�ё��R�Yv,�
O���~�}1�n�2�eSt2[���Q�Ti�L%��.���j9��
�[���S>�r�r�������rTE���>��$�!�u�:+
SZm�69xG��#��G��W"��G2��V�B����K��AJU�h� #��!�&�
c�q�)�a&Uf/��]fNw OF�*O�Ym�Iؗ���f&cp�X����$1�Y�'G�̅�i�F}r�b>��9�N��E�wZ�ޠ&�~C�F.T��ռ����꬛{
k����א��Tp���a�G�x��f�,.U5�F~�̾�ùâϜ� :� �\�#��I���$�Iq�hO
��6CC�^�S$x A�'�*h��?���&m��J_X	��-�J���J�hIhǸD�:�7��\�6�I|l[ހ6:����?Ms�H�O\���yĈ��n��?��V�C����5w�zBb٘��5�
�Z�y����в?wNE��"��q;���>�η$�GV%����ښ�@Wj�S�����芥�E)�D��+�9EWDId)�\2D�
))�bK�	��[�֌e=?w
˹װ�p	��%L�^����Mqf�+��&�)���q$WU��MZON����=6�kDq�1.mA�Y�a#�f�rQf+��D��(����k�KGѶn:[t�6=6[`�!TT���/nc&�w�H��E�(��Rm����[۵r!�S���R��x��D��-�"#;Z�?�,��R 2{x�G#i:w��%&4�xH��_�/��vc@#X�'�+�=�Vz�.�G�����1��.zUBy۞����*#aa(&�����.t% �bz�+��q|��&��}֟5*��u1�(�*�B���>�kn7�Up򌜄1�8s�D��J����DM��a兪�{��[;~�{�u�K��(�?:�C,�:�Y�1� A���/��f�]-޾wq�{Ie8�{��^.U����7�Ǥs������Ou�	J���Ñ�q
S�+����:�K�#8�O�Q;�O:��,���(�2��r����>ia��I��?yq\�#G�U���d�ץi�S	�e��C���.1��2Nω��F��x�ٙԉ,��Mg���X�`v��(C��LN��V*s@�RY	��a�9���pz�,�'�ܭ~~-6�KZ	��c�
u�Z~c2����̉
�iQ��0�N�U_�<LA�`+�P�ã�g�u���E�2��SL�m[
�E��9J��3{���PM��V�F�k��|>h{��튽� �s�pTj��4�6�s$DQ����ȹK<#c�-�N)9�C�J�r~�+���/����WQqB����(G�3�8�2����'����up+�H����/Ejn�MQJ+�B�I/��u'���4PaD^�ߔ
�ǀ�.�!�^�ł�T+��-#3/0;\J�lA��a�]�D��
���s�v�{~!��%H������/$�`�oc�
ؐf�Iu#��S����9���my؂6��B(�#��<Y�j��@A�;�,8HgQ1y��Z��7��)�_�S���K���=�_�*���ʨ2i����M���A=\[�	��Zg���3��DR]5�=�i?7Y�M�̢ia���X��(4
�˪��7�����a5���i�+����mb67�A�h8�t���]"�Ǐ������8莹�� �v����1�Ba^�'�p�1�zeXMaN�%jlfqI�h��8���vpdk���GN�b%c;X�!�D��C�-i��iGr�Y����/��r�x^x���#zx\�dSZ摝���hp?s{�2�)Q�+Ƨ�M�aQU�4͒]��kF��6ֶH����]����$T�l�k�'�>�P06mF��e�Ձ��3�ηc�N/���O[wu�%&�5[cu�H��B�is��pu���ʟ�'��-ajru���B@�.VX��dI,�kZ�2��Q�EW��+��f�X�O�Sݬ�KF�V�s�nz��+�� �=[���>�ڢ�P7m�Ej��6��UK�5�_���
]
�ѡ��Ka4�;%v�~��f�uԔ�b�N�5������
�\���Y�R��2�. �r�nJ�J�.�F�?k]��@��H�fC�o�>:?�-��q`G�5QVi}F"�u(~e
��
�����q�Z]qk�ToC��1�^V�F�m[�I��Dq#^��q�w)	D�0ޟ�<��I��Z�:�-62���̆�u����Ӗ�����n@Ԕ��
���پ��n��s�@�b<�b��R�� �;c�b��UDK���"Qɂ�V	-ޒJL�^�Y�j8f�{�� �	S�MT���b�&��9G�=\��z����������Y_��6D�K"�1��?�[Q�7�B90���r��
�Fc��ɛ��(��A���'{�'{�T�{^+���{��U���4A���ū��Z�1(�6fˆd�"��j�1�5�(�!sf���%6�cS�ְ������9��=��ͫ��(���"��6���A�ltj+OlBm�)q���ظ��[��(Bo<i���*�E4$�T0hX����a
�!�d�BL� N�œ�Bj�Jy����E�i���V&��>н՜~%�L�E����P�@ɏ��E^cc�)��KT�cI�KJ̈́�D��EA`꠵yv���Ľ�ds������vR1Yx���7QQ����~��c�eR�,V`��dH��m��`�`kQ��5�#�R�yĊ�e*I�58��"�w���pL�YC�-.����ƅ�l0��j�P���O*��>�$ֲ�j"�tÌNƟ�^�-
M��@���\
Ož[��".���rO�U�0����u1 �"9e=����O.�.Y��H�U�,���)�&�-%.���;�QJ?ܣL갗�*xf��T}�彂3ڪ!�__��'�>��%�,c�
�
2�R3�N���ΏNO���y��o�Y��	��'�%11����
�U#**d0�Ɯ
�LU��ks%
G�x��w��V�Ϝ𲬊�g�K8'lb��G�K8a|�$j(\xBIa��Kl�*#�4��5�����\�vw�����z'hį@W��]ko'����5B�w�bW��el�x;��� ���u��e�`�i{�ef�!�2��]7y9����iK&�5���	e��B2�KՉ8	̍{�<-}9��t}�9�&��0�0ŻcN���?9�E��$����1�R ��9�Z��)R�Y�lB�z�$��ɥUS�̽>��+8L*��.�*5v���Q��N��b�(�fh&LW����e��^��+/��K��tvB!Eq4�/��%�����v��Z�F+b��w�;q��l��[<�5����uN{�$7�?2�q*k
˪0��c�5%@XJ�7�Bg�L:��=!E�"��խlQm<�@T(��Q�V�d��{�srG��Nv����`��)ɓ�^[��?-{��٭��T
�W-H�s'C�ۋ(Dɚ�gYO��Ļd�y�T4�U���֎R�@�Cs?��x�$"�.�]�R7p���?<:�\X�C��5�P��7�
@��a�f]�O���6�`�!�vgɎ�B)�ޝ+%�Ͽȿ򏺻b[ ��®����v�@A|M��~3Z�1���y-�J�,a�&�SH)�J団-{J>�ף�S
�o-z�`
���@\}$�4�nU!ZA�
r�~f7��� ��Ҩ1B$Z#T�u�'l �+��Y�R�83�r�o
�\3Ǥ�ze\Ŋ�v��db|
�ڏ5S1v#W��z�i��>��K�m]B�E�0yӔ_�aA6� y|���R|2�R�ۺl&�0��5��"�C�s	6�F�+zBa�oa5�͗��ņm�fF��U3���ˠU�ݎ�R�Y_u7tZ��|����4�LH�^�1�
u�He��o{�@�Js����&e �\�3 g����㲡}�GǛ�A}�b��u��^�;;�+�@b��Bv=�B0��a,���-v~�ɘ^)�H#�2՛́۶y/3�HT'�|VS�Γ���h�d��\���i�Hf�� �$3.5�E�I"s�U��K��~˝�e�&0�
v�xF�/E�cm�H>��@����(p������w��)^K�h֍ЬK4[s��$ZS-��96q��ߚ4�5��+iZG��PZ?\NZ�p���5�&�n��g�qjk�DL�ZN�r��l_y��cJ�`[L�5�Ǩ����:yG�/���^ͭ�D��d��sլ�V�M�12�o?4�q�H��:J��@��a��4�eE��C�fo/���<6��nA�򁉏8�Y�{Q.>—I�T�.��ȳ�(��KfP�dP�T��,�^,�#D�j;f���q�G��1�E�Z��ἶz6Kk��/���eowt@Ӵ#�{S����F�V|�:���{�[��Wl��"�W�`�����[�+�:B���rVZ%��?��c�w�_��4gL+ǔoy62W
�۱��M�NV�-y�V�p��[[�,`�Ȩ�AIc�P��Z)[*�L�VȖ�$�^`�_��d�3|���3iC��/B���"�'/B�,MNNsq��]��w�~��(�Z�*^1[€<^9[*�9w���γ���w���:��p�*EASv��%�7��w!6�F�J
-'U��^u��|"~�(~�3�S���/�hv�\�(���ڑ�*�h����k�X��O��jT�*��FD��e۴�j"B�%1�Q�YZƀS��w�2��M"�3��2���=B����Aȗ�T�Y��@e#z�+iÑ�p�i-cD�.�ZC���7GW�:.p߷4!&�[�(_0�;����e��vo7Ҥ���F�N�����k�
Ø8	��ƨݺ!Qg�xmc��U1VJ��Ɲ~�-��U9󵓲�M[��X�*���yim4���#?2Z�g|��}��|�8�$�(	�"K�*�2�����j��-z"�U ���L|Hy��aK�N�ǔZ���V�yM}�s���|ٍ��;�)���#wQ�@Qϸ�n��z�/��￘���k>���Z*����0����]�@�H+~:�(�i3�����W��Χc����%G��d�bTry�r!Mi�$�Z�N����]��6��g�=1$v�S��D��«��!׵���ݕja�@��I�+_����{�ͣhw��!���E�b��7��A/��m�6.��|)�pK��¿J��e%�5O7P��o���oc�kl�k�'��<��2+�G�.(��8�BSq��yo7�n:�h�7��q�{xqz勒i���?����fM<Vb�ݛ�f(��`�%�u�Ֆ9c�$>�����RB�Dt�&�*�/����1Ʒë�����1�R�������֩Ѱ�u�}��:��jb'w+�D5��?B^�D��V+Y�+R��-V��C���4o��M�f+�Zd)�E~���j㒋�I�h�Y[�c2�Sz\s����|���P�ջ���z��ϐ�?B�.oA��nAH"�l�iZ��i���	��i��ɍk1@�x��p
0Oa�����A�tW��H��(%�TO)!��Lv�ţ�P�5�ߍL����E�n��VȾ���V`��v�e6�a�F�
sNc�&��&be��3+~c�B�'�A1%j��ȹ�N�����=����ù&��R����Ea�A��5L�:���&�o,ᣥ@��ǽp �o��<Ot��ƯU� ;R�C��K��z�.COYA�	.�9d�o D#1vv]G�g	��L��-���5��d��v%C%���P��.R�m���S[3f(L���uf��|�Ug�ט�rQE����}��K~�T�W�`��xJ"74p)�J�l�������M�Ѻ�w�fՁ��ɯ�g/��f��K�]T��#-l	��f��WN�g5S\���+~�%CM-%1�����aT��n�y��^}��B�|���"�@;�]�Q�
Ѧ$�l\������Q�2l`TUJ�p\(�u{*{�lP��8�~�й�\1�%���k}�N[xҊ�æL�By^�~�Qb-�0�'�ypE�*P�QD��1
� I
�E�����D�rT#ߝ2e��VՍ.��\���S�5N����9��/ɢ5[��F�%��,���͊Ė����HlG`�H^4׏nڰ�,ɓ�p;�@� f�?�_9Ԫ�U�*����Z9��D=�ND��v�A[�gc�w	N���7+�D�o	T��!��g�2���ؙl$�<{��m
�-I�!m��q8��Ql�az�G:4�N�;��15#�&i0�d��L��:!pb�B��lr�/�Ю�E��;l�NL&�s����eZ�1��`8�8M��H,%���P4�E�+xa�ޯ�7���:T��(���@a�}:V]�{����x�jr��լW���0FhW�GϲP�����B'�S�[A��<���L��i�K��X��`j�F�dE����]BwS�y��O�k�w�^�

M~���-l
Tj��5��j���4[J�Y(m���!���-�p�q�!ǰ����ZD����=-�����]�/��i�r		���+J�P�8�^���
�͝ 	�Hn�= s�ͭ��	\K���[�B��ߺ�(�֢�4E��L��mM��D��v�#�m���m���I��[b{�e���9d��+
�g~�D{@[�L��l�����5�*r|�X�#۴�Wt��{E7�E�2�W�;��
��
�[�5��Xm�zѿ��Zn�gǸ?w�w/�_�|��}�W�d��b�x�V>�:A�\�� �+�����Rc}��7��>e�����h)�0���j��G���q����h��~������ȗ���'�Ј�6ZS�{���:t[.�M~	��	�z�z:����Yւq7.	]d�|P˃����.���n7�V9��ۭ�V#:t
Z���Myk��(�����c�/\|���?>�T����/((o�Bup�|�I+����cE
����+�v�K�@p/_��{�Mh
4`����7��v��9*l^�P����x�O>�j���'��V)W��+÷R�P+y�X(���Q�]u�}f�icU����<�E�_���q�ʷ�@۽�pТT�T�i9U�ju���
���~�%�5�/8X�y��{]X6d��/��E�������� �$�q�������� <�S3q��1�^�ߥtT�ww��?�rr�.���a�q����	�^3×}2�8&��Gf��HK0���~x4Aej�G��,Ӊ����V��<�\r7rJ#�=��P��ѹ�������:�yH���	�1�UZ��;t%%������fO	���\6�M�ܔ(J�wy�K�1�G�ErB�ˤ���HU�K�h@eU�Fc����@�D!z}�6%銹��~�m�'�s�v��_5XǺ����(�荕�U�VT8\ˏ֒�
nZ��9�4������9i����%�˔� ����U�.1�j5�l_�=/���U�PnL6�bG�˺��|"���X����.�y9��3���0-�P�L���f��I[=[�	�S*�u�.m��t=g>'�d����M���O��8��&E;�T
��e0��n�)'b�Z��1M� sz[���ؼ���J���N9ޤ>��w֟bő���S,��&�{strQ<y�*�zd�Uz��5˖ʬ`"���:;/�xbV_M`��F�6�V�@�X�1௢bc2��j.�G�����G
��Cf��D�۸%n�Vl��i��A���`:��`z5l���8Ȋu�g��Y���_��4�`��F�?W�!W'�D��N��bq����|�U5��%��W+Ҁ�e���h�[!ٳ�L��
JL�8�+7�8�ꕘӶ*���kf^X��9��y�-�S�h8���gY�[����p���n?�q�ϗ�-�T�X�[���<��˞QA؞���)�8z��C�h�CL�p�6ZW�mN|�@���T�m�*he���1� ��n�'����n-�DΈ�p*X�e3s�Ց��%�-�KI1GLh�es�7�,��'�r�q�*��~��h���P�jQ��W.��?��c�W_5>(��݁h�����Z�6��B>�ٮU[϶���l:2�PtL
�Q���_���8�������>U��B�==C�B~��*@�
P���ϏN^ȗ��� ��Ã�������|M�g��������1�F�䡻�P��K��=?Um�o���щz�����%Ţ��+�_[yk������U���T�>���2������۟,���"�y�_�{��
>,�[�A�{9��zD�d������#�7�5�ֿ��w'���w��A�j(�?^��s;h�.	��~,~��v[<�l�}������7߽{�y�;�����El|_������i0��ܿ���x@���D�ZKt�[7$�n��H�g`[�e}mV+�{�Mu��,��UZ�TU��-
`��/�(�u�������є;&,z���N�A�ږq�+s�6�E�%NS�O��-�O�l��P�k�2쩇�J�`�^ރ�{�3��@�ȵ���S[E�!r|ɍ��ٞؐA���i}��w�@���B�ŌzwU�N��NF|�߾`��r4b=�T�V%��25:v?���'}����_�E1��:�������O�6�;��ձh�W+�c�W�ݯ���c��5?����l�r��W��J�۶w�˨��m�Kt���/�a7�n���s�`���z���E��N��g�6��6�^B��s��:ý�p�.Eu�
zӆ�3m�.�~�"6��D���No����v0Ȋ����u���?}}qtz���d��D�����yv~���~vvz�%�b=�39o�����lb�ȇ%�;�
�S+�c)���4z0���_��
�����?��c�����2�
/��ʉ6w�=$�����`���@	�ǟ|�Y�j���XG�7�^O�7V��lAd��W$�+s1�?�ՄW�)w�U+DQ��asv3�\u�I�C����������p|�#�mtd�F��J�mV��xh���{���	�����t;x8BG��x"�6t�S0!ݥus��;�c5?CQj�'�ŝ
��ɦ�<�q�d�ž���7�]ll�Ѻ�~h
?\��^�5���%_�~�������S�s��S��P�5�`����S$6�`Q��{�4L��C��0H�>�e��l����� &hк�Ǜ�I����S?�7��#]�!l�Q�j4g�W��J;�-��go��Y���<�v��"�4��0���BM���t�G�L�Q/����5ɀG�1�xPi�my��Vn_0c��1�`h9�q���X�j8�Ց�h�P(�Y��HQ8Z|/Xr �����}z�Ta�墍�������z3n���t:��ln�P��5��yI�F 6k۲sԆA����u�ӡ���N
�S�Yc��
�L4��7ư��l��[;�;������s6��u�Ԅ��L@��?X�S�E3�\=EF9�yΫ�tܞ�c�<��ӏ�ͮ��89:y��}�
~�7;�A�3�1g�ݰ!%�oQ,#ƚX�){�"@黎p#���I<��@9��}x���-���Rm�\��d�;ZOoF�I�}��Je�TV4n���@�>�h^c6�㏻	r_	ˠ�D��~� �G8v�¾A�E��Զ��L�c77�>����l$iG
�pC�
$A��^�@�]���cw�v�+�A�y_���	{5��Z���9���L[���y���a�L3��ϓ�A0���P�)�w*۷���7�\�.{�f���s�%�b�'-��	�e$�lH��Z��Ġ��+�8��e��¸b�w��v0�䨂�s�۶4��-h/[?��|��E)�iy��&C1.�+UvL���>��'���p6n�4W���w��~�^4H@_��v��ƨ����jb�EM
�˯b3��luǣ����1D��(�ϻ:���un!r��An���3IԾvJ�N�2G ����h�E$)���Ju�l�1�\�J�.�]h�>��x�N������Ȯ`2�D��^�����؂���s�a��u4�\�)�#��Ơ��I�AS�6H��sp������h��� K�?P��-)��_
�O�<���!5H<����'I�6�.����@M�Ə��z�oB��{���Sƴ �H�1,��O�l�8�Ji�Pa.��y�hj�'��x�T���4s�ק�G����雳�:��r��~���U�F7��‚�d�$*P�h\-l����e�(��s�g�L,xAĪ�ޱX٩�jYņ=�N����j��F�rj�U��r	��,3Ba�� ����va��^�}Η��w���{*�@x�T�m��^
�T��E.�1�꣘�&����y���������ۤ[�Ǽ
�n��p��H���$Ҩ��^C�XM���j�&�h*K6�7iiw��-���W��j�ډ�J%����_t�t��R��I�C�Jޕ�c�O�����8KݩxR�P��������s�v~�_<;Nq��2��Z�{��!��Ϩ貮O$V�ڒ��Ft�fX���d�`Hs�N+0o��U	�*��ט���U�# !��Uz�<L۷&$9]��6�~�Պ����> �����U�T܏�\*�)�w�
2?¿Q�K���2����N�<0Eӑ�Ah/(�Xh���H;ͳ��l��'Ja�2�ٳ��Q�
���#�?))$�iK<��v�����_������+��p��È"�z�Y&OZ0�\���ﲤ%^3X=��t�%+���3G0��
{�0��Z,ٷ��K����i�b�4�;��<u�K��k��} ^;o�\����@(�sd)����ɋ���t8���^	���_x��r����}
�O4Ɨ-%!7�ǵ��#T�G{�B���ㄡ�{`���?᠝�y]?K���D���
�^�4�-l��uk5LсEYtI���fp �^�X\��/RD6k`�E���l��"��u�Ai�S��S�Iޠ�6K�h0�̍�>�BR(�0���u�
��J�K�^}aه�]�[2����F�P���$�w�c+��7�.�K���KM޻`��q�5�uk.0��D�cf�B�/�Hͣ���wAL�-6#����S�d7���7+N��]��e揳�J)��������4�w�m	�[ۍb�-ۭv'(G=<�r�P�)�H�����D�}���?�\���^�_�L�7-�}��^�G'�o�i���}�����b�P1����<�>U?98=V�
�+�������*���'���|�e=�S(A�ç�����31�!i6��#�|Uq��B0{���a�n2^]=��e7�Bw�&=�J�N'�*����w�z�VT�VIe��H'2�.5��1�?2�u��/��I�'ד���I��d�А��
�Dt���[�ޤL�&�&<F�k��D��n9�F%߈EO3��n7yA�S*���N��,Vc�OBk�'�ͦ"_m*2���’��F3�����`���#��,d4Qu'�?1�͚��B'�_��l��"�y�Ҋx�F��������鋈H����x���4�����?n�|x�����خ�+�F-���W�V�f�J|{���(�4�I���Q{Ҹ��!�&�����G'u����9���^p,������?��f�@��5�G�����1�|��Y6��#� �v8
�I{�vc��;x�Ur����Wȿ-�N]���x�oq��i�/��3��1��Eox�Vk�v��h
'tCZ��b���*ˌ���jo0��39�B�0F^Qx�]���t�<{s��օ^���*��|4��Ӧ�2�t7�"#���4TUL���N���G4����_��q�r}�ڕ6"bf��av��Y����u�l}�7\i	߆=�l��~�@@����
4#��7�u����E։��BK�
x�"��;#�VT.�u��
���1����x�'G��Q�xqv��9O��G˴W.�XED~CN�998Oup�����.��FwZ�G]�s��m���Z�a@T�W�ZW�).5tL'Pl�z����?��N�
���B���
��((d�;���K��n��bt�O��N����4�w����	��/.����ͦ���[�w�i7n�h=��!HGx@U�|U�j6m?P�i�$D�O
9����8
S{�4ZH�8��\�r�C�("�/
A	�Q�}~��K��[)
N_�>:Yg�zu�Tߔ�o�j^v3�Z�[�+X��EM(R�I��gh<��1zI�UuX?�?yQ�kώ.�՞�?��-���ѡ�$=�_�����xQ~n�����$L~��јN��i8� x1X/
��.F��ў�;P@����V�؋����g�������E�P��g��W�Wr�vիl�|���X�)y����X��"�C�y

�BH��)��x�Ú?(UmPy�b]�(���M�9�Mv�
���O����W”ju�r��G�2;��y�O�8�� �ig�'zSw'���N����C|hF"c���$�w��=M���ZC����-�ܚis����_��&+�M<��2�-(D-%� za��b��T�Y�z�\']5��z�F�E �B*��'��*$��7eR~�s6��g<J=�tp�ڃ�q�cv'��̔Y\���<{�e�T��`sB����|�<d��6U���*�Ng�ųS����
J��J>����N|b+p=���C�9B��A44�NhuU�֡�*t�0�CQ��G�|�w��V쉊�h��W�_�S�]�����hM�X� ��-)�磓h!ຼ�I���u���6��~����F��6�Vhu����1R��yHǡt�F�����
g�G6
�J���7i"w0����{�y�ˑ���F�&���2�&^�ю�(IeCʸ�r�Yҵ�i1˹~Z�d
���MƑï�[,�q���1!���[cO*�|�A�NR�+K���τ��i��&E?Ր8�I�,v�e`�݄�Y��B�*��O��-<���+<v���@��f����z�r�B���
R��l�Z��F��cy�剷=eJB_��Rƥ�9<��C���J�#G҉ ��1h]ᅥ�L;g�1�Q ��*�����}ű,�C�8B�m�ل2sO�Nf�a��~���7�Š���BP+6�-,��M�J�C��_5rd�5Ơ)�p�^�W�����@���:j�R!٩jt�[j�G#)owV�۵�(���_�������l��'Jj���6,c�j��
j	�#�D8G>e��;L���nMs�1"�-�"x����Ҵ^K�4��݄���Lw"Y�IV1IF��<��-.���W BGzʏ�"��s�D��Ї�-���
7�~�S�̝Z�Z,���Wl6�
3��L����%��omu�S�9���$}Xx���P��̦��n;L�?̓`��l��7|�~B{Jz�i��_[?�7&��.�N��	[�p�Z�e���*�f�
+N�k*�z���{�����?�c!TBu�u�ix�k=�#�uC�]7O�,��x=i�������Û�&�p�D�k��@���}�������ѫ��2�O
�GD���5Ek�"x���&����x�&֏0Ï�iA���PS��U���ы��F�5j�7?�›�*���./c�MĆ}3A�N�
p߂6/�(^ߍR������ɖ�����ѻ��g{ThO��[e�4��+:��H[�l0�F�N�6�FO�@UY8��$��w|qo$	A��Eb�P?�v}|�c���uJ,�`FMFT*"�PI8p�?%Q}�[�`���,���h#t|�J�_�_���;ϏO/����g�:>��>��G%^Q&�]�J�$�6�#�W ^�ܠ3�B.�,|���}}v����
���G�@Ҍ�~/
���X�X�dE>��8�w�Ie�7�n�#'@<h-z�k�gÞ�7+�w�=0��%�I�keA��-ͥJyA-D�1!�G���h�J���v4�]��[}?W��`�G�14�ٝN�b�M�uG��
^�"F�՝ωu����d/4
�\y��-�1�L�L��܇hZ!����m��P����2I�LI�9?)�”E!�g�~}zz�3���r���!񔓈
��g�KX��;�pN�)��G&��5n��������#O��b;�f)�v5�k�=�NI`�۵��X����@�/f�,[����х���n�m�}:�~�yx�%�HR ,,��F܉��!����z�R�)��Q��WՊ[E8�I������I���
�w�*g�ڕ�Jߵ���t��n���;��(U6��-�ŖDP������%����%6".j��X�nP��^��c9�2[(�Pm�o�d�w0��X@��Z�*m�2/lm'��x���p�Q�v͟�ƿn�z�~L��	.�nT���ma�</��7
����;S�l0eYʔ���p�o��p��(eE�ck����/X��p��9
�#�[�T���n�]�G�oV�$�� �>G��/Y�ȘsY���߾��Nzֈ[֐��'�2$	���aj8Lm}m-)���QߪЅ�2�G�=_���Mkf��$�#0>�$?��\���}l�$EEL�q������Ң�ި�;�{m%�����Q`�4�ƶCP)�	�Q��T	�zj'�Ĉ���B�j�K�a�Wyzl�&��1nj�-)h�"
�da�
i3�=�7g��L�U.��f�,-w���lT����XԢ�T^�'mU��b ��'R�w�+��NL�b�.2
ZX�yỪ��_*u~��~�˟���G���yE�|-T$���Yj����3
�ȏ���La�G�Z�'e�Ӗ�[�/�q�\-��Q[c�~`zO���,%R���)[�)`�p4�J���T���	`*�x�j�iaX����۴2��Qht�r����	x��F��\���/�(��
����M.A��(O �M�0`J2�R��1I�b�p��Q�r6:v��J�n�Qm;[.�`�[-G�t~y���m/_%S�_v�w��V�t�qW݂D����ѻ0�;���X��>����r�f�֪�V��yZ�y�+���<�	]�<\��FM-�B����q>i�n�֦LH�u�+�ͮ�d��}I�։�m�}�k![�һK�I�:�T��;��Ie�d(	�-���D��$�#m���e��� ����Y��癅#ݷ������[%�f�4��!��
��P�|Z*��L~��h6\}�*

�+nͅ-�jy.�g�zU	�Ę���r�oq�
ra��m�a�"�L��s�t*,���"�v�t:4%,��
ͫѫ�Ip�v�u���M�$�^%4T�1P����'O"��N������I�O�Y�(tV��7Gg�ER���*��Bi"�Kl�J�*"y�ha.	�Q�~t|x�S��=!�J������^z��?Ĵ���7 aS�M�7�ì����+��U�檿��l������؊Q��B���^�H�X{Сv#^�E���T�?�%"�;e�w\'�9i�&6���+�K��7>�X��n]���w)FSG��h;Հ�GR�������Ԕk�n9p�>�QUHɌ�q,0N"��sJJr`��1�yP���	q���mL�
������zp\�?[�S{�iKT
9�slLBC'^A�H5�foW���*R����%��h��W3�:kə�u�?)��V�(�7�K�¤����25�P����M���۵j�\է���'���a1m7Y�I�V����⭏�h��ᶳ�v�X%c��~��اi�Y�/�������gbrL��{z�5��0�����w�
��n���S�~�Qk�H�"h��=մ�9�Ě^���M}�
���W^�T�j�
y��.m��Kl*�Ɂ
s'S8)�B }T������	[�	m%��ި2�f<d
����(�,69��:�5�T�f��®� }�#͖fB|a��!А���ܑ��*���
U��C}f�qp����v
^)���VbT���"�T}�2Y8˾�^�7��X	Iǚ#�)DJ���B�b��}7������%c@X�4PX�ݰ�X[��%�G쳲0v��u�0L��ƾ�)��Bsň(��iui�i
��"#��'B�%qp�3��`�~d;��x�܅�2���K�v�ơ��|��b
lJ҇7�j�&å���u�.J]Z�#6)`
����:�p�6��i
!e�ȞXF�H��w����H(ŭr���Mo��0,8���I�E�Ԗ�烌�ۓ�gx�s�mW�>���N^�\*�����O�.?���am����N����/Z��1'8�j.��y?�U�q�����&m���C�Z�O��KݠhS���޿!���Z.]�eAi	�&��wΕ�;姐�\��\.��r��IXT��1w.���j/���T�����p�,���cj�E�7z6��f/jD� "�Qy�!vC3�8-ng�	)G�Q����&��*��<dE�T��-K��.��̊~�m���j�@�m���Hk�VFV"^�rZi钋����:�c1�[r�K����[`n���#�Pi��'l�#�84`e��[-o5�Uu�����;u�*m��r��K�5�a ���~v*��ir̶,�*�\È�!�݈"��ǰ��Z
�:���x�ARz��})�P��2s��Fcd����*!
���j�њFa�Dn:�Gґ-Sw�*�-:��Φ�M��#/u�S����?��P#���+|R$X��0�=$騥7�p����UW1���G��'��V{[-.A��� 
߻�	,��'�*�P����4��vo&r8l���"P�(����O�H�m%s���j�"dx��6�O����H�]���99��ӟ��y�ٍ�n�$�}�M�d��p܍,�(�RWK���	�# a�%7 3�6��zo�1��+}znY�6�M��=5�i�p��z/�TJ�Ȼ.�Rt��ByeI%B�s=+���rG�S��
}Ō6��X���uȶj5QUp0�
�h��I�(e��J<�R�_O��D��n�U��6N�J-[,�8%-�7���-b10�=mL��yN�!�)�\~C�ܚ�.��-�j8��EI[��(��5�����u�v;,�غ�a����4�9,."TMSZ���Y�J��阉L6%n�ۋ�jC6+^ ު̲���`��h�}�^�癩8�@i�ôU|�@aԎ��|Y��o�y�t���^���)�N�<)�Z�%c��������54^��y�	`5�����ѣ�k8+��TyA��PH6����A;Q��z�x��3U�p��99>��~�kꡮKs��>�)g�����v�}�B�&�E‡�HD�"�����6�W�-��=Q�c	J/2iX�����[�Y��{эG�f2��:΁D��j!���!f�a��{:y����>{�BFf�
/�{��<�W��az.��#�g`�߹D��P�g��[���E<�
+sQIej!.ҭv�$抝��R���m�Ur,�f;Xt�<ԑDy�i|1ϔ���(M.�9��C,����kA���``p����[k�y�/)�[[�"
�Jm[_�E�;��}���X!����v9O����=���9�&М�|z��w�x����3���TA5���t�����v��Z���Qg�Qh�n�jAk�&��}DC���0РhrI��V{��m�lg�f���l��j��d�՜1#9�i~�q~H�\���+l{O��hy��Qw��4�h�Tr;cgvm�c0�[#�
򰥉�#%$=�RO��ILPlꉿ�0=��QrJ"�*-�
���e6CN'��a0N�	V@J��A���ѡ��<�e��0G����@��ʅ?�Fn�[�ÔUȭ��q�C�R��}�!��
z����-�s��I��̗wqt�k���j��7�J�P�n��c}����;����	�@���S��I�x�f��>ho^�6:�m���=����L���f��x�y7�F,��E�}c�P�қeY��&?Q��qS��2�ı��jM��X�
��-�I�Po�.	�Yt�l��]��^uKE�Ľ�"����V#�X�߸�_���\�݂�o%#+���ט"��ز������Q�p|x�����,e�d	\�>�qĦ2ӪƱ�j�
ӊ�[ش�BF��O��U�@ed2�dT��SFQw
�I��!��P��`�2:|8��y��m���j��n�W��Bn��*L��12�a�@��b~1�ɯ�3��,�2�BKpL�H12ޖ�-�Sˌ��}"��b	;u�k�v�P,�C��Dӧ9�@�"&d����#���I�� �f��;�"h[�l���E�ҟ0�PP��^�.@�C`�}4@��a(������6
IZ���	��Tc�.3Y�q7�p�/+����uU�&:02�`�?E��q��:��ܦ�c:Y�h�ڤ�}��m�O�|��-��wxUi�ߪ���01ם���{˱��p:$�b���5d���W���^Йj1�mWo��y�p�H��6F�+�L�+V�	�W2���ac�1/dYm�tif��VU$7@[l���Sbqx�=� R�3�'}���ω�)�M��a,��I�s�	��a�(u�R���ȫ�<DNᩩ�`_���q����q$e?��-_g�R�L0�m����a0�g��1����7��w=�k�ـ�;8��M��*�(��g�ĊFl������"��qf�~��3������&qn�Y=�f[&ǜJ�Y��G�
������n�O�䴛`�}��C,�y�Jrɕ�xv��̛{�F�S`w�C����;;�0 �a�L�R�t�Y�V��Ȳ�r�H,+�E��a\�͍�}Goȑ�<�	��qq����-�טL��8�#�&ꝁ����K��qm����2�H��q7��ܣӈ�$~�nu�?�@�PKc��C�2��$m)�ߩ>�GOO�d���s(���|H ��KE+�!#�SQ6��'�t�X,�[e�5^rFHj��PC�kQS�2Ed�i2��b%�f��Z@<.�8�T��ea�oL��ت�ё�h=@��%7�[*ҽ��|e��5�9���B�X��v��æqdI�s׎I^]�����Z@�9�UFn�̅dF���,�؆�,aG�	u��4_�a�m�[��	^呻����"Q3��\O���C'����:C*��Dz�2���9:Pz�������t����'�8��]��u���Qݡ�����d1�R+y[<L��a[=��_�KL�������9'IcP��U��@�HfW�NJ;�R;��|���/���M��~�Ɩ*�����g�oBI-�pc�pt̵-P�[n:�ذ,IgS�D6�яt����mr-�w��y��8&V.�[b��xGo�T
C������2�2h�݊��q�M�_f�܉�E3#ݎm�1�w�W���Fw����������	�������G�:����E��:���2y7b)��j2�moԑ[-P�nn�
��Y������֑Fz'G�����(���������Ȅud)��N\9���e�\�i���]G�B�EG	3W[kv��W�i��G)>�{�\4�&�ٽ���Vc�
z�v�u��~&O�FتO71fR0g��L��.�r!��7���<�u�
��m�{��oWg��tF�h�pR٤������.1��h��,�-��
���Ӆ�%]�<���LyKѯb���7�~����PJ�S�~v��E���N��͙D�����<}@ɟoХ����Cݔ0ɝ��Zi«�
�]�	E��̷!�n�D���X&�6g-d����bmW��[�I��-jF��J>��bϸ�l\�ڈ\����|�2��`�ƥ���y薄�I,u�:�,z�"qK��ͺ<��'�������$B53�Ih4��T��@"�[��<E�)�ӫ�<
�rQ3�iR�b���&�E���۶h�Dbk�!%�yİ�(Wm��@��<����b��^�2?�Ӽ~*s�zҳ�X����ƴ�V$[�-w�"M˟Ӹ.���u�F���ia�f֖��u wu�?��\��k�s�X,��@۲�/ͥ���:�9��^M)]��3���I=Lqd$�];k�]�I��O�eoϱ܌S�c�/*�w�����z�&����ƂXlQF��H�ݑ���&�����.�9j��:������w�N޲�9�N�Hp_���
/<�L��Hz�Vcs&��t�n…�8�%��>��bڭ�$���uL�V�.�Jt��X��d�1�����8�c[���<4��e%�&��z�
�nvI��~h��e4bf!�9�q���4�[���M���J��\�;�m�͝����f+�oD|	,uY.�Q=|�*���.�wWKeR����xR��O�Җ$�*��:�1X���{�m�	���UB��ϲ2\����%�	ݢ����i�#w6t�
5�JQ��YL9G��Hv�Ց�
��#��za$ �a��m΋���"LƒVG�N���H;�;�����͌ב�Q��dFԗJ%��2D��䒲(���2d�X��;P�xEkJ�q�̢b� 2�'r����}�(T�]U?�Q�7{�����u�ų����j���9���Ug�С�ś����ux�YnY�s���K����]�*y�^��ނ���g�Ye�\>�=��e�S>���V?�3>��W�)��eo8����D�9S�o݉���{)7�6��љ]�R������')�\Y�a�0�w���hvك�c)�e�����l���Z��[�*�ג3�����Q�f �Z;д�Fl����6`b$XCG���\�F�K�m�a��1�����?���y\ðE7t��ۅ!��1,o.3�M��	Pϸ�
]+yU�f5bq�Y^��ݗ!^�����L�T$�hV<":=�q���ѷ,#8��|�KP@�d���T��
��2�{[*5��QU��9ڶ�C���Qp�]1��T+����J���_��:�|/�O^�S�]�����2�6D��0󊉩��$ZW�nH���s/��?-Mό����ƆuĪ�J�*����_I�
���,{{�ǃi�Hr�	����?W�Q�Z�h��qQ��|��=�@�h�5�� t����{!�ecg�Ɛ�d�"�Ζ�e/[�D�_.�&V[waZ�ىCs��m�i3����Ch�/����'���p$>v{=Ã���	9�d3h5@1��H�C�f��1��wZ���>��c3�2,&/�ո��p��,���
�ҥ���y��u��ڗ́�s\4���5�z�%�H��2)'o��Bg�0�̣��~.ո0�^���Ε��D��:);�0���i�Ƙ�J�_�#a�U,D��A��w�*����9l�F���#����,͇�,짆W�IM5���,j�#�Ȗ����s|�!��t�e�U���R�V�q�VX��¾K����wDn�D��������l6����U`yl��q/X*�_=6�=��q�cö�P'�w�J��*{�`;�-uҤP�hy��5���%޲�P����,V���px��Ҙӽ	A9����2�	�Ó,�::��K�Xn��^��w%��Sq�,}O�a�r���
��q����ϝ���O�C>B�6��H�xr$ߓ�g�(�p��Ck��y+��� ��rh����_�l�1E�?OԶ,�d�*�D^3"r+�.�N�C�9gL�R�-�$�U�1�̃<�;�y��	����qNtds���9%��2Ӵ8:)�
~�E�h(}���W�(G�Ҷ:×�bv(���eLn��a��W��M��6#��L]n��yS�z�,��-��4���4ƍ�$Xp�\u���	��j�#�P�v07�S���Li�ɧ�i�<�nKe$�Pap��(0˝\ѫ�ZTV�lB]Ҵ��֞���cx���$�G�s|z�ÕJ��8	�C�Fh�+�;���x�Eڞ	�LW�R�B.x�Ja�;��SmgFjc|�RL��;ך�'iӪ��,��@h��B�h��p���Wx��8�4���/��_��c�gψ����UP�'��3B&��i:尠�6��S�)C1P�۾=e�PuuK]GҚ(w�/�qU�X}�$D�ƻxB�t�t�̍~�������#DAs`��[2z�m����%�
L��FO�7X�li�r��fHM8bX�1x|cь_ ��7<hHED������_���W9y�;e���A/�3X��[a�0�R�����,����@�墠)-�PxC�� �~qz���	�1M�	S"���X
��z=�����3�R�F.�%��T��e(;���$�u��e"z���U̖J:\
e_6���,j�	�3��el�,#u�;;�������l(���}I]�������b7}M��
�܅J����.(/F����#����^�q�}��1�u���p���5oē���΋�!�t�c�<�l³��A���Q/�	�#���X!��z�R��lU��\���}�{O��W�����DŽ��ɛ�:e��{Z�ڮ�1���0I ��Q?�8���k�r�a�>o���v 5��a�c4.�<蘈~�T�(�dvv�E��i�C0�u���h/BS}��~l
�QҠP��zq >6&P�z��Iw�˜7�b�F�.�ɢ"zv3E^�p�o\�-А�|�)�, oba�$)9����ɕ��".MT1~#��`����;�u��m����/A�i�
��j��J�y����8P`R�Ռ㵃Si��a{�C�G�-K� �!iev�ҩ<e�����I��3�O��F��U��PA��G�D��0$����N⍔o��N~lt��V��d֛F;������.���m�$���&f���W��z��p�ItZ^�S���j�T�j�P���r��ۃL&�������%2�'��~��{�(>�bN_�>��B�:���/RgC�ٟҼ;3S˘���Ȋ�ƒ���RV/��I%mA�ա�O��T5��q:k$n�t��`����܁ɋ��*ު>��� ��TK[P�G'q*l�PoN.�ޜ_,���~�L�܄�$/U
�b�V��ەR�����rp=G>��Q0�T�j��b�Z��!䥰G��?:9�����sfG��i��5��?��UD��]B̠���iFRS�����~׍��8vyMP��X/7K�ի
�7��Q��ab�;���YF�����:+���4L@��P�s`Vw�v"t�QJ	.`U!����m��>��W�6Е����Ed��E>��y�̅�kY�"���ݰ�ph�����4�֢��i��A��pB�*a��s>`�4>��#�QJ:�eS�<k��l�*;�W�,v�����
E# ���Jw��3M\f$2٘E��QaXIU�����Y_a�O~�?{q�6���o��[��1���u0��h�ہ'x��KǠ��6�va����;�FO�O�C
�����Vm���S�+���0�"m��Gj���AQ`E����V�EkJD�l	�ac6
b�����a�e�yF��4'&.��G��B�c����Wb}����LJm%(EÁ�������-����
mY�F�l��a�N��n��9@KF�i�*����\)@%���lr�.L5�3W܇ъ�Th�S2a��j
�lsS~��]�t��*w��(W;�=���Z�@J���K
$��	�a���ǞϦ�>�D��ְ
�g�L�Z��voy�PI;
����T��+I����^�9:(D���-�!�� M�Z}� ,=�'V�Q��*3[!u�i'h��4�(����Y�-6�;�U���-��ʕr=?n�˚��pY�a�-ng�f���Q�r���`�ͭr��~+���]`�t�:v0���,J��3���|(��Pi�)������3p؟I
}��<`�kփ�Fh�����8^��M$-Fe�{�\�o�o�n����M�d�yi�|-�Ƌ�׹nDZ;@D����"��)�Caĵ��	O���W%D��-���pl�c��.=�2�����}�'�Q�-����%5��#�w`�A8�Z����a{?˷�0���@�9)�Nzd��#�-�e^�0ȯ��Ȯ�5i��Q?�"V��O��%��☴AY�T�8Z�8m��o�Q�Q�<�2	�H���ڙ<y�#a֦w$��U�2�:	�v�*S$w+�L7��5�W�j_��j���¼;���#NC$'p�I���3H�s��c��MX��4��,���@��p�s�A�v~yۗ�h�(e�Om,�*�<n�ߐ9M���@[%�
�.�����5���Q�ْ��+�4���bT��R�����Q�
ݱ^0PBQ�[X�XÄ.�$� tM�eK\G�N�k{b�Hϧ�'��x=�}1vi�;�g�gG'/�Y�P�	�@�O��Y�`a5��Չ�%�nJ����m�[�؉q�1�f�ǟ���*m\�0`-ǣG&J;��	�Q�hM
׺��sD��ah/�h9l�$?h�)�+C/����gr��'�!�uՐ��������6�&f�.�Fj{mP6���'ygbzIG������pu�CFk4� ڀKq:���S��*��>�xx�͍�����Т�L�!���J�I�^UdT
��Eޑy���B��jy��wB��D&$z%N��Z�e��c�����9��1�Y�x�1&O�W9��Db�6c�r<�#���ְ?j���Ǟ[]����o*�i<�^^��c��7ߡ?���p������SG�bmo�=t���E(-�L�a~d�M*�G���6���=���9)�^�5z+X�c^��(�f�K��1���TOH��J#F�ۜ]�p���PG��D��
>�����0��BZ�CEO��3s�n���2q�̳���SUf�W I1�;q�eE��� �E���.�n M�kzF���A1Kj���wB�^T���	.}Lw^�ʓ�Xn���$A�R3P�"��]0,�p0�����qc�3p�9թ��#�eaoe6p��H8��kQ~�
�؎���<D�Z��H˩���Z�# �}	Y�J--�
^4��O*�Z�9�;X���/.n��Z���(������� S'��綥�8�d�;^�e���%��^�Us5��_�;�Xa��8w���.���\�2�[¤�0Kk��W�?�S���ԅ���s��[��I�HBE]���y���!s�g
4��%~���ɞ��^��RA��R<����e2�۵X�՘�7�6چ�~�i;�INN)x�^�DѬX'��u�2"o��\`�"vw��Ɯ8&db��1��UP���L*~�D�����ɱ�Ό�!�䯸��/~���r�b#��7Ft5���n��yQT���Z�����E�k,�O.v臿08��ӌ��XxL�J��[����O*����F��r�S���t��~�?��_�9����g�C����� �k�A�$�x��a���1�T�Y#�hs8	���$�=��x,5�4�-Rk��
`��J�	'�|�>�2,���!��R��_w���~M+T�����r�t��Eڒ�T��y�ɓu��o���K���$��ȭ���ܺJ8m���Z3L�����Q��ő@NMe5��<����U�B�\	M�JF.���n_^
����G&^���ῂ�.f�[��]�H��IkN;�S��C�-x�aU;�U���^���ەB�X�vl�1����!:���<t���2t2K�ʰ�#���z���=��������6^[�3ps[���ɮ+<o3$һ�wC��-��w;�"t
����`��xOeQ�̍��TE�`�k�Z�]}�ʒ�e�\����\��_���M���\�x��=
��L?堭HC�d}4%��WRb�Oz�V�zWt/���*�9�o�qi'�vO[�]�#Q���!�̶r��D7)�~8�l#�����I�
����
���68Zb���V@%�Zj��'C�-�w��	:�qR����
V�Bљ[:qOp��8�<ւ�
���b�@�ۂ��d��bT{��{pI7Kđ��6@=���'��-@�׏ذ��=�eE��G�އv�	�ʹ��ʿ�'8�(�	�J(R�����EJ=5�<,,����-�
ݜ�g�i���J��6"~/*U��a�k�ŌHտ��:��'}kv�J�9e Bak1��G��&�
}Ӆ~a�����
RH�\3�+�\/�]��A,�)��ΝzV��9>k�as�	)��M�R��q�1u�P�-�B�@�֘Y{U1^L�w���SI�!<�q66悤��Z��p/n�A�=S�
�5�KY��H��|��\V��h���p�qgf���[}�?�f��Y95�s
s�*s*W��(����xH��~�9�f�@�f�Ɏ�5��q;��\�	��/���N�A�D9��.��BՅn�W�y��2w���G��N���(��ͣ���᧛;�S�\�Ww;���d*���A��{t(d`d�1ړ�b/EւՊ4Y*�6)���J���`��tW�ыW�ھ�k_C��J�n��vZ���7�t�G�6��	N�K0��G:.��X	1����P"��Hydž��#_���p
W�.�]�Q�p�]����a�MW��+rBF�"���ޠ��=�
����[��)��h`.m�Q���B>a������j��y���@s��I'm B���3E @����Jrph���>S[PE+�����f
��q�N��P�>>�Z�h�p�ݞe�_f�.7�<�u�$L>M�&���s.��:��P�Yd�p��,<]1�D�U��]�呍|>�������Z@X�$f9�dޥ:01J��p(P�pX��n�V"f���'2��N��������ݯ����mq�w��*��Q���̛s(e^܈��$YS#�+��7~t � �W�b�N��3�$7�m���v9kX�iQ��7-RC�i�Z�@�EKE�E��!�
���]��w)}|S�q�I��*�@�M��!��ՔH�ߐU�<m���Yc(@BL1
�<�&�Ee�+�P'7(�z]��8��}�h�̮9ǖ*g��Xq:)����-
 ����hZ�����n����1J���S�Q>r*6�շ��艀γ}Wo/{�&&�7:�u,ɜ�!,rf,*6�9�=�*)�d��%���U�GW��wy;y�Q.���|��5��Ζ};9����o�6B1�3�
�m��R�	�^bS*��E+��C�ڡ2���]p��A�
�3N-z
�퀮��I�fs��j�|��]�
"�s$(�I���Q�����H ���c�����9LN'�� 9�M̲�/�\Pd���Ȁ8YQ�A�7�Fe����|xwR����Nk��tXdaq����(5
�����UP&�E����cu窯*�Q��R>߬l^�`���?��7gR�mYad��a$Yy]�^
��c%肨��ب�LL�
ُ�
���/mo*G�_ï8��o�0anH�vH�$�t���u�č����3���M�ѱ���㧛�ZJR�T*�JU�(;�-���('���F���K�7�l0K������/�����3�P4��w�B(�RX��/
��ל$U&�]\�V����F��u�SG?�K_�����.�Q���z���*�4�~1'-���K����ˠE
�/��Q�y���sO�-�T*!�^�
P���[\6X���7�L���֏,�^0v�;�y���#�s�� ����
��J�뛛存о֍?�
��}�v�\(�Y�C�hs�>>>l��^�^nj0}��A�P2�~�%�3���xOD�
�)O��̼�J���F^K�ko��-%-�߸�q�>o/�/�q�^%$��Q�6	�]��x�V��e�hBE�������ߍ�#(�	��vg2��SvWzp�|�:�}Ռ��r�O�p����.z(Q�U�DfW#�d)t[��C�
@�P�|N�&�ۍ�i�#%��������3s<�@��ؿTz?�Km�J�4=4�#T�-hJM͋�-��M~�!�׻'g��P,j���Y�J�[�h��]5�Ү���吼��hbZ��x�"o��Q�0CŨ#��W`���T�@Wt6vm���/�Z�v%B�~$��q��F��F_�<!�ʔ���Z�eiҧs�'�[����`UV[I���
Ҫ]�qǾ�0�f�#9���0����m�?�J�^��5���a�c�,Cɻʋ֯���\�i��8�B�Ցy���J�k�	�/�*��lݱU�d���U�!�<>�o�H~‹�{!����w-�SV;G�(�}E �s挭�eb�۽�።�U�D��X�Mu,	�&ft�Nm�����F*%�K�K` �˔����]<��}⧓K��w���VcN�d�9�,:����J)�6��$�PVl��؊^�:?Ҫ^��\���ǃ���7X�
�5^ ]؍.ɺ�g'@�?kC�8l� �Mct�����-eo���!�h3�q��0ў�Ӓڡ��
Ҡ/�i��e��:^W��PbO�����lɸTs�I��TSH8Oh_����5�[/�h8��0d=T	H�j�̨�d��kᑢ?Ϩ��梾�9����#?r�)�v�*U-�z:-䈯���2�!�q�B�cXV!�8��6�e��R�-�.SC�A��^���X��g'�� �.���!n-l��F�����Q�%����u���Jr�f#�&��7���@�\���I7Z��.I#FpN�E�>`�N��F@ʙ��]��[�!�jt$���S������as�7wM���=j�*�Oe�E�IrI�tD�YWV�ݨ[O=�M�fk(����YD��\�~����B<D�
�ذ��m��mb+ֶ^����{�b��aXu���8a���ӻ��,��� ���5��5�Pykq-@�F�ϱ#���z\�׀�£t q��<-��	Ӎb�'����
���f�&�̺TK7�	P{�K�N��)�k��7�A=�dԉ�SR���䩶+�뛥�f�Z-W:�
S�m���j��
��?������=�r@N��P;7�al�u���8�K7�I�X��@�+N6��5�1=�Ɋ��5�I��):*(>Pr.Y�x���t;%���°
9�w�=T��D�cU��i�1~=lş��t���~�]W�#G�FQ��`zYP�'��:�f�Z�0n�Xc�v��6Л�C'%�VKYn?/ڽ���W��M(�'1�-�Qw���z�T]�olv7]���L��
R�=�	�a�l��ԥ5]O:q�zt��CW(��Wɛ=@Y��y8����\≮8�%ѭ@���-��p�9�%���J;8m���`M����E���������4d(��9�h�[T�+���c����p�%�]��N8k����)5M
}�ɩu�7��J�t�}��M���D�e� �C�8�E���v܇�5Sw�>�I�=��*�jLi�@3��i�u�D4�(�ߴq+g�rϏ�%?�"7V���MYEx�]GFfLa��X�0�#�}%r�q�rU����a:�Q�y����ⰵ`�j'��C_�x��&-�V�_���
1o#��S�(TB��8�[m�Ɂ.@z��-O���i����V?��S]KK���*w���I����Mϛnک3}�>De���w�:���<�zm#m�)c�h�w�<�=;��)oI�cPp:2�\9CI
��'��?�}P&�g<���J�f��m\��?���4�c�"\$�k�v1@-1�֫��^��ҸZ�]���_����;�ϩrK�{h��:�:����j�곟��2�Za:ʓ�Q�[{!+�:{Q���a�����)&�l�/�Xg���*��KV1���G�x��V{:uzp����ӡ��0��l1�8a�W|�YF������&s��)"�KŮ.�s����9����vS�J�Z)����! ?oW���HSc�2U�(��H�<�h	�/�9;-���^�b(��O��noT�z*~(��su�P��	�H��N���c�MT&X{������Y��@a�&Y}Y��[�Є��~���[׿�p��G��1.^&9Q�Թ���������h=X�.R�hI�T����N�{�G�N��`�׻{��.�e]q�h��0X1��HC�5��Y�
G'1T�@�ۙ\X�A�+�5�9髶�p�%}����"�y��0�҄���5����0����� ��W^
�yH~���C���B$�����6�08�f���b0�O1["`"�7���浵pAF��5<X8�#B����z ���*sr��JCǽi��ю�+�wg0.ؿ)�-�
RT
�2��
�۞�(Y��WIm�Ȅ�:�P$'(�ޑt�k�
b1g�S����r.��uا�R�P �6zF˺\��*�|IC��
�����ԉNb.e���{\jX����v��ÌaY�����J|���,jg'�~�
�y	RV|������,�*@!��lL'���u��ױ	q�1�wGD���E�j�ԗ�S�P5�#�`.
%� p )��-X��i�*_V���-o[��G�iI�(z�9��gܼ��Y�l-��{�a�0�uw"��77Sw)�v��~d/�%Z��vuA��('���D�?, �At[S�ɴ�4Q3���k�����*'��sz��թ�A��Y?m��y�F���]��O!Unh�j�C7l�F~��Q*�=Ģ\�M4���=\)��&��
�	A���]ƟQ&m��&��A�2.]B��w��o�r]坛�]��o�l��e�X��jM��3��[I�]L�Q.4Xk.�������\�ҚtX�-�^5_����qF����Q����'?�A)mc���{Pyvpt����<�����D��љ��`Jp(轷���%Y��8� Ge�Z�Ū�^�V���[���L-�����ό�}D�=�S��c]���O���/��]
U�!�뮉������cr.7��\�O
�18\|]�S(�m��ntOb7f������,N"ݴVJϬ�t���(P%�,�z�~��BJ�W8�[��l=Eg�[P�.џM�
Y��^x~�s�ɮ�lki;]/��t�|��Zef#{�I�a�"ߘ5�o����Ƭ����2y� >Ȇn��D���׫P5���Z�"Q��>�Z4A�W�ɬ};�Bx�!��.K����ͷʹ"�`��U~G�s�+`X�.���7�
��,��Q�G��=�R�Ggl<�n�s�4�~��������o�qU�w�o�ꓝᓝZ�3�s�w�r�X\�.D�|�P]�-�����rj.�[��u��Qg��J�*͐�x�b�U���������:-�u$���+�_��s�J�W���=�5=�=�,LOfA��Ԫ��mU0rz��Y+TD��ݚݳA	�l����7�<Q�����z��i�8D�C\�"��(�$7af��~���gN�1�l3G��$Y���EV��Q=|H�Z���,9�ߏ2a���2֔P��T$��;\��Q9zl���<�]�h𖓕�.4�Ehd�Z��tYr��;���A�������4��L�Er_	Է
`5�M]�5Bns}a�2
Q�kj�x�����;�0���I�h�‘X.K>�Qx�h�M�!�h'XɄ���
2�����
?�Ӷ?� �9r�N=��VTC~콁���Q�h�|�5^��hO�j�uǬA&�������,@������P�h%e%k���:�)/��t�Hv�C�{��mC�TsϏ���Ц�@�*y���	]�(�<����l�E_�1�2:q�{RрV����4cYU��JCy��Y}UI���g'����`�0�PV
�%��+{LJ���GI��<HL���q����I�$"��7�b�d��;���jC����@ͫ�̲�eYQ$&����[���0	�ڷvr3+Q�(��o6ə���0m��Y����*�
�ؐ���AQH�a`d\�dk�u��
X��,�����;O:�73�h�����Ն�L�ao&�Ԅ��(��40W������3��N�o�97-LS��#�u���0N9~&^����*8�6lJ�a�xGA���I��>�~Ժ:�[��Ge̤��S��}�'�c/5o��O�f췂�e�H��*��M�W6�7`!���.*�[�Y�e�x�C?h��Q�-W�E�Q������Jl�魨E��g�d�\9=�P�/��I�#�	0-��:�Q�X��rU
��C���H�q�.��#	8?N֍�yc�\Γ�k��S�~橿�Ϋ�
Ϭ?��/�/�Wd��םw��.k�SK�����iY�8-�'G�9�W|t|і5�;�IW�>�W��n�2�[�Z�
G��V�PU���C?dP�N�$�
ߓ+R�H}ajo9��O��������/ef]�ߐ��5X�����+[��zMX�w��f���嵊��=>i�&��k%'�ӳc��݄�t�A
���	��(
�
�Q{�;�����?8i�9�C84�Р�.�� ?����~EO��Rs�A�]��ߙ>)��,n�Q�F]�4e�R�i���1�ַ��[���\�~���)SĒ�R4v�)��:�##��4�~�{��.�'o�)`��c1�).j���^��^�����w(H������oGu/��l_�jB�'��&�
���^K�(ӷ���K5s�)�,�t���ؓO�5��&k�&d4���Z�˷��~XF��=J����J�%��������A:e!=��/�e�]�w;��4a��qH���(l�z�]%���;Pmp�89E��b��e�z�b�*�IЀ}��z��n��<g̿M�9@/E?7u_����W%��8f��|ۑ1i��x��8v��E��X�3���2WU����v��G�0�rٖ����`4^=�R�T_��"�K]1Q5�	���v��p�!�W>����\�&1<����W�kT�`��Xn���9o�@�wo���MX���lE�U�.\;9\���Q%j�;c�8���FT	�=�-�	ac?����>YƱA�і�,�vP�����	=�z��$a	�n�ws�D���$����C�׃O{�3����߈�n�{"�v���TbSt����듸����-�rw���9��u)u�q��������嚺$��L���m�)��J��T)NBF�|��̀ݨ9��eO40�2KF�+i�UeX�������όkD�=XR2�b$-zvw�T^��#�Ia.�f�����k9��.��@%ITΣ���1]�#��Ej���
��, <�Z�V��n�'�M��|�654��%�7�������Ԭ�"�����(޾�5eB^���
���	*�|d�b7	�":�,������(*���_��a�nr\���S,9���f^��#�PBh��RѮ��]�������ߝMk&y��u��%/M��-.MR�:�+�U��Fd����L�b6k�Z=�olnjd��r�귳�ی��L��d-����N��\K:�R�Ϟ�=�?{Ƃ=#}�S�$Qp �@��z�Z����j�P��wG�ok���~��v��qܙ{k�݆w��ƿ:?�fnf�ݙK��Dg��D*z�E�վ�*,J^�����8��t������O�0�
�\�T?
�@hM+'��ζ�y#�WԼ�N%ߴ�rY��˒���i&�]Y�}�][\
�n�w_y�sS�5DjwBo��5�a�О�P��d�.��E��͍��2Ԑ��+E54�!�=1�[4�A�%&�Ǔ�#�j�Q,Yal.`5,�^��/o�����o�KLï\�K[���u�
Ӡ��u)�&S����n���r��L���+c
�5���D���z:l`�����tPg���o���t�b;)��k���T�&�e���g�ܯ���^��LK��m����ӔD�6$ԏg�G����~E����bq6=�%̋V�dQ^�ͷ�S�:RM���z)�������3W]�&�[e�pS3]��^�\�U��}C��M)`]�p�Vq���ق��yj��J�����^^�'*F+�R/c���+LX���3MS�*�\G���J$,�l
���&�'Mt��8x�������y'O/�(��� �^W��L:Ra���冁����&��n�eU;%���-��O���hCPќ�v'	�d7�2e�8LU�/'�^w�g����UZMҿ�B��Ţ�)�U�	��ȷ5GI_zpoe5�k��@�r夥�g�o�S�\�j&\7�t)i-�i�+٢vpX�;���<���p_��J��~.ٍ��,��� ����Ku�$ӭ�z����l$
�Ӝ����tҹox{�c}T�qRrz�[L[�/G�Q4�.��?�^:�����[�n��H�����2�^"')��09	Bcq�0J�h5�D)���@�Ru�ߠ.��
9���Jz�
�u[�;�޺��KU(��_�S-݂tI�S�8��Ylk(��m��Kꌔ�4��Mq��>��J)�ŒpN $<ݤI���:Sj��Y�y�EB�{wp�c��q��"�dž)�ђGGJ��X/T�a�۪����8D�7���!ܥ��/a�5�?�+۷�*��~�θ�m���%�B#�/�	��?C_��$!G5K��B�v��ϻ�b]�Y�	�C�K����|�݄8������/�D�${��`��� ��+d���+��:����
�����X$j�vC�lW�8~����ww�,W
�]���:�yw^���s�iyç'��Б��K^o7ׇ����O-�­�p��ɗѯjq*��{��r��:���b�q�[��H�+`�zt��n�'Ho:��7�KZ�T�Wf�~픢|�;����ׄ�hzrˬ�t��x_t)�W^��U�Ŷ�����mW����쮰]?L++�,��/��'ζ�
���6��܆H�n��2�Z�Դ���|ǑjE�g��&��2{�=�e���iֆڞ\�\�1z�*t�{�i�}�º:�2n7Q����X
��X��|sG����t~��Q_�s�J	n�1��~
�h�B}ث	á��gǯ���7k�i�hCggt�8AWBD�6ѳ�s��L`m��od��M��b�H�w#괰ti�b
��B��e^Ƣ(��Q�Q�By-E��xh��L������
�:���$�`{�O�Y�Jh$��HQ,���ͽΛC���SM�+a9��� m�.�>
C`�h�r�?��+v[hw�$�r��,�{n��BT�'P*�s���g�����M30�N�������"Yo�y�<5�*dڅn��P��U�m-�_�,ی�p�c�tY�+/zx�
TO��X3��(���g>�D��sT0+)V���Y�fj�P��B�) ���dՕľE�GDG�_�w%��GJ:�R6%�U$ƛՒ3I}��
H}�r
�t������@�#�Y̕��\ֳ�.���4�����A�zBa�@t�A�/�>����הe�k`٨Ϝ�Я���a=����үiG���;�O��@4;�vF��r_�?�F��A�S����*�M����QiA8�q��h�������f���Y����f6�������\�K���G�+���+�esc���K���w\���XN�E��O~��1νL4���$R���I�h<�m
�Sޮk��o�.[�@�6m�1�rT
��a%]���ν��S@����;����6E)e�� ��V�*5@[���_o�?L�oş�h�+@�FTF���xV�3VT0$��%Ŀ�ЕO����H�/?��,��a�ն��*�[m�����Q�����	�����|�{Չ�Wjۚ��%�`� �뭯4W[�+���{��r�����?��e7�`�_D��e��bN��:ѹ�z����V�v�q�T�mm�݋�R.o��ŢU�^>���R���&���/$M�[\�O3��4�iܿ�U�"��Q���$����ܷ
���S���oMg�I�2�7�jb%�n��C>�E=e���V��N�i�l�oT�#�~��_w���`DPUT<��*��)t⬓�7-'g�ӳ���&PpB7�g��B�8�rn@��F^1ժ����B�����q�ߛ�d�)!�&�Jm~���{q*��t�kԱj�/�g���'��L�������63!4|�e��}����!7���&���0��(e��/r+�y��5�^�ۗ@}O�1??�q\�|�{h�5�|O�
���W8tة�t1@��{�wVZAq��mF0�5Q9
;�E�{�ǁ4t5}��&�á�Q
C�Xo2md)V>&C���p[v�����µ	S� 2��a�N;�n�;��%�D�SkW7k�R��V�T��M�*/���B<��@M��ߚˁю۳+	׹jO��t�s����d���q~1-����d��O�u�X�����[-�;���C��qHl)���k	�h�?���'��L������l�2Y�v�{�Y)�`��+�-w���<WVN�6ml۲�]t�+�3;��@�.��`�d%%t�PR/U� !ўb�S�Ѱrm�C����Z�Z
��G�{����xw�2�c�Π@vQ.�ꕔ�5$�ߦ^�$�|H��ߴ�q��FND>�W��B�2,�ET�~�����)�K�']8��ƝY�d��F��g*&�
6Q�Wc~���R�l��F��n��3�%������rU��M�dc1eP�p���I���i
ړ����R�'<��Ź��
q5�S�ـ�ewy7[����U�y�Ç�UU�~���__�E�u(6k�%w	@-i�񸕘C�hF���eqi<��D��g'˳@��G�Gb�]�y�?F!����.+{t��yG�T�XoΧ�Ӄ�3�g�Jʢ�|��y�JY��
�R���]��jz��H�a<��A�a*�o��Q����
�1AJ�]<|�]�"��Vb
�UJ�z�V�a�_��+S�V�H*p4�r�u�n�3>�ЄgL%�.ڲL�9}���yY�<D�: CSEeM�??�::(�(�"�˲5�?U3� ��hg�A̳)4As�m�D����� "y�se�Ke-���ۛ�v��Q�w�ؗ�F�VY�,�2}�
>A�ǥ&Ȥ'��tuM�/�9��C��r� alW�c��!MD�H��g,yt��MIO�<���j���֛��&�(��M�Ż�E�X5斦�F$n�dV���]��hHK�kş�m�a`0�x	�P�"n����g�q�g��
�>�*y^���kFY�8@��=��,���\�ӫ�|4���?��W���h�MO���]d�֟sV�H
�
j�"�N�Ͽ��Az>zJ%nŰh�ߢ�JV�O`3F�v7�L
����g��v�w�و]h�g1��G�/4
���,���|����I3q,˛ĥ+Z��]��f��~�T�7�6��s�	�Ҋ��4�pۀIU�2����r�b\�3�Hp���w'EU
;Qӳ`�K��<Qբi�5���(�ň	�O���Ͽ�g|�R�n�*�5� ���ԵJi�T[W��k��J�}�6���ب�_��7���U�÷�F6H���+�*�>� �O��	��y���'�0C��:+�I��"HF����fV��	^J���VV6XKH2��N�:��;��a;���=�k5��Øe���{է|�x/�.A&��y'6&�w��.[L�7�a+�wo؁�g�Ov0�P�9S\� ]r��HdNP�%�uX��ݲE7
/��d��zrR&=�fu���qf*����+���;��p~G�R�Y����vb� �m<����)�ۛ�e����VC��PV�==U( ��v}ٞ��eF#E9�S��ˏ���C��D�߬m���)5�E8���
%��)��k�\�N����F�,�Y�C0,���T�BQ��*�qN#�m�nW����:wK���l-��o��۠�蠆o�
j�w1�F�rCI�Dm����Wf �-F�v�B��ߞ����UƁ.�ea�m"H�|�`�KlB}WZ>�~]�@r�)��j�18P �w��%'ԸL�2�0��2i�j�͚ �TF�)a-sh������O���+I��<���,��'�n��G���f
3��)�b�1Ͽ��X���װ�2�$��+�:оcő��y��^T��%�{sptV=z�*�yh�Uv�f��E69d��&�Ҕ���1Yp4�Q.bm���42��	��`�k��(�'�8¶��ڗ�Y�p�QA!_[��Pd��j�����~<
[�xv5��=8 �<;[-�e��4��@����h��0dw�@䷥�]J�d5�`�7��3��n�ޖ�ޢq��dǁ2E(��@錮�3�A_�Li�2Q�F��B}�ċ
�Ff؆�1m��:�ƣI���c���F3�M�
b�I_�b,�x"�;�ֱ�[�tp|~J�����{ݏ3�|�J����q)R�"f,h�PQ+�<�2��T���緾�����j�P̯5���0�`�����'|���T�ڤ�������bq�[��|NqG��)�	�o��h��F��E4�)^�>�E�@�Sިl���I����o�q4��b�e��0:��V|c}�o�K���͍�E�Պ��Yud��U�������燻/N�-�����уL��3�r�8x�e�E���*_�ԫ��Ӄ��y�� ����������ݓ�d��J��{���Ќ�̾�cUr?�sh�d�e�==V}�o��j��H%����ˬ��h&W���ח���@qR�o��%���m,X��Z��8;l�g��
>�W�	�����	��wFË�eSLV5�ڝ���g�e�Z�N�2"��"RF����= ��^��>߻j��_J��]�f���5 �i	��o/K���Zo:�"�(o���M��ָ��	2��jȱ\]�nE���Z�qe}(��M�eA���z��zu�H�o�HE���e��@ޘ��Y������*,�/�`
��C�o���xBF�;�?�Ŏ�q��+,2}�)��y��iko���y���	_
�����[�r�9�[�=���0!�J����b@e�����~����i��=b(Pu��v�׀kZ�<���j�e� �@¥ ��!݃)�W$<hÙ�#����N�uɸ@=c���1�N�>9~�zq����~}���a�Y�6�*�[�@W	��ړ!â��M���L�y8�ܬ�
�Wj��Z&e��&��7w�V�a��䇨��z~|rv���񛓽�5�6��N�&'��s�F'R"���*�^�[g���xL��p8���4�?�Y�י���?�Dȇ�iJ?/���WeQGU��0��;�V�VW�5���޶{�am�5ԵZ�Sox1ځS#���7��G�,���k��]�n������+�z�ֿ�}���e�C��v�_�œ'�#��->|t�e)9�9I$Dm�?�͖δ����@oL[����ǝ�Q�h������G�o��Gӵ�o߿���{�~�ݻ�k����F��h
�D����=�-����=���V5�_�+��DW�sG�j�¾<��;"K�aM�v���^��[�t�Im���V�O.�&=�:eW���U
���Mo���1C�q�������߽O��џN┧��g�璲d�#�WjU�X)��
����݋H6"5s7�x;�Qd�K��vTbfǖ1A�!2�;��4�hE���U�ҡ�T�լv/j��������D��l$F(X��ܘ�w����/>0��G�.BeQ4�]_\�Gh��|��/�}�
�T�>s���fy�\M���������vF�L����]=�8��nW�K���N�"���_SZI�79������-~;ُK2�����Y�q�A�׻g/�7�Ӊd��up�w�f�y����F���ޡ�a���|d�ٺ�v���������2�{����v�Z��;j~"ol���x2tүg�>��hâ��GU�}'��3�E���о`<��R@w\V��=r_��Y0z��0�ѻvo6
7�Y�6�I�z���]�~�K�A��@��� ��{є_-�4#��@�&��th��8��td�z2�U�TҘ�&xÞMr�n
c����i1o9�z�Ϝv�Ï�}u�����R�W��+e��->@Uj�uT���*��A�7̐��폱�|����k�7�5[o������y��ϋN�v�~|~�������~!z���>�7ʰ�;.&�A�4��+�{�ڽ���8�O���FV
���l��2��]��q���2����h4��;����)�A~�ծoY;Ñ<kF�����jT�5��H?{�~�����Q���Ru?�gW���v��7�u)�ݖ�5��b��Yh���tG���y�e�3�i��^�h��A��Q<P�ʺ^�]�����54�U
3�IyV뎆�􏵦cd��t���{x��ux��D-ѝ��P*U��gFRC�྇���%w�:R ���/���ͳ'�o^���W��R�m� �4���z��h�4s1u��~|}j�fu�w��bC���?
?F8c���R�:W(�E�����)T��~�7����{ѹ�&:���ë��+��jD�e������?�v���Y�UZ]��pB������"m�9W��\��~iM�pH|�=�\�;�趿D��h����ݼ��E49��A��z�}����h�G]�1�q`�_u'	~w��·ѽעqoW������ 0[P_�PD�I��ٓ�b *��-�D��>�w��!00��ǟgkt2/�Mgk��
�/=�]PB�����N�bn��W���`0�_T�Tu�0�T"y\J]Ǟ<��O&�Iַ0U 镰g��6O�Ƭ�Ė����n��	�}�L&�}���:�G��!>�����q�-`��T���ߙy92���]o�W�*�R)�c���I��t��Puڡ�{y�o�by�@��q?�<;8%)�'�/���a9y�{z�G�!Ļ��A�o�����Ċ�B(�*~�&v_Bև����c<��VU�P�,��!�zw@,!��1�-�(�tSd,.H3���c�n��/9�ɫS��{�����>��ɠ�bSQ��7��io�6�ZЋH{��݃#ܡt���,b�%C����ӳ��G�]:�L�
?E/$��u�2v�_2�Sа��V��ɻQ�i�l�j��f��l׃
��a�cuzm
��%C|�H"7hׇc�������Ƈ��)�"~(#lJZv�Gy���fR9�a(k�(��3�A>���G�gXxԿ�1��D�6�+���2�����j���צs=�GT�zc�[�;�R{���Z_w94o�~��]���,j�qU?�^�Sͩ�IƓ��%z����9a��O@NE��S'-��:��_�k�$r�ɺ@�ԩ0��'�/wj�N9m����e����$V�Tx �v���jU4��)��_^@j�eC��0�$]��B������֫�+'��2v�%�3&lE���;�_��C���p��T��=�T|�Y�_8�Y��D�M/N0^t�%T�f�;��%p��<��^�h���k�j��<+1�z�.���zѱ_S6��SXk�����l:�$yC��
ĭ�{�h��!��U-%_��59�d"ٸy�o��k���D~�Қ��:?Q��`a�S�LY�y�&������c�Q�����٩$>?i61��;z��?�JU���4�CVI�C!�3Y
��8�b/�
<H�����'�h�z�ڢ�&l]�@@�9��5n�gЉ�
3|��|\�
?��Þp�0ɵc�P-�w�z���%�B���)�W,�s~k�i ���[B!l��c��Xh����!�Sr������<%��Z�\Z"��\�ԏaK�E���-z�����O�h�d�C��ڦ5H�\ۓQh��-/-F���Ȍ�|�<�q�W��g�^��4������~M�i)>�7��>������ev_��Òä��"H�%'��үwO΢J��L�lܹ9��W
��������j�w��S"������aخO�W*
�t	����g�X��n�y+�E)�����1�v�}�ΩTP�t�m��%�"c
(��߬���u:C��g��v�U�
 �!��!����I�Y��w9��!��O2�tؑWh�~��ں�+�\%�I�
.̶�W@M�`�d��K�q*	 z#3YI�Z�X�
b@<����t�I{x���6H�=�	~+�Yp2��U���V�C%�Jp�3ؼ��~��_Z�~�L�6�\Ͻ��h��`�L���\�g됛7n�txs�]�o��=V<�$%�h�k�PJ:�Ŕ\�V���?�Ҳ!%�x�����'`wx�WO,�)D�UU����
��D�ݱ�4��\�A�i��b�A����4W�ͳ��Nqz��-���3�	Zx+v�R��^���DIN���O�D�G1�D1�a`�G �%;����j�7�`��Kಉ���ra�4��v
\��]��[%�*��C���2����&�@W{�D؇]	�J�l�&��'<�b.�`�*��M���%��J,�__\���:��u��}�
�X}�.���6���*��QUwj�}��'ʘ�B+�֌�R�h 
A�w���t�k;������~K~b�o�~>z�L�P���If��0L��;yX�v��0K���2�$��],?t��e[��_��f
+�zV���
˔'�:PCkY�F'�:�1L����B����W��3=��W9���R�g����Q�x�vRv�Y����t!5��|tZ�Z���L��A��	�#R�����V�^���5����sG�5��>O�}�\!�ޔ��K�CM��/�9XڄY�_��y&�fP_0Y���l'�[�̍��E�B�:<!!;C�c��̓�2D������
ڣV�:�{�2R>6d�ӎ�+4�$��u�A�o{�K8D؂XՓm,]Ǐ�7�F�"�<َ�8���g�^���q�+J�9��]�.�����r��0\~m��e݊s'�
�頹���N
q��9Hq-�z�/l<���Z���L�;;#k�>o��eU�Rݚ[�Z�
o�疭�e+R6TM�������M��O�^����AQ�V�g3����٬�ѹ>�X��D=��qE]7���]�H���9��<�je��^�e���K9XǪt�Û���p�-�M*A�)���(��M�,���ͪ��<8�?�)�+`���2���y�Gx�5v����R�˚��7_��ͮ�N��γ��W�R�UuS����Z��m%0gmA_��ġ'��+8�da�1[(��@�;cU��a���('k�D��N�d�C*q�ӫ�`�7�P�U��VW��S��jB�3)H;8�o�L�<�k���V����ͳ���1	������&����]�"݋x�}O�
�
�`�3>�[@߉��ݮU�|�͠v�Җh�d��b�{u���!������?���%�۹�$i��ɛ}�_N]���S�;�0��T5ZZsk8mق�M�(M�6Y/moV䪋k�-;��x4��bk8
�g�P�\QU�|EEFpy�;�zfD*y�
ʊF�w>Ll�l-�㣽�&�
�&���[6a5)���X����:z�X�AI���ȓBR�m �Y�?�p:H�_�|����SW�W/lb���V�P�k�N�z8�/�OZ�n����Oc���Q��*�n�<�]�0��Z�V��v_4n<��_�c����52�˃��_�Y��yA���f-�K��bR����:����s�S�n�1��P�U~���A�:��м$�[Q��҇K��W(ziu�
�R$�!,��ͅ��gE9�1��3W�ft��xي�E��Lh`�����{:	 
��Q��ł+�ڧaڽ���QBx�r��y��ʨ�Z:�E�"Sq^1�Cn���~�`�^�V&sz���O&�ؙE-��{��Z��R�v��J��O�@s��!�I�Dt��J��%�cEM�����i��J6IƜ�`�Z�~9&k�+�%�Pu�����3}�Sj���Q����۫#IZ�, T8E�nS(�W��jE�C�䣒��`j�aZ��Š�̾-RG�P��d�Xi����޼�Z6�����Z���z:���
B�'�N^ն9l{��:C1	D
�����$]X�<A>�j5k5$��]���$�ۯ��P<ڵџ��<h��)ّa�$l�%�N�X��Ed�sį�(dx�B�������79�����N$���`�v$Yq���Z�O#�*۠q���+��~�K�F�"�0˹�]�
QT�����]�2#��q��<��ғ!X|(�Ê��	E_*2�/*�/�YR�pv���R\�S�غ*DܥHx�����:-D�h�N���V���\1�>b�"���%�#gPǀ-���ɱ��,
�6q�ϒ�d�P��w�r2�x9��E��"I�t��$ubs�O�X~�>�����Ht�l�`�G~Kcӆ�Q���N7���S��Z �+M~Fd�1��_���u�	�X0+F��^�W�%8�0�T��;%Y_����#���Ga���
�d��(��VZ	�.���#5�a�i�V�'��SkQqi�J;��2޵�u(Y�:��(�77��*�+�M�Z~䱾Mё*�ꦘ/�b[2��f��7܌p`��j�7��0�z��B�������)Xm���m� K���s��s�#JžK�'�f,D
��6zg�	��>-���ÏEm������/D*\����>!���j�%������Ua��he���T�j
-��>�S�
0tߖ�fD���Y3���]�L=i�GQ�=�+�a��$�~X���B�~�%�p�1�E���q�i{J/�c9���t�~�9{qE}���Z6�+^�h�V�Ж\BҺ�y���ݮ��X/�Mh*c�c+j��Ȉ��4O�`�E���I *�����+I��N��V�a�����/۫���ڎkݭy���ȼR��>Uq0+��Ry!�/��h�o4x5�R����W��h�dze]I����G�dFx���}{�fSm��0?����\ͪ$,����0���Pj��&�8���BeKFᔳE�Z���<�%s_��)��%�(X%�7jdc%eD��	�cR��2(-FGDk����r;s&20���"���)���E���a���l֎�5�
׈Q�|GV�L�r��{^�(7^HFxS�^ې{|������>��,�\��\��Xg�y���Ur^Cm��X�2�Sa�l�dر�xF�o� �:�w?���334���+�2pU�؆@�K��6<�,Yw��J0/�5w�zw-JRG:�|�"�CI`z��,T�I�ol�����R����D�țDk6"�]6V+QE�7Vk���E�P��~���y�C.�ԟ��}OD�p��W�B��*����i�
�Z^�`0n�.kl�/k9q*-��7�S�>�"��]ct��|cL3�CB"�]���f�g�a�ϻ��tudy���j����Z_Y\����7Me;힉Q�Q\���z84Y�rDk�`�����t[]`R����7=M��|���D62Axp����=v(J���ǣV�0�����78��y&�����iB��0�W�ls��~�x'|z�,z-����u���N�r���0���7�f ���bC����j�L)-�9Y����Yk�����M�a��u�-@ح+�8��y����y_{�ʺ�,3�?��Yv��������WY�y���Y���(}���2��!�r{s�$4�%q�y��*Z�`�����¶^C�;�"k��=>De���iVFG+g�wr�S�V�2�����H�Ž5n�A
�Em�����ψ�����z������\�e@����</�,�dV��V�H3ĆRZBR�Ga�j�ۈ�+dm����I��*E���m�hIp�D] @oZ�[B�A����eЙ���%�k�q�FS�\�p��
D����)9P��CȎ%�6Dn@'P@�Q'���<�IGC!�����:�' ���Aa�}b>��A��A����`?,��B"���?5�?��Oɤ	&/6p�G��_���'-qW���"��ҡ�4���ik�\�OS���m	2r�:N%�j��Ǎ��Ɯ|@W!+���ޘ�ǃ��@�B���g	�%@�ݘhZW1V5!i��D�
�+[�oY�0�o!	�f��l~�������W�o���j$��*�^�Ξ�ʎ�ҥ-V�o�|F�Yv`�P�~J@��L��J�s����O\����p��?��v����
�.��w��-���߲K]R=]�q�"^�(Efz�>'k�%`�s/�@�{����?�%���1�痻?��^��{��W��q�7�P7���9/+yA��;:�*ߍ�/���R����n�@wD1���=���y=D%��]�-�H�R�e�mf�I��l"�����/��v���Ǿ�>Z�\�{GR�+�V|�<��( W��ͳ�#�瑙�ւPQۆ14gW����Ź�T�9�>7�ϐ�(mY�o�ON�&�U���7���&z����:z���'�.8�n�?���KY�i��2�'��Q�i���$�B!���N}R	<E��^�Ⱥ81l=��Obɹ��>d��������	aZ.�xSC�En��Ŭ62�J�z/���xRo���vc^��}@!��s��oOœmQ��rB��Ҁ?)�N��B�gwz�*�>��I+ҁ����\��_M�su�;��R~GD����=5;���w��0�p}?g�`E�ڲ:OG2�M�K��<�ܱ�9�(
]ɴ�P&1,�"Ӟ2&n������Č�7Q�JM^��f��{����!'�N��x��2�_��`B��j�!%��y\��N��3�(ΩW|	O;�>���r���aL%�K\�ۙ8ۅ�6���b��A"@X����B�a��',o��1�/��5�Ώح���Ih��[�vZKX�i����$��
�_�y���A�50'(D@ )���{2�$5N�]%W*48�)�([c6lH;�va�Wt�O5�`�Ev)�xȜBQm�sM*4])'+<Lʤ��B�wA[�|х{]�qOpZ�=�Pj�n�ޫ6�%�Iq�����_=;hi�#�
��������$K���98<�La�O��V|?�Ҡ`Km��A����P�ALK-�vj���?7���)>���@IK{�䅑?�;����N+�,����+��g��ij�u���O��L��A[J��Z|�O\v�I�b�R�%Qҙo���O%*��=��E�Ֆ�3-�Σc�O m�m�4���a��uj�7B��jn@Fm���r>�%�E	Ʌ�A����/�9��h��냎�-�Ա�ܖ��k�D.#�X�ˀ��w@��!;S��8�t�ޏ�Qii�/���8>��u9�wx��P�� ��O����(��(�˪�IJ)d��#�@�G�㔕���
uG�ՀI]6y�����-��L��
��v�~d;�.&��)i���̰Ӟ�bBkd	�	�J�WP�5G��_6x��۴!�d��ͧ��Yp����ո�q������ª�W0�ם2�:�DZ�m��kwV+�fWx?�gzA�zϳ�'������<ذ?���W�S���6�Fw�<9y�,C�58H�&F��W�[�מxv/�J�!���}j���|ޣ�������2��$�9�?.�=r��=��-��Ϝ����*�Z�=�Rhq���1�(%����F�jq��z����R!�}F������'z��pyp�j���|�p���0�B,"x�ipyl�/Z�þ�<>�q6TBA��6�v�i��r,B˱^<up	��*;�*�Z����8a���Z��D׾@{�%P�o�m��O�N峷�</(�Z*���R�'.�5�r�k������z�4��V0ZӮ��G+�R�l>s��{�KU���U��31:�m��q,�u�`Q�ū�Xȷb���9��/wM*���TC/��\�ѹU6��T�,O�����Jz�ؕ1g����ք�zyC�T-M��񗺝=�c���"���N�vO����E�~�]L�9��’���H�����r)��zǠE��:E�D�L�d'��C�'���JLeǖ9]�#F�8�Z�
�l��٘E�l��MW̱rI7� s�/4Ȩs]v�uy�NN��t�aęC
�߶y%$���KZ���Ã����F�Bی�v��kj���kO.C����r!HW��еi��ŭ�<��S�Ǘ	Sz�0�l3��,�i(�lSl��V�"�>�q"��5a�!o&�UFI�=�-�q�b%�\Y+�U��4l0JVV��z=�s����㻺��n&�H��t}�.)��[>��z\Bl%�+���$��Kԡ��X�<YZ�Ĭ��-��_TM]{�v��.�b��W���4T[�w�&K�fÒ�<x���}
��:=�n��p�xM�G�n���gh������~�y>*B����~�W��~�(G!�
��iߍr�M&n��ڞn^�.e�
��N��ۜ,:����b����<8‡3��:��AL���ߴ���u0
��
�d��d���a�(Í+T�B�ى'
�v�?�em�Z�S-S)pcYu�߮�(�b����*
�߄NO�֎�Ae�]���A�i��=>|]\m��{�&1C-��!
2D��A����A�CLO`ZGQ���@5"_0&A�˜�9�+�}�k���]�Sph48�tp���
,�z2z�ܖz��~<�3^X�B����M��9��q�E��5�3�)�(��S�׫���Q�����V��8:QO��(�R"�+�%�-���:���{/w�^43F��N.��9K�~�c_ؐ�!����w�A�}�i�t$=��`	@.�\��\������DƺF�͘N��8��a/���v+�)�ܿř�Ŋ�|����D��[|1:s/��i��d_�7�b~�����D�"��|�V����&�%�Yj
,jCը�,���A��j`x�M4���??滥�h4�>��}f��Q4��S2o���q�
B �sQ9��?��܏p��l�:�V���N�Ԩ�(�>���ː_�f�uDe�):��6.g �C�(׹���_����h�f���3�8W�WY��n�׹�C
�O^Wf�1b�Ff���*��U�ۿ���=ԽO�̋��yb���tq�ĴP+�>[�okG[��gy�����4�X��<
�cD�2�]௬��sF�w�g�k%�oP��fc���7�
.V��j|*�.����F��p�%��{�Yc�]+Զ��w#tD�'��e{r޾�1��}��}��\�a�Ѧ�7��E���r���M�ߴع�m^�w>��&K{&f�|ۥL�1 ��o}1 �-*�л�`-�b.�xm-��mБ��(]��p1���ߒQ�B�x�.94N @�)����g	�咏�ل���':~w�@��L"y�������DurΜ�3�;�I*��}f�:u(�����{c��J��m؍��"FTAU&�Oj��uR�[���`�|����`�z�˫����ә��_�l�<o]"E.X����G�W�t?i���~��2n�;�B���qb$
��;�
�f��ӌM�Q��6�ݥ�r��A��hdM�2^�MDޯl�H���k���r��k{{���w�{(���B�T;��G/�0]���#`���@�_��񴷞�Ⱥd���
]���N�Igt=�im$����QD��5�O����=�r43�ѡ��A��p��r&�!V ��$�p>_̺�=�O�m��`A��n�EH0Dr�e�i�TĊ�%��p�^����&cf{��YBL�=M�:�R��(���J���r%�6�*6h��g��ӷ�@�^9��Uיv���@����.i�<��}�z|������*�5ڈ\a���_i9k�u�U�(�k�����/��Wo�R�s��F�P�i�dndE_�8ذC��AȻ�6�g�wُ���.@|��&�OtR��O��/i(�R�=�
'Ė�Q{�N&�/���|�u���~4f`|�E�4M�1Y��I���|6���~;�=�͞>~���O�?6�������9��s{0�ǏM���W��%w�VJ����Zߊ�@Hz��{�i�T��7�-Z�<�oN�dd�iuk{�^N8;>�=�"�[P&���iBO�պ߱���;O/�i|c��,��l�]Ũ��F��=���W(�?~��q4k����Hs�Z	T=��}���h؝Z5-�ԋ��S{
?�Pc9�
;�x��y��!�g_fH���
���">��w�,?�ʁ�R�rt=8�q�5�1)�b����o�!���,g!b
kNh�o��[��̜�i�n��^���)ڣt2�bO60P+�o��#{k0�^��T�e����0UT�S�/>g���Jfl�P5�֢�{�pV�9;/���
�,�H{˃S,�h|�>v{�d'%�N�����lO��3����g_D��e��5�J��\��n�.λ[��f�T�nW6;��R.o��Ţ�s/�ϛzH�dI�W��x�;������\���i@d�י6i���sunaA����y��D�g[No�g'G/H�ǧ��}f�@�34��4|dV{k��ad��P��i퟇�:#C�a6i!	WЋs�CS0�2^H��O�n!k(̺�	5�54M(zn�_ML?�f�+�>K(Ob<��T8�?;>�S�I�1�Qg��f��7�
BDF}'n��\�4IJl��)��K���f>��e;kFm)|��Ts�.Lr�lUP���K�<�5�P,4:�a��d;��mzM�t0�U<Ag��KO ������>Ď�K�r$�w,N[�dE��]\�׍�3
G�����}���`�6��0I�@�~�wA:�i�+��;~Ljl���Ȋ�\'YW��W�g$<V��U*�H@��/�Vo	W�����Rn�-�p�v��=2�Hв���U�,G>�q��u�v=�M:v\kdž�p-L��Q\���R�R�(ϖ=,۷4o�8�L�;�{���ɋӬc 
�U��#�+�*�6o�\�X�It۲��Q��5s��)��ѶY-�����R�)`uT#zA�w��Ƕ�Q��죛��z��N�1�V��VO+Du)�c�S
�Y�j�j�whY������%��D�KX�9^���I��짛��ŧC*d�J���oX{���po%����zi_HN��j�k�e��uK�D�-q�y�<�]\_��'��l�U.(��~�o��gf��$���pKc�S~�
���T�$uK���VnW�+o���!�x8���w
�P�:��-xF���cc���r�b�t7(��nj�P�1�_���O,�be�ӛ#Dr��E��Qe�5��Y� [�gU�o��'}9�Upm�C�9L��(�c�8�ڌ��|���fs8}`Vv&4q�s q̶f����5cdBe~�IZ�����eʖ+	lv�%�
k$��\���ءh���)�淪f�7��M��VU�8���mA�������W$���כƥ{uk�%��O�=���8�.���31�@�U
�q���.��a������#�7�#�Gz}r��̞�9<3׸L��bLBy�p���W�M=�ҋ��BT-p��� �b�[�*>
J����*�H��Wӫ�P�=~/>���h��+e2!_�l�t�6�Љ9SDn�G�?���Z���]�>\�CL�m���e��_4O��(�h�2��&��V�D�!W�5��$<ʈ<���f��I���fd��T}v�gJr�����%T����ʒY�H]��[\��I;���6U�Y&n�,Y�CE_'0FL6�\�o�eˈ�Y�@��#pq:�g�͂�᱂��
g#��-������2��`�Cۤ��b�lҭ&�qH�$S
*����ۺVS\��dB,�%ŧ����!U�{�a63����Uݲ~��!�7G:L[�+J�H�s��X�d��^�℧~3�9�.{�L1���'v8��M��?
��Q`��E�V�|����L�z��JN����ۓ(���������9d�@'ŧ��e*��H�O
���D�,
�y��t�j�����p��<ё�Bc�'?p&���q���;WbL���ƋҭwU1��:�0A����΄D����脏,e`5� Uu��Ųp5����'`�Y���%�y��%QD���~�+++.r��q��1Qh�b�.�y���Į�t:��H��$�{ؖ,l����O_���j��?Y�����Qms�TqR�H><d�.rf�|��bO��<�m��:gZ#�,ܞxkݮT�r[�7�W=� :i��99j5�޼j���H+e��]ć��B'��7��ԕj(�(�:�o�Ro{Sv#�硵Ȁ�=$�Lc|ٰ�j���M7մ�#���w&�e�;�
�+6���	G*">�=�_}�ܿ�
�����5�k5�4D3z�^&u<�E�P�ト�W�>^���=�U���ī���u�7WV��<�!��c�����#���Q����Զ<�.����"~o�L�q�m�W�u�I[N7��@����%�t���K�JʃJ����x0�}i��9��ie�2��1�2�(uyU�z����q@�Z�����c���1lm��*B#�{�������K��ƞ#*�jhn�����Z�%��_�<<t72�F�	�0��07x�	9
�GOG�S|���C �zGs�I�5 ҺM|�I�ڈ��L��SE��hs�iϪ�S�P'�U�2��jŝC|k�/M\����o8�K���DȮ�{��F�ɿ�p�f��bk�^�Ż��c�K�eDJ&+��|�
���n�3�*�~[y/R�*�O�?�&��Y	�b*�,Ȯ�� ���2#wd�@������!�d�" ���-N�̽�+>u2�OY�G��A~:J��%[U˦�qmh�bK U��ܥ"�i�/f*8R`�y�\�[)b^�8��*U�`E�Q���?
��cT1�kh�YƳ���تC[�866�H�����|1�&}4ȉEe�Ns�D��=W�߉R��bPƛc���c�Z6����QV�*�ÈЯ,�Mv�X����|]�����_�tp�~S�����]_<��1�,]��!Z�$UA�"�"y9�f}[������E�_WO`��9c6@M��p	5��s�o*{H��*�D���D�A���)�<Vj��d+�[�c��
��e#^
�I��ۡo��}W���X�^��B�r��=��g��<�����	��l�>�]fV��)w�����ɷ��Z���]��$~�S��mܬ�w;��=b��n��ǃ�Z��3*���OM��n�Dol�t������q߀�Z��պ�$�<�_Mz���?�\�ݢ:��lz����V�|�Ak
�ְ=@_QV�:l�˰)�~.ڽ~f�z�ȾA����r��#ag�x(�̍��xv��X$�:W�w���#}�]+o�ť�F���CvF�8G�����$�Pυ�hcG���ZN��ްӿ�G��S�+G,#����6��oNK�mLiE&q�R�T��Y�Vޮ�i��M�%���p����z!��m�ڂ"m���G��4*�f�n�N���@�b���,,��y�$���]�����*,�
5O"��M��tSD#���Igԍ����'k�}��#q��
�0t��{-j����`�Ĵ7�aQ�F�؝�ѓw�W��ϝx<�fW�YD�2�F]���k3���7���Kmh�=�"��S�д�A�,��'�������Z�nv�&�Q���u=�vF9�a���O���w�%�.��h�'��b��!��t=��Z^���]�
X:"KP��`�|�a�1X�P���m��J��,�t�=l����	)�0|�M9��=D���4�2�F���� �A!�K�e��Ի�a%�� �SzGq{���0&�B>�q��8�7�{��18^
.'�.����O�i�F;O�J�)��NؠE��Ђ$���a�9�2��?SC��!�l"S������R��Q_M�l�q�$`wm4&gԷ��
wC�7N�hpА��;��v'��ꌮ���Ӥ]�g���iM�|���f�s�>�%_�D�<*���v�Oi��u�~k�>�~�'��t���wv5]_^��>~2��<
O.�)A!7���h2�]}�9F�pM�ټZf����+z��9��5H�4Fݢ�q�1'����d�zʔ5��)EϾ���.��R�H��'
�,������C_a���*�?�7Dɢ����3\\NӘ&����C�!KP���L9k�'f�b�?H�;s����Yo0����֍[����ٔ���RP;T�mDžF�1��>��DE4�M�OR��U�F���7Sv��2b�ȫ�D�s a�y�ߍ�H> _CR!�^�kO힜�F���:n�����ٟ�c�*:-9y>:l/�ۗ�W�ı�U�?�~��*`�]���mB4�>m]�5"Z3���	���ғ=ٴ�K�ш6�_ ��	�&�q�<�J�f�@�݉��S�t4�p6%��Qz<�c���)������=����Tt�5�`4,1���0�]
�`�����f֮����E��E��f����F8��2�>Ɵ�l��ie�O�K�%:��e��5�F:�=��� ���,!97�,ޝ��\Y��(!p�|zH��*�$�Ym �B����h�?#���ټa�'Eu��s��ylQ��%H��^��BНd�Lܱ��&�n�:��a0�����p�c���hR��<�qf$��0檅P���:u	b!%���V�^ـa���Ej��2�Θ�{�L�X�5�2,���6gx\wg�E�C�<πIbl�f�ք�=n_C8|?��f�خ�T/!�`WϨ�TҢ}$o�B=}q�8>vW
p�C��������x�a�C2��DB��#;�O)�W;ҿ9��I�K��C�d�q��(
����_?D?�$Z
4�L�(�yý6z�[��B�6��`�>�ȮT�M%Uq�ş�z���Ropoy������G��U*z��Ĵ�ao�;���&K�xx9���K��Ʋ/ӂ������7��^�>��?�YC��tV��Γi�h�|Qmo��J��v�؈�(Y��%�ّ��c��rơݾP�}#K�4Ԕ����-tkB���
N��`���$$S�7��Q�O���ӧP��1b�ܧ!�r��E�oY�����[��<A ���j�o���v��Q9;9��V-��|~p��u�&�bجK@������5p���?�c�S�C������=�||;�W7��(�HXU��\���k�5����0�*M��ǢNO����׶hHy�YC��zC!�4�j���jmݮY�}��U��ӄ`)��>�+���
�@��b��!X�*_�3�y��-㶲r��.�Zpf;�mT�W�9[V�M�5��Zg!����y��S�<m��x"XP[�	JU�����$���X���T�6T|�ʥj=s��]�drY�*"�tf,蔩s����V����]���=젺��}Ħ�K��!	(ث��ߡ3�7a
F�����As�oW�b-X�	�nGꪾls��ߺ���E�T��>��+�����M'01�gF�c̱ɠe����t˘`ݣ��ѡ8�
�0����®�[��$��t��60�4x6����󸍇�VPg���1?��m
F��l�:M�
����t�wl@@�tPe�2*�2�s�"/_\��7�[��ju}�Ÿel���@�h��#K�*��O�j5�~=�1=弄p6B��W�̮������R��0�/Ɖ佬�
o�v��;��be������g�8�7y`^��"J����]sc�#d�_�s"�5�4��R�&�
�?�޾7~�VK��Ui�_XW7U��]��'|�-������b����h{:���:U=D�;��ݡ_����@2U\-��J�F_��$x.l�3%qN��=��5ku�-L\~�24�<.�،R��@�zo�M[巊 i��Q�Y/��x�0�ژ/�v�.���6Rw"�:ỀnD�|��4
�V�[,��N` �m�y���%D�pĢ�6���Wb?�3�7Mj���ܲ���+H
h�3��|����_�_�U%�Ӑ�?z��\!
��>��B�U�ة�uS��<�
�(��%ڼQB�v!��.�A��X�W��m�o
�]^A�m?9UpT^`�.���$�����o���j���H�T��.�K��S��a��b���-R��?���/�G�	\z��7lg<��.I<QL��7
T���u4V��v~��٢�c�#�.خX8���ʹ&N�X�b�
�*�tn�l*j߻�{�
bM<Y�?�vxE�־�Y������2C�9U�B�֏��)J�
F+��D�Ź�+#�|�Ϊ����e��?����l��9T=���|��O"}�����vᵅ�6eeYU��@w�j�r����ƙ|�m]�ݰ���:�d-#}��c�o�x���<25��/T�Oړ�^�l�E�1�5�l"Q�J^LKr�#��@/Ƙ${7�&+��8E]��W-k}�q�wb�V��rC#C}-��,�{1ՠ�^�
���)_�\/T6���x��)0']t���J��{y�Vq"[��7D����'^���₷:0��lBv���#�a(�"�/援��=��lbVQ��і/ZXr�3/���^�t��e�8rg��b&��C#.�'��+�;q��7�xD61UhV(`؄�1v�,��K����XJ�M,�y"'YU�(I�Q�2hk��~"�݌� &� �o��H��ӂ���s��`�\�9FMZ@��YW�
́aZ�6��[k9����0�����jvm��2��Q���2ϭ�;g�9��#n�1�9I�hT�H����hJ^����W$��,fI1R#� ��U9��{�,�v’�>��IJ/,Ψ(�H��)[�Np:<��3�)�F�Ѣ���
4�A�TR./��ZTm��@���D:)���Z���U���<��$�Z��[�hS!�Q�)�7\��C~I�pG`ԛb%	�I��j�����H�)�oӹ�F�+=�J�d���-�"��:�n|1�H�
�&x��:܅u��t�㩣�K;����^5_�:���	�& ��_)��M�)
��1֭�����( ������2�RE��Ų䂯��5��(�f���g��W �N{f�aJmw-��P��r8��Ĝ0Z@��I��x��Xu<
�yA��!�bΜsB`A��=pgB'JU�B��A��}��
�\}�~g�b9���}�>�����u��K=yeA����]]_����~�򦨪��z�N��y����S��{;��0^i#�`�a�s����2w�켢��T�Q��-��4 :�������y�}����o=o9i��N�OΚ�ٵ�PN���\ǡ-�NԞ�zvq�˃M��=Mc��bw�7�x2�IM

;��F��u��0��B�} ��zUh�R�
��l�o%d��qliYQA�.1q����]$-MLH�TȫO��қ2�y��.��
Q�P��1��ݪ7�C�a:�CIF�^Y���/��w��B�V<mq��
��^TsN��\�Vx��z�t��x���xmL����B]�h	 ��sNȉ
o9��d|���MY�mP��J�ZӚ�V�z6b�	���K}�
<4�u�:��@%�b�G����ݳ��bv8��� ���1�o���Qb#]&�P�y;��!)[W�Ώn���}�ڛp�p����7@]Ums��WՐ����/�͛}Pj�Q\r�?�{O��:|+4e{��hY�u�����t���
5�NVǣq�\�F%cu��u��E�gW�@�@�.;<�J
�X�����Jk$�j�ŏ��WX4�a�4�Rƿ�U���fB!�V�dJR���*k��\�<���
S|":N�0=]��>�	%,-�j��|M>�
�ߍ&�B��Ѯb�e:��
��Tw���{xɏ4�P��O={�:���D9�4�o�}i�z�)<�F8a��P��{e��pd�UZ	D��0z��YF�ZF��paK���5��p�ʎ�s��Jռ� �Ov`E�U�/xy��m���}�pS*B��E��U>��FF�T�18�AD�T[�K�B��եmQ��m
��s��-c��X�Y7��EP��T5s�	��e�]��
@�:�&��:sBh��UI8Dx	�>Pȼ
�I[�&�ل=�*��F�XDx3���!�R���ה�.�e9�t�&9v�*DIk'�ej��4��,�ʅ�������5u�m�=���2�@�Wv]	V� =�i�}>��g��f��Vx<4��C�2��M���{�|�6ϥ7�zl=Cq���ޭp3�A����5O��_��Ǹ\�������x�a�Ծ�|=}��]�Lo3*�J���v���ؗ�Ee�>؏$0�>�nͮ�>)��"	gQ
�)P�B�2)V�
񟴨�O���<x�m�����V����������n�"�d�̧H}�>ނRli� ��is��)/D	C�[��%n8��2�ML�ÇQr[�`��Cv��}�eO{{�w�%Vr��mT��Mu��|#����{���C���u
�~��_�vt�/GА�7�"7�5�}��σ���3���n����q6�a�"�3+���
P�Tбw|�O��3���
W6���Ý&
n�a�
��
�/�E$h���oy�]�0t��W�U�BD��Ӹh����q�%E݀kD�EJ����{멈#g	�t���1i��������~K3�>Ů�ܧ�{$CW+V�YR�%M����l����Y|F��S����\�ќ����zS�ո�o��z�C��c���� ����>����7<F�,
�����ޕ�G�j���A����C�!�{!���M�coƕ�����N��&�!9��؞�������>�sg?��T��e�{�OޓH
�]��\_�ܤw*�����
��|�|u��ׂ׵�P�+/ߕ;/���^��E�`���2��js�J�O+��Mq~�rqs5�~��F�kY�w�\��`M09����l��~bP^FN�
�(�E1�'����*GճW��,n��΁&֎��"�֑5!�4�����*Swk���U��e��_\߻���B��ԂAC��h/��s�rߕYŚ�����XTM�������Tz<�[�a�C����n-t#�E�R�T�^��,o��z�\^�������\(��O�/�>z}||��=<<�k��Ty���w_%�[~���A�DJ͍g��XE����83/�R�|y!������&pKIK�\ݸ��;���-W�5B�{�S(J��0���Uɱ&�H�
�%�W$��/F�y�܃vg2����2:8k�j�j�yK���Ӳ�2(��g���]㐎��F0�;��!<���i“�6u�%N_�+v]^�(��?��Q��O�ֻ��SMӋ1,QI�m�)55/�k
���$<�r��^�MHES����k�<xq��C��E�ѯP��DO�x������s=��j���5�pS��#"��x[�52z�<;T�F���ߍp�kO�}����`�V��m��\w6�:��.�T�ޗ���A�]�/8�<�@�.搨�s��F�v��n�!6��@Rr�A$ւ�j�b���L�q<�C�$fL�7��y[㏹���i�u��z���]�⸳Q&c�*F>An@���$H�:�Q��h0�T�z�6��N~�V�d���J%+

^}hhG�C|y|��<i��9:3}/D6���w�j���W�ݿ�x�ؗ�0
�.&V���ޅ�aVTUl*�c%��ImК]�T)Q���iȇ��2p�@Ǽ_�����.`J�;IK����\��u�Y��j���m�`�y�[���Ԍ������ ��N3�����3�8���7���c��F�#��I�ǁn���1y�H^�?{^�{�˒wo겏��yæ���g\%T8ڳ�1�w��x�碸a�kgvώ_쵚?��=z���`Q��X��;}<N���k݊��i�Y����u+��P$88m�y�/�j2��(fsy(�wש�7Ҵ��a��$h���}r���𫏹�c�g���e��Xi��韴A�o��Z���W�����	9̠_Y�;y�}�RB�x�`㌪\H�A�G82X�>�G����%�i��؉l$��"�%�'�x���v'�sMn6
�)�lO�ۗqK��-Է����1���/xV��	��:�o�J��sKǾ�P&,���q��INe�����C�3�{g�W��a&�Q�/>UB�KJJ���K@��J>o��~ �r]�^C�[{ih�X�V�-�16���8��,X�ū*�'�B����/�l/�pI���P%p�F�53j*���Bx��v���GU1��9����#?B�m��Y��ew�i����!�w��ⶅ����?�R�b�"G[��X}���ǔX^s)Dx,E�YM`q�1�����'k*���]J0��j|�ߢc!ߜ_l4Ҵ�,�
� ��fY�=���dE$�[kr�� ����q:����V�,:g��4����Zj��%����~o?rٚ�k����=�Ӱ��/h�
1�!��4���|���	�Q�s����+��0E�-��qA�0���W�]V86��@R��y�ϊ%”��=��޳n=Ţ����**�2�pV�N�L>��+����IY}J���iwkeٲ�+ˑ�U�/;w��jIy<!�(�%�w����>�4]��:�I� �Du"y�dn��.u郓�c��	?�:r�5L)�;Y{�B�t򰊾\����k���n�R*�o�o_t=�R����^��)hmUE5��W�[���p|�N����|-�5�5�S�w� �C���,o$
��J�q+ϣrC��%?�p:7�N�*�9S|��ud���(��.l�<C�k��7` Ȇ�_�0�F��{��Q�y����Ͱ�L�j'��CǾx���w��l���B�
��L��ƹ��P���ZmS�⑦��mm���r1�ߚ�/��~i��q?��4�����٠=� E�?�5o�i�����a�;��/�:��^�H{��ԡ�l>N���g?5��k�##A3�E�@y}�|~�3�,g�L�|���Eﳎ7n�e��X|�.���A��fő\ؼ�=zq���n��z��n[�[��Պ���1�¦�D��;�$>���!�j��?�0�SIH[k��>ۮ=���Q�
�Q��
�,vIX����Z]1����$�e3,�_l�*w �A%U:���b2K;�աq�a��b5�s��`:4��@�%��"����~��a�p��찉!2��`*я��ĺ���S�~���Q�s�#;�E����U/������N��� �s�lQ(�x,7��1ʪ
F�����Wn�ޯZ�M�'�Y�7*]=���襴��B� ��q �{(q�m�1��ͣӃ�_P�oJ���k힞6O�$,1L�$�o�9`
@H#�����?������}T�i�o�
)=���P�����ɵR	:m��;��_���tnYwY��e_+���ºsq�ܵ�����ӗqngri`���d��yE
iU�(6^{o-L��&���$i��zxOn�R���l6k9��
�D�S���q��e;��XŸb�2�Yx�ނ��h�E�e�Tt�M�b��?���:�siEN��Qi�2
�W4ڱ�?����7�-��ǑnT
�20�j�Rݴb����7����,M>aG���I�H:�5c�`��!_L
:�|�F����m�5��j�P�YwMJ�^����Y���AT.��O.+:�Y 7κ���P��\�#��˚�6��f�P��|.`gaP;;���o �KH��Sl��T\�e�T!���%TĽ"����N{J/'Sy�sqM�u��#"�S�֢�]5kǂJ�beg(���B0��yP�]8�t��	���4P�)+�/�檭͈ƣ鴇$k�=�@k�3.R�ڬpD����l�ٰY��Җ
w���4Ѯx����D��خ.(��d_ϔ�.��7�nk�iy�E��֋�]��V�(5��'�ݜ�k�.PU�L�6��,>*�����]����-�"�/�Ӷ�F��(�SW4���U�R��!�mo�i�4��J'7�7oPL¬���0�$�2i�~7A8f�B�q������{�.K�܁���f���/�ps�%��Zm�L�uX�hSk�
֚�mh��F'X+�4�5�[��j��͓��=
ȣB	�gԨ�N��j4�a�c�W���t޻,�w��:Z�sE�%���U~wE&m�%X�.��ҙ���P\��N�t��*���=״)�e�Gg"�D�l���{�Ώ�_���
��]6[����V�ضP�����`�v�H�,D�`���C���SB/C5��jbWCUi�4�d{�M���|=
0�:�扃ϗ�5��X�YD���@���uanmQ,v:�8��IG���3˖2�Om*�K7+ϲ��Y���Z*P��0Dy�(���pP��18��u�:�&s1C����c������B8	�#WV�I�s��e,���}6i+a�Œ���V]��[�a)c�$~��yI��}�����g�cERͩ�J6P��#o#	v����K�|�?S���J��7�,��HVK~]�S*��k�!��y$^�j6w�pҖ���6}��c=�OL��>��r}���a�S.z���D�4�
{��~�Ў�=���ɗG�F���s�5�jZ�}9��o<A��	�F��ۅ��dg�d�V�P�(��w)X[9�+�@�Z�T6�[~%]���&t���V8�m����JU��{�
�UݔKb�*�_���K�S��P�ћW�<M��Z�1
�{̃{J�##O��̂�Ӂ�
�U�Qۛ��6��5!W#
t\bCHt�EpYD]A���z؍�Ǩ��C��8(Ȕ
�DmƔ�b䆆BI9��Lrb�u�$�O ;�CG��!
k��{@r�M	n5���z,B*m�.����A�S�Ie�
��s����4b�����釡�[((lP�����u�:�@g�7�N-�ƷT�^P�k�=�D���4����E���g|��%��9=�IIC��2M�I��Ho%I�Q����M��k��+�K_�Ͼ��ڡ�v
'e�e
Gb(,��G���7E:��s`%������2��	�Jy��#��	���Df�D�#���|�횰T6I�����y0��.�Y�L�;�H�яX�
>�=5c�nGG���"�3��"9J
0�<�X�P�Qn6(@���%��X���)��X']��7
u�wpt#Ev��4����m�����7G���/$N<?P�J�#nC�(�;��5���;���c�gt�9椢����*�t�eUZf�{U��JB�>;i���ɜ�j��@!�����������BRy$^ȩ�q����Iɤ��7ʔ�l�V��;�ȌjC�	S���#���e'*�*�����^�jm�1�ڷ�&3+Q�(��!��y�Z�*�6����q�2����ˇ��@P�c8��'�C�d��b�}�[����`NfA�pv";O��`�̐s력�(�1E��*�6�+�2^�$����4\egV�ߤ�OI�����hJ�ęo�B�;#u�;�);9H[#�c�@1p6�ʘI���h�7�p=N��^ �J��.�l�����i$&_i,C������܂Gz]��?.ge�i�+�@E�QCl=���dZ+j&��-!����
�:y��)����F���왫R8S�_�G���tpy�1K�1�q�n���l�d@�)SO��*��Ψ{��S(e���FY�XvVﴈ�[����M-��b�eL���"9��`X\��e�E��$�&]�� ^�r�=��V���k�j5ʯW6
U���Iq:t�e�KG��:1Ő)Ԇ����4,�����R�ԕ��
��V[�u֫��zE��w�����岊�q?>i�ޓt���,�ζ�ɟs�
�W�S�W/�
�(\7�F�����~k�हw��q���B��a�g}�<�:~��=M�U�%)'h��r|g�^��
���P����G�>u��b���e[L����/������>�ꐶ5/[4��TbI�,
FĔ�RQ�Iǐ�Dy�lLK۽~V�Փ���sl��h��vju�sn��~ih�;��|�כ̷Լ���_M��)�'����Ec����0e��xZjp�f��#��=�vIۈ:�]ÿn�&jB���W5�zk��v[,a����(E�����'�9L���Dils0s�!�������Պ2�.ŻqS��������1�bP��̿��w�����pr�H7�vd��!�e�P&A�+_�
�h�Y�w�&�ݜO�YPE)��qOcR-@��4���s�F�\���f��|ۑq6�8����ɹ��W��g]���Jx�@�+q݊�&�{���|������\g]��0��'�h��R�\_��"�{1�7�x���v.��pn"z�烙�p�>��䆇�y���{՗v92�!H��]�aS	� V���;%��3����c���Zr楩tP
�#���%�����OrQ�fI��y.���/��l��R�w�RI��jF��(6�m�72]�3#�U阠�hN
�g���5��,���D�5k7P�_	x�<��V��`��03��9��r�E�R*F��%������>N	]�$��VAjҎ���U����5T03`�j�@fK������m�F#eI�se��J��ٱ��kw���e�w��kdžʓrfc��V���Y�����{��v�v��RR��sm��Ng��D�o2��;�Uó��!(���ծ8W��,m+�TN�rա��Q�ZLISd��,��zmٲ���]���7���?��;�A}w�%��<���?���+�󝀠�����~\�Άu��qm�8Œ�M1�y�o�C	�Ѫ�7�F��W�A�����h�!/��������C��@q�:���V��\�%�f�P�G���v�F�\n_��[���L�e-���;����j��g���>��'���η�2-��$
�h_Y�T5t������R�_�|�]g�
CMa�vqgƭ�vt�-�N��Y�edwew2cY�ƍ��a�c��Ċ�WWr����j�s��y�a�9�h�~|)�*�VNV��Y�����+j^T���ü\.�W�:s_9ͤ��K�O�k��N�
��+�u.qː֝г&{
z�1��/T) ���o��b�q<g���ƶ!��h�d"l�r�z�h�F�!ԛ�X��8�
�‚��6�i�Q
���\��4�B��Ul�Y�\�0
z^�Ҟ�2E�cS�L.k(g��S�3��<Q�fֵ Hv�U-�-����l��p�����v,:���ʅ�ש�ME�^\϶ѐ��%Z��0À��Ԟ�$2X4�!�a�zT�Ln�W�6��W�b��q0/Z��G~�6� N$�tۤH۫J�M��3D�=�6�uتU�_�y�tI[Cys�Vq��
�
7��uhõ�+Ճݜ [�/�8O̓{gi�����8Q1Z�7��IE.aB�2֐��i�"w��z�Z��1��b̦�m�z�DOB�#��\����}]Q�w�A^;�u��rc�IGj �Ұ�0�|������ͳ�j���1�;��i�'Ymh*R6rb�p!�!)k?�PF~9y���>���T�_�̶h��%���,
N���m,�4�i�9D���{u�	]�����&+'M�<k1�k"<�U3�Y�?I�h�N�_������Q���Yth��J��#WX7���n܏g��t��':�_�����om���;7��i��swUB�
Z��7<Ḇ*�bg�G�g��>��-�1��G��Ց(B&";���e!r�2��� 4爡=04.���@�R��w�
�//��Ӟ)%=#
n&SD�M�2e��2���;�͙{#[
��3/Kf
%�=ԯ����y��:!e
L�h,��Hr����P,��B�7M���ͣ3��Úe_�Z��w�8���q6`[��G��J��q�y������lO7���0�U�[�w��V�,�g��e��%����1,ڥVV��� �����?1�O�}U%Ӊ�V�\"	�n��3'��X
���A�-
�ݑr
����Q�22���+C��K�����=��wr#ky6�rs���庹^��Ϲtǥ��й~{:���A@��[���"�f
\.�	�_��B�R�)���cH��S=�ۛ�eV_�E�q`>���E�K�8�ݦ�9뭸�t�3�zC��=�)�+�I�vJQ��q�|z��17\�xuY�).��W�!�j��1.oRͤE�k��W"�K4�]���y����kԞ������k��'�����_>����ӰQ��:���* ��Z/l�q-k��ad��`��tƴ���/��'���ʊ���)j^�T�3ܒ��kժ��2t�uǑj-L�6���\%�-��B�=�e���iֆ֞\f9
C`w��dJ�4�c�,���6�W���ж	�1�{#��j�\;RyBF\����,�
��+%�^J�ri��Ɋ`�1+�WU8�
@��L��������ެ�6]�촧�o�es����J�$#���]�׍�5R�bs��D]�#V��tn�y�<k>��O
z|�GgGo�J==;~����`�2칫��"�_���p
�!Z��
��.l	�L��'j��+��aٟ[dey�m�sח��.1�H��ck��?�丒bOH��oiE�y�&{�����)ۚ�]ظKF�)�m�0�8d������%7���,B�\�g$(i���,����E������b���1�"�%,��_Sѯ�E�>s$�_-+�t-�0�D�MX�k�$���I�}Y*��*RM�+�bN+O��|WN�i2�W�h4%Ɯꁉ�q����?�4��4���0�un�"��)�{�ކ�-l�n�
+�ҏ���Mb���菖r�[��l�U�h��ͺ6��6�Գ�6V+�����$~Z:ףzJꗧ���R���ћX�	�E`��c�1R�*T@�TP_Q.����2(Ç���&_�= �V�آ��0'#cl��(���E*]F��N��i�i��"?�?M���آEr�SXo��N�z��t�u���s��:�C̿��z&�匹r�e�|Y�:��^�ONOR��o%��n��\E�`��٣<�ӬxZ)�fx:�,��`{BS����_1��ֽx
���$q�_��m`)3?w�;؝�ó1Lb�;ϑ��,n^HW{��3��}�C�'~��,��߮`�uO�?��5�`��p;;p�b	�B�$���J
d�je��Ȃ�u&�[E�ќ1 %WpzB�tX_N���!iC����6$�l!���@}�d!�v��W;}G��ou�ΧU�1�kV���"m�s�LZpZ�`���6��ڦ���NK�� �x�]jRol�.���m|P�n��I�{��r�(�����_���ڿ���K��[�؞�n��[?���$�u���r\*�ʵ���fٍz�^�Xt�����n}��b3��Slr޺��ɇ�et���\G��j�XN�[�9�⊭��r��,���67�Ά��t�T��c�+�҅���0Uc��{՞D��oq��!Ŝ��Ġ.h���5��q��y�@����уG
˨��
Pv�myʈ$��/v<��ѣ�#��ܮҼ�?���/{�zv�7�ht���և����twz�u
0�g�JV�_98�|�*I�*�V���\-鵡�Pl�x`���V&�xOz��
S�}S��Ս1�%�@m`r�w^G��v��,���?�0S2�B��Z.��*�I�{#���py	JX���e3�,�1ďnp$���
$�7u���t�{�;҇�7��e�Hڬ1���Ũ+�ڞ	� ���s� TpW�M{ ���G�H'{����H�@�g�3-e�:?z�A�����d�RX�y �ߛ�2*�eb�
�<�5�?U3z��鉠���ͦ,�]l<�S��M�<28co�k;w��9лe���پh�J�G��[�n90��@v���:������qA!�m�VN�<���j���֛��&L#�%�|�ή.'��q�_�1�Dcni�g��ά%�S�?j����hi�r���
Ȁ����E/�6�8�.(=�[Ӹ��X$�I���q���FCl×M�D,_�A<wc_3�v��`� U~���4���O�Z�����^�M*�d�G�0OA�Ň���N��S?:6�/#:z�4֚]�v-#Z���%���U����O��0�>���`�tb��;_:P��I`��
����%��9��t�;�'d�@>ap�����
J[P�
l�=�UVY
�c�V��2�K�N~��W�2���U"�GI0`���tEB�k٬V����J���f�~�UZ�����no!��?D����j���C$��\�kS�x�S�a'�/��K�B����5/v�@�P�&
"_����g�S)U�K���5]C~�V)m�jk��v�~��{��y�Jݪ�2|66��>�ߍ���U��<�V��j����_�Ҙ��5�h��r���|x�^G�OXz �\�.�|K�!�<��,N�DT-W��r�X�`�qy�q�^*�O�/W�eYāz�r����k����f>��zU��b���i���J�=�f��E�PJ���p�`-�����U<�xz|x��t�у��>�ԋ_M���y�7�:�!��^;�u���w�4��b�����at<���oN�hB܏Q�^BH�uޞ�� ށߘlz
}��th��;�����5�y$&��B��i3�v�C]}_����0�o��ԷHW������!�=tD}p�9�o�Ϛ�������3h�h�U��>��YE ������b�)�Q�vz=M��3H�$��@��� CI��-l,[��J2�v��$�_��K,�Hb�,��59�Y���??�}
��/�#�za�F�:l�?m!��ߞ�>�.���?y�{��DZ����Sx��݃��'/�n�J�5h�Ѫ�?����`�
%
�y�{v�Ss�y��'�`�i�m��zuŚ=������GI����f����/wO���V���Q������Ho�K���d��㪹fe.�B�N0��dQK�)A�������v�ߢ������h���`��ri܏��_�3K��d�o#�V����O�h����ܸ^~��]ڮ��۵��M��+e�;�?�
ͻ���1�&���$�CA‹�=��K����H���-E�oQS��lq�A�VP��T:�/���Uk8�SV��+�I$���s��@�1F����\(p63���K��b%7V�=!R��Ө������	2�W�)�^t��S��M2k�������}M��c��2���53N�M	�5�|�LȲ ж�'l���)�w�]SBݺ�v�^��[f�Ѩ�6� b��V��$K�O^�W���Ǖ
XQ[���67�(T����ZTY\��^�e��j�غ��������d�~���W�����z8�
b���ǻ̅v�a�o��I}2PItOѪ��`	]OW1r�oX�7Q�n�.v�YjS���o�rz}�Y{� ��������3�>��n~�]�y{P�~l>�|�ɮF��oJ��X����??���y�5���P�>�����ęJ�T��kW��j��50��ߢ���~�G?|�\��֘���q�FS[G�o;�t�d�e��k^��R[��%v�;����z�û@��^�9����t�����D��:�8��B3���@HG?F�u�|�{�{v|��G�G��f�)���C�4�
o�+v�d��JnҫF�	��W�H�@��y����f��-u�F��} n���&�nh�P�)D%�����ޮ�{���]���k���^$���,0�G���x:Uʓ�+�VSO�<B,?r����M���JD��g���=�'��ii�����ߢϼ2��[���߳��o�/u���>�����b�b�¢�ukc�[Ϙȹ67�����=�W6����k��|����������,�T�0���^��G��7�$�:�
�66�
���fiL@p�����V�/��+n=Z}���k7>���7�Q�[4��ѣ��۷��Vʽ���ec���Qn-Z�/Q�|y��~�~������?G��ړ!�Z�}۞��w�HQF�/��љ.?�g7�� j����j$݂oܤ�OjK5���a4�]��*��_�P�9�x`����3��A�Է|�_���)�0���I��4��\R��{d�@�j�\����zy�쮸�{��q��V7��c��E}���8�L��e"�=���8z�%�w�����a*�jV��5�N���|��`�@d6#��MIqnL͎;N�=�}��D�>jY�:�]_\���E�m>���>�%<ߩ���m��Q�&��Z�?�?��sgG�L����]���om����v�{��;[SZI�7��c�#�Cv���K2�����Y�1��3?��3{C9�H��/[G{�o�ܕ���F���ݽ��� е�;d�v�e��d�G{�G/��P�Ukc�ةh��������x2tүg�>��hâ��GU�}'�t���o˿�:���F}vl�;.+����'�rL�< 2�z�ӛM�MpV��wLz�d�!�����$/u0D	�ߋ���HiF2��HM�����_q:K��,�|qz�
��1�M.P��Mr�n
c���7�L��y�!��|���6����v�T�+�畲��*�
����*�"47ʐq��폱�|x���}�Ƕb�g�{?>?�}�l��d��}�2H���p1i�֧�M|���.p�oG�xx>���-����l��t�]��q���2����h4��R!���˘Bܴ ���ѷ����H��� �R�*�F�iw����/��7G��x4��q�dО]����I���t֥Dy;����;������Lwt�/l�_�8S���^��&E��GtT���'_ḏ�����kh��f�	�z!�
c��W'��n�	$��es�5^^�8j�(QK�l	(��6 xO֯(���>eɽw>A3W4z�WW���/���ͳ'�o^���"��HcH]��o��N3�Q7���ǗѧvoV�ǽ.6��j���c�3��:Z-��s��Yt�Fp �B�Y��}�4�?�ߋ�6�M�`'^E��]!-W���z�}g����t�1�3𫏖�tVi]t��1NH�����>�m�s9�.��5�:�!�F��wt�m��#��}�?W�]�4v��tu=�>
qSk�g�ܣ.��.n�����C�;�x���^�kѸ7����i�sk�-�/D(��$�h�UH0�U�����lD��������\���ɼ�6��
�(|��tY���s+[�n��Zw;�x���`0�_T�Tu�0�T"y��1\�%���%D<��ЪZn���i=~ �T�PؘeOn=&����^��d�R��`��G�M���q�8NUx�T��w��#�z��̼��ڮ7ϫ[�v�ñe}}۝G)��%?غ�����[��.�#���#���~�y_pJR�O8_�͢y�l��`���~跧���)����lm�ל��X�)�_�a������x2S��6�&�X����dv@,A;���d��e���)mF�ϫ[�!���f�r��X�`肬��6��?a��)�8�Y�x�v���go`/:8ӯJfm<��)6H{��݃#ܡt���,biO��#Ë�ӳ��G�]:�L�
?�'h��}�7b,.�)hXH����䣊]	_��&�VC˄るz��a�cuzm�#�%�)S%r�v}8��o���n|��=��N+�2|R�7_��n'z�GHHj&�����ؐ*���+�a�Q�zƄ
y�ꏆ��4�������gQN�s�����z�wJ��f�����.r*�K����ɍ����W�����jN�N2��W-�s�>�8%�	�N~r*��:i����O�2]C��'�1�R��d�VR/wj�N9m����e��"�F�XmS�y'��xpT�ⅸNi��R[-�'���'�Zܷ^PW^���z�|E�d6X�εd{��S�Ċ�G�XT�g��[$��$��uJe�����}��D�M/N�1ƽ#	���n|	\����p�)�n�Α߮0b��	�"AE;�w����RrO[�ޠ7k�)���֠7lM���t^Iz=%َ�.�@h�D8R������E7����m8dN[3z��'��p�Z�,�������{�ÃWgbpLG�W@����g�������D6V��kl�TU;�2M�UAR�o��L��=�r(ξ�yzD�404D�'z���V(��~��C  	Ώ����O8�cn�%>�3|��|\�
?��C�^���*�B� �ޕ���{*�nJD�DH^i���I�1
��SOy�	a�+F$��'��
�9�j����AZ.�J�ʹ�D���Ö�����[��]��<�	lO-��p���i
�4��d���d����	Ȍ�|�<�������ܵZ�P��^)�*Ua�k���=�k5��;S��)����+����LJ-.����^�&E�A/9l�~�{rUR6g�e��}=��jؼ� �n��et
�WCO�[Hf����5�(���Cd��z��&��J��.Q�Y�W4�T��n�y+�E)�����1�v�}�ΩTP�t�m��%�"c
(��߬�$x��r�%"!�Z����6����c>�����%��
�M$�(3�F*1�ѓ��Fg�rN�u��&1�
�P�a:�?�D?��Xm�ŕT���$~�f[�+�&HН)�_6�����$Y�}����w�����HW�����[�:a�t�Ѓ�pි�'�HpaY�l)k[�O>*�ͻ;�`�n�?��?i�u29��ry<��g�A���3�C�r�C#I�����&���l����+F�G�ĵ�
(%��bJ.\��ns�siِ�<څV��Ь��nǁ�|�IJ�B��ZU��+�� ��A���[H���u��&J.F��[_YQU��bJ�ͳ��N����-���3�	Zx+v�R��^���DIN���O�D�X1�D1�a`�G �%;����j�7�`��Kಉ���ra�4��v
\��]��[%�*��C���2����&�@W{�D؇]	�J�l�&��'<�b.�`�*��M���%��J,�__@yO������>��-\*	Em
i�U>ɣ���b�0�G���.�bm�쫔�Q�4iC|�ϝ.�p#�vf3�ӃG���ļߞ�|����9����?��|����,�ѫ[[.��%^}im�q����a)FDK��e[��_��f
+�z��eWX�<IցZ�rE�7:y�H��붶^b���8�4��I/`�1yag���6��XX�*�&`�Gg?);�<QԬM[
�׀����F�::n�j�/j��_2a���Lj�b�r�r#�
�r�_��<$&��siDidc}���Xɮm)g'p�(���#��ܴ+���Q��P������ړ�g;�
��o�-�z�[����E�G4z��;Xg��C7h�Z%��?)#�cC�9��	�|�AB�ڳ������C�-�U=���u|�sk��ʩ	�����(:XI/EE̸Օ��Ǥ��9k�E��8�Y���+¯
?��[q�;4�B����ĥ9HC�_�xH�-0�V��|wvF�}���R�Rݚ[�Z�
o�疭�e+R6TM�������M��O�^����AQ�V�g3���ʖ�٬�ѹ>�Xok�D=��qE]7���]�H���9��<�je��^�e���K9XǪt�Û���p�-r�F*A�)2�B���~S�!��)*�A�j�5�~��
��p�|D�U~v�]&d�����͗-f�k��i�������Tw�_�T!�2t�VFgs[	�Y[��/qh�I�?�
�D�Y/�g-[(��@�;cU����_2�dm�hp�i�l@v�@%�|z��
���`Y���z�SMhr&iG�͟	�zMc޴��
�8~���y�OA(0O �/�558�B��^���{l Vp������NN��v����m���D '���ݓ����PZ�g�/��5t轵�%�����yr�r��n3I�4��"m�Y<�n�sY�SB�Bt
��-�@iz-Q���D�;��2�P3OE��C�����-��eF4a_�4�d���Y��.:�}��>g�����B�Y9�>WT�;_Q�\��β������3ū:�0	4$Ɣ^�G{'M��M03�a��l�jR&�����u�α4�����'�2�(�@ гP6��t�`5��4LMk9�����O�l{�^��g�j�R����p_�)*����.�E��ß�)��k*8�Y<�]�0��Z�V�Xm�����vY>����rӮ��O!��l7��Y��y���f-�K��bR����:��Κ�s�S�CT\sl�4�f)���>
��Pށ�yI�o��`1��:���K<��:�f)������Pݳ�}�nъ֙�S3z�d�ly'�r&40�
Y��IQ�8d�@K��b�q��0�^@���ޠ�<o|n����2���Ng���T�W}��E}#��1�����ɜ�c�6y��;vfQo�^��Vm�Զ�i����S+�\���j�~�(]��n	9�XQS�����xZ�M҇1�5X�V�_=~��y��f��W~\Ww��.��`
�HW�3��:��Ġ��B��@�6��~u]ϫVD9�O>*	�6�U-�H���"�0�HKfp�%��ak���͋�eӊ��8����q��3t	�!�p��ETն9l{��:C1	D
�����$]�4萏�Z�Z
I~sנ���=�^o��x�k�?}�y�S�#�"I؈K��~`	���	��¢�Auov�rL�������v{Q'�WɁ2r���;E���~V���?�\!��SX�h4J��Y���W���B4�u�쪖���U䉌M��ғ!X|(�C�E_*�P�yQ��̒����wD��
�j��U!�.E��<�e���i!�G�wJ
�R��&�1����.' -!9��:l�5O���d�P`��M�P
�5Ce�$��p��5�2�"I�x�$��C}j?U��s��Vg����F���qZ�|�46m��9��t�h�=yίҼ��gD�@O��U��[G�`
�bd���}OX�3�I��S�����Q�?�.�z�p�?@J>�<j�����Y�0R��v�h~�Ƞ�<5�U�V����[(�]�Z��e��]���}s�O�¾�I��"���� _�V7�|�ے��7+ս�f�;�h��M�=��^���'�r�R�7�-�`�� dI8���bNY|N�|dAI�s�Ќ�HA��F��1��ۧ�Tp|���M~�Z�t3�r�H�k{y=�'�u�[
���!B�s�*��l�±��SM���2bJ^���F��E�� �;3���]�L=i�GQ�=�+�a��$�~X���B�~�%�p�1�E���q�i{J/�c9���t�~�9{qE}���Z6�+^�h�V��+���u#�����]Se�^��8��6�V�te�m%h����9�f;�qXy�
�&]I*ewevp�d�d���*�<���ŚEwk��`dG�M��SS���-���8�V�F����J6V^�D��2���$li�ݣ_2#�	ׂ�Ⱦ��j�����K��Y�Ӈ�O�fU���n�J�5	
�:b}�PْQ8�l���7G�?6���miJt�A�'��ڱ,����iG$L�I�� ��X����W���̙�XӋT�d: 7��v�a8r޳@X;b�@*\#ZD��Y53�ʙN�y��P�x!�M�zmC���C[X��;�O5����\��Xg�y���Ur^Cm��X�2�Sa�l�dر�:�x�7]��zٻF�ə~c��@8��B&�$�K��6<�,Yw��J��;Wsׁ�w'�Т$u����q�����Y�R�ӍM��VbH�����D�țDk6"�]��㫲��{c��$ܺS(���k����!t�����'"�h8���h�i�wO��P@���j�q�vYc�YˉSaha�}��x������z
�6:��zBń��<��,�L9�y�u"���,Ov���bƲ�i}eq}R�N0�w1p&.RhQ}=��C�e+G�F
&*���+O�����C�����i*`���0�t'��	ƒ�����CQ���?����^�f��Nl��˲a�F��j^��(�E*�0���O/�0��*,�L�S�����8��vX^����䛘�����j�L)-�9Y�ƪ�^��:� �֕i��k��a�7��{�2���egk�=�O-��~�ep��j*��ͪ<WF��x�q�<����c���#���/�;��VѺ
b_�(l�54��*��X��dz�Q��R��YU����g�e��VZ�8[�3�@�������2�٨V��UV�[ٶ�1�r[��cp��C^��+�ȱ�����Ŗe�����
i��3�pgy���a�j�ۈ�+dm����I��*E���m�hIp�D] @oZ�[B�A����eЙ���%�k�q�FS�\�p	�81�Mlp9�&!;�H���@aF��ߧ�:�X'
�,N����x���>�����T�M��bV���{�>�p
>l���.��>%�&���YVZ~�����]u�֊��o�._�G��JmCtN[��}�r���nK��� �q*AVs׭>n\�f#��
YADN?�ƌ>�����`��'c�����	�nL4�+������Ht"†敭
�7�u�᷐�ń��p����x��a�1�W�D`��P�֫�ٳCRّCX���*�͟�(7��
\�O	hR�	3X	vnؿ�����:}���#�'����߭V`w�V�Fm�'7��]���*|�S�rG)2�;��9YK� (۟{y��[xп�9.�����8���l�Zo��K��R������9��yY�:,���QW�n�}ѧ헒����v�#�-�����!*���Ruh�FB��/�o3sL��C�ÉY�_�50휋�G�}
}�2�����2T?V����y
�Q@�|zp��yv|��<2S�Z*j�0����r>`\�8W��3�����R�-"K>�-�i���d�J��?�泵�D�U?5[Go^5�cr����܍�'pt{)k9�vP&�]��:*>�"�T�D^(dy��ԩO*���c�+Y'�
���I,9��ه����r�W��\6� L�eojh���ѷ��FWI�X�X�O�-?��n�K1�(D�z�Y�)�0^u�re�R��R݅���U�}l��V� c�xῚ��8�Hw4�q�����]#D�zjve�.~�a��~�����2$�eu��d�ꗞ3ry�c�s�Q��i��LbX�E�=eL�wG�+!��Yo�*���P����*�Z7�CN��~#^�|�eܿ�'��r��\CJ6c��՝��g^Q�S���v}~����d)�� 0�J���3q��m&�[�D=�D����=�'a��N?nOX��ch_v�k��3�[��%ߓ�^%(���0��:�v�;�5�I(?��j��كHk`NP��@R�ӡ�,dnIj���J�Thp�S3P��l��v���ܯ�ڟj�"�M�(0�R�#�9��:�T�T$$h�RNVx��I3�>f����(�സ{H�Ԓ�нWmK���Y��zv��D#F�+{ -ջI��>{spx���d�7�&�~�A��ھ
V�<+͡6���Z���Z�1nn���S|:�?�������#~w��M��9�V�/Xh�W�;�W!�:/�g��|۟P�9�V����vѵ�\���?� �$�RK��3�^睟JT�,{���,�-gZJ�G�~�@�d��i4��f�7�&�2�n�ڛ+�܀���
}�|�K^����3;�_�sj�Ѷ��#[�-�c'�-���
�\F�����=�6twCv�!q(鲽у�(�2�X_(=�q|<N!�r�����`oA�ß0g��QvQ&�U���R��!F���e�D�)+Wk�H�	��l�)9�;f-ZT�8�f�=���v�
]LFS�>Y͙a�=�ń���������k��+пl�a->�iC�Ɇ�O�dz�0�o�q��I[=�; �Uɯ`�;e�uV�c���ہ���V8:ͮ�~����g/O�����#ly�a($�O�Z�PK�m��yr��Y�kp��M�t��V�6�=��^D7�hC|ٙ��^wE��G�ꭁQ��
dlCI�s$\�{�2_z�[�۟9eE�UB�b{������c�QJ>�睍�J��:��a���W��-�B�{���˥��yO�����^նH�$�\_YaT+�XD�6����J_���}�y|;0�l���$�wmN����X��c�x�:���Uv8UڵfS+�q���Z���}���K���6�N���go�y^P,9�T�����O\>�k�7��1�6ya�%6��zi���'�`��]�e�V,���|�\6R�����ͫgg,bt��,��X�������W屐o�4��4r._�T�E�ߩ�^���̣s�l~e�FY�7��K���&�+c�je{�	��򆶩Z�J��/u;{��f�5EL=i���(/�����
>�sD��%5���i���)����<R����A��u���i�R�NX�"O~����ʎ-s�0�#7F�qε���:7�1�z�-����c�n~A�?^h<�Q��8��j����%p�È3����m��JH����!��G��J��m�F���D!�Es!tמ\�^�;���B��\�Q�k��뻋[Qyd����/��4aj�fx�Y��P�٦؈խZE,}�D�k8œC�L$���{�[$��JL��.V��v�'h�`:��<���z��^?����wu�Y�L��A��]RZ�|����JWy�I�=䗨Cޕ��y����YQ�[\-�����2�x�]�� �+�Hōi�����M��͆%�y�H���^uz�Q�Z�t�Џv�?'��.�śݓ��G�|T��?{}�������*Q�B*���3Ҿ力L��=ݼH]�~�6���9Yt�};^}�.���%yp&�g��kuӃ�����i�	��`4�������/���Q�W:�h� �O� &��6����Z�R�Ʋꤿ]�QX�Z};U��	��0���2���;P��*���7G{|�������Mb�ZC.d���̓�O�՟�������������jD�>`L�H�1�s�W���b�-+n�V���hp���~9dq0X�d�ȹ-���xg�����!��!ϛ�=sf�9;�D�6�k g�S>Q:!�l�W9Fqe�.ӵŭ��9q82t��8QڥD�-V�')K
!Z��=;~u�A��^��hf�v�\d]s�d��ƾ�!�C
�;�3��
������Hz��#��\ι�ӹ"P�G!k��u���1���q����^�х)�V�7S���3����'p,c�~3��bt�^�����Ⱦro��6q#kM�E.�)�F�Z-�M�K��>X�&��Q�Yz[�p���#�h��~�wK��h}��r��h�d�N%��N�@��rh	���R�Bub�Z=Ɲ�!�Q3P�}򹝗!/��͆���St�m\�@��Q�s=�G9ʿ!?�њ�
+�kg q����fO�L�sه3����|cĎ��8uyU6��`��E�{�{#�*�1��������؉i�V�}�Z�֎�nO��˥��ih���y2Lj�er/��_YaI����q��%!�J�ߠ,���3���o�\�(�T�]@y���c��K�z���e�V�m�'�F�n#NP���}	c������˹���	�M�o`�$����n)ߛ�i�s�ۼ�W�||_M��L�&�'��K�$b@���b@�[T"�=�w��Z��<\t��Z��۠#�yQ����b2-��o�%�̅���;]rh�@�pR8�ke�0�%K�	y�?Ot�.5�D��qW1v�CaO���9�g�w��TR	�̲u�PP�(�t'���۰��E����LT��6��^�:�/�����~��W��6�W�3#�/�T�Ny޺D�\�=&�9������~��M���'��e�Dw��h�w��H
�w`*����;�:�^m"�K/�ʧ+����Țze�<���_ٮ�HS���m�@��
���us�`�P�5�:8�v��^Ta�2�ӃG�>��J�n����io=?�}�u�8U��2'���%:���z8��HT��9���/>j��fm��U{z�hfУC�=��C���
L�C�@TQI< ��|:2��=}�u�{�<#�tc��*e�苐`����X�ੈ�K �᪽D3�M����1����{�|u�|?Qv���hՇ��J�m�Ul�+���§o=���r^Y��3���v��'\Ғy6������K��U49j���zA��r�j��9��Q^�.9p���4�_�+��z�L瞍�r�V�~5��Ȋ��q�a�`̓�wCm���?~=]��6)Mڟ��Fo_�PJ��{,�N�-O��0ڝL�_0W���^%@�h��ԋ0�i4�tc800��ۓ~/���l��3�v�%z2�=}�bџ�l�-ȓ5H+E�sX���`܏��D�ۯXK�<��je복����X#���r�\)o[�>vy��ߜ6)������F��(pv|�{(Eַ�LZ��g���;;���7�u�c�-��w�^����ʇYP?��8��Qq;�q{ha%�P��8:�
�h�������z�@��Ѱ;�jZ2��{ѧ�*~��r�v�9
���1�� 9�C@Ͼ̐.��-�NQ�E,|���TY~����X��zp��k�cR�łS5��HC8�%+$�Y�B�֜�6��I�.�9��J�(ӽhmkS�G�d�Ş*&l`�V� �G��`Խ�㩼����=`��f�_|�FC1��ؠ�j<D�E�����s*v^�wY0����X�� �N}��NJ��;%�	�$�^�g��1��Ͼ����lyk�/�:ѹ|��6�]�w����R�VݮlvjQ�\ި���E]�^>�7��<ɒ4��I�w����ե��OϭӀ��3m������‚z7���v϶��N�N�^���OMm�̄��Ogh��i�Ȭ��vA��.$Z�����?WuF���l�B4���f��`�e���ßJ�B,�P�u�8j�kh�P��`���~��:W}�P"��x{�pFv|�$�Hc�'���1:�f{o
����N�>��N9h(�e�6S�5~���|���v�(��$R�pǩ�]2��٪��C=�*y�M;jΡXht��6,���v,�'�� �&`�x��`!��@"a'�e���}�*��3��H��X���Ɋ�	��J�g�D9G� �����l>�<�a�ҁ����tӜWw���4Fݫ���N�����t�Hx���T6���2m_ĭ���ե����[F���{dh��e�).#��%Y�|����z�t�4�֎
��Z��������ӥV�VQ6�-{X�oi�"qT�wf��ݓ�Y� @�4;G"W4*U�m2��E�,��
���e`ݣ��Sk�ܛSD��m�Zd7����7���S8��F�
�Z��m���:��G7Y��B�zc�孞V��R��z�6�,�&�3���в	8/5d{=K�-����|s�`�#<��	��O7�NjO�TȘ�h7�߰�l_�'��J�	�!�Ҿ��&1Ԩ���ʖ�떢�v[�~�yF���"�%NN�و�\P����7��
I��� �6�Vbѳ��I�8=;~�ܮ2W�
�C �pz=Q���u![�8j)���HG����nP|���ic7�0�~�E[�8��C�e9�"ӎvl�+əd/C�-�c^�C�ƣ��/�P@�IJvff��$��P(
�:��1!�<DT�V�!��@/TV}z{H�WX�rU
���;����p:��|�>��1���k�b�a�/G)�����v��5����feigB�5�Ǥ53��P�޴F&�Q�J8�J��,��\~@fw�X�вF�1�ʊZ��
L��u59�p���f�o7؎��K�+uelX�v"^���2��7�K����K@�=�����8O!��_1)�����
M.��a����ዣ�#��j'�Gzsr��^�}uf�q	���ň�J�p
��W��=�I�~�5ʌz�D�9���񖣺�<.>�\�r��ʫ��;U�=|�<���p�7�54!ߨo�t߱�Щ9�Dn�G��0���Z����F��S [f8x	��e�D�ѐ ��r*Ҕ!D5�ȏw�$
�k�[�$<ʊ<���(fEb���^Ǯ*՜�㙁��}�h'c	�B�{cVY��\G��4�t󂋲6ig�]ަ���j���C H}��e�~3,�KF|N�|�ޯ�#y�,�)��k�s6�N�I����pIi��)
�<�M�k-���j҇C:(��TP�U^��ZMsEd�)�ܗ��X���C�@���l0&>a�A���c�,!�Io�t��8sZ���s��Z�h��^�☧~1�9�.9�)���S;�U��&}�)
ƫQ�^�G�vc��jw�W��쮒髰�ug�{v/���*�L����l8�q�=�|H�š��&��vs�>�V�':^p����DۛJd�p8,�Ε�ƥ�[B��V�����SC�}��3�L�3!����1:�/e�0k�E�Ͳ�p5����c��,e{�����(��`_	?�\.�"��7���v!v�UP�N�%O��L��.�E�>P%�ܣ��ba>�\K,?!|vZ�R`Z�	��hahZ
	�,Js�Lq��H;�1������,�{��D��
��6�7�3��W�nO����`���Ûxҫ[����ޞ�[Go_�N�ώO��]�.�C�%�I����9s��<Jg�R��l�n���<��p��$�i�
K����h�TӁ���Q�xۗm����(��!�Ԧ{H@�LD|{�?|�<��
����%�5՚M�4�3z�^�u<�"|h���_B���+/(
�
�=�������L��曫�|s��i�DZCG,�H7��m�����7�=�,���E��R&�~ᕲx�xҖ�
�;�:�;���p�(�+��h��ި{�3�g7�q6g@�6��L�p?���@~�.
b�A��hz�0}\2շ?jb__8��M�f`��"4�q'��QCp�JɑWW�"Gԛ���@��6�;+��o�=<72��q̄R������������rb
>]�>D=j�Ӝc� 
�.�9)YaT�)�=ՍX
6G�άo���
�~��p�Qw�|�:���+>�L��3��Z[����x��كaq�7����m�v|�3�X�Jz��ъ~��_����_�~�[����Y��_5�	��	�cr!]L}c�ٍ
d�3f��[�~���b��D{t�ʼn➽p�g�}PC ���|��g�dg�P��6
�kK�u)�4��J�.1�Ϯ�1S��"{%H���r��#��*
�b�(@ٯ�?
{���b���/�ƌg� �غC[�86��H�����b1M��9٢2/��Db�i����E)Wv1h�M�خxሷ†����{ڪ1��M�U A��E�;�����R	]�q�À�ːW�[| ��.��!��
g�2�Q��VY�����[�;�o���� �.J�X=� NOsFl����(��+���V��Ȕ�]#�|k{#�2Ѓ�r�Ssy,�+�7�Vt�8�L�<}�F��6�wC�&�}׷�y�l�
�u�,�k!F�D�#F"���������}x�F�t{��'��#F�/q��C	*w1��xx�Nu3u6�fm�ۡn��#�����9<j6�n?�����S.�[G?�����#�M�A囸oAE�t>l���]��&ɥ�d���Wp��a��K
�*`������k
;�%��ö�����E'����C��
�3�V˝������!�35^D���
�#H@��^M����3����:�4ݬ��`����h����\p�Z��p������q�S��(v��b��r*s�e���Yj����xZBmcF+<���f�Q������:��
l2.Փ.�_�]/Ex�M!�XPd��	��`��v�J\:��o�ga�t/�$vvWG�r}��6�������Y�4�H70B܏�vG��ُ����b�t"�����&�:V���`�jt8S��4$}��g#pv'p�����Q���g��3��ԁ&�Ө��I��t&��l�H�<�U���
;(��S�t�!{_��Uծ��p>��ͮ�d�z�����M���V?�wRl�cO�}l���K'���~�!��4&���yg�s�����#�U|��D-��X�^aL�TU�F��%Z���|}��v�
Ç8DD�jX}�M	9�"D���4�� �z��%P�����z?|�4R�vՔ��Qܙ&��r�@*�sي���~�M��l�D5��tz�@�s��oEO�G�Z��,����I206qѹ�C�Iu�pX�qNo���'l�=�MxJ�j.T�����'�Pm�q��H@vm4�`ط'��
vC�7zr���ճ��I���N��f�;��{��I��n��'YM�� |�Ix�ӽ�`��a�c�nR	LJ�ۍ�8�:B
���zE��؂��W���wv5�/�pv�<Q2�<
O.���B�wk�G�������0�&�j��,��i<x��D�O�'̒��hU�p�i܊�����cIJ2��D��5��F?�hG�2%n�y$qE��'2ݬ���꾫���"*)P%��!��Z:C|՝��r�ƴ0����'�sHU,Acx1��}<����[�[8���Β���,��[�HU�{/����D�%�v�y�D�"c��B��x�j�1l�}�b��Y�`4(~�vJa4\���x�M�`N�E�c�w�2��s��M�j�u��'�чi��:n�7�:����7k��D��ѫ��r޹�׼��J��^�K��W^�U�+*ZZ�7!f��R��b
��D}�`_IxρC6.�jt4Aѯ"���M<��y��+Rp�T	��w���
�lr�3��"�x�jT���S�!D�[��!{����Ʌ���5�ѰJ���)���j�����K���U�u��B�Z��i�ƚ��R�wO��{�2z���y���KtH��-���|���$
s��B��P��Ȳhw&6s%d9�(Ap
��H�(�j�$��6�!�k�{
A�	ן����ټ�O*�����E@籠(�K%MC{�2�&z����9o��z0�8\��`8E�>�9��&�I5r8�4�9��2����������a �`^ǎ���V�X�=�f5Xa�#w���"+�-�ř �l;p�Gu��\$9�Ns�b�;�٤=�$BO:sUG��̒Y?�U��9�����(��䍯@χ_�wX��u��!{���^�ˁN�#�����2��Ȟ�SFA���oA�p���{U<�e��.�HC�����7���'���S�+����^}[�w��;�p�;R�ؕ����J��T�'�u���{�{{�w/���z���y�]�h�%�ײ�[Ɲ��a��j?^�b`�Ey
ߟƼ/����7��~lbF;�X�`����Ut�~�1�6j���F�Z���.qb�kQx��s
dEa�H���q��/����Ȣ>
4e��Eš�?����t|��̓4$[�7U�o�\�6*�g�T�j׊E|�8+b$~}+pnu�0řz���S�� U-�m:�َQ0�`'��n����G�����T[�P'A�3�m-�ã筟!0�)�U�o����w��1n!�A�ᴪ6���8�k/4z�n}�*M�'�cV�gDž)¿�k[0�<W��.`���&'B�h�݆(4��F��ut�d�x����JT��n�&K�"�iQHeW�*��C�SA��U>�`�YX�m%w�'���Zpf�hlTMT�9��mD5	�fn^�[%���%�N�
a��	`mad�/8)Uo��"I���cl
���`�P�D*��ps���K�łp�E$��,��:e�\�3���S%m%++Q��`�P�z���4w�^<$��*ub���ܛ�	d��)nIك�_V�Dx�]�CuU��9�C�o�Z��V��윯����f���< b�Ȍ�aͱѠe���U,^�ၸGQ�G�Ym~���5`�6@�$�9^�ѽ��@<Ҩ��q��B}��LUk~��LF��l���-�F�S2ҕ߱U��A�Q���1���x��b�|Sa|�v�hll�碄m���0�.Y�q$	#ZC��^����gI����J8�~ǫcg�y���'��J6Z�7t1������*�aT���\	���4+;<m?��,�&o���b\>�2خ�1�(2ί��P"��w�������P���ٻ�6��Zur��-��uc�܀T�;�T��U@�t|8rP����A�ɶg�*86s�y��G>�ucwu�[���B�K%����!�n<�㙢8���lf
���Ѫ�+-X����Rv��f�������1m��:��������i�bac�S{�
W���Li:QН�C��F�RBW���Q+-�fG� ��.yo��a4��d�X���VW�J�'�rF�Ӥ�_�d䖥\�)���$��m���q]le�J�֝�4���ks�(�r�}$��Ϊ2w�@��b&[����?�Q��[-�2�p�^IT��jX�&�|�`���
�o�r���.��J\J�Iͱ�g����"#c��p�0���] 0;��Ύa��@b��Ny-E�s�C�O��1��O��c��DA ;�Ѥ}�Z�f�r�(c]�7Rl��X�3��Sf�f��9?u��튄��9�L�ŊCc@T�sc}K�P��->�rx���d�D��<ž�_��겖�Cc��xu�rd֏��)r�
F�k�r����<�%m�"�k��λ�.P�������&��RE�c�p��VU�"@�,�K[S
A���[�����omB8�R�&�2m"�u&f[��Ma���<����(��K�I����M�|���d�:m�Ϛ��Ь�e��X�bZ�.%^(�B�I�w��x��bJ�}UpX�IP�)�@�Q���ڮA�9�
̖�,؍{15��^�
����Tjlm��[)�Cw<��X�.�L�s}�X���n�0�m�H��]�V�/|^!q�[�zm6A�F���w2`(�RD���qI}�����MxUф�f�i�-�\E��K�6{PB�<pD=��r?���x��Ǔ��J���؀�o8"ۜ�:5�*��j`�F����;(�^
���R�mB1�鑨������-�꧲��P
b�
B�����-0k�8��!���ȢI��}Xp�����U�)\���z\���2Y�M�v׆�(���x�͔y����	ȸ`�a;`���I*E�����GS�ZH�04�"1I�@���H�Я�\^X�<�
+��#�K2�Wd˾�8�W �B=���&���tx4�g$M=a6B�V���*�h	��\����QcWS���tP�JuQC����{�ӨU�t����~'BMb��Y��EI�������d�����=�ao*�4ȧ��9�W��?��3&_ҹ�X�4Vf8��:��[�Ex3�u�n|�x�H��&x��:	܅8tJ5]�x��Υp;˪�׭ׯ�j�C�IS�����k
ޢ��
%�����_y:
�g��'�eL�U��a��\��A��<�eь�J����H�ۙY�E�R;=�wS?�g�Sp1G���j{ҹሳ�6֜HCv^px���3�� � 3��3��.�)�� ��>O�A��{�����r�!~)����}~��s=�����Θ
]�/���I���)�j��W��
N��y����S���mv��t7�`бιZH�`�;�|aQ�v�*��hh����Y�m�H�Gk'oP�}�����������u�>=>9k=wH�V�r����:l���l���f?f�M�T3z>��&��Xq����Ʉ'5-4���+�:T�g-g�b˙W���%e����V��^w�Wr�)�-.+,��ԥ&�L�
~�ˤ��Mi�	y���5�)s�W���J �jȠU�����Xޝz3b�EJ3"��H\z����F���	F�M	�6��{Y�Y.��\�����W��w�1��ƘZ�������HA�xPXpBNmx�A�'�t��pp�ZoSW�l�ˍ���;�وT�6���.u3px`�1��:����%�bO���7�g?�q���#z2T�oΐS�������L2@�‹v0�!i[W�NN�f�2�A�&�8�Lq�rÊ�8�����I��n��oq�M�v䚁m�\�W�"��E�_�)���F�"OQw�me�O�ըAv�6�3�=*�k�~ҍ�>3
�pve
��t��UzhxȪ5�|N��H)��Ɉ�T�0k\�2iV����A-o/˄�S�����b�(+�O*����޿�VS|�:N�0�.��>�	�ZZ�k�c>�&�Ά��F�kr����Lg1����*�~��=�$��C�9tk�?�1��ǏCG�Lۜ�����
�'�P{o�0
'd�*X��=h�#����E+�ȣ�d�<<:����b�.l�fuV)py�3B�t�[�a�96CT
n��L}�k��۳�l�U�(��U��	�7���A�,
d�B�~�륫�آЇ���b�����J,��ͯo�E�Ҟ�iO6�]07RVA�刭��vW}�I��Μ Z��*
	/%�
*2o(r�g-{W�l�H_i#�,"��M��L+T��kJS���K:�I����Q��	g۴3
'3a߁o�W}�rm�����.y�s9�@�ڮ+�
�ߜ�'��;��Q>�6Ͷ£���ؕavll�$��;�¶y.���#
�,�e�f���, y����k��8$=x�YYĸ\��|��8��	6���o&�O7_eHA��.����.mg�Z�}9]�7���'����J�'�q֤��,0e�^�\T�Ū;!����e�k̓'A�e���k�M��_b�7�O^đ,������;B�-�
2mN3~;��(e({G2↳ki���T=z��uf�j?dg��
{ڻӿs�����o�Ja�pw��4�\��o����n��~7�����D��<G��"�^a��A1]8�A�|��3�U��KѓB�Q�b��gW��Y/E9�SF����=��3}Xո�x$�cw�4�5�+� /&7�E�z`�#���e�j˯�V	���"D����o��k.-��X+�,Sb��g���W���d�Η;��>�oU�~l=o�ܧ�z�}�"'�Z5CtdI&k�4q<�n��������3�偎N��~�}p�J��V�}{ߛ�d��6&�Qp_(�Wq�q�3k�e���1h���@{(�6�4������vйL�c?t/�{�]�UR|�� �j�.���<�3I����85)Y�>�Xp']F��,ձw����$܇�׹D,7�7�ٝ
�d�f��-��5_������um1T����w���_��ǟ,��Ȣ�C�氡�����j`��z}{��8�\�\�F���%��ڂ��[,\�b*��|�p̆
'�e�ꅾ�6
qQ,�
s�m�p����ղB=�MS�)��@�an(�m�b��Jq�Xe�n�}�뚚�e��_^߻\��R��̂AC��h/��s�Y�+�5�8Z)|畱��5�'-�Uz<��a��n����[����_a_j��Vw6��j�1:Q?��׏��~���`�Jj�Z"�>�5���7�ǯ��^�TO�O�}|����x@�1:ؒ�'���iq<�<��C`_ۛ��:�g����d��->Z	�����z���P��h"�S�8��4q㉒ޠ*�T,��BA@��J%��Dބ#��ӝ��1ŵ��Z��G��[���T)h�E�n�8�)D�SҮ
HG�`#��;����[/p���Xm�a������ay�D�x�/�c�h�����1�t��1%#,I�M8���EvMƖ���� �f��nB�2l�Q/_)��%dN����W(�ף�O����
WZ깑~�Q���]��
S�#$��x���90z��;XG��'����p�+�g¾�pg|\���_Q��ם�I�=3�*�I`X�\ɿ��L,M��Ds@T�pf�Y�@�r��txJ!)=r� k�[��e>���+�q3��6��y����٥�p��b�' �<�q�|^��D>An�g��%����#����N���h����jP�v��*W��Շv�>��_=o�����پ�#	>s���;%�9<:�U*������2F9��Ԫ�]��]�fE
ͦ"?W������H�������`8YN���a���e�I0��?K����T�Vp�Y��z��6�����U�4��Mtj'�~r��w�w.?���z ��m4���cS5=��n�?�!8�O\��'�#}����iy���%�*��e��y�ƽ��gT$Tu���l��*a��E�0����><h�~>�q��e+/����
8՗J%!?s<N���+n�]/A�iB�|�:�Z���3o�5_M&���$�G�bqw��f#��.J�~B�!�K�O����A�5�\N�1�����x��Xq�+���A������w�����	�_�;y�s��B�x`㼮\N�A��#,p�Ɂ�Qꤾ��;�<{�D��_�Hz���4�^=����C�I�f!�4ŗ��y�2n���
�6u��L���*�x�1!�F���Υ����l�3yBՁE-�i���S�K���+�3�g�״��K��_y�)8W��ޣ8��W�g�RI��A�rSM�!�[�4��Z�╔�����8��,X��VU��
�J�_@����oPRT�����x��J��v!4R;���(QGU6��E��K����}r֨n�݂ͳ�]ArHu���(������N)F��8�����35�L	�
���\��"��7�8��6�8|��hM�x��{���7�X06�D#N�˂Աa�E�Y�*D���J�"�5=�V
�ы�L�q:ݧ��V�.:g��4���#�Z�$$�����G���ݾ��ѣ:;@��A�������#���HG�����Q�9�����u�"ܖ��8��Oh����+�[ *��E�ON�0Յ{O%��,[O�"��@3E_Fe�Jډ=��g0~�xQ;�O˵B�v_���-šY����_%��s׊����SB��_}g\���ÐOӵ;Ѫӛ�	r-At'��K��u�+��8O��#�خ-�s'����.�H��˕��~�����������Eϋ��EIK�?У��Ik:�9:^qlU'�����s^qbH<U�k��ͮ)jLq��L
ߴ!f�n�Pq�w�y�o�:?�?v�.�M���e������1Ƚ���1� �(:ƻj ��տ�����F�@�q��c3l*S
�������~W�<����sa+�����yj��q�&:6�[�_�4�����M�s1��=�\��|i��븟��?|���C�lЙ|�"Y̛iک3}�>De���u(�:�}���5����C=�|��^���b�k���<�c=��I����x��/x0����'�o\<+T�6N1ǐ]m1�C��a�_ؼ�?z��E�݄��9�����*g3�F_L}!�x$J'�l�S��Z���Bu&	k���'��K䈎J(T�v�PH��:E�l�k�3A�6�6�l�E�|��@�Х���R�Lf堼&5n<�u��xA ^5�.�0�e	�Ǫ	�a^�O�~��Q��t��W-H����S�~,R�"0�/[�O�c����3x���t����z���S;�u;�N�i�ïh��988b�
�P�t2��8�"^���_�mէ�Y/U����6D)mdd�0	:�~��x�\#,F�v�y�������j���OO['g��XM�`n�)a@@#��o��7ߐ��<��>�GOi�ߕ�
=h��P�����ɵ^:m=w
���?�s�-�-���[�(Y��*2Ʌ�sq�ܵ����?2ą�)f�ut�Rܺs�)gUYl���	L��&���$Y��yx�a�2\��o6���0""ζ��)��{��X��cN
��Pf�m{[��e�,2-C:���6�a����&uBwiM����A��,�^�hO���;��o([��#ݬ�5���zcK���1v�o�8�]�tŽ>ѧ}����iNJ�
��5�p�}�/OԷ�sH��S�5�����`^���|	
����$P�8��TjX�����]�8��4P����o�_q6�Oe���^^}��ߕ��)m*Ϡ��3]V�R�<$2�T*�n���='Sv⹘c<E��ý$�)SkQ^V-�\P�a��<f�L,se(�؅IC�<?�*���)�
��n�:ƌh<�N Y����ž
q�a�&�I]
��Pa�6�Ж2w���4�.G���\��^,�3J�F鱯gJe���@��b\^Vs��i�"�,�W8{j�v�F��n��g���L6�->��R�ϻ&##�;t�:]gm���
��N]ӈ�o:�W9�D��X����U�+��E����y�"B`f�jW��GF�}6�R�c�O t�.!2l�g���؉LMaa�
���
7WXa�:�5��Y���v9�F��`�\lK+�4:�Z�ɭq��
<�u��N��?r �G��nϪQ�O��j4�A�c�W���δz�\V�}:Z��
�%��I��
|wE&cѤJ�H]���3��!T��੝�=�pxt��/o�\�&7WHUl���%��w�{Q�ϭ_ҥ�N��B��dQ�'#M-�t��{njUjQ2[�A�>�5��5,B��z@�׎9��e�&t~IM�j�*!\'mύ)u/c���]W�i�ԁ�f4ǐ���<�EH��(r�!��Eb�s�̍;*ob�-��<�T��n❰�3�`_�T���Q���Q�q�NI�R��@#ֵ�ܚ,��#WG���3�H_)|�p G��ߧ��} -kI��IG��3���d[uo�FC(c�I�d�ޥ9���c?�֟A�q5��a(�@u�����$X��o	�v��[�`�;�Z�o�Y̨{�VK~]�3*��j/ �"��q=�{Ji�\L����q�G
��[��vH�T�^�mtu�k$�d0�N�K�7w&7U��
��m��֚ZմD�r�_��B#�&d5�sXꔣ�ӽ�ӽfM5�(G�@m���S]��e���I�J�le��6�c��͆���6�	b��7�����t[�-�$�������z��d4L�Go_��4������+> �hA�<az�K2N�_:a�v�F�l��;4���_�X4�q�!!��%5���|؋�cPI�`�$.L2Ň}ћ1��1|C�����M�qj�U�+~ܶ<A�E�]�G8��
��sl;���p��: F�����]�FI�3�ie�|�9*��0�X>��=�El�a��

	
��}�`��$��
xv�s�ᩅ��-�z.�J��2�H`x��EX���y��Ƴ	x�ǟf��	4g�9-ih���^fH?m�¡�$M:Z_�x�ɐ~��R\��\�rV���O��F���P���;L���'�A��*�Det
<�D^�j'������~M�4�;�7l��=�Y��t6)_s��,��B��k*�wDgz�+�kb����@)9���#�S3f�vL�O�n�!�:Sn�Q�l���Š ����
p���@�oT/��"�mLS�`�x�V�,�C2p���)�{G׌b�-�J�‹�G��/$N�8�o�H���a2w5��x�N��Q�WB}�<���X4p3����CY]����^�}Տ�o�N�G�gm�F���Z(Gx�����zuxzx|��B^�r&<g�<B��2^���[mJW��ձ�+Qd^��ؘ��a�����U 
����$Z[p����d�!���۞Ǫ���-�Ůxw��h�yU|��ɃR�J,M!!8���=��ҏ�a�A�r�S���o�Dv�����!��HQ*[c��I	�4ڼ�P�xn�:�C�p����Oi�$a�P�J0���̗a!Ϳ���j�=1F|�����X�hN�@Q
^bn�)���>������4�I����?/�����"���P#l,�9���E���˙Go��
8P��hԪR���.�ֺ^��tz+�-���y�@�d`F�4ut�"G�#{����W� q�
�6f)8?Ϋ[��=�"�(8e�uh��zጺ7�9��R��h�D�Uw`��\�r��Z��?�ba����"=�c�����e��$�&=�� ^�r�=ao����r��6��V�|��9�Re��G�/�ul��Sh3���48XX�_��e̩+�/�wdp�(oo(���(�7��v�
�`�zO�ʖ������zO�y�Ѳ�>�:&�Ɋ)�T�HY�_M�@�ˀ�pݰ>�����ϟ����Μ�A��Zՠ8����3��;ԯ�Y��z1=H>A�]��v�O���2
�������!�n�,�b:���^����O�:�m�{͚�e���Nf#`�A�ɨc��Cvi�����_0e������NqVmgV�:��7���CA�/�z�Ŗ�Jp��)�L=��u���h$���CS�o�g��j(;B�<gj����SJѵ��}l����F2o�;�^��%����eHq_��,}�_��]��ƒ��+�@zz��5eX�]�w;�&7!ه��=�#�yp��P��[���K>پU�[�/��)B�]�̞�!�e�P>E�+_�
{���λ�[4��<�(�:��B�e�6MG����E�ѷ�~4��`��x��Ză�&�8 9w4�
"8��K���bC�z��V�5�_����ewe����ѥ�8�ǠE����B�	_س!�-FC���7�s�v�s�+���ey����E/K���/�rd����]��f�>�R�A�hSuwJ�%�g:�7��&'����sS٠v݈(R=�K2�
����$	���.y_��7�l��R�w�RI�<5���Q$��m�64�љQ�U٘��hQ�g���
߂W����kb7м_x���V`� By�p�\AE�"M)�#؉O���LHvq�SB�(�j‘*�@M�s;X���]�A^�_��n���M�j��4�P�Y�4��)��s�%��%��,�*O(ڍ�w����5/Z�kz�)`�j�Q��۱�"��մ�/�J�_>'��E��7��A��l|J?��zW\(tz���p[�M�rա��Q�^LiSd��y�6o�_L�_��Nɛ��_]������;�pa��_E�U�񝀠Z,���~�|�Άu��qm�8����2�E��K	����7Y#s�on��<�9��q��@V�c��w�cȸ���Ӿ��!�_|�!�����zTڪ픛��r��W>�"�>���� 8��w�Xψԫ����'����?��[Ʋ���j����W6�r§m�Ϛq��z[�q����W�uV�0�fm�f܆mGwaۜ��8+����,�^f,�ݸa�{�x��U�XQ����_Y-q+��WS�#����Q��@Q4���:�|�HKu=/�SQ�1�X,(��c���CN3�q���Sdm�֩�a\�J^�R�Y�	�5�5�a�Ҟ�P���-`c��;j�s�O�;KCH��ш}	�Y���!���@C�7�D�b�q�Q`��R.D��$4C7Za�͕%�a]�Ң��Z�"�0-zw�.e��E���	&W��������:.jbf]�t]�r�/U���м��iO��F,�#�`�F��^�ʒ�V�������Z��0À��TNS$�JHpgXN����&:ǷY�D_��_����=���b�8���m�"c��eL7��g�<{΍���l��8�풱������w�nFq(��J�[dd3�������Y�j�T���7NU�r�3/\�0s	�C=34��Jk��F]!v��.�l��JדDJ���3l��9��~e�v$�5LWH��D:\`����]�yo��[�<	��Ihc�#�O�>Itt��ɐ
��C�
��t��L~ĩ��r쵹����W^\ͶRh�����T,N���m,��4�i�=D���{ujݐ>���&��M�<k1k"<�U;�Y�?ɚh~�5���KwG�]�f��ȱ�i���n��`/�dz�n:�b����h$Jۛ��ʍD�uZ|�J����.~�b�tPa���9�o��S\Ň1�'���HSB& ;���e9r�!<<N�0X\ �RB�b�и�
�~ej��.����L�YnJ�Ȉ�B�������Fci�̠"t,�9soeKf�t�%�lW�y���	2�XZ'�M���+�D)�gs���d�"CHŦɒ�yt&P�YիT���=���q��l�m���v�uP��퉒�|��H]A]�߲=�rL\��V�h=�w#�y;X*}Ϣ�ˊ�+�Y��1,ۥr�4d���7f�鰯�d6��^H$A���=r�T��@(-.�ܬ�!��`�~�˰�AAB~�qe��f)v�b�w���ۈ�BZ��Z���ll�a��1�����T�ۀ���Lg�s6��������(4k��p�Hx�����ߵ*O+|pK�O%��7�˂����� �`)���E�Z��Wa	ަ�9띸*w�;Β!^F�����ؤ_;�(�x��o)��r̻.r<������ڿ��r(�^D�S���L3���������W�y���Q�׹bN�G�;� �}9:�C�?u"�1�ygx�s�QO�Fѿ[�����pg{��uϵl�j�� �H펃11���߾�J7�8�++�㈷NV�FHAe�:��4�\��(o��@w�@��9R���@�Fj��W�z`K��P��~�?yyZ��:��e@!��^pB��ȃ��]cȞ���3��#p�lo
��H�����B�\��<%#.e�aq�d_�eG	'���\�=�1V�"���i�2�g�.G��-.O?&�.�t]�ۙbz��[~"�U*$jT����n8���y�`��T%�2�z�N瞷^��ZO"��S�������[������`M_�Z�;��W�%���ԫ�p
�!Z��g
��.l����'���9���O��
������o�+&��D�6�s�����U���oR�ޞY�������d�5>$[*Hk�^��s����%7���,Bϩ��H@Ҡ 7��8W(F�D�Ž����bΝ9�"��HX��~�XD���[ 1�.������R�oú�߳$i�N��R3�L�k���rȜrKO��|�O�Y2�g�h%�\b�Q{��E%NF��+��<0�62,�/C�׹��h��?M!�{���Żrwҏ���mj����H�����@P��nb���ֺ1��2�Գ��V+��.^z?-��a=-��+��v�`wW�z���[��->�#��r]	��:�+j����\��Ay:Ԡ<�5���^IŐ��~u���dd�M�<�v��Ɣ�m�fE�4��\L�ҟ��H�WlQ��p��V�����OG��(:���<��<���g_�X(�g_f/���	���zz�࿎�{'ᶴ�p���ʲ	���	�v��Ȑ4����`����	͐2�^�}Ŝí{�>�
�i�_���m`3�p+9ؽ�ó1Lc�+ϑ���/����Y��>K���T�_��\��
�����o�YCK6��
��G9!�3���\/כJfiԷ��,^g2��Tt��3��:=EM�Z_N���!jC�g�mH)�B�s�����RN��;}G��?��]ʪ,1�{���?M��m�ђ�:%\/�hn�+���$�����+Mꭴ�¹���zc�fN�_k�V;F�E����0N��ET�\µ����$��nt.~<��I��u6j��Zm֚�獭Hd7��T*��R���ב,��}��b��e�=�L>�/��s%��M�����{��Wd}%˕#	���j����j5�����؄��}�
҅���0�c�{ՙD��w����lNPYaP�
h;���F�%{naZ<�e��ݷ��
�؆�x@ًvؕHʓ�/t��ʕ��j��]�N�>l�T4�L�����޶����Z_-8�Ho��㸛��c���8�������ǩҙ�E��2�[0s��NC�Ӥ�5�fZ�(�a<I�m��և�ҫ�cJ�J`|�w���a����A�b�%�*�<�u�%�@C����=�a�)\]ƒU(�C�
���$��k79�-@�]A=TԿ�+�g:�8�H�g;����$$�'Ũ��ڙ1�ԣ2e." ����]17��q�=r�89x�z
���Wy-c�*t^{����ݪ��za�J�Y`]�@�I?���*�2kj(��y�J;�"(_�	og�攁"fS�N��g��sw���[�;;[��N�����Ŷ�[�>9�������s��X� �a�oS�;y��/��'n�=z�R�aI�׃ʳ���d4�{�E�O�.,��L-��;k3��:p�4�BZZ�\;�4�(d�����^��;
��tI��hܞ��%źJb�t.%��m�!Ŷ������
����'��5��w(R%?�^�u��7~z�>���N���Ȥ2���PV���J��H�m/��韻&7&/:�kukϮ�����@��}hT��7Z�&x�aR}F9������J���tUQk&�*rMmI���+{&�(9�'
�4V�hɝ�j/��F0U���
U`�챮
�R0S���%�y_v*0�N?z��:��i<�H��(:��W�!�;���F]1��j5���ꭟ��E��E���;�c���BrK��<�`��q1��i�����+�����{�1�TU��
/v���U1�(�	|�����M�ԫ��j��X�P
j����zu��|<nlo���@q㤟�W�ԝڨ����u�T�g�٨��u���xZ���7���W����͕�?QM�:^Tn�{p�M�h�Σ�ljZz�Ѩ�x�AI>�eur�V���i�dԨ��z�RێjO6���7�;��[��ΖZ��F��:X��*V�ͨ���Y�����3x
�:ɮJ�m_�V��{�1�]œ�����o��ۓ�p�b�mL�z�a��|����Eҏ�,pEk�e8"Χk���P��|٦�\�C��7������<���o��?��ۿ������K�_o�/<V���z�}��m���=��}t[��c>s���K??^�����'���������{B��s��~ҍ�j��0�F��Z������:��uz_K�7��[���[S˿�L���+h
1v�z��m�����~�j�巏�Nu&J��w.�[ԙ5����`�ˌ�=:��ur���
��_�ND��u��w�fD�����|���ĵ~��v|'��v�{�B؃�<VC#�����NF�[�:x��#
��)��fW��8R�EO�NUCԵ�/ծ�.T�W����"
j����P��S�:��?4HEPZm�����_�ש����{@.��ښ::�}��Bo?�N���*�z��;��w�d �wpu�w�yy��'�P�����iu�?���O�>ѺHnV}/���f*w::��C5���&���q5����v��fc��L|kk#k����_�l4�����1�e���U��W_�[i��m,��6����)��������?��9�u&��
��V�7����ju+��l�'�,	w���66�
uXS��uV�&�loX���Nɷ��#�Zp"�?��}��I�y�
�s����eԏ!�����/�W�#Q�Qsӫ�]-(وn�<5`Z�P-*`��.u�O��tS`l�i�9;a��t�z/^���������{����(t���	�S����i:zqw��\;�����q��)�`N��C�\�}��V�f�G.��Y�j�pƧW���ι`T�OL����/.�����w
�^��
�p'��:S�{W�^{�'�Yw,
�Y���lޜt��:��_�:>h��D�jJ�ک�Lak8�M���'��N���p:�Ġ�V�=�O�l�2Q�����
,>�8nA.�>\cW�v�ǐ5Ȅ���0����3��x�Sx��~��5d�٧{!��fc��Y�o�@,��}�
�t`9�]u��e���q�~�;5��AoF0��iY�G�x��<�~��+�*F�^���;1X����ٳhS5��g4�xI+�+Zh���z���m�C�_�p�9����r�艏4�@7�ۿ��j��U��i67�ͦX�����a{�޴�J�ߕ�85I��ԟ��uWM�yͧ��g�h�G�h:쌧W�Y4R�1d
�LfW��zY��N�qНa�M���N�pT�3���T��1
S�`!�hU���O C�3�D�N[8
T`P��lev#�SD�1�}���h��P���HTk@����f��q{t!QY׷��{�2+͇�B�!YR�{�ݨ8P�_�Q(��U��Z�$4n��5
)���Մ
�{�p�$ۮ��*%��K%�o�
�}��#R�H"��t��d�
���Ou��(���%�{�$�J�K��ߙN�:Zo��Vi}g���׼"ڌ{�2��K��훼摵rt�F�����޶Y	S�*0��FA��:��,��#�)@�[��Y����L�m��״ݼ���A���	��t�V�u���Œ��9�a�P�œ<�}�L����:�,-C:�ˮ^�E��Z,�2�Ԙ���u�S�R�(��N��9"��)+�r1���8ԆI��c��ٮKI��&�xg�j_V�a��+��O�gD�
O��Q�\{�g�?�I�6\B7���]z��D��&ʚ��=�"P�6�`�1�2�ާ౐�dI��pB���)���Ƹ�\J��n�B��1a���	[�vc�\��B���;��݁����������f���Q��u�^�,����dB���/�����5�e�YI�� ����Q��V�Q����F�a�7�m�
��n��`)�X��ٱ���A%XXm�&�u%���b���+h��YZݩ�inG��66ZPv_m���x:��vW=�͇،D�n�#�,�5쑐�`΀��N
����W8.�?�r|H�´��	�e�	�hI8���̌�
�-����
v'D~r����ё��{�I��<�d��}Q'u���&�D���2Z��<���5��u�
���bR�b�N=P@t�4 <�A���)S����hxg�g(8��3�?O�HV�zJ�U�y �+*kO��%��ee�>���*/�"-�%�������S�i+�����=�4M�I����d(��e�+�,�x�lIo%g#��p���o�%߽xfp[�vﴳh��piO�{�N�4��żwEz�����Ў\��MK."�L��L��#*���C�S�t��hӻmW��ґޑ8W�h����वڲ��.�!:9�K�x���i�mN}���ҿ&�1Zx�����J���&c�ȩk=�G^a`�M�)��0�T����J����?��D�g��㤓L�w%>�[��d2R��]���
�l'keiAG)\,C+�4KTM�Q-R�0�Tk�:��3��h	�첽(�P��b-F�VJ�mA3O�LƩ#8t |�F��/km��<҂x3jHxbo��z�Hօ��hLl	
�x���|Ơ�'�ɺ��V�O��;YeODG\��k5XC�F��d�d=��d�>�/S�V��7}{F
���K�ݳb�|:Kfs�QՍ��<�O�0��JHtl�jz��r���N~�?=<����g����sc���h���xv5�%�98��=mŌ��.Iʂ��=`ONR�a��F��j�k�����}��$��#N�O�Q����{q,��Ј��m�)8h����Rv�`�ke�朇���SS��?��6O���Sn��Q���eH��7u~w<��E�?:s�bx������zy�Nx����=5!����4s?3�홝:���91n[BfY�n��z��ؙ*�
&��]%c<L�=
�:����*��2�zq�j�G�9��A���+����v�Q���7ϛ�k��˒����ӬÂ����d���{1�p%��W����]pF�^=A2����������g%�������C7Jz��l�=�5��E��6����>ȴ�=,y=�
g�Cڻ
įn\u
܆(^��WF��;�nP��*�(�Z9�����H����v���,��,S�u	���,��3��O�	N��u���S0����w�oߴN2ީF���~���Lg5j�eD�=��ur�WC(��iz$ϺIUa<�j� �[��
+B=�p"��j��1˥e�\J�2�9��>k"R��oetD�0Ǜ-��Q��*�9A:��~q:�h�bA��k��aY��&Z����!Z�%B^�f�(�{�y�P7�#�,g7j�m8�5v�;ΐ�����rX ƴŷQ8]%)�,ّi��[�y�@�zr��S�2I����Fp�!x���S��������p�$=}́G ��E�XJw��~]m�����L�aq���=z���3�^@��u�u������_޴ڇ���T��3�&|��l��y[��=�n���(����{�գ��xvx���l����8�x2�������	���R�2��}�,��b�/�/��<]����)�s�TO�Y��0�~7S�T�坍�!H�H�&Z�!Nrk7�ٍS1-B�N�����<z��L'#���n"�j�P�+Rr'C����~�î�\BR�r�e ��X@��8c�}@���iK"I��@���y����=�A�=@��� N�E���BAt���'�Qo�}���U#C,�j0!.�'�f`�Ir�S�ͣx�k��Q��\k�P��g�ӳ<mu�/�`��ã��Zg�G�Ka���j���/��l4�[>r#�X.PBK�в�#驻�}�
�đ
�a��$RxkB`0!!�X���&���eI�WɅ^��s�T%��y��Z�0���5,`���/G��b-�:����{��"���>�s�H��Af���O�}�PVY��[���,��	��u��2���1�Zh�F!r(G�u�Љ��p�%��s�
\νA{K�B��d�:D���p8�b�����A�
���4��D�!���k ����^R�gR�;�o�8>i���>=�?9�Z_��^�p��]�t��l��ZG���`h5�/���β({�ϔ����F��8:<�E��3d�^3���.ebQ�"oG�fh3��Q�D�,��f�5����Cp����J���{�Z�g�LO��4z�W^��
z�!&�;`�Vj4�{9.r�t��|��g���I�D&��l�\Y��ྒ��{��ҳ�	�ύB�Z��Lv��\RLZ��A,�`6�a��fmO�r�ff��2����-�]Yݹ�~}
��������]˯\zA氹��$�^$��	�9� �1�O#$>��X����fO�aj�{և
{jWrŘ}4Ѫ�&��6�g��vt��b���e�� ��#
��E�#4Ƶ6�O��.8d��K�3��c]H�x�d�^��kbC>��<T
��Ӓ�6�1���tJ�ya��S��-狖b*�9�C�E�G���"���VF���:F�ݬ�{b
��^m�`q�(�
G�7y�b��O����I=�+!`�il2i��8l���It==+aب�c�AL�0����v�yS�2��'`g@�f���RJ��Xoan0��1��ݐ�4��O��>~��U�.^cukH�l�r&�	��Uyqy���Qn6�j>�P�S$�TbM��nƱ�p�����#E�_+k���Л�G4�ԡF�ͪ�2и���j�I�u�K��6��rC�u��axU�j�U��\�3�#dV).��ĩ[��e]4n�J^%3>�~x{����u�z��>�\����L!�\�W�R5]�|�E�p��)Щ�+@��僝ͺD�k����F�]���v/e���{�e5ՖD����R�3w�,����XD0�\F�2�GN�9�.WEp��;�7����0His�f
���dv�7�v�n4FЮt8��hڦ1Zʽ�u���Ail�������M�ο�0��ɥ���o>�T��'T;����P��`���Y��E�>D��|;Ƙ���;�8�Gc���XXJ��o�8�&�'p�L�r��G�bm��F/�7�:E�W�{Hi��)G�# ċHE��&�͍�?߁�L�n���#�6���]�+ku&$��Ȃ���7d�&�JR��1�D{κ1�~H�O��F�ԬiL���*o����)�k�Q2�V[.��h�
�->�N�I�u�ě@	L�@����X��ūmoHW�n.II�H�.	P�P  ,��*u��� 7��ُ'�5�R\8��d4��ak���~n�99>Sܾ��\of5�����P�?k-�K�I�I�|�ëÃ�(��ݯ�K~�L��z�l}0���k�]� 
��G{)�{���u�r�)����`�;|�F��u�C!��o�(�F��qz��5Ѓ
u2���ۣ��G������������)��i��
�2�S��?�(����aޱ�aŜ8a�A-O�~+���67���
��k�a0�B<L�%��$BO.Q|!�h�,��f]͇��8
��I��}rfj>�o�^�9��}a��u���ZhU��&A�Ȃt�
>�m��fOP�<)�K�Ǒ��Cݨ🀬�ʏ��e�؄I��\A4Q��#A+��x�>������U�JO�Wy�H-8��x�u��)y�5҃�%�S��2�t&tH��te����"�I����̃Y�Q��6T�&��w�Ӟs��毀�2I����(�}Dck��
H�]�n��2X�=,�k�v�j:/�y*L��j��r�(!�|6Fb�2_i��0�����k�e7�_��V�a�Q��n�%r��E�QGS�J	3�7b��U*����})j��w�H��Hǵ�3q�p�f(A(w�,�3�h0
�����CSw'��\�W��n����䵥٥�FG���bM�����G��٣@�o��I��B�+(2 !U�Yr	P�S�<.�c5�����Ā<W��yJ�yL���1�ԃ��o
=�>��	�n�M7�6���~�Wo��@i�$��4w�
�Pϗ@�l7����g��'���|���ZNeU�+OZ�S�j����߉:�糤���HX��|~�3�l�!�_:�Y#2~Au�	`<�I�]M��ī���7<�f�T��+D�Q�1�ln�^� �۪�U[�̬�j���]4�`�RHW�
u9���/ R��z:����td�Ã����ë�jwk'����Ņ�o��������LDx��|x����իd����
�\�NMm�tz�
@T�{�xD��?;d5��(K@N�ӽ�o���M��ޫ5�Ц#|��ѿ�=>k=Ͽ<��u�g�~q��������r�-�K^��!t?\L�
��hףJ����V��ڷ3%Ƴ�h������n4����^�}9zD5|��c����DA[�N_���?��FÈ+э�u{ܹ+���m��L;���ͥ,��
��FTo�F��1�R����ۣ��u�tfW�+͇j���CЭ� �#�Ě����j��,�0���L�ۧ�7�/[�D�c��ou�Ld�:
6�v��>}_6_C�]3��v���F�}��7����m�g8څ��!�I����:|y�~u���-�Nge(�ֹH��c.�ް@`2o�'����p2�*-z}�l��<9~��35�)5�1q�1�����G��8�H���e�����q҃�>(f�8��`����m��{�"���\`M��TU��~/�������^A���
s�"�e^-7��h>�*��q�>z�X�s�W�^�a�/z�%�U��C���`��`�?���r_�`��.�����E�s�G����60�,��x��*�^�g���!셝��{�S���:��=��M
�,��WFo>nF�d7To��'�pClAAB	p�'^DӨ�վD��}�޷�% ��%>�9|�X��k��\�`��h6v�jU�����ޭ�Y�~@��hd��J(]�lD�U>^|;�ְ���w}�_%�;�`ؐ�뀨XYvɎ[�vJvhٽR%��E�m��ի@p�p%��O��ক�����|"���xKJ�<,���no�Z�h�v⺗7s��e�М�k��ݝn[��5���)�)2sc�T�v5qP�W#��)H%T*��	L�=鳢'n��T	w�p�/�l�f^gH5_̌��Lon��f�Y���7�;��L�����#s
5{�S�ĽX�?�*;��5t��{j�2PTB���<t��
|e�N��d�F*NJ0�Ji�ÎT�Q2� *-��|��m=c���Qd�T[��p��WFfywJV���
���-����ى:��a���������Y��:�/Z�V�o�������5��Ғ�$Vn��Ay�>7kZ-Eك�D]�}#�} ;\����n �����7y�Y��g��u,\���k�a��V��X�]H�^�_l-������PT��|ȯ:�n�`FF��L�Mk��v���F���h��\�1��h����B`��?M�i�Oӵ2&\����Z)G'4�M��8N�p�=5du��~UW��!�]�B8J:�g ٽ���v�~U��GWB�t.b��Q"�beL.Ԁ��a��A�� ~���L��t��:z��a�m��j^�ۚn��	�@��J�p�S�ƞ�7Xi/�w0�����q=8E,���s�iDl	�9U��~�Yq�g9�����B�!�+��o��]��l]��DMZ�멒33!�!|��VY��d�9C�!#p*f�@}ׯ��B0�a�q]�g0X�~���}�K]��T8���e`�a7�i�T��.ܤ8�ņl60?q����1�&H��p��8n��Ǜ�mү�)�Ue���&+�u-W�I� ��Tc�6��G,��~~��)�x��E�$_г�ǎF�76B�ڌu;���_�u`rm��E���٪x[smw���rMf7z��G�Ә/j8V:��Q>�#\?�6���凌Kj晰�_\��	Y�eUØ�:V�����J���y’�ijҵ�F�Q X �8��L�*�ud�p�Ȅx�w���ѫ��ju��Y�T�'GĂ$
�WT���ѵFn�2��@���-�+��kB��&/6��VW����zpk��y�~���7�ǠR�z��Y�Ж����~���>��}v���1.ST�PE�0t��ãf,̓��//��v[B���a��-�<v�������׭ר..�ȷBwO�L�����AQ��'E�DY����<��gT2pR�a�>h�HTk��^�,�5i���Y��u��6��cu�A>�񺽎�Sg�_O�2�|8���z��ͤ�瞶�� ��.(�,�A2lO���tQI��@*1���� �z�+�7�-t3H?���]�_1�<�xF���8�W�Τ3��g�V�?4���)|����b�JӞ�:|}xV��x�Z���S~�h�a�5T΂q�WVj�&� ����p�Q�1\��_D����B!$l�훓������[g����d��j�Jd�zL-�'��S=�������w��x�Gop��ab�&���zB��g��Ш_�M�贄B+M-����X�r�b�V6��H��?$�@%	���TM�Lq�ag�ގ'�u�Uz�K�`�����ک�T�̦���A��4!F�b+2J��|�lS�6W������3�y�ԬC�dBz)�t� &��cQ�N�ns|k1n�WJ�V?�XG����_�[?���
�������/1~s|��l��o1�)<� ��zDK���o�O΢z��&.�s�Yد�{�;7�9bv~횉w���C"�No�)���n+�����I��?�N��:f"�"���mo���G�gmn��w����zn�o���*Ī�R�
"/DɶЇ�dE��K+�="b�k��R���fF�����L��nE؈7Qb滙�d��LZQ�N�rN�MQ&�]���a:�Iƛ��8��ĉJs�"=B�p�b ^=A��t?^�&�<�$�Љ4����t�J�'צ��T��K��{dz����0Qp��xD:���dk�y{'�ա!��{��
����~�o7m��xj,G�lg�A҅�i]����D�w��boQ�;L����[��pi�5�CyD+F˹�Kռ !��զp��oqQ�	�7p>����]m�W��'�ݖ�Gb͕�Ϯ�vL��>���BLZ̫��6Qu1B �tHi=��U*�T��4������a'�/�wWSN6O���W�Mk?U����/����]P��T1���쏔`��$q��{�x��`���KŃSe
_�#�	v�g�2_�d9\�U~#�j�(�_Y��r�tq��B�;�ه����X��M�DoQ@KU�e$	k#@��'�a�|~��P$:F��y_�x��Y���K���M!��~�Ҫ�;l�U���B��ߙV��
�ʪi8�hC.�(�����/�ɒ»��8�����6Xr:�����cX�L!;g"2���<�0K�2�$��Ѣܮ��gU��/q0T28��*�Q��0:���)��ɪ#�&����'Q��B3
��.:��IG�8��[di����!S���D����q	�vmJ���X���Ku\�5w������ �
:��q��2!������zT��͆?���"J+9��&���C'E8a����\!��艶��Ѡ��bRxWyF�Ȥ��xG}�������()����)(G�z�Lg����4(G��:�с�ҡ��̄$����$v�R)��3�l��}��� RvW�S
.�F�C��v��Yu4�Ka;n�A��F��\.Ng����G��צ����벲7|��ּC��|�h8H��%�r�Z
x�l����쌤/��]��t�zc{a�FM�\_X�.��7�l��*���7��-oZ�\:x|�u�l�9(���B��}�y���U�Dey~4��sP1�w�7�O]��ԍ��V�.��o_EO�z�
Ap��O��+�_�`Q��o!)!`���/|���Il��
�)ġ�L�ah��A����ß�	�E�.�@
S��D��c
8��3'T�hśQ)&
�3��m�óאi���՟��r��F�](n�0�N㌾P��NR���a&R-8�z�s%������w^TT� H�G9�:���
��D�Ϯ�̦�XYAҾ��X��吏��L2�ВAy���f�0�_��8� ��<���I�3�&TMF�D�W�:�[�uX�~g|�w������n��j��eP{��Vi`i�Iq%�K�x] Ox)Iqٚ#w���ɯ�O�d�2_�g:���g����y}�^,@a`\���(@�����=U�n��J�B�=ns�J���T��+^�q�]�[Z�iK
/V��!.N��p�l5�2
�쓰T��3-RKR�>��r	ָ�%%����h0���%]_��V�H@����s|tpҢ�'�&��!�~e��b$����(����Q3��1�����'����@T�B��,��+)��+��i��qQ�F��4��$�"NA\��u��P�x>�ė�$O B�imQ?Nx����y�/�ⶼB�^��<ؖ�akv�}#5v��y��N��j�}ힾ���r��[&ӯ��,��]"�ׂ��B}O�ƕU_Bu��[i?.�~�(�O%7�rY(-LbR�O�em�Tr�xh^yR�U��OuL�M$�qZ#a�,�PF�!,��ͅ��gQ>����]��1����|�ogB�lR��z
E�K��*y`�� \,�B�<Q��x$�"�������cZ���+�B�N��b��.�[7�11��;�=�j��v�<DX%�><z��f����t�
��ˏ�@se��2�i��G����G�!g�C*v���O�>V
i��V���b]�\����W���f�)�������E�J�u�Luu�#?0}�C��(�����R��ꦞW�r(G/�G�hak�q[�1�
�,����`J#���[%����o_��,D⠇�qQ�C�~t��Qq��E�0�?dݛ�:��b 9�:���?�H2�u�S��V�VC���5�>!!�}�-��ѮD���i*�ǎ$!��S?~ 	�(�	.�¢��uKy�c�`�����Nχ_���:���H���ǕE�)辖��ʰ�h\V���+g��+��F�"R����]%��G�/��Ff�jܮ��el�����A�qR�Pŗ�*�$=� �d*�d���R�ѩ�82�2$<�S�r��Nˑ��)
��J}�M.c!��& � 9�;����N����P`������#@�f�̮w)�cu��׆`}ŏh�$��C}z?��J5΢3\olw#�Z���=�-�m�Fe8�ы{*�_KI�ZןgYc��W}io.a�A�Z��Z���%8㰝�*�;%_-���#qy�h��GX��X���SU�F���]*~ֶ�Ծ�MY8�
0[4P�G
��(�u>|��xW��P�*}��jڷV�*�k	��9�.\��)�ףR���a�;lK^T\��-9!\����?��m��UR��/G�oߗ3�7e�h0o;�Ye(�9���#KJ�=
X��*���=&4ryZ�G�Am���L�}�󞉔���.�}�Y7y��%�����U!{\�y
��S�n
��D�*}I��۵R�/
���!:>&TiL9Π����(O���%��aВ�ڀX�jI�o��w\����="60�<�L��Uʪ�Ҕx�ۯ5����w��@iF����y�X��J���֭xN�~Xv�l��zaU�FӰ�=RQ��+K�J�>��^��]�oj����Qzj�=,H`BnLw-�PiՆ��s�-�,�[�"#�~onQT�:G�R+�!k�t�*��?h�:�@���C��H��Q���B�e�7��~ɏ��^#yK{�!so��T��}q8}�(��jWe��CK�a�QU���v Յ��6dY�Q8�`�ۣW�n��%�д�$p��A�.�F�X1[K++Ҥ�H��?&��7��,h
F�Dk����r;{&�0V��2���)�0�V���b��$kG�ȄkE�(x�C�h�Z>��=�Vr �
�Y.�7��|��]y!����9�q�c|b9�,�9ς[�wZ��՛xf1R�,���RX([�ڜ
rǮ��y�t��ty��|`.��K'PFGu!�!��Rf,��ϸ��
r)�K��z�I<���t���D	���m%�����1>����ON��̀��kd�t����gm����z�����ʾ���F}��|Hݶ��3y���@%�a��!wE�4�D�V+�L�۷���)2�0� ��T�gH����S�7�;��d�B�>g��c3�3�0D�]҉�s}dy��*W̘�?���F
%t�����\���dI��H����g���m-t��m�O��4�WCg�V�؋$2���b/��=q(�����5��;��7�:V/��pއ�O@ڗ_��ds��B��"�L�g+�5a����tB�3ʃ�|�Y ��<l������Zo��y9�+I����v�
��Uh&gs��E�"���e���l$\|kQ�f�Q�����Н%]脻PR�CP����_���~�,'gy��,���X1L��y��SKў"uyE��L���Fx~�U�!�A�:�h�1����J�ɨB���T�_	�_��c��@6����[���FCΤ̕��gԄ�M�q�@1<�f�5x�R5�_�nz�+���j3��A���R+��#��~�x�`�2���(�*P�M��x��;�>�S�Y��(]m8hg6�#9<�+�ci%�el!&�;�w�cKf���=&M+bf�jq�
H�u�����pg,�xZq��r�;5yt��+Q�V3�
M`jwG��B��~ �Y��WT>�5�
%`�O�i,��{C�B':��H)��$݋��V�d��3Y�C�!�t�1&r;�+/�4K���;.,�Sb��V�_��H>��t&�.;3�՜d|yr��b!��<Zq��XKw<�S��|�ɘ�e��.1��B9n���������X��s74�!���t��,3������"�I���-���\� ���9���q��0�a�@�(MC��y��5;X>l����2��n�kt�s?h<WCiTA�e��BT>�K4a{.���pD�9�EZ_�)e�P�F��@՚Q[l���ً�������y�FtC_ä ����v���D�d-z��
X�q��mū�O-��Ϡ���xc��;������91aA�^�{���:�\�G���&�
n�Z��]	2r�V{��j�5j���l�8��p9@��C2&��`67�5����QޑW:��-�p�����2ƪ'$k!"�0��C�b���������(�<P�C�2*'Ύj*琖�*9�#�J��CF��ɽy��!+m�*�	�l=�Ov��(�]We粃1��H�[������_�0[҉��¶��L��q����`x���+5���¹��? �`�$���Q��$/0�ї��0w|!� ��=����m�
��
��@��`r�p��?�?G���}����e�tV[��-��Wi�-(��maW�^΍al���m�0bp2tG�b#�Թ��Km��Q�(�MJ[�1{Vǽ��J�Vƾ�D��̇�-}+m�F�f@}==<z��uv|��%��=!��a�/I���s̼�߂9������]�
�w��g�,h�A�qD����"���>z�z7=&gq�]p��r�)�5ce9q�$�@�DE��g=`N�J��M@Ml3���(Ib�i��sgk��h�nl�H�lI�%.F��n�Q��Ǔ�|w�=��V���w/�}�3�	�۠�-���dV�U6���l4���~���J�M!�]-4��l����^.��(�Ah�ʦ�J�1n� )������m�b[�-���˭B�t�J��%$��۔�´B~���FyM��"z.�T���Դ��s��~��n(��[@���*��yҼ��vD�F2��F��]T6�g��D��t�� �����i�Kddl�y'Vh6��2�{�5
�?w�����asxl�bQ�x) �Q ���?��$DR�\9p�6>�v�䶰+=�K�Mį�:j�"��O������;�+�nB��$��JWx���y�>�e.���>c���+�)z��Q��0��mK ����Y�?�_�p�
:H#V�`�,�>�a����Q����Wg�%$ӄ�%m��M.��T)�]�������P�ALK-�vf�������M6�%ő�cW\~��f�4�h7�,t,��<t.C�8���g�u����*��z0.E.����R���#	RL�^&��J:��u��������m	�C�Et�I��G��1�f#����ԱB���t}'�I<�$C_;��������x�ً�+=�b���hr�lQR�^z[F{x���$#��� U��!����;�a<҃s�72�x�j�47g�u��<ܣ�����aedf��$�M7��:�sC}h����n�v�#�q��5ښ]��7j����!�guϮEA5�/�!u;�n܏�N�!L@jJ�WѢv�3]L���,iK��� �Y"I����i��ZhG�m7�o*���K{2+���W���E�]��v�Bl�ؤ%�*RG��\��l�.��K:��</�-f%�J��N��dv8U��<W�Z''oߜ��ېN�[ې����Z/�1�^݀�ew���ɉ_ v�v��Z�g�0)<$T���\�C�u���jAYB�N�P����WB�s\=��pc�.:�Z�
�
4Z��Qw��[�ݢ�Bת��|�jk\�k��,�OSf�P�^��t���ɱW�V���if�.Y���+M����T����"0J�sK���y���Ү՞^�J�h6��ᚺ��-
���QN(R,c^pŰ��W]�sb����/_,c��sܬ��[�"�5�pTK�>L��-���V�za��4!�c�;+Kt.�)�,Q��[�Q���͕��,�݄^kڒ�Q���Fs�b�L�ƳW�����z�	�O�.�u��)~`�;��f��4(�� �S,u�#�E���^��p[��)��[�b��u�	�
N呛D����
F�>�X[A�d3S�>�/��ζ&	���%�^H�Y�0��	k)�rqV��Ļ��!��tp�Ǖ�X�N	�ì��&F\h�o�,�Y�����u�eruΫ�N�*n��P���`����~�h�$K����kh(�]m ���

����61g����~�EspP��]:�v�3��4����U�M�fa�d̝� E.�D���Rec�ܹ��?�z�vzv��d��X&66֛�}	�~�󓬆��8��?9Dӫ�#d�1Q��U�o�}�ɭ�>o/^�1��7�����/������OF]s0��S��
�0��i:2��m�G��VGU�e<�'x�U��P�םIh��&�1��@.-��11�v�*��#�6�uD�vm�9/sX�.p`�@'!/�@L(�� [h-��$�1^ՙJ=��ĂH���.6St��
�m}p?�O!��S�.�	�b8,͆b���(A�"��m8B�0�"�R�-�m`[��P
��bZ{�s5��2���f��,�����f�D�`�\B%�qTr�bBHV��� 7���栉9}�M�J˪�mێw�
��{��L�����{x]���5����KSZ��,��^go��k˜ԸI3O~�o�O��-��S������؆T����D)�j=�!�J��KM���Q�ܷb;Mz�nZ�tG^}�.���%�3A�g�͹��AL�5�3�}mD0���
�ۯZGyj\+��B���8�.���Egrʚ�z�+�b��D��f�nB|):=�19]I�������ýH��ۣ҉_̇��>���e��Ѷʸ�<0�4�s�a��CM�(J���@I�A��1�9�{���7F�&�7A����lp8��!��P��]O�z��B�	��~<��^�q%� �Ѽq`g�eL4���p��S��E؃����)l�8N�1{֗�;G鐪ǡ���:�^���gE!�(�ώ_�[?���W%�͋Ӓ��>��\q�um�ݫNb��c�0���Hz2�=�#�bѹ�7oY���=C&Qya+�wk����H�X�e�-�V6����J+���8`�c��nMu@�O�ڗ�X�H���<l�2�SB��Y�a*�f��L/�������D-jC�qh�r��j x�N�j��~B��h����>���(���)�$��y��(!�NPX��c���pN�oÁ��h4�}/��7u�}����!->��ޤסޒ��PΧ�x{D��|^N:�0"?����
*aE��]3^����l���G�qMe�#
�i�i��Y]�������
�m'^DP�%�`��-���5�g�
v���,;[�|7
-��iq7�1"h���tr9�t�N0��#G�X�Sein67�qmտxn\�GEZ�-����8l5k[M��S��)�7Ld+uDw�'��egr޹
i���"�/>�����XX�����%�H&�h)�*�Ӧ�cw	�����Х⾁���H2�b�!?�3P�|�*!ᒲ4X˹�u�=\��ů��#���_���t��d���,��T_��{��l�h�5��Z�c����e�����O��c�i$�D
��et ������1'��!+o!UAs\Tޣ۝L�OSb �,�T��@V�2mL�<5�~�ʳ���bfuP��
����\-�� �܊Q��7Ny�����8�PG+�vrhX������b��&��3]�M:�9X|�^�-�^��4��(
���XSkv��Ŕ�$
���N��K�g�0�u4ԣ�f>3�w�(�7kr�Yҿ{�ޞ�i���:��Ї/�Ϋ㣗
5]�����#Ł��T�@�_���io�x���஄LU�JƁ6��4�-�S��Ù�h��N�e����"��P�� �wW�镣݁�]��@��'(T}�VW��* U�S^DH4���?�Xp��������
˺�0�b9�����Ј�S*F��̆kr�fַ3����
���i�=-�H�z��*�*�?ҹk�x�����"|�����p������Ю�C��]f�Y�����p��r=SŐ�A��Z/pM�5�jg�@,l�4�/�������ɫw�^óӦZ�ͦ���.mN�(F�w��j��%%E�\)��R�˃'O�LFJ�T'��x���ݏ8�j��
S�d�S%YD��I��&���7W���GcF'g�O�Ѥ�S	�@���3�'�:��FQ�3�o�7����ٓ�J����-4�{�X=�F���O���?����w����{V�6k�o{c;��6�f��{�Y�Z��6բ�<��oO[��o�Yc{gs��*pv|����ll�2YE����٩��Vc���i�D��g��4���,�b6ήbP�N�A�
��4JJO�Dg� �f��9j�@��ˤ�W��
{SQS`�PM�<�>v�����������΃���p3Z��|�o8E-��)���e�s�(�(�*G�9�\f�)Ǥ��z<
0����q��`���XD�cs
�昶��Q�t�2�YE���ޭ6�7�|�Ҷ�<�Ř
�[(�q�&cuJ�d��@1]԰[�.Og�!�n�%hU5����p���:�:��
��2���,�h|�>��i����^Ѭ����lO�?`xF�Ͼ�*��Dmy�a_�v�s��@q�Stq��n4����y#n�z������R��:J���乎א����޴����x��8
�l�&�A-��y��-$�w`s<O�p����,�PYH���<3�!��,��]�����)�ՀD9l�<���pUgd :�&m@#�J����Ѐ�m��,����@,�Иu�uԴW�8��G�qM?&��A�J�����:��p��zt�z�J�!��@r@Q�A+!"��#�����)ꀣW�C���F��[G��􏗝��9uP x�?]�K��!�M
{�TIsn��s���F�z�Q�I�!��D�^#$ӄ�����Pȥ'%�P�Z��x���:Iӌ�?Sr$�w$N��&�2疩,�������q�Uwٗ�o[Q`K�Y�&)(����hR���2 ��wȡF�5�n-A암��_���@~W�o���2�\��d������!څ'����|�5R�즡 �BU�h+b�v`!��a�9ߌ��k�I�ׂ�?��������Mj;Ѷ���L[$�*_��������0C���s rm�����Nޛ��X�Q��w����lmn`�̥�;�6�"�]
�!U�:�+XՐ^���\$���M��5�G0yt��)F�
����6��ݥ�PN)hfU�M�'�-���$	�~5$�ץރ=�2���s⊛#<��	�)��+φXȚ���1_��d
�@no%����_FN�	jԅ��%%��P4�n������u����f�%���dV+k�~�Zgv��Ā��� =�[Ո�pU8�M����K\y������D;�!B;D6�p��1���������p>&�8���*��Ҫ5?�ʪOo��A�
�ZBK�ԛ|G�ARNgU�o��'{9�Vp�B�9L��(�c�8�ڎ��b�Q�fvp���,�Lh��>�☴�����כ;�,�%~�����`!�
�2y��d��%-kD�c6!��ءh����G�[W��
g�Z�Am�v�mA���-��RW�*��DޖY�h�\�����u�tzO`���<��� bRQO7���\G�X�M��G�G�-��Q%���1�~���ՙ�	&`�^x#*��)�Z�^�6��&���r�(3`��� �b�[��>�%�Wӫw��{�^yE��o�1�qi����}��B��L�K��Ԣ�kهSpv}��CL����%�,�'J5���S��!�	db��$��fN�oeH��(+��
�ؠ�}�Ic���fx��Tsv�gJz�����fX��Ye�W�p]�j��em����M�mՐ�Ӈ@�9%���-+g��a�_2�s�<��ƽV\��yh�̶|�`��;�&�ۣ�W���%���4���6i��3[x�I�dj3��W}x}�k5��I��r_RdZ�|��>�c�F���;��2��H�Y�3����:����L�:�<��i��w�IN1� �~���r�7��HQ0^�*�j�j��)�ݙ^%��JN��šםIT���U�JR�2i���3O��hd���`�!a�B<���J��g�D��b8XqX��Hx��n���L���D�
��B�\�1k\�%4^�nU����85�ه:��D�;=�?��W��RV�L�+���V4�Z��d?Sk�������K��"�K�sA~%��r����s� fJ�`o}�(����]K��ՙNG]p��}�J��G�m��j?̵���g�-������6��А �¡4��'����#;�Xʙ���=A*���o�|�9�Zye�D[�N��E;�Mr-�W3� :i��=9j��޾n���p+5��q
/(�N��/\ϙ+7�P�Q�8��Rog�w#
�桽̀�=$ �L�>Z2/��7���FPMR��zGa�m_�1�ӫ���>.�h��LD|��?|�<��
����%�5�t�@w���<�L�x�E���ᅣVWW>^P$��{QC�;�9̢���
�X��2���0t��2�t3�F���EIJ�7��k����Q�X�n�F�C6EE
�z���uT�כ۞�
A�t%���I<�sJx|�W�':�0��T��;3.e�-��
��F����`<�i��y*�q�2��~,K�*jg�f����a��d�o�(��p�V�a{30W����d��/�#��=c�q5)>F���
�:{`�Q��©���Ã�*�9��L(c����I���q�	:�,r���jlԣ�=
N&
��p��ד=ƞ��cV��`������P��u��FݝC���:��s3���km}s�Ƴ���=x�q�Y�n�5�Fm�@;���9b9�X��2� �u���U������N�U��G�>���(��76I���`Q;�k?cF���x�`T9�9C�!^�pY��WT�[�(�ڛ+Wy��X52*�� A��l���J���pmi�.%�Y�)�e"��}z�0R`/-i�\�`.b}j�Iף�a]j��\G��GÞ�1��50I̯1�Y+M��/��-:�lj��XL�$c/E����g.��_���{Qʕ]ڼT0�+^8⭰2�>�瞶��cq�	訁�٢0���o{^��u�������k@�e�+�->�n�{u}��c��l�ˇ(ZI+���F�U�j*���F��C�mxDW9�&C���#6�M��pTMƕc�`+{Hd�ٮ�D���DhjW����<�k�)�`+:&�cHeL��d#^	�i�廡o=�����H�^��B�	�5��	���-����1��B�>�S#V���ӷ�+�
d�lč�t�oY��xx�Nu3u6�fmb���7�G�!�˷�rx�l��A^?�q��\���~B/ �9Zp��ƒ�7q߂����|�n?(�<�|M�K��<�5t��S��U�ix6MD�����k
;��%��ö������E'����C��w�V˝���B:��!�35^D���
�#H@��^M����3����n�H�	0xg�s4
��jz.8I-�s8��A	��r̩�@���yO�qj9���2laK����H{�-�>4���erH�ިafmg��6��ɂ
�/ܮ�"<�ꂐil<�v�pۄu`PY�Sv�pJ%����7γ�d�M��CS�S�櫡�Ʀ�'�ϲ�	���B~1�����Q/~��z��1~�(/����%�!82��Uh�-ش�T11MI_-����	:�3�r���Y4���"<u���4���u�!8��y2�(�%_r�jgx�.��U�9p�ŗ�`U�s<���9&p��8��D�W��?�~vG>�A��Տ�b:����}[ ��ĉ�e��|�=4͇�_�����>h`��mU��+Q��:V�WS+UU�Q?b��}~w>�E����!C���)��V�gSBN9���g�8�nFs--r	`�j}�}���+�T�]5��qw�I�&�Nb�\�0̧dͮ���I7A/��w�r��a^���ڿu==�k�޳�^+�'�<��E��$���a�9��:��!@�p6�)�?��P�磾��C��Ɲ�"ٵ��a`ߞ\@@�
u���Eg�V��'I��&;�����h��E'��8bO�d5aZx���'!�N�*�}�����iTH%0)�n7��d�5�Ύ�}}CcNp�^Ͳ����d4����}�D�p�%.<���
�/ޭ=MF���c
w�]���,��i<x�#D�O�'̒��hU�p�i܊�����cIʗ����5��F?�hW�2%n�y$qE��'2ݬ����꾫���"*)P%��+��Z:C|՝��r�ƴ0����'�s��,Acx1��}<����[�[8���Β���,��[�HU�{/����D�%�v�y�DH
c��B��x�j�1l�}�b��Y�`4(~�vJ�>\���x�M�`N�E�q@#*#�<W���t��Xg*{r>}�F�O���y��ɠ3��{x�aUN�<��/��x�+z�ı�uѿ�~�ZU������p�a�q��!E��!�0�L������8d��FG#��*=����3ja�NJ�"wH%�P��~gʛ����&牄ݱ�!r��q�Fkk>%B�����7T�p�\���Q#
��}�x��⿍��Hj��T[Y��!������l4��p ��x�~��!9�x�~��j)�D���g�29��ǑI�=���07��)4�΍,�vgb3WB�#������¯�N��h�L���T�p�)>O��[���|�{((:�E�^*i�K���@u'�4�ul��y��׃���]�Z
)B���	�y�h7M��Ñ�1�,6��B�;�թ3H%!�@�T�-쥑�0G{@�j��mF�@!N�CEV>ZV�3A <�v�����Hr�����$,1vf�I{B���t檎:|?�%�~,��sVZ���uQ,)h�_���8�8����C�����<���D�#�2�e"&Jݑ=ӧ��ܫ=�߂~�$����x��0�\T�����ӯo���OR-�^W(�y��6������w�	�~w���+�翓�w��+N��$�85;�������^�������P�=J�1�e���;���P��~<��)�֋��?�y_�x�� ����x�VVۉO��Ǡ{LWoի�<����4��7�����y���؉�(\���ߡk!��Y��8�42������N����ay�6�ްa�y��;�e�yٛ�ۣm�Z�T��!�bV��|�UÂ1п~���v��4@�7�붮S�����3%A��<B���WA7ibI�'�ՙ���z,EY�$ڳQb�K
��B�c>t
(nP�Bx9�����;��T�w6y(�7<j›
��Ϝ\Q���,|ϺWKZs���[R;��x6�Y�%SF��qˊK.�z�e&ԍ�~/ee�����g{�_����#��ϋ�|�J)�h�-��7�>����]�'$'#V0`HuIA�rw4�q
�wH9]pa\=<�l^
��95=e>ݸ��:o6��zw{=��/��\/���
:��>l(��i�i{
L�6���]~�]�5Ʒ���#o֠�6�8�cڞ��f�9���P�Yvq���BA�Z�|�V��-F���+�w'��z�C�9�_�^k���Oj���W��#����Ѷ�DkhS/l.=�d��Y;�b�f���᧳]��QB��΍���I�?��4o:����JT����A�FZL�F��oT�/��IG,�<}��u��l��X�:JS
ݦ����o_�t��A!r�'
��t�^����F���ڨV;;���kV'>�Хx����d���p�I�y�h��/�����d�����o�!ٲ�i���M���F���*Q�Z5�'g+b�>~���@ͩ`u��U��Oȃ������t:�sa�'�����%������0���:�a��õ*�����4�s�D�C%����!Z��@U�1(�z�rc�wYC�����C_�ҭc���ˊ�sv$�"��6�י�d�|l��w��m��qi�!�܂;w�dvʉ�xx�D�0{`,�ԧEE rB�%��̇����J���r�YX�mE�������.�$�J�Txm�6���37�����4��ir������5g�T�e�T,��s�B���m`q��k���
�!�#?�`u�bA�\Чۙe�����̠�TI�E�JW1S�H/�%y#�Xߋ�ɠ��?�L�{t��K����{�[R�Ʌ��D�.�jW�B�<o���
Yj�Aq]%�B���s9�D/��d��'�dv�Gc�>�� 6:�Bz���J�:�p�y��-8��"��o�~Q�k��g���v,w�I��S���b�|�cp�)�#SMzcY��gp<oR<��4��J�l��W��s�|�o�a�If�B:��L��**�o�x��j��h��Xa�Vs�eu�dM->�XK���R�]{8"ET��\IN�-��;+sV���c��Zsp�gVG)c���Ⱦ,GN9�7�0:����$��Od/�OZ�?�e���w�ɴ�yG�_
��H��x/�
iW�}�3�2����Uk��H�4�0���y�YcJ�]@���rJ�m��4h�	�p�,.
6�,h��P�����j+�����1g�W'"_�v�
�vwܟO���=P=�srg�L/n�n�2�0��w��*���}����4�׫���N�|�?����c�������>�B�m'\+w�V"u�lC�f�����|v�<�.8��jTC���C
�}�	�;��Rz��y'\'Ǿ� ^(�7�M>Ic_����9E��֭���d����k���d���N��3�y�<��w��>��Am��k����:Z!�����]��c�ˊ�?��_��_K�ޯ�:�� \!��@�⻞
Pۦ/��o"�z���U�i��:���^��d�jõ�VD�ḄF뚓��o�S��Y��$]%K�4�{dљβ���n��"U�V�\	���R ���t�Cp`�E�9p`�A#�c���h�:ryX�d��'�:�my
�d�Uq��P��a$�D�.�����:�j���4<Ǟ�~�c"4*��*G`���ն:l�s��Sܣs��S}�w׻���v��{�9.J{��\_.^}�Mp��3e󎍔+���%#P#ӈ�O��[?��?z�����<8i��?;���>����}����[~`��)�������l�f`�����0�)���I_���a�Flނ��f�h'険��������n�v�;�0���T�*��F3+��TE��o_�?o��?�Me.&���C�bylB�y	�|�	~A���nW�����m�ֈ�h�"�x�`D����M�!�$	��y��s=�<�%J�����/��D�Cmr���r�e?�g��y����2�t+��ȟ쟜�Q
Lk&
���2Xx7*��k���Z	�i�)�-�w�{aM�H`�j��^��������a�`�Ș���)3n��c2�w�w��]t�)�
���p�z��5P(g<��761�Q=zByxLӪ�C[[�0�/�{���W�R-}�K�D��v8���ȼ��|>�y�r�Hu�s>�糘�Z��Ī���������/u*��d�!{� 8��N�s�,S��U����%1���ͱ.~�Qwd�j\:L�.��pk�]³�
v%*K��
/p�Dh�Yb�ġ�M�_ɬ[�q�������H���.IK���\�-tU�
%�78p�{w��"�a��+d�Dt�/��6�z�0cF/��3@�������3�^��p�<�.˴�$s�l=���G��Ybɂ��z����2�&�����No��x�� �c^ҵ>��L<`0�O��R���
�%X@�́.Jl �&l5��P+̭��7u҉jt�r@i�J/�!^��5[��l�B�1.R�X�s����O4S��,�vQ�ˎ;���L�DKu�2P��|�q��QgC5m����`�
���&9�xz���Y����%���va���^qB�D�ws���{���y��
d҃^Y�8`PV�eTp��r-��|M>����Hm'Jl�G�#t܁e�8��}~vh̀��Lp^��e'�H��߻v"���._�)��(l�xL啰2�@$*d�O�l�.���n�䧃�g�>ҹ��Z���R�͆��H}dR�/��N�z�Iewݼ4|苧i����e��ؠC`�N"�flցA��m��o	�"��1n������.�L��l��A{���jʽ�3��!��1J��P�bFO]PeL��k�����)��j1�S{>
TdK�I�#�
h��%��,�|J�k��Z/���.\����X�~ϸ��*��*
������z���@ߖ(��+�v�x3uf�o��oF�z�~��?{{�:���G�9lG�]����XŒ�o
~C�ǫ�{�f�������$�H>�~�٩�~ǷkX���S�uH����:�.8�i�?�������oo��I#��t�����{�]��'��Q���k�t�����<�|�7��x)�rD��GN'Q���R����;Kd�:r��H�$�����R#U��O�{�F~eYSj��>�:��.K���ʚ�HF��̽n����=	c7�G�$ |T��50��"VT���w�0?P΄XrJ?��
�|��+.�b�GE@�i�Gj���#M����KQڱژ,s�@��B�$ �)6�:�	�O�#r��fh?'`c�TV���}�`�J��]�N�i\�����;-���Fl��	��GOeq]B�4�hR �U����D���%M�*k�`�E�^m�gp��DVV�/E��9�+i���T�:2��m�㶖Y�=����S��c0A�C�}k�N��V6�@]M�fL+���{/'��H��E��W6�j��Δ�V��.�9ڀ��Pr>}����tw��<:�
�9��y����Z�g�Wz
��$u�E)��Qh(Fj0S&.�Y����[�5JЄ��XGי���tl�čVO��0��X��(Ğ"��F���Ӗ��ґ����;c��>�e`���ã�Ƌß�I��Ζ$|����%�'�k��4�fN$��!�k�("�{�L�w����|���B��q8��B�:�ڇ�d?&�xu�J�4�V��<dL�
-��h�p�8�m�7	�J��A_/ �C�4�*�������7��
yw��FqwVPO��_����]���&��(w�)g���٣�s.�DHAU�7<1F�͕~#��=�z��N��Pux5wݏ�������N��һC$����r�� t}�'��
A�37Vρ�]I���?�V���QS�W f�A�w����k�M�y���T��\Tɼz��}���^.d�q�r��Gz!��N�*M��h:M����t8cۨ
ĨN/"���Yy�kU��6^x	� �iA79r��(��uC@+�|A�{�wj��x��9ơ��Â�;+nm�o�\��Ô�`�p@<h��3�&��x�K�kM|@��V��6���b�:����s+h�@�[��5��Ir�i6�:�u`���q-M|�友t(a{�
��ϒ��q�Y;�+^}[�k#�+,�ˎM�^��\XNi�tGю)�&��F�:#�C�c2QF���(�W���Z6�2;����O���.7w؜�bQ-Mb�fLB��V�u�j�1Ըvy�)B�i�j�~N��b���hv�Q+�[��O4��(�N�$|1i��gH�5�W'  W�5�	LA8ZKIL���K���	l9�0���Kuy
��Ž��x�E�
����FC�-�.����뽋�953,÷�c�&z����^�'�HEN�K����Қ�
���j��l�NylM���Jt�ߴX�h��^�I�bm�fj��0�v���|��1* �cåntlAF�eS���tZ$QQ��825F��A����~�L�3
�@�w��`�P�Pe������O�
A?ZW�-CA��7Q+5�`�H_�\��`����)ĆPdz5��Ƀ2M��0Ӱ�������?D�k�p�iu�ߢ��Q�ҥ��BP��I���LGI�};m�a����,�Ն+׌�4���j�Z�m\�A���+�%��ME��#��@�X1h�x�9��#U�O��p�A��l;���A��!�A�HV���_�cx�U����.h���B���M�w4!A���C1�"-:_��WO��|�Ļ��'F�؜D��r�l0�^�ڠpB6��ז+`2X�TB2%k�����!�^0j�)�(K���Y(F�Yo4��\L���܏�td�p�V�6_1%��h�/�?	��@�޾ :h���C�,^ʑ��~t15��ba~L.�5�4_[��"n�[>mZX.�F����y�HuI/7���D�
�2���z9Z�>^+G
���q��y���T�
�
sA%W�
��,�(g��X��V<CCV⣄�I�����A)�w��U�fD�H�4���
i�ÿ�_���br��G�(^R�}��}r)�r���+o�Q�f�8��P�qHHo���X���L��n�����\��i��0"
��E��:���+�[��Ԋ���R/X��e�l2��ǀ)[��T�50�z�>G"_0�^0��M�m�p�2�K�������V��B	��f�Mۆ�R6e���\�:���"�ޯk�[h�R-���R`���c��5��9�Oa������5���$�{YIi��������?�x�
:��U��.c���Yov{��jg���ب�^c�49�����Qчz�=�xTl�q��I(
��e�Iٛ�&�T����[�#ښ�~�\-/��1����*���Bۇ�}�VX����3�%ٍl%^׭��*�č&P+�'��4%�#�-�D%24�Kŏ Y��J�����Y��ƣ�8H�Jn�>���'/1xlGL��Y���D����c�,8��sȉ�ˋk�D�b٠4L�^�Bl@H��u��Ih�'�df�Dd��Y��c�:��C+�ed@�j�B�F �E'�\N�G��+L���
J,�󷽌P�N�eR%s�
�:FH���tv �x�j���H�ɫ;��AMC`�鄊�e�d�ڻf�Xqc5[�Se�3�����<�%Ő1����_M�����f�ڸ����-���̍�OJm_Ӿ�:��S�<�㿲P쿘E�A]ǡ����S�X46nۀ,�+�T\Ze�1��n|U��F߅�����k����:n�H�sE���ُ���?�B����+���F\�C���F�W�6RS�f���n;}���4uJ���7Dսx:3V�j�Y��;9���{j�pO���	_P���H����
�ځ�;Z>�wK�d�;x��i��I��ת�:�a�q���=e�j��mw%��(�:U�
O�����hb"ٍF�(&`7K���*ۣ��(�-��d�oӱu� �t���a6��j�Bo�^7]Cj8u(�F�ն����8"��u���K��<k"�$ë�'�t(t08ssZ��䳛1��5�d��pw����1��ӰD�zi�����>hl	�xe��cI���*&gz(�ƮN�pd�	�=�p�}�
�����y��x��.���r�:Cr0��G#%���.���Ȍ
�<1&]��jugck��#g~܋���G�����A@�S��I.0�Л��W�x|��F�q���9D(|�����@?S���d�G?D����9�/z]��{XX2߲�S��G+ᷳ����9_�_(q���H~L�"�M��e���\�3�$$��L��!q��bWvd�ޝ��1�Q��Z��G��[QE'�9	L馊s�Ab��i�Qv
P�OǝnlB���h�Rh��E�'�N}�C��(?x�p�[�
��艂�хi/��$ݯaE�R[�"�&cK�F�z��&����,׺��[�o��×G�W�/-!���}u���v9�ף�O��L;��s!�Fm}�`)4P��&���t���@`J,F�d��y�w����	����VW��E���]P��9���L����(��n�1~�67�.
�����F�N��n�XwE�69�4
L�@�enU�"�Q�a��)d}�_��QX�S|9*�w������]�s �Ã1>6�_¸�+~U"�27�3��WOEGʘ�II���*������/�*��M�}y��3p�𡁻����W�['J�|{tf�^�$���>��h��萖���g��)G�o6�r��) {{K;R?̖ƙBR��#$�!��K
c��Nm�³�7)G�T|`�.Qo��(!_g��S��r�J|1Jݫ<��X4?q���:V�<nBQ�	������z�O �jg�@9̓归n�,t����Y:o��_�~l�<�3R�"9^E�j���}
��o��WR�:�#ki/��]ڻ�_(�r�@k�V�%���<Ә��|U��(7k� �@P*	a��L�j�J�4�DEQ�䑄;�j���ӯ�B��5l�/a��~L4���z�H?*���_/ vm�����Q����Av�ÊE��Ϥ�����C��e�6�V�3酕��v��T�v%,]u0@T�s�CC��3/pJ1�%�y�OŖu������:��\��"�������ւF�m~rO����=[\:0/_'Q�~�����.�Q�\���lڳ�d~�W���F�(Hӈ��3z����O5P�.Ug�:�|r������q|����5�������6�ZS���	��ѣ��b|G���}�4��h�ѻr�iԭGgU4���P����1.����GQjGd$3��6�S@�zē�}�hˉm��p�����`C�g������́�_��dl:O@ƚ��8��Y\����d�����
�����`l�VA���F��[�ND��iFb[��d�:��bL�@�)�$��m����<�C
'��W)�H�^���٭V�..�[�^�N.J�$��>�j?�e<A*�6g�ǐ���e����ԏks��Vu騨��XbS�I�7t�����8��۝�t�M uv�Ͼ*h�+��E{�;�Be���|��@�� �_#M'�
/J�K�xw�(z~x
)7 �Q�2L��͙�)\��<󷕴�����s~�"j8By��Z��C�&Sm��O��a2��QY���H{,���d6����t�a�]G��'�����M����Bc5���Y������$��`gΪWk���V���
��.�t:�%���3�����>={���T=˒j�TT�L�K��/
$�9�+i��>ѧ}���]�9�c��žA.�Q�A�M|��l�`%F�샏�:�?�
�G��^���hH=�N<�P��S�D<*<t�W�a�V6M�`�n�Mb
Դ���x�z���;�_�8m����y���d�uxA[��
�Ȓ�F��k2����y*7����V\���1�����WC��1$
�4B�B2���1d��g:�H-@,�V&ү�W�$�`�&h%�����]�"��G���у�"�.<=��
gJ!)����Y��;�@�L�.��ԅ����=��Q/�\w��!���q
���h�G�	���?���ٳ���k�|Z_�h4vܑC궨DXIm/�!(]$�����
;zJGS����#��R�;�x����ʙ�����W��'��z��W^)����ӨQ0#��{��T��=Ϫg]�|`y���aiS�2�X��=1��Â����<C&�s��A%Ea�n�w��U�K�݈��/��V8|"0�/��7�j1K��N9K��/ CW���\hQ:4�v���$M7��K��M�ZX	��{_��5�n�{#�w��*K���e�}�1�Lw����\��@}���)�� u�$J3�׀}a�V�x�Em���b�n�=p�=��P�ҩ�t~�l�ì7�;/�Pj>�Ĉ�����X�:̀�!��|���F!z�o�N?x!g�����2Ӯ�7M�����wJ�r3�_�~�s��Q�܀;���7<��&VX����C�"c��a�u�-9�*��(�^%g�r�{9*�v!ŀ�$a8����Šw&��I�س����$��s��X�b֝�����ڳb�����&3E!L�I8`f���{@3X�x�n�*��l[pޅ�#C�v����lpǥ��<�͞�y���%��	:�䇎��4z�|���<|"�Ł�l�n�	�����\�}UR�G/�'��p"㠘7�����&/�"��{�����F��z��v�x��N���1����h�(�
�t�:�uK�g�ȝul`�RZ;�c��9���D�d��F���]�K��3���x�9�+�?2�+G���&������|
	�)�h�����ۢݳ���r,;k0 3ݺӼdN�Zw&��V�8�U�
s����zs)O��%g�箅G�TR*0��B�$���m��ҭd�F�C+H����]���D�[�l!:az�܌�.3�k:5�v?%{�!�� VbP���޽HȦY�	6�)�N����P��u�J\��`���-���&���R�-#}��˓B<�/�{w���:���\B�
NFː����)���Ɋ�+�+�_�D���.�q����8ܺ?}�ƲvVmF���i&�
�-������x?���G~��b�� ���H��u'�`�{��C���'������:�[�#뤠6�p�������<N�>��@ߞ/�Q��XfG!!Ҝ.�
2���:yz����v�M�I��ͦ�pxwz���t�Ԯ�VA,���ƨ���V��szv�ƒN8��=y���{ ir����*ɓ
�,�X�n�.���ۊ��;�f�)S����84b*.0ȐA�O!��F��R�2~k(�,~�Θ����ؿ�"�b28QSF���Q�4��������@���T�Q$*�!� �s�x�S
�0�z����j�Q���
/��ԆE��[�b}�D�UDvTQ��y.�y�t|��6���r���	�0��j�L����b�xc�s�֖���VߏN�~�6������A{��ur�A��O�I�x�[&m���o��7�P0�wy*O��+�'�{а�_D	t�:C�>4�׃�N[�Gϝ�;��o����,�oߪF#0�,�//����øƹ�w\�`t��������:
:]A�,wμ"嬪�3��{'0���jd�w����
.B� ұ8E1
QB�}9):S@��e�v��19Vc�cXe�m��Mf�YdZ~뉵��+��m
���?mų�b��-]8o��~���
�+�@��W���qY���e\��^n�#����^�(��@a�Ln�mf�a���63����ONa����D.�FqO���l�]���,~�F�b8�;�
Ƥ3ObN��㩩x�6�e���P۱��O���k�����c�2tV
jo/�q��E>T�A3�g��ʪN��?.*�
F׀�)Ƶv\ϓ!Ű�c SE��ý�,~�e�̰6�J����iY0�̕�D`$
˗Y+�d�Zc��6�3iDŽ��.��/ϓ�L�1�6ҩ���u渂��
�s�.Z�]���8�.i�D���Ȣ�4�I7��f�T� Hܺ7�n1Ÿ�����L�����ڪ�;hr^Ia���ڋ"$iP?T8��YۥB_�L�N]�Z��r�V�o�#LȑOӈƯ�0o�Yh�~R�Dˣ��Q�m�oޠ��Y��UuaD�g�~o	�х
�]�cpFc*�Fmk໩��U�zq?VX䞡��l��}���+���þ�xi�^N�Q14X�}�m��FRL=�Qrk�a��x�z�������ѝ�9�a���S��ٹ$�s�N�rgZ=O.��ݾ�5��y�����JWFI�J��]���3��&T�E�M�=�pxt��/o�gۦ5@�*����e@R@{��u��%]@pi%#$���D���൰�uG��
�HV���AuڴC*G�������v��^�jB�Ԅ�����uq�ɍBGa��c�;2��J�7M�:݌�3�B	�gѸ��7��D��vv3�P��vɷUv�&vٲ�KR�Q�/��c<c����I����Z�G!�+G�ǥz�މ�s���B�S��)�a�1Q����B��B8	�#U���D��V��c	)�f��<B��̜iHK���T~��:���ӻ4Gq�>�s"��g�cE\ͩaJ!P��#o-#	v��[�@��]��֟)X����[3��=�_ן�ʬ����z����k\��^���J�ia�wZ?�r*51�H��{�#������k�́Z��R�d������͝�M�j�0m,�~k���5g�U�O��V�L��K�r�x�7|�׬�D^\�2�!���{�+Ur�Q����7�[)����ަԱ����Pp6���:A�r��¯�7��	�6�����|����"
S���פg�����l4���k+�6\m�뮀�HSG5�j�^��C���r}���՚��G�H�ɚ���
9�'pC�ǠC��:L\����7c|�b8*��w�4�ǩ�V1��q���(��Q�BZV5��
��sl;���p��:�߯G"�RBpv��Z�d�}BZ� �q���X}f�(U�ه��;�2$(����+��e�}���ǂZ�M-��܀�ش.���EXK����!U|��mna�yNK:fQ`/3��A�q.m�h���.�d������n��.��5�6?�GV�ß�{xlj��'�{�@%����(�e�zAv&&g(	8`�НPNo��gՆ�@���D���Yg�JY.���i*��#Dgz�+�kb���Ҍ�a)9�.u��i$3t;:`@1�#0J��+�<WX����Hn�x�d����G���
g�mLS�`�xKW�,�C�EȬ����d�~�P�m��&���ۣ�,4$N�8�o�[p��5��5�V�����⿺h�cW�����.3�.'���ߜ��!��8��?@-���e��;8~����� 酼-�Lx�8ly�~�d��V���5�&N+�c�W�ȼn�ܙ���a���~~Չ*�
E��x������
t��d�!�l��۞Ǫ���
��bW�;�a��*>`�D�R���)$�rt�'��Y.�X�f�6cdf}�px��‹4,��9F�{6#!C�q9`�y_�q��I�~�`I�Uvrr�\b�\�$a��1%��cq�˰����H]�Ǟ#�NRj`�p,�4'���/aD�;v�I�F.o�y��zk���	{(��\5¦�žsancT,߁1m�3�<ެ�eLnY3v�R���.al��0O`��k�Y��y�@�d`F�tRc����#{�
�S�G��A6�����X�8�n��[�$�H3�����.T^/�Q��#<��Pj�b��ȱ�̄C�\�r��Z��T��®�A����"=�c��R�HtY|��2���IO#?�W��i��6jn4ˍFTڨo�Z��ؓ�t�:T��,����ױ�O����ng��`a�en�1��d�ߑmj�����X7��v�
��<���-�����I����|�eA}�u���S@��Iv@��:x�ޗE�a}0h�M��?o??<i�9��q6�S��y���<~��=�2k/��'h��ar�ծ��)U�R�B�?�C�s�Z}�l(Kf�Ns��{��������}͚�e���Nf#`�Aq���s�c�V���_0e������NqVmgV�:��7���CA�/�z��F�-�WS��4Yl�։��l��:M��5ޮ��o�f��#�*���ӤmE�R��S�[Qk;�p�ɼ���z�^2�4�+�|�GR�W@}��m&��b�4��^q���l����pK�+��݀˺d��>�P�<�B����[���K>پU�[�/��)B�P*�z4�\��S4��Eڰ�KQ���K�(^�C��M�2���*�ZVmO�kM5���1����Dd��,�o����ј+��ؽ��bC�&m+֚���/n�iȲ���s�E�H]��#~Zt){An.�M��v�7�h����v.��qnBzME��Inp�Y�T��rK	P8����~�l��Tʀ8�m��N�5�wL��&��d���yn*Ԯ5mF^+X.��7H���Bs�=ϥV�>�<޽R�w�RI�<5���Q$�Xy�+�r9:3��*x-�A�L�ٸ�[�J21��`M���k�T�Ց�
LDv;+(�
��n�4�\��`B�����FIT�TAj⎘�j]D��Z�˅�_��n�h}���m�V#%���2�B�A���N�ܝ�,`-�}fq��Py�@�n,��0l�y�"^[�+
�_�ޣ�Ϸc�E��i�_��¿|N�DŽ��&#Z�#���OcA�硽]��N�ҶnK�I[�:T�2�Ջ)m���Eժ�k���ߓ�\���7��ӿ��;�A}w�%,�<�����+�d=�;A�X�%~/���
�
�D��
�p��Ǜ9d^�*��B�շo�F��� ,���ysH�㾫���xǀ��pǐq5P��U�}�C4���n%ַ���zTڪ��M�Op�}�+dj��V�#�ߎp����6@�����'�o������K�;l���$
�_h_٨7�M�������q��z[�q����W�uV�0�fm�f܆mGwa�vh�:+����,�^f,�ݸa�{�x��U�XQ����_Y-q+��/�
M(��GٗEѬr�Z��h/�G^��z^D���XP�W�Es=��f2Cfݧ�ڜ�Ywør��Υn��rk�k�Î�=�r~I[��6-v��Q/��.�5�1���ؗ".jЪ��F^4
���Ŋ�i/D��K�����h�}�7׉z���Y���Z�"p�䚎�z]�r5%�fgSw�`)g�멿��u\�d�[�F��V*h���e���h^k}��'_g#�t�`�M�>����/`�'m4�nz���;�0`o/�ӔF����S),0����m�#�W�b�W��(�w�䨶� �%�lۤ�ثr�M�"Ϟsc�:l7�:��"�f��F�����w�nFq(��J�[dd3�������Y�j�T���7NU�r�3/\��%�C=34��Mk��F]!v�V�K1�A�������RG.����}��_���ɺG
Z�a�H�k�Ұ�k!:�C�}+�'AU>	�clw$�ɑ��C�m��hR�_C4TH4��a_'�l�{m/�p��WE����),�,++�S��lK'*�oZi����^�B7$�O$����jiS4�Z�ƚO�i�N�iV�O�&�_g�/�f�����Qd��Yt�M�1�O�
�V�
r�;��.:�_[��(mon��+7��iQ�*�����N�E�A�=vF�<���SOq��K�ë#UL	���#����y���x�8
�`q��Rh�04�$�B�_���h����%r��R:2b�P�fr9E��Ĭ�Qư�.3���l��[ْ5�yI2��b�#��o��,��	iS`����-E8���9
KiE�n�!�b�d�x�<:(֬�U*Fw��q���q6!��FT�!�ܞ0lޗ�Q��Ե�-�S !���nU���}7������uYqz�=+�=�e�T.��l�!ް����l?�U��&\��$�[��GΜ�#��%���:Ļ#l׏�bv^�?(HȀ�O:�v�,�îS,��\�t�y�XH˳U�c����7��p>&~��ґ�j~P@���L}��s�R�;�"�f
\�	�_��r�V�i���cIC�)Ÿ�aQf<�ٯM�"7��X��s��%�UA��)a�z'���鎆�d����'�E'6���(J7�!�[�����.�9E*����
����p��航�;�lB7��j4��8��:W��3�`��/G��Y�$�hc@����c�������,��-n5� jg{��uϵl�j�� �H펃11���߾�J7�8�++�㈷NV�FHAe�:��4�\��(o��@w�@��9R���@�8�g���������@jO�B�N��)�k���vt� }����	�1����Z�k��q)���$+��/;J8ὴ�Ҭ�I����̣@f�L&u��C��ӏ���t]�ۙb&��[~"�U*$jT����nL
T
 �H�6��J�e:b�v��=o�j���D¥�3�㣳ã�D?�����&�;��W�%���ԫ�p
�!Z��g
��.l����'�L���aٟZxey�%�����bWL����m.89�2�	2�-�3/�ߤ>Խ=�6y[3�w��k|H�Tje؁�װ��vss�
yE�1��s��3�4(ȍ�,����"Qrqo>��8��s�@���3����3��E��H��+�l-,3��۰���,Ip���Dz�L5S.Ě�+�2���S�5��{�L��!CI�1��z��^(qQ	����?�������un�"��OS�'�ކ�-l�.E�ܝ�#�~{���%�0R��� +�m���¹^��0�_&�z6��j����KO⇡es=���~vE��.B��
Vo"Tz��:��'�c��]�+��^�5ԗ��K.�ʠ<jP�֚|}�P��bHbW�:��{2��&��zx�LEc��\3�"l�~Z.�����b$�+�(HN��z+Ev��姣ϋl�C��ޗ6�q#��W�W���M��y�<��r�Y�Hr&Y��4ɦ�1��!G�h�C8�$e'��&��Iv�P(
upl�!���oz&q�L�?�2;[�7N8���IJ��{�ߵ���
��*�+�$�Z{�#p��"E��O����_�lNh������+�
ܺ��^�!�>�$.s�+X߲
,e�37����=h>�$v>�����2�ڵ��B�Y�m����EC���~�o�{j��6g��%����ځ�
Cg�E���(V�Bf�Uw��,^g:�>Ut��3z���8}��t����?8#ԆX�5ڐB���Nu�5�����ov�ܿ���]H�lb��*�+���ݿ��%�uJ�(�š��+�ϴ$�m��wؕ&�޴�¹���jm��N��k�V;F�E���~3N/�~?(������<�͟A{�����<���7����vz��Q-�;ݰW�Vq�m5�J�R:�G�B!2F��6@�U���@�,����?�}o��(��#�6�B1��fo�ŠV���ےx��B~2��6^n�4ׁj���(�`���o�E��)�X�F�`ؾ�~�U��pk^�н��+A���#-�)�i����L����M8�~��u[���r����nt{�b�����W�Ҙ>,yE3�$���,X�<u��m8���]G���d�[\Ww�5�!N��a�ݞ�_�hd�oƽYN0�(_��F�ܳ���,����R���U��h<�[z{Ƴ���]zc�ˎ�FSy0{9���Nra^
�������|g��ۮ^�2)��'�J2�n�ҋ���T;�z=ʦU�O6�5��
��æ,�I4�H@ay}𱐽PL�(S�,:��ۖ�ř�H%���f f87��P�w%x�5����jV��l<��%�m<�;� ��e�鸷D�9��xN[��V��S.����N��=���N�k��+0��a�)�[�rT����Y4���C %Oގ@(׫��"F�@6~B�������᯦�"D�1�p74�)�X�G�{�L�x��8���s�J9�8Wκ��'C�Vl���\���l�\�&�o���F��B�ʳ��?��y��_R��(�X^�u^aF��b
h1=�������[��`�.�O�A���$���T��~v��1?hQT+���v�����Fm/C0�S*�V2ي�j�a��ͤ�/��b���(��$����rS��G�8��3�D�d��r��ݛpt
WP��T�ރ&M0��jsG�(O��HJ]q8�kl�nW�=�"/�iy�^�R��W��W��U�F<�I]�\�T	�l��y��|<�F����?��T*���X sS��M�>�|�w©U���&��mh>6'����~c�e��G��B��t�{+(���J'g��\�?}ȉ��x̸���{��6˛�C�&�j!:���U)��u�Zb��`1D��!F��@!u�gvu��yo(��iL|m��iŶ�d[2C2�t�!�O�O8ۜw~��s��70��<�g�1����5�6�L•HN�J��&�3�cT�ńxw��		��I�,Y��x�k'7��xy��>���?O͇�g߽}���p��D�{�>7��0����Z�o�,����B޼x�篯6���/k=f����u'��G6��Yg�lSJŧb����4��~/�GIj�{�0j��bJ�#��_IK��>���[���Q��6~�:�fs�Z��;���ݩ;r;e!�~P@�j�X�.~A�^���~�����1>(�}6�.Z���F��ˊ~����t\F�h!�[/�q�?��\�C܃|{�
|�~�ۇ�gG�Y�.�)���Xy!�|�����bԃ��X�
��v��gX���x�ߗE�6���a�Y$܀΀���6��}�����1:��Q4���6�r�$�`1x��G�U�0W���d�I�!	���Ѧ�g���EPRy�D�0a�{a�R���N���6aʼn��@`��b���?�SLY<�=��c<���7���x4���p��ћ���%�q(���Rዂ@�pjX/�
2&�ɋ \��@�E:�c�LB�O���)��8���,�нW�K�z�m�� f�fUZ���J)W`*���� ���N��B���.��'/rz���no&
�%�/_Qs����� ����.oq�޲�msR܏���}#z&�G%Q����"L�(��.��^M\^�6GS4�"5�eA��}]����p��U���?k�������C!���.�Wv�X������}�]���S]��u�+NѝV��f�ѓ�o@�f0�%��%9]Š���hgɏt�z�
�5�A+{{���p2�<�G��:�i�7!f4V��%�x���{�Ot�� ����DES�t�>��v7*=琽zwp���{9rg���p���.��
7"�C8�.���3HO��c�x��+���d
�ՊF�?S�
 0
U�[��D��!�{0�,��j"�+�+3�!�z��:܅�5)=��1Z$C�Pē�
4���~��?�IO��
* ��E�լYx���J ���.��ޚV�ۓ��uF��01(ks����h&����i�<z��Tj(_�4��:��&1��	rȊ�ْ���had�g�p����XNƼ�˿� �0.��6�I��I�$r�,'{5�$υ�W�R+9��3�"m͞+�tD����=�gu���F���K&]���2z�Y������<א`���į���jB�TbC^�>��/���u�S�����ʛj@�d�J�W
d/‘\�J_&�����"ռ�Zt+�1���wkh�'c?(v����ж��8]�p���7��A�d���ҙ&�6?rW�:����F��݌,�VM���
�|p#+A!�ṑ�b��^e1w.�$
{�qΆ^p��wƊw����
G��R�0���.}xzz~��
)SN)#��_�F���]�F$�,=���m��TD)|n<�M�H���k O����z�<�=t�q�CS�����3s�K�!vK���Qo<ܵg�|Ms�(����#�Sڌ]��2Nt�
{.������l�Cl����&(��mZ�_f�(�g�a8}��+���F�y'�kFV]����p�-���[n�*O=3b��i��h���qљ�Qz��	I��Fp��Yo�p%��s2^fB*�u��.��-hruTV�$缥�t�w���04R����LJGߊ#��ŕ�fd�$2}3�������^�$�i���7QYP�Q���^�Y��\ȩ]���?n���E��4�5��G�p��f9��R�VŒx"@��Þ��Hƙ����m�_ʹ=�|1�*ƷZ�f�e�l��1 �׃¶@tK2gЍ2���j�����CZ���S��Ɗ���bv#��xcMH��F�O_B%��϶D���c0(͢��O�簎<+=Ѐ��B��nV�����Zr�_�F0�΢�ܠ�vF�Nޔd-DBSG��KC�A�Tڢ�?�5�?���(\˪�t{�rz B(Oy�`�yQ�<�<����Z8no���z8�ÙB\��zU���o n4��D��t��	2?�b��9z*V=@tI~3��W~�V�ŝ��u�1w�b�AK9	����RQ����#7B8KE n�c�k�A �z���dC�<���(J3�?���r[���N��N��6�U�L3�`6���hʼ�c��K�[+]����֖��ڢ;yH�m�ي�&�Y֥���fe�j��ٰ�<m__^���b ~���E��xՅ���Ua��([{0L &[6���t�g�헖@�F�NKx�1^,���B���a~?�ӑ��G����/ҕ��&�p0�u6�w8�����V��!��[+�{�5�grg_gV�;���[U_�ē�=�3�O;��ٌ�#]tL����yt�Xk@���Y�W�Z��
�%�duV�~J�.vX���L}��.m?)IcIGĕ�FA[*�P�6���(O8�QF���u@��e��W� LH=��)DJ�.�����:D��Y���%d�L~(�2��oC��ͬp0��B�G����b���猃�b�x1�G䬺��G
�9�zx��=��=���/&�"���<@����ۯM�UH�zE��U����0��2�&4���T�����T�gk��l~A-���>?a�Tr�ܹPW��1Y����u��[Oag�q�I>#��Ay�x�t�
�<H�=��#~P�)~�EB��v���V��w��:���*'u<��R���\��J�?*���V)S/$���t�6�j(��/q7N��ص0��\��m���Dz#;�ݚ>� �~.j�^OHc��IҘ��<$����oΎ������h�i�h�Uح��|���/?G=x=)�	 ��k�K�F)�2��T����9*��@H߬v㑲���=
:i2����a-8ﮁ��q��@w/���qG0�o��;k�5� ��y�{ݼ�	Sh�d�H.�Y����v�)M�V�օ��jr���xng����yfr�C��V��"�JMY~�c�k�W��N,�Xv�-1(�R<����� %A,(-N��

d��Z��Ŝ�8��/�GW��^_]�eD�1�f�m���8����*�)���ฎ�iN�U^)�@�4 �y��b�V��9@z�
&�Q�/���X�^?>��W$y99dc�����l�-c)�c�
ž����7�X�c���e�Sq���W���N�Ƣ�$[gtY�b0�c��Q�T�T�!�r���x�½Ӛ�V'��Z��U���������!��8s�"$�._�<�5�L)���F9tI!@����t}+^ͼ^��L+��3яd��U�g�C�?+��ф�i6�:�.��<Ǚr�9�p��rsG�df��E'��Vve�WVv&��fJnN`�z{8{���;&.�����h��������$��&��I�Z�y9'�S�j�,����/�7	�3"KC@W�t�^���@����Kb�
���1�2�����ٞR"��3�$��V�O�����J����0���F3��_)�T(�T\E*�3e���M��Z/�Z+��lE���n
��|�z-�KF�֍P�	��2�,+�*l�Յ��c�Vi7c��DT͒-EYC���?��y�$B�������+e��]5���
o
��5nӽ+�H��`���:�/�1
|)�afG6B�E��z���ZdS�EB꼘�t�����bߦl��|�����◲fmCZW�g��c�OEUa8e���	>��WX0y�aB�K��*r���݋�&*fit� ����teo�9��-�y'�4$�X_�VBC������}���S�˚���4�n=�TL�q��������oH�����3�*����gm�1���a��H:���K�FH�P�siB�n���f�s���
؞(�X��q���HX�����}	�wDy�{41S��<U@M��������E��x1�;����lאi)��n�W	%�2��,��"�0�N�#
�U���u���#���b%eʉM�<*�a�I)�nQ����c4�h�-fzg�^ɹq�[�
<�����7r������C�	S�h۩4$k*T/��tЉ��ض{6�:�̹ �=��_ڹ�gmqRy���x��4�^��6q��n�{r��D�fs!�W#R��3�ch���nӊ+&��#����[�<ߜ]]���:~��:pwY��m4���A�Obu27��mɃ1��Q��<JK&V��'P���bW��2��BP�1�PD�p �!��"J�x�>��C}dOZ��=��}{_��G)��p*Ȱ���n)�ľa1�3�r-�~�W�F�Z�z8{�Z)�@qP��/l�3�� ��l��M�Y��s�
�CF0�7�O��B^3NAa�X�pB
s�q��l�v����o�=
�͆1d�� n���pM�l���8�q��S�4$7l1L��3&ں�D n���03�F�F���+#�<GA�a�(w�*K�o�2��F�lC�������l�O��θ&�P��u և�
 D���V?D>{��v����
>c_��#�9u��MJ=�{�L,R�9$�ǝ(���p)兩�4v�
��7*�<ଇ�c��kٯh8��P
;��qݛ��� �w���w/��r97~�V^��xE��9���nܳˬ�V��UH�@��)�W��-=���A��D����N	1�k�����.m�~DQ�Ô
Z��ZژR������6�������}Nڗ��r�'�e>z�8��Ƌë�6H]0�A���yߖ�C[H�x'���t�Q���u�e�l��̍�#T�Oή�K#�Hd(��9*���A��;;q�~u��@c��o4~
^I�S۰�:��e��,%��ʒ�[�q�8+)�2J�;�ֈM���	���#$�Zn ���Q��	[�����\��(��2S72G�U�l��@�WVi÷�-aư��̒�t����<W�@`��"+`�(�Ĕ����4�L����ydw��I�HfH������`�Y�%q��ڶ�=XN���pYf�[PP8�u���BPb!�3�$!3�B3��;cz�����ƇL���'��qn5��3��%B��`ݣ�.�]a��-�j�~���ν�-Cn��y VCtըR���.��!��N����+yyk��W�ҥ}��*@9����E1��&s�f�f��V�|��F���JUj";Wlm�ad��є������ f��@uč�x(&��҆���!ƞ�Yy�E�\%����/�&G��s�q�4CQ0����װ�P'^_�|wxu,D�0*�i|΍��f{{��4�h��Q�N�h�IEu�vl���&���h���c�(:k��4L�/����,=7*R��k���+����7��F#�t���G$�XEVLn�
�y�fC�y���&M�bFc�"��"&�
J�n��d�Z-րk�Z�Z��@�C7xgv�B�`ˉN��%'l�'Ҧ�ʱ�J޹������O��j�;���pZm�M\�j)7�b���Wz%I��O��F�Ս��sV�L����p�7g�;��6C�”�L��+CO�v3r��xV\"}Qk8�U�;�$)h	��VM���T0���&V� �[������R����iF���4�­�D�b��X�/�\�݇`йϷZr���C��G��Jnb$E�{�4�6I�/�:B�s��Kd��sV��9[)PW�wU�Wa��k�\��u���3��عg�8z�pG$�G7�
�=d�b��	�1����/�|�J^Gۭ�#J�m����I\��G$N�,Q��3Y���A|&^���a��!�-=[� >�@i��Q�8
|�Φr�&I��}�f��i��)#Ut�������ӓ#�)�� N���X��4��:`��ӆƭ�܉�M�Z\�]D�:��f�|lF:Oy��ł��wH��ԝAĞ@���"B��)T�3���Qic��e+,*wn5�
k�%C18ـ/gn3@8ܻp����Q�<��Kl>��O�,X_8jw���6�,s/�,?�,쩂�@�b
*�m��T��Y:����t�A6CJ�0�U��1�r��@5k3P ���.,���j��넶t����^he
r�f߻Mr����:/<H=:S>N���T��lG
�ŷB��D���z�mֆH�"����2r#%�~����a��R^a^��+"�A�=̫�
�O��x`X(������!G�^�O����u�8��q���O�o�''�����w0���}�����'-�xB�oN�����V$�H��mm/�ц���]�y}|!�����Ƹ�yL�>s��mKц,:��^2:BV��i�v��C
�i{�f�=��*��#���Xp~()8��U��V�.|�ugTU`�+�C5�?R�,� 
��ِ<�}M;㙔h�
Vx����l��E��j��}4
:w���s6Ww��u;o��(�x�AN�!}���T���l���3��jg
�%�/>�*V��FVQ��*��}%BjU�_c�0h_����[B�%�Z�sy4���k�Z"�l�6��#Q�BY)��`[��Tp�*Ն�����ַ�ĬR�[ �^j��L[��k���,�U���25�U�=�i�E)��j��d�yo�T"��ԀԪu�?#�N�C��qlԙv�d@���n*�[t?�MK�:�8��n*�_�G��Lr��"�r���c����,
[u�R$����?�!1E�n��wo�(���{��=�n��jB�We�[U�
]�w�$��*n7>��tS/�魜M��ֽ�0�e�A@�sۚ�t��5�^u�w��Llj�+e\{z�;3�>����r
��Q~�+����ȝJU0�G���CJK=T	�[�j��	��V�լ�����C��z(�PW�pK���}z��x��q/�q���O,}"�Њ��yْ8�����H�O�ʇ��'��a5�8�*�@�f��?J�ɧ� ��U���շ�/p#kA<M���E�ۡ�R�[��	X�7��j�v�'.�J&�ܲ�1=_^�U���c1س7�����7���b�fG"��K����=��]f�Fu�J��B��lNf7��h!wc��ԉ~����m�jY�E�~�e�WZ˺d�^g$f5E*k��!��K�uA��#J	9���X�b�b�),��M�8x��eM��/�؊&�"�O��
��.��[�J��ݩ5w*-���Ғ��߸�P�e� �GO�
���0Cy�E�[�L�C"Ѻ�P�a��H�g�k��I�K�j�@���2YQ�\�B�U��JlH���B84�S)���&L�)o���f�ڬ���r/���n'1�V5��S�����r��,/�%lr�Pc��)#�������!�y]�'�YN��(*���"ړ��i�6���Rײ���N�@־�0���C�p��K�������4R0AdՑE���M���EM��ZiN�����&�BV�c�5%>b�vz�y��p:�v�.X��K<�
�Q"X�s5g�]�17������!�~�{­nl�C�Y��3�I3<K�a#ȁ5�2҈�_9=%���*��V��zЬ����K�2ÖA���[V�-�Q�� ]�7�_��xyyuxu�����,�ـI��[���pT��*u!�7[ۍF%��Uyũ�܈���� {��n�9I��x��=P*�y!��QIݡ}{ܾ<�����N��yux�W�f���o��}Q�u��<Dj�u�ϟ����Ot��+L�R��<�T�y6QH��A�^e�X���[�d<����͒t�D&�8�&�#��|�Z`�1�.���޾EN�qcCl�4��&�����0F�<1c!;Qq&���Jo�'Q��Ue:��o�<��"ÆND���Q7�Q���,�vೢ�y���jB.'I���b�� G+&'6H~����dudīR�ӂ�z+P�f$ص1~2Uv®<f݊�ӹ�b��F8c�=����4�+|4�7t�C=�a�/p������O
���0l��;5C2��/�g2����D�d
�Sq��H�Eؐt��n�3�Q�w"��DDrA��5�3������T����X��'�V�����K����_AI����s{EpdxU(�Ki}(��l9nQI�a��"�b4�E@��gy�Q3W�0|�u(�$G9@�a��ׯ
�'֘�e�e���XlX+�b�?�}�p*Ĕ�Y��]l��\�����e�z�3n�nKW�O���w�aJ�`-!��Е�=X ^۾�/�OM��Bm8uS�l�]k��Q�l�f9w{�A+zLkR��f[�#����������3^������b{H:\�J��:�ޝ�}Usu��
%��@�A��v��
���` )�pue]�M2��Şq3^̙�z����B�i�f�4�W�����b%,��=ۆ�ϟ�b.������qxxyrv�B*j�Ϯ.~�hh�I"���y5Frk@��~���u"Zbh�
��'����;2Q�ޕy�Y�@�t��,%��F��浍J�X��x('��_3{�7���l�ȅcc����т��@I�^BL�D�i2:�c�I�J�Qg�b1�2$��i�[V����јbQ=Iҏi�-�<STi�5G�E�t�b�ܟ�*Y���b-����7��wW��x�n�޸�O?�X�S�P�9ʕR>j��YC��zEڧ��YmW����ӟfO�a'���#�]��bL�c!�
���!]��ۤ?(��B�ヂϿ�����l<�eKG\,�X���k��7�E96��Gi����a]��k~od��0�Ms�{��"��Ɠ�U��e%��v�Y�����kYZI�!W���|޿��T-�v��ڳI(ξ���Ϫ��r�٤^�~���j��Q�V?ş�٬7������M�RoU��U�V�7�Q��c��-@Q �����r�޻��?�g�:��4�C='cgԨmw;�ry;�n�j�E�,K�M�OH�&Y�Ϛt/��X�+E2����Һ��D���dy��ᅐ6_�;+��y=rxqq�C��,'m����M8�B�وl���1��W_������S2[������5��Ҟ�v�z2�Wv(�=�u����8��W�5�Rӄ�5y:zQW�tb[hc�s�u�0�C�C�=V�2J�1����+	6�*Hu0��y�ϟW�Bg|v��z�����Du�*�rᢧh�����C���+UX��w�9�3E�w쵃��L �u�lcͺ3�e���OX�|zz~�>˥�	SRSb�V5d
�
�����c)O�D�S�,@�h4[L����C�+��X�.e��4�Ŕb$��r	qV�fF�n8	�?r*���d�S�5��x�Ux��1.EWYbȲ�_��Z߼��gQV�<�sy���!�U,�p��F<�����S1���H������x4���=�C�^�T1�b�/��%8
���σ��.��B��mxI+�+jh�j�2��5K����z��wϩ��z�͊��!�YUrii�L�A��\���JRW�$�i{�J��5fWLu'
ĩ�����a mo�x>1���X�]���e��4�B^�z�T�n��,>�?�&�����@�ƢU��!����5��P�
'@����@6B��AB��]o��ќ ��` 蓞v�3��F<�[�� �b��MTV
s�{��5�BRߚɒ|ܫ���y얩���q�I5��V%	Mj�w�|�#�tA5aw�l6ɗr�k�RI�#�BA�[#�����	T$�YvvZ5�t�a��	�(���%d�g���q�T�uJ������!Ð�oh3�Y�h�뿈���䑕bp�F������m?��U`���S�t�:s[ɨe�#�3��oI�;�3Q��w�9�6���iZo^��
��x/�8?�2в!�hl�NW�I(�xa�kU�D*Ғ�<�ݏ�xg�s>ώ%�<9�47��d<�k™�A�{a8 nZ�C`8E�\�3p6IM[�$H3�J�jJB�d
���v&ܤ�f�?��g@�h��
L3̵Wz/!�]@�N��f�聳�r�Q�L&��3͈?v���,3��=R�T��)N�P�[�\G�Ƹ����#�݂��x�WA$7[��Զ�USB�ī��F���Ua���e	�x��8��x�K;]��F�J`�ܣ�|tp���;����=+��LdϤ�2v���r�w(�2�4�m�
�bof��R����%)@)���#���T��(z��	hkS��	���nOs��lhA�}�1�MG��`���o1�fL���M�ZU@	��0�C��y Bf��m$�·K�O�
>$Oa�샿DeBguPZ�kR?�EivG�p=�;�N����E`1g*}��&y��5�O;�E�@�.��M";����:��"ZD�M��e�
������+2��
�0ѣ#��1
��X�3:��C]!P��
�!�T�����t�1� ���EK��B����٘Q�o�,Ч�����-��/Q��J�蹜A[՘�6z:��)O�l�s�9))�9nv���:Kg�#�-ɭ$om$���bu����z��n+��Z;��������9����E��Ez̀�kLN
�h�u�ٴ�E�H{��,��%*���}�S2�((k��mW��ґܑ8W(I��������X�F�D��da�/E�?eiT
/I$�� �F	�k'�֒����d��蓁vX���#��/A��^<TH*
��s��d|��xu�=��R0Un_{I��-�t��+�?
@�5��d�#ͳ��F����НN4��@l$��Z����7��֑��p�rvmd��R�dO��™�Gp��Fi�_V4�R�y��1̨"᩾�֫U�ب�-9{}3��O�
@D.c���]
�@K�'i�a�D�� �Jc��j5#�t<��;�Jŧ�dC������2�E��bƢ3����(��ƣ��1�+!ѱ���X3H3���!ظ�����c�hSA���|�`�!ު'��.	�P"�IK@4~�tɤ,
j�������/�\g�F�qj2Rg0�o_�5	z�'�=��%�=�-Nj=e�����j��M٩��a����
�w|��c-m���_=��b�Q�88Oayg�����?}���ԡ��qX�m�Y� ���Zx��8)1>��'e�4s?S��:���91v[�̒
�Y��͇p&�6\�|	tO�0�(p�,=��Jr&�b�=Jj��mگ�7�_��;�Z���:��iۯȲd�"��7�Sj�G��2\I���ͦ�.ĕo�� ����ڹCYْ��|/�<�׆�Z������v�YA�E�Qk���G�f]O��Y���+��?�!/�s�+�YK��+��(Ύ�~��_�`ě�ő�LJ?u�E��
{.K���d� ��+��a���v����<����¥:+QcZO9鿎/�sb
&�鑡x�H�
�9Q�t#zÊPG+�Ԣ5g��²Y.$g��LK�����[A
:��fc%�l剜 u�c�_�-&�Ԋ�%�}�hK�?P\-fƹԂ��H �nzG̎t��w����ܵ��Ò#��a1��{�wVH���җ[a?��ʞ��2	�P 8�<@�y�}�v�93YI-�>��U�s�"�d祧���^���a�3��������o��ڌ���N�m�
.�L��E�9Dr!�{�QW�  ���h~r��|�Ӑ�8�x2��ד�4g�w�x�vq�����ـ�>8Ĵ�9j�����U�{���N5DM�f��f�ZFn:5�I2�Q'�x��q.ϊ�#u�D�~&����5u�M�|+�Z.�9|ik�\J#��45
L�VHc{��8ܖ�$Ά#z���<5�ӛnr�)��:1Dz�]?��NH�{�qo��CQ���[
��ʐ�06� �(N-6��v_;�Q��a
��=��i�;I�N�lbh�T�Z��
U����6<%���-�=����ڷ���U�
��>ķnژ"Nx�uSV�V#���t��$	���-�J���
e�&�a(�6�0N��,��	T������!|�R�����FA�FZL2�|���"3US�[,�c-ь�q�*I])R���
h�=�ȡ���]B'~�)g�]��J&pI8�,�W��1��╏$PI�	���2��>1��~zy����"GN3F� �`�15�����y�=����%2��������^�!>�ï�:�r����ErO��?�۶�7O��hL)jՊ:D�w),��}y$�:s���(s�p#k^?�-F�C���B��8�Z�gJOpT�O����43���
1Q�ӵB�V�W��q�qO7	˷[y�H�v��Z[��)����0��{����	�^����ܵV�K��,��L1)��كX�,�z��$�mO�rΦfY��{�dq�yWZw�``~��֯�!�Ѵ�-~�����̡�ĸ��F�I���#���5��JH|���N4�+--��l�FQdtƴd��6	�h"U�up����N��2���Ʀ�i����A�#*��OAj����,�r��Wt��)���O�/2��v��84�+�@#�����Ө;ϙ���C</�~dx��+ZS������8�����^@)�ʴL�2]Gv0)@�U���X:A:B�hLy��+6��P�O��b�y�%6����8l[Y80��3��a�J\�J���a+�Hb4���UI�a�Ǣ���RB�i6jJ��l+�W�����

H����6���Q9��T���qy��VZhnW\��1.�$A\�M"i�D�l 2GP}�`�����q���ZT�h��+��P�j=�QՖ��.j�n��D�z�Է*��W1(�ѡ��.�@G2���e��8q�B�R�l�EӉ禩�T�b�Xa-��D%
6���Y��ў-U҅'��jri�VVX��������Φ]"���ȼѳ׾E�r��KY�d�dYI������3{�,�����"��FJ�R�Ǜ�wɸJ�I�x�#ʸ�U��
w�V��
��ڴr1Z�&7Bm�ۍ�ڕ���M�,BK������):(�m?5�٘�3��锡�-�~8��<�{�������b�ϳv ��SL6��0P��u�[c�k
Бw�rB&�a)Iw�dH��-m$q9IǣAcm��F;.�cgFeX�.��Gk&̏D��r���/F����j5un�5(Ί�u���c�swo���SV�LH4������炗�Y3�f�4W(I���� �W�y��}<ٳ���jM����~�M4����d\-�\��L㩚�����2™�̛@�T�
Nm}C�RuuIJ�Gb\p�H�(Ga!�V��UotM�(`Ag1&��i)f�x2�?q���>�����ۯ/ί�?~��7Ӈ�~�P���PO�;�:^>�E�S�I�E�|��ɑw���k�k��[?ՠ!��r�k�J�%���߃x6簅�A�>���B�vJ�>K�g{��N^�������J�g��~�
M	=`닊�ۈC�(�Z�`�,��I�5dk#�����Ȑb����$gY�b�8a�Z�.��<Ҧ���绒T*��������x*+=i�ė�V1��&o��� $���E�ڬ���>t�	2Hz)�%g������W?���>=�h���j�E���
vvᆩ�Ӭ��s#�h����%���i���-�?Y'��5�ʲ��]օ�@�� <a��o�:��t_�8�o��(U�JG�Vy�HU��z��Jj���%�#�ͪ�RFb��N�}��lߜ+\x�!)�Z�3vn7�䵠&Ӻw��iϺ�`�W@O��W���(�}Dc�U1�}��SWe:�<xXx��
Gb:�g9*L�6+��b�(��|VFb��l���>4�~-���S��
0���NW` �HY����d��y��q�ŭ�
jyۆg��g�==&Y�dt� ��pf(^(�pۙi<�G��{pJ��١���[�j�\�v�a�	ȫK�K������_�͚���W���!�s@�2�_� 7�W��GL����3Lr�x*�G�y�z\��be��'�<&ۚ���S��c�Ƥ g�.�|�2���ëo�|��$�߂���Ǡ�Te�q����a��K `��af�g��/��㳣�b�Y�E�WB��8��:0D�7nG��H�(�N�z����OɄՋ:�k��e3�%�������&��t��xd��xu���'�,�
5x�H?��>&��M�+oDz���+
"=w5���]
4젏H�
wuY���O R��v62�y�W2ׯՑ���
�;�R���N*E%��
�ߦϓ.o�ř��n��pX��_/�������@G�"6�P���cު ��Z�a�.����H<ʡ,q����˃�/g�mԦ_��Ě9<j�����ooί�_�9��ٗW�G}yq������K���UɲC��O�
��x
ף�
���������/�B$����l�]�Q��x�:��ֻb�8�h�Rω�����m
X]�`|�GW���$�+�Fm�H;�[ϫ�јͥ,����ZP����2����ś���v����5-Fb���CЭA�C��kf�Ӽh���Q����n3�k_�_~s�I�<�� �R�KE֩�pa���|WT_}��T�6������(z���#!g�����h�Ae�t��䇧'ߜ�OϿ)zaK��YJ��u���㣠7G؇�[qg
r�0�z����9������KZ���T�mb�@c@]�oΎ.s}8�����u�!��
�w������F�̘`1A�-�uo WDpI��3Qm
�x*~F��߽�&���
�B^Q��C0/F�M@|\��^	yN�@�,�v�'^B�H�i1�/?����s��0�—6Xa��h�o�s��w�d!����`�M�z��vv����F���9.��'D!��=��M�,�GFo1��x�Dog�/�؂����� O��fA(վD��}��SbaL������_��
�`�R��?�y����j�\��v�һ�$�ȶ��9:�+�M��6\��G�Q�x��P[�^~��w!~I��P�i�^8��`e�%C����!�e_B����p�*\�_�"���p�ҳ��h1V~b��%%d��N��k���zo7�vl�Y��iY)4'C��d��[�EL>�P1�S�J���3�=E���v5�n^��8�:� �P��{X$0��I����P9$���B���A��y��V}Q3�y#��CZ�^.7:�j���i_]=þ�xd��fO|P:K�!q/�Ꮴ����&2�O�U�|�m�x��).�Jk�R��=.�P+�t*%!�s;Rz�bj��=��!3�[�����e5�l�����s��2R��S�Z��W�f�oAm��H/�.�IK$,P?ϧ
�E�*e�P��H%[��i����z��j�Q��(-9�Ab�N��s�٪H�T}$�D��}#�} ;\�1��}Oh�G%1�o
�,�\�����p��Qw�1,�(֖�%۝O��/���F�S��S(j��|̯�Y7��㡀���*�C;u����F���h��B�1:QpxytrR"01p�ܟf�4��!�
7����J1����h�4��h6��^�"+;���+c���6j!%��S�l_�PH;�{��
�d ��E�=w!J$\�L�e�б<T�	ȿ�ϼ{TSq�5p8��\r*��P��i1/�mS�B��} b�P%N8Ԋ�Ua�?��t�
��X�8=�D,����iDl�:U���~�Y��GsD�%Iͫ1���cW7)�T!�u��S�:뉚�6면�f¤s��Y[i�b3C�)2�q��L���Z7�>4�{��8�G�^�/u��/?��hhb�OdZRGc�7)��E�!��.����v��	i��$����f���x�M���}�P�Q�%n�Y�k�J��҈I4&o�z�"�����E��߼|y|���Y�cG����ZSG���X�3o�ۂ�؆\[�FUC�lQ�-���L.a���;�J��4��G��3�(��k#�',?�xA��פ����5�QϮ��c��V��BB�k6�[Lr�%��T�k�f�V� �@.q��?QhT�(#ǀCK&��~��w�٫D�r9��`��<�Iį�����k��2���x����q%7�p�P-o�VI�+�S��=�5|n=��?'�û�3P)�]v�AV)��(��ӷ���/�l_��:n��)�y�"wۖx@*�s��'g�X$�'��O�m�1�ܵh�!�+��/O�o�:~��⼷�����&Ѩ�ߌXt� �	���-�D�Ȗ,C�rx��SM�I1������D�Xs߈��"_����5��
�b��=g��
�5�]�� ����)�� G��G�����I��zb��
�ܛ���d!�>|}�i����
�#̤ �_^\�ŋ^�_��j �;ZL�;� ɼ��)Ļ=>��T*'�"��:!���&Ui@ ^u�*]�a���l
E�Ͷۑ���N��08$����w���M�
w,�!P�XA5�Vh9c@�r=�
�Ny�R�#�)Z	��T8��񜶄z���lR��lp��ż�����b�-Hbg����fKM�1֙c�QQv�}�ng��`<�4V<B���'���!J�ƨᘯ=��(�f�	
��^<��r�_�M�j���"��ؠ|�ҧz�ն�qA��"뜞�:��/O��x��Jp�����{��/��-x`i0i�VA�n�lc�@��`�B��ؐUJ�-j+�k�ց��&k:͑�fn��P�=@i�ug[��t6���W44��a�jT ��@�"�c5�8X�g+����V�B`���� ]zI�#g�
_�u�]ܙ��m�d��;�Mj�b9�:Ƥ������P�'x����^���_Q�j���5�V�feJ����V
>3�{�x)�4�M�"[/1\��=��;�-F3j`��"�g�2dlgr������2p�������Hޝ]�:'$�
��bHh�	!���l���T�E�=X���w"(=����U/I`ɑ����JՙJ�;�@$o0��MF��b�h���_@�o*���
D�۷ضC�)���3_Zy�s�L�<�q���$�p���R�A���v�S��a�!�#3I[JT���8� ]��"-E�Qp�,���^*��Nj⩶ �&e�`���8#�\�i������i��[#>>H���l��s3Xr��L�i�bCV4+�X��^���|��pN��7��&c�:ꡪ^���1J�%P=m�S��P������ڝ��<@)nuUϩV��+%?z����jJq.�[�B"[�P���&1��/��~�M�8ƒY =T�uO�:��8،�AM�HՐs:.�� 9�[��?�HR�e��c&D�\���bǙk�]}�����m9�vM�:��b|lm,@&����
³^����+C�ȗ�-Lm\mnﲻچ��?���AJǟ�Ce!�onR�I8�v/h��65\҅��ɦQ3��DYiKٺ	ޱY�q��˶4?=x�9`ZJ�~ɘ�h�C_��qF��Fq�!��%��)��!8�+'ݣY]b'��b^�I�B�'j��d�z�Tv�L%m�U�i�F^�%�E��s���$;Ƽ�Bxd����̫C���(P6��|�ފ6�v|�t��+)�1��T2�>�����XX	o)��H���Jn��%`�MҊ�~����\҆Yi�E�9����3�#Һ����D��E�&�����0��U�Lgy��1��*]:Ǹ�0��w�t��Wf.IK�j���8�΂l�j�0����Z��V�d��+Y�E�>��-85㆜���r�%�W�j�E�
�ZD��!�GvR��" �-9�C�6�K�DZ*��y������o��C+���+Ɏ�uJu��ɔyY֚��Y�+��v�hARݭ�g����ă�4��r��O]�ڵ�*s�
c��P��rՔ6�
kR��6Ll�R�;��[��mL��ѥD"�����Ax�#�b]�ia:�Z�����e�[�^o�FT��a׹〷:iv�hi��X&���1�]/��C,�S��5ڶ�țY0R̔��t��f�on��
IB�N��H��dye�9<��K�3
�_���hr%j�05n�Q���O���W�O���KkX�o��0�q,1n0�	A�E�C<�1�Zn=��:��q�<=?�b�5����l6-���]��޼UD`77������׃q' �B�{��2�""{�]�I�4�BY�*�u4��(�P��6�ƀF���8��h�r��11�v,*��[�U����m�wz;��v���vjQ�g[WY.L��R�"�7tB�`�ÉL�,�cdZyy�ٛW��]��i��A9��c��X�!GL�Մa3)�m��ג�4Y��>s��0�^
H���w���Z#c�@tk\�^t�Yޯ����ֈ��V"�����PD���b�(W�ye��<���Þ���W_���O�N�0Ү�℁k����l���A�l]v���0(�]b��������)��yt#54M�
_���1IJ�s$u�TIs�ۑs���=����>Em:7*����X;=?�&wc�̤K�ZB�5��2�pD�->E����1��`Y���${�$X��q�J���9@����]A�E�7�����:(���m�pu���s���fGhT�=��bi�?y�]e��j���%4�]�?GcՒ#�
v0�/fj�bD-
!��r2p$U��c0�`�L���Y!/��Z&�D�J��� e�
b����E3f�pV�Ü��/���[�y4ꚳ!a�}��r�Ns�<|IZ�Jݱg.���"k&VW��oZf����J�m�W!�X���wr��ǣM���Zn6��*8�5�S��
�]|�ujp�JA3�Rm<Qm�!
7��f��M|�<���f0f�k�8�ַ��ߒ>�B�l�#�p��OZ{�{��[��>�7y�f��4B�w���t	A�ru=�7�m�_�_�.>��Ci������%n�ub*5�bCb@/P��1HO��V%bS�3��ɞ�f���S��C�E �h��J�
D��H�f<�ڨ�T���V��X�d8L�B�x��R*�Z��'z���ӛ3@��F >��.�.U�&YY	A��V�B\�/`��Zk���b��1n,~���0�g䩙�N���M���P��Q<���Y�u��(�!��]L۳�d�NXl�^pĒǚ5�<Y�-e�S����0[V3ǛMƮhD�ة��)1x��
h4�>/G��9��1�H���&�ީ������=�鶱�����
��#J����>yyv~vLu��L��Ñ^_�c��7�Wy�C0YϿ�	�ét3���ӻ8�A�����-�<p��o1��О"iP�?��3�y+*����Q[�b�B�ڲ�>�F��9�D���3�qbуe�����x�����u�l�@������@h�Q
i{U���j����
c�8+�$	��"��N�D,V>nv0#^�vDuv��
Jr���-��l�N���+�
��.�ipF��m��ۼM֥����r�F�1<R\&���	Ų?e�3;a�<m�*
���������)ޞ�����ii����m�:3afS�ЇE:(�j,����o�K�+2ɄX�J��IP�����.��=���P��U�Y?M�`�ː���>�ꤏ�S�kQ��O�9K�eNr����������Iw(�^|{E�Q�#�M����n�|]ɉ�UX�\��}v5^x%�U�4�)&$����F
\�`>$�r:>�tv���M��58XqX��Hx���0�ja�%DƦ�a�w�Ę6.��/q���U�T���C��f�?[�ɟ2��\ʂ9`ZX�Tف�fP����jf?k�������K��"�K�M�>~
6r
�q��)lx{�bG@]5�<��]�l6�R*[*K�Xs�ۊ��St�	�Ղ��B�W��3��i�Oe��tH'��D�����rf�|�b9�C�O}��j֙V�+K�'�Zw�5��߭��ߑ^�ؼ�����Y���ͫ�H!ŭT+�>�_P:iv?q=��\_C�C	ƙ~��z��: �y�`�k�p8^�2��F38Y��tcPM�鑱UGa�l_�1�ӫ�P
�j�F
4����Q4�����u�_,//���R���!��N�B�:�"|���_B���+/P�OF�¨ae��Mѫ�掗y�~�C��o�8��d��jeg��e�o&ɚo���!�Q�,�� �,�|��>�wj4P_��)��j��v���<�&�q�/{%;��
��J�{�5��A:ߒ+�V�I�U�
'�$�w��g.uJƲ$�ʭ�v�A�(Y�Yw���d�o��(�#s��
ƴ�1���&a���>q��k�+��^�+�z�77������p�S�݃��0+&���a�hA���e��"�`�Y[c#�hp2���F��t�22x�����'����*��k���P���a�ls(&>�����8�+��F�I�i:�����o8+3�&[C5+��N����xPj���~��4�X���
��V߱܉�*�t�ES�ڢj�E�v�ɢv�AʌT����5�z��W<\a�����=����7V5��t���)(�%��NͰ� \kZ��H�S�c��N����@`�@_Z�t�F�\�1�`�xigG�V��.�
=�:B2���Ő��Ibn��f�д�)l��hmӡ�%��O��f��:�l��g�|f�2�Ez��{���� �K
�v��xkX�R��@�]永
a���t�@�lW���]g{���TLWO���#�2�y�6Y�ݽ+6�egq1�AĜ�n�F+Ie�6�H��^ME�Ma��b��e ��r~[M�A��n��6E�Ruԋ�Ŕ�	Lte�L9;�ȷw�^���v�;���c��ǜ�|lE�x���I֧l�+!1i���Z�����G��*|�B ���B�&��G--�����${M���n�X��6�ZN�7�
d>mĵ�.9}U���$	���6�.y��:�Q��>�Y�z.���ϾC/ �9Zp�����B�=[� X��ͳ�Q{<��E'sf�tyS�0*�*Ȑz��̪E��'�-��f����AnS&PC+L�z�AF±k��35������� �{3�Qw�<U���Nv�J�B�L��;#O��i�p���$�T��pc%����`N")83ͩԥ(�a�]��Moƴ�h	��)��$.�C�U�}.P��`�_��K�$cÅ��R��[]2��G��ه��*�z��3��ĵ�p����y�Lw�$<M�
�������ђ���Y�4�s��I_uǽ���W��kCJ��x�$1$h�C�J�ׂlVN�����x 5xڏ�!$$gx� ��M�&���ԁF�3�[��!�	��x�i@�f��pt.e��UF�9��:��r}�fb��!&�$p�(���‚+�x
���;���
:��~��Q@Rl�+�IBA��^�8�,
����(���B
G=��`6F[U�'q��Ţ��(��X��ʝ��h=�w��<�p=G
���"��3BNQt;1
?̂���
r	`�H?]�>�+�T�]1��(��Y<���H4�:0.�f�
'����pOC��i�à��Ϳ���^�����yP�œx��p���C�I��� �9���_�!@�p6�)�>������@N��V!%�ovm<�X�ط��x4���o�a�����4�f'��/���4]G��^Z��=�o���?��`��#�Q!�����.������[=�wA���;�!н�e9���xq}����'d��L���`ʢ������t<���9�pW�ũ�	aq_E��l0B4��3�YҌ���8�[�q�{,�#l6�kPS�����E*J�R�H⊂�3Od�Y�I_������2� @���.���=T���	�҂s2�^`�M�$�����^�����A�T~ܼ���;�,w��"e���$9%2�/ �y�Tb���@��d!J�Ql�]�b�Y�h<�L�oWM2d�����sB,�QI��ĝ-�gfO:��Y �:�7o�������酐��pt���M�hG�c��ɢ���7��Z2T���nB8�n=�9"\3�0D��d���N���qc�+H�3������D��"���gH(�pƛ���1�&�
�E	�{<�"1*X[����m0�#`����/*Z�Z�`<*���`�ߌ��6y-Զ�fL7
���+���A🜹�^�݃���h`�?�[�m�CJ�+o���Øwh`P�e���E��F�E�3��C�#�'������N���� D��YBm�g �l4�6o1�Ӓ<�a|�`(��z	��o�d�Dw�M=P���7�{=��n�`D�p$���N$h7Oˁőg�<R�Q��w��3k�B,B����KB)�%�-0�	a�c�A�}:#���2�'���|��O�8���6�,b���Z0	M��|>mO)%�^�u��{o��Y����]@�UYK�䍯@χ_�wX��e��"{��A�˂N�c����e&Jّէ��ܫ�_F�p���Ϣx��0�\������ӯ/���/-y�^(�y��6x
[��b�7����>v#��S�Rm�J��4���3�9��bo`oy�
p?Z/�X:����ְ�Y܍p-c�����2G��^���e��9.�/y��\<b++O�nV�<�3�z+��s�^�[��4�ry��vzNn8M
f����*[��`�P��̇TVB�:8�c�r~�q����yÆu���SW,X/{�I{ܗvQ�H�@yQ���VZ�٢3��!a��_����X:��b����jXV��r.$N�@� ^>��ɻ�}�I��ve�-��*g�e�,kD��Qb�K#�[����I(3ʯ�B���dV)�y�wv�T�w6y(7j5��_ΧN�Q�f�J-܏�ݛ%��aZ�.i;&�86�i�%UF����\2Kw�P7������^‹����^��9��c.����b�J)�	�B�%�7�>w����]�%$+RVP�HuIA�rw<��
��H9Y0��k:������2���w�;�z�\��4�j#�Os=��7�H\A�*�Сp.h��|u:ul]�nt�Ʒ�����[LYW
�?g֠�4���1O������_<Jvq� �YS�;�[	?w+��=�ˁ�*+���_���}����`��~u��;���>-�V��W�Y�#��[�ʴ��f2��
�'ABɔ��t�O~A�#
:�Ѻ�<���{6t\L"yQeu����3?l��@�d�l���[�e�b2ɈeV��n^ׂ<��Q�R��Vu(��:�;�x���5:�'W(<�٬�k�v�\���F���>��gu�s���:�c9�*�.De��p�)��_�!���!���w�'/^?JB�ep��Q� �q��R�sQ���j�D�~���@�)`q�땃�� �`� !�'�V�Nm'������%����_mc2��GA���h&�p�s|}ru�T69�P�G�^�{���.�$Uマ8��ߥ
�BU�	��؅{�>�S�����H�[�o�\g m�>�ܡǝ`b�6v�Fڐ�<5a�c+����r�=����g2���)�dq+BȼX���tpQ��1>*���2v+b����Y-X�����T+�Pᵍ��$�6��z��W'� � 7Y'�r�=�}
�9+=��R�h���W�����׆�?�V�l�h��m卐�4�;�V�e��fPkU�~Qf%��荩r�풼�V��D�dP��Mg�:C�x�z�����Ռ0�F@�}�
A����&sAE��gP\W�M�Y�d^����6�ŝx���x�ـf�f�Z���������u��R���f�HQ���D��'7�h�溡�N���'�b|�sx�áf���$�L4�X��f�K����x��)���}V�W�_�+�(�/��N�L�Q4z`��-�M/��\-T�_�0<+�J.��e����p�b-9N:��J�w�јQ�2�J�
�n����id��86�`�5��pf��2zp����K�˙�|s
�3�ѨM�N�Q'�h�%2+K�DFzE2��ݮ�ͪGr��D�oH�F!ٗ�r)�N�8�W]����_&9�RS�N�a/ ���I9�`���X�``�%��a4W�{(�0�����x;�w���ed-E;Ȇ�
g�;,f�_��T���99�dz�]�햆�fp�BtP�3��!?����N�\n���J��~Tqy�Q(A������!h����!n/q��C�ٶ�:���B3Ψ*˾C�C�C	�~�
�9��SNό���c�Q/�Л�JH�%EJUl��g����d-sVt��L��v�YK����|�T �%k�&�J
��z��:X~�/ki��*�$�L�9v��1�')�w�؃wk�w+�J�4�WH���Ez��·�m�᝻��
n�wUx��ㄌ�����a2�e�
��NXS��%4Z���U�x���P���4��0�1��~����`���<]�(n7�.P���֕]�.��aI�2V�*ρ�
*Q�����H�:ryX�d��'�]:�m;
�x�Cp��H���H\�|]@1�=��r���4<Ǟ�~�c"4
��(G`����Ŷ:��sd�Sܣ�ڪG�F�\n�tè�(�(�M��p.^|TUp\��,3e����K�KL��5�G02
��X�\���ׇg/ڇ��E�������w��o�_9O����GB@8�{����4r �`�q��u3�_����t����#1��"��'�h����`��	ډ{�no<z:�ף�( ����.u��21�2T�P�hf�Ь�h������ëo�T�?�3��3'o�s|��L����]M�Z(��h[�F�D�
��cDz�����|s|��z��s;,=7(�(��?O����©�����X�S��-�1=����$!��|�-XB-wqxqq�F)P��(p�IL��|�-�
1�5h�M���4Cy}ua@y���d�6�f���o
�!f�*(42�7C�7X�1�;ڻD�.:�6
���p�z��%P(�<��7:1Ο�j�GyxTӢ�c]�(����{���<W�R-}�K������"��y�|
�HmH �ݰ3����2(��f��=�
�v�믁�K�ʞ���T@���<�͌9WO3E�YȆ黤Iǘ��z��E�n�.~�Pw��K\ZL�g�Aص@�n���!�ʨl���x��%@�X��#&M�h������P)[��L"���$5�Z�3�[Ȫ�
o����L�E�À&�����N��|lS�G�3f���;�,��,�ߞ����f,�K�9t��΍f�-]O�A�vX� n%����w���	�'zv����<"�@��d-�ݫ0
��'wp�P�q�ݒ�
,��́.
�t �&l5��+̵��!������"��B�\#��3�lC�Y���)�ba��Q���d
f!Ͳm��$�a�R�R�T��3W�c,k��PU[�t��5��‡�gF=�I(���jr�$�<f��R�/�{T�0w�q�8�j{��K'w��=B�R�A�,`	0(��"�[dr��Dw>���V�rk,�!6j�#�1:��kt�>?;4j@�q�;/�yE������*i��p��� x����DAN+�D�|������e><��]��d���G27ZK��X�ڪ�O���G&Q���F�9i�m�&�(�o��C_4KBU,��&e����;��6e���um��ۿ%��܎ĸ�g?RSb��b�~�@�*�E��i��O4ipI�x���(��ӢFOmP��$dI~���GK����l$�N�$P#[�H��ƐG%�(q���SrNʕڂ8�o��7��d�Į�7�J{ʥ��T�} Wi�Ʒl���]X}[��'��ص��L΃�����"�E����՛���2�~=��v�-ѵ����U,)�d��'�|���7l��/�_|�L�~���Z�wt���O�'(��
��0�w�	�Oӏ��c������򾈜�'��+ Q)�P����S1�+�mG��?��e�4G����<�\�'�#x)�RHF00�ф�I@�&v���*��r��^GZ,i�D�?<�_b��W��^[%?eYSj���>�8�a/K�$ʚ5��Ҩ��u�ܬ�0�x����J��������4�糧p�L���c,��P�goNO� ���"H{2�!i��H3��HP�Ŧ(�X�L�9B�e�7W�f����19�R3���	\*���ݳ�E%��.W%�4)�����I�ܞ�'O�T#6Y�U\M���ⲄD��I� |�YS��g�4��%�U,zՙ���FYQ�T�R`��Is%Q�T��oK��̒��k9�S:dv(�o��)[�J��+i^�i��Td��� R���>��c���Z�S��4�Ko�6`&��<�t���h?���N��G'��Q���C4�^�`Nj�T�J�A��L��{�GJ���7%5�)3.,�Y�H��k�5�ф��XFי���tl�ĕVO��0��Xb�(�=��6+�2||�L[6�������3
���s^z6Y�/<9���<�>���l�A���(KF/ =a\��+��'up")HF|�
A]�yߣ8�j����?�⣔�H����,�B����>�$�!�E����/sn�J�C&tڐ�졂�O��2���R�'�kB8I�Q)�>���t���)�	��#ҍ��,��\�_�����}���SY�(w�*����٣?�@�)RP��O�~����H��Ͻ�"�Sx2T^���Q�'��{x�(����t�ɤ{g�X�]_��I��w� z��1ρ�]I���?0�	�pyQ#��@��=��oR������T���D3�UI�z'�y�n��\�,�ˁOɅ���:-�T-�&��,���#�pƶ�R�����(Yy�kU��6ɼ�6� �IA7�h\B���C֍�8�y��K������p�1�����Y�k�|�0�2�4����n�����}.��4u��� ���g����\�z�֭�Ž9vI
�אC�*��٨��֞�ގ
׏[�ķc��'C	�í�'��,I��ǜ��v���ȵ��U���¤h�D�j˅ń�Hv�|j�[hĨ528[&E�yb��ehO�eS*��@~G�zs�X�es�ϊE�4��0eŸO�*�+W���ƭ�KT�gHJVY�9CN7�KM@����r���h�$��ʼn��/%&�~��ɰJ�
��ySm3�6�Ϯ���D;�A[��[C�%���Q���f���R�{�ua�ޖ�}����r�"{N��������LW�x/Sh��"'삂�M;?���E��OE��/]��U[�a��]�')$�$�O�tG���s1jg����x1��Q* �cånp�AF�0���
��l�DE�5����P"eI	�DU��~<��%x��!�L��CYC�M#���k.������O)
R���Z�9�D���RV����0���3�
!�g�f�cT'�4AR�L�2W�0A��MΏ9�#Ը&�?�V7��|ЍJ�.X���r�O��d:H<�iC}
Cu
�Px	΂Zm�rM�K����ϥ��u��n���AG�.A�n
���:0�@�Ơ1��]��b��E<>�ף1��퐜v-��d�sG��t��ٯ|w'ZwA�7��|_o򜥡�	
�H������|��3^=����
y0���$
�������+2,xu�I�t���-W�d�|)�dJւ3u/�#��cl�Q�L����t8��By0M�V�Mӟ�9p��Q/��J���3��m��JB���g���<��y��*�PE>4ܞ
��ǀb`xh?��h�X�ՆM|�:�׶g����O���f#YT^�<y"�$��?�S"Hj���B�l��m�^�V8dz1,3�gM]P��+����^p^���hY��VCCV⣄�I�����Ѥ��:x�}�1o$}l�f��?��/��%����W���v�>A��\
��,e=�ʛ�B�¬��Cқm�7�(����>F�g2��%���E&yU��n*�m�
��E�	0q��{OW��VS)׾#\���֙˔�d��s�S�1B�Z�a�}�}�D.��a�`^S�����&eF7�WW���;Ҫ[�[I�Y�k~�R6i�JلUb��G�q��x:_����~���C;��ky}�����Hd��G ��p��\>�'�+�6�&g���E!!$���+�&�,���/6���p�.c��6��^�\a�٬�^c�49�����Qчx𡽠xTl��Y%GѢ��-��k*o�́��m�qW?y!����1�
X���]�i���=�Za�B`����d7ҕx]o�TA$6�@����FՔ�H�.��&*��	\�(~I��PT��f�r�je�G�q�,���M`N�<�L��c{8b
Š�"ui�]^\9쒦K��pF���ť`"S�4)
}��!6 $�Zc�:I�$��a<�X�"���,[챯��!��fd@���J�@�D �EǷ\N�G��+L����B,�񷃔P�N�eR$s�&f���`�_2;��x�j����h�Ww"B�����5U$�1Kh�a�Ujc���l��*��9�&go^�h,	��
0̄��"�vwv[�r�u{�m���̍�OJm_���-�
\�)v���?X(v_̃�aU
Ǿ�����,�4Rnۀ,�+cU\Ze�!�&v|�u;��
9�	w_��K�v�@�sE���o�_��M�a7�I�W��~�U���ެ�*�F�
�̩���m���s��NH��������
R,7M�|'ǿ�~O�/�`�yHQ!������[v,-_Q���Cy���t|�19-�lҭ��Ni��F\�cf�g�tOM#q�ڝV���E�&��N�S}/o?�uL$۬U�bv�x�~/��=�'E�n^���&����;	���1@U�z#���ZRêCA6�Me�N�#�]�6�(.U�
xVE��G7�O��P�`pf紴��Ww>$������]��3b10O�&��K�5-����Ab�@�SQI?�DqM��`bp���_���)�l ?����Ϭ�@����w40�7�4<�eS�bS�YkH�f���x,ģ�`����2#��*�Ô�AW�\�mnoWv"���z���T�Ș-`@p�"h(v��qC
�>??���:Œ����	Bq��cܦ(@�/��3��nB�|��(2ľ�[�\��j��s�‚����x��->Z	���n�Y�_h��B$?�Dx�&��2gU�F��9		�/gtH�ƨ��ʎֻ��,�4j�������$��Q��~S����y�i,@��G�]T�I؍4@�_��%��bs��	G�_�Ða%���^ �@�֬;<z���~�WM�����5�HS�k��k2���h]1��{}xq˵�(��������7g���o4!���9�jce��W_9��&veֳ!o�Jc'�)�P��&���t��}O`J,F����9�����=�
e�a��Y[�m�U�~F�6���:�O��ĺ���g�fXݴ�(�e�����`
@��X���m�p�(P
��U���#`<M!���$�[p�/[�P���x�V�<bY<�c�� ���ƯR�RfK<#���H=	��]%�4z|vu��
�m�i_N���O���…����!j�9��}/&���>K�����	-W��{�п�`��^&8���{ڑ~�TS�&�=¤:�t9�˜��o�U[��4�!���k�@�[�4J��2��?� �A.A�/F�{����O\0�EI7� ���}���Zi��O����3X���潒l�,t����YZo���O��ms�c��x�mx7��G��w\H�#����d��i�::<=R��8���K#\z.1�I��r+�Qn��+@��P0�)�2)��� PbN�rOe�2y$�N������+��;�}	�:�KX�O�&��\X�z"�u��/��6�]DC� �� ��a�-���Ϥ�>h�k�O�ʖ��$Z��L/�x4��C���j��M��������:�����8�Q�Sc�z�����j��#.
�������bׂF�n~rO����9[\�3/_'Q�~��gK�C�l~#6�ٴ�y�$��$���
Q��-����C�Lv�jx�-�T��k��P��$���'ׅï�|�/�l~t��Ěڸ� =*�*�w�K��GV#�����k�|����CM�fc(�Xt���8�ɓ �#2����x�d�)�a��I^?���6�m������{�r��������B�_�ү��R6�' eMIy�8��-�yH[��[d���������p��l�VA���F��[e-"rz��O5cb�d]�u��lL'@�S,�I�*f�]6blW��S8a�6�J�/�G��z��V�\���;N�N.J�$��>�j?�e2C*�6g�ǐ���[��_�ǭ���{@��t�%��X�S��5v�(�������p6wc�A��s 
*�ʴb���P�$����6�W-������9�!��3�;{�8�����(w
gd�fM�.xq���JZ�Z�k�v�^-��c(��
Sy(��t&��qƣ��e�j}�cq+�0���h/.��ǃ�m��b�4j��v?t�#V�����}����Y���3���M���VL�
7-�,��lދ���Z5w��q������רz6K�qRQy21^bt
x� q�\IE�}��]~�u�c>vx�_��r%�������v�Zb4�}�Q&�禆B��Ņc��^��`H=�L<�P��U�D<*<��W�a��l��A,�4���i��I�qzxy%��Z�_��<�m�����ɼ
xA[��
Gɒƍ8���d�w
���0��m�c[]p��Ũ���#_AE;ǐQH�J2C=��4�\f�x���ʌ��H����Jd��w���]p"�ʄG�J�ѣ� �.<9��
kJ!)���-���@O�.�픅b����=��q/o�A8�8NA|Cr���x1%�Y]4��~<T[��񖠐_�f��k�R���Jb{��K
^9���F�Tl��S:�R�% ��6�u����ʉ�9�orI�<=?�h_��A.�?9�H1�_}��j$���B?{@�|#�Y�̢K�����84m����)V ��T�a�FR��yi�a&:���A%Aa�n����������A+�����șF���%�y����u=����+u��\hP:4�v����%M;��M��M�ZX	��{ݶ�5�n�{#�w[o�%s�-"��>��Lw&@g��Nl�� )��w+1D��a�(M�\���%-���Zw�*#Ř��{��FZB�L5&��Kj����H��Rq�f�{���5������
ާb;����fh��r��4��/2�}�$���NIW@n���Or�D?��pg��������P�:�^��c�>��S��!Z���ˉ���LN�@�b/[�]�b@R�P��ɒia�[C�d,鳌���I�s���Y�Ƭ[k5��>���b�!r5����0�'�3c	�`!��º��.�6^�����
Λ�>Rd�ig���k.���l�4�5��l�\�G���Nnd	��L#��Gc9���K�8��ս5�)���.��R���y�~�Z�'2��y�Y��:y1����g�Okާ
��?ܖ�@�4%�'�cf�9h��œ+��zUP����#wڱ�JI�H0NT6g�Ky�&+m�G*�Ul6U��ye=�ƛ˩m��_1PD����ϖ�:���9��R�gѼ+<�'���E�g�#�˱h�A��toO�9ْ�3�L�ͣG�JWa�  m9g�uc6��d�*�ܕy�J��"���C�fB%�l�n[ ��!�Jjo�}h)�}Y;v0[@�5�-D'L/����f�UI�J��dO2�U�J�Ӱ'߻��j�i�Mj�'��M�P�'u�)J\�so���-���&�h��e��.�p�IC<��]w}���:�����~
NJː�~݃׊�({gJpksҢ�J�J��"ѿ@�<���s�uϪq5��OW����U��h�u���d���.e(��$E���A�'���ȯ��g�v���eO�vH3��K�VB|F��=�URP�U��)I.�k$����E&з��(A}4���IN�{�_I�<�-�FX;�I����M���xwr���t����ZA�-,��ƨ���V��syu�Z��?��>y���{ ir�O��*ɑ
��J��}�]6:@/?�m�;��m�̖y���E#�b��@�y]1�$�b��[B�J��)�Ii���5����Њ�2Β^ƞ3��`L��mU=�ۘ�`��
l���
f���G��zas{�Q.�*Q�Qs�Z�tX����
�,�ѧ�Q��QdG��Q��7歷�VW�W�Z����i�t�g�Ml����h�=�Wv8Wmi����{����ꇠiX�\^��//�/�8(z��d�W����I��|���(����m��Sj�:���=��/F	t��B�>4�V��.����^Xw�_��8� �}#
�H3��� �`�}ԓ'�g��r���1�o/�e����Jk5hu-��9s�Ӫ���oסּ�w�DZ� ��u�.|��`Z���%�a(��ߗ���1��^Gb���c5F>�UV�`�;d������3XO�m�]QU�hk��i�O����z�u�G�t�NQ*׿��N��o([��q���ZE02���ċ�	6�Հɭi���fk�f�mf�<���%o�D.#Fщ��Z�x6o�I~�?x[!rQ���E�eҙ#1'���TU<b����r`�m�R�fPV���ooO��K:+up���8�->��C3���#���N��?�h�o�3�km���#�a��@��U�{c$��X�ʙU�0���+�#�*��e���`�%p��� I�X�ȢX>�'T{����ICV�S�D2�<��25F�?а�Nľ���s��hm�y������
�A�=�f�hw�YT3�l��J��1�t��
�ۘb\^����L�����ت�;hr^I`w��'Đ�A�@PP�P��m�}3�����F��ԭ�>ߚ�0>G>I#�vü����A,�I9m=���Xo}sE���zծ�C#J?zK�.l@m��SSoԶ��8i���c�E��[�����+��\~�5���/œH�r��|�5�O�5Y��H���3Jn�;�V`��_����yN����НIs��DlU���3�&�s�N�r8+w��2|�o�mM������ҕRR�$}���ܙ�}�@���i���>9���S۳nS 8�Ϯ�e@��@{�3���di������'3*}���J�����p"Y��'v�iS��B��U���
�"z�	�_R�꫊C���I'7
��M0���*��4q�lt7^�1w%P��A�o0牑#���HB��{f�K��ҋ7�˖5]&�*E|���k��Y��Nb�:��8��Gy���P��;1qb�4�({�R5�8�3f 
��1��#�c���'r���}���Ҫ(}� !!�LC�#L���Y0
I)��}�1���F�/�]��Xp�:�"�qg�aE\ͪ�J�S��#o4#������xK�|�;S���J��7�,�ԥ{��;�)�YMA�3�z�E�5.g� �Z~�Ŕ��Z�Ǹ�JL��>�w޺��Cj�����@��j�a<�����z�ys8�+?B���%�o�Q\MQs�_��4J��,������W���р���LvH;�={��J�
х�^_�-�V�H��:o�X�Q�	8M��j�`tQ���[�����a�����x����[��J&�aj>{���|VC�����#��J�
W��u�G
�EG5�j�Z�6 ��N��K�lM��c�H�I����
9ӧpC,&�C2��u��80J;
�Dn��=�p$T�o�iҏK��^���	�Q������b�j�$�Xw��aW3�p�~���J����9�{��	I��	x�9bP6b��TiĦ����e�����,�T`z��g���Z8^h5�Z��jBVlZl���"���fΈ&�*~��un� ��4d�"�^�H?�&P�c]��#UK+��[���_6/W���̪V��ܰi����'���p7؛*ɜdE�-s��3Q9�@I�����rzC �'<�:��N��,���`�JY.���I*��#Dgr�K�k�0��M3��i�d�Gp�}G#��ۑ���9�Q��_��Š��7����f��`��1�8~Y���ٍI�7X'��UZ�d\���x��@6Đu�Vj�D�<s�����ĉ�'�r�n��Т��^shu�#�>�
�+�z.1�ey�{(+�2SP��rF_�#��뫋6�{�'}��E�d}��nn����\���$��� �BN�g�C�G��O�K�a�y/]�*�ieu�H����;254�2��[u��B��7�# ,;�H]�7�ae�<6��m�a�\WZ���W�=�~��
>��D��R�� )�GstcO@����c��0��h��#s����[8e�ҰX��3d]P()�س	)�'���͹
E���M��c{H����3n���FI�GSR
<g>
I�m��V{c���A�>V����PP��0"�;�$Fc.g�9��rk�c�=��_.�*aSa�0�1*���ĚGo��R&�,�)�[S�%�.���'��r!W峲n�8C�d`J�Rc����%{n��6�V5	&��-G��zu�ޓ�g��$�N�>�n��:sF����C���e4J"Ǫ;01sc?4׾���NL��9��:Y$G,Rj]_��L��xړ���*�ګ�����z�V
��v�&U:��=IN�CE�������6x
�
����;p;��7s��9�%�C~G����N���6��v>��<���.�U-����1�=Q�Zʂ�lkYZ'+��B��~5q��/
�u��`���x�~qrq|te���HN�h�8̻�?�㷯_��4���� ��w9L�?��?�
RJU(��'Hw.[�/�m<e�l�jn�~�����7�}��!y�ۯY3�L�a!�ɬ`L1(��^A�t��p��
5�yUVMކU�|c�D�8��S�;��{UqHC��!/��]�I�Q'Eq�* M��ub��hL6��CR�k��o��+��Pv�^:�{����SH�u"p�"j�cg�e#���a����SH3��~��{�"�}���V`b�.�Jc���+��
ϖ�����Iv%޽�qY7ه��=�#�yp=�w6��!0���l߂j������n(�X=X�@.��r	�]��"��e���y��wQ���
�6-H��~@���jQ�=�n%]T��-�A�/�hl*"����" �Z�J������	0��ݪI���I݊�&=z���|������\;Q-F�n��YJ_��yU�a/]�U1Be%�Y������^�~�C�Inp��zY���}��(��<�q�o�
��J{�"M��)Ѧ���D�MNJkə��A�k�f���%���	���Rh�
kϳ���z�9�N)ڻ]�$Y�*Fk�(&�hy�+lllЙQ�U�����ԙ�+��L&�*����R�+`u���#���{��`�ge;nH.��
0>��c�]�$*	�TAxj⎸᱃���ݵ	���G ���������	k��!
f�4�J�ٱ���=gi�*Z����²�r$�-���°U��EY�6/WĿ��Cݟk�j��+'e�)��ω����d�;�Qñ�e�|���官)t:��U[�M�rբ��Q�\LISd'H,�V�^;������턼霟�������w{XB�1l��ȝ�B�#��T����W_��~�hr\^x`V��xSG��+��Д���}3k��|��
B��nϣ1��<�:ȊwXz�;�����ƺ:�u����+W��hl׋�FPخV�u�O��}�3d��ʸV�#��#��#��^S��>��>��'~�K�5��e��x�h_iVk�:DZk����ܦ>ߖ�\~9�v�79�i�Ń�b�:l����>/#{(�x��j7nX�+�}%V����;��WVK��t�w�Ɣ�@���J�FѴr�Z���7��*T�1n\����`�2,��9d5�0�>Ŭͩ�e7�+W��\�!�;>�&s
:�Ѵ�.T.�/ih���bWl���ӥ���>ƃ^ۡ�҈���!�1/��@o��b�
�����Ks!��MBSt#�~�\+��CWfe�bf�|E`E�U�w���jJ�Φ*�\^S��Sw���k���o��:��vX)�^��:r�#�z-��Ӟ�:�ЎAm2^pG��,����i��w�+���a�;{�9MId�hjB�;ü�T
�o�7�6��W�b�W�`��Q-� �%�tۤ@٫r�M��#Ǟ���qv�u�!���.Y��LQGr�w��7��qh�5�+���#��ϵ蝜��RW�$�T�I�b��n:s�K�dB�2Ɛ��)��Ȧ�F�V�m�J)fS��޴q�8�HB�#x}n���}ܐ?�?{;�u���3�6����ae_C��+�z���l�U�oc�#��)Z?ĸ�
��&�UDC����<��+e��c��{�.�rvU4�J������ϲ�T�8E�J����Ҹ�����թ"tE"��$��5Y%i��X��X�)W��	W�J�I�D���׬p�X�=���4���ic�ɓ$�º7�9u�Z:���/�m�HvZ-�x�F�:�2��C��[��z���H��Ɍ�a��N=[��0����_�bB�d瞸�,֣�ǃ�I
�b(J��-��q)��=�Jզ?D+��[z^2!��)%##z
yn&�SD2L�*e�m3���;`�͚{-[2��3/If�R�{���U��,`I��4�~��R��j9����P$�n1�Dl�4ϙGk̀5�z�#����8��qZO�vI�nnO6���,uu��e{�!����ޭ*k=?t#�pv��u�.-N��gm��a�.������!ް���7���d�WY2�HpEg�W���GΜ�c(
�%���:Ļlߍ��vN�?(HȀ�O2�v^-��î,x}.��o�
x,��ٮT1��ns�s7ZL�g\:r�R�o=
�A8���Уv�W
~g���Ь�KÕ"ṫ�R~��<����:�4L>%�qX43����*^�D�XHh�u'�%�UA��)~κW��tǣy<��H֓�?�tk��O�-�w����.�9E"������-��p���鈨�3��lBw��f��ND�X��s�)�p�Ag1��"h��>�w��o��f��nq�V�Q�;��ײB��AbwN����8�v�V��ő�mز"=x�d5/i�T�sܐ��k�k�fEtWt�#UZ�t��{&�9=�~8���ғ�SC����dJʼ4�A�-���6H�+f}khڏx���H�Pe:�je�GF\���,�
��ˎVx/)F�4k�d��b��G%���0L�Lۇ�g�9��d7�a&��o����g0�DH2ԨZ��U�aݨ�@ꑂm.���t���[�{q|z|u��	����ϮN��0���J�f�$a�e��Pu�A�?�'^%��U�
�ҷH�<S����2e�֞�3��n�ej�h��4��^_���`^?{�n�8�丑bO���oiE�y�&E�����ۚ�^��K�_�C��+C\��-l�z�77�ܐW��=��.#I��܈��\�ы����{�)&ǙG�;��Ο��-����~�,"��!1�lX1�ka�!$��u�?�IҀ;�T7��d��r!�4�R�@洱�Ԯ�w�Ğ&���FQ�g��1�}!.
�p:^\ߐ�琀ⵁb�n��m�[Dr���򱷷>j�[�����Z�{��O�u�~()�R_�ʶ;uH�\�l7��ŧI�����Zaww�#���ҹ֓R?��;jCl�
Zob�&�ud�{�c��S�
��Z��ė����+�rt�AyZj���C�2C&�p�����'#ml��ȣ灷�T4�o��(����b����-F |�
�3\a��";F�����,E�ñu����?O,��ĕ32����lY�8�/�'�')���n+��H�,k�`j�Q���W<.�I�?���r|MN�9�)R��Kӯ�7p�^��z�<�h��̍�`m|�6�����
����pl���s��;C���j��>i�g��}žj�
��F��
�5��ۜ���l�nk6a�	e�z�X���V݁/$�@x��,�T�E�)�葒����j�����,�Pb=��hC
��;	�e��@�rj{ؿ��;p�~��w!���ٟ󪼯8�I�v����)Y`��k����(>Ӓ��=/�aW��{Ӷ�jg<���:�~��Z�E��c��8�X���T��k�g�h6i��[;�Nû�t��<�3KP��գF�\�t�^�[	���h<*�J�P
�����]|Tq����J<�r������7�X�ߏ�� BŰ��;����Z1����oK�Ƴ
��ܞ�x����\�	���������m�ۦ|bła��i��V�*íy�B��C��!�k��,���a6w3�cNg7�K��v�m�6w��~s{���e�Q�K"�{�^�Kc��h�̤�f²`y�pԍڷ�4F6v�s�Ӻ��nq]ݭ��N�8�_�o��v{&~�ۢ�a4��f9�0�|�zMr�~���
O�JU~<��V=sD��Fl��iϢ^Nv1�e/;�BM�8����b8Ʌy5GG�����n�
xA�HȤ��p�+�X��J/j
�R���(�nTe?٨��Z*`cP��j�\&ь; ��Q��B�B1�Ly���n[N\?g>"��T����ܐoPC�ޕ�y�^(��Y�˳�t�{�d��,�ăx~�=���b��T��9mU�[��N���{;�f����9U�q�߮��҇=�Xn	#�Q���
fѠ����<x;�\��S<���	1/@����b���������c1�b�2%����Z�y*�Dw�\9�."؟qZ�1�Jr�6*��s]D�4����$
�+�n��S���~~I-��@by��y�E�)����Ά�;{�zoῃպ`?�������S0��ف~����FQ�\�����n+����xO��ZE�d+>�ՆM�T4�V��+�mvv�쎓p~�k��M����&Έ9(�)�]jwo��5\A-�S!�Cx�4�|�����<}#)u��d����]y��������{!ċJ��_ŗ_%?�W��<'uQr�R%x�n��;���$�^Ƃ��<�GP�l��c��MA�6����(�	�V�_�����/���,؜{����i2��A��iܯ�*���~sU��!'��1���_���,o�5�ld������V�\~ֱk�����h�f�}:q�ԕ���q��罡<N�1!�>�
���m��@҉�L>y>�ls�9��Q�2����|ܞͧ��h󋏢���d �\2	W"8�#*EWO��'�T�Q�f�!�U�'$@�s�'M�d%7�a��4��%.o�����<5�}���篎��I�G�3�,���{���
Zj�I����y����?����<x.��Ͼ����_��._ԝ�:�PRg�ٲM!(��98�N�ӌƳ���%����èIp�?�)e�pg�%-=dk�$R�l�>F�.�E��͝j�_.�ԣ^w����T��t�A���b���erx������7����\�h
�B`͢.+����3���q1��1�@�o�hT��,�s�q��96�A��n>��u
d��|�8V2b
���i�)
T�NjQ�2bex*(r�B�#�a�^��/�Q~_Eۈ���k�f1�,p:nD�V��U�F��舦F�4���p�a����	,B�QWQ�,\�nN�I&U�$,&"F�B�����wAI�)����U��J%*��;�^#�ۄe'�2�Uw��fP����O1e�;X��"��t;/�l����<���>Fo�����\$[oH!�/
=�©a�0*Ș�'/�p1��d
��2	?�k�C�0�'��V�4C�^.��Ep@�e���
�Ui}j�*�\��_��'|$��b
:�B
9:?��j����o���G���(h�B�T�|Ẻ����|���ߺ���{�~��Iq?>
���k�D�K���w�0��p���rz5qyi�@Mр�����/�u�>�#��~W��J��}v�wK��S�3F�h^�c��������w�Ou�'ց�8EwZY+G�1GOFF����hn��C��t	+��OO���%?��]7�׀j���m�o��t��?������ބ��X�oO��s�=�v�?�.Ă�۟M�j�� l��n�ݨ�C���I��g:���Q���/����pn+�<p�4��N� =���}�-���_p �)�V+���L]�7��(8T;lQ�m�������,p\�\��̀�lB���p^�֤��h�iBO�6�@�^����&=1<�7���g]V�jd�5�+����^#���W{kZ�oOV����f�Ġ��I2��6룙4"3xަm��Q?S��|U�ز�>���D?�'�!+gK��o�=��ٞ	���+flXc9��/�6��ø��x&�6j$5��|۳��]��<�_K��+��"��m4{�x��ֆ��F��U����o/�t��뎯��f�.O�ڮ�>�\CJ���W�r�?��	yR�
yU��뿴_^��qN�&�,3+o�
�M*�_5��Gr	*a|�e����T�BkЭ���K��ܭ�������mʦf�B�B��{�t��Qr3�,Z���u�fz`Jg����]U����n�&w3�|�[
4�jn+���`��F�'�a�{���A�ԓ(���9x��
�m|+�=X�j�6e��J��2�����Q�36�LQ8���}��v5���3w߷A�R���7U#̓3v��<;[��e��T�ЉƕM�V�f���,ц�-�SF��hpמE�y4ͩ��z�v�4Oi3v-��8ѝ6칠Os`�O3�Q��4Ț�x���i�~��d�����}b�8�^�睔�IYuu�,�S�
���o�Y��<�Ḧ�V��B���R���Eg~�G�9�&$�n�
ûNd�•4���x�	�d�S�I���sD����QYal���~��M�O`��H]�_�_}+�P�WΚ�Œ����V�οj?>{��䧕{0��DeAmG��~{1Rd��s!�v��{K���bu�(א�u�Q[���TK�ZK�)��{�B�#g>��;,��)�,�ň/��j��y�9�1Rƀ�^
��-ɜA7�0��y�ZAh�
LNa�KZ+~�'�ٍ��;�5!]�e?}	���z<�}�����4���G?ş�:f��<@zBL)o�Y-�*�sk�u��|:��[p�"�q�;yS��	ME�z�/
E�Si����h0��˧�F�Dp-����A���y��<孂A�E�B��T�vhḽ]cG�� g
q9��U��L�����p]�ҍ�wx�'�dD�yO���X��%�ͼ^q�5Z�w���]��]\��-�$��KE-*Vz���,��5W���!e�H�B虦F�!U�3��(��\*��m�j��;U\�;���V!3͜��$�Ƣ)��EN.�o�t���WZ[��j�v��] �q�g+���guX��SÛ���!*g�RD��}u|y�����q���w�y��U��/�W�]ڢl�	�0��l���ӽ��2�_ZB��;-��x���
%Jz���NGVw�Y�[{���HWvƚ������h����#��ZUÇX�o��3���F�ɝ}=�Y�שׁ3oUu|�OJ���`?���d3^�t�1Z�k���b��sZ�:g�^,k]�6�����Ye��)���a���3�!�ϻ|�e��$�%W�Cem��B9���<�G��3��_�uV_�3�0 �|N<�æ)ѺT�J��O�qg�:�<��2�9���Dt.�
�F7��DBh���}.0V�3�i��x���Sg5�:����	z� ~��S������&�\�V"��n�6}TV!
��+VM#�'2T�D.�L��`B�KP�N��bR���1������9R��s�"@]M�"�d=$��v���l=���:�M'����Y���I7�� !D��B��A!��=�	�"r�	�k\FXY�
���:����d�K�vbs�Z+1���+ZE�L�D�H^f��������!�8y;c�˜Vs9 �S�Mj���vk���T���-{=!�e.'Ic�j��(�_�9;B������=����Va��r�FCL_����$&�(��).������R�;�\�h }���GʖW��4���C��҆�༻βS��ݽt&o��(f���qcԘ�`Z���u��&L���u"��fM~�W�ͧ4ZMZ�j,����๝x|b�������[!뷊�+5e�Վ��]^�3;��c�	�ĠXJ�|�K�F�h����8�V*4��j]�s���]�O�{}u������U�}r��{�w���`��'��:b�Y8yp�Wy�`	Ӏ8���[�gP<��y*�(Ga���b�wx�� �^���䐍���:��a��A�Ď
6{��W�/ޜB`)��/LJ�e�O�+_Y׏b;5�*�l��	d���|�VG=R�RՆ�1�s"�
�Nk��VX�\&k�&W�Z�B�ӫ�g��C$��Պ�D�X\|���P2�,����g��%�I�*���x5�z�K3�D��D?���W���!��PbF�و��二���g>�}�…�c��al��}��8�Zٕ�_Yٙ0�)�9������ͫ���ww�j��o�G�懏�L+x�d�&�k��圬[L����L�'ʿ�l$�ψ,
q\��{��#�:2S/�m*į#�<�S�x�W?�>Vg{J�������:ZQ>I�r��+������� ���Ry��RqE�8ΔM�B6i`j�j�Xk�����g�\4��u��.�[7B]&�cn�˄��x��}W�Z�5Z�݌�VQ5K�e
aK_�x^�3�
z�r��Sz��i�vո��+�5�sָM���"EV�E(�렾��@4��T���Y�
3�b��j�M�	��b*��{|F.ۋa|���4�Fb�vl$�_ʚ�Ai]͟�����/>U��)��^'���GX\a�䡆	A<$/�ܫ����v/��������|��"�ӕ�I��X��Ґ�b}ɏZ!
�F
"2�YFljLNu�.kv.73�@��$R1qƝ�Z�6��!]��&�ϸ��:���U@�d��҆#�Z/u!�cB]Υ	��5ڂ��υJ{7`{��cQ��MP�j#a�b"�rj�%lOl�����L
�T5��sT~0nf*������h�׻�]C����K�e^%�0ʜ_�`��;��;q�4|�V�Bs��Y��ӏ�6C_���)'6����M'�4�EU�;���T�	���{$�ơnu7��&3{t����&�Fn]&L)�m�Ґ�-�8P����A'�Oc�����3��gti�3��U�I�Y�F�YF�8�z����B_����q���ͅL_�H	��H���&W��M+z��8���.���o�R�D|svu����:��1d}D�� ��
>���ܴZ3�%��G���(-�X�F�@��N�]�>�$f
A��C�Á�l��(�2�����Q<i9jD�pLG��}�/�é �ڂڻ����Ŭ�P˵|4�]X^��k���j�X�A}��-ϸǃƳY<�6]g�΍*����d>��
y�t8�Y�c��	)�=�i�]x�M�7ZN���4�6Ɛ�������51�ײI��DƕCOeӐܰ�0mN��D �h�n��)�
��(�1�����PI�=��ݪ,a;���pdn��
�Z��sPC�z�I>��;�PL�C��ׁX�6��^O[�x��q��}S@��6��}]�����6)�h�3�H��D0\�w�@�2å���&Gt��)6@{ߨ�/�V�N�e���d~@)숊�uoz�˃��E4�w��޽�K����A[y���Z�t_{�q�.�v[��V!��"\� ^0߷�Xֶ2XP$5:zt:%�@B�I�
��߻�y�E=S*h	�kicJ�6�[�H�
V����i8i_�*�U�K�,����J/�� u�4���}[l!��`��?�aGD�Z���ɛ307�PP�:<9��/��#�����������^m�g���q����b�9'��H�5x%�Om���Ɩ�;���r*KB`n��Md��\��Z�(��,[#6�R'$[���pk��dW�:F�3'l�D.Rr�w�|��L��diW]�]�^Y�
߶��9�κ3K��Ӂ†o�\������aV��S���҄3վ_���Y�'I#�!u�b�2;d��fe�ĽFk��`9�z�e���oAAqx��%>�A���Ϩ���@����"X�#2�C���ǹ�hψ��)��u���w�u{�īI�]:�:�Ҷ�a��X
�U�J������	�d�:Y`@�b�^����^�K��m�D�|�#�KʏŨVV�̵�I�y~Z���fS+U�	��\��	��i�FS�Ss0�:�����17���Z����K��;�{�g�a�r��3ND��`���εǁ�iD�` �N^þC�x}q���ձT%èL��m87����	���i4�F=:%��&e�1�ٱ:ƚ��V�_,�/���]c�0-��*Kв��x�H�s�����0��J�П������c/�,bY1�Y�+0�ᅳ
��!TGO�4]�H��\6��(6p(��᧓�j�X��j�jU�21�1�D���
у-':iC��ŞH�.+��*y�f�{�¢�?I�����mh�m87q������f��^�$��3<���W7b���Y)20�̮'R����ߜq�pf��S�3iگT=�s�u�\�5RK�Yq��E��@W�n�k���%��Z5���Si�ʓ�X5�P�n}�C�Kmv0�iV��8
����=N�biW���ry\,w�A�>�jQȱw"�U��7*�A���W�9�P�$��h�d-�/��f`��Y��l�@]�U
_uX�Mh�k�mr��n��wGϼZ0b�����-�$�DB4��I��&h�p�gP`:@&���*ym��(-���"NS$q�8�۳DmN�d]�~�xaF�³����l������y3�G�x@(�:�ʩ�$��͚���Ƨ�T�E����OO�,���:�8u^��j`ͶӨj��;N�Bp'6�k
 p]v)�:����<�e�g��!��Sw{q;DXZ��n�hP����WD��
W����ܹ��6��d��d����p�p��U�F=���,����>]�`}��E�����q�8��̲��
2��)���}R�{g鈒�CN���)�œW�f�ʽ�լ�@1<�@Rj���L�b��f���u�s�{��)ȅ�}�6ɥog����� ��L�8e�wP�cPٓ�)��
SE�Z�m�Yn ]�P�z�ȍ�<�m�v�mZJyU�yE?���05�0��6�jt<���Q8�}`�lʺ�jTڇ}wx�>=?��׹��4���?9̾���`��S���lL�e�:#���U�Nξ9=�:?�X�pT#�n���G�G��w����vvz�"���1��d�e��-E�8��z��Y�:��۩�)���Lڪ��(g�c!�����`.Vm��[q��֝QU�I�$=�P�HE4���4ORdC��m4�gR��6X�mR�g#�u0��~,����(�����p\ݭKo��Y;�4�A9�7��Sq�n���C��l&��5���T��D`�XQ~YEJ����U!�]à}-:ʖo	-��kM�W���H��B��j����5�0֎D�
e�p�:�m��S�E\�T�"��"X߆�2Ho��{��k3m]f�IC�{вVN���V]��<�U��W��K�����5S�@�RR��1��X�:�I
��DZQg�1/�=�N��to��l7,���N��P-�3ɉ��<�b�R��+k�D(l�
K���[��4��ջeZ߽5��{���L����	QG\��.lU;(tup8�-�􏫸����M����r6M�[�r�����2�mkB�!�[֬�2x�����3��)��q�����p̞2r�)H+[D��Z�X��^"w*T����S)-�P%�nի�j',�[�V���vRu*�LB]i��-}jc,�y���	8�oƽ��9�bKg<��TC+Z��eK�,��:�#X�#�?(B�������ԫ��2���(='����W�W�Wߞ����}�4UzbYn�~H	o	(C�'`i��MJ؅�d�@*��s���|ux�W��N��`�ޜ����\ONjI��p�K/��/cL��fv�Q�Y*��
�ڳQ8�݌�+W����=ZR'�eB��٫e��Q(�^i-�Qz����T��)O�?�/)��.��(%�T���b����I���n4���L�}�5���b+�p؋x>��7�/��d4B�n�+��v��ܩ�\F#KKn#��C���=e�*dK8������m=3E�D�RB���#I�)�
b�J$I/ѪA	�>��,dE�r�
�V�~*�A i_���N��W��h0���iXOxZ��j���˽(�z��ĴZu��ZO9"�6{���I����t|���o@�
{��T�^B>�<�O<���u�LfQ8ң�8�G�hO:֧]ڐc;K]�n\�;yY�°�#M�}�N,���o�B�b[H�H��UGv���6���5vk�y89
�n2��
Y	�e<֔�8T����a�/��<��`�z�/��6�G�`��՜�v��D�p���Cԓk�����	���a�f���'��,u�� �d�H#N�����c��W[��A�wK��.��[�oY����G��t-�|s|�������q���˓�g&�Rrl�Kn�Q�ުԅ��lm7��V��VOp#.�w�>\����d뻺�g�$)>�Zv�@�����G%u�rx��q��俎��/;�������_ś�~_�9���E5�-��)��?^�wn��?ѕ�N�0uK	[�4BP1�3��Dm ɓ�z��2`��Wl����vvC�7K�!��7�'�T�T.H�zh��(�?�s4z�F@<=8��Ǎ
��Ӏ��pv�z*�D��Č
�� Dř@�~��*���D�W����a4�t�:9�F�(`D1Z�dځϊ�� ~�		��$�S���?����� �QRN�ՑY�J�N��@���`�� �m�T�	��u+�O�Ҋ�6ጁ>�<'�l�����E����;�����2<)0\�'ðI����`��������U�5�9�N��3 MaC��3��ϴ/F��	�K�IM�N�\��C"�"��Sa�"�cٛ��Z
�v�/��~%i?K���!��U��.1�����	�Ee$�Y.�`��<���F�\��}�ס��}��^�6x�Xc�Y��Fc�a����;��gL8�©Srg��w�-�N�sa���k���1�@�M�-i\)>eKwC��)Y���0LHCW��`y<�xl��T>5iS��P|�M�]v�AG�F���a���X2�`�1�IAT��mE;��f�������x)�G��Kz�Y�!�p�*y��{wz�U��Ջ6�lKQZNر�*t�����8��!�u�7�p�{��x1g���O*�+^�����+��^-�k��3��,\�l��lB?N���{[��o���������=>���Ap��i&�����xɭً�և։h	��i*h�
��20��DzW��fY���޳��z�&��6*�b��	�㡜�C���0��.x�E�#��!#x�gGB��%]{	1�I{�����&u*U�G�݊i�tZȐ��5oY�B��GFc�E�$I?��g�̗��L!P�����f�ҝ�m�kpj�d��r��V2`�d��]�s�m��z�
>Y��b1NE@��(WJ��Vf
�>�i��Bg�]5����O�=
�!��b�w�NjY0���7tn�t�ko����9�
>��ޚpF��8�-q��cyK���;:����&�k�OʇuqFt�f����g�D6�!�����bOvVM`��0���ugiL�6����eqh%E�\aC\b���K�rm�\�=���͞���Z�-ןM�m�].�xw�X�,�"�Z�~�?��V�U��*��J�UٮW��Z��l�Ge�V����hr:ϳ�-{����,A��4������xԏ���N�I<b�d�dP�Tk�j�T�	*ͽ�^�U�m�lWj�ۭ�P�U*���֭��%�L�ͽ�^�R��?����>S
J'���~8y��;�1��D�R���b��w#��y��C#��t�+~�R�%�l��NH�eJv�	V�B�_��@&����?(_��ܳ��y��/���s?~(���s��`y_V�?�_����^��ro1���腠��|;�{2��/��}Y
���zǍ�q7�U��RM�d��m��_�8����
��/>����H����ߋ��������"�u��[�?�8������/�9�“
z�nQg6a�Z�@�9�7g' �������K��R(��=z��so��շ���ׇ�W��'=���Q��=y&�F,Qt��{�:x/�c��O�*�y�nO�NTCԵ�/ON���|�{3NҠƐ*��?�Lr�DG�B�Š��K��>���÷a�����@j��bS�|�T�w	��7�?K�FS_}�p�Ԟ�5j�3/O���
�B��
r�������_�5���E�p���{~3�������b6E/��Pă��m�������S�&���L��W[�z�?��c�����U�_#�5���~��?�?�?�?�?�ϿU��Yt���m1��(���m,�+UW���j������}K� 7� �x�w�kͼ�m�lQ��F�7���������m�/�ۓ��>�vg0�O���~�P�zAE�[�����x Z
2\K�'*j���P�3�ק���äH5�^B�1��4��>>1���j�`#A��%�\	`��ڳ����l�g	� 1��t��-��(��.�b�o��k�|�3�YȭF4�"�7G�o�^�8~���LJ�A�}�mD�F���H@2P�.�
����&��v�&H�fk�Mgq��4��`L��	��2�KW|̣^�HV!�8�W~��ɛ������z}q~���7�P?�R��AO��������v�_��iT�����o��s^K���o4f���|��ڜE
�'U�W�Ǽ��Z�ϥ��sp��>>/]�;��������U�_�����=����ߨ�����;��2��Y�4���\>|~��J���]�C��{�����q�����O�9�a��B����_�.^�/�Ǘ��o�� ��f��o�@����?���#�����K�������������_�o����k��rx�,#��7�y��
`�E�%�������_1K���#�i��t�4�St�3��gx����sp��.����=xOGd�����¹�f�W�_+�Qp8��gg�WAnEA������N<�b�(��t1����h<���ݖ��G���<��o�+����u,����c)��nm����]���������q�Wہ>�	�݇��zw<����:dr.~֔��c�]L�l��_��݈0qz�>���������P�Q2��t��Y�ep�
���CȰ�~�#�}�\�/�`�oN23�zmx��x�����>_�C|ٞ��p8�O��d�.s���j/L!�YK���8�}���A�0�E
CL�9����tI7A.�b�Do���ɓ�1>��3س�+���C�X-�|�\��O^;��^G��x0� ��վ�����X��9Uخ�1��#��BpB�\Lr�k?8T�w�a
u|��w:+��a
2��GK� ۂ`{��m2рW�$���x~���G�.=��8��c���a�j���6:T.���-�[-�9��+���	T��Kj��W�~�<�!

`9Q��Ō�p�}ۻ5�@	��Qh3����~k�٩4їq����(!��{�z�(�W#	^���Zs��IUD��{�~� 2Za��J	 ��d�^G�B��Ʃd,Y��-��@L��,������K��'�ytM��m�_"�ݕ$+ ��y�gx�Q0��;��\��BY�%%Q�i��Z1����Ȑ��ʫh&DoNήjgo^�rO��g�`^����
�Z���R?Z;��k4�Ñ

(�۹*2�?	��`�k�� wM�c8���Qw<�a�|
烸k�v��l�
N���(W�g
���M�D.ɸW`���ᄺ����&ޮ�MP
�B񒬂�}�I-�̥��x�k�iO��mL&� �@��c��J� J��&Jk������x!����b��5Mó�Gj����	p��V�o>���6h�l����c��c��I��y�:��y�FF��a�B����T��u�s4X�:����x��k1�p~[���e���̯1��F�QINT�>Z�'�񳇵R��d��M�@k��nfe�Ui<�Yds��gN��&���%���b+���}�0��,��k�	�O�Z�C��;��h���|f����d�v�-o��ĝ9�kb���}X��2�u1~��u����_�z��G���UQ�����߽j�]�����h�?�d��GT�̘pw����J����k��X�������)b-ᴗ&�f��?��z:#�Da2��(Y�D���ϟRe�Tk��^��WoXn�v]�]��*U�j�P+�{�Z���#H��-!�u&�<�Rq����Y'=�����|
'�`>h�!$��bqZfw3�mTʂ�	ft4��M��y�;����Z���
�������m�w��-���W���5����6��&�������w�꿜F�c����4
^
Q��C18u˂�Z݄.�S���0ȱb�'O��R�*j>}T���+��t�jš�I0�&�����)ο��6�Ɲ�\��l<�dEq�N<8�h�'�y4b�4���ٛ�hM�l�^t��{w��,
�Y0�'�|
ȁi���,iTl�l�
�w
�[H�D'�a��`��<�b�w�@�WUU`��@!�_��?�P�
c]��n�H���`t�`1��!f���ԾXK�f��t���>�^����x0�=�AL��f�@��H����|J`
BL>*d�c��v4���XP�Xn	<Cu�,�A�*J�����Kqr��A)x�E/c�G��x6����O���ay��<���Sp����|>�{��Ç��Ѣ<�^?�fϞK$��,�J�"Ǔ��"�%(`�a���s8��K�N:8w��hF�Ҭ�̺�Xp�klsN�y/���s�י\+3p�W��q���f���
��h@�������9���'xN	_r�z<��+����g)�ŏb�ϣ_��'��0���_�PK\�?yR��PC
�#̈}:���,����Z��j���k��1L���
��;bc�O��6�Y�l�7�m~��Gz+1{�Yi��-ݬ�Y<���`�H���I�`��v��!���MjT�׼7^��!0��%�pU�s`�b$���3��&�q�Hۨ�u#���ע��n�5�����ډV=��ŔI�!�5���t:��:��g�m8�7j}���γ?O�d�Ã�`�iO�c��S�ؿ�|{|���9�
xҷB2��2l���২{36��l��꽠Og��ֳb��O|{ф�BS���$�ܗj�GC��k�Q��!SzTZUZ*=H�����a`g��!6�.1��<bD,`�<"��tv�(UŖ5���ȕѭ�T|u|q�������'�'W?Q!xyruv|y�<��ׇW'GoN/��o.^�_�79��]�u��
D�h_�pyu�����li�jϟ���g��`�S��V���h�a$�sY
����˒
��po~��l��G�
��h�˯���g[�G��/��<fv�#'���M��`�7����A܁��@��.
&-5�����7�TX�8=���@,p�ވ����Y4ow� ���=�BH�����y�eo1�Aƕ�/�f���U�y��2:F��~s���y�ޢ�r�*ً�9�2��GTZ�Jf�7X�W�]���ˣ�� �6��x��U��	�zM���
���K?(���/l��?*D�����l<���.�2��}�}�@���9��E��I����q���
B�{!��ǧLJ�F&%"��l�E�/_�m�m�I��(�r�ά��\�3)��>�j'��P^�$�7�-+�$���{�|&���`��UEs3���P�s[E$6��j��F����BAE?�l�%<�B@��w���	L�����V��>��F�6D
��~�H���"V�m����	��/�
�Y_m�k�lH�`������TwB�@�b�{G��	R�#��Xm���!��w���މ���"F��,d��Sw��|p�I�Ai�?架�m\���_����@��8o�tٞh˞�	Pz����%o�H�����H�C9wO����h4I����A�[��cFF�'h�������UQ�7'~����0��D@�8A�8_"���4��e	-�t�H�Ml%r�mbQ5��8�y��"а�o]��(bߖ��c��a��0Q U?����B��	��A��pU&��>��q��Uϋ���ź�[ݸ�6h�[��T�A5���Śq}�N8���{��pZ}�X�d�髇���C�1N����n�Pt���w#,�3�&5� a��IQ.��/�J�&n%惛9�ij
9R	�i�뵟�Z����.��~�x�~ڰ���u1xj���V�6f�$�U�=�`tB���-�����"_��E�H:�x��{�K��L�m���~!!�'�y��#�W���7[%�"����s!7Sk;k���C�6o�q�Z(di.\��Bf1f������rA�
'\M�JZ�8o�vVm$��Gn�?�9Y8Wz�p�P|
%W�NgY��*Lve�2����X�����	e�W��'��^G��^�p�r���4��?m�AK�e�0F�]>��,@��-ld�a1��P�T����ৱG�$<)��V�L%���k�C���K�)�38�pM)z����^-�1�)�D)�T!8Z8�����5��l�)8),
)�s1���O�a�~8�a����y+Q��1��&�Daw#pr?�-)m��K�2z�K/�\�R752�T�>���L�il��pz�7���5I����������E�"|߶�\�	}-,8����w,��3�����
��������*O|�zY��B��7��G�0����G
��.?��_p���usH�Mx$^�\ި�o�6*b�n~jl���%N�#�z#Vׯd��#�.�@�Y��A߰a�@u*\h�).���N�4���oУpf�N+l��k���>���P{���qR��Q���B�����
�w��#�D�j6��G���f2�Z2�Z�v+�'��ěio.A��CL�06�~Jk���2�֒�����֎����XO�[�m~xw^o�L��}U�[M���m-��V2�-n��QH5��m�[e2���dnn�mM��c��o���~��%�����B���7�10�u��t��wPN=8��!ip��<�C���ZB��f�)Cja�6����2�oR(�_�ۧ�g�\��Y,��i���q��~:8<j�o�{|r���˿�,�_��ͷ[�ϻ�h<�~����a��/�WW7yu��b�4]�y�c�Mk�l��S��1w8݃�-_�x{:�O}�'cԇ	��ad`�BgŸ�W�o�)�E�8��U��ѫ�(���}6ǃɃ�;<v̦'����`��1s��)��2���uav�s�]�}�>��1{~�
���[ZQ��W���$K�!$C�|6���) LMz�`��"|cS:��1��[Eż)ݏ&F��[)��H}�*N'�5�S݉])�T�?�����r
M=/j�K��-��:j4��tP��
�IЛ�BN�D�-u�"-�&���Ӷ԰9x�C�N�]Qk|�WN�
�6V��v�E�XD���<��^�'?F�^���he��A��{��hc���=9�ǭ����`I�	�f� �m�V.��$P��T���T��l�1Xs;:�!P�}2\ӭE��z�ڵJ����O�Ɔ���S��Z��#�mj�,�0D���a�]*��@fǓ�F�ǃ,�|K�Y��Z�JN�yѳ�(�7�
�H�z�hP�d��Y��큾�L�eY~��]g����j���k�ϻ�L�p�!����B��P��W0��@�py��B�:�K���I�	nO�:L��r{�W�2G�{�b1��]�d��_��D�QQKt�vM�1p
1k�Y�����l8�:��Va��(�?e�W����Lh�`��E�t�-�qC�����!�mW���+ϑ
:Y�Xd�k(�'vhm�W�Y�|�\���rf�a����,��#���J�7L4o�Y�s�G]���A��Dr�׋�	LU��3�ٹq��!f��y�G���c���7�%�)X1�t�,�� d.Lbn9y,]�n/\�ǷG��CX#�4��*��W�R�<Y�%N�%�F0�ٔ�^���������"/��,�X�y�	�B�Eߘ�IL&ε>��Ě�BM�3��B�����YUݖJ%�*��qt'������}9(~�S�<:l��n�a�
'gN1��}_.���tqkq21�^�{��7\e�0?<�4S'#e\�X
��k�z]+=��`��x����;���Η���^�}����o� ��w��f���B��U��6�-̽�6���2��`�х}]a+1��A��k�N�c��#Ke[�v��>)�!!��
�
�n9&s��Yv
�d:,�梬��ë���3��R�]�K۸[�y�����}t�k�ڰ�3�Ŕ�kleJ�c��'SP)�"!�Y�7(c̓�>�{�x?�m>9N@p�����zT0�@�GsK"��-�{w��/�%ƉK��`�XNl�!�D�u4;���;��������N�n�|T}�|��M�V��������(i�.�}�ò2�L04?�Wͭ���@'���#�-�$@ �UXjp~���`�W8�m�/�)�k]\e���
�E8�x�{���{��\���麄�h|�U�E��w{ۃs���_�„?�(��
_��
�UK�u��-���T��"��Hm7{x��z�x�-
���\Z����P����uS���e�%�8�8�I�Z%\�W"a�f�߉!ء�m8�3���z���X"����ʗː��$5y�j�ON��DJ��F=XC��
�Fz9�U%i���]9��n��F9��W� ��QC��r�DG��Y���£������k��,.��LA��o�1r��x�j��DB��d������Y�{t�i�`�[{6�l㷿ǃ��p�HW$`k�O�a�G]�,�*�
B1�L?l��z�i%	Š�I�\t��yVz�� \��|�5�"u%�Q.���`�9�d�Y��߲k���B=���jkϨ
3��+#���?�F"���Z�G8-���:�R��8�t���I����ƹ�ws(�>�?i����N$��S�����VO
<"�D.X������+�)�DZ'���X��ȤG�[m���;��w���n0��dt��iU��^
�DL1,���J.\��!��S���<����/I���M!����Ŏx��A����'"p#2~cM�R-���"o�N��9Y�4��Bc﹪���@W�@��US/���(@�C�0�j�:��Xt�����ʼ���,�����t���DD���N�B��RUi.��~�g��/?�Wo�4W(�
90s�;���#�eJ��17XIܳx��_���,�X���,2���^���,�0s��������Xp�
z�үn)������p}����[���K=����O�
�m�n��~_�$�~��%�[ħ��\-��\YN"�xXP�<��z����j!E�=x^:�/�/��K{��M����P`��|n*��ԳB6`���j�,_���ڌ�����h��V�����v�89�U�\'z��]�7���t@z��T'd�ݾ6�ѯ��H�K��/]���yR��P���4~����U�n�^�<)7�?A�+n9���
P?e�-��/v�I��pF��m�y�t	^��̬Cb[Q�W'���j�G�'�1�f����J�I{3��E�z����-��_�\$���&�h�}P�/�����A!pqr���q�1#6�rv���Q������B�i�Q�	�PDhC�S7�o���_�A���0�4�"�j�GH]�.�u��.��5�^E�Kw�E�cɼ~i�h�~�2����F�ˇ��˄����16Ks���s��K�G��(��~���q�].E�3siӠ'ۅn?p�r��V�0g[��eG�����m���nSR��8��=��rmQ1�.��^���|�'>
`F�Ӌ���G�7��T�zE��[���V�����͚ 
q�I/��8R�$�8W
�@���r&з�|���(�Jrd^���#��xJ�X
9�	�`�`�HH�<��c��0�
kH��,N~�DZ7����Kʰ#4���KP6�u����3���yUr2�tjX���<�{}��Yd�����̱�L^��EpM���ViP��t!�Cu��G��]~��`�ŭQ�y\��!�:\���l�+ڊG��1,P�iC�܉0��X�A
���+�V�V�2>v���Zm�Zb�-|�ձ���b�:�Q���遪��c��[dqs,������+S��e�c*Y�&4,[��dn��p��U�E���2��-�Qz�NZ��'ۖ(�_�7%���r�1�-���8�_�G�����X}���c��/6��k�lvz{͝����!oz����*����1��|jhO��=��`��mIo�����4}��Jxj��k����%�?=��퍨�����B-�#��ǯIc�2�f�X����v<`	�ܗK1�_h*0w��ݫ����G��×_���B�6����d,S�G�H?eʼnfq��I�N�4E^�)�z��Ю<�8º����Xn!C���̿k��N��^m�G�w�#�5��fͩ�ۡ��?���**a[��FU%l��Q+��i��Y�2�m�O�N��d
�(\�B}k9��y�yK���k�r*�x؊�&V��Q�CU��sb:���tr�o��U�P�L���2":�͜�r�9�d�W�0���a#�wֱ
G~Ol9Ԯ_�߰O��(�H0��v�4B0�r�O��F�x	2O�g`�ܔ�����܄�C��j�qwW��{aKj16���
�OC�`����|2!�h#�q!�?I�@�$bڏogi+�&�x�!b�:ĺ���JB�&�Y�*�f,��;B�c"��[��F����}ξ�;vWZ��ƒ�EK��C�6�{=��`:���P1�񻘈�4˛Z��.f���.)�������t�hT��	~c��#�e�k֟X�ѧL�d�uj����뒔�z��G֊��|9�s�f���xFac�H��M8ށ�ڍ��!<��&γ�Lnn��Ʉ�`tO;z�C��D�S�)b!�h�å�a��IziӔ�U�TU���3}D�
�ۜ��"�7xc���{��{yRd�Cᙍ�d���V��DRn��� �M���1|chd��qbS.�{����c̡)*�q��������"E)CG�B�Ϳ�5|Drˉ��r�b�QmP|���
��3�ߦ��ıcQ��_����j�3ة����;>�������2s�^i�*�Zn�G���&|���a���Q4h��r�TxjCM+U��M(.�;�O�
�f��y�sh�~4�2�\-�7.z���LK������ �[�k�s�ņ�kN$'�4x������
�����#�O��n������vz?�������8��:N�ǘ�y'�xnF�By�=T#hf���4�ҞQ�a2���qҵ��ɇaw3�xM�%x�0~���i�YߚضB�rg��Ց=����RwD��6P�e�mm�
�Ê�b��ִZU���\/�"B��O���Gs�¸o�����x�%w�T�^>/W.߽��%ER�D�FN�y��$�6��>�<�*^�|4�y�D~%%n���)Z���N���qNmg�2�kr_w��kQ-chD��ih���T��<�ᔾZ��&Q\��'����c��<�j

�j�#~<h3Xp��,m|(0n`̂�1�c��[����ꁺ{�1�G���C�j��V?���Q#��
B�	�}$�+�%�!�Cg~%����K��0�x|&���d�>��I��x�]��[��hc�֝1Sa��/{��?R�oJ�.���X�6f�i՞Y�ln��1�c��ϑ��ƕ����"6�N5t��I�s�ө�~�_��'��sKO�Nƣ�<Z|l�8N7�-q�
|'�E$�XI�P�cv�.Ş��C~�ؙ,;���f�|<���czׅ�ԑ>0�kP��n���g��6�k���F��YǗl����H�۶���_��ic[�,�:��]%u6~/>ֲ��9ޔ�h�5E�$%K=���� %�H�~�8`p����lV��o�k���;׿����EO��R˽-M/c�T�j�ZN]6���ƑK\�0���Ӄ3��C��"�7�N����t�Q,w���n��r���:���	T�ޛ�-�*:w�޽�J�>�J��?�q����
fo1�@y��v�Q��O�Ӯ:�|����&w��K�dH��'�ۏ�����:w��L>Q~`ȵg��ĥ�6[���=�=w�'9�S��w�Fhyv��G��0ȞC;c��O�"�f���eݕO��G���;9��|J(�gd"	��
��p��ާ�0,5ϰ��d���B��k������|>\�$3��k�
�9�x�MB�L�_�&M6‰ŵ��`�����(V˖�#����NIbqR�	�<4t����fC^�pA�eI�1�4�4�o7���F�nΜ��A,zJu�uw��/ ��͍Q���…�0M�Q�������Z�������u}
�A�)�~��	�.E�+���.��ux�G3���zgG����V��=�ٵ0d�"_GP6�ѝ)����X)�G\2��`D�>l���	�H�e���9���>^t���^=8�V� �6ug��Q3��QNQxF-Y,J7L<�9t�
h.M��p)�P �/k�����r�?0�?>9���Ӛk�ビu��r�Ef�ʛ�az{��^���$gH]˻�\�B��gkr�j�ښ�hWՕf�r�eS��a�>t�0�U�����"V��k�tT�nh��g�oh��%'Ae��Q��7�"^�.u���BK�QrV� 
��ZN�u�:�Us�V���lj7y��i;�R	\���7:�l���!-���ÒwATR����G`-�j	5�
����}��_�'X9/'����@��+���v�����&.�2���&�[�+�MR�Ҫ�P���
,�����U.��qb�m�����.�I���.\G����x��������*RK�G�NF2���#��O�j��7��e�P�zg�8~�&
�d�	��`�ǑX�n�Ӳ�/���Ȕx��&��F�����w�$�\��!ok��U���O�wR������3ި�;kY�{8��}�� �%��I��)7Me���N�p�S
;:<���>��k�~��q���� mʡ���лK�t��HO$lqY�@��Uňuh�h�	��n	�:�D
"�&R�%<����h~m�Ws�P��Ż�كUN��+#��)�*���?�7��MT���:��f�;�S�
��?v�	yуУ}9p
��N!�e�+8�2�q���D�-lZ��.o�5,^I��p.Z�7Z�Q9<?�����]S�*}2(�Oѓ��gIDR��qg�,��]J0��v1(���O��e/���a���&���Q���yF?О�o�ե��+�ٯ����p=�	�d����ãއ\Q���*��@��Xü�"R�x�`��+i��]�Cwc֑Y��`��9�u�'jV}9u>��
{�2��2Q���N-�{:^���o#Im
��/o
��03�ӘrXG3�w�0�a��"��I�PM������
���1^�2`�����j���^�1R����B8�|��%��-iC�#���S��Kym��HkYK7��ĩh� K|7��1[Tn(�c(��en8r�P���HD�Fۨ9���#˖Q eu��z�r�F+Ij����kb�6YW|Rq��_��~��Iq�;�R�S�>0^������
�)ο03,~F�O���ph��[CѬ���F/�� Jq	��x�I���3?�B�W���x�U�b�_��}��a��n0�|�'������R��[H�O�z�8�Fn�I�o�J=ͯ�
c�.�+�=��d�����as�5������-�Q�GUqEeh�}ަ�ަ̵ަL��]L�ih�*��*�vtԂ�'}���#�u�8�H/]ZQ�Yj,%C�%�S?��O�I��߷7��uZN��)\�e��
�T��l�����B�}#�No���5��jt��e��1����Pc,���{�S�ɛ�qHW����B �I�ؠ�N���	�����Sk�H�3[�@�H�M`�h�s�Y����Y-ugn���M8�E�
�y���Wһ��� ��������x���A�'d�?Iwà���t:�?d���]�R��X��4��uZw�TƅVUU#�۱A��2�q���.����B�(��}֭1�o���hh`���4�Ӫuk�7��.���,�{�2ކ�6���zf׭�	��a5��}۩��Q�ߍJ���4�^ˬ7L�iԁ^w��N��f��h	zԛ���T���F���0h$'.f��
���Bᶊ':C�'�7Q�H���ovPܰ����o�~��ۢ�6�v�[e(�V�ע_�~�m�o�~[�ۦ��v9>��1��uF�oq�M\
~y��'0͹����fZ�i�_��E�%�~@��۸���Ї��C+>��$2z�߳w�L���]��oH�,�!n��V�M�77����'GRH	g�14�@X�
:51u)�?���RV02fg�0�GGa���������0�P
��E	�<�$�€�<6�˼d�����7^=���t�C�?��LcI������V�e�e�`�vNJ-[����*�lT
U��1��
�j.��p��D.9���v���D��C��)旎�-$N��G��/Uʑ�l��!��9�'x=
�Ǣ��/���N.΍��G���Y��K�MA�-o�1)l�>P�r% C/ �H�����;��{}���#���=<?>�
�����ᛋ��3�����]���+����TK	nZf���W���d��ԕ�,5�<��P��0>Bs���o���� oxuc�x��"�]r�M[e��ȗ�g¸T5�?#�m�1c�r��M���6�3��x�_Co�m�_�X��G=�P�-�+�!.�=��3�R~/d���;%�\�t�ɤ�$��7��|�Q'��Yϛ*�E"�֢�����d<7��	Km�'P�\�<,̺<���nF�ћfbUi����� Gk9�A��
��')��&M���
��F��Q�)!I��w����W����W�)H�?����f�<�@��฽���3gs��%r�DD�cqH�{�)��%���ߦ�	��TE�<C*$!�4���4�"%V��
mS��n�J<Y���h�EL�� ��<�LSQ��)��W���R���(5P�b�Ƒi�*�Kr3��/��Gl=n'8��u<�@�7��$�"&"���F84bv��p�y#��p�͛(�d�_��Վ��/�޵�5��d�I�\����BD)� �6�r�|bwx낐���Wj;�00
�������*��=Ye�4w�Lܪ5�7�+fx�Bگ6?m��Rn\����_a����3������t���^��P\���|s_ۥ�G�W���4*-i"�x ��8M7�~�d��_���JɆ�X��A��dY`�4�*����R���4U� ˷(��5�X\�||��d���Q�Ȃ�D6�F)�8�ըZ1N��a���q���LØ�V@�I�,PA]��No�s�J縖�_��f~ھ��y�k�利�{�l�(`�EI@,	�Y�UhG����/�w�
�;x��C���F�����`"��
��* �2���	S��#��$�G��4��@`��O/}��}^q(niW�o}֨�^̠�p�F)�Imӛ�lrk���E�
���`�J堁����BO~RC����ۺ	��9gaL�	8�_��\)eZl�"K�e&%�f�ϥ�
m�!�w˦M�qX�����Wx,3d3��w��ӱ��i��X�&�'"s	�����1��4��dDĢI��at���S�"�e�u<3�0��.n��n�|Q%�ܐ�t�+aO�4E[ka�ζ������6�fc�����U���_?)�=�&��bE=�0L��h����;-��PlO��S־W�*}`*��ԧb}(����ǝ7��`hW��F[@<�Ҏ��q�LS2nZ��g-
p�K�	A�a�{��ye�IWd��t�XHow�-����
Ө�V;o��yhg�z�_�9Y�e�,C{�lTƩ���S��Q�ƀ(��7��,a4��w�w��g�Ѭ�z�Ѯ�]i�ڏ�H.L�(� �;�.*L0�-X���s�8<� ��KV�YǾ��ԩ��e�v������S��4ߩ

��f�
�s��6[9ܺl��ۼl��t*�C%J��·�V�Lo�8���D��Q��jN��r\yz����%z����Y¿�-"��
y��(�X�־��+Ih)��+����r�a��2s����WDa�z�*|è#�>���Ï1Gil��sA���xp�8uz�UϾ�w/����B.#�oFe�����Ɲ&?�������3]�w2�J�������7���凫��ǔW�w���'���
&*�a%��;��{��ԩh��N�V0l���n���X�/hX�O/��̽9XE�Ф��eO��c�	�H @�i��/���q��n۴ccw�jS܂ �fI����^�@��.�U��_���1*�V�U���M��W=|+�a�Ɗҁe_W�$m��(R��̭l�t�̿�V��x9u9,O���*3�@79څ~�-r	G)U	=�D�x�E<�1$�B�’��H-�*��;���pd(�@�~"s���'��i��r�_:L9W޼���O�+��H�	���ԓ� ��3bAj�I�6���0zJ��#���t�rj�A�q���a���Q�ǀ?�FJ�8^ �)�_��g}|�a1�~�KW
rp&�Nk.����k��YG~�ush��3��x���78�rh�#�z6��@��<��
�%�C*R��T@S�d0�Ӂ��j�f5���
A�iI��@�Bf�����ӹ��6��5Z��9Zy
�P�7Tq���.A�{&��it�+D��TK!�?����4<�C	Y�
A(�A�N:oGdu��y�Ʋ�,�a=�|\L�+(�h�@����������xQ����ֽZ��z٢b?����U��'�΢'T�
az���X�8Nê��!E��$+ա��Vޟ���`����6�q�U�k2_�2�Hp��N���̣k�KQPk��v[�_��#qi�;��U � ,�Em[;���Bx>"�*�-� X��U%�'��m�Т�]���L!Q�4���h?�����.�2���c�fׄ�k׫�-5�3�������=�I�
��Z�3P��]M��M�3����t��>jJ��l�o��cK�e���P
Q1%����0�~�PO�!T�<�Ўw
�#
D�����f	�����1psУpV�T4T�84E�D�8_�:uB���]u�9��M4К�4X��p�����(ɳ���&*��a�QR0�y޼`���4萄��"�k�$��\��#�,HD~�>=�Z'
��I����î�e̺�zEO����zU�霊$�#<2�&�+W�j�>9�wU�RU/�l%��JPU/��
*�
��:)�Ϭ��T���m	ު��(���<�f���!�N��v���DR=���޼px�Nz]x
���\�\!U��*�%���7s�ݪ��F�[m8�^-�Ty�IMUHB�]�HJ8��*)�%��2-�(B^�(��jp95T}KX+S�F��
<�K��R.2uGQV���'�<�r��`ծQ{%�ƪ�I��pևsx�7��J/��<K(��Eʲ�;�}IK���=�"%�6��	{�@�2C��7����kU��+$��<~�D�s���ڴ�ٗQ)��*G�ńP��%G�$�h����q��@���i��J!R��/�밨=�K��c�M$BE�@^���,@�V�󨱔9�n���e��tZ��"5T�k���Ϻ:<�_D
R��7�t���I�1��
���Rd �YBM
l*���������2���Ȍ���Ȟ�xyoD>���+f��N$H�g����ϴ��i�8sr":AZP�������H�Q�g��=kw�6��j�
�魩eQ�^�&=N���8��G�{�Y�b�%R%)?���y HQ���9�^��D$�`03f`��$�����a�
��'�J��ɪ�
��7�iv���t���ԥ���ֆ
�`:���|��k���p��'�APB^�]�BȻ�v��V�.��䡈��ẁ�A<�O\�r��	�^�����
�*�׌Z��WZN�����<�?��-X��˖��ܖ"67�[���>Q "H�֖�[���`���a��v_i�]�S�9�)�n�y�C�E<,��f�Y5�K�F_ݕV���������t�li���W��@�gYQ�0!��7k�;��q��#��{fH0���OX�E�����d/�1yZF����
�R۠�d<�u�g����No��b��/Aֻ��6ױU����ز��:K�,M)�zY5'Рg�S�^!��};�Y��$<�5���I�'B
B��0ѻ�6��-j���Ļ(h���쉓�q�J��u�.ת�D`�n��7$$�Ԣ8�2�w���L���it�ġ���vp�N#=xR�s�=
�ٹƺi�,,�SR�@)�ME��s'۞X:�tl:4�m5�Eb��[(����G?~�Q��#;X6�cw�F\7!��T�2�`0,2��#oӅ���`5���bm�N��m�p�{��:��UT���V���<W�l��V�Ե\Q~��6'�T���*5F�x�BqI�%XD��"2�y�hg��4Z�`&�ȭʬ�\��>��L*��Ft��>��B��Dn[z��)���G��r�
���v��]�g��,eQ�ZD��B�����ݸ'���/�kd��P�����Ѓ�mw�I�h�.̳�LΖ�F(t�%�=����yP�.a���Ls:$�B{:+!/�*˭��\�),E��DK�q�x��
F�a���h��A{����k����d���l�1���B˚p�i��3pG��5.bͯ`�Jx�͕7�(�Z�g�
���[@z:M�L�6HQ�,��3�񝚎r�O'��7�cy��a��.|g�~u����o�(�Q�b<u�;<��b2A`�n5ݿ�{Gb�o�;v|)A�\�A`�T	�y�'t�J���x��{�Z��v�6����S%5
#�h�G��u<��T�f+ӳnj
*깦��
� ��d�?d�?�u�����p׮6�/c�]m�%V��G#��~��1��|b�>��Ӄn���V�rJ��xү��1]i���pΈ�43�3��W�+���;�z}Yd畵�b�ߐVgen@7��,�a6�\�@Z�?��I��Į
Ep�q�p�CM���<J�$�I8���(Y��F7�|y�S�tF�;����b�@��!��-�if�y,	���)��$;��X�%��;+Ld�|�_3݂� 3�h�#�E�3h�Cyyn��̋�QX�ϻ�^�
���쯑�y���0�M`��<Jג0�9_��&L�!�]�,8Ϋ���@\���3N9���냢�'���<�ɡ�PB�$;��jB9}�Fg��&��o>\	\f{&O�XL�(�M��ks�P]��U'+��ލ�@�_�.��y���'���"G,ڨ���J1�B�_�u[,aI;���fW��lj�乑��ē\|�zCp�	�<ë���g�t�)8�"���L�OB�p�@u�g�����k����$?�˜k�f��Tr+�A���7�V�Q�1�������T�qiN��ɦ�m��p���_��Q33d�g�u��N�b:C,�$-~&�,U��0.�GI�xQG���X�U�CW��	�
��8�]����o��xx�Ų��7�a.k�L�+]�!�Oߡz�4�5XR�����tu6oσ�w�u��(K�kZ'���S�����U���U\���٘+��^Ҋ`-J`i59
�XV�^�f^�Uqm��Z�.�&�|S�����4�T9zK+�p�RG������~�Y%eqo��@)�[���j�	O� Lg��+os21��H^B�#��_�!����+1|A\�ゝ>�=�������g˲	�lu�Ն8��R���OG�B�:�MQ�#R)�"ZY[�UYӓ�S���LSG�
S��l1\�_�4���({I�C���CT�μ1�dz�e��)}fk␅���1ƃj�-���t��"�E(�7�,3U8��!��D�[��O�R�'��W-�a��7��Q�7���/�%�[v�͸W�C
�J����h7�(��1�ɿ�+�T�����Gi-�r�`�d��ai��ǿ��_t9��Z�W�[�q�:�j��փԁ;��W�a���m���l�;M����փԾ�o�!���(���J�7�/�b�����j���u`������t���4��W_�����n0�
t[[�?��?rQ:�b�kf��&�����|�b���T<��Ck��w�M��e�f)���wc<'�]|7�RD�rda�L�L������i�{��
�3w��q����Cx�P*k/��9��o�R|
�]N��`2q��y04�h'n+�Y��X�'�w�P��aR�%�ZťͨW�zQm��,�>ә"ĥ?�R<8�BE����G���샪aˮ���x�W������t
��q���/8�[v�t��B�JEZ��M����c�dʧ��8�D��c�<ʷn0#@2w�;��"o?���nQp�M�?F���.|6��!��1e��L�!��@u��R���O�������F-7��F
��>"��jB	t�_�ߒy0��.+e��!#I�3d&�����z���~�ǽ�~��]�^������  �7�56�Mc�،6�������;t�e�Pc��0��c�W���
�Z�m�g7&`	�NU��/�v�l3��.(�ȰL�?��&g�B!�o�I	@V�o�$*�Vp/D^���9U�^R�@�8(�qM0ӱ)���'���>����X^���Y�(P��t��nh��^�,m�8�!8j�5����Ɋ���'"Nl��Kc(���XnH�8q�^�)"E0��z:�B����N|5�SoB?�)�Q$T��+Y�ė���*�����j��!�"���vB/&��yݍ�}o2"�-�1���QeM��+c��66D�ɏ�Tpt�?>1i�_z�Y{DG���N�W5�
Q9�+E�ދ�1��|�E�T�8�0�*�7�'�e�O�������`x�D���kKL"#(�������W����ɕ��Hǭ$� ����N���q"7h��
.$�&��Dx{�\p�%B���hw��{xrd��)��;3E���fg�Dut�D/Q��m|Q���L4f,"���� ˡ��
��9�8�{�v���&��f����1�c6�2��x?"�G沮���M�ħ�7N�xbY���=�B#��>�Ԣ#<=<�-��ek�P#���x��IeZ1�W*	j�����!��0�g9n�Ó2#��ё��KAb��g9֧�5I��Z�#��m!��[�5�7r�^ @DL#7�A�
X&�g�ܴ�(c��XO�o�[隙:��B�9�^���5re���e��w�%��du
G�>FI�
8~u|��b��tO_�����r�"j�L��>�'�3iBB�B�<W���X��Hn�U�
�T`C�-V��a8=�E�
��.�K	����r��h�0�g�rm-���v�0�F�YP��������i_��qt�����Wn���`ӯ
�u��0�;�j,�J�`�UiT��t�Ѻ��h+��C)�9�˕@�%��"��A���:
D�K}����D�D�΄�����,Y/2�D'��ie�&Bw)��$��z�^���h/L�L"IQ[�G��+�(��1`��o���=
+�և���h6����P[��>��J��u�i��V�c��m��mw2�"�Pq��U�����ntk=�vZv�e�r�9
q]�~Y,��̟��;t�@*#w<|X7�:�f���-b0��/���We
„�Zb���s�^���y{�|�k��
kL���hX��
�_j��(�q�2�I�ڠչ�m�#������_��6��a_]D�s�q���E6룁���&��\,el�K�#��+�����f0����5k���f	���oh���n�ۏ���q���G��A�f�-��f���|�k0�kC�ȥ0=
Nw+�'נHi]�'�lm;���b���W�p�ް�i8�vk�}�S���
�����Ӿ���gz�S�z~�^`�$�2���ΫwKr��Hd%�~u�:�'\������Ph��hE��w�c�a�ҋَ��l�‚҆������l���Ã��`���ib3��Ʊ��syc�Z�dbǟtH�$jk��<��R,�����޳�\XŊ,��f3�����/���+c� &�#@����0�E�H���?�6ԯ��<y�j�:�^���PVއ��k�j�t��5	_�"L��{�[�lJ3�@��z�Wdϙ�@0�;K�#%�J�~"F��e������p	 a�V��'�Qf�4:�������^�3WI��J��sJU�e
��zS�H�TKZ�'����M��r8�&-4�'=9�iH����Α�c���e"檡M��!�U���g�U�� �8VSށ�ȥHwC�3�:is�}���	��t]�ZX�lq˰Qo�M�z[\2| �f�MEȄ?��J�%��.�I�f)>1�SȄ�b7l�+�6v�n!��^j�h���D�.�'K珌�=#��G�8�V0�©_�7��)f'��O��3���j2Z/���J�����?W���3�Z��:H�L�ǡ��W�) {xr�z���T7^������%�U�s���3e���H�)ʷ��=%��Iv�j1�mw5�.�*}ܽC����4�[�g"��V���8�-��O⨢9���nt�q��n�G7���v��$�f�|t�M{9��~�'��_H>M��7����'��<���l"��-v�e�%C�ƌ�U������n7{�4f��޲�aw���v��`v'�b���n<�jx�!t��۾���ol ��ē�#=�ʧ��?:�=�76ꀬS���#pyCd��
�]�aJ�ח�o���ll�H��,@�S�*�^�-�D���\Y��h��о�{��H�GF}Y��>��iOdRwN^}g8KRe3�T��$U�t7b&�[�v*�jrWYSzo�ѭ���
����;�(�lzV�ҿ�vO�F��;�-cJ������|��\W@��% �����w&#V�9�,�~H�]���I���'�TZ�a������q�kt�ҋ�J�S�̂�K��Y�|up�L�֋��x�������O6���2��i)s>�I]u�I٠��<L�m㍢A� qѧ� 2��	�ç*g'�~�3~-��+�6�)����<����= �h5Y/��H��A2EG!8ce���}
��`^$"�e��9O�q
�3e倯Uc��ŭ/�򥲥[ٹ)�,Z����h	y��s�w�
��d��=r�֬�R6��+ۻ\���2�T]&M�����AT�j���*�"�5C�Z_괯�-��Tu1�YA�o)�r��~#@��� 6�������V��ɖ���w�}ޯs/z.
��y��?���k��h�l5��_ifIv�|lQ��f�U�e��:6�p��W��e.(6�)�F.�<gEA������n _6�4�O��u�~�.��_j�n�YP��Z�v��ș�KXw�o��شBq���cCn�+.���56i"ȝ��^�܇wN�������;��x"�8rZ��(���8g�`�0N�/�9���8%U}i�):�F����&��E�Ob���r�y������n�}e�պ��)ԝt�N����t5ޣ.\%x�zA�\�˽<��vr�_�"ڞ���.������
��f�V�8Eר8�'���g($wd�[���$�N�<�g�����_Z��"��{��rtKV�Ң��=:":�&��{#��-W�&!h�v�7E�zb�,H�M#�mwG�^#��#�Ѐ�Z���kի�E�L��(s�b��.,���x��ta�u��*�����L���`��d��"!܏�H7]��|�Ȗ]��!�k�=�ݶ[��n�7���M�;�݄���Bx�YV2�:�;	"��{�)	(I^J8㵨�uѿ�rrы���]F�%�_
���t^!	�c�ٿ�ƕ��
m�]��$�vSH[�G��н_�v7u���c����߿���W�-�{Ͻ��Ili$��%i4b��\eR��H9 �\0;���Y�y��8k�-H��߂�[b��VԪz��lk]��hὡ��!y�I�+�Ad�y16`rm�/v,[Af��|�B��Ep�BL��y��p *Δ/���&T
r��Z<�+02w��d�6ʞl��Qy��]��q��c��R�T��Ga�*��G�?)�VY�e�򫒈ʢYI�-��\�9h����N�=�0��9Ñ"�}�ױoa`���@s�G��RQM��.q���gl�t�c���D�UD	#�Hu� �B�aÂ����[�$	��x����c�{qq~q� +��p\������\ŵVKx�h�j�!B�1�:䢭�n:!�!�4un���� 1���Q����L�l��1��jf�p��(�4|�|t�WC�'I�o"H�mZi�*/U�!�T� �W��S�r�Z�A.�‹N�M
&����J"}t��..��)�/e���\�)A�I�곰�G��ăBb�p���C!�9�ל�y�gO�bw���R�w�L�m`x!"=6���&{��.k6w|ˎJa���pw��c�#��d�D�J���7�~��3�S���;���3
��мI���Jo?�U�F�F��v�ތ�Kdo�T�d��S�����8��1R�j���*�<s�R2���"D^w�-�.Α�U��@�_P�;Y:G!���tcYnt�t�ڲ���q#{.9Pn I�Uy��!�0s\%\l�xl�0�s4s��wO@���
�R,}tхP��hQCo�U
%np�V\�c�pqR�0B���*k�OU3�o����]c����-HU��A�ĺ�{	����[��.bY�;a<՟Ϭ�����$�W�9��$���_�S���7�t(��l��<�8rNz��7��OT��ō��'�ĵ$�B�\�Z��{P8!��2j:���%�Z�]�K���9�M�c�Kd_�
0*NE�B�+�9��
1�е��G�G%��l2��% @�	^ߢf��7|�_�i�*���.�N��FB����d/M��YB�J	��}Z��[����F� �d�LrydRy$2Y"G$~[5��z\驩���=MG�zo)9	Y��xSnZ#K��/�LѲ��i�|�zOٵIU�*�e�i>$�vH��;�B���^�aD���E�s�?=9��bs���}�{UȖw%���fsoD��{��0�EN��ɟ�yq>\$D�
 ɖ,h0�r�,Z�F��,�z˟xƺD���j��xn�8د�	?�~�.��*z��=3�C����q6�����`*:������F��u�ܤ�<��B⪼�q��H]̵�V|�io�즨�u��Z����@��&Kiz��T�=���/�'"���ѽ
�ت'��Ʋ�HL��r@��_���I�F���PLN�DCF�
&�8Z@Φԥ�,�Ӟ����Һ��l/����?30+/;��ʤ�]�2�g+�rn�|Ɠ*��*�o�A�wy		�M�@���lyk\sv��\�N��%ǽT�*����s��-�m�-Z��Q�N;gI�(9�u����śK��1�{+��`��l�5���
d/�,[N��j�G^�������)��c�6�6�۵�ڸ큕�����a^K�x)��Z�6��m?���%�|�ɺ(V�Ṡ�S�Jʪ�&��`*�}�Eb�һj_�H�~yX�{�E�4�+Lk��Z�ZOߑ]i��<���E�L�D�C�{��i6i�=sfMC	�W4�5�gb�Ɂ�o��%(��-�P\<gpl�bbP&e�i�g�1Ǧ�f��B2��L���\��ɀ������Tt(g�p,J*׃Zuq���v�m�$q@�����Bg Ȏf�U2��+m��V0�fo�`.�,O�����f9����&Y<���?Ex�R<��ՄB��2���*��Vɕ�Lx��5��L&܌����dq���?aB*M
M�3~������C\Q�=|����C>���r������O$�c`)7��RjJ�ϓ�F-� ���?i��ʗʓ�(XSKU�3\1z�'��LnǸ�T(b��逴Z#fə�^?�ؑG8���5�r��af��[��V�l6Y�|h9Z���ʭ��G�������8B7��)���k!�Vnkӯ��ӯ=�^�Ȭ��܊���ֲ����i�s��!k��	6��$��Q��|
��b�g�_b�G�qsO�+���P�a�1�C[\T-��$V���#r�z�3Ŋ�\]n��l��bWM��476ov "�.&z�	�iЍe>���Cq��0����q�?�)�� ��h�OW�Z�ݽ�[�~�P4�V���7��d�����O���+<��s��|)��E��T���ȁ+�*���*�_�Ģ8��nU�anlw�e2*��]z?��G`�~��X#��fX�8z=d;�[i8�.��*S���s�ܝ��/��R*ߌ�S�dUA��/�ܶA��2�T�Cc��D@	������JVja>k�j%�	׬؅�D�N������7��$B�]�7m���ɳ
�RE�,~-���Rˑňw�
��xd��E_�TX����F��\aқ�UO]����<�#%�����}�lG�R5p�I`���Ϡ��"e+j@�"6��O�DJ8	̍�7^v�L.���`5[�Z�P���n=
��ݙ�<��6w��3��^�&�_�ӠL\F��e6s��]�\d���!�-(A�9̰<T�6��̪r�t�R9����~��m
�$@@�WK�)aU3
��U"t� ���:&`%�G�H����&U��̴h踾�D�V	�7��P�+��B�=�9�F�ca�g�/�Z���p-������KL*�,���e��wT�5�%/�E��Y���z��U�a�Retw�&_�U��䥘櫉y��t��]trb��;����!
��W��]�´-�J��'RTW�J�_L����i�Z�k�_�j�J�,di_�p��_�L�<|!�r�4�Q�T�55M5��e$�b_F^�����A����=�����}�{׽|{~��]^|�F�5WX�R�S���q�vʾ��Ŝ�Ve^:�7�m�{�k�"�(2�NItz�{ee�uլ�oIu�6W�6�k��A����#5�Q"�\P� � ��앤�J�WZڠT����90�Ը4��ǥ�i��&�h�"R”��!쟿�wNO���Ī�����>���4��C<��G����;sG����a��Gxo;gǽ���銹����C%��Ѳ`W������]t{����2^H$�{�m�)��\�x��$+��ʕ����K�4���S`	Q��0D$r���G���>J�aw���;(����z��a�����T
��i�i�k��7�յ򏖁�P�Y_f�����5t����u����I�˨��=Xc�7j��`�7��'��/�R�
�����Z�V�[���	�M�O�?������P���OH���\�
`)Fc�ޮ�����<<v	�;|���w��$�~�KA=y6>y6��x6.���m\�D�z7�O�}O�}�Eדo�c����#���Z3��?�n�_�5��Z�i��\��@,W�e<QJoW+m��j��fu�#�������*��j��U�C[��#:��f�Ɗ���J���E�a�&��,�v��e$pk������[�b��0Z<W� �_m�ɱ���G��
�}�e�1tL8�����~���Y���E�?LN��,J^4�K���%V�W���k�z���K��g�|���V�w�`v�j�l�H��N�F��),�Txb8[ъ�>Ӫ�:�V�(�ĭ��"���8�Xi�+�m
����7[�զ�(�k4(l�g?��r�����r&S��D��p�Q�9Ƅ����@\��ۙu5�Q�Q�i��z�U���^�{��M���_ @�U
x��ӽJ���toнI���U0��^�8���ȿ1f��Ɲ�4�*`�Nƫ��-"���c�Eߚp���pK*���|�9ῢ��C@*��'~b�,�ݺsD,�a��f�`��n}t�*��9q�8o���]�0��'WXٛ��
w�z�|`�8��2��q\���ȯlp��˚y��n���<�tU�X`���  �4 М��c�a,M�#9h�-�)4��
 p:s�`��8Q5T!�Ơ��25��l����������i�]�2č�Ю!�
�TM>Bwycwn�����5.�3<~}�`w*���Lز�	�~3��
d���1{�,��o8_l@Fχ�>+���
xm�����|L���@�h<mX�C�C��RT㹜B���)]9s�C�Eü���J
���_MN��ڳ7,(aD�������e#��tO�cf!�3�������#��T�b@�PP��|���x ���P;���X�<�䂉g 
�� HH��������ư�3�Er�&��_����{oSa�8i�05XD���������ES�2�/�S^�h��I;�?u�w��mI��w��&2��ݠ�q�a�ph�O��)��H1��3�j"��lS�H�l����j&G�V��A��!�VqaXh�6�].ԛ�1'���M���=
od$:
ɋ|��q��W�U�9����ۏ�Ԩ����E�
��A�rR���$�� �PR~���J�vR�?@�9D���Ғ��,��׆�〿��
�_N��a���v}�lq0:�����n����p�L��P�5�m6ᇟ�9vYf��a�#M9�
��r���Y����c]��B��Yٝ@�Ӭ�z��.��m$̢���E�I�]\a}�=$xoѬAeA�����#�C|
����9���|C|��o�a�٠��Go;g��W'�'������Y��c��/X���\\�}8�\��.ޟ�����H�P����b{�\��>�.��?g���E/���!�.��4cK	C}ǽqT~���N����ٹ��-�p�̩�̿���_y/���z��("vl��E�����plj�_ؕm
�?!�?1x1�*�(c�HA��2��: ��ɫ�C�ܗ�ůA@��Z�INj��e�	���b��5{�v(b::�n��F���(B�V�˴�p���9U���
b:n�R-��HZ�H�� �:o)��-��j�督�>�E�Շ��cV�5�vH�����?ܮ 
X�p� �up���a��x��\����Pq����k�AC�bDc�fx�J�&�
�>$V������ۓ��v�����n�I II�
M��ϸ��w��k�0�q�e��7���x�b��8U�)hV ����G�����؟CJ��^q��p`r{�W��6@����97ˈu�$2��h�l��ឌ��C�	�ݎo��9gtO_G��c7�t��`oP�\ j�%V�a),*e��\[C���p|�i(J�0*���.TĖ�����=g�'C�2�`aۙHbY��m�c �;ug~���R3d\þ1n��8�h�e)B2@L[ L�>̈OVt��41�1�Rߘ���f���� ���wd�O���Vy��V&$]*+�C~I-K
��b1yQ���7��J���Je8���!�f�&|��@�;��E	��R��-&��U<}B���vz�A4MZ�zL���T��P�kR[��ҺImk����b��*��?�J{;�OZ�D��S���#`��>e��S�`LU�;�׷�;��j�	�Aijyq�<F��5��)��Р�	�(�>P�ML]�.=轮�"�$8+!&��h�:��
�������r�xU��=�޽����6��d�QR�Q��L1�h�U�-�w�_1�-�0זT~����K�6�`Uʭ�[[�w(�(���}��2<��+���U!�
��_���]����\��*xe>�)�w���f��A��ϒ��	���K?Уc>�D#�,��$FOL�4��t���g6(&1�#���eN�?8�A
+��*y�ހ+̳[\^A�S���e�v�k8%%�-�v�[�f7@�`���g�i��ƕ�L�N�n��$NBi{�	4m���,J�`^�k'��ߙ���Nx���>�-���HI3�ьW!<RP��[��{��i��ez��!�P(�y���L�*��<�C�!}t�}�=��n*;����-��+�i��6���vs�q�n\��SC����SP�p�^I� y��F������Gŀ�V4���}�,~�\ؓ�x<d�Cfԁ����5A{���^�L����@�=ٲ���|N��Ynz�5��N� D��$ ΦD4रyHA�!l)��A�6.tgt�3��9�O12�%��\tt�+0:q�}�X9��d�Uk�U��s��wgnDCÙk<;(N�X��t�nt��}��:TImҋ!�\Z��20@e��Q��K�/�O��FW.�w�`f�._P�=A�&_��N�@`XF񺧻@,�S�`�V��S����"[�yTaK%�X�,ghg�Ȼ��pi)��m�*��R�����j���yD��J�~��
���d#f5h5j{+���R���y���L�fl��)�rJK���F'~�@�mm
�i
k�pkQ��mw�e�n��_�FC�-�o3�x#�F6�[y+��Zx���d:���d�oD4�k�yӻϧw
�ʻ0�Rţ��B���y�\���}�!�F��Fh���a�s�@7g�].4�~�`��V͗P@sY~����(p<�m���=�r/�`�����ϸ;rX��������֯�����k���98<�|��Y��.z}�����f04-���o�&��e���LK�䜆m_ǻ��q�i6������4h�\{�֘��o�cQ�����/���_�7���2�R��˕R�A
��~���RW�'E�tRğX�nD�ԓz�zD�Y���:)b�"Q`M˭K�q�#��3G*��jpK��W�
̝��/E����v�ml��ٯ��p���bt�Z�%a(ѨU�^�36���<e��񺼲�9��qoP��J��8���$h@c��nIھq��ʪVP�W"n޻��s��ף{K�Q)fR��ݮV�]��Qe�FgW�Z^(Ԙ4w�;��P��T��j�N@�^Kd0�bִ��b�B�g���e@ߓZM5���Dde��6�W+�7������a�:��eYnF�.3~�������>輛q������\-@���-̯%�B�j|ƘԪ�Y�/�e�ɥ?�_bc����@�Q�}y�5�B�1�:E21T��ݱ	�]��K�������|	!���>��֨���ݰ�w���w�,-������lؒC@<���D2�l��
a�e��6��R�8'8TO��t�̯�p��N�"��r��6nF�\F�bQ(��wa����gζ�t����D���n��ry�3���l��<�W�ֹ\3Aw`�~�\\{^G��k��;#=��6�'VǾ�L)�0[��-�ك4����q��y���'j����{�+C�Yc��
���ƾ���㮐4�_�+�u�HE���C��ø�Sta/t�a�.,�N,y��G^/p��Ry�}j�{mۚ�/����U���#K��mjSmԸ6*�I�&K.�@��y-ʥ�w)�6%���ʁ�	��7>�Y�M�w�����g���i���Om8��Z̗��u��$6!kG�I\�� *�5�Es.��m.�{l]����*��&�T\���Є-X"��);֢M�j$��ƹ����	0Eh�U�����`m4>F�r��E����>��X��79g(��G}�U�{�'�Z/z���sYp�e@�ɽop�a�m��ݿ����m�o<A�2:K�Ca���g�N�� �c�“)Ȥ�ADĈ酅�]rlq�6�G�I��!'P���u��Va�����i����[�1��}h�jX�y�W��B6*�|(A99���N�=�u���>�����W8`����zw.t�ᳵIp�Kǃk?nx0
�=�O�Asi�?	f����=����+@��?(����+~9P��01�m�m֊S�Q�G�㯞Ce��x1�b��Y��ݹ磌0�֟��J�Z5�
��D�"~%+�����5�z����7�Z��Awr5�S�#.+��/?�vS�G����H/�؉vZ�?W+�v"h>4̫;����Q�Yȩu����w`������i�����!�;�\��l�Bi�kU�p#J���C�	N��s�Iy��?�{WO���ìfϽ�+s<K_^-�Frܟ�h�;z">̏,n
+� X���p9�1!��CC⍫�,L��R�=&��|-���؍N��`�9єog��9|������:_���I}lۺS?���Ժ��G�%�&v;�1Li�M_8�$�h5�f�V���;��w�U=zr��zdIJ��z26�=7+�+�sa��������A�l�ua6߷�����B��ni��ޙlȤ-a�����r��j�(��Q����TZ���f]��H̊�O���z���^R�~޵�*�_����/x�Tw+���3��Ps'�Y��t�3�P�����j6�yl��iĻ9��_<�)#����C\����+A���n��ٚץ
���RgT|��s�'����+��!!�N��C{N�h7D�67gGБ�����	5	k��@v}�t�hJ��Э��@���^M��ݞc�1h�X�&��l<�j)Hn˥<���"+]/ݼغ�tncH�җ��k}�]Yf2��ұ��=9Q��wҕmM�o�2z-�=�Q<{���EB��(�E��o����<�8-����IS�J/ժ�p�j
_�����#��!*?�a���³�x@S����ZĮ��ժ���@�ȳ�i<��>�z��	�,<����uߙ�e,����N����0�R����ZN���q�CMl�D׃�6��f>>#��¦q ��
��w��D�����!�]��I��q�9�bOD�=��0��fۖuCn��쨞#t����ǮԳau%���S�^�\��壐vc��|5�N��۷�n-X��/&�]Y��S�_17b��3���O'$P�ӻ��d�byA����!�JGؽd<3�̷`ED�����	*
P"��sFy�ZX0���1.�t�&��HD~�ב��^��vT����GB��22���[m.�B����Z	ظ�SB����%�b�TW�#J��/���=��+����J�Ƚ�dֳ�捏���k)�4�sFѺZ��̪�p�5�"�	�����n˷�Y���`J��(�5�F�Sz��ݾ{O<V�k�;(h���.1B5�\w��f�ժ�Kb��]k#|4ǃ�<���a��9y�j4�*B����X5��ʶ3��rG�.�>���<$�sO`4����6O��O���#ch��[��������un�[.��=͑�Q��o����+�M��U��7cbD�C�0gl���d-s�X{�1��q1Ч�^c�腴XQ>tɼ��G�;�J��9l7����Ѕ�;�(&�fwl��8���]Ryһ�z5�o_�O�_s�D��[�,)�N���
,��6��+��k�v��}�0)=`�]qD���/�VK��T[_-ǹ���kΝa���������V�@��|���ށy���wLO/=���K^N1���m�Q��4��	�J���j>��':��?.ՠ;~��ćOF"�j(؂�����V��	x�㥇g���4�@�	P�C
1c&l��sS:S�a4�w���<w�g��%�iϞt�$	��٤�>��8�ƚ���##��^MR�8#�I�V��R�O�k֠W �D���-��P��0�Z�X����]��k��!*��u�wl÷+G��)z�sJa톶|rb��H���m��E[6�5�O
�^�.�gԎ���Y����5���w7��d���e<I�����8/�>���z���I�3�B�4�w���8�p��_�'J@Fh�`9�7��S���u&\�s!?�H�q�	����sd�x�%����M��V]�m��<BF��],|w�\jz�-�0�G*c��o���R.�ϋv�{�/�ݽ��^[xa�NQS��0�>TL�f�S��N3\N~^I����a��w����y�+1;#��dOLc�
1G$.c���,�{[��k�<������_��jJ�/k�2�,/^��	ɇXC�#�(dzD�J9�
�Z��.x!`�<~�@�a*�D�j�˯#��2V'z�{�W�ܛ{�,Y#×/X+���<�*�/�)��S`Ł���!����:�g+��)Wյ���z�k�5�#/��iN����_)��	��k	���!�ޣLP�`��OA���L���/g���K��D5���q��y&5��-ɤ�i�v�i�1���8��|F���h[�I��0�&[f�N�ep:��Z�r�l���47)
a�m~x��4�3n?#.�1S�s-7��]uR�����m�³�WE@���B��<�a�`	>�f
T�6
���S3��&�@��ס�R�"�k�dB8�Ÿ\��
�n�sg�S���A1W�]�d�[������Ȉu��3晦"|(-Ê_�}S��X��v�X$�
��#�i$�������W�r*[M
N����~�O��ƒ���	gޣ�%�} ��_���
Ҁ��5;]�O�0�w�
��#x(~K��-��� ��LF�0������^,�eʹ"e����!�9�>h�4��Q��JM�]��P�(<�^K���rtV�m�	��9L�!���$�I㰙����{b�|yN>�yyB�Qt܄��-j+�{3e� a����bbNh	c 7z��.���9�Yo�	׿�`��1q�pT���Hfoh/�ͼ�U�9*{���;L�`�_�{4)MQ��f!PC�8>>Fa�H�׶��6��YMÜ�j�Q��R�9<%��x0r^����o�0(���T
�\)�\5����i+��40���f!P��F�X���M+d`��o��J�d�ǘ�o �mJS>�1���(�H�sԨU#+KQw�~!7d��O�+�1�.R>a�
!��{.�*��߰����,�`d�Q�n��e�4�Ј?L��w��8�,~ouڨ�c���qi7"x�PŚ��ɕ�u�$%e�x���w�p���֡�ؤ�M
~%v$�Ţw�t��\2|^��nTK
x�
�����?��o�s��ITw�
�&��i�A
]���SR.IQH��"_�tW��S�2�)��Po��2Oٞ���$,S�t�:T���"䆪ɩ�T�^�q���z��%����b9o�����kE��T_n�����/`��1��U��xf��B����
ԅ;s`i}2Qo�9qk(��.�V"�K)�)+��r�,�W<�‹u��h��q���\:cP/�t��
��S��l���PZܦ�#��F���%',��
��
)z���j΄V@�\i���:#��y�TV^8�Ui#_^+U�kx�LdU�ˑղ��j+��V"?0`p,�"��b�?��JILI�x�Qd�%��I��!j�骇��ilo�sM�7E;��b�s�qGDH���뎯��8";{;�(ʭ'�5��@Dp0��ȏ;d�)�ə��S�h�t;�_�G�IY�r1���J���//�m,����Daʳ�!to��:��wx��_���~c����T�����R��Y�-��S�0��S@�O�%˽Lz4�^��k�2�'�?���ll�/���\X���C��Y4�I��/ �a.^�� m^��@�G�����2�™N�xIیo:�7�)���Qj�	E�ĝi�.�*΋s5�(6V�8[.���`�6tY�pg<���'�'�~#rE��<��cӰ�������ԅ	�\n�:i����A���ލB"6Ʊ��T��2ԭUe�s�FsE�8��&�l��n������+�����N�����3D��|�$�/y/���n5:�r���yǫʭ4��Ysy��ut��U�w������s��E��T��%�+�Q�BU�j�z�re$5�ۀ�<PN�N�*g+
�}��X8-�ww2�Df/sd)�t���_`Q8���R��������D!ϻ���S|��s��ٳd��)�da��S�A�`�cw�<Ĺ�������!�!�#y�F#8۔޵f���-)����
oӺ�З���*����5z]���1��|��,��?�I�04ɼ�yH��K9�|2su�������m[Y{M~���H��"���&]��&>u�l��>}�,.J�l����b7�1�/�D�q��ژ	n�0�;Y�B�{��T4�I�|�7��	i�)�x=b�Ԁ�*��
��?��4t�i�
�Ѹ�҉ �ɼ�t�~a�Y�S�C$������)x�H�ƣ�%>��	-K��Y\�?.P���1�C��0���|#1����=<��itɲC1,�p��w�?l�[�*����n���Nq	X@!]�HK�58{Z���i^�Q�ۮ����v%voRͽ�����5Mȗ��7�+�0�L��cq��.�?'����Nw|�qg>���"P���D��)��'D��m��Ґq��p�A���n�3���+��YX�!��rD(�{�?��f��!��j���N�	n�x��|HRa	0_���i���v3Kol& �C�,h�e���l�߻��;{;D����5t6�3���}�u^S<��ݗo�R���D�?�� �ro�������
?h^�a[��N<�m���7�:�p%��`BÉ־���C+ݻ�?G��،���O�֯H*p%70�a� �ˮр��{N&������>�������1:Vr��qhg�yu~�{�YN�f��u�u�2��mV�ǫqL�3�w�W��������?`�<�	������Q���)`6a�:{�m���r�k'�S�����<6����Ӆ��*zא��4Z���������V���
R���
�N�hgi�l��k2��M��k�B��5���&�hW$�"�Z���k+�6vI썿yZCg��h��{�_;�1#�	'MC��!�?>�gчC;���1�#N�"1�ȓGY
�{�85��]��0��j�oHd�6N4(<��'����8�9>2��c��p�&��ΐ�6Gΰ*�';y�v k�5�b�bE@cg�%���՛�؇�~G}��K���� �6�r���;$�d�<<�w6��ٱ�{g��m_�kG����YW|��ƾ~���Š"5�!�	��Y�>d<r�$F�-�iqO�?��7Q �iߡ`Tr֌�2�=l�ԄG�P���MfN�L����f\��.��
sp�rӍ���@4�N	t��q��:8�q�|�9h�&e�
k����>/§��
�&���'>%o|�3*�v�����h:�qm�(��5�>�d�e$�]%�5jǛ�)�d��Q{�g���=߳��@�d�h6e-���E�S�>�ak���X�Q��T�Vd�Tł�UY���h��ӌoNN��ծ��F���?�J@P� �X
�V>�2E[\c����v������B��㰀����O�h�����c�)D�~��!Q=R�	*�'��Q����E��<���&�z��>W�0(���q�Y��,���[2@s�<~K�9{��cy}`40���oч]������{f��7���@����_�g7N�v�CG���C�o�ˆَ�/�N�e ?��P`���	�D華���H�0GĄ���$� �߉�V��o8T�N1 0O2���ﲙ�h ����d�� ���A@:�7�mLX`_���Vl�o�v�^�+�6T���P|��<��<��} 0�d�nIC����4N��i}[zy�b��&ke��O>�9��x���x�l�V
#OI��H�2�2�G�C�0���J2���E��|�tjL>ɦ2I&TnjT,IC9%'&��LVI���Լ1E`2K�}�\�?�؋���	��BJ��s�T��Bd.�^K�%ᏳS6�0a�R����"�L-���'1Π�Pva�������(�����v�~񪈍[ɸL�����
����@Q�m1q���F�I?�X.�?�"���$�H%)��'H&�ˋ�$�8�DL�\I������Q�TJISYE2�V��ݤ����S��V���-�5Tb�B�'����r��ޖ�/1ݢ�+9~6�HZ�fB�’�BRBi(�i�7��z�;3b"ֵ�&F�O(H�_�|����r�љ!����>2�Sq�U��.o�ˠp~L���/�j�p�[����}�#Է�yb�ո�!��^��l
�oW:M�!f
T�`(a}�A���>�Rm���`7���
B�BU?,�=_�����BfF]��L
Ѡ�/~d�>�<HN���x�{��\P�X��qeu��Yێ���B1��.����1;,�e U�����'#\2K~�ޥ�G�m��J��"�	b�W9��zjI+�^��K�����kY5�����]
�`��%�����Y���N����Ł-�hمF�Z�U�1)��2��Pm��sJ��������v�tyBa*���V�J�%/���y|�z�8�j;��k�����k�����i�Bnv��Jq�]��;����L%O▫=
�~*��i�>Vc*4� �=�#w���3F���a�`�����g�����1\��[��i?�:����^۞�q�B-���C8��5��xW, \I*=�W�S��;K�c��k|�S�B�����X���J�hB�opl��v[�X�������)0E{|_��dq�1K�p?�2Y�d?���'�=ן��Z� �k	��7�yv:c�Ë�Y���|�%o2�����d�R�"L�i(�y��q�5c�t:�A(k
�c��+ަ�ZA���y�D��ʓۋC�8};�nx�D��+_�K��I?��ᦀ��^�"0K���c�S���v��v)��w������V��?Xc���!12���j��ySٶ�z�Ϸ�`?I7��L�����~��A68^�ř��w��DP�!�������42��x���j�d�Xٽc��f�T��d�F9[�mb�1mx��d~�t�J�*�y��Z�EV�b�̛iNjl1<Oe��./�92NB�^����n!,a�!�ʉ8w��`"ꇊ�T�̱Sf�Z���b����K��t�l��C�ŒS�X�XCl��aO��9������7���y����f� n[,�Pݻn�G�۬�
Ps�ܛ���HfHY�øRh�BN�V�5x%�4W�yc�	"?�vyO�=�Cc��`��r)yV��lfǶw����*��yb�m����%V�=�eq`X��-��Ő�_r{UBҫ=�]Y��ƾ�/�3��ƾ-��$�i��h��eh�.�e,�g
\� ��0�%��:)�"�-�S�r�ZB���
ђ:W���et���M*�s��GBy�G�婵���nHQU
V�2��I�E e��Fܗl�����#?][�C���7?xi��C{dQ�Wg�$�f2����Aܬ`W�_��.��kZ]߭k�?��g�w�Vo��KpX��i�����>ѯ5�_���}O���պ��ܔ���&�~�,\�l�&����u6�G4��ީÁ�ۦ��n7����o��5���Z*�?�6�v.���R`�"�N����2�+��}���ћp��<��r4e�l�m*v�;�޷p���69}��/��uo����i�g����q����<ۛ��%ΤR�ˆ����V�|s101DX����	��~Vi�`Ӫ��'6����>��� ǘ�~�؂Y�ڭ�N}�x��pƇJ��kGv���).�OaFu���pr�Y��ձ�a��WhX�2F��[���9Q��j�
J�(��D�մ*���W�*yD��`
�˥���Zʴ���Wޡ�+B��Q��]���:�k����]�X>��Z�V+;�SP���
��K�~������hg�.w��w��S����I#I�h0#I�Vӻ���3Z{�F�H��6��(-�Ӭ5��:zsOk��a��Z���|a�����/{G%�Z�ڂyj/�l�!��|��!oȃ��������(�7o���&�M"Jd]�C�^:3;����sb᠆�T�
����9y{���0חRa�̨�*!'�=r���rU"�cRQ#��ݶ<P�h��99~wt�mN(H� ��r�v:Vt��>��w]J�b��D%d��D �c߫<C�Y�7Z6����	���:��$��G�o..֍�[�p���D�_D�`�f�%�q[�����`��K%��]��`�,uA�$����B�UgYV�Ȳ�2Ox�؃+s���n�<ϔ�/��'v��F����c�u�/}EKB�E��$RY�H2"&%+�I''�c{<�ܔ�0<��s�{�>|�x�k���b:�"��}�sL���������*m#3WI��U��WU�L�Ѭ�;���R2��x��67L4�4p(�ߧ>��at��Z[��KL�$��G���z��ո�4�ā<�<��+�J�(�yքk��X3�h���H!>|�p�rGM#�
�u
��%��'�z�|�"5��@t|��F�BOnׯܚZj��Nd
�}w���
7U�����0<���QK�E��ȟ���[�>"^�V���!��/��|���9��2��|	d���q�וD�K��8��Þ�w�{b�m��p�N�n�*����OD�$�.�E���k5�|Y>�I#�����ɣw�bwV�)�����S\-��}�nZ�m1�L,'Ȳ�����6"j����OblyZo+h/���%J�@�!�q5�{&��^��g��R��$լ5Z�F�h��fk�0R�ti�v.k|Sn�17뼥������- �5��|�4������"[
��fN������W,>�*K��s�Qi��w�N{oON��7�7�A$���쏑3�����|��Ag�*�R�N��V�/�o�D.)S���)i,�zxL�jqM����??xM���bf�)�D{��$	ZI+�9��,U��0�.�{��Z�4�=mw�Ѿ%��h���C���CQ?�==<��q��I���wQ&�q��Q��������H, 	7m�^�~*��U���=+���DRJT���y����HJɉ�JpQj�k	����X��w�J�.�L���d�.D�,���j�ڋ�t4��h��*v���ۮ�.���l��'�t��o�/����P=�de`�ٿ1?^Žۘ@%hQ(��<� �V��i��Q�1�W��Lgf��3	oF4Iv?��Gh�e��E�4[X<Aka���������俇/�_�_�Xaĵ��}�\�1(b�Ȕ=�h�.�3�{	CC�q�<{�o+ʯ�rR˱�|
s�\�:I�w����`_XŴٙ7��VL��W�B���)�/�>Z�&9�d�oN~���W�-�lu~�0�Í6��R0��`����$��T��v�Y1��屉PA�r&�_��|O�<櫲�\��#
�#���X4I��Ǵ�оNn��Y�0m�DJ�p�L��N?��trt���$r͞4bVx��PM˪ӊW��r\�'��m�l=ي�铼�R�$��?Sj�)��*j!��ޏ���M�H;���r}Ϩ�i~.�f����.V��i�D��碯I�5nޯ&��P�Hm�V���#&�2��}�X&[J�U�Ѫ9c�"Fe��bߝ��
����fV5�՚:٭�vG���7���NG�����ɽo�<�%���d氨D���ߨ�YvQlih�ݪ��Ϧr���o��$�����5P��%��w���ܦ@�N����-m��XE5�C=U
uAL��D�d��p"zRA@�ٺ�`�'1���]��
Z>�4a��W-�� +��ɴ�q��slM&x���7�o��J���rt�l�
���F�4�.8��PE�0�܁Spպ�M^	uL�6lB��}s�AS�_<dު�W�zY�R�R ��`�ZMD�FwO��R�M�ZI�����&F��>�l����9g��N`�'e��z���ľ�/$��^$�?؆��m�]��ٮ3v<�G
M�R��������H�/�B��!~��[��I/��¤��k���Y�)��e�ⰻ�l������\JEj?�e��SN~L�붱ź�j�[���踦�m���V�ڞGfRaij��p�f2Z#�Co����ޚ-��X�Iȃ	B{�z?e�����-p�Ug~���vL�"�_w]��m�Z��<h
����b����_���ۯ��+��K�6� �A�ؐ$�lh���F����Ɨ�]4�?����y��1��_��!n̔�@_6��M���)�}��n��D:Uʨe)��M�Y]���y
&����*4��f�^�Ξv������5��V�O�l�^�`z\K�G����ТE��;{�x���FJ55�QH�|裚���[�+"D��XGq�|,���w�:�j���b��lCs�s�G6~º�j>�$������:����ĺ&.���*0��� ,�%Q�N�����őe���G�E��>	�<�M@.�=^����*ӊp�Ppi����Y���4h꼎:h��)�/�A���"!Z%��O�s�Y\iP0��H��"$�]DH�7'�����ӓ�o�F?�k���S�T!Ѻ]��N�*��F֡��j�t�qH�6XS��)$�oy
��8j1�/`
~��v�6'+0�A.��^Q`HG��Y^}��:pdG�����/2���Xc��u��v��U��Bɋ��k�E��V�%g���K\��Yb����������֜Sd�q8�'q�iw<�]� �vfǣ�#0=~���S{j��4���\��6H��?!,mv=2v���Fj�U���ԋ79
1�l�����0��|�n��{V�:!?���6�h�X�	�Z7w ��1(#�A]I
�a��e߾?Tp�`���f�@虜�叽y��q(G������^\&�;�
|�E�K;3��3��9���p����}b�@Z�)�
�TN�v(�0b{��Eo�N���%��`�&O���HMl�BY�|�{ ?X�9/�-&P
q��'֑`i�����7��U�MzX�����[aPJ�O.�`�¾9�t���&�0�p�!��Y���aͦʄֶXSM��(&�&(����g�󬜻��	�in���vO9-��j�b`Ϊ�|-���S�4pL��P��d�J'�@b�7"?�8��K,ۻ`׽�w��0𞮜�3���+�L#�'9�}J�v���vR�08-�N8q]F ��|�.h�Ƴy�����d��Y��}-����-D[�tU$]�q�Fp�=��U#6�ƳGc++լB2QYHΑ�eps;si뼲�ەAc����Yڹ-�Ȍ�Khd�1C!��TLBzg��n#�%���H��2&��3���,Gx�v��~[�IO�/��$NL�gى��`o�9��`e.f���L��%���=�k�S�s� �g�Vb܋�Q�m���7R5"�r��i�$��t�������%���vUk%k�V�ؓ\8���t?\@$��%D�%���؎x��43�7,�tފ��ff5�
/σ�ݦⰾ�jqq��
2}(�|�2�L7����M�1�B㼔\.�z����O��>WI���尸H/G�g5�b�V}��M���W藽�黈�R�n�K�j��Ks����S��܃}:�����+���f6Z��VvW�X����غ�UF) ���>�@�����e
Q�3Da"]Gs��*YuyuVz�ͳ���¼���vnɱ��>����Yv��̟=�f*����)�_I�g���8��fS�T�d�-���M>�`��|��v԰�}/L���.�����6i~�G��t���b�Un����E`o���v�-��<�,��`]ˣc/�>]�,k�%���X���1�yZA���a��߅U�d,�6�@<�,�b���8�/���f[��y'���!�:7�/<����i%g�`^�t*�%WZ�g�83Z�K�6�,����<��,90['
0�� �S�3�� �_�H���(����e
��_������o���@& m(��ah���c�YNMH����v���E��@R�/������c?�����.P��k�Fo�h�SC�8 �u����Lf��`9��\Z�%l���F?{_*e3PiQ�Nfae���}�i&N�S蒧�LW�
���,Xg�ZM�B�hf��0|�)����>��H�W���mW��8��r�	�z��_�|q<�K:���*I�bq�d�5S��\�:��s�n۫��
�o[�(q2'���E?�gٚw�4!�em�<�2����
��Wa�b�b�Q!Q׵LK|���jE$����}��pu:]���s�s���'iN�5�M�\��w��-t��2h�/us��
�P�����]8T�D��[�`���I����pXw�h��z]3�a�a�����cv�̂��n�Nn2�,����f�9�z������L7�vt���9�(��QQtI���fq��	a,��%?"K>��󣳙fj�?.+��Mda[��I���:�?�u�ΨQ�7;���ڋ�2u�-Y[�;������GXl�"�f8�h¿7���'/����/�d����!Y�@H)�PY��1���{�g��E[:9_�z�T�JJL]9��a7<_�M��$��e6�2KI���VH__=z")N��0������ʢO�����zc�
�V�Ff���3���"�]CmI0��]��[s��J���.���m��mx��X���w��UA���Ml����Ц�oh<XNh�~(�z�����z,�Q���f���ޞ��lU%��{{�������Y����5��s�^��c�rV��dNJǕ[�*�X�﷉�x��c�7X}�Z��7)���:<2	�AtmN�M����'���tSp�>��>�����A�������O�����q
����p�S�������:ܼ>^�7�)�t&��kA���喲�LZ+XPn�I���+N%.�u�~�S���X�,N���,^�q�e����=��]�+�m�Z�V�U:�Zw߫uk�������kpJ���J���J���J����R��oR��T��5���� �o)�����
�+����
�?<����-����
��������
�+����
�+����R���$�o+��W�������W�_����W�_����&�G�5�����7
���)����
�+�����-��
�fC�5���� ���_�S�_����W�_����[��:����kp�A��+�����
�+����
�?<��u7��u����
���_�_�S�_����W�_����[�����
�e�sni���������:��
�+����
�+��������_�����Gε��I�r]���?���=4/�q��PP��������Q������:P��N̡s�a��hͪ�"�dwB�6���a�~e��t�6�N���%xEW������o�ӄ�&�=��l����mU�����_:A����0�O�g;ag�N��u�\��O>ӟ�٥��=^(�Z�{{���SJyL��:�����,�p�2��#���!����С�2
6�ǖ�A�=�X.ļ�(&���$Eq����p�f(�+��Y�F���
��]�(��}+��5�F!�z�i�lm�/O?�h_��;%��1d�ܐ���0�I�}>?yy��*xx�O]��{�pF l�'~@BD:�@��v}pI��$�Tɶ���l�lo�l�;0oEATmLA��+�؃T!�9�"k�,1g�,=��]^��&2��.6�c���Vp��
8= W0�o������O��O��O���ṥ��v�M�����
��?M3�s�?�����I���α�IP�
�^�@���EP�*��S�Y� ڐn���W΄�cI�d)�XS
s(�q��|��u�R#�i�V�������_�pJ���?J���?J���?J����r�w?��ikJ��W���*������2Z��u�����v�/��s��do�������gc�}n����l��l��l[u�X�f1�-T�B�-�K�������kp���y�O����S�O�?���{��`�����é�_������Z�U�j��ṥ��ؤ����kp�1������J���J���������u8��S�?��S�?��S�?��{xn)�knR��Q��5���ߠ�OS�
N��O��O��+��ס��5}�����)���)���ݯ�oӣ�r����k���fC���
���]�58��Q���Q���y��`�ߜ��P����G���G����a���{��M���
���C�58��Q���Q���y�n���$���[�+h�
�?u��:��
�)�����-�������kp�A���]�S�O�?���S��a����&�s���7����p
�)����
�=L�l���w7�gt���pK�^N����V�oN��P�?�u�C�U���߇��?��ؤ�_��]�+h�v�3��<�5ts躷
���le��Z����G�3���sk�4V_&U�
s*�������Ե�O�sP�sQpB�?���^��|kH��m�ʾ��[����ŽftJd�@3�Ȗ�E��l�R�]�f�3$��*���r����F>̺Dkv��!�'(W�J�~n=+�
���E���w��3IA�,o�́9
a��N��^�j(�ZC��KS����X�g�,E9�zuKנ[��kp��$ze{��D1ܬJB�����a�[,��)�
�����Sۍ�0b���M�M3!{��_�LڽY@�)�aS�Q�S�G�wX���ťO�3���:=~I���G'?�R],%>���h¥'-����A�F�u�+XI���l���-m�-9��7!:�T�X��Br��*�(�r��a���>'���P$i��ɛ�*Ğ������P�Q�SӾ�'�q�-vK�m��_���
���_��p
�+����o�+���p
�+����uK�{�t7��V�
���78�+�_�pj�W��[:��_��A�op�W�������5�?\�t�o��ߤ������}3�lkh���C���
�F�1w������?�����k���uv͝�.Ѵ��A�'����"B(�`����vqvյnN������A� Dx\��Ǖy�+���hX~\��N`|�t\��hHϏ��M��������c��M�&&�Zh���~RG��q[�Þ�
�������
�?\�d�on�����W�k��u���!���h�̈���O�]g0GW@���&�7͋��sW30��h���4u��Z\�R:���%�
r�r�m���;�Ѭכ�et���n?m�!/6�e�0Q��D�vU��B���6E�n&v��w=��
���݁i�l� �?���W�O_�fe�+��V�6M܏���R�4�]��kFx��s10/�V0��$
�
��-����ajm�l�j��)�qL�
ǦY��"{��Vi.Z9c>w�#�d��7g�ϽS�~Xc���DCS�4�Q�mPX�R6d�|��
VW�H��
�K�Y��~�f��޶�V�^��Z{��7�f���8�������<ş��1b��	Ec'��1GUy��B��p�.�f
F���M�p�â}��Ħ���M�!���'G�c0t���%K��g_�1C0_��Cy��,qN�}����l��.��j6?U��C@}�1V��X���zk/�p C>��f�]@Jad:���tY}�.��R���94
�s��ɐ�@n�h@�L7 �1�~!�)%ۍ��k�p`�P����M@x��E��ܱ�1����k���\\}�7��8ω��!�*Pɷ�[�6o�MOB�m�-�=��������?
���)���(���uK��f���W���l0ި�wV���Μ���R����H3�-��T�e
-�N���n�q��5��6�=��Vo�]�'��������nU�� ���H�^n����L��I
S��t������=H������ɱy����S�N��z�m3:J��P���� �O��ei��������;x�!c4ڡH�����'���0�T0��i
�io����+s��!%X�K%���d.86_��~0=��O���}�h���V�{r�?��L��9t��io����a������2���׊l��A=�oИv����4{��F�N�^7�N�Z���֝OA��������{|��'�&¤�x�u���`��2�\
[DаN�G7��BoO{G�^�̳�ӒWe�4���#�WJ"��O��Q��_�(��LG���S�ڼ|R����"_qyup@�E`H_����d��_�<Ȼ����@u�X.�`nI�X�mV��L
�3��U7�뀘.jK��pK��wGGUrx��y��۞y~�J��KFxKPY��}:/Gt�'�1���\p��Od�i�˄VvK�����u���ߠ�����)�O�J�{�n����_C�kp��`�w��w(���fs~�W���:���V-��+�m�M�y�.�x��ٻڦƑ$}_�_��؆��]6�4��f�蹘��S�r�h�%�dC3�߯�$[%[�/Y4�'v�Hʴ�2��(+rd��8'��ގ�*�X=�����R^%��1��ٝ8����p��Fj�h0���r?^6����>�29�����C�Z���A��֐�h:��y�]__�Ϗ����u��l勵�k��>+���Ο)J�[��َ�H�G���a�DS����{FK�۶��o��e���^vh�8���0
��f?��U6��A�5�@��T��/�����lO
8Q]P��dM�Gat�%�Ea*����[�!q��ݬ���?��!�H�uG0&�&���y�p/�B���1��&o���G1���v���tU3��Э����e�2MS՘�?�T�Pm�S���[�+�~6&�e��]�\�A�.l�ؼ�:>�h��ͯWM����s��=�|t����i��/>�f—͏�����uJ]���������k��ɧl��_?~l^BD2��,$�p��I�,vu�^}�$o���S~���u�k��uu���������`U;�����N=g%և���]ޡ����5ǰe����Q�;���takf��d(����
�C�״*۰���O�y�v�h�z������%���W�����_���s�uz�
	k�wty��xz��?r��b�ƅ�W�Jz�����0�#q�Ɲ��u�����\�y�������;u��_�N�9>:uA�����W�zL�ˮx���|�fV�����B����|����.�Ͱc��uk2��d�ٿm�y�G�ui�x|����}������.�e�5������í��/4�U�?ӝ�Xu@�7�� mt�=�"{鐭g_{�?�<r��� ����e�=9��z�~>?�����B1q�p0�7QtK��~K�ao"q���*<�~�2u��kL2�,�kz|tM}��ɧ��ӫ���]Hw=��r#�*ڿ�n�5��_�Ve���;�Y�6��?�pS�?�45�E'�h@�]��w�z5����vx�y�1�,�]$#k�?�-��5�өk���owj� v�xe��?���ٛ�4,�xH��
ޤ_�a�3ko�,���*}CJ�5&P������c�^R�Cz��&Կ��Qo�R����z��d��?4?^����k����1vs�'wȧW����-�^1�"_�n	���0��&�����ߖ����=aԻ���Վ��a֣�$���o��0U�1(��>�Z�t�g���F���K<5�p'~8�D�E�������j�H�ǀ�^]��ݫ
iҕFl;<��|�eg^�!�;L�`b��J7:���s4�"�(Nkv��[�PxA<�+~i�R�]|!��:<�9윯6���=%�`���I?��F�ف�D+0�e��������10��'m���_�U�%��8�d�Q�ɿGALjo�c����d?�Է���(m�wn��a�3��O=�v�J�9̷���J��R�ؿeh��i����S�NK����}����V�gi�th�?�'4|����
���_�k����^��������؅Sj��_ᬿ�?^]4�O�N���3mf����_ON�O�ؙ���$h����0�`н���ݫI�k�J�O�M�k}Ϗ�w��v��KjaT#��Uk=И�Z0d����(|3�h�~�=������N)���^��p�.���mY#��<���|;��₾������z!�Z�1�\FP�9�½��s�@ܠ��#�r�\X�W��x	 �3���4H��G5�l���ؚ6��f��L,�n�/#�Oc����0
ӓ�Ldm}�N/�f�V^Hv���E�D��}������o{�o�5h���Qi�^��e���u����;f�c�O�o�g�-�EYi�*m.�X���ut�d昛����L߻��w&�j��ez��s
A�?W�-
>+�����;�.k��3�ʪ�c��w���:��l||z�bw�evӯ��2mٍ�X���9�/f��(�	�?ЫO�;~�������Y�N�L{w��ҽ;������o�B�1�r�~4�a�{�N׸�縍l�ǻ�`����xz�L��6���m�s�{��ZhwvvrJ���^:��whJ�8��K�1��ӓ*�n����;�����5ѡ�w���T��K|��jX�o:|��a�2�C����-y����g�΁j�t�P��F��ꪳ�x�}h��z���f������,�dx���iR7�q���‡���c���6wF]1M�vJ���?ʯ
N]�U��e\[2^�{v�6����*��n@�J�cg�*�Hڙ�7�LO)pS�7�>y�Ο0u{
u��Y�(�#�z��_/�ɇp�Zn�r����[���=��l�G���Q�e�C��^�F�a-]�Fc�j-R;�߱��S��f�x������g�o�O\�k:�)�"`�'�D��o��S���P���й��|����]���`�L�����|6Tp����y̅�_\�W�G�_����'g��}�
!:M��A�C�3ac��^\�_^��:���<��Hz-<Nc$
s� ���?��R���� N�m�n��B����֥�G@��R�u�Xb�-[��b`�k��~c
�`��uG�㏀���co�[��KP��i�m��Ea ���E��ǭok��y��|�c`��CP}-�`��wt���@����/�k*��_�e��m�Fa�Gb��Q�'��m�N7�!�y��������M��>=)�� 7�z2��^1�	��7����_ۯ��������Gy�s���/��BAV��@7���z���I��h4T�h�%J'��3 q%J�M{'��[؝�3U%$c������5U�����j�����۰���ͣ��>����U���?���ê+�1w�����1�����.���/Z]�5c�����g��ߔ���`���`-;@-�'$��(�5��~�g�1e���i�oA����<����+i��Ȉ�F��[��0P:���(�+���7��a.�o�L�=�<�\�>Pb�k)X����?��W-��?�����x�����Pb�k)X���#�t�1�����_���g�Qj���Ί�%��C�'�?�����|�$I�.���:�u�tL�p3��:���`x3j��Q8$�pߏ�ɭ=�<y�}/�x�a��r�jJ�
��(]���6�JҶB;��dS�$&J'��(��'�P��{7�zq�l*��-�7J�O/�'�R�
єΨ�S�����0�|�����Ȑ�$�(�	�wL� ��i�(�ÁMu�����:�۱\6��\�E�.�=h��~���F
t.F����g��T�/�
�B��N��
���T2��J7��70	O��#���x�v�{�ѧ	�V�>�Ҟ��CaeS��ڋ�K �
�ݍ��|B���"�a���tr�Z%u���o������(��4�ƪE`���\���j�����d�7��۹邞�h��?��(���>��J��>�89`�`��@<zX����@��@���@
��������h��H����� <,�I�P!��V�(��j��O���4����(X�_�M�����~q�
��o�_������FL�8᎐�S���~q���W^��_�pMD��i�c�_�dCX�ũb��_�
����ɖ���J���"���?����_@�g�_0���s :��k����#�y�"�b���_^���/�j��. �˩���克��Z��y��*�
�!���$�mD���.$���?0Pm������
<X���x�
�c�~r�qk?9�j?9��~rZ`�~r���~rj`�~����T�������@���$����T����Tx���N��S*��*�?_l�_m�WkV����eq�?i���e<�6`/�����m���c`��]n��8
0�N8��	��8��N!��&��	�pj`�?y��NL��.���@�8��N|��S��?�N%��uf#����B��
S�d7��VݒPI��*�
R6�U��5!����6�"�G����v�������c`эv ���k��䅣�?y��O^��'���'�*��.��ɫ��䄋��*��?y�b���x�O^�@�'���'��s��:��?y
0����g�B�]�?�6������nT�!�?h���6�"��\�����_�_U�?6��
�������'��{�p:��E��	���%/\�/r�N��_��/�d�����_8��/�~y&X��OW�~��4M��J�5ꇡ��1���;�-�?D&I��u'��o�d|�	��?0
!������@�������-��0b@7UsG>
�
%���֏����������_��AA�[��!`Hw�(�����G��?(�6���9����\������.�����Z]L�O�c��o��F�#�d,�L���������Z����(�.P��S�8G�>�C�Cj��I{��s�1���樁��,����2 1�=
Yu&ƊW�i���!&���c��o8�׸��i�/��ƀ�������?���k����9�����ye�����?���A���i�.m��(���&d�gU��j�/"�7��2��nT����j!�/��=��O�/0����j���g�*�]�o9���Pm���%����v�����e������P��/2���sj�_"E��_��?�2�&���t�}�t�%�S(������.������н•d�ڿ��2�c�2��Z��?F��_�oZ�l�߄
h:Ho4�h�ّ�ᅣ�;���J2���uG��o7J�_X��������!�P �n7���yC�ދ� �>�.���t͑���򗍷���o��n�6��sg�(_8�E5����ͯ�4e����L0~�}�����o�n͑�+��8RZqtK�t�?<��l��`SP�K�2z�K�6��B垴�uu�t
��[B�*��Z�Z�I��EGG�S:�>�%�C����1�leG<�ن_ʝ�5��j��a��ɘ�R�����+R�T��&6��#X�xqB/��<��X<���{DFx���E���9�,%����MQa��t:�l��;��O![�7=Aw����т
S�2�!o��L�#$tttOx=
S�$�>@�Gq��;���E�iA��O�I�T�Og썸�D�4�h�%�������X�/�?H�w�Q��_K�?
����>_T���򿺡s�?�HXwJ�M0�>���&TwA[�'�a:4ӡ��U����@��-l�d�1P�jXȔl�
��M�>O�n�-��� 0v�l�AZ��k-�i��5�~�m�e6�M���Xx��i_W��;����zK3���hG�j�h�����a��4��7����G��l7�ٿ�G�?6��p�E�?������ۿn�1���-7]X��g��r��%�mݱ�^G7[u��h9�Ngs�.�Na�`q�ʈ( ,P���@A���. ,P��xwQ�VF�z'���tjlH���{������m!�����@����X�?$��ݨf��i�(X?����<_T�����-������f�����TN���P��߅j��Y��%���5�E��Jμ����r�o莐�?r�T�r���Q�E�H����~�������o4�7Tݐ�a�)M~���*���އ,p�����>���}xlA���#�y�U�c�`*��i��Kf͟6߂�@����@��P�I���ٺ�ϒ�����������c !]6�����7v���I��E������l�����/�ٿ�O�����皹��q���?N�H��SF�ǩ��q*�8M���J��'���KF�8�b��|�Q�#I�?G����U�饎������_�z������/��{��f�"�?���O5����I��8�"�?N1��>�ǩ ���4�q*!��l4�//������x�I*�u!���_(�6����K�m7�ٿ�R��7_$��|Q�E�����S�:����I��8�"�?N1��>�ǩ ���4�q*!��l4�//������x�I*�
!�e�
�����{��/���F5���/�7��q�E�������mY<�����T�!l�/'�����8e�������0���D<�ǩ��q����d4����q���s[��q�i���D�Jg��
��CV�$ݑ���x
Y
��
���޿v��,����}_�̝k_���c<� �IP@��nv�[jI�[���^���>G��.�D�S�b��k~������,��^�?c~���#"��U�H���*woU�����Ȉ�ȈI��qk���c�d�;ͯ���k���l������#���;Ͷ��a�W��<���R��n�q��{v��F����p�W��#���0� 2X�?�4�G.1�W��<R��?�4�_�_q�'��p�=]�;�����_��%��ŁY�_���� ,�/���� �w�o;��X�y�����/�|����s=��7���8@w��o����'��6����Ou����;Ͷ�������|)��n�m���6���׹N��3���o��?��w�]��
���/V��f[�����H�WnX�%G��������������1����A�|������s��-��5���?�|���X��c�/[��N�\N��B��G�m�oY���	3����#����Η_������.�Ɨ��U��dL�K���ĩT�|�i��_�?����|)�w7Ͷ�oU�����?9��7_.+�_�����������_���1����A�|�_����s��-��5���/�|���X��b�/[�hF�_��B�4����V~��sN�C��N5pǓ`Xuϰ�ܠ����ہGة�̌�����J6����������<�l���na��G*�w�m���?��x�o|��߻�f[�K���i��=]���[�I�ox���80K���]�aY��8$K��A�O�o;/�o����s�ƛ�S�o=W�o��%��-K��$G�o��e��P�_A����'��6����:�����N�����S]������K����i��_�~��nyj��,���rn�_���m`�����X���ay�_�;���A�S�k�����j9?���p�_��|��v�9��旮��Z��׆$W���r�6���D���2�[;��7�4�/���G*�w�m�/�����G��ol��߻�f[����f/���8��#-^���K���X���on�W���V�n8�=I:�vN��X�;KT>ǀ�]��9�^�����R>� �r���H_�|��&p.��Xˍ��ϱ���*�c�o�|������9��1����|�A����9���P>Ǡ�*g��,�c)���B��C�m����-�?y�B��y���2�;��!݆�מ/������2��o�D�F}Y�_��\��v��톗����Y���c	�_���mH��)O���v��_����v�9�����ڭ���_���hy�_�\��v����P�9�o�vO��j�x��5vl��Vq�/�����o����?Ô��Î���y�k�1��GUta��G*�睦��fm�vӫ?�p=�{���*���2ǿ�߿��WK����#��N����ި��;����,�<�l6�m�\�73�����a���g���Hʪ�6�Z6`E�%e�����Fm\��o�rI��y���:����'�4��o���S�y���Η�������6��{���S��%-Τ%e���}+��ƅ`�|v��M/�	p*0�\��,R^)����6̑�m��?�_���:��;<+��2���& א��v����C�e�oz�E�����n����х3�G[���vI��8�c�B;��m6w�;[�yѧ�����%����+�i��]�/q���jl�y����){�7��ww����G�m��A��?y����i����_ۅ��<����Kq�w�l���=���F��j�mm�?�$<1�3M3��g��ݸ��=��٤��흝�J;ۻ���8�]
܁涻���v�$�SL����b��Nqq�62�3n���U��#q��6Y��G�?v;c?(�璲���R��B��C�m����-�?�
���f[����_i��|)�w7Ͷ�o��Ws;��,��}�(6]��x^���^��`��@���6>��M�w��qw��G�m�o9��~3A�/�䑄�_��i�m�/C�/��/���K!���4�_��_��<��%={��*���M��7�D�?̒�8@��'�������<�l�_��T����|)����f[�����GZ<���2��X����ǀY6����Dʦ��_�,���+���f�%�/��x�?>_
�������ߛ���\��9={����ύ��7�D�?L�HIi���R��݂��!�6����oy����R�w7Ͷ�������<�-��_.���ϑ���^*�oS�EJJ��o������2�
�oy����R�w7Ͷ����/�<��YO{����ύ��7�D�?L��))�B���e�������q��G�
�����I���e�E��<�-�������s��������,�9�?��i��/�?��
���������a������Y�%��ϑ��C�?q`
��HI)��n�Ĺ��W����������+�?�Ha�o���i�U���v<؄��BR�����B��G*�睦�������a^�_���2�f��)e�����N!�璤����#w��v�[|)s��L�O)k�7�b�?[���\�B���R���x�\��h�C��62��������S��#��vs�X��W�^��6,��m���*���i�ób��)s����R�߆�>��ww���GZ�ѳ=]���L�j����|vo��?�r3��x��Uo0
�3�z������Y��A�ݥ��ò��a�v�'��`\�����}����r��������j���=���w�/��s��K����s��L�a�/ri��x�#��W�~��8(m�Fc���a�۪�N�� ��&���V;�ʥ�f45Q���*�1�g��n��Ixs��5��R��q���?��-��H��.�>Ŕ���v�W���#-�����;K��i���/�T�?�o_���k�&���<�b�L�	�o����nD��ñ�`�qXf��y���-�
�~�Zx���C�<��6_婅oĎ�����7�����q�8�y��{��7��=�7We�l�o��h��H��࿯�����;��.�)s��8�k��w
��\Rq��y������#-����K����s��l'���?y��*��K������]��߆c�����6wE�oÕ���n~I��\��͹���&Ϸ�2�����v
�O)s����)���
���2���?��Wi��{���;�2���Z�XRZ����$���nN���e�l8����a��W�a7��5�
�~�j��/5G�RR���<��n���!e����?��<R����S�_����GZ��Ǟ/��玧��4�Oa��GZ�乳$���nN���e�l8����a�Y�c7�$��
F����B�S������.O��W�rH��4�Oq�#�T�>�����)������K����)s�/M�S��+y�.I�c�����nvY��e�lXr���/I�c�����n��)-e�{�����R�/M�S��#���;e������y���R��x�\�9��	����7��X�soI��ݜ�?v����p,S�cÒ���n~I��\�?v����m���댪��`T
'#t�T�w$e�K�4�
�O)s����)��
���2���?��<҂�?�|)�?w<e����
��<�b%��%��vs���.K�cñL��
K���%�l0r�؍���/�?w7e�_.O��(�?9���_��g����G*�?�w�\�K��?�H���������)��H����\���n7'�����?6��ذ���_���#W���x���B�swS�����?�B��C������wi��=_
����Z�wg���9���ƭ{�Ip��o����G�e�oz������#�*�y����N�������n����*���'͗B��i���#����ln���v�X�y��j~��%�#����9JjyIAI�,�,(	�|��� XΉP$y
%���P��В���Y�Z����'��9�y����_a��W�y��p��<�>�������AX*tC�~�\�K��Y������ϗB�s�S�}��F31�C���)���%/�O��\4?�f����ñC���;[�ΗGG�4�[n�uN��G޸�nj��UA�=?������t�bXrʠ�����_��2�i�q��G*��;e�������<҂�{��O���ݽ�������<�b%�ƒ��ݜ�����e�JY��ג��
�/��=�73�흘���,�瑦�ˆ�H������L�o?&�m�m�_�Hf��uk8/�G@�y�2�sy���g)s����/�<R����S�_�����H������s��k�o'��y�ŊC�%�v�9Iv�˲�����orL�V��f.�s3@	A5P{5p��{t�r�S�H�2����B��!e�����S���?��&��y���|)�;�2�����y�Ŋ��K���vs���fo���2���俽B��!e���係��
���N��i�?
�y���|)�;�2����7��X�hgI��nN���'��.O��/�R�/M�+����>��&���H���R�w<e������i����?�ݜ�?��OO��[^��B��!e��_����/�T����S�_��W��#-X���K!����&���y��
D{K���vs���f?=�oy�_���rH��4��8��#���2����oi��=_
���,�o����#-V �_��g����g7���_.O�+��2�i�_a��G*��;e�����i��=_
���4�����#-V �rI��nN���'�}�<�����G������G���>�����y��2D_-����͉�����Ep��v�w��oy���?q��'�u�����i����7����U��H����;Ͳ�oz����ۏ���m�i��?I�8��i��S@�ߋ���v����#-T �O��TIM�Hj�������k[��X���2ǿsq|�
o�F��״�����fq�+���?@���Y��
�n�����H9�����~������y$�v���>�t�K�gx��h��;��J�3�v�=	�x�ū6p8@3�ηi1)s�/-�c������ϗB�s�S�_���B��GZ�*Ğ.���Sot�ʟx��h~��~�>*e�����?��G)s����)��
���2�.����O2�?���sK��i��b��#-X�cϗB�s�S�_����GZ�B��$���nN���OO���@����?�H��4��8��#���2����'��`�Ϟ/��w�S��^��W�9���_�W��H��y���4����<҂�?{���O��i��B��GZ�B|{I��ݜ�v����gy��~!��2�?��{q�o��G2�?�=j�O��{�v��n!~�)s�/M�+�i��=_
���4����+�,I����I����������*�R�/��+�������x�\�9��{ۅ�Ii���?�ݜ�?����ۅc���>T��*�4�^Nyό���<��Q�9���_Z���#��XB��$�o����������fA�sH��_������%��ݜ���G��,�?����/���b	�K��v�9���O��/3�k�!��1�K��Z��#�2�ˉ�X��#-������{K�����,�?y��2���s��1��ߏ 0u��,3�c�?��9���o�>���v
��g�\���o�>��P�/>_
��_����]���B�t�K������o��#��������8��#e���y<�w���
���N�����'��,��~g)s�/M�+�y��
Dˉ�o7'��S�����O��W)s���<}��`�����;K��i�?
�i�QsI���nN����r���X����e�*��2ǿ���':��%Dˉ�o7'�����Yb���g.)s��F���<�b	�r�?��͉��w���G���O��/� .�k�ݜ���.{�U�X�K�Z���#e���Ot�K��5�nN�S���S�jy��#e����a��GZ,A�jI��n7'�o7���e��+��H�D��i��_���b��#-���{K����+���/�_b�H�����e��+�?y������N�����瑀`�']����s<�ñ�)��#�d�v���tU��K��?��?�{�����"Y!{� �Qtޯ�q��n���to��Ðov;����+@���^�
N
�3��a����������2�?��a��+�?�H��y�����~����#-����ɟ�[�/�x���߲G����������\R�/���?�H�%�������7�i�%�.��2�i��#-����O��r<��A��x�����G����݂��K��K�o�Ӡ�K���]�R�/���y�������R�Ǜ�4����;��9�K�����<�b����69���O��Y���]���,�_���%-�~y�
CN��n������Q��#e�����_y�Y�����?5���/���M0���,��|$�|����o�����_y���/���"ɟ=]�A��0�B����m��R�_��B��#e�����%��X"���qr�����Z���'�'��3ǿ����':��%�������7�i�%�.��2�?�o�����7��X"����qr��s����w���;�q�
��8������y�����[�����
��<��v4bx��A0���;›�S�}���(�KK��B��!CN���n���j�KӻU���� s��n�hr\����bp��;����S�_����w)s����)���,�G�������n��,�Gq�;��9�K����gi�Th��?�0�D��q��/��/�_q�+��1�K��W���f�۾������Y���#-t����ȇ���[�`/0u��/�_q�#��9���>��_$��2��\(��O��w���������_��o�=��X"���qr��s�������_�B��G���O��/�
-��_�����n����e���?��1�K<�)��f���_i����8�I#.`��?�\�g�����b��#e���6�z1�o����GZ�O$��Nu��m�(�)c�/�q�'��1�˓�v
��<�,�����~��W��#-t#N���`�E���LS�Bh?����璲���?�3�:�o#�����;;��#�hs��������R�_��'�w/�m5��y��qaw@�����.擞���El��2��-{�o��n�y��3�������T�
?b�/�5���va��GJ'��6l�����\��,�������/��Bt\V^�1opR;�7�S.�X�������A�fF	�m��s?8����2��u�w���:���l菙?>A�I䪔R�f�/+o�|e��#�z���U��0wx�߽}��Z{��%���:p3����s��R	�!�Q=����Go���Q�귷K����ɰ�w�v��>��P�����ߊ�oo��rI���ɨ4&.{���O��:X�(~������m��7u9}�Nip�V��n��'S�Ӆ'��V���x�i��g/hBC�888��:yũ(fe��-���?z���kz�U�q��ٻw����$lm%�؛�[(����E�X?�8t�ƾe�:Ȇ=�x>S�k�X9jfx�AFe�%�R
�'G�����?=UM�
0�Jڬ�n�}z�b�FZ|`�7�|�n�
��~� ����]g+2�j��t���N��#?�������o���sIY����)��_�j5Yħȗ�Z��6W��z�~��\���5���N�g{Z=MQ�d(�Ri~�J�!l8
���~f�Vo���#�����tۨ���A��kS�,��ٌ���B��#�0䎜����CU���	Ǝ/�����=�~�V�Z��uF;�*>�K�l-�������_�m�aw��-1��K��}��-�.�Y۩m13i{fRQ^��3\������3v9;�Q\o�1_�N�sB�u�.�%���UT�)�
t��\�.��Y�������q$�1�^�GE�.�0j�!V�L3�K�sXN�χD@�XKS�9R:��	�x�O�n�f��������G.)c��[񂾶�ˌ��{�3n��߂� ��N��Į��� ��6�� gժ��e�L���0���?x!��1�y�9�;��������m�y�U�.�r]��.�V寇�}���D
�_o(�mljgb�����lk����g.ȷ	���]�u���
�H_�F�s�vN��m>�LL�[Cfm13#��<�z�-҈�i���q�q�>-f~sFl�K�������Bٕ�"��Խ{.ƱӍkKb`�O�j�3;��|KjD^s�/MB�/=lR.��,��[r@;}�9��jn毼��L���Q�]��֠�RU�|���=�I؆�^�qwG�S�K�R��h�wð�GBɿ%D'A����<�fF�@Ι������`�<����ۅ��<R����7v0V(e:��*�HGQ��	�μRU��U����HW_굌�Hw�5�-��%��#�y�W�|�=?�����v����D�b��Tl��e�3�k��7;H�5�hzx�P�2
R���2"�՞��Ic5��&D���h���i�Y岆� �6�j�x_�w�����G���!p���������;!�����QU�ilH����\9��2�:��@t"F��	<�SC.Q9gnߣ��7�uw�su�¶DGzǻJY�����˰)��=��=s8<:Jڅ
r����x'���T�&��Hͩ߷P�pǝ������pc��>@oa������t���_@?:����
�������
a��*L�P�
�����v�=�[$�0��z~�>��P��8&-*k����ǰ;K�{B�t�8O17�&9Mf��%c���+B��#�
x����e怐x��u�Ɇ��H宨�YUT����VZ9>7[Y�'�y���ن�����6����ڏq��!�ah�G�&Z���V�\)�
e��8��o��1
�À�� !6�tN7�d�BR p;܊4|�m2t��������T��e`�W�7pzE�Oh�ľ�׾�z->�:�ҫGϞ�n?}�kV��v"ű�Gw2GT�랹}�Tj�k�_��ηl~�fT��T�[�5��*^�m8�A�.z��R
a��J�ƔY�
��t�ژ6����0���[����)蝆��-	q?�ZFp�1��YwB,^�/�߰�!N-'QK,b�UyX�PqX�����<��Y�s�T�Y2p/�W�UCXCBl�珶Z�T^baMG�ofA��L5�M�ߨ��@-����`�uh����6���^xۥg/�K�c�g�`�W�aJ�!�8���裺�}��66z�ff�m�#�z���r��\���s�͖3����,_Z�E�Y�C�J%�H��f	x�В�c��xw�������i��.�th'�P�����0\�8���(ŵg����J���~<m<�6�}ki������[���$�_a��G��'�o��p��ڊ���)� A�]b�0be�-�p�����i�zΩ+��6�n�����;�8�U+ծN�l��JW���;�쌑E
�L��!l��`�m~�)�;����:>6�����]�VG
��2+Y�*k4I= 3�)�U���,p_p��K��Z�_q�ͱ����SE[���;1�MxU��2迶 �%�\�Pzm@_`[��g�-c��h�*m��P��56�=�չ�ó���1�;���m�ґ�
�����ܲ�j�CO\)jw&A�����S첔��E/Z
y��e�e��0�d�ϷR��*�_)��,f�V�e[��b(�$q��c�a⥋��<n}���ΎNXx댎R?���ϯwZ��v���G���~��W��^�|��//�x��S���W�+�y�?{����+����J���2��wVݐ&�3���,��Y�8�j�c��ЛO�w�����YS(���)�-`PEQ
���kM�O��}6�{���C��K���s�t�������l6�v��)��p28�� �5+X���"fz H�����lY�Z[��:[VQks�Z!�7l���lYg�9�����FF�f�ڜ#�V�Skm�^kk�Z�u�Z�f�:�r��P+�+˜"ok����N�ᛖ�wٴ�sLI��]?S�C���?�4wv��9���ǀ���܅����a��X��f�'��Q��%�Dz�u�Α���A��=�-���Y�ݣR�뺎,�hPF�MpTƯ�N� �w-%��q�y!��"��X���������-��H}gx<q����1T���
5ɑۃM�-��n�*����=J�24&�N�H��O��U�q��K�>�$tK�e��)�{�����o[[�Z�K�l��˧y���z#���Ø���͵�;<���Vρy�=���q��p��mg�f\1�V�q0�.��s����:]��ֽ���8á���X�o�^�C����xE��2�q�����<T*F���y��c̅����î\��Ǯ��x2Oz��-��g���a�62��f3�i����K�.��ӑ��
ꥴ�j	W�P����"�����˾�6���n<���v�1�$�k*",k�Ȁ��Jts�[+V�'��������6�.��,����_��B��GZa�~�	���Z*����ѝǐ������%uZ��z�\]7t�'�=y�R#��_B�&K$b��RYr?��.]�d��.��%�@>.�i�߯&C6>qYx����������C�ZT�zH>K�?�����&�{�������2!M�:W�k��:G���Ɏ&cv�7H�?�&c��c.�FJ��+A�=s��g��/����V*=��{ ���;�G,��
��<B	�"rEVdF�C�l�!;r�y��!t��'�uË
@.�d[B�$����kuAf�.k��GCTO�>�X}��s�$9��5��>��Eq�ԔH�i�-�
����ln5��R����na�?�����v<��N���HY�?��n�]��.��w�tW�Z<�J-ify	aL��ȫ�CV�gV�n�}�ߜ5��k`�PӔ��k���ַ�+���]���&U|��}���b�$�Ȅ��x�וxoF4&!4��l���8u�ƒF+����,���V�ц5hFh0��3 ލ�<�8�n��;�/ؙ��2�����ʞ�h�����l�,�F���f�7���`���$S�k���ޠ�ܶ=6U���<��_̴N5������H���?y�OBq�\���l�������H����m��Kx�:1/�r��4nO�-��|�uh���/ѥ~�%�����S��FDF�.Cl��:NZe�����шr��n�Y�}w~8����4���pC�1��cä{0��j�$\7n��Ƶp���cK�c�؂n=�����^&���ݷ��M�[�y�k�)��4��������e+�!�k>e���U�+-|+z��4ʊ5��DU���N�^8uF����5U�y?k�����fW՘��.ݜ�tS[���#ܜ
*���Zz�J�`c� =k����姧�͉��%��:<q�{�>�NF}a`��H%ᰊ����=���
�{�B���&$v����.��8�U��C�t}����;�(�d�dC�Lhy�+���|�;Y�Rx�O�]��]@x0����s�^a@,��U+~�*Wׯ��,�a�����'�{٬����XB��{�>ve���Qm���J!-RU��}���2�t����H��<�N[�u��&�0�����Q�v���ig��%R֛�����६�z$HN��Y�M�j�P�|BAc-."�S�X�@����~�(%�]��X��6����!�x�SKj.�3�psN-�aܖ盥t��]D�7J���N���hl��_iv��<��]?�1N9�܏�"��|E�y�Vm�*B2�6�#VZV0[�e�RӔ�O�_a���wb����va��G�Z��0^wk���U�)9�`�/e$1Z�V�턼�"�d(rk�#�^gC�N�|K0�~�4"}��~��$����Fc7�a��K��D��塒�j1����b�J�-�j�O@n_�hf�J5��jn&����]�d(U��JZL�O�[�k�-�#�Ā?'^�a������0dt�0?h�^	�+��ƽ"$[s4��%�P^VLL�[��R�SL�k3$y<f�v�~Ѕ���x�!�I����AI��& �^/{�)1M���r1����l����/�4�':2�IF�)���R�h%ވi���ɑQD�hL�b�Jǿ��t%��GҬ<(/�	b��@���[4$Z�ٶ��[E�/�TˁI��-I�7��ҍ8m�8Ux� o}b|k��y��k"t�3��槀�m%��a��[��~hnOC|W�p�,���͂���Ţ�)��J�M�SY�d�s��w��j���àT;�(��f�6��?��������W�9�k��M&��]�0/�h绣�A�.��f�H�#�N�Y�P5͚5H*�ٚ���^��,�Nf�&D_ -{�S��}�o�����B��G����v�1��^�+l��,��Q�[�u)5�Tƹ�4�&q	����Y�?�xD���k�N�=�kQNۀn�n��8S/�H�F��d.N�9:7��Ӝ^���8_���n��dD0�Z�&mr
����OR�]�F󎄁	6t�U�ZWM6��z�*�0��d���ط�
o� E�,FP#�"��k�1�o�����u׭L�Y����>w��b�0t��
���}{b�gݲ�ɘ���5'Y4=k����Gv88�s�u4���#?��{��܉;�/�E8uT�+���I��u�]?B��8���5��&���zJ8do�".���ޥB6�x��:�v`&��&�@t���}��qf��s���v,6]ɳA���M�M<&�h`��P��n-n<m�=h��\�!��IW�X /�W�����.�oh%6����[a�
؅��^gWJ]u�3st�F�u0t
-?R��*���q}���FZ/<�|�N��dx:�χ�W���1^5�I����f����k����}7�`�k���#k���9��
@��{{���l�����H׽�;m�G,Y,����c�Bm���:G桾�����TZ�W�����s���QU�d�7�)���s	a���֯ճ8C?]����fT�Gq6r*|S4m�ӄ�f#����*mMq�%�Z�+㩙�O�:+E��/|�%�l|1r��g�[z�
L�r�s�K��j�קA��3w����<XMkN��e�8��\r����.o��H�3�"6[�8S�N�bEk���Ch���e3��=����	�<
�1ģof�VބT�p�,{��k)��`PƋ0�̴��J���
�/��m�)���;���#+V���$<QW�gp'cz��|[�av���9u��fP~�tz�F{���{��&�?�4���<.䊧*Y�i
L������w���(k@P' �W�$�fƆ��ؖf���To䏺�}]�0M���W���Y�V,�k���_��#���=Z���8z%N���;<3��;���"jY��h���ޡ�a5�n��P�:z�N���fj��h����!d�PDG<:(�b���T0ǷA� �M``fƒ�b�h�v���=Ψ��?�����1�]G�	A������&���t�+�DE�M�0�?M�p��ah=`!0i�?�Ց5*G�[t�p�-�GT##*�q�T����Xܐal��:Z@�]�"��Z��?�4����Q�F7��S���ڶ����G)����Ð���Wڗ��/�|�F
f�003L�(�D�h����w�}�:z����{�w�T��]��ŭג+����d/^fj�i�˜�-�م�9ދ(���!���YV#�ظM�)�]��R����?<q����3�sk/F��E��\����eI���b�&u]m���	�-'e*���"�$�SUM��oU�C�����f(6ս������G�i�!:WY�	p���9��Ӎ�kw��L>�dz��‘�癌���C�9=����L�΃�kP�Q�8�H^�Y�#�i�$Mţ%LY5k��9���d�i"Y_L��=��H�����1��t�%eq}�O���AGL̛���ً���B��#ݒ�_���K��pݍ��x$��m����C�Lu5�(��x#t,2��`ƭJ͍�R��D7F��	�h'Y��Zg\���o#�tf�Rm-*'C/a]�
������u�b�&8�d<D�h#�Y�G\��U�cJq��Ѕ^�$ٲs�9c�c�n2gfŭѣ8�fόӵ����Z�^�Ȼ_1��n�
�����s'@��F@�c?f���h���H���	s��t)}n�@N+n�p	��ϱ���L���!������L{�\B�}�)?cbw�mj͑��A�M��3�b��s����ݯ��hD=�Y��(���-��-��)M�z�J���W���u`�SG�[�azېE�o6�M�t�8�M����_����B:=�6l靷&� ���-DŽ�\�t�u�X�'�lKuY�Q�e�!�M~�낋�s)��[H��o�������-��<R��o���%��L��F����HQ��e�w�7�+�4��1He��Q p�������z�FJZ�~��UH%�I��/nw5�="V�
�V����{�͉7V؜�2����W���}�Kx��ñ(�F��s�!G��#�Bx�vt��Y��b���8×�<u�1�����P�G�!K	-IDa_��sꎍޮ˗�O��j���A���bs�X B[%��D�a���l����;^�H�Q����j�@��J��8�x��7d��I.l=����BXPʚ��O�:[5+�ˊ�%d�M�NW�æ��t�&��-�,�><s�c�\!��u�g�|�@o�-�ˈsb����»��=)��)J<�N�?L�|�6��1��F�Q�呮g���3���}Y����AU���HQ�:��RaM="�b��)oD�b��`H�$ow1�ֳI�.�Tr��x�"5L�<�M�4�9�O�j$�$�lIE?d�P��ן����z�ag������"#cUܶ;yı$β��d��v�8�h��!b᨞���S:�7��o��ok'F����O.�/HdH�o�۱���J�Nw��E�<�{���
?ӕ_�بo�ܸG|�;&�zh4Pu"��U�m��w*M֮���J/��i��MB{d�"VeG6���=�rM�U��[�M��f�.�#J%S���Ű�]�(��3#�s�:�.;�S�
�c�.�.>��q�ȉ��rxZ��!}�O�#.
���m�3O ���Y��j�Cdމ�ީ�^t&��mg2�E�m� ��1�8L�H�?��cW�f*vTH�AJ�s�[���ξb�M����n�ۓ��S<�ꂤ�7�i��E�4+��9��g��Mc�֤����`������k����{�97�Ћ$��xA�+'����1F�a�=*�T�:��RR���B/���LƸ�Xj�г������M�4��X��u�n}ǝ`p��Tp�z֞?�k�+|�خ'a�s��D�/�����J��F53��z��w1D@�:"���U��,��
��^�����Q����GY*�R�m�#OTq�BjZ5�C�‚�������k��)��跹�7v�[;�vBz������$fa�_�ƿ�?���+��H��D2O4�v)~���N�"r��&*[���X��zf�vP�ɷ��9s�
9Yի�r!�E�7O��c����3�@q� �;!����v�3�4K��:Y��em�:���k�;E&���Ӥd�y	�So$|�x�k	�G��	.�d���k�n�vE�8T�IS�F��RأW/�����)H�G.s��6m|�م?a��|F��N��^J9��=x�y�K�T��3/����(%���R1<�=?�:'�˒Fe�lSJ�䌗��f�OG.�qE���'\_#ҫ��2�r�GX��6�/i�=s���g��	x|�*x��
��2�����Dz��8$�>"h�&��J�7�;f(�fV�[�A	�kCE0���r�tv��g��Yg܌�+ZUBa\�`��C��P��+���Ż��!�5b�ǽ�F,�|�pZc���"P������b�R�h���4�;B��*�o�lXj�X�(�aRQ�U��2L+�Y6�饍�w�YM�p�ɵ8>3e�ۍ����^���tí�)
G%h|5�,��M�s͐�J
Y�����vx@�n�/����g�8��#�+�ofb�?F�h�8�j8�-������n�Ô�,U~����~����cP�sfP�!��JAn�2�?l�X�S���݄�_������9v|����;�vbf�°2�>��.� �Y$��������S����ln��ͽ��Oie��R�;C+�
xr���e1�I�Ę�B���h�d��~�C�7�kZ�V� 	+Z˙\�L��[����qq(�����uzm��XU�zA�VƖ��Eؔ�&V�����at?��k�}���&7�#wX���lm4�߬�O��QxPW:ߚ����]�.Y��a���ܩ���$EN�eA��O�d-
N�D����%9����V�P=q�n�\���ly��s��xOm���r�h����eh_):�Wv���+��kԶj[ՠ�ؾn/�f�+�
�v;�b��#�<�[tY��V�g���]�䐒Ɵ��/������۳�6v��B��GZ��>	:�p�g��	OJ��'�s�S8��R*��[�:�s�S��K�br��
4�^V�Ę<�Tf�1��>�_�lu������~�:3z�y�~p�S+ .ս��6�@Y�rle`�V2q��N�J��U��3	�.`CGK�Q<t$��.+�ď�eY�BN�x����	
t}���1���q��F���;<�Cv(/����Yr��KضǓ`�V���=��D��C(F�E�.����<S�]�����v���ۥ�$�X����S��g���P���1z:���W�@��Vl�^��z������R�n�j�N�ew�5ˎ]�z�P�ߠ;�[�"�(g��Cl�q��m�As�L��%.2{Ո&ޭ�y5|䰯n?��>יּm���ȪݬL�@k��vxYb6�NȎ3$G.ou��
��hRB���Q���5�T֧Q������_����Ձ�eY2�>�hI�9�Ԥ�$GL[U'ee���
�au�|�# 1
�
�����D|v)�#RP�Wj���5�qA�;haa,�y�u|+F��Ǔ���"��_���!���@.46��9�(�@�C7��7�V3�z0�x������~��>|wU�A��R(W�[��>���JT��ջ�N'�e�:A�
���cW�ՀWt�g`���?L2u�p�#7��A����%􉳄}}�Y���R)��cVl@�3�1�����݊��A0�Z-|��_[�1�	UF��Qp����ȉ!޽�z'6k��o
�-�D��M�7<�zc��[,�>��n�>�@�'�I�ԩtt�\/o`E�6� pxxOE���1��Z}
�&�w!<��7j
�RG��;�E���LS����
0��C@��%m2�3��1��:͵�ͼ>�����h�L���A�8wx�)�%�K$>����s���PW%E�&�%m�<#��>o�o�x�DWJ�x����8	0K�i?&���_rI�H ��[�f‡D����-j�Un�o�� h�+Zv�45%�����{G#뿱�c��5v���_)Q�3�GL`8�'_����H������+����< ����q�C<�lw]<����j�Z:s��~� )
'�#��>����R0���oW%
��Z��RDυ���W�g����6	SJ̕�]㠊lI$Ձt�y�%�S�RV�R(��	�*��2X��(�b���x�
�	��dY�~'GR,_[�X#IDMĔ45��"1TR�6;�$�NBͲ�警$����"�Ƞ�{��Ŧ�[�FA�sH���}��tk��w���=�
BDgb�F��S�N�u� ��'#�d4�Am�ɨ�u00'���i7Y8�e�!�N\�O@��GcE��
���'�|Q�%��?��S�ק�^?{��
t�R8P	�d?�z�s���o �k�4�q���+ë�2���u��C�)6��c�VR��
�N���%H�!������愅F̀�G0&,(��~|���ϟ$�!ˁ�x�$���т��`v�O��/le0���1����2�D��1Fj�-�� <�8	��7p�S7`�O�=�ox�������.�F���-�ŎK��Au�
{�`���:x��p�D��_��ءRg�{X~p?��qX��Q�T�\���/y�����!��<�T������_<��)j���W�+�y�?{����+t�.�:u֧�|���# ������&�;�����O�'�ؽb���P��:�g�8"��v�	�َ���j���0d0h�i�kz1��zjb�R����h
�M;����L
9�1�����oi��Z�f�d��i��Z�=Gku��V��� �Z/��q�GKB]&y��+%u�Z��>�6��G�ס��X����'��dji�<h������[z)ԷV�"W�/����� ̼L�[��a��俶��UmQ;Q�֒}T�y��qU�+���Ɍg4!�M������g@U.؋�o�Í�h����^]T�.��IK�(,�)
��8N�t�.��VQq�)���Bmph�'����aox����7���F�)FS�0
�T�4��|���Au�}��zɟ��u"`T<��c]�t|���o0�W�h�|�F�]VQ��/Ϟ�E��b7�2�o�>�/�4�He��G'�.N����9���mH�;�5t�f�������٥�&�r�'Ȝ&�$�����Y/�Ӓ�_�\�_:���w4n�CYB?(o�Bs���&��?������ȿ��`���?�7 ���.�&�Tv|�.��hRO�^�#�	���̸�(��- ��H\<����D\�f���Œ!MxN��-�$	��l0-2#�'u1
�`�1�h�U^�d�JyH�"ҽ�a�RI6�К���O[�-RFJ��;�Ŷ�e���������/�R�����!�q���}:Sf]/ z|!WQ?b�|�7�z{Rco|�W�w�Y�u�Z�n!�:r��Xj��4o,h?�JT\�ٸ�t��]�]�J���?���L�j�kF��#���_�*�c2VIW��(���;'��(]O�4cE���$���[���&����)�05J�-n����+�j�A�83�C�si���K����#Ԇ��{�.�t(��O)�Q�xb)��O-�^���.Cހ�2W��M�6B��V|�|�T1���*�"e]d&�I��&��J�J߆������:B���\�"���ڵQ��Ih�6
hG�>r��p�`8����W_>�����w#V�4y��`�"�<%��#'|һ@�t�dK�CpC�J"���x�C���#�4v�*Q|M�����"C�ÙH��4��9��B#u�C 2�I����k�:D;q��8�C�,�|v���
H�y�!�������)U�_�'~(��8g.�#C�p�<~�qYM�?l@
��&���g �>~��7–�����ğ�Ap���&�z"�>�Fpq���ڣ�XB�"p�@(ؤ�^�l4�57���F$jU��	r�����Ώ�>
[ѐh�H�Ғ02dh���D9���ݳ^+�A!U�+�~�V��k��˟~~�����Z�gZ�-�
�����Փ�o��c��%jk�ブ:Lt^��A�}�N{�צ~��om�g����@�� 1��ŲH����rB��5\;XӪ��v��=GM�Tpq�:�$P��{����z��Hwa�R@�:���ח��yb�:ǎu�I4�(���!��K�c���p�*�:!�EuJ���u�b�Pm�W�8�Y�m���8<x���#W���"����`茴��ip�IqUar�	��'%YN���ē7�Hէu/�x�~"�G�������Ǵ�C|�u�R���ץ�%l,�ј+A��T�5e��~�ZO�-���}�R���+@�6���G/� ��7��3�"�s~=cN<ұ_=�'�s_'����5���L���Ǖ)�1�������_)Q�KW�e^�aړa�
�Px����*�܃�4t�(�Q}�&�7���-�+�m?���~!_�o���2yK~r�pű�_O6�������QDr7��Z��2�@S<[�j^���JR=2�8����U����CJW&vz���� e���\�̃F߼{���tOP�6
�}��K���I�Yb�˖&�]��
�\��2z���Q�J�V��dh|���߽%���X���.��q�Q��w���*�w�OI�I�c��a�D��g:4��%�[�+B"T����]�GR��� �	YVC#�������O��F���"��N]� EGSB�n|�)��,vFJv��K�����fφh'�'����<��0�8J�G�d��@���
yХgQ��!u�N�3@������I���)�˜�%53�����.�70#
��J��ծE@��D�i�Q%т���J�EV�L���yk�Fк"j�c(�6�9M�NT��^P�<�� #L�W(AFy*�j�hH�Y��,ow�����'e���=$��zG� ��(M�)�h���q�2h��J�P���	��í7���ǒy���$�L��n?���uM�FG�&�����M��6-���]�~%�-B4�K������1�6�u‹��$[&|�F�U"���'x$��Χ~}����52(0��ܜ3Hj�h�[N�,���XlC�}�T��D�̪ԥ�_.	���K�	YE{�1�g��K�A'��Fj�8\jǣ��ڰ�l#��%n/#���/̗�(Bt]Ǖ�Xe9z
�O�l�Q��[������RUD6ꁴO�Ey6�dH���ձ&>��r�S��%#M���B���5����F�&�%�����4]����K8���/�����vr5��4m��Ag������m��>sk�N�2�6gj�E�i�4亼TG�ju�h�w�$"O^��E���SX�\
�~Yِ��r�k:�(���4Qa��I�l�*,_R�(�ï�{49���<��1�
QŊ?���d`@�]�V���Sҵ�j���hu$�d���R��Y�W���
m7ڽ��ޱ�C}i��[dfFa��1~d��v&CϷ�~VK��2+��\��?����N<���B�<4�Vi��#W�o��Ĉ���wp�ۣ�n���l����Z��ؗ�,�h]%�k%�9��>���=��Lg+�z
6c���ь��J��Ҫ���х�+�$����@�t�
�>,�	
�e��J�v���<t�#��x""���{��O�_���O�i�aSI�~��D��Ր�%��y�v�rCf�N��
�=�ʏ��+�Q�O߸e��:��%�����?Ek�(*5�bM��d��v�7�Q���G���6
�f_���]‹t������71�4C��
�_�HĶ�J�dLt��NɪY\��'��o�!���:,��
e�P��-n�P��q����k�1
�h]x"J��>ڦ�br�~�r�&��떑���*��_m���TQ��b��5��*�Y���o�
�B�ܷU�ʩ����O�_�m\>ܨ��~��W�M���?B�^-�V�Lي�h
cT*�Gj�-��
NA:$#*��q�Ӎ|
�2�c�ItJɥ�n��
��	�U�I�sN����aU#/{�d��G8���$H�OB��l������;dv�T�.Jʑ�9�%`L����</�zuV�B�P��M���C ��kaȵX-R���e�0ʪSz��4j��t�� �Ky�D��os��(��!�������e5.>��͔:�ĉ��)8���8�(�q�Ӂ��`���7�q�I�ۀwF-��53W��]ũ����R�A�?���<���})_&�n�L�$�H�0P�K�̈k��5�ȳp�dmV�j1/����ZW3�Kl�����*���A��6(O�:m{1T�1b��Zj#�Lq���j���ƨaTo���^��L�7�����P�aRJa�/�Y[�L	�4e֛i݊
eb#���O|Bk���[�-0L��r���9b��
��c�v��á�{���Eqa��}����X�g���];uN��c3�fk��vdT�����0ķm��Y�t��##�*#�@����rx��@nK�ѣ�…����n!��5����������99F�����$��]�}�V2DŽ��Ò��,�������������E�v�7�f�H�6\:L]?�7c��X��D�}�]b�f5��i%�z�9� p�Lԇ8cg�g��-ge
�sI��CƐ�h/K�U�[�F��Uk4�T�կ?Q���Mq�J9����j�m-Gc���6�4�b��'B1�^&�-�͜��V���6<�&
X�Oˣ����@^���lZ^4լymΥ�;�\
��)��#�!�\GϽ�\NF���r�=�.�{�7���{	�hr:�t�g �q����<û�1�{Y�
N6�A���:�)�	�y!��UQJS�$��CB��9Q���/�	�:�ژ9��^��ߚ�8�m�>Ʋ��$��`��6MY�Nk�*�d΋` � o����Ğ�n$�
VK����՛~�$��%����:r;c�H�+j��/m�p|)A.a����Z�R��g𗤤��z�i�<�^�Cg��c4.p��x�xds��x�V�d�vX�ǁ����R�_r��U� p�y�A'q���')�~����j�
�u�P�l[M$f�;id��r���+�!��"�+�`�`$e��i�L"��t=dА�M��42�
	�dipo��z���L�2I�a5��ex�1�)���ߩx�T���aXm*g�ʷ���ģ�(%�ц�A[��I���I�̦���m���(���$]1�T*)G��W���Q.@�I�%�n�Z�>z��S%��N�ۜ�x#}� ��>Y�|mн��6��0�S�X�2��jG���&L��?��It(�
�t�9vRbP=����Dc�-N�'%6QW��u�*�T�B���]�WCO@09r訂�>�m���\P8�E���IB�;�	��:�KQ�a�~�m�H��W���I��]�s��	r�m�1Zt�mu���Qp���OƵ)]�C�n� F?&�;۱!fe�y�b�P��~���Om�BB�s�0��@�^MU^���iB�<�!�qʁ���o���П�@f_J��p��������e���=��L�Wu��:�t������['��7.�c�
��܍ˁ�OG6P���$�����I����8�g ]����O���ÿ\�/K\Ǝᯅ�vc6�,��{���G��c�z;�	"������)���W�������+�|*�q�:�b��$�3Q:r�$~R�it��g�9a�Z#��)��5]��D��4��JB>��1~F�0�4x`��bŲ�?3������3� [cK��a��':#@�?|�
B_���b�=�."<G�c�
3�2	�'ͧ<2������ܘ��"������"?I�=��#���*(R�F�ӗ��U���IV֐�[�~c��,H�:U�ܨ!�����|N�\>cHf�/C�
����U�Y�J�y=�0[ieu)[�!��9���ِ��W6m&"�Q�*e�I1ӓ!匐��<���c�jy@XY�+r�4K���1�`c��q�}<]fJ�Ib�,bxV�o$�__0_�~*{Q�4d�i�N��������xV_3T���St�1j6�D/T�T�vh��\A�vBSA]3X�Y�R��j����''6=L�����-��f�,����o�<u��HgS�pA��@\��p���'/�w�}�
7�^HJ���S��+�m��v�q=��N��Q�ؙf"�4��3Z%\\�K���>��?Zb�^
~`D�p,�:�M7
�͂�)�M~�-lk	/�Jb�V
��/d�Iɶ�H�z0��2l pֹU����,�53o�m�A�z6���5��Ա
<Uܰ�k�H��>�%�nS!`-6�ަ��6�88��L����21̾�+sο�]�K���(��{�Q�V�(��O�����J�`j%i���H��^8֡�A��>+$j?�|:	����Q��5���nq��(t��0\8A7�g~'l�}�tE��6������$=�c�/#'�᱋���MD���/�<=0�2��;:��$3�NT����/�4F��7��խ��ͩ�iS����Q�8��>r���r�J9Z�Q��O�m�6�O5�>�By�"ٹ�'s��|vP�
��
��lD�hz�$�^r_h^Y��
w��������k`A����
.��^�]6���ߚZ�;ԫO5N���X|h�C�4_���4�$�hJ���}?H���t|!|0P��,���V�똥n��Ԫ�//�߯��fm��m�zMo�ec�k�V�m
P�	G���C�Y���U\�(�knDrX�<6�2&J#�D6��)�8a����m��-s'�I+C�f�%�2v�������� 3����8P���py�]F��B�Ȓ���k�ġ��+�@�Ÿ=J�wL�H�R��5�q��އ�PȐ m`���s�<�Q������4����B93�`�NO�8�7�́�-U��` ��"��g����M�^��*]!�)R�$ES�c��5���ab�H�'�U;��/���
	�Cg�u�c(����$���g�2�
��9��e\�|B[·�=�:�a�o�JM�Q��3?�`��<�za��c�&9��<�ʙe�FU͍0I9�c/�*���+
�D��o�u2Ǿw��m&@|��E���/��7�*Z�>eyq)-u���Y��;���g�>�>�����9�⬾��n�hQX~��a}��c7`�Hņ��VpWz��/kX�Ÿ0��
��|g#��fU�wH�#(��'���r�j��^ݪ�)0�>�:J���ez�.o���3�G�(�i7;�y��q���1��
MxKP�Y���E;9�"g��z��T�
�NF}d	�#a�����n���?�?���-�4�%�=����~~��*?`��2�!��=,?���8,���{VN��
��u�~�˫�OWV���W�s��ˋ�x��ֻ����z�a���^<}��
c�Y]I��qj7�o��?|�������q�����O�x�y��l���4TS�:ɪ�0�.�:J�AP�̸)��7L�al�J�=�(�x����)�0[��OE���q�4p��d��̦�=gs�i�ox.cik������n�:АO��Rm^��K�S�|`�<u�8�,�4�����?�t(-�+�Ӑx�D�,5�)�u�g�0C�J�&�e�*��O��v*j�����~]=)@ҙr�k��X�Z3��`[f�W�����{]���=������X��Ms7)�t�
l��b�4��K1��Jk�:�a�^愸�!8ƾ�F#�b�d��&G��+4o��<�"�y��7��>,�RD�'m�(�<��jT���C�$w6�Pś+%�vO�b�(�F���E�_-��?���6�`16j^F��>�pݲe�=֜�
!|�m�B���]����9Cڥxι�X�PTQ�D�	�:���޽R���ӫd�tތA>��!�Ғ�b�r/Q�@U�0~�'���	&�� U�X�L�o2/'h#�WB��%g�`�:��CPE<�X�C�<�M�Lvñ�!�*��5ފ��[�Z�|䒋A	Nz e��jb��)�l��z�|�`|����W���7�󉸲]co�F�D�a
��:b������FQ�aM�����ϟ�G??�~P�Gr8L߉�B5� ^F�Я���ʀ�Jڮuv�fZ�U�(e��"�2&���\��B;�s�=r���'Ʌ��rtzl���!*xL;�����3t����\�Ay��;��x�H��zk�P�x�q����@�k�pȝ�Q��4(j�-_S�R������XBi"z��EBu�
N)#�|h��g��@�ۢ'�b�)��|#޼o�������m[BN+A�t6b���C�[r`�PX��$Ʌ�Ƕr�N�pr�d�k��׉�$5��/:du��<�a�)�ݻ���c�"�բ�L��m���R����3����I�A���^t�R�D<�rC�3!��b­�9��S%帄���=6�	����q���1�����)'��-�7-���(ڀW��u��F�dq�h��!�.z��~rx�fGq�Ǜ�J�4��&��N`���+�f:)D�i�=
��ep-C�5�2T�V��
hVs�"�k��C�E`�T)���ҌY:\i!=�	����t�f�6R��=LrQfj`c�DV,âH�+?�p�V�P��Ŋ�9Pب�'ˍ�(E��D�@ohq�r"S�1��ꕪ�69Mjƨ�L����Ė�4�X�Pꃅ�G����R?cK�;h�%;��T���������E�<ڊ�ߪ!1�FQ�`D4����@G�F�t�5p黠��^ߨV����f�4�rL��;�OE���AtW��v9SG#�O^�G	�N`�
���cƒWG�F�d֩b�[dӷ��:Au�:1�����
�S�ԅ��j�@�cR�0�4�E�Xh��*v�/'����̙�q�n���#̲�dH�٥��!H�' (�HݽZ;�厩��2�']d[���8 ��`�t�1b��o�Ѭ�j�:YS�FN�h/nm�L�[��v=&N,���4�r�J��f�E��VD�5&F�=[99�D5�M2�����?��0�A��@꘡�R>H#[�@":F��,�K���ʢ�j��>H�_i���fY#q�U��|� دJ��H��j����h����9~f�b�؂���K!��;�;�k{ok��{���{[�i~z�`XNh2��|Y���N���Iԏ�a�뎜�T*5�f�#�
�-<a�|�A����UD��X��������&F���xڜ��?��?L�%��c	"�3*w|S?��J�L�߫���R��5����H>r�Ki>�W�d>��~�7�Fm�O�ZN�RJ��Tw�E���x�%7�IIy�h_��;��L
����W��j��1l��\<&�����fU�
<�::(�.�)���'#⾴Hjڕk� e�K�N�D�,���A����;6����m�?��H��d�;P��
{�姿gNࡍ"�T/x�{Cd�ę4v�J��'n�"�8�K|%0����r���!6�Q�2.?��%�A
3����]�@"�nP�ڛ��_�W�⍨n뻂
DXM��n��D?��&�FaU���s�v'dq(J#!:\E֓�Z�^��Q�Mp$��@�T����]��_�����3���x�"�]~���A�~�`Ӏm��oP���N���n^�3��h8(8g`' �*@��p�[^�6�hOkH�:֫���u�h
>&�2zeXY�~��pŤ��8y9Tp�:$?`Ю���H9�'0�{t�7+�2g�e�Q���,��"a�ꐊ���ɳ7/_����q@�T]ݶ\Ւ0���'�����}���g/>z�6}om]���Z�Eo(G���#���l�9��ְ��37[FB�7�}�.2���_E#&��D��$�F�0#>1En(�FŜm<O��5	'G�k�RkU�&2�FB��i?���?��XL��6~���n��sH��?Nq���;��ܜM�3Y�<m�<�F���Q{<~��½1�V*GI�ھ��*Z������'W�d��/d�MwV4e���۲wc���/Z�\�-�W8�1tݮ���L�X8r:��w��sh��„Ѕp�w.�Փ��n���йu^-��NX����bw<WJ�U���$��m�N�,�9'��}�$$@�L�"����qWR���m<Y��	�Q�{�2�C!�����]�{��`:��)P���R�?v�%eN FP��$�7_4m�va=��qK���_��˲p�kغ�
�Y&��ݧ��R)��Xj�tU",ī2kz%�3{Y�U]���ˬ�)�ќ�5_y��
��à#@��p,2{��?f?��
 �	
G5��&Td���scV��@��&����e��a��s9��JbNM�ӏ�Zê�bWȱ��r�|��rvh֤� �|R�ڬʬ鍚����(������3�'�ƀ�\��`M|�MY���|\��JwۄZ)R�u[��s���q��X�{܊��u����Rt�O��$/AI������FD!�����^�����q�ҏ�ŗ� 9�;$�T? �R,%�U:;�!�� [Q�R��K\���ྔ.�$��%$��՞I��Ő�X�L��ćՆI.��@*6�r�bd#��f@�?��"y��o�����<ҵ�?��F�����^�n�����c����k��,�����sm<0�o�9#���iPZh�A$�V��Ez�s?8��b�U�kG�ń8�dQ�is�
�ͯ�J]{������~p�"Ef��)k�=0V	?�L�r�[�@�J���B�����f�s.��eΙ�QsHe	NT��-�$�Eu|�Af�K�ÿ�7W�,.�?/���i6�)�̆
*��d��10T?)GG �4j�w�P��f)UGh�3�D��6����b�)(���D�joCuo�u?�Nƃ~�-�'O_�Û�?�_?}�GN¼�x�\i[}4��ڋq�3F��3X�L�t+���մf�����Gٵ��/���Sn�����Ք�guWeɻ�	�f�zk`
В�9�U��f�,��͓s�qD�(��r�A���X�xv�
e4Z�������zuk�p����Ġ�}�A4F�Cu?1�z��:�<
���$�]@����/_�%����u����~N7l'�($��a��}�[�|'Xq$��aɌ �: ����ꯌ�q׆�?6$�/s%]��H��%]j��Hہ'�W|C,InY1ų�u�$	teC]֚-��HO���NWHT��T�^D{�M�#d.�ji����2�B��3:	�d,�iX�
LD�:-\ȫdL|��[�e�D�k�*8�O���E�j�7�pu�Ta��Ta���e��{�os� k��$w�F7H.����tp��n��d��ج������u��3�7B����!��*�����_�j`)h�1���i��Í���}��4�&iR��X�������Q��J*�ƈh|��3rT��Ѩ}Y�߸��_՚��6�mֶj[QP���)C+?��%���/b�X�@ +��(�{Ñ��	�Ocr�,�g�B����o�&E|]zka�|и�`��׀���c�갡:]��̅H�ϵ�5ݶ��T�+)8���.T��6i䀕R1�$��RkVrl��@.A�U��aP8���(G��Q���;�嚇�I����c��l51�ϝ���B��C����m�C'���J����?7�\XY��ߝ�ƽ݅A0%}���#-h��f�מ�����W�i��������������o��7���o„)��ҏ/~aϟ�~����鋧�=g?��=�4�]b�I^��dͯ��]քe^*���"�O�l�q�^��e���uV?�:��L�
;5�
^9��{a���oK��\�Z�y����N����aG��Kײ�>ԯ�<Xa��Aɾ�q�����M:l�8�c8�Y��Y��]-�Jxf��
'l�F��䆨��"x��<9���sц7����,2�C�����ɚ����JK��M���'ON�4�w��6Ȯ9�!�3�Е�c��f�2�eZ��G!:��O&F�L
�A��qs�dx9.Jɸؤ^c�2����Y��TD���@���Q@���z�+�]���c|J,E]��t���?E���jy������j��!�|4de�\��3��
C�c
�@�N	_�A=����ݒ=�>�Y����u �ݕ��@��G�-y����~*��vx(�A]�8@oiPdR5I`Z�y�ɰ:B�?�=��N:�K9f"��ܧ����r:���梯����ׁ��D����樝ð
�.����9��	�_P�r��q��;�I��7���WZ��XŞ��m�[J*CEb��	:��pd�sP@���U҆x�pvm"	at������@OK�l�p͗!�,9��tGx0����6��	�}S��:z���pb�R�������{��T��K^b�˧����W�\b��k:��
����N�i��S2E<�y�r�q�l���2��?��G~����4a`9t��M#���ڥ�*	��@w�#�D����n�tl���w���0'��ztt5��4�A��E3e3�?B�p$����N}Օwҳ�}ڱ<�D�QJ��4o��t]'�HX�gkF�������*�a��3�3�*u����D�̔q!?�̩��1������S�۰�]�PB�zh�Ž��d�/U�+�=C���Fن���by��&~BX}�o�W5<�%R��C��\@D{썁i�3�p��`��z�9қ�7��Q�}5�6�Ŋ<Mc7|:7�1��U4ꀹ@��A�Y�]c/9�@��|��h�B�e,w�?�NW�)b�SĀ�ou,�,и1x�j/9���
��AyL�:sg��u8�͇P"����{|�tN|@�5�6�H����`��{��r6w�?�@���a�i��;��量-�9��t�ן���c|!�#�!NI�_gq���("di}̏�{�K��K���=",/\]X۰L%�xl�(ҏ�1(�X��u:'�j�ǐ@��e!�����%y.��LƜ�r�"�"��W�s�Q�	�~c�@P�C,�x$J`]R���wj��&��n�>o�l)���?��]$��Hnp8s�h�P�d���N��%���h��/�C�)���k�HJ��.�H�K6V���{e�hX{��7�@r�7�+qn��7��bq�7�/�S8�O��HG��9��O�CIt�9��(n�fQ��B��p3Q�&n��.P�z���87x�|�$�v3b�rA;��Vϻ���lm왁i�"��0�A�.���qYSL���rϫ���
‰7��^�Z�eK��5�:�di�A�ˈwEi�f��<�̉&��Z�\;�����W��e��Ȁ��ϭq�{� ��H�R֐455h�
�r"��'.���zu.^8�ڥd(E�h��(�)*�q;-B�:�n�H�o�x�褲�D(:QD�&�P�D8jk!y���{|�ILࣾ��\�����&���Ă@�J��{�MM,&a�ԲqT��3g*�0���Y���<�4XP�s��F��n�m��MT'�u-�)����5(f�C�q�(.�w5V_�CB���3�N���![6���|�N����Kζ��d���$��4<\&��n�6C�!c�7�oM%j��TB��ukR�3�ipN��cj��5�
.`A�N#��q�՘#%r�V-�y<W�W�=���(�%�:�Փ[��B�A��r��VJj+
Ⴕ,��d�0���M�F8����J�d�M�$�DW��}X��T��TE��ᅉ'mP6�֏u�i�o�����%���J��Z"uc�ftS��K|��S� /�K��1��k)D�"�j�{慚Be��%��}�ُe�乩�>��$��� �
6B"���^�l�ڤ�#�ji@��s��������r%�����]f,�uA����
�K=#��
7�����K
#I~9`<��b�!�9��'�8}�w����呝W�J�_��`
�*�
yf��3�����D�K���WW��C@��A��\�ڢ�-i�?�GK��Y��_߁�а@(E9�~>m^I�1q%q��0��9Nz����GuB�zt�R	�ʫ�{(���NN�0A?\��t��	���)j��~�\n�O��bS(����tx�Rd�vP��l%�8Z%�$���d|��o�rȆ=ÓO�ajG�2�\%����9���ѓ����9ۘ~����؊��oo��H� �ZV*������Ji�a.��4��G��ew�H�L����{
+�k�5{ۅ�Wi��Ƞ���N��흝����V�~+O�HБ�=��M��Tz6�̐t���iC���	[.�85nu���;�?�;�Wn߅��a��\��RU�J���ԩTj���a�{O-<�I|����\M���h��C/Ș�C�R*5k(�P��Ӭ��i���/(R�߸�JG6��w�� zT�B;:x��V�	��\�Q89�eN8�~�٪����C���Kw�	*�ɮ�ت�Ak=���4�V���ɒh�V�w:�O��e8cY��nӾ��܁
���9$E��4�H�۝��Y�#����t �i��]QX�.��#����L�)Q���槊���j,'^{�ӓ-��p�7/����0�E�'@.W����K����e�\i��/��9��Z��}���{��!M	�~k�
(�tg�Gs]�{|K�&7ɪ��u��=��O)1	O��I�*����UvwӔ��9�[��-�Ĕ%��m����o)��
{
��_���5���S�V�/�r��k��j��4�g}��Y�`�ϤK�����n{F�o������Y-~2HN�38u��{|�~�����ߟ��ݝ^7�[��l��R-�ظ-���o�8� +�_����Ӄ�j��{�%���B�����Z}"�2��~�Z�*G��5C>L��|��0h�����
:�	���h~Q������"/P��j4�K�9��ɧ��N��m=N�M���ҘQ��W)?Z3�d:l���"Z~��4�o�~H���Fs;�m���?y��?g\(�
�t�3A�:����?����WO^�����7���ӟ��#.L���O��<�G�
��2-?��9o8��`7�]=4�2l5PWw~�0Zv�U�c������R
�*,�;RPE�h��p���_�)b�E[�:�P|��ҙ��]}�N�I;���:�X�F�/��u�pɋ��M[Q1���#c<��~��t�a��,}�'T�?%8*CO���FT�Jџ
P��d�Fs�,2���A8D�d��:)����?!�Y��mT�S�S0#�U�e/P�]u�ZX_�m���_�i���]�w�2����=\�mT+�����U��n�~�8ln3���ff�I��f-mÑR�Z�Ihu�Cv�
�8�Wk�އx0�#-�̀�1�Ҥ�'4?=z��uk-X�SL�� ��GW|�ߺɚ�_����b*D�汖��}�	%�lx��⒓�J�������g�K�q�|q�h��$:����J�G(ZZs�
]9����1�3GE�jDz}�(�.&<�t'�V�Þw\=֡�PHF��}��w�0�G�/��Q���Cn:O���0��aد�U^����<���f�+��`��k���t����۪�P�f�̏t�%�66(+����ĉk��9K�Ӕ*S��˟ߨ)W=ɷ��}&߉�(�u_�=s��3l��g��jUx����.���x'��(�>�y��NUx�u��EO�����v��1�ժ�F�G�V�U
z+`��	���B>ҵ���y41`a��qFUa����T�ˇOCY
���`)�?SY�jmr�r���\1�X7�O9{�K�:e�����ƔD?�^{j��-�Z8޸1<;D���h|d��ur�ƣ� e"������	r%��( O�HI@�U�����N;�������C���3
˕r)��~��,��2P�W�)�cU��zXŞ���X��ڌ������!�w�bd$�������y��;�����mǜ��IS_�Yr���y��=�����B��r����NuO�s랠w���%�4�P�f�$�~�މ�L�Eͻ���u><��K�!���?]!���$���SxB�75����9N5qO�D/ޭ%���zO�T�w���9螳K�!����t�l�p��K�)��}�!嗪��E�P�	��Q�;'|�
��1�H	�3R�֝B�T;\��	�;6�{އ��:�^�H�"�[ݥ�q=�5��ŀ�+l>g�4�ו�H���P�\sn��4u|��z�S�$��5U]���C�U㓪�,e��G�o��Nu�Y
�,ܩ��uq��8E
xлv�`�R�6�5�0W��)T���z��}a2��_���;�W:�s'�x{w��~����6�ۯ�^�$ t|�yީsc��j���R��eN)G*��HLm��.J����MU�tJ*�1�T"���a���F�rY��`+�H�q� zSd��d�*̐0���I|�"�R�ߣS0���)�st\�?sE��KU�7$-Zg�҈&Q4QJ[�$dјx⟄D(>�C.�$J�Mk�r0�+

:���aW��b�Av��D1]8k}Gf���%��⍜��ӱ��9G�QG6�^}>rr��=�� j����f���E9R;R3Nq���aٱlØ�$3���� �t�/�;f���[��!�>��l���t���Vc'���,��Vp��ni|���Ҡ�P�	܇	Y�tQ�9.���-2��|E뺶����c�Z[���k�g����j��y9C�ܓ�[�E���
�7���ڃ�d����"sDt�Ç�dy�p�6�N���пo�:m����}Y���.[�/�1t����I5UƵ���mD1�/$d�"��Z��hT��o���+p�(R��*���je�享�߾V�~�Z>�}��p�]�%a�r��Fׇ�0�U����p�ǽ1�*l0Ιw�M���J�Ƿ���
���Q���z������_!�Ol_�{}�xSu�B.�3��!7�m�V�>�b�O��fbE�}�g,�ӫgh6�J�I�.�|�t�c|b�,�Ӽ����K�F��M���Z�m���S*��h�S�ގ�Cn�Џ�X';־�a��iq>�U�/����4۠�/�_鱝�X��8��2�c =��D�5�ʮ
�󖆀K���oH+j?��"[�ϊo�~�T%�iƒ���t�j�	|T�/^�mOe6�9��>_�� �n�F�G��������u0aw��p(�
z�'c�2�����zP���v��_����7z��GB���V�dU�߷?࿒zn�C{ọ�E�6�OUIa5j�
�*�_g
a]�{���]�R>�|K�@��z�^�"��/ rRyx���r7��D�;˕���]2��sC
�u��~��-$/� �ÿ���t����4
���9���쥬MO�v�Obljum������c?9�.x9N�����U�?Q4��B�`8��
��ၘ��q���"k ^l�������#��[W93�
I�E*�i�l��Տ�
jU0zK[Ѧ�Z�d4�eэ�2���V�=��c�MzP�K��/�_Wpp��WX��[��n�p��_���
�����뇍��f}�R�b�5A��s��G���v
�.��8#�p��@F
 M����m��uؒ.����T$���u���W���x�7�Y�b�5 +y �������˙+"�(����~�f.���V�}����=\c�|�
*�j�:*��+�10egN�猯�&`�6̸=y�	V�H\�8�L�Ԩ��9��~�V��c݄H�aOZDr��ǰ�Q�
��7	�%�,_15��Ԭj��xC�(o� �ߦ�RT����PQ�����)�����~{��!8x��j�}!`ג+[{X^m\�U��{^)�'_����&z�M��y���v.a��6��t�%#!�Uj,	��Q�a�Iujo?�ko���e�F_6��j՚U+)#|��7	]��ڧg���ϗ�?\3�K�:}�Vk�,�&F�
��돡� 6��El�#U�1x�}m�o��8���Qn�����i�S;��6���X5"T|y�$���0X���H)i���s洑ql���ZZ�k�{�E��<Ҽ�_q�;-����_���W���%���Y
o�"���I����X�����o����HZ���nl����	��wF^X�AN�p�Fx_/
 }B4k[l}�#��(ҕ�KR��&�����K�U�! �4z�_��$�h�H1��v��;�ȓc΄
����5���x�"���U��T�e�Gݷ
���J��}��C������È�,Q	JQrA*$x��>ş.?z͞�.���~�z���go���7�Ϗ^�z��
z\z��=~��ɳ7�^���أ���ً'�2~��aDq7@���g&�����o"Bz4<� 7�#e��A�N	�D(E�Xwjž��y�ub@d��{{1���S��#����̐
dX*��R
:�>Fι���h�6��|���8�R�����>�ƒ<��<��#�z��U۪'U^Y�V(6��ƛ�	+@�+�s4��EKI����D�jh�\*=��<��0x��3�ho���l@@��ܯmU����)�����-�*aJ�x�P��H��B�T�(M��?O�Ћ�U��x�آ�{�'�!k�e��f���^��G�����_��پ��ҽ����.���7������*���o�������p��|�
����/�+���޿�H���_?���2x��|��������>�)TG����t�_c������(���?��^�
�H����9������Ž�w�������{��=�����W��{+o��?�wf�?��Q�<��c�":�<��֟!��K�!�ڋ?��zB��E������F%7|u�|�	��p��H��Ǥf~��#L���!�/.�������?�����
��d��{���g(�/�/�������_�����ƿl��������{����~�_=���5����{���Z�ͽ�7��O���{�������_C��������E�A�!��<�md����/�;;��/�$��>n�/t�Ed�|/{�uN�޾&�},�8|S��c�8Z-���Ik
	�z��5��H��d.��RUo�މ"Xy����Ө�)+���QU)G�@\�)��2y�Y���޶-�5�v�/���5�l�?;C�=�������o�����c�
}���-�@��j
W؍��+lV�!<���,B��n�A\a�!r���jWX�����u(�*��G�7�D<����,
�%��]4W��PMa�5Px.\�0yF�2�^Aq�C�a�F@���W4�8ܯ~�	a���4p�ss�#Ȏ&cޤh��/ur��MP�x�54�'Y����?�ZvN��Ľ��;�=��]�M�„���x
.�QҌTb���kb����^BmXZ��zɽ_X�`hG��2+���R�5�s�N1^7,P���Q}'C�g���;
�˞��K�i�߻�rL*��I����7>�]�q��ҡ;r�(��-{+�絲ްӟt]i�G�Ϝ>�CV�遤 ��s�ԫ��>L�cNF�e}�	�~���o�m$�.k����=��[��O݋�v�7@<��C��r�\?��C�ә�n}]��D�	�wd������.��6����|U���t^ԙx�S�:j�X0��q�����!u���^?
|�\��,J�7فCT�Q��U,���|}�K�M9	��_�~�	wq��1j��!0��*R��_�0���^��ǯ4LoO�6ؼ`��'�am �z
S	��
=G@�m�sa+��┡�x�i��}��\�2�j4F�𥺠6�w���u���D$���r![l?����~�U��l�p�>�O�a�\�
K��#���*}-k���6����V}��^Gƀ���ϯwZ��Ј���r��z{�0���x���OOA:x`>_�W��y����/�ط,��U�K�|9lX_��1�9�� W����/� ���J��<u���fDyq<�&�a����
C�87�F6"��C�G�b�"L�q~�G��'�:���3��ض:be��ͷ�z_�3O���BEȓ��g���N�V�=��W/_�2��z>�T5t�����]FE�bI����7m\Wܙ�����X6�2�Ne��'Np�
+�[=D�~��?������ӗ��hQ�S����U�Z]_Ŧ����ZpT��}�����ƕ�'Y�h(x��]
JY�C"�mk�t�!�BO���ĊE�h���\V#��N�Z-���0�I2�Z�U�f� �1p��w�^�P�Af����.��$ش5���MXU��c �#
(B��0�!�HB	Կ�.��ƜNguܕ���G-��X�TBC��W*�a���rxy�y���~� #��fy��k"�����R��X�7F�T�������Uu��%΂�|�{T���Q#H(Ј�*ڮ\��Y����|��y׵&�*Q��<�> ��ev(;X��T˒8*���8��Ch�j�Q�P��#��FT;NEHkE�W<��ĀVU �;�JJ�U��8�3uw�t���'���Һ>��“�kX�j�y�*�QB��[�
�B!�s�nwe�@����0��J]G�F��+�v-
Y��j
&�����Υ�Z�������{����R��
��񪁁��~���^�np�Vf���\�q�y
�}�k�h��&*�?�ˡ{n��h����|�h<��lPx�̌���6dF�X�ﰱ�l;a�4x;[�_g��`�u3��U�ժ�8���������.�a�58��I9���寗��
q�]I�`���1�4��<s���:U��J%�JA���ޕJ��mH�;P�kҷ9���j�w�oxs�WV��(G�6�C�RM�@��*����oQ�6������wR��
$�!ɍ*��CR[j`�Σ��z��j�#`�A�^#dž�xr�����:����GĶ8q��3�2��T��d�gטPW薦� :J��/��rN�p�;J�����w���{�۱����fq��C��p�KQ�]����#��:j���ӯ��V��]�a���	����:�H�\V_�bu��7bu������VY`��5�h�E��3 `�J%`&�"����v��I�|];�БU���N2�k���w]ͪu�Pt�����1I~�N�1P�� [Qun��� n�K��e���?]�_`d�z�����g�4v�[�)��I`*	'W�Є
^�	��Њ��S������8�>c�� �
i*�K$v%�_�b~Ί��h��:2�P�6?�Ǩ}����1A����@�Nd��l~�:u������XY'ۍϖ��mK[pq��x���;��V����Q�Ҏ/-ݴ��
�z}�+���u�\㸯��*:ݺtJ�����]/ �{U<�@���6N��*���V�Q��x��*�����GT.���E��Z7�\�����N}���^�Ba�;n{�)��+<��B���%�M ����(G�f�9����1�%�[�d�x�N}��C��3V�H4��� ��O�h\�u4? �%�p��5���IW.!;L�VVS�'���锄?l�JQ�`bFzSr�A�5���E���
k�gh�⌹B{C�ϸ����J�9l��?<��a3�=t�&�\r�]�F��U�}�X��4g\�RY�6y]\���],��E������)��k2�H+?�a��܎&�jsS���&���E�l�ơ&�Þ]���j��(��Z@�!��ي����e�J���V�p���5�I�w�=&È,�1w�4M�y��ɞ$ꭵ(g9�\hP=�x9�X��d$C��9+�n҄��d`��F}'�`n4*	�5XYɔe]�����MV�z]j� )[Gz0(�x_�n��lڐk�2����}PԆ��� Ɛ�. nT���� ��o�f4?A�b�+ ��J���ø	�����/t���Uj% �Ʀ��̂L��%=���,a?�ޔ9����}[B�'���eY�f�r���`U����D����
V�"`�n]�V9��8���%��t��]����^b3�aǤ�M}<��v���ۭ��������[�ok$��-����a�b�z��m�J��פ��NFd0��5I�U�7��B�C,��n�+�;��Np
��{���N����g���!����G��#5g����}�x�1�:)�!Wk��q ����4pJ�j.<�.�V�y7գO���zNJܰ^z�m��Qt;h�H�3��ŶW�E7䶂�Z��0_o���}-����?E�㔛���1f�������NÜ�|~����6 �	�W��:�L����=���'l���C��a���G`�$�D��N���|�5�Lq�`�Kt��-�P����n)
eA�=��*�딙.G�p"�	�Gu�"�%Q��4�i�G$.V��%�dx���؄Բ�<�d3b+^����x��G���jʬ��7F
>�
��n��
nE=��E~���	���K��
X�3�#��߮�cEbMlʘ��B���9e���2������N��VC�$k2��wm*`*W��z�*b��`�6�Q�d���Ķ��s��u@h��JY�YC_
X�E:��УS�(:���r��T���j��nG� V�Lwj��k���Q�-\�uj�;`����dx����l�>jWXL�_�v�7�^Q�{����;F7�%��`«���rc~�hZk�q�K����xyX?��厂�&x�6<��:��9�p����Y �-T�/�M���J�d(��z��zN�둋Z���Iw�V�~l�{�l$�SWl��{�{05��u����R��q5}8eT y��#�4b��(3��Y�����$N�ons��m���rbcmsJ��-a�i���H�Q�ʑy�F"�G�6N�����Z�L
֨��XK]	�����^#yd���a�J|�aY�R�)�C3�N���:,���(%����R��D~-�C��Oݽ��/ТI"O�&�$`E�����
�-��h�xc}�V����K؍��b ��8*+, �%�;+�+�j�Kl*�NBf���2�� ^��Bͷ
��$)�8j����=�"Bn���/�i�w�8�H��@E�\JJ6��R#�Ի)�f텁�M�s�}=�K�0����T3�S@�Ş�$����n��������,�?��8-�z�pҍ�%	N�K�q�1T�˘�<{B����M��h9b�t��bƜe����s�����3��Շ�C݉|�2IT�nVFz���򪠌�٦P�WJ���q�$s���1?����
��^;~p�ƪ�B�nM���a=���}�>j��jJr7p�f���AUd%+nٝ�e�;S;)�Fyn,�+
"W�`6㚔�A]��8r	���C��ͺ��(��ދ*֎��H���j��0}�_F"LE��t��b4D��n��1�Q�[�$c,��+	݂��?S�-��ۨn��i�����l��q�OFem��<T�p]�R(��AT�͔�FH�� .��f��ӰaD˝��R|%��+S�\�����y.��C؛)b�R��L����b	/��5�/�c�ބ5�|{�+����d��MC9*��k<�G
f�q|9;�ں�X���U�w�$BNI}��c�S�J��W*ۓ�pi��т�
�J�ӗ��ZEWy��U9B
�NT�'q��4�gL)!c�i�V*dnD��XP�%���2�YL�����4����9���OQ�n�F���vc��
���n�����v;�}��0rгG�gA�^R��d��8�]�r�cC{@�2�L9�O<�6��Fe߭;jt�Y^��|��ǧ�2Ovt�!:��0y$�N�,�G�rB��H��(�mi�q���j�����ܴ�pTZ�bӷn�%@x%�h^�p�����2|�j��g�g���O-�+)8�]�{Ǯ<x��+�	�/�hnɋ�4T��'+Qo�-*��w{#Vd�V�
u,�A/n���=2�I�ϤS�P��,�"����AЯgZX�:��"���Ay���cA�|��x˯<Eh����qX}�og� �S� ->S�qy�a1G���)��+�����$6�A����r\�81Ӈ�:e�>43����1@�&}��CG�!��V�s�E���|${G���D1��s&
S�@\��/{�+R�7�}��,`����p�k�����������\+g	0c��Dԍ�TC�YB`U�/4Œz�j4�7�2�
u��b��_*l��{KRM	ͷv�����`F�x}dÊ'���in(MI�u�B�[ �vu��Q��#����x���5,��z�Z���iy��4������vcqm7/񜏷��2�n.���K��R���E&ۋM�M�21���x\f��f��f�j�?.�Y^a����D��l�Wh7�s�}��?��kgq|��n�~��6�X���u9p:�n��_j���y�Sj,���n'�.�'?=^�&�d�E�Q�H��Z�����l-N�����?KW��L��6�FY	�i[�{OnM��.�U�G����k����f����U=�4��N���	���j��i����06 \�h� G���J�b���ᇴ�˰hjy����;xX�`�D@�o�v�E��
�ˌ~��dj{�@I	�b����~��.��L�:�K��tP�l�~�4]�Cϕ�DzKN�����N\���*�ҵ�?%��,-Β�&\����/іG۳G�,��e�U]	�ݨ��sgi�u���ԙ�CeaL'#hq@����=���ׇ7t�Fl���Ӗy�k�7/��< D�@�X
X����Rㄣ,�
�Hs�M��F�U�hU=�tZҊ_|h'��%��n���Nܰ]�Qi�B*l4�+a�-�Ǩ܊�U�T�\YE�ԭ-u�J��
��z��d�Jz�_';�&���nw){S��q=+��/�A��������z�h!8�7��N�2�5]ك�6��b!��GX�o�n�h���0�?bi��D4G�s�
5�������,�xFd#�����fL7<�q�`��r���I�k�M�_�n"�U�i��Ph�
�Ck/�r��R����Wױ�0��6&���=���*7��;*�]@c���2�&㐽:zLo�|�óߖ?.���,�M_y͘]h�gx����G�c	ͥ낰fM2iY��hCX��B�����Ѵ�)q$��X�Lݤ�_ڔ�	��Hs`�X�ZCVV��V��,s���q�(�'v7k���x���������K�
��>,�D��Z����g*���	-�1JFC~��.c�.[��_0��ߙ����2��Ÿ5�L'.�S__���/��5 ����x�����7]
��^
{]̲(D�k�
�|tx�,嬬"���K�@��N�6�X��+F}�e�׉��-��7_1�dhs6[�H�j4(��T�q��'R�̖��o�!v�Nf(�[杖�:��1̉"]���l��q,��,�Kc�ǹ�m,�x��eTTq����#�N�/�J
����
ƴ�ֺ�E�r����ۚ�lK��'X�j���������2�*G3&�v�^-���R��+�E��}�@�km���5�$��LtK����o����`��b���j��G�D�Be�f-,>��{3���; }���c2_��3'�(����{�y4*��WW*��(����8Tsd�}��akC�Hj��Xِ"ZDX��9��6H�8���ZL�Ey1j��Vy��#�T,�Yc�&�b�x������c��/ў�?�����han�6"yp�a�M���$܈L�U֖!�ȹ#/!u��UO\�K�^T��ՙZe��Um�:R�iKp�$��^���#��בtY�<1D��7��վyB�6W�:V#�R4h�f�,�6^P��wbn��W/4��7���N�2�J�@��X!-�`�{�DG�Q0�#�meLg9Ŵ�I��Ȫ}�E��ܴ`*hAP�]�o
�4��ߪ���(�=���AH� �^��*���V���9^�v�D��t� �.R�}{@a޽��2�<|x݉����ę<K�q�AD	�Uo���ə�mxBxC������ʒ{hT�w<4$J>�r7!���I�)��+���YѢ\�m=bk��wO������2{��lIZFͰV���*b5��Q�a�9�t����o�
�A��H�e�L���Y�›Z�B0�<
/�vl�f��tIIL�`_pl�^���,�p���oY�j��xu�c&���զ���p#�t��)�:�^���s�o� ]����,#)NxM	�T��������T�D���1Ge�p���Iݭ,����QM�AZ�?jDG��+ѐw8�":l���H��a�.
U�(���C�w����'-
�b�h�68����$�'���I����_=z��m��/m]&!7i�‰z�ˇ�=n?{�/O�����`�̈E=~����)����N�d=��FlU����?��.'�u2�"]ڪ��,��ӟ8V����pD�9���O(F�'����$rʝ��P
��,�H^�%A6�Gs��S�utڿ�pU.#`�����Fx�����p�(�Q�#����ī��x�L�ubB�\��Q؍���އn6��p�HL����+�o�;�e�#���]�U�׍["�)RcՁ�뎠���-�~!~�Yt�期��uV��J���5�i?7^/�=
|Q.�n���+��V�ߥb�ͫ5[������"����]o4�,���>#�a"n�?>{�Qg�V����)O�(q�ە�Z�����Q o�j-�T��a�=��x7�T����aj�+Su�θ�9�2�[�H/\�3���@n���[�C��B}�]J��*q�ؕ���+>��#��m�%����e�t2��3����%}7�]��}��A���p%L���?V�(�ڦy:Tr��K�+E�K���#�#��b���x�/�?Ò���9q��g!M1�Ņ�`��n�� y�U�ZIl�ZM܇,T���"c�q�~�}�(���س.�K��	a���v�⒎t̓_Q$��(�)-C�b����[���R�9���,���r�q�	��/^�ZۊT�\���=�5`�@x;�>;9��N.;H���C��A�]Z��p��X�&�E젦x*�iM�5�^��	u�����ю�m��9�����s3�	��mL������۷�[��{��_i��/X������˳��L�R�P�~���O�V6��x�U'
'��n�G%D^������+>�;A*~������K?��ڦ�;��I�AW��w�Ti��Ăx4� ���n�F���,E]�6i�"v���v�{I��^"~�W٠ipCt)M���T{����_����q\j^ H��J������c����NE+	e��������A;���Gh�!fcsZ�Jyi��-�-���k��W2-N����Ot�w��<S:�W9��	p���L��$VQh��w�������vc�OT�]F�F�>Q֒����q�'Xj����1��z�Fk,���� �=���Yb�
��1��R)��O���W�5k[��g>�Z�������,���V�R_�P
���X'����ap�3>D�-D�f�i�pҙI��pE�L�N�㫆�M���A�TH~����L����fid������%� �2;��c�>@��ׂ=���u�p�w.�(�p��"�1�ph�#W��]����9ѿ�5��E��V��.��v�lB[
k�ld�:�T���<k(u�R���5�ҹ�1��L�lڶ��៰�UL�yji��!�Jʵ���FCֆ#���ޞ��
T���jz�g�mӺ�E�Fy
K�8���V�w�ȫdB�}3�S��_�~&����,�h�*{�z�	
Ze�q*u����/��t��|@)��z��%e*�ii���\�J�C��C�W:A'����Iߌ"�q�\����O @��S>�J;
�)Voz�q�B�﫸�I�Rܧg�T[����B�mԘ2����ǏZ��j>� ����I&˒|0�(]��O����}n8)Ω9�����ۭ��Z9~�=��V�_�6���=����a|Z�N�^~m�+��nVQ!\�Y���|��"�B�7ɜ��lV�
�f*:���'&$��#�Sj@=�ǃ�:�+��~ȖI;��C|�	&*윮�}�,�ӽD6�R{�TJ��F���RXcr�E�����*��eȷm�3�I�z.��(p{���!���0f���I���k���(�֧��J�ݬXM����{e��X�ۉ���^O���W&@"L�@�U��)6[���{8�7Ǎ�(^�nZJ�{�!��O���~����/��/޴�<z���7$���t�ª�����0]5u�k��H��(��t�$,�#sDV��%V��Э���f{%2��_5kƄϚy#����2�E|~��G��>i�;TW�@ؼ�V��#���P��T�
X�ɘ�,�3S�'p�냺ٕ2�/o�}K�*̕
�ߴ�����D�
_g��`�Yv*ÿ�[,���?�b?*c_�pNj�����%[�Ta�<K,؈XWn+S�̾�1ߢL&f��=t,�T��L�R�C%U���:�`�w����8���w2�$kI�0���s�\ABP�秘Bѫ��a����ɄF�4+�M�#���+�BW�6OZ���W�T{�l7YEM�UU���hٶ��	fK��cE��bZ�*���VK�`�椽���EО�Fy�~��h8c����0��q=�^��0��p�O�`�MM�&�r�J�早41��8z�rg!n�gM*�:fo�R�,�HΥrs݊ѻd[d3K�R����Vδ5��
����P�����$�xD���R��(�^uV5�������;�}��D�h�Ld�eJ\P�×5�gp�-3ˇ�
�ؚ���WG�[R���6�
�����Q̎7��~)`h���r�T��?�I���*�H��h5�v �-�n�U��>q�i���oi7�
�<5��\��P���e0|ɩuf<�zsow�
s��'&��B�?���X�]���Y�ڙZ0+�뀓EhL?�T���U��"�%AQt�a���{x§��&뻰�It`�]��R�J�4]ƔME�yҡ$:�X1�~:�8�#���e�QG]�v�>p�8rhf��WT�������T��!f����/��ǜ��.��/�{�q��ް0��Y;�Z�}�@c��0�[��������6�𩲑zeؙ�f��1���[�ļ�x��VAԈ��C��$�@
����r��@:���J���,�Kk�f�BK[��]�)�h���֐�2n�
l�,�R���iZU�O��<տ�=56�3����:�Ϣ�<8�+���a:KI�P�%�̗?����'�O���yb֌2�f˜���a�bh�y���/���D�:}�~���,D�3QH��7�e����ͨS�!�]�?v?7��lܵ��enj�=߲@]���=�3w�v�뒧���]�����.�9���H���[�r�ܬ�'�pmL����Z(.:2�x	�_�~nh���,.��U�>��Z����5zyzcV	ZL��']�9�-dKĬ'&89�Zes�$A�BM�8��G���>
o�U�� �=#��1�߯q2�	_�Q�kJ��O�;�E�N(?IC#��?�¤�#��D�.j�4^�xLcaˀ���,I�I�#/F��T%���&n�<3u����R�KgW�Z��P[��ȡ\
4gN��1���!�ՏXi�^�_Y���ős:i�xBPפ�]z�.Ex[W�ց��ko4s�����M@���
f���6��_��{��w��[��#%��p�$\7~�+�&�2��s���\q�z#$, �5�(�Q��Q��$��P9[�E�_�X�ʰ�j�|e��}Y�WTA0Z���b�znȈ�����.��^Ӱ��W���*��3r�*m$���������x�7K�Su��]܋�����5Ekb@�O�Y�V���
\a���)Y&�q'�5�2����*���Cn�?�|�8�������䋁<,��G�����ʭ��f1�s��*�x�ض��J�*��/5�(�w3��5I_2.xXd�/6s/Kхx�\�=~��,�����M�V��%}�u�	7B��Ε^M���ͱ��Ax�E����+�7�¢���X"�*B�2Bd���
ϋl� �j���+��C{Kt�����7<��@����zN�ǻ#cC�ǃQY
%R���s.�9�78�k�����xF��c�z(���x���Q���p��	���LW�^��LRa9�����@��'�F�օ]I�	���}T�[hhՑ����x��(U2��
d�{C�Zi=��®Dœ�>@{;H��)�Xw:�ψ|��3/���Y��_�7�����LJn�k3���5	�5�ЈK�r�Y���_��C�&	~"[R���wJ�	�����)�_1���J��Z٪���p ?���G���ĉ�jƩ���8$�����5?8��2_6��T��]�7�R5�ڭil���Z��v笍>ڡw<<�ƭ�/��I׌��l2T#�m�'޸������O�z�d��#.��bw�˝Į*��`gQ<jw�����t�i�IB�p�C���kN��Z�K'�
��Cٛ
'|}@i
SL:0�{ÌS������HU�f��N�6`)d7T`�)S�ѫV���NxNRƱdA����S� �n�h�W�P,�O�2C�c'�
�1�s�c߿~�Ġ������t'����{�"�_x�z�˛��0'�K8
��/l�9�R�O*PnȪ
.�?!���&C�a���L'^���F��/~@�.F��;�_C��*孊�?$���l��s����P��|�p�ߩ[�9���c��j� t~z��o����d<4~��"��fC��ؿ�P��tdZ�Tp3
ћt����s*�Oӝ��ڣ�/��k��}�0n7�*��~iy-ev$/@'\ʌ�fD�K�Ps�V��Îe�4�,<���j)!p֦5����]�U&�2\�P�#a��g腃x�1a�!�=w�YI�1�(M�	Z3����!_u��D�x��	$����`�Ǐ[�%KVlh�h3�FQ;?9��њ4��)���CL���a�;�F������x��,BGJ�ɸ��Yc@�����q����P�t
ȝr�����?M({�]�+=))��כk�cwg�Sy\+��(�\zO�5�(�p�Y;)�̫��j1��ꢀI���$�ͥ+��քz�Ѷ(߬5j[R��,��Ø�6�b�3���ƑWK׵�A_#���g�M�D��s��vČU�N�LW^*DXR��N�?g��ަ���rҞ�~ރq=L�wC,s
�lh�پ���y���3]�^>�	��� �%f���02�r!�?AY�o��_�{pX3�R��4�NV�	~��`����;��QT�2Z,���.��͝��ڛn��ع�5	����:���@wxڏwM�5��卦��U~,���Ԛq2D��b>�6K��[�K�#x$�'�t�Jg@R���C�r���E�"��>�n@���n��-���Q��N4~"�FXY�c=nH0$;��xX̻�V	��=� �8�R+���3�	qb
k�BF��s�oX�޻�κ�Nq��q��ϝ�p�K#qC�>'������Վ]��O���%ͼ�;�C�
*m#�]��Mۍ��jL�|DH��ĕ��(Xץ=2l2��j�K�D�s9|:p�̓H]2����|CԆ��t"{mDK�ZZ�f�x��}R�6��9Ed��גL�{ڝ�*
�ۗ�����$��Ϸ��i7f����ӕ�&���F��Ƌ5V6�W�ќ��|s�~u��<dzɴ]�J)"y���Y1ɡ�@3��~ic�:NEׯoP	PnVE�c�$��5$X_� <���D���W��Y�׮ Z��U��/����7F�M�sv���U_�wR��M��ؼ���D�3���ʤ��s����<�����,���k�봑�}k��ބ�
��R���O��4�� #��S�}�G�a��(�N�B
q�
�@Ԗ?��i›i�)8�+��c�myA
����JhFܠ5�Lf�?���NoL���|���2�nIz�o�6��ßy�ےtJ��zC���Е�;����5�A0
.�5.�(�M�?t�#r&�qz�<�Kp��M��uc �&�m��0
(�m�W�S�T�������+��rg����-Gpݮ�%�p���k��Ju���/�A��dA%��
@��x�����f^. ��m��Y���r�ŝ�I>@�0��;��Ƣ��8��К'�ш���b��Ţ�/f�[���j�:�Ӧv�ۈ�Y��I�"w�J8ٰ�s���S
���=>���g�ɠ�$SgL����������hEq=�T1� ��J��t��gf}s6�kPų�`gL�D��Fl��zJ��с�z�r�;w��4��]�ji�RD(�R�Xٹ��@�"y��`F��Q���bN�w^\��@e({k�gr��|K�*
D��w��#�4�D�p[�(2_��1M�b�)��V��鉹��P[��jC�:(�^�묾ɸ+9~ ��b���[R��mqnPҨ���;?	��۷DD�Տ+a��-�,7Nj���c�Lc����C�G���v�4�Fp�mc_�<�;�?��RUL�x�=��pdd��8�i�ݔ��S+bG�"�Bq!a��HΆ�bđ���h�S?����h���)'�1ӊq�בзHlGp��F-��p��p�ɚ�"�RףK\��:�)�,W�<��Kgf
m~'�p<$��I�$k�"��t���7�sL~�8��7o5�)�ɳ(,��Xf�"���^\��$�e�r��b{}�FtÛ���o�(`�H_AD���W�L�������LV����5q���3�@�>�f�]�-K�瓑��"KɎ^)��~�E_YC�P�9%ԲҁR���e��,$yCߊꮮ1���A�ԈH��
3�!y���!�ػ2z�C'O]����uv%��"��x��:-広2�0(m\t��v���*U�.���W��kn�7[����x��6A�3Ġ*»�
��u���c��:�V�R�C���h��\��dX˩�^��5=P�<�J�–���F�2������#I)�0}?�4	J�����'���l'�*(͵���-�8W�qK�s����8qRN�O�K$����F[��ѲEF�����@���$Q��ZD�;��+V@܄1���jB�
���J�[�Sd�$Hg	O{��ĴY�eOh�Oڴʶ�M[�$]N[���y͵�ڄT%�<t@�w�e-O�#�8#oj��Yڝ�ͬ��Us��k�#�4�ic����Ns�a�l�n��?9�D�c�)|fL��D
�9�L[y3n4n���S�;Ft^a(��h�n[pӒ��^k�y�M�`�M��'b��>�_��9���.��_a�sS.��U��^O^?e�Fm���S��bR���G����<��bG!�hf���.(>�L�3QCa�.Jå+[x����ܿ��Pz���2�l��
�_���:؛t���8jۄŤ��N����:9�����R�0���b��[�G�t�NR~䃲#C��e�k����t�
k��9e�lr�Œ9?��b2r��v�z_��sٸlV�����;r;L)&͙�
k>o��X�Q�C=�g�	�j�tO3�ԙ��_��L�	��iX�͊�{im��E���%"Z�bL�F�C���`��1�BOL^"��f�F����Re� �E��������T���6�^C��nb6�^M�<ڍ�E�a�BL?��t����Āڀ����cR��dZ�?��H�f�ar�a8���d�dܥ�B��ƒ�,a��'�'M�5*�w���8���ޙL�E�95�A"��M�2
�گ�"K8��qˌ�pݗ��/�я��iޯ�ա	�a)�v{�*ª}��p�5unDH�t�Z�UD*4 ���.�
��H.�ѕ���nHk��-T�&è�<���1�0\P��}��%Ԧe��m�D��}�7�vT`��[�C�4��7�{�kc!�l���]�-�����μ�+=4d�y>�Un����{�r~�Ï��$�{-�b�Կ4+)�0È!1�g<g;�R��xp��>fʑD>xؘ��	���O�0n.�`�&�h�(n�bWʸ�bs
c~�USoT),��-������
�(���x�R��^��0�E%r��nJ�k�,�`<D�Q�m#ז��3w���f��|��/)������G�k������~��荠��ḋ�g8��
���Z�2�ȏ��X����>���a|��Xy/|�%|���]��l���`��q��(Oqa���\Rn�k�ݲ>��6��œ�n%�iD�oa�����C�3w(!Rޱ���ہ؃�����C���^��q�c�P�o��1�N�\�:����ڱ�+3�?n��>y��]�[���N��*o�vk[���7u�[��j�W����=��`k�Uqd'0)���j{���gn����%O�]<ǡ���u��(/Yk�et�uX{�_3�o�-�߭E����=r*#�P�YX��K�@��liy�_b��V���ʁ_�h俪%��@�oQ9@K�,Qr~~>V����6��v3u"X�
�/[� O�(�M�:�>F`C�Li~I�G0�jЉ�נ���wa�c]�$�,a����[Z;Ik@�18�z���ۜ\�߃�P������U��;'e-�Է���X1|2�jL�'���0�za�שӈ��ׁ�Ȃ�, ��X��e�|�i���%�9ۘ~����ӈ��5�����R�_4�ه��\��f��$�vh�#����MM"k���/~D�6F@�Q�e�V���i��gq,W���M�����i£>�P.Nf��S�Gc�T�/�yqv_���M;"�f�����c�W�����3�6_���1���n�%�F���m{]c�Äџ����n*�>�7��F5e"��TRhJ��$0H|v�5��(�.�S�eN��d(U� ��sݽ�tx"c@��_���3�������}��t�O��Ǝ�5�����<R"���֠���8�Τ�j�ɏ�'��)���òiW�}�
X�L���ՠ��@���B��ŭ�`%bɐ�L++��kۼ���
"����9���m������_��PcA(���G�czl<V��#�I���&o�0��9׌"?�Y��aDO�ZwR�����O������T����|��xH��U�5\`�6����2����7���</#�K�]��qx�g��s�ќN��PQ���Z��8�B1쥺8��z��ՏX�֐x�^=fV�R�ќ�7�3�����'�d��O�D���(�H0�'��˜��3(��_G�]��X
���Gf�|�D�]�KN�9����,t`��B��ž����ȕ���S��J��*ڟ
cR�k����ZAJ���\�+��XY�r�폤��lO_��f�,ʊ7z�헦V7m��"����a_�7ڤ�!L�?!�.��27��!lEJx��0��zYE�T
C_��R$lT��}�M���x���B�w�\��e�Sf���ڔzެzc��g��<M�ἳĨ,>I~�Q"�6K��ojK֑���6�U���=����f9����E�dgK�=R��ߓѢWj��������)~j�in.�h&
���
�DT��_�n
���C��Lũ9�3�
�:b�1;��$��#�6�3��N��g=u����GT�@C��I�^�;��R�T�P�M:Q?(��MGl�Re�y�:����2�tm�:j|�C��G�5��VS�Q[�$կ�y!Hqj���t�KI�i��yG"+���0�?t�a���;O܃`Ey��,ld���Id~�/�P�43��wȕ���wt�<A�gc�l�#�{��
e��ͼ(�h�M%�����^��]:8ֈ��v$�/�+	�oI�SG�mqPAney�\�$�A��%�w�F"d!�3���*�q���Ⱦ	��`��g�Z�t���g,ߠ�)K�x��J긄c�g.59�V���@��ё*p��&@0�I�	��?�OCw�A�g��\����ZCҵ��q�}�/#a6��1Z���/7b��a�C+�q��֌�Jm0��6y��e�%[�ydf�ty�R���+��:1��q�Ǹ��ʎ��<�`�����F{Ud��
��x�	��3L+3�zM�
����[����5���"�X�.�H�����'���e�����ݝ��'��x����g42��l8���m��N�����3���4�;�CqMꊸ��y��
���`��s�'NХc�w:n
J%Ti'�h#��#� c���/kN�V^�|��.���
!s?��V����#.Y�x��:ct��4���Z��O�������^�H\�n��Gc����7Uu�?�����J����G�>q8_E�Q���
$?�=�{x�+>C�4z����l����ڝ�
�����Ѩ�u�:?��?q�ܾ3������Yt���;
����sr���dpY�%�B�/����OX��MF��B&�V�%��f�:c����uwܹ�����#�go�>p:'�SƯn׃�/���!�,�%j~/�;s�.���k@̈́�d�4�|�4^@�����e��	ԅ
�e�檘��hRxG���/�c$�P<���$=M�
A8���a̘F�;��Z�"߅���� Al��������ݼ(�?|�+[�=��^S��i&C��K��۫�N�@#�m�a�+<��(�O]X��#�^X8��K�hA@��5����OiW��9q‭n�yEd�=F��u#Ưsp���g���H��Qt=�)�%<H�!�2Mw�m����ۖ칬V7S���S�e������<����G8y���$�=3k�鱠*3���+&Yr<� ֫��-YM� �Q�A:8�I.��~CsD�t��-d��]�>���RҖ$�tJ�>lΙ��|n��|B
Б<�V�v��<�D���e�������۹�������f��5>7���b�}��2��E'=@Xd[Ș��d��
p����{/�z�r�ta���ߺ��~��z�%[&�U�^�b���sI*dz��`�H�Y�˩��W,�
�o�y03��>IF] AT(0ne�i�u=��E����*|5U ����0��T�-Qm5,6~(i�G�r��DsJ�_/�=닣KEΩ�Ճ�2��
AbZ�!��#h��h46񧐨d��5���$橼�q����4��ಯx�ɖ��V��0Q�'O�E��ּ�O��բm�m*���SI�P.�G��%
G#�٘��R�	A$3tA������+�^��m��ҩ��\ό/��fCV�z�-���l�UJ�=��Yd�����m6��i���ZM�&�{3:2� �6�i��a�}�"�n�#uC�os�g:ۛt����C�D`t�Ͷ_ûӗN��Ԥ�Sek�|l���
��@"e4�!��	,�%�VS��w���`
�lC��UR�\�X���B��kF	�-(�q�8�=�<��"���f�aʺ�o8�ɊU��S�n*_�ԅ&�^%��Eb5r�Wr7�M �W��*�cSZ��jW��۵s+�ؔ�6�(+1ӂ�@z���*_�q$�q
`",O)e/IsE���j^ݚ������STE^����Jx`y �[&���]��
��$����i��c��+\9�!�Wo`��;��ƶ� ;X�Śa��e����DS�-cX����{o:X�^WE��*Db�� ��[�D8\�-��@q���	9�!YCH�Jn�qr�d[�Ƭp���!l:��+�d7r�j����"�ei�0��$�u������d�yA���c+��$�%
pǣ"�q��]���΅Z$tD�zp<�G��T`�ÿo	���9�1*X�'�`�p������̥]$g	��QQT��qB��������4���(�Ϙ�*�@.B^�Nu�n��-��Y�Y�@���G@p � ��X���c�@��:��nyPD=9vk�ͫ��럲��eV�/��R{`^����)O���덆�&j�曰�՚��w�)ƞ�m�>��_��m^WՈr=<���xxi�x���s1�/ū�oaS�(�谹��Ep���kd�ί��r��#�r3�F��1�\�]���	KW�ȁ,}���0�!�kK+�ºV��Ю�
��NB�v ߐ�v����[8?���ac�mD�h�Y#���Ȅ��+x�(�-oK[�F��)��f$h.�(t�v2��C��0�0��/P�fu�����/���?l��Nr�-H�m�"g�șY��B=�!ݨT���ܽd��S|�
�&7lo��֯Q��y�L6�u���\/��+$4g��x�H���Ch@RJ����}��΀����@u�	��b+���ZK�Ny���ղe�ZC}�$L�cyϫ� �d�ly�O2@��p������)?�{/��E��A mL[��QG�xHOr����>N>L9�d�堧�6�)�0s�ޖH&��� �E��+ެ�Z�	�[�흽YS�n���
�w�ו���-<Sz�Q�sb#s�
3\�B�'tw��҇B�8�Z��Eb*���'�Qr�l������G��؋x�*����N��o��- ug��W�}֓�IC�\!^m��B�?3�^�Pv����l|�~�?;~��ߟ�������	��њN&']y?ʹ���P�F:<�������H���ʫ:�K�ٻ<�g��/�9�U�RmZ�<����V^�?��䩒�U`PV�i���:��&��#\�L�ɸ<��r<>=9�ɯGǧ'G�}\��]^x&���d�)?"�QV�CEs�<�GE�IJ9�Z�Us�7��F
BG��\r%d�A��(�)|�.\����-mY��`/v�W����̎@M{�\��zu��������|�Oż0(!�� k�I&;$N�&�fs���F~��yc,\=Kz�T���?�|w��;�<n=��m�v��}������t���O��vŃ�;?=~�z�l��O�ݽ���=��ݽ���{?=��{�������O�
�r�8�r�X1�]F�mOy#�{�ӵF=!_W_���٬��r��
>����1	x%�?�e�V'ώDR�s�Q	3F����1܈i(2m����e�l��зy��+���'Ɯ��wG�(� *�gFB�=N�����L40ƞ�)��Jl�U؝�3Qk�H霴�&�`��k�^��֧��Xs^�B�\oe|�E���!R�9�s�Q]S���Ed�>������@��*�V�u��bn(f�E�˫����Ha�jW;�4�%r�7B�'ؔ���r`F����S�o��$x��j�PT��@&l��H�R�C�؜W����6��[�*fy��0�d� �Y6.�ŅV��8����R�_6ԝ���؂�։]$GrP���C�1o7?�E|U���Ngf��Z[��~�Ά}���ꟿ�
VF���ri�ʨ���8х�s�ra�a���
����?���C-���pKJCl�_7�n�H���;�<��f�陊�{�E�X*�d�3��8�Q�U���*��@9�K�x�^�����A��GSeՖ�EXq\Ď|"�hF>e�w��X]����i��p6E1j��l=?�T��ic3?;�:R	��	���^D�&��*�/B4���؉d8'�h/�����u^%.�}��Ӓ?F�"c,)m�7W��MEQRL����^kJ�H�-Lކ͂�g��׷��b��s�RFW�i<W���~*�������<i�)�D�o}�C[^.Ӡ�}SX��J�m�;�H8��m��ʇPjZ���݊��vœד�V�����37���KA�\"�w�y�/�&��B'H�A�
�{�p��$����"�o�fp�Z�)�p��H͙(�J��UpF`�}�#H��e����D�������[����qy2��L
�,�/MI���
�4�aOXk zq�>W֊����tUV��W����T;�H���~�$2W�{�,��q�Bќpi_����?5A��J�ll|����E�&�㞱N�z�`縦�l��ƆCr�)Xv�������N�!g�)=K�N�L�>J��:x�#Ϙ����N�_���)��H����(���K|lW�H����Y�-`��|��@P�(�l��hή���n�{
���,��������1�0�M�'�T6�&.7R�g�'�>��ڒ�&��=�$}�<,qj6���[�F�-��'�m��y�f�������ޯ�B���їhcq����{�o���-������_�D�(��x�"�����7r���
JTА6�P��]*�g���V��IWM^1^�T�x�H�@H$y���Su��P�]�[k���t�+�2
.�f��!��ӭ9�&��΀��=��,�	�P
R_�	�^��t�����͖�1.�]Z���� ��z�F'��E�W�Z��թR�[���#ȟ�MG�w�g��ұ)B���-`U��AO���dT�:�L����\7ȣ��ڤ_�Ф�HU{�گUq�#=?��D�c�:5d�p�Q�����o'�>c�CL�&�(�=\����Y}9��w��[�ٯQ�G�1NT�*k�1:W��pr3�N�@f�� #��6�`�-/=�3<]6ڜ����D���G�ճi�*��G��H+Mw#��>�V��6t��[�ֱ3�W"�ok�/&�C�x6���م�}��d��[��������*
�ɾ�ÇΥB�l�l�DK�C?H-8Q�����>�%[0M\i��d�#󄰣'ڈ�Be��/��Y��E%u�a��$��Y��g������~������qp��9����t�6�����m��?m?h���_�sc�_gkhbm>U�?� )Y�Cܓ���9EZdԹ�Hx�[��G�
�Wlː��1Mf�(<fLa��N4�Ԍ��¥/��<N������;�e�W#��Pף�v�^�/0P�ϯ�ل��^M��GZ�QPb]R�[@��t&�y�����n�Um����X]�,���
��֠=�=��4_�!;����M���n30Lj
��6�z��P�"ƥK8���~�����3�-ꕩ?k�䣭�QRa"<���e�;��]klPa��>��b�RO���:�C��\v����rSh�cG�߼y��ɟ^�y�|9�M|��꩞Р��9P���G��O�g�M���b����Z��%+X�9�?9;�[+��Hv?\.]�<>�/��_��Nh�t��M'�x��eۃ�^w���s��Z��g��`� �����2����8�Y|��=�*w��{o��߼���E��JӒ��ܩ�q��z�ar���*_d�����0X�(��O�5J��V�y�^|z���
�Te���$ğz0�:�>�>x,�&��4�|z=I�/%,2Wv�{�c+� ��ry�5#@�jL�Ի]��Ͽ�Rz	/%���H��]~����Zt��/=^G����'G�kSP����W�0�Kz����if썐���)�pp��$w|��*�=�/��� �#��I�t������i�=������W�FS�4��h�_��m��f�C���u��v�KL7Y#�`6~}`���W��J�Je�,���
��/2�1�6D�l���������K��6W��Fq�{���m�y�&w)��\�K�eٯУ����|=g��{,���Dpi�/�m�X$٠��_���u[�l�V�޲�� Ph��5�t
�!.=eϲ$�(5|����p���)�
��|5n߮or
u���U�n�Q���,>I�φ��l�����*�^��RI�]t;���~EP��n��:���`�+�]��	IC��Yo��(��N>���y�j3�˿��p9)��
�|�����	�����E�unD�FMj�o�.#�n6��_��yQ|�rH�%�<��WФș�i&������&������B�	�@��W��5Jƣ�����߽wy�/��ݻ��?��w���~s�����ԕ�k����y�v�`�%��W�pmMp��;-�u��L�
J�^60]������^8���W�\C�K'�m\_���zp�7��W�\{���m�6�[�����u��7��W����hX���x��(��骭��v����S����� �׊*^�h���k���	��:=���~�L��
!��.��t��a����ʻe��[]�,,d����ouIT���U��3�%%��>�R�����V'鸼�f��L����,g��Y��N�A��Y2ԥ=	�z�Kϰ��v;�1�b,,��~>���e�NG�Zy�m�$W]���:����>�������A�o���5>��v�Ch�iH�(֏G��Si�G�Ǵ�s/� ʢ�-�7����GS*�
�4��"�Y��D�d�_u�^di^2�B]0��K�Lou�a���~������~1�
��Y���mQk��&�_$>N#\Ba��&�'�Z�\�a`_f�}�Z�W�@ȁ�R$V^�n
S�"�f*P��!����8�r��_���{�܀�߹�s���>7Y��Vmc�/׽@���|��5>��娇���&ʎ�<'gj��Q���"r�R�B��2�!T�G]��4I>^�<0mI66���ںo8�d<&q@��=#7����5mAz�0�]��4헴e�L�i<M���1mAN�0S�4�J����8�}������8�7oc�/��پ{��7��>��?.�F�}}�:6j�CD9N���_f#�L�ORh�I6&�HU2餯W�‚:(2���N�i^<�'g88��e�7��Y�Yb�RV�ރ@�@�?y��l�&�i���*�Q՛L�]�7��]k><K.�|x؄ͫ�"o���|t���<�x�ج6[Mp
G'�P���$�D��U ;�x�w�$�\�u�-y��En�+�ܢ�z\񺅝2\���uvo7�v��D�r�Wy5m���f����I(Ԅ�`���	+�a���1��(�����ܿ[�`��7��>�?�5�7>d���ȃ=��T�3�;��:l��YB�\E�W_�J��2��:��#�ןu <�lZ{%�k����]�MӔΜeT
=�k<�X�,�:sl{�G$k��h~@;�wnȉ��K�[�t�`�m��}�����Qֳ?���a���8�X�KG�!{
�.�p'ۇJ�W�!���"������"��dO�ޚ�Y���5o�R���G��ޞӣxˑ{s)��<b8�H{N?pIJ���Y�04
&��� T��嶗���맯�B����(�y&m4�ٓ� ���:gk�8�bJb�5�F��) $�c�H�g�����Dz�f[Re��l,�B�gh��h��r1b����	S��c�ށ,?��s
B_Jù��Թ����9�
4P|KR�5�AEs�T�M���:�Ƈ��{����w~e�#�Q�t�/��k�)c�O��c�3Ize�����9��2
�/8v�b�+H���o�<p�8[�4O�ēc;��r�t��A�+H�naUUt�n�AR�����Y��b*/���a��\ԋ��Q�V��8a���W�!M���	�����y0?����!�C������oocV�	b#�&�%f��;�G�R�K�0��C���ج�W
��%�M�H����ܞ�U,�6�_]R>���k�hܮ�l�^nc�*��ۍ��I�U�o�m�U��X�=o'��~�sP!� h�Ekc���}�B��� ��&&	;|��V,7Ha��+�dq��V��W=������b��8��u��.���!�ԭ�)_Յy2u-�%���3vM�R0@�9yA�c�0�����U
��g*�@�
�FW��,%��$.���&��aZGL�.���9�*B=+ħ�}�ٜӵd7Do�e��b�m��	�L�1�_@�X�u��ݪ~
�	�$���4Kg'��J��zQ%�T��	,�͓��-N�r�x�%L���qn�o��ttp���у(�y��x���Q�b��9)"E��,46;M�����I!���A�@�a�mWu�j�M/�5�T��u��a��ze ��*�Z�fMwj^8!�p��W��&�h��Q�����+�U���%�G����2;�1���D�s
%�E}��@trk�r���Yr��t�Ʌ.!�u v�y�Y��Q?��7�ۼ�s��n��J�Z���U�g���f��x{�_��Y�wCZ_�Ǜ@�4UTxƯ�^b��,�/0S���_��#5��!B���Rڕ)$KKgS}�5��H�3�N�&�C׋�����qŻ�����漹--jx�˳�k�;a������7���I�a:(J*_�L���6�2S��`�/N��tGɢ�R�H榎�07�P�]�:<��J�uT��b 	U	`3hH���!��|7�k[:�+���IK!Ә����dz	W�L�$>�1�F�I1R)�-p�E2-��J%A#��DR�~F��I)�6��@�g#��̍6�I�n9
�U.��v�}A��#�ba�y�*�,.��*lq��PZ��p+�HўM�8x�pJ!�w��E�2�8����c�����-�_�_��;M���i&ɸ_D���� μ@�+�����u�Uk�c ,(��<-<z�����]0Ǥ�3����'݈��\�CT[�T��G��D����������,��D�\�“L�T6?es�����{���cu����"#�Ј8V��g�H��s\��0e���)�=�T����;�m��(���Ҿ�y���:�D�x�����
Zz/X痎��PmGUC���\WV,��T�H�џ�~~��꼳��\4c�����l׿�*�oY�%�w:�?����߲d�V;��
�v��W���9\���To�hB�j���𻅻+�n�'4�M�_�|�?��_7ׁZ�$��O��$��OD�}��7�D�/�P�$[�/���*���7��_�y�鷉ܧ����|���r��~��dO>P��^0�n)Y0��;kgOⱛ����D�����;8��|��A�y_�C��F-9��!:�a�s���晁C���Fa�N���X�u�i[\x8�DɄʸ�����,��Q�v��}gY��*��R��t��(즀&5L�HBU�ɵ�&F�ߨ�&��6�lB��3�8�$�-��'�;�IT���P�nRb�M����:"�*6���ay
�%W�"��om�쀭g��Ʋ�̦��U���g�n�~m���է���O"Z�:����չlBnh'�Z1]!��;�KT�Ip��5�fh��E�-D|��%��u�Vj�{�`�s���B��s��݉4"�c���`�$��q�6���2J;N4��N/SZ��v�@���*k0��!�`�;�_~���;~!����7��n��E!w�y(�;�tx�Y3EH�.ı�j���g��?t�>���;���������{h}z���৥[*%��G_��6�%v2̚��:�s�#˥퐢���(���bQ*Š���~��2��Iv��޹�]��B�	��ԎXJ��@zU��q<N됧����O�/��<��9M�a!��q����P�4%�����T�
�/?y��n
�+'P������r�K8�A ��X�Vh�'*a�^�C�EpE�H]W����[��`e��@$QN�v��yS@�U��O���N����B '�6�G���s��c�W�
A����pˣ.&�)���u�LoSG[nj;w��Dl8-�4�Q"$Ff��@gV�P�e	dEo�;nd��t$&��i��L!���kQh:�y�(Q+�s��R�-��ısG�&�(�J0���h�l5$���ڏ�y�|}�0�:���8�EA+gm@�ƒ�����X��\�_��C%:�<ɕ����HLGtlTa����1~TR]��r�_���kA�dmE=	^�vԳ�*���#g����"絛��H�DZ�X ���c�BK�ܖL��9�vȂ�(�C<���.V�Y�^iy�
���������~��gz���__�y+����+aM(�AuS�v=��[���
����nuj��j�$͂���t�r�9+�dq�jM_���`9������ߋ�5nV�\0�K�v-va�f׫o+�p,W�8�70?�ׅ��.?���!�5�/Y��@n��E�bZ�	T�Jg�̀����&覲*����u��Wh�;�X�1�����%�D�q��;��m�$Yҩ��"`U!�T\�X0�Q2=M���黡��ī�o��b��>֪�*	k9�\'}�����}�@�Y9��+�f�b[�H�8�A.���N���Jg����ߢ�0��L�TC8��7ITD ��L�>oƳ�<L���t�rcp.%����ic���-��~��f�[n2�ּ�f��K
��β!3p���Q�U��Q������z�7��S;��8q{̎���<g��/��,B(�����P�>�*�)<�rM��.���X.��uW��T�)����`�^W�D�/����>l���퉫��j��Ӑ,��z�mz�{��*
���HE�5hZ��u��.;�ܰ,��	,7�uz>�
t��,'��\�4.��u탵1��\4&<0Y�s-)�pُ���}<����p��س�q��Oc��������w<�/��p��J;=����.$���c�����,��R4�g,�ڽ��M��h�A}:}����>c�Jr0J�@0㬫)!�;�hݡ��f���+�*:����T��o]|@����i��u����vI&5����u�0�ђ�Y:#	�y�җ/<��u?�"��\f?^����+�=�<�g�#u���l<V/�1Ⱦ��S!���`�!{��a��gc���P�{�N�n��/�~��#���#��`&���t�v	�j~�V�oݪy@��O�Uz�[�'�]@�0r[�&�	�	��,�Pm��4���h�W(v_� J�R��ޛx�8Y��-n�ΐ@���*T����D�2$�
���*A�6�����C{c>W�"���;J�)ԙ'Ne��0U���ڂ�x���2�8Tؿ\�YC������D�$�t:���f�D��5��@k�� �gI��ポ�k��V
a{#�Տms ڍ��ud+4&�/�ǚHUϨ��k˹�m=L�{�kD�$Oy����k�d���k����4�"��&�y#4�܂у	x ʉ�$JG���ig@�kL:�C�t�цQ��֐H�c�B�JS�6�Q��2h��/��AݜM�h��l<��/s�'�kCX�["�ȋ�쪤l�4��h��h4��ɽ�"ʇ��Ρ
���Ѫ�=�R:^
�*FsSXRA��i��ՁP�z�A*E�Y�-n�!����w&z}1����tүpM�e�q�%�$#-��~��U������p�t�Nˊ�
�L����ѭ��>����꺀/��Ξ����Oz����Wo?�_�䏷{�/kS�º5w�1������?���������?l.?�1��鑾w?��E	���K�n�%Po���P
��`t��]�\�.�9A�i$|H3n����%;.����^.j��S�v�ƥ�;���rW�
D-�YX���%m�U���w��Iy*@V�w?�z�/q8�zJ�#0��Z�xx��U������_��gSq
��F�V��0"̅x6n-�O�	�
���3�{��9���ᶯ+�P� v8FY�]�܆�{�!a��׾Ӛ�ۺuhI���8��0���Wob[A�' T��)�q&����+,�b�@�m�~z� �X���<�~�@.Q�4Hٷ���~D!�Hl&~��Q[�y	���L�%.����\��,H.Sy1ʿ�XNk:i�c��/kv���Cғ�������O-�r�;ӽ�L�W*�3?�z�������ئ5��hGrk�����p�r���,��|���l5�Hy3r��v��A\���䲾�rK�f�z�ҽ�{�T"����-�,�)�Fq~2���Xt�5���+z)������.�Q�X�xL�4e�g��6 C	�h�-e`�"�:ኝ$P~hð��P<���QBs%� �c���(��O��T"��P�p5�7��>@E:�$1M����/��U2�zS$�J�cz������&Ύ�H�U��X8��$9�b�C7�5���z���@>��Ʉ�o����Pl��h��'f��yѧ$�3�,b���2_Ό/�;_ӗ%�l8�&*�i�w�y
w�Z��+�ȑc�W�3nL�b�JX��T���@]�q�'+�Aލ�!s6���: ��%��p*��B�����V����Y�gO{Á���b C@��X���;�Y�_e�t͞,��I
6��V��<�����m�	FB����J�� �2RZ* о�a����b ��pp�H���4;��ZܰƓ�_P^�|��T�V���FS�
E�7��r�)������*]J�+��Ke�
�w��7��-��&y�綱�{w��������_��[���&0v�� �8@�.Y[��;ʅSރ��8��D�=j�G ۀ&���3�\�n�*��ѐ5�-�O��6˭~�Cͺ5�v���=ח���o�<�7�AH�:E����w��QW]Fi��q !�j�&���gP���DK�z�s�ֽ^0h�A�^h�~�q@a��P�zK� >mc��j)kPZ>pS_Oʯ%\�@��P1h�z�v�~�~��6����7��I(���P�Й���*����I<�Ԫ(�]�-�zC���%F���x�a-�ͣI�A}K�{�Q�W�&(ڼI�k������|�;����|f�?��/9��
�m��p�iڎ��*7�>�bs�]��&�ۉ���ϞR�:$�j�y]�շ�0>g�&I6�����&%�6�������CVLm-�=�xAd�
�J�
���8Lp�0��-�;�Q>�5���'�n�}��t"_p�v�����.���*�֙{��Q�������F��0�W��ِO~��q�K��{`U0�E����`V��n��m�
�D���"fu��6,m߾��YN��M�[	�DF�
�e���/$�(����#�U�aJՕ��\N�aڗt�V�����9�5&�)���W�7�OŐ��{������S�##k#&��,?��1��Y�x�NX�AI�b"�I��	�� :r}�j���]U_=�z��e$39�N��^���^=��(
�ٽ��F(_c����M�Y����3ׁ>��DN�|�H^kX`�t~�E����Vs�@�F�cV�,Э�/ҟ���ڹ�6ȑxS�hI!
����a�v"@rx���B+��
bF
�N'�RpT�-������:.������^��_~i�'�i���Ư6�8�>��ڮ���s�ٚ�4#�W����>�Ork�lV��@����g ��b|�aM<����dTaKZ(<il�ܹ�T����z�
k��;FrÕ�%�kX+{��f��g�X]�8>~���9����߱Ad;��.�K^#�)%����.��q}����&xW2LT
��qoM�<%���'�*�����y�C9:0XL=���-.��}]W�ʢ͍���9�d+�&�)���u{��
����^���b8�"���b�
���$S����0J��7(y�NcgQ��i���0���~���꯬���1�p����֖�s�[;K�~��u��'��'���
 k��մ�.��X�M�]*�\�ʽcJMn�p0����S��6�Te���{"��p���@�O
���\`/� �w��LB9��2���� �
�_��F!{���Ow�剃V��U+�
X�>�	d�����;�!�G��UE�D֫""���#k^��u`��V �ٮB��@���E8*�߲�V��ԗ�bs.6��^`�
|	“��Ό��4�����5q�+ϵ�O4��#�Y��s�s�l�Zn���ʹV��K�+�6X7��|�8���%TP��j1��۷;�����Zj�u�(��"stæҶ�H�`O�8���^s[���Q+�%^��y��'lw��{,�1����@�/E>L/@2��!�`�v�ɖy�חd�,'J��QA-C�?���c� �&}�\^���rBLT�n++� ��"�Ԍ��ԊD܉�Lo�f#�#9�hw�
��H�bM��\W4~�>Ӵ��p�Pt��6�7�D�V���)S/7T�}d�c�Xw"TD�X�$׿��
&o��.�ĭW�����4۸sc^�%`�*(�Pj��t6�Vì�{��������:^'��-�P
�����Y5�N8�����oe������-��J»�d�s�9r�0ݢ���JD35��.��_�!I�ni,�"i|I�%inШ�e�DJ=ȹy��zuw�Ч"�f.���l#%�k���i��t8%�2B�
�/�.TD���v+s����^v��y;"<��đ,�rܖ�X�0�Ss�Z?�k�I{8 �@h��f��[���-��g���0��1Z٢�g��/y}�%ϊ��q����)0@�:�1ȉ�w4���Uh:�K*sm��,�B�+L���tɗ]�)1��?��D��0T�&��B	�@<��K���f��������a倕��(=c	t����b~���^�k�U�:Qh`�Z�Ⱥ�X"��"��*����
P�+6���A��[saC�P�l6ƛI?�W�t��JŃ"d��"�pա�TȋL���?�A�>�*D�—f :K�C�`V �Q�w���&���Ncv�:�o�7�����L���� j]�6�$�c�ꌮ^[��d8;�#��u~�a��)���
&�4bpdBI�A��4�Bc;*n&r��:�!��&%U�f�"Y�\�_Y��	�T,�nMl&qF��:��B
��.�}���=���\e���K���ոE�K�k�[��]��mW:�׫G�֦X�tVIo69�:İ��h�����H�C#�ꝎҾ��b�/��(
s�9�O�"de�L�JK�c�~�7��.D
<��mB]� �^=g�Zh>9,�3��|T!,ņn�0]U�Ji�sC��4����Fn�w���
ya�o��H/�R?��U�",Y]��ʮu�?o��r����w6�"k��6�G]��g^߱���`Q���~���a���B����tP�O5���)	��;]��͵@��vŨ5d���G����6�KZk���E�*�*�K_b�P��ҚQ/H5�6��L��U�t���-��X�:W�,��δ�N�&������b`S���(�C)�
9Ѭ[^��MC>��dH�84:���������x��'%�����V�%��C�STP�7W��N-=��8��*z�A�͂�z��5��W�ȼ1���~���
x�o�p�҂�xG��Q��zR5���ەEy�q~Z�!�P�-�Hl�<��W2j����H�
ڨ}��+��+=й��zF����W�>L?�?:�攄�p��}�h�V�_ ��Xona$�-!���7�]s����m����c������WϾܹ�!�� ⁘��q*pc$S�w�݊1/��¸\F�,�l�	�kS�ޝH��D+�8������ڣQ�[B��X���#�n(Y�g�
4����2�6`%��0q%2�ڙ��FC	�1��&ɀ�]8��y�O +!���X�K��u���>������Q��a`0�
�k9�F�Jn%��ƱG#q5�7�6M�"��q�R�y�?��#��˥^�H�!��55:$P
V���p\M��`��!�_5A߷�e:3�Ӡ��@H8\Yu��e.	�X7��XG�h��0���d5s�AB�
 ]`�Y%��$�L�ef�`q�K⎔���2��e���2����Wr$���e�l��m,��۾��zP�۹{��W�,��,3��F�4�<ڂU�G�%W�����I1�$!>��	D$��i�G�O�=˒ |��f�I:~6�,�6�0���|1�>���L{̓�^]�;�=�-�L�S��=��ګ�Ӝ�<��C��nU��qv1�
�����!!Q����3�.oL��2����`��&�`6~}``�Ȁ�^��ى6�����/^̫V�)�91/.��8c?�΢&�DЄ�Ǜ��/���I�Kڿ���l�Byy(�����:�����ݠ�t"eE�U[UNp�)y_�%F$[�hx��W/O0�I�@o��(�.q��?;�n��ן��`3�ܵ�R�PܯϠ��u7��I��}
�ߖ[��5�MtƬ��d"o���0�1芅 07ڱ��(�8f�\��'	Hg�&���yߎhj���i�Aii�o��
G�L�������k�
H���޵r�%ӈ��̂M��JgX������D�&7�׼�,V]Wׄ���.�n pu�|2�ǂf��JK���pcʀ؝w�ZV�f�A�\G�vh����GF�aZ��qKI+k�Q2胊���(������t�A���Z{g?C4E��7��i}��U��!�HN�Z��y���&K���r0c!���Zv��*�C��'⎎0�dm�4�5�D��*
�����>���$��pK������\�9�Ĵ /9���$=kki�A��d 1�ܽ㴟��'rIz�ռ����v����v�8tC����o���Y�av����Ѓ��?�������ޗ��r�o��?���(�iK���ݻ~������o��W��M9ݫ
@^'`2�J�5���-LX�:�M�϶ʕ܎�C�5�-	�f{|~�zx�m���_���Gۻ�hc�oݿ�*��}����O�,0+����
�Ȍ��1��$��ه�/�x"j���f'
��Ńq�U< ���'�R���k:���� ����"Β�X�<��?S��'��9Ȭ-�-Q�}��֙�i��܋���Q��D0*c��ݦ��Q͗�{��	�Pe�o��-�B&I3JC>uq<*��rCs̨�)�R�`�r3u�U�'.�@��t�f���5��Tўn4�fSWk���Ƈ1�M@\U&����{���؋���b���2[���ar~�6�����V���
� ��ti�Q:M��S��ZF��xV:ԭ��w<[��-���˃��_�u~��/�O��w��zX@�U�PS��p��{P��A�@������K~=�6����u��HVV�Et���1W���hjMY#|2_���f��}��=����~P<��;�����YD�Q��JE�����p��7M��
%��N�h
���F��](�Z����t(
��f����'~��%e#�.Mbz��Q[�c�?��F�a�O>��%���E��{����� �_������)��~���&(8��PiLb�ώ('"dN:O�So8�T��C6����!��$�s@ԁ������U��ux*1�h2݂[T�eT�����!w(:$*It�O�K��Ф�B�^1�X��n�[ȹ���Fݐ����cP����B�-��M5��F�8b���
&TU���X'�ŵn�f�OR�Z�V�Q'Sv/��A��K�,�D��0̦���=��:W�\���Iyo�*�x�z�8�zҍ�����`��Tl3oFeT��AA=���؃w�{��b��⦃�Bj�����ANI5�D�|p�5�Ӓnd��I����?D���f�I�-�-��UM�e�� ����ϲ&�ȅ��g�O��0���E��H��A&MY
�}HTې��UF�:��Kߴ6-����v�bn��>EO����hS(��-5�
��/0�|}�<-��X�|����a2
�z]�
w��N��9��<-���V�2XP�q.��D��l�]������x���&�v;χ�#|�`�.���r�cޡL�}[Zpq��|���u�U:��;�/�e��A=�
3����*��SV\�p
�T�E��v��`��\Ʋ4���,�@l|���!�;ɽ�����b�GH���J�hS�M����A����!n��DP؟T���*2	ڑ�N�.��N�0x����l���4�0�	�!W0$�	@C�2�=�/O�b�n�y����'�`�Ѩ�����|��b�L%Z����Zc�b�Z��N�M~�;Ma��8s�����{	u1�fȧ� �v�J�����$����<���?K�ֽ����o��Y`��)�a�4���Z�b&@���3�����,�6#�p�O��,�\�<97+��I��W%�Zg=���;QL�9��#�0F��@/3^O^��n��y��.�R�u掍f�WSּ��Z�6�!߂(�<2qՈ�\�WP�:�7��llVk�Z��p�*2�RU]�
����`wڨ��'/���[HD�R/b�5���4*�u@_�:-fz��W����b��c��XfP�]���׈��ԗ��P�[g�vSU�4wn8	M�#���+��{���7=+_Y�Yem��V\+���ؽ��M�Ն9Q�~^�)�|����ܷO���Gb�3�Xv�߻��Z�A�/2�%�o��/[����
�����qb�PE��
D!<H��\ECc�J���0�h��
����?I�*�G��8]��zx��,�aF��
��;XB54�G��S�÷���nc涿˻���ŏ'�����Y
!2%W8I�!��]��b�������X^��
ӏ��*&(�7��dZ�*N���[e/,�.��M�|2�ФA@�g�a1Ib�$ItR2j{�Z^�:=��%"��	Q��^`sE����>\�%TG$G�p�0��F����d���������A��_>�f��5>�����?�;���WW&_������t0JT���%":�{���e�O���tI�ݮf��eÃE���)���G
�ZE�̪��g"&�>������r�;�0c�X����q<N�CG$��!lU�!��^}���q��i<��������O��#Q��jԿ��X7>5� �)\<@�_����ѽ9P3qk���`����,��Rq��|m�����g㵵��
�8�Eo�7Ϝ����0��U�7aP�3S��1j�:M}��bc���!_X�ંØS4Y�;)&|��
�@�h7�.�ÒL��,tG���ǀrGчQ��K%�`)=�c��cۑ��j�Ѡ�N����}��'������o��h�7ET)�ԇ�Su��}r���l�9;�(�K�O|��B�ԗ�NjmoG��\�Q*��|��%�.:~��l�X��(�" A�H,�7L�R,����R�c�Cr��o��%��(GU	����&��q���tEPX���UL7I�\�j�`� �T��\MC��TkV�#g�b^X������4vR4I��I��.��Z˫b&��T�SzA3B�}t O9��;
O�Fcb��;-�v�*��S�	�)s?��%u�LV�䉰�y��:�m�PGo��&����4�'�>-��YX��-�Һh�R��uk����ᘾd������r��i��l�(c����4�P�=Zȅ[��L{�}�4���Qm:"�D����$�{���FA��iWɘ��1@7�⸰8���=m4����	D�ė|��s���}ȡ���f(��`8�x8�8L�<�tG����Ŝ��
nz>��Yt�.��Ԟ��5�pp�Ժ�G������
�
�h�*ڄ%�Yq���Y��.K.��}y)�w��V-,�L�jY;�!�c�i�8�I�Œ�Or5e�o:����q��+t��Gǣ-�@�BÛ+��ThXT�Z����9�!�+Ǐ+�{����æ�ӄ1)���χ�PKz�5�H���6y��ɟ��͞q:ٌ670��5w�Ƞ�G���_;)���!�ݾ�2����M!y}�Ň�ڪ\%)|�B�8ZIՍ�~�]���d&M�܄��8�^���O݃��쭭��r��
%��{����{�l�ھ��o��y��ޫ�	�Ȋ?�a	��r��z�ؼ]��O���~���Լ���M�l*|*#K�d����ΰ%]}�ӽ��O��;s$�@1���4�geE̽��M.���AY�aA՚N�3��T&��L;\�\,�f{E�X��O�:�<�Ip���A2��f��F��W�w�^���4��f׾S����s���c��lBY�$\t�[�m���nG�;��<
�U���p�v6?��S�>��Jlc��
��%�,��I+{G�-��Jc_J�;>8k���b/�2
P6�@!����Ѿ�c�_��Q�Qx5U�K
a�O����&t e�r�|����_��;��읦J���Ӈ�z�^���6^
����&w��#���$~��{��_�:����f��6OD9pg�г\�Iδ��@u~�q���@���!�� ���Phl�F
��K.��q���i3M�M[��5FN�
�;?���k.�^Iz��+<S��{'�'m�X>IꯇF�Dꓳ�мnh� ���i.���4��sn��9�K���a꠹(�yJ����k1�Ir����mMD�i�$�A�ע��*O��f�c�?�fV�������N�8��Ĝ�bQ���i�r��<m�Ր��c5h��DG`�ne]�vs�e<h�Dq�hSa�c͢�9����U
�Ր�x
C��=2�ׁ���c�2�*�m�I�ޟM�*	��ٙ$����g'�����q����uv��2�x\FagYRӲG�e��]2��Z�7kg�Ĭ$�a�S�z��`o��v璝
�k�e{���YV,�!B���޹�Mf�7*?L�su�nԩ���ֽ#[:���Qg|ux|[�J�׭�7�v�^��H��G&@F駿;E}��.�t�7f��Yf\���U!k�x��H~�Zxrvb4���Ĭ=�j`���<j�N\�`U�uE�^?\�"?d��R���p"�T(����&S�_�HK1?���&��x�륳1X�[t$SY5iTE�ү����p��f�qz1���Ir.�A�er�ꠥEō�����X��/�rX�	�4��o���0���آx}P��3��혷���%T��-a"˯8#��Y��:*�q)�C„���@����7�����Tw��a�mo��ȧ�B��ʮ��k�q����/c[LR��JyTk��m�y�>�U�&�|�k9��R�&
ʻ�P��`E�V����!ݩ�{agD��s���1	���T%N��d|��� �bg��S��fs�)��k�W]�&�_h��ܽHh��;�̈́���(*��L�Fl��]��f5U�n�o�zK����s��>�	�\��tu��Q��~��p]�%!e���z��rN�!Z<��lW"��:,�#`H�[�v
'��
#�5�ʹq+P�C�ZmL����L�{���7b��a:>I2B<
U�ݘk|*��饈�,��p�ȹi�r�E+�R���)΋5�����T+�)���}��8�|��y��'%�bA�6�!
m��hB��N0��V�����u�g���nVyI-��r�
2م�(9g��G�b�� x��u�	qI�Iz�����{�%������h�A"`�暼΂+�L���.
8�ɿ�?;��)+13��D�(n����sbvH���D*�lyG�q,X<3K�����U�����1!��4�Mf��x�O��ċ�G��F���V�
�&�ı�g��O	� .�g9�:X�(�����_�����
̛ދ{���n�
�$���[>�Kh�A��`��0�݄�?d��5�6�N�]�X�����A֖����n�ecA�n��p��
����<KD]EED`@�bE+��3l�p��ӗ{�Q_�x�d���P$��%EHN�ל��^�ڼWn��k���u6+L+{|����լ���%�`W֍��hU�=��T��AQ�PR�2�X�]�鼼��-���j	�5k�K���sk���v�
3#-�(�"L�m���j��5��(ஆ$p�\a[�N����l������\���R���C�Ҽ>��~s��$o��@�4Y�u=m��al��� T�o��W;�V�W��2Q+��5��W��&-�+v��+�쁖�-<�.��:�.�@��)R�
�7U���1?mvQ�)Qr��xb*��A�n���[����O�˵��nU�dV�<y��r�F�k[;5FT.	©\��ė�/u�G��t0�c�l	����b
3�Ao-��\���04	^�����į��u�)�<���ത�Ø�ۦ��FC�P22���8\d7U۔�v
���ô&7$*��dF�j.|�
	��q�k}�v?��0	:�-�-D�;by��H7p&o�ar�qDb=>��3H#6�L��'^��q���B�8���P�r�3P��b��K;NN�����U���!:CA���U�A��{�z�E�����q�b����yɠb�R,�3�l�u�
Q]B���?T�Ѿ��@�ug���K�C�s|'[�T�M�C��lj����׷�I��b�5z=�/е��9_�i�-ّ�'�s۸ V�<�QN�z29��-�>��#$y�I(B�L�I�YP�]��F�Q~#���N�m���G�=��'��F!懖��l�W@�[f
� &MR`Y?����)+�b��-b�Kj��,����n�y�5Ui8&9Ժ`�3@؈�tk!q����QȂ��1IXuW��P�@���ؘ�(y�09&ip>��b2�p�"��5)�PtlNT�o��xؾ#�5�t�:g!͕����`{�+ZXjO��b�ڌ��QA�9�B\��֭[����IaY�ƓD��] �b
�_AP�V�g@H�y�d,4����	�B71�p�K�ۉl�zvB/���V�&�nlV��ϡ�a�d�J����ؔQ�.4(�Ϲ�R��+���}��]j��A�V�;�bUD��Y�Lt��8duFH��u(N�L�8�'�MAM�~U��(�)�"6 ��.��c��D�4�#���C&�P�����Q0P�6�K���SyM�)����]�O��/]V���Е�^�L[��S�w!�)V
EJ/	6�x=B�R�
��
s����
��p(�CY��wA�Z_���������p�f
-;Z�`�i<t�L��3�`Ӿ�]4�v
��Q�Q�����Y�j�u6ָ�4�Q�%���ЙZ���SWu��m��ߡ���+����fS�ǫ�P�(t�PF�K8�W|�;4|�!�a؈��l�<�-T9�,3;K�B�������d2=;�|��[v���Y�5/'����a�#W�W7�6�}(Q����f��VқB��>t3��/�2�X���j*��IO! ��!ڈ�}c�	����k�y7Iق�g�y�VZ�#��,�/D"@��c�����.V�ͣ%��u�l��eԄ#g�EP�?2d�G�OZ�Cx��U[T��2��B��q�뾳M��!�5��K:�閐x�
�!��	w
́��Ž,�s��y������s��(���+7��#���gn��4���q�32M#�*�ײַ%�I�~tY?���
��BtК*KC��~�֜�:�l��h
��O��swߕٜs�B0�)Y��������_Ҋ�t�ԧp��1��yL�7�и�K�0��5���9�=ӌ'��������S�d���l��h�s�t`���pr͇�QS�Y�j�o51�p.5���5��S;JS��\k�
�棛��g]�;����7.t�~¥���ī�N"aCϩ�6XC]��=��LC��^W:D���'Й�ؙ	��C�>y�r��BDY���ņ�l�}��Rc�(����w2��S-[X�^V�^ZM9��!�KjVy�C�+Rؘ�U[+�ݠ�`��\�D>����K��b�nL�������❩�k�~4��_6a �����.Z�@����+� _�RDV��?6�c���m�P��b�y�ɝ��T�}��yXYD��}08��bq]f�]3�pŏ�y��3�E�TE��v���c(F�7G��x��f��	�� Ne�wg�i)���t����d���w���-��0d�����L��@��d|6ԅ�G�&����O�qm
��琫��Ag>:���Z׃�_�U�<d��?{?>{>���Ώ���P'�)Y��OUZ���׺i��R{�V�w8��I>L�1z~f�?f���ZtK
Y��+���4�c��F������S�
�ʑ%�~(?��9�r��U#YTg�Y%�}�d�2��ӊZ�_���s•.�Wr����nHԓ�a6r��h���,��lz��z�b��j�<�詽�Y��	�q���@H��b1�ʢ���7�JM)�k�1��PuB����)ʸ:��Д�0�E]����]��������.���a4��P7�	כ��p���:[��}y+v�l1b,�8�%yg�
�ҦLK�e��9%X�pZ^��$���8Fu�����|���C�!K�����&#�0��T�i��?�(,��n�$v�J�I�,D��n����/��G�_�x���uĮ��~�"�q`�
E�`��(���u��-���*-o֌.�j���a,Q̇U�!�G��
��~I]��%�U�T���1PE���"�Q��s)��5Ŏ�.��l���{[b���>D~��u��q*��Q��gh��yْI�Hg�~��ɇ�b��
F��!'�=\�M�4��\��C_!qa
#Z|�VDny�;���3�|��*.�������q�&�r�KĖK:mtY��d|U�Ė��,X��&O%�c=�eZQ۳=N.@�+��)��R�cM��b�/Ƈٻ��g���&�����`��Œ�<�����E +1���ɠ�p�kl�Gʺ�X3���K�b�љ��߾|��(���k�#T�h6�>P��3�bY�v��Q`i�}�$�s]�M蹈�O�a)���$��ǜ�@`<
�:�p�/�����5�b�"�T
�qIi�H
T��=~j�Z5 Gɴ(�#�DA'�-"Y)#g/���L*��0�f�%���jG���uPfB6vx�K��9F-�_0�Gm
�ҚS2|��`S�=�������o���U�ƦA�J�\��K����MJ}�u��['�o��>4k.�	vQM��b'W� )��ͣ�����xh����D�9t;�����H���V���R]u�|�;�D{��fo��<�q��A�D���%�l���S>@��M��0���4S#9W��9�g|�U��?��ŮI��6����F������w�8�3O��$���0�R�;�;݁��iқj��g�^o|
�1:�O1�-��'�k�
��OVO�T��.���S䕊?*xW���5�c��j�&x�aY��s��Ե��pw�+�D�ݎ�|�Q?Gy!y�t������o�u��8xM�;�N��W�k�N���iU'�oMe$��`��^;�᧾8w�&F���h�����ɥ��5��2e}9l46��F`s��םƉ	�
(��
#�|&���Rc.��,��l�h��Uk�I�0L+H{���k3�L	BdL��E��F�S��V捨��-?���~�G
�y)�~�_j
:Dh�o��tZY�9��mT%,�`�y��a�b�U�t> J��t��6�t�9i/��@s#O��e��4� Kk��>�PK��	�Iq���>�SP����.d�N��zߋ[(J5���[R<�π�P�8P��ի5��`�m r' ��8�3Bݑ̝�(�W�<g��m�6=#V7�'"��pr-�2Ԋj��#����k�
�S�O���1��D
�� _�m��]m^�W��}\m��ߋ�j˄����oT\
ɒȳ�/I a��&*.��"z�ʐ��-�����k.�0J���W��
4����4*�����1�$)�j���X����Ĭ	��5��n|ܰ��O��[�ܙƯ�<*�U{��aC��A�L�8��*��"9���TF�Z��3���:T�=�0�b����&�j9Ϥ��u���V
f	�J��B���Gg�
�R�%���p�{�s����
Ҟ'(N�1ƧR�v7� �R��Sn�E�&

(˽�1Os
*���fdADP�}�݃e�$��48�
����sN	������5ڗ�=�d!t�C�px;D����a���_��J��
��n������2��� �	ۘ���/��/T���^�����(�'B����
��o��%R(!4�
h�������4�bMܱ�3�q񢾮�u�	Win�����<� ���3}��V��NȒ�=%"�����z$��B�},�e��ӻWO_�u�4����DO\\��`�L�ES��m�*�J@�o����)�l)w�_�5��N�1�SW�h��Ԋ!h	��ө�4Q5����V.����������͒�zW�c�B��ot����&���y�+p:���&���Wvވ
�A�5��E�e2�s�=�s~Z��3�r��{d�S�{r#t7nn�ެ�#jLD���yx��"�o�Lb�R���я�<:0
�ti�Ṇ0zt�8�.�1y�
$�w�n>j̦�fM�S��ʀT�,�'���I��9�H�_r�Ha �`�~��I���\;����V�8Nzj�t�_`�脷�6����LՓ��w��\�����cClJ9]D^4*~�W��5��•o"�X��[C<�����%�?6%� ��^v�"\Ԫ�T�3Q�"Q�B�DTw�5��a�������5�R�&���?.������1��B`���t��k͛��Ks�`��0���כ˹�l�:��wD�[��8���#��Ͱ��{w!o+p�a�V�~Q��K�`�F^��^�����'JN
A��:�%�a�b�y�dgmy�ɾT#`wKx��_.Z`�MVW(A�|���_|Qu_hE�/^�񱷠n��jr�7B���ք��%���ss��*:�<F��7��x�6oEm���v�����'����x��U��w�:�@���]ύ�o������Vt�jB�YQ�<�@ǖ��]���ev����J�]Ykh�kBO��>P�(���/�oP_��TR��)W1R�q!DK�B��y�ЬpΠ�p�[���A�H�\�0{��j$޽�S��6��eDi���d:A��l�|�$=��x�̶kf�>�v*�ٓ)V�9(`�!�YtE[u#*)~�~:��.�,�P��k���Qx��;�XN��q��[�k>�#�"�\j�ed&!A	����qT��44�-� d!����i����ֹR�մ�2�i��_�(�%U������5#J��n
��X|����x2L��!��3hj��'��hA����sA����ߛ�HM�e}����5Sn����`��d�%�l<�#T��Z;~���y�W�n�<;�NA�y�3�Z
�����2^R�yxȑ�	�jJ��
��&.� �R(oOߏ�pUBH�l"ͮjB��K�e6����\9-zdCakJ�oN���M�#|��I_7�kf`�W<m.eqi'��&cn
�4E��x�W�\�x&���j��f&F��{��g�,���O�P[I�;�i=����Ɖ����)ܽ�ș.K�Su�1���j���L�<��
�p�l�i
vV��5�4-���͛&�Ut���朕wzc�m���+$��cS�'�����˷X@l��A�^g�d8;���.Lƪ������o_W�̡hq*Rߥ朷S�$���,/�u�.m�A�����ԋD>ƣ���+��l��V�%��k�:E[j�RH��v?4q��	�֚�&��_C9ݎ��8�{g���
f8`
����u�H.g�H�i'n�Ds*�.E���m�	�?�h�,&u# <�r���3����&nu�� �vM.w?4MZo��.\ݕ�K�y?�B	���g& aEy�u�)��2أ*)�Nc3o��\�|t|�u��Ϩ���w]&+���I�J�(t�H'׳�4��q>$<�y���� ��	�`fR���N�Ȧ��zf'�e�&��Z�n��A�#s�Q�{����s�2_;�8��2��&n�����L�P�A�n��2
��fO�o���N�����iN���^2��XϠ����ң�噊Oc�=�l���L��IW�M�F�������;��&-�n��V���nI���������n��ww�mU��=��w2�C�J���q,�#���Ls#�V���{��L(+��k�KͥKV��iA�7�'����1�!S:���*��t4�2mC0��|�FVf�!��I���F�ښ�4P��e?��x|),�T\?���p�L=�.�6S9�Z��'FBJɊ���}������GYDT����Pjm#��T�3�,>�`�[�p+����/H��4�AdһR��mC�~��Is��m�h�6Z���I��ٜ,o_z�-�q� �u�Yy߂�D�:�oJK��u D$�VE�?:*�����a`J�=�GbƝM�
�mj:���p��@�$��|��ÿ��K����g���d��0���3�.I@*�WQy���![�˵�9d*�9<�w�Fܚ�����Å�N^z�h#��+�y#<�xL�HՎ��SE
�XӸ����u�]Z8�+��?06�v~WD,4�&H����	�� �X�<�������0�AQߑ�V�9G��v}G�{y��߿[��Uz�f��C6	����m'�@��$S�@3���l"y�>Fkw��!�Ǩ���(y=?D��<g���O՛wT���,�J�É {�[����og/���|0g�n��x�cm-n�a���(ͧB��]�H���;,�a���h��~����-9lL!o�g��2��:k�Le�N��-(%61�+�K�laC@)�y���<�x �EI]�����Q�����5r�w."��6��.�r�������F@�;���/keХ��r��G*��إc���j�N��`y���i8,�L�-`٦ѻ���*���T��k��L�[J��_�,�@^}��ef���+�!?���Vc�Fk��N?ys�e����϶�H$������`�?Zw����-���`g��lv�+|f��d�@�.*��?����-�`�C¶{�'d`��L` Ńq�I4��w���8	����f�1jwA@�-�r�+�S+�4�ᘆ�
E^":y��y�W�,>�@O~K��n�o�o};�_�Sr���Y���(��)�,�s
ё�"o�s�(���M��HT��O���O�ڎ�Q��.�$zPd�2��'W�߬Y�W��5�ۿI'���WC��	�����ޞ��j_���8t�e��'�6�*U��Ɣ���u�&dq#a�K;2ج$����O?n~ꧽO�X�#��'a�h(�Ä:&u���?nr�Q��`�Tԕv�N�ӟ6�5oon�a�l.��t�L�JK���>��l�Q@ܧ���yF�'5���ښ��+�x2"hp�#����Ob6���#)~����'  ��6����{����o��+|��_o�i���̕9 ��d49��GyB֏�a?��I�5�@�m"�f ��ө=��C���"�PMd��lg.�a�;���n[�Y��u
�l��,I�;���d�ҋ
���-p4�%���޵F񉤗cwl��l��e<.B�o\��I��l��
���w|�W��Ƽt�gP2�߳��̥S�d:�2%3�)�T�Lɼ:eJ��)S2����>P�8DR*�4���e���/��?2S��
xd���L/�6�)^�m�#3M�ۀGf�x�����
��SE_󢰓��?/�����j�/:����N�v��K
��Z�AaY+����1�P -����ɌL����Qͪ�P������t����u�nKk�,��kQ�
k�tj�`�ʤ�(T5t	��\H�)W���E:�NfSq1��Ve��9*余N/�$pF��|Q۟�)�D]�9tD��e�o[����{$�����Ǖ�kQ ��$)�^"��_���@l��;���}%4	�=R���uD#ɧ}�b�0��vA>L�̖�?�x6:J�s���\.���q��	U�(j�Z��Ο�@���Bt`rYP^Xm�Ɍ9���:��.��C��v�/�3gD>�F�ѧY���~�'��r!�X1�a}*�ڏcn�`R%9+���j�~ٮ��P����*��K�`�{ஃM.������0+�Nj��VFm��b��4�vKh5ݕd
�(�E�ԏA�[|J���c�����~z�a܋/����KiSw��;a�ϫGP�]�4xA}=Va��#�N��Bf^,��@�[{!;��~D@��XB�7="@\,�oV��W�Q���U��P��j���*���d"I͈ܽ��4�0������l>�5Ԭ:[b��WY�X����0��*m��8-�*o��,�*�qQa\S�,Zy���fy(�W��a��%�QZ���J��T��ҕj�9]�<�֕��N�c,b��ݢh\AW;�1]|^.&��y�4���/���&)#)�L�H���C�ԘcJ��HL������� O���XQǜkp�Mxa睎�z�p�yz����`XV1�0O|�0ܚ��)?w�pc�<��O��Ž�Ғ^���P_�ਤN�&�.��R��
""����J�QܿRAÃ�'e.�X���7�~�0n�v�����,�G�V>�u��c�\x9͠3~�i��^l3�]�l"�Y؈��o`��̀��	0�	UE_��m'��%ZE�\�c����|�m��Co�5>�~��'�Q�'l#�	�o�EL��3f8?��R��Gtz��.0��	��?�G֏vd���a�x��_.�$C�����<�Wj��}������"#\�_.�_i�!��g��D��`���;�;������'��Qu#����'��it�j�f���H��K���#}k��&������RI|.L1�xj*g7�K���p�d��F�2���F2�L/��-�d+�̪X�D鳗�x��
u�I)�م(��!Z�-��2���߮-���n;��B?�6�qH�����l��B�x�vv^��=�Vm��������+d�Q���8���O�ՒՊ�x�%�E;YYX�����	p���:p[
o�	\E�/*��%Y~D�!R6��˹�_�����o/�I�&��q�У�P*�z�E��==v���-S% ^d�I�M��t�ooFf�h�L��κ�Z��x��L �,Z��zA�o���I?�7�ēAބi6�#�G��Hb�\� ��|]E�_{q���k�pWe��y��qv1o8ón���W/��G�~��~&6��H|�:��D���t<=ͣ#%W�ㅳ�l��Q{!�33�h����Q޷y�O���� 島Gg�[l��pmָ-��'I6��*�7�<��t��n� �69YQ�!Uq�J��Ѳ�J�`���Mfb>9*�9��8?���g	Z�����/���<b�hkBou�����-{&�N��q��I���R�����3��:�6QOc�,)�P;E��H#���,�/��n���,�Ƨ��M ܽ|Z"5���Ք�7l+Ӫ�'n�Q3k�x��8HL�JP��C�`4����8��,����#���cy{(G���6q��ch�?��_��jQրFz�焽'\SwΎ24��
�lj�]4C�)>GI�/eZ|a���z�C
æ�
�/�P���a?r;֚#{���,�7̦�t�Π�=�X8@*u$��K��J�o��O̝N�dm*������ؘ\(�NӳNt�C\M���,��U�hDs��^N6�e�FWp��i�$��ʋ��a�%N��+�w����n=��6e��g0��v��S?+��ɿQ��?��
�;��;;��?_��W�]�z*�T�F�/_���B�.
E2�/�q��{��R�>���,���g�x2^Zf���XvK#�:$s�9T�}�*��X��L�N�+��u�wUhXC�zo��|b���i�o�5'��%������ݚB�`�08eX�0�f���D��޶�&�!2=e��S��e_��G���0jq0�| yu��	W%����	�M������d��[��M�R,n��m��ҹl2�$�xSb�
ۜ�U���6�|)���^֤���e��
�;�U�^cm�V~>Ry�BB�ۓtri�
��dv���FC��vSi��0��)
K�y���uX<'�eiC!T��0#*�O!7�?�_븫�x�М��j0� \o}���oTOn��I6(�re6a��B/��o��ip�� � �B4W[g��\I�cI(��q��le��y�5�|�|�E�.)���G����
j�M}ܙ3A3��!@���Jןv8�	��}9޳��l��#��h:'�x������̦5)�.fݫkY%�I�9}g�u����]Ӄ)tn����*K��٥F�hሰ,!oI�A�U}e�M:�X^�',�j�$y���Zn��]�'��0��,��}���Y��Ȱ>� ����n�"�ҌOr����o7\{P���9�k��b�s.�5�E+4�/�Ҏ�*��u�H�ɤ���$�Z�>Q-�L���G�5��"�T
NL`�b-]Q-	�3TUJZ^}9M/~07b��Bی��[��#R�9��[+��W>U����)�Λb�i��@F��֛F�uWoqك�Nɷ�u��l��
7Ex�b��g���4؝��B��j}��=��:����d�>��i�F����/���w,�{ȴH�%M�=M�D�B:������55xSO J�)o��S<���'<�I�c�nq�kʪ���j�[~��.[�e�Tpu
;8�N���e�$E�Es�W���:rS��ų�g~}��l6ke�c�i
����"��.�1�]�v(�WkK3u��٥����W%�(?}k�iB�l��)�ǽS�R��09GX����@��ǡ�@`�,�e�R��M��O�*��‰E�0��T�4Z�mJ����a�ԉ�I9����RB�[6>'c|�,B�c��v�4	�n�;A��H�W���ȝ�P	N�x$I�I.jT�&䥠�%
;?��|
�M�'e�[w���ͯ�5�dqM����ɌR�ҍ~e�0Ř�a,k�
B�ː&�Ô}���Lj��Vң�5{
D�/H�`r��W[�ND�_�������$rfQ�7xGP
ʚ#�g@���3�]���2*o��iRogGnӕ&��`�`�����j7�`��0kB�~�� 50b�H�
��k`����5ˋTF
�<��X���	y�ƲaPa�Sۨ��m'�ף0��QH#��3v$���|Y������y5B��6�	c��]=@4$���od��5䮟�d�%�[��w�?{Rt?��N�+H���Ļ<a�*r��5�Тof��PY�y�o�:�"�tս�c�rt��z���?�B�F�}Y[�5�&Ѝy�&N��'�6�	�#���O��]��aA�@:A�Vq��� �&
����5����p���X߰x%��4_[�+��I�7�A�!���f��"c�C=�󆖸�as���T�GR��&O�Tɇ(����w�5_6405�f+�x!¹�`P�ҢZc(K��]�Rʽ\iWF��p&3�m��Fe=[��f€I����eH���+֚R!���V�0� �Ɂʞ�P�rH��H��'�b^a��7t^e�J�|p���*i@xĻb+��u��Z�g}�_�$�%�_-i̡��#��h�Xg�If�C�*�*����J�!��k�[3�k��y)��2B_���mh�0Mfq��:�b��NI�hA��S�y��Ŝԓ��~�O�zcϦZ5��j�9+fmh�\h�y��|�\��-_��є��@1��a���Vpw!H�i\40���F�>��/�*��[�(ǖ.V����R�e��覒[hm�f��M*uk	]����_HZ#(:+��\i����hϠ�����f�o�f"�QΘ���DK4�	A���|4<,�A��5�Kx���ӔU%h��8}�W�=��.��㢢�=,�Yo_?}�Ot�7�X��
��ϖD�#����PM Fu$#�4��7�� �<3�+46rE�2�Mv�:���CT�{�Ad��Yy�	��s���+�s�`��ɟE\X�#v�t7z��[��,�Ln�zhX�%(<�\|�pYKW �c㏶[��	����-�V�_i��� �6��B�f
��7���m��g�ft���<^"�E̙�M�Gk����J)�l��_Hjq�_P��`9J��7�a�#R�L�ы
��i�ܥN�LJi/��,���z�J����<4���>v@[`����
�:c~�l�aB�s��a|��
��`�|����a,]Z�l��_�o�$IΚz�
�j\S�g2���>��?j
n����{�֮����-���,��qF�HxQQ�1d�\Q`�UR�Ӌ$� j3|7���N���eb�����Np�z�����zYA�p3*��Tq��O���i��������?y�2CA���mQ����,C�H�
���։A�~�ُ�i�@�ɷ���:E� t6�
#
T�EL�g����i��k%����l=�P&�>ud��T�P�e%
[�8~��`4*Fh�*Yj�W@��ʢ��/W�M/���u�!p<�&O��ц���S���H�?�p��eW��`����A��iJ��D�RjZ�f��Kv��T�3��,p��ј�U�V]k��' �$=
t���p�}���w��v�o)<��*E��`��UY#�˷T�pX�k�k��K}<�V[�!EC��Xyj�`]Ԋ�NJ���PL���%�Ҷ@���Ӭ6�)�v����Eydp�,C�
��l����S��%�la#kj+����#
�?�:���i$�8|��J⨧٫C��mp�_�W;
���_�yo���W~,��QT�:E��%#���f�
0�H^��02�@T�t�jB<y�����ţ��]�7��'_ؓ��u��1ͣ�U�L�ʷ��R�2�����"��Sm�cU�t�q�7���8`�8_
���Q"[A�hNCSl�;���Y�{����X�:g�������dK�̃��Oޒ�Q_0�
o s>�<?�A,���ݸ�Y
��S��%�d	V ˶���B�kvͮpj���HRܥ��}��h�L^]:�Yb��(�n�h�W�p����w��ɡ��IWrZ6����-ƾn%�¾����7yڄ�ͬ�����/o�ᬄ<Ό�CSz���דּ^멡;/��&�Np��y�J��`�o��x�oLb+�b9A�iy���͈�'�fe(5�5�'Gr�!���	^���'�^����pp$�=��~�DQS>.Qc �E���.wX�H)$#V��r8V���)Do����;ڈ��h��$�G�|v�`qrT�.Po݇���y�W��b���f�++׽}��Ú�u�T�Ty
���%g�k�.�HX���z��m� ����E��p���A<�Qg�=J�^
���-t�:�Џ�A�� �j����D�v�S��T�/�5�S�$聎Q�?�����:հX�P�kG�4�U^��S��~�Y��(ّD�G"�9X�O�77�NJ�|�>�U��3f����&G1�$۩�����2f�#�
��Q����[�J��ꠞ����J��<� {���{W��#J��=��@X�b���5�׻���Z4-8Fv����|��.�R�2��cҖ]
�ò��}�;�}qgqY��Sa���gZ�e	&.�f,�X`��<��L�`�����}�7��$��b��
V���rIPfK��m"j��V�ilv�n�"G���D>�^;�L��$-�q�RCC`�MCE�o�5Z�N!<E�qS"�	�x��4�쒥��G�~R��.m�d�A
��l���P ��	s0�W@)�a
״� >��]��+�5�@��k&��|�����1yT�4�K#��q�;��6���E7���Xo�Z��<\�A���]��a�qu�a�����$��cI��X�'��<O2H��/4�]ER��4�>U��@�9c�X�r��$�
�~%�tnd��yAdmxvYp�=�]�,SRq�woa_b 
�>vБG	6�
����Ç�ѻ�ēHq�9B���]_P����:̈́����XJ��l�ju>�o�9��mF3p�RÙ��3y��x��h���ǃ!ꯧ��ln�X0@��\
�u�2�8D�{Ŕ콲!fy���W����q��p	�x�BjT�Ou�Jɪ�5hm)F�9B�ŧ�6��G�9A8�^<�i�ݓ�P�N]�\n�����&u�L��ot�.y�j������xZ��@�))�,��	��9̅I��f�+gA��g��c�d�~����v6�j]f�AoV,�Le໑�9�	��Dӻ���.J_� ����t�"���6:-׹[1;N�N\���-���#u]P�c즳vv*���Kx�sO*W䫚�A�,��	��%�q|��w�fg<4��Ex6h��p�K�+і$^x�1���w}ےORB�K���t%k���ڳ~��L����[����Gӄ0��B�$~p�S;���W��{��t!mKw�F�
֋���MRA�ö��+ڔɅ�y�
����9:<JD2Ng'����.�����мJGhTL�k����0;��m�s��hK
w��Ur�u)�P���}�41e�B���a(B�w�Y7�`�:(,���_���
��
�_�L�ʅwK
?��4��%�������(��</\�.�XðTw4�]))m�D΄��BrP��
\����}��:Aq��+�3'+G)|D��i�$���["�,_�c#q�g�R�hP���x*�R���z0�5����2�Rj�Z��T$���%���n�!�՝Ύ]��Y�i��:�)
׹�������N;u�SXR���y��N˙7����+DSf�[�o��F�0VZo�4��(��P�a��y�.�a�$\�^�oK���]B,�a?Ju��l'�?��
r�G>^�h�j������6�
��-�g�MA�<���D��E�5�S�~��H�k�H�1��,����@�<rI���H���B�Tr:hk��mRҺ;��փ��p�N�@7[;^/7[J��}�<��N��M� &�f�K�~���Aưe�%��Nao�Ry��	�ِ�p;�ٕ�)�)�.0zUQ�]W'�z�����.�`ቛ�xIM|�
���RL���K
󫟲�m�ӎR��N��<�6�[tg�	���{Vo��
F��}OF�ܱ��D�#���D&h}A���0�Ã1"�U�ZF�dXʺ�U���[I���+n���xC���~K#�K
��v�R]O7�H��������c!J�xM��0�c��q�Q��D��E�H2^9W�pO�)��u�xp���+:)4<H��=5�d�Y��u�����Z&��xŊk߻��~�6h��c�a	��*J�{6�3�U\+<U�@s�px?�_�1RRI�A�+IT�h��J*sWY�ZC~��v��(���*g�ݡ�.82t���Ñӡ[�[�0�r��)|�N�1�c���P�M"23*�oɈC�J-P@����gKd��e�u7t�A�I�bY�S]VŹ4}�<.�+�Kz�ꎸ�0<�i0�/EMA��S���m�ޓ�$ɂ>S�^fc�*( �ߋscxka{��s�&]Cl0�b����:��S�#�����q;}]�jd>y���ի�B�h4�ܘ8�R @�C�6�h���1F�E5[�,��H=ӡ��ڥz���Ef\��j�A"�t6�N �v����/�̊�E"7�sE.��"V�;}���f�+E3%�w뿏���d���n~�hc��wk�u���{o��7���	���=�,��x6:��Ez�0��}����-�ĽS c��
ف�應��r*�"���5
0�Bb��Dߗh:.d�=M؅\6�>@E��:H��6�j��KJ\Ѫ�x�j>����5���H2ԉ�孈��$w���U���M�:^��@E��ՇۍFx�`#��vd��|�G���c��{uȵ��@B��P'T�B�Ω���nh&N�����L̆dPf(��LѶƑDQ����Z�M�T
��9WAuq��]G�Z[+��R��:-͍�_����.mص�����P���s�pr|�5FUn�&���
N��a�ږ�z�!�\��5V�N:��x�^�������SҬ`")!T��0�Mt�������?F��8��'��V������Ǐ0�9/����u��3�h���Z��:8RQ����ߗ�h���E�(� [U}��J�\o ��dU�*�� љƐ��
NN��>M>L��	#&��)���W�Ϛ�5����1���:Py��V#���%�`�u�kC��s3Zfjf\�Q�Ɓ8'�$�1����.���
��-r�ߍh��8����s�ݚ��Y�fIVbX��bB��0(O!6vdR@�Т�,$u�c�Q��q&��*׎Q�>K��x����q<�)��~��H�^��r��0��(����k��R �b�k�:tt��)!�N�~$c���w�S�al��1�]���a.���%e:%ݝQc��cs苗�w���*���w+�q �x��涁?�w��C\lf� ����.�Z�ц
��\5P�,}kU��I
���O>U��������љ�k�I4��*F!).�����h����By��Z�b����J\�PJ��E�^��<��Û�_Ga�����w�`����j\�3I�Md'߾|����&�i���:l��i���C��#PL}�u�J��!�E=?�'�.�)��-��ڌǁ!��p%_�nk�e�/hy�
�O�w�.nI�.�찋�C+E��٢�����+��Xy������J9/��u+٤�ʱ����*-�� 黪��3Ih ���;a���P���N/��p؜�����G�g�>����P͂�E}b��r�'�0��쀩��J��G���c9���g�x�����?��hEo���_k��]_�׺���M��>A��*J�x8���5�U#��R��9��/��+���I�v7?M/�����F�d���w�oG��Ɩ<􏑒�9��8�-�^`6�v� !<���δƱ�R�c.�-�
��O-��j���Z?A�Uܣv�Z�YܔF�`B��C�Ot&!�,�0EEG��y�7z�(�Q��2"�*���?n��^Ra�X(�����c���Z���õ�\5*�C.l��s�����d|n�N�x��ܨ��a{��9���ᵫvB_n��%�o9{�W������W�4�x���Ju�{/�f
m�� ��l���Hù�$e�d�0������N[gP�f�ɩ��Մ/�
�|��� ����,Y���!3 V�B�`�
�(KHgjÜ��v�HPQ��I�A�_�,ˑ�rG*��D\LC	�E����a����Ni�CeԈ�n�s�f�}�*zg���\��)���*�֢�S3�����b�*�m%O[iP�* XR9|e:g��0�]�����VB6m�y&a8V0�,4
��/�
P2L�����ڰ���g��H�U85��5pѵ�3�M�x��m�)'9���;�L����\/o���CyJLptxFʡՆ�7��y�<q�cA#wH�kJlx����9At��Yi�<����h*�^�z�F��"�Rt�m��ъ�iY��[��Xw�a~2B��+�ޣ�gLJ/��g�5��N�w��o�4rrrhKЫ-I��Ք��v
}B-�%�ؒ*��\�ܬ(8�;��Y�%�"�Ѣ�ZU$Z!��3� ��9@�Y�Ik�ɽ��\ny�E"�I��%?����c���S�u��f�B�T�C���)\H阳���@dvnÚ��
�����r`WY'�JdA���#�,(�+��v��X�<�CK����MO,g�
��~�U�V���.6D�	��Q�ij��̣Ʀ��xy%�|��2ds
ch�hxX�r���
\�p��
2�ϣi��oT_q1� oys���g��'~V���.7l��+���w_��}�����HK>����Z�4�p�6����ݿW����~���ς�O<�\y�{ﺱ��b{#_�{q"o���Z�\�_��c��T�G�T�kB�?��<
밲�Ѧ�e��q��Cm�ІĆ��TN� ���2e��B��򔌙t�&�B<:���f�}:�.E|������W�N7lc�������7���>���ۋ���_�z���[�,��*ү���e��Ƙ3:,�r����zq��/7�*��u4NL��ϴ��`�%�Ā<ӎ�����F�L�Mp-'T@���D֜5��T��Db�f���]4Hѹ��\A��Q:NC1\��D`A�g#���J���6���~z���s�[��v��]~KBWt"]Њb�����1Rh\H]d���/��~�s�p��J�bU"gǻQb�ELJ`�J��/ۃ<���m�D���9�u��U���w�펨����ʋ%��� ݸ�������;/a�v����߲��n&�7hN2���i��P\N��yڢ���a�l&Iw+
 (�N��w���aj�
�	1�`Z���Q6 gj��I"�zk^+�U��\^��
/���nzC
��� P3Qqq�@��#�qZǠ��M
wM�|��5d��4_��8�l>�d
/ׄ
�8ֿ�j���C2���zpd@gA�z
a��˽��_u�_�~�Y:a͗I&����r�)p\�N���\�r���0q�}q.�"�	61�XJl4��N��5��^x?��ܤ2�3P��'!��bxs��Qx(H�G��=��m8A��Ll�'�<�j�����g��"��$1�7���E�||��>H�6���Ow����?�v��	ȓO�r�)�|�'C�_v�r
����z�B���'xrη��1\{��R��d%w_.%��㚧�^!�u�Ar7n&0�X-M��\�uT��X�#T8�I�|�K{��R}�z�U��_�3V��F�i}���갯���
�kѯ
, jU#B���e��w摉յljխ�g�o�Փ�������7+�h�<��`0<��zr:u���﯒h�*�16>�"@�� ���K
�B`��
ϭ�u~���	F8�O�̖�fH�f5�pP���i����Z�ؖF�^f�՗vDA_%]��}j�fGO��G��ĺtc3b��	�
`~
�Gx��3ë̯�R�>����A��0\�0B�����@ U>�E+���8��CG�61���棪)�t�_Kx�?೒��g��c���v���پ{��+|��\��E��DӃ��l�hVa���46U�ȱ�5%�GQIrCn~jA�S-T���0��׫�6��]����³�a^�p~UPv����������8+s�O�U!�^'��{�]=��4����$�
Q�Y�e����X@|��BEO�8�g����UQ�ɪ���Rۼ����*���oUF��QBBa2����`ԔC���V]�q=A�Dv��ʐ�4 Fƾ�I<]��G)fC��B'�t,>&Y�惌ƞS���V��ng��!>C�����/�m�i?}vIWX�L�7-?=�Y,���M��%mW�(�PH^��
=�R�:,v��ރ������x�7�L�,�ȓ�B�3F�(L��,���'�y�񠱭z����`�.@�~��:��u{�h�
���QR���-pŀ�=ԇ��)�ߘ��CV�][�|�]M�Nd^�����e:,b�����A�c�2�놩�ݽӉ�-���;I�\��j�/V�9���E%�����j�v%�,Ձ�y��O�}�g�⬬w�zw���
�u�O�_�<��;`���
�e�u�0���1%.�a\$��*0����s]2�����apf<*V�)�?0��I�r������*]�Ӂ6�������
�5EU�04�xWLCi^5
"$Ğ[��/[ 1s$�T�p�e�T)�؜X�(�ϧ�GE�M4H>�v�o77�@�/
+���!�:݂����$؏-K��0�
��`�ɛ
�!Rp�<'e�&�rn���U_��6�l���j�]��>,�q��0�Q�4>q�r��s�n��@�2ǥ�)����t���0�\��K���PĆX<}U
3<��
�LvU�Ms2�;t�I&*,FD��Ѷ��}�&�c�$2�:�G�.ΰf?q�(+E��5g8�u���)S�!JpRs��6�	:�Lj�5�<6�KaOK�޳7�f(u�}��3���S#ޗ�mVi�׵�+�V��(߻�kK?{3XB�T�X�����/`��<����y��JI�s������h(�O>4��ϫ�s��T#�oR�o��g%��
��6��wvw����~�OP���ېJܝ�A�{�;���PqqRԘ�$��r"��nK��ى��c�� R��&蘪o��Qu�B�4M7M�W��aW��'z��廖
_G܈j���v|H�Qu����ý��)�ڱI��6�+���n_��D!S��f�is�1��4���7�*	�*�x6@�>��K��%Ra��	��Z�coV�B_B�Y9ɐ��tZu��'ć���'��V\���M��\G�S��vxq9�)�2�#�!��������+��Є*U��.A�+���`��:3�e3��l,�B���2#�K%��#5W"��4�k�m�a�Wa�T�G����j=X���{@�iK�#�.�YEa�߬2���V3O=y�>�Y���Q�=�ۋ�`���x�o]��u|��J6�zU(۾Ӟ�C||7gH‚��NsQ�Y�f��Ԕ�y勒����o��3vk�T���*�����*/��5�<���?�e��6{<L�b�Z�E��}X�L���C��#r��AGT�kX��7n�����Cr@߀[��މPb�a*����/�!l,��[��l���׏�"4�n� ZTW2D4kD�D�鵼��ϋm�k��k.�B�"c�S�w���(��a�Z,���arvQ�;�m+�xK�S�u��@�k�1|���ڭ%����
��;;K����>N!�2bwಢ˛,eͽ�w����:FR@qSˡ��C����vfs���\���h��-d$�J	��
��A��'���3o_-�	>���Gyczx��os)t�R����e��+�L��Yz+���6�6�f9�P�	��i�]�W^4�R(�Xy�<M�@
4L��0��:��`j��9A��X�U�5���-Б�Jx {���׏��,oPhD]c����{I/|e��1/�C ��l����	�*����E�`�t�@$c\V,�&(ѐ5��Y}h�]�R��C���%��麝�R�F�{�@�x�7HǍp~��"EBgL�6��G���'R�т�0�g�m_cN�o�z�^S���W7_�H�^m�pW(��1f�޶���l4&��ﻆ,�<x;)��pJF��_�ͦ��}.�h�o6$�i}*�X��lX�r�Z�������e�	����!���[�ٿ��t�x���)�/ 6�\����Zu�-��Êח���R�/��+7V������Zc�gE�?$�qK�<�m�
��[��|�O���;h/��^٩�^��Eޒ'/�s!ɜ,�GNF�ĥ;�Rt.I�_��e��=�d��
9'�.
O�}6�]l�b-�n�(ߴҍ�C@lX~2����'��S��+�{�����+���׫W�y.b���x�{�.g�	�`���-�~�0�0O��J�ѹ5;������|7��������W{���0�0��,�w��o4����TU�W�h�h����npBI��ӭ�h�̉}�^�Aa��]E�B[�d'G�����O&�k�*����	�/H�O�C�ѭv诿���4~'�P�
uI��
U����]�㯼���i�ʂ}�<�D�+6@n��d!g�|��U~�~�����5�氅���K@�z7_v�X�n��`3�v�2nE�����/�(u�<Gv�����
��.�
�
�����KmT�9[���8����������M��T��q��⿘�d���ť�$�s��ou�mS_�8Qߵ���\`'������R�9����a��H�}�[�{")�|v$�L�٤\i���ͬh�TNK/�g	\�k��R�F?�
�w\��!�n�+U�O�1��[U��'ɰ�Ս'ь9�#&�X)�J9��f�1�D-l���F_w~�6�w���7={?yV�A�9q�n0l�M��B0-���L4M�?�9&;�z��ܢ��S�ܠ�h�Zw��T>��B"�3����L���@��2���
���U���7,�x$s�r��~��j�ϱ�\*��{�n������_���4�FiK�*�k�ݾ�#o��� ����;��Ƙl\�&�a��L"n��f}�
���U��'�	1�G�!��Fkb��[�$���b�\�e��Z��Z�G̦)��S���fB��8�ΨETE1�����x
~2[�7�k)�����x	���Nc�˙�up)�_���\�M��Xh��~��9��㧃>v���-1W��r�Ad��
��9�<�J�0����iJ�`�9kZŻv�u*�YqF]׸�3U�V�&q2rz��78Hl���Fph�Q�!����R^�v����|�SA�V:Gˇ��r�?��Y\�[I�P:`<i�
7;%7�P^�:3_�c���0y�����hk0�
g���X،8�y#��b�S�g��d�|'�ſ���s�UJ��<��h�Q�:`�EX��'��KEm�"���H��:λyф
�xscjE4�
����7UV�:�/f�S�I(��W`kV���I<��6�������w�7����	��ށ���,�XqKC��ީ�������d$�"��T�+OSO��R
�Q�(	MY�&��i?��Q�}����V�%y��<���/o�J��[Ě0���n\H�c�p�jj�u���S�.�FD�X�����bI����[�*�Q�,��
���yڍU�}�a2�h)PT��*¾Vƚ�nr��g�y�V������B��&���)���x����-�Ѷ�u*ZL��т��i)UQ-P*`#�*gW���.z�^u�•������VF�*�I��j��π�Uq"�QKT%F���������
���������{/%BuI�cO��7�_(�O���/�z*y��q	��wT44'�r��k���WϞ��%!z(�(ҩ7�uP�Waվ�a��>+�Y�|Nh�W������[��Z�o�_��'�Z*r���,砨�%��@zR�qra���;�����K��>#��>Dի����Ta�N8�b��:�ޜF�R�^t8M��r񔽿�4Yz7��z�%g�w�A3Iٓ�'�i5�ذ��'Ώ�w�[`�zkg�o��Kɮj��K�R*=�#�� O�^@�ȅe73J���������䖹YkϪ,nߎy
��$�T
A��
Xt>`�(�,���
Hˮ�N�giTӀdn,)�S���Ў]6���KH2`D��as�Pƫ�}LT
'���X4,�z�I�^(�A쟟`��Y�W��j2אB�/�ȗ�6�7�<P��#_3�H��u���Y�t<�Y5��
�3�thװ5��S��I^Đc|�~��r_N'`���E>�-�M%G�4A.��)/,����NO ��J9�)|���9�F�.�RU���R?\~iDL�
\�ă�><���M'H<C m��VGlF�n���T�0�%���ԎSk#�W9�z�-wcQ����Z
�������_��K���U�x���SC�+�f�
0��qt�+�	�o��O�qz���#�E���bU8.�ig�oԷH�ɣ�w��_�*��
�"�I���
a�#M�6�5�;�O�g)���|�վ�
΍u�N������$�0�%0?��A�M�
s��Z�O�ڙ�^ڪQ[1g���/$�
�ԣ6r��aZ)$o�$PH\�"%Ӡ���\�[���i�,l4@K�M�AzÖ�x)&_��
�,��.��s9�?[��1s�)|�������r%�/9��d;����jɧЖ�Ց�]���b�
���/X��"�7�\x�B<�	��r��+V��I�2����X���mݽ[���&��
���O����l�4�P��a��dS���x�RY8����n�к3;�P0#��}��7������ν�m��$��u9��ї���yM�A�مj��3��,,�՞��Y�x��˟������/�� Œ.� X���hݩ�Ra�]���
�#��4�ۚ�.�G���Y
��g�ֆ�G���3��B�;��H��5}��Tg6���Ñ�	A���'�zc���'�n�c�S�0}*�u1��w���jk�r��9I���W�QE\PLo�M\ɔ�]�*˄��=�z'�G+I�ci��3������=�Y�	���N�^m͙�	��R۠n~)P��]�:��(ps�%&��<�i-��j�M!�T�4M�r�Fo/�_�Y�T��6���aiZtq)�Lo��d�Е�{[��Q�{I�u��M�NBQ��{�l�RL,/��G�IV��d~͐�Vq}������V�2�a��h^�鉶'T=8�4H�HЛ��=�������
3\���f�*����6��%/���ػx��Rx�+ܳh[�F�-�V��
F���
�0�e���]a.!S��}ٞ<{����)�}���O�mM<�ySH\gJ�X�&ܬDV<�i���鯯߼�w9���Fb�Vn���}����lR�t��j�iL�;�WB��Z!�UK��|��9�.�e�,I��E#@�QjV	t0	,SE���%B�ʗ�.�~y1���oM�}����E���`���\�J�]�#7�QL7�s2��s�ݪt)�;T�V�@2�Bu]Mp$~
�{��)��5�=�I%��Üh�����X����.���.Ψͤ�z��{&p]��w�5�]Ad� &~�F�(0\MVn����>���	
6�
0	���I�X.�Q�;�aF����g\��x��c����.K���� ���/<�{(��^޾+�����J1�������\�z�_~��šR��5qp9�����p�������`X�bK�$�2Ƣ�d�,̽�I�\!�4�>�n�O ��\ʷ������
���4gtI09��KϜ�)_�4�㝕��Q��~Br�S�;@��:���*�?���#�PG=dGEӅ`<s�𤧵�H�p\�+F�ʠ���d�j�r�ƒ�B\����Κ��o>k�4���c�����Aod��0��x�Ô���;f�D�ۆ��]����z���**����7���������?�)��~���*���G1�$��:�@_-�%���
�-x�	�I~XYW1��h���r� 4��Naiƶ@DS�e>Kç��`
r�4+�E�(���L�o"���8A��u��d��mX���=ؘju/߃"�~�*(����,��KF|��^�=w����,(��3��[��l�R\H�ż�jHN�hv����:0��4;Q�E�wۻ��@�,����d��V�ɘ�"i܇8v� �'�z�J��f��^�'��{���?�w~��<p��q?���=7�=):�$��eG��I�Hآ�@�7��5e��iP1W�ʰq��l,�$0�b�.�/+�}�€��,��+D���!=-C�(Q�Ҫvc�gA������(�t�T�cG�O� J��ထ��1���(4ؐ���[ r��s.���ͬ�8Z��e�gcঝ�����4=�MhOb$(���:؍m��5t��TWtG�Q��xK�K�_+L�G���B���:A��}t�h�fL����TQ��RU�R�+]y��A��ߍ�Sp��5ꬆ��u�w�;�4��N�Fɇ$E;�{69�T$k�찉YH�|1�<
FPA:�`1�\�"Oz�l05�FTY]T]�V�`ހ=�����^�"x��,	֮�'�Uq��W�+K��gS�k�*�GY���|�u�z�
޴�+�����_�z���P�$���)�2�%��$�19E�k����!�C�m�q,Qz��Y���B��X��:�=�ݒ\�C��6�-�/�I��� 'ϊ��٠���0��'\��R�}�->��}�i@��b�yn�`փ���i�d�(�FFv葚Q^�����&s�ݹ�9NCs�~��'%Bݙ�	n,Q:*ל�ߣQy���!�+_(��q�C�*�A\�!�-Irh*��L��-YT�O{y��5�FY{�M��	w�d�1����e[dq`<����HƋɀj2�q
���B�eԳ��������5�(}��%�)�@7ϓ��e)<4ю[�������^�7�
�ǩ�ü���I�o	�I�ʌ�#$w8ȑ���O)*��F��I՜�+�g.��†��M�|3oR��fm�8��c��fA'2�v�:�j�^JF@2>�y�b�C�@<��<���:N��|)��C1�/%��X
���.�LPs��l��&{E0�4V����֠�nF!�][PV51|)��M�n`�N|��:ڲr!���Vm5�N���Bɽ�P�fo��YI�;M'�Ǜ��8��������'(����Z�ئ`�@�jKC2#�MW)�)z�d�r��b�"Yt��u7fߪ*�*������7���&�i�´R�_y��K^4�Y3��8����ER��ǯN��o��Ԕ���S���㧺���x�Pn�*���;����܆?�K��'��*���t�����9l�Cu�8��u���[^�\rs�~^�.�2��
�����X��s��(��q~舒�.��S)�kԏQ6-Ń�M4
�!��l��8*D &IJ��F�X���-��z�
VT���/��-�κ1*&�����l2��6�69:L�f��dJ��A��$Ӧ����#�M�|*>�P!ށ�@�Bs���d�Q�0�Єq5�>��G��?&����z�y�JkʎA��	�Fԍt��N.%[:V)��o���O�_���N�N��q�f��?�^����"�b�l ���Ńl�>�"���K��_	�>�,�!tq�pSe�>���l����N��H����40��ڤ��k�Y:��B�q/�����&黎��p���#�&�6wK{��7�f�����͎���M̀�l���/�?h��}�O�����X�u��Q�k��H��TŶP����t�$Y�Q���]��Vngm�[h���,��D���g�����G�Cv���x]�bYh0�ƺ�&�:�}PS'�r~k�~�s�|z���]RgM<>O}���`�i�I�x*�:a|��'�C��8�FT@��э/i;H'�̢������%y*��յ�2��*+�Y����n��w���)�&���!`�/@9D6K
q��j�)��v���{������g���_�$o~nK�ݽ�[����\��_~�������C��\���XB�m����鿝�{��?~�O�����.>�#_�/E�,"�=��gt32*n�������6�Pŷ��c�Z%���1a[�ǧ�p"f�1%��J�����O�~�{i?y�eJn���N�@�X�e+��*]C#�_rG�r����M/���V��7��5>�Z�Er!�.���Wic	�o����^k���5>K�`͝�5İ����"��4��m�.߆|oȌN���@ԙ`LG�޲��lPe�Y�h-��S�~�Fh����'��SS�^�̲�D����o�����^~�z�u�����)u�i�AW"^f��BL�l4�CT�����q��di��
)���J�.Ǽ��\i��N�"V~1��m^Ka��yH���`�iF2H%�#�ߚ���u�!#�pp�w�$�\��b��Lp�=݂�;�k��R�4�۾w��{ͻ�ɻ�~�7�+�}�K.���ש�Vlc��U����>�F����_�y8cΕ�e���-e��_�Y0}��,8�ً���y3��
�0;����Ha��1Oȁ���+���������@�(�h�j�z� ���Ǫn`0ۑ�xM��?
���g���XF�ݻW�����u���
���W<����F.�z]�9uc)�!�qt#WX*/������]1٪�C��R=Ʃ�z�k�2 A73�5Ă6����ۢnA[���,O2�ђ��_W�>�Y�i��Ps�³�[
:�-ͣڧ�~�m��M��鬗�3�q������s�z"ӧ�R�T�]�i��	i�Sw�{z�%T�%E`C*R��m�Q��gF� ��g�1^���=5O�|�1�$�Ѓ�1��<xl��4�%�9�(:ZEXo�N˝��� 2��S�83ߣ�h>�K�7�����6�������;�迯�Y��k^��K��N1-��kc}���S��f�nyLn7��(v6���aW�r�2C��J_��C�A��dI�ɕ����by��HɂL�YE5�XN�\��ኔ;��B�2�`�A�@db�}T�{]��?>Q:$�|P���o,�W�]�/�Ѿ}�����(����������w�(���{���
���梀�o�� �^�v5q��*���1��p�G3�E����D�h��bl��=��J'�c1J��?�#��G��6��y2<�!��Z"�t��_I��mO�͌������o��{wwv�����Y��;k�hw_ю�y�{h��=RQ ��
�4��k��#3��b�p�ej2�I���;.�	�W�� 2umm�i�q�^w��ӚV��`5�HO
U]�(a��S�b�Q``�&�Rj�<V薮�!ZZ�:��pF�~r4;!J;���oCc�����K	�(��M��
{���XO~�H���'�3X.��x`���݅�}���`?o�����*��w���[�n6�?o�mX��r�3�ϧ�+���A�z�|:;>bc�b��@��

i�|���p����A��B�F�?--`���X&��w���o��Y���k�_��p)���B�s�h��B�w��q���o�iփ/�fW�Y��g10��~����<-�j�=�"�����*�Nk�H-��q��D.5磇b�G'�0��V:��_~i���l���+V���6N�c�5�;��5p��??M/k�T"u�0���z��������,��L�v�����fG$�l�1S��(���޾�4kY���R�9p9A�ӎSU�
E�:0-U>���I
a�‚�J�Y9,�ة��{�5��B�������=���j@L�$F��{��G'2B/�I<��N�Ua���'n��鰮��2��S�zWr���W����iͿ��_'R0=���=�0���&�JB���S
��E��v��hzj��.�����zcu�H��jcW�[[�(��;���¢��<�C�&y���!KB!�m&�E���6o��)�5P:�8�*�Dܧ`1��pHW�0Lf��]G����Tt�BW*V�;7�,��+x˩c�_[��o���GWK��kq��<��ݻ��_�2�/�y0d����x�9�XY+��4o3�L����k{Xs5�.W�*1u�mz�.�rw�(�ԧmE�-0DSsPO���a�fh�0�C9�f�0b�/�bm�-���bqC�����I��"���2�O��'���>�:���s��b�TV��4d�"��r����@ҁIpX�bA
�0S+Fs��i�.�K��Ò�E�FK	�B.`�An��X<?K�O��+m��0O���&ŁFHb���d��I�Z�ׯ^�M$��p�$"�$HJ��Q�`<�9�e�4�;>�69xH:	D�Q"'4)��@�"9>Nz�[�q�F��O����]y�Wjc�wo���<�f��5>����E��`8#�H����Ҋp<*s�(;��dx)bک��7N^X@xX�_�T3��U�Ve��xZu��Y���NϿ^��?�W;�곔�+����n};�_��k��#f����^�y�_<����5#"r���WZ�Ԯ��.fo)�fX“Nlf{�,�Zf+B`M����YI$F��E��� %�@Jvn��g�<
P͢�L!ȣK�(h��u
�1b61$ �jF/��5w�x���̷�e%�Gֿ1ҹ����^��%�w�A!����o��_���50]�����޶��rE��^�P���O������������˓��X�)1;2l�(I�D%�v8ϓ8�/����`o_lD���*���AM��զ��X�m4h"�9��Gm�l���@e8�K*���u��*Oƕ���f{�k�0��Ƚ��1Κ��h�7H��aSǔ:Q�-n��k��D~@�_`��ٛ��n�!��92�=GfrX?���<G�+����8�Zu]kVg�#7j�_^dp�o� W��t��v��@����m��g�%H _i^+�#��Ϻ[p.�=Q�y���?u�����ر�э�4�Xq@l�v��>3BS�`��X�/΅0�D�m�ʛhyv�b��T�kl7��I����\�nч���R��姺�Mj�P��
�'����F�j�pA�%`���J�E���Ѐ���Tz1f�s�0�J����o:��?p$��9m���J?�?{��D"����.Ɛx1A�ڄ����j�I��Rc"�s��nk%L9	�^l��YL����z��$��7n�t|e�Z��+�n߿�����p�w�T��]�tV2����r��þ�P��%�[(��yV��w���(����I.{�`��<�t�g�AyU*X
a_��Yep<���@��� ��\z�5TQ��+���v��
g���E$�ib-FU�$I��8���@1�'x+���|�P�ج��|�6/9�0�I�fU,&�������4��E����&�H5�Fe4�DG�Jg��x�Ġ��,a��'� ���I
o��*󐚕+�
��|婡�*�uH	�lZP�_����Y��B
g�56�'���áTXZV`]]�o_�y�|_�$��&:c��L"HSH%��|9�-|�9����]M�IMz<��l���Xn���#tl�aF���)�ԇ��kn:��Qd��&�Kӓx���Ո�-���;$�+&���)�3���[�ΰ�9C�����L��(Qca�NG�d�N�;�_�b}���o7�QG�Vb6����U
s�u��$�#M(�)
=$Q
�.ۓ�>��\f��g�^=y����h;�٪hsls�����*�{���#�&V't��_��fo������
0V�+�ȓ�G�wW��-%xt�4[@�\��fe�װ�[���)�������������'u��w��pA�N@k�t������IHiu�3�9`�m.�Q�fg���P8� Y_�714Rt���gJ8|�.�z>�x��xȞ�kP���U�&Ђ�4<ҍ�����2��U��,��$�C�dI�AZᶸd��u,����9���
��5��|�:j�9iN��ѥ�������|1�����l0����Q��m��sv�3��M|��jCՕ�M�&�+�'f��$�

��y
?Cލ����
K<��P&�ް�q+�2�[u�?.�/?z��x� Y�,��Ak-=>�XC��/��q_��M��j���0�\"�]��!�@R��Y2���L�����v�����k���={�������g�_�9�����bzMS�VO�4�냿.�S-�*�s�o,^��۸�9��4�%bM<G�*�A<�:S�w�����ίiЖ��x�2�Q+��Ŧ-�J�-���>���"^ė�\�xt��[�?��֜�j$XS�J[�W����!צ��i�
ݹ�͏����\����hs��y�6&�He�G�^��`�&m���;��	(6����O2�����$�#.!m�8������	�'�Y��J1�"]ߨ���/�R���PU��?��J<ԕ�������o��y0
m�X���|!��7�u�?u�p�6�����?��o���?.����*�6�s"nM<@��4���O���NTq�� `�hp�P�4��'�~�˛�%l�q:
�"ԏ�KW.\�^�'�_t�<�����{�C)�U/
_�Ŏ�C��
���m��7K:x����e�_s����?�^�26J�9�y���dO���-����c
�E]�s������.���>�Kaa�����o7l�I\��I�p�g�����'c��hc�o�?l���������D���c�ʝ�$Z�w��Y����Yu��5+�Q_����ZT����W�V��μ�a����(���t�a�E�X2=��"��$���4(Y���]wZ��R�M��%����
�ǵ��r!�2�
4�[�˘�㻍�O���������������ӆx>i�e/t4���������r�N�K�(�QR�C���b�?9;�m,��ڹǷ�o����
��O���	�h�Lb�o���9��H>L��NL\W�@�^S��G� <
M��7����ׯ�=���a��:Qvy�v�~S�x�t��`���*���e �B^��`$�:�ΏE��w	�k�q6A� �ʛSM�$?[s[
�'Z�̔�E��;[�^�i0�+���.~-��^4���X;
�A���Aa��z�'f]��E���V����xZ)1��]���I�$�L^4АMҿrUdS ٮh�6��ŒJ�B�l��2)53	j��	��j�(��;M��C2e�/E�{�q6iog�%ǃJe��-����V
U�������a�y�d<k��I�P�IX����Fsg��]��9�O����h��x��*�� �%���`A_������E�A�X��n&(%�r���$ww�zj�*��)��F�=ԅ�L�p���(�ㄗ�&�Ǻ��4\A��ZW�F�@��p{+�� 0���xX�[�K��&�����=y�K�fA���.U) �V[L��?�(����O�����xH.�^�t�h�0�ZE#G����G���ͼ;��������d�z �RS�=���6Dy~_{ɳ|a/3�߱��YU@�Uͧa
�\���/Ҩ*<�Q���-ɳd�C���\6�j�wXSu�6u�`��f�Ԕ('�`
"!Jd�cF6��`��@���58vS��Dt�
;o��}��U"��{� �:co:��VM�������Yg!Z�}gs�1{8~7.�d<��i�%A�#jނլ�f���<R����ޞ&Y"Nc�%)$q;��c*�ټ�2=v`V�4ğ�!N�Ԇ�q=�
|�鎶�r=��G�z�)Zͪ�F��0�W��(����WVK��~w�bA	d�4�*?��*OD��H
�N�.��:]ת��v���VM��ey�&*���0 4W�Vj�F#2;^�'� ��t�K]\K-��]��0���;�}x	�FI	H�(�(���h�s����`��gn&E%6�q�="��l0A�I8u�cc��U�Ӂ��qГ�H�[qYY�S���5M��he���#�N�_$Y�^��_^�����ذ�Q���T�#y����{A��s���N	�\��d�a1�Q��_�3���F�U�GYe֒C�஍�l��D֝t7n�AG�	x�>����8�����͏�)����|6JD�f����H��ZM�'�L}�\�5��6�旪�ުq�iƄ�f �*�$�1�7�p��p�����s���6u��L}��F+^)u�E{ݴ���4�ILĬ�}Sӆ���*Y,�������E��gI�ՎލQj��������@�Ԥ_"��k8=݇pN.Y%9H��M]v����^`��

��]�T��D?&���g�-�M7.7�h2�|[:��|��h���
c�y`�m�x�{U�c�5ϑ����P9*�ٕ��׌jAsYhhGn�F�\y�GrĐb�E�SX1�e��W9qL�ﵺ�*(TԄ�/C�Ql^-���l@2Ƙ!^��"B]"e!��3`��`��I�Z�TRU
�U�(�&�wP?M��I���~���W���W?��Ve�b�l>�NԿ�3噡2�B�1yD��X�<���UXvz;�b�K�I���g#��4�.3��B�y��h��>�Ԥ0�+��p0I%�3>N@=+@	�0/���Q̱P�<�9զ�D��\��hg���VQ*t�@�'8V>E%dH��� ج�1�F2�]ց5D!)&�ɽ�N��F�Ś¯���Oӣ�(Dl�!x��/Ի�7����>��ǡ.�+zv��y�YΦ���L�)�ξ��np �q�oY����m5Z����R�iw�Vz(��-<h��k<�i�U3�j[�Y�t�|Ļ�^->^}��Ӻ�F� ��P�Y�%n�F�5�O,���#Wc�.�S��41,��}>������mG�����
RIq�d�P�Ȳ�]��+�IvEC&��")
��߮���g0)�q�8"0�]}W�])�AEvZr9d\�{��GY�e�;���m)�Ql��'��}����e��q2cd�DF��
>���?��g�����*�%ؐԲ�/��P�s�&`��Ӎ'd�o�Ps�`T�-	�;6�z !���u�W��Jy��
�{���">�Q�+��p�	��J�������~]=:��?f���g��b��}t���/�ܔ�K2?H�'�
�4N;�3��Tݫ�Șy�>[V_�g�-i6=��������q%]�'��oM���NF��Nz-�nUpK�����oT<�Q��-2
��K;�4��S�(�Z�� (�:��zI�Pv����8�x��,"�{��0�1XmX��ݘ����+�9�7�(����w��z�����5�Ѭ���T��(EUn3��T�~�_ܒ����e]Џ��,��n��V/�
ב�A���R丢\�ƳiD��w܋��d��!�t�	�=���.�&�I:>�*,x���*�w�Z�m�v��ڭ���g�t���!��i����;�j(	+�aK�8�%<v��a}wA�nK1	�o��'�������T��G�NJ���0�,UV�,�Ƕ��I�h� wڲ���ⱃ8J8X򈈍�:h��u�io�)� ��f|9m<��~���U&�:mIxڒFi5���[���O�h����䅁��N��$6��e��5�/���%��J�c�zs%���<��[W��|���^����������'K>wKb��6Ls�'=h�k
ǣ�7o0_I�"J/y)L�d�<s���:��Z�?���Ϫ�4�ї�����%&�$)9Cy*fڨg�G(����#��;ѥ�"����-qLC��0m4��[P}͸	�F��6����Y{$5�����3�����vS�|���_�U��1U���o��i��Oo��x��O���
�u�k��
J����@s���H&�DM�mъ}�.���p*P5��4r�]φu���{
h	8�C�
(�~3|?�\$�U��_s˥��,_��T�<sm�s#��˗��f�*�|��(�6EҬf��
��m5���k��Q�/��^fi���e��r�����:�9��w8����������
m,��9�ֿ�l��|�O�Cd�
N��F7Qcձ��
��q�{� �ԕqr�b�_G�&�v�O���
֦��E�R�l��(P���]p9m�%/�"=�$������ﯕ�(>��fk�;�����/��8�7�m�y��^3"�xĢ7�AB�-�aml2����//P��P�5~�F�Y	�u�/�i��W�zB9�j��}�$O`�E��t�&�LC�����W�*��-
3D��2	E�Ag`��K
�Y6f��R��!/�юÂtŀ���͛A9��H1o'���I���)h]��b�tX�r$Kkd	�E;>{�}�
��2��c��)��6������Ǻ��xt-��q8q�Ȱ��m9��(j�w�>�o-�����o��:?N�=լ�Ȕ;k����lѴ2�of�7�G�)ȥ(�6��6�l�S��b��1��P�/٦j1���w��9�OM�.�EB�:�;�2�'k�wI�E~�B�U��0�]
�o�
G����K�Tbj��L&o�C�D���w�aA�wS���:C��h\Xr���()�VD#^m�T�E�����#�ƿ��C���6�[H�&��
�c�x==:��j�c��6E�G�M+v��?y
�_�'�5�A�2�����
�!Y+��[��[j��YLc�ĝEe8!w@?-Z~�R:ƓxPPc4�%�fN���j�
`���?��2���%�ģ��}��?��F�)����#��Q��lɤb���L�fSH)�?y��x<`'��_rz��%�p�����2�*�өC��i���:~����E�[D`g�.��P��a�g5wHg@����e��qW�Vd���ή��|'K����q�
c��&[ߵ/�J(ǑQ��kb��G�:4�Y(HD������$sZe��!��9��8��GYm�j��d�^����g6p�9?��`�zP�^4���z��\IO؝æ��@�%�\6
�O������������~|��W��p$1��<�8;a�	S�V6A�h��hT	^�`�hI��c���9A� Ą�6�l&&��Jwg�p��2)y[كŹ�_�t�+�hlPP��[���%�$�^�����ᾯ��=���~��b��PO�\���_`vO�]����������13��|<\+�z))�v���p_X� �<��
�Io���1_p��^�/�ig4�tѪ����
5$
����@.���_֛�ښ�L�>4F��!�J��-��$I��uy�'	_�Dِэ�(RA4���Ӣ	� ���VMN1���H%I'���^h���t�k�=�ە	9�N!i3'#E99Jl���6�g�3�1��QQ�c>����)�r�);�o�h��/�,Hrh<�y�M��[8Mg�\Њ(��.�_��d�<�m��;��!~�J%�ތ��D_�{�.ì�A����Ɔx����f�H�Y�Ϫ��6��z
�91���n�C�Q]�|�gSڃSơd�
\$��@�:hk[�\����=w1��7}IK���u����^~H{��Ж��Z�v��rKAZl�u�[Ke�}���ӟ�>�!��u��T��E}��[�&��vel���
��Yq�2��2
6tr�%��`cO��5C^w��t_+���xo!V1l\�+p�϶��$W��I��t<��Rv���TF��Ɣ�5�D�LUa��!��M�NT��?�	6� r�r+���L��w�	�m���A����8&��Ƅ��m|g:�9�T��U8
V�&���%������ļJU���r�w�'Q�Be�L���X�"�a�J��]�`����#G[��Tk�5��p:�uz�?dE)�Q.΅`Vsc�w�)#�J+�&�ً��:��jzdz��`y�w�AY!?��P	���F7���bdB�\�O���;a8�
!��ެ�pR��)�7�h��47�ns.ϳĩr�߭xDV �i���C�]1睥e.���i,w٬�tPKj����Z�W��'k
'G�6-���x0M�Q������I�B7�� �
"*�dM�5Sk�p����k���B����q7����n�f�C��|"[�b~����X`�‹G����4Y��/�����̊�(�E����
��gi���	��|���`똌�	F@��`�*�5���#ڭ��Ar��z'C��|�\�:��(���6$"���!V�u����z�3�[�J�y	c��IG.Q���כn�s/���-�Y&qv�7��ʔ_lh��p�n�����JK!��o�a<�6�����%�͆�!����E��40��m�Ь���6̠�}�?i��G݇m�G�j`i��Pv[:�c���x�A�y�v�=����a�U�^�+V�ou���ʳ?�g�� ��U������������|J�?�a�7����Ёv[�߂���\�_C��Xp�w��ϭ��}����)a�������LD]��[B��qM|�t�& ҋG�g��AVϏE"F_�Ps�4E��$)
���s�s�UE��'"rB�Fɿ�r�F�R�w��^��t�1���"|��8{�8KPDقj��*���D�9�'W�߶QF��r�	C����?�P4^g1��-]�>Z�����H��ۮp/g��\��i���έk��5��$�^3z�C�_:����F���{ևX2-�<��_�O�{���f��ߋ��N=�DZ����@�_�7Z�|;�Ѻ�•�/@�R�j\n�j���|�N��BF[�X�$,�v-��|
�u��e.�7������Y�-���V\h#n��#���9.���)�V3� �@x�gq/�"��=\�s
DF�v\���)j�����z2�8�ܱ���J���i�E4o=vXs����]�	xc��I��%�?~]�㻧���]/�o����{O�}�O8�/���w{���m�o_�`9��Ɉ#�єҪ�$�bN���(�4�=ǐ��VP���,{�'8B3��|�Y%�oƯm~C���n�deBO���8M�)��@�'�ٔât^��ǫ�-�{C�%0\��U:�#�����]�����ӗ��	���!����A��~���+�;=f�ɥK}���Y��k��1���-s�!�䜺1e�0?���e2{��"<�w[���4/����d��X-_��8�N��`s1�5��F�|�q@�_����n�1�����d��#c���7��'��t�!��'�U���t!�n����)?u�r��&��_�!�CW�
���JfbzI*��2h�����.�Qr���VG���
������E{~ �.W��װ��CKp��%#H�6�z���#)o�n6\�E��dy�!�&�a��
Q��ƨD�+NM�o4wvV��9��ޯdzTba���?EG��Y�<Th�������9������}�6r>C$�l����Qx$R*�%'o�A�ʬ���{�-*Ry4jAA�얠c�k�s���~xOl#=��\+?S�΀�����C�X��|�N�5E�&`����Eo�W{���3��5�
���??�m
9����GS�xpܱ����/.!��b(0���p��X"��z|:��6��0��W1O&��4c��̬J��b�aq�d�l8Q.���De�9Ɂ�-�sp�@�Wf/��(���$F�7[�O���>���}���&O�x���В�5�<9�������V���
�G�%(�-&E#��������v�}�6^OS0��̑�,�@~{d(���\zm�c�H�hz���(�l�)���C��E<�W=���h�aƛ΋��6h�a~��[�F0:��;���<C7���"$Af[7�s<� �C�}�Mm�<s.�����CJ�o7"hI���3�g�_�9�@�T��~�̃����� 
�9�A�y��/��"
i��(�5MP�4H��|ܻ`�4����Vֻ�g֫|�|�|�U>�+�~��^����&��.��뚂�&cR@��*�P0��Ŀ��V�Lf)�A:�//\$�P�|��!��=t{K	��w��k��}>o�є��ۇ�c$�B�����a�양x�n$7�<W�n9�X�Td16�݊%,���	�9�KH�oN]O��qi��D�Y���e��;4䅆���?�0q�o���	,	`
�zzo��g)�2��̓�]_�x��s|����k�E&����>�r����B��$2/0��O�F���P��a۵n�n��p�&I.�|e�3�vۺ6�yuE�>OUm���fq�};?:9�o�?�Y
���}��N��s�Ѻ����i�?l�;������ʁYh�k�b@�f8��/����Y����L��e�X��[{-����s��?�'��ǐ[(b'g�3{�4B����t��*����lfQlt��rxH�����ލ�҂X��@.�;����1�w�?a��/�,��+uDg�$f�de(-<�X��uO�$9�zK	���|�_?�'mxǹZ%�
���9��vs�+�J��
{lN���dʷ{J;Q��w��q��?��)�lc��o׳����d����d���0w�����I�������?���wnzA��
X�%�?��^����� �qx��s|��Ҳ�$�+�m@S�ʠJہ��a{�H�oڶ��O�,U`!�]�����#f{�q

]��4��]�姒ӽ�X�V�vI2x�.�|f�3����D'N�y|O9Z���٥	#9s��jEt|U׳a�‡t��i�cY����u��?l��>ǧ4�:��N)م�vY���u�(C�
�"Cjc	��	��ߟe����?V�K%)�,��>2�m����}��͛���/��G�F�w���"�2b���$v���B�'�-QX����@8������<���%�X$��;�������ņq��6?-�O�C6�27�"k��PP(\�E0�T^�d6eC���ɬ�9},�G�R��B�8{tB���AJ���:��d��p#OhPg6��h��N�5krj���'��gqT/ʝ#f�\>V�Yz��n�j�6@(qN���Q>Cl��8,�g�,���`�6��C�����~�O��ט#He�%�P�&`�>$��s'`F#�Ϳ:q�Ǣ4,o)g�&��W�ֶ�k���d2i�o^~��H'�>|Q1s�G=��be����3(2�'�5J#97#���/u5���O&�G���j����%h�i��A����'�Q�J��*�F�Rң�W(Xc�A!�snrGh�__,=1f�qyyـUS�NR�U/��U��DL�[�*i��w콠.Ҫ����J9	
M�#lu�,��g;3c��q��@�G2��Hy�[~خQ�(�+�S .�=�����)_�W�ʿa�鄓�"��c���;^������'�
b��w��½d�&��o���A�b�^�/�u�Z}��5p�O�c����Q��8'�([���Sn�3��k;dЫ2��
adg�vn@-��2� S�p�n%QuJ�SaS�����2�b!��2-^62�b���I�B��6R��E0H�ok�&������l[+��3�!�w���>;e|(v�v &2�(0L��(�Ȅ��}�W�+m���.l�F�#��`n�o���y�懍�t6�Q�uݮb*����d��7�(p�\^Z�	�\�ϧð�S�^�l~���@2^����nk��m����������E3~�WWpqA�n�#cN���h��"�^��L��hfJ�,�UaCf�P����Fh�Q�ۨ�J�/���;�{���H�K��-ٴ������Q2�����@�
N)��A��x2���d0����K�75�x�O�3NɃR��9z��;���@s��4x
�\ʉM�C�r�,�E��
����,3��
�C�T���	"��O�PuW��ڜ�l��*�;�-S��%(4��,��tO�
VʁB��Jy�f^��K��9��MÃ�ICHO��H&�^-�K��#g���76��=)�;�,M�ɛo�6�MO��{p���|J��b��-�D� �N�|<Ȁm���!;�F^=L 5+SP�GM�;�|e-k�F㬶�ڬ&�Tc���jL�M�_��J��D؞�p6<��sغ��#U��-����v!M�����J(��&J$�a^��.��z+�V������Y�������=h��}�ϒ���w���K��d��g�����]�HO�.�e�(����ʣ|�ʟ�hz���?I��hc�o5=�/���忟�$����]���w
}c4%�5V�vIn{��h��mF�o��bC�6�Dx��*z�wI��]" ��K�(��M~�%�E<���"�����?6���?��S��
s��0w�Ɂ��B��hRq����`M�W=?�Ƃ��B6:�o�f���=pS^�
"6��g	�?�7|���9��������aBa���q�
���
F�!ȷFyA�W�:{�R�A����5�����8kaH�B`w迶���+��?<�=�;�/�[��w��s?������
g ����v}��`�^��9>����
s�����E�� Oo~�6��i|W��om��Ms��O򒺘[��eVr����\@�H��K��/jPe8�/=���B������bF퓱ja�J/��vן%�Q2]����s��m6�?�g����=����)C?��4M�F�L��MOY�`
��Ch�|�f���jG=��:���Y��U�ft:�ԩ
�Z��4~L�y���yH�s:�
��l�؈����y���a�:悧�?"��l�eG�ȑ���>=�P�e�Xx�
�P�H7ʘW��w��=��nSė�v3I��X��ym�j\X_�,�X��O�Գ��{�"�-z̻��ƃ�l���`m"_.:���
͝�u	��$�
�m�&K�M��|��y����(3�_.��^� 8��N<��TT!����g<�ݩA��
ozez��������U0�K*
�y��n�(�<������1���PxF�L���WeM��z��x�M�Ӳ.�hԁ��!ѿ�
��xC��&�YC������/�"����݆��x�>5�v0h�X2��bE��:���S�>�/2B�B4��x��f��4�7��/ڟ����*���|�S�d�n:5��}b��?�\uX]ŜX*���.E��bă��8ُ���u�F�����.8�����s�1S˻}&���Xo��������Q]�k�;Dvs_�Q9=�o��4�`e�Zy�(/;���!5u؉�P��w@�H"�u������C}����Q��ߏ�� �����-��Q�s�}���e֟�Ƨ����^]�w���s|�b�?m�?�7�f�?�}�}{����ݻ�kd����P��`���~��p�S!K�@�?��)7&�������`*\Q�hSq\,X�s���9���f�+bo^��ݳW W��N�)���3�0�8�������0_�1�@Rq��f������*|W\�:u5�e	1�!�jVQ��Ӻ��
 ���#=����9��
İdaf$
�]�@CW�S���kq�_�˘BE��xb�6�2��‹��&D��t������'�Rj �;@VC�b�K��>cY��؁VV� ��ϲY�5��R�I�
���-��0e���N�v�=�KE͜��с2��ɋ��$�l���/';��G֯å����u�)�,7{�k�	�ĈV��;q#��GѼ��m��<Z^���%e�� 5fQ��P�Q
(��o_�������l�]���߭�l��x���b��<_�E��Š!�9�ƧLQRl؇�իx����J�X1����g���l��>ǧ�/��86���e)ov��'�Qz[��Z��(��p��D�n�1��4oL�D礨U�ncoS��⨏�!��3�+�B!���xB��H�(Z�58 \e\�����S��y(�s{W���ӱ���G���\Q��n��!o��ƍ�P���
��`>Au�x��]v���^�~naG���;_�ٴ��{�D���s���1C�C�5$����qڇ]qv��09�T@�
�/���*����&�S��O�?���6���r8Q_���j�V�&A|o�`p����\�!�9��f�qf���ʾ��TR��_��r���Tc����1�#xۯ#d����������"9Y��T~�>�U]�ו�y��(w�Fs�\Mg�Y�z>�N����&����^�Y�D�o@(H�՗\XZ��y��浠9`��[x)��;�G�A^���An�=��@<\�ߘ8L9\\$j6����/��oc��Ai҃�Q#�߾���<X�
�%�|7 ��	�B���@�'�&�ie����aUQ�0����ZJh ��r"���o
���d�󻌵:ZNsy/,W+cb�� �+a"Ps8�|��P�"����WΖs��Y�*�<iӊ���[xI�_U�M��ni�p�f���=��q�]@�z۹���"����Oע��;�:X����
�uo�Z�����om���ml���\`l�?�̒�?����/'\��������?ǧ��O.{P|�N� :����x:I��$[.؝׆+��F��,��+�������A4��#�l�f��V]���@E�7�_�c��.A�Λ�"~C©�?9�v��Q�&z�񒀞+iu��TB��}�a]�(�=�j��sCj���1�h���5*'Iz�9lN$�dًٚ�6�h�>a�)��C���J[�� �W�v�lѽf�oI(,A��z�����&I�Ξ UM���5c�J��
��[�o�{zV���r�b^r�ji_��o%����P�<�G��.`h�w�y��
��Lk9����*�fM���H�go�yN�S�G
�ż�jgz��"1̰?�ぶ�5�>Mog�������-���1|W�/½ƿ�ߧ�}⢨�V8aplU��):j����@h�3��r����35=��̄���Vt
h�|�OZ99���8�;���'�Ԣܘ�WrqI�/�e�D���"�����m큽�'�����V���^��$H�}��L �fB��"��CYF�d�]��S�~"�T�_@߉1.���ϟ��'��vp)�%�@:��&gHhF�!�D�u��H�tJ���L��PSC8m�"S&VX��/V���}a��^f~�a��|Z��z���KE{
7��&~:I�JUtq�j�G�ݓt!�ۏ��̫Լ��}):7(A��[}�z]�%����2Ia̝��TШ��UU
���F(��I��yTY@�`��|1����%����Z�,P�͠(�ف�ɶ�N.W#��Aj�gU}����tJ�5n���gb�mW�@�^���L�,/�O�0�����}��gQ�E)�/�{@��Ϟ;�������a�	!MYN.���-lA�*Nᷦ�,C��qw�<��8�����9����9>�2�'m�����9+�j��-�f�e�N���e�v�Z�sgϋ���۽�?�g���K�Iwڸ�rz���໩�y��r=CU~V.V�
��
U�ᩇ�`99��[E擆��A3�ơ29�J���nQ�h]f��Ѳ��f��g��r����m��}��}��=�������ڇ"���4����OR�F
tI�BP�2�|�#�k���	��nbC�ר����z�{��7�)t!z`SK"�Vxv�<�Ti
"�[GC]�Ack�Š�ƞ�fX�rh�ɔX��C��Z����b�a���-S�md��F`�Pk�d�_�[���M���*��*.Y��N{u�� N�fc��0!����w&)�}���R��z���艗��mV�G_�{:0�j�¯��N��8�y��w �%�&ɦ�����h�UlcF��{=tr:O�?��?��?Q�^��"���e��0�㏯��&�a"d��kl��&^�b.J[[�����:4�����_Պb?��v�Uދ�qӜ�[�\�e7���+�f�J
�,R�X�K0����E�a���%�%�#��a��M«l��c���.���W�p\x�O��4������?�$F�ez��to��hp�l�^Gٿ�}gD���Y^׳��3C�����n�ǰK%�[�[�X��s��j�ꕉ?�=-8��ML<Y�Y��
�֗�[�5Q-��t����Դ�M<�
~�u�D0�ɼ�ڢc��36�MAG����  ����O�o���*�C��[��奬ɉ ��֢�
j���,�Ud��
<� ����:���Z���io�b�2�U���.�(w@��������31�3uS�`���7k\�_�ܴ�/�5�DDŽ�MJg�NL�
-eLSU�{Y[���o��׉�&�|#�]�'~uի
����
���"�kZ t0��y�o���+���*��m���>|�1��_��$	�P�?N��K K�I�&mbe��Ά�drg��"m�F�����8Y^<�ق���L]��.=tTNp^�my��he丄�}m��b�r3��8#�q�j�
!����N@u��븅���7�;EN��7#���Jy:A��q����{H?E페��lyu���
�:�ǪL�U�����A'Đd#0��0���xp_g&�͑?�H�O�y<�@���5��*��ȷ�&ڬmW�E�j�Ys�R0���A-8k5;D�$?��uݿ�-��g$��>d]i�$s��a������&B�+(��nזrX5I�mDD��oῇ�������տ4���+�3^��5����i}�愡�)ݟ�GUm���y����CY�,�C֡�,�ցk�,�}־kR*���ڰ��^Es+;>F�%(!�w���Mw�#��8�
�&�"�y4��+~w_�f��9q���1�6�;��^�� l�5�2�jn�%A���g�`؁08�.�IgU��O}����wi� �ʭ*��a�ޯ��W4��x�*��x�*�C���hU���G�Px���h�z�d���)�H�o���z�VwV�a�Ң�j)�^6Q"�D$q8~)���1�U�j�@	���AY��D� ��ͮ��'^a��������=`*GH�>���x6�	VR8�)Ϯ�M���ZϿCh�Q�^Q��_�����
�Ru@Ɯ��8uC�-����L�ʁ�.��	��qD )��8�eu��:�ۚ��[Ǟ
����tɵ���{�����[e�[O�._�?iңv�{9@Zh̦@<^���#��TɀV�r�^`p�� �p�Ƹ�ʻ��ؓ�N+�?K�z�R�4IQ� ��;������D�ժ�N����*ji�M�}�X��?�F`e��n}���)���k@��'W[`E�
DM�T����uҸI�Z���E��o��K�g���6/�=j�
4d(f���G~V����R(sjJ/96�9+��kY��M5�̌_�Q�B�=}	Y^o	�#~٧?��<�?a���Z�<��mE��I�e�K�T�W���C�7&�!¿�.$0>Ơ̱�PLa�Zh@5~;�MJAG%X���2��4\eF��W��$�Zq���v�|tGym�GjBCB�vUJ@�uH��6�9�m"^5��r B�k9�}Ӭ7�
Q	�.y��r�����ڤ�P^�W���L�y�BGUH�awN@�W�{���N�@��|��&N�wL��@e�ž[�dsd����=�Bi���Ҵ�ґ�L�胂aw��nc��N�~�nB��'N���p��9cS��)�JTU,>��ZY,���\�����G��:��?�D}}�v:O��QÎ�f2���Ҋ��FEz�YbDj~����d����w2D��Q�'ϟ���h��
��!S��ЎK�$��A�R��:��=�<U���St�<g�ĸ�*���-W7�(���ꎲ�2����{�����-�0&���̎,#S��j[R��?�EMɡ
�6G�ME�m3�R�1J.��2RGt\D.~�G|`bC�ɩT�E<mb}$�d�����N4�Y�="��p�㾪Wi�0���8�셥A�����|�)��+��4|���`0&IO:#khO��=#)�x=�ȕJ�*�Z9�'�A2i�ǧo���t�⏲�THZ��>��䶻v�ܵ�¶�&�q[Y��am�.!�PJ��`v������d�%)�wvGC�C���T�t@�;�n^*9��!爮{|�ƍi�,Io����ٸ��ŏE�i�Z6��ϾSf����������_?}�����ح��H�i�s�$��z1G���WY�)�f�pnq�j`�^s�
g#vɧ�� �C��%�q
W6L�z�ީM9V�
�"/ʶ��Q�)�>8�t�'c論�zc�*o]��>��z���֏G�gS�d�e}�T�����Gd'm�o���}�Q�& ��lpB���A��.��O�0�^���L��ʗ��a�@�s*]�}�bR��A�
P���!���<}udzS�{	���L������~�PWQ�b2�ߝ�)?�6�GG��*~QX�xF*ڞ�*�6�_�����K�+�?l�GQ�,�"*��T78}���ɤI�6�:�x)�u�(��"k�](R���Q`�"��6�ǜÈ�i��y����j@�EjPd1�<ږ�����d�?�'��iQ	�"j5p��1��}Ь
/�,��V�뤑�o��8�
���>p�_��	kBV?�]�)�K'}N`L��,�+�ӳ���~�훟_�I��~��Nwχ�~x巤<X�N@�%�S�to�+{O�J�|\G�[%Ϥ��O��>�E
��m�/�	#VҀ.�UJ�$�i��A���A�.g��C�-n��n#A��KN�Ѱ�]<)�4�+�g��aj*�h������t̿�f)<�k�lW���A�r�_�h�V��WL�T
�?G]A��;���'6).;\L��;�wɹ�ֈ2 I\��ن���f"�"���[E��N7ĩ�K�?
�9n!ۭ��/XtI���nlx���ӧ�^�|u�PŚ�u����%��b�jHM۠��&�>�O���dP�}��/9�����b�,I�.u&X���h��/����ʜ�������S�Y��,�F��ws��Ћ���;ؽ����%��a��]�øK��9y
�A 9����p��Ƨ��<Y��O�ڨ��H��p��Q7Z�'r���Dc��S&р/�I�0�XG��S�����Y�s0\��5�|$���V�s��:h��r��Hs��5����ܬb,w�]�ۨ��X�]��I�
��S@��9~7%s��d��� �����E�V��$o�>��U����~��z����v�Z�J����9{��w7�U$g�����g����UKC}��kM#�����][�b���ry�wH��&{�23��x��-���_�ap�l��7i�dG��u���v�T`ø?Z�-y$��B	��ʂ�B	�/>i�j�U��00Sx�dp�t4ev�z	�)�V�o|��ځ`��h������߿-��B�
<[���L�_
�xEk��TnB�}`�XI��f����&j֛{���D�+�^�V�f��%����"l�i8�}(�@�y��%�Z��I�͞�)�MR�0����l���{�0I�gQ$Kj���L�e
L,
��2+?|c��H�m@i��
���:��`�dXꊢˬ�	��՗(;G/�͊}�c���]�AS����w™�\��
*ݬZ��?�,�[!ā��$�
A������0�W�����o�nq@����H�7񷹳�,͟�l)p¼ʂԍ��٨��S�l�[|u~��/�1�ʯ.?'V\���;+���Zڏ��wR�v���쓘��?k����,�O�'�f���$�aŎ٠:i���60�A`A���YQnme��@��7<%
����S�:���;�z7l;��l�J��r�,�uՅa6dQ�%'̆�&�(���	�zf�of<�r�I��L�濲��%�vx��	f��2+0�b��q,t/�q,J악�(Jy��ތ��,���A��3�y�5��My�b�v�;�ݽ:$��,�g�"�$��i�2˴�J<�8���+/L.���~���L�0��6C�'����f�Ղ�^@��8�ϜiM�,u�%�N#�W�6w��O�/�)�0��YR%S�Z��i��#�����ܝB�W�͊'��7N��)�}<!*�)KE���:e�N�)��F��f��U�Ww%͟D�.$gR��?�ѧ{G0�@�T��˟��ZnI��$K���v�=��~k�^��>K�`�� ���G��K��ת��5ꁧ����尙?�b��[F�y��e��Zon�Qx�������F���0��?�PLX���X�,����*\B#�V�5�>ɋ8˾*loA^B1(+3^�Hw��޼���?x������y2�|�.�ϯX���}XD�}�=��+�I[T���z�Rp̬���{�*�_�(S�݄�ڱs2�L�`�0֪�(��CB<�C��.��'%E��I��Hx�~ց�b�)�N�)��V
�HUG�dO�RS���z2EP�U&ś�5��:�7=�	c��.��.���W%g����Ly�=;Fd�/v��\�S�@&K�:�xHe�4�^k̒�ݔ�X�P���FY�]V��tǕ���U�r�7����ɵ|��m���l��7g#��jFm[K�0� �^2�!W&I����{_?ƣ���[&��$�Q�F�����y��Ɏ[3)�x������ףn��XI�U�%%�X�D
X��z���"�{���xپ@E8����V��'uh��߻C{�Å�/!_
X��Ȯ�@w|L�$��ge�X�K�/ȳ�Ɗ#c�8%�V�L��|(b�a���
&dϦ*��g
���N�ǣkdHQ�;�+;��)�y��!M{G]5'N�z�@q�*Z�ꪘ81��y7(��臘�qjwCs��L�n�ˏϏL�Z)�P���f�\a⒔�q��w7��O���#��^�S�C�G9���hOQ�V�/�j|������G�t^O�7�`>xq�֚�C���dA��&ΐ�Ѝ`E)�5D]
�I�Њ��TČ�3"'R��|cf��*�E�	~4�G��Ha1fկcv�&���,�}{������q��CT)�|hWW-`�}_��X͈�a�7Y��|4 
 z9^��{�>{ {�R�#�Α_娭֪7�ҁT5�Z¯��t{�񲥍���]�(9Ъp��~Պ��ݩg�
��DE.F��^�Q����B��'��h�Y�Ht@׼����?)A1K@)�
��E�B�3'%��qb����fa�B	Z�1SV��܍�bp�OL?Bu��^���֘C�E�Ux���.A�&�${Q�)l�\1�w��R�s���b�|]�o�k�DV�4��M���\&
)�*Dr�s0�r���
|[JEKV�>���Z��;�,���t��Ϯ�ٲm,������,��?��A�F:�^#���s���{I�*w/�5�-d�Š�80b~���5�'��޹7Q<�Fݸ��nԅ�X��(�
F��	U5[�e����&V��p`(��E׮&�T�C@��W!�OQÿ�	n�̼̎,X*�8��i���T�E]����K("8(�k�����/K,���H
�9�?��D�)�ڻS�d@/�k%ܾO�.D�V�u�y�GZ>�l
C�*� �0�sg�E��2�!ƻ��^���T��¢2����:�K
h9�:����K�G�&�h�e����ے--/�tO50~�l�oLs�o���9�2�rEgS�C�9Mፃ��DKK��444YVq��&�Ys;��գ�΁�>o}@�,W~���͟Rm>���h�8tv��p�v˼�}��osa�R��ӚRß�3�2�|�OZ�u>dg���h��ò���#C�pW(f���	������8BZ�����G�7��{��3|��?�3sD�5�(U��]��8�:m�`H�+нy>͓��u6X�n�;2W	���S�-�-�e��+Z��4�i*+#|�o�o�w���9��/Nv1O�k��!?�y��;��p�`"A���Ƿi��?��/��@:]�-��"�Ok���;{���3|V�|'x��6H�2�O;��c��Ɲ�<���8hF
�d�UC�-�к @�a:ך�-���\?c�q�y������O)$�p�r�ReQΧf��O��;n��+Fn8rf>VLH��1.�6I�����8��}P�����}���ߞ�z���"�'��/06��Y��%�ڈ�v�9�e,Je��}$VM���m@��5�CWW?2���\��[ߒ�X�WJD��U,#`K)�s�"��1����\��~�D?�qz��6���v��M4����a���%�=�\�/Ū��L�qo�O�0��8��o\'�?^��0咄���s �F�|t)��tξȇ{���ȿS����;04�G�)�f��`�?����Cf��WS�"�Y~͐"����((��R.�$U�����a��?��eeZ�z�r���F 1�ÇJ�aH�7;:)���M��l��,�o4������?K�������m,������}�������&�.? 6�}�[%��#�	)�)�6����g����hl�:�*����K8b ��'X�e����O��%�X|�=�O�p�^��9>�R��7̝ˀ}жx����[�y=�����#��,s��q:]�k�o�7w}�_���b�/��a���3��ș#˙�
Oow�/�y�=�פі癏m��;ol��<6���^��RB�D��lr�r�W�]6\�r�&Lb?����GX<��#e�"�F����+H7P������z}�����@z4˨�i���'��)��ex�-!��v���d���t�6���^������S2�_{/�����gd�b>���Tϰ߸�I���q�:��~���V8K�i��$�BL| �DX�
�@4`A
�9?ZB�b� }���w�
h_P<D�mV���9�)'��
E+dm��M�-�5�ɓ����v5:��ٓ*{����E�� X/$ot�B/��v��uh��p�.?��2r�.�ApG,��[��_��q�q�r�{��}��Ä��*�(�o�$�p��"8��t���p��G��mH�����Y�	��U��
�F�ߤ\�	�ϯ��BJ�-!N�H�,R�[�a����W�[�^�*���Q��0�{�{�L���ʒ(�wq�p�?�7$$�kQWl��B�k�Jx�C�|Yߩ�<�7��(�;,'-0ڼ;T��JdDȉC�t.��bQj�9('^V�3҆�-6}��(J�8��X�N���x�E�H]�I�\V1�B�+�pr5MF�\�w���!íBw6}�\7���
k����y���⾥�r2�:�=�89>Ü8*b��whq�N� �va�C�&��NT
0e�^��}�֩*��WG�̾N�
9P-�q����b8T��H�q� ��(�H��j`�	'�X�^_�&9�N�;�<:B�˝^�����ܘ��2�+3���E�!��+Ec
�	�!դ��?
�I����aT�uq��+��x� `/;p~�~��
�5�v�)s���(�R���c��VfW�Qn�(a�0�XhkB�Hp��˖���V��V�����H8��9��/���5�)��e�	��$L(�2��	�S&y����
��&@*4�_�we�2e���?t�>C���RU���hy�M)�C� )�Sb>�9)��z+���Эx�+��NI���rͪ��e�_��LkLE<~oP�"C���ߗ2�+���L��
�f|�{c���s�V
3E�49KE(���I)���	v]��(��-a�$��m&¨Xtwٰ��z������M�^D	�I�u?ҿ������h�&�ug�S6���\��td(0��� �V`jB�]
՘f}�2�4�eLÉe,��*��7fe���9Z:i)��蹱B�Ps.
#��=�0��-jT?r[cqk��r͗i�kPQM(�ڳE-�G���Y��!1����E@��#9��̤����0��B�U��c����������?��#Dċg�����&b�:��+��d���s���֘��>���N�޹�O���{��4���S���=���e��-[&��	7`�cEl
�Ѷ?��,��\�&>��_R�`$�
����A�������T
C���x��~)Z"�T�-qf�ËRn�1��n���ɋ����]K��e�
LP��r>�\�2Pcx�r�h���`N^-'�C�I��|1�%7�!����9G5���Bw&t�@Q2�;QnL#2���CEL-���I���@ΌG]��$]��`E�)�0�%)%\���C�{A
���O^��/<X��;hԎl6���q��s]�9�T�E����$�JɕL�(��@�b�m5,�-?�^`��$��&]��O!�_≦j��>������}a��#K�+�%t�V.�j>"�*���25�����Ɣ�$�C��{[�ν�JX�.z�lJ�i�d'=���W碔�{�+"�-}'�C�˻�1���
jW�����]3ē����H6y��7a��n�9[L\F�'��j�����0�"l�C��۰��"��H����2�2&� ����0CS�_�7�P������K(msG'�6TM��� ��t�>��(g��7K-�,���Yc?�%�����LEM�*E���m��%��50~G��E�Ӆ-�RO�ﲆ���W�$~����#!�7��l���Y�m�b~і������[N�"�ؼ+O�ir5m��f�+"p�TdP�gYw�D��s�6��2�L�I�P���0�2~��r� \ѽ~h�1A8ˋ&j`�w��d���Af2�͠�MF�Vr�ݠ�&�ē�d[Z��(���s�S�� ��K��0�5cB�M۰؏	�g�ǘ�
� &�����-�诽��׋����LF�DBw�c�NRϋMs,����Rxk,���`]�,C_Lν�
4|��f�Sj���I������3
����n���F"�� ��K!�e��to�9���&�w4i��.=K}����V��/���
���{��g�������dL�������S_:���Q�i���ݻ�+H�ga
�h;��m/��ɰF���ڢ@#8Pc�Qt�)mf�l;�\+�U �w�z܍#T&�3�Zfƨ�ͭ>��[6ǂL��ȉq�i�?1�3+�F�"iÒ��¼��^�
/�v�$�L8�f��L[�3���1T�N�~-�t�<Px��NAQ�1��{�RT:a�(j1�φ�CmMiH�k72IEKZ�[߮���2���Wjc��sp�4�����Ox��"@�g�M����(���n��"��P�R�mH�J����I��%Ո
��A�Uf�o���q��z�6��M?�����g��e�w�A��b_�	0��ǰ��-���j�eU�w���
�E�e84	����p�'�W.�3;�
��܇d��y���c��&���m�>@��ňR&�qe�dĠ�Y�"�쇥/���I`��%��Ud%��|V_3��v���_E���ju�]�"�L9��/���M��{\�W�X�.j!�X>Xdt�\�Q�"8C{+��C�;y��ȡ��"��u�[��+�'@g�?T��j���
m,��Z;{~���}����Y,��eϳ��(�v$s>/%bנ]�*`(_6~o��������
����dY>�"4%$���I�
��4���3�
~��ra�L��O�\�b|��q�+	����'^�L�A}�;>ۿ�3_&)\�s��?NV�fdw(��;R,���]�2,s�4�ʌ
@U�g��䌝M��[f��֜�q4�E.%%�\����x4�Gǩ���$V}ǽ���d��2�?��v�)�Y�O�����Xp�7�|��~�y�����{�I?����l4��7Fa|~���n�Dc��I82I���|Y��.Q�1�`����(��'����^cϓ��{��Y-��Q���C���;IPWW.
'@��#z�A')��i�9�7��K���s̚��;{�׬��N���ļ��f��\1�U�Z�‾5�_��=�^7�X�٨�drB-���"u�;O�Yd@�A��"J«�o��l_�@��=L�t��%�?��p�"������{���?����yPG���}xc�-n�����o���l�����8��+L/�=�ߒ���c��S.{� ���ao����`�W�W�aИ�E򪜑5��'}5�e+�qU;Q��5`���~sH�۠�m�;��4����A�q6�G�jG���`A
���i���%�ڂ3����3NcحМ�_���f�=ɛ�v�6�D$���Y��A�����s���ٽ���������@Y���\j��.�H�b_��!;ѓt6����'��{>.��ܹ��D���"Ÿ
%��'�.4��m}��Z^+��_���g��sk�@�I��զ�[l4�0
��7����䩏�^-���c]�do�LFD�zd�Y�<IU��0lzC���&�������E"=bia���<tԚ�3���ęFFH�q�x�/��`�d�t������)�A��X�tr�a�(�F������{%��mT�	A0���Q�@}���+���\���y�b3A��������U')/ǻ���FPPM�v��pj9N���x������W������{���z�4s����1��3:v�9k�6:Je�y��lV��ȃi��F�^X���v���g�l�(C�U�7K~-RdM]zn󢱉`�`�f6�Qm\>�=&��8�x�%��~o�6��{����x������?,{���d�I�7,g�ςIyModK���]i�.aӣ[�A!��N(zU�'5�*�,���=��̃�/RM�/`+���&��~(�Hğx�]�Y3L�[���z���Uo-3��v7U!+"�c���!�/hGΜz'��ŏ�}��?�>�fW���"�뱓iH
YV����}�_�G�7���̴ri����-E�>�j@�#D�_��Z�f���u�w��I����D"�1�E]�*d'T�8RFjP�|��ߤ �����_`\lv���W���
��#�����%=�M�@9e���r��KO�P���g�J-�g���d���A���v��/��O�g���[����k�\���ak�^��9>A�o��Bx}�'��Sȭ��X��R��'��"�	��i�n�:U1؝�荅�c<%WX�@T�>'DO�W�۰^��k���FQ��0���1A�П����>H=*�	�=�
zq�����9�W+� ��5��D�r*:�d�6��pE)<��@^/� �o$�i�ۖ%.��Q�>����`%��H��˄���P䧆���̫
�7�lU$�/!�dp�b�dW4l�6�T{���ƫ�d�+�;���tw���ܫ��T-j���~:�M�ʠ��ʙ^c?��7��;H�<Jq�IY��~_��w�73�-�3|,�q{C���C|?K���ys�z�6�x)��8�\�Q��N:b>�C�R\[���^2H�I��~p�h6�xGX
lF?=a��|���̗��h���Y4��	]����>X�����[5���T�<)�8F�\�Vo����67��Q��uO����6֡���rwS�b%��Tx��I4-�����[)��}xx��s���]���������?b�mq��>/_#���2�����WP�&�A��u-��u3�^ŀ�i�+���Ud�
�e�շ�	'(�W�w�q.e��x0K�N<ݨe���t��ֶk�Qo����u��ܰ�0���{��:ß���?o��_����Oǝl���4pt���we�d����7ͣ��9���\��Su2�����'�(p����6y����	��mQ�0�U`�:��f�n�W$���I*���:�'D�����~��(���!~�SL�?�g��@\]�%��Z�3p��+:B�����{5��?@�L�;�J��:�e�k�ڶ�@�n�g���*5�����;ޒ�.�D��Y
I�]���$fY�W�(�~d][����U5!^���ú駹h�|��ƨ��Xb� ���ތ�A��.�{�"`��1�,�����
�Uߩ��
Ui�e�ӘR�IT��"����M�(jέ��W|Ē6�l*�^+��:B >�'��fC��oD��� )�h��A�޳W������j���[�vu4�$i�f�w��޼fU��̀�1_����۷G��Yz��nk�f��$�gϛi1Zc���
�Nei$��m�����:x�ff����]�����t���N>�u����	�D��XO��h����gI{�a�i��-�پ��@�q�j�_�Y�w�z�`7Y�V��wĪ����M�c�q�l|5�j�Su2�h�i�ӍR�rzM4���ez�z�q��;��l#+u�������(+�(��d'�}A��ш��b7���(�	9�SN����hFŦ��>��ZhhL�Q�3�u��k�OB~��辸�h���$6�?xe��,�x!Т�a�)�
�2�Fx~o�D�@�7����$!͏�U�La�p�5͟�r㔍�3�dDR*�,�5�?����,�r
�Ym=c�
�&m�O�xĿYӤ��t�Vq:Q���t�o����p�s�0���Bh&2��dy����ι��ه��;�F�x
����d�Y<�!�ܯ��}�^�՝�!�a`!,�n���_���+#�&��2�лY"y����B	`��8�@m���hO�=CkcN^��ei����Q�����ެ�����]�@�lZ��uL_J�G���܇i�P�A��_T7C�@���
z�v�oI�VeP��y���A��(Ex�-(e O�fU���B����3�@Ǔ���F��~�����
���xeG�*pF��AH��0������)����R0R���hҎ�1����x��.��~c�JH�;/���C`�3Hȃ�]�=7���I1���)��,NgҡR�>�K��U���r��(����Ό����v��m�v� �<B�(r>&f�m�&��(�B�������db����sP���c<	�ع֑U�8�WA�Y�-�z��H�[�\<���ftJ4o}M�/���>GcpF�x�y��u@�� l�;s(DI^�Ƈ��2x�`�J��W�϶I�9!�rwW���G9H4�{�r�8�2�2�����#���9JV9��!��QO*��mg��|�tōp>:��]mS\�5�댣�_�Y��	�7��_���ݥ8��$���J���&�%18�5텔tY�YT�TQ`AĨE��L9�����E�3��u$�ێ�lZf�Ϭ��h�c������9G8jf&�}���a�)�/Ed�
2���*'��\	_������M���w��GfiWj�B��jdᶅѥj[JW��"�&�f����3$�J��7�Ue���`�������ج�A	o��E�g�@�Z�b�p�+�vi�M����v���n&N��x�䱢-ǧ�#u��ƪ��PwZ
ϔx�����%��#��`��NS䞆;�k�7�t�M�\����#-;����7�խF6I���;ڮ�s�7,�`Q9jY62��
F|�N�@��d4��X��-&��0�;=ät��Y��TW�Q�y�4�;��7e�*;>��/��Q���O_t����Ӷ�����	~s6���B0�kW��>���H�E�fEg[R��#�����]�8/BУ���:���"���w3؎���+�ht��-E���#�����$͒@�T$�KyqQRh����`d��k��[Z���5��k�	*�� y
.����Yګp����yN�1�4�����!K#�7�M�L�-����gYx[
VG�"l�x�(7���(�#Ѷ�0z�Z�k+�����=��w[F�����l�S"9^…?g�c�5Mq��,o�<���U �`VX��+��E ��U�񠏞�����Kuc�xJ�
/ �{4��h3ᝣ@p��	��'��D�Q4�8��E���@�}�O�
�i�{��<���������j�~��"��!_��p���[5���v����'�4�l}��~����l����x�����iC65u�{��寞X5@!�S
6%��)z|#���m5p��)%oE��V���U������zw0��x'G�(�6Pӱ�'��~���L��S���y�P�c�WUT�
�eklʜ�֗���bYT���=4�?���6�������RO�3N��.���$ۿ�=ery'\��/>|`ֺU�'�,֛k,�#�D)���q'������!��$�p�|��m�� f\�x#���&=!�o<�o�@y��d"��x�#]�}dhC�/s�����;HP+#���
��QSq9NǜH�f�Hi�^L"W̌�#�s�̗r�gI,&ה���h(�\AP��N�:{�#t���5|Ll���Փ���L�f_o�#
��\�M!�_�YoD�$��[7b���V�w�ٰ��n�>�L�2T��l��{2P�X��j����.��,Y��azp�X�M@o��slo.H?Xj|���vh�o�]9��3�>vg|O�8@�T[�rr�Ժd쵋!J���U��ק��oe�'��(A�#>�,��~!���ZjO��g5���k?lK4<lV�y�ÆբJ�9�<Ӕ߽R�$������鲹����*{����Ʃ1<�8��~6��m�X�G��A��U�F���Q3}t�i]���ɖ硕��QR�3��8��G&
�5�ij5-��x?L��n����l��?���>�����q�sws��\u�
����c��*�\��x��)��U1���H��"��`���m�<���*
N8��>�c�,��©
��� ���Ñ^�����|�ɳ�_3�xX] @Hr]2�#�b�F�0Z�W|���-�"��W�x}l�IP��p�R����.'w�I�e�ho�F�0������ȃ����_��eo��'��B
�]�xUz�h�7��<(���]/�P�H�@�D�a���Iӎ����r+B����.*(��{g+f�3�@�q�k�Z���[נ��P���Ā*���C4��ʞ%g����1�_�!�R��4���%|3h9��æ{g�>�	���d�ӱ�#qSy�|ʆ�/��;a?�=�u���M��H/��tcK,�ǭF�M�~�qӔ���[qLo>b{h<ش!~H����N�|�ї6
H�
�]H��/KD��(�Q����.�0C�j״]���1Y�����58�"QsI7��;��O�X���}F��]t��UA���W��i��sl鱰�Y|$~q7_���P��8#�����V
u��F�ފ��쯀�l�U��>��!A�@�tKTZg��m Nf6\�&���
*���� ����� ���=`��5G�$�F����%����0��B��Y2����-�r[L�6��6��m=��n�	Aks�<��JЮ�ht�{�Z=�.1��ie��NDX���`�+~-e�P�u!�-'�l}Cg%�Qp��^�׃W\��!J\R��
NG��5�ͪ $%Ő�'��P�}��%�"�cJ~��L���,����(��N��i�{‡Ifu��U��0�����Ӄ�tg#�a�i���R�S�_�{��b:�A���t(��z"is9�C�^O�����tu�`'p\=�G�ƼͿ���c��~�
<�f7�q��"q���849��B�!mF]a�!��;��["O��������P3���Q�����E�1�xj��A�a���ځ��M�	i7w�Z���F���[
��޾�����"�����_�	�jcA����/��Ns�^��9>��➾�)i��p=c0@��?F�F�8��m B����t�����ɿ��^�Α	o���ξ���w��[�CA�!�o&qS�dY�>H��)	��ǡ�����xB1��U������!��{U����xt���GvK?'ksbNC]����4-rL|��'nbi���>�Q	.%;��U�Zh`�S��`��
�-�׿��9��3&hK�����S��;.���'�r�O1;I䜞$�dD�S6��|�/M���e�?o
aGhd"�B�Lr��.����%Ѳ8��d��k<�U19��-�vʣ,�����^e��i���D�����C†�f��lk�����F�1��S��� d:�hwQQF��m���7�
g��x��v8��܊qH���M��ݔ[�Ou�z�ϲ��\-�ٙ�L2�Qri�v��ʱ.ª��C:	�Y$�N8E~f%%��!�e�]���9���@�ɨ'��w��g�ꤽ�
k)x��fh��S��8�3PV��ڜyZa�*���񄾭�o?6���H~�����o�T���ᇜ�D)��Z�����o�]�^�0��~�V�(���`�����ᗩ��K��6�D����m#�*��`�Ȓ�^7�$�6�����H�:�w'΄�V�ޭAƟ~g�� ��b���	\1}�-��X�jmKښ!�(`�W���Z�`���k�U��}��z�ǵ��Z1���5��Z���:N�W���r�_I�f�wL.���p%ي,�M`���рJ-P��*��*�w�*o4*�:�5r��M?e�!�Z���_{�n��Vd�������O�� �d��<���H�ƭCжpҔ�k�N<#�4�wن��h��Y4$u���*~!N.{2��%���
�
=�����9� �Iqݍ��w���ME_��4VӠ��੣1�Z�)��I7��{���`>���H�i!�f��o��`���HYAʹN�b�p��ي�|"c&�@x�̄�]�4�"`Ȁ�Ta��i��	���yK��\N1�	ZMYע�)L{-Dhxt�|ܖk�nU�	$&͘�mQ�U��*�P]�
�Jt�k�rz%}�YV�H�hҋY�� W6悮�$�	Q
rm]("C͊A���5����ԛ���T��*d4*
�4T>�_��"YT��j[M+)����7��%ĕ�ő�1�����*-!}�QT�m�$�`SZ�<��9�JDz�ۋ�O�^���'oq�s�]m$Y����=���w������oU�G��S:\�����Y���U�"��[艶|�A�H����24UI){T�A�=d+�H-9��E�T��bzʼ�t9���\sǜr�O�5D�R
M���C%����]���9�\ݞl$a�"L-��s&��UE1��p4�y�ؠL*
q#��P)�[��7��[p��z��Mwmm�����xk}�tuN��v����4"/\5*�1V5}��Լ` j�u�&�G����$S�s��EA�Q=(�jZ`�j���ڶ>y
Rؐ�^V��Њ�# 2��1H���f�kQ��%�zʸ�u���:�<2��⪬�e�p�4~����:$����t���v��em�����$z[�o�e����{����Yb>�����q��6%���;�V/^@)��f���8����}8V�nV���c,B�ƣ����k4������ڏђ5����D�*��㷿l�3j�i]9Z	�&g@b[�d���Yy��jw���<D�V�d�A�2�#��r��0���ص.]fAp~�"���kc�;��LE����"�LZ�񴨧'�3�7����	���.���ئP\I�g�(d���QѶXaSX}B��%����i�P�?����-��& |k�$��˗1x���边���pd�2�nH���$��P4C
�A�]l�VPH����42�t����;��OY헟!F���܌��a�H	�[��|���<�F��$f+G�싞���7x4�S��8�����H��η�q�P�K�*�8h��T6c�k4����v	��>
�XDjgK��[Ć db7��?�n`�	Y4
gVl��g܀(��c��®hk"W�D���d�T�|8��"�9+�)�
Q:H��a�U�r_K��+�@rc���6��\��nW�3a���ur5�P����-n>�޼A�@�j�y��
��i�?��4��
��XØ0�S���3*�cI^Q���喹xQנ��q�6��z�*�H�},����7�I�2�þI�U7z��
���_�p�Z1:r��r�XA�X2"��uw�
�׻[�J�U���� r+�Ϥ�8�ޖ��å��pd������'-����t�6�w��}��ֽ�����9���J�8��?�'��z2f�G
0�p�wK�?�*!�5����^���D�z���у�D�#�9~��6��=��n3:9�x�����H�'u����ʕ
�n���k[�̝����la�B+�^���q�����%��i~�u���h�&��B�iU�N��%^G����AAV1A	�ej�
_Y���507��[A���;��E��)܊VA������F�n-/����1/:F����F1��|^N�8�a�|`nDy�G��	͎� �'>J!�Q����Q��s&x�57����l����S��L;�M
�!=3�s��+��@���e��t�1Ș�+��n��"t&
�ya%�i�A�~m�W��q��4H�b��USS$�ʥF�oI�,0��?e�\R����V=]t1o!�6.%\gA8����<��d�Km�M1�is4B����.M>mҳD\�x��V��Sд���XD��	�8��N�	G��^�r�$"�b��h�v�0Ht�?�f ]�%/�c_��o�����w��y� ��t�ח�#޽ә�2��hQ x>n��K��#��Ĺ;L��O3�~?��
���"�3.��*���p "���`0��� _!����3v�?���*�?���Ј�g/��:��&�����N�ɲ�,
��6�O�4sZ� 	\��׆Q?Vљ���#�l���YMd$?���`�[�����[[�}��{LY��z�/�V8�����J��5=��5�����������},��m�h�b�^�T�~\%��ɿ�A��h*f�O
8�fU�R��e��Κ��j[�M��c'��r�[�ꢄT�y����A���˟޼����lϱ�깳7 ��� �?�` �@�|8WrWP���"kħ�����#�&S�g�O��K�bq�M�A�f���
��%u����5�Q����ě�f��vIdz�ss�����ϰ*e!�u��X�S~���7ꈑ,��*Ĩ&\	�b
��IJG�r��Xmрq��ʑ�#FA�;;㻗��$|��zE�u=rB�+qk�ؼat";��	*��t�����\V��>>��REz1�ށ]V��_�U��L��*M8�@Y@t0֫���}h:�Q��:�i��-�\g1�։�B��Vo��բ�Y@b*f��j*g���V׾x1(��	�-�e�G�#$�i‡�8�61W�z���ø!�=
�a�1�.ýO�d޴s�|
���`:�6����b|��Ғ���ui��J��;v��-�o�K<��@�+x�	��]�g�,#�����9�~U7Tk|�Ԧ����`���k4E93 ���nʹ`����x/����ɔ�[j�Q�GL���I�l��8�I\����#��ea$.���(dT�����mgC����VJP��+�����Yೇ��i�T<y�+�4Flȍc����*wD#ڡ{/	,&Ha�;���T��"���(����!�%d��|�9��s�Aؔq�W3T��3J xW�^�Q�)_r�{���`e	�|k�V���<��<�������ó�?�������c�V�Z�5t�Qf�o�r��R��/�v���~��s�m��
&Q��\b�"�m������p|�|l^�Ȝp�
�=D�~���!������?b�%��x]ު��y
!�kl����jbj��U�f9A���A�qY������W*w��L��o�z��f-a��R����&ºD�&���	
���C,��Nf�:�4�K-X@�����l�����R�X��*����o�cX����q�?���{;�����)��ŷq�� 'C&��ٶͳ" ��k�C!��G䀡S���?�T��V�途W�:�]�yt���^�s��\9p}�./��}[�VVlt'���
~�
��x�AM-��U!߬"�3��p3:G�ͦe�2���štU5�Q�aE��p
�U(_�o}
�s?��?[ޢ�E���殧���ٽ���S����}�
��2W(HrB,00�RI����Y���7�
`�@�f�<�jEȁ�r��۫�,I>?;�@��qk�`�I�0�@�Kv��%09K�_޶
��p�22[��bې/y[�f�A�ղ���� ��f$���V�����T��b$���,b�[�{��!%�>���];��|\B�N���S10u�UD�BK�/��vP��*�p��!�#-͆s��Hd4j;˜3�i�jo������T���ݬ��y|���5�":&��B�T�M�<���Y&�B�|�YS�!j&����M/.5z�����6+������w>��W*�R��rA߆��Zy3~��ݹ��^b��c��A��\�!?�9cn�LD�9�T,����}���ߞ�z���n�P��nJT/~�HT/��hpC��P�Q�b7M2��탍��	n�՜��0����(��D"[{����G�+rkĉioسkN��+�a��*
`?K6�X�-�'
w��(��դ�͂�'�
�!��(W�!cg#���\&=�=�GgI�l�,�[�{����#��Z�V� �#g����L�6��T�;+5����[rР�F��1>��"�0p[&��	�k5L��5�����Ю�7�'Q9��2Po��,j���7��0&)�se�4mE�^c�P�s�;�ra2~����Ae���8]�+@9�a��F��*�X��I8g� �+@ਊ)��h���5�K����
�X,>��$�!����mr~fE��m*���K��ʄ|��D����z���xt��_0��X��7����Yby��
7�07��E&i�x$�ߛ�E�����pc�����^�2�y����[^z_�hʏ0_1<0/�t^?��<�2F�H$�����kU���?�Qڏ�,$=<h����0BZas�k�o���6��߿��v�ƣn2x������'�0!�d<{UF�%�8jB�x��G��$I��q6~
Ɨ��Gäl�)3��9�So��Gؓf�\��wJ�}��:�t9mM����h��8pV���.N�a����#��`^dtb-��l��kZ�ӎ�.ܼx��,������~8,��0��nl�4�ڜ7�l��!�=17h�W���gO�V��_Go���M���#u9g=M��-Ƙ� ��2�D`�����6R���여Q	���BX�a|-�=�%OEeT�z���*�M#6"�
H�б�8���Z�8ʬn�8ޠU�	5Jꖿ�|7&ۻ~v�����2�\yr>c9:���}�L�u�N�R�Eβ�V�{.,�\��NZ�V�?:��]�A�[�S�X'�<o�1�/w�MN`�hdN�W�E�L��D46�4<Z��`��h`0�k�_kM����>� 7"�.�M�xf�8U�ݢ�h�Z�@0�#�?F�i�F���'�?L�V��gV�6n<��裰9�/G3�U��x桡z�E+�d5\kZ�Z�a�@o���7�a�z��+��o��G��5LbL����?%���t��8��Sp��_:PM,]��њ�Zd��5�����l�h�ifo���[vO<�ƹ[(�!�D	�k�LZZ�w�����w�l"�u���/�o�
����%�"T��m,���<�����3|�z��]�r��}(<BCeE:R�L۬6Ar���f`	��x��Tb��2�Z}$�f�d�����g�����@72jMK��*�HhJ@q����+��	�N�U��lh-�B��y�K�h�_u�������\Yᚐ��.@2�r|���H��[�����Er��_
s<�I���'e���p2IF=Ӣ7�Y)p���&�f�F0��.A��QT��NQ��^���j	�����xX�{Lm!���lq�u�oaqM�5C�I��&`*��`Ym[9�9�m0����@�g���
E]B�78N�pR��J��Y�;J�Ǖ���I-07���&�
���G�|:�dG��'�f'u~���Y��/�IČ~�5���g��ƞ_3����	�J��U+�Sd�Sebۚ���8�n��k�R(�h��py1�(ȹ�J��J���%������dZ<ꢣ�ϛ9���nj�]	�������7��ɻV֤u2��Y�q�\��X��/��
ʩ��ѱ�8#Pg�^���>VV�,�l�f�6�,-��Pl1��KϽ���z�����oU.Q׽�eA$���?{S�6/;87D����h6 �i?w5!���/��:^_c��FZk^�ga��1�����[�T�ή7z�]�ݳ:�W	J��sdWߓ�V�]�9'B�g�����v�C�ۿ^J����Xq���e��,�/�&�ł5Z�h�D�&4@��]�ktXk��MG|R/|
qPP;�dg_Em�	��@�y(�2�J#՞��vE��f�Hɧ��5T��P�!��`���;8m���-�����TSE�Daʽ�4?��I;�.��6q��]^�	E⠄�@�Ql~�4f��+�tL .��敛�e��J:�bXtR��~�7�ܸ�6#H\��$_�Xo,���x���^�L�%�X���.6��'͝�i�?��?��vm�<��p?G���_�����??�'(�S)�(8ma��o�)��K���d�J�8͖��Q4&��O C��yo)ΩpXZ1
���鋽���H§�M��g���ꉮ*�R�H�E_�8�������?�&�L�,f�N�@d�((�N|7�.�=�fHyү�pb�#��H~8��gT��	8�
M�tAD��V2�8�
��EB���G	����	N՛Y:�θ�a �"S%�G*8
����3��Q����,�8;���[p��kL=�}�A3'�.�q�?�b~�]�d^��,���q2�
��5�_�	z��1���
�8�������>N���S�-��	�z�&A��!`=Q���`@\�]�8T���Ddş�W������"��u5��G���QUm,��m*�[(Q�g�.�C�\ n�;�7�Qœ�}��s����M,�6tjV�D��zm��0�r֣m�A�cCr��{a��F�O�B:6M㮱S���}Q�������1G��0߇9~C���jJ��|��,P�s�~
%�	dK	���G2�fQyՈ�L��z|�*Tc�:��7�B�[��K�nrdu@�<�V�V�!F�ѺU@EF�m6�1VE�Q5v�w����⫟}0}r���,�!�	�(kDB�O���Y-�Y����\V�*�;a��gM[��o��0i!3�r�I��ȭQ�H���Qd�A��;�j0)����$���L����5q\��&D���Rчow�/�mֽ/��6t�X�E<kԍ�{����zPߚ��c�X۪�5�K:����
�?���֌��
#_8�/-�W���78|�б�#�F1������q�hkB6@�i��O��k�ضj�!��D��CLKc!3 ���u|\�\^�ɷ���E�eͱ�Q#���I�m��g�H���p�V��x��P��%��E-Ģ,Т�up����lM,��U"��SWh�J��P����,Z���r,��$�ۘ�]�_�M�ol���}yN�&�21���
5� �8��Rh���5��T��1',���Q����H[���b�q��vLjP�]׊��-�"���LE�l��cR"����
ӳ���L�C�pS\�@n��HL��r�S��z�J)?��0��%Ϊ�p�x����V�E�U�Y�!���k����% T�����UI����p���N�֨[rOhN��RhFhh�T	����2&Е%e�S|�N�-��8��s�|��!y@�?}w�R�`u�����5�S��z>7}nSQ�����~
km&ǀg.O*.��̲��AF^Vِۼ�����]�%���+���iJH��c���d��1�]�v:��+�z�*�W����d�NI�t���@Q<otL���4*�ח�jM�0�B�tAL��UNވ<�H�Ge�랄�������h��Z&�%�_U�9��ú��͉%��}.��`�̗���wt�����{��ƶƞ���Xl��+|A��J�o/���{��fU����g��\@�h�1;����ox��o8�A��A0�T�Y԰3�(�g@�	`�iԊ81N��*�A�Q��'u�ygA�lv��LH�Y��/������]
�����0�GQ�ڼAjQzJ�SUq�ED���:�զ�r��^k�L�$�<
\��R(j�<0��+ؾQ��bX�H%a+��k���`ޫk��[t ��L{)=i$��JDŽ/�*�^�4�/��۳Wo~��9��4�!t�שK ���)NTMg����8ak��G���D�!�f���D�w]c�o7Н���Z�%[�߽�1t�)�-����3 A/�kJ����\}S4K@�&��ˉ_)c�c~�Ɣ�E�oŗ`�3>�%�J*w�?�&�^P�w�܌�b`���#��Poh���Q$�F_K�7ֳt#b���)�3���9�R7�{�!r
s�Һ��ɋJͮ"/l�V�̏��iSѼӎknED fCP;��SF�%�:y��c�ّL	a�"��]O���z>�Z���X�I���.�b.n�O��)dݪ�؂3�r�	���r{�c���3/�^��2��K43N��ź
�Zv��nES�!�����i�&4�AU�_��+GE.�vH��ޝ�@LQ�B�0>v;	��%4�&���r5��@�)+�vU�1�J�-@a�J3x��[G���A:�ٴ��!I�K��
W�5�>�5s�9u�`Y^�n�Gs���>٧0��U�p�C�k�KL�Gt���Ӟw�tA�����@3ؗ�*�-?M�d������V��Jx̀�J�'�F��
LhI6��Z�;Gh4*��+�sH�v6�h�d�>�*N����koyį~��}%C�;�M]��J����`�P��ʰ	���Q�J�����U�V��(/H@�uԞWC���ؗ�ͫ���y�L;� 0e-5s��v���<�)���Ýc"��]H�!N�9�2��^6&4���ʁ�(mz��sϵ=�/r�jLLA��'I	�󑸁���-'$K�ʎhW��LSR� S�b���mV-g#�Nmf/d��sï�o�]���}�� ���J���)��Y7�kAH6 ĸ|'�	�e,&��|Wm���yvF��œO�����u�ӿ�q|WBkޔ���r3ϊ#\2:����nVEKGε���#8�=H�
>E��Z�$�������@AI�iA��RvZ�H���~���8��D_^�l@aR���]��+<Yq��B�m�'WА�kL�1�
��c���jō��ˎ�P�i����
�L()Mr��:�e�\��e۲�F�mA
F�鋂,�k�������&5}�~)['zܬ�/0)r��;���MdS�s�kG��(#n$Nq�>o�9��&msSc��&y��‘8�v��V�c��V5���.kbl}A*V�f���U��هץ49��u6	DsPf����M><����.���*�y�+$��2�ں/��;�:�M��2��z��]3e�Y��4�횸�g�e�T��ؤ��I9�C;�[�֪7�!��"錼�`-V�2��Sg�rIu+Rx����ط�@��EBy���$�g��S�Ʀp5��Ťq���XF�r��
o���B�-�2�w"hߞ��"���t!�^dY�
c���@#���h���*npնl�\�X����R�9I4-fI|�d���ҡ+��<�=6}.��WA�A���(r��%�w�¾h9����KHs/J�ݢ�r�F
`�ڕ�Y�oTB��E��l
]�
yK�Ync��܍�$�wK�,�w�QE��J"l:�Uk�J`�f#UF���K��+�d�������_���"�%d�?�G�����9��S�>�o�i4��N$r���7M��;��s�zB�l�	�4w��+q5�2�<iBY><�����h~�īHaOh.��$���� ]�W�1P���<8t���{���_?ǧ ���a~P*�
3耼зo��Յ��Q�a�7s��
!A�8��?�bX�kw4TU�TH�ţP(��lAo�3sg…Ow��hy����@��0��"d��K��*���%�3�L��@��y8��ލLr�P?�=$E"+��ѣ�$Ʊ`g����1�Gg|9�ca�R#�m
G����_��o[�[��:�z2Ia]�rm'I�b��:�(J�
����ܸ�L�����O^�k%�VKCU���h�x3�إ�
��8��M�tYzaְ�����/��V�D�w��%�@)ڒ��:I(�ڽ�(x(K�h�N�+�P�6��[�š6��&���E�z����z�V�_�
�х��JRtb�M{g~T�i�r
9BP�c�λ:N�JJ_�E�=��
ʻD�E[� T."�����s�^F���,ߩ���%��:�JXf�
Ϡ��Lc|wEn��^�\+p<��l��&4W�V1 ��rA��5��ԤA�|4��61m���������f]-��[xEA��J�������g<�����tVS:uw�Fr�[��Џx�-�Y�!KC��3i OYO�t�\����m�U��S��T)�;Tg>���̵�w�d�5jn�}�SE�=Z>z2��K�v1��X���sZ�s�k��۝m��:�KT=�9�<�#?3�c�n6��@r}f�D��ʹ�b����"΁�KО���ghaB�~�꺞�sX
�8��3 �*U��\�f4��/=u�됫Hk㒵Gh�s�&���־5Nm�
�l�-�E���Fl)|{�[��4Кw�WЫ�s@�]�b��0��6���3jQD�<�f }y�~�E���7K�O���vA�ۓ�T)$�–{Ɣ��Qt<f�<��b��̦LF��gj����!䣬mS��!�˅W5f���6
jU<+W�
���]Wӕ4�d�<���`  /� �tR��{���o����9c��F�y�R�5�xD�u2.�L�'���I�Yrߘ��al_�wh���(��򿴜�׌��t��v��{����_�������)������\ɀ��K�G�r(�
����gZ�cFܴ�+6j��/��D�.��w)��b K0��6�aTO���"��e�A���򴐹�ky`��L�^�9S�]�	���:��
��P'+w�B��R�Rv��"Z-t���邩|E�k=?q7."~��P�
��`��N��� �m����Ώ:8�_�క|r�J�	s�8T�i*�#Z-�?d����B��3�� �
qcN/�0�~Q�̹3<՗������zȱ�U�m�@	�Z�Z��EE��ۥ�\����P
� xƛ�^wz����d\8-��?�zp�L#�Az�9I�Q����
HKRZ�N�lj�EXM�T�:�3�w�>RR�������-I�޿T���c���}�f��/�)s�vӡiE�Vj�Q�0�
^-X13�!_�P�C���$�nY!sy���1oo������yȻ�F+Ɯ8A��^o��mgq���U�y;U���Q�ҁ��L����ӉG��(��m���DD>���̀�ŘëJ}��L/M��:��:5�+�����^ݜ/+D��C
]0P;���Ũ�oC>�/��9�n���\��,�Ύ�/�\�������06����O[�4�L!����/�x���#};j[��>_M�E_�.�`�@Yxw��tD�C0��n�>
�T�7�=�_�}�&{A�=ooz��ey(*G>\�R1������⬺p�,���
�����W]H��\W�A��{�����1;O��q��O��=<��݈�ɴ������!��\��Ҭ���25/��+�ʛ�N�B�Z�0�[�uL0`���.��&�5w�K��F#jԝ��˭�hKY�"��K����3R�>w��ݪ��]�ǯI�W�P��Rتb��*�����v5� X�,8R�+��E���lݛ�%.ؗ�����9y#3�`N�N��ͧ9|��JX�-�#a���J?�"�QEwT=SK����a?���U�Ƞ�{����9�v���3x���CZOv������x�x��	t���?Y@���E+�Hc3�"��1*�o��p����̋���!���@�
��Ĉ�<�����
�������1{�q2��xaӾ�o����:�gP����!ÑK�c�i�Z�����!����ö��~�nn�:��c�;�� 
��>}�g�0���h1�Ƣ�N�oE�1�PD�
oy���t�����:�K�]R����o�r�nNz���9m���$+����j�YGP�K�P}�ͮ6�dO!�n�:�UI��2�sL?���M��� T�%�l���L�W����a��_=:��m2xڎ����[���%��2���������민��r��'w�f'��t5�w��J0�+�-UD�K�~��Ŝ�9h��%h��_���$;j4����I�;bR��9���}�4�$m�\֠^7$+�/�$٢o���w�oeG��&�l���RZZ�o�dq�9�7��97ῐJ�bR�n��9�۠i:�m�U��‹o��������Q<�����ˈ*Hh���}tP�
�8"c'��9��h�IEE�ub��H=(&v�h��_-t��� b"#�#��`-��V���8D���̙LJ�r��Qe��Qb�4��v�{0�S3@4��B� McC@�O�|�s�����߼��o���b���Ţ^��7�~�8�d�f��h@�B�"�i���Ex��a`T4�F�#o�f}�}X��O��R����pKU�5�XA�6]��N7"�(��1������t:����_����j��]$�z@k�-]pE����%�B-�?���e�����
N��5V.T
9t�J��M�B�:d�O�^r��Eph���-OR��$DnJt��B�Y�թ�-w��$q�iA�_WVY}^�Z���l�`Bù@�W_aā;�{_ğG99ħ��>����Gsv�+hϱ0Zd�v�*c�6	���'��D
 ��Z����<�th��X��m\|���l	Ie�m���|��n�
�w�~��w/�_>�Y�i�Un�H�P�W	�%(^�,M��0�=��h�\�O�"s�eV���Ц�ȇ��p1�a�F��K��J�U��<�em;�a]!���T�͕][I�ZЯv�(�zl�m��D��Q@�\`���d�QE�;�A����0���3E����Nѵ�45��h{�bZb�j��.��ߖl�HH:K��)��/�����&n��^�R�.춓�vy�]m�j&�71�R�A>/��WiLx�/6���kq-V�%���@�%\��K�!y�)�|x�1�3��f!톼ՠ+4@�BXA�M��3n=m�-#ˮ!m@ct�U�x��jm�謽~��t*K���8=˘,d?�{x�>�֥�Ã/�+;���1��9��˯K��T�H+U��L�oR��w�z��$����/(�Vn��w�u��t���������޾e�Y'��M¼Z�Ľ�T
�H�������g�cC��_����_dȔ��j��Lʩ�h���q^%Y�x�jc�9����F�K�PЮ�L�F�`���Dk
��jި*;���v�^�f�u��ey�e�=:�����
�NՕ�̲��I;u�J}R)rWٻ�Fp!��I�0���@z��ٮ�-]]X��e�������MBq��鞢4֕]U��^Y�P�H�1�
l��p��Msw���|��\N�3'3kP�f��6r9j�Ix	*/ҹ�J�7K`��`���pkʪ��Vm���o�����}����)��
\.��%�{�:�!�[Cm�eH_�t����������N�Q�%/G^�2n��
�j�����o;�f'U
�PݮV��6�W�̋O,��"��%���xO�U�:Y�����~��G�+h��+�_jƼͫ���8	��o�*�{��w7`7��7E���W���%/,_�_�+5If�e���3����=�H�a�^�v���fue�O��Ӣlm^񊔈��2�Q::w�̕3�m��2�0�{S<�s��I��*|��F�B�5Q��\Q�X��`�R\\,_�2FW�b:���WQ�G9>�H3��"`�A5�i$��%Y��n�8�E(f��-)����>�	��vP͸��[�U$����RDH��V�P�N�TT8�9�ƞxT�Kᮽ�$赵�c#=������k�9q�e�rS�l���ÒY��fEs��t<���|�i,�G�"o:�(�.����&�����fY�����{�?�fI�h=�9tR~�W>+�ɔ=���睗?��%^�����K�D�f�1.p���$1�jCj�t�N�z:�f�N�z�]$/-��0������^�b��#@^���-��5�M�@�a]*>��7jλ����r
��w��SIai���H�y��� �S��$M��
�Տ�Ir��ǣ��ZO��'n�R��qj�$N7s&Y!��U�6��	ȏd5�YRd������"Jl�1o�Ao������er��!I�!i�
�
�LM�r�saBˊ�*��4����-��P�;�$�����p΢�Ȟ8�5oW,��"��fkaG�%[�+��9]����^��T��@��~���÷��~�S8��<�3��̓m�	�����NN��,|���
��2kW��0��ḗם-��R�6�^3� ���d>��N����˂�c��������3H�a�.Lm}>r��p�GiS�m	?���GõoQ�E��V/��;����*�� �sdc!��|'�1���شH���S�-v�GԬ�ݏ��h��$�ۼ��P������ݭ�p%��5G�f��lf�<??��E;���ʡ0�%G��9{e�N�a�=�ǭD��[ct'K*��[��ȖoŨ��Pq3�ϗ>ȅ��ciEv܍��HnF��
�r�@\��Nލƽ@�Z�ACyXU��%1d�l�,��a��1��c�G^�,?V\�\W%�"#C�$N�c�:�hdƻ���H�A����9|}p�C���y��O_		��QhM��Q^�[�I���ެ��^�$�!9a&���	E�����z߇�ߊ�[�F˵+�6�QG9��n��5����X�O�n�Ƣ�;����o��;�Ͻ���[~.����fq�tL���E����m7�f-d����x0K����GH���HA Ћ�d�����X)��k��Hv�?�����A��M"y�D`L+��U�эRײ�۷GلӤG��͋J��T��=�>�_H�W��8]U�@����Zp6O�	t�ht�]6�G)�f����R�z���a��]l��6�o��\Z#5Zr|p!
�	ЁuD��̳$�ye�>��@'W��^6�'���p�Q�,6M��l6Run�<�:�3��b�6G�ABLi���ռ�ǎu�n<��a�%|�z�N���Y�#�E5��_�n�?�E88{kk8�iG܆H�IG��U{����2��1F��ȅ`����v�ݜ)7�m��a̕�ژ0 e����������:خ@ά<�Cw�Ys���R���L3���`(���Ĺ3�/Ԥe���.�w��#n�z�8G�S�����^�xqH�������/����t��M�{�`;�`Ӆ{�ٳ�����tc�[�X�<���"��kf^�� �C\������X�)�����5_�?	��lX8W��Li�1
��|�W�/����Ͳ�0�8oO�pP?C�S��8=��m�:2�/Ҍ�[�$�(C0g������=�@w���;�v�I�7���:7�؀�1v�R^ҡ�
z�`��Z�髊�^���R����g[@P��}n�L9�盞���у���k�%�F#R�慾���ݲ��u��ʟC�!��[�[҆!�*=�@'��
�b�X�]|Q8E�����%*�����3&�[/9kVc �Q�BMZ'��&�m�:�֦�=��x�߁�N�׮L�b&��:T���Z�I�r��w��\�d�Ѯ
9R�|r�S�o�=�,���ݶ����7��i�cxMg��l�d��읍f��x< i%�4|��� g�M8��2�9GR`&ޝ0`(Ulh�TO㔑�# 9@�"�JG�ąV��|s��������,�j;{���%#��
��g�k��{�^�vc<�6��%�T���:����r�,���r��X��u��02*��������O�Ҳ�/�j	�p~slN��b�R��Wp�6+v2���/Ⱦ.�g�^?���_((�lچ���5Z�G���
o#0QbNFxNU���jB�|=������ �u��0�-燀�'H7Zĭ��@�9zD"H�`(|)9�U�S�_W�LU�9TU"<����9����H�Vl]ښCgy���#��ʲ~�����T@��E|�0���	P���Ox͝�;IN�7�!�W{!���3�;����ow �?��	)��9����x|��!����$�
�%z�v|2~�0��y{p�B�ن�y�����9~	���Y��M7
��x�OYkg�����?�(/WL��m�c����EsO��Iv�zC��6�:����9��0a�c�Q8��XM�w4�'|k��	�����&:�`)����Ž�\?n�+�_ѵ�)S�'a���.>�"��Q>
�C�A,���){U�.�H\H���n�)�8�c��2�e���������-槰�U�/+ε��T��b`�<G�NRװ����d�u��8��8={�>�ȶ�K����q������X:(��bX|
F
�&$�f��!��c���\�Ƴ����]آh�{�Z�$v�!]��aa��׊*��_�W��e���_^�{ɜnu!#B�7$�h뿫#5�-YD��$��_������K�zcr
\�B���B9���kk��	&�y�ھ�xC�k�F6���&��vhD�ާ�l��㘃Q����[0�x�}Qv�Z&��hE�*p^�y�+����n@�����;˯�j��*k�&�Jx��2ҿ��L�ُ�l�W#�z��b�ԋ�qY0�N�R)�A�,?�%���Q���n��.l�$=H"��4.��'����l���Pt�7�^���O���f
*(��1`0��!"-�Ag٠$~�'��Րe��ҕ�4�q����W�XeU&Ųe�!D"A�g��-���SH�� �{竁��A�@��C�Q!=�>cra�q0,gb �Ƃ'�pT��4?�0&d�퉅0�	�˙�Qa��׻W�M�vΣ�tI;PRO��bt�i�Qe!,����-����(��T�On�� ����Ç���Y�fH��<�����CM�'�f�A��x���ߡ���q���ه�ů�d���ޣ_�D*f����l�6A�x`�Se��Y?�R��=��S�m��G���cZů����n�A�O��둂�(�n!Uf>����+i�0��f@���5je�`s��e����Tvr���F��$�\�5�I��)�6\���CYﭱ�|�@�z�z�")� ^cK
��-���
nY�KW�0�R]��4sf�7��<�\N�x�+ӄo\΃�T���3!٢�R}��i�'�,�lk[�X��_�ծ�u��E�����v���y{�K6�s��{�+�@�lw�
9�:�'�m�η$�?I�v�5��iH>V��:�؝�rn�+��hg���qU4���U�&=>;|��oh�5��"e�M��b�	qJp,3����-x�1DZ��{�����0��F�d_����v٦�\&Z|u�D2��~i=#��^�uҥ�""9��%��mucJ�Y��m�3M;�S/fX4L��"�0jç�u8��i{X󞪮��xG�o���e���3�O���l���a��/�q���_W�74�=�@Ͱh���޷�-�a�by/�{�<��7�3A�0�O�Q�{Q��U�*͛ꞏ�c�X,�J��E,�D����HZ�����Qw0�%����L1vl��WA*�Oi��pX,��4�1;ΐ=�+��Ϧq�‘Z[��S��?>���O	���-1p�p�
0��C��|~�m^K���׈�|�w��ُO��_��'߾z������]�h�IE2�ET�4�����T����M�"�E"S,�i���~bp��w҉�E���?��)����&}C�.F&^��KF��_�g��GU�൨|٢�r�	�i2�1M�0.��4W;�����U��G"�)E킷�θ�|?��
1U@2�L��M�(��Q�6e@#dDi �!#�RS:�,%��sN$��N��,v��*��{���줂H��/dd�/YŰdm���6i��R���.<�΃�ᗪ�g��t�Y2J�~�	`UUZ�Hrg�|!���4�g��͌��U�qk���𼫩�1	:�c<��?mW�n^�<�GGO^�����WI�}\}''�ƬF+���j�`��'T�E	������Է�Zuݨ�nW/��5�(���:�ד�{~��"��FkP}*1��eڟ&|��@c�6����v�Sݜ��_��ju�R��:o���=�h���s�K�<�C/U��=s���mՅƿ�m&D�
�mT���M��l�iƫ*;�L?�년Õ�\n�
�h��~C
j��F�������V�	�!X&��$Q�h[l�^<�q���#VS�8j�l8�Ԡ�@*fԏ���~��rJ�c���Da��50��O9D�	~K���W�e�e��l�U�$:Dj�U�
��
�I����(kk����}��Ѳ��m,����r�7[{{������%{,ÿ(Tlu]�h���QL�u�*k>�S��D��8C��@��w�@<ˎ�Q�`�]�U��^��)>� ��O�o��������������[��>�'x���������0�r�D��e���zf�z��L��P�Fx��m�no�o��J�&p����ܔN���3��4�+�7ec2lYƤ�K�Я��́���u��[7�!eK(�yE�b�A��Ia��)}NJ����#�-Ho�*�:��p6�=��AB�_F	��g�'^#����?�$������FI���k����?������h��
p/�
1���i;�o4��+��*.��sy�Y<�.�u%
w�5���!8v�؆c���X�*�N�iC�V�Ȋ���0F5<gY8Q7��-�{"痳�/��V�Q�ͧ���7���y�5�j� ��&&Mq/�F[7+��S�&s��8\�ԁ�8b)� !Դv������Í��f�!c��0���A0^���6�����\?�C���<�;�Ғ-��f~6���I8/j���d���ӳ����^��hTq2�0�� �&}��o�&_�:�Q>��ƑPq�씝G��u)��#;k��u���dl�²����n��覎��m&����&y<4Щ���HT�{�zi
*!l�t��W	mQ��/ڬ1�8.�ѭ��Zx��^��p�{��Y(lV%4b�-C�T�O�U�)��u$6��^�z-��
����M���	�l~���&�;Ȉ�lF(��Ó�R�i����GL@��;� ��r���9��C���CV�(�M���� 7�Rg�d��*��	��gƒ�v(V<�
*����}?�7�o��M�@�a:2�T����86%��B�{��L2t��XS��+ޫ,|��i�|����Nw���8R��L��@�v %�5��D}��
V���k����8���U�	E�>-����ђTں���e���O_��ᢶ�V�i����ߏ�=ax_��*�XL�#$�F�^��CT�����I�:{	��kpM�H�9J����:�x��[��cXh��y<:K@Й2�t�}H'��ã�qIRp�Ƞ0���
�;���^y
ʟ>;�.\֓=�'�.'x�"��OS � 'b7O�]�[�}�,E�l�l��d/H��|k_�C~��1�ʩa�q�H�*���R����z���_rڷy��',�@�Z�u�F�m6LR>�肅P��s����^�	@~�H�-k
:��iB�����_ZjR���m��ͯ�������C�-7H�h:����a|ž�0�tq��oc�>�t��+�G���U#��1�1FrR�Kw}��XՇǛ� �e���1���6�߆;6�c�_(�|c���N8)��l��&��@�2�&�4ȶك��6��ǓM	҆��mV�p�C-P�WO��FFd��?1�9hf�Ç�*�f�L���M8����_̌�p�ch}�	���PAB�����r�����L�v�@��\�R���y�;��iU��E��*�~��(�M
upT<a
�"&���ie�6�1�L0(nr����
�j�6'��((?��O:�>�~Ž1�p4��肯s�[ۭ����ſ{�{�w{�l����C��h���r�ˑh@"��i��Tíy�Gc�Ə����8�"2
T5����Ky�b�)��	�>8�
�<���uC0�o�д�Q�)��Q�����p����cc�՚�h�|�«�E��gӏǏ7�A��8xj��Gye�9�A[�,.^�ݲ�abv?��o�A���l��\u��>�_߶���/�ҫ�>���o=���/��+N��a1h�G"�0ģ�PpLN��ju�P̩&LmI&ŵF4`�g%kڒ#q��y�W��	��k�uf$�`�.!���Q�p!�S��h�����=����R�=D����<`G/wm����0̡cjDѵ$2�d8�
�p�B=��)�CШIR����!�Ѻ*��h7��l����e[)&���EjaO�B��*+Er[�;L��x�>gLŐ�۬;�*.X)
QK���t�O=�U=p����JEp�tF4U���R�A��+����m�/��i|o�-���6������[j��65s��ῌ���R�����kN�Nol֒�u�o;b��<��
��C�G`�.��`ch�ݘ�����L|^!P#<ǰ��9GoZ�ձ�`P���-wwC��^�- P��qH�����pZ��������E�#���v�)�>T��D�P�0
Fu�2�({4`nl��N<�Ի��R�������_��,�W�r��_9��/n)$��?;�S���5��h�E�BREC��)���͛�����=�ϸ����K�����ӹԻ����͇AD��(c��b��{A6���2�$�S�ۤ�=�3�V�eax��MQ8�����m������F��K����yp��3�i(��b*-6��A�����f@lm�ΐaixc�f�[/���t*LFo<��2Z��I0i8�a��#@�|�{;k�F�E��p��a�eZ4J�;��2�ae�m^^;Ra���S���y[�����~�\
�u:�:��ٔH}�^K�5���b�@s��F�Kt�G�8M�7���m[�����A~���;��vH��ys�c>�dx�:$�,���:��f#��-l��%�
�0��e �ʪ��&H��[�l� E�!g:�)�˵�t�����F��%3
�r���LO��P���k�:���C	�V��ۊ��tK
�\8�"3��_���,v���t��?l�UL��Nu1[}B$j�W��(Z��-�(S�=��A�0��v&�z�5��
Q=����=��8E�x�v�6fyʙʫ��G^�"^�Pra؎/���rg�|��c9�s}4��Шs���l�68~�`mޝ�I:mS���$c��m���H�m���XgA\�op��ݘk6V=RR\b:�{�DtYI�М�Nt:4��A,c�LJR띲hX#E<�{P��;RP(�Ӆ��d<��V�����xs�ޛ���v����n�]��=G8Uz�����j^���c�jX����|�~Y��@�+����2�X�.�ҧV_H����5Xs��ǯW4��/�0Pt2��ی�p�����	arF�rFH7�o�))��"z ���Dqjߠ��om�Y�S�W�x��F��sg��m5w[���������@c���aw@���B~'�咬�^ñ>��׭>|�U�������9�kf�F��3�<z�	<��
����G�`����׈%�x�jD�g�s��|�XM\�����Y���W�4B����
hJ��^r�!�o��n�ۨ9$����X|�67�]v}.�����s�Xha�����O������Nl�4E�'��z2=�6�����GY,���­�[w`��P�MsiU@(7N�à�q?�̡�]�ܼ���>l!���$�|�2u�l'E�����j��F�-;n�kt(�/خ���v暮Y$f����ow���~7��J�l�?�9�˫�2�'���a�t��}N�K���s�)�	�f��P�P%����G���)<�,��xW1D�\������N¼�S@rr4�t���Op'����&������ �G�+��)Pr�B�Um��1�zџ芤9I8�2"�	�O�@�+�f�:�z2�4�C�}T����scw.X۶�c�(�a�f͵����8v�-w4���`����41�5XGnlN����U�H�D��6wT�����;�Z4��ڃ���=��G^=x]�|njy�<G�T�r�t�J_.���ճ�,�Bh��/����5��GWb��O_t�����G��₏��Y���5s/@rc�9@54�.F*"W��-#��/,%��>�nD�u�((lB0X�bT��l�6��T�Q���x'dh=���>WP��Y)t΂Ϲ�����u;#%�G�[�
6r>]@,/n3�G���VWN�V�����4Ip��Q�vo<�&=��^p�pr:��C�t�:_Rp y���(>�)Xתu��'U�*�<ԶE�&���h�J�j�'�2�GjNe9N+��A��55�nB��|���� dw�����ƄJ-�AL�$��3Q�
�n��*&�a�l�a���o�����E2l�Y�B�A>I��VLP����Vܦ9_�f�Ԍg~�x}�l�/dy^IaB�B�n(�
,E�Q46"�w~�w��&�!�E4`��<��l��Bip-�г'o^=�������t�ƒRTKKK�&9j(��Ib/��:���9���ru4�+�_�eI�=�o	� �g�:�t���ݜbK_�kW��K����a�6����#���ˆo�k8��폲~�Ɂ��)Q
�]�V��%T%��0)���$
AL\�ٸ��(0�X��;;i�l<Ǥ�,٬�c��'f�K6����+��ɟ7�[�yx�˟������"��*jn>�4c�gȵ�W�A�r~�$@}��uQ���Q5c��U	Txt(�pB6�kmA��K�U��a#&�=`AȺI
H��3��$e ��,�k"&3W숚>�6mg�=0|�)���WjƑ`�?�	�k9���W��qD��Τ?I(0o��g?=}���7?��K�7�-> FۺWY)�F�q�Цj�Q�D0
+�}1W��`"�n�
�Y�ĥy���q��<v'DZ��Űl\����K�x�R���,�=b��HB74%N/�I%멂����A�����G x3����;�ϰ�:�^�H���)�i�����T̚�B��{������Cv^�d�ғo���.�=��oF���I�:'�r������?���Qt���c�e�x�4؟��#�Q���yg��<G	����`%R����ڶ�ߤz��v����d���a�\���!�ȇ&�B�/@���#ZDN&T��ׂ^̶������SaG`/`�;�r
�DU|X����m��C�0k�'a`
%I~FvI�Μ?�h�i��g�,��o������_��v8Tq5���D�y�Y�SN�+b���Ƃ�o������uxx������i���Μ�	�Dg���Z ��ِ�后�������eͿ>����+v�0�����Bf��Ɏ�o�)�m�7a��=q�_�h}�HB��Vl�?�'������/����0�%[u�A�'���Ď)��z�[���G���C�և`-e?(D_~iб|���9��\�,o:�KIQ��s�rp����)шNӹ�����WV0�
uM��di�yB�]�;ɩ��ED�sta����:�JΐO�x��_�Lht����Q�h|9�dl[�H����}�Z�ȃ>!N'����!�;�GJ�C�%eֆ�:XL�#o-��j�6+/�]�3�/H>��݅��=!L�+��/p�&�j����]�z��'�S-��k)�6�s���ܖ]w�<��f��o7�+5]~f�yB)wp^?[��q�t�+u��\�z��.��\���y������/8@9���H9��{fA��}>�'��oE�o^��ݳW
�'�F}x��Dh?�w�ȏ�͹���D�:Ն���+�@R>�:N�.��[��`@Y�w����[1�
��xv�("��h�f�a�	�l�5��� �X'�Й��jO�<�ApBԄ0
�d,���;/˅n�+��[:S�o�{���l�,8MTh��\wb���d��!ܮ�V��'�A��";3mo�;b��|XܝKt���[�[��O9�_�]���޹����=��>A�_.w�����r�?�������/�5���p烷9{3+�&�
�����カy��l�K��%�n���a�3�����3i�c�a�We���v�F�\�hv��r�̪�?V@eka
�8$ih�<lWiXVRI
Я⽙?�,f-���
J������@@�-F���U
�uݬC��F'����4镁/JVL_b��]%i[��eg�u�Ĥ�Ϡ�Yt�*�<�/�w�ՠ �|з���,�͊�A<�X���Y&�F����%Z�HՓ�4c?$úL"�qD�Q� 	��{�5�*Z}��.�����Vmc�����/����Y>��_38oI�韶�w�m6;�w��mD~8[�!���`��T�Halq�qhe�3�f�⸤�E�;?�=+�s+�M�l<�t���,)g�ܔ��@?�Z܍�5E�A2�t��.ϊ��VmC�>�A���/n�@��-���\=Dn�}�y�2v�B����R@�U��Ʈ��O4G*��XBr�FT�R���儇��IO��>�/��?�W���JC֘�u�z{�����,jK�\�
5CDg������8~WmCyem4��1�2+���aP�
>��s��ǖ&����_�eg�Z]0����h����^�f!H��p�d�"/0���g>g1$ڰ���}�A����U�0��W���k8�h����8�r�Xˮ�
�f�K(}��,�ؿ�)�*B^<�a�ap�gcN����	 �J�������Ŧ��Tx�⭐�̷Uӑ�nר'8Qm��x)#۴��PQ�P51-����a���x.��%S�6n}� �|꽷c�Ȟ.�g��:y�Wh�N5�@�6�;���&�����$���BQ3�-@xg_�F��U��̡���I�1��0m�˱�K��،~F^�9ˬXK?H�ר�s�{e4F X���q�`��Bo|9��^���Q��"�JRB��3͍�6iB(�na	@m|�G[�S�$�C0��6����K�\'p9����U�s�*/��S��Y}����}�` �aMܳ�Ų����#��e���)
U�0H�����N�Qz��H�B$Ղ@U�%�0/�e!��2^eq3����d�]�#�)��	�T�z�o�j�.��̔
�hխ��/�"�o�k�='+~�Ճ%0tGa�lIOU�q�6Ȟ��M�����P��7�K��Ni�T⢆�O��O�p	`�_��s*�.V6+���(�d�8-�''��Y��s3H8��'�����+����$7Ë@Y,���G�e�ӫiޭ��i��vP��k���^=����7�^���� c�Ku=����1�����A��n]��C�ʷ�"<8��]���7�Y�lW
��Ϟ���Vm3��k�SG��a�a<z�[e�w�I'�Q(º�>7��6DW�~/�7�����:Y��m��������@��*����@+��Җ���(����0��	�N�*��F&�����m\;Y��ំqz��m�p��l�nd;#��ho���"ґMN�����l�~�
��'׏����0_d+3�a�����NIJ;�y�=Rκ��~��Ig�.�x;��dQ_�v��7H���
!qVz[J����pq��>�!�O<"�0�L3��{�ݭFYڍ��^��t��Uk����z��d8o��--P8K�t�b�0'8�$�0Dב-�6�d=�fWG[_�F/_�y����o�/��'�g�����ĆP,�ۦ�&Yv�c�gNi��#�*����w�w����c	�!,$��_£�t<:��hcsŌ�[%xaZ�M?�Ŧ�.z�y�#S�M×}�ۺ���������o3>�h��>�(��S��GE�[5tC|�˺�H�|̹�]��ט��3]���2��:p�=�M�:7���1$�|n�;57��2�Q<�r���U�x��c���!����f��3<�b����[�����<��f������Ã�{�����ŗ�ZU��*�d��#>��A�ۄ�	��x6=��&{뾹LN2~�o�3��8זּ�̝�J�)�ҋ~���z?œ~��~ꏧ)��Y��(��o���ף�=����٬?
�'�i��|j���nBV�/��Nk'w�8$:���=��C.��,���oRY�^�#�#<�n�kHun��:Ł�"��(��S�}!�/z7�G��ⷧ6�5U���b����&�((����߾~Z5Mp67�m",��?���V6�l�˶����#{����j����Y������"H����kN\fl8M�3֋�3N���	�S�I&��`Pt�4*�=LAȏt�d=���Ե�4aI��?�	d�Vm��!
Io�|��ȭ[�����+u�&زXr�<�6�~��-��TQ��3�{t��w�FAZ�h���n��¸h^�`���QΚ+YR
E�WT9k@�o���as�A^L�*�S�@�1xp��y�����(0Qt ��hd����W�f}�g����ӵ��[K���8R�R|6��`�"�C����%!*-�9�։W�nu�+�(���:�!�v��tEg���������w�?�������n�L�R-x�I��ԃ���󳏶՘��	SfJY�R��F2\��=�
XmC�Ciѱ�LҺ���s>�}�І��]���ڽ�4[Y����S�����58��͋[*�8��XOW�UI@��o@8i�]�tSw

��ٞ�ג�;��d�3�q�e��d#�D�V��K9��8L���gQ�R����t�F~��ʐ�xv��D�d��+s��d���:Jx���F+��X���`|�`���خД2�P'?�c�~�t��Ä��"�/������-�"F��E]@wO)'f�6��K>����OH��K{ǽW���������56��KQ�a
M*���غj�6�	�Q!�5Y=�Z�N��̰Ma_Z���rğ�3�`�'�k
��MSӅa�(����_K#_!��������<_Y� I,�3�(�	�"M�T��;lF�c�I>bZ��v#��YQh�ك����]�Q?�^�
Q����l+���h���5����9��*�|ЪlC�2�+m�8��c&����8ʘ���Q��6g����vP�y�^<4B�߉>F��rU�yR�4��i�f$=�d��b�/z� �&��	�Õ{�u �7���31+ƸB��or�~�Ǩ��c��"��-8/̸�@��3x��iT���@ps4�'E�q}h`��d��m�[3ɬ�n���j���A��p��F�[#m�]�^�[D�EY��|�yt�f^�����1�ť:�JD!�w=���Xy`Ƨ,�[@m�Q8�9�������I�k�4�x��ytu��*���H7޾
ڃ����6�����铫.~"\<ұU习�ҭǮ%��_7�M+��݃�L��{Є�3�7��9��T�M��H4V�{>Ca�A�*~�]��?7#����!��>䥡�o�|�iV�C��w��֑��tH�Sd�\��5тa�CEڏ��MHvuۦ���P���5"Ej�����g#�
Wu�8��έf6�jA��.s,���a��1����}��?咂�Õċk���(�G�-}<<0]��06�%'%H
�6��%1��L��j�
������ut�V�S��t�Ny��-��sgg^T=�px��+���*�-�F�"�p]E�F{}:�T�c̦l��;(�8X�V"�$_p���i�����4�G:�&�1!��0�ĥ�z8gQr�t��U����q�G��S���q_fT�E���� �u�x�or��쌠����		�/����w`;��E?�#��3
�t��L�䥍T5�!�W8Q"g�8�mY�7U�%6��<x��h��6�;nnP�$�H�o�P�!��N@!6�L��q�� m�X�_,�^(.��d�,J�<�h��"�m�:
(�@��R�EIU���i<Qq��u\c��ݺr�-�$1��?"
�y��$M�dzlpMB�=���|��w���jg��^E�Rd���&�z<c�~��\��s�e�zO	.��ܱ\!�)��;O5�!����*�F`k�x��ȇ��M.�km��yr	V��8i$G��t
�X�����*�+��׎UŖ�C*:�oI��^h���<ji�zA��L3'��ku9��0X~>��uŷX�(!@�
^����ΦlǠ�V�	J%L�9$�t�h�=.��Tԃ�IElS�,���j�f�Y��dh���� c��o��Kl�eXc/�g)���
V߈���3�G�7X���{G�0��ͧ��A(�|I��8��d�>����f�X�`$���e@�"q>��u����l�ٳGlւ���[uuUu]��kQ�K���l���_��x����2��xT�:����͜������t�O�2�!�fE��y�]�_���ҕ�Hd��pP���^X	��h%���0�F���;���i�;:O㼉�LE���K�!�oo^N�G�ZR�j:k���N�.�(b�����x����|�	g��Iya�JN�GŁ�
��9�83#/9O����^��>����4�9����|Kz9X�n~��V?У=��lz�Z��gd�.n�kZ�f	|����ăd
-�eJ�����I��#���_7������ozc�!l��3Ե���j#��{D � lD��ƮЕ@HjJ�)nҫ���	q����|��b�[�^/�1/H.� ��H0x��!]�F=�&F59�5%�H�Mq�xq'Brv���l�E�xӶ����P|�1TpGx|ɑCGJ(_�]�l+2�������`o�&��rߔ,�`�E�?]|9h���"�v�s$�O��d���&>���������jeQ�#<������
{�I,�<�����E�D$\o2͠l��*���g��1���Y���%7)W�4Ʉ�Q����缝ێ8���4�9�1�W� �ܔp�|��f\�y��e̞y�MZ�U�=�v�(J��+�-���'/jvTM��4=z�~��p�?q��<�e��ux0j��j���
���s1��r��E���p�)Z��%������'���C�0�>Ԗ|�f��܃D��-	�UX�E�*�zy|%gm$�M��.��@�z��NTxu
F����e-�>Z�_����ΗS���1aZ�|�]�t�`��ڪ�����'�$<ڢN�7~�
����h��{�㤜t�3!�Uw2�� �((?�{��'�h0��r0ا6r�w} 9��F���{A(���Ю�)2������L.F��AP`�����*���lp+r<8�v���c�le6;ZR��a�8I�&�j4�r!qv<���W�.�Mk��3��4��A�
���󑍂Qc�yP���e,H���Չ]���hũΌ?G^%y��{�V�va���+��4�@v�����=���}��z������'F|P�!�Dq�i�RF}(�
qrW�f��UDh��Ɍ�n��s��u�.��ˣf��9d}s<=�i�5�Nc��S�
�ւ1��@���-�5�j}�P���!�tқf(P���[�kf��	@����ӣG���?K�

εXW�����Á�7D��#�D�ȗ�������xh�?�ʤѓ�W]'��d�V�d���p[5)�SۡƉ��E����J��(�]�%�����l�W�������R���b>��gƲpZ�Ù\��"��q�ЄR"T;@(��DV�ل�;��PU��kn�F=�iQ�W|����3�^�taY/�=��a�Nޝ-�
��P�c䮑Z���"����.��i�W���2�?�1:��=��>���&��A/ݿOwQ��w\ڻ��qc�D�Ӻ�w�^�:ip:��G�܉���陰�[�$���-R��!cڮ��7�Q3�Z�e�7�y�Y��T<�X�<��d��.�يl�l�!�V�u��`V"o�깉�LD"+ة���Aw�]��q��$���PE� 6��� ]�Grm��>����{�;���D�*��W�٬�\��́+��'�U�LE�5��K�Q1As������%���a7(yih���Ab����u��J"_AA�LMHR����N�@�Yko;����l�0�z���V�G*���.Q�x^�̼i�J7R�0j��Ɲ�\�jl��`�Cr�Vy���v��c�T�+�KfM�aJ11��0~�;�`�N���)��Z���NI�������H9��b
(�aͩ���|�z�[f��֎J�ܺ�r��V���z�����08C��'Z{4��}�Q��Z���^���t��0���OQ��m��߶��@��q �M׌lB9��+,�y�Ȏ	��/�=򙳬tfl%GBM�]�u;�c�*�>1G0�;�OT�t<C_Y�(^���l�Ͳ�P!dn�"�}�I;U�W�h�5�n����x�P$�$�
N6(��� �V��@=��[�0N�iM���^��wlB�� L��p �Z4F���	����ߟѥ�1��Ob���+������a��h��u�B�[Sg~�1*�~�&ӂ�xE�rQ1���5T�Y�j�$^&xt�'ݿB�<��Gu/@�h��2��������U
�:o&��Qu�v>�^%�K$��c�$\8љu#���:u��!	e������z���#"Z��I&$�F�F�*yB��ܼl/@0�Cg�7���5�yl4��3���L\��"��`D%A<	����t"��τ�(����9k<�7�Ⱥ<�yss�qS6�c	�Mf<mp���g,	􀒉�S���7A"���M`�rJ��V�>.Ȃ�B�1���„����[.�x�0���tr\�5��tv\�K���A(��rUAQ�W�U~1::/������'|tzp@C���[�lV�v�nWќd�~J��!Ƙ�9�����~��rr��*��V�װ'��N4���5a(�l��Rɛ��|�gH\��TK$>.��ձ����4�k:�O�����~�}��k��M������!�V���V�J�l��B��Ʒ@��m'Q��j,�YBV�`)'}6�" q`��HBF�.! ���+x;`�(t[���N��������n�0���c0�������~4�tJ�3��)��@���:�����fɴ.�X�t�w�K��N|evޅY�
�c�o���0�l��bѺ������ԝ3��9�Z��f��;�Te1�W��sE� ����u#<�\f�g&��'U���3��:i�%�[���Oo�g���W��k��=4��𧩖0���w��ӱ�l�An+�gS͘�S0��O2�h��+�E1|t!̣i ��I�8=L���Dx������\�g���ijRtC��m�GE���e8�8ݦш I�M{��H0��6��T$��/�q�sv����^���1΍��
�I�7�A��
t��.|5���$�<J�:�m��7���]��@�.>��ۺ��wv5����i��`�5�/�K/�vx���ɢ�
;9LG�C��V�)'�ٌA��N���S*��T�@�/�]�N��fa�v��x[����6R�A3�|
�7d�<����l�lS.�Ҟ>����(��!���ح��/�@PF~��	3�����隞*;l3!��Q٪��*���_M�n>�?��_����e������7�g�D�8��|���d�IHI7��õȆN�#���M1-�)�|`s����8�{M���qo�ʈ��ˤ��ڨ[ss�t���6?��~��6QS>��(�"M�)Zfhݹ�d_�b��H��X��@���4����(��y<H�#,��)�8KZ`�;#���Ck�.k8��sb�XtvPX�����-��:�r��
���W���J�E�3u�W��`��?�K��b]r��xX��Q������/$<H�_v�����	�ꎧ�~o�E_��/nؿv"�m����}�U�Ս����e��˸�6�� S���g�
<*q^����zfeO&�k>�r�S�RRa6%7[$j�դ�O�D���:۸�w'r�߹ws��O\�'X���Y:�s�2��}��0��B�d'��[K��Á�e6�}�����{y��,$b�;61�}�˕"T.�`9=Dv�T�/?4C���ϡ��t�a�(yY�I3X�e�㺋�1.��4D���<�@Z������.L�h�=�m𢥝�B�|7x�+	l�ح����qh��oHO�W"�,����-ZZj�)>�.m:,X�Kh̎@���"�GxK��	�l��,s�R�M��\�o�`2ײӬ�Eq�`z�@�b��N��T�Ӄ����u���")��z9D2��S 4XLc�<0��m��b�Sͅ�碭5�����J�X�s�?���$��`���E�i�,��n6E7���m[��:��G��r1�p鈜H���.�;���:�X~���������9�?�'z�[��R}�������>��:��l<���J�Yڟ��!��+�bjaƈ������/��D�H�X�%U*�(/ŀ�_�Z5��B�4�0�����PF�b�q睮�={�q��0���Aj=:To��6�i�wi�M\d`(��u6ⶐW
%h.��)�2v�\��2��|��ʂ�Ɣ��]�/�"b]�0=���a�?��p�)Q/�sT�m㨣�cj�o�Q�]�[N�/^�ä�t�@l�06�%W�d��u��k3���(42�X�zy�͆��9U�PS�Q7��Qª���{��씬����
�
�`'V<���y�r7��6��]��o�m;�ߩ�S94裘��ޙ�l;�ɯ
kN��~�E�P��3:���7>�]��{�af/quTֻ����4T��_��VY���^:e�
$�E�wj{Q���쏁���Z�[{5xp=\�[�77�wѹ������zГ��~VonT[��m�x�|t��o[�Z�|�4$���0=I�;;�H+u�	�(���m035y=|��0�O+�)>�4H̶F<�
?����͏��*�~�Żb���Xw�$�x�Ҕ+oݷ��D�w��7�_ֽ	7�ؠ�k�_��O����Y���W�2�BXޢĖɖ|��Ǘ=&���"P��/��7OD!2��qp�,v��QED�@�ك��>���p6�Qg���EhM����*^٭!J��ի���J| ���Ւ��@Bj\��QH�O.?%;� �Wu��
�܁�.jsN�#z;*���I:��ܱ*�a�Þr'���|��vm�G��i62v^ֈXx�`���<E���C<�bfU��H^>��OO��
��~0W��}g���C����v.�	�c���i?�~�%Ca�T��z/�ݠ��#�)4�� Z��p'S�aF�L��l���+Rm	=d<��(�CyaX������Y��77�'��\���v�,¹��K�}:�u�̺�]��5��v�b	�e�������tp�7-ڌ�`Q�E�͒V���Ķ[�}V	ݹms�I��;���Q����0�[�͖Z$����������Lb����כ����_�&�7=�����4� ���[�Z-WU�8����0
ͱ�W�.d��G��2F��H઄����hZ��3u��=ʮ7;�@*3���=j!�7�t�6+k|b�\"��h�����f0��&�����᩻uksc��8����OxRtdx���,T٧�Bk��g�H};�ǽ�Wa�
��ƽY���A�K�c�OlBq�-�N�!ޒz�����s
���]5�?��i���������m߽��O��+*}���Z���H���yv�y�Z-�l>���~���t>�Ȕͧx#gb�5�{��l�-
>�}fL,�[aS.[�hn/�)�.�H��`m��(?��������Y���[�
^���c
��m��
S'&���
�x����	{�|	���������0�
�qoz����`_�7:x?x��р���s2^�9��.����x~yu��|�v��<Bv�/o��[�w=��&��Ջ7/>^[ەV]��ځ?�y��g��n����W(������_, Pc�e/]�h�om�[?�k&|q��έ'�CA�hq�έL�:�����յ��o���B\	��� ��`��(���4�X�$f�PoG����bG��F�$��τ���4
H�w��������g�O�U��cg�Ss`�*�H!O��{�H�>z9m����7��ô7�Ӯ3#���r$��(V�Q�����.���M�tj��Q����!b��?��ͦg�)d0�
YS�G�|ʑJ�̊���J&R����R����͊��/�|p)Y:�b�zQ!6Z:�Ώ{��Xq+Kt��nSm�Q��K��za�Ic��gLØ��4<y�����U�6�7�s3�%�7m؍�	������@������ǿt_��Z����	�P}�n�RTs�Zs�x��AG\���<�����}�E��çO�p���x
1q�5�I�1
��^e�	9��}gD� C���ˣ��˚%02?�X,��b�����ht�~��hpgP�l0ؤO�7����cj�Q�!�~�U\d�7�ˬL�d7oE��E�0�[59(��5$����#���4P��c�	�������rpm�l"����W��S�a�>�j����s�0�4d�A��%cJ)T��$�H(3"�+da��},R��S����^�X�5���0�(2����H�9�b��3��9@S5�ݠPIORL�y��t��n�K)����8�p@�a1�up��J�k�MG�=���m�7�h��^�:�כlT	��3�|�Hb��4N�o|j��KjU�ٲ�i��W�_�2����h��H������qdAC
E/v8�(jUL��0e�@*���p���겎��!⡖Z��W
XNR��&a�7덲x�xU�W�����i�$�=H���y`����%�<NiP-�j������u026��g|��^Ǵ��7��d{���)k�~��W����:hv�/��H��^}�:���������p��X��<�|b��,pV��\s*����mc��:Vn
�(YG?�� 
��oY#��ՂZ�J~?-����K��m��)a���]�e����N!�w�P�p<���X+�n*���1H��E�QnJ�kO�b΂�S�~b@3�T�߆>�_h����8*	��U��"��q�罃�H~�	�[p�Z:���֒gu�M]k��T9��'ۈ��l̴lЅz���
��|:dj��YZ�B���)(_H��>ټo��Óc�
��+:�)�"Џ�����a
˺Gz*t����x�d����U�)�-����`ā��?��ͳT�����n��oCC*�.9G���ņ��L�5���?m���F�=���7~Ma�(N�4�l����a�����e�����(Zu<U-��J{Oòp��종�{�W��N�2�m�O��U�1A�����Þ�A���o��3Y�k����ײ�$j�!K����<8��=���.�4�viM�c�~��X��{�a��4�e!���p�`������즔ǁ�1d?�r�'�d��?�����1]�uo����ݛ�_��Sr�����Ml�*��ϟp��&��&��G���CC׽������Mi�˜7��7�N�^�q��\�8�9�i��n�*��H�9��f+97�1Ta�M�ա���kl�����u�9>n/�Q���8)�fg`[O��&�:B�����+=���0s�3]@Q�t�@#nKoጳ��Xeo�O{#�Cų?0^��*���O�8�s��ڔ�/uc�DlBW0 ^n�Al��>�7�ڽ�J�Nm��1)[5�M51����r��k��!�������<�O��q6Zǂ���ݦJpI�\��wpu�z��G��5�t�7�{����{w����������_����?#SN��_ڌ ��'Ho��h��.���گ�n�)9aM�lW��,`;r�$#���ްOAE�}J[��Fә��8�qS�3�-٠C�����3ɲ��v����vԂ���図q7�8`y�p��^Rmm���Z��/뻭j�C�u���
;���|��O��l���j՛�^>�O~�L��:)YC�cͰhL��/^?�����T������y��×O���HTR�~���{�	�mLj�h	�?��F�j��`��.^C5�MZrH��sJ�o#KJsYx���wx�ޭ77�-c�6� �L���	GZ�k8���g�f�~�Q`������~y�}�z>��4�zk���M�'#��_-�k��%�G�l4�q6F���}��/-}����M�|���K�����?x�E���G����7GdQy���&�i�r��F^����NO/Ot�D�ًG���ޏ�ģ�?=x��u�bNK8[�#f;쬈�^=����ߞ�z���o�T{kK��ݟ�<Ŏ����44����O�JJ$vu�E#z�{����ىA��&��~>mV0`�sQ-k}�e�Y��^\�L�
O��E`Q��={�,�O��.F�	;�TBvT
�m��_��۪M�'C�/ͦ��g����?1�B�\g��߽�.�[��n����K���௘k�t�a�����ꪚ좢dlRlc��)��7��;;?x�l�o�����W�<c[~�l[��m�@�s������Nk.�W̄��ЩD�$���d��!����;CB�q_�FC`�<�
oѬ��"�`�L��8��m�'`�,+�Kdf�'Q'=-���L�y�/uBa�N�����h��^���j�펾��IG���4Ć���)@�M����z��[EXg���� F�B��(7�j4�"��֧R`:�Yق#���%D���Vz1��v�(
b!6��I��/��ۿ�!�4.i�%t	׼�-�c�o��BW�emT�#;��1���tv���Y�?��&�Ė��ݤ������&�oiS��궞����>�v+��V��X�=�݂BD%zq�_6�.��I��F��ye�ju��w0LOǽ>RÍ����u��I�y��"Ǧ��c-�����{S�������P�͒�O]p^�˲M@��Wv��[>�׏*ʾ5���"��6=��`�zۤҎo\�Y^ī|6�g��H��R��vپƃ��{�1FP`'Ao�*��f^u�V��W��+�d�����"�0�Il�+���&���b��|�C/�s8�{���"kI&�� ̝�<�\.s��N4��r�ved�Gu����9��
s>-͔	&��	�cJ���F�M�8�}�$�m�0]'dۖn�E��z�k��n���h)���QY��xʛ��s��jrq���LG>�I��#^Ok�g�Xu/T��v+�a^7ؑY�O�z-K�z/��f��F$��l�!r6cn�<տ	�Rr����o���.)�&"��\$�������3��Vdt��2��T!�`;\�Z��߲�?��HC�A�&/
�7����\$؁�XU�H�:`�(=%o�܆�Xqy�ʶ/�F�_'�N��a�J����	n�ݙH>�RF�)�C�JK/rK�1��F�ǖPd�k�4���iI?a��>�e�u8[�������pwe�-A_�#W��K��t�'#�>*������3_3�(�†�&��J���l6�i���&2����9���7��-��
B�~����w6~ME��3:ɠn �Z.�`^XneMB-_���⚂Z�f�)Y�q��M�����^b���

�rq�>(3�'yR����@�Q��X�W�15È�E0�᱂Mx)D�\o��'��U���E��(鱪��
�J�������^��U!K�;��o-��$���a3A��#�s�{���|�O��p�hB?���X`��*0��[�Rj~-, g$��0�a9���[����;�!����չ�(ol'� ��X�]�I�JV���>�,�5�k��Q��9~�e��A>bR��	�z�͛s�j�r�]2��T�v[}���=.�cY/i��|���~�10��o�OGH|@p����p@�7s4����84 �&���
ף��|2����w%8����*Cs���ߟf}t��!
��Ś��`6�S�%�cCJ�Fa�5'a�%����I��Z��1�J�д�1)����@.�x�)�z��h�ӋF���ǰ�rS����rV��������8\��_P.�k�e3���l'e{ܜ�D-M#�&�V��!+����zÖ	�eU���5��ך��V���e�;��j+����/)����K��ݽ�.�޾�}s��>����x+"��o[�������I����=��i�)�696��lլ�S�����iZ�����|��0ý;��L�>��07Ai�~?�F�2�M�8��N�[�x@��}-������xz�S��+؜z�i�I��	}��p�b �݄�0�ǻ	l���B~<)wj����]�Q3�������E !��ʍ�t<��g�l�����UW��m��34M�'�W��-j<��M��_���1v�,�φ��ٟ����3�E�	�����t��F�2���!"����8.sS`@U4��T���U
�D�-z��wW���M���]����SU�h>f�m^�����.����8��z�� ܧj����u ���7��F>�K���Gl�M3{�؄����^���O�\.��t�ѣ��k����l�c�n���ޒ����7)��>]��B0i82.�_%�!E4x�	��0�(v>g0��)�K��j���)^��!��a��U$h��X�!�(p�
{�+��������)�C�7�5�^e{1e�K��@�*����Q�`�Μ�_YǓ��J�x��0Ƞ
9�kIe6�A�c����YqI�F��������Иt�hCO�������4
z�����vr8i����gX��2=��:pe'����X/As2�gzU�5D���o����t:J�Z`�`�����0���i3c�`	�Z��f��}|�֣tg�$o�~l=}��?�_7sv�I�k�^�d>�,G?j���᛽�h�<iq�{Z��2�H�x6��~3���x1�[���a��zu���Zz��-�0��CCX�:�Z�nomߩ��
4�t�௫fr0jT.NN��h1>Mt�j���)=I�(-*�r˥��+5���K�;;ީ��a���9Y�]�oS?iҫ�o}鄕4�F����	��1�Q���0�OF'i>�@b���pC�ؠ��2<���,|<�d:Ź�.��^"�����F������~u�1��+�Z�{Kȵ^���ﶾ1��v
��5�����I"M>��`i��b:��AP����^���n���N�_�~�\ͳB��"�e�ZR�I ��ُ���l����×�c�5UpX�r�}��tF�L襩�Ѥ�����Tt��{�i���t������yz�Ć��d!�R߫���|}�ޝ���h������: �����L�:�;1h`����Q��N=�w����˝�}3V9��
$_���[�|վ�
���?�J��`�m���0�6p���͎Ї��Ng��V�޴�\�`8��I�
=�H�XJv�y'�H�,��X��Ì^��Qd�`�PN1oi��TL}��40�+�=�v���	{�{"L4)��&��r>��<�zr	��ƪ*p��S���Q��Ѱ�3͌��X�a�����&|�`�
�@#�}��l,^�'
Zq����_{S3��cH�́%5s0���bm"\��lf����y��V/�r�\.7�P�r3�|_D�Ֆ��w^i���J�Ah�����c.aҮ��<o�e�y��?`��X������`��)�k���4�L���UO<:��AlT�?�8=��"+��S�TY�E�����z\�
XŤP�J�1i&XbZ�5E�p7܀{�9W?�<MO<94�U�Od�ժ����!_�Ud�K@3��{jM�Y����Ǔ�t���∪(����ŝ�;,��t���x�b��t��Ț�M{-�R&�����`�	W����n'QI'	���ZmE<±����;�<C�R��Q?-n%�u`��R����{�����}C��~NJ��)3xR��o�`��O�Q���S"���HM&���h&��i6O�	6c�ꖝ.��F��6��D�>%L���	xt��GGvԢ�16�u��ߎU_K�ݏ7M�12������\eV3K��x*,=�x{>>U��������'�u<��x�l֌jN�_A�K]j6d
N�L�܎%����{wtq�1���)���۷OF�c}�1�%\[��[����5�O�s�V)E������<X���btZ��f�	�eٌ�&4x"�h1�fKD��X
9JV�Pv�����wpM���sI�����E��۷o�?ǧ$��v"�7:���}'3��7�'���z� ��%W���t�E�"V�7�G
�uǓY�ߐ�g>��ŕ�?q�o2�c^�4�t
�Tv���	Z��7;d
�Vtrt�ZA
��RQ^��
۠�+�&B`�>d������s'��$U.�R �{�'O��h2|C���(��i*�Y�f�bR�v��ƾ�:ad����0���SH�_����@s��w,����;����L����'J�i���W+؄�9-[����x�c��)F1uN`hQ��p�5BI��m44S�O��Edʶ����g���Q=�����`)t�8^S-!��6X���:=v>46|,v�>�İ�6��	��{��SZ�����o�Q}G�
6�VN�+c�h������.���~V+�-ӳ2�R��G�'GH��Lo�4��h��9%p�йjf��|K��}!?ڃ�f�*q
j�q	����u_�����Rw�#��@����I�c�S^�Qz*���ܮB���ō�1a�Uh�X�1G ���DP���C�L\7����|I>!�DV�J��93*J���ų_��61xi�(�Ҥ�����!��)���X��h,�͂I
59��P�C���x�L^<$A59��B<�91uWnS�5
�+Qh��it��$��1CW����k���*Y�6Z�D�����b�^�T�jƙĹ�4�,��>ٌ�6�ܳ+,c�=Q��}��(��]����@$���+�\�z��OӔZ�=ٕ�c�B(�ERZz
��5?�ac�G��׹�[,\�簇貜��C0W}���:��O�,Áe\�P�Ǔ�K��WmLܸ���n�$*�O{�v%���L����Ѓ,?���i�1��ͦ��f5o?�:}L
�%�b�~3r��N	Yr�o�!�Rn�q?,읂8������*,G˦�v���t�\�\tea��h �ޚ�
�����稛����^~ij���4Xn����K�e�0⯫x�[�����q:=��o̍���;G���h��������t�͏���7��8@;�}��U�����wc�X�l����x�`+g���[�K\��K0$p��޺svQV��~.Ű����kԈ	�J��hV�k�	B"JV�[-w��]�t�D��)��a+1;��E�K4�Du��i;s|4Ȧ�1����+ ����j��0��Jn�vx�)@�	0d�����#�M {um���:X�b�,�}%]�a�#~d�P��-��4��w�<����%�n8kM�#�G�z�j�� D��Oퟫ��^�f�y�K�*z�%���br��>�|nO���%��E�$�B�����fl@�l8��ǎG���͊�I$�#��W��#�2����7�83uox��;���WgY������*��&Sd#Be
ϼٞ�'�<��>*H�w���`t�Qz�eg��4�����V�0Pn����cA�D��z�ږ�!]��a�J+,�}p��M
&�b�o7�������8��h�`���x�Wm	D�%������YX����͡d�Cp��.lH����,慈%6S%����սg��P*�>�^zLH$�jpe�X%����͍��j"���%��u-4�>���pFf��ӪTd~�D��iW�mTR�.Kt3�T�e�4�f,_��$E-y������i�@��"YZ��E+���mGR�O{_S@WqK���D���T�b8�����&#�U�}���|��a�?����Fǔ�cn�)�[���yPo��)�`�E���:��
-��q��U��Й��2�x�.��c��b,��ͺe�2�GcOÃJL����$CP�(Nʲhr9�ܺ�ٰP>����Fǖ_"�`�ft�96>yI��4�c��0#莁RA�8����3���Ĺ��7q����3^"�$i։�?��3��M�g�~�‡��uT�q����I`<�Qa��8���U�%��Cd6��
�[�ܻ���ռ�O��l���
�c)UnV���	��N*�=���p�Q�؂�W�"�ZnT�X�
�XR��~��_�Q���kk��߻����m�����W̊6�kn����6(����y�u�a�NLt/��Nc{����Yw��fFe��h���&w5_Pm���
O�)�|�ծ��Qv�����jEC�ĥE�'_����o�T�u��*KA;�l�k�t�`
��ȅ\Q̐�z*��:��T�]�
/�^K��w��j�|��n��pu���ϱ���b~V_E��N%<��5�z��'	��v�ic�uN�E+T�ϵ���Z��z^]t����u�������nRw���fG�DB<����i�Ǜ�M�S���O�g㙆����x
v� �R2Ԍ2�$�Y��B��sHd�+���o��4��앂~i�C��sHC� X2��l�����hN��;|�̏}���˷A��}��`o�-g�(C~B�C�/�.�%����N�1�+5*[�e[��
��rpSq@� ����:fٸ��v����J��͇k,��KR�t�ioE��N5J���Nj�BHK��[|�Ш�C����H�@�[��P6�Қ1���9gP=[um��ז��d��+h�i�J�S�+缸�IWi�l�&��Z�V�VǍ���v:�i�	g��+�gV�IGg��q�������t�\��D�4�(̐bЃJiH��څ�N��"z'9!p���n�}P9E��<V�_�m��}���|t�	���w�݉�nk��F���?����"���8�?4�|؀�X+:1~���l:���t�W��t
�0��;��i^���|��Ky�KH{Hv=�1�"�5�9h�P\�[��hm�B�?{[T��0�¾}��J��eC�fh���@wUh���nY�О]?ol�$��"�9㧨!u9�<�,�⠃
��V �Q�/.�Lw�Lޘ����nb�YTXQ�a�A/��~��1��Q���S�#���_i�g��q���Ф�7W54��ʺ�5��6��A�����,�~��ED���X��y���?DR�)�%���y4[�{m�Y�&�'g�㡢�V���V��ɘ�X<,&��v=V��9��^���v�E�|<�{�'o���E\ܨ�F���^�zy��8��0K��2e,ҷ��u`���"���
���8��z�]V�����g<^
�G&Q���p��I�{������OM�(��E�p�J��7kj
ٹ�M�#���iil�g�K�ܲ����z�PÖ��˪�C^ѝo���z���o&�U�_�$�-�q}z/�>��'U�z^c(�gb6�c�X����r��”����f�m%�s��:���X�6J3�*L(�qՎٶּ����o
�A�qk�)�v����IV^9�d���
�N�džצx`9�Ӱ�n]=4a�q+燔�.H����(�N!�,E.f8�|���AW9=/�c�ûr��x��/:>��@����@ζj਀�ՍN!�$x[���,�+�ym}W`�Z7XO?GEZ/��ˁխT�"�#�
2�#ɏ�	���؈t�,����ˠ[蝌���'CJ)Gs'��׶C�N��I
+R���ǔǧ%��(��=
%Cӌ=�0ЎJ�{ड��@������}����3��n��1]��wd�X Ӊ�Y�aX9���;��%+B.��8׽ˇ]�>t)�6D�N���d�}?|���;��ӡI��9��n�����*�p�{b�k-�ٕ!3##�/Q@�3�c��{�
��I뾈x#�pⱢ�]�d*�%h��e�.��p"�
�����(��n h^u���e��L'�����|
�	^��q&!��g�7W�l?��	��ZU4Z�C�n;����n	[�]	R\�a�c}�i0~���`*����Axq�T�ҡ�Bic�(�K��%�6�V��.��eL.o�l�!�74e�fY��ey�-$��'ԋ�l~.��3�k�?�K��e�揸F�`kt���Vm�S�?J�@AG�KK��NNN�ES��,[4ݣ�.?]E�8�u㻇`�Rl�JP�Q6��>%a��sJ����Ֆ�1p���t-��]�U:�^�TL��I��#[��bN�x:0�l�V�JVĎ�;�ŎOyH�0�@�G��9��}�{3�M�Gr�ٳ�.+�
��� {�;S��}oЎ�_R'[���@��_�%���$)��Gjb`
۶;ZS�P�rJ]|��x�����7�N�Hw�R;E:�	�Y�����#��oLj	��/�~�@
/���M��mv<i�8��)�#���ۖ��w���*o�mn���ֈW12%B����zo��`���w����l*�˩��knmC	O�ݺ�6��ۮ��h�n��
Sya�m�j-V��nL�Pp������kGEJ�7��/��MV�ۭ�7���	�{�C��kk_����z9���Ʒ��Mӓ�|v������]Xl�|Mu	��O[���3�?u��y�ד˴�ݲ��F�y��u��hu3�>���N
%��7������Fr���Ɠ��	Cǁ\e�
��y�o8�8��p��ٱVǾ,(Բc`��6{M���f��:&WD�aBX�a���a� g��
%l�������"��`����
�P</�����0�Ee��-(0�]yA�ɒ���aG�$��9`E�[T�Cr�<;a����:������S�pntG6a�����M@?�J^2�d,�bm$�GQÞ��M�h_�d�Ҡ�B�$��
ar��]��n�gM
!���x��xp�s~�pqP[r�Hs�f�J���n�����ћ|!�������=�Ϻ���h8�
p2m��݅����Bb�)	�E����R��O�:;$�]Ҹר���<��$^�(�&�d�)Z���N�hK{ä�r,��3�գ ~�B���P1Z�si�K����J��岸~yQ�45V-|�9��w"���hRX��40.F��h�ރ�	���9fp�0E��ԝ~+��R�;�F
\���&��o���^�8�6-����� ��40h��Ol�'�bMK�BKřj��bL,���%��������bT�ˏ��T�M�8�Qז.�����c���ԋu�3\�Da�����_�Ŭ�a{��sQ	B��.����z:�&���������=/���{�˹���)}������Ӑ TVFԨR��R�;�
3�1�$0��
�/��1�U�6ey���#��!?���c��tUl�Wȉ�3�&>f_k海
��*�0{�=T���z�Ξ�`ء��Z�L����cr&P�U��
��;'�!U��]q��;�_�����������H��ⅇ��\��{[��x^�&���f�xpGz�B��2u�+���ݿ���7K��N��#�5ZFs���֍B��-\�V�h5���G��ځ@Fv͡�J�]H'��Yy1B��8k��3�VT)�.��������ۏl,���8K��^��O�'W$�+���p	ߌ^p~{M�9O�
����c{��ރ�Qk�bM��.p�.l�%3ъGA��s:��^P�%֤R�bpjl$<����1�Nb^�Z�'ȽJ!o�ؤ�^��u�ڲNAD�O��~Y�$h�J$�-�;sM.
T�SJz�Pn� _����FjO�CBP��Ѥ��ޓ�^�R͝��
M@F��b�!�^zز�m��Xu^�� %�*(��w�l+�ȁ��R6�.�j�YZ?�MO��4���e�Q^�Ght��~�-ZTGj
Km�/�:��Wn���V��tDA_h�S���r!M�O����3>��R9�>��X^u͍�c�*�?�F��2�^Rx�.���&Xyg
�(�k�|\S۞�*|���#pq�#��M0!��t����!(��Q��_>x�[�����<���p0Z��K%"�
�ֲ�/�2)"�UI,�w�gY�d������B�fK1���aR\��j�,D���y��\�,����~H��Yoo���fmE��;m-��31qA�)Ӧ�/šb�o_���<Z���ɮ���2й��A�l�
�i�H�L�wbY�F.�A���F��DXħ�3�D���m4��t?�����x>UD� ��7D8|����LC���B^�z[�i�I�횫�pM~o7=ML~\~
���=>�HXt��^U��YX�E�G���}���ݤ����Ϻ{��1��}�i��e�a��X<,�V?�9}�_ɄWXq���*�Y�`|����Ć:$��H��6���lEO$6�fm�zpJt��,�}�Y�x��������4_������nu��ת��0�5al^Ҹ>s&}о�=�
����/v���f��av�I�M���D KOų���v`�a+.���>�|����AG�����7v��nuB�v���*��)�WHZ��8��<�!A9~�WT�8<)k�d�w*� QF��
����@��B�u��n��֪��z��m3�p�Q��*fir����������z
@�'����g̭p�=�d�m6�gS���Q��ǘ.��{� "�Ǔ�Y�r�m�{�F��b��,��'�	��5����U�Go�+���:>��@5gݞ�a'�QY���% ��S�jf?��u�[�l�/m-�F;2P�ɐLw:
��`^̃�Yo��c;���B�\ǂj�r�e��1ag�����������!�W�f��i$���_c��߾]���}��������G�H�Ȁ=��G]�_$�;��֎+�߲<M��
2��b�A}DࡿJ�|>"�Z�,f�3L�!�_�]�	5p�n��fr0�
�������/;�ӫ�{3��!�
�@e%�x/R<>�%��q֣A�O���t�@��*�QO|;��Q6vf�WRߴ���f�sǿ�(M��ұ5u� �]8�k>�
��Fa��R�մ�Sk������i���?���ߩV�F�	7>��m��X��޸��\��'���R/�;9��'�l�8��{ӣt���G��������/��}-3�����,�h����nc�[�%�"�;�(=�jƒ�DL�?u�����8��ʀ8�K.:����/v�>#�}wyG��_6L�rx�
�#�^¹:HG)��Y��Y�iʏUo0���\M�3�㽗ǧĂ�m��\���4��;��.7�5��m�H~<������O�A�[{�*U�B�9|ݩTx��]zQoh�bj{���v�w�D�)����Ok��A��X�=#�t��?W!����c!ָ��e�6��|0��h�p��U��'��M ������Nz�O��G~��P�Ŝҟ� =��)&�'���!��wkڿ�>e�h��5J�ANy��zw�#I7�X���ix����[O�Q<�[v�����?1���}
m,���[�n�
�{�n߹��>����?)�W��G��hd5H��NH���l;�%;�T�YYS�.W6&ʮP?rO�e𾤩ǽ�t2;Tm�]?3ߑ�����9�F_�n00�7l���:ۻ�=��?
�N9{k:�b�7���-�z��͑���Xd�B��Z�AAcmc���L�W��*\6`rwTՀI����j�g�N���躤�Vt�r��⼣V��2� �j�/���QxET+q�a3����r���?�7��D�5���GmuyztP��z��*�*��T������\
OE��K<�1{nF$n�	p�̓+ND�����0����j���T�'b?�丛k3$�n�PI>?>���s�����O~z����4�`Hc�.Y2�bR1`lf/:�-:�):��X��6�֎z~k*��_qS��v�i�M%�8˗��	����	@&�Cj�fA$sv���ҨH����{�-p�	@%�(§w�"�
r��ap�]���*]2P����x��TW���ۥ�P��h�s^��H:���
G�؆��ߟu_��GW�C��/�4Uz�T��
���uV�2s�E|Sn3�h�jj
�Jk�M�_SZ�D���}���֘��%�ZxI�r���|8��c��./�B(ۦ~��W	.>\T|�f��坖c����,��Yea��,���O]p{b]a�c�����8�>'��.���`��l�U�Ƃ�΂�!�֢��sQ\�'P��Dž�/�Dp��#p�/
g�Jߓ���"���V��Ƨ#���n
��a\�\ҜHyc[7Fe�1GLWW����#���	O���A�wM�axl�l�r�b�xۡ���ӆNO�h���cp^}0ݺl�oB\茼��������M'�3_��^w��	1���}z���g�D�'z�A
J��h����ֽ�
���wo����ѕ#ݺ
��	bB�7�2�/�-a	`T|�F�R����QĹw'�Ӿ�~��$,OZ���G ހ�դ���q38OPæ#��衬����_�W"��w��_aU�b�A�txɢ^ˈ|����i��*V�s-oZSk�r	Z�w��A�K�ꤔ�LΡF՘z<�9������_��7�k����_��%�W��������O������V��H��G6�I
a�����u�ƍ_5+��x|��&LŰ�n�:�o�](����A[e C��Sekx<cVO� W�x�4WZ��Si�b@�����F�':ͤ=���MZv`��5|nr��W�cF�����B=b/�`�3c�q=�=Ρ�S�E=�'=�͊	X��tEWL�c\	�T���iv�a��N#I�=���Dh\�_���e��Fwxa��jk��rn�S7Q���x�aң�ݧX�{r��(�T6��A�����;�x�R"^a��@�ѳ}�NADT2q��4��	v�c�.�
"��L<a�0�oЕK�ki�#����i�8���S�ѹ�h1����&Jq�TUe7�(1��#��9��Η��׆p��n�}��!ܧ}`��
��H�(w] ��
$ϕqC�7Ҝ���.ţXS���p>����9Pa�S��ZV��Z�!ƚ�%�^#�/~Tk����(�;U��)�'A��nnD�̀�O�(��&�m�l+Ġ2��Y����� �x�#r4j�9M�4�fSJ���4X`f��0E7��<',�"H�]/�jt?x�4-�(*%�|���s-�&"e�8Otu.4;����;�L��Pλ���qd�p7�-ί|�G����k�1.�oo���;��m����S&�ۈ��ȁ�;[�L|��^~�xل\
4I�Gl����.�ӥ��Pc5���y6�VT#64�����/�������j�ci6�w`��T��>P�LS�A
�́6��<K��
(�4�ݨ�ET�m��c���m���s7�U��l/ H�������/�B=��j6��a��ӄ#Pq��1����&Fh�pG�i����o�w�f�z� '������_}4��M/��xtr�/l�q�.{-�Q��H���B���d/��L���(w<�/�Ó�����p������_�E��?�g'HG'�tL��5@�4Wƕ��5��4��evA_�*�c
�xv�����6ƞ2���]����x\�M�R��E�J~�}57hė9鴛��w��挝�!4��7�I*p�^V��7�盢�]u�I��3�!L{��ҁ��C�	o��/c��L��7��+~����kk�����ݻ�o���/�2/�J(��z+Q���,)�Z��_�-b���F�ݝ��3EH}�3�t�;�L���y$UH�+d��Rq���^�QnƄr�Uh��qV,��O0�Õ Aa1��$��u2\_I`V+�}�|3��E�t�
�Cz���X�%�E�hS�kg{�93)��}ߊe��AL�1��/��j�c��L�
�b<8�zd�Ib�>ԙt�$P�‡���.�c��o\pF1ioF�`�����r�fl7)�ʰ�}d#4nD�y�hVh����C�.��g^�x�bG!{�w�g?�/�˿?�V��I�^BpP�!��p:
ֵM(��	q�ָfj8�s�.
�NW}�"�+�0�/=I?�!\6�����l���CX��d�7�-�a�H����+�n6�7ߐ�-M��b(���{Lԍ�XQ��N���yѺ�2���bb"�Hbe�O��B�S%bQbe:ˋ�����
6��G��􁢲�
�z�>\��N�-=q�5�5
E8���=�^�FjW��b�v��NY5D��.g����-O�Q_5z'�ј��?��o��};}����"暀�!�G%�ϴ�s�M��a�⌢9�[��*�r<�{9��U���
��x����T�n{�*m�]Ѩ�o�b*9��qJ�+���T�*��jX S]2�����0��ڸD���ν����m(}](���!��s'�1(����ق��I����w��~�w��	���^Rqh8��a6:
����G�6-wE�S,f�-���S,�A�_���Wڏ����Q���Ӭ,���t��oB/�|k����r������;Xs���߼�̅L�ӷ�� �5t�������2��G/m�N��9�b��B��5���4H�7[?�T�z{�]e���5l���z��f��N��U��'�V�m��͟[� ^�XE�C6�C�߾��9/OMv!p_�[i-�2�<�[�[ܘ�����>��'M���vij:�6��.��n_�.#Ņ7�{����JmuרQ��'�-A����+�W����Z*�,��B����dȋ�<��C`���N�Q�n�S�)e�c�F�"
i�����E�
-u�^`���3
r�����lW��]DCx
�fJ0��M���.1I�
YD*y��>���-����<��Sh.�㮪8��!�޴Q���:W9l�zz㤅E	E�l�+�J�.$f-
�*�]����U��S��Ľ���R�"K��V������5_�|{���.��iB!قG���D{Ӫ�P�e4��F�s�l:��u���矌^~��1hUԬ9j/c�$=�Ku�����G9>��?�2\O;��%3�3�RYfjv؛�C������)��J�*�;�dJ���9�K,�\�ȚLj(H%N�La��C�B�.�y��l���1߰	hH&�Axo��p>ts�%=R�=ܻ
hI����B���Q�e�\ح�1���ƘQ�Y�Y�i�����3B-��_�)��(�D�f�)�rh�E58+�!D(�{je���R{�j�����t���?�ǐ�AX_��5�C�ʻ�x�*�oX�b
�"�3���)q�P�b�.�yRc���A��'2/�W�M)3��5�	lX�̺W�"���Q�(���6�������H�-�򩘹��E�k��?h��Ksm\��ٺS�wo�&���|J��b��O��cK�+�U.1��7���O��zY>�'��g���k>���w����D�?��M�k�Nw٭�bW�Xv�Y`��02�H�4�T"hַ���߰� FDK����F9�����/�8���z�zd2���S%��y�Ot�s>��j���j��������Y>u���	m�����|�פ��T"��D2��4���&�2��܄D�"D��)��a��:̟'2z4S�0O!)-z#�6�2&���/�s���+tW�'Z� ��ͷ�{���q���rΫ��o?4Ϛ\�27�5��zA��Y��͠TG%/��o��,�3߇s�]S;�7��!����\z�y�����'��]��������
�����P;
-p��߭��F�S]��Ń�lv8�kj���oқB��Xv������Q�h������:���p���@��*��+�D5��L63��u����'/���Qc�o�_ً���b���@\���'�7.�=y��"�2���C��&9�UՅ�+�LՏ�?R&����ʀ�	P[j��	~y;zX��O��{���tĺZ=Q2����`:�2
����䞿|�Y�ŷ��N�M�"=ڢ�Z��ߪV[�cr��(6��j�[5�Klu�������h�Rn�WX�4��S&!8�H����:��#�����h�?�I�*�5P��r}*�f�3��H�Z�ϢA�d�͔�7��vka4Geh90l�v�%�x2s�Eq�5F�����[$0�]�@����/�����^u�D`6l$���_5QA|�04�xk�XO������HO����4���J}A2�@R��������=y���p��j{����H��N�-�1�/�
�ཛ�Y�����.�"�����?�v�f5�9�Y:jnp}`2&��>"�Q�V�M��ޫVlZ� �L�y���d��d����H}қfp��J��Vs�1w�#�s!�L��.�����F�P��p�o�r}�U�+b.&5]�e�&�u�]4�:#�1�N�M�p���#a�*��e�Nu��=_��`��P�-�-�%�����
���f֌���̏~÷�"�����չd/�~��7�9inTkt,{��7SD�������� ���A��+��&T=|�|�����^��qK��a��i��zu�M&��R�Ɍ��\���lS�ܮG���)�(p����4ǵ�Y�����hpgh� ����s�6HV��]a�CCy�E9G@_�x����F��p�7"�|�jZ��ʆ%�e(����-)�,�3�b���Y�וI�n՝���5��7O��!��VB�p�߼�\H���pT2ۮH�))�j`��g�,<�'�-O���SJ�U��o�t��\�i��ы�,]����#�e^٫��}�,��?q�8��'̦ڛ�6խ[-�]�9(���G���!���J�I@Ls��.=�������vu9	��cpy�HHy0z�������{��F���2��֕�eӞq�p���ݣ�:[��A�qѢ�j�Vw�Q/�ն *�YҖ���=�i}�cy8A��㜳I.�)Pܐ���)�F;m�@� Vw����<��
{c�KY�-���b�dR=��ԧe�T��"�@,�pVsEms�6xg��^>�b�9����m:1kq�5ؘh��S���L/���s����D+_�dƷ�`�M��^6���%���`�w{]��
�m��N�Va
���NE���k����
����4E�N`���v1c)K�ZK�15ۄK�g��7�~��#b�4w���p��q6F;s�*�.+�`��e�	��l�[8��r�B�2����j�:~5��Q��x�3���Y��Y�D��|���<LD
n�����M�A7!�=&�%K-W��kh6�}qu0~��uP�l��q0��0��hm�u���Lx	��� `����&�l|<��=�R��=��cM_
���QE؆$m���:�w6�H��V���`����! z�C��?�N���w��P�y�aw��;��@�&�0U�h<>��!�Q��`r�d�Vد�X� hbɔ�hY�����T`��S,�ʯ�;vGAq��饳�wo>S�~��b��mx�M�OJ'a��B+�s�.�no��+.�z,-{��ы���7*
�o�l�Q��
�p�\JG�L�'s�Ã�j�|0���1�okɾ�O"#�M	���Sȿt���|������ͽvk����$48o�S�7`�zj�1ęh n5Lr�Lm�O��J����zk���5�%�(�@���<K�qg��X�k^�ܸ�P�����k`��SÜ���K�!��PL��l���X�K���"�#�y5��P�C���B-��3� ��3|���"Q���n���s��h<�Ƨ#7�/&�FF~��P���t<?8TzW��j�V2
M�m`
)�I�{N���R�e`�p��0�Daj��+�p0Y��M����G���,߲��4��i�����A�/��Ec�8�%<�\?�+���R̋�;��Z\��^.��ݍ'��v��`�~����uot:GR<p�p�&颚ߣeI��?4�zN�cr��lˁ�+e�%E�ܵ7�����F�?�$_k���i�+�޹�Ս���|\�x��p"v{|=m(XgK��#���]�ɘ��9��b�ҽ���P4�Y�Yp�%P#Fo{�D�������>_y�8�Ӕl��5q�&CpH��mM8O��4��d���H5�fE��#�q��ȿܱA�J�V�.�H���+�+E�l�봯�da���L"n�`��lGSA3�J��F|�Kzw��6��(�${�>\~�Ӭ�H��x��P�}>��t
Ux�#��>
�g�&�Xa���;��p�[1���CVV�"���x��K���]S��Zr��߯T���~ű����穻&�>zKd�O�m���?�=��"nX�gI���RXKs�@=��F��؎��ce��:Rϐj6�%Q5U���!����辻t�p�)sG�D.-��4\c�&����Po��cA��������J�y��+�)j`��X_�?T�X�B�
�1IJ&�3�b��#�����ߩ(
�Ғp�T�r��d5�aV
������d^�g���T��:�kt���h�B11M�.i���)5B��.��h�{E_w4�<�M���\@��m��κd	���,�ʶ��QK���,��6��|��dM�ʄYs��ڦZ;�Ս@
3M�#W�n]cL��&Vή�_��:����ٙ��W9��O��Om92���7�+cw���G�e�J��3���r���4���p��S8���
��|��Xx��vU���s�Os<;ʛxa��^�闽��Z�1��d	����[�Hݩ��PU]:�wh���&��V\*O@r}�}ӧD��:�*J���;U��ԗ�_~	w��6d�m��@D0�lx:S� ���T���=��C���o�c7)��Y_�`�a~D�Y�j��7�_���U�Z����v<
��D;;�ye�7�¹����;����y~��(@����[[P�-�����؍лdS%��/�0}m�V�]����	��ǹJ�h��}E�S�?���:_}k1$}h�_j1�l�8L��V75Ϯ{�c�Ni��J� ��3�m\��y^��W�7���x��r2��8���z��_"�ܦM�)�h�3kI�G��O������Q&5��P�u0c%G��4+���
�~�_Yf�nBݠ#�Z!�
Q��KIʗE��<�JPX�c�?�KM:K���Ŵ6 �j�#�䬯����r�����1��ä����f{����[n@��o�[�l=�%��[�4۷E����V��O*�
F~����D����?�?�ۣ[z*=�ބo�h`T�.|ɗ���I+��0AFމi�
��]TP��)%�U���A���Z>g�Q��Y��\)�,n.޽G��1r�ˤt�֔U�O �-"5�MW�_��c��9�
z����+Nd��a��M$NH��j�A��I+���*��#�R��)��y�L�J��D�\��k��Bn<����ia+t��P�i1O;AGXPS(Hu5��j���5��5RFS�Q�Qp���&�;���������z��p�u�U>��ݻ�u����M����)�&@>@��f]\��s�z����O�\�+�ۂ�,dN��5�Of���o��3|D��6z�=|���K��]�V���ZO?:�C,���X!�[���󧺭�?�a��ɦ��#0��4{���N
i��K8x�"�>��)�'E׶oцZ��/�4�`Ʊ�Zz���1�1-D�{>X�����/���4[K�Ȑ���@.t�!��kMo��b�1.����f]��3�tB6�Y{u-}@�o��<�h(�7��#GdB�7w�5g�/\�M��`}Ƙ
Ձ���7��^��Ն)&��r(�",$r$���h?��8��D���]���>��IXEA�,�D�h�6r����Ne?��ۏ6�n7j��Qm8	�s��V@�m�����V���>���w��B&`�ˁ��:�f"1���Ɂ�]h���K}�1%.�}��}瘨�eK��I��
��Ȗ`��e����Gy[�0�X�J��W)��0�%1)����X���2�k�����f"��⢉������S.�F�����*C��aŖ-e�&�et
�Z������X�%��9-Jp5�4%
u�g��O�pK��l�0�ۛ�D��"���d���nb�kȀbu�%Gh�4�!���j�����ъ��5��L����K�T�{0{(�[�;ɛ�`T�(BZ�D"�����vGK��?�@��f�n/)��w~��.;G�ޔ�MH�Krv4&"��4Mw/������n�����m'��8L{�j͛p����{Ŵ߮'�F~�#��x;�ӍUR.���u{
Y�b<q"}�ؠ!\�������� ,]S��C(6�Z�Y|��ZR]^�$���(�j���f�o�U[��¾�Θœ�
�pҰ���~g
.1~߻���$�6�{W�_��N�܈K���Ì(�-ٶ�-nO���c��7��#Ϊ��>$�>JVc�<
$�)ت�Y�������ɲ��FVdEP�*/,m&ƈ����a���*���4Ѵ��,M<�6���$P�F�cq��p"�/	��,�WD�H�t��p�pJ;^D�b%�5RL/#R��'�b���⥓	�ȓ����YO;��nqkU-��-Ҁ���2!��>D�͓l�\fd5/aRR��F5���U��P\���?̦p�'��G����؏������u��f�Z����_��-��r�ȓ���e�� �{�UFi��q�� }y��L�{�DEX�ެ\��;n!�$!&�Ėl�������L�k�+����Jg�IX����@}��
糥���m�E�*G�*o�}�b�.�q�V�ӯK�8�U#Qe�~�*Kql$oT*\@��S�@ĵ*��+W�K�V�^�%�Dm��P� F��HTm���P�"EI-#�

~sZ���1��� &��*�rja%ۢ��(h-��nc�8�n�^Ϡ���e����\!�+x���cJ��秎��F��GS�,rG��u�ק�p��9˴�*Y<G���sH�NQ&{y>�0����u�c�L��d>k6�ˇh�����x�B���q/W���CRum%���L�}i�Q�S�P7�/��]?�p4>�y	o�3�2?s9�{�/��ׅb5�s҃�<�ٖ�_�;6b�vڋ:��|5�S����}C�G�z���f<Yt��!�Aj<0�8_�uQg�+@q��i�O�u�O�6�-�����^���g����g��i�?��T�R��ԹCG30לnb��ћ �h>�]�P֟[���r+�k&J�hV�ɮ+�]=#2�(����MI����
9���ٸ��2k�A�����v��`�ٵ���[�����/�����O���5�fane���K-%FX��q~`�+��?�p��B�W�,�
J�o�2�N�%IB�4���M�cRG�Zr�6�Q:|w���%A�)��� |G8���,1٥X���UݎB��!4�|�9͋���i�����L0t��8�K�ߓޔ�d�h�R��ASL?����~t;![���b�;�:w��2��1��U%�g]�.l�-:I���#�Vk�� Ւ�J���(�{�_�؆}�~+Z���ߡv�Df5}k�7������n��B�*��|�����m�|�cѬbZ"�nb�pI������	aEV3SI��r:#]�nP�H�a�[�
���������B��pf��L
��1�a�}�6[vZ9ز�a��O�o��m�f�"�,Ʃ�U~ػ��6�6	Y�E�[�'����e����W��Q <ޱdT<`��8I�uƪ�}(�����KҴ�� ����(�S��/�O@����FϹ��n��O�(�����3��D���؂�p�&�0�� �V@�m`$�z�@f���6)q\�m�:�%��'��v��qݸ H҅HI�5j�*ZZ��u�M�UW�<("���Ł>�F�:ɛܨ��?��-�T
�Uk��C�('��ֆ?��4qO�aG��C��n����(�-�y���t��t�Eh��Ad�ĿY��X���n���ъQ԰e�渥��}�Na�
AfJa����	ew�*� �ra"��'p&�5�y�=H5�0q:�f&$�e�b����?<HK��e�(�C�/�S�H��B��NK��r���ό�(�n�0���Zk��AX=�����xgHs�	��4�0�Ч�������L�cE=��ꎉ�#�B"ª�j��P���Ʀa��͸���dz&	�^�(E-�#K6W�-{���8y'<��ʬx���v�mK�>����j�ڒ�G�r+�%��OJY�I\[1���f����h�=hnT[������m���6i�XO�~�Ov[�^�|��?�4�"k�%'z3���"���kE�E@�U��&ۦ��
A�83�u ���]��f���R�\x�@��X�cKi�����T�F3b����!
K�G��T��y
���{=�+�B�6������[^J�x�t͚�b酏I1���y8R��~N.�&�+�65(��뛁k�(B;�<Ҁ�f�#U+��9"R]�RvY�MV�C-���)G�6SĚW8�T
s��ߍ�!C>�R��y
�;1tQ���h�%��.�j������6_�o�փc��zei� �jR �^�֭�]*����%���/y�-�w
�ʻ��o#�"�oL�?�L{����X��ߺww{����{���s|����_���|���JV�A�n
00�B�6����x����E�7''}����͉첉_d��=��b]
���<��P�M�+�L9�tc��3��i��Ms獰�H�.)�����c;t4+�i1�*�iOE�A�z5,��C�'sk՛9��И�o߳_�ފ��i#Nl����v�����N�ݥE����+#IO�s`�dw�i�dyC����o�Q}����V��2Q+�x��>S���v/~���� Ni��|�!�jy�ж1/�1�
6pne�
�>����,�a�r�x���o���x=
�z@-h}s�p.���]C��13�j��j�j���
m#�ģ0�ب���"�B�t�h��&��z��qQ�����`�[��bwcʙ
���0;8Ԅ�8��tY?�ӓt�D���Jl��J|���w��C�<�SI�к���
X<r6uɗVn��x��|~�5M�4�d��ʺ�e̡��-���v�æfio/�m9d��s�z�)5�c�2�#��L"	�&��O�H�)9�逕��|�\2��6��,i�pJ.o��YW�-�a��Cx�e�!���"K�`�P ���*����X?%ZM=1�T^�,eʻl,=���Sv\�B���"�ha�oޒ�pxoF����b@����~�T+�5}L��+f<��l4�D�����<�T��S�ȌTC��(�3{=l&E�_s��!�2��V�� J�~�1�W��4�e�lS�`L(i�j��s��ߜ͛;
^bp*�ÎȈ_�r�O.�}�ْBG�I�ݝ������d,��X�>��Ė��+�v��	�ij�L��L�@"��L���\y���&�HKT�ŵ�^����d��ڸD�oom�-�wo���Y"�#�H�wع���:��z�[��s�������q�N�y�
![�/s�9]u�,�W��d�nԬ0wd�b���A�T��O/��A:J��8�!F���c�4��Y�C%��lf9
xn���ͽǶ~P�o��K;��-ZRi�S�W�o>�'F���[���%����������{��(��/��e��h��|:*|��������
�g�'�A������;_���f����[ɼշ=jB?�W��Y����1MQ������ǽ{w����ݢ���{7�?����a>��a/7�14���)�9��
�~
��3h��f��h`ĪF4�i��b4XH��]���R�/$�d-��5;���粑E��n�G��B�@�����l�vG
����b@�(
wA��������nZ�l!^�׈�b4���T����e��b0�/�*�b/���hg�����'�I�cw�ْ��L�8�祧�ba�tB/:�4�d�G`�i��Ce�
o&u���L�?B+ne�����RM@+���,��{3�=F�_��c$ӘT�Z�����䧱?���,��T�Tl�j*�7U~�M&KD���T�,)Z��1�6�P�
�H]�L��U��m=_��[�A:��`��
���s�	rsiy���U��?� ~yήj��F����l��������5%���~��ӅR�6�(���!˷Ɩc
�;�P��hK�BZH��^f2�L�CP!(����\�*�
W�g꜍ͽ��X#<GQ�$r
���)K����h�.Ռ�\ ���n�!�R3��^�l�[\$3�7:�?�#���d����6K?���ּ~�����Y>Q��#�e#�vԋW���c���|2����&�)#@)0�m�:��8���[�o�_���©x��?��3��8*��ڢǔ���h�	�}�և�2����c�<��U'�$d���NdZ\.h�����]c�BιfT8b5�0�u���Q���k	������T�CIm���c�W����RO<��󐦻1
:�lj6x��<_��h�+�G�R��m�����t��?L�9ݻ�6.���w����߻����3M�5ϴ��-W%Z��ep%ơ�Ϋ[�Y
���O?x�������_�x�[��F0������<�#����J�� �2�]Su���r�}������F�:���`"��>�����ɠH�+��K5�����3�
�4)I๺����7�W�m�N���]w�7�8�+�h@��Fy:�Q̋�ך��h�M�w0d�
��S�� t-u_�Li;j�xC�uW֩F}��6���ٗ�M�a{X_i�r�T��y��l����谵����scJɈ�@�FZ:	��
�m8H�0߶\
���a�.`h�o%̆׹w�ʭӷ�Ox�L�L����T_�z6��.��1�������`��w���j��� W#Y|�H^U�
��TYxцM�P]s����s��n���˺Cs>���z�}��֛�����O/!��Հ^ѹ_;��,"S��J �k2t��C��6�P�aX��T�+��o�-y������4���kC�f��M�M�{p��W������s��|n>7������s��|n>7������s��|n>7������s��|n>7�+��6�Huser/db000066400000000105147511530550006036 0ustar00# User settings, overrides db settings and persists across installs.
user/md5000066400000000000147511530550006130 0ustar00user/custom_flags000066400000000000147511530550010131 0ustar00user/rvmrcs000066400000000000147511530550006757 0ustar00user/sha512000066400000000000147511530550006446 0ustar00lib/rvm/capistrano.rb000066400000000436147511530550010621 0ustar00# Recipes for using RVM on a server with capistrano.

raise "RVM - Capistrano integration was extracted to a separate gem, \
install: `gem install rvm-capistrano` and remove the `$LOAD_PATH.unshift` line, \
note also the 'set :rvm_type, :user' is now the default (instead of :system)."
lib/rvm.rb000066400000000426147511530550006455 0ustar00# == Ruby Version Manager - Ruby API

raise "RVM - Ruby integration was extracted to a separate gem, \
it should be installed by default with RVM, \
remove the `$LOAD_PATH.unshift` line and all should be fine again.
Visit https://rvm.io/integration/passenger for more details."
scripts/list000077500000015314147511530550007150 0ustar00#!/usr/bin/env bash

rvm_base_except="selector"

source "$rvm_scripts_path/base"
source "$rvm_scripts_path/functions/list"

__rvm_list_remote()
{
  \typeset version
  rubies=($(
    __list_remote_all |
      __rvm_sed -e 's/.tar.*$//' -e 's/jruby-bin-/jruby-/' |
      __rvm_awk -F/ '{print $NF}' |
      \command \sort -u
  ))

  if
    (( ${#rubies[@]} == 0 ))
  then
    rvm_error "
# No remote rubies available
# Check 'rvm list known' for what can be installed.
"
    return 1
  fi

  printf "%b" "\n# Remote rubies available:\n\n"

  for version in "${rubies[@]}"
  do
    if [[ -r "$rvm_rubies_path/$version/bin/ruby" ]]
    then rvm_log " * $version"
    else rvm_log "   $version"
    fi
  done

  rvm_log "\n<comment># * - installed already</comment>\n"
  rvm_log "<comment># To download and install:</comment> <code>rvm install {name} --binary</code>\n\n"
}

__rvm_list_detect_arch()
{
  if
    [[ -d "$rvm_gems_path/${__version}" && ! -d "$rvm_rubies_path/${__version%%@*}" ]]
  then
    __arch="ruby not installed"
  elif
    [[ ! -x "$rvm_rubies_path/${__version%%@*}/bin/ruby" ]]
  then
    __arch="missing bin/ruby"
  elif
    [[ -f "$rvm_rubies_path/${__version%%@*}/config" ]]
  then
    __arch="$(
      __rvm_awk -F= "\$1==\"target_cpu\" {gsub(/[\"']/,\"\"); print \$2}" < \
        $rvm_rubies_path/${__version%%@*}/config
    )" #'
  else
    __arch="$( __rvm_ruby_config_get "target_cpu" "$rvm_rubies_path/${__version%%@*}/bin/ruby" )"
  fi
  if
    [[ -z "${__arch}" ]]
  then
    case "${__version}" in
      (maglev-*|macruby-*) __arch="x86_64" ;;
      (mruby|mruby-*)      __arch="x86_64" ;;
      (*)                  __arch="broken" ;;
    esac
  fi
}

__rvm_list_show_version_with_arch()
{
  \typeset __arch __prefix __version __suffix
  __prefix="$1"
  __version="$2"
  __suffix="${3:-}"

  __rvm_list_detect_arch

  if rvm_pretty_print stdout
  then __version="${rvm_notify_clr:-}${__version}${rvm_reset_clr:-}"
  fi
  printf "%b" "${__prefix}${__version} [ ${__arch} ]${__suffix}"
}

__rvm_list_gemsets()
{
  \typeset all_rubies version versions ruby_version_name current_ruby selected system_ruby system_version string binary prefix

  if [[ "${1:-""}" == "strings" ]]
  then
    __rvm_list_gemset_strings
    return 0
  fi

  current_ruby="$(__rvm_env_string)"

  all_rubies="$(__rvm_list_strings | sort)"

  printf "%b" "\nrvm gemsets\n"

  versions=($(
    __rvm_cd "${rvm_gems_path:-"$rvm_path/gems"}/"
    __rvm_find . -maxdepth 1 -mindepth 1 -print 2> /dev/null |
      __rvm_awk '/[a-z]*-.*/ {print $NF}' | sort
  ))

  for version in "${versions[@]//.\/}"
  do
    ruby_version_name="$(echo "$version" | __rvm_awk -F"${rvm_gemset_separator:-"@"}" '{print $1}')"

    if [[ "$all_rubies" != *"$ruby_version_name"* ]]
    then continue
    fi
    if [[ "$version" == "$current_ruby" ]]
    then prefix="=> "
    else prefix="   "
    fi
    __rvm_list_show_version_with_arch "\n${prefix}" "$version"
  done

  if [[ -f "$rvm_path/config/default" && -s "$rvm_path/config/default" ]]
  then
    version=$(
      __rvm_grep 'MY_RUBY_HOME' "$rvm_path/config/default" |
        \command \head -1 | __rvm_awk -F"'" '{print $2}' | __rvm_xargs basename --
    )
    if
      [[ -n "$version" ]]
    then
      printf "%b" "\nDefault Ruby (for new shells)\n"
      __rvm_list_show_version_with_arch "\n  " "$version" "\n"
    fi
  fi
  printf "%b" "\n\n"
  return 0
}

__rvm_list_default()
{
  \typeset version string
  if
    [[ "$1" == "string" ]]
  then
    "$rvm_scripts_path/alias" show default 2>/dev/null |
      __rvm_awk -F"${rvm_gemset_separator:-"@"}" '{print $1}' |
      __rvm_xargs basename --
  else
    if
      [[ -L "$rvm_rubies_path/default" ]]
    then
      version=$(
      "$rvm_scripts_path/alias" show default 2>/dev/null |
        __rvm_awk -F"${rvm_gemset_separator:-"@"}" '{print $1}' |
        __rvm_xargs basename --
      )
      if
        [[ -n "$version" ]]
      then
        printf "%b" "\nDefault Ruby (for new shells)\n"
        __rvm_list_show_version_with_arch "\n   " "$version" "\n"
      fi
    fi
  fi
  printf "%b" "\n"
  return 0
}

__rvm_list_ruby_svn_tags()
{
  \typeset -a tags
  \typeset prefix tag

  __rvm_read_lines tags <(
    svn list http://svn.ruby-lang.org/repos/ruby/tags/ | __rvm_awk '/^v1_[8|9]/{print}'
  )

  for tag in "${tags[@]}"
  do
    prefix="$(
      echo ${tag/\//} |
      __rvm_sed 's#^v1_##' |
      __rvm_awk -F'_' '{print "(ruby-)1."$1"."$2}' |
      __rvm_sed 's#p$##'
    )"
    echo "${prefix}-t${tag/\//}"
  done

  return 0
}

__rvm_list_known()
{
  if [[ "${1:-""}" == "strings" ]]
  then
    __rvm_list_known_strings
    return 0
  fi

  if [[ -t 0 ]]
  then
    __rvm_pager_or_cat_v "$rvm_path/config/known"
  else
    \command \cat "$rvm_path/config/known"
  fi

  return $?
}

__rvm_list_rubies()
{
  \typeset current_ruby rubies version selected system_ruby system_version \
    default_ruby string binary prefix

  if [[ "${1:-""}" == "strings" ]]
  then
    __rvm_list_strings
    return 0
  fi

  current_ruby="$( __rvm_env_string )"
  current_ruby="${current_ruby%${rvm_gemset_separator:-"@"}*}"

  default_ruby="$( "$rvm_scripts_path/alias" show default 2>/dev/null )"
  default_ruby="${default_ruby%${rvm_gemset_separator:-"@"}*}"

  rubies=($(
    __rvm_cd "$rvm_rubies_path/"
    __rvm_find . -maxdepth 1 -mindepth 1 -type d 2> /dev/null | sort
  ))

  for version in "${rubies[@]//.\/}"
  do
    if
      [[ "$version" == "$current_ruby" && "$version" == "$default_ruby" ]]
    then
      prefix="=* "
    elif
      [[ "$version" == "$current_ruby" ]]
    then
      prefix="=> "
    elif
      [[ "$version" == "$default_ruby" ]]
    then
      prefix=" * "
    else
      prefix="   "
    fi
    __rvm_list_show_version_with_arch "${prefix}" "$version" "\n"
  done

  if (( ${#rubies[@]} == 0 ))
  then
    printf "%b" "
# No rvm rubies installed yet. Try 'rvm help install'.
"
  else
    if [[ -z "${default_ruby}" ]]
    then
      printf "%b" "
# Default ruby not set. Try 'rvm alias create default <ruby>'.
"
    fi
    printf "%b" "
# => - current
# =* - current && default
#  * - default
"
  fi

  printf "%b" "\n"

  return 0
}

# List all rvm installed rubies, default ruby and system ruby.
# Display the rubies, indicate their architecture and indicate which is currently used.
# This is not meant to be used with scripting. This is for interactive mode usage only.
__rvm_list()
{
  \typeset action="${1:-rubies}"
  shift

  case "${action}" in
    -r|--remote|remote)
       __rvm_list_remote "$@"
       ;;
    known|known_strings|gemsets|default|rubies|strings|ruby_svn_tags)
      __rvm_list_${action} "$@"
      ;;
    help)
      rvm_help list "${action}" "$@"
      ;;
    *)
      rvm_error_help "Unknown action '$action' for 'rvm list'." list "${action}" "$@"
      return 1
      ;;
  esac
}

__rvm_list "$@"
scripts/migrate000077500000021046147511530550007624 0ustar00#!/usr/bin/env bash

unset GREP_OPTIONS

source "$rvm_scripts_path/base"

usage()
{
  printf "%b" "

  Usage:

    rvm migrate {source-ruby} {destination-ruby} [--force]

  Description:

    Moves all gemsets from {source-ruby} ruby to {destination-ruby}.

" >&2
}

confirm()
{
  if (( ${rvm_force_flag:-0} > 0 ))
  then return 0
  fi

  \typeset confirmation_response

  printf "%b" "$1 (Y/n): "

  read -r confirmation_response

  [[ -z "$confirmation_response" ]] ||
    echo "$confirmation_response" | __rvm_grep -i '^y' >/dev/null 2>&1
}

die_with_error()
{
  rvm_error "$1"

  exit "${2:-1}"
}

expand_ruby_name()
{
  "$rvm_scripts_path/tools" strings "$1" | __rvm_awk -F"${rvm_gemset_separator:-"@"}" '{print $1}'
}

migrate_rubies()
{
  \typeset -a origin_gemsets alias_pairs
  \typeset origin_gemset destination_gemset gemset_name migrate_ruby_name \
    migrate_alias_name migrate_new_alias_name binaries origin_wrappers_path \
    full_bin_path expanded_symlink linked_binary_name new_wrapper_destination

  expanded_source="$(expand_ruby_name "$source_ruby")"
  expanded_destination="$(expand_ruby_name "$destination_ruby")"

  migrate_rubies_checks   &&
  migrate_rubies_gemsets  &&
  migrate_rubies_aliases  &&
  migrate_rubies_summary  ||
  return $?
}

migrate_rubies_checks()
{
  if
    [[ -z "$expanded_source" ]]
  then
    die_with_error "Could not expand source ruby '$source_ruby'"
  elif
    [[ -z "$expanded_destination" ]]
  then
    die_with_error "Could not expand destination ruby '$destination_ruby'"
  elif
    [[ "$expanded_destination" == "$expanded_source" ]]
  then
    die_with_error "Source and Destination Ruby are the same ($expanded_destination)"
  elif
    [[ ! -d "$rvm_rubies_path/$expanded_source" ]]
  then
    die_with_error "Ruby '$expanded_source' is not installed - please install it first."
  elif
    [[ ! -d "$rvm_rubies_path/$expanded_destination" ]]
  then
    die_with_error "Ruby '$expanded_destination' is not installed - please install it first."
  fi

  migrate_rubies_checks_required_space
}

migrate_rubies_checks_required_space()
{
  \typeset __used_space __free_space
  __rvm_calculate_space_free "${rvm_gems_path}"
  __rvm_calculate_space_used "$rvm_gems_path/$expanded_source"{,@*}

  if
    (( __used_space > __free_space ))
  then
    die_with_error "Not enough space (${__free_space}MB) to copy gemsets (${__used_space}MB)."
  elif
    (( __used_space*12 > __free_space*10 )) # 20% check
  then
    rvm_warn "You are running low on disk space ${__free_space}MB, required ${__used_space}MB."
  else
    rvm_log "Free disk space ${__free_space}MB, required ${__used_space}MB."
  fi
}

migrate_rubies_gemset_calculate_destination()
{
  destination_gemset="$expanded_destination"
  case "$origin_gemset" in
    (*${rvm_gemset_separator:-@}*)
      gemset_name="${origin_gemset/*${rvm_gemset_separator:-"@"}/}"
      destination_gemset="${destination_gemset}${rvm_gemset_separator:-"@"}${gemset_name}"
    ;;
    (*)
      gemset_name="default"
    ;;
  esac
}

migrate_rubies_gemsets_run_each_ask()
{
  case "$__action" in
    (copy)
      echo "Moving gems from $* to $expanded_destination?"
      ;;
    (merge)
      confirm "Are you sure you wish to Merge gems from $* to $expanded_destination" || return 1
      ;;
    (overwrite)
      echo "Are you sure you wish to MOVE gems from $* to $expanded_destination?"
      confirm "This will overwrite existing gems in $expanded_destination and remove them from $expanded_source" || return 1
      ;;
    (*)
      rvm_error "Unknown action($__action) for migrate_rubies_gemsets_run_each"
      return 204
  esac
}

migrate_rubies_gemset_clean_destination()
{
  case "$__action" in
    (overwrite)
      __rvm_log_command "remove.gemset.$gemset_name" "Removing $destination_gemset" \
        \command \rm -rfv  "${rvm_gems_path:-"$rvm_path/gems"}/$destination_gemset"/* ||
        return $?
      ;;
  esac
}

__migrate_gemset()
{
  \command \mkdir -p "${rvm_gems_path:-"$rvm_path/gems"}/$destination_gemset"/ &&
  \command \mv -v "${rvm_gems_path:-"$rvm_path/gems"}/$1"/* "${rvm_gems_path:-"$rvm_path/gems"}/$2"/ &&
  gemset_reset_env "$2"
}

__merge_gemset()
(
  \typeset __file
  \typeset -a __files
  __files=()
  cd "${rvm_gems_path:-"$rvm_path/gems"}/$1"/
  __rvm_read_lines __files <(
    __rvm_find . -type d
  )
  for __file in "${__files[@]}"
  do
    mkdir -p "${rvm_gems_path:-"$rvm_path/gems"}/$2/${__file#./}"
  done
  __files=()
  __rvm_read_lines __files <(
    __rvm_find . -type f
  )
  for __file in "${__files[@]}"
  do
    \command \mv -v "${__file}" "${rvm_gems_path:-"$rvm_path/gems"}/$2/${__file#./}"
  done
  rm -rf "${rvm_gems_path:-"$rvm_path/gems"}/$1"/
  cd ..
  gemset_reset_env "$2"
)

migrate_rubies_gemsets_run_migration()
{
  case "$__action" in
    (copy|overwrite)
      __rvm_log_command "migrate.gemset.$gemset_name" "Moving $origin_gemset to $destination_gemset" \
        __migrate_gemset "$origin_gemset" "$destination_gemset" ||
        return $?
      ;;
    (merge)
      __rvm_log_command "merge.gemset.$gemset_name" "Merging $origin_gemset to $destination_gemset" \
        __merge_gemset "$origin_gemset" "$destination_gemset" ||
        return $?
      ;;
  esac
}

migrate_rubies_gemsets_run_each()
{
  \typeset __action=$1
  shift
  migrate_rubies_gemsets_run_each_ask "$@" || return $?

  for origin_gemset in "$@"
  do
    migrate_rubies_gemset_calculate_destination
    migrate_rubies_gemset_clean_destination
    migrate_rubies_gemsets_run_migration
    __rvm_gemset_pristine "$destination_gemset"
  done
}

migrate_rubies_gemset_partition()
{
  if
    [[ ! -d "${rvm_gems_path:-"$rvm_path/gems"}/$destination_gemset" ]]
  then
    __list_new+=( "$origin_gemset" )
  elif
    [[ "$gemset_name" == "global" ]]
  then
    __list_global+=( "$origin_gemset" )
  elif
    [[ "$gemset_name" == "default" ]]
  then
    __list_default+=( "$origin_gemset" )
  else
    __list_existing+=( "$origin_gemset" )
  fi
}

migrate_rubies_gemsets_run()
{
  if [[ -n "${__list_global[*]}" ]]
  then migrate_rubies_gemsets_run_each overwrite "${__list_global[@]}"
  fi
  if [[ -n "${__list_default[*]}" ]]
  then migrate_rubies_gemsets_run_each merge "${__list_default[@]}"
  fi
  if [[ -n "${__list_existing[*]}" ]]
  then migrate_rubies_gemsets_run_each overwrite "${__list_existing[@]}"
  fi
  if [[ -n "${__list_new[*]}" ]]
  then migrate_rubies_gemsets_run_each copy "${__list_new[@]}"
  fi
}

migrate_rubies_gemsets()
{
  \typeset origin_gemsets __list_global __list_default __list_existing __list_new
  __list_global=()
  __list_default=()
  __list_existing=()
  __list_new=()
  __rvm_read_lines origin_gemsets <(
    __rvm_list_gemset_strings | __rvm_grep -E "^$expanded_source(@.*)?$"
  )
  for origin_gemset in "${origin_gemsets[@]}"
  do
    migrate_rubies_gemset_calculate_destination
    migrate_rubies_gemset_partition
  done
  rvm_debug "__list_global=  ${__list_global[*]};"
  rvm_debug "__list_default= ${__list_default[*]};"
  rvm_debug "__list_existing=${__list_existing[*]};"
  rvm_debug "__list_new=     ${__list_new[*]};"
  migrate_rubies_gemsets_run
}

migrate_rubies_alias()
{
  "$rvm_scripts_path/alias" delete "$migrate_alias_name"
  "$rvm_scripts_path/alias" create "$migrate_alias_name" "$migrate_new_alias_name"
}

migrate_rubies_aliases()
{
  __rvm_read_lines alias_pairs < "$rvm_path/config/alias"
  aliases=()
  for alias_pair in "${alias_pairs[@]}"
  do
    migrate_alias_name="${alias_pair/=*/}"
    migrate_ruby_name="${alias_pair/*=/}"
    if
      [[ "$migrate_ruby_name" == "$expanded_source" ||
         "$migrate_ruby_name" == "${expanded_source}${rvm_gemset_separator:-"@"}"*
      ]]
    then
      migrate_new_alias_name="${migrate_ruby_name/$expanded_source/$expanded_destination}"
      aliases+=( "$migrate_alias_name=$migrate_new_alias_name" )
    fi
  done
  if
    (( ${#aliases[@]} )) &&
    confirm 'Do you wish to move over aliases?'
  then
    for alias_pair in "${aliases[@]}"
    do
      migrate_alias_name="${alias_pair%%=*}"
      migrate_new_alias_name="${alias_pair#*=}"
      __rvm_log_command "migrate.alias.$migrate_alias_name" \
        "Updating alias $migrate_alias_name to point to $migrate_new_alias_name" \
        migrate_rubies_alias
    done
  fi
  true
}

migrate_rubies_summary()
{
  if confirm "Do you also wish to completely remove $expanded_source (inc. archive)?"
  then __rvm_log_command "rvm.remove" "Removing $expanded_source" __rvm_run_wrapper manage remove "$expanded_source" --archive --gems
  fi

  echo "Successfully migrated $expanded_source to $expanded_destination"
}

source_ruby="$1"
destination_ruby="$2"

if
  [[ -z "$source_ruby" || -z "$destination_ruby" ]]
then
  usage
  exit 1
fi

migrate_rubies
scripts/gemsets000077500000044454147511530550007653 0ustar00#!/usr/bin/env bash

source "$rvm_scripts_path/base"
source "$rvm_scripts_path/functions/build" # For gems with C extensions.

gemset_list_all()
{
  for rvm_ruby_string in $( __rvm_list_strings )
  do
    (__rvm_use ; gemset_list)
  done
  unset rvm_ruby_string
}

gemset_list_strings()
{
  \typeset gem_string
  for rvm_ruby_string in $( __rvm_list_strings )
  do
    for gem_string in "${rvm_gems_path:-${rvm_path}/gems}/${rvm_ruby_string}" "${rvm_gems_path:-${rvm_path}/gems}/${rvm_ruby_string}${rvm_gemset_separator:-@}"*
    do
      printf "%b" "${gem_string##*/}\n"
    done
  done
  unset rvm_ruby_string
}

gemset_update()
{

  if
    [[ -z "$rvm_ruby_strings" ]]
  then
    rvm_log "Running gem update for all rubies and gemsets."
  else
    rvm_log "Running gem update for the specified rubies."
  fi
  export rvm_ruby_strings="${rvm_ruby_strings:-all-gemsets}"
  export rvm_verbose_flag=1
  "$rvm_scripts_path/set" do gem update
  return $?
}

gemset_globalcache()
{
  \typeset gc_status globalcache_enabled directories directory_name \
    full_directory_path directory_name

  if [[ "$1" == "enabled" ]]
  then
    if __rvm_using_gemset_globalcache
    then
      gc_status="Enabled"
      globalcache_enabled=0
    else
      gc_status="Disabled"
      globalcache_enabled=1
    fi
    rvm_log "Gemset global cache is currently: $gc_status"
    return $globalcache_enabled
  elif [[ "$1" == "disable" ]]
  then
    rvm_log "Removing the global cache (note: this will empty the caches)"
    __rvm_read_lines directories <(
      __rvm_cd "${rvm_gems_path:-"$rvm_path/gems"}" ;
      __rvm_find . -maxdepth 1 -mindepth 1 -type d -print | cut -c 3-
    )

    for directory_name in "${directories[@]//.\/}"
    do
      current_cache_path="${rvm_gems_path:-"$rvm_path/gems"}/$directory_name/cache"
      if [[ -L "$current_cache_path" \
        && "$(__rvm_readlink "$current_cache_path")" == "$rvm_gems_cache_path" ]]
      then
        rvm_log "Reverting the gem cache for $directory_name to an empty directory."
        \command \rm -f "$current_cache_path" 2>/dev/null
        mkdir -p "$current_cache_path" 2>/dev/null
      fi
    done
    __rvm_db_ "$rvm_user_path/db" "use_gemset_globalcache" "delete"
  elif [[ "$1" == "enable" ]]
  then
    rvm_log "Enabling global cache for gems."
    mkdir -p "$rvm_gems_cache_path"
    __rvm_read_lines directories <(
      __rvm_cd "${rvm_gems_path:-"$rvm_path/gems"}" ;
      __rvm_find . -maxdepth 1 -mindepth 1 -type d -print | cut -c 3-
    )
    for directory_name in "${directories[@]//.\/}"
    do
      current_cache_path="${rvm_gems_path:-"$rvm_path/gems"}/$directory_name/cache"
      if [[ -d "$current_cache_path" && ! -L "$current_cache_path" ]]
      then
        rvm_log "Moving the gem cache for $directory_name to the global cache."
        \command \mv "$current_cache_path/"*.gem "$rvm_gems_cache_path/" 2>/dev/null
        case "${current_cache_path%\/}" in
          *cache)
            __rvm_rm_rf "$current_cache_path"
            ln -fs "$rvm_gems_cache_path" "$current_cache_path"
            ;;
        esac
      fi
    done
    __rvm_db_ "$rvm_user_path/db" "use_gemset_globalcache" "true"
  else
    printf "%b" "

  Usage:

    rvm gemset globalcache {enable,disable,enabled}

    Enable / Disable / Status the use of a global gem cachedir.

"
    return 1
  fi
}

gemset_name()
{
  echo "${rvm_ruby_gem_home##*${rvm_gemset_separator:-"@"}}"
  return $?
}

gemset_dir()
{
  echo "$rvm_ruby_gem_home"
  return $?
}

__gemset_list_single()
{
  \typeset gemset current_gemset ruby_name default_name
  gemset="$1"
  current_gemset="$2"
  gemset="${gemset##*/}"
  ruby_name="${gemset%%${rvm_gemset_separator:-@}*}"
  gemset="${gemset#${ruby_name}}"
  gemset="${gemset#${rvm_gemset_separator:-@}}"

  if [[ "${_second_param}" == "strings" ]]
  then default_name="default"
  else default_name="(default)"
  fi
  [[ -n "${gemset}"         ]] || gemset="$default_name"
  [[ -n "${current_gemset}" ]] || current_gemset="$default_name"
  if
    [[ "${gemset}" == "${current_gemset}" ]]
  then
    if [[ "${_second_param}" == "strings" ]]
    then echo "${gemset} #current"
    else echo "=> ${gemset}"
    fi
  else
    if [[ "${_second_param}" == "strings" ]]
    then echo "${gemset}"
    else echo "   ${gemset}"
    fi
  fi
}

gemset_list()
{
  [[ -d "${rvm_gems_path:-"$rvm_path/gems"}" ]] || {
    rvm_error "${rvm_gems_path:-"$rvm_path/gems"} does not exist!"
    return 1
  }
  [[ -n "${rvm_ruby_string:-""}" ]] || {
    rvm_error "\$rvm_ruby_string is not set!"
    return 1
  }

  \typeset current_gemset IFS
  current_gemset=$(__rvm_current_gemset)
  IFS=""

  [[ "${_second_param}" == "strings" ]] ||
    rvm_log "\ngemsets for $rvm_ruby_string (found in ${rvm_gems_path:-"$rvm_path/gems"}/$rvm_ruby_string)"

  for gemset in ${rvm_gems_path:-${rvm_path}/gems}/${rvm_ruby_string} ${rvm_gems_path:-${rvm_path}/gems}/${rvm_ruby_string}${rvm_gemset_separator:-@}*
  do
    __gemset_list_single "${gemset}" "${current_gemset}"
  done

  [[ "${_second_param}" == "strings" ]] || printf "%b" "\n"
}

gemset_delete_task()
{
  \typeset rvm_gemset_name ruby_at_gemset gemdir
  rvm_gemset_name=$1
  ruby_at_gemset=$2
  gemdir=$3

  case ${_system_type} in
    (BSD)
      # will not find broken links
      __rvm_find "${rvm_bin_path:=$rvm_path/bin}" -name \*${ruby_at_gemset} -exec rm -rf '{}' \;
      __rvm_find -L "${rvm_bin_path:=$rvm_path/bin}" -name \*${ruby_at_gemset} -exec rm -rf '{}' \;
      ;;
    (*)
      __rvm_find "${rvm_bin_path:=$rvm_path/bin}" \( -name \*${ruby_at_gemset} -or -lname \*${ruby_at_gemset}/\* \) -delete
      ;;
  esac
  for item in $( $rvm_scripts_path/alias search_by_target ${ruby_at_gemset} )
  do
    $rvm_scripts_path/alias delete ${item}
  done
  __rvm_rm_rf "$gemdir" &&
  __rvm_rm_rf "${rvm_wrappers_path:="$rvm_path/wrappers"}/${ruby_at_gemset}" &&
  __rvm_rm_rf "${rvm_environments_path:="$rvm_path/environments"}/${ruby_at_gemset}"
}

gemset_delete()
{
  [[ -n "${GEM_HOME:-}" ]] ||
  {
    rvm_error "A ruby must be selected in order to delete a gemset."
    return 1
  }
  if (( ${rvm_ruby_selected_flag:-0} == 0))
  then __rvm_ruby_string
  fi
  [[ -n "$rvm_gemset_name" ]] ||
  {
    rvm_error "A gemset name must be specified in order to delete a gemset."
    return 1
  }

  ruby_at_gemset="$rvm_ruby_string${rvm_gemset_separator:-"@"}$rvm_gemset_name"
  gemdir="${rvm_gems_path:-$rvm_path/gems}/${ruby_at_gemset}"

  [[ -e "$gemdir" ]] ||
  {
    rvm_warn "$gemdir did not previously exist. Ignoring."
    return 0
  }

  (( ${rvm_force_flag:-0} )) ||
  __rvm_ask_for "Are you SURE you wish to remove the entire gemset directory '$rvm_gemset_name' ($gemdir)?" yes ||
  {
    rvm_log "Not doing anything, phew... close call that one eh?"
    return 2
  }

  __rvm_log_command "gemset.delete" "Removing gemset $rvm_gemset_name" \
    gemset_delete_task "$rvm_gemset_name" "$ruby_at_gemset" "$gemdir"
}

gemset_remove()
{
  gemset_delete $1
}

gemset_empty()
{
  \typeset gemdir entry
  if
    [[ -n "${GEM_HOME}" ]]
  then
    if
      [[ ${rvm_force_flag:-0} -gt 0 ]] ||
      __rvm_ask_for "Are you SURE you wish to remove the installed gems for ${GEM_HOME}?" yes
    then
      gem_install gem-empty &&
      \command \gem empty &&
      rvm_log "Removed successfully." ||
      return $?
    else
      rvm_log "Not doing anything, phew... close call that one eh?"
      return 2
    fi
  fi
}

# Migrate gemsets from ruby X to ruby Y
gemset_copy()
{
  \typeset source_ruby destination_ruby source_path destination_path

  # Clear the current environment so that it does not influence this operation.
  unset rvm_gemset_name rvm_ruby_gem_home GEM_HOME GEM_PATH

  source_ruby="${1:-}"
  destination_ruby="${2:-}"
  shift 2
  if
    [[ -z "$destination_ruby" || -z "$source_ruby" ]]
  then
    rvm_help gemset copy
    return 1
  fi
  # Verify the destination gemset exists before attempting to use it.
  (
    rvm_ruby_string="$destination_ruby"
    export rvm_create_flag=1
    { __rvm_ruby_string && __rvm_gemset_select; } 2> /dev/null
  ) ||
  {
    rvm_error "Destination gemset '$destination_ruby' does not yet exist."
    return 1
  }

  # TODO: Account for more possibilities:
  #   rvm gemset copy 1.9.2 @gemsetb        # From 1.9.2 default to current ruby, 1.9.2 exists.
  #   rvm gemset copy @gemseta @gemsetb     # Current ruby, gemseta exists.
  #   rvm gemset copy gemseta gemsetb       # Currently Ruby, gemseta exists.
  #   rvm gemset copy gemseta 1.8.7@gemsetb # Currently Ruby@gemseta, current ruby@gemseta exists.

  source_path=$(
    __rvm_select "$source_ruby" > /dev/null 2>&1
    echo $rvm_ruby_gem_home
  )
  destination_path=$(
    __rvm_select "$destination_ruby" > /dev/null 2>&1
    echo $rvm_ruby_gem_home${rvm_expected_gemset_name:+@}${rvm_expected_gemset_name:-}
  )
  if
    [[ -z "$source_path" || ! -d "$source_path" ]]
  then
    rvm_error "Unable to expand '$source_ruby' or directory does not exist."
    return 1
  elif
    [[ -z "$destination_path" ]]
  then
    rvm_error "Unable to expand '$destination_ruby'."
    return 1
  fi

  if
    [[ -d "$source_path" ]]
  then
    rvm_log "Copying gemset from $source_ruby to $destination_ruby"
    for dir in "$source_path"/*
    do
      if
        [[ -d "$dir" ]]
      then
        __rvm_cp -Rf "$dir" "$destination_path/"
      elif
        [[ -L "$dir" ]]
      then
        __rvm_cp "$dir" "$destination_path/${dir##*/}"
      else
        rvm_debug "$dir not a file or link, not copying"
      fi
    done
    __rvm_log_command "gemset.wrappers"  "Generating gemset wrappers ${destination_path##*/}" gemset_reset_env "${destination_path##*/}" &&
    __rvm_gemset_pristine "$destination_ruby"
  else
    rvm_error "Gems directory does not exist for $source_path ($source_path)"
    return 1
  fi
}

# Migrate gemsets from ruby X to ruby Y
gemset_rename_()
{
  \command \mv "$source_path" "$destination_path" &&
  \command \rm "${rvm_wrappers_path:="$rvm_path/wrappers"}/${source_path##*/}" &&
  \command \rm "${rvm_environments_path:="$rvm_path/environments"}/${source_path##*/}"
}

# Migrate gemsets from ruby X to ruby Y
gemset_rename()
{
  \typeset source_name destination_name source_path destination_path

  source_name="${1:-}"
  destination_name="${2:-""}"
  shift 2
  if
    [[ -z "$destination_name" || -z "$source_name" ]]
  then
    rvm_error "Source and destination gemsets must be specified: 'rvm gemset rename X Y'"
    return 1
  fi
  source_path="$(
    rvm_use_flag=0 rvm_silence_logging=1 rvm_gemset_name=${source_name} __rvm_use "${rvm_ruby_string}@${source_name}" 1>&2 ;
    gem env gemdir
  )"
  if
    [[ -z "$source_path" || ! -d "$source_path" ]]
  then
    rvm_error "gemset '$source_name' does not exist."
    return 2
  fi
  destination_path=${source_path/%$source_name/$destination_name}
  if
    [[ -d "$source_path" ]]
  then
    if
      [[ ! -d "$destination_path" ]]
    then
      __rvm_log_command "gemset.rename" "Renaming gemset ${source_path##*/} => ${destination_path##*/}" gemset_rename_ &&
      __rvm_log_command "gemset.reset"  "Reseting gemset ${destination_path##*/}" gemset_reset_env "${destination_path##*/}" &&
      __rvm_gemset_pristine "${destination_path##*/}"
    else
      rvm_error "Gemset $destination_name already exists!"
      return 1
    fi
  else
    rvm_error "Gems directory does not exist for $source_path ($source_path)"
    return 1
  fi
}

gemset_move()
{
  gemset_rename $1 $2
}

gemset_unpack()
{
  \typeset gems name directory version  _platforms
  directory="${1:-vendor/gems}"
  if
    [[ -n "$rvm_ruby_gem_home" ]]
  then
    export GEM_HOME="$rvm_ruby_gem_home"
    export GEM_PATH="$rvm_ruby_gem_home:$rvm_ruby_global_gems_path"
  fi

  rvm_log "Unpacking current environments gemset to ${directory}\n"
  unset -f gem

  while read gem_name version _platforms
  do
    ( command gem unpack "$gem_name" -v"$version" --target "$directory" )&
  done <<<"$(
    GEM_PATH="$GEM_HOME" __rvm_list_gems
  )"
  wait
  rvm_log "Unpacking into ${directory} complete\n"
  return 0
}

gemset_export()
{
  \typeset rvm_file_name gem_name version versions _platforms
  rvm_file_name="${1:-}"
  if
    [[ -n "$rvm_ruby_gem_home" ]]
  then
    export GEM_HOME="$rvm_ruby_gem_home"
    export GEM_PATH="$rvm_ruby_gem_home:$rvm_ruby_global_gems_path"
  fi
  if
    [[ -n "$rvm_file_name" ]]
  then
    [[ "${rvm_file_name}" == *Gemfile ]] || rvm_file_name="${rvm_file_name%.gems}.gems"
  else
    if [[ -n "$rvm_gemset_name" ]]
    then rvm_file_name="$rvm_gemset_name.gems"
    else rvm_file_name="default.gems"
    fi
  fi
  rvm_log "Exporting current environments gemset to $rvm_file_name"
  if [[ -f "$rvm_file_name" ]]
  then \command \rm -f "$rvm_file_name"
  fi
  if
    [[ "${rvm_file_name}" == *Gemfile ]]
  then
    printf "%b" "source 'https://rubygems.org'

#ruby=${GEM_HOME##*/}

"
  else
    printf "%b" "# $rvm_file_name generated gem export file. \
Note that any env variable settings will be missing. \
Append these after using a ';' field separator

"
  fi > "$rvm_file_name"
  if
    (( ${rvm_latest_flag:-0} == 0 ))
  then
    while read gem_name version _platforms
    do
      if [[ "${rvm_file_name}" == *Gemfile ]]
      then echo "gem '$gem_name', '$version'"
      else echo "$gem_name -v$version"
      fi
    done <<<"$( GEM_PATH="$GEM_HOME" __rvm_list_gems )"
  else
    while read gem_name versions
    do
      if [[ "${rvm_file_name}" == *Gemfile ]]
      then echo "gem '$gem_name'"
      else echo "$gem_name"
      fi
    done <<<"$( GEM_PATH="$GEM_HOME" gem list )"
  fi >> "$rvm_file_name"
}

# Output the user's current gem directory.
gemset_info()
{
  if
    (( ${rvm_user_flag:-0} == 1 ))
  then
    (__rvm_use system ; gem env | __rvm_grep "\- $HOME" | __rvm_awk '{print $NF}')
  elif
    [[ ${rvm_system_flag:-0} == 1 ]]
  then
    (__rvm_use system ; gem env $action system)
  elif
    [[ -n "${rvm_ruby_string:-""}${rvm_gemset_name:+${rvm_gemset_separator:-"@"}}${rvm_gemset_name:-}" ]]
  then
    #TODO: why on ubuntu oneiric 32bit it's not enough to use gem env? why need to use again???
    (
      __rvm_use "${rvm_ruby_string:-""}${rvm_gemset_name:+${rvm_gemset_separator:-"@"}}${rvm_gemset_name:-}"
      gem env $action
    )
  else
    gem env $action
  fi
  return $?
}

gemset_prune()
{
  \typeset temporary_cache_path live_cache_path gemset_name version versions cached_gem_name cached_file_path

  temporary_cache_path="$GEM_HOME/temporary-cache"
  live_cache_path="$GEM_HOME/cache"

  mkdir -p "$temporary_cache_path"
  rvm_log "Moving active gems into temporary cache..."
  while
    read gem_name version _platforms
  do
    cached_gem_name="${gem_name}-${version}.gem"
    cached_file_path="${live_cache_path}/${cached_gem_name}"
    if
      [[ -f "$cached_file_path" ]]
    then
      \command \mv "$cached_file_path" "${temporary_cache_path}/${cached_gem_name}"
    fi
  done <<<"$( GEM_PATH="$GEM_HOME" __rvm_list_gems )"

  rvm_log "Removing live cache and restoring temporary cache..."
  # Switch the cache back.
  __rvm_rm_rf "$live_cache_path"
  \command \mv "$temporary_cache_path" "$live_cache_path"
  return 0
}

gem_search()
{
  \typeset gemspec gemspecs gem_name option environment_id ruby_string name gem_version
  gem_name="${1:-}"
  option="${2:-}"

  if [[ -z "${gem_name}" ]]
  then
    return 0
  fi

  true "${rvm_gems_path:="$rvm_path/gems"}"

  __rvm_read_lines gemspecs <(
    __rvm_find "${rvm_gems_path}" -mindepth 3 -iname "${gem_name}*.gemspec"  -type f
  )

  if [[ "${option}" != "strings" ]]
  then
    printf "%-40s %-20s %-20s\n" "environment_id" "name" "version"
    printf "%b" "================================================================================\n"
  fi

  for gemspec in "${gemspecs[@]}"
  do
    environment_id="${gemspec//${rvm_gems_path}\/}"
    environment_id="${environment_id//\/*}"
    ruby_string="${environment_id//@*}"
    gemset_name="${environment_id//${ruby_string}}"
    name=${gemspec//*\/}
    name=${name/%.gemspec}
    gem_version=${name}
    name=${name%%-+([0-9\.])}
    gem_version=${gem_version#${name}-}
    if [[ "$name" == "$gem_version" ]]
    then gem_version=""
    fi

    if [[ "${option}" != "strings" ]]
    then
      printf "%-40s %-20s %-20s\n" "${environment_id}" "${name}" "${gem_version}"
    else
      printf "%b" "${environment_id}\n"
    fi
  done
}

action="$1"
(( $# == 0 )) || shift
export _second_param="${1:-}"
export rvm_gemset_name="${1:-}"
rvm_sticky_flag=1

gemset_actions_with_gem=(
  gemdir gempath gemhome home path version export dump import
  load pristine copy install initial prune rename move update unpack
)
if
  [[ " ${gemset_actions_with_gem[*]} " == *" $action "* ]] &&
  ! builtin command -v gem > /dev/null
then
  rvm_error "'gem' was not found, cannot perform gem actions (Do you have an RVM ruby selected?)"
  exit 1
fi

if [[ " $* " == *" --force "* ]]
then export rvm_force_flag=1
fi

if
  [[ -z "$rvm_ruby_string" && "${GEM_HOME:-""}" == "${rvm_path}"* ]]
then
  rvm_ruby_string="${GEM_HOME##*/}"
  rvm_ruby_string="${rvm_ruby_string%%@*}"
fi
if
  [[ -z "$rvm_gemset_name" && "${GEM_HOME:-""}" == "${rvm_path}"* ]]
then
  rvm_gemset_name="${GEM_HOME##*/}"
  rvm_gemset_name="${rvm_gemset_name#${rvm_gemset_name%%@*}}"
  rvm_gemset_name="${rvm_gemset_name#@}"
fi

rvm_ruby_gem_home="${rvm_ruby_gem_home:-$GEM_HOME}"
if
  [[ ! -d "$rvm_ruby_gem_home" ]] &&
  builtin command -v gem > /dev/null 2>&1
then
  rvm_ruby_gem_home="$(gem env home)"
fi

case "$action" in
  import|load)
    if
      [[ -z "${rvm_ruby_strings:-""}" ]]
    then
      gemset_import "Installing gems" "$1"
    else
      rubies=()
      __rvm_custom_separated_array rubies , "$rvm_ruby_strings"
      for rvm_ruby_string in "${rubies[@]}"
      do
        __rvm_with "$rvm_ruby_string" gemset_import "Installing gems" "$1"
      done
    fi
    ;;
  export|dump)
    gemset_export "$@"
    ;;
  empty)
    __rvm_use "${1:+@}${1:-${GEM_HOME##*/}}"
    gemset_$action "$@"
    ;;
  create|initial|list)
    __rvm_select
    rvm_gemset_name="${rvm_gemset_name:-${rvm_expected_gemset_name:-}}"
    gemset_$action "$@"
    ;;
  copy|delete|dir|globalcache|list_all|list_strings|move|pristine|prune|rename|remove|update|unpack|reset_env)
    gemset_$action "$@"
    ;;
  name|string)
    gemset_name "$@"
    ;;
  strings)
    gemset_list "$@"
    ;;
  gemdir|gempath|gemhome|home|path|version)
    gemset_info "$@"
    ;;
  install|search)
    gem_$action "$@"
    ;;
  clear)
    rvm_error "'rvm gemset clear' has been deprecated. Please use 'rvm use @default' instead."
    ;;
  help)
    rvm_help gemset
    ;;
  *)
    rvm_error_help "Unknown subcommand '$action'" gemset
    exit 1
    ;;
esac
scripts/base000077500000006002147511530550007101 0ustar00#!/usr/bin/env bash

# Base is a collection of general files + commonly included setup functions.

#duplicated from scripts/rvm - rare reload issue
__rvm_has_opt()
{
  if # pre-gnu
   [[ -n "${ZSH_VERSION:-}"  ]]
  then
    setopt | GREP_OPTIONS="" \command \grep "^${1:-}$" >/dev/null 2>&1 || return $?
  elif # mksh
    [[ -n "${KSH_VERSION:-}"  ]]
  then
    set +o | GREP_OPTIONS="" \command \grep "-o ${1:-}$" >/dev/null 2>&1 || return $?
  elif # bash
    [[ -n "${BASH_VERSION:-}" ]]
  then
    [[ ":${SHELLOPTS:-}:" == *":${1:-}:"* ]] || return $?
  else # what is this?!
    return 1
  fi
}

if __rvm_has_opt "errexit"
then rvm_stored_errexit=1
fi

set +e

# duplication marker jkdfkdfngjdjkfngjkdfngjkd
if
  (( ${rvm_trace_flag:-0} == 1 ))
then
  if   [[ -n "${BASH_VERSION:-}" ]]
  then export PS4="+ \$(__rvm_date \"+%s.%N\" 2>/dev/null) \${BASH_SOURCE##\${rvm_path:-}} : \${FUNCNAME[0]:+\${FUNCNAME[0]}()}  \${LINENO} > "
  elif [[ -n "${ZSH_VERSION:-}" ]]
  then export PS4="+ %* %F{red}%x:%I %F{green}%N:%i%F{white} %_"
  fi
  set -o xtrace
fi
export __array_start rvm_path >/dev/null

#
# Setup environment parameters.
#
if [[ -n "${ZSH_VERSION:-}" ]]
then __array_start=1
else __array_start=0
fi

if (( ${rvm_ignore_rvmrc:=0} == 0 ))
then
  [[ -n "${rvm_stored_umask:-}" ]] || export rvm_stored_umask=$(umask)
  rvm_rvmrc_files=("/etc/rvmrc" "$HOME/.rvmrc")
  if [[ -n "${rvm_prefix:-}" ]] && ! [[ "$HOME/.rvmrc" -ef "${rvm_prefix}/.rvmrc" ]]
     then rvm_rvmrc_files+=( "${rvm_prefix}/.rvmrc" )
  fi

  for rvmrc in "${rvm_rvmrc_files[@]}"
  do
    if [[ -f "$rvmrc" ]]
    then
      # pre-gnu
      if GREP_OPTIONS="" \command \grep '^\s*rvm .*$' "$rvmrc" >/dev/null 2>&1
      then
        printf "%b" "
Error:
        $rvmrc is for rvm settings only.
        rvm CLI may NOT be called from within $rvmrc.
        Skipping the loading of $rvmrc"
        return 1
      else
        source "$rvmrc"
      fi
    fi
  done
  unset rvm_rvmrc_files
fi

# duplication marker jdgkjnfnkjdngjkfnd4fd
export rvm_path
if [[ -z "${rvm_path:-}" ]]
then
  if [[ -n "${BASH_SOURCE:-$_}" && -f "${BASH_SOURCE:-$_}" ]]
  then
    rvm_path="${BASH_SOURCE:-$_}"
    rvm_path="$( \command \cd "${rvm_path%/scripts/base}">/dev/null; pwd )"
  elif (( UID == 0 )) && [[ -d "/usr/local/rvm" ]]
  then rvm_path="/usr/local/rvm"
  elif [[ -d "${HOME}/.rvm" ]]
  then rvm_path="${HOME}/.rvm"
  elif [[ -d "/usr/local/rvm" ]]
  then rvm_path="/usr/local/rvm"
  else echo "Can't find rvm install!" 1>&2 ; exit 1
  fi
fi

true ${rvm_scripts_path:="$rvm_path/scripts"}

# Load the general scripts.
# Use rvm_base_except="selector", for example, to override the loading.
load_rvm_scripts()
{
  \typeset -a scripts
  scripts=(
    selector logging support utility init cleanup env rvmrc install environment gemset checksum list
  )

  source "${rvm_scripts_path}/initialize"


  for entry in ${scripts[@]}
  do
    [[ " ${rvm_base_except:-} " == *" $entry "* ]] ||
    source "${rvm_scripts_path}/functions/$entry"  ||
    return $?
  done

  unset rvm_base_except
}
load_rvm_scripts
scripts/irbrc.rb000066400000003074147511530550007675 0ustar00# This is the common irbrc file used by all rvm ruby installations.
# This file will be overriden every time you update rvm.

# Calculate the ruby string.
rvm_ruby_string = ENV["rvm_ruby_string"] ||
  (
    ENV['GEM_HOME'] &&
    ( path = ( File.realpath(ENV['GEM_HOME'].to_s) rescue nil ) ) &&
    ( path = $1 if path =~ /(.+)\/$/ ; true ) &&
    String(String(path).split(/\//).last).split(/@/).first
  ) ||
  ("#{RUBY_VERSION}-p#{RUBY_PATCHLEVEL}" rescue nil) ||
  (RUBY_DESCRIPTION.split(" ")[1].sub('p', '-p') rescue nil ) ||
  (`ruby -v` || '').split(" ")[1].sub('p', '-p')

# cut ruby- ... everyone knows it's ruby
rvm_ruby_string = $1 if rvm_ruby_string =~ /^ruby[- ](.*)/

# Set up the prompt to be RVM specific.
@prompt = {
  :PROMPT_I => "#{rvm_ruby_string} :%03n > ",  # default prompt
  :PROMPT_S => "#{rvm_ruby_string} :%03n%l> ", # known continuation
  :PROMPT_C => "#{rvm_ruby_string} :%03n > ",
  :PROMPT_N => "#{rvm_ruby_string} :%03n?> ", # unknown continuation
  :RETURN => " => %s \n",
  :AUTO_INDENT => true
}
IRB.conf[:PROMPT] ||= {}
IRB.conf[:PROMPT][:RVM] = @prompt
IRB.conf[:PROMPT_MODE] = :RVM if IRB.conf[:PROMPT_MODE] == :DEFAULT

require "irb/completion" rescue nil

IRB.conf[:SAVE_HISTORY] = 100
IRB.conf[:HISTORY_FILE] = File.join(ENV["HOME"], ".irb-history")

# Load the user's irbrc file, if possible.
# Report any errors that occur.
begin
  load File.join(ENV["HOME"], ".irbrc") if File.exist?("#{ENV["HOME"]}/.irbrc")
rescue LoadError => load_error
  puts load_error
rescue => exception
  puts "Error : 'load #{ENV["HOME"]}/.irbrc' : #{exception.message}"
end
scripts/rtfm000077500000000451147511530550007141 0ustar00#!/usr/bin/env bash

rvm_url="https://rvm.io/"

source "$rvm_path/scripts/functions/logging"

if builtin command -v open >/dev/null ; then

  open "$rvm_url"

elif builtin command -v xdg-open >/dev/null ; then

  xdg-open "$rvm_url"

else

  rvm_log "Please RTFM at the URL $rvm_url"

fi

exit $?
scripts/group000077500000001726147511530550007333 0ustar00#!/usr/bin/env bash

source "$rvm_scripts_path/base"
source "$rvm_scripts_path/functions/group"
source "$rvm_scripts_path/functions/utility"
source "$rvm_scripts_path/functions/version"

group_add()
{
  \typeset user group
  group="$1"
  shift
  for user in "$@"
  do
    if
      __rvm_is_user_in_group "$group" "$user"
    then
      echo "User '$user' already in the group '$group'"
    else
      echo "Adding user '$user' to the group '$group'"
      __rvm_add_user_to_group "$group" "$user"
    fi
  done
}

group_create()
{
  \typeset -a _params
  _params=( "${1:-$rvm_group_name}" )
  shift
  if
    (( $# ))
  then
    _params+=( "$1" )
  else
    if [[ "$1" == "${rvm_group_name}" && -n "${rvm_group_id:-}" ]]
    then _params+=( "${rvm_group_id:-}" )
    fi
  fi
  __rvm_create_group "${_params[@]}"
}

action="$1"
shift

true "${rvm_group_name:=rvm}"

case "$action" in
  add|create|help)
    group_$action "$@"
    ;;
  *)
    rvm_help group "$@"
    false
    ;;
esac
scripts/zsh/Completion/_rvm000064400000010147147511530550012047 0ustar00#compdef rvm

\typeset curcontext state line cmds ret

curcontext="$curcontext"
ret=1

_arguments -C \
  '(- 1 *)'{-v,--version}'[display version information]' \
  '(-l|--level)'{-l,--level}'+[patch level to use with rvm use / install]:number' \
  '(--bin)--bin[path for binaries to be placed (~/.rvm/bin/)]:path:_files' \
  '(--source)--source[src directory to use (~/.rvm/src/)]:path:_files' \
  '(--archives)--archives[directory for downloaded files (~/.rvm/archives/)]:path:_files' \
  '-S[Specify a script file to attempt to load and run (rubydo)]:file:_files' \
  '-e[Execute code from the command line]:code' \
  '(-G)-G[root gem path to use]:path:_files' \
  '(--gems)--gems[Used to set the gems_flag, use with remove to remove gems]' \
  '(--archive)--archive[Used to set the archive_flag, use with remove to remove archive]' \
  '(--patch)--patch[With MRI Rubies you may specify one or more full paths to patches]' \
  '(-C|--configure)'{-C,--configure}'=[custom configure options]' \
  '(--nice)--nice[process niceness (for slow computers, default 0)]:number' \
  '(--ree)--ree-options[Options passed directly to ree ./installer on the command line]:options' \
  '(--head)--head[with update, updates rvm to git head version]' \
  '(--rubygems)--rubygems[with update, updates rubygems for selected ruby]' \
  '(--default)--default[with ruby select, sets a default ruby for new shells]' \
  '(--debug)--debug[Toggle debug mode on for very verbose output]' \
  '(--trace)--trace[Toggle trace mode on to see EVERYTHING rvm is doing]' \
  '(--force)--force[Force install, even given ruby is already install]' \
  '(--summary)--summary[Used with rubydo to print out a summary of the commands run]' \
  '(--latest)--latest[with gemset --dump skips version strings for latest gem]' \
  '(--gems)--gems[with uninstall/remove removes gems with the interpreter]' \
  '(--docs)--docs[with install, attempt to generate ri after installation]' \
  '(--reconfigure)--reconfigure[Force ./configure on install even if Makefile already exists]' \
  '(--quiet-curl)--quiet-curl[Makes curl silent when fetching data]' \
  '1: :->cmds' \
  '*: :->args' && ret=0

case $state in

  cmds)

    cmds=( ${(f)"$(_call_program commands rvm help 2> /dev/null | __rvm_sed -e '/^== Action/,/^== Implementation/!d; / :: /!d; s/^[ *]*\([^ ]*\) *:: *\(.*\)/\1:\2/')"} )
    cmds+=( $(rvm list strings) )
    _describe -t commands 'rvm command' cmds && ret=0
    ;;

  args)

    case $line[1] in

      (use|uninstall|remove|list)

        if (( CURRENT == 3 )); then
          # See if we’ve made it to the ‘@’; eg, 1.9.2@
          if ! __rvm_grep '@' <<< "${line[CURRENT-1]}" >/dev/null ; then
            _values -S , 'rubies' \
              $(rvm list strings | __rvm_sed -e 's/ruby-\([^) ]*\)-\([^) ]*\)/ruby-\1-\2 \1-\2 \1/g') \
              default system $(rvm alias list names) && ret=0
          else
            # Construct a full version string for each of the gemsets.
            # Eg, 1.9.2@min 1.9.2@rail3 …
            _values -S , 'gemsets' \
              $(rvm ${line[CURRENT-1]%%@*} gemset list | __rvm_awk '/^[ -_[:alnum:]]+$/ {print "'${line[CURRENT-1]%%@*}'@"$1}')
          fi
        fi
        ;;

      (install|fetch)

        _values -S , 'rubies' $(rvm list known_strings) && ret=0
        ;;

      gemset)

        if (( CURRENT == 3 )); then
          _values 'gemset_commands' $(rvm gemset help | __rvm_sed -e '/create/!d; s/^.*[{]\(.*\)[}].*$/\1/; s/,/ /g')
        else
          #_values -S , 'gemsets' $(rvm gemset list | __rvm_grep -v gemset 2>/dev/null)
          _values -S , 'gemsets' $(rvm gemset list | __rvm_grep -Ev '(gemset|info)' 2>/dev/null | __rvm_awk '/^[ -_[:alnum:]]+$/ {print '$1'}')
        fi
        ret=0
        ;;

      package)

        if (( CURRENT == 3 )); then
          _values 'package_commands' $(rvm package | __rvm_sed -e '/Usage/!d; s/^.*[{]\(.*\)[}] [{].*$/\1/; s/,/ /g')
        else
          _values 'packages' $(rvm package | __rvm_sed -e '/Usage/!d; s/^.*[}] [{]\(.*\)[}].*$/\1/; s/,/ /g')
        fi
        ret=0
        ;;

      *)
        (( ret )) && _message 'no more arguments'
        ;;

    esac
    ;;
esac

return ret
scripts/cli000077500000077633147511530550006760 0ustar00#!/usr/bin/env bash

__rvm_parse_args_find_known_flags()
{
  \typeset _args_array_name _temp_var
  \typeset -a _new_args
  _args_array_name="$1"
  (( $# == 0 )) || shift
  _new_args=()
  while
    (( $# ))
  do
    case "$1" in
      (--verify-downloads)
        export "rvm_verify_downloads_flag_cli"="${2:-}"
        shift
        ;;
      (--force|--verbose|--debug|--quiet|--silent|--create)
        export "rvm_${1#--}_flag=1"
        ;;
      (--only-path)
        _temp_var="${1#--}"
        export "rvm_${_temp_var//-/_}_flag=1"
        ;;
      (--32|--64)
        rvm_architectures+=( "${1#--}" )
        rvm_disable_binary_flag=1
        ;;
      (--universal)
        rvm_architectures+=( "32" "64" )
        rvm_disable_binary_flag=1
        ;;
      (--patches|--patch)
        __rvm_custom_separated_array rvm_patch_names , "${2:-}"
        rvm_patch_original_pwd="$PWD"
        rvm_disable_binary_flag=1
        shift
        ;;
      (--autolibs=*)
        export rvm_autolibs_flag="${1#*=}"
        ;;
      (--)
        shift
        _new_args+=( "$@" )
        shift $#
        ;;
      (*)
        _new_args+=( "$1" )
        ;;
    esac
    (( $# == 0 )) || shift # check in case shifted already
  done
  eval "${_args_array_name}+=( \"\${_new_args[@]}\" )"
}

__rvm_parse_args_error_finding_project_file()
{
  unset RVM_PROJECT_PATH
  case $? in
    101)
      true # should be printed already
      ;;
    *)
      rvm_error_message="Could not determine which Ruby to use; $rvm_token should contain .rvmrc or .versions.conf or .ruby-version or .rbfu-version or .rbenv-version, or an appropriate line in Gemfile."
      ;;
  esac
  rvm_action="error"
}

__rvm_parse_args()
{
  \typeset _string
  export rvm_ruby_string

  rvm_action="${rvm_action:-""}"
  rvm_parse_break=0

  if
    [[ " $* " == *" --trace "* ]]
  then
    echo "$@"
    __rvm_print_headline
  fi

  while
    [[ -n "$next_token" ]]
  do
    rvm_token="$next_token"
    if
      (( $# > 0 ))
    then
      next_token="$1"
      shift
    else
      next_token=""
    fi

    case "$rvm_token" in

      [0-9a-zA-ZuU]*|@*) # Commands, Rubies and Gemsets
        case "$rvm_token" in
          use)
            rvm_action="$rvm_token"
            rvm_verbose_flag=1
            __rvm_file_env_check_unload
            if
              [[ -n "${next_token:-}" && ! -d "${next_token:-}" &&
                "${next_token:-}" != "-"* && "${next_token:-}" != "@"*
              ]]
            then
              rvm_ruby_interpreter="$next_token"
              rvm_ruby_string="$next_token"
              rvm_ruby_strings="$next_token"
              next_token="${1:-}"
              (( $# == 0 )) || shift
            elif
              [[ -z "${next_token:-}" ]] &&
              __rvm_project_dir_check .
            then
              __rvm_rvmrc_tools try_to_read_ruby . ||
                __rvm_parse_args_error_finding_project_file
            fi
            ;;

          install|uninstall|reinstall|try_install)
            export ${rvm_token}_flag=1
            rvm_action=$rvm_token
            ;;

          gemset)
            rvm_action=$rvm_token
            rvm_ruby_args=()
            __rvm_parse_args_find_known_flags rvm_ruby_args  "$next_token" "$@"
            : rvm_ruby_args:${#rvm_ruby_args[@]}:${rvm_ruby_args[*]}:
            next_token="${rvm_ruby_args[__array_start]}"
            rvm_gemset_name="${rvm_ruby_args[__array_start+1]}"

            case "${next_token:-help}" in
              (help)
                true
                ;;
              (use|delete|remove)
                [[ "delete" != "$next_token" ]] || [[ "remove" != "$next_token" ]] || rvm_delete_flag=1
                [[ "use"    != "$next_token" ]] || rvm_action+="_$next_token"

                case "$rvm_gemset_name" in
                  *${rvm_gemset_separator:-"@"}*)
                    rvm_ruby_string="${rvm_gemset_name%%${rvm_gemset_separator:-"@"}*}"
                    rvm_gemset_name="${rvm_gemset_name##*${rvm_gemset_separator:-"@"}}"
                    if
                      [[ "${rvm_ruby_string:-""}" != "${rvm_gemset_name:-""}" ]]
                    then
                      rvm_ruby_string="$rvm_ruby_string${rvm_gemset_separator:-"@"}$rvm_gemset_name"
                    fi
                    rvm_ruby_gem_home="$rvm_ruby_gem_home${rvm_gemset_separator:-"@"}$rvm_gemset_name"
                    ;;
                  ("")
                    rvm_error "Gemset was not given.\n  Usage:\n    rvm gemset $rvm_gemset_name <gemsetname>\n"
                    return 1
                    ;;
                esac
                ;;
            esac
            rvm_parse_break=1
            ;;

          gemdir|gempath|gemhome)
            rvm_ruby_args=("$rvm_token")
            rvm_action="gemset"
            rvm_gemdir_flag=1
            if
              [[ "system" == "$next_token" ]]
            then
              rvm_system_flag=1
              next_token="${1:-}"
              (( $# == 0 )) || shift
            fi
            if
              [[ "user" == "$next_token" ]]
            then
              rvm_user_flag=1
              next_token="${1:-}"
              (( $# == 0 )) || shift
            fi
            ;;

          pkg)
            rvm_action="$rvm_token"
            __rvm_parse_args_find_known_flags rvm_ruby_args  "$next_token" "$@"
            rvm_parse_break=1
            ;;

          do|exec)
            if
              [[ -z "$next_token" ]]
            then
              rvm_action="error"
              rvm_error_message="'rvm $rvm_token' must be followed by arguments."
              break
            fi
            rvm_action="do"
            rvm_ruby_args=("$next_token" "$@")
            rvm_parse_break=1
            ;;

          gem|rake|ruby)
            [[ "$rvm_token" == "ruby" ]] &&
            case $rvm_action in
              install|reinstall|use|delete|remove)
                rvm_ruby_string=ruby
                rvm_ruby_strings=ruby
                continue
              ;;
            esac
            # deprecated 2011.10.11 for RVM 1.9.0, removed 2012.09.13 for RVM 1.16.0
            rvm_action=error
            rvm_error_message="Please note that \`rvm $rvm_token ...\` was removed, try \`$rvm_token $next_token $*\` or \`rvm all do $rvm_token $next_token $*\` instead."
            ;;

          fetch|version|remote_version|reset|debug|reload|update|monitor|notes|implode|seppuku|env|unexport|automount|prepare)
            rvm_action=$rvm_token
            ;;

          doctor)
            rvm_action=notes
            ;;

          mount)
            rvm_action=$rvm_token
            while
              [[ -n "${next_token:-}" ]] &&
              [[ -x "${next_token:-}" ||
                -d "${next_token:-}" ||
                "${next_token:-}" == http* ||
                "${next_token:-}" == *tar.bz2 ||
                "${next_token:-}" == *tar.gz
              ]]
            do
              rvm_ruby_args=("$next_token" "${rvm_ruby_args[@]}")
              next_token="${1:-}"
              (( $# == 0 )) || shift
            done
            ;;

          rm|remove|delete)
            rvm_action="remove"
            rvm_remove_flag=1
            ;;

          rtfm|RTFM|rvmrc|help|inspect|list|ls|info|strings|get|current|docs|alias|rubygems|cleanup|tools|disk-usage|snapshot|repair|migrate|downgrade|upgrade|cron|group|switch|which|config-get|requirements|autolibs|osx-ssl-certs|fix-permissions)
            case "$rvm_token" in
              (downgrade) rvm_action="upgrade" ;;
              (ls)    rvm_action="list" ;;
              (RTFM)  rvm_action="rtfm" ;;
              (*)     rvm_action="$rvm_token" ;;
            esac
            rvm_ruby_args=()
            __rvm_parse_args_find_known_flags rvm_ruby_args "$next_token" "$@"
            rvm_parse_break=1
            ;;

          user)
            rvm_action="tools"
            rvm_ruby_args=("$rvm_token" "$next_token" "$@")
            rvm_parse_break=1
            ;;

          load-rvmrc)
            rvm_action="rvmrc"
            rvm_ruby_args=("load" "$next_token" "$@")
            rvm_parse_break=1
            ;;

          specs|tests)
            rvm_action="rake"
            rvm_ruby_args=("${rvm_token/%ss/s}")
            ;;

          export)
            if
              [[ -n "$next_token" ]]
            then
              \typeset -a ___args
              ___args=( "$next_token" "$@" )
              rvm_export_args="${___args[*]}"
              rvm_action="export"
              rvm_parse_break=1
            else
              rvm_action="error"
              rvm_error_message="rvm export must be followed by a NAME=VALUE argument"
            fi
            ;;

          alt*)
            rvm_action="help"
            rvm_ruby_args=("alt.md")
            rvm_parse_break=1
            ;;

          wrapper)
            rvm_action="wrapper"
            rvm_ruby_args=( "$next_token" "$@")
            rvm_parse_break=1
            ;;

          in)
            rvm_token="${next_token}"
            next_token="${1:-}"
            (( $# == 0 )) || shift
            export rvm_in_flag="$rvm_token"
            __rvm_project_dir_check "$rvm_token" &&
            __rvm_rvmrc_tools try_to_read_ruby $rvm_token ||
            __rvm_parse_args_error_finding_project_file
            ;;

          usage)
            rvm_action="deprecated"
            rvm_error_message="This command has been deprecated. Use ${rvm_notify_clr:-}rvm help${rvm_error_clr:-} instead."
            rvm_parse_break=1
            ;;

          *,*)
            rvm_ruby_strings="$rvm_token"
            [[ -n "${rvm_action:-""}" ]] ||
              rvm_action="ruby" # Not sure if we really want to do this but we'll try it out.
            ;;

          ${rvm_gemset_separator:-"@"}*)
            rvm_action="${rvm_action:-use}"
            rvm_gemset_name="${rvm_token#${rvm_gemset_separator:-"@"}}"
            rvm_ruby_string="${rvm_ruby_string:-${GEM_HOME##*/}}"
            rvm_ruby_string="${rvm_ruby_string%%${rvm_gemset_separator:-"@"}*}"
            rvm_ruby_strings="${rvm_ruby_string}${rvm_gemset_separator:-"@"}${rvm_gemset_name}"
            ;;

          *${rvm_gemset_separator:-"@"}*)
            rvm_verbose_flag=1
            rvm_action="${rvm_action:-use}"
            rvm_gemset_name="${rvm_token/*${rvm_gemset_separator:-"@"}/}"
            rvm_ruby_string="$rvm_token"
            rvm_ruby_strings="$rvm_token"
            ;;

          *+*)
            rvm_action="${rvm_action:-use}"
            rvm_ruby_alias="${rvm_token/*+/}"
            rvm_ruby_string="${rvm_token/+*/}"
            rvm_ruby_strings="$rvm_ruby_string"
            ;;

          *-*|+([0-9]).+([0-9])*)
            rvm_verbose_flag=1
            rvm_action="${rvm_action:-use}"
            rvm_ruby_string="$rvm_token"
            rvm_ruby_strings="$rvm_token"
            ;;

          opal*|jruby*|ree*|macruby*|rbx*|rubinius*|mruby|ironruby*|default*|maglev*|topaz*|truffleruby*|ruby*|system|default|all)
            rvm_action="${rvm_action:-use}"
            rvm_ruby_interpreter="$rvm_token"
            rvm_ruby_string="$rvm_token"
            rvm_ruby_strings="$rvm_token"
            ;;

          kiji*|tcs*|jamesgolick*)
            rvm_error_message="The $rvm_token was removed from RVM, use: rvm install ruby-head-<name> --url https://github.com/github/ruby.git --branch 2.1"
            rvm_action="error"
            ;;

          old)
            case "${rvm_action:-action-missing}" in
              remove)
                rvm_ruby_strings="old:${next_token:-}"
                next_token="${1:-}"
                (( $# == 0 )) || shift
                ;;
              action-missing)
                rvm_error_message="what do you want to do with old rubies? rvm can only remove old rubies."
                rvm_action="error"
                ;;
              *)
                rvm_error_message="rvm can not $rvm_action old rubies, rvm can only remove old rubies."
                rvm_action="error"
                ;;
            esac
            ;;

          *.rb) # we have a specified ruby script
            rvm_ruby_args=("$rvm_token")
            rvm_ruby_file="$rvm_token"
            if
              [[ -z "${rvm_action:-""}" || "$rvm_action" == "use" ]]
            then
              rvm_action="ruby"
            fi
            ;;

          *.gems)
            rvm_file_name="${rvm_token}"
            ;;

          ("")
            rvm_action="error"
            rvm_error_message="Unrecognized command line argument(s): $@"
            ;;

          *)
            if
              [[ "gemset" == "$rvm_action" ]]
            then
              rvm_gemset_name="${rvm_token/.gems/}"
              rvm_file_name="$rvm_gemset_name.gems"
            elif
              [[ -f "$rvm_rubies_path/$rvm_token" || -L "$rvm_rubies_path/$rvm_token" ]] # ruby || alias
            then
              rvm_ruby_string=$rvm_token
              rvm_ruby_strings="$rvm_token"
              rvm_action="${rvm_action:-use}"
            elif
              [[ -d  "$rvm_token" ]] ||
              __rvm_project_dir_check "$rvm_token"
            then
              __rvm_rvmrc_tools try_to_read_ruby $rvm_token ||
              __rvm_parse_args_error_finding_project_file
            else
              rvm_action="error"
              rvm_error_message="Unrecognized command line argument: $rvm_token"
            fi
            ;;
        esac
        ;;

      -*) # Flags
        case "$rvm_token" in
          -S)
            rvm_action="ruby"
            rvm_ruby_args=("$rvm_token" "$next_token" "$@")
            rvm_parse_break=1
            ;;

          -e)
            rvm_action="ruby"
            IFS="\n"
            rvm_ruby_args=("$rvm_token" "'$next_token $@'")
            IFS=" "
            rvm_parse_break=1
            ;;

          -v|--version)
            if [[ -z "$next_token" ]] ; then
              rvm_action="version"
            else
              rvm_ruby_version="$next_token"
              next_token="${1:-}"
              (( $# == 0 )) || shift
            fi
            ;;

          -n|--name)
            rvm_ruby_name="$next_token"
            next_token="${1:-}"
            (( $# == 0 )) || shift
            #TODO: ??? rvm_disable_binary_flag=1
            ;;

          --branch)
            rvm_ruby_repo_branch="$next_token"
            next_token="${1:-}"
            (( $# == 0 )) || shift
            rvm_disable_binary_flag=1
            ;;

          --tag)
            rvm_ruby_repo_tag="$next_token"
            next_token="${1:-}"
            (( $# == 0 )) || shift
            rvm_disable_binary_flag=1
            ;;

          --repository|--repo|--url)
            rvm_ruby_repo_url="$next_token"
            next_token="${1:-}"
            (( $# == 0 )) || shift
            rvm_disable_binary_flag=1
            ;;

          -r|--remote|--binary|--latest-binary)
            rvm_remote_flag=1
            if [[ "$rvm_token" == "--latest-binary" ]]
            then rvm_fuzzy_flag=1
            fi
            while
              [[ -n "${next_token:-}" ]] &&
              [[ "${next_token:-}" == http* ||
                "${next_token:-}" == *tar.bz2 ||
                "${next_token:-}" == *tar.gz ||
                "${next_token:-}" == *":"*
              ]]
            do
              rvm_ruby_args=("${rvm_ruby_args[@]}" "$next_token")
              next_token="${1:-}"
              (( $# == 0 )) || shift
            done
            ;;

          --ree-options)
            if
              [[ -n "$next_token" ]]
            then
              __rvm_custom_separated_array rvm_ree_options , "${next_token}"
              next_token="${1:-}"
              (( $# == 0 )) || shift
            else
              rvm_action="error"
              rvm_error_message="--ree-options *must* be followed by... well... comma,separated,list,of,options."
            fi
            ;;

          --patches|--patch)
            __rvm_custom_separated_array rvm_patch_names , "$next_token"
            next_token="${1:-}"
            (( $# == 0 )) || shift
            rvm_patch_original_pwd="$PWD"
            rvm_disable_binary_flag=1
            ;;

          --arch|--archflags)
            rvm_architectures+=( "${next_token#-arch }" )
            next_token="${1:-}"
            (( $# == 0 )) || shift
            rvm_disable_binary_flag=1
            ;;

          --with-arch=*)
            rvm_architectures+=( "${rvm_token#--with-arch=}" )
            rvm_disable_binary_flag=1
            ;;

          --32|--64)
            rvm_architectures+=( "${rvm_token#--}" )
            rvm_disable_binary_flag=1
            ;;

          --universal)
            rvm_architectures+=( "32" "64" )
            rvm_disable_binary_flag=1
            ;;

          --bin)
            rvm_bin_path="$next_token"
            next_token="${1:-}"
            (( $# == 0 )) || shift
            ;;

          --rdoc|--yard)
            rvm_docs_type="$rvm_token"
            rvm_docs_type
            ;;

          -f|--file)
            rvm_action="ruby"
            rvm_ruby_file="$next_token"
            next_token="${1:-}"
            (( $# == 0 )) || shift
            ;;

          --passenger|--editor)
            rvm_warn "NOTE: ${rvm_token} flag is deprecated, RVM now automatically generates wrappers" # 2017-09-21
            ;;

          -h|--help)
            rvm_action=help
            ;;

          -l|--level)
            rvm_ruby_patch_level="p$next_token"
            next_token="${1:-}"
            (( $# == 0 )) || shift
            ;;

          --sha|--make|--make-install)
            rvm_token=${rvm_token#--}
            rvm_token=${rvm_token//-/_}
            export "rvm_ruby_${rvm_token}"="$next_token"
            next_token="${1:-}"
            rvm_disable_binary_flag=1
            (( $# == 0 )) || shift
            ;;

          --nice|--sdk|--autoconf-flags|--proxy)
            rvm_token=${rvm_token#--}
            rvm_token=${rvm_token//-/_}
            export "rvm_${rvm_token}"="$next_token"
            next_token="${1:-}"
            (( $# == 0 )) || shift
            ;;

          --disable-llvm|--disable-jit)
            rvm_llvm_flag=0
            ;;

          --enable-llvm|--enable-jit)
            rvm_llvm_flag=1
            ;;

          --install)
            rvm_install_on_use_flag=1
            ;;

          --autolibs=*)
            export rvm_autolibs_flag="${rvm_token#*=}"
            ;;

          --color=*)
            rvm_pretty_print_flag=${rvm_token#--color=}
            ;;

          --pretty)
            rvm_pretty_print_flag=auto
            ;;

          --1.8|--1.9|--2.0|--2.1|--18|--19|--20|--21)
            rvm_token=${rvm_token#--}
            rvm_token=${rvm_token//\./}
            export "rvm_${rvm_token}_flag"=1
            rvm_disable_binary_flag=1
            ;;

          --rvmrc|--versions-conf|--ruby-version)
            rvm_token=${rvm_token#--}
            rvm_token=${rvm_token//-/_}
            export rvm_rvmrc_flag="${rvm_token}"
            ;;

          --list-missing-packages)
            export rvm_list_missing_packages_flag=1
            export rvm_quiet_flag=1
            ;;

          --list-undesired-packages)
            export rvm_list_undesired_packages_flag=1
            export rvm_quiet_flag=1
            ;;

          --list-installed-packages)
            export rvm_list_installed_packages_flag=1
            export rvm_quiet_flag=1
            ;;

          --list-all-packages)
            export rvm_list_missing_packages_flag=1
            export rvm_list_undesired_packages_flag=1
            export rvm_list_installed_packages_flag=1
            export rvm_quiet_flag=1
            ;;

          --head|--static|--self|--gem|--reconfigure|--default|--force|--export|--summary|--latest|--yaml|--json|--archive|--shebang|--path|--cron|--tail|--delete|--verbose|--import|--sticky|--create|--gems|--docs|--skip-autoreconf|--force-autoconf|--auto-dotfiles|--autoinstall-bundler|--disable-binary|--ignore-gemsets|--skip-gemsets|--debug|--quiet|--silent|--skip-openssl|--fuzzy|--quiet-curl|--skip-pristine|--dynamic-extensions)
            rvm_token=${rvm_token#--}
            rvm_token=${rvm_token//-/_}
            export "rvm_${rvm_token}_flag"=1
            ;;

          --no-docs)
            rvm_token=${rvm_token#--no-}
            rvm_token=${rvm_token//-/_}
            export "rvm_${rvm_token}_flag"=0
            ;;

          --auto)
            export "rvm_auto_dotfiles_flag"=1
            rvm_warn "Warning, --auto is deprecated in favor of --auto-dotfiles."
            ;;

          --rubygems)
            rvm_token=${rvm_token#--}
            rvm_token=${rvm_token//-/_}
            export "rvm_${rvm_token}_version"="$next_token"
            next_token="${1:-}"
            (( $# == 0 )) || shift
            ;;

          --dump-environment|--max-time)
            rvm_token=${rvm_token#--}
            rvm_token=${rvm_token//-/_}
            export "rvm_${rvm_token}_flag"="$next_token"
            next_token="${1:-}"
            (( $# == 0 )) || shift
            ;;

          --verify-downloads)
            rvm_token=${rvm_token#--}
            rvm_token=${rvm_token//-/_}
            export "rvm_${rvm_token}_flag_cli"="$next_token"
            next_token="${1:-}"
            (( $# == 0 )) || shift
            ;;

          --clang)
            export CC=clang
            export CXX=clang++
            rvm_disable_binary_flag=1
            ;;

          -M)
            if
              [[ -n "$next_token" ]]
            then
              __rvm_custom_separated_array rvm_make_flags , "${next_token}"
              next_token="${1:-}"
              (( $# == 0 )) || shift
              rvm_disable_binary_flag=1
            else
              rvm_action="error"
              rvm_error_message="--make *must* be followed by make flags."
            fi
            ;;

          -j)
            if
              [[ -n "$next_token" ]]
            then
              rvm_make_flags+=( -j$next_token )
              next_token="${1:-}"
              (( $# == 0 )) || shift
            else
              rvm_action="error"
              rvm_error_message="-j *must* be followed by an integer (normally the # of CPU's in your machine)."
            fi
            ;;

          --with-rubies)
            rvm_ruby_strings="$next_token"
            next_token="${1:-}"
            (( $# == 0 )) || shift
            ;;

          -C|--configure)
            if
              [[ -n "$next_token" ]]
            then
              __rvm_custom_separated_array rvm_configure_flags , "${next_token}"
              next_token="${1:-}"
              (( $# == 0 )) || shift
              rvm_disable_binary_flag=1
            else
              rvm_action="error"
              rvm_error_message="--configure *must* be followed by configure flags."
            fi
            ;;

          -E|--env)
            if
              [[ -n "$next_token" ]]
            then
              __rvm_custom_separated_array rvm_configure_env , "${next_token}"
              next_token="${1:-}"
              (( $# == 0 )) || shift
              rvm_disable_binary_flag=1
            else
              rvm_action="error"
              rvm_error_message="--configure *must* be followed by configure flags."
            fi
            ;;

          --movable)
            rvm_movable_flag=1
            rvm_disable_binary_flag=1
            ;;

          --with-*|--without-*|--enable-*|--disable-*)
            rvm_configure_flags+=( "$rvm_token" )
            rvm_disable_binary_flag=1
            ;;

          --trace)
            export rvm_trace_flag=1
            # duplication marker jkdfkdfngjdjkfngjkdfngjkd
            if   [[ -n "${BASH_VERSION:-}" ]]
            then export PS4="+ \$(__rvm_date \"+%s.%N\" 2>/dev/null) \${BASH_SOURCE##\${rvm_path:-}} : \${FUNCNAME[0]:+\${FUNCNAME[0]}()}  \${LINENO} > "
            elif [[ -n "${ZSH_VERSION:-}" ]]
            then export PS4="+ %* %F{red}%x:%I %F{green}%N:%i%F{white} %_"
            fi
            set -o xtrace
            ;;

          --)
            if [[ "${rvm_action}" == *install ]]
            then rvm_configure_flags+=( "$next_token" "$@" )
            else rvm_ruby_args=( "$next_token" "$@" )
            fi
            rvm_disable_binary_flag=1
            rvm_parse_break=1
            ;;

          *)
            rvm_action="error"
            rvm_error_message="Unrecognized command line flag: '$rvm_token'"
        esac

        ;;

      *)
        if
          [[ -d  "$rvm_token" ]] ||
          __rvm_project_dir_check "$rvm_token"
        then
          __rvm_rvmrc_tools try_to_read_ruby "$rvm_token" ||
          __rvm_parse_args_error_finding_project_file
        else
          rvm_action="error"
          rvm_error_message="Unrecognized command line argument(s): '$rvm_token $@'"
        fi
        ;;
    esac

    if [[ -z "${rvm_action:-""}" && -n "${rvm_ruby_string:-""}" ]]
    then rvm_action="use"
    fi

    if [[ "error" == "${rvm_action:-""}" || ${rvm_parse_break:-0} -eq 1 || -n "${rvm_error_message:-""}" ]]
    then break
    fi
  done

  : rvm_ruby_args:${#rvm_ruby_args[@]}:${rvm_ruby_args[*]}:
  if
    [[ -n "${rvm_error_message:-""}" ]]
  then
    if
      [[ "${rvm_action}" == "deprecated" ]]
    then
      rvm_error "$rvm_error_message"
    else
      rvm_error "$rvm_error_message"
      rvm_out "Run \`rvm help\` to see usage information"
    fi
    unset rvm_error_message
    return 1
  fi
}

rvm()
{
  \typeset result current_result
  rvm_ruby_args=()

  __rvm_teardown_if_broken
  __rvm_cli_posix_check        || return $?
  __rvm_cli_load_rvmrc         || return $?
  __rvm_cli_version_check "$@" || return $?
  __rvm_initialize
  __rvm_path_match_gem_home_check
  __rvm_setup
  __rvm_cli_autoupdate    "$@" || return $?

  next_token="$1"
  (( $# == 0 )) || shift
  __rvm_parse_args "$@"
  result=$?
  : rvm_ruby_args:${#rvm_ruby_args[@]}:${rvm_ruby_args[*]}:

  (( ${rvm_trace_flag:-0} == 0 )) || set -o xtrace

  (( result )) ||
  case "${rvm_action:=help}" in
    use)
      if rvm_is_a_shell_function
      then __rvm_use && __rvm_use_ruby_warnings
      fi
      ;;
    switch)
      if rvm_is_a_shell_function
      then __rvm_switch "${rvm_ruby_args[@]}"
      fi
      ;;
    inspect|strings|version|remote_version)
      __rvm_${rvm_action}
      ;;
    ls|list)
      "$rvm_scripts_path/list" "${rvm_ruby_args[@]}"
      ;;
    # TODO: Make debug run in the current environment, issues with not exported vars.
    debug)
      rvm_is_not_a_shell_function="${rvm_is_not_a_shell_function}" "$rvm_scripts_path/info" '' debug
      ;;
    info)
      rvm_is_not_a_shell_function="${rvm_is_not_a_shell_function}" "$rvm_scripts_path/${rvm_action}" "${rvm_ruby_args[@]}"
      ;;
    reset)
      source "$rvm_scripts_path/functions/${rvm_action}"
      __rvm_${rvm_action}
      ;;
    update)
      printf "%b" "ERROR: rvm update has been removed. Try 'rvm get head' or see the 'rvm get' and rvm 'rubygems' CLI API instead\n"
      ;;
    implode|seppuku)
      source "$rvm_scripts_path/functions/implode"
      __rvm_implode
      ;;

    get)
      next_token="${1:-}"
      (( $# == 0 )) || shift
      [[ "$next_token" == "${rvm_action}" ]] && shift

      __rvm_cli_rvm_get "${rvm_ruby_args[@]}"
      ;;

    current)
      __rvm_env_string
      ;;

    help|rtfm|env|list|monitor|notes|pkg|requirements)
      next_token="${1:-}"
      (( $# == 0 )) || shift
      if (( $# )) && [[ "$next_token" == "${rvm_action}" ]] #TODO why is this check here ???
      then shift
      fi
      "$rvm_scripts_path/${rvm_action}" "${rvm_ruby_args[@]}"
      ;;

    cleanup|tools|snapshot|disk-usage|repair|alias|docs|rubygems|migrate|cron|group|wrapper)
      "$rvm_scripts_path/${rvm_action}" "${rvm_ruby_args[@]}"
      ;;

    upgrade)
      #                  file          action        params
      __rvm_fix_selected_ruby \
      __rvm_run_wrapper "$rvm_action" "$rvm_action" "${rvm_ruby_args[@]}"
      ;;

    autolibs|osx-ssl-certs|fix-permissions)
      #                  file          action        params
      __rvm_run_wrapper "$rvm_action" "$rvm_action" "${rvm_ruby_args[@]}"
      ;;

    do)
      old_rvm_ruby_string=${rvm_ruby_string:-}
      unset rvm_ruby_string
      export rvm_ruby_strings rvm_in_flag

      result=0
      # run in a subprocess only when a function, when called via PATH just replace the process
      if rvm_is_a_shell_function no_warning
      then      "$rvm_scripts_path/set" "$rvm_action" "${rvm_ruby_args[@]}" || result=$?
      else exec "$rvm_scripts_path/set" "$rvm_action" "${rvm_ruby_args[@]}" || result=$?
      fi

      # Restore the state pre-sets.
      [[ -n "$old_rvm_ruby_string" ]] && rvm_ruby_string=$old_rvm_ruby_string

      unset old_rvm_ruby_string
      ;;

    rvmrc)
      __rvm_rvmrc_tools "${rvm_ruby_args[@]}"
      ;;

    config-get)
      \typeset __ruby __var
      __ruby=$( __rvm_which ruby )
      for __var in "${rvm_ruby_args[@]}"
      do
        __rvm_ruby_config_get "${__var}" "${__ruby}"
      done
      ;;

    gemset_use)
      if rvm_is_a_shell_function
      then __rvm_gemset_use
      fi
      ;;

    gemset)
      export rvm_ruby_strings
      "$rvm_scripts_path/gemsets" "${rvm_ruby_args[@]}"
      result=$?
      rvm_ruby_strings=""
      if
        rvm_is_a_shell_function no_warning
      then
        # Clear the gemset.
        if
          [[ ${rvm_delete_flag:-0} -eq 1 ]]
        then
          if
            [[ "${GEM_HOME:-""}" == "${GEM_HOME%%${rvm_gemset_separator:-@}*}${rvm_gemset_separator:-@}${rvm_gemset_name}" ]]
          then
            rvm_delete_flag=0
            __rvm_use "@default"
          fi
          unset gem_prefix
        elif
          [[ "${rvm_ruby_args[*]}" == rename* ]] || [[ "${rvm_ruby_args[*]}" == move* ]]
        then
          \typeset _command _from _to
          read _command _from _to <<<"${rvm_ruby_args[*]}"
          if
            [[ "${GEM_HOME:-""}" == "${GEM_HOME%%${rvm_gemset_separator:-@}*}${rvm_gemset_separator:-@}${_from}" ]]
          then
            __rvm_use "@${_to}"
          fi
        fi
      fi
      ;;

    reload)
      rvm_reload_flag=1
      ;;

    tests|specs)
      rvm_action="rake"
      __rvm_do
      ;;

    delete|remove)
      export rvm_path
      if [[ -n "${rvm_ruby_strings}" ]]
      then __rvm_run_wrapper manage "$rvm_action" "${rvm_ruby_strings//*-- }"
      else __rvm_run_wrapper manage "$rvm_action"
      fi
      __rvm_use default
      ;;
    fetch|uninstall|reinstall)
      export rvm_path
      if [[ -n "${rvm_ruby_strings}" ]]
      then __rvm_run_wrapper manage "$rvm_action" "${rvm_ruby_strings//*-- }"
      else __rvm_run_wrapper manage "$rvm_action"
      fi
      ;;
    try_install|install)
      export rvm_path
      __rvm_cli_install_ruby "${rvm_ruby_strings}"
      ;;

    automount)
      if [[ -n "$rvm_ruby_string" ]]
      then rvm_ruby_args=( "$rvm_ruby_string" "${rvm_ruby_args[@]}" )
      fi
      "${rvm_scripts_path}/mount" "$rvm_action" "${rvm_ruby_args[@]}"
      ;;

    mount|prepare)
      if [[ -n "$rvm_ruby_string" ]]
      then rvm_ruby_args=( "$rvm_ruby_string" "${rvm_ruby_args[@]}" )
      fi
      "${rvm_scripts_path}/$rvm_action" "$rvm_action" "${rvm_ruby_args[@]}"
      ;;

    export)
      __rvm_export "$rvm_export_args"
      ;;

    unexport)
      __rvm_unset_exports
      ;;

    error)
      false
      ;;

    which)
      __rvm_which "${rvm_ruby_args[@]}"
      ;;

    *)
      rvm_error "unknown action '$rvm_action'"
      false # result
      ;;
  esac
  current_result=$? # Use the result of first found error
  (( result )) || result=${current_result}

  (( result )) ||
  case "$rvm_action" in
    reinstall|try_install|install)
      if
        [[ -n "${rvm_ruby_string}" ]]
        rvm_is_a_shell_function no_warning
      then
        if [[ -e "${rvm_environments_path}/default" ]]
        then rvm_verbose_flag=0 __rvm_use
        else rvm_verbose_flag=0 rvm_default_flag=1 __rvm_use
        fi
      fi
    ;;
  esac
  current_result=$? # Use the result of first found error
  (( result )) || result=${current_result}

  \typeset __local_rvm_trace_flag
  __local_rvm_trace_flag=${rvm_trace_flag:-0}

  __rvm_cli_autoreload

  if (( __local_rvm_trace_flag > 0 ))
  then
    set +o verbose
    set +o xtrace
    [[ -n "${ZSH_VERSION:-""}" ]] || set +o errtrace
  fi

  return ${result:-0}
}
scripts/rvm000077500000017320147511530550007000 0ustar00#!/usr/bin/env bash

# rvm : Ruby enVironment Manager
# https://rvm.io
# https://github.com/rvm/rvm

# partial duplication marker dkjnkjvnckbjncvbkjnvkj
# prevent from loading in sh shells
if
  builtin test -n "${BASH_VERSION:-}" -o -n "${ZSH_VERSION:-}" -o -n "${KSH_VERSION:-}"
then
  case "`uname`" in
    (CYGWIN*|MINGW*)
      __shell_name="`\command \ps -p $$ | \command \awk 'END {print $NF}'` 2>/dev/null" ;;

    (SunOS)
      __shell_name="`\command \ps -p $$ -o comm=`" ;;

    (Linux)
      case "$(command uname -o)" in
        (Android)
          __shell_name="gawk 'BEGIN{RS=\"\"}; NR==1{print; exit}' /proc/$$/cmdline | tr - '\0'" ;;

        (*)
          __shell_name="`\command \ps -p $$ -o ucomm=`" ;;
      esac ;;

    (*)
      __shell_name="`\command \ps -p $$ -o ucomm=`" ;;
  esac

  case "$__shell_name" in
    (""|dash|sh|ksh|*/dash|*/sh|*/ksh) return 0 ;; # silently stop in sh shells
  esac

  unset __shell_name
else
  return 0
fi

# also duplicated in scripts/base
__rvm_has_opt()
{
  if # pre-gnu
   [[ -n "${ZSH_VERSION:-}"  ]]
  then
    setopt | GREP_OPTIONS="" \command \grep "^${1:-}$" >/dev/null 2>&1 || return $?
  elif # mksh
    [[ -n "${KSH_VERSION:-}"  ]]
  then
    set +o | GREP_OPTIONS="" \command \grep "-o ${1:-}$" >/dev/null 2>&1 || return $?
  elif # bash
    [[ -n "${BASH_VERSION:-}" ]]
  then
    [[ ":${SHELLOPTS:-}:" == *":${1:-}:"* ]] || return $?
  else # what is this?!
    return 1
  fi
}

# Do not allow sourcing RVM in `sh` - it's not supported
# return 0 to exit from sourcing this script without breaking sh
if __rvm_has_opt "posix"
then return 0
fi

# TODO: Alter the variable names to make sense
\export HOME rvm_prefix rvm_user_install_flag rvm_path
HOME="${HOME%%+(\/)}" # Remove trailing slashes if they exist on HOME

[[ -n "${rvm_stored_umask:-}" ]] || export rvm_stored_umask=$(umask)
if (( ${rvm_ignore_rvmrc:=0} == 0 ))
then
  rvm_rvmrc_files=("/etc/rvmrc" "$HOME/.rvmrc")
  if [[ -n "${rvm_prefix:-}" ]] && ! [[ "$HOME/.rvmrc" -ef "${rvm_prefix}/.rvmrc" ]]
  then rvm_rvmrc_files+=( "${rvm_prefix}/.rvmrc" )
  fi

  for rvmrc in "${rvm_rvmrc_files[@]}"
  do
    if [[ -f "$rvmrc" ]]
    then
      # pre-gnu
      if GREP_OPTIONS="" \command \grep '^\s*rvm .*$' "$rvmrc" >/dev/null 2>&1
      then
        printf "%b" "
Error:
        $rvmrc is for rvm settings only.
        rvm CLI may NOT be called from within $rvmrc.
        Skipping the loading of $rvmrc"
        return 1
      else
        source "$rvmrc"
      fi
    fi
  done
  unset rvm_rvmrc_files
fi

# duplication marker jdgkjnfnkjdngjkfnd4fd
# detect rvm_path if not set
if
  [[ -z "${rvm_path:-}" ]]
then
  if
    [[ -n "${BASH_SOURCE:-$_}" && -f "${BASH_SOURCE:-$_}" ]]
  then
    rvm_path="${BASH_SOURCE:-$_}"
    rvm_path="$( \command \cd "${rvm_path%/scripts/rvm}">/dev/null; pwd )"
    rvm_prefix=$( dirname $rvm_path )
  elif
    [[ "${UID:-}" == "0" || "${USER:-}" == "root" ]]
  then
    if
      (( ${rvm_user_install_flag:-0} == 0 ))
    then
      rvm_prefix="/usr/local"
      rvm_path="${rvm_prefix}/rvm"
    else
      rvm_prefix="$HOME"
      rvm_path="${rvm_prefix}/.rvm"
    fi
  else
    if
      [[ -d "$HOME/.rvm" && -s "$HOME/.rvm/scripts/rvm" ]]
    then
      rvm_prefix="$HOME"
      rvm_path="${rvm_prefix}/.rvm"
    else
      rvm_prefix="/usr/local"
      rvm_path="${rvm_prefix}/rvm"
    fi
  fi
else
  # remove trailing slashes, btw. %%/ <- does not work as expected
  rvm_path="${rvm_path%%+(\/)}"
fi

# guess rvm_prefix if not set
if [[ -z "${rvm_prefix}" ]]
then
  rvm_prefix=$( dirname $rvm_path )
fi

# duplication marker kkdfkgnjfndgjkndfjkgnkfjdgn
[[ -n "${rvm_user_install_flag:-}" ]] ||
case "$rvm_path" in
  (/usr/local/rvm)         rvm_user_install_flag=0 ;;
  ($HOME/*|/${USER// /_}*) rvm_user_install_flag=1 ;;
  (*)                      rvm_user_install_flag=0 ;;
esac

export rvm_loaded_flag
if [[ -n "${BASH_VERSION:-}" || -n "${ZSH_VERSION:-}" ]] &&
  \typeset -f rvm >/dev/null 2>&1
then
  rvm_loaded_flag=1
else
  rvm_loaded_flag=0
fi

if
  (( ${rvm_loaded_flag:=0} == 0 )) || (( ${rvm_reload_flag:=0} == 1 ))
then
  if
    [[ -n "${rvm_path}" && -d "$rvm_path" ]]
  then
    true ${rvm_scripts_path:="$rvm_path/scripts"}

    if
      [[ ! -f "$rvm_scripts_path/base" ]]
    then
      printf "%b" "WARNING:
      Could not source '$rvm_scripts_path/base' as file does not exist.
      RVM will likely not work as expected.\n"
    elif
      ! source "$rvm_scripts_path/base"
    then
      printf "%b" "WARNING:
      Errors sourcing '$rvm_scripts_path/base'.
      RVM will likely not work as expected.\n"
    else
      __rvm_ensure_is_a_function
      __rvm_setup

      export rvm_version
      rvm_version="$(__rvm_version_installed)"

      alias rvm-restart="rvm_reload_flag=1 source '${rvm_scripts_path:-${rvm_path}/scripts}/rvm'"

      # Try to load RVM ruby if none loaded yet
      __path_to_ruby="$( builtin command -v ruby 2>/dev/null || true )"
      if
        [[ -z "${__path_to_ruby}" ]] ||
        [[ "${__path_to_ruby}" != "${rvm_path}"* ]] ||
        [[ "${__path_to_ruby}" == "${rvm_path}/bin/ruby" ]]
      then
        if
          [[ -n "${rvm_environments_path:-}" &&
            -s "${rvm_environments_path}/default"
          ]]
        then
          source "${rvm_environments_path}/default"
        elif
          [[ "${rvm_environments_path:-}" != "${rvm_path}/environments" &&
            -s "${rvm_path}/environments/default"
          ]]
        then
          source "${rvm_path}/environments/default"
        fi
        if
          [[ ${rvm_project_rvmrc:-1} -gt 0 ]] &&
          ! __function_on_stack __rvm_project_rvmrc
        then
          # Reload the rvmrc, use promptless ensuring shell processes does not
          # prompt if .rvmrc trust value is not stored, revert to default on fail
          if
            rvm_current_rvmrc=""
            rvm_project_rvmrc_default=2 rvm_promptless=1 __rvm_project_rvmrc
          then
            rvm_hook=after_cd
            source "${rvm_scripts_path:-${rvm_path}/scripts}/hook"
          fi
        fi
      elif
        [[ "${__path_to_ruby}" == "${rvm_path}"* ]] &&
        [[ -z "${GEM_HOME:-}" || -z "${GEM_PATH:-}" ]]
      then
        echo "
Warning: PATH set to RVM ruby but GEM_HOME and/or GEM_PATH not set, see:
    https://github.com/rvm/rvm/issues/3212
" >&2
        if
          [[ -n "${SUDO_USER:-}" ]]
        then
          echo "Hint: To fix PATH errors try using 'rvmsudo' instead of 'sudo', see:
    https://stackoverflow.com/questions/27784961/received-warning-message-path-set-to-rvm-after-updating-ruby-version-using-rvm/28080063#28080063
" >&2
        fi
      fi
      unset __path_to_ruby

      # Makes sure rvm_bin_path is in PATH atleast once.
      [[ ":${PATH}:" == *":${rvm_bin_path}:"* ]] || PATH="$PATH:${rvm_bin_path}"

      if
        (( ${rvm_reload_flag:=0} == 1 ))
      then
        [[ "${rvm_auto_reload_flag:-0}" == 2 ]] || rvm_notify "RVM reloaded!"
        unset __rvm_project_rvmrc_lock
      fi

      rvm_loaded_flag=1
      __rvm_teardown

      # Opt-in for custom prompt through by setting:
      #     rvm_ps1=1
      # in either /etc/rvmrc or $HOME/.rvmrc
      if
        [[ ${rvm_ps1:-0} -eq 1 ]]
      then
        # Source RVM ps1 functions for a great prompt.
        if
          [[ -s "$rvm_path/contrib/ps1_functions" ]]
        then
          source "$rvm_path/contrib/ps1_functions"
        elif
          [[ -s "/usr/local/rvm/contrib/ps1_functions" ]]
        then
          source "/usr/local/rvm/contrib/ps1_functions"
        fi

        if command -v ps1_set >/dev/null 2>&1
        then ps1_set
        fi
      fi

    fi
  else
    printf "%b" "\n\$rvm_path ($rvm_path) does not exist."
  fi
  unset rvm_prefix_needs_trailing_slash rvm_gems_cache_path rvm_gems_path rvm_project_rvmrc_default rvm_gemset_separator rvm_reload_flag
fi
scripts/upgrade000077500000006522147511530550007625 0ustar00#!/usr/bin/env bash

unset GREP_OPTIONS

usage()
{
  printf "%b" "

  Usage:

    rvm upgrade {source-ruby} [destination-ruby] [--force]

  Description:

    Upgrades the specified (already installed) source ruby given to the
    given destination ruby version. Will migrate gemsets, wrappers, aliases
    and environment files.

    To upgrade rvm itself you want 'rvm get'.

  Examples:

    $ rvm upgrade 1.9.2-p136 1.9.2-p180

    $ rvm upgrade ree-2011.01 ree-2011-02

"
}

confirm()
{
  if (( ${rvm_force_flag:-0} > 0 ))
  then return 0
  fi

  \typeset confirmation_response

  printf "%b" "$1 (Y/n): "

  read -r confirmation_response

  if [[ -n "$confirmation_response" ]]
  then
    echo $confirmation_response | __rvm_grep -i '^y\|^Y' >/dev/null 2>&1
  fi
}

die_with_error()
{
  rvm_error "$1"
  exit "${2:-1}"
}

expand_ruby_name()
(
  source "$rvm_scripts_path/functions/tools"
  tools_strings "${1%%@*}"
)

existing_ruby_patch()
{
  {
    __rvm_list_strings | __rvm_grep -E "^ruby-$1|^$1$" ||
    (
      rvm_ruby_string="$1"
      __rvm_ruby_string
      __rvm_list_strings | __rvm_grep -E "^${rvm_ruby_interpreter}-${rvm_ruby_version}(-.*|$)" ||
      __rvm_list_strings | __rvm_grep "^${rvm_ruby_interpreter}-"
    )
  } | __rvm_version_sort | __rvm_tail -n 1
}

highest_ruby_patch()
{
  \typeset patch_level _version
  (
    rvm_ruby_string=$1
    __rvm_ruby_string

    patch_level="$(
      __rvm_db "${rvm_ruby_interpreter}_${rvm_ruby_version}_patch_level"
    )"
    _version="$(
      __rvm_db "${rvm_ruby_interpreter}_version"
    )"
    if
      [[ -n "${patch_level:-""}" ]]
    then
      rvm_ruby_patch_level="${patch_level}"
      echo ${rvm_ruby_interpreter}-${rvm_ruby_version}-${rvm_ruby_patch_level}
    elif
      [[ -n "${_version:-""}" ]]
    then
      echo ${rvm_ruby_interpreter}-${_version}
    else
      echo ${rvm_ruby_interpreter}
    fi
  )
}

upgrade_ruby()
{
  [[ -n "$expanded_source"      ]] || die_with_error "The source ruby was not a valid ruby string."
  [[ -n "$expanded_destination" ]] || die_with_error "The destination ruby was not a valid ruby string."

  confirm "Are you sure you wish to upgrade from $expanded_source to $expanded_destination?" ||
    die_with_error "Cancelling upgrade."

  [[ -d "$rvm_rubies_path/$expanded_destination" ]] ||
  {
    rvm_log "Installing new ruby $expanded_destination"
    __rvm_run_wrapper manage install "$expanded_destination" ||
      die_with_error "Unable to install ruby $expanded_destination. Please install it manually to continue." $?
  }

  rvm_log "Migrating gems from $expanded_source to $expanded_destination"

  "$rvm_scripts_path/migrate" "$expanded_source" "$expanded_destination" || die_with_error "Error migrating gems." "$result"

  rvm_log "Upgrade complete!"
}

source_ruby="${args[__array_start]:-}"
destination_ruby="${args[__array_start+1]:-}"
expanded_source="$(existing_ruby_patch "$source_ruby")"

if
  [[ -n "$source_ruby" && -z "$destination_ruby" ]]
then
  highest_source="$(highest_ruby_patch "$(expand_ruby_name "$source_ruby")")"
  if [[ "${expanded_source}" != "${highest_source}" ]]
  then destination_ruby="$(expand_ruby_name "$highest_source")"
  fi
fi

if
  [[ -z "$source_ruby" || -z "$destination_ruby" ]]
then
  usage >&2
  exit 1
elif
  [[ "help" == "$source_ruby" ]]
then
  usage
else
  expanded_destination="$(expand_ruby_name "$destination_ruby")"
  upgrade_ruby
fi
scripts/wrapper000077500000001005147511530550007645 0ustar00#!/usr/bin/env bash

unset rvm_default_flag

source "$rvm_scripts_path/base"

[[ -n "${MY_RUBY_HOME:-}" ]] || __rvm_become default
[[ -n "${MY_RUBY_HOME:-}" ]] || {
  rvm_error "No ruby used, try 'rvm use ruby' or 'rvm ruby do rvm wrapper $*'"
  exit 3
}

case "${1:-}" in
  (show|regenerate)
    run_gem_wrappers "$@"
    ;;
  (help)
    shift
    rvm_help wrapper "$@"
    ;;
  (*)
    if
      [[ -x "$1" ]]
    then
      run_gem_wrappers "$@"
    else
      rvm_help wrapper "$@"
      exit 1
    fi
    ;;
esac
scripts/aliases000077500000000141147511530550007606 0ustar00alias rubydo="rvm ruby"
alias gemdo="rvm gem"
alias rakedo="rvm rake"
alias multiruby="rvm ruby"
scripts/autolibs000077500000001443147511530550010015 0ustar00#!/usr/bin/env bash

source "$rvm_scripts_path/functions/autolibs"

__rvm_autolibs_show()
{
  __rvm_autolibs_get

  echo "${rvm_autolibs_flag}"
}

__rvm_autolibs_status()
{
  __rvm_autolibs_get
  __rvm_autolibs_translate_description

  printf "%b" "---
value: ${rvm_autolibs_flag}
number: ${rvm_autolibs_flag_number}
runner: ${rvm_autolibs_flag_runner}
description: ${rvm_autolibs_flag_description}
"
}

__rvm_autolibs()
{
  if
    __rvm_autolibs_translate "$1"
  then
    __rvm_autolibs_set
  else
    case "${1:-help}" in
      (show|status|reset)
        __rvm_autolibs_${1}
        ;;
      (help)
        rvm_help autolibs "$@"
        ;;
      (*)
        rvm_error_help "Unknown subcommand '$*' for autolibs" autolibs "$@"
        return 1
        ;;
    esac
  fi
}

__rvm_autolibs "${args[@]}"
scripts/install000077500000000606147511530550007641 0ustar00#!/usr/bin/env bash

# make tracing easy
export PS4="+ \${BASH_SOURCE##\${rvm_path:-}} : \${FUNCNAME[0]:+\${FUNCNAME[0]}()}  \${LINENO} > "

# Tracing, if asked for - as early as possible
if
  [[ "$*" == *--trace* ]] || (( ${rvm_trace_flag:-0} > 0 ))
then
  set -x
  export rvm_trace_flag=1
fi

set -o errtrace

shopt -s extglob

source "$PWD/scripts/functions/installer"

install_rvm "$@"
scripts/notes000077500000005236147511530550007327 0ustar00#!/usr/bin/env bash

: rvm_scripts_path:${rvm_scripts_path:="$rvm_path/scripts"}
: rvm_user_path:${rvm_user_path:="$rvm_path/user"}

source "$rvm_scripts_path/initialize"
source "$rvm_scripts_path/functions/logging"
source "$rvm_scripts_path/functions/support"
source "$rvm_scripts_path/functions/utility"

if [[ "$1" == "initial" ]]
then
  notes_type=Upgrade
  PAGER="\command \cat"

  new_notes()
  {
    \typeset file
    file="$rvm_path/config/displayed-notes.txt"

    \command \rm -f "${file}"

    tee "${file}" > /dev/null
  }
elif [[ "$1" == "upgrade" ]]
then
  notes_type=Upgrade
  PAGER="\command \cat"

  new_notes()
  {
    \typeset file
    file="$rvm_path/config/displayed-notes.txt"

    touch "${file}"

    tee "${file}.new" | (
      diff - "${file}" &&
      true
    ) | __rvm_sed -e '/^[^<]/ d' -e 's/^< //'

    printf "\n" >&2
    \command \mv -f "${file}.new" "${file}"
  }
else
  notes_type=Installation

  new_notes()
  {
    \command \cat
  }
fi

# duplication marker kdfkjkjfdkfjdjkdfkjfdkj
load_custom_flags()
{
  if
    [[ -s "${rvm_path:-}/user/custom_flags" ]]
  then
    \typeset __key __value
    while IFS== read __key __value
    do
      eval "export ${__key}=\"\${__value}\""
    done < "${rvm_path:-}/user/custom_flags"
  fi
}
load_custom_flags

# this block groups generated and static notes,
# to add generated msgs put them below in code
# for general messages put them in docs/upgrade-notes.md
{
  if [[ -z "$1" ]]
  then
    printf "%b" "
$notes_type Notes:

"
  fi

  : rvm_scripts_path:${rvm_scripts_path:-$rvm_path/scripts}:

  \command \cat "$rvm_path/docs/upgrade-notes.md" | __rvm_sed \
   -e "s#\${SHELL}#${SHELL}#g" \
   -e "s#\${rvm_scripts_path}#${rvm_scripts_path}#g"

  printf "\n"

  source "$rvm_scripts_path/functions/notes/warnings/warning_loading_script"
  source "$rvm_scripts_path/functions/notes/warnings/warning_rvm_group"
  source "$rvm_scripts_path/functions/notes/warnings/warning_missing_devfd"
  source "$rvm_scripts_path/functions/notes/warnings/warning_apt_get_rvm"
  source "$rvm_scripts_path/functions/notes/warnings/warning_var"
  source "$rvm_scripts_path/functions/notes/warnings/warning_zsh"
  source "$rvm_scripts_path/functions/notes/warnings/warning_path_reset"
  source "$rvm_scripts_path/functions/notes/warnings/warning_gem_home"
  source "$rvm_scripts_path/functions/notes/warnings/warning_rvm_configure_env"
  source "$rvm_scripts_path/functions/notes/warnings/warning_gemrc"
  source "$rvm_scripts_path/functions/notes/warnings/warning_rvm_in_usr"
  source "$rvm_scripts_path/functions/notes/warnings/warning_needs_cleanup"
} | new_notes | eval "${PAGER:-\command \cat}"

source "$rvm_scripts_path/functions/notes/opencollective"
scripts/mount000077500000046434147511530550007346 0ustar00#!/usr/bin/env bash

source "$rvm_scripts_path/base"
source "$rvm_scripts_path/functions/build"
source "$rvm_scripts_path/functions/irbrc"
source "$rvm_scripts_path/functions/osx-ssl-certs"
source "$rvm_scripts_path/functions/rubygems"
source "$rvm_scripts_path/functions/manage/truffleruby"

external_automount()
{
  external_mount_uniq $(
    __rvm_remove_rvm_from_path
    __rvm_which -a ruby
  )
}

external_reject_existing()
{
  \typeset __check
  \typeset -a __existing __failed
  __failed=()
  __existing=( $(
    for ext in $rvm_rubies_path/ext-*/bin/ruby
    do
      if [[ -L "$ext" ]]
      then __rvm_readlink "$ext"
      fi
    done
  ) )
  rvm_debug "existing:${__existing[*]}:"

  for __check
  do
    if
      [[ " ${__existing[*]} " == *" ${__check} "* ]]
    then
      __failed+=( ${__check} )
    fi
  done
  if
    (( ${#__failed[@]} > 1 ))
  then
    rvm_error "The given paths '${__failed[*]}' are already mounted."
  elif
    (( ${#__failed[@]} > 0 ))
  then
    rvm_error "The given path '${__failed[*]}' is already mounted."
  fi
  return ${#__failed[@]}
}

external_mount_uniq()
{
  \typeset ruby_path
  \typeset -a ruby_paths

  __rvm_read_lines ruby_paths <(
    for ruby_path in "$@"
    do
      if
        [[ -d "${ruby_path}" && -x "${ruby_path}/bin/ruby" ]]
      then
        echo "${ruby_path}/bin/ruby"
      elif
        [[ -f "${ruby_path}" && -x "${ruby_path}" ]]
      then
        echo "${ruby_path}"
      fi
    done | sort -u
  )

  if
    (( ${#ruby_paths[@]} == 0 ))
  then
    rvm_error "The given paths '$*' do not point to a ruby installation."
    return 1
  else
    external_reject_existing ${#ruby_paths[@]} || exit $?
    for ruby_path in ${ruby_paths[@]}
    do
      ( external_mount "${ruby_path}" ) || exit $?
    done
  fi
}

external_mount_link_default_binaries_detect_link()
{
  rvm_debug "ruby_path:${ruby_path}"
  if
    [[ "${ruby_path##*/}" == "ruby" && -L "${ruby_path}" ]]
  then
    _binary_long="$( \command \readlink "${ruby_path}" )"
    case "${_binary_long}" in
      (/*)
        ruby_path="${_binary_long}"
        ;;
      (*/*)
        ruby_path="$( cd "${ruby_path}" ; cd "${_binary_long%/*}" ; pwd )${_binary_long##*/}"
        ;;
      (*)
        ruby_path="${ruby_path%ruby}${_binary_long}"
        ;;
    esac
    rvm_debug "linked ruby_path:${ruby_path}"
  fi
}

external_mount_link_default_binaries_detect_prefix_suffix()
{
  _binary="${ruby_path##*/}"
  case "${_binary}" in
    (ruby)
      _binary_prefix=""
      _binary_suffix=""
      ;;
    (*ruby)
      _binary_prefix="${_binary%ruby}"
      _binary_suffix=""
      ;;
    (ruby*)
      _binary_prefix=""
      _binary_suffix="${_binary#ruby}"
      ;;
  esac
  rvm_debug "_binary_prefix:${_binary_prefix}: _binary_suffix:${_binary_suffix}:"
}

external_mount_link_default_binaries_create_links()
{
  for _binary in "${_binaries[@]}"
  do
    _binary_long="${_binary_prefix}${_binary}${_binary_suffix}"
    # link short
    if
      [[ -e "${prefix_path}/bin/${_binary}" ]]
    then
      ln -s "${prefix_path}/bin/${_binary}" "${_target_path}/${_binary}"
    fi
    # link long
    if
      [[ -e "${prefix_path}/bin/${_binary_long}" && "${_binary_long}" != "${_binary}" ]]
    then
      ln -s "${prefix_path}/bin/${_binary_long}" "${_target_path}/${_binary_long}"
      # link short - long if there was no short
      [[ -e "${_target_path}/${_binary}" ]] ||
        ln -s "${prefix_path}/bin/${_binary_long}" "${_target_path}/${_binary}"
    fi
    # relink links
    if
      [[ -L "${prefix_path}/bin/${_binary}" ]]
    then
      _binary="$( __rvm_readlink "${prefix_path}/bin/${_binary}" )"
      case "${_binary}" in
        (*/*)
          true # skip relative paths
          ;;
        (*)
          [[ -e "${_target_path}/${_binary}" ]] || # avoid duplicate relinking
          ln -s "${prefix_path}/bin/${_binary}" "${_target_path}/${_binary}"
          ;;
      esac
    fi
  done
}

external_mount_link_default_binaries()
{
  \typeset _binary _binary_prefix _binary_suffix _binary_long _target_path
  \typeset -a _binaries
  _binaries=( erb gem irb rake ri rdoc ruby testrb )

  external_mount_link_default_binaries_detect_link
  external_mount_link_default_binaries_detect_prefix_suffix

  _target_path="$rvm_rubies_path/$rvm_ruby_string/bin"
  mkdir -p "${_target_path}"

  external_mount_link_default_binaries_create_links
}

__rvm_osx_ssl_certs_ensure_for_ruby_except_jruby()
{
  case "$1" in
    (jruby*) true ;;
    (*)      __rvm_osx_ssl_certs_ensure_for_ruby "$2" ;;
  esac
}

external_mount()
{
  \typeset _given_path ruby_path prefix_path
  _given_path="$1"
  if [[ ! -d "${_given_path}" && -x "${_given_path}" ]] && "${_given_path}" --version | __rvm_grep rub >/dev/null
  then
    ruby_path="${_given_path}"
    prefix_path="$( __rvm_ruby_config_get prefix "${_given_path}" )"
  elif [[ -d "${_given_path}" && -x "${_given_path}/bin/ruby" ]] && "${_given_path}/bin/ruby" --version | __rvm_grep rub >/dev/null
  then
    ruby_path="${_given_path}/bin/ruby"
    prefix_path="$( __rvm_ruby_config_get prefix "${ruby_path}" )"
    if [[ "${_given_path}" != "${prefix_path}" ]]
    then
      rvm_error "The given path '$_given_path' contains ruby but it has different prefix '$prefix_path'."
      exit 2
    fi
  else
    rvm_error "The given path '$_given_path' does not point to a ruby installation."
    exit 3
  fi

  if [[ -z "${rvm_ruby_string:-}" && -n "${rvm_ruby_name:-}" ]]
  then rvm_ruby_string="$rvm_ruby_name"
  fi
  if [[ -z "${rvm_ruby_string:-}" ]]
  then
    if ! external_select_name "${ruby_path}" "${prefix_path}" ||
      [[ -z "${rvm_ruby_string:-}" ]]
    then
      rvm_error "No name selected for ruby in '$prefix_path'."
      exit 4
    fi
  fi

  rvm_ruby_string="ext-${rvm_ruby_string}"
  echo "Mounting '${rvm_ruby_string}' from '${prefix_path}' with 'bin/${ruby_path##*/}'"

  external_mount_link_default_binaries
  mkdir -p "$rvm_gems_path/$rvm_ruby_string" "$rvm_gems_path/$rvm_ruby_string@global"

  __rvm_select "$rvm_ruby_string"
  __rvm_fix_rbconfig "$rvm_rubies_path/$rvm_ruby_string"
  __rvm_ruby_post_install_hook "$rvm_ruby_string" "$rvm_rubies_path/$rvm_ruby_string"
  __rvm_initial_gemsets_create_without_rubygems "$rvm_rubies_path/$rvm_ruby_string/bin/ruby"
  __rvm_irbrc
  __rvm_ruby_config_save "$ruby_path" "$rvm_rubies_path/$rvm_ruby_string/config"
  __rvm_fix_group_permissions "$rvm_rubies_path/$rvm_ruby_string"
  __rvm_record_install "$rvm_ruby_string"
  __rvm_osx_ssl_certs_ensure_for_ruby_except_jruby "$rvm_ruby_string" "$ruby_path"
}

external_select_name()
{
  \typeset proposed_name ruby_version ruby_path prefix_path
  export rvm_ruby_string
    ruby_path="$1"
  prefix_path="$2"
  ruby_version="$( "${ruby_path}" --version)"
  if [[ -x "${ruby_path}" ]] &&
    proposed_name="$( external_propose_name "$ruby_version" )" &&
    [[ -n "${proposed_name:-}" ]]
  then
    echo "Found '${ruby_version}' in '${prefix_path}'"
    printf "\n# Please enter name [${proposed_name}]: "
    read rvm_ruby_string
    printf "\n"
    : rvm_ruby_string:${rvm_ruby_string:=${proposed_name}}:
  else
    echo "Name not found for '${ruby_path}' in '${prefix_path}'"
    false
  fi
}

external_propose_name()
{
  \typeset parts __tmp1 __tmp2
  parts="$( echo "$1" | __rvm_sed 's/[()]//g; s/\[.*\]//;' )"
  case "${parts}" in
    (*Ruby[[:space:]]Enterprise[[:space:]]Edition*)
      __tmp1="${parts#* }"
      __tmp1="${__tmp1%% *}"
      __tmp2="${parts##* }"
      printf "ree-${__tmp1}-${__tmp2}"
      ;;
    (ruby[[:space:]]*patchlevel[[:space:]]*)
      __tmp1="${parts#* }"
      __tmp1="${__tmp1%% *}"
      __tmp2="${parts##*patchlevel }"
      __tmp2="${__tmp2%% *}"
      printf "ruby-${__tmp1}-p${__tmp2}"
      ;;
    (ruby[[:space:]][0-9].[0-9].[0-9]p[0-9]*)
      __tmp1="${parts#* }"
      __tmp1="${__tmp1%% *}"
      __tmp2="${__tmp1##+([0-9\.])}"
      __tmp1="${__tmp1%${__tmp2}}"
      printf "ruby-${__tmp1}-${__tmp2}"
      ;;
    (ruby[[:space:]]*revision[[:space:]]*|ruby[[:space:]]*trunk[[:space:]]*)
      __tmp1="${parts#* }"
      __tmp1="${__tmp1%% *}"
      __tmp2="${parts##*trunk }"
      __tmp2="${__tmp2##*revision }"
      __tmp2="${__tmp2%% *}"
      printf "ruby-${__tmp1}-r${__tmp2}"
      ;;
    (ruby[[:space:]]*)
      __tmp1="${parts#* }"
      __tmp1="${__tmp1%% *}"
      __tmp2="${__tmp1##+([0-9\.])}"
      __tmp1="${__tmp1%${__tmp2}}"
      printf "ruby-${__tmp1}-${__tmp2}"
      ;;
    (jruby[[:space:]]*)
      __tmp1="${parts#* }"
      __tmp1="${__tmp1%% *}"
      __tmp2="${parts#* }"
      __tmp2="${__tmp2#* }"
      __tmp2="${__tmp2%% *}"
      __tmp2="${__tmp2#ruby-}"
      __tmp2="${__tmp2//-/_}"
      printf "jruby-${__tmp1}-default_${__tmp2}"
      ;;
    (maglev[[:space:]]*)
      __tmp1="${parts#* }"
      __tmp1="${__tmp1%% *}"
      __tmp2="${parts#* }"
      __tmp2="${__tmp2#* }"
      __tmp2="${__tmp2#* }"
      __tmp2="${__tmp2%% *}"
      printf "maglev-${__tmp1}-default_${__tmp2}"
      ;;
    (topaz[[:space:]]*)
      __tmp1="${parts#* }"
      __tmp1="${__tmp1%% *}"
      __tmp2="${parts#* }"
      __tmp2="${__tmp2#* }"
      __tmp2="${__tmp2#* }"
      __tmp2="${__tmp2%% *}"
      printf "topaz-${__tmp1}-default_${__tmp2}"
      ;;
    (rubinius[[:space:]]*)
      __tmp1="${parts#* }"
      __tmp1="${__tmp1%% *}"
      __tmp2="${parts#* }"
      __tmp2="${__tmp2#* }"
      __tmp2="${__tmp2%% *}"
      printf "rbx-${__tmp1}-default_${__tmp2}"
      ;;
    (*)
      false
      ;;
  esac
}

external_import_configure()
{
  \typeset platform architecture libc __flags

  if (( ${rvm_install_on_use_flag:-0} > 0 ))
  then err_command=rvm_warn
  else err_command=rvm_error
  fi

  rvm_ruby_url="$1"
  rvm_ruby_string="${2:-${rvm_ruby_name:-${rvm_ruby_url}}}"
  rvm_ruby_package_file=""

  # autodetect skips assignment of package name from URL
  __flags="$*"

  if
    [[ -r "${rvm_ruby_url}" ]]
  then
    if
      [[ "${__flags}" != *"autodetect"* ]]
    then
      rvm_ruby_package_file="${rvm_ruby_url##*/}"
    fi
  else
    case "${rvm_ruby_url}" in
      (http*)
        if
          [[ "${__flags}" != *"autodetect"* ]]
        then
          rvm_ruby_package_file="${rvm_ruby_url##*/}"
          # lets hope nobody uses the same file name with ?version=...
          rvm_ruby_package_file="${rvm_ruby_package_file%%\?*}"
        fi
        ;;
      (*)
        __rvm_ruby_string
        \typeset __rvm_ruby_verify_download_flag
        rvm_ruby_url="$( __rvm_remote_server_path "${rvm_ruby_string}" )"
        IFS=: read __rvm_ruby_verify_download_flag rvm_ruby_url <<<"$rvm_ruby_url"
        rvm_log "Found remote file ${rvm_ruby_url}"
        if
          (( ${__rvm_ruby_verify_download_flag:-0} > ${rvm_verify_downloads_flag_cli:-${rvm_verify_downloads_flag:-1}} ))
        then
          rvm_verify_downloads_flag=${__rvm_ruby_verify_download_flag}
        fi
        ;;
    esac
  fi

  rvm_ruby_string="${rvm_ruby_string##*/}"
  rvm_ruby_string="${rvm_ruby_string/bin-/}"
  rvm_ruby_string="${rvm_ruby_string%.t*}"
  if
    [[ -n "${rvm_ruby_name}" ]]
  then
    if
      [[ "${rvm_ruby_name}" == "${rvm_ruby_string}"* ]]
    then
      detected_rvm_ruby_name="${rvm_ruby_name#${rvm_ruby_string}-}"
      rvm_ruby_string="${rvm_ruby_name}"
    else
      detected_rvm_ruby_name="${rvm_ruby_name}"
      rvm_ruby_string="${rvm_ruby_string}-${rvm_ruby_name}"
    fi
  fi
  if
    [[ -z "${rvm_ruby_package_file:-}" ]]
  then
    __rvm_ruby_package_file "${rvm_ruby_string}"
    if
      [[ "${rvm_ruby_package_file}" == *bin-* ]]
    then
      rvm_ruby_package_file="${rvm_ruby_package_file##*/}"
    elif
      [[ "${rvm_ruby_url##*/}" == *bin-* ]]
    then
      rvm_ruby_package_file="${rvm_ruby_url##*/}"
    else
      rvm_ruby_package_file="bin-${rvm_ruby_string}.$(__rvm_remote_extension "${rvm_ruby_string}" -)"
    fi
  fi
}

external_import_download()
{
  if
    [[ -r "${rvm_ruby_url}" ]]
  then
    [[ "${rvm_ruby_url}" == "$rvm_archives_path/${rvm_ruby_package_file}" ]] ||
    __rvm_cp -f "${rvm_ruby_url}" "$rvm_archives_path/${rvm_ruby_package_file}" || {
      $err_command "Copying ${rvm_ruby_url} failed."
      return 3
    }
  elif
    [[ -n "${rvm_ruby_url}" ]]
  then
    "$rvm_scripts_path/fetch" "${rvm_ruby_url}?rvm=${rvm_version%% *}" "${rvm_ruby_package_file}" || {
      $err_command "Downloading ${rvm_ruby_url} failed."
      return 2
    }
  else
    $err_command "No remote url detected for ${rvm_ruby_string}."
    return 4
  fi
}

external_import_validate_archive()
{
  \typeset -a downloaded_names path_to_bin_ruby
  \typeset short_ruby_string

  __rvm_read_lines path_to_bin_ruby <(
    __rvm_package_list "$rvm_archives_path/${rvm_ruby_package_file}" | __rvm_grep "bin/ruby$" ||
    __rvm_package_list "$rvm_archives_path/${rvm_ruby_package_file}" | __rvm_grep "bin/jruby$"
  )
  __rvm_read_lines downloaded_names <(
    __rvm_package_list "$rvm_archives_path/${rvm_ruby_package_file}" | __rvm_awk -F/ '{print $1}' | sort -u
  )
  rvm_debug "downloaded_names:${#downloaded_names[@]}:${downloaded_names[*]}:"
  short_ruby_string="${rvm_ruby_string%-${detected_rvm_ruby_name:-}}"
  if
    [[ "${#path_to_bin_ruby[*]}" -eq 1 ]]
  then
    __path_to_extract="${path_to_bin_ruby[*]}"
    __path_to_extract="${__path_to_extract%bin/ruby}"
    __path_to_extract="${__path_to_extract%bin/jruby}"
  elif
    [[ "${short_ruby_string}" == "${downloaded_names[*]}" ]]
  then
    __path_to_extract="${short_ruby_string}"
  elif
    [[ "${short_ruby_string/-bin-/-}" == "${downloaded_names[*]}" ]]
  then
    if [[ -z "${rvm_ruby_string}" ]]
    then rvm_ruby_string="${short_ruby_string/-bin-/-}"
    fi
    __path_to_extract="${short_ruby_string}"
  elif
    [[ "${short_ruby_string/rbx-/rubinius-}" == "${downloaded_names[*]}" ]]
  then
    __path_to_extract="${short_ruby_string/rbx-/rubinius-}"
  else
    $err_command "The downloaded package for ${rvm_ruby_url},
Does not contains single 'bin/ruby' or '${short_ruby_string}',
Only '${downloaded_names[*]}' were found instead."
    return 4
  fi
}


external_import_extract()
{
  \command \rm -rf "${rvm_rubies_path}/${rvm_ruby_string}"
  mkdir -p "${rvm_rubies_path}/${rvm_ruby_string}"
  __rvm_package_extract "$rvm_archives_path/${rvm_ruby_package_file}" "${rvm_rubies_path}/${rvm_ruby_string}" || {
    $err_command "Unpacking ${rvm_ruby_package_file} failed."
    return 6
  }

  if
    [[ -n "${__path_to_extract}" &&
      "${__path_to_extract}" != "/" &&
      "${__path_to_extract}" != "./"
    ]]
  then
    [[ -d "${rvm_rubies_path}/${rvm_ruby_string}/${__path_to_extract}/bin" ]] || {
      $err_command "Target directory '${__path_to_extract}' was not created,
make sure '${rvm_ruby_url}' is a valid binary ruby archive."
      return 8
    }
    \command \mv "${rvm_rubies_path}/${rvm_ruby_string}/${__path_to_extract}"/* "${rvm_rubies_path}/${rvm_ruby_string}/"
    \command \rm -rf "${rvm_rubies_path}/${rvm_ruby_string}/${__path_to_extract%%/*}"
  fi
}

# validate libraries - make sure everything can be loaded
external_import_validate_binary()
{
  \typeset IFS
  \typeset -a found_libs missing_libs
  export _libdir
  _libdir="$( __rvm_ruby_config_get libdir "${rvm_rubies_path}/${rvm_ruby_string}/bin/ruby" )"

  case "${rvm_ruby_string}" in
    (*jruby*)
      case ${_system_type} in
        (Darwin)
          external_libdir="lib/{native,jni}/Darwin"
          ;;
        (*)
          external_libdir="lib/{native,jni}/${_system_arch}-${_system_type}"
          ;;
      esac
      ;;
    (*)
      external_libdir=""
      ;;
  esac

  missing_libs=()
  found_libs=()
  if [[ -x "${rvm_rubies_path}/${rvm_ruby_string}/bin/ruby" ]]
  then found_libs+=( "${rvm_rubies_path}/${rvm_ruby_string}/bin/ruby" )
  fi
  case ${_system_type} in
    (Linux|SunOS)
      found_libs+=( $(
        __rvm_find "${rvm_rubies_path}/${rvm_ruby_string}/${external_libdir}" -name '*.so' 2>/dev/null
      ) )
      if
        [[ -n "${found_libs[*]}" ]]
      then
        missing_libs=( $(
          LD_LIBRARY_PATH="${_libdir}" ldd "${found_libs[@]}" 2>/dev/null |
          __rvm_awk '/not found/{print $1}' | sort -u
        ) )
      fi
      ;;
    (Darwin)
      found_libs+=( $(
        __rvm_find "${rvm_rubies_path}/${rvm_ruby_string}/${external_libdir}" -name "*.bundle" 2>/dev/null
      ) )
      if
        [[ -n "${found_libs[*]}" ]]
      then
        missing_libs=( $(
          LD_LIBRARY_PATH="${_libdir}" otool -L "${found_libs[@]}" 2>&1 |
          __rvm_awk -F"[ :]" '{print $1}' |
          __rvm_sed 's#@executable_path#'"${rvm_rubies_path}/${rvm_ruby_string}"'/bin#' |
          __rvm_xargs __rvm_ls -1 2>&1 1>/dev/null |
          __rvm_awk -F"[ :]" '{print $3}' | sort -u
        ) )
      fi
      ;;
    (*)
      rvm_warn "$(command uname) libraries validation not yet implemented"
      ;;
  esac
  unset _libdir
  [[ -z "${missing_libs[*]}" ]] || {
    IFS=","
    $err_command "Libraries missing for ${rvm_ruby_string}: ${missing_libs[*]}. Refer to your system manual for installing libraries"
    return 10
  }
}

__rvm_fix_wrappers()
{
  \typeset actual_file
  __rvm_find "$rvm_rubies_path/$rvm_ruby_string/bin/" -type f |
  while read actual_file
  do
    if
      [[ -s "$actual_file" ]]
    then
      __rvm_sed_i "$actual_file" \
        -e "/^ENV\[[\"']GEM_HOME[\"']\]=/ d" \
        -e "/^ENV\[[\"']GEM_PATH[\"']\]=/ d" \
        -e "/^ENV\[[\"']PATH[\"']\]=/ d"
    fi
  done
  if
    [[ ! -f "$rvm_rubies_path/$rvm_ruby_string/bin/ruby" ]] &&
    [[ -f "$rvm_rubies_path/$rvm_ruby_string/bin/jruby" ]]
  then
    ln -s "$rvm_rubies_path/$rvm_ruby_string/bin/jruby" "$rvm_rubies_path/$rvm_ruby_string/bin/ruby"
  fi
}

__rvm_fix_lib_files()
{
  \typeset __path __file
  __path="$rvm_rubies_path/$rvm_ruby_string"

  __file="$( __rvm_find "${__path}" -name libyaml.la )"
  __rvm_sed_i "${__file}" -e "s#^libdir=.*\$#libdir='$(dirname "${__file}")'#"

  __rvm_find "${__path}" -name "*.pc" | while read __file
  do
    __rvm_sed_i "${__file}" -e "s#^prefix=.*\$#prefix=${__path}#"
  done
}

__rvm_ruby_post_install_hook()
{
  case "$1" in
    truffleruby*)
      truffleruby_post_install_hook "$2"
      ;;
    *)
      ;;
  esac
}

external_import_setup()
{
  __rvm_select
  __rvm_fix_wrappers
  __rvm_fix_lib_files
  __rvm_fix_rbconfig "$rvm_rubies_path/$rvm_ruby_string"
  __rvm_ruby_post_install_hook "$rvm_ruby_string" "$rvm_rubies_path/$rvm_ruby_string"
  __rvm_initial_gemsets_create_without_rubygems "$rvm_rubies_path/$rvm_ruby_string/bin/ruby"
  __rvm_irbrc
  __rvm_ruby_config_save "$rvm_rubies_path/$rvm_ruby_string/bin/ruby" "$rvm_rubies_path/$rvm_ruby_string/config"
  __rvm_record_install "$rvm_ruby_string"
  __rvm_osx_ssl_certs_ensure_for_ruby_except_jruby "$rvm_ruby_string" "$rvm_rubies_path/$rvm_ruby_string/bin/ruby"
}

external_import()
{
  \typeset step err_command rvm_ruby_url rvm_ruby_string rvm_ruby_package_file __path_to_extract

  for step in configure download validate_archive extract validate_binary setup
  do
    rvm_log "${rvm_ruby_string:-${2:-$1}} - #${step//_/ }"
    external_import_${step} "$@" || return $?
  done
}

action="${1:-}"
shift || {
  rvm_error_help "Missing action for external." mount
  exit 1
}

# skip first param if empty
[[ -n "${1:-}" ]] || (( $#==0 )) || shift

case "${action}" in
  (automount)
    external_automount "$@"
    ;;
  (mount|*_name)
    [[ -n "${1:-}" ]] ||
    {
      rvm_error_help "Missing path/url for '$action'." mount $action
      exit 2
    }
    if
      (( rvm_remote_flag > 0 )) ||
      [[ "$1" == http* || "$1" == *tar.bz2 ]]
    then
      external_import "$@"
    else
      external_mount_uniq "$@"
    fi
    ;;
  (*)
    rvm_error_help "Wrong action for mount '$action'." mount $action
    exit 2
    ;;
esac
scripts/patches000077500000003727147511530550007631 0ustar00#!/usr/bin/env bash

# General tools for manipulating patches
# and dealing with patches.

lookup_patchset()
{
  \typeset paths lookup_path

  if [[ -z "$1" ]]
  then
    echo "Usage: rvm patchset show name"
    return 1
  fi

  paths=($(__rvm_ruby_string_paths_under "$rvm_path/patchsets" | sort -r))

  for lookup_path in "${paths[@]}"
  do
    if [[ -s "$lookup_path/$1" ]]
    then
      \command \cat "$lookup_path/$1"
      return 0
    fi
  done

  return 1
}

# Returns the path used to look for a patch given a specific name.
__rvm_patch_lookup_path()
{
  echo "/"
  [[ -z "${rvm_patch_original_pwd:-""}" ]] || echo "$rvm_patch_original_pwd/"
  echo "$PWD/"
  __rvm_ruby_string_paths_under "$rvm_patches_path" | __rvm_sed 's/$/\//' | sort -r
  return $?
}

__rvm_expand_patch_name()
{
  \typeset name level expanded_patch_name not_required_patches
  not_required_patches="optional default ${_system_name_lowercase}"
  name="${1:-""}"
  level="${2:-}"
  [[ -n "$name" ]] || return 0
  if
    expanded_patch_name="$(
      rvm_ruby_string="${rvm_ruby_string}" lookup_patchset "$name"
    )"
  then
    echo "${expanded_patch_name}"
  elif
    [[ " $not_required_patches " != *" $name "* ]]
  then
    echo "${name}${level:+%}${level:-}"
  fi
}

# Return the full patch for a given patch.
__rvm_lookup_full_patch_path()
{
  \typeset extension patch_path directory directories __old_IFS
  # Absolute path, pwd and then finally the rvm patches path.
  __old_IFS="$IFS"
  IFS=$'\n'
  directories=($( __rvm_patch_lookup_path ))
  IFS="$__old_IFS"
  for directory in "${directories[@]}"
  do
    for extension in "" .patch .diff
    do
      patch_path="${directory}${1}${extension}"
      # -s reports directories too - so additional check -f needed
      if
        [[ -s "$patch_path" && -f "$patch_path" ]]
      then
        echo "$patch_path"
        return 0
      fi
    done
  done
  if
    __rvm_string_match "$1" "http://*" "https://*" &&
    file_exists_at_url "$1"
  then
    echo "$1"
  fi
}
scripts/fetch000077500000014662147511530550007273 0ustar00#!/usr/bin/env bash

url="$1"
archive="$2"

[[ -n "$url" ]] || rvm_fail "BUG: no url given for fetch"
shift || rvm_fail "BUG: $0 called without an argument :/"

rvm_base_except="selector"
source "$rvm_scripts_path/base"

# handled by teardown - scripts/functions/environment:314
__rvm_cleanup_download()
{
  [[ -f "$archive" ]] && __rvm_rm_rf "$archive"
}

__rvm_cd "$rvm_archives_path"

[[ -n "$archive" ]] || archive=$(basename "$url")
fetch_command=( __rvm_curl --create-dirs -C - -o "${archive}.part" )

download=1
try_ftp=0
result=0
retry=0

__rvm_checksum_read "$url" "$archive"
__rvm_checksum_any || (( ${rvm_verify_downloads_flag_cli:-${rvm_verify_downloads_flag:-1}} > 0 )) ||
  rvm_fail "There is no checksum for '$url' or '$archive', it's not possible to validate it.
This could be because your RVM install's list of versions is out of date. You may want to
update your list of rubies by running 'rvm get stable' and try again.
If that does not resolve the issue and you wish to continue with unverified download
add '--verify-downloads 1' after the command.
"

function verification_check()
{
  if
    (( ${rvm_verify_downloads_flag_cli:-${rvm_verify_downloads_flag:-1}}>=$1 ))
  then
    rvm_debug "Archive ${archive} checksum $2, continuing anyway."
  else
    rvm_warn "Archive ${archive} checksum $2, downloading again."
    download=1
  fi
}

rvm_debug "Fetch $url => $archive"

download=0
if
  [[ -e "$archive" ]]
then
  # Check first if we have the correct archive
  if
    __rvm_checksum_validate_file "$rvm_archives_path/${archive}"
  then
    rvm_debug "    ...archive checksum matched, not downloading"
  else
    case $? in
      (1) verification_check 1 "not found"     ;;
      (*) verification_check 2 "did not match" ;;
    esac
  fi
else
  rvm_debug "    ...no archive, downloading"
  download=1
fi

function download_the_url()
{
  \typeset counter=${1:-0}
  if
    (( counter >3 ))
  then
    rvm_error "ERROR: Retried 3 times and failed!"
    return 200
  fi
  "${fetch_command[@]}" "$url" &&
  \command \mv "${archive}.part" "${archive}" ||
  {
    result=$?
    case "$result" in
      (22|78)
        rvm_error "The requested url does not exist($result): '$url'"
        ;;
      (18)
        rvm_error "Partial file($result). Only a part of the file was transferred. Removing partial and re-trying."
        \command \rm -f "${archive}.part"
        download_the_url $counter
        ;;
      (33)
        rvm_debug "Server does not support 'range' command($result), removing '${archive}.part'"
        \command \rm -f "${archive}.part"
        download_the_url $counter
        ;;
      # duplication marker lfdgzkngdkjvnfjknkjvcnbjkncvjxbn
      (60)
        log "
Could not download '${_url}', you can read more about it here:
https://rvm.io/support/fixing-broken-ssl-certificates/
To continue in insecure mode run 'echo insecure >> ~/.curlrc'.
"
        ;;
      # duplication marker lfdgzkngdkjvnfjknkjvcnbjkncvjxbn
      (77)
        log "
It looks like you have old certificates, you can read more about it here:
https://rvm.io/support/fixing-broken-ssl-certificates/
"
        ;;
      # duplication marker lfdgzkngdkjvnfjknkjvcnbjkncvjxbn
      (141)
        rvm_warn "Curl returned 141 - it is result of a segfault which means it's Curls fault.
Try again and if it crashes more than a couple of times you either need to
reinstall Curl or consult with your distribution manual and contact support."
        ;;
      (*)
        rvm_error "There was an error($result)."
        ;;
    esac
    return $result
  }
}

if
  (( download > 0 ))
then
  download_the_url ||
  {
    \typeset __fallback __default_url __default __iterator result=$?
    \typeset -a __fallbacks
    __fallbacks=()
    for __default in ruby rubygems
    do
      __default_url="$(__rvm_db ${__default}_url)"
      if
        [[ "${url}" == "${__default_url}"* ]]
      then
        __iterator=1
        while
          __fallback="$(__rvm_db ${__default}_url_fallback_${__iterator})" &&
          [[ -n "${__fallback}" ]]
        do
          __fallback_patern="$(__rvm_db ${__default}_url_fallback_${__iterator}_pattern)"
          if
            [[ -n "${__fallback_patern}" ]]
          then
            __fallbacks+=( "$(__rvm_sed -E "s#${__fallback_patern}#${__fallback}#" <<<"${url}")" )
          else
            __fallbacks+=( "${url/${__default_url}/${__fallback}}" )
          fi
          : $(( __iterator+=1 ))
        done
      fi
    done
    if
      [[ -n "${__fallbacks[*]}" ]] # already detected something
    then
      true
    elif
      [[ "${url}" == "http://"* ]]
    then
      __fallbacks+=( "${url/http:/ftp:}"  "${url/http:\/\//https://www.mirrorservice.org/sites/}"  )
    elif
      [[ "${url}" == "https://"* ]]
    then
      __fallbacks+=( "${url/https:/ftp:}" "${url/https:\/\//https://www.mirrorservice.org/sites/}" )
    else
      rvm_fail "
No fallback URL can be calculated for ${url}, open a ticket with full output here:

    https://github.com/rvm/rvm/issues

" $result
    fi
    for __fallback in "${__fallbacks[@]}"
    do
      rvm_warn "Checking fallback: ${__fallback}"
      if
        file_exists_at_url "${__fallback}"
      then
        url="${__fallback}"
        download_the_url 1 || rvm_fail "Failed download" $?
        result=0
        break
      fi
    done
    if
      (( result ))
    then
      rvm_fail "\
No fallback URL could be found, try increasing timeout with:

    echo \"export rvm_max_time_flag=20\" >> ~/.rvmrc
" $result
    fi
  }
fi

# Check if we have downloaded the correct archive
if
  __rvm_checksum_validate_file "$rvm_archives_path/${archive}"
then
  rvm_debug "Downloaded archive checksum matched."
else
  result=$?
  if
   (( result==1 && ${rvm_verify_downloads_flag_cli:-${rvm_verify_downloads_flag:-1}}>0 ))
  then
    rvm_warn "No checksum for downloaded archive, recording checksum in user configuration."
    __rvm_checksum_calculate_file "$archive"
    __rvm_checksum_write          "$url"
  elif
   (( result>1  && ${rvm_verify_downloads_flag_cli:-${rvm_verify_downloads_flag:-1}}>1 ))
  then
    rvm_warn "Downloaded archive checksum did not match!"
  elif
   (( result == 1 ))
  then
    rvm_fail "Downloaded archive checksum could not be verified!
If you wish to continue with unverified download add '--verify-downloads 1' after the command.
"
  else
    \command \rm -f $archive
    rvm_fail "Downloaded archive checksum did not match, archive was removed!
If you wish to continue with not matching download add '--verify-downloads 2' after the command.
"
  fi
fi
scripts/snapshot000077500000016404147511530550010035 0ustar00#!/usr/bin/env bash

# __rvm_detect_system() does not support AIX
sys=$( command uname -s )
if [[ "${sys}" == AIX ]] ; then
    name_opt=-name
else
    name_opt=-iname
fi

unset GREP_COLOR
unset GREP_OPTIONS

source "$rvm_scripts_path/base"

__error_on_result()
{
  if [[ "$1" -gt 0 ]]; then
    rvm_error "$2 - Aborting now."
    return 0
  else
    return 1
  fi
}

snapshot_save()
{
  \typeset snapshot_temp_path snapshot_ruby_name_file \
    snapshot_alias_name_file snapshot_installable_file \
    snapshot_primary_ruby snapshot_ruby_order destination_path

  if [[ -z "$1" ]]
  then
    printf "%b" "

    Usage:

      rvm snapshot save name

    Description:

    Saves a snapshot describing the rvm installation
    to <name>.tar.gz in the current working directory.\

    " >&2
    return 1
  fi

  # Create the temporary directory.
  snapshot_temp_path="${rvm_tmp_path}/$$-snapshot"

  __rvm_rm_rf "$snapshot_temp_path"

  mkdir -p "$snapshot_temp_path"

  rvm_log "Backing up a list of aliases"
  __rvm_cp "$rvm_path/config/alias" "$snapshot_temp_path/"

  rvm_log "Backing up your user preferences"
  __rvm_cp "$rvm_user_path/db" "$snapshot_temp_path/"

  rvm_log "Backing up your installed packages"
  __rvm_sed -e 's/-//' -e 's/^lib//' < "$rvm_path/config/pkg" | __rvm_awk -F= '{print $1}' | sort | uniq > "$snapshot_temp_path/pkg"

  rvm_log "Backing up all of your gemsets"
  mkdir -p "$snapshot_temp_path/gems"

  (
    __rvm_cd "$snapshot_temp_path/gems"

    for snapshot_gemset in $(__rvm_list_gemset_strings)
    do

      __rvm_become "$snapshot_gemset" ; result="$?"

      __error_on_result "$result" "Error becoming ruby $snapshot_gemset" && return "$result"

      "$rvm_scripts_path/gemsets" export "${snapshot_gemset}.gems" >/dev/null ; result="$?"

      __error_on_result "$result" "Error exporting gemset contents for $snapshot_gemset" && return "$result"

      mkdir -p "./$snapshot_gemset/"

      [[ -d "$GEM_HOME/cache/" ]] && __rvm_cp -R "$GEM_HOME/cache/" "./$snapshot_gemset/"

    done
  )

  rvm_log "Backing up all of your installed rubies"

  printf "%b" "#!/usr/bin/env bash\n\nset -e\n\n" > "$snapshot_temp_path/install-rubies.sh"

  echo "source \"\$rvm_scripts_path/rvm\" || true" >> "$snapshot_temp_path/install-rubies.sh"

  snapshot_ruby_name_file="${rvm_tmp_path}/$$-rubies"
  snapshot_alias_name_file="${rvm_tmp_path}/$$-aliases"
  snapshot_installable_file="${rvm_tmp_path}/$$-installable"

  "$rvm_scripts_path/alias" list | __rvm_awk -F ' => ' '{print $1}' | sort | uniq 2>/dev/null > "$snapshot_alias_name_file"

  __rvm_list_strings | \command \tr ' ' '\n' | sort | uniq > "$snapshot_ruby_name_file"

  comm -2 -3 "$snapshot_ruby_name_file" "$snapshot_alias_name_file" > "$snapshot_installable_file"

  __rvm_rm_rf "$snapshot_ruby_name_file"
  __rvm_rm_rf "$snapshot_alias_name_file"

  snapshot_primary_ruby="$(__rvm_grep '^\(ree\|ruby-1.8.7\)' < "$snapshot_installable_file" | __rvm_grep -v '-head$' | \command \sort -r | \command \head -n1)"
  snapshot_ruby_order="$snapshot_primary_ruby $(__rvm_grep -v "$snapshot_primary_ruby" < "$snapshot_installable_file")"

  for snapshot_ruby_name in $snapshot_ruby_order
  do
    snapshot_install_command="$(__rvm_recorded_install_command "$snapshot_ruby_name")"
    if [[ -n "$snapshot_install_command" ]]
    then
      echo "rvm install $snapshot_install_command" | __rvm_sed "s#$rvm_path#'\\\"\$rvm_path\\\"'#" >> "$snapshot_temp_path/install-rubies.sh"
    else
      __rvm_become "$snapshot_ruby_name"
      ruby "$rvm_path/lib/rvm/install_command_dumper.rb" >> "$snapshot_temp_path/install-rubies.sh"
    fi
    unset snapshot_install_command
  done

  unset snapshot_ruby_name snapshot_primary_ruby

  __rvm_rm_rf "$snapshot_installable_file"

  rvm_log "Compressing snapshotting"
  destination_path="$PWD"
  (
    __rvm_cd "$snapshot_temp_path"
    __rvm_rm_rf "$destination_path/$1.tar.gz"
    __rvm_tar czf "$destination_path/$1.tar.gz" .
    result="$?"
    __error_on_result "$result" "Error creating archive $destination_path/$1.tar.gz" && return "$result"
  )

  rvm_log "Cleaning up"
  __rvm_rm_rf "$snapshot_temp_path"

  rvm_log "Snapshot complete"
}

snapshot_load()
{
  \typeset package_info snapshot_archive snapshot_temp_path \
    alias_name alias_ruby
  export rvm_create_flag

  if [[ -z "$1" ]]
  then
    echo "Usage: rvm snapshot load name" >&2
    echo "Loads a snapshot from <name>.tar.gz in the current directory." >&2
    return 1
  fi

  snapshot_archive="$PWD/$(echo "$1" | __rvm_sed 's/.tar.gz$//').tar.gz"

  if ! [[ -s "$snapshot_archive" ]]
  then
    echo "The provides snapshot '$(basename "$snapshot_archive")' doesn't exist." >&2
    return 1
  fi

  snapshot_temp_path="${rvm_tmp_path}/$$-snapshot"

  __rvm_rm_rf "$snapshot_temp_path"
  \command \mkdir -p "$snapshot_temp_path"

  rvm_log "Extracting snapshot"
  (
    __rvm_cd "$snapshot_temp_path"
    __rvm_tar xzf "$snapshot_archive"
    result="$?"
    __error_on_result "$result" "Error extracting the archive '$snapshot_archive'" && return "$result"
  )

  rvm_log "Restoring user settings"
  __rvm_cp -f "$snapshot_temp_path/db" "$rvm_user_path/db"

  rvm_log "Installing rvm-managed packages"
  for snapshot_package in $(\command \cat "$snapshot_temp_path/pkg")
  do
    "$rvm_scripts_path/package" install "$snapshot_package"
    result="$?"
    __error_on_result "$result" "Error installing package '$snapshot_package'" && return "$result"
  done
  unset snapshot_package

  rvm_log "Installing rubies"

  chmod +x "$snapshot_temp_path/install-rubies.sh"
  __rvm_sed_i "${snapshot_temp_path}/install-rubies.sh" -e '1 s/#!\/usr\/bin\/env bash -e/#!\/usr\/bin\/env bash\n\nset -e/'

  "$snapshot_temp_path/install-rubies.sh"
  result="$?"

  __error_on_result "$result" "Error importing rubies." && return "$result"

  rvm_create_flag=1

  rvm_log "Setting up gemsets"

  (
    __rvm_cd "$snapshot_temp_path/gems"

    gems=($(__rvm_find . -mindepth 0 -maxdepth 0 -type f "${name_opt}" '*.gems' | __rvm_sed 's/.gems$//'))

    for snapshot_gemset in "${gems[@]//.\/}"
    do

      __rvm_become "$snapshot_gemset"
      result="$?"

      __error_on_result "$result" \
        "Error becoming '$snapshot_gemset'" && return "$result"

      mkdir -p "$GEM_HOME/cache/"

      __rvm_cp -Rf "$snapshot_gemset/" "$GEM_HOME/cache/"
      result="$?"

      __error_on_result "$result" \
        "Error copying across cache for $snapshot_gemset" && return "$result"

      "$rvm_scripts_path/gemsets" import "$snapshot_gemset" >/dev/null 2>&1
      result="$?"

      __error_on_result "$result" \
        "Error importing gemset for $snapshot_gemset" && return "$result"
    done
  )

  rvm_log "Restoring aliases"

  while read -r package_info
  do
    # Note: this assumes an '=' int the input...
    alias_name="${package_info/=*}"
    alias_ruby="${package_info/*=}"

    "$rvm_scripts_path/alias" create "$alias_name" "$alias_ruby"
  done < "$snapshot_temp_path/alias"

  rvm_log "Cleaning up load process"
  __rvm_rm_rf "$snapshot_temp_path"

  rvm_log "Loaded snapshot from $(basename "$snapshot_archive")"
}

snapshot_usage()
{
  echo "Usage: rvm snapshot {save,load} file" >&2
  return 1
}


args=($*)
action="${args[0]}"
args="$(echo ${args[@]:1})" # Strip trailing / leading / extra spacing.

case "$action" in
  save) snapshot_save "$args" ;;
  load) snapshot_load "$args" ;;
  *)    snapshot_usage ;;
esac

exit $?
scripts/osx-ssl-certs000077500000010635147511530550010724 0ustar00#!/usr/bin/env bash

source "$rvm_scripts_path/functions/osx-ssl-certs"
source "$rvm_scripts_path/functions/osx-ssl-certs-curl"

__rvm_osx_ssl_certs_run_select_rubies()
{
  case "$2" in
    (all)
      __rvm_read_lines __rubies <(
        __rvm_cd "$rvm_rubies_path"
        __rvm_find . -maxdepth 1 -mindepth 1 -type d 2>/dev/null | cut -c 3-
      )
      __rubies+=(curl)
      ;;
    (*,*)
      __rvm_custom_separated_array __rubies , "$2"
      ;;
    ("")
      __rubies=( "${GEM_HOME##*/}" )
      ;;
    (*)
      __rubies=( "$2" )
      ;;
  esac

  rvm_log "Selected SSL certs for: $__rubies"
}

__rvm_osx_ssl_certs_run_filter_and_run()
{
  \typeset cert_file
  for __ruby in "${__rubies[@]}"
  do
    if
      [[ "${__ruby}" == "curl" ]]
    then
      rvm_debug "Getting SSL certs path for ${__ruby}"
      __path=$(__rvm_osx_ssl_certs_curl_cert_find_path)
      [[ -z $__path || " ${__paths[*]} " == *" ${__path} "* ]] || __paths+=( "${__path}" )
    elif
      [[ -f "${__ruby}" && -x "${__ruby}" ]]
    then
      rvm_debug "Getting SSL certs for ${__ruby}"
      __rvm_osx_ssl_certs_file_from_openssl "${__ruby}" || return $?
      __path="$cert_file"
      [[ " ${__paths[*]} " == *" ${__path} "* ]] || __paths+=( "${__path}" )
    elif
      [[ -f "${__ruby}" ]] &&
      __rvm_grep -- "-----BEGIN CERTIFICATE-----" "${__ruby}" 1>/dev/null 2>&1
    then
      rvm_debug "SSL certs file for ${__ruby}"
      [[ " ${__paths[*]} " == *" ${__ruby} "* ]] || __paths+=( "${__ruby}" )
    elif
      [[ -d "${__ruby}" ]]
    then
      rvm_debug "SSL certs path for ${__ruby}"
      [[ " ${__paths[*]} " == *" ${__ruby} "* ]] || __paths+=( "${__ruby}" )
    else
      rvm_debug "Getting ruby certs path for ${__ruby}"
      __path="$( __rvm_with "${__ruby}" "__rvm_osx_ssl_certs_file_for_ruby" )"
      [[ " ${__paths[*]} " == *" ${__path} "* ]] || __paths+=( "${__path}" )
    fi
  done

  for __path in "${__paths[@]}"
  do
    rvm_debug  "Updating SSL certs ${__path}"
    "$1" "${__path}"
  done
}

__rvm_osx_ssl_certs_run()
{
  \typeset __ruby __path
  \typeset -a __rubies __paths
  __rubies=()
  __paths=()

  __rvm_osx_ssl_certs_run_select_rubies  "$@"
  __rvm_osx_ssl_certs_run_filter_and_run "$@"
}

__rvm_osx_ssl_certs_status()
{
  __rvm_osx_ssl_certs_run __rvm_osx_ssl_certs_status_for_path "$1"
}

__rvm_osx_ssl_certs_update()
{
  __rvm_osx_ssl_certs_run __rvm_osx_ssl_certs_update_for_path "$1"
}

__rvm_osx_ssl_certs_cron_status()
{
  if __rvm_cron_find "$RVM_OSX_SSL_UPDATER"
  then rvm_log "Automatic certs updating installed."
  else rvm_warn "Automatic certs updating not installed."
  fi
}

__rvm_osx_ssl_certs_cron_install()
{
  if
    __rvm_cron_find "$RVM_OSX_SSL_UPDATER"
  then
    __rvm_cron_uninstall "$RVM_OSX_SSL_UPDATER" ||
    {
      \typeset result=$?
      rvm_error "Automatic certs updating failed uninstalling."
      return $result
    }
  fi
  if
    __rvm_cron_install "$RVM_OSX_SSL_UPDATER"
  then
    rvm_log "Automatic certs updating installed."
  else
    \typeset result=$?
    rvm_error "Automatic certs updating failed installing."
    return $result
  fi
}

__rvm_osx_ssl_certs_cron_uninstall()
{
  if
    __rvm_cron_find "$RVM_OSX_SSL_UPDATER"
  then
    if
      __rvm_cron_uninstall "$RVM_OSX_SSL_UPDATER"
    then
      rvm_log "Automatic certs updating uninstalled."
    else
      \typeset result=$?
      rvm_error "Automatic certs updating failed uninstalling."
      return $result
    fi
  else
    rvm_log "Automatic certs updating already uninstalled."
  fi
}

__rvm_osx_ssl_certs_cron()
{
  \typeset cron_action="${1:-status}"
  shift 1
  case "${cron_action}" in
    (status|install|uninstall)
      __rvm_osx_ssl_certs_cron_${cron_action}
      ;;
    (help)
      rvm_help osx-ssl-certs cron "$@"
      ;;
    (*)
      rvm_error_help "Unknown subcommand '$*' for osx-ssl-certs cron" osx-ssl-certs cron "$@"
      return 1
      ;;
  esac
}

__rvm_osx_ssl_certs()
{
  \typeset action="${1:-status}"
  shift 1
  case "${action}" in
    (status|update|cron)
      if
        [[ "${_system_name}" == "OSX" ]]
      then
        __rvm_osx_ssl_certs_${action} "$@"
      else
        rvm_error "'rvm osx-ssl-certs' is intended only for OSX systems, it is not required on ${_system_name}."
        return 1
      fi
      ;;
    (help)
      rvm_help osx-ssl-certs "$@"
      ;;
    (*)
      rvm_error_help "Unknown subcommand '$*' for osx-ssl-certs" osx-ssl-certs "$@"
      return 1
      ;;
  esac
}

__rvm_osx_ssl_certs "${args[@]}"
scripts/extras/bash_zsh_support/README.md000066400000000107147511530550014423 0ustar00bash_zsh_support
================

support Zsh function hooks for Bash
scripts/extras/bash_zsh_support/chpwd/README.md000066400000001142147511530550015530 0ustar00# Bash support for Zsh like chpwd hook

Implemented based on the description from
http://zsh.sourceforge.net/Doc/Release/Functions.html#Hook-Functions

## Usage

1. load `function.sh` and `load.sh`, eg:

        source chpwd/functions.sh
        source chpwd/load.sh

2. add the hook - replace `_hook_name` with your function name:

        export -a chpwd_functions                              # define hooks as an shell array
        [[ " ${chpwd_functions[*]} " == *" _hook_name "* ]] || # prevent double addition
        chpwd_functions+=(_hook_name)                          # finally add it to the list
scripts/extras/bash_zsh_support/chpwd/function.sh000066400000000523147511530550016434 0ustar00function __zsh_like_cd()
{
  \typeset __zsh_like_cd_hook
  if
    builtin "$@"
  then
    for __zsh_like_cd_hook in chpwd "${chpwd_functions[@]}"
    do
      if \typeset -f "$__zsh_like_cd_hook" >/dev/null 2>&1
      then "$__zsh_like_cd_hook" || break # finish on first failed hook
      fi
    done
    true
  else
    return $?
  fi
}
scripts/extras/bash_zsh_support/chpwd/load.sh000066400000000271147511530550015526 0ustar00[[ -n "${ZSH_VERSION:-}" ]] ||
{
  function cd()    { __zsh_like_cd cd    "$@" ; }
  function popd()  { __zsh_like_cd popd  "$@" ; }
  function pushd() { __zsh_like_cd pushd "$@" ; }
}
scripts/extras/bash_zsh_support/LICENSE000066400000016717147511530550014167 0ustar00GNU LESSER GENERAL PUBLIC LICENSE
                       Version 3, 29 June 2007

 Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
 Everyone is permitted to copy and distribute verbatim copies
 of this license document, but changing it is not allowed.


  This version of the GNU Lesser General Public License incorporates
the terms and conditions of version 3 of the GNU General Public
License, supplemented by the additional permissions listed below.

  0. Additional Definitions.

  As used herein, "this License" refers to version 3 of the GNU Lesser
General Public License, and the "GNU GPL" refers to version 3 of the GNU
General Public License.

  "The Library" refers to a covered work governed by this License,
other than an Application or a Combined Work as defined below.

  An "Application" is any work that makes use of an interface provided
by the Library, but which is not otherwise based on the Library.
Defining a subclass of a class defined by the Library is deemed a mode
of using an interface provided by the Library.

  A "Combined Work" is a work produced by combining or linking an
Application with the Library.  The particular version of the Library
with which the Combined Work was made is also called the "Linked
Version".

  The "Minimal Corresponding Source" for a Combined Work means the
Corresponding Source for the Combined Work, excluding any source code
for portions of the Combined Work that, considered in isolation, are
based on the Application, and not on the Linked Version.

  The "Corresponding Application Code" for a Combined Work means the
object code and/or source code for the Application, including any data
and utility programs needed for reproducing the Combined Work from the
Application, but excluding the System Libraries of the Combined Work.

  1. Exception to Section 3 of the GNU GPL.

  You may convey a covered work under sections 3 and 4 of this License
without being bound by section 3 of the GNU GPL.

  2. Conveying Modified Versions.

  If you modify a copy of the Library, and, in your modifications, a
facility refers to a function or data to be supplied by an Application
that uses the facility (other than as an argument passed when the
facility is invoked), then you may convey a copy of the modified
version:

   a) under this License, provided that you make a good faith effort to
   ensure that, in the event an Application does not supply the
   function or data, the facility still operates, and performs
   whatever part of its purpose remains meaningful, or

   b) under the GNU GPL, with none of the additional permissions of
   this License applicable to that copy.

  3. Object Code Incorporating Material from Library Header Files.

  The object code form of an Application may incorporate material from
a header file that is part of the Library.  You may convey such object
code under terms of your choice, provided that, if the incorporated
material is not limited to numerical parameters, data structure
layouts and accessors, or small macros, inline functions and templates
(ten or fewer lines in length), you do both of the following:

   a) Give prominent notice with each copy of the object code that the
   Library is used in it and that the Library and its use are
   covered by this License.

   b) Accompany the object code with a copy of the GNU GPL and this license
   document.

  4. Combined Works.

  You may convey a Combined Work under terms of your choice that,
taken together, effectively do not restrict modification of the
portions of the Library contained in the Combined Work and reverse
engineering for debugging such modifications, if you also do each of
the following:

   a) Give prominent notice with each copy of the Combined Work that
   the Library is used in it and that the Library and its use are
   covered by this License.

   b) Accompany the Combined Work with a copy of the GNU GPL and this license
   document.

   c) For a Combined Work that displays copyright notices during
   execution, include the copyright notice for the Library among
   these notices, as well as a reference directing the user to the
   copies of the GNU GPL and this license document.

   d) Do one of the following:

       0) Convey the Minimal Corresponding Source under the terms of this
       License, and the Corresponding Application Code in a form
       suitable for, and under terms that permit, the user to
       recombine or relink the Application with a modified version of
       the Linked Version to produce a modified Combined Work, in the
       manner specified by section 6 of the GNU GPL for conveying
       Corresponding Source.

       1) Use a suitable shared library mechanism for linking with the
       Library.  A suitable mechanism is one that (a) uses at run time
       a copy of the Library already present on the user's computer
       system, and (b) will operate properly with a modified version
       of the Library that is interface-compatible with the Linked
       Version.

   e) Provide Installation Information, but only if you would otherwise
   be required to provide such information under section 6 of the
   GNU GPL, and only to the extent that such information is
   necessary to install and execute a modified version of the
   Combined Work produced by recombining or relinking the
   Application with a modified version of the Linked Version. (If
   you use option 4d0, the Installation Information must accompany
   the Minimal Corresponding Source and Corresponding Application
   Code. If you use option 4d1, you must provide the Installation
   Information in the manner specified by section 6 of the GNU GPL
   for conveying Corresponding Source.)

  5. Combined Libraries.

  You may place library facilities that are a work based on the
Library side by side in a single library together with other library
facilities that are not Applications and are not covered by this
License, and convey such a combined library under terms of your
choice, if you do both of the following:

   a) Accompany the combined library with a copy of the same work based
   on the Library, uncombined with any other library facilities,
   conveyed under the terms of this License.

   b) Give prominent notice with the combined library that part of it
   is a work based on the Library, and explaining where to find the
   accompanying uncombined form of the same work.

  6. Revised Versions of the GNU Lesser General Public License.

  The Free Software Foundation may publish revised and/or new versions
of the GNU Lesser General Public License from time to time. Such new
versions will be similar in spirit to the present version, but may
differ in detail to address new problems or concerns.

  Each version is given a distinguishing version number. If the
Library as you received it specifies that a certain numbered version
of the GNU Lesser General Public License "or any later version"
applies to it, you have the option of following the terms and
conditions either of that published version or of any later version
published by the Free Software Foundation. If the Library as you
received it does not specify a version number of the GNU Lesser
General Public License, you may choose any version of the GNU Lesser
General Public License ever published by the Free Software Foundation.

  If the Library as you received it specifies that a proxy can decide
whether future versions of the GNU Lesser General Public License shall
apply, that proxy's public statement of acceptance of any version is
permanent authorization for you to choose that version for the
Library.scripts/extras/rvm.fish000066400000000633147511530550011232 0ustar00#!/usr/bin/env fish

function load_env_file
  sed -e "s/export\(.*\);\(.*\)=/set -x \1 /" -e "s/export\(.*\)=/set -x \1 /" -e 's/unset/set -e /' -e "/ PATH / s/[\"':]/ /g" -e 's/$/; /' < $argv | source
end

load_env_file ~/.rvm/environments/default

function rvm
  switch $argv[1]
  case 'use'
    load_env_file (~/.rvm/bin/rvm $argv do rvm env --path | tail -n 1)
  case '*'
    ~/.rvm/bin/rvm $argv
  end
end
scripts/extras/chruby.sh000066400000001630147511530550011401 0ustar00#!/usr/bin/env bash

# Set RUBIES when sourced.
RUBIES=($( \command \ls -1d "$rvm_path/rubies"/* 2>/dev/null ))

# Install rubies via rvm and reload RUBIES
function mrvm()
{
  \typeset __result=0
  # duplication marker jdgkjnfnkjdngjkfnd4fd
  if
    [[ -z "$rvm_path" ]]
  then
    \typeset reset_rvm_path=true
    if [[ -n "${BASH_SOURCE:-$_}" && -f "${BASH_SOURCE:-$_}" ]]
    then
      export rvm_path="${BASH_SOURCE:-$_}"
      rvm_path="$( \command \cd "${rvm_path%/scripts/extras/chruby.sh}">/dev/null; pwd )"
    elif [[ -x "$HOME/.rvm/bin/rvm" ]]
    then export rvm_path="$HOME/.rvm"
    elif [[ -x "/usr/local/rvm/bin/rvm" ]]
    then export rvm_path="/usr/local/rvm"
    else return 127
    fi
  fi
  "$rvm_path/bin/rvm" "$@" || __result=$?
  RUBIES=($( \command \ls -1d "$rvm_path/rubies"/* 2>/dev/null ))
  if [[ -n "${reset_rvm_path:-}" ]]
  then unset rvm_path reset_rvm_path
  fi
  return ${__result}
}
scripts/extras/rails000066400000014136147511530550010613 0ustar00#!/usr/bin/env bash

# Copyright (c) 2011 Wayne E. Seguin <wayneeseguin@gmail.com>
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#     http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.

#
# This feature is opt-in, in order to use the functions provided below source
# this script in your start up from your profile(s).
#
# For example, if RVM is installed to $HOME/.rvm, you can put this in your
# ~/.bash_profile:
#
# [[ -s "$HOME/.rvm/scripts/extras/rails" ]] && . "$HOME/.rvm/scripts/extras/rails"
#

enable_extendglob() {
  if [[ -n "${ZSH_VERSION:-}" ]] ; then
    setopt extendedglob
  else
    if [[ -n "${BASH_VERSION:-}" ]] ; then
      shopt -s extglob # Extended globs
    else
      printf "%b" "What the heck kind of shell are you running here???\n"
    fi
  fi
}

rails_routes()
{
  # Usage:
  #
  #   rails_routes <or list, space separated> [options]
  #
  #   include string is a valid shell glob: http://mywiki.wooledge.org/glob
  #
  #   options are among
  #
  #     * a valid shell glob pattern
  #     * -a <and glob>
  #     * -o <or glob>
  #     * -e <exclude (not) glob>
  #
  #   Processing occurs as ((or list) AND (and list)) NOT (exclude list)
  #
  # Examples:
  #
  #   rails_routes admin
  #                       /admin/reports/agent/:id(.:format)        {:controller=>"reports", :action=>"agent"}
  #
  #   rails_routes "P@(OS|U)T"
  #                POST   /current(.:format)                        {:action=>"create", :controller=>"current"}
  #                PUT    /current/:id(.:format)                    {:action=>"update", :controller=>"current"}
  #
  #   or, equivalently, rails_routes POST -o PUT
  #
  #   List all routes containing admin but not test
  #   rails_routes admin -e test
  #
  #   rails_routes

  enable_extendglob

  \typeset md5_current md5_cached cache_file routes
  \typeset -a ands ors nots

  while [[ $# -gt 0 ]] ; do
    token="$1" ; shift
    case "$token" in

      --trace)
        set -o xtrace
        export PS4="+ \${BASH_SOURCE##\${rvm_path:-}} : \${FUNCNAME[0]:+\${FUNCNAME[0]}()}  \${LINENO} > "
        ;;

      -a|and)
        ands=(${ands[@]} "$1")
        shift
        ;;

      -o|or)
        ors=(${ors[@]} "$1")
        shift
        ;;

      -e|exclude)
        nots=(${exclude[@]} "$1")
        shift
        ;;
      *) # Default is or.
        ors=(${ors[@]} "$token")
        ;;
    esac
  done

  [[ -d tmp/rake ]] || mkdir -p "tmp/rake"
  cache_file="tmp/rake/routes"

  if ! builtin command -v rake >/dev/null 2>&1 ; then
    printf "%b" "ERROR: rake not found.\n" >&2
    return 1
  fi

  case ${_system_type} in
    Linux)  md5="md5sum" ;;
    Darwin) md5="/sbin/md5 -q" ;;
    *)      printf "%b" "ERROR: Unknown OS Type.\n" >&2 ;  return 1 ;;
  esac

  md5_current=$($md5 config/routes.rb)
  md5_current=${md5%% *}

  if [[ -s "$cache_file" && -s "$cache_file.md5" ]]; then
    md5_cached=$(\command \cat -v "${cache_file}.md5")
    md5_cached=${md5%% *}
  else
    md5_cached=""
  fi

  if [[ -s "$cache_file" && $md5_current == $md5_cached ]]; then
    routes=$(\command \cat -v "$cache_file")
  else
    routes=$(rake routes 2>/dev/null)
    if [[ $? -gt 0 ]]; then
      printf "%b" "ERROR: There was an error running 'rake routes', does your application load console properly?" >&2
      return 1
    else
      printf "%b" "$md5_current" > "${cache_file}.md5"
      printf "%b" "$routes" > "$cache_file"
    fi
  fi
  routes="${routes#\|\(in *\)}"

  orig_ifs="$IFS"
  condition="${ors[@]}"
  condition="*${condition// /*|*}*"

  IFS="
"
  # ORs
  results=()

  for route in ${routes} ; do
    eval "case '${route}' in (${condition}) results=(\"${results[@]}\" \"${route}\") ;; esac"
  done
  routes=(${results[@]})


  # ANDs
  results=()
  for condition in "${ands[@]}" ; do
    for route in ${routes[@]} ; do
      if [[ ${route} == ${condition} ]]; then
        results=(${results[@]} ${route})
      fi
    done
    routes=(${results[@]})
    results=()
  done

  # NOTs
  results=()
  for condition in "${nots[@]}" ; do
    for route in ${routes[@]} ; do
      if [[ ${route} != *${condition}* ]]; then
        results=(${results[@]} ${route})
      fi
    done
    routes=(${results[@]})
    results=()
  done

  for route in ${routes[@]} ; do
    printf "%b" "${route}\n"
  done

  IFS="$orig_ifs"
}

#
# r - Rails scripts helper function.
#
r() {
  \typeset action args

  action="$1" ; shift

  args="$@"

  enable_extendglob

  case "$action" in

    c|console)
      action=console
      ;;

    d|db)
      action=dbconsole
      ;;

    g|generate)
      action=generate
      ;;

    d|destroy)
      action=destroy
      ;;

    s|server)
      action=server
      ;;

    r|routes)
      rails_routes $args
      return $?
      ;;
    n|new)
      rails_version=$(rails -v)
      rails_version=${rails_version##* }
      rails_version=${rails_version%%.*}
      if [[ $rails_version -ge 3 ]]; then
        rails new $args
      elif [[ $rails_version == 1 || $rails_version == 2 ]] ; then
        rails $args
      fi
      ;;

    (*(-)@(h|?|help))
      action="-h"
      ;;

    (*(-)@(v|V|version))
      action="-h"
      ;;

    usage)
      printf "%b" "

r - Rails shell convenience function

Usage:

  r [action]

Actions:

  c - Start a Rails Console
  d - Start a database console
  c - rails generate
  s - rails server
  r - rails routes <include filter glob> [-e <exclude filter glob>]

      \n"
      ;;

  esac

  if [[ -s ./bin/rails ]] ; then  # For Rails4 or bundler's binstubs

    ruby ./bin/rails $action $args

  elif [[ -s ./script/rails ]] ; then

    ruby ./script/rails $action $args

  elif [[ -s ./script/$action ]] ; then

      ruby ./script/$action $args

  else

    printf "%b" "ERROR: rails $action not found!!!"

  fi

  return 0
}
scripts/extras/completion.bash000077500000021231147511530550012563 0ustar00#!/usr/bin/env bash

# bash completion for Ruby Version Manager (RVM)

__rvm_comp()
{
  \typeset cur
  cur="${COMP_WORDS[COMP_CWORD]}"
  COMPREPLY=($(compgen -W "$1" -- "$cur"))
  return 0
}

__rvm_subcommand()
{
  \typeset word subcommand c
  c=1

  while [[ $c -lt $COMP_CWORD ]] ; do
    word="${COMP_WORDS[c]}"
    for subcommand in $1; do
      if [[ "$subcommand" == "$word" ]]; then
        echo "$subcommand"
        return
      fi
    done
    c=$((++c))
  done
}

__rvm_rubies ()
{
  echo "$(rvm list strings) default system  $(rvm alias list names)"
}

__rvm_gemsets ()
{
  echo "$(rvm gemset list | __rvm_grep -v gemset 2>/dev/null)"
}

__rvm_help_pages ()
{
  \command \ls "$rvm_help_path"
}

__rvm_known ()
{
  # Strips comments and expands known patterns into each variation
  rvm list known | __rvm_sed -e 's/#.*$//;' \
                       -e '/^$/d;' \
                       -e 's/^\[\(.*-\)\]\(.*\)\[\(-.*\)\]$/\1\2\3 \1\2 \2\3 \2/;' \
                       -e 's/^\[\(.*-\)\]\(.*\)$/\1\2 \2/;' \
                       -e 's/^\(.*\)\[\(-.*\)\]\[\(-.*\)\]$/\1\2\3 \1\2 \1/;' \
                       -e 's/^\(.*\)\[\(-.*\)\]$/\1\2 \1/ ' # | \command \tr ' ' "\n" | sort
}

_rvm_commands ()
{
  \typeset cur
  cur=${COMP_WORDS[COMP_CWORD]}

  COMMANDS='\
        version use reload implode update reset info debug\
        install uninstall reinstall remove\
        ruby gem rake tests specs monitor gemset\
        gemdir fetch list package notes snapshot\
        help automount disk-usage upgrade current migrate\
        alias autolibs cleanup cron docs get config-get\
        snapshot export fix-permissions repair rubygems\
        tools user info usage rvmrc osx-ssl-certs patchset\
        pkg group requirements do unexport wrapper'

  case "${cur}" in
  -*)       _rvm_opts ;;
  *)        __rvm_comp "$COMMANDS $(__rvm_rubies)" ;;
  esac
}

_rvm_opts ()
{
  RVM_OPTS='\
    -h\
    --help\
    -v\
    --version\
    -l --level\
    --bin\
    --gems\
    --archive\
    --patch
    -S\
    -e\
    -G\
    -C\
    --configure\
    --nice\
    --ree-options\
    --head\
    --rubygems\
    --default\
    --debug\
    --trace\
    --force\
    --summary\
    --latest\
    --docs\
    --reconfigure\
    --quiet-curl\
    --create'

  __rvm_comp "$RVM_OPTS"
}

_rvm_use ()
{
  \typeset _command
  _command="${COMP_WORDS[COMP_CWORD-2]}"

  case "${_command}" in
  gemset) __rvm_comp "$(__rvm_gemsets)" ;;
  *)      __rvm_comp "$(__rvm_rubies)" ;;
  esac
}

_rvm_gemset ()
{
  \typeset subcommand subcommands
  subcommands="import export create copy rename move empty delete remove name dir list list_all gemdir install pristine clear use update unpack globalcache"
  subcommand="$(__rvm_subcommand "$subcommands")"

  if [[ -z "$subcommand" ]]; then
    __rvm_comp "$subcommands"
    return
  fi
}

_rvm_remove ()
{
  \typeset subcommand subcommands
  subcommands="all old --gems --archive $(__rvm_rubies)"
  subcommand="$(__rvm_subcommand "$subcommands")"

  if [[ -z "$subcommand" ]]; then
    __rvm_comp "$subcommands"
    return
  fi
}

_rvm_disk_usage()
{
  \typeset subcommand subcommands
  subcommands="all total archives docs repos sources logs pkg rubies gemsets wrappers tmp others"
  subcommand="$(__rvm_subcommand "$subcommands")"

  if [[ -z "$subcommand" ]]; then
    __rvm_comp "$subcommands"
    return
  fi
}

_rvm_list()
{
  \typeset subcommand subcommands
  subcommands="help known remote gemsets default rubies strings known_strings ruby_svn_tags"
  subcommand="$(__rvm_subcommand "$subcommands")"

  if [[ -z "$subcommand" ]]; then
    __rvm_comp "$subcommands"
    return
  fi
}

_rvm_reinstall()
{
  \typeset subcommand subcommands
  subcommands="$(rvm list strings)"
  subcommand="$(__rvm_subcommand "$subcommands")"

  if [[ -z "$subcommand" ]]; then
    __rvm_comp "$subcommands"
    return
  fi
}

_rvm_uninstall()
{
  \typeset subcommand subcommands
  subcommands="$(rvm list strings) --gems"
  subcommand="$(__rvm_subcommand "$subcommands")"

  if [[ -z "$subcommand" ]]; then
    __rvm_comp "$subcommands"
    return
  fi
}

_rvm_upgrade()
{
  \typeset subcommand subcommands
  subcommands="$(rvm list strings)"
  subcommand="$(__rvm_subcommand "$subcommands")"

  if [[ -z "$subcommand" ]]; then
    __rvm_comp "$subcommands"
    return
  fi
}

_rvm_migrate()
{
  \typeset subcommand subcommands
  subcommands="$(rvm list strings)"
  subcommand="$(__rvm_subcommand "$subcommands")"

  if [[ -z "$subcommand" ]]; then
    __rvm_comp "$subcommands"
    return
  fi
}

_rvm_autolibs()
{
  \typeset subcommand subcommands
  subcommands="disable disabled read read-only fail read-fail packages enable enabled reset status help show"
  subcommand="$(__rvm_subcommand "$subcommands")"

  if [[ -z "$subcommand" ]]; then
    __rvm_comp "$subcommands"
    return
  fi
}

_rvm_cleanup()
{
  \typeset subcommand subcommands
  subcommands="all archives checksums repos sources logs gemsets links"
  subcommand="$(__rvm_subcommand "$subcommands")"

  if [[ -z "$subcommand" ]]; then
    __rvm_comp "$subcommands"
    return
  fi
}

_rvm_cron()
{
  \typeset subcommand subcommands
  subcommands="setup remove"
  subcommand="$(__rvm_subcommand "$subcommands")"

  if [[ -z "$subcommand" ]]; then
    __rvm_comp "$subcommands"
    return
  fi
}

_rvm_docs()
{
  \typeset subcommand subcommands
  subcommands="generate generate-ri generate-rdoc generate-gems rdoc_data"
  subcommand="$(__rvm_subcommand "$subcommands")"

  if [[ -z "$subcommand" ]]; then
    __rvm_comp "$subcommands"
    return
  fi
}

_rvm_get()
{
  \typeset subcommand subcommands
  subcommands="stable latest head master branch help --auto-dotfiles --autolibs="
  subcommand="$(__rvm_subcommand "$subcommands")"

  if [[ -z "$subcommand" ]]; then
    __rvm_comp "$subcommands"
    return
  fi
}

_rvm_snapshot()
{
  \typeset subcommand subcommands
  subcommands="load save"
  subcommand="$(__rvm_subcommand "$subcommands")"

  if [[ -z "$subcommand" ]]; then
    __rvm_comp "$subcommands"
    return
  fi
}

_rvm_fix_permissions()
{
  \typeset subcommand subcommands
  subcommands="user system"
  subcommand="$(__rvm_subcommand "$subcommands")"

  if [[ -z "$subcommand" ]]; then
    __rvm_comp "$subcommands"
    return
  fi
}

_rvm_repair()
{
  \typeset subcommand subcommands
  subcommands="symlinks environments archives all"
  subcommand="$(__rvm_subcommand "$subcommands")"

  if [[ -z "$subcommand" ]]; then
    __rvm_comp "$subcommands"
    return
  fi
}

_rvm_rubygems()
{
  \typeset subcommand subcommands
  subcommands="latest current master head"
  subcommand="$(__rvm_subcommand "$subcommands")"

  if [[ -z "$subcommand" ]]; then
    __rvm_comp "$subcommands"
    return
  fi
}

_rvm_tools()
{
  \typeset subcommand subcommands
  subcommands="identifier path-identifier strings mirror rvm-env"
  subcommand="$(__rvm_subcommand "$subcommands")"

  if [[ -z "$subcommand" ]]; then
    __rvm_comp "$subcommands"
    return
  fi
}

_rvm_user()
{
  \typeset subcommand subcommands
  subcommands="all gemsets"
  subcommand="$(__rvm_subcommand "$subcommands")"

  if [[ -z "$subcommand" ]]; then
    __rvm_comp "$subcommands"
    return
  fi
}

_rvm_info()
{
  \typeset subcommand subcommands
  subcommands="$(rvm list strings) system rvm ruby homes binaries environment debug"
  subcommand="$(__rvm_subcommand "$subcommands")"

  if [[ -z "$subcommand" ]]; then
    __rvm_comp "$subcommands"
    return
  fi
}

_rvm_rvmrc()
{
  \typeset subcommand subcommands
  subcommands="trust untrust trusted load reset create warning"
  subcommand="$(__rvm_subcommand "$subcommands")"

  if [[ -z "$subcommand" ]]; then
    __rvm_comp "$subcommands"
    return
  fi
}

_rvm_osx_ssl_certs()
{
  \typeset subcommand subcommands
  subcommands="status update cron"
  subcommand="$(__rvm_subcommand "$subcommands")"

  if [[ -z "$subcommand" ]]; then
    __rvm_comp "$subcommands"
    return
  fi
}

_rvm_help ()
{
  __rvm_comp "$(__rvm_help_pages)"
}

_rvm_install ()
{
  __rvm_comp "$(__rvm_known)"
}

_rvm ()
{
  \typeset prev
  prev=${COMP_WORDS[COMP_CWORD-1]}

  case "${prev}" in
  use)      _rvm_use ;;
  gemset)   _rvm_gemset ;;
  help)     _rvm_help ;;
  install)  _rvm_install ;;
  autolibs) _rvm_autolibs ;;
  disk-usage) _rvm_disk_usage ;;
  reinstall) _rvm_reinstall ;;
  uninstall) _rvm_uninstall ;;
  upgrade)  _rvm_upgrade ;;
  list)     _rvm_list ;;
  remove)   _rvm_remove ;;
  migrate) _rvm_migrate ;;
  cleanup) _rvm_cleanup ;;
  snapshot) _rvm_snapshot ;;
  cron)    _rvm_cron ;;
  fix-permissions)    _rvm_fix_permissions ;;
  docs)    _rvm_docs ;;
  repair)    _rvm_repair ;;
  rubygems)    _rvm_rubygems ;;
  get)    _rvm_get ;;
  tools)    _rvm_tools ;;
  user)    _rvm_user ;;
  info)    _rvm_info ;;
  rvmrc)    _rvm_rvmrc ;;
  osx-ssl-certs)    _rvm_osx_ssl_certs ;;
  *)        _rvm_commands ;;
  esac

  return 0
}
scripts/extras/java_read_properties/README.md000066400000000766147511530550015231 0ustar00# Java Read Properties

Read java system properties

## Usage

Download [ReadProperties.class](https://github.com/mpapis/java_read_properties/releases/download/1.0.0/ReadProperties.class)(right click - save as) or:

    wget https://github.com/mpapis/java_read_properties/releases/download/1.0.0/ReadProperties.class

Run:

    java ReadProperties java.home

And it will display:

    /usr/lib64/jvm/java-1.7.0-openjdk-1.7.0/jre

## Development

Fork the repository and open pull request with changes.
scripts/extras/java_read_properties/ReadProperties.java000066400000000372147511530550017536 0ustar00public class ReadProperties
{
  public static void main(String[] args)
  {
    if (args.length == 0) System.exit(1);
    String property = System.getProperty(args[0]);
    if (property == null) System.exit(2);
    System.out.println(property);
  }
}
scripts/extras/java_read_properties/LICENSE000066400000001055147511530550014747 0ustar00Copyright (c) 2013 Michal Papis

Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at

    http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
scripts/extras/java_read_properties/.gitignore000066400000000025147511530550015726 0ustar00ReadProperties.class
scripts/extras/java_read_properties/ReadProperties.class000066400000001121147511530550017713 0ustar00���3&


	
<init>()VCodeLineNumberTablemain([Ljava/lang/String;)V
StackMapTable
SourceFileReadProperties.java	 !"#$%ReadPropertiesjava/lang/Objectjava/lang/Stringjava/lang/Systemexit(I)VgetProperty&(Ljava/lang/String;)Ljava/lang/String;outLjava/io/PrintStream;java/io/PrintStreamprintln(Ljava/lang/String;)V!	
*��	

W *���*2�L+���+��				�scripts/extras/completion.zsh/_rvm000064400000010147147511530550013414 0ustar00#compdef rvm

\typeset curcontext state line cmds ret

curcontext="$curcontext"
ret=1

_arguments -C \
  '(- 1 *)'{-v,--version}'[display version information]' \
  '(-l|--level)'{-l,--level}'+[patch level to use with rvm use / install]:number' \
  '(--bin)--bin[path for binaries to be placed (~/.rvm/bin/)]:path:_files' \
  '(--source)--source[src directory to use (~/.rvm/src/)]:path:_files' \
  '(--archives)--archives[directory for downloaded files (~/.rvm/archives/)]:path:_files' \
  '-S[Specify a script file to attempt to load and run (rubydo)]:file:_files' \
  '-e[Execute code from the command line]:code' \
  '(-G)-G[root gem path to use]:path:_files' \
  '(--gems)--gems[Used to set the gems_flag, use with remove to remove gems]' \
  '(--archive)--archive[Used to set the archive_flag, use with remove to remove archive]' \
  '(--patch)--patch[With MRI Rubies you may specify one or more full paths to patches]' \
  '(-C|--configure)'{-C,--configure}'=[custom configure options]' \
  '(--nice)--nice[process niceness (for slow computers, default 0)]:number' \
  '(--ree)--ree-options[Options passed directly to ree ./installer on the command line]:options' \
  '(--head)--head[with update, updates rvm to git head version]' \
  '(--rubygems)--rubygems[with update, updates rubygems for selected ruby]' \
  '(--default)--default[with ruby select, sets a default ruby for new shells]' \
  '(--debug)--debug[Toggle debug mode on for very verbose output]' \
  '(--trace)--trace[Toggle trace mode on to see EVERYTHING rvm is doing]' \
  '(--force)--force[Force install, even given ruby is already install]' \
  '(--summary)--summary[Used with rubydo to print out a summary of the commands run]' \
  '(--latest)--latest[with gemset --dump skips version strings for latest gem]' \
  '(--gems)--gems[with uninstall/remove removes gems with the interpreter]' \
  '(--docs)--docs[with install, attempt to generate ri after installation]' \
  '(--reconfigure)--reconfigure[Force ./configure on install even if Makefile already exists]' \
  '(--quiet-curl)--quiet-curl[Makes curl silent when fetching data]' \
  '1: :->cmds' \
  '*: :->args' && ret=0

case $state in

  cmds)

    cmds=( ${(f)"$(_call_program commands rvm help 2> /dev/null | __rvm_sed -e '/^== Action/,/^== Implementation/!d; / :: /!d; s/^[ *]*\([^ ]*\) *:: *\(.*\)/\1:\2/')"} )
    cmds+=( $(rvm list strings) )
    _describe -t commands 'rvm command' cmds && ret=0
    ;;

  args)

    case $line[1] in

      (use|uninstall|remove|list)

        if (( CURRENT == 3 )); then
          # See if we’ve made it to the ‘@’; eg, 1.9.2@
          if ! __rvm_grep '@' <<< "${line[CURRENT-1]}" >/dev/null ; then
            _values -S , 'rubies' \
              $(rvm list strings | __rvm_sed -e 's/ruby-\([^) ]*\)-\([^) ]*\)/ruby-\1-\2 \1-\2 \1/g') \
              default system $(rvm alias list names) && ret=0
          else
            # Construct a full version string for each of the gemsets.
            # Eg, 1.9.2@min 1.9.2@rail3 …
            _values -S , 'gemsets' \
              $(rvm ${line[CURRENT-1]%%@*} gemset list | __rvm_awk '/^[ -_[:alnum:]]+$/ {print "'${line[CURRENT-1]%%@*}'@"$1}')
          fi
        fi
        ;;

      (install|fetch)

        _values -S , 'rubies' $(rvm list known_strings) && ret=0
        ;;

      gemset)

        if (( CURRENT == 3 )); then
          _values 'gemset_commands' $(rvm gemset help | __rvm_sed -e '/create/!d; s/^.*[{]\(.*\)[}].*$/\1/; s/,/ /g')
        else
          #_values -S , 'gemsets' $(rvm gemset list | __rvm_grep -v gemset 2>/dev/null)
          _values -S , 'gemsets' $(rvm gemset list | __rvm_grep -Ev '(gemset|info)' 2>/dev/null | __rvm_awk '/^[ -_[:alnum:]]+$/ {print '$1'}')
        fi
        ret=0
        ;;

      package)

        if (( CURRENT == 3 )); then
          _values 'package_commands' $(rvm package | __rvm_sed -e '/Usage/!d; s/^.*[{]\(.*\)[}] [{].*$/\1/; s/,/ /g')
        else
          _values 'packages' $(rvm package | __rvm_sed -e '/Usage/!d; s/^.*[}] [{]\(.*\)[}].*$/\1/; s/,/ /g')
        fi
        ret=0
        ;;

      *)
        (( ret )) && _message 'no more arguments'
        ;;

    esac
    ;;
esac

return ret
scripts/rubygems000077500000001070147511530550010024 0ustar00#!/usr/bin/env bash

source "$rvm_scripts_path/base"
source "$rvm_scripts_path/functions/rubygems"

result=0

__rvm_become

builtin command -v ruby > /dev/null || {
  rvm_error "'ruby' was not found, cannot install rubygems unless ruby is present (Do you have an RVM ruby installed & selected?)"
  exit 1
}

version="$1"
shift

[[ -n "$version" ]] || {
  rvm_error "Usage: rvm rubygems [x.y.z|latest-x.y|latest|remove]"
  exit 1
}

case "$version" in
  remove|validate|validate_gemfile)
    rubygems_$version "$@"
    ;;
  *)
    rubygems_setup ${version}
    ;;
esac
scripts/manage000077500000001334147511530550007422 0ustar00#!/usr/bin/env bash

# __rvm_detect_system() does not support AIX
sys=$( command uname -s )
if [[ "${sys}" == AIX ]]
then name_opt=-name
else name_opt=-iname
fi
original_ruby_version=${rvm_ruby_version:-""}
original_ruby_string=${rvm_ruby_string:-""}

source "$rvm_scripts_path/patches"
source "$rvm_scripts_path/functions/build"
source "$rvm_scripts_path/functions/pkg"
source "$rvm_scripts_path/functions/irbrc"
source "$rvm_scripts_path/functions/support"
source "$rvm_scripts_path/functions/rubygems"
source "$rvm_scripts_path/functions/manage/base"

if [[ -n "${RUBYOPT:-""}" ]]
then ruby_options="$RUBYOPT"
fi
unset RUBYLIB RUBYOPT # Sanity check.

binaries=()

__rvm_manage_rubies  # located in scripts/functions/manage/base
scripts/docs000077500000007741147511530550007132 0ustar00#!/usr/bin/env bash

source "$rvm_scripts_path/base"
source "$rvm_scripts_path/functions/gemset"

rvm_docs_ruby_string="$(__rvm_env_string)"
rvm_docs_ruby_string="${rvm_docs_ruby_string%%${rvm_gemset_seperator:-"@"}*}"

if [[ "$rvm_docs_ruby_string" == "system" || -z "$rvm_docs_ruby_string" ]]
then
  rvm_error "Currently 'rvm docs ...' does not work with non-rvm rubies."
  exit 1
fi

install_ruby_source()
{
  [[ -d "${rvm_src_path}/$rvm_docs_ruby_string" ]] || (
    action="fetch"
    rubies_string="$rvm_docs_ruby_string"
    source "$rvm_scripts_path"/manage
  ) || {
    rvm_error "'rvm docs ...' requires ruby sources to be available but fetching failed, run \`rvm reinstall $rvm_docs_ruby_string --disable-binary\`"
    exit 2
  }
}

rvm_docs_type="${rvm_docs_type:-rdoc}"

# Ensure we have the doc directories.
[[ -d "${rvm_docs_path:-"$rvm_path/docs"}" ]] ||
  mkdir -p "${rvm_docs_path:-"$rvm_path/docs"}/rdoc" "${rvm_docs_path:-"$rvm_path/docs"}/yard"

open_docs()
{
  if [[ -s "${rvm_docs_path:-"$rvm_path/docs"}/$rvm_docs_ruby_string/$rvm_docs_type/index.html" ]]
  then
    if
      [[ "${DESKTOP_SESSION}" == "gnome" ]] && builtin command -v gnome-open >/dev/null
    then
      gnome-open "${rvm_docs_path:-"$rvm_path/docs"}/$rvm_docs_ruby_string/$rvm_docs_type/index.html" &>/dev/null
    elif
      [[ -n "${XDG_SESSION_COOKIE}" || -n "${XDG_SESSION_ID}" ]] && builtin command -v xdg-open >/dev/null
    then
      xdg-open "${rvm_docs_path:-"$rvm_path/docs"}/$rvm_docs_ruby_string/$rvm_docs_type/index.html" &>/dev/null
    elif
      builtin command -v open >/dev/null
    then
      open "${rvm_docs_path:-"$rvm_path/docs"}/$rvm_docs_ruby_string/$rvm_docs_type/index.html"
    else
      rvm_error "None of open, xdg-open or gnome-open were found, in order to open the docs one of these two are required. \n(OR you can let me know how else to open the html in your browser from comand line on your OS :) )"
    fi
  else
    rvm_error "$rvm_docs_type docs are missing, perhaps run 'rvm docs generate' first?"
  fi
}

run_rdoc()
{
  update_rdoc
  if rdoc -V --help >/dev/null 2>&1
  then rdoc -V "$@" || return $?
  else rdoc    "$@" || return $?
  fi
}

generate_ri()
{
  install_ruby_source
  (
    __rvm_cd "${rvm_src_path}/$rvm_docs_ruby_string/"
    __rvm_log_command "generate_ri" "Generating ri documentation" run_rdoc -a --ri-site
  )
}

generate_rdoc()
{
  install_ruby_source
  (
    __rvm_cd "${rvm_src_path}/$rvm_docs_ruby_string/"
    if
      gem list | __rvm_grep ^hanna >/dev/null 2>&1
    then
      __rvm_log_command "generate_hanna" "Generating hanna documentation" \
        hanna -o "${rvm_docs_path:-"$rvm_path/docs"}/$rvm_docs_ruby_string/$rvm_docs_type" --inline-source --line-numbers --fmt=html
    else
      __rvm_log_command "generate_rdoc" "Generating rdoc documentation" \
        run_rdoc -a -o "${rvm_docs_path:-"$rvm_path/docs"}/$rvm_docs_ruby_string/$rvm_docs_type"
    fi
  )
}

generate_gems()
{
  __rvm_log_command "generate_gems" "Generating gems documentation" \command \gem rdoc --all --ri
}

update_rdoc()
{
  if
    (( rdoc_installed == 0 ))
  then
    rdoc_installed=1
    gem_install rdoc
  fi
}

install_rdoc_data()
{
  __rvm_use ${rvm_docs_ruby_string%%@*}@global
  update_rdoc
  gem list rdoc-data | __rvm_grep "^rdoc" || gem install rdoc-data
  rdoc-data --install
}

generate_docs()
{
  case "${rvm_docs_ruby_string}" in
    (*1.8.7*|*1.9.2*|*1.9.3*|*2.0.0*|jruby*|rbx*)
      __rvm_log_command install_rdoc_data "Installing rdoc-data" \
        install_rdoc_data || return $?
      ;;
    (*)
      generate_ri
      generate_rdoc
      ;;
  esac
  generate_gems
}

args=($*)
action="${args[0]}"
args=($(echo ${args[@]:1})) # Strip trailing / leading / extra spacing.
rdoc_installed=0

case "$action" in
  rdoc_data)     install_rdoc_data ;;
  generate)      generate_docs ;;
  generate-ri)   generate_ri   ;;
  generate-rdoc) generate_rdoc ;;
  generate-gems) generate_gems ;;
  open)          open_docs     ;;
  help)          rvm_help docs ;;
  *)
    rvm_help docs
    exit 1
    ;;
esac
scripts/override_gem000077500000001067147511530550010644 0ustar00#!/usr/bin/env bash

if [[ ${rvm_leave_gem_alone:-0} -eq 0 ]]
then
  function gem
  {
    \typeset result
    (
      \typeset rvmrc
      rvm_rvmrc_files=("/etc/rvmrc" "$HOME/.rvmrc")
      if [[ -n "${rvm_prefix:-}" ]] && ! [[ "$HOME/.rvmrc" -ef "${rvm_prefix}/.rvmrc" ]]
         then rvm_rvmrc_files+=( "${rvm_prefix}/.rvmrc" )
      fi

      for rvmrc in "${rvm_rvmrc_files[@]}"
      do [[ -s "${rvmrc}" ]] && source "${rvmrc}" || true
      done
      unset rvm_rvmrc_files
      command gem "$@"
    ) || result=$?
    hash -r
    return ${result:-0}
  }
fi
scripts/prepare000077500000005467147511530550007643 0ustar00#!/usr/bin/env bash

source "$rvm_scripts_path/base"

external_prepare()
{
  \typeset remote_shell
  rvm_ruby_string="${1:-}"
  remote_shell="${2:-}"
  shift || [[ -n "${rvm_ruby_string}" ]] || {
    rvm_error_help "Missing ruby name to export for prepare." external prepare
    return 3
  }
  __rvm_ruby_string
  __rvm_remote_extension "${rvm_ruby_string}"

  external_prepare_package "${rvm_ruby_string}.${rvm_remote_extension}" &&
  external_prepare_upload "${rvm_ruby_string}.${rvm_remote_extension}" "${remote_shell}"
}

external_prepare_package()
{
  \typeset file_name
  file_name="$1"

  [[ -d "${rvm_rubies_path}/${rvm_ruby_string}" ]] ||
  {
    rvm_error "Ruby ${rvm_ruby_string} does not exist, maybe install first?."
    return 2
  }

  rvm_log "Preparing ${rvm_ruby_string} ..."
  if
    __rvm_package_create "${file_name}" "${rvm_rubies_path}" "${rvm_ruby_string}"
  then
    rvm_log "Prepared ${file_name}."
  else
    case $? in
      199)
        rvm_error "Unrecognized archive format for ${file_name}"
        return 199
        ;;
      *)
        rvm_error "Error packaging ${file_name}."
        return 1
        ;;
    esac
  fi
}

#TODO: move to SMF ! RVM2 ?
external_prepare_upload()
{
  \typeset remote_path remote_shell remote_directory system_path __remote_file file_name local_file path_prefix

  file_name="$1"
  remote_path="${2:-rvm@ssh.rvm.io:~/site/shared/public/binaries}"
  system_path="$(__rvm_system_path - 99 )"
  remote_directory="${remote_path#*:}/${system_path}"
  remote_shell="${remote_path%:*}"
  if
    [[ ${rvm_path_flag:-0} -eq 1 ]]
  then
    path_prefix="${remote_path#*:}"
    path_prefix="${path_prefix##*/}"
    mkdir -p "${path_prefix}/${system_path}"
    local_file="${path_prefix}/${system_path}/${file_name}"
    \command \mv "${file_name}" "${local_file}"
  else
    local_file="${file_name}"
  fi
  __rvm_calculate_remote_file  0 1 1 "${file_name}"

  rvm_log "--- upload:"
  printf "%b" "ssh \"$remote_shell\" \"mkdir -p $remote_directory/\"\n"
  if
    [[ ${rvm_path_flag:-0} -eq 1 ]]
  then
    printf "%b" "rsync -av --rsh=ssh \"${path_prefix}/\" \"${remote_path}/\"\n"
  else
    printf "%b" "scp \"${local_file}\" \"$remote_shell:$remote_directory/${file_name}\"\n"
  fi
  rvm_log "--- rvm/config/remote:"
  printf "%b" "${__remote_file}\n"
  rvm_log "--- rvm/config/md5:"
  printf "%b" "${__remote_file}=$( __rvm_md5_calculate      "${local_file}" )\n"
  rvm_log "--- rvm/config/sha512:"
  printf "%b" "${__remote_file}=$( __rvm_sha__calculate 512 "${local_file}" )\n"
}

action="${1:-}"
shift || {
  rvm_error_help "Missing action for prepare." prepare
  exit 1
}

# skip first param if empty
[[ -n "${1:-}" ]] || (( $#==0 )) || shift

case "${action}" in
  (prepare)
    external_prepare "$@"
    ;;
  (*)
    rvm_error_help "Wrong action for prepare '$action'." prepare $action
    exit 2
    ;;
esac
scripts/repair000077500000007463147511530550007465 0ustar00#!/usr/bin/env bash

source "$rvm_scripts_path/base"

usage()
{
  printf "%b" "
  Usage:

    rvm repair [option]

  Options:
    wrappers     - Repair wrappers
    symlinks     - Repair symlinks
    environments - Repair environments
    archives     - Repair archives
    gemsets      - Repair gemsets
    all          - Repair all of the above

"
}

repair_gemsets()
{
  \typeset directory directories

  rvm_log "Removing gemsets missing names or interpreters."

  (
    __rvm_cd "${rvm_gems_path:-"rvm_path/gems"}"

    directories=(
      $( __rvm_find . -mindepth 1 -maxdepth 1 -type d | __rvm_grep '@$' )
      $( __rvm_find . -mindepth 1 -maxdepth 1 -type d | __rvm_grep '^./@')
    )

    for directory in "${directories[@]//.\/}"
    do
      __rvm_rm_rf "./$directory/"
    done
  )

  rvm_log "Gemsets repaired."
  return 0
}

repair_wrappers()
{
  rvm_log "Regenerating all wrappers..."
  __rvm_read_lines ruby_names <(__rvm_list_gemset_strings)

  for ruby_name in "${ruby_names[@]}"
  do
    __rvm_log_command \
      "wrappers.regenerate.$ruby_name" \
      "Regenerating wrappers for $ruby_name" \
      __rvm_with $ruby_name run_gem_wrappers regenerate ||
    failed_wrappers+=( "$wrapper_ruby_name" )
  done

  if (( ${#failed_wrappers[@]} ))
  then rvm_error "Wrappers regeneration failed for: ${failed_wrappers[*]}"
  else rvm_log "Wrappers regenerated"
  fi
  return ${#failed_wrappers[@]}
}

# Removes stale symlinks in $rvm_bin_path, likely related to wrappers.
repair_symlinks()
{
  rvm_log "Repairing symlinks..."
  for executable_name in "${rvm_bin_path}"/*
  do
    if
      [[ -L "$executable_name" && ! -e "$executable_name" && "$executable_name" != "${rvm_bin_path}/*" ]]
    then
      rvm_log "removing stale symlink from $(basename "$executable_name")"
      \command \rm -f "$executable_name"
    fi
  done
  rvm_log "Symlinks repaired"
}

# Regenerates each symlink file.
repair_environments()
{
  \typeset environment_name environments

  rvm_log "Regenerating environments..."

  environments=($(__rvm_cd "$rvm_environments_path" ; __rvm_find . -maxdepth 1 -mindepth 1 -type f))

  for environment_name in "${environments[@]//.\/}"
  do
    [[ -L "$rvm_environments_path/$environment_name" ]] && continue
    rvm_log "Regenerating environment file for '$environment_name'"

    [[ -f "$rvm_environments_path/$environment_name" ]] && \command \rm -f "$rvm_environments_path/$environment_name"

    (
      source "$rvm_scripts_path/base"
      __rvm_become "$environment_name"
      __rvm_ensure_has_environment_files
    )
  done

  rvm_log "Environments regenerated"
}

# Removes archives that have incorrect md5 sums.
repair_archives()
{
  \typeset archive_file archives stored_md5sum

  rvm_log "Repairing archives..."

  __rvm_read_lines archives <(
    __rvm_cd "${rvm_archives_path}"
    __rvm_find . -maxdepth 1 -mindepth 1 -type f
  )

  for archive_file in "${archives[@]//.\/}"
  do
    if
      __rvm_checksum_read "$archive_file" &&
      __rvm_checksum_any
    then
      __rvm_checksum_validate_file "${rvm_archives_path}/$archive_file" ||
      {
        rvm_log "Removing archive for '$archive_file' - Incorrect md5 checksum."
        __rvm_rm_rf "${rvm_archives_path}/$archive_file"
      }
    fi
  done

  rvm_log "Archives repaired"
  return 0
}

repair_all()
{
  repair_symlinks
  repair_archives
  repair_environments
  repair_wrappers

  return 0
}

args=($*)
action="${args[$__array_start]}"
args[$__array_start]=""
args=(${args[@]})

if [[ -z "$action" ]]
then
  usage
  exit $?
fi

case "$action" in
  all)          repair_all          ;;
  symlinks)     repair_symlinks     ;;
  gemsets)      repair_gemsets      ;;
  environments) repair_environments ;;
  archives)     repair_archives     ;;
  wrappers)     repair_wrappers     ;;
  help)         usage               ;;
  *)            usage >&2 ; exit 1  ;;
esac

exit $?
scripts/alias000077500000005667147511530550007300 0ustar00#!/usr/bin/env bash

unset rvm_default_flag

source "$rvm_scripts_path/base"
source "$rvm_scripts_path/functions/alias"

usage() {
  printf "%b" "

  Usage:

    rvm alias [action] [arguments]

  Examples:

    rvm alias create [alias_name] [ruby]
    rvm alias delete [alias_name]
    rvm alias show [alias_name]
    rvm alias list

"
}

alias_create_execute()
{
  for _path in "$rvm_rubies_path" "$rvm_gems_path" "$rvm_environments_path" "$rvm_wrappers_path"
  do
    if [[ -L "$_path/$alias_name" ]]
    then \command \rm -fv "$_path/$alias_name" || return $?
    fi
    \command \ln -fs "$_path/$rvm_ruby_string" "$_path/$alias_name" || return $?
  done

  __rvm_db_ "$rvm_path/config/alias" "$alias_name" "$rvm_ruby_string"
}

alias_create()
{
  alias_name="${alias_name:-""}"
  rvm_ruby_string="$rvm_environment_identifier"
  rvm_expanding_aliases=1
  __rvm_become
  unset rvm_expanding_aliases

  if
    [[ -z "${rvm_environment_identifier:-""}" || -z "$rvm_ruby_string" || -z "$alias_name" ]]
  then
    rvm_error "usage: 'rvm alias [action] [alias_name] [ruby_string]'"
    return 1
  elif
    [[ ! -L "$rvm_rubies_path/$alias_name" && -d "$rvm_rubies_path/$alias_name" ]]
  then
    rvm_error "$alias_name is a full ruby name and can not be used as alias name."
    return 2
  else
    __rvm_log_command "alias_create" \
      "Creating alias $alias_name for $rvm_ruby_string" \
      alias_create_execute
  fi
}

alias_list_show()
{
  __rvm_cd "$rvm_rubies_path"
  __rvm_find . -maxdepth 1 -mindepth 1 -type l | __rvm_sed -e 's#.*/##'
}

alias_list() {
  case "${alias_name}" in
    (names)
      alias_list_show # just show it
      ;;
    (*)
      \typeset -a items
      __rvm_read_lines items <(alias_list_show)
      \typeset item
      for item in "${items[@]}"
      do echo "$item => $(__rvm_db_ "$rvm_path/config/alias" "$item")"
      done
      ;;
  esac
}

alias_search_by_target() {
  \typeset item items target search
  search="${alias_name}@${gemset_name}"

  items=($(__rvm_cd "$rvm_rubies_path" ; __rvm_find . -maxdepth 1 -mindepth 1 -type l | __rvm_sed -e 's#./##'))

  for item in "${items[@]}"
  do
    target=$(__rvm_db_ "$rvm_path/config/alias" "$(basename "$item")")
    if [[ "${search}" == "${target}" ]]
    then
      echo "$(basename "$item")"
    fi
  done
}

args=($*)
action="${args[0]:-""}"
alias_name="${args[1]:-""}"
rvm_environment_identifier="${args[2]:-""}"
shift 3
args="$@"
result=0

if
  [[ "$alias_name" == *"/"* ]]
then
  printf "%b" "Can not use path separator '/' in alias names."
  exit 1
fi

[[ -f "$rvm_path/config/alias" ]] || touch "$rvm_path/config/alias"

if
  [[ "$alias_name" == *"${rvm_gemset_separator:-"@"}"* ]]
then
  gemset_name="${alias_name/*${rvm_gemset_separator:-"@"}/}"
  alias_name="${alias_name/${rvm_gemset_separator:-"@"}*/}"
else
  gemset_name=""
fi

case "$action" in
  delete|create|list|show|search_by_target)
    alias_${action}
    ;;
  help|usage)
    usage
    ;;
  *)
    usage
    exit 1
    ;;
esac

exit $?
scripts/help000077500000002453147511530550007125 0ustar00#!/usr/bin/env bash

rvm_base_except="selector"

source "$rvm_scripts_path/base"
source "$rvm_scripts_path/functions/version"

__rvm_help_find()
{
  \typeset _full_name
  \typeset -a _full_paths

  _full_name=""
  _full_paths=()
  _matched=""

  case "$1" in
    (*/*) return 1 ;;
  esac

  # start with shortest, build path and prepend it to beginning
  while (( $# > 0 ))
  do
    _full_name="${_full_name:-}${1:-}"
    _full_paths=( "${_full_name}.md" "${_full_paths[@]}" )
    _full_name="${_full_name:-}/"
    shift
  done

  # check longest paths first
  for _full_name in "${_full_paths[@]}"
  do
    if
      [[ -n "${_full_name}" && -s "${rvm_help_path}/${_full_name}" ]]
    then
      echo "${rvm_help_path}/${_full_name}"
      return 0
    elif
      [[ -n "${_full_name}" && -s "${rvm_docs_path}/${_full_name}" ]]
    then
      echo "${rvm_docs_path}/${_full_name}"
      return 0
    fi
  done
  return 1
}

__rvm_help()
{
  \typeset _matched

  __rvm_print_headline

  if
    _matched="$(__rvm_help_find "$@")"
  then
    __rvm_pager_or_cat_v "${_matched}"
  else
    [[ -z "$1" ]] || rvm_error "Documentation for 'rvm $*' not found"

    __rvm_pager_or_cat_v "${rvm_path:-$HOME/.rvm}/help/index.txt"
  fi

  rvm_log "
For additional documentation please visit $(__rvm_version_website)
"
}
__rvm_help "$@"
scripts/requirements000077500000000427147511530550010717 0ustar00#!/usr/bin/env bash

: rvm_scripts_path:${rvm_scripts_path:=$rvm_path/scripts}

source "$rvm_scripts_path/base"
source "$rvm_scripts_path/patches"
source "$rvm_scripts_path/functions/build"

__rvm_setup_compile_environment_setup
__rvm_setup_compile_environment_requirements "$@"
scripts/info000077500000012073147511530550007127 0ustar00#!/usr/bin/env bash

if
  [[ "$rvm_trace_flag" -eq 2 ]]
then
  set -x
  export rvm_trace_flag
fi

source "$rvm_scripts_path/base"
source "$rvm_scripts_path/functions/autolibs"
source "$rvm_scripts_path/functions/detect/system"
source "$rvm_scripts_path/functions/version"
source "$rvm_scripts_path/functions/version-installed-when"

version_for()
{
  \typeset binary
  binary=${1:-""}
  if
    builtin command -v "$binary" >/dev/null
  then
    $binary --version | \command \head -n1
  else
    echo "not installed"
  fi
}

info_system()
{
  source "$rvm_scripts_path/functions/detect/xcode"

  rvm_info="
  system:
    uname:        \"${_system_info}\"
    name:         \"${_system_name}\"
    version:      \"${_system_version}\"
    architecture: \"${_system_arch}\"
    bash:         \"$(command -v bash) => $(version_for bash)\"
    zsh:          \"$(command -v zsh) => $(version_for zsh)\"
    remote_path:  \"$(__rvm_system_path - 99 )\""

  [[ "$_system_name" == "OSX" ]] && rvm_info="${rvm_info}
    xcode:        \"$(__rvm_detect_xcode_version)\""

  rvm_info="${rvm_info}\n"
}

info_rvm()
{
  __rvm_autolibs_get
  __rvm_autolibs_translate_description

  rvm_info="
  rvm:
    version:      \"${rvm_version}\"
    updated:      \"$(__rvm_version_installed_when)\"
    path:         \"$rvm_path\"
    autolibs:     \"[${rvm_autolibs_flag}] ${rvm_autolibs_flag_description}\"
"
}

info_ruby()
{
  [[ "$(__rvm_env_string)" == "system" ]] && return
  ruby=$(builtin command -v ruby)
  if
    [[ $? -eq 0 ]] && [[ -x "$ruby" ]]
  then
    full_version="$($ruby -v)"
  fi
  rvm_info="
  ruby:
    interpreter:  \"$(printf "%b" "${full_version}" | __rvm_awk '{print $1}')\"
    version:      \"$(printf "%b" "${full_version}" | __rvm_awk '{print $2}')\"
    date:         \"$(printf "%b" "${full_version}" | __rvm_sed 's/^.*(\([0-9]\{4\}\(-[0-9][0-9]\)\{2\}\).*$/\1/')\"
    platform:     \"$(printf "%b" "${full_version}" | __rvm_sed 's/^.*\[//' | __rvm_sed 's/\].*$//')\"
    patchlevel:   \"$(printf "%b" "${full_version}" | __rvm_sed 's/^.*(//' | __rvm_sed 's/).*$//')\"
    full_version: \"${full_version}\"
"
}

info_homes()
{
  rvm_info="
  homes:
    gem:          \"${GEM_HOME:-"not set"}\"
    ruby:         \"${MY_RUBY_HOME:-"not set"}\"
"
}

info_binaries()
{
  rvm_info="
  binaries:
    ruby:         \"$(command -v ruby)\"
    irb:          \"$(command -v irb)\"
    gem:          \"$(command -v gem)\"
    rake:         \"$(command -v rake)\"
"
}

info_environment()
{
  rvm_info="
  environment:
    PATH:         \"${PATH:-""}\"
    GEM_HOME:     \"${GEM_HOME:-""}\"
    GEM_PATH:     \"${GEM_PATH:-""}\"
    MY_RUBY_HOME: \"${MY_RUBY_HOME:-""}\"
    IRBRC:        \"${IRBRC:-""}\"
    RUBYOPT:      \"${RUBYOPT:-""}\"
    gemset:       \"$(__rvm_current_gemset)\"\n
"
  if [[ -n "${MAGLEV_HOME:-""}" ]]
  then rvm_info="$rvm_info\n  MAGLEV_HOME: \"$MAGLEV_HOME\""
  fi
  rvm_info="$rvm_info\n"
}

info_debug()
{
  rvm_info="

$(__rvm_print_headline)
  $("$rvm_scripts_path/info" "$rvm_ruby_string" "" )
  PATH:\n$(printf "%b" "$PATH" | __rvm_awk -F":" '{print $1":"$2":"$3":"$4":"$5}' )
  uname -a: ${_system_info}
  permissions: $(__rvm_ls -la "$rvm_path" "$rvm_rubies_path")
"

  if [[ "Darwin" == "${_system_type}" ]]
  then
    rvm_info="$rvm_info
  sw_vers: $(sw_vers | \command \tr "\n" ',')
  ARCHFLAGS: ${ARCHFLAGS:-""}
  LDFLAGS: ${LDFLAGS:-""}
  CFLAGS: ${CFLAGS:-""}
"
  fi
  for file_name in "$HOME/.bashrc" "$HOME/.bash_profile" "$HOME/.zshenv"
  do
    if
      [[ -s "$file_name" ]]
    then
      rvm_info="$rvm_info\n$file_name:\n$(__rvm_grep 'rvm' "$file_name" 2>/dev/null || true)"
    fi
  done

  debug_files=(
    "$rvm_path/config/alias" "$rvm_path/config/system" "$rvm_path/config/db"
    "/etc/rvmrc" "$HOME/.rvmrc" "/etc/gemrc" "$HOME/.gemrc"
  )

  for file_name in "${debug_files[@]}"
  do
    if
      [[ -f "$file_name" && -s "$file_name" ]]
    then
      rvm_info="$rvm_info\n$file_name \(filtered\):\n$(__rvm_awk '!/assword|_key/{print}' "$file_name" )\n"
    fi
  done
  rvm_info="$rvm_info\ngem sources:\n$(gem sources | __rvm_awk '/gems/{print}')\n\n"
}

info_sections()
{
  for section in $(printf "%b" "${sections//,/ }")
  do
    rvm_info=""
    "info_${section}"
    printf "%b" "$rvm_info"
  done
}

rvm_ruby_gem_home="${rvm_ruby_gem_home:-${GEM_HOME:-""}}"

if
  [[ ! -d "$rvm_ruby_gem_home" ]] &&
  builtin command -v gem > /dev/null 2>&1
then
  rvm_ruby_gem_home="$(gem env home)"
fi

rvm_info=""
args=($*)

ruby_strings="${args[$__array_start]// /}"
args[$__array_start]=""
args=(${args[@]})

sections="${args// /}"
all_sections="system rvm ruby homes binaries environment"

# TODO: Figure out what was the thought here and remove external match script
#       dependency
if
  __rvm_string_match "$all_sections debug" "*${ruby_strings%%,*}*"
then
  sections="$ruby_strings"
  ruby_strings=""
fi

if
  [[ -z "${sections// /}" ]]
then
  sections="$all_sections"
fi

if
  [[ -z "$ruby_strings" ]]
then
  printf "%b" "\n$(__rvm_env_string):\n"
  info_sections
else
  for ruby_string in ${ruby_strings//,/ }
  do
    __rvm_become "$ruby_string"
    printf "%b" "\n$(__rvm_env_string):\n"
    info_sections
  done
fi
scripts/completion000077500000001343147511530550010343 0ustar00#!/usr/bin/env bash


if
  [[ -n "${ZSH_VERSION:-}" ]]
then
  # zsh completion for Ruby Version Manager (RVM), thanks to https://github.com/JoeKun
  [[ " ${fpath[*]} " == *" ${rvm_scripts_path:-$rvm_path/scripts}/extras/completion.zsh "* ]] ||
  {
    fpath+=( "${rvm_scripts_path:-$rvm_path/scripts}/extras/completion.zsh" )
    if
      [[ -n "${_comp_dumpfile:-}" ]]
    then
      \command \rm -f "$_comp_dumpfile"
      compinit -d "$_comp_dumpfile"
    fi
  }
elif
  [[ -n "${BASH_VERSION:-}" ]]
then
  # bash completion for Ruby Version Manager (RVM)
  source "${rvm_scripts_path:-$rvm_path/scripts}/extras/completion.bash"
  complete -o default -F _rvm rvm
else
  echo "RVM does not currently support completion in your shell."
fi
scripts/initialize000077500000014756147511530550010347 0ustar00#!/usr/bin/env bash

# Set shell options that RVM cannot live without,
# see __rvm_setup and __rvm_teardown for further settings.
if
  [[ -n "${BASH_VERSION:-}" ]]
then
  shopt -s extglob
elif
  [[ -n "${ZSH_VERSION:-}" ]]
then
  setopt extendedglob
  setopt kshglob
  setopt no_glob_subst
elif
  [[ -n "${KSH_VERSION:-}" ]]
then
  true # mksh
else
  printf "%b" "What the heck kind of shell are you running here???\n"
fi

# duplication marker jkdfkdfngjdjkfngjkdfngjkd
if
  (( ${rvm_trace_flag:-0} == 1 ))
then
  if   [[ -n "${BASH_VERSION:-}" ]]
  then export PS4="+ \$(__rvm_date \"+%s.%N\" 2>/dev/null) \${BASH_SOURCE##\${rvm_path:-}} : \${FUNCNAME[0]:+\${FUNCNAME[0]}()}  \${LINENO} > "
  elif [[ -n "${ZSH_VERSION:-}" ]]
  then export PS4="+ %* %F{red}%x:%I %F{green}%N:%i%F{white} %_"
  fi
  set -o xtrace
fi

export __rvm_env_loaded
# set env loaded flag if not yet set
: __rvm_env_loaded:${__rvm_env_loaded:=0}:
# increase load count counter
: __rvm_env_loaded:$(( __rvm_env_loaded+=1 )):

# load only if not yet loaded or first time loading
if [[ -z "${rvm_tmp_path:-}" ]] || (( __rvm_env_loaded == 1 ))
then

  if
    \typeset -f __rvm_cleanse_variables >/dev/null 2>&1
  then
    __rvm_cleanse_variables ||
    if [[ -n "${ZSH_VERSION:-}" ]]
    then rvm_error "ZSH Error, run \`rm -f ~/.zcompdump\` and try again."
    fi
  fi

  # Ensure that /etc/rvmrc and $HOME/.rvmrc values take precedence.
  if (( ${rvm_ignore_rvmrc:=0} == 0 ))
  then
    [[ -n "${rvm_stored_umask:-}" ]] || export rvm_stored_umask=$(umask)

    rvm_rvmrc_files=("/etc/rvmrc" "$HOME/.rvmrc")
    if [[ -n "${rvm_prefix:-}" ]] && ! [[ "$HOME/.rvmrc" -ef "${rvm_prefix}/.rvmrc" ]]
    then rvm_rvmrc_files+=( "${rvm_prefix}/.rvmrc" )
    fi
    for rvmrc in "${rvm_rvmrc_files[@]}"
    do
      if [[ -f "$rvmrc" ]]
      then
        if GREP_OPTIONS="" \command \grep '^\s*rvm .*$' "$rvmrc" >/dev/null 2>&1
        then
          printf "%b" "
Error:
          $rvmrc is for rvm settings only.
          rvm CLI may NOT be called from within $rvmrc.
          Skipping the loading of $rvmrc"
          return 1
        else
          source "$rvmrc"
        fi
      fi
    done
    unset rvm_rvmrc_files
  fi

  # duplication marker jdgkjnfnkjdngjkfnd4fd
  export rvm_path
  if [[ -z "${rvm_path:-}" ]]
  then
    if [[ -n "${BASH_SOURCE:-$_}" && -f "${BASH_SOURCE:-$_}" ]]
    then
      rvm_path="${BASH_SOURCE:-$_}"
      rvm_path="$( \command \cd "${rvm_path%/scripts/initialize}">/dev/null; pwd )"
    elif (( UID == 0 )) && [[ -d "/usr/local/rvm" ]]
    then rvm_path="/usr/local/rvm"
    elif [[ -d "${HOME}/.rvm" ]]
    then rvm_path="${HOME}/.rvm"
    elif [[ -d "/usr/local/rvm" ]]
    then rvm_path="/usr/local/rvm"
    else echo "Can't find rvm install!" 1>&2 ; exit 1
    fi
  fi

  true ${rvm_scripts_path:="$rvm_path/scripts"}

  #
  # Setup RVM Environment variables.  Each RVM internal path is intended to be
  # configurable by the end users for whatever their needs may be.
  # They should be set in /etc/rvmrc and then $HOME/.rvmrc
  #
  # duplication marker kkdfkgnjfndgjkndfjkgnkfjdgn
  [[ -n "${rvm_user_install_flag:-}" ]] ||
  case "$rvm_path" in
    (/usr/local/rvm)         rvm_user_install_flag=0 ;;
    ($HOME/*|/${USER// /_}*) rvm_user_install_flag=1 ;;
    (*)                      rvm_user_install_flag=0 ;;
  esac
  export rvm_user_install_flag

  : \
    rvm_bin_path:${rvm_bin_path:="$rvm_path/bin"} \
    rvm_man_path:${rvm_man_path:="$rvm_path/share/man"} \
    rvm_archives_path:${rvm_archives_path:="$rvm_path/archives"} \
    rvm_docs_path:${rvm_docs_path:="$rvm_path/docs"} \
    rvm_environments_path:${rvm_environments_path:="$rvm_path/environments"} \
    rvm_examples_path:${rvm_examples_path:="$rvm_path/examples"} \
    rvm_gems_path:${rvm_gems_path:="$rvm_path/gems"} \
    rvm_gemsets_path:${rvm_gemsets_path:="$rvm_path/gemsets"} \
    rvm_help_path:${rvm_help_path:="$rvm_path/help"} \
    rvm_docs_path:${rvm_docs_path:="$rvm_path/docs"} \
    rvm_hooks_path:${rvm_hooks_path:="$rvm_path/hooks"} \
    rvm_lib_path:${rvm_lib_path:="$rvm_path/lib"} \
    rvm_log_path:${rvm_log_path:="$rvm_path/log"} \
    rvm_patches_path:${rvm_patches_path:="$rvm_path/patches"} \
    rvm_repos_path:${rvm_repos_path:="$rvm_path/repos"} \
    rvm_rubies_path:${rvm_rubies_path:="$rvm_path/rubies"} \
    rvm_rubygems_path:${rvm_rubygems_path:="$rvm_path/rubygems"} \
    rvm_src_path:${rvm_src_path:="$rvm_path/src"} \
    rvm_tmp_path:${rvm_tmp_path:="$rvm_path/tmp"} \
    rvm_user_path:${rvm_user_path:="$rvm_path/user"} \
    rvm_usr_path:${rvm_usr_path:="$rvm_path/usr"} \
    rvm_wrappers_path:${rvm_wrappers_path:="$rvm_path/wrappers"} \
    rvm_verbose_flag:${rvm_verbose_flag:=0} \
    rvm_debug_flag:${rvm_debug_flag:=0} \
    rvm_gems_cache_path:${rvm_gems_cache_path:=${rvm_gems_path:-"$rvm_path/gems"}/cache}

  export rvm_action rvm_alias_expanded rvm_archive_extension rvm_archives_path rvm_bin_flag rvm_bin_path rvm_debug_flag rvm_default_flag rvm_delete_flag rvm_docs_path rvm_docs_type rvm_dump_environment_flag rvm_environments_path rvm_error_message rvm_examples_path rvm_expanding_aliases rvm_file_name rvm_gemdir_flag rvm_gems_cache_path rvm_gems_path rvm_gemset_name rvm_gemset_separator rvm_gemsets_path rvm_gemstone_package_file rvm_gemstone_url rvm_head_flag rvm_help_path rvm_docs_path rvm_hook rvm_hooks_path rvm_install_on_use_flag rvm_lib_path rvm_llvm_flag rvm_loaded_flag rvm_log_path rvm_niceness rvm_nightly_flag rvm_only_path_flag rvm_parse_break rvm_patch_original_pwd rvm_patches_path rvm_path rvm_pretty_print_flag rvm_proxy rvm_quiet_flag rvm_reload_flag rvm_remove_flag rvm_repos_path rvm_rubies_path rvm_ruby_alias rvm_ruby_args rvm_ruby_binary rvm_ruby_bits rvm_ruby_configure rvm_ruby_file rvm_ruby_gem_home rvm_ruby_gem_path rvm_ruby_global_gems_path rvm_ruby_home rvm_ruby_interpreter rvm_ruby_irbrc rvm_ruby_major_version rvm_ruby_make rvm_ruby_make_install rvm_ruby_minor_version rvm_ruby_mode rvm_ruby_name rvm_ruby_package_file rvm_ruby_package_name rvm_ruby_patch rvm_ruby_patch_level rvm_ruby_release_version rvm_ruby_repo_url rvm_ruby_revision rvm_ruby_selected_flag rvm_ruby_sha rvm_ruby_string rvm_ruby_strings rvm_ruby_tag rvm_ruby_url rvm_ruby_user_tag rvm_ruby_version rvm_script_name rvm_scripts_path rvm_sdk rvm_user_install_flag rvm_silent_flag rvm_src_path rvm_sticky_flag rvm_system_flag rvm_tmp_path rvm_token rvm_trace_flag rvm_use_flag rvm_user_flag rvm_user_path rvm_usr_path rvm_verbose_flag rvm_wrappers_path rvm_ruby_repo_branch rvm_man_path rvm_remote_flag rvm_ruby_repo_tag

fi # if [[ -z "${rvm_tmp_path:-}" ]] || (( __rvm_env_loaded == 1 ))
scripts/hook000077500000002643147511530550007136 0ustar00#!/usr/bin/env bash

# need additional step to not redefine variables value if already set
\typeset old_rvm_verbose_flag old_rvm_debug_flag >/dev/null 2>/dev/null
old_rvm_verbose_flag=${rvm_verbose_flag:-0}
old_rvm_debug_flag=${rvm_debug_flag:-0}

# silence Zsh redefinitions
\typeset rvm_verbose_flag rvm_debug_flag hooks >/dev/null 2>/dev/null

true rvm_verbose_flag:${rvm_verbose_flag:=${old_rvm_verbose_flag}} \
  rvm_hooks_path:${rvm_hooks_path:="$rvm_path/hooks"} \
  rvm_debug_flag:${rvm_debug_flag:=${old_rvm_debug_flag}} rvm_hook:${rvm_hook:=}

if
  [[ -n "$rvm_hook" ]]
then
  hooks=()
  if
    [[ -d "$rvm_hooks_path" ]]
  then
    hooks+=( "$rvm_hooks_path" )
  fi
  if
    [[ "$PWD/.rvm/hooks" != "$rvm_hooks_path" && -d "$PWD/.rvm/hooks" ]]
  then
    hooks+=( "$PWD/.rvm/hooks" )
  fi

  if
    [[ -n "${hooks[*]}" ]]
  then
    __rvm_read_lines _hooks_list <(
      __rvm_find -L "${hooks[@]}" -iname "$rvm_hook*" -type f 2>/dev/null || true
    )
    for hook in "${_hooks_list[@]}"
    do
      if
        [[ -x "${hook}" || "${hook##*/}" == "$rvm_hook" ]]
      then
        if
          [[ "${hook}" == "$rvm_hooks_path/"* ]] ||   # trust internal hooks
          __rvm_check_rvmrc_trustworthiness "${hook}" # ask user to trust other files
        then
          rvm_debug "Running $hook"
          __rvm_conditionally_do_with_env . "${hook}" >&2
        fi
      fi
    done
  fi
fi

unset rvm_hook hooks _hooks_list hook
scripts/maglev000077500000016531147511530550007452 0ustar00#!/usr/bin/env bash

source "$rvm_scripts_path/base"

true ${rvm_trace_flag:-0}

if (( rvm_trace_flag == 2 ))
then
  set -x
  export rvm_trace_flag
fi

system="${_system_type}"
version="${rvm_ruby_string}.${system}"

# Check we're on a suitable 64-bit machine
case "$system" in
  Linux)
    if [[ "${_system_arch}" != "x86_64" ]]
    then
      rvm_error "This script only works on a 64-bit Linux OS."
      echo "The result from \"uname -sm\" is \"${_system_type} ${_system_arch}\" not \"Linux x86_64\""
      exit 1
    fi
    ;;

  Darwin)
    system_version="$(sw_vers -productVersion)"
    MAJOR="$(echo $system_version | cut -f1 -d.)"
    MINOR="$(echo $system_version | cut -f2 -d.)"
    CPU_CAPABLE="$(sysctl hw.cpu64bit_capable | cut -f2 -d' ')"
    #
    # Check the CPU and Mac OS profile.
    if [[ $CPU_CAPABLE -ne 1 || $MAJOR -lt 10 || $MINOR -lt 5 ]]
    then
      rvm_error "This script requires Mac OS 10.5 or later on a 64-bit Intel CPU."
      exit 1
    fi
    ;;

  SunOS)
    if [[ "${_system_arch}" != "i386" || "$(isainfo -b)" != "64" ]]
    then
      rvm_error "This script only works on a 64-bit Solaris-x86 OS."
      exit 1
    fi
    ;;

  *)
    rvm_error "This script only works on a 64-bit Linux, Mac OS X, or Solaris-x86 machine"
    echo "The result from \"uname -sm\" is \"${_system_type} ${_system_version}\""
    exit 1
    ;;
esac

# We should run this as a normal user, not root.
if (( UID == 0 ))
then
  rvm_error "This script should be run as a normal user, not root."
  exit 1
fi

# Check that the current directory is writable
if [[ ! -w "." ]]
then
  rvm_error "This script requires write permission on your current directory."
  __rvm_ls -ld $PWD
  exit 1
fi

# We're good to go. Let user know.
machine_name="$(command uname -n)"

rvm_log "Starting installation of $version on $machine_name"

# Figure out how much total memory is installed
rvm_log "Setting up shared memory"
#
# Ref: http://wiki.finkproject.org/index.php/Shared_Memory_Regions_on_Darwin
# Ref: http://developer.postgresql.org/pgdocs/postgres/kernel-resources.html
# Ref: http://www.idevelopment.info/data/Oracle/DBA_tips/Linux/LINUX_8.shtml
#
case "$system" in
  Linux)
    # use TotalMem: kB because Ubuntu doesn't have Mem: in Bytes
    totalMemKB=$(__rvm_awk '/MemTotal:/{print($2);}' /proc/meminfo)
    totalMem=$(($totalMemKB * 1024))
    # Figure out the max shared memory segment size currently allowed
    shmmax=$(\command \cat /proc/sys/kernel/shmmax)
    # Figure out the max shared memory currently allowed
    shmall=$(\command \cat /proc/sys/kernel/shmall)
    ;;

  Darwin)
    totalMem="$(sysctl hw.memsize | cut -f2 -d' ')"
    # Figure out the max shared memory segment size currently allowed
    shmmax="$(sysctl kern.sysv.shmmax | cut -f2 -d' ')"
    # Figure out the max shared memory currently allowed
    shmall="$(sysctl kern.sysv.shmall | cut -f2 -d' ')"
    ;;

  SunOS)
    # TODO: figure memory needs for SunOS
    # Investigate project.max-shm-memory
    totalMemMB="$(/usr/sbin/prtconf | __rvm_grep Memory | cut -f3 -d' ')"
    totalMem=$(($totalMemMB * 1048576))
    shmmax=$(($totalMem / 4))
    shmall=$(($shmmax / 4096))
    ;;

  *)
    rvm_error "Can't determine operating system. Check script."
    exit 1
    ;;
esac
totalMemMB=$(($totalMem / 1048576))
shmmaxMB=$(($shmmax / 1048576))
shmallMB=$(($shmall / 256))

# Print current values
echo "  Total memory available is $totalMemMB MB"
echo "  Max shared memory segment size is $shmmaxMB MB"
echo "  Max shared memory allowed is $shmallMB MB"

# Figure out the max shared memory segment size (shmmax) we want
# Use 75% of available memory but not more than 2GB
shmmaxNew=$(($totalMem * 3/4))
if (( shmmaxNew > 2147483648 ))
then
  shmmaxNew=2147483648
fi
shmmaxNewMB=$(($shmmaxNew / 1048576))

# Figure out the max shared memory allowed (shmall) we want
# The Darwin (OSX) default is 4MB, way too small
# The Linux default is 2097152 or 8GB, so we should never need this
# but things will certainly break if it's been reset too small
# so ensure it's at least big enough to hold a fullsize shared memory segment
shmallNew=$(($shmmaxNew / 4096))
if (( shmallNew < shmall ))
then
  shmallNew=$shmall
fi
shmallNewMB=$(($shmallNew / 256))

# Increase shmmax if appropriate
if (( shmmaxNew > shmmax ))
then
  rvm_log "Increasing max shared memory segment size to $shmmaxNewMB MB"
  case "${system}" in
    Darwin)
      __rvm_try_sudo sysctl -w kern.sysv.shmmax=$shmmaxNew
      ;;
    Linux)
      __rvm_try_sudo bash -c "echo $shmmaxNew > /proc/sys/kernel/shmmax"
      ;;
    SunOS)
      echo "[[Warning]] shmmax must be set manually on SunOS"
      ;;
  esac
else
  rvm_log "No need to increase max shared memory segment size"
fi

# Increase shmall if appropriate
if (( shmallNew > shmall ))
then
  rvm_log "Increasing max shared memory allowed to $shmallNewMB MB"
  case "${system}" in
    Darwin)
      __rvm_try_sudo sysctl -w kern.sysv.shmall=$shmallNew
      ;;
    Linux)
      __rvm_try_sudo bash -c "echo $shmallNew > /proc/sys/kernel/shmall"
      ;;
    SunOS)
      echo "[[Warning]]shmall must be set manually on SunOS"
      ;;
  esac
else
  rvm_log "No need to increase max shared memory allowed"
fi

# At this point, shared memory settings contain the values we want,
# put them in sysctl.conf so they are preserved.
if [[ ! -f /etc/sysctl.conf ]] || (( $(__rvm_grep -sc "kern.*.shm" /etc/sysctl.conf) == 0 ))
then
  case "$system" in
    Linux)
      echo "# kernel.shm* settings added by MagLev installation" > /tmp/sysctl.conf.$$
      echo "kernel.shmmax=$(\command \cat /proc/sys/kernel/shmmax)" >> /tmp/sysctl.conf.$$
      echo "kernel.shmall=$(\command \cat /proc/sys/kernel/shmall)" >> /tmp/sysctl.conf.$$
      ;;
    Darwin)
      # On Mac OS X Leopard, you must have all five settings in sysctl.conf
      # before they will take effect.
      echo "# kern.sysv.shm* settings added by MagLev installation" > /tmp/sysctl.conf.$$
      sysctl kern.sysv.shmmax kern.sysv.shmall kern.sysv.shmmin kern.sysv.shmmni \
        kern.sysv.shmseg  | \command \tr ":" "=" | \command \tr -d " " >> /tmp/sysctl.conf.$$
      ;;
    SunOS)
      # Do nothing in SunOS since /etc/sysctl.conf is ignored on Solaris 10.
      # Must configure shared memory settings manually.
      ;;
    *)
      rvm_error "Can't determine operating system. Check script."
      exit 1
      ;;
  esac

  # Do nothing on SunOS since /etc/sysctl.conf is ignored on Solaris 10.
  if [[ "$system" != "SunOS" ]]
  then
    rvm_log "Adding the following section to /etc/sysctl.conf"
    \command \cat /tmp/sysctl.conf.$$
    __rvm_try_sudo bash -c "\command \cat /tmp/sysctl.conf.$$ >> /etc/sysctl.conf"
    /bin/\command \rm -f /tmp/sysctl.conf.$$
  fi
else
  rvm_log "The following shared memory settings already exist in /etc/sysctl.conf"
  echo "To change them, remove the following lines from /etc/sysctl.conf and rerun this script"
  __rvm_grep "kern.*.shm" /etc/sysctl.conf
fi

# Now setup for NetLDI in case we ever need it.
rvm_log "Setting up GemStone netldi service port"
if (( $(__rvm_grep -sc "^gs64ldi" /etc/services) == 0 ))
then
  echo '[[Info]] Adding "gs64ldi  50378/tcp" to /etc/services'
  __rvm_try_sudo bash -c 'echo "gs64ldi         50378/tcp        # Gemstone netldi"  >> /etc/services'
else
  rvm_log "GemStone netldi service port is already set in /etc/services"
  echo "To change it, remove the following line from /etc/services and rerun this script"
  __rvm_grep "^gs64ldi" /etc/services
fi
scripts/env000077500000000113147511530550006754 0ustar00#!/usr/bin/env bash

source "$rvm_scripts_path/base"

__rvm_env_print "$@"
scripts/tools000077500000012611147511530550007332 0ustar00#!/usr/bin/env bash

source "$rvm_scripts_path/base"
source "$rvm_scripts_path/functions/tools"

usage()
{
  echo "Usage: rvm tools {identifier,path-identifier,strings,user}" 1>&2
  return 1
}

# Return the identifier that's current in use.
tools_identifier()
{
  __rvm_env_string
}

tools_path_identifier()
{
  if [[ -z "$1" || ! -d "$1" ]]; then
    echo "Usage: rvm tools path-identifier 'path-to-check'"
    return 1
  fi

  __rvm_cd "$1"
  __rvm_do_with_env_before
  rvm_promptless=1 __rvm_project_rvmrc >/dev/null 2>&1
  rvmrc_result="$?"
  __rvm_env_string
  __rvm_do_with_env_after
  return $rvmrc_result
}

tools_user_usage()
{
  \typeset msg

  for msg in "$@"
  do
    rvm_error "$msg"
  done

  rvm_error "Usage: rvm user [[gemsets] [rubies] [hooks] [pkgs] [wrappers] [all] [--skel]|none]"
}

tools_user_setup_path()
{
  tools_user_setup "$1" "rvm_$2_path" "\${HOME}/.rvm/$2"
}

tools_user_setup()
( # subprocess cause we change the HOME
  \typeset _target _var_name _user_value
  _target="$1"
  _var_name="$2"
  _user_value="$3"

  # detect _var_name in config
  if [[ -f "${_target}/.rvmrc" ]] && __rvm_grep "^export ${_var_name}=" "${_target}/.rvmrc" > /dev/null
  then
    # if defined read path
    _user_value="$( __rvm_grep "^export ${_var_name}=" "${_target}/.rvmrc" | __rvm_sed "s/^export ${_var_name}=//" )"
  else
    # if not defined - define it
    echo "export ${_var_name}=\"${_user_value}\"" >> "${_target}/.rvmrc"
  fi

  # set home to _target, so --skel works fine
  HOME="${_target}"
  # resolve the stored path
  eval "_user_value=\"${_user_value}\""

  # ensure the defined path exists
  [[ -d "${_user_value}" ]] || mkdir -p "${_user_value}"

  # create empty db files for rvm_user_value
  if [[ "$_var_name" == "rvm_user_path" ]]
  then
    \typeset _file
    for _file in db md5 rvmrcs sha512
    do
      [[ -f "${_user_value}/${_file}" ]] || touch "${_user_value}/${_file}"
    done
  fi
)

tools_user_none()
{
  __rvm_sed_i "$1" -E -e "/^(export )?rvm_[a-z_]+_path=/ d" -e "/^(export )?rvm_create_flag=/ d"
}

tools_user()
{
  \typeset item dir target
  \typeset -a selection
  selection=()

  for item in $@
  do
    case "$item" in
      all)     selection+=( gemsets rubies hooks pkgs wrappers userdb log ) ;;
      gemsets) selection+=( gemsets userdb log ) ;;
      --skel)  rvm_skel_flag=1 ;;
      rubies|hooks|pkgs|userdb|log|wrappers)  selection+=( "$item" ) ;;
      (none)
        tools_user_none "${HOME}/.rvmrc"
        return $?
        ;;
      *)
        tools_user_usage "Unrecognized option '$item'."
        return 1
        ;;
    esac
  done

  if (( ${#selection[@]} == 0 ))
  then
    tools_user_usage
    return 1
  fi

  if [[ ${rvm_skel_flag:-0} == 1 ]] && (( UID ))
  then
    tools_user_usage "The --skel flag should be run as root: rvmsudo rvm user $@."
    return 1
  fi

  [[ ${rvm_skel_flag:-0} == 1 ]] && target=/etc/skel || target="${HOME}"

  if [[ ! -w "${target}" ]] || [[ -d "${target}/.rvm" && ! -w "${target}/.rvm" ]]
  then
    tools_user_usage "Directory '${target}' or '${target}/.rvm' is not writable for current user."
    return 1
  fi

  if [[ -f "${target}/.rvmrc" && ! -w "${target}/.rvmrc" ]]
  then
    tools_user_usage "Configuration file '${target}/.rvmrc' is not writable for current user."
    return 1
  fi

  for item in "${selection[@]}"
  do
    case "$item" in
      rubies)
        for dir in archives bin environments gems gems_cache log repos rubies rubygems src tmp wrappers user
        do
          tools_user_setup_path "${target}" $dir
        done
        tools_user_setup "${target}" rvm_create_flag 1
        ;;
      gemsets)
        for dir in environments gems gems_cache wrappers
        do
          tools_user_setup_path "${target}" $dir
        done
        tools_user_setup "${target}" rvm_create_flag 1
        ;;
      wrappers|hooks|pkgs|log)
        tools_user_setup_path "${target}" "$item"
        ;;
      userdb)
        tools_user_setup_path "${target}" user
        ;;
    esac
  done
}

tools_mirror()
{
  \typeset file="$rvm_user_path/db"
  if
    [[ -f "$file" ]] &&
    __rvm_grep "^ruby_url=" "$file" >/dev/null
  then
    if
     (( ${rvm_force_flag:-0} == 1 ))
    then
      __rvm_sed_i "${file}" -e "s/^ruby_${n}_url=.*$/ruby_${n}_url=https:\/\/www.mirrorservice.org\/sites\/ftp.ruby-lang.org\/pub\/ruby\/${n}/"
    else
      rvm_warn "Some settings already exist, use 'rvm --force tools mirror' to overwrite."
    fi
  else
    printf "ruby_url=https://www.mirrorservice.org/sites/ftp.ruby-lang.org/pub/ruby\n" >> "$file"
  fi
}

tools_rvm_env()
{
  \typeset script
  rvm_log "# use shebang: #!/usr/bin/$1-rvm-env 1.9.3"
  for script in $@
  do
    if builtin command -v ${script} >/dev/null
    then
      __rvm_sudo ln -nfs $rvm_bin_path/rvm-shell /usr/bin/${script}-rvm-env &&
        rvm_log "Created link '/usr/bin/${script}-rvm-env'." ||
        rvm_error "Cannot create link '/usr/bin/${script}-rvm-env'."
    else
      rvm_error "There is no command/script '${script}' in system."
    fi
  done
}

args=($*)
action="${args[0]}"
args="$(echo ${args[@]:1})" # Strip trailing / leading / extra spacing.

[[ -z "$action" ]] && usage

case "$action" in
  identifier)      tools_identifier ;;
  path-identifier) tools_path_identifier "$args" ;;
  strings)         tools_strings "$args" ;;
  mirror)          tools_mirror ;;
  user)            __rvm_call_with_restored_umask tools_user "$args" ;;
  rvm-env)         tools_rvm_env $args ;;
  *)               usage ;;
esac
scripts/irbrc000077500000000626147511530550007276 0ustar00
# This loads some niceties for irb, courtesy of rvm.
# It also loads your custom ~/.irbrc if it exists.
# If you want to customize the irbrc for ONLY this version of
# ruby then edit this file. It will only be deleted if you do
# an "rvm install" over this ruby version.

if ENV["rvm_path"].nil?
  require File.join(ENV["HOME"], "irbrc")
else
  require File.join(ENV["rvm_path"], "scripts", "irbrc")
end

scripts/cron000077500000002574147511530550007142 0ustar00#!/usr/bin/env bash

source "$rvm_scripts_path/base"

# Add rvm variables on the beginning of crontab
__rvm_cron_setup()
{
  {
    echo "#sm start rvm"
    __rvm_env_print --cron
    echo "#sm end rvm"
    __sm.cron.show | __sm.filter.remove.group "^#sm start rvm$" "^#sm end rvm$"
  } | crontab -
}

__rvm_cron_remove()
{
  __sm.cron.show | __sm.filter.remove.group "^#sm start rvm$" "^#sm end rvm$" | crontab -
}

__rvm_cron_command()
{
  \typeset v schedule
  schedule="$1"
  shift || {
    rvm_error "Schedule not given, example: rvm cron command \"@daily\" rake calculate:stats"
    rvm_info  "Refer to \`man 5 crontab\` for format of the scheduling definition."
    exit 1
  }
  [[ -n "$1" ]] || {
    rvm_error "Command not given, example: rvm cron command \"@daily\" rake calculate:stats"
    exit 2
  }
  {
    __sm.cron.show
    printf "%b" "${schedule} $(__rvm_which rvm) in \"$PWD\" do"
    for v in "$@"
    do printf "%b" " \"$v\""
    done
    printf "\n"
  } | crontab -
}

__sm.cron.show()
{
  EDITOR="\command \cat" crontab -e 2>/dev/null
}

__sm.filter.remove.group()
{
  __rvm_awk 'BEGIN{in_group=0} /'"$1"'/ {in_group=1} in_group==0 {print} /'"$2"'/ {in_group=0}'
}

action="${1:-}"
shift

case "$action" in
  setup|remove|command)
    __rvm_cron_$action "$@"
    ;;
  help)
    rvm_help cron
    ;;
  *)
    rvm_error_help "Unknown subcommand '$action'" cron
    exit 1
    ;;
esac
scripts/monitor000077500000005356147511530550007671 0ustar00#!/usr/bin/env bash

original_ruby_strings=$rvm_ruby_strings
original_ruby_string=$rvm_ruby_string

source "$rvm_scripts_path/base"

rvm_monitor_sleep="${rvm_monitor_sleep:-2}"

array_length()
{
  eval "echo \${#$1[*]}"
}

array_push()
{
  array=$1
  shift
  eval "$array+=( \"\$@\" )"
}

timestamp()
{
  __rvm_statf "%Y" "%m" $1
}

push_if_timestamp_changed()
{
  \typeset file file_timestamp time

  file=$1
  file_timestamp=$(timestamp "$file")

  eval "time=\$${framework}_timestamp"

  if [[ "$file_timestamp" -gt $time ]]
  then
    array_push "changed_${framework}_files" $file
  fi
}

update_timestamp()
{
  if [[ -d "${1}/" ]]
  then
    \command \touch "$rvm_path/${$}_${1}_timestamp"
    eval "${1}_timestamp=\$(timestamp \"$rvm_path/${$}_${1}_timestamp\")"
  fi
}

rvm_warn "rvm monitor is deprecated, take a look on autotest, guard, watchr or ruby-inotify"

update_timestamp "test"
update_timestamp "spec"

while : ; do
  changed_test_files=() ; changed_spec_files=() ; changed_code_files=()

  for file in lib/**/*.rb lib/*.rb app/**/*.rb app/*.rb ; do
    if [[ -f "$file" ]] ; then push_if_timestamp_changed $file "code" ; fi
  done

  for framework in test spec ; do

    if [[ -d "$framework/" ]] ; then

      for file in ${framework}/**/*_${framework}.rb ${framework}/*_${framework}.rb ; do
        if [[ -f "$file" ]] ; then
          push_if_timestamp_changed $file $framework
        fi
      done

      if [[ "$(array_length "changed_${framework}_files")" -gt 0 ]] ; then
        rvm_ruby_strings=$original_ruby_strings
        rvm_ruby_string=$original_ruby_string
        if [[ "spec" == "$framework" ]] ; then
          rvm_action="spec"
          rvm_ruby_args="spec/spec_helper.rb ${changed_spec_files[*]}"
          "$rvm_scripts_path/set" $rvm_action $rvm_ruby_args
        elif [[ "test" == "$framework" ]] ; then
          rvm_action="ruby"
          rvm_ruby_args=" -r$(echo "${changed_test_files[*]}" | __rvm_sed 's/ / -r/g') test/test_helper.rb"
          "$rvm_scripts_path/set" $rvm_action $rvm_ruby_args
        fi
        update=1
      fi

      if [[ "$(array_length "changed_code_files")" -gt 0 ]] ; then
        rvm_ruby_strings=$original_ruby_strings
        rvm_ruby_string=$original_ruby_string
        if [[ "spec" == "$framework" ]] ; then
          rvm_action="spec"
          rvm_ruby_args="spec/"
          "$rvm_scripts_path/set" $rvm_action $rvm_ruby_args
        elif [[ "test" == "$framework" ]] ; then
          rvm_action="rake"
          rvm_ruby_args="test"
          "$rvm_scripts_path/set" "$rvm_action" $rvm_ruby_args
        fi
        update=1
      fi
    fi

    if [[ "$update" -eq 1 ]] ; then
      update_timestamp $framework
    fi
  done

  unset update changed_test_files changed_spec_files

  sleep $rvm_monitor_sleep
done
scripts/fix-permissions000077500000003611147511530550011331 0ustar00#!/usr/bin/env bash

__rvm_if_sudo()
{
  \typeset -a __command
  __command=()
  (( UID == 0 )) || __command+=( \command \sudo -p "%p password required for '$*': " )
  __command+=( $@ )
  "${__command[@]}" || return $?
}

__rvm_fix_permissions_fix_rights()
{
  case "${__user}" in
    (*:*)
      rvm_log "Fixing rights with 'g+w' - this might take a few long minutes..."
      __rvm_if_sudo chmod -R g+w "${rvm_path}" || return $?
      ;;
  esac
}

__rvm_fix_permissions_fix_directories()
{
  \typeset -a __broken_dirs
  \typeset __broken_dir

  while
    __rvm_read_lines __broken_dirs <(
      find "${rvm_path}" -type d -not -perm -111 2>/dev/null || true
    ) &&
    (( ${#__broken_dirs[@]} ))
  do
    for __broken_dir in "${__broken_dirs[@]}"
    do chmod +x "${__broken_dir}" || return $?
    done
  done
}

__rvm_fix_permissions_fix_message()
{
  \typeset __type
  case "${__user}" in
    (:*)  __type="group"      ;;
    (*:*) __type="user/group" ;;
    (*)   __type="user"       ;;
  esac
  rvm_log "Fixing ${__type} for ${__user} - this might take a few long minutes..."
}

__rvm_fix_permissions_fix()
{
  __rvm_fix_permissions_fix_message
  __rvm_if_sudo chown -R "${__user}" "${rvm_path}" &&
  __rvm_fix_permissions_fix_rights &&
  rvm_log "Finished fixing." ||
  {
    \typeset __result=$?
    rvm_error "Failed fixing, read the above messages."
    return ${__result}
  }
}

__rvm_fix_permissions_select()
{
  case "${__user}" in
    ("")
      if (( ${rvm_user_install_flag:=0} == 0 ))
      then __user="system"
      else __user="user"
      fi
      ;;
  esac
  case "${__user}" in
    (system)
      __user=":${rvm_group_name:-rvm}"
      ;;
    (user)
      __user="$USER"
      ;;
  esac
}

__rvm_fix_permissions()
{
  \typeset __user="${1:-}"
  __rvm_fix_permissions_select &&
  __rvm_fix_permissions_fix    &&
  __rvm_fix_permissions_fix_directories ||
  return $?
}

__rvm_fix_permissions "${args[@]}"
scripts/cleanup000077500000006667147511530550007637 0ustar00#!/usr/bin/env bash

rvm_base_except="selector"
source "$rvm_scripts_path/base"

chmod_unless_link()
{
  if [[ -e "$1" && ! -L "$1" ]]
  then chmod -R u+w "$1" || return $?
  fi
}

remove_or_log()
{
  rvm_verbose_log " - removing - $1"
  chmod_unless_link "$1" &&
  __rvm_rm_rf "$1" ||
  {
    : $(( failed_counter+=1 ))
    rvm_error " - failed removing $1 - please check ownership and permissions"
  }
}

empty_or_log()
{
  rvm_verbose_log " - emptying - $1"
  chmod_unless_link "$1" &&
  echo "" > "$1" ||
  {
    : $(( failed_counter+=1 ))
    rvm_error " - failed emptying $1 - please check ownership and permissions"
  }
}

cleanup_single()
{
  \typeset current_path entry
  current_path="${rvm_path}/${1}"

  if
    [[ -n "$current_path" && -d "$current_path" && "$current_path" != "/" ]]
  then
    for entry in "$current_path"/*
    do
      case $entry in
        (*\*) continue ;; # skip empty dirs
      esac
      remove_or_log "$entry"
    done
  fi
}

cleanup_checksums()
{
  empty_or_log "${rvm_user_path:-${rvm_path}/user}/md5"
  empty_or_log "${rvm_user_path:-${rvm_path}/user}/sha512"
}

cleanup_gemsets()
{
  \typeset current_path ruby_path

  for current_path in "${rvm_path}"/gems/*
  do
    case "${current_path##*/}" in
      (\*)    continue ;; # skip no gemsets
      (cache) continue ;; # skip cache dir
    esac
    ruby_path="${current_path%@*}"
    ruby_path="${ruby_path//\/gems\///rubies/}"
    [[ -d "${ruby_path}" ]] ||
      remove_or_log "$current_path"
  done
  \typeset __found __search_path_gems __search_path_rubies gemset_name __need_a_cleanup=0
  for __found in "$rvm_path"/environments/*  "$rvm_path"/wrappers/*
  do
    gemset_name="${__found##*/}"
    __search_path_gems="$rvm_path/gems/${gemset_name}"
    __search_path_rubies="$rvm_path/rubies/${gemset_name}"
    if
      [[ -e "$__found" &&
        "$gemset_name" != default &&
        ! -e "$__search_path_gems" &&
        ! -e "$__search_path_rubies"
      ]]
    then
      remove_or_log "$__found"
    fi
  done
  (( __need_a_cleanup )) ||
  for __found in "$rvm_path"/gems/*
  do
    gemset_name="${__found##*/}"
    gemset_name="${gemset_name%@*}"
    __search_path_rubies="$rvm_path/rubies/${gemset_name}"
    if
      [[ -e "$__found" &&
        "$gemset_name" != cache &&
        ! -e "$__search_path_rubies"
      ]]
    then
      remove_or_log "$__found"
    fi
  done
}

cleanup_links()
{
  \typeset current_link
  \typeset -a all_links

  __rvm_read_lines all_links <(
    __rvm_find "${rvm_path}"/{environments,wrappers,gems,bin} -type l
  )
  for current_link in "${all_links[@]}"
  do
    if
      [[ -L "${current_link}" && ! -s "${current_link}" ]]
    then
      remove_or_log "${current_link}"
    fi
  done
}

cleanup()
{
  while (( $# ))
  do
    rvm_log "Cleaning up rvm $1"
    case "$1" in
      (archives)
        cleanup_checksums
        cleanup_single $1
        ;;
      (checksums|gemsets|links)
        cleanup_$1
        ;;
      (logs)
        cleanup_single log
        ;;
      (sources)
        cleanup_single src
        ;;
      (*)
        cleanup_single $1
        ;;
    esac
    shift
  done
}

failed_counter=0
case "$1" in
  archives|checksums|repos|sources|tmp|gemsets|logs|links)
    cleanup "$1"
    ;;
  all)
    cleanup archives repos src log tmp gemsets links
    ;;
  help)
    rvm_help cleanup
    ;;
  *)
    rvm_help cleanup
    exit 1
    ;;
esac

if (( failed_counter ))
then rvm_warn "Cleanup failed for $failed_counter"
else rvm_log "Cleanup done."
fi
scripts/disk-usage000077500000003775147511530550010241 0ustar00#!/usr/bin/env bash

rvm_base_except="selector"
source "$rvm_scripts_path/base"

disk_usage()
{
  \typeset directory name _pre
  name="$1"
  directory="$2"
  shift 2
  printf "%${length}s" "${name} Usage: "
  if [[ -n "$directory" && -d "$directory" && "$directory" != "/" ]]
  then
    # echo needed to clean spaces (different systems displays this differently)
    _pre="$( echo $( du -hs "$@" "${directory}/" ) )"
    echo ${_pre%% *}
  else
    echo "0B"
  fi
  return 0
}

all_disk_usage()
{
  \typeset name
  export length=30
  for name in archives repos sources logs pkg \
    rubies gemsets wrappers temporary others total
  do
    ${name}_disk_usage
  done
}

archives_disk_usage()  { disk_usage "Downloaded Archives"   "archives"; }
docs_disk_usage()      { disk_usage "Documentation"         "docs";     }
repos_disk_usage()     { disk_usage "Repositories"          "repos";    }
sources_disk_usage()   { disk_usage "Extracted Source Code" "src";      }
logs_disk_usage()      { disk_usage "Log Files"             "log";      }
pkg_disk_usage()       { disk_usage "Packages"              "usr";      }
rubies_disk_usage()    { disk_usage "Rubies"                "rubies";   }
gemsets_disk_usage()   { disk_usage "Gemsets"               "gems";     }
wrappers_disk_usage()  { disk_usage "Wrappers"              "wrappers"; }
temporary_disk_usage() { disk_usage "Temporary Files"       "tmp";      }
total_disk_usage()     { disk_usage "Total Disk"            ".";        }
others_disk_usage()
{
  \typeset flag filter
  \typeset -a flags

  if du --exclude=* . 2>/dev/null 1>/dev/null
  then flag="--exclude="
  else flag="-I "
  fi

  for filter in archives docs repos src log usr rubies gems wrappers tmp
  do flags+=( ${flag}${filter} )
  done

  disk_usage "Other Files" "." "${flags[@]}"
}

case "${1:-help}" in
  all|total|archives|docs|repos|sources|logs|pkg|rubies|gemsets|wrappers|tmp|others)
    (
      export length=""
      __rvm_cd $rvm_path
      $1_disk_usage
    )
    ;;
  help|*)
    rvm_help disk-usage
    ;;
esac
scripts/functions/detect/system000066400000015416147511530550013001 0ustar00#!/usr/bin/env bash

source "$rvm_scripts_path/functions/detect/system_version/codename"

__rvm_detect_system()
{
  unset  _system_type _system_name _system_version _system_arch
  export _system_type _system_name _system_version _system_arch

  _system_info="$(command uname -a)"
  _system_type="unknown"
  _system_name="unknown"
  _system_name_lowercase="unknown"
  _system_version="unknown"
  _system_arch="$(command uname -m)"

  case "$(command uname)" in
    (Linux|GNU*)
      source "$rvm_scripts_path/functions/detect/system_name/lsb_release"
      source "$rvm_scripts_path/functions/detect/system_name/os_release"

      _system_type="Linux"

      if [[ -f /etc/lsb-release ]] && __rvm_detect_system_from_lsb_release
      then
        :
      elif
        [[ -f /etc/os-release ]] && __rvm_detect_system_from_os_release
      then
        :
      elif
        [[ -f /etc/altlinux-release ]]
      then
        _system_name="Arch"
        _system_version="libc-$(ldd --version  | \command \awk 'NR==1 {print $NF}' | \command \awk -F. '{print $1"."$2}' | head -n 1)"
      elif
        [[ -f /etc/SuSE-release ]]
      then
        _system_name="SuSE"
        _system_version="$( \command \awk -F'=' '{gsub(/ /,"")} $1~/VERSION/ {version=$2} $1~/PATCHLEVEL/ {patch=$2} END {print version"."patch}' < /etc/SuSE-release )"
      elif
       [[ -f /etc/devuan_version ]]
      then
        _system_name="Devuan"
        _system_version="$(\command \cat /etc/devuan_version | \command \awk -F. '{print $1}' | head -n 1)"
        _system_arch="$( dpkg --print-architecture )"
      elif
        [[ -f /etc/sabayon-release ]]
      then
        # needs to be before gentoo
        _system_name="Sabayon"
        _system_version="$(\command \cat /etc/sabayon-release | \command \awk 'NR==1 {print $NF}' | \command \awk -F. '{print $1"."$2}' | head -n 1)"
      elif
        [[ -f /etc/gentoo-release ]]
      then
        _system_name="Gentoo"
        _system_version="base-$(\command \cat /etc/gentoo-release | \command \awk 'NR==1 {print $NF}' | \command \awk -F. '{print $1"."$2}' | head -n 1)"
      elif
        [[ -f /etc/arch-release ]]
      then
        _system_name="Arch"
        _system_version="libc-$(ldd --version  | \command \awk 'NR==1 {print $NF}' | \command \awk -F. '{print $1"."$2}' | head -n 1)"
      elif
        [[ -f /etc/fedora-release ]]
      then
        _system_name="Fedora"
        _system_version="$(GREP_OPTIONS="" \command \grep -Eo '[0-9]+' /etc/fedora-release | head -n 1)"
      elif
        [[ -f /etc/oracle-release ]]
      then
        _system_name="Oracle"
        _system_version="$(GREP_OPTIONS="" \command \grep -Eo '[0-9\.]+' /etc/oracle-release  | \command \awk -F. '{print $1}' | head -n 1)"
      elif
        [[ -f /etc/redhat-release ]]
      then
        _system_name="$( GREP_OPTIONS="" \command \grep -Eo 'CentOS|PCLinuxOS|ClearOS|Mageia|Scientific|ROSA Desktop|OpenMandriva' /etc/redhat-release 2>/dev/null | \command \head -n 1 | \command \sed "s/ //" )"
        _system_name="${_system_name:-CentOS}"
        _system_version="$(GREP_OPTIONS="" \command \grep -Eo '[0-9\.]+' /etc/redhat-release  | \command \awk -F. 'NR==1{print $1}' | head -n 1)"
        _system_arch="$( uname -m )"
      elif
        [[ -f /etc/centos-release ]]
      then
        _system_name="CentOS"
        _system_version="$(GREP_OPTIONS="" \command \grep -Eo '[0-9\.]+' /etc/centos-release  | \command \awk -F. '{print $1}' | head -n 1)"
      elif
        [[ -f /etc/debian_version ]]
      then
        _system_name="Debian"
        _system_version="$(\command \cat /etc/debian_version | \command \awk -F. '{print $1}' | head -n 1)"
        _system_arch="$( dpkg --print-architecture )"
        __rvm_detect_debian_major_version_from_codename
      elif
        [[ -f /proc/devices ]] &&
        GREP_OPTIONS="" \command \grep -Eo "synobios" /proc/devices >/dev/null
      then
        _system_type="BSD"
        _system_name="Synology"
        _system_version="libc-$(ldd --version  | \command \awk 'NR==1 {print $NF}' | \command \awk -F. '{print $1"."$2}' | head -n 1)"
      elif
        [[ "$(command uname -o)" == "Android" ]]
      then
        _system_name="Termux"
        _system_version="$(command uname -r)"
      else
        _system_version="libc-$(ldd --version  | \command \awk 'NR==1 {print $NF}' | \command \awk -F. '{print $1"."$2}' | head -n 1)"
      fi
      ;;

    (SunOS)
      _system_type="SunOS"
      _system_name="Solaris"
      _system_version="$(command uname -v)"
      _system_arch="$(command isainfo -k)"

      if
        [[ "${_system_version}" == joyent* ]]
      then
        _system_name="SmartOS"
        _system_version="${_system_version#* }"
      elif
        [[ "${_system_version}" == omnios* ]]
      then
        _system_name="OmniOS"
        _system_version="${_system_version#* }"
      elif
        [[ "${_system_version}" == oi* || "${_system_version}" == illumos* ]]
      then
        _system_name="OpenIndiana"
        _system_version="${_system_version#* }"
      elif
        [[ "${_system_version}" == Generic* ]]
      then
        _system_version="10"
      elif
        [[ "${_system_version}" == *11* ]]
      then
        _system_version="11"
      # is else needed here?
      fi
      ;;

    (FreeBSD)
      _system_type="BSD"
      _system_name="FreeBSD"
      _system_version="$(command uname -r)"
      _system_version="${_system_version%%-*}"
      ;;

    (OpenBSD)
      _system_type="BSD"
      _system_name="OpenBSD"
      _system_version="$(command uname -r)"
      ;;

    (DragonFly)
      _system_type="BSD"
      _system_name="DragonFly"
      _system_version="$(command uname -r)"
      _system_version="${_system_version%%-*}"
      ;;

    (NetBSD)
      _system_type="BSD"
      _system_name="NetBSD"
      _system_version_full="$(command uname -r)"
      _system_version="$(echo ${_system_version_full} | \command \awk -F. '{print $1"."$2}')"
      ;;

    (Darwin)
      _system_type="Darwin"
      _system_name="OSX"
      _system_version="$(sw_vers -productVersion | \command \awk -F. '{print $1"."$2}')"
      ;;

    (CYGWIN*)
      _system_type="Windows"
      _system_name="Cygwin"
      ;;

    (MINGW*)
      _system_type="Windows"
      _system_name="Mingw"
      ;;

    (*)
      return 1
      ;;
  esac

  _system_type="${_system_type//[ \/]/_}"
  _system_name="${_system_name//[ \/]/_}"
  _system_name_lowercase="$(echo ${_system_name} | \command \tr '[A-Z]' '[a-z]')"
  _system_version="${_system_version//[ \/]/_}"
  _system_arch="${_system_arch//[ \/]/_}"
  _system_arch="${_system_arch/amd64/x86_64}"
  _system_arch="${_system_arch/i[123456789]86/i386}"
}

__rvm_detect_system_override()
{
  \typeset _var
  for _var in system_type system_name system_name_lowercase system_version system_arch
  do __rvm_db ${_var} _${_var}
  done
}

__rvm_detect_system
__rvm_detect_system_override
scripts/functions/detect/xcode000066400000001664147511530550012557 0ustar00#!/usr/bin/env bash

__rvm_detect_xcode_version()
{
  \typeset version_file
  for version_file in \
    /Applications/Xcode.app/Contents/version.plist \
    /Developer/Applications/Xcode.app/Contents/version.plist
  do
    if
      [[ -f $version_file ]]
    then
      if
        [[ -x /usr/libexec/PlistBuddy ]]
      then
        /usr/libexec/PlistBuddy -c "Print CFBundleShortVersionString" $version_file
      else
        __rvm_sed -n '/<key>CFBundleShortVersionString<\/key>/{n; s/^.*>\(.*\)<.*$/\1/; p;}' < $version_file
      fi
      return 0
    fi
  done

  if
    builtin command -v xcodebuild >/dev/null
  then
    xcodebuild -version | __rvm_sed -n '/Xcode/ {s/Xcode //; p;}'
    return 0
  fi
  return 1
}

__rvm_detect_xcode_version_at_least()
{
  \typeset __xcode_version="$(__rvm_detect_xcode_version)"
  [[ -n "$__xcode_version" ]] || return 0
  __rvm_version_compare "$__xcode_version" -ge "$1" || return $?
  true # for OSX
}
scripts/functions/detect/system_name/os_release000066400000002777147511530550016130 0ustar00#!/usr/bin/env bash

__rvm_detect_system_from_os_release()
{
  local __system_name="$( awk -F'=' '$1=="ID"{print $2}' /etc/os-release | head -n 1 | tr '[A-Z]' '[a-z]' | tr -d \" )"

  case $__system_name in
    amzn*)
      _system_name="Amazon"
      _system_version="$( awk -F'=' '$1=="VERSION_ID"{gsub(/"/,"");print $2}' /etc/os-release | head -n 1 )"
      _system_arch="$( uname -m )"
      ;;

    opensuse*)
      _system_name="OpenSuSE"
      _system_version="$( awk -F'=' '$1=="VERSION_ID"{gsub(/"/,"");print $2}' /etc/os-release | head -n 1 )"
      _system_arch="$( uname -m )"
      ;;

    pclinuxos*)
      _system_name="PCLinuxOS"
      _system_version="$(GREP_OPTIONS="" \command \grep -Eo '[0-9\.]+' /etc/redhat-release  | \command \awk -F. '{print $1}' | head -n 1)"
      _system_arch="$( uname -m )"
      ;;

    void*)
      _system_name="Void"
      _system_version="$(\command \lsb_release -a | \command awk -F: '/Release/{gsub(" |\t",""); print $2}')"
      _system_arch="$( uname -m )"
      ;;

    debian*)
      _system_name="Debian"
      _system_version="$(awk -F'=' '$1=="VERSION_ID"{gsub(/"/,"");print $2}' /etc/os-release | \command \awk -F. '{print $1}' | head -n 1)"
      _system_arch="$( dpkg --print-architecture )"

      if
        [ -z "$_system_version" ]
      then
        _system_version="$(\command \cat /etc/debian_version | \command \awk -F. '{print $1}' | head -n 1)"
      fi

      __rvm_detect_debian_major_version_from_codename
      ;;

    *)
      return 1
  esac

  return 0
}
scripts/functions/detect/system_name/lsb_release000066400000001507147511530550016255 0ustar00#!/usr/bin/env bash

__rvm_detect_system_from_lsb_release()
{
  local __system_name="$( awk -F'=' '$1=="DISTRIB_ID"{print $2}' /etc/lsb-release | head -n 1 | tr '[A-Z]' '[a-z]' | tr -d \" )"

  case $__system_name in
    deepin*)        _system_name="Deepin";;
    elementary*)    _system_name="Elementary";;
    kali*)          _system_name="Kali";;
    linuxmint*)     _system_name="Mint";;
    manjarolinux*)  _system_name="Manjaro";;
    neon*)          _system_name="Ubuntu";;
    solus*)         _system_name="Solus";;
    trisquel*)      _system_name="Trisquel";;
    ubuntu*)        _system_name="Ubuntu";;
    zorin*)         _system_name="Ubuntu";;
    *)              return 1
  esac

  _system_version="$( awk -F'=' '$1=="DISTRIB_RELEASE"{print $2}' /etc/lsb-release | head -n 1 )"
  _system_arch="$( uname -m )"

  return 0
}
scripts/functions/detect/system_version/codename000066400000001036147511530560016313 0ustar00#!/usr/bin/env bash

__rvm_detect_debian_major_version_from_codename()
{
  case $_system_version in
    buster*)  _system_version="10";;
    stretch*) _system_version="9";;
    jessie*)  _system_version="8";;
    wheezy*)  _system_version="7";;
    squeeze*) _system_version="6";;
    lenny*)   _system_version="5";;
    etch*)    _system_version="4";;
    sarge*)   _system_version="3";;
    woody*)   _system_version="3";;
    potato*)  _system_version="2";;
    slink*)   _system_version="2";;
    hamm*)    _system_version="2";;
  esac
}
scripts/functions/implode000066400000004647147511530560011643 0ustar00#!/usr/bin/env bash

# Remove binaries.
__rvm_implode_binaries()
{
  # Load inside a subshell to avoid polutting the current shells env.
  (
    source "$rvm_scripts_path/base"

    rvm_log "Removing rvm-shipped binaries (rvm-prompt, rvm, rvm-sudo rvm-shell and rvm-auto-ruby)"
    for entry in "$rvm_bin_path/"{rvm-prompt,rvm,rvmsudo,rvm-shell,rvm-auto-ruby} ; do
      __rvm_rm_rf "$entry"
    done

    rvm_log "Removing rvm wrappers in $rvm_bin_path"
    __rvm_find "$rvm_bin_path" -type l | while read symlinked_rvm_file; do
      if [[ "$(__rvm_readlink "$symlinked_rvm_file")" == "$rvm_wrappers_path/"* ]]; then
        __rvm_rm_rf "$symlinked_rvm_file"
      fi
    done
    unset symlinked_rvm_file
  )
}

# Implode removes the entire rvm installation under $rvm_path, including removing wrappers.
__rvm_implode()
{
  if
    [[ ${rvm_force_flag:-0} -gt 0 ]] ||
    __rvm_ask_for "Are you SURE you wish for rvm to implode?\nThis will recursively remove $rvm_path and other rvm traces?" yes
  then
    if
      [[ "/" == "$rvm_path" ]]
    then
      rvm_error "remove '/' ?!... Ni!"
      return 1
    elif
      [[ -d "$rvm_path" ]]
    then
      __rvm_implode_binaries
      rvm_log "Hai! Removing $rvm_path"
      for file in /etc/profile.d/rvm.sh $rvm_man_path/man1/rvm.1* $rvm_path/
      do
        __rvm_rm_rf $file || rvm_error "Could not remove '$file', please try removing it manually."
      done

      if
        [[ -e $rvm_path ]]
      then
        rvm_warn "Failed to completely remove $rvm_path -- You will have to do so manually."
      else
        rvm_log "$rvm_path has been removed."
      fi

      if
        [[ "$rvm_path" == "/usr/local/rvm"* && -f "/usr/local/lib/rvm" ]]
      then
        rvm_log "Removing the rvm loader at /usr/local/lib/rvm"
        __rvm_rm_rf /usr/local/lib/rvm
      fi
      rvm_warn "
Note you may need to manually remove /etc/rvmrc and ~/.rvmrc if they exist still.
Please check all .bashrc .bash_profile .profile and .zshrc for RVM source lines and delete or comment out if this was a Per-User installation.
Also make sure to remove \`${rvm_group_name:-rvm}\` group if this was a system installation.
Finally it might help to relogin / restart if you want to have fresh environment (like for installing RVM again).
"
    else
      rvm_log "It appears that $rvm_path is already non existant."
    fi
  else
    rvm_log "Psychologist intervened, cancelling implosion, crisis avoided :)"
    return 2
  fi
}
scripts/functions/environment000066400000025523147511530560012552 0ustar00#!/usr/bin/env bash

__rvm_env_string()
{
  \typeset _string
  _string="${GEM_HOME:-}"
  _string="${_string##*/}"
  printf "%b" "${_string:-system}\n"
}

__rvm_expand_ruby_string()
{
  \typeset string current_ruby

  string="$1"

  case "${string:-all}" in

    all)
      __rvm_list_strings | \command \tr ' ' "\n"
      ;;

    all-gemsets)
      __rvm_list_gemset_strings
      ;;

    default-with-rvmrc|rvmrc)
      "$rvm_scripts_path/tools" path-identifier "$PWD"
      ;;

    all-rubies|rubies)
      __rvm_list_strings
      ;;

    current-ruby|gemsets)
      current_ruby="$(__rvm_env_string)"
      current_ruby="${current_ruby%@*}"

      rvm_silence_logging=1 "$rvm_scripts_path/gemsets" list strings \
        | __rvm_sed "s/ (default)//; s/^/$current_ruby${rvm_gemset_separator:-@}/ ; s/@default// ;"
      ;;

    current)
      __rvm_env_string
      ;;

    aliases)
      __rvm_awk -F= '{print $string}' < "$rvm_path/config/alias"
      ;;

    *)
      __rvm_ruby_strings_exist $( echo "$string" | \command \tr "," "\n" | __rvm_strip )
      ;;

  esac
}

__rvm_become()
{
  # set rvm_rvmrc_flag=0 to not create .rvmrc in random places of code
  \typeset string rvm_rvmrc_flag
  string="$1"
  rvm_rvmrc_flag=0

  [[ -n "$string" ]] && {
    rvm_ruby_string="$string"
    rvm_gemset_name=""
  }

  __rvm_use >/dev/null || return $?

  rvm_ruby_string="${rvm_ruby_string}${rvm_gemset_name:+${rvm_gemset_separator:-'@'}}${rvm_gemset_name:-}"

  return 0
}

__rvm_ensure_has_environment_files()
{
  \typeset file_name variable value environment_id __path __gem_home

  __gem_home="${rvm_ruby_gem_home}"
  file_name="${__gem_home}/environment"
  __path=""
  if [[ "${__gem_home##*@}" != "global" ]]
  then __path+="${__gem_home}/bin:"
  fi
  __path+="${rvm_ruby_global_gems_path}/bin:${rvm_ruby_home}/bin"


  \command \rm -f "$file_name"
  \command \mkdir -p "${__gem_home}/wrappers" "${rvm_environments_path}" "${rvm_wrappers_path}"

  printf "%b" "export PATH=\"${__path}:\$PATH\"\n" > "$file_name"

  for variable in GEM_HOME GEM_PATH MY_RUBY_HOME IRBRC MAGLEV_HOME RBXOPT RUBY_VERSION
  do
    eval "value=\${${variable}:-""}"
    if [[ -n "$value" ]]
    then printf "export %b='%b'\n" "${variable}" "${value}" >> "$file_name"
    else printf "unset %b\n"       "${variable}"            >> "$file_name"
    fi
  done

  environment_id="${__gem_home##*/}"
  [[ -L "${rvm_environments_path}/${environment_id}" ]] ||
  {
    if [[ -f "${rvm_environments_path}/${environment_id}" ]]
    then rm -rf "${rvm_environments_path}/${environment_id}"
    fi
    ln -nfs "${__gem_home}/environment" "${rvm_environments_path}/${environment_id}"
  }

  ln -nfs "${__gem_home}/wrappers" "$rvm_wrappers_path/${environment_id}"

  return 0
}

# Runs a command in a given env.
__rvm_with()
(
  unset rvm_rvmrc_flag
  export rvm_create_flag=1
  export rvm_delete_flag=0
  export rvm_internal_use_flag=1
  export rvm_use_flag=0
  __rvm_use "$1" || return $?
  shift
  "$@" || return $?
)

__variables_definition()
{
  \typeset -a __variables_list __array_list
  \typeset __method

  __method="$1"

  # NOTE: Removing rvm_bin_path here causes system wide installations to generate
  # a corrupt PATH, breaking the RVM installation.
  __variables_list=(
    rvm_head_flag rvm_ruby_selected_flag rvm_user_install_flag rvm_path_flag rvm_cron_flag
    rvm_static_flag rvm_default_flag rvm_loaded_flag rvm_llvm_flag rvm_skip_autoreconf_flag rvm_dynamic_extensions_flag
    rvm_18_flag rvm_19_flag rvm_20_flag rvm_21_flag
    rvm_force_autoconf_flag rvm_dump_environment_flag rvm_curl_flags rvm_rubygems_version
    rvm_verbose_flag rvm_debug_flag rvm_trace_flag __array_start rvm_skip_pristine_flag
    rvm_create_flag rvm_remove_flag rvm_movable_flag rvm_archive_flag
    rvm_gemdir_flag rvm_reload_flag rvm_auto_reload_flag rvm_disable_binary_flag
    rvm_ignore_gemsets_flag rvm_skip_gemsets_flag rvm_install_on_use_flag rvm_remote_flag
    rvm_verify_downloads_flag rvm_skip_openssl_flag rvm_gems_cache_path rvm_gems_path
    rvm_man_path rvm_ruby_gem_path rvm_ruby_log_path rvm_gems_cache_path rvm_archives_path
    rvm_docs_path rvm_environments_path rvm_examples_path rvm_gems_path rvm_gemsets_path
    rvm_help_path rvm_hooks_path rvm_lib_path rvm_log_path rvm_patches_path rvm_repos_path
    rvm_rubies_path rvm_scripts_path rvm_src_path rvm_tmp_path rvm_user_path rvm_usr_path
    rvm_wrappers_path rvm_stored_errexit rvm_ruby_strings rvm_ruby_binary
    rvm_ruby_gem_home rvm_ruby_home rvm_ruby_interpreter rvm_ruby_irbrc rvm_ruby_major_version
    rvm_ruby_minor_version rvm_ruby_package_name rvm_ruby_patch_level rvm_ruby_release_version
    rvm_ruby_repo_url rvm_ruby_repo_branch rvm_ruby_revision rvm_ruby_tag rvm_ruby_sha rvm_ruby_repo_tag
    rvm_ruby_version rvm_ruby_package_file rvm_ruby_name rvm_ruby_name rvm_ruby_args
    rvm_ruby_user_tag rvm_ruby_patch detected_rvm_ruby_name __rvm_env_loaded next_token
    rvm_error_message rvm_gemset_name rvm_parse_break rvm_token rvm_action rvm_export_args
    rvm_gemset_separator rvm_expanding_aliases rvm_tar_command rvm_tar_options
    rvm_patch_original_pwd rvm_project_rvmrc rvm_archive_extension rvm_autoinstall_bundler_flag
    rvm_codesign_identity rvm_expected_gemset_name
    rvm_without_gems rvm_with_gems rvm_with_default_gems
    rvm_ignore_dotfiles_flag rvm_fuzzy_flag rvm_autolibs_flag
    rvm_autolibs_flag_number rvm_autolibs_flag_runner rvm_quiet_curl_flag rvm_max_time_flag
    rvm_error_clr   rvm_warn_clr   rvm_debug_clr   rvm_notify_clr   rvm_code_clr    rvm_comment_clr     rvm_reset_clr
    rvm_error_color rvm_warn_color rvm_debug_color rvm_notify_color rvm_code_color  rvm_comment_color   rvm_reset_color
    rvm_log_timestamp rvm_log_filesystem rvm_log_namelen rvm_show_log_lines_on_error
  )

  __array_list=(
    rvm_patch_names rvm_ree_options rvm_autoconf_flags rvm_architectures
  )

  case "${__method}" in
    (export) true ;;
    (unset)  unset "${__array_list[@]}" || true ;;
    (*)
      rvm_error "Unknown action given to __variables_definition: ${__method}"
      return 1
      ;;
  esac

  ${__method} "${__variables_list[@]}" || true

  # prevent errors with bash "set -a", see https://github.com/rvm/rvm/issues/2872
  if [[ -n "${BASH_VERSION:-}" ]]
  then export -fn __rvm_select_version_variables __rvm_ruby_string_parse_ __rvm_rm_rf_verbose __rvm_parse_args __rvm_ruby_string_find __rvm_file_load_env __rvm_remove_without_gems 2>/dev/null || true
  fi
}

# Set shell options that RVM needs temporarily, these are reverted by __rvm_teardown.
# see the top of ./scripts/initialize for settings that are needed all the time.
# Setup must be always called after initialize, otherwise it does nothing ... except exporting.
__rvm_setup()
{
  __variables_definition export

  # Setup only on first load.
  if (( __rvm_env_loaded != 1 ))
  then return 0
  fi

  if
    [[ -n "${BASH_VERSION:-}" ]] && ! __function_on_stack cd pushd popd
  then
    export rvm_shell_nounset

    if __rvm_has_opt "nounset"
    then rvm_bash_nounset=1
    else rvm_bash_nounset=0
    fi

    set +o nounset
    _rvm_old_traps=$( trap | __rvm_grep -E 'EXIT|HUP|INT|QUIT|TERM' || true )
    trap '__rvm_teardown_final ; set +x' EXIT HUP INT QUIT TERM
  fi

  if [[ -n "${ZSH_VERSION:-}" ]]
  then
    export rvm_zsh_clobber rvm_zsh_nomatch
    # Set clobber for zsh users, for compatibility with bash's append operator ( >> file ) behavior
    if setopt | __rvm_grep -s '^noclobber$' >/dev/null 2>&1
    then rvm_zsh_clobber=0
    else rvm_zsh_clobber=1
    fi
    setopt clobber
    # Set no_nomatch so globs that don't match any files don't print out a warning
    if setopt | __rvm_grep -s '^nonomatch$' >/dev/null 2>&1
    then rvm_zsh_nomatch=0
    else rvm_zsh_nomatch=1
    fi
    setopt no_nomatch
  fi
}

__rvm_teardown()
{
  if builtin command -v __rvm_cleanup_tmp >/dev/null 2>&1
  then __rvm_cleanup_tmp
  fi

  export __rvm_env_loaded
  # if __rvm_env_loaded is not set - detect it via rvm_tmp_path
  : __rvm_env_loaded:${__rvm_env_loaded:=${rvm_tmp_path:+1}}:
  # if not loaded then fallback to 0
  : __rvm_env_loaded:${__rvm_env_loaded:=0}:
  # decrease load count counter
  : __rvm_env_loaded:$(( __rvm_env_loaded-=1 )):

  # skip teardown when already done or when not yet finished
  if [[ -z "${rvm_tmp_path:-}" ]] || (( __rvm_env_loaded > 0 ))
  then return 0
  fi

  if
    [[ -n "${BASH_VERSION:-}" ]]
  then
    trap - EXIT HUP INT QUIT TERM # Clear all traps, we do not want to go into an loop.
    if
      [[ -n "${_rvm_old_traps:-}" ]]
    then
      eval "${_rvm_old_traps}"
    fi

    (( rvm_bash_nounset == 1 )) && set -o nounset
    unset rvm_bash_nounset
  fi

  if
    [[ -n "${ZSH_VERSION:-""}" ]]
  then
    # If rvm_zsh_clobber is 0 then "setopt" contained "noclobber" before rvm performed "setopt clobber".
    (( rvm_zsh_clobber == 0 )) && setopt noclobber
    # If rvm_zsh_nomatch is 0 then "setopt" contained "nonomatch" before rvm performed "setopt nonomatch".
    (( rvm_zsh_nomatch == 0 )) || setopt nomatch

    unset rvm_zsh_clobber rvm_zsh_nomatch
  fi

  if
    [[ -n "${rvm_stored_umask:-}" ]]
  then
    umask ${rvm_stored_umask}
    unset rvm_stored_umask
  fi

  if builtin command -v __rvm_cleanup_download >/dev/null 2>&1
  then __rvm_cleanup_download
  fi

  if [[ "${rvm_stored_errexit:-""}" == "1" ]]
  then set -e
  fi

  __variables_definition unset

  unset _system_arch _system_name _system_type _system_version

  return 0
}

__rvm_teardown_if_broken()
{
  if
    __function_on_stack __rvm_load_project_config ||
    __function_on_stack __rvm_with
  then
    true # inside of loading .rvmrc / __rvm_with
  elif
    (( ${__rvm_env_loaded:-0} > 0 ))
  then
    __rvm_teardown_final
  fi
}

__rvm_teardown_final()
{
  __rvm_env_loaded=1
  unset __rvm_project_rvmrc_lock
  __rvm_teardown
}

__rvm_do_with_env_before()
{
  if [[ -n "${rvm_scripts_path:-}" || -n "${rvm_path:-}" ]]
  then
    # Load env - setup all required variables, __rvm_teardown is called on the end
    source "${rvm_scripts_path:-"$rvm_path/scripts"}/initialize"
    __rvm_setup
  fi
}

__rvm_do_with_env_after()
{
  __rvm_teardown
}

__rvm_do_with_env()
{
  \typeset result

  __rvm_do_with_env_before

  "$@"
  result=$?

  __rvm_do_with_env_after

  return ${result:-0}
}

__rvm_conditionally_do_with_env()
{
  if (( __rvm_env_loaded > 0 ))
  then
    "$@"
  else
    __rvm_do_with_env "$@"
  fi
}

__rvm_ensure_is_a_function()
{
  if [[ ${rvm_reload_flag:=0} == 1 ]] || ! is_a_function rvm
  then
    for script in functions/version functions/selector cd functions/cli cli override_gem
    do
      if [[ -f "$rvm_scripts_path/$script" ]]
      then
        source "$rvm_scripts_path/$script"
      else
        printf "%b" \
"WARNING:
        Could not source '$rvm_scripts_path/$script' as file does not exist.
        RVM will likely not work as expected.\n"
      fi
    done
  fi
}

__rvm_call_with_restored_umask()
{
  rvm_umask="$(umask)"

  if [[ -n "${rvm_stored_umask:-}" ]];
  then
    umask ${rvm_stored_umask}
  fi

  "$@"

  umask "${rvm_umask}"
  unset rvm_umask
}
scripts/functions/utility_rubygems000066400000002664147511530560013627 0ustar00#!/usr/bin/env bash

rubygems_detect_ruby_lib_gem_path_from()
{
  ruby_lib_gem_path="$( __rvm_ruby_config_get ${1}prefix "$ruby_path" )" || ruby_lib_gem_path=""
  [[ -z "${ruby_lib_gem_path:-}" ]] ||
  {
    ruby_lib_gem_path="$( __rvm_ruby_config_get ${1}dir  "$ruby_path" )" || ruby_lib_gem_path=""
    ruby_lib_gem_path="${ruby_lib_gem_path%/*}"
  }
  [[ -n "${ruby_lib_gem_path:-}"    ]] || return 1
  [[ -d "${ruby_lib_gem_path}/gems" ]] || return 2
}

rubygems_detect_ruby_lib_gem_path_fallback()
{
  rubygems_detect_ruby_lib_gem_path_from "rubylib" ||
  rubygems_detect_ruby_lib_gem_path_from "lib"     ||
  return $?

  ruby_lib_gem_path+="/gems"

  \typeset ruby_version
  ruby_version="$( __rvm_ruby_config_get ruby_version "$ruby_path")" || ruby_version=""
  if
    [[ -n "${ruby_version:-}" && -d "${ruby_lib_gem_path}/${ruby_version:-}" ]]
  then
    ruby_lib_gem_path+="$ruby_version"
  elif
    [[ -d "${ruby_lib_gem_path}/shared" ]]
  then
    ruby_lib_gem_path+="shared"
  else
    return 3
  fi
}

rubygems_detect_ruby_lib_gem_path()
{
  \typeset ruby_path
  ruby_path="$( __rvm_which "${1:-ruby}" )" ||
  {
    rvm_error "Missing 'ruby' in 'rubygems_detect_ruby_lib_gem_path'."
    return 1
  }

  ruby_lib_gem_path="$(
    unset GEM_HOME GEM_PATH
    "$ruby_path" -rrubygems -e 'puts Gem.default_dir' 2>/dev/null
  )" || ruby_lib_gem_path=""

  [[ -n "$ruby_lib_gem_path" ]] ||
  rubygems_detect_ruby_lib_gem_path_fallback ||
  return $?
}
scripts/functions/build_requirements000077500000020717147511530560014113 0ustar00#!/usr/bin/env bash

source "$rvm_scripts_path/functions/build_requirements_helpers"
source "$rvm_scripts_path/functions/build_undesired_helpers"

__rvm_requirements_run()
{
  \typeset -a packages_installed packages_missing packages_to_install packages_flags
  \typeset -a packages_undesired packages_to_remove
  \typeset -a packages_custom packages_custom_after
  \typeset __type __lib_type __iterator
  __type=$1
  __lib_type=$1
  shift

  for __iterator in load reset before define summary remove before_update update custom install custom_after after
  do
    __rvm_requirements_run_${__iterator} "$@" || return $?
  done
}

__rvm_requirements_run_load()
{
  if
    is_a_function requirements_${__type}_before ||
    is_a_function requirements_${__type}_define
  then
    rvm_debug "requirements code for ${__type} already loaded"
  else
    [[ -s "$rvm_scripts_path/functions/requirements/${__type}" ]] ||
    {
      rvm_error "Requirements support for ${__type} is not implemented yet,
report a bug here => https://github.com/rvm/rvm/issues"
      return 1
    }
    source "$rvm_scripts_path/functions/requirements/${__type}"
    if
      is_a_function requirements_${__type}_before ||
      is_a_function requirements_${__type}_define
    then
      rvm_debug "requirements code for ${__type} loaded"
    else
      rvm_error "Failed loading requirements for ${__type}!"
      return 1
    fi
  fi
}

__rvm_requirements_run_reset()
{
  packages_installed=()
  packages_missing=()
  packages_to_install=()
  packages_flags=()
  packages_undesired=()
  packages_to_remove=()
  packages_custom=()
  packages_custom_after=()
}

__rvm_requirements_run_before()
{
  if is_a_function requirements_${__type}_before
  then requirements_${__type}_before "$@" || return $?
  fi
  if [[ "${__lib_type}" != "${__type}" ]]
  then rvm_debug "requirements lib type set to ${__lib_type}"
  fi
  if [[ "${__lib_type}" != "${__type}" ]] && is_a_function requirements_${__lib_type}_before
  then requirements_${__lib_type}_before "$@" || return $?
  fi
  true # for osx
}

__rvm_requirements_run_define()
{
  \typeset -a list
  \typeset element __handler
  if is_a_function requirements_${__lib_type}_define
  then __handler=requirements_${__lib_type}_define
  else __handler=requirements_${__type}_define
  fi

  list=( rvm )
  while (( $# )) && [[ -z "$1" ]]
  do shift
  done
  if (( $# ))
  then list+=( "$@" )
  else list+=( ruby )
  fi

  for element in "${list[@]}"
  do ${__handler} "${element}" || return $?
  done
  true
}

__rvm_requirements_run_summary_custom()
{
  if (( ${rvm_autolibs_flag_number} > 2 ))
  then rvm_debug "Install $1 packages: ${_list// /, }."
  fi
  rvm_requiremnts_fail_or_run_action 3 "Missing $1 packages: ${_list}" true ||
    return $?
  true
}

__rvm_requirements_run_summary()
{
  \typeset __summary_status=0

  (( ${#packages_custom[@]} == 0 )) ||
  {
    _list="${packages_custom[*]}"
    __rvm_requirements_run_summary_custom "custom" ||
      __summary_status=$?
  }
  (( ${#packages_installed[@]} == 0 )) ||
  {
    if (( ${rvm_list_installed_packages_flag:-0} == 1 ))
    then
      requirements_print_list ${packages_installed[*]}
    fi
    _list="${packages_installed[*]}"
    rvm_debug "Found required packages: ${_list// /, }."
  }
  (( ${#packages_missing[@]} == 0 )) ||
  {
    if (( ${rvm_list_missing_packages_flag:-0} == 1 ))
    then
      requirements_print_list ${packages_missing[*]}
      __summary_status=1
    else
    _list="${packages_missing[*]}"
    rvm_requiremnts_fail_or_run_action 2 \
      "Missing required packages: ${_list}" true ||
      __summary_status=$?
    fi
  }
  (( ${#packages_undesired[@]} == 0 )) ||
  {
    if (( ${rvm_list_undesired_packages_flag:-0} == 1 ))
    then
      requirements_print_list ${packages_undesired[*]}
      __summary_status=1
    else
    _list="${packages_undesired[*]}"
    rvm_requiremnts_fail_or_run_action 2 \
      "Found undesired packages: ${_list}" true ||
      __summary_status=$?
    fi
  }
  (( ${#packages_custom_after[@]} == 0 )) ||
  {
    _list="${packages_custom_after[*]}"
    __rvm_requirements_run_summary_custom "custom after" ||
      __summary_status=$?
  }
  return ${__summary_status}
}

__rvm_requirements_run_before_update()
{
  if is_a_function requirements_${__lib_type}_before_update
  then requirements_${__lib_type}_before_update "$@" || return $?
  fi
  true # for osx
}

__rvm_requirements_run_update()
{
  if
    (( ${#packages_to_install[@]} > 0 )) ||
    (( ${#packages_custom[@]}+${#packages_custom_after[@]} > 0 && ${rvm_autolibs_flag_number} > 2 ))
  then
    rvm_log "Installing requirements for ${rvm_autolibs_flag_runner}."
    if
      is_a_function requirements_${__lib_type}_update_system
    then
      rvm_requiremnts_fail_or_run_action 3 \
        "Skipping system update, make sure your system is up to date." \
        __rvm_log_command update_system "Updating system" \
        requirements_${__lib_type}_update_system "$@" || return $?
    elif
      is_a_function requirements_${__type}_update_system
    then
      rvm_requiremnts_fail_or_run_action 3 \
        "Skipping system update, make sure your system is up to date." \
        __rvm_log_command update_system "Updating system" \
        requirements_${__type}_update_system "$@" || return $?
    fi
  fi
}

__rvm_requirements_run_custom_()
{
  \typeset __package __custom
  \typeset -a __missing_custom
  __missing_custom=()
  __custom="$1"
  shift

  while
    (( $# ))
  do
    __package="$1"
    if
      is_a_function requirements_${__lib_type}_install_${__package}
    then
      rvm_requiremnts_fail_or_run_action 2 \
        "Skipping ${__package} installation, make sure ${__package} is installed." \
        __rvm_log_command install_${__custom}_${__package} \
        "Installing required ${__custom//_/ } package: ${__package}" \
        "requirements_${__lib_type}_install_${__package}" || return $?
    elif
      is_a_function requirements_install_${__package}
    then
      rvm_requiremnts_fail_or_run_action 2 \
        "Skipping ${__package} installation, make sure ${__package} is installed." \
        __rvm_log_command install_${__custom}_${__package} \
        "Installing required ${__custom//_/ } package: ${__package}" \
        "requirements_install_${__package}" || return $?
    else
      __rvm_add_once __missing_custom "${__package}"
    fi
    shift
  done

  if
    (( ${#__missing_custom[@]} ))
  then
    if
      is_a_function requirements_${__lib_type}_install_${__custom}
    then
      rvm_requiremnts_fail_or_run_action 2 \
        "Skipping ${__missing_custom[*]} installation, make sure listed software is installed." \
        __rvm_log_command install_${__custom} \
        "Installing required ${__custom//_/ } packages: ${__missing_custom[*]}" \
        "requirements_${__lib_type}_install_${__custom}" "${__missing_custom[@]}" || return $?
    else
      rvm_requiremnts_fail_always 2 "\
Can not find function 'requirements_${__lib_type}_install_${__custom}' to install missing ${__custom//_/ } packages:
   ${__missing_custom[*]}
report a bug here:
   https://github.com/rvm/rvm/issues
" || return $?
    fi
  fi
}

__rvm_requirements_run_custom()
{
  (( ${#packages_custom[@]} )) || return 0
  __rvm_requirements_run_custom_ "custom" "${packages_custom[@]}" || return $?
}

__rvm_requirements_run_install()
{
  (( ${#packages_to_install[@]} )) || return 0
  if
    is_a_function requirements_${__lib_type}_lib_install
  then
    \typeset __package
    for __package in "${packages_to_install[@]}"
    do
      __rvm_log_command package_install_${__package} "Installing required package: ${__package}" \
        "requirements_${__lib_type}_lib_install" "${__package}" ||
      {
        \typeset __status=$?
        _list="${packages_to_install[*]}"
        rvm_warn "Failed installation package: ${__package} of: ${_list// /, }."
        return ${__status}
      }
    done
  else
    _list="${packages_to_install[*]}"
    __rvm_log_command package_install_${_list// /_} "Installing required packages: ${_list// /, }" \
      "requirements_${__lib_type}_libs_install" "${packages_to_install[@]}" ||
      return $?
  fi
}

__rvm_requirements_run_custom_after()
{
  (( ${#packages_custom_after[@]} )) || return 0
  __rvm_requirements_run_custom_ "custom_after" "${packages_custom_after[@]}" || return $?
}

__rvm_requirements_run_after()
{
  if
    is_a_function requirements_${__lib_type}_after
  then
    requirements_${__lib_type}_after "$@" || return $?
  elif
    is_a_function requirements_${__type}_after
  then
    requirements_${__type}_after "$@" || return $?
  fi
  true # for osx
}
scripts/functions/rvmrc_set000066400000013745147511530560012215 0ustar00#!/usr/bin/env bash

__rvm_set_versions_conf()
{
  \typeset gemset identifier

  if [[ -s .versions.conf ]]
  then
    \command \mv .versions.conf .versions.conf.$(__rvm_date +%m.%d.%Y-%H:%M:%S)
    rvm_warn ".version.conf is not empty, moving aside to preserve."
  fi

  identifier=$(__rvm_env_string)
  gemset=${identifier#*@}
  identifier=${identifier%@*}

  printf "%b" "ruby=$identifier
" >> .versions.conf
  if [[ -n "$gemset" && "$gemset" != "$identifier" ]]
  then
    printf "%b" "ruby-gemset=$gemset
" >> .versions.conf
  else
    printf "%b" "#ruby-gemset=my-projectit
" >> .versions.conf
  fi
  printf "%b" "#ruby-gem-install=bundler rake
#ruby-bundle-install=true
" >> .versions.conf
}

__rvm_set_ruby_version()
{
  if
    [[ -s .ruby-version ]]
  then
    \command \mv .ruby-version .ruby-version.$(__rvm_date +%m.%d.%Y-%H:%M:%S)
    rvm_warn ".ruby-version is not empty, moving aside to preserve."
  fi
  \typeset __version="$(__rvm_env_string)"
  case "${__version}" in
    (*@*)
      if
        [[ -s .ruby-gemset ]]
      then
        \command \mv .ruby-gemset .ruby-gemset.$(__rvm_date +%m.%d.%Y-%H:%M:%S)
        rvm_warn ".ruby-gemset is not empty, moving aside to preserve."
      fi
      echo "${__version##*@}" > .ruby-gemset
      ;;
    (*)
      if
        [[ -s .ruby-gemset ]]
      then
        \command \mv .ruby-gemset .ruby-gemset.$(__rvm_date +%m.%d.%Y-%H:%M:%S)
        rvm_warn ".ruby-gemset not needed, moving aside to preserve."
      fi
      ;;
  esac
  echo "${__version%@*}" > .ruby-version
}

__rvm_set_rvmrc()
{
  \typeset flags identifier short_identifier gem_file
  true ${rvm_verbose_flag:=0}

  if [[ "$HOME" != "$PWD" && "${rvm_prefix:-}" != "$PWD" ]]
  then
    if (( rvm_verbose_flag ))
    then flags="use "
    fi

    if [[ -s .rvmrc ]]
    then
      \command \mv .rvmrc .rvmrc.$(__rvm_date +%m.%d.%Y-%H:%M:%S)
      rvm_warn ".rvmrc is not empty, moving aside to preserve."
    fi

    identifier=$(__rvm_env_string)
    short_identifier="${identifier#ruby-}"
    short_identifier="${short_identifier%%-*}"

    printf "%b" "#!/usr/bin/env bash

# This is an RVM Project .rvmrc file, used to automatically load the ruby
# development environment upon cd'ing into the directory

# First we specify our desired <ruby>[@<gemset>], the @gemset name is optional,
# Only full ruby name is supported here, for short names use:
#     echo \"rvm use ${short_identifier}\" > .rvmrc
environment_id=\"$identifier\"

# Uncomment the following lines if you want to verify rvm version per project
# rvmrc_rvm_version=\"${rvm_version}\" # 1.10.1 seems like a safe start
# eval \"\$(echo \${rvm_version}.\${rvmrc_rvm_version} | awk -F. '{print \"[[ \"\$1*65536+\$2*256+\$3\" -ge \"\$4*65536+\$5*256+\$6\" ]]\"}' )\" || {
#   echo \"This .rvmrc file requires at least RVM \${rvmrc_rvm_version}, aborting loading.\"
#   exit 1
# }
" >> .rvmrc
    if __rvm_string_match "$identifier" "jruby*"
    then
      printf "%b" "
# Uncomment following line if you want options to be set only for given project.
# PROJECT_JRUBY_OPTS=( --1.9 )
# The variable PROJECT_JRUBY_OPTS requires the following to be run in shell:
#    chmod +x \${rvm_path}/hooks/after_use_jruby_opts
" >> .rvmrc
    fi
    printf "%b" "
# First we attempt to load the desired environment directly from the environment
# file. This is very fast and efficient compared to running through the entire
# CLI and selector. If you want feedback on which environment was used then
# insert the word 'use' after --create as this triggers verbose mode.
if [[ -d \"\${rvm_path:-\$HOME/.rvm}/environments\"
  && -s \"\${rvm_path:-\$HOME/.rvm}/environments/\$environment_id\" ]]
then
  \\. \"\${rvm_path:-\$HOME/.rvm}/environments/\$environment_id\"
  for __hook in \"\${rvm_path:-\$HOME/.rvm}/hooks/after_use\"*
  do
    if [[ -f \"\${__hook}\" && -x \"\${__hook}\" && -s \"\${__hook}\" ]]
    then \\. \"\${__hook}\" || true
    fi
  done
  unset __hook
" >> .rvmrc
    if [[ " $flags " == *" use "* ]]
    then printf "%b" "  if (( \${rvm_use_flag:=1} >= 1 )) # display automatically"    >> .rvmrc
    else printf "%b" "  if (( \${rvm_use_flag:=1} >= 2 )) # display only when forced" >> .rvmrc
    fi
    printf "%b" "
  then
    if [[ \$- == *i* ]] # check for interactive shells
    then printf \"%b\" \"Using: \$(tput setaf 2 2>/dev/null)\$GEM_HOME\$(tput sgr0 2>/dev/null)\\\\n\" # show the user the ruby and gemset they are using in green
    else printf \"%b\" \"Using: \$GEM_HOME\\\\n\" # don't use colors in non-interactive shells
    fi
  fi
" >> .rvmrc
    printf "%b" "else
  # If the environment file has not yet been created, use the RVM CLI to select.
  rvm --create $flags \"\$environment_id\" || {
    echo \"Failed to create RVM environment '\${environment_id}'.\"
    return 1
  }
fi
" >> .rvmrc
    for gem_file in *.gems
    do
      case "$gem_file" in
        (\*.gems) continue ;;
      esac
      printf "%b" "
# If you use an RVM gemset file to install a list of gems (*.gems), you can have
# it be automatically loaded. Uncomment the following and adjust the filename if
# necessary.
#
# filename=\".gems\"
# if [[ -s \"\$filename\" ]]
# then
#   rvm gemset import \"\$filename\" | GREP_OPTIONS=\"\" \\\\command \\grep -v already | GREP_OPTIONS=\"\" \command \grep -v listed | GREP_OPTIONS=\"\" \command \grep -v complete | \command \sed '/^$/d'
# fi
" >> .rvmrc
    done
    if [[ -s Gemfile ]]
    then
      printf "%b" "
# If you use bundler, this might be useful to you:
# if [[ -s Gemfile ]] && {
#   ! builtin command -v bundle >/dev/null ||
#   builtin command -v bundle | GREP_OPTIONS=\"\" \\\\command \\grep \$rvm_path/bin/bundle >/dev/null
# }
# then
#   printf \"%b\" \"The rubygem 'bundler' is not installed. Installing it now.\\\\n\"
#   gem install bundler
# fi
# if [[ -s Gemfile ]] && builtin command -v bundle >/dev/null
# then
#   bundle install | GREP_OPTIONS=\"\" \\\\command \\grep -vE '^Using|Your bundle is complete'
# fi
" >> .rvmrc
    fi
  else
    rvm_error ".rvmrc cannot be set in your home directory.\
      \nThe home .rvmrc is for global rvm settings only."
  fi
}
scripts/functions/gemset000066400000032634147511530560011473 0ustar00#!/usr/bin/env bash

__rvm_current_gemset()
{
  # Fetch the current gemset via GEM_HOME
  \typeset current_gemset
  current_gemset="${GEM_HOME:-}"

  # We only care about the stuff to the right of the separator.
  current_gemset="${current_gemset##*${rvm_gemset_separator:-@}}"

  if [[ "${current_gemset}" == "${GEM_HOME:-}" ]] ; then
    echo ''
  else
    echo "${current_gemset}"
  fi
}

__rvm_using_gemset_globalcache()
{
  __rvm_db_ "$rvm_user_path/db" "use_gemset_globalcache" |
    __rvm_grep '^true$' >/dev/null 2>&1
  return $?
}

__rvm_remove_broken_symlinks()
{
  if [[ ! -e "$1" && -L "$1" ]]
  then __rvm_rm_rf "$1"
  fi
}

gemset_create()
{
  \typeset gem_home gemset gemsets prefix

  [[ -n "$rvm_ruby_string" ]] || __rvm_select

  prefix="${rvm_ruby_gem_home%%${rvm_gemset_separator:-"@"}*}"

  for gemset in "$@"
  do
    if
      [[ -z "$rvm_ruby_string" || "$rvm_ruby_string" == "system" ]]
    then
      rvm_error "Can not create gemset when using system ruby.  Try 'rvm use <some ruby>' first."
      return 1
    elif
      [[ "$gemset" == *"${rvm_gemset_separator:-"@"}"* ]]
    then
      rvm_error "Can not create gemset '$gemset', it contains a \"${rvm_gemset_separator:-"@"}\"."
      return 2
    elif
      [[ "$gemset" == *"${rvm_gemset_separator:-"@"}" ]]
    then
      rvm_error "Can not create gemset '$gemset', Missing name. "
      return 3
    fi

    gem_home="${prefix}${gemset:+${rvm_gemset_separator:-"@"}}${gemset}"
    __rvm_remove_broken_symlinks "$gem_home"
    [[ -d "$gem_home/bin" ]] || mkdir -p "$gem_home/bin"
    if
      [[ ! -d "$gem_home/bin" ]]
    then
      rvm_error "Can not create gemset '$gemset', permissions problem? "
      return 4
    fi

    : rvm_gems_cache_path:${rvm_gems_cache_path:=${rvm_gems_path:-"$rvm_path/gems"}/cache}
    # When the globalcache is enabled, we need to ensure we setup the cache directory correctly.
    if
      __rvm_using_gemset_globalcache
    then
      if [[ -d "$gem_home/cache" && ! -L "$gem_home/cache" ]]
      then \command \mv -n "$gem_home/cache"/*.gem "$rvm_gems_cache_path/" 2>/dev/null
      fi
      __rvm_rm_rf "$gem_home/cache"
      ln -fs "$rvm_gems_cache_path" "$gem_home/cache"
    else
      __rvm_remove_broken_symlinks "$gem_home/cache"
      mkdir -p "$gem_home/cache"
    fi

    rvm_log "$rvm_ruby_string - #gemset created $gem_home"
    if
      (( ${rvm_skip_gemsets_flag:-0} == 0 ))
    then
      __rvm_with "${rvm_ruby_string}${gemset:+@}${gemset}" gemset_initial ${gemset:-default}
    fi
  done

  if
    (( ${rvm_skip_gemsets_flag:-0} != 0 ))
  then
    rvm_log "Skipped importing default gemsets"
  fi
}

__rvm_parse_gems_args()
{
  \typeset gem="${*%%;*}"
  if
    __rvm_string_match "$gem" "*.gem$"
  then
    gem_name="$(basename "${gem/.gem/}" |  __rvm_awk -F'-' '{$NF=NULL;print}')"
    gem_version="$(basename "${gem/.gem/}" |  __rvm_awk -F'-' '{print $NF}' )"
  else
    gem_name="${gem/ */}"
    case "$gem" in
      *--version*)
        gem_version=$(
          echo "$gem" | __rvm_sed -e 's#.*--version[=]*[ ]*##' | __rvm_awk '{print $1}'
        )
        ;;
      *-v*)
        gem_version=$(
          echo "$gem" | __rvm_sed -e 's#.*-v[=]*[ ]*##' | __rvm_awk '{print $1}'
        )
        ;;
    esac
  fi
}

is_gem_installed()
{
  \typeset gem_spec
  gem_spec="gem '$gem_name'"
  if
    [[ -n "${gem_version}" ]]
  then
    gem_spec+=", '$gem_version'"
    version_check="${gem_version#*=}"
  else
    version_check="*([[:digit:]\.])"
  fi

  __rvm_ls -ld "${rvm_ruby_gem_home:-$GEM_HOME}/gems"/${gem_name}-${version_check} >/dev/null 2>&1 ||
  "${rvm_ruby_binary}" -rrubygems -e "$gem_spec" 2>/dev/null ||
  return $?
}

# Install a gem
gem_install()
{
  \typeset gem_name gem_version version_check

  gem_version="" # no version
  __rvm_parse_gems_args "$@"

  if [[ -z "${gem_version}" ]]
  then __rvm_db "gem_${gem_name}_version" "gem_version"
  fi

  if
    (( ${rvm_force_flag:-0} == 0 )) && is_gem_installed
  then
    rvm_log "gem ${gem_name} ${gem_version:-} is already installed"
    return 0
  else
    gem_install_force || return $?
  fi
  true # for OSX
}

gem_install_force()
{
  \typeset __available_gem
  \typeset -a install_params

  install_params=()
  __available_gem="$( __rvm_ls -v1 "${rvm_path}/gem-cache"/${gem_name}-${version_check}.gem 2>/dev/null | tail -n 1 )"

  if   [[ -n "${__available_gem}" ]]
  then install_params+=( --local )
  elif [[ -n "${gem_version}" ]]
  then install_params+=( -v "${gem_version}" )
  fi

  if __rvm_version_compare "$(\command \gem --version)" -ge 2.2
  then install_params+=( --no-document )
  else install_params+=( --no-ri --no-rdoc )
  fi

  for __gem_option in ${rvm_gem_options}
  do
    case "${__gem_option}" in
      (--no-ri|--no-rdoc|--no-document)
        # skip
        ;;
      (*)
        install_params+=( "${__gem_option}" )
        ;;
    esac
  done

  __rvm_log_command \
    "gem.install.${gem_name}${gem_version:+-}${gem_version:-}" \
    "installing gem ${__available_gem:-${gem_name}} ${install_params[*]}" \
    \command \gem install "${__available_gem:-${gem_name}}" "${install_params[@]}" ||
    return $?
}

__rvm_lines_without_comments()
{
  __rvm_remove_from_array lines "#*|+( )" "${lines[@]}"
}

__rvm_lines_without_gems()
{
  [[ -n "${rvm_without_gems}" ]] || return 0

  \typeset -a __gems_to_remove
  __gems_to_remove=()
  __rvm_custom_separated_array __gems_to_remove " " "${rvm_without_gems}"

  (( ${#__gems_to_remove[@]} )) || return 0

  \typeset __gem
  for __gem in "${__gems_to_remove[@]}"
  do  __rvm_remove_from_array lines "${__gem}|${__gem% *} *" "${lines[@]}"
  done
}

__rvm_lines_with_gems()
{
  \typeset -a __gems_to_add
  __gems_to_add=()
  case "${1}" in
    (global)  __rvm_custom_separated_array __gems_to_add " " "${rvm_with_gems:-}"         ;;
    (default) __rvm_custom_separated_array __gems_to_add " " "${rvm_with_default_gems:-}" ;;
    (*)       return 0 ;;
  esac

  (( ${#__gems_to_add[@]} )) || return 0

  \typeset __gem __version
  for __gem in "${__gems_to_add[@]}"
  do
    __version="${__gem#*=}"
    __gem="${__gem%%=*}"
    if [[ "${__gem}" == "${__version}" ]] # no version given
    then lines+=( "${__gem}" )
    else lines+=( "${__gem} -v ${__version}" )
    fi
  done
}

gemset_import_list()
{
  case "${rvm_ruby_string}" in
    (*jruby*)
      # jruby is very slow to install gems one by one, install everything in one call
      \command \gem install "$@"
      ;;
    (*)
      \typeset line
      for line
      do gem_install $line || rvm_error "there was an error installing gem $line"
      done
      ;;
  esac
}

gemset_import()
{
  \typeset __prefix rvm_file_name
  unset -f gem

  __rvm_select

  __prefix="$1"

  if
    [[ -n "${2:-}" ]]
  then
    rvm_file_name="${2%.gems*}.gems"
  else
    \typeset -a gem_file_names
    gem_file_names=( "${rvm_gemset_name}.gems" "default.gems" "system.gems" ".gems" )
    __rvm_find_first_file rvm_file_name "${gem_file_names[@]}" ||
    {
      rvm_error "No *.gems file found."
      return 1
    }
  fi

  [[ -d "$rvm_ruby_gem_home/specifications/" ]] || mkdir -p "$rvm_ruby_gem_home/specifications/"
  [[ -d "$rvm_gems_cache_path" ]] || mkdir -p "$rvm_gems_cache_path" # Ensure the base cache dir is initialized.

  \typeset -a lines
  lines=()
  if
    [[ -s "$rvm_file_name" ]]
  then
    __rvm_read_lines lines "${rvm_file_name}"
    __rvm_lines_without_comments
  fi
  rvm_debug "lines from ${rvm_file_name}: ${lines[*]}"
  if
    [[ -n "${3:-}" ]]
  then
    __rvm_lines_without_gems
    __rvm_lines_with_gems "${3}"
    rvm_debug "recalculated lines($3): ${lines[*]}"
  fi

  if
    (( ${#lines[@]} ))
  then
    __rvm_log_command "gemsets.import${3:+.}${3:-}" \
      "${__prefix} $rvm_file_name" \
      gemset_import_list "${lines[@]}"
  else
    rvm_log "${__prefix}file $rvm_file_name evaluated to empty gem list"
  fi
}

# Loads the default gemsets for the current interpreter and gemset.
gemset_initial()
{
  \typeset gemsets gemset _iterator paths _jruby_opts

  _jruby_opts=$JRUBY_OPTS
  export JRUBY_OPTS="${JRUBY_OPTS} --dev"

  true ${rvm_gemsets_path:="$rvm_path/gemsets"}

  [[ -d "$rvm_gems_path/${rvm_ruby_string}/cache" ]] ||
    mkdir -p "$rvm_gems_path/${rvm_ruby_string}/cache" 2>/dev/null

  __rvm_ensure_has_environment_files

  paths=( $( __rvm_ruby_string_paths_under "$rvm_gemsets_path" | sort -r ) )

  for _iterator in "${paths[@]}"
  do
    if
      [[ -f "${_iterator}/$1.gems" ]]
    then
      gemset_import "$rvm_ruby_string - #importing gemset" "${_iterator}/$1.gems" "$1"
      break # stop right here
    else
      rvm_debug "$rvm_ruby_string - #gemset definition does not exist ${_iterator}/$1.gems"
    fi
  done
  
  __rvm_log_command "gemset.wrappers.$1" \
    "$rvm_ruby_string - #generating ${1} wrappers" \
    run_gem_wrappers regenerate 2>/dev/null || true

   export JRUBY_OPTS=${_jruby_opts}
}

run_gem_wrappers()
{
  gem_install gem-wrappers >/dev/null &&
  gem_wrappers_pristine &&
    gem wrappers "$@" ||
    return $?
}

gem_wrappers_pristine()
{
  if [ "$(printf '%s\n' "3.2.0" "$(gem -v)" | sort -V | head -n1)" == "3.2.0" ]
  then gem pristine gem-wrappers --only-plugins > /dev/null
  fi
}

__rvm_rubygems_create_link()
{
  \typeset ruby_lib_gem_path

  \command \mkdir -p "$rvm_ruby_gem_home/bin"

  rubygems_detect_ruby_lib_gem_path "${1:-ruby}" || return 0

  if [[ -L "$ruby_lib_gem_path" && -w "$ruby_lib_gem_path" ]]
  then rm -rf "$ruby_lib_gem_path"
  fi

  if [[ -e "$rvm_ruby_global_gems_path" && ! -L "$rvm_ruby_global_gems_path" ]]
  then rm -rf "$rvm_ruby_global_gems_path"
  fi

  [[ -d "$ruby_lib_gem_path" ]] ||
    \command \mkdir -p "$ruby_lib_gem_path"

  if
    [[ -w "$ruby_lib_gem_path" ]]
  then
    [[ -L "$rvm_ruby_global_gems_path" ]] ||
      ln -fs "$ruby_lib_gem_path" "$rvm_ruby_global_gems_path"
  else
    [[ -d "$rvm_ruby_global_gems_path" ]] ||
      \command \mkdir -p "$rvm_ruby_global_gems_path"
  fi

  \command \mkdir -p "$rvm_ruby_global_gems_path/bin"
}

__rvm_set_executable()
{
  for __file
  do [[ -x "${__file}" ]] || chmod +x "${__file}"
  done
}

__rvm_initial_gemsets_create()
{
  __rvm_initial_gemsets_setup "$1" &&
  __rvm_initial_gemsets_create_gemsets
}

__rvm_initial_gemsets_setup()
{
  __rvm_log_command "chmod.bin" \
    "$rvm_ruby_string - #making binaries executable" \
    __rvm_set_executable "$rvm_ruby_home/bin"/* &&
  __rvm_rubygems_create_link "$1" &&
  (
    rvm_ruby_binary="${1:-$rvm_ruby_home/bin/ruby}" \
      rubygems_setup ${rvm_rubygems_version:-latest}
  ) # () for exit in rubygems_fatal_error
}

__rvm_initial_gemsets_create_without_rubygems()
{
  __rvm_rubygems_create_link "$1" &&
  __rvm_initial_gemsets_create_gemsets
}

__rvm_initial_gemsets_create_gemsets()
{
  gemset_create "global" &&
  __rvm_with "${rvm_ruby_string}@global" __rvm_remove_without_gems &&
  gemset_create ""
}

__rvm_remove_without_gems()
{
  [[ -n "${rvm_without_gems}" ]] || return 0

  \typeset -a __gems_to_remove __extra_flags
  __rvm_read_lines __gems_to_remove <(
    GEM_PATH="$GEM_HOME" __rvm_list_gems "" "${rvm_without_gems}"
  )

  (( ${#__gems_to_remove[@]} )) || return 0

  __extra_flags=()
  if __rvm_version_compare "$(\command \gem --version)" -ge 2.1.0
  then __extra_flags+=( --abort-on-dependent )
  fi

  \typeset __gem __name __version
  for __gem in "${__gems_to_remove[@]}"
  do
    __name="${__gem% *}"
    __version="${__gem##* }"

    __rvm_log_command "gem.uninstall.${__name}-${__version}" \
      "$rvm_ruby_string - #uninstalling gem ${__name}-${__version}" \
      \command \gem uninstall "${__name}" -v "${__version}" -x "${__extra_flags[@]}" || true
  done
}

gemset_reset_env()
(
  export rvm_internal_use_flag=1
  export rvm_use_flag=0
  __rvm_use "${1:-}"
  __rvm_ensure_has_environment_files &&
  run_gem_wrappers regenerate ||
    return $?
)

# Transform the list of gems one version per line
__rvm_list_gems()
{
  \typeset __checks __names
  __checks="${1:-}"
  shift || true
  __names="$*"

  if [[ -n "${__names}" ]]
  then __checks="%w{${__names}}.include?(gem.name)${__checks:+" && ( ${__checks} )"}"
  fi

  if [[ -n "${__checks}" ]]
  then __checks="if ${__checks}"
  fi

  rvm_debug "gem list check: ${__checks}"

  ruby -rrubygems -e "
    Gem::Specification.each{|gem|
      puts \"#{gem.name} #{gem.version}\" ${__checks}
    }
  " 2>/dev/null ||
  gem list $@ |
    __rvm_sed '/\*\*\*/ d ; /^$/ d; s/ (/,/; s/, /,/g; s/)//;' |
    __rvm_awk -F ',' '{for(i=2;i<=NF;i++) print $1" "$i }'
}

gemset_pristine()
{
  if
    (
      unset -f gem
      builtin command -v gem > /dev/null
    )
  then
    \typeset _gem _version _platforms
    \typeset -a _failed _pristine_command
    _failed=()
    _pristine_command=( \command \gem pristine )
    if __rvm_version_compare "$(\command \gem --version)" -ge 2.2.0
    then _pristine_command+=( --extensions )
    fi
    rvm_log "Restoring gems to pristine condition..."
    while
      read _gem _version _platforms
    do
      printf "%b" "${_gem}-${_version} "
      "${_pristine_command[@]}" "${_gem}" --version "${_version}" >/dev/null ||
        _failed+=(  "${_gem} --version ${_version}" )
    done <<<"$(
      GEM_PATH="$GEM_HOME" __rvm_list_gems \
        "${pristine_gems_filter:-"! gem.executables.empty? || ! gem.extensions.empty?"}"
    )"
    if
      (( ${#_failed[@]} > 0 ))
    then
      rvm_error "\n'${_pristine_command[*]} ${_failed[*]}' failed, you need to fix these gems manually."
      return 1
    else
      rvm_log "\nfinished."
    fi
  else
    rvm_error "'gem' command not found in PATH."
    return 1
  fi
}

__rvm_gemset_pristine()
{
  __rvm_log_command "gemset.pristine-$1" "Making gemset $1 pristine" \
    __rvm_with "$1" gemset_pristine
}
scripts/functions/selector_interpreters000066400000034147147511530560014636 0ustar00#!/usr/bin/env bash

__rvm_select_rbx_nightly()
{
  (( ${rvm_nightly_flag:=0} == 1 )) || return 0

  \typeset org_rvm_ruby_patch_level _rvm_ruby_name
  if [[ "$rvm_ruby_version" == head ]]
  then rvm_ruby_version=""
  fi
  rvm_debug "searching for binary rbx ${rvm_ruby_version:-}${rvm_ruby_version:+-}${rvm_ruby_patch_level}*${rvm_ruby_name:+-}${rvm_ruby_name:-}"
  org_rvm_ruby_patch_level="$rvm_ruby_patch_level"
  _rvm_ruby_name="${rvm_ruby_name:-${detected_rvm_ruby_name:-}}"
  rvm_ruby_patch_level="$(
    __list_remote_all |
      __rvm_grep ${rvm_ruby_version:-}${rvm_ruby_version:+-}${org_rvm_ruby_patch_level}.*${_rvm_ruby_name:+-}${_rvm_ruby_name:-} |
      __rvm_tail -n 1
  )"
  [[ -n "${rvm_ruby_patch_level:-}" ]] ||
  {
    rvm_error "Could not find rbx binary '${rvm_ruby_version:-}${rvm_ruby_version:+-}${org_rvm_ruby_patch_level}*${rvm_ruby_name:+-}${rvm_ruby_name:-}' binary release."
    return 1
  }
  rvm_ruby_patch_level="${rvm_ruby_patch_level##*/}"
  rvm_ruby_patch_level="${rvm_ruby_patch_level%.tar.*}"
  if
    [[ -z "${rvm_ruby_version:-}" ]]
  then
    rvm_ruby_patch_level="${rvm_ruby_patch_level#rubinius-}"
    rvm_ruby_version="${rvm_ruby_patch_level%%-*}"
  fi
  if
    [[ -z "${rvm_ruby_name:-}" ]]
  then
    rvm_ruby_name="${rvm_ruby_patch_level##*-}"
  fi
  rvm_ruby_patch_level="${rvm_ruby_patch_level##*${org_rvm_ruby_patch_level}}"
  rvm_ruby_patch_level="${rvm_ruby_patch_level%%-*}"
  rvm_ruby_patch_level="${org_rvm_ruby_patch_level}${rvm_ruby_patch_level}"
  rvm_ruby_string="rubinius-${rvm_ruby_version}-${rvm_ruby_patch_level}-${rvm_ruby_name}"
  rvm_debug "detected rbx ${rvm_ruby_string}"
  rvm_verify_downloads_flag=1

  true # for OSX
}

__rvm_select_rbx_compatibility_branch()
{
  case "${rvm_ruby_version}" in
    (2.0pre)      rvm_ruby_repo_branch="master"              ;;
    (2.0.testing) rvm_ruby_repo_branch="${rvm_ruby_version}" ;;
  esac

  if
    [[ ${rvm_19_flag:-0} == 1 ]]
  then
    rvm_ruby_repo_branch="1.9.3"
    rvm_head_flag=1
  elif
    [[ ${rvm_18_flag:-0} == 1 ]]
  then
    rvm_ruby_repo_branch="1.8.7"
    rvm_head_flag=1
  fi

  true # for OSX
}

__rvm_select_interpreter_rbx()
{
  __rvm_select_rbx_nightly || return $?

  rvm_ruby_interpreter="rbx"

  __rvm_select_rbx_compatibility_branch

  if
    (( ${rvm_head_flag:=1} == 0 )) &&
    [[ -z "${rvm_ruby_repo_branch:-}" ]] &&
    [[ "${rvm_ruby_version}" != "head" ]]
  then
    if
      __rvm_version_compare "${rvm_ruby_version}" -ge "2.0.0"
    then
      rbx_url="$( __rvm_db "rbx_url_2.0_and_newer" )"
      rvm_archive_extension="tar.bz2"
      rvm_ruby_package_file="rubinius-${rvm_ruby_version}"
      rvm_ruby_url="${rbx_url}/${rvm_ruby_package_file}.${rvm_archive_extension}"
    else
      rbx_url=${rbx_url:-$(__rvm_db "rbx_url")}
      rvm_archive_extension="tar.gz"
      rvm_ruby_package_file="rubinius-${rvm_ruby_version}"
      rvm_ruby_url="${rbx_url}/$rvm_ruby_package_file.${rvm_archive_extension}"
    fi
  else
    rvm_ruby_repo_url=${rvm_rbx_repo_url:-$(__rvm_db "rbx_repo_url")}
    rvm_head_flag=1
    rvm_ruby_patch_level=""
    rvm_ruby_tag="${rvm_ruby_version:+v}${rvm_ruby_version:-}"
    rvm_ruby_version="head"
    rvm_disable_binary_flag=1
  fi

  if [[ -n "${rvm_rbx_opt:-}" ]]
  then export RBXOPT="${RBXOPT:=${rvm_rbx_opt}}"
  fi
  true # for OSX
}

__rvm_select_interpreter_rubinius()
{
  __rvm_select_interpreter_rbx || return $?
}

__rvm_select_macruby_nightly_selected()
{
  \typeset __string_version
  __string_version="${rvm_ruby_version//./-}"
  __string_version="${__string_version#nightly_}"

  rvm_ruby_package_name="${rvm_ruby_interpreter}_nightly-${__string_version}"
  rvm_ruby_package_file="$rvm_ruby_package_name.pkg"
}

__rvm_select_macruby_nightly_detect()
{
  \typeset __string_version
  rvm_ruby_version="$(
    __rvm_curl -s "$rvm_ruby_url" |
    __rvm_grep -oE "<a href=\"macruby_nightly-[^<]+\.pkg</a>" |
    __rvm_awk -F"[<>]" '{print $3}' |
    __rvm_version_sort |
    __rvm_tail -n 1
  )"
  [[ -n "${rvm_ruby_version}" ]] ||
  {
    rvm_error "Could not find MacRuby nightly binary."
    return 1
  }
  rvm_ruby_package_file="${rvm_ruby_version}"
  rvm_ruby_package_name="${rvm_ruby_package_file%.pkg}"

  __string_version="${rvm_ruby_package_name#macruby_nightly-}"
  __string_version="${__string_version//-/.}"

  rvm_ruby_version="nightly_${__string_version}"
  rvm_ruby_string="macruby-${rvm_ruby_version}${rvm_ruby_name:+-}${rvm_ruby_name:-}"

  true # for OSX
}

__rvm_select_macruby_nightly()
{
  __rvm_db "macruby_nightly_url" "rvm_ruby_url"

  case "${rvm_ruby_version:-}" in
    (nightly_*)
      __rvm_select_macruby_nightly_selected
      ;;
    (*)
      __rvm_select_macruby_nightly_detect
      ;;
  esac

  rvm_ruby_url+="/${rvm_ruby_package_file}"
  rvm_verify_downloads_flag=1
  rvm_debug "selected macruby $rvm_ruby_string => $rvm_ruby_url"

  true # for OSX
}

__rvm_select_interpreter_macruby()
{
  if
    [[ "Darwin" == "${_system_type}" ]]
  then
    rvm_ruby_package_name="${rvm_ruby_interpreter}-${rvm_ruby_version}"
    if
      (( ${rvm_head_flag:=0} == 1 ))
    then
      rvm_ruby_version=""
      rvm_ruby_tag=""
      rvm_ruby_revision="head"
      __rvm_db "macruby_repo_url" "rvm_ruby_repo_url"
      rvm_ruby_url="$rvm_ruby_repo_url"
      rvm_disable_binary_flag=1
    elif
      [[ "${rvm_ruby_version:-}" == *"nightly"* ]]
    then
      __rvm_select_macruby_nightly
    elif
      [[ -n "${rvm_ruby_version:-}" ]]
    then
      __rvm_db "macruby_${rvm_ruby_version}_url" "rvm_ruby_url"
      [[ -n "${rvm_ruby_url:-}" ]] || __rvm_db "macruby_url" "rvm_ruby_url"
      rvm_ruby_package_name="MacRuby%20${rvm_ruby_version}.zip"
      rvm_ruby_package_file="$rvm_ruby_package_name"
      rvm_ruby_url="$rvm_ruby_url/$rvm_ruby_package_name"
    else
      __rvm_db "macruby_version" "rvm_ruby_version"
      __rvm_db "macruby_url" "rvm_ruby_url"
      rvm_ruby_package_name="MacRuby%20${rvm_ruby_version}.zip"
      rvm_ruby_package_file="$rvm_ruby_package_name"
      rvm_ruby_url="$rvm_ruby_url/$rvm_ruby_package_name"
    fi
    rvm_ruby_patch_level=""
  else
    rvm_error "MacRuby can only be installed on a Darwin OS."
  fi
  true # for OSX
}

__rvm_select_interpreter_jruby()
{
  rvm_ruby_patch_level=""
  rvm_ruby_repo_url="${rvm_ruby_repo_url:-$(__rvm_db "jruby_repo_url")}"
  rvm_ruby_url="${rvm_ruby_repo_url:-$(__rvm_db "jruby_repo_url")}"
  if (( ${rvm_head_flag:=0} == 1 ))
  then
    (( ${rvm_remote_flag:-0} == 1 )) || rvm_disable_binary_flag=1
    rvm_ruby_version="head"
  else
    if (( ${rvm_18_flag:-0} || ${rvm_19_flag:-0} || ${rvm_20_flag:-0} || ${#rvm_patch_names[@]} ))
    then rvm_disable_binary_flag=1
    fi
    rvm_ruby_version="${rvm_ruby_version:-"$(__rvm_db "jruby_version")"}"
    rvm_ruby_tag="${rvm_ruby_tag:-${rvm_ruby_version}}"
  fi

  alias jruby_ng="jruby --ng"
  alias jruby_ng_server="jruby --ng-server"

  true # for OSX
}

__rvm_truffleruby_set_version()
{
  if (( ${rvm_head_flag:=0} == 1 ))
  then
    rvm_ruby_version="head"
    truffleruby_version="head"
  else
    rvm_ruby_version="${rvm_ruby_version:-$(__rvm_db "truffleruby_version")}"
    truffleruby_version="${rvm_ruby_version}${rvm_ruby_patch_level:+-}${rvm_ruby_patch_level:-}"
  fi

  true # for OSX
}

__rvm_truffleruby_set_rvm_ruby_url()
{
  case "${_system_type}" in
    Linux) platform="linux" ;;
    Darwin) platform="macos" ;;
    *) rvm_error "TruffleRuby does not support ${_system_type} currently." ;;
  esac

  case "${_system_arch}" in
    x86_64) arch=amd64 ;;
    *) rvm_error "TruffleRuby does not support ${_system_arch} currently." ;;
  esac

  rvm_ruby_package_name="truffleruby-${truffleruby_version}"

  if (( ${rvm_head_flag:=0} == 1 )); then
    case "$platform" in
      linux) platform="ubuntu-18.04" ;;
      macos) platform="macos-latest" ;;
    esac

    rvm_ruby_package_file="${rvm_ruby_package_name}-${platform}"
    rvm_ruby_url="${rvm_ruby_repo_url:-https://github.com/ruby/truffleruby-dev-builder/releases/latest/download/${rvm_ruby_package_file}.tar.gz}"
  else
    rvm_ruby_package_file="${rvm_ruby_package_name}-${platform}-${arch}"
    rvm_ruby_url="${rvm_ruby_repo_url:-$(__rvm_db "truffleruby_url")/vm-${truffleruby_version}/${rvm_ruby_package_file}.tar.gz}"
  fi

  true # for OSX
}

__rvm_select_interpreter_truffleruby()
{
  __rvm_truffleruby_set_version
  __rvm_truffleruby_set_rvm_ruby_url

  true # for OSX
}

__rvm_select_interpreter_maglev()
{
  rvm_ruby_patch_level=""
  maglev_url="$(__rvm_db "maglev_url")"

  system="${_system_type}"
  if [[ "$MACHTYPE" == x86_64-apple-darwin* ]]
  then arch="i386" # x86_64-apple-darwin supports both i386 and x86_64 maglev implements only i386
  else arch="${_system_arch}"
  fi

  if
    (( ${rvm_head_flag:=0} == 1 )) || [[ "$rvm_ruby_version" == "head" ]]
  then
    rvm_head_flag=1
    rvm_ruby_version="head"
    rvm_ruby_repo_url="${rvm_ruby_repo_url:-$(__rvm_db "maglev_repo_url")}"
    rvm_ruby_url="${rvm_ruby_repo_url:-$(__rvm_db "maglev_repo_url")}"
    rvm_gemstone_version=$(
      __rvm_curl -s https://raw.githubusercontent.com/MagLev/maglev/master/version.txt |
        __rvm_grep "^GEMSTONE" | cut -f2 -d-
    )
    rvm_gemstone_package_file="GemStone-${rvm_gemstone_version}.${system}-${arch}"
    rvm_disable_binary_flag=1
  else
    rvm_ruby_package_file="MagLev-${rvm_ruby_version}" # removed from 1.0: .${system}-${arch}
    rvm_ruby_version="${rvm_ruby_version:-"$(__rvm_db "maglev_version")"}"
    rvm_ruby_package_name="${rvm_ruby_interpreter}-${rvm_ruby_version}"
    rvm_ruby_url="${rvm_ruby_url:-"$maglev_url/${rvm_ruby_package_file}.${rvm_archive_extension}"}"
    rvm_gemstone_version=$(
      __rvm_curl -s https://raw.githubusercontent.com/MagLev/maglev/MagLev-${rvm_ruby_version}/version.txt |
        __rvm_grep "^GEMSTONE" | cut -f2 -d-
    )
    rvm_gemstone_package_file="GemStone-${rvm_gemstone_version}.${system}-${arch}"
  fi

  export MAGLEV_HOME="$rvm_ruby_home"
  export GEMSTONE_GLOBAL_DIR=$MAGLEV_HOME

  rvm_gemstone_url="$maglev_url/${rvm_gemstone_package_file}.${rvm_archive_extension}"

  true # for OSX
}

__rvm_select_interpreter_ironruby()
{
  rvm_ruby_patch_level=""
  if
    (( ${rvm_head_flag:=0} == 1 ))
  then
    rvm_ruby_version="head"
    rvm_ruby_package_name="${rvm_ruby_string}"
    rvm_ruby_repo_url="${rvm_ruby_repo_url:-$(__rvm_db "ironruby_repo_url")}"
    rvm_ruby_url="${rvm_ruby_repo_url:-$(__rvm_db "ironruby_repo_url")}"
    rvm_disable_binary_flag=1
  else
    rvm_archive_extension="zip"
    rvm_ruby_version=${rvm_ruby_version:-"$(__rvm_db "ironruby_version")"}
    rvm_ruby_package_name="${rvm_ruby_interpreter}-${rvm_ruby_version}"
    rvm_ruby_package_file="${rvm_ruby_interpreter}-${rvm_ruby_version}.${rvm_archive_extension}"
    rvm_ruby_url="$(__rvm_db "ironruby_${rvm_ruby_version}_url")"
  fi
  export rvm_ruby_version rvm_ruby_string rvm_ruby_package_name rvm_ruby_repo_url rvm_ruby_url rvm_archive_extension
  true # for OSX
}

__rvm_select_interpreter_ree()
{
  rvm_ruby_interpreter=ree
  rvm_ruby_version=${rvm_ruby_version:-"$(__rvm_db "ree_version")"}

  case "$rvm_ruby_version" in
    1.8.*) true ;; # all good!
    *) rvm_error "Unknown Ruby Enterprise Edition version: $rvm_ruby_version" ;;
  esac

  if [[ -n "${rvm_ruby_patch_level:-0}" ]]
  then rvm_ruby_patch_level="${rvm_ruby_patch_level#p}"
  fi

  rvm_ruby_package_file="ruby-enterprise-$rvm_ruby_version-$rvm_ruby_patch_level"
  rvm_ruby_url="$(__rvm_db "${rvm_ruby_interpreter}_${rvm_ruby_version}_${rvm_ruby_patch_level}_url")"
  rvm_ruby_url="${rvm_ruby_url:-$(__rvm_db "${rvm_ruby_interpreter}_${rvm_ruby_version}_url")}"
  rvm_ruby_url="${rvm_ruby_url}/$rvm_ruby_package_file.tar.gz"

  true # for OSX
}

__rvm_select_interpreter_common()
{
  rvm_ruby_interpreter="${1}"
  rvm_ruby_version="head"
  rvm_ruby_patch_level=""
  export rvm_head_flag=1
  rvm_ruby_repo_url="${rvm_ruby_repo_url:-$(__rvm_db "${1}_repo_url")}"
  rvm_ruby_url=$rvm_ruby_repo_url
  rvm_ruby_configure=""
  rvm_ruby_make=""
  rvm_ruby_make_install=""
}

__rvm_select_interpreter_opal()
{
  __rvm_select_interpreter_common "opal"
}

__rvm_select_interpreter_topaz()
{
  __rvm_select_interpreter_common "topaz"
}

__rvm_select_interpreter_mruby()
{
  rvm_ruby_interpreter="mruby"
  rvm_ruby_patch_level=""
  rvm_ruby_repo_url="${rvm_ruby_repo_url:-$(__rvm_db "mruby_repo_url")}"
  rvm_ruby_url=$rvm_ruby_repo_url
  rvm_ruby_configure=""
  rvm_ruby_make=""
  rvm_ruby_make_install=""
  export rvm_skip_autoreconf_flag=1
  if
    [[ -z "${rvm_ruby_version:-}" ]]
  then
    rvm_head_flag=1
  else
    rvm_head_flag=0
    rvm_archive_extension="tar.gz"
    rvm_ruby_package_file="${rvm_ruby_version}"
  fi
}

__rvm_select_interpreter_ruby()
{
  if
    [[ "${rvm_ruby_patch_level:-}" == "p0" ]] &&
    __rvm_version_compare "${rvm_ruby_version}" -ge 2.1.0 &&
    [[ ! -d "$rvm_rubies_path/$rvm_ruby_string" ]]
  then
    rvm_ruby_patch_level=""
    rvm_ruby_string="${rvm_ruby_string%-p0}"
  fi

  rvm_ruby_package_name="${rvm_ruby_interpreter}-${rvm_ruby_version}${rvm_ruby_patch_level:+-}${rvm_ruby_patch_level:-}"
  rvm_ruby_package_file="${rvm_ruby_package_name}"

  if
    [[ -z "${rvm_ruby_version:-""}" ]] &&
    (( ${rvm_head_flag:=0} == 0 ))
  then
    rvm_error "Ruby version was not specified!"
  else
    rvm_ruby_repo_url="${rvm_ruby_repo_url:-"$(__rvm_db "ruby_repo_url")"}"

    if
      (( ${rvm_head_flag:=0} == 0 ))
    then
      if __rvm_version_compare "${rvm_ruby_version}" -ge "3.0.0"
      then rvm_archive_extension="tar.gz"
      elif __rvm_version_compare "${rvm_ruby_version}" -lt "1.8.5"
      then rvm_archive_extension="tar.gz"
      else rvm_archive_extension="tar.bz2"
      fi
    else
      rvm_disable_binary_flag=1
    fi
  fi

  true # for OSX
}

__rvm_select_interpreter_ext()
{
  if
    [[ -z "${rvm_ruby_name:-${detected_rvm_ruby_name:-}}" ]]
  then
    rvm_error "External ruby name was not specified!"
    return 1
  fi
}

__rvm_select_interpreter_current()
{
  ruby_binary="$(builtin command -v ruby)"
  if
    (( $? == 0)) &&
    __rvm_string_match "$ruby_binary" "*rvm*"
  then
    rvm_ruby_string="$(dirname "$ruby_binary" | __rvm_xargs dirname | __rvm_xargs basename)"
  else
    rvm_ruby_interpreter="system"
  fi
}

__rvm_select_interpreter_default()
{
  true # do nothing
}

__rvm_select_interpreter_system()
{
  true # do nothing
}

__rvm_select_interpreter_user()
{
  true # do nothing
}

__rvm_select_interpreter_missing()
{
  return 2
}
scripts/functions/rvmrc_trust000066400000016213147511530560012574 0ustar00#!/usr/bin/env bash

__rvm_md5_for_contents()
{
  if   builtin command -v md5     > /dev/null
  then md5         | __rvm_awk '{print $1}'
  elif builtin command -v md5sum  > /dev/null
  then md5sum      | __rvm_awk '{print $1}'
  elif builtin command -v openssl > /dev/null
  then openssl md5 | __rvm_awk '{print $1}'
  else return 1
  fi
  true # for osx
}

__rvm_sha256_for_contents()
{
  if   builtin command -v sha256sum > /dev/null
  then sha256sum           | __rvm_awk '{print $1}'
  elif builtin command -v sha256    > /dev/null
  then sha256              | __rvm_awk '{print $1}'
  elif builtin command -v shasum    > /dev/null
  then shasum -a256        | __rvm_awk '{print $1}'
  elif builtin command -v openssl   > /dev/null
  then openssl sha -sha256 | __rvm_awk '{print $1}'
  else return 1
  fi
  true # for osx
}

__rvm_checksum_for_contents()
{
  \typeset __sum
  __sum=$(  echo "$1" | \command \cat - "$1" | __rvm_md5_for_contents   ) ||
  {
    rvm_error "Neither md5 nor md5sum were found in the PATH"
    return 1
  }
  __sum+=$( echo "$1" | \command \cat - "$1" | __rvm_sha256_for_contents ) ||
  {
    rvm_error "Neither sha256sum nor shasum found in the PATH"
    return 1
  }
  echo ${__sum}
}

__rvm_rvmrc_key()
{
  printf "%b" "$1" | \command \tr '[#/.=()]' _
  return $?
}

__rvm_reset_rvmrc_trust()
{
  if [[ "$1" == all ]]
  then
    echo "" > "${rvm_user_path:-${rvm_path}/user}/rvmrcs"
  else
    __rvm_db_ "${rvm_user_path:-${rvm_path}/user}/rvmrcs" "$(__rvm_rvmrc_key "$1")" "delete" >/dev/null 2>&1
  fi
}

__rvm_trust_rvmrc()
{
  [[ -f "$1" ]] || return 1
  __rvm_reset_rvmrc_trust "$1"
  __rvm_db_ "${rvm_user_path:-${rvm_path}/user}/rvmrcs" "$(__rvm_rvmrc_key "$1")" "1;$(__rvm_checksum_for_contents "$1")" >/dev/null 2>&1 ||
  return $?
}

__rvm_untrust_rvmrc()
{
  [[ -f "$1" ]] || return 1
  __rvm_reset_rvmrc_trust "$1"
  __rvm_db_ "${rvm_user_path:-${rvm_path}/user}/rvmrcs" "$(__rvm_rvmrc_key "$1")" "0;$(__rvm_checksum_for_contents "$1")" >/dev/null 2>&1 ||
  return $?
}

__rvm_rvmrc_stored_trust()
{
  [[ -f "$1" ]] || return 1
  __rvm_db_ "${rvm_user_path:-${rvm_path}/user}/rvmrcs" "$(__rvm_rvmrc_key "$1")" ||
  return $?
}

__rvm_rvmrc_stored_trust_check()
{
  \typeset _first _second _rvmrc _rvmrc_base
  if [[ -n "${ZSH_VERSION:-}" ]]
  then _first=1
  else _first=0
  fi
  _second=$(( _first + 1 ))
  _rvmrc="${1}"
  _rvmrc_base="$(basename "${_rvmrc}")"

  if [[ -f "$_rvmrc" ]]
  then
    saveIFS=$IFS
    IFS=$';'
    trust=($(__rvm_rvmrc_stored_trust "$_rvmrc"))
    IFS=$saveIFS

    if
      [[ "${trust[${_second}]:-'#'}" != "$(__rvm_checksum_for_contents "$_rvmrc")" ]]
    then
      echo "The '$_rvmrc' contains unreviewed changes."
      return 1
    elif
      [[ "${trust[${_first}]}" == '1' ]]
    then
      echo "The '$_rvmrc' is currently trusted."
      return 0
    elif
      [[ "${trust[${_first}]}" == '0' ]]
    then
      echo "The '$_rvmrc' is currently untrusted."
      return 1
    else
      echo "The trustiworthiness of '$_rvmrc' is currently unknown."
      return 1
    fi
  else
    echo "There is no '$_rvmrc'"
    return 1
  fi
}

__rvm_check_rvmrc_trustworthiness()
{
  # Trust when they have the flag... of doom!
  (( ${rvm_trust_rvmrcs_flag:-0} == 0 )) || return 0

  # Fail if no file given or no extra params
  [[ -n "$1" ]] || (( $# > 1 )) || return 1

  \typeset _first _second saveIFS

  if [[ -n "${ZSH_VERSION:-}" ]]
  then _first=1
  else _first=0
  fi
  _second=$(( _first + 1 ))
  saveIFS="$IFS"
  IFS=$';'
  \typeset -a trust
  trust=( $( __rvm_rvmrc_stored_trust "$1" ) )
  IFS="$saveIFS"
  if
    [[ "${trust[${_second}]:-'#'}" == "$(__rvm_checksum_for_contents "$1")" ]]
  then
    [[ "${trust[${_first}]}" == '1' ]] || return $?
  else
    __rvm_ask_to_trust "$@" || return $?
  fi
  true
}

__rvm_display_rvmrc()
{
  __rvm_file_notice_display_pre
  __rvm_wait_anykey "(( press a key to review the ${_rvmrc_base} file ))"
  printf "%b" "${rvm_warn_clr}"
  command cat -v "${_rvmrc}"
  printf "%b" "${rvm_reset_clr}"
  __rvm_file_notice_display_post
}

__rvm_ask_to_trust()
{
  \typeset trusted value anykey _rvmrc _rvmrc_base
  _rvmrc="${1}"
  _rvmrc_base="$(basename "${_rvmrc}")"

  if [[ ! -t 0 || -n "$MC_SID" ]] || (( ${rvm_promptless:=0} == 1 ))
  then return 2
  fi

  __rvm_file_notice_initial
  trusted=0
  while (( ! trusted ))
  do
    printf "%b" 'y[es], n[o], v[iew], c[ancel]> '

    builtin read response
    value="$(echo -n "${response}" | \command \tr '[[:upper:]]' '[[:lower:]]' | __rvm_strip)"

    case "${value:-n}" in
      v|view)
        __rvm_display_rvmrc
        ;;
      y|yes)
        trusted=1
        ;;
      n|no)
        break
        ;;
      c|cancel)
        return 1
        ;;
    esac
  done

  if (( trusted ))
  then
    __rvm_trust_rvmrc "$1"
    return 0
  else
    __rvm_untrust_rvmrc "$1"
    return 1
  fi
}

__rvm_file_notice_initial()
{
  case "${_rvmrc}" in
    (*/.rvmrc) __rvm_rvmrc_notice_initial    ;;
    (*)        __rvm_env_file_notice_initial ;;
  esac
}

__rvm_rvmrc_notice_initial()
{
  __rvm_table "NOTICE" <<-TEXT
RVM has encountered a new or modified ${_rvmrc_base} file in the current directory, this is a shell script and therefore may contain any shell commands.

Examine the contents of this file carefully to be sure the contents are safe before trusting it!
Do you wish to trust '${_rvmrc}'?
Choose v[iew] below to view the contents
TEXT
}

__rvm_env_file_notice_initial()
{
  __rvm_table "NOTICE" <<-TEXT
RVM has encountered a new or modified ${_rvmrc_base} file in the current directory, environment variables from this file will be exported and therefore may influence your shell.

Examine the contents of this file carefully to be sure the contents are safe before trusting it!
Do you wish to trust '${_rvmrc}'?
Choose v[iew] below to view the contents
TEXT
}

__rvm_file_notice_display_pre()
{
  __rvm_table <<-TEXT
The contents of the ${_rvmrc_base} file will now be displayed.
After reading the file, you will be prompted again for 'yes or no' to set the trust level for this particular version of the file.

Note: You will be re-prompted each time the ${_rvmrc_base} file's contents change
changes, and may change the trust setting manually at any time.
TEXT
}

__rvm_file_notice_display_post()
{
  case "${_rvmrc}" in
    (*/.rvmrc) __rvm_rvmrc_notice_display_post    ;;
    (*)        __rvm_env_file_notice_display_post ;;
  esac
}

__rvm_rvmrc_notice_display_post()
{
  __rvm_table "Viewing of ${_rvmrc} complete." <<-TEXT
Trusting an ${_rvmrc_base} file means that whenever you cd into this directory, RVM will run this ${_rvmrc_base} shell script.
Note that if the contents of the file change, you will be re-prompted to review the file and adjust its trust settings. You may also change the trust settings manually at any time with the 'rvm rvmrc' command.
TEXT
}

__rvm_env_file_notice_display_post()
{
  __rvm_table "Viewing of ${_rvmrc} complete." <<-TEXT
Trusting an ${_rvmrc_base} file means that whenever you cd into this directory, RVM will export environment variables from ${_rvmrc_base}.
Note that if the contents of the file change, you will be re-prompted to review the file and adjust its trust settings. You may also change the trust settings manually at any time with the 'rvm rvmrc' command.
TEXT
}
scripts/functions/osx-support000066400000001144147511530560012522 0ustar00#!/usr/bin/env bash

requiremnts_osx_java_fail()
{
  __rvm_which java >/dev/null 2>&1 || return $?
  java_version=$(java -version 2>&1  | __rvm_awk -F'"' '/ version /{print $2}')
  case "$java_version" in
    (1.5.*)
      printf "%b" "\n\nWARNING: A very outdated JAVA version is being used ($java_version), it is strongly recommended that you upgrade to the latest version.\n\n"
      ;;
    (1.3.*|1.4.*)
      printf "%b" "\n\nERROR: Unsupported JAVA version $java_version. In order to install and use JRuby you must upgrade to the latest JAVA version.\n\n"
      return 1
      ;;
  esac
  true # for OSX
}
scripts/functions/version000077500000001275147511530560011674 0ustar00#!/usr/bin/env bash

__rvm_version()
{
  echo "rvm $(__rvm_version_installed) by $(__rvm_version_authors) [$(__rvm_version_website)]"
}

__rvm_version_website()
{
  echo "https://rvm.io"
}

__rvm_version_authors()
{
  echo "Michal Papis, Piotr Kuczynski, Wayne E. Seguin"
}

__rvm_version_copyright()
{
  echo "(c) 2009-2020 $(__rvm_version_authors)"
}

__rvm_print_headline()
{
  rvm_log "Ruby enVironment Manager ${rvm_version} $(__rvm_version_copyright)
"
}

__rvm_version_remote()
{
  __rvm_curl -s --max-time 10 https://github.com/rvm/rvm/raw/stable/VERSION || true
}

__rvm_version_installed()
{
  echo "$(\command \cat "$rvm_path/VERSION") ($(\command \cat "$rvm_path/RELEASE" 2>/dev/null))"
}
scripts/functions/requirements/solaris000066400000012436147511530560014404 0ustar00#!/usr/bin/env bash

requirements_solaris_lib_installed()
{
  pkg info "$1" > /dev/null 2>&1 || return $?
}

requirements_solaris_lib_available()
{
  pkg search "$1" 2>/dev/null | __rvm_grep "^$1-" > /dev/null 2>&1 || return $?
}

requirements_solaris_custom_lib_installed()
{
  pkginfo -q "$1" || return $?
}

requirements_solaris_libs_install()
{
  __rvm_try_sudo pkg install "$@" ||
  {
    \typeset ret=$?
    case $ret in
      (4) return 0 ;; # means the package does not need updates
    esac
    return $ret
  }
}

requirements_solaris_update_system()
{
  case "${_system_version}" in
    (10)
      return 0
      ;;
    (*)
      __rvm_try_sudo pkg refresh ||
      {
        \typeset ret=$?
        case $ret in
          (4) return 0 ;; # means nothing to install
        esac
        return $ret
      }
      ;;
  esac
}

requirements_solaris_check_custom()
{
  for lib in "$@"
  do
    [[ " ${packages_custom[*]} " == *" $lib "* ]] ||
    requirements_solaris_custom_lib_installed "$lib" || __rvm_add_once packages_custom "$lib"
  done
  unset lib
}

requirements_solaris_check_opencsw_enabled()
{
  requirements_solaris_custom_lib_installed CSWpkgutil || return $?
}

requirements_solaris_enable_opencsw()
{
  __rvm_try_sudo pkgadd -a $rvm_path/config/solaris/noask -d https://get.opencsw.org/now CSWpkgutil > /dev/null 2>&1 || return $?
}

requirements_solaris_install_custom()
{
  requirements_solaris_check_opencsw_enabled || requirements_solaris_enable_opencsw
  __rvm_try_sudo /opt/csw/bin/pkgutil -iy "$@" -t https://mirror.opencsw.org/opencsw/unstable || return $?
}

requirements_solaris_define()
{
  if
    is_a_function requirements_solaris_${_system_version}_define
  then
    requirements_solaris_${_system_version}_define "$@" || return $?
  else
    rvm_error "Solaris ${_system_version} is not supported"
    return 40
  fi
}

requirements_solaris_11_update_after()
{
  __rvm_try_sudo pkg update "${packages_installed[@]}" ||
  {
    \typeset ret=$?
    case $ret in
      (4) return 0 ;; # means nothing to install
    esac
    return $ret
  }
}

requirements_solaris_after()
{
  case "${_system_version}" in
    (10)
      return 0
      ;;
    (*)
      if
        [[ -n "${packages_installed[*]}" ]]
      then
        rvm_requiremnts_fail_or_run_action 3 \
          "Updating installed packages: ${packages_installed[*]}" \
          requirements_solaris_11_update_after ||
          return $?
      fi
      ;;
  esac
}

requirements_solaris_10_define()
{
  case "$1" in
    (rvm)
      requirements_solaris_check_custom CSWbash CSWgit CSWgpatch CSWmd5deep CSWwhich
      ;;

    (jruby-head*)
      requirements_solaris_check_custom git make
      ;;

    (jruby*)
      # JDK is already installed on Solaris 10
      # TODO: is ant installed also?
      requirements_solaris_check_custom make

      if
        is_head_or_disable_binary "$1"
      then
        requirements_solaris_check_custom git
        case $( jruby_installation_method  "$1" ) in
          mvn) requirements_check_custom_after mvn=maven ;;
        esac
      fi
      ;;

    (ir*)
      # No support
      true
      ;;

    (opal)
      # No support
      true
      ;;

    (*-head)
      requirements_solaris_check_custom CSWgpatch CSWgcc4core CSWgmake CSWcoreutils CSWpkgconfig CSWautoconf CSWautomake CSWlibtool CSWlibyaml-dev CSWlibreadline-dev CSWlibncurses-dev CSWlibssl-dev CSWcurl CSWgit
      __rvm_update_configure_opt_dir "$1" "/opt/csw"
      ;;

    (*)
      requirements_solaris_check_custom CSWgpatch CSWgcc4core CSWgmake CSWcoreutils CSWpkgconfig CSWautoconf CSWautomake CSWlibtool CSWlibyaml-dev CSWlibreadline-dev CSWlibncurses-dev CSWlibssl-dev CSWcurl
      __rvm_update_configure_opt_dir "$1" "/opt/csw"
      ;;
  esac
}

requirements_solaris_11_define()
{
  case "$1" in
    (rvm)
      requirements_check bash curl text/gnu-patch
      requirements_check_fallback git scmgit-base
      ;;
    (jruby*)
      # This will fail with the message
      ## To indicate that you agree to and accept the terms of the licenses of the packages listed above, use the --accept option.
      ## To display all of the related licenses, use the --licenses option.
      # Need to handle this somehow
      if
        is_head_or_disable_binary "$1"
      then
        requirements_check jdk
        requirements_check_fallback git scmgit-base
        case $( jruby_installation_method  "$1" ) in
          ant) requirements_check ant                    ;;
          mvn) requirements_check_custom_after mvn=maven ;;
        esac
      else
        requirements_check jdk
      fi
      ;;
    (ir*)
      # No support
      true
      ;;
    (opal)
      # No support
      true
      ;;
    (*-head)
      requirements_check_fallback git scmgit-base
      requirements_check text/gnu-patch developer/gcc-45 system/header developer/build/autoconf developer/build/automake developer/build/libtool system/library/math/header-math file/gnu-coreutils
      requirements_solaris_check_custom CSWlibyaml-dev
      __rvm_update_configure_opt_dir "$1" "/opt/csw"
      ;;
    (*)
      requirements_check text/gnu-patch developer/gcc-45 system/header developer/build/autoconf developer/build/automake developer/build/libtool system/library/math file/gnu-coreutils
      requirements_solaris_check_custom CSWlibyaml-dev
      __rvm_update_configure_opt_dir "$1" "/opt/csw"
      ;;
  esac
}
scripts/functions/requirements/osx_brew000066400000035143147511530560014560 0ustar00#!/usr/bin/env bash

requirements_find_osx_brew()
{
  if
    __rvm_which brew >/dev/null 2>&1
  then
    return 0
  else
    \typeset __binary
    for __binary in ~/homebrew/bin/brew ~/.homebrew/bin/brew /usr/local/bin/brew
    do
      if
        [[ -f "${__binary}" && -s "${__binary}" && -x "${__binary}" ]]
      then
        PATH="$PATH:${__binary%/*}"
        return 0
      fi
    done
    return 1
  fi
}

requirements_osx_brew_version_list()
{
  if __rvm_which $1 >/dev/null
  then $1 --version 2>/dev/null | __rvm_sed -n -e '1{s/^.* //; p;}'
  fi
  __rvm_ls -1 $( brew --cellar )/$1/ 2>/dev/null
}

requirements_osx_brew_lib_installed_prefix_check()
{
  brew_lib_prefix="$( brew --prefix "$1" 2>/dev/null )" &&
  [[ -n "${brew_lib_prefix}" && -d "${brew_lib_prefix}" ]] ||
  return $?
}

requirements_osx_brew_lib_installed()
{
  \typeset brew_lib_prefix

  # Test for older versions of Homebrew before adding the `--formula` flag.
  brew_version=$( brew --version | awk 'NR==1 { print $2 }' )
  if __rvm_version_compare $brew_version -ge 2.5.7
  then brew_ls_flags="--formula"
  fi

  brew list -1 $brew_ls_flags | __rvm_grep "^${1}$" >/dev/null &&
  requirements_osx_brew_lib_installed_prefix_check "$1" ||
  return $?
}

requirements_osx_brew_lib_available()
{
  brew search | __rvm_grep "^${1}$" >/dev/null || return $?
}

requirements_osx_brew_libs_error()
{
    rvm_warn "There were package ${1} errors, make sure to read the log.

Try \`brew tap --repair\` and make sure \`brew doctor\` looks reasonable.

Check Homebrew requirements https://docs.brew.sh/Installation"
}

requirements_osx_brew_libs_install()
{
  brew install "$@" --force ||
  {
    \typeset ret=$?

    requirements_osx_brew_libs_error "installation"

    return $ret
  }
}

requirements_osx_brew_libs_remove()
{
  brew remove "$@" ||
  {
    \typeset ret=$?

    requirements_osx_brew_libs_error "removal"

    return $ret
  }
}

requirements_osx_brew_check_custom()
{
  brew tap | __rvm_grep "$1" >/dev/null || __rvm_add_once packages_custom "$1"
}

requirements_osx_brew_install_custom()
{
  \typeset __tap
  for __tap
  do brew tap "${__tap}" || return $?
  done
}

requirements_osx_brew_libs_outdated_filter()
{
  \typeset IFS
  IFS="|"
  brew outdated --quiet | __rvm_grep -E "$*"
}

requirements_osx_brew_libs_try_upgrade()
{
  (( rvm_autolibs_flag_number > 0 )) || return 0

  \typeset -a outdated_libs
  __rvm_read_lines outdated_libs <(
    requirements_osx_brew_libs_outdated_filter "$@"
  )
  if
    (( ${#outdated_libs[@]} ))
  then
    rvm_requiremnts_fail_or_run_action 2 \
      "Homebrew libs '${outdated_libs[*]}' require update - skipping." \
      brew upgrade "${outdated_libs[@]}" ||
      return $?
  fi
}

requirements_osx_brew_libs_set_path()
{
  \typeset brew_lib brew_lib_prefix

  for brew_lib
  do
    if requirements_osx_brew_lib_installed_prefix_check "${brew_lib}"
    then __rvm_add_to_path prepend "${brew_lib_prefix}/bin"
    fi
  done
  rvm_debug "PATH=$PATH"
}

requirements_osx_brew_libs_configure()
{
  \typeset package brew_lib brew_lib_prefix
  package="$1"
  shift

  for brew_lib
  do
    if requirements_osx_brew_lib_installed_prefix_check "${brew_lib}"
    then __rvm_update_configure_opt_dir "${package}" "${brew_lib_prefix}"
    fi
  done
}

requirements_osx_brew_after()
{
  (( ${#packages_installed[@]} == 0 )) ||
  requirements_osx_brew_libs_try_upgrade "${packages_installed[@]}" || return $?

  requirements_osx_brew_libs_set_path       "${brew_libs[@]}"       || return $?
  requirements_osx_brew_libs_configure "$1" "${brew_libs_conf[@]}"  || return $?

  case "$1" in
    (jruby*) true ;;
    (*) requirements_osx_brew_after_update_certs_openssl "$1" ;;
  esac

  unset brew_libs brew_libs_conf brew_openssl_package
}

requirements_osx_brew_after_update_certs_openssl()
{
  \typeset brew_lib_prefix
  if
    requirements_osx_brew_lib_installed_prefix_check "$brew_openssl_package" &&
    [[ -x "${brew_lib_prefix}/bin/openssl" ]]
  then
    requirements_osx_update_openssl_cert "${brew_lib_prefix}/bin/openssl" || return $?
  else
    rvm_requiremnts_fail_always 2 \
      "Somehow it happened there is no executable 'openssl',
run 'brew doctor' and make sure latest '$brew_openssl_package' is installed properly." ||
      return 12 # passing by 127 could be read as missing rvm.
  fi
}

requirements_osx_brew_libs_default_check_gcc()
{
  if
    requirements_detect_installed gcc gcc@8 gcc@7 gcc@6 gcc@5 gcc@4.9
  then
    case "${packages_installed[*]}" in
      (*gcc*)         export CC="$(brew --prefix gcc        )/bin/gcc-8" ;;
      (*gcc@8*)       export CC="$(brew --prefix gcc@8      )/bin/gcc-8" ;;
      (*gcc@7*)       export CC="$(brew --prefix gcc@7      )/bin/gcc-7" ;;
      (*gcc@6*)       export CC="$(brew --prefix gcc@6      )/bin/gcc-6" ;;
      (*gcc@5*)       export CC="$(brew --prefix gcc@5      )/bin/gcc-5" ;;
      (*gcc@4.9*)     export CC="$(brew --prefix gcc@4.9    )/bin/gcc-4.9" ;;
      (*)             return 1 ;;
    esac
  else
    return $?
  fi
}

requirements_osx_brew_libs_default_add_gcc_v_auto()
{
  # Install gcc from brew only for macOS earlier then Mojave (10.14)
  if __rvm_version_compare "${_system_version}" -lt 10.14
  then
    if __rvm_version_compare "${_system_version}" -ge 10.10
    then requirements_osx_brew_libs_default_add_gcc_v 6.0
    else requirements_osx_brew_libs_default_add_gcc_v 4.9
    fi
  fi
}

requirements_osx_brew_libs_default_add_gcc_v()
{
  case "$1" in
    (4.9) requirements_osx_brew_libs_default_add_gcc "$2" gcc-4.9 gcc@4.9     ;;
    (5.0) requirements_osx_brew_libs_default_add_gcc "$2" gcc-5.0 gcc@5       ;;
    (6.0) requirements_osx_brew_libs_default_add_gcc "$2" gcc-6.0 gcc@6       ;;
    (7.0) requirements_osx_brew_libs_default_add_gcc "$2" gcc-7.0 gcc@7       ;;
    (8.0) requirements_osx_brew_libs_default_add_gcc "$2" gcc-8.0 gcc@8       ;;
    (*)
      rvm_error "Do not know how to check/install gcc '$1'."
      return 1
      ;;
  esac
}

requirements_osx_brew_libs_default_add_gcc()
{
  if [[ -n "$1" ]] && __rvm_which "$1" >/dev/null
  then true
  else
    export CC="$2"
    if __rvm_which "$2" >/dev/null
    then true
    else
      if [[ -z "${3:-}" ]]
      then false           # no package known and binary not found
      else
        if [[ -z "$(brew --prefix $3 2>/dev/null)" ]]
        then
          rvm_error "We don't know how to install <code>$3</code>"
          rvm_log "Try to run <code>brew install $3</code> and re-run the same rvm command afterwards."
          false
        else
          export CC="$(brew --prefix $3 2>/dev/null || brew --prefix)/bin/$2"
          brew_libs+=( "$3" )
        fi
      fi
    fi
  fi
}

requirements_osx_brew_define_gcc()
{
  # Old gcc46 but it will most likely not work on OSX 10.10+
  if __rvm_version_compare "${_system_version}" -ge 10.10
  then
    undesired_check gcc46
  fi

  \typeset selected_compiler="$( __rvm_selected_compiler )"

  case "${selected_compiler:-}" in
    ("")
      case "$1" in
        (rbx-2*|rubinius-2*)
            brew_libs_conf+=( llvm@3.5 )
            ;;

        (rbx-3*|rubinius-3*|rbx*head|rubinius*head)
            requirements_check git openssl readline libyaml gdbm llvm@5
            rvm_configure_flags+=( --llvm-config="$(brew --prefix llvm@5)/bin/llvm-config" )
            ;;

        (truffleruby*)
            ;;

        (*)
          # Install gcc from brew only for macOS earlier then Mojave (10.14)
          if __rvm_version_compare "${_system_version}" -lt 10.14
          then
            __ruby_clang_ok "$1" ||
            requirements_osx_brew_libs_default_check_gcc ||
            requirements_osx_brew_libs_default_add_gcc_v_auto ||
            return $?
          fi
          ;;
      esac
      ;;

    (*gcc-4.9|*gcc-5|*gcc-6|*gcc-7|*gcc-8|*gcc)
      requirements_osx_brew_libs_default_add_gcc_v ${selected_compiler##*-} "${selected_compiler}" || return $?
                                                   # version                # full_path
      ;;

    (*)
      rvm_warn "We don't know how to ensure that selected compiler '${selected_compiler}' exists."
      ;;
  esac
}

requirements_osx_brew_define_openssl()
{
  # OpenSSL version depends on the version of Ruby being installed
  undesired_check openssl098

  case "$1" in
    (ruby-2.3*|ruby-2.2*|ruby-2.1*|ruby-2.0*|ruby-1.9*|ruby-1.8*)
      brew_openssl_package="openssl"
      ;;

    (ree-1.8*)
      brew_openssl_package="openssl"
      ;;

    (rbx-1*|rbx-2*)
      brew_openssl_package="openssl"
      ;;

    (truffleruby*)
      brew_openssl_package="openssl"
      ;;

    (*)
      brew_openssl_package="openssl@1.1"
      ;;
  esac

  brew_libs_conf+=( "$brew_openssl_package" )
}

requirements_osx_brew_libs_default()
{
  brew_libs=(
    autoconf automake libtool pkg-config coreutils
  )
  brew_libs_conf=(
    libyaml libksba readline zlib
  )

  requirements_osx_brew_define_gcc "$1"
  requirements_osx_brew_define_openssl "$1"

  requirements_check "${brew_libs[@]}" "${brew_libs_conf[@]}" || return $?
}

requirements_osx_brew_define()
{
  case "$1" in
    (rvm)
      true
      ;;

    (jruby*)
      requirements_check make

      if
        is_head_or_disable_binary "$1"
      then
        __rvm_which git >/dev/null || requirements_check git
        case $( jruby_installation_method  "$1" ) in
          mvn) requirements_check_custom_after mvn=maven ;;
        esac
      fi
      requiremnts_osx_java_fail  || return $?
      ;;

    (ir*)
      __rvm_which mono >/dev/null 2>&1 || return $?
      ;;

    (opal)
      requirements_check node
      ;;

    (truffleruby*)
      requirements_osx_brew_libs_default "$1"
      ;;

    (ruby*head)
      __rvm_which git >/dev/null || requirements_check git
      requirements_osx_brew_libs_default "$1"
      requirements_version_minimal autoconf 2.67
      ;;

    (*-head)
      __rvm_which git >/dev/null || requirements_check git
      requirements_osx_brew_libs_default "$1"
      ;;

    (*)
      requirements_osx_brew_libs_default "$1"
      ;;
  esac
}

__CLT_version_at_least()
{
  \typeset __version="$(
    pkgutil --pkg-info com.apple.pkg.DeveloperToolsCLI 2>/dev/null | __rvm_awk '$1~/version:/{print $2}'
  )"
  [[ -n "${__version}" ]] || __version="$(
    pkgutil --pkg-info com.apple.pkg.CLTools_Executables 2>/dev/null | __rvm_awk '$1~/version:/{print $2}'
  )"
  [[ -n "${__version}" ]] ||return $?
  __rvm_version_compare "${__version}" -ge "$1" || return $?
}

requirements_osx_brew_update_system()
{
  if
    __rvm_version_compare "${_system_version}" -ge 10.7
  then
    __rvm_detect_xcode_version_at_least 4.6.2 ||
    __CLT_version_at_least 4.6.0 ||
    {
      \typeset ret=$?
      rvm_error "
Xcode version older than 4.6.2 installed, download and install newer version from:

    http://connect.apple.com

After installation open Xcode, go to Downloads and install Command Line Tools.
"
      return $ret
    }
  fi
  brew update ||
  {
    \typeset ret=$?
    rvm_error "Failed to update Homebrew, follow instructions at

    https://docs.brew.sh/Common-Issues

and make sure \`brew update\` works before continuing."
    return $ret
  }
}

requirements_osx_brew_install_brew_setup()
{
  if
    __rvm_version_compare "${_system_version}" -ge 10.5
  then
    homebrew_repo="Homebrew/brew"
    homebrew_installer="https://raw.githubusercontent.com/Homebrew/install/master/install"
    homebrew_name="Homebrew"
  else
    homebrew_repo="mistydemeo/tigerbrew"
    homebrew_installer="https://raw.githubusercontent.com/mistydemeo/tigerbrew/go/install"
    homebrew_name="Tigerbrew"
  fi
  if
    (( UID == 0 )) && [[ -z "${SUDO_USER:-}" ]]
  then
    rvm_error "Requested installation of ${homebrew_name} but the process is running as 'root', make sure to run with 'sudo' from normal user and try again."
    return 1
  fi
  homebrew_home_default="/usr/local"
  printf "%b" "About to install ${homebrew_name} in the default location \`$homebrew_home_default\`.\n
It is possible to select a custom location, however it is not recommended and some things might not work.
You should do it only if you do not have write rights to \`$homebrew_home_default\`.

Press ENTER to install ${homebrew_name} in the default location \`$homebrew_home_default\`
or type a custom path (needs to be writable for the current user)\n: "
  read homebrew_home || return $?
  rvm_debug "homebrew_home=${homebrew_home:=$homebrew_home_default}"
}

requirements_osx_brew_install_brew_install()
{
  if
    [[ "${homebrew_home}" == "${homebrew_home_default}" ]]
  then
    rvm_debug "Default homebrew installation from: $homebrew_installer"
    if [[ -n "${SUDO_USER:-}" ]]
    then su - ${SUDO_USER} -c "ruby -e \"$(curl -fsSL $homebrew_installer)\"" || return $?
    else ruby -e "$(curl -fsSL $homebrew_installer)" || return $?
    fi
  else
    rvm_debug "Simplified homebrew installation from: https://github.com/${homebrew_repo}/tarball/master"
    mkdir -p "${homebrew_home}" || return $?
    __rvm_curl https://github.com/${homebrew_repo}/tarball/master | tar xz --strip 1 -C "${homebrew_home}"
    __rvm_check_pipestatus ${PIPESTATUS[@]} ${pipestatus[@]} || return $?
    chmod +x "${homebrew_home}/bin/brew" # just in case
    if [[ -n "${SUDO_USER:-}" ]]
    then chown -R ${SUDO_USER} "${homebrew_home}"
    fi
  fi
  PATH="$PATH:${homebrew_home}/bin"
}

requirements_osx_brew_install_brew()
{
  \typeset homebrew_home_default homebrew_home homebrew_repo homebrew_installer homebrew_name

  requirements_osx_brew_install_brew_setup   || return $?
  requirements_osx_brew_install_brew_install || return $?
}

requirements_osx_brew_ensure_brew_available()
{
  __rvm_which brew >/dev/null ||
  {
    rvm_requiremnts_fail_or_run_action 2 \
      "Requested installation with Homebrew libs, but Homebrew is not available." \
      requirements_osx_brew_install_brew || return $?
  }

  __rvm_which brew >/dev/null ||
  {
    \typeset __result=$?
    rvm_error "\
Something went wrong during Homebrew installation,
can not find 'brew' command, please report a bug: https://github.com/rvm/rvm/issues"
    return $__result
  }
}

requirements_osx_brew_ensure_brew_can_install()
{
  # only check for 3+ (packages install, enabled)
  (( rvm_autolibs_flag_number > 2 )) || return 0

  \typeset __celar_path
  __celar_path="$(brew --cellar)"
  if
    [[ ! -w "${__celar_path%/*}/bin" ]]
  then
    rvm_error "ERROR: '${__celar_path%/*}/bin' is not writable - it is required for Homebrew, try 'brew doctor' to fix it!"
    return 1
  elif
    [[ ! -w "${__celar_path}" && -e "${__celar_path}" ]]
  then
    rvm_error "ERROR: '${__celar_path}' is not writable - it is required for Homebrew, try 'brew doctor' to fix it!"
    return 1
  else
    rvm_debug "brew seems to be writable"
  fi
}

requirements_osx_brew_before()
{
  requirements_osx_brew_ensure_brew_available   || return $?
  requirements_osx_brew_ensure_brew_can_install || return $?
}
scripts/functions/requirements/pclinuxos000066400000004475147511530560014760 0ustar00#!/usr/bin/env bash

requirements_pclinuxos_lib_installed()
{
  rpm -q --whatprovides "$1" >/dev/null || return $?
  # Alternative: rpm -qa | grep "$1" >/dev/null || return $?
}

requirements_pclinuxos_lib_available()
{
  apt-cache search "$1" >/dev/null 2>&1 || return $?
}

requirements_pclinuxos_version_list()
{
  rpm -q --whatprovides "$1" | sed -e "s#^$1-##"
}

requirements_pclinuxos_libs_install()
{
  __rvm_try_sudo apt-get -y install "$@" || return $?
}

requirements_pclinuxos_update_system()
{
  true
}

requirements_pclinuxos_check_binary()
{
  {
    __rvm_which update-alternatives >/dev/null &&
    update-alternatives --display "$1" >/dev/null 2>&1
  } ||
  __rvm_which "$1" >/dev/null || return $?
}

requirements_pclinuxos_define()
{
  case "$1" in
    (rvm)
      requirements_check bash curl patch
      ;;

    (jruby*)
      requirements_check make

      if
        is_head_or_disable_binary "$1"
      then
        requirements_pclinuxos_check_binary javac ||
          requirements_check_fallback java-1.7.0-openjdk-devel java-devel

        requirements_check git

        case $( jruby_installation_method  "$1" ) in
          mvn) requirements_check_custom_after mvn=maven ;;
        esac
      else
        requirements_pclinuxos_check_binary java ||
          requirements_check_fallback java-1.7.0-openjdk java
      fi
      ;;

    (ir*)
      true # not that easy
      ;;

    (opal)
      true # not that easy
      ;;

    (rbx*|rubinius*)
      requirements_check clang clang-devel llvm llvm-devel
      ;;

    (truffleruby*)
      requirements_check lib64openssl-devel zlib zlib-devel make gcc libxml2
      ;;

    (*-head)
      requirements_check git
      requirements_pclinuxos_define "${1%-head}"
      ;;

    (*)
      if [[ ${#rvm_patch_names[@]} -gt 0 || "$1" == *"-head" ]]
      then requirements_version_minimal autoconf 2.67
      else requirements_check autoconf
      fi

      case "${_system_arch}" in
        (x86_64)
          requirements_check lib64yaml-devel lib64ffi-devel lib64readline-devel lib64openssl-devel
          ;;
        (*)
          requirements_check libyaml-devel libffi5-devel readline-devel libopenssl-devel
          ;;
      esac

      requirements_check automake bison bzip2 gcc-c++ glibc-devel glibc-headers-devel libtool make patch \
         zlib zlib-devel
      ;;
  esac
}
scripts/functions/requirements/deepin000066400000001603147511530560014166 0ustar00#!/usr/bin/env bash

source "$rvm_scripts_path/functions/requirements/debian"

requirements_deepin_define_libgmp()
{
  requirements_check libgmp-dev
}

requirements_deepin_define_libreadline()
{
  requirements_check libreadline-dev
}

requirements_deepin_define_libssl()
{
  case "$1" in
    (ruby-2.3*|ruby-2.2*|ruby-2.1*|ruby-2.0*|ruby-1.9*)
        # legacy libssl-dev required by older version of ruby has been renamed to libssl1.0-dev
        undesired_check libssl-dev
        requirements_check libssl1.0-dev
      ;;

    (*)
      undesired_check libssl1.0-dev
      requirements_check libssl-dev
      ;;
  esac
}

requirements_deepin_define_clang_llvm()
{
  requirements_check clang-3.6 llvm-3.6 llvm-3.6-dev
  rvm_configure_flags+=( --cc=clang-3.6 --cxx=clang++-3.6 --llvm-config=llvm-config-3.6)
}

requirements_deepin_define()
{
  __lib_type=debian
  requirements_debian_define "$@"
}
scripts/functions/requirements/termux000066400000002043147511530560014245 0ustar00#!/usr/bin/env bash

requirements_termux_lib_installed()
{
  pkg-query -s "$1" > /dev/null 2>&1 || return $?
}

requirements_termux_libs_install()
{
  pkg install "$@" || return $?
}

requirements_termux_libs_remove()
{
  pkg --yes remove "$@" || return $?
}

requirements_termux_define_base()
{
  requirements_check "$@" \
    autoconf automake bison ca-certificates curl libc6-dev libffi-dev libgdbm-dev libncurses5-dev \
    libsqlite3-dev libtool libyaml-dev make openssl patch pkg-config sqlite3 zlib1g zlib1g-dev

  requirements_${_system_name_lowercase}_define_libgmp
  requirements_${_system_name_lowercase}_define_libreadline
}

requirements_termux_define()
{
  case "$1" in
    (rvm)
      requirements_check bash curl patch bzip2 ca-certificates gawk
      ;;

    (*)
      requirements_check clang coreutils curl gawk git gnupg gpgv \
                         libc++ libclang libclang-dev libllvm libxml2 make ncurses ncurses-ui-libs \
                         openssl openssl-dev openssl-tool readline sqlite tar zlib zlib-dev
      ;;
  esac
}
scripts/functions/requirements/smf000066400000014262147511530560013514 0ustar00#!/usr/bin/env bash

requirements_find_smf()
{
  if # find SMF in PATH
    __rvm_which sm >/dev/null 2>&1
  then
    return 0
  else # find SMF out of PATH and link to rvm/bin
    \typeset __binary
    for __binary in ~/.sm/bin/sm /opt/sm/bin/sm
    do
      if
        [[ -f "${__binary}" && -s "${__binary}" && -x "${__binary}" ]]
      then
        PATH="$PATH:${__binary%/*}"
        return 0
      fi
    done
    return 1
  fi
}

__smf_try_sudo()
{
  if [[ -w "$( __rvm_which sm )" ]]
  then "$@"
  else __rvm_try_sudo "$@"
  fi
}

requirements_smf_lib_installed()
{
  sm pkg list | __rvm_grep "^${1}:" >/dev/null || return $?
}

requirements_smf_lib_install_command()
{
  __smf_install_command=( sm "$1" install )
  if
    [[ "${rvm_static_flag:-}" == "1" ]]
  then
    __smf_install_command=(
      /usr/bin/env CFLAGS="-fPIC" LDFLAGS="-fPIC" "${__smf_install_command[@]}" static
    )
  fi
  __smf_install_command=( __smf_try_sudo "${__smf_install_command[@]}" )
}

requirements_smf_lib_install()
{
  \typeset -a __smf_install_command
  requirements_smf_lib_install_command "$@"
  rvm_debug "__smf_install_command: ${__smf_install_command[*]};"
  "${__smf_install_command[@]}" ||
  {
    \typeset ret=$?
    rvm_warn "There were package installation errors with SM Framework, make sure to read the log.
If you see this on OSX, then you might want to try macports (https://www.macports.org/) or homebrew (http://brew.sh/) and tell RVM to use them by running:

    rvm autolibs macports #OR
    rvm autolibs homebrew

You might get help by reporting tickets to https://github.com/sm/sm/issues"
    return $ret
  }
  shift
}

requirements_smf_gcc_42_check()
{
  case "$1" in
    (ruby-2*|ruby-head) true ;; # ruby-2.0.0+ is supposed to work with clang
    (*)
      # install gcc-4.2 only if not yet available, prevents problems with gcc-4.2 on OSX 10.6
      if
        ! __rvm_which gcc-4.2 >/dev/null &&
        __rvm_compiler_is_llvm
      then
        rvm_error "SM Framework does not know how to install gcc-4.2, please install osx-gcc-installer first for older rubies."
      fi
      ;;
  esac
}

requirements_smf_install_extension_sets()
{
  \typeset __set
  for __set
  do __smf_try_sudo sm set install "${__set}" || return $?
  done
}

requirements_smf_update_system_ensure_etc_openssl()
{
  [[ -d "/etc/openssl" ]] || __rvm_try_sudo mkdir -p "/etc/openssl" || return $?
  [[ -w "/etc/openssl" ]] ||
  {
    __rvm_try_sudo chmod -R 755   "/etc/openssl" &&
    __rvm_try_sudo chown -R $USER "/etc/openssl"
  } || return $?
}

requirements_smf_update_system()
{
  requirements_smf_update_system_ensure_etc_openssl || return $?
  __rvm_log_command sm_get_head "Updating SMF" __smf_try_sudo sm get head || return $?
  if
    [[ "${#required_extension_sets[@]}" -gt 0 ]]
  then
    __rvm_log_command sm_install_extension_sets "Installing/updating extension sets: ${required_extension_sets[*]}" \
      requirements_smf_install_extension_sets "${required_extension_sets[@]}" ||
      return $?
  fi
}

requirements_smf_define_git()
{
  __rvm_which git >/dev/null || {
    required_extension_sets+=( vcs )
    requirements_check autoconf git || return $?
  }
}

requirements_smf_define()
{
  case "$1" in
    (rvm)
      true
      ;;

    (jruby*)
      requirements_check make

      if
        is_head_or_disable_binary "$1"
      then
        requirements_smf_define_git || return $?
        case $( jruby_installation_method  "$1" ) in
          ant) __rvm_which ant >/dev/null 2>&1 || return $? ;;
          mvn) requirements_check_custom_after mvn=maven    ;;
        esac
      fi
      __rvm_which java >/dev/null 2>&1 || return $?
      ;;

    (ir*)
      __rvm_which mono >/dev/null 2>&1 || return $?
      ;;

    (opal)
      required_extension_sets+=( javascript )
      requirements_check node
      ;;

    (*-head)
      requirements_smf_define default
      requirements_smf_define_git || return $?
      ;;

    (*)
      required_extension_sets+=( databases gnu libraries tools )
      if
        [[ "${_system_name}" == "OSX" ]]
      then
        # TODO: ruby up to 1.9.3 requires openssl 0.9.8 on OSX
        if __rvm_version_compare "${_system_version}" -ge 10.9
        then requirements_check pkg-config libyaml zlib ncurses readline openssl sqlite3 gdbm
        else requirements_check pkg-config libtool libyaml zlib ncurses readline openssl sqlite3 gdbm
        fi
      else
        requirements_check pkg-config libtool libyaml zlib ncurses ncursesw readline openssl sqlite3 gdbm
      fi
      ;;
  esac
}

requirements_smf_install_sm()
{
  rvm_error "SMF Framework support is only intended for RailsInstaller / Tokaido.app, please use Macports / Homebrew integration instead."
  return 100
}

requirements_smf_ensure_smf_available()
{
  __rvm_which sm >/dev/null ||
  {
    rvm_requiremnts_fail_or_run_action 2 \
      "Requested installation with SM Framework, but SM Framework is not available." \
      requirements_smf_install_sm ||
      return $?
  }
}

requirements_smf_find_sm()
{
  export __sm_path
  : __sm_path:${__sm_path:=$( __rvm_which sm )}
  __rvm_readlink_deep __sm_path
  [[ -n "${__sm_path}" ]] || return $?
}

requirements_smf_before()
{
  required_extension_sets=()
  requirements_smf_ensure_smf_available || return $?
  requirements_smf_find_sm              || return $?
}

requirements_smf_after()
{
  requirements_smf_gcc_42_check "$1" || return $?

  if
    [[ "${_system_name}" == "OSX" ]]
  then
    case "$1" in
      (ruby-1*|ruby-2.0*)
        __rvm_update_configure_env LDFLAGS="-Z -L${__sm_path%/bin/sm}/pkg/active/lib -L/usr/lib"
        ;;
      (*) # 2.1.0+
        __rvm_update_configure_env LDFLAGS="-L${__sm_path%/bin/sm}/pkg/active/lib"
        ;;
    esac
    __rvm_update_configure_env CFLAGS="-I${__sm_path%/bin/sm}/pkg/active/include"
  fi

  case "$PATH" in
   (${__sm_path%/bin/sm}/pkg/active/bin:*)
     true
     ;;
   (*)
     __rvm_add_to_path prepend "${__sm_path%/bin/sm}/pkg/active/bin"
     ;;
  esac

  export PKG_CONFIG_PATH="${__sm_path%/bin/sm}/pkg/active/lib/pkgconfig"

  case "$1" in
    (jruby*) true ;;
    (*) requirements_smf_after_update_certs_openssl ;;
  esac
}

requirements_smf_after_update_certs_openssl()
{
  requirements_osx_update_openssl_cert "${__sm_path%/bin/sm}/pkg/active/bin/openssl" || return $?
}
scripts/functions/requirements/osx000066400000001042147511530560013530 0ustar00#!/usr/bin/env bash

source "$rvm_scripts_path/functions/detect/xcode"

source "$rvm_scripts_path/functions/requirements/osx_brew"
source "$rvm_scripts_path/functions/requirements/osx_fink"
source "$rvm_scripts_path/functions/requirements/osx_port"
source "$rvm_scripts_path/functions/requirements/smf"

requirements_osx_before()
{
  \typeset __type
  for __type in osx_brew osx_port smf osx_fink
  do
    if
      requirements_find_${__type}
    then
      __lib_type=${__type}
      return 0
    fi
  done

  # fallback
  __lib_type=osx_brew
}
scripts/functions/requirements/suse000066400000000672147511530560013706 0ustar00#!/usr/bin/env bash

source "$rvm_scripts_path/functions/requirements/opensuse"

requirements_suse_define_libyaml()
{
    requirements_opensuse_lib_installed libyaml-devel ||
    {
      requirements_check pkg-config
      requirements_rvm_pkg_lib_installed_custom yaml
    }
}

requirements_suse_define()
{
  __lib_type=opensuse
  requirements_opensuse_define "$@"
}

requirements_suse_after()
{
  requirements_rvm_pkg_configure "$1" yaml
}
scripts/functions/requirements/kali000066400000001514147511530560013643 0ustar00#!/usr/bin/env bash

source "$rvm_scripts_path/functions/requirements/debian"

requirements_kali_define_libgmp()
{
  requirements_check libgmp-dev
}

requirements_kali_define_libreadline()
{
  requirements_check libreadline6-dev
}

requirements_kali_define_libssl()
{
  case "$1" in
    (ruby-2.3*|ruby-2.2*|ruby-2.1*|ruby-2.0*|ruby-1.9*)
        undesired_check libssl-dev libssl1.1
        requirements_check libssl1.0-dev libssl1.0.2
      ;;

    (*)
        undesired_check libssl1.0-dev libssl1.0.2
        requirements_check libssl-dev libssl1.1
        ;;
  esac
}

requirements_kali_define_clang_llvm()
{
  requirements_check clang-3.6 llvm-3.6 llvm-3.6-dev
  rvm_configure_flags+=( --cc=clang-3.6 --cxx=clang++-3.6 --llvm-config=llvm-config-3.6)
}

requirements_kali_define()
{
  __lib_type=debian
  requirements_debian_define "$@"
}
scripts/functions/requirements/cygwin000066400000003654147511530560014232 0ustar00#!/usr/bin/env bash

requirements_cygwin_lib_installed()
{
  cygcheck -c -d | __rvm_grep "^$1" >/dev/null || return $?
}

requirements_cygwin_libs_install()
{
  \typeset __packages_list __manager

  rvm_debug "__manager: detecting administrative permissions"
  net session > /dev/null 2>&1
  if [ $? -eq 0 ];
  then __manager_admin_mode=""
  else __manager_admin_mode="--no-admin"
  fi

  if [[ "${_system_arch}" == "x86_64" ]]
  then __manager="setup-x86_64.exe"
  else __manager="setup-x86.exe"
  fi
  rvm_debug "__manager: ${__manager} ${__manager_admin_mode}"

  __packages_list="$*"
  ${__manager} ${__manager_admin_mode} -q -P "${__packages_list// /,}" || return $?
}

requirements_cygwin_update_system()
{
  true # really???
}

requirements_cygwin_define()
{
  # Verify cygwin package names using:
  # https://cygwin.com/cgi-bin2/package-grep.cgi

  case "$1" in
    (rvm)
      requirements_check bash curl patch gnupg
      ;;

    (jruby*)
      requirements_check make

      if
        is_head_or_disable_binary "$1"
      then
        requirements_check git
        case $( jruby_installation_method  "$1" ) in
          ant)  echo "Need Java JDK and Ant"   ;;
          mvn)  echo "Need Java JDK and Maven" ;;
          mvnw) echo "Need Java JDK"           ;;
        esac
      else
        echo "Need Java"
      fi
      ;;

    (ir*)
      true # should be already there in most cases
      ;;

    (opal)
      echo "Need Node.js"
      ;;

    (*-head)
      requirements_check autoconf git
      requirements_cygwin_define "${1%-head}"
      ;;

    (*)
      requirements_check make autoconf automake bison m4 libtool \
        gcc gcc-core mingw64-i686-gcc-core mingw64-x86_64-gcc-core \
        libiconv zlib zlib-devel \
        openssl libssl-devel \
        libcrypt-devel libcrypt0 \
        libyaml-devel libyaml0_2 \
        libffi-devel \
        libreadline-devel \
        sqlite3 \
        patch \
        gnupg
      ;;
  esac
}
scripts/functions/requirements/amazon000066400000000630147511530560014206 0ustar00#!/usr/bin/env bash

source "$rvm_scripts_path/functions/requirements/centos"

requirements_amazon_define_glibc()
{
  requirements_check glibc-headers glibc-devel
}

requirements_amazon_define_libyaml()
{
  requirements_check libyaml-devel
}

requirements_amazon_define_openssl()
{
  requirements_check openssl-devel
}

requirements_amazon_define()
{
  __lib_type=centos

  requirements_centos_define "$@"
}
scripts/functions/requirements/ubuntu000066400000003011147511530560014237 0ustar00#!/usr/bin/env bash

source "$rvm_scripts_path/functions/requirements/debian"

requirements_ubuntu_define_libgmp()
{
  requirements_check libgmp-dev
}

requirements_ubuntu_define_libreadline()
{
  if
    __rvm_version_compare ${_system_version} -ge 16.10
  then
    requirements_check libreadline-dev
  else
    requirements_check libreadline6-dev
  fi
}

requirements_ubuntu_define_libssl()
{
  # Legacy libssl-dev required by older version of ruby has been renamed to libssl1.0-dev
  # starting from Ubuntu 17.10 (Artful Aardvark)

  case "$1" in
    (ruby-2.3*|ruby-2.2*|ruby-2.1*|ruby-2.0*|ruby-1.9*|ruby-1.8*|ree-1.8*)
      if
        __rvm_version_compare ${_system_version} -ge 17.10
      then
        undesired_check libssl-dev
        requirements_check libssl1.0-dev
      else
        requirements_check libssl-dev
      fi
      ;;

    (*)
      requirements_check libssl-dev
      ;;
  esac
}

requirements_ubuntu_define_clang_llvm()
{
  if
    __rvm_version_compare ${_system_version} -ge 17.04
  then
    requirements_check clang-4.0 llvm-4.0 llvm-4.0-dev libc++-dev libc++abi-dev
    rvm_configure_flags+=( --cc=clang-4.0 --cxx=clang++-4.0 --llvm-config=llvm-config-4.0)
    __rvm_update_configure_env CXXFLAGS="-nostdinc++ -I/usr/include/c++/v1" LDFLAGS="-stdlib=libc++ -lc++"
  else
    requirements_check clang-3.6 llvm-3.6 llvm-3.6-dev
    rvm_configure_flags+=( --cc=clang-3.6 --cxx=clang++-3.6 --llvm-config=llvm-config-3.6)
  fi
}

requirements_ubuntu_define()
{
  __lib_type=debian
  requirements_debian_define "$@"
}
scripts/functions/requirements/rosadesktop000066400000003553147511530560015266 0ustar00#!/usr/bin/env bash

requirements_openmandriva_lib_installed()
{
  rpm -q --whatprovides "$1" >/dev/null || return $?
}

requirements_openmandriva_lib_available()
{
  urpmq "$1" >/dev/null 2>&1 || return $?
}

requirements_openmandriva_version_list()
{
  rpm -q --whatprovides "$1" | sed -e "s#^$1-##"
}

requirements_openmandriva_libs_install()
{
  __rvm_try_sudo urpmi --downloader wget --wget-options --auth-no-challenge --auto "$@" || return $?
}

requirements_openmandriva_update_system()
{
  __rvm_try_sudo urpmi.update -a ||
  {
    \typeset __ret=$?
    case ${__ret} in
      (100)
        rvm_error "There has been error while updating 'urpmi.update', please give it some time and try again later.
404 errors should be fixed for rvm to proceed. Check your sources configured in:
    /etc/urpmi/urpmi.cfg
"
        ;;
    esac
    return ${__ret}
  }
}

requirements_openmandriva_define()
{
  case "$1" in
    (rvm)
      requirements_check bash curl patch
      ;;

    (jruby*)
      requirements_check make
      
      true # not that easy
      ;;

    (ir*)
      true # not that easy
      ;;

    (opal)
      true # not that easy
      ;;

    (*-head)
      requirements_check git
      requirements_openmandriva_define "${1%-head}"
      ;;

    (*)
      if [[ ${#rvm_patch_names[@]} -gt 0 || "$1" == *"-head" ]]
      then requirements_version_minimal autoconf 2.67
      else requirements_check autoconf
      fi

      if [[ "${_system_arch}" == "x86_64" || "${_system_arch}" == "aarch64" ]]
      then requirements_check lib64yaml-devel lib64ffi-devel
      else requirements_check libyaml-devel libffi-devel
      fi

      requirements_check autoconf gcc-c++ glibc-devel patch readline sqlite3-devel \
        readline-devel zlib zlib-devel openssl-devel make bzip2 automake libtool bison
      ;;
  esac
}

requirements_rosadesktop_before()
{
  __lib_type=openmandriva
}
scripts/functions/requirements/freebsd000066400000006373147511530560014345 0ustar00#!/usr/bin/env bash

# old handlers before pkgng
requirements_freebsd_lib_installed()
{
  pkg_info | __rvm_grep "^$1" >/dev/null 2>&1 || return $?
}

requirements_freebsd_libs_install()
{
  __rvm_try_sudo pkg_add -r "$@" || return $?
}

# new handlers for pkgng
requirements_freebsd_pkgng_lib_installed()
{
  pkg info | __rvm_grep "^$1" >/dev/null 2>&1 || return $?
}

requirements_freebsd_pkgng_libs_install()
{
  __rvm_try_sudo pkg install -y "$@" || return $?
}

requirements_freebsd_install_node()
{
  # TODO: missing pkgng!
  if
    [[ -d /usr/ports ]]
  then
    __rvm_try_sudo portsnap fetch update  || return $?
  else
    rvm_requiremnts_fail_or_run_action 2 \
      "Skipping portsnap fetch extract, make sure your system is up to date." \
      __rvm_try_sudo portsnap fetch extract || return $?
    packages_flags+=( "portsnap-extracted" )
  fi
  # plain make is required for sudo
  __rvm_try_sudo make -C /usr/ports/www/node install clean || return $?
}

requirements_freebsd_before_detect_package_manager()
{
  if
    __rvm_version_compare ${_system_version} -ge 10.0
  then
    __lib_type="freebsd_pkgng"
  else
    __lib_type="freebsd"
    if
      __rvm_which pkg >/dev/null    &&
      [[ -s /var/db/pkg/local.sqlite ]]
    then
      __lib_type+='_pkgng'
    fi
  fi
}

requirements_freebsd_before()
{
  if
    __rvm_version_compare ${_system_version} -le 10.0
  then
    rvm_warn "rvm is best supported on FreeBSD 10+"
  fi

  requirements_freebsd_before_detect_package_manager
  # TODO: when the time is out deprecate the old pkg_tools https://wiki.freebsd.org/pkgng/CharterAndRoadMap
}

requirements_freebsd_libs_default()
{
  requirements_check autoconf automake libtool bison readline libyaml sqlite3 gdbm
}

requirements_freebsd_update_system()
{
  case "${__lib_type}" in
    (freebsd_pkgng)
      if
        [[ -s /usr/local/etc/pkg.conf ]]
      then
        __rvm_try_sudo pkg update || return $?
      fi
      ;;
  esac
}

requirements_freebsd_define()
{
  case "$1" in
    (rvm)
      requirements_check bash curl
      ;;

    (jruby*)
      requirements_check make openjdk

      if
        is_head_or_disable_binary "$1"
      then
        requirements_check git
        case $( jruby_installation_method  "$1" ) in
          ant) __rvm_which ant >/dev/null || requirements_check apache-ant ;;
          mvn) __rvm_which mvn >/dev/null || requirements_check maven3     ;;
        esac
      fi
      ;;

    (ir*)
      requirements_check mono
      ;;

    (opal)
      requirements_check_custom node
      ;;

    (rbx*)
      if
        __rvm_version_compare ${_system_version} -ge 10.0
      then
        rvm_configure_flags+=( --cc=clang --cxx=clang++ )
        requirements_check gmake llvm35
        rvm_warn "If rbx installation fails, make sure llvm-config is in your PATH"
      else
        rvm_warn "rbx installation by rvm is only supported on FreeBSD 10 or higher"
      fi
      ;;

    (*-head)
      requirements_check git
      requirements_freebsd_define "${1%-head}"
      requirements_freebsd_libs_default
      __rvm_update_configure_opt_dir "$1" "/usr/local"
      ;;

    (*)
      # OpenSSL is installed by default http://www.freebsd.org/crypto.html
      requirements_freebsd_libs_default
      __rvm_update_configure_opt_dir "$1" "/usr/local"
      ;;
  esac
}
scripts/functions/requirements/solus000066400000003336147511530560014074 0ustar00#!/usr/bin/env bash

requirements_solus_lib_installed()
{
  eopkg li --no-color | __rvm_grep "^$1[[:space:]]\+" > /dev/null 2>&1 || return $?
}

requirements_solus_lib_available()
{
  eopkg la --no-color | __rvm_grep "^$1[[:space:]]\+" > /dev/null 2>&1 || return $?
}

requirements_solus_install_custom()
{
  requirements_rvm_pkg_libs_install "$@" || return $?
}

requirements_solus_libs_install()
{
  __rvm_try_sudo eopkg --no-color --yes-all it "$@" || return $?
}

requirements_solus_check_binary()
{
  __rvm_which "$1" >/dev/null || return $?
}

requirements_solus_define()
{
  case "$1" in
    (rvm)
      requirements_check bash curl patch ca-certs gawk bzip2
      ;;

    (jruby*)
      requirements_check make

      if
        is_head_or_disable_binary "$1"
      then
        requirements_solus_check_binary javac ||
          requirements_check_fallback openjdk-8-devel
        requirements_check git
        case $( jruby_installation_method  "$1" ) in
          mvn) requirements_check_custom_after mvn=maven ;;
        esac
      else
        requirements_solus_check_binary java ||
          requirements_check_fallback openjdk-8
      fi
      ;;

    (ir*)
      true
      ;;

    (opal)
      true
      ;;

    (*-head)
      requirements_check git
      requirements_solus_define "${1%-head}"
      requirements_version_minimal autoconf 2.67
      ;;

    (*)
      if [[ ${#rvm_patch_names[@]} -gt 0 ]]
      then requirements_version_minimal autoconf 2.67
      fi
      requirements_check autoconf gcc g++ glibc-devel patch readline readline-devel \
        zlib zlib-devel libffi-devel openssl-devel make bzip2 automake libtool \
        bison sqlite3-devel yaml-devel gmp-devel pkg-config ncurses-devel binutils
      ;;
  esac
}

scripts/functions/requirements/osx_port000066400000014375147511530560014611 0ustar00#!/usr/bin/env bash

requirements_find_osx_port()
{
  if # find macports in PATH
    __rvm_which port >/dev/null 2>&1
  then
    return 0
  else # find macports out of PATH and link to rvm/bin
    \typeset __binary
    for __binary in ~/opt/local/bin/port ~/.opt/local/bin/port /usr/local/bin/port /opt/local/bin/port
    do
      if
        [[ -f "${__binary}" && -s "${__binary}" && -x "${__binary}" ]]
      then
        PATH="$PATH:${__binary%/*}"
        return 0
      fi
    done
    return 1
  fi
}

requirements_osx_port_version_list()
{
  if __rvm_which $1 >/dev/null
  then $1 --version 2>/dev/null | __rvm_sed -n -e '1{s/^.* //; p;}'
  fi
  port -q installed $1* 2>/dev/null | __rvm_sed -e 's/.* @//' -e 's/_.*//' -e 's/ .*//'
}

requirements_osx_port_lib_available()
{
  port info $1 >/dev/null 2>&1 || return $?
}

requirements_osx_port_lib_installed()
{
  port -q installed $1 | __rvm_grep active >/dev/null || return $? ;
}

requirements_osx_port_libs_install()
{
  __rvm_try_sudo port install "$@" ||
  {
    \typeset ret=$?
    # TODO: offer more help!
    rvm_warn "There were package installation errors, make sure to read the log."
    return $ret
  }
}

requirements_osx_port_before()
{
  requirements_osx_port_ensure_port_available || return $?
}

requirements_osx_port_libs_default()
{
  port_libs=(
    autoconf automake gdbm libffi libiconv libksba libtool libyaml pkgconfig readline sqlite3 zlib
  )
  
  case "$1" in
    (*-head) __rvm_which git >/dev/null || port_libs+=( git )
      ;;
  esac
  
  __rvm_selected_compiler >/dev/null ||
  case "$1" in
    (ruby-1*|ree*)
      if
        __rvm_compiler_is_llvm # install gcc only if not yet available
      then
        if __rvm_version_compare "${_system_version}" -ge 10.8
        then port_libs+=( gcc49 )
        else port_libs+=( apple-gcc42 )
        fi
      fi
      ;;
  esac
  
  # LibreSSL is a fork of OpenSSL and is interchangable
  # If it is installed, then don't worry about OpenSSL
  if
    ! requirements_osx_port_lib_installed libressl
  then
    port_libs+=( openssl )
  fi
  
  if
    requirements_osx_port_lib_installed ncursesw
  then
    rvm_error "\
Error! ncursesw was replaced by ncurses a long time ago, please uninstall 'ncursesw',
         for more details check http://comments.gmane.org/gmane.os.apple.macports.user/28039"
    return 1
  else
    port_libs+=( ncurses  )
  fi
  
  requirements_check_fallback curl-ca-bundle certsync || return $?
  requirements_check "${port_libs[@]}" || return $?
}

requirements_osx_port_update_system()
{
  __rvm_try_sudo port -dv selfupdate || return $?
}

requirements_osx_port_define()
{
  case "$1" in
    (rvm)
      true
      ;;

    (jruby*)
      requirements_check make

      if
        is_head_or_disable_binary "$1"
      then
        __rvm_which git >/dev/null || requirements_check git
        case $( jruby_installation_method  "$1" ) in
          mvn) requirements_check_custom_after mvn=maven ;;
        esac
      fi

      requiremnts_osx_java_fail || return $?
      ;;

    (ir*)
      __rvm_which mono >/dev/null 2>&1 || return $?
      ;;

    (opal)
      requirements_osx_port_libs_ensure node
      ;;

    (truffleruby*)
      requirements_check openssl
      ;;

    (ruby*head)
      __rvm_which git >/dev/null || requirements_check git
      requirements_osx_port_libs_default "$1"
      requirements_version_minimal autoconf 2.67
      ;;

    (*-head)
      __rvm_which git >/dev/null || requirements_check git
      requirements_osx_port_libs_default "$1" || return $?
      ;;

    (*)
      requirements_osx_port_libs_default "$1" || return $?
      ;;
  esac
}

requirements_osx_port_after()
{
  \typeset port_root
  port_root="$( __rvm_which port 2>/dev/null )" && # get    binary and
  [[ -n "${port_root}" && -x "${port_root}"  ]] && # verify binary and
  __rvm_readlink_deep port_root                    # resolve any links to point to the final target
  [[ -n "${port_root}" && -x "${port_root}"  ]] && # verify binary and
  port_root="${port_root%%/bin/port}"              # get    root
  [[ -n "${port_root}" && -d "${port_root}" ]]  || # verify root   or
  port_root="/opt/local"                           # fallback to default

  __rvm_update_configure_opt_dir "$1" "${port_root}" || return $?

  __rvm_selected_compiler >/dev/null ||
  case "${port_libs[*]}" in
    (*apple-gcc42*)
      export CC=gcc-apple-4.2
      ;;
    (*gcc48*)
      export CC=gcc-mp-4.8
      ;;
    (*gcc49*)
      export CC=gcc-mp-4.9
      ;;
  esac

  unset port_libs

  __rvm_add_to_path prepend "${port_root}/bin"
  rvm_debug "PATH=$PATH"

  case "$1" in
    (jruby*) true ;;
    (*) requirements_osx_port_after_update_certs_openssl ;;
  esac
}

requirements_osx_port_after_update_certs_openssl()
{
  requirements_osx_update_openssl_cert "${port_root}/bin/openssl" || return $?
}

requirements_osx_port_install_port()
{
  \typeset macports_version
  macports_version="$(
    __rvm_curl https://distfiles.macports.org/MacPorts/ |
    __rvm_grep -Eo "<a href=\"MacPorts-[[:digit:]\.]+.tar.bz2\">" |
    __rvm_awk -F'"' '{print $2}' |
    __rvm_version_sort |
    __rvm_tail -n 1
  )" #'
  macports_version="${macports_version%.tar.bz2}"
  : macports_version:${macports_version:=MacPorts-2.1.3}
  mkdir "${rvm_src_path}/${macports_version}"
  cd    "${rvm_src_path}/${macports_version}"
  __rvm_curl "https://distfiles.macports.org/MacPorts/${macports_version}.tar.bz2" | tar -xj --strip 1
  __rvm_check_pipestatus ${PIPESTATUS[@]} ${pipestatus[@]} || return $?
  ./configure &&
  __rvm_make &&
  # plain make is required for sudo
  __rvm_try_sudo make install || return $?
  true # for OSX
}

requirements_osx_port_ensure_port_available()
{
  __rvm_which port >/dev/null ||
  {
    __rvm_which make > /dev/null &&
    {
      __rvm_which clang > /dev/null ||
      __rvm_which gcc-4.2 > /dev/null
    } ||
    {
      rvm_error "Can not find compiler and 'make' tool - make sure Xcode and/or Command Line Tools are installed."
      return 11
    }
    rvm_requiremnts_fail_or_run_action 2 \
      "Requested installation with macports libs, but macports is not available." \
      __rvm_log_command port_install "Installing macports" requirements_osx_port_install_port ||
      return $?

    # make sure the new installation is in PATH
    __rvm_which port >/dev/null || PATH="$PATH:/opt/local/bin"
  }
  true # for OSX
}
scripts/functions/requirements/synology000066400000003510147511530560014604 0ustar00#!/usr/bin/env bash

source "$rvm_scripts_path/functions/pkg"

requirements_synology_lib_installed()
{
  ipkg list_installed | __rvm_grep "^$1 - " >/dev/null 2>&1 || return $?
}

requirements_synology_lib_available()
{
  ipkg list | __rvm_grep "^$1 - " >/dev/null 2>&1 || return $?
}

requirements_synology_libs_install()
{
  __rvm_try_sudo ipkg add -z "$@" || return $?
}

requirements_synology_install_custom()
{
  requirements_rvm_pkg_libs_install "$@" || return $?
}

requirements_synology_check_binaries()
{
  \typeset -a __missing_binaries
  __missing_binaries=()
  while
    (( $# ))
  do
    __rvm_which $1 >/dev/null || __missing_binaries+=( $1 )
    shift
  done
  if
    (( ${#__missing_binaries[@]} ))
  then
    rvm_error "Missing required binaries: ${__missing_binaries[*]} - make sure those are installed to continue."
    return ${#__missing_binaries[@]}
  fi
  true
}

requirements_synology_define()
{
  case "$1" in
    (rvm)
      true
      ;;

    (jruby*)
      requirements_check make

      if
        is_head_or_disable_binary "$1"
      then
        case $( jruby_installation_method  "$1" ) in
          ant) requirements_synology_check_binaries java git ant || return $? ;;
          mvn) requirements_synology_check_binaries java git mvn || return $? ;;
        esac
      else
        requirements_synology_check_binaries java || return $?
      fi
      ;;

    (ir*)
      requirements_synology_check_binaries mono || return $?
      ;;

    (opal)
      requirements_synology_check_binaries node || return $?
      ;;

    (*-head)
      requirements_check git
      requirements_synology_define "${1%-head}"
      ;;

    (*)
      requirements_check gcc autoconf automake libtool bison readline openssl
      requirements_rvm_pkg_lib_installed_custom yaml
      __rvm_update_configure_opt_dir "$1" "/usr/local"
      ;;
  esac
}
scripts/functions/requirements/redhat000066400000000677147511530560014203 0ustar00#!/usr/bin/env bash

source "$rvm_scripts_path/functions/requirements/centos"

requirements_redhat_define_glibc()
{
  requirements_check glibc-headers glibc-devel
}

requirements_redhat_define_libyaml()
{
  case "$1" in
    (ruby-1*) requirements_check libyaml-devel ;;
  esac
}

requirements_redhat_define_openssl()
{
  requirements_check openssl-devel
}

requirements_redhat_define()
{
  __lib_type=centos
  
  requirements_centos_define "$@"
}
scripts/functions/requirements/clearos000066400000000634147511530560014355 0ustar00#!/usr/bin/env bash

source "$rvm_scripts_path/functions/requirements/centos"

requirements_clearos_define_glibc()
{
  requirements_check glibc-headers glibc-devel
}

requirements_clearos_define_libyaml()
{
  requirements_check libyaml-devel
}

requirements_clearos_define_openssl()
{
  requirements_check openssl-devel
}

requirements_clearos_define()
{
  __lib_type=centos

  requirements_centos_define "$@"
}
scripts/functions/requirements/gentoo000066400000003206147511530560014216 0ustar00#!/usr/bin/env bash

source "$rvm_scripts_path/functions/requirements/gentoo_paludis"
source "$rvm_scripts_path/functions/requirements/gentoo_pkgcore"
source "$rvm_scripts_path/functions/requirements/gentoo_portage"

requirements_gentoo_before()
{
  \typeset __iterator
  for __iterator in gentoo_portage gentoo_paludis gentoo_pkgcore
  do
    if
      requirements_find_${__iterator}
    then
      __lib_type=${__iterator}
      return 0
    fi
  done

  # fallback
  __lib_type=gentoo_portage
}

requirements_gentoo_define()
{
  case "$1" in
    (rvm)
      requirements_check net-misc/curl sys-devel/patch app-shells/bash
      ;;

    (jruby*)
      requirements_check make

      if
        is_head_or_disable_binary "$1"
      then
        requirements_check virtual/jdk dev-vcs/git
        case $( jruby_installation_method  "$1" ) in
          ant) requirements_check dev-java/ant-core  ;;
          mvn) requirements_check dev-java/maven-bin ;;
        esac
      else
        requirements_check virtual/jre
      fi
      ;;

    (truffleruby*)
      requirements_check sys-libs/zlib dev-libs/openssl net-misc/curl sys-devel/make sys-devel/gcc dev-libs/libxml2
      ;;

    (ir*)
      requirements_check dev-lang/mono
      ;;

    (opal)
      requirements_check net-libs/nodejs
      ;;

    (*-head)
      requirements_gentoo_define "${1%-head}"
      requirements_check dev-vcs/git
      ;;

    (*)
      requirements_check virtual/libiconv sys-libs/readline sys-libs/zlib dev-libs/openssl net-misc/curl dev-libs/libyaml dev-db/sqlite sys-devel/libtool sys-devel/gcc sys-devel/autoconf sys-devel/automake sys-devel/bison sys-devel/m4
      ;;
  esac
}
scripts/functions/requirements/mageia000066400000000763147511530560014153 0ustar00#!/usr/bin/env bash

source "$rvm_scripts_path/functions/requirements/centos"

requirements_mageia_define_glibc()
{
  requirements_check glibc-devel
}

requirements_mageia_define_libyaml()
{
  if
    [[ "${_system_arch}" == "x86_64" ]]
  then
    requirements_check lib64yaml-devel
  else
    requirements_check libyaml-devel
  fi
}

requirements_mageia_define_openssl()
{
  requirements_check openssl-devel
}

requirements_mageia_define()
{
  __lib_type=centos

  requirements_centos_define "$@"
}
scripts/functions/requirements/unknown000066400000004074147511530560014426 0ustar00#!/usr/bin/env bash

requirements_unknown_binaries()
{
  while
    (( $# ))
  do
    __rvm_which "$1" >/dev/null || missing_libs+=( "$1" )
    shift
  done
}

requirements_unknown_run()
{
  case "$1" in
    (update-system)
      echo "Always update your system first!"
      ;;

    (rvm)
      requirements_unknown_binaries bash curl patch
      ;;

    (jruby*)
      requirements_unknown_binaries make java

      if
        is_head_or_disable_binary "$1"
      then
        requirements_unknown_binaries git
        case $( jruby_installation_method  "$1" ) in
          ant) requirements_unknown_binaries ant ;;
          mvn) requirements_unknown_binaries mvn ;;
        esac
      fi
      ;;

    (ir*)
      requirements_unknown_binaries mono
      ;;

    (opal)
      requirements_unknown_binaries nodejs npm
      ;;

    (*-head)
      requirements_unknown_binaries openssl sqlite3 libtool autoconf automake bison pkg-config git
      missing_libs+=( build-essential libreadline zlib1g libyaml libc6 libgdbm ncurses )
      ;;

    (*)
      requirements_unknown_binaries openssl sqlite3 libtool autoconf automake bison pkg-config git
      missing_libs+=( build-essential libreadline zlib1g libyaml libc6 libgdbm ncurses )
      ;;
  esac
}

requirements_unknown_wait_key()
{
  rvm_is_a_shell_function no_warning ||
  {
    rvm_error "
RVM was not able to detect your system type and does not know how to load extra library paths for your system (if it's needed), read:

    rvm help autolibs

for details how to disable this message.
"
    return 1
  }
  rvm_log "press any key to continue"
  \typeset _read_char_flag anykey
  [[ -n "${ZSH_VERSION:-}" ]] && _read_char_flag=k || _read_char_flag=n
  builtin read -${_read_char_flag} 1 -s -r anykey
}

requirements_unknown_update_system()
{
  echo "Always update your system first!"
}

requirements_unknown_define()
{
  \typeset __reqirement
  \typeset -a missing_libs
  missing_libs=()
  for __reqirement
  do requirements_unknown_run "${__reqirement}"
  done
  echo "Install: ${missing_libs[*]}"
  requirements_unknown_wait_key || return $?
}
scripts/functions/requirements/opensuse000066400000004524147511530560014570 0ustar00#!/usr/bin/env bash

source "$rvm_scripts_path/functions/pkg"

requirements_opensuse_lib_available()
{
  zypper search --provides --match-exact "$1" >/dev/null 2>&1 || return $?
}

requirements_opensuse_lib_installed()
{
  rpm -q --whatprovides "$1" >/dev/null || return $?
}

requirements_opensuse_libs_install()
{
  __rvm_try_sudo zypper install -y "$@" || return $?
}

requirements_opensuse_libs_remove()
{
  __rvm_try_sudo zypper rm -y "$@" || return $?
}

requirements_opensuse_update_system()
{
  __rvm_try_sudo zypper --gpg-auto-import-keys refresh ||
  __rvm_try_sudo zypper refresh || # just in case the flag was not supported
  return $?
}

requirements_opensuse_install_custom()
{
  requirements_rvm_pkg_libs_install "$@" || return $?
}

requirements_opensuse_define_libyaml()
{
  requirements_check libyaml-devel
}

requirements_opensuse_define_default()
{
  undesired_check libressl-devel

  requirements_check automake binutils bison bzip2 libtool m4 make patch \
    gdbm-devel glibc-devel libffi-devel libopenssl-devel readline-devel \
    sqlite3-devel zlib-devel

  requirements_${_system_name_lowercase}_define_libyaml

  if
    __rvm_version_compare "${_system_version}" -ge 12.0
    then requirements_check libdb-4_8
    else requirements_check libdb-4_5
  fi
}

requirements_opensuse_define()
{
  case "$1" in
    (rvm)
      requirements_check bash curl patch
      ;;

    (jruby*)
      requirements_check make

      if is_head_or_disable_binary "$1"
      then requirements_check java-devel git
      else requirements_check java
      fi

      case $( jruby_installation_method  "$1" ) in
        ant) requirements_check ant                    ;;
        mvn) requirements_check_custom_after mvn=maven ;;
      esac
      ;;

    (ir*)
      requirements_check mono
      ;;

    (opal)
      requirements_check nodejs
      ;;

    (*-head)
      requirements_check autoconf git
      requirements_opensuse_define "${1%-head}"
      ;;

    (rbx*|rubinius*)
      requirements_opensuse_define_default
      requirements_check_fallback llvm-devel llvm6-devel llvm5-devel llvm4-devel
      requirements_check_fallback clang clang6 clang5 clang4
      ;;

    (truffleruby*)
      requirements_check zlib-devel libopenssl-devel make gcc libxml2
      ;;

    (*)
      requirements_opensuse_define_default
      requirements_check gcc gcc-c++
      ;;
  esac
}
scripts/functions/requirements/scientific000066400000000650147511530560015043 0ustar00#!/usr/bin/env bash

source "$rvm_scripts_path/functions/requirements/centos"

requirements_scientific_define_glibc()
{
  requirements_check glibc-headers glibc-devel
}

requirements_scientific_define_libyaml()
{
  requirements_check libyaml-devel
}

requirements_scientific_define_openssl()
{
  requirements_check openssl-devel
}

requirements_scientific_define()
{
  __lib_type=centos

  requirements_centos_define "$@"
}
scripts/functions/requirements/openmandriva000066400000003553147511530560015413 0ustar00#!/usr/bin/env bash

requirements_openmandriva_lib_installed()
{
  rpm -q --whatprovides "$1" >/dev/null || return $?
}

requirements_openmandriva_lib_available()
{
  urpmq "$1" >/dev/null 2>&1 || return $?
}

requirements_openmandriva_version_list()
{
  rpm -q --whatprovides "$1" | sed -e "s#^$1-##"
}

requirements_openmandriva_libs_install()
{
  __rvm_try_sudo urpmi --downloader wget --wget-options --auth-no-challenge --auto "$@" || return $?
}

requirements_openmandriva_update_system()
{
  __rvm_try_sudo urpmi.update -a ||
  {
    \typeset __ret=$?
    case ${__ret} in
      (100)
        rvm_error "There has been error while updating 'urpmi.update', please give it some time and try again later.
404 errors should be fixed for rvm to proceed. Check your sources configured in:
    /etc/urpmi/urpmi.cfg
"
        ;;
    esac
    return ${__ret}
  }
}

requirements_openmandriva_define()
{
  case "$1" in
    (rvm)
      requirements_check bash curl patch
      ;;

    (jruby*)
      requirements_check make
      
      true # not that easy
      ;;

    (ir*)
      true # not that easy
      ;;

    (opal)
      true # not that easy
      ;;

    (*-head)
      requirements_check git
      requirements_openmandriva_define "${1%-head}"
      ;;

    (*)
      if [[ ${#rvm_patch_names[@]} -gt 0 || "$1" == *"-head" ]]
      then requirements_version_minimal autoconf 2.67
      else requirements_check autoconf
      fi

      if [[ "${_system_arch}" == "x86_64" || "${_system_arch}" == "aarch64" ]]
      then requirements_check lib64yaml-devel lib64ffi-devel
      else requirements_check libyaml-devel libffi-devel
      fi

      requirements_check autoconf gcc-c++ glibc-devel patch readline sqlite3-devel \
        readline-devel zlib zlib-devel openssl-devel make bzip2 automake libtool bison
      ;;
  esac
}

requirements_rosadesktop_before()
{
  __lib_type=openmandriva
}
scripts/functions/requirements/netbsd000066400000005072147511530560014205 0ustar00#!/usr/bin/env bash

requirements_netbsd_lib_installed()
{
  [[ -f /etc/mtree/set.$1 ]] || return $?
}

requirements_netbsd_libs_install()
{
  \typeset _set_base_url _set _set_url _set_md5
  _set_base_url="http://ftp.netbsd.org/pub/NetBSD/NetBSD-${_system_version_full}/${_system_arch/x86_64/amd64}/binary/sets"
  for _set in "$@"
  do
    _set_url="${_set_base_url}/${_set}.tgz"
    _set_md5="$(__rvm_curl -s ${_set_base_url}/MD5 | __rvm_grep "(${_set}.tgz)" | __rvm_awk '{print $NF}')"
    __rvm_curl ${_set_url} -o ${rvm_archives_path}/${_set}.tgz || return $?
    [[ "$(__rvm_md5_calculate ${rvm_archives_path}/${_set}.tgz)" == ${_set_md5} ]] ||
      {
        \typeset result=$?
        rvm_error "Set checksum verification failed"
        return $result
      }
    __rvm_try_sudo tar xzf ${rvm_archives_path}/${_set}.tgz -C / || return $?
  done
}

requirements_netbsd_check_custom()
{
  \typeset _lib
  for _lib in "$@"
  do
    [[ " ${packages_custom[*]} " == *" ${_lib} "* ]] ||
    requirements_netbsd_custom_lib_installed "${_lib}" ||
    __rvm_add_once packages_custom "${_lib}"
  done
}

requirements_netbsd_custom_lib_installed()
{
  pkg_info -qE "$1" || return $?
}

requirements_netbsd_install_custom()
{
  __rvm_try_sudo \
    PKG_PATH="http://ftp.netbsd.org/pub/pkgsrc/packages/NetBSD/amd64/${_system_version}/All/" \
    pkg_add "$@" || return $?
}

requirements_netbsd_after()
{
  \typeset _certs
  _certs="$(__rvm_ls /etc/openssl/certs)"
  [[ ! -n "${certs}" && -f /etc/ssl/certs/ca-certificates.crt ]] ||
    __rvm_try_sudo mozilla-rootcerts install >/dev/null 2>&1 || return $?
}

requirements_netbsd_define()
{
  case "$1" in
    (rvm)
      requirements_netbsd_check_custom bash curl mozilla-rootcerts p5-Digest-SHA
      ;;

    (jruby*)
      requirements_netbsd_check_custom openjdk7 make
      if
        is_head_or_disable_binary "$1"
      then
        case $( jruby_installation_method  "$1" ) in
          ant) __rvm_which ant >/dev/null || requirements_netbsd_check_custom apache-ant   ;;
          mvn) __rvm_which mvn >/dev/null || requirements_netbsd_check_custom apache-maven ;;
        esac
      fi
      ;;

    (ir*)
      true
      ;;

    (opal)
      true
      ;;

    (*-head)
      requirements_check comp
      requirements_netbsd_check_custom automake autoconf libtool bison gdbm libffi libyaml scmgit
      __rvm_update_configure_opt_dir "$1" "/usr/pkg"
      ;;

    (*)
      requirements_check comp
      requirements_netbsd_check_custom automake autoconf libtool bison gdbm libffi libyaml
      __rvm_update_configure_opt_dir "$1" "/usr/pkg"
      ;;
  esac
}
scripts/functions/requirements/osx_fink000066400000013772147511530560014554 0ustar00#!/usr/bin/env bash

requirements_find_osx_fink()
{
  if # find macports in PATH
    __rvm_which fink >/dev/null 2>&1
  then
    return 0
  else # find fink out of PATH and link to rvm/bin
    \typeset __binary
    for __binary in ~/sw/bin/fink ~/.sw/bin/fink /sw/bin/fink /usr/local/bin/fink
    do
      if
        [[ -f "${__binary}" && -s "${__binary}" && -x "${__binary}" ]]
      then
        PATH="$PATH:${__binary%/*}"
        return 0
      fi
    done
    return 1
  fi
}

requirements_osx_fink_path()
(
  \typeset fink_binary="$( __rvm_which fink )"
  __rvm_readlink_deep fink_binary
  echo "${fink_binary%/bin/fink}"
)

requirements_osx_fink_packages_path()
{
  __rvm_awk '/Basepath:/ {print$2}' < "$(requirements_osx_fink_path)"/etc/fink.conf
}

__rvm_fink_sudo()
{
  if
    [[ -w "$( requirements_osx_fink_path )" &&
       -w "$( requirements_osx_fink_packages_path )"
    ]]
  then
    "$@" || return $?
  else
    __rvm_try_sudo "$@" || return $?
  fi
}

requirements_osx_fink_lib_installed()
{
  fink list -i $1 2>/dev/null | __rvm_awk 'BEGIN{result=1} $2=="'"$1"'" {result=0} END{exit result}' || return $?
}

requirements_osx_fink_libs_install()
{
  __rvm_fink_sudo fink --yes install "$@"  ||
  {
    \typeset ret=$?
    rvm_warn "There were package installation errors, make sure to read the log."
    return $ret
  }
}

requirements_osx_fink_update_system()
{
  # enable unstable for needed packages
  __rvm_fink_sudo __rvm_sed -i'' -e 's#^\(Trees: .*\)$#\1 unstable/main#' "$(requirements_osx_fink_path)"/etc/fink.conf

  # update package definitions
  __rvm_log_command fink_update "Updating fink" __rvm_fink_sudo fink selfupdate || return $?
}

requirements_osx_fink_gcc_version_detect()
{
  if
    __rvm_version_compare "${_system_version}" -le 10.5
  then
    fink_libs+=( gcc43 )
  elif
    __rvm_version_compare "${_system_version}" -le 10.6
  then
    fink_libs+=( gcc45 )
  elif
    __rvm_version_compare "${_system_version}" -le 10.7
  then
    fink_libs+=( gcc46 )
  elif 
    __rvm_version_compare "${_system_version}" -le 10.10
  then 
    _libs+=( gcc49 )
  else # 10.10
    fink_libs+=( gcc49 )
  fi
}

requirements_osx_fink_libs_default_tools()
{
  fink_libs+=( autoconf2.6 automake1.14 pkgconfig )

  if
    __rvm_version_compare "${_system_version}" -le 10.6
  then
    fink_libs+=( libtool14 )
  fi

  if
    ! __ruby_clang_ok "$1" &&
    [[ -z "${selected_compiler}" || "${selected_compiler}" == *"gcc-4.2"* ]]
  then
    # install gcc only if no gcc-4.2 available, prevents problems with gcc-4.2 on OSX 10.6
    __rvm_which gcc-4.2 >/dev/null || requirements_osx_fink_gcc_version_detect
  fi
}

requirements_osx_fink_libs_default_libs()
{
  \typeset __lib

  for __lib in libyaml readline6 libksba8 sqlite3
  do
    fink_libs+=( ${__lib} ${__lib}-shlibs )
  done

  case "$1" in
    (ruby-1.8*|ree-1.8*)
      rvm_error "Ruby: $1 is not supported with Fink, consider switching Autolibs to Macports or Homebrew:
    rvm autolibs port # OR:
    rvm autolibs brew
"
      return 12
      ;;
    (*)
      fink_libs+=( openssl openssl100-dev openssl100-shlibs )
      ;;
  esac
  fink_libs+=( ca-bundle )
}

requirements_osx_fink_libs_default()
{
  # FIXME: what packages are needed for installation
  # lib search => http://pdb.finkproject.org/pdb/browse.php?summary=openssl
  \typeset -a fink_libs
  fink_libs=()

  requirements_osx_fink_libs_default_tools "$@" || return $?
  requirements_osx_fink_libs_default_libs  "$@" || return $?

  requirements_check "${fink_libs[@]}" || return $?
}

requirements_osx_fink_define()
{
  case "$1" in
    (rvm)
      true
      ;;

    (jruby*)
      requirements_check make

      if
        is_head_or_disable_binary "$1"
      then
        __rvm_which git >/dev/null || requirements_check git
        case $( jruby_installation_method  "$1" ) in
          mvn) requirements_check_custom_after mvn=maven ;;
        esac
      fi

      requiremnts_osx_java_fail || return $?
      ;;

    (ir*)
      __rvm_which mono >/dev/null 2>&1 || return $?
      ;;

    (opal)
      requirements_check node
      ;;

    (truffleruby*)
      requirements_osx_fink_libs_default "$1"
      ;;

    (*-head)
      __rvm_which git >/dev/null || requirements_check git
      requirements_osx_fink_libs_default "$1"
      ;;

    (*)
      requirements_osx_fink_libs_default "$1"
      ;;
  esac
}

requirements_osx_fink_libs_configure()
{
  \typeset package fink_lib fink_lib_prefix
  package="$1"

  if
    # FIXME: how to find out package paths
    fink_lib_prefix="$( requirements_osx_fink_packages_path )" &&
    [[ -n "${fink_lib_prefix}" && -d "${fink_lib_prefix}" ]]
  then
    __rvm_update_configure_opt_dir "${package}" "${fink_lib_prefix}"
  fi
}

requirements_osx_fink_after()
{
  requirements_osx_fink_libs_configure "$1" || return $?

  case "$1" in
    (jruby*) true ;;
    (*) requirements_osx_fink_after_update_certs_openssl ;;
  esac
}

requirements_osx_fink_after_update_certs_openssl()
{
  requirements_osx_update_openssl_cert "$(requirements_osx_fink_packages_path)/bin/openssl" || return $?
}

requirements_osx_fink_install_fink()
{
  \typeset fink_home fink_version
  fink_version=0.34.8
  rvm_warn "About to install fink-${fink_version}, press ENTER to use default answers.
Make sure to watch the graphical login, questions for X11 installation will appear!"

  mkdir -p "${rvm_src_path}/fink-${fink_version}" || return $?
  __rvm_curl http://downloads.sourceforge.net/fink/fink-${fink_version}.tar.gz |
    tar xz --strip 1 -C "${rvm_src_path}/fink-${fink_version}"
  __rvm_check_pipestatus ${PIPESTATUS[@]} ${pipestatus[@]} || return $?
  cd "${rvm_src_path}/fink-${fink_version}"

  __rvm_try_sudo ./bootstrap /sw && /sw/bin/pathsetup.sh || return $?

  PATH="$PATH:/sw/bin"
}

requirements_osx_fink_ensure_fink_available()
{
  __rvm_which fink >/dev/null ||
  {
    rvm_requiremnts_fail_or_run_action 2 \
      "Requested installation with fink libs, but fink is not available." \
      requirements_osx_fink_install_fink ||
      return $?
  }
}

requirements_osx_fink_before()
{
  requirements_osx_fink_ensure_fink_available || return $?
}
scripts/functions/requirements/dragonfly000066400000002424147511530560014711 0ustar00#!/usr/bin/env bash

# new handlers for pkgng
requirements_dragonfly_lib_installed()
{
  pkg info | __rvm_grep "^$1" >/dev/null 2>&1 || return $?
}

requirements_dragonfly_libs_install()
{
  __rvm_try_sudo pkg install -y "$@" || return $?
}

requirements_dragonfly_update_system()
{
    __rvm_try_sudo pkg update || return $?
}

requirements_dragonfly_define()
{
  case "$1" in
    (rvm)
      requirements_check bash curl
      ;;

    (jruby*)
      requirements_check make jdk

      if
        is_head_or_disable_binary "$1"
      then
        requirements_check git
        case $( jruby_installation_method  "$1" ) in
          ant) __rvm_which ant >/dev/null || requirements_check apache-ant ;;
          mvn) requirements_check_custom_after mvn=maven                   ;;
        esac
      fi
      ;;

    (truffleruby*)
      requirements_check openssl gmake gcc libxml2
      ;;

    (ir*)
      requirements_check mono
      ;;

    (opal)
      requirements_check node
      ;;

    (*-head)
      requirements_check git
      requirements_freebsd_define "${1%-head}"
      ;;

    (*)
      # OpenSSL is installed by default
      requirements_check autoconf automake libtool bison readline libyaml sqlite3 gdbm
      __rvm_update_configure_opt_dir "$1" "/usr/local"
      ;;
  esac
}
scripts/functions/requirements/elementary000066400000001632147511530560015071 0ustar00#!/usr/bin/env bash

source "$rvm_scripts_path/functions/requirements/debian"

requirements_elementary_define_libgmp()
{
  requirements_check libgmp-dev
}

requirements_elementary_define_libreadline()
{
  requirements_check libreadline6-dev
}

requirements_elementary_define_libssl()
{
  case "$1" in
    (ruby-2.3*|ruby-2.2*|ruby-2.1*|ruby-2.0*|ruby-1.9*)
      if
        __rvm_version_compare ${_system_version} -ge 5
      then
        undesired_check libssl-dev
        requirements_check libssl1.0-dev
      else
        requirements_check libssl-dev
      fi
      ;;

    (*)
      requirements_check libssl-dev
      ;;
  esac
}

requirements_elementary_define_clang_llvm()
{
  requirements_check clang-3.6 llvm-3.6 llvm-3.6-dev
  rvm_configure_flags+=( --cc=clang-3.6 --cxx=clang++-3.6 --llvm-config=llvm-config-3.6)
}


requirements_elementary_define()
{
  __lib_type=debian
  requirements_debian_define "$@"
}
scripts/functions/requirements/devuan000066400000001107147511530560014203 0ustar00#!/usr/bin/env bash

source "$rvm_scripts_path/functions/requirements/debian"

requirements_devuan_define_libgmp()
{
  requirements_check libgmp-dev
}

requirements_devuan_define_libreadline()
{
  requirements_check libreadline6-dev
}

requirements_devuan_define_libssl()
{
  requirements_check libssl-dev
}

requirements_devuan_define_clang_llvm()
{
  requirements_check clang-3.6 llvm-3.6 llvm-3.6-dev
  rvm_configure_flags+=( --cc=clang-3.6 --cxx=clang++-3.6 --llvm-config=llvm-config-3.6)
}

requirements_devuan_define()
{
  __lib_type=debian
  requirements_debian_define "$@"
}
scripts/functions/requirements/omnios000066400000010474147511530560014234 0ustar00#!/usr/bin/env bash

requirements_openindiana_lib_installed()
{
  pkg info "$1" > /dev/null 2>&1 || return $?
}

requirements_openindiana_lib_available()
{
  pkg info -r "$1" > /dev/null 2>&1 || return $?
}

requirements_openindiana_custom_lib_installed()
{
  pkginfo -q "$1" || return $?
}

requirements_openindiana_libs_install()
{
  __rvm_try_sudo pkg install "$@" ||
  {
    \typeset ret=$?
    case $ret in
      (4) return 0 ;; # means the package does not need updates
    esac
    return $ret
  }
}

requirements_openindiana_update_system()
{
  __rvm_try_sudo pkg refresh && __rvm_try_sudo pkg update ||
  {
    \typeset ret=$?
    case $ret in
      (4) return 0 ;; # means nothing to install
    esac
    return $ret
  }
}

requirements_openindiana_check_custom()
{
  for lib in "$@"
  do
    [[ " ${packages_custom[*]} " == *" $lib "* ]] ||
    requirements_openindiana_custom_lib_installed "$lib" || __rvm_add_once packages_custom "$lib"
  done
  unset lib
}

requirements_openindiana_check_opencsw_enabled()
{
  requirements_openindiana_custom_lib_installed CSWpkgutil || return $?
}

requirements_openindiana_enable_opencsw()
{
  __rvm_try_sudo pkgadd -a $rvm_path/config/solaris/noask -d https://get.opencsw.org/now CSWpkgutil > /dev/null 2>&1 || return $?
}

requirements_openindiana_install_custom()
{
  requirements_openindiana_check_opencsw_enabled || requirements_openindiana_enable_opencsw
  __rvm_try_sudo /opt/csw/bin/pkgutil -iy "$@" -t https://mirror.opencsw.org/opencsw/unstable || return $?
}

requirements_openindiana_after()
{
  # https://www.illumos.org/issues/782
  if ! __rvm_which automake >/dev/null 2>&1 && __rvm_which /usr/bin/automake-1.10 >/dev/null 2>&1
  then ln -s /usr/bin/automake-1.10 "${rvm_bin_path}"/automake
  fi
  if ! __rvm_which aclocal >/dev/null 2>&1 && __rvm_which /usr/bin/aclocal-1.10 >/dev/null 2>&1
  then ln -s /usr/bin/aclocal-1.10 "${rvm_bin_path}"/aclocal
  fi
}

requirements_openindiana_define()
{
  case "$1" in
    (rvm)
      requirements_check bash curl text/gnu-patch
      ;;

    (jruby*)
      requirements_check make jdk

      if
        is_head_or_disable_binary "$1"
      then
        requirements_check git
        case $( jruby_installation_method  "$1" ) in
          ant) requirements_check apache-ant             ;;
          mvn) requirements_check_custom_after mvn=maven ;;
        esac
      fi
      ;;

    (ir*)
      requirements_check mono
      ;;

    (opal)
      requirements_check runtime/javascript/nodejs
      ;;

    (*-head)
      requirements_check git
      requirements_openindiana_define "${1%-head}"
      ;;

    (*)
      requirements_check_fallback \
        developer/gcc47 developer/gcc-47 \
        developer/gcc46 developer/gcc-46 \
        developer/gcc44 developer/gcc-43 developer/gcc/gcc-43
      requirements_check_fallback \
        developer/build/automake \
        developer/build/automake-111 \
        developer/build/automake-110
      requirements_check \
        text/gnu-patch system/header developer/build/autoconf \
        developer/build/libtool system/library/math/header-math \
        file/gnu-coreutils developer/object-file developer/build/gnu-make
      requirements_openindiana_check_custom CSWlibyaml-dev
      __rvm_update_configure_opt_dir "$1" "/opt/csw"
      ;;
  esac
}

requirements_openindiana_after()
{
  if is_a_function requirements_openindiana_after_${_system_name}
  then requirements_openindiana_after_${_system_name} || return $?
  else requirements_openindiana_after_Other || return $?
  fi
}

requirements_openindiana_after_OmniOS()
{
  case "${packages_installed[*]}" in
    (*developer/gcc47*)
      __rvm_update_configure_env CC="/opt/gcc-4.7.2/bin/gcc" ;;
    (*developer/gcc-3*)
      __rvm_update_configure_env CC="/usr/sfw/bin/gcc" ;;
    (*)
      return 1 ;;
  esac
}

requirements_openindiana_after_Other()
{
  case "${packages_installed[*]}" in
    (*developer/gcc47*|*developer/gcc-47*)
      __rvm_update_configure_env CC="/usr/gcc/4.7/bin/gcc" ;;
    (*developer/gcc46*|*developer/gcc-46*)
      __rvm_update_configure_env CC="/usr/gcc/4.6/bin/gcc" ;;
    (*developer/gcc44*)
      __rvm_update_configure_env CC="/usr/gcc/4.4/bin/gcc" ;;
    (*developer/gcc-43*|*developer/gcc/gcc-43*)
      __rvm_update_configure_env CC="/usr/gcc/4.3/bin/gcc" ;;
    (*)
      return 1 ;;
  esac
}

requirements_omnios_before()
{
  __lib_type=openindiana
}
scripts/functions/requirements/smartos000066400000002513147511530560014413 0ustar00#!/usr/bin/env bash

requirements_smartos_lib_installed()
{
  pkgin list | __rvm_grep "^$1-[0-9]" >/dev/null 2>&1|| return $?
}

requirements_smartos_lib_available()
{
  pkgin avail | __rvm_grep "^$1-[0-9]" >/dev/null 2>&1|| return $?
}

requirements_smartos_libs_install()
{
  __rvm_try_sudo pkgin -y install "$@" || return $?
}

requirements_smartos_update_system()
{
  __rvm_try_sudo pkgin -y full-upgrade || return $?
}

requirements_smartos_define()
{
  case "$1" in
    (rvm)
      requirements_check bash curl patch git
      ;;

    (jruby*)
      requirements_check make openjdk7

      if
        is_head_or_disable_binary "$1"
      then
        requirements_check git
        case $( jruby_installation_method  "$1" ) in
          ant) requirements_check apache-ant   ;;
          mvn) requirements_check apache-maven ;;
        esac
      fi
      ;;

    (ir*)
      requirements_check mono
      ;;

    (opal)
      requirements_check nodejs
      ;;

    (*-head)
      requirements_check coreutils gcc47 gmake readline sqlite3 ncurses libyaml autoconf automake libtool libxslt
      __rvm_update_configure_opt_dir "$1" "/opt/local"
      ;;

    (*)
      requirements_check coreutils gcc47 gmake readline sqlite3 ncurses libyaml autoconf automake libtool libxslt
      __rvm_update_configure_opt_dir "$1" "/opt/local"
      ;;
  esac
}
scripts/functions/requirements/trisquel000066400000001746147511530560014602 0ustar00#!/usr/bin/env bash

source "$rvm_scripts_path/functions/requirements/debian"

requirements_ubuntu_define_libgmp()
{
  requirements_check libgmp-dev
}

requirements_ubuntu_define_libreadline()
{
  if
    __rvm_version_compare ${_system_version} -ge 9
  then
    requirements_check libreadline-dev
  else
    requirements_check libreadline6-dev
  fi
}

requirements_trisquel_define_libssl()
{
  # Legacy libssl-dev required by older version of ruby has been renamed to libssl1.0-dev
  # starting from Trisquel 9 (based on Ubuntu 18.04 LTS "Bionic Beaver")

  case "$1" in
    (ruby-2.3*|ruby-2.2*|ruby-2.1*|ruby-2.0*|ruby-1.9*)
      if
        __rvm_version_compare ${_system_version} -ge 9
      then
        undesired_check libssl-dev
        requirements_check libssl1.0-dev
      else
        requirements_check libssl-dev
      fi
      ;;

    (*)
      requirements_check libssl-dev
      ;;
  esac
}

requirements_trisquel_define()
{
  __lib_type=debian
  requirements_debian_define "$@"
}
scripts/functions/requirements/void000066400000003141147511530560013662 0ustar00#!/usr/bin/env bash

requirements_void_lib_installed()
{
  xbps-query -l | __rvm_grep "ii $1-[0-9]" >/dev/null || return $?
}

requirements_void_libs_install()
{
  __rvm_try_sudo xbps-install -S "$@" || return $?
}

requirements_void_libs_remove()
{
  __rvm_try_sudo xbps-remove -R "$@" || return $?
}

requirements_void_define_base()
{
  requirements_check "$@" \
    autoconf automake bison ca-certificates curl \
    gdbm-devel glibc-devel gmp-devel \
    libffi-devel libressl-devel libtool libyaml-devel \
    make ncurses-devel \
    patch pkg-config readline-devel \
    sqlite-devel zlib-devel

   # libc6-dev > glibc-devel ?
   # libgdbm-dev > gdbm-devel
   # libncurses5-dev > ncurses-devel
   # libreadline-dev > readline-devel
   # libgmp-dev > gmp-devel
   # libssl-dev > libssl45 ???
   # libsqlite3-dev > sqlite-devel
   # libyaml-dev > libyaml-devel
   # sqlite3 > sqlite
   # zlib1g > zlib
   # zlib1g-dev > zlib-devel

   # check https://www.reddit.com/r/voidlinux/comments/9i42l1/installing_asdf_version_manager_with_openssl/
}

requirements_void_define()
{
  # https://voidlinux.org/packages/

  if [[ "$1" == *head ]]
  then
      requirements_check git
  fi

  case "$1" in
    (rvm)
      requirements_check bash curl patch bzip2 gawk
      ;;

    (jruby*)
      # Not implemented
      true
      ;;

    (ir*)
      # Not implemented
      true
      ;;

    (opal)
      # Not implemented
      true
      ;;

    (rbx*|rubinius*)
      # Not implemented
      true
      ;;

    (truffleruby*)
      # Not implemented
      true
      ;;

    (*)
      requirements_void_define_base gcc
      ;;
  esac
}
scripts/functions/requirements/openindiana000066400000010474147511530560015215 0ustar00#!/usr/bin/env bash

requirements_openindiana_lib_installed()
{
  pkg info "$1" > /dev/null 2>&1 || return $?
}

requirements_openindiana_lib_available()
{
  pkg info -r "$1" > /dev/null 2>&1 || return $?
}

requirements_openindiana_custom_lib_installed()
{
  pkginfo -q "$1" || return $?
}

requirements_openindiana_libs_install()
{
  __rvm_try_sudo pkg install "$@" ||
  {
    \typeset ret=$?
    case $ret in
      (4) return 0 ;; # means the package does not need updates
    esac
    return $ret
  }
}

requirements_openindiana_update_system()
{
  __rvm_try_sudo pkg refresh && __rvm_try_sudo pkg update ||
  {
    \typeset ret=$?
    case $ret in
      (4) return 0 ;; # means nothing to install
    esac
    return $ret
  }
}

requirements_openindiana_check_custom()
{
  for lib in "$@"
  do
    [[ " ${packages_custom[*]} " == *" $lib "* ]] ||
    requirements_openindiana_custom_lib_installed "$lib" || __rvm_add_once packages_custom "$lib"
  done
  unset lib
}

requirements_openindiana_check_opencsw_enabled()
{
  requirements_openindiana_custom_lib_installed CSWpkgutil || return $?
}

requirements_openindiana_enable_opencsw()
{
  __rvm_try_sudo pkgadd -a $rvm_path/config/solaris/noask -d https://get.opencsw.org/now CSWpkgutil > /dev/null 2>&1 || return $?
}

requirements_openindiana_install_custom()
{
  requirements_openindiana_check_opencsw_enabled || requirements_openindiana_enable_opencsw
  __rvm_try_sudo /opt/csw/bin/pkgutil -iy "$@" -t https://mirror.opencsw.org/opencsw/unstable || return $?
}

requirements_openindiana_after()
{
  # https://www.illumos.org/issues/782
  if ! __rvm_which automake >/dev/null 2>&1 && __rvm_which /usr/bin/automake-1.10 >/dev/null 2>&1
  then ln -s /usr/bin/automake-1.10 "${rvm_bin_path}"/automake
  fi
  if ! __rvm_which aclocal >/dev/null 2>&1 && __rvm_which /usr/bin/aclocal-1.10 >/dev/null 2>&1
  then ln -s /usr/bin/aclocal-1.10 "${rvm_bin_path}"/aclocal
  fi
}

requirements_openindiana_define()
{
  case "$1" in
    (rvm)
      requirements_check bash curl text/gnu-patch
      ;;

    (jruby*)
      requirements_check make jdk

      if
        is_head_or_disable_binary "$1"
      then
        requirements_check git
        case $( jruby_installation_method  "$1" ) in
          ant) requirements_check apache-ant             ;;
          mvn) requirements_check_custom_after mvn=maven ;;
        esac
      fi
      ;;

    (ir*)
      requirements_check mono
      ;;

    (opal)
      requirements_check runtime/javascript/nodejs
      ;;

    (*-head)
      requirements_check git
      requirements_openindiana_define "${1%-head}"
      ;;

    (*)
      requirements_check_fallback \
        developer/gcc47 developer/gcc-47 \
        developer/gcc46 developer/gcc-46 \
        developer/gcc44 developer/gcc-43 developer/gcc/gcc-43
      requirements_check_fallback \
        developer/build/automake \
        developer/build/automake-111 \
        developer/build/automake-110
      requirements_check \
        text/gnu-patch system/header developer/build/autoconf \
        developer/build/libtool system/library/math/header-math \
        file/gnu-coreutils developer/object-file developer/build/gnu-make
      requirements_openindiana_check_custom CSWlibyaml-dev
      __rvm_update_configure_opt_dir "$1" "/opt/csw"
      ;;
  esac
}

requirements_openindiana_after()
{
  if is_a_function requirements_openindiana_after_${_system_name}
  then requirements_openindiana_after_${_system_name} || return $?
  else requirements_openindiana_after_Other || return $?
  fi
}

requirements_openindiana_after_OmniOS()
{
  case "${packages_installed[*]}" in
    (*developer/gcc47*)
      __rvm_update_configure_env CC="/opt/gcc-4.7.2/bin/gcc" ;;
    (*developer/gcc-3*)
      __rvm_update_configure_env CC="/usr/sfw/bin/gcc" ;;
    (*)
      return 1 ;;
  esac
}

requirements_openindiana_after_Other()
{
  case "${packages_installed[*]}" in
    (*developer/gcc47*|*developer/gcc-47*)
      __rvm_update_configure_env CC="/usr/gcc/4.7/bin/gcc" ;;
    (*developer/gcc46*|*developer/gcc-46*)
      __rvm_update_configure_env CC="/usr/gcc/4.6/bin/gcc" ;;
    (*developer/gcc44*)
      __rvm_update_configure_env CC="/usr/gcc/4.4/bin/gcc" ;;
    (*developer/gcc-43*|*developer/gcc/gcc-43*)
      __rvm_update_configure_env CC="/usr/gcc/4.3/bin/gcc" ;;
    (*)
      return 1 ;;
  esac
}

requirements_omnios_before()
{
  __lib_type=openindiana
}
scripts/functions/requirements/centos000066400000015275147511530560014227 0ustar00#!/usr/bin/env bash

requirements_centos_lib_installed()
{
  rpm -q --whatprovides "$1" >/dev/null || return $?
}

requirements_centos_lib_available()
{
  yum list --cacheonly --quiet "$1" >/dev/null 2>&1 || return $?
}

# required only for libyaml-devel check as fedora is broken ...
requirements_centos_lib_available_no_caching()
{
  yum list --quiet "$1" >/dev/null 2>&1 || return $?
}

requirements_centos_version_list()
{
  rpm -q --whatprovides "$1" | sed -e "s#^$1-##"
}

requirements_centos_install_custom()
{
  requirements_rvm_pkg_libs_install "$@" || return $?
}

requirements_centos_libs_install()
{
  __rvm_try_sudo yum install -y "$@" || return $?
}

requirements_centos_before_update_check_repos_missing_error()
{
  rvm_error "There is no '$*' package available for installation and RVM does not know how to make that happen,
please tell us how to install '$*' on '${_system_name}-${_system_version}' here: https://github.com/rvm/rvm/issues"
  return 49
}

requirements_centos_before_update_check_rhn_channel()
{
  __rvm_try_sudo rhn-channel -l | grep optional >/dev/null ||
  {
    \typeset __package_name="$(
      __rvm_try_sudo rhn-channel -l |
      awk '/^rhel-'"${_system_arch}"'-(server|client|workstation)-[0-9]+$/{print gensub(/(-[0-9]+)$/, "-optional\\1", "g")}'
    )"
    rvm_log "Enabling optional repository"
    rvm_requiremnts_fail_or_run_action 2 \
      "It is not possible to enable optional repository for $*, enable it using: rhn-channel -a -c ${__package_name}" \
      __rvm_try_sudo rhn-channel -a -c "${__package_name}" ||
      return $?
  }
}

requirements_centos_before_install_epel()
{
  "${rvm_scripts_path}/fetch" "${epel_key}"
  "${rvm_scripts_path}/fetch" "${epel_rpm}"
  __rvm_try_sudo rpm --import   "${rvm_archives_path}/${epel_key##*/}"
  __rvm_try_sudo rpm --quiet -i "${rvm_archives_path}/${epel_rpm##*/}" ||
  {
    \typeset __ret=$?
    rvm_error "Error installing EPEL, it is required for libyaml-devel,
either there was an error installing EPEL package,
or there was problem checking if libyaml-devel is available / installed."
    return ${__ret}
  }
}

requirements_centos_before_update_check_epel()
{
  [[ " $* " == *" libyaml-devel "* ]] || return 0
  # if you change this, change the scripts/functions/pkg version too
  [[ -f /etc/yum.repos.d/epel.repo ]] ||
  {
    \typeset version="${_system_version%%.*}"
    __rvm_db "epel${version}_key" "epel_key"
    __rvm_db "epel${version}_${_system_arch}_rpm" "epel_rpm"
    if
      [[ -z "$epel_rpm" || -z "$epel_key" ]]
    then
      requirements_centos_before_update_check_repos_missing_error $* || return $?
    fi
    rvm_requiremnts_fail_or_run_action 2 \
      "It is not possible to install EPEL repository for YAML, install it using: $epel_rpm" \
      __rvm_log_command centos_install_epel "Installing EPEL repository" requirements_centos_before_install_epel ||
      return $?
  }
}

# return 0  when found missing packages
# return >0 when no missing packages
requirements_centos_before_update_check_missing_packages()
{
  \typeset -a __packages_to_check
  \typeset __package_name
  case "${_system_name_lowercase}" in
    (redhat)
      __packages_to_check=( libyaml-devel libffi-devel )
      ;;
    (centos)
      __packages_to_check=( libyaml-devel )
      ;;
    (*)
      return 1
      ;;
  esac
  __missing_packages=()
  for __package_name in "${__packages_to_check[@]}"
  do
    if
      [[ " ${packages_to_install[*]} " == *" ${__package_name} "* ]] &&
      ! requirements_centos_lib_installed "${__package_name}" &&
      ! requirements_centos_lib_available_no_caching "${__package_name}"
    then
      __missing_packages+=( "${__package_name}" )
    fi
  done
  [[ ${#__missing_packages[*]} -gt 0 ]] || return 2
}

requirements_centos_before_update_check_repos()
{
  \typeset -a __missing_packages
  requirements_centos_before_update_check_missing_packages || return 0

  case "${_system_name_lowercase}" in
    (redhat)
      requirements_centos_before_update_check_rhn_channel "${__missing_packages[@]}" || return $?
      ;;
    (centos)
      requirements_centos_before_update_check_epel "${__missing_packages[@]}" || return $?
      ;;
    (*)
      requirements_centos_before_update_check_repos_missing_error "${__missing_packages[@]}" || return $?
      ;;
  esac
}

requirements_centos_before_update()
{
  case "$1" in
    (ruby-1*)
      requirements_centos_before_update_check_repos || return $?
      ;;
  esac
}

requirements_centos_check_binary()
{
  {
    __rvm_which update-alternatives >/dev/null &&
    update-alternatives --display "$1" >/dev/null 2>&1
  } ||
  __rvm_which "$1" >/dev/null || return $?
}

requirements_centos_define_glibc()
{
  requirements_check glibc-headers glibc-devel
}

requirements_centos_define_libyaml()
{
  case "$1" in
    (ruby-1*) requirements_check libyaml-devel ;;
  esac
}

requirements_centos_define_openssl()
{
  requirements_check openssl-devel
}

requirements_centos_define()
{
  case "$1" in
    (rvm)
      requirements_check bash curl patch
      ;;

    (jruby*)
      requirements_check make

      if
        is_head_or_disable_binary "$1"
      then
        requirements_centos_check_binary javac ||
          requirements_check_fallback java-1.8.0-openjdk-devel java-devel ||
          requirements_check_fallback java-1.7.0-openjdk-devel java-devel
        requirements_check git
        case $( jruby_installation_method  "$1" ) in
          mvn) requirements_check_custom_after mvn=maven ;;
        esac
      else
        requirements_centos_check_binary java ||
          requirements_check_fallback java-1.8.0-openjdk java ||
          requirements_check_fallback java-1.7.0-openjdk java
      fi
      ;;

    (rbx*|rubinius*)
      requirements_check automake bison clang-3.6 flex gdbm-devel git libyaml-devel llvm-devel llvm-static \
                         make ncurses-devel openssl-devel readline-devel ruby-devel rubygems zlib-devel
      ;;

    (truffleruby*)
      requirements_check zlib-devel make gcc libxml2
      requirements_${_system_name_lowercase}_define_openssl $1
      ;;

    (ir*)
      true # not that easy
      ;;

    (opal)
      true # not that easy
      ;;

    (*-head)
      requirements_check git
      requirements_centos_define "${1%-head}"
      requirements_version_minimal autoconf 2.67
      ;;

    (*)
      if [[ ${#rvm_patch_names[@]} -gt 0 ]]
      then requirements_version_minimal autoconf 2.67
      fi

      requirements_check autoconf automake bison bzip2 gcc-c++ libffi-devel libtool make patch readline \
                         readline-devel ruby sqlite-devel zlib zlib-devel

      requirements_${_system_name_lowercase}_define_glibc $1
      requirements_${_system_name_lowercase}_define_libyaml $1
      requirements_${_system_name_lowercase}_define_openssl $1
      ;;
  esac
}
scripts/functions/requirements/gentoo_pkgcore000066400000001100147511530560015717 0ustar00#!/usr/bin/env bash

requirements_find_gentoo_pkgcore()
{
  if
    eselect package-manager >/dev/null 2>&1
  then
    [[ $(eselect package-manager show | __rvm_tail -1 | __rvm_sed 's/ //g') = 'pkgcore' ]] || return $?
  else
    __rvm_which pmerge >/dev/null 2>&1 || return $?
  fi
}

requirements_gentoo_pkgcore_lib_installed()
{
  pquery --vdb "$1" | __rvm_grep "$1" >/dev/null || return $?
}

requirements_gentoo_pkgcore_libs_install()
{
  __rvm_try_sudo pmerge "$@" || return $?
}

requirements_gentoo_pkgcore_update_system()
{
  __rvm_try_sudo pmaint sync || return $?
}
scripts/functions/requirements/rvm_pkg000066400000004237147511530560014375 0ustar00#!/usr/bin/env bash

source "$rvm_scripts_path/functions/pkg"

requirements_rvm_pkg_wait_key()
{
  rvm_is_a_shell_function no_warning ||
  {
    rvm_error "
You are using 'rvm autolibs rvm_pkg', this does not know how to install some of the packages, make sure to install those first.
"
    return 1
  }
  rvm_log "press any key to continue"
  \typeset _read_char_flag anykey
  [[ -n "${ZSH_VERSION:-}" ]] && _read_char_flag=k || _read_char_flag=n
  builtin read -${_read_char_flag} 1 -s -r anykey
}

requirements_rvm_pkg_install_custom()
{
  if
    (( $# > 0 ))
  then
    rvm_warn "Before continuing install: $*"
    requirements_rvm_pkg_wait_key || return $?
  fi
}

requirements_rvm_pkg_before()
{
  __rvm_which pkg-config >/dev/null 2>&1 ||
  {
    rvm_error "
ERROR: can not find 'pkg-config', it is required for autolibs rvm_pkg to work, install it before continuing.
"
    return 1
  }
  rvm_warn "
Warning, you are using 'rvm autolibs rvm_pkg', this is rarely used and can produce errors,
make sure to report any problems to https://github.com/rvm/rvm/issues
"
}

requirements_rvm_pkg_update_system()
{
  rvm_warn "Always update your system first!"
}

requirements_rvm_pkg_define()
{
  case "$1" in
    (rvm)
      requirements_check_custom bash curl patch
      ;;

    (jruby*)
      requirements_check make

      if
        is_head_or_disable_binary "$1"
      then
        requirements_check_custom git
        case $( jruby_installation_method  "$1" ) in
          ant) requirements_check_custom ant             ;;
          mvn) requirements_check_custom_after mvn=maven ;;
        esac
      fi

      requirements_check_custom java
      ;;

    (ir*)
      requirements_check_custom mono
      ;;

    (opal)
      requirements_check_custom node
      ;;

    (yaml|zlib|openssl|readline|xml2|xslt)
      true # just skip the packages
      ;;

    (*-head)
      requirements_check_custom git
      requirements_rvm_pkg_define "${1%-head}"
      ;;

    (*)
      requirements_check_custom gcc g++ libtool bison bzip2
      requirements_check yaml zlib openssl readline
      ;;
  esac
}

requirements_rvm_pkg_after()
{
  requirements_rvm_pkg_configure "$1" yaml zlib openssl readline
}
scripts/functions/requirements/fedora000066400000001662147511530560014167 0ustar00#!/usr/bin/env bash

requirements_fedora_define_openssl()
{
  case "$1" in
    (ruby-2.3*|ruby-2.2*|ruby-2.1*|ruby-2.0*|ruby-1.9*|ruby-1.8*)
      if
        __rvm_version_compare "${_system_version}" -ge 26
      then
        undesired_check openssl-devel
        requirements_check compat-openssl10-devel
      else
        undesired_check compat-openssl10-devel
        requirements_check openssl-devel
      fi
      ;;

    (*)
      undesired_check compat-openssl10-devel
      requirements_check openssl-devel
      ;;
  esac
}

requirements_fedora_define_glibc()
{
  if
    __rvm_version_compare "${_system_version}" -lt 33
  then
    requirements_check glibc-headers glibc-devel
  else
    requirements_check glibc-devel
  fi
}

if
  __rvm_which dnf >/dev/null 2>&1 # should be true for Fedora 22+
then
  source "$rvm_scripts_path/functions/requirements/fedora_dnf"
else
  source "$rvm_scripts_path/functions/requirements/fedora_yum"
fi
scripts/functions/requirements/fedora_dnf000066400000004260147511530560015013 0ustar00#!/usr/bin/env bash

requirements_fedora_lib_installed()
{
  dnf list installed "$1" >/dev/null 2>&1 || return $?
}

requirements_fedora_lib_available()
{
  dnf info "$1" >/dev/null 2>&1 || return $?
}

requirements_fedora_libs_install()
{
  __rvm_try_sudo dnf install -y "$@" || return $?
}

requirements_fedora_libs_remove()
{
  __rvm_try_sudo dnf remove -y "$@" || return $?
}

requirements_fedora_check_binary()
{
  {
    __rvm_which update-alternatives >/dev/null &&
    update-alternatives --display "$1" >/dev/null 2>&1
  } ||
  __rvm_which "$1" >/dev/null || return $?
}

requirements_fedora_define()
{
  case "$1" in
    (rvm)
      requirements_check bash curl patch
      ;;

    (jruby*)
      requirements_check make

      if
        is_head_or_disable_binary "$1"
      then
        requirements_check git

        requirements_fedora_check_binary javac ||
          requirements_check_fallback java-1.8.0-openjdk-devel java-devel ||
          requirements_check_fallback java-1.7.0-openjdk-devel java-devel

        case $( jruby_installation_method  "$1" ) in
          mvn) requirements_check_custom_after mvn=maven ;;
        esac

      else
        requirements_fedora_check_binary java ||
          requirements_check_fallback java-1.8.0-openjdk java ||
          requirements_check_fallback java-1.7.0-openjdk java
      fi
      ;;

    (rbx*|rubinius*)
      requirements_check automake bison clang-3.6 flex gdbm-devel git libyaml-devel llvm-devel llvm-static \
                         make ncurses-devel openssl-devel readline-devel ruby-devel rubygems zlib-devel
      ;;

    (truffleruby*)
      requirements_check zlib-devel make gcc libxml2
      requirements_fedora_define_openssl "$1"
      ;;

    (ir*)
      true # not that easy
      ;;

    (opal)
      true # not that easy
      ;;

    (*-head)
      requirements_check git
      requirements_fedora_define "${1%-head}"
      ;;

    (*)

      requirements_check autoconf automake bison bzip2 gcc-c++ libffi-devel libtool \
                         libyaml-devel make patch readline readline-devel sqlite-devel zlib zlib-devel
      requirements_fedora_define_openssl $1
      requirements_fedora_define_glibc $1
      ;;
  esac
}
scripts/functions/requirements/fedora_yum000066400000001463147511530560015060 0ustar00#!/usr/bin/env bash

source "$rvm_scripts_path/functions/requirements/centos"

requirements_fedora_before_update_cache()
{
  __rvm_try_sudo yum clean all || true      # can fail to clean
  __rvm_try_sudo yum makecache || return $? # but must rebuild cache
}

requirements_fedora_before()
{
  requirements_centos_lib_available_no_caching yum ||
    rvm_requiremnts_fail_or_run_action 2 \
      "It is not possible to check if packages are installed, make sure the cache is up to date with 'yum makecache' and try again." \
      __rvm_log_command fedora_update_cache "Updating packages cache" requirements_fedora_before_update_cache ||
      return $?
}

requirements_fedora_define_libyaml()
{
  requirements_check libyaml-devel
}

requirements_fedora_define()
{
  __lib_type=centos

  requirements_centos_define "$@"
}
scripts/functions/requirements/debian000066400000012322147511530560014144 0ustar00#!/usr/bin/env bash

# AMD64, i386, ARM - this is different from _system_arch as it's not translated.
requirements_debian_arch()
{
  __architecture="$(dpkg --print-architecture)"
}

# Queries the dpkg system for packages that are installed only asking about
# the package name and it's arch.  This package will fall back to :all for
# cases where we cannot get an arch specific package (such is the case
# for a few packages.)

requirements_debian_lib_installed()
{
  dpkg-query -s "${1}:${__architecture}" >/dev/null 2>&1 ||
  dpkg-query -s "${1}:all"               >/dev/null 2>&1 ||
  dpkg-query -s "$1" 2>/dev/null | __rvm_grep "Architecture: ${__architecture}" >/dev/null ||
  dpkg-query -s "$1" 2>/dev/null | __rvm_grep "Architecture: all"               >/dev/null ||
  return $?
}

# Informs us if a package is even available on the distro we are working
# with, this is more of a transitional method kind of like Ubuntu
# has a transitional git-core package right now.  This will allow us
# to continue to support older versions of Ubuntu while enforcing newer
# packages on newer Ubuntu.

requirements_debian_lib_available()
{
  apt-cache show "$1" >/dev/null 2>&1 || return $?
}

requirements_debian_libs_install()
{
  __rvm_try_sudo apt-get --no-install-recommends --yes install "$@" || return $?
}

requirements_debian_libs_remove()
{
  __rvm_try_sudo apt-get --yes remove "$@" || return $?
}

requirements_debian_update_system()
{
  __rvm_try_sudo apt-get --quiet --yes update ||
  {
    \typeset __ret=$?
    case ${__ret} in
      (100)
        rvm_error "There has been an error while updating your system using \`apt-get\`.
It seems that there are some 404 Not Found errors for repositories listed in:

    /etc/apt/sources.list
    /etc/apt/sources.list.d/*.list

Make sure that all repositories are available from your system and verify your setup by running manually:

    sudo apt-get update

Make sure that it works correctly before proceeding with RVM.

If you are working from the GUI instead of the terminal, you might want to verify and fix broken
repositories using \"Software & Updates\" application.
"
        ;;
    esac
    return ${__ret}
  }
}

requirements_debian_define_libgmp()
{
  if [[ "${_system_version}" == 6* ]]
  then
    requirements_check libgmp3-dev
  else
    requirements_check libgmp-dev
  fi
}

requirements_debian_define_libreadline()
{
  if
    __rvm_version_compare ${_system_version} -ge 9
  then
    requirements_check libreadline-dev
  else
    requirements_check libreadline6-dev
  fi
}

requirements_debian_define_libssl()
{
  # Legacy libssl-dev required by older version of ruby has been renamed to libssl1.0-dev
  # starting from Debian 9 (Stretch)

  case "$1" in
    (ruby-2.3*|ruby-2.2*|ruby-2.1*|ruby-2.0*|ruby-1.9*|ruby-1.8*)
      if
        __rvm_version_compare ${_system_version} -ge 9
      then
        undesired_check libssl-dev
        requirements_check libssl1.0-dev
      else
        requirements_check libssl-dev
      fi
      ;;

    (*)
      requirements_check libssl-dev
      ;;
  esac
}

requirements_debian_define_clang_llvm()
{
  requirements_check clang-3.6 llvm-3.6 llvm-3.6-dev
}

requirements_debian_define_base()
{
  requirements_check "$@" \
    autoconf automake bison ca-certificates curl libc6-dev libffi-dev libgdbm-dev libncurses5-dev \
    libsqlite3-dev libtool libyaml-dev make openssl patch pkg-config sqlite3 zlib1g zlib1g-dev

  requirements_${_system_name_lowercase}_define_libgmp
  requirements_${_system_name_lowercase}_define_libreadline
}

requirements_debian_define_java()
{
  update-alternatives --list ${1:-java} >/dev/null 2>&1 ||
    requirements_check_fallback \
      openjdk-8-jre-headless openjdk-8-jdk oracle-j2sdk1.8 \
      openjdk-7-jre-headless openjdk-7-jdk oracle-j2sdk1.7 \
      openjdk-6-jre-headless opendjk-6-jdk oracle-j2sdk1.6
}

requirements_debian_define()
{
  \typeset __architecture
  requirements_debian_arch

  if [[ "$1" == *head ]]
  then
      requirements_check_fallback git git-core
  fi

  case "$1" in
    (rvm)
      requirements_check bash curl patch bzip2 ca-certificates gawk
      ;;

    (jruby*)
      requirements_check g++ make
      if
        is_head_or_disable_binary "$1"
      then
        requirements_debian_define_java javac
        requirements_check_fallback git git-core
        case $( jruby_installation_method  "$1" ) in
          ant) __rvm_which ant >/dev/null || requirements_check ant                   ;;
          mvn) __rvm_which mvn >/dev/null || requirements_check_fallback maven maven2 ;;
        esac
      else
        requirements_debian_define_java java
      fi
      ;;

    (ir*)
      requirements_check curl mono-2.0-devel
      ;;

    (opal)
      requirements_check nodejs npm
      ;;

    (rbx*|rubinius*)
      requirements_debian_define_base flex ruby-dev libreadline-dev libedit-dev
      requirements_${_system_name_lowercase}_define_libssl "$1"
      requirements_${_system_name_lowercase}_define_clang_llvm "$1"
      ;;

    (truffleruby*)
      requirements_debian_define_base
      requirements_${_system_name_lowercase}_define_libssl "$1"
      requirements_check make gcc libxml2
      ;;

    (*)
      requirements_debian_define_base g++ gcc
      requirements_${_system_name_lowercase}_define_libssl "$1"
      ;;
  esac
}
scripts/functions/requirements/arch000066400000011240147511530560013635 0ustar00#!/usr/bin/env bash

requirements_arch_lib_installed_all_missing()
{
  pacman -T "$@" || true
}

requirements_arch_lib_installed() {
  pacman -Qq "$1" >/dev/null 2>&1 || return $?
}

requirements_arch_lib_available()
{
  pacman -Ssq "^${1}$" >/dev/null 2>&1 || return $?
}

requirements_arch_libs_install()
{
  __rvm_try_sudo pacman -Sy --needed --noconfirm "$@" || return $?
}

requirements_arch_libs_remove()
{
  __rvm_try_sudo pacman -Rs --noconfirm "$@" || return $?
}

requirements_arch_update_system()
{
  # Has to be ran separately so new version can be used for installing missing libs
  requirements_arch_libs_install pacman || return $?
}

requirements_arch_define_check_raspberry_pi()
{
  if
    [[ "${_system_arch}" == "arm"* ]]
  then
    # assuming all arm will need this fix
    requirements_check_fallback ntp openntpd chrony
  fi
}

requirements_arch_define_openssl()
{
  case "$1" in
    (ruby-2.3*|ruby-2.2*|ruby-2.1*|ruby-2.0*|ruby-1.9*)
      requirements_check openssl-1.0

      # Ruby should respect pkg-config in case of openssl (it does not have to be the case with other extensions)
      # https://github.com/ruby/ruby/blob/trunk/ext/openssl/extconf.rb#L38
      export PKG_CONFIG_PATH="/usr/lib/openssl-1.0/pkgconfig${PKG_CONFIG_PATH:+:}${PKG_CONFIG_PATH:-}"
      ;;
    (*)
      requirements_check openssl
      ;;
  esac
}

requirements_arch_define()
{
  requirements_arch_define_check_raspberry_pi

  case "$1" in
    (rvm)
      requirements_check bash curl patch
      ;;
    (jruby*)
      requirements_check curl make

      if
        is_head_or_disable_binary "$1"
      then
        requirements_check_fallback jdk8-openjdk jdk7-openjdk
        requirements_check git
        case $( jruby_installation_method  "$1" ) in
          ant) __rvm_which ant >/dev/null || requirements_check apache-ant ;;
          mvn) __rvm_which mvn >/dev/null || requirements_check maven      ;;
        esac
      else
        requirements_check_fallback jre8-openjdk jre7-openjdk
      fi
      ;;
    (ir*)
      requirements_check mono
      ;;
    (opal)
      requirements_check nodejs
      ;;
    (rbx*head|rubinius*head)
      undesired_check clang35 llvm35 llvm35-libs
      requirements_check clang llvm llvm-libs patch curl zlib readline autoconf automake diffutils make libtool bison git
      ;;
    (rbx-3*|rubinius-3*)
      undesired_check clang35 llvm35 llvm35-libs
      requirements_check clang llvm llvm-libs patch curl zlib readline autoconf automake diffutils make libtool bison
      ;;
    (rbx-2*|rubinius-2*)
      undesired_check clang llvm llvm-libs
      requirements_check clang35 llvm35 llvm35-libs patch curl zlib readline autoconf automake diffutils make libtool bison
      ;;
    (rbx-1*|rubinius-1*)
      undesired_check clang llvm llvm-libs
      requirements_check clang35 llvm35 llvm35-libs patch curl zlib readline autoconf automake diffutils make libtool bison
      ;;
    (truffleruby*)
      requirements_check zlib make gcc libxml2
      requirements_arch_define_openssl "$1"
      ;;
    (ruby-2.3*|ruby-2.2*|ruby-2.1*|ruby-2.0*|ruby-1.9*)
      requirements_check gcc patch curl zlib readline autoconf automake diffutils make libtool bison sqlite git
      requirements_arch_define_openssl "$1"
      ;;
    (*-head)
      requirements_check gcc patch curl zlib readline autoconf automake diffutils make libtool bison sqlite git
      requirements_arch_define_openssl "$1"
      ;;
    (*)
      requirements_check gcc patch curl zlib readline autoconf automake diffutils make libtool bison sqlite
      requirements_arch_define_openssl "$1"
      ;;
  esac
}

requirements_arch_service()
{
  systemctl $1 $3 >/dev/null ||
  if __rvm_try_sudo systemctl $2 $3
  then true
  else
    \typeset __arch_status=$?
    rvm_error "There was a problem running 'systemctl $2 $3' with exit status '$__arch_status'."
    return $__arch_status
  fi
}

requirements_arch_after_check_raspberry_pi()
{
  if
    [[ "${_system_arch}" == "arm"* ]]
  then
    ntp_servers=( ntpd systemd-timesyncd openntpd chronyd )
    for ntp_server in "${ntp_servers[@]}"
    do
      if
        systemctl list-unit-files | grep -Fq "$ntp_server.service" &&
        systemctl is-active $ntp_server
      then
        return 0
      fi
    done
    for ntp_server in "${ntp_servers[@]}"
    do
      if
        systemctl list-unit-files | grep -Fq "$ntp_server.service"
      then
        requirements_arch_service is-enabled enable $ntp_server &&
        requirements_arch_service is-active  start  $ntp_server ||
        return $?
      fi
    done
  fi
}

requirements_arch_after()
{
  requirements_arch_after_check_raspberry_pi
}

requirements_manjaro_define()
{
  __lib_type=arch
  requirements_arch_define "$@" || return $?
}
scripts/functions/requirements/openbsd000066400000004767147511530560014372 0ustar00#!/usr/bin/env bash

requirements_openbsd_lib_installed()
{
  pkg_info | __rvm_grep "^$1" >/dev/null 2>&1 || return $?
}

requirements_openbsd_lib_available()
{
  pkg_info -Q "${1%%-[[:digit:]]}" | __rvm_grep "^$1" >/dev/null 2>&1 || return $?
}

requirements_openbsd_libs_install()
{
  __rvm_try_sudo pkg_add -z "$@" || return $?
}

requirements_openbsd_install_node()
{
  # plain make is required for sudo
  __rvm_try_sudo make -C /usr/ports/www/node install clean || return $?
}

requirements_openbsd_update_system()
{
  [[ -d /usr/ports ]] ||
  {
    \typeset __url __target __result=0
    __url="http://ftp.openbsd.org/pub/OpenBSD/${_system_version}/ports.tar.gz"
    __target="$( TMPDIR="${rvm_tmp_path}" mktemp ${TMPDIR:-/tmp}/tmp.XXXXXXXXXXXXXXXXXX )"
    __rvm_curl "${__url}" -o "${__target}"        &&
    __rvm_try_sudo tar -C /usr -zxf "${__target}" ||
    __result=$?
    rm -f "${__target}"
    return ${__result}
  }
  true
}

requirements_openbsd_define()
{
  case "$1" in
    (rvm)
      requirements_check bash curl
      ;;

    (jruby*)
      requirements_check make jdk

      if
        is_head_or_disable_binary "$1"
      then
        requirements_check git
        case $( jruby_installation_method  "$1" ) in
          ant) requirements_check apache-ant ;;
          mvn) requirements_check maven      ;;
        esac
      fi
      ;;

    (ir*)
      requirements_check mono
      ;;

    (opal)
      requirements_check_custom node
      ;;

    (ruby-1.9.3*|ruby-2.0.0*)
      rvm_error "Beware there is a compilation bug in $1 on OpenBSD, it's fixed in ruby-2.1.0
for more details see https://bugs.ruby-lang.org/issues/7959"
      return 103
      ;;

    (*-head)
      # OpenSSL is installed by default http://www.openbsd.org/crypto.html
      requirements_check gcc-4 automake-1 libtool bison readline-6 libyaml-0 git
      requirements_check_fallback autoconf-2.69p0 autoconf-2.68 autoconf-2.67
      __rvm_update_configure_opt_dir "$1" "/usr/local"
      ;;

    (*)
      # OpenSSL is installed by default http://www.openbsd.org/crypto.html
      requirements_check gcc-4 autoconf-2 automake-1 libtool bison readline-6 libyaml-0
      __rvm_update_configure_opt_dir "$1" "/usr/local"
      ;;
  esac
}

requirements_openbsd_before()
{
  [[ -n "${PKG_PATH:-}" ]] ||
  {
    export PKG_PATH=http://ftp.openbsd.org/pub/OpenBSD/${_system_version}/packages/$(arch -s)/
    rvm_warn "WARNING: \$PKG_PATH was not set, using fallback '$PKG_PATH',
see http://www.openbsd.org/ftp.html for list of available mirrors."
  }
}
scripts/functions/requirements/manjaro000066400000011240147511530560014347 0ustar00#!/usr/bin/env bash

requirements_arch_lib_installed_all_missing()
{
  pacman -T "$@" || true
}

requirements_arch_lib_installed() {
  pacman -Qq "$1" >/dev/null 2>&1 || return $?
}

requirements_arch_lib_available()
{
  pacman -Ssq "^${1}$" >/dev/null 2>&1 || return $?
}

requirements_arch_libs_install()
{
  __rvm_try_sudo pacman -Sy --needed --noconfirm "$@" || return $?
}

requirements_arch_libs_remove()
{
  __rvm_try_sudo pacman -Rs --noconfirm "$@" || return $?
}

requirements_arch_update_system()
{
  # Has to be ran separately so new version can be used for installing missing libs
  requirements_arch_libs_install pacman || return $?
}

requirements_arch_define_check_raspberry_pi()
{
  if
    [[ "${_system_arch}" == "arm"* ]]
  then
    # assuming all arm will need this fix
    requirements_check_fallback ntp openntpd chrony
  fi
}

requirements_arch_define_openssl()
{
  case "$1" in
    (ruby-2.3*|ruby-2.2*|ruby-2.1*|ruby-2.0*|ruby-1.9*)
      requirements_check openssl-1.0

      # Ruby should respect pkg-config in case of openssl (it does not have to be the case with other extensions)
      # https://github.com/ruby/ruby/blob/trunk/ext/openssl/extconf.rb#L38
      export PKG_CONFIG_PATH="/usr/lib/openssl-1.0/pkgconfig${PKG_CONFIG_PATH:+:}${PKG_CONFIG_PATH:-}"
      ;;
    (*)
      requirements_check openssl
      ;;
  esac
}

requirements_arch_define()
{
  requirements_arch_define_check_raspberry_pi

  case "$1" in
    (rvm)
      requirements_check bash curl patch
      ;;
    (jruby*)
      requirements_check curl make

      if
        is_head_or_disable_binary "$1"
      then
        requirements_check_fallback jdk8-openjdk jdk7-openjdk
        requirements_check git
        case $( jruby_installation_method  "$1" ) in
          ant) __rvm_which ant >/dev/null || requirements_check apache-ant ;;
          mvn) __rvm_which mvn >/dev/null || requirements_check maven      ;;
        esac
      else
        requirements_check_fallback jre8-openjdk jre7-openjdk
      fi
      ;;
    (ir*)
      requirements_check mono
      ;;
    (opal)
      requirements_check nodejs
      ;;
    (rbx*head|rubinius*head)
      undesired_check clang35 llvm35 llvm35-libs
      requirements_check clang llvm llvm-libs patch curl zlib readline autoconf automake diffutils make libtool bison git
      ;;
    (rbx-3*|rubinius-3*)
      undesired_check clang35 llvm35 llvm35-libs
      requirements_check clang llvm llvm-libs patch curl zlib readline autoconf automake diffutils make libtool bison
      ;;
    (rbx-2*|rubinius-2*)
      undesired_check clang llvm llvm-libs
      requirements_check clang35 llvm35 llvm35-libs patch curl zlib readline autoconf automake diffutils make libtool bison
      ;;
    (rbx-1*|rubinius-1*)
      undesired_check clang llvm llvm-libs
      requirements_check clang35 llvm35 llvm35-libs patch curl zlib readline autoconf automake diffutils make libtool bison
      ;;
    (truffleruby*)
      requirements_check zlib make gcc libxml2
      requirements_arch_define_openssl "$1"
      ;;
    (ruby-2.3*|ruby-2.2*|ruby-2.1*|ruby-2.0*|ruby-1.9*)
      requirements_check gcc patch curl zlib readline autoconf automake diffutils make libtool bison sqlite git
      requirements_arch_define_openssl "$1"
      ;;
    (*-head)
      requirements_check gcc patch curl zlib readline autoconf automake diffutils make libtool bison sqlite git
      requirements_arch_define_openssl "$1"
      ;;
    (*)
      requirements_check gcc patch curl zlib readline autoconf automake diffutils make libtool bison sqlite
      requirements_arch_define_openssl "$1"
      ;;
  esac
}

requirements_arch_service()
{
  systemctl $1 $3 >/dev/null ||
  if __rvm_try_sudo systemctl $2 $3
  then true
  else
    \typeset __arch_status=$?
    rvm_error "There was a problem running 'systemctl $2 $3' with exit status '$__arch_status'."
    return $__arch_status
  fi
}

requirements_arch_after_check_raspberry_pi()
{
  if
    [[ "${_system_arch}" == "arm"* ]]
  then
    ntp_servers=( ntpd systemd-timesyncd openntpd chronyd )
    for ntp_server in "${ntp_servers[@]}"
    do
      if
        systemctl list-unit-files | grep -Fq "$ntp_server.service" &&
        systemctl is-active $ntp_server
      then
        return 0
      fi
    done
    for ntp_server in "${ntp_servers[@]}"
    do
      if
        systemctl list-unit-files | grep -Fq "$ntp_server.service"
      then
        requirements_arch_service is-enabled enable $ntp_server &&
        requirements_arch_service is-active  start  $ntp_server ||
        return $?
      fi
    done
  fi
}

requirements_arch_after()
{
  requirements_arch_after_check_raspberry_pi
}

requirements_manjaro_define()
{
  __lib_type=arch
  requirements_arch_define "$@" || return $?
}
scripts/functions/requirements/gentoo_paludis000066400000001113147511530560015732 0ustar00#!/usr/bin/env bash

requirements_find_gentoo_paludis()
{
  if
    eselect package-manager >/dev/null 2>&1
  then
    [[ $(eselect package-manager show | __rvm_tail -1 | __rvm_sed 's/ //g') = 'paludis' ]] || return $?
  else
    __rvm_which cave >/dev/null 2>&1 || return $?
  fi
}

requirements_gentoo_paludis_lib_installed()
{
  cave show "$1" | __rvm_grep "::installed" >/dev/null || return $?
}

requirements_gentoo_paludis_libs_install()
{
  __rvm_try_sudo cave resolve -x "$@" || return $?
}

requirements_gentoo_paludis_update_system()
{
  __rvm_try_sudo cave sync || return $?
}
scripts/functions/requirements/oracle000066400000000630147511530560014166 0ustar00#!/usr/bin/env bash

source "$rvm_scripts_path/functions/requirements/centos"

requirements_oracle_define_glibc()
{
  requirements_check glibc-headers glibc-devel
}

requirements_oracle_define_libyaml()
{
  requirements_check libyaml-devel
}

requirements_oracle_define_openssl()
{
  requirements_check openssl-devel
}

requirements_oracle_define()
{
  __lib_type=centos

  requirements_centos_define "$@"
}
scripts/functions/requirements/mint000066400000002374147511530560013677 0ustar00#!/usr/bin/env bash

source "$rvm_scripts_path/functions/requirements/debian"

requirements_mint_define_libgmp()
{
  requirements_check libgmp-dev
}

requirements_mint_define_libreadline()
{
  requirements_check libreadline-dev
}

requirements_mint_define_libssl()
{
  # Legacy libssl-dev required by older version of ruby has been renamed to libssl1.0-dev
  # starting from Mint 19 (Tara)

  case "$1" in
    (ruby-2.3*|ruby-2.2*|ruby-2.1*|ruby-2.0*|ruby-1.9*)
      if
        __rvm_version_compare ${_system_version} -ge 19
      then
        undesired_check libssl-dev
        requirements_check libssl1.0-dev
      else
        requirements_check libssl-dev
      fi
      ;;

    (*)
      requirements_check libssl-dev
      ;;
  esac

  requirements_check libssl-dev
}

requirements_mint_define_clang_llvm()
{
  if
    __rvm_version_compare ${_system_version} -ge 19.1
  then
    requirements_check clang-3.9 llvm-3.9 llvm-3.9-dev
    rvm_configure_flags+=( --cc=clang-3.9 --cxx=clang++-3.9 --llvm-config=llvm-config-3.9)
  else
    requirements_check clang-3.6 llvm-3.6 llvm-3.6-dev
    rvm_configure_flags+=( --cc=clang-3.6 --cxx=clang++-3.6 --llvm-config=llvm-config-3.6)
  fi
}

requirements_mint_define()
{
  __lib_type=debian
  requirements_debian_define "$@"
}
scripts/functions/requirements/sabayon000066400000000655147511530560014364 0ustar00#!/usr/bin/env bash

source "$rvm_scripts_path/functions/requirements/gentoo"

requirements_sabayon_define()
{
  requirements_gentoo_define "$@"
}

requirements_sabayon_lib_installed()
{
  __rvm_try_sudo equo query installed "$1" >/dev/null || return $?
}

requirements_sabayon_libs_install()
{
  __rvm_try_sudo equo install "$@" || return $?
}

requirements_sabayon_update_system()
{
  __rvm_try_sudo equo update || return $?
}
scripts/functions/requirements/gentoo_portage000066400000001216147511530560015736 0ustar00#!/usr/bin/env bash

requirements_find_gentoo_portage()
{
  if
    eselect package-manager >/dev/null 2>&1
  then
    [[ $(eselect package-manager show | __rvm_tail -1 | __rvm_sed 's/ //g') = 'portage' ]] ||
    [[ $(eselect package-manager show | __rvm_tail -1 | __rvm_sed 's/ //g') = '(none)'  ]] || return $?
  else
    __rvm_which emerge >/dev/null 2>&1 || return $?
  fi
}

requirements_gentoo_portage_lib_installed() [[ -n "$(portageq match / "$1" 2>/dev/null)" ]]

requirements_gentoo_portage_libs_install()
{
  __rvm_try_sudo emerge "$@" || return $?
}

requirements_gentoo_portage_update_system()
{
  __rvm_try_sudo emerge --sync || return $?
}
scripts/functions/cli000066400000026412147511530560010753 0ustar00#!/usr/bin/env bash

source "$rvm_scripts_path/functions/version"

__rvm_fix_selected_ruby()
{
  \typeset __ret=0
  if (( $# ))
  then "$@" || __ret=$?
  fi
  [[ -d "$GEM_HOME" && -d "$MY_RUBY_HOME" ]] ||
  {
    if [[ -d ${MY_RUBY_HOME%/*}/defaul ]]
    then __rvm_use default
    else __rvm_use system
    fi
  }
}

__rvm_path_match_gem_home_check_warn()
{
  rvm_warn "\
Warning! PATH is not properly set up, $1.
         <log>Usually this is caused by shell initialization files. Search for <code>PATH=...</code> entries.
         You can also re-add RVM to your profile by running: <code>rvm get stable --auto-dotfiles</code>
         To fix it temporarily in this shell session run: <code>rvm use $2</code>
         To ignore this error add <code>rvm_silence_path_mismatch_check_flag=1</code> to your <code>~/.rvmrc</code> file."
}

__rvm_path_match_gem_home_check_warning()
{
  __rvm_path_match_gem_home_check_warn "$GEM_HOME/bin $1" "${GEM_HOME##*/}"
}

__rvm_path_match_gem_home_check_warning_missing()
{
  __rvm_path_match_gem_home_check_warn "\$GEM_HOME is not set" "$1"
}

__rvm_path_match_gem_home_check()
{
  (( ${rvm_silence_path_mismatch_check_flag:-0} == 0 )) || return 0
  if
    [[ -n "${GEM_HOME:-}" ]]
  then
    case "$PATH:" in
      ($GEM_HOME/bin:*) true ;; # all fine here
      (*:$GEM_HOME/bin:*)
        __rvm_path_match_gem_home_check_warning "is not at first place"
        ;;
      (*)
        __rvm_path_match_gem_home_check_warning "is not available"
        ;;
    esac
  else
    \typeset __path_to_ruby
    if
      __path_to_ruby="$( builtin command -v ruby 2>/dev/null )" &&
      [[ "${__path_to_ruby}" == "${rvm_path}"* ]]
    then
      # get the ruby string from path to ruby executable
      __path_to_ruby="${__path_to_ruby%/bin/ruby}"
      __path_to_ruby="${__path_to_ruby##*/}"
      # warning
      __rvm_path_match_gem_home_check_warning_missing "${__path_to_ruby}"
    fi
  fi
}

__rvm_use_ruby_warnings()
{
  if [[ "${rvm_ruby_string}" == "system" || "${rvm_ruby_string}" == "" ]]
  then return 0
  fi
  \typeset __executable __gem_version

  for __executable in ruby gem irb
  do
    [[ -x "$MY_RUBY_HOME/bin/${__executable}" ]] ||
      rvm_warn "Warning! Executable '${__executable}' missing, something went wrong with this ruby installation!"
  done

  if
    [[ "${rvm_ruby_interpreter}" == "ruby" ]] &&
    {
      __rvm_version_compare "${rvm_ruby_version}" -ge 2.0.0 ||
      [[ "${rvm_ruby_version}" == "head" ]]
    } &&
    __rvm_which gem >/dev/null &&
    __gem_version="$(RUBYGEMS_GEMDEPS= gem --version)" &&
    [[ -n "${__gem_version}" ]] &&
    __rvm_version_compare "${__gem_version}" -lt "2.0.0"
  then
    rvm_warn "Warning! You have just used ruby 2.0.0 or newer, which is not fully compatible with rubygems 1.8.x or older,
         consider upgrading rubygems with: <code>rvm rubygems latest</code>"
  fi
}

__rvm_cli_posix_check()
{
  if
    __rvm_has_opt "posix"
  then
    echo "RVM can not be run with \`set -o posix\`, please turn it off and try again."
    return 100
  fi
}

__rvm_cli_load_rvmrc()
{
  if
    (( ${rvm_ignore_rvmrc:=0} == 0 ))
  then
    [[ -n "${rvm_stored_umask:-}" ]] || export rvm_stored_umask=$(umask)
    rvm_rvmrc_files=("/etc/rvmrc" "$HOME/.rvmrc")
    if
      [[ -n "${rvm_prefix:-}" ]] &&
      [[ ! "$HOME/.rvmrc" -ef "${rvm_prefix}/.rvmrc" ]]
    then
      rvm_rvmrc_files+=( "${rvm_prefix}/.rvmrc" )
    fi
    for rvmrc in "${rvm_rvmrc_files[@]}"
    do
      if
        [[ -f "$rvmrc" ]]
      then
        if
          __rvm_grep '^\s*rvm .*$' "$rvmrc" >/dev/null 2>&1
        then
          printf "%b" "
Error:
        $rvmrc is for rvm settings only.
        rvm CLI may NOT be called from within $rvmrc.
        Skipping the loading of $rvmrc"
          return 1
        else
          source "$rvmrc"
        fi
      fi
    done
    unset rvm_rvmrc_files
  fi
}

__rvm_cli_rvm_reload()
{
  __rvm_project_rvmrc_lock=0
  rvm_reload_flag=1
  source "${rvm_scripts_path:-${rvm_path}/scripts}/rvm"
}

__rvm_cli_version_check()
{
  \typeset disk_version
  disk_version="$( __rvm_version_installed )"

  if
    [[ -s "$rvm_path/VERSION" && "${rvm_version:-}" != "${disk_version:-}" && " $* " != *" reload "* ]]
  then
    if
      (( ${rvm_auto_reload_flag:-0} ))
    then
      __rvm_cli_rvm_reload
    else
      rvm_warn "RVM version <notify>${disk_version}</notify> is installed, yet version <error>${rvm_version}</error> is loaded.

Please open a new shell or run one of the following commands:

    <code>rvm reload</code>
    <code>echo rvm_auto_reload_flag=1 >> ~/.rvmrc</code> <comment># OR for auto reload with msg</comment>
    <code>echo rvm_auto_reload_flag=2 >> ~/.rvmrc</code> <comment># OR for silent auto reload</comment>
"
      return 1
    fi
  fi
}

__rvm_cli_autoupdate_version_old()
{
  online_version="$( __rvm_version_remote )"
  version_release="$(\command \cat "$rvm_path/RELEASE" 2>/dev/null)"
  : version_release:"${version_release:=master}"
  if [[ "${online_version}-next" == "${rvm_version%% *}" ]]; then # development version newer than latest release
    return 1
  fi
  [[ -s "$rvm_path/VERSION" && -n "${online_version:-}" ]] && __rvm_version_compare "${rvm_version%% *}" -lt "${online_version:-}" || return $?
}

__rvm_cli_autoupdate_warning()
{
  rvm_warn "Warning, new version of rvm available '${online_version}', you are using older version '${rvm_version%% *}'.
You can disable this warning with:   echo rvm_autoupdate_flag=0 >> ~/.rvmrc
You can enable auto-update with:     echo rvm_autoupdate_flag=2 >> ~/.rvmrc
You can update manually with:        rvm get VERSION                         (e.g. 'rvm get stable')
"
}

# duplication marker flnglfdjkngjndkfjhsbdjgfghdsgfklgg
rvm_install_gpg_setup()
{
  {
    rvm_gpg_command="$( \which gpg2 2>/dev/null )" &&
    [[ ${rvm_gpg_command} != "/cygdrive/"* ]]
  } || {
    rvm_gpg_command="$( \which gpg 2>/dev/null )" &&
    [[ ${rvm_gpg_command} != "/cygdrive/"* ]]
  } || rvm_gpg_command=""

  rvm_debug "Detected GPG program: '$rvm_gpg_command'"

  [[ -n "$rvm_gpg_command" ]] || return $?
}

# duplication marker rdjgndfnghdfnhgfdhbghdbfhgbfdhbn
verify_package_pgp()
{
  if
    "${rvm_gpg_command}" --verify "$2" "$1"
  then
    rvm_notify "GPG verified '$1'"
  else
    \typeset _return=$?

    rvm_error "\
GPG signature verification failed for '$1' - '$3'! Try to install GPG v2 and then fetch the public key:

    ${SUDO_USER:+sudo }${rvm_gpg_command##*/} --keyserver hkp://pool.sks-keyservers.net --recv-keys 409B6B1796C275462A1703113804BB82D39DC0E3 7D2BAF1CF37B13E2069D6956105BD0E739499BDB

or if it fails:

    command curl -sSL https://rvm.io/mpapis.asc | ${SUDO_USER:+sudo }${rvm_gpg_command##*/} --import -
    command curl -sSL https://rvm.io/pkuczynski.asc | ${SUDO_USER:+sudo }${rvm_gpg_command##*/} --import -

In case of further problems with validation please refer to https://rvm.io/rvm/security
"

    return ${_return}
  fi
}

__rvm_cli_get_and_verify_pgp()
{
  \typeset rvm_gpg_command

  if
    rvm_install_gpg_setup
  then
    pgp_signature_url="$( __rvm_curl -sSI https://get.rvm.io | \tr "\r" " " | __rvm_awk '/Location:/{print $2".asc"}' )"

    rvm_notify "Downloading $pgp_signature_url"

    __rvm_curl -s "${pgp_signature_url}" -o "${rvm_archives_path}/rvm-installer.asc" || return $?

    rvm_notify "Verifying ${rvm_archives_path}/rvm-installer.asc"

    verify_package_pgp "${rvm_archives_path}/rvm-installer" "${rvm_archives_path}/rvm-installer.asc" "$pgp_signature_url" || return $?
  else
    rvm_warn "No GPG software exists to validate rvm-installer, skipping."
  fi
}

__rvm_cli_get_installer_cleanup()
{
  [[ -w "${rvm_archives_path}" ]] ||
  {
    rvm_error "Archives path '${rvm_archives_path}' not writable, aborting."
    return 1
  }
  [[ ! -e "${rvm_archives_path}/rvm-installer" ]] ||
  rm -f "${rvm_archives_path}/rvm-installer" ||
  {
    rvm_error "Previous installer '${rvm_archives_path}/rvm-installer' exists and can not be removed, aborting."
    return 2
  }
}

__rvm_cli_get_and_execute_installer()
{
  __rvm_cli_get_installer_cleanup || return $?

  rvm_log "Downloading https://get.rvm.io"
  __rvm_curl -s https://get.rvm.io -o "${rvm_archives_path}/rvm-installer" ||
  {
    \typeset _ret=$?
    rvm_error "Could not download rvm-installer, please report to https://github.com/rvm/rvm/issues"
    return ${_ret}
  }

  __rvm_cli_get_and_verify_pgp || return $?

  bash "${rvm_archives_path}/rvm-installer" "$@" ||
  {
    \typeset _ret=$?
    rvm_error "Could not update RVM, please report to https://github.com/rvm/rvm/issues"
    return ${_ret}
  }
}

__rvm_cli_rvm_get()
{
  case "$1" in
    ([0-9]*.[0-9]*.[0-9]*)
      rvm_warn "
Hi there, it looks like you have requested updating rvm to version $1,
if your intention was ruby installation use instead: rvm install $1
"
      ;;
  esac
  case "$1" in
    (stable|master|head|branch|latest|latest-*|[0-9]*.[0-9]*.[0-9]*)
      __rvm_cli_get_and_execute_installer "$@" || return $?

      \typeset -x rvm_hook
      rvm_hook="after_update"
      source "${rvm_scripts_path:-"$rvm_path/scripts"}/hook"

      rvm_reload_flag=1
      ;;
    (*)
      rvm_help get
      ;;
  esac
}

__rvm_cli_autoupdate_execute()
{
  printf "%b" "Found old RVM ${rvm_version%% *} - updating.\n"
  __rvm_cli_rvm_get "${version_release}" || return $?
  __rvm_cli_rvm_reload
}

__rvm_cli_autoupdate()
{
  [[ " $* " == *" install "* && " $* " != *" help install "* ]] ||
  [[ " $* " == *" list known "* ]] ||
  return 0

  \typeset online_version version_release
  case "${rvm_autoupdate_flag:-1}" in
    (0|disabled)
      true
      ;;
    (1|warn)
      if __rvm_cli_autoupdate_version_old
      then __rvm_cli_autoupdate_warning
      fi
      ;;
    (2|enabled)
      if __rvm_cli_autoupdate_version_old
      then __rvm_cli_autoupdate_execute || return $?
      fi
      ;;
  esac
  true
}

__rvm_cli_autoreload()
{
  if
    [[ ${rvm_reload_flag:-0} -eq 1 ]]
  then
    if
      [[ -s "$rvm_scripts_path/rvm" ]]
     then
      __rvm_project_rvmrc_lock=0
      source "$rvm_scripts_path/rvm"
    else
      echo "rvm not found in $rvm_path, please install and run 'rvm reload'"
      __rvm_teardown
    fi
  else
    __rvm_teardown
  fi
}

__rvm_cli_install_ruby()
(
  if
    [[ -n "$1" ]]
  then
    \typeset __rubies __installed __missing __search_list
    \typeset -a __search
    __rvm_custom_separated_array __search , "$1"
    __rubies="$1"
    __search_list=""
    __rvm_cli_rubies_select || return $?
    if __rvm_cli_rubies_not_installed
    then __rvm_run_wrapper manage install "${__rubies}" || return $?
    fi
  else
    rvm_error "Can not use or install 'all' rubies. You can get a list of installable rubies with 'rvm list known'."
    false #report error
  fi
)

__rvm_cli_rubies_select()
{
  \typeset __ruby
  for __ruby in "${__search[@]}"
  do
    rvm_ruby_string="${__ruby}"
    __rvm_select &&
    if [[ -n "$rvm_ruby_string" ]]
    then __search_list+="^$rvm_ruby_string\$|"
    else
      rvm_error "Could not detect ruby version/name for installation '${__ruby}', please be more specific."
      return 1
    fi
  done
  __search_list="${__search_list%|}"
}

__rvm_cli_rubies_not_installed()
{
  if
    (( ${rvm_force_flag:-0} == 0 )) &&
    __installed="$(
      __rvm_list_strings | __rvm_grep -E "${__search_list}"
    )" &&
    [[ -n "${__installed}" ]]
  then
    rvm_warn "Already installed ${__installed//|/,}.
To reinstall use:

    rvm reinstall ${__installed//|/,}
"
    return 2
  fi
  true
}
scripts/functions/installer000066400000123774147511530560012212 0ustar00#!/usr/bin/env bash

case "`date +%s:%N`" in
  (*:%N)
    __install_time()
    {
      __time="$SECONDS:"
    }
    ;;
  (*)
    __install_time()
    {
      __time="$(date +%s:%N)"
    }
    ;;
esac

install_run_debug_time()
{
  # 1st s = start, 1st e = end, 1st d = difference, 2nd s = seconds, 2nd n = nanoseconds
  \typeset __ss __sn __es __en __ds __dn __time __status=0
  rvm_debug "step> '$1' started"

  __install_time
  __ss="${__time}"
  "$@" || __status=$?
  __install_time
  __es="${__time}"

  # split seconds and nano
  __sn="${__ss#*:}"
  __sn="${__sn##*(0)}"
  __ss="${__ss%:*}"
  __ss="${__ss##*(0)}"
  __en="${__es#*:}"
  __en="${__en##*(0)}"
  __es="${__es%:*}"
  __es="${__es##*(0)}"

  __ds="$(( __es - __ss ))"
  __dn=""
  if
    [[ -n "${__sn}" && -n "${__en}" ]]
  then
    __dn="$(( __en - __sn ))"
    if
      (( __dn < 0 ))
    then
      __dn="$(( __dn + 1000000000 ))"
      __ds="$(( __ds - 1 ))"
    fi
    if [[ "${__dn}" == "0" ]]
    then __dn=""
    fi
  fi
  __time="${__ds}${__dn:+"$(printf ".%09d" "$__dn")"} seconds"

  rvm_debug "step< '$1' finished with status 0 in ${__time}"
}

install_rvm_step()
{
  install_run_debug_time $1 ||
  {
    \typeset __status=$?
    rvm_error "Installer failed at step '$1' with status ${__status}, please run it with --debug and report a bug."
    return ${__status}
  }
}

install_rvm()
{
  \typeset __step
  \typeset -a __steps
  __steps=()

  load_configuration
  parse_args "$@"
  setup_installer
  load_rvm

  if (( rvm_user_install_flag == 0 ))
  then __steps+=( system_installation_check setup_rvm_group_and_users )
  fi
  __steps+=(
    print_install_header
    cleanse_old_entities
    create_install_paths
    load_custom_flags
    save_custom_flags
    install_rvm_directories
    install_rvm_files
    install_rvm_scripts
    cleanup_old_help_and_docs_files
    install_rvm_hooks
    remove_old_hooks
    install_binaries
    install_gemsets
    install_patchsets
    install_man_pages
    setup_configuration_files
    setup_login_shell
  )
  # not using elif for clarity
  if (( rvm_user_install_flag == 1 ))
  then __steps+=( setup_user_profile )
  else
    if (( UID == 0 ))
    then __steps+=( setup_etc_profile setup_etc_bashrc setup_etc_rvmrc )
    else
      if (( upgrade_flag == 0 ))
      then __steps+=( warning_no_loading_of_rvm )
      fi
    fi
  fi
  __steps+=(
    cleanse_old_environments
    migrate_old_gemsets
    migrate_defaults
    migrate_environments_and_wrappers
    create_gems_aliases
    restore_missing_environments
    record_ruby_configs
    update_gemsets_install_rvm
    configure_autolibs
    update_yaml_if_needed
    cleanup_tmp_files
    record_installation_time
  )
  if
    (( rvm_user_install_flag == 0 ))
  then
    __steps+=(
      setup_rvm_path_permissions_root
      setup_rvm_path_permissions_check_group
      setup_rvm_path_permissions_check_dirs
      setup_rvm_path_permissions_check_files
    )
  fi
  __steps+=(
    print_install_footer
    display_notes
  )
  for __step in "${__steps[@]}"
  do install_rvm_step ${__step} || return $?
  done
}

load_configuration()
{
  set -o errtrace
  export PS4 PATH HOME

  HOME="${HOME%%+(\/)}" # Remove trailing slashes if they exist on HOME

  case "$MACHTYPE" in
    *aix*) name_opt=-name  ;;
    *)     name_opt=-iname ;;
  esac

  if
    (( ${rvm_ignore_rvmrc:=0} == 0 ))
  then
    [[ -n "${rvm_stored_umask:-}" ]] || export rvm_stored_umask=$(umask)

    rvm_rvmrc_files=("/etc/rvmrc" "$HOME/.rvmrc")
    if [[ -n "${rvm_prefix:-}" ]] && ! [[ "$HOME/.rvmrc" -ef "${rvm_prefix}/.rvmrc" ]]
    then rvm_rvmrc_files+=( "${rvm_prefix}/.rvmrc" )
    fi
    for file in "${rvm_rvmrc_files[@]}"
    do
      if [[ -s "$file" ]]
      then . "$file"
      fi
    done
    unset rvm_rvmrc_files
  fi

  PS4="+ \${BASH_SOURCE##\${rvm_path:-}} : \${FUNCNAME[0]:+\${FUNCNAME[0]}()}  \${LINENO} > "

  [[ -z "${rvm_user_path_prefix:-}" ]] || PATH="${rvm_user_path_prefix}:$PATH"

  export ORIGINAL_PATH="$PATH"

  true ${rvm_group_name:=rvm}
  unset rvm_auto_dotfiles_flag
}

parse_args()
{
  true ${DESTDIR:=}
  # Parse RVM Installer CLI arguments.
  while (( $# > 0 ))
  do
    token="$1"
    shift

    case "$token" in
      (--auto-dotfiles|--ignore-dotfiles|--debug|--quiet-curl)
        token=${token#--}
        token=${token//-/_}
        export "rvm_${token}_flag"=1
        ;;
      (--autolibs=*)
        export rvm_autolibs_flag="${token#--autolibs=}"
        ;;
      (--without-gems=*|--with-gems=*|--with-default-gems=*)
        value="${token#*=}"
        token="${token%%=*}"
        token="${token#--}"
        token="${token//-/_}"
        export "rvm_${token}"="${value}"
        ;;
      (--path)
        export rvm_path="$1"
        export rvm_bin_path="$1/bin"
        export rvm_ignore_rvmrc=1
        shift
        ;;
      (--add-to-rvm-group)
        export rvm_add_users_to_rvm_group="$1"
        shift
        ;;
      (--version)
        (
          export rvm_path="${PWD%%+(\/)}"
          echo "$rvm_version"
        )
        exit
        ;;
      (--trace)
        export rvm_trace_flag=1
        set -o xtrace
        echo "$@"
        env | GREP_OPTIONS="" \grep '^rvm_'
        export PS4="+ \${BASH_SOURCE##\${rvm_path:-}} : \${FUNCNAME[0]:+\${FUNCNAME[0]}()}  \${LINENO} > "
        ;;
      (--help)
        install_usage
        exit 0
        ;;
      (*)
        echo "Unrecognized option: $token"
        install_usage
        exit 1
        ;;
    esac
  done

  if [[ -n "${DESTDIR}" ]]
  then
    rvm_prefix="${DESTDIR}"
  fi
}

install_usage()
{
  printf "%b" "
  Usage:

    ${0} [options]

  options:

    --auto-dotfiles   : Automatically update shell profile files.

    --ignore-dotfiles : Do not update shell profile files.

    --path    : Installation directory (rvm_path).

    --help    : Display usage information

    --version : display rvm package version

"
}

setup_installer()
{
  export rvm_prefix rvm_path rvm_user_install_flag rvm_debug_flag rvm_trace_flag upgrade_flag HOME

  HOME="${HOME%%+(\/)}" # Remove trailing slashes if they exist on HOME

  if
    [[ -z "${rvm_path:-}" ]]
  then
    if (( UID == 0 ))
    then rvm_path="/usr/local/rvm"
    else rvm_path="${HOME}/.rvm"
    fi
    rvm_prefix="${rvm_path%/*}"
  fi

  : \
    rvm_bin_path:${rvm_bin_path:=$rvm_path/bin} \
    rvm_man_path:${rvm_man_path:=$rvm_path/man} \
    rvm_user_path:${rvm_user_path:=$rvm_path/user} \
    rvm_scripts_path:${rvm_scripts_path:=$rvm_path/scripts}

  # duplication marker kkdfkgnjfndgjkndfjkgnkfjdgn
  [[ -n "${rvm_user_install_flag:-}" ]] ||
  case "$rvm_path" in
    (/usr/local/rvm)         rvm_user_install_flag=0 ;;
    ($HOME/*|/${USER// /_}*) rvm_user_install_flag=1 ;;
    (*)                      rvm_user_install_flag=0 ;;
  esac

  if [[ -d "$rvm_path" && -s "${rvm_path}/scripts/rvm" ]]
  then upgrade_flag=1
  else upgrade_flag=0
  fi
}

load_rvm()
{
  export install_source_path="$0"
  install_source_path="${install_source_path%/install}"
  install_source_path="${install_source_path%/scripts}" # install -> scripts/install
  \typeset save_rvm_scripts_path="$rvm_scripts_path"
  export rvm_scripts_path="${install_source_path}/scripts"

  source "$rvm_scripts_path/base"
  source "$rvm_scripts_path/functions/autolibs"
  source "$rvm_scripts_path/functions/group"
  source "$rvm_scripts_path/functions/pkg"

  rvm_scripts_path="$save_rvm_scripts_path"

  if [[ "$install_source_path/scripts" != "." && "$install_source_path/scripts" != "$PWD" ]]
  then __rvm_cd "$install_source_path"
  fi

  true "${source_path:=${PWD%%+(\/)}}"
}

system_installation_check()
{
  case "${_system_type}" in
    Linux|Darwin|SunOS|BSD)
      return 0 # Accounted for, continue.
    ;;
    *)
      # it will report 'unknown' or even nothing here!
      rvm_error "Installing RVM as root is currently only supported on the following known OS's (uname):
    Linux, FreeBSD, OpenBSD, DragonFly, Darwin and SunOS
Whereas your OS is reported as '${_system_type}'"
      return 1
    ;;
  esac
}

setup_rvm_group_and_users()
{
  if
    __rvm_group_exists "$rvm_group_name"
  then
    rvm_debug "Group '$rvm_group_name' already exists"
  else
    rvm_log "Creating group '$rvm_group_name'"
    __rvm_create_group "${rvm_group_name}" "${rvm_group_id:-}"
  fi
  if
    [[ -n "${rvm_add_users_to_rvm_group:-}" ]]
  then
    \typeset __user
    \typeset -a __users
    if
      [[ "$rvm_add_users_to_rvm_group" == "all" ]]
    then
      __users=( $( __rvm_list_all_users ) )
    else
      if [[ -n "${ZSH_VERSION:-}" ]]
      then __users=( ${=rvm_add_users_to_rvm_group//,/ } )
      else __users=( ${rvm_add_users_to_rvm_group//,/ } )
      fi
    fi
    for __user in "${__users[@]}"
    do
      if
        __rvm_is_user_in_group "$rvm_group_name" "$__user"
      then
        rvm_debug "User '$__user' already in the RVM group '${rvm_group_name}'"
      else
        rvm_log "Adding user '$__user' to the RVM group '${rvm_group_name}'"
        __rvm_add_user_to_group "$rvm_group_name" "$__user"
      fi
    done
  fi
}

print_install_header()
{
  if [[ ${upgrade_flag:-0} -eq 1 ]]
  then rvm_notify "Upgrading the RVM installation in $rvm_path/"
  else rvm_notify "Installing RVM to $rvm_path/"
  fi
}

cleanse_old_entities()
{
  #
  # Remove old files that no longer exist.
  #
  for script in utility array
  do
    if test -f "$rvm_path/scripts/${script}"
    then \command \rm -f "$rvm_path/scripts/${script}"
    fi
  done
  return 0
}

create_install_paths()
{
  \typeset -a install_paths
  install_paths=(
   archives src log bin gems man rubies config user tmp gems environments wrappers
  )
  for install_path in "${install_paths[@]}"
  do [[ -d "$rvm_path/$install_path" ]] || mkdir -p "$rvm_path/$install_path"
  done

  [[ -z "$rvm_bin_path" || -d "$rvm_bin_path" ]] || mkdir -p "$rvm_bin_path"
  return 0
}

# duplication marker kdfkjkjfdkfjdjkdfkjfdkj
load_custom_flags()
{
  if
    [[ -s "${rvm_path:-}/user/custom_flags" ]]
  then
    \typeset __key __value
    while IFS== read __key __value
    do
      eval "export ${__key}=\"\${__value}\""
    done < "${rvm_path:-}/user/custom_flags"
  fi
}

save_custom_flags()
{
  \typeset -a __variables
  __variables=(
    ^rvm_ignore_dotfiles_flag=
  )
  \typeset IFS="|"
  set | __rvm_grep -E "${__variables[*]}" > "${rvm_path:-}/user/custom_flags"
  true # no failing from __rvm_grep filtering
}

install_rvm_directories()
{
  for entry in $(__rvm_find -L config patches patchsets gem-cache contrib examples lib hooks help docs scripts -type d 2>/dev/null)
  do
    # Target is supposed to be a directory, remove if it is a file.
    if [[ -f "$rvm_path/$entry" ]]
    then \command \rm -f "$rvm_path/$entry"
    fi
    [[ -d "$rvm_path/$entry" ]] || mkdir -p "$rvm_path/$entry"
  done
}

install_rvm_files()
{
  for file in README.md LICENSE VERSION
  do
    __rvm_cp -f "$source_path/${file}" "$rvm_path/${file}"
  done

  for entry in $(__rvm_find -L config patches gem-cache contrib examples lib help docs -type f 2>/dev/null)
  do
    # Target is supposed to be a file, remove if it is a directory.
    if [[ -d "$rvm_path/$entry" ]]
    then __rvm_rm_rf "$rvm_path/$entry"
    fi
    \command \cat < "$source_path/$entry" > "$rvm_path/$entry"
    if [[ -x "$source_path/$entry" && ! -x "$rvm_path/$entry" ]]
    then chmod +x "$rvm_path/$entry"
    fi
  done
}

install_rvm_scripts()
{
  case "${_system_type}" in
    (SunOS)
      # SmartOS bash and /opt/local/bin/test have a bug checking for executable bit when
      # run as root user. Reported here: https://github.com/joyent/smartos-live/issues/318
      chmod_if_needed()
      {
        if /usr/bin/test -x "$1" && ! /usr/bin/test -x "$2"
        then chmod +x "$2"
        fi
      }
    ;;
    *)
      chmod_if_needed()
      {
        if [[ -x "$1" && ! -x "$2" ]]
        then chmod +x "$2"
        fi
      }
    ;;
  esac

  for entry in $(__rvm_find -L scripts -type f 2>/dev/null)
  do
    # Target is supposed to be a file, remove if it is a directory.
    if [[ -d "$rvm_path/$entry" ]]
    then __rvm_rm_rf "$rvm_path/$entry"
    fi
    if
      [[ "$entry" == "scripts/extras/completion.zsh/_rvm" || "$entry" == "scripts/zsh/Completion/_rvm" ]]
    then
      if [[ ! -f "$rvm_path/$entry" ]] || __rvm_rm_rf "$rvm_path/$entry" 2>/dev/null
      then __rvm_cp -f "$source_path/$entry" "$rvm_path/$entry"
      else rvm_log "    Can not update '$entry', it's a conflict between Zsh and multiuser installation, prefix the command with 'rvmsudo' to update this file."
      fi
    else
      \command \cat < "$source_path/$entry" > "$rvm_path/$entry"
      chmod_if_needed "$source_path/$entry" "$rvm_path/$entry"
    fi
  done
  true # for osx
}

cleanup_old_help_and_docs_files()
{
  find "$rvm_path/help" -type f \! \( -name '*.md' -o -name '*.txt' \) -exec rm '{}' \;
  find "$rvm_path/docs" -type f \! \( -name '*.md' -o -name '*.txt' \) -exec rm '{}' \;
  true # for osx
}

install_rvm_hooks()
{
  \typeset hook_x_flag entry name

  for entry in $(__rvm_find -L hooks -type f 2>/dev/null)
  do
    # Target is supposed to be a file, remove if it is a directory.
    if [[ -d "$rvm_path/$entry" ]]
    then __rvm_rm_rf "$rvm_path/$entry"
    fi
    # Source is first level hook (after_use) and target is custom user hook, preserve it
    if
      [[ -f "$rvm_path/$entry" ]] &&
      __rvm_grep -E '^hooks/[[:alpha:]]+_[[:alpha:]]+$' >/dev/null <<<"$entry" &&
      ! __rvm_grep "$(basename ${entry})_\*" "$rvm_path/$entry" >/dev/null
    then
      \command \mv -f "$rvm_path/$entry" "$rvm_path/${entry}_custom"
    fi
    hook_x_flag=0
    [[ -x "$rvm_path/$entry" ]] || hook_x_flag=$?

    __rvm_cp -f "$source_path/$entry" "$rvm_path/$entry"

    if (( hook_x_flag == 0 ))
    then [[ -x "$rvm_path/$entry" ]] || chmod a+rx "$rvm_path/$entry"
    fi
  done
}

remove_old_hooks()
{
  for entry in after_use_custom after_use after_cd
  do
    name=${entry#after_}
    name=${name%_*}
    if
      [[ -f "$rvm_path/hooks/$entry" ]] &&
      __rvm_grep "after_${name}_\*" "$rvm_path/hooks/$entry" >/dev/null
    then
      \command \rm -f "$rvm_path/hooks/$entry"
    fi
  done
}

install_binaries()
{
  \typeset -a files
  \typeset system_bin
  files=(
    rvm-prompt rvm rvmsudo rvm-shell rvm-smile rvm-exec rvm-auto-ruby
    ruby-rvm-env rvm-shebang-ruby
  )

  [[ -d "${rvm_bin_path}" ]] || mkdir -p "${rvm_bin_path}"

  for file in "${files[@]}"
  do
    if [[ -e "${rvm_bin_path}/${file}" ]] &&
    [[ ! -f "${rvm_bin_path}/${file}"  || -L "${rvm_bin_path}/${file}" ]]
    then \command \rm -f "${rvm_bin_path}/${file}"
    fi

    if
      [[ -L "${source_path}/bin/${file}" ]]
    then
      ln -s "$( readlink "${source_path}/bin/${file}" )" "${rvm_bin_path}/${file}"
    else
      \command \cat < "${source_path}/bin/${file}" > "${rvm_bin_path}/${file}"
    fi

    [[ -x "${rvm_bin_path}/${file}" ]] || chmod a+rx "${rvm_bin_path}/${file}"

    # try to clean old installer files left in usual places added to PATH
    for system_bin in ~/bin /usr/bin /usr/local/bin
    do
      if
        [[ "${system_bin}" != "${rvm_bin_path}" && -x "${system_bin}/${file}" ]]
      then
        \command \rm -f "${system_bin}/${file}" 2>/dev/null ||
        rvm_out "!!! could not remove ${system_bin}/${file}, remove it manually with:
!!! > sudo \command \rm -f ${system_bin}/${file}
"
      fi
    done
  done
  return 0
}

update_gemsets_rvmrc()
{
  if
    [[ -n "$2" ]]
  then
    if [[ -f ~/.rvmrc ]] && __rvm_grep "^$1=" ~/.rvmrc >/dev/null
    then __rvm_sed_i ~/.rvmrc -e "s/^$1=.*$/$1=\"$2\"/"
    else printf "%b" "\n$1=\"$2\"\n" >> ~/.rvmrc
    fi
  else
    if [[ -f ~/.rvmrc ]]
    then __rvm_sed_i ~/.rvmrc -e "/^$1=/ d"
    fi
  fi
}

install_gemsets()
{
  \typeset gemset_files

  if [[ ${rvm_keep_gemset_defaults_flag:-0} == 0 && -d "$rvm_path/gemsets" ]]
  then __rvm_find "$rvm_path/gemsets" -type f -exec rm '{}' \;
  fi

  [[ -d "$rvm_path/gemsets" ]] || mkdir -p "$rvm_path/gemsets"

  __rvm_read_lines gemset_files <(
    __rvm_find "gemsets" "${name_opt}" '*.gems'
  )

  for gemset_file in "${gemset_files[@]}"
  do
    destination="$rvm_path/gemsets/${gemset_file#gemsets/}"
    if
      [[ ! -s "$destination" ]]
    then
      destination_path="${destination%/*}"
      [[ -d "$destination_path" ]] || mkdir -p "$destination_path"
      \command \cat < "$gemset_file" > "$destination"
    fi
  done

  update_gemsets_rvmrc rvm_without_gems      "${rvm_without_gems}"
  update_gemsets_rvmrc rvm_with_gems         "${rvm_with_gems}"
  update_gemsets_rvmrc rvm_with_default_gems "${rvm_with_default_gems}"
}

install_patchsets()
{
  if
    [[ ${rvm_keep_patchsets_flag:-0} == 0 && -d "$rvm_path/patchsets" ]]
  then
    __rvm_find "$rvm_path/patchsets/" -type f -exec rm '{}' \;
  fi
  if
    [[ -d patchsets/ ]]
  then
    [[ -d "$rvm_path/patchsets" ]] || mkdir -p "$rvm_path/patchsets"
    patchsets=($(
      __rvm_find patchsets/ -type f
    ))
    for patchset_file in "${patchsets[@]}"
    do
      destination="$rvm_path/$patchset_file"
      if
        [[ ! -s "$destination" || "${patchset_file##*/}" == "default" ]]
      then
        if [[ -d "$destination"    ]]
        then \command \rm -f "$destination"
        fi
        \command \cat < "$patchset_file" > "$destination"
      fi
    done
  fi
}

install_man_pages()
{
  files=($(
    __rvm_cd "$install_source_path/man"
    __rvm_find . -maxdepth 2 -mindepth 1 -type f -print
  ))

  for file in "${files[@]//.\/}"
  do
    [[ -d $rvm_man_path/${file%\/*} ]] ||
    {
      mkdir -p $rvm_man_path/${file%\/*}
      install_fix_rights $rvm_man_path/${file%\/*}
    }
    __rvm_cp -Rf "$install_source_path/man/$file" "$rvm_man_path/$file" || \
      rvm_out "

    Please run the installer using rvmsudo to fix file permissions

"
    install_fix_rights "$rvm_man_path/$file"
  done
}

setup_configuration_files()
{
  \typeset _save_dir
  _save_dir="$PWD"
  __rvm_cd "$rvm_path"

  if [[ -f config/user ]]
  then \command \mv config/user user/db
  fi

  if [[ -f config/installs ]]
  then \command \mv config/installs user/installs
  fi

  if [[ -s config/rvmrcs ]]
  then \command \mv config/rvmrcs user/rvmrcs
  fi

  [[ -s user/db ]] ||
    echo '# User settings, overrides db settings and persists across installs.' >> user/db

  [[ -f user/rvmrcs ]] || > user/rvmrcs
  [[ -f user/md5    ]] || > user/md5
  [[ -f user/sha512 ]] || > user/sha512

  # Prune old (keyed-by-hash) trust entries
  __rvm_grep '^_' user/rvmrcs > user/rvmrcs.new || true
  \command \mv user/rvmrcs.new user/rvmrcs

  __rvm_cd "${_save_dir}"
}

setup_login_shell()
{
  if [ "$COLORTERM" = "gnome-terminal" ]
  then
    if __rvm_grep "entry name=['\"]login_shell['\"]" ~/.gconf/apps/gnome-terminal/profiles/Default/%gconf.xml > /dev/null
    then
      :
    else
      __rvm_sed_i "/<gconf>/ a<entry name='login_shell' mtime='`date +%s`' type='bool' value='true'/>" ~/.gconf/apps/gnome-terminal/profiles/Default/%gconf.xml
    fi
  fi
}

check_file_group()
{
  \typeset _group
  _group="$( __rvm_statf "%G" "%Sg" "$1" )"
  [[ "${_group}" == "$2" ]] || return $?
  true # for OSX
}

check_file_rights()
{
  \typeset _all
  _all="$( __rvm_statf "%A" "%Sp" "$1" )"
  shift
  while
    (( $# ))
  do
    case "$1" in
      (g+w) [[ "${_all:5:1}" == "w" ]] || return $? ;;
      (a+r) [[ "${_all:7:1}" == "r" ]] || return $? ;;
      (a-r) [[ "${_all:7:1}" == "-" ]] || return $? ;;
    esac
    shift
  done
  true # for OSX
}

permissions_warning()
{
  rvm_warn "    $1, prefix the command with 'rvmsudo' to fix it, if the situation persist report a bug."
  if [[ -n "${2:-}" ]]
  then return $2
  fi
}

install_fix_rights()
{
  (( ${rvm_user_install_flag:-0} == 0 ))   || return 0
  check_file_group  "$1" "$rvm_group_name" || chown :$rvm_group_name "$1" || permissions_warning "could not set group of '$1'"
  check_file_rights "$1" g+w               || chmod g+rwX "$1"            || permissions_warning "could not fix perissions of '$1'"
}

setup_etc_profile()
{
  export etc_profile_file="/etc/profile.d/rvm.sh"

  if [[ -s "${etc_profile_file}" ]] || (( ${rvm_auto_dotfiles_flag:-1} == 0 ))
  then return 0
  fi

  \typeset executable add_to_profile_flag zshrc_file ps_ucomm_alias
  if
    [[ -d /etc/profile.d ]]
  then
    add_to_profile_flag=0
    executable=1
  else
    add_to_profile_flag=1
    executable=0
    mkdir -p /etc/profile.d
  fi
  if [[ "$(uname)" == "SunOS" ]]
  then
    # Solaris default ps doesn't provide ucomm
    ps_ucomm_alias=comm
  else
    ps_ucomm_alias=ucomm
  fi

# partial duplication marker dkjnkjvnckbjncvbkjnvkj
# prevent from loading in sh shells
  printf "%b" "#
# RVM profile
#
# /etc/profile.d/rvm.sh # sh extension required for loading.
#

if
  [ -n \"\${BASH_VERSION:-}\" -o -n \"\${ZSH_VERSION:-}\" ] &&
  test \"\`\\\\command \\\\ps -p \$\$ -o ${ps_ucomm_alias}=\`\" != dash &&
  test \"\`\\\\command \\\\ps -p \$\$ -o ${ps_ucomm_alias}=\`\" != sh
then
  [[ -n \"\${rvm_stored_umask:-}\" ]] || export rvm_stored_umask=\$(umask)

  # Load user rvmrc configurations, if exist
  for file in \"/etc/rvmrc\" \"\$HOME/.rvmrc\"
  do
    [[ -s \"\$file\" ]] && source \$file
  done
  if
    [[ -n \"\${rvm_prefix:-}\" ]] &&
    [[ -s \"\${rvm_prefix}/.rvmrc\" ]] &&
    [[ ! \"\$HOME/.rvmrc\" -ef \"\${rvm_prefix}/.rvmrc\" ]]
  then
    source \"\${rvm_prefix}/.rvmrc\"
  fi

  # Load RVM if it is installed, try user then root install
  if
    [[ -s \"\$rvm_path/scripts/rvm\" ]]
  then
    source \"\$rvm_path/scripts/rvm\"
  elif
    [[ -s \"\$HOME/.rvm/scripts/rvm\" ]]
  then
    true \${rvm_path:=\"\$HOME/.rvm\"}
    source \"\$HOME/.rvm/scripts/rvm\"
  elif
    [[ -s \"/usr/local/rvm/scripts/rvm\" ]]
  then
    true \${rvm_path:=\"/usr/local/rvm\"}
    source \"/usr/local/rvm/scripts/rvm\"
  fi

  # Add \$rvm_bin_path to \$PATH if necessary. Make sure this is the last PATH variable change
  if [[ -n \"\${rvm_bin_path}\" && ! \":\${PATH}:\" == *\":\${rvm_bin_path}:\"* ]]
  then PATH=\"\${PATH}:\${rvm_bin_path}\"
  fi
fi
" > "${etc_profile_file}"

  if
    (( executable )) && check_file_rights "${etc_profile_file}" a-x
  then
    chmod a+rx "${etc_profile_file}" || permissions_warning "could not fix '${etc_profile_file}' rights"
  fi

  if
    (( add_to_profile_flag )) &&
    ! __rvm_grep "source ${etc_profile_file}" /etc/profile >/dev/null 2>&1
  then
    printf "%b" "\ntest -f ${etc_profile_file} && source ${etc_profile_file}\n" >> /etc/profile
  fi

  for zshrc_file in $(
      __rvm_find /etc/ -name zprofile -type f 2>/dev/null ;
      __rvm_find /etc/ -name zlogin   -type f 2>/dev/null ;
      true
    ) /etc/zprofile
  do
    if
      [[ ! -f "${zshrc_file}" ]]
    then
      printf "%b" "\ntest -f ${etc_profile_file} && source ${etc_profile_file}\n" > $zshrc_file
    elif
      ! __rvm_grep "source /etc/bash"    "${zshrc_file}" &&
      ! __rvm_grep "source /etc/profile" "${zshrc_file}"
    then
      printf "%b" "\ntest -f ${etc_profile_file} && source ${etc_profile_file}\n" >> $zshrc_file
    fi
    break # process only first file found
  done
}

print_etc_bashrc_change()
{
  printf "%b" "
type rvm >/dev/null 2>/dev/null || echo \${PATH} | __rvm_grep \"${rvm_bin_path}\" > /dev/null || export PATH=\"\${PATH}:${rvm_bin_path}\"
"
}

# Ubuntu does not source /etc/profile when we're running command such as "ssh my-ubuntu env"
# So we add source ${etc_profile_file} in /etc/bash.bashrc
setup_etc_bashrc()
{
  \typeset system_bashrc_file new_content_path
  system_bashrc_file="/etc/bash.bashrc"

  if [[ -s "${system_bashrc_file}" ]] || (( ${rvm_auto_dotfiles_flag:-1} == 0 ))
  then return 0
  fi

  if
    [[ ! -f "${system_bashrc_file}" ]]
  then
    print_etc_bashrc_change > "${system_bashrc_file}" 2>/dev/null ||
      permissions_warning "could not create '${system_bashrc_file}'" $? ||
      return $?
  elif
    ! __rvm_grep "PATH=.*${rvm_bin_path}" "${system_bashrc_file}" >/dev/null
  then
    new_content_path="$( mktemp ${TMPDIR:-/tmp}/tmp.XXXXXXXXXXXXXXXXXX )"
    [[ ! -f "${new_content_path}" ]] || \command \rm -f "${new_content_path}"
    {
      print_etc_bashrc_change # prepend
      __rvm_grep -v "|| export PATH=\"\${PATH}:\"" < "${system_bashrc_file}"
      true
    } > "${new_content_path}" &&
    \command \mv "${new_content_path}" "${system_bashrc_file}" 2>/dev/null ||
      permissions_warning "could not update '${system_bashrc_file}'" $? ||
      return $?
  fi
  check_file_rights $system_bashrc_file a+r ||
    chmod a+r $system_bashrc_file ||
    permissions_warning "File '$system_bashrc_file' is not readable for all users, this might cause problems in loading RVM" $? ||
    return $?
}

setup_etc_rvmrc()
{
  rvmrc_file="/etc/rvmrc"
  if
    [[ -f $rvmrc_file ]] &&
    __rvm_grep '#umask' $rvmrc_file >/dev/null
  then
    true # commented out, skip it!
  elif
    [[ -f $rvmrc_file ]] &&
    __rvm_grep 'umask g+w' $rvmrc_file >/dev/null
  then
    __rvm_sed_i $rvmrc_file -e 's/umask g+w/umask u=rwx,g=rwx,o=rx/'
  elif
    ! [[ -f $rvmrc_file ]] ||
    ! __rvm_grep 'umask' $rvmrc_file >/dev/null
  then
    echo 'umask u=rwx,g=rwx,o=rx' >> $rvmrc_file
  fi
  if
    [[ "${rvm_path}" != "/usr/local/rvm" ]] &&
    ! __rvm_grep 'rvm_path' $rvmrc_file >/dev/null
  then
    echo "rvm_path=\"${rvm_path}\"" >> $rvmrc_file
  fi
  if [[ -s $rvmrc_file ]]
  then install_fix_rights $rvmrc_file
  fi
  return 0
}

pick_a_file()
{
  \typeset _file _result
  _result=$1
  shift
  for _file
  do
    if
      [[ -f "$_file" ]]
    then
      eval "${_result}+=( \"\$_file\" )"
      return 0
    fi
  done
  eval "${_result}+=( \"\$1\" )"
}

setup_user_profile_check()
{
  case "${rvm_ignore_dotfiles_flag:-${rvm_ignore_dotfiles:-no}}" in
    (yes|1) return 1 ;;
  esac
  return 0
}

setup_user_profile_detect()
{
  etc_profile_file="/etc/profile.d/rvm.sh"
  search_list_mksh=( "$HOME/.mkshrc" "$HOME/.profile" )
  search_list_bash=( "$HOME/.bashrc" "$HOME/.bash_profile" "$HOME/.bash_login" )
  search_list_zsh=( "${ZDOTDIR:-${HOME}}/.zshenv" "${ZDOTDIR:-${HOME}}/.zprofile" "${ZDOTDIR:-${HOME}}/.zshrc" "${ZDOTDIR:-${HOME}}/.zlogin" )
  search_list=( "${search_list_mksh[@]}" "${search_list_bash[@]}" "${search_list_zsh[@]}" )

  target_rc=( "$HOME/.profile" "$HOME/.mkshrc" "$HOME/.bashrc" "${ZDOTDIR:-${HOME}}/.zshrc" )

  target_login=( "$HOME/.profile" )
  pick_a_file target_login "$HOME/.bash_profile" "$HOME/.bash_login"
  target_login+=( "${ZDOTDIR:-${HOME}}/.zlogin" )

  for profile_file in "${search_list[@]}"
  do
    if
      [[ -f "$profile_file" ]]
    then
      if
        __rvm_grep PATH=.*$local_rvm_path/bin "$profile_file" >/dev/null
      then
        found_rc+=( "$profile_file" )
      fi
      if
        __rvm_grep \..*scripts/rvm "$profile_file" >/dev/null
      then
        found_login+=( "$profile_file" )
      elif
        __rvm_grep source.*scripts/rvm "$profile_file" >/dev/null
      then
        found_login+=( "$profile_file" )
      fi
    fi
  done
}

setup_user_profile_summary()
{
  eval "\typeset __list_found=\"\${${1}[*]}\""
  \typeset __target="$2"
  rvm_log "    RVM ${__target} line found in ${__list_found}."

  \typeset __bash_included=0
  \typeset  __zsh_included=0
  __rvm_string_includes "${__list_found}" "${search_list_bash[@]}" || __bash_included=$?
  __rvm_string_includes "${__list_found}" "${search_list_zsh[@]}"  ||  __zsh_included=$?

  \typeset __missing=""
  if (( __bash_included>0 && __zsh_included>0  ))
  then __missing="Bash or Zsh"
  elif (( __bash_included>0 ))
  then __missing="Bash"
  elif (( __zsh_included>0 ))
  then __missing="Zsh"
  fi
  if [[ -n "${__missing}" ]]
  then rvm_warn "    RVM ${__target} line not found for ${__missing}, rerun this command with '--auto-dotfiles' flag to fix it."
  fi
}

setup_user_profile_rc()
{
  if
    (( rvm_auto_dotfiles_flag == 1 && ${#found_rc[@]} > 0 ))
  then
    rvm_out "    Removing rvm PATH line from ${found_rc[*]}."
    for profile_file in "${found_rc[@]}"
    do
      __rvm_sed_i "${profile_file}" -e '/PATH=.*'"$local_rvm_path_sed"'\/bin/ d;'
      # also delete duplicate blank lines
      __rvm_sed_i "${profile_file}" -e '/^\s*$/{ N; /^\n$/ D; };'
    done
    found_rc=()
  fi
  if
    (( rvm_auto_dotfiles_flag == 1 || ${#found_rc[@]} == 0 ))
  then
    rvm_out "    Adding rvm PATH line to ${target_rc[*]}."
    for profile_file in "${target_rc[@]}"
    do
      touch "$profile_file"
      printf "%b" "
# Add RVM to PATH for scripting. Make sure this is the last PATH variable change.
export PATH=\"\$PATH:$local_rvm_path/bin\"
" >> "$profile_file"
    done
  else
    setup_user_profile_summary found_rc "PATH"
  fi
}

setup_user_profile_login()
{
  if
    (( rvm_auto_dotfiles_flag == 1 && ${#found_login[@]} > 0 ))
  then
    rvm_out "    Removing rvm loading line from ${found_login[*]}."
    for profile_file in "${found_login[@]}"
    do
      __rvm_sed_i "${profile_file}" -e '/source.*scripts\/rvm/ d; /\. .*scripts\/rvm/ d;'
      # also delete duplicate blank lines
      __rvm_sed_i "${profile_file}" -e '/^\s*$/{ N; /^\n$/ D; };'
    done
    found_rc=()
  fi
  if
    (( rvm_auto_dotfiles_flag == 1 || ${#found_login[@]} == 0 ))
  then
    rvm_out "    Adding rvm loading line to ${target_login[*]}."
    for profile_file in "${target_login[@]}"
    do
      [[ -f "$profile_file" ]] ||
      {
        touch "$profile_file"
        if
          [[ "$profile_file" == "$HOME/.bash_"* && -f "$HOME/.profile" ]]
        then
          printf "%b" "
[[ -s \"\$HOME/.profile\" ]] && source \"\$HOME/.profile\" # Load the default .profile
" >> "$profile_file"
        fi
      }
      printf "%b" "
[[ -s \"$local_rvm_path/scripts/rvm\" ]] && source \"$local_rvm_path/scripts/rvm\" # Load RVM into a shell session *as a function*
" >> "$profile_file"
    done
  else
    setup_user_profile_summary found_login "sourcing"
  fi
}

setup_user_profile()
{
  setup_user_profile_check || return 0

  export user_profile_file
  \typeset -a search_list search_list_mksh search_list_bash search_list_zsh
  \typeset -a target_rc target_login found_rc found_login
  \typeset etc_profile_file profile_file local_rvm_path local_rvm_path_sed
  local_rvm_path="${rvm_path/#$HOME/\$HOME}"
  local_rvm_path_sed="\\${local_rvm_path//\./\\.}"
  local_rvm_path_sed="${local_rvm_path_sed//\//\/}"

  setup_user_profile_detect
  setup_user_profile_rc
  setup_user_profile_login

  true # for osx
}

warning_no_loading_of_rvm()
{
  rvm_error "    Warning! Installing RVM in system mode without root permissions, make sure to modify PATH / source rvm when it's needed."
}

cleanse_old_environments()
{
  if
    [[ -d "$rvm_path/environments" ]]
  then
    for file in "$rvm_path/environments"/*
    do
      # Remove broken links
      if
        [[ -L "$file" && ! -e "$file" ]]
      then
        rm -f "$file"
      fi
      if
        [[ -f "$file" ]]
      then
        # Remove BUNDLE_PATH from environment files
        if
          __rvm_grep 'BUNDLE_PATH' "$file" >/dev/null 2>&1
        then
          __rvm_grep -v 'BUNDLE_PATH' "$file" > "$file.new" &&
          \command \mv "$file.new" "$file"
        fi
        # regenerate when found broken path :/bin:/bin or missing $PATH
        if
          __rvm_grep ':/bin:/bin' "$file" >/dev/null 2>&1 ||
          __rvm_grep "[^_]PATH=" "$file" | __rvm_grep -v "\$PATH" >/dev/null 2>&1
        then
          ruby_version="${file##*environments/}"
          rvm_out "    Fixing environment for ${ruby_version}."
          __rvm_with "${ruby_version}" __rvm_ensure_has_environment_files
        fi
      fi
    done
  fi
}

migrate_old_gemsets()
{
  for gemset in "$rvm_path"/gems/*\%*
  do
    new_path=${gemset/\%/${rvm_gemset_separator:-"@"}}
    if
      [[ -d "$gemset" ]] && [[ ! -d "$new_path" ]]
    then
      rvm_out "    Renaming $(basename "$gemset") to $(basename "$new_path") for new gemset separator."
      \command \mv "$gemset" "$new_path"
    fi
  done

  for gemset in "$rvm_path"/gems/*\+*
  do
    new_path=${gemset/\+/${rvm_gemset_separator:-"@"}}
    if
      [[ -d "$gemset" && ! -d "$new_path" ]]
    then
      rvm_out "    Renaming $(basename "$gemset") to $(basename "$new_path") for new gemset separator."
      \command \mv $gemset $new_path
    fi
  done

  for gemset in "$rvm_path"/gems/*\@
  do
    new_path="$( __rvm_sed -e 's#\@$##' <<<"$gemset" )"
    if
      [[ -d "$gemset" && ! -d "$new_path" ]]
    then
      rvm_out "    Fixing: $(basename "$gemset") to $(basename "$new_path") for new gemset separator."
      \command \mv "$gemset" "$new_path"
    fi
  done
}

# Move from legacy defaults to the new, alias based system.
migrate_defaults()
{
  [[ -s "$rvm_path/config/default" ]] || return 0

  \typeset original_version="$(
    basename "$(
      __rvm_grep GEM_HOME "$rvm_path/config/default" |
        __rvm_awk -F"'" '{print $2}' | __rvm_sed "s#\%#${rvm_gemset_separator:-"@"}#"
    )"
  )"
  if [[ -n "$original_version" ]]
  then "$rvm_scripts_path/alias" create default "$original_version" &> /dev/null
  fi
  __rvm_rm_rf "$rvm_path/config/default"
}

migrate_environments_and_wrappers()
{
  \typeset environment_file wrappers_path new_path ruby_version

  for environment_file in "$rvm_path"/environments/*
  do
    ruby_version="${environment_file##*/}"
    new_path="$rvm_path/gems/${ruby_version}/environment"
    if
      [[ -f "$environment_file" && ! -L "$environment_file" && -d "${new_path%/*}" && ! -e "$new_path" ]]
    then
      rvm_out "    Migrating environment ${ruby_version} to use with 'gem-wrappers' gem."
      \command \mv "$environment_file" "$new_path" && \command \ln -s "$new_path" "$environment_file"
    fi
  done

  for wrappers_path in "$rvm_path"/wrappers/*
  do
    ruby_version="${wrappers_path##*/}"
    new_path="$rvm_path/gems/${ruby_version}/wrappers"
    if
      [[ -d "$wrappers_path" && ! -L "$wrappers_path" && -d "${new_path%/*}" && ! -e "$new_path" ]]
    then
      rvm_out "    Migrating wrappers ${ruby_version} to use with 'gem-wrappers' gem."
      \command \mv "$wrappers_path" "$new_path" && \command \ln -snf "$new_path" "$wrappers_path"
    fi
  done

  __rvm_grep -rl 'unset GEM_HOME' "$rvm_path/gems"/*/environment "$rvm_path/environments"/ 2>/dev/null |
  while read environment_file
  do
    ruby_version="${environment_file%/environment}"
    ruby_version="${ruby_version##*/}"
    rvm_out "    Fixing environment for ${ruby_version}."
    __rvm_with "${ruby_version}" __rvm_ensure_has_environment_files
  done
}

create_gems_aliases()
{
  [[ -s "$rvm_path/config/alias" ]] || return 0
  \typeset __alias __ruby
  \typeset -a __aliases
  __rvm_read_lines __aliases "$rvm_path/config/alias"
  for __alias in "${__aliases[@]}"
  do
    __ruby="${__alias#*=}"
    __alias="${__alias%%=*}"
    [[ -e "$rvm_path/gems/${__alias}" ]] ||
      \command \ln -snf "$rvm_path/gems/${__ruby}" "$rvm_path/gems/${__alias}"
  done
}

restore_missing_environments()
{
  if
    [[ -d "$rvm_path/rubies" ]]
  then
    [[ -d "$rvm_path/environments" ]] || mkdir -p "$rvm_path/environments"

    for ruby_path in "$rvm_path"/rubies/*
    do
      ruby_version="${ruby_path##*/}"
      environment_path="$rvm_path/environments/${ruby_version}"
      if
        [[ "${ruby_version}" == "*" || -e "$environment_path" ]]
      then
        true
      elif
        [[ "${ruby_version}" == "gems" ]]
      then
        rvm_out "    Removing unexpected ruby: ${ruby_version}."
        \command \rm -rf "${ruby_path}"
      elif
        [[ -L "$ruby_path" ]]
      then
        ruby_target="$(readlink "$ruby_path")"
        ruby_target="${ruby_target##*/}"
        environment_tareget="$rvm_path/environments/${ruby_target}"
        rvm_out "    Fixing environment link for ${ruby_version}."
        \command \ln -nsf "$environment_tareget" "$environment_path"
      else
        rvm_out "    Fixing environment for ${ruby_version}."
        __rvm_with "${ruby_version}" __rvm_ensure_has_environment_files
      fi
    done
  fi
}

record_ruby_configs()
{
  __rvm_record_ruby_configs
}

update_gemsets_install_rvm()
{
  \typeset _iterator _gem installed found missing _current_path
  \typeset -a paths missing

  [[ ${rvm_keep_gemset_defaults_flag:-0} == 0 ]] || return 0

  # rvm /gems
  paths=($(
    __rvm_find "$rvm_path/gems" -maxdepth 1 "${name_opt}" '*@global'
  ))

  for _gem in rvm gem-wrappers
  do
    [[ " ${rvm_without_gems:-} " == *" ${_gem} "* ]] ||
    {
      missing=()

      for _iterator in "${paths[@]}"
      do
        # skip unless this ruby is installed
        installed="${_iterator%@global}"
        installed="${installed/\/gems\//\/rubies\//}/bin"
        installed="${installed//\\/}"
        [[ -x "${installed}/ruby" ]] || continue
        [[ -x "${installed}/gem" ]] || continue

        _current_path="${_iterator%%+(\/)}/gems"
        # rvm /gems @global /gems
        found=($(
          [[ ! -d "${_current_path}" ]] ||
          __rvm_find "${_current_path}" -maxdepth 1 "${name_opt}" ${_gem}-'*'
        ))
        (( ${#found[@]} > 0 )) || missing+=( "${installed}=${_iterator}" )
      done

      if
        (( ${#missing[@]} > 0 ))
      then
        for _iterator in "${missing[@]}"
        do
          __gem_home="${_iterator#*=}"
          __rvm_with "${__gem_home##*/}" gem_install ${_gem}
        done | __rvm_dotted "    Installing ${_gem} gem in ${#missing[@]} gemsets"
      fi

      if
        [[ "${_gem}" == "gem-wrappers" ]] &&
        (( ${#missing[@]} > 0 ))
      then
        for _iterator in "${missing[@]}"
        do
          installed="${_iterator#*=}"
          installed="${installed%@global}"
          for __gem_home in "${installed}"{,@*}
          do
            if [[ "${__gem_home}" == *"@*" ]]
            then continue
            fi
            __rvm_with "${__gem_home##*/}" gem pristine gem-wrappers --only-plugins
            __rvm_with "${__gem_home##*/}" gem wrappers regenerate
          done
        done | __rvm_dotted "    Regenerating gem wrappers in ${#missing[@]} rubies"
      fi
    }
  done
}

configure_autolibs()
(
  # remove old version from rvmrc
  for rvmrc in /etc/rvmrc "$HOME/.rvmrc"
  do
    if
      [[ -s "$rvmrc" ]] &&
      __rvm_grep 'rvm_autolibs_flag=' "$rvmrc" >/dev/null 2>&1
    then
      [[ -w "$rvmrc" ]] &&
      __rvm_sed '/rvm_autolibs_flag=/ d' < "$rvmrc" > "$rvmrc.backup" &&
      \command \mv -f "$rvmrc.backup" "$rvmrc" ||
      rvm_error "    Can not automatically remove lines with 'rvm_autolibs_flag=' from '$rvmrc', please clean it manually."
    fi
  done

  if
    [[ -s "$rvmrc" ]] &&
    __rvm_grep 'rvm_autolibs_flag=' "$rvmrc" >/dev/null 2>&1
  then
    export rvm_autolibs_flag="$( __rvm_awk -F'=' '/rvm_autolibs_flag=/{print $2}' <"$rvmrc" )"
    [[ -w "$rvmrc" ]] &&
    __rvm_sed '/rvm_autolibs_flag/ d' < "$rvmrc" > "$rvmrc.backup" &&
    \command \mv -f "$rvmrc.backup" "$rvmrc" || true
  fi

  # migrate SMF settings
  rvmrc=/etc/rvmrc
  if
    [[ -s "$rvmrc" ]] &&
    __rvm_grep 'rvm_configure_env=.*/opt/sm' "$rvmrc" >/dev/null 2>&1
  then
    export rvm_autolibs_flag=smf
    [[ -w "$rvmrc" ]] &&
    __rvm_sed '/rvm_configure_env/ d' < "$rvmrc" > "$rvmrc.backup" &&
    \command \mv -f "$rvmrc.backup" "$rvmrc" || true
  fi

  [[ -n "${rvm_autolibs_flag:-}" ]] || return 0

  # save if proper value
  if
    __rvm_autolibs_translate
  then
    __rvm_db_ "$rvm_user_path/db" "autolibs" "$rvm_autolibs_flag"
  else
    rvm_error "    Unknown mode '$rvm_autolibs_flag' for autolibs, please read 'rvm autolibs'."
    return 1
  fi

  if [[ -x "${rvm_bin_path}/brew" && -L "${rvm_bin_path}/brew" ]]
  then \command \rm -rf "${rvm_bin_path}/brew"
  fi
)

update_yaml_if_needed()
{
  \typeset yaml_version
  __rvm_db "yaml_version" "yaml_version"
  if
    libyaml_installed &&
    ! __rvm_grep -r "${yaml_version//\./\\.}" "${rvm_usr_path:=$rvm_path/usr}" >/dev/null 2>&1
  then
    __rvm_log_command "update_yaml" \
      "    Updating libyaml in $rvm_usr_path to version $yaml_version, see https://github.com/rvm/rvm/issues/2594 " \
      install_libyaml
  fi
}

record_installation_time()
{
  __rvm_date +%s > $rvm_path/installed.at
  [[ -s "$rvm_path/RELEASE" ]] || echo "manual" > "$rvm_path/RELEASE"
  touch "$rvm_path/config/displayed-notes.txt"
  return 0
}

cleanup_tmp_files()
{
  files=($(
    __rvm_find "$rvm_path/" -mindepth 1 -maxdepth 2 "${name_opt}" '*.swp' -type f
  ))
  if
    (( ${#files[@]} > 0 ))
  then
    rvm_out "    Cleanup any .swp files."
    \command \rm -f  "${files[@]}"
  fi
}

setup_rvm_path_permissions_root()
{
  # ignore if not root
  (( UID == 0 )) || return 0
  chown -R root:"$rvm_group_name" "$rvm_path"

  chmod -R u+rwX,g+rwX,o+rX "$rvm_path"

  if [[ -d "$rvm_path" ]]
  then __rvm_find "$rvm_path" -type d -print0 | __rvm_xargs -n1 -0 chmod g+s
  fi

  chmod -R g-ws "$rvm_path/scripts/zsh" "$rvm_path/scripts/extras/completion.zsh"
}

setup_rvm_path_permissions_check_single()
{
  \typeset __ignore __message __file
  __ignore="$1"
  __message="$2"
  shift 2
  \typeset -a __found
  __rvm_read_lines __found <( "$@" )
  if
    (( ${#__found[@]} > __ignore ))
  then
    permissions_warning "Found ${#__found[@]} ${__message},
use \`--debug\` to see the list, run \`rvmsudo rvm get stable\` to fix it."
    if
      (( ${rvm_debug_flag:-0} ))
    then
      for __file in "${__found[@]}"
      do printf "%b" "        ${__file}\n"
      done
    fi
  fi
}

setup_rvm_path_permissions_check_group()
{
  setup_rvm_path_permissions_check_single 0 "files not belonging to '$rvm_group_name'" \
    __rvm_find "$rvm_path" \! -group "$rvm_group_name"
}

setup_rvm_path_permissions_check_dirs()
{
  setup_rvm_path_permissions_check_single 3 "directories with mode different than '775'" \
    __rvm_find "$rvm_path" -type d \! -perm -2775
}

setup_rvm_path_permissions_check_files()
{
  setup_rvm_path_permissions_check_single 2 "files with mode different than '664' or '775'" \
    __rvm_find "$rvm_path" \! -type d \! -type l \! -perm -775 \! -perm -664
}

print_install_footer()
{
  true ${upgrade_flag:=0}
  \typeset itype profile_file

  if (( upgrade_flag == 0 ))
  then itype=Installation
  else itype=Upgrade
  fi

  if
    (( upgrade_flag == 0 ))
  then
    profile_file="${user_profile_file:-${etc_profile_file:-$rvm_path/scripts/rvm}}"
    rvm_log "$itype of RVM in $rvm_path/ is almost complete:"
    if
      (( ${rvm_user_install_flag:=0} == 0 )) &&
      [[ -z "${rvm_add_users_to_rvm_group:-}" ]]
    then
      rvm_out "
  * First you need to add all users that will be using rvm to '${rvm_group_name}' group,
    and logout - login again, anyone using rvm will be operating with \`umask u=rwx,g=rwx,o=rx\`."
    fi
    rvm_out "
  * To start using RVM you need to run \`source ${profile_file}\`
    in all your open shell windows, in rare cases you need to reopen all shell windows."
  else
    rvm_notify "$itype of RVM in $rvm_path/ is complete."
  fi
}

display_notes()
{
  if (( upgrade_flag == 0 ))
  then bash ./scripts/notes initial
  else bash ./scripts/notes upgrade
  fi
}
scripts/functions/checksum000077500000013014147511530560012003 0ustar00#!/usr/bin/env bash

__rvm_md5_calculate()
{
  rvm_debug "Calculate md5 checksum for $@"

  \typeset _sum
  if
    builtin command -v md5 > /dev/null 2>&1
  then
    _sum=$(md5 "$@")
    echo ${_sum##* }
    return 0
  elif
    builtin command -v md5sum > /dev/null 2>&1
  then
    _sum=$(md5sum "$@")
    echo ${_sum%% *}
    return 0
  elif
    builtin command -v gmd5sum > /dev/null 2>&1
  then
    _sum=$(gmd5sum "$@")
    echo ${_sum%% *}
    return 0
  else
    for _path in /usr/gnu/bin /opt/csw/bin /sbin /bin /usr/bin /usr/sbin
    do
      if
        [[ -x "${_path}/md5" ]]
      then
        _sum=$(${_path}/md5 "$@")
        echo ${_sum##* }
        return 0
      elif
        [[ -x "${_path}/md5sum" ]]
      then
        _sum=$(${_path}/md5sum "$@")
        echo ${_sum%% *}
        return 0
      elif
        [[ -x "${_path}/gmd5sum" ]]
      then
        _sum=$(${_path}/gmd5sum "$@")
        echo ${_sum%% *}
        return 0
      fi
    done
  fi

  rvm_error "Neither of md5sum, md5, gmd5sum found in the PATH"
  return 1
}

__rvm_sha__calculate()
{
  rvm_debug "Calculate sha512 checksum for $@"

  \typeset bits _sum
  bits=${1:-512}
  shift

  if
    builtin command -v sha${bits}sum >/dev/null
  then
    _sum=$(sha${bits}sum    "$@")
    echo ${_sum% *}
    return 0
  elif
    builtin command -v sha${bits}    >/dev/null
  then
    _sum=$(sha${bits}       "$@")
    if [[ "${_sum%% *}" == "SHA${bits}" ]]
    then echo ${_sum##* } # take last of:  SHA512 (file) = ....
    else echo ${_sum% *}  # take first of: ... file
    fi
    return 0
  elif
    builtin command -v shasum    >/dev/null
  then
    _sum=$(shasum -a${bits} "$@")
    echo ${_sum% *}
    return 0
  elif
    # Drop-in for Solaris 10
    builtin command -v /opt/csw/bin/shasum >/dev/null
  then
    _sum=$(/opt/csw/bin/shasum -a${bits} "$@")
    echo ${_sum% *}
    return 0
  fi

  rvm_error "Neither sha512sum nor shasum found in the PATH"
  return 1
}

# __rvm_checksum_calculate_file {file}
# ENV out: _checksum_md5 _checksum_sha512
__rvm_checksum_calculate_file()
{
  rvm_debug "Calculate checksums for file ${1}"

  _checksum_md5="$(    __rvm_md5_calculate      "${1:-}" )"
  _checksum_sha512="$( __rvm_sha__calculate 512 "${1:-}" )"
}

__rvm_checksum_none()
{
  [[ -z "${_checksum_md5:-}" && -z "${_checksum_sha512:-}" ]]
}

__rvm_checksum_any()
{
  [[ -n "${_checksum_md5:-}" || -n "${_checksum_sha512:-}" ]]
}

__rvm_checksum_all()
{
  [[ -n "${_checksum_md5:-}" && -n "${_checksum_sha512:-}" ]]
}

# __rvm_checksum_validate_file {file}
# ENV in: _checksum_md5 _checksum_sha512
__rvm_checksum_validate_file()
{
  rvm_debug "Validating checksums for file ${1}"

  if
    __rvm_checksum_any
  then
    rvm_debug "    ...checksums found in db"
  else
    rvm_debug "    ...checksums not found in db"
    return 1
  fi

  # Validate md5 checksum
  if
    [[ -n "${_checksum_md5:-}" ]]
  then
    rvm_debug "Validating md5 checksum"
    if
      [[ "$(__rvm_md5_calculate "${1:-}")" == "${_checksum_md5:-}" ]]
    then
      rvm_debug "    ...md5 checksum is valid!"
    else
      rvm_debug "    ...md5 checksum is not valid!!!"
      return 2
    fi
  fi

  # Validate sha512 checksum
  if
    [[ -n "${_checksum_sha512:-}" ]]
  then
    rvm_debug "Validating sha15 checksum"

    if
      [[ "$(__rvm_sha__calculate 512 "${1:-}")" == "${_checksum_sha512:-}" ]]
    then
      rvm_debug "    ...sha512 checksum is valid!"
    else
      rvm_debug "    ...sha512 checksum is not valid!!!"
      return 3
    fi
  fi

  return 0
}

# __rvm_checksum_read {name...}
# name - list of names to check, like:
#
#     __rvm_checksum_read https://rvm.io/binaries/.../ruby-1.9.3-p194.tar.bz2 bin-ruby-1.9.3-p194.tar.bz2
#
# ENV in/out: _checksum_md5 _checksum_sha512
__rvm_checksum_read()
{
  rvm_debug "Load checksums for $1"

  __rvm_checksum_any && return 0
  \typeset _type _value _name
  \typeset -a _list
  list=()

  for _name in "$@"
  do
    if
      [[ "$_name" == *"?"* ]] # try url without ?... like ?rvm={version}
    then
      list+=( "${_name%\?*}" )
    else
      list+=( "$_name" )
    fi
  done

  for _name in "${list[@]}"
  do
    rvm_debug "Searching checksum config files for $_name"

    # md5
    _checksum_md5="$(      __rvm_db_ "$rvm_path/config/md5"    "$_name" | \command \head -n 1 )"

    [[ -n "${_checksum_md5:-}" ]] ||
      _checksum_md5="$(    __rvm_db_ "$rvm_user_path/md5"      "$_name" | \command \head -n 1 )"

    # sha512
    _checksum_sha512="$(   __rvm_db_ "$rvm_path/config/sha512" "$_name" | \command \head -n 1 )"

    [[ -n "${_checksum_sha512:-}" ]] ||
      _checksum_sha512="$( __rvm_db_ "$rvm_user_path/sha512"   "$_name" | \command \head -n 1 )"

    __rvm_checksum_any && return 0
  done

  # Try to get the Rubinius checksum from the network
  for _name in "${list[@]}"
  do
    if [[ $_name == http*rubinius* ]]; then
      if [[ -z "${_checksum_md5:-}" ]]; then
        _checksum_md5="$(__rvm_curl -s -L $_name.md5)"
      fi

      if [[ -z "${_checksum_sha512:-}" ]]; then
        _checksum_sha512="$(__rvm_curl -s -L $_name.sha512)"
      fi
    fi

    __rvm_checksum_any && return 0
  done

  rvm_debug "    ...checksums not found"
  return 1 # not found
}

# Record checksums in user settings
# Usage: __rvm_checksum_write {name}
# ENV in/out: _checksum_md5 _checksum_sha512
__rvm_checksum_write()
{
  [[ -n "${1:-}" ]]  || return 1
  __rvm_checksum_any || return 1

  [[ -z "${_checksum_md5:-}"    ]] || __rvm_db_ "$rvm_user_path/md5"    "${1:-}" "${_checksum_md5:-}"
  [[ -z "${_checksum_sha512:-}" ]] || __rvm_db_ "$rvm_user_path/sha512" "${1:-}" "${_checksum_sha512:-}"

  return 0
}
scripts/functions/irbrc000066400000000370147511530560011300 0ustar00#!/usr/bin/env bash

# Create the irbrc for the currently selected ruby installation.
__rvm_irbrc()
{
  if
    [[ -d "$rvm_ruby_home" && ! -s "$rvm_ruby_irbrc" ]]
  then
    __rvm_cp "$rvm_scripts_path/irbrc" "$rvm_ruby_irbrc" || return $?
  fi
}

scripts/functions/install000066400000002565147511530560011655 0ustar00#!/usr/bin/env bash

__rvm_record_install()
{
  [[ -n "$1" ]] || return

  \typeset recorded_ruby_name rvm_install_record_file
  recorded_ruby_name="$( "$rvm_scripts_path/tools" strings "$1" )"
  rvm_install_record_file="$rvm_user_path/installs"

  [[ -f "$rvm_install_record_file" ]] || \command \touch "$rvm_install_record_file"
  __rvm_sed_i "$rvm_install_record_file" -e "/^$recorded_ruby_name/d"

  #TODO: use `for` so  rvm_configure_flags are quoted properly
  printf "%b" "$recorded_ruby_name -- ${rvm_configure_flags[*]}\n" >> "$rvm_install_record_file"
}

__rvm_remove_install_record()
{
  \typeset recorded_ruby_name rvm_install_record_file
  recorded_ruby_name="$( "$rvm_scripts_path/tools" strings "$1" )"
  rvm_install_record_file="$rvm_user_path/installs"

  if [[ -s "$rvm_install_record_file" ]]
  then __rvm_sed_i "$rvm_install_record_file" -e "/^$recorded_ruby_name/d"
  fi
}

__rvm_recorded_install_command()
{
  \typeset recorded_ruby_name
  recorded_ruby_name="$( "$rvm_scripts_path/tools" strings "$1" )"
  recorded_ruby_name=${recorded_ruby_name%%${rvm_gemset_seperator:-"@"}*}

  [[ -n "$recorded_ruby_name" ]] || return 1

  if
    [[ -s "$rvm_user_path/installs" ]] &&
    __rvm_grep "^$recorded_ruby_name " "$rvm_user_path/installs" >/dev/null 2>&1
  then
    __rvm_grep "^$recorded_ruby_name " "$rvm_user_path/installs" | \command \head -n 1
  else
    return 1
  fi
}
scripts/functions/tools000066400000000422147511530560011335 0ustar00#!/usr/bin/env bash

tools_strings()
{
  \typeset __ruby_name
  for __ruby_name in "$@"
  do
    if
      __rvm_select "$__ruby_name" 1>&2
    then
      echo "${rvm_ruby_gem_home##*/}"
    else
      : status:$?
      echo ""
    fi
    __rvm_unset_ruby_variables
  done
}
scripts/functions/rvmrc_env000066400000006001147511530560012175 0ustar00#!/usr/bin/env bash

# Read variables from file, if there are any variables asks user to trust it,
#
# Usage:
#   __rvm_file_load_env_and_trust <file_to_load> [variables_prefix]
#
# @param file_to_load          the file to load variables from
# @param variables_prefix      optional filter for variables, ex: "#ruby-env-"
# @env   __file_env_variables  contains the variables loaded from file, empty if user does not trust the file
#
__rvm_file_load_env_and_trust()
{
  [[ -f "$1" ]] || return 0

  __rvm_file_load_env "$1" "${2:-}"
  if
    (( ${#__file_env_variables[@]} == 0 )) ||
    __rvm_check_rvmrc_trustworthiness "$1"
  then
    true
  else
    rvm_debug "Envirionment variables variables from '$1' wont be loaded because of lack of trust (status=$?)."
    __file_env_variables=()
  fi
}

# Read variables from file,
#
# Usage:
#   __rvm_file_load_env_and_trust <file_to_load> [variables_prefix]
#
# @param file_to_load          the file to load variables from
# @param variables_prefix      optional filter for variables, ex: "#ruby-env-"
# @env   __file_env_variables  contains the variables loaded from file,
#
__rvm_file_load_env()
{
  \typeset -a __sed_commands
  __sed_commands=()
  if [[ -n "${2:-}" ]]
  then __sed_commands+=( -e "/^$2/ !d" -e "s/^$2//" ) # filter other content and remove prefix
  else __sed_commands+=( -e "/^#/ d"   -e "/^$/ d"  ) # remove comments and empty lines
  fi
  __rvm_read_lines __file_env_variables <( { cat "$1"; echo ""; } | __rvm_sed "${__sed_commands[@]}" )
}

# Resets previously loaded environment,
# if any new variables are available - loads them,
#
# @env rvm_saved_env         used to restore variables, emptied out on the end
# @env __file_env_variables  used to load new variables
#
__rvm_file_set_env()
{
  __rvm_file_env_check_unload
  __rvm_set_env "rvm_saved_env" "${__file_env_variables[@]}"
}

# Resets previously loaded environment,
#
# @env rvm_saved_env  used to restore variables, emptied out on the end
#
__rvm_file_env_check_unload()
{
  if (( ${#rvm_saved_env[@]} > 0 ))
  then __rvm_set_env "" "${rvm_saved_env[@]}"
  fi
  rvm_saved_env=()
}

# Sets environment variables,
#
# Usage:
#   __rvm_set_env <save_to> [var1 [var2]...]
#
# @param save_to   store previous values of environment variables in this variable if it's provided
# @param var...    "key=value" pairs for the environment to set to
#
# @env ${save_to}  "key=value" pairs of saved environment
#
__rvm_set_env()
{
  \typeset __save_to __set __key __value
  __save_to="$1"
  shift
  for __set in "$@"
  do
    __key="${__set%%=*}"
    __value="${__set#*=}"
    case "$__value" in
      (\"*\")
        __value="${__value#\"}"
        __value="${__value%\"}"
        ;;
      (\'*\')
        __value="${__value#\'}"
        __value="${__value%\'}"
        ;;
    esac
    rvm_debug "key=$__key; value=$__value;"
    if [[ -n "${__save_to}" ]]
    then eval "${__save_to}+=( \"\${__key}=\${${__key}}\" )"
    fi
    if [[ -n "${__value}" ]]
    then eval "export \${__key}=\"\${__value}\""
    else eval "unset \${__key}"
    fi
  done
}
scripts/functions/utility_package000066400000006357147511530560013370 0ustar00#!/usr/bin/env bash

__rvm_fix_group_permissions()
{
  if
    \umask -S | __rvm_grep 'g=rw' >/dev/null
  then
    chmod -R g+rwX "$@"
  fi
}

# params: archive_file
__rvm_package_list()
{
  rvm_debug __rvm_package_list:$#: "$@"
  case "$1" in
    *.zip)
      unzip -Z -1 "$1"
      ;;
    *.tar.bz2)
      __rvm_tar tjf "$1"
      ;;
    *.tar.gz|*.tgz)
      __rvm_tar tzf "$1"
      ;;
    *)
      return 199
      ;;
  esac
}

__map_tar_excludes()
{
  \typeset __exclude_element
  for __exclude_element
  do __exclude_elements+=( --exclude "${__exclude_element}" )
  done
}

__rvm_package_extract_run()
{
  \typeset __extract_run_src __extract_run_target __exclude_elements
  __extract_run_src="$1"
  __extract_run_target="$2"
  shift 2
  __exclude_elements=()

  if
    [[ " ${rvm_tar_options:-} " != *" --no-same-owner "*  ]] &&
    __rvm_tar --help 2>&1 | __rvm_grep -- --no-same-owner >/dev/null
  then
    rvm_tar_options="${rvm_tar_options:-}${rvm_tar_options:+ }--no-same-owner"
  fi

  [[ -d "$__extract_run_target" ]] || mkdir -p "$__extract_run_target"
  case "$__extract_run_src" in
    *.zip)
      #__map_unzip_excludes
      unzip -q -o "$__extract_run_src" -d "$__extract_run_target"
      ;;
    *.tar.bz2)
      __map_tar_excludes "$@"
      if [[ -n "$ZSH_VERSION" ]]
      then __rvm_tar "${__exclude_elements[@]}" -xjf "$__extract_run_src" -C "$__extract_run_target" ${=rvm_tar_options:-}
      else __rvm_tar "${__exclude_elements[@]}" -xjf "$__extract_run_src" -C "$__extract_run_target" ${rvm_tar_options:-}
      fi
      ;;
    *.tar.gz|*.tgz)
      __map_tar_excludes "$@"
      if [[ -n "$ZSH_VERSION" ]]
      then __rvm_tar "${__exclude_elements[@]}" -xzf "$__extract_run_src" -C "$__extract_run_target" ${=rvm_tar_options:-}
      else __rvm_tar "${__exclude_elements[@]}" -xzf "$__extract_run_src" -C "$__extract_run_target" ${rvm_tar_options:-}
      fi
      ;;
    *)
      return 199
      ;;
  esac &&
  __rvm_fix_group_permissions "$__extract_run_target"/* ||
  return $?
}

# params: archive_file path [excludes...]
__rvm_package_extract()
{
  rvm_debug __rvm_package_extract:$#: "$@"
  \typeset __extract_src __extract_target __tempdir __path __file __return
  __extract_src="$1"
  __extract_target="$2"
  shift 2
  __return=0
  __tempdir="$( TMPDIR="${rvm_tmp_path}" mktemp -d -t rvm-tmp.XXXXXXXXX )"
  __rvm_package_extract_run "$__extract_src" "$__tempdir" "$@" || __return=$?
  if
    (( __return == 0 ))
  then
    for __path in "$__tempdir"/*
    do
      __file="${__path##*/}"
      if
        [[ -n "${__file}" && -e "$__extract_target/${__file}" ]]
      then
        \command \rm -rf "$__extract_target/${__file}" || __return=$?
      fi
      \command \mv -f "${__path}" "$__extract_target/" || __return=$?
    done
  fi
  if [[ -n "$__tempdir" ]]
  then \command \rm -rf "$__tempdir"
  fi
  return $__return
}

# params: archive_file [path [path2]]
__rvm_package_create()
{
  rvm_debug __rvm_package_create:$#: "$@"
  case "$1" in
    *.tar.bz2)
      if [[ -z "${3:-}" ]]
      then __rvm_tar cjf "$1" "$2"
      else __rvm_tar cjf "$1" -C "$2" "$3"
      fi
      ;;
    *.tar.gz|*.tgz)
      if [[ -z "${3:-}" ]]
      then __rvm_tar czf "$1" "$2"
      else __rvm_tar czf "$1" -C "$2" "$3"
      fi
      ;;
    *)
      return 199
      ;;
  esac
}
scripts/functions/selector_late000066400000002701147511530560013024 0ustar00#!/usr/bin/env bash

__rvm_select_late()
{
  if
    is_a_function __rvm_select_late_${rvm_ruby_interpreter}
  then
    __rvm_select_late_${rvm_ruby_interpreter}
  fi
}

__rvm_select_late_rbx_partial()
{
  \typeset __found __ext __patern
  __ext=".${rvm_archive_extension}"
  __patern="${2//\./\.}.*\.${rvm_archive_extension//\./\.}\$"
  __found="$(
    __rvm_curl -s $1/index.txt "rubinius-" |
    __rvm_awk -F"${__ext}" "/${__patern}/"'{print $1}' |
    __rvm_version_sort |
    __rvm_tail -n 1
  )"
  if
    [[ -n "${__found}" ]]
  then
    rvm_ruby_version="${__found#rubinius-}"
    rvm_ruby_string="rbx-${rvm_ruby_version}"
    rvm_ruby_package_file="${__found}"
    rvm_ruby_url="$1/${__found}.${rvm_archive_extension}"
    return 0
  else
    return 1
  fi
}

__rvm_select_late_rbx()
{
  if
    {
      [[ -n "${rvm_ruby_package_file:-}" &&
         -f "${rvm_archives_path}/${rvm_ruby_package_file}" &&
         -s "${rvm_archives_path}/${rvm_ruby_package_file}" ]]
    } ||
    {
      [[ -n "${rvm_ruby_url:-}" ]] &&
      file_exists_at_url "${rvm_ruby_url}"
    } ||
    {
      [[ -n "${rbx_url:-}" && -n "${rvm_ruby_version:-}" ]] &&
      __rvm_select_late_rbx_partial "${rbx_url}" "${rvm_ruby_version}"
    }
  then
    rvm_head_flag=0
  else
    rvm_head_flag=1
    if [[ "${rvm_ruby_version}" == 'head' ]]
    then true ${rvm_ruby_repo_branch:="master"}
    else true ${rvm_ruby_repo_branch:="master"} ${rvm_ruby_tag:="${rvm_ruby_version}"}
    fi
  fi
}
scripts/functions/alias000066400000003175147511530560011276 0ustar00#!/usr/bin/env bash

alias_show() {
  \typeset expanded_alias_name

  if
    [[ -z "${1:-$alias_name}" ]]
  then
    rvm_log "usage: 'rvm alias show [alias_name]'"
    return 1
  fi

  [[ -s "$rvm_path/config/alias" ]] || return 2

  expanded_alias_name="$( __rvm_db_ "$rvm_path/config/alias" "${1:-$alias_name}")"

  if
    [[ -z "$expanded_alias_name" ]]
  then
    rvm_error "Unknown alias name: '${1:-$alias_name}'"
    return 3
  else
    if [[ -n "$gemset_name" ]]
    then printf "%b" "${expanded_alias_name}${rvm_gemset_separator:-"@"}${gemset_name}\n"
    else printf "%b" "${expanded_alias_name}\n"
    fi
  fi
}

alias_after_delete_default()
{
  [[ "$1" == "default" ]] || return 0

  for _path in "$rvm_bin_path"/default_*
  do
    # remove default_ruby
    if [[ -f "$_path" ]]
    then \command \rm -rfv "${_path}" || return $?
    fi
    # remove ruby
    _path="${_path#default_}"
    if [[ -f "$_path" ]]
    then \command \rm -rfv "${_path}" || return $?
    fi
  done

  for _path in "$rvm_path"/wrappers/default/* gem irb erb ri rdoc testrb rake ruby bundle
  do
    _path="${_path##*\/}"
    \command \rm -fv "$rvm_bin_path/${_path}" || return $?
  done
}

alias_delete_execute()
{
  for _path in "$rvm_rubies_path" "$rvm_gems_path" "$rvm_environments_path" "$rvm_wrappers_path"
  do
    if [[ -L "$_path/$1" ]]
    then \command \rm -fv "$_path/$1" || return $?
    fi
  done

  __rvm_db_ "$rvm_path/config/alias" "$1" "delete"

  alias_after_delete_default "$1" || return $?
}

alias_delete()
{
  __rvm_log_command "alias_delete" \
    "Deleting alias: ${1:-$alias_name}" \
    alias_delete_execute "${1:-$alias_name}" ||
    return $?
}
scripts/functions/version-installed-when000066400000001767147511530560014613 0ustar00#!/usr/bin/env bash

__rvm_version_installed_when()
{
  \typeset installed_at years months days hours minutes seconds part

  installed_at="$(\command \cat ${rvm_path}/installed.at)"

  if
    [[ -n "${installed_at:-}" ]] && (( installed_at ))
  then
    seconds="$(( $(__rvm_date +%s) - installed_at ))"
    if
      (( seconds ))
    then
      minutes="$(( seconds / 60 % 60 ))"
      hours="$(( seconds / 3600 % 24 ))"
      days="$(( seconds / 86400 % 31 ))"
      months="$(( seconds / 2678400 % 12 ))"
      years="$(( seconds / 31536000 ))"
      seconds="$(( seconds % 60 ))"

      installed_at=""
      for part in year month day hour minute second
      do
        partvar="${part}s"
        (( ${!partvar} )) || continue
        installed_at="${installed_at}${!partvar} ${part}$( (( ${!partvar} == 1 )) || echo "s") "
      done
      installed_at="${installed_at}ago"
    else
      installed_at="just now"
    fi
  else
    installed_at="can not read installation time"
  fi

  echo ${installed_at}
}scripts/functions/build_config_system000066400000026616147511530560014242 0ustar00#!/usr/bin/env bash

# fail for old rubies
__rvm_setup_compile_environment_system_early_osx_old_rubies()
{
  # skip if 10.10+
  __rvm_version_compare "${_system_version}" -ge 10.10 || return 0

  case ${rvm_ruby_string:-""} in
    ruby-1.8.7*)
      true # 1.8.7 should build fine
      ;;
    ruby-1.8.*|ruby-1.9.2*)
      rvm_error "
RVM does not know how to build working ${rvm_ruby_string} on OSX ${_system_version},
if you know please let us know by opening a ticket with instructions here:

    https://github.com/rvm/rvm/issues
"
      return 1
      ;;
  esac
}

# Cleanup broken devtools setup
__rvm_setup_compile_environment_system_early_osx_fix_devtools()
{
  \typeset __xcode_dir_path
  if
    [[ -r "/usr/share/xcode-select/xcode_dir_path" ]] &&
    __xcode_dir_path="$( cat /usr/share/xcode-select/xcode_dir_path 2>/dev/null )" &&
    [[ -n "${__xcode_dir_path}" && ! -d "${__xcode_dir_path}" ]]
  then
    __rvm_try_sudo rm -f "/usr/share/xcode-select/xcode_dir_path"
  fi
}

# Install CLT on 10.9 if not yet installed
__rvm_setup_compile_environment_system_early_osx_install_clt()
{
  \typeset __developer_update
  # skip if older then 10.9
  __rvm_version_compare "${_system_version}" -ge 10.9 || return 0
  # continue if already using some xcode
  xcode-select -p >/dev/null 2>&1 && return 0 || true
  # trick the update to think user opened the dialog
  touch /tmp/.com.apple.dt.CommandLineTools.installondemand.in-progress
  # find pending update
  __developer_update="$(
    __rvm_try_sudo softwareupdate -l 2>/dev/null |
    awk -F'*' '/Command Line Developer Tools/{print last_line} {last_line=$2}'
  )"
  # remove white-space from the beginning
  __developer_update="${__developer_update# }"
  # run the update or clean the trick file
  if [[ -n "${__developer_update}" ]]
  then __rvm_try_sudo softwareupdate -i "${__developer_update}" -v || return $?
  else rm -f /tmp/.com.apple.dt.CommandLineTools.installondemand.in-progress
  fi
}

__rvm_setup_compile_environment_system_early_OSX()
{
  __rvm_setup_compile_environment_system_early_osx_old_rubies   &&
  __rvm_setup_compile_environment_system_early_osx_fix_devtools &&
  __rvm_setup_compile_environment_system_early_osx_install_clt  ||
  return $?
}

__rvm_setup_compile_environment_system_SmartOS()
{
  [[ "${_system_name}" == "SmartOS" ]] || return 0

  if __rvm_string_match "$1" "ruby-2.0.*"; then
    __rvm_update_configure_env CFLAGS="-R -fPIC"
  fi
  if __rvm_string_match "$1" "ruby-2.0.0-p0"; then
      # work around a make error.. see https://bugs.ruby-lang.org/issues/8268
      # patch included in p195.
      rvm_configure_env+=( rb_cv_have_signbit=no )
  fi
  return 0
}

__rvm_setup_compile_environment_system_SunOS()
{
  case "$1" in
    ruby-1.9*|ruby-2*)
      # Temporary solution for this bug http://bugs.ruby-lang.org/issues/5384
      rvm_configure_flags+=( ac_cv_func_dl_iterate_phdr=no )
      ;;
  esac
  # Commented for now as it breaks configure script call
  # with prepended environment variables
  # if __rvm_string_match "$1" "ruby-2.0.*"
  # then rvm_configure_env+=( bash )
  # fi
  case "${_system_version}" in
    (10)
      __rvm_update_configure_env AR="/opt/csw/bin/gar"
      __rvm_update_configure_env MAKE="/opt/csw/bin/gmake"
      __rvm_add_to_path prepend "/opt/csw/bin"
      ;;
    (11)
      __rvm_add_to_path prepend "/usr/gnu/bin"
      ;;
  esac
  return 0
}

__rvm_setup_compile_environment_system_OpenBSD()
{
  # https://github.com/rvm/rvm/issues/1581
  rvm_configure_env+=( sh )
  case "$1" in
    ruby-1.9*|ruby-2*)
      # Temporary solution for this bug http://bugs.ruby-lang.org/issues/5384
      rvm_configure_flags+=( ac_cv_func_dl_iterate_phdr=no )
      ;;
  esac
}

__rvm_setup_compile_environment_system_BSD()
{
  if
    [[  -z "${AUTOCONF_VERSION:-}" ]]
  then
    export AUTOCONF_VERSION
    AUTOCONF_VERSION="$(
      __rvm_ls -1 /usr/local/bin/autoreconf-* |
      __rvm_awk -F- '{print $NF}' |
      __rvm_version_sort |
      __rvm_tail -n 1
    )"
  fi
  if
    [[  -z "${AUTOMAKE_VERSION:-}" ]]
  then
    export AUTOMAKE_VERSION
    # FreeBSD might have automake-wrapper
    AUTOMAKE_VERSION="$(
      __rvm_ls -1 /usr/local/bin/automake-1* |
      __rvm_awk -F- '{print $NF}' |
      __rvm_version_sort |
      __rvm_tail -n 1
    )"
  fi
}

# MRI-2.0.0+ && osx-10.7+ - clang in newer Xcode/command line tools works properly
__ruby_clang_ok()
{
  case "$1" in
    (ruby-2*|ruby-head*)
      __rvm_version_compare "${_system_version}" -ge 10.7 || return 1
      ;;
    (ruby*|ree*)
      return 1
      ;;
  esac
  true
}

__rvm_setup_compile_environment_osx_compiler_selected()
{
  case "${rvm_autolibs_flag_number}" in
    (0) rvm_debug "User selected compiler: $initially_selected_compiler"
      ;;
    (1) rvm_warn  "Warning: found user selected compiler '$initially_selected_compiler', this will suppress RVM auto detection mechanisms."
      ;;
    (*) rvm_error "Warning: found user selected compiler '$initially_selected_compiler', this will suppress RVM auto detection mechanisms."
      ;;
  esac
}

__rvm_setup_compile_environment_osx_compiler_find_gcc42()
{
  if
    [[ -x /usr/local/bin/gcc-4.2 ]] # HomeBrew
  then
    export CC=/usr/local/bin/gcc-4.2
  elif
    [[ -x /opt/local/bin/gcc-apple-4.2 ]] # MacPorts
  then
    export CC=/opt/local/bin/gcc-apple-4.2
  elif
    __rvm_which gcc-apple-4.2 > /dev/null # MacPorts via PATH
  then
    export CC=gcc-apple-4.2
  elif
    __rvm_which gcc-4.2 > /dev/null # Any gcc-4.2
  then
    export CC=gcc-4.2
  elif
    [[ -x /usr/bin/gcc-4.2 ]] # OSX-GCC-Installer / Xcode - might be LLVM
  then
    export CC=/usr/bin/gcc-4.2
  else
    return 1
  fi
  true # for osx
}

__rvm_setup_compile_environment_osx_compiler_find_clang()
{
  if
    __rvm_compiler_is_llvm
  then
    if
      __rvm_which clang > /dev/null # Any clang
    then
      export CC=clang
    elif
      [[ -x /usr/bin/clang ]]
    then
      export CC=/usr/bin/clang
    else
      return 1
    fi
  fi
  true # for osx
}

__rvm_setup_compile_environment_osx_compiler_find()
{
  if
    __rvm_version_compare "${_system_version}" -ge 10.9
  then
    if
      __rvm_version_compare "${1#ruby-}" -ge 2.1.0 &&
      __rvm_which gcc >/dev/null
    then
      export CC=gcc
    else
      if
        __rvm_setup_compile_environment_osx_compiler_clang_installed &&
        __rvm_setup_compile_environment_osx_compiler_clang_latest
      then
        export CC=/usr/bin/clang
      else
        __rvm_setup_compile_environment_osx_compiler_find_clang ||
        return $?
      fi
    fi
    return 0
  fi
  case "$1" in
    (ruby-2.0*)
      if
        __rvm_setup_compile_environment_osx_compiler_clang_installed &&
        __rvm_setup_compile_environment_osx_compiler_clang_latest
      then
        export CC=/usr/bin/clang
      else
        __rvm_setup_compile_environment_osx_compiler_find_gcc42 ||
        __rvm_setup_compile_environment_osx_compiler_find_clang ||
        return $?
      fi
      ;;
    (ruby-2*|ruby-head*)
      if
        __rvm_setup_compile_environment_osx_compiler_clang_installed &&
        __rvm_setup_compile_environment_osx_compiler_clang_latest
      then
        export CC=/usr/bin/clang
      else
        __rvm_setup_compile_environment_osx_compiler_find_clang ||
        return $?
      fi
      ;;
    (ruby*|ree*)
      __rvm_setup_compile_environment_osx_compiler_find_gcc42 ||
      __rvm_setup_compile_environment_osx_compiler_find_clang ||
      return $?
      ;;
  esac
  true # for osx
}

__rvm_setup_compile_environment_osx_compiler_clang_installed() [[ -x /usr/bin/clang ]]

__rvm_setup_compile_environment_osx_compiler_clang_latest()
{
  \typeset __clang_version
  __clang_version="$( /usr/bin/clang --version | __rvm_grep -oE "clang-[0-9]+\.[0-9]+\.[0-9]+" )" || return $?
  [[ -n "${__clang_version}" ]] || return $?
  __clang_version="${__clang_version#clang-}"
  __rvm_version_compare "${__clang_version:-0}" -ge "425.0.24" || return $?
  true # for osx
}

__rvm_setup_compile_environment_osx_compiler_clang()
{
  if
    __rvm_version_compare "${_system_version}" -ge 10.7
  then
    __rvm_setup_compile_environment_osx_compiler_clang_installed ||
    rvm_requiremnts_fail_or_run_action 2 \
      "Can not find 'Command Line Tools for Xcode',
You should install the latest version from: http://connect.apple.com" \
      true || return $?

    __rvm_setup_compile_environment_osx_compiler_clang_latest ||
    rvm_requiremnts_fail_or_run_action 2 \
      "Found older 'Command Line Tools for Xcode',
You should install the latest version from: http://connect.apple.com" \
      true || return $?
  else
    rvm_requiremnts_fail_or_run_action 2 \
      "You are using 'clang' which is known to be buggy on older OSX (like: ${_system_version}).
Make sure 'gcc-4.2' is available and try again." \
      true || return $?
  fi
}

__rvm_setup_compile_environment_osx_compiler_missing()
{
  if
    __rvm_version_compare "${_system_version}" -ge 10.7
  then
    rvm_requiremnts_fail_always 2 \
      "Can not find 'Command Line Tools for Xcode',
You should install the latest version from: http://connect.apple.com" ||
      return $?
  else
    rvm_requiremnts_fail_always 2 \
      "Can not find 'Xcode',
You should install the latest version from: http://connect.apple.com" ||
      return $?
  fi
}

__rvm_setup_compile_environment_osx_compiler()
{
  if __rvm_array_contains "*debug*" "${rvm_patch_names[@]}"
  then rvm_force_autoconf_flag=1
  fi
  if   [[ -n "${initially_selected_compiler:-}" ]]
  then __rvm_setup_compile_environment_osx_compiler_selected "$@"
  elif [[ -n "${CC:-}" ]]
  then rvm_debug "Automatically selected compiler: $CC"
  else __rvm_setup_compile_environment_osx_compiler_find     "$@"
  fi
  if __rvm_compiler_is_clang
  then __rvm_setup_compile_environment_osx_compiler_clang    "$@"
  elif [[ "$( __rvm_found_compiler )" == "" ]]
  then __rvm_setup_compile_environment_osx_compiler_missing  "$@"
  fi
}

__rvm_setup_compile_environment_osx_107_ruby21()
{
  if
    [[ "${_system_version}" == "10.7" ]]
  then
    case "$1" in
      (ruby-2.1.3|ruby-2.1.4)
        rvm_configure_flags+=( --with-setjmp-type=setjmp )
        ;;
    esac
  fi
}

__rvm_setup_compile_environment_flags_tcltk()
{
  case "$1" in
    (ruby*|ree*)
      \typeset __ruby_version="${1#*-}"
      __ruby_version="${__ruby_version%%-*}"
      __rvm_version_compare ${__ruby_version} -ge 2.1.1 ||
      [[ " ${rvm_configure_flags[*]} " == *" --with-tcl "*    ]] ||
      [[ " ${rvm_configure_flags[*]} " == *" --with-tk "*     ]] ||
      [[ " ${rvm_configure_flags[*]} " == *" --without-tcl "* ]] ||
      [[ " ${rvm_configure_flags[*]} " == *" --without-tk "*  ]] ||
      rvm_configure_flags+=( --without-tcl --without-tk )
      ;;
  esac
  true # OSX --trace FIX
}

__rvm_setup_compile_environment_system_OSX()
{
  __rvm_setup_compile_environment_flags_tcltk  "$@" || return $?
  __rvm_setup_compile_environment_osx_compiler "$@" || return $?
  __rvm_setup_compile_environment_osx_107_ruby21 "$@" || return $?
  true # OSX --trace FIX
}

__rvm_setup_compile_environment_system_Cygwin()
{
  __rvm_setup_compile_environment_flags_tcltk  "$@" || return $?
  true # OSX --trace FIX
}

__rvm_setup_compile_environment_flags_dtrace()
{
  case "$1" in
    (ruby*)
      [[ " ${rvm_configure_flags[*]} " == *" --enable-dtrace "*  ]] ||
      [[ " ${rvm_configure_flags[*]} " == *" --disable-dtrace "* ]] ||
      rvm_configure_flags+=( --disable-dtrace )
      ;;
  esac
  true # OSX --trace FIX
}

__rvm_setup_compile_environment_system_FreeBSD()
{
  __rvm_setup_compile_environment_flags_dtrace "$@" || return $?
  true # OSX --trace FIX
}
scripts/functions/osx-ssl-certs-curl000066400000001454147511530560013674 0ustar00#!/usr/bin/env bash

__rvm_osx_ssl_certs_curl_cert_find_path()
{
  # Find correct curl CA Bundle path
  # See: https://curl.haxx.se/docs/sslcerts.html

  \typeset osx_ssl_certs_curl_ca_bundle

  osx_ssl_certs_curl_ca_bundle="$CURL_CA_BUNDLE"

  if [[ ! -f "$osx_ssl_certs_curl_ca_bundle" ]]
  then
    \typeset curl_bin
    curl_bin="$(type -p curl)"

    osx_ssl_certs_curl_ca_bundle="${curl_bin%/bin/curl}/share/curl/curl-ca-bundle.crt"
  fi

  rvm_debug "Expected cURL certificate bundle location: ${osx_ssl_certs_curl_ca_bundle}"

  if [[ -f "$osx_ssl_certs_curl_ca_bundle" ]]
  then
    rvm_debug "Found cURL certificate bundle ${osx_ssl_certs_curl_ca_bundle}"
    echo $osx_ssl_certs_curl_ca_bundle
  else
    rvm_warn "cURL certificate bundle ${osx_ssl_certs_curl_ca_bundle} not found"
    echo ""
  fi
}
scripts/functions/utility000077500000024533147511530560011714 0ustar00#!/usr/bin/env bash

source "${rvm_scripts_path}/functions/utility_logging"
source "${rvm_scripts_path}/functions/utility_package"
source "${rvm_scripts_path}/functions/utility_rubygems"
source "${rvm_scripts_path}/functions/utility_system"

__rvm_strings()
{
  \typeset strings ruby_strings

  ruby_strings=($(echo ${rvm_ruby_args:-$rvm_ruby_string}))

  for rvm_ruby_string in "${ruby_strings[@]}" ; do
    strings="$strings $(__rvm_select ; echo $rvm_ruby_string)"
  done

  echo $strings

  return 0
}

# Return a list of directories under a given base path.
# Derived from rvm_ruby_string.
__rvm_ruby_string_paths_under()
{
  \typeset __search_path part parts IFS
  IFS=" "

  __search_path="${1%/}" # Strip off any trailing slash

  if [[ -n "${ZSH_VERSION:-}" ]]
  then parts=(${=rvm_ruby_string//-/ })
  else parts=(${rvm_ruby_string//-/ }) # Strip white space.
  fi

  echo "$__search_path"
  for part in "${parts[@]}"
  do
    __search_path="$__search_path/$part"
    echo "$__search_path"
  done
}

# Strip whitespace and normalize it all.
__rvm_strip()
{
  __rvm_sed -e 's/^[[:space:]]*//' -e 's/[[:space:]]*$//' -e 's/[[:space:]]\{1,\}/ /g'
  return $?
}

# remove all entries from $PATH starting with $1
__rvm_remove_from_path()
{
  export PATH
  \typeset _value
  _value="${1//+(\/)//}"

  # Guard to prevent removal of the entire path
  # https://github.com/rvm/rvm/issues/4759
  if
    [[ $_value == "/*" ]]
  then
    return
  fi

  # remove multiple slashes https://github.com/rvm/rvm/issues/1364
  while [[ "$PATH" == *"//"* ]] ; do PATH="${PATH/\/\///}" ; done
  while [[ "$PATH" == *"/:"* ]] ; do PATH="${PATH/\/:/:}" ; done

  if
    __rvm_string_match ":$PATH:" "*:${_value}:*"
  then
      \typeset -a _path
      _path=()
      __rvm_custom_separated_array _path : "${PATH}"
      __rvm_remove_from_array _path "${_value}" "${_path[@]}"
      __rvm_join_array PATH : _path
  fi
}

__rvm_add_to_path()
{
  export PATH

  if (( $# != 2 )) || [[ -z "$2" ]]
  then
    rvm_error "__rvm_add_to_path requires two parameters"
    return 1
  fi

  __rvm_remove_from_path "$2"
  case "$1" in
    prepend) PATH="$2:$PATH" ;;
    append)  PATH="$PATH:$2" ;;
    #*) anything else will just remove it from PATH - not adding back
  esac

  if
    [[ -n "${rvm_user_path_prefix:-}" ]]
  then
    __rvm_remove_from_path "${rvm_user_path_prefix}"
    PATH="${rvm_user_path_prefix}:$PATH"
  fi
  builtin hash -r
}

rvm_is_a_shell_function()
{
  \typeset _message
  if
    (( ${rvm_is_not_a_shell_function:-0} )) &&
    [[ "${1:-}" != "no_warning" ]]
  then
    if rvm_pretty_print stderr
    then rvm_log "" # newline when error is shown to user
    fi
    if rvm_pretty_print stderr
    then rvm_error "${rvm_notify_clr:-}RVM is not a function, selecting rubies with '${rvm_error_clr:-}rvm use ...${rvm_notify_clr:-}' will not work."
    else rvm_error "RVM is not a function, selecting rubies with 'rvm use ...' will not work."
    fi
    if
      [[ -n "${SUDO_USER:-}" ]]
    then
      rvm_warn '
Please avoid using "sudo" in front of "rvm".
RVM knows when to use "sudo" and will use it only when it is necessary.
'
    else
      rvm_warn '
You need to change your terminal emulator preferences to allow login shell.
Sometimes it is required to use `/bin/bash --login` as the command.
Please visit https://rvm.io/integration/gnome-terminal/ for an example.
'
    fi
  fi
  return ${rvm_is_not_a_shell_function:-0}
}

__rvm_version_sort()
{
  \command \awk -F'[.-]' -v OFS=. '{                   # split on "." and "-", merge back with "."
    original=$0                                        # save original to preserve it before the line is changed
    for (n=1; n<10; n++) {                             # iterate through max 9 components of version
      $n=tolower($n)                                   # ignore case for sorting
      if ($n == "")                 $n="0"             # treat non existing parts as 0
      if ($n ~ /^p[0-9]/)           $n=substr($n, 2)   # old ruby -p notation
      if ($n ~ /^[0-9](rc|b)/)      $n=substr($n, 1, 1)". "substr($n, 2)   # old jruby 0RC1 notation
      if (n == 1 && $n ~ /^[0-9]/)  $n="zzz."$n        # first group must be a string
      if (n > 1 && $n ~ /^[a-z]/)   $n=" "$n           # names go before numbers thanks to space
    }
    print $0"\t"original                               # print the transformed version and original separated by \t
                                                       # so we can extract original after sorting
  }'  \
  | LC_ALL=C \sort -t. -k 1,1d -k 2,2n -k 3,3n -k 4,4n -k 5,5n -k 6,6n -k 7,7n -k 8,8n -k 9,9n \
  | \awk -F'\t' '{print $2}'
}

__rvm_version_compare()
{
  \typeset first

  # first is the lower version number
  first="$( \command \printf "%b" "$1\n$3\n" | __rvm_version_sort | \command \head -n1 )"

  case "$2" in
    (-eq|==|=)
      [[ "$1" == "$3" ]] || return $?
      ;;
    (-ne|!=)
      [[ "$1" != "$3" ]] || return $?
      ;;
    (-gt|\>)
      if [[ "$first" == "head" ]]
      then [[ "$first" == "$1" && "$1" != "$3" ]] || return $?
      else [[ "$first" == "$3" && "$1" != "$3" ]] || return $?
      fi
      ;;
    (-ge|\>=)
      if [[ "$first" == "head" ]]
      then [[ "$first" == "$1" || "$1" == "$3" ]] || return $?
      else [[ "$first" == "$3" || "$1" == "$3" ]] || return $?
      fi
      ;;
    (-lt|\<)
      if [[ "$first" == "head" ]]
      then [[ "$first" == "$3" && "$1" != "$3" ]] || return $?
      else [[ "$first" == "$1" && "$1" != "$3" ]] || return $?
      fi
      ;;
    (-le|\<=)
      if [[ "$first" == "head" ]]
      then [[ "$first" == "$3" || "$1" == "$3" ]] || return $?
      else [[ "$first" == "$1" || "$1" == "$3" ]] || return $?
      fi
      ;;
    (*)
      rvm_error "Unsupported operator '$2'."
      return 1
      ;;
  esac
  return 0
}

# parse comma separated string into an array
# Ex. __rvm_custom_separated_array strings - ruby_string
# adds all elements from `ruby_string` to `strings` array
__rvm_custom_separated_array()
{
  \typeset IFS
  IFS=$2
  if [[ -n "${ZSH_VERSION:-}" ]]
  then eval "$1+=( \${=3} )"
  else eval "$1+=( \$3 )"
  fi
}

__rvm_remove_from_array()
{
  \typeset _array_name _iterator _search
  \typeset -a _temp_array
  _array_name="$1"
  _search="$2"
  shift 2
  _temp_array=()
  for _iterator
  do
    __rvm_string_match "$_iterator" "$_search" || _temp_array+=( "$_iterator" )
  done
  eval "$_array_name=( \"\${_temp_array[@]}\" )"
}

__rvm_join_array()
{
  \typeset IFS
  IFS="$2"
  eval "$1=\"\${$3[*]}\""
}

# take a variable and cut it only to contain only count fields from separator
# Usage: __rvm_take_n variable count separator
__rvm_take_n()
{
  \typeset IFS __temp_counter
  \typeset -a __temp_arr1 __temp_arr2
  IFS=$3
  if [[ -n "${ZSH_VERSION:-}" ]]
  then eval "__temp_arr1=( \${=$1} )"
  else eval "__temp_arr1=( \$$1 )"
  fi
  __temp_counter=0
  __temp_arr2=()
  while (( __temp_counter < $2 ))
  do __temp_arr2+=( "${__temp_arr1[__array_start+__temp_counter++]}" )
  done
  eval "$1=\"\${__temp_arr2[*]}\""
}

__rvm_add_once()
{
  \typeset IFS
  IFS="|"
  eval "[[ \"${IFS}\${${1}[*]}${IFS}\" == \*\"${IFS}\${2}${IFS}\"\* ]] || ${1}+=( \"\${2}\" )"
}

__rvm_find_first_file()
{
  \typeset _first_file _variable_first_file __file_enum
  _first_file=""
  _variable_first_file="$1"
  shift

  for __file_enum in "$@"
  do
    if
      [[ -f "$__file_enum" ]]
    then
      eval "$_variable_first_file=\"\$__file_enum\""
      return 0
    fi
  done
  eval "$_variable_first_file=\"\""
  return 1
}

file_exists_at_url_command()
{
  __rvm_curl --silent --insecure --location --list-only \
    --max-time ${rvm_max_time_flag:-5} --head "$@" 2>&1 |
    __rvm_grep -E 'HTTP/[0-9\.]+ 200' >/dev/null 2>&1 ||
    {
      \typeset __ret=$?
      case ${__ret} in
        (28)
          rvm_warn "RVM was not able to check existence of remote files with timeout of ${rvm_max_time_flag:-3} seconds
you can increase the timeout by setting it in ~/.rvmrc => rvm_max_time_flag=10"
          ;;
      esac
      return ${__ret}
    }
}

file_exists_at_url()
(
  if
    [[ -n "${1:-}" ]]
  then
    unset curl
    file_exists_at_url_command "$1" --insecure ||
    {
      \typeset __ret=$?
      case ${__ret} in
        (60)
          # detect double --insecure and avoid duplication, see:
          # https://github.com/rvm/rvm/issues/2640#issuecomment-35669722
          file_exists_at_url_command "$1" || return $?
          return 0
          ;;
        (*)
          # anything else then 60 just return it
          return ${__ret}
          ;;
      esac
    }
  else
    rvm_warn "Warning: URL was not passed to file_exists_at_url"
    return 1
  fi
)

__rvm_try_sudo()
(
  \typeset -a command_to_run
  \typeset sudo_path sbin_path missing_paths
  command_to_run=( "$@" )
  (( UID == 0 )) ||
  case "$rvm_autolibs_flag_number" in
    (0)
      rvm_debug "Running '$*' would require sudo."
      return 0
      ;;
    (1)
      rvm_warn  "Running '$*' would require sudo."
      return 0
      ;;
    (2)
      rvm_requiremnts_fail error "Running '$*' would require sudo."
      return 1
      ;;
    (*)
      if
        is_a_function __rvm_sudo
      then
        missing_paths=""
        for sbin_path in /sbin /usr/sbin /usr/local/sbin
        do
          if [[ -d "${sbin_path}" ]] && [[ ":$PATH:" != *":${sbin_path}:"* ]]
          then missing_paths+=":${sbin_path}"
          fi
        done
        if [[ -n "${missing_paths}" ]]
        then command_to_run=( /usr/bin/env PATH="${PATH}${missing_paths}" "${command_to_run[@]}" )
        fi
        command_to_run=( __rvm_sudo -p "%p password required for '$*': " "${command_to_run[@]}" )
      else
        rvm_error "Running '$*' would require sudo, but 'sudo' is not found!"
        return 1
      fi
      ;;
  esac
  "${command_to_run[@]}" || return $?
)

__rvm_run_wrapper()
( # ( = subprocess
  file="$1"
  action="${2:-}"
  shift 2
  rubies_string="${1:-}"
  args=( $@ )
  source "$rvm_scripts_path"/base
  source "$rvm_scripts_path"/$file
)

__rvm_calculate_space_free()
{
  # OpenBSD does not have 'df -m' param
  __free_space="$( \command \df -Pk "$1" | __rvm_awk 'BEGIN{x=4} /Free/{x=3} $3=="Avail"{x=3} END{print $x}' )"
  if [[ "${__free_space}" == *M ]]
  then __free_space="${__free_space%M}" # some systems ignore -k and print M
  else __free_space="$(( __free_space / 1024 ))"
  fi
}

__rvm_calculate_space_used()
{
  __used_space="$( \command \du -msc "$@" | __rvm_awk 'END {print $1}' )"
  __used_space="${__used_space%M}"
}

__rvm_require()
{
  [[ -f "$1" ]] && source "$1"
}
scripts/functions/db000077500000003575147511530560010601 0ustar00#!/usr/bin/env bash

# Query the rvm key-value database for a specific key
# allow system specific overrides + warnings / errors
__rvm_db_system()
{
  \typeset __key __message
  for __key in "${_system_name}_${_system_version}_$1" "${_system_name}_$1" "$1"
  do
    if __rvm_db "${__key}_error" __message
    then rvm_error "${__message}"
    fi
    if __rvm_db "${__key}_warn" __message
    then rvm_warn "${__message}"
    fi
    if __rvm_db "${__key}" "$2"
    then return 0
    fi
  done
  true # for OSX
}

# Query the rvm key-value database for a specific key
# Allow overrides from user specifications in $rvm_user_path/db
__rvm_db()
{
  \typeset value key variable
  key="${1:-}"
  variable="${2:-}"
  value=""

  if [[ -f "$rvm_user_path/db" ]]
  then value="$( __rvm_db_ "$rvm_user_path/db"   "$key" )"
  fi
  if [[ -z "$value" && -f "$rvm_path/config/db" ]]
  then value="$( __rvm_db_ "$rvm_path/config/db" "$key" )"
  fi
  [[ -n "$value" ]] || return 1
  if [[ -n "$variable" ]]
  then eval "$variable='$value'"
  else echo "$value"
  fi
  true # for OSX
}

__rvm_db_remove()
{
  if
    [[ -f "$1" ]]
  then
    __rvm_sed -e "\#^$2=# d"  -e '/^$/d' "$1" > "$1.new"
    \command \mv -f "$1.new" "$1"
  fi
}

__rvm_db_add()
{
  \typeset __dir="${1%/*}"
  if   [[ -f "${1}" ]]
  then __rvm_db_remove "${1}" "${2}"
  elif [[ ! -d "${__dir}" ]]
  then mkdir -p "${__dir}"
  fi
  printf "%b=%b\n" "$2" "$3" >> "$1"
}

__rvm_db_get()
{
  if [[ -f "$1" ]]
  then __rvm_sed -n -e "\#^$2=# { s#^$2=##;; p; }" -e '/^$/d' < "$1"
  else echo -n ""
  fi
}

__rvm_db_()
{
  \typeset __db __key __value
  __db="$1"
  __key="${2%%\?*}" # remove ?x=y from urls
  shift 2
  __value="$*"
  case "${__value}" in
    (unset|delete)
      __rvm_db_remove "${__db}" "${__key}"
      ;;
    ("")
      __rvm_db_get    "${__db}" "${__key}"
      ;;
    (*)
      __rvm_db_add    "${__db}" "${__key}" "${__value}"
      ;;
  esac
}
scripts/functions/hooks/maglev000077500000000705147511530560012602 0ustar00#!/usr/bin/env bash


_maglev_gemstone()
{
  case "$1" in
    start)
      export MAGLEV_HOME="$rvm_ruby_home"
      export GEMSTONE_GLOBAL_DIR=$MAGLEV_HOME
      if
        [[ -x "$MAGLEV_HOME/gemstone/bin/gslist" ]]
      then
        if
          "$MAGLEV_HOME/gemstone/bin/gslist" -clv > /dev/null 2>&1
        then
          true # it's running already
        else
          "$rvm_ruby_home/bin/maglev" start
        fi
      fi
      ;;
  esac
}
scripts/functions/hooks/binstubs000066400000000344147511530560013154 0ustar00#!/usr/bin/env bash

function remove_binstubs_from_path()
{
  if
    [[ -n "$1" ]]
  then
    export PATH
    PATH=":${PATH}:"
    PATH="${PATH//:$1:/:}"
    PATH="${PATH//::/:}"
    PATH="${PATH#:}"
    PATH="${PATH%:}"
  fi
}
scripts/functions/hooks/jruby000066400000001661147511530560012461 0ustar00#!/usr/bin/env bash

export JRUBY_OPTS

jruby_ngserver_is_running()
{
  \command \ps auxww | __rvm_grep -e '[o]rg.jruby.main.NailServerMain' -e '[c]om.martiansoftware.nailgun.NGServer' >/dev/null
}

jruby_ngserver_start()
{
  if ! jruby_ngserver_is_running
  then
    (JRUBY_OPTS='' jruby --ng-server 2>&1 1>/dev/null)&
  fi
}

jruby_options_trim()
{
  JRUBY_OPTS="${JRUBY_OPTS## }"
  JRUBY_OPTS="${JRUBY_OPTS%% }"
}

jruby_options_append()
{
  for param in "$@"
  do
    if
      [[ " ${JRUBY_OPTS} " != *" $param "* ]]
    then
      JRUBY_OPTS="${JRUBY_OPTS} $param"
    fi
  done
  jruby_options_trim
}

jruby_options_remove()
{
  JRUBY_OPTS=" ${JRUBY_OPTS} "
  for param in "$@"
  do
    if
      [[ "${JRUBY_OPTS}" == *" $param "* ]]
    then
      JRUBY_OPTS="${JRUBY_OPTS// $param / }"
    fi
  done
  jruby_options_trim
}

jruby_clean_project_options()
{
  if [[ -n "${PROJECT_JRUBY_OPTS}" ]]
  then
    unset PROJECT_JRUBY_OPTS
  fi
}
scripts/functions/hooks/rbx000066400000001075147511530560012120 0ustar00#!/usr/bin/env bash

export RBXOPT

rbx_options_trim()
{
  RBXOPT="${RBXOPT## }"
  RBXOPT="${RBXOPT%% }"
}

rbx_options_append()
{
  for param in "$@"
  do
    if [[ " ${RBXOPT} " != *" $param "* ]]
    then
      RBXOPT="${RBXOPT} $param"
    fi
  done
  rbx_options_trim
}

rbx_options_remove()
{
  RBXOPT=" ${RBXOPT} "
  for param in "$@"
  do
    if [[ "${RBXOPT}" == *" $param "* ]]
    then
      RBXOPT="${RBXOPT// $param / }"
    fi
  done
  rbx_options_trim
}

rbx_clean_project_options()
{
  if [[ -n "${PROJECT_RBXOPT}" ]]
  then
    unset PROJECT_RBXOPT
  fi
}
scripts/functions/support000066400000034064147511530560011722 0ustar00#!/usr/bin/env bash

is_a_function()
{
  \typeset -f $1 >/dev/null 2>&1 || return $?
}

# Functions RVM is built on
# __rvm_string_match <value> <string|glob>
if
  [[ -n "${ZSH_VERSION:-}" ]]
then
  __rvm_string_match()
  {
    \typeset _string _search
    _string="$1"
    shift
    while (( $# ))
    do
      _search="$1"
      _search="${_search// /[[:space:]]}"
      _search="${_search//\#/\#}"
      eval "\
      case \"\${_string}\" in\
        ($_search) return 0 ;;\
      esac\
      "
      shift
    done
    return 1
  }
else
  __rvm_string_match()
  {
    \typeset _string
    _string="$1"
    shift
    while (( $# ))
    do
      case "${_string}" in
        (${1// /[[:space:]]}) return 0 ;;
      esac
      shift
    done
    return 1
  }
fi

__rvm_array_contains()
{
  \typeset _search _iterator
  _search="$1"
  shift
  for _iterator
  do
    case "${_iterator}" in
      (${_search}) return 0 ;;
    esac
  done
  return 1
}

__rvm_array_add_or_update()
{
  \typeset _array_name _variable _separator _value _local_value
  \typeset -a _array_value_old _array_value_new

  _array_name="$1"
  _variable="$2"
  _separator="$3"
  _value="${4##${_separator}}"
  _array_value_new=()
  eval "_array_value_old=( \"\${${_array_name}[@]}\" )"

  case " ${_array_value_old[*]} " in
    (*[[:space:]]${_variable}*)
      for _local_value in "${_array_value_old[@]}"
      do
        case "${_local_value}" in
          (${_variable}*)
            _array_value_new+=( "${_local_value}${_separator}${_value}" )
            ;;
          (*)
            _array_value_new+=( "${_local_value}" )
            ;;
        esac
      done
      ;;
    (*)
      _array_value_new=( "${_array_value_old[@]}" "${_variable}${_value}" )
      ;;
  esac

  eval "${_array_name}=( \"\${_array_value_new[@]}\" )"
}

__rvm_array_prepend_or_ignore()
{
  \typeset _array_name _variable _separator _value _prefix _local_value
  \typeset -a _array_value_old _array_value_new

  _array_name="$1"
  _variable="$2"
  _separator="$3"
  _value="$4"
  _prefix="$5"
  _array_value_new=()
  eval "_array_value_old=( \"\${${_array_name}[@]}\" )"

  case " ${_array_value_old[*]} " in
    (*[[:space:]]${_variable}*)
      for _local_value in "${_array_value_old[@]}"
      do
        case "${_local_value}" in
          (${_variable}*${_prefix}*)
            rvm_debug "__rvm_array_prepend_or_ignore ${_array_name} ${_local_value}"
            _array_value_new+=( "${_local_value}" )
            ;;
          (${_variable}*)
            rvm_debug "__rvm_array_prepend_or_ignore ${_array_name} ${_variable}\"${_value}${_separator}${_local_value#${_variable}}\""
            _array_value_new+=( "${_variable}${_value}${_separator}${_local_value#${_variable}}" )
            ;;
          (*)
            _array_value_new+=( "${_local_value}" )
            ;;
        esac
      done
      eval "${_array_name}=( \"\${_array_value_new[@]}\" )"
      ;;
  esac
}

# Drop in replacement for sed -i compatible with OpenBSD
# Assumes that filename is the first argument, all others are passed onto sed
__rvm_sed_i()
{
  \typeset _filename _executable _user
  [[ -n "${1:-}" ]] || {
    rvm_debug "no file given for __rvm_sed_i"
    return 0
  }
  _filename="$1"
  shift

  if [[ -x "${_filename}" ]]
  then _executable=true
  fi
  _user="$( __rvm_statf "%u:%g" "%u:%g" "${_filename}" )"

  {
    __rvm_sed "$@" < "${_filename}" > "${_filename}.new" &&
    \command \mv -f "${_filename}.new" "${_filename}"
  } 2>&1 | rvm_debug_stream

  if [[ -n "${_executable:-}" && ! -x "${_filename}" ]]
  then chmod +x "${_filename}"
  fi
  if [[ "$_user" != "$( __rvm_statf "%u:%g" "%u:%g" "${_filename}" )" ]]
  then chown "$_user" "${_filename}"
  fi
}

# Drop in cd which _doesnt't_ respect cdpath
__rvm_cd()
{
    \typeset old_cdpath ret
    ret=0
    old_cdpath="${CDPATH}"
    CDPATH="."
    chpwd_functions="" builtin cd "$@" || ret=$?
    CDPATH="${old_cdpath}"
    return $ret
}

__rvm_setup_utils_functions()
{
  \typeset gnu_tools_path gnu_prefix gnu_util
  \typeset -a gnu_utils gnu_missing
  gnu_utils=( awk cp date find sed tail tar xargs )
  gnu_missing=()

  if is_a_function __rvm_setup_utils_functions_${_system_name}
  then __rvm_setup_utils_functions_${_system_name} "$@" || return $?
  else __rvm_setup_utils_functions_Other "$@" || return $?
  fi
}

__rvm_setup_utils_functions_Solaris()
{
  case "${_system_version}" in
    (10)
      gnu_tools_path=/opt/csw/bin
      gnu_prefix="g"
      ;;
    (11)
      gnu_tools_path=/usr/gnu/bin
      gnu_prefix=""
      ;;
  esac

  if [[ -x $gnu_tools_path/${gnu_prefix}grep ]]
  then eval "__rvm_grep() { GREP_OPTIONS=\"\" $gnu_tools_path/${gnu_prefix}grep \"\$@\" || return \$?; }"
  else gnu_missing+=( ${gnu_prefix}grep )
  fi

  if [[ "${_system_name}" == "OpenIndiana" || "${_system_version}" == "11" ]]
  then __rvm_stat() { \command \stat "$@" || return $?; }
  elif [[ -x $gnu_tools_path/${gnu_prefix}stat ]]
  then eval "__rvm_stat() { $gnu_tools_path/${gnu_prefix}stat \"\$@\" || return \$?; }"
  else gnu_missing+=( ${gnu_prefix}stat )
  fi

  if [[ "${_system_name}" == "SmartOS" ]]
  then __rvm_which() { \command \which "$@" || return $?; }
  elif [[ -x $gnu_tools_path/${gnu_prefix}which ]]
  then eval "__rvm_which() { $gnu_tools_path/${gnu_prefix}which \"\$@\" || return \$?; }"
  else gnu_missing+=( ${gnu_prefix}which )
  fi

  for gnu_util in "${gnu_utils[@]}"
  do
    if [[ -x $gnu_tools_path/$gnu_prefix$gnu_util ]]
    then eval "__rvm_$gnu_util() { $gnu_tools_path/$gnu_prefix$gnu_util \"\$@\" || return \$?; }"
    else gnu_missing+=( $gnu_prefix$gnu_util )
    fi
  done

  if
    (( ${#gnu_missing[@]} ))
  then
    rvm_error "ERROR: Missing GNU tools: ${gnu_missing[@]}. Make sure they are installed in '$gnu_tools_path/' before using RVM!"
    if [[ "${_system_name} ${_system_version}" == "Solaris 10" ]]
    then rvm_error "You might want to look at OpenCSW project to install the above mentioned tools (https://www.opencsw.org/about)"
    fi
    exit 200
  fi
}

__rvm_setup_utils_functions_OSX()
{
  if
    [[ -x /usr/bin/stat ]]
  then
    __rvm_stat() { /usr/bin/stat "$@" || return $?; }
  else
    rvm_error "ERROR: Missing (executable) /usr/bin/stat. Falling back to '\\\\command \\\\stat' which might be something else."
    __rvm_stat() { \command \stat "$@" || return $?; }
  fi
  __rvm_setup_utils_functions_common
}

__rvm_setup_utils_functions_Other()
{
  __rvm_stat() { \command \stat "$@" || return $?; }
  __rvm_setup_utils_functions_common
}

__rvm_setup_utils_functions_common()
{
  __rvm_grep() { GREP_OPTIONS="" \command \grep "$@" || return $?; }

  if \command \which --skip-alias --skip-functions which >/dev/null 2>&1
  then __rvm_which() { \command \which --skip-alias --skip-functions "$@" || return $?; }
  elif \command \which whence >/dev/null 2>&1 && \command \whence whence >/dev/null 2>&1
  then __rvm_which() { \command \whence -p "$@" || return $?; }
  elif \command \which which >/dev/null 2>&1
  then __rvm_which() { \command \which "$@" || return $?; }
  elif \which which >/dev/null 2>&1
  then __rvm_which() { \which "$@" || return $?; }
  else
    \typeset __result=$?
    rvm_error "ERROR: Missing proper 'which' command. Make sure it is installed before using RVM!"
    return ${__result}
  fi

  for gnu_util in "${gnu_utils[@]}"
  do eval "__rvm_$gnu_util() { \\$gnu_util \"\$@\" || return \$?; }"
  done
}

__rvm_setup_utils_functions || return $?

# detect system after setting up __rvm_sed and before setting up __rvm_statf
source "${rvm_scripts_path}/functions/db"
source "${rvm_scripts_path}/functions/detect/system"

__rvm_setup_statf_function()
{
  if
    [[ "${_system_type}" == Darwin || "${_system_type}" == BSD ]]
  then
    __rvm_statf()
    {
      __rvm_stat -f "$2" "$3"
    }
  else
    __rvm_statf()
    {
      __rvm_stat -c "$1" "$3"
    }
  fi
}

__rvm_setup_statf_function || return $?


__rvm_setup_sudo_function()
{
  if is_a_function __rvm_setup_sudo_function_${_system_name}
  then __rvm_setup_sudo_function_${_system_name} "$@" || return $?
  else __rvm_setup_sudo_function_Other "$@" || return $?
  fi
}

__rvm_setup_sudo_function_PCLinuxOS()
{
  __rvm_sudo()
  {
    if
      [[ "$1" == "-p" ]]
    then
      rvm_printf_to_stderr "${2//%p/[root]/}"
      shift 2
    fi
    su -c "$*"
  }
}

__rvm_setup_sudo_function_Solaris()
{
  if
    [[ -x /opt/csw/bin/sudo ]]
  then
    __rvm_sudo()
    {
      /opt/csw/bin/sudo "$@"
    }
  elif
    [[ -x /usr/bin/sudo ]]
  then
    __rvm_sudo()
    {
      /usr/bin/sudo "$@"
    }
  else
    rvm_debug "Warning: No '/opt/csw/bin/sudo' found."
  fi
}

__rvm_setup_sudo_function_Other()
{
  if
    __rvm_which sudo >/dev/null 2>&1
  then
    __rvm_sudo()
    {
      \command \sudo "$@"
    }
  else
    rvm_debug "Warning: No 'sudo' found."
  fi
}

__rvm_setup_sudo_function || return $?

# Utils that are not needed for RVM installation
# but have non-standard paths in Solaris 10
other_utils=( ant automake autoreconf libtoolize make mount patch readlink )

if
  [[ "${_system_name} ${_system_version}" == "Solaris 10" ]]
then
  __rvm_ant()        { /usr/sfw/bin/ant        "$@" || return $?; }
  __rvm_automake()   { /opt/csw/bin/automake   "$@" || return $?; }
  __rvm_autoreconf() { /opt/csw/bin/autoreconf "$@" || return $?; }
  __rvm_libtoolize() { /opt/csw/bin/libtoolize "$@" || return $?; }
  __rvm_make()       { /opt/csw/bin/gmake      "$@" || return $?; }
  __rvm_mount()      { /sbin/mount             "$@" || return $?; }
  __rvm_patch()      { /opt/csw/bin/gpatch     "$@" || return $?; }
  __rvm_readlink()   { /opt/csw/bin/greadlink  "$@" || return $?; }
else
  for other_util in "${other_utils[@]}"
  do eval "__rvm_$other_util() { \\$other_util \"\$@\" || return \$?; }"
  done
fi
unset other_util other_utils

__rvm_readlink_deep()
{
  eval "
    while [[ -n \"\${$1}\" && -L \"\${$1}\" ]]
    do $1=\"\$(__rvm_readlink \"\${$1}\")\"
    done
  "
}

## duplication marker 32fosjfjsznkjneuera48jae
__rvm_curl_output_control()
{
  if
    (( ${rvm_quiet_curl_flag:-0} == 1 ))
  then
    __flags+=( "--silent" "--show-error" )
  elif
    [[ " $*" == *" -s"* || " $*" == *" --silent"* ]]
  then
    # make sure --show-error is used with --silent
    [[ " $*" == *" -S"* || " $*" == *" -sS"* || " $*" == *" --show-error"* ]] ||
    {
      __flags+=( "--show-error" )
    }
  fi
}

## duplication marker 32fosjfjsznkjneuera48jae
# -S is automatically added to -s
__rvm_curl()
(
  \typeset curl_path
  if
    [[ "${_system_name} ${_system_version}" == "Solaris 10" ]] &&
    ! __rvm_which curl >/dev/null 2>&1
  then
    curl_path=/opt/csw/bin/
  else
    curl_path=""
  fi
  __rvm_which ${curl_path}curl >/dev/null 2>&1 ||
  {
    rvm_error "RVM requires 'curl'. Install 'curl' first and try again."
    return 200
  }

  \typeset -a __flags
  __flags=( --fail --location )

  # allow overriding default 30 minutes for download, but should be plenty of time
  if [[ -n "${rvm_curl_flags[*]}" ]]
  then __flags+=( "${rvm_curl_flags[@]}" )
  else __flags+=( --max-redirs 10 --max-time 1800 )
  fi

  [[ "$*" == *"--max-time"* ]] ||
  [[ "$*" == *"--connect-timeout"* ]] ||
  [[ "${__flags[*]}" == *"--connect-timeout"* ]] ||
    __flags+=( --connect-timeout 30 --retry-delay 2 --retry 3 )

  if [[ -n "${rvm_proxy:-}" ]]
  then __flags+=( --proxy "${rvm_proxy:-}" )
  fi

  __rvm_curl_output_control

  unset curl
  __rvm_debug_command ${curl_path}curl "${__flags[@]}" "$@" || return $?
)

is_parent_of()
{
  \typeset name pid ppid pname
  name=$1
  pid=$2
  while [[ -n "$pid" && "$pid" != "0" ]]
  do
    case "`uname`" in
      (SunOS)
        read ppid pname <<<"$(\command \ps -p $pid -o ppid= -o comm=)"
        ;;
      (*)
        read ppid pname <<<"$(\command \ps -p $pid -o ppid= -o ucomm=)"
        ;;
    esac
    if [[ -n "$ppid" && -n "$pname" ]]
    then
      if [[ "$pname" == "$name" ]]
      then
        echo $pid
        return 0
      else
        pid=$ppid
      fi
    else
      break
    fi
  done
  return 1
}

__rvm_string_includes()
{
  \typeset __search __text="$1"
  shift
  for __search in "$@"
  do
    if [[ " ${__text} " == *" ${__search} "* ]]
    then return 0
    fi
  done
  return 1
}

__function_on_stack()
{
  __rvm_string_includes "${FUNCNAME[*]}" "$@" || return $?
}

# read lines from file / stdin(-)
__rvm_read_lines()
{
  \typeset IFS
  # NEW LINE, BE CAREFUL
  IFS="
"
  if [[ "${2:--}" == "-" ]]
  then eval "$1=( \$( \command \cat - ) )"
  else eval "$1=( \$( \command \cat \"\${2:--}\" ) )"
  fi
}

__setup_lang_fallback()
{
  if
    [[ -z "${LANG:-}" ]]
  then
    LANG="$(
      {
        locale -a | __rvm_grep "^en_US.utf8" ||
        locale -a | __rvm_grep "^en_US" ||
        locale -a | __rvm_grep "^en" ||
        locale -a
      } 2>/dev/null | \command \head -n 1
    )"
    : LANG=${LANG:=en_US.utf-8}
    export LANG
    rvm_warn "\$LANG was empty, setting up LANG=$LANG, if it fails again try setting LANG to something sane and try again."
  fi
}

__rvm_ruby_config_save()
{
  \typeset ruby_path
  ruby_path="${1:-$rvm_ruby_home/bin/ruby}"
  case "$ruby_path" in
    (*/mruby*)
      __rvm_ruby_config_save_mruby "${2:-${ruby_path%%/bin/ruby}/config}"
      ;;
    (*)
      __rvm_ruby_config_save_generic "$2"
      ;;
  esac
}

__rvm_ruby_config_save_mruby()
{
  echo "target_cpu=\"$_system_arch\"" > "$1"
}

__rvm_ruby_config_save_generic()
{
  \typeset config_path default_config_path
  default_config_path="#{RbConfig::CONFIG[\"prefix\"]}/config"
  config_path="${1:-$default_config_path}"
  "$ruby_path" -rrbconfig -e '\
    File.open("'"$config_path"'","w") { |file|
      RbConfig::CONFIG.sort.each{|key,value|
        file.write("#{key.gsub(/\.|-/,"_")}=\"#{value.to_s.gsub("$","\\$")}\"\n")
      }
    }
  ' >/dev/null 2>&1
}

__rvm_record_ruby_configs()
{
  \typeset __dir
  for __dir in "$rvm_path/rubies/"*
  do
    if
      [[ ! -L "${__dir}" && ! -s "${__dir}/config" && -x "${__dir}/bin/ruby" ]]
    then
      __rvm_ruby_config_save "${__dir}/bin/ruby" "${__dir}/config" ||
      {
        \typeset string="${__dir##*/}"
        rvm_error "    Can not save config data for ruby: '${string}', most likely it is broken installation and you can:
    - try fix it: 'rvm reinstall ${string}', OR:
    - remove  it: 'rvm uninstall ${string} --gems'"
      }
    fi
  done
}

__rvm_ls() { \command \ls "$@" || return $?; }
scripts/functions/rubygems000077500000027473147511530560012054 0ustar00#!/usr/bin/env bash

rubygems_remove()
{
  \typeset rubygems_path __ruby entry

  rvm_log "Removing old Rubygems files..."

  case "$rvm_ruby_string" in
    (rbx-*)
      __ruby="['prefix']"
      ;;
    (*)
      __ruby=".values_at('sitelibdir','vendorlibdir').detect{ |path| File.directory?(File.join(path.to_s, 'rubygems')) }.to_s"
      ;;
  esac
  rubygems_path="$(${1:-ruby} -rrbconfig -e "puts ::Kernel.const_get('RbConfig')::CONFIG${ruby__}")"

  # Remove common files installed by ruby gems.
  entries=(
  "${rubygems_path}/ubygems.rb"
  "${rubygems_path}/gauntlet_rubygems.rb"
  "${rubygems_path}/rbconfig/"
  )
  for entry in "${entries[@]}" "${rubygems_path}/rubygems"*
  do
    __rvm_rm_rf "$entry"
  done
}

can_switch_rubygems()
{
  case "$rvm_ruby_string" in
    maglev*)
      return 1
      ;;
    *)
      return 0
      ;;
  esac
}

make_sure_jruby_can_work_with_rubygems()
{
  case "$rvm_ruby_string" in
    jruby-head*)
      true
      ;;
    jruby*)
      __rvm_version_compare "$rvm_ruby_version" -ge 1.7.1 || return 1
      ;;
    *)
      return 0 # do not care about other rubies
      ;;
  esac

  case "${rvm_rubygems_version}" in
    head|master)
      true
      ;;
    *)
      __rvm_version_compare "$rvm_rubygems_version" -ge 2.0.0 || return 1
      ;;
  esac
}

rubygems_fatal_error()
{
  rvm_error "$1"
  exit ${2:-1}
}

rubygems_version_list()
{
  __rvm_curl -sS https://rubygems.org/api/v1/versions/rubygems-update.json |
    __rvm_awk -v RS=',' -v FS='"' '$2=="number"{print $4}' |
    __rvm_version_sort |
    __rvm_grep '^[[:digit:]\.]*$'
}

rubygems_current_rubygems_version()
{
  "${rvm_ruby_binary}" -rrubygems -e 'puts(Gem::VERSION)' 2>/dev/null
}

rubygems_master_sha()
{
  __rvm_curl -s "https://api.github.com/repos/rubygems/rubygems/commits?page=last&per_page=1" |
    __rvm_sed -n '/^    "sha":/ {s/^.*".*": "\(.*\)".*$/\1/;p;}'
}

bundler_rubygems_master_sha()
{
  __rvm_curl -s "https://api.github.com/repos/rubygems/rubygems/contents/bundler" |
    __rvm_sed -n '/^  "sha":/ {s/^.*".*": "\(.*\)".*$/\1/;p;}'
}

rubygems_select_current()
{
  case "$version" in
    latest|current)
      version="$(__rvm_db "${rvm_ruby_string//-/_}_rubygems_version")"
      version="${version:-"$(__rvm_db "${rvm_ruby_interpreter}_${rvm_ruby_version}_rubygems_version")"}"
      if (( ${rvm_head_flag:-0} == 1 )) && [[ -z "${version:-}" ]]
      then version="$(__rvm_db "${rvm_ruby_interpreter}_head_rubygems_version")"
      fi
      version="${version:-"$(__rvm_db "${rvm_ruby_interpreter}_rubygems_version")"}"
      version="${version:-"$(__rvm_db "rubygems_version")"}"
      ;;
  esac
}

rubygems_select_latest()
{
  case "$version" in
    latest-*)
      version="${version#latest-}"
      version="$(rubygems_version_list | __rvm_grep "^${version}\." | __rvm_tail -n 1 )"
      version="${version}"
      ;;
  esac
}

rubygems_select_version_url()
{
  case "${version:-missing}" in
    ignore|none)
      rvm_rubygems_version="$version"
      ;;
    head|master)
      \typeset sha
      sha="$(rubygems_master_sha)"
      rvm_rubygems_version="$version"
      rvm_gem_package_name="rubygems-${sha}"
      rvm_gem_url="https://github.com/rubygems/rubygems/archive/${sha}.tar.gz"

      __bundler_sha="$(bundler_rubygems_master_sha)"
      __bundler_package_name="bundler-${__bundler_sha}"
      __bundler_url="https://github.com/bundler/bundler/archive/${__bundler_sha}.tar.gz"
      export rvm_verify_downloads_flag=1
      ;;
    v*)
      rvm_rubygems_version="$version"
      rvm_gem_package_name="rubygems-${version#v}"
      rvm_gem_url="https://github.com/rubygems/rubygems/archive/$version.tar.gz"
      export rvm_verify_downloads_flag=1
      ;;
    missing)
      rvm_error "There was an error while trying to resolve rubygems version for '$1'. \nHalting the installation."
      return 4
      ;;
    *)
      rvm_rubygems_version="$version"
      rvm_gem_package_name="rubygems-${rvm_rubygems_version}"
      rvm_rubygems_url=$(__rvm_db "rubygems_url")
      rvm_gem_url="${rvm_rubygems_url}/${rvm_gem_package_name}.tgz"
      ;;
  esac
}

rubygems_select_version()
{
  rubygems_select_current     "$1" &&
  rubygems_select_latest      "$1" &&
  rubygems_select_version_url "$1" ||
  return $?
}

__rvm_warn_on_rubyopt()
{
  if [[ -n "${RUBYOPT:-""}" ]]; then
    rvm_warn \
      "Please note: You have the RUBYOPT environment variable set and this \
            may interfere with normal rvm operations. We sugges unsetting it."
    return 1
  else
    return 0
  fi
}

rubygems_setup()
{
  export version="$1"
  \typeset __bundler_sha __bundler_package_name __bundler_url

  rvm_debug "rubygems_setup version:${version} rvm_ruby_string:${rvm_ruby_string} rvm_ruby_home:${rvm_ruby_home} rvm_ruby_binary:${rvm_ruby_binary}"

  case "${version:-missing}" in
    ignore|none)
      rvm_debug "Skipping installing rubygems."
      return 0
      ;;
  esac

  can_switch_rubygems ||
  rubygems_fatal_error "RVM can not install rubygems for maglev and older jruby, select other ruby and try again." $?

  __rvm_warn_on_rubyopt

  true ${rvm_ruby_selected_flag:=0}

  unset RUBYOPT

  (( rvm_ruby_selected_flag == 0 ))  || __rvm_select

  rubygems_select_version "$version" || return $?
  rvm_debug "rubygems_setup_rubygems version:${rvm_rubygems_version} rvm_gem_package_name:${rvm_gem_package_name} rvm_gem_url:${rvm_gem_url}"
  rvm_debug "rubygems_setup_bundler sha:${__bundler_sha} __bundler_package_name:${__bundler_package_name} __bundler_url:${__bundler_url}"

  if
    [[ "${rvm_force_flag:-0}" -eq 1 ]]
  then
    true # just let us continue with installation
  else
    \typeset __current_rubygems_version="$( rubygems_current_rubygems_version )"
    if
      __rvm_version_compare "${__current_rubygems_version}" -eq "$version"
    then
      rvm_log "Rubygems $version already available in installed ruby, skipping installation, use --force to reinstall."
      return 0
    elif
      __rvm_version_compare "${__current_rubygems_version}" -gt "$version"
    then
      rvm_log "Installed rubygems ${__current_rubygems_version} is newer than $version provided with installed ruby, skipping installation, use --force to force installation."
      return 0
    fi
  fi

  make_sure_jruby_can_work_with_rubygems ||
  rubygems_fatal_error "RVM can not install rubygems for older jruby, select other ruby and try again." $?

  # always cleanup!
  [[ -d "${rvm_src_path}/$rvm_gem_package_name" ]] ||
    __rvm_rm_rf "${rvm_src_path}/$rvm_gem_package_name"

  rvm_log "$rvm_ruby_string - #downloading $rvm_gem_package_name"
  "$rvm_scripts_path/fetch" "$rvm_gem_url" "${rvm_gem_package_name}.tgz" ||
  rubygems_fatal_error "There has been an error while trying to fetch rubygems. \nHalting the installation." $?

  if
    [[ -n "${__bundler_sha:-}" ]]
  then
    rvm_log "$rvm_ruby_string - #downloading $__bundler_package_name"
    "$rvm_scripts_path/fetch" "$__bundler_url" "${__bundler_package_name}.tgz" ||
    rubygems_fatal_error "There has been an error while trying to fetch bundler. \nHalting the installation." $?
  fi

  __rvm_log_command "rubygems.extract" "$rvm_ruby_string - #extracting $rvm_gem_package_name" \
  __rvm_package_extract "${rvm_archives_path}/$rvm_gem_package_name.tgz" "${rvm_src_path}" ||
  rubygems_fatal_error "There has been an error while trying to extract rubygems. \nHalting the installation." $?

  if
    [[ -n "${__bundler_sha:-}" ]]
  then
    __rvm_log_command "rubygems.bundler.extract" "$rvm_ruby_string - #extracting $__bundler_package_name" \
    __rvm_package_extract "${rvm_archives_path}/$__bundler_package_name.tgz" "${rvm_src_path}" "*/spec/*" ||
    rubygems_fatal_error "There has been an error while trying to extract bundler. \nHalting the installation." $?

    \rm -rf "${rvm_src_path}/$rvm_gem_package_name/bundler" &&
    ln -nfs "${rvm_src_path}/$__bundler_package_name/" "${rvm_src_path}/$rvm_gem_package_name/bundler" ||
    rubygems_fatal_error "There has been an error while linking bundler. \nHalting the installation." $?
  fi

  __rvm_log_command "rubygems.remove" "$rvm_ruby_string - #removing old rubygems" rubygems_remove "${rvm_ruby_binary}"

  __rvm_cd "${rvm_src_path}/$rvm_gem_package_name"

  \typeset -a __command
  __command=(
    GEM_HOME="$rvm_gems_path/${rvm_ruby_string}@global" GEM_PATH="" "${rvm_ruby_binary}" -d "${rvm_src_path}/$rvm_gem_package_name/setup.rb"
  )
  if [[ ${rvm_debug_flag:-0} == 1 || ${rvm_trace_flag:-0} == 1 ]]
  then __command+=( --verbose )
  fi
  if
    (( ${rvm_docs_flag:-0} == 0 ))
  then
    if __rvm_version_compare "$version" -ge 2.2
    then __command+=( --no-document )
    else __command+=( --no-ri --no-rdoc )
    fi
  fi
  __setup_lang_fallback
  __rvm_log_command "rubygems.install" \
    "$rvm_ruby_string - #installing $rvm_gem_package_name" \
    "${__command[@]}" ||
    return $?
  [[ -e "$rvm_ruby_home/bin/gem" ]] ||
  {
    \typeset program_suffix
    program_suffix="$( __rvm_ruby_config_get configure_args "${rvm_ruby_binary}" )"
    case "${program_suffix:-}" in
      (*--program-suffix=*)
        program_suffix="${program_suffix#*--program-suffix=}"
        program_suffix="${program_suffix%%[\' ]*}"
        __rvm_log_command "link.gem" "$rvm_ruby_string - #linking gem${program_suffix} -> gem" \
          ln -s "$rvm_ruby_home/bin/gem${program_suffix}" "$rvm_ruby_home/bin/gem"
        ;;
    esac
  }
  true # for osx
}

rubygems_validate_gemfile_extract()
(
  \command \mkdir -p "$2/gem" &&
  \command \tar -C "$2" -xf "$1" --touch &&
  \command \cd "$2" &&
  \command \gzip -d "metadata.gz" &&
  \command \tar -C gem -xzf "data.tar.gz" --touch &&
  \command \rm "data.tar.gz" ||
  {
    \typeset ret=$?
    rvm_error "Error extracting '$1' to '$2'."
    \command \rm -rf "${rvm_tmp_path}/rg$$"
    return $ret
  }
)

# Adapted from: https://gist.github.com/4678778
rubygems_validate_gemfile()
(
  gem_file="$1"
  downloaded_file="${gem_file##*/}"
  gem__url="${2:-https://d2chzxaqi4y7f8.cloudfront.net/gems/$downloaded_file}"
  dir_local_copy="${downloaded_file%.gem}--local"
  dir_remote_copy="${downloaded_file%.gem}-remote"

  mkdir -p "${rvm_tmp_path}/rg$$"
  cd "${rvm_tmp_path}/rg$$"

  __rvm_curl "$gem__url" -o "$downloaded_file" &&
  [[ -f "$downloaded_file" ]] ||
  {
    \typeset ret=$?
    rvm_error "Could not download '$gem__url'."
    \command \rm -rf "${rvm_tmp_path}/rg$$"
    return $ret
  }

  rubygems_validate_gemfile_extract "$gem_file"        "$dir_local_copy"  || return $?
  rubygems_validate_gemfile_extract "$downloaded_file" "$dir_remote_copy" || return $?

  # compare
  diff -ru "$dir_local_copy" "$dir_remote_copy"

  # cleanup
  \command \rm -rf "${rvm_tmp_path}/rg$$"
)

rubygems_validate_list_gemdirs()
{
  for gemdir in "$@"
  do
    __rvm_readlink_deep gemdir
    echo "${gemdir}"
  done | sort -u
}

# Adapted from: https://gist.github.com/4678189
rubygems_validate()
{
  __rvm_which openssl > /dev/null ||
    rubygems_fatal_error "'openssl' was not found, please install it."

  \typeset gemdir gemfile url gem loc rem log
  \typeset -a gemdirs

  rvm_log  "Validating RubyGems... This will take a while..."

  __rvm_read_lines gemdirs <(
    rubygems_validate_list_gemdirs "$@"
  )

  (( ${#gemdirs[@]} )) ||
  __rvm_read_lines gemdirs <(
    rubygems_validate_list_gemdirs "$rvm_gems_path"/*/cache
  )

  for gemdir in "${gemdirs[@]}"
  do
    for gem in "$gemdir"/*.gem
    do
      gemfile="${gem##*/}"
      url="https://d2chzxaqi4y7f8.cloudfront.net/gems/$gemfile"
      printf "%b" "${rvm_notify_clr}${gem}${rvm_reset_clr}"

      loc=$(openssl md5 $gem |cut -d" " -f2)
      rem=$(__rvm_curl -3 -s -D - -X HEAD -H 'Connection:close' "$url" | __rvm_grep 'ETag' | cut -d'"' -f2)

      [[ $loc == $rem ]] ||
      {
        printf "%b" " "
        log="${rvm_log_path}/$gemfile.diff"
        rubygems_validate_gemfile "$gem" "$url" > "$log"
        printf "%b" "${rvm_error_clr}mismatch, local: $loc, remote: $rem${rvm_reset_clr}, differences recorded in '$log'"
      }
      printf "%b" ", "
    done
  done

  rvm_log "\nDone verifying gems."
}
scripts/functions/utility_system000066400000015460147511530560013314 0ustar00#!/usr/bin/env bash

# params: [printf_if=-] [suffix]
__rvm_system_path()
{
  rvm_remote_server_path="$(__rvm_db "rvm_remote_server_path${2:-}")"
  [[ -n "${rvm_remote_server_path}" ]] ||
  rvm_remote_server_path="${_system_name_lowercase}/${_system_version}/${_system_arch}"
  if [[ "${1:-}" == "-" ]]
  then printf "%b" "${rvm_remote_server_path}\n"
  fi
}

__rvm_remote_extension()
{
  case "$1" in
    *.tar.*)
      rvm_remote_extension="tar${1##*tar}"
      ;;
    jruby-*)
      rvm_remote_extension="tar.gz"
      ;;
    *)
      rvm_remote_extension="tar.bz2"
      ;;
  esac
  [[ "$2" != "-" ]] || printf "%b" "${rvm_remote_extension}"
}

# params: ruby-string-to-transform
__rvm_ruby_package_file()
{
  case "$1" in
    *.tar.*)
      rvm_ruby_package_file="/$1"
      ;;
    rbx*|rubinius*)
      rvm_ruby_package_file="/${1//rbx/rubinius}.$(__rvm_remote_extension "$1" -)"
      ;;
    jruby-head)
      rvm_ruby_package_file="/jruby-head.$(__rvm_remote_extension "$1" -)"
      ;;
    jruby*)
      \typeset __version
      __version="$(
        rvm_ruby_string="$1"
        rvm_remote_flag=0 __rvm_ruby_string
        echo "$rvm_ruby_version"
      )"
      rvm_ruby_package_file="/${__version}/jruby-dist-${__version}-bin.$(__rvm_remote_extension "$1" -)"
      ;;
    "")
      rvm_ruby_package_file=""
      ;;
    ruby*|mruby*)
      rvm_ruby_package_file="/$1.$(__rvm_remote_extension "$1" -)"
      ;;
    *)
      rvm_ruby_package_file="/ruby-$1.$(__rvm_remote_extension "$1" -)"
      ;;
  esac
}

__rvm_include_travis_binaries()
{
  if [[ $rvm_remote_server_url == *"travis"* && $TRAVIS != true && $_system_name_lowercase == "osx" ]]
  then
      rvm_debug "Travis binaries for OSX are not movable and can't be used outside of Travis environment. \
Skip that source."
      return 1
  fi

  return 0
}

__rvm_calculate_remote_file()
{
  rvm_remote_server_url="$( __rvm_db "rvm_remote_server_url${3:-}" )"

  [[ -n "$rvm_remote_server_url" ]] || {
    rvm_debug "rvm_remote_server_url${3:-} not found"
    return $1
  }

  __rvm_include_travis_binaries || return $1

  __rvm_system_path "" "${3:-}"
  __rvm_ruby_package_file "${4:-}"
  __remote_file="${rvm_remote_server_url}/${rvm_remote_server_path}${rvm_ruby_package_file}"
}

# params: return_on_end return_on_failed_link [suffix] [file]
__rvm_remote_server_path_single()
{
  \typeset __remote_file
  __rvm_calculate_remote_file "$@" || return $?
  if
    [[ -z "${__remote_file:-}" ]]
  then
    rvm_debug "No remote file name found"
    return $1
  elif
    file_exists_at_url "${__remote_file}"
  then
    rvm_debug "Remote file exists ${__remote_file}"
    printf "%b" "$( __rvm_db "rvm_remote_server_verify_downloads${3:-}" ):${__remote_file}"
  elif
    [[ -f "${rvm_archives_path}/${rvm_ruby_package_file##*/}" && "${rvm_ruby_package_file##*/}" == *bin-* ]]
  then
    rvm_debug "Cached file exists ${__remote_file}"
    printf "%b" "$( __rvm_db "rvm_remote_server_verify_downloads${3:-}" ):${rvm_archives_path}/${rvm_ruby_package_file##*/}"
  else
    rvm_debug "Remote file does not exist ${__remote_file}"
    return $2
  fi
}

# params: [file_name]
__rvm_remote_server_path()
{
  \typeset _iterator
  _iterator=""
  while ! __rvm_remote_server_path_single 0 1 "${_iterator}" "${1:-}"
  do : $(( _iterator+=1 ))
  done
}

__list_remote_all()
{
  \typeset _iterator rvm_remote_server_url rvm_remote_server_path
  _iterator=""

  while
    __rvm_db "rvm_remote_server_url${_iterator:-}" rvm_remote_server_url
  do
    if
      __rvm_include_travis_binaries
    then
      __rvm_system_path "" "${_iterator}"
      rvm_debug "__list_remote_all${_iterator:-} $rvm_remote_server_url $rvm_remote_server_path"

      __list_remote_for "${rvm_remote_server_url}" "$rvm_remote_server_path"
    fi
    : $(( _iterator+=1 ))
  done | \command \sort -u | __rvm_version_sort
}

__list_remote_for()
{
  __list_remote_for_local "$@" ||
  __list_remote_for_index "$@" ||
  __list_remote_for_s3    "$@" ||
  return $?
}

__list_remote_for_local()
{
  \typeset __status1 __status2
  __status1=0
  __status2=0
  if [[ -f $rvm_user_path/remote ]]
  then __rvm_grep "${1}/${2}" < $rvm_user_path/remote || __status1=$?
  fi
  __rvm_grep "${1}/${2}" < $rvm_path/config/remote || __status2=$?
  if (( __status1 || __status2 ))
  then return 1
  else rvm_debug "__list_remote_for_local found"
  fi
  true # for OSX
}

__list_remote_for_index()
{
  if
    file_exists_at_url "${1}/index.txt"
  then
    rvm_debug "__list_remote_for_index ${1}/index.txt"
    __rvm_curl -s "${1}/index.txt" | GREP_OPTIONS="" \command \grep -E "${1}/${2}/.*\.tar\.(gz|bz2)$"
  elif
    file_exists_at_url "${1}/${2}/index.txt"
  then
    rvm_debug "__list_remote_for_index ${1}/${2}/index.txt"
    __rvm_curl -s "${1}/${2}/index.txt" | GREP_OPTIONS="" \command \grep -E "${1}/${2}/.*\.tar\.(gz|bz2)$"
  else
    return 1
  fi
  true # for OSX
}

__list_remote_for_s3()
{
  curl -ILfs "${1}" | __rvm_grep "Server: AmazonS3" >/dev/null || return $?
  \typeset __tmp_name __iterator __next __local_url
  __iterator=0
  __next=""
  __tmp_name="$(
    : ${TMPDIR:=${rvm_tmp_path:-/tmp}}
    mktemp "${TMPDIR}/tmp.XXXXXXXXXXXXXXXXXX"
  )"
  while
    [[ __iterator -eq 0 || -n "${__next}" ]]
  do
    __local_url="${1}?prefix=${2}/${__next:+&marker=${__next}}"
    rvm_debug "__list_remote_for_s3-${__iterator} ${__local_url}"
    __rvm_curl -s "${__local_url}" > "${__tmp_name}${__iterator}"

    GREP_OPTIONS="" \command \grep -oE "<Key>[^<]*</Key>" < "${__tmp_name}${__iterator}" |
    __rvm_awk -F"[<>]" '{print $3}' > "${__tmp_name}"

    if __rvm_grep "<IsTruncated>true</IsTruncated>" < "${__tmp_name}${__iterator}"
    then __next="$(__rvm_tail -n 1 "${__tmp_name}")"
    else __next=""
    fi

    rm "${__tmp_name}${__iterator}"
    : $(( __iterator+=1 ))
  done
  GREP_OPTIONS="" \command \grep -E "${2}/.*\.tar\.(gz|bz2)$" < "${__tmp_name}" |
  GREP_OPTIONS="" \command \grep -v -- "-src-" |
  __rvm_awk "{ print "'"'$1/'"'"\$1 }"
  rm "${__tmp_name}"*
}

__rvm_get_user_shell()
{
  case "${_system_type}:${_system_name}" in
    (Linux:*|SunOS:*|BSD:*|Windows:Cygwin)
      __shell="$( getent passwd $USER )" ||
      {
        rvm_error "Error checking user shell via getent ... something went wrong, report a bug."
        return 2
      }
      echo "${__shell##*:}"
      ;;

    (Windows:Mingw)
      __shell="$( echo $SHELL )" ||
      {
        rvm_error "Error checking user shell from echo $SHELL ... something went wrong, report a bug."
        return 2
      }
      echo "${__shell##*:}"
      ;;

    (Darwin:*)
      \typeset __version

      __version="$(dscl localhost -read "/Search/Users/$USER" UserShell)" ||
      {
        rvm_error "Error checking user shell via dscl ... something went wrong, report a bug."
        return 3
      }
      echo ${__version#*: }
      ;;

    (*)
      rvm_error "Do not know how to check user shell on '$(command uname)'."
      return 1
      ;;
  esac
}
scripts/functions/build_requirements_helpers000066400000014241147511530560015625 0ustar00#!/usr/bin/env bash

requirements_check()
{
  \typeset _package_name _list
  if
    is_a_function "requirements_${__lib_type}_lib_installed_all_missing"
  then
    __rvm_filter_installed_package_from_missing "requirements_${__lib_type}_lib_installed_all_missing" "$@"
  elif
    is_a_function "requirements_${__lib_type}_lib_installed"
  then
    for _package_name in "$@"
    do __rvm_filter_installed_package_check "requirements_${__lib_type}_lib_installed" "${_package_name}"
    done
  else
    return 1
  fi
  true # for OSX (and SuSE 11.3)
}

requirements_print_list()
{
  for output_package in "$@"
  do
    rvm_out "${output_package}"
  done
}

requirements_check_custom()
{
  \typeset __package __binary
  for __package
  do
    __binary="${__package%%=*}"
    __package="${__package#*=}"
    __rvm_which "${__binary}" >/dev/null || __rvm_add_once packages_custom "${__package}"
  done
}

requirements_check_custom_after()
{
  \typeset __package __binary
  for __package
  do
    __binary="${__package%%=*}"
    __package="${__package#*=}"
    __rvm_which "${__binary}" >/dev/null 2>&1 || __rvm_add_once packages_custom_after "${__package}"
  done
}

__rvm_filter_installed_package_from_missing()
{
  packages_missing=( $( "$@" ) )
  shift # remove callback function name

  \typeset __package
  for __package
  do
    [[ " ${packages_missing[*]} " == *" ${__package} "* ]] || __rvm_add_once packages_installed "${__package}"
  done
  case "$rvm_autolibs_flag_number" in
    (0|1|2) # just ignore
      true
      ;;
    (*) # 2+
      packages_to_install=( "${packages_missing[@]}" )
      packages_missing=()
      ;;
  esac
}

__rvm_filter_installed_package_check()
{
  if
    "$1" "$2"
  then
    __rvm_add_once packages_installed "$2"
  else
    case "$rvm_autolibs_flag_number" in
      (0|1|2) __rvm_add_once packages_missing    "$2" ;; # just ignore
      (*)     __rvm_add_once packages_to_install "$2" ;; # 2+
    esac
  fi
}

requirements_fallback_lib_available()
{
  for __package
  do
    if
      requirements_${__lib_type}_lib_available "${__package}"
    then
      __rvm_add_once __available_dependencies "${__package}"
    fi
  done
  __rvm_add_once __available_dependencies "$1"
}

requirements_fallback_lib_installed()
{
  for __package
  do
    if
      requirements_${__lib_type}_lib_installed "${__package}"
    then
      requirements_check "${__package}"
      return 0
    fi
  done
  return 1
}

requirements_check_fallback()
{
  \typeset -a __available_dependencies
  __available_dependencies=()
  \typeset __package
  requirements_fallback_lib_available "$@"
  requirements_fallback_lib_installed "${__available_dependencies[@]}" || requirements_check "${__available_dependencies[0]}"
}

requirements_detect_installed()
{
  \typeset -a __available_dependencies
  __available_dependencies=()
  \typeset __package
  requirements_fallback_lib_available "$@"
  requirements_fallback_lib_installed "${__available_dependencies[@]}" || return $?
}

requirements_version_minimal()
{
  if [[ " ${packages_to_install[*]} " == *" $1 "* ]]
  then return 0
  fi
  \typeset latest_version="$(
    requirements_${__lib_type}_version_list $1 |
    __rvm_version_sort |
    __rvm_tail -n 1
  )"
  if
    [[ -z "${latest_version}" ]] ||
    __rvm_version_compare ${latest_version} -lt $2
  then
    __rvm_add_once packages_to_install "$1"
  fi
}

rvm_requiremnts_fail()
{
  rvm_$1 "$2
RVM autolibs is now configured with mode '$rvm_autolibs_flag_number' =>
  '$(__rvm_autolibs_translate_description; echo $rvm_autolibs_flag_description)',
please run \`rvm autolibs enable\` to let RVM do its job or run and read \`rvm autolibs [help]\`
or visit https://rvm.io/rvm/autolibs for more information."
}

rvm_requiremnts_fail_or_run_action()
{
  case "${rvm_autolibs_flag_number}" in
    (0) rvm_debug "$2" ;;
    (1) rvm_warn  "$2" ;;
    (2) rvm_requiremnts_fail_on "$1" "$2" || return $? ;;
    (*)
      shift 2
      "$@" || return $?
      ;;
  esac
  true # for osx
}

rvm_requiremnts_fail_always()
{
  case "${rvm_autolibs_flag_number}" in
    (0) rvm_debug "$2" ;;
    (1) rvm_warn  "$2" ;;
    (*) rvm_requiremnts_fail_on "$1" "$2" $3 || return $? ;;
  esac
  true # for osx
}

rvm_requiremnts_fail_on()
{
  if
    (( $1 > $rvm_autolibs_flag_number ))
  then
    rvm_requiremnts_fail warn "$2"
  else
    rvm_requiremnts_fail error "$2"
    return ${3:-1}
  fi
}

# is_head_or_disable_binary $rvm_ruby_string
is_head_or_disable_binary()
{
  case "$1" in
    (*-head*)
      true
      ;;
    (*)
      if (( ${rvm_binary_flag:-0} == 1 || ${rvm_disable_binary_flag:-0} == 0 ))
      then return 1
      fi
      ;;
  esac
  true # for OSX
}

# Usage:
#   jruby_installation_method $rvm_ruby_string [$rvm_ruby_version]
# @stdout ant|mvn|mvnw
jruby_installation_method()
{
  \typeset __jversion
  if [[ -n "${2:-}" ]]
  then __jversion="$2"
  else
    __jversion="${1#jruby-}"
    __jversion="${__jversion%%-*}"
  fi
  case "$1" in
    (jruby-head*)
      echo "mvnw"
      ;;
    (*)
      if __rvm_version_compare "${__jversion}" -ge "1.7.25"
      then echo "mvnw"
      elif __rvm_version_compare "${__jversion}" -ge "1.7.0"
      then echo "mvn"
      else echo "ant"
      fi
      ;;
  esac
  true # for OSX
}

latest_maven_version()
{
  # contains some headers/footers and lines like this:
  # <img src="/icons/folder.gif" alt="[DIR]"> <a href="3.5.0/">3.5.0/</a> 2017-06-26 18:07 -
  curl -sSL https://archive.apache.org/dist/maven/maven-3/ |
    grep -oE '<a href="[0-9\.]+/">' |
    awk -F'["/]' '{print $2}' |
    __rvm_version_sort |
    tail -n 1
}

set_maven_variables()
{
  maven_version="$1"
  maven_file="apache-maven-${maven_version}-bin.tar.gz"
  maven_url="https://www.apache.org/dist/maven/maven-${maven_version%%.*}/${maven_version}/binaries/${maven_file}"
}

requirements_install_maven()
{
  \typeset maven_version maven_file maven_url
  set_maven_variables "$( __rvm_db "maven_version" )"

  file_exists_at_url_command "${maven_url}" ||
    set_maven_variables "$( latest_maven_version )"

  mkdir -p "${rvm_path}/java/" &&
  "${rvm_scripts_path}/fetch" "${maven_url}" &&
  __rvm_package_extract "${rvm_archives_path}/${maven_file}" "${rvm_path}/java/"
  ln -nfs "${rvm_path}/java/apache-maven-${maven_version}/bin"/mvn "${rvm_bin_path}"/mvn ||
  return $?
}
scripts/functions/osx-ssl-certs000077500000013376147511530560012742 0ustar00#!/usr/bin/env bash

requirements_osx_update_openssl_cert_is_old()
{
  [[ ! -f "$cert_file" ||
    "$cert_file" -ot /Library/Keychains/System.keychain ||
    "$cert_file" -ot /System/Library/Keychains/SystemRootCertificates.keychain
  ]] || (( ${rvm_force_flag:-0} > 0 ))
}

requirements_osx_update_openssl_cert_create_dir_sudo()
{
  rvm_warn "mkdir -p \"$ssl_dir\" failed, retrying with sudo"
  if __rvm_try_sudo mkdir -p "$ssl_dir"
  then rvm_log "and sudo mkdir worked"
  else return $?
  fi
}

requirements_osx_update_openssl_cert_create_dir()
{
  [[ -d "$ssl_dir" ]] ||
  mkdir -p "$ssl_dir" ||
  requirements_osx_update_openssl_cert_create_dir_sudo ||
  {
    \typeset __ret=$?
    rvm_error "Can not create directory '$ssl_dir' for certificates."
    return ${__ret}
  }
}

requirements_osx_update_openssl_cert_target_select()
{
  if
    [[ -f "$cert_file" && -w "$cert_file" ]] ||
    [[ ! -e "$cert_file" && -d "$ssl_dir" && -w "$ssl_dir" ]]
  then
    __target="$cert_file"
  else
    __target="$(
      TMPDIR="${rvm_tmp_path}" mktemp ${TMPDIR:-/tmp}/tmp.XXXXXXXXXXXXXXXXXX
    )"
  fi
}

requirements_osx_update_openssl_cert_create_cert()
{
  security find-certificate -a -p /Library/Keychains/System.keychain > "$__target"
  security find-certificate -a -p /System/Library/Keychains/SystemRootCertificates.keychain >> "$__target"
}

requirements_osx_update_openssl_cert_target_move()
{
  [[ "$__target" == "$cert_file" ]] ||
  __rvm_try_sudo \command \tee "$cert_file" < "$__target" > /dev/null ||
  {
    \typeset __ret=$?
    rm -f "$__target"
    return ${__ret}
  }
}

requirements_osx_update_openssl_cert_ensure_readable()
{
  __target="$cert_file"
  while
    [[ ! -r "$__target" && "$__target" != "" ]]
  do
    __rvm_try_sudo \chmod ugo+rX "$__target"
    __target="${__target%/*}"
  done
}

requirements_osx_update_openssl_cert_run()
{
  \typeset __target="$cert_file"

  if
    [[ -z "$cert_file" ]]
  then
    rvm_error "Empty path passed to certificates update, functions stack: ${FUNCNAME[*]}"
    return 1
  fi

  rvm_log "Updating certificates bundle '$cert_file'"

  requirements_osx_update_openssl_cert_create_dir      || return $?
  requirements_osx_update_openssl_cert_target_select   || return $?
  requirements_osx_update_openssl_cert_create_cert     || return $?
  requirements_osx_update_openssl_cert_target_move     || return $?
}

requirements_osx_update_openssl_cert()
{
  [[ "Darwin" == "${_system_type}" ]] || return 0

  \typeset ssl_binary ssl_dir cert_file
  ssl_binary="${1:-$(__rvm_which openssl)}"
  __rvm_osx_ssl_certs_file_from_openssl "${ssl_binary}" || return $?
  ssl_dir="${cert_file%/*}"

  case "${rvm_autolibs_flag_number}" in
    (0)
      rvm_debug "Skipping update of certificates bundle '$cert_file', to force update run:
    rvm osx-ssl-certs update ${cert_file}
"
      return 0
      ;;
  esac

  if
    requirements_osx_update_openssl_cert_is_old
  then
    rvm_requiremnts_fail_or_run_action 2 \
      "Skipping update of certificates bundle '$cert_file', to force update run:
    rvm osx-ssl-certs update ${cert_file}
" \
      requirements_osx_update_openssl_cert_run ||
      return $?
  else
    rvm_log "Certificates bundle '$cert_file' is already up to date."
  fi
  requirements_osx_update_openssl_cert_ensure_readable || return $?
}

__rvm_osx_ssl_certs_update_for_path()
{
  \typeset ssl_dir cert_file
  cert_file="${1:-$( __rvm_osx_ssl_certs_file_for_ruby )}"
  ssl_dir="${cert_file%/*}"

  if (( ${rvm_silent_flag:-0} == 0 ))
  then printf "%b" "Updating certificates bundle ${cert_file}: "
  fi
  if
    requirements_osx_update_openssl_cert_is_old
  then
    if
      requirements_osx_update_openssl_cert_run
    then
      if (( ${rvm_silent_flag:-0} == 0 ))
      then printf "%b" "Updated.\n"
      fi
    else
      \typeset result=$?
      if (( ${rvm_silent_flag:-0} == 0 ))
      then printf "%b" "Failed.\n"
      else printf "%b" "Updating certificates for ${cert_file}: Failed.\n"
      fi
      return $result
    fi
  else
    if (( ${rvm_silent_flag:-0} == 0 ))
    then printf "%b" "Already up to date.\n"
    fi
  fi
  requirements_osx_update_openssl_cert_ensure_readable || return $?
}

__rvm_osx_ssl_certs_status_for_path()
{
  \typeset ssl_dir cert_file
  cert_file="$1"
  ssl_dir="${cert_file%/*}"

  printf "%b" "Certificates bundle ${cert_file} is "
  if requirements_osx_update_openssl_cert_is_old
  then printf "%b" "old.\n"
  else printf "%b" "up to date.\n"
  fi
}

__rvm_osx_ssl_certs_file_for_ruby()
{
  "${1:-ruby}" -ropenssl -e 'puts OpenSSL::X509::DEFAULT_CERT_FILE' 2>/dev/null
}

__rvm_osx_ssl_certs_ensure_for_ruby()
{
  [[ "${_system_name}" == "OSX" ]] || return 0

  \typeset ssl_dir cert_file
  cert_file="$( __rvm_osx_ssl_certs_file_for_ruby "$1" )"
  ssl_dir="${cert_file%/*}"
  if
    requirements_osx_update_openssl_cert_is_old
  then
    rvm_requiremnts_fail_or_run_action 2 \
      "Skipping update of certificates bundle '$cert_file'." \
      requirements_osx_update_openssl_cert_run ||
      true # Ignore failure - ruby is already installed
  fi
  requirements_osx_update_openssl_cert_ensure_readable || return $?
  true # for osx
}

__rvm_osx_ssl_certs_file_from_openssl()
{
  cert_file="$( "${1:-openssl}" version -d )" ||
    rvm_requiremnts_fail_always 2 "Failed reading certificates path for '${1:-openssl}' with return code: ($__result)." $? ||
    return $?
  cert_file="${cert_file#*\"}"
  cert_file="${cert_file%\"*}"
  cert_file="${cert_file}/cert.pem"
}

__sm.cron.show()
{
  EDITOR="\command \cat" crontab -e 2>/dev/null
}

__rvm_cron_find()
{
  __sm.cron.show | __rvm_grep "$1" >/dev/null || return $?
}

__rvm_cron_uninstall()
{
  __sm.cron.show | __rvm_grep -v "$1" | crontab -
}

__rvm_cron_install()
{
  {
    __sm.cron.show
    echo "@daily $1"
  } | crontab -
}

export RVM_OSX_SSL_UPDATER="$rvm_path/bin/rvm --silent osx-ssl-certs update all"
scripts/functions/selector_parse000066400000016332147511530560013216 0ustar00#!/usr/bin/env bash

__rvm_ruby_string_fuzzy_remote()
{
  \typeset new_ruby_string __search
  __search="${rvm_ruby_string}"
  if [[ -n "${rvm_ruby_name:-}" ]]
  then __search="${__search%${rvm_ruby_name:-}}.*${rvm_ruby_name:-}"
  fi
  new_ruby_string="$(
    __list_remote_all |
    __rvm_awk -F/ '{ x=$NF;
      gsub(".tar.*","",x);
      gsub("jruby-bin","jruby",x);
      gsub("rubinius","rbx",x);
      print x}' |
    __rvm_version_sort |
    __rvm_awk '
BEGIN{found=""; any=""}
/^'"${__search}"'$/ {found=$1}
/^'"${__search}"'/ {any=$1}
END{if (found) print found; else if (any) print any;}
'
  )"
  rvm_ruby_string="${new_ruby_string:-$rvm_ruby_string}"
}

__rvm_ruby_string_fuzzy()
{
  \typeset new_ruby_string __search
  __search="${rvm_ruby_string}"
  if [[ -n "${rvm_ruby_name:-}" ]]
  then __search="${__search%${rvm_ruby_name:-}}.*${rvm_ruby_name:-}"
  fi
  new_ruby_string="$(
    __rvm_list_strings |
    __rvm_grep "${__search//\./\\.}" |
    __rvm_version_sort |
    __rvm_tail -n 1
  )"
  if [[ -n "${new_ruby_string}" ]]
  then rvm_ruby_string="${new_ruby_string}"
  else return $?
  fi
}

__rvm_ruby_string_parse_()
{
  \typeset ruby_string gemset_name expanded_alias_name repo_url branch_name ruby_name tag_name

  # Stash the ruby string.
  ruby_string="${rvm_ruby_string:-}"
  gemset_name="${rvm_gemset_name:-}"
  repo_url="${rvm_ruby_repo_url:-}"
  branch_name="${rvm_ruby_repo_branch:-}"
  ruby_name="${rvm_ruby_name:-}"
  tag_name="${rvm_ruby_repo_tag:-}"

  __rvm_unset_ruby_variables

  rvm_ruby_repo_url="${repo_url:-}"
  rvm_ruby_repo_branch="${branch_name:-}"
  rvm_ruby_name="$ruby_name"
  rvm_ruby_repo_tag="${rvm_ruby_repo_tag:-}"

  export rvm_head_flag=0

  if
    [[ -z "${ruby_string}" || "${ruby_string}" == "current" ]]
  then
    if
      [[ "${GEM_HOME:-}" == *"${rvm_gems_path}"* ]]
    then
      # Current Ruby
      ruby_string="${GEM_HOME##*\/}"
      ruby_string="${ruby_string/%${rvm_gemset_separator:-"@"}*}"
    else
      ruby_string="system"
    fi
  fi

  strings=()
  __rvm_custom_separated_array strings - "${ruby_string}"
  rvm_ruby_string="${ruby_string}"

  # +() in ZSH, see https://github.com/rvm/rvm/issues/2807
  if [[ -n "${ZSH_VERSION:-}" ]]
  then setopt LOCAL_OPTIONS KSH_GLOB
  fi

  for string in ${strings[@]}
  do
    case "$string" in
      (head)
        rvm_ruby_patch_level=""
        rvm_ruby_revision=""
        rvm_ruby_tag=""
        rvm_head_flag=1
        ;;

      (system)
        rvm_ruby_interpreter="system"
        rvm_ruby_patch_level=""
        rvm_ruby_tag=""
        rvm_ruby_revision=""
        rvm_ruby_version=""
        rvm_gemset_name=""
        rvm_head_flag=0
        return 0
        ;;

      (ext|external)
        rvm_ruby_interpreter="ext"
        rvm_ruby_patch_level=""
        rvm_ruby_tag=""
        rvm_ruby_revision=""
        rvm_ruby_version=""
        rvm_head_flag=0

        rvm_ruby_name="${ruby_string:-${rvm_ruby_string}}"
        rvm_ruby_name="${rvm_ruby_name#*-}"
        break
        ;;

      (nightly|weekly|monthly)
        case "${rvm_ruby_interpreter}" in
          (rbx|rubinius) rvm_ruby_patch_level="$string" ;;
          (*)            rvm_ruby_version="$string"     ;;
        esac
        rvm_nightly_flag=1
        ;;

      (nightly*|weekly*|monthly*)
        case "${rvm_ruby_interpreter}" in
          (rbx|rubinius) rvm_ruby_patch_level="$string" ;;
          (*)            rvm_ruby_version="$string"     ;;
        esac
        ;;

      (preview*)
        rvm_ruby_patch_level="$string"
        ;;

      (rc[0-9]*)
        rvm_ruby_patch_level="$string"
        ;;

      (+([0-9]).+([0-9]).[0-9]*)
        rvm_ruby_version="${string}"
        rvm_ruby_revision=""
        rvm_ruby_tag=""
        ;;

      ([0-9][0-9]*)
        case "${rvm_ruby_interpreter:-""}" in
          (ree)
            rvm_ruby_patch_level="$string"
            rvm_ruby_revision=""
            ;;
          (maglev)
            rvm_ruby_version="$string"
            rvm_ruby_revision=""
            rvm_ruby_patch_level=""
            ;;
          (*)
            rvm_ruby_version="${string}"
            rvm_ruby_revision=""
            rvm_ruby_tag=""
            ;;
        esac
        ;;

      ([0-9]*)
        rvm_ruby_version="${string}"
        rvm_ruby_revision=""
        rvm_ruby_tag=""
        ;;

      (p[0-9]*)
        rvm_ruby_patch_level="$string"
        ;;

      (r[0-9]*)
        rvm_ruby_patch_level=""
        rvm_ruby_revision="$string"
        ;;

      (s[0-9a-zA-ZuU]*)
        rvm_ruby_revision=""
        rvm_ruby_sha="${string#s}"
        ;;

      (tag[0-9])
        rvm_ruby_repo_tag="$string"
        ;;

      (tv[0-9]*|t[0-9]*)
        rvm_ruby_patch_level="" ; rvm_ruby_revision=""
        rvm_ruby_tag="$string"
        ;;

      (m[0-9]*)
        rvm_ruby_mode="$string"
        ;;

      (u[0-9a-zA-ZuU]*)
        rvm_ruby_patch_level="" ; rvm_ruby_revision="" ; rvm_ruby_tag="" ; rvm_ruby_patch=""
        rvm_ruby_user_tag="$string"
        ;;

      (b[0-9]*)
        rvm_ruby_repo_branch="${string}"
        rvm_head_flag=1
        ;;

      (rubinius)
        rvm_ruby_interpreter="rbx"
        ;;

      (opal|ruby|rbx|jruby|macruby|ree|maglev|ironruby|mruby|topaz|truffleruby)
        rvm_ruby_interpreter="$string"
        ;;

      ([a-zA-ZuU]*([0-9a-zA-ZuU]|_))
        rvm_ruby_name="$string"
        ;;

      (*)
        rvm_ruby_string="${ruby_string:-}"
        return 0
        ;;
    esac
  done
  if
    [[ -z "${rvm_ruby_interpreter}" && -n "${rvm_ruby_version}" ]]
  then
    case "${rvm_ruby_version}" in
      (1.[5-7]*|9*)    rvm_ruby_interpreter=jruby ;;
      (1.[8-9]*|2*|3*) rvm_ruby_interpreter=ruby  ;;
    esac
    if [[ -n "${rvm_ruby_interpreter}" ]]
    then rvm_ruby_string="${rvm_ruby_interpreter}-${rvm_ruby_string}"
    fi
  fi
  true # OSX --trace FIX
}

__rvm_ruby_string_latest()
{
  \typeset check_ruby_string new_ruby_string
  check_ruby_string=""
  if [[ -n "${rvm_ruby_interpreter}" ]]
  then check_ruby_string+="${rvm_ruby_interpreter}-"
  fi
  if [[ -n "${rvm_ruby_version}" ]]
  then check_ruby_string+="${rvm_ruby_version//\./\.}.*"
  fi
  if [[ -n "${rvm_ruby_patch_level}" ]]
  then check_ruby_string+="${rvm_ruby_patch_level//\./\.}.*"
  fi
  if [[ -z "${check_ruby_string}" ]]
  then check_ruby_string="$rvm_ruby_string"
  fi
  new_ruby_string="$(
    \command \cat "$rvm_path/config/known_strings" |
    __rvm_grep "${check_ruby_string}" |
    __rvm_version_sort |
    __rvm_tail -n 1
  )"
  if
    [[ -n "${new_ruby_string}" ]]
  then
    rvm_ruby_string="${new_ruby_string}"
  else
    rvm_error "Unknown ruby string (do not know how to handle): $rvm_ruby_string."
    return 1
  fi
}

__rvm_ruby_string_parse()
{
  # detect rvm_ruby_name early so it can be used in fuzzy/remote
  __rvm_ruby_string_parse_ || true

  if
    (( ${rvm_fuzzy_flag:-0} == 1 )) &&
    [[ ! -d "${rvm_rubies_path}/${rvm_ruby_string}" ]]
  then
    if
      (( ${rvm_remote_flag:-0} == 1 ))
    then
      __rvm_ruby_string_fuzzy        ||
      __rvm_ruby_string_fuzzy_remote ||
      return $?
    else
      __rvm_ruby_string_fuzzy || true
    fi
  fi

  # parse the detected version
  __rvm_ruby_string_parse_ || return $?

  if
    [[ -z "${rvm_ruby_interpreter}" ]]
  then
    rvm_error "Unknown ruby interpreter version (do not know how to handle): $rvm_ruby_string."
    return 1
  fi
}
scripts/functions/list000066400000001630147511530560011152 0ustar00#!/usr/bin/env bash

# Query for valid rvm ruby strings
# This is meant to be used with scripting.
__rvm_list_strings()
{
  __rvm_find "$rvm_rubies_path" -mindepth 1 -maxdepth 1 -type d | __rvm_awk -F'/' '{print $NF}'
}

# This is meant to be used with scripting.
__rvm_list_gemset_strings()
{
  \typeset all_rubies ruby_name gemset

  all_rubies="$(__rvm_list_strings | tr "\n" ":")"

  for gemset in "${rvm_gems_path:-"$rvm_path/gems"}"/*
  do
    case "$gemset" in
      (*/\*|@*|doc|cache|system) continue ;;
    esac
    ruby_name="${gemset%%@*}"
    ruby_name="${ruby_name##*/}"
    case ":$all_rubies" in
      (*:${ruby_name}:*) true ;;
      (*) continue ;;
    esac
    echo "${gemset##*/}"
  done | sort

  return 0
}

# This is meant to be used with scripting.
__rvm_list_known_strings()
{
  __rvm_sed -e 's/#.*$//g' -e 's#\[##g' -e 's#\]##g' < "$rvm_path/config/known" | \
    sort -r | uniq

  return $?
}
scripts/functions/pkg000077500000026622147511530560010773 0ustar00#!/usr/bin/env bash

## common part of requirements_rvm_pkg_* extracted from scripts/functions/requirements/rvm_pkg ->
requirements_rvm_pkg_config()
{
  PKG_CONFIG_PATH="${rvm_usr_path:-${rvm_path}/usr}/lib/pkgconfig:${rvm_usr_path:-${rvm_path}/usr}/lib64/pkgconfig:/opt:/usr:/usr/local" pkg-config "$@"
}

requirements_rvm_pkg_lib_installed()
{
  if is_a_function ${1}_installed && ${1}_installed
  then return 0
  fi
  requirements_rvm_pkg_config --list-all | __rvm_grep "^$1[- ]" >/dev/null || return $?
  true
}

requirements_rvm_pkg_libs_install()
{
  while
    (( $# ))
  do
    PKG_CONFIG_LIBDIR="${rvm_usr_path:-${rvm_path}/usr}/lib/pkgconfig" install_$1 || return $?
    shift
  done
}

requirements_rvm_pkg_after_uniqe_paths()
{
  \typeset __lib __lib_full_name
  for __lib
  do
    __lib_full_name=$( requirements_rvm_pkg_config --list-all | __rvm_awk "/^${__lib}[- ]/{print \$1}" )
    if
      [[ -n "${__lib_full_name}" ]]
    then
      requirements_rvm_pkg_config ${__lib_full_name} --variable=prefix
    elif
      [[ "${__lib}" == 'readline' ]]
    then
      # http://lists.gnu.org/archive/html/bug-readline/2010-09/msg00002.html
      echo ${rvm_usr_path:-${rvm_path}/usr}
    else
      rvm_error "Can not find ${__lib} in 'pkg-config'"
    fi
  done | sort -u
}

requirements_rvm_pkg_configure()
{
  \typeset -a __packages
  \typeset __package __target
  __target="$1"
  shift
  __rvm_read_lines __packages <(
    requirements_rvm_pkg_after_uniqe_paths "$@"
  )
  for __package in "${__packages[@]}"
  do __rvm_update_configure_opt_dir "$__target" "$__package"
  done
}
## common part of requirements_rvm_pkg_* extracted from scripts/functions/requirements/rvm_pkg <-

## helper for checking marking missing custom packages
requirements_rvm_pkg_lib_installed_custom()
{
  while
     (( $# ))
  do
    requirements_rvm_pkg_lib_installed "$1" || packages_custom+=( "$1" )
    shift
  done
}

## Real work for installing packages from source
install_package()
{
  __rvm_db "${package}_url" "package_url"
  __rvm_db "${package}_rename_dir" "package_rename_dir"
  (
    __rvm_cd "$rvm_src_path"
    __rvm_rm_rf "$rvm_src_path/$package-$version"
    local_file="$package-$version.$archive_format"
    rvm_log "Fetching $local_file to $rvm_archives_path"

    "$rvm_scripts_path/fetch" "$package_url/${remote_file:-$local_file}" "$local_file" || return $?
    __rvm_log_command "$package/extract" "Extracting ${package} to $rvm_src_path/$package-$version" \
      __rvm_package_extract "$rvm_archives_path/$local_file" "$rvm_src_path" ||
    case $? in
      199)
        rvm_error "\nUnrecognized archive format '$archive_format'"
        return 199
        ;;
      *)
        rvm_error "There has been an error while trying to extract the source. Halting the installation."
        return 1
        ;;
    esac

    if [[ -n "${package_rename_dir:-}" ]]
    then \command \mv "$rvm_src_path/${package_rename_dir}" "$rvm_src_path/$package-$version"
    fi
    __rvm_cd "$rvm_src_path/$package-$version"
    __rvm_add_to_path append /usr/bin

    if
      [[ -n "$patches" ]]
    then
      for patch in $(echo $patches | \command \tr ',' ' ')
      do
        __rvm_log_command "$package/patch" "Applying patch '$patch'..." __rvm_patch -p0 -f -i "$patch" ||
        {
          \typeset result=$?
          rvm_error "Patch $patch did not apply cleanly... back to the patching board :("
          exit $result
        }
      done
    fi

    if
      [[ "${rvm_skip_autoreconf_flag:-0}" == 0 ]] &&
      [[ -f configure.ac || -f configure.in ]]
    then
      if
        (( ${#rvm_autoconf_flags[@]} == 0 ))
      then
        case "${_system_type}" in
          (Windows) rvm_autoconf_flags=( -ivf )        ;; # no symlinks on windows :(
          (*)       rvm_autoconf_flags=( -is --force ) ;;
        esac
      fi
      __rvm_log_command "$package/autoreconf" "Prepare $package in $rvm_src_path/$package-$version." \
        __rvm_autoreconf "${rvm_autoconf_flags[@]}"
    fi

    [[ -n "${rvm_configure_env[*]}" ]] || rvm_configure_env=() # zsh can assume empty var => ( '' )
    (( ${#configure[@]} )) || configure=( ./configure )
    configure=(
      "${rvm_configure_env[@]}"
      "${configure[@]}" --prefix="${prefix_path:-$rvm_usr_path}"
      "${rvm_configure_flags[@]}" "${configure_flags[@]}"
    )

    __rvm_log_command "$package/configure" "Configuring $package in $rvm_src_path/$package-$version." \
      "${configure[@]}"

    unset configure_flags configure

    touch "$rvm_path/config/packages"
    if [[ "$action" == "uninstall" ]]
    then
      __rvm_log_command "$package/make.uninstall" "Uninstalling $package from ${prefix_path:-$rvm_usr_path}"  __rvm_make uninstall &&
      __rvm_cd "$rvm_src_path" &&
      __rvm_log_command "$package/rm_src.uninstall" "Removing ${package}-${version} from $rvm_src_path" \
        \command \rm -rf "$rvm_src_path/$package-$version" &&
      __rvm_db_ "$rvm_path/config/packages" "${package}" delete
    else
      __rvm_log_command "$package/make"         "Compiling $package in $rvm_src_path/$package-$version." \
        __rvm_make "${rvm_make_flags[@]}" &&
      __rvm_log_command "$package/make.install" "Installing $package to ${prefix_path:-$rvm_usr_path}" \
        __rvm_make install &&
      __rvm_db_ "$rvm_path/config/packages" "${package}" "${version}"
    fi
  )

  __function_on_stack __rvm_install_ruby ||
  rvm_warn "
Please note that it's required to reinstall all rubies:

    rvm reinstall all --force
"
}

package_installed()
{
  \typeset __search_path __lib_file __extension
  __search_path="${prefix_path:-${rvm_usr_path:-${rvm_path}/usr}}"

  [[ -f "${__search_path}/include/$1" ]] || return $?

  # __rvm_detect_system() does not support CYGWIN MINGW!
  case "${_system_type}" in
    (Darwin)  __extension="dylib" ;;
    (Windows) __extension="dll"   ;;
    (*)       __extension="so"    ;;
  esac
  __lib_file=$( __rvm_find "${__search_path}" -name "$2.${__extension}" | \command \head -n 1 )

  [[ -n "${__lib_file}" ]] || return $?

  case "${_system_type}" in
    (Darwin) lipo -info "${__lib_file}" | __rvm_grep "${_system_arch}" >/dev/null || return $? ;;
  esac
}

install_readline()
{
  package="readline" ; archive_format="tar.gz"
  __rvm_update_configure_opt_dir readline "${rvm_usr_path}"

  configure=( ./configure --disable-dependency-tracking )
  version="5.2"
  patches="$rvm_patches_path/$package-$version/shobj-conf.patch"
  install_package

  configure=( ./configure --disable-dependency-tracking )
  version="6.2"
  patches="$rvm_patches_path/$package-$version/patch-shobj-conf.diff"
  install_package
}
readline_installed()
{
  package_installed "readline/readline.h" "libreadline" || return $?
}

install_iconv()
{
  package="libiconv" ; version=1.13.1 ; archive_format="tar.gz"
  install_package
}

install_curl()
{
  package="curl" ; version=7.19.7 ; archive_format="tar.gz"
  install_package
}

install_openssl()
{
  \typeset -a openssl_use_asm
  package="openssl" ; archive_format="tar.gz"
  openssl_use_asm=( "no-asm" )
  __rvm_db "${package}_version" "version"
  if
    [[ "Darwin" == "${_system_type}" ]]
  then
    configure=( "./Configure" )
    if
      (( ${#rvm_architectures[@]} > 0 ))
    then
      if __rvm_string_match "${rvm_architectures[*]}" "64"
      then hw_cpu64bit=1
      fi
      if __rvm_string_match "${rvm_architectures[*]}" "ppc"
      then hw_machine="Power Macintosh"
      fi
    else
      hw_machine=$(sysctl hw.machine | __rvm_awk -F: '{print $2}' | __rvm_sed 's/^ //')
      hw_cpu64bit=$(sysctl hw.cpu64bit_capable | __rvm_awk '{print $2}')
    fi
    if
      [[ "Power Macintosh" == "$hw_machine" ]]
    then
      if [[ $hw_cpu64bit == 1 ]]
      then configure+=( "darwin64-ppc-cc" )
      else configure+=( "darwin-ppc-cc" )
      fi
    else
      if
       [[ $hw_cpu64bit == 1 ]]
      then
        configure+=( "darwin64-x86_64-cc" )
        openssl_use_asm=()
      else
        configure+=( "darwin-i386-cc" )
      fi
    fi
  else
    configure=( "./config" )
    if __rvm_compiler_version_or_higher "4.6"
    then openssl_use_asm=()
    fi
  fi
  configure+=( -I$rvm_usr_path/include -L$rvm_usr_path/lib zlib "${openssl_use_asm[@]}" no-krb5 )
  install_package
  __rvm_log_command openssl.certs "Updating openssl certificates" update_openssl_certs
}

update_openssl_certs()
(
  __rvm_cd "$rvm_usr_path/ssl" &&
  __rvm_curl https://raw.githubusercontent.com/bagder/ca-bundle/master/ca-bundle.crt -o cert.pem ||
  __rvm_curl https://curl.haxx.se/ca/cacert.pem -o cert.pem
)
openssl_installed()
{
  package_installed "openssl/opensslv.h" "libssl" || return $?
}

install_zlib()
{
  package="zlib" ; version="1.2.7" ; archive_format="tar.gz"
  install_package
}

install_autoconf()
{
  package="autoconf" ; version="2.65" ; archive_format="tar.gz"
  prefix_path="$rvm_usr_path"
  install_package
}

install_ncurses()
{
  package="ncurses" ; version="5.7" ; archive_format="tar.gz"
  configure_flags=(
    --disable-rpath --without-debug --without-ada --enable-safe-sprintf --enable-sigwinch --without-progs
  )
  install_package
}

install_pkgconfig()
{
  package="pkg-config" ; version="0.23" archive_format="tar.gz"
  install_package
}

install_gettext()
{
  package="gettext" ; version="0.17" ; archive_format="tar.gz"
  install_package
}

install_libxml()
{
  install_libxml2 "$@"
}

install_libxml2()
{
  package="libxml2" ; version="2.7.3" ; archive_format="tar.gz"
  if
    [[ "Darwin" == "${_system_type}" ]]
  then
    configure=(
      ./configure --build=i686-apple-darwin$(command uname -r) --host=i686-apple-darwin$(command uname -r)
    )
  fi
  install_package
  unset prefix_path
}

install_libxslt()
{
  package="libxslt" ; version="1.1.26" ; archive_format="tar.gz"
  configure_flags=( --with-libxml-prefix="$rvm_usr_path" )
  if
    [[ "SunOS" == "${_system_type}" ]]
  then
    patches="$rvm_patches_path/$package-$version/solaris.patch"
  fi
  install_package
  unset prefix_path
}

install_yaml()
{
  install_libyaml "$@"
}

install_libyaml()
{
  package="yaml" ; archive_format="tar.gz"
  __rvm_db "${package}_version" "version"
  install_package
}

libyaml_installed()
{
  package_installed "yaml.h" "libyaml"
}

install_glib()
{
  ( install_pkgconfig; )
  ( install_gettext; )
  package="glib" ; version="2.23.1" ; archive_format="tar.gz"
  __rvm_update_configure_env CC="cc" \
    CFLAGS="-I${rvm_usr_path}/include" \
    LDFLAGS="-L${rvm_usr_path}/lib" \
    PKG_CONFIG="$rvm_usr_path/bin/pkg-config"
  install_package
}

install_mono()
{
  ( install_glib; )

  __rvm_mono_env
  package="mono" ; version="2.6.1" ; archive_format="tar.bz2"
  install_package
}

install_llvm()
{
  package="llvm"
  version="89156"
  (
    __rvm_cd $rvm_src_path
    if [[ ! -d "$rvm_src_path/llvm/.svn" ]] ; then
      __rvm_db "${package}_url" "package_url"
      __rvm_rm_rf "$rvm_src_path/llvm"
      svn co -r "$version" "$package_url" llvm
      __rvm_cd "$rvm_src_path/llvm"
      ./configure --enable-bindings=none
      UNIVERSAL=1 UNIVERSAL_ARCH="i386 x86_64" ENABLE_OPTIMIZED=1 __rvm_make -j2
      __rvm_try_sudo env UNIVERSAL=1 UNIVERSAL_ARCH="i386 x86_64" ENABLE_OPTIMIZED=1 __rvm_make install
    fi
  )
}

install_epel()
{
  mv="${_system_version%%.*}"
  if [[ "${_system_name}" == "CentOS" ]] && [[ -f /etc/yum.repos.d/epel.repo ]] ; then
    __rvm_db "epel${mv}_key" "epel_key"
    __rvm_db "epel${mv}_rpm" "epel_rpm"
    "${rvm_scripts_path}/fetch" "${epel_key}"
    "${rvm_scripts_path}/fetch" "${epel_rpm}"
    __rvm_try_sudo rpm --import "${rvm_archives_path}/${epel_key##*/}"
    __rvm_try_sudo rpm --quiet -i "${rvm_archives_path}/${epel_rpm##*/}"
  fi
}
scripts/functions/utility_logging000066400000015046147511530560013416 0ustar00#!/usr/bin/env bash

__rvm_log_command_caclulate_log_timestamp()
{
  export rvm_log_timestamp="$(__rvm_date "+%s")"
  rvm_debug "Log prefix: ${rvm_log_path}/${rvm_log_timestamp}${rvm_ruby_string:+_}${rvm_ruby_string:-}/"
}

__rvm_log_command_caclulate_log_filesystem()
{
  export rvm_log_filesystem="$(
    __rvm_mount 2>/dev/null | __rvm_awk -v rvm_path=$rvm_path '
      BEGIN{longest=""; fstype=""}
      {if (index(rvm_path,$3)==1 && length($3)>length(longest)){longest=$3; fstype=$5}}
      END{print fstype}
    '
  )"
  rvm_debug "Log filesystem: ${rvm_log_filesystem}"
}

__rvm_log_command_caclulate_log_namelen()
{
  case "${rvm_log_filesystem}" in
    (ecryptfs) export rvm_log_namelen=138 ;;
    (*)        export rvm_log_namelen=250 ;;
  esac
  rvm_debug "Log max name length: ${rvm_log_namelen}"
}

__rvm_log_command_caclulate_log_file_name()
{
  [[ -n "${rvm_log_timestamp:-}"  ]] || __rvm_log_command_caclulate_log_timestamp
  [[ -n "${rvm_log_filesystem:-}" ]] || __rvm_log_command_caclulate_log_filesystem
  [[ -n "${rvm_log_namelen:-}"    ]] || __rvm_log_command_caclulate_log_namelen
  name="${name//[ \/]/_}"
  _log="${rvm_log_path}/${rvm_log_timestamp}${rvm_ruby_string:+_}${rvm_ruby_string:-}/${name}"
  if [[ -n "${ZSH_VERSION:-}" ]]
  then _log="${_log[0,${rvm_log_namelen}]}.log"
  else _log="${_log:0:${rvm_log_namelen}}.log"
  fi
}

# Run a specified command and log it (once).
__rvm_log_command()
{
  \typeset name message _command_start _command_name
  \typeset -a _command

  name="${1:-}"
  message="${2:-}"
  shift 2
  _command=( "$@" )   # store full command so we can manipulate it
  _command_start="$1" # store first part so we can detect variables
  while (( $# )) && [[ "$1" == *"="* ]] # skip variables from beginning
  do shift
  done
  _command_name="$1"  # store the real command so we can detect functions

  [[ "${_command_start}" != *"="* ]] || _command=( "env" "${_command[@]}" )
  if __function_on_stack __rvm_log_command_internal
  then __rvm_log_command_simple   "$@" || return $?
  else __rvm_log_command_internal "$@" || return $?
  fi
}

# basic debugging information for the command
__rvm_log_command_debug()
{
  printf "%b" "[$(__rvm_date +'%Y-%m-%d %H:%M:%S')] ${_command_name}\n"
  if is_a_function "${_command_name}"
  then \typeset -f  "${_command_name}"
  fi
  printf "%b" "current path: $PWD\n"
  env | __rvm_grep -E '^GEM_HOME=|^GEM_PATH=|^PATH='
  printf "%b" "command(${#_command[@]}): ${_command[*]}\n"
}

# Run a specified command and do not log it again.
__rvm_log_command_simple()
{
  __rvm_log_command_debug
  rvm_log "$message"
  "$@" || return $?
}

# Run a specified command and log it.
__rvm_log_command_internal()
{
  \typeset _log

  (( ${rvm_niceness:-0} == 0 ))      || _command=( nice -n $rvm_niceness "${_command[@]}" )

  __rvm_log_command_caclulate_log_file_name
  rvm_debug "Log file: ${_log}"

  [[ -d "${_log%\/*}" ]] || \command \mkdir -p "${_log%\/*}"
  [[ -f "${_log}"     ]] || \command \rm -f "${_log}"

  __rvm_log_command_debug | tee "${_log}" | rvm_debug_stream

  __rvm_log_dotted "${_log}" "$message" "${_command[@]}" ||
  {
    \typeset result=$?
    \typeset __show_lines="${rvm_show_log_lines_on_error:-0}"
    rvm_error "Error running '${_command[*]}',"
    case "${__show_lines}" in
      (0)
        rvm_error "please read ${_log}"
        ;;
      (all)
        rvm_error "content of log ${_log}"
        cat "${_log}" >&6
        ;;
      (*)
        rvm_error "showing last ${__show_lines} lines of ${_log}"
        tail -n "${__show_lines}" "${_log}" >&6
        ;;
    esac
    return ${result}
  }
}

__rvm_debug_command()
{
  rvm_debug "Running($#): $*"
  "$@" || return $?
}

__rvm_pager_or_cat_v()
{
  eval "${PAGER:-\command \cat} '$1'"
}

__rvm_ask_for()
{
  \typeset response
  rvm_warn "$1"
  printf "%b" "(anything other than '$2' will cancel) > "

  # need and IF to properly handle CTRL+C ... wtf?
  if read response && [[ "$2" == "$response" ]]
  then return 0
  else return 1
  fi
}

__rvm_dotted()
{
  set +x
  \typeset flush

  if (( $# ))
  then printf "%b" "${rvm_notify_clr:-}$*${rvm_reset_clr:-}"
  fi

  if __rvm_awk '{fflush;}' <<<EO 2>/dev/null
  then flush=fflush
  else flush=flush
  fi

  # the nasty '${flush}' inside is for compatibility,
  # old awk does not allow running function from variable
  awk -v go_back="$( tput cub1 2>/dev/null || true)" \
'
  BEGIN{
    spin[0]="|"go_back;
    spin[1]="/"go_back;
    spin[2]="-"go_back;
    spin[3]="\\"go_back }
  {
    if ((NR-1)%(10)==9)
      printf ".";
    else
      if (go_back!="") printf spin[(NR-1)%4];
    '${flush}' }
  END{
    print "." }
  '
}

__rvm_log_dotted()
{
  \typeset __log_file __message __iterator __result __local_rvm_trace_flag
  __log_file="$1"
  __message="$2"
  shift 2
  __result=0
  __local_rvm_trace_flag=${rvm_trace_flag:-0}
  if
    (( ${rvm_trace_flag:-0} ))
  then
    {
      set -x
      "$@" 2>&1 | tee -a "${__log_file}"
      __rvm_check_pipestatus ${PIPESTATUS[@]} ${pipestatus[@]} || __result=$?
      (( __local_rvm_trace_flag > 0 )) || set +x
    } 1>&2
  elif
    [[ -n "${ZSH_VERSION:-}" ]]
  then
    rvm_log "${__message} - please wait"
    {
      set -x
      "$@" > "${__log_file}" 2>&1 || __result=$?
      (( __local_rvm_trace_flag > 0 )) || set +x
    } 2>/dev/null
  else
    {
      set -x
      "$@" 2>&1 | tee -a "${__log_file}" | __rvm_dotted "${__message}"
      __rvm_check_pipestatus ${PIPESTATUS[@]} ${pipestatus[@]} || __result=$?
      (( __local_rvm_trace_flag > 0 )) || set +x
    } 2>/dev/null
  fi
  return $__result
}

__rvm_check_pipestatus()
{
  for __iterator
  do
    case "${__iterator}" in
      ("") true ;;
      (0)  true ;;
      (*)  return ${__iterator} ;;
    esac
  done
  return 0
}

__rvm_wait_anykey()
{
  if [[ -n "${1:-}" ]]
  then echo "$1"
  fi
  \typeset _read_char_flag
  if [[ -n "${ZSH_VERSION:-}" ]]
  then _read_char_flag=k
  else _read_char_flag=n
  fi
  builtin read -${_read_char_flag} 1 -s -r anykey
}

__rvm_table_br()
{
  \typeset width=${COLUMNS:-78}
  width=$(( width > 116 ? 116 : width ))
  printf "%-${width}s\n" " " | __rvm_sed 's/ /*/g'
}

__rvm_fold()
{
  if fold -s -w 10 <<<bla >/dev/null
  then fold -s -w $1
  else fold    -w $1
  fi
}

__rvm_table_wrap_text()
{
  \typeset width=${COLUMNS:-78}
  width=$(( width > 116 ? 116 : width ))
  width=$(( width - 4 )) # "* <content> *"
  __rvm_fold $width | __rvm_awk -v width=$width '{printf "* %-"width"s *\n", $0}'
}

# echo text | __rvm_table [header]
__rvm_table()
{
  if
    [[ -n "${1:-}" ]]
  then
    __rvm_table_br
    echo "$1" | __rvm_table_wrap_text
  fi
  __rvm_table_br
  \command \cat "${2:--}" | __rvm_table_wrap_text
  __rvm_table_br
}
scripts/functions/selector000077500000037754147511530560012042 0ustar00#!/usr/bin/env bash

source "${rvm_scripts_path}/functions/selector_gemsets"
source "${rvm_scripts_path}/functions/selector_late"
source "${rvm_scripts_path}/functions/selector_parse"
source "${rvm_scripts_path}/functions/selector_interpreters"

__rvm_select_set_variable_defaults()
{
  export GEM_HOME GEM_PATH MY_RUBY_HOME RUBY_VERSION IRBRC
  export rvm_env_string rvm_action rvm_alias_expanded rvm_archive_extension rvm_bin_flag rvm_bin_path rvm_debug_flag rvm_default_flag rvm_delete_flag rvm_docs_type rvm_dump_environment_flag rvm_error_message rvm_expanding_aliases rvm_file_name rvm_gemdir_flag rvm_gemset_name rvm_gemstone_package_file rvm_gemstone_url rvm_head_flag rvm_hook rvm_install_on_use_flag rvm_llvm_flag rvm_loaded_flag rvm_niceness rvm_nightly_flag rvm_only_path_flag rvm_parse_break rvm_patch_original_pwd rvm_pretty_print_flag rvm_proxy rvm_quiet_flag rvm_reload_flag rvm_remove_flag rvm_ruby_alias rvm_ruby_args rvm_ruby_binary rvm_ruby_bits rvm_ruby_configure rvm_ruby_file rvm_ruby_gem_home rvm_ruby_gem_path rvm_ruby_global_gems_path rvm_ruby_home rvm_ruby_interpreter rvm_ruby_irbrc rvm_ruby_major_version rvm_ruby_make rvm_ruby_make_install rvm_ruby_minor_version rvm_ruby_mode rvm_ruby_name rvm_ruby_package_file rvm_ruby_package_name rvm_ruby_patch rvm_ruby_patch_level rvm_ruby_release_version rvm_ruby_repo_url rvm_ruby_revision rvm_ruby_selected_flag rvm_ruby_sha rvm_ruby_string rvm_ruby_strings rvm_ruby_tag rvm_ruby_url rvm_ruby_user_tag rvm_ruby_version rvm_script_name rvm_sdk rvm_silent_flag rvm_sticky_flag rvm_system_flag rvm_token rvm_trace_flag rvm_use_flag rvm_user_flag rvm_verbose_flag rvm_ruby_repo_tag
}

__rvm_select_detect_ruby_string()
{
  rvm_ruby_string="${1:-${rvm_ruby_string:-${rvm_env_string:-}}}"
  if
    [[ -z "${rvm_ruby_string:-}" ]]
  then
    rvm_ruby_string="${rvm_ruby_interpreter:-}"
    rvm_ruby_string="${rvm_ruby_string:-}${rvm_ruby_version:+-}${rvm_ruby_version:-}"
    rvm_ruby_string="${rvm_ruby_string:-}${rvm_ruby_patch_level:+-}${rvm_ruby_patch_level:-}"
    rvm_ruby_string="${rvm_ruby_string:-}${rvm_ruby_revision:+-}${rvm_ruby_revision:-}"
    if [[ -n "${rvm_ruby_name:-}" ]]
    then rvm_ruby_name="$rvm_ruby_string-$rvm_ruby_name"
    fi
  fi
}

__rvm_select_interpreter_variables()
{
  rvm_archive_extension="tar.gz"

  if [[ -z "${rvm_ruby_interpreter:-}" ]]
  then rvm_ruby_interpreter="${rvm_ruby_string//-*/}"
  fi

  rvm_ruby_interpreter="${rvm_ruby_interpreter:-missing}"

  if
    is_a_function __rvm_select_interpreter_${rvm_ruby_interpreter}
  then
    __rvm_select_interpreter_${rvm_ruby_interpreter} || return $?
  elif
    [[ -n "${MY_RUBY_HOME:-""}" ]]
  then
    __rvm_select "${MY_RUBY_HOME##*/}" || return $?
  elif
    [[ -z "${rvm_ruby_string:-""}" ]]
  then
    rvm_error "Ruby implementation '$rvm_ruby_interpreter' is not known."
    return 1
  fi
}

__rvm_select_version_variables()
{
  case "$rvm_ruby_version" in
    (+([0-9]).+([0-9]).+([0-9]))
      rvm_ruby_release_version="${rvm_ruby_version/.*/}"
      rvm_ruby_major_version=${rvm_ruby_version%.*}
      rvm_ruby_major_version=${rvm_ruby_major_version#*.}
      rvm_ruby_minor_version="${rvm_ruby_version//*.}"
      ;;
    (+([0-9]).+([0-9]))
      rvm_ruby_release_version="${rvm_ruby_version/.*/}"
      rvm_ruby_major_version="${rvm_ruby_version#*.}"
      rvm_ruby_minor_version=""
      ;;
  esac
}

__rvm_select_default_variables()
{
  if [[ "${rvm_ruby_interpreter}" != ext ]]
  then rvm_ruby_package_name="${rvm_ruby_package_name:-${rvm_ruby_string//-n*}}"
  fi

  rvm_ruby_home="$rvm_rubies_path/$rvm_ruby_string"
  rvm_ruby_binary="$rvm_ruby_home/bin/ruby"
  rvm_ruby_irbrc="$rvm_ruby_home/.irbrc"
}

# __rvm_select implementation-version-patch_level
__rvm_select()
{
  true ${rvm_gemset_name:=}

  __rvm_select_set_variable_defaults &&
  __rvm_select_detect_ruby_string "${1:-}" &&
  __rvm_ruby_string &&
  __rvm_select_after_parse ||
  return $?
}

__rvm_select_after_parse()
{
  __rvm_select_interpreter_variables &&
  __rvm_select_version_variables     &&
  __rvm_select_default_variables     ||
  return $?

  [[ "system" == "$rvm_ruby_interpreter" ]] || __rvm_gemset_select ||
    return $result

  rvm_ruby_selected_flag=1
}


__rvm_use_system() {

  unset GEM_HOME GEM_PATH MY_RUBY_HOME RUBY_VERSION IRBRC

  if
    [[ -s "$rvm_path/config/system" ]]
  then
    if
      __rvm_grep "MY_RUBY_HOME='$rvm_rubies_path" "$rvm_path/config/system" > /dev/null
    then
      # 'system' should *not* point to an rvm ruby.
      if [[ -f "$rvm_path/config/system" ]]
      then \command \rm -f "$rvm_path/config/system"
      fi
    else
      source "$rvm_path/config/system"
    fi
  fi

  if
    (( ${rvm_default_flag:=0} == 1 ))
  then
    "$rvm_scripts_path/alias" delete default &> /dev/null
    __rvm_find "${rvm_bin_path}" -maxdepth 0 -name 'default_*' -exec rm '{}' \;
    \command \rm -f "$rvm_path/config/default"
    \command \rm -f "$rvm_environments_path/default"
    __rvm_rm_rf "$rvm_wrappers_path/default"
  fi

  rvm_verbose_log "Now using system ruby."

  __path_prefix=""
  __path_suffix="${rvm_bin_path}"
  export rvm_ruby_string="system"
}

__rvm_use()
{
  \typeset binary full_binary_path rvm_ruby_gem_home __path_prefix __path_suffix

  __rvm_select "$@" || return $?

  if [[ "system" == ${rvm_ruby_interpreter:="system"} ]]
  then __rvm_use_system
  else __rvm_use_ || return $?
  fi
  __rvm_use_common
}

__rvm_use_()
{
  rvm_ruby_home="${rvm_ruby_home%%@*}"

    if
      [[ ! -d "$rvm_ruby_home" ]]
    then
      if
        [[ ${rvm_install_on_use_flag:-0} -eq 1 ]]
      then
        rvm_warn "Required $rvm_ruby_string is not installed - installing."
        __rvm_run_wrapper manage "install" "$rvm_ruby_string"
      else
        rvm_error "Required $rvm_ruby_string is not installed."
        rvm_log "To install do: 'rvm install \"$rvm_ruby_string\"'"
        export rvm_recommended_ruby="rvm install $rvm_ruby_string"
        return 1
      fi
    fi

    __rvm_gemset_use_ensure || return $?

    export GEM_HOME GEM_PATH MY_RUBY_HOME RUBY_VERSION IRBRC
    GEM_HOME="$rvm_ruby_gem_home"
    GEM_PATH="$rvm_ruby_gem_path"
    MY_RUBY_HOME="$rvm_ruby_home"
    RUBY_VERSION="$rvm_ruby_string"
    IRBRC="$rvm_ruby_irbrc"
    unset BUNDLE_PATH # Ensure that BUNDLE_PATH is not set!

    # Handle MagLev pre-installed gems
    if [[ "maglev" == "$rvm_ruby_interpreter" ]]
    then GEM_PATH="$GEM_PATH:$MAGLEV_HOME/lib/maglev/gems/1.8/"
    fi

    [[ -n "${IRBRC:-}" ]] || unset IRBRC

    if
      (( ${rvm_use_flag:-1} >= 2 && ${rvm_internal_use_flag:-0} == 0 )) ||
      (( ${rvm_use_flag:-1} == 1 && ${rvm_verbose_flag:-0} == 1 ))
    then
      rvm_log "Using ${GEM_HOME/${rvm_gemset_separator:-'@'}/ with gemset }"
    fi

    if [[ "$GEM_HOME" != "$rvm_ruby_global_gems_path" ]]
    then __path_prefix="$GEM_HOME/bin:$rvm_ruby_global_gems_path/bin:${rvm_ruby_binary%/*}:${rvm_bin_path}"
    else __path_prefix="$GEM_HOME/bin:${rvm_ruby_binary%/*}:${rvm_bin_path}"
    fi
    __path_suffix=""
}

__rvm_use_common()
{
  [[ -z "${rvm_ruby_string:-}" ]] || export rvm_ruby_string
  [[ -z "${rvm_gemset_name:-}" ]] || export rvm_gemset_name

  \typeset __save_PATH
  __rvm_remove_rvm_from_path
  __save_PATH=$PATH
  if
    [[ -n "${_OLD_VIRTUAL_PATH}" ]]
  then
    # _OLD_VIRTUAL_PATH means we deal with virtualenv - see #2585,
    # PATH is saved in __save_PATH, use __rvm_remove_rvm_from_path to
    # clean _OLD_VIRTUAL_PATH via PATH ... a trick so we can transform
    # _OLD_VIRTUAL_PATH the same way like PATH for new ruby, from now on
    # any virtualenv operations will be aware of rvm
    PATH="${_OLD_VIRTUAL_PATH}"
    __rvm_remove_rvm_from_path
    _OLD_VIRTUAL_PATH="${__path_prefix:-}${__path_prefix:+:}${PATH}${__path_suffix:+:}${__path_suffix:-}"
  fi
  PATH="${__path_prefix:-}${__path_prefix:+:}$__save_PATH${__path_suffix:+:}${__path_suffix:-}"
  export PATH
  builtin hash -r

  if
    [[ "$rvm_ruby_string" != "system" ]]
  then
    case "${rvm_rvmrc_flag:-0}" in
      (rvmrc|versions_conf|ruby_version) __rvm_set_${rvm_rvmrc_flag} ;;
    esac

    \typeset environment_id
    environment_id="$(__rvm_env_string)"
    if
      (( ${rvm_default_flag:=0} == 1 )) &&
      [[ "default" != "${rvm_ruby_interpreter:-}" ]] &&
      [[ "system"  != "${rvm_ruby_interpreter:-}" ]]
    then
      # Switch the default alias to the new environment id
      "$rvm_scripts_path/alias" delete default &> /dev/null
      "$rvm_scripts_path/alias" create default "$environment_id" >& /dev/null
    fi
    rvm_default_flag=0
    if
      [[ -n "${rvm_ruby_alias:-}" ]]
    then
      rvm_log "Attempting to alias $environment_id to $rvm_ruby_alias"
      "$rvm_scripts_path/alias" delete "$rvm_ruby_alias" > /dev/null 2>&1
      rvm_alias_expanded=1 "$rvm_scripts_path/alias" create "$rvm_ruby_alias" "$environment_id" > /dev/null 2>&1
      ruby_alias="" ; rvm_ruby_alias=""
    fi
  else
    if
      (( ${rvm_default_flag:=0} == 1 ))
    then
      builtin command -v __rvm_reset >> /dev/null 2>&1 || source "$rvm_scripts_path/functions/reset"
      __rvm_reset
    fi
  fi
  rvm_hook="after_use"
  source "$rvm_scripts_path/hook"
  return 0
}

__rvm_ruby_string_installed()
{
  \typeset __ruby_inst_dir="$rvm_rubies_path/${rvm_ruby_string}"
  if [[ -n "${rvm_ruby_name:-}" && ! "${rvm_ruby_string}" == *"-${rvm_ruby_name}" ]]
  then __ruby_inst_dir="${__ruby_inst_dir}-${rvm_ruby_name}"
  fi
  [[ -n "$rvm_ruby_interpreter" && -n "${rvm_ruby_string}" &&
    -d "${__ruby_inst_dir}"
  ]] &&
  [[ -z "${rvm_gemset_name}" || ${rvm_create_flag:-0} -eq 1 ||
    -d "${__ruby_inst_dir}${rvm_gemset_separator}${rvm_gemset_name}"
  ]]
}

__rvm_ruby_string_remotely_available()
{
  (( ${rvm_remote_flag:-0} == 1 )) &&
  [[ -n "$rvm_ruby_interpreter" && -n "${rvm_ruby_string}" ]] &&
  __rvm_remote_server_path "${rvm_ruby_string}" >/dev/null
}

__rvm_ruby_string()
{
  # rvm_ruby_string may designate any of the following items:
  # * rvm_gemset_name
  # * rvm_ruby_interpreter
  # * rvm_ruby_version
  # * rvm_ruby_patch_level
  # * rvm_ruby_revision
  # * rvm_ruby_tag

  true ${rvm_head_flag:=0} ${rvm_delete_flag:=0}
  rvm_expanding_aliases=''
  true \
    "${rvm_ruby_version:=}" "${rvm_gemset_name:=}" "${rvm_ruby_interpreter:=}"\
    "${rvm_ruby_version:=}" "${rvm_ruby_tag:=}" "${rvm_ruby_patch_level:=}"\
    "${rvm_ruby_revision:=}" ${rvm_gemset_separator:="@"} "${rvm_ruby_string:=}"\
    ${rvm_expanding_aliases:=0} ${rvm_head_flag:=0}

  if
    [[ "$rvm_ruby_string" == *"${rvm_gemset_separator}"* ]]
  then
    rvm_gemset_name="${rvm_ruby_string/*${rvm_gemset_separator}/}"
    rvm_ruby_string="${rvm_ruby_string/${rvm_gemset_separator}*/}"
  fi
  # known ruby aliases
  if
    (( rvm_expanding_aliases == 0 )) &&
    [[ -n "${rvm_ruby_string}" && "$rvm_ruby_string" != "system" ]]
  then
    if
      [[ -f "$rvm_path/config/known_aliases" && -s "$rvm_path/config/known_aliases" ]] &&
      expanded_alias_name="$(__rvm_db_ "$rvm_path/config/known_aliases" "$rvm_ruby_string")" &&
      [[ -n "$expanded_alias_name" ]]
    then
      rvm_ruby_string="$expanded_alias_name"
    fi
  fi
  # Alias'd rubies
  if
    (( rvm_expanding_aliases == 0 )) &&
    [[ -n "${rvm_ruby_string}" && "$rvm_ruby_string" != "system" ]]
  then
    if
      [[ -f "$rvm_path/config/alias" && -s "$rvm_path/config/alias" ]] &&
      expanded_alias_name="$(__rvm_db_ "$rvm_path/config/alias" "$rvm_ruby_string")" &&
      [[ -n "$expanded_alias_name" ]]
    then
      rvm_ruby_string="$expanded_alias_name"
    elif
      [[ "$rvm_ruby_string" == default ]]
    then
      # Default is not a known value. Instead, we need to therefore set it to system.
      rvm_ruby_string="system"
    fi
    if
      [[ "$rvm_ruby_string" == *"${rvm_gemset_separator}"* ]]
    then
      rvm_gemset_name="${rvm_ruby_string/*${rvm_gemset_separator}/}"
      rvm_ruby_string="${rvm_ruby_string/${rvm_gemset_separator}*/}"
    fi
  fi
  if
    [[ -n "$gemset_name" ]]
  then
    rvm_gemset_name="$gemset_name"
    rvm_sticky_flag=1 # <- not sold on this.
  fi

  __rvm_ruby_string_parse || return $?
  __rvm_ruby_string_find

  # record the name for validation of -n option
  detected_rvm_ruby_name="${rvm_ruby_name:-}"
  # clean the name so it is not added again (rbx -n install problem)
  rvm_ruby_name=""
  true
}

__rvm_ruby_string_find()
{
  if
    __rvm_ruby_string_installed
  then
    true  # use the selected/detected rvm_ruby_string
  elif
    __rvm_ruby_string_remotely_available
  then
    true # use the selected/detected rvm_ruby_string
  else
    __rvm_ruby_string_autodetect
    case "${rvm_ruby_string}" in
      (ruby-+([1-9])|ruby-+([1-9]).+([0-9])|ruby-1.+([1-9]).+([0-9])|jruby-[19]*)
        __rvm_ruby_string_latest &&
        __rvm_ruby_string_parse_ ||
        return $?
        ;;
    esac
  fi
  if [[ -n "${rvm_ruby_name:-}" && ! "${rvm_ruby_string}" == *"-${rvm_ruby_name}" ]]
  then rvm_ruby_string="${rvm_ruby_string}${rvm_ruby_name:+-}${rvm_ruby_name:-}"
  fi
}

__rvm_ruby_string_autodetect()
{
  if
    [[ -z "${rvm_ruby_version:-}" &&
      "${rvm_ruby_interpreter}" != "ext" &&
      "${rvm_ruby_interpreter}" != "system"
    ]] &&
    (( ${rvm_head_flag:=0} == 0 ))
  then
    if
      (( ${rvm_fuzzy_flag:-0} == 1 ))
    then
      rvm_ruby_version="$(
        __rvm_list_strings |
        __rvm_grep "^${rvm_ruby_interpreter}-.*${rvm_ruby_name:-}" |
        __rvm_awk -F- '{print $2}' |
        __rvm_version_sort |
        __rvm_tail -n 1
      )"
    fi
    rvm_ruby_version="${rvm_ruby_version:-"$(
      __rvm_db "${rvm_ruby_interpreter}_version"
    )"}"
  fi
  if
    (( ${rvm_head_flag:=0} )) &&
    [[ "${rvm_ruby_interpreter}" == "ruby" ]] &&
    __rvm_version_compare "${rvm_ruby_version}" -ge 2.1
  then
    __rvm_take_n rvm_ruby_version 2 .
  fi
  rvm_ruby_string="${rvm_ruby_interpreter}${rvm_ruby_version:+-}${rvm_ruby_version:-}"
  if
    [[ "${rvm_ruby_interpreter}" == "ext" ]]
  then
    true # skip checking for external rubies
  elif
    [[ "${rvm_head_flag:=0}" == "1" || -n "${rvm_ruby_sha:-}" || -n "${rvm_ruby_tag:-}"  || -n "${rvm_ruby_repo_tag:-}" ]]
  then
    if [[ "${rvm_head_flag:=0}" == "1" ]]
    then rvm_ruby_string="${rvm_ruby_string}-head"
    fi
    if [[ -n "${rvm_ruby_sha:-}" ]]
    then rvm_ruby_string="${rvm_ruby_string}-s${rvm_ruby_sha}"
    elif [[ -n "${rvm_ruby_repo_tag:-}" ]]
    then rvm_ruby_string="${rvm_ruby_string}-tag${rvm_ruby_repo_tag}"
    elif [[ -n "${rvm_ruby_tag:-}" ]]
    then rvm_ruby_string="${rvm_ruby_string}-${rvm_ruby_tag}"
    fi
    if
      [[ ! -d "${rvm_rubies_path}/${rvm_ruby_string}" ]] &&
      (( ${rvm_fuzzy_flag:-0} == 1 ))
    then
      \typeset new_ruby_string
      new_ruby_string="$(
        __rvm_list_strings |
        __rvm_grep "^${rvm_ruby_string}.*${rvm_ruby_name:-}" |
        __rvm_version_sort |
        __rvm_tail -n 1
      )"
      rvm_ruby_string="${new_ruby_string:-$rvm_ruby_string}"
    fi
  elif
    [[ -n "${rvm_ruby_revision:-}" ]]
  then
    rvm_ruby_string="${rvm_ruby_string}-${rvm_ruby_revision}"
  elif
    [[ -n "${rvm_ruby_patch_level:-}" ]]
  then
    rvm_ruby_string="${rvm_ruby_string}-${rvm_ruby_patch_level}"
  elif
    [[ -n "${rvm_ruby_user_tag:-}" ]]
  then
    rvm_ruby_string="${rvm_ruby_string}-${rvm_ruby_user_tag}"
  else
    if
      (( ${rvm_fuzzy_flag:-0} == 1 )) &&
      [[ "${rvm_ruby_interpreter}" == "ruby" || "${rvm_ruby_interpreter}" == "ree" ]]
    then
      rvm_ruby_patch_level="$(
        __rvm_list_strings |
        __rvm_grep "^${rvm_ruby_interpreter}-${rvm_ruby_version}-.*${rvm_ruby_name:-}" |
        __rvm_awk -F- '{print $3}' |
        __rvm_version_sort |
        __rvm_tail -n 1
      )"
    fi
    [[ -n "${rvm_ruby_patch_level:-""}" ]] ||
      __rvm_db_system \
        "${rvm_ruby_interpreter}_${rvm_ruby_version}_patch_level" \
        rvm_ruby_patch_level
    if [[ -n "${rvm_ruby_patch_level:-""}" ]]
    then rvm_ruby_string="${rvm_ruby_string}-${rvm_ruby_patch_level}"
    fi
  fi
  true # OSX --trace FIX
}

__rvm_ruby_strings_exist()
{
  for rvm_ruby_string in ${@//,/ }
  do
    rvm_gemset_name=""
    rvm_verbose_flag=0 __rvm_use "${rvm_ruby_string}" >/dev/null 2>&1 || return $?
    true rvm_gemset_name:${rvm_gemset_name:=${rvm_expected_gemset_name}}
    printf "%b" "${rvm_ruby_string}${rvm_gemset_name:+@}${rvm_gemset_name:-}\n"
  done
  unset rvm_ruby_string
}
scripts/functions/notes/warnings/warning_rvm_in_usr000066400000000523147511530560017067 0ustar00#!/usr/bin/env bash

__rvm_notes_warning_rvm_in_usr()
{
  if
    [[ -x /usr/local/bin/rvm ]]
  then
    rvm_warn "
  * WARNING: you have <code>/usr/local/bin/rvm</code><warn>, it's most likely a bug of old installation, in most cases it's safe to remove it:

    <code>rm /usr/local/bin/rvm</code>
"
  fi
}

__rvm_notes_warning_rvm_in_usr
scripts/functions/notes/warnings/warning_loading_script000066400000001076147511530560017711 0ustar00#!/usr/bin/env bash

__rvm_notes_warning_loading_script()
{
  if
    [[ ${rvm_ignore_dotfiles_flag:-0} == 0 ]] &&
    [[ -f /etc/profile.d/rvm.sh ]] &&
    ! __rvm_grep rvm_stored_umask /etc/profile.d/rvm.sh >/dev/null
  then
    rvm_warn "  * WARNING: your RVM loading script <code>/etc/profile.d/rvm.sh</code> <warn>is deprecated\n" \
             "    and causes you to have <code>umask g+w</code> <warn>set in your shell.\n" \
             "    Run <code>rvm get master --auto-dotfiles</code> <warn>again to fix your scripts."
  fi
}

__rvm_notes_warning_loading_script
scripts/functions/notes/warnings/warning_apt_get_rvm000066400000001263147511530560017215 0ustar00#!/usr/bin/env bash

__rvm_notes_warning_apt_get_rvm()
{
  if [[ "$rvm_path" == "/usr/share/ruby-rvm" ]]
  then
    rvm_warn "
  * WARNING: You are using apt-get broken RVM, you should now:
    <code>
      sudo apt-get --purge remove ruby-rvm
      sudo \command \rm -rf /usr/share/ruby-rvm /etc/rvmrc /etc/profile.d/rvm.sh
    </code>
    <warn>open new terminal and validate environment is clean from old rvm settings:

      <code>env | __rvm_grep rvm</code>

    <warn>install RVM:

      <code>curl -L https://get.rvm.io | bash -s stable --autolibs=enable</code>

    <warn>for details check:

      https://stackoverflow.com/a/9056395/497756
"
  fi
}

__rvm_notes_warning_apt_get_rvm
scripts/functions/notes/warnings/warning_missing_devfd000066400000000543147511530560017527 0ustar00#!/usr/bin/env bash

__rvm_notes_warning_missing_devfd ()
{
  if
    [[ ! -e /dev/fd ]]
  then
    rvm_warn "
  * WARNING: you are missing <code>/dev/fd</code> <warn>it is important for shell scripting used by RVM,
    You can fix it on most linux systems with:

      <code>ln -sf /proc/self/fd /dev/fd</code>
"
  fi
}

__rvm_notes_warning_missing_devfd
scripts/functions/notes/warnings/warning_path_reset000066400000001664147511530560017051 0ustar00#!/usr/bin/env bash

__rvm_notes_warning_path_reset()
{
  \typeset -a __files

  __files=()

  for __file in ~/.zlogin ~/.zshrc ~/.bash_profile ~/.bashrc
  do
    if [[ -f "${__file}" ]]
    then __files+=( "${__file}" )
    fi
  done

  if
    [[ ${rvm_ignore_dotfiles_flag:-0} == 0 ]] &&
    (( ${#__files[@]} )) &&
    __rvm_grep -rn '^[^#]*PATH=' "${__files[@]}" |
      __rvm_grep -vE '[[:alnum:]_]PATH=|PATH=.*PATH'
  then
    # account for __rvm_grep not showing file name for just one file checked
    if (( ${#__files[*]} == 1 ))
    then __file="Your '${__files[*]}'"
    else __file="Above files"
    fi

    rvm_warn "
  * WARNING: ${__file} contains <code>PATH=</code> <warn>with no <code>\$PATH<code> <warn>inside, this can break RVM,
    for details check https://github.com/rvm/rvm/issues/1351#issuecomment-10939525
    to avoid this warning prepend <code>\$PATH<code>
"
  fi | \command \cat - >&2
}

__rvm_notes_warning_path_reset
scripts/functions/notes/warnings/warning_var000066400000000710147511530560015472 0ustar00#!/usr/bin/env bash

__rvm_notes_warning_var()
{
  for __var in RUBYOPT RUBYLIB
  do
    if eval "[[ -n \"\${${__var}:-}\" ]]"
    then
      rvm_warn "
  * WARNING: You have <code>${__var}</code> <warn>set in your current environment.
    This may cause rubies to not work as you expect them to as it is not supported
    by all of them If errors show up, please try unsetting <code>${__var}</code> <warn>first.
"
    fi
  done
}

__rvm_notes_warning_var
scripts/functions/notes/warnings/warning_profile000066400000001244147511530560016345 0ustar00#!/usr/bin/env bash

__rvm_notes_warning_profile()
{
  if
    [[ ${rvm_ignore_dotfiles_flag:-0} == 0 ]] &&
    [[ -f "$HOME/.profile" ]] && ! [[ "$rvm_path" == "/usr/local/rvm" || $UID == 0 ]]
  then
    for __var in "$HOME/.bash_profile" "$HOME/.bash_login"
    do
      if
        [[ -f "${__var}" ]]
      then
        __rvm_grep -E '(source|\.).+profile' "${__var}" >/dev/null 2>&1 ||
        {
          rvm_warn "
  * WARNING: <code>~/.profile</code> <warn>file found. To load it into your shell, add the following line to <code>${__var}</code><warn>:

      <code>source ~/.profile</code>
"
        }
        break
      fi
    done
  fi
}

__rvm_notes_warning_profile
scripts/functions/notes/warnings/warning_rvm_group000066400000001073147511530560016725 0ustar00#!/usr/bin/env bash

__rvm_notes_warning_rvm_group()
{
  if
    [[ "$rvm_path" == "/usr/local/rvm" ]] || (( UID == 0 ))
  then
    rvm_warn "  * Please do NOT forget to add your users to the <code>rvm</code> group.\n" \
             "    The installer no longer auto-adds root or users to the rvm group. Admins must do this.\n" \
             "    Also, please note that group memberships are ONLY evaluated at login time.\n" \
             "    This means that users must log out then back in before group membership takes effect!"
  fi
}

__rvm_notes_warning_rvm_group
scripts/functions/notes/warnings/warning_needs_cleanup000066400000002614147511530560017514 0ustar00#!/usr/bin/env bash

__rvm_notes_warning_needs_cleanup()
{
  \typeset __found __search_path_gems __search_path_rubies gemset_name __need_a_cleanup=0

  for __found in "$rvm_path"/environments/*  "$rvm_path"/wrappers/*
  do
    gemset_name="${__found##*/}"
    __search_path_gems="$rvm_path/gems/${gemset_name}"
    __search_path_rubies="$rvm_path/rubies/${gemset_name}"

    if
      [[ -e "$__found" &&
        "$gemset_name" != default &&
        ! -e "$__search_path_gems" &&
        ! -e "$__search_path_rubies"
      ]]
    then
      rvm_debug "    found: $__found missing gems: $__search_path_gems or rubies: $__search_path_rubies"

      __need_a_cleanup=1

      (( ${rvm_debug_flag:-0} == 1 )) || break
    fi
  done

  (( __need_a_cleanup )) ||
  for __found in "$rvm_path"/gems/*
  do
    gemset_name="${__found##*/}"
    gemset_name="${gemset_name%@*}"
    __search_path_rubies="$rvm_path/rubies/${gemset_name}"

    if
      [[ -e "$__found" &&
        "$gemset_name" != cache &&
        ! -e "$__search_path_rubies"
      ]]
    then
      rvm_debug "    found: $__found - missing rubies: $__search_path_rubies"

      __need_a_cleanup=1

      (( ${rvm_debug_flag:-0} == 1 )) || break
    fi
  done

  if
    (( __need_a_cleanup ))
  then
    rvm_warn "  * It looks like some old stuff is laying around RVM, you can cleanup with: <code>rvm cleanup all</code>\n"
  fi
}

__rvm_notes_warning_needs_cleanup
scripts/functions/notes/warnings/warning_gemrc000066400000001554147511530560016006 0ustar00#!/usr/bin/env bash

__rvm_notes_warning_gemrc()
{
  if
    [[ -z "${rvm_ignore_gemrc_issues:-}" ]]
  then
    \typeset _check _gemrc _found
    _found=0

    for _gemrc in "/etc/gemrc" "${HOME}/.gemrc"
    do
      if
        [[ -r "${_gemrc}" ]]
      then
        for _check in " -n" --user-install gemhome gempath
        do
          if
            __rvm_grep -E -- '^'"${_check}"'|^[^#]*'"${_check}" "${_gemrc}" >/dev/null
          then
            (( _found++ ))
            rvm_warn "  * WARNING: Found <code>${_check}</code> <warn>in <code>${_gemrc}</code><warn>, please remove it, as it will break rubygems in RVM."
          fi
        done
      fi
    done
    if
      (( _found ))
    then
      rvm_warn "    If it is intended or a mistake <code>export rvm_ignore_gemrc_issues=1</code> <warn>to avoid this warning.\n"
    fi
  fi
}

__rvm_notes_warning_gemrc
scripts/functions/notes/warnings/warning_rvm_configure_env000066400000000777147511530560020434 0ustar00#!/usr/bin/env bash

__rvm_notes_warning_rvm_configure_env()
{
  if
    [[ -f /etc/rvmrc && -s /etc/rvmrc ]] &&
    __rvm_grep 'rvm_configure_env=.*/opt/sm' /etc/rvmrc >/dev/null 2>&1
  then
    rvm_warn "  * WARNING: you have <code>rvm_configure_env</code> <warn>in <code>/etc/rvmrc</code><warn>, run the following to fix:<code>\n\n" \
             "      sudo sed -i'' -e \"/rvm_configure_env=.*\/opt\/sm/d\" /etc/rvmrc\n" \
             "      rvm autolibs smf"
  fi
}

__rvm_notes_warning_rvm_configure_env
scripts/functions/notes/warnings/warning_zsh000066400000003372147511530560015515 0ustar00#!/usr/bin/env bash

__rvm_get_user_shell()
{
  case "${_system_type}:${_system_name}" in
    (Linux:*|SunOS:*|BSD:*|*:Cygwin)
      \typeset __shell
      __shell="$( getent passwd $USER )" ||
        {
          rvm_error "Error checking user shell via getent ... something went wrong, report a bug."
          return 2
        }

      echo "${__shell##*:}"
      ;;
    (Darwin:*)
      \typeset __version

      __version="$(dscl localhost -read "/Search/Users/$USER" UserShell)" ||
        {
          rvm_error "Error checking user shell via dscl ... something went wrong, report a bug."
          return 3
        }

      echo ${__version#*: }
      ;;
    (*)
      rvm_error "Do not know how to check user shell on '$(command uname)'."
      return 1
      ;;
  esac
}

__rvm_zsh_version()
{
  \typeset __user_shell

  __user_shell="$(__rvm_get_user_shell)"

  if [[ -n "${__user_shell:-}" ]]
  then
    echo "$(${__user_shell} -c 'echo $ZSH_VERSION' 2>/dev/null)"
  fi
}

__rvm_notes_warning_zsh()
{
  \typeset __zsh_version="$(__rvm_zsh_version)"

  if
      [[ -n "${__zsh_version:-}" ]]
  then
    if
      __rvm_version_compare "${__zsh_version}" -ne 4.3.12 &&
      __rvm_version_compare "${__zsh_version}" -lt 5.0.0
    then
      rvm_warn "  * WARNING: ${__user_shell} version ${__zsh_version} detected - Zsh 4.3.12 / 5.0.0+ is recommended,\n" \
               "    with current one errors to be expected - bugs in shell code interpretation."
      fi
    else

    if
      __rvm_version_compare "${__zsh_version}" -eq 5.0.3
    then
      rvm_warn "  * WARNING: ${__user_shell} version 5.0.3 detected it is BROKEN, either downgrade or upgrade it,\n" \
               "    for details see https://github.com/rvm/rvm/pull/2431"
    fi
  fi
}

__rvm_notes_warning_zsh
scripts/functions/notes/warnings/warning_gem_home000066400000000610147511530560016461 0ustar00#!/usr/bin/env bash

__rvm_notes_warning_gem_home()
{
  if
    [[ -n "${GEM_HOME:-}" ]] && ! [[ "${GEM_HOME}" == "$rvm_path/"* ]]
  then
    rvm_warn "  * WARNING: you have set <code>GEM_HOME=\"${GEM_HOME}\"</code>\n" \
             "    <warn>This is conflicting with RVM. Make sure to call:\n\n" \
             "          <code>unset GEM_HOME</code>\n"
  fi
}

__rvm_notes_warning_gem_home
scripts/functions/notes/opencollective000066400000000432147511530560014341 0ustar00#!/usr/bin/env bash

__rvm_notes_opencollective()
{
  rvm_notify "<warn>Thanks for installing RVM 🙏</warn>
Please consider donating to our open collective to help us maintain RVM.

👉  Donate: <code>https://opencollective.com/rvm/donate</code>

"
}

__rvm_notes_opencollective
scripts/functions/cleanup000066400000003664147511530560011637 0ustar00#!/usr/bin/env bash

# wrapper for smaller output from __rvm_log_command
__rvm_rm_rf()
{
  __rvm_rm_rf_verbose "$@"
}
#
# \command \rm -rf with *some* safeguards in place.
#
__rvm_rm_rf_verbose()
{
  \typeset target
  target="${1%%+(/|.)}"

  #NOTE: RVM Requires extended globbing shell feature turned on.
  if
    [[ -n "${ZSH_VERSION:-}" ]]
  then
    \builtin setopt extendedglob
  elif
    [[ -n "${BASH_VERSION:-}" ]]
  then
    \builtin shopt -s extglob
  else
    rvm_error "What the heck kind of shell are you running here???"
  fi
  case "${target}" in
    (*(/|.)@(|/Applications|/Developer|/Guides|/Information|/Library|/Network|/System|/User|/Users|/Volumes|/backups|/bdsm|/bin|/boot|/cores|/data|/dev|/etc|/home|/lib|/lib64|/mach_kernel|/media|/misc|/mnt|/net|/opt|/private|/proc|/root|/sbin|/selinux|/srv|/sys|/tmp|/usr|/var))
      rvm_debug "__rvm_rm_rf target is not valid - can not remove"
      return 1
      ;;
    (*)
      if
        [[ -z "${target}" ]]
      then
        rvm_debug "__rvm_rm_rf target not given"
        return 1
      elif
        [[ -d "${target}" ]]  # directory
      then
        \command \rm -rf "${target}" ||
        {
          \typeset ret=$?
          rvm_debug "__rvm_rm_rf error removing target dir '${target}'."
          return $ret
        }
      elif
        [[ -f "${target}" || -L "${target}" ]] # file / broken symbolic link
      then
        \command \rm -f "${target}" ||
        {
          \typeset ret=$?
          rvm_debug "__rvm_rm_rf error removing target file/link '${target}'."
          return $ret
        }
      else
        rvm_debug "__rvm_rm_rf already gone: $*"
      fi
      ;;
  esac
  true # for OSX
}

# Cleans up temp folders for a given prefix ($1),
# or the current process id.
__rvm_cleanup_tmp()
{
  if
    [[ -d "${rvm_tmp_path}/" ]]
  then
    case "${rvm_tmp_path%\/}" in
      *tmp)
        __rvm_rm_rf "${rvm_tmp_path}/${1:-$$}*"
        ;;
    esac
  fi
  true # for osx
}
scripts/functions/manage/opal000066400000003121147511530560012357 0ustar00#!/usr/bin/env bash

opal_install()
{
  rvm_log "Running Opal prereqs checking script."

  __rvm_which node > /dev/null &&
  __rvm_which npm  > /dev/null ||
  {
    result=$?
    rvm_error "Prerequisite checks have failed - can not find 'node' and/or 'npm' commands.
Halting the installation."
    return $result
  }

  __rvm_log_command "prepare_directories" \
    "Preparing directories for opal" \
    opal_install_prepare_directories

  __rvm_cd "${rvm_ruby_home}"

  system="${_system_type}"
  arch="$(file "$( __rvm_which node)" )"
  arch="$(echo "${arch##* }" )"

  if
    node_binary="$(
      __rvm_which opal-node 2>/dev/null ||
      npm explore opal -- which bin/opal-node 2>/dev/null
    )"
  then
    rvm_log "Found opal-node at $node_binary"
  else
    __rvm_log_command "npm.install.opal" \
      "Installing opal-node globally" \
      npm install -g opal ||
      return $result

    node_binary="$(
      npm explore opal -- which bin/opal-node 2>/dev/null
    )"
  fi

  __rvm_log_command "install" \
    "Installing opal to $rvm_ruby_home" \
    opal_install_files
}

opal_install_prepare_directories()
{
  __rvm_rm_rf "$rvm_ruby_home" &&
  \command \mkdir -vp "${rvm_ruby_home}/bin/" &&
  \command \mkdir -vp "$rvm_ruby_gem_home/bin" &&
  \command \mkdir -vp "$rvm_ruby_global_gems_path/bin" ||
  return $?
}

opal_install_files()
{
  __rvm_cd "$rvm_ruby_home/bin/"

  ln -fs "$node_binary" "ruby"

  cat <<-FAKE_GEM > gem
#!/usr/bin/env bash

echo "OPAL FAKE GEM COMMAND: $@"
exit 127
FAKE_GEM

  chmod +x ruby gem

  cat <<-FAKE_CONFIG > "$rvm_ruby_home/config"
target_cpu=$arch
FAKE_CONFIG
}
scripts/functions/manage/ironruby000066400000010262147511530560013301 0ustar00#!/usr/bin/env bash

ironruby_install()
{
  rvm_error "WARNING! IronRuby is not anywhere around usable (with or without RVM),
there are multiple issues with it, here is an effort to improve/fix it:
    https://github.com/rvm/rvm/pull/1543"

  builtin command -v mono > /dev/null ||
  {
    printf "%b" "mono must be installed and in your path in order to install IronRuby."
    return 1
  }
  if
    (( ${rvm_head_flag:=0} == 1 ))
  then
    mono_version="$(mono -V | \command \head -n 1 | __rvm_grep -oE '[0-9]+\.[0-9]+\.[0-9]+' | \command \head -n 1 )"
    if
      [[ -n "${mono_version:-}" ]]
    then
      mono_major_ver="$(echo "$mono_version" | cut -d '.' -f1)"
      mono_minor_ver="$(echo "$mono_version" | cut -d '.' -f2)"
      if
        [[ $mono_major_ver -lt 2 ]] ||
        [[ $mono_major_ver -eq 2 && $mono_minor_ver -lt 6 ]]
      then
        printf "%b" "Mono 2.6 (or greater) must be installed and in your path in order to build IronRuby from the repository."
        printf "%b" "Version detected: ${mono_version}"
        return 1
      fi
    else
      printf "%b" "Cannot recognize mono version."
      return 1
    fi

    __rvm_ensure_has_mri_ruby

    __rvm_fetch_ruby || return $?

    __rvm_cd "${rvm_src_path}/$rvm_ruby_string"

    compatible_ruby="$(__rvm_mri_ruby)"

    "$rvm_wrappers_path/$compatible_ruby/gem" install pathname2 --no-rdoc --no-ri

    # MONO_LIB=/Library/Frameworks/Mono.framework/Versions/current/lib/
    rvm_ruby_make=( $rvm_wrappers_path/$compatible_ruby/rake MERLIN_ROOT="${rvm_src_path}/$rvm_ruby_string/Merlin/Main" compile mono=1 configuration=release --trace )

    __rvm_log_command rake "Building IronRuby..." "${rvm_ruby_make[@]}" || return $?

    __rvm_rm_rf "$rvm_ruby_home"/*

    mkdir -p "$rvm_ruby_home/bin" "$rvm_ruby_home/lib" "$rvm_ruby_home/Lib/ruby" "$rvm_ruby_home/Lib/IronRuby"

    __rvm_cp -r "${rvm_src_path}/$rvm_ruby_string/Merlin/Main/Bin/mono_release"/* "$rvm_ruby_home/bin/"
    __rvm_cp -r "${rvm_src_path}/$rvm_ruby_string/Merlin/Main/Languages/Ruby/Scripts/bin"/* "$rvm_ruby_home/bin/"
    __rvm_cp -r "${rvm_src_path}/$rvm_ruby_string/Merlin/External.LCA_RESTRICTED/Languages/Ruby/redist-libs/ruby"/* "$rvm_ruby_home/lib/ruby"
    __rvm_cp -r "${rvm_src_path}/$rvm_ruby_string/Merlin/Main/Languages/Ruby/Libs"/* "$rvm_ruby_home/lib/IronRuby"
  else
    rvm_log "Retrieving IronRuby"

    "$rvm_scripts_path/fetch" "$rvm_ruby_url" "$rvm_ruby_package_file" ||
    {
      result=$?
      rvm_error "There has been an error while trying to fetch the source. \nHalting the installation."
      exit $result
    }

    mkdir -p "${rvm_src_path}/$rvm_ruby_string" "$rvm_ruby_home"

    __rvm_log_command "extract" "$rvm_ruby_string - #extracting $rvm_ruby_package_file to ${rvm_src_path}/$rvm_ruby_string" \
      __rvm_package_extract "${rvm_archives_path}/${rvm_ruby_package_file}" "${rvm_src_path}/$rvm_ruby_string" ||
    case $? in
      199)
        rvm_error "\nUnrecognized archive format '$archive_format'"
        return 199
        ;;
      *)
        rvm_error "There has been an error while trying to extract the source. Halting the installation."
        return 1
        ;;
    esac

    for dir in bin Lib Silverlight
    do
      __rvm_cp -Rf "${rvm_src_path}/$rvm_ruby_string/$dir" "$rvm_ruby_home/$dir"
    done
  fi

  binaries=(gem irb rdoc rake ri ruby)

  for binary_name in "${binaries[@]}"
  do
    if
      [[ -s "$rvm_ruby_home/bin/$binary_name" ]]
    then
      \command \tr -d '\r' < "$rvm_ruby_home/bin/$binary_name" > "$rvm_ruby_home/bin/$binary_name.new" &&
      \command \mv -f "$rvm_ruby_home/bin/$binary_name.new" "$rvm_ruby_home/bin/$binary_name"
      chmod +x "$rvm_ruby_home/bin/$binary_name"
    fi
  done
  unset binaries

  if
    [[ -f "$rvm_ruby_home/bin/ir" ]]
  then
    __rvm_sed -e '1,1s=.*=#!'"/usr/bin/env bash=" "$rvm_ruby_home/bin/ir" | \command \tr -d '\r' > "$rvm_ruby_home/bin/ir.new" &&
    \command \mv -f "$rvm_ruby_home/bin/ir.new" "$rvm_ruby_home/bin/ir"
  else
    echo "mono \"$rvm_ruby_home/bin/ir\" \"\$@\"" > "$rvm_ruby_home/bin/ir"
  fi

  chmod +x "$rvm_ruby_home/bin/ir"

  ln -fs "$rvm_ruby_home/bin/ir" "$rvm_ruby_home/bin/ruby"

  __rvm_initial_gemsets_create "$rvm_ruby_home/bin/ruby"
  __rvm_fetch_ruby_cleanup
}
scripts/functions/manage/ruby000066400000011111147511530560012403 0ustar00#!/usr/bin/env bash

ruby_install_baseruby_check()
{
  __rvm_ensure_has_mri_ruby || return $?
  \typeset compatible_baseruby
  if
    compatible_baseruby="$rvm_wrappers_path/$(__rvm_mri_ruby)/ruby" &&
    [[ -x "$compatible_baseruby" ]]
  then
    rvm_configure_flags+=( --with-baseruby="$compatible_baseruby" )
  else
    return $?
  fi
}

ruby_install()
{
  \typeset result temp_flags _iterator

  case ${rvm_ruby_string:-""} in
    ruby-1.8.*-head)
      __rvm_ensure_has_mri_ruby "ree-|ruby-1.8.|ruby-1.8.7-p|ruby-1.8.7-p374" || return $?
      ;;
    ruby-1.8.*)
      if (( ${rvm_head_flag:-0} == 1 ))
      then __rvm_ensure_has_mri_ruby "ree-|ruby-1.8.|ruby-1.8.7-p|ruby-1.8.7-p374" || return $?
      fi
      ;;
    ruby*-head)
      ruby_install_baseruby_check || return $?
      ;;
    ruby*)
      if (( ${rvm_head_flag:-0} == 1 ))
      then ruby_install_baseruby_check || return $?
      fi
      ;;
  esac

  # TODO: needed on some 1.9.3, confirm with http://bugs.ruby-lang.org/issues/6903
  if
    [[ " ${rvm_configure_flags[*]}" == *" --enable-load-relative"* ]]
  then
    case ${rvm_ruby_string} in
      ruby-1.9.3-p125|ruby-1.9.3-p286|ruby-1.9.3-p327|ruby-1.9.3-p362|ruby-1.9.3-p374|ruby-1.9.3-p385)
        rvm_patch_names+=( ruby-multilib )
        ;;
    esac
  fi

  (
    __rvm_setup_compile_environment "${rvm_ruby_string}" &&
    __rvm_install_source $* &&
    ruby_install_warn_clang
  ) || return $?

  ruby_install_warnings
}

ruby_install_warn_clang()
{
  if
    ! __ruby_clang_ok ${rvm_ruby_string} &&
    [[ -n "${initially_selected_compiler:-}" ]] &&
    __rvm_compiler_is_llvm "${initially_selected_compiler:-}"
  then
    rvm_warn "Ruby '${rvm_ruby_string}' was built using clang - but it's not (fully) supported, expect errors."
  fi
}

ruby_install_warnings()
{
  \typeset patches_count
  patches_count=$(
    rvm_ruby_string="${rvm_ruby_string}" lookup_patchset default | wc -l
  )

  \typeset _default _version _patch _memo _unmaintained_ruby _unmaintained_date
  _unmaintained_ruby=$(__rvm_db "ruby_unmaintained_version")
  _default=$(__rvm_db "default_ruby")
  _version=$(__rvm_db "${_default}_version")
  _patch=$(__rvm_db "${_default}_${_version}_patch_level")
  _version="${_default}-${_version}${_patch:+-}${_patch:-}"
  _memo="Please consider upgrading to ${_version} which will have all of the latest security patches."
  if
    (( ${rvm_head_flag:-0} == 0 )) &&
    [[ "$rvm_ruby_version" != "head" ]] &&
    __rvm_version_compare "$rvm_ruby_version" -le "${_unmaintained_ruby}"
  then
    _unmaintained_date=$(__rvm_db "ruby_unmaintained_date")
    if
      __rvm_version_compare "$rvm_ruby_version" -eq "${_unmaintained_ruby}" &&
      __rvm_version_compare "$(date +%F)" -lt "${_unmaintained_date}"
    then
      rvm_error "WARNING: Please be aware that you just installed a ruby that will finish normal maintenance on ${_unmaintained_date}, for a list of maintained rubies visit:

    http://bugs.ruby-lang.org/projects/ruby/wiki/ReleaseEngineering

${_memo}"
    else
      rvm_error "WARNING: Please be aware that you just installed a ruby that is no longer maintained (${_unmaintained_date}), for a list of maintained rubies visit:

    http://bugs.ruby-lang.org/projects/ruby/wiki/ReleaseEngineering

${_memo}"
    fi
  elif
    [[ "${rvm_ruby_string}" != *"${_version}"* ]] && (( patches_count > 0 ))
  then
    rvm_warn "Please be aware that you just installed a ruby that requires ${patches_count} patches just to be compiled on an up to date linux system.
This may have known and unaccounted for security vulnerabilities.
${_memo}"
  fi
  if (( ${rvm_docs_flag:-0} == 1 ))
  then rvm_log "Ruby was built with documentation, to read it try: ri String"
  else rvm_log "Ruby was built without documentation, to build it run: rvm docs generate-ri"
  fi
}

__rvm_post_configure_ruby()
{
  __rvm_post_configure_ruby_fix_athlon_sse2
  __rvm_post_configure_ruby_update_setup
}

__rvm_post_configure_ruby_fix_athlon_sse2()
{
  if
    [[ -f /proc/cpuinfo && -f Makefile ]] &&
    __rvm_grep "^XCFLAGS = .*-msse2" Makefile >/dev/null &&
    ! __rvm_grep "^flags.*sse2" /proc/cpuinfo
  then
    __rvm_sed_i Makefile -e '/^XCFLAGS =/s/-msse2//'
  fi
}

__rvm_post_configure_ruby_update_setup()
{
  \typeset option
  if
    (( ${rvm_static_flag:-0} == 1 )) && (( ${rvm_dynamic_extensions_flag:-0} == 0 ))
  then
    for option in 'option nodynamic' openssl psych zlib readline
    do
      __rvm_update_ext_setup ${option}
    done
  fi
}

__rvm_update_ext_setup()
{
  echo "extension setup: $1"
  if
    __rvm_grep "$1" ext/Setup >/dev/null
  then
    __rvm_sed_i ext/Setup -e "s/#$1/$1/"
  else
    echo "$1" >> ext/Setup
  fi
}
scripts/functions/manage/install/osx000066400000000565147511530560013714 0ustar00#!/usr/bin/env bash

__rvm_make_failed_osx()
{
  __rvm_make_failed_osx_avira
}

__rvm_make_failed_osx_avira()
{
  if ps ax | __rvm_grep -v grep | __rvm_grep Avira.app &> /dev/null
  then
    rvm_error "\nIt seems that Avira antivirus is running. It has been reported to cause failures on ruby compilation.
Disable it for the time of the installation and try again."
  fi
}
scripts/functions/manage/ree000077500000010331147511530560012203 0ustar00#!/usr/bin/env bash


ree_transform_configure_flags()
{
  \typeset flag
  \typeset -a new_flags
  new_flags=()
  for flag in "${rvm_configure_flags[@]}"
  do
    new_flags+=( -c "${flag}" )
  done
  rvm_configure_flags=( "${new_flags[@]}" )
}

ree_install()
{
  if
    [[ -n "$(echo "$rvm_ruby_version" | __rvm_awk '/^1\.8/{print}')" ]] && (( rvm_head_flag == 0 ))
  then
    ruby="ree-|ruby-1.8.|ruby-1.8.7-p|ruby-1.8.7-p374"
    __rvm_ensure_has_mri_ruby "$ruby" &&
    ruby="$(__rvm_mri_ruby "$ruby")"  ||
    return $?

    rvm_log "Installing Ruby Enterprise Edition from source to: $rvm_ruby_home"

    __rvm_cd "${rvm_src_path}"

    if
      [[ -d "${rvm_src_path}/$rvm_ruby_string" ]] &&
      [[ -x "${rvm_src_path}/$rvm_ruby_string/installer" ]]
    then
      rvm_log "It appears that the archive has already been extracted. Skipping extract (use reinstall to do fresh installation)."
    else
      rvm_log "$rvm_ruby_string - #fetching ($rvm_ruby_package_file)"
      if
        "$rvm_scripts_path/fetch" "$rvm_ruby_url"
      then
        true
      else
        result=$?
        rvm_error "There has been an error while trying to fetch the source. \nHalting the installation."
        return $result
      fi

      __rvm_log_command "extract" "$rvm_ruby_string - #extracting $rvm_ruby_package_file to ${rvm_src_path}/$rvm_ruby_string" \
        __rvm_package_extract "${rvm_archives_path}/$rvm_ruby_package_file.$rvm_archive_extension" "${rvm_src_path}/" ||
      case $? in
        199)
          rvm_error "\nUnrecognized archive format '$archive_format'"
          return 199
          ;;
        *)
          rvm_error "There has been an error while trying to extract the source. Halting the installation."
          return 1
          ;;
      esac

      __rvm_rm_rf "${rvm_src_path}/$rvm_ruby_string"
      \command \mv "${rvm_src_path}/$rvm_ruby_package_file" "${rvm_src_path}/$rvm_ruby_string"
    fi

    __rvm_cd "${rvm_src_path}/$rvm_ruby_string"

    __rvm_setup_compile_environment "${rvm_ruby_string}"

    #TODO: wait, what? Investigate line smell.
    mkdir -p "${rvm_ruby_home}/lib/ruby/gems/1.8/gems"

    ree_transform_configure_flags

    #TODO: are there any other versions then 1.8.6 || 1.8.7
    if
      [[ "Darwin" == "${_system_type}" ]] &&
      [[ "1.8.6" == "$rvm_ruby_version" || "1.8.7" == "$rvm_ruby_version" ]] &&
      [[ " ${rvm_ree_options[*]} " != *" --no-tcmalloc "* ]]
    then
      rvm_ree_options+=( --no-tcmalloc )
    fi

    __rvm_db "${rvm_ruby_interpreter}_configure_flags" "db_configure_flags"
    if [[ -n "${ZSH_VERSION:-}" ]]
    then rvm_configure_flags=( ${=db_configure_flags} "${rvm_configure_flags[@]}" )
    else rvm_configure_flags=( ${db_configure_flags}  "${rvm_configure_flags[@]}" )
    fi

    __rvm_apply_patches "${rvm_src_path}/$rvm_ruby_string/source"
    result=$?

    if (( result == 0 )) && [[ "${_system_arch}" == "x86_64" ]]
    then
      __rvm_apply_patches "${rvm_src_path}/$rvm_ruby_string" lib64
      result=$?
    fi
    __rvm_apply_patches "${rvm_src_path}/$rvm_ruby_string" ruby-binary-shebang

    if (( result > 0 ))
    then
      rvm_error "There has been an error while trying to apply patches to ree. \nHalting the installation."
      return $result
    fi

    __rvm_log_command "install" "$rvm_ruby_string - #installing" \
      __rvm_with "$ruby" env \
      "${rvm_configure_env[@]}" ./installer -a "$rvm_rubies_path/$rvm_ruby_string" "${rvm_ree_options[@]}" "${rvm_configure_flags[@]}" ||
      return $?

    [[ -x "$rvm_rubies_path/$rvm_ruby_string"/bin/ruby ]] ||
    {
      rvm_error "There has been an error while trying to run the ree installer - bin/ruby was not created,
check the log file: $( __rvm_ls -1t "${rvm_log_path}/${rvm_ruby_string:-}"/*_install.log | __rvm_tail -n 1 )"
      return 11
    }

    __rvm_initial_gemsets_create "$rvm_ruby_home/bin/ruby" &&
    __rvm_post_install
  else

    __rvm_db "${rvm_ruby_interpreter}_${rvm_ruby_version}_repo_url" "rvm_ruby_url"

    if [[ -z "$rvm_ruby_url" ]] ; then
      rvm_error "rvm does not know the rvm repo url for '${rvm_ruby_interpreter}_${rvm_ruby_version}'"
      result=1

    else
      rvm_ruby_repo_url="$rvm_ruby_url"
      __rvm_setup_compile_environment "${rvm_ruby_string}"
      __rvm_install_source $*
    fi
  fi
}
scripts/functions/manage/macruby000066400000012337147511530560013077 0ustar00#!/usr/bin/env bash

macruby_install_extract_pkg()
(
  set -x
  \typeset __source __target __temp1 __temp1_org __temp2 __result
  __source="$1"
  __target="$2"
  __temp1="$( TMPDIR="${rvm_tmp_path}" mktemp -d -t rvm-tmp1.XXXXXXXXX )"
  __temp2="$( TMPDIR="${rvm_tmp_path}" mktemp -d -t rvm-tmp2.XXXXXXXXX )"
  [[ -n "${__temp1}" && -d "${__temp1}" && -n "${__temp2}" && -d "${__temp2}" ]] || return $?
  __result=0
  __temp1_org="${__temp1}"
  __temp1+="/${rvm_ruby_package_name}" # required for the next command to run at all
  pkgutil --expand "${__source}" "${__temp1}" || __result=$?
  __temp1="$( __rvm_find "${__temp1}" -name Payload -type f )"
  [[ -n "${__temp1}" ]] &&
  tar xzf "${__temp1}" -C "${__temp2}" &&
  mkdir -p "${__target}/" &&
  mv -f "${__temp2}/Library/Frameworks/MacRuby.framework/Versions/Current"/* "${__target}/" ||
  __result=$?
  rm -rf "${__temp1}" "${__temp1_org}" "${__temp2}" || true
  return ${__result}
)

macruby_install_extract_zip()
{
  mkdir -p ${rvm_src_path}/$rvm_ruby_string &&
  unzip -o -j "${rvm_archives_path}/$rvm_ruby_package_file" \
    "MacRuby ${rvm_ruby_version}/MacRuby ${rvm_ruby_version}.pkg" \
    -d "${rvm_src_path}/$rvm_ruby_string"  &&
  \command \mv "${rvm_src_path}/$rvm_ruby_string/MacRuby ${rvm_ruby_version}.pkg" \
    "${rvm_src_path}/$rvm_ruby_string/$rvm_ruby_string.pkg" &&
  macruby_install_extract_pkg "${rvm_src_path}/$rvm_ruby_string/$rvm_ruby_string.pkg" "$rvm_ruby_home" ||
  return $?
}

macruby_install_wrapper()
{
  \command \cat <<RubyWrapper
#!/usr/bin/env bash

export DYLD_LIBRARY_PATH="$rvm_ruby_home/usr/lib\${DYLD_LIBRARY_PATH:+:}\${DYLD_LIBRARY_PATH:-}"
export RUBYOPT="\${RUBYOPT:-} $extra_rubyopt"
export GEM_HOME="\${GEM_HOME:-$rvm_ruby_gem_home}"
export GEM_PATH="\${GEM_PATH:-$rvm_ruby_gem_path}"
export MY_RUBY_HOME="$rvm_ruby_home"
export PATH="$rvm_ruby_gem_home/bin:$rvm_ruby_global_gems_path/bin:$rvm_ruby_home/bin:\$PATH"

exec "$rvm_ruby_home/usr/bin/mac$1" "\$@"
RubyWrapper
}

macruby_install_wrap_binaries_detect_rubyopt()
{
  \typeset __path
  extra_rubyopt=""
  for __path in $(
    DYLD_LIBRARY_PATH="$rvm_ruby_home/usr/lib" "$rvm_ruby_home/usr/bin/macruby" -e 'puts $LOAD_PATH'
  )
  do
    [[ "${__path}" == "." ]] ||
    extra_rubyopt+="-I$rvm_ruby_home/usr${__path#*/usr} "
  done
}

macruby_install_fix_shebang()
{
  case "$1" in
    (ruby) return 0 ;; # it's a binary, no fixing needed
  esac
  {
    echo "#!$rvm_ruby_home/usr/bin/macruby"
    __rvm_tail -n +2 "$rvm_ruby_home/usr/bin/mac$1"
  } > "$rvm_ruby_home/usr/bin/mac$1.new"
  mv -f "$rvm_ruby_home/usr/bin/mac$1.new" "$rvm_ruby_home/usr/bin/mac$1"
  chmod +x "$rvm_ruby_home/usr/bin/mac$1"
}

macruby_install_wrap_binary()
{
  binary_name="${binary_name#$rvm_ruby_home/usr/bin/mac}"
  file_name="$rvm_ruby_home/bin/$binary_name"

  if [[ -f "$file_name" ]]
  then \command \rm -f "$file_name"
  fi

  macruby_install_fix_shebang "$binary_name"
  macruby_install_wrapper "$binary_name" > "$file_name"

  [[ -x "$file_name" ]] || chmod +x $file_name
}

macruby_install_wrap_binaries()
{
  mkdir -p "$rvm_ruby_home/bin/" ||
  {
    rvm_error "Can not create binaries directory => $rvm_ruby_home/bin/"
    return 1
  }
  \typeset binary_name extra_rubyopt
  macruby_install_wrap_binaries_detect_rubyopt

  for binary_name in "$rvm_ruby_home/usr/bin"/mac*
  do
    macruby_install_wrap_binary
  done
}

macruby_install()
{
  [[ "Darwin" == "${_system_type}" ]] ||
  {
    rvm_error "MacRuby can only be installed on a Darwin OS."
    exit 1
  }

  if
    (( rvm_head_flag == 1 ))
  then
    rvm_error "macruby-head is temporarily disabled(broken), use macruby-nightly for now."
    return 1

    if (( ${rvm_llvm_flag:=0} == 1 ))
    then "$rvm_scripts_path/package" llvm install
    fi

    macruby_path="/usr/local/bin"
    # TODO: configure & make variables should be set here.
    rvm_ruby_configure=" true "
    rvm_ruby_make="rake"
    rvm_ruby_make_install="$rvm_bin_path/rvmsudo rake install"

    __rvm_db "${rvm_ruby_interpreter}_repo_url" "rvm_ruby_url"

    rvm_ruby_repo_url=$rvm_ruby_url

    __rvm_setup_compile_environment "${rvm_ruby_string}"

    __rvm_install_source $* ||
    {
      result=$?
      rvm_error "There has been an error while trying to install from source. \nHalting the installation."
      return $result
    }
  else
    macruby_path="/Library/Frameworks/MacRuby.framework/Versions/${rvm_ruby_version}/usr/bin"

    rvm_log "Retrieving MacRuby ${rvm_ruby_version} ..."
    "$rvm_scripts_path/fetch" "$rvm_ruby_url" ||
    {
      result=$?
      rvm_error "There has been an error while trying to fetch the source. Halting the installation."
      return $result
    }

    case "$rvm_ruby_package_file" in
      (*.zip)
        __rvm_log_command "install" "Installing package" \
          macruby_install_extract_zip ||
          return $?
        ;;
      (*.pkg)
        __rvm_log_command "install" "Installing package" \
          macruby_install_extract_pkg "${rvm_archives_path}/$rvm_ruby_package_file" "$rvm_ruby_home" ||
          return $?
        ;;
      (*)
        rvm_error "Do not know what to do with archive: ${rvm_archives_path}/$rvm_ruby_package_file"
        return 1
        ;;
    esac
  fi
  macruby_install_wrap_binaries
  __rvm_initial_gemsets_create "$rvm_ruby_home/bin/ruby"
  binaries=()
  __rvm_post_install
}
scripts/functions/manage/base_fetch000066400000030530147511530560013513 0ustar00#!/usr/bin/env bash

__rvm_git_clean_repo()
{
  \command \git checkout -f master
  \command \git reset --hard HEAD
  \command \rm -fr .git/rebase-apply
}

__rvm_fetch_ruby()
{
  \typeset _current_command

  if (( ${rvm_ruby_selected_flag:=0} == 0 ))
  then __rvm_select
  fi

  if
    (( ${rvm_head_flag:=0} == 0 )) &&
    [[ -z "${rvm_ruby_tag:-}" && -z "${rvm_ruby_revision:-}" && -z "${rvm_ruby_sha:-}"  && -z "${rvm_ruby_repo_tag:-}" ]]
  then
    __rvm_fetch_ruby_package || return $?
  elif [[ "${rvm_ruby_interpreter}" == "truffleruby" ]]; then
    # Always use __rvm_fetch_ruby_package() for TruffleRuby, building from the repository is not supported in RVM
    __rvm_fetch_ruby_package || return $?
  else
    \typeset result=0

    mkdir -p "${rvm_repos_path}/${rvm_ruby_interpreter}"
    true ${rvm_ruby_url:="$rvm_ruby_repo_url"}

    if
      echo "$rvm_ruby_url" | __rvm_grep 'git' >/dev/null 2>&1
    then
      __rvm_fetch_ruby_head_git || return $?
    else
      __rvm_fetch_ruby_head_svn || return $?
    fi

    rvm_log "Copying from repo to src path..."

    __rvm_rm_rf "${rvm_src_path}/$rvm_ruby_string"
    __rvm_cp -R "${rvm_repos_path}/${rvm_ruby_interpreter}" "${rvm_src_path}/$rvm_ruby_string"

    return ${result:-0}
  fi
}

__rvm_fetch_ruby_cleanup()
{
  if
    (( ${rvm_head_flag:=0} == 0 )) &&
    [[ -z "${rvm_ruby_tag:-}" && -z "${rvm_ruby_revision:-}" && -z "${rvm_ruby_sha:-}" && -z "${rvm_ruby_repo_tag:-}" ]]
  then
    true # nothing to cleanup
  else
    __rvm_rm_rf "${rvm_src_path}/$rvm_ruby_string"/.git
    __rvm_rm_rf "${rvm_src_path}/$rvm_ruby_string"/.svn
  fi
}

__rvm_fetch_ruby_package()
{
    rvm_ruby_package_name="${rvm_ruby_package_name:-"$rvm_ruby_string"}"
    rvm_ruby_package_file="${rvm_ruby_package_file:-"$rvm_ruby_package_name"}"

    case "$rvm_ruby_string" in
      (ruby-1.8.4*) rvm_archive_extension="${rvm_archive_extension:-tar.gz}"  ;;
      (ruby-*)      rvm_archive_extension="${rvm_archive_extension:-tar.bz2}" ;;
      (*)           rvm_archive_extension="${rvm_archive_extension:-tar.gz}"  ;;
    esac

    case "$rvm_ruby_interpreter" in
      (ruby)
        rvm_ruby_url="$(__rvm_db "${rvm_ruby_interpreter}_url")/${rvm_ruby_release_version}.${rvm_ruby_major_version}/$rvm_ruby_package_file.$rvm_archive_extension"
        ;;
      (ree)
        rvm_ruby_url="$(__rvm_db "${rvm_ruby_interpreter}_${rvm_ruby_version}_url")/${rvm_ruby_package_file}.${rvm_archive_extension}"
        ;;
      (jruby)
        rvm_error "Trying to compile jruby from binary package - this is a bug, please report to RVM."
        return 198
        ;;
      (maglev|rubinius|rbx|truffleruby)
        true # Should already be set from scripts/functions/selector_interpreters
        ;;
      (*)
        rvm_ruby_url="$(__rvm_db "${rvm_ruby_interpreter}_url")/${rvm_ruby_package_file}.${rvm_archive_extension}"
        ;;
    esac

    rvm_log "$rvm_ruby_string - #downloading ${rvm_ruby_package_file}, this may take a while depending on your connection..."
    "$rvm_scripts_path/fetch" "${rvm_ruby_url}" ||
      return $?

    # Remove the directory if it is empty -- empty how?
    [[ -d "${rvm_src_path}/$rvm_ruby_string" ]] && rmdir "${rvm_src_path}/$rvm_ruby_string" 2>/dev/null || true

    if
      [[ ! -d "${rvm_src_path}/$rvm_ruby_string" ]]
    then
      mkdir -p "${rvm_tmp_path:-/tmp}/rvm_src_$$"

      __rvm_log_command "extract" "$rvm_ruby_string - #extracting $rvm_ruby_package_file to ${rvm_src_path}/$rvm_ruby_string" \
        __rvm_package_extract "${rvm_archives_path}/$rvm_ruby_package_file.$rvm_archive_extension" "${rvm_tmp_path:-/tmp}/rvm_src_$$" ||
      case $? in
        199)
          rvm_error "\nUnrecognized archive format '$archive_format'"
          return 199
          ;;
        *)
          rvm_error "There has been an error while trying to extract the source. Halting the installation."
          return 1
          ;;
      esac

      __rvm_rm_rf "${rvm_src_path}/$rvm_ruby_string"

      \command \mv "$(
        __rvm_find ${rvm_tmp_path:-/tmp}/rvm_src_$$ -mindepth 1 -maxdepth 1 -type d
      )" "${rvm_src_path}/$rvm_ruby_string"

      __rvm_rm_rf "${rvm_tmp_path:-/tmp}/rvm_src_$$"

      if
        [[ -n "${rvm_ruby_name:-""}" && -d "${rvm_src_path}/$(echo $rvm_ruby_string | __rvm_sed -e 's/-n.*//')" ]]
      then
        \command \mv "${rvm_src_path}/$(echo "$rvm_ruby_string" | __rvm_sed -e 's/-n.*//')" "${rvm_src_path}/$rvm_ruby_string"
      fi
    else
      rvm_log "$rvm_ruby_string - #already extracted to ${rvm_src_path}/$rvm_ruby_string"
    fi

    true # for osx
}

__rvm_fetch_ruby_head_git()
{
      case "$rvm_ruby_interpreter" in
        ruby)
          # Determine Branch
          if [[ -z "${rvm_ruby_repo_branch:-}" ]]
          then
            if [[ -n "${rvm_ruby_major_version:-}" ]]
            then
              if
                [[ -n "${rvm_ruby_minor_version:-}" ]] &&
                __rvm_version_compare "${rvm_ruby_version}" -lt 2.1.0
              then
                rvm_ruby_repo_branch="ruby_${rvm_ruby_release_version:-1}_${rvm_ruby_major_version}_${rvm_ruby_minor_version}"
              else
                rvm_ruby_repo_branch="ruby_${rvm_ruby_release_version:-1}_${rvm_ruby_major_version}"
              fi
            else
              rvm_ruby_repo_branch="master" # NOTE: Ruby Core team maps 'master' as HEAD
            fi
          fi
          ;;

        *)
          rvm_ruby_repo_branch="${rvm_ruby_repo_branch:-"master"}"
          ;;

      esac

      # Clone if repository does not yet exist locally
      if
        [[ -d "${rvm_repos_path}/${rvm_ruby_interpreter}/.git" ]]
      then
        (
          __rvm_cd "${rvm_repos_path}/${rvm_ruby_interpreter}"
          \typeset current_url
          current_url="$(\command \git remote -v | __rvm_awk '$1=="origin" && $3=="(fetch)" {print $2}')"
          [[ "$current_url" == "$rvm_ruby_repo_url" ]] || \command \git remote set-url origin "$rvm_ruby_repo_url"
        )
      else
        __rvm_rm_rf "${rvm_repos_path}/${rvm_ruby_interpreter}"

        rvm_ruby_repo_http_url="${rvm_ruby_repo_url//git:/https:}"

        \typeset git_clone_options
        git_clone_options=()
        # do not use '--depth 1' be default, we need to allow getting different commits
        if [[ -n "${rvm_git_clone_depth:-}" ]]
        then git_clone_options+=( --depth ${rvm_git_clone_depth} )
        fi
        __rvm_log_command "git.clone.git" \
          "Cloning from $rvm_ruby_repo_url, this may take a while depending on your connection" \
          \command \git clone "${git_clone_options[@]}" "$rvm_ruby_repo_url"      "${rvm_repos_path}/${rvm_ruby_interpreter}" ||
        __rvm_log_command "git.clone.http" \
          "Cloning from $rvm_ruby_repo_http_url, this may take a while depending on your connection" \
          \command \git clone "${git_clone_options[@]}" "$rvm_ruby_repo_http_url" "${rvm_repos_path}/${rvm_ruby_interpreter}" ||
        return $?
      fi

      # Use the selected branch.
      (
        __rvm_cd "${rvm_repos_path}/${rvm_ruby_interpreter}"

        remote="${remote:-origin}"
        branch=$(\command \git symbolic-ref -q HEAD 2>/dev/null)
        branch=${branch##refs/heads/}
        tag=$(\command \git describe --tags 2>/dev/null)

        # Ensure we are in a good state.
        \command \git reset --hard HEAD
        # just in case fix the fetch for the remote, new git restricts it to master
        \command \git config "remote.${remote}.fetch" "+refs/heads/*:refs/remotes/${remote}/*"
        # Download the latest updates locally.
        \command \git fetch --tags "${remote}"
        if [[ -n "${rvm_ruby_repo_tag:-}" ]]
        then
          if [[ "$tag" != "${rvm_ruby_repo_tag}" ]]
          then
            \command \git checkout -f "${rvm_ruby_repo_tag}"
          fi
          \command \git pull "$remote" "${rvm_ruby_repo_tag}" # Bring local to latest
        fi ||
        {
          result=$?
          rvm_error "There has been an error while checking out tag ${rvm_ruby_repo_tag}.  \nHalting the installation."
          return $result
        }

        if
          [[ "$branch" == "${rvm_ruby_repo_branch}" ]]
        then
          \command \git pull "${remote}" "${rvm_ruby_repo_branch}"
        else
          case "$(git branch 2>/dev/null)" in
            (*[[:space:]]${rvm_ruby_repo_branch}*)
              # Not already on the desired branch, but it does exist locally.
              \command \git checkout -f "${rvm_ruby_repo_branch}" # Branch is local, checkout
              \command \git pull "$remote" "${rvm_ruby_repo_branch}" # Bring local to latest
              ;;
            (*)
              # Desired branch does not exist locally.
              \command \git checkout -f -b "${rvm_ruby_repo_branch}" -t "${remote}/${rvm_ruby_repo_branch}" ||
              {
                result=$?
                rvm_error "Branch $remote/$rvm_ruby_repo_branch not found."
                return $result
              }
              ;;
          esac
        fi ||
        {
          result=$?
          rvm_error "There has been an error while checking out branch ${rvm_ruby_repo_branch}.  \nHalting the installation."
          return $result
        }
        __rvm_fetch_from_git_revision_or_sha || return $?
      )
      true # for OSX
}

__rvm_fetch_from_git_revision_or_sha()
{
  \typeset result __from
  __from=""
  if   [[ -n "${rvm_ruby_tag:-}" ]]
  then __from="${rvm_ruby_tag#t}"
  elif [[ -n "$rvm_ruby_revision" ]]
  then __from="${rvm_ruby_revision}"
  elif [[ -n "${rvm_ruby_sha:-}" ]]
  then __from="${rvm_ruby_sha}"
  elif [[ -n "${rvm_ruby_repo_branch:-}" ]]
  then __from="${rvm_ruby_repo_branch}"
  elif [[ -n "${rvm_ruby_repo_tag:-}" ]]
  then __from="${rvm_ruby_repo_tag}"
  fi
  if
    [[ -n "$__from" ]]
  then
    if [[ "$__from" == "head" ]]
    then __from="master"
    fi
    rvm_log "git checkout $__from"
    \command \git checkout -f -q "$__from" ||
    {
      result=$?
      rvm_error "There has been an error while trying to checkout the source branch.\nHalting the installation."
      return $result
    }
  fi
}

__rvm_fetch_ruby_head_svn()
{
      if
        [[ -n "${rvm_ruby_tag:-""}" ]]
      then
        # TODO: Check if tag v is valid
        true "${rvm_ruby_url:="$rvm_ruby_repo_url/tags/$(echo "$rvm_ruby_tag" | __rvm_sed 's/^t//')"}"
      elif
        [[ -z "${rvm_ruby_version:-""}" && ${rvm_head_flag:-0} -eq 1 ]]
      then
        true "${rvm_ruby_url:="$rvm_ruby_repo_url/trunk"}"
      elif
        [[  "${rvm_ruby_major_version:-""}" == "9" ]]
      then
        if
          [[ -z "${rvm_ruby_minor_version:-""}" || "${rvm_ruby_minor_version:-""}" = 3 ]]
        then
          true "${rvm_ruby_url:="$rvm_ruby_repo_url/trunk"}"
        else
          true "${rvm_ruby_url:="$rvm_ruby_repo_url/branches/ruby_${rvm_ruby_release_version}_${rvm_ruby_major_version}_${rvm_ruby_minor_version}"}"
        fi
      elif
        [[ -z "${rvm_ruby_minor_version:-""}" ||
          "${rvm_ruby_major_version:-""}.${rvm_ruby_minor_version:-""}" = "8.8"
        ]]
      then
        true "${rvm_ruby_url:="$rvm_ruby_repo_url/branches/ruby_${rvm_ruby_release_version}_${rvm_ruby_major_version}"}"
      else
        "${rvm_ruby_url:="$rvm_ruby_repo_url/branches/ruby_${rvm_ruby_release_version}_${rvm_ruby_major_version}_${rvm_ruby_minor_version}"}"
      fi

      rvm_rev=""
      if
        [[ -n "${rvm_ruby_revision:-""}" ]]
      then
        rvm_rev="-$rvm_ruby_revision"
      fi
      (
        __rvm_cd "${rvm_repos_path}/${rvm_ruby_interpreter}"
        if
          [[ -d "${rvm_repos_path}/${rvm_ruby_interpreter}/.svn" ]]
        then
          rvm_log "Updating ruby from $rvm_ruby_url"
          __rvm_log_command "svn.switch" "Switch to $rvm_ruby_url" svn switch $rvm_ruby_url
          __rvm_log_command "svn.update" "Update svn" svn update

          if
            [[ -n "${rvm_rev:-""}" ]]
          then
            __rvm_log_command "svn.checkout" "Checking out revision ${rvm_rev/-r/-r } from $rvm_ruby_url" \
              svn update -q ${rvm_rev/-r/-r }
          fi
        else
          __rvm_rm_rf "${rvm_repos_path}/${rvm_ruby_interpreter}"
          __rvm_log_command "svn.checkout" "Downloading source from ${rvm_ruby_url}." \
            svn checkout -q ${rvm_rev/-r/-r } "$rvm_ruby_url" "${rvm_repos_path}/${rvm_ruby_interpreter}"
        fi
      )
      result=$?
      if (( result > 0 ))
      then
        rvm_error "There has been an error while trying to fetch / update the source.  \nHalting the installation."
        return $result
      fi
}
scripts/functions/manage/jruby000066400000011010147511530560012553 0ustar00#!/usr/bin/env bash

jruby_install_build_nailgun()
{
  __rvm_cd "${rvm_src_path}/$rvm_ruby_string/tool/nailgun" &&
  case "$rvm_ruby_version" in
    1.2*|1.3*)
      true
      ;;
    *)
      env "${rvm_configure_env[@]}" ./configure --prefix=$rvm_ruby_home
      ;;
  esac &&
  __rvm_make "${rvm_make_flags[@]}"
}

jruby_install_ant()
{
  __rvm_log_command "ant.jar" "$rvm_ruby_string - #ant jar" __rvm_ant jar || return $?

  [[ -f "${rvm_src_path}/$rvm_ruby_string/bin/jruby" ]] ||
  {
    result=$?
    rvm_error "JRuby reported it was installed successfully, but RVM could not find proper installation,
please check why '${rvm_src_path}/$rvm_ruby_string/bin/jruby' was not created,
maybe here '$rvm_log_path/$rvm_ruby_string/ant.jar.log',
also make sure to report an error here 'https://github.com/jruby/jruby/issues'
about not returning non zero status in case of errors."
    return $result
  }

  if
    (( ${#rvm_configure_flags[@]} ))
  then
    __rvm_log_command "ant.jar.flags" "$rvm_ruby_string - #ant jar ${rvm_configure_flags[*]}" \
      __rvm_ant jar "${rvm_configure_flags[@]}" || return $?
  fi

  __rvm_log_command "ant.cext" "$rvm_ruby_string - #ant cext" __rvm_ant cext "${rvm_configure_flags[@]}" ||
  rvm_warn "cext is known to fail please report here: https://jira.codehaus.org/browse/JRUBY"

  __rvm_version_compare "$rvm_ruby_version" -ge "1.7.0" ||
  __rvm_log_command "nailgun" "$rvm_ruby_string - #nailgun" jruby_install_build_nailgun ||
  return $?
}

jruby_install_mvn_command()
{
  __rvm_log_command "$mvn_label" "$rvm_ruby_string - #$mvn_label" "${mvn_command[@]}" || return $?
}

jruby_install_mvn()
{
  \typeset -a mvn_command
  \typeset mvn_label
  mvn_command=( "${1:-mvn}" )
  mvn_label="{1:-mvn}"
  mvn_label="${mvn_command##*/}"

  jruby_install_mvn_command || return $?
  if
    (( ${#rvm_configure_flags[@]} ))
  then
    mvn_command+=( "${rvm_configure_flags[@]}" )
    mvn_label+="_flags"
    jruby_install_mvn_command || return $?
  fi
}

jruby_install_mvnw()
{
  jruby_install_mvn "${rvm_src_path}/$rvm_ruby_string/mvnw" || return $?
}

jruby_install_check_java()
{
  builtin command -v java > /dev/null ||
  {
    printf "%b" "java must be installed and in PATH for JRuby."
    return 1
  }
}

jruby_install_check_jruby_home()
{
  if
    [[ -n "$JRUBY_HOME" ]]
  then
    printf "%b" "You have environment variable JRUBY_HOME set, please unset it before installing/using JRuby."
    return 2
  fi
}

jruby_install_check_java_home()
{
  if
    [[ -z "${JAVA_HOME:-}" ]]
  then
    export JAVA_HOME="$(
      cd "${rvm_scripts_path}/extras/java_read_properties"
      java ReadProperties java.home
    )"
    if
      [[ -n "$JAVA_HOME" &&
        -x "$JAVA_HOME/../bin/javac" &&
        -f "$JAVA_HOME/../lib/tools.jar"
      ]]
    then
      rvm_debug "Detected JAVA_HOME=$JAVA_HOME has JDK level up"
      JAVA_HOME="${JAVA_HOME%/*}" # cd ..
    fi
    rvm_warn "\$JAVA_HOME was empty, setting up JAVA_HOME=$JAVA_HOME, if it fails try setting JAVA_HOME to something sane and try again."
  fi
}

jruby_install()
{
  __rvm_setup_compile_environment "${rvm_ruby_string}" || return $?

  jruby_install_check_java || return $?
  jruby_install_check_jruby_home || return $?
  jruby_install_check_java_home

  __rvm_cd "${rvm_src_path}"

  rvm_ruby_tag="${rvm_ruby_version}"
  __rvm_fetch_ruby || return $?

  __rvm_cd "${rvm_src_path}/$rvm_ruby_string"

  __rvm_apply_patches

  \typeset method
  method=$( jruby_installation_method  "${rvm_ruby_string}" "${rvm_ruby_version}" )  || return $?
  jruby_install_$method  || return $?

  __rvm_rm_rf "$rvm_ruby_home" && \command \mkdir -p "$rvm_ruby_home" &&
  __rvm_log_command "install" "$rvm_ruby_string - #installing to $rvm_ruby_home" \
    __rvm_cp -Rf "${rvm_src_path}/$rvm_ruby_string"/{bin,lib} "$rvm_ruby_home"/ || return $?

  case ${rvm_ruby_string} in
    jruby-head*|jruby-1.7.*)
      (
        __rvm_cd "$rvm_ruby_home/bin/"
        for binary in irb ruby gem
        do
          [[ -f "${binary}" ]] || ln -fs "j${binary}" "${binary}"
        done
      )
      ;;
    *)
      (
        __rvm_cd "$rvm_ruby_home/bin/"
        for binary in jirb jruby jgem
        do
          ln -fs "$binary" "${binary#j}"
        done
      )
      ;;
  esac

  chmod +x "$rvm_ruby_home/bin/jruby"
  __rvm_initial_gemsets_create "$rvm_ruby_home/bin/ruby"

  case ${rvm_ruby_string} in
    jruby-head*|jruby-1.7.*)
      binaries=()
      ;;
    *)
      binaries=(jrubyc jirb_swing jirb jgem rdoc ri spec autospec testrb ast generate_yaml_index.rb rake)
      ;;
  esac
  __rvm_post_install
  __rvm_fetch_ruby_cleanup
}
scripts/functions/manage/mruby000066400000004640147511530560012571 0ustar00#!/usr/bin/env bash

mruby_install()
{
  \typeset result temp_flags

  __rvm_check_for_bison # && Run like hell...
  if __rvm_check_for_bison
  then true
  else
    result=$?
    rvm_log "Bison required but not found. Halting."
    return $result
  fi

  __rvm_setup_compile_environment "${rvm_ruby_string}"

  true ${rvm_ruby_selected_flag:=0}

  \typeset directory db_configure_flags
  \typeset -a autoconf_flags

  (( rvm_ruby_selected_flag )) || __rvm_select

  rvm_log "Installing Ruby from source to: $rvm_ruby_home, this may take a while depending on your cpu(s)..."
  __rvm_cd "${rvm_src_path}"

  if __rvm_fetch_ruby
  then true
  else
    result=$?
    rvm_error "There has been an error fetching the ruby interpreter. Halting the installation."
    return $result
  fi

  if __rvm_cd "${rvm_src_path}/$rvm_ruby_string"
  then true
  else
    result=$?
    rvm_error "Source directory is missing.  \nDid the download or extraction fail?  \nHalting the installation."
    return $result
  fi

  if [[ -d "${rvm_path}/usr" ]]
  then
    __rvm_add_to_path prepend "${rvm_path}/usr/bin"
    builtin hash -r
  fi

  if __rvm_apply_patches
  then true
  else
    result="$?"
    rvm_error "There has been an error applying the specified patches. Halting the installation."
    return $result
  fi

  if __rvm_log_command "make" "$rvm_ruby_string - #compiling" ${rvm_ruby_make:-__rvm_make} "${rvm_make_flags[@]}"
  then true
  else
    result=$?
    rvm_error "There has been an error while running make. Halting the installation."
    return $result
  fi

  \command \mkdir -p "$rvm_ruby_home/"
  \command \mkdir -p "$rvm_ruby_gem_home/bin"
  \command \mkdir -p "$rvm_ruby_global_gems_path/bin"

  [[ -n "${rvm_ruby_make_install:-}" ]] || rvm_ruby_make_install=( __rvm_cp -Rf "${rvm_src_path}/$rvm_ruby_string"/{bin,mrblib,include} "$rvm_ruby_home/" )

  __rvm_log_command "install" "$rvm_ruby_string - #installing" "${rvm_ruby_make_install[@]}" ||
  {
    result=$?
    rvm_error "There has been an error while running make install. Halting the installation."
    return $result
  }

  \typeset __bin_file __target_file
  for __bin_file in "$rvm_ruby_home/bin"/m*
  do
    __bin_file="${__bin_file##*/}"
    __target_file="${__bin_file#m}"
    ln -s "${__bin_file}" "$rvm_ruby_home/bin/${__target_file}"
  done

  __rvm_ruby_config_save "$rvm_ruby_home/bin/ruby"
  __rvm_fetch_ruby_cleanup || return $?

  rvm_log "Install of $rvm_ruby_string - #complete "
}
scripts/functions/manage/base000066400000007300147511530560012341 0ustar00#!/usr/bin/env bash

source "$rvm_scripts_path/functions/manage/base_fetch"
source "$rvm_scripts_path/functions/manage/base_install"
source "$rvm_scripts_path/functions/manage/base_install_patches"
source "$rvm_scripts_path/functions/manage/base_remove"

__rvm_uninstall_ruby()
{
  __rvm_remove_ruby uninstall
}

__rvm_reinstall_ruby()
{
  export pristine_gems_filter="! gem.extensions.empty?"
  __rvm_remove_ruby reinstall &&
  __rvm_install_ruby "$@" &&
  __rvm_gemset_pristine_all "$rvm_ruby_string"
}

__rvm_gemset_pristine_all()
{
  if (( ${rvm_skip_pristine_flag:-0} ))
  then return 0
  fi
  case "$rvm_ruby_string" in
    (mruby*) return 0 ;;
  esac
  \typeset -a destination_gemsets
  \typeset destination_gemset
  __rvm_read_lines destination_gemsets <(
    __rvm_list_gemset_strings | __rvm_grep -E "^$1(@.*)?$"
  )
  for destination_gemset in "${destination_gemsets[@]}"
  do __rvm_gemset_pristine "$destination_gemset"
  done
}

__rvm_manage_rubies()
{
  \typeset manage_result bin_line current_ruby_string
  \typeset -a rubies
  rubies=()

  rvm_gemset_name=""
  rvm_ruby_selected_flag=0
  rvm_ruby_gem_home="${rvm_ruby_gem_home%%${rvm_gemset_separator:-"@"}*}"
  rvm_ruby_string="${rvm_ruby_string%%${rvm_gemset_separator:-"@"}*}"

  # Given list of ruby strings.
  if
    __rvm_string_match "${rubies_string:-}" "old:*"
  then
    \typeset _older_then
    _older_then=${rubies_string#old:}
    if
      [[ -z "${_older_then}" ]]
    then
      # minified https://github.com/mpapis/home_dotfiles/blob/master/bin/git-summary#L5-L50
      case "${_system_type}" in
        (Darwin) _older_then="$( __rvm_date -j -v6m           +%F )" ;;
        (*)      _older_then="$( __rvm_date --date="-6months" +%F )" ;;
      esac
    fi
    __rvm_read_lines rubies <(
      __rvm_cd "$rvm_rubies_path"
      # find on bsd does not have -not, we need to use \!
      __rvm_find . -maxdepth 1 -mindepth 1 -type d \! -newermt $_older_then 2>/dev/null | cut -c 3-
    )
    (( ${#rubies[*]} )) ||
    {
      rvm_warn "No rubies older then ${_older_then}."
      return 1
    }
    __rvm_ask_for "Are you SURE you wish to '$action' ${rubies[*]}?" yes || return $?
  elif
    [[ -n "${rubies_string:-}" && "${rubies_string}" != "all" ]]
  then
    if
      [[ "${rubies_string}" == *,* || -z "${rvm_ruby_string:-}" ]]
    then
      __rvm_custom_separated_array rubies , "${rubies_string}"
    else
      rubies=( "${rvm_ruby_string}" )
    fi
  elif
    [[ "$action" == "install" ]]
  then
    rvm_error 'Really? '"$action"', all? See "rvm list known" and limit the selection to something more sane please :)'
    return 1
  elif
    [[ -z "${rubies_string}" ]]
  then
    rvm_error 'Really? '"$action"', all? See "rvm list" and limit the selection to something more sane please :)'
    return 1
  else
    # explicit all && not install
    if
      (( ${rvm_force_flag:-0} == 0 )) &&
      [[ "$action" == "reinstall" || "$action" == "delete" || "$action" == "remove" || "$action" == "uninstall" ]]
    then
      __rvm_ask_for "Are you SURE you wish to '$action' all rubies?" yes || return $?
    fi
    __rvm_read_lines rubies <(
      __rvm_cd "$rvm_rubies_path"
      __rvm_find . -maxdepth 1 -mindepth 1 -type d 2>/dev/null | cut -c 3-
    )
  fi

  for rvm_ruby_string in "${rubies[@]}"
  do
    rvm_debug "${rvm_ruby_string} - $action"
    current_ruby_string="$rvm_ruby_string"
    if
      # in () so it does not mess with env. variables
      (
        rvm_hook="before_install"
        source "$rvm_scripts_path/hook"
        __rvm_${action}_ruby
      )
    then
      if [[ "$action" == "install" ]]
      then __rvm_record_install "$current_ruby_string"
      fi
    else
      : manage_result:${manage_result:=$?}
    fi
  done
  return "${manage_result:-0}"
}
scripts/functions/manage/topaz000077500000005045147511530560012573 0ustar00#!/usr/bin/env bash

topaz_install()
{
  __rvm_cd "${rvm_src_path}"

  if [[ "$rvm_ruby_string" != *head* ]]
  then
    case "${_system_type} ${_system_arch}" in
      "Linux x86_64")
        version="linux64"
        ;;
      "Linux i386")
        version="linux32"
        ;;
      "Darwin x86_64")
        version="osx64"
        ;;
      *)
        rvm_error "Topaz only provides binary packages for Linux i386 and x86_64 and Darwin x86_64. You try to build the HEAD version"
        ;;
    esac
    rvm_ruby_package_file="$(__rvm_curl "${rvm_ruby_url}" | __rvm_grep -Eo "topaz-${version}-[^.]+\.tar\.bz2" | \command \head -1)"
    rvm_ruby_url="${rvm_ruby_url}/${rvm_ruby_package_file}"

    __rvm_cd "${rvm_archives_path}"
    __rvm_curl -O "$rvm_ruby_url" &&
    __rvm_log_command "extract" \
      "${rvm_ruby_string} - #extracting ${rvm_ruby_package_file} to ${rvm_src_path}" \
      __rvm_package_extract \
      "${rvm_archives_path}/${rvm_ruby_package_file}" "${rvm_src_path}" ||
    case $? in
      199)
        rvm_error "\nUnrecognized archive format '$archive_format'"
        return 199
        ;;
      *)
        rvm_error "There has been an error while trying to extract the source. Halting the installation."
        return 1
        ;;
    esac

    \command \mv "${rvm_src_path}/topaz" "${rvm_src_path}/$rvm_ruby_string"
  else
    rvm_ruby_url="${rvm_ruby_repo_url}"
    __rvm_fetch_ruby || return $?

    __rvm_rm_rf pypy
    __rvm_rm_rf rply

    __rvm_curl -O https://bitbucket.org/pypy/pypy/get/default.tar.bz2
    \command \tar xf default.tar.bz2
    __rvm_rm_rf default.tar.bz2
    \command \mv pypy* pypy

    __rvm_curl -O https://github.com/alex/rply/archive/master.zip
    \command \unzip master.zip
    __rvm_rm_rf master.zip
    \command \mv rply* rply

    __rvm_cd "${rvm_src_path}/$rvm_ruby_string"

    _old_python_path="$PYTHONPATH"
    export PYTHONPATH="${rvm_src_path}/pypy:${rvm_src_path}/rply:${rvm_src_path}/$rvm_ruby_string"
    __rvm_log_command "python" \
    "Building topaz with JIT, this will take a (long) while." \
    /usr/bin/env python "${rvm_src_path}/pypy/rpython/translator/goal/translate.py" -Ojit "${rvm_src_path}/${rvm_ruby_string}/targettopaz.py"
    export PYTHONPATH="$_old_python_path"
  fi

  __rvm_rm_rf $rvm_ruby_home
  __rvm_log_command "install" \
    "Installing topaz to $rvm_ruby_home" \
    __rvm_cp -Rf "${rvm_src_path}/${rvm_ruby_string}" "${rvm_ruby_home}"

  __rvm_cd "$rvm_ruby_home/bin/"

  \command \ln -fs "topaz" "ruby"

  __rvm_initial_gemsets_create "$rvm_ruby_home/bin/ruby" &&
  __rvm_fetch_ruby_cleanup
}
scripts/functions/manage/base_install000066400000035113147511530560014072 0ustar00#!/usr/bin/env bash

__rvm_install_source()
{
  __rvm_require "$rvm_scripts_path/functions/manage/install/$_system_name_lowercase"

  true ${rvm_ruby_selected_flag:=0}

  \typeset directory db_configure_flags
  \typeset -a autoconf_flags

  (( rvm_ruby_selected_flag )) || __rvm_select

  if [[ -n "${DYLD_LIBRARY_PATH:-}" ]]
  then rvm_error "Warning: DYLD_LIBRARY_PATH environment variable is set, this might interact with the compilation and ruby."
  fi

  rvm_log "Installing Ruby from source to: $rvm_ruby_home, this may take a while depending on your cpu(s)..."
  __rvm_cd "${rvm_src_path}"

  __rvm_fetch_ruby ||
  {
    result=$?
    rvm_error "There has been an error fetching the ruby interpreter. Halting the installation."
    return $result
  }

  __rvm_cd "${rvm_src_path}/$rvm_ruby_string" ||
  {
    result=$?
    rvm_error "Source directory is missing.  \nDid the download or extraction fail?  \nHalting the installation."
    return $result
  }

  if
    [[ -d "${rvm_path}/usr" ]]
  then
    __rvm_add_to_path prepend "${rvm_path}/usr/bin"
    builtin hash -r
  fi

  __rvm_apply_patches ||
  {
    result="$?"
    rvm_error "There has been an error applying the specified patches. Halting the installation."
    return $result
  }

  if
    (( ${rvm_force_autoconf_flag:-0} == 1 )) || {
      [[ -z "${rvm_ruby_configure:-}" ]] &&
      [[ ! -s "${rvm_src_path}/$rvm_ruby_string/configure" ||
        "${rvm_src_path}/$rvm_ruby_string/configure.in" -nt "${rvm_src_path}/$rvm_ruby_string/configure"
      ]]
    }
  then
    (( ${rvm_force_autoconf_flag:-0} == 1 )) &&
      autoconf_flags+=( -f )
    __rvm_log_command "autoreconf" "$rvm_ruby_string - #autoreconf${autoconf_flags:-}" __rvm_autoreconf "${autoconf_flags[@]}"
  fi

  if
    [[ -n "${rvm_ruby_configure:-""}" ]]
  then
    __rvm_log_command "configure" "$rvm_ruby_string - #configuring" "$rvm_ruby_configure" ||
    {
      result=$?
      rvm_error "There has been an error while configuring. Halting the installation."
      return $result
    }
  elif
    [[ -s ./configure ]]
  then
    rvm_configure_flags=( --prefix="$rvm_ruby_home"  "${rvm_configure_flags[@]}" )

    __rvm_db "${rvm_ruby_interpreter}_configure_flags" db_configure_flags
    if [[ -n "${ZSH_VERSION:-}" ]]
    then rvm_configure_flags=( ${=db_configure_flags} "${rvm_configure_flags[@]}" )
    else rvm_configure_flags=( ${db_configure_flags}  "${rvm_configure_flags[@]}" )
    fi
    __rvm_array_prepend_or_ignore rvm_configure_env   CFLAGS= " " "-O3" "-O"
    __rvm_array_prepend_or_ignore rvm_configure_env  CCFLAGS= " " "-O3" "-O"
    __rvm_array_prepend_or_ignore rvm_configure_env CXXFLAGS= " " "-O3" "-O"
    __rvm_log_command "configure" "$rvm_ruby_string - #configuring" \
      "${rvm_configure_env[@]}" ./configure "${rvm_configure_flags[@]}" ||
    {
      result=$?
      rvm_error "There has been an error while running configure. Halting the installation."
      if [[ -f config.log ]]
      then cp config.log "${rvm_log_path}/${rvm_log_timestamp:-}${rvm_ruby_string:+_}${rvm_ruby_string:-}/"
      fi
      return $result
    }
  else
    rvm_error "Skipping configure step, 'configure' does not exist, did autoreconf not run successfully?"
  fi

  if
    is_a_function __rvm_post_configure_${rvm_ruby_interpreter}
  then
    __rvm_log_command "postconfigure" "$rvm_ruby_string - #post-configuration" \
      __rvm_post_configure_${rvm_ruby_interpreter}
  fi

  __rvm_log_command "make" "$rvm_ruby_string - #compiling" ${rvm_ruby_make:-__rvm_make} "${rvm_make_flags[@]}" ||
  {
    result=$?

    rvm_error "\nThere has been an error while running make. Halting the installation."

    if is_a_function __rvm_make_failed_${_system_name_lowercase}
    then __rvm_make_failed_${_system_name_lowercase}
    fi

    return $result
  }

  __rvm_rm_rf "$PWD/.ext/rdoc" # WTF?

  [[ -n "${rvm_ruby_make_install:-}" ]] || rvm_ruby_make_install=( __rvm_make install )

  __rvm_log_command "install" "$rvm_ruby_string - #installing" "${rvm_ruby_make_install[@]}" ||
  {
    result=$?
    rvm_error "There has been an error while running make install. Halting the installation."
    return $result
  }

  if [[ -s "${rvm_src_path}/$rvm_ruby_string/patches.list" ]]
  then __rvm_cp -f "${rvm_src_path}/$rvm_ruby_string/patches.list" "$rvm_ruby_home/patches.list"
  fi

  case "${rvm_ruby_string:-""}" in
    ruby-1.8.4|ruby-1.8.5-*)
      \typeset libdir
      libdir="$rvm_ruby_home/lib"
      if
        [[ -d "${libdir}64" ]]
      then
        \command \rm -rf "${libdir}"
        ln -s "${libdir}64" "${libdir}"
      fi
    ;;
  esac

  case " ${rvm_configure_flags[*]} " in
    (*[[:space:]]--program-suffix=*)
      \typeset program_suffix
      program_suffix="${rvm_configure_flags[*]}"
      program_suffix="${program_suffix#*--program-suffix=}"
      program_suffix="${program_suffix%%[\' ]*}"
      __rvm_log_command "link.ruby" "$rvm_ruby_string - #linking ruby${program_suffix} -> ruby " \
        ln -s "$rvm_ruby_home/bin/ruby${program_suffix}" "$rvm_ruby_home/bin/ruby"
      ;;
  esac

  __rvm_initial_gemsets_create "$rvm_ruby_home/bin/ruby" &&
  __rvm_post_install &&
  __rvm_fetch_ruby_cleanup ||
  return $?

  rvm_log "Install of $rvm_ruby_string - #complete "
}

__rvm_post_install()
{
  case "$rvm_ruby_interpreter" in
  (jruby|ree|rbx|mruby|macruby|truffleruby) true ;; #skip
  (*)
    (( ${#binaries[@]} )) || binaries=(gem irb erb ri rdoc testrb rake)
    ;;
  esac

  if
    (( ${#binaries[@]} ))
  then
    rvm_log "$rvm_ruby_string - #adjusting #shebangs for (${binaries[@]})."
    for binary in "${binaries[@]}"
    do
      if
        [[ -e "$rvm_ruby_home/bin/$binary" || -e "${rvm_src_path}/$rvm_ruby_string/bin/$binary" ]]
      then
        if
          [[ "${rvm_src_path}/$rvm_ruby_string" != "$rvm_ruby_home" ]] &&
          [[ -f "${rvm_src_path}/$rvm_ruby_string/bin/$binary" && ! -L "$rvm_ruby_home/bin/$binary" ]]
        then
          __rvm_cp -f "${rvm_src_path}/$rvm_ruby_string/bin/$binary" "$rvm_ruby_home/bin/$binary"
        elif
          [[ -f "$rvm_ruby_gem_home/bin/$binary" ]]
        then
          __rvm_cp -f "$rvm_ruby_gem_home/bin/$binary" "$rvm_ruby_home/bin/$binary"
        fi
        __rvm_inject_ruby_shebang "$rvm_ruby_home/bin/$binary"
        [[ -x "$rvm_ruby_home/bin/$binary" ]] || chmod +x "$rvm_ruby_home/bin/$binary"
      fi
    done
  fi
  binaries=(gem irb erb ri rdoc testrb rake) #reset
  __rvm_irbrc
}

__rvm_inject_ruby_shebang()
{
  \typeset actual_file="$1"
  __rvm_readlink_deep actual_file
  if
    [[ -f "$actual_file" ]]
  then
    __rvm_sed_i "${actual_file}" -e '1,1s=.*=#!'"/usr/bin/env ruby="
    [[ -x "$actual_file" ]] || chmod +x "$actual_file"
  fi
}

__rvm_old_ruby()
{
  case "$1" in
    (ree*|ruby-1.8*|ruby-1.9.1*|ruby-1.9.2*) return 0 ;;
    (*) return 1 ;;
  esac
}

__rvm_install_ruby_try_remote()
{
  : rvm_disable_binary_flag:${rvm_disable_binary_flag:=0}: rvm_remote_flag:${rvm_remote_flag:=0}:
  if
    (( rvm_remote_flag > 0 )) || # remote flag wins!
    (( rvm_head_flag == 0 && rvm_disable_binary_flag == 0 )) # not a head and disabled binary
  then
    case "$rvm_ruby_string" in
      truffleruby*)
        # always use the "from source" installation path for TruffleRuby
        return 2
        ;;
    esac

    rvm_log "Searching for binary rubies, this might take some time."
    \typeset __rvm_ruby_url __rvm_ruby_verify_download_flag __ruby_identifier
    __ruby_identifier="${rvm_ruby_string}"
    __rvm_ruby_url="$( __rvm_remote_server_path "${__ruby_identifier}" )"
    if
      [[ -z "${__rvm_ruby_url}" ]]
    then
      __ruby_identifier="${rvm_ruby_string%-${detected_rvm_ruby_name:-}}"
      __rvm_ruby_url="$( __rvm_remote_server_path "${__ruby_identifier}" )"
    fi
    IFS=: read __rvm_ruby_verify_download_flag __rvm_ruby_url <<<"${__rvm_ruby_url}"
    if
      (( ${rvm_verify_downloads_flag_cli:-${rvm_verify_downloads_flag:-1}} > ${__rvm_ruby_verify_download_flag:=0} ))
    then
      __rvm_ruby_verify_download_flag=${rvm_verify_downloads_flag_cli:-${rvm_verify_downloads_flag}}
    fi
    if
      [[ -z "${__rvm_ruby_url}" ]]
    then
      if
        (( rvm_remote_flag ))
      then
        rvm_error "Requested binary installation but no rubies are available to download, consider skipping --binary flag."
        return 1
      elif
        __rvm_old_ruby "${__ruby_identifier}"
      then
        rvm_log "No binary rubies available for: $(__rvm_system_path -)/${__ruby_identifier}.
It is not possible to build movable binaries for rubies 1.8-1.9.2, but you can do it for your system only.
Continuing with compilation. Please read 'rvm help mount' to get more information on binary rubies."
      else
        rvm_warn "No binary rubies available for: $(__rvm_system_path -)/${__ruby_identifier}.
Continuing with compilation. Please read 'rvm help mount' to get more information on binary rubies."
      fi
    else
      rvm_log "Found remote file ${__rvm_ruby_url}"
      __rvm_setup_compile_environment_setup
      __rvm_setup_compile_environment_requirements "${rvm_ruby_string}" || return 1
      __rvm_check_available_space "${rvm_ruby_string}"
      if
        rvm_verify_downloads_flag=${__rvm_ruby_verify_download_flag} rvm_remote_flag=1 \
          "${rvm_scripts_path}/mount" mount "${__rvm_ruby_url}" "${rvm_ruby_string}" autodetect
      then
        return 0
      else
        \typeset __status=$?
        __rvm_rm_rf "$rvm_rubies_path/$rvm_ruby_string" # cleanup so standard installation works
        if
          (( rvm_remote_flag ))
        then
          rvm_error "Mounting remote ruby failed with status $__status, stopping installation."
          return ${__status}
        else
          rvm_warn "Mounting remote ruby failed with status $__status, trying to compile."
        fi
      fi
    fi
  fi
  return 2 # continue with compilation
}

__rvm_check_available_space()
{
  \typeset __required_space __free_space __i_have_no_idea
  __rvm_calculate_space_free "${rvm_rubies_path}"

  __i_have_no_idea=0
  case "$1" in
    # this should be enough for binary only version, including package file
    (jruby*)         __required_space=50  ;;
    (maglev*)        __required_space=950 ;;
    (ree-*)          __required_space=70  ;;
    (rbx*|rubinius*) __required_space=170 ;;
    (truffleruby*)   __required_space=200 ;;
    (ruby-1.8.5*)    __required_space=20  ;;
    (ruby-1.8.6*)    __required_space=20  ;;
    (ruby-1.8.7*)    __required_space=25  ;;
    (ruby-1.9.1*)    __required_space=60  ;;
    (ruby-1.9.2*)    __required_space=60  ;;
    (ruby-1.9.3*)    __required_space=70  ;;
    (ruby-2.0.0*)    __required_space=90  ;;
    (ruby-head*)     __required_space=130 ;;
    (ruby*)          __required_space=100 ;; #2.1.0+
    (*)
      __required_space=50
      __i_have_no_idea=1
      ;;
  esac

  if
    [[ "${2:-}" == "sources" ]]
  then
    # this adds sources and repository size to the installed size, even if we would remove sources
    # after installation we still need them during installation so it's needed to add it
    case "$1" in
      (jruby*)         let __required_space+=230 ;;
      (maglev*)        let __required_space+=120 ;;
      (rbx*|rubinius*) let __required_space+=600 ;;
      (truffleruby*)   let __required_space+=160 ;;
      (ree-1.8.6*)     let __required_space+=40  ;;
      (ree-1.8.7*)     let __required_space+=130 ;;
      (ruby-1.8.5*)    let __required_space+=35  ;;
      (ruby-1.8.6*)    let __required_space+=40  ;;
      (ruby-1.8.7*)    let __required_space+=40  ;;
      (ruby-1.9.1*)    let __required_space+=120 ;;
      (ruby-1.9.2*)    let __required_space+=160 ;;
      (ruby-1.9.3*)    let __required_space+=170 ;;
      (ruby-2.0.0*)    let __required_space+=300 ;;
      (ruby-head*)     let __required_space+=560 ;;
      (ruby-*)         let __required_space+=340 ;; # 2.1.0+
      (*)              let __required_space+=100 ;;
    esac
  fi

  if (( __i_have_no_idea ))
  then rvm_warn "RVM does not have prediction for required space for $1, assuming ${__required_space}MB should be enough, let us know if it was not."
  fi

  if
    (( __required_space > __free_space ))
  then
    rvm_error "Not enough space (${__free_space}MB) to install ruby (${__required_space}MB)."
    return 1
  elif
    (( __required_space*12 > __free_space*10 )) # 20% check
  then
    rvm_warn "You are running low on disk space ${__free_space}MB, required ${__required_space}MB."
  else
    rvm_debug "Free disk space ${__free_space}MB, required ${__required_space}MB."
  fi
}

__rvm_install_ruby()
{
  true ${rvm_head_flag:=0} ${rvm_ruby_selected_flag:=0}
  \typeset binary __rvm_ruby_name ruby_install_type __result=0

  if
    (( rvm_ruby_selected_flag == 0 ))
  then
    __rvm_ruby_name="$rvm_ruby_name"
    __rvm_select || __result=$?
    case $__result in
      (0|2) true      ;; # 2 => missing gemset, it's fine, we will install it
      (*)   return $? ;;
    esac
    if
      [[ -n "$__rvm_ruby_name" ]]
    then
      __rvm_select || return $? # second detection for -n verification
      if
        [[ "$__rvm_ruby_name" != "$detected_rvm_ruby_name" ]]
      then
        rvm_error "
The used ruby name (-n) is not valid, it was matched as:

$( env | __rvm_grep "^rvm.*=$__rvm_ruby_name$" || printf "# Was not used at all\n")

for more details on selecting names please visit:
https://rvm.io/rubies/named/
" #" fix escaping
        return 1
      fi
    fi
  fi

  if [[ -n "${RUBYOPT:-""}" ]]
  then
    ruby_options="$RUBYOPT"
    unset RUBYOPT
  fi

  __rvm_select_late
  if (( ${rvm_force_flag:-0} == 0 ))
  then __rvm_remove_src_and_ruby
  fi

  if __rvm_install_ruby_try_remote
  then return 0
  else (( $? == 2 )) || return 1 # 2 => continue with compilation
  fi

  __rvm_check_available_space "${rvm_ruby_string}" sources || return $?
  __rvm_check_for_compiler || return $?

  case "${rvm_ruby_interpreter}" in
    opal|macruby|ree|jruby|maglev|rubinius|ironruby|ruby|mruby|topaz|truffleruby)
      ruby_install_type=$rvm_ruby_interpreter
      ;;
    rbx)      ruby_install_type=rubinius ;;
    ir)       ruby_install_type=ironruby ;;
    default)
      rvm_error "a ruby interpreter to install must be specified and not simply 'default'."
      return 1
      ;;
    *)
      rvm_error "Either the ruby interpreter is unknown or there was an error!."
      return 1
      ;;
  esac

  [[ -n "${rvm_configure_env[*]}" ]] || rvm_configure_env=() # zsh can assume empty var => ( '' )

  source "$rvm_scripts_path/functions/manage/${ruby_install_type}"
  ${ruby_install_type}_install || return $?

  # Record the Ruby's configuration to a file, key=value format.
  __rvm_ruby_config_save "$rvm_ruby_home/bin/ruby"
  __rvm_fix_group_permissions "$rvm_ruby_home"

  rvm_hook="after_install"
  source "$rvm_scripts_path/hook"

  if [[ -n "$ruby_options" ]]
  then
    RUBYOPT="$ruby_options"
    export RUBYOPT
  fi
}
scripts/functions/manage/base_remove000066400000011254147511530560013721 0ustar00#!/usr/bin/env bash

source "$rvm_scripts_path/functions/alias"

__rvm_check_default()
{
  \typeset default_ruby_interpreter current_ruby_interpreter
  default_ruby_interpreter="$( alias_show default 2>/dev/null )"
  default_ruby_interpreter="${default_ruby_interpreter%%${rvm_gemset_separator:-"@"}*}"
  current_ruby_interpreter="${rvm_ruby_string%%${rvm_gemset_separator:-"@"}*}"
  if
    [[ -n "$current_ruby_interpreter" ]] &&
    [[ "$current_ruby_interpreter" == "$default_ruby_interpreter" ]]
  then
    __rvm_log_command 'default.restore' \
      "$rvm_ruby_string - #removing default ruby interpreter" \
      alias_delete default
  fi
}

__rvm_remove_ruby()
{
  case "${rvm_ruby_string:-}" in
    (*@*)
      rvm_error "'rvm remove' does not work with gemsets, use '--gems' to remove all gemsets or
'rvm ${rvm_ruby_string%@*} do rvm gemset delete ${rvm_ruby_string#*@}' to remove the '${rvm_ruby_string#*@}' gemset."
      return 1
      ;;
  esac
  rvm_fuzzy_flag=1
  (( ${rvm_ruby_selected_flag:=0} )) || __rvm_select
  [[ -n "${rvm_ruby_string:-}"    ]] ||
  {
    rvm_error "Cannot ${1:-remove} unknown package '$rvm_ruby_string'"
    return 1
  }

  \typeset __removed_counter=0
  __rvm_remove_install_record "$rvm_ruby_string"
  __rvm_remove_src_and_ruby      &&
  case "${1:-remove}" in
    (remove)
      __rvm_remove_gemsets       &&
      __rvm_remove_archives      &&
      __rvm_remove_aliases       &&
      __rvm_remove_wrappers      &&
      __rvm_remove_environments  &&
      __rvm_remove_binaries      &&
      __rvm_remove_ruby_done
      ;;
    (uninstall)
      __rvm_remove_gemsets_check &&
      __rvm_check_default        &&
      __rvm_remove_ruby_done
      ;;
    (reinstall)
      __rvm_remove_gemsets_check
      ;;
  esac
  unset rvm_remove_flag
}

__rvm_remove_ruby_done()
{
  (( __removed_counter )) || rvm_log "$rvm_ruby_string - #already gone"
}

__rvm_remove_src_and_ruby()
{
  \typeset _dir
  for _dir in "${rvm_src_path}" "${rvm_rubies_path}"
  do
    if
      [[ -d "${_dir}/$rvm_ruby_string" ]]
    then
      let __removed_counter+=1
      __rvm_log_command "remove.${_dir##*/}" \
        "$rvm_ruby_string - #removing ${_dir##*/}/$rvm_ruby_string" \
        __rvm_rm_rf "${_dir}/$rvm_ruby_string" ||
        return $?
    else
      rvm_debug "$rvm_ruby_string - #already removed ${_dir##*/}/$rvm_ruby_string"
    fi
  done

  if [[ -e "${rvm_bin_path}/$rvm_ruby_string" ]]
  then \command \rm -f "${rvm_bin_path}/$rvm_ruby_string"
  fi
}

__rvm_remove_gemsets_check()
{
  if (( ${rvm_gems_flag:=0} == 1 ))
  then __rvm_remove_gemsets || return $?
  fi
  true
}

__rvm_remove_path_list_remove()
{
  \typeset __item
  for __item
  do
    printf "Removing ${__item} - "
    __rvm_rm_rf "${__item}" && printf "ok\n" ||
    {
      \typeset __res=$?
      echo "failed\n"
      return ${__res}
    }
  done
}

__rvm_remove_path_list_filter()
{
  __list=()
  \typeset __item
  for __item
  do
    if [[ -e "${__item}" || -L "${__item}" ]]
    then __list+=( "${__item}" )
    fi
  done
}

__rvm_remove_path_list()
{
  \typeset -a __list
  \typeset __type_name="$1"
  shift
  __rvm_remove_path_list_filter "$@"
  if
    (( ${#__list[@]} ))
  then
    let __removed_counter+=1
    __rvm_log_command "remove_${__type_name}" \
      "$rvm_ruby_string - #removing ${__type_name}" \
      __rvm_remove_path_list_remove "${__list[@]}" ||
      return $?
  else
    rvm_debug "$rvm_ruby_string - #already removed ${__type_name}"
  fi
  true
}

__rvm_remove_gemsets()
{
  __rvm_remove_path_list gems "${rvm_gems_path:-"$rvm_path/gems"}/${rvm_ruby_string}"{,@*}
}

__rvm_remove_wrappers()
{
  __rvm_remove_path_list wrappers "$rvm_wrappers_path/$rvm_ruby_string"{,@*} "$rvm_bin_path"/*-"$rvm_ruby_string"
}

__rvm_remove_environments()
{
  __rvm_remove_path_list environments "$rvm_environments_path/$rvm_ruby_string"{,@*}
}

__rvm_remove_aliases()
{
  \typeset alias_name
  \typeset -a aliases

  __rvm_read_lines aliases <(
    __rvm_awk '/'$rvm_ruby_string'/{print}' "$rvm_path/config/alias" | __rvm_sed 's/=.*//'
  )
  if
    (( ${#aliases[@]} ))
  then
    let __removed_counter+=1
    rvm_log "$rvm_ruby_string - #removing aliases"
    for alias_name in "${aliases[@]}"
    do
      # Remove from alias key-value store
      "$rvm_scripts_path/alias" delete "$alias_name" >/dev/null 2>&1
    done
  else
    rvm_debug "$rvm_ruby_string - #already removed aliases"
  fi
}

__rvm_remove_archives()
{
  if (( ${rvm_archive_flag:=0} == 1 ))
  then __rvm_remove_path_list archives "${rvm_archives_path}/${rvm_ruby_package_file:-$rvm_ruby_string}".*
  fi
}

# Iterate over all binaries and check for symlinked wrappers etc.
__rvm_remove_binaries()
{
  __rvm_remove_path_list binaries "${rvm_bin_path:-$rvm_path/bin}"/*"$rvm_ruby_string"{,@*}
}
scripts/functions/manage/rubinius000066400000013144147511530560013272 0ustar00#!/usr/bin/env bash

source "$rvm_scripts_path/functions/osx-ssl-certs"

make_sure_its_enough_ram_for_rbx()
{
  \typeset rvm_rbx_required_ram
  rvm_rbx_required_ram_mb=500

  __rvm_compiler_is_llvm ||
    __rvm_is_enough_ram ${rvm_rbx_required_ram_mb} ||
      rvm_error "For rbx (Rubinius) more than ${rvm_rbx_required_ram_mb}MB of free RAM might be required."
}

rubinius_install_detect_required_ruby()
{
  export ruby

  case "${rvm_ruby_version}" in
    (2.0.0)
      case "${rvm_ruby_patch_level}" in
        (rc1) ruby="ruby-1.9" ;;
        (*)   ruby="ruby-2.2"   ;;
      esac
      ;;

    (2*)
      case "$rvm_ruby_repo_branch" in
        (1.8.7|1.9.3) ruby="ruby-1.9|ruby-2.2" ;;
        (*)           ruby="ruby-2.2"          ;;
      esac
      ;;

    (*)
      ruby="ruby-2.3.1"
      ;;
  esac

  __rvm_ensure_has_mri_ruby "$ruby" || {
      rvm_log "No $ruby found, cannot build rbx."
      return 1
  }

  ruby="$(__rvm_mri_ruby "$ruby")"
}

rubinius_install_ensure_gem()
{
  __rvm_which "$1" >/dev/null &&
  [[ -x "$rvm_wrappers_path/$ruby/$1" ]] ||
  __rvm_log_command "install.${2:-$1}" \
    "$ruby - #install gem ${2:-$1}" \
    gem_install ${2:-$1} &&
  __rvm_which "$1" >/dev/null &&
  [[ -x "$rvm_wrappers_path/$ruby/$1" ]] ||
  return $?
}

rubinius_install_regenerate_binstubs()
{
  gem_install executable-hooks &&
  gem regenerate_binstubs ||
  return $?
}

rubinius_install_ensure_wrappers()
{
  [[ -x "$rvm_wrappers_path/$ruby/ruby" && -x "$rvm_wrappers_path/$ruby/gem" ]] ||
    __rvm_log_command "gemset.wrappers.rubinius" "$ruby - #generating wrappers" \
    run_gem_wrappers regenerate ||
    return $?
  rubinius_install_ensure_gem rake || return $?
  rubinius_install_ensure_gem bundle bundler || return $?
  __rvm_log_command "regenerate_binstubs" \
    "$ruby - #regenerating binstubs" \
    rubinius_install_regenerate_binstubs ||
    return $?
}

rubinius_install_setup_ruby()
{
  if [[ ${rvm_ignore_gemsets_flag:-0} -eq 0 ]]
  then ruby="${ruby}@rubinius"
  fi
  __rvm_with "$ruby" rubinius_install_ensure_wrappers
  __rvm_osx_ssl_certs_ensure_for_ruby "$rvm_wrappers_path/$ruby/ruby"
}

rubinius_install()
{
  rubinius_install_detect_required_ruby || return $?

  make_sure_its_enough_ram_for_rbx

  \typeset rvm_configure_args
  \typeset -a rvm_ruby_configure
  unset CFLAGS LDFLAGS ARCHFLAGS # Important.
  unset GEM_HOME GEM_PATH MY_RUBY_HOME IRBRC RBXOPT
  export PATH
  rvm_ruby_make=""

  __rvm_setup_compile_environment "${rvm_ruby_string}" || return $?
  __rvm_remove_rvm_from_path
  __rvm_conditionally_add_bin_path

  rubinius_install_setup_ruby || return $?

  __rvm_fetch_ruby || return $?

  __rvm_cd "${rvm_src_path}/$rvm_ruby_string"

  chmod +x ./configure

  __rvm_apply_patches ||
  {
    result=$?
    rvm_error "There has been an error while trying to apply patches to rubinius.  \nHalting the installation."
    return $result
  }
  rvm_configure_flags=( --prefix="$rvm_ruby_home"  "${rvm_configure_flags[@]}" )

  __rvm_db "${rvm_ruby_interpreter}_configure_flags" "db_configure_flags"
  if [[ -n "${ZSH_VERSION:-}" ]]
  then rvm_configure_flags=( ${=db_configure_flags} "${rvm_configure_flags[@]}" )
  else rvm_configure_flags=( ${db_configure_flags}  "${rvm_configure_flags[@]}" )
  fi

  # Explicitly disabled
  (( ${rvm_llvm_flag:=1} )) || rvm_configure_flags+=( --disable-llvm )

  if
    [[ -f "Gemfile" ]]
  then
    __rvm_log_command "bundle" "$ruby - #bundle install" "$rvm_wrappers_path/$ruby/bundle" install ||
      return $?
  fi
  if
    [[ -f "$HOME/.gem/credentials" && -w "$HOME/.gem/credentials" ]]
  then
    chmod 600 "$HOME/.gem/credentials"
  fi
  __rvm_log_command "configure" "$rvm_ruby_string - #configuring" \
    env "${rvm_configure_env[@]}" $rvm_wrappers_path/$ruby/ruby ./configure "${rvm_configure_flags[@]}" ||
    return $?

  if [[ -n "${rvm_configure_args:-}" ]]
  then rvm_ruby_make="CONFIGURE_ARGS=${rvm_configure_args## } "
  fi

  __setup_lang_fallback
  __rvm_log_command rake "$rvm_ruby_string - #compiling" \
    "${rvm_ruby_make:-}$rvm_wrappers_path/$ruby/rake" install --trace ||
    return $?
  [[ -d "$rvm_ruby_home" && -f "$rvm_ruby_home/bin/rbx" ]] ||
  {
    result=$?
    rvm_error "Rubinius reported it was installed successfully, but RVM could not find proper installation,
please check why '$rvm_ruby_home/bin/rbx' was not created,
maybe here '$rvm_log_path/$rvm_ruby_string/rake.log',
also make sure to report an error here 'https://github.com/rubinius/rubinius/issues'
about not returning non zero status in case of errors."
    return $result
  }
  unset ruby

  # Symlink rubinius wrapper if not available
  [[ -f "$rvm_ruby_home/bin/ruby" ]] ||
    ln -fs "$rvm_ruby_home/bin/rbx" "$rvm_ruby_home/bin/ruby"

  # remove the rdoc link, the gem is not builtin
  if [[ -f "$rvm_ruby_home/bin/rdoc" ]]
  then rm -f "$rvm_ruby_home/bin/rdoc"
  fi

  case ${rvm_ruby_string} in
    rbx-head*|rubinius-head*|rbx-2.*|rubinius-2.*)
      binaries=()
      ;;
    *) # older rbx had issues
      # Install IRB Wrapper on Rubinius.
      file_name="$rvm_ruby_home/bin/irb"
      \command \rm -f "$file_name"
      printf "%b" '#!/usr/bin/env bash\n' > "$file_name"
      printf "%b" "exec '$rvm_ruby_home/bin/rbx' 'irb' \"\$@\"\n" >> "$file_name"
      [[ -x "$file_name" ]] || chmod +x "$file_name"

      # Install Gem Wrapper on Rubinius.
      file_name="$rvm_ruby_home/bin/gem"
      __rvm_cp -f "$rvm_ruby_home/lib/bin/gem.rb" "$file_name"
      __rvm_inject_ruby_shebang "$file_name"
      [[ -x "$file_name" ]] || chmod +x "$file_name"
      unset file_name
      binaries=(erb ri)
      ;;
  esac

  __rvm_initial_gemsets_create "$rvm_ruby_home/bin/ruby" &&
  __rvm_post_install &&
  __rvm_fetch_ruby_cleanup
}
scripts/functions/manage/base_install_patches000066400000010146147511530560015600 0ustar00#!/usr/bin/env bash

# Emits a number of patches to STDOUT, each on a new line
# Expands patchsets etc.
#TODO: Lookup default patches on rvm_ruby_string heirarchy.
__rvm_current_patch_names()
{
  \typeset -a expanded_names patches_to_check
  \typeset _variable patch_level_separator level name expanded_name
  _variable="${1:-}"
  # Need variable for ${x%...}
  patch_level_separator="%"

  if (( ${#rvm_patch_names[@]} ))
  then patches_to_check=( "${rvm_patch_names[@]}" )
  else patches_to_check=( optional )
  fi
  patches_to_check+=( default ${_system_name_lowercase} )

  for name in "${patches_to_check[@]}"
  do
    [[ -n "${name:-}" ]] || continue

    if __rvm_string_match "${name}" "*${patch_level_separator}*"
    then level="${name##*${patch_level_separator}}"
    else level=1
    fi

    name="${name%${patch_level_separator}*}"
    __rvm_read_lines expanded_names <( __rvm_expand_patch_name "$name" "$level" )

    rvm_debug "Patch name '$name', expanded_name(s) '${expanded_names[*]}'."

    for expanded_name in "${expanded_names[@]}"
    do
      [[ -z "${expanded_name}" ]] || eval "${_variable}+=( \"\${expanded_name}\" )"
    done
  done
}

__rvm_apply_patches()
{
  \typeset patch_name patch_level_separator patch_fuzziness patch_level source_directory full_patch_path _save_dir
  \typeset -a patches
  patches=()
  patch_level_separator="%"
  patch_fuzziness="25" # max fuziness that makes sense is 3 (or there are patches with bigger context ?)
  result=0
  source_directory="${1:-"${rvm_src_path}/$rvm_ruby_string"}"
  (( $# == 0 )) || shift

  _save_dir="$PWD"
  __rvm_cd "$source_directory"
  case "${1:-all}" in
    (all) __rvm_current_patch_names patches ;;
    (*) patches=( "$@" ) ;;
  esac
  rvm_debug "All found patches(${#patches[*]}): ${patches[*]}."

  if
    [[ -n "${rvm_ruby_name:-${detected_rvm_ruby_name:-}}" ]] &&
    [[ "${rvm_configure_flags[*]}${patches[*]}" == "" ]]
  then
    rvm_error "\
Warning: Installing named ruby without patches, you might need to consider adding extra flags/patches like:
    --patch falcon
    --patch railsexpress
    --patch float_warnings
Options starting: '--with*' '--disable*' '--enable*' are passed to rubys './configure', also anything after '--'."
  fi

  for patch_name in "${patches[@]}"
  do
    if __rvm_string_match "${patch_name}" "*${patch_level_separator}*"
    then patch_level="${patch_name##*${patch_level_separator}}"
    else patch_level=1
    fi
    patch_name="${patch_name%${patch_level_separator}*}"

    full_patch_path="$(__rvm_lookup_full_patch_path "$patch_name")"
    rvm_debug "Patch full path '$full_patch_path'."
    if
      [[ -z "${full_patch_path:-}" ]]
    then
      rvm_warn "Patch '$patch_name' not found."
      result=1
    elif
      ! __rvm_apply_patch "${patch_name}" "$full_patch_path" "$patch_fuzziness" "$patch_level"
    then
      result=1
    fi
  done
  __rvm_cd "${_save_dir}"
  return ${result:-0}
}

__rvm_apply_patch_prepare()
{
  if
    __rvm_string_match "${_full_patch_path}" "http://*" "https://*"
  then
    _local_patch_path="$(
      mktemp ${TMPDIR:-/tmp}/tmp.XXXXXXXXXXXXXXXXXX
    )"
    rvm_log "Fetching patch ${_full_patch_path}"
    __rvm_curl --create-dirs -sS -C - -o "${_local_patch_path}" "${_full_patch_path}"
  else
    _local_patch_path="${_full_patch_path}"
  fi
}

__rvm_apply_patch_remove()
{
  if
    __rvm_string_match "${_full_patch_path}" "http://*" "https://*"
  then
    \command \rm -f "${_local_patch_path}"
  fi
}

__rvm_apply_patch()
{
  \typeset _patch_name _full_patch_path _local_patch_path _patch_fuzziness _patch_level
  _patch_name="$1"
  _full_patch_path="$2"
  _patch_fuzziness="$3"
  _patch_level="$4"

  if
    [[ -r "patches.list" ]] &&
    __rvm_grep "${_patch_name}" "patches.list" >/dev/null
  then
    rvm_warn "Patch ${_patch_name} was already applied."
  else
    __rvm_apply_patch_prepare
    touch "patches.list"
    __rvm_log_command "patch.apply.${_patch_name##*\/}" "$rvm_ruby_string - #applying patch ${_full_patch_path}" \
      __rvm_patch -F ${_patch_fuzziness} -p${_patch_level} -N -f -i "${_local_patch_path}" &&
    printf "%b" "${_patch_name}\n" >> "patches.list"
    __rvm_apply_patch_remove
  fi
}
scripts/functions/manage/maglev000066400000007311147511530560012704 0ustar00#!/usr/bin/env bash

maglev_install()
{
  __rvm_ensure_has_mri_ruby
  compatible_ruby="$(__rvm_mri_ruby)"

  rvm_log "Running MagLev prereqs checking script."

  "$rvm_scripts_path/maglev" ||
  {
    result=$?
    rvm_error "Prerequisite checks have failed. \nHalting the installation."
    return $result
  }

  __rvm_cd "${rvm_src_path}"

  if
    [[ ! -d "${rvm_src_path}/$rvm_ruby_string" ]] ||
    (( ${rvm_head_flag:=0} == 1 ))
  then
    __rvm_fetch_ruby ||
    {
      result=$?
      rvm_error "There has been an error while trying to fetch the source.  \nHalting the installation."
      exit $result
    }
  fi

  system="${_system_type}"
  arch="${_system_arch}"
  if [[ "${system}-${arch}" == "Darwin-x86_64" ]]
  then arch="i386"
  fi

  if
    (( ${rvm_head_flag:=0} == 1 ))
  then
    __rvm_cd "${rvm_src_path}/$rvm_ruby_string"

    rvm_gemstone_package_file="GemStone-$(__rvm_grep "^GEMSTONE" version.txt | cut -f2 -d-).${system}-${arch}"

    rvm_gemstone_url="$maglev_url/${rvm_gemstone_package_file}.${rvm_archive_extension}"
  fi

  rvm_log "Downloading the GemStone package, this may take a while depending on your connection..."

  "$rvm_scripts_path/fetch" "$rvm_gemstone_url" ||
  {
    result=$?
    rvm_error "There has been an error while trying to fetch the GemStone package.\nHalting the installation."
    return $result
  }

  __rvm_cd "${rvm_src_path}"

  if [[ -s "$rvm_ruby_package_file" ]]
  then \command \mv "$rvm_ruby_package_file" "${rvm_src_path}/$rvm_ruby_string"
  fi

  __rvm_cd "${rvm_src_path}/$rvm_ruby_string"

  if
    [[ -d "${rvm_src_path}/${rvm_gemstone_package_file}" ]]
  then
    __rvm_log_command "gemstone.fix_rights" \
      "Fixing gemstone rights" \
      chmod -R u+w "${rvm_src_path}/${rvm_gemstone_package_file}"
  else
    mkdir -p "${rvm_src_path}/${rvm_gemstone_package_file}"
  fi

  __rvm_log_command "extract" \
    "$rvm_ruby_string - #extracting $rvm_gemstone_package_file to ${rvm_src_path}" \
    __rvm_package_extract "${rvm_archives_path}/$rvm_gemstone_package_file.$rvm_archive_extension" "${rvm_src_path}" ||
  case $? in
    199)
      rvm_error "\nUnrecognized archive format '$archive_format'"
      return 199
      ;;
    *)
      rvm_error "There has been an error while trying to extract the source. Halting the installation."
      return 1
      ;;
  esac

  ln -fs "${rvm_src_path}/$rvm_gemstone_package_file" "gemstone"

  __rvm_rm_rf $rvm_ruby_home

  __rvm_log_command "install" \
    "Installing maglev to $rvm_ruby_home" \
    __rvm_cp -Rf "${rvm_src_path}/$rvm_ruby_string" "$rvm_ruby_home"

  (
    __rvm_cd "$rvm_ruby_home/bin/"

    for binary in maglev-irb maglev-ruby maglev-gem
    do
      ln -fs "$binary" "${binary#maglev-}"
    done
    unset binary
  )

  __rvm_cd "$rvm_ruby_home"

  if
    (( ${rvm_head_flag:=0} == 1 ))
  then
    \command \git submodule update --init
    "$rvm_ruby_home/bin/maglev" force-reload
  fi

  ln -fs maglev.demo.key-${system}-${arch} etc/maglev.demo.key

  __rvm_log_command "build:maglev" \
    "Bootstrapping a new image" \
    "$rvm_wrappers_path/$compatible_ruby/rake" "build:maglev"

  [[ -e ${rvm_ruby_home}/etc/conf.d/maglev.conf ]] ||
  __rvm_log_command "stone.create" \
    "Creating default 'maglev' repository." \
    "$rvm_wrappers_path/$compatible_ruby/rake" "stone:create[maglev]" >/dev/null 2>&1

  __rvm_log_command "rdoc" \
    "Generating maglev HTML documentation" \
    "$rvm_wrappers_path/$compatible_ruby/rake" rdoc >/dev/null 2>&1

  __rvm_log_command "stwrappers" \
    "Generating smalltalk FFI." \
    "$rvm_wrappers_path/$compatible_ruby/rake" stwrappers >/dev/null 2>&1

  unset compatible_ruby

  __rvm_initial_gemsets_create_without_rubygems "$rvm_ruby_home/bin/ruby" &&
  __rvm_irbrc &&
  __rvm_fetch_ruby_cleanup
}
scripts/functions/manage/truffleruby000066400000002166147511530560014005 0ustar00#!/usr/bin/env bash

truffleruby_post_install_hook()
{
  # Run the TruffleRuby post-install hook
  __rvm_log_command "cext" "${rvm_ruby_string} - #compiling c-extensions" \
    "$1/lib/truffle/post_install_hook.sh"
}

truffleruby_install()
{
  __rvm_setup_compile_environment "${rvm_ruby_string}" || return $?

  __rvm_cd "${rvm_src_path}"

  __rvm_fetch_ruby || return $?

  __rvm_cd "${rvm_src_path}/${rvm_ruby_string}"

  __rvm_apply_patches

  __rvm_rm_rf "${rvm_ruby_home}" && \command \mkdir -p "$(dirname "${rvm_ruby_home}")" &&
  __rvm_log_command "install" "${rvm_ruby_string} - #installing to ${rvm_ruby_home}" \
    __rvm_cp -Rf "${rvm_src_path}/${rvm_ruby_string}" "${rvm_ruby_home}" || return $?

  __rvm_cd "${rvm_ruby_home}"

  truffleruby_post_install_hook "${rvm_ruby_home}"

  # Avoid updating RubyGems for now as it seems fragile
  rvm_rubygems_version="ignore"
  __rvm_initial_gemsets_create "$rvm_ruby_home/bin/ruby"

  __rvm_post_install

  __rvm_fetch_ruby_cleanup

  rvm_log "RVM gem rubygems-bundler is not installed by default for TruffleRuby."
  rvm_log "Use 'bundle exec' instead when needed. See rvm/rvm#4765."
}
scripts/functions/build_undesired_helpers000066400000003411147511530560015061 0ustar00#!/usr/bin/env bash

undesired_check()
{
  \typeset _package_name

  if
    is_a_function "requirements_${__lib_type}_lib_installed"
  then
    for _package_name in "$@"
    do __rvm_filter_undesired_package_check "requirements_${__lib_type}_lib_installed" "${_package_name}"
    done
  else
    echo "RVM does not support checking for undesired packages for this platform (${_system_name})"
    exit 1
  fi

  true
}

__rvm_filter_undesired_package_check()
{
  if
    "$1" "$2"
  then
    case "$rvm_autolibs_flag_number" in
      (0|1|2) __rvm_add_once packages_undesired "$2" ;; # just ignore
      (*)     __rvm_add_once packages_to_remove "$2" ;; # 2+
    esac
  fi
}

__rvm_requirements_run_remove()
{
  (( ${#packages_to_remove[@]} )) || return 0
  if
    is_a_function requirements_${__lib_type}_lib_remove
  then
    \typeset __package
    for __package in "${packages_to_remove[@]}"
    do
      __rvm_log_command package_remove_${__package} "Removing undesired package: ${__package}" \
        "requirements_${__lib_type}_lib_remove" "${__package}" ||
      {
        \typeset __status=$?
        _list="${packages_to_remove[*]}"
        rvm_warn "Failed package removal: ${__package} of: ${_list// /, }."
        return ${__status}
      }
    done
  elif
    is_a_function requirements_${__lib_type}_libs_remove
  then
    _list="${packages_to_remove[*]}"
    __rvm_log_command package_remove_${_list// /_} "Removing undesired packages: ${_list// /, }" \
      "requirements_${__lib_type}_libs_remove" "${packages_to_remove[@]}" ||
      return $?
  else
    rvm_error "\nRVM does not support removing undesired packages for this platform (${_system_name})"
    rvm_error "You need to manually uninstall following packages before continue:\n\n\t${packages_to_remove}\n"
    exit 1
  fi
}
scripts/functions/build_config000077500000025767147511530560012647 0ustar00#!/usr/bin/env bash

__rvm_setup_compile_environment()
{
  \typeset __type
  \typeset -a __types
  __types=(
    setup movable_early system_early requirements
    movable parse_name system architectures gcc47plus bison
    flags_docs flags_shared_static flags_threads compatibility_flag
  )
  for __type in "${__types[@]}"
  do
    rvm_debug "__rvm_setup_compile_environment_${__type} $1"
    __rvm_setup_compile_environment_${__type} "$1" || return $?
  done
  rvm_debug "found compiler: $( __rvm_found_compiler )"
}

__rvm_setup_compile_environment_setup()
{
  __rvm_autolibs_get
  rvm_debug "rvm_autolibs_flag=${rvm_autolibs_flag}"

  __rvm_autolibs_translate || return $?
  [[ -n "${rvm_autolibs_flag_number:-}" ]] || return $?

  export initially_selected_compiler="$( __rvm_selected_compiler )"
  true
}

__rvm_setup_compile_environment_movable_early()
{
  (( ${rvm_movable_flag:-0} > 0 ))  || return 0
  case "${_system_type}" in
    (BSD)
      rvm_error "It is not yet supported to build movable rubies on *BSD systems."
      return 3
      ;;
    (Darwin)
      case "$1" in
        ruby-2*|ruby-head*) true ;;
        (*)
          if
            (( ${rvm_force_flag:-0} > 0 ))
          then
            true # allow forcing installation of older rubies
          else
            rvm_error "Only MRI Ruby 2.0+ can be compiled movable with RVM on OSX,
use '--force' if the binary will be moved to the same installation path."
            return 2
          fi
          ;;
      esac
      [[ "${rvm_autolibs_flag_runner}" == "smf" ]] ||
      {
        rvm_error "It is not yet supported to build movable rubies with '${rvm_autolibs_flag}',
please install SMF and switch autolibs to it (make sure to follow any displayed instructions):

    curl -L https://get.smf.sh | sh
    rvm autolibs smf
"
        return 3
      }
      export rvm_static_flag=1
      ;;
    (*)
      case "$1" in
        ruby-1.9.3*|ruby-2*|ruby-3*|ruby-head*) true ;;
        (*)
          rvm_error "Only MRI Ruby 1.9.3+ can be compiled movable with RVM"
          return 2
          ;;
      esac
      ;;
  esac
}

__rvm_setup_compile_environment_system_early()
{
  if   is_a_function __rvm_setup_compile_environment_system_early_${_system_name}
  then __rvm_setup_compile_environment_system_early_${_system_name} "$@" || return $?
  fi
}

#
# rvm_autolibs_flag
# - 0 - disabled
# - 1 - use libs, do not install
# - 2 - use libs, fail if missing - default
# - 3 - use libs, install if missing, fallback to 2 if brew not writable
# - 4 - 3 + install package manager if not available
#
__rvm_setup_compile_environment_requirements()
{
  (( ${rvm_autolibs_flag_number} > 0 ))  || return 0
  rvm_log "Checking requirements for ${rvm_autolibs_flag_runner}."
  if
    __rvm_requirements_run ${rvm_autolibs_flag_runner} "$@"
  then
    rvm_log "Requirements installation successful."
  else
    \typeset __status=$?
    [[ ${rvm_quiet_flag} == 1 ]] || rvm_error "Requirements installation failed with status: ${__status}."
    return ${__status}
  fi
}

__rvm_setup_compile_environment_parse_name()
{
  case "${rvm_ruby_name:-}" in
    (clang) true ${CC:=clang} ;;
  esac
}

__rvm_setup_compile_environment_movable()
{
  (( ${rvm_movable_flag:-0} > 0 ))  || return 0
  case "${_system_type}" in
    (Darwin)
      rvm_configure_flags+=(
        --enable-load-relative --with-static-linked-ext
        --with-out-ext=dl/win32,fiddle/win32,tk/tkutil,tk,win32ole,-test-/win32/dln,-test-/win32/fd_setsize
      )
      rvm_patch_names+=( osx_static )
      ;;
    (*)
      rvm_configure_flags+=( --enable-load-relative )
      ;;
  esac
  rvm_configure_flags+=( --sysconfdir=/etc )
}

__rvm_setup_compile_environment_bison()
{
  (( ${rvm_autolibs_flag_number} > 1 )) || return 0
  case "$1" in
    (ruby*|ree*|rbx*)
      __rvm_check_for_bison ||
      {
        result=$?
        rvm_error "Bison required but not found. Halting."
        return $result
      }
      ;;
  esac
}

__rvm_setup_compile_environment_architectures_osx_map()
{
  \typeset _architecture
  \typeset _prefix="${1:-}"
  \typeset -a _architectures
  _architectures=()
  for _architecture in "${rvm_architectures[@]}"
  do
    case "${_architecture}" in
      (32)  _architecture="i386"   ;;
      (64)  _architecture="x86_64" ;;
    esac
    _architectures+=( "${_prefix}${_architecture}" )
  done
  rvm_architectures=( "${_architectures[@]}" )
}

__rvm_setup_compile_environment_architectures_ruby_osx()
{
  \typeset -a _flags
  _flags=(
    MACOSX_DEPLOYMENT_TARGET="$( sw_vers -productVersion | __rvm_awk -F'.' '{print $1"."$2}' )"
    CFLAGS="$1 -g -Os -pipe -no-cpp-precomp"
    CCFLAGS="$1 -g -Os -pipe"
    CXXFLAGS="$1 -g -Os -pipe"
    LDFLAGS="$1 -bind_at_load"
    LDSHARED="cc $1 -dynamiclib -undefined suppress -flat_namespace"
  )
  __rvm_update_configure_env "${_flags[@]}"
  __rvm_array_contains "*osx-arch-fix*" "${rvm_patch_names[@]}" || rvm_patch_names+=( osx-arch-fix )
}

__rvm_setup_compile_environment_architectures_OSX()
{
  case "$1" in
    ruby-1.9*|ruby-2*|ruby-head*)
      # Ruby 1.9+ supports the easy way
      __rvm_setup_compile_environment_architectures_osx_map
      rvm_configure_flags+=( --with-arch="${rvm_architectures[*]}" )
      ;;
    ruby*|ree*)
      __rvm_setup_compile_environment_architectures_osx_map "-arch "
      __rvm_setup_compile_environment_architectures_ruby_osx "${rvm_architectures[*]}"
      ;;
    (*)
      __rvm_setup_compile_environment_architectures_osx_map "-arch "
      __rvm_update_configure_env_arch "${rvm_architectures[*]}"
      rvm_configure_flags+=( --disable-dependency-tracking )
      ;;
  esac
}

__rvm_setup_compile_environment_architectures_Other()
{
  (( ${#rvm_architectures[@]} == 1 )) ||
  {
    rvm_error "Only OSX supports fat binaries, any other system supports only single architecture, please be more specific."
    return 1
  }
  \typeset _architecture
  case  "${rvm_architectures[*]}" in
    (i386)   _architecture=( -m32 ) ;;
    (x86_64) _architecture=( -m64 ) ;;
    (32|64)  _architecture=( -m${rvm_architectures[*]}      ) ;;
    (*)      _architecture=( -march=${rvm_architectures[*]} ) ;;
  esac
  __rvm_update_configure_env_arch ${_architecture}

  # Ruby 2+ supports also platform setting needed for different os/kernel architectures, see #2928
  case "$1" in
    ruby-2*|ruby-head*)
      case  "${rvm_architectures[*]}" in
        (32|i386)   rvm_configure_flags+=( --with-arch="i686"   ) ;;
        (64|x86_64) rvm_configure_flags+=( --with-arch="x86_64" ) ;;
      esac
      ;;
  esac
}

__rvm_setup_compile_environment_architectures()
{
  rvm_debug "rvm_architectures(${#rvm_architectures[@]}):${rvm_architectures[*]}."
  (( ${#rvm_architectures[@]} > 0 )) || return 0
  if   is_a_function __rvm_setup_compile_environment_architectures_${_system_name}
  then __rvm_setup_compile_environment_architectures_${_system_name} "$@" || return $?
  else __rvm_setup_compile_environment_architectures_Other           "$@" || return $?
  fi
}

__rvm_setup_compile_environment_gcc47plus()
{
  __rvm_compiler_version_or_higher "4.7"      || return 0
  __rvm_string_match "$1" "ruby-1.8.*" "ree*" || return 0

  # -g -O2 from 1.8.7-p370 is not enough, need all the flags to fix it
  __rvm_update_configure_env CFLAGS="-O2 -fno-tree-dce -fno-optimize-sibling-calls"
}

__rvm_setup_compile_environment_system()
{
  if   is_a_function __rvm_setup_compile_environment_system_${_system_name}
  then __rvm_setup_compile_environment_system_${_system_name} "$@" || return $?
  elif is_a_function __rvm_setup_compile_environment_system_${_system_type}
  then __rvm_setup_compile_environment_system_${_system_type} "$@" || return $?
  fi
}

__rvm_setup_compile_environment_flags_docs()
{
  # disable docs, see https://github.com/rvm/rvm/issues/2656
  # enable docs on OSX by default (that's development system)
  # if [[ "Darwin" == "${_system_type}" ]]
  # then : rvm_docs_flag=${rvm_docs_flag:=1}
  # fi

  # handle docs flag, docs are enabled by default, lets disable this
  (( ${rvm_docs_flag:-0} == 1 )) ||
  {
    case "$1" in
      (ruby*|ree*) rvm_configure_flags+=( --disable-install-doc ) ;;
    esac
  }
  true # OSX --trace FIX
}

__rvm_setup_compile_environment_flags_static_darwin()
{
  if
    [[ "${_system_type}" == "Darwin" ]]
  then
    __rvm_update_configure_env CFLAGS="-fPIC -mmacosx-version-min=10.7" LDFLAGS="-fPIC" "$@"
    rvm_configure_flags+=( --with-arch=x86_64 )
  fi
}

__rvm_setup_compile_environment_flags_shared_static()
{
  if
    (( ${rvm_static_flag:-0} == 1 ))
  then
    case "$1" in
      (openssl*)
        rvm_configure_flags+=( no-shared )
        __rvm_setup_compile_environment_flags_static_darwin
        ;;
      (ncurses*)
        rvm_configure_flags+=( --without-shared )
        __rvm_setup_compile_environment_flags_static_darwin
        ;;
      (rbx*|rubinius*|jruby*)
        true # no flag yet for rbx, does not apply to jruby!
        ;;
      (*)
        rvm_configure_flags+=( --disable-shared )
        __rvm_setup_compile_environment_flags_static_darwin LDFLAGS="-Bstatic -lz"
        ;;
    esac
  else
    case "$1" in
      (openssl*)
        rvm_configure_flags+=( shared )
        ;;
      (readline*)
        rvm_configure_flags+=( --disable-static --enable-shared )
        ;;
      (ncurses*)
        rvm_configure_flags+=( --with-shared )
        ;;
      (rbx*|rubinius*|jruby*)
        true # no flag yet for rbx, does not apply to jruby!
        ;;
      (*)
        [[ "${rvm_configure_flags[*]}" == *--disable-shared* ]] ||
          rvm_configure_flags+=( --enable-shared )
        ;;
    esac
  fi
  true # OSX --trace FIX
}

__rvm_detect_max_threads()
{
  case "${_system_name}" in
    (OSX|Darwin|FreeBSD|DragonFly)
      if
        __rvm_which sysctl >/dev/null
      then
        \command \sysctl -n hw.ncpu
      elif
        [[ -x /usr/sbin/sysctl ]]
      then
        /usr/sbin/sysctl -n hw.ncpu
      elif
        [[ -x /sbin/sysctl ]]
      then
        /sbin/sysctl -n hw.ncpu
      else
        echo 1
      fi
      ;;
    (*)
      \command \cat /proc/cpuinfo 2>/dev/null | (\command \grep vendor_id || \command \echo 'one';) | \command \wc -l
      ;;
  esac
}

__rvm_setup_compile_environment_flags_threads()
{
  case "$1" in
    (openssl*)
      # Don't use -j option for make OpenSSL
      __rvm_remove_from_array rvm_make_flags "-j*" "${rvm_make_flags[@]}"
      rvm_make_flags+=( -j1 )
      ;;
    (*)
      if [[ "${_system_name}" == "FreeBSD" || "${_system_name}" == "DragonFly" ]]
      then rvm_make_flags+=( -B )
      fi
      if [[ " ${rvm_make_flags[*]}" == *" -j"* ]]
      then rvm_warn "Found user configured '-j' flag in 'rvm_make_flags', please note that RVM can detect number of CPU threads and set the '-j' flag automatically if you do not set it."
      else rvm_make_flags+=( -j$(__rvm_detect_max_threads) )
      fi
      ;;
  esac
}

__rvm_setup_compile_environment_compatibility_flag()
{
  case "$1" in
    (jruby*)
      for mode in 2.1 2.0 1.9 1.8
      do
        eval "
          if
            [[ \${rvm_${mode//./}_flag:-0} == 1 ]]
          then
            rvm_configure_flags+=( -Djruby.default.ruby.version=${mode} )
            break
          fi
        "
      done
      ;;
  esac
}
scripts/functions/logging000066400000012375147511530560011635 0ustar00#!/usr/bin/env bash

__rvm_set_color_single()
{
  case "$1" in
    # emphasized (bolded) colors
    (bold)     __buffer+='7' ;;
    (offbold)  __buffer+='27' ;;

    # regular colors
    (black)    __buffer+='30' ;;
    (red)      __buffer+='31' ;;
    (green)    __buffer+='32' ;;
    (yellow)   __buffer+='33' ;;
    (blue)     __buffer+='34' ;;
    (magenta)  __buffer+='35' ;;
    (cyan)     __buffer+='36' ;;
    (white)    __buffer+='37' ;;
    (default)  __buffer+='39' ;;

    # intense (bright) colors
    (iblack)    __buffer+='30;1' ;;
    (ired)      __buffer+='31;1' ;;
    (igreen)    __buffer+='32;1' ;;
    (iyellow)   __buffer+='33;1' ;;
    (iblue)     __buffer+='34;1' ;;
    (imagenta)  __buffer+='35;1' ;;
    (icyan)     __buffer+='36;1' ;;
    (iwhite)    __buffer+='37;1' ;;

    # background colors
    (bblack)   __buffer+='40' ;;
    (bred)     __buffer+='41' ;;
    (bgreen)   __buffer+='42' ;;
    (byellow)  __buffer+='43' ;;
    (bblue)    __buffer+='44' ;;
    (bmagenta) __buffer+='45' ;;
    (bcyan)    __buffer+='46' ;;
    (bwhite)   __buffer+='47' ;;
    (bdefault) __buffer+='49' ;;

    # Reset
    (*)        __buffer+='0' ;;
  esac
}

__rvm_set_color()
{
  \typeset __buffer __variable

  __buffer=$'\E['
  __variable="$1"
  shift

  while
    (( $# ))
  do
    __rvm_set_color_single "$1"
    shift

    if (( $# ))
    then __buffer+=';'
    fi
  done

  __buffer+='m'

  if [[ "${__variable}" == "" || "${__variable}" == "print" ]]
  then printf "${__buffer}"
  else eval "${__variable}='${__buffer}'"
  fi
}

# check if user wants colors and if output goes to terminal
# rvm_pretty_print_flag:
# - 0|no    - disabled always
# - 1|auto  - automatic depending if the output goes to terminal (default)
# - 2|force - forced always
# to select which terminal output should be checked use first param:
# - stdout - for stdout (default)
# - stderr - for stderr
# - number - for the given terminal fd
# - else   - for both stdout and stderr
rvm_pretty_print()
{
  case "${rvm_pretty_print_flag:=auto}" in
    (0|no)
      return 1
      ;;

    (1|auto)
      case "${TERM:-dumb}" in
        (dumb|unknown) return 1 ;;
      esac

      case "$1" in
        (stdout) [[ -t 1           ]] || return 1 ;;
        (stderr) [[ -t 2           ]] || return 1 ;;
        ([0-9])  [[ -t $1          ]] || return 1 ;;
        (any)    [[ -t 1  || -t 2  ]] || return 1 ;;
        (*)      [[ -t 1  && -t 2  ]] || return 1 ;;
      esac
      return 0
      ;;

    (2|force)
      return 0
      ;;
  esac
}

__rvm_set_colors()
{
  case "${TERM:-dumb}" in
    (dumb|unknown)
      rvm_error_clr=""
      rvm_warn_clr=""
      rvm_debug_clr=""
      rvm_notify_clr=""
      rvm_code_clr=""
      rvm_comment_clr=""
      rvm_reset_clr=""
      ;;
    (*)
      __rvm_set_color rvm_error_clr   "${rvm_error_color:-red}"
      __rvm_set_color rvm_warn_clr    "${rvm_warn_color:-yellow}"
      __rvm_set_color rvm_debug_clr   "${rvm_debug_color:-magenta}"
      __rvm_set_color rvm_notify_clr  "${rvm_notify_color:-green}"
      __rvm_set_color rvm_code_clr    "${rvm_code_color:-blue}"
      __rvm_set_color rvm_comment_clr "${rvm_comment_color:-iblack}"
      __rvm_set_color rvm_reset_clr   "${rvm_reset_color:-reset}"
      ;;
  esac
}

__rvm_replace_colors()
{
  \typeset ___text

  ___text="${1//<error>/$rvm_error_clr}"
  ___text="${___text//<warn>/$rvm_warn_clr}"
  ___text="${___text//<debug>/$rvm_debug_clr}"
  ___text="${___text//<notify>/$rvm_notify_clr}"
  ___text="${___text//<code>/$rvm_code_clr}"
  ___text="${___text//<comment>/$rvm_comment_clr}"
  ___text="${___text//<log>/$rvm_reset_clr}"

  ___text="${___text//<\/error>/$rvm_reset_clr}"
  ___text="${___text//<\/warn>/$rvm_reset_clr}"
  ___text="${___text//<\/debug>/$rvm_reset_clr}"
  ___text="${___text//<\/notify>/$rvm_reset_clr}"
  ___text="${___text//<\/code>/$rvm_reset_clr}"
  ___text="${___text//<\/comment>/$rvm_reset_clr}"
  ___text="${___text//<\/log>/$rvm_reset_clr}"

  printf "%b" "${___text}$rvm_reset_clr"
}

rvm_printf_to_stderr()
{
  printf "$@" >&6
}

rvm_error()
{
  if rvm_pretty_print stderr
  then __rvm_replace_colors "<error>$*</error>\n" >&6
  else printf "%b" "$*\n" >&6
  fi
}

rvm_help()
{
  "${rvm_scripts_path}/help" "$@"
}

rvm_error_help()
{
  rvm_error "$1"
  shift
  rvm_help "$@"
}

rvm_fail()
{
  rvm_error "$1"
  exit "${2:-1}"
}

rvm_warn()
{
  if rvm_pretty_print stderr
  then __rvm_replace_colors "<warn>$*</warn>\n" >&6
  else printf "%b" "$*\n" >&6
  fi
}

rvm_notify()
{
  if rvm_pretty_print stdout
  then __rvm_replace_colors "<notify>$*</notify>\n"
  else printf "%b" "$*\n"
  fi
}

rvm_log()
{
  [[ ${rvm_quiet_flag} == 1 ]] && return

  printf "%b" "$*\n"
}

rvm_debug()
{
  (( ${rvm_debug_flag:-0} )) || return 0

  if rvm_pretty_print stderr
  then __rvm_replace_colors "<debug>$*</debug>\n" >&6
  else printf "%b" "$*\n" >&6
  fi
}

rvm_debug_stream()
{
  if (( ${rvm_debug_flag:-0} == 0 && ${rvm_trace_flag:-0} == 0 ))
  then cat - >/dev/null # suppress output when not debugging/tracing
  elif rvm_pretty_print stdout
  then \command \cat - | __rvm_awk '{print "'"${rvm_debug_clr:-}"'"$0"'"${rvm_reset_clr:-}"'"}' >&6
  else \command \cat - >&6
  fi
}

rvm_verbose_log()
{
  if (( ${rvm_verbose_flag:=0} == 1 ))
  then rvm_log "$@"
  fi
}

rvm_out()
{
  printf "$*\n"
}

__rvm_set_colors

# Redirect &6 to stderr
exec 6>&2
scripts/functions/rvmrc_to000066400000001206147511530560012031 0ustar00#!/usr/bin/env bash

__rvm_rvmrc_to()
{
  case "${1:-help}" in
    (.ruby-version|ruby-version)
      __rvm_rvmrc_to_ruby_version || return $?
      ;;
    (help)
      rvm_help rvmrc to
      return 0
      ;;
    (*)
      rvm_error_help "Unknown subcommand '$1'" rvmrc to
      return 1
      ;;
  esac
}

__rvm_rvmrc_to_ruby_version()
(
  [[ -s "$PWD/.rvmrc" ]] ||
  {
    rvm_error "No .rvmrc to convert"
    return 2
  }
  __rvm_load_project_config "$PWD/.rvmrc" ||
  {
    rvm_error "Could not load .rvmrc"
    return 3
  }

  __rvm_set_ruby_version

  \command \rm .rvmrc ||
  {
    rvm_error "Could not remove .rvmrc"
    return 4
  }
)
scripts/functions/autolibs000077500000005533147511530560012032 0ustar00#!/usr/bin/env bash

source "$rvm_scripts_path/functions/db"

__rvm_autolibs_set()
{
  __rvm_db_ "$rvm_user_path/db" "autolibs" "$rvm_autolibs_flag"
}

__rvm_autolibs_get()
{
  if [[ -z "${rvm_autolibs_flag:-}" ]]
  then rvm_autolibs_flag="$( __rvm_db_ "$rvm_user_path/db" "autolibs" )"
  fi

  rvm_autolibs_flag="${rvm_autolibs_flag:=4}"
}

__rvm_autolibs_reset()
{
  __rvm_db_ "$rvm_user_path/db" "autolibs" "delete"
}

__rvm_autolibs_translate()
{
  case "${1:-$rvm_autolibs_flag}" in
    (0|disable|disabled)
      rvm_autolibs_flag_number=0
      rvm_autolibs_flag_runner="${_system_name_lowercase}"
      ;;
    (1|read|read-only)
      rvm_autolibs_flag_number=1
      rvm_autolibs_flag_runner="${_system_name_lowercase}"
      ;;
    (2|fail|read-fail)
      rvm_autolibs_flag_number=2
      rvm_autolibs_flag_runner="${_system_name_lowercase}"
      ;;
    (3|packages|install-packages)
      rvm_autolibs_flag_number=3
      rvm_autolibs_flag_runner="${_system_name_lowercase}"
      ;;
    (portage|gentoo_portage)
      rvm_autolibs_flag_number=3
      rvm_autolibs_flag_runner="gentoo_portage"
      ;;
    (paludis|gentoo_paludis)
      rvm_autolibs_flag_number=3
      rvm_autolibs_flag_runner="gentoo_paludis"
      ;;
    (pkgcore|gentoo_pkgcore)
      rvm_autolibs_flag_number=3
      rvm_autolibs_flag_runner="gentoo_pkgcore"
      ;;
    (4|enable|enabled)
      rvm_autolibs_flag_number=4
      rvm_autolibs_flag_runner="${_system_name_lowercase}"
      ;;
    (brew|homebrew|osx_brew)
      rvm_autolibs_flag_number=4
      rvm_autolibs_flag_runner="osx_brew"
      ;;
    (port|macports|osx_port)
      rvm_autolibs_flag_number=4
      rvm_autolibs_flag_runner="osx_port"
      ;;
    (fink|osx_fink)
      rvm_autolibs_flag_number=4
      rvm_autolibs_flag_runner="osx_fink"
      ;;
    (smf|rvm_pkg)
      rvm_autolibs_flag_number=4
      rvm_autolibs_flag_runner="${rvm_autolibs_flag}"
      ;;
    (*)
      rvm_debug "Unknown 'rvm_autolibs_flag' value '$rvm_autolibs_flag'."
      return 1
      ;;
  esac

  if [[ -n "${1:-}" ]]
  then rvm_autolibs_flag="$1"
  fi
}

__rvm_autolibs_translate_description()
{
  __rvm_autolibs_translate

  case "${rvm_autolibs_flag_number}" in
    (0)
      rvm_autolibs_flag_description="Limit RVM automation as much as possible."
      ;;
    (1)
      rvm_autolibs_flag_description="Allow RVM to use package manager if found but do not install or fail if dependencies are missing."
      ;;
    (2)
      rvm_autolibs_flag_description="Allow RVM to use package manager if found, fail if dependencies are missing. This is default."
      ;;
    (3)
      rvm_autolibs_flag_description="Allow RVM to use package manager if found, install missing dependencies."
      ;;
    (4)
      rvm_autolibs_flag_description="Allow RVM to use package manager if found, install missing dependencies, install package manager (only OS X)."
      ;;
  esac
}
scripts/functions/env000066400000017640147511530560010777 0ustar00#!/usr/bin/env bash

#
# Environment manipulation functions.
#

__rvm_nuke_rvm_variables()
{
  unset rvm_head_flag $(env | __rvm_awk -F= '/^rvm_/{print $1" "}')
}

# Unset ruby-specific variables
__rvm_unset_ruby_variables()
{
  # unset rvm_ruby_flag $(env | __rvm_awk -F= '/^rvm_ruby_/{printf $1" "}')
  unset rvm_env_string rvm_ruby_string rvm_ruby_strings rvm_ruby_binary rvm_ruby_gem_home rvm_ruby_gem_path rvm_ruby_home rvm_ruby_interpreter rvm_ruby_irbrc rvm_ruby_log_path rvm_ruby_major_version rvm_ruby_minor_version rvm_ruby_package_name rvm_ruby_patch_level rvm_ruby_release_version rvm_ruby_repo_url rvm_ruby_repo_branch rvm_ruby_revision rvm_ruby_selected_flag rvm_ruby_tag rvm_ruby_version rvm_head_flag rvm_ruby_package_file rvm_ruby_configure rvm_ruby_name rvm_ruby_url rvm_ruby_global_gems_path rvm_ruby_args rvm_ruby_name rvm_llvm_flag rvm_ruby_repo_tag
  __rvm_load_rvmrc # restore important variables
}


# TODO: Should be able to...
#   Unset both rvm variables as well as ruby-specific variables
# Preserve gemset if 'rvm_sticky' is set
# (persist gemset unless clear is explicitly called).
__rvm_cleanse_variables()
{
  __rvm_unset_ruby_variables
  if [[ ${rvm_sticky_flag:-0} -eq 1 ]]
  then export rvm_gemset_name
  else unset  rvm_gemset_name
  fi

  # arrays
  unset rvm_configure_flags rvm_patch_names rvm_make_flags
  # variables
  unset rvm_env_string rvm_ruby_string rvm_action rvm_error_message rvm_force_flag rvm_debug_flag rvm_delete_flag rvm_summary_flag rvm_json_flag rvm_yaml_flag rvm_file_name rvm_user_flag rvm_system_flag rvm_install_flag rvm_llvm_flag rvm_sticky_flag rvm_rvmrc_flag rvm_gems_flag rvm_docs_flag rvm_ruby_alias rvm_static_flag rvm_archive_extension rvm_hook rvm_ruby_name rvm_remote_flag
  # rvm_gemsets_path rvm_user_path rvm_wrappers_path rvm_patches_path rvm_docs_path rvm_examples_path rvm_rubies_path rvm_usr_path rvm_src_path rvm_tmp_path rvm_lib_path rvm_repos_path rvm_log_path rvm_help_path rvm_environments_path rvm_archives_path
  __rvm_load_rvmrc # restore important variables
}

# Add bin path if not present
__rvm_conditionally_add_bin_path()
{
  [[ ":${PATH}:" == *":${rvm_bin_path}:"* ]] ||
  {
    if [[ "${rvm_ruby_string:-"system"}" == "system" && -z "$GEM_HOME" ]]
    then PATH="$PATH:${rvm_bin_path}"
    else PATH="${rvm_bin_path}:$PATH"
    fi
  }
}

__rvm_load_environment()
{
  \typeset __hook
  if
    [[ -f "$rvm_environments_path/$1" ]]
  then
    # Restore the environment
    unset GEM_HOME GEM_PATH
    __rvm_remove_rvm_from_path ; __rvm_conditionally_add_bin_path

    # source the environment file
    \. "$rvm_environments_path/$1"

    rvm_hook="after_use"
    if [[ -n "${rvm_scripts_path:-}" || -n "${rvm_path:-}" ]]
    then source "${rvm_scripts_path:-$rvm_path/scripts}/hook"
    fi
    # clear the PATH cache
    builtin hash -r
  else
    __rvm_use "$1"
  fi
}

__rvm_export()
{
  # extract the variable name from the first arg.
  \typeset name
  name=${1%%\=*}

  # store the current value, to be restored later.
  builtin export rvm_old_$name=${!name}

  # pass-through the return value of the builtin.
  export "$@"
  return $?
}

__rvm_unset_exports()
{
  \typeset wrap_name name value
  \typeset -a __variables_list
  __rvm_read_lines __variables_list <<< "$(
    printenv | __rvm_sed '/^rvm_old_.*=/ { s/=.*$//; p; }; d;'
  )"

  for wrap_name in "${__variables_list[@]}"
  do
    eval "value=\"\${${wrap_name}}\""
    name=${wrap_name#rvm_old_}
    if [[ -n "${value:-}" ]]
    then export $name="${value}"
    else unset $name
    fi
    unset $wrap_name
  done
}

__rvm_fix_path_from_gem_path()
{
  [[ -n "${GEM_PATH:-}" ]] || return 0
  export PATH
  \typeset IFS _iterator_path
  \typeset -a _gem_path _new_path
  IFS=:
  _gem_path=()
  _new_path=()
  __rvm_custom_separated_array _gem_path : "${GEM_PATH}"

  for _iterator_path in "${_gem_path[@]}"
  do
    _new_path+=( "${_iterator_path}/bin" )
  done
  _new_path+=( "${MY_RUBY_HOME:-${GEM_HOME/gems/rubies}}/bin" )
  _new_path+=( "${rvm_bin_path}" )

  PATH="${_new_path[*]}:$PATH"
  builtin hash -r
}

# Clean all rvm items out of the current working path.
__rvm_remove_rvm_from_path()
{
  \typeset local_rvm_path
  __rvm_remove_from_path "${rvm_path%/}/*"
  __rvm_remove_from_path "${rvm_gems_path%/}/*"
  __rvm_remove_from_path "${rvm_bin_path}"  #TODO: this might be dangerous if rvm is available in some common path

  while local_rvm_path="$( __rvm_which rvm 2>/dev/null )"
  do __rvm_remove_from_path "${local_rvm_path%/*}"
  done
  builtin hash -r
}

__rvm_switch()
{
  \typeset new_rvm_path new_rvm_bin_path

  (( $# )) && [[ -z "$1" ]] && shift || true # skip first empty argument
  (( $# )) && [[ -n "$1" ]] && [[ -d "$1" || -d "${1%/*}" ]] && [[ ! -f "$1" ]] ||
  {
    rvm_error "No valid path given."
    return 1
  }
  [[ "${rvm_path}" != "${new_rvm_path}" ]] ||
  {
    rvm_warn "Already there!"
    return 2
  }
  rvm_log "Switching ${rvm_path} => ${1}"

  new_rvm_path="${1%/}"
  new_rvm_bin_path="${2:-$new_rvm_path/bin}"
  new_rvm_bin_path="${new_rvm_bin_path%/}"

  __rvm_use_system
  __rvm_remove_from_path "${rvm_path%/}/*"

  rvm_reload_flag=1
  rvm_path="${new_rvm_path}"
  rvm_bin_path="${new_rvm_bin_path}"
  rvm_scripts_path="${rvm_path}/scripts"
  rvm_environments_path="${rvm_path}/environments"

  __rvm_remove_from_path "${rvm_path%/}/*"
  __rvm_add_to_path prepend "${rvm_bin_path}"
}

__rvm_unload_action()
{
  \typeset _element IFS
  \typeset -a _list

  IFS=$'\n'
  _list=( $( \command \cat ${2:--} | sort -u ) )
  for _element in "${_list[@]}"
  do $1 "${_element}"
  done
}

__function_unset()
{
  if [[ -n "${ZSH_VERSION:-}" ]]
  then unset -f "$1"
  else unset "$1"
  fi
}

__rvm_unload()
{
  \typeset _element
  \typeset -a _list

  #PATH
  __rvm_remove_rvm_from_path

  # fpath
  if [[ -n "${ZSH_VERSION:-}" ]]
  then
    __rvm_remove_from_array fpath "$rvm_path/scripts/extras/completion.zsh" "${fpath[@]}"
  fi

  # aliases
  __rvm_unload_action unalias <<< "$(
    if [[ -n "${ZSH_VERSION:-}" ]]
    then alias | __rvm_awk -F"=" '/rvm/ {print $1}'
    else alias | __rvm_awk -F"[= ]" '/rvm/ {print $2}'
    fi
  )"

  # variables
  __rvm_unload_action unset <<< "$(
    set |
      __rvm_awk -F"=" 'BEGIN{v=0;} /^[a-zA-Z_][a-zA-Z0-9_]*=/{v=1;} v==1&&$2~/^['\''\$]/{v=2;}
        v==1&&$2~/^\(/{v=3;} v==2&&/'\''$/&&!/'\'\''$/{v=1;} v==3&&/\)$/{v=1;} v{print;} v==1{v=0;}' |
      __rvm_awk -F"=" '/^[^ ]*(RUBY|GEM|IRB|gem|rubies|rvm)[^ ]*=/ {print $1} /^[^ ]*=.*rvm/ {print $1}' |
      __rvm_grep -vE "^PROMPT|^prompt|^PS|^BASH_SOURCE|^PATH"
  )"

  # functions
  __rvm_unload_action __function_unset <<< "$(
    \typeset -f | __rvm_awk '$2=="()" {fun=$1} /rvm/{print fun}' | sort -u | __rvm_grep -v __rvm_unload_action
  )"
  if
    [[ -n "${ZSH_VERSION:-}" ]]
  then
    unset -f __rvm_unload_action
    unset -f __function_unset
    if
      [[ -n "${_comp_dumpfile:-}" ]]
    then
      \command \rm -f "$_comp_dumpfile"
      compinit -d "$_comp_dumpfile"
    fi
  else
    unset __rvm_unload_action __function_unset
  fi
}

__rvm_ruby_config_get()
{
  \typeset variable_name ruby_path
  variable_name="$1"
  ruby_path="${2:-$rvm_ruby_home/bin/ruby}"
  # mruby doesn't support -r requires or RbConfig
  __rvm_string_match "$ruby_path" "*mruby*" && return
  case "${variable_name:---all}" in
    (--all)
      "$ruby_path" -rrbconfig -e 'puts RbConfig::CONFIG.sort.map{|k,v| "#{k}: #{v}" }' 2>/dev/null || return $?
      ;;
    (*)
      "$ruby_path" -rrbconfig -e 'puts RbConfig::CONFIG["'"$variable_name"'"]' 2>/dev/null || return $?
      ;;
  esac
}

__rvm_env_print()
{
  environment_file_path="$rvm_environments_path/$(__rvm_env_string)"
  # Echo the path or environment file.
  if
    [[ "$rvm_path_flag" == "1" || "$*" == *"--path"* ]]
  then
    echo "$environment_file_path"
  elif
    [[ "$rvm_cron_flag" == "1" || "$*" == *"--cron"* ]]
  then
    \command \cat "$environment_file_path" |
      __rvm_grep -Eo "[^ ]+=[^;]+" |
      __rvm_sed -e 's/\$PATH/'"${PATH//\//\\/}"'/' -e 's/\${PATH}/'"${PATH//\//\\/}"'/'
  else
    \command \cat "$environment_file_path"
  fi
}
scripts/functions/init000066400000002150147511530560011140 0ustar00#!/usr/bin/env bash

__rvm_load_rvmrc()
{
  \typeset _file
  \typeset -a rvm_rvmrc_files
  if (( ${rvm_ignore_rvmrc:=0} == 1 ))
  then
    return 0
  fi

  [[ -n "${rvm_stored_umask:-}" ]] || export rvm_stored_umask=$(umask)

  rvm_rvmrc_files=("/etc/rvmrc" "$HOME/.rvmrc")
  if [[ -n "${rvm_prefix:-}" ]] && ! [[ "$HOME/.rvmrc" -ef "${rvm_prefix}/.rvmrc" ]]
     then rvm_rvmrc_files+=( "${rvm_prefix}/.rvmrc" )
  fi
  for _file in "${rvm_rvmrc_files[@]}"
  do
    if [[ -s "$_file" ]]
    then
      if __rvm_grep '^\s*rvm .*$' "$_file" >/dev/null 2>&1
      then
        rvm_error "
$_file is for rvm settings only.
rvm CLI may NOT be called from within $_file.
Skipping the loading of $_file
"
        return 1
      else
        source "$_file"
      fi
    fi
  done
  return 0
}

# Initialize rvm, ensuring that the path and directories are as expected.
__rvm_initialize()
{
  true ${rvm_scripts_path:="$rvm_path/scripts"}
  export rvm_scripts_path
  source "$rvm_scripts_path/base"

  __rvm_conditionally_add_bin_path
  export PATH

  [[ -d "${rvm_tmp_path:-/tmp}" ]] || command mkdir -p "${rvm_tmp_path}"

  return 0
}
scripts/functions/selector_gemsets000077500000011676147511530560013564 0ustar00#!/usr/bin/env bash

__rvm_gemset_handle_default()
{
  rvm_gemset_name="${rvm_gemset_separator:-@}${rvm_gemset_name:-}${rvm_gemset_separator:-@}"
  rvm_gemset_name="${rvm_gemset_name/${rvm_gemset_separator:-@}default${rvm_gemset_separator:-@}/}"
  # also does filter any extra rvm_gemset_separator from the gemset name
  rvm_gemset_name="${rvm_gemset_name//${rvm_gemset_separator:-@}/}"
}

__rvm_gemset_select_cli_validation()
{
  \typeset orig_gemset

  if ! builtin command -v gem > /dev/null
  then
    rvm_log "'gem' command not found, cannot select a gemset."
    return 0
  fi

  orig_gemset="${rvm_gemset_name:-}"
  __rvm_gemset_handle_default

  # No longer defaulting to 'sticky' gem sets.
  # Set 'rvm_sticky_flag=1' in ~/.rvmrc to enable.
  if [[ -z "${rvm_gemset_name:-}"  && "$orig_gemset" != "default" && ${rvm_sticky_flag:-0} -eq 1 ]]
  then
    if [[ -n "${rvm_ruby_gem_home:-}" ]]
    then
      rvm_gemset_name="$rvm_ruby_gem_home"
    elif [[ -n "${GEM_HOME:-}" ]]
    then
      rvm_gemset_name="$GEM_HOME"
    fi
    rvm_gemset_name="${rvm_gemset_name##*/}"
    rvm_gemset_name="${rvm_gemset_name#*${rvm_gemset_separator:-"@"}}"
  fi

  if [[ -z "${rvm_ruby_string:-}" && -n "${GEM_HOME:-}" && -n "${GEM_HOME%@*}" ]]
  then
    rvm_ruby_string="${GEM_HOME%@*}"
    rvm_ruby_string="${rvm_ruby_string##*/}"
  fi

  if [[ -z "${rvm_ruby_string:-}" ]]
  then
    rvm_error "Gemsets can not be used with non rvm controlled rubies (currently)."
    return 3
  fi
}

__rvm_gemset_select_only()
{
  rvm_ruby_gem_home="${rvm_gems_path:-"$rvm_path/gems"}/$rvm_ruby_string"

  : rvm_ignore_gemsets_flag:${rvm_ignore_gemsets_flag:=0}:
  if (( rvm_ignore_gemsets_flag ))
  then
    rvm_ruby_global_gems_path="${rvm_ruby_gem_home}"
    rvm_ruby_gem_path="${rvm_ruby_gem_home}"
    rvm_gemset_name=""
  else
    rvm_ruby_global_gems_path="${rvm_ruby_gem_home}${rvm_gemset_separator:-"@"}global"

    __rvm_gemset_handle_default
    [[ -z "$rvm_gemset_name" ]] ||
      rvm_ruby_gem_home="${rvm_ruby_gem_home}${rvm_gemset_separator:-"@"}${rvm_gemset_name}"

    if [[ "$rvm_gemset_name" == "global" ]]
    then
      rvm_ruby_gem_path="${rvm_ruby_gem_home}"
    else
      rvm_ruby_gem_path="${rvm_ruby_gem_home}:${rvm_ruby_global_gems_path}"
    fi
  fi

  if [[ -n "${rvm_gemset_name}" ]]
  then
    rvm_env_string="${rvm_ruby_string}@${rvm_gemset_name}"
  else
    rvm_env_string=${rvm_ruby_string}
  fi
  true # OSX --trace FIX
}

__rvm_gemset_select_validation()
{
  # If the gemset does not exist, then notify the user as such and abort the action.
  if
    [[ ! -d "${rvm_ruby_gem_home}" ]]
  then
    if
      (( ${rvm_gemset_create_on_use_flag:=0} == 0 && ${rvm_create_flag:=0} == 0 && ${rvm_delete_flag:=0} == 0 ))
    then
      rvm_expected_gemset_name="${rvm_gemset_name}"
      rvm_gemset_name=""
      __rvm_gemset_select_only
      return 2
    fi
  elif
    (( ${rvm_delete_flag:=0} == 1 ))
  then
    return 4
  fi

  case "${rvm_gemset_name}" in
    (*/*)
      rvm_error "Gemsets can not contain path separator '/'."
      return 5
      ;;
    (*:*)
      rvm_error "Gemsets can not contain PATH separator ':'."
      return 5
      ;;
  esac

  \typeset rvm_ruby_gem_home_254
  if [[ -n "${ZSH_VERSION:-}" ]]
  then rvm_ruby_gem_home_254="${rvm_ruby_gem_home[0,254]}"
  else rvm_ruby_gem_home_254="${rvm_ruby_gem_home:0:254}"
  fi
  if
    [[ "${rvm_ruby_gem_home}" != "${rvm_ruby_gem_home_254}" ]]
  then
    rvm_error "Gemset gem home to long ${#rvm_ruby_gem_home}."
    return 6
  fi
}

# Select a gemset based on CLI set options and environment.
__rvm_gemset_select_cli()
{
  __rvm_gemset_select_cli_validation &&
  __rvm_gemset_select ||
  return $?
}

__rvm_gemset_select()
{
  __rvm_gemset_select_only &&
  __rvm_gemset_select_validation ||
  return $?
}

__rvm_gemset_use_ensure()
{
  if
    [[ ! -d "$rvm_ruby_gem_home" ]] ||
    [[ -n "${rvm_expected_gemset_name}" && ! -d "${rvm_ruby_gem_home%@*}@${rvm_expected_gemset_name}" ]]
  then
    if
      (( ${rvm_gemset_create_on_use_flag:=0} == 1 || ${rvm_create_flag:=0} == 1 ))
    then
      gemset_create "${rvm_expected_gemset_name:-${rvm_gemset_name:-}}"
    else
      rvm_error "Gemset '${rvm_expected_gemset_name:-${rvm_gemset_name:-}}' does not exist, \
'rvm $rvm_ruby_string do rvm gemset create ${rvm_expected_gemset_name:-${rvm_gemset_name:-}}' first, or append '--create'."
      return 2
    fi
  fi
}

# Use a gemset specified by 'rvm_ruby_gem_home'
__rvm_gemset_use()
{
  if
    [[ "$(__rvm_env_string)" == "system" ]]
  then
    rvm_error "System ruby is not controlled by RVM, but you can use it with 'rvm automount', read more: 'rvm help mount'."
    return 2
  elif
    __rvm_gemset_select_cli
  then
    rvm_log "Using $rvm_ruby_string with gemset ${rvm_gemset_name:-default}"
    __rvm_use # Now ensure the selection takes effect for the environment.
  elif
    [[ -n "${rvm_expected_gemset_name}" ]]
  then
    __rvm_gemset_use_ensure
  else
    rvm_error "Gemset was not given.\n  Usage:\n    rvm gemset use <gemsetname>\n"
    return 1
  fi
}
scripts/functions/rvmrc_warning000066400000010642147511530560013060 0ustar00#!/usr/bin/env bash

__rvmrc_warning()
{
  \typeset __rvmrc_warning_path __rvmrc_warning_file
  __rvmrc_warning_path="$rvm_user_path/rvmrc_ignored"

  case "${1:-help}" in
    (list)
      __rvmrc_warning_$1 "${2:-}" || return $?
      ;;
    (check|check_quiet|ignore|reset)
      __rvmrc_full_path_to_file "${2:-}" &&
      __rvmrc_warning_$1 "${__rvmrc_warning_file:-${2:-}}" ||
      return $?
      ;;
    (help)
      rvm_help rvmrc warning
      ;;
    (*)
      rvm_error_help "Unknown subcommand '$1'" rvmrc warning
      return 1
      ;;
  esac
}

__rvmrc_full_path_to_file()
{
  if
    [[ "$1" == "all.rvmrcs" || "$1" == "allGemfiles" ]]
  then
    # extra case when managing all
    __rvmrc_warning_file="$1"
  elif
    [[ -d "$1" && -s "$1/.rvmrc" ]]
  then
    # read full path and append .rvmrc
    __rvmrc_warning_file="$( __rvm_cd "$1" >/dev/null 2>&1; pwd )/.rvmrc"
  elif
    [[ -d "$1" && -s "$1/Gemfile" ]]
  then
    # read full path and append Gemfile
    __rvmrc_warning_file="$( __rvm_cd "$1" >/dev/null 2>&1; pwd )/Gemfile"
  elif
    [[ -f "$1" || "$1" == *".rvmrc" || "$1" == *"Gemfile" ]]
  then
    # read dir from file name
    __rvmrc_warning_file="$( dirname "$1" )"
    # default to current dir if not given in file name
    : __rvmrc_warning_file:${__rvmrc_warning_file:=$PWD}
    # build full path to file
    __rvmrc_warning_file="${__rvmrc_warning_file}/${1##*/}"
  else
    rvm_warn "Do not know how to handle '$1', please report: https://github.com/rvm/rvm/issues ~ __rvmrc_full_path_to_file"
    return 1
  fi
}

__rvmrc_warning_list()
{
  rvm_log "# List of project files that ignore warnings:"
  if [[ -s "$__rvmrc_warning_path" ]]
  then \command \cat "$__rvmrc_warning_path"
  fi
}

__rvmrc_warning_check()
{
  if __rvmrc_warning_check_quiet "$1"
  then rvm_log "path '$1' is ignored."
  else
    \typeset ret=$?
    rvm_log "path '$1' is not ignored."
    return $ret
  fi
}

__rvmrc_warning_check_quiet()
{
  [[ -f "$__rvmrc_warning_path" ]] || return $?
  \typeset __rvmrc_type
  case "$1" in
    (all.rvmrcs|allGemfiles) true ;;
    (*)
      # convert to all<file>s
      __rvmrc_type="^all${1##*/}s"
      if __rvm_grep "${__rvmrc_type}$" "$__rvmrc_warning_path" >/dev/null
      then return 0
      fi
      ;;
  esac
  __rvm_grep "^$1$" "$__rvmrc_warning_path" >/dev/null || return $?
}

__rvmrc_warning_ignore()
{
  __rvmrc_warning_check_quiet "$1" ||
  case "$1" in
    (all.rvmrcs|allGemfiles)
      echo "$1" >>  "$__rvmrc_warning_path"
      ;;
    (*)
      echo "$1" >> "$__rvmrc_warning_path"
      ;;
  esac
}

__rvmrc_warning_reset()
{
  \typeset __rvmrc_type
  case "${1:-}" in
    (all.rvmrcs|allGemfiles)
      if
        __rvmrc_warning_check_quiet "$1"
      then
        __rvm_sed_i "$__rvmrc_warning_path" -e "\#^${1}\$# d" -e '/^$/ d'
        __rvmrc_type="${1#all}"
        __rvmrc_type="${__rvmrc_type%s}"
        __rvm_sed_i "$__rvmrc_warning_path" -e "\#/${__rvmrc_type}\$# d" -e '\#^$# d'
      else
        rvm_debug "Already removed warning ignore from '$1'."
      fi
      ;;
    (*)
      if __rvmrc_warning_check_quiet "$1"
      then __rvm_sed_i "$__rvmrc_warning_path" -e "\#^${1}\$# d" -e '\#^$# d'
      else rvm_debug "Already removed warning ignore from '$1'."
      fi
      ;;
  esac
}

__rvmrc_warning_display_for_rvmrc()
{
  \typeset __rvmrc_warning_path __rvmrc_warning_file
  __rvmrc_warning_path="$rvm_user_path/rvmrc_ignored"
  if
    [[ -t 2 ]] &&
    __rvmrc_full_path_to_file "${1:-}" &&
    ! __rvmrc_warning_check_quiet "${__rvmrc_warning_file:-${2:-}}"
  then
    rvm_warn "You are using '.rvmrc', it requires trusting, it is slower and it is not compatible with other ruby managers,
you can switch to '.ruby-version' using 'rvm rvmrc to ruby-version'
or ignore this warning with 'rvm rvmrc warning ignore $1',
'.rvmrc' will continue to be the default project file in RVM 1 and RVM 2,
to ignore the warning for all files run 'rvm rvmrc warning ignore all.rvmrcs'.
"
  fi
}

__rvmrc_warning_display_for_Gemfile()
{
  \typeset __rvmrc_warning_path __rvmrc_warning_file
  __rvmrc_warning_path="$rvm_user_path/rvmrc_ignored"
  if
    [[ -t 2 ]] &&
    __rvmrc_full_path_to_file "${1:-}" &&
    ! __rvmrc_warning_check_quiet "${__rvmrc_warning_file:-${2:-}}"
  then
    rvm_warn "RVM used your Gemfile for selecting Ruby, it is all fine - Heroku does that too,
you can ignore these warnings with 'rvm rvmrc warning ignore $1'.
To ignore the warning for all files run 'rvm rvmrc warning ignore allGemfiles'.
"
  fi
}
scripts/functions/rvmrc_project000066400000016456147511530560013072 0ustar00#!/usr/bin/env bash

# Checks the rvmrc for the given directory. Note that if
# argument is passed, it will be used instead of pwd.
__rvm_project_rvmrc()
{
  export __rvm_project_rvmrc_lock
  : __rvm_project_rvmrc_lock:${__rvm_project_rvmrc_lock:=0}
  : __rvm_project_rvmrc_lock:$((__rvm_project_rvmrc_lock+=1))
  if (( __rvm_project_rvmrc_lock > 1 ))
  then return 0 # no nesting
  fi

  \typeset working_dir found_file rvm_trustworthiness_result save_PATH

  # Get the first argument or the pwd.
  working_dir="${1:-"$PWD"}"
  save_PATH="${PATH}"

  while :
  do
    if
      [[ -z "$working_dir" || "$HOME" == "$working_dir" || "${rvm_prefix:-}" == "$working_dir" || "$working_dir" == "." ]]
    then
      if (( ${rvm_project_rvmrc_default:-0} >= 1 ))
      then rvm_previous_environment=default
      fi
      if [[ -n "${rvm_previous_environment:-""}" ]] && (( ${rvm_project_rvmrc_default:-0} < 2 ))
      then __rvm_load_environment "$rvm_previous_environment"
      fi
      __rvm_file_env_check_unload
      unset rvm_current_rvmrc rvm_previous_environment
      break
    else
      if
        __rvm_project_dir_check "$working_dir" found_file
      then
        rvm_trustworthiness_result=0
        if
          [[ "${found_file}" != "${rvm_current_rvmrc:-""}" ]]
        then
          __rvm_conditionally_do_with_env __rvm_load_project_config "${found_file}" ||
          {
            rvm_trustworthiness_result=$?
            PATH="${save_PATH}" # restore PATH if project file load failed
            unset RVM_PROJECT_PATH
          }
        fi
        unset __rvm_project_rvmrc_lock
        return "$rvm_trustworthiness_result"
      else
        working_dir="${working_dir%/*}"
      fi
    fi
  done

  unset __rvm_project_rvmrc_lock
  return 1
}

__rvm_load_project_config()
{
  rvm_debug "__rvm_load_project_config $1"
  \typeset __gemfile _bundle_install
  \typeset -a __file_env_variables
  __file_env_variables=()
  __gemfile=""
  rvm_previous_environment="$(__rvm_env_string)"
  : rvm_autoinstall_bundler_flag:${rvm_autoinstall_bundler_flag:=0}
  case "$1" in
    (*/.rvmrc)
      __rvmrc_warning_display_for_rvmrc "$1"
      if
        __rvm_check_rvmrc_trustworthiness "$1"
      then
        __rvm_remove_rvm_from_path ; __rvm_conditionally_add_bin_path
        rvm_current_rvmrc="$1"
        __rvm_ensure_is_a_function

        unset GEM_HOME GEM_PATH
        rvm_ruby_string="${rvm_previous_environment/system/default}" rvm_action=use source "$1" ||
          return $?
      else
        return $?
      fi
      ;;

    (*/.versions.conf)
      __rvm_ensure_is_a_function
      rvm_current_rvmrc="$1"

      rvm_ruby_string="$( \command \tr -d '\r' <"$1" | __rvm_sed -n '/^ruby=/ {s/ruby=//;p;}' | tail -n 1 )"
      [[ -n "${rvm_ruby_string}" ]] || return 2
      rvm_gemset_name="$( \command \tr -d '\r' <"$1" | __rvm_sed -n '/^ruby-gemset=/ {s/ruby-gemset=//;p;}' | tail -n 1 )"
      rvm_create_flag=1 __rvm_use   || return 3

      __rvm_file_load_env_and_trust "$1" "env-"

      _bundle_install="$( \command \tr -d '\r' <"$1" | __rvm_sed -n '/^ruby-bundle-install=/ {s/ruby-bundle-install=//;p;}' )"
      if
        [[ -n "${_bundle_install}" ]]
      then
        if [[ -f "${_bundle_install}" ]]
        then __gemfile="${_bundle_install}"
        else __gemfile="${1%/*}/Gemfile"
        fi
      fi
      ;;

    (*/Gemfile)
      __rvm_ensure_is_a_function
      rvm_current_rvmrc="$1"

      rvm_ruby_string="$( \command \tr -d '\r' <"$1" | __rvm_sed -n '/^#ruby=/ {s/#ruby=//;p;}' | tail -n 1 )"
      [[ -n "${rvm_ruby_string}" ]] || {
        rvm_ruby_string="$(
          \command \tr -d '\r' <"$1" |
          __rvm_sed -n "s/[[:space:]]+rescue[[:space:]]+nil$//; /^\s*ruby[[:space:](]/ {s/^\s*ruby//; s/[[:space:]()'\"]//g; p;}" |
          \tail -n 1
        )"
        [[ -n "${rvm_ruby_string}" ]] || return 2

        rvm_ruby_string="${rvm_ruby_string%%\#*}"
        rvm_ruby_string="${rvm_ruby_string/,:engine=>/-}"
        rvm_ruby_string="${rvm_ruby_string/,engine:/-}"
        rvm_ruby_string="${rvm_ruby_string/,:engine_version=>[^,]*/}"
        rvm_ruby_string="${rvm_ruby_string/,engine_version:[^,]*/}"
        rvm_ruby_string="${rvm_ruby_string/,:patchlevel=>/-p}"
        rvm_ruby_string="${rvm_ruby_string/,patchlevel:/-p}"
      } #'
      rvm_gemset_name="$( \command \tr -d '\r' <"$1" | __rvm_sed -n '/^#ruby-gemset=/ {s/#ruby-gemset=//;p;}' | tail -n 1 )"
      if [[ -z "${rvm_gemset_name:-}" && -f "${1%/*}/.ruby-gemset" ]]
      then rvm_gemset_name="$( \command \tr -d '\r' <"${1%/*}/.ruby-gemset" )"
      fi
      __rvmrc_warning_display_for_Gemfile "$1"

      rvm_create_flag=1 __rvm_use   || return 3

      __rvm_file_load_env_and_trust "$1" "#ruby-env-"
      __gemfile="$1"
      ;;

    (*/.ruby-version|*/.rbfu-version|*/.rbenv-version)
      __rvm_ensure_is_a_function
      rvm_current_rvmrc="$1"

      rvm_ruby_string="$( \command \tr -d '\r' <"$1" )"
      if [[ -z "${rvm_ruby_string}" ]]
      then return 2
      fi
      if [[ -f "${1%/*}/.ruby-gemset" ]]
      then rvm_gemset_name="$( \command \tr -d '\r' <"${1%/*}/.ruby-gemset" )"
      else rvm_gemset_name=""
      fi
      rvm_create_flag=1 __rvm_use || return 3

      __rvm_file_load_env_and_trust "${1%/*}/.ruby-env"
      __rvm_file_load_env_and_trust "${1%/*}/.rbenv-vars"
      __gemfile="${1%/*}/Gemfile"
      ;;

    (*)
      rvm_error "Unsupported file format for '$1'"
      return 1
      ;;
  esac

  __rvm_file_set_env

  if
    [[ "${rvm_autoinstall_bundler_flag:-0}" == 1 && -n "${__gemfile:-}" && -f "${__gemfile:-}" ]]
  then
    __rvm_which bundle >/dev/null 2>&1 ||
      gem install --remote bundler
    bundle install --gemfile="${__gemfile}" | __rvm_grep -vE '^Using|Your bundle is complete'
  fi
}

# Detect if project file is in given PATH,
#
# Usage:
#   __rvm_project_dir_check <file_or_dir_to_check> [variable_name_to_set [default_value]]
#
# @param file_or_dir_to_check  file or directory to check if it's valid project file
# @param variable_name_to_set  when project file is found - set this variable to it's location
# @param default_value         when no project file found - set variable to this value
# @return                      0 - found, >0 - not found
# @env   RVM_PROJECT_PATH      unsets when not found, sets to project root when found
__rvm_project_dir_check()
{
  \typeset _found_file path_to_check variable variable_default
  \typeset -a _valid_files
  path_to_check="$1"
  variable="${2:-}"
  variable_default="${3:-}"
  _valid_files=(
    "$path_to_check"
    "$path_to_check/.rvmrc" "$path_to_check/.versions.conf" "$path_to_check/.ruby-version"
    "$path_to_check/.rbfu-version" "$path_to_check/.rbenv-version" "$path_to_check/Gemfile"
  )

  __rvm_find_first_file _found_file "${_valid_files[@]}" || true

  if
    [[ ! -s "$_found_file" ||
      "${_found_file}" == "$HOME/.rvmrc"
    ]]
  then
    _found_file=""
  elif
    [[ "${_found_file##*/}" == "Gemfile" ]] &&
    ! __rvm_grep    "^#ruby="  "$_found_file" >/dev/null &&
    ! __rvm_grep -E "^\s*ruby" "$_found_file" >/dev/null
  then
    _found_file=""
  fi

  if [[ -n "$variable" ]]
  then eval "$variable=\"\${_found_file:-$variable_default}\""
  fi

  if
    [[ -n "${_found_file:-$variable_default}" ]]
  then
    RVM_PROJECT_PATH="${_found_file:-$variable_default}"
    RVM_PROJECT_PATH="${RVM_PROJECT_PATH%/*}"
  else
    \typeset __result=$?
    unset RVM_PROJECT_PATH
    return $__result
  fi
}
scripts/functions/reset000066400000002626147511530560011327 0ustar00#!/usr/bin/env bash

# Reset any rvm gathered information about the system and its state.
# rvm will refresh the stored information the next time it is called after reset.
__rvm_reset()
{
  \typeset flag flags file files config configs variable

  __rvm_remove_rvm_from_path ; __rvm_conditionally_add_bin_path

  export PATH

  builtin hash -r

  flags=( default passenger editor )

  for flag in "${flags[@]}"; do

    \command \rm -f "${rvm_bin_path}"/${flag}_*

  done

  for file in system default ; do

    if [[ -f "$rvm_path/${file}" ]] ; then
      \command \rm -f "$rvm_path/${file}"
    fi

    if [[ -f "$rvm_path/config/${file}" ]] ; then
      \command \rm -f "$rvm_path/config/${file}"
    fi

    if [[ -f "$rvm_environments_path/${file}" ]] ; then
      \command \rm -f "$rvm_environments_path/${file}"
    fi

  done

  # Go back to a clean state.
  __rvm_use_system

  __rvm_unset_ruby_variables

  __rvm_unset_exports

  configs=(system_ruby system_gem_path system_user_gem_path)

  for system_config in "${configs[@]}"
  do
    __rvm_db_ "$rvm_user_path/db" "$system_config" "delete"
  done

  files=(ruby gem rake irb $(__rvm_cd "${rvm_bin_path}" ; \
    __rvm_find . -mindepth 1 -maxdepth 1 -iname 'default*' -type f \
    | __rvm_sed -e 's#./##g'))

  for file in "${files[@]}"; do

    if [[ -f "${rvm_bin_path}/$file" ]] ; then

      \command \rm -f "${rvm_bin_path}/$file"

    fi

  done

  return 0
}
scripts/functions/rvmrc000066400000011131147511530560011325 0ustar00#!/usr/bin/env bash

source "${rvm_scripts_path}/functions/rvmrc_env"
source "${rvm_scripts_path}/functions/rvmrc_project"
source "${rvm_scripts_path}/functions/rvmrc_set"
source "${rvm_scripts_path}/functions/rvmrc_to"
source "${rvm_scripts_path}/functions/rvmrc_trust"
source "${rvm_scripts_path}/functions/rvmrc_warning"

__rvm_rvmrc_match_all() [[ "${1:-}" == "all" || "${1:-}" == "all.rvmrcs" || "${1:-}" == "allGemfiles" ]]

__rvm_rvmrc_tools()
{
  \typeset rvmrc_action rvmrc_warning_action rvmrc_path saveIFS trust rvmrc_ruby

  rvmrc_action="$1"
  (( $# )) && shift || true

  if
    [[ "${rvmrc_action}" == "warning" ]]
  then
    rvmrc_warning_action="${1:-}"
    (( $# )) && shift || true
  fi

  if
    [[ "${rvmrc_action}" == "create" ]]
  then
    rvmrc_ruby="${1:-${GEM_HOME##*/}}"
    rvmrc_path="$(__rvm_cd "$PWD" >/dev/null 2>&1; pwd)/${2:-.rvmrc}"
  elif
    [[ "$1" == ".rvmrc" ]]
  then
    rvmrc_path="$PWD/.rvmrc"
  elif
    [[ "${rvmrc_action}" == "to" || "${rvmrc_action}" == "warning" ]] ||
    [[ -n "${1:-}" ]]
  then
    rvmrc_path="$1"
  else
    rvmrc_path="$PWD/.rvmrc"
  fi

  if
    [[ "${rvmrc_action}" == "to" ||
       "${rvmrc_action}" == "warning" ||
       "${rvmrc_action}" == "create"
    ]]||
    __rvm_rvmrc_match_all "${rvmrc_path:-}" # ignore all*
  then
    true 
  else
    __rvm_project_dir_check "${rvmrc_path}" rvmrc_path "${rvmrc_path}/.rvmrc"
  fi
  rvmrc_path="${rvmrc_path//\/\///}"
  rvmrc_path="${rvmrc_path%/}"

  case "$rvmrc_action" in
    warning)
      __rvmrc_warning "${rvmrc_warning_action:-}" "$rvmrc_path" || return $?
      ;;

    to)
      __rvm_rvmrc_to "$rvmrc_path" || return $?
      ;;

    create)
      (
        rvm_create_flag=1 __rvm_use "${rvmrc_ruby}"
        case "${rvmrc_path}" in
          (*/.rvmrc|*/--rvmrc)                 __rvm_set_rvmrc         ;;
          (*/.ruby-version|*/--ruby-version)   __rvm_set_ruby_version  ;;
          (*/.versions.conf|*/--versions-conf) __rvm_set_versions_conf ;;
          (*)
            rvm_error "Unrecognized project file format."
            return 1
            ;;
        esac
      )
      ;;
    reset)
      __rvm_reset_rvmrc_trust "$rvmrc_path" &&
        rvm_log "Reset trust for $rvmrc_path" ||
        rvm_error "Reset trust for $rvmrc_path - failed"
      ;;
    trust)
      __rvm_trust_rvmrc "$rvmrc_path" &&
        rvm_log "Marked $rvmrc_path as trusted" ||
        rvm_error "Marked $rvmrc_path as trusted - failed"
      ;;

    untrust)
      __rvm_untrust_rvmrc "$rvmrc_path" &&
        rvm_log "Marked $rvmrc_path as untrusted" ||
        rvm_error "Marked $rvmrc_path as untrusted - failed"
      ;;

    trusted)
      __rvm_rvmrc_stored_trust_check "$rvmrc_path" || return $?
      ;;

    is_trusted)
      __rvm_rvmrc_stored_trust_check "$rvmrc_path" >/dev/null
      ;;

    load)
      rvm_current_rvmrc="" rvm_trust_rvmrcs_flag=1 __rvm_project_rvmrc "${rvmrc_path%/.rvmrc}"
      ;;

    try_to_read_ruby)
      __rvm_rvmrc_tools_try_to_read_ruby "$@" || return $?
      ;;

    *)
      rvm_error "Usage: rvm rvmrc {trust,untrust,trusted,load,reset,is_trusted,try_to_read_ruby,create}"
      return 1
      ;;
  esac

  return $?
}

__rvm_rvmrc_tools_try_to_read_ruby()
{
  case "$rvmrc_path" in
    (*/.rvmrc)
      # make sure the flag is passed on to sub-process () / $()
      if [[ -n "${rvm_trust_rvmrcs_flag:-}" ]]
      then export rvm_trust_rvmrcs_flag
      fi

      rvmrc_path="$(cd "$(dirname "$rvmrc_path")"; pwd)/.rvmrc"

      __rvm_rvmrc_tools is_trusted "$(dirname "$rvmrc_path")" .rvmrc ||
      (
        # subprocess to not mess with current process variables
        rvm_promptless=1 __rvm_project_rvmrc "$rvmrc_path" >/dev/null 2>&1
      )

      if __rvm_rvmrc_tools is_trusted "$(dirname "$rvmrc_path")" .rvmrc
      then __rvm_rvmrc_tools_read_ruby "$@" || return $?
      else return 1
      fi
      ;;
    (*)
      __rvm_rvmrc_tools_read_ruby "$@" || return $?
      ;;
  esac
}

__rvm_save_variables()
{
  \typeset __save_to __key
  __save_to="$1"
  shift
  for __key in "$@"
  do
    eval "${__save_to}+=( \"\${__key}=\${${__key}}\" )"
  done
}

__rvm_rvmrc_tools_read_ruby()
{
  \typeset __result
  \typeset -a rvmrc_tools_read_ruby
  rvmrc_tools_read_ruby=()
  __rvm_save_variables rvmrc_tools_read_ruby \
    rvm_current_rvmrc result current_result rvm_token next_token \
    rvm_action _string
  rvm_current_rvmrc=""

  rvm_action="${rvm_action:-use}" rvm_trust_rvmrcs_flag=1 __rvm_project_rvmrc "$rvmrc_path" >/dev/null &&
    rvm_ruby_string="${GEM_HOME##*/}" &&
    rvm_ruby_strings="$rvm_ruby_string" ||
    __result=101

  __rvm_set_env "" "${rvmrc_tools_read_ruby[@]}"
  return ${__result:-0}
}
scripts/functions/group000066400000005017147511530560011336 0ustar00#!/usr/bin/env bash

__rvm_add_user_to_group()
{
  case "${_system_type}" in
    "OpenBSD")
      __rvm_try_sudo usermod -G "$1" "$2"
      ;;
    "FreeBSD"|"DragonFly")
      __rvm_try_sudo pw usermod "$2" -G "$1"
      ;;
    "Linux")
      if [[ -f "/etc/SuSE-release" ]] ; then
        __rvm_try_sudo groupmod -A "$2" "$1"
      else
        __rvm_try_sudo /usr/sbin/usermod -a -G "$1" "$2"
      fi
    ;;
    "Darwin")
      __rvm_try_sudo dscl . -append "/Groups/$1" GroupMembership "$2"
      ;;
    "SunOS")
      groups="$(id -G "$2") \"$1\""
      __rvm_try_sudo usermod -G "${1// /, }" "$2"
      ;;
  esac
}

__rvm_show_user_groups()
{
  groups "$1" | __rvm_sed -e 's/.*:[[:space:]]*//' | \command \tr ' ' $'\n'
}

__rvm_is_user_in_group()
{
  __rvm_show_user_groups "$2" | __rvm_grep "^$1$" >/dev/null
}

__rvm_list_all_users()
{
  case "${_system_type}" in
    "Darwin")
      dscl . -search /Users PrimaryGroupID 20 | __rvm_grep PrimaryGroupID | cut -f 1
      ;;
    *)
      __rvm_grep -xF -f <(\command \cat /etc/passwd | cut -d: -f1) <(__rvm_find /home -mindepth 1 -maxdepth 1 -type d | cut -d '/' -f 3)
      ;;
  esac
}

__rvm_group_exists()
{
  case "${_system_type}" in
    (Darwin)
      dscl . -read "/Groups/$1" 1>/dev/null 2>&1 || return $?
      ;;
    (*)
      __rvm_grep "^$1:" /etc/group >/dev/null 2>&1
      ;;
  esac
}

__rvm_create_group()
{
  \typeset -a __group_params
  __group_params=()

  if [[ -n "${2:-}" ]]
  then __group_params+=( -g "$2" )
  fi

  case "${_system_type}" in
    (Linux|SunOS)
      __rvm_try_sudo groupadd "${__group_params[@]}" "$1"
      ;;
    (BSD)
      case "${_system_name}" in
        (OpenBSD)
          __rvm_try_sudo groupadd "${__group_params[@]}" "$1"
          ;;
        (FreeBSD|DragonFly)
          __rvm_try_sudo pw groupadd "${__group_params[@]}" "$1" -q
          ;;
        esac
        ;;
    (Darwin)
      \typeset _new_group_id
      if
        [[ -n "${2:-}" ]]
      then
        _new_group_id="$2"
      else
        _new_group_id="501" #only gids > 500 show up in user preferences
        #Find an open gid
        while true
        do
          name=$(dscl . search /groups PrimaryGroupID ${_new_group_id} | cut -f1 -s)
          if [[ -z "$name" ]]
          then break
          fi
          _new_group_id=$(( _new_group_id + 1 ))
        done
      fi
      # Create the group, isn't OSX "fun"?! :)
      # Thanks for the assist frogor of ##osx-server on freenode! Appreciate the assist!
      __rvm_try_sudo dscl . -create "/Groups/$1" gid "${_new_group_id}"
      ;;
  esac
}
scripts/functions/build000066400000022674147511530560011311 0ustar00#!/usr/bin/env bash

source "$rvm_scripts_path/functions/autolibs"
source "$rvm_scripts_path/functions/db"
source "$rvm_scripts_path/functions/build_config"
source "$rvm_scripts_path/functions/build_config_system"
source "$rvm_scripts_path/functions/build_requirements"
if
  [[ "Darwin" == "${_system_type}" ]]
then
  source "$rvm_scripts_path/functions/osx-ssl-certs"
  source "$rvm_scripts_path/functions/osx-support"
fi

# show the user selected compiler or return 1
__rvm_selected_compiler()
{
  #TODO: add handling for rvm_configure_env
  if
    [[ " ${rvm_configure_flags[*]}" == *" --with-gcc="* ]]
  then
    \typeset __compiler
    for __compiler in "${rvm_configure_flags[@]}"
    do
      case "$__compiler" in
        (--with-gcc=*)
          echo "${__compiler#--with-gcc=}"
          return 0
          ;;
      esac
    done
  elif
    [[ -n "${CC:-}" ]]
  then
    echo "${CC}"
    return 0
  fi
  return 1
}

__rvm_found_compiler()
{
  __rvm_selected_compiler  ||
  __rvm_which gcc   2>/dev/null ||
  __rvm_which clang 2>/dev/null
}

__rvm_fix_rbconfig()
{
  \typeset __config_file
  __config_file="$( __rvm_find $1/ -name rbconfig.rb 2>/dev/null )"
  [[ -n "${__config_file}" ]]   &&
  __rvm_remove_static_flag "$@" &&
  __rvm_fix_gcc_path       "$@" &&
  __rvm_fix_install_path   "$@"
}

__rvm_remove_static_flag()
{
  if
    __rvm_grep -- "-Z" "${__config_file}" >/dev/null
  then
    rvm_debug "Removing '-Z' from rbconfig."
    __rvm_sed_i "${__config_file}" -e "s#-Z##"
  fi
}

__rvm_fix_gcc_path()
{
  \typeset __cc_value __cc_new
  __rvm_which $(
    "$1/bin/ruby" -rrbconfig -e 'puts RbConfig::CONFIG["CC"]||"true"' 2>/dev/null
  ) >/dev/null 2>/dev/null ||
  {
    __cc_value="$( "$1/bin/ruby" -rrbconfig -e 'puts RbConfig::CONFIG["CC"]' 2>/dev/null )" &&
    if
      __rvm_grep "CONFIG\[\"CC\"\]" "${__config_file}" >/dev/null
    then
      __cc_new="$( __rvm_found_compiler )"
      rvm_debug "Fixing ruby compiler from '${__cc_value}' to '${__cc_new}'."
      __rvm_sed_i "${__config_file}" \
        -e "s#CONFIG\[\"CC\"\].*\$#CONFIG[\"CC\"] = ENV[\"CC\"] || \"${__cc_new}\"#"
    else
      rvm_warn "Installed ruby contains path to non existing compiler '${__cc_value}', compiling native gems might be impossible."
    fi
  }
}

__rvm_fix_install_path()
{
  \typeset __install_value __install_new
  __rvm_which $(
    "$1/bin/ruby" -rrbconfig -e 'puts RbConfig::CONFIG["INSTALL"]||"true"' 2>/dev/null
  ) >/dev/null 2>/dev/null ||
  {
    __install_value="$( "$1/bin/ruby" -rrbconfig -e 'puts RbConfig::CONFIG["INSTALL"]' 2>/dev/null )"
    if
      __rvm_grep "CONFIG\[\"INSTALL\"\]" "${__config_file}" >/dev/null
    then
      __install_new="$( \command \which install )"
      rvm_debug "Fixing ruby installer from '${__install_value}' to '${__install_new}'."
      __rvm_sed_i "${__config_file}" \
        -e "s#CONFIG\[\"INSTALL\"\].*\$#CONFIG[\"INSTALL\"] = \"${__install_new}\"#"
    else
      rvm_warn "Installed ruby contains path to non existing compiler '${__install_value}', compiling native gems might be impossible."
    fi
  }
}

__rvm_run_compiler()
{
  if
    [[ -n "${1:-}" ]]
  then
    \typeset compiler="$1"
    shift
    if [[ -n "${ZSH_VERSION:-}" ]]
    then ${=compiler} "$@" 2>&1 || return $?
    else ${compiler}  "$@" 2>&1 || return $?
    fi
  else
    return 1
  fi
}

__rvm_compiler_is()
{
  __rvm_run_compiler "$1" "$2" | __rvm_grep -i "$3" >/dev/null
}

__rvm_compiler_version_is()
{
  \typeset compiler __check
  __check="$1"
  compiler="${2:-$( __rvm_found_compiler )}" &&
  __rvm_compiler_is "$compiler" "--version" "${__check}" ||
  return $?
}

__rvm_compiler_is_llvm()
{
  __rvm_compiler_version_is "llvm" "${1:-}" || return $?
}

__rvm_compiler_is_clang()
{
  __rvm_compiler_version_is "clang" "${1:-}" || return $?
}

__rvm_compiler_version_or_higher()
{
  \typeset __version compiler
  compiler="${2:-$(  __rvm_found_compiler )}" &&
  __version="$( __rvm_run_compiler "$compiler" "-dumpversion" )" &&
  __rvm_version_compare "${__version:-0}" -ge "$1" ||
  return $?
}

__rvm_update_configure_env()
{
  \typeset -a local_configure_env
  \typeset _variable _value _iterator _found

  rvm_debug "__rvm_update_configure_env($#):$*:"

  while (( $# ))
  do
    _variable="${1%%\=*}"
    _value="${1#*=}"
    shift
    __rvm_array_add_or_update rvm_configure_env "$_variable=" " " "$_value"
  done
}

__rvm_update_configure_env_arch()
{
  __rvm_update_configure_env CFLAGS="$1" CCFLAGS="$1" CXXFLAGS="$1" LDFLAGS="$1"
}

__rvm_update_configure_opt_dir()
{
  case "$1" in
    (rbx*|rubinius*)
      __rvm_update_configure_opt_dir_options "$2"
      ;;
    (ruby-head*|ruby-2*)
      __rvm_update_configure_opt_dir_option "$2"
      ;;
    (ruby-1.9.3-p*)
      \typeset __patchlevel
      __patchlevel="${1##ruby-1.9.3-p}"
      if
        (( __patchlevel < 297 ))
      then
        rvm_patch_names+=( cflags )
        __rvm_update_configure_opt_dir_option_or_flags "$2"
      else
        __rvm_update_configure_opt_dir_option "$2"
      fi
      ;;
    (ruby-1.9*)
      __rvm_update_configure_opt_dir_option_or_flags "$2"
      ;;
    (*)
      __rvm_update_configure_opt_dir_flags "$2"
      ;;
  esac
}

# add multiple --with-opt-dir=
__rvm_update_configure_opt_dir_options()
{
  rvm_debug "rvm_configure_flags+=( --with-opt-dir=$1 )"
  rvm_configure_flags+=( --with-opt-dir="$1" )
}

# update single --with-opt-dir=
__rvm_update_configure_opt_dir_option()
{
  rvm_debug "rvm_configure_flags+=( --with-opt-dir=$1 )"
  __rvm_array_add_or_update rvm_configure_flags --with-opt-dir= : "$1"
}

__rvm_update_configure_opt_dir_option_or_flags()
{
  # Use option if first time - use flags if option available already
  case " ${rvm_configure_flags[*]} " in
    (*[[:space:]]--with-opt-dir=*)
      __rvm_update_configure_opt_dir_flags "$@"
      ;;
    (*)
      __rvm_update_configure_opt_dir_option "$@"
      ;;
  esac
}

__rvm_update_configure_opt_dir_flags()
{
  \typeset __enable_rpath __lib_path

  if
    #                  __rvm_xargs \head -n 1 -- can not have \command - breaks xargs
    __rvm_which bash | __rvm_xargs \head -n 1 | \command \cat -e | __rvm_grep -b '^^?ELF' >/dev/null
  then
    __enable_rpath="true"
  fi

  __rvm_update_configure_env CFLAGS="-I$1/include"
  __rvm_update_configure_env LDFLAGS="-L$1/lib"

  [[ -z "${__enable_rpath:-}" ]] ||
    __rvm_update_configure_env LDFLAGS="-Wl,-rpath,$1/lib"

  if [[ -d "$1/lib64" ]]
  then
    __rvm_update_configure_env LDFLAGS="-L$1/lib64"

    [[ -z "${__enable_rpath:-}" ]] ||
      __rvm_update_configure_env LDFLAGS="-Wl,-rpath,$1/lib64"
  fi
}

__rvm_check_for_compiler()
{
  if __rvm_selected_compiler > /dev/null &&
    ! builtin command -v $(__rvm_selected_compiler) >/dev/null
  then
    rvm_error "You requested building with '$(__rvm_selected_compiler)' but it is not in your path."
    return 1
  fi
}

# Checks for bison, returns zero iff it is found
__rvm_check_for_bison()
{
  true ${rvm_head_flag:=0}
  if (( rvm_head_flag > 0 ))
  then
    if ! builtin command -v bison > /dev/null
    then
      rvm_error "\nbison is not available in your path. \nPlease ensure bison is installed before compiling from head.\n"
      return 1
    fi
  fi
}

__rvm_mono_env()
{
  DYLD_LIBRARY_PATH="${rvm_usr_path}/lib:$DYLD_LIBRARY_PATH"
  C_INCLUDE_PATH="${rvm_usr_path}/include:$C_INCLUDE_PATH"
  ACLOCAL_PATH="${rvm_usr_path}/share/aclocal"
  ACLOCAL_FLAGS="-I $ACLOCAL_PATH"
  PKG_CONFIG_PATH="${rvm_usr_path}/lib/pkgconfig:$PKG_CONFIG_PATH"

  export  DYLD_LIBRARY_PATH C_INCLUDE_PATH ACLOCAL_PATH ACLOCAL_FLAGS PKG_CONFIG_PATH

  __rvm_add_to_path prepend "${rvm_usr_path}/bin"

  builtin hash -r

  return 0
}

# Returns all mri compatible (partly) ruby for use
# with things like rbx etc which require a ruby be installed.
__rvm_mri_rubies()
(
  # find on bsd does not have -not, we need to use \!
  \typeset versions="${1:-"ruby-1.9|ruby-2"}"
  __rvm_cd "$rvm_rubies_path" &&
  __rvm_find . -maxdepth 1 -mindepth 1 -type d \! -type l |
  __rvm_awk -F/ "/$versions/"' {if (system("test -x \""$0"/bin/ruby\"")==0) print $2}' ||
  return $?
)

# Returns the first mri compatible (partly) ruby for use
# with things like rbx etc which require a ruby be installed.
__rvm_mri_ruby()
{
  __rvm_mri_rubies "${1:-"ruby-1.9|ruby-2"}" |
  __rvm_version_sort |
  __rvm_awk 'BEGIN{ selected=$0 } /'"$(__rvm_env_string)"'/{ selected=$0 } END {print $0}'
}

__rvm_ensure_has_mri_ruby()
{
  \typeset versions
  versions="${1:-"ruby-1.9|ruby-2"}"
  if
    [[ -z "$(__rvm_mri_ruby $versions)" ]]
  then
    \typeset compat_result
    compat_result=0
    rvm_warn "
Warning! Requested ruby installation which requires another ruby available - installing ${versions##*|} first.
"
    if
      (
        __rvm_select "${versions##*|}" # prevents endless loop for rbx
        __rvm_run_wrapper manage install "${versions##*|}"
      )
    then
      true
    else
      compat_result=$?
      rvm_error "
To proceed rvm requires a ${versions##*|} compatible ruby is installed.
We attempted to install it automatically but it failed with status $compat_result.
Please install it manually (or a compatible alternative) to proceed.
"
    fi
    return $compat_result
  fi

  return 0
}

__rvm_is_enough_ram()
{
  \typeset __required_ram __existing_ram

  __required_ram=$(( $1 * 1024 * 1024 ))

  __existing_ram="$(free -b 2>/dev/null | __rvm_awk '{if (NR==3) print $4}')"
  : ${__existing_ram:="$(sysctl hw.physmem 2>/dev/null | __rvm_awk -F"[:=]" '{print $2}')"}
  : __existing_ram: ${__existing_ram:=0}
  rvm_debug "Existing ram $(( __existing_ram /1024 /1024 ))MB."

  (( __existing_ram >= __required_ram )) || return $?
}
scripts/cd000077500000005733147511530560006570 0ustar00#!/usr/bin/env bash

# Source a .rvmrc file in a directory after changing to it, if it exists.  To
# disable this feature, set rvm_project_rvmrc=0 in /etc/rvmrc or $HOME/.rvmrc
case "${rvm_project_rvmrc:-1}" in
1|cd)
  # cloned from git@github.com:mpapis/bash_zsh_support.git
  source "$rvm_scripts_path/extras/bash_zsh_support/chpwd/function.sh"

  # not using default loading to support older Zsh
  [[ -n "${ZSH_VERSION:-}" ]] &&
  __rvm_version_compare "$ZSH_VERSION" -gt  4.3.4 ||
  {
    function cd()    { __zsh_like_cd cd    "$@" ; }
    function popd()  { __zsh_like_cd popd  "$@" ; }
    function pushd() { __zsh_like_cd pushd "$@" ; }
  }

  __rvm_after_cd()
  {
    \typeset rvm_hook
    rvm_hook="after_cd"
    if [[ -n "${rvm_scripts_path:-}" || -n "${rvm_path:-}" ]]
    then source "${rvm_scripts_path:-$rvm_path/scripts}/hook"
    fi
  }
  __rvm_cd_functions_set()
  {
    __rvm_do_with_env_before
    if [[ -n "${rvm_current_rvmrc:-""}" && "$OLDPWD" == "$PWD" ]]
    then rvm_current_rvmrc=""
    fi
    __rvm_project_rvmrc >&2 || true
    __rvm_after_cd || true
    __rvm_do_with_env_after
    return 0
  }
  [[ " ${chpwd_functions[*]} " == *" __rvm_cd_functions_set "* ]] ||
  chpwd_functions=( "${chpwd_functions[@]}" __rvm_cd_functions_set )

  # This functionality is opt-in by setting rvm_cd_complete_flag=1 in ~/.rvmrc
  # Generic bash cd completion seems to work great for most, so this is only
  # for those that have some issues with that.
  if (( ${rvm_cd_complete_flag:-0} == 1 ))
  then
    # If $CDPATH is set, bash should tab-complete based on directories in those paths,
    # but with the cd function above, the built-in tab-complete ignores $CDPATH. This
    # function returns that functionality.
    _rvm_cd_complete ()
    {
      \typeset directory current matches item index sep
      sep="${IFS}"
      export IFS
      IFS=$'\n'
      COMPREPLY=()
      current="${COMP_WORDS[COMP_CWORD]}"
      if [[ -n "$CDPATH" && ${current:0:1} != "/" ]] ; then
        index=0
        # The change to IFS above means that the \command \tr below should replace ':'
        # with a newline rather than a space. A space would be ignored, breaking
        # TAB completion based on CDPATH again
        for directory in $(printf "%b" "$CDPATH" | \command \tr -s ':' '\n') ; do
          for item in $( compgen -d "$directory/$current" ) ; do
            COMPREPLY[index++]=${item#$directory/}
          done
        done
      else
        COMPREPLY=( $(compgen -d ${current}) )
      fi
      IFS="${sep}";
    }
    complete -o bashdefault -o default -o filenames -o dirnames -o nospace -F _rvm_cd_complete cd
  fi
  ;;
2|prompt)
  if
    [[ -n "${ZSH_VERSION:-}" ]]
  then
    precmd_functions+=(__rvm_do_with_env_before __rvm_project_rvmrc __rvm_do_with_env_after)
  else
    PROMPT_COMMAND="${PROMPT_COMMAND%% }"
    PROMPT_COMMAND="${PROMPT_COMMAND%%;}"
    PROMPT_COMMAND="${PROMPT_COMMAND:-}${PROMPT_COMMAND:+; }__rvm_do_with_env_before; __rvm_project_rvmrc; __rvm_do_with_env_after"
  fi
  ;;
esac
scripts/hash000077500000002140147511530560007112 0ustar00#!/usr/bin/env bash

#
# The idea is that we emulate a hash using two methods
#
# The first method is providing functions by sourcing this file
#
# The second method is where this script is called directly,
# we then provide functionality of a file based hash
#

if [[ "$rvm_trace_flag" -eq 2 ]] ; then set -x ; export rvm_trace_flag ; fi

[[ -z "${ZSH_VERSION:-}" ]] ; array_start=$?

hash()
{
  hash_name=$1 ; hash_key=$2 ; hash_value=$3

  eval "_hash_${hash_name}_keys=\${_hash_${hash_name}_keys:-()} ; _hash_${hash_name}_values=\${_hash_${hash_name}_values:-()}"

  if [[ -z "$hash_value" ]] ; then
    eval "length=\${#_hash_${hash_name}_keys[@]}"
    for (( index=$__array_start ; index < $length; index++ )) ; do
      eval "key=\"\${_hash_${hash_name}_keys[$index]}\""
      if [[ "$hash_key" == "$key" ]] ; then
        eval "echo -n \${_hash_${hash_name}_values[$index]}"
        break
      fi
    done
  else
    eval "index=\$((\${#_hash_${hash_name}_keys[*]} + $__array_start))"
    eval "_hash_${hash_name}_keys[$index]=\"$hash_key\""
    eval "_hash_${hash_name}_values[$index]=\"$hash_value\""
  fi
}

scripts/pkg000077500000002323147511530560006753 0ustar00#!/usr/bin/env bash

if (( ${rvm_trace_flag:=0} == 2 ))
then
  set -x
  export rvm_trace_flag
fi

rvm_base_except="selector"

source "$rvm_scripts_path/base"
source "$rvm_scripts_path/functions/build"
source "$rvm_scripts_path/functions/pkg"

set +o errexit

# Tools to make managing ruby dependencies inside of rvm easier.
args=($*)
action="${args[0]:-""}"
library="${args[1]:-""}"
args="$(echo ${args[@]:2})"

rvm_warn "
Beware, 'rvm pkg ...' is deprecated, read about the new autolibs feature: 'rvm help autolibs'.
"

if [[ -n "$library" ]]
then
  case $library in
    readline|iconv|curl|openssl|zlib|autoconf|ncurses|pkgconfig|gettext|glib|mono|llvm|libxml2|libxslt|libyaml|epel)
      __rvm_setup_compile_environment ${library}
      install_${library}
      ;;
    ree_dependencies)
      for i in zlib ncurses readline openssl iconv
      do
        (
          __rvm_setup_compile_environment ${i}
          install_${i}
        )
      done
      ;;
    *)
      rvm_error "Package '${library}' is unknown."
      ;;
  esac

  exit $?
elif [[ "$action" == remove ]]
then
  rvm_log "Removing '$rvm_usr_path' ..."
  __rvm_rm_rf "$rvm_usr_path" &&
    rvm_log "Removed" ||
    rvm_error "Failed"
else
  rvm_help pkg
  exit 1
fi
scripts/set000077500000014161147511530560006770 0ustar00#!/usr/bin/env bash

source "$rvm_scripts_path/base"

rvm_is_not_a_shell_function=0 # for nested invocations of rvm

if [[ -n "${rvm_in_flag}" && -d "${rvm_in_flag}" ]]
then __rvm_cd "${rvm_in_flag}"
fi

__rvm_attempt_single_exec()
{
  # Return if we have multiple rubies. or we're not running exec.
  if (( ${#rvm_ruby_strings[@]} == 1 ))
  then
    __rvm_become "$rvm_ruby_strings"
    __rvm_load_rvmrc
    export rvm_project_rvmrc=0
    exec "${args[@]}"
  fi

  return 1
}

__rvm_ruby_do()
{
  # Return on invalid rubies.
  __rvm_become "$current_set_ruby" || return 1

  rvm_hook="before_do"
  source "$rvm_scripts_path/hook"

  if [[ -n "$rvm_json_flag" || -n "$rvm_yaml_flag" || -n "$rvm_summary_flag" ]]
  then
    if [[ ! -d "./log/$rvm_ruby_string/" ]]
    then
      mkdir -p "./log/$rvm_ruby_string/"
    fi
    touch "./log/$rvm_ruby_string/$action.log"
    "${args[@]}" >> "./log/$rvm_ruby_string/$action.log" 2>&1
  else
    if (( ${rvm_verbose_flag:-0} > 0 ))
    then
      current_env="$(__rvm_env_string)"
      if [[ "$current_env" != "$current_set_ruby" ]]
      then
        current_env="$current_set_ruby ($current_env)"
      fi
      rvm_log "$current_env: $(ruby -v $rvm_ruby_mode | \command \tr "\n" ' ')"
      unset current_env
    fi
    (
      __rvm_load_rvmrc
      export rvm_project_rvmrc=0
      "${args[@]}"
    )
  fi
  result=$?

  string=$rvm_ruby_string #$(basename $rvm_ruby_gem_home)

  if (( result == 0 ))
  then
    eval "successes=(${successes[*]} $string)"
  else
    eval "errors=(${errors[*]} $string)"
  fi
  eval "rubies=(${rubies[*]} $string)"
  eval "statuses=(${statuses[*]} $result)"
  unset string

  rvm_hook="after_do"
  source "$rvm_scripts_path/hook"
  __rvm_unset_ruby_variables
}

# Output the summary in a human readable format.
__rvm_summary()
{
  export successes errors statuses

  summary="\nSummary:\n\n"

  if [[ ${#successes[*]} -gt 0 ]]
  then
    if rvm_pretty_print stdout
    then
      summary="$summary ${rvm_notify_clr:-}${#successes[*]} successful: $(echo "${successes[*]}" | __rvm_sed 's# #, #g')${rvm_reset_clr:-}\n"
    else
      summary="$summary ${#successes[*]} successful: $(echo "${successes[*]}" | __rvm_sed 's# #, #g')\n"
    fi
  fi

  if [[ ${#errors[*]} -gt 0 ]] ; then
    if rvm_pretty_print stdout
    then
      summary="$summary ${rvm_error_clr:-}${#errors[*]} errors: $(echo "${errors[*]}" | __rvm_sed 's# #, #g')${rvm_reset_clr:-}\n"
    else
      summary="$summary ${#errors[*]} errors: $(echo "${errors[*]}" | __rvm_sed 's# #, #g')\n"
    fi
  fi

  total=${#rubies[*]}

  [[ -z "${ZSH_VERSION:-}" ]] ; array_start=$?

  printf "%b" "$summary" | tee -a log/summary.log

  return ${#errors[*]}

}

# Output the summary in a yaml format.
__rvm_yaml()
{
  export successes errors statuses
  yaml="totals:\n  rubies: ${#rubies[*]}\n  successes: ${#successes[*]}\n  errors: ${#errors[*]}\nsuccesses:"

  for var in ${successes[*]} ; do yaml="$yaml\n  - $var" ; done
  yaml="$yaml\nerrors:"

  for var in ${errors[*]} ; do yaml="$yaml\n  - $var" ; done
  yaml="$yaml\nrubies:"
  total=${#rubies[*]}

  [[ -z "${ZSH_VERSION:-}" ]] ; array_start=$?

  for (( index = $array_start ; index < $total + $array_start ; index++ )) ; do
    if [[ ${rvm_debug_flag:-0} -gt 0 ]] ; then
      rvm_debug "${rubies[$index]}: ${statuses[$index]}"
    fi
    yaml="$yaml\n  \"${rubies[$index]}\": ${statuses[$index]}"
  done
  unset index array_start

  \command \mkdir -p log

  printf "%b" "$yaml" | tee -a log/summary.yaml

  return ${#errors[*]}
}

# Output the summary in a json format.
__rvm_json()
{
  \typeset index array_start

  json="{
\"totals\": { \"rubies\": ${#rubies[*]}, \"successes\": ${#successes[*]}, \"errors\": ${#errors[*]} },
\"successful\": [$(echo \"${successes[*]}\" | __rvm_sed 's# #", "#g' | __rvm_sed 's#\"\"##')],
\"errors\": [$(echo \"${errors[*]}\" | __rvm_sed 's# #", "#g' | __rvm_sed 's#\"\"##')],
\"rubies\": { "

  total=${#rubies[*]}
  [[ -z "${ZSH_VERSION:-}" ]] ; array_start=$?

  for (( index = $array_start ; index < $total + $array_start ; index++ )) ; do
    if [[ ${rvm_debug_flag:-0} -gt 0 ]] ; then
      rvm_debug "${rubies[$index]}: ${statuses[$index]}"
    fi
    json="$json\n    {\"${rubies[$index]}\": ${statuses[$index]}}"
    if (( $index + 1 < $total + $array_start )) ; then json="$json,  " ; fi
  done

  json="$json\n  }\n}"

  if [[ ! -d log ]] ; then
    mkdir -p log
  fi
  printf "%b" "$json" | tee -a log/summary.json

  return ${#errors[*]}
}

# Loop over a set or all rvm installed rubies to perform some action.
# Record the results and report based on CLI selections.

rubies=() ; successes=() ; errors=() ; statuses=()

args=( "$@" )
action="${args[$__array_start]}"
unset args[$__array_start]
args=( "${args[@]}" )

if [[ -z "$action" ]]
then
  rvm_error "Action must be specified."
  exit 1
elif [[ "$action" != "do" ]]
then
  rvm_error "Only 'do' action is allowed."
  exit 1
fi

# deprecated 2011.10.22 for RVM 1.9.0, removed 2012.09.13 for RVM 1.16.0
if [[ -z "${rvm_ruby_strings}" ]]
then
  rvm_error "\`rvm do ${args[@]}\` was removed, use \`rvm 1.9.2,1.9.3 do ${args[@]}\` or \`rvm all do ${args[@]}\` instead."
  exit 1
fi

previous_rvm_ruby_strings="$rvm_ruby_strings"
rvm_ruby_strings=( $( __rvm_expand_ruby_string "$rvm_ruby_strings" ) ) || {
  \typeset result=$?
  if
    [[ $result -eq 2 && -n "${rvm_expected_gemset_name:-${rvm_gemset_name:-}}" ]]
  then
    rvm_ruby_string="${previous_rvm_ruby_strings## }"
    __rvm_ruby_string
    rvm_error "Gemset '${rvm_expected_gemset_name:-${rvm_gemset_name:-}}' does not exist, \
'rvm $rvm_ruby_string do rvm gemset create ${rvm_expected_gemset_name:-${rvm_gemset_name:-}}' first, or append '--create'."
  else
    rvm_ruby_string="${previous_rvm_ruby_strings## }"
    __rvm_ruby_string
    rvm_error "Ruby ${rvm_ruby_string} is not installed."
  fi
  exit $result
}
unset previous_rvm_ruby_strings

__rvm_attempt_single_exec

for current_set_ruby in ${rvm_ruby_strings[@]}
do
  __rvm_ruby_do
done

if [[ -n "$rvm_summary_flag" ]] ; then __rvm_summary ; fi
if [[ -n "$rvm_yaml_flag" ]]    ; then __rvm_yaml    ; fi
if [[ -n "$rvm_json_flag" ]]    ; then __rvm_json    ; fi

rvm_hook="after_do" ; source "$rvm_scripts_path/hook"

exit ${#errors[*]}
README.md000066400000016472147511530560006046 0ustar00Stable
[![Build](https://travis-ci.org/rvm/rvm.svg?branch=stable)](https://travis-ci.org/rvm/rvm/branches)
[![OpenCollective](https://opencollective.com/rvm/backers/badge.svg)](#backers)
[![OpenCollective](https://opencollective.com/rvm/sponsors/badge.svg)](#sponsors)
&nbsp;&nbsp;&nbsp;&nbsp;
Master
[![Build](https://travis-ci.org/rvm/rvm.svg?branch=master)](https://travis-ci.org/rvm/rvm/branches)

# What's RVM

RVM is the acronym of Ruby enVironment Manager. It manages Ruby application environments and enables switching between them.

Homepage and more info at [https://rvm.io](https://rvm.io)

## Table of Contents

- [Installing RVM](#installing-rvm)
  - [Ubuntu](#ubuntu)
  - [Any other operating system](#any-other-operating-system)
  - [Additional installation options](#additional-installation-options)
- [Upgrading RVM](#upgrading-rvm)
- [Basic RVM usage](#basic-rvm-usage)
  - [Installing ruby](#installing-ruby)
  - [Switching between ruby versions](#switching-between-ruby-versions)
  - [Other RVM commands](#other-rvm-commands)
- [Reporting issues](#reporting-issues)
  - [Check documentation](#check-documentation)
  - [Try again with latest RVM](#try-again-with-latest-rvm)
  - [File an issue](#file-an-issue)
- [Contributing](#contributing)
- [License](#license)

## Installing RVM

### Ubuntu

RVM have dedicated Ubuntu package, so please follow instructions posted here: https://github.com/rvm/ubuntu_rvm

If you need a different (newer) version of RVM, after installing base version of RVM check the [Upgrading](#upgrading) section below.

### Any other operating system

Make sure you have following required packages installed:

* `curl`
* `gpg2`

And then run:

`\curl -sSL https://get.rvm.io | bash -s stable`

### Additional installation options

Additional installation options and details about the installation process are described here: https://rvm.io/rvm/install

## Upgrading RVM

You can upgrade RVM any time by running:

`rvm get VERSION`

Where `VERSION` should be replaced by one of the following values:

* `stable`              - latest stable RVM (good for servers)
* `master`              - latest RVM (might not be stable)
* `branch /path/branch` - branched version of RVM (for testing new features or bug fixes)

Additional upgrading options are described here: https://rvm.io/rvm/upgrading

## Basic RVM usage

Basic RVM usage scenarios include installing and switching between different ruby versions.

### Installing ruby

To install ruby you have to call `rvm install INTERPRETER[-VERSION] OPTIONS`

When no version specified, RVM will install latest stable version or selected interpreter. If you omit to specify interpreter, RVM will assume
that you wanted to install MRI ruby. Following examples would have exactly the same effect:

```
rvm install ruby-2.3.1
rvm install ruby-2.3
rvm install 2.3.1
rvm install 2.3
```

Passing additional `--default` option makes selected ruby your default.

We currently supported following ruby interpreters:

* `ruby`       - MRI ruby (The Gold Standard)
* `ironruby`   - a .NET ruby
* `jruby`      - Java implementation of the ruby
* `macruby`    - implementation of ruby 1.9 directly on top of macOS core technologies
* `maglev`     - 64-bit implementation on top of VMware's GemStone
* `mruby`      - lightweight ruby
* `opal`       - ruby to JavaScript compiler
* `rbx`        - Rubinius - a next generation virtual machine VM for ruby
* `topaz`      - high performance ruby, written in RPython
* `truffleruby` - high performance ruby using GraalVM

Historical interpreters which you can still install with RVM, but are not anymore developed and supported by their authors:

* `ree`        - Ruby Enterprise Edition - MRI Ruby with several custom patches for performance, stability, and memory

### Switching between ruby versions

To switch between ruby versions you should call

`rvm use INTERPRETER[-VERSION]`

Same rules and options apply as for `install` command with two special _interpreters_.

* `default`    - [default](https://rvm.io/rubies/default/) ruby (or the system ruby if a default hasn't been set)
* `system`     - system ruby (state before RVM was installed)

Additionally you might want list your preferred ruby version in `.ruby-version` file stored in your project folder. This would cause automatic switch to selected ruby whenever you enter the folder.

### Other RVM commands

RVM comes bundled with many different tools for managing your ruby environment. More detailed information about every commands listed below can be read after executing `rvm help COMMAND` or browsing documentation on RVM homepage [https://rvm.io](https://rvm.io).

## Reporting issues

Here at RVM we get a high amount of bug reports, and often they are connected
with specific environment settings which might be hard for us to replicate.
That's why we would kindly ask you to follow the steps below so we can maximize
our time helping you and minimize the time requesting more information.

### Check documentation

We know, you hear this over and over and be rest assured we are working hard to improve the
usability of https://rvm.io but we must always ask that you first please check the documentation
if you are requesting a feature or if you are not sure if you did it right.

### Try again with latest RVM

We try to release a new RVM as soon as we feel that we achieved certain stability. This might take
a while and it could be the case that your issue has been already resolved in our development branch.
Please get the latest RVM and try again:

`rvm get master`

### File an issue

If the documentation is not clear, an error message is not clear or you are stuck with the problem,
please do file a bug.

When in doubt as to whether your issue might relate to another, simply file a new bug, and
we will mark it as duplicate if it needs to be.  It's always better to file a new ticket and
let us sort it out than to accidentally add noise to another ticket.

For filing issues, we have prepared a template for you to use. Please try to fill all sections as best as you can.
Always make sure to split up each command and its output into its own fenced code block.
If the output is long, please put it in a separate [gist](https://gist.github.com).
Otherwise it's hard for us to process all the information and respond quickly.

Note that if there is a lot of `debug` or `trace` output you can redirect it to a file with the `>`
character like `rvm [command] > output.txt`.

## Contributing

You are very warmly welcome to help. Please follow our [contribution guidelines](CONTRIBUTING.md)

Any and all contributions offered in any form, past present or future are understood to be in complete agreement and acceptance with our [Apache License](LICENSE) v2.0.

### Backers

[Become a backer](https://opencollective.com/rvm#backer) and support us with a small monthly donation to help us continue our activities. Thank you if you already one! 🙏

[![Backers](https://opencollective.com/rvm/backers.svg?width=890)](https://opencollective.com/rvm)

### Sponsors

Support this project by becoming a [sponsor](https://opencollective.com/rvm#sponsor). Your logo will show up here with a link to your website.

[![Sponsors](https://opencollective.com/rvm/sponsors.svg?width=890)](https://opencollective.com/rvm)

## License

Copyright (C) Michal Papis (2011-2020), Piotr Kuczynski (2016-2020), Wayne E. Seguin (2009-2011)

Licensed under the [Apache License](LICENSE), Version 2.0
installed.at000066400000000013147511530560007054 0ustar001680696673
RELEASE000066400000000007147511530560005555 0ustar00latest
VERSION000066400000000010147511530560005614 0ustar001.29.12
help/info.md000066400000004150147511530560006762 0ustar00
    $ rvm info [ruby_string[,ruby_string[,...] [section,[section[,...]

where sections are one of:

  system rvm ruby homes binaries environment debug

Both ruby strings and sections are optional arguments.

By default, with no parameters, rvm info will output all sections except debug.

To display system rvm debug information:

    $ rvm debug

which will display all sections including debug for the current or specified interpreters.

Example:

    $ rvm info 1.9.2-head,1.8.7 homes,binaries,environment

  ruby-1.9.2-head:

    homes:
      gem:          "/Users/wayne/.rvm/gems/ruby-1.9.2-head"
      ruby:         "/Users/wayne/.rvm/rubies/ruby-1.9.2-head"

    binaries:
      ruby:         "/Users/wayne/.rvm/rubies/ruby-1.9.2-head/bin/ruby"
      irb:          "/Users/wayne/.rvm/rubies/ruby-1.9.2-head/bin/irb"
      gem:          "/Users/wayne/.rvm/rubies/ruby-1.9.2-head/bin/gem"
      rake:         "/Users/wayne/.rvm/gems/ruby-1.9.2-head/bin/rake"

    environment:
      GEM_HOME:     "/Users/wayne/.rvm/gems/ruby-1.9.2-head"
      GEM_PATH:     "/Users/wayne/.rvm/gems/ruby-1.9.2-head:/Users/wayne/.rvm/gems/ruby-1.9.2-head@global"
      MY_RUBY_HOME: "/Users/wayne/.rvm/rubies/ruby-1.9.2-head"
      IRBRC:        "/Users/wayne/.rvm/rubies/ruby-1.9.2-head/.irbrc"
      RUBYOPT:      ""
      gemset:       ""

  ruby-1.8.7-p249:

    homes:
      gem:          "/Users/wayne/.rvm/gems/ruby-1.8.7-p249"
      ruby:         "/Users/wayne/.rvm/rubies/ruby-1.8.7-p249"

    binaries:
      ruby:         "/Users/wayne/.rvm/rubies/ruby-1.8.7-p249/bin/ruby"
      irb:          "/Users/wayne/.rvm/rubies/ruby-1.8.7-p249/bin/irb"
      gem:          "/Users/wayne/.rvm/rubies/ruby-1.8.7-p249/bin/gem"
      rake:         "/Users/wayne/.rvm/gems/ruby-1.8.7-p249/bin/rake"

    environment:
      GEM_HOME:     "/Users/wayne/.rvm/gems/ruby-1.8.7-p249"
      GEM_PATH:     "/Users/wayne/.rvm/gems/ruby-1.8.7-p249:/Users/wayne/.rvm/gems/ruby-1.8.7-p249@global"
      MY_RUBY_HOME: "/Users/wayne/.rvm/rubies/ruby-1.8.7-p249"
      IRBRC:        "/Users/wayne/.rvm/rubies/ruby-1.8.7-p249/.irbrc"
      RUBYOPT:      ""
      gemset:       ""


help/migrate.md000066400000000605147511530560007460 0ustar00
    $ rvm migrate from to

Efficiently moves the gems from one ruby to another.
Like 'rvm gemset copy' but removes the gems from the source
ruby afterwards and runs it against all gemsets for a given
ruby.

Examples:

To migrate all gemsets from rc2 of 1.9.2 to the first release, p0,
you would run:

    $ rvm migrate 1.9.2-rc2 1.9.2-p0

append `--force` to answer yes to all questions.
help/uninstall.md000066400000000542147511530560010041 0ustar00
    $ rvm uninstall [ruby-string[,ruby-string[,...]]]

Uninstall one or many ruby versions, but leave their sources.

Options:
- `--gems` - also removes gems installed for the removed ruby version

For a list of currently installed ruby string please run

  rvm list

Please see documentation for further information:

  https://rvm.io/rubies/removing/
help/notes.md000066400000000266147511530560007163 0ustar00Display all release notes.

This is list of all notes that were displayed during RVM updates.

It also displays warnings for problems RVM can not or should not handle automatically.
help/requirements.md000066400000000420147511530560010546 0ustar00Automated installation of software ruby depends on.

Usually there is no need to run requirements manually as it is part of ruby installation process.

## Usage

    rvm requirements ruby-2.1.0

See `rvm help autolibs` for details on how to control requirements behavior.
help/cleanup.md000066400000001267147511530560007464 0ustar00## Usage:

    rvm cleanup {all,archives,checksums,repos,sources,logs,gemsets,links}

## Description:

Cleans up the directory tree for the specified item.
For gemsets removes only those without matching ruby.

Useful for reclaiming used disk space from rvm compiles.

## Examples:

To reclaim all of the space used by archives, repository clones,
source files (and associated temporary compile file) and logs, you'd
run:

    $ rvm cleanup all

If instead you only wanted to clean up source files, you'd run:

    $ rvm cleanup sources

Please note that sometimes having archives and sources around are desirable.
Namely, you need the sources to install something such as ruby-debug under 1.9.
help/docs.md000066400000001504147511530560006757 0ustar00
# rvm docs

Generates ri and / or rdoc documentation for the current ruby and gems.


## Usage

    rvm docs {generate,generate-ri,generate-rdoc,generate-gems,rdoc_data}


## Description

If you have the hanna gem installed, rdoc generation should automatically use it.
Alternatively, you can pass the --docs flag to automatically build docs during installation.

For supported rubies (1.8.7, 1.9.2, 1.9.3, JRuby, RBX)
it will skip generation and install the rdoc-data gem.


## Examples

Generates all ri, rdoc and gems documentation for the current ruby:

    rvm docs generate


Generates only ri documentation for the current ruby:

    rvm docs generate-ri


Generates only rdoc documentation for the current ruby:

    rvm docs generate-rdoc

Generates only gems documentation for the current gemset:

    rvm docs generate-gems
help/autolibs.md000066400000007037147511530560007660 0ustar00## Synopsis

`rvm autolibs <flag>` __or__ `rvm install --autolibs=<flag>` __or__ `rvm get [type] --autolibs=<flag>`

## Description

Autolibs is a feature built into RVM to allow you to automatically install dependencies on your system.  These dependencies are typically things like OpenSSL, YAML and others. You can also disable autolibs completely or do things in-between "take care of it all" and "do nothing at all".

## Difference between `--autolibs` and `autolibs`

Some people might get confused at the difference between `--autolibs` and `autolibs` and even the difference between `--autolibs` when installing rubies (`rvm install [ruby] --autolibs`) and `--autolibs` when installing `rvm` (`rvm get [type] --autolibs`) but worry not, it's simple to remember.

* `rvm get [type] --autolibs=<flag>` is like `rvm autolibs <flag>`.
* `rvm autolibs <flag>` is permanent.
* `rvm install [ruby] --autolibs=<flag>` overrides `rvm autolibs <flag>` temporarily.

## Modes

* `0`, `disable`, `disabled` - Do not do anything.
* `1`, `read`, `read-only` - Use available libs, ignore missing.
* `2`, `fail`, `read-fail` - Use libs, fail if some are missing.
* `3`, `packages`, `install-packages`, - Use libs, install missing libs.
* `4`, `enable`, `enabled` - Install missing package manager (only OSX, on Linux it's like 3).

## Other options

* `reset`  - Reset RVM back to default mode.
* `status` - Display detailed information about your mode.
* `show`   - Display your current mode.
* `help`   - Display basic mode descriptions.

## Modes explained

The default mode is `enabled`, below is explanation of the modes,
where most useful will be `read-fail` in case user has no `sudo` access.

## Letting RVM take care of it all (4)

RVM can take care of everything for user, this means it will detect existing package manager and install one if none is available.
Typically this would be the best option for new users who do not have their own package manager installed and do not know how to compile their own software.

Enabling 4:

    rvm autolibs enable

Most of the systems ships with a package manager so the `enable` mode is the same as `packages`.
Unfortunately on OSX there is not package manger provided so RVM has to detect one of existing user efforts,
The detection is in order: `homebrew`, `macports`, `smf`, `fink` if none of them is available then RVM will install `macports`.

You can also optionally enforce a package manager by using one of the following instead of `enable`:

`macports`, `homebrew`, `fink`, `smf` (SM Framework) or `rvm_pkg` (the old `rvm pkg`), like:

    rvm autolibs homebrew

Or with the installer including homebrew, ruby and rails:

    \curl -L https://get.rvm.io | bash -s stable --autolibs=homebrew --rails


## Letting RVM take care of packages (3)

RVM can also be set to only check for a package manager and install any packages you might need or that might need to be updated.  This is the recommended option for users who do not want to deal with the task of managing their own dependencies.  This option works for both Linux and OS X users.

Enabling 3:

    rvm autolibs packages

Using 3 only once:

    rvm install --autolibs=packages <ruby>

## Tell RVM to fail when something is missing (2)

    rvm autolibs read-fail


## Tell RVM to try to use existing dependencies, but do not fail if something is missing (1)

    rvm autolibs read-only

## Avoid any extra actions or configuration (0)

    rvm autolibs disable

## Examples

Install RVM with Ruby and Ruby on Rails with all required libraries:

    \curl -L https://get.rvm.io | bash -s stable --rails
help/rubygems.md000066400000002046147511530560007666 0ustar00    $ rvm rubygems [x.y.z|latest-x.y|latest|current|master|head]

Installs a specific rubygems version in the current ruby. If
'current' is specified, the most current rubygems known to RVM
will be installed.

This does not work on Opal, on MRuby and on JRuby older than 1.7.1.

MRI 1.9+ ships with a version of RubyGems. To revert to that version
after installing a custom version via 'rvm rubygems' run:

'rvm rubygems remove'

The version can be also specified as latest-1.8
which will use latest available like 1.8.18

Also you could use "head" or "master" to use development version.
RVM and Rubygems discourage the use of development version.

Finally you can override default version for all installations:

    echo "rubygems_version=latest-1.8" >> $rvm_path/user/db
    echo "ree_rubygems_version=latest-1.6" >> $rvm_path/user/db
    echo "ruby_1.9.2_p136_rubygems_version=1.3.7" >> $rvm_path/user/db

or during single ruby installation:

    rvm install ruby --rubygems latest-2.0

or skip rubygems installation:

    rvm install rbx --rubygems ignore
help/install.md000066400000014116147511530560007500 0ustar00## Usage

    rvm install {ruby-string} [--verify-downloads {0,1,2}] [--binary|--disable-binary|--movable]


For a partial list of valid ruby strings please run

    rvm list known

For MRI Rubies you may pass configuration parameters in one of two ways:

    rvm install 1.9.2 --with-iconv-dir=$HOME/.rvm --without-readline

and/or

    rvm install 1.9.2 -C --with-iconv-dir=$HOME/.rvm,--without-readline

To do dirty installation using the same sources use:

    rvm install --force 1.9.2

To do clean installation use:

    rvm reinstall 1.9.2

## Fetching ruby package

You can customize fetching ruby package (source or binary) process with following options:

- `--quiet-curl`         - make `curl` silent when fetching data
- `--force`              - remove old installation with sources and force install

## Architecture

By default RVM will install 64-bit rubies, but you specify alternative
using switches:

- `--32`                   - install 32-bit rubies
- `--64`                   - install 64-bit rubies (default)
- `--universal`            - install both (OSX only)
- `--arch` | `--archflags` - architectures to install

## Binary rubies

By default RVM will try to download binary ruby package instead of compiling.
If such package is not available normal compilation will be performed.
Using binary builds can significantly decrease ruby installation time.

There are two options controlling binary rubies installation:

- `--binary`         - force binary installation, do not try to compile ruby.
- `--disable-binary` - do not try binary ruby, always compile.

More details about managing binary rubies can be found in `rvm help mount`.

## Installing from source

If you installing ruby package by compiling it from source, you can pass
additional configuration options:

- `--reconfigure`      - force `./configure` on install even if `Makefile` already exists
- `--patch`            - with MRI Rubies you may specify additional patches to apply before install - multiple patches should be comma separated `--patch a.patch[%prefix],b.patch` - `prefix` is an optional argument, which will be bypassed to the `-p` argument of the `patch` command and should be separated from patch file name with the `%` symbol.

### Compilation options
- `--clang`                          - use clang for compilation (equivalent to `export CC=clang` + `export CXX=clang++`)
- `--disable-llvm` | `--disable-jit` - disable LLVM
- `--enable-llvm` | `--enable-jit`   - enable LLVM

- `--with-arch`                      - architecture flag for configure (e.g. i686, x86_64)
- `-C` | `--configure` | `--`        - custom configure options - multiple options can be specified, separated with comma
- `--with-*` | `--without-*`         - configure flags
- `--enable-*` | `--disable-*`       - configure flags
- `-E` | `--env`                     - environment flags for configure
- `-M`                               - custom make options

#### .rvmrc equivalents

- `--with-arch`                       `rvm_architectures`
- `-C`                                `rvm_configure_flags`
        ... or per-ruby:              `{jruby|ree|rbx|mruby|macruby|truffleruby}_configure_flags`
- `-E`                                `rvm_configure_env`
- `-M`                                `rvm_make_flags`
- [none]                              `rvm_curl_flags`; default: --max-redirs 10 --max-time 1800

Note: these are not the only options passed to `configure` & `make`. rvm will add multiple options to each. See `RVMPATH/scripts/functions/{build_config,ruby,rubinius,requrements,pkg,...}` for details.

A variable with multiple flags should be set using parentheses and space separators. E.g. .rvmrc for `brew`-based `readline`, `llvm`, and `openssl` libraries:
```
 # warning: don't use \ linebreaks or it will break.
rvm_configure_env=( LDFLAGS="-L$(brew --prefix readline)/lib -L$(brew --prefix llvm)/lib -L$(brew --prefix openssl)/lib" CPPFLAGS="-I$(brew --prefix readline)/include -I$(brew --prefix llvm)/include -I$(brew --prefix openssl)/include" CXX=$(brew --prefix llvm)/bin/clang++ CC=$(brew --prefix llvm)/bin/clang )
rvm_archflags="-arch x86_64"
```

### Package-specific options

rbx & jruby:
- `--1.8` | `--1.9` | `--2.0` | `--2.1` - use branch compatible with given MRI ruby version
- `--18` | `--19` | `--20` | `--21`     - same

ree:
- `--ree-options`   - options passed directly to ree's `./installer` on the command line

### Compilation threads

RVM by default will try to detect amount of CPU cores and use `-j <max>`,
specify your own `-j n` flag to RVM to override the default:

    rvm install 2.0.0 -j 50 # OR:
    rvm install 1.8.6 -j 1

### Movable rubies

It is possible to build a ruby that can be moved to other locations, renamed
or even moved to other machine - as long as the system matches.

This option works only for ruby **1.9.3**, ruby **1.9.2** supports this only
on systems without `/usr/lib64`.

More details about managing binary builds can be found in `rvm help mount`.

## Documentation

- `--docs`              - generate ri after installation (default)
- `--rdoc` | `--yard`   - type of docs to generate (default: rdoc)
- `--no-docs`           - disable ri after installation

## Additional settings

- `--skip-gemsets`                     - skip the installation of default gemsets
- `--bin`                              - path for binaries to be placed (default: `~/.rvm/bin/.`)
- `-l` | `--level`                     - MRI ruby patch level
- `--url` | `--repository` | `--repo`  - git URL of repository to install from
- `--branch`                           - branch to install from
- `--tag`                              - tag to install from
- `--sha`                              - SHA of commit to install from
- `--trace`                            - add time, path, etc details to log
- `--proxy`                            - proxy options to pass to curl for downloading packages

## Verification

`--verify-downloads {0,1,2}` specifies verification level:

- `0` - only verified allowed,
- `1` - allow missing checksum,
- `2` - allow failed checksum.

Please see the documentation for further information:

- https://rvm.io/rubies/installing/
- https://rvm.io/rubies/named/
help/reset.md000066400000000000147511530560007137 0ustar00help/use.md000066400000003465147511530560006633 0ustar00    $ rvm use [ruby-string]

Setup current shell to use a specific ruby version.


For a list of currently installed ruby string please run

    $ rvm list

To create a gemset if it does not already exist:

    $ rvm --create 1.9.2@funky

For creating a project .rvmrc file - From within the app's root_dir:

    $ rvm --rvmrc 1.9.2@funky

Above commands can be also combined to do it all in one pass:

    $ rvm --rvmrc --create use 1.9.2@funky
  Using /home/user/.rvm/gems/ruby-1.9.2-p290 with gemset funky

Do not forget to check the generated .rvmrc file - it contains many useful
comments.  Note you must still 'rvm rvmrc trust' the newly created .rvmrc

If you attempt to use a ruby that is not installed and install-on-use is
not enabled, rvm will tell you the command necessary to install the
requested ruby.

    $ rvm use 1.9.3
  ruby-1.9.3 is not installed.
  To install do: 'rvm install ruby-1.9.3'

Also, an environment variable "rvm_recommended_ruby" will contain the
command. Using tab completion will expedite executing it.

    $ $rvm_recommended_ruby

To set a ruby as the user default, use the --default option.

    $ rvm use 1.9.3 --default

To specify MRI patch level version use -l or --level option. 

Please see documentation for further information:

  https://rvm.io/rvm/basics

Also, you can combine the new flags --ruby-version and --version-conf

    $ rvm --create --ruby-version use 1.9.2@funky
  Using /home/user/.rvm/gems/ruby-1.9.2-p290 with gemset funky

    $ rvm --create --versions-conf use 1.9.2@funky
  Using /home/user/.rvm/gems/ruby-1.9.2-p290 with gemset funky

These files do not need to be trusted, however, if a .rvmrc file
exists, it will override the use of .ruby-version or .versions.conf!

Please see the documentation for further information:
  https://rvm.io/workflow/projects#ruby-versions

help/implode.md000066400000000000147511530560007446 0ustar00help/repair.md000066400000001013147511530560007304 0ustar00
    $ rvm repair {symlinks,environments,archives,all}

Runs the repair process(es) against given parts of rvm.

Examples:

To regenerate all of the environment files inside your rvm/environments
directory, you would run:

    $ rvm repair environments

To check for stale symlinks caused by rvm in your rvm_bin_path, you would run:

    $ rvm repair symlinks

To verify all downloaded archives have the correct md5, you would run:

    $ rvm repair archives

Or, to do all of the above, you can run:

    $ rvm repair all
help/index.txt000066400000011142147511530560007354 0ustar00Usage:
 
    rvm [--debug][--trace][--nice] <command> <options>

  for example:

    rvm list                # list installed interpreters 
    rvm list known          # list available interpreters
    rvm install <version>   # install ruby interpreter
    rvm use <version>       # switch to specified ruby interpreter
    rvm remove <version>    # remove ruby interpreter (alias: delete)
    rvm get <version>       # upgrade rvm: stable, master

Available commands:

  rvm has a number of common commands, listed below. Additional information about any command
  can be found by executing `rvm help <command>`. 

  ruby installation
      fetch                   # download binary or sources for selected ruby version
      install                 # install ruby interpreter
      list                    # show currently installed ruby interpreters
      list known              # list available interpreters
      mount                   # install ruby from external locations
      patchset                # tools related to managing ruby patchsets
      pkg                     # install a dependency package
      reinstall               # reinstall ruby and run gem pristine on all gems
      remove                  # remove ruby and downloaded sources (alias: delete)
      requirements            # installs dependencies for building ruby
      uninstall               # uninstall ruby, keeping it's sources
      upgrade                 # upgrade to another ruby version, migrating gems

  running different ruby versions
      current                 # print current ruby version and name of used gemsets
      do                      # runs a command against specified and/or all rubies
      gemdir                  # display path to current gem directory ($GEM_HOME)
      use <version>           # switch to given (and already installed) ruby version
      use default             # switch to default ruby, or system if none is set
      use system              # switch to system ruby
      wrapper                 # creates wrapper executables for a given ruby & gemset

  managing gemsets
      gemset                  # manage gemsets 
      migrate                 # migrate all gemsets from one ruby to another

  rvm configuration
      alias                   # define aliases for `rvm use`
      autolibs                # tweak settings for installing dependencies automatically 
      group                   # tools for managing groups in multiuser installations
      rvmrc                   # tools related to managing .rvmrc trust & loading gemsets

  rvm maintenance
      implode                 # removes the rvm installation completely
      cleanup                 # remove stale source files & data associated with rvm
      cron                    # manage setup for using ruby in cron
      docs                    # tools to make installing ri and rdoc docs easier
      get                     # upgrades RVM to latest head, stable or branched version
      osx-ssl-certs           # helps update OpenSSL certs installed by rvm on OS X
      reload                  # reload rvm source itself
      reset                   # remove all default and system settings
      snapshot                # backup/restore rvm installation

  troubleshooting
      config-get              # display values for RbConfig::CONFIG variables
      debug                   # additional information helping to discover issues
      export                  # set temporary env variable in the current shell
      fix-permissions         # repairs broken permissions
      repair                  # lets you repair parts of your environment, such as
                              # wrappers, env files and similar (general maintenance)
      rubygems                # switches version of rubygems for the current ruby
      tools                   # general information about the ruby env
      unexport                # undo changes made to the environment by `rvm export`
      user                    # tools for managing RVM mixed mode in multiuser installs

   information and documentation
      info                    # show the environment information for current ruby
      disk-usage              # display disk space occupied by rvm
      notes                   # display notes with operating system specifics
      version                 # display rvm version (equal to `rvm -v`)

   additional global options
      --debug                 # toggle debug mode on for very verbose output
      --trace                 # toggle trace mode on to see EVERYTHING rvm is doing
      --nice                  # process niceness (increase the value on slow computers, default 0)
help/mount.md000066400000003541147511530560007174 0ustar00Usage:

    rvm automount
    rvm mount /path/to/ruby [-n {name}]
    rvm mount [-r] {https://url/to/ruby.tar.bz2} [name]


## Mounting local compiled rubies

RVM supports adding rubies compiled by user.

If compiled ruby is already on `PATH` then use:

    rvm automount

If ruby is not on `PATH` and was compiled in `/opt/ruby-1.9.3-p194`,
then both following commands will add it to RVM:

    rvm mount /opt/ruby-1.9.3-p194
    rvm mount /opt/ruby-1.9.3-p194/bin/ruby

RVM will ask user for the name for it, for automation you can use `-n` flag:

    rvm mount /opt/ruby-1.9.3-p194 -n ruby-1.9.3-p194

Which will create `ext-ruby-1.9.3-p194`, the `ext-` prefix is there to
distinguish externally compiled rubies.


## Unmounting locally compiled rubies

Remove the ruby as you would any other:

    rvm remove ext-ruby-1.9.3-p194


## Downloading compiled ruby (since RVM 1.16)

RVM also supports downloading compiled rubies.

You can specify the full url to the binaries:

    rvm mount -r https://rvm.io/binaries/ubuntu/12.04/x86_64/ruby-1.9.3-p194.tar.bz2

It is also possible to download from different url with a name to use:

    rvm mount -r https://some.server/my_ruby-1.9.3-p194.tar.bz2 ruby-1.9.3-p194

Note that the packaged ruby must be using exactly the name that was given as second parameter.

And finally it is possible to just give a name and RVM will build the path for your system:

    rvm mount -r 1.9.3

Assuming the binary is in proper remote path registered with rvm it will be automatically used during installation:

    rvm install 1.9.3

will use https://rvm.io/binaries/ubuntu/12.04/x86_64/ruby-1.9.3-p194.tar.bz2 assuming it is 64bit Ubuntu 12.04.


## List of available builds

RVM automatically detects current platform and displays rubies available for it:

    rvm list remote


## Preparing your own build of ruby

Read more in:

    rvm help prepare
help/config-get.md000066400000000220147511530560010043 0ustar00# Read ruby configuration

Usage:

    rvm config-get [<variable-name>|--all]

Displays single variable from `RbConfig::CONFIG` or all of them.
help/debug.md000066400000000047147511530560007116 0ustar00Debug

  TODO

Documentation:

  TODO

help/get.md000066400000002021147511530560006601 0ustar00# rvm get

Update RVM

## Usage

  rvm get {stable|latest|latest-x.y|x.y.z|head|master|branch|help} [--auto-dotfiles] [--autolibs=X]

## Options

  stable     - install the latest RVM stable release

  latest     - install the latest RVM release

  latest-minor
             - install the latest minor RVM release for currently installed version

  latest-x.y - install the latest RVM release matching the x.y* pattern

  x.y.z      - install a specific RVM release

  head
  master     - install the latest RVM development version

  --auto-dotfiles
             - automatically update shell profile files.

  --autolibs=X
             - update autolibs mode to `X`, read more: `rvm autolibs`

  help       - Output this message.

## Branches

    branch <branch>
    branch /<branch>
    branch <repo>/
    branch <repo>/<branch>

## Defaults

    branch: master
    repo:   rvm

## Examples

    rvm get branch shoes   # will fetch branch shoes from rvm/rvm repo
    rvm get branch mpapis/ # will fetch branch master from mpapis/rvm repo
help/reinstall.md000066400000000321147511530560010020 0ustar00
Usage

  rvm reinstall [ruby-string]

It is equivalent to:

  rvm remove  [ruby-string]
  rvm install [ruby-string]

Please see the documentation for further information:

  https://rvm.io/rubies/installing/
help/current.md000066400000000132147511530560007505 0ustar00
    $ rvm current

Print the current Ruby version and the name of any gemset being used.
help/prepare.md000066400000002736147511530560007475 0ustar00Usage:

    rvm prepare ruby-version [--path]

## Preparing your own build of ruby

When using a custom system it is also possible to build your own binary ruby:

    rvm prepare 1.9.3

It will generate `ruby-1.9.3-p194.tar.bz2` in the current directory,
it can be either used directly as file, or hosted on a https server.

You can also tell RVM to upload to scp server:

    rvm prepare 1.9.3 -r rvm@ssh.rvm.io:~/shared/public/binaries

It will show commands to run to update server, and changes for rvm files.

Finally it is possible to generate the package with paths reflecting server,
especially useful for generating multiple packages for many systems:

    rvm prepare 1.9.3 --path


## Hosting binaries build server

You can also host your rubies on your server, this is useful when using patches,
custom compilation options or hardcoded installation path.

RVM requires just https server for your own hosting, the pattern for building url is:

    "${rvm_remote_server_url}/${rvm_system_server_path}/${rvm_ruby_string}.tar.bz2"

Where:

- `rvm_remote_server_url`  - can be defined in `$rvm_path/user/db`
- `rvm_system_server_path` - can be defined in `$rvm_path/user/db`, autodetected if not defined
- `rvm_ruby_string` - is the name specified by user

When corresponding path is not defined for url then it is autodetected.

Example `$rvm_path/user/db`:

    rvm_remote_server_url3=http://server/binaries
    rvm_remote_server_path3=my_distribution
    rvm_remote_server_verify_downloads3=1
help/list.md000066400000001607147511530560007006 0ustar00Show list of available rubies,

## Usage:

    rvm list [help,known,remote [|rbx|jruby|all],gemsets,default [string],rubies,strings,known_strings,ruby_svn_tags]

## Actions:

- `help`    - show this help
- `known`   - list known rubies, that can be installed
- `gemsets` - list all rubies with their gemsets
- `rubies`  - list installed rubies, it is the default action when none given
- `strings` - list installed rubies, machine passable form
- `known_strings`    - list known rubies, that can be installed, machine passable form
- `ruby_svn_tags`    - list ruby tags available at http://svn.ruby-lang.org/repos/ruby/tags/
- `default [string]` - show the default ruby, passable form with strings
- `remote [|rbx|jruby|all]` - list binary build rubies (also for all/rbx/jruby), they do not need compilation,
                              when parameter omitted then only rvm build binaries are listed.
help/patchset.md000066400000000147147511530560007644 0ustar00Description:

    Tools for manipulating patchsets.

Usage:

    rvm patchset {show,lookup} [patchset]
help/fetch.md000066400000000456147511530560007125 0ustar00# Fetch

Performs an archive / src fetch of the current selected ruby.

## Usage

    $ rvm fetch [--verify-downloads {0,1,2}]

Where `--verify-downloads {0,1,2}` specifies verification level:

- `0` - only verified allowed - the default,
- `1` - allow missing checksum,
- `2` - allow failed checksum.
help/wrapper.md000066400000001224147511530560007506 0ustar00# Wrapper

Show/regenerate wrappers.

NOTE: This command delegates to 'gem wrapper' => <https://github.com/rvm/gem-wrappers>

## Usage

Show paths and generated wrappers:

    rvm wrapper show


Show path to generated wrapper:

    rvm wrapper show executable_name

Where `executable_name` is something like `ruby` or `rake`.


It is also possible to generate a wrapper for external scripts that require ruby:

    rvm wrapper /full/path/to/script

Where `/full/path/to/script` is full path to existing script


Wrappers are generated automatically, but it is possible to rerun the process:

    rvm wrapper regenerate


Documentation:

    rvm wrapper [help]
help/rvmrc.md000066400000002755147511530560007171 0ustar00    $ rvm rvmrc {trust,untrust,trusted,load,reset} [optional-path]
    $ rvm rvmrc create {ruby-version} [--rvmrc|--ruby-version|--versions-conf]
    $ rvm rvmrc warning [ignore|reset|list] [<optional-path>|all.rvmrcs|allGemfiles]
    $ rvm rvmrc to ruby-version

Tools for dealing with and loading the rvmrc trust for a given directory.
All actions take an optional path to a directory to check.

Examples:

To check the status of ~/My/project, you would run:

    $ rvm rvmrc trusted ~/My/project

Or, more conventionally,

    $ cd ~/My/project && rvm rvmrc trusted

To manually set it as trusted:

    $ rvm rvmrc trust ~/My/project

Or, to reset the trust and force a prompt:

    $ rvm rvmrc reset ~/My/project
    $ rvm rvmrc reset all

Finally, to load the rvmrc in a directory, you would run:

    $ rvm rvmrc load ~/My/project

Or,

    $ cd ~/My/project && rvm rvmrc load

Note that this replaces 'rvm load-rvmrc'. Note that load implicitly trusts the
rvmrc, even if it is set to untrusted.


Creating project rvmrc files can easily be done with the following command:

    $ rvm --rvmrc --create use 1.9.2@funky

Or for scripting,

    $ rvm rvmrc create 1.9.2@funky

Above command will create both the gemset 'funky', and a project rvmrc file in the current directory.

From RVM 1.11.0 new project files are available.  They do not require trusting:

-    $ rvm rvmrc create 1.9.2@funky --ruby-version
-    $ rvm rvmrc create 1.9.2@funky --versions-conf
- https://rvm.io/workflow/projects/#ruby-versions
help/gemset/copy.md000066400000000253147511530560010265 0ustar00
## Usage

    rvm gemset copy ruby-from[@gemset] ruby-to[@gemset]


## Description

Copy the `ruby-from` `gemset`s gems (`default` if omitted) to the `ruby-to` `gemset`.
help/upgrade.md000066400000001204147511530560007453 0ustar00Usage:

  rvm upgrade {source ruby} [destination ruby] [--force]

Description:

  Upgrades the specified (already installed) source ruby to the
  given destination ruby version. Will migrate gemsets, wrappers, aliases
  and environment files.

  The process will prompt you at each stage - if the versions look incorrect,
  please cancel and perform it manually.


Examples:

    $ rvm upgrade 1.9.2-p136 1.9.2-p180

    $ rvm upgrade ree-2011.01 ree-2011-02

append `--force` to answer yes to all questions.

Experimental detection:

    $ rvm upgrade 1.9.2
    Are you sure you wish to upgrade from ruby-1.9.2-p290 to ruby-1.9.2-p318? (Y/n):
help/srcdir.md000066400000000000147511530560007303 0ustar00help/cron.md000066400000001713147511530560006772 0ustar00
Usage:

1. Add/Remove ruby variables to cron:

    rvm cron {setup|remove}

2. Manage rvm on single command level

    rvm cron command <"schedule"> <command> <params...>


Example 1 set one ruby for all cron jobs:

    cd /project/dir  # go to project dir, or `rvm use ...`
    rvm cron setup   # initialize cron with ruby settings
    crontab -e       # add tasks to cron

After project ruby changes:

    rvm cron setup   # update cron with new ruby settings



Example 2 add single job using current dir for rvm:

    cd /project/dir  # go to project dir, or `rvm use ...`
    rvm cron command "@daily" rake calculate:stats

Refer to `man 5 crontab` for definitions of time/date, examples:

    "*/5 * * * *" - Every 5 minutes
    "@hourly"     - Once an hour
    "* */4 * * *" - Every 4 hours
    "0 6 * * *"   - Everyday at 6am
    "0 7 * * 5"   - Every Friday at 7am

NOTE! Do not forget to set notification email in `crontab -e`:

    MAILTO=someone@project.com
help/do.md000066400000003707147511530560006440 0ustar00
## Usage

    $ rvm [all|all-gemsets|<ruby>,...|<path>] [--verbose|--summary|--yaml|--json] do <command> ...
    $ rvm in <path> do <some-command> ...

Executes arbitrary commands against given a set of rvm environments.
Without additional flags it will exec the command directly without printing
out extra rvm information.

## Selectors:

 - `all`         - execute command in the default gemset of all rubies
 - `all-gemsets` - execute command in the all gemset for all rubies
 - `<ruby>,...`  - list of rubies to use, allows short versions or gemsets
 - `<path>`      - use ruby from the given path/project

## Modifiers:

- `in`        - works with path and will additionally `cd` to the given directory
- `--verbose` - display one line details about ruby/gemset
- `--summary` - hide output and display summary of failures/success list only
- `--yaml`    - hide output and display yaml summary of failures/success list only
- `--json`    - hide output and display json summary of failures/success list only
- `--summary` - print out a summary of the commands run
- `-S`        - specify the script file to load and run


## Examples:

To execute `ruby -v` against all installed rubies and aliases, you would run:

    $ rvm all do ruby -v

If you want to execute it against a specific ruby (without extra logging / data
printed by rvm as is done with normal set operations), you can instead do:

    $ rvm ree do ruby -v

Since it is a set operation, normal ruby specifiers will work. As an example, to run
`gem list` against **1.9.2** and **1.8.7** and prefix with ruby name, you would run:

    $ rvm 1.9.2,1.8.7 --verbose do gem list

Or, to execute `gem env` against all gemsets:

    $ rvm all-gemsets do gem env

To execute `which ruby` in the current directory, loading a `.rvmrc`:

    $ rvm . do which ruby

To execute `rake test` in the project directory, loading a `.rvmrc`:

    $ rvm in /path/to/project do rake test

For more information, refer to the rvm set operations.
help/group.md000066400000000202147511530560007155 0ustar00Usage:

    rvm group help
    rvm group add <group_name> <user_name> [user_name...]
    rvm group create <group_name> [group_id]
help/alias.md000066400000003137147511530560007124 0ustar00Alias

  RVM allows you to alias your rubies for your convenience and pleasure.

Usage
  rvm [options] alias source destination

  Source and Destination must be an RVM
  ruby string representing an RVM installed ruby.

  A gemset may be optionally included.

Creating Aliases

  First select an RVM ruby.

    $ rvm alias create php ree-1.8.7-p2010.01

Using Aliases

  Now that you have created an alias, you can use the alias in place of the longer rvm selector string.

    $ rvm use php
    $ ruby -v
    ruby 1.8.7 (2009-12-24 patchlevel 248) [i686-darwin10.3.0], MBARI 0x6770, Ruby Enterprise Edition 2010.01

If you use any aliases that are rather funny, please hop in #rvm and let us know :)

Deleting Aliases

  If you wish to delete an alias

    $ rvm alias delete dotnet
    Listing Aliases

You can also list all current aliases

    $ rvm alias list
    php => ree-1.8.7-p2010.01
    lisp => maglev-head
    python => rbx-head

Managing Generic Ruby Versions

  You can use aliases to set a specific ruby patchlevel for a generic ruby
  version. This is useful if you have upgraded RVM and can no longer switch
  to the requested ruby. For example, if your project specifies
  `ruby-1.9.3@my-project` you can do this:

    $ cd my-project/
    ruby-1.9.3-p448 is not installed.
    To install do: 'rvm install ruby-1.9.3-p448'
    $ rvm alias create ruby-1.9.3 ruby-1.9.3-p429
    Creating alias ruby-1.9.3 for ruby-1.9.3-p429.
    Recording alias ruby-1.9.3 for ruby-1.9.3-p429.
    $ cd .
    $ ruby -v
    ruby 1.9.3p429 (2013-05-15 revision 40747) [x86_64-linux]

Documentation:

  https://rvm.io/rubies/alias/

help/user.md000066400000000545147511530560007011 0ustar00RVM mixed mode can be enabled on multiuser installations.

To use rubies and gemsets from user home run:

    rvm user all

To use only gemsets from user home run:

    rvm user gemsets

It is also possible to add this settings as default for new user accounts:

    sudo rvm user [all|gemsets] --skel

To restore multiuser defaults run:

    rvm user none
help/fix-permissions.md000066400000001327147511530560011171 0ustar00# Fix permissions

## Synopsis

    rvm fix-permissions
    rvm fix-permissions user
    rvm fix-permissions system
    rvm fix-permissions <user>
    rvm fix-permissions <user>:
    rvm fix-permissions <user>:<group>
    rvm fix-permissions :<group>

## Description

In some cases like using sudo or chef permissions of rvm could be broken.
When fixing permissions for group also makes everything group writable.

## Arguments
`rvm fix-permissions`:

* ``               => Fix permissions for `user` or `system` - pick automatically,
* `user`           => Fix permissions for current user,
* `system`         => Fix permissions for system installation of RVM,
* `<user>:<group>` => Fix permissions for given user and/or group
help/disk-usage.md000066400000000706147511530560010066 0ustar00## Usage

    rvm disk-usage {all,total,archives,docs,repos,sources,logs,pkg,rubies,gemsets,wrappers,tmp,others}'

Shows the amount of disk space used by a specific set of data associated with rvm.
`all` returns each, individually, along with the total space used.

## Examples:

To find out how much space your rvm install is using, simply run:

    rvm disk-usage all

To find out how much space only your gemsets use, run:

    rvm disk-usage gemsets
help/tools.md000066400000002607147511530560007174 0ustar00    $ rvm tools {identifier,path-identifier,strings,mirror,rvm-env}

Provides generic tools related to rvm environments for gaining information
about your current environment.  Primarily used for scripting rvm.

Examples:

To get the expanded Ruby string for the current environment, you would run:

    $ rvm tools identifier

To get the identifier for a folder (taking into account .rvmrc files and the like),
run this instead:

    $ rvm tools path-identifier ~/path/to/directory

Lastly, you can expand example Ruby strings.  E.g., to get the current ree version,
run:

    $ rvm tools strings ree

In case of network/firewall problems, it is easy to define alternate download URLs:

    $ rvm tools mirror


It is possible to use a "shebang" (#!/usr/...) line to select the interpreter
(eg, Ruby 1.9.3) which processes a script file.  However, this will work only
on recent Linux kernels (2.6.27.9 and above).

First, you need to define the shebang wrapper:

    $ rvm tools rvm-env ruby bash zsh

This will define:

    /usr/bin/{ruby,bash,zsh}-rvm-env

Your scripts can then request the proper Ruby, using shebang:

    #!/usr/bin/ruby-rvm-env 1.9.3

The script will be run using Ruby 1.9.3 from rvm.

Alternatively, here is a hack to make a script switch itself:

    if !ENV['ruby_switch_flag']
      ENV['ruby_switch_flag'] = '42'
      system('rvm', '1.9.3', 'do', __FILE__, *ARGV)
      exit 0
    end

help/osx-ssl-certs.md000066400000004531147511530560010560 0ustar00# OSX OpenSSL Certificates handling.

## Synopsis

    rvm osx-ssl-certs status [<ruby>|<certs-path>|<openssl-binary>|all]
    rvm [--silent] osx-ssl-certs update [<ruby>|<certs-path>|<openssl-binary>|all]
    rvm osx-ssl-certs cron [status|install|uninstall]

## Description

Apple OS X comes with old version of OpenSSL, to keep you secure RVM installs newer version.
RVM also allows specifying custom version of OpenSSL and binary rubies linked to custom locations.
Taken this all into account most likely your Ruby is using outdated certificates.
To solve this problem `rvm osx-ssl-certs` will find all locations for certificates.
You can check status, update certificates manually or schedule an automated update.

## Arguments
`rvm osx-ssl-certs`:

* `status`      => Show certificates status for current Ruby,
  * `<ruby>`    => Status of a specific Ruby certificates,
  * `<certs-path>`     => Status for a specific path certificates,
  * `<openssl-binary>` => Status for a specific openssl installation,
  * `all`       => Status of all installed Rubies certificate paths.
* `update`      => Update SSL certificates for current Ruby,
  * `<ruby>`    => Update a specific Ruby certificates,
  * `<certs-path>`     => Update certificates in a specific path,
  * `<openssl-binary>` => Update certificates for a specific openssl installation,
  * `all`       => Update all installed Rubies certificate paths.
* `cron`        => Manage cron job for daily updates,
  * `status`    => Show if the cron job is installed,
  * `install`   => Install the cron job,
  * `uninstall` => Uninstall the cron job.

## Examples

Show the status for all installed rubies:

    rvm osx-ssl-certs status all

Update OpenSSL certificates for current ruby:

    rvm osx-ssl-certs update

Update OpenSSL certificates for specific path:

    rvm osx-ssl-certs update /etc/openssl

Schedule daily update of certificates:

    rvm osx-ssl-certs cron install

## Troubleshooting

If the `status` argument returns that all is good and you still get errors, it's probably caused by bad certificate chain on the server.

To troubleshoot you can check the chain with:

```
openssl s_client -showcerts -connect google.com:443
```

Replace `google.com` with your server address

## Reporting bugs

Please report issues to https://github.com/rvm/rvm/issues

In case of security issues use rvm-internal@googlegroups.com
help/gemset.md000066400000001511147511530560007311 0ustar00
Usage:

    rvm gemset [action]
    rvm --force gemset [action]

Actions:

    copy, create, delete (alias: remove), dir, empty, export, gemdir, globalcache, import, install, list, list_all, name, pristine, rename (alias: move), unpack, update, use

Description:

  Commands for working with and manipulating gemsets within RVM.

  Any command is run in context of current ruby/gemset; call 'rvm current' to find out which is currently used.

  Note that 'system' supports only exporting/importing gems.

Rejection:

  If you do not want to use gemsets and want to ignore them you can use
  command line flag `--ignore-gemsets`:

    rvm use 1.9.3@my_project --ignore-gemsets

  it will ignore @my_project and @global -  only default gemset will be set.

  It can be persisted with:

    echo "export rvm_ignore_gemsets_flag=1" >> ~/.rvmrc
help/pkg.md000066400000000721147511530560006610 0ustar00From source installation of required libraries for rubies, it is automatically triggered by:

    rvm autolibs rvm_pkg

You should not have to use it manually but just in case:

Usage:

    rvm pkg {install,uninstall} {readline,iconv,curl,openssl,zlib,autoconf,ncurses,pkgconfig,gettext,glib,mono,llvm,libxml2,libxslt,libyaml,epel}
    rvm pkg remove # to start fresh

`ree_dependencies` installs `zlib`, `ncurses`, `readline`, `openssl` and `iconv` in this order.
help/snapshot.md000066400000000540147511530560007665 0ustar00
    $ rvm snapshot {load,save} filename

Saves or creates a snapshot of the given rvm install. This includes:

* Settings
* Aliases
* Rubies
* Gemsets
* Packages
* Your Default

Ideally to easily maintain a consistent environment among machines
/ to back up your environment.

Please note that this is still considered experimental to a large degree.
help/gemdir.md000066400000000000147511530560007264 0ustar00help/remove.md000066400000000575147511530560007333 0ustar00
    $ rvm remove [all|old [date]|ruby-string[,ruby-string[,...]]]

Remove one or more rubies and their sources.

Options:
- `--gems`    - also removes gems installed for the removed ruby version
- `--archive` - remove archives


For a list of currently installed rubies, please run

  rvm list

Please see documentation for further information:

  https://rvm.io/rubies/removing/
help/rvmrc/to.md000066400000000101147511530560007572 0ustar00    $ rvm rvmrc to ruby-version

Migrate .rvmrc to .ruby-version
help/rvmrc/warning.md000066400000000232147511530560010622 0ustar00Manage warnings for .rvmrc / Gemfile

    rvm rvmrc warning [check|ignore|reset] [/path/to/file|all.rvmrcs|allGemfiles]
    rvm rvmrc warning [help|list]
capistrano.rb000066400000000436147512036020007241 0ustar00# Recipes for using RVM on a server with capistrano.

raise "RVM - Capistrano integration was extracted to a separate gem, \
install: `gem install rvm-capistrano` and remove the `$LOAD_PATH.unshift` line, \
note also the 'set :rvm_type, :user' is now the default (instead of :system)."
© 2025 GrazzMean